diff --git a/3rdPartyFiles.txt b/3rdPartyFiles.txt new file mode 100644 index 0000000..69026bd --- /dev/null +++ b/3rdPartyFiles.txt @@ -0,0 +1,73 @@ +Brian Sidebotham's - Raspberry-Pi Bare Metal Tutorials +https://github.com/BrianSidebotham/arm-tutorial-rpi +armc-cstartup.c +armc-cstubs.c +rpi-base.h +rpi-interrupts.h +rpi-interrupts.c +rpi-mailbox.h +rpi-mailbox.c + +David Banks' PiTubeDirect (GNU General Public License v3.0) +https://github.com/hoglet67/PiTubeDirect +defs.h +cache.h +cache.c +armc-start.S +startup.h +rpi-aux.h +rpi-aux.c +rpi-gpio.h (added GpioDetect) +rpi-gpio.c +rpi-mailbox-interface.h (Added some missing ones) +rpi-mailbox-interface.c +linker.ld + +R Stange's USPi +https://github.com/rsta2/uspi +uspi\*.* +exception.c +interrupt.h +interrupt.c +Timer.h +Timer.cpp + +R Stange's modified version of John Cronin's EMMC controller +emmc.h +emmc.cpp + +ChaN's Generic FAT file system R0.12b +http://elm-chan.org/fsw/ff/00index_e.html +ff.h +ff.cpp +diskio.h +diskio.cpp + +Sean Barrett's stb_image (MIT) (used for loading PNGs) +https://github.com/nothings/stb +stb_image.h + +FFmpeg (LGPL v2.1+) (used for the font) +https://github.com/FFmpeg/FFmpeg +xga_font_data.h +xga_font_data.c + +Pete Rittwage's (Markus Brenner's) NIB lib +https://c64preservation.com/svn/nibtools/trunk +gcr.h +gcr.cpp +prot.h +prot.cpp + +Marcus Geelnard's LZ77 coder/decoder (GNU General Public License, version 2 or later) +https://c64preservation.com/svn/nibtools/trunk/lz.c +lz.h +lz.c + + +nbla000's CBM-FileBrowser_v1.6 +http://www.nightfallcrew.com/21/08/2013/cbm-filebrowser-v1-6-by-nbla000/ + + + + diff --git a/CBMFont.h b/CBMFont.h new file mode 100644 index 0000000..229ae0f --- /dev/null +++ b/CBMFont.h @@ -0,0 +1,259 @@ +const long int CMBFont_size = 4096; +const unsigned char CMBFont[4096] = { + 0x3C, 0x66, 0x6E, 0x6E, 0x60, 0x62, 0x3C, 0x00, 0x18, 0x3C, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, + 0x7C, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x7C, 0x00, 0x3C, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3C, 0x00, + 0x78, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0x78, 0x00, 0x7E, 0x60, 0x60, 0x78, 0x60, 0x60, 0x7E, 0x00, + 0x7E, 0x60, 0x60, 0x78, 0x60, 0x60, 0x60, 0x00, 0x3C, 0x66, 0x60, 0x6E, 0x66, 0x66, 0x3C, 0x00, + 0x66, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, + 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x6C, 0x38, 0x00, 0x66, 0x6C, 0x78, 0x70, 0x78, 0x6C, 0x66, 0x00, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7E, 0x00, 0x63, 0x77, 0x7F, 0x6B, 0x63, 0x63, 0x63, 0x00, + 0x66, 0x76, 0x7E, 0x7E, 0x6E, 0x66, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, + 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x0E, 0x00, + 0x7C, 0x66, 0x66, 0x7C, 0x78, 0x6C, 0x66, 0x00, 0x3C, 0x66, 0x60, 0x3C, 0x06, 0x66, 0x3C, 0x00, + 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00, + 0x66, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x00, + 0x7E, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x7E, 0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, + 0x0C, 0x12, 0x30, 0x7C, 0x30, 0x62, 0xFC, 0x00, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, + 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00, 0x10, 0x30, 0x7F, 0x7F, 0x30, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x00, + 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0xFF, 0x66, 0xFF, 0x66, 0x66, 0x00, + 0x18, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0x18, 0x00, 0x62, 0x66, 0x0C, 0x18, 0x30, 0x66, 0x46, 0x00, + 0x3C, 0x66, 0x3C, 0x38, 0x67, 0x66, 0x3F, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x18, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, + 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, + 0x3C, 0x66, 0x6E, 0x76, 0x66, 0x66, 0x3C, 0x00, 0x18, 0x18, 0x38, 0x18, 0x18, 0x18, 0x7E, 0x00, + 0x3C, 0x66, 0x06, 0x0C, 0x30, 0x60, 0x7E, 0x00, 0x3C, 0x66, 0x06, 0x1C, 0x06, 0x66, 0x3C, 0x00, + 0x06, 0x0E, 0x1E, 0x66, 0x7F, 0x06, 0x06, 0x00, 0x7E, 0x60, 0x7C, 0x06, 0x06, 0x66, 0x3C, 0x00, + 0x3C, 0x66, 0x60, 0x7C, 0x66, 0x66, 0x3C, 0x00, 0x7E, 0x66, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x00, + 0x3C, 0x66, 0x66, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x3C, 0x66, 0x66, 0x3E, 0x06, 0x66, 0x3C, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30, + 0x0E, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, + 0x70, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x70, 0x00, 0x3C, 0x66, 0x06, 0x0C, 0x18, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x3E, 0x7F, 0x7F, 0x1C, 0x3E, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0xE0, 0xF0, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x1C, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x18, 0x18, 0x38, 0xF0, 0xE0, 0x00, 0x00, 0x00, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, + 0x03, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0xC0, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, + 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x3C, 0x7E, 0x7E, 0x7E, 0x7E, 0x3C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x36, 0x7F, 0x7F, 0x7F, 0x3E, 0x1C, 0x08, 0x00, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x1C, 0x18, 0x18, + 0xC3, 0xE7, 0x7E, 0x3C, 0x3C, 0x7E, 0xE7, 0xC3, 0x00, 0x3C, 0x7E, 0x66, 0x66, 0x7E, 0x3C, 0x00, + 0x18, 0x18, 0x66, 0x66, 0x18, 0x18, 0x3C, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x08, 0x1C, 0x3E, 0x7F, 0x3E, 0x1C, 0x08, 0x00, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18, + 0xC0, 0xC0, 0x30, 0x30, 0xC0, 0xC0, 0x30, 0x30, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x03, 0x3E, 0x76, 0x36, 0x36, 0x00, 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, + 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0x33, 0x33, 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0xF8, 0x18, 0x18, 0x18, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, + 0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xF8, 0xF8, 0x00, 0x00, 0x00, + 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, + 0xC3, 0x99, 0x91, 0x91, 0x9F, 0x99, 0xC3, 0xFF, 0xE7, 0xC3, 0x99, 0x81, 0x99, 0x99, 0x99, 0xFF, + 0x83, 0x99, 0x99, 0x83, 0x99, 0x99, 0x83, 0xFF, 0xC3, 0x99, 0x9F, 0x9F, 0x9F, 0x99, 0xC3, 0xFF, + 0x87, 0x93, 0x99, 0x99, 0x99, 0x93, 0x87, 0xFF, 0x81, 0x9F, 0x9F, 0x87, 0x9F, 0x9F, 0x81, 0xFF, + 0x81, 0x9F, 0x9F, 0x87, 0x9F, 0x9F, 0x9F, 0xFF, 0xC3, 0x99, 0x9F, 0x91, 0x99, 0x99, 0xC3, 0xFF, + 0x99, 0x99, 0x99, 0x81, 0x99, 0x99, 0x99, 0xFF, 0xC3, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3, 0xFF, + 0xE1, 0xF3, 0xF3, 0xF3, 0xF3, 0x93, 0xC7, 0xFF, 0x99, 0x93, 0x87, 0x8F, 0x87, 0x93, 0x99, 0xFF, + 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x81, 0xFF, 0x9C, 0x88, 0x80, 0x94, 0x9C, 0x9C, 0x9C, 0xFF, + 0x99, 0x89, 0x81, 0x81, 0x91, 0x99, 0x99, 0xFF, 0xC3, 0x99, 0x99, 0x99, 0x99, 0x99, 0xC3, 0xFF, + 0x83, 0x99, 0x99, 0x83, 0x9F, 0x9F, 0x9F, 0xFF, 0xC3, 0x99, 0x99, 0x99, 0x99, 0xC3, 0xF1, 0xFF, + 0x83, 0x99, 0x99, 0x83, 0x87, 0x93, 0x99, 0xFF, 0xC3, 0x99, 0x9F, 0xC3, 0xF9, 0x99, 0xC3, 0xFF, + 0x81, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xFF, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0xC3, 0xFF, + 0x99, 0x99, 0x99, 0x99, 0x99, 0xC3, 0xE7, 0xFF, 0x9C, 0x9C, 0x9C, 0x94, 0x80, 0x88, 0x9C, 0xFF, + 0x99, 0x99, 0xC3, 0xE7, 0xC3, 0x99, 0x99, 0xFF, 0x99, 0x99, 0x99, 0xC3, 0xE7, 0xE7, 0xE7, 0xFF, + 0x81, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x81, 0xFF, 0xC3, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xC3, 0xFF, + 0xF3, 0xED, 0xCF, 0x83, 0xCF, 0x9D, 0x03, 0xFF, 0xC3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xC3, 0xFF, + 0xFF, 0xE7, 0xC3, 0x81, 0xE7, 0xE7, 0xE7, 0xE7, 0xFF, 0xEF, 0xCF, 0x80, 0x80, 0xCF, 0xEF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xE7, 0xE7, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, + 0x99, 0x99, 0x99, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x99, 0x00, 0x99, 0x00, 0x99, 0x99, 0xFF, + 0xE7, 0xC1, 0x9F, 0xC3, 0xF9, 0x83, 0xE7, 0xFF, 0x9D, 0x99, 0xF3, 0xE7, 0xCF, 0x99, 0xB9, 0xFF, + 0xC3, 0x99, 0xC3, 0xC7, 0x98, 0x99, 0xC0, 0xFF, 0xF9, 0xF3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF3, 0xE7, 0xCF, 0xCF, 0xCF, 0xE7, 0xF3, 0xFF, 0xCF, 0xE7, 0xF3, 0xF3, 0xF3, 0xE7, 0xCF, 0xFF, + 0xFF, 0x99, 0xC3, 0x00, 0xC3, 0x99, 0xFF, 0xFF, 0xFF, 0xE7, 0xE7, 0x81, 0xE7, 0xE7, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xE7, 0xCF, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xE7, 0xFF, 0xFF, 0xFC, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0xFF, + 0xC3, 0x99, 0x91, 0x89, 0x99, 0x99, 0xC3, 0xFF, 0xE7, 0xE7, 0xC7, 0xE7, 0xE7, 0xE7, 0x81, 0xFF, + 0xC3, 0x99, 0xF9, 0xF3, 0xCF, 0x9F, 0x81, 0xFF, 0xC3, 0x99, 0xF9, 0xE3, 0xF9, 0x99, 0xC3, 0xFF, + 0xF9, 0xF1, 0xE1, 0x99, 0x80, 0xF9, 0xF9, 0xFF, 0x81, 0x9F, 0x83, 0xF9, 0xF9, 0x99, 0xC3, 0xFF, + 0xC3, 0x99, 0x9F, 0x83, 0x99, 0x99, 0xC3, 0xFF, 0x81, 0x99, 0xF3, 0xE7, 0xE7, 0xE7, 0xE7, 0xFF, + 0xC3, 0x99, 0x99, 0xC3, 0x99, 0x99, 0xC3, 0xFF, 0xC3, 0x99, 0x99, 0xC1, 0xF9, 0x99, 0xC3, 0xFF, + 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xE7, 0xCF, + 0xF1, 0xE7, 0xCF, 0x9F, 0xCF, 0xE7, 0xF1, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0x81, 0xFF, 0xFF, 0xFF, + 0x8F, 0xE7, 0xF3, 0xF9, 0xF3, 0xE7, 0x8F, 0xFF, 0xC3, 0x99, 0xF9, 0xF3, 0xE7, 0xFF, 0xE7, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF7, 0xE3, 0xC1, 0x80, 0x80, 0xE3, 0xC1, 0xFF, + 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, + 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xFF, 0xFF, 0xFF, 0x1F, 0x0F, 0xC7, 0xE7, 0xE7, + 0xE7, 0xE7, 0xE3, 0xF0, 0xF8, 0xFF, 0xFF, 0xFF, 0xE7, 0xE7, 0xC7, 0x0F, 0x1F, 0xFF, 0xFF, 0xFF, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, + 0xFC, 0xF8, 0xF1, 0xE3, 0xC7, 0x8F, 0x1F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x00, 0x00, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFF, 0xC3, 0x81, 0x81, 0x81, 0x81, 0xC3, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xC9, 0x80, 0x80, 0x80, 0xC1, 0xE3, 0xF7, 0xFF, + 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xF8, 0xF0, 0xE3, 0xE7, 0xE7, + 0x3C, 0x18, 0x81, 0xC3, 0xC3, 0x81, 0x18, 0x3C, 0xFF, 0xC3, 0x81, 0x99, 0x99, 0x81, 0xC3, 0xFF, + 0xE7, 0xE7, 0x99, 0x99, 0xE7, 0xE7, 0xC3, 0xFF, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, + 0xF7, 0xE3, 0xC1, 0x80, 0xC1, 0xE3, 0xF7, 0xFF, 0xE7, 0xE7, 0xE7, 0x00, 0x00, 0xE7, 0xE7, 0xE7, + 0x3F, 0x3F, 0xCF, 0xCF, 0x3F, 0x3F, 0xCF, 0xCF, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, + 0xFF, 0xFF, 0xFC, 0xC1, 0x89, 0xC9, 0xC9, 0xFF, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFF, 0xFF, 0xFF, 0xFF, 0x33, 0x33, 0xCC, 0xCC, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xE7, 0xE7, 0xE7, 0xE0, 0xE0, 0xE7, 0xE7, 0xE7, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xE7, 0xE7, 0xE7, 0xE0, 0xE0, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x07, 0x07, 0xE7, 0xE7, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x07, 0x07, 0xE7, 0xE7, 0xE7, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, + 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xE7, 0xE7, 0x07, 0x07, 0xFF, 0xFF, 0xFF, + 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0xF0, 0xF0, 0xF0, 0xF0, + 0x3C, 0x66, 0x6E, 0x6E, 0x60, 0x62, 0x3C, 0x00, 0x00, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, + 0x00, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x00, 0x00, 0x00, 0x3C, 0x60, 0x60, 0x60, 0x3C, 0x00, + 0x00, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3E, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, + 0x00, 0x0E, 0x18, 0x3E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x7C, + 0x00, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x00, 0x00, 0x18, 0x00, 0x38, 0x18, 0x18, 0x3C, 0x00, + 0x00, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x3C, 0x00, 0x60, 0x60, 0x6C, 0x78, 0x6C, 0x66, 0x00, + 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x66, 0x7F, 0x7F, 0x6B, 0x63, 0x00, + 0x00, 0x00, 0x7C, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, + 0x00, 0x00, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x06, + 0x00, 0x00, 0x7C, 0x66, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0x00, + 0x00, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, + 0x00, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x3E, 0x36, 0x00, + 0x00, 0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x0C, 0x78, + 0x00, 0x00, 0x7E, 0x0C, 0x18, 0x30, 0x7E, 0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, + 0x0C, 0x12, 0x30, 0x7C, 0x30, 0x62, 0xFC, 0x00, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, + 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00, 0x10, 0x30, 0x7F, 0x7F, 0x30, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x00, + 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0xFF, 0x66, 0xFF, 0x66, 0x66, 0x00, + 0x18, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0x18, 0x00, 0x62, 0x66, 0x0C, 0x18, 0x30, 0x66, 0x46, 0x00, + 0x3C, 0x66, 0x3C, 0x38, 0x67, 0x66, 0x3F, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x18, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, + 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, + 0x3C, 0x66, 0x6E, 0x76, 0x66, 0x66, 0x3C, 0x00, 0x18, 0x18, 0x38, 0x18, 0x18, 0x18, 0x7E, 0x00, + 0x3C, 0x66, 0x06, 0x0C, 0x30, 0x60, 0x7E, 0x00, 0x3C, 0x66, 0x06, 0x1C, 0x06, 0x66, 0x3C, 0x00, + 0x06, 0x0E, 0x1E, 0x66, 0x7F, 0x06, 0x06, 0x00, 0x7E, 0x60, 0x7C, 0x06, 0x06, 0x66, 0x3C, 0x00, + 0x3C, 0x66, 0x60, 0x7C, 0x66, 0x66, 0x3C, 0x00, 0x7E, 0x66, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x00, + 0x3C, 0x66, 0x66, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x3C, 0x66, 0x66, 0x3E, 0x06, 0x66, 0x3C, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30, + 0x0E, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, + 0x70, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x70, 0x00, 0x3C, 0x66, 0x06, 0x0C, 0x18, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, + 0x7C, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x7C, 0x00, 0x3C, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3C, 0x00, + 0x78, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0x78, 0x00, 0x7E, 0x60, 0x60, 0x78, 0x60, 0x60, 0x7E, 0x00, + 0x7E, 0x60, 0x60, 0x78, 0x60, 0x60, 0x60, 0x00, 0x3C, 0x66, 0x60, 0x6E, 0x66, 0x66, 0x3C, 0x00, + 0x66, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, + 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x6C, 0x38, 0x00, 0x66, 0x6C, 0x78, 0x70, 0x78, 0x6C, 0x66, 0x00, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7E, 0x00, 0x63, 0x77, 0x7F, 0x6B, 0x63, 0x63, 0x63, 0x00, + 0x66, 0x76, 0x7E, 0x7E, 0x6E, 0x66, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, + 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x0E, 0x00, + 0x7C, 0x66, 0x66, 0x7C, 0x78, 0x6C, 0x66, 0x00, 0x3C, 0x66, 0x60, 0x3C, 0x06, 0x66, 0x3C, 0x00, + 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00, + 0x66, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x00, + 0x7E, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x7E, 0x00, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18, + 0xC0, 0xC0, 0x30, 0x30, 0xC0, 0xC0, 0x30, 0x30, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x99, 0xCC, 0x66, 0x33, 0x99, 0xCC, 0x66, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, + 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0x99, 0x33, 0x66, 0xCC, 0x99, 0x33, 0x66, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0xF8, 0x18, 0x18, 0x18, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0x01, 0x03, 0x06, 0x6C, 0x78, 0x70, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, + 0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xF8, 0xF8, 0x00, 0x00, 0x00, + 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F, + 0xC3, 0x99, 0x91, 0x91, 0x9F, 0x99, 0xC3, 0xFF, 0xFF, 0xFF, 0xC3, 0xF9, 0xC1, 0x99, 0xC1, 0xFF, + 0xFF, 0x9F, 0x9F, 0x83, 0x99, 0x99, 0x83, 0xFF, 0xFF, 0xFF, 0xC3, 0x9F, 0x9F, 0x9F, 0xC3, 0xFF, + 0xFF, 0xF9, 0xF9, 0xC1, 0x99, 0x99, 0xC1, 0xFF, 0xFF, 0xFF, 0xC3, 0x99, 0x81, 0x9F, 0xC3, 0xFF, + 0xFF, 0xF1, 0xE7, 0xC1, 0xE7, 0xE7, 0xE7, 0xFF, 0xFF, 0xFF, 0xC1, 0x99, 0x99, 0xC1, 0xF9, 0x83, + 0xFF, 0x9F, 0x9F, 0x83, 0x99, 0x99, 0x99, 0xFF, 0xFF, 0xE7, 0xFF, 0xC7, 0xE7, 0xE7, 0xC3, 0xFF, + 0xFF, 0xF9, 0xFF, 0xF9, 0xF9, 0xF9, 0xF9, 0xC3, 0xFF, 0x9F, 0x9F, 0x93, 0x87, 0x93, 0x99, 0xFF, + 0xFF, 0xC7, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3, 0xFF, 0xFF, 0xFF, 0x99, 0x80, 0x80, 0x94, 0x9C, 0xFF, + 0xFF, 0xFF, 0x83, 0x99, 0x99, 0x99, 0x99, 0xFF, 0xFF, 0xFF, 0xC3, 0x99, 0x99, 0x99, 0xC3, 0xFF, + 0xFF, 0xFF, 0x83, 0x99, 0x99, 0x83, 0x9F, 0x9F, 0xFF, 0xFF, 0xC1, 0x99, 0x99, 0xC1, 0xF9, 0xF9, + 0xFF, 0xFF, 0x83, 0x99, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xC1, 0x9F, 0xC3, 0xF9, 0x83, 0xFF, + 0xFF, 0xE7, 0x81, 0xE7, 0xE7, 0xE7, 0xF1, 0xFF, 0xFF, 0xFF, 0x99, 0x99, 0x99, 0x99, 0xC1, 0xFF, + 0xFF, 0xFF, 0x99, 0x99, 0x99, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0x9C, 0x94, 0x80, 0xC1, 0xC9, 0xFF, + 0xFF, 0xFF, 0x99, 0xC3, 0xE7, 0xC3, 0x99, 0xFF, 0xFF, 0xFF, 0x99, 0x99, 0x99, 0xC1, 0xF3, 0x87, + 0xFF, 0xFF, 0x81, 0xF3, 0xE7, 0xCF, 0x81, 0xFF, 0xC3, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xC3, 0xFF, + 0xF3, 0xED, 0xCF, 0x83, 0xCF, 0x9D, 0x03, 0xFF, 0xC3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xC3, 0xFF, + 0xFF, 0xE7, 0xC3, 0x81, 0xE7, 0xE7, 0xE7, 0xE7, 0xFF, 0xEF, 0xCF, 0x80, 0x80, 0xCF, 0xEF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xE7, 0xE7, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, + 0x99, 0x99, 0x99, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x99, 0x00, 0x99, 0x00, 0x99, 0x99, 0xFF, + 0xE7, 0xC1, 0x9F, 0xC3, 0xF9, 0x83, 0xE7, 0xFF, 0x9D, 0x99, 0xF3, 0xE7, 0xCF, 0x99, 0xB9, 0xFF, + 0xC3, 0x99, 0xC3, 0xC7, 0x98, 0x99, 0xC0, 0xFF, 0xF9, 0xF3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF3, 0xE7, 0xCF, 0xCF, 0xCF, 0xE7, 0xF3, 0xFF, 0xCF, 0xE7, 0xF3, 0xF3, 0xF3, 0xE7, 0xCF, 0xFF, + 0xFF, 0x99, 0xC3, 0x00, 0xC3, 0x99, 0xFF, 0xFF, 0xFF, 0xE7, 0xE7, 0x81, 0xE7, 0xE7, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xE7, 0xCF, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xE7, 0xFF, 0xFF, 0xFC, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0xFF, + 0xC3, 0x99, 0x91, 0x89, 0x99, 0x99, 0xC3, 0xFF, 0xE7, 0xE7, 0xC7, 0xE7, 0xE7, 0xE7, 0x81, 0xFF, + 0xC3, 0x99, 0xF9, 0xF3, 0xCF, 0x9F, 0x81, 0xFF, 0xC3, 0x99, 0xF9, 0xE3, 0xF9, 0x99, 0xC3, 0xFF, + 0xF9, 0xF1, 0xE1, 0x99, 0x80, 0xF9, 0xF9, 0xFF, 0x81, 0x9F, 0x83, 0xF9, 0xF9, 0x99, 0xC3, 0xFF, + 0xC3, 0x99, 0x9F, 0x83, 0x99, 0x99, 0xC3, 0xFF, 0x81, 0x99, 0xF3, 0xE7, 0xE7, 0xE7, 0xE7, 0xFF, + 0xC3, 0x99, 0x99, 0xC3, 0x99, 0x99, 0xC3, 0xFF, 0xC3, 0x99, 0x99, 0xC1, 0xF9, 0x99, 0xC3, 0xFF, + 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xE7, 0xCF, + 0xF1, 0xE7, 0xCF, 0x9F, 0xCF, 0xE7, 0xF1, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0x81, 0xFF, 0xFF, 0xFF, + 0x8F, 0xE7, 0xF3, 0xF9, 0xF3, 0xE7, 0x8F, 0xFF, 0xC3, 0x99, 0xF9, 0xF3, 0xE7, 0xFF, 0xE7, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0x99, 0x81, 0x99, 0x99, 0x99, 0xFF, + 0x83, 0x99, 0x99, 0x83, 0x99, 0x99, 0x83, 0xFF, 0xC3, 0x99, 0x9F, 0x9F, 0x9F, 0x99, 0xC3, 0xFF, + 0x87, 0x93, 0x99, 0x99, 0x99, 0x93, 0x87, 0xFF, 0x81, 0x9F, 0x9F, 0x87, 0x9F, 0x9F, 0x81, 0xFF, + 0x81, 0x9F, 0x9F, 0x87, 0x9F, 0x9F, 0x9F, 0xFF, 0xC3, 0x99, 0x9F, 0x91, 0x99, 0x99, 0xC3, 0xFF, + 0x99, 0x99, 0x99, 0x81, 0x99, 0x99, 0x99, 0xFF, 0xC3, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3, 0xFF, + 0xE1, 0xF3, 0xF3, 0xF3, 0xF3, 0x93, 0xC7, 0xFF, 0x99, 0x93, 0x87, 0x8F, 0x87, 0x93, 0x99, 0xFF, + 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x81, 0xFF, 0x9C, 0x88, 0x80, 0x94, 0x9C, 0x9C, 0x9C, 0xFF, + 0x99, 0x89, 0x81, 0x81, 0x91, 0x99, 0x99, 0xFF, 0xC3, 0x99, 0x99, 0x99, 0x99, 0x99, 0xC3, 0xFF, + 0x83, 0x99, 0x99, 0x83, 0x9F, 0x9F, 0x9F, 0xFF, 0xC3, 0x99, 0x99, 0x99, 0x99, 0xC3, 0xF1, 0xFF, + 0x83, 0x99, 0x99, 0x83, 0x87, 0x93, 0x99, 0xFF, 0xC3, 0x99, 0x9F, 0xC3, 0xF9, 0x99, 0xC3, 0xFF, + 0x81, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xFF, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0xC3, 0xFF, + 0x99, 0x99, 0x99, 0x99, 0x99, 0xC3, 0xE7, 0xFF, 0x9C, 0x9C, 0x9C, 0x94, 0x80, 0x88, 0x9C, 0xFF, + 0x99, 0x99, 0xC3, 0xE7, 0xC3, 0x99, 0x99, 0xFF, 0x99, 0x99, 0x99, 0xC3, 0xE7, 0xE7, 0xE7, 0xFF, + 0x81, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x81, 0xFF, 0xE7, 0xE7, 0xE7, 0x00, 0x00, 0xE7, 0xE7, 0xE7, + 0x3F, 0x3F, 0xCF, 0xCF, 0x3F, 0x3F, 0xCF, 0xCF, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, + 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0x66, 0x33, 0x99, 0xCC, 0x66, 0x33, 0x99, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFF, 0xFF, 0xFF, 0xFF, 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x66, 0xCC, 0x99, 0x33, 0x66, 0xCC, 0x99, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xE7, 0xE7, 0xE7, 0xE0, 0xE0, 0xE7, 0xE7, 0xE7, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xE7, 0xE7, 0xE7, 0xE0, 0xE0, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x07, 0x07, 0xE7, 0xE7, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x07, 0x07, 0xE7, 0xE7, 0xE7, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0xFE, 0xFC, 0xF9, 0x93, 0x87, 0x8F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, + 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xE7, 0xE7, 0x07, 0x07, 0xFF, 0xFF, 0xFF, + 0x0F, 0x0F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0xF0, 0xF0, 0xF0, 0xF0 +}; diff --git a/DiskCaddy.cpp b/DiskCaddy.cpp new file mode 100644 index 0000000..e5998cc --- /dev/null +++ b/DiskCaddy.cpp @@ -0,0 +1,202 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#include "DiskCaddy.h" +#include "debug.h" +#include +#include +#include "ff.h" +extern "C" +{ +#include "rpi-gpio.h" // For SetACTLed +} + +static const u32 screenPosXCaddySelections = 240; +static const u32 screenPosYCaddySelections = 280; +static char buffer[256] = { 0 }; +static u32 white = RGBA(0xff, 0xff, 0xff, 0xff); +static u32 red = RGBA(0xff, 0, 0, 0xff); + +bool DiskCaddy::Insert(const FILINFO* fileInfo, bool readOnly) +{ + bool success; + FIL fp; + FRESULT res = f_open(&fp, fileInfo->fname, FA_READ); + if (res == FR_OK) + { + if (screen) + { + int y = screenPosYCaddySelections; + + snprintf(buffer, 256, "Loading %s\r\n", fileInfo->fname); + screen->PrintText(false, screenPosXCaddySelections, y, buffer, RGBA(0xff, 0xff, 0xff, 0xff), red); + } + + u32 bytesRead; + SetACTLed(true); + f_read(&fp, DiskImage::readBuffer, READBUFFER_SIZE, &bytesRead); + SetACTLed(false); + f_close(&fp); + + DiskImage::DiskType diskType = DiskImage::GetDiskImageTypeViaExtention(fileInfo->fname); + switch (diskType) + { + case DiskImage::D64: + success = InsertD64(fileInfo, (unsigned char*)DiskImage::readBuffer, bytesRead, readOnly); + break; + case DiskImage::G64: + success = InsertG64(fileInfo, (unsigned char*)DiskImage::readBuffer, bytesRead, readOnly); + break; + case DiskImage::NIB: + success = InsertNIB(fileInfo, (unsigned char*)DiskImage::readBuffer, bytesRead, readOnly); + break; + case DiskImage::NBZ: + success = InsertNBZ(fileInfo, (unsigned char*)DiskImage::readBuffer, bytesRead, readOnly); + break; + default: + success = false; + break; + } + if (success) + { + DEBUG_LOG("Mounted into caddy %s - %d\r\n", fileInfo->fname, bytesRead); + } + } + else + { + DEBUG_LOG("Failed to open %s\r\n", fileInfo->fname); + success = false; + } + + oldCaddyIndex = 0; + + return success; +} + +bool DiskCaddy::InsertD64(const FILINFO* fileInfo, unsigned char* diskImageData, unsigned size, bool readOnly) +{ + DiskImage diskImage; + if (diskImage.OpenD64(fileInfo, diskImageData, size)) + { + diskImage.SetReadOnly(readOnly); + disks.push_back(diskImage); + selectedIndex = disks.size() - 1; + return true; + } + return false; +} + +bool DiskCaddy::InsertG64(const FILINFO* fileInfo, unsigned char* diskImageData, unsigned size, bool readOnly) +{ + DiskImage diskImage; + if (diskImage.OpenG64(fileInfo, diskImageData, size)) + { + diskImage.SetReadOnly(readOnly); + disks.push_back(diskImage); + //DEBUG_LOG("Disks size = %d\r\n", disks.size()); + selectedIndex = disks.size() - 1; + return true; + } + return false; +} + +bool DiskCaddy::InsertNIB(const FILINFO* fileInfo, unsigned char* diskImageData, unsigned size, bool readOnly) +{ + DiskImage diskImage; + if (diskImage.OpenNIB(fileInfo, diskImageData, size)) + { + // At the moment we cannot write out NIB files. + diskImage.SetReadOnly(true);// readOnly); + disks.push_back(diskImage); + selectedIndex = disks.size() - 1; + return true; + } + return false; +} + +bool DiskCaddy::InsertNBZ(const FILINFO* fileInfo, unsigned char* diskImageData, unsigned size, bool readOnly) +{ + DiskImage diskImage; + if (diskImage.OpenNBZ(fileInfo, diskImageData, size)) + { + // At the moment we cannot write out NIB files. + diskImage.SetReadOnly(true);// readOnly); + disks.push_back(diskImage); + selectedIndex = disks.size() - 1; + return true; + } + return false; +} + +void DiskCaddy::Display() +{ + if (screen) + { + unsigned numberOfImages = GetNumberOfImages(); + unsigned caddyIndex; + int y = screenPosYCaddySelections; + + snprintf(buffer, 256, "Emulating\r\n"); + screen->PrintText(false, screenPosXCaddySelections, y, buffer, RGBA(0xff, 0xff, 0xff, 0xff), red); + y += 16; + + for (caddyIndex = 0; caddyIndex < numberOfImages; ++caddyIndex) + { + DiskImage* image = GetImage(caddyIndex); + const char* name = image->GetName(); + if (name) + { + snprintf(buffer, 256, "%d %s\r\n", caddyIndex + 1, name); + screen->PrintText(false, screenPosXCaddySelections, y, buffer, RGBA(0xff, 0xff, 0xff, 0xff), red); + y += 16; + } + } + + ShowSelectedImage(0); + } +} + +void DiskCaddy::ShowSelectedImage(u32 index) +{ + u32 x = screenPosXCaddySelections - 16; + u32 y = screenPosYCaddySelections + 16 + 16 * index; + snprintf(buffer, 256, "*"); + screen->PrintText(false, x, y, buffer, white, red); +} + +bool DiskCaddy::Update() +{ + u32 y; + u32 x; + u32 caddyIndex = GetSelectedIndex(); + if (caddyIndex != oldCaddyIndex) + { + if (screen) + { + x = screenPosXCaddySelections - 16; + y = screenPosYCaddySelections + 16 + 16 * oldCaddyIndex; + snprintf(buffer, 256, " "); + screen->PrintText(false, x, y, buffer, red, red); + oldCaddyIndex = caddyIndex; + ShowSelectedImage(oldCaddyIndex); + } + + return true; + } + return false; +} diff --git a/DiskCaddy.h b/DiskCaddy.h new file mode 100644 index 0000000..40a8a4d --- /dev/null +++ b/DiskCaddy.h @@ -0,0 +1,111 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef DISKCADDY_H +#define DISKCADDY_H + +#include +#include "DiskImage.h" +#include "Screen.h" + +class DiskCaddy +{ +public: + DiskCaddy() + : selectedIndex(0) + , screen(0) + { + } + + void SetScreen(Screen* screen) { this->screen = screen; } + + void Empty() + { + int index; + for (index = 0; index < (int)disks.size(); ++index) + { + disks[index].Close(); + } + disks.clear(); + selectedIndex = 0; + } + + bool Insert(const FILINFO* fileInfo, bool readOnly); + + DiskImage* GetCurrentDisk() + { + if (selectedIndex < disks.size()) + return &disks[selectedIndex]; + + return 0; + } + + DiskImage* NextDisk() + { + selectedIndex = (selectedIndex + 1) % (u32)disks.size(); + return GetCurrentDisk(); + } + + DiskImage* PrevDisk() + { + selectedIndex = (selectedIndex - 1) % (u32)disks.size(); + return GetCurrentDisk(); + } + + u32 GetNumberOfImages() const { return disks.size(); } + u32 GetSelectedIndex() const { return selectedIndex; } + + DiskImage* GetImage(unsigned index) { return &disks[index]; } + DiskImage* SelectImage(unsigned index) + { + if (selectedIndex != index && index < disks.size()) + { + selectedIndex = index; + return GetCurrentDisk(); + } + return 0; + } + DiskImage* SelectFirstImage() + { + if (disks.size()) + { + selectedIndex = 0; + return GetCurrentDisk(); + } + return 0; + } + + void Display(); + bool Update(); + +private: + bool InsertD64(const FILINFO* fileInfo, unsigned char* diskImageData, unsigned size, bool readOnly); + bool InsertG64(const FILINFO* fileInfo, unsigned char* diskImageData, unsigned size, bool readOnly); + bool InsertNIB(const FILINFO* fileInfo, unsigned char* diskImageData, unsigned size, bool readOnly); + bool InsertNBZ(const FILINFO* fileInfo, unsigned char* diskImageData, unsigned size, bool readOnly); + + void ShowSelectedImage(u32 index); + + std::vector disks; + u32 selectedIndex; + u32 oldCaddyIndex; + + Screen* screen; +}; + +#endif \ No newline at end of file diff --git a/DiskImage.cpp b/DiskImage.cpp new file mode 100644 index 0000000..bd7e616 --- /dev/null +++ b/DiskImage.cpp @@ -0,0 +1,810 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +// Pete Rittwage and Markus Brenner's code was heavly referenced and functions converted to CPP +// Used with Pete Rittwage's permission + +#include "DiskImage.h" +#include "gcr.h" +#include "debug.h" +#include +#include +#include "lz.h" +extern "C" +{ +#include "rpi-gpio.h" +} + +unsigned char DiskImage::readBuffer[READBUFFER_SIZE]; + +static unsigned char compressionBuffer[HALF_TRACK_COUNT * NIB_TRACK_LENGTH]; + +static const unsigned short SECTOR_LENGTH = 256; +static const unsigned short SECTOR_LENGTH_WITH_CHECKSUM = 260; +static const unsigned char GCR_SYNC_BYTE = 0xff; +static const unsigned char GCR_GAP_BYTE = 0x55; +static const int SECTOR_HEADER_LENGTH = 8; +static const unsigned MAX_D64_SIZE = 0x30000; + +#define NIB_HEADER_SIZE 0xFF + +int gap_match_length = 7; // Used by gcr.cpp + +const unsigned char DiskImage::SectorsPerTrack[42] = +{ + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, // 1 - 17 + 19, 19, 19, 19, 19, 19, 19, // 18 - 24 + 18, 18, 18, 18, 18, 18, // 25 - 30 + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, // 31 - 40 + 17, 17 // 41 - 42 + // total 683-768 sectors +}; + +DiskImage::DiskImage() + : readOnly(false) + , dirty(false) + , attachedImageSize(0) + , fileInfo(0) +{ + memset(tracks, 0x55, sizeof(tracks)); +} + +void DiskImage::Close() +{ + switch (diskType) + { + case D64: + CloseD64(); + break; + case G64: + CloseG64(); + break; + case NIB: + CloseNIB(); + break; + case NBZ: + CloseNBZ(); + break; + default: + break; + } + memset(tracks, 0x55, sizeof(tracks)); + memset(trackLengths, 0, sizeof(trackLengths)); + diskType = NONE; + fileInfo = 0; +} + +void DiskImage::DumpTrack(unsigned track) +{ + unsigned char* src = tracks[track]; + unsigned trackLength = trackLengths[track]; + DEBUG_LOG("track = %d trackLength = %d\r\n", track, trackLength); + for (unsigned index = 0; index < trackLength; ++index) + { + DEBUG_LOG("%d %02x\r\n", index, src[index]); + } +} + +bool DiskImage::OpenD64(const FILINFO* fileInfo, unsigned char* diskImage, unsigned size) +{ + Close(); + + this->fileInfo = fileInfo; + + unsigned offset = 0; + + if (size > MAX_D64_SIZE) + size = MAX_D64_SIZE; + + attachedImageSize = size; + + for (unsigned halfTrackIndex = 0; halfTrackIndex < HALF_TRACK_COUNT; ++halfTrackIndex) + { + unsigned char track = (halfTrackIndex >> 1); + unsigned char* dest = tracks[halfTrackIndex]; + + trackLengths[halfTrackIndex] = SectorsPerTrack[track] * GCR_SECTOR_LENGTH; + + if ((halfTrackIndex & 1) == 0) + { + if (offset < size) // This will allow for >35 tracks. + { + trackUsed[halfTrackIndex] = true; + //DEBUG_LOG("Track %d used\r\n", halfTrackIndex); + for (unsigned sectorNo = 0; sectorNo < SectorsPerTrack[track]; ++sectorNo) + { + convert_sector_to_GCR(diskImage + offset, dest, track + 1, sectorNo, diskImage + 0x165A2, 0); + dest += 361; + + offset += SECTOR_LENGTH; + } + } + else + { + trackUsed[halfTrackIndex] = false; + //DEBUG_LOG("Track %d not used\r\n", halfTrackIndex); + } + } + else + { + trackUsed[halfTrackIndex] = false; + //DEBUG_LOG("Track %d not used\r\n", halfTrackIndex); + } + } + + diskType = D64; + return true; +} + +bool DiskImage::WriteD64() +{ + if (readOnly) + return true; + + FIL fp; + FRESULT res = f_open(&fp, fileInfo->fname, FA_CREATE_ALWAYS | FA_WRITE); + if (res == FR_OK) + { + u32 bytesToWrite; + u32 bytesWritten; + + int track, sector; + BYTE id[3]; + BYTE d64data[MAXBLOCKSONDISK * 256], *d64ptr; + int blocks_to_save = 0; + + DEBUG_LOG("Writing D64 file...\r\n"); + + memset(d64data, 0, sizeof(d64data)); + + if (!GetID(34, id)) + { + DEBUG_LOG("Cannot find directory sector.\r\n"); + return false; + } + d64ptr = d64data; + for (track = 0; track <= 40 * 2; track += 2) + { + if (trackUsed[track]) + { + //printf("Track %d\n", track); + + for (sector = 0; sector < SectorsPerTrack[track / 2]; sector++) + { + ConvertSector(track, sector, d64ptr); + d64ptr += 256; + blocks_to_save++; + } + } + } + + bytesToWrite = blocks_to_save * 256; + SetACTLed(true); + if (f_write(&fp, d64data, bytesToWrite, &bytesWritten) != FR_OK || bytesToWrite != bytesWritten) + { + SetACTLed(false); + DEBUG_LOG("Cannot write d64 data.\r\n"); + f_close(&fp); + return false; + } + + f_close(&fp); + + f_utime(fileInfo->fname, fileInfo); + SetACTLed(false); + + DEBUG_LOG("Converted %d blocks into D64 file\r\n", blocks_to_save); + + return true; + } + else + { + DEBUG_LOG("Failed to open %s for write\r\n", fileInfo->fname); + return false; + } +} + +void DiskImage::CloseD64() +{ + if (dirty) + { + WriteD64(); + dirty = false; + } + attachedImageSize = 0; +} + +bool DiskImage::OpenG64(const FILINFO* fileInfo, unsigned char* diskImage, unsigned size) +{ + Close(); + + this->fileInfo = fileInfo; + + attachedImageSize = size; + + if (memcmp(diskImage, "GCR-1541", 8) == 0) + { + //DEBUG_LOG("Is G64\r\n"); + + unsigned char numTracks = diskImage[9]; + //DEBUG_LOG("numTracks = %d\r\n", numTracks); + + unsigned char* data = diskImage + 12; + unsigned char* speedZoneData = diskImage + 0x15c; + unsigned short trackLength = 0; + + unsigned track; + + for (track = 0; track < numTracks; ++track) + { + unsigned offset = *(unsigned*)data; + data += 4; + + //DEBUG_LOG("Track = %d Offset = %x\r\n", track, offset); + + trackDensity[track] = *(unsigned*)(speedZoneData + track * 4); + + if (offset == 0) + { + trackLengths[track] = capacity_max[trackDensity[track]]; + trackUsed[track] = false; + } + else + { + unsigned char* trackData = diskImage + offset; + + trackLength = *(unsigned short*)(trackData); + //DEBUG_LOG("trackLength = %d offset = %d\r\n", trackLength, offset); + trackData += 2; + trackLengths[track] = trackLength; + memcpy(tracks[track], trackData, trackLength); + trackUsed[track] = true; + //DEBUG_LOG("%d has data\r\n", track); + } + } + + diskType = G64; + return true; + } + return false; +} + +static bool WriteDwords(FIL* fp, u32* values, u32 amount) +{ + u32 index; + u32 bytesToWrite = 4; + u32 bytesWritten; + + for (index = 0; index < amount; ++index) + { + if (f_write(fp, &values[index], bytesToWrite, &bytesWritten) != FR_OK || bytesToWrite != bytesWritten) + return false; + } + return true; +} + +bool DiskImage::WriteG64() +{ + if (readOnly) + return true; + + FIL fp; + FRESULT res = f_open(&fp, fileInfo->fname, FA_CREATE_ALWAYS | FA_WRITE); + if (res == FR_OK) + { + u32 bytesToWrite; + u32 bytesWritten; + int track_inc = 1; + + BYTE header[12]; + DWORD gcr_track_p[MAX_HALFTRACKS_1541] = { 0 }; + DWORD gcr_speed_p[MAX_HALFTRACKS_1541] = { 0 }; + BYTE gcr_track[NIB_TRACK_LENGTH + 2]; + size_t track_len; + int index = 0, track; + BYTE buffer[NIB_TRACK_LENGTH], tempfillbyte; + + DEBUG_LOG("Writing G64 file...\r\n"); + //DEBUG_LOG("G64 Track Length = %d", G64_TRACK_MAXLEN); + + strcpy((char *)header, "GCR-1541"); + header[8] = 0; + header[9] = MAX_HALFTRACKS_1541; + header[10] = (BYTE)(G64_TRACK_MAXLEN % 256); + header[11] = (BYTE)(G64_TRACK_MAXLEN / 256); + + bytesToWrite = sizeof(header); + SetACTLed(true); + if (f_write(&fp, header, bytesToWrite, &bytesWritten) != FR_OK || bytesToWrite != bytesWritten) + { + SetACTLed(false); + DEBUG_LOG("Cannot write G64 header.\r\n"); + f_close(&fp); + return false; + } + SetACTLed(false); + + for (track = 0; track < MAX_HALFTRACKS_1541; track += track_inc) + { + if (trackLengths[track] == 0 || !trackUsed[track]) + { + gcr_track_p[track] = 0; + gcr_speed_p[track] = 0; + } + else + { + gcr_track_p[track] = 0xc + (MAX_TRACKS_1541 * 16) + (index++ * (G64_TRACK_MAXLEN + 2)); + gcr_speed_p[track] = trackDensity[track] & 3; + } + } + + SetACTLed(true); + WriteDwords(&fp, (u32*)gcr_track_p, MAX_HALFTRACKS_1541); + WriteDwords(&fp, (u32*)gcr_speed_p, MAX_HALFTRACKS_1541); + SetACTLed(false); + + for (track = 0; track < MAX_HALFTRACKS_1541; track += track_inc) + { + track_len = trackLengths[track]; + if (track_len>G64_TRACK_MAXLEN) track_len = G64_TRACK_MAXLEN; + + if (!track_len || !trackUsed[track]) continue; + + tempfillbyte = 0x55; + + memset(&gcr_track[2], tempfillbyte, G64_TRACK_MAXLEN); + + gcr_track[0] = (BYTE)(track_len % 256); + gcr_track[1] = (BYTE)(track_len / 256); + memcpy(buffer, tracks[track], track_len); + + memcpy(gcr_track + 2, buffer, track_len); + bytesToWrite = G64_TRACK_MAXLEN + 2; + SetACTLed(true); + if (f_write(&fp, gcr_track, bytesToWrite, &bytesWritten) != FR_OK || bytesToWrite != bytesWritten) + { + SetACTLed(false); + DEBUG_LOG("Cannot write track data.\r\n"); + f_close(&fp); + return false; + } + SetACTLed(false); + } + + f_close(&fp); + DEBUG_LOG("nSuccessfully saved G64\r\n"); + + return true; + } + else + { + DEBUG_LOG("Failed to open %s for write\r\n", fileInfo->fname); + return false; + } +} + +void DiskImage::CloseG64() +{ + if (dirty) + { + WriteG64(); + + dirty = false; + } + attachedImageSize = 0; +} + +bool DiskImage::OpenNIB(const FILINFO* fileInfo, unsigned char* diskImage, unsigned size) +{ + int track, t_index = 0, h_index = 0; + Close(); + + this->fileInfo = fileInfo; + + attachedImageSize = size; + + if (memcmp(diskImage, "MNIB-1541-RAW", 13) == 0) + { + + for (track = 0; track < (MAX_TRACKS_1541 * 2); ++track) + { + trackLengths[track] = capacity_max[trackDensity[track]]; + trackUsed[track] = false; + } + + while (diskImage[0x10 + h_index]) + { + track = diskImage[0x10 + h_index] - 2; + unsigned char v = diskImage[0x11 + h_index]; + trackDensity[track] = (v & 0x03); + + DEBUG_LOG("Converting NIB track %d (%d.%d)\r\n", track, track >> 1, track & 1 ? 5 : 0); + + unsigned char* nibdata = diskImage + (t_index * NIB_TRACK_LENGTH) + 0x100; + int align; + trackLengths[track] = extract_GCR_track(tracks[track], nibdata, &align + //, ALIGN_GAP + , ALIGN_NONE + , capacity_min[trackDensity[track]], + capacity_max[trackDensity[track]]); + + trackUsed[track] = true; + + h_index += 2; + t_index++; + } + + + DEBUG_LOG("Successfully parsed NIB data for %d tracks\n", t_index); + diskType = NIB; + return true; + } + return false; +} + +bool DiskImage::WriteNIB() +{ + if (readOnly) + return true; + + FIL fp; + FRESULT res = f_open(&fp, fileInfo->fname, FA_CREATE_ALWAYS | FA_WRITE); + if (res == FR_OK) + { + u32 bytesToWrite; + u32 bytesWritten; + + int track; + char header[0x100]; + int header_entry = 0; + + DEBUG_LOG("Converting to NIB format...\n"); + + memset(header, 0, sizeof(header)); + + sprintf(header, "MNIB-1541-RAW%c%c%c", 1, 0, 0); + + for (track = 0; track < (MAX_TRACKS_1541 * 2); ++track) + { + if (trackUsed[track]) + { + header[0x10 + (header_entry * 2)] = (BYTE)track + 2; + header[0x10 + (header_entry * 2) + 1] = trackDensity[track]; + + header_entry++; + } + } + + bytesToWrite = sizeof(header); + SetACTLed(true); + if (f_write(&fp, header, bytesToWrite, &bytesWritten) != FR_OK || bytesToWrite != bytesWritten) + { + DEBUG_LOG("Cannot write track data.\r\n"); + } + else + { + bytesToWrite = NIB_TRACK_LENGTH; + for (track = 0; track < (MAX_TRACKS_1541 * 2); ++track) + { + if (trackUsed[track]) + { + if (f_write(&fp, tracks[track], bytesToWrite, &bytesWritten) != FR_OK || bytesToWrite != bytesWritten) + { + DEBUG_LOG("Cannot write track data.\r\n"); + } + } + } + } + SetACTLed(false); + + f_close(&fp); + + DEBUG_LOG("nSuccessfully saved NIB\r\n"); + + return true; + } + else + { + DEBUG_LOG("Failed to open %s for write\r\n", fileInfo->fname); + return false; + } +} + +void DiskImage::CloseNIB() +{ + if (dirty) + { + WriteNIB(); + + dirty = false; + } + attachedImageSize = 0; +} + +bool DiskImage::OpenNBZ(const FILINFO* fileInfo, unsigned char* diskImage, unsigned size) +{ + Close(); + + if ((size = LZ_Uncompress(diskImage, compressionBuffer, size))) + { + if (OpenNIB(fileInfo, compressionBuffer, size)) + { + diskType = NIB; + return true; + } + } + return false; +} + +bool DiskImage::WriteNBZ() +{ + bool success = false; + + if (readOnly) + return true; + + SetACTLed(true); + if (WriteNIB()) + { + FIL fp; + FRESULT res = f_open(&fp, fileInfo->fname, FA_READ); + if (res == FR_OK) + { + u32 bytesRead; + f_read(&fp, readBuffer, READBUFFER_SIZE, &bytesRead); + f_close(&fp); + DEBUG_LOG("Reloaded %s - %d for compression\r\n", fileInfo->fname, bytesRead); + bytesRead = LZ_Compress(readBuffer, compressionBuffer, bytesRead); + + if (bytesRead) + { + res = f_open(&fp, fileInfo->fname, FA_CREATE_ALWAYS | FA_WRITE); + if (res == FR_OK) + { + u32 bytesToWrite = bytesRead; + u32 bytesWritten; + + if (f_write(&fp, compressionBuffer, bytesToWrite, &bytesWritten) != FR_OK || bytesToWrite != bytesWritten) + { + DEBUG_LOG("Cannot write NBZ data.\r\n"); + } + else + { + success = true; + } + f_close(&fp); + } + } + } + } + SetACTLed(false); + return success; +} + +void DiskImage::CloseNBZ() +{ + if (dirty) + { + WriteNBZ(); + + dirty = false; + } + attachedImageSize = 0; +} + +bool DiskImage::GetDecodedSector(u32 track, u32 sector, u8* buffer) +{ + if (track > 0) + { + track = (track - 1) * 2; + if (trackUsed[track]) + return ConvertSector(track, sector, buffer); + } + + return false; +} + +DiskImage::DiskType DiskImage::GetDiskImageTypeViaExtention(const char* diskImageName) +{ + char* ext = strrchr((char*)diskImageName, '.'); + + if (ext) + { + if (toupper((char)ext[1]) == 'G' && ext[2] == '6' && ext[3] == '4') + return G64; + else if (toupper((char)ext[1]) == 'N' && toupper((char)ext[2]) == 'I' && toupper((char)ext[3]) == 'B') + return NIB; + else if (toupper((char)ext[1]) == 'N' && toupper((char)ext[2]) == 'B' && toupper((char)ext[3]) == 'Z') + return NBZ; + else if (toupper((char)ext[1]) == 'D' && ext[2] == '6' && ext[3] == '4') + return D64; + else if (toupper((char)ext[1]) == 'L' && toupper((char)ext[2]) == 'S' && toupper((char)ext[3]) == 'T') + return LST; + } + return NONE; +} + +bool DiskImage::IsDiskImageExtention(const char* diskImageName) +{ + return GetDiskImageTypeViaExtention(diskImageName) != NONE; +} + +bool DiskImage::IsLSTExtention(const char* diskImageName) +{ + char* ext = strrchr((char*)diskImageName, '.'); + + if (ext && toupper((char)ext[1]) == 'L' && toupper((char)ext[2]) == 'S' && toupper((char)ext[3]) == 'T') + return true; + return false; +} + +bool DiskImage::ConvertSector(unsigned track, unsigned sector, unsigned char* data) +{ + unsigned char buffer[SECTOR_LENGTH_WITH_CHECKSUM]; + unsigned char checkSum; + int index; + int bitIndex; + + bitIndex = FindSectorHeader(track, sector, 0); + if (bitIndex < 0) + return false; + + bitIndex = FindSync(track, bitIndex, (SECTOR_LENGTH_WITH_CHECKSUM * 2) * 8); + if (bitIndex < 0) + return false; + + DecodeBlock(track, bitIndex, buffer, SECTOR_LENGTH_WITH_CHECKSUM / 4); + + checkSum = buffer[257]; + for (index = 0; index < SECTOR_LENGTH; ++index) + { + data[index] = buffer[index + 1]; + checkSum ^= data[index]; + } + + if (buffer[0] != 0x07) + return false; // No data block + + return checkSum == 0; +} + +void DiskImage::DecodeBlock(unsigned track, int bitIndex, unsigned char* buf, int num) +{ + int shift, i, j; + unsigned char gcr[5]; + unsigned char byte; + unsigned char* offset; + unsigned char* end = tracks[track] + trackLengths[track]; + + shift = bitIndex & 7; + offset = tracks[track] + (bitIndex >> 3); + + byte = offset[0] << shift; + for (i = 0; i < num; i++, buf += 4) + { + for (j = 0; j < 5; j++) + { + offset++; + if (offset >= end) + offset = tracks[track]; + + if (shift) + { + gcr[j] = byte | ((offset[0] << shift) >> 8); + byte = offset[0] << shift; + } + else + { + gcr[j] = byte; + byte = offset[0]; + } + } + convert_4bytes_from_GCR(gcr, buf); + } +} + +int DiskImage::FindSync(unsigned track, int bitIndex, int maxBits, int* syncStartIndex) +{ + int readShiftRegister = 0; + unsigned char byte = tracks[track][bitIndex >> 3] << (bitIndex & 7); + bool prevBitZero = true; + + while (maxBits--) + { + if (byte & 0x80) + { + if (syncStartIndex && prevBitZero) + *syncStartIndex = bitIndex; + + prevBitZero = false; + readShiftRegister = (readShiftRegister << 1) | 1; + } + else + { + prevBitZero = true; + + if (~readShiftRegister & 0x3ff) + readShiftRegister <<= 1; + else + return bitIndex; + } + if (~bitIndex & 7) + { + bitIndex++; + byte <<= 1; + } + else + { + bitIndex++; + if (bitIndex >= NIB_TRACK_LENGTH * 8) + bitIndex = 0; + byte = tracks[track][bitIndex >> 3]; + } + } + return -1; +} + +int DiskImage::FindSectorHeader(unsigned track, unsigned sector, unsigned char* id) +{ + unsigned char header[10]; + int bitIndex; + int bitIndexPrev; + + bitIndex = 0; + bitIndexPrev = -1; + for (;;) + { + bitIndex = FindSync(track, bitIndex, NIB_TRACK_LENGTH * 8); + if (bitIndexPrev == bitIndex) + break; + if (bitIndexPrev < 0) + bitIndexPrev = bitIndex; + DecodeBlock(track, bitIndex, header, 2); + + if (header[0] == 0x08 && header[2] == sector) + { + if (id) + { + id[0] = header[5]; + id[1] = header[4]; + } + return bitIndex; + } + } + return -1; +} + +unsigned DiskImage::GetID(unsigned track, unsigned char* id) +{ + if (FindSectorHeader(track, 0, id) >= 0) + return 1; + return 0; +} + +unsigned DiskImage::LastTrackUsed() +{ + unsigned i; + unsigned lastTrackUsed = 0; + + for (i = 0; i < HALF_TRACK_COUNT; ++i) + { + if (trackUsed[i]) + lastTrackUsed = i; + } + return lastTrackUsed; +} diff --git a/DiskImage.h b/DiskImage.h new file mode 100644 index 0000000..efe3b91 --- /dev/null +++ b/DiskImage.h @@ -0,0 +1,158 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef DISKIMAGE_H +#define DISKIMAGE_H +#include "types.h" +#include "ff.h" + +#define READBUFFER_SIZE 1024 * 512 + +#define NIB_TRACK_LENGTH 0x2000 + +#define BAM_OFFSET 4 +#define BAM_ENTRY_SIZE 4 + +#define DIR_ENTRY_OFFSET_TYPE 0 +#define DIR_ENTRY_OFFSET_NAME 3 +#define DIR_ENTRY_OFFSET_BLOCKS 28 + +#define DIR_ENTRY_NAME_LENGTH 18-2 + +static const unsigned char HALF_TRACK_COUNT = 84; +static const unsigned short GCR_SYNC_LENGTH = 5; +static const unsigned short GCR_HEADER_LENGTH = 10; +static const unsigned short GCR_HEADER_GAP_LENGTH = 8; +static const unsigned short GCR_SECTOR_DATA_LENGTH = 325; +static const unsigned short GCR_SECTOR_GAP_LENGTH = 8; +static const unsigned short GCR_SECTOR_LENGTH = GCR_SYNC_LENGTH + GCR_HEADER_LENGTH + GCR_HEADER_GAP_LENGTH + GCR_SYNC_LENGTH + GCR_SECTOR_DATA_LENGTH + GCR_SECTOR_GAP_LENGTH; //361 + +static const unsigned short G64_MAX_TRACK_LENGTH = 7928; + +class DiskImage +{ +public: + enum DiskType + { + NONE, + D64, + G64, + NIB, + NBZ, + LST, + RAW + }; + + DiskImage(); + + bool OpenD64(const FILINFO* fileInfo, unsigned char* diskImage, unsigned size); + bool OpenG64(const FILINFO* fileInfo, unsigned char* diskImage, unsigned size); + bool OpenNIB(const FILINFO* fileInfo, unsigned char* diskImage, unsigned size); + bool OpenNBZ(const FILINFO* fileInfo, unsigned char* diskImage, unsigned size); + + void Close(); + + bool GetDecodedSector(u32 track, u32 sector, u8* buffer); + + inline bool GetNextBit(u32 track, u32 byte, u32 bit) + { + if (attachedImageSize == 0) + return 0; + + return ((tracks[track][byte] >> bit) & 1) != 0; + } + + inline void SetBit(u32 track, u32 byte, u32 bit, bool value) + { + if (attachedImageSize == 0) + return; + + u8 dataOld = tracks[track][byte]; + u8 bitMask = 1 << bit; + if (value) + { + TestDirty(track, (dataOld & bitMask) == 0); + tracks[track][byte] |= bitMask; + } + else + { + TestDirty(track, (dataOld & bitMask) != 0); + tracks[track][byte] &= ~bitMask; + } + } + + static const unsigned char SectorsPerTrack[42]; + + void DumpTrack(unsigned track); + + const char* GetName() { return fileInfo->fname; } + + inline unsigned BitsInTrack(unsigned track) const { return trackLengths[track] << 3; } + + static DiskType GetDiskImageTypeViaExtention(const char* diskImageName); + static bool IsDiskImageExtention(const char* diskImageName); + static bool IsLSTExtention(const char* diskImageName); + + bool GetReadOnly() const { return readOnly; } + void SetReadOnly(bool readOnly) { this->readOnly = readOnly; } + + unsigned LastTrackUsed(); + + static unsigned char readBuffer[READBUFFER_SIZE]; + +private: + void CloseD64(); + void CloseG64(); + void CloseNIB(); + void CloseNBZ(); + + bool WriteD64(); + bool WriteG64(); + bool WriteNIB(); + bool WriteNBZ(); + + inline void TestDirty(u32 track, bool isDirty) + { + if (isDirty) + { + trackDirty[track] = true; + trackUsed[track] = true; + dirty = true; + } + } + + bool ConvertSector(unsigned track, unsigned sector, unsigned char* buffer); + void DecodeBlock(unsigned track, int bitIndex, unsigned char* buf, int num); + unsigned GetID(unsigned track, unsigned char* id); + int FindSectorHeader(unsigned track, unsigned sector, unsigned char* id); + int FindSync(unsigned track, int bitIndex, int maxBits, int* syncStartIndex = 0); + + bool readOnly; + bool dirty; + unsigned attachedImageSize; + DiskType diskType; + const FILINFO* fileInfo; + + unsigned char tracks[HALF_TRACK_COUNT][NIB_TRACK_LENGTH]; + unsigned short trackLengths[HALF_TRACK_COUNT]; + unsigned char trackDensity[HALF_TRACK_COUNT]; + bool trackDirty[HALF_TRACK_COUNT]; + bool trackUsed[HALF_TRACK_COUNT]; +}; + +#endif \ No newline at end of file diff --git a/Drive.cpp b/Drive.cpp new file mode 100644 index 0000000..8ff7b6a --- /dev/null +++ b/Drive.cpp @@ -0,0 +1,530 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#include "Drive.h" +#include "m6522.h" +#include "debug.h" + +// There is a lot going on even though the emulation code is extremely small. +// A few counters, shift registers and the occasional logic gate takes a surprisingly small amount of code to implement. + +// Note: A 1541 is an upgraded (cost reduced) version of the 1540. +// In a 1541 a lot of the drive logic is implemented in a custom asic chip 235572. Internally, this chip contains essentially the same logic that was used in the 1540. +// Commodore chose to reduce the chip count to also reduce power consumption, heat, and production costs. +// Schematics for the 1540 drive logic made this emulator possible. The 1540 logic was emulated hence chip names reference the 1540. +// I have a VIC-1541 drive with a 1540 type board in it. The chips are laid out in columns A through to H. + +// Considering how prolific magnetic storage has been for many decades there is surprisingly little information (retaliative to other computer hardware like CPUs) into how disk drives actually work. +// This is how I understand it (and I apologise for the verbosity but it helped me come to that understanding). +// +// Magnetic media can provide simple, inexpensive and reliable storage medium. +// Reliability being a challenge considering that disks can vary between different disk manufactures and brands. +// Physical properties of drives, like alignment and rotation speed can vary slightly from drive to drive. These properties can even vary overtime or due to temperature fluctuations within the same drive. +// Digital information needs to be stored via an analogue system that can tolerate minor inconsistencies between theses physical properties. +// +// A magnetic field has two important characteristics flux density, and polarity (North and South Poles). +// At first glance, the two magnetic polarities, N and S, look ideal to nicely to represent a 1 or 0. +// Hall effect sensors can detect flux density of a magnetic field (even a constant one) but generally require stronger flux densities than found on the coating of floppy media can provide, so are not used to read data. +// And unfortunately, hall effect sensors have no way of writing data only reading it. +// +// Maxwell–Faraday law/equation states that a time varying magnetic field will induce a time varing electric field and visa versa. +// Disks drive heads use this principal, and can therefore, read and write data. +// Yet they can only detect/read and create/write changes in the disk's analogue magnetic field over time. +// The larger and quicker the change the easier it is to detect and read. +// Writing works in reverse where a changing electric signal creates a changing magnetic field. +// +// So how are digital 1s and 0s represented using this analogue magnetic field? +// A 1 is represented by the changing analogue magnetic field changing from N to S and visa versa. +// But what about the 0s? A 0 is represented by how quickly the magnetic field changes between any two 1 bits. +// So technically only the 1s are written to the disk. 0s are infered from the rate at which the magnetic field changes between two 1 bits. +// The slower the analogue change between N-S/S-N change the more 0s there will be in between the 1s. +// Long groups of consecutive 0s will eventually slow the rate of change down to a point where the magnetic field becomes almost constant. +// A constant magnetic field will stop induction. +// Due to the way the amplification circuits operate (explained below), an almost constant magnetic field can become problematic producing false readings. +// +// To solve the problem of preventing long groups of 0s and to keep the magnetic field varing over time various data encoding schemes were created. +// These data encoding schemes sacrifice disk density for maintaining a rapidly changing, easy to read magnetic field. +// Originally, up to 50% of a disk's density was sacrificed for software encoding schemes. Interleaving clock bits with data bits. +// Then some bright sparks invented other more efficient schemes, almost doubling the density of the of the disk (as space for the clock bits could now be used for data). +// Some marketing genius picked up on the words “double density” and the name stuck, even though the disk was always capable of storing the exact same number of bits! +// A encoding scheme commonly used at the time of the 1541 is called GCR. +// GCR encodes 4 bits into 5 where any combination cannot produce no more than two 0s in a row. This sacrifices only 20% of the disk's density. +// There is no drive hardware that dictates that any specific encoding scheme nees to be used. +// Software is free to do whatever it wants, even change the encoding schemes used over different parts of the disk or even within a single track. +// But any coding scheme that allows long groups of 0s will experience side effects. +// Side effects of long groups of 0s can cause a random 1 to be read incorrectly (explained below). +// Many copy protection schemes rely on these side effects occurring. +// The decoder in the 1541 is also hard coded to output a 1 after every three 0s even if there is no magnetic field change (flux reversal). So a 1541 cannot read more than three 0s in a row. +// +// A read/write head is a coil with a centre tap effectively creating two coils. One coil detects/creates magnetic field changes in one direction (N-S) and the other coil in the other direction (S-N). +// There is also a third coil use to erase. +// The difference between the electric signals in each of the two coils is amplified. +// Remember that we are only interested in the rate in which the magnetic field is changing not its relative amplitude. +// Drives vary slightly and even the same drive can vary with temperature. +// Because of this and to increase alignment tolerance the relative amplitude of the magnetic field can be ignored. The rate of change is important. +// The amplifier therefore amplifies the signal with a varying gain. This is called 'Automatic Gain Control'. +// It is always trying to amplify the signal as much as it needs. For a strong signal not as much as for a weak signal. +// +// The signal is then filtered. A low-pass filter attenuates noise and unwanted harmonics. +// +// In a 1540;- +// This is done by L8-L11, and C16. +// +// To detect the all important change in magnetic field direction (ie a flux reversal) the signal is again amplified. +// But this time the amplifier has been configured as a differentiator as well. +// A differentiator amplifier produces an output signal that is the first derivative of the input signal. +// That is, the output signal is directly proportional to the rate of change of the input signal. +// This means that every place in the input signal where there is a peak or trough (ie the signal changes direction, namely, a flux reversal) the new signal will cross the zero point (in the analogue waveform). +// +// The differentiated signal can now be analysed. A zero crossing represents a 1. The absence of a zero crossing over a certain time threshold represents a 0. +// The problem then becomes how to detect zero crossings and time them. +// Detecting zero crossings is solved using another operational amplifier configured as a comparator with a reference voltage of zero. +// The comparator output toggles each time its inputs sense a zero crossing. The signal now being analysed is a simple square wave. +// +// In a 1540;- +// Heads read 7mv. +// First amp UH7 amplifies this to 350mv. +// Second amp UH5 amplifies this and differentiates it to 3.5v. +// Comparator UH4 and the pulse generator output 5v TTL. +// +// The comparator output is then applied to the time domain filter. +// The primary purpose of the time domain filter is to generate an output pulse for each transition of the comparator output. +// These pulses correspond to valid 1s being read off the disk and the absence of pulses the infered 0s. +// The secondary purpose is to filter out false zero crossings which can be caused by noise aggravated by media defect and contamination. +// Filtering out false information involves the use of an "ignore window", during which time any zero crossings are ignored. +// +// The time domain filter consists of a two one shots, and a D type flip flop. +// Each transition of the comparator output triggers the first one shot, which provides the ignore window. +// When the output of the first one shot returns to the normal level, the D type flip flop clocks through the new data (from the comparator), causing the Q and !Q outputs to switch. +// This in turn triggers the second one shot, to produce an output pulse. +// However, the second one shot will only be triggered if the comparator output has changed since the last clocking of the D type flip flop, and remained at that new level. +// If the comparator changed level due to noise on a slowly changing magnetic field and returned to its original level within the first one shot's period, the D type flip flop outputs will not change, and the second one shot will not generate a new output pulse. +// +// Thus, the zero crossing detector and the pulse generator result in pulses occurring at the original input signal's peak points (ie flux reversals). +// +// So in a 1540;- +// The output of the comparator is applied to the valid pulse detector(UG2D, UG3A, and UF6A). +// UG2D, along with C27, R24, and R25, forms an edge detector. +// Pin 11 of UG2D will produce a 500 nanosecond active high pulse on rising edges of the comparator's output and will produce a 150 nanosecond high pulse on falling edges of the comparator's output. +// The pulse out of UG2D is applied to UG3A, a single shot multivibrator. +// UG3A produces an active low pulse which is approximately 2.5 microseconds wide. +// Flip flop UF6A is clocked on the trailing edge of the output pulse of UG3A. +// The output of the comparator must be maintained for at least 2.5 microseconds in order to be latched into the flip flop. +// If a narrow noise pulse triggers this circuit, the output of the flip flop will not change since the noise pulse will terminate before UG3A triggers UF6A. +// The output of the flip flop (UF6A) will reflect the data delayed by approximately 2.5 microseconds. +// The valid data out of the valid pulse detector is applied to an edge detector consisting of UG2A and UG3B. +// UG2A operates the same as UG2D above. +// The pulses out of UG2A trigger UG3B, a single shot multivibrator. +// UG3B produces a narrow pulse, which represents transitions of the data. +// This output is applied to the timing circuit to synchronise the encoder / decoder clock +// +// +// The problem of zero crossing (hence flux reversals) is solved, now 1s can be detetected. Detecting 0s now becomes a task of timing the gap between the 1s. +// +// After all this explanation, NONE of this needs to be emulated! +// +// Up to this point the hardware explained so far is responsible for converting the analogue siganls into clean digital signals. +// Emulated disk images already consist of digital information and hence the hardware explained so far has to some degree already been emulated. +// What does need to be emulated though (at least simulated) is the side effects the hardware can produce. +// +// +// Side effects +// When software uses a valid encoding scheme long runs of 0 are avoided. +// Even if the disk is old or the drive is slightly miss alligned or varying in rotation speed (within a certain range) there should not be a problem reading the data. +// But there is still nothing that to prevent the magnetic field on a disk changing slowly. +// So what happens when the magnetic field is changing slowly but just fast enough for induction to be detected? +// The first amplifier will detect the weak induced signal and maximise its gain. With a maximised gain noise can become a problem. +// The slope of the slowly changing signal will be differentiated to produce a signal that will be near zero. +// A low amplitude signal varying near zero is fine and valid but a low amplitude signal varying around zero is bad as each zero crossing will be detected incorrectly as a 1. +// So any noise on the differentiated signal could cause it to cross the zero point causing the comparator to switch. +// The time domain filter will normally filter most of the high frequency false crossings out. +// But if these random zero crossing just happen to occur at the normally expected rate of valid flux reversals, random 1s, along with the groups of 0s, will be read. +// On a signal that is near zero these random noise frequencies can and do occur at the normally valid ranges. +// Copy protection schemes rely on this and deliberately place a slow changing magnetic field on the disk. +// The software then reads that section of the disk multiple times. Each time comparing the values, looking for the random 1s. +// If the 1s are consistent then it knows that the field on the disk is no longer the slowly changing one of the original but that of a faster changing one of a copy. +// This side effect is simulated by the code below. +// +// Now all that is left to solve is the problem of timing. +// The data on the disk is divided into cells. If a transition occurs at the beginning of a cell, the cell is interpreted as a logic 1. If no transition occurs, the cell is interpreted as a logic 0. +// We just need to time the cell. The cell handling is the responsibility of the encoder/decoder (for writing/reading). +// +// For the standard CBM format more information (hence more cells) are stored on the outside of a disk than the inside. +// This variation keeps the bit density relatively constant over the surface of the disk. +// The disk spins at a near to constant rate. +// So for a round disk there is more surface area on the outside tracks than the inside. +// The timing of the cells and hence the encoder/decoder's clock can vary upto four levels (set via 2 pins in the VIA($1C00) PB5 and PB6). +// The encoder/decoder is usually clocked at a fester rate when on the outer tracks than when on the inner tracks. +// It is the encoder/decoder clock which determines how many bits will fit on any one track. +// +// The core clock generator inside a 1541 is a 16Mz crystal. All timings including the encoder/decoder clock is derived from this. +// +// The encoder/decoder clock is simply a counter. UE7 a 74LS193 Synchronous 4-Bit Up/Down Counter. +// If counting at 16Mz it will take 16 cycles to count to 16 and therefore overflow/trigger a carry every 1us (ie 1MHz) +// It always counts at the same rate but can be made to trigger quicker if it is preloaded with an initial count each time it begins a new count. +// This preloading value comes from the CLOCK_SEL_AB pins of the VIA's PB5 and PB6 (set via the CPU) and can therefore be preloaded with a value of 0 to 3. +// The programmable divider is controlled by the CLOCK SEL A and CLOCK SEL B lines and selects the density level. +// Density/Bit Rate Index 3 2 1 0 +// CLOCK SEL A 1 0 1 0 +// CLOCK SEL B 1 1 0 0 +// 16MHz Division Factor 13 14 15 16 +// Encoder / Decoder Clock Freq (MHz) 1.2307 1.1428 1.0666 1.00 +// Sectors per Track 21 20 18 17 +// Track Numbers 1 - 17 18 - 24 25 - 30 31 - 42 +// Division Factor/16 0.8125 0.875 0.9375 1 +// Bit cell length in us (MAX) 3.25 3.5 3.75 4 +// (4xDivision Factor/16) +// +// +// Nothing in the hardware limits what timings are required for any section of the disk. Software is free to change the timing at any time for any section of the disk (even within the same track). +// +// The encoder/decoder itself is made up of a four bit counter (UE4) and a NOR gate (UE5A). +// The counter is configured to always count up, clocked by the encoder/decoder clock. +// Any flux reversal either true or induced by noise will reset the encoder/decoder's counter (UE4) back to zero and encoder/decoder clock's counter (UE7) back to its preload density values. +// The encoder/decoder counter has 4 outputs A, B, C and D. They represent the bit value of the UE4's current count where A is the least significant bit and D the most. +// The B output forms the serial data clock. +// The C and D are NORed together and the output forms the serial data. +// The serial data is fed into the Read Shift Register (UD2) where it is converted from serial to parallel and can be gated onto the VIA's portA via the read latch UC3. +// +// A bit cell is four encoder/decoder clock pulses wide, as the 2nd bit (output B) in UF4's count controls the serial clock. Based on the VIA's density preload values a cell is at a maximum 3.25-4us long (shorter if it contains a flux reversal). +// If a flux reversal occurs at the beginning of a cell, that cell is a 1 else that cell is a 0. +// If a flux reversal occurs, UF4's counter is cleared and the timing circuit is reset to start the encoder/decoder clock at the beginning of the VIA's current density setting. +// To phase lock onto data we must always begin with a 1 hence the need for a soft SYNC marker full of 1s. +// +// When B becomes high the NORed value of C and D (serial data) is sent to the shift register. +// If there is a flux reversal the counter resets. Two counts later a one is always shifted in. +// If after the first flux reversal there is an absence of others, UE4 continues to count up and each time B goes high (counts 6 10 & 14) only 0s will be shifted in (at the rate dictated by the encoder/decoders's clock and its density preload setting). +// If UE4's count is left to cycle (ie no flux reversals for 16 counts) a 1 will be shifted in regardless. +// This limits the hardware to only read three consecutive 0s between any two 1s. (with GCR this will never occur) +// +// The 1541 uses soft sectors. The hardware can only detect the sync sequence of then one bits in a row and everything must then be phase locked to that. +// The sync sequence phase locks to blocks. Blocks can really be any size, even the entire track. +// UC2 monitors the parallel output of UD2/UE4, when all 10 bits are 1, the output pin 9 goes low indicating a SYNC sequence has been read. +// Whenever the SYNC is asserted UE3 is reset and we are also phase locked to bytes. +// UE3 continues the phase lock to bytes as it is another counter responsible for counting 8 serial clocks. +// When 8 bits have been counted, UF3 pin 12 goes low, UC1 pin 10 goes high, and UF3 pin 8 goes low indicating a byte is ready to be read by the CPU. +// +// And as we have already seen the flux reversals phase lock to bits. +// +// So now the analogue signal can be phase locked onto and the data read/written in a bit stream, despite minor physical inconsistencies between disks and drives. + + +// The Encoder/Decoder Clock +// UE7 74LS193 Synchronous 4-Bit Up/Down Counter +// - clocks UF4 +// - counts up on pin 5 and this is connected to 16Mhz clock +// - never counts down as pin 4 is tied to VCC +// - inputs A and B are connected to VIA's PB5/6 CLOCK_SEL_AB input C and D to GND +// - pin 12 !CO (!carry out) is output to UE5C (NOR gate used as an inverter) and the inverted signal is called "Encoder/Decoder Clock" +// - carry out is the only output used. +// - pin 14 CLR is grounded so the count is never cleared this way +// - pin 11 LOAD is NORed (UE5D) with our inverted !CO (pin 12) and "Bit Sync" signal. "Bit Sync" is data from the read amplifier, differentiator, compatitor, time domain filter and pulse generator. +// - the counter resets to VIA's current PB5/6 CLOCK_SEL_AB +// +// The Encoder/Decoder +// UF4 74LS193 Synchronous 4-Bit Up/Down Counter (used to provide clocks for the UD2 serial to parallel shifter and the UE3 bit counter) +// - counts up on pin 5 and this is connected to the inverted UE7's carry out ie "Encoder/Decoder Clock" +// - never counts down as pin 4 is tied to VCC +// - pin 11 !LOAD is tied to VCC so the count will never be altered this way +// - pin 14 CLR receives data from the read amplifiers (ie "Bit Sync") +// - so a 1 will reset the count +// - outputs D and C are connected to a NOR gate UE5A +// - output A +// - output B ie every 2nd count +// drives UD2 shifter +// +// Byte Phase Lock +// UE3 74LS191 Presettable 4-Bit Up/Down Counter +// - pin 14 CLOCK clocked by +// - when UF4 counts 2, 6, 10 and 14 (2 is the only count that outputs a 1 into readShiftRegister) +// - Will count 8 bits everytime UF4 cycles twice +// - pins 4 (!ENABLE) and 5 (DOWN/UP) connected to GND +// - puts it in count up mode constantly +// - pin 7 (OUTPUT D) is NC +// - eventhough it can count to 16 the high bit is ignored and system treats it as a don't care state +// - low 3 bits only makes it a 3 bit counter that has 8 counts +// - pin 11 !LOAD +// - this is connected to the output of UC2 74ls133 a 13 input NAND gate +// - 2 inputs are connected to VCC +// - 8 inputs are connected to +// - 2 inputs are connected to +// - 1 input is coneeced to read/write signal +// - UC2 output can only asserted when reading +// - the output of UC2 is then called !BLOCK SYNC +// - pins 15, 1 and 10 inputs A,B and C are connected to GND. Pin 0 input D NC and as a don't care state +// - so, resets back to zero when !LOAD is asserted +// - ie when in SYNC will always reset until the first 0 bit +// - pins 3, 2 and 6 outputs A, B and C (pin 7 output D is NC) +// - NANDed together by UF3A and this is inverted by UC1E 74ls06 +// - this then forms part of UF3B's NAND inputs +// - along with UF4 output A and B +// - this will only activate when (ie UD3 Parallel to serial shift register will only latch when) +// - UE3 counts 7 AND UF4 counts 3, 7, 11, 15 (outputs A and B) +// - UF3B output goes to UD3 pin 1 LOAD(LATCH) +// - Also this then forms part of UF3C's NAND inputs +// - along with "Byte Sync Enable" (from the VIA) and +// - UC5B (NOR used to invert UF4's output B) output high when UF4 counts 0,1,4,5,8,9,12 and 13 +// - (IS THIS AN OVERSIGHT IN VICE? They don't emulate it and trigger BYTE SYNC when the serial clock is high?) +// - UF3C output is then called !BYTE SYNC +// +// Read Shift Register +// UD2 74LS164 8-Bit Serial-In Parallel-Out Shift Register +// - Clocking occurs on the LOW-to-HIGH level transition of the clock input and when so, the value at the inputs is entered +// - pin 8 CLOCK - shifts the data when UF4 Counter output B (rising edge) +// - ie when UF4 counts 2, 6, 10 and 14 (2 is the only count that outputs a 1 into readShiftRegister) +// - so will only shift in a 1 on UF4 counts 2 +// - on counts 6, 10 and 14 the UE5A NOR will output a 0 to pin 2 input B so no transition +// - pin 2 input B from UF4's NORed outputs C and D +// - pin 1 input A connected to VCC +// - so has no impact on the data shifted in via input B +// - On counts 2, 6, 10 and 14 of UF4 (2 is the only count that outputs a 1 into readShiftRegister) +// - will shift the data +// ie but ony a 1 will be shifed in on count 2 +// - outputs Q0-Q7 +// +// Sync Phase Lock +// UC2 74LS133 13 input Nand Gate +// UE4A/B 74LS74 Flop flops (These are used as an extention to UD2 shift register to increase the number of bits to 10) +// - UD2 feeds in UC2 with 8 lines +// - UE4A/B another 2 +// - R/!W another 1 +// - the other 2 inputs of UC2 are pulled high so SYNC is triggered only when reading and 10 consecutive 1 have been detected. +// +// Read Latch +// UC3 74LS245 Octal Bus Transceiver +// - Data read and shifted into UD2 is latched here. +// - Reading PortA of the VIA will read the values in this latch. +// - Hardware requires this latch to isolate the output of UD2 from VIA PortA when VIA PortA is set to output ie writing. +// (Note: the emulater does not need to emulate this component as its value will always reflected in the read shift register UD2) +// +// Write Shift Register +// UD3 74LS165 8-BIT Parallel to serial shift register +// - pin 2 CLOCK from UF4 Counter output B (rising edge) +// - ie when UF4 counts 2, 6, 10 and 14 (2 is the only count that outputs a 1 into readShiftRegister) +// - pin 1 LOAD form UF3B output +// - this will only activate when +// - UE3 counts 7 AND UF4 counts 3, 7, 11, 15 (outputs A and B) +// + +// For some insane reason some demo coders use the write protect sensor to detect disk swapping! It is such a lame way to do it. Just use the disk ID in the sector header that's what it is for! +// I don't think I have seen any games that do this only demos. And the most popular ones tend to do it. +// When you eject a disk the disk will start to move out of the drive. Its write protect notch will no longer line up with the write protect sensor and the VIA will signal that the write protection came on. +// When the disk becomes totally ejected there is now nothing blocking the write protect sensor and the VIA will signal that the write protection was turned off. +// Now when the next disk is inserted the top of the disk will obscure the write protect sensor's LED and again the VIA will signal that the write protection came on. +// When the newly inserted disk finally comes to rest its write protect notch will now line up over the write protect sensor and again the VIA will signal that the write protection was turned off. +// +// Because of a few demos using this ridiculous technique we need to emulate the changing write protect status using a timer. +// Using a real drive you can actually break some of these demos (during the disk swap) just by the manual way you eject the disks. +#define DISK_SWAP_CYCLES_DISK_EJECTING 400000 +#define DISK_SWAP_CYCLES_NO_DISK 200000 +#define DISK_SWAP_CYCLES_DISK_INSERTING 400000 + +Drive::Drive() : m_pVIA(0) +{ + Reset(); + srand(0x811c9dc5U); +} + +void Drive::Reset() +{ + headTrackPos = 34; // Start with the head over track 18 + CLOCK_SEL_AB = 3; // Track 18 will use speed zone 3 (encoder/decoder (ie UE7Counter) clocked at 1.2307Mhz) + UpdateHeadSectorPosition(); + lastHeadDirection = 0; + motor = false; + SO = false; + readShiftRegister = 0; + writeShiftRegister = 0; + UE3Counter = 0; + ResetEncoderDecoder(18.0f, 22.0f); + newDiskImageQueuedCylesRemaining = DISK_SWAP_CYCLES_DISK_EJECTING + DISK_SWAP_CYCLES_NO_DISK + DISK_SWAP_CYCLES_DISK_INSERTING; + m_pVIA->InputCA1(true); // Reset in read mode + m_pVIA->InputCB1(true); + m_pVIA->InputCA2(true); + m_pVIA->InputCB2(true); +} + +void Drive::Insert(DiskImage* diskImage) +{ + Eject(); + this->diskImage = diskImage; + newDiskImageQueuedCylesRemaining = DISK_SWAP_CYCLES_DISK_EJECTING + DISK_SWAP_CYCLES_NO_DISK + DISK_SWAP_CYCLES_DISK_INSERTING; +} + +void Drive::Eject() +{ + if (diskImage) diskImage = 0; +} + +void Drive::DumpTrack(unsigned track) +{ + if (diskImage) diskImage->DumpTrack(track); +} + +// Signals from the VIA. +void Drive::OnPortOut(void* pThis, unsigned char status) +{ + Drive* pDrive = (Drive*)pThis; + pDrive->motor = (status & 4) != 0; + pDrive->MoveHead(status & 3); + pDrive->CLOCK_SEL_AB = ((status >> 5) & 3); + pDrive->LED = (status & 8) != 0; +} + +u32 Drive::AdvanceSectorPositionR(int& byteOffset) +{ + ++headBitOffset %= bitsInTrack; + byteOffset = headBitOffset >> 3; + return (~headBitOffset) & 7; +} + +u32 Drive::AdvanceSectorPositionW(int& byteOffset) +{ + byteOffset = headBitOffset >> 3; + u32 bit = (~headBitOffset) & 7; + ++headBitOffset %= bitsInTrack; + return bit; +} + +bool Drive::GetNextBit() +{ + int byteOffset; + int bit = AdvanceSectorPositionR(byteOffset); + return diskImage->GetNextBit(headTrackPos, byteOffset, bit); +} + +void Drive::SetNextBit(bool value) +{ + int byteOffset; + int bit = AdvanceSectorPositionW(byteOffset); + diskImage->SetBit(headTrackPos, byteOffset, bit, value); +} + +bool Drive::Update() +{ + bool dataReady = false; + + // When swapping some lame loaders monitor the write protect flag. + // Bit 4 of PortB (WP - write protect) should be; + // X Write protect status of D1 + // 0 Write protected (D1 ejecting) + // 1 Not write protected (no disk) + // 0 Write protected (D2 inserting) + // X Write protect status of D2 + if (newDiskImageQueuedCylesRemaining > 0) + { + newDiskImageQueuedCylesRemaining--; + if (newDiskImageQueuedCylesRemaining == 0) m_pVIA->GetPortB()->SetInput(0x10, !diskImage->GetReadOnly()); // X Write protect status of D2 + else if (newDiskImageQueuedCylesRemaining > DISK_SWAP_CYCLES_NO_DISK + DISK_SWAP_CYCLES_DISK_INSERTING) m_pVIA->GetPortB()->SetInput(0x10, false); // 0 Write protected (D1 ejecting) + else if (newDiskImageQueuedCylesRemaining > DISK_SWAP_CYCLES_DISK_INSERTING) m_pVIA->GetPortB()->SetInput(0x10, true); // 1 Not write protected (no disk) + else m_pVIA->GetPortB()->SetInput(0x10, false); // 0 Write protected (D2 inserting) + } + else if (diskImage && motor) + { + bool writing = (m_pVIA->GetFCR() & m6522::FCR_CB2_OUTPUT_MODE0) == 0; + + if (SO) + { + dataReady = true; + SO = false; + } + // UE6 provides the CPU's clock by dividing the 16Mhz clock by 16. + // UE7 (a 74ls193 4bit counter) counts up on the falling edge of the 16Mhz clock. UE7 drives the Encoder/Decoder clock. + // So we need to simulate 16 cycles for every 1 CPU cycle + for (int cycles = 0; cycles < 16; ++cycles) + { + if (!writing) + { + if (++cyclesForBit >= cyclesPerBit) + { + cyclesForBit -= cyclesPerBit; + // Any 1 bit coming from the disk will come in the form of a flux reversal. (Non return to zero inverted emulation.) + if (GetNextBit()) + { + // We have a genuine flux reversal. + // Pin 12 of UE5D is the BIT SYNC Input. When a positive pulse is applied to pin 12, the output of UE5D(pin 13) is applied to the load line (of UE7), + // causing the encoder/decoder clock to terminate the current cycle early and begin a new one. + ResetEncoderDecoder(18.0f, 20.0f); // Start seeing random flux reversals 18us-20us from now (ie since the last real flux reversal). + } + } + // The video amplifiers will often oscillate with no data in, but these oscillations are high enough in frequency that they "seldom" get past the valid pulse detector. + // Some do and some copy protections rely on this random behaviour so we need to emultate it. + // For example, 720 will read a byte from the disk multiple times and check that the values read each time were infact different. It does not matter what the values are just that they are different. + randomFluxReversalTime -= 0.0625f; // One 16th of a micro second. + if (randomFluxReversalTime <= 0) ResetEncoderDecoder(2.0f, 25.0f); // Trigger a random noise generated zero crossing and start seeing more anywhere between 2us and 25us after this one. + } + if (++UE7Counter == 0x10) // The count carry (bit 4) clocks UF4. + { + UE7Counter = CLOCK_SEL_AB; // A and B inputs of UE7 come from the VIA's CLOCK SEL A/B outputs (ie PB5/6) ie preload the encoder/decoder clock for the current density settings. + // The decoder consists of UF4 and UE5A. The ecoder has two outputs, Pin 1 of UE5A is the serial data output and pin 2 of UF4 (output B) is the serial clock output. + ++UF4Counter &= 0xf; // Clock and clamp UF4. + // The UD2 read shift register is clocked by serial clock (the rising edge of encoder/decoder's UF4 B output (serial clock)) + // - ie on counts 2, 6, 10 and 14 (2 is the only count that outputs a 1 into readShiftRegister as the MSB bits of the count NORed together for other values are 0) + if ((UF4Counter & 0x3) == 2) + { + // A bit cell is four encoder/decoder clock pulses wide, as the 2nd bit of UF4 controls the serial clock (and takes 4 cycles to loop a two bit counter). + // If a flux reversal (or pulse into the decoder) occurs at the beginning of a cell, that cell is a 1 else that cell is a 0. + // If a flux reversal occurs, UF4's counter is cleared and the timing circuit is reset to start the encoder/decoder clock at the beginning of the VIA's current density setting. + // Pins 6 (output C) and 7 (output D) of UF4 are low, causing the output of UE5A, the serial data line, to go high. + // 2 encoder/decoder clock pulses later, the serial clock(pin 2 of UF4) goes high. When the serial clock line is high, the serial data line is valid and the shift register will shift in the data. + // The serial clock line remains high for another clock cycle. + // After four encoder/decoder clocks a bit cell is now complete. + // At this time, pins 2 (output A) and 3 (output B) of UF4 will again be low but as the count is counting up pin 6 (output C) will now be high. + // The high on pin 6 (output C) of UF4 causes the serial data line (pin 1 of UE5A) to go low as this is NORed with the low on pin 7 (output D). + // If a flux reversal occurs at the beginning of the next cell then everything resets and again we see a 1 on the serial data line 2 encoder/decoder cycles into that cell. + // If no flux reversal occurs at the beginning of the next cell, the serial data line will remain low when the serial clock line goes high again (two encoder/decoder clock cycles into the new cell). + // If there are no flux reversals for 2 cells then we see 0 on pin 6 (output C) and 1 on pin 7 (output D) of UF4 and this causes the serial data line (pin 1 of UE5A) to remain at 0. + // If there are no flux reversals for 3 cells then we see 1 on pin 6 (output C) and 1 on pin 7 (output D) of UF4 and this causes the serial data line (pin 1 of UE5A) to also remain at 0, after all, UE5A is a NOR gate. + // After 4 cells the counter inside UF4 loops back to 0 and we again see 0 on pin 6 (output C) and 0 on pin 7 (output C), causing the output of UE5A, the serial data line, to go to a 1, regardless of a true flux reversal! + readShiftRegister <<= 1; + readShiftRegister |= (UF4Counter == 2); // Emulate UE5A and only shift in a 1 when pins 6 (output C) and 7 (output D) (bits 2 and 3 of UF4Counter are 0. ie the first count of the bit cell) + if (writing) SetNextBit((writeShiftRegister & 0x80)); + writeShiftRegister <<= 1; + // Note: SYNC can only trigger during reading as R/!W line is one of UC2's inputs. + if (!writing && ((readShiftRegister & 0x3ff) == 0x3ff)) // if the last 10 bits are 1s then SYNC + { + UE3Counter = 0; // Phase lock on to byte boundary + m_pVIA->GetPortB()->SetInput(0x80, false); // PB7 active low SYNC + } + else + { + if (!writing) m_pVIA->GetPortB()->SetInput(0x80, true); // SYNC not asserted if not following the SYNC bits + UE3Counter++; + } + } + // UC5B (NOR used to invert UF4's output B serial clock) output high when UF4 counts 0,1,4,5,8,9,12 and 13 + else if (((UF4Counter & 2) == 0) && (UE3Counter == 8)) // Phase locked on to byte boundary + { + UE3Counter = 0; + SO = (m_pVIA->GetFCR() & m6522::FCR_CA2_OUTPUT_MODE0) != 0; // bit 2 of the FCR indicates "Byte Ready Active" turned on or not. + if (writing) + { + writeShiftRegister = m_pVIA->GetPortA()->GetOutput(); + } + else + { + writeShiftRegister = (u8)(readShiftRegister & 0xff); + m_pVIA->GetPortA()->SetInput(writeShiftRegister); + } + } + } + } + } + m_pVIA->InputCA1(!SO); + return dataReady; +} diff --git a/Drive.h b/Drive.h new file mode 100644 index 0000000..db28eaf --- /dev/null +++ b/Drive.h @@ -0,0 +1,128 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef DRIVE_H +#define DRIVE_H + +#include "m6522.h" +#include "DiskImage.h" +#include + +class Drive +{ +public: + Drive(); + + void SetVIA(m6522* pVIA) + { + m_pVIA = pVIA; + pVIA->GetPortB()->SetPortOut(this, OnPortOut); + } + + static void OnPortOut(void*, unsigned char status); + + bool Update(); + void Insert(DiskImage* diskImage); + inline const DiskImage* GetDiskImage() const { return diskImage; } + void Eject(); + void Reset(); + inline unsigned Track() const { return headTrackPos; } + inline unsigned SectorPos() const { return headBitOffset >> 3; } + inline unsigned GetHeadBitOffset() const { return headBitOffset; } + inline bool IsMotorOn() const { return motor; } + inline bool IsLEDOn() const { return LED; } + + inline unsigned char GetLastHeadDirection() const { return lastHeadDirection; } // For simulated head movement sounds +private: + inline float GenerateRandomFluxReversalTime(float min, float max) { return ((max - min) * ((float)rand() / RAND_MAX)) + min; } // Inputs in micro seconds + + inline void ResetEncoderDecoder(float min, float max) + { + UE7Counter = CLOCK_SEL_AB; // A and B inputs of UE7 come from the VIA's CLOCK SEL A/B outputs (ie PB5/6) + UF4Counter = 0; + randomFluxReversalTime = GenerateRandomFluxReversalTime(min, max); + } + inline void UpdateHeadSectorPosition() + { + // Disk spins at 300rpm = 5rps so to calculate how many 16Mhz cycles one rotation takes;- + // 16000000 / 5 = 3200000; + static const float CYCLES_16Mhz_PER_ROTATION = 3200000.0f; + + bitsInTrack = diskImage->BitsInTrack(headTrackPos); + headBitOffset %= bitsInTrack; + cyclesPerBit = CYCLES_16Mhz_PER_ROTATION / (float)bitsInTrack; + } + + inline void MoveHead(unsigned char headDirection) + { + if (lastHeadDirection != headDirection) + { + if (((lastHeadDirection - 1) & 3) == headDirection) + { + if (headTrackPos > 0) headTrackPos--; + // else head bang + } + else if (((lastHeadDirection + 1) & 3) == headDirection) + { + if (headTrackPos < HALF_TRACK_COUNT - 1) headTrackPos++; + } + lastHeadDirection = headDirection; + UpdateHeadSectorPosition(); + } + } + + void DumpTrack(unsigned track); // Used for debugging disk images. + + u32 AdvanceSectorPositionR(int& byte_offset); // No reason why I seperate these into individual read and write versions. I was just trying to get the bit stream to line up when rewriting over existing data. + u32 AdvanceSectorPositionW(int& byte_offset); + bool GetNextBit(); + void SetNextBit(bool value); + + DiskImage* diskImage; + // When swapping disks some code waits for the write protect signal to go high which will happen if a human ejects a disk. + // Emulate this by asserting the write protect signal for a few cycles before inserting the new disk image. + u32 newDiskImageQueuedCylesRemaining; + + // CA1 (input) + // - !BYTE SYNC + // CA2 (output) + // - BYTE SYNC enable + // CB1 (NC) + // - check pulled H/L + // CB2 (output) + // - R/!W + m6522* m_pVIA; + + float cyclesForBit; + u32 readShiftRegister; + unsigned headTrackPos; + u32 headBitOffset; + float randomFluxReversalTime; + int UE7Counter; + int UF4Counter; + int UE3Counter; + int CLOCK_SEL_AB; + bool SO; + unsigned char lastHeadDirection; + u32 bitsInTrack; + float cyclesPerBit; + bool motor; + bool LED; + u8 writeShiftRegister; +}; +#endif diff --git a/FileBrowser.cpp b/FileBrowser.cpp new file mode 100644 index 0000000..740bc78 --- /dev/null +++ b/FileBrowser.cpp @@ -0,0 +1,932 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#include "FileBrowser.h" +#include +#include +#include +#include +#include "Screen.h" +#include "debug.h" +#include "Keyboard.h" +#include "options.h" +#include "InputMappings.h" +#include "stb_image.h" +#include "Petscii.h" +extern "C" +{ +#include "rpi-gpio.h" +} + +extern Screen screen; + +#define PNG_WIDTH 320 +#define PNG_HEIGHT 200 + + +unsigned char FileBrowser::LSTBuffer[FileBrowser::LSTBuffer_size]; + +const unsigned FileBrowser::SwapKeys[30] = +{ + KEY_F1, KEY_KP1, KEY_1, + KEY_F2, KEY_KP2, KEY_2, + KEY_F3, KEY_KP3, KEY_3, + KEY_F4, KEY_KP4, KEY_4, + KEY_F5, KEY_KP5, KEY_5, + KEY_F6, KEY_KP6, KEY_6, + KEY_F7, KEY_KP7, KEY_7, + KEY_F8, KEY_KP8, KEY_8, + KEY_F9, KEY_KP9, KEY_9, + KEY_F10, KEY_KP0, KEY_0 +}; + +static const u32 palette[] = +{ + RGBA(0x00, 0x00, 0x00, 0xFF), + RGBA(0xFF, 0xFF, 0xFF, 0xFF), + RGBA(0x88, 0x39, 0x32, 0xFF), + RGBA(0x67, 0xB6, 0xBD, 0xFF), + RGBA(0x8B, 0x4F, 0x96, 0xFF), + RGBA(0x55, 0xA0, 0x49, 0xFF), + RGBA(0x40, 0x31, 0x8D, 0xFF), + RGBA(0xBF, 0xCE, 0x72, 0xFF), + RGBA(0x8B, 0x54, 0x29, 0xFF), + RGBA(0x57, 0x42, 0x00, 0xFF), + RGBA(0xB8, 0x69, 0x62, 0xFF), + RGBA(0x50, 0x50, 0x50, 0xFF), + RGBA(0x78, 0x78, 0x78, 0xFF), + RGBA(0x94, 0xE0, 0x89, 0xFF), + RGBA(0x78, 0x69, 0xC4, 0xFF), + RGBA(0x9F, 0x9F, 0x9F, 0xFF) +}; + +FileBrowser::BrowsableList::Entry* FileBrowser::BrowsableList::FindEntry(const char* name) +{ + int index; + int len = (int)entries.size(); + + for (index = 0; index < len; ++index) + { + Entry* entry = &entries[index]; + if (!(entry->filImage.fattrib & AM_DIR) && strcasecmp(name, entry->filImage.fname) == 0) + return entry; + } + return 0; +} + +FileBrowser::FileBrowser(DiskCaddy* diskCaddy, ROMs* roms, unsigned deviceID, bool displayPNGIcons) + : state(State_Folders) + , maxOnScreen(38) + , diskCaddy(diskCaddy) + , selectionsMade(false) + , roms(roms) + , deviceID(deviceID) + , displayPNGIcons(displayPNGIcons) +{ +} + +u32 FileBrowser::Colour(int index) +{ + return palette[index & 0xf]; +} + +struct greater +{ + bool operator()(const FileBrowser::BrowsableList::Entry& lhs, const FileBrowser::BrowsableList::Entry& rhs) const + { + if (strcasecmp(lhs.filImage.fname, "..") == 0) + return true; + else if (strcasecmp(rhs.filImage.fname, "..") == 0) + return false; + else if (((lhs.filImage.fattrib & AM_DIR) && (rhs.filImage.fattrib & AM_DIR)) || (!(lhs.filImage.fattrib & AM_DIR) && !(rhs.filImage.fattrib & AM_DIR))) + return strcasecmp(lhs.filImage.fname, rhs.filImage.fname) < 0; + else if ((lhs.filImage.fattrib & AM_DIR) && !(rhs.filImage.fattrib & AM_DIR)) + return true; + else + return false; + } +}; + +void FileBrowser::RefreshFolderEntries() +{ + DIR dir; + FileBrowser::BrowsableList::Entry entry; + FRESULT res; + char* ext; + + folder.Clear(); + res = f_opendir(&dir, "."); + if (res == FR_OK) + { + do + { + res = f_readdir(&dir, &entry.filImage); + ext = strrchr(entry.filImage.fname, '.'); + if (res == FR_OK && entry.filImage.fname[0] != 0 && !(ext && strcasecmp(ext, ".png") == 0)) + folder.entries.push_back(entry); + } + while (res == FR_OK && entry.filImage.fname[0] != 0); + f_closedir(&dir); + + // Now check for icons + res = f_opendir(&dir, "."); + if (res == FR_OK) + { + do + { + res = f_readdir(&dir, &entry.filIcon); + ext = strrchr(entry.filIcon.fname, '.'); + if (ext) + { + int length = ext - entry.filIcon.fname; + if (res == FR_OK && entry.filIcon.fname[0] != 0 && strcasecmp(ext, ".png") == 0) + { + for (unsigned index = 0; index < folder.entries.size(); ++index) + { + FileBrowser::BrowsableList::Entry* entryAtIndex = &folder.entries[index]; + if (strncasecmp(entry.filIcon.fname, entryAtIndex->filImage.fname, length) == 0) + entryAtIndex->filIcon = entry.filIcon; + } + } + } + } + while (res == FR_OK && entry.filIcon.fname[0] != 0); + } + f_closedir(&dir); + + strcpy(entry.filImage.fname, ".."); + entry.filIcon.fname[0] = 0; + folder.entries.push_back(entry); + + std::sort(folder.entries.begin(), folder.entries.end(), greater()); + + if (folder.entries.size() > 0) folder.current = &folder.entries[0]; + else folder.current = 0; + + folder.currentIndex = 0; + } + else + { + //DEBUG_LOG("Cannot open dir"); + } + + // incase they deleted something selected in the caddy + caddySelections.Clear(); +} + +void FileBrowser::FolderChanged() +{ + RefreshFolderEntries(); + RefeshDisplay(); +} + +void FileBrowser::DisplayRoot() +{ + f_chdir("\\1541"); + FolderChanged(); +} + +void FileBrowser::RefeshDisplayForBrowsableList(FileBrowser::BrowsableList* browsableList, int xOffset, bool showSelected) +{ + char buffer1[128] = { 0 }; + char buffer2[128] = { 0 }; + u32 index; + u32 entryIndex; + u32 x = xOffset; + u32 y = 17; + u32 colour; + bool terminal = false; + RGBA BkColour = RGBA(0, 0, 0, 0xFF); //palette[VIC2_COLOUR_INDEX_BLUE]; + + if (terminal) + printf("\E[2J\E[f"); + + for (index = 0; index < maxOnScreen; ++index) + { + entryIndex = browsableList->offset + index; + + if (entryIndex < browsableList->entries.size()) + { + FileBrowser::BrowsableList::Entry* entry = &browsableList->entries[entryIndex]; + snprintf(buffer2, 81, "%s", entry->filImage.fname); + memset(buffer1, ' ', 80); + buffer1[127] = 0; + strncpy(buffer1, buffer2, strlen(buffer2)); + if (showSelected && browsableList->currentIndex == entryIndex) + { + if (entry->filImage.fattrib & AM_DIR) + { + if (terminal) + printf("\E[34;47m%s\E[0m\r\n", buffer1); + screen.PrintText(false, x, y, buffer1, palette[VIC2_COLOUR_INDEX_LBLUE], RGBA(0xff, 0xff, 0xff, 0xff)); + } + else + { + colour = RGBA(0xff, 0, 0, 0xff); + if (entry->filImage.fattrib & AM_RDO) + colour = palette[VIC2_COLOUR_INDEX_RED]; + + screen.PrintText(false, x, y, buffer1, colour, RGBA(0xff, 0xff, 0xff, 0xff)); + if (terminal) + printf("\E[31;47m%s\E[0m\r\n", buffer1); + } + } + else + { + if (entry->filImage.fattrib & AM_DIR) + { + screen.PrintText(false, x, y, buffer1, palette[VIC2_COLOUR_INDEX_LBLUE], BkColour); + if (terminal) + printf("\E[34m%s\E[0m\r\n", buffer1); + } + else + { + colour = palette[VIC2_COLOUR_INDEX_LGREY]; + if (entry->filImage.fattrib & AM_RDO) + colour = palette[VIC2_COLOUR_INDEX_PINK]; + screen.PrintText(false, x, y, buffer1, colour, BkColour); + if (terminal) + printf("\E[0;m%s\E[0m\r\n", buffer1); + } + } + } + else + { + memset(buffer1, ' ', 80); + screen.PrintText(false, x, y, buffer1, BkColour, BkColour); + if (terminal) + printf("%s\r\n", buffer1); + } + y += 16; + } +} + +void FileBrowser::RefeshDisplay() +{ + char buffer[1024]; + if (f_getcwd(buffer, 1024) == FR_OK) + { + u32 textColour = Colour(VIC2_COLOUR_INDEX_LGREEN); + u32 bgColour = Colour(VIC2_COLOUR_INDEX_GREY); + + screen.ClearArea(0, 0, (int)screen.Width(), 17, bgColour); + screen.PrintText(false, 0, 0, buffer, textColour, bgColour); + } + + RefeshDisplayForBrowsableList(&folder, 0); + RefeshDisplayForBrowsableList(&caddySelections, 1024 - 320, false); + + DisplayPNG(); + DisplayStatusBar(); +} + +bool FileBrowser::CheckForPNG(const char* filename, FILINFO& filIcon) +{ + bool foundValid = false; + + filIcon.fname[0] = 0; + + if (DiskImage::IsDiskImageExtention(filename)) + { + char fileName[256]; + char* ptr = strrchr(filename, '.'); + if (ptr) + { + int len = ptr - filename; + strncpy(fileName, filename, len); + fileName[len] = 0; + + strcat(fileName, ".png"); + + if (f_stat(fileName, &filIcon) == FR_OK && filIcon.fsize < FILEBROWSER_MAX_PNG_SIZE) + foundValid = true; + } + } + return foundValid; +} + +void FileBrowser::DisplayPNG(FILINFO& filIcon, int x, int y) +{ + if (filIcon.fname[0] != 0 && filIcon.fsize < FILEBROWSER_MAX_PNG_SIZE) + { + FIL fp; + FRESULT res; + + res = f_open(&fp, filIcon.fname, FA_READ); + if (res == FR_OK) + { + u32 bytesRead; + SetACTLed(true); + f_read(&fp, PNG, FILEBROWSER_MAX_PNG_SIZE, &bytesRead); + SetACTLed(false); + f_close(&fp); + + int w; + int h; + int channels_in_file; + stbi_uc* image = stbi_load_from_memory((stbi_uc const*)PNG, bytesRead, &w, &h, &channels_in_file, 4); + if (image && (w == PNG_WIDTH && h == PNG_HEIGHT)) + { + //DEBUG_LOG("Opened PNG %s w = %d h = %d cif = %d\r\n", fileName, w, h, channels_in_file); + screen.PlotImage((u32*)image, x, y, w, h); + } + else + { + //DEBUG_LOG("Invalid PNG size %d x %d\r\n", w, h); + } + } + } + else + { + //DEBUG_LOG("Cannot find PNG %s\r\n", fileName); + } +} + +void FileBrowser::DisplayPNG() +{ + if (displayPNGIcons && folder.current) + { + FileBrowser::BrowsableList::Entry* current = folder.current; + DisplayPNG(current->filIcon, 1024 - 320, 426); + } +} + +void FileBrowser::PopFolder() +{ + f_chdir(".."); + //{ + // char buffer[1024]; + // if (f_getcwd(buffer, 1024) == FR_OK) + // { + // DEBUG_LOG("CWD = %s\r\n", buffer); + // } + //} + RefreshFolderEntries(); + caddySelections.Clear(); + RefeshDisplay(); +} + +void FileBrowser::UpdateInput() +{ + InputMappings* inputMappings = InputMappings::Instance(); + Keyboard* keyboard = Keyboard::Instance(); + bool dirty = false; + + if (keyboard->CheckChanged()) + dirty = inputMappings->CheckKeyboardBrowseMode(); + else + dirty = inputMappings->CheckButtonsBrowseMode(); + + if (dirty) + { + //if (state == State_Folders) + UpdateInputFolders(); + //else + // UpdateInputDiskCaddy(); + } +} + +FileBrowser::Folder* FileBrowser::GetCurrentFolder() +{ + return &folder; +} + +bool FileBrowser::FillCaddyWithSelections() +{ + if (caddySelections.entries.size()) + { + for (auto it = caddySelections.entries.begin(); it != caddySelections.entries.end();) + { + bool readOnly = ((*it).filImage.fattrib & AM_RDO) != 0; + if (diskCaddy->Insert(&(*it).filImage, readOnly) == false) + caddySelections.entries.erase(it); + else + it++; + } + + return true; + } + return false; +} + +bool FileBrowser::AddToCaddy(FileBrowser::BrowsableList::Entry* current) +{ + bool added = false; + + if (current && !(current->filImage.fattrib & AM_DIR) && DiskImage::IsDiskImageExtention(current->filImage.fname)) + { + bool canAdd = true; + unsigned i; + for (i = 0; i < caddySelections.entries.size(); ++i) + { + if (strcmp(current->filImage.fname, caddySelections.entries[i].filImage.fname) == 0) + { + canAdd = false; + break; + } + } + if (canAdd) + { + caddySelections.entries.push_back(*current); + added = true; + } + } + return added; +} + +void FileBrowser::UpdateInputFolders() +{ + Keyboard* keyboard = Keyboard::Instance(); + InputMappings* inputMappings = InputMappings::Instance(); + + if (folder.entries.size() > 0) + { + u32 numberOfEntriesMinus1 = folder.entries.size() - 1; + bool dirty = false; + + if (inputMappings->BrowseSelect()) + { + FileBrowser::BrowsableList::Entry* current = folder.current; + if (current) + { + if (current->filImage.fattrib & AM_DIR) + { + if (strcmp(current->filImage.fname, "..") == 0) + { + PopFolder(); + } + else if (strcmp(current->filImage.fname, ".") != 0) + { + f_chdir(current->filImage.fname); + RefreshFolderEntries(); + } + dirty = true; + } + else + { + if (strcmp(current->filImage.fname, "..") == 0) + { + PopFolder(); + } + else if (DiskImage::IsDiskImageExtention(current->filImage.fname)) + { + DiskImage::DiskType diskType = DiskImage::GetDiskImageTypeViaExtention(current->filImage.fname); + + // Should also be able to create a LST file from all the images currently selected in the caddy + if (diskType == DiskImage::LST) + { + selectionsMade = SelectLST(current->filImage.fname); + } + else + { + // Add the current selected + AddToCaddy(current); + selectionsMade = FillCaddyWithSelections(); + } + + if (selectionsMade) + lastSelectionName = current->filImage.fname; + + dirty = true; + } + } + } + } + else if (inputMappings->BrowseDone()) + { + selectionsMade = FillCaddyWithSelections(); + } + //else if (keyboard->KeyPressed(KEY_TAB)) + //{ + // state = State_DiskCaddy; + // dirty = true; + //} + else if (inputMappings->BrowseBack()) + { + PopFolder(); + dirty = true; + } + else if (inputMappings->Exit()) + { + caddySelections.Clear(); + dirty = true; + } + else if (inputMappings->BrowseInsert()) + { + FileBrowser::BrowsableList::Entry* current = folder.current; + if (current) + { + dirty = AddToCaddy(current); + } + } + else + { + unsigned keySetIndex; + for (keySetIndex = 0; keySetIndex < ROMs::MAX_ROMS; ++keySetIndex) + { + unsigned keySetIndexBase = keySetIndex * 3; + if (keyboard->KeyPressed(FileBrowser::SwapKeys[keySetIndexBase]) || keyboard->KeyPressed(FileBrowser::SwapKeys[keySetIndexBase + 1]) || keyboard->KeyPressed(FileBrowser::SwapKeys[keySetIndexBase + 2])) + { + if (roms->ROMValid[keySetIndex]) + { + roms->currentROMIndex = keySetIndex; + roms->lastManualSelectedROMIndex = keySetIndex; + DEBUG_LOG("Swap ROM %d %s\r\n", keySetIndex, roms->ROMNames[keySetIndex]); + ShowDeviceAndROM(); + } + } + } + + if (inputMappings->BrowseDown()) + { + if (folder.currentIndex < numberOfEntriesMinus1) + { + folder.currentIndex++; + folder.current = &folder.entries[folder.currentIndex]; + if (folder.currentIndex >= (folder.offset + maxOnScreen) && (folder.currentIndex < folder.entries.size())) + folder.offset++; + dirty = true; + } + } + if (inputMappings->BrowseUp()) + { + if (folder.currentIndex > 0) + { + folder.currentIndex--; + folder.current = &folder.entries[folder.currentIndex]; + if ((folder.offset > 0) && (folder.currentIndex < folder.offset)) + folder.offset--; + dirty = true; + } + } + if (inputMappings->BrowsePageDown()) + { + u32 maxOnScreenMinus1 = maxOnScreen - 1; + + if (folder.currentIndex == folder.offset + maxOnScreenMinus1) + { + // Need to move the screen window down so that the currentIndex is now at the top of the screen + folder.offset = folder.currentIndex; + + // Current index now becomes the bottom one + if (folder.offset + maxOnScreenMinus1 > numberOfEntriesMinus1) + folder.currentIndex = numberOfEntriesMinus1; // Not enough entries to move another page just move to the last entry + else // Move the window down a page + folder.currentIndex = folder.offset + maxOnScreenMinus1; + } + else + { + // Need to move to folder.offset + maxOnScreenMinus1 + if (folder.offset + maxOnScreenMinus1 > numberOfEntriesMinus1) + folder.currentIndex = numberOfEntriesMinus1; // Run out of entries before we hit the bottom. Just move to the bottom. + else + folder.currentIndex = folder.offset + maxOnScreenMinus1; // Move the bottom of the screen + } + folder.current = &folder.entries[folder.currentIndex]; + dirty = true; + } + if (inputMappings->BrowsePageUp()) + { + if (folder.currentIndex == folder.offset) + { + // If the cursor is already at the top of the window then page up + int offset = (int)folder.currentIndex - (int)maxOnScreen; + if (offset < 0) folder.offset = 0; + else folder.offset = (u32)offset; + folder.currentIndex = folder.offset; + } + else + { + folder.currentIndex = folder.offset; // Move the cursor to the top of the window + } + folder.current = &folder.entries[folder.currentIndex]; + dirty = true; + } + } + + if (dirty) RefeshDisplay(); + } + else + { + if (inputMappings->BrowseBack()) + PopFolder(); + } +} + +bool FileBrowser::SelectLST(const char* filenameLST) +{ + bool validImage = false; + //DEBUG_LOG("Selected %s\r\n", filenameLST); + if (DiskImage::IsLSTExtention(filenameLST)) + { + FileBrowser::Folder* currentFolder = GetCurrentFolder(); + if (currentFolder) + { + DiskImage::DiskType diskType; + FIL fp; + FRESULT res; + res = f_open(&fp, filenameLST, FA_READ); + if (res == FR_OK) + { + u32 bytesRead; + SetACTLed(true); + f_read(&fp, FileBrowser::LSTBuffer, FileBrowser::LSTBuffer_size, &bytesRead); + SetACTLed(false); + f_close(&fp); + + TextParser textParser; + + textParser.SetData((char*)FileBrowser::LSTBuffer); + char* token = textParser.GetToken(true); + while (token) + { + //DEBUG_LOG("LST token = %s\r\n", token); + diskType = DiskImage::GetDiskImageTypeViaExtention(token); + if (diskType == DiskImage::D64 || diskType == DiskImage::G64 || diskType == DiskImage::NIB || diskType == DiskImage::NBZ) + { + FileBrowser::BrowsableList::Entry* entry = currentFolder->FindEntry(token); + if (entry && !(entry->filImage.fattrib & AM_DIR)) + { + bool readOnly = (entry->filImage.fattrib & AM_RDO) != 0; + if (diskCaddy->Insert(&entry->filImage, readOnly)) + validImage = true; + } + } + else + { + roms->SelectROM(token); + } + token = textParser.GetToken(true); + } + } + } + } + return validImage; +} + +// Not used +void FileBrowser::UpdateInputDiskCaddy() +{ + bool dirty = false; + Keyboard* keyboard = Keyboard::Instance(); + + if (keyboard->KeyPressed(KEY_DELETE)) + { + } + else if (keyboard->KeyPressed(KEY_TAB)) + { + state = State_Folders; + dirty = true; + } + else + { + if (keyboard->KeyHeld(KEY_DOWN)) + { + } + if (keyboard->KeyHeld(KEY_UP)) + { + } + } + + if (dirty) RefeshDisplay(); +} + +void FileBrowser::DisplayStatusBar() +{ + u32 x = 0; + u32 y = STATUS_BAR_POSITION_Y; + + char bufferOut[128]; + snprintf(bufferOut, 256, "LED 0 Motor 0 Track 00.0 ATN 0 DAT 0 CLK 0"); + screen.PrintText(false, x, y, bufferOut, RGBA(0, 0, 0, 0xff), RGBA(0xff, 0xff, 0xff, 0xff)); +} + +void FileBrowser::ClearScreen() +{ + u32 bgColour = palette[VIC2_COLOUR_INDEX_BLUE]; + screen.Clear(bgColour); +} + +void FileBrowser::ShowDeviceAndROM() +{ + char buffer[256]; + u32 textColour = RGBA(0, 0, 0, 0xff); + u32 bgColour = RGBA(0xff, 0xff, 0xff, 0xff); + u32 y = STATUS_BAR_POSITION_Y; + + snprintf(buffer, 256, "Device %d %s \r\n", deviceID, roms->ROMNames[roms->currentROMIndex]); + screen.PrintText(false, 43 * 8, y, buffer, textColour, bgColour); +} + +void FileBrowser::DisplayDiskInfo(DiskImage* diskImage, const char* filenameForIcon) +{ + // Ideally we should not have to load the entire disk to read the directory. + static const char* fileTypes[]= + { + "DEL", "SEQ", "PRG", "USR", "REL", "UKN", "UKN", "UKN" + }; + // Decode the BAM + unsigned track = 18; + unsigned sectorNo = 0; + char name[17] = { 0 }; + unsigned char buffer[260] = { 0 }; + int charIndex; + + u32 x = 0; + u32 y = 0; + char bufferOut[128] = { 0 }; + u32 textColour = palette[VIC2_COLOUR_INDEX_LBLUE]; + u32 bgColour = palette[VIC2_COLOUR_INDEX_BLUE]; + + u32 usedColour = palette[VIC2_COLOUR_INDEX_RED]; + u32 freeColour = palette[VIC2_COLOUR_INDEX_LGREEN]; + + ClearScreen(); + + if (diskImage->GetDecodedSector(track, sectorNo, buffer)) + { + track = buffer[0]; + sectorNo = buffer[1]; + + //144-161 ($90-Al) Name of the disk (padded with "shift space") + //162,163 ($A2,$A3) Disk ID marker + //164 ($A4) $A0 Shift Space + //165,166 ($A5,$A6) $32,$41 ASCII chars "2A" DOS indicator + //167-170 ($A7-$AA) $A0 Shift Space + //171-255 ($AB-$FF) $00 Not used, filled with zero (The bytes 180 to 191 can have the contents "blocks free" on many disks.) + + strncpy(name, (char*)&buffer[144], 16); + + int blocksFree = 0; + int bamTrack; + int lastTrackUsed = (int)diskImage->LastTrackUsed() >> 1; + for (bamTrack = 0; bamTrack < 35; ++bamTrack) + { + if ((bamTrack + 1) != 18) + blocksFree += buffer[BAM_OFFSET + bamTrack * BAM_ENTRY_SIZE]; + + x = 400; + for (int bit = 0; bit < DiskImage::SectorsPerTrack[bamTrack]; bit++) + { + u32 bits = buffer[BAM_OFFSET + 1 + (bit >> 3) + bamTrack * BAM_ENTRY_SIZE]; + bool used = (bits & (1 << (bit & 0x7))) == 0; + + if (!used) + { + snprintf(bufferOut, 128, "%c", screen2petscii(87)); + screen.PrintText(true, x, y, bufferOut, usedColour, bgColour); + } + else + { + snprintf(bufferOut, 128, "%c", screen2petscii(81)); + screen.PrintText(true, x, y, bufferOut, freeColour, bgColour); + } + x += 8; + bits <<= 1; + } + y += 8; + } + for (; bamTrack < lastTrackUsed; ++bamTrack) + { + x = 400; + for (int bit = 0; bit < DiskImage::SectorsPerTrack[bamTrack]; bit++) + { + snprintf(bufferOut, 128, "%c", screen2petscii(87)); + screen.PrintText(true, x, y, bufferOut, usedColour, bgColour); + x += 8; + } + y += 8; + } + x = 0; + y = 0; + snprintf(bufferOut, 128, "0"); + screen.PrintText(true, x, y, bufferOut, textColour, bgColour); + x = 16; + snprintf(bufferOut, 128, "\"%s\" %c%c%c%c%c%c", name, buffer[162], buffer[163], buffer[164], buffer[165], buffer[166], buffer[167]); + screen.PrintText(true, x, y, bufferOut, bgColour, textColour); + x = 0; + y += 8; + + if (track != 0) + { + bool complete = false; + // Blocks 1 through 19 on track 18 contain the file entries. The first two bytes of a block point to the next directory block with file entries. If no more directory blocks follow, these bytes contain $00 and $FF, respectively. + while (!complete) + { + //DEBUG_LOG("track %d sector %d\r\n", track, sectorNo); + if (diskImage->GetDecodedSector(track, sectorNo, buffer)) + { + unsigned trackNext = buffer[0]; + unsigned sectorNoNext = buffer[1]; + + complete = (track == trackNext) && (sectorNo == sectorNoNext); // Detect looping directory entries (raid over moscow ntsc) + complete |= (trackNext == 00) || (sectorNoNext == 0xff); + complete |= (trackNext == 18) && (sectorNoNext == 1); + track = trackNext; + sectorNo = sectorNoNext; + + int entry; + int entryOffset = 2; + for (entry = 0; entry < 8; ++entry) + { + bool done = true; + for (int i = 0; i < 0x1d; ++i) + { + if (buffer[i + entryOffset]) + done = false; + } + + if (!done) + { + u8 fileType = buffer[DIR_ENTRY_OFFSET_TYPE + entryOffset]; + u16 blocks = (buffer[DIR_ENTRY_OFFSET_BLOCKS + entryOffset + 1] << 8) | buffer[DIR_ENTRY_OFFSET_BLOCKS + entryOffset]; + + x = 0; + for (charIndex = 0; charIndex < DIR_ENTRY_NAME_LENGTH; ++charIndex) + { + char c = buffer[DIR_ENTRY_OFFSET_NAME + entryOffset + charIndex]; + if (c == 0xa0) c = 0x20; + name[charIndex] = c; + } + name[charIndex] = 0; + + //DEBUG_LOG("%d name = %s %x\r\n", blocks, name, fileType); + snprintf(bufferOut, 128, "%d", blocks); + screen.PrintText(true, x, y, bufferOut, textColour, bgColour); + x += 5 * 8; + snprintf(bufferOut, 128, "\"%s\"", name); + screen.PrintText(true, x, y, bufferOut, textColour, bgColour); + x += 19 * 8; + char modifier = 0x20; + if ((fileType & 0x80) == 0) + modifier = screen2petscii(42); + else if (fileType & 0x40) + modifier = screen2petscii(60); + snprintf(bufferOut, 128, "%s%c", fileTypes[fileType & 7], modifier); + screen.PrintText(true, x, y, bufferOut, textColour, bgColour); + y += 8; + } + entryOffset += 32; + } + } + else + { + // Error, just abort + complete = true; + } + } + } + x = 0; + //DEBUG_LOG("%d blocks free\r\n", blocksFree); + snprintf(bufferOut, 128, "%d BLOCKS FREE.\r\n", blocksFree); + screen.PrintText(true, x, y, bufferOut, textColour, bgColour); + y += 8; + } + + DisplayStatusBar(); + + if (filenameForIcon) + { + FILINFO filIcon; + if (CheckForPNG(filenameForIcon, filIcon)) + DisplayPNG(filIcon, 1024 - 320, 0); + } +} + +void FileBrowser::AutoSelectTestImage() +{ + FileBrowser::BrowsableList::Entry* current = 0; + int index; + int maxEntries = folder.entries.size(); + + for (index = 0; index < maxEntries; ++index) + { + current = &folder.entries[index]; + if (strcmp(current->filImage.fname, "someimage.g64") == 0) + { + break; + } + } + + if (index != maxEntries) + { + caddySelections.Clear(); + caddySelections.entries.push_back(*current); + selectionsMade = FillCaddyWithSelections(); + } +} diff --git a/FileBrowser.h b/FileBrowser.h new file mode 100644 index 0000000..107b74e --- /dev/null +++ b/FileBrowser.h @@ -0,0 +1,169 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef FileBrowser_H +#define FileBrowser_H +#include +#include "ff.h" +#include +#include "types.h" +#include "DiskImage.h" +#include "DiskCaddy.h" +#include "ROMs.h" + +#define VIC2_COLOUR_INDEX_BLACK 0 +#define VIC2_COLOUR_INDEX_WHITE 1 +#define VIC2_COLOUR_INDEX_RED 2 +#define VIC2_COLOUR_INDEX_CYAN 3 +#define VIC2_COLOUR_INDEX_MAGENTA 4 +#define VIC2_COLOUR_INDEX_GREEN 5 +#define VIC2_COLOUR_INDEX_BLUE 6 +#define VIC2_COLOUR_INDEX_YELLOW 7 +#define VIC2_COLOUR_INDEX_ORANGE 8 +#define VIC2_COLOUR_INDEX_BROWN 9 +#define VIC2_COLOUR_INDEX_PINK 10 +#define VIC2_COLOUR_INDEX_DGREY 11 +#define VIC2_COLOUR_INDEX_GREY 12 +#define VIC2_COLOUR_INDEX_LGREEN 13 +#define VIC2_COLOUR_INDEX_LBLUE 14 +#define VIC2_COLOUR_INDEX_LGREY 15 + +#define FILEBROWSER_MAX_PNG_SIZE 0x10000 + +#define STATUS_BAR_POSITION_Y (40 * 16 + 10) + +class FileBrowser +{ +public: + + class BrowsableList + { + public: + BrowsableList() + : current(0) + , currentIndex(0) + , offset(0) + { + } + + void Clear() + { + entries.clear(); + current = 0; + currentIndex = 0; + offset = 0; + } + + struct Entry + { + FILINFO filImage; + FILINFO filIcon; + }; + + Entry* FindEntry(const char* name); + + std::vector entries; + Entry* current; + u32 currentIndex; + u32 offset; + }; + + class Folder : public BrowsableList + { + public: + Folder() + : BrowsableList() + , name(0) + { + } + + FILINFO* name; + }; + + FileBrowser(DiskCaddy* diskCaddy, ROMs* roms, unsigned deviceID, bool displayPNGIcons); + + void AutoSelectTestImage(); + void DisplayRoot(); + void UpdateInput(); + + void RefeshDisplay(); + void DisplayDiskInfo(DiskImage* diskImage, const char* filenameForIcon); + + void DisplayStatusBar(); + + void FolderChanged(); + void PopFolder(); + + bool SelectionsMade() { return selectionsMade; } + const char* LastSelectionName() { return lastSelectionName; } + void ClearSelections() { selectionsMade = false; caddySelections.Clear(); } + + void ShowDeviceAndROM(); + + void ClearScreen(); + + void SetDeviceID(u8 id) { deviceID = id; } + + Folder* GetCurrentFolder(); + + static const long int LSTBuffer_size = 1024 * 8; + static unsigned char LSTBuffer[]; + + static const unsigned SwapKeys[]; + + static u32 Colour(int index); + + + bool SelectLST(const char* filenameLST); + +private: + void DisplayPNG(FILINFO& filIcon, int x, int y); + void RefreshFolderEntries(); + + void UpdateInputFolders(); + void UpdateInputDiskCaddy(); + + void RefeshDisplayForBrowsableList(FileBrowser::BrowsableList* browsableList, int xOffset, bool showSelected = true); + + bool FillCaddyWithSelections(); + + bool AddToCaddy(FileBrowser::BrowsableList::Entry* current); + + bool CheckForPNG(const char* filename, FILINFO& filIcon); + void DisplayPNG(); + + enum State + { + State_Folders, + State_DiskCaddy + } state; + + Folder folder; + u32 maxOnScreen; + DiskCaddy* diskCaddy; + bool selectionsMade; + const char* lastSelectionName; + ROMs* roms; + unsigned deviceID; + bool displayPNGIcons; + + BrowsableList caddySelections; + + char PNG[FILEBROWSER_MAX_PNG_SIZE]; +}; +#endif diff --git a/IOPort.h b/IOPort.h new file mode 100644 index 0000000..37f9016 --- /dev/null +++ b/IOPort.h @@ -0,0 +1,49 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef IOPort_H +#define IOPort_H +#include + +typedef void(*PortOutFn)(void*, unsigned char status); + +class IOPort +{ +public: + IOPort() : stateOut(0), stateIn(0), direction(0), portOutFn(0) {} + + inline void SetInput(unsigned char pin, bool state) + { + if (state) stateIn |= pin; + else stateIn &= ~pin; + } + inline unsigned char GetInput() { return stateIn; } + inline void SetInput(unsigned char value) { stateIn = value; } + inline unsigned char GetOutput() { return stateOut; } + inline void SetOutput(unsigned char value) { stateOut = value; if (portOutFn) (portOutFn)(portOutFnThis, stateOut & direction); } + inline unsigned char GetDirection() { return direction; } + inline void SetDirection(unsigned char value) { direction = value; if (portOutFn) (portOutFn)(portOutFnThis, stateOut & direction); } + inline void SetPortOut(void* data, PortOutFn fn) { portOutFnThis = data; portOutFn = fn; } +private: + unsigned char stateOut; + unsigned char stateIn; + unsigned char direction; + PortOutFn portOutFn; + void* portOutFnThis; +}; +#endif diff --git a/InputMappings.cpp b/InputMappings.cpp new file mode 100644 index 0000000..e09a880 --- /dev/null +++ b/InputMappings.cpp @@ -0,0 +1,195 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#include "InputMappings.h" +#include "FileBrowser.h" +#include "iec_bus.h" +#include "debug.h" +extern "C" +{ +#include "rpi-aux.h" +} + +// If disk swaps can be done via multiple cores then directDiskSwapRequest needs to be volatile. WARNING: volatile acesses can be very expensive. +//volatile unsigned InputMappings::directDiskSwapRequest = 0; +unsigned InputMappings::directDiskSwapRequest = 0; +//volatile unsigned InputMappings::uartFlags = 0; +//unsigned InputMappings::escapeSequenceIndex = 0; + +InputMappings::InputMappings() +{ +} + +bool InputMappings::CheckButtonsBrowseMode() +{ + buttonFlags = 0; + if (IEC_Bus::GetInputButtonPressed(0)) + SetButtonFlag(ENTER_FLAG); + else if (IEC_Bus::GetInputButtonRepeating(1)) + SetButtonFlag(UP_FLAG); + else if (IEC_Bus::GetInputButtonRepeating(2)) + SetButtonFlag(DOWN_FLAG); + else if (IEC_Bus::GetInputButtonPressed(3)) + SetButtonFlag(BACK_FLAG); + else if (IEC_Bus::GetInputButtonPressed(4)) + SetButtonFlag(INSERT_FLAG); + + return buttonFlags != 0; +} + +void InputMappings::CheckButtonsEmulationMode() +{ + buttonFlags = 0; + + if (IEC_Bus::GetInputButtonPressed(0)) + SetButtonFlag(ESC_FLAG); + else if (IEC_Bus::GetInputButtonPressed(1)) + SetButtonFlag(NEXT_FLAG); + else if (IEC_Bus::GetInputButtonPressed(2)) + SetButtonFlag(PREV_FLAG); + //else if (IEC_Bus::GetInputButtonPressed(3)) + // SetButtonFlag(BACK_FLAG); +} + + +//void InputMappings::CheckUart() +//{ +// char charReceived; +// +// uartFlags = 0; +// +// if (RPI_AuxMiniUartRead(&charReceived)) +// { +// DEBUG_LOG("charReceived=%c %02x\r\n", charReceived, charReceived); +// if (charReceived == '[') +// { +// escapeSequenceIndex++; +// } +// else +// { +// if (escapeSequenceIndex == 0) +// { +// if (charReceived == 27) +// SetUartFlag(ESC_FLAG); +// else if (charReceived == 13) +// SetUartFlag(ENTER_FLAG); +// else if (charReceived == ' ') +// SetUartFlag(SPACE_FLAG); +// else if (charReceived == 0x7f) +// SetUartFlag(BACK_FLAG); +// //else if (charReceived == 'u') +// // SetUartFlag(UP_FLAG); +// //else if (charReceived == 'U') +// // SetUartFlag(PAGEUP_FLAG); +// //else if (charReceived == 'd') +// // SetUartFlag(DOWN_FLAG); +// //else if (charReceived == 'D') +// // SetUartFlag(PAGEDOWN_FLAG); +// else +// { +// char number = charReceived - '0'; +// if (number >= 0 && number <= 9) +// { +// if (number == 0) +// number = 10; +// directDiskSwapRequest |= (1 << (number - 1)); +// printf("SWAP %d\r\n", number); +// } +// } +// } +// else if (escapeSequenceIndex == 1) +// { +// if (charReceived == 'A') +// SetUartFlag(UP_FLAG); +// else if (charReceived == 'B') +// SetUartFlag(DOWN_FLAG); +// else if (charReceived == 'C') +// SetUartFlag(PAGEDOWN_FLAG); +// else if (charReceived == 'D') +// SetUartFlag(PAGEUP_FLAG); +// else if (charReceived == '2') +// SetUartFlag(INSERT_FLAG); +// escapeSequenceIndex = 0; +// } +// } +// } +//} + +bool InputMappings::CheckKeyboardBrowseMode() +{ + Keyboard* keyboard = Keyboard::Instance(); + + keyboardFlags = 0; + + if (keyboard->KeyHeld(KEY_ESC)) + SetKeyboardFlag(ESC_FLAG); + else if (keyboard->KeyHeld(KEY_ENTER)) + SetKeyboardFlag(ENTER_FLAG); + else if (keyboard->KeyHeld(KEY_BACKSPACE)) + SetKeyboardFlag(BACK_FLAG); + else if (keyboard->KeyHeld(KEY_SPACE)) + SetKeyboardFlag(SPACE_FLAG); + else if (keyboard->KeyHeld(KEY_INSERT)) + SetKeyboardFlag(INSERT_FLAG); + else if (keyboard->KeyHeld(KEY_UP)) + SetKeyboardFlag(UP_FLAG); + else if (keyboard->KeyHeld(KEY_PAGEUP) || keyboard->KeyHeld(KEY_LEFT)) + SetKeyboardFlag(PAGEUP_FLAG); + else if (keyboard->KeyHeld(KEY_DOWN)) + SetKeyboardFlag(DOWN_FLAG); + else if (keyboard->KeyHeld(KEY_PAGEDOWN) || keyboard->KeyHeld(KEY_RIGHT)) + SetKeyboardFlag(PAGEDOWN_FLAG); + else + { + unsigned index; + for (index = 0; index < 10; ++index) + { + unsigned keySetIndexBase = index * 3; + if (keyboard->KeyHeld(FileBrowser::SwapKeys[keySetIndexBase]) || keyboard->KeyHeld(FileBrowser::SwapKeys[keySetIndexBase + 1]) || keyboard->KeyHeld(FileBrowser::SwapKeys[keySetIndexBase + 2])) + keyboardFlags |= NUMBER_FLAG; + } + } + + return keyboardFlags != 0; +} + +void InputMappings::CheckKeyboardEmulationMode(unsigned numberOfImages, unsigned numberOfImagesMax) +{ + Keyboard* keyboard = Keyboard::Instance(); + + keyboardFlags = 0; + if (keyboard->CheckChanged()) + { + if (keyboard->KeyHeld(KEY_ESC)) + SetKeyboardFlag(ESC_FLAG); + else if (keyboard->KeyHeld(KEY_PAGEUP)) + SetKeyboardFlag(PREV_FLAG); + else if (keyboard->KeyHeld(KEY_PAGEDOWN)) + SetKeyboardFlag(NEXT_FLAG); + else if (numberOfImages > 1) + { + unsigned index; + for (index = 0; index < numberOfImagesMax; ++index) + { + unsigned keySetIndexBase = index * 3; + if (keyboard->KeyHeld(FileBrowser::SwapKeys[keySetIndexBase]) || keyboard->KeyHeld(FileBrowser::SwapKeys[keySetIndexBase + 1]) || keyboard->KeyHeld(FileBrowser::SwapKeys[keySetIndexBase + 2])) + directDiskSwapRequest |= (1 << index); + } + } + } +} diff --git a/InputMappings.h b/InputMappings.h new file mode 100644 index 0000000..f17a48d --- /dev/null +++ b/InputMappings.h @@ -0,0 +1,129 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef InputMappings_H +#define InputMappings_H +#include "Singleton.h" +#include "Keyboard.h" + +#define ESC_FLAG (1 << 0) +#define NEXT_FLAG (1 << 1) +#define PREV_FLAG (1 << 2) +#define ENTER_FLAG (1 << 3) +#define UP_FLAG (1 << 4) +#define PAGEUP_FLAG (1 << 5) +#define DOWN_FLAG (1 << 6) +#define PAGEDOWN_FLAG (1 << 7) +#define SPACE_FLAG (1 << 8) +#define BACK_FLAG (1 << 9) +#define INSERT_FLAG (1 << 10) +#define NUMBER_FLAG (1 << 11) + +class InputMappings : public Singleton +{ +protected: + friend Singleton; + + unsigned keyboardFlags; + unsigned buttonFlags; + + //inline void SetUartFlag(unsigned flag) { uartFlags |= flag; } + //inline bool UartFlag(unsigned flag) { return (uartFlags & flag) != 0; } + inline void SetKeyboardFlag(unsigned flag) { keyboardFlags |= flag; } + inline bool KeyboardFlag(unsigned flag) { return (keyboardFlags & flag) != 0; } + inline void SetButtonFlag(unsigned flag) { buttonFlags |= flag; } + inline bool ButtonFlag(unsigned flag) { return (buttonFlags & flag) != 0; } + +public: + InputMappings(); + + //void CheckUart(); // One core will call this + bool CheckKeyboardBrowseMode(); + void CheckKeyboardEmulationMode(unsigned numberOfImages, unsigned numberOfImagesMax); // The other core will call this + bool CheckButtonsBrowseMode(); + void CheckButtonsEmulationMode(); + + void Reset() + { + keyboardFlags = 0; + buttonFlags = 0; + } + + inline bool Exit() + { + return KeyboardFlag(ESC_FLAG)/* | UartFlag(ESC_FLAG)*/ | ButtonFlag(ESC_FLAG); + } + + inline bool NextDisk() + { + return KeyboardFlag(NEXT_FLAG)/* | UartFlag(NEXT_FLAG)*/ | ButtonFlag(NEXT_FLAG); + } + + inline bool PrevDisk() + { + return KeyboardFlag(PREV_FLAG)/* | UartFlag(PREV_FLAG)*/ | ButtonFlag(PREV_FLAG); + } + + inline bool BrowseSelect() + { + return KeyboardFlag(ENTER_FLAG)/* | UartFlag(ENTER_FLAG)*/ | ButtonFlag(ENTER_FLAG); + } + + inline bool BrowseDone() + { + return KeyboardFlag(SPACE_FLAG)/* | UartFlag(SPACE_FLAG)*/; + } + + inline bool BrowseBack() + { + return KeyboardFlag(BACK_FLAG)/* | UartFlag(BACK_FLAG)*/ | ButtonFlag(BACK_FLAG); + } + + inline bool BrowseUp() + { + return KeyboardFlag(UP_FLAG)/* | UartFlag(UP_FLAG)*/ | ButtonFlag(UP_FLAG); + } + + inline bool BrowsePageUp() + { + return KeyboardFlag(PAGEUP_FLAG)/* | UartFlag(PAGEUP_FLAG)*/; + } + + inline bool BrowseDown() + { + return KeyboardFlag(DOWN_FLAG)/* | UartFlag(DOWN_FLAG)*/ | ButtonFlag(DOWN_FLAG); + } + + inline bool BrowsePageDown() + { + return KeyboardFlag(PAGEDOWN_FLAG)/* | UartFlag(PAGEDOWN_FLAG)*/; + } + + inline bool BrowseInsert() + { + return KeyboardFlag(INSERT_FLAG)/* | UartFlag(INSERT_FLAG)*/ | ButtonFlag(INSERT_FLAG); + } + + // Used by the 2 cores so need to be volatile + //volatile static unsigned directDiskSwapRequest; + static unsigned directDiskSwapRequest; + //volatile static unsigned uartFlags; // WARNING uncached volatile accessed across cores can be very expensive and may cause the emulation to exceed the 1us time frame and a realtime cycle will not be emulated correctly! +//private: +// static unsigned escapeSequenceIndex; +}; +#endif diff --git a/Keyboard.cpp b/Keyboard.cpp new file mode 100644 index 0000000..55dcff9 --- /dev/null +++ b/Keyboard.cpp @@ -0,0 +1,155 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#include "Keyboard.h" +#include +#include +#include "timer.h" +#include "debug.h" +extern "C" +{ +#include "uspi\devicenameservice.h" +} + +#define REPEAT_RATE 8 +#define REPEAT_DELAY 3 + +void Keyboard::KeyPressedHandlerRaw(TUSBKeyboardDevice* device, unsigned char modifiers, const unsigned char RawKeys[6]) +{ + // byte 0 - modifires + // bit 0: left control + // bit 1 : left shift + // bit 2 : left alt + // bit 3 : left GUI(Win / Apple / Meta key) + // bit 4 : right control + // bit 5 : right shift + // bit 6 : right alt + // bit 7 : right GUI + // byte 1 - reserved + // bytes 2-7 - represent the keys that are concurrently pressed (up to 6 in this case) + // ranges from 0x04 to 0xE7 + // If no keys are currently pressed then all 6 bytes should contain 0x00 + // The key repeat delay and rate is purely a host function. + //DEBUG_LOG("KeyPressedHandlerRaw: %x %d %d %d %d %d %d\r\n", modifiers, RawKeys[0], RawKeys[1], RawKeys[2], RawKeys[3], RawKeys[4], RawKeys[5]); + + Keyboard* keyboard = Keyboard::Instance(); + bool anyDown = false; + + keyboard->keyStatusPrev[0] = keyboard->keyStatus[0]; + keyboard->keyStatusPrev[1] = keyboard->keyStatus[1]; + keyboard->keyStatus[0] = 0; + keyboard->keyStatus[1] = 0; + + keyboard->modifier = modifiers; + + int index; + for (index = 0; index < 6; ++index) + { + u8 rawKey = RawKeys[index]; + if (rawKey >= 4) + { + int keyStatusIndex = (rawKey >= 64) ? 1 : 0; + + //DEBUG_LOG("%x %d\r\n", rawKey, keyStatusIndex); + + u64 keyBit = 1ULL << (u64)(rawKey & 0x3f); + if (keyboard->keyStatusPrev[keyStatusIndex] & keyBit) + { + } + else + { + keyboard->keyRepeatCount[rawKey] = 0; + } + keyboard->keyStatus[keyStatusIndex] |= keyBit; + anyDown = true; + } + } + + if (anyDown) + { + // Only need the timer if a key was held down + if (keyboard->timer == 0) + { + keyboard->timer = TimerStartKernelTimer(REPEAT_RATE, USBKeyboardDeviceTimerHandler, 0, device); + //DEBUG_LOG("Timer started\r\n"); + } + } + else + { + if (keyboard->timer != 0) + { + TimerCancelKernelTimer(keyboard->timer); + keyboard->timer = 0; + } + } + keyboard->updateCount++; +} + +void Keyboard::USBKeyboardDeviceTimerHandler(unsigned hTimer, void *pParam, void *pContext) +{ + Keyboard* keyboard = Keyboard::Instance(); + bool anyDown = false; + + int keyStatusIndex; + int keyIndex; + for (keyStatusIndex = 0; keyStatusIndex < 2; ++keyStatusIndex) + { + for (keyIndex = 0; keyIndex < 64; ++keyIndex) + { + int keyCodeIndex = keyStatusIndex * 64 + keyIndex; + + if (keyboard->keyStatus[keyStatusIndex] & (1ULL << keyIndex)) + { + anyDown = true; + + keyboard->keyRepeatCount[keyCodeIndex]++; + if (keyboard->keyRepeatCount[keyCodeIndex] > REPEAT_DELAY) + keyboard->updateCount++; + } + else + { + keyboard->keyRepeatCount[keyCodeIndex] = 0; + } + } + } + + keyboard->keyStatusPrev[0] = keyboard->keyStatus[0]; + keyboard->keyStatusPrev[1] = keyboard->keyStatus[1]; + + if (keyboard->timer != 0) + { + TimerCancelKernelTimer(keyboard->timer); + keyboard->timer = 0; + } + + if (anyDown) // Only need the timer if a key was held down + keyboard->timer = TimerStartKernelTimer(REPEAT_RATE, USBKeyboardDeviceTimerHandler, 0, pContext); +} + +Keyboard::Keyboard() + : modifier(0) + , timer(0) + , updateCount(0) + , updateCountLastRead(-1) +{ + keyStatus[0] = 0; + keyStatus[1] = 0; + + memset(keyRepeatCount, 0, sizeof(keyRepeatCount)); + USPiKeyboardRegisterKeyStatusHandlerRaw(KeyPressedHandlerRaw); +} diff --git a/Keyboard.h b/Keyboard.h new file mode 100644 index 0000000..21cde5f --- /dev/null +++ b/Keyboard.h @@ -0,0 +1,348 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef Keyboard_H +#define Keyboard_H +#include "Singleton.h" +#include + +extern "C" +{ +#include +} + +#define MAX_KEYS 0x7f + +#define KEY_MOD_LCTRL 0x01 +#define KEY_MOD_LSHIFT 0x02 +#define KEY_MOD_LALT 0x04 +#define KEY_MOD_LMETA 0x08 +#define KEY_MOD_RCTRL 0x10 +#define KEY_MOD_RSHIFT 0x20 +#define KEY_MOD_RALT 0x40 +#define KEY_MOD_RMETA 0x80 + +#define KEY_A 0x04 // Keyboard a and A +#define KEY_B 0x05 // Keyboard b and B +#define KEY_C 0x06 // Keyboard c and C +#define KEY_D 0x07 // Keyboard d and D +#define KEY_E 0x08 // Keyboard e and E +#define KEY_F 0x09 // Keyboard f and F +#define KEY_G 0x0a // Keyboard g and G +#define KEY_H 0x0b // Keyboard h and H +#define KEY_I 0x0c // Keyboard i and I +#define KEY_J 0x0d // Keyboard j and J +#define KEY_K 0x0e // Keyboard k and K +#define KEY_L 0x0f // Keyboard l and L +#define KEY_M 0x10 // Keyboard m and M +#define KEY_N 0x11 // Keyboard n and N +#define KEY_O 0x12 // Keyboard o and O +#define KEY_P 0x13 // Keyboard p and P +#define KEY_Q 0x14 // Keyboard q and Q +#define KEY_R 0x15 // Keyboard r and R +#define KEY_S 0x16 // Keyboard s and S +#define KEY_T 0x17 // Keyboard t and T +#define KEY_U 0x18 // Keyboard u and U +#define KEY_V 0x19 // Keyboard v and V +#define KEY_W 0x1a // Keyboard w and W +#define KEY_X 0x1b // Keyboard x and X +#define KEY_Y 0x1c // Keyboard y and Y +#define KEY_Z 0x1d // Keyboard z and Z + +#define KEY_1 0x1e // Keyboard 1 and ! +#define KEY_2 0x1f // Keyboard 2 and @ +#define KEY_3 0x20 // Keyboard 3 and # +#define KEY_4 0x21 // Keyboard 4 and $ +#define KEY_5 0x22 // Keyboard 5 and % +#define KEY_6 0x23 // Keyboard 6 and ^ +#define KEY_7 0x24 // Keyboard 7 and & +#define KEY_8 0x25 // Keyboard 8 and * +#define KEY_9 0x26 // Keyboard 9 and ( +#define KEY_0 0x27 // Keyboard 0 and ) + +#define KEY_ENTER 0x28 // Keyboard Return (ENTER) +#define KEY_ESC 0x29 // Keyboard ESCAPE +#define KEY_BACKSPACE 0x2a // Keyboard DELETE (Backspace) +#define KEY_TAB 0x2b // Keyboard Tab +#define KEY_SPACE 0x2c // Keyboard Spacebar +#define KEY_MINUS 0x2d // Keyboard - and _ +#define KEY_EQUAL 0x2e // Keyboard = and + +#define KEY_LEFTBRACE 0x2f // Keyboard [ and { +#define KEY_RIGHTBRACE 0x30 // Keyboard ] and } +#define KEY_BACKSLASH 0x31 // Keyboard \ and | +#define KEY_HASHTILDE 0x32 // Keyboard Non-US # and ~ +#define KEY_SEMICOLON 0x33 // Keyboard ; and : +#define KEY_APOSTROPHE 0x34 // Keyboard ' and " +#define KEY_GRAVE 0x35 // Keyboard ` and ~ +#define KEY_COMMA 0x36 // Keyboard , and < +#define KEY_DOT 0x37 // Keyboard . and > +#define KEY_SLASH 0x38 // Keyboard / and ? +#define KEY_CAPSLOCK 0x39 // Keyboard Caps Lock + +#define KEY_F1 0x3a // Keyboard F1 +#define KEY_F2 0x3b // Keyboard F2 +#define KEY_F3 0x3c // Keyboard F3 +#define KEY_F4 0x3d // Keyboard F4 +#define KEY_F5 0x3e // Keyboard F5 +#define KEY_F6 0x3f // Keyboard F6 +#define KEY_F7 0x40 // Keyboard F7 +#define KEY_F8 0x41 // Keyboard F8 +#define KEY_F9 0x42 // Keyboard F9 +#define KEY_F10 0x43 // Keyboard F10 +#define KEY_F11 0x44 // Keyboard F11 +#define KEY_F12 0x45 // Keyboard F12 + +#define KEY_SYSRQ 0x46 // Keyboard Print Screen +#define KEY_SCROLLLOCK 0x47 // Keyboard Scroll Lock +#define KEY_PAUSE 0x48 // Keyboard Pause +#define KEY_INSERT 0x49 // Keyboard Insert +#define KEY_HOME 0x4a // Keyboard Home +#define KEY_PAGEUP 0x4b // Keyboard Page Up +#define KEY_DELETE 0x4c // Keyboard Delete Forward +#define KEY_END 0x4d // Keyboard End +#define KEY_PAGEDOWN 0x4e // Keyboard Page Down +#define KEY_RIGHT 0x4f // Keyboard Right Arrow +#define KEY_LEFT 0x50 // Keyboard Left Arrow +#define KEY_DOWN 0x51 // Keyboard Down Arrow +#define KEY_UP 0x52 // Keyboard Up Arrow + +#define KEY_NUMLOCK 0x53 // Keyboard Num Lock and Clear +#define KEY_KPSLASH 0x54 // Keypad / +#define KEY_KPASTERISK 0x55 // Keypad * +#define KEY_KPMINUS 0x56 // Keypad - +#define KEY_KPPLUS 0x57 // Keypad + +#define KEY_KPENTER 0x58 // Keypad ENTER +#define KEY_KP1 0x59 // Keypad 1 and End +#define KEY_KP2 0x5a // Keypad 2 and Down Arrow +#define KEY_KP3 0x5b // Keypad 3 and PageDn +#define KEY_KP4 0x5c // Keypad 4 and Left Arrow +#define KEY_KP5 0x5d // Keypad 5 +#define KEY_KP6 0x5e // Keypad 6 and Right Arrow +#define KEY_KP7 0x5f // Keypad 7 and Home +#define KEY_KP8 0x60 // Keypad 8 and Up Arrow +#define KEY_KP9 0x61 // Keypad 9 and Page Up +#define KEY_KP0 0x62 // Keypad 0 and Insert +#define KEY_KPDOT 0x63 // Keypad . and Delete + +#define KEY_102ND 0x64 // Keyboard Non-US \ and | +#define KEY_COMPOSE 0x65 // Keyboard Application +#define KEY_POWER 0x66 // Keyboard Power +#define KEY_KPEQUAL 0x67 // Keypad = + +#define KEY_F13 0x68 // Keyboard F13 +#define KEY_F14 0x69 // Keyboard F14 +#define KEY_F15 0x6a // Keyboard F15 +#define KEY_F16 0x6b // Keyboard F16 +#define KEY_F17 0x6c // Keyboard F17 +#define KEY_F18 0x6d // Keyboard F18 +#define KEY_F19 0x6e // Keyboard F19 +#define KEY_F20 0x6f // Keyboard F20 +#define KEY_F21 0x70 // Keyboard F21 +#define KEY_F22 0x71 // Keyboard F22 +#define KEY_F23 0x72 // Keyboard F23 +#define KEY_F24 0x73 // Keyboard F24 + +#define KEY_OPEN 0x74 // Keyboard Execute +#define KEY_HELP 0x75 // Keyboard Help +#define KEY_PROPS 0x76 // Keyboard Menu +#define KEY_FRONT 0x77 // Keyboard Select +#define KEY_STOP 0x78 // Keyboard Stop +#define KEY_AGAIN 0x79 // Keyboard Again +#define KEY_UNDO 0x7a // Keyboard Undo +#define KEY_CUT 0x7b // Keyboard Cut +#define KEY_COPY 0x7c // Keyboard Copy +#define KEY_PASTE 0x7d // Keyboard Paste +#define KEY_FIND 0x7e // Keyboard Find +#define KEY_MUTE 0x7f // Keyboard Mute +#define KEY_VOLUMEUP 0x80 // Keyboard Volume Up +#define KEY_VOLUMEDOWN 0x81 // Keyboard Volume Down +// 0x82 Keyboard Locking Caps Lock +// 0x83 Keyboard Locking Num Lock +// 0x84 Keyboard Locking Scroll Lock +#define KEY_KPCOMMA 0x85 // Keypad Comma +// 0x86 Keypad Equal Sign +#define KEY_RO 0x87 // Keyboard International1 +#define KEY_KATAKANAHIRAGANA 0x88 // Keyboard International2 +#define KEY_YEN 0x89 // Keyboard International3 +#define KEY_HENKAN 0x8a // Keyboard International4 +#define KEY_MUHENKAN 0x8b // Keyboard International5 +#define KEY_KPJPCOMMA 0x8c // Keyboard International6 +// 0x8d Keyboard International7 +// 0x8e Keyboard International8 +// 0x8f Keyboard International9 +#define KEY_HANGEUL 0x90 // Keyboard LANG1 +#define KEY_HANJA 0x91 // Keyboard LANG2 +#define KEY_KATAKANA 0x92 // Keyboard LANG3 +#define KEY_HIRAGANA 0x93 // Keyboard LANG4 +#define KEY_ZENKAKUHANKAKU 0x94 // Keyboard LANG5 +// 0x95 Keyboard LANG6 +// 0x96 Keyboard LANG7 +// 0x97 Keyboard LANG8 +// 0x98 Keyboard LANG9 +// 0x99 Keyboard Alternate Erase +// 0x9a Keyboard SysReq/Attention +// 0x9b Keyboard Cancel +// 0x9c Keyboard Clear +// 0x9d Keyboard Prior +// 0x9e Keyboard Return +// 0x9f Keyboard Separator +// 0xa0 Keyboard Out +// 0xa1 Keyboard Oper +// 0xa2 Keyboard Clear/Again +// 0xa3 Keyboard CrSel/Props +// 0xa4 Keyboard ExSel + +// 0xb0 Keypad 00 +// 0xb1 Keypad 000 +// 0xb2 Thousands Separator +// 0xb3 Decimal Separator +// 0xb4 Currency Unit +// 0xb5 Currency Sub-unit +#define KEY_KPLEFTPAREN 0xb6 // Keypad ( +#define KEY_KPRIGHTPAREN 0xb7 // Keypad ) +// 0xb8 Keypad { +// 0xb9 Keypad } +// 0xba Keypad Tab +// 0xbb Keypad Backspace +// 0xbc Keypad A +// 0xbd Keypad B +// 0xbe Keypad C +// 0xbf Keypad D +// 0xc0 Keypad E +// 0xc1 Keypad F +// 0xc2 Keypad XOR +// 0xc3 Keypad ^ +// 0xc4 Keypad % +// 0xc5 Keypad < +// 0xc6 Keypad > +// 0xc7 Keypad & +// 0xc8 Keypad && +// 0xc9 Keypad | +// 0xca Keypad || +// 0xcb Keypad : +// 0xcc Keypad # +// 0xcd Keypad Space +// 0xce Keypad @ +// 0xcf Keypad ! +// 0xd0 Keypad Memory Store +// 0xd1 Keypad Memory Recall +// 0xd2 Keypad Memory Clear +// 0xd3 Keypad Memory Add +// 0xd4 Keypad Memory Subtract +// 0xd5 Keypad Memory Multiply +// 0xd6 Keypad Memory Divide +// 0xd7 Keypad +/- +// 0xd8 Keypad Clear +// 0xd9 Keypad Clear Entry +// 0xda Keypad Binary +// 0xdb Keypad Octal +// 0xdc Keypad Decimal +// 0xdd Keypad Hexadecimal + +#define KEY_LEFTCTRL 0xe0 // Keyboard Left Control +#define KEY_LEFTSHIFT 0xe1 // Keyboard Left Shift +#define KEY_LEFTALT 0xe2 // Keyboard Left Alt +#define KEY_LEFTMETA 0xe3 // Keyboard Left GUI +#define KEY_RIGHTCTRL 0xe4 // Keyboard Right Control +#define KEY_RIGHTSHIFT 0xe5 // Keyboard Right Shift +#define KEY_RIGHTALT 0xe6 // Keyboard Right Alt +#define KEY_RIGHTMETA 0xe7 // Keyboard Right GUI + +#define KEY_MEDIA_PLAYPAUSE 0xe8 +#define KEY_MEDIA_STOPCD 0xe9 +#define KEY_MEDIA_PREVIOUSSONG 0xea +#define KEY_MEDIA_NEXTSONG 0xeb +#define KEY_MEDIA_EJECTCD 0xec +#define KEY_MEDIA_VOLUMEUP 0xed +#define KEY_MEDIA_VOLUMEDOWN 0xee +#define KEY_MEDIA_MUTE 0xef +#define KEY_MEDIA_WWW 0xf0 +#define KEY_MEDIA_BACK 0xf1 +#define KEY_MEDIA_FORWARD 0xf2 +#define KEY_MEDIA_STOP 0xf3 +#define KEY_MEDIA_FIND 0xf4 +#define KEY_MEDIA_SCROLLUP 0xf5 +#define KEY_MEDIA_SCROLLDOWN 0xf6 +#define KEY_MEDIA_EDIT 0xf7 +#define KEY_MEDIA_SLEEP 0xf8 +#define KEY_MEDIA_COFFEE 0xf9 +#define KEY_MEDIA_REFRESH 0xfa +#define KEY_MEDIA_CALC 0xfb + +class Keyboard : public Singleton +{ +protected: + friend Singleton; + + u8 modifier; + volatile u64 keyStatus[2]; + volatile u64 keyStatusPrev[2]; + u32 keyRepeatCount[MAX_KEYS]; + u32 timer; + //volatile bool dirty; + volatile u32 updateCount; + u32 updateCountLastRead; + + static void KeyPressedHandlerRaw(TUSBKeyboardDevice* device, unsigned char modifiers, const unsigned char RawKeys[6]); + static void USBKeyboardDeviceTimerHandler(unsigned hTimer, void *pParam, void *pContext); + +public: + Keyboard(); + + //inline u32 UpdateCount() const { return updateCount; } + + inline bool CheckChanged() + { + if (updateCountLastRead == updateCount) + { + return false; + } + else + { + updateCountLastRead = updateCount; + return true; + } + // bool dirtyOld = dirty; + // dirty = false; + // return dirtyOld; + } + + inline bool KeyPressed(u32 rawKey) + { + int keyStatusIndex = rawKey >= 64 ? 1 : 0; + u64 mask = 1ULL << (rawKey & 0x3f); + return ((keyStatus[keyStatusIndex] & mask) && !(keyStatusPrev[keyStatusIndex] & mask)); + } + inline bool KeyReleased(u32 rawKey) + { + int keyStatusIndex = rawKey >= 64 ? 1 : 0; + u64 mask = 1ULL << (rawKey & 0x3f); + return (!(keyStatus[keyStatusIndex] & mask) && (keyStatusPrev[keyStatusIndex] & mask)); + } + inline bool KeyHeld(u32 rawKey) + { + int keyStatusIndex = rawKey >= 64 ? 1 : 0; + u64 mask = 1ULL << (rawKey & 0x3f); + return (keyStatus[keyStatusIndex] & mask); + } + inline bool KeyAnyHeld() + { + return (keyStatus[0] | keyStatus[1]); + } +}; +#endif diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d96845f --- /dev/null +++ b/Makefile @@ -0,0 +1,81 @@ +# +# Makefile +# + +OBJS = armc-start.o armc-cstartup.o armc-cstubs.o armc-cppstubs.o exception.o main.o rpi-aux.o rpi-mailbox-interface.o rpi-mailbox.o rpi-gpio.o rpi-interrupts.o cache.o ff.o interrupt.o keyboard.o Pi1541.o DiskImage.o iec_bus.o iec_commands.o m6502.o m6522.o drive.o gcr.o prot.o lz.o emmc.o diskio.o options.o Screen.o Timer.o FileBrowser.o DiskCaddy.o ROMs.o InputMappings.o xga_font_data.o + +kernel.img: $(OBJS) $(OBJSS) + $(LD) -o kernel.elf -Map kernel.map -T linker.ld $(OBJS) $(LIBS) + $(PREFIX)objdump -d kernel.elf | $(PREFIX)c++filt > kernel.lst + $(PREFIX)objcopy kernel.elf -O binary kernel.img + wc -c kernel.img + +GCC_BASE = "C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2" + +RASPPI ?= 3 +PREFIX ?= arm-none-eabi- + +CC = $(PREFIX)gcc +CPP = $(PREFIX)g++ +AS = $(CC) +LD = $(PREFIX)ld +AR = $(PREFIX)ar + +ifeq ($(strip $(RASPPI)),0) +#ARCH ?= -march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -DRPIZERO=1 -DDEBUG +ARCH ?= -march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -DRPIZERO=1 +CFLAGS += -DRPIZERO=1 +endif +ifeq ($(strip $(RASPPI)),1) +ARCH ?= -march=armv6zk -mtune=arm1176jzf-s -mfloat-abi=hard -DRPIZERO=1 +CFLAGS += -DRPIBPLUS=1 +endif +ifeq ($(strip $(RASPPI)),2) +ARCH ?= -march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -marm -DRPI2=1 +CFLAGS += -DRPI2=1 +endif +ifeq ($(strip $(RASPPI)),3) +ARCH ?= -march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -marm -DRPI3=1 -DDEBUG -DNDEBUG +#ARCH ?= -march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -marm -DRPI3=1 +CFLAGS += -DRPI3=1 +endif + +LIBS = $(GCC_BASE)/arm-none-eabi/lib/fpu/libc.a $(GCC_BASE)/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a +LIBS += uspi/lib/libuspi.a -lstdc++ + +INCLUDE += -I $(GCC_BASE)/arm-none-eabi/include -I $(GCC_BASE)/lib/gcc/arm-none-eabi/5.4.1/include +#INCLUDE += -I USB/include +INCLUDE += -I uspi/include +#INCLUDE += -I uspi/include/uspi + +AFLAGS += $(ARCH) $(INCLUDE) +CFLAGS += $(ARCH) -Wall -Wno-psabi -fsigned-char -fno-builtin $(INCLUDE) +#-Wno-packed-bitfield-compat +#CFLAGS += -O3 +#CFLAGS += -O4 +CFLAGS += -Ofast +CPPFLAGS+= $(CFLAGS) -fno-exceptions -fno-rtti -std=c++0x -Wno-write-strings + +CFLAGS += -fno-delete-null-pointer-checks -fdata-sections -ffunction-sections -u _printf_float + +%.o: %.S + $(AS) $(AFLAGS) -c -o $@ $< + +%.o: %.c + $(CC) $(CFLAGS) -c -o $@ $< + +#assm add -S +%.o: %.cpp + $(CPP) $(CPPFLAGS) -c -o $@ $< + +clean: +# rm -f *.o *.a *.elf *.lst *.img *.cir *.map *~ $(EXTRACLEAN) + del *.o + del *.a + del *.elf + del *.img + + + + +#arm-none-eabi-objdump -D kernel.elf > kernel.elf.asm diff --git a/Petscii.h b/Petscii.h new file mode 100644 index 0000000..f780896 --- /dev/null +++ b/Petscii.h @@ -0,0 +1,54 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef PETSCII +#define PETSCII + +static inline u8 ascii2petscii(u8 ch) +{ + if (ch > 64 && ch < 91) ch += 128; + else if (ch > 96 && ch < 123) ch -= 32; + else if (ch > 192 && ch < 219) ch -= 128; + return ch; +} +static inline u8 petscii2ascii(u8 ch) +{ + if (ch >(64 + 128) && ch < (91 + 128)) ch -= 128; + else if (ch >(96 - 32) && ch < (123 - 32)) ch += 32; + else if (ch >(192 - 128) && ch < (219 - 128)) ch += 128; + return ch; +} + +static inline u8 petscii2screen(u8 ch) +{ + if ((ch >= 0x40 && ch <= 0x5F) || (ch >= 0xa0 && ch <= 0xbf)) ch -= 0x40; + else if (ch >= 0xc0 && ch <= 0xdf) ch -= 0x80; + else if (ch >= 0 && ch <= 0x1f) ch += 0x80; + else if ((ch >= 0x60 && ch <= 0x7F) || (ch >= 0x90 && ch <= 0x9f)) ch += 0x40; + return ch; +} + +static inline u8 screen2petscii(u8 ch) +{ + if ((ch >= 0 && ch <= 0x1F) || (ch >= 0x60 && ch <= 0x7f)) ch += 0x40; + else if (ch >= 0x40 && ch <= 0x5f) ch += 0x80; + else if (ch >= 0x80 && ch <= 0x9f) ch -= 0x80; + else if ((ch >= 0xa0 && ch <= 0xbF) || (ch >= 0xd0 && ch <= 0xdf)) ch -= 0x40; + return ch; +} +#endif diff --git a/Pi1541.cpp b/Pi1541.cpp new file mode 100644 index 0000000..799898f --- /dev/null +++ b/Pi1541.cpp @@ -0,0 +1,77 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#include "Pi1541.h" +#include "debug.h" + +Pi1541::Pi1541() +{ + VIA[0].ConnectIRQ(&m6502.IRQ); + VIA[1].ConnectIRQ(&m6502.IRQ); +} + +void Pi1541::Initialise() +{ + VIA[0].ConnectIRQ(&m6502.IRQ); + VIA[1].ConnectIRQ(&m6502.IRQ); +} + +//void Pi1541::ConfigureOfExtraRAM(bool extraRAM) +//{ +// if (extraRAM) +// m6502.SetBusFunctions(this, Read6502ExtraRAM, Write6502ExtraRAM); +// else +// m6502.SetBusFunctions(this, Read6502, Write6502); +//} + +void Pi1541::Update() +{ + if (drive.Update()) + { + //This pin sets the overflow flag on a negative transition from TTL one to TTL zero. + // SO is sampled at the trailing edge of P1, the cpu V flag is updated at next P1. + m6502.SO(); + } + + VIA[1].Execute(); + VIA[0].Execute(); +} + +void Pi1541::Reset() +{ + IOPort* VIABortB; + + // Must reset the VIAs first as the devices will initialise inputs (eg CA1 ports etc) + // - VIAs will reset the inputs to a default value + // - devices will then set the inputs + // - could cause a IR_CXX IRQ + // - possibilities + // - reset while an ATN + // - reset while !BYTE SYNC + // - should be fine as VIA's functionControlRegister is reset to 0 and IRQs will be turned off + VIA[0].Reset(); + VIA[1].Reset(); + drive.Reset(); + IEC_Bus::Reset(); + // On a real drive the outputs look like they are being pulled high (when set to inputs) (Taking an input from the front end of an inverter) + VIABortB = VIA[0].GetPortB(); + VIABortB->SetInput(VIAPORTPINS_DATAOUT, true); + VIABortB->SetInput(VIAPORTPINS_CLOCKOUT, true); + VIABortB->SetInput(VIAPORTPINS_ATNAOUT, true); +} + diff --git a/Pi1541.h b/Pi1541.h new file mode 100644 index 0000000..5e688cf --- /dev/null +++ b/Pi1541.h @@ -0,0 +1,55 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef PI1541_H +#define PI1541_H + +#include "Drive.h" +#include "m6502.h" +#include "iec_bus.h" + +class Pi1541 +{ + +public: + Pi1541(); + + void Initialise(); + + void Update(); + + void Reset(); + + //void ConfigureOfExtraRAM(bool extraRAM); + + Drive drive; + m6522 VIA[2]; + + M6502 m6502; + +private: + //u8 Memory[0xc000]; + + //static u8 Read6502(u16 address, void* data); + //static u8 Read6502ExtraRAM(u16 address, void* data); + //static u8 Peek6502(u16 address, void* data); + //static void Write6502(u16 address, const u8 value, void* data); + //static void Write6502ExtraRAM(u16 address, const u8 value, void* data); +}; + +#endif \ No newline at end of file diff --git a/README.md b/README.md index 7b13587..56404ef 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,29 @@ # Pi1541 + Commodore 1541 emulator for the Raspberry Pi + +Pi1541 is a real-time, cycle exact, Commodore 1541 disk drive emulator that can run on a Raspberry Pi 3B (or 3B+). The software is free and I have endeavored to make the hardware as simple and inexpensive as possible. + +Pi1541 provides you with an SD card solution for using D64, G64, NIB and NBZ Commodore disk images on real Commodore 8 bit computers such as;- +Commodore 64 +Commodore 128 +Commodore Vic20 +Commodore 16 +Commodore Plus4 + +See www.pi1541.com for SD card and hardware configurations. + +Building +-------- + +I use GNU Tools ARM Embedded tool chain 5.4.1 on Windows using make. https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads/5-2016-q2-update +There are two make files. +One in uspi\lib and Pi1541's make file the root folder. +You will need to edit the make files to set GCC_BASE to the location of your GNU tools. +(If anyone knows how to fix this requirement then please fix it. arm-none-eabi-gcc can find the include paths why can't arm-none-eabi-ld find the library paths?) + +You need to build uspi\lib first. +Change to uspi\lib and make. +Change back to the root folder of the project and again make. +This will build kernel.img + diff --git a/ROMs.cpp b/ROMs.cpp new file mode 100644 index 0000000..4d7ca2f --- /dev/null +++ b/ROMs.cpp @@ -0,0 +1,45 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#include "ROMs.h" +#include "debug.h" +#include + +void ROMs::ResetCurrentROMIndex() +{ + currentROMIndex = lastManualSelectedROMIndex; + + DEBUG_LOG("Reset ROM back to %d %s\r\n", currentROMIndex, ROMNames[currentROMIndex]); +} + +void ROMs::SelectROM(const char* ROMName) +{ + unsigned index; + + for (index = 0; index < MAX_ROMS; ++index) + { + if (ROMNames[index] && strcasecmp(ROMNames[index], ROMName) == 0) + { + DEBUG_LOG("LST switching ROM %d %s\r\n", index, ROMNames[index]); + + currentROMIndex = index; + break; + } + } +} + diff --git a/ROMs.h b/ROMs.h new file mode 100644 index 0000000..7f438bc --- /dev/null +++ b/ROMs.h @@ -0,0 +1,46 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef ROMs_H +#define ROMs_H + +#include "types.h" + +class ROMs +{ +public: + void SelectROM(const char* ROMName); + + inline u8 Read(u16 address) + { + return ROMImages[currentROMIndex][address & 0x3fff]; + } + + void ResetCurrentROMIndex(); + + static const int ROM_SIZE = 16384; + static const int MAX_ROMS = 8; + + unsigned char ROMImages[MAX_ROMS][ROM_SIZE]; + char ROMNames[MAX_ROMS][256]; + bool ROMValid[MAX_ROMS]; + + unsigned currentROMIndex; + unsigned lastManualSelectedROMIndex; +}; +#endif diff --git a/Screen.cpp b/Screen.cpp new file mode 100644 index 0000000..538c618 --- /dev/null +++ b/Screen.cpp @@ -0,0 +1,311 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#include "Screen.h" +#include "CBMFont.h" +#include +#include +#include +#include "debug.h" +#include "Petscii.h" +#include "stb_image_config.h" + +#define MAX(x, y) (((x) > (y)) ? (x) : (y)) + +extern "C" +{ + #include "rpi-mailbox-interface.h" + #include "xga_font_data.h" +} + +extern u32 RPi_CpuId; + +static const int BitFontHt = 16; +static const int BitFontWth = 8; + +void Screen::Open(u32 widthDesired, u32 heightDesired, u32 colourDepth) +{ + rpi_mailbox_property_t* mp; + //int width = 0; + //int height = 0; + //int depth = 0; + + RPI_PropertyInit(); + RPI_PropertyAddTag(TAG_GET_PHYSICAL_SIZE); + RPI_PropertyAddTag(TAG_GET_VIRTUAL_SIZE); + RPI_PropertyAddTag(TAG_GET_DEPTH); + RPI_PropertyProcess(); + + //if ((mp = RPI_PropertyGet(TAG_GET_PHYSICAL_SIZE))) + //{ + // width = mp->data.buffer_32[0]; + // height = mp->data.buffer_32[1]; + //} + + //if ((mp = RPI_PropertyGet(TAG_GET_DEPTH))) + // depth = mp->data.buffer_32[0]; + + //DEBUG_LOG("width = %d height = %d depth = %d\r\n", width, height, depth); + + do + { + RPI_PropertyInit(); + RPI_PropertyAddTag(TAG_ALLOCATE_BUFFER); + RPI_PropertyAddTag(TAG_SET_PHYSICAL_SIZE, widthDesired, heightDesired); + RPI_PropertyAddTag(TAG_SET_VIRTUAL_SIZE, widthDesired, heightDesired); // Don't need to double buffer (yet). + RPI_PropertyAddTag(TAG_SET_DEPTH, colourDepth); + RPI_PropertyAddTag(TAG_GET_PITCH); + RPI_PropertyAddTag(TAG_GET_PHYSICAL_SIZE); + RPI_PropertyAddTag(TAG_GET_DEPTH); + RPI_PropertyProcess(); + + if ((mp = RPI_PropertyGet(TAG_GET_PHYSICAL_SIZE))) + { + width = mp->data.buffer_32[0]; + height = mp->data.buffer_32[1]; + } + + if ((mp = RPI_PropertyGet(TAG_GET_DEPTH))) + bpp = mp->data.buffer_32[0]; + + if ((mp = RPI_PropertyGet(TAG_GET_PITCH))) + pitch = mp->data.buffer_32[0]; + + if ((mp = RPI_PropertyGet(TAG_ALLOCATE_BUFFER))) + framebuffer = (unsigned char*)(mp->data.buffer_32[0] & 0x3FFFFFFF); + } + while (framebuffer == 0); + + + //RPI_PropertyInit(); + //RPI_PropertyAddTag(TAG_SET_PALETTE, palette); + //RPI_PropertyProcess(); + + switch (bpp) + { + case 32: + plotPixelFn = &Screen::PlotPixel32; + break; + case 24: + plotPixelFn = &Screen::PlotPixel24; + break; + default: + case 16: + plotPixelFn = &Screen::PlotPixel16; + break; + case 8: + plotPixelFn = &Screen::PlotPixel8; + break; + } + + opened = true; +} + +void Screen::PlotPixel32(u32 pixel_offset, RGBA Colour) +{ + *((volatile RGBA*)&framebuffer[pixel_offset]) = Colour; +} +void Screen::PlotPixel24(u32 pixel_offset, RGBA Colour) +{ + framebuffer[pixel_offset++] = BLUE(Colour); + framebuffer[pixel_offset++] = GREEN(Colour); + framebuffer[pixel_offset++] = RED(Colour); +} +void Screen::PlotPixel16(u32 pixel_offset, RGBA Colour) +{ + *(unsigned short*)&framebuffer[pixel_offset] = ((RED(Colour) >> 3) << 11) | ((GREEN(Colour) >> 2) << 5) | (BLUE(Colour) >> 3); +} +void Screen::PlotPixel8(u32 pixel_offset, RGBA Colour) +{ + framebuffer[pixel_offset++] = RED(Colour); +} + +void Screen::ClipRect(u32& x1, u32& y1, u32& x2, u32& y2) +{ + if (x1 > width) x1 = width; + if (y1 > height) y1 = height; + if (x2 > width) x2 = width; + if (y2 > height) y2 = height; +} + +void Screen::ClearArea(u32 x1, u32 y1, u32 x2, u32 y2, RGBA colour) +{ + ClipRect(x1, y1, x2, y2); + + for (u32 y = y1; y < y2; y++) + { + u32 line = y * pitch; + for (u32 x = x1; x < x2; x++) + { + u32 pixel_offset = (x * (bpp >> 3)) + line; + (this->*Screen::plotPixelFn)(pixel_offset, colour); + } + } +} + +void Screen::ScrollArea(u32 x1, u32 y1, u32 x2, u32 y2) +{ + ClipRect(x1, y1, x2, y2); + + if (x2 - 1 <= x1) + return; + + for (u32 y = y1; y < y2; y++) + { + u32 line = y * pitch; + for (u32 x = x1; x < (x2 - 1); x++) + { + u32 pixel_offset = ((x + 1) * (bpp >> 3)) + line; + u32 pixel_offsetDest = (x * (bpp >> 3)) + line; + *(unsigned short*)&framebuffer[pixel_offsetDest] = *(unsigned short*)&framebuffer[pixel_offset]; + } + } +} + +void Screen::Clear(RGBA colour) +{ + ClearArea(0, 0, width, height, colour); +} + +void Screen::WriteChar(bool petscii, u32 x, u32 y, unsigned char c, RGBA colour) +{ + if (opened) + { + u32 fontHeight; + const unsigned char* fontBitMap; + if (petscii) + { + fontBitMap = CMBFont; + fontHeight = 8; + c = petscii2screen(c); + } + else + { + fontBitMap = avpriv_vga16_font; + fontHeight = BitFontHt; + } + for (u32 py = 0; py < fontHeight; ++py) + { + if (y + py > height) + return; + + unsigned char b = fontBitMap[c * fontHeight + py]; + int yoffs = (y + py) * pitch; + for (int px = 0; px < 8; ++px) + { + if (x + px > width) + continue; + + int pixel_offset = ((px + x) * (bpp >> 3)) + yoffs; + if ((b & 0x80) == 0x80) + (this->*Screen::plotPixelFn)(pixel_offset, colour); + b = b << 1; + } + } + } +} + +void Screen::PlotPixel(u32 x, u32 y, RGBA colour) +{ + int pixel_offset = (x * (bpp >> 3)) + (y * pitch); + (this->*Screen::plotPixelFn)(pixel_offset, colour); +} + +void Screen::DrawLine(u32 x1, u32 y1, u32 x2, u32 y2, RGBA colour) +{ + ClipRect(x1, y1, x2, y2); + + int dx0, dy0, ox, oy, eulerMax; + dx0 = (int)(x2 - x1); + dy0 = (int)(y2 - y1); + eulerMax = abs(dx0); + if (abs(dy0) > eulerMax) eulerMax = abs(dy0); + for (int i = 0; i <= eulerMax; i++) + { + ox = ((dx0 * i) / eulerMax) + x1; + oy = ((dy0 * i) / eulerMax) + y1; + int pixel_offset = (ox * (bpp >> 3)) + (oy * pitch); + (this->*Screen::plotPixelFn)(pixel_offset, colour); + } +} + +void Screen::DrawLineV(u32 x, u32 y1, u32 y2, RGBA colour) +{ + //ClipRect(x, y1, x, y2); + for (u32 y = y1; y <= y2; ++y) + { + int pixel_offset = (x * (bpp >> 3)) + (y * pitch); + (this->*Screen::plotPixelFn)(pixel_offset, colour); + } +} + +u32 Screen::PrintText(bool petscii, u32 x, u32 y, char *ptr, RGBA TxtColour, RGBA BkColour, bool measureOnly, u32* width, u32* height) +{ + int xCursor = x; + int yCursor = y; + int len = 0; + u32 fontHeight; + + if (petscii) fontHeight = 8; + else fontHeight = BitFontHt; + + if (width) *width = 0; + + while (*ptr != 0) + { + char c = *ptr++; + if ((c != '\r') && (c != '\n')) + { + if (!measureOnly) + { + ClearArea(xCursor, yCursor, xCursor + BitFontWth, yCursor + fontHeight, BkColour); + WriteChar(petscii, xCursor, yCursor, c, TxtColour); + } + xCursor += BitFontWth; + if (width) *width = MAX(*width, (u32)MAX(0, xCursor)); + } + else + { + xCursor = x; + yCursor += fontHeight; + } + len++; + } + if (height) *height = yCursor; + + return len; +} + +u32 Screen::MeasureText(bool petscii, char *ptr, u32* width, u32* height) +{ + return PrintText(petscii, 0, 0, ptr, 0, 0, true, width, height); +} + +void Screen::PlotImage(u32* image, int x, int y, int w, int h) +{ + int px; + int py; + int i = 0; + for (py = 0; py < h; ++py) + { + for (px = 0; px < w; ++px) + { + PlotPixel(x + px, y + py, image[i++]); + } + } +} diff --git a/Screen.h b/Screen.h new file mode 100644 index 0000000..13fcb10 --- /dev/null +++ b/Screen.h @@ -0,0 +1,88 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef SCREEN_H +#define SCREEN_H + +#include "types.h" + +typedef u32 RGBA; + +#define RED(colour) ( (u8)(((u32)colour) & 0xFF) ) +#define GREEN(colour) ( (u8)(((u32)colour >> 8) & 0xFF) ) +#define BLUE(colour) ( (u8)(((u32)colour >> 16) & 0xFF) ) +#define ALPHA(colour) ( (u8)(((u32)colour >> 24) & 0xFF) ) + +#define RGBA(r, g, b, a) ( ((u32)((u8)(r))) | ((u32)((u8)(g)) << 8) | ((u32)((u8)(b)) << 16) | ((u32)((u8)(a)) << 24) ) + +class Screen +{ + +public: + Screen() + : opened(false) + , width(0) + , height(0) + , bpp(0) + , pitch(0) + , framebuffer(0) + { + } + + void Open(u32 width, u32 height, u32 colourDepth); + + void ClearArea(u32 x1, u32 y1, u32 x2, u32 y2, RGBA colour); + void Clear(RGBA colour); + + void ScrollArea(u32 x1, u32 y1, u32 x2, u32 y2); + + void WriteChar(bool petscii, u32 x, u32 y, unsigned char c, RGBA colour); + u32 PrintText(bool petscii, u32 xPos, u32 yPos, char *ptr, RGBA TxtColour = RGBA(0xff, 0xff, 0xff, 0xff), RGBA BkColour = RGBA(0, 0, 0, 0xFF), bool measureOnly = false, u32* width = 0, u32* height = 0); + u32 MeasureText(bool petscii, char *ptr, u32* width = 0, u32* height = 0); + + void DrawLine(u32 x1, u32 y1, u32 x2, u32 y2, RGBA colour); + void DrawLineV(u32 x, u32 y1, u32 y2, RGBA colour); + void PlotPixel(u32 x, u32 y, RGBA colour); + + void PlotImage(u32* image, int x, int y, int w, int h); + + u32 Width() const { return width; } + u32 Height() const { return height; } + +private: + + typedef void (Screen::*PlotPixelFunction)(u32 pixel_offset, RGBA Colour); + + void PlotPixel32(u32 pixel_offset, RGBA Colour); + void PlotPixel24(u32 pixel_offset, RGBA Colour); + void PlotPixel16(u32 pixel_offset, RGBA Colour); + void PlotPixel8(u32 pixel_offset, RGBA Colour); + + void ClipRect(u32& x1, u32& y1, u32& x2, u32& y2); + + PlotPixelFunction plotPixelFn; + + bool opened; + u32 width; + u32 height; + u32 bpp; + u32 pitch; + volatile u8* framebuffer; +}; + +#endif \ No newline at end of file diff --git a/Singleton.h b/Singleton.h new file mode 100644 index 0000000..bc72b3e --- /dev/null +++ b/Singleton.h @@ -0,0 +1,51 @@ +#ifndef _Singleton_h_ +#define _Singleton_h_ + +#include "Types.h" + +template +class Singleton +{ +public: + static T* Instance() + { + if (m_pInstance == 0) + m_pInstance = new T; + + //assert(m_pInstance != 0); + + return m_pInstance; + }; + + static void DestroyInstance() + { + delete m_pInstance; + m_pInstance = 0; + }; + +protected: + + Singleton() + { + }; + + virtual ~Singleton() + { + }; + + static T* m_pInstance; + +private: + + Singleton(const Singleton& source) + { + }; + +}; + +template T* Singleton::m_pInstance = 0; + +#endif + + + diff --git a/Timer.c b/Timer.c new file mode 100644 index 0000000..ba37641 --- /dev/null +++ b/Timer.c @@ -0,0 +1,121 @@ +#include "timer.h" +#include "bcm2835int.h" +#include "rpiHardware.h" + +// Support functions for uspi +// Based on env\include\uspienv\timer.h + +// The number of 1MHz ticks for 10ms +#define TEN_MILLISECS (CLOCKHZ / HZ) + +static unsigned Ticks = 0; + +static volatile TKernelTimer m_KernelTimer[KERNEL_TIMERS]; // TODO: should be linked list + +static void TimerPollKernelTimers() +{ + //EnterCritical(); + + for (unsigned hTimer = 0; hTimer < KERNEL_TIMERS; hTimer++) + { + volatile TKernelTimer* pTimer = &m_KernelTimer[hTimer]; + + TKernelTimerHandler* pHandler = pTimer->m_pHandler; + if (pHandler != 0) + { + if ((int)(pTimer->m_nElapsesAt - Ticks) <= 0) + { + pTimer->m_pHandler = 0; + + (*pHandler)(hTimer + 1, pTimer->m_pParam, pTimer->m_pContext); + } + } + } + + //LeaveCritical(); +} + +static void TimerInterruptHandler(void* pParam) +{ + DataMemBarrier(); + + //assert(read32(ARM_SYSTIMER_CS) & (1 << 3)); + + u32 nCompare = read32(ARM_SYSTIMER_C3) + TEN_MILLISECS; + write32(ARM_SYSTIMER_C3, nCompare); + if (nCompare < read32(ARM_SYSTIMER_CLO)) // time may drift + { + nCompare = read32(ARM_SYSTIMER_CLO) + TEN_MILLISECS; + write32(ARM_SYSTIMER_C3, nCompare); + } + + write32(ARM_SYSTIMER_CS, 1 << 3); + + DataMemBarrier(); + + ++Ticks; + + TimerPollKernelTimers(); +} + +void TimerSystemInitialize() +{ + InterruptSystemConnectIRQ(ARM_IRQ_TIMER3, TimerInterruptHandler, 0); + + DataMemBarrier(); + + write32(ARM_SYSTIMER_CLO, -(30 * CLOCKHZ)); // timer wraps soon, to check for problems + + // Interrupt every 10ms + write32(ARM_SYSTIMER_C3, read32(ARM_SYSTIMER_CLO) + TEN_MILLISECS); + + DataMemBarrier(); + + for (unsigned hTimer = 0; hTimer < KERNEL_TIMERS; hTimer++) + { + m_KernelTimer[hTimer].m_pHandler = 0; + } + +} + +unsigned TimerStartKernelTimer(unsigned nDelay, TKernelTimerHandler* pHandler, void* pParam, void* pContext) +{ + //EnterCritical(); + +// DEBUG_LOG("Timer started\r\n"); + + unsigned hTimer; + for (hTimer = 0; hTimer < KERNEL_TIMERS; hTimer++) + { + if (m_KernelTimer[hTimer].m_pHandler == 0) + { + break; + } + } + + if (hTimer >= KERNEL_TIMERS) + { + //LeaveCritical(); + + DEBUG_LOG("System limit of kernel timers exceeded\r\n"); + + return 0; + } + + //assert(pHandler != 0); + m_KernelTimer[hTimer].m_pHandler = pHandler; + m_KernelTimer[hTimer].m_nElapsesAt = Ticks+nDelay; + m_KernelTimer[hTimer].m_pParam = pParam; + m_KernelTimer[hTimer].m_pContext = pContext; + + //LeaveCritical(); + + return hTimer+1; +} + +void TimerCancelKernelTimer(unsigned hTimer) +{ + //assert(1 <= hTimer && hTimer <= KERNEL_TIMERS); + m_KernelTimer[hTimer-1].m_pHandler = 0; +} + diff --git a/Timer.h b/Timer.h new file mode 100644 index 0000000..1378b8b --- /dev/null +++ b/Timer.h @@ -0,0 +1,46 @@ +#ifndef Timer_H +#define Timer_H +#include +#include "interrupt.h" + +// Support functions for uspi +// Based on env\include\uspienv\timer.h + +#ifdef __cplusplus +extern "C" { +#endif + +#define KERNEL_TIMERS 20 + +#define HZ 100 // ticks per second + +#define MSEC2HZ(msec) ((msec) * HZ / 1000) + + typedef void TKernelTimerHandler(unsigned hTimer, void* pParam, void* pContext); + + typedef struct TKernelTimer + { + TKernelTimerHandler* m_pHandler; + unsigned m_nElapsesAt; + void* m_pParam; + void* m_pContext; + } + TKernelTimer; + + void TimerSystemInitialize(); + +#define CLOCKHZ 1000000 + + unsigned TimerStartKernelTimer( + unsigned nDelay, // in HZ units + TKernelTimerHandler* pHandler, + void* pParam, + void* pContext); + void TimerCancelKernelTimer(unsigned hTimer); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/armc-cppstubs.cpp b/armc-cppstubs.cpp new file mode 100644 index 0000000..e1ea9c5 --- /dev/null +++ b/armc-cppstubs.cpp @@ -0,0 +1,42 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#include + +extern "C" void *__dso_handle = 0; + +void* operator new(size_t size) noexcept +{ + return malloc(size); +} + +void operator delete (void* ptr) +{ + free(ptr); +} + +namespace std +{ + void __throw_bad_alloc() + { + } + + void __throw_length_error(char const*e) + { + } +} \ No newline at end of file diff --git a/armc-cstartup.c b/armc-cstartup.c new file mode 100644 index 0000000..742c5c8 --- /dev/null +++ b/armc-cstartup.c @@ -0,0 +1,69 @@ +/* + + Part of the Raspberry-Pi Bare Metal Tutorials + Copyright (c) 2013, Brian Sidebotham + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +*/ + +extern int __bss_start__; +extern int __bss_end__; + +extern void kernel_main( unsigned int r0, unsigned int r1, unsigned int atags ); + +extern void __libc_init_array(); + +void _init(void) +{ +} + +void _cstartup( unsigned int r0, unsigned int r1, unsigned int r2 ) +{ + int* bss = &__bss_start__; + int* bss_end = &__bss_end__; + + /* + Clear the BSS section + + See http://en.wikipedia.org/wiki/.bss for further information on the + BSS section + + See https://sourceware.org/newlib/libc.html#Stubs for further + information on the c-library stubs + */ + while( bss < bss_end ) + *bss++ = 0; + + __libc_init_array(); + + /* We should never return from main ... */ + kernel_main( r0, r1, r2 ); + + /* ... but if we do, safely trap here */ + while(1) + { + /* EMPTY! */ + } +} diff --git a/armc-cstubs.c b/armc-cstubs.c new file mode 100644 index 0000000..46b6891 --- /dev/null +++ b/armc-cstubs.c @@ -0,0 +1,246 @@ +/* + + Part of the Raspberry-Pi Bare Metal Tutorials + Copyright (c) 2013-2015, Brian Sidebotham + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + */ + +/* For more information about this file, please visit: + https://sourceware.org/newlib/libc.html#Stubs + + These are the newlib C-Library stubs for the valvers Raspberry-Pi bare-metal + tutorial */ + +/* + Graceful failure is permitted by returning an error code. A minor + complication arises here: the C library must be compatible with development + environments that supply fully functional versions of these subroutines. + Such environments usually return error codes in a global errno. However, + the Red Hat newlib C library provides a macro definition for errno in the + header file errno.h, as part of its support for reentrant routines (see + Reentrancy). + + The bridge between these two interpretations of errno is straightforward: + the C library routines with OS interface calls capture the errno values + returned globally, and record them in the appropriate field of the + reentrancy structure (so that you can query them using the errno macro from + errno.h). + + This mechanism becomes visible when you write stub routines for OS + interfaces. You must include errno.h, then disable the macro, like this: + */ +#include +#undef errno +extern int errno; + +/* Required include for fstat() */ +#include + +/* Required include for times() */ +#include + +/* Prototype for the UART write function */ +#include "rpi-aux.h" + +/* A pointer to a list of environment variables and their values. For a minimal + environment, this empty list is adequate: */ +char *__env[1] = +{ 0 }; +char **environ = __env; + +/* A helper function written in assembler to aid us in allocating memory */ +//extern caddr_t _get_stack_pointer(void); + +/* Never return from _exit as there's no OS to exit to, so instead we trap + here */ +void _exit(int status) +{ + /* Stop the compiler complaining about unused variables by "using" it */ + (void) status; + + while (1) + { + /* TRAP HERE */ + } +} + +/* There's currently no implementation of a file system because there's no + file system! */ +int _close(int file) +{ + return -1; +} + +/* Transfer control to a new process. Minimal implementation (for a system + without processes): */ +int execve(char *name, char **argv, char **env) +{ + errno = ENOMEM; + return -1; +} + +/* Create a new process. Minimal implementation (for a system without + processes): */ +int fork(void) +{ + errno = EAGAIN; + return -1; +} + +/* Status of an open file. For consistency with other minimal implementations + in these examples, all files are regarded as character special devices. The + sys/stat.h header file required is distributed in the include subdirectory + for this C library. */ +int _fstat(int file, struct stat *st) +{ + st->st_mode = S_IFCHR; + return 0; +} + +/* Process-ID; this is sometimes used to generate strings unlikely to conflict + with other processes. Minimal implementation, for a system without + processes: */ +int getpid(void) +{ + return 1; +} +int _getpid(void) +{ + return 1; +} + +/* Query whether output stream is a terminal. For consistency with the other + minimal implementations, which only support output to stdout, this minimal + implementation is suggested: */ +int _isatty(int file) +{ + return 1; +} + +/* Send a signal. Minimal implementation: */ +int kill(int pid, int sig) +{ + errno = EINVAL; + return -1; +} +int _kill(int pid, int sig) +{ + errno = EINVAL; + return -1; +} + +/* Establish a new name for an existing file. Minimal implementation: */ +int link( char *old, char *pnew ) +{ + errno = EMLINK; + return -1; +} + +/* Set position in a file. Minimal implementation: */ +int _lseek(int file, int ptr, int dir) +{ + return 0; +} + +/* Open a file. Minimal implementation: */ +int open(const char *name, int flags, int mode) +{ + return -1; +} + +/* Read from a file. Minimal implementation: */ +int _read(int file, char *ptr, int len) +{ + return 0; +} + +/* Increase program data space. As malloc and related functions depend on this, + it is useful to have a working implementation. The following suffices for a + standalone system; it exploits the symbol _end automatically defined by the + GNU linker. */ +caddr_t _sbrk(int incr) +{ + extern char _end; + static char* heap_end = 0; + char* prev_heap_end; + + if (heap_end == 0) + heap_end = &_end; + + prev_heap_end = heap_end; + heap_end += incr; + + return (caddr_t) prev_heap_end; +} + +/* Status of a file (by name). Minimal implementation: */ +int stat(const char *file, struct stat *st) +{ + st->st_mode = S_IFCHR; + return 0; +} + +/* Timing information for current process. Minimal implementation: */ +clock_t times(struct tms *buf) +{ + return -1; +} + +/* Remove a file's directory entry. Minimal implementation: */ +int unlink(char *name) +{ + errno = ENOENT; + return -1; +} + +/* Wait for a child process. Minimal implementation: */ +int wait(int *status) +{ + errno = ECHILD; + return -1; +} + +void outbyte(char b) +{ + RPI_AuxMiniUartWrite(b); +} + +/* Write to a file. libc subroutines will use this system routine for output to + all files, including stdout—so if you need to generate any output, for + example to a serial port for debugging, you should make your minimal write + capable of doing this. The following minimal implementation is an + incomplete example; it relies on a outbyte subroutine (not shown; typically, + you must write this in assembler from examples provided by your hardware + manufacturer) to actually perform the output. */ +int _write(int file, char *ptr, int len) +{ + int todo; + + for (todo = 0; todo < len; todo++) + outbyte(*ptr++); + + return len; +} diff --git a/armc-start.S b/armc-start.S new file mode 100644 index 0000000..578bfcd --- /dev/null +++ b/armc-start.S @@ -0,0 +1,510 @@ + +// Part of the Raspberry-Pi Bare Metal Tutorials +// Copyright (c) 2013-2015, Brian Sidebotham +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +// Relocate to just below 32MB + +#include "defs.h" + +.equ STACK_SIZE, 0x00100000 + +.equ C0_SVR_STACK, 0 +.equ C0_IRQ_STACK, (STACK_SIZE*1) +.equ C0_FIQ_STACK, STACK_SIZE*2 +.equ C0_USER_STACK, STACK_SIZE*4 +.equ C0_ABORT_STACK, STACK_SIZE*5 +.equ C0_UNDEFINED_STACK, STACK_SIZE*6 + +#if defined(RPI2) || defined(RPI3) +.equ C1_SVR_STACK, STACK_SIZE*7 +.equ C1_IRQ_STACK, STACK_SIZE*8 +.equ C1_FIQ_STACK, STACK_SIZE*9 +.equ C1_USER_STACK, STACK_SIZE*10 +.equ C1_ABORT_STACK, STACK_SIZE*11 +.equ C1_UNDEFINED_STACK, STACK_SIZE*12 +#endif + +.equ SCTLR_ENABLE_DATA_CACHE, 0x4 +.equ SCTLR_ENABLE_BRANCH_PREDICTION, 0x800 +.equ SCTLR_ENABLE_INSTRUCTION_CACHE, 0x1000 + +.section ".text.startup" + +.global _start +.global _get_cpsr +.global _get_stack_pointer +.global _exception_table +.global _enable_interrupts +.global _disable_interrupts +.global _enable_unaligned_access +.global _enable_l1_cache +.global _invalidate_icache +.global _invalidate_dcache +.global _clean_invalidate_dcache +.global _invalidate_dcache_mva +.global _clean_invalidate_dcache_mva +.global _invalidate_dtlb +.global _invalidate_dtlb_mva +.global _data_memory_barrier + +#ifdef HAS_MULTICORE +.global _get_core +.global _init_core +.global _spin_core +#endif + +#if defined(HAS_40PINS) +.global _toggle_test_pin +#endif + +// From the ARM ARM (Architecture Reference Manual). Make sure you get the +// ARMv5 documentation which includes the ARMv6 documentation which is the +// correct processor type for the Broadcom BCM2835. The ARMv6-M manuals +// available on the ARM website are for Cortex-M parts only and are very +// different. +// +// See ARM section A2.2 (Processor Modes) + +.equ CPSR_MODE_USER, 0x10 +.equ CPSR_MODE_FIQ, 0x11 +.equ CPSR_MODE_IRQ, 0x12 +.equ CPSR_MODE_SVR, 0x13 +.equ CPSR_MODE_ABORT, 0x17 +.equ CPSR_MODE_HYP, 0x1A +.equ CPSR_MODE_UNDEFINED, 0x1B +.equ CPSR_MODE_SYSTEM, 0x1F + +.equ CPSR_MODE_MASK, 0x1F + +// See ARM section A2.5 (Program status registers) +.equ CPSR_A_BIT, 0x100 +.equ CPSR_IRQ_INHIBIT, 0x80 +.equ CPSR_FIQ_INHIBIT, 0x40 +.equ CPSR_THUMB, 0x20 + +_start: + ldr pc, _reset_h + ldr pc, _undefined_instruction_vector_h + ldr pc, _software_interrupt_vector_h + ldr pc, _prefetch_abort_vector_h + ldr pc, _data_abort_vector_h + ldr pc, _unused_handler_h + ldr pc, _interrupt_vector_h + ldr pc, _fast_interrupt_vector_h + +_reset_h: .word _reset_ +_undefined_instruction_vector_h: .word _undefined_instruction_handler_ +_software_interrupt_vector_h: .word _swi_handler_ +_prefetch_abort_vector_h: .word _prefetch_abort_handler_ +_data_abort_vector_h: .word _data_abort_handler_ +_unused_handler_h: .word _reset_ +_interrupt_vector_h: .word arm_irq_handler +_fast_interrupt_vector_h: .word arm_fiq_handler + +.section ".text._reset_" +_reset_: + BL _enable_l1_cache +#ifdef HAS_MULTICORE + +#ifdef KERNEL_OLD + + // if kernel_old=1 all cores are running and we need to sleep 1-3 + // if kernel_old=0 then just core0 is running, and core 1-3 are waiting + // on a mailbox write to be woken up. + // + // Test which core we are running on + mrc p15, 0, r0, c0, c0, 5 + ands r0, #3 + beq _core_continue + // Put cores 1-3 into a tight loop +_core_loop: + wfi + b _core_loop +_core_continue: + +#else + + // if kernel_old=0 enter in HYP mode and need to force a switch to SVC mode + // + // for now we assume kernel_old=1 and don't execute this core + // + // The logs show: + // SVC mode: cpsr ends with 1d3 + // HYP mode: cpsr ends with 1a3 + mrs r0, cpsr + eor r0, r0, #CPSR_MODE_HYP + tst r0, #CPSR_MODE_MASK + bic r0 , r0 , #CPSR_MODE_MASK + orr r0 , r0 , #CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT | CPSR_MODE_SVR + bne _not_in_hyp_mode + orr r0, r0, #CPSR_A_BIT + adr lr, _reset_continue + msr spsr_cxsf, r0 + .word 0xE12EF30E // msr_elr_hyp lr + .word 0xE160006E // eret +_not_in_hyp_mode: + msr cpsr_c, r0 +_reset_continue: +#endif + +#endif + + // We enter execution in supervisor mode. For more information on + // processor modes see ARM Section A2.2 (Processor Modes) + + ldr r0,=_start + mov r1, #0x00000000 + ldmia r0!,{r2, r3, r4, r5, r6, r7, r8, r9} + stmia r1!,{r2, r3, r4, r5, r6, r7, r8, r9} + ldmia r0!,{r2, r3, r4, r5, r6, r7, r8, r9} + stmia r1!,{r2, r3, r4, r5, r6, r7, r8, r9} + + // Initialise Stack Pointers --------------------------------------------- + ldr r4,=_start + + // We're going to use interrupt mode, so setup the interrupt mode + // stack pointer which differs to the application stack pointer: + mov r0, #(CPSR_MODE_IRQ | CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT ) + msr cpsr_c, r0 + sub sp, r4, #C0_IRQ_STACK + + // Also setup the stack used for FIQs + mov r0, #(CPSR_MODE_FIQ | CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT ) + msr cpsr_c, r0 + sub sp, r4, #C0_FIQ_STACK + + // Also setup the stack used for undefined exceptions + mov r0, #(CPSR_MODE_UNDEFINED | CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT ) + msr cpsr_c, r0 + sub sp, r4, #C0_UNDEFINED_STACK + + // Also setup the stack used for prefetch and data abort exceptions + mov r0, #(CPSR_MODE_ABORT | CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT ) + msr cpsr_c, r0 + sub sp, r4, #C0_ABORT_STACK + + // Finally, a user/system mode stack, although the application will likely reset this + mov r0, #(CPSR_MODE_SYSTEM | CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT ) + msr cpsr_c, r0 + sub sp, r4, #C0_USER_STACK + + // Switch back to supervisor mode (our application mode) and + // set the stack pointer. Remember that the stack works its way + // down memory, our heap will work it's way up from after the + // application. + mov r0, #(CPSR_MODE_SVR | CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT ) + msr cpsr_c, r0 + sub sp, r4, #C0_SVR_STACK + + // Enable VFP ------------------------------------------------------------ + +#ifdef HAS_MULTICORE + //1. Set the CPACR for access to CP10 and CP11, and clear the ASEDIS and D32DIS bits: + ldr r0, =(0xf << 20) + mcr p15, 0, r0, c1, c0, 2 + + // 2. Set the FPEXC EN bit to enable the NEON MPE: + mov r0, #0x40000000 + vmsr fpexc, r0 + +#else + // r1 = Access Control Register + MRC p15, #0, r1, c1, c0, #2 + // enable full access for p10,11 + ORR r1, r1, #(0xf << 20) + // ccess Control Register = r1 + MCR p15, #0, r1, c1, c0, #2 + MOV r1, #0 + // flush prefetch buffer because of FMXR below + MCR p15, #0, r1, c7, c5, #4 + // and CP 10 & 11 were only just enabled + // Enable VFP itself + MOV r0,#0x40000000 + // FPEXC = r0 + FMXR FPEXC, r0 +#endif + + // The c-startup function which we never return from. This function will + // initialise the ro data section (most things that have the const + // declaration) and initialise the bss section variables to 0 (generally + // known as automatics). It'll then call main + + b _cstartup + + +arm_fiq_handler: +arm_irq_handler: + //subs pc, lr, #4 + sub lr, lr, #4 /* lr: return address */ + stmfd sp!, {r0-r12, lr} /* save r0-r12 and return address */ + bl InterruptHandler + ldmfd sp!, {r0-r12, pc}^ /* restore registers and return */ + +.section ".text._get_stack_pointer" +_get_stack_pointer: + mov r0, sp + mov pc, lr + +.section ".text._get_cpsr" +_get_cpsr: + mrs r0, cpsr + mov pc, lr + +.section ".text._enable_interrupts" +_enable_interrupts: + mrs r0, cpsr + bic r0, r0, #CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT + msr cpsr_c, r0 + mov pc, lr + +.section ".text._disable_interrupts" +_disable_interrupts: + mrs r0, cpsr + orr r1, r0, #CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT + msr cpsr_c, r1 + mov pc, lr + +.section ".text._undefined_instruction_handler_" +_undefined_instruction_handler_: + stmfd sp!, {r0-r12, lr} + mrs r0, spsr // Get spsr. + stmfd sp!, {r0} // Store spsr onto stack. + mov r0, sp + bl undefined_instruction_handler + +.section ".text._prefetch_abort_handler_" +_prefetch_abort_handler_: + stmfd sp!, {r0-r12, lr} + mrs r0, spsr // Get spsr. + stmfd sp!, {r0} // Store spsr onto stack. + mov r0, sp + bl prefetch_abort_handler + +.section ".text._data_abort_handler_" +_data_abort_handler_: + stmfd sp!, {r0-r12, lr} + mrs r0, spsr // Get spsr. + stmfd sp!, {r0} // Store spsr onto stack. + mov r0, sp + bl data_abort_handler + +.section ".text._swi_handler_" +_swi_handler_: + stmfd sp!, {r0-r12, lr} + mrs r0, spsr // Get spsr. + stmfd sp!, {r0} // Store spsr onto stack. + mov r0, sp + bl swi_handler + +.section ".text._enable_unaligned_access" +_enable_unaligned_access: + mrc p15, 0, r0, c1, c0, 0 // read SCTLR + bic r0, r0, #2 // A (no unaligned access fault) + orr r0, r0, #1 << 22 // U (v6 unaligned access model) + mcr p15, 0, r0, c1, c0, 0 // write SCTLR + mov pc, lr + + // Enable L1 Cache ------------------------------------------------------- +.section ".text._enable_l1_cache" +_enable_l1_cache: + + // R0 = System Control Register + mrc p15,0,r0,c1,c0,0 + + // Enable caches and branch prediction + orr r0,#SCTLR_ENABLE_BRANCH_PREDICTION + orr r0,#SCTLR_ENABLE_DATA_CACHE + orr r0,#SCTLR_ENABLE_INSTRUCTION_CACHE + + // System Control Register = R0 + mcr p15,0,r0,c1,c0,0 + + mov pc, lr + +.section ".text._invalidate_icache" +_invalidate_icache: + mov r0, #0 + mcr p15, 0, r0, c7, c5, 0 + mov pc, lr + +.section ".text._invalidate_dcache" +_invalidate_dcache: + mov r0, #0 + mcr p15, 0, r0, c7, c6, 0 + mov pc, lr + +.section ".text._clean_invalidate_dcache" +_clean_invalidate_dcache: + mov r0, #0 + mcr p15, 0, r0, c7, c14, 0 + mov pc, lr + +.section ".text._invalidate_dcache_mva" +_invalidate_dcache_mva: + mcr p15, 0, r0, c7, c6, 1 + mov pc, lr + +.section ".text._clean_invalidate_dcache_mva" +_clean_invalidate_dcache_mva: + mcr p15, 0, r0, c7, c14, 1 + mov pc, lr + +.section ".text._invalidate_dtlb" +_invalidate_dtlb: + mov r0, #0 + mcr p15, 0, r0, c8, c6, 0 + mov pc, lr + +.section ".text._invalidate_dtlb_mva" +_invalidate_dtlb_mva: + mcr p15, 0, r0, c8, c6, 1 + mov pc, lr + +.section ".text._data_memory_barrier" +_data_memory_barrier: +#if defined(RPI2) || defined(RPI3) + dmb +#else + mov r0, #0 + mcr p15, 0, r0, c7, c10, 5 +#endif + mov pc, lr + +#ifdef USE_MULTICORE + +_init_core: + // On a Raspberry Pi 2 we enter in HYP mode, and need to force a switch to supervisor mode + mrs r0, cpsr + eor r0, r0, #CPSR_MODE_HYP + tst r0, #CPSR_MODE_MASK + bic r0 , r0 , #CPSR_MODE_MASK + orr r0 , r0 , #CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT | CPSR_MODE_SVR + bne _init_not_in_hyp_mode + orr r0, r0, #CPSR_A_BIT + adr lr, _init_continue + msr spsr_cxsf, r0 + .word 0xE12EF30E // msr_elr_hyp lr + .word 0xE160006E // eret +_init_not_in_hyp_mode: + msr cpsr_c, r0 + +_init_continue: + ldr r4,=_start + // Initialise Stack Pointers --------------------------------------------- + + // We're going to use interrupt mode, so setup the interrupt mode + // stack pointer which differs to the application stack pointer: + mov r0, #(CPSR_MODE_IRQ | CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT ) + msr cpsr_c, r0 + sub sp, r4, # C1_IRQ_STACK + + // Also setup the stack used for FIQs + mov r0, #(CPSR_MODE_FIQ | CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT ) + msr cpsr_c, r0 + sub sp, r4, # C1_FIQ_STACK + + // Also setup the stack used for undefined exceptions + mov r0, #(CPSR_MODE_UNDEFINED | CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT ) + msr cpsr_c, r0 + sub sp, r4, # C1_UNDEFINED_STACK + + // Also setup the stack used for prefetch and data abort exceptions + mov r0, #(CPSR_MODE_ABORT | CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT ) + msr cpsr_c, r0 + sub sp, r4, # C1_ABORT_STACK + + // Finally, a user/system mode stack, although the application will likely reset this + mov r0, #(CPSR_MODE_SYSTEM | CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT ) + msr cpsr_c, r0 + sub sp, r4, # C1_USER_STACK + + // Switch back to supervisor mode (our application mode) and + // set the stack pointer. Remember that the stack works its way + // down memory, our heap will work it's way up from after the + // application. + mov r0, #(CPSR_MODE_SVR | CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT ) + msr cpsr_c, r0 + sub sp, r4, # C1_SVR_STACK + + // Enable VFP ------------------------------------------------------------ + + //1. Set the CPACR for access to CP10 and CP11, and clear the ASEDIS and D32DIS bits: + ldr r0, =(0xf << 20) + mcr p15, 0, r0, c1, c0, 2 + + // 2. Set the FPEXC EN bit to enable the NEON MPE: + mov r0, #0x40000000 + vmsr fpexc, r0 + + bl run_core +#endif + +#ifdef HAS_MULTICORE + + // If main does return for some reason, just catch it and stay here. +_spin_core: +#ifdef DEBUG + mov r0, #'S' + bl RPI_AuxMiniUartWrite + mov r0, #'P' + bl RPI_AuxMiniUartWrite + mov r0, #'I' + bl RPI_AuxMiniUartWrite + mov r0, #'N' + bl RPI_AuxMiniUartWrite + bl _get_core + add r0, r0, #'0' + bl RPI_AuxMiniUartWrite + mov r0, #'\r' + bl RPI_AuxMiniUartWrite + mov r0, #'\n' + bl RPI_AuxMiniUartWrite +#endif +_spin_core1: + wfi + b _spin_core1 + +_get_core: + mrc p15, 0, r0, c0, c0, 5 + and r0, #3 + mov pc, lr + +#endif + +#ifdef HAS_40PINS +.section ".text._toggle_test_pin" +_toggle_test_pin: + mov r1, #TEST_MASK +_toggle_test_pin_loop: + ldr r2, =GPSET0 + str r1, [r2] + ldr r2, =GPCLR0 + str r1, [r2] + subs r0, r0, #1 + bne _toggle_test_pin_loop + mov pc, lr +#endif + diff --git a/bcm2835int.h b/bcm2835int.h new file mode 100644 index 0000000..6f38120 --- /dev/null +++ b/bcm2835int.h @@ -0,0 +1,109 @@ +// +// bcm2835int.h +// +// The IRQ list is taken from Linux and is: +// Copyright (C) 2010 Broadcom +// Copyright (C) 2003 ARM Limited +// Copyright (C) 2000 Deep Blue Solutions Ltd. +// Licensed under GPL2 +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspienv_bcm2835int_h +#define _uspienv_bcm2835int_h + +#define ARM_IRQS_PER_REG 32 + +#define ARM_IRQ1_BASE 0 +#define ARM_IRQ2_BASE (ARM_IRQ1_BASE + ARM_IRQS_PER_REG) // Bitmask of pending shared IRQs 0-31 +#define ARM_IRQBASIC_BASE (ARM_IRQ2_BASE + ARM_IRQS_PER_REG) // Bitmask of pending shared IRQs 32-63 + +#define ARM_IRQ_TIMER0 (ARM_IRQ1_BASE + 0) +#define ARM_IRQ_TIMER1 (ARM_IRQ1_BASE + 1) +#define ARM_IRQ_TIMER2 (ARM_IRQ1_BASE + 2) +#define ARM_IRQ_TIMER3 (ARM_IRQ1_BASE + 3) +#define ARM_IRQ_CODEC0 (ARM_IRQ1_BASE + 4) +#define ARM_IRQ_CODEC1 (ARM_IRQ1_BASE + 5) +#define ARM_IRQ_CODEC2 (ARM_IRQ1_BASE + 6) +#define ARM_IRQ_JPEG (ARM_IRQ1_BASE + 7) +#define ARM_IRQ_ISP (ARM_IRQ1_BASE + 8) +#define ARM_IRQ_USB (ARM_IRQ1_BASE + 9) +#define ARM_IRQ_3D (ARM_IRQ1_BASE + 10) +#define ARM_IRQ_TRANSPOSER (ARM_IRQ1_BASE + 11) +#define ARM_IRQ_MULTICORESYNC0 (ARM_IRQ1_BASE + 12) +#define ARM_IRQ_MULTICORESYNC1 (ARM_IRQ1_BASE + 13) +#define ARM_IRQ_MULTICORESYNC2 (ARM_IRQ1_BASE + 14) +#define ARM_IRQ_MULTICORESYNC3 (ARM_IRQ1_BASE + 15) +#define ARM_IRQ_DMA0 (ARM_IRQ1_BASE + 16) +#define ARM_IRQ_DMA1 (ARM_IRQ1_BASE + 17) +#define ARM_IRQ_DMA2 (ARM_IRQ1_BASE + 18) +#define ARM_IRQ_DMA3 (ARM_IRQ1_BASE + 19) +#define ARM_IRQ_DMA4 (ARM_IRQ1_BASE + 20) +#define ARM_IRQ_DMA5 (ARM_IRQ1_BASE + 21) +#define ARM_IRQ_DMA6 (ARM_IRQ1_BASE + 22) +#define ARM_IRQ_DMA7 (ARM_IRQ1_BASE + 23) +#define ARM_IRQ_DMA8 (ARM_IRQ1_BASE + 24) +#define ARM_IRQ_DMA9 (ARM_IRQ1_BASE + 25) +#define ARM_IRQ_DMA10 (ARM_IRQ1_BASE + 26) +#define ARM_IRQ_DMA11 (ARM_IRQ1_BASE + 27) +#define ARM_IRQ_DMA12 (ARM_IRQ1_BASE + 28) +#define ARM_IRQ_AUX (ARM_IRQ1_BASE + 29) +#define ARM_IRQ_ARM (ARM_IRQ1_BASE + 30) +#define ARM_IRQ_VPUDMA (ARM_IRQ1_BASE + 31) + +#define ARM_IRQ_HOSTPORT (ARM_IRQ2_BASE + 0) +#define ARM_IRQ_VIDEOSCALER (ARM_IRQ2_BASE + 1) +#define ARM_IRQ_CCP2TX (ARM_IRQ2_BASE + 2) +#define ARM_IRQ_SDC (ARM_IRQ2_BASE + 3) +#define ARM_IRQ_DSI0 (ARM_IRQ2_BASE + 4) +#define ARM_IRQ_AVE (ARM_IRQ2_BASE + 5) +#define ARM_IRQ_CAM0 (ARM_IRQ2_BASE + 6) +#define ARM_IRQ_CAM1 (ARM_IRQ2_BASE + 7) +#define ARM_IRQ_HDMI0 (ARM_IRQ2_BASE + 8) +#define ARM_IRQ_HDMI1 (ARM_IRQ2_BASE + 9) +#define ARM_IRQ_PIXELVALVE1 (ARM_IRQ2_BASE + 10) +#define ARM_IRQ_I2CSPISLV (ARM_IRQ2_BASE + 11) +#define ARM_IRQ_DSI1 (ARM_IRQ2_BASE + 12) +#define ARM_IRQ_PWA0 (ARM_IRQ2_BASE + 13) +#define ARM_IRQ_PWA1 (ARM_IRQ2_BASE + 14) +#define ARM_IRQ_CPR (ARM_IRQ2_BASE + 15) +#define ARM_IRQ_SMI (ARM_IRQ2_BASE + 16) +#define ARM_IRQ_GPIO0 (ARM_IRQ2_BASE + 17) +#define ARM_IRQ_GPIO1 (ARM_IRQ2_BASE + 18) +#define ARM_IRQ_GPIO2 (ARM_IRQ2_BASE + 19) +#define ARM_IRQ_GPIO3 (ARM_IRQ2_BASE + 20) +#define ARM_IRQ_I2C (ARM_IRQ2_BASE + 21) +#define ARM_IRQ_SPI (ARM_IRQ2_BASE + 22) +#define ARM_IRQ_I2SPCM (ARM_IRQ2_BASE + 23) +#define ARM_IRQ_SDIO (ARM_IRQ2_BASE + 24) +#define ARM_IRQ_UART (ARM_IRQ2_BASE + 25) +#define ARM_IRQ_SLIMBUS (ARM_IRQ2_BASE + 26) +#define ARM_IRQ_VEC (ARM_IRQ2_BASE + 27) +#define ARM_IRQ_CPG (ARM_IRQ2_BASE + 28) +#define ARM_IRQ_RNG (ARM_IRQ2_BASE + 29) +#define ARM_IRQ_ARASANSDIO (ARM_IRQ2_BASE + 30) +#define ARM_IRQ_AVSPMON (ARM_IRQ2_BASE + 31) + +#define ARM_IRQ_ARM_TIMER (ARM_IRQBASIC_BASE + 0) +#define ARM_IRQ_ARM_MAILBOX (ARM_IRQBASIC_BASE + 1) +#define ARM_IRQ_ARM_DOORBELL_0 (ARM_IRQBASIC_BASE + 2) +#define ARM_IRQ_ARM_DOORBELL_1 (ARM_IRQBASIC_BASE + 3) +#define ARM_IRQ_VPU0_HALTED (ARM_IRQBASIC_BASE + 4) +#define ARM_IRQ_VPU1_HALTED (ARM_IRQBASIC_BASE + 5) +#define ARM_IRQ_ILLEGAL_TYPE0 (ARM_IRQBASIC_BASE + 6) +#define ARM_IRQ_ILLEGAL_TYPE1 (ARM_IRQBASIC_BASE + 7) + +#define IRQ_LINES (ARM_IRQS_PER_REG * 2 + 8) + +#endif diff --git a/cache.c b/cache.c new file mode 100644 index 0000000..d8348b2 --- /dev/null +++ b/cache.c @@ -0,0 +1,302 @@ +// Part of PiTubeDirect +// https://github.com/hoglet67/PiTubeDirect + +#include +#include +#include "startup.h" +#include "rpi-base.h" +#include "cache.h" +#include "defs.h" + +// Historical Note: +// Were seeing core 3 crashes if inner *and* outer both set to some flavour of WB (i.e. 1 or 3) +// The point of crashing is when the data cache is enabled +// At that point, the stack appears to vanish and the data read back is 0x55555555 +// Reason turned out to be failure to correctly invalidate the entire data cache + +const static unsigned l1_cached_threshold = L2_CACHED_MEM_BASE >> 20; +const static unsigned l2_cached_threshold = UNCACHED_MEM_BASE >> 20; +const static unsigned uncached_threshold = PERIPHERAL_BASE >> 20; + +volatile __attribute__ ((aligned (0x4000))) unsigned PageTable[4096]; +volatile __attribute__ ((aligned (0x4000))) unsigned PageTable2[NUM_4K_PAGES]; + +const static int aa = 1; +const static int bb = 1; +const static int shareable = 1; + +#if defined(RPI2) || defined (RPI3) + +#define SETWAY_LEVEL_SHIFT 1 + +// 4 ways x 128 sets x 64 bytes per line 32KB +#define L1_DATA_CACHE_SETS 128 +#define L1_DATA_CACHE_WAYS 4 +#define L1_SETWAY_WAY_SHIFT 30 // 32-Log2(L1_DATA_CACHE_WAYS) +#define L1_SETWAY_SET_SHIFT 6 // Log2(L1_DATA_CACHE_LINE_LENGTH) + +#if defined(RPI2) +// 8 ways x 1024 sets x 64 bytes per line = 512KB +#define L2_CACHE_SETS 1024 +#define L2_CACHE_WAYS 8 +#define L2_SETWAY_WAY_SHIFT 29 // 32-Log2(L2_CACHE_WAYS) +#else +// 16 ways x 512 sets x 64 bytes per line = 512KB +#define L2_CACHE_SETS 512 +#define L2_CACHE_WAYS 16 +#define L2_SETWAY_WAY_SHIFT 28 // 32-Log2(L2_CACHE_WAYS) +#endif + +#define L2_SETWAY_SET_SHIFT 6 // Log2(L2_CACHE_LINE_LENGTH) + +// The origin of this function is: +// https://github.com/rsta2/uspi/blob/master/env/lib/synchronize.c + +void InvalidateDataCache (void) +{ + unsigned nSet; + unsigned nWay; + uint32_t nSetWayLevel; + // invalidate L1 data cache + for (nSet = 0; nSet < L1_DATA_CACHE_SETS; nSet++) { + for (nWay = 0; nWay < L1_DATA_CACHE_WAYS; nWay++) { + nSetWayLevel = nWay << L1_SETWAY_WAY_SHIFT + | nSet << L1_SETWAY_SET_SHIFT + | 0 << SETWAY_LEVEL_SHIFT; + asm volatile ("mcr p15, 0, %0, c7, c6, 2" : : "r" (nSetWayLevel) : "memory"); // DCISW + } + } + + // invalidate L2 unified cache + for (nSet = 0; nSet < L2_CACHE_SETS; nSet++) { + for (nWay = 0; nWay < L2_CACHE_WAYS; nWay++) { + nSetWayLevel = nWay << L2_SETWAY_WAY_SHIFT + | nSet << L2_SETWAY_SET_SHIFT + | 1 << SETWAY_LEVEL_SHIFT; + asm volatile ("mcr p15, 0, %0, c7, c6, 2" : : "r" (nSetWayLevel) : "memory"); // DCISW + } + } +} + +void CleanDataCache (void) +{ + unsigned nSet; + unsigned nWay; + uint32_t nSetWayLevel; + // clean L1 data cache + for (nSet = 0; nSet < L1_DATA_CACHE_SETS; nSet++) { + for (nWay = 0; nWay < L1_DATA_CACHE_WAYS; nWay++) { + nSetWayLevel = nWay << L1_SETWAY_WAY_SHIFT + | nSet << L1_SETWAY_SET_SHIFT + | 0 << SETWAY_LEVEL_SHIFT; + asm volatile ("mcr p15, 0, %0, c7, c10, 2" : : "r" (nSetWayLevel) : "memory"); + } + } + + // clean L2 unified cache + for (nSet = 0; nSet < L2_CACHE_SETS; nSet++) { + for (nWay = 0; nWay < L2_CACHE_WAYS; nWay++) { + nSetWayLevel = nWay << L2_SETWAY_WAY_SHIFT + | nSet << L2_SETWAY_SET_SHIFT + | 1 << SETWAY_LEVEL_SHIFT; + asm volatile ("mcr p15, 0, %0, c7, c10, 2" : : "r" (nSetWayLevel) : "memory"); + } + } +} +#endif + +// TLB 4KB Section Descriptor format +// 31..12 Section Base Address +// 11..9 - unused, set to zero +// 8..6 TEX - type extension- TEX, C, B used together, see below +// 5..4 AP - access ctrl - set to 11 for full access from user and super modes +// 3 C - cacheable - TEX, C, B used together, see below +// 2 B - bufferable - TEX, C, B used together, see below +// 1 1 +// 0 1 + +void map_4k_page(int logical, int physical) { + // Invalidate the data TLB before changing mapping + _invalidate_dtlb_mva((void *)(logical << 12)); + // Setup the 4K page table entry + // Second level descriptors use extended small page format so inner/outer cacheing can be controlled + // Pi 0/1: + // XP (bit 23) in SCTRL is 0 so descriptors use ARMv4/5 backwards compatible format + // Pi 2/3: + // XP (bit 23) in SCTRL no longer exists, and we see to be using ARMv6 table formats + // this means bit 0 of the page table is actually XN and must be clear to allow native ARM code to execute + // (this was the cause of issue #27) +#if defined(RPI2) || defined (RPI3) + PageTable2[logical] = (physical<<12) | 0x132 | (bb << 6) | (aa << 2); +#else + PageTable2[logical] = (physical<<12) | 0x133 | (bb << 6) | (aa << 2); +#endif +} + +void enable_MMU_and_IDCaches(void) +{ + + //DEBUG_LOG("enable_MMU_and_IDCaches\r\n"); + //DEBUG_LOG("cpsr = %08x\r\n", _get_cpsr()); + + unsigned i; + unsigned base; + + // TLB 1MB Sector Descriptor format + // 31..20 Section Base Address + // 19 NS - ? - set to 0 + // 18 0 - - set to 0 + // 17 nG - ? - set to 0 + // 16 S - ? - set to 0 + // 15 APX - access ctrl - set to 0 for full access from user and super modes + // 14..12 TEX - type extension- TEX, C, B used together, see below + // 11..10 AP - access ctrl - set to 11 for full access from user and super modes + // 9 P - - set to 0 + // 8..5 Domain- access domain - set to 0000 as nor using access ctrl + // 4 XN - eXecute Never - set to 1 for I/O devices + // 3 C - cacheable - set to 1 for cachable RAM i + // 2 B - bufferable - set to 1 for cachable RAM + // 1 1 - TEX, C, B used together, see below + // 0 0 - TEX, C, B used together, see below + + // For I/O devices + // TEX = 000; C=0; B=1 (Shared device) + + // For cacheable RAM + // TEX = 001; C=1; B=1 (Outer and inner write back, write allocate) + + // For non-cachable RAM + // TEX = 001; C=0; B=0 (Outer and inner non-cacheable) + + // For individual control + // TEX = 1BB CB=AA + // AA = inner policy + // BB = outer policy + // 00 = NC (non-cacheable) + // 01 = WBWA (write-back, write allocate) + // 10 = WT (write-through + // 11 = WBNWA (write-back, no write allocate) + /// TEX = 100; C=0; B=1 (outer non cacheable, inner write-back, write allocate) + + for (base = 0; base < l1_cached_threshold; base++) + { + // Value from my original RPI code = 11C0E (outer and inner write back, write allocate, shareable) + // bits 11..10 are the AP bits, and setting them to 11 enables user mode access as well + // Values from RPI2 = 11C0E (outer and inner write back, write allocate, shareable (fast but unsafe)); works on RPI + // Values from RPI2 = 10C0A (outer and inner write through, no write allocate, shareable) + // Values from RPI2 = 15C0A (outer write back, write allocate, inner write through, no write allocate, shareable) + PageTable[base] = base << 20 | 0x04C02 | (shareable << 16) | (bb << 12) | (aa << 2); + } + for (; base < l2_cached_threshold; base++) + { + PageTable[base] = base << 20 | 0x04C02 | (shareable << 16) | (bb << 12); + } + for (; base < uncached_threshold; base++) + { + PageTable[base] = base << 20 | 0x01C02; + } + for (; base < 4096; base++) + { + // shared device, never execute + PageTable[base] = base << 20 | 0x10C16; + } + + // suppress a warning as we really do want to copy from src address 0! +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wnonnull" + // copy vectors from virtual address zero to a higher unused location + memcpy((void *)HIGH_VECTORS_BASE, (void *)0, 0x1000); +#pragma GCC diagnostic pop + + // replace the first N 1MB entries with second level page tables, giving N x 256 4K pages + for (i = 0; i < NUM_4K_PAGES >> 8; i++) + { + PageTable[i] = (unsigned int) (&PageTable2[i << 8]); + PageTable[i] +=1; + } + + // populate the second level page tables + for (base = 0; base < NUM_4K_PAGES; base++) + { + map_4k_page(base, base); + } + + // relocate the vector pointer to the moved page + asm volatile("mcr p15, 0, %[addr], c12, c0, 0" : : [addr] "r" (HIGH_VECTORS_BASE)); + +#if defined(RPI3) + unsigned cpuextctrl0, cpuextctrl1; + asm volatile ("mrrc p15, 1, %0, %1, c15" : "=r" (cpuextctrl0), "=r" (cpuextctrl1)); + //DEBUG_LOG("extctrl = %08x %08x\r\n", cpuextctrl1, cpuextctrl0); +#else + // RPI: bit 6 of auxctrl is restrict cache size to 16K (no page coloring) + // RPI2: bit 6 of auxctrl is set SMP bit, otherwise all caching disabled + unsigned auxctrl; + asm volatile ("mrc p15, 0, %0, c1, c0, 1" : "=r" (auxctrl)); + auxctrl |= 1 << 6; + asm volatile ("mcr p15, 0, %0, c1, c0, 1" :: "r" (auxctrl)); + asm volatile ("mrc p15, 0, %0, c1, c0, 1" : "=r" (auxctrl)); + //DEBUG_LOG("auxctrl = %08x\r\n", auxctrl); +#endif + + // set domain 0 to client + asm volatile ("mcr p15, 0, %0, c3, c0, 0" :: "r" (1)); + + // always use TTBR0 + asm volatile ("mcr p15, 0, %0, c2, c0, 2" :: "r" (0)); + + unsigned ttbcr; + asm volatile ("mrc p15, 0, %0, c2, c0, 2" : "=r" (ttbcr)); + //DEBUG_LOG("ttbcr = %08x\r\n", ttbcr); + +#if defined(RPI2) || defined(RPI3) + // set TTBR0 - page table walk memory cacheability/shareable + // [Bit 0, Bit 6] indicates inner cachability: 01 = normal memory, inner write-back write-allocate cacheable + // [Bit 4, Bit 3] indicates outer cachability: 01 = normal memory, outer write-back write-allocate cacheable + // Bit 1 indicates sharable + // 4A = 0100 1010 + int attr = ((aa & 1) << 6) | (bb << 3) | (shareable << 1) | ((aa & 2) >> 1); + asm volatile ("mcr p15, 0, %0, c2, c0, 0" :: "r" (attr | (unsigned) &PageTable)); +#else + // set TTBR0 (page table walk inner cacheable, outer non-cacheable, shareable memory) + asm volatile ("mcr p15, 0, %0, c2, c0, 0" :: "r" (0x03 | (unsigned) &PageTable)); +#endif + unsigned ttbr0; + asm volatile ("mrc p15, 0, %0, c2, c0, 0" : "=r" (ttbr0)); + //DEBUG_LOG("ttbr0 = %08x\r\n", ttbr0); + + + // Invalidate entire data cache +#if defined(RPI2) || defined(RPI3) + asm volatile ("isb" ::: "memory"); + InvalidateDataCache(); +#else + // invalidate data cache and flush prefetch buffer + // NOTE: The below code seems to cause a Pi 2 to crash + asm volatile ("mcr p15, 0, %0, c7, c5, 4" :: "r" (0) : "memory"); + asm volatile ("mcr p15, 0, %0, c7, c6, 0" :: "r" (0) : "memory"); +#endif + + // enable MMU, L1 cache and instruction cache, L2 cache, write buffer, + // branch prediction and extended page table on + unsigned sctrl; + asm volatile ("mrc p15,0,%0,c1,c0,0" : "=r" (sctrl)); + // Bit 13 enable vector relocation + // Bit 12 enables the L1 instruction cache + // Bit 11 enables branch pre-fetching + // Bit 2 enables the L1 data cache + // Bit 0 enabled the MMU + // The L1 instruction cache can be used independently of the MMU + // The L1 data cache will one be enabled if the MMU is enabled + + sctrl |= 0x00001805; + asm volatile ("mcr p15,0,%0,c1,c0,0" :: "r" (sctrl) : "memory"); + asm volatile ("mrc p15,0,%0,c1,c0,0" : "=r" (sctrl)); + //DEBUG_LOG("sctrl = %08x\r\n", sctrl); + + // For information, show the cache type register + // From this you can tell what type of cache is implemented + unsigned ctype; + asm volatile ("mrc p15,0,%0,c0,c0,1" : "=r" (ctype)); + //DEBUG_LOG("ctype = %08x\r\n", ctype); +} diff --git a/cache.h b/cache.h new file mode 100644 index 0000000..5e58e9e --- /dev/null +++ b/cache.h @@ -0,0 +1,32 @@ +// Part of PiTubeDirect +// https://github.com/hoglet67/PiTubeDirect + +// cache.h + +#ifndef CACHE_H +#define CACHE_H + +// Memory below 64MB is L1 and L2 cached (inner and outer) + +// Mark the memory above 64MB to 128MB as L2 cached only (outer) +#define L2_CACHED_MEM_BASE 0x04000000 + +// Mark the memory above 128MB as uncachable +#define UNCACHED_MEM_BASE 0x08000000 + +// Location of the high vectors (last page of L1 cached memory) +#define HIGH_VECTORS_BASE (L2_CACHED_MEM_BASE - 0x1000) + +// The first 2MB of memory is mapped at 4K pages so the 6502 Co Pro +// can play tricks with banks selection +#define NUM_4K_PAGES 512 + +#ifndef __ASSEMBLER__ + +void map_4k_page(int logical, int physical); + +void enable_MMU_and_IDCaches(void); + +#endif + +#endif diff --git a/debug.h b/debug.h new file mode 100644 index 0000000..4df0123 --- /dev/null +++ b/debug.h @@ -0,0 +1,16 @@ +#ifndef DEBUG_H +#define DEBUG_H + +#ifdef __ASSEMBLER__ +#else +#include +#endif + +#ifdef DEBUG +#define DEBUG_LOG(...) printf(__VA_ARGS__) +#else +#define DEBUG_LOG(...) +#endif + + +#endif \ No newline at end of file diff --git a/defs.h b/defs.h new file mode 100644 index 0000000..7462bdb --- /dev/null +++ b/defs.h @@ -0,0 +1,71 @@ +#ifndef DEFS_H +#define DEFS_H + +#include "debug.h" + +// Indicates a Pi with the 40 pin GPIO connector +// so that additional functionality (e.g. test pins) can be enabled +#if defined(RPIZERO) || defined(RPIBPLUS) || defined(RPI2) || defined(RPI3) +#define HAS_40PINS +#endif + +// Pi 2/3 Multicore options +#if defined(RPI2) || defined(RPI3) + +// Indicate the platform has multiple cores +#define HAS_MULTICORE + +#define USE_GPU + +#define USE_HW_MAILBOX + +// Indicates we want to make active use of multiple cores +#define USE_MULTICORE + +// Needs to match kernel_old setting in config.txt +//#define KERNEL_OLD + +// Include instruction histogram in multi core 65tube +//#define HISTOGRAM + +#else + +#define USE_GPU + +#define USE_HW_MAILBOX + +#endif + +#include "rpi-base.h" + +#ifdef USE_HW_MAILBOX +#define MBOX0_READ (PERIPHERAL_BASE + 0x00B880) +#define MBOX0_STATUS (PERIPHERAL_BASE + 0x00B898) +#define MBOX0_CONFIG (PERIPHERAL_BASE + 0x00B89C) +#define MBOX0_EMPTY (0x40000000) +#define MBOX0_DATAIRQEN (0x00000001) +#endif + +#ifdef __ASSEMBLER__ + +#define GPFSEL0 (PERIPHERAL_BASE + 0x200000) // controls GPIOs 0..9 +#define GPFSEL1 (PERIPHERAL_BASE + 0x200004) // controls GPIOs 10..19 +#define GPFSEL2 (PERIPHERAL_BASE + 0x200008) // controls GPIOs 20..29 +#define GPSET0 (PERIPHERAL_BASE + 0x20001C) +#define GPCLR0 (PERIPHERAL_BASE + 0x200028) +#define GPLEV0 (PERIPHERAL_BASE + 0x200034) +#define GPEDS0 (PERIPHERAL_BASE + 0x200040) +#define FIQCTRL (PERIPHERAL_BASE + 0x00B20C) + +#endif // __ASSEMBLER__ + +#ifdef HAS_40PINS +#define TEST_PIN (21) +#define TEST_MASK (1 << TEST_PIN) +#define TEST2_PIN (20) +#define TEST2_MASK (1 << TEST2_PIN) +#define TEST3_PIN (16) +#define TEST3_MASK (1 << TEST3_PIN) +#endif + +#endif diff --git a/diskio.cpp b/diskio.cpp new file mode 100644 index 0000000..25dc6ef --- /dev/null +++ b/diskio.cpp @@ -0,0 +1,275 @@ +/*-----------------------------------------------------------------------*/ +/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2016 */ +/*-----------------------------------------------------------------------*/ +/* If a working storage control module is available, it should be */ +/* attached to the FatFs via a glue function rather than modifying it. */ +/* This is an example of glue functions to attach various exsisting */ +/* storage control modules to the FatFs module with a defined API. */ +/*-----------------------------------------------------------------------*/ + +#include "diskio.h" /* FatFs lower layer API */ + +/* Definitions of physical drive number for each drive */ +#define DEV_MMC 0 /* Example: Map MMC/SD card to physical drive 0 */ + +//static struct emmc_block_dev *emmc_dev; +static CEMMCDevice* pEMMC; + +#define SD_BLOCK_SIZE 512 + +void disk_setEMM(CEMMCDevice* pEMMCDevice) +{ + pEMMC = pEMMCDevice; +} + +int sd_card_init(struct block_device **dev) +{ + return 0; +} + +size_t sd_read(uint8_t *buf, size_t buf_size, uint32_t block_no) +{ +// g_pLogger->Write("", LogNotice, "sd_read %d", block_no); + + return pEMMC->DoRead(buf, buf_size, block_no); +} + +size_t sd_write(uint8_t *buf, size_t buf_size, uint32_t block_no) +{ + return pEMMC->DoWrite(buf, buf_size, block_no); +} + + +/*-----------------------------------------------------------------------*/ +/* Get Drive Status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE pdrv /* Physical drive nmuber to identify the drive */ +) +{ + //DSTATUS stat; + //int result; + + //switch (pdrv) { + ////case DEV_RAM : + //// result = RAM_disk_status(); + + //// // translate the reslut code here + + //// return stat; + + //case DEV_MMC : + + // result = MMC_disk_status(); + + // // translate the reslut code here + + // return stat; + + ////case DEV_USB : + //// result = USB_disk_status(); + + //// // translate the reslut code here + + //// return stat; + //} + //return STA_NOINIT; + return 0; +} + + + +/*-----------------------------------------------------------------------*/ +/* Inidialize a Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE pdrv /* Physical drive nmuber to identify the drive */ +) +{ + //DSTATUS stat; + //int result; + + //switch (pdrv) { + ////case DEV_RAM : + //// result = RAM_disk_initialize(); + + //// // translate the reslut code here + + //// return stat; + + ////case DEV_MMC : + //// result = MMC_disk_initialize(); + + //// // translate the reslut code here + + //// return stat; + + ////case DEV_USB : + //// result = USB_disk_initialize(); + + //// // translate the reslut code here + + //// return stat; + //} + //return STA_NOINIT; + return 0; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE pdrv, /* Physical drive nmuber to identify the drive */ + BYTE *buff, /* Data buffer to store read data */ + DWORD sector, /* Start sector in LBA */ + UINT count /* Number of sectors to read */ +) +{ + //DRESULT res; + //int result; + +// g_pLogger->Write("", LogNotice, "disk_read pdrv = %d", pdrv); + + switch (pdrv) { + //case DEV_RAM : + // // translate the arguments here + + // result = RAM_disk_read(buff, sector, count); + + // // translate the reslut code here + + // return res; + + case DEV_MMC : + // translate the arguments here + + //result = MMC_disk_read(buff, sector, count); + +// g_pLogger->Write("", LogNotice, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!disk_read %d %d buf_size = 0x%x", sector, count, buf_size); + + for (UINT s = 0; s < count; ++s) + { + if (sd_read(buff, SD_BLOCK_SIZE, sector+s) < SD_BLOCK_SIZE) + { + return RES_ERROR; + } + buff += SD_BLOCK_SIZE; + } + return RES_OK; + + //case DEV_USB : + // // translate the arguments here + + // result = USB_disk_read(buff, sector, count); + + // // translate the reslut code here + + // return res; + } + + return RES_PARERR; +} + + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_write ( + BYTE pdrv, /* Physical drive nmuber to identify the drive */ + const BYTE *buff, /* Data to be written */ + DWORD sector, /* Start sector in LBA */ + UINT count /* Number of sectors to write */ +) +{ + //DRESULT res; + //int result; + + switch (pdrv) { + //case DEV_RAM : + // // translate the arguments here + + // result = RAM_disk_write(buff, sector, count); + + // // translate the reslut code here + + // return res; + + case DEV_MMC : + // translate the arguments here + + //result = MMC_disk_write(buff, sector, count); + //size_t buf_size = count * SD_BLOCK_SIZE; + //if (sd_write((uint8_t *)buff, buf_size, sector) < buf_size) + //{ + // return RES_ERROR; + //} + + for (UINT s = 0; s < count; ++s) + { + if (sd_write((uint8_t *)buff, SD_BLOCK_SIZE, sector+s) < SD_BLOCK_SIZE) + { + return RES_ERROR; + } + buff += SD_BLOCK_SIZE; + } + + return RES_OK; + + //case DEV_USB : + // // translate the arguments here + + // result = USB_disk_write(buff, sector, count); + + // // translate the reslut code here + + // return res; + } + + return RES_PARERR; +} + + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_ioctl ( + BYTE pdrv, /* Physical drive nmuber (0..) */ + BYTE cmd, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + //DRESULT res; + //int result; + + //switch (pdrv) { + //case DEV_RAM : + + // // Process of the command for the RAM drive + + // return res; + + //case DEV_MMC : + + // // Process of the command for the MMC/SD card + + // return res; + + //case DEV_USB : + + // // Process of the command the USB drive + + // return res; + //} + + return RES_PARERR; +} + diff --git a/diskio.h b/diskio.h new file mode 100644 index 0000000..e09564c --- /dev/null +++ b/diskio.h @@ -0,0 +1,83 @@ +/*-----------------------------------------------------------------------/ +/ Low level disk interface modlue include file (C)ChaN, 2014 / +/-----------------------------------------------------------------------*/ + +#ifndef _DISKIO_DEFINED +#define _DISKIO_DEFINED + +#include "integer.h" +#include "emmc.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Status of Disk Functions */ +typedef BYTE DSTATUS; + +/* Results of Disk Functions */ +typedef enum { + RES_OK = 0, /* 0: Successful */ + RES_ERROR, /* 1: R/W Error */ + RES_WRPRT, /* 2: Write Protected */ + RES_NOTRDY, /* 3: Not Ready */ + RES_PARERR /* 4: Invalid Parameter */ +} DRESULT; + + +/*---------------------------------------*/ +/* Prototypes for disk control functions */ + + +void disk_setEMM(CEMMCDevice* pEMMCDevice); + +DSTATUS disk_initialize (BYTE pdrv); +DSTATUS disk_status (BYTE pdrv); +DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count); +DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); +DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff); + + +/* Disk Status Bits (DSTATUS) */ + +#define STA_NOINIT 0x01 /* Drive not initialized */ +#define STA_NODISK 0x02 /* No medium in the drive */ +#define STA_PROTECT 0x04 /* Write protected */ + + +/* Command code for disk_ioctrl fucntion */ + +/* Generic command (Used by FatFs) */ +#define CTRL_SYNC 0 /* Complete pending write process (needed at _FS_READONLY == 0) */ +#define GET_SECTOR_COUNT 1 /* Get media size (needed at _USE_MKFS == 1) */ +#define GET_SECTOR_SIZE 2 /* Get sector size (needed at _MAX_SS != _MIN_SS) */ +#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at _USE_MKFS == 1) */ +#define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at _USE_TRIM == 1) */ + +/* Generic command (Not used by FatFs) */ +#define CTRL_POWER 5 /* Get/Set power status */ +#define CTRL_LOCK 6 /* Lock/Unlock media removal */ +#define CTRL_EJECT 7 /* Eject media */ +#define CTRL_FORMAT 8 /* Create physical format on the media */ + +/* MMC/SDC specific ioctl command */ +#define MMC_GET_TYPE 10 /* Get card type */ +#define MMC_GET_CSD 11 /* Get CSD */ +#define MMC_GET_CID 12 /* Get CID */ +#define MMC_GET_OCR 13 /* Get OCR */ +#define MMC_GET_SDSTAT 14 /* Get SD status */ +#define ISDIO_READ 55 /* Read data form SD iSDIO register */ +#define ISDIO_WRITE 56 /* Write data to SD iSDIO register */ +#define ISDIO_MRITE 57 /* Masked write data to SD iSDIO register */ + +/* ATA/CF specific ioctl command */ +#define ATA_GET_REV 20 /* Get F/W revision */ +#define ATA_GET_MODEL 21 /* Get model name */ +#define ATA_GET_SN 22 /* Get serial number */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/emmc.cpp b/emmc.cpp new file mode 100644 index 0000000..4b00d2b --- /dev/null +++ b/emmc.cpp @@ -0,0 +1,1998 @@ +// +// emmc.cpp +// +// Provides an interface to the EMMC controller and commands for interacting +// with an sd card +// +// Copyright(C) 2013 by John Cronin +// +// Modified for Circle by R. Stange +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files(the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// References: +// +// PLSS - SD Group Physical Layer Simplified Specification ver 3.00 +// HCSS - SD Group Host Controller Simplified Specification ver 3.00 +// +// Broadcom BCM2835 ARM Peripherals Guide +// + +#include "emmc.h" +//#include +//#include +//#include +//#include +//#include +//#include +//#include +#include +extern "C" +{ + #include "rpiHardware.h" +} + +// +// Configuration options +// + +//#define EMMC_DEBUG +//#define EMMC_DEBUG2 + +// +// According to the BCM2835 ARM Peripherals Guide the EMMC STATUS register +// should not be used for polling. The original driver does not meet this +// specification in this point but the modified driver should do so. +// Define EMMC_POLL_STATUS_REG if you want the original function! +// +//#define EMMC_POLL_STATUS_REG + +// Enable 1.8V support +//#define SD_1_8V_SUPPORT + +// Enable 4-bit support +#define SD_4BIT_DATA + +// SD Clock Frequencies(in Hz) +#define SD_CLOCK_ID 400000 +#define SD_CLOCK_NORMAL 25000000 +#define SD_CLOCK_HIGH 50000000 +#define SD_CLOCK_100 100000000 +#define SD_CLOCK_208 208000000 + +// Enable SDXC maximum performance mode +// Requires 150 mA power so disabled on the RPi for now +#define SDXC_MAXIMUM_PERFORMANCE + +// Enable card interrupts +//#define SD_CARD_INTERRUPTS + +#define EMMC_ARG2 (ARM_EMMC_BASE + 0x00) +#define EMMC_BLKSIZECNT (ARM_EMMC_BASE + 0x04) +#define EMMC_ARG1 (ARM_EMMC_BASE + 0x08) +#define EMMC_CMDTM (ARM_EMMC_BASE + 0x0C) +#define EMMC_RESP0 (ARM_EMMC_BASE + 0x10) +#define EMMC_RESP1 (ARM_EMMC_BASE + 0x14) +#define EMMC_RESP2 (ARM_EMMC_BASE + 0x18) +#define EMMC_RESP3 (ARM_EMMC_BASE + 0x1C) +#define EMMC_DATA (ARM_EMMC_BASE + 0x20) +#define EMMC_STATUS (ARM_EMMC_BASE + 0x24) +#define EMMC_CONTROL0 (ARM_EMMC_BASE + 0x28) +#define EMMC_CONTROL1 (ARM_EMMC_BASE + 0x2C) +#define EMMC_INTERRUPT (ARM_EMMC_BASE + 0x30) +#define EMMC_IRPT_MASK (ARM_EMMC_BASE + 0x34) +#define EMMC_IRPT_EN (ARM_EMMC_BASE + 0x38) +#define EMMC_CONTROL2 (ARM_EMMC_BASE + 0x3C) +#define EMMC_CAPABILITIES_0 (ARM_EMMC_BASE + 0x40) +#define EMMC_CAPABILITIES_1 (ARM_EMMC_BASE + 0x44) +#define EMMC_FORCE_IRPT (ARM_EMMC_BASE + 0x50) +#define EMMC_BOOT_TIMEOUT (ARM_EMMC_BASE + 0x70) +#define EMMC_DBG_SEL (ARM_EMMC_BASE + 0x74) +#define EMMC_EXRDFIFO_CFG (ARM_EMMC_BASE + 0x80) +#define EMMC_EXRDFIFO_EN (ARM_EMMC_BASE + 0x84) +#define EMMC_TUNE_STEP (ARM_EMMC_BASE + 0x88) +#define EMMC_TUNE_STEPS_STD (ARM_EMMC_BASE + 0x8C) +#define EMMC_TUNE_STEPS_DDR (ARM_EMMC_BASE + 0x90) +#define EMMC_SPI_INT_SPT (ARM_EMMC_BASE + 0xF0) +#define EMMC_SLOTISR_VER (ARM_EMMC_BASE + 0xFC) + +#define SD_CMD_INDEX(a) ((a) << 24) +#define SD_CMD_TYPE_NORMAL 0 +#define SD_CMD_TYPE_SUSPEND (1 << 22) +#define SD_CMD_TYPE_RESUME (2 << 22) +#define SD_CMD_TYPE_ABORT (3 << 22) +#define SD_CMD_TYPE_MASK (3 << 22) +#define SD_CMD_ISDATA (1 << 21) +#define SD_CMD_IXCHK_EN (1 << 20) +#define SD_CMD_CRCCHK_EN (1 << 19) +#define SD_CMD_RSPNS_TYPE_NONE 0 // For no response +#define SD_CMD_RSPNS_TYPE_136 (1 << 16) // For response R2(with CRC), R3,4(no CRC) +#define SD_CMD_RSPNS_TYPE_48 (2 << 16) // For responses R1, R5, R6, R7(with CRC) +#define SD_CMD_RSPNS_TYPE_48B (3 << 16) // For responses R1b, R5b(with CRC) +#define SD_CMD_RSPNS_TYPE_MASK (3 << 16) +#define SD_CMD_MULTI_BLOCK (1 << 5) +#define SD_CMD_DAT_DIR_HC 0 +#define SD_CMD_DAT_DIR_CH (1 << 4) +#define SD_CMD_AUTO_CMD_EN_NONE 0 +#define SD_CMD_AUTO_CMD_EN_CMD12 (1 << 2) +#define SD_CMD_AUTO_CMD_EN_CMD23 (2 << 2) +#define SD_CMD_BLKCNT_EN (1 << 1) +#define SD_CMD_DMA 1 + +#define SD_ERR_CMD_TIMEOUT 0 +#define SD_ERR_CMD_CRC 1 +#define SD_ERR_CMD_END_BIT 2 +#define SD_ERR_CMD_INDEX 3 +#define SD_ERR_DATA_TIMEOUT 4 +#define SD_ERR_DATA_CRC 5 +#define SD_ERR_DATA_END_BIT 6 +#define SD_ERR_CURRENT_LIMIT 7 +#define SD_ERR_AUTO_CMD12 8 +#define SD_ERR_ADMA 9 +#define SD_ERR_TUNING 10 +#define SD_ERR_RSVD 11 + +#define SD_ERR_MASK_CMD_TIMEOUT (1 <<(16 + SD_ERR_CMD_TIMEOUT)) +#define SD_ERR_MASK_CMD_CRC (1 <<(16 + SD_ERR_CMD_CRC)) +#define SD_ERR_MASK_CMD_END_BIT (1 <<(16 + SD_ERR_CMD_END_BIT)) +#define SD_ERR_MASK_CMD_INDEX (1 <<(16 + SD_ERR_CMD_INDEX)) +#define SD_ERR_MASK_DATA_TIMEOUT (1 <<(16 + SD_ERR_CMD_TIMEOUT)) +#define SD_ERR_MASK_DATA_CRC (1 <<(16 + SD_ERR_CMD_CRC)) +#define SD_ERR_MASK_DATA_END_BIT (1 <<(16 + SD_ERR_CMD_END_BIT)) +#define SD_ERR_MASK_CURRENT_LIMIT (1 <<(16 + SD_ERR_CMD_CURRENT_LIMIT)) +#define SD_ERR_MASK_AUTO_CMD12 (1 <<(16 + SD_ERR_CMD_AUTO_CMD12)) +#define SD_ERR_MASK_ADMA (1 <<(16 + SD_ERR_CMD_ADMA)) +#define SD_ERR_MASK_TUNING (1 <<(16 + SD_ERR_CMD_TUNING)) + +#define SD_COMMAND_COMPLETE 1 +#define SD_TRANSFER_COMPLETE (1 << 1) +#define SD_BLOCK_GAP_EVENT (1 << 2) +#define SD_DMA_INTERRUPT (1 << 3) +#define SD_BUFFER_WRITE_READY (1 << 4) +#define SD_BUFFER_READ_READY (1 << 5) +#define SD_CARD_INSERTION (1 << 6) +#define SD_CARD_REMOVAL (1 << 7) +#define SD_CARD_INTERRUPT (1 << 8) + +#define SD_RESP_NONE SD_CMD_RSPNS_TYPE_NONE +#define SD_RESP_R1 (SD_CMD_RSPNS_TYPE_48 | SD_CMD_CRCCHK_EN) +#define SD_RESP_R1b (SD_CMD_RSPNS_TYPE_48B | SD_CMD_CRCCHK_EN) +#define SD_RESP_R2 (SD_CMD_RSPNS_TYPE_136 | SD_CMD_CRCCHK_EN) +#define SD_RESP_R3 SD_CMD_RSPNS_TYPE_48 +#define SD_RESP_R4 SD_CMD_RSPNS_TYPE_136 +#define SD_RESP_R5 (SD_CMD_RSPNS_TYPE_48 | SD_CMD_CRCCHK_EN) +#define SD_RESP_R5b (SD_CMD_RSPNS_TYPE_48B | SD_CMD_CRCCHK_EN) +#define SD_RESP_R6 (SD_CMD_RSPNS_TYPE_48 | SD_CMD_CRCCHK_EN) +#define SD_RESP_R7 (SD_CMD_RSPNS_TYPE_48 | SD_CMD_CRCCHK_EN) + +#define SD_DATA_READ (SD_CMD_ISDATA | SD_CMD_DAT_DIR_CH) +#define SD_DATA_WRITE (SD_CMD_ISDATA | SD_CMD_DAT_DIR_HC) + +#define SD_CMD_RESERVED(a) 0xffffffff + +#define SUCCESS (m_last_cmd_success) +#define FAIL (m_last_cmd_success == 0) +#define TIMEOUT (FAIL &&(m_last_error == 0)) +#define CMD_TIMEOUT (FAIL &&(m_last_error &(1 << 16))) +#define CMD_CRC (FAIL &&(m_last_error &(1 << 17))) +#define CMD_END_BIT (FAIL &&(m_last_error &(1 << 18))) +#define CMD_INDEX (FAIL &&(m_last_error &(1 << 19))) +#define DATA_TIMEOUT (FAIL &&(m_last_error &(1 << 20))) +#define DATA_CRC (FAIL &&(m_last_error &(1 << 21))) +#define DATA_END_BIT (FAIL &&(m_last_error &(1 << 22))) +#define CURRENT_LIMIT (FAIL &&(m_last_error &(1 << 23))) +#define ACMD12_ERROR (FAIL &&(m_last_error &(1 << 24))) +#define ADMA_ERROR (FAIL &&(m_last_error &(1 << 25))) +#define TUNING_ERROR (FAIL &&(m_last_error &(1 << 26))) + +#define SD_VER_UNKNOWN 0 +#define SD_VER_1 1 +#define SD_VER_1_1 2 +#define SD_VER_2 3 +#define SD_VER_3 4 +#define SD_VER_4 5 + +const char *CEMMCDevice::sd_versions[] = +{ + "unknown", + "1.0 or 1.01", + "1.10", + "2.00", + "3.0x", + "4.xx" +}; + +#ifdef EMMC_DEBUG2 +const char *CEMMCDevice::err_irpts[] = +{ + "CMD_TIMEOUT", + "CMD_CRC", + "CMD_END_BIT", + "CMD_INDEX", + "DATA_TIMEOUT", + "DATA_CRC", + "DATA_END_BIT", + "CURRENT_LIMIT", + "AUTO_CMD12", + "ADMA", + "TUNING", + "RSVD" +}; +#endif + +const u32 CEMMCDevice::sd_commands[] = +{ + SD_CMD_INDEX(0), + SD_CMD_RESERVED(1), + SD_CMD_INDEX(2) | SD_RESP_R2, + SD_CMD_INDEX(3) | SD_RESP_R6, + SD_CMD_INDEX(4), + SD_CMD_INDEX(5) | SD_RESP_R4, + SD_CMD_INDEX(6) | SD_RESP_R1, + SD_CMD_INDEX(7) | SD_RESP_R1b, + SD_CMD_INDEX(8) | SD_RESP_R7, + SD_CMD_INDEX(9) | SD_RESP_R2, + SD_CMD_INDEX(10) | SD_RESP_R2, + SD_CMD_INDEX(11) | SD_RESP_R1, + SD_CMD_INDEX(12) | SD_RESP_R1b | SD_CMD_TYPE_ABORT, + SD_CMD_INDEX(13) | SD_RESP_R1, + SD_CMD_RESERVED(14), + SD_CMD_INDEX(15), + SD_CMD_INDEX(16) | SD_RESP_R1, + SD_CMD_INDEX(17) | SD_RESP_R1 | SD_DATA_READ, + SD_CMD_INDEX(18) | SD_RESP_R1 | SD_DATA_READ | SD_CMD_MULTI_BLOCK | SD_CMD_BLKCNT_EN | SD_CMD_AUTO_CMD_EN_CMD12, // SD_CMD_AUTO_CMD_EN_CMD12 not in original driver + SD_CMD_INDEX(19) | SD_RESP_R1 | SD_DATA_READ, + SD_CMD_INDEX(20) | SD_RESP_R1b, + SD_CMD_RESERVED(21), + SD_CMD_RESERVED(22), + SD_CMD_INDEX(23) | SD_RESP_R1, + SD_CMD_INDEX(24) | SD_RESP_R1 | SD_DATA_WRITE, + SD_CMD_INDEX(25) | SD_RESP_R1 | SD_DATA_WRITE | SD_CMD_MULTI_BLOCK | SD_CMD_BLKCNT_EN | SD_CMD_AUTO_CMD_EN_CMD12, // SD_CMD_AUTO_CMD_EN_CMD12 not in original driver + SD_CMD_RESERVED(26), + SD_CMD_INDEX(27) | SD_RESP_R1 | SD_DATA_WRITE, + SD_CMD_INDEX(28) | SD_RESP_R1b, + SD_CMD_INDEX(29) | SD_RESP_R1b, + SD_CMD_INDEX(30) | SD_RESP_R1 | SD_DATA_READ, + SD_CMD_RESERVED(31), + SD_CMD_INDEX(32) | SD_RESP_R1, + SD_CMD_INDEX(33) | SD_RESP_R1, + SD_CMD_RESERVED(34), + SD_CMD_RESERVED(35), + SD_CMD_RESERVED(36), + SD_CMD_RESERVED(37), + SD_CMD_INDEX(38) | SD_RESP_R1b, + SD_CMD_RESERVED(39), + SD_CMD_RESERVED(40), + SD_CMD_RESERVED(41), + SD_CMD_RESERVED(42) | SD_RESP_R1, + SD_CMD_RESERVED(43), + SD_CMD_RESERVED(44), + SD_CMD_RESERVED(45), + SD_CMD_RESERVED(46), + SD_CMD_RESERVED(47), + SD_CMD_RESERVED(48), + SD_CMD_RESERVED(49), + SD_CMD_RESERVED(50), + SD_CMD_RESERVED(51), + SD_CMD_RESERVED(52), + SD_CMD_RESERVED(53), + SD_CMD_RESERVED(54), + SD_CMD_INDEX(55) | SD_RESP_R1, + SD_CMD_INDEX(56) | SD_RESP_R1 | SD_CMD_ISDATA, + SD_CMD_RESERVED(57), + SD_CMD_RESERVED(58), + SD_CMD_RESERVED(59), + SD_CMD_RESERVED(60), + SD_CMD_RESERVED(61), + SD_CMD_RESERVED(62), + SD_CMD_RESERVED(63) +}; + +const u32 CEMMCDevice::sd_acommands[] = +{ + SD_CMD_RESERVED(0), + SD_CMD_RESERVED(1), + SD_CMD_RESERVED(2), + SD_CMD_RESERVED(3), + SD_CMD_RESERVED(4), + SD_CMD_RESERVED(5), + SD_CMD_INDEX(6) | SD_RESP_R1, + SD_CMD_RESERVED(7), + SD_CMD_RESERVED(8), + SD_CMD_RESERVED(9), + SD_CMD_RESERVED(10), + SD_CMD_RESERVED(11), + SD_CMD_RESERVED(12), + SD_CMD_INDEX(13) | SD_RESP_R1, + SD_CMD_RESERVED(14), + SD_CMD_RESERVED(15), + SD_CMD_RESERVED(16), + SD_CMD_RESERVED(17), + SD_CMD_RESERVED(18), + SD_CMD_RESERVED(19), + SD_CMD_RESERVED(20), + SD_CMD_RESERVED(21), + SD_CMD_INDEX(22) | SD_RESP_R1 | SD_DATA_READ, + SD_CMD_INDEX(23) | SD_RESP_R1, + SD_CMD_RESERVED(24), + SD_CMD_RESERVED(25), + SD_CMD_RESERVED(26), + SD_CMD_RESERVED(27), + SD_CMD_RESERVED(28), + SD_CMD_RESERVED(29), + SD_CMD_RESERVED(30), + SD_CMD_RESERVED(31), + SD_CMD_RESERVED(32), + SD_CMD_RESERVED(33), + SD_CMD_RESERVED(34), + SD_CMD_RESERVED(35), + SD_CMD_RESERVED(36), + SD_CMD_RESERVED(37), + SD_CMD_RESERVED(38), + SD_CMD_RESERVED(39), + SD_CMD_RESERVED(40), + SD_CMD_INDEX(41) | SD_RESP_R3, + SD_CMD_INDEX(42) | SD_RESP_R1, + SD_CMD_RESERVED(43), + SD_CMD_RESERVED(44), + SD_CMD_RESERVED(45), + SD_CMD_RESERVED(46), + SD_CMD_RESERVED(47), + SD_CMD_RESERVED(48), + SD_CMD_RESERVED(49), + SD_CMD_RESERVED(50), + SD_CMD_INDEX(51) | SD_RESP_R1 | SD_DATA_READ, + SD_CMD_RESERVED(52), + SD_CMD_RESERVED(53), + SD_CMD_RESERVED(54), + SD_CMD_RESERVED(55), + SD_CMD_RESERVED(56), + SD_CMD_RESERVED(57), + SD_CMD_RESERVED(58), + SD_CMD_RESERVED(59), + SD_CMD_RESERVED(60), + SD_CMD_RESERVED(61), + SD_CMD_RESERVED(62), + SD_CMD_RESERVED(63) +}; + +// The actual command indices +#define GO_IDLE_STATE 0 +#define ALL_SEND_CID 2 +#define SEND_RELATIVE_ADDR 3 +#define SET_DSR 4 +#define IO_SET_OP_COND 5 +#define SWITCH_FUNC 6 +#define SELECT_CARD 7 +#define DESELECT_CARD 7 +#define SELECT_DESELECT_CARD 7 +#define SEND_IF_COND 8 +#define SEND_CSD 9 +#define SEND_CID 10 +#define VOLTAGE_SWITCH 11 +#define STOP_TRANSMISSION 12 +#define SEND_STATUS 13 +#define GO_INACTIVE_STATE 15 +#define SET_BLOCKLEN 16 +#define READ_SINGLE_BLOCK 17 +#define READ_MULTIPLE_BLOCK 18 +#define SEND_TUNING_BLOCK 19 +#define SPEED_CLASS_CONTROL 20 +#define SET_BLOCK_COUNT 23 +#define WRITE_BLOCK 24 +#define WRITE_MULTIPLE_BLOCK 25 +#define PROGRAM_CSD 27 +#define SET_WRITE_PROT 28 +#define CLR_WRITE_PROT 29 +#define SEND_WRITE_PROT 30 +#define ERASE_WR_BLK_START 32 +#define ERASE_WR_BLK_END 33 +#define ERASE 38 +#define LOCK_UNLOCK 42 +#define APP_CMD 55 +#define GEN_CMD 56 + +#define IS_APP_CMD 0x80000000 +#define ACMD(a) (a | IS_APP_CMD) +#define SET_BUS_WIDTH (6 | IS_APP_CMD) +#define SD_STATUS (13 | IS_APP_CMD) +#define SEND_NUM_WR_BLOCKS (22 | IS_APP_CMD) +#define SET_WR_BLK_ERASE_COUNT (23 | IS_APP_CMD) +#define SD_SEND_OP_COND (41 | IS_APP_CMD) +#define SET_CLR_CARD_DETECT (42 | IS_APP_CMD) +#define SEND_SCR (51 | IS_APP_CMD) + +#define SD_RESET_CMD (1 << 25) +#define SD_RESET_DAT (1 << 26) +#define SD_RESET_ALL (1 << 24) + +#define SD_GET_CLOCK_DIVIDER_FAIL 0xffffffff + +#define SD_BLOCK_SIZE 512 + +CEMMCDevice::CEMMCDevice() +: m_ullOffset(0), + m_hci_ver(0) +{ +} + +CEMMCDevice::~CEMMCDevice(void) +{ +} + +bool CEMMCDevice::Initialize(void) +{ + //DEBUG_LOG("CEMMCDevice::Initialize\r\n"); + PowerOn(); + //if (PowerOn() == false) + //{ + // DEBUG_LOG("BCM2708 controller did not power on successfully"); + // return false; + //} + + // Check the sanity of the sd_commands and sd_acommands structures + assert(sizeof(sd_commands) == (64 * sizeof(u32))); + assert(sizeof(sd_acommands) == (64 * sizeof(u32))); + + // Read the controller version + u32 ver = read32(EMMC_SLOTISR_VER); + u32 sdversion = (ver >> 16) & 0xff; +#ifdef EMMC_DEBUG2 + u32 vendor = ver >> 24; + u32 slot_status = ver & 0xff; + DEBUG_LOG("Vendor %x, SD version %x, slot status %x", vendor, sdversion, slot_status); +#endif + m_hci_ver = sdversion; + if (m_hci_ver < 2) + { + DEBUG_LOG("Only SDHCI versions >= 3.0 are supported"); + return false; + } + + if (CardReset() != 0) + return false; + + return true; +} + +int CEMMCDevice::Read(void *pBuffer, unsigned nCount) +{ + if (m_ullOffset % SD_BLOCK_SIZE != 0) + { + return -1; + } + unsigned nBlock = m_ullOffset / SD_BLOCK_SIZE; + + //if (m_pActLED != 0) + // m_pActLED->On(); + + DataMemBarrier(); + + if (DoRead((u8 *) pBuffer, nCount, nBlock) !=(int) nCount) + { + DataMemBarrier(); + + //if (m_pActLED != 0) + // m_pActLED->Off(); + + return -1; + } + + DataMemBarrier(); + + //if (m_pActLED != 0) + // m_pActLED->Off(); + + return nCount; +} + +int CEMMCDevice::Write(const void *pBuffer, unsigned nCount) +{ + if (m_ullOffset % SD_BLOCK_SIZE != 0) + { + return -1; + } + unsigned nBlock = m_ullOffset / SD_BLOCK_SIZE; + + //if (m_pActLED != 0) + // m_pActLED->On(); + + DataMemBarrier(); + + if (DoWrite((u8 *) pBuffer, nCount, nBlock) !=(int) nCount) + { + DataMemBarrier(); + + //if (m_pActLED != 0) + // m_pActLED->Off(); + + return -1; + } + + DataMemBarrier(); + + //if (m_pActLED != 0) + // m_pActLED->Off(); + + return nCount; +} + +unsigned long long CEMMCDevice::Seek(unsigned long long ullOffset) +{ + m_ullOffset = ullOffset; + + return m_ullOffset; +} + +bool CEMMCDevice::PowerOn(void) +{ + rpi_mailbox_property_t *buf; + RPI_PropertyInit(); + RPI_PropertyAddTag(TAG_SET_POWER_STATE, DEVICE_ID_SD_CARD, POWER_STATE_ON | POWER_STATE_WAIT); + RPI_PropertyProcess(); + + //RPI_PropertyInit(); + //RPI_PropertyAddTag(TAG_GET_POWER_STATE); + //RPI_PropertyProcess(); + //buf = RPI_PropertyGet(TAG_GET_POWER_STATE); + buf = RPI_PropertyGet(TAG_SET_POWER_STATE); + if (buf) + { + u32 state = buf->data.buffer_32[0]; + + //DEBUG_LOG("state = %x\r\n, state"); + //DEBUG_LOG("state = %x %x %x\r\n", buf->data.buffer_32[0], buf->data.buffer_32[1], buf->data.buffer_32[2]); + + if ((state & POWER_STATE_DEVICE_DOESNT_EXIST) || ((state & 1) == POWER_STATE_OFF)) + { + //DEBUG_LOG("Device did not power on successfully\r\n"); + return false; + } + } + else + { + //DEBUG_LOG("RPI_PropertyGet(TAG_GET_POWER_STATE) failed\r\n"); + return false; + } + return true; +} + +void CEMMCDevice::PowerOff(void) +{ + // Power off the SD card + u32 control0 = read32(EMMC_CONTROL0); + control0 &= ~(1 << 8); // Set SD Bus Power bit off in Power Control Register + write32(EMMC_CONTROL0, control0); +} + +// Set the clock dividers to generate a target value +u32 CEMMCDevice::GetClockDivider(u32 base_clock, u32 target_rate) +{ + // TODO: implement use of preset value registers + + u32 targetted_divisor = 1; + if (target_rate <= base_clock) + { + targetted_divisor = base_clock / target_rate; + if (base_clock % target_rate) + { + targetted_divisor--; + } + } + + // Decide on the clock mode to use + // Currently only 10-bit divided clock mode is supported + + if (m_hci_ver >= 2) + { + // HCI version 3 or greater supports 10-bit divided clock mode + // This requires a power-of-two divider + + // Find the first bit set + int divisor = -1; + for(int first_bit = 31; first_bit >= 0; first_bit--) + { + u32 bit_test =(1 << first_bit); + if (targetted_divisor & bit_test) + { + divisor = first_bit; + targetted_divisor &= ~bit_test; + if (targetted_divisor) + { + // The divisor is not a power-of-two, increase it + divisor++; + } + + break; + } + } + + if (divisor == -1) + { + divisor = 31; + } + if (divisor >= 32) + { + divisor = 31; + } + + if (divisor != 0) + { + divisor =(1 <<(divisor - 1)); + } + + if (divisor >= 0x400) + { + divisor = 0x3ff; + } + + u32 freq_select = divisor & 0xff; + u32 upper_bits =(divisor >> 8) & 0x3; + u32 ret =(freq_select << 8) |(upper_bits << 6) |(0 << 5); + +#ifdef EMMC_DEBUG2 + int denominator = 1; + if (divisor != 0) + { + denominator = divisor * 2; + } + int actual_clock = base_clock / denominator; + DEBUG_LOG("base_clock: %d, target_rate: %d, divisor: %08x, actual_clock: %d, ret: %08x", base_clock, target_rate, divisor, actual_clock, ret); +#endif + + return ret; + } + else + { + DEBUG_LOG("Unsupported host version"); + + return SD_GET_CLOCK_DIVIDER_FAIL; + } +} + +// Switch the clock rate whilst running +int CEMMCDevice::SwitchClockRate(u32 base_clock, u32 target_rate) +{ + // Decide on an appropriate divider + u32 divider = GetClockDivider(base_clock, target_rate); + if (divider == SD_GET_CLOCK_DIVIDER_FAIL) + { + DEBUG_LOG("Couldn't get a valid divider for target rate %d Hz\r\n", target_rate); + + return -1; + } + + // Wait for the command inhibit(CMD and DAT) bits to clear + while(read32(EMMC_STATUS) & 3) + { + delay_us(1000); + } + + // Set the SD clock off + u32 control1 = read32(EMMC_CONTROL1); + control1 &= ~(1 << 2); + write32(EMMC_CONTROL1, control1); + delay_us(2000); + + // Write the new divider + control1 &= ~0xffe0; // Clear old setting + clock generator select + control1 |= divider; + write32(EMMC_CONTROL1, control1); + delay_us(2000); + + // Enable the SD clock + control1 |=(1 << 2); + write32(EMMC_CONTROL1, control1); + delay_us(2000); + +#ifdef EMMC_DEBUG2 + DEBUG_LOG("Successfully set clock rate to %d Hz\r\n", target_rate); +#endif + + return 0; +} + +int CEMMCDevice::ResetCmd(void) +{ + u32 control1 = read32(EMMC_CONTROL1); + control1 |= SD_RESET_CMD; + write32(EMMC_CONTROL1, control1); + + if (TimeoutWait(EMMC_CONTROL1, SD_RESET_CMD, 0, 1000000) < 0) + { + DEBUG_LOG("CMD line did not reset properly"); + + return -1; + } + return 0; +} + +int CEMMCDevice::ResetDat(void) +{ + u32 control1 = read32(EMMC_CONTROL1); + control1 |= SD_RESET_DAT; + write32(EMMC_CONTROL1, control1); + + if (TimeoutWait(EMMC_CONTROL1, SD_RESET_DAT, 0, 1000000) < 0) + { + DEBUG_LOG("DAT line did not reset properly"); + + return -1; + } + return 0; +} + +void CEMMCDevice::IssueCommandInt(u32 cmd_reg, u32 argument, int timeout) +{ + m_last_cmd_reg = cmd_reg; + m_last_cmd_success = 0; + + // This is as per HCSS 3.7.1.1/3.7.2.2 + +#ifdef EMMC_POLL_STATUS_REG + // Check Command Inhibit + while(read32(EMMC_STATUS) & 1) + { + delay_us(1000); + } + + // Is the command with busy? + if ((cmd_reg & SD_CMD_RSPNS_TYPE_MASK) == SD_CMD_RSPNS_TYPE_48B) + { + // With busy + + // Is is an abort command? + if ((cmd_reg & SD_CMD_TYPE_MASK) != SD_CMD_TYPE_ABORT) + { + // Not an abort command + + // Wait for the data line to be free + while(read32(EMMC_STATUS) & 2) + { + delay_us(1000); + } + } + } +#endif + + // Set block size and block count + // For now, block size = 512 bytes, block count = 1, + if (m_blocks_to_transfer > 0xffff) + { + DEBUG_LOG("blocks_to_transfer too great(%d)\r\n", m_blocks_to_transfer); + m_last_cmd_success = 0; + return; + } + u32 blksizecnt = m_block_size |(m_blocks_to_transfer << 16); + write32(EMMC_BLKSIZECNT, blksizecnt); + + // Set argument 1 reg + write32(EMMC_ARG1, argument); + + // Set command reg + write32(EMMC_CMDTM, cmd_reg); + + //delay_us(2000); + + // Wait for command complete interrupt + TimeoutWait(EMMC_INTERRUPT, 0x8001, 1, timeout); + u32 irpts = read32(EMMC_INTERRUPT); + + // Clear command complete status + write32(EMMC_INTERRUPT, 0xffff0001); + + // Test for errors + if ((irpts & 0xffff0001) != 1) + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("Error occured whilst waiting for command complete interrupt"); +#endif + m_last_error = irpts & 0xffff0000; + m_last_interrupt = irpts; + + return; + } + + //delay_us(2000); + + // Get response data + switch(cmd_reg & SD_CMD_RSPNS_TYPE_MASK) + { + case SD_CMD_RSPNS_TYPE_48: + case SD_CMD_RSPNS_TYPE_48B: + m_last_r0 = read32(EMMC_RESP0); + break; + + case SD_CMD_RSPNS_TYPE_136: + m_last_r0 = read32(EMMC_RESP0); + m_last_r1 = read32(EMMC_RESP1); + m_last_r2 = read32(EMMC_RESP2); + m_last_r3 = read32(EMMC_RESP3); + break; + } + + // If with data, wait for the appropriate interrupt + if (cmd_reg & SD_CMD_ISDATA) + { + u32 wr_irpt; + int is_write = 0; + if (cmd_reg & SD_CMD_DAT_DIR_CH) + { + wr_irpt =(1 << 5); // read + } + else + { + is_write = 1; + wr_irpt =(1 << 4); // write + } + +#ifdef EMMC_DEBUG2 + if (m_blocks_to_transfer > 1) + { + DEBUG_LOG("Multi block transfer"); + } +#endif + TimeoutWait(EMMC_INTERRUPT, wr_irpt | 0x8000, 1, timeout); + irpts = read32(EMMC_INTERRUPT); + write32(EMMC_INTERRUPT, 0xffff0000 | wr_irpt); + + if ((irpts &(0xffff0000 | wr_irpt)) != wr_irpt) + { +#ifdef EMMC_DEBUG + DEBUG_LOG("Error occured whilst waiting for data ready interrupt"); +#endif + m_last_error = irpts & 0xffff0000; + m_last_interrupt = irpts; + + return; + } + + // Transfer the block + assert(m_block_size <= 1024); // internal FIFO size of EMMC + size_t length = m_block_size * m_blocks_to_transfer; + + assert(((u32) m_buf & 3) == 0); + assert((length & 3) == 0); + + u32 *pData =(u32 *) m_buf; + if (is_write) + { + for(; length > 0; length -= 4) + { + write32(EMMC_DATA, *pData++); + } + } + else + { + for(; length > 0; length -= 4) + { + *pData++ = read32(EMMC_DATA); + } + } + +#ifdef EMMC_DEBUG2 + DEBUG_LOG("Block transfer complete"); +#endif + } + + // Wait for transfer complete(set if read/write transfer or with busy) + if ( (cmd_reg & SD_CMD_RSPNS_TYPE_MASK) == SD_CMD_RSPNS_TYPE_48B + ||(cmd_reg & SD_CMD_ISDATA)) + { +#ifdef EMMC_POLL_STATUS_REG + // First check command inhibit(DAT) is not already 0 + if ((read32(EMMC_STATUS) & 2) == 0) + { + write32(EMMC_INTERRUPT, 0xffff0002); + } + else +#endif + { + TimeoutWait(EMMC_INTERRUPT, 0x8002, 1, timeout); + irpts = read32(EMMC_INTERRUPT); + write32(EMMC_INTERRUPT, 0xffff0002); + + // Handle the case where both data timeout and transfer complete + // are set - transfer complete overrides data timeout: HCSS 2.2.17 + if ( ((irpts & 0xffff0002) != 2) + &&((irpts & 0xffff0002) != 0x100002)) + { +#ifdef EMMC_DEBUG + DEBUG_LOG("Error occured whilst waiting for transfer complete interrupt"); +#endif + m_last_error = irpts & 0xffff0000; + m_last_interrupt = irpts; + + return; + } + + write32(EMMC_INTERRUPT, 0xffff0002); + } + } + + // Return success + m_last_cmd_success = 1; +} + +void CEMMCDevice::HandleCardInterrupt(void) +{ + // Handle a card interrupt + +#ifdef EMMC_DEBUG2 + u32 status = read32(EMMC_STATUS); + + DEBUG_LOG("Card interrupt"); + DEBUG_LOG("controller status: %08x\r\n", status); +#endif + + // Get the card status + if (m_card_rca) + { + IssueCommandInt(sd_commands[SEND_STATUS], m_card_rca << 16, 500000); + if (FAIL) + { +#ifdef EMMC_DEBUG + DEBUG_LOG("Unable to get card status"); +#endif + } + else + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("card status: %08x\r\n", m_last_r0); +#endif + } + } + else + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("no card currently selected"); +#endif + } +} + +void CEMMCDevice::HandleInterrupts(void) +{ + u32 irpts = read32(EMMC_INTERRUPT); + u32 reset_mask = 0; + + if (irpts & SD_COMMAND_COMPLETE) + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("spurious command complete interrupt"); +#endif + reset_mask |= SD_COMMAND_COMPLETE; + } + + if (irpts & SD_TRANSFER_COMPLETE) + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("spurious transfer complete interrupt"); +#endif + reset_mask |= SD_TRANSFER_COMPLETE; + } + + if (irpts & SD_BLOCK_GAP_EVENT) + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("spurious block gap event interrupt"); +#endif + reset_mask |= SD_BLOCK_GAP_EVENT; + } + + if (irpts & SD_DMA_INTERRUPT) + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("spurious DMA interrupt"); +#endif + reset_mask |= SD_DMA_INTERRUPT; + } + + if (irpts & SD_BUFFER_WRITE_READY) + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("spurious buffer write ready interrupt"); +#endif + reset_mask |= SD_BUFFER_WRITE_READY; + ResetDat(); + } + + if (irpts & SD_BUFFER_READ_READY) + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("spurious buffer read ready interrupt"); +#endif + reset_mask |= SD_BUFFER_READ_READY; + ResetDat(); + } + + if (irpts & SD_CARD_INSERTION) + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("card insertion detected"); +#endif + reset_mask |= SD_CARD_INSERTION; + } + + if (irpts & SD_CARD_REMOVAL) + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("card removal detected"); +#endif + reset_mask |= SD_CARD_REMOVAL; + m_card_removal = 1; + } + + if (irpts & SD_CARD_INTERRUPT) + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("card interrupt detected"); +#endif + HandleCardInterrupt(); + reset_mask |= SD_CARD_INTERRUPT; + } + + if (irpts & 0x8000) + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("spurious error interrupt: %08x\r\n", irpts); +#endif + reset_mask |= 0xffff0000; + } + + write32(EMMC_INTERRUPT, reset_mask); +} + +bool CEMMCDevice::IssueCommand(u32 command, u32 argument, int timeout) +{ + // First, handle any pending interrupts + HandleInterrupts(); + + // Stop the command issue if it was the card remove interrupt that was handled + if (m_card_removal) + { + m_last_cmd_success = 0; + return false; + } + + // Now run the appropriate commands by calling IssueCommandInt() + if (command & IS_APP_CMD) + { + command &= 0xff; +#ifdef EMMC_DEBUG2 + DEBUG_LOG("Issuing command ACMD%d\r\n", command); +#endif + + if (sd_acommands[command] == SD_CMD_RESERVED(0)) + { + DEBUG_LOG("Invalid command ACMD%d\r\n", command); + m_last_cmd_success = 0; + + return false; + } + m_last_cmd = APP_CMD; + + u32 rca = 0; + if (m_card_rca) + { + rca = m_card_rca << 16; + } + IssueCommandInt(sd_commands[APP_CMD], rca, timeout); + if (m_last_cmd_success) + { + m_last_cmd = command | IS_APP_CMD; + IssueCommandInt(sd_acommands[command], argument, timeout); + } + } + else + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("Issuing command CMD%d\r\n", command); +#endif + + if (sd_commands[command] == SD_CMD_RESERVED(0)) + { + DEBUG_LOG("Invalid command CMD%d\r\n", command); + m_last_cmd_success = 0; + + return false; + } + + m_last_cmd = command; + IssueCommandInt(sd_commands[command], argument, timeout); + } + +#ifdef EMMC_DEBUG2 + if (FAIL) + { + DEBUG_LOG("Error issuing %s%u(intr %08x)\r\n", m_last_cmd & IS_APP_CMD ? "ACMD" : "CMD\r\n", m_last_cmd & 0xff, m_last_interrupt); + + if (m_last_error == 0) + { + DEBUG_LOG("TIMEOUT"); + } + else + { + for(int i = 0; i < SD_ERR_RSVD; i++) + { + if (m_last_error &(1 <<(i + 16))) + { + DEBUG_LOG(err_irpts[i]); + } + } + } + } + else + { + DEBUG_LOG("command completed successfully"); + } +#endif + + return m_last_cmd_success; +} + +int CEMMCDevice::CardReset(void) +{ +#ifdef EMMC_DEBUG2 + DEBUG_LOG("Resetting controller"); +#endif + + u32 control1 = read32(EMMC_CONTROL1); + control1 |=(1 << 24); + // Disable clock + control1 &= ~(1 << 2); + control1 &= ~(1 << 0); + write32(EMMC_CONTROL1, control1); + if (TimeoutWait(EMMC_CONTROL1, 7 << 24, 0, 1000000) < 0) + { + DEBUG_LOG("Controller did not reset properly"); + + return -1; + } +#ifdef EMMC_DEBUG2 + DEBUG_LOG("control0: %08x, control1: %08x, control2: %08x\r\n", + read32(EMMC_CONTROL0), read32(EMMC_CONTROL1), read32(EMMC_CONTROL2)); +#endif + + // Check for a valid card +#ifdef EMMC_DEBUG2 + DEBUG_LOG("checking for an inserted card"); +#endif + TimeoutWait(EMMC_STATUS, 1 << 16, 1, 500000); + u32 status_reg = read32(EMMC_STATUS); + if ((status_reg &(1 << 16)) == 0) + { + DEBUG_LOG("no card inserted"); + + return -1; + } +#ifdef EMMC_DEBUG2 + DEBUG_LOG("status: %08x\r\n", status_reg); +#endif + + // Clear control2 + write32(EMMC_CONTROL2, 0); + + // Get the base clock rate + u32 base_clock = get_clock_rate(CLOCK_ID_EMMC); + if (base_clock == 0) + { + DEBUG_LOG("assuming clock rate to be 100MHz"); + base_clock = 100000000; + } + + // Set clock rate to something slow +#ifdef EMMC_DEBUG2 + DEBUG_LOG("setting clock rate"); +#endif + control1 = read32(EMMC_CONTROL1); + control1 |= 1; // enable clock + + // Set to identification frequency(400 kHz) + u32 f_id = GetClockDivider(base_clock, SD_CLOCK_ID); + if (f_id == SD_GET_CLOCK_DIVIDER_FAIL) + { + DEBUG_LOG("unable to get a valid clock divider for ID frequency"); + + return -1; + } + control1 |= f_id; + + // was not masked out and or'd with(7 << 16) in original driver + control1 &= ~(0xF << 16); + control1 |=(11 << 16); // data timeout = TMCLK * 2^24 + + write32(EMMC_CONTROL1, control1); + + if (TimeoutWait(EMMC_CONTROL1, 2, 1, 1000000) < 0) + { + DEBUG_LOG("Clock did not stabilise within 1 second"); + + return -1; + } +#ifdef EMMC_DEBUG2 + DEBUG_LOG("control0: %08x, control1: %08x\r\n", + read32(EMMC_CONTROL0), read32(EMMC_CONTROL1)); +#endif + + // Enable the SD clock +#ifdef EMMC_DEBUG2 + DEBUG_LOG("enabling SD clock"); +#endif + delay_us(2000); + control1 = read32(EMMC_CONTROL1); + control1 |= 4; + write32(EMMC_CONTROL1, control1); + delay_us(2000); + + // Mask off sending interrupts to the ARM + write32(EMMC_IRPT_EN, 0); + // Reset interrupts + write32(EMMC_INTERRUPT, 0xffffffff); + // Have all interrupts sent to the INTERRUPT register + u32 irpt_mask = 0xffffffff &(~SD_CARD_INTERRUPT); +#ifdef SD_CARD_INTERRUPTS + irpt_mask |= SD_CARD_INTERRUPT; +#endif + write32(EMMC_IRPT_MASK, irpt_mask); + + delay_us(2000); + + // >> Prepare the device structure + m_device_id[0] = 0; + m_device_id[1] = 0; + m_device_id[2] = 0; + m_device_id[3] = 0; + + m_card_supports_sdhc = 0; + m_card_supports_18v = 0; + m_card_ocr = 0; + m_card_rca = 0; + m_last_interrupt = 0; + m_last_error = 0; + + m_failed_voltage_switch = 0; + + m_last_cmd_reg = 0; + m_last_cmd = 0; + m_last_cmd_success = 0; + m_last_r0 = 0; + m_last_r1 = 0; + m_last_r2 = 0; + m_last_r3 = 0; + + m_buf = 0; + m_blocks_to_transfer = 0; + m_block_size = 0; + m_card_removal = 0; + m_base_clock = 0; + // << Prepare the device structure + + m_base_clock = base_clock; + + // Send CMD0 to the card(reset to idle state) + if (!IssueCommand(GO_IDLE_STATE, 0)) + { + DEBUG_LOG("no CMD0 response"); + + return -1; + } + + // Send CMD8 to the card + // Voltage supplied = 0x1 = 2.7-3.6V(standard) + // Check pattern = 10101010b(as per PLSS 4.3.13) = 0xAA +#ifdef EMMC_DEBUG2 + DEBUG_LOG("Note a timeout error on the following command(CMD8) is normal and expected if the SD card version is less than 2.0"); +#endif + IssueCommand(SEND_IF_COND, 0x1aa); + int v2_later = 0; + if (TIMEOUT) + { + v2_later = 0; + } + else if (CMD_TIMEOUT) + { + if (ResetCmd() == -1) + { + return -1; + } + write32(EMMC_INTERRUPT, SD_ERR_MASK_CMD_TIMEOUT); + v2_later = 0; + } + else if (FAIL) + { + DEBUG_LOG("failure sending CMD8(%08x)\r\n", m_last_interrupt); + + return -1; + } + else + { + if ((m_last_r0 & 0xfff) != 0x1aa) + { + DEBUG_LOG("unusable card"); +#ifdef EMMC_DEBUG + DEBUG_LOG("CMD8 response %08x\r\n", m_last_r0); +#endif + + return -1; + } + else + { + v2_later = 1; + } + } + + // Here we are supposed to check the response to CMD5(HCSS 3.6) + // It only returns if the card is a SDIO card +#ifdef EMMC_DEBUG2 + DEBUG_LOG("Note that a timeout error on the following command(CMD5) is normal and expected if the card is not a SDIO card."); +#endif + IssueCommand(IO_SET_OP_COND, 0, 10000); + if (!TIMEOUT) + { + if (CMD_TIMEOUT) + { + if (ResetCmd() == -1) + { + return -1; + } + + write32(EMMC_INTERRUPT, SD_ERR_MASK_CMD_TIMEOUT); + } + else + { + DEBUG_LOG("SDIO card detected - not currently supported"); +#ifdef EMMC_DEBUG2 + DEBUG_LOG("CMD5 returned %08x\r\n", m_last_r0); +#endif + + return -1; + } + } + + // Call an inquiry ACMD41(voltage window = 0) to get the OCR +#ifdef EMMC_DEBUG2 + DEBUG_LOG("sending inquiry ACMD41"); +#endif + if (!IssueCommand(ACMD(41), 0)) + { + DEBUG_LOG("Inquiry ACMD41 failed"); + return -1; + } +#ifdef EMMC_DEBUG2 + DEBUG_LOG("inquiry ACMD41 returned %08x\r\n", m_last_r0); +#endif + + // Call initialization ACMD41 + int card_is_busy = 1; + while(card_is_busy) + { + u32 v2_flags = 0; + if (v2_later) + { + // Set SDHC support + v2_flags |=(1 << 30); + + // Set 1.8v support +#ifdef SD_1_8V_SUPPORT + if (!m_failed_voltage_switch) + { + v2_flags |=(1 << 24); + } +#endif +#ifdef SDXC_MAXIMUM_PERFORMANCE + // Enable SDXC maximum performance + v2_flags |=(1 << 28); +#endif + } + + if (!IssueCommand(ACMD(41), 0x00ff8000 | v2_flags)) + { + DEBUG_LOG("Error issuing ACMD41"); + + return -1; + } + + if ((m_last_r0 >> 31) & 1) + { + // Initialization is complete + m_card_ocr =(m_last_r0 >> 8) & 0xffff; + m_card_supports_sdhc =(m_last_r0 >> 30) & 0x1; +#ifdef SD_1_8V_SUPPORT + if (!m_failed_voltage_switch) + { + m_card_supports_18v =(m_last_r0 >> 24) & 0x1; + } +#endif + + card_is_busy = 0; + } + else + { + // Card is still busy +#ifdef EMMC_DEBUG2 + DEBUG_LOG("Card is busy, retrying"); +#endif + delay_us(500000); + } + } + +#ifdef EMMC_DEBUG2 + DEBUG_LOG("card identified: OCR: %04x, 1.8v support: %d, SDHC support: %d\r\n", m_card_ocr, m_card_supports_18v, m_card_supports_sdhc); +#endif + + // At this point, we know the card is definitely an SD card, so will definitely + // support SDR12 mode which runs at 25 MHz + SwitchClockRate(base_clock, SD_CLOCK_NORMAL); + + // A small wait before the voltage switch + delay_us(5000); + + // Switch to 1.8V mode if possible + if (m_card_supports_18v) + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("switching to 1.8V mode"); +#endif + // As per HCSS 3.6.1 + + // Send VOLTAGE_SWITCH + if (!IssueCommand(VOLTAGE_SWITCH, 0)) + { +#ifdef EMMC_DEBUG + DEBUG_LOG("error issuing VOLTAGE_SWITCH"); +#endif + m_failed_voltage_switch = 1; + PowerOff(); + + return CardReset(); + } + + // Disable SD clock + control1 = read32(EMMC_CONTROL1); + control1 &= ~(1 << 2); + write32(EMMC_CONTROL1, control1); + + // Check DAT[3:0] + status_reg = read32(EMMC_STATUS); + u32 dat30 =(status_reg >> 20) & 0xf; + if (dat30 != 0) + { +#ifdef EMMC_DEBUG + DEBUG_LOG("DAT[3:0] did not settle to 0"); +#endif + m_failed_voltage_switch = 1; + PowerOff(); + + return CardReset(); + } + + // Set 1.8V signal enable to 1 + u32 control0 = read32(EMMC_CONTROL0); + control0 |=(1 << 8); + write32(EMMC_CONTROL0, control0); + + // Wait 5 ms + delay_us(5000); + + // Check the 1.8V signal enable is set + control0 = read32(EMMC_CONTROL0); + if (((control0 >> 8) & 1) == 0) + { +#ifdef EMMC_DEBUG + DEBUG_LOG("controller did not keep 1.8V signal enable high"); +#endif + m_failed_voltage_switch = 1; + PowerOff(); + + return CardReset(); + } + + // Re-enable the SD clock + control1 = read32(EMMC_CONTROL1); + control1 |=(1 << 2); + write32(EMMC_CONTROL1, control1); + + delay_us(10000); + + // Check DAT[3:0] + status_reg = read32(EMMC_STATUS); + dat30 =(status_reg >> 20) & 0xf; + if (dat30 != 0xf) + { +#ifdef EMMC_DEBUG + DEBUG_LOG("DAT[3:0] did not settle to 1111b(%01x)\r\n", dat30); +#endif + m_failed_voltage_switch = 1; + PowerOff(); + + return CardReset(); + } + +#ifdef EMMC_DEBUG2 + DEBUG_LOG("voltage switch complete"); +#endif + } + + // Send CMD2 to get the cards CID + if (!IssueCommand(ALL_SEND_CID, 0)) + { + DEBUG_LOG("error sending ALL_SEND_CID"); + + return -1; + } + m_device_id[0] = m_last_r0; + m_device_id[1] = m_last_r1; + m_device_id[2] = m_last_r2; + m_device_id[3] = m_last_r3; +#ifdef EMMC_DEBUG2 + DEBUG_LOG("Card CID: %08x%08x%08x%08x", + m_device_id[3], m_device_id[2], m_device_id[1], m_device_id[0]); +#endif + + // Send CMD3 to enter the data state + if (!IssueCommand(SEND_RELATIVE_ADDR, 0)) + { + DEBUG_LOG("error sending SEND_RELATIVE_ADDR"); + + return -1; + } + + u32 cmd3_resp = m_last_r0; +#ifdef EMMC_DEBUG2 + DEBUG_LOG("CMD3 response: %08x\r\n", cmd3_resp); +#endif + + m_card_rca =(cmd3_resp >> 16) & 0xffff; + u32 crc_error =(cmd3_resp >> 15) & 0x1; + u32 illegal_cmd =(cmd3_resp >> 14) & 0x1; + u32 error =(cmd3_resp >> 13) & 0x1; + u32 status =(cmd3_resp >> 9) & 0xf; + u32 ready =(cmd3_resp >> 8) & 0x1; + + if (crc_error) + { + DEBUG_LOG("CRC error"); + + return -1; + } + + if (illegal_cmd) + { + DEBUG_LOG("illegal command"); + + return -1; + } + + if (error) + { + DEBUG_LOG("generic error"); + + return -1; + } + + if (!ready) + { + DEBUG_LOG("not ready for data"); + + return -1; + } + +#ifdef EMMC_DEBUG2 + DEBUG_LOG("RCA: %04x\r\n", m_card_rca); +#endif + + // Now select the card(toggles it to transfer state) + if (!IssueCommand(SELECT_CARD, m_card_rca << 16)) + { + DEBUG_LOG("error sending CMD7"); + + return -1; + } + + u32 cmd7_resp = m_last_r0; + status =(cmd7_resp >> 9) & 0xf; + + if ((status != 3) &&(status != 4)) + { + DEBUG_LOG("Invalid status(%d)\r\n", status); + + return -1; + } + + // If not an SDHC card, ensure BLOCKLEN is 512 bytes + if (!m_card_supports_sdhc) + { + if (!IssueCommand(SET_BLOCKLEN, SD_BLOCK_SIZE)) + { + DEBUG_LOG("Error sending SET_BLOCKLEN"); + + return -1; + } + } + u32 controller_block_size = read32(EMMC_BLKSIZECNT); + controller_block_size &=(~0xfff); + controller_block_size |= 0x200; + write32(EMMC_BLKSIZECNT, controller_block_size); + + // Get the cards SCR register + m_buf = &m_SCR.scr[0]; + m_block_size = 8; + m_blocks_to_transfer = 1; + IssueCommand(SEND_SCR, 0); + m_block_size = SD_BLOCK_SIZE; + if (FAIL) + { + DEBUG_LOG("Error sending SEND_SCR"); + + return -1; + } + + // Determine card version + // Note that the SCR is big-endian + u32 scr0 = __builtin_bswap32(m_SCR.scr[0]); + m_SCR.sd_version = SD_VER_UNKNOWN; + u32 sd_spec =(scr0 >>(56 - 32)) & 0xf; + u32 sd_spec3 =(scr0 >>(47 - 32)) & 0x1; + u32 sd_spec4 =(scr0 >>(42 - 32)) & 0x1; + m_SCR.sd_bus_widths =(scr0 >>(48 - 32)) & 0xf; + if (sd_spec == 0) + { + m_SCR.sd_version = SD_VER_1; + } + else if (sd_spec == 1) + { + m_SCR.sd_version = SD_VER_1_1; + } + else if (sd_spec == 2) + { + if (sd_spec3 == 0) + { + m_SCR.sd_version = SD_VER_2; + } + else if (sd_spec3 == 1) + { + if (sd_spec4 == 0) + { + m_SCR.sd_version = SD_VER_3; + } + else if (sd_spec4 == 1) + { + m_SCR.sd_version = SD_VER_4; + } + } + } +#ifdef EMMC_DEBUG2 + DEBUG_LOG("SCR[0]: %08x, SCR[1]: %08x\r\n", m_SCR.scr[0], m_SCR.scr[1]);; + DEBUG_LOG("SCR: %08x%08x\r\n", __builtin_bswap32(m_SCR.scr[0]), __builtin_bswap32(m_SCR.scr[1])); + DEBUG_LOG("SCR: version %s, bus_widths %01x\r\n", sd_versions[m_SCR.sd_version], m_SCR.sd_bus_widths); +#endif + + if (m_SCR.sd_bus_widths & 4) + { + // Set 4-bit transfer mode(ACMD6) + // See HCSS 3.4 for the algorithm +#ifdef SD_4BIT_DATA +#ifdef EMMC_DEBUG2 + DEBUG_LOG("Switching to 4-bit data mode"); +#endif + + // Disable card interrupt in host + u32 old_irpt_mask = read32(EMMC_IRPT_MASK); + u32 new_iprt_mask = old_irpt_mask & ~(1 << 8); + write32(EMMC_IRPT_MASK, new_iprt_mask); + + // Send ACMD6 to change the card's bit mode + if (!IssueCommand(SET_BUS_WIDTH, 2)) + { + DEBUG_LOG("Switch to 4-bit data mode failed"); + } + else + { + // Change bit mode for Host + u32 control0 = read32(EMMC_CONTROL0); + control0 |= 0x2; + write32(EMMC_CONTROL0, control0); + + // Re-enable card interrupt in host + write32(EMMC_IRPT_MASK, old_irpt_mask); + +#ifdef EMMC_DEBUG2 + DEBUG_LOG("switch to 4-bit complete"); +#endif + } +#endif + } + + DEBUG_LOG("Found a valid version %s SD card\r\n", sd_versions[m_SCR.sd_version]); +#ifdef EMMC_DEBUG2 + DEBUG_LOG("setup successful(status %d)\r\n", status); +#endif + + // Reset interrupt register + write32(EMMC_INTERRUPT, 0xffffffff); + + return 0; +} + +int CEMMCDevice::EnsureDataMode(void) +{ + if (m_card_rca == 0) + { + // Try again to initialise the card + int ret = CardReset(); + if (ret != 0) + { + return ret; + } + } + +#ifdef EMMC_DEBUG2 + DEBUG_LOG("EnsureDataMode() obtaining status register for card_rca %08x: \r\n", m_card_rca); +#endif + + if (!IssueCommand(SEND_STATUS, m_card_rca << 16)) + { + DEBUG_LOG("EnsureDataMode() error sending CMD13"); + m_card_rca = 0; + + return -1; + } + + u32 status = m_last_r0; + u32 cur_state =(status >> 9) & 0xf; +#ifdef EMMC_DEBUG2 + DEBUG_LOG("status %d\r\n", cur_state); +#endif + if (cur_state == 3) + { + // Currently in the stand-by state - select it + if (!IssueCommand(SELECT_CARD, m_card_rca << 16)) + { + DEBUG_LOG("EnsureDataMode() no response from CMD17"); + m_card_rca = 0; + + return -1; + } + } + else if (cur_state == 5) + { + // In the data transfer state - cancel the transmission + if (!IssueCommand(STOP_TRANSMISSION, 0)) + { + DEBUG_LOG("EnsureDataMode() no response from CMD12"); + m_card_rca = 0; + + return -1; + } + + // Reset the data circuit + ResetDat(); + } + else if (cur_state != 4) + { + // Not in the transfer state - re-initialise + int ret = CardReset(); + if (ret != 0) + { + return ret; + } + } + + // Check again that we're now in the correct mode + if (cur_state != 4) + { +#ifdef EMMC_DEBUG2 + DEBUG_LOG("EnsureDataMode() rechecking status: "); +#endif + if (!IssueCommand(SEND_STATUS, m_card_rca << 16)) + { + DEBUG_LOG("EnsureDataMode() no response from CMD13"); + m_card_rca = 0; + + return -1; + } + status = m_last_r0; + cur_state =(status >> 9) & 0xf; +#ifdef EMMC_DEBUG2 + DEBUG_LOG("status %d\r\n", cur_state); +#endif + + if (cur_state != 4) + { + DEBUG_LOG("unable to initialise SD card to data mode(state %d)\r\n", cur_state); + m_card_rca = 0; + + return -1; + } + } + + return 0; +} + +int CEMMCDevice::DoDataCommand(int is_write, u8 *buf, size_t buf_size, u32 block_no) +{ + // PLSS table 4.20 - SDSC cards use byte addresses rather than block addresses + if (!m_card_supports_sdhc) + { + block_no *= SD_BLOCK_SIZE; + } + + // This is as per HCSS 3.7.2.1 + if (buf_size < m_block_size) + { + DEBUG_LOG("DoDataCommand() called with buffer size(%d) less than block size(%d)\r\n", buf_size, m_block_size); + + return -1; + } + + m_blocks_to_transfer = buf_size / m_block_size; + if (buf_size % m_block_size) + { + DEBUG_LOG("DoDataCommand() called with buffer size(%d) not an exact multiple of block size(%d)\r\n", buf_size, m_block_size); + + return -1; + } + m_buf = buf; + + // Decide on the command to use + int command; + if (is_write) + { + if (m_blocks_to_transfer > 1) + { + command = WRITE_MULTIPLE_BLOCK; + } + else + { + command = WRITE_BLOCK; + } + } + else + { + if (m_blocks_to_transfer > 1) + { + command = READ_MULTIPLE_BLOCK; + } + else + { + command = READ_SINGLE_BLOCK; + } + } + + int retry_count = 0; + int max_retries = 3; + while(retry_count < max_retries) + { + if (IssueCommand(command, block_no, 5000000)) + { + break; + } + else + { + DEBUG_LOG("error sending CMD%d\r\n", command); + DEBUG_LOG("error = %08x\r\n", m_last_error); + + if (++retry_count < max_retries) + { + DEBUG_LOG("Retrying"); + } + else + { + DEBUG_LOG("Giving up"); + } + } + } + + if (retry_count == max_retries) + { + m_card_rca = 0; + + return -1; + } + + return 0; +} + +int CEMMCDevice::DoRead(u8 *buf, size_t buf_size, u32 block_no) +{ +// g_pLogger->Write("\r\n", LogNotice, "DoRead %d\r\n", block_no); + + // Check the status of the card + if (EnsureDataMode() != 0) + { + return -1; + } + +#ifdef EMMC_DEBUG2 + DEBUG_LOG("Reading from block %u %08x\r\n", block_no,(unsigned)buf); +#endif + + if (DoDataCommand(0, buf, buf_size, block_no) < 0) + { + return -1; + } + + //int y = 0; + //int index = 0; + //for(y = 0; y <(512 / 8); ++y) + //{ + // g_pLogger->Write("\r\n", LogNotice, "%04x, %02x %02x %02x %02x %02x %02x %02x %02x" + // , index + // , buf[index] + // , buf[index + 1] + // , buf[index + 2] + // , buf[index + 3] + // , buf[index + 4] + // , buf[index + 5] + // , buf[index + 6] + // , buf[index + 7] + // ); + // index += 8; + //} + +#ifdef EMMC_DEBUG2 + DEBUG_LOG("Data read successful"); +#endif + + return buf_size; +} + +int CEMMCDevice::DoWrite(u8 *buf, size_t buf_size, u32 block_no) +{ + // Check the status of the card + if (EnsureDataMode() != 0) + { + return -1; + } + +#ifdef EMMC_DEBUG2 + DEBUG_LOG("Writing to block %u\r\n", block_no); +#endif + + if (DoDataCommand(1, buf, buf_size, block_no) < 0) + { + return -1; + } + +#ifdef EMMC_DEBUG2 + DEBUG_LOG("Data write successful"); +#endif + + return buf_size; +} + +int CEMMCDevice::TimeoutWait(unsigned reg, unsigned mask, int value, unsigned usec) +{ + unsigned nCount = usec / 1000; + + do + { + delay_us(1); + + if ((read32(reg) & mask) ? value : !value) + { + return 0; + } + + delay_us(999); + } + while(nCount--); + + return -1; +} diff --git a/emmc.h b/emmc.h new file mode 100644 index 0000000..2b6ec3c --- /dev/null +++ b/emmc.h @@ -0,0 +1,108 @@ +#ifndef _SDCard_emmc_h +#define _SDCard_emmc_h + +#define PACKED __attribute__ ((packed)) + +#include "types.h" + +/* +#include +//#include +#include +#include +#include +#include +#include +*/ + +#define BOOT_SIGNATURE 0xAA55 + +struct TSCR // SD configuration register +{ + u32 scr[2]; + u32 sd_bus_widths; + int sd_version; +}; + +class CEMMCDevice +{ +public: + CEMMCDevice(); + ~CEMMCDevice(); + + bool Initialize(void); + + int Read(void *pBuffer, unsigned nCount); + int Write(const void *pBuffer, unsigned nCount); + + unsigned long long Seek(unsigned long long ullOffset); + + int DoRead2(u8 *buf, size_t buf_size, u32 block_no); + int DoRead(u8 *buf, size_t buf_size, u32 block_no); + int DoWrite(u8 *buf, size_t buf_size, u32 block_no); + +private: + bool PowerOn(void); + void PowerOff(void); + + u32 GetBaseClock(void); + u32 GetClockDivider(u32 base_clock, u32 target_rate); + int SwitchClockRate(u32 base_clock, u32 target_rate); + + int ResetCmd(void); + int ResetDat(void); + + void IssueCommandInt(u32 cmd_reg, u32 argument, int timeout); + void HandleCardInterrupt(void); + void HandleInterrupts(void); + bool IssueCommand(u32 command, u32 argument, int timeout = 500000); + + int CardReset(void); + int CardInit(void); + + int EnsureDataMode(void); + int DoDataCommand(int is_write, u8 *buf, size_t buf_size, u32 block_no); + + int TimeoutWait(unsigned reg, unsigned mask, int value, unsigned usec); + + void usDelay(unsigned usec); + +private: + u64 m_ullOffset; + + u32 m_hci_ver; + + // was: struct emmc_block_dev + u32 m_device_id[4]; + + u32 m_card_supports_sdhc; + u32 m_card_supports_18v; + u32 m_card_ocr; + u32 m_card_rca; + u32 m_last_interrupt; + u32 m_last_error; + + TSCR m_SCR; + + int m_failed_voltage_switch; + + u32 m_last_cmd_reg; + u32 m_last_cmd; + u32 m_last_cmd_success; + u32 m_last_r0; + u32 m_last_r1; + u32 m_last_r2; + u32 m_last_r3; + + void *m_buf; + int m_blocks_to_transfer; + size_t m_block_size; + int m_card_removal; + u32 m_base_clock; + + static const char *sd_versions[]; + static const char *err_irpts[]; + static const u32 sd_commands[]; + static const u32 sd_acommands[]; +}; +#endif diff --git a/exception.c b/exception.c new file mode 100644 index 0000000..3ac5d7a --- /dev/null +++ b/exception.c @@ -0,0 +1,179 @@ +#include "rpi-base.h" +#include "rpi-aux.h" +#include "rpi-gpio.h" +#include "rpi-interrupts.h" +#include "defs.h" +#include "startup.h" + +// From here: https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=53862 +void reboot_now(void) +{ + const int PM_PASSWORD = 0x5a000000; + const int PM_RSTC_WRCFG_FULL_RESET = 0x00000020; + unsigned int *PM_WDOG = (unsigned int *) (PERIPHERAL_BASE + 0x00100024); + unsigned int *PM_RSTC = (unsigned int *) (PERIPHERAL_BASE + 0x0010001c); + + // timeout = 1/16th of a second? (whatever) + *PM_WDOG = PM_PASSWORD | 1; + *PM_RSTC = PM_PASSWORD | PM_RSTC_WRCFG_FULL_RESET; + while(1); +} + +void dump_digit(unsigned int c) { + c &= 15; + if (c < 10) { + c = '0' + c; + } else { + c = 'A' + c - 10; + } + RPI_AuxMiniUartWrite(c); +} + +void dump_hex(unsigned int value) { + int i; + for (i = 0; i < 8; i++) { + int c = value >> 28; + if (c < 10) { + c = '0' + c; + } else { + c = 'A' + c - 10; + } + RPI_AuxMiniUartWrite(c); + value <<= 4; + } +} + +void dump_binary(unsigned int value) { + int i; + for (i = 0; i < 32; i++) { + int c = '0' + (value >> 31); + RPI_AuxMiniUartWrite(c); + value <<= 1; + } +} + +void dump_string(char *string) { + char c; + while ((c = *string++) != 0) { + RPI_AuxMiniUartWrite(c); + } +} + +// For some reason printf generally doesn't work here +void dump_info(unsigned int *context, int offset, char *type) { + unsigned int *addr; + unsigned int *reg; + unsigned int flags; + int i, j; + //int rstlow; + //int led; + + // Make sure we avoid unaligned accesses + context = (unsigned int *)(((unsigned int) context) & ~3); + // context point into the exception stack, at flags, followed by registers 0 .. 13 + reg = context + 1; + dump_string(type); + dump_string(" at "); + // The stacked LR points one or two words afer the exception address + addr = (unsigned int *)((reg[13] & ~3) - offset); + dump_hex((unsigned int)addr); +#ifdef HAS_MULTICORE + //dump_string(" on core "); + //dump_digit(_get_core()); +#endif + dump_string("\r\n"); + dump_string("Registers:\r\n"); + for (i = 0; i <= 13; i++) { + j = (i < 13) ? i : 14; // slot 13 actually holds the link register + dump_string(" r["); + RPI_AuxMiniUartWrite('0' + (j / 10)); + RPI_AuxMiniUartWrite('0' + (j % 10)); + dump_string("]="); + dump_hex(reg[i]); + dump_string("\r\n"); + } + dump_string("Memory:\r\n"); + for (i = -4; i <= 4; i++) { + dump_string(" "); + dump_hex((unsigned int) (addr + i)); + RPI_AuxMiniUartWrite('='); + dump_hex(*(addr + i)); + if (i == 0) { + dump_string(" <<<<<< \r\n"); + } else { + dump_string("\r\n"); + } + } + // The flags are pointed to by context, before the registers + flags = *context; + dump_string("Flags: \r\n NZCV--------------------IFTMMMMM\r\n "); + dump_binary(flags); + dump_string(" ("); + // The last 5 bits of the flags are the mode + switch (flags & 0x1f) { + case 0x10: + dump_string("User"); + break; + case 0x11: + dump_string("FIQ"); + break; + case 0x12: + dump_string("IRQ"); + break; + case 0x13: + dump_string("Supervisor"); + break; + case 0x17: + dump_string("Abort"); + break; + case 0x1B: + dump_string("Undefined"); + break; + case 0x1F: + dump_string("System"); + break; + default: + dump_string("Illegal"); + break; + }; + dump_string(" Mode)\r\n"); + + dump_string("Halted waiting for reset\r\n"); + //rstlow = 0; + //led = 0; + // while (1) { + //for (i = 0; i < 1000000; i++) { + + // // look for reset being low + // if (tube_is_rst_active()) { + // rstlow = 1; + // } + // // then reset on the next rising edge + // if (rstlow && (!tube_is_rst_active())) { + // reboot_now(); + // } + //} + //if (led) { + // LED_OFF(); + //} else { + // LED_ON(); + //} + //led = ~led; + // } +} + +void undefined_instruction_handler(unsigned int *context) { + dump_info(context, 4, "Undefined Instruction"); +} + +void prefetch_abort_handler(unsigned int *context) { + dump_info(context, 4, "Prefetch Abort"); +} + +void data_abort_handler(unsigned int *context) { + dump_info(context, 8, "Data Abort"); +} + +void swi_handler(unsigned int *context) { + dump_info(context, 4, "SWI"); +} diff --git a/ff.cpp b/ff.cpp new file mode 100644 index 0000000..5a27728 --- /dev/null +++ b/ff.cpp @@ -0,0 +1,6052 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - Generic FAT file system module R0.12b / +/-----------------------------------------------------------------------------/ +/ +/ Copyright (C) 2016, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: + +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/----------------------------------------------------------------------------*/ + + +#include "ff.h" /* Declarations of FatFs API */ +#include "diskio.h" /* Declarations of device I/O functions */ + + +/*-------------------------------------------------------------------------- + + Module Private Definitions + +---------------------------------------------------------------------------*/ + +#if _FATFS != 68020 /* Revision ID */ +#error Wrong include file (ff.h). +#endif + + +#define ABORT(fs, res) { fp->err = (BYTE)(res); LEAVE_FF(fs, res); } + + +/* Reentrancy related */ +#if _FS_REENTRANT +#if _USE_LFN == 1 +#error Static LFN work area cannot be used at thread-safe configuration +#endif +#define ENTER_FF(fs) { if (!lock_fs(fs)) return FR_TIMEOUT; } +#define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } +#else +#define ENTER_FF(fs) +#define LEAVE_FF(fs, res) return res +#endif + + + +/* Definitions of sector size */ +#if (_MAX_SS < _MIN_SS) || (_MAX_SS != 512 && _MAX_SS != 1024 && _MAX_SS != 2048 && _MAX_SS != 4096) || (_MIN_SS != 512 && _MIN_SS != 1024 && _MIN_SS != 2048 && _MIN_SS != 4096) +#error Wrong sector size configuration +#endif +#if _MAX_SS == _MIN_SS +#define SS(fs) ((UINT)_MAX_SS) /* Fixed sector size */ +#else +#define SS(fs) ((fs)->ssize) /* Variable sector size */ +#endif + + +/* Timestamp */ +#if _FS_NORTC == 1 +#if _NORTC_YEAR < 1980 || _NORTC_YEAR > 2107 || _NORTC_MON < 1 || _NORTC_MON > 12 || _NORTC_MDAY < 1 || _NORTC_MDAY > 31 +#error Invalid _FS_NORTC settings +#endif +#define GET_FATTIME() ((DWORD)(_NORTC_YEAR - 1980) << 25 | (DWORD)_NORTC_MON << 21 | (DWORD)_NORTC_MDAY << 16) +#else +#define GET_FATTIME() get_fattime() +#endif + + +/* File lock controls */ +#if _FS_LOCK != 0 +#if _FS_READONLY +#error _FS_LOCK must be 0 at read-only configuration +#endif +typedef struct { + FATFS *fs; /* Object ID 1, volume (NULL:blank entry) */ + DWORD clu; /* Object ID 2, directory (0:root) */ + DWORD ofs; /* Object ID 3, directory offset */ + WORD ctr; /* Object open counter, 0:none, 0x01..0xFF:read mode open count, 0x100:write mode */ +} FILESEM; +#endif + + + +/* DBCS code ranges and SBCS upper conversion tables */ + +#if _CODE_PAGE == 932 /* Japanese Shift-JIS */ +#define _DF1S 0x81 /* DBC 1st byte range 1 start */ +#define _DF1E 0x9F /* DBC 1st byte range 1 end */ +#define _DF2S 0xE0 /* DBC 1st byte range 2 start */ +#define _DF2E 0xFC /* DBC 1st byte range 2 end */ +#define _DS1S 0x40 /* DBC 2nd byte range 1 start */ +#define _DS1E 0x7E /* DBC 2nd byte range 1 end */ +#define _DS2S 0x80 /* DBC 2nd byte range 2 start */ +#define _DS2E 0xFC /* DBC 2nd byte range 2 end */ + +#elif _CODE_PAGE == 936 /* Simplified Chinese GBK */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0x80 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 949 /* Korean */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x41 +#define _DS1E 0x5A +#define _DS2S 0x61 +#define _DS2E 0x7A +#define _DS3S 0x81 +#define _DS3E 0xFE + +#elif _CODE_PAGE == 950 /* Traditional Chinese Big5 */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0xA1 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 437 /* U.S. */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 720 /* Arabic */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 737 /* Greek */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xEF,0xF5,0xF0,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 771 /* KBL */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDC,0xDE,0xDE, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFE,0xFF} + +#elif _CODE_PAGE == 775 /* Baltic */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 850 /* Latin 1 */ +#define _DF1S 0 +#define _EXCVT {0x43,0x55,0x45,0x41,0x41,0x41,0x41,0x43,0x45,0x45,0x45,0x49,0x49,0x49,0x41,0x41, \ + 0x45,0x92,0x92,0x4F,0x4F,0x4F,0x55,0x55,0x59,0x4F,0x55,0x4F,0x9C,0x4F,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0x41,0x41,0x41,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0x41,0x41,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0x45,0x45,0x45,0x49,0x49,0x49,0x49,0xD9,0xDA,0xDB,0xDC,0xDD,0x49,0xDF, \ + 0x4F,0xE1,0x4F,0x4F,0x4F,0x4F,0xE6,0xE8,0xE8,0x55,0x55,0x55,0x59,0x59,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 852 /* Latin 2 */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0xAC, \ + 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} + +#elif _CODE_PAGE == 855 /* Cyrillic */ +#define _DF1S 0 +#define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F, \ + 0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ + 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ + 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF, \ + 0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 857 /* Turkish */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0x49,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 860 /* Portuguese */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0x8F,0x8E,0x91,0x86,0x80,0x89,0x89,0x92,0x8B,0x8C,0x98,0x8E,0x8F, \ + 0x90,0x91,0x92,0x8C,0x99,0xA9,0x96,0x9D,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x86,0x8B,0x9F,0x96,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 861 /* Icelandic */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x8B,0x8B,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x8D,0x55,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA4,0xA5,0xA6,0xA7,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 862 /* Hebrew */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 863 /* Canadian-French */ +#define _DF1S 0 +#define _EXCVT {0x43,0x55,0x45,0x41,0x41,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x41,0x8F, \ + 0x45,0x45,0x45,0x4F,0x45,0x49,0x55,0x55,0x98,0x4F,0x55,0x9B,0x9C,0x55,0x55,0x9F, \ + 0xA0,0xA1,0x4F,0x55,0xA4,0xA5,0xA6,0xA7,0x49,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 864 /* Arabic */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 865 /* Nordic */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 866 /* Russian */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 869 /* Greek 2 */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x86,0x9C,0x8D,0x8F,0x90, \ + 0x91,0x90,0x92,0x95,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xA4,0xA5,0xA6,0xD9,0xDA,0xDB,0xDC,0xA7,0xA8,0xDF, \ + 0xA9,0xAA,0xAC,0xAD,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xCF,0xCF,0xD0,0xEF, \ + 0xF0,0xF1,0xD1,0xD2,0xD3,0xF5,0xD4,0xF7,0xF8,0xF9,0xD5,0x96,0x95,0x98,0xFE,0xFF} + +#elif _CODE_PAGE == 1 /* ASCII (for only non-LFN cfg) */ +#if _USE_LFN != 0 +#error Cannot enable LFN without valid code page. +#endif +#define _DF1S 0 + +#else +#error Unknown code page + +#endif + + +/* Character code support macros */ +#define IsUpper(c) (((c)>='A')&&((c)<='Z')) +#define IsLower(c) (((c)>='a')&&((c)<='z')) +#define IsDigit(c) (((c)>='0')&&((c)<='9')) + +#if _DF1S != 0 /* Code page is DBCS */ + +#ifdef _DF2S /* Two 1st byte areas */ +#define IsDBCS1(c) (((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) || ((BYTE)(c) >= _DF2S && (BYTE)(c) <= _DF2E)) +#else /* One 1st byte area */ +#define IsDBCS1(c) ((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) +#endif + +#ifdef _DS3S /* Three 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E) || ((BYTE)(c) >= _DS3S && (BYTE)(c) <= _DS3E)) +#else /* Two 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E)) +#endif + +#else /* Code page is SBCS */ + +#define IsDBCS1(c) 0 +#define IsDBCS2(c) 0 + +#endif /* _DF1S */ + + +/* File attribute bits (internal use) */ +#define AM_VOL 0x08 /* Volume label */ +#define AM_LFN 0x0F /* LFN entry */ +#define AM_MASK 0x3F /* Mask of defined bits */ + + +/* File access control and file status flags (internal use) */ +#define FA_SEEKEND 0x20 /* Seek to end of the file on file open */ +#define FA_MODIFIED 0x40 /* File has been modified */ +#define FA_DIRTY 0x80 /* FIL.buf[] needs to be written-back */ + + +/* Name status flags */ +#define NSFLAG 11 /* Index of name status byte in fn[] */ +#define NS_LOSS 0x01 /* Out of 8.3 format */ +#define NS_LFN 0x02 /* Force to create LFN entry */ +#define NS_LAST 0x04 /* Last segment */ +#define NS_BODY 0x08 /* Lower case flag (body) */ +#define NS_EXT 0x10 /* Lower case flag (ext) */ +#define NS_DOT 0x20 /* Dot entry */ +#define NS_NOLFN 0x40 /* Do not find LFN */ +#define NS_NONAME 0x80 /* Not followed */ + + +/* Limits and boundaries (differ from specs but correct for real DOS/Windows) */ +#define MAX_FAT12 0xFF5 /* Maximum number of FAT12 clusters */ +#define MAX_FAT16 0xFFF5 /* Maximum number of FAT16 clusters */ +#define MAX_FAT32 0xFFFFFF5 /* Maximum number of FAT32 clusters */ +#define MAX_EXFAT 0x7FFFFFFD /* Maximum number of exFAT clusters (limited by implementation) */ +#define MAX_DIR 0x200000 /* Maximum size of FAT directory */ +#define MAX_DIR_EX 0x10000000 /* Maximum size of exFAT directory */ + + +/* FatFs refers the members in the FAT structures as byte array instead of +/ structure members because the structure is not binary compatible between +/ different platforms */ + +#define BS_JmpBoot 0 /* x86 jump instruction (3-byte) */ +#define BS_OEMName 3 /* OEM name (8-byte) */ +#define BPB_BytsPerSec 11 /* Sector size [byte] (WORD) */ +#define BPB_SecPerClus 13 /* Cluster size [sector] (BYTE) */ +#define BPB_RsvdSecCnt 14 /* Size of reserved area [sector] (WORD) */ +#define BPB_NumFATs 16 /* Number of FATs (BYTE) */ +#define BPB_RootEntCnt 17 /* Size of root directory area for FAT12/16 [entry] (WORD) */ +#define BPB_TotSec16 19 /* Volume size (16-bit) [sector] (WORD) */ +#define BPB_Media 21 /* Media descriptor byte (BYTE) */ +#define BPB_FATSz16 22 /* FAT size (16-bit) [sector] (WORD) */ +#define BPB_SecPerTrk 24 /* Track size for int13h [sector] (WORD) */ +#define BPB_NumHeads 26 /* Number of heads for int13h (WORD) */ +#define BPB_HiddSec 28 /* Volume offset from top of the drive (DWORD) */ +#define BPB_TotSec32 32 /* Volume size (32-bit) [sector] (DWORD) */ +#define BS_DrvNum 36 /* Physical drive number for int13h (BYTE) */ +#define BS_NTres 37 /* Error flag (BYTE) */ +#define BS_BootSig 38 /* Extended boot signature (BYTE) */ +#define BS_VolID 39 /* Volume serial number (DWORD) */ +#define BS_VolLab 43 /* Volume label string (8-byte) */ +#define BS_FilSysType 54 /* File system type string (8-byte) */ +#define BS_BootCode 62 /* Boot code (448-byte) */ +#define BS_55AA 510 /* Signature word (WORD) */ + +#define BPB_FATSz32 36 /* FAT32: FAT size [sector] (DWORD) */ +#define BPB_ExtFlags32 40 /* FAT32: Extended flags (WORD) */ +#define BPB_FSVer32 42 /* FAT32: File system version (WORD) */ +#define BPB_RootClus32 44 /* FAT32: Root directory cluster (DWORD) */ +#define BPB_FSInfo32 48 /* FAT32: Offset of FSINFO sector (WORD) */ +#define BPB_BkBootSec32 50 /* FAT32: Offset of backup boot sector (WORD) */ +#define BS_DrvNum32 64 /* FAT32: Physical drive number for int13h (BYTE) */ +#define BS_NTres32 65 /* FAT32: Error flag (BYTE) */ +#define BS_BootSig32 66 /* FAT32: Extended boot signature (BYTE) */ +#define BS_VolID32 67 /* FAT32: Volume serial number (DWORD) */ +#define BS_VolLab32 71 /* FAT32: Volume label string (8-byte) */ +#define BS_FilSysType32 82 /* FAT32: File system type string (8-byte) */ +#define BS_BootCode32 90 /* FAT32: Boot code (420-byte) */ + +#define BPB_ZeroedEx 11 /* exFAT: MBZ field (53-byte) */ +#define BPB_VolOfsEx 64 /* exFAT: Volume offset from top of the drive [sector] (QWORD) */ +#define BPB_TotSecEx 72 /* exFAT: Volume size [sector] (QWORD) */ +#define BPB_FatOfsEx 80 /* exFAT: FAT offset from top of the volume [sector] (DWORD) */ +#define BPB_FatSzEx 84 /* exFAT: FAT size [sector] (DWORD) */ +#define BPB_DataOfsEx 88 /* exFAT: Data offset from top of the volume [sector] (DWORD) */ +#define BPB_NumClusEx 92 /* exFAT: Number of clusters (DWORD) */ +#define BPB_RootClusEx 96 /* exFAT: Root directory cluster (DWORD) */ +#define BPB_VolIDEx 100 /* exFAT: Volume serial number (DWORD) */ +#define BPB_FSVerEx 104 /* exFAT: File system version (WORD) */ +#define BPB_VolFlagEx 106 /* exFAT: Volume flags (BYTE) */ +#define BPB_ActFatEx 107 /* exFAT: Active FAT flags (BYTE) */ +#define BPB_BytsPerSecEx 108 /* exFAT: Log2 of sector size in byte (BYTE) */ +#define BPB_SecPerClusEx 109 /* exFAT: Log2 of cluster size in sector (BYTE) */ +#define BPB_NumFATsEx 110 /* exFAT: Number of FATs (BYTE) */ +#define BPB_DrvNumEx 111 /* exFAT: Physical drive number for int13h (BYTE) */ +#define BPB_PercInUseEx 112 /* exFAT: Percent in use (BYTE) */ +#define BPB_RsvdEx 113 /* exFAT: Reserved (7-byte) */ +#define BS_BootCodeEx 120 /* exFAT: Boot code (390-byte) */ + +#define FSI_LeadSig 0 /* FAT32 FSI: Leading signature (DWORD) */ +#define FSI_StrucSig 484 /* FAT32 FSI: Structure signature (DWORD) */ +#define FSI_Free_Count 488 /* FAT32 FSI: Number of free clusters (DWORD) */ +#define FSI_Nxt_Free 492 /* FAT32 FSI: Last allocated cluster (DWORD) */ + +#define MBR_Table 446 /* MBR: Offset of partition table in the MBR */ +#define SZ_PTE 16 /* MBR: Size of a partition table entry */ +#define PTE_Boot 0 /* MBR PTE: Boot indicator */ +#define PTE_StHead 1 /* MBR PTE: Start head */ +#define PTE_StSec 2 /* MBR PTE: Start sector */ +#define PTE_StCyl 3 /* MBR PTE: Start cylinder */ +#define PTE_System 4 /* MBR PTE: System ID */ +#define PTE_EdHead 5 /* MBR PTE: End head */ +#define PTE_EdSec 6 /* MBR PTE: End sector */ +#define PTE_EdCyl 7 /* MBR PTE: End cylinder */ +#define PTE_StLba 8 /* MBR PTE: Start in LBA */ +#define PTE_SizLba 12 /* MBR PTE: Size in LBA */ + +#define DIR_Name 0 /* Short file name (11-byte) */ +#define DIR_Attr 11 /* Attribute (BYTE) */ +#define DIR_NTres 12 /* Lower case flag (BYTE) */ +#define DIR_CrtTime10 13 /* Created time sub-second (BYTE) */ +#define DIR_CrtTime 14 /* Created time (DWORD) */ +#define DIR_LstAccDate 18 /* Last accessed date (WORD) */ +#define DIR_FstClusHI 20 /* Higher 16-bit of first cluster (WORD) */ +#define DIR_ModTime 22 /* Modified time (DWORD) */ +#define DIR_FstClusLO 26 /* Lower 16-bit of first cluster (WORD) */ +#define DIR_FileSize 28 /* File size (DWORD) */ +#define LDIR_Ord 0 /* LFN entry order and LLE flag (BYTE) */ +#define LDIR_Attr 11 /* LFN attribute (BYTE) */ +#define LDIR_Type 12 /* LFN type (BYTE) */ +#define LDIR_Chksum 13 /* Checksum of the SFN entry (BYTE) */ +#define LDIR_FstClusLO 26 /* Must be zero (WORD) */ +#define XDIR_Type 0 /* Type of exFAT directory entry (BYTE) */ +#define XDIR_NumLabel 1 /* Number of volume label characters (BYTE) */ +#define XDIR_Label 2 /* Volume label (11-WORD) */ +#define XDIR_CaseSum 4 /* Sum of case conversion table (DWORD) */ +#define XDIR_NumSec 1 /* Number of secondary entries (BYTE) */ +#define XDIR_SetSum 2 /* Sum of the set of directory entries (WORD) */ +#define XDIR_Attr 4 /* File attribute (WORD) */ +#define XDIR_CrtTime 8 /* Created time (DWORD) */ +#define XDIR_ModTime 12 /* Modified time (DWORD) */ +#define XDIR_AccTime 16 /* Last accessed time (DWORD) */ +#define XDIR_CrtTime10 20 /* Created time subsecond (BYTE) */ +#define XDIR_ModTime10 21 /* Modified time subsecond (BYTE) */ +#define XDIR_CrtTZ 22 /* Created timezone (BYTE) */ +#define XDIR_ModTZ 23 /* Modified timezone (BYTE) */ +#define XDIR_AccTZ 24 /* Last accessed timezone (BYTE) */ +#define XDIR_GenFlags 33 /* Gneral secondary flags (WORD) */ +#define XDIR_NumName 35 /* Number of file name characters (BYTE) */ +#define XDIR_NameHash 36 /* Hash of file name (WORD) */ +#define XDIR_ValidFileSize 40 /* Valid file size (QWORD) */ +#define XDIR_FstClus 52 /* First cluster of the file data (DWORD) */ +#define XDIR_FileSize 56 /* File/Directory size (QWORD) */ + +#define SZDIRE 32 /* Size of a directory entry */ +#define LLEF 0x40 /* Last long entry flag in LDIR_Ord */ +#define DDEM 0xE5 /* Deleted directory entry mark set to DIR_Name[0] */ +#define RDDEM 0x05 /* Replacement of the character collides with DDEM */ + + + + + +/*-------------------------------------------------------------------------- + + Module Private Work Area + +---------------------------------------------------------------------------*/ + +/* Remark: Variables here without initial value shall be guaranteed zero/null +/ at start-up. If not, either the linker or start-up routine being used is +/ not compliance with C standard. */ + +#if _VOLUMES < 1 || _VOLUMES > 9 +#error Wrong _VOLUMES setting +#endif +static FATFS *FatFs[_VOLUMES]; /* Pointer to the file system objects (logical drives) */ +static WORD Fsid; /* File system mount ID */ + +#if _FS_RPATH != 0 && _VOLUMES >= 2 +static BYTE CurrVol; /* Current drive */ +#endif + +#if _FS_LOCK != 0 +static FILESEM Files[_FS_LOCK]; /* Open object lock semaphores */ +#endif + +#if _USE_LFN == 0 /* Non-LFN configuration */ +#define DEF_NAMBUF +#define INIT_NAMBUF(fs) +#define FREE_NAMBUF() +#else +#if _MAX_LFN < 12 || _MAX_LFN > 255 +#error Wrong _MAX_LFN setting +#endif + +#if _USE_LFN == 1 /* LFN enabled with static working buffer */ +#if _FS_EXFAT +static BYTE DirBuf[SZDIRE*19]; /* Directory entry block scratchpad buffer (19 entries in size) */ +#endif +static WCHAR LfnBuf[_MAX_LFN+1]; /* LFN enabled with static working buffer */ +#define DEF_NAMBUF +#define INIT_NAMBUF(fs) +#define FREE_NAMBUF() + +#elif _USE_LFN == 2 /* LFN enabled with dynamic working buffer on the stack */ +#if _FS_EXFAT +#define DEF_NAMBUF WCHAR lbuf[_MAX_LFN+1]; BYTE dbuf[SZDIRE*19]; +#define INIT_NAMBUF(fs) { (fs)->lfnbuf = lbuf; (fs)->dirbuf = dbuf; } +#define FREE_NAMBUF() +#else +#define DEF_NAMBUF WCHAR lbuf[_MAX_LFN+1]; +#define INIT_NAMBUF(fs) { (fs)->lfnbuf = lbuf; } +#define FREE_NAMBUF() +#endif + +#elif _USE_LFN == 3 /* LFN enabled with dynamic working buffer on the heap */ +#if _FS_EXFAT +#define DEF_NAMBUF WCHAR *lfn; +#define INIT_NAMBUF(fs) { lfn = ff_memalloc((_MAX_LFN+1)*2 + SZDIRE*19); if (!lfn) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); (fs)->lfnbuf = lfn; (fs)->dirbuf = (BYTE*)(lfn+_MAX_LFN+1); } +#define FREE_NAMBUF() ff_memfree(lfn) +#else +#define DEF_NAMBUF WCHAR *lfn; +#define INIT_NAMBUF(fs) { lfn = ff_memalloc((_MAX_LFN+1)*2); if (!lfn) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); (fs)->lfnbuf = lfn; } +#define FREE_NAMBUF() ff_memfree(lfn) +#endif + +#else +#error Wrong _USE_LFN setting +#endif +#endif + +#ifdef _EXCVT +static const BYTE ExCvt[] = _EXCVT; /* Upper conversion table for SBCS extended characters */ +#endif + + + + + + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Load/Store multi-byte word in the FAT structure */ +/*-----------------------------------------------------------------------*/ + +static +WORD ld_word (const BYTE* ptr) /* Load a 2-byte little-endian word */ +{ + WORD rv; + + rv = ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +static +DWORD ld_dword (const BYTE* ptr) /* Load a 4-byte little-endian word */ +{ + DWORD rv; + + rv = ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +#if _FS_EXFAT +static +QWORD ld_qword (const BYTE* ptr) /* Load an 8-byte little-endian word */ +{ + QWORD rv; + + rv = ptr[7]; + rv = rv << 8 | ptr[6]; + rv = rv << 8 | ptr[5]; + rv = rv << 8 | ptr[4]; + rv = rv << 8 | ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} +#endif + +#if !_FS_READONLY +static +void st_word (BYTE* ptr, WORD val) /* Store a 2-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} + +static +void st_dword (BYTE* ptr, DWORD val) /* Store a 4-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} + +#if _FS_EXFAT +static +void st_qword (BYTE* ptr, QWORD val) /* Store an 8-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} +#endif +#endif /* !_FS_READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* String functions */ +/*-----------------------------------------------------------------------*/ + +/* Copy memory to memory */ +static +void mem_cpy (void* dst, const void* src, UINT cnt) { + BYTE *d = (BYTE*)dst; + const BYTE *s = (const BYTE*)src; + + if (cnt) { + do *d++ = *s++; while (--cnt); + } +} + +/* Fill memory block */ +static +void mem_set (void* dst, int val, UINT cnt) { + BYTE *d = (BYTE*)dst; + + do *d++ = (BYTE)val; while (--cnt); +} + +/* Compare memory block */ +static +int mem_cmp (const void* dst, const void* src, UINT cnt) { /* ZR:same, NZ:different */ + const BYTE *d = (const BYTE *)dst, *s = (const BYTE *)src; + int r = 0; + + do { + r = *d++ - *s++; + } while (--cnt && r == 0); + + return r; +} + +/* Check if chr is contained in the string */ +static +int chk_chr (const char* str, int chr) { /* NZ:contained, ZR:not contained */ + while (*str && *str != chr) str++; + return *str; +} + + + + +#if _FS_REENTRANT +/*-----------------------------------------------------------------------*/ +/* Request/Release grant to access the volume */ +/*-----------------------------------------------------------------------*/ +static +int lock_fs ( + FATFS* fs /* File system object */ +) +{ + return ff_req_grant(fs->sobj); +} + + +static +void unlock_fs ( + FATFS* fs, /* File system object */ + FRESULT res /* Result code to be returned */ +) +{ + if (fs && res != FR_NOT_ENABLED && res != FR_INVALID_DRIVE && res != FR_TIMEOUT) { + ff_rel_grant(fs->sobj); + } +} + +#endif + + + +#if _FS_LOCK != 0 +/*-----------------------------------------------------------------------*/ +/* File lock control functions */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT chk_lock ( /* Check if the file can be accessed */ + DIR* dp, /* Directory object pointing the file to be checked */ + int acc /* Desired access type (0:Read, 1:Write, 2:Delete/Rename) */ +) +{ + UINT i, be; + + /* Search file semaphore table */ + for (i = be = 0; i < _FS_LOCK; i++) { + if (Files[i].fs) { /* Existing entry */ + if (Files[i].fs == dp->obj.fs && /* Check if the object matched with an open object */ + Files[i].clu == dp->obj.sclust && + Files[i].ofs == dp->dptr) break; + } else { /* Blank entry */ + be = 1; + } + } + if (i == _FS_LOCK) { /* The object is not opened */ + return (be || acc == 2) ? FR_OK : FR_TOO_MANY_OPEN_FILES; /* Is there a blank entry for new object? */ + } + + /* The object has been opened. Reject any open against writing file and all write mode open */ + return (acc || Files[i].ctr == 0x100) ? FR_LOCKED : FR_OK; +} + + +static +int enq_lock (void) /* Check if an entry is available for a new object */ +{ + UINT i; + + for (i = 0; i < _FS_LOCK && Files[i].fs; i++) ; + return (i == _FS_LOCK) ? 0 : 1; +} + + +static +UINT inc_lock ( /* Increment object open counter and returns its index (0:Internal error) */ + DIR* dp, /* Directory object pointing the file to register or increment */ + int acc /* Desired access (0:Read, 1:Write, 2:Delete/Rename) */ +) +{ + UINT i; + + + for (i = 0; i < _FS_LOCK; i++) { /* Find the object */ + if (Files[i].fs == dp->obj.fs && + Files[i].clu == dp->obj.sclust && + Files[i].ofs == dp->dptr) break; + } + + if (i == _FS_LOCK) { /* Not opened. Register it as new. */ + for (i = 0; i < _FS_LOCK && Files[i].fs; i++) ; + if (i == _FS_LOCK) return 0; /* No free entry to register (int err) */ + Files[i].fs = dp->obj.fs; + Files[i].clu = dp->obj.sclust; + Files[i].ofs = dp->dptr; + Files[i].ctr = 0; + } + + if (acc && Files[i].ctr) return 0; /* Access violation (int err) */ + + Files[i].ctr = acc ? 0x100 : Files[i].ctr + 1; /* Set semaphore value */ + + return i + 1; +} + + +static +FRESULT dec_lock ( /* Decrement object open counter */ + UINT i /* Semaphore index (1..) */ +) +{ + WORD n; + FRESULT res; + + + if (--i < _FS_LOCK) { /* Shift index number origin from 0 */ + n = Files[i].ctr; + if (n == 0x100) n = 0; /* If write mode open, delete the entry */ + if (n > 0) n--; /* Decrement read mode open count */ + Files[i].ctr = n; + if (n == 0) Files[i].fs = 0; /* Delete the entry if open count gets zero */ + res = FR_OK; + } else { + res = FR_INT_ERR; /* Invalid index nunber */ + } + return res; +} + + +static +void clear_lock ( /* Clear lock entries of the volume */ + FATFS *fs +) +{ + UINT i; + + for (i = 0; i < _FS_LOCK; i++) { + if (Files[i].fs == fs) Files[i].fs = 0; + } +} + +#endif /* _FS_LOCK != 0 */ + + + +/*-----------------------------------------------------------------------*/ +/* Move/Flush disk access window in the file system object */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT sync_window ( /* Returns FR_OK or FR_DISK_ERROR */ + FATFS* fs /* File system object */ +) +{ + DWORD wsect; + UINT nf; + FRESULT res = FR_OK; + + + if (fs->wflag) { /* Write back the sector if it is dirty */ + wsect = fs->winsect; /* Current sector number */ + if (disk_write(fs->drv, fs->win, wsect, 1) != RES_OK) { + res = FR_DISK_ERR; + } else { + fs->wflag = 0; + if (wsect - fs->fatbase < fs->fsize) { /* Is it in the FAT area? */ + for (nf = fs->n_fats; nf >= 2; nf--) { /* Reflect the change to all FAT copies */ + wsect += fs->fsize; + disk_write(fs->drv, fs->win, wsect, 1); + } + } + } + } + return res; +} +#endif + + +static +FRESULT move_window ( /* Returns FR_OK or FR_DISK_ERROR */ + FATFS* fs, /* File system object */ + DWORD sector /* Sector number to make appearance in the fs->win[] */ +) +{ + FRESULT res = FR_OK; + + + if (sector != fs->winsect) { /* Window offset changed? */ +#if !_FS_READONLY + res = sync_window(fs); /* Write-back changes */ +#endif + if (res == FR_OK) { /* Fill sector window with new data */ + if (disk_read(fs->drv, fs->win, sector, 1) != RES_OK) { + sector = 0xFFFFFFFF; /* Invalidate window if data is not reliable */ + res = FR_DISK_ERR; + } + fs->winsect = sector; + } + } + return res; +} + + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Synchronize file system and strage device */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT sync_fs ( /* FR_OK:succeeded, !=0:error */ + FATFS* fs /* File system object */ +) +{ + FRESULT res; + + + res = sync_window(fs); + if (res == FR_OK) { + /* Update FSInfo sector if needed */ + if (fs->fs_type == FS_FAT32 && fs->fsi_flag == 1) { + /* Create FSInfo structure */ + mem_set(fs->win, 0, SS(fs)); + st_word(fs->win + BS_55AA, 0xAA55); + st_dword(fs->win + FSI_LeadSig, 0x41615252); + st_dword(fs->win + FSI_StrucSig, 0x61417272); + st_dword(fs->win + FSI_Free_Count, fs->free_clst); + st_dword(fs->win + FSI_Nxt_Free, fs->last_clst); + /* Write it into the FSInfo sector */ + fs->winsect = fs->volbase + 1; + disk_write(fs->drv, fs->win, fs->winsect, 1); + fs->fsi_flag = 0; + } + /* Make sure that no pending write process in the physical drive */ + if (disk_ioctl(fs->drv, CTRL_SYNC, 0) != RES_OK) res = FR_DISK_ERR; + } + + return res; +} + +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Get sector# from cluster# */ +/*-----------------------------------------------------------------------*/ + +static +DWORD clust2sect ( /* !=0:Sector number, 0:Failed (invalid cluster#) */ + FATFS* fs, /* File system object */ + DWORD clst /* Cluster# to be converted */ +) +{ + clst -= 2; + if (clst >= fs->n_fatent - 2) return 0; /* Invalid cluster# */ + return clst * fs->csize + fs->database; +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Read value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + +static +DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x7FFFFFFF:Cluster status */ + _FDID* obj, /* Corresponding object */ + DWORD clst /* Cluster number to get the value */ +) +{ + UINT wc, bc; + DWORD val; + FATFS *fs = obj->fs; + + + if (clst < 2 || clst >= fs->n_fatent) { /* Check if in valid range */ + val = 1; /* Internal error */ + + } else { + val = 0xFFFFFFFF; /* Default value falls on disk error */ + + switch (fs->fs_type) { + case FS_FAT12 : + bc = (UINT)clst; bc += bc / 2; + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; + wc = fs->win[bc++ % SS(fs)]; + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; + wc |= fs->win[bc % SS(fs)] << 8; + val = (clst & 1) ? (wc >> 4) : (wc & 0xFFF); + break; + + case FS_FAT16 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))) != FR_OK) break; + val = ld_word(fs->win + clst * 2 % SS(fs)); + break; + + case FS_FAT32 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break; + val = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x0FFFFFFF; + break; +#if _FS_EXFAT + case FS_EXFAT : + if (obj->objsize) { + DWORD cofs = clst - obj->sclust; /* Offset from start cluster */ + DWORD clen = (DWORD)((obj->objsize - 1) / SS(fs)) / fs->csize; /* Number of clusters - 1 */ + + if (obj->stat == 2) { /* Is there no valid chain on the FAT? */ + if (cofs <= clen) { + val = (cofs == clen) ? 0x7FFFFFFF : clst + 1; /* Generate the value */ + break; + } + } + if (obj->stat == 3 && cofs < obj->n_cont) { /* Is it in the contiguous part? */ + val = clst + 1; /* Generate the value */ + break; + } + if (obj->stat != 2) { /* Get value from FAT if FAT chain is valid */ + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break; + val = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x7FFFFFFF; + break; + } + } + /* go next */ +#endif + default: + val = 1; /* Internal error */ + } + } + + return val; +} + + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT access - Change value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT put_fat ( /* FR_OK(0):succeeded, !=0:error */ + FATFS* fs, /* Corresponding file system object */ + DWORD clst, /* FAT index number (cluster number) to be changed */ + DWORD val /* New value to be set to the entry */ +) +{ + UINT bc; + BYTE *p; + FRESULT res = FR_INT_ERR; + + + if (clst >= 2 && clst < fs->n_fatent) { /* Check if in valid range */ + switch (fs->fs_type) { + case FS_FAT12 : /* Bitfield items */ + bc = (UINT)clst; bc += bc / 2; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = fs->win + bc++ % SS(fs); + *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; + fs->wflag = 1; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = fs->win + bc % SS(fs); + *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); + fs->wflag = 1; + break; + + case FS_FAT16 : /* WORD aligned items */ + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))); + if (res != FR_OK) break; + st_word(fs->win + clst * 2 % SS(fs), (WORD)val); + fs->wflag = 1; + break; + + case FS_FAT32 : /* DWORD aligned items */ +#if _FS_EXFAT + case FS_EXFAT : +#endif + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))); + if (res != FR_OK) break; + if (!_FS_EXFAT || fs->fs_type != FS_EXFAT) { + val = (val & 0x0FFFFFFF) | (ld_dword(fs->win + clst * 4 % SS(fs)) & 0xF0000000); + } + st_dword(fs->win + clst * 4 % SS(fs), val); + fs->wflag = 1; + break; + } + } + return res; +} + +#endif /* !_FS_READONLY */ + + + + +#if _FS_EXFAT && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* exFAT: Accessing FAT and Allocation Bitmap */ +/*-----------------------------------------------------------------------*/ + +/*---------------------------------------------*/ +/* exFAT: Find a contiguous free cluster block */ +/*---------------------------------------------*/ + +static +DWORD find_bitmap ( /* 0:No free cluster, 2..:Free cluster found, 0xFFFFFFFF:Disk error */ + FATFS* fs, /* File system object */ + DWORD clst, /* Cluster number to scan from */ + DWORD ncl /* Number of contiguous clusters to find (1..) */ +) +{ + BYTE bm, bv; + UINT i; + DWORD val, scl, ctr; + + + clst -= 2; /* The first bit in the bitmap corresponds to cluster #2 */ + if (clst >= fs->n_fatent - 2) clst = 0; + scl = val = clst; ctr = 0; + for (;;) { + if (move_window(fs, fs->database + val / 8 / SS(fs)) != FR_OK) return 0xFFFFFFFF; /* (assuming bitmap is located top of the cluster heap) */ + i = val / 8 % SS(fs); bm = 1 << (val % 8); + do { + do { + bv = fs->win[i] & bm; bm <<= 1; /* Get bit value */ + if (++val >= fs->n_fatent - 2) { /* Next cluster (with wrap-around) */ + val = 0; bm = 0; i = 4096; + } + if (!bv) { /* Is it a free cluster? */ + if (++ctr == ncl) return scl + 2; /* Check run length */ + } else { + scl = val; ctr = 0; /* Encountered a live cluster, restart to scan */ + } + if (val == clst) return 0; /* All cluster scanned? */ + } while (bm); + bm = 1; + } while (++i < SS(fs)); + } +} + + +/*------------------------------------*/ +/* exFAT: Set/Clear a block of bitmap */ +/*------------------------------------*/ + +static +FRESULT change_bitmap ( + FATFS* fs, /* File system object */ + DWORD clst, /* Cluster number to change from */ + DWORD ncl, /* Number of clusters to be changed */ + int bv /* bit value to be set (0 or 1) */ +) +{ + BYTE bm; + UINT i; + DWORD sect; + + + clst -= 2; /* The first bit corresponds to cluster #2 */ + sect = fs->database + clst / 8 / SS(fs); /* Sector address (assuming bitmap is located top of the cluster heap) */ + i = clst / 8 % SS(fs); /* Byte offset in the sector */ + bm = 1 << (clst % 8); /* Bit mask in the byte */ + for (;;) { + if (move_window(fs, sect++) != FR_OK) return FR_DISK_ERR; + do { + do { + if (bv == (int)((fs->win[i] & bm) != 0)) return FR_INT_ERR; /* Is the bit expected value? */ + fs->win[i] ^= bm; /* Flip the bit */ + fs->wflag = 1; + if (--ncl == 0) return FR_OK; /* All bits processed? */ + } while (bm <<= 1); /* Next bit */ + bm = 1; + } while (++i < SS(fs)); /* Next byte */ + i = 0; + } +} + + +/*---------------------------------------------*/ +/* Complement contiguous part of the FAT chain */ +/*---------------------------------------------*/ + +static +FRESULT fill_fat_chain ( + _FDID* obj /* Pointer to the corresponding object */ +) +{ + FRESULT res; + DWORD cl, n; + + if (obj->stat == 3) { /* Has the object been changed 'fragmented'? */ + for (cl = obj->sclust, n = obj->n_cont; n; cl++, n--) { /* Create cluster chain on the FAT */ + res = put_fat(obj->fs, cl, cl + 1); + if (res != FR_OK) return res; + } + obj->stat = 0; /* Change status 'FAT chain is valid' */ + } + return FR_OK; +} + +#endif /* _FS_EXFAT && !_FS_READONLY */ + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT handling - Remove a cluster chain */ +/*-----------------------------------------------------------------------*/ +static +FRESULT remove_chain ( /* FR_OK(0):succeeded, !=0:error */ + _FDID* obj, /* Corresponding object */ + DWORD clst, /* Cluster to remove a chain from */ + DWORD pclst /* Previous cluster of clst (0:an entire chain) */ +) +{ + FRESULT res = FR_OK; + DWORD nxt; + FATFS *fs = obj->fs; +#if _FS_EXFAT || _USE_TRIM + DWORD scl = clst, ecl = clst; +#endif +#if _USE_TRIM + DWORD rt[2]; +#endif + + if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Check if in valid range */ + + /* Mark the previous cluster 'EOC' on the FAT if it exists */ + if (pclst && (!_FS_EXFAT || fs->fs_type != FS_EXFAT || obj->stat != 2)) { + res = put_fat(fs, pclst, 0xFFFFFFFF); + if (res != FR_OK) return res; + } + + /* Remove the chain */ + do { + nxt = get_fat(obj, clst); /* Get cluster status */ + if (nxt == 0) break; /* Empty cluster? */ + if (nxt == 1) return FR_INT_ERR; /* Internal error? */ + if (nxt == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error? */ + if (!_FS_EXFAT || fs->fs_type != FS_EXFAT) { + res = put_fat(fs, clst, 0); /* Mark the cluster 'free' on the FAT */ + if (res != FR_OK) return res; + } + if (fs->free_clst < fs->n_fatent - 2) { /* Update FSINFO */ + fs->free_clst++; + fs->fsi_flag |= 1; + } +#if _FS_EXFAT || _USE_TRIM + if (ecl + 1 == nxt) { /* Is next cluster contiguous? */ + ecl = nxt; + } else { /* End of contiguous cluster block */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + res = change_bitmap(fs, scl, ecl - scl + 1, 0); /* Mark the cluster block 'free' on the bitmap */ + if (res != FR_OK) return res; + } +#endif +#if _USE_TRIM + rt[0] = clust2sect(fs, scl); /* Start sector */ + rt[1] = clust2sect(fs, ecl) + fs->csize - 1; /* End sector */ + disk_ioctl(fs->drv, CTRL_TRIM, rt); /* Inform device the block can be erased */ +#endif + scl = ecl = nxt; + } +#endif + clst = nxt; /* Next cluster */ + } while (clst < fs->n_fatent); /* Repeat while not the last link */ + +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + if (pclst == 0) { /* Does object have no chain? */ + obj->stat = 0; /* Change the object status 'initial' */ + } else { + if (obj->stat == 3 && pclst >= obj->sclust && pclst <= obj->sclust + obj->n_cont) { /* Did the chain got contiguous? */ + obj->stat = 2; /* Change the object status 'contiguous' */ + } + } + } +#endif + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Stretch a chain or Create a new chain */ +/*-----------------------------------------------------------------------*/ +static +DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ + _FDID* obj, /* Corresponding object */ + DWORD clst /* Cluster# to stretch, 0:Create a new chain */ +) +{ + DWORD cs, ncl, scl; + FRESULT res; + FATFS *fs = obj->fs; + + + if (clst == 0) { /* Create a new chain */ + scl = fs->last_clst; /* Get suggested cluster to start from */ + if (scl == 0 || scl >= fs->n_fatent) scl = 1; + } + else { /* Stretch current chain */ + cs = get_fat(obj, clst); /* Check the cluster status */ + if (cs < 2) return 1; /* Invalid value */ + if (cs == 0xFFFFFFFF) return cs; /* A disk error occurred */ + if (cs < fs->n_fatent) return cs; /* It is already followed by next cluster */ + scl = clst; + } + +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + ncl = find_bitmap(fs, scl, 1); /* Find a free cluster */ + if (ncl == 0 || ncl == 0xFFFFFFFF) return ncl; /* No free cluster or hard error? */ + res = change_bitmap(fs, ncl, 1, 1); /* Mark the cluster 'in use' */ + if (res == FR_INT_ERR) return 1; + if (res == FR_DISK_ERR) return 0xFFFFFFFF; + if (clst == 0) { /* Is it a new chain? */ + obj->stat = 2; /* Set status 'contiguous chain' */ + } else { /* This is a stretched chain */ + if (obj->stat == 2 && ncl != scl + 1) { /* Is the chain got fragmented? */ + obj->n_cont = scl - obj->sclust; /* Set size of the contiguous part */ + obj->stat = 3; /* Change status 'just fragmented' */ + } + } + } else +#endif + { /* On the FAT12/16/32 volume */ + ncl = scl; /* Start cluster */ + for (;;) { + ncl++; /* Next cluster */ + if (ncl >= fs->n_fatent) { /* Check wrap-around */ + ncl = 2; + if (ncl > scl) return 0; /* No free cluster */ + } + cs = get_fat(obj, ncl); /* Get the cluster status */ + if (cs == 0) break; /* Found a free cluster */ + if (cs == 1 || cs == 0xFFFFFFFF) return cs; /* An error occurred */ + if (ncl == scl) return 0; /* No free cluster */ + } + } + + if (_FS_EXFAT && fs->fs_type == FS_EXFAT && obj->stat == 2) { /* Is it a contiguous chain? */ + res = FR_OK; /* FAT does not need to be written */ + } else { + res = put_fat(fs, ncl, 0xFFFFFFFF); /* Mark the new cluster 'EOC' */ + if (res == FR_OK && clst) { + res = put_fat(fs, clst, ncl); /* Link it from the previous one if needed */ + } + } + + if (res == FR_OK) { /* Update FSINFO if function succeeded. */ + fs->last_clst = ncl; + if (fs->free_clst < fs->n_fatent - 2) fs->free_clst--; + fs->fsi_flag |= 1; + } else { + ncl = (res == FR_DISK_ERR) ? 0xFFFFFFFF : 1; /* Failed. Create error status */ + } + + return ncl; /* Return new cluster number or error status */ +} + +#endif /* !_FS_READONLY */ + + + + +#if _USE_FASTSEEK +/*-----------------------------------------------------------------------*/ +/* FAT handling - Convert offset into cluster with link map table */ +/*-----------------------------------------------------------------------*/ + +static +DWORD clmt_clust ( /* <2:Error, >=2:Cluster number */ + FIL* fp, /* Pointer to the file object */ + FSIZE_t ofs /* File offset to be converted to cluster# */ +) +{ + DWORD cl, ncl, *tbl; + FATFS *fs = fp->obj.fs; + + + tbl = fp->cltbl + 1; /* Top of CLMT */ + cl = (DWORD)(ofs / SS(fs) / fs->csize); /* Cluster order from top of the file */ + for (;;) { + ncl = *tbl++; /* Number of cluters in the fragment */ + if (ncl == 0) return 0; /* End of table? (error) */ + if (cl < ncl) break; /* In this fragment? */ + cl -= ncl; tbl++; /* Next fragment */ + } + return cl + *tbl; /* Return the cluster number */ +} + +#endif /* _USE_FASTSEEK */ + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Set directory index */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_sdi ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to directory object */ + DWORD ofs /* Offset of directory table */ +) +{ + DWORD csz, clst; + FATFS *fs = dp->obj.fs; + + + if (ofs >= (DWORD)((_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR) || ofs % SZDIRE) { /* Check range of offset and alignment */ + return FR_INT_ERR; + } + dp->dptr = ofs; /* Set current offset */ + clst = dp->obj.sclust; /* Table start cluster (0:root) */ + if (clst == 0 && fs->fs_type >= FS_FAT32) { /* Replace cluster# 0 with root cluster# */ + clst = fs->dirbase; + if (_FS_EXFAT) dp->obj.stat = 0; /* exFAT: Root dir has an FAT chain */ + } + + if (clst == 0) { /* Static table (root-directory in FAT12/16) */ + if (ofs / SZDIRE >= fs->n_rootdir) return FR_INT_ERR; /* Is index out of range? */ + dp->sect = fs->dirbase; + + } else { /* Dynamic table (sub-directory or root-directory in FAT32+) */ + csz = (DWORD)fs->csize * SS(fs); /* Bytes per cluster */ + while (ofs >= csz) { /* Follow cluster chain */ + clst = get_fat(&dp->obj, clst); /* Get next cluster */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Reached to end of table or internal error */ + ofs -= csz; + } + dp->sect = clust2sect(fs, clst); + } + dp->clust = clst; /* Current cluster# */ + if (!dp->sect) return FR_INT_ERR; + dp->sect += ofs / SS(fs); /* Sector# of the directory entry */ + dp->dir = fs->win + (ofs % SS(fs)); /* Pointer to the entry in the win[] */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Move directory table index next */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_next ( /* FR_OK(0):succeeded, FR_NO_FILE:End of table, FR_DENIED:Could not stretch */ + DIR* dp, /* Pointer to the directory object */ + int stretch /* 0: Do not stretch table, 1: Stretch table if needed */ +) +{ + DWORD ofs, clst; + FATFS *fs = dp->obj.fs; +#if !_FS_READONLY + UINT n; +#endif + + ofs = dp->dptr + SZDIRE; /* Next entry */ + if (!dp->sect || ofs >= (DWORD)((_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR)) return FR_NO_FILE; /* Report EOT when offset has reached max value */ + + if (ofs % SS(fs) == 0) { /* Sector changed? */ + dp->sect++; /* Next sector */ + + if (!dp->clust) { /* Static table */ + if (ofs / SZDIRE >= fs->n_rootdir) { /* Report EOT if it reached end of static table */ + dp->sect = 0; return FR_NO_FILE; + } + } + else { /* Dynamic table */ + if ((ofs / SS(fs) & (fs->csize - 1)) == 0) { /* Cluster changed? */ + clst = get_fat(&dp->obj, dp->clust); /* Get next cluster */ + if (clst <= 1) return FR_INT_ERR; /* Internal error */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst >= fs->n_fatent) { /* Reached end of dynamic table */ +#if !_FS_READONLY + if (!stretch) { /* If no stretch, report EOT */ + dp->sect = 0; return FR_NO_FILE; + } + clst = create_chain(&dp->obj, dp->clust); /* Allocate a cluster */ + if (clst == 0) return FR_DENIED; /* No free cluster */ + if (clst == 1) return FR_INT_ERR; /* Internal error */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + /* Clean-up the stretched table */ + if (_FS_EXFAT) dp->obj.stat |= 4; /* The directory needs to be updated */ + if (sync_window(fs) != FR_OK) return FR_DISK_ERR; /* Flush disk access window */ + mem_set(fs->win, 0, SS(fs)); /* Clear window buffer */ + for (n = 0, fs->winsect = clust2sect(fs, clst); n < fs->csize; n++, fs->winsect++) { /* Fill the new cluster with 0 */ + fs->wflag = 1; + if (sync_window(fs) != FR_OK) return FR_DISK_ERR; + } + fs->winsect -= n; /* Restore window offset */ +#else + if (!stretch) dp->sect = 0; /* If no stretch, report EOT (this is to suppress warning) */ + dp->sect = 0; return FR_NO_FILE; /* Report EOT */ +#endif + } + dp->clust = clst; /* Initialize data for new cluster */ + dp->sect = clust2sect(fs, clst); + } + } + } + dp->dptr = ofs; /* Current entry */ + dp->dir = fs->win + ofs % SS(fs); /* Pointer to the entry in the win[] */ + + return FR_OK; +} + + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Directory handling - Reserve a block of directory entries */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_alloc ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to the directory object */ + UINT nent /* Number of contiguous entries to allocate */ +) +{ + FRESULT res; + UINT n; + FATFS *fs = dp->obj.fs; + + + res = dir_sdi(dp, 0); + if (res == FR_OK) { + n = 0; + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; +#if _FS_EXFAT + if ((fs->fs_type == FS_EXFAT) ? (int)((dp->dir[XDIR_Type] & 0x80) == 0) : (int)(dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0)) { +#else + if (dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0) { +#endif + if (++n == nent) break; /* A block of contiguous free entries is found */ + } else { + n = 0; /* Not a blank entry. Restart to search */ + } + res = dir_next(dp, 1); + } while (res == FR_OK); /* Next entry with table stretch enabled */ + } + + if (res == FR_NO_FILE) res = FR_DENIED; /* No directory entry to allocate */ + return res; +} + +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* FAT: Directory handling - Load/Store start cluster number */ +/*-----------------------------------------------------------------------*/ + +static +DWORD ld_clust ( /* Returns the top cluster value of the SFN entry */ + FATFS* fs, /* Pointer to the fs object */ + const BYTE* dir /* Pointer to the key entry */ +) +{ + DWORD cl; + + cl = ld_word(dir + DIR_FstClusLO); + if (fs->fs_type == FS_FAT32) { + cl |= (DWORD)ld_word(dir + DIR_FstClusHI) << 16; + } + + return cl; +} + + +#if !_FS_READONLY +static +void st_clust ( + FATFS* fs, /* Pointer to the fs object */ + BYTE* dir, /* Pointer to the key entry */ + DWORD cl /* Value to be set */ +) +{ + st_word(dir + DIR_FstClusLO, (WORD)cl); + if (fs->fs_type == FS_FAT32) { + st_word(dir + DIR_FstClusHI, (WORD)(cl >> 16)); + } +} +#endif + + + +#if _USE_LFN != 0 +/*------------------------------------------------------------------------*/ +/* FAT-LFN: LFN handling */ +/*------------------------------------------------------------------------*/ +static +const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* Offset of LFN characters in the directory entry */ + + +/*--------------------------------------------------------*/ +/* FAT-LFN: Compare a part of file name with an LFN entry */ +/*--------------------------------------------------------*/ +static +int cmp_lfn ( /* 1:matched, 0:not matched */ + const WCHAR* lfnbuf, /* Pointer to the LFN working buffer to be compared */ + BYTE* dir /* Pointer to the directory entry containing the part of LFN */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO */ + + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc) { + if (i >= _MAX_LFN || ff_wtoupper(uc) != ff_wtoupper(lfnbuf[i++])) { /* Compare it */ + return 0; /* Not matched */ + } + wc = uc; + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if ((dir[LDIR_Ord] & LLEF) && wc && lfnbuf[i]) return 0; /* Last segment matched but different length */ + + return 1; /* The part of LFN matched */ +} + + +#if _FS_MINIMIZE <= 1 || _FS_RPATH >= 2 || _USE_LABEL || _FS_EXFAT +/*-----------------------------------------------------*/ +/* FAT-LFN: Pick a part of file name from an LFN entry */ +/*-----------------------------------------------------*/ +static +int pick_lfn ( /* 1:succeeded, 0:buffer overflow or invalid LFN entry */ + WCHAR* lfnbuf, /* Pointer to the LFN working buffer */ + BYTE* dir /* Pointer to the LFN entry */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO */ + + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc) { + if (i >= _MAX_LFN) return 0; /* Buffer overflow? */ + lfnbuf[i++] = wc = uc; /* Store it */ + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if (dir[LDIR_Ord] & LLEF) { /* Put terminator if it is the last LFN part */ + if (i >= _MAX_LFN) return 0; /* Buffer overflow? */ + lfnbuf[i] = 0; + } + + return 1; /* The part of LFN is valid */ +} +#endif + + +#if !_FS_READONLY +/*-----------------------------------------*/ +/* FAT-LFN: Create an entry of LFN entries */ +/*-----------------------------------------*/ +static +void put_lfn ( + const WCHAR* lfn, /* Pointer to the LFN */ + BYTE* dir, /* Pointer to the LFN entry to be created */ + BYTE ord, /* LFN order (1-20) */ + BYTE sum /* Checksum of the corresponding SFN */ +) +{ + UINT i, s; + WCHAR wc; + + + dir[LDIR_Chksum] = sum; /* Set checksum */ + dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ + dir[LDIR_Type] = 0; + st_word(dir + LDIR_FstClusLO, 0); + + i = (ord - 1) * 13; /* Get offset in the LFN working buffer */ + s = wc = 0; + do { + if (wc != 0xFFFF) wc = lfn[i++]; /* Get an effective character */ + st_word(dir + LfnOfs[s], wc); /* Put it */ + if (wc == 0) wc = 0xFFFF; /* Padding characters for left locations */ + } while (++s < 13); + if (wc == 0xFFFF || !lfn[i]) ord |= LLEF; /* Last LFN part is the start of LFN sequence */ + dir[LDIR_Ord] = ord; /* Set the LFN order */ +} + +#endif /* !_FS_READONLY */ +#endif /* _USE_LFN != 0 */ + + + +#if _USE_LFN != 0 && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Create a Numbered SFN */ +/*-----------------------------------------------------------------------*/ + +static +void gen_numname ( + BYTE* dst, /* Pointer to the buffer to store numbered SFN */ + const BYTE* src, /* Pointer to SFN */ + const WCHAR* lfn, /* Pointer to LFN */ + UINT seq /* Sequence number */ +) +{ + BYTE ns[8], c; + UINT i, j; + WCHAR wc; + DWORD sr; + + + mem_cpy(dst, src, 11); + + if (seq > 5) { /* In case of many collisions, generate a hash number instead of sequential number */ + sr = seq; + while (*lfn) { /* Create a CRC */ + wc = *lfn++; + for (i = 0; i < 16; i++) { + sr = (sr << 1) + (wc & 1); + wc >>= 1; + if (sr & 0x10000) sr ^= 0x11021; + } + } + seq = (UINT)sr; + } + + /* itoa (hexdecimal) */ + i = 7; + do { + c = (BYTE)((seq % 16) + '0'); + if (c > '9') c += 7; + ns[i--] = c; + seq /= 16; + } while (seq); + ns[i] = '~'; + + /* Append the number */ + for (j = 0; j < i && dst[j] != ' '; j++) { + if (IsDBCS1(dst[j])) { + if (j == i - 1) break; + j++; + } + } + do { + dst[j++] = (i < 8) ? ns[i++] : ' '; + } while (j < 8); +} +#endif /* _USE_LFN != 0 && !_FS_READONLY */ + + + +#if _USE_LFN != 0 +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Calculate checksum of an SFN entry */ +/*-----------------------------------------------------------------------*/ + +static +BYTE sum_sfn ( + const BYTE* dir /* Pointer to the SFN entry */ +) +{ + BYTE sum = 0; + UINT n = 11; + + do sum = (sum >> 1) + (sum << 7) + *dir++; while (--n); + return sum; +} + +#endif /* _USE_LFN != 0 */ + + + +#if _FS_EXFAT +/*-----------------------------------------------------------------------*/ +/* exFAT: Checksum */ +/*-----------------------------------------------------------------------*/ + +static +WORD xdir_sum ( /* Get checksum of the directoly block */ + const BYTE* dir /* Directory entry block to be calculated */ +) +{ + UINT i, szblk; + WORD sum; + + + szblk = (dir[XDIR_NumSec] + 1) * SZDIRE; + for (i = sum = 0; i < szblk; i++) { + if (i == XDIR_SetSum) { /* Skip sum field */ + i++; + } else { + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + dir[i]; + } + } + return sum; +} + + + +static +WORD xname_sum ( /* Get check sum (to be used as hash) of the name */ + const WCHAR* name /* File name to be calculated */ +) +{ + WCHAR chr; + WORD sum = 0; + + + while ((chr = *name++) != 0) { + chr = ff_wtoupper(chr); /* File name needs to be ignored case */ + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr & 0xFF); + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr >> 8); + } + return sum; +} + + +#if !_FS_READONLY && _USE_MKFS +static +DWORD xsum32 ( + BYTE dat, /* Data to be sumed */ + DWORD sum /* Previous value */ +) +{ + sum = ((sum & 1) ? 0x80000000 : 0) + (sum >> 1) + dat; + return sum; +} +#endif + + +#if _FS_MINIMIZE <= 1 || _FS_RPATH >= 2 +/*------------------------------------------------------*/ +/* exFAT: Get object information from a directory block */ +/*------------------------------------------------------*/ + +static +void get_xdir_info ( + BYTE* dirb, /* Pointer to the direcotry entry block 85+C0+C1s */ + FILINFO* fno /* Buffer to store the extracted file information */ +) +{ + UINT di, si; + WCHAR w; +#if !_LFN_UNICODE + UINT nc; +#endif + + /* Get file name */ +#if _LFN_UNICODE + if (dirb[XDIR_NumName] <= _MAX_LFN) { + for (si = SZDIRE * 2, di = 0; di < dirb[XDIR_NumName]; si += 2, di++) { + if ((si % SZDIRE) == 0) si += 2; /* Skip entry type field */ + w = ld_word(dirb + si); /* Get a character */ + fno->fname[di] = w; /* Store it */ + } + } else { + di = 0; /* Buffer overflow and inaccessible object */ + } +#else + for (si = SZDIRE * 2, di = nc = 0; nc < dirb[XDIR_NumName]; si += 2, nc++) { + if ((si % SZDIRE) == 0) si += 2; /* Skip entry type field */ + w = ld_word(dirb + si); /* Get a character */ + w = ff_convert(w, 0); /* Unicode -> OEM */ + if (w == 0) { di = 0; break; } /* Could not be converted and inaccessible object */ + if (_DF1S && w >= 0x100) { /* Put 1st byte if it is a DBC (always false at SBCS cfg) */ + fno->fname[di++] = (char)(w >> 8); + } + if (di >= _MAX_LFN) { di = 0; break; } /* Buffer overflow and inaccessible object */ + fno->fname[di++] = (char)w; + } +#endif + if (di == 0) fno->fname[di++] = '?'; /* Inaccessible object? */ + fno->fname[di] = 0; /* Terminate file name */ + + fno->altname[0] = 0; /* No SFN */ + fno->fattrib = dirb[XDIR_Attr]; /* Attribute */ + fno->fsize = (fno->fattrib & AM_DIR) ? 0 : ld_qword(dirb + XDIR_FileSize); /* Size */ + fno->ftime = ld_word(dirb + XDIR_ModTime + 0); /* Time */ + fno->fdate = ld_word(dirb + XDIR_ModTime + 2); /* Date */ +} + +#endif /* _FS_MINIMIZE <= 1 || _FS_RPATH >= 2 */ + + +/*-----------------------------------*/ +/* exFAT: Get a directry entry block */ +/*-----------------------------------*/ + +static +FRESULT load_xdir ( /* FR_INT_ERR: invalid entry block */ + DIR* dp /* Pointer to the reading direcotry object pointing the 85 entry */ +) +{ + FRESULT res; + UINT i, nent; + BYTE* dirb = dp->obj.fs->dirbuf; /* Pointer to the on-memory direcotry entry block 85+C0+C1s */ + + + /* Load 85 entry */ + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != 0x85) return FR_INT_ERR; + mem_cpy(dirb, dp->dir, SZDIRE); + nent = dirb[XDIR_NumSec] + 1; + + /* Load C0 entry */ + res = dir_next(dp, 0); + if (res != FR_OK) return res; + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != 0xC0) return FR_INT_ERR; + mem_cpy(dirb + SZDIRE, dp->dir, SZDIRE); + + /* Load C1 entries */ + if (nent < 3 || nent > 19) return FR_NO_FILE; + i = SZDIRE * 2; nent *= SZDIRE; + do { + res = dir_next(dp, 0); + if (res != FR_OK) return res; + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != 0xC1) return FR_INT_ERR; + mem_cpy(dirb + i, dp->dir, SZDIRE); + i += SZDIRE; + } while (i < nent); + + /* Sanity check */ + if (xdir_sum(dirb) != ld_word(dirb + XDIR_SetSum)) return FR_INT_ERR; + + return FR_OK; +} + + +#if !_FS_READONLY || _FS_RPATH != 0 +/*------------------------------------------------*/ +/* exFAT: Load the object's directory entry block */ +/*------------------------------------------------*/ +static +FRESULT load_obj_dir ( + DIR* dp, /* Blank directory object to be used to access containing direcotry */ + const _FDID* obj /* Object with containing directory information */ +) +{ + FRESULT res; + + + /* Open object containing directory */ + dp->obj.fs = obj->fs; + dp->obj.sclust = obj->c_scl; + dp->obj.stat = (BYTE)obj->c_size; + dp->obj.objsize = obj->c_size & 0xFFFFFF00; + dp->blk_ofs = obj->c_ofs; + + res = dir_sdi(dp, dp->blk_ofs); /* Goto the block location */ + if (res == FR_OK) { + res = load_xdir(dp); /* Load the object's entry block */ + } + return res; +} +#endif + + +#if !_FS_READONLY +/*-----------------------------------------------*/ +/* exFAT: Store the directory block to the media */ +/*-----------------------------------------------*/ +static +FRESULT store_xdir ( + DIR* dp /* Pointer to the direcotry object */ +) +{ + FRESULT res; + UINT nent; + BYTE* dirb = dp->obj.fs->dirbuf; /* Pointer to the direcotry entry block 85+C0+C1s */ + + /* Create set sum */ + st_word(dirb + XDIR_SetSum, xdir_sum(dirb)); + nent = dirb[XDIR_NumSec] + 1; + + /* Store the set of directory to the volume */ + res = dir_sdi(dp, dp->blk_ofs); + while (res == FR_OK) { + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) break; + mem_cpy(dp->dir, dirb, SZDIRE); + dp->obj.fs->wflag = 1; + if (--nent == 0) break; + dirb += SZDIRE; + res = dir_next(dp, 0); + } + return (res == FR_OK || res == FR_DISK_ERR) ? res : FR_INT_ERR; +} + + + +/*-------------------------------------------*/ +/* exFAT: Create a new directory enrty block */ +/*-------------------------------------------*/ + +static +void create_xdir ( + BYTE* dirb, /* Pointer to the direcotry entry block buffer */ + const WCHAR* lfn /* Pointer to the nul terminated file name */ +) +{ + UINT i; + BYTE nb, nc; + WCHAR chr; + + + mem_set(dirb, 0, 2 * SZDIRE); /* Initialize 85+C0 entry */ + dirb[XDIR_Type] = 0x85; + dirb[XDIR_Type + SZDIRE] = 0xC0; + st_word(dirb + XDIR_NameHash, xname_sum(lfn)); /* Set name hash */ + + i = SZDIRE * 2; /* C1 offset */ + nc = 0; nb = 1; chr = 1; + do { + dirb[i++] = 0xC1; dirb[i++] = 0; /* Entry type C1 */ + do { /* Fill name field */ + if (chr && (chr = lfn[nc]) != 0) nc++; /* Get a character if exist */ + st_word(dirb + i, chr); i += 2; /* Store it */ + } while (i % SZDIRE); + nb++; + } while (lfn[nc]); /* Fill next entry if any char follows */ + + dirb[XDIR_NumName] = nc; /* Set name length */ + dirb[XDIR_NumSec] = nb; /* Set number of C0+C1s */ +} + +#endif /* !_FS_READONLY */ +#endif /* _FS_EXFAT */ + + + +#if _FS_MINIMIZE <= 1 || _FS_RPATH >= 2 || _USE_LABEL || _FS_EXFAT +/*-----------------------------------------------------------------------*/ +/* Read an object from the directory */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_read ( + DIR* dp, /* Pointer to the directory object */ + int vol /* Filtered by 0:file/directory or 1:volume label */ +) +{ + FRESULT res = FR_NO_FILE; + FATFS *fs = dp->obj.fs; + BYTE a, c; +#if _USE_LFN != 0 + BYTE ord = 0xFF, sum = 0xFF; +#endif + + while (dp->sect) { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + c = dp->dir[DIR_Name]; /* Test for the entry type */ + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of the directory */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + if (_USE_LABEL && vol) { + if (c == 0x83) break; /* Volume label entry? */ + } else { + if (c == 0x85) { /* Start of the file entry block? */ + dp->blk_ofs = dp->dptr; /* Get location of the block */ + res = load_xdir(dp); /* Load the entry block */ + if (res == FR_OK) { + dp->obj.attr = fs->dirbuf[XDIR_Attr] & AM_MASK; /* Get attribute */ + } + break; + } + } + } else +#endif + { /* On the FAT12/16/32 volume */ + dp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK; /* Get attribute */ +#if _USE_LFN != 0 /* LFN configuration */ + if (c == DDEM || c == '.' || (int)((a & ~AM_ARC) == AM_VOL) != vol) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (c & LLEF) { /* Is it start of an LFN sequence? */ + sum = dp->dir[LDIR_Chksum]; + c &= (BYTE)~LLEF; ord = c; + dp->blk_ofs = dp->dptr; + } + /* Check LFN validity and capture it */ + ord = (c == ord && sum == dp->dir[LDIR_Chksum] && pick_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; + } else { /* An SFN entry is found */ + if (ord || sum != sum_sfn(dp->dir)) { /* Is there a valid LFN? */ + dp->blk_ofs = 0xFFFFFFFF; /* It has no LFN. */ + } + break; + } + } +#else /* Non LFN configuration */ + if (c != DDEM && c != '.' && a != AM_LFN && (int)((a & ~AM_ARC) == AM_VOL) == vol) { /* Is it a valid entry? */ + break; + } +#endif + } + res = dir_next(dp, 0); /* Next entry */ + if (res != FR_OK) break; + } + + if (res != FR_OK) dp->sect = 0; /* Terminate the read operation on error or EOT */ + return res; +} + +#endif /* _FS_MINIMIZE <= 1 || _USE_LABEL || _FS_RPATH >= 2 */ + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Find an object in the directory */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_find ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp /* Pointer to the directory object with the file name */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; + BYTE c; +#if _USE_LFN != 0 + BYTE a, ord, sum; +#endif + + res = dir_sdi(dp, 0); /* Rewind directory object */ + if (res != FR_OK) return res; +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + BYTE nc; + UINT di, ni; + WORD hash = xname_sum(fs->lfnbuf); /* Hash value of the name to find */ + + while ((res = dir_read(dp, 0)) == FR_OK) { /* Read an item */ + if (ld_word(fs->dirbuf + XDIR_NameHash) != hash) continue; /* Skip the comparison if hash value mismatched */ + for (nc = fs->dirbuf[XDIR_NumName], di = SZDIRE * 2, ni = 0; nc; nc--, di += 2, ni++) { /* Compare the name */ + if ((di % SZDIRE) == 0) di += 2; + if (ff_wtoupper(ld_word(fs->dirbuf + di)) != ff_wtoupper(fs->lfnbuf[ni])) break; + } + if (nc == 0 && !fs->lfnbuf[ni]) break; /* Name matched? */ + } + return res; + } +#endif + /* On the FAT12/16/32 volume */ +#if _USE_LFN != 0 + ord = sum = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ +#endif + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + c = dp->dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if _USE_LFN != 0 /* LFN configuration */ + dp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK; + if (c == DDEM || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (!(dp->fn[NSFLAG] & NS_NOLFN)) { + if (c & LLEF) { /* Is it start of LFN sequence? */ + sum = dp->dir[LDIR_Chksum]; + c &= (BYTE)~LLEF; ord = c; /* LFN start order */ + dp->blk_ofs = dp->dptr; /* Start offset of LFN */ + } + /* Check validity of the LFN entry and compare it with given name */ + ord = (c == ord && sum == dp->dir[LDIR_Chksum] && cmp_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; + } + } else { /* An SFN entry is found */ + if (!ord && sum == sum_sfn(dp->dir)) break; /* LFN matched? */ + if (!(dp->fn[NSFLAG] & NS_LOSS) && !mem_cmp(dp->dir, dp->fn, 11)) break; /* SFN matched? */ + ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ + } + } +#else /* Non LFN configuration */ + dp->obj.attr = dp->dir[DIR_Attr] & AM_MASK; + if (!(dp->dir[DIR_Attr] & AM_VOL) && !mem_cmp(dp->dir, dp->fn, 11)) break; /* Is it a valid entry? */ +#endif + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK); + + return res; +} + + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Register an object to the directory */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_register ( /* FR_OK:succeeded, FR_DENIED:no free entry or too many SFN collision, FR_DISK_ERR:disk error */ + DIR* dp /* Target directory with object name to be created */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; +#if _USE_LFN != 0 /* LFN configuration */ + UINT n, nlen, nent; + BYTE sn[12], sum; + + + if (dp->fn[NSFLAG] & (NS_DOT | NS_NONAME)) return FR_INVALID_NAME; /* Check name validity */ + for (nlen = 0; fs->lfnbuf[nlen]; nlen++) ; /* Get lfn length */ + +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + DIR dj; + + nent = (nlen + 14) / 15 + 2; /* Number of entries to allocate (85+C0+C1s) */ + res = dir_alloc(dp, nent); /* Allocate entries */ + if (res != FR_OK) return res; + dp->blk_ofs = dp->dptr - SZDIRE * (nent - 1); /* Set block position */ + + if (dp->obj.sclust != 0 && (dp->obj.stat & 4)) { /* Has the sub-directory been stretched? */ + dp->obj.stat &= 3; + dp->obj.objsize += (DWORD)fs->csize * SS(fs); /* Increase object size by cluster size */ + res = fill_fat_chain(&dp->obj); /* Complement FAT chain if needed */ + if (res != FR_OK) return res; + res = load_obj_dir(&dj, &dp->obj); + if (res != FR_OK) return res; /* Load the object status */ + st_qword(fs->dirbuf + XDIR_FileSize, dp->obj.objsize); /* Update the allocation status */ + st_qword(fs->dirbuf + XDIR_ValidFileSize, dp->obj.objsize); + fs->dirbuf[XDIR_GenFlags] = dp->obj.stat | 1; + res = store_xdir(&dj); /* Store the object status */ + if (res != FR_OK) return res; + } + + create_xdir(fs->dirbuf, fs->lfnbuf); /* Create on-memory directory block to be written later */ + return FR_OK; + } +#endif + /* On the FAT12/16/32 volume */ + mem_cpy(sn, dp->fn, 12); + if (sn[NSFLAG] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ + dp->fn[NSFLAG] = NS_NOLFN; /* Find only SFN */ + for (n = 1; n < 100; n++) { + gen_numname(dp->fn, sn, fs->lfnbuf, n); /* Generate a numbered name */ + res = dir_find(dp); /* Check if the name collides with existing SFN */ + if (res != FR_OK) break; + } + if (n == 100) return FR_DENIED; /* Abort if too many collisions */ + if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ + dp->fn[NSFLAG] = sn[NSFLAG]; + } + + /* Create an SFN with/without LFNs. */ + nent = (sn[NSFLAG] & NS_LFN) ? (nlen + 12) / 13 + 1 : 1; /* Number of entries to allocate */ + res = dir_alloc(dp, nent); /* Allocate entries */ + if (res == FR_OK && --nent) { /* Set LFN entry if needed */ + res = dir_sdi(dp, dp->dptr - nent * SZDIRE); + if (res == FR_OK) { + sum = sum_sfn(dp->fn); /* Checksum value of the SFN tied to the LFN */ + do { /* Store LFN entries in bottom first */ + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + put_lfn(fs->lfnbuf, dp->dir, (BYTE)nent, sum); + fs->wflag = 1; + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK && --nent); + } + } + +#else /* Non LFN configuration */ + res = dir_alloc(dp, 1); /* Allocate an entry for SFN */ + +#endif + + /* Set SFN entry */ + if (res == FR_OK) { + res = move_window(fs, dp->sect); + if (res == FR_OK) { + mem_set(dp->dir, 0, SZDIRE); /* Clean the entry */ + mem_cpy(dp->dir + DIR_Name, dp->fn, 11); /* Put SFN */ +#if _USE_LFN != 0 + dp->dir[DIR_NTres] = dp->fn[NSFLAG] & (NS_BODY | NS_EXT); /* Put NT flag */ +#endif + fs->wflag = 1; + } + } + + return res; +} + +#endif /* !_FS_READONLY */ + + + +#if !_FS_READONLY && _FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Remove an object from the directory */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_remove ( /* FR_OK:Succeeded, FR_DISK_ERR:A disk error */ + DIR* dp /* Directory object pointing the entry to be removed */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; +#if _USE_LFN != 0 /* LFN configuration */ + DWORD last = dp->dptr; + + res = (dp->blk_ofs == 0xFFFFFFFF) ? FR_OK : dir_sdi(dp, dp->blk_ofs); /* Goto top of the entry block if LFN is exist */ + if (res == FR_OK) { + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + /* Mark an entry 'deleted' */ + if (_FS_EXFAT && fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + dp->dir[XDIR_Type] &= 0x7F; + } else { /* On the FAT12/16/32 volume */ + dp->dir[DIR_Name] = DDEM; + } + fs->wflag = 1; + if (dp->dptr >= last) break; /* If reached last entry then all entries of the object has been deleted. */ + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR; + } +#else /* Non LFN configuration */ + + res = move_window(fs, dp->sect); + if (res == FR_OK) { + dp->dir[DIR_Name] = DDEM; + fs->wflag = 1; + } +#endif + + return res; +} + +#endif /* !_FS_READONLY && _FS_MINIMIZE == 0 */ + + + +#if _FS_MINIMIZE <= 1 || _FS_RPATH >= 2 +/*-----------------------------------------------------------------------*/ +/* Get file information from directory entry */ +/*-----------------------------------------------------------------------*/ + +static +void get_fileinfo ( /* No return code */ + DIR* dp, /* Pointer to the directory object */ + FILINFO* fno /* Pointer to the file information to be filled */ +) +{ + UINT i, j; + TCHAR c; + DWORD tm; +#if _USE_LFN != 0 + WCHAR w, lfv; + FATFS *fs = dp->obj.fs; +#endif + + + fno->fname[0] = 0; /* Invaidate file info */ + if (!dp->sect) return; /* Exit if read pointer has reached end of directory */ + +#if _USE_LFN != 0 /* LFN configuration */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + get_xdir_info(fs->dirbuf, fno); + return; + } else +#endif + { /* On the FAT12/16/32 volume */ + if (dp->blk_ofs != 0xFFFFFFFF) { /* Get LFN if available */ + i = j = 0; + while ((w = fs->lfnbuf[j++]) != 0) { /* Get an LFN character */ +#if !_LFN_UNICODE + w = ff_convert(w, 0); /* Unicode -> OEM */ + if (w == 0) { i = 0; break; } /* No LFN if it could not be converted */ + if (_DF1S && w >= 0x100) { /* Put 1st byte if it is a DBC (always false at SBCS cfg) */ + fno->fname[i++] = (char)(w >> 8); + } +#endif + if (i >= _MAX_LFN) { i = 0; break; } /* No LFN if buffer overflow */ + fno->fname[i++] = (TCHAR)w; + } + fno->fname[i] = 0; /* Terminate the LFN */ + } + } + + i = j = 0; + lfv = fno->fname[i]; /* LFN is exist if non-zero */ + while (i < 11) { /* Copy name body and extension */ + c = (TCHAR)dp->dir[i++]; + if (c == ' ') continue; /* Skip padding spaces */ + if (c == RDDEM) c = (TCHAR)DDEM; /* Restore replaced DDEM character */ + if (i == 9) { /* Insert a . if extension is exist */ + if (!lfv) fno->fname[j] = '.'; + fno->altname[j++] = '.'; + } +#if _LFN_UNICODE + if (IsDBCS1(c) && i != 8 && i != 11 && IsDBCS2(dp->dir[i])) { + c = c << 8 | dp->dir[i++]; + } + c = ff_convert(c, 1); /* OEM -> Unicode */ + if (!c) c = '?'; +#endif + fno->altname[j] = c; + if (!lfv) { + if (IsUpper(c) && (dp->dir[DIR_NTres] & (i >= 9 ? NS_EXT : NS_BODY))) { + c += 0x20; /* To lower */ + } + fno->fname[j] = c; + } + j++; + } + if (!lfv) { + fno->fname[j] = 0; + if (!dp->dir[DIR_NTres]) j = 0; /* Altname is no longer needed if neither LFN nor case info is exist. */ + } + fno->altname[j] = 0; /* Terminate the SFN */ + +#else /* Non-LFN configuration */ + i = j = 0; + while (i < 11) { /* Copy name body and extension */ + c = (TCHAR)dp->dir[i++]; + if (c == ' ') continue; /* Skip padding spaces */ + if (c == RDDEM) c = (TCHAR)DDEM; /* Restore replaced DDEM character */ + if (i == 9) fno->fname[j++] = '.'; /* Insert a . if extension is exist */ + fno->fname[j++] = c; + } + fno->fname[j] = 0; +#endif + + fno->fattrib = dp->dir[DIR_Attr]; /* Attribute */ + fno->fsize = ld_dword(dp->dir + DIR_FileSize); /* Size */ + tm = ld_dword(dp->dir + DIR_ModTime); /* Timestamp */ + fno->ftime = (WORD)tm; fno->fdate = (WORD)(tm >> 16); +} + +#endif /* _FS_MINIMIZE <= 1 || _FS_RPATH >= 2 */ + + + +#if _USE_FIND && _FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Pattern matching */ +/*-----------------------------------------------------------------------*/ + +static +WCHAR get_achar ( /* Get a character and advances ptr 1 or 2 */ + const TCHAR** ptr /* Pointer to pointer to the SBCS/DBCS/Unicode string */ +) +{ +#if !_LFN_UNICODE + WCHAR chr; + + chr = (BYTE)*(*ptr)++; /* Get a byte */ + if (IsLower(chr)) chr -= 0x20; /* To upper ASCII char */ +#ifdef _EXCVT + if (chr >= 0x80) chr = ExCvt[chr - 0x80]; /* To upper SBCS extended char */ +#else + if (IsDBCS1(chr) && IsDBCS2(**ptr)) { /* Get DBC 2nd byte if needed */ + chr = chr << 8 | (BYTE)*(*ptr)++; + } +#endif + return chr; +#else + return ff_wtoupper(*(*ptr)++); /* Get a word and to upper */ +#endif +} + + +static +int pattern_matching ( /* 0:not matched, 1:matched */ + const TCHAR* pat, /* Matching pattern */ + const TCHAR* nam, /* String to be tested */ + int skip, /* Number of pre-skip chars (number of ?s) */ + int inf /* Infinite search (* specified) */ +) +{ + const TCHAR *pp, *np; + WCHAR pc, nc; + int nm, nx; + + + while (skip--) { /* Pre-skip name chars */ + if (!get_achar(&nam)) return 0; /* Branch mismatched if less name chars */ + } + if (!*pat && inf) return 1; /* (short circuit) */ + + do { + pp = pat; np = nam; /* Top of pattern and name to match */ + for (;;) { + if (*pp == '?' || *pp == '*') { /* Wildcard? */ + nm = nx = 0; + do { /* Analyze the wildcard chars */ + if (*pp++ == '?') nm++; else nx = 1; + } while (*pp == '?' || *pp == '*'); + if (pattern_matching(pp, np, nm, nx)) return 1; /* Test new branch (recurs upto number of wildcard blocks in the pattern) */ + nc = *np; break; /* Branch mismatched */ + } + pc = get_achar(&pp); /* Get a pattern char */ + nc = get_achar(&np); /* Get a name char */ + if (pc != nc) break; /* Branch mismatched? */ + if (pc == 0) return 1; /* Branch matched? (matched at end of both strings) */ + } + get_achar(&nam); /* nam++ */ + } while (inf && nc); /* Retry until end of name if infinite search is specified */ + + return 0; +} + +#endif /* _USE_FIND && _FS_MINIMIZE <= 1 */ + + + +/*-----------------------------------------------------------------------*/ +/* Pick a top segment and create the object name in directory form */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT create_name ( /* FR_OK: successful, FR_INVALID_NAME: could not create */ + DIR* dp, /* Pointer to the directory object */ + const TCHAR** path /* Pointer to pointer to the segment in the path string */ +) +{ +#if _USE_LFN != 0 /* LFN configuration */ + BYTE b, cf; + WCHAR w, *lfn; + UINT i, ni, si, di; + const TCHAR *p; + + /* Create LFN in Unicode */ + p = *path; lfn = dp->obj.fs->lfnbuf; si = di = 0; + for (;;) { + w = p[si++]; /* Get a character */ + if (w < ' ') break; /* Break if end of the path name */ + if (w == '/' || w == '\\') { /* Break if a separator is found */ + while (p[si] == '/' || p[si] == '\\') si++; /* Skip duplicated separator if exist */ + break; + } + if (di >= _MAX_LFN) return FR_INVALID_NAME; /* Reject too long name */ +#if !_LFN_UNICODE + w &= 0xFF; + if (IsDBCS1(w)) { /* Check if it is a DBC 1st byte (always false on SBCS cfg) */ + b = (BYTE)p[si++]; /* Get 2nd byte */ + w = (w << 8) + b; /* Create a DBC */ + if (!IsDBCS2(b)) return FR_INVALID_NAME; /* Reject invalid sequence */ + } + w = ff_convert(w, 1); /* Convert ANSI/OEM to Unicode */ + if (!w) return FR_INVALID_NAME; /* Reject invalid code */ +#endif + if (w < 0x80 && chk_chr("\"*:<>\?|\x7F", w)) return FR_INVALID_NAME; /* Reject illegal characters for LFN */ + lfn[di++] = w; /* Store the Unicode character */ + } + *path = &p[si]; /* Return pointer to the next segment */ + cf = (w < ' ') ? NS_LAST : 0; /* Set last segment flag if end of the path */ +#if _FS_RPATH != 0 + if ((di == 1 && lfn[di - 1] == '.') || + (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) { /* Is this segment a dot name? */ + lfn[di] = 0; + for (i = 0; i < 11; i++) /* Create dot name for SFN entry */ + dp->fn[i] = (i < di) ? '.' : ' '; + dp->fn[i] = cf | NS_DOT; /* This is a dot entry */ + return FR_OK; + } +#endif + while (di) { /* Snip off trailing spaces and dots if exist */ + w = lfn[di - 1]; + if (w != ' ' && w != '.') break; + di--; + } + lfn[di] = 0; /* LFN is created */ + if (di == 0) return FR_INVALID_NAME; /* Reject nul name */ + + /* Create SFN in directory form */ + mem_set(dp->fn, ' ', 11); + for (si = 0; lfn[si] == ' ' || lfn[si] == '.'; si++) ; /* Strip leading spaces and dots */ + if (si) cf |= NS_LOSS | NS_LFN; + while (di && lfn[di - 1] != '.') di--; /* Find extension (di<=si: no extension) */ + + i = b = 0; ni = 8; + for (;;) { + w = lfn[si++]; /* Get an LFN character */ + if (!w) break; /* Break on end of the LFN */ + if (w == ' ' || (w == '.' && si != di)) { /* Remove spaces and dots */ + cf |= NS_LOSS | NS_LFN; continue; + } + + if (i >= ni || si == di) { /* Extension or end of SFN */ + if (ni == 11) { /* Long extension */ + cf |= NS_LOSS | NS_LFN; break; + } + if (si != di) cf |= NS_LOSS | NS_LFN; /* Out of 8.3 format */ + if (si > di) break; /* No extension */ + si = di; i = 8; ni = 11; /* Enter extension section */ + b <<= 2; continue; + } + + if (w >= 0x80) { /* Non ASCII character */ +#ifdef _EXCVT + w = ff_convert(w, 0); /* Unicode -> OEM code */ + if (w) w = ExCvt[w - 0x80]; /* Convert extended character to upper (SBCS) */ +#else + w = ff_convert(ff_wtoupper(w), 0); /* Upper converted Unicode -> OEM code */ +#endif + cf |= NS_LFN; /* Force create LFN entry */ + } + + if (_DF1S && w >= 0x100) { /* Is this DBC? (always false at SBCS cfg) */ + if (i >= ni - 1) { + cf |= NS_LOSS | NS_LFN; i = ni; continue; + } + dp->fn[i++] = (BYTE)(w >> 8); + } else { /* SBC */ + if (!w || chk_chr("+,;=[]", w)) { /* Replace illegal characters for SFN */ + w = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */ + } else { + if (IsUpper(w)) { /* ASCII large capital */ + b |= 2; + } else { + if (IsLower(w)) { /* ASCII small capital */ + b |= 1; w -= 0x20; + } + } + } + } + dp->fn[i++] = (BYTE)w; + } + + if (dp->fn[0] == DDEM) dp->fn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ + + if (ni == 8) b <<= 2; + if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) cf |= NS_LFN; /* Create LFN entry when there are composite capitals */ + if (!(cf & NS_LFN)) { /* When LFN is in 8.3 format without extended character, NT flags are created */ + if ((b & 0x03) == 0x01) cf |= NS_EXT; /* NT flag (Extension has only small capital) */ + if ((b & 0x0C) == 0x04) cf |= NS_BODY; /* NT flag (Filename has only small capital) */ + } + + dp->fn[NSFLAG] = cf; /* SFN is created */ + + return FR_OK; + + +#else /* _USE_LFN != 0 : Non-LFN configuration */ + BYTE c, d, *sfn; + UINT ni, si, i; + const char *p; + + /* Create file name in directory form */ + p = *path; sfn = dp->fn; + mem_set(sfn, ' ', 11); + si = i = 0; ni = 8; +#if _FS_RPATH != 0 + if (p[si] == '.') { /* Is this a dot entry? */ + for (;;) { + c = (BYTE)p[si++]; + if (c != '.' || si >= 3) break; + sfn[i++] = c; + } + if (c != '/' && c != '\\' && c > ' ') return FR_INVALID_NAME; + *path = p + si; /* Return pointer to the next segment */ + sfn[NSFLAG] = (c <= ' ') ? NS_LAST | NS_DOT : NS_DOT; /* Set last segment flag if end of the path */ + return FR_OK; + } +#endif + for (;;) { + c = (BYTE)p[si++]; + if (c <= ' ') break; /* Break if end of the path name */ + if (c == '/' || c == '\\') { /* Break if a separator is found */ + while (p[si] == '/' || p[si] == '\\') si++; /* Skip duplicated separator if exist */ + break; + } + if (c == '.' || i >= ni) { /* End of body or over size? */ + if (ni == 11 || c != '.') return FR_INVALID_NAME; /* Over size or invalid dot */ + i = 8; ni = 11; /* Goto extension */ + continue; + } + if (c >= 0x80) { /* Extended character? */ +#ifdef _EXCVT + c = ExCvt[c - 0x80]; /* To upper extended characters (SBCS cfg) */ +#else +#if !_DF1S + return FR_INVALID_NAME; /* Reject extended characters (ASCII only cfg) */ +#endif +#endif + } + if (IsDBCS1(c)) { /* Check if it is a DBC 1st byte (always false at SBCS cfg.) */ + d = (BYTE)p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(d) || i >= ni - 1) return FR_INVALID_NAME; /* Reject invalid DBC */ + sfn[i++] = c; + sfn[i++] = d; + } else { /* SBC */ + if (chk_chr("\"*+,:;<=>\?[]|\x7F", c)) return FR_INVALID_NAME; /* Reject illegal chrs for SFN */ + if (IsLower(c)) c -= 0x20; /* To upper */ + sfn[i++] = c; + } + } + *path = p + si; /* Return pointer to the next segment */ + if (i == 0) return FR_INVALID_NAME; /* Reject nul string */ + + if (sfn[0] == DDEM) sfn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ + sfn[NSFLAG] = (c <= ' ') ? NS_LAST : 0; /* Set last segment flag if end of the path */ + + return FR_OK; +#endif /* _USE_LFN != 0 */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Follow a file path */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */ + DIR* dp, /* Directory object to return last directory and found object */ + const TCHAR* path /* Full-path string to find a file or directory */ +) +{ + FRESULT res; + BYTE ns; + _FDID *obj = &dp->obj; + FATFS *fs = obj->fs; + + +#if _FS_RPATH != 0 + if (*path != '/' && *path != '\\') { /* Without heading separator */ + obj->sclust = fs->cdir; /* Start from the current directory */ + } else +#endif + { /* With heading separator */ + while (*path == '/' || *path == '\\') path++; /* Strip heading separator */ + obj->sclust = 0; /* Start from the root directory */ + } +#if _FS_EXFAT && _FS_RPATH != 0 + if (fs->fs_type == FS_EXFAT && obj->sclust) { /* Retrieve the sub-directory status if needed */ + DIR dj; + + obj->c_scl = fs->cdc_scl; + obj->c_size = fs->cdc_size; + obj->c_ofs = fs->cdc_ofs; + res = load_obj_dir(&dj, obj); + if (res != FR_OK) return res; + obj->objsize = ld_dword(fs->dirbuf + XDIR_FileSize); + obj->stat = fs->dirbuf[XDIR_GenFlags] & 2; + } +#endif + + if ((UINT)*path < ' ') { /* Null path name is the origin directory itself */ + dp->fn[NSFLAG] = NS_NONAME; + res = dir_sdi(dp, 0); + + } else { /* Follow path */ + for (;;) { + res = create_name(dp, &path); /* Get a segment name of the path */ + if (res != FR_OK) break; + res = dir_find(dp); /* Find an object with the segment name */ + ns = dp->fn[NSFLAG]; + if (res != FR_OK) { /* Failed to find the object */ + if (res == FR_NO_FILE) { /* Object is not found */ + if (_FS_RPATH && (ns & NS_DOT)) { /* If dot entry is not exist, stay there */ + if (!(ns & NS_LAST)) continue; /* Continue to follow if not last segment */ + dp->fn[NSFLAG] = NS_NONAME; + res = FR_OK; + } else { /* Could not find the object */ + if (!(ns & NS_LAST)) res = FR_NO_PATH; /* Adjust error code if not last segment */ + } + } + break; + } + if (ns & NS_LAST) break; /* Last segment matched. Function completed. */ + /* Get into the sub-directory */ + if (!(obj->attr & AM_DIR)) { /* It is not a sub-directory and cannot follow */ + res = FR_NO_PATH; break; + } +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + obj->c_scl = obj->sclust; /* Save containing directory information for next dir */ + obj->c_size = ((DWORD)obj->objsize & 0xFFFFFF00) | obj->stat; + obj->c_ofs = dp->blk_ofs; + obj->sclust = ld_dword(fs->dirbuf + XDIR_FstClus); /* Open next directory */ + obj->stat = fs->dirbuf[XDIR_GenFlags] & 2; + obj->objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + } else +#endif + { + obj->sclust = ld_clust(fs, fs->win + dp->dptr % SS(fs)); /* Open next directory */ + } + } + } + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Get logical drive number from path name */ +/*-----------------------------------------------------------------------*/ + +static +int get_ldnumber ( /* Returns logical drive number (-1:invalid drive) */ + const TCHAR** path /* Pointer to pointer to the path name */ +) +{ + const TCHAR *tp, *tt; + UINT i; + int vol = -1; +#if _STR_VOLUME_ID /* Find string drive id */ + static const char* const str[] = {_VOLUME_STRS}; + const char *sp; + char c; + TCHAR tc; +#endif + + + if (*path) { /* If the pointer is not a null */ + for (tt = *path; (UINT)*tt >= (_USE_LFN ? ' ' : '!') && *tt != ':'; tt++) ; /* Find ':' in the path */ + if (*tt == ':') { /* If a ':' is exist in the path name */ + tp = *path; + i = *tp++ - '0'; + if (i < 10 && tp == tt) { /* Is there a numeric drive id? */ + if (i < _VOLUMES) { /* If a drive id is found, get the value and strip it */ + vol = (int)i; + *path = ++tt; + } + } +#if _STR_VOLUME_ID + else { /* No numeric drive number, find string drive id */ + i = 0; tt++; + do { + sp = str[i]; tp = *path; + do { /* Compare a string drive id with path name */ + c = *sp++; tc = *tp++; + if (IsLower(tc)) tc -= 0x20; + } while (c && (TCHAR)c == tc); + } while ((c || tp != tt) && ++i < _VOLUMES); /* Repeat for each id until pattern match */ + if (i < _VOLUMES) { /* If a drive id is found, get the value and strip it */ + vol = (int)i; + *path = tt; + } + } +#endif + return vol; + } +#if _FS_RPATH != 0 && _VOLUMES >= 2 + vol = CurrVol; /* Current drive */ +#else + vol = 0; /* Drive 0 */ +#endif + } + return vol; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Load a sector and check if it is an FAT boot sector */ +/*-----------------------------------------------------------------------*/ + +static +BYTE check_fs ( /* 0:FAT, 1:exFAT, 2:Valid BS but not FAT, 3:Not a BS, 4:Disk error */ + FATFS* fs, /* File system object */ + DWORD sect /* Sector# (lba) to check if it is an FAT-VBR or not */ +) +{ + fs->wflag = 0; fs->winsect = 0xFFFFFFFF; /* Invaidate window */ + if (move_window(fs, sect) != FR_OK) return 4; /* Load boot record */ + + if (ld_word(fs->win + BS_55AA) != 0xAA55) return 3; /* Check boot record signature (always placed at offset 510 even if the sector size is >512) */ + + if (fs->win[BS_JmpBoot] == 0xE9 || (fs->win[BS_JmpBoot] == 0xEB && fs->win[BS_JmpBoot + 2] == 0x90)) { + if ((ld_dword(fs->win + BS_FilSysType) & 0xFFFFFF) == 0x544146) return 0; /* Check "FAT" string */ + if (ld_dword(fs->win + BS_FilSysType32) == 0x33544146) return 0; /* Check "FAT3" string */ + } +#if _FS_EXFAT + if (!mem_cmp(fs->win + BS_JmpBoot, "\xEB\x76\x90" "EXFAT ", 11)) return 1; +#endif + return 2; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Find logical drive and check if the volume is mounted */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ + const TCHAR** path, /* Pointer to pointer to the path name (drive number) */ + FATFS** rfs, /* Pointer to pointer to the found file system object */ + BYTE mode /* !=0: Check write protection for write access */ +) +{ + BYTE fmt, *pt; + int vol; + DSTATUS stat; + DWORD bsect, fasize, tsect, sysect, nclst, szbfat, br[4]; + WORD nrsv; + FATFS *fs; + UINT i; + + + /* Get logical drive number */ + *rfs = 0; + vol = get_ldnumber(path); + if (vol < 0) return FR_INVALID_DRIVE; + + /* Check if the file system object is valid or not */ + fs = FatFs[vol]; /* Get pointer to the file system object */ + if (!fs) return FR_NOT_ENABLED; /* Is the file system object available? */ + + ENTER_FF(fs); /* Lock the volume */ + *rfs = fs; /* Return pointer to the file system object */ + + mode &= (BYTE)~FA_READ; /* Desired access mode, write access or not */ + if (fs->fs_type) { /* If the volume has been mounted */ + stat = disk_status(fs->drv); + if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized */ + if (!_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check write protection if needed */ + return FR_WRITE_PROTECTED; + } + return FR_OK; /* The file system object is valid */ + } + } + + /* The file system object is not valid. */ + /* Following code attempts to mount the volume. (analyze BPB and initialize the fs object) */ + + fs->fs_type = 0; /* Clear the file system object */ + fs->drv = LD2PD(vol); /* Bind the logical drive and a physical drive */ + stat = disk_initialize(fs->drv); /* Initialize the physical drive */ + if (stat & STA_NOINIT) { /* Check if the initialization succeeded */ + return FR_NOT_READY; /* Failed to initialize due to no medium or hard error */ + } + if (!_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check disk write protection if needed */ + return FR_WRITE_PROTECTED; + } +#if _MAX_SS != _MIN_SS /* Get sector size (multiple sector size cfg only) */ + if (disk_ioctl(fs->drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK) return FR_DISK_ERR; + if (SS(fs) > _MAX_SS || SS(fs) < _MIN_SS || (SS(fs) & (SS(fs) - 1))) return FR_DISK_ERR; +#endif + /* Find an FAT partition on the drive. Supports only generic partitioning, FDISK and SFD. */ + bsect = 0; + fmt = check_fs(fs, bsect); /* Load sector 0 and check if it is an FAT-VBR as SFD */ + if (fmt == 2 || (fmt < 2 && LD2PT(vol) != 0)) { /* Not an FAT-VBR or forced partition number */ + for (i = 0; i < 4; i++) { /* Get partition offset */ + pt = fs->win + (MBR_Table + i * SZ_PTE); + br[i] = pt[PTE_System] ? ld_dword(pt + PTE_StLba) : 0; + } + i = LD2PT(vol); /* Partition number: 0:auto, 1-4:forced */ + if (i) i--; + do { /* Find an FAT volume */ + bsect = br[i]; + fmt = bsect ? check_fs(fs, bsect) : 3; /* Check the partition */ + } while (!LD2PT(vol) && fmt >= 2 && ++i < 4); + } + if (fmt == 4) return FR_DISK_ERR; /* An error occured in the disk I/O layer */ + if (fmt >= 2) return FR_NO_FILESYSTEM; /* No FAT volume is found */ + + /* An FAT volume is found. Following code initializes the file system object */ + +#if _FS_EXFAT + if (fmt == 1) { + QWORD maxlba; + + for (i = BPB_ZeroedEx; i < BPB_ZeroedEx + 53 && fs->win[i] == 0; i++) ; /* Check zero filler */ + if (i < BPB_ZeroedEx + 53) return FR_NO_FILESYSTEM; + + if (ld_word(fs->win + BPB_FSVerEx) != 0x100) return FR_NO_FILESYSTEM; /* Check exFAT revision (Must be 1.0) */ + + if (1 << fs->win[BPB_BytsPerSecEx] != SS(fs)) /* (BPB_BytsPerSecEx must be equal to the physical sector size) */ + return FR_NO_FILESYSTEM; + + maxlba = ld_qword(fs->win + BPB_TotSecEx) + bsect; /* Last LBA + 1 of the volume */ + if (maxlba >= 0x100000000) return FR_NO_FILESYSTEM; /* (It cannot be handled in 32-bit LBA) */ + + fs->fsize = ld_dword(fs->win + BPB_FatSzEx); /* Number of sectors per FAT */ + + fs->n_fats = fs->win[BPB_NumFATsEx]; /* Number of FATs */ + if (fs->n_fats != 1) return FR_NO_FILESYSTEM; /* (Supports only 1 FAT) */ + + fs->csize = 1 << fs->win[BPB_SecPerClusEx]; /* Cluster size */ + if (fs->csize == 0) return FR_NO_FILESYSTEM; /* (Must be 1..32768) */ + + nclst = ld_dword(fs->win + BPB_NumClusEx); /* Number of clusters */ + if (nclst > MAX_EXFAT) return FR_NO_FILESYSTEM; /* (Too many clusters) */ + fs->n_fatent = nclst + 2; + + /* Boundaries and Limits */ + fs->volbase = bsect; + fs->database = bsect + ld_dword(fs->win + BPB_DataOfsEx); + fs->fatbase = bsect + ld_dword(fs->win + BPB_FatOfsEx); + if (maxlba < (QWORD)fs->database + nclst * fs->csize) return FR_NO_FILESYSTEM; /* (Volume size must not be smaller than the size requiered) */ + fs->dirbase = ld_dword(fs->win + BPB_RootClusEx); + + /* Check if bitmap location is in assumption (at the first cluster) */ + if (move_window(fs, clust2sect(fs, fs->dirbase)) != FR_OK) return FR_DISK_ERR; + for (i = 0; i < SS(fs); i += SZDIRE) { + if (fs->win[i] == 0x81 && ld_dword(fs->win + i + 20) == 2) break; /* 81 entry with cluster #2? */ + } + if (i == SS(fs)) return FR_NO_FILESYSTEM; +#if !_FS_READONLY + fs->last_clst = fs->free_clst = 0xFFFFFFFF; /* Initialize cluster allocation information */ +#endif + fmt = FS_EXFAT; /* FAT sub-type */ + } else +#endif /* _FS_EXFAT */ + { + if (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_BytsPerSec must be equal to the physical sector size) */ + + fasize = ld_word(fs->win + BPB_FATSz16); /* Number of sectors per FAT */ + if (fasize == 0) fasize = ld_dword(fs->win + BPB_FATSz32); + fs->fsize = fasize; + + fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FATs */ + if (fs->n_fats != 1 && fs->n_fats != 2) return FR_NO_FILESYSTEM; /* (Must be 1 or 2) */ + fasize *= fs->n_fats; /* Number of sectors for FAT area */ + + fs->csize = fs->win[BPB_SecPerClus]; /* Cluster size */ + if (fs->csize == 0 || (fs->csize & (fs->csize - 1))) return FR_NO_FILESYSTEM; /* (Must be power of 2) */ + + fs->n_rootdir = ld_word(fs->win + BPB_RootEntCnt); /* Number of root directory entries */ + if (fs->n_rootdir % (SS(fs) / SZDIRE)) return FR_NO_FILESYSTEM; /* (Must be sector aligned) */ + + tsect = ld_word(fs->win + BPB_TotSec16); /* Number of sectors on the volume */ + if (tsect == 0) tsect = ld_dword(fs->win + BPB_TotSec32); + + nrsv = ld_word(fs->win + BPB_RsvdSecCnt); /* Number of reserved sectors */ + if (nrsv == 0) return FR_NO_FILESYSTEM; /* (Must not be 0) */ + + /* Determine the FAT sub type */ + sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZDIRE); /* RSV + FAT + DIR */ + if (tsect < sysect) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + nclst = (tsect - sysect) / fs->csize; /* Number of clusters */ + if (nclst == 0) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + fmt = FS_FAT32; + if (nclst <= MAX_FAT16) fmt = FS_FAT16; + if (nclst <= MAX_FAT12) fmt = FS_FAT12; + + /* Boundaries and Limits */ + fs->n_fatent = nclst + 2; /* Number of FAT entries */ + fs->volbase = bsect; /* Volume start sector */ + fs->fatbase = bsect + nrsv; /* FAT start sector */ + fs->database = bsect + sysect; /* Data start sector */ + if (fmt == FS_FAT32) { + if (ld_word(fs->win + BPB_FSVer32) != 0) return FR_NO_FILESYSTEM; /* (Must be FAT32 revision 0.0) */ + if (fs->n_rootdir) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be 0) */ + fs->dirbase = ld_dword(fs->win + BPB_RootClus32); /* Root directory start cluster */ + szbfat = fs->n_fatent * 4; /* (Needed FAT size) */ + } else { + if (fs->n_rootdir == 0) return FR_NO_FILESYSTEM;/* (BPB_RootEntCnt must not be 0) */ + fs->dirbase = fs->fatbase + fasize; /* Root directory start sector */ + szbfat = (fmt == FS_FAT16) ? /* (Needed FAT size) */ + fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1); + } + if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_FATSz must not be less than the size needed) */ + +#if !_FS_READONLY + /* Get FSINFO if available */ + fs->last_clst = fs->free_clst = 0xFFFFFFFF; /* Initialize cluster allocation information */ + fs->fsi_flag = 0x80; +#if (_FS_NOFSINFO & 3) != 3 + if (fmt == FS_FAT32 /* Enable FSINFO only if FAT32 and BPB_FSInfo32 == 1 */ + && ld_word(fs->win + BPB_FSInfo32) == 1 + && move_window(fs, bsect + 1) == FR_OK) + { + fs->fsi_flag = 0; + if (ld_word(fs->win + BS_55AA) == 0xAA55 /* Load FSINFO data if available */ + && ld_dword(fs->win + FSI_LeadSig) == 0x41615252 + && ld_dword(fs->win + FSI_StrucSig) == 0x61417272) + { +#if (_FS_NOFSINFO & 1) == 0 + fs->free_clst = ld_dword(fs->win + FSI_Free_Count); +#endif +#if (_FS_NOFSINFO & 2) == 0 + fs->last_clst = ld_dword(fs->win + FSI_Nxt_Free); +#endif + } + } +#endif /* (_FS_NOFSINFO & 3) != 3 */ +#endif /* !_FS_READONLY */ + } + + fs->fs_type = fmt; /* FAT sub-type */ + fs->id = ++Fsid; /* File system mount ID */ +#if _USE_LFN == 1 + fs->lfnbuf = LfnBuf; /* Static LFN working buffer */ +#if _FS_EXFAT + fs->dirbuf = DirBuf; /* Static directory block working buuffer */ +#endif +#endif +#if _FS_RPATH != 0 + fs->cdir = 0; /* Initialize current directory */ +#endif +#if _FS_LOCK != 0 /* Clear file lock semaphores */ + clear_lock(fs); +#endif + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Check if the file/directory object is valid or not */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT validate ( /* Returns FR_OK or FR_INVALID_OBJECT */ + _FDID* obj, /* Pointer to the _OBJ, the 1st member in the FIL/DIR object, to check validity */ + FATFS** fs /* Pointer to pointer to the owner file system object to return */ +) +{ + FRESULT res; + + + if (!obj || !obj->fs || !obj->fs->fs_type || obj->fs->id != obj->id || (disk_status(obj->fs->drv) & STA_NOINIT)) { + *fs = 0; /* The object is invalid */ + res = FR_INVALID_OBJECT; + } else { + *fs = obj->fs; /* Owner file sytem object */ + ENTER_FF(obj->fs); /* Lock file system */ + res = FR_OK; + } + return res; +} + + + + +/*--------------------------------------------------------------------------- + + Public Functions (FatFs API) + +----------------------------------------------------------------------------*/ + + + +/*-----------------------------------------------------------------------*/ +/* Mount/Unmount a Logical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mount ( + FATFS* fs, /* Pointer to the file system object (NULL:unmount)*/ + const TCHAR* path, /* Logical drive number to be mounted/unmounted */ + BYTE opt /* Mode option 0:Do not mount (delayed mount), 1:Mount immediately */ +) +{ + FATFS *cfs; + int vol; + FRESULT res; + const TCHAR *rp = path; + + + /* Get logical drive number */ + vol = get_ldnumber(&rp); + if (vol < 0) return FR_INVALID_DRIVE; + cfs = FatFs[vol]; /* Pointer to fs object */ + + if (cfs) { +#if _FS_LOCK != 0 + clear_lock(cfs); +#endif +#if _FS_REENTRANT /* Discard sync object of the current volume */ + if (!ff_del_syncobj(cfs->sobj)) return FR_INT_ERR; +#endif + cfs->fs_type = 0; /* Clear old fs object */ + } + + if (fs) { + fs->fs_type = 0; /* Clear new fs object */ +#if _FS_REENTRANT /* Create sync object for the new volume */ + if (!ff_cre_syncobj((BYTE)vol, &fs->sobj)) return FR_INT_ERR; +#endif + } + FatFs[vol] = fs; /* Register new fs object */ + + if (!fs || opt != 1) return FR_OK; /* Do not mount now, it will be mounted later */ + + res = find_volume(&path, &fs, 0); /* Force mounted the volume */ + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Open or Create a File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_open ( + FIL* fp, /* Pointer to the blank file object */ + const TCHAR* path, /* Pointer to the file name */ + BYTE mode /* Access mode and file open mode flags */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; +#if !_FS_READONLY + DWORD dw, cl, bcs, clst, sc; + FSIZE_t ofs; +#endif + DEF_NAMBUF + + + if (!fp) return FR_INVALID_OBJECT; + + /* Get logical drive */ + mode &= _FS_READONLY ? FA_READ : FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_CREATE_NEW | FA_OPEN_ALWAYS | FA_OPEN_APPEND | FA_SEEKEND; + res = find_volume(&path, &fs, mode); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ +#if !_FS_READONLY /* R/W configuration */ + if (res == FR_OK) { + if (dj.fn[NSFLAG] & NS_NONAME) { /* Origin directory itself? */ + res = FR_INVALID_NAME; + } +#if _FS_LOCK != 0 + else { + res = chk_lock(&dj, (mode & ~FA_READ) ? 1 : 0); + } +#endif + } + /* Create or Open a file */ + if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { + if (res != FR_OK) { /* No file, create new */ + if (res == FR_NO_FILE) /* There is no file to open, create a new entry */ +#if _FS_LOCK != 0 + res = enq_lock() ? dir_register(&dj) : FR_TOO_MANY_OPEN_FILES; +#else + res = dir_register(&dj); +#endif + mode |= FA_CREATE_ALWAYS; /* File is created */ + } + else { /* Any object is already existing */ + if (dj.obj.attr & (AM_RDO | AM_DIR)) { /* Cannot overwrite it (R/O or DIR) */ + res = FR_DENIED; + } else { + if (mode & FA_CREATE_NEW) res = FR_EXIST; /* Cannot create as new file */ + } + } + if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) { /* Truncate it if overwrite mode */ + dw = GET_FATTIME(); +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + /* Get current allocation info */ + fp->obj.fs = fs; + fp->obj.sclust = ld_dword(fs->dirbuf + XDIR_FstClus); + fp->obj.objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + fp->obj.stat = fs->dirbuf[XDIR_GenFlags] & 2; + /* Initialize directory entry block */ + st_dword(fs->dirbuf + XDIR_CrtTime, dw); /* Set created time */ + fs->dirbuf[XDIR_CrtTime10] = 0; + st_dword(fs->dirbuf + XDIR_ModTime, dw); /* Set modified time */ + fs->dirbuf[XDIR_ModTime10] = 0; + fs->dirbuf[XDIR_Attr] = AM_ARC; /* Reset attribute */ + st_dword(fs->dirbuf + XDIR_FstClus, 0); /* Reset file allocation info */ + st_qword(fs->dirbuf + XDIR_FileSize, 0); + st_qword(fs->dirbuf + XDIR_ValidFileSize, 0); + fs->dirbuf[XDIR_GenFlags] = 1; + res = store_xdir(&dj); + if (res == FR_OK && fp->obj.sclust) { /* Remove the cluster chain if exist */ + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + fs->last_clst = fp->obj.sclust - 1; /* Reuse the cluster hole */ + } + } else +#endif + { + /* Clean directory info */ + st_dword(dj.dir + DIR_CrtTime, dw); /* Set created time */ + st_dword(dj.dir + DIR_ModTime, dw); /* Set modified time */ + dj.dir[DIR_Attr] = AM_ARC; /* Reset attribute */ + cl = ld_clust(fs, dj.dir); /* Get cluster chain */ + st_clust(fs, dj.dir, 0); /* Reset file allocation info */ + st_dword(dj.dir + DIR_FileSize, 0); + fs->wflag = 1; + + if (cl) { /* Remove the cluster chain if exist */ + dw = fs->winsect; + res = remove_chain(&dj.obj, cl, 0); + if (res == FR_OK) { + res = move_window(fs, dw); + fs->last_clst = cl - 1; /* Reuse the cluster hole */ + } + } + } + } + } + else { /* Open an existing file */ + if (res == FR_OK) { /* Following succeeded */ + if (dj.obj.attr & AM_DIR) { /* It is a directory */ + res = FR_NO_FILE; + } else { + if ((mode & FA_WRITE) && (dj.obj.attr & AM_RDO)) { /* R/O violation */ + res = FR_DENIED; + } + } + } + } + if (res == FR_OK) { + if (mode & FA_CREATE_ALWAYS) /* Set file change flag if created or overwritten */ + mode |= FA_MODIFIED; + fp->dir_sect = fs->winsect; /* Pointer to the directory entry */ + fp->dir_ptr = dj.dir; +#if _FS_LOCK != 0 + fp->obj.lockid = inc_lock(&dj, (mode & ~FA_READ) ? 1 : 0); + if (!fp->obj.lockid) res = FR_INT_ERR; +#endif + } +#else /* R/O configuration */ + if (res == FR_OK) { + if (dj.fn[NSFLAG] & NS_NONAME) { /* Origin directory itself? */ + res = FR_INVALID_NAME; + } else { + if (dj.obj.attr & AM_DIR) { /* It is a directory */ + res = FR_NO_FILE; + } + } + } +#endif + + if (res == FR_OK) { +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fp->obj.sclust = ld_dword(fs->dirbuf + XDIR_FstClus); /* Get allocation info */ + fp->obj.objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + fp->obj.stat = fs->dirbuf[XDIR_GenFlags] & 2; + fp->obj.c_scl = dj.obj.sclust; + fp->obj.c_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fp->obj.c_ofs = dj.blk_ofs; + } else +#endif + { + fp->obj.sclust = ld_clust(fs, dj.dir); /* Get allocation info */ + fp->obj.objsize = ld_dword(dj.dir + DIR_FileSize); + } +#if _USE_FASTSEEK + fp->cltbl = 0; /* Disable fast seek mode */ +#endif + fp->obj.fs = fs; /* Validate the file object */ + fp->obj.id = fs->id; + fp->flag = mode; /* Set file access mode */ + fp->err = 0; /* Clear error flag */ + fp->sect = 0; /* Invalidate current data sector */ + fp->fptr = 0; /* Set file pointer top of the file */ +#if !_FS_READONLY +#if !_FS_TINY + mem_set(fp->buf, 0, _MAX_SS); /* Clear sector buffer */ +#endif + if ((mode & FA_SEEKEND) && fp->obj.objsize > 0) { /* Seek to end of file if FA_OPEN_APPEND is specified */ + fp->fptr = fp->obj.objsize; /* Offset to seek */ + bcs = (DWORD)fs->csize * SS(fs); /* Cluster size in byte */ + clst = fp->obj.sclust; /* Follow the cluster chain */ + for (ofs = fp->obj.objsize; res == FR_OK && ofs > bcs; ofs -= bcs) { + clst = get_fat(&fp->obj, clst); + if (clst <= 1) res = FR_INT_ERR; + if (clst == 0xFFFFFFFF) res = FR_DISK_ERR; + } + fp->clust = clst; + if (res == FR_OK && ofs % SS(fs)) { /* Fill sector buffer if not on the sector boundary */ + if ((sc = clust2sect(fs, clst)) == 0) { + res = FR_INT_ERR; + } else { + fp->sect = sc + (DWORD)(ofs / SS(fs)); +#if !_FS_TINY + if (disk_read(fs->drv, fp->buf, fp->sect, 1) != RES_OK) res = FR_DISK_ERR; +#endif + } + } + } +#endif + } + + FREE_NAMBUF(); + } + + if (res != FR_OK) fp->obj.fs = 0; /* Invalidate file object on error */ + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_read ( + FIL* fp, /* Pointer to the file object */ + void* buff, /* Pointer to data buffer */ + UINT btr, /* Number of bytes to read */ + UINT* br /* Pointer to number of bytes read */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + FSIZE_t remain; + UINT rcnt, cc, csect; + BYTE *rbuff = (BYTE*)buff; + + + *br = 0; /* Clear read byte counter */ + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + remain = fp->obj.objsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr; /* Repeat until all data read */ + rbuff += rcnt, fp->fptr += rcnt, *br += rcnt, btr -= rcnt) { + if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); /* Sector offset in the cluster */ + if (csect == 0) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->obj.sclust; /* Follow cluster chain from the origin */ + } else { /* Middle or end of the file */ +#if _USE_FASTSEEK + if (fp->cltbl) { + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + } else +#endif + { + clst = get_fat(&fp->obj, fp->clust); /* Follow cluster chain on the FAT */ + } + } + if (clst < 2) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + sect = clust2sect(fs, fp->clust); /* Get current sector */ + if (!sect) ABORT(fs, FR_INT_ERR); + sect += csect; + cc = btr / SS(fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Read maximum contiguous sectors directly */ + if (csect + cc > fs->csize) { /* Clip at cluster boundary */ + cc = fs->csize - csect; + } + if (disk_read(fs->drv, rbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR); +#if !_FS_READONLY && _FS_MINIMIZE <= 2 /* Replace one of the read sectors with cached data if it contains a dirty sector */ +#if _FS_TINY + if (fs->wflag && fs->winsect - sect < cc) { + mem_cpy(rbuff + ((fs->winsect - sect) * SS(fs)), fs->win, SS(fs)); + } +#else + if ((fp->flag & FA_DIRTY) && fp->sect - sect < cc) { + mem_cpy(rbuff + ((fp->sect - sect) * SS(fs)), fp->buf, SS(fs)); + } +#endif +#endif + rcnt = SS(fs) * cc; /* Number of bytes transferred */ + continue; + } +#if !_FS_TINY + if (fp->sect != sect) { /* Load data sector if not in cache */ +#if !_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->drv, fp->buf, sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); /* Fill sector cache */ + } +#endif + fp->sect = sect; + } + rcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes left in the sector */ + if (rcnt > btr) rcnt = btr; /* Clip it by btr if needed */ +#if _FS_TINY + if (move_window(fs, fp->sect) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Move sector window */ + mem_cpy(rbuff, fs->win + fp->fptr % SS(fs), rcnt); /* Extract partial sector */ +#else + mem_cpy(rbuff, fp->buf + fp->fptr % SS(fs), rcnt); /* Extract partial sector */ +#endif + } + + LEAVE_FF(fs, FR_OK); +} + + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Write File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_write ( + FIL* fp, /* Pointer to the file object */ + const void* buff, /* Pointer to the data to be written */ + UINT btw, /* Number of bytes to write */ + UINT* bw /* Pointer to number of bytes written */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + UINT wcnt, cc, csect; + const BYTE *wbuff = (const BYTE*)buff; + + + *bw = 0; /* Clear write byte counter */ + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + /* Check fptr wrap-around (file size cannot reach 4GiB on FATxx) */ + if ((!_FS_EXFAT || fs->fs_type != FS_EXFAT) && (DWORD)(fp->fptr + btw) < (DWORD)fp->fptr) { + btw = (UINT)(0xFFFFFFFF - (DWORD)fp->fptr); + } + + for ( ; btw; /* Repeat until all data written */ + wbuff += wcnt, fp->fptr += wcnt, fp->obj.objsize = (fp->fptr > fp->obj.objsize) ? fp->fptr : fp->obj.objsize, *bw += wcnt, btw -= wcnt) { + if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ + csect = (UINT)(fp->fptr / SS(fs)) & (fs->csize - 1); /* Sector offset in the cluster */ + if (csect == 0) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->obj.sclust; /* Follow from the origin */ + if (clst == 0) { /* If no cluster is allocated, */ + clst = create_chain(&fp->obj, 0); /* create a new cluster chain */ + } + } else { /* On the middle or end of the file */ +#if _USE_FASTSEEK + if (fp->cltbl) { + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + } else +#endif + { + clst = create_chain(&fp->obj, fp->clust); /* Follow or stretch cluster chain on the FAT */ + } + } + if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ + if (clst == 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + if (fp->obj.sclust == 0) fp->obj.sclust = clst; /* Set start cluster if the first write */ + } +#if _FS_TINY + if (fs->winsect == fp->sect && sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Write-back sector cache */ +#else + if (fp->flag & FA_DIRTY) { /* Write-back sector cache */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + sect = clust2sect(fs, fp->clust); /* Get current sector */ + if (!sect) ABORT(fs, FR_INT_ERR); + sect += csect; + cc = btw / SS(fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Write maximum contiguous sectors directly */ + if (csect + cc > fs->csize) { /* Clip at cluster boundary */ + cc = fs->csize - csect; + } + if (disk_write(fs->drv, wbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR); +#if _FS_MINIMIZE <= 2 +#if _FS_TINY + if (fs->winsect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + mem_cpy(fs->win, wbuff + ((fs->winsect - sect) * SS(fs)), SS(fs)); + fs->wflag = 0; + } +#else + if (fp->sect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + mem_cpy(fp->buf, wbuff + ((fp->sect - sect) * SS(fs)), SS(fs)); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif +#endif + wcnt = SS(fs) * cc; /* Number of bytes transferred */ + continue; + } +#if _FS_TINY + if (fp->fptr >= fp->obj.objsize) { /* Avoid silly cache filling on the growing edge */ + if (sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR); + fs->winsect = sect; + } +#else + if (fp->sect != sect && /* Fill sector cache with file data */ + fp->fptr < fp->obj.objsize && + disk_read(fs->drv, fp->buf, sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } +#endif + fp->sect = sect; + } + wcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes left in the sector */ + if (wcnt > btw) wcnt = btw; /* Clip it by btw if needed */ +#if _FS_TINY + if (move_window(fs, fp->sect) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Move sector window */ + mem_cpy(fs->win + fp->fptr % SS(fs), wbuff, wcnt); /* Fit data to the sector */ + fs->wflag = 1; +#else + mem_cpy(fp->buf + fp->fptr % SS(fs), wbuff, wcnt); /* Fit data to the sector */ + fp->flag |= FA_DIRTY; +#endif + } + + fp->flag |= FA_MODIFIED; /* Set file change flag */ + + LEAVE_FF(fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize the File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_sync ( + FIL* fp /* Pointer to the file object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD tm; + BYTE *dir; + DEF_NAMBUF + + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res == FR_OK) { + if (fp->flag & FA_MODIFIED) { /* Is there any change to the file? */ +#if !_FS_TINY + if (fp->flag & FA_DIRTY) { /* Write-back cached data if needed */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) LEAVE_FF(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + /* Update the directory entry */ + tm = GET_FATTIME(); /* Modified time */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + res = fill_fat_chain(&fp->obj); /* Create FAT chain if needed */ + if (res == FR_OK) { + DIR dj; + + INIT_NAMBUF(fs); + res = load_obj_dir(&dj, &fp->obj); /* Load directory entry block */ + if (res == FR_OK) { + fs->dirbuf[XDIR_Attr] |= AM_ARC; /* Set archive bit */ + fs->dirbuf[XDIR_GenFlags] = fp->obj.stat | 1; /* Update file allocation info */ + st_dword(fs->dirbuf + XDIR_FstClus, fp->obj.sclust); + st_qword(fs->dirbuf + XDIR_FileSize, fp->obj.objsize); + st_qword(fs->dirbuf + XDIR_ValidFileSize, fp->obj.objsize); + st_dword(fs->dirbuf + XDIR_ModTime, tm); /* Update modified time */ + fs->dirbuf[XDIR_ModTime10] = 0; + st_dword(fs->dirbuf + XDIR_AccTime, 0); + res = store_xdir(&dj); /* Restore it to the directory */ + if (res == FR_OK) { + res = sync_fs(fs); + fp->flag &= (BYTE)~FA_MODIFIED; + } + } + FREE_NAMBUF(); + } + } else +#endif + { + res = move_window(fs, fp->dir_sect); + if (res == FR_OK) { + dir = fp->dir_ptr; + dir[DIR_Attr] |= AM_ARC; /* Set archive bit */ + st_clust(fp->obj.fs, dir, fp->obj.sclust); /* Update file allocation info */ + st_dword(dir + DIR_FileSize, (DWORD)fp->obj.objsize); /* Update file size */ + st_dword(dir + DIR_ModTime, tm); /* Update modified time */ + st_word(dir + DIR_LstAccDate, 0); + fs->wflag = 1; + res = sync_fs(fs); /* Restore it to the directory */ + fp->flag &= (BYTE)~FA_MODIFIED; + } + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Close File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_close ( + FIL* fp /* Pointer to the file object to be closed */ +) +{ + FRESULT res; + FATFS *fs; + +#if !_FS_READONLY + res = f_sync(fp); /* Flush cached data */ + if (res == FR_OK) +#endif + { + res = validate(&fp->obj, &fs); /* Lock volume */ + if (res == FR_OK) { +#if _FS_LOCK != 0 + res = dec_lock(fp->obj.lockid); /* Decrement file open counter */ + if (res == FR_OK) +#endif + { + fp->obj.fs = 0; /* Invalidate file object */ + } +#if _FS_REENTRANT + unlock_fs(fs, FR_OK); /* Unlock volume */ +#endif + } + } + return res; +} + + + + +#if _FS_RPATH >= 1 +/*-----------------------------------------------------------------------*/ +/* Change Current Directory or Current Drive, Get Current Directory */ +/*-----------------------------------------------------------------------*/ + +#if _VOLUMES >= 2 +FRESULT f_chdrive ( + const TCHAR* path /* Drive number */ +) +{ + int vol; + + + /* Get logical drive number */ + vol = get_ldnumber(&path); + if (vol < 0) return FR_INVALID_DRIVE; + + CurrVol = (BYTE)vol; /* Set it as current volume */ + + return FR_OK; +} +#endif + + +FRESULT f_chdir ( + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF + + /* Get logical drive */ + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.fn[NSFLAG] & NS_NONAME) { + fs->cdir = dj.obj.sclust; /* It is the start directory itself */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->cdc_scl = dj.obj.c_scl; + fs->cdc_size = dj.obj.c_size; + fs->cdc_ofs = dj.obj.c_ofs; + } +#endif + } else { + if (dj.obj.attr & AM_DIR) { /* It is a sub-directory */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->cdir = ld_dword(fs->dirbuf + XDIR_FstClus); /* Sub-directory cluster */ + fs->cdc_scl = dj.obj.sclust; /* Save containing directory information */ + fs->cdc_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fs->cdc_ofs = dj.blk_ofs; + } else +#endif + { + fs->cdir = ld_clust(fs, dj.dir); /* Sub-directory cluster */ + } + } else { + res = FR_NO_PATH; /* Reached but a file */ + } + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + + LEAVE_FF(fs, res); +} + + +#if _FS_RPATH >= 2 +FRESULT f_getcwd ( + TCHAR* buff, /* Pointer to the directory path */ + UINT len /* Size of path */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + UINT i, n; + DWORD ccl; + TCHAR *tp; + FILINFO fno; + DEF_NAMBUF + + + *buff = 0; + /* Get logical drive */ + res = find_volume((const TCHAR**)&buff, &fs, 0); /* Get current volume */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + i = len; /* Bottom of buffer (directory stack base) */ + if (!_FS_EXFAT || fs->fs_type != FS_EXFAT) { /* (Cannot do getcwd on exFAT and returns root path) */ + dj.obj.sclust = fs->cdir; /* Start to follow upper directory from current directory */ + while ((ccl = dj.obj.sclust) != 0) { /* Repeat while current directory is a sub-directory */ + res = dir_sdi(&dj, 1 * SZDIRE); /* Get parent directory */ + if (res != FR_OK) break; + res = move_window(fs, dj.sect); + if (res != FR_OK) break; + dj.obj.sclust = ld_clust(fs, dj.dir); /* Goto parent directory */ + res = dir_sdi(&dj, 0); + if (res != FR_OK) break; + do { /* Find the entry links to the child directory */ + res = dir_read(&dj, 0); + if (res != FR_OK) break; + if (ccl == ld_clust(fs, dj.dir)) break; /* Found the entry */ + res = dir_next(&dj, 0); + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR;/* It cannot be 'not found'. */ + if (res != FR_OK) break; + get_fileinfo(&dj, &fno); /* Get the directory name and push it to the buffer */ + for (n = 0; fno.fname[n]; n++) ; + if (i < n + 3) { + res = FR_NOT_ENOUGH_CORE; break; + } + while (n) buff[--i] = fno.fname[--n]; + buff[--i] = '/'; + } + } + tp = buff; + if (res == FR_OK) { +#if _VOLUMES >= 2 + *tp++ = '0' + CurrVol; /* Put drive number */ + *tp++ = ':'; +#endif + if (i == len) { /* Root-directory */ + *tp++ = '/'; + } else { /* Sub-directroy */ + do /* Add stacked path str */ + *tp++ = buff[i++]; + while (i < len); + } + } + *tp = 0; + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +#endif /* _FS_RPATH >= 2 */ +#endif /* _FS_RPATH >= 1 */ + + + +#if _FS_MINIMIZE <= 2 +/*-----------------------------------------------------------------------*/ +/* Seek File R/W Pointer */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_lseek ( + FIL* fp, /* Pointer to the file object */ + FSIZE_t ofs /* File pointer from top of file */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, bcs, nsect; + FSIZE_t ifptr; +#if _USE_FASTSEEK + DWORD cl, pcl, ncl, tcl, dsc, tlen, ulen, *tbl; +#endif + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ +#if _USE_FASTSEEK + if (fp->cltbl) { /* Fast seek */ + if (ofs == CREATE_LINKMAP) { /* Create CLMT */ + tbl = fp->cltbl; + tlen = *tbl++; ulen = 2; /* Given table size and required table size */ + cl = fp->obj.sclust; /* Origin of the chain */ + if (cl) { + do { + /* Get a fragment */ + tcl = cl; ncl = 0; ulen += 2; /* Top, length and used items */ + do { + pcl = cl; ncl++; + cl = get_fat(&fp->obj, cl); + if (cl <= 1) ABORT(fs, FR_INT_ERR); + if (cl == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + } while (cl == pcl + 1); + if (ulen <= tlen) { /* Store the length and top of the fragment */ + *tbl++ = ncl; *tbl++ = tcl; + } + } while (cl < fs->n_fatent); /* Repeat until end of chain */ + } + *fp->cltbl = ulen; /* Number of items used */ + if (ulen <= tlen) { + *tbl = 0; /* Terminate table */ + } else { + res = FR_NOT_ENOUGH_CORE; /* Given table size is smaller than required */ + } + } else { /* Fast seek */ + if (ofs > fp->obj.objsize) ofs = fp->obj.objsize; /* Clip offset at the file size */ + fp->fptr = ofs; /* Set file pointer */ + if (ofs) { + fp->clust = clmt_clust(fp, ofs - 1); + dsc = clust2sect(fs, fp->clust); + if (!dsc) ABORT(fs, FR_INT_ERR); + dsc += (DWORD)((ofs - 1) / SS(fs)) & (fs->csize - 1); + if (fp->fptr % SS(fs) && dsc != fp->sect) { /* Refill sector cache if needed */ +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->drv, fp->buf, dsc, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); /* Load current sector */ +#endif + fp->sect = dsc; + } + } + } + } else +#endif + + /* Normal Seek */ + { +#if _FS_EXFAT + if (fs->fs_type != FS_EXFAT && ofs >= 0x100000000) ofs = 0xFFFFFFFF; /* Clip at 4GiB-1 if at FATxx */ +#endif + if (ofs > fp->obj.objsize && (_FS_READONLY || !(fp->flag & FA_WRITE))) { /* In read-only mode, clip offset with the file size */ + ofs = fp->obj.objsize; + } + ifptr = fp->fptr; + fp->fptr = nsect = 0; + if (ofs) { + bcs = (DWORD)fs->csize * SS(fs); /* Cluster size (byte) */ + if (ifptr > 0 && + (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ + fp->fptr = (ifptr - 1) & ~(FSIZE_t)(bcs - 1); /* start from the current cluster */ + ofs -= fp->fptr; + clst = fp->clust; + } else { /* When seek to back cluster, */ + clst = fp->obj.sclust; /* start from the first cluster */ +#if !_FS_READONLY + if (clst == 0) { /* If no cluster chain, create a new chain */ + clst = create_chain(&fp->obj, 0); + if (clst == 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->obj.sclust = clst; + } +#endif + fp->clust = clst; + } + if (clst != 0) { + while (ofs > bcs) { /* Cluster following loop */ + ofs -= bcs; fp->fptr += bcs; +#if !_FS_READONLY + if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ + if (_FS_EXFAT && fp->fptr > fp->obj.objsize) { /* No FAT chain object needs correct objsize to generate FAT value */ + fp->obj.objsize = fp->fptr; + fp->flag |= FA_MODIFIED; + } + clst = create_chain(&fp->obj, clst); /* Follow chain with forceed stretch */ + if (clst == 0) { /* Clip file size in case of disk full */ + ofs = 0; break; + } + } else +#endif + { + clst = get_fat(&fp->obj, clst); /* Follow cluster chain if not in write mode */ + } + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + if (clst <= 1 || clst >= fs->n_fatent) ABORT(fs, FR_INT_ERR); + fp->clust = clst; + } + fp->fptr += ofs; + if (ofs % SS(fs)) { + nsect = clust2sect(fs, clst); /* Current sector */ + if (!nsect) ABORT(fs, FR_INT_ERR); + nsect += (DWORD)(ofs / SS(fs)); + } + } + } + if (!_FS_READONLY && fp->fptr > fp->obj.objsize) { /* Set file change flag if the file size is extended */ + fp->obj.objsize = fp->fptr; + fp->flag |= FA_MODIFIED; + } + if (fp->fptr % SS(fs) && nsect != fp->sect) { /* Fill sector cache if needed */ +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->drv, fp->buf, nsect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); /* Fill sector cache */ +#endif + fp->sect = nsect; + } + } + + LEAVE_FF(fs, res); +} + + + +#if _FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Create a Directory Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_opendir ( + DIR* dp, /* Pointer to directory object to create */ + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + FATFS *fs; + _FDID *obj; + DEF_NAMBUF + + + if (!dp) return FR_INVALID_OBJECT; + + /* Get logical drive */ + obj = &dp->obj; + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + obj->fs = fs; + INIT_NAMBUF(fs); + res = follow_path(dp, path); /* Follow the path to the directory */ + if (res == FR_OK) { /* Follow completed */ + if (!(dp->fn[NSFLAG] & NS_NONAME)) { /* It is not the origin directory itself */ + if (obj->attr & AM_DIR) { /* This object is a sub-directory */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + obj->c_scl = obj->sclust; /* Save containing directory inforamation */ + obj->c_size = ((DWORD)obj->objsize & 0xFFFFFF00) | obj->stat; + obj->c_ofs = dp->blk_ofs; + obj->sclust = ld_dword(fs->dirbuf + XDIR_FstClus); /* Get object location and status */ + obj->objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + obj->stat = fs->dirbuf[XDIR_GenFlags] & 2; + } else +#endif + { + obj->sclust = ld_clust(fs, dp->dir); /* Get object location */ + } + } else { /* This object is a file */ + res = FR_NO_PATH; + } + } + if (res == FR_OK) { + obj->id = fs->id; + res = dir_sdi(dp, 0); /* Rewind directory */ +#if _FS_LOCK != 0 + if (res == FR_OK) { + if (obj->sclust) { + obj->lockid = inc_lock(dp, 0); /* Lock the sub directory */ + if (!obj->lockid) res = FR_TOO_MANY_OPEN_FILES; + } else { + obj->lockid = 0; /* Root directory need not to be locked */ + } + } +#endif + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + if (res != FR_OK) obj->fs = 0; /* Invalidate the directory object if function faild */ + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Close Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_closedir ( + DIR *dp /* Pointer to the directory object to be closed */ +) +{ + FRESULT res; + FATFS *fs; + + + res = validate(&dp->obj, &fs); /* Check validity of the file object */ + if (res == FR_OK) { +#if _FS_LOCK != 0 + if (dp->obj.lockid) { /* Decrement sub-directory open counter */ + res = dec_lock(dp->obj.lockid); + } + if (res == FR_OK) +#endif + { + dp->obj.fs = 0; /* Invalidate directory object */ + } +#if _FS_REENTRANT + unlock_fs(fs, FR_OK); /* Unlock volume */ +#endif + } + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read Directory Entries in Sequence */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_readdir ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to file information to return */ +) +{ + FRESULT res; + FATFS *fs; + DEF_NAMBUF + + + res = validate(&dp->obj, &fs); /* Check validity of the directory object */ + if (res == FR_OK) { + if (!fno) { + res = dir_sdi(dp, 0); /* Rewind the directory object */ + } else { + INIT_NAMBUF(fs); + res = dir_read(dp, 0); /* Read an item */ + if (res == FR_NO_FILE) res = FR_OK; /* Ignore end of directory */ + if (res == FR_OK) { /* A valid entry is found */ + get_fileinfo(dp, fno); /* Get the object information */ + res = dir_next(dp, 0); /* Increment index for next */ + if (res == FR_NO_FILE) res = FR_OK; /* Ignore end of directory now */ + } + FREE_NAMBUF(); + } + } + LEAVE_FF(fs, res); +} + + + +#if _USE_FIND +/*-----------------------------------------------------------------------*/ +/* Find Next File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findnext ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to the file information structure */ +) +{ + FRESULT res; + + + for (;;) { + res = f_readdir(dp, fno); /* Get a directory item */ + if (res != FR_OK || !fno || !fno->fname[0]) break; /* Terminate if any error or end of directory */ + if (pattern_matching(dp->pat, fno->fname, 0, 0)) break; /* Test for the file name */ +#if _USE_LFN != 0 && _USE_FIND == 2 + if (pattern_matching(dp->pat, fno->altname, 0, 0)) break; /* Test for alternative name if exist */ +#endif + } + return res; +} + + + +/*-----------------------------------------------------------------------*/ +/* Find First File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findfirst ( + DIR* dp, /* Pointer to the blank directory object */ + FILINFO* fno, /* Pointer to the file information structure */ + const TCHAR* path, /* Pointer to the directory to open */ + const TCHAR* pattern /* Pointer to the matching pattern */ +) +{ + FRESULT res; + + + dp->pat = pattern; /* Save pointer to pattern string */ + res = f_opendir(dp, path); /* Open the target directory */ + if (res == FR_OK) { + res = f_findnext(dp, fno); /* Find the first item */ + } + return res; +} + +#endif /* _USE_FIND */ + + + +#if _FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Get File Status */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_stat ( + const TCHAR* path, /* Pointer to the file path */ + FILINFO* fno /* Pointer to file information to return */ +) +{ + FRESULT res; + DIR dj; + DEF_NAMBUF + + + /* Get logical drive */ + res = find_volume(&path, &dj.obj.fs, 0); + if (res == FR_OK) { + INIT_NAMBUF(dj.obj.fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.fn[NSFLAG] & NS_NONAME) { /* It is origin directory */ + res = FR_INVALID_NAME; + } else { /* Found an object */ + if (fno) get_fileinfo(&dj, fno); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(dj.obj.fs, res); +} + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Get Number of Free Clusters */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getfree ( + const TCHAR* path, /* Path name of the logical drive number */ + DWORD* nclst, /* Pointer to a variable to return number of free clusters */ + FATFS** fatfs /* Pointer to return pointer to corresponding file system object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD nfree, clst, sect, stat; + UINT i; + BYTE *p; + _FDID obj; + + + /* Get logical drive */ + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + *fatfs = fs; /* Return ptr to the fs object */ + /* If free_clst is valid, return it without full cluster scan */ + if (fs->free_clst <= fs->n_fatent - 2) { + *nclst = fs->free_clst; + } else { + /* Get number of free clusters */ + nfree = 0; + if (fs->fs_type == FS_FAT12) { /* FAT12: Sector unalighed FAT entries */ + clst = 2; obj.fs = fs; + do { + stat = get_fat(&obj, clst); + if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (stat == 1) { res = FR_INT_ERR; break; } + if (stat == 0) nfree++; + } while (++clst < fs->n_fatent); + } else { +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* exFAT: Scan bitmap table */ + BYTE bm; + UINT b; + + clst = fs->n_fatent - 2; + sect = fs->database; + i = 0; + do { + if (i == 0 && (res = move_window(fs, sect++)) != FR_OK) break; + for (b = 8, bm = fs->win[i]; b && clst; b--, clst--) { + if (!(bm & 1)) nfree++; + bm >>= 1; + } + i = (i + 1) % SS(fs); + } while (clst); + } else +#endif + { /* FAT16/32: Sector alighed FAT entries */ + clst = fs->n_fatent; sect = fs->fatbase; + i = 0; p = 0; + do { + if (i == 0) { + res = move_window(fs, sect++); + if (res != FR_OK) break; + p = fs->win; + i = SS(fs); + } + if (fs->fs_type == FS_FAT16) { + if (ld_word(p) == 0) nfree++; + p += 2; i -= 2; + } else { + if ((ld_dword(p) & 0x0FFFFFFF) == 0) nfree++; + p += 4; i -= 4; + } + } while (--clst); + } + } + *nclst = nfree; /* Return the free clusters */ + fs->free_clst = nfree; /* Now free_clst is valid */ + fs->fsi_flag |= 1; /* FSInfo is to be updated */ + } + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Truncate File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_truncate ( + FIL* fp /* Pointer to the file object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD ncl; + + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); + if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + if (fp->obj.objsize > fp->fptr) { + if (fp->fptr == 0) { /* When set file size to zero, remove entire cluster chain */ + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + fp->obj.sclust = 0; + } else { /* When truncate a part of the file, remove remaining clusters */ + ncl = get_fat(&fp->obj, fp->clust); + res = FR_OK; + if (ncl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (ncl == 1) res = FR_INT_ERR; + if (res == FR_OK && ncl < fs->n_fatent) { + res = remove_chain(&fp->obj, ncl, fp->clust); + } + } + fp->obj.objsize = fp->fptr; /* Set file size to current R/W point */ + fp->flag |= FA_MODIFIED; +#if !_FS_TINY + if (res == FR_OK && (fp->flag & FA_DIRTY)) { + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) { + res = FR_DISK_ERR; + } else { + fp->flag &= (BYTE)~FA_DIRTY; + } + } +#endif + if (res != FR_OK) ABORT(fs, res); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Delete a File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_unlink ( + const TCHAR* path /* Pointer to the file or directory path */ +) +{ + FRESULT res; + DIR dj, sdj; + DWORD dclst = 0; + FATFS *fs; +#if _FS_EXFAT + _FDID obj; +#endif + DEF_NAMBUF + + + /* Get logical drive */ + res = find_volume(&path, &fs, FA_WRITE); + dj.obj.fs = fs; + if (res == FR_OK) { + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (_FS_RPATH && res == FR_OK && (dj.fn[NSFLAG] & NS_DOT)) { + res = FR_INVALID_NAME; /* Cannot remove dot entry */ + } +#if _FS_LOCK != 0 + if (res == FR_OK) res = chk_lock(&dj, 2); /* Check if it is an open object */ +#endif + if (res == FR_OK) { /* The object is accessible */ + if (dj.fn[NSFLAG] & NS_NONAME) { + res = FR_INVALID_NAME; /* Cannot remove the origin directory */ + } else { + if (dj.obj.attr & AM_RDO) { + res = FR_DENIED; /* Cannot remove R/O object */ + } + } + if (res == FR_OK) { +#if _FS_EXFAT + obj.fs = fs; + if (fs->fs_type == FS_EXFAT) { + obj.sclust = dclst = ld_dword(fs->dirbuf + XDIR_FstClus); + obj.objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + obj.stat = fs->dirbuf[XDIR_GenFlags] & 2; + } else +#endif + { + dclst = ld_clust(fs, dj.dir); + } + if (dj.obj.attr & AM_DIR) { /* Is it a sub-directory ? */ +#if _FS_RPATH != 0 + if (dclst == fs->cdir) { /* Is it the current directory? */ + res = FR_DENIED; + } else +#endif + { + sdj.obj.fs = fs; /* Open the sub-directory */ + sdj.obj.sclust = dclst; +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + sdj.obj.objsize = obj.objsize; + sdj.obj.stat = obj.stat; + } +#endif + res = dir_sdi(&sdj, 0); + if (res == FR_OK) { + res = dir_read(&sdj, 0); /* Read an item */ + if (res == FR_OK) res = FR_DENIED; /* Not empty? */ + if (res == FR_NO_FILE) res = FR_OK; /* Empty? */ + } + } + } + } + if (res == FR_OK) { + res = dir_remove(&dj); /* Remove the directory entry */ + if (res == FR_OK && dclst) { /* Remove the cluster chain if exist */ +#if _FS_EXFAT + res = remove_chain(&obj, dclst, 0); +#else + res = remove_chain(&dj.obj, dclst, 0); +#endif + } + if (res == FR_OK) res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create a Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkdir ( + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + BYTE *dir; + UINT n; + DWORD dsc, dcl, pcl, tm; + DEF_NAMBUF + + + /* Get logical drive */ + res = find_volume(&path, &fs, FA_WRITE); + dj.obj.fs = fs; + if (res == FR_OK) { + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) res = FR_EXIST; /* Any object with same name is already existing */ + if (_FS_RPATH && res == FR_NO_FILE && (dj.fn[NSFLAG] & NS_DOT)) { + res = FR_INVALID_NAME; + } + if (res == FR_NO_FILE) { /* Can create a new directory */ + dcl = create_chain(&dj.obj, 0); /* Allocate a cluster for the new directory table */ + dj.obj.objsize = (DWORD)fs->csize * SS(fs); + res = FR_OK; + if (dcl == 0) res = FR_DENIED; /* No space to allocate a new cluster */ + if (dcl == 1) res = FR_INT_ERR; + if (dcl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) res = sync_window(fs); /* Flush FAT */ + tm = GET_FATTIME(); + if (res == FR_OK) { /* Initialize the new directory table */ + dsc = clust2sect(fs, dcl); + dir = fs->win; + mem_set(dir, 0, SS(fs)); + if (!_FS_EXFAT || fs->fs_type != FS_EXFAT) { + mem_set(dir + DIR_Name, ' ', 11); /* Create "." entry */ + dir[DIR_Name] = '.'; + dir[DIR_Attr] = AM_DIR; + st_dword(dir + DIR_ModTime, tm); + st_clust(fs, dir, dcl); + mem_cpy(dir + SZDIRE, dir, SZDIRE); /* Create ".." entry */ + dir[SZDIRE + 1] = '.'; pcl = dj.obj.sclust; + if (fs->fs_type == FS_FAT32 && pcl == fs->dirbase) pcl = 0; + st_clust(fs, dir + SZDIRE, pcl); + } + for (n = fs->csize; n; n--) { /* Write dot entries and clear following sectors */ + fs->winsect = dsc++; + fs->wflag = 1; + res = sync_window(fs); + if (res != FR_OK) break; + mem_set(dir, 0, SS(fs)); + } + } + if (res == FR_OK) res = dir_register(&dj); /* Register the object to the directoy */ + if (res == FR_OK) { +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* Initialize directory entry block */ + st_dword(fs->dirbuf + XDIR_ModTime, tm); /* Created time */ + st_dword(fs->dirbuf + XDIR_FstClus, dcl); /* Table start cluster */ + st_dword(fs->dirbuf + XDIR_FileSize, (DWORD)dj.obj.objsize); /* File size needs to be valid */ + st_dword(fs->dirbuf + XDIR_ValidFileSize, (DWORD)dj.obj.objsize); + fs->dirbuf[XDIR_GenFlags] = 3; /* Initialize the object flag (contiguous) */ + fs->dirbuf[XDIR_Attr] = AM_DIR; /* Attribute */ + res = store_xdir(&dj); + } else +#endif + { + dir = dj.dir; + st_dword(dir + DIR_ModTime, tm); /* Created time */ + st_clust(fs, dir, dcl); /* Table start cluster */ + dir[DIR_Attr] = AM_DIR; /* Attribute */ + fs->wflag = 1; + } + if (res == FR_OK) res = sync_fs(fs); + } else { + remove_chain(&dj.obj, dcl, 0); /* Could not register, remove cluster chain */ + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Rename a File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_rename ( + const TCHAR* path_old, /* Pointer to the object name to be renamed */ + const TCHAR* path_new /* Pointer to the new name */ +) +{ + FRESULT res; + DIR djo, djn; + FATFS *fs; + BYTE buf[_FS_EXFAT ? SZDIRE * 2 : 24], *dir; + DWORD dw; + DEF_NAMBUF + + + get_ldnumber(&path_new); /* Ignore drive number of new name */ + res = find_volume(&path_old, &fs, FA_WRITE); /* Get logical drive of the old object */ + if (res == FR_OK) { + djo.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&djo, path_old); /* Check old object */ + if (res == FR_OK && (djo.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check validity of name */ +#if _FS_LOCK != 0 + if (res == FR_OK) res = chk_lock(&djo, 2); +#endif + if (res == FR_OK) { /* Object to be renamed is found */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At exFAT */ + BYTE nf, nn; + WORD nh; + + mem_cpy(buf, fs->dirbuf, SZDIRE * 2); /* Save 85+C0 entry of old object */ + mem_cpy(&djn, &djo, sizeof djo); + res = follow_path(&djn, path_new); /* Make sure if new object name is not in use */ + if (res == FR_OK) { /* Is new name already in use by any other object? */ + res = (djn.obj.sclust == djo.obj.sclust && djn.dptr == djo.dptr) ? FR_NO_FILE : FR_EXIST; + } + if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + nf = fs->dirbuf[XDIR_NumSec]; nn = fs->dirbuf[XDIR_NumName]; + nh = ld_word(fs->dirbuf + XDIR_NameHash); + mem_cpy(fs->dirbuf, buf, SZDIRE * 2); + fs->dirbuf[XDIR_NumSec] = nf; fs->dirbuf[XDIR_NumName] = nn; + st_word(fs->dirbuf + XDIR_NameHash, nh); +/* Start of critical section where any interruption can cause a cross-link */ + res = store_xdir(&djn); + } + } + } else +#endif + { /* At FAT12/FAT16/FAT32 */ + mem_cpy(buf, djo.dir + DIR_Attr, 21); /* Save information about the object except name */ + mem_cpy(&djn, &djo, sizeof (DIR)); /* Duplicate the directory object */ + res = follow_path(&djn, path_new); /* Make sure if new object name is not in use */ + if (res == FR_OK) { /* Is new name already in use by any other object? */ + res = (djn.obj.sclust == djo.obj.sclust && djn.dptr == djo.dptr) ? FR_NO_FILE : FR_EXIST; + } + if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + dir = djn.dir; /* Copy information about object except name */ + mem_cpy(dir + 13, buf + 2, 19); + dir[DIR_Attr] = buf[0] | AM_ARC; + fs->wflag = 1; + if ((dir[DIR_Attr] & AM_DIR) && djo.obj.sclust != djn.obj.sclust) { /* Update .. entry in the sub-directory if needed */ + dw = clust2sect(fs, ld_clust(fs, dir)); + if (!dw) { + res = FR_INT_ERR; + } else { +/* Start of critical section where any interruption can cause a cross-link */ + res = move_window(fs, dw); + dir = fs->win + SZDIRE * 1; /* Ptr to .. entry */ + if (res == FR_OK && dir[1] == '.') { + st_clust(fs, dir, djn.obj.sclust); + fs->wflag = 1; + } + } + } + } + } + } + if (res == FR_OK) { + res = dir_remove(&djo); /* Remove old entry */ + if (res == FR_OK) { + res = sync_fs(fs); + } + } +/* End of critical section */ + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +#endif /* !_FS_READONLY */ +#endif /* _FS_MINIMIZE == 0 */ +#endif /* _FS_MINIMIZE <= 1 */ +#endif /* _FS_MINIMIZE <= 2 */ + + + +#if _USE_CHMOD && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Change Attribute */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chmod ( + const TCHAR* path, /* Pointer to the file path */ + BYTE attr, /* Attribute bits */ + BYTE mask /* Attribute mask to change */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF + + + res = find_volume(&path, &fs, FA_WRITE); /* Get logical drive */ + dj.obj.fs = fs; + if (res == FR_OK) { + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check object validity */ + if (res == FR_OK) { + mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->dirbuf[XDIR_Attr] = (attr & mask) | (fs->dirbuf[XDIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + res = store_xdir(&dj); + } else +#endif + { + dj.dir[DIR_Attr] = (attr & mask) | (dj.dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + fs->wflag = 1; + } + if (res == FR_OK) res = sync_fs(fs); + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Timestamp */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_utime ( + const TCHAR* path, /* Pointer to the file/directory name */ + const FILINFO* fno /* Pointer to the time stamp to be set */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF + + + res = find_volume(&path, &fs, FA_WRITE); /* Get logical drive */ + dj.obj.fs = fs; + if (res == FR_OK) { + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check object validity */ + if (res == FR_OK) { +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + st_dword(fs->dirbuf + XDIR_ModTime, (DWORD)fno->fdate << 16 | fno->ftime); + res = store_xdir(&dj); + } else +#endif + { + st_dword(dj.dir + DIR_ModTime, (DWORD)fno->fdate << 16 | fno->ftime); + fs->wflag = 1; + } + if (res == FR_OK) res = sync_fs(fs); + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +#endif /* _USE_CHMOD && !_FS_READONLY */ + + + +#if _USE_LABEL +/*-----------------------------------------------------------------------*/ +/* Get Volume Label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getlabel ( + const TCHAR* path, /* Path name of the logical drive number */ + TCHAR* label, /* Pointer to a buffer to return the volume label */ + DWORD* vsn /* Pointer to a variable to return the volume serial number */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + UINT si, di; +#if _LFN_UNICODE || _FS_EXFAT + WCHAR w; +#endif + + /* Get logical drive */ + res = find_volume(&path, &fs, 0); + + /* Get volume label */ + if (res == FR_OK && label) { + dj.obj.fs = fs; dj.obj.sclust = 0; /* Open root directory */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = dir_read(&dj, 1); /* Find a volume label entry */ + if (res == FR_OK) { +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + for (si = di = 0; si < dj.dir[XDIR_NumLabel]; si++) { /* Extract volume label from 83 entry */ + w = ld_word(dj.dir + XDIR_Label + si * 2); +#if _LFN_UNICODE + label[di++] = w; +#else + w = ff_convert(w, 0); /* Unicode -> OEM */ + if (w == 0) w = '?'; /* Replace wrong character */ + if (_DF1S && w >= 0x100) label[di++] = (char)(w >> 8); + label[di++] = (char)w; +#endif + } + label[di] = 0; + } else +#endif + { + si = di = 0; /* Extract volume label from AM_VOL entry with code comversion */ + do { +#if _LFN_UNICODE + w = (si < 11) ? dj.dir[si++] : ' '; + if (IsDBCS1(w) && si < 11 && IsDBCS2(dj.dir[si])) { + w = w << 8 | dj.dir[si++]; + } + label[di++] = ff_convert(w, 1); /* OEM -> Unicode */ +#else + label[di++] = dj.dir[si++]; +#endif + } while (di < 11); + do { /* Truncate trailing spaces */ + label[di] = 0; + if (di == 0) break; + } while (label[--di] == ' '); + } + } + } + if (res == FR_NO_FILE) { /* No label entry and return nul string */ + label[0] = 0; + res = FR_OK; + } + } + + /* Get volume serial number */ + if (res == FR_OK && vsn) { + res = move_window(fs, fs->volbase); + if (res == FR_OK) { + switch (fs->fs_type) { + case FS_EXFAT: di = BPB_VolIDEx; break; + case FS_FAT32: di = BS_VolID32; break; + default: di = BS_VolID; + } + *vsn = ld_dword(fs->win + di); + } + } + + LEAVE_FF(fs, res); +} + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Set Volume Label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_setlabel ( + const TCHAR* label /* Pointer to the volume label to set */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + BYTE dirvn[22]; + UINT i, j, slen; + WCHAR w; + static const char badchr[] = "\"*+,.:;<=>\?[]|\x7F"; + + + /* Get logical drive */ + res = find_volume(&label, &fs, FA_WRITE); + if (res != FR_OK) LEAVE_FF(fs, res); + dj.obj.fs = fs; + + /* Get length of given volume label */ + for (slen = 0; (UINT)label[slen] >= ' '; slen++) ; /* Get name length */ + +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + for (i = j = 0; i < slen; ) { /* Create volume label in directory form */ + w = label[i++]; +#if !_LFN_UNICODE + if (IsDBCS1(w)) { + w = (i < slen && IsDBCS2(label[i])) ? w << 8 | (BYTE)label[i++] : 0; + } + w = ff_convert(w, 1); +#endif + if (w == 0 || chk_chr(badchr, w) || j == 22) { /* Check validity check validity of the volume label */ + LEAVE_FF(fs, FR_INVALID_NAME); + } + st_word(dirvn + j, w); j += 2; + } + slen = j; + } else +#endif + { /* On the FAT12/16/32 volume */ + for ( ; slen && label[slen - 1] == ' '; slen--) ; /* Remove trailing spaces */ + if (slen) { /* Is there a volume label to be set? */ + dirvn[0] = 0; i = j = 0; /* Create volume label in directory form */ + do { +#if _LFN_UNICODE + w = ff_convert(ff_wtoupper(label[i++]), 0); +#else + w = (BYTE)label[i++]; + if (IsDBCS1(w)) { + w = (j < 10 && i < slen && IsDBCS2(label[i])) ? w << 8 | (BYTE)label[i++] : 0; + } +#if _USE_LFN != 0 + w = ff_convert(ff_wtoupper(ff_convert(w, 1)), 0); +#else + if (IsLower(w)) w -= 0x20; /* To upper ASCII characters */ +#ifdef _EXCVT + if (w >= 0x80) w = ExCvt[w - 0x80]; /* To upper extended characters (SBCS cfg) */ +#else + if (!_DF1S && w >= 0x80) w = 0; /* Reject extended characters (ASCII cfg) */ +#endif +#endif +#endif + if (w == 0 || chk_chr(badchr, w) || j >= (UINT)((w >= 0x100) ? 10 : 11)) { /* Reject invalid characters for volume label */ + LEAVE_FF(fs, FR_INVALID_NAME); + } + if (w >= 0x100) dirvn[j++] = (BYTE)(w >> 8); + dirvn[j++] = (BYTE)w; + } while (i < slen); + while (j < 11) dirvn[j++] = ' '; /* Fill remaining name field */ + if (dirvn[0] == DDEM) LEAVE_FF(fs, FR_INVALID_NAME); /* Reject illegal name (heading DDEM) */ + } + } + + /* Set volume label */ + dj.obj.sclust = 0; /* Open root directory */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = dir_read(&dj, 1); /* Get volume label entry */ + if (res == FR_OK) { + if (_FS_EXFAT && fs->fs_type == FS_EXFAT) { + dj.dir[XDIR_NumLabel] = (BYTE)(slen / 2); /* Change the volume label */ + mem_cpy(dj.dir + XDIR_Label, dirvn, slen); + } else { + if (slen) { + mem_cpy(dj.dir, dirvn, 11); /* Change the volume label */ + } else { + dj.dir[DIR_Name] = DDEM; /* Remove the volume label */ + } + } + fs->wflag = 1; + res = sync_fs(fs); + } else { /* No volume label entry is found or error */ + if (res == FR_NO_FILE) { + res = FR_OK; + if (slen) { /* Create a volume label entry */ + res = dir_alloc(&dj, 1); /* Allocate an entry */ + if (res == FR_OK) { + mem_set(dj.dir, 0, SZDIRE); /* Clear the entry */ + if (_FS_EXFAT && fs->fs_type == FS_EXFAT) { + dj.dir[XDIR_Type] = 0x83; /* Create 83 entry */ + dj.dir[XDIR_NumLabel] = (BYTE)(slen / 2); + mem_cpy(dj.dir + XDIR_Label, dirvn, slen); + } else { + dj.dir[DIR_Attr] = AM_VOL; /* Create volume label entry */ + mem_cpy(dj.dir, dirvn, 11); + } + fs->wflag = 1; + res = sync_fs(fs); + } + } + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* !_FS_READONLY */ +#endif /* _USE_LABEL */ + + + +#if _USE_EXPAND && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Allocate a Contiguous Blocks to the File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_expand ( + FIL* fp, /* Pointer to the file object */ + FSIZE_t fsz, /* File size to be expanded to */ + BYTE opt /* Operation mode 0:Find and prepare or 1:Find and allocate */ +) +{ + FRESULT res; + FATFS *fs; + DWORD n, clst, stcl, scl, ncl, tcl, lclst; + + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); + if (fsz == 0 || fp->obj.objsize != 0 || !(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); +#if _FS_EXFAT + if (fs->fs_type != FS_EXFAT && fsz >= 0x100000000) LEAVE_FF(fs, FR_DENIED); /* Check if in size limit */ +#endif + n = (DWORD)fs->csize * SS(fs); /* Cluster size */ + tcl = (DWORD)(fsz / n) + ((fsz & (n - 1)) ? 1 : 0); /* Number of clusters required */ + stcl = fs->last_clst; lclst = 0; + if (stcl < 2 || stcl >= fs->n_fatent) stcl = 2; + +#if _FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + scl = find_bitmap(fs, stcl, tcl); /* Find a contiguous cluster block */ + if (scl == 0) res = FR_DENIED; /* No contiguous cluster block was found */ + if (scl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) { + if (opt) { + res = change_bitmap(fs, scl, tcl, 1); /* Mark the cluster block 'in use' */ + lclst = scl + tcl - 1; + } else { + lclst = scl - 1; + } + } + } else +#endif + { + scl = clst = stcl; ncl = 0; + for (;;) { /* Find a contiguous cluster block */ + n = get_fat(&fp->obj, clst); + if (++clst >= fs->n_fatent) clst = 2; + if (n == 1) { res = FR_INT_ERR; break; } + if (n == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (n == 0) { /* Is it a free cluster? */ + if (++ncl == tcl) break; /* Break if a contiguous cluster block is found */ + } else { + scl = clst; ncl = 0; /* Not a free cluster */ + } + if (clst == stcl) { res = FR_DENIED; break; } /* No contiguous cluster? */ + } + if (res == FR_OK) { + if (opt) { + for (clst = scl, n = tcl; n; clst++, n--) { /* Create a cluster chain on the FAT */ + res = put_fat(fs, clst, (n == 1) ? 0xFFFFFFFF : clst + 1); + if (res != FR_OK) break; + lclst = clst; + } + } else { + lclst = scl - 1; + } + } + } + + if (res == FR_OK) { + fs->last_clst = lclst; /* Set suggested start cluster to start next */ + if (opt) { + fp->obj.sclust = scl; /* Update object allocation information */ + fp->obj.objsize = fsz; + if (_FS_EXFAT) fp->obj.stat = 2; /* Set status 'contiguous chain' */ + fp->flag |= FA_MODIFIED; + if (fs->free_clst < fs->n_fatent - 2) { /* Update FSINFO */ + fs->free_clst -= tcl; + fs->fsi_flag |= 1; + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* _USE_EXPAND && !_FS_READONLY */ + + + +#if _USE_FORWARD +/*-----------------------------------------------------------------------*/ +/* Forward data to the stream directly */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_forward ( + FIL* fp, /* Pointer to the file object */ + UINT (*func)(const BYTE*,UINT), /* Pointer to the streaming function */ + UINT btf, /* Number of bytes to forward */ + UINT* bf /* Pointer to number of bytes forwarded */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + FSIZE_t remain; + UINT rcnt, csect; + BYTE *dbuf; + + + *bf = 0; /* Clear transfer byte counter */ + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); + if (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + remain = fp->obj.objsize - fp->fptr; + if (btf > remain) btf = (UINT)remain; /* Truncate btf by remaining bytes */ + + for ( ; btf && (*func)(0, 0); /* Repeat until all data transferred or stream goes busy */ + fp->fptr += rcnt, *bf += rcnt, btf -= rcnt) { + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); /* Sector offset in the cluster */ + if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ + if (csect == 0) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->obj.sclust : get_fat(&fp->obj, fp->clust); + if (clst <= 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + } + sect = clust2sect(fs, fp->clust); /* Get current data sector */ + if (!sect) ABORT(fs, FR_INT_ERR); + sect += csect; +#if _FS_TINY + if (move_window(fs, sect) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Move sector window to the file data */ + dbuf = fs->win; +#else + if (fp->sect != sect) { /* Fill sector cache with file data */ +#if !_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->drv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->drv, fp->buf, sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + } + dbuf = fp->buf; +#endif + fp->sect = sect; + rcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes left in the sector */ + if (rcnt > btf) rcnt = btf; /* Clip it by btr if needed */ + rcnt = (*func)(dbuf + ((UINT)fp->fptr % SS(fs)), rcnt); /* Forward the file data */ + if (!rcnt) ABORT(fs, FR_INT_ERR); + } + + LEAVE_FF(fs, FR_OK); +} +#endif /* _USE_FORWARD */ + + + +#if _USE_MKFS && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Create FAT file system on the logical drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkfs ( + const TCHAR* path, /* Logical drive number */ + BYTE opt, /* Format option */ + DWORD au, /* Size of allocation unit [byte] */ + void* work, /* Pointer to working buffer */ + UINT len /* Size of working buffer */ +) +{ + const UINT n_fats = 1; /* Number of FATs for FAT12/16/32 volume (1 or 2) */ + const UINT n_rootdir = 512; /* Number of root directory entries for FAT12/16 volume */ + static const WORD cst[] = {1, 4, 16, 64, 256, 512, 0}; /* Cluster size boundary for FAT12/16 volume (4Ks unit) */ + static const WORD cst32[] = {1, 2, 4, 8, 16, 32, 0}; /* Cluster size boundary for FAT32 volume (128Ks unit) */ + BYTE fmt, sys, *buf, *pte, pdrv, part; + WORD ss; + DWORD szb_buf, sz_buf, sz_blk, n_clst, pau, sect, nsect, n; + DWORD b_vol, b_fat, b_data; /* Base LBA for volume, fat, data */ + DWORD sz_vol, sz_rsv, sz_fat, sz_dir; /* Size for volume, fat, dir, data */ + UINT i; + int vol; + DSTATUS stat; +#if _USE_TRIM || _FS_EXFAT + DWORD tbl[3]; +#endif + + + /* Check mounted drive and clear work area */ + vol = get_ldnumber(&path); /* Get target logical drive */ + if (vol < 0) return FR_INVALID_DRIVE; + if (FatFs[vol]) FatFs[vol]->fs_type = 0; /* Clear mounted volume */ + pdrv = LD2PD(vol); /* Physical drive */ + part = LD2PT(vol); /* Partition (0:create as new, 1-4:get from partition table) */ + + /* Check physical drive status */ + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; + if (disk_ioctl(pdrv, GET_BLOCK_SIZE, &sz_blk) != RES_OK || !sz_blk || sz_blk > 32768 || (sz_blk & (sz_blk - 1))) sz_blk = 1; /* Erase block to align data area */ +#if _MAX_SS != _MIN_SS /* Get sector size of the medium */ + if (disk_ioctl(pdrv, GET_SECTOR_SIZE, &ss) != RES_OK) return FR_DISK_ERR; + if (ss > _MAX_SS || ss < _MIN_SS || (ss & (ss - 1))) return FR_DISK_ERR; +#else + ss = _MAX_SS; +#endif + if ((au != 0 && au < ss) || au > 0x1000000 || (au & (au - 1))) return FR_INVALID_PARAMETER; /* Check if au is valid */ + au /= ss; /* Cluster size in unit of sector */ + + /* Get working buffer */ + buf = (BYTE*)work; /* Working buffer */ + sz_buf = len / ss; /* Size of working buffer (sector) */ + szb_buf = sz_buf * ss; /* Size of working buffer (byte) */ + if (!szb_buf) return FR_MKFS_ABORTED; + + /* Determine where the volume to be located (b_vol, sz_vol) */ + if (_MULTI_PARTITION && part != 0) { + /* Get partition information from partition table in the MBR */ + if (disk_read(pdrv, buf, 0, 1) != RES_OK) return FR_DISK_ERR; /* Load MBR */ + if (ld_word(buf + BS_55AA) != 0xAA55) return FR_MKFS_ABORTED; /* Check if MBR is valid */ + pte = buf + (MBR_Table + (part - 1) * SZ_PTE); + if (!pte[PTE_System]) return FR_MKFS_ABORTED; /* No partition? */ + b_vol = ld_dword(pte + PTE_StLba); /* Get volume start sector */ + sz_vol = ld_dword(pte + PTE_SizLba); /* Get volume size */ + } else { + /* Create a single-partition in this function */ + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_vol) != RES_OK) return FR_DISK_ERR; + b_vol = (opt & FM_SFD) ? 0 : 63; /* Volume start sector */ + if (sz_vol < b_vol) return FR_MKFS_ABORTED; + sz_vol -= b_vol; /* Volume size */ + } + if (sz_vol < 128) return FR_MKFS_ABORTED; /* Check if volume size is >=128s */ + + /* Pre-determine the FAT type */ + do { + if (_FS_EXFAT && (opt & FM_EXFAT)) { /* exFAT possible? */ + if ((opt & FM_ANY) == FM_EXFAT || sz_vol >= 0x4000000 || au > 128) { /* exFAT only, vol >= 64Ms or au > 128s ? */ + fmt = FS_EXFAT; break; + } + } + if (au > 128) return FR_INVALID_PARAMETER; /* Too large au for FAT/FAT32 */ + if (opt & FM_FAT32) { /* FAT32 possible? */ + if ((opt & FM_ANY) == FM_FAT32 || !(opt & FM_FAT)) { /* FAT32 only or no-FAT? */ + fmt = FS_FAT32; break; + } + } + if (!(opt & FM_FAT)) return FR_INVALID_PARAMETER; /* no-FAT? */ + fmt = FS_FAT16; + } while (0); + +#if _FS_EXFAT + if (fmt == FS_EXFAT) { /* Create an exFAT volume */ + DWORD szb_bit, szb_case, sum, nb, cl; + WCHAR ch, si; + UINT j, st; + BYTE b; + + if (sz_vol < 0x1000) return FR_MKFS_ABORTED; /* Too small volume? */ +#if _USE_TRIM + tbl[0] = b_vol; tbl[1] = b_vol + sz_vol - 1; /* Inform the device the volume area can be erased */ + disk_ioctl(pdrv, CTRL_TRIM, tbl); +#endif + /* Determine FAT location, data location and number of clusters */ + if (!au) { /* au auto-selection */ + au = 8; + if (sz_vol >= 0x80000) au = 64; /* >= 512Ks */ + if (sz_vol >= 0x4000000) au = 256; /* >= 64Ms */ + } + b_fat = b_vol + 32; /* FAT start at offset 32 */ + sz_fat = ((sz_vol / au + 2) * 4 + ss - 1) / ss; /* Number of FAT sectors */ + b_data = (b_fat + sz_fat + sz_blk - 1) & ~(sz_blk - 1); /* Align data area to the erase block boundary */ + if (b_data >= sz_vol / 2) return FR_MKFS_ABORTED; /* Too small volume? */ + n_clst = (sz_vol - (b_data - b_vol)) / au; /* Number of clusters */ + if (n_clst <16) return FR_MKFS_ABORTED; /* Too few clusters? */ + if (n_clst > MAX_EXFAT) return FR_MKFS_ABORTED; /* Too many clusters? */ + + szb_bit = (n_clst + 7) / 8; /* Size of allocation bitmap */ + tbl[0] = (szb_bit + au * ss - 1) / (au * ss); /* Number of allocation bitmap clusters */ + + /* Create a compressed up-case table */ + sect = b_data + au * tbl[0]; /* Table start sector */ + sum = 0; /* Table checksum to be stored in the 82 entry */ + st = si = i = j = szb_case = 0; + do { + switch (st) { + case 0: + ch = ff_wtoupper(si); /* Get an up-case char */ + if (ch != si) { + si++; break; /* Store the up-case char if exist */ + } + for (j = 1; (WCHAR)(si + j) && (WCHAR)(si + j) == ff_wtoupper((WCHAR)(si + j)); j++) ; /* Get run length of no-case block */ + if (j >= 128) { + ch = 0xFFFF; st = 2; break; /* Compress the no-case block if run is >= 128 */ + } + st = 1; /* Do not compress short run */ + /* continue */ + case 1: + ch = si++; /* Fill the short run */ + if (--j == 0) st = 0; + break; + default: + ch = (WCHAR)j; si += j; /* Number of chars to skip */ + st = 0; + } + sum = xsum32(buf[i + 0] = (BYTE)ch, sum); /* Put it into the write buffer */ + sum = xsum32(buf[i + 1] = (BYTE)(ch >> 8), sum); + i += 2; szb_case += 2; + if (!si || i == szb_buf) { /* Write buffered data when buffer full or end of process */ + n = (i + ss - 1) / ss; + if (disk_write(pdrv, buf, sect, n) != RES_OK) return FR_DISK_ERR; + sect += n; i = 0; + } + } while (si); + tbl[1] = (szb_case + au * ss - 1) / (au * ss); /* Number of up-case table clusters */ + tbl[2] = 1; /* Number of root dir clusters */ + + /* Initialize the allocation bitmap */ + sect = b_data; nsect = (szb_bit + ss - 1) / ss; /* Start of bitmap and number of sectors */ + nb = tbl[0] + tbl[1] + tbl[2]; /* Number of clusters in-use by system */ + do { + mem_set(buf, 0, szb_buf); + for (i = 0; nb >= 8 && i < szb_buf; buf[i++] = 0xFF, nb -= 8) ; + for (b = 1; nb && i < szb_buf; buf[i] |= b, b <<= 1, nb--) ; + n = (nsect > sz_buf) ? sz_buf : nsect; /* Write the buffered data */ + if (disk_write(pdrv, buf, sect, n) != RES_OK) return FR_DISK_ERR; + sect += n; nsect -= n; + } while (nsect); + + /* Initialize the FAT */ + sect = b_fat; nsect = sz_fat; /* Start of FAT and number of FAT sectors */ + j = nb = cl = 0; + do { + mem_set(buf, 0, szb_buf); i = 0; /* Clear work area and reset write index */ + if (cl == 0) { /* Set entry 0 and 1 */ + st_dword(buf + i, 0xFFFFFFF8); i += 4; cl++; + st_dword(buf + i, 0xFFFFFFFF); i += 4; cl++; + } + do { /* Create chains of bitmap, up-case and root dir */ + while (nb && i < szb_buf) { /* Create a chain */ + st_dword(buf + i, (nb > 1) ? cl + 1 : 0xFFFFFFFF); + i += 4; cl++; nb--; + } + if (!nb && j < 3) nb = tbl[j++]; /* Next chain */ + } while (nb && i < szb_buf); + n = (nsect > sz_buf) ? sz_buf : nsect; /* Write the buffered data */ + if (disk_write(pdrv, buf, sect, n) != RES_OK) return FR_DISK_ERR; + sect += n; nsect -= n; + } while (nsect); + + /* Initialize the root directory */ + mem_set(buf, 0, szb_buf); + buf[SZDIRE * 0 + 0] = 0x83; /* 83 entry (volume label) */ + buf[SZDIRE * 1 + 0] = 0x81; /* 81 entry (allocation bitmap) */ + st_dword(buf + SZDIRE * 1 + 20, 2); + st_dword(buf + SZDIRE * 1 + 24, szb_bit); + buf[SZDIRE * 2 + 0] = 0x82; /* 82 entry (up-case table) */ + st_dword(buf + SZDIRE * 2 + 4, sum); + st_dword(buf + SZDIRE * 2 + 20, 2 + tbl[0]); + st_dword(buf + SZDIRE * 2 + 24, szb_case); + sect = b_data + au * (tbl[0] + tbl[1]); nsect = au; /* Start of the root directory and number of sectors */ + do { /* Fill root directory sectors */ + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, n) != RES_OK) return FR_DISK_ERR; + mem_set(buf, 0, ss); + sect += n; nsect -= n; + } while (nsect); + + /* Create two set of the exFAT VBR blocks */ + sect = b_vol; + for (n = 0; n < 2; n++) { + /* Main record (+0) */ + mem_set(buf, 0, ss); + mem_cpy(buf + BS_JmpBoot, "\xEB\x76\x90" "EXFAT ", 11); /* Boot jump code (x86), OEM name */ + st_dword(buf + BPB_VolOfsEx, b_vol); /* Volume offset in the physical drive [sector] */ + st_dword(buf + BPB_TotSecEx, sz_vol); /* Volume size [sector] */ + st_dword(buf + BPB_FatOfsEx, b_fat - b_vol); /* FAT offset [sector] */ + st_dword(buf + BPB_FatSzEx, sz_fat); /* FAT size [sector] */ + st_dword(buf + BPB_DataOfsEx, b_data - b_vol); /* Data offset [sector] */ + st_dword(buf + BPB_NumClusEx, n_clst); /* Number of clusters */ + st_dword(buf + BPB_RootClusEx, 2 + tbl[0] + tbl[1]); /* Root dir cluster # */ + st_dword(buf + BPB_VolIDEx, GET_FATTIME()); /* VSN */ + st_word(buf + BPB_FSVerEx, 0x100); /* File system version (1.00) */ + for (buf[BPB_BytsPerSecEx] = 0, i = ss; i >>= 1; buf[BPB_BytsPerSecEx]++) ; /* Log2 of sector size [byte] */ + for (buf[BPB_SecPerClusEx] = 0, i = au; i >>= 1; buf[BPB_SecPerClusEx]++) ; /* Log2 of cluster size [sector] */ + buf[BPB_NumFATsEx] = 1; /* Number of FATs */ + buf[BPB_DrvNumEx] = 0x80; /* Drive number (for int13) */ + st_word(buf + BS_BootCodeEx, 0xFEEB); /* Boot code (x86) */ + st_word(buf + BS_55AA, 0xAA55); /* Signature (placed here regardless of sector size) */ + for (i = sum = 0; i < ss; i++) { /* VBR checksum */ + if (i != BPB_VolFlagEx && i != BPB_VolFlagEx + 1 && i != BPB_PercInUseEx) sum = xsum32(buf[i], sum); + } + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) return FR_DISK_ERR; + /* Extended bootstrap record (+1..+8) */ + mem_set(buf, 0, ss); + st_word(buf + ss - 2, 0xAA55); /* Signature (placed at end of sector) */ + for (j = 1; j < 9; j++) { + for (i = 0; i < ss; sum = xsum32(buf[i++], sum)) ; /* VBR checksum */ + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) return FR_DISK_ERR; + } + /* OEM/Reserved record (+9..+10) */ + mem_set(buf, 0, ss); + for ( ; j < 11; j++) { + for (i = 0; i < ss; sum = xsum32(buf[i++], sum)) ; /* VBR checksum */ + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) return FR_DISK_ERR; + } + /* Sum record (+11) */ + for (i = 0; i < ss; i += 4) st_dword(buf + i, sum); /* Fill with checksum value */ + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) return FR_DISK_ERR; + } + + } else +#endif /* _FS_EXFAT */ + { /* Create an FAT12/16/32 volume */ + do { + pau = au; + /* Pre-determine number of clusters and FAT sub-type */ + if (fmt == FS_FAT32) { /* FAT32 volume */ + if (!pau) { /* au auto-selection */ + n = sz_vol / 0x20000; /* Volume size in unit of 128KS */ + for (i = 0, pau = 1; cst32[i] && cst32[i] <= n; i++, pau <<= 1) ; /* Get from table */ + } + n_clst = sz_vol / pau; /* Number of clusters */ + sz_fat = (n_clst * 4 + 8 + ss - 1) / ss; /* FAT size [sector] */ + sz_rsv = 32; /* Number of reserved sectors */ + sz_dir = 0; /* No static directory */ + if (n_clst <= MAX_FAT16 || n_clst > MAX_FAT32) return FR_MKFS_ABORTED; + } else { /* FAT12/16 volume */ + if (!pau) { /* au auto-selection */ + n = sz_vol / 0x1000; /* Volume size in unit of 4KS */ + for (i = 0, pau = 1; cst[i] && cst[i] <= n; i++, pau <<= 1) ; /* Get from table */ + } + n_clst = sz_vol / pau; + if (n_clst > MAX_FAT12) { + n = n_clst * 2 + 4; /* FAT size [byte] */ + } else { + fmt = FS_FAT12; + n = (n_clst * 3 + 1) / 2 + 3; /* FAT size [byte] */ + } + sz_fat = (n + ss - 1) / ss; /* FAT size [sector] */ + sz_rsv = 1; /* Number of reserved sectors */ + sz_dir = (DWORD)n_rootdir * SZDIRE / ss; /* Rootdir size [sector] */ + } + b_fat = b_vol + sz_rsv; /* FAT base */ + b_data = b_fat + sz_fat * n_fats + sz_dir; /* Data base */ + + /* Align data base to erase block boundary (for flash memory media) */ + n = ((b_data + sz_blk - 1) & ~(sz_blk - 1)) - b_data; /* Next nearest erase block from current data base */ + if (fmt == FS_FAT32) { /* FAT32: Move FAT base */ + sz_rsv += n; b_fat += n; + } else { /* FAT12/16: Expand FAT size */ + sz_fat += n / n_fats; + } + + /* Determine number of clusters and final check of validity of the FAT sub-type */ + if (sz_vol < b_data + pau * 16 - b_vol) return FR_MKFS_ABORTED; /* Too small volume */ + n_clst = (sz_vol - sz_rsv - sz_fat * n_fats - sz_dir) / pau; + if (fmt == FS_FAT32) { + if (n_clst <= MAX_FAT16) { /* Too few clusters for FAT32 */ + if (!au && (au = pau / 2) != 0) continue; /* Adjust cluster size and retry */ + return FR_MKFS_ABORTED; + } + } + if (fmt == FS_FAT16) { + if (n_clst > MAX_FAT16) { /* Too many clusters for FAT16 */ + if (!au && (pau * 2) <= 64) { + au = pau * 2; continue; /* Adjust cluster size and retry */ + } + if ((opt & FM_FAT32)) { + fmt = FS_FAT32; continue; /* Switch type to FAT32 and retry */ + } + if (!au && (au = pau * 2) <= 128) continue; /* Adjust cluster size and retry */ + return FR_MKFS_ABORTED; + } + if (n_clst <= MAX_FAT12) { /* Too few clusters for FAT16 */ + if (!au && (au = pau * 2) <= 128) continue; /* Adjust cluster size and retry */ + return FR_MKFS_ABORTED; + } + } + if (fmt == FS_FAT12 && n_clst > MAX_FAT12) return FR_MKFS_ABORTED; /* Too many clusters for FAT12 */ + + /* Ok, it is the valid cluster configuration */ + break; + } while (1); + +#if _USE_TRIM + tbl[0] = b_vol; tbl[1] = b_vol + sz_vol - 1; /* Inform the device the volume area can be erased */ + disk_ioctl(pdrv, CTRL_TRIM, tbl); +#endif + /* Create FAT VBR */ + mem_set(buf, 0, ss); + mem_cpy(buf + BS_JmpBoot, "\xEB\xFE\x90" "MSDOS5.0", 11);/* Boot jump code (x86), OEM name */ + st_word(buf + BPB_BytsPerSec, ss); /* Sector size [byte] */ + buf[BPB_SecPerClus] = (BYTE)pau; /* Cluster size [sector] */ + st_word(buf + BPB_RsvdSecCnt, (WORD)sz_rsv); /* Size of reserved area */ + buf[BPB_NumFATs] = (BYTE)n_fats; /* Number of FATs */ + st_word(buf + BPB_RootEntCnt, (WORD)((fmt == FS_FAT32) ? 0 : n_rootdir)); /* Number of root directory entries */ + if (sz_vol < 0x10000) { + st_word(buf + BPB_TotSec16, (WORD)sz_vol); /* Volume size in 16-bit LBA */ + } else { + st_dword(buf + BPB_TotSec32, sz_vol); /* Volume size in 32-bit LBA */ + } + buf[BPB_Media] = 0xF8; /* Media descriptor byte */ + st_word(buf + BPB_SecPerTrk, 63); /* Number of sectors per track (for int13) */ + st_word(buf + BPB_NumHeads, 255); /* Number of heads (for int13) */ + st_dword(buf + BPB_HiddSec, b_vol); /* Volume offset in the physical drive [sector] */ + if (fmt == FS_FAT32) { + st_dword(buf + BS_VolID32, GET_FATTIME()); /* VSN */ + st_dword(buf + BPB_FATSz32, sz_fat); /* FAT size [sector] */ + st_dword(buf + BPB_RootClus32, 2); /* Root directory cluster # (2) */ + st_word(buf + BPB_FSInfo32, 1); /* Offset of FSINFO sector (VBR + 1) */ + st_word(buf + BPB_BkBootSec32, 6); /* Offset of backup VBR (VBR + 6) */ + buf[BS_DrvNum32] = 0x80; /* Drive number (for int13) */ + buf[BS_BootSig32] = 0x29; /* Extended boot signature */ + mem_cpy(buf + BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ + } else { + st_dword(buf + BS_VolID, GET_FATTIME()); /* VSN */ + st_word(buf + BPB_FATSz16, (WORD)sz_fat); /* FAT size [sector] */ + buf[BS_DrvNum] = 0x80; /* Drive number (for int13) */ + buf[BS_BootSig] = 0x29; /* Extended boot signature */ + mem_cpy(buf + BS_VolLab, "NO NAME " "FAT ", 19); /* Volume label, FAT signature */ + } + st_word(buf + BS_55AA, 0xAA55); /* Signature (offset is fixed here regardless of sector size) */ + if (disk_write(pdrv, buf, b_vol, 1) != RES_OK) return FR_DISK_ERR; /* Write it to the VBR sector */ + + /* Create FSINFO record if needed */ + if (fmt == FS_FAT32) { + disk_write(pdrv, buf, b_vol + 6, 1); /* Write backup VBR (VBR + 6) */ + mem_set(buf, 0, ss); + st_dword(buf + FSI_LeadSig, 0x41615252); + st_dword(buf + FSI_StrucSig, 0x61417272); + st_dword(buf + FSI_Free_Count, n_clst - 1); /* Number of free clusters */ + st_dword(buf + FSI_Nxt_Free, 2); /* Last allocated cluster# */ + st_word(buf + BS_55AA, 0xAA55); + disk_write(pdrv, buf, b_vol + 7, 1); /* Write backup FSINFO (VBR + 7) */ + disk_write(pdrv, buf, b_vol + 1, 1); /* Write original FSINFO (VBR + 1) */ + } + + /* Initialize FAT area */ + mem_set(buf, 0, (UINT)szb_buf); + sect = b_fat; /* FAT start sector */ + for (i = 0; i < n_fats; i++) { /* Initialize FATs each */ + if (fmt == FS_FAT32) { + st_dword(buf + 0, 0xFFFFFFF8); /* Entry 0 */ + st_dword(buf + 4, 0xFFFFFFFF); /* Entry 1 */ + st_dword(buf + 8, 0x0FFFFFFF); /* Entry 2 (root directory) */ + } else { + st_dword(buf + 0, (fmt == FS_FAT12) ? 0xFFFFF8 : 0xFFFFFFF8); /* Entry 0 and 1 */ + } + nsect = sz_fat; /* Number of FAT sectors */ + do { /* Fill FAT sectors */ + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) return FR_DISK_ERR; + mem_set(buf, 0, ss); + sect += n; nsect -= n; + } while (nsect); + } + + /* Initialize root directory (fill with zero) */ + nsect = (fmt == FS_FAT32) ? pau : sz_dir; /* Number of root directory sectors */ + do { + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) return FR_DISK_ERR; + sect += n; nsect -= n; + } while (nsect); + } + + /* Determine system ID in the partition table */ + if (_FS_EXFAT && fmt == FS_EXFAT) { + sys = 0x07; /* HPFS/NTFS/exFAT */ + } else { + if (fmt == FS_FAT32) { + sys = 0x0C; /* FAT32X */ + } else { + if (sz_vol >= 0x10000) { + sys = 0x06; /* FAT12/16 (>=64KS) */ + } else { + sys = (fmt == FS_FAT16) ? 0x04 : 0x01; /* FAT16 (<64KS) : FAT12 (<64KS) */ + } + } + } + + if (_MULTI_PARTITION && part != 0) { + /* Update system ID in the partition table */ + if (disk_read(pdrv, buf, 0, 1) != RES_OK) return FR_DISK_ERR; /* Read the MBR */ + buf[MBR_Table + (part - 1) * SZ_PTE + PTE_System] = sys; /* Set system type */ + if (disk_write(pdrv, buf, 0, 1) != RES_OK) return FR_DISK_ERR; /* Write it back to the MBR */ + } else { + if (!(opt & FM_SFD)) { + /* Create partition table in FDISK format */ + mem_set(buf, 0, ss); + st_word(buf + BS_55AA, 0xAA55); /* MBR signature */ + pte = buf + MBR_Table; /* Create partition table for single partition in the drive */ + pte[PTE_Boot] = 0; /* Boot indicator */ + pte[PTE_StHead] = 1; /* Start head */ + pte[PTE_StSec] = 1; /* Start sector */ + pte[PTE_StCyl] = 0; /* Start cylinder */ + pte[PTE_System] = sys; /* System type */ + n = (b_vol + sz_vol) / (63 * 255); /* (End CHS is incorrect) */ + pte[PTE_EdHead] = 254; /* End head */ + pte[PTE_EdSec] = (BYTE)(n >> 2 | 63); /* End sector */ + pte[PTE_EdCyl] = (BYTE)n; /* End cylinder */ + st_dword(pte + PTE_StLba, b_vol); /* Start offset in LBA */ + st_dword(pte + PTE_SizLba, sz_vol); /* Size in sectors */ + if (disk_write(pdrv, buf, 0, 1) != RES_OK) return FR_DISK_ERR; /* Write it to the MBR */ + } + } + + if (disk_ioctl(pdrv, CTRL_SYNC, 0) != RES_OK) return FR_DISK_ERR; + + return FR_OK; +} + + + +#if _MULTI_PARTITION +/*-----------------------------------------------------------------------*/ +/* Create partition table on the physical drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_fdisk ( + BYTE pdrv, /* Physical drive number */ + const DWORD* szt, /* Pointer to the size table for each partitions */ + void* work /* Pointer to the working buffer */ +) +{ + UINT i, n, sz_cyl, tot_cyl, b_cyl, e_cyl, p_cyl; + BYTE s_hd, e_hd, *p, *buf = (BYTE*)work; + DSTATUS stat; + DWORD sz_disk, sz_part, s_part; + + + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_disk)) return FR_DISK_ERR; + + /* Determine the CHS without any care of the drive geometry */ + for (n = 16; n < 256 && sz_disk / n / 63 > 1024; n *= 2) ; + if (n == 256) n--; + e_hd = n - 1; + sz_cyl = 63 * n; + tot_cyl = sz_disk / sz_cyl; + + /* Create partition table */ + mem_set(buf, 0, _MAX_SS); + p = buf + MBR_Table; b_cyl = 0; + for (i = 0; i < 4; i++, p += SZ_PTE) { + p_cyl = (szt[i] <= 100U) ? (DWORD)tot_cyl * szt[i] / 100 : szt[i] / sz_cyl; + if (!p_cyl) continue; + s_part = (DWORD)sz_cyl * b_cyl; + sz_part = (DWORD)sz_cyl * p_cyl; + if (i == 0) { /* Exclude first track of cylinder 0 */ + s_hd = 1; + s_part += 63; sz_part -= 63; + } else { + s_hd = 0; + } + e_cyl = b_cyl + p_cyl - 1; + if (e_cyl >= tot_cyl) return FR_INVALID_PARAMETER; + + /* Set partition table */ + p[1] = s_hd; /* Start head */ + p[2] = (BYTE)((b_cyl >> 2) + 1); /* Start sector */ + p[3] = (BYTE)b_cyl; /* Start cylinder */ + p[4] = 0x06; /* System type (temporary setting) */ + p[5] = e_hd; /* End head */ + p[6] = (BYTE)((e_cyl >> 2) + 63); /* End sector */ + p[7] = (BYTE)e_cyl; /* End cylinder */ + st_dword(p + 8, s_part); /* Start sector in LBA */ + st_dword(p + 12, sz_part); /* Partition size */ + + /* Next partition */ + b_cyl += p_cyl; + } + st_word(p, 0xAA55); + + /* Write it to the MBR */ + return (disk_write(pdrv, buf, 0, 1) != RES_OK || disk_ioctl(pdrv, CTRL_SYNC, 0) != RES_OK) ? FR_DISK_ERR : FR_OK; +} + +#endif /* _MULTI_PARTITION */ +#endif /* _USE_MKFS && !_FS_READONLY */ + + + + +#if _USE_STRFUNC +/*-----------------------------------------------------------------------*/ +/* Get a string from the file */ +/*-----------------------------------------------------------------------*/ + +TCHAR* f_gets ( + TCHAR* buff, /* Pointer to the string buffer to read */ + int len, /* Size of string buffer (characters) */ + FIL* fp /* Pointer to the file object */ +) +{ + int n = 0; + TCHAR c, *p = buff; + BYTE s[2]; + UINT rc; + + + while (n < len - 1) { /* Read characters until buffer gets filled */ +#if _LFN_UNICODE +#if _STRF_ENCODE == 3 /* Read a character in UTF-8 */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = s[0]; + if (c >= 0x80) { + if (c < 0xC0) continue; /* Skip stray trailer */ + if (c < 0xE0) { /* Two-byte sequence */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = (c & 0x1F) << 6 | (s[0] & 0x3F); + if (c < 0x80) c = '?'; + } else { + if (c < 0xF0) { /* Three-byte sequence */ + f_read(fp, s, 2, &rc); + if (rc != 2) break; + c = c << 12 | (s[0] & 0x3F) << 6 | (s[1] & 0x3F); + if (c < 0x800) c = '?'; + } else { /* Reject four-byte sequence */ + c = '?'; + } + } + } +#elif _STRF_ENCODE == 2 /* Read a character in UTF-16BE */ + f_read(fp, s, 2, &rc); + if (rc != 2) break; + c = s[1] + (s[0] << 8); +#elif _STRF_ENCODE == 1 /* Read a character in UTF-16LE */ + f_read(fp, s, 2, &rc); + if (rc != 2) break; + c = s[0] + (s[1] << 8); +#else /* Read a character in ANSI/OEM */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = s[0]; + if (IsDBCS1(c)) { + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = (c << 8) + s[0]; + } + c = ff_convert(c, 1); /* OEM -> Unicode */ + if (!c) c = '?'; +#endif +#else /* Read a character without conversion */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = s[0]; +#endif + if (_USE_STRFUNC == 2 && c == '\r') continue; /* Strip '\r' */ + *p++ = c; + n++; + if (c == '\n') break; /* Break on EOL */ + } + *p = 0; + return n ? buff : 0; /* When no data read (eof or error), return with error. */ +} + + + + +#if !_FS_READONLY +#include +/*-----------------------------------------------------------------------*/ +/* Put a character to the file */ +/*-----------------------------------------------------------------------*/ + +typedef struct { + FIL *fp; /* Ptr to the writing file */ + int idx, nchr; /* Write index of buf[] (-1:error), number of chars written */ + BYTE buf[64]; /* Write buffer */ +} putbuff; + + +static +void putc_bfd ( /* Buffered write with code conversion */ + putbuff* pb, + TCHAR c +) +{ + UINT bw; + int i; + + + if (_USE_STRFUNC == 2 && c == '\n') { /* LF -> CRLF conversion */ + putc_bfd(pb, '\r'); + } + + i = pb->idx; /* Write index of pb->buf[] */ + if (i < 0) return; + +#if _LFN_UNICODE +#if _STRF_ENCODE == 3 /* Write a character in UTF-8 */ + if (c < 0x80) { /* 7-bit */ + pb->buf[i++] = (BYTE)c; + } else { + if (c < 0x800) { /* 11-bit */ + pb->buf[i++] = (BYTE)(0xC0 | c >> 6); + } else { /* 16-bit */ + pb->buf[i++] = (BYTE)(0xE0 | c >> 12); + pb->buf[i++] = (BYTE)(0x80 | (c >> 6 & 0x3F)); + } + pb->buf[i++] = (BYTE)(0x80 | (c & 0x3F)); + } +#elif _STRF_ENCODE == 2 /* Write a character in UTF-16BE */ + pb->buf[i++] = (BYTE)(c >> 8); + pb->buf[i++] = (BYTE)c; +#elif _STRF_ENCODE == 1 /* Write a character in UTF-16LE */ + pb->buf[i++] = (BYTE)c; + pb->buf[i++] = (BYTE)(c >> 8); +#else /* Write a character in ANSI/OEM */ + c = ff_convert(c, 0); /* Unicode -> OEM */ + if (!c) c = '?'; + if (c >= 0x100) + pb->buf[i++] = (BYTE)(c >> 8); + pb->buf[i++] = (BYTE)c; +#endif +#else /* Write a character without conversion */ + pb->buf[i++] = (BYTE)c; +#endif + + if (i >= (int)(sizeof pb->buf) - 3) { /* Write buffered characters to the file */ + f_write(pb->fp, pb->buf, (UINT)i, &bw); + i = (bw == (UINT)i) ? 0 : -1; + } + pb->idx = i; + pb->nchr++; +} + + +static +int putc_flush ( /* Flush left characters in the buffer */ + putbuff* pb +) +{ + UINT nw; + + if ( pb->idx >= 0 /* Flush buffered characters to the file */ + && f_write(pb->fp, pb->buf, (UINT)pb->idx, &nw) == FR_OK + && (UINT)pb->idx == nw) return pb->nchr; + return EOF; +} + + +static +void putc_init ( /* Initialize write buffer */ + putbuff* pb, + FIL* fp +) +{ + pb->fp = fp; + pb->nchr = pb->idx = 0; +} + + + +int f_putc ( + TCHAR c, /* A character to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + putbuff pb; + + + putc_init(&pb, fp); + putc_bfd(&pb, c); /* Put the character */ + return putc_flush(&pb); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a string to the file */ +/*-----------------------------------------------------------------------*/ + +int f_puts ( + const TCHAR* str, /* Pointer to the string to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + putbuff pb; + + + putc_init(&pb, fp); + while (*str) putc_bfd(&pb, *str++); /* Put the string */ + return putc_flush(&pb); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a formatted string to the file */ +/*-----------------------------------------------------------------------*/ + +int f_printf ( + FIL* fp, /* Pointer to the file object */ + const TCHAR* fmt, /* Pointer to the format string */ + ... /* Optional arguments... */ +) +{ + va_list arp; + putbuff pb; + BYTE f, r; + UINT i, j, w; + DWORD v; + TCHAR c, d, str[32], *p; + + + putc_init(&pb, fp); + + va_start(arp, fmt); + + for (;;) { + c = *fmt++; + if (c == 0) break; /* End of string */ + if (c != '%') { /* Non escape character */ + putc_bfd(&pb, c); + continue; + } + w = f = 0; + c = *fmt++; + if (c == '0') { /* Flag: '0' padding */ + f = 1; c = *fmt++; + } else { + if (c == '-') { /* Flag: left justified */ + f = 2; c = *fmt++; + } + } + while (IsDigit(c)) { /* Precision */ + w = w * 10 + c - '0'; + c = *fmt++; + } + if (c == 'l' || c == 'L') { /* Prefix: Size is long int */ + f |= 4; c = *fmt++; + } + if (!c) break; + d = c; + if (IsLower(d)) d -= 0x20; + switch (d) { /* Type is... */ + case 'S' : /* String */ + p = va_arg(arp, TCHAR*); + for (j = 0; p[j]; j++) ; + if (!(f & 2)) { + while (j++ < w) putc_bfd(&pb, ' '); + } + while (*p) putc_bfd(&pb, *p++); + while (j++ < w) putc_bfd(&pb, ' '); + continue; + case 'C' : /* Character */ + putc_bfd(&pb, (TCHAR)va_arg(arp, int)); continue; + case 'B' : /* Binary */ + r = 2; break; + case 'O' : /* Octal */ + r = 8; break; + case 'D' : /* Signed decimal */ + case 'U' : /* Unsigned decimal */ + r = 10; break; + case 'X' : /* Hexdecimal */ + r = 16; break; + default: /* Unknown type (pass-through) */ + putc_bfd(&pb, c); continue; + } + + /* Get an argument and put it in numeral */ + v = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int)); + if (d == 'D' && (v & 0x80000000)) { + v = 0 - v; + f |= 8; + } + i = 0; + do { + d = (TCHAR)(v % r); v /= r; + if (d > 9) d += (c == 'x') ? 0x27 : 0x07; + str[i++] = d + '0'; + } while (v && i < sizeof str / sizeof str[0]); + if (f & 8) str[i++] = '-'; + j = i; d = (f & 1) ? '0' : ' '; + while (!(f & 2) && j++ < w) putc_bfd(&pb, d); + do putc_bfd(&pb, str[--i]); while (i); + while (j++ < w) putc_bfd(&pb, d); + } + + va_end(arp); + + return putc_flush(&pb); +} + +#endif /* !_FS_READONLY */ +#endif /* _USE_STRFUNC */ + +#if !_LFN_UNICODE +WCHAR ff_convert(WCHAR chr, UINT dir) +{ + return chr; +} +WCHAR ff_wtoupper(WCHAR chr) +{ + return chr; +} +#endif diff --git a/ff.h b/ff.h new file mode 100644 index 0000000..905dd66 --- /dev/null +++ b/ff.h @@ -0,0 +1,366 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - Generic FAT file system module R0.12b / +/-----------------------------------------------------------------------------/ +/ +/ Copyright (C) 2016, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: + +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/----------------------------------------------------------------------------*/ + + +#ifndef _FATFS +#define _FATFS 68020 /* Revision ID */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "integer.h" /* Basic integer types */ +#include "ffconf.h" /* FatFs configuration options */ + +#if _FATFS != _FFCONF +#error Wrong configuration file (ffconf.h). +#endif + + + +/* Definitions of volume management */ + +#if _MULTI_PARTITION /* Multiple partition configuration */ +typedef struct { + BYTE pd; /* Physical drive number */ + BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */ +} PARTITION; +extern PARTITION VolToPart[]; /* Volume - Partition resolution table */ +#define LD2PD(vol) (VolToPart[vol].pd) /* Get physical drive number */ +#define LD2PT(vol) (VolToPart[vol].pt) /* Get partition index */ + +#else /* Single partition configuration */ +#define LD2PD(vol) (BYTE)(vol) /* Each logical drive is bound to the same physical drive number */ +#define LD2PT(vol) 0 /* Find first valid partition or in SFD */ + +#endif + + + +/* Type of path name strings on FatFs API */ + +#if _LFN_UNICODE /* Unicode (UTF-16) string */ +#if _USE_LFN == 0 +#error _LFN_UNICODE must be 0 at non-LFN cfg. +#endif +#ifndef _INC_TCHAR +typedef WCHAR TCHAR; +#define _T(x) L ## x +#define _TEXT(x) L ## x +#endif +#else /* ANSI/OEM string */ +#ifndef _INC_TCHAR +typedef char TCHAR; +#define _T(x) x +#define _TEXT(x) x +#endif +#endif + + + +/* Type of file size variables */ + +#if _FS_EXFAT +#if _USE_LFN == 0 +#error LFN must be enabled when enable exFAT +#endif +typedef QWORD FSIZE_t; +#else +typedef DWORD FSIZE_t; +#endif + + + +/* File system object structure (FATFS) */ + +typedef struct { + BYTE fs_type; /* File system type (0:N/A) */ + BYTE drv; /* Physical drive number */ + BYTE n_fats; /* Number of FATs (1 or 2) */ + BYTE wflag; /* win[] flag (b0:dirty) */ + BYTE fsi_flag; /* FSINFO flags (b7:disabled, b0:dirty) */ + WORD id; /* File system mount ID */ + WORD n_rootdir; /* Number of root directory entries (FAT12/16) */ + WORD csize; /* Cluster size [sectors] */ +#if _MAX_SS != _MIN_SS + WORD ssize; /* Sector size (512, 1024, 2048 or 4096) */ +#endif +#if _USE_LFN != 0 + WCHAR* lfnbuf; /* LFN working buffer */ +#endif +#if _FS_EXFAT + BYTE* dirbuf; /* Directory entry block scratchpad buffer */ +#endif +#if _FS_REENTRANT + _SYNC_t sobj; /* Identifier of sync object */ +#endif +#if !_FS_READONLY + DWORD last_clst; /* Last allocated cluster */ + DWORD free_clst; /* Number of free clusters */ +#endif +#if _FS_RPATH != 0 + DWORD cdir; /* Current directory start cluster (0:root) */ +#if _FS_EXFAT + DWORD cdc_scl; /* Containing directory start cluster (invalid when cdir is 0) */ + DWORD cdc_size; /* b31-b8:Size of containing directory, b7-b0: Chain status */ + DWORD cdc_ofs; /* Offset in the containing directory (invalid when cdir is 0) */ +#endif +#endif + DWORD n_fatent; /* Number of FAT entries (number of clusters + 2) */ + DWORD fsize; /* Size of an FAT [sectors] */ + DWORD volbase; /* Volume base sector */ + DWORD fatbase; /* FAT base sector */ + DWORD dirbase; /* Root directory base sector/cluster */ + DWORD database; /* Data base sector */ + DWORD winsect; /* Current sector appearing in the win[] */ + BYTE win[_MAX_SS]; /* Disk access window for Directory, FAT (and file data at tiny cfg) */ +} FATFS; + + + +/* Object ID and allocation information (_FDID) */ + +typedef struct { + FATFS* fs; /* Pointer to the owner file system object */ + WORD id; /* Owner file system mount ID */ + BYTE attr; /* Object attribute */ + BYTE stat; /* Object chain status (b1-0: =0:not contiguous, =2:contiguous (no data on FAT), =3:got flagmented, b2:sub-directory stretched) */ + DWORD sclust; /* Object start cluster (0:no cluster or root directory) */ + FSIZE_t objsize; /* Object size (valid when sclust != 0) */ +#if _FS_EXFAT + DWORD n_cont; /* Size of coutiguous part, clusters - 1 (valid when stat == 3) */ + DWORD c_scl; /* Containing directory start cluster (valid when sclust != 0) */ + DWORD c_size; /* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */ + DWORD c_ofs; /* Offset in the containing directory (valid when sclust != 0) */ +#endif +#if _FS_LOCK != 0 + UINT lockid; /* File lock ID origin from 1 (index of file semaphore table Files[]) */ +#endif +} _FDID; + + + +/* File object structure (FIL) */ + +typedef struct { + _FDID obj; /* Object identifier (must be the 1st member to detect invalid object pointer) */ + BYTE flag; /* File status flags */ + BYTE err; /* Abort flag (error code) */ + FSIZE_t fptr; /* File read/write pointer (Zeroed on file open) */ + DWORD clust; /* Current cluster of fpter (invalid when fprt is 0) */ + DWORD sect; /* Sector number appearing in buf[] (0:invalid) */ +#if !_FS_READONLY + DWORD dir_sect; /* Sector number containing the directory entry */ + BYTE* dir_ptr; /* Pointer to the directory entry in the win[] */ +#endif +#if _USE_FASTSEEK + DWORD* cltbl; /* Pointer to the cluster link map table (nulled on open, set by application) */ +#endif +#if !_FS_TINY + BYTE buf[_MAX_SS]; /* File private data read/write window */ +#endif +} FIL; + + + +/* Directory object structure (DIR) */ + +typedef struct { + _FDID obj; /* Object identifier */ + DWORD dptr; /* Current read/write offset */ + DWORD clust; /* Current cluster */ + DWORD sect; /* Current sector */ + BYTE* dir; /* Pointer to the directory item in the win[] */ + BYTE fn[12]; /* SFN (in/out) {body[8],ext[3],status[1]} */ +#if _USE_LFN != 0 + DWORD blk_ofs; /* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */ +#endif +#if _USE_FIND + const TCHAR* pat; /* Pointer to the name matching pattern */ +#endif +} DIR; + + + +/* File information structure (FILINFO) */ + +typedef struct { + FSIZE_t fsize; /* File size */ + WORD fdate; /* Modified date */ + WORD ftime; /* Modified time */ + BYTE fattrib; /* File attribute */ +#if _USE_LFN != 0 + TCHAR altname[13]; /* Altenative file name */ + TCHAR fname[_MAX_LFN + 1]; /* Primary file name */ +#else + TCHAR fname[13]; /* File name */ +#endif +} FILINFO; + + + +/* File function return code (FRESULT) */ + +typedef enum { + FR_OK = 0, /* (0) Succeeded */ + FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ + FR_INT_ERR, /* (2) Assertion failed */ + FR_NOT_READY, /* (3) The physical drive cannot work */ + FR_NO_FILE, /* (4) Could not find the file */ + FR_NO_PATH, /* (5) Could not find the path */ + FR_INVALID_NAME, /* (6) The path name format is invalid */ + FR_DENIED, /* (7) Access denied due to prohibited access or directory full */ + FR_EXIST, /* (8) Access denied due to prohibited access */ + FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ + FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ + FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ + FR_NOT_ENABLED, /* (12) The volume has no work area */ + FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ + FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */ + FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ + FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ + FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ + FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_LOCK */ + FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ +} FRESULT; + + + +/*--------------------------------------------------------------*/ +/* FatFs module application interface */ + +FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); /* Open or create a file */ +FRESULT f_close (FIL* fp); /* Close an open file object */ +FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from the file */ +FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to the file */ +FRESULT f_lseek (FIL* fp, FSIZE_t ofs); /* Move file pointer of the file object */ +FRESULT f_truncate (FIL* fp); /* Truncate the file */ +FRESULT f_sync (FIL* fp); /* Flush cached data of the writing file */ +FRESULT f_opendir (DIR* dp, const TCHAR* path); /* Open a directory */ +FRESULT f_closedir (DIR* dp); /* Close an open directory */ +FRESULT f_readdir (DIR* dp, FILINFO* fno); /* Read a directory item */ +FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern); /* Find first file */ +FRESULT f_findnext (DIR* dp, FILINFO* fno); /* Find next file */ +FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */ +FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */ +FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */ +FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */ +FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask); /* Change attribute of a file/dir */ +FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change timestamp of a file/dir */ +FRESULT f_chdir (const TCHAR* path); /* Change current directory */ +FRESULT f_chdrive (const TCHAR* path); /* Change current drive */ +FRESULT f_getcwd (TCHAR* buff, UINT len); /* Get current directory */ +FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs); /* Get number of free clusters on the drive */ +FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn); /* Get volume label */ +FRESULT f_setlabel (const TCHAR* label); /* Set volume label */ +FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf); /* Forward data to the stream */ +FRESULT f_expand (FIL* fp, FSIZE_t szf, BYTE opt); /* Allocate a contiguous block to the file */ +FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */ +FRESULT f_mkfs (const TCHAR* path, BYTE opt, DWORD au, void* work, UINT len); /* Create a FAT volume */ +FRESULT f_fdisk (BYTE pdrv, const DWORD* szt, void* work); /* Divide a physical drive into some partitions */ +int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */ +int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */ +int f_printf (FIL* fp, const TCHAR* str, ...); /* Put a formatted string to the file */ +TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the file */ + +#define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize)) +#define f_error(fp) ((fp)->err) +#define f_tell(fp) ((fp)->fptr) +#define f_size(fp) ((fp)->obj.objsize) +#define f_rewind(fp) f_lseek((fp), 0) +#define f_rewinddir(dp) f_readdir((dp), 0) + +#ifndef EOF +#define EOF (-1) +#endif + + + + +/*--------------------------------------------------------------*/ +/* Additional user defined functions */ + +/* RTC function */ +#if !_FS_READONLY && !_FS_NORTC +DWORD get_fattime (void); +#endif + +/* Unicode support functions */ +#if _USE_LFN != 0 /* Unicode - OEM code conversion */ +WCHAR ff_convert (WCHAR chr, UINT dir); /* OEM-Unicode bidirectional conversion */ +WCHAR ff_wtoupper (WCHAR chr); /* Unicode upper-case conversion */ +#if _USE_LFN == 3 /* Memory functions */ +void* ff_memalloc (UINT msize); /* Allocate memory block */ +void ff_memfree (void* mblock); /* Free memory block */ +#endif +#endif + +/* Sync functions */ +#if _FS_REENTRANT +int ff_cre_syncobj (BYTE vol, _SYNC_t* sobj); /* Create a sync object */ +int ff_req_grant (_SYNC_t sobj); /* Lock sync object */ +void ff_rel_grant (_SYNC_t sobj); /* Unlock sync object */ +int ff_del_syncobj (_SYNC_t sobj); /* Delete a sync object */ +#endif + + + + +/*--------------------------------------------------------------*/ +/* Flags and offset address */ + + +/* File access mode and open method flags (3rd argument of f_open) */ +#define FA_READ 0x01 +#define FA_WRITE 0x02 +#define FA_OPEN_EXISTING 0x00 +#define FA_CREATE_NEW 0x04 +#define FA_CREATE_ALWAYS 0x08 +#define FA_OPEN_ALWAYS 0x10 +#define FA_OPEN_APPEND 0x30 + +/* Fast seek controls (2nd argument of f_lseek) */ +#define CREATE_LINKMAP ((FSIZE_t)0 - 1) + +/* Format options (2nd argument of f_mkfs) */ +#define FM_FAT 0x01 +#define FM_FAT32 0x02 +#define FM_EXFAT 0x04 +#define FM_ANY 0x07 +#define FM_SFD 0x08 + +/* Filesystem type (FATFS.fs_type) */ +#define FS_FAT12 1 +#define FS_FAT16 2 +#define FS_FAT32 3 +#define FS_EXFAT 4 + +/* File attribute bits for directory entry (FILINFO.fattrib) */ +#define AM_RDO 0x01 /* Read only */ +#define AM_HID 0x02 /* Hidden */ +#define AM_SYS 0x04 /* System */ +#define AM_DIR 0x10 /* Directory */ +#define AM_ARC 0x20 /* Archive */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _FATFS */ diff --git a/ffconf.h b/ffconf.h new file mode 100644 index 0000000..0ff0385 --- /dev/null +++ b/ffconf.h @@ -0,0 +1,267 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module configuration file +/---------------------------------------------------------------------------*/ + +#define _FFCONF 68020 /* Revision ID */ + +/*---------------------------------------------------------------------------/ +/ Function Configurations +/---------------------------------------------------------------------------*/ + +#define _FS_READONLY 0 +/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) +/ Read-only configuration removes writing API functions, f_write(), f_sync(), +/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() +/ and optional writing functions as well. */ + + +#define _FS_MINIMIZE 0 +/* This option defines minimization level to remove some basic API functions. +/ +/ 0: All basic functions are enabled. +/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() +/ are removed. +/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. +/ 3: f_lseek() function is removed in addition to 2. */ + + +#define _USE_STRFUNC 0 +/* This option switches string functions, f_gets(), f_putc(), f_puts() and +/ f_printf(). +/ +/ 0: Disable string functions. +/ 1: Enable without LF-CRLF conversion. +/ 2: Enable with LF-CRLF conversion. */ + + +#define _USE_FIND 1 +/* This option switches filtered directory read functions, f_findfirst() and +/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ + + +#define _USE_MKFS 0 +/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ + + +#define _USE_FASTSEEK 0 +/* This option switches fast seek function. (0:Disable or 1:Enable) */ + + +#define _USE_EXPAND 0 +/* This option switches f_expand function. (0:Disable or 1:Enable) */ + + +#define _USE_CHMOD 1 +/* This option switches attribute manipulation functions, f_chmod() and f_utime(). +/ (0:Disable or 1:Enable) Also _FS_READONLY needs to be 0 to enable this option. */ + + +#define _USE_LABEL 0 +/* This option switches volume label functions, f_getlabel() and f_setlabel(). +/ (0:Disable or 1:Enable) */ + + +#define _USE_FORWARD 0 +/* This option switches f_forward() function. (0:Disable or 1:Enable) */ + + +/*---------------------------------------------------------------------------/ +/ Locale and Namespace Configurations +/---------------------------------------------------------------------------*/ + +#define _CODE_PAGE 437 +/* This option specifies the OEM code page to be used on the target system. +/ Incorrect setting of the code page can cause a file open failure. +/ +/ 1 - ASCII (No extended character. Non-LFN cfg. only) +/ 437 - U.S. +/ 720 - Arabic +/ 737 - Greek +/ 771 - KBL +/ 775 - Baltic +/ 850 - Latin 1 +/ 852 - Latin 2 +/ 855 - Cyrillic +/ 857 - Turkish +/ 860 - Portuguese +/ 861 - Icelandic +/ 862 - Hebrew +/ 863 - Canadian French +/ 864 - Arabic +/ 865 - Nordic +/ 866 - Russian +/ 869 - Greek 2 +/ 932 - Japanese (DBCS) +/ 936 - Simplified Chinese (DBCS) +/ 949 - Korean (DBCS) +/ 950 - Traditional Chinese (DBCS) +*/ + + +#define _USE_LFN 1 +#define _MAX_LFN 255 +/* The _USE_LFN switches the support of long file name (LFN). +/ +/ 0: Disable support of LFN. _MAX_LFN has no effect. +/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. +/ 2: Enable LFN with dynamic working buffer on the STACK. +/ 3: Enable LFN with dynamic working buffer on the HEAP. +/ +/ To enable the LFN, Unicode handling functions (option/unicode.c) must be added +/ to the project. The working buffer occupies (_MAX_LFN + 1) * 2 bytes and +/ additional 608 bytes at exFAT enabled. _MAX_LFN can be in range from 12 to 255. +/ It should be set 255 to support full featured LFN operations. +/ When use stack for the working buffer, take care on stack overflow. When use heap +/ memory for the working buffer, memory management functions, ff_memalloc() and +/ ff_memfree(), must be added to the project. */ + + +#define _LFN_UNICODE 0 +/* This option switches character encoding on the API. (0:ANSI/OEM or 1:UTF-16) +/ To use Unicode string for the path name, enable LFN and set _LFN_UNICODE = 1. +/ This option also affects behavior of string I/O functions. */ + + +#define _STRF_ENCODE 3 +/* When _LFN_UNICODE == 1, this option selects the character encoding ON THE FILE to +/ be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf(). +/ +/ 0: ANSI/OEM +/ 1: UTF-16LE +/ 2: UTF-16BE +/ 3: UTF-8 +/ +/ This option has no effect when _LFN_UNICODE == 0. */ + + +#define _FS_RPATH 2 +/* This option configures support of relative path. +/ +/ 0: Disable relative path and remove related functions. +/ 1: Enable relative path. f_chdir() and f_chdrive() are available. +/ 2: f_getcwd() function is available in addition to 1. +*/ + + +/*---------------------------------------------------------------------------/ +/ Drive/Volume Configurations +/---------------------------------------------------------------------------*/ + +#define _VOLUMES 1 +/* Number of volumes (logical drives) to be used. */ + + +#define _STR_VOLUME_ID 0 +#define _VOLUME_STRS "RAM","NAND","CF","SD","SD2","USB","USB2","USB3" +/* _STR_VOLUME_ID switches string support of volume ID. +/ When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive +/ number in the path name. _VOLUME_STRS defines the drive ID strings for each +/ logical drives. Number of items must be equal to _VOLUMES. Valid characters for +/ the drive ID strings are: A-Z and 0-9. */ + + +#define _MULTI_PARTITION 0 +/* This option switches support of multi-partition on a physical drive. +/ By default (0), each logical drive number is bound to the same physical drive +/ number and only an FAT volume found on the physical drive will be mounted. +/ When multi-partition is enabled (1), each logical drive number can be bound to +/ arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk() +/ funciton will be available. */ + + +#define _MIN_SS 512 +#define _MAX_SS 512 +/* These options configure the range of sector size to be supported. (512, 1024, +/ 2048 or 4096) Always set both 512 for most systems, all type of memory cards and +/ harddisk. But a larger value may be required for on-board flash memory and some +/ type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured +/ to variable sector size and GET_SECTOR_SIZE command must be implemented to the +/ disk_ioctl() function. */ + + +#define _USE_TRIM 0 +/* This option switches support of ATA-TRIM. (0:Disable or 1:Enable) +/ To enable Trim function, also CTRL_TRIM command should be implemented to the +/ disk_ioctl() function. */ + + +#define _FS_NOFSINFO 0 +/* If you need to know correct free space on the FAT32 volume, set bit 0 of this +/ option, and f_getfree() function at first time after volume mount will force +/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. +/ +/ bit0=0: Use free cluster count in the FSINFO if available. +/ bit0=1: Do not trust free cluster count in the FSINFO. +/ bit1=0: Use last allocated cluster number in the FSINFO if available. +/ bit1=1: Do not trust last allocated cluster number in the FSINFO. +*/ + + + +/*---------------------------------------------------------------------------/ +/ System Configurations +/---------------------------------------------------------------------------*/ + +#define _FS_TINY 0 +/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) +/ At the tiny configuration, size of file object (FIL) is reduced _MAX_SS bytes. +/ Instead of private sector buffer eliminated from the file object, common sector +/ buffer in the file system object (FATFS) is used for the file data transfer. */ + + +#define _FS_EXFAT 1 +/* This option switches support of exFAT file system. (0:Disable or 1:Enable) +/ When enable exFAT, also LFN needs to be enabled. (_USE_LFN >= 1) +/ Note that enabling exFAT discards C89 compatibility. */ + + +#define _FS_NORTC 0 +#define _NORTC_MON 1 +#define _NORTC_MDAY 1 +#define _NORTC_YEAR 2016 +/* The option _FS_NORTC switches timestamp functiton. If the system does not have +/ any RTC function or valid timestamp is not needed, set _FS_NORTC = 1 to disable +/ the timestamp function. All objects modified by FatFs will have a fixed timestamp +/ defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR in local time. +/ To enable timestamp function (_FS_NORTC = 0), get_fattime() function need to be +/ added to the project to get current time form real-time clock. _NORTC_MON, +/ _NORTC_MDAY and _NORTC_YEAR have no effect. +/ These options have no effect at read-only configuration (_FS_READONLY = 1). */ + + +#define _FS_LOCK 0 +/* The option _FS_LOCK switches file lock function to control duplicated file open +/ and illegal operation to open objects. This option must be 0 when _FS_READONLY +/ is 1. +/ +/ 0: Disable file lock function. To avoid volume corruption, application program +/ should avoid illegal open, remove and rename to the open objects. +/ >0: Enable file lock function. The value defines how many files/sub-directories +/ can be opened simultaneously under file lock control. Note that the file +/ lock control is independent of re-entrancy. */ + + +#define _FS_REENTRANT 0 +#define _FS_TIMEOUT 1000 +#define _SYNC_t HANDLE +/* The option _FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs +/ module itself. Note that regardless of this option, file access to different +/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() +/ and f_fdisk() function, are always not re-entrant. Only file/directory access +/ to the same volume is under control of this function. +/ +/ 0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect. +/ 1: Enable re-entrancy. Also user provided synchronization handlers, +/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() +/ function, must be added to the project. Samples are available in +/ option/syscall.c. +/ +/ The _FS_TIMEOUT defines timeout period in unit of time tick. +/ The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, +/ SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be +/ included somewhere in the scope of ff.h. */ + +/* #include // O/S definitions */ + + +/*--- End of configuration options ---*/ diff --git a/font b/font new file mode 100644 index 0000000..191ac46 Binary files /dev/null and b/font differ diff --git a/gcr.cpp b/gcr.cpp new file mode 100644 index 0000000..67f4547 --- /dev/null +++ b/gcr.cpp @@ -0,0 +1,1386 @@ +/* + gcr.c - Group Code Recording helper functions + + (C) 2001-2005 Markus Brenner + and Pete Rittwage + based on code by Andreas Boose + + V 0.30 created file based on n2d + V 0.31 improved error handling of convert_GCR_sector() + V 0.32 removed some functions, added sector-2-GCR conversion + V 0.33 improved sector extraction, added find_track_cycle() function + V 0.34 added MAX_SYNC_OFFSET constant, for better error conversion + V 0.35 improved find_track_cycle() function + V 0.36 added bad GCR code detection + V 0.36b improved find_sync(), added find_sector_gap(), find_sector0() + V 0.36c convert_GCR_sector: search good header before using a damaged one + improved find_track_cycle(), return max len if no cycle found + V 0.36d most additions/fixes referenced in mnib.c (pjr) +*/ + +#include +#include +#include +#include +#include "gcr.h" +#include "prot.h" +#include "debug.h" + +char sector_map_1541[MAX_TRACKS_1541 + 1] = { + 0, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, /* 1 - 10 */ + 21, 21, 21, 21, 21, 21, 21, 19, 19, 19, /* 11 - 20 */ + 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, /* 21 - 30 */ + 17, 17, 17, 17, 17, /* 31 - 35 */ + 17, 17, 17, 17, 17, 17, 17 /* 36 - 42 (non-standard) */ +}; + + +BYTE speed_map_1541[MAX_TRACKS_1541] = { + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 1 - 10 */ + 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, /* 11 - 20 */ + 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, /* 21 - 30 */ + 0, 0, 0, 0, 0, /* 31 - 35 */ + 0, 0, 0, 0, 0, 0, 0 /* 36 - 42 (non-standard) */ +}; + + +/* Burst Nibbler defaults +int capacity_min[] = { 6183, 6598, 7073, 7616 }; +int capacity[] = { 6231, 6646, 7121, 7664 }; +int capacity_max[] = { 6311, 6726, 7201, 7824 }; +*/ + +/* New calculated defaults: 296rpm, 300rpm, 304rpm */ +int capacity_min[] = { (int) (DENSITY0 / 303), (int) (DENSITY1 / 303), (int) (DENSITY2 / 303), (int) (DENSITY3 / 303) }; +int capacity[] = { (int) (DENSITY0 / 300), (int) (DENSITY1 / 300), (int) (DENSITY2 / 300), (int) (DENSITY3 / 300) }; +int capacity_max[] = { (int) (DENSITY0 / 296), (int) (DENSITY1 / 296), (int) (DENSITY2 / 296), (int) (DENSITY3 / 296) }; + +/* Nibble-to-GCR conversion table */ +static BYTE GCR_conv_data[16] = { + 0x0a, 0x0b, 0x12, 0x13, + 0x0e, 0x0f, 0x16, 0x17, + 0x09, 0x19, 0x1a, 0x1b, + 0x0d, 0x1d, 0x1e, 0x15 +}; + +/* GCR-to-Nibble conversion tables */ +static BYTE GCR_decode_high[32] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x00, 0x10, 0xff, 0xc0, 0x40, 0x50, + 0xff, 0xff, 0x20, 0x30, 0xff, 0xf0, 0x60, 0x70, + 0xff, 0x90, 0xa0, 0xb0, 0xff, 0xd0, 0xe0, 0xff +}; + +static BYTE GCR_decode_low[32] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x08, 0x00, 0x01, 0xff, 0x0c, 0x04, 0x05, + 0xff, 0xff, 0x02, 0x03, 0xff, 0x0f, 0x06, 0x07, + 0xff, 0x09, 0x0a, 0x0b, 0xff, 0x0d, 0x0e, 0xff +}; + + +int +find_sync(BYTE ** gcr_pptr, BYTE * gcr_end) +{ + while (1) + { + if ((*gcr_pptr) + 1 >= gcr_end) + { + *gcr_pptr = gcr_end; + return 0; /* not found */ + } + + // sync flag goes up after the 10th bit + if ( ((*gcr_pptr)[0] & 0x03) == 0x03 && (*gcr_pptr)[1] == 0xff) + break; + + (*gcr_pptr)++; + } + + (*gcr_pptr)++; + while (*gcr_pptr < gcr_end && **gcr_pptr == 0xff) + (*gcr_pptr)++; + return (*gcr_pptr < gcr_end); +} + +void +convert_4bytes_to_GCR(BYTE * buffer, BYTE * ptr) +{ + *ptr = GCR_conv_data[(*buffer) >> 4] << 3; + *ptr |= GCR_conv_data[(*buffer) & 0x0f] >> 2; + ptr++; + + *ptr = GCR_conv_data[(*buffer) & 0x0f] << 6; + buffer++; + *ptr |= GCR_conv_data[(*buffer) >> 4] << 1; + *ptr |= GCR_conv_data[(*buffer) & 0x0f] >> 4; + ptr++; + + *ptr = GCR_conv_data[(*buffer) & 0x0f] << 4; + buffer++; + *ptr |= GCR_conv_data[(*buffer) >> 4] >> 1; + ptr++; + + *ptr = GCR_conv_data[(*buffer) >> 4] << 7; + *ptr |= GCR_conv_data[(*buffer) & 0x0f] << 2; + buffer++; + *ptr |= GCR_conv_data[(*buffer) >> 4] >> 3; + ptr++; + + *ptr = GCR_conv_data[(*buffer) >> 4] << 5; + *ptr |= GCR_conv_data[(*buffer) & 0x0f]; +} + +int +convert_4bytes_from_GCR(BYTE * gcr, BYTE * plain) +{ + BYTE hnibble, lnibble; + int badGCR, nConverted; + + badGCR = 0; + + hnibble = GCR_decode_high[gcr[0] >> 3]; + lnibble = GCR_decode_low[((gcr[0] << 2) | (gcr[1] >> 6)) & 0x1f]; + if ((hnibble == 0xff || lnibble == 0xff) && !badGCR) + badGCR = 1; + *plain++ = hnibble | lnibble; + + hnibble = GCR_decode_high[(gcr[1] >> 1) & 0x1f]; + lnibble = GCR_decode_low[((gcr[1] << 4) | (gcr[2] >> 4)) & 0x1f]; + if ((hnibble == 0xff || lnibble == 0xff) && !badGCR) + badGCR = 2; + *plain++ = hnibble | lnibble; + + hnibble = GCR_decode_high[((gcr[2] << 1) | (gcr[3] >> 7)) & 0x1f]; + lnibble = GCR_decode_low[(gcr[3] >> 2) & 0x1f]; + if ((hnibble == 0xff || lnibble == 0xff) && !badGCR) + badGCR = 3; + *plain++ = hnibble | lnibble; + + hnibble = GCR_decode_high[((gcr[3] << 3) | (gcr[4] >> 5)) & 0x1f]; + lnibble = GCR_decode_low[gcr[4] & 0x1f]; + if ((hnibble == 0xff || lnibble == 0xff) && !badGCR) + badGCR = 4; + *plain++ = hnibble | lnibble; + + nConverted = (badGCR == 0) ? 4 : (badGCR - 1); + + return (nConverted); +} + +int +extract_id(BYTE * gcr_track, BYTE * id) +{ + BYTE header[10]; + BYTE *gcr_ptr, *gcr_end; + int track, sector; + + track = 18; + sector = 0; + gcr_ptr = gcr_track; + gcr_end = gcr_track + NIB_TRACK_LENGTH; + + do + { + if (!find_sync(&gcr_ptr, gcr_end)) + return (0); + + convert_4bytes_from_GCR(gcr_ptr, header); + convert_4bytes_from_GCR(gcr_ptr + 5, header + 4); + } while (header[0] != 0x08 || header[2] != sector || + header[3] != track); + + id[0] = header[5]; + id[1] = header[4]; + return (1); +} + +int +extract_cosmetic_id(BYTE * gcr_track, BYTE * id) +{ + BYTE secbuf[260]; + int error; + + /* get sector into buffer- we don't care about id mismatch here */ + error = convert_GCR_sector(gcr_track, gcr_track + NIB_TRACK_LENGTH, secbuf, 18, 0, id); + + /* no valid 18,0 sector */ + if(error != SECTOR_OK && error != ID_MISMATCH) + return (0); + + id[0] = secbuf[0xa3]; + id[1] = secbuf[0xa4]; + return (1); +} + +BYTE +convert_GCR_sector(BYTE * gcr_start, BYTE * gcr_cycle, BYTE * d64_sector, + int track, int sector, BYTE * id) +{ + BYTE header[10]; /* block header */ + BYTE hdr_chksum; /* header checksum */ + BYTE blk_chksum; /* block checksum */ + BYTE gcr_buffer[2 * NIB_TRACK_LENGTH]; + BYTE *gcr_ptr, *gcr_end, *gcr_last; + BYTE *sectordata; + BYTE error_code; + int sync_found, i, j, nConverted; + size_t track_len; + + error_code = SECTOR_OK; + + if (track > MAX_TRACK_D64) + return (0); + if (gcr_cycle == NULL || gcr_cycle <= gcr_start) + return (0); + + /* initialize sector data with Original Format Pattern */ + memset(d64_sector, 0x01, 260); + d64_sector[0] = 0x07; /* Block header mark */ + d64_sector[1] = 0x4b; /* Use Original Format Pattern */ + + for (blk_chksum = 0, i = 1; i < 257; i++) + blk_chksum ^= d64_sector[i + 1]; + d64_sector[257] = blk_chksum; + + /* copy to temp. buffer with twice the track data */ + track_len = gcr_cycle - gcr_start; + memcpy(gcr_buffer, gcr_start, track_len); + memcpy(gcr_buffer + track_len, gcr_start, track_len); + track_len *= 2; + + /* Check for at least one Sync */ + gcr_end = gcr_buffer + track_len; + sync_found = 0; + for (gcr_ptr = gcr_buffer; gcr_ptr < gcr_end; gcr_ptr++) + { + if (*gcr_ptr == 0xff) + { + if (sync_found < 2) + sync_found++; + } + else /* (*gcr_ptr != 0xff) */ + { + if (sync_found < 2) + sync_found = 0; + else + sync_found = 3; + } + } + if (sync_found != 3) + return (SYNC_NOT_FOUND); + + /* Check for missing SYNCs */ + gcr_last = gcr_ptr = gcr_buffer; + while (gcr_ptr < gcr_end) + { + find_sync(&gcr_ptr, gcr_end); + if ((gcr_ptr - gcr_last) > MAX_SYNC_OFFSET) + { + //printf("no sync for %d\n", gcr_ptr-gcr_last); + return (SYNC_NOT_FOUND); + } + else + gcr_last = gcr_ptr; + } + + /* Try to find a good block header for Track/Sector */ + gcr_ptr = gcr_buffer; + gcr_end = gcr_buffer + track_len; + + do + { + if (!find_sync(&gcr_ptr, gcr_end) || gcr_ptr >= gcr_end - 10) + { + error_code = HEADER_NOT_FOUND; + break; + } + convert_4bytes_from_GCR(gcr_ptr, header); + convert_4bytes_from_GCR(gcr_ptr + 5, header + 4); + gcr_ptr++; + + //printf("%0.2d: t%0.2d s%0.2d id1:%0.1x id2:%0.1x\n", + //header[0],header[3],header[2],header[5],header[4]); + } while (header[0] != 0x08 || header[2] != sector || + header[3] != track || header[5] != id[0] || header[4] != id[1]); + + if (error_code == HEADER_NOT_FOUND) + { + error_code = SECTOR_OK; + /* Try to find next best match for header */ + gcr_ptr = gcr_buffer; + gcr_end = gcr_buffer + track_len; + do + { + if (!find_sync(&gcr_ptr, gcr_end)) + return (HEADER_NOT_FOUND); + + if (gcr_ptr >= gcr_end - 10) + return (HEADER_NOT_FOUND); + + convert_4bytes_from_GCR(gcr_ptr, header); + convert_4bytes_from_GCR(gcr_ptr + 5, header + 4); + gcr_ptr++; + + } while (header[0] == 0x07 || header[2] != sector || header[3] != track); + } + + if (header[0] != 0x08) + error_code = (error_code == SECTOR_OK) ? HEADER_NOT_FOUND : error_code; + + /* Header checksum */ + hdr_chksum = 0; + for (i = 1; i <= 4; i++) + hdr_chksum = hdr_chksum ^ header[i]; + + if (hdr_chksum != header[5]) + { + //printf("(S%d HEAD_CHKSUM $%0.2x != $%0,2x) ", + // sector, hdr_chksum, header[5]); + error_code = (error_code == SECTOR_OK) ? + BAD_HEADER_CHECKSUM : error_code; + } + + // verify that our header contains no bad GCR, since it can be false positive checksum match + for(j = 0; j < 10; j++) + { + if (is_bad_gcr(gcr_ptr - 1, 10, j)) error_code = (error_code == SECTOR_OK) ? BAD_GCR_CODE : error_code; + } + + // next look for data portion + if (!find_sync(&gcr_ptr, gcr_end)) + return (DATA_NOT_FOUND); + + for (i = 0, sectordata = d64_sector; i < 65; i++) + { + if (gcr_ptr >= gcr_end - 5) + return (DATA_NOT_FOUND); + + if (4 != (nConverted = convert_4bytes_from_GCR(gcr_ptr, sectordata))) + { +#if 0 + // XXX Disabled for unknown reason. + if ((i < 64) || (nConverted == 0)) + error_code = BAD_GCR_CODE; +#endif + } + + gcr_ptr += 5; + sectordata += 4; + } + + /* check for correct disk ID */ + if (header[5] != id[0] || header[4] != id[1]) + error_code = (error_code == SECTOR_OK) ? ID_MISMATCH : error_code; + + /* check for Block header mark */ + if (d64_sector[0] != 0x07) + error_code = (error_code == SECTOR_OK) ? DATA_NOT_FOUND : error_code; + + /* Block checksum */ + for (i = 1, blk_chksum = 0; i <= 256; i++) + blk_chksum ^= d64_sector[i]; + + if (blk_chksum != d64_sector[257]) + { + //printf("(S%d DATA_CHKSUM $%0.2x != $%0.2x) ", + // sector, blk_chksum, d64_sector[257]); + error_code = (error_code == SECTOR_OK) ? BAD_DATA_CHECKSUM : error_code; + } + + // verify that our data contains no bad GCR, since it can be false positive checksum match + for(j = 0; j < 320; j++) + if (is_bad_gcr(gcr_ptr - 325, 320, j)) error_code = (error_code == SECTOR_OK) ? BAD_GCR_CODE : error_code; + + return (error_code); +} + +void +convert_sector_to_GCR(BYTE * buffer, BYTE * ptr, + int track, int sector, BYTE * diskID, int error) +{ + int i; + BYTE buf[4], databuf[0x104], chksum; + BYTE tempID[3]; + + memcpy(tempID, diskID, 3); + memset(ptr, 0x55, 361); /* 'unformat' GCR sector */ + + if (error == SYNC_NOT_FOUND) + return; + + if (error == HEADER_NOT_FOUND) + { + ptr += 24; + } + else + { + memset(ptr, 0xff, 5); /* Sync */ + ptr += 5; + + if (error == ID_MISMATCH) + { + tempID[0] ^= 0xff; + tempID[1] ^= 0xff; + } + + buf[0] = 0x08; /* Header identifier */ + buf[1] = sector ^ track ^ tempID[1] ^ tempID[0]; + buf[2] = (BYTE) sector; + buf[3] = (BYTE) track; + + if (error == BAD_HEADER_CHECKSUM) + buf[1] ^= 0xff; + + convert_4bytes_to_GCR(buf, ptr); + ptr += 5; + + buf[0] = tempID[1]; + buf[1] = tempID[0]; + buf[2] = buf[3] = 0x0f; + convert_4bytes_to_GCR(buf, ptr); + ptr += 5; + + memset(ptr, 0x55, 9); /* Header Gap */ + ptr += 9; + } + + if (error == DATA_NOT_FOUND) + return; + + memset(ptr, 0xff, 5); /* Sync */ + ptr += 5; + + chksum = 0; + databuf[0] = 0x07; + for (i = 0; i < 0x100; i++) + { + databuf[i + 1] = buffer[i]; + chksum ^= buffer[i]; + } + + if (error == BAD_DATA_CHECKSUM) + chksum ^= 0xff; + + databuf[0x101] = chksum; + databuf[0x102] = 0; /* 2 bytes filler */ + databuf[0x103] = 0; + + for (i = 0; i < 65; i++) + { + convert_4bytes_to_GCR(databuf + (4 * i), ptr); + ptr += 5; + } + + /* 7 0x55 gap bytes in my reference disk */ + memset(ptr, 0x55, 7); /* Gap before next sector */ + ptr += 7; +} + +size_t +find_track_cycle(BYTE ** cycle_start, BYTE ** cycle_stop, int cap_min, int cap_max) +{ + BYTE *nib_track; /* start of nibbled track data */ + BYTE *start_pos; /* start of periodic area */ + BYTE *cycle_pos; /* start of cycle repetition */ + BYTE *stop_pos; /* maximum position allowed for cycle */ + BYTE *data_pos; /* cycle search variable */ + BYTE *p1, *p2; /* local pointers for comparisons */ + + nib_track = *cycle_start; + stop_pos = nib_track + NIB_TRACK_LENGTH - gap_match_length; + cycle_pos = NULL; + + /* try to find a normal track cycle */ + for (start_pos = nib_track;; find_sync(&start_pos, stop_pos)) + { + if ((data_pos = start_pos + cap_min) >= stop_pos) + break; /* no cycle found */ + + while (find_sync(&data_pos, stop_pos)) + { + p1 = start_pos; + cycle_pos = data_pos; + + for (p2 = cycle_pos; p2 < stop_pos;) + { + /* try to match all remaining syncs, too */ + if (memcmp(p1, p2, gap_match_length) != 0) + { + cycle_pos = NULL; + break; + } + if (!find_sync(&p1, stop_pos)) + break; + if (!find_sync(&p2, stop_pos)) + break; + } + + if (cycle_pos != NULL && check_valid_data(data_pos, gap_match_length)) + { + *cycle_start = start_pos; + *cycle_stop = cycle_pos; + return (cycle_pos - start_pos); + } + } + } + + /* we got nothing useful, return it all */ + *cycle_start = nib_track; + *cycle_stop = nib_track + NIB_TRACK_LENGTH; + return NIB_TRACK_LENGTH; +} + +size_t +find_nondos_track_cycle(BYTE ** cycle_start, BYTE ** cycle_stop, int cap_min, + int cap_max) +{ + BYTE *nib_track; /* start of nibbled track data */ + BYTE *start_pos; /* start of periodic area */ + BYTE *cycle_pos; /* start of cycle repetition */ + BYTE *stop_pos; /* maximum position allowed for cycle */ + BYTE *p1, *p2; /* local pointers for comparisons */ + + nib_track = *cycle_start; + start_pos = nib_track; + stop_pos = nib_track + NIB_TRACK_LENGTH - gap_match_length; + cycle_pos = NULL; + + /* try to find a track cycle ignoring sync */ + for (p1 = start_pos; p1 < stop_pos; p1++) + { + /* now try to match it */ + for (p2 = p1 + cap_min; p2 < stop_pos; p2++) + { + /* try to match data */ + if (memcmp(p1, p2, gap_match_length) != 0) + cycle_pos = NULL; + else + cycle_pos = p2; + + /* we found one! */ + if (cycle_pos != NULL && check_valid_data(cycle_pos, gap_match_length)) + { + *cycle_start = p1; + *cycle_stop = cycle_pos; + return (cycle_pos - p1); + } + } + } + + /* we got nothing useful */ + *cycle_start = nib_track; + *cycle_stop = nib_track + NIB_TRACK_LENGTH; + return NIB_TRACK_LENGTH; +} + +int +check_valid_data(BYTE * data, int matchlen) +{ + //makes assumptions on whether this is good data to match cycles + int i, redund = 0; + + for (i = 0; i < matchlen; i++) + { + if (data[i] == data[i + 1] || data[i] == data[i + 2] || + data[i] == data[i + 3] || data[i] == data[i + 4]) + redund++; + } + + if (redund > 1) + return 0; + else + return 1; +} + +BYTE * +find_sector0(BYTE * work_buffer, int tracklen, size_t * p_sectorlen) +{ + BYTE *pos, *buffer_end, *sync_last; + + pos = work_buffer; + buffer_end = work_buffer + 2 * tracklen - 10; + *p_sectorlen = 0; + + if (!find_sync(&pos, buffer_end)) + return NULL; + sync_last = pos; + + /* try to find sector 0 */ + while (pos < buffer_end) + { + if (!find_sync(&pos, buffer_end)) + return NULL; + if (pos[0] == 0x52 && (pos[1] & 0xc0) == 0x40 && + (pos[2] & 0x0f) == 0x05 && (pos[3] & 0xfc) == 0x28) + { + *p_sectorlen = pos - sync_last; + break; + } + sync_last = pos; + } + + /* find last GCR byte before sync */ + do + { + pos -= 1; + if (pos == work_buffer) + pos += tracklen; + } while (*pos == 0xff); + + /* move to first sync byte */ + pos += 1; + while (pos >= work_buffer + tracklen) + pos -= tracklen; + + /* make sure sync is long enough or else shift back */ + //if(*(pos+1) != 0xff) pos -= 1; + + return pos; +} + +BYTE * +find_sector_gap(BYTE * work_buffer, int tracklen, size_t * p_sectorlen) +{ + size_t gap, maxgap; + BYTE *pos; + BYTE *buffer_end; + BYTE *sync_last; + BYTE *sync_max; + + pos = work_buffer; + buffer_end = work_buffer + 2 * tracklen - 10; + *p_sectorlen = 0; + + if (!find_sync(&pos, buffer_end)) + return NULL; + sync_last = pos; + maxgap = 0; + + /* try to find biggest (sector) gap */ + while (pos < buffer_end) + { + if (!find_sync(&pos, buffer_end)) + break; + gap = pos - sync_last; + if (gap > maxgap) + { + maxgap = gap; + sync_max = pos; + } + sync_last = pos; + } + *p_sectorlen = maxgap; + + if (maxgap == 0) + return NULL; /* no gap found */ + + /* find last GCR byte before sync */ + pos = sync_max; + do + { + pos -= 1; + if (pos == work_buffer) + pos += tracklen; + } while (*pos == 0xff); + + /* move to first sync GCR byte */ + pos += 1; + while (pos >= work_buffer + tracklen) + pos -= tracklen; + + /* make sure sync is long enough or else shift back */ + //if(*(pos+1) != 0xff) pos -= 1; + + return pos; +} + +// checks if there is any reasonable section of formatted (GCR) data +int +check_formatted(BYTE * gcrdata) +{ + int i, run = 0; + + /* try to find longest good gcr run */ + for (i = 0; i < NIB_TRACK_LENGTH; i++) + { + if (is_bad_gcr(gcrdata, NIB_TRACK_LENGTH, i)) + run = 0; + else + run++; + + if (run >= GCR_MIN_FORMATTED) + return 1; + + } + return 0; +} + +/* + Try to extract one complete cycle of GCR data from an 8kB buffer. + Align track to sector gap if possible, else align to sector 0, + else copy cyclic loop from begin of source. + If buffer has no good GCR, return tracklen = 0; + [Input] destination buffer, source buffer + [Return] length of copied track fragment + */ +int +extract_GCR_track(BYTE * destination, BYTE * source, int * align, + int force_align, size_t cap_min, size_t cap_max) +{ + BYTE work_buffer[NIB_TRACK_LENGTH*2]; /* working buffer */ + BYTE *cycle_start; /* start position of cycle */ + BYTE *cycle_stop; /* stop position of cycle */ + size_t track_len; + BYTE *sector0_pos; /* position of sector 0 */ + BYTE *sectorgap_pos;/* position of sector gap */ + BYTE *longsync_pos; /* position of longest sync run */ + BYTE *weakgap_pos; /* position of weak bit run */ + BYTE *marker_pos; /* generic marker used by protection handlers */ + size_t sector0_len; /* length of gap before sector 0 */ + size_t sectorgap_len; /* length of longest gap */ + + sector0_pos = NULL; + sectorgap_pos = NULL; + longsync_pos = NULL; + weakgap_pos = NULL; + marker_pos = NULL; + + cap_min -= CAP_MIN_ALLOWANCE; + + /* if this track doesn't have enough formatted data, return blank */ + if (!check_formatted(source)) return 0; + + cycle_start = source; + memset(work_buffer, 0, sizeof(work_buffer)); + memcpy(work_buffer, cycle_start, NIB_TRACK_LENGTH); + + /* find cycle */ + find_track_cycle(&cycle_start, &cycle_stop, cap_min, cap_max); + track_len = cycle_stop - cycle_start; + + /* second pass to find a cycle in track w/o syncs */ + if (track_len > cap_max || track_len < cap_min) + { + //printf("(N)"); + find_nondos_track_cycle(&cycle_start, &cycle_stop, cap_min, cap_max); + track_len = cycle_stop - cycle_start; + } + + /* copy twice the data to work buffer */ + memcpy(work_buffer, cycle_start, track_len); + memcpy(work_buffer + track_len, cycle_start, track_len); + + // forced track alignments + if (force_align != ALIGN_NONE) + { + if (force_align == ALIGN_VMAX) + { + *align = ALIGN_VMAX; + marker_pos = align_vmax(work_buffer, track_len); + } + + if (force_align == ALIGN_AUTOGAP) + { + *align = ALIGN_AUTOGAP; + marker_pos = auto_gap(work_buffer, track_len); + } + + if (force_align == ALIGN_LONGSYNC) + { + *align = ALIGN_LONGSYNC; + marker_pos = find_long_sync(work_buffer, track_len); + } + + if (force_align == ALIGN_WEAK) + { + *align = ALIGN_WEAK; + marker_pos = find_weak_gap(work_buffer, track_len); + } + + if (force_align == ALIGN_GAP) + { + *align = ALIGN_GAP; + marker_pos = find_sector_gap(work_buffer, track_len, §orgap_len); + } + + if (force_align == ALIGN_SEC0) + { + *align = ALIGN_SEC0;; + marker_pos = find_sector0(work_buffer, track_len, §or0_len); + } + + // we found a protection track + if (marker_pos) + { + memcpy(destination, marker_pos, track_len); + return (track_len); + } + } + + /* autogap tracks with no detected cycle */ + if (track_len == NIB_TRACK_LENGTH) + { + marker_pos = auto_gap(work_buffer, track_len); + if (marker_pos) + { + memcpy(destination, marker_pos, track_len); + *align = ALIGN_AUTOGAP; + return (track_len); + } + } + + /* try to guess original alignment on "normal" sized tracks */ + sector0_pos = find_sector0(work_buffer, track_len, §or0_len); + sectorgap_pos = find_sector_gap(work_buffer, track_len, §orgap_len); + + //if (sectorgap_len >= sector0_len + 0x40) /* Burstnibbler's calc */ + if (sectorgap_len > GCR_BLOCK_DATA_LEN + SIGNIFICANT_GAPLEN_DIFF) + { + *align = ALIGN_GAP; + memcpy(destination, sectorgap_pos, track_len); + return (track_len); + } + + // no good gap found, try sector 0 + if (sector0_len != 0) + { + *align = ALIGN_SEC0; + memcpy(destination, sector0_pos, track_len); + return (track_len); + } + + // no sector 0 found, use gap anyway + if (sectorgap_len) + { + memcpy(destination, sectorgap_pos, track_len); + *align = ALIGN_GAP; + return (track_len); + } + + // we aren't dealing with a normal track here, so autogap it + marker_pos = auto_gap(work_buffer, track_len); + if (marker_pos) + { + memcpy(destination, marker_pos, track_len); + *align = ALIGN_AUTOGAP; + return (track_len); + } + + // we give up, just return everything + memcpy(destination, work_buffer, track_len); + *align = ALIGN_NONE; + return (track_len); +} + +/* + * This strips exactly one byte at minrun from each + * eligible run when called. It can be called repeatedly + * for a proportional reduction. + */ +int +strip_runs(BYTE * buffer, int length, int minrun, BYTE target) +{ + int run, skipped; + BYTE *source, *end; + + run = 0; + skipped = 0; + end = buffer + length; + + for (source = buffer; source < end - 2; source++) + { + if (*source == target) + { + // fixed to only remove bytes before minimum amount of sync + if ( run == minrun && target == 0xff ) + skipped++; + else if ( run == minrun && *(source+2) == 0xff ) + skipped++; + else + *buffer++ = target; + + run++; + } + else + { + run = 0; + *buffer++ = *source; + } + } + return skipped; +} + +/* try to shorten inert data until length <= length_max */ +int +reduce_runs(BYTE * buffer, int length, int length_max, int minrun, + BYTE target) +{ + int skipped; + + do + { + if (length <= length_max) + return (length); + + skipped = strip_runs(buffer, length, minrun, target); + length -= skipped; + } + while (skipped > 0 && length > length_max); + + return (length); +} + +// this routine checks the track data and makes simple decisions +// about the special cases of being all sync or having no sync +int +check_sync_flags(BYTE * gcrdata, int density, int length) +{ + int i, syncs = 0; + + // check manually for SYNCKILL + for (i = 0; i < length; i++) + { + if (gcrdata[i] == 0xff) + syncs++; + } + + //printf("syncs: %d\n",syncs); + + if(!syncs) + return (density |= BM_NO_SYNC); + else if (syncs == length) + return (density |= BM_FF_TRACK); + else + return(density); +} + +int +compare_tracks(BYTE * track1, BYTE * track2, int length1, int length2, + int same_disk, char *outputstring) +{ + int match, j, k, sync_diff, presync_diff; + int gap_diff, weak_diff, size_diff; + char tmpstr[256]; + + match = 0; + j = 0; + k = 0; + sync_diff = 0; + presync_diff = 0; + gap_diff = 0; + weak_diff = 0; + size_diff= 0; + outputstring[0] = '\0'; + + if (length1 == length2 && 0 == memcmp(track1, track2, length1)) + match = 1; + + else if (length1 > 0 && length2 > 0) + { + for (j = k = 0; j < length2 && k < length1; j++, k++) + { + if (track1[j] == track2[k]) + continue; + + // we ignore sync length differences + if (track1[j] == 0xff) + { + sync_diff++; + k--; + continue; + } + + if (track2[k] == 0xff) + { + sync_diff++; + j--; + continue; + } + + // we ignore start of sync differences + if (j < length1 - 1 && k < length2 - 1) + { + if ((track1[j] & 0x01) == 0x01 && track1[j + 1] == 0xff) + { + presync_diff++; + k--; + continue; + } + + if ((track2[k] & 0x01) == 0x01 && track2[k + 1] == 0xff) + { + presync_diff++; + j--; + continue; + } + } + + // we ignore bad gcr bytes + if (is_bad_gcr(track1, length1, j) || + is_bad_gcr(track2, length2, k)) + { + weak_diff++; + j++; + k++; + continue; + } + + // it just didn't work out. :) + break; + } + + if (j < length1 - 1 || k < length2 - 1) + size_diff++; + + // we got to the end of one of them OK and not all sync/weak + if ((j >= length1 - 1 || k >= length2 - 1) && + (sync_diff < 0x100 && weak_diff < 0x100)) + match = 1; + } + + if (sync_diff) + { + sprintf(tmpstr, "(sync:%d)", sync_diff); + strcat(outputstring, tmpstr); + } + + if (presync_diff) + { + sprintf(tmpstr, "(presync:%d)", presync_diff); + strcat(outputstring, tmpstr); + } + + if (gap_diff) + { + sprintf(tmpstr, "(gap:%d)", gap_diff); + strcat(outputstring, tmpstr); + } + + if (weak_diff) + { + sprintf(tmpstr, "(weak:%d)", weak_diff); + strcat(outputstring, tmpstr); + } + + if (size_diff) + { + sprintf(tmpstr, "(size:%d)", size_diff); + strcat(outputstring, tmpstr); + } + + return match; +} + +int +compare_sectors(BYTE * track1, BYTE * track2, int length1, int length2, + BYTE * id1, BYTE * id2, int track, char * outputstring) +{ + int sec_match, numsecs; + int sector, error1, error2, i, empty; + BYTE checksum1, checksum2; + BYTE secbuf1[260], secbuf2[260]; + char tmpstr[256]; + + sec_match = 0; + numsecs = 0; + checksum1 = 0; + checksum2 = 0; + outputstring[0] = '\0'; + + // ignore dead tracks + if (!length1 || !length2 || length1 + length2 == 0x4000) + return 0; + + // check for sector matches + for (sector = 0; sector < sector_map_1541[track / 2]; sector++) + { + numsecs++; + + memset(secbuf1, 0, sizeof(secbuf1)); + memset(secbuf2, 0, sizeof(secbuf2)); + tmpstr[0] = '\0'; + + error1 = convert_GCR_sector(track1, track1 + length1, + secbuf1, track / 2, sector, id1); + + error2 = convert_GCR_sector(track2, track2 + length2, + secbuf2, track / 2, sector, id2); + + // compare data returned + checksum1 = checksum2 = empty = 0; + for (i = 2; i <= 256; i++) + { + checksum1 ^= secbuf1[i]; + checksum2 ^= secbuf2[i]; + + if (secbuf1[i] == 0x01) + empty++; + } + + // continue checking + if (checksum1 == checksum2 && error1 == error2 && empty < 254) + { + if(error1 == SECTOR_OK) + { + //sprintf(tmpstr,"S%d: std sector data match\n",sector); + } + else + { + sprintf(tmpstr,"S%d: non-std sector data match (%.2x)\n",sector, checksum1); + } + sec_match++; + } + else if (checksum1 == checksum2 && error1 == error2) + { + if(error1 == SECTOR_OK) + { + //sprintf(tmpstr,"S%d: empty sector match\n",sector); + sec_match++; + } + else + { + sprintf(tmpstr,"S%d: unrecognized sector (%.2x/%.2x)(%.2x/%.2x)\n",sector,checksum1,error1,checksum2,error2); + } + } + else + { + if (checksum1 != checksum2) + sprintf(tmpstr, + "S%d: data/error mismatch (%.2x/E%d)(%.2x/E%d)\n", sector, + checksum1, error1, checksum2, error2); + else + sprintf(tmpstr, + "S%d: error mismatch (E%d/E%d)\n", sector, + error1, error2); + + } + strcat(outputstring, tmpstr); + } + + if (sec_match == sector_map_1541[track / 2]) + return sec_match; + else + return 0; + +} + +// check for CBM DOS errors +int +check_errors(BYTE * gcrdata, int length, int track, BYTE * id, char * errorstring) +{ + int errors, sector, errorcode; + char tmpstr[16]; + BYTE secbuf[260]; + + errors = 0; + errorstring[0] = '\0'; + + for (sector = 0; sector < sector_map_1541[track/2]; sector++) + { + errorcode = convert_GCR_sector(gcrdata, gcrdata + length, secbuf, (track/2), sector, id); + + if (errorcode != SECTOR_OK) + { + errors++; + sprintf(tmpstr, "[E%dS%d]", errorcode, sector); + strcat(errorstring, tmpstr); + } + } + return errors; +} + +// check for CBM DOS empty sectors +int +check_empty(BYTE * gcrdata, int length, int track, BYTE * id, char * errorstring) +{ + int i, empty, sector, errorcode; + char tmpstr[16], temp_errorstring[256]; + BYTE secbuf[260]; + + empty = 0; + errorstring[0] = '\0'; + temp_errorstring[0] = '\0'; + + for (sector = 0; sector < sector_map_1541[track / 2]; sector++) + { + errorcode = convert_GCR_sector(gcrdata, gcrdata + length, secbuf, + (track / 2), sector, id); + + if (errorcode == SECTOR_OK) + { + /* checks for empty (unused) sector */ + for (i = 2; i <= 256; i++) + { + if (secbuf[i] != 0x01) + { + //printf("%d:%0.2x ",i,secbuf[i]); + break; + } + } + + if (i == 257) + { + sprintf(tmpstr, "%d-", sector); + strcat(temp_errorstring, tmpstr); + empty++; + } + } + } + + if (empty) + sprintf(errorstring, "EMPTY:%d (%s)", empty, temp_errorstring); + + return (empty); +} + +/* + * Replace 'srcbyte' by 'dstbyte' + * Returns total number of bytes replaced + */ +int +replace_bytes(BYTE * buffer, int length, BYTE srcbyte, BYTE dstbyte) +{ + int i, replaced; + + replaced = 0; + + for (i = 0; i < length; i++) + { + if (buffer[i] == srcbyte) + { + buffer[i] = dstbyte; + replaced++; + } + } + return replaced; +} + +// Check if byte at pos contains a 000 bit combination +int +is_bad_gcr(BYTE * gcrdata, size_t length, size_t pos) +{ + unsigned int lastbyte, mask, data; + + lastbyte = (pos == 0) ? gcrdata[length - 1] : gcrdata[pos - 1]; + data = ((lastbyte & 0x03) << 8) | gcrdata[pos]; + + for (mask = (7 << 7); mask >= 7; mask >>= 1) + { + if ((data & mask) == 0) + break; + } + return (mask >= 7); +} + +/* + * Check and "correct" bad GCR bits: + * substitute bad GCR bytes by 0x00 until next good GCR byte + * when two in a row or row+1 occur (bad bad -or- bad good bad) + * + * all known disks that use this for protection break out + * of it with $55, $AA, or $FF byte. + * + * fix_first, fix_last not used because while "correct", the real hardware + * is not this precise and it fails the protection checks sometimes. + */ +int +check_bad_gcr(BYTE * gcrdata, int length, int fix) +{ + /* state machine definitions */ + enum ebadgcr { S_BADGCR_OK, S_BADGCR_ONCE_BAD, S_BADGCR_LOST }; + + int i, lastpos; + enum ebadgcr sbadgcr; + int total, b_badgcr, n_badgcr; + + i = 0; + total = 0; + lastpos = length - 1; + + if (is_bad_gcr(gcrdata, length, length - 1)) + sbadgcr = S_BADGCR_ONCE_BAD; + else + sbadgcr = S_BADGCR_OK; + + for (i = 0; i < length - 1; i++) + { + b_badgcr = is_bad_gcr(gcrdata, length, i); + n_badgcr = is_bad_gcr(gcrdata, length, i + 1); + + switch (sbadgcr) + { + case S_BADGCR_OK: + if (b_badgcr) + { + total++; + //sbadgcr = S_BADGCR_ONCE_BAD; + sbadgcr = S_BADGCR_LOST; + } + break; + + case S_BADGCR_ONCE_BAD: + if (b_badgcr || n_badgcr) + { + sbadgcr = S_BADGCR_LOST; + //if(fix) fix_first_gcr(gcrdata, length, lastpos); + if (fix) + gcrdata[lastpos] = 0x00; + total++; + } + else + sbadgcr = S_BADGCR_OK; + break; + + case S_BADGCR_LOST: + if (b_badgcr || n_badgcr) + { + if (fix) + gcrdata[lastpos] = 0x00; + } + else + { + sbadgcr = S_BADGCR_OK; + //if(fix) fix_last_gcr(gcrdata, length, lastpos); + if (fix) + gcrdata[lastpos] = 0x00; + } + total++; + break; + } + lastpos = i; + } + + // clean up after last byte; lastpos = length - 1 + b_badgcr = is_bad_gcr(gcrdata, length, 0); + n_badgcr = is_bad_gcr(gcrdata, length, 1); + switch (sbadgcr) + { + case S_BADGCR_OK: + break; + + case S_BADGCR_ONCE_BAD: + if (b_badgcr || n_badgcr) + { + //if(fix) fix_first_gcr(gcrdata, length, lastpos); + if (fix) + gcrdata[lastpos] = 0x00; + total++; + } + break; + + case S_BADGCR_LOST: + if (b_badgcr || n_badgcr) + gcrdata[lastpos] = 0x00; + else + { + //if(fix) fix_last_gcr(gcrdata, length, lastpos); + if (fix) + gcrdata[lastpos] = 0x00; + } + total++; + break; + } + return total; +} diff --git a/gcr.h b/gcr.h new file mode 100644 index 0000000..31541de --- /dev/null +++ b/gcr.h @@ -0,0 +1,162 @@ +/* + gcr.h - Group Code Recording helper functions + + (C) 2001-05 Markus Brenner + and Pete Rittwage + based on code by Andreas Boose + + V 0.33 improved sector extraction, added find_track_cycle() function + V 0.34 added MAX_SYNC_OFFSET constant, approximated to 800 GCR bytes + V 0.35 modified find_track_cycle() interface + V 0.36 added bad GCR code detection + V 0.36a added find_sector_gap(), find_sector0(), extract_GCR_track() + V 0.36d Untold number of additions and consequent bugfixes. (pjr) + +*/ + +#ifndef _GCR_ +#define _GCR_ + +#include "integer.h" /* Basic integer types */ + +//#define BYTE unsigned char +//#define DWORD unsigned int +#define MAX_TRACKS_1541 42 +#define MAX_TRACKS_1571 (MAX_TRACKS_1541 * 2) +#define MAX_HALFTRACKS_1541 (MAX_TRACKS_1541 * 2) +#define MAX_HALFTRACKS_1571 (MAX_TRACKS_1571 * 2) + +/* D64 constants */ +#define BLOCKSONDISK 683 +#define BLOCKSEXTRA 85 +#define MAXBLOCKSONDISK (BLOCKSONDISK+BLOCKSEXTRA) +#define MAX_TRACK_D64 40 + +/* G64 constants (only needed for current VICE support */ +#define G64_TRACK_MAXLEN 7928 +#define G64_TRACK_LENGTH (G64_TRACK_MAXLEN+2) + +/* NIB format constants */ +#define NIB_TRACK_LENGTH 0x2000 +#define NIB_HEADER_SIZE 0xFF + +/* + number of GCR bytes until NO SYNC error + timer counts down from $d000 to $8000 (20480 cycles) + until timeout when waiting for a SYNC signal + This is approx. 20.48 ms, which is approx 1/10th disk revolution + 8000 GCR bytes / 10 = 800 bytes +*/ +//#define MAX_SYNC_OFFSET 800 +/* this was too small for Lode Runner original (805), so increase to 820 */ +//#define MAX_SYNC_OFFSET 820 +#define MAX_SYNC_OFFSET 0x1500 + +#define SIGNIFICANT_GAPLEN_DIFF 0x20 + +#define GCR_BLOCK_HEADER_LEN 24 +#define GCR_BLOCK_DATA_LEN 337 +#define GCR_BLOCK_LEN (GCR_BLOCK_HEADER_LEN + GCR_BLOCK_DATA_LEN) + +/* To calculate the bytes per rotation: + + 4,000,000 * 60 + b/minute = ------------------------------------------------ = x bytes/minute + speed_zone_divisor * 8bits + +4,000,000 is the base clock frequency divided by 4. +8 is the number of bits per byte. +60 gets us to a minute of data, which we can then divide by RPM to +get our numbers. + +speed zone divisors are 13, 14, 15, 16 for densities 3, 2, 1, 0 respectively +*/ + +#define DENSITY3 2307692.308 // bytes per minute +#define DENSITY2 2142857.143 +#define DENSITY1 2000000.000 +#define DENSITY0 1875000.000 + +/* Some disks have much less data than we normally expect to be able to write at a given density. + It's like short tracks, but it's a mastering issue not a protection. + This keeps us from getting errors in the track cycle detection */ +#define CAP_MIN_ALLOWANCE 150 + +/* minimum amount of good sequential GCR for formatted track */ +#define GCR_MIN_FORMATTED 64 // chessmaster track 29 is shortest so far + +/* Disk Controller error codes */ +#define SECTOR_OK 0x01 +#define HEADER_NOT_FOUND 0x02 +#define SYNC_NOT_FOUND 0x03 +#define DATA_NOT_FOUND 0x04 +#define BAD_DATA_CHECKSUM 0x05 +#define BAD_GCR_CODE 0x06 +#define VERIFY_ERROR 0x07 +#define WRITE_PROTECTED 0x08 +#define BAD_HEADER_CHECKSUM 0x09 +#define ID_MISMATCH 0x0b +#define DISK_NOT_INSERTED 0x0f + +#define BM_MATCH 0x10 +#define BM_NO_CYCLE 0x20 +#define BM_NO_SYNC 0x40 +#define BM_FF_TRACK 0x80 + +#define ALIGN_NONE 0 +#define ALIGN_GAP 1 +#define ALIGN_SEC0 2 +#define ALIGN_LONGSYNC 3 +#define ALIGN_WEAK 4 +#define ALIGN_VMAX 5 +#define ALIGN_AUTOGAP 6 + +#define GCR_MASK_BAD_FIRST 0 +#define GCR_MASK_BAD_LAST 1 + +/* global variables */ +extern char sector_map_1541[]; +extern BYTE speed_map_1541[]; +extern int capacity[]; +extern int capacity_min[]; +extern int capacity_max[];\ +extern int gap_match_length; + +/* prototypes */ +int find_sync(BYTE ** gcr_pptr, BYTE * gcr_end); +void convert_4bytes_to_GCR(BYTE * buffer, BYTE * ptr); +int convert_4bytes_from_GCR(BYTE * gcr, BYTE * plain); +int extract_id(BYTE * gcr_track, BYTE * id); +int extract_cosmetic_id(BYTE * gcr_track, BYTE * id); +size_t find_track_cycle(BYTE ** cycle_start, BYTE ** cycle_stop, int cap_min, + int cap_max); +size_t find_nondos_track_cycle(BYTE ** cycle_start, BYTE ** cycle_stop, + int cap_min, int cap_max); +BYTE convert_GCR_sector(BYTE * gcr_start, BYTE * gcr_end, + BYTE * d64_sector, int track, int sector, BYTE * id); +void convert_sector_to_GCR(BYTE * buffer, BYTE * ptr, + int track, int sector, BYTE * diskID, int error); +BYTE * find_sector_gap(BYTE * work_buffer, int tracklen, size_t * p_sectorlen); +BYTE * find_sector0(BYTE * work_buffer, int tracklen, size_t * p_sectorlen); +int extract_GCR_track(BYTE * destination, BYTE * source, int * align, + int force_align, size_t cap_min, size_t cap_max); +int replace_bytes(BYTE * buffer, int length, BYTE srcbyte, BYTE dstbyte); +int check_bad_gcr(BYTE * gcrdata, int length, int fix); +int check_sync_flags(BYTE * gcrdata, int density, int length); +void bitshift(BYTE * gcrdata, int length, int bits); +int check_errors(BYTE * gcrdata, int length, int track, BYTE * id, + char * errorstring); +int check_empty(BYTE * gcrdata, int length, int track, BYTE * id, + char * errorstring); +int compare_tracks(BYTE * track1, BYTE * track2, int length1, int length2, + int same_disk, char * outputstring); +int compare_sectors(BYTE * track1, BYTE * track2, int length1, int length2, + BYTE * id1, BYTE * id2, int track, char * outputstring); +int strip_runs(BYTE * buffer, int length, int minrun, BYTE target); +int reduce_runs(BYTE * buffer, int length, int length_max, int minrun, + BYTE target); +int is_bad_gcr(BYTE * gcrdata, size_t length, size_t pos); +int check_formatted(BYTE * gcrdata); +int check_valid_data(BYTE * data, int length); + +#endif diff --git a/iec_bus.cpp b/iec_bus.cpp new file mode 100644 index 0000000..05a0910 --- /dev/null +++ b/iec_bus.cpp @@ -0,0 +1,126 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#include "iec_bus.h" + +u32 IEC_Bus::PIGPIO_MASK_IN_ATN = 1 << PIGPIO_ATN; +u32 IEC_Bus::PIGPIO_MASK_IN_DATA = 1 << PIGPIO_DATA; +u32 IEC_Bus::PIGPIO_MASK_IN_CLOCK = 1 << PIGPIO_CLOCK; +u32 IEC_Bus::PIGPIO_MASK_IN_SRQ = 1 << PIGPIO_SRQ; +u32 IEC_Bus::PIGPIO_MASK_IN_RESET = 1 << PIGPIO_RESET; + +bool IEC_Bus::PI_Atn = false; +bool IEC_Bus::PI_Data = false; +bool IEC_Bus::PI_Clock = false; +bool IEC_Bus::PI_Reset = false; + +bool IEC_Bus::VIA_Atna = false; +bool IEC_Bus::VIA_Data = false; +bool IEC_Bus::VIA_Clock = false; + +bool IEC_Bus::DataSetToOut = false; +bool IEC_Bus::AtnaDataSetToOut = false; +bool IEC_Bus::ClockSetToOut = false; + +bool IEC_Bus::OutputLED = false; +bool IEC_Bus::OutputSound = false; + +bool IEC_Bus::Resetting = false; + +bool IEC_Bus::splitIECLines = false; +bool IEC_Bus::invertIECInputs = false; + +u32 IEC_Bus::myOutsGPFSEL1 = 0; +u32 IEC_Bus::myOutsGPFSEL0 = 0; +bool IEC_Bus::InputButton[5]; +bool IEC_Bus::InputButtonPrev[5]; +u32 IEC_Bus::validInputCount[5]; +u32 IEC_Bus::inputRepeatThreshold[5]; +u32 IEC_Bus::inputRepeat[5]; +u32 IEC_Bus::inputRepeatPrev[5]; + +m6522* IEC_Bus::VIA = 0; + +void IEC_Bus::Read(void) +{ + IOPort* portB = 0; + unsigned gplev0 = read32(ARM_GPIO_GPLEV0); + + int index; + int buttonCount = sizeof(ButtonPinFlags) / sizeof(unsigned); + for (index = 0; index < buttonCount; ++index) + { + UpdateButton(index, gplev0); + } + + if (VIA) portB = VIA->GetPortB(); + + bool ATNIn = (gplev0 & PIGPIO_MASK_IN_ATN) == (invertIECInputs ? PIGPIO_MASK_IN_ATN : 0); + if (PI_Atn != ATNIn) + { + PI_Atn = ATNIn; + + if (VIA) + { + if ((portB->GetDirection() & 0x10) != 0) + { + // Emulate the XOR gate UD3 + // We only need to do this when fully emulating, iec commands do this internally + AtnaDataSetToOut = (VIA_Atna != PI_Atn); + } + + portB->SetInput(VIAPORTPINS_ATNIN, ATNIn); //is inverted and then connected to pb7 and ca1 + VIA->InputCA1(ATNIn); + } + } + + if (portB && (portB->GetDirection() & 0x10) == 0) + AtnaDataSetToOut = false; // If the ATNA PB4 gets set to an input then we can't be pulling data low. (Maniac Mansion does this) + + if (!AtnaDataSetToOut && !DataSetToOut) // only sense if we have not brought the line low (because we can't as we have the pin set to output but we can simulate in software) + { + bool DATAIn = (gplev0 & PIGPIO_MASK_IN_DATA) == (invertIECInputs ? PIGPIO_MASK_IN_DATA : 0); + if (PI_Data != DATAIn) + { + PI_Data = DATAIn; + if (VIA) portB->SetInput(VIAPORTPINS_DATAIN, DATAIn); // VIA DATAin pb0 output from inverted DIN 5 DATA + } + } + else + { + PI_Data = true; + if (VIA) portB->SetInput(VIAPORTPINS_DATAIN, true); // simulate the read in software + } + + if (!ClockSetToOut) // only sense if we have not brought the line low (because we can't as we have the pin set to output but we can simulate in software) + { + bool CLOCKIn = (gplev0 & PIGPIO_MASK_IN_CLOCK) == (invertIECInputs ? PIGPIO_MASK_IN_CLOCK : 0); + if (PI_Clock != CLOCKIn) + { + PI_Clock = CLOCKIn; + if (VIA) portB->SetInput(VIAPORTPINS_CLOCKIN, CLOCKIn); // VIA CLKin pb2 output from inverted DIN 4 CLK + } + } + else + { + PI_Clock = true; + if (VIA) portB->SetInput(VIAPORTPINS_CLOCKIN, true); // simulate the read in software + } + + Resetting = (gplev0 & PIGPIO_MASK_IN_RESET) == (invertIECInputs ? PIGPIO_MASK_IN_RESET : 0); +} diff --git a/iec_bus.h b/iec_bus.h new file mode 100644 index 0000000..b8d2f31 --- /dev/null +++ b/iec_bus.h @@ -0,0 +1,602 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef IEC_BUS_H +#define IEC_BUS_H + +#include "debug.h" +#include "m6522.h" + +#include "rpi-gpio.h" +#include "rpiHardware.h" + +#define INPUT_BUTTON_DEBOUNCE_THRESHOLD 20000 +#define INPUT_BUTTON_REPEAT_THRESHOLD 460000 + +// DIN ATN is inverted and then connected to pb7 and ca1 +// - also input to xor with ATNAout pb4 +// - output of xor is inverted and connected to DIN pin 5 DATAout (OC so can only pull low) +// VIA ATNin pb7 input to xor +// VIA ATNin ca1 output from inverted DIN 3 ATN +// DIN DATA is inverted and then connected to pb1 +// VIA DATAin pb0 output from inverted DIN 5 DATA +// VIA DATAout pb1 inverted and then connected to DIN DATA +// DIN CLK is inverted and then connected to pb2 +// VIA CLKin pb2 output from inverted DIN 4 CLK +// VIA CLKout pb3 inverted and then connected to DIN CLK + +// $1800 +// PB 0 data in +// PB 1 data out +// PB 2 clock in +// PB 3 clock out +// PB 4 ATNA +// PB 5,6 device address +// PB 7,CA1 ATN IN + +// If ATN and ATNA are out of sync +// - VIA's DATA IN will automatically set high and hence the DATA line will be pulled low (activated) +// If ATN and ATNA are in sync +// - the output from the XOR gate will be low and the output of its inverter will go high +// - when this occurs the DATA line must be still able to be pulled low via the PC or VIA's inverted PB1 (DATA OUT) +// +// Therefore in the same vein if PB7 is set to output it could cause the input of the XOR to be pulled low +// + +enum PIGPIO +{ + // Original Non-split lines + PIGPIO_ATN = 2, // 3 + PIGPIO_DATA = 18, // 12 + PIGPIO_CLOCK = 17, // 11 + PIGPIO_SRQ = 19, // 35 + PIGPIO_RESET = 3, // 5 + + + // Pinout for those that want to split the lines (and the common ones like buttons, sound and LED) + // 0 IDSC //28 + // 1 IDSD //27 + // 2 I2C_SDA //3 + // 3 I2C_CLK //5 + PIGPIO_IN_BUTTON4 = 4, // 07 Common + PIGPIO_IN_BUTTON5 = 5, // 29 Common + PIGPIO_OUT_RESET = 6, // 31 + // 7 SPI0_CS1 //26 + // 8 SPI0_CS0 //24 + // 9 SPI0_MISO //21 + // 10 SPI0_MOSI //19 + // 11 SPI0_CLK //23 + PIGPIO_OUT_ATN = 12, // 32 + PIGPIO_OUT_SOUND = 13, // 33 Common + // 14 TX //8 + // 15 RX //10 + PIGPIO_OUT_LED = 16, // 36 Common + PIGPIO_OUT_CLOCK = 17, // 11 + PIGPIO_OUT_DATA = 18, // 12 + PIGPIO_OUT_SRQ = 19, // 35 + PIGPIO_IN_RESET = 20, // 38 + PIGPIO_IN_SRQ = 21, // 40 + PIGPIO_IN_BUTTON2 = 22, // 15 Common + PIGPIO_IN_BUTTON3 = 23, // 16 Common + PIGPIO_IN_ATN = 24, // 18 + PIGPIO_IN_DATA = 25, // 22 + PIGPIO_IN_CLOCK = 26, // 37 + PIGPIO_IN_BUTTON1 = 27 // 13 Common +}; + +enum PIGPIOMasks +{ + // Non-split lines + //PIGPIO_MASK_IN_ATN = 1 << PIGPIO_ATN, + //PIGPIO_MASK_IN_DATA = 1 << PIGPIO_DATA, + //PIGPIO_MASK_IN_CLOCK = 1 << PIGPIO_CLOCK, + //PIGPIO_MASK_IN_SRQ = 1 << PIGPIO_SRQ, + //PIGPIO_MASK_IN_RESET = 1 << PIGPIO_RESET, + + // Split lines + //PIGPIO_MASK_IN_ATN = 1 << PIGPIO_IN_ATN, + //PIGPIO_MASK_IN_DATA = 1 << PIGPIO_IN_DATA, + //PIGPIO_MASK_IN_CLOCK = 1 << PIGPIO_IN_CLOCK, + //PIGPIO_MASK_IN_SRQ = 1 << PIGPIO_IN_SRQ, + //PIGPIO_MASK_IN_RESET = 1 << PIGPIO_IN_RESET, + + PIGPIO_MASK_IN_BUTTON1 = 1 << PIGPIO_IN_BUTTON1, + PIGPIO_MASK_IN_BUTTON2 = 1 << PIGPIO_IN_BUTTON2, + PIGPIO_MASK_IN_BUTTON3 = 1 << PIGPIO_IN_BUTTON3, + PIGPIO_MASK_IN_BUTTON4 = 1 << PIGPIO_IN_BUTTON4, + PIGPIO_MASK_IN_BUTTON5 = 1 << PIGPIO_IN_BUTTON5, +}; + +static const unsigned ButtonPinFlags[5] = { PIGPIO_MASK_IN_BUTTON1, PIGPIO_MASK_IN_BUTTON2, PIGPIO_MASK_IN_BUTTON3, PIGPIO_MASK_IN_BUTTON4, PIGPIO_MASK_IN_BUTTON5 }; + +/////////////////////////////////////////////////////////////////////////////////////////////// +// Original Non-split lines +/////////////////////////////////////////////////////////////////////////////////////////////// +// I kind of stuffed up selecting what pins should be what. +// Originally I wanted the hardware interface to be as simple as possible and was focused on all the connections down one end of the Pi header. +// Also, originally I was only worried about ATN, DATA, CLOCK and RESET. Buttons were optional. With DATA and CLOCK only needing to go output. +// With hindsight (now wanting to support NIBTools ATN should have been put in the same pin group as DATA and CLOCK); +// This now requires 2 GPIO writes as PIN2 is in SEL0 and pins 17 and 18 are in SEL1. +//GPFSEL0 +// 9 8 7 6 5 4 3 2 1 0 +// 000 000 000 000 000 000 000 001 000 000 +// To support NIBTools ATN can be made an output as well +static const u32 PI_OUTPUT_MASK_GPFSEL0 = ~((1 << (PIGPIO_ATN * 3))); +//GPFSEL1 RX TX +// 19 18 17 16 15 14 13 12 11 10 +// 000 001 001 000 000 000 000 000 000 000 (bits 21 and 24 for GPIO 17 and 18 as outputs) +//static const u32 PI_OUTPUT_MASK_GPFSEL1 = ~((1 << 21) | (1 << 24)); +// 000 001 001 001 000 000 001 000 000 000 (bits 21 and 24 for GPIO 17 and 18 as outputs) +//static const u32 PI_OUTPUT_MASK_GPFSEL1 = ~((1 << ((PIGPIO_OUT_SOUND - 10) * 3)) | (1 << ((PIGPIO_OUT_LED - 10) * 3)) | (1 << ((PIGPIO_CLOCK - 10) * 3)) | (1 << ((PIGPIO_DATA - 10) * 3))); +static const u32 PI_OUTPUT_MASK_GPFSEL1 = ~((1 << ((PIGPIO_CLOCK - 10) * 3)) | (1 << ((PIGPIO_DATA - 10) * 3))); +/////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////// +// Pinout for those that want to split the lines (and the common ones like buttons, sound and LED) +/////////////////////////////////////////////////////////////////////////////////////////////// +// OUT (need 7) +// CLK +// DATA +// SRQ +// ATN +// RST +// LED +// SND + +// IN (need 10) +// CLK +// DATA +// ATN +// RST +// SRQ +// BTN1 +// BTN2 +// BTN3 +// BTN4 +// BTN5 + +//GPFSEL0 +// S S S +// P P P I I +// I I I 2 2 +// 0 0 0 C C +// M C C S S I I +// I E E C D D D +// S 0 1 W R R L A S S +// O RST B5 B4 1 1 D C +// 9 8 7 6 5 4 3 2 1 0 +//GPFSEL1 +// RX TX S S +// RX TX P P +// RX TX I I +// RX TX 0 0 +// RX TX M +// RX TX C O +// W W W W RX TX W W L S +// SRQ DTA CLK LED RX TX SND ATN K I +// 19 18 17 16 15 14 13 12 11 10 +//GPFSEL2 +// X X +// X X +// X X +// X X +// X X +// X X +// X X R R R R R R R R +// X X B1 CLK DTA ATN B3 B2 SRQ RST +// 29 28 27 26 25 24 23 22 21 20 +// 000 000 000 000 000 000 000 000 000 000 +/////////////////////////////////////////////////////////////////////////////////////////////// + +enum VIAPortPins +{ + VIAPORTPINS_DATAIN = 0x01, //pb0 + VIAPORTPINS_DATAOUT = 0x02, //pb1 + VIAPORTPINS_CLOCKIN = 0x04, //pb2 + VIAPORTPINS_CLOCKOUT = 0x08,//pb3 + VIAPORTPINS_ATNAOUT = 0x10, //pb4 + VIAPORTPINS_DEVSEL0 = 0x20, //pb5 + VIAPORTPINS_DEVSEL1 = 0x40, //pb5 + VIAPORTPINS_ATNIN = 0x80 //bp7 +}; + +typedef bool(*CheckStatus)(); + +class IEC_Bus +{ +public: + static inline void Initialise(void) + { + volatile int index; // Force a real delay in the loop below. + + // Clear all outputs to 0 + write32(ARM_GPIO_GPCLR0, 0xFFFFFFFF); + + if (!splitIECLines) + { + // This means that when any pin is turn to output it will output a 0 and pull lines low (ie an activation state on the IEC bus) + // Note: on the IEC bus you never output a 1 you simply tri state and it will be pulled up to a 1 (ie inactive state on the IEC bus) if no one else is pulling it low. + + myOutsGPFSEL0 = read32(ARM_GPIO_GPFSEL0); + myOutsGPFSEL1 = read32(ARM_GPIO_GPFSEL1); + + myOutsGPFSEL1 |= (1 << ((PIGPIO_OUT_LED - 10) * 3)); + myOutsGPFSEL1 |= (1 << ((PIGPIO_OUT_SOUND - 10) * 3)); + } + else + { + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_IN_BUTTON4, FS_INPUT); + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_IN_BUTTON5, FS_INPUT); + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_IN_RESET, FS_INPUT); + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_IN_SRQ, FS_INPUT); + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_IN_BUTTON2, FS_INPUT); + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_IN_BUTTON3, FS_INPUT); + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_IN_ATN, FS_INPUT); + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_IN_DATA, FS_INPUT); + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_IN_CLOCK, FS_INPUT); + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_IN_BUTTON1, FS_INPUT); + + + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_OUT_RESET, FS_OUTPUT); + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_OUT_ATN, FS_OUTPUT); + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_OUT_SOUND, FS_OUTPUT); + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_OUT_LED, FS_OUTPUT); + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_OUT_CLOCK, FS_OUTPUT); + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_OUT_DATA, FS_OUTPUT); + RPI_SetGpioPinFunction((rpi_gpio_pin_t)PIGPIO_OUT_SRQ, FS_OUTPUT); + } + + + // Set up audio. + write32(CM_PWMDIV, CM_PASSWORD + 0x2000); + write32(CM_PWMCTL, CM_PASSWORD + CM_ENAB + CM_SRC_OSCILLATOR); // Use Default 100MHz Clock + // Set PWM + write32(PWM_RNG1, 0x1B4); // 8bit 44100Hz Mono + write32(PWM_RNG2, 0x1B4); + write32(PWM_CTL, PWM_USEF2 + PWM_PWEN2 + PWM_USEF1 + PWM_PWEN1 + PWM_CLRF1); + + + int buttonCount = sizeof(ButtonPinFlags) / sizeof(unsigned); + for (index = 0; index < buttonCount; ++index) + { + InputButton[index] = false; + InputButtonPrev[index] = false; + validInputCount[index] = 0; + inputRepeatThreshold[index] = INPUT_BUTTON_REPEAT_THRESHOLD; + inputRepeat[index] = 0; + inputRepeatPrev[index] = 0; + } + + // Enable the internal pullups for the input button pins using the method described in BCM2835-ARM-Peripherals manual. + RPI_GpioBase->GPPUD = 2; + for (index = 0; index < 150; ++index) + { + } + RPI_GpioBase->GPPUDCLK0 = PIGPIO_MASK_IN_BUTTON1 | PIGPIO_MASK_IN_BUTTON2 | PIGPIO_MASK_IN_BUTTON3 | PIGPIO_MASK_IN_BUTTON4 | PIGPIO_MASK_IN_BUTTON5; + for (index = 0; index < 150; ++index) + { + } + RPI_GpioBase->GPPUD = 0; + RPI_GpioBase->GPPUDCLK0 = 0; + } + + static inline void UpdateButton(int index, unsigned gplev0) + { + bool inputcurrent = (gplev0 & ButtonPinFlags[index]) == 0; + + InputButtonPrev[index] = InputButton[index]; + inputRepeatPrev[index] = inputRepeat[index]; + + if (inputcurrent) + { + validInputCount[index]++; + if (validInputCount[index] == INPUT_BUTTON_DEBOUNCE_THRESHOLD) + { + InputButton[index] = true; + inputRepeatThreshold[index] = INPUT_BUTTON_DEBOUNCE_THRESHOLD + INPUT_BUTTON_REPEAT_THRESHOLD; + inputRepeat[index]++; + } + + if (validInputCount[index] == inputRepeatThreshold[index]) + { + inputRepeat[index]++; + inputRepeatThreshold[index] += INPUT_BUTTON_REPEAT_THRESHOLD / inputRepeat[index]; + } + } + else + { + InputButton[index] = false; + validInputCount[index] = 0; + inputRepeatThreshold[index] = INPUT_BUTTON_REPEAT_THRESHOLD; + inputRepeat[index] = 0; + inputRepeatPrev[index] = 0; + } + } + + static void Read(void); + + static void WaitUntilReset(void) + { + unsigned gplev0; + do + { + gplev0 = read32(ARM_GPIO_GPLEV0); + Resetting = (gplev0 & PIGPIO_MASK_IN_RESET) == (invertIECInputs ? PIGPIO_MASK_IN_RESET : 0); + + if (Resetting) + IEC_Bus::WaitMicroSeconds(100); + } + while (Resetting); + } + + // Out going + static void PortB_OnPortOut(void* pUserData, unsigned char status) + { + bool oldDataSetToOut = DataSetToOut; + bool oldClockSetToOut = ClockSetToOut; + + // These are the values the VIA is trying to set the outputs to + VIA_Atna = (status & (unsigned char)VIAPORTPINS_ATNAOUT) != 0; + VIA_Data = (status & (unsigned char)VIAPORTPINS_DATAOUT) != 0; // VIA DATAout PB1 inverted and then connected to DIN DATA + VIA_Clock = (status & (unsigned char)VIAPORTPINS_CLOCKOUT) != 0; // VIA CLKout PB3 inverted and then connected to DIN CLK + + // Emulate the XOR gate UD3 + AtnaDataSetToOut = (VIA_Atna != PI_Atn); + + if (AtnaDataSetToOut) + { + // if the output of the XOR gate is high (ie VIA_Atna != PI_Atn) then this is inverted and pulls DATA low (activating it) + PI_Data = true; + if (VIA) VIA->GetPortB()->SetInput(VIAPORTPINS_DATAIN, true); // simulate the read in software + } + + if (VIA) + { + // If the VIA's data and clock outputs ever get set to inputs the real hardware reads these lines as asserted. + bool PB1SetToInput = (VIA->GetPortB()->GetDirection() & 2) == 0; + bool PB3SetToInput = (VIA->GetPortB()->GetDirection() & 8) == 0; + if (PB1SetToInput) VIA_Data = true; + if (PB3SetToInput) VIA_Clock = true; + } + + ClockSetToOut = VIA_Clock; + DataSetToOut = VIA_Data; + + if (!oldDataSetToOut && DataSetToOut) + { + PI_Data = true; + if (VIA) VIA->GetPortB()->SetInput(VIAPORTPINS_DATAOUT, true); // simulate the read in software + } + + if (!oldClockSetToOut && ClockSetToOut) + { + PI_Clock = true; + if (VIA) VIA->GetPortB()->SetInput(VIAPORTPINS_CLOCKIN, true); // simulate the read in software + } + + } + + static inline void RefreshOuts(void) + { + unsigned set = 0; + unsigned clear = 0; + + if (!splitIECLines) + { + unsigned outputs = 0; + + if (AtnaDataSetToOut || DataSetToOut) outputs |= (FS_OUTPUT << ((PIGPIO_DATA - 10) * 3)); + if (ClockSetToOut) outputs |= (FS_OUTPUT << ((PIGPIO_CLOCK - 10) * 3)); + + unsigned nValue = (myOutsGPFSEL1 & PI_OUTPUT_MASK_GPFSEL1) | outputs; + write32(ARM_GPIO_GPFSEL1, nValue); + } + else + { + if (AtnaDataSetToOut || DataSetToOut) set |= 1 << PIGPIO_OUT_DATA; + else clear |= 1 << PIGPIO_OUT_DATA; + + if (ClockSetToOut) set |= 1 << PIGPIO_OUT_CLOCK; + else clear |= 1 << PIGPIO_OUT_CLOCK; + } + + if (OutputLED) set |= 1 << PIGPIO_OUT_LED; + else clear |= 1 << PIGPIO_OUT_LED; + + if (OutputSound) set |= 1 << PIGPIO_OUT_SOUND; + else clear |= 1 << PIGPIO_OUT_SOUND; + + write32(ARM_GPIO_GPSET0, set); + write32(ARM_GPIO_GPCLR0, clear); + } + + static void WaitMicroSeconds(u32 amount) + { + u32 count; + + for (count = 0; count < amount; ++count) + { + unsigned before; + unsigned after; + // We try to update every micro second and use as a rough timer to count micro seconds + before = read32(ARM_SYSTIMER_CLO); + do + { + after = read32(ARM_SYSTIMER_CLO); + } while (after == before); + } + } + + /////////////////////////////////////////////////////////////////////////////////////////////// + // Manual methods used by IEC_Commands + static inline void AssertData() + { + if (!DataSetToOut) + { + DataSetToOut = true; + RefreshOuts(); + } + } + static inline void ReleaseData() + { + if (DataSetToOut) + { + DataSetToOut = false; + RefreshOuts(); + } + } + + static inline void AssertClock() + { + if (!ClockSetToOut) + { + ClockSetToOut = true; + RefreshOuts(); + } + } + static inline void ReleaseClock() + { + if (ClockSetToOut) + { + ClockSetToOut = false; + RefreshOuts(); + } + } + static inline bool GetPI_Atn() { return PI_Atn; } + static inline bool IsAtnAsserted() { return PI_Atn; } + static inline bool IsAtnReleased() { return !PI_Atn; } + static inline bool GetPI_Data() { return PI_Data; } + static inline bool IsDataAsserted() { return PI_Data; } + static inline bool IsDataReleased() { return !PI_Data; } + static inline bool GetPI_Clock() { return PI_Clock; } + static inline bool IsClockAsserted() { return PI_Clock; } + static inline bool IsClockReleased() { return !PI_Clock; } + static inline bool GetPI_Reset() { return PI_Reset; } + static inline bool IsDataSetToOut() { return DataSetToOut; } + static inline bool IsAtnaDataSetToOut() { return AtnaDataSetToOut; } + static inline bool IsClockSetToOut() { return ClockSetToOut; } + static inline bool IsReset() { return Resetting; } + + static inline void WaitWhileAtnAsserted() + { + while (IsAtnAsserted()) + { + Read(); + } + } + /////////////////////////////////////////////////////////////////////////////////////////////// + + static inline void SetSplitIECLines(bool value) + { + splitIECLines = value; + if (splitIECLines) + { + PIGPIO_MASK_IN_ATN = 1 << PIGPIO_IN_ATN; + PIGPIO_MASK_IN_DATA = 1 << PIGPIO_IN_DATA; + PIGPIO_MASK_IN_CLOCK = 1 << PIGPIO_IN_CLOCK; + PIGPIO_MASK_IN_SRQ = 1 << PIGPIO_IN_SRQ; + PIGPIO_MASK_IN_RESET = 1 << PIGPIO_IN_RESET; + } + } + + static inline void SetInvertIECInputs(bool value) + { + invertIECInputs = value; + if (value) + { + PI_Atn = ~PI_Atn; + PI_Data = ~PI_Data; + PI_Clock = ~PI_Clock; + PI_Reset = ~PI_Reset; + } + } + + // CA1 input ATN + // If CA1 is ever set to output + // - CA1 will start to drive pb7 + // CA2, CB1 and CB2 are not connected + // - check if pulled high or low + static m6522* VIA; + + static inline void Reset(void) + { + WaitUntilReset(); + + // VIA $1800 + // CA2, CB1 and CB2 are not connected (reads as high) + // VIA $1C00 + // CB1 not connected (reads as high) + + VIA_Atna = false; + VIA_Data = false; + VIA_Clock = false; + + DataSetToOut = false; + ClockSetToOut = false; + + PI_Atn = false; + PI_Data = false; + PI_Clock = false; + + AtnaDataSetToOut = (VIA_Atna != PI_Atn); + if (AtnaDataSetToOut) PI_Data = true; + + RefreshOuts(); + } + + static bool GetInputButtonPressed(int buttonIndex) { return InputButton[buttonIndex] && !InputButtonPrev[buttonIndex]; } + static bool GetInputButtonReleased(int buttonIndex) { return !InputButton[buttonIndex] && InputButtonPrev[buttonIndex]; } + static bool GetInputButton(int buttonIndex) { return InputButton[buttonIndex]; } + static bool GetInputButtonRepeating(int buttonIndex) { return inputRepeat[buttonIndex] != inputRepeatPrev[buttonIndex]; } + + static bool OutputLED; + static bool OutputSound; + +private: + static bool splitIECLines; + static bool invertIECInputs; + static u32 PIGPIO_MASK_IN_ATN; + static u32 PIGPIO_MASK_IN_DATA; + static u32 PIGPIO_MASK_IN_CLOCK; + static u32 PIGPIO_MASK_IN_SRQ; + static u32 PIGPIO_MASK_IN_RESET; + + static bool PI_Atn; + static bool PI_Data; + static bool PI_Clock; + static bool PI_Reset; + + static bool VIA_Atna; + static bool VIA_Data; + static bool VIA_Clock; + + static bool DataSetToOut; + static bool AtnaDataSetToOut; + static bool ClockSetToOut; + static bool Resetting; + + static u32 myOutsGPFSEL0; + static u32 myOutsGPFSEL1; + static bool InputButton[5]; + static bool InputButtonPrev[5]; + static u32 validInputCount[5]; + static u32 inputRepeatThreshold[5]; + static u32 inputRepeat[5]; + static u32 inputRepeatPrev[5]; +}; +#endif \ No newline at end of file diff --git a/iec_commands.cpp b/iec_commands.cpp new file mode 100644 index 0000000..7ed074a --- /dev/null +++ b/iec_commands.cpp @@ -0,0 +1,1875 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + + +//TODO when we have different file types we then need to detect these type of wildcards;- +//*=S selects only sequential files +//*=P selects program files +//*=R selects relative files +//*=U selects user-files + +#include "iec_commands.h" +#include "iec_bus.h" +#include "ff.h" +#include "DiskImage.h" +#include "Petscii.h" +#include +#include +#include +#include +#include + +#define CBM_NAME_LENGTH 16 +#define CBM_NAME_LENGTH_MINUS_D64 CBM_NAME_LENGTH-4 + +#define DIRECTORY_ENTRY_SIZE 32 + +#define EOI_RECVD (1<<0) +#define COMMAND_RECVD (1<<1) + +extern unsigned versionMajor; +extern unsigned versionMinor; + +#define WaitWhile(checkStatus) \ + do\ + {\ + IEC_Bus::Read();\ + if (CheckATN()) return true;\ + } while (checkStatus) + +#define VERSION_OFFSET_IN_DIR_HEADER 17 +static u8 DirectoryHeader[] = +{ + 1, 4, // BASIC start address + 1, 1, // next line pointer + 0, 0, // line number 0 + 0x12, // Reverse on + 0x22, // Quote + 'P', 'I', '1', '5', '4', '1', ' ', 'V', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Name + 0x22, // Quote + 0x20, // Space + 'P', 'I', ' ', '2', 'A', // ID, Dos Disk 2A + 00 +}; + +static const u8 DirectoryBlocksFree[] = { + 1, 1, // Next line pointer + 0, 0, // 16bit free blocks value + 'B', 'L', 'O', 'C', 'K', 'S', ' ', 'F', 'R', 'E', 'E', '.', + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00 +}; + +static const u8 filetypes[] = { + 'D', 'E', 'L', // 0 + 'S', 'E', 'Q', // 1 + 'P', 'R', 'G', // 2 + 'U', 'S', 'R', // 3 + 'R', 'E', 'L', // 4 + 'C', 'B', 'M', // 5 + 'D', 'I', 'R', // 6 +}; + +#define DISKNAME_OFFSET_IN_DIR_BLOCK 144 +#define DISKID_OFFSET_IN_DIR_BLOCK 162 +static u8 blankD64DIRBAM[] = +{ + 0x12, 0x01, 0x41, 0x00, 0x15, 0xff, 0xff, 0x1f, 0x15, 0xff, 0xff, 0x1f, 0x15, 0xff, 0xff, 0x1f, + 0x15, 0xff, 0xff, 0x1f, 0x15, 0xff, 0xff, 0x1f, 0x15, 0xff, 0xff, 0x1f, 0x15, 0xff, 0xff, 0x1f, + 0x15, 0xff, 0xff, 0x1f, 0x15, 0xff, 0xff, 0x1f, 0x15, 0xff, 0xff, 0x1f, 0x15, 0xff, 0xff, 0x1f, + 0x15, 0xff, 0xff, 0x1f, 0x15, 0xff, 0xff, 0x1f, 0x15, 0xff, 0xff, 0x1f, 0x15, 0xff, 0xff, 0x1f, + 0x15, 0xff, 0xff, 0x1f, 0x15, 0xff, 0xff, 0x1f, 0x11, 0xfc, 0xff, 0x07, 0x13, 0xff, 0xff, 0x07, + 0x13, 0xff, 0xff, 0x07, 0x13, 0xff, 0xff, 0x07, 0x13, 0xff, 0xff, 0x07, 0x13, 0xff, 0xff, 0x07, + 0x13, 0xff, 0xff, 0x07, 0x12, 0xff, 0xff, 0x03, 0x12, 0xff, 0xff, 0x03, 0x12, 0xff, 0xff, 0x03, + 0x12, 0xff, 0xff, 0x03, 0x12, 0xff, 0xff, 0x03, 0x12, 0xff, 0xff, 0x03, 0x11, 0xff, 0xff, 0x01, + 0x11, 0xff, 0xff, 0x01, 0x11, 0xff, 0xff, 0x01, 0x11, 0xff, 0xff, 0x01, 0x11, 0xff, 0xff, 0x01, + 0x42, 0x4c, 0x41, 0x4e, 0x4b, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0x31, 0x41, 0xa0, 0x32, 0x41, 0xa0, 0xa0, 0xa0, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static char ErrorMessage[64]; + +static u8* InsertNumber(u8* msg, u8 value) +{ + if (value >= 100) + { + *msg++ = '0' + value / 100; + value %= 100; + } + *msg++ = '0' + value / 10; + *msg++ = '0' + value % 10; + return msg; +} + +static void SetHeaderVersion() +{ + u8* ptr = DirectoryHeader + VERSION_OFFSET_IN_DIR_HEADER; + ptr = InsertNumber(ptr, versionMajor); + *ptr++ = '.'; + ptr = InsertNumber(ptr, versionMinor); +} + +#define ERROR_00_OK 0 +//01,FILES SCRATCHED,XX,00 +//20,READ ERROR,TT,SS header not found +//21,READ ERROR,TT,SS sync not found +//22,READ ERROR,TT,SS header checksum fail +//23,READ ERROR,TT,SS data block checksum fail +//24,READ ERROR,TT,SS +#define ERROR_25_WRITE_ERROR 25 //25,WRITE ERROR,TT,SS verify error +//26,WRITE PROTECT ON,TT,SS +//27,READ ERROR,TT,SS header checksum fail +//28,WRITE ERROR,TT,SS sync not found after write +//29,DISK ID MISMATCH,TT,SS +#define ERROR_30_SYNTAX_ERROR 30 //30,SYNTAX ERROR,00,00 could not parse the command +#define ERROR_31_SYNTAX_ERROR 31 //31,SYNTAX ERROR,00,00 unknown command +#define ERROR_32_SYNTAX_ERROR 32 //32,SYNTAX ERROR,00,00 command too long (ie > 40 characters) +#define ERROR_33_SYNTAX_ERROR 33 //33,SYNTAX ERROR,00,00 Wildcard * and ? was used in an open or save command +#define ERROR_34_SYNTAX_ERROR 34 //34,SYNTAX ERROR,00,00 File name could not be found in the command +#define ERROR_39_FILE_NOT_FOUND 39 //39,FILE NOT FOUND,00,00 User program of type 'USR' was not found +//50,RECORD NOT PRESENT,00,00 +//51,OVERFLOW IN RECORD,00,00 +//52,FILE TOO LARGE,00,00 +//60,WRITE FILE OPEN,00,00 An at tempt was made to OPEN a file that had not previously been CLOSEd after writing. +//61,FILE NOT OPEN,00,00 A file was accessed that had not been OPENed. +#define ERROR_62_FILE_NOT_FOUND 62 //62,FILE NOT FOUND,00,00 An attempt was made to load a program or open does not exist +#define ERROR_63_FILE_EXISTS 63 //63,FILE EXISTS,00,00 Tried to rename a file to the same name of an existing file +//65,NO BLOCK,TT,SS +//66,ILLEGAL TRACK OR SECTOR,TT,SS +//67,ILLEGAL TRACK OR SECTOR,TT,SS +//70,NO CHANNEL,00,00 An attempt was made to open more files than channels available +//71,DIR ERROR,TT,SS +//72,DISK FULL,00,00 +#define ERROR_73_DOSVERSION 73 // 73,VERSION,00,00 +#define ERROR_74_DRlVE_NOT_READY 74 //74,DRlVE NOT READY,00,00 +//75,FORMAT SPEED ERROR,00,00 + +void Error(u8 errorCode, u8 track = 0, u8 sector = 0) +{ + char* msg = "UNKNOWN"; + switch (errorCode) + { + case ERROR_00_OK: + msg = "OK"; + break; + case ERROR_25_WRITE_ERROR: + msg = "WRITE ERROR"; + break; + case ERROR_73_DOSVERSION: + msg = "PI1541"; + break; + case ERROR_30_SYNTAX_ERROR: + case ERROR_31_SYNTAX_ERROR: + case ERROR_32_SYNTAX_ERROR: + case ERROR_33_SYNTAX_ERROR: + case ERROR_34_SYNTAX_ERROR: + msg = "SYNTAX ERROR"; + break; + case ERROR_39_FILE_NOT_FOUND: + msg = "FILE NOT FOUND"; + break; + case ERROR_62_FILE_NOT_FOUND: + msg = "FILE NOT FOUND"; + break; + case ERROR_63_FILE_EXISTS: + msg = "FILE EXISTS"; + break; + default: + DEBUG_LOG("EC=%d?\r\n", errorCode); + break; + } + sprintf(ErrorMessage, "%02d, %s, %02d, %02d", errorCode, msg, track, sector); +} + +static inline bool IsDirectory(FILINFO& filInfo) +{ + return (filInfo.fattrib & AM_DIR) == AM_DIR; +} + +void IEC_Commands::Channel::Close() +{ + if (open) + { + if (writing) + { + u32 bytesWritten; + if (f_write(&file, buffer, cursor, &bytesWritten) != FR_OK) + { + } + } + f_close(&file); + open = false; + } + cursor = 0; + bytesSent = 0; +} + +IEC_Commands::IEC_Commands() +{ + deviceID = 8; + usingVIC20 = false; + Reset(); +} + +void IEC_Commands::Reset(void) +{ + receivedCommand = false; + receivedEOI = false; + secondaryAddress = 0; + selectedImageName[0] = 0; + atnSequence = ATN_SEQUENCE_IDLE; + deviceRole = DEVICE_ROLE_PASSIVE; + commandCode = 0; + Error(ERROR_00_OK); + CloseAllChannels(); +} + +void IEC_Commands::CloseAllChannels() +{ + for (int i = 0; i < 15; ++i) + { + channels[i].Close(); + } +} + +bool IEC_Commands::CheckATN(void) +{ + bool atnAsserted = IEC_Bus::IsAtnAsserted(); + if (atnSequence == ATN_SEQUENCE_RECEIVE_COMMAND_CODE) + { + // TO CHECK is this case needed? Just let it complete + if (!atnAsserted) atnSequence = ATN_SEQUENCE_HANDLE_COMMAND_CODE; + return !atnAsserted; + } + else + { + if (atnAsserted) atnSequence = ATN_SEQUENCE_ATN; + return atnAsserted; + } +} + +// Paraphrasing Jim Butterfield;- https://www.atarimagazines.com/compute/issue38/073_1_HOW_THE_VIC_64_SERIAL_BUS_WORKS.php +// The talker is asserting the Clock line. +// The listener is asserting the Data line. +// There could be more than one listener, in which case all of the listeners are asserting the Data line. +// When the talker is ready it releases the Clock line. +// The listener must detect this and respond, but it doesn't have to do so immediately. +// When the listener is ready to listen, it releases the Data line. +// The Data line will go "unasserted" only when all listeners have released it - in other words, when all listeners are ready to accept data. + +// What happens next is variable. Either the talker will assert the Clock line again in less than 200 microseconds - usually within 60 microseconds - or +// it will do nothing. The listener should be watching, and if 200 microseconds pass without the Clock line going to true, it has a special task to perform : note EOI (End Or Identify). +// If the Ready for Data signal isn't acknowledged by the talker within 200 microseconds, the listener knows that the talker is trying to signal EOI ie, "this character will be the last one." + +// So if the listener sees the 200 microsecond time - out, it must signal "OK, I noticed the EOI" back to the talker, I does this by asserting Data line for at least 60 microseconds, and then releasing it. +// The talker will then revert to transmitting the character in the usual way; within 60 microseconds it will assert Clock line, and transmission will continue. +// At this point, the Clock line is asserted whether or not we have gone through the EOI sequence; we're back to a common transmission sequence. + +// The talker has eight bits to send. They will go out without handshake; in other words, the listener had better be there to catch them, since the talker won't wait to hear from the listener. +// At this point, the talker controls both lines, Clock and Data. At the beginning of the sequence, it is asserting the Clock, while the Data line is released. +// The Data line will change soon, since we'll send the data over it. + +// For each bit, we set the Data line true or false according to whether the bit is one or zero. +// As soon as that's set, the Clock line is released, signalling "data ready." +// The talker will typically have a bit in place and be signalling ready in 70 microseconds or less. Once the talker has signalled "data ready, "it will hold the two lines steady for at least 20 microseconds timing needs to be increased to +// 60 microseconds if the Commodore 64 is listening, since the 64's video chip may interrupt the processor for 42 microseconds at a time, and without the extra wait the 64 might completely miss a bit. +// The listener plays a passive role here; it sends nothing, and just watches. +// As soon as it sees the Clock line false, it grabs the bit from the Data line and puts it away. +// It then waits for the clock line to go true, in order to prepare for the next bit. +// When the talker figures the data has been held for a sufficient length of time, it pulls the Clock line true and releases the Data line to false. +// Then it starts to prepare the next bit. + +// After the eighth bit has been sent, it's the listener's turn to acknowledge. At this moment, the Clock line is asserted and the Data line is released. +// The listener must acknowledge receiving the byte OK by asserting the Data line. The talker is now watching the Data line. +// If the listener doesn't pull the Data line true within one millisecond it will know that something's wrong and may alarm appropriately. + +// We're finished, and back where we started. The talker is holding the Clock line true, and the listener is holding the Data line true. We're ready for step 1; we may send another character - unless EOI has happened. +// If EOI was sent or received in this last transmission, both talker and listener "let go." +// After a suitable pause, the Clock and Data lines are released to false and transmission stops. + +bool IEC_Commands::WriteIECSerialPort(u8 data, bool eoi) +{ + IEC_Bus::WaitMicroSeconds(50); //sidplay64-sd2iec needs this? + + // When the talker is ready it releases the Clock line. + IEC_Bus::ReleaseClock(); + + // Wait for all listeners to be ready. They singal this by releasing the Data line. + WaitWhile(IEC_Bus::IsDataAsserted()); + + if (eoi) // End Or Identify + { + WaitWhile(IEC_Bus::IsDataReleased()); + WaitWhile(IEC_Bus::IsDataAsserted()); + } + + IEC_Bus::AssertClock(); + IEC_Bus::WaitMicroSeconds(40); + WaitWhile(IEC_Bus::IsDataAsserted()); + IEC_Bus::WaitMicroSeconds(21); + + // At this point, the talker controls both lines, Clock and Data. At the beginning of the sequence, it is asserting the Clock, while the Data line is released. + for (u8 i = 0; i < 8; ++i) + { + IEC_Bus::WaitMicroSeconds(45); + if (data & 1 << i) IEC_Bus::ReleaseData(); + else IEC_Bus::AssertData(); + IEC_Bus::WaitMicroSeconds(22); + IEC_Bus::ReleaseClock(); + if (usingVIC20) IEC_Bus::WaitMicroSeconds(34); + else IEC_Bus::WaitMicroSeconds(75); + IEC_Bus::AssertClock(); + IEC_Bus::WaitMicroSeconds(22); + IEC_Bus::ReleaseData(); + IEC_Bus::WaitMicroSeconds(14); + } + + // After the eighth bit has been sent, it's the listener's turn to acknowledge. At this moment, the Clock line is asserted and the Data line is released. + WaitWhile(IEC_Bus::IsDataReleased()); + return false; +} + +bool IEC_Commands::ReadIECSerialPort(u8& byte) +{ + byte = 0; + + // When the talker is ready it releases the Clock line. + WaitWhile(IEC_Bus::IsClockAsserted()); + + // We release data first + IEC_Bus::ReleaseData(); + WaitWhile(IEC_Bus::IsDataAsserted()); + + timer.Start(200); + do + { + IEC_Bus::Read(); + if (CheckATN()) return true; + } + while (IEC_Bus::IsClockReleased() && !timer.Tick()); + + if (timer.TimedOut()) + { + IEC_Bus::AssertData(); + IEC_Bus::WaitMicroSeconds(73); + IEC_Bus::ReleaseData(); + WaitWhile(IEC_Bus::IsClockReleased()); + receivedEOI = true; + } + + for (u8 i = 0; i < 8; ++i) + { + WaitWhile(IEC_Bus::IsClockAsserted()); + byte = (byte >> 1) | (!!IEC_Bus::IsDataReleased() << 7); + WaitWhile(IEC_Bus::IsClockReleased()); + } + + IEC_Bus::AssertData(); + return false; +} + +void IEC_Commands::SimulateIECBegin(void) +{ + SetHeaderVersion(); + Reset(); + IEC_Bus::Read(); +} + +// Paraphrasing Jim Butterfield +// The computer is the only device that will assert ATN. +// When it does so, all other devices drop what they are doing and become listeners. +// Bytes sent by the computer during an ATN period are commands "Talk," "Listen," "Untalk," and "Unlisten" telling a specific device that it will become (or cease to be) a talker or listener. +// The commands go to all devices, and all devices acknowledge them, but only the ones with the suitable device numbers will switch into talk and listen mode. +// These commands are sometimes followed by a secondary address, and after ATN is released, perhaps by a file name. + +// ATN SEQUENCES +// When ATN is asserted, everybody stops what they are doing. +// The computer will quickly assert the Clock line (it's going to send soon). +// At the same time, the processor releases the Data line to false, but all other devices are getting ready to listen and will each assert the Data line. +// They had better do this within one millisecond, since the processor is watching and may sound an alarm("device not present") if it doesn't see this take place. +// Under normal circumstances, transmission now takes place. +// The computer is sending commands rather than data, but the characters are exchanged with exactly the same timing and handshakes. +// All devices receive the commands, but only the specified device acts upon it. + +// TURNAROUND +// An unusual sequence takes place following ATN if the computer wishes the remote device to become a talker. +// This will usually take place only after a Talk command has been sent. +// Immediately after ATN is released, the selected device will be behaving like a listener. +// After all, it's been listening during the ATN cycle, and the computer has been a talker. +// At this instant, we have "wrong way" logic; the device is asserting the Data line, and the computer is asserting the Clock line. +// We must turn this around. The computer quickly realizes what's going on, and asserts the Data line, as well as releasing the Clock line. +// The device waits for this: when it sees the Clock line released, it releases the Data line (which stays asserted anyway since the computer is asserting it) +// and then asserts the Clock line. We're now in our starting position, with the talker (that's the device) asserting the Clock, and the listener (the computer) asserting the Data line true. +IEC_Commands::UpdateAction IEC_Commands::SimulateIECUpdate(void) +{ + if (IEC_Bus::IsReset()) + { + // If the computer is resetting then just wait until it has come out of reset. + do + { + //DEBUG_LOG("Reset during SimulateIECUpdate\r\n"); + IEC_Bus::Read(); + IEC_Bus::WaitMicroSeconds(100); + } + while (IEC_Bus::IsReset()); + IEC_Bus::WaitMicroSeconds(20); + return RESET; + } + + updateAction = NONE; + switch (atnSequence) + { + case ATN_SEQUENCE_IDLE: + IEC_Bus::Read(); + if (IEC_Bus::IsAtnAsserted()) atnSequence = ATN_SEQUENCE_ATN; + else if (selectedImageName[0] != 0) updateAction = IMAGE_SELECTED; + break; + case ATN_SEQUENCE_ATN: + // All devices must release the Clock line as the computer will be the one assering it. + IEC_Bus::ReleaseClock(); + // Tell computer we are ready to listen by asserting the Data line. + IEC_Bus::AssertData(); + + deviceRole = DEVICE_ROLE_PASSIVE; + atnSequence = ATN_SEQUENCE_RECEIVE_COMMAND_CODE; + receivedEOI = false; + + // Wait until the computer is ready to talk + // TODO: should set a timer here and if it times out (before the clock is released) go back to IDLE? + while (IEC_Bus::IsClockReleased()) + { + IEC_Bus::Read(); + } + break; + case ATN_SEQUENCE_RECEIVE_COMMAND_CODE: + ReadIECSerialPort(commandCode); + // Command Code + // 20 Listen + device address (0-1e) + // 3f Unlisten + // 40 Talk + device address (0-1e) + // 5f Untalk + // 60 Open Channel or Data + secondary address (0-f) + // 70 Undefined + // 80 Undefined + // 90 Undefined + // a0 Undefined + // b0 Undefined + // c0 Undefined + // d0 Undefined + // e0 Close + secondary address or channel (0-f) + // f0 Open + secondary address or channel (0-f) + + // Notes: from various CBM-DOS books highlighting various DOS requirements. + + // Secondary addresses 0 and 1 are reserved by the DOS for saving and loading programs. + + // Secondary address 15 is designated as the command and error channel. + // The command/error channel 15 may be opened while a file is open, but when channel 15 is closed, all other channels are closed as well. + + // OPEN lfn, 8, sa, "filename,filetype,mode" + // lfn - logical file number + // When the logical file number is between 1 and 127, a PRINT# statement sends a RETURN character to the file after each variable. + // If the logical file number is greater than 127 (128 - 255), the PRINT# statement sends an additional linefeed after each RETURN. + // The lfn simply a way of assiging a deviceID and a secondary address/channel to a single ID the computer can reference. + + // Should several files be open at once, they must all use different secondary addresses/channels, as only one file can use a channel. + + // If a file is opened with the secondary address of a previously opened file, the previous file is closed. + + // A maximum of 3 channels can be opened with the 1541 at a time. + + // When specifying the filename to be written to (in the OPEN command), you must be sure that the file name does not already exist. + // If a file that already exists is to be to opened for writing, the file must first be deleted. + + //DEBUG_LOG("%0x\r\n", commandCode); + + if (commandCode == 0x20 + deviceID) // Listen + { + secondaryAddress = commandCode & 0x0f; + deviceRole = DEVICE_ROLE_LISTEN; + if (IEC_Bus::IsAtnAsserted()) atnSequence = ATN_SEQUENCE_RECEIVE_COMMAND_CODE; + else atnSequence = ATN_SEQUENCE_HANDLE_COMMAND_CODE; + } + else if (commandCode == 0x3f) // Unlisten + { + if (deviceRole == DEVICE_ROLE_LISTEN) deviceRole = DEVICE_ROLE_PASSIVE; + atnSequence = ATN_SEQUENCE_HANDLE_COMMAND_CODE; + } + else if (commandCode == 0x40 + deviceID) // Talk + { + secondaryAddress = commandCode & 0x0f; + deviceRole = DEVICE_ROLE_TALK; + if (IEC_Bus::IsAtnAsserted()) atnSequence = ATN_SEQUENCE_RECEIVE_COMMAND_CODE; + else atnSequence = ATN_SEQUENCE_HANDLE_COMMAND_CODE; + } + else if (commandCode == 0x5f) // Untalk + { + if (deviceRole == DEVICE_ROLE_TALK) deviceRole = DEVICE_ROLE_PASSIVE; + atnSequence = ATN_SEQUENCE_HANDLE_COMMAND_CODE; + } + else if ((commandCode & 0x60) == 0x60) // Set secondary addresses for 6*, e* and f* commands + { + secondaryAddress = commandCode & 0x0f; + if ((commandCode & 0xf0) == 0xe0) // Close + { + CloseFile(secondaryAddress); + + if (IEC_Bus::IsAtnAsserted()) atnSequence = ATN_SEQUENCE_RECEIVE_COMMAND_CODE; + else atnSequence = ATN_SEQUENCE_HANDLE_COMMAND_CODE; + } + else // Open + { + atnSequence = ATN_SEQUENCE_HANDLE_COMMAND_CODE; + } + } + else + { + IEC_Bus::ReleaseClock(); + IEC_Bus::ReleaseData(); + IEC_Bus::WaitWhileAtnAsserted(); + atnSequence = ATN_SEQUENCE_COMPLETE; + } + break; + case ATN_SEQUENCE_HANDLE_COMMAND_CODE: + IEC_Bus::WaitWhileAtnAsserted(); + if (deviceRole == DEVICE_ROLE_LISTEN) + { + Listen(); + } + else if (deviceRole == DEVICE_ROLE_TALK) + { + // Do the turn around and become the talker + IEC_Bus::ReleaseData(); + IEC_Bus::AssertClock(); + Talk(); + } + atnSequence = ATN_SEQUENCE_COMPLETE; + break; + case ATN_SEQUENCE_COMPLETE: + IEC_Bus::ReleaseClock(); + IEC_Bus::ReleaseData(); + + if (receivedCommand) + { + Channel& channelCommand = channels[15]; + + //DEBUG_LOG("%s sa = %d\r\n", channelCommand.buffer, secondaryAddress); + + if (secondaryAddress == 0xf) //channel 0xf (15) is reserved as the command channel. + { + ProcessCommand(); + } + else + { + // We have no time to do anything now. I don't know why! + // The ATN sequence is complete and we go back to idle. Maybe anther ATN sequence starts immediately? + // We should be able to open files now but doing so takes time and breaks communication. + // So instead, we just cache what we need to know and open the file later (at the start of talking or listening). + Channel& channel = channels[secondaryAddress]; + memcpy(channel.command, channelCommand.buffer, channelCommand.cursor); + } + + // Command has been processed so reset it now. + receivedCommand = false; + } + atnSequence = ATN_SEQUENCE_IDLE; + break; + } + return updateAction; +} + +static bool CopyFile(char* filenameNew, char* filenameOld, bool concatenate) +{ + FRESULT res; + FIL fpIn; + bool success = false; + res = f_open(&fpIn, filenameOld, FA_READ); + if (res == FR_OK) + { + FIL fpOut; + u8 mode = FA_WRITE; + if (!concatenate) mode |= FA_CREATE_ALWAYS; + else mode |= FA_OPEN_APPEND; + + res = f_open(&fpOut, filenameNew, mode); + if (res == FR_OK) + { + char buffer[1024]; + u32 bytes; + + success = true; + do + { + f_read(&fpIn, buffer, sizeof(buffer), &bytes); + if (bytes > 0) + { + // TODO: Should check for disk full. + if (f_write(&fpOut, buffer, bytes, &bytes) != FR_OK) + { + success = false; + break; + } + } + } while (bytes != 0); + + f_close(&fpOut); + } + f_close(&fpIn); + } + return success; +} + +static const char* ParseName(const char* text, char* name, bool convert, bool includeSpace = false) +{ + char* ptrOut = name; + const char* ptr = text; + *name = 0; + + if (isspace(*ptr) || *ptr == ',' || *ptr == '=' || *ptr == ':') + { + ptr++; + } + + // TODO: Should not do this - should use command length to test for the end of a command (use indicies instead of pointers?) + while (*ptr != '\0') + { + if (!isspace(*ptr)) + break; + ptr++; + } + if (*ptr != 0) + { + while (*ptr != '\0') + { + if ((!includeSpace && isspace(*ptr)) || *ptr == ',' || *ptr == '=' || *ptr == ':') + break; + if (convert) *ptrOut++ = petscii2ascii(*ptr++); + else *ptrOut++ = *ptr++; + } + } + *ptrOut = 0; + return ptr; +} + +static const char* ParseNextName(const char* text, char* name, bool convert) +{ + char* ptrOut = name; + const char* ptr; + *name = 0; + + // TODO: looking for these is bad for binary parameters (binary parameter commands should not come through here) + ptr = strchr(text, ':'); + if (ptr == 0) ptr = strchr(text, '='); + if (ptr == 0) ptr = strchr(text, ','); + + if (ptr) + return ParseName(ptr, name, convert); + *ptrOut = 0; + return ptr; +} + +static bool ParseFilenames(const char* text, char* filenameA, char* filenameB) +{ + bool success = false; + text = ParseNextName(text, filenameA, true); + if (text) + { + ParseNextName(text, filenameB, true); + if (filenameB[0] != 0) success = true; + else Error(ERROR_34_SYNTAX_ERROR); // File name could not be found in the command + } + else + { + Error(ERROR_31_SYNTAX_ERROR); // could not parse the command + } + return success; +} + +// If it is a disk image then we select it, +// else if it is a folder then we enter it, +// else it is some other random file we do nothing. +bool IEC_Commands::Enter(DIR& dir, FILINFO& filInfo) +{ + filInfoSelectedImage = filInfo; + + if (DiskImage::IsDiskImageExtention(filInfo.fname)) + { + strcpy((char*)selectedImageName, filInfo.fname); + return true; + } + else if (IsDirectory(filInfo)) + { + if (f_chdir(filInfo.fname) == FR_OK) updateAction = DIR_PUSHED; + else Error(ERROR_62_FILE_NOT_FOUND); + } + return false; +} + +static int ParsePartition(char** buf) +{ + int part = 0; + + // Capital letters coming from sidplay64-sd2iec have the high bit set. Was confusing isdigit! + while ((isdigit(**buf) && !(**buf & 0x80)) || **buf == ' ' || **buf == '@') + { + if (isdigit(**buf)) part = part * 10 + (**buf - '0'); + (*buf)++; + } + return 0; +} + +void IEC_Commands::CD(int partition, char* filename) +{ + char filenameEdited[256]; + + if (filename[0] == '/' && filename[1] == '/') + sprintf(filenameEdited, "\\\\1541\\%s", filename + 2); + else + strcpy(filenameEdited, filename); + + int len = strlen(filenameEdited); + + for (int i = 0; i < len; i++) + { + if (filenameEdited[i] == '/') + filenameEdited[i] = '\\'; + filenameEdited[i] = petscii2ascii(filenameEdited[i]); + } + + DEBUG_LOG("CD %s\r\n", filenameEdited); + if (filenameEdited[0] == '_' && len == 1) + { + updateAction = POP_DIR; + } + else + { + DIR dir; + FILINFO filInfo; + + char path[256] = { 0 }; + char* pattern = strrchr(filenameEdited, '\\'); + + if (pattern) + { + // Now we look for a folder + int len = pattern - filenameEdited; + strncpy(path, filenameEdited, len); + + pattern++; + + if ((f_stat(path, &filInfo) != FR_OK) || !IsDirectory(filInfo)) + { + Error(ERROR_62_FILE_NOT_FOUND); + } + else + { + char cwd[1024]; + if (f_getcwd(cwd, 1024) == FR_OK) + { + f_chdir(path); + + char cwd2[1024]; + f_getcwd(cwd2, 1024); + + bool found = f_findfirst(&dir, &filInfo, ".", pattern) == FR_OK && filInfo.fname[0] != 0; + + //DEBUG_LOG("%s pattern = %s\r\n", filInfo.fname, pattern); + + if (found) + { + if (DiskImage::IsDiskImageExtention(filInfo.fname)) + { + if (f_stat(filInfo.fname, &filInfoSelectedImage) == FR_OK) + { + strcpy((char*)selectedImageName, filInfo.fname); + } + else + { + f_chdir(cwd); + Error(ERROR_62_FILE_NOT_FOUND); + } + } + else + { + //DEBUG_LOG("attemting changing dir %s\r\n", filInfo.fname); + if (f_chdir(filInfo.fname) != FR_OK) + { + Error(ERROR_62_FILE_NOT_FOUND); + f_chdir(cwd); + } + else + { + updateAction = DIR_PUSHED; + } + } + } + else + { + Error(ERROR_62_FILE_NOT_FOUND); + f_chdir(cwd); + } + + } + //if (f_getcwd(cwd, 1024) == FR_OK) + // DEBUG_LOG("CWD on exit = %s\r\n", cwd); + } + } + else + { + bool found = FindFirst(dir, filenameEdited, filInfo); + + if (found) + { + if (DiskImage::IsDiskImageExtention(filInfo.fname)) + { + if (f_stat(filInfo.fname, &filInfoSelectedImage) == FR_OK) + strcpy((char*)selectedImageName, filInfo.fname); + else + Error(ERROR_62_FILE_NOT_FOUND); + } + else + { + //DEBUG_LOG("attemting changing dir %s\r\n", filInfo.fname); + if (f_chdir(filInfo.fname) != FR_OK) + Error(ERROR_62_FILE_NOT_FOUND); + else + updateAction = DIR_PUSHED; + } + } + else + { + Error(ERROR_62_FILE_NOT_FOUND); + } + } + } +} + +void IEC_Commands::MKDir(int partition, char* filename) +{ + char filenameEdited[256]; + + if (filename[0] == '/' && filename[1] == '/') + sprintf(filenameEdited, "\\\\1541\\%s", filename + 2); + else + strcpy(filenameEdited, filename); + int len = strlen(filenameEdited); + + for (int i = 0; i < len; i++) + { + if (filenameEdited[i] == '/') + filenameEdited[i] = '\\'; + + filenameEdited[i] = petscii2ascii(filenameEdited[i]); + } + + f_mkdir(filenameEdited); + + // Force the FileBrowser to refresh incase it just heppeded to be in the folder that they are looking at + updateAction = REFRESH; +} + +void IEC_Commands::RMDir(void) +{ + DIR dir; + FILINFO filInfo; + FRESULT res; + char filename[256]; + Channel& channel = channels[15]; + + const char* text = (char*)channel.buffer; + + text = ParseNextName(text, filename, true); + if (filename[0]) + { + res = f_findfirst(&dir, &filInfo, ".", (const TCHAR*)filename); + if (res == FR_OK) + { + if (filInfo.fname[0] != 0 && IsDirectory(filInfo)) + { + DEBUG_LOG("rmdir %s\r\n", filInfo.fname); + f_unlink(filInfo.fname); + updateAction = REFRESH; + } + } + else + { + Error(ERROR_62_FILE_NOT_FOUND); + } + } + else + { + Error(ERROR_34_SYNTAX_ERROR); + } +} + +void IEC_Commands::FolderCommand(void) +{ + Channel& channel = channels[15]; + + switch (toupper(channel.buffer[0])) + { + case 'M': + { + char* in = (char*)channel.buffer; + int part; + + part = ParsePartition(&in); + if (part > 0) + { + // Only have one drive partition + //Error(ERROR_74_DRlVE_NOT_READY); + return; + } + in += 2; // Skip command + if (*in == ':') + in++; + MKDir(part, in); + } + break; + case 'C': + { + char* in = (char*)channel.buffer; + int part; + + part = ParsePartition(&in); + if (part > 0) + { + // Only have one drive partition + //Error(ERROR_74_DRlVE_NOT_READY); + return; + } + in += 2; // Skip command + if (*in == ':') + in++; + CD(part, in); + } + break; + case 'R': + RMDir(); + break; + default: + Error(ERROR_31_SYNTAX_ERROR); + break; + } +} + +void IEC_Commands::Copy(void) +{ + //COPY:newfile = oldfile1, oldfile2,... + + // Only named data records can be combined. + + // TODO: checkfor wildcards and set the error if found. + char filenameNew[256]; + char filenameToCopy[256]; + Channel& channel = channels[15]; + + FILINFO filInfo; + FRESULT res; + const char* text = (char*)channel.buffer; + + text = ParseNextName(text, filenameNew, true); + + //DEBUG_LOG("Copy %s\r\n", filenameNew); + if (filenameNew[0] != 0) + { + res = f_stat(filenameNew, &filInfo); + if (res == FR_NO_FILE) + { + int fileCount = 0; + do + { + text = ParseNextName(text, filenameToCopy, true); + if (filenameToCopy[0] != 0) + { + //DEBUG_LOG("Copy source %s\r\n", filenameToCopy); + res = f_stat(filenameToCopy, &filInfo); + if (res == FR_OK) + { + if (!IsDirectory(filInfo)) + { + //DEBUG_LOG("copying %s to %s\r\n", filenameToCopy, filenameNew); + if (CopyFile(filenameNew, filenameToCopy, fileCount != 0)) updateAction = REFRESH; + else Error(ERROR_25_WRITE_ERROR); + } + } + else + { + // If you want to copy the entire folder then implement that here. + Error(ERROR_62_FILE_NOT_FOUND); + } + } + fileCount++; + } while (filenameToCopy[0] != 0); + } + else + { + DEBUG_LOG("Copy file exists\r\n"); + Error(ERROR_63_FILE_EXISTS); + } + } + else + { + Error(ERROR_34_SYNTAX_ERROR); + } +} +void IEC_Commands::Memory(void) +{ + Channel& channel = channels[15]; + char* text = (char*)channel.buffer; + u16 address; + int length; + u8 bytes = 1; + u8* ptr; + + if (channel.cursor > 2) + { + char code = toupper(channel.buffer[2]); + if (code == 'R' || code == 'W' || code == 'E') + { + ptr = (u8*)strchr(text, ':'); + if (ptr == 0) ptr = (u8*)&channel.buffer[3]; + else ptr++; + + length = channel.cursor - 3; + + address = (u16)((u8)(ptr[1]) << 8) | (u16)ptr[0]; + if (length > 2) + { + bytes = ptr[2]; + if (bytes == 0) + bytes = 1; + } + + switch (code) + { + case 'R': + DEBUG_LOG("M-R %04x %d\r\n", address, bytes); + break; + case 'W': + DEBUG_LOG("M-W %04x %d\r\n", address, bytes); + break; + case 'E': + // Memory execute impossible at this level of emulation! + DEBUG_LOG("M-E %04x\r\n", address); + break; + } + } + else + { + Error(ERROR_31_SYNTAX_ERROR); + } + } +} + +void IEC_Commands::New(void) +{ + Channel& channel = channels[15]; + char filenameNew[256]; + char ID[256]; + + if (ParseFilenames((char*)channel.buffer, filenameNew, ID)) + { + FILINFO filInfo; + FRESULT res; + char* ptr; + int i; + //bool g64 = false; + + //if (strstr(filenameNew, ".g64") || strstr(filenameNew, ".G64")) + // g64 = true; + //else + if(!(strstr(filenameNew, ".d64") || strstr(filenameNew, ".D64"))) + strcat(filenameNew, ".d64"); + + res = f_stat(filenameNew, &filInfo); + if (res == FR_NO_FILE) + { + FIL fpOut; + res = f_open(&fpOut, filenameNew, FA_CREATE_ALWAYS | FA_WRITE); + if (res == FR_OK) + { + char buffer[256]; + u32 bytes; + u32 blocks; + + memset(buffer, 0, sizeof(buffer)); + // TODO: Should check for disk full. + for (blocks = 0; blocks < 357; ++blocks) + { + if (f_write(&fpOut, buffer, 256, &bytes) != FR_OK) + break; + } + ptr = (char*)&blankD64DIRBAM[DISKNAME_OFFSET_IN_DIR_BLOCK]; + int len = strlen(filenameNew); + for (i = 0; i < len; ++i) + { + *ptr++ = ascii2petscii(filenameNew[i]); + } + for (; i < 18; ++i) + { + *ptr++ = 0xa0; + } + for (i = 0; i < 2; ++i) + { + *ptr++ = ascii2petscii(ID[i]); + } + f_write(&fpOut, blankD64DIRBAM, 256, &bytes); + buffer[1] = 0xff; + f_write(&fpOut, buffer, 256, &bytes); + buffer[1] = 0; + for (blocks = 0; blocks < 324; ++blocks) + { + if (f_write(&fpOut, buffer, 256, &bytes) != FR_OK) + break; + } + f_close(&fpOut); + // Mount the new disk? Shoud we do this or let them do it manually? + if (f_stat(filenameNew, &filInfo) == FR_OK) + { + DIR dir; + Enter(dir, filInfo); + } + } + } + else + { + Error(ERROR_63_FILE_EXISTS); + } + } +} + +void IEC_Commands::Rename(void) +{ + // RENAME:newname=oldname + + // Note: 1541 ROM will not allow you to rename a file until it is closed. + + Channel& channel = channels[15]; + char filenameNew[256]; + char filenameOld[256]; + + if (ParseFilenames((char*)channel.buffer, filenameNew, filenameOld)) + { + FRESULT res; + FILINFO filInfo; + + res = f_stat(filenameNew, &filInfo); + if (res == FR_NO_FILE) + { + res = f_stat(filenameOld, &filInfo); + if (res == FR_OK) + { + // Rename folders too. + //DEBUG_LOG("Renaming %s to %s\r\n", filenameOld, filenameNew); + f_rename(filenameOld, filenameNew); + } + else + { + Error(ERROR_62_FILE_NOT_FOUND); + } + } + else + { + Error(ERROR_63_FILE_EXISTS); + } + } +} + +void IEC_Commands::Scratch(void) +{ + // SCRATCH: filename1, filename2... + + // More than one file can be deleted by using a single command. + // But remember that only 40 characters at a time can be sent + // over the transmission channel to the disk drive. + + // wildcard characters can be used + + Channel& channel = channels[15]; + DIR dir; + FILINFO filInfo; + FRESULT res; + char filename[256]; + const char* text = (const char*)channel.buffer; + + text = ParseNextName(text, filename, true); + while (filename[0]) + { + res = f_findfirst(&dir, &filInfo, ".", (const TCHAR*)filename); + while (res == FR_OK && filInfo.fname[0]) + { + if (filInfo.fname[0] != 0 && !IsDirectory(filInfo)) + { + //DEBUG_LOG("Scratching %s\r\n", filInfo.fname); + f_unlink(filInfo.fname); + } + res = f_findnext(&dir, &filInfo); + } + text = ParseNextName(text, filename, true); + } +} + +void IEC_Commands::User(void) +{ + Channel& channel = channels[15]; + + //DEBUG_LOG("User channel.buffer[1] = %c\r\n", channel.buffer[1]); + + switch (toupper(channel.buffer[1])) + { + case 'A': + case 'B': + case '1': // Direct access block read (Jumps via FFEA to B-R function) + case '2': // Direct access block write (Jumps via FFEC to B-W function) + // Direct acces is unsupported. Without a mounted disk image tracks and sectors have no meaning. + Error(ERROR_31_SYNTAX_ERROR); + break; + + // U3/C - U8/H meaningless at this level of emulation! + + // U9 (UI) + case 'I': + case '9': + //DEBUG_LOG("ui c=%d\r\n", channel.cursor); + if (channel.cursor == 2) + { + // Soft reset + Error(ERROR_73_DOSVERSION); + return; + } + switch (channel.buffer[2]) + { + case '+': + usingVIC20 = true; + break; + case '-': + usingVIC20 = false; + break; + default: + Error(ERROR_73_DOSVERSION); + break; + } + break; + + case 'J': + case ':': + case 202: + // Hard reset + Error(ERROR_73_DOSVERSION); + break; + case '0': + //OPEN1,8,15,"U0>"+CHR$(9):CLOSE1 + if ((channel.buffer[2] & 0x1f) == 0x1e && channel.buffer[3] >= 4 && channel.buffer[3] <= 30) + { + SetDeviceId(channel.buffer[3]); + updateAction = DEVICEID_CHANGED; + DEBUG_LOG("Changed deviceID to %d\r\n", channel.buffer[3]); + } + else + { + Error(ERROR_31_SYNTAX_ERROR); + } + break; + default: + Error(ERROR_31_SYNTAX_ERROR); + break; + } +} + +void IEC_Commands::ProcessCommand(void) +{ + Error(ERROR_00_OK); + + Channel& channel = channels[15]; + + //DEBUG_LOG("CMD %s %d\r\n", channel.buffer, channel.cursor); + + if (channel.cursor > 0 && channel.buffer[channel.cursor - 1] == 0x0d) + channel.cursor--; + + if (channel.cursor == 0) + { + Error(ERROR_30_SYNTAX_ERROR); + } + else + { + //DEBUG_LOG("ProcessCommand %s", channel.buffer); + + if (toupper(channel.buffer[0]) != 'X' && toupper(channel.buffer[1]) == 'D') + { + FolderCommand(); + return; + } + + switch (toupper(channel.buffer[0])) + { + case 'B': + // B-P not implemented + // B-A allocate bit in BAM not implemented + // B-F free bit in BAM not implemented + // B-E block execute impossible at this level of emulation! + Error(ERROR_31_SYNTAX_ERROR); + break; + case 'C': + if (channel.buffer[1] == 'P') + Error(ERROR_31_SYNTAX_ERROR); // Change Partition not implemented yet + else + Copy(); + break; + case 'D': + Error(ERROR_31_SYNTAX_ERROR); // DI, DR, DW not implemented yet + break; + case 'G': + Error(ERROR_31_SYNTAX_ERROR); // G-P not implemented yet + break; + case 'I': + // Initialise + break; + case 'M': + Memory(); + break; + case 'N': + New(); + break; + case 'P': + Error(ERROR_31_SYNTAX_ERROR); // P not implemented yet + break; + case 'R': + Rename(); + break; + case 'S': + if (channel.buffer[1] == '-') + { + // Swap drive number + Error(ERROR_31_SYNTAX_ERROR); + break; + } + Scratch(); + break; + case 'T': + // RTC support + Error(ERROR_31_SYNTAX_ERROR); // T-R and T-W not implemented yet + break; + case 'U': + User(); + break; + case 'V': + break; + case 'W': + // Save out current options? + //OPEN1, 9, 15, "XW":CLOSE1 + break; + case 'X': + // Extended commands not implemented yet + Error(ERROR_31_SYNTAX_ERROR); + break; + default: + Error(ERROR_31_SYNTAX_ERROR); + break; + } + } +} + +void IEC_Commands::Listen() +{ + u8 byte; + + if ((commandCode & 0x0f) == 0x0f || (commandCode & 0xf0) == 0xf0) + { + Channel& channel = channels[15]; + channel.Close(); + + while (!ReadIECSerialPort(byte)) + { + if (!channel.WriteFull()) + { + channel.buffer[channel.cursor++] = byte; + } + if (receivedEOI) + receivedCommand = true; + } + + if (channel.cursor > 1) + { + // Strip any CRs from the command + if (channel.buffer[channel.cursor - 1] == 0x0d) channel.cursor -= 1; + else if (channel.buffer[channel.cursor - 2] == 0x0d) channel.cursor -= 2; + } + + // TODO: Should not do this - should use command length to test for the end of a command + if (!channel.WriteFull()) + channel.buffer[channel.cursor++] = 0; + } + else + { + OpenFile(); + SaveFile(); + } +} + +void IEC_Commands::Talk() +{ + if (commandCode == 0x6f) + { + SendError(); + } + else + { + Channel& channelCommand = channels[15]; + //DEBUG_LOG("cmd = %s\r\n", channelCommand.buffer); + + if (channelCommand.buffer[0] == '$') + { + LoadDirectory(); + } + else + { + OpenFile(); + LoadFile(); + } + } +} + +bool IEC_Commands::FindFirst(DIR& dir, const char* matchstr, FILINFO& filInfo) +{ + char pattern[256]; + FRESULT res; + + // CBM-FileBrowser can only determine if it is a disk image if the extention is in the name. + // So for files that are too long we stomp the last 4 characters with the image extention and pattern match it. + // This basically changes a file name from something like + // SOMELONGDISKIMAGENAME.D64 to SOMELONGDISKIMAGENAME*.D64 + // so the actual SOMELONGDISKIMAGENAMETHATISWAYTOOLONGFORCBMFILEBROWSERTODISPLAY.D64 will be found. + strcpy(pattern, matchstr); + char* ext = strrchr(matchstr, '.'); + if (ext) + { + char* ptr = strrchr(pattern, '.'); + *ptr++ = '*'; + for (int i = 0; i < 4; i++) + { + *ptr++ = *ext++; + } + *ptr = 0; + } + else + { + // For folders we do the same except we need to change the last character to a * + int len = strlen(matchstr); + if (len >= CBM_NAME_LENGTH) + pattern[CBM_NAME_LENGTH - 1] = '*'; + } + //DEBUG_LOG("Pattern %s -> %s\r\n", matchstr, pattern); + res = f_findfirst(&dir, &filInfo, ".", (const TCHAR*)pattern); + //DEBUG_LOG("found file %s\r\n", filInfo.fname); + if (res != FR_OK || filInfo.fname[0] == 0) + { + //Error(ERROR_62_FILE_NOT_FOUND); + return false; + } + else + { + return true; + } +} + +bool IEC_Commands::SendBuffer(Channel& channel, bool eoi) +{ + for (u32 i = 0; i < channel.cursor; ++i) + { + u8 finalbyte = eoi && (channel.bytesSent == (channel.filInfo.fsize - 1)); + if (WriteIECSerialPort(channel.buffer[i], finalbyte)) + { + return true; + } + channel.bytesSent++; + } + channel.cursor = 0; + return false; +} + +void IEC_Commands::LoadFile() +{ + Channel& channel = channels[secondaryAddress]; + + //DEBUG_LOG("LoadFile %s %s\r\n", channel.buffer, channel.filInfo.fname); + + if (channel.filInfo.fname[0] != 0) + { + u32 bytesRead; + do + { + f_read(&channel.file, channel.buffer, sizeof(channel.buffer), &bytesRead); + if (bytesRead > 0) + { + channel.cursor = bytesRead; + if (SendBuffer(channel, true)) + return; + } + } + while (bytesRead > 0); + } + else + { + //DEBUG_LOG("Can't find %s", channel.buffer); + Error(ERROR_62_FILE_NOT_FOUND); + } +} + +void IEC_Commands::SaveFile() +{ + u32 bytesWritten; + u8 byte; + + Channel& channel = channels[secondaryAddress]; + if (channel.open && channel.writing) + { + while (!ReadIECSerialPort(byte)) + { + channel.buffer[channel.cursor++] = byte; + if (channel.WriteFull()) + { + if (f_write(&channel.file, channel.buffer, sizeof(channel.buffer), &bytesWritten) != FR_OK) + { + } + channel.cursor = 0; + } + } + } +} + +void IEC_Commands::SendError() +{ + int len = strlen(ErrorMessage); + int index = 0; + bool finalByte; + do + { + finalByte = index == len; + if (WriteIECSerialPort(ErrorMessage[index++], finalByte)) + break; + } + while (!finalByte); +} + +void IEC_Commands::AddDirectoryEntry(Channel& channel, const char* name, u16 blocks, int fileType) +{ + u8* data = channel.buffer + channel.cursor; + const u32 dirEntryLength = DIRECTORY_ENTRY_SIZE; + int i = 0; + int index = 0; + bool diskImage = DiskImage::IsDiskImageExtention(name); + + //DEBUG_LOG("name = %s blocks = %d", name, blocks); + + memset(data, ' ', dirEntryLength); + data[dirEntryLength - 1] = 0; + + data[index++] = 0x01; + data[index++] = 0x01; + data[index++] = blocks & 0xff; + data[index++] = blocks >> 8; + + if (blocks < 1000) + index++; + if (blocks < 100) + index++; + if (blocks < 10) + index++; + + data[index++] = '"'; + + // CBM-FileBrowser can only determine if it is a disk image if the extention is in the name. + // So for files that are too long we stomp the last 4 characters with the image extention and pattern match it. + // This basically changes a file name from something like + // SOMELONGDISKIMAGENAME.D64 to SOMELONGDISKIMAGENAME*.D64 + // so the actual SOMELONGDISKIMAGENAMETHATISWAYTOOLONGFORCBMFILEBROWSERTODISPLAY.D64 will be found. + if (strlen(name) > CBM_NAME_LENGTH && diskImage) + { + const char* extName = strrchr(name, '.'); + + do + { + data[index + i++] = ascii2petscii(*name++); + } + while (!(*name == 0x22 || *name == 0 || i == CBM_NAME_LENGTH_MINUS_D64)); + + for (int extIndex = 0; extIndex < 4; ++extIndex) + { + data[index + i++] = ascii2petscii(*extName++); + } + } + else + { + do + { + data[index + i++] = ascii2petscii(*name++); + } + while (!(*name == 0x22 || *name == 0 || i == CBM_NAME_LENGTH)); + } + data[index + i] = '"'; + index++; + index += CBM_NAME_LENGTH; + index++; + + for (i = 0; i < 3; ++i) + { + data[index++] = filetypes[fileType * 3 + i]; + } + channel.cursor += dirEntryLength; +} + +void IEC_Commands::LoadDirectory() +{ + DIR dir; + FILINFO filInfo; + char* ext; + + Channel& channel = channels[0]; + + memcpy(channel.buffer, DirectoryHeader, sizeof(DirectoryHeader)); + channel.cursor = sizeof(DirectoryHeader); + + FRESULT res; + res = f_opendir(&dir, "."); + if (res == FR_OK) + { + do + { + res = f_readdir(&dir, &filInfo); + ext = strrchr(filInfo.fname, '.'); + + if (res == FR_OK && filInfo.fname[0] != 0 && !(ext && strcasecmp(ext, ".png") == 0)) + { + const char* fileName = filInfo.fname; + //DEBUG_LOG("%s", fileName); + + if (!channel.CanFit(DIRECTORY_ENTRY_SIZE)) + SendBuffer(channel, false); + + if (filInfo.fattrib & AM_DIR) AddDirectoryEntry(channel, fileName, 0, 6); + else AddDirectoryEntry(channel, fileName, filInfo.fsize / 256 + 1, 2); + } + } + while (res == FR_OK && filInfo.fname[0] != 0); + f_closedir(&dir); + } + SendBuffer(channel, false); + + memcpy(channel.buffer, DirectoryBlocksFree, sizeof(DirectoryBlocksFree)); + + FATFS* fs; + DWORD fre_clust, fre_sect, free_blocks; + res = f_getfree("", &fre_clust, &fs); + if (res == FR_OK) + { + fre_sect = fre_clust * fs->csize; + free_blocks = fre_sect << 1; + + if (free_blocks > 0x10000) + { + channel.buffer[2] = 0xff; + channel.buffer[3] = 0xff; + } + else + { + channel.buffer[2] = free_blocks & 0xff; + channel.buffer[3] = (free_blocks >> 8) & 0xff;; + } + } + else + { + channel.buffer[2] = 0; + channel.buffer[3] = 0; + } + channel.cursor = sizeof(DirectoryBlocksFree); + + channel.filInfo.fsize = channel.bytesSent + channel.cursor; + SendBuffer(channel, true); +} + +void IEC_Commands::OpenFile() +{ + // OPEN lfn,id,sa,"filename,filetype,mode" + // lfn + // When the logical file number(lfn) is between 1 and 127, a PRINT# statement sends a RETURN character to the file after each variable. + // If the logical file number is greater than 127 (128 - 255), the PRINT# statement sends an additional linefeed after each RETURN. + // sa + // Should several files be open at once, they must all use different secondary addresses, as only one file can use a channel. + // mode + // The last parameter(mode) establishes how the channel will used. There are four possibilities: + // W Write a file + // R Read a file + // A Add to a sequential file + // M read a file that has not been closed + + // If a file that already exists is to be to opened for writing, the file must first be deleted. + + // The file type must be given when the file is opened. The file type may be shortened to one of following: + // S - sequential file + // U - user file + // P - program + // R - relative file + u8 secondary = secondaryAddress; + Channel& channel = channels[secondary]; + if (channel.command[0] == '#') + { + // Direct acces is unsupported. Without a mounted disk image tracks and sectors have no meaning. + //DEBUG_LOG("Driect access\r\n"); + } + else if (channel.command[0] == '$') + { + } + else + { + if (!channel.open) + { + bool found = false; + DIR dir; + FRESULT res; + const char* text; + char filename[256]; + char filetype[8]; + char filemode[8]; + bool needFileToExist = true; + bool writing = false; + u8 mode = FA_READ; + + filetype[0] = 0; + filemode[0] = 0; + + if (secondary == 1) + strcat(filemode, "W"); + + char* in = (char*)channel.command; + int part = ParsePartition(&in); + if (part > 0) + { + // Only have one drive partition + //Error(ERROR_74_DRlVE_NOT_READY); + return; + } + if (*in == ':') + in++; + + text = ParseName((char*)in, filename, true, true); + if (text) + { + text = ParseNextName(text, filetype, true); + if (text) + text = ParseNextName(text, filemode, true); + } + + if (toupper(filetype[0]) == 'L') + { + //DEBUG_LOG("Rel file\r\n"); + return; + } + else + { + switch (toupper(filemode[0])) + { + case 'W': + needFileToExist = false; + writing = true; + mode = FA_CREATE_ALWAYS | FA_WRITE; + break; + case 'A': + needFileToExist = true; + writing = true; + mode = FA_OPEN_APPEND | FA_WRITE; + break; + case 'R': + needFileToExist = true; + writing = false; + mode = FA_READ; + break; + } + } + + channel.writing = writing; + + //DEBUG_LOG("OpenFile %s %d NE=%d T=%c M=%c W=%d %0x\r\n", filename, secondary, needFileToExist, filetype[0], filemode[0], writing, mode); + + if (needFileToExist) + { + if (FindFirst(dir, filename, channel.filInfo)) + { + //DEBUG_LOG("found\r\n"); + res = FR_OK; + while ((channel.filInfo.fattrib & AM_DIR) == AM_DIR) + { + res = f_findnext(&dir, &channel.filInfo); + } + + if (res == FR_OK && channel.filInfo.fname[0] != 0) + { + found = true; + res = f_open(&channel.file, channel.filInfo.fname, mode); + if (res == FR_OK) + channel.open = true; + //DEBUG_LOG("Opened existing size = %d\r\n", (int)channel.filInfo.fsize); + } + } + else + { + Error(ERROR_62_FILE_NOT_FOUND); + } + + if (!found) + { + DEBUG_LOG("Can't find %s", filename); + Error(ERROR_62_FILE_NOT_FOUND); + } + } + else + { + res = f_open(&channel.file, filename, mode); + if (res == FR_OK) + { + channel.open = true; + channel.cursor = 0; + //DEBUG_LOG("Opened new sa=%d m=%0x\r\n", secondary, mode); + res = f_stat(filename, &channel.filInfo); + } + else + { + //DEBUG_LOG("Open failed %d\r\n", res); + } + } + } + else + { + //DEBUG_LOG("Channel aready opened %d\r\n", channel.cursor); + } + } +} + +void IEC_Commands::CloseFile(u8 secondary) +{ + Channel& channel = channels[secondary]; + + channel.Close(); +} diff --git a/iec_commands.h b/iec_commands.h new file mode 100644 index 0000000..e441a6b --- /dev/null +++ b/iec_commands.h @@ -0,0 +1,168 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef IEC_COMMANDS_H +#define IEC_COMMANDS_H + +#include "iec_bus.h" +#include "ff.h" +#include "debug.h" + +struct TimerMicroSeconds +{ + TimerMicroSeconds() + { + count = 0; + timeout = 0; + } + + void Start(u32 amount) + { + count = 0; + timeout = amount; + } + + inline bool TimedOut() { return count >= timeout; } + + bool Tick() + { + delay_us(1); + count++; + return TimedOut(); + } + + u32 count; + u32 timeout; +}; + +class IEC_Commands +{ +public: + enum UpdateAction + { + NONE, + IMAGE_SELECTED, + DIR_PUSHED, + POP_DIR, + POP_TO_ROOT, + REFRESH, + DEVICEID_CHANGED, + RESET + }; + + IEC_Commands(); + void Initialise(); + + void SetDeviceId(u8 id) { deviceID = id; } + u8 GetDeviceId() { return deviceID; } + + void Reset(void); + void SimulateIECBegin(void); + UpdateAction SimulateIECUpdate(void); + + const char* GetNameOfImageSelected() const { return selectedImageName; } + const FILINFO* GetImageSelected() const { return &filInfoSelectedImage; } +protected: + enum ATNSequence + { + ATN_SEQUENCE_IDLE, + ATN_SEQUENCE_ATN, + ATN_SEQUENCE_RECEIVE_COMMAND_CODE, + ATN_SEQUENCE_HANDLE_COMMAND_CODE, + ATN_SEQUENCE_COMPLETE + }; + + enum DeviceRole + { + DEVICE_ROLE_PASSIVE, + DEVICE_ROLE_LISTEN, + DEVICE_ROLE_TALK + }; + + struct Channel + { + FILINFO filInfo; + FIL file; + bool writing; + u32 cursor; + u32 bytesSent; + bool open; + + u8 buffer[0x1000]; + u8 command[0x100]; + + void Close(); + bool WriteFull() const { return cursor >= sizeof(buffer); } + bool CanFit(u32 bytes) const { return bytes <= sizeof(buffer) - cursor; } + }; + + bool CheckATN(void); + bool WriteIECSerialPort(u8 data, bool eoi); + bool ReadIECSerialPort(u8& byte); + + void Listen(); + void Talk(); + void LoadFile(); + void SaveFile(); + + void AddDirectoryEntry(Channel& channel, const char* name, u16 blocks, int fileType); + void LoadDirectory(); + void OpenFile(); + void CloseFile(u8 secondary); + void CloseAllChannels(); + void SendError(); + + bool Enter(DIR& dir, FILINFO& filInfo); + bool FindFirst(DIR& dir, const char* matchstr, FILINFO& filInfo); + + void FolderCommand(void); + void CD(int partition, char* filename); + void MKDir(int partition, char* filename); + void RMDir(void); + + void Copy(void); + void New(void); + void Rename(void); + void Scratch(void); + + void Memory(void); + void User(void); + + void ProcessCommand(void); + + bool SendBuffer(Channel& channel, bool eoi); + + UpdateAction updateAction; + u8 commandCode; + bool receivedCommand : 1; + bool receivedEOI : 1; // End Or Identify + bool usingVIC20 : 1; // When sending data we need to wait longer for the 64 as its VICII may be stealing its cycles. VIC20 does not have this problem and can accept data faster. + + u8 deviceID; + u8 secondaryAddress; + ATNSequence atnSequence; + DeviceRole deviceRole; + + TimerMicroSeconds timer; + + Channel channels[16]; + + char selectedImageName[256]; + FILINFO filInfoSelectedImage; +}; +#endif \ No newline at end of file diff --git a/integer.h b/integer.h new file mode 100644 index 0000000..bd89f37 --- /dev/null +++ b/integer.h @@ -0,0 +1,40 @@ +/*-------------------------------------------*/ +/* Integer type definitions for FatFs module */ +/*-------------------------------------------*/ + +#ifndef _FF_INTEGER +#define _FF_INTEGER + +#ifdef _WIN32 /* FatFs development platform */ + +#include +#include +typedef unsigned __int64 QWORD; + +#else /* Embedded platform */ + +/* These types MUST be 16-bit or 32-bit */ +typedef int INT; +typedef unsigned int UINT; + +/* This type MUST be 8-bit */ +typedef unsigned char BYTE; + +/* These types MUST be 16 bit */ +typedef short SHORT; +typedef unsigned short WORD; +typedef unsigned short WCHAR; + +/* These types MUST be 32-bit */ +typedef long LONG; +typedef unsigned long DWORD; + +/* This type MUST be 64-bit (Remove this for C89 compatibility) */ +typedef unsigned long long QWORD; + +#endif + +//#include +#include + +#endif diff --git a/interrupt.c b/interrupt.c new file mode 100644 index 0000000..0b33802 --- /dev/null +++ b/interrupt.c @@ -0,0 +1,159 @@ +#include "interrupt.h" +#include "rpiHardware.h" +#include "bcm2835int.h" + +#define ARM_IC_IRQ_PENDING(irq) ( (irq) < ARM_IRQ2_BASE \ + ? ARM_IC_IRQ_PENDING_1 \ + : ((irq) < ARM_IRQBASIC_BASE \ + ? ARM_IC_IRQ_PENDING_2 \ + : ARM_IC_IRQ_BASIC_PENDING)) +#define ARM_IC_IRQS_ENABLE(irq) ( (irq) < ARM_IRQ2_BASE \ + ? ARM_IC_ENABLE_IRQS_1 \ + : ((irq) < ARM_IRQBASIC_BASE \ + ? ARM_IC_ENABLE_IRQS_2 \ + : ARM_IC_ENABLE_BASIC_IRQS)) +#define ARM_IC_IRQS_DISABLE(irq) ( (irq) < ARM_IRQ2_BASE \ + ? ARM_IC_DISABLE_IRQS_1 \ + : ((irq) < ARM_IRQBASIC_BASE \ + ? ARM_IC_DISABLE_IRQS_2 \ + : ARM_IC_DISABLE_BASIC_IRQS)) +#define ARM_IRQ_MASK(irq) (1 << ((irq) & (ARM_IRQS_PER_REG-1))) + +static IRQHandler* IRQHandlers[IRQ_LINES] = { 0 }; +static void* Params[IRQ_LINES] = { 0 }; + +void InterruptSystemInitialize() +{ + InstructionSyncBarrier(); + + DataMemBarrier(); + + write32(ARM_IC_FIQ_CONTROL, 0); + + write32(ARM_IC_DISABLE_IRQS_1, (u32)-1); + write32(ARM_IC_DISABLE_IRQS_2, (u32)-1); + write32(ARM_IC_DISABLE_BASIC_IRQS, (u32)-1); + + // Ack pending IRQs + write32(ARM_IC_IRQ_BASIC_PENDING, read32(ARM_IC_IRQ_BASIC_PENDING)); + write32(ARM_IC_IRQ_PENDING_1, read32(ARM_IC_IRQ_PENDING_1)); + write32(ARM_IC_IRQ_PENDING_2, read32(ARM_IC_IRQ_PENDING_2)); + + DataMemBarrier(); + + EnableInterrupts(); +} + +void InterruptSystemConnectIRQ(unsigned IRQIndex, IRQHandler* handler, void* param) +{ + IRQHandlers[IRQIndex] = handler; + Params[IRQIndex] = param; + + InterruptSystemEnableIRQ(IRQIndex); +} + +void InterruptSystemDisconnectIRQ(unsigned IRQIndex) +{ + InterruptSystemDisableIRQ(IRQIndex); + + IRQHandlers[IRQIndex] = 0; + Params[IRQIndex] = 0; +} + +void InterruptSystemEnableIRQ(unsigned IRQIndex) +{ + //DEBUG_LOG("InterruptSystemEnableIRQ %d\r\n", IRQIndex); + DataMemBarrier(); + write32(ARM_IC_IRQS_ENABLE(IRQIndex), ARM_IRQ_MASK(IRQIndex)); + DataMemBarrier(); +} + +void InterruptSystemDisableIRQ(unsigned IRQIndex) +{ + DataMemBarrier(); + write32 (ARM_IC_IRQS_DISABLE(IRQIndex), ARM_IRQ_MASK(IRQIndex)); + DataMemBarrier(); +} + +void InterruptHandler(void) +{ +// DEBUG_LOG("InterruptHandler\r\n"); + + DataMemBarrier(); + + //(irq) < ARM_IRQ2_BASE ? ARM_IC_IRQ_PENDING_1 : ((irq) < ARM_IRQBASIC_BASE ? ARM_IC_IRQ_PENDING_2 : ARM_IC_IRQ_BASIC_PENDING + + //for (unsigned IRQIndex = 0; IRQIndex < IRQ_LINES; ++IRQIndex) + //{ + // u32 nPendReg = ARM_IC_IRQ_PENDING(IRQIndex); + // u32 IRQIndexMask = ARM_IRQ_MASK(IRQIndex); + // + // if (read32(nPendReg) & IRQIndexMask) + // { + // IRQHandler* pHandler = IRQHandlers[IRQIndex]; + + // if (pHandler != 0) + // (*pHandler)(Params[IRQIndex]); + // else + // InterruptSystemDisableIRQ(IRQIndex); + // } + //} + + unsigned IRQIndex; + u32 nPendReg; + u32 pendValue; + + nPendReg = ARM_IC_IRQ_PENDING_1; + pendValue = read32(nPendReg); + for (IRQIndex = 0; IRQIndex < ARM_IRQ2_BASE; ++IRQIndex) + { + u32 IRQIndexMask = ARM_IRQ_MASK(IRQIndex); + + if (pendValue & IRQIndexMask) + { + IRQHandler* pHandler = IRQHandlers[IRQIndex]; + + if (pHandler != 0) + (*pHandler)(Params[IRQIndex]); + else + InterruptSystemDisableIRQ(IRQIndex); + } + } + + nPendReg = ARM_IC_IRQ_PENDING_2; + pendValue = read32(nPendReg); + for (;IRQIndex < ARM_IRQBASIC_BASE; ++IRQIndex) + { + u32 IRQIndexMask = ARM_IRQ_MASK(IRQIndex); + + if (pendValue & IRQIndexMask) + { + IRQHandler* pHandler = IRQHandlers[IRQIndex]; + + if (pHandler != 0) + (*pHandler)(Params[IRQIndex]); + else + InterruptSystemDisableIRQ(IRQIndex); + } + } + + nPendReg = ARM_IC_IRQ_BASIC_PENDING; + pendValue = read32(nPendReg); + for (;IRQIndex < IRQ_LINES; ++IRQIndex) + { + u32 IRQIndexMask = ARM_IRQ_MASK(IRQIndex); + + if (pendValue & IRQIndexMask) + { + IRQHandler* pHandler = IRQHandlers[IRQIndex]; + + if (pHandler != 0) + (*pHandler)(Params[IRQIndex]); + else + InterruptSystemDisableIRQ(IRQIndex); + } + } + + DataMemBarrier(); +} + diff --git a/interrupt.h b/interrupt.h new file mode 100644 index 0000000..8703e40 --- /dev/null +++ b/interrupt.h @@ -0,0 +1,29 @@ +#ifndef interrupt_h +#define interrupt_h + +#ifdef __cplusplus +extern "C" { +#endif + +#include "rpi-interrupts.h" + +#define EnableInterrupts() __asm volatile ("cpsie i") +#define DisableInterrupts() __asm volatile ("cpsid i") + +typedef void IRQHandler(void* param); + +void InterruptSystemInitialize(); + +void InterruptSystemConnectIRQ(unsigned IRQIndex, IRQHandler* handler, void* param); +void InterruptSystemDisconnectIRQ(unsigned IRQIndex); + +void InterruptSystemEnableIRQ(unsigned IRQIndex); +void InterruptSystemDisableIRQ(unsigned IRQIndex); + +void InterruptHandler(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/kernel.h b/kernel.h new file mode 100644 index 0000000..ed26e28 --- /dev/null +++ b/kernel.h @@ -0,0 +1,78 @@ +// +// kernel.h +// +// Circle - A C++ bare metal environment for Raspberry Pi +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _kernel_h +#define _kernel_h + +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +#include "emmc.h" +//#include +//#include +//#include + +//#include + +#include "iec_bus.h" +#include "iec_commands.h" + + +enum TShutdownMode +{ + ShutdownNone, + ShutdownHalt, + ShutdownReboot +}; + + +class CKernel +{ +public: + CKernel (void); + ~CKernel (void); + + bool Initialize (void); + + TShutdownMode Run (void); + + +//private: +// static void KeyPressedHandler(const char *pString); +// static void ShutdownHandler(void); +// +// static void KeyStatusHandlerRaw(unsigned char ucModifiers, const unsigned char RawKeys[6]); + +private: + + // do not change this order + CEMMCDevice m_EMMC; + + IEC_Commands m_IEC_Commands; +}; + +#endif diff --git a/kernel.lst b/kernel.lst new file mode 100644 index 0000000..26298ea --- /dev/null +++ b/kernel.lst @@ -0,0 +1,92402 @@ + +kernel.elf: file format elf32-littlearm + + +Disassembly of section .text: + +01f00000 <_start>: + 1f00000: e59ff018 ldr pc, [pc, #24] ; 1f00020 <_reset_h> + 1f00004: e59ff018 ldr pc, [pc, #24] ; 1f00024 <_undefined_instruction_vector_h> + 1f00008: e59ff018 ldr pc, [pc, #24] ; 1f00028 <_software_interrupt_vector_h> + 1f0000c: e59ff018 ldr pc, [pc, #24] ; 1f0002c <_prefetch_abort_vector_h> + 1f00010: e59ff018 ldr pc, [pc, #24] ; 1f00030 <_data_abort_vector_h> + 1f00014: e59ff018 ldr pc, [pc, #24] ; 1f00034 <_unused_handler_h> + 1f00018: e59ff018 ldr pc, [pc, #24] ; 1f00038 <_interrupt_vector_h> + 1f0001c: e59ff018 ldr pc, [pc, #24] ; 1f0003c <_fast_interrupt_vector_h> + +01f00020 <_reset_h>: + 1f00020: 01f000e0 .word 0x01f000e0 + +01f00024 <_undefined_instruction_vector_h>: + 1f00024: 01f001d0 .word 0x01f001d0 + +01f00028 <_software_interrupt_vector_h>: + 1f00028: 01f0020c .word 0x01f0020c + +01f0002c <_prefetch_abort_vector_h>: + 1f0002c: 01f001e4 .word 0x01f001e4 + +01f00030 <_data_abort_vector_h>: + 1f00030: 01f001f8 .word 0x01f001f8 + +01f00034 <_unused_handler_h>: + 1f00034: 01f000e0 .word 0x01f000e0 + +01f00038 <_interrupt_vector_h>: + 1f00038: 01f0018c .word 0x01f0018c + +01f0003c <_fast_interrupt_vector_h>: + 1f0003c: 01f0018c .word 0x01f0018c + +01f00040 <_GLOBAL__sub_I_versionMajor>: + 1f00040: e30d31dc movw r3, #53724 ; 0xd1dc + 1f00044: e34031f9 movt r3, #505 ; 0x1f9 + 1f00048: e92d4070 push {r4, r5, r6, lr} + 1f0004c: e3086008 movw r6, #32776 ; 0x8008 + 1f00050: e34061f6 movt r6, #502 ; 0x1f6 + 1f00054: e3a04000 mov r4, #0 + 1f00058: e1a02006 mov r2, r6 + 1f0005c: e5834000 str r4, [r3] + 1f00060: e1a00003 mov r0, r3 + 1f00064: e5834004 str r4, [r3, #4] + 1f00068: e3001dd0 movw r1, #3536 ; 0xdd0 + 1f0006c: e34011f0 movt r1, #496 ; 0x1f0 + 1f00070: e5834008 str r4, [r3, #8] + 1f00074: e30d51f8 movw r5, #53752 ; 0xd1f8 + 1f00078: e34051f9 movt r5, #505 ; 0x1f9 + 1f0007c: e583400c str r4, [r3, #12] + 1f00080: e5834014 str r4, [r3, #20] + 1f00084: eb00f8fa bl 1f3e474 <__aeabi_atexit> + 1f00088: e309027c movw r0, #37500 ; 0x927c + 1f0008c: e34001fa movt r0, #506 ; 0x1fa + 1f00090: eb0048f9 bl 1f1247c + 1f00094: e1a00005 mov r0, r5 + 1f00098: eb009229 bl 1f24944 + 1f0009c: e1a02006 mov r2, r6 + 1f000a0: e1a00005 mov r0, r5 + 1f000a4: e3041958 movw r1, #18776 ; 0x4958 + 1f000a8: e34011f2 movt r1, #498 ; 0x1f2 + 1f000ac: eb00f8f0 bl 1f3e474 <__aeabi_atexit> + 1f000b0: e30937a4 movw r3, #38820 ; 0x97a4 + 1f000b4: e34031fa movt r3, #506 ; 0x1fa + 1f000b8: e3080828 movw r0, #34856 ; 0x8828 + 1f000bc: e34001f8 movt r0, #504 ; 0x1f8 + 1f000c0: e5c34008 strb r4, [r3, #8] + 1f000c4: e583400c str r4, [r3, #12] + 1f000c8: e5834010 str r4, [r3, #16] + 1f000cc: e5834014 str r4, [r3, #20] + 1f000d0: e5834018 str r4, [r3, #24] + 1f000d4: e583401c str r4, [r3, #28] + 1f000d8: e8bd4070 pop {r4, r5, r6, lr} + 1f000dc: ea005764 b 1f15e74 + +01f000e0 <_reset_>: + 1f000e0: eb000053 bl 1f00234 <_enable_l1_cache> + 1f000e4: e10f0000 mrs r0, CPSR + 1f000e8: e220001a eor r0, r0, #26 + 1f000ec: e310001f tst r0, #31 + 1f000f0: e3c0001f bic r0, r0, #31 + 1f000f4: e38000d3 orr r0, r0, #211 ; 0xd3 + 1f000f8: 1a000004 bne 1f00110 <_not_in_hyp_mode> + 1f000fc: e3800c01 orr r0, r0, #256 ; 0x100 + 1f00100: e28fe00c add lr, pc, #12 + 1f00104: e16ff000 msr SPSR_fsxc, r0 + 1f00108: e12ef30e .word 0xe12ef30e + 1f0010c: e160006e .word 0xe160006e + +01f00110 <_not_in_hyp_mode>: + 1f00110: e121f000 msr CPSR_c, r0 + +01f00114 <_reset_continue>: + 1f00114: e59f0080 ldr r0, [pc, #128] ; 1f0019c + 1f00118: e3a01000 mov r1, #0 + 1f0011c: e8b003fc ldm r0!, {r2, r3, r4, r5, r6, r7, r8, r9} + 1f00120: e8a103fc stmia r1!, {r2, r3, r4, r5, r6, r7, r8, r9} + 1f00124: e8b003fc ldm r0!, {r2, r3, r4, r5, r6, r7, r8, r9} + 1f00128: e8a103fc stmia r1!, {r2, r3, r4, r5, r6, r7, r8, r9} + 1f0012c: e59f4068 ldr r4, [pc, #104] ; 1f0019c + 1f00130: e3a000d2 mov r0, #210 ; 0xd2 + 1f00134: e121f000 msr CPSR_c, r0 + 1f00138: e244d601 sub sp, r4, #1048576 ; 0x100000 + 1f0013c: e3a000d1 mov r0, #209 ; 0xd1 + 1f00140: e121f000 msr CPSR_c, r0 + 1f00144: e244d602 sub sp, r4, #2097152 ; 0x200000 + 1f00148: e3a000db mov r0, #219 ; 0xdb + 1f0014c: e121f000 msr CPSR_c, r0 + 1f00150: e244d606 sub sp, r4, #6291456 ; 0x600000 + 1f00154: e3a000d7 mov r0, #215 ; 0xd7 + 1f00158: e121f000 msr CPSR_c, r0 + 1f0015c: e244d605 sub sp, r4, #5242880 ; 0x500000 + 1f00160: e3a000df mov r0, #223 ; 0xdf + 1f00164: e121f000 msr CPSR_c, r0 + 1f00168: e244d501 sub sp, r4, #4194304 ; 0x400000 + 1f0016c: e3a000d3 mov r0, #211 ; 0xd3 + 1f00170: e121f000 msr CPSR_c, r0 + 1f00174: e244d000 sub sp, r4, #0 + 1f00178: e3a0060f mov r0, #15728640 ; 0xf00000 + 1f0017c: ee010f50 mcr 15, 0, r0, cr1, cr0, {2} + 1f00180: e3a00101 mov r0, #1073741824 ; 0x40000000 + 1f00184: eee80a10 vmsr fpexc, r0 + 1f00188: ea000087 b 1f003ac <_cstartup> + +01f0018c : + 1f0018c: e24ee004 sub lr, lr, #4 + 1f00190: e92d5fff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr} + 1f00194: eb004709 bl 1f11dc0 + 1f00198: e8fd9fff ldm sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, pc}^ + 1f0019c: 01f00000 .word 0x01f00000 + +01f001a0 <_get_stack_pointer>: + 1f001a0: e1a0000d mov r0, sp + 1f001a4: e1a0f00e mov pc, lr + +01f001a8 <_get_cpsr>: + 1f001a8: e10f0000 mrs r0, CPSR + 1f001ac: e1a0f00e mov pc, lr + +01f001b0 <_enable_interrupts>: + 1f001b0: e10f0000 mrs r0, CPSR + 1f001b4: e3c000c0 bic r0, r0, #192 ; 0xc0 + 1f001b8: e121f000 msr CPSR_c, r0 + 1f001bc: e1a0f00e mov pc, lr + +01f001c0 <_disable_interrupts>: + 1f001c0: e10f0000 mrs r0, CPSR + 1f001c4: e38010c0 orr r1, r0, #192 ; 0xc0 + 1f001c8: e121f001 msr CPSR_c, r1 + 1f001cc: e1a0f00e mov pc, lr + +01f001d0 <_undefined_instruction_handler_>: + 1f001d0: e92d5fff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr} + 1f001d4: e14f0000 mrs r0, SPSR + 1f001d8: e92d0001 stmfd sp!, {r0} + 1f001dc: e1a0000d mov r0, sp + 1f001e0: eb000273 bl 1f00bb4 + +01f001e4 <_prefetch_abort_handler_>: + 1f001e4: e92d5fff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr} + 1f001e8: e14f0000 mrs r0, SPSR + 1f001ec: e92d0001 stmfd sp!, {r0} + 1f001f0: e1a0000d mov r0, sp + 1f001f4: eb000272 bl 1f00bc4 + +01f001f8 <_data_abort_handler_>: + 1f001f8: e92d5fff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr} + 1f001fc: e14f0000 mrs r0, SPSR + 1f00200: e92d0001 stmfd sp!, {r0} + 1f00204: e1a0000d mov r0, sp + 1f00208: eb000271 bl 1f00bd4 + +01f0020c <_swi_handler_>: + 1f0020c: e92d5fff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr} + 1f00210: e14f0000 mrs r0, SPSR + 1f00214: e92d0001 stmfd sp!, {r0} + 1f00218: e1a0000d mov r0, sp + 1f0021c: eb000270 bl 1f00be4 + +01f00220 <_enable_unaligned_access>: + 1f00220: ee110f10 mrc 15, 0, r0, cr1, cr0, {0} + 1f00224: e3c00002 bic r0, r0, #2 + 1f00228: e3800501 orr r0, r0, #4194304 ; 0x400000 + 1f0022c: ee010f10 mcr 15, 0, r0, cr1, cr0, {0} + 1f00230: e1a0f00e mov pc, lr + +01f00234 <_enable_l1_cache>: + 1f00234: ee110f10 mrc 15, 0, r0, cr1, cr0, {0} + 1f00238: e3800b02 orr r0, r0, #2048 ; 0x800 + 1f0023c: e3800004 orr r0, r0, #4 + 1f00240: e3800a01 orr r0, r0, #4096 ; 0x1000 + 1f00244: ee010f10 mcr 15, 0, r0, cr1, cr0, {0} + 1f00248: e1a0f00e mov pc, lr + +01f0024c <_invalidate_icache>: + 1f0024c: e3a00000 mov r0, #0 + 1f00250: ee070f15 mcr 15, 0, r0, cr7, cr5, {0} + 1f00254: e1a0f00e mov pc, lr + +01f00258 <_invalidate_dcache>: + 1f00258: e3a00000 mov r0, #0 + 1f0025c: ee070f16 mcr 15, 0, r0, cr7, cr6, {0} + 1f00260: e1a0f00e mov pc, lr + +01f00264 <_clean_invalidate_dcache>: + 1f00264: e3a00000 mov r0, #0 + 1f00268: ee070f1e mcr 15, 0, r0, cr7, cr14, {0} + 1f0026c: e1a0f00e mov pc, lr + +01f00270 <_invalidate_dcache_mva>: + 1f00270: ee070f36 mcr 15, 0, r0, cr7, cr6, {1} + 1f00274: e1a0f00e mov pc, lr + +01f00278 <_clean_invalidate_dcache_mva>: + 1f00278: ee070f3e mcr 15, 0, r0, cr7, cr14, {1} + 1f0027c: e1a0f00e mov pc, lr + +01f00280 <_invalidate_dtlb>: + 1f00280: e3a00000 mov r0, #0 + 1f00284: ee080f16 mcr 15, 0, r0, cr8, cr6, {0} + 1f00288: e1a0f00e mov pc, lr + +01f0028c <_invalidate_dtlb_mva>: + 1f0028c: ee080f36 mcr 15, 0, r0, cr8, cr6, {1} + 1f00290: e1a0f00e mov pc, lr + +01f00294 <_data_memory_barrier>: + 1f00294: f57ff05f dmb sy + 1f00298: e1a0f00e mov pc, lr + +01f0029c <_init_core>: + 1f0029c: e10f0000 mrs r0, CPSR + 1f002a0: e220001a eor r0, r0, #26 + 1f002a4: e310001f tst r0, #31 + 1f002a8: e3c0001f bic r0, r0, #31 + 1f002ac: e38000d3 orr r0, r0, #211 ; 0xd3 + 1f002b0: 1a000004 bne 1f002c8 <_init_not_in_hyp_mode> + 1f002b4: e3800c01 orr r0, r0, #256 ; 0x100 + 1f002b8: e28fe00c add lr, pc, #12 + 1f002bc: e16ff000 msr SPSR_fsxc, r0 + 1f002c0: e12ef30e .word 0xe12ef30e + 1f002c4: e160006e .word 0xe160006e + +01f002c8 <_init_not_in_hyp_mode>: + 1f002c8: e121f000 msr CPSR_c, r0 + +01f002cc <_init_continue>: + 1f002cc: e59f40a8 ldr r4, [pc, #168] ; 1f0037c <_get_core+0xc> + 1f002d0: e3a000d2 mov r0, #210 ; 0xd2 + 1f002d4: e121f000 msr CPSR_c, r0 + 1f002d8: e244d502 sub sp, r4, #8388608 ; 0x800000 + 1f002dc: e3a000d1 mov r0, #209 ; 0xd1 + 1f002e0: e121f000 msr CPSR_c, r0 + 1f002e4: e244d609 sub sp, r4, #9437184 ; 0x900000 + 1f002e8: e3a000db mov r0, #219 ; 0xdb + 1f002ec: e121f000 msr CPSR_c, r0 + 1f002f0: e244d503 sub sp, r4, #12582912 ; 0xc00000 + 1f002f4: e3a000d7 mov r0, #215 ; 0xd7 + 1f002f8: e121f000 msr CPSR_c, r0 + 1f002fc: e244d60b sub sp, r4, #11534336 ; 0xb00000 + 1f00300: e3a000df mov r0, #223 ; 0xdf + 1f00304: e121f000 msr CPSR_c, r0 + 1f00308: e244d60a sub sp, r4, #10485760 ; 0xa00000 + 1f0030c: e3a000d3 mov r0, #211 ; 0xd3 + 1f00310: e121f000 msr CPSR_c, r0 + 1f00314: e244d607 sub sp, r4, #7340032 ; 0x700000 + 1f00318: e3a0060f mov r0, #15728640 ; 0xf00000 + 1f0031c: ee010f50 mcr 15, 0, r0, cr1, cr0, {2} + 1f00320: e3a00101 mov r0, #1073741824 ; 0x40000000 + 1f00324: eee80a10 vmsr fpexc, r0 + 1f00328: eb000d07 bl 1f0374c + +01f0032c <_spin_core>: + 1f0032c: e3a00053 mov r0, #83 ; 0x53 + 1f00330: eb000d70 bl 1f038f8 + 1f00334: e3a00050 mov r0, #80 ; 0x50 + 1f00338: eb000d6e bl 1f038f8 + 1f0033c: e3a00049 mov r0, #73 ; 0x49 + 1f00340: eb000d6c bl 1f038f8 + 1f00344: e3a0004e mov r0, #78 ; 0x4e + 1f00348: eb000d6a bl 1f038f8 + 1f0034c: eb000007 bl 1f00370 <_get_core> + 1f00350: e2800030 add r0, r0, #48 ; 0x30 + 1f00354: eb000d67 bl 1f038f8 + 1f00358: e3a0000d mov r0, #13 + 1f0035c: eb000d65 bl 1f038f8 + 1f00360: e3a0000a mov r0, #10 + 1f00364: eb000d63 bl 1f038f8 + +01f00368 <_spin_core1>: + 1f00368: e320f003 wfi + 1f0036c: eafffffd b 1f00368 <_spin_core1> + +01f00370 <_get_core>: + 1f00370: ee100fb0 mrc 15, 0, r0, cr0, cr0, {5} + 1f00374: e2000003 and r0, r0, #3 + 1f00378: e1a0f00e mov pc, lr + 1f0037c: 01f00000 .word 0x01f00000 + +01f00380 <_toggle_test_pin>: + 1f00380: e3a01602 mov r1, #2097152 ; 0x200000 + +01f00384 <_toggle_test_pin_loop>: + 1f00384: e59f2014 ldr r2, [pc, #20] ; 1f003a0 <_toggle_test_pin_loop+0x1c> + 1f00388: e5821000 str r1, [r2] + 1f0038c: e59f2010 ldr r2, [pc, #16] ; 1f003a4 <_toggle_test_pin_loop+0x20> + 1f00390: e5821000 str r1, [r2] + 1f00394: e2500001 subs r0, r0, #1 + 1f00398: 1afffff9 bne 1f00384 <_toggle_test_pin_loop> + 1f0039c: e1a0f00e mov pc, lr + 1f003a0: 3f20001c .word 0x3f20001c + 1f003a4: 3f200028 .word 0x3f200028 + +01f003a8 <_init>: + 1f003a8: e12fff1e bx lr + +01f003ac <_cstartup>: + 1f003ac: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f003b0: e305ecdc movw lr, #23772 ; 0x5cdc + 1f003b4: e340e1f6 movt lr, #502 ; 0x1f6 + 1f003b8: e3085004 movw r5, #32772 ; 0x8004 + 1f003bc: e340520e movt r5, #526 ; 0x20e + 1f003c0: e15e0005 cmp lr, r5 + 1f003c4: e1a06000 mov r6, r0 + 1f003c8: e1a07001 mov r7, r1 + 1f003cc: e1a08002 mov r8, r2 + 1f003d0: 2a00003e bcs 1f004d0 <_cstartup+0x124> + 1f003d4: e1e0400e mvn r4, lr + 1f003d8: e7a0c15e sbfx ip, lr, #2, #1 + 1f003dc: e0844005 add r4, r4, r5 + 1f003e0: e20cc003 and ip, ip, #3 + 1f003e4: e1a04124 lsr r4, r4, #2 + 1f003e8: e2842001 add r2, r4, #1 + 1f003ec: e15c0002 cmp ip, r2 + 1f003f0: 21a0c002 movcs ip, r2 + 1f003f4: e3520006 cmp r2, #6 + 1f003f8: 91a0c002 movls ip, r2 + 1f003fc: 8a000043 bhi 1f00510 <_cstartup+0x164> + 1f00400: e35c0001 cmp ip, #1 + 1f00404: e3053cdc movw r3, #23772 ; 0x5cdc + 1f00408: e34031f6 movt r3, #502 ; 0x1f6 + 1f0040c: e3a01000 mov r1, #0 + 1f00410: e58e1000 str r1, [lr] + 1f00414: 0a00003b beq 1f00508 <_cstartup+0x15c> + 1f00418: e35c0002 cmp ip, #2 + 1f0041c: e5831004 str r1, [r3, #4] + 1f00420: 0a000036 beq 1f00500 <_cstartup+0x154> + 1f00424: e35c0003 cmp ip, #3 + 1f00428: e5831008 str r1, [r3, #8] + 1f0042c: 0a000031 beq 1f004f8 <_cstartup+0x14c> + 1f00430: e35c0004 cmp ip, #4 + 1f00434: e583100c str r1, [r3, #12] + 1f00438: 0a00002c beq 1f004f0 <_cstartup+0x144> + 1f0043c: e35c0006 cmp ip, #6 + 1f00440: e5831010 str r1, [r3, #16] + 1f00444: 1a000027 bne 1f004e8 <_cstartup+0x13c> + 1f00448: e5831014 str r1, [r3, #20] + 1f0044c: e2833018 add r3, r3, #24 + 1f00450: e152000c cmp r2, ip + 1f00454: 0a00001d beq 1f004d0 <_cstartup+0x124> + 1f00458: e06c1002 rsb r1, ip, r2 + 1f0045c: e06c4004 rsb r4, ip, r4 + 1f00460: e2412004 sub r2, r1, #4 + 1f00464: e3540002 cmp r4, #2 + 1f00468: e1a02122 lsr r2, r2, #2 + 1f0046c: e2822001 add r2, r2, #1 + 1f00470: e1a04102 lsl r4, r2, #2 + 1f00474: 9a00000a bls 1f004a4 <_cstartup+0xf8> + 1f00478: f2c00050 vmov.i32 q8, #0 ; 0x00000000 + 1f0047c: e08ec10c add ip, lr, ip, lsl #2 + 1f00480: e3a00000 mov r0, #0 + 1f00484: e2800001 add r0, r0, #1 + 1f00488: f44c0adf vst1.64 {d16-d17}, [ip :64] + 1f0048c: e1520000 cmp r2, r0 + 1f00490: e28cc010 add ip, ip, #16 + 1f00494: 8afffffa bhi 1f00484 <_cstartup+0xd8> + 1f00498: e1510004 cmp r1, r4 + 1f0049c: e0833104 add r3, r3, r4, lsl #2 + 1f004a0: 0a00000a beq 1f004d0 <_cstartup+0x124> + 1f004a4: e1a00003 mov r0, r3 + 1f004a8: e3a01000 mov r1, #0 + 1f004ac: e3082004 movw r2, #32772 ; 0x8004 + 1f004b0: e340220e movt r2, #526 ; 0x20e + 1f004b4: e4801004 str r1, [r0], #4 + 1f004b8: e1500005 cmp r0, r5 + 1f004bc: 2a000003 bcs 1f004d0 <_cstartup+0x124> + 1f004c0: e2830008 add r0, r3, #8 + 1f004c4: e5831004 str r1, [r3, #4] + 1f004c8: e1500002 cmp r0, r2 + 1f004cc: 35831008 strcc r1, [r3, #8] + 1f004d0: eb00f7f6 bl 1f3e4b0 <__libc_init_array> + 1f004d4: e1a02008 mov r2, r8 + 1f004d8: e1a01007 mov r1, r7 + 1f004dc: e1a00006 mov r0, r6 + 1f004e0: eb000587 bl 1f01b04 + 1f004e4: eafffffe b 1f004e4 <_cstartup+0x138> + 1f004e8: e2833014 add r3, r3, #20 + 1f004ec: eaffffd7 b 1f00450 <_cstartup+0xa4> + 1f004f0: e2833010 add r3, r3, #16 + 1f004f4: eaffffd5 b 1f00450 <_cstartup+0xa4> + 1f004f8: e283300c add r3, r3, #12 + 1f004fc: eaffffd3 b 1f00450 <_cstartup+0xa4> + 1f00500: e2833008 add r3, r3, #8 + 1f00504: eaffffd1 b 1f00450 <_cstartup+0xa4> + 1f00508: e2833004 add r3, r3, #4 + 1f0050c: eaffffcf b 1f00450 <_cstartup+0xa4> + 1f00510: e35c0000 cmp ip, #0 + 1f00514: 01a0300e moveq r3, lr + 1f00518: 0affffce beq 1f00458 <_cstartup+0xac> + 1f0051c: eaffffb7 b 1f00400 <_cstartup+0x54> + +01f00520 <_exit>: + 1f00520: eafffffe b 1f00520 <_exit> + +01f00524 <_close>: + 1f00524: e3e00000 mvn r0, #0 + 1f00528: e12fff1e bx lr + +01f0052c : + 1f0052c: e3083000 movw r3, #32768 ; 0x8000 + 1f00530: e340320e movt r3, #526 ; 0x20e + 1f00534: e3a0200c mov r2, #12 + 1f00538: e3e00000 mvn r0, #0 + 1f0053c: e5832000 str r2, [r3] + 1f00540: e12fff1e bx lr + +01f00544 : + 1f00544: e3083000 movw r3, #32768 ; 0x8000 + 1f00548: e340320e movt r3, #526 ; 0x20e + 1f0054c: e3a0200b mov r2, #11 + 1f00550: e3e00000 mvn r0, #0 + 1f00554: e5832000 str r2, [r3] + 1f00558: e12fff1e bx lr + +01f0055c <_fstat>: + 1f0055c: e3a03a02 mov r3, #8192 ; 0x2000 + 1f00560: e3a00000 mov r0, #0 + 1f00564: e5813004 str r3, [r1, #4] + 1f00568: e12fff1e bx lr + +01f0056c : + 1f0056c: e3a00001 mov r0, #1 + 1f00570: e12fff1e bx lr + +01f00574 <_getpid>: + 1f00574: e3a00001 mov r0, #1 + 1f00578: e12fff1e bx lr + +01f0057c <_isatty>: + 1f0057c: e3a00001 mov r0, #1 + 1f00580: e12fff1e bx lr + +01f00584 : + 1f00584: e3083000 movw r3, #32768 ; 0x8000 + 1f00588: e340320e movt r3, #526 ; 0x20e + 1f0058c: e3a02016 mov r2, #22 + 1f00590: e3e00000 mvn r0, #0 + 1f00594: e5832000 str r2, [r3] + 1f00598: e12fff1e bx lr + +01f0059c <_kill>: + 1f0059c: e3083000 movw r3, #32768 ; 0x8000 + 1f005a0: e340320e movt r3, #526 ; 0x20e + 1f005a4: e3a02016 mov r2, #22 + 1f005a8: e3e00000 mvn r0, #0 + 1f005ac: e5832000 str r2, [r3] + 1f005b0: e12fff1e bx lr + +01f005b4 : + 1f005b4: e3083000 movw r3, #32768 ; 0x8000 + 1f005b8: e340320e movt r3, #526 ; 0x20e + 1f005bc: e3a0201f mov r2, #31 + 1f005c0: e3e00000 mvn r0, #0 + 1f005c4: e5832000 str r2, [r3] + 1f005c8: e12fff1e bx lr + +01f005cc <_lseek>: + 1f005cc: e3a00000 mov r0, #0 + 1f005d0: e12fff1e bx lr + +01f005d4 : + 1f005d4: e3e00000 mvn r0, #0 + 1f005d8: e12fff1e bx lr + +01f005dc <_read>: + 1f005dc: e3a00000 mov r0, #0 + 1f005e0: e12fff1e bx lr + +01f005e4 <_sbrk>: + 1f005e4: e3082004 movw r2, #32772 ; 0x8004 + 1f005e8: e34021f6 movt r2, #502 ; 0x1f6 + 1f005ec: e3081004 movw r1, #32772 ; 0x8004 + 1f005f0: e340120e movt r1, #526 ; 0x20e + 1f005f4: e5923000 ldr r3, [r2] + 1f005f8: e3530000 cmp r3, #0 + 1f005fc: 01a03001 moveq r3, r1 + 1f00600: e0831000 add r1, r3, r0 + 1f00604: e1a00003 mov r0, r3 + 1f00608: e5821000 str r1, [r2] + 1f0060c: e12fff1e bx lr + +01f00610 : + 1f00610: e3a03a02 mov r3, #8192 ; 0x2000 + 1f00614: e3a00000 mov r0, #0 + 1f00618: e5813004 str r3, [r1, #4] + 1f0061c: e12fff1e bx lr + +01f00620 : + 1f00620: e3e00000 mvn r0, #0 + 1f00624: e12fff1e bx lr + +01f00628 : + 1f00628: e3083000 movw r3, #32768 ; 0x8000 + 1f0062c: e340320e movt r3, #526 ; 0x20e + 1f00630: e3a02002 mov r2, #2 + 1f00634: e3e00000 mvn r0, #0 + 1f00638: e5832000 str r2, [r3] + 1f0063c: e12fff1e bx lr + +01f00640 : + 1f00640: e3083000 movw r3, #32768 ; 0x8000 + 1f00644: e340320e movt r3, #526 ; 0x20e + 1f00648: e3a0200a mov r2, #10 + 1f0064c: e3e00000 mvn r0, #0 + 1f00650: e5832000 str r2, [r3] + 1f00654: e12fff1e bx lr + +01f00658 : + 1f00658: ea000ca6 b 1f038f8 + +01f0065c <_write>: + 1f0065c: e92d4070 push {r4, r5, r6, lr} + 1f00660: e2526000 subs r6, r2, #0 + 1f00664: da000005 ble 1f00680 <_write+0x24> + 1f00668: e1a04001 mov r4, r1 + 1f0066c: e0815006 add r5, r1, r6 + 1f00670: e0d400d1 ldrsb r0, [r4], #1 + 1f00674: eb000c9f bl 1f038f8 + 1f00678: e1550004 cmp r5, r4 + 1f0067c: 1afffffb bne 1f00670 <_write+0x14> + 1f00680: e1a00006 mov r0, r6 + 1f00684: e8bd8070 pop {r4, r5, r6, pc} + +01f00688 : + 1f00688: ea00f7b6 b 1f3e568 + +01f0068c : + 1f0068c: ea00f7bd b 1f3e588 + +01f00690 : + 1f00690: e12fff1e bx lr + +01f00694 : + 1f00694: e12fff1e bx lr + +01f00698 : + 1f00698: e3a03000 mov r3, #0 + 1f0069c: e3433f10 movt r3, #16144 ; 0x3f10 + 1f006a0: e3a01001 mov r1, #1 + 1f006a4: e3451a00 movt r1, #23040 ; 0x5a00 + 1f006a8: e3a02020 mov r2, #32 + 1f006ac: e3452a00 movt r2, #23040 ; 0x5a00 + 1f006b0: e5831024 str r1, [r3, #36] ; 0x24 + 1f006b4: e583201c str r2, [r3, #28] + 1f006b8: eafffffe b 1f006b8 + +01f006bc : + 1f006bc: e200000f and r0, r0, #15 + 1f006c0: e3500009 cmp r0, #9 + 1f006c4: 92800030 addls r0, r0, #48 ; 0x30 + 1f006c8: 82800037 addhi r0, r0, #55 ; 0x37 + 1f006cc: ea000c89 b 1f038f8 + +01f006d0 : + 1f006d0: e92d4070 push {r4, r5, r6, lr} + 1f006d4: e1a05000 mov r5, r0 + 1f006d8: e3a04008 mov r4, #8 + 1f006dc: e1a03e25 lsr r3, r5, #28 + 1f006e0: e1a05205 lsl r5, r5, #4 + 1f006e4: e3530009 cmp r3, #9 + 1f006e8: e2830037 add r0, r3, #55 ; 0x37 + 1f006ec: 92830030 addls r0, r3, #48 ; 0x30 + 1f006f0: eb000c80 bl 1f038f8 + 1f006f4: e2544001 subs r4, r4, #1 + 1f006f8: 1afffff7 bne 1f006dc + 1f006fc: e8bd8070 pop {r4, r5, r6, pc} + +01f00700 : + 1f00700: e92d4070 push {r4, r5, r6, lr} + 1f00704: e1a05000 mov r5, r0 + 1f00708: e3a04020 mov r4, #32 + 1f0070c: e1a00fa5 lsr r0, r5, #31 + 1f00710: e1a05085 lsl r5, r5, #1 + 1f00714: e2800030 add r0, r0, #48 ; 0x30 + 1f00718: eb000c76 bl 1f038f8 + 1f0071c: e2544001 subs r4, r4, #1 + 1f00720: 1afffff9 bne 1f0070c + 1f00724: e8bd8070 pop {r4, r5, r6, pc} + +01f00728 : + 1f00728: e92d4010 push {r4, lr} + 1f0072c: e2804001 add r4, r0, #1 + 1f00730: e1d000d0 ldrsb r0, [r0] + 1f00734: e3500000 cmp r0, #0 + 1f00738: 08bd8010 popeq {r4, pc} + 1f0073c: eb000c6d bl 1f038f8 + 1f00740: e0d400d1 ldrsb r0, [r4], #1 + 1f00744: e3500000 cmp r0, #0 + 1f00748: 1afffffb bne 1f0073c + 1f0074c: e8bd8010 pop {r4, pc} + +01f00750 : + 1f00750: e92d4ff8 push {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f00754: e3c08003 bic r8, r0, #3 + 1f00758: e1a05001 mov r5, r1 + 1f0075c: e1d200d0 ldrsb r0, [r2] + 1f00760: e3500000 cmp r0, #0 + 1f00764: 0a000004 beq 1f0077c + 1f00768: e2824001 add r4, r2, #1 + 1f0076c: eb000c61 bl 1f038f8 + 1f00770: e0d400d1 ldrsb r0, [r4], #1 + 1f00774: e3500000 cmp r0, #0 + 1f00778: 1afffffb bne 1f0076c + 1f0077c: e30840c4 movw r4, #32964 ; 0x80c4 + 1f00780: e34041f5 movt r4, #501 ; 0x1f5 + 1f00784: e3a00020 mov r0, #32 + 1f00788: eb000c5a bl 1f038f8 + 1f0078c: e1f400d1 ldrsb r0, [r4, #1]! + 1f00790: e3500000 cmp r0, #0 + 1f00794: 1afffffb bne 1f00788 + 1f00798: e5983038 ldr r3, [r8, #56] ; 0x38 + 1f0079c: e3a06008 mov r6, #8 + 1f007a0: e3c33003 bic r3, r3, #3 + 1f007a4: e0655003 rsb r5, r5, r3 + 1f007a8: e1a04005 mov r4, r5 + 1f007ac: e1a03e24 lsr r3, r4, #28 + 1f007b0: e1a04204 lsl r4, r4, #4 + 1f007b4: e3530009 cmp r3, #9 + 1f007b8: e2830037 add r0, r3, #55 ; 0x37 + 1f007bc: 92830030 addls r0, r3, #48 ; 0x30 + 1f007c0: eb000c4c bl 1f038f8 + 1f007c4: e2566001 subs r6, r6, #1 + 1f007c8: 1afffff7 bne 1f007ac + 1f007cc: e308402c movw r4, #32812 ; 0x802c + 1f007d0: e34041f5 movt r4, #501 ; 0x1f5 + 1f007d4: e3a0000d mov r0, #13 + 1f007d8: eb000c46 bl 1f038f8 + 1f007dc: e1f400d1 ldrsb r0, [r4, #1]! + 1f007e0: e3500000 cmp r0, #0 + 1f007e4: 1afffffb bne 1f007d8 + 1f007e8: e3084008 movw r4, #32776 ; 0x8008 + 1f007ec: e34041f5 movt r4, #501 ; 0x1f5 + 1f007f0: e3a00052 mov r0, #82 ; 0x52 + 1f007f4: eb000c3f bl 1f038f8 + 1f007f8: e1f400d1 ldrsb r0, [r4, #1]! + 1f007fc: e3500000 cmp r0, #0 + 1f00800: 1afffffb bne 1f007f4 + 1f00804: e3067667 movw r7, #26215 ; 0x6667 + 1f00808: e3467666 movt r7, #26214 ; 0x6666 + 1f0080c: e1a04000 mov r4, r0 + 1f00810: e1a0a000 mov sl, r0 + 1f00814: e1a06008 mov r6, r8 + 1f00818: e30890cc movw r9, #32972 ; 0x80cc + 1f0081c: e34091f5 movt r9, #501 ; 0x1f5 + 1f00820: e3a00020 mov r0, #32 + 1f00824: eb000c33 bl 1f038f8 + 1f00828: e1f900d1 ldrsb r0, [r9, #1]! + 1f0082c: e3500000 cmp r0, #0 + 1f00830: 1afffffb bne 1f00824 + 1f00834: e0c3279a smull r2, r3, sl, r7 + 1f00838: e1a00fca asr r0, sl, #31 + 1f0083c: e30890d4 movw r9, #32980 ; 0x80d4 + 1f00840: e34091f5 movt r9, #501 ; 0x1f5 + 1f00844: e060b143 rsb fp, r0, r3, asr #2 + 1f00848: e28b0030 add r0, fp, #48 ; 0x30 + 1f0084c: e6af0070 sxtb r0, r0 + 1f00850: eb000c28 bl 1f038f8 + 1f00854: e1a0018b lsl r0, fp, #3 + 1f00858: e080008b add r0, r0, fp, lsl #1 + 1f0085c: e060000a rsb r0, r0, sl + 1f00860: e2800030 add r0, r0, #48 ; 0x30 + 1f00864: e6af0070 sxtb r0, r0 + 1f00868: eb000c22 bl 1f038f8 + 1f0086c: e3a0005d mov r0, #93 ; 0x5d + 1f00870: eb000c20 bl 1f038f8 + 1f00874: e1f900d1 ldrsb r0, [r9, #1]! + 1f00878: e3500000 cmp r0, #0 + 1f0087c: 1afffffb bne 1f00870 + 1f00880: e5b6a004 ldr sl, [r6, #4]! + 1f00884: e3a09008 mov r9, #8 + 1f00888: e1a03e2a lsr r3, sl, #28 + 1f0088c: e1a0a20a lsl sl, sl, #4 + 1f00890: e3530009 cmp r3, #9 + 1f00894: e2830037 add r0, r3, #55 ; 0x37 + 1f00898: 92830030 addls r0, r3, #48 ; 0x30 + 1f0089c: eb000c15 bl 1f038f8 + 1f008a0: e2599001 subs r9, r9, #1 + 1f008a4: 1afffff7 bne 1f00888 + 1f008a8: e308902c movw r9, #32812 ; 0x802c + 1f008ac: e34091f5 movt r9, #501 ; 0x1f5 + 1f008b0: e3a0000d mov r0, #13 + 1f008b4: eb000c0f bl 1f038f8 + 1f008b8: e1f900d1 ldrsb r0, [r9, #1]! + 1f008bc: e3500000 cmp r0, #0 + 1f008c0: 1afffffb bne 1f008b4 + 1f008c4: e2844001 add r4, r4, #1 + 1f008c8: e354000e cmp r4, #14 + 1f008cc: 0a000003 beq 1f008e0 + 1f008d0: e354000d cmp r4, #13 + 1f008d4: 11a0a004 movne sl, r4 + 1f008d8: 03a0a00e moveq sl, #14 + 1f008dc: eaffffcd b 1f00818 + 1f008e0: e3084018 movw r4, #32792 ; 0x8018 + 1f008e4: e34041f5 movt r4, #501 ; 0x1f5 + 1f008e8: e3a0004d mov r0, #77 ; 0x4d + 1f008ec: eb000c01 bl 1f038f8 + 1f008f0: e1f400d1 ldrsb r0, [r4, #1]! + 1f008f4: e3500000 cmp r0, #0 + 1f008f8: 1afffffb bne 1f008ec + 1f008fc: e2455010 sub r5, r5, #16 + 1f00900: e3e07002 mvn r7, #2 + 1f00904: e3084030 movw r4, #32816 ; 0x8030 + 1f00908: e34041f5 movt r4, #501 ; 0x1f5 + 1f0090c: e3a00020 mov r0, #32 + 1f00910: eb000bf8 bl 1f038f8 + 1f00914: e1f400d1 ldrsb r0, [r4, #1]! + 1f00918: e3500000 cmp r0, #0 + 1f0091c: 1afffffb bne 1f00910 + 1f00920: e1a06005 mov r6, r5 + 1f00924: e3a04008 mov r4, #8 + 1f00928: e1a03e26 lsr r3, r6, #28 + 1f0092c: e1a06206 lsl r6, r6, #4 + 1f00930: e3530009 cmp r3, #9 + 1f00934: e2830037 add r0, r3, #55 ; 0x37 + 1f00938: 92830030 addls r0, r3, #48 ; 0x30 + 1f0093c: eb000bed bl 1f038f8 + 1f00940: e2544001 subs r4, r4, #1 + 1f00944: 1afffff7 bne 1f00928 + 1f00948: e3a0003d mov r0, #61 ; 0x3d + 1f0094c: e3a06008 mov r6, #8 + 1f00950: eb000be8 bl 1f038f8 + 1f00954: e4954004 ldr r4, [r5], #4 + 1f00958: e1a03e24 lsr r3, r4, #28 + 1f0095c: e1a04204 lsl r4, r4, #4 + 1f00960: e3530009 cmp r3, #9 + 1f00964: e2830037 add r0, r3, #55 ; 0x37 + 1f00968: 92830030 addls r0, r3, #48 ; 0x30 + 1f0096c: eb000be1 bl 1f038f8 + 1f00970: e2566001 subs r6, r6, #1 + 1f00974: 1afffff7 bne 1f00958 + 1f00978: e3570001 cmp r7, #1 + 1f0097c: 1308402c movwne r4, #32812 ; 0x802c + 1f00980: 13a0000d movne r0, #13 + 1f00984: 134041f5 movtne r4, #501 ; 0x1f5 + 1f00988: 0a000081 beq 1f00b94 + 1f0098c: eb000bd9 bl 1f038f8 + 1f00990: e1f400d1 ldrsb r0, [r4, #1]! + 1f00994: e3500000 cmp r0, #0 + 1f00998: 1afffffb bne 1f0098c + 1f0099c: e3570005 cmp r7, #5 + 1f009a0: 0a000001 beq 1f009ac + 1f009a4: e2877001 add r7, r7, #1 + 1f009a8: eaffffd5 b 1f00904 + 1f009ac: e5986000 ldr r6, [r8] + 1f009b0: e3084034 movw r4, #32820 ; 0x8034 + 1f009b4: e34041f5 movt r4, #501 ; 0x1f5 + 1f009b8: e3a00046 mov r0, #70 ; 0x46 + 1f009bc: eb000bcd bl 1f038f8 + 1f009c0: e1f400d1 ldrsb r0, [r4, #1]! + 1f009c4: e3500000 cmp r0, #0 + 1f009c8: 1afffffb bne 1f009bc + 1f009cc: e1a05006 mov r5, r6 + 1f009d0: e3a04020 mov r4, #32 + 1f009d4: e1a00fa5 lsr r0, r5, #31 + 1f009d8: e1a05085 lsl r5, r5, #1 + 1f009dc: e2800030 add r0, r0, #48 ; 0x30 + 1f009e0: eb000bc4 bl 1f038f8 + 1f009e4: e2544001 subs r4, r4, #1 + 1f009e8: 1afffff9 bne 1f009d4 + 1f009ec: e3084064 movw r4, #32868 ; 0x8064 + 1f009f0: e34041f5 movt r4, #501 ; 0x1f5 + 1f009f4: e3a00020 mov r0, #32 + 1f009f8: eb000bbe bl 1f038f8 + 1f009fc: e1f400d1 ldrsb r0, [r4, #1]! + 1f00a00: e3500000 cmp r0, #0 + 1f00a04: 1afffffb bne 1f009f8 + 1f00a08: e206301f and r3, r6, #31 + 1f00a0c: e2433010 sub r3, r3, #16 + 1f00a10: e353000f cmp r3, #15 + 1f00a14: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f00a18: ea000055 b 1f00b74 + 1f00a1c: 01f00ab4 .word 0x01f00ab4 + 1f00a20: 01f00b54 .word 0x01f00b54 + 1f00a24: 01f00ad4 .word 0x01f00ad4 + 1f00a28: 01f00af4 .word 0x01f00af4 + 1f00a2c: 01f00b74 .word 0x01f00b74 + 1f00a30: 01f00b74 .word 0x01f00b74 + 1f00a34: 01f00b74 .word 0x01f00b74 + 1f00a38: 01f00b14 .word 0x01f00b14 + 1f00a3c: 01f00b74 .word 0x01f00b74 + 1f00a40: 01f00b74 .word 0x01f00b74 + 1f00a44: 01f00b74 .word 0x01f00b74 + 1f00a48: 01f00b34 .word 0x01f00b34 + 1f00a4c: 01f00b74 .word 0x01f00b74 + 1f00a50: 01f00b74 .word 0x01f00b74 + 1f00a54: 01f00b74 .word 0x01f00b74 + 1f00a58: 01f00a5c .word 0x01f00a5c + 1f00a5c: e3084098 movw r4, #32920 ; 0x8098 + 1f00a60: e34041f5 movt r4, #501 ; 0x1f5 + 1f00a64: e3a00053 mov r0, #83 ; 0x53 + 1f00a68: eb000ba2 bl 1f038f8 + 1f00a6c: e1f400d1 ldrsb r0, [r4, #1]! + 1f00a70: e3500000 cmp r0, #0 + 1f00a74: 1afffffb bne 1f00a68 + 1f00a78: e30840d8 movw r4, #32984 ; 0x80d8 + 1f00a7c: e34041f5 movt r4, #501 ; 0x1f5 + 1f00a80: e3a00020 mov r0, #32 + 1f00a84: eb000b9b bl 1f038f8 + 1f00a88: e1f400d1 ldrsb r0, [r4, #1]! + 1f00a8c: e3500000 cmp r0, #0 + 1f00a90: 1afffffb bne 1f00a84 + 1f00a94: e30840a8 movw r4, #32936 ; 0x80a8 + 1f00a98: e34041f5 movt r4, #501 ; 0x1f5 + 1f00a9c: e3a00048 mov r0, #72 ; 0x48 + 1f00aa0: eb000b94 bl 1f038f8 + 1f00aa4: e1f400d1 ldrsb r0, [r4, #1]! + 1f00aa8: e3500000 cmp r0, #0 + 1f00aac: 1afffffb bne 1f00aa0 + 1f00ab0: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f00ab4: e3084068 movw r4, #32872 ; 0x8068 + 1f00ab8: e34041f5 movt r4, #501 ; 0x1f5 + 1f00abc: e3a00055 mov r0, #85 ; 0x55 + 1f00ac0: eb000b8c bl 1f038f8 + 1f00ac4: e1f400d1 ldrsb r0, [r4, #1]! + 1f00ac8: e3500000 cmp r0, #0 + 1f00acc: 1afffffb bne 1f00ac0 + 1f00ad0: eaffffe8 b 1f00a78 + 1f00ad4: e3084074 movw r4, #32884 ; 0x8074 + 1f00ad8: e34041f5 movt r4, #501 ; 0x1f5 + 1f00adc: e3a00049 mov r0, #73 ; 0x49 + 1f00ae0: eb000b84 bl 1f038f8 + 1f00ae4: e1f400d1 ldrsb r0, [r4, #1]! + 1f00ae8: e3500000 cmp r0, #0 + 1f00aec: 1afffffb bne 1f00ae0 + 1f00af0: eaffffe0 b 1f00a78 + 1f00af4: e3084078 movw r4, #32888 ; 0x8078 + 1f00af8: e34041f5 movt r4, #501 ; 0x1f5 + 1f00afc: e3a00053 mov r0, #83 ; 0x53 + 1f00b00: eb000b7c bl 1f038f8 + 1f00b04: e1f400d1 ldrsb r0, [r4, #1]! + 1f00b08: e3500000 cmp r0, #0 + 1f00b0c: 1afffffb bne 1f00b00 + 1f00b10: eaffffd8 b 1f00a78 + 1f00b14: e3084084 movw r4, #32900 ; 0x8084 + 1f00b18: e34041f5 movt r4, #501 ; 0x1f5 + 1f00b1c: e3a00041 mov r0, #65 ; 0x41 + 1f00b20: eb000b74 bl 1f038f8 + 1f00b24: e1f400d1 ldrsb r0, [r4, #1]! + 1f00b28: e3500000 cmp r0, #0 + 1f00b2c: 1afffffb bne 1f00b20 + 1f00b30: eaffffd0 b 1f00a78 + 1f00b34: e308408c movw r4, #32908 ; 0x808c + 1f00b38: e34041f5 movt r4, #501 ; 0x1f5 + 1f00b3c: e3a00055 mov r0, #85 ; 0x55 + 1f00b40: eb000b6c bl 1f038f8 + 1f00b44: e1f400d1 ldrsb r0, [r4, #1]! + 1f00b48: e3500000 cmp r0, #0 + 1f00b4c: 1afffffb bne 1f00b40 + 1f00b50: eaffffc8 b 1f00a78 + 1f00b54: e3084070 movw r4, #32880 ; 0x8070 + 1f00b58: e34041f5 movt r4, #501 ; 0x1f5 + 1f00b5c: e3a00046 mov r0, #70 ; 0x46 + 1f00b60: eb000b64 bl 1f038f8 + 1f00b64: e1f400d1 ldrsb r0, [r4, #1]! + 1f00b68: e3500000 cmp r0, #0 + 1f00b6c: 1afffffb bne 1f00b60 + 1f00b70: eaffffc0 b 1f00a78 + 1f00b74: e30840a0 movw r4, #32928 ; 0x80a0 + 1f00b78: e34041f5 movt r4, #501 ; 0x1f5 + 1f00b7c: e3a00049 mov r0, #73 ; 0x49 + 1f00b80: eb000b5c bl 1f038f8 + 1f00b84: e1f400d1 ldrsb r0, [r4, #1]! + 1f00b88: e3500000 cmp r0, #0 + 1f00b8c: 1afffffb bne 1f00b80 + 1f00b90: eaffffb8 b 1f00a78 + 1f00b94: e3084024 movw r4, #32804 ; 0x8024 + 1f00b98: e34041f5 movt r4, #501 ; 0x1f5 + 1f00b9c: e3a00020 mov r0, #32 + 1f00ba0: eb000b54 bl 1f038f8 + 1f00ba4: e1f400d1 ldrsb r0, [r4, #1]! + 1f00ba8: e3500000 cmp r0, #0 + 1f00bac: 1afffffb bne 1f00ba0 + 1f00bb0: eaffff7b b 1f009a4 + +01f00bb4 : + 1f00bb4: e30820e4 movw r2, #32996 ; 0x80e4 + 1f00bb8: e34021f5 movt r2, #501 ; 0x1f5 + 1f00bbc: e3a01004 mov r1, #4 + 1f00bc0: eafffee2 b 1f00750 + +01f00bc4 : + 1f00bc4: e30820fc movw r2, #33020 ; 0x80fc + 1f00bc8: e34021f5 movt r2, #501 ; 0x1f5 + 1f00bcc: e3a01004 mov r1, #4 + 1f00bd0: eafffede b 1f00750 + +01f00bd4 : + 1f00bd4: e308210c movw r2, #33036 ; 0x810c + 1f00bd8: e34021f5 movt r2, #501 ; 0x1f5 + 1f00bdc: e3a01008 mov r1, #8 + 1f00be0: eafffeda b 1f00750 + +01f00be4 : + 1f00be4: e3082118 movw r2, #33048 ; 0x8118 + 1f00be8: e34021f5 movt r2, #501 ; 0x1f5 + 1f00bec: e3a01004 mov r1, #4 + 1f00bf0: eafffed6 b 1f00750 + +01f00bf4 : + 1f00bf4: e30a32d7 movw r3, #41687 ; 0xa2d7 + 1f00bf8: e340320d movt r3, #525 ; 0x20d + 1f00bfc: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f00c00: e5d33000 ldrb r3, [r3] + 1f00c04: e7e06251 ubfx r6, r1, #4, #1 + 1f00c08: e30ae307 movw lr, #41735 ; 0xa307 + 1f00c0c: e340e20d movt lr, #525 ; 0x20d + 1f00c10: e30a22b4 movw r2, #41652 ; 0xa2b4 + 1f00c14: e340220d movt r2, #525 ; 0x20d + 1f00c18: e30a52bf movw r5, #41663 ; 0xa2bf + 1f00c1c: e340520d movt r5, #525 ; 0x20d + 1f00c20: e30a431c movw r4, #41756 ; 0xa31c + 1f00c24: e340420d movt r4, #525 ; 0x20d + 1f00c28: e30a0298 movw r0, #41624 ; 0xa298 + 1f00c2c: e340020d movt r0, #525 ; 0x20d + 1f00c30: e30ac2be movw ip, #41662 ; 0xa2be + 1f00c34: e340c20d movt ip, #525 ; 0x20d + 1f00c38: e1560003 cmp r6, r3 + 1f00c3c: e5c26000 strb r6, [r2] + 1f00c40: e0233006 eor r3, r3, r6 + 1f00c44: e7e020d1 ubfx r2, r1, #1, #1 + 1f00c48: e5ce3000 strb r3, [lr] + 1f00c4c: e7e011d1 ubfx r1, r1, #3, #1 + 1f00c50: e5c52000 strb r2, [r5] + 1f00c54: e5c41000 strb r1, [r4] + 1f00c58: e5d06000 ldrb r6, [r0] + 1f00c5c: e5dc7000 ldrb r7, [ip] + 1f00c60: 0a00001b beq 1f00cd4 + 1f00c64: e30ae2ec movw lr, #41708 ; 0xa2ec + 1f00c68: e340e20d movt lr, #525 ; 0x20d + 1f00c6c: e30a3305 movw r3, #41733 ; 0xa305 + 1f00c70: e340320d movt r3, #525 ; 0x20d + 1f00c74: e3a08001 mov r8, #1 + 1f00c78: e59ee000 ldr lr, [lr] + 1f00c7c: e5c38000 strb r8, [r3] + 1f00c80: e35e0000 cmp lr, #0 + 1f00c84: 0a000017 beq 1f00ce8 + 1f00c88: e5de301d ldrb r3, [lr, #29] + 1f00c8c: e1833008 orr r3, r3, r8 + 1f00c90: e5ce301d strb r3, [lr, #29] + 1f00c94: e5de301e ldrb r3, [lr, #30] + 1f00c98: e3130002 tst r3, #2 + 1f00c9c: e2033008 and r3, r3, #8 + 1f00ca0: 03a02001 moveq r2, #1 + 1f00ca4: 05c52000 strbeq r2, [r5] + 1f00ca8: e6ef3073 uxtb r3, r3 + 1f00cac: e5c02000 strb r2, [r0] + 1f00cb0: e3530000 cmp r3, #0 + 1f00cb4: 03a01001 moveq r1, #1 + 1f00cb8: 05c41000 strbeq r1, [r4] + 1f00cbc: e1560002 cmp r6, r2 + 1f00cc0: e5cc1000 strb r1, [ip] + 1f00cc4: 3a00001c bcc 1f00d3c + 1f00cc8: e1570001 cmp r7, r1 + 1f00ccc: 3a000012 bcc 1f00d1c + 1f00cd0: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f00cd4: e30a32ec movw r3, #41708 ; 0xa2ec + 1f00cd8: e340320d movt r3, #525 ; 0x20d + 1f00cdc: e593e000 ldr lr, [r3] + 1f00ce0: e35e0000 cmp lr, #0 + 1f00ce4: 1affffea bne 1f00c94 + 1f00ce8: e1560002 cmp r6, r2 + 1f00cec: e5c02000 strb r2, [r0] + 1f00cf0: 330a3305 movwcc r3, #41733 ; 0xa305 + 1f00cf4: 33a02001 movcc r2, #1 + 1f00cf8: 3340320d movtcc r3, #525 ; 0x20d + 1f00cfc: e5cc1000 strb r1, [ip] + 1f00d00: 35c32000 strbcc r2, [r3] + 1f00d04: e1570001 cmp r7, r1 + 1f00d08: 330a32d6 movwcc r3, #41686 ; 0xa2d6 + 1f00d0c: 33a02001 movcc r2, #1 + 1f00d10: 3340320d movtcc r3, #525 ; 0x20d + 1f00d14: 35c32000 strbcc r2, [r3] + 1f00d18: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f00d1c: e30a22d6 movw r2, #41686 ; 0xa2d6 + 1f00d20: e340220d movt r2, #525 ; 0x20d + 1f00d24: e5de301d ldrb r3, [lr, #29] + 1f00d28: e3a01001 mov r1, #1 + 1f00d2c: e5c21000 strb r1, [r2] + 1f00d30: e3833004 orr r3, r3, #4 + 1f00d34: e5ce301d strb r3, [lr, #29] + 1f00d38: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f00d3c: e30a2305 movw r2, #41733 ; 0xa305 + 1f00d40: e340220d movt r2, #525 ; 0x20d + 1f00d44: e5de301d ldrb r3, [lr, #29] + 1f00d48: e1570001 cmp r7, r1 + 1f00d4c: e3a01001 mov r1, #1 + 1f00d50: e3833002 orr r3, r3, #2 + 1f00d54: e5c21000 strb r1, [r2] + 1f00d58: e5ce301d strb r3, [lr, #29] + 1f00d5c: 330a22d6 movwcc r2, #41686 ; 0xa2d6 + 1f00d60: 3340220d movtcc r2, #525 ; 0x20d + 1f00d64: 35c21000 strbcc r1, [r2] + 1f00d68: 3afffff0 bcc 1f00d30 + 1f00d6c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f00d70 : + 1f00d70: e3100902 tst r0, #32768 ; 0x8000 + 1f00d74: 112fff1e bxne lr + 1f00d78: e7e23550 ubfx r3, r0, #10, #3 + 1f00d7c: e3530001 cmp r3, #1 + 1f00d80: 9a000008 bls 1f00da8 + 1f00d84: e3530006 cmp r3, #6 + 1f00d88: 0a00000b beq 1f00dbc + 1f00d8c: e3530007 cmp r3, #7 + 1f00d90: 112fff1e bxne lr + 1f00d94: e1a02001 mov r2, r1 + 1f00d98: e1a01000 mov r1, r0 + 1f00d9c: e3090314 movw r0, #37652 ; 0x9314 + 1f00da0: e34001fa movt r0, #506 ; 0x1fa + 1f00da4: ea00786b b 1f1ef58 + 1f00da8: e7ea0050 ubfx r0, r0, #0, #11 + 1f00dac: e30d3270 movw r3, #53872 ; 0xd270 + 1f00db0: e34031f9 movt r3, #505 ; 0x1f9 + 1f00db4: e7c31000 strb r1, [r3, r0] + 1f00db8: e12fff1e bx lr + 1f00dbc: e1a02001 mov r2, r1 + 1f00dc0: e1a01000 mov r1, r0 + 1f00dc4: e30902bc movw r0, #37564 ; 0x92bc + 1f00dc8: e34001fa movt r0, #506 ; 0x1fa + 1f00dcc: ea007861 b 1f1ef58 + +01f00dd0 : + 1f00dd0: e92d4010 push {r4, lr} + 1f00dd4: e1a04000 mov r4, r0 + 1f00dd8: e5900000 ldr r0, [r0] + 1f00ddc: e3500000 cmp r0, #0 + 1f00de0: 0a000000 beq 1f00de8 + 1f00de4: ebfffe28 bl 1f0068c + 1f00de8: e1a00004 mov r0, r4 + 1f00dec: e8bd8010 pop {r4, pc} + +01f00df0 : + 1f00df0: e3100902 tst r0, #32768 ; 0x8000 + 1f00df4: 112fff1e bxne lr + 1f00df8: e2103b06 ands r3, r0, #6144 ; 0x1800 + 1f00dfc: 0a00000c beq 1f00e34 + 1f00e00: e3530b06 cmp r3, #6144 ; 0x1800 + 1f00e04: 112fff1e bxne lr + 1f00e08: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f00e0c: e309c27c movw ip, #37500 ; 0x927c + 1f00e10: e340c1fa movt ip, #506 ; 0x1fa + 1f00e14: e3a0e058 mov lr, #88 ; 0x58 + 1f00e18: e7e03550 ubfx r3, r0, #10, #1 + 1f00e1c: e1a02001 mov r2, r1 + 1f00e20: e1a01000 mov r1, r0 + 1f00e24: e020c39e mla r0, lr, r3, ip + 1f00e28: e49de004 pop {lr} ; (ldr lr, [sp], #4) + 1f00e2c: e2800040 add r0, r0, #64 ; 0x40 + 1f00e30: ea007848 b 1f1ef58 + 1f00e34: e30d3270 movw r3, #53872 ; 0xd270 + 1f00e38: e34031f9 movt r3, #505 ; 0x1f9 + 1f00e3c: e7c31000 strb r1, [r3, r0] + 1f00e40: e12fff1e bx lr + +01f00e44 : + 1f00e44: e92d4070 push {r4, r5, r6, lr} + 1f00e48: e1a01000 mov r1, r0 + 1f00e4c: e1a05000 mov r5, r0 + 1f00e50: e24ddf96 sub sp, sp, #600 ; 0x258 + 1f00e54: e3a02001 mov r2, #1 + 1f00e58: e28d0010 add r0, sp, #16 + 1f00e5c: eb002fac bl 1f0cd14 + 1f00e60: e2504000 subs r4, r0, #0 + 1f00e64: 0a00000b beq 1f00e98 + 1f00e68: e3083018 movw r3, #32792 ; 0x8018 + 1f00e6c: e34031f6 movt r3, #502 ; 0x1f6 + 1f00e70: e2833802 add r3, r3, #131072 ; 0x20000 + 1f00e74: e3a04000 mov r4, #0 + 1f00e78: e1a01005 mov r1, r5 + 1f00e7c: e3080138 movw r0, #33080 ; 0x8138 + 1f00e80: e34001f5 movt r0, #501 ; 0x1f5 + 1f00e84: e5c34800 strb r4, [r3, #2048] ; 0x800 + 1f00e88: eb00f8af bl 1f3f14c + 1f00e8c: e1a00004 mov r0, r4 + 1f00e90: e28ddf96 add sp, sp, #600 ; 0x258 + 1f00e94: e8bd8070 pop {r4, r5, r6, pc} + 1f00e98: e3a00001 mov r0, #1 + 1f00e9c: e3086018 movw r6, #32792 ; 0x8018 + 1f00ea0: e34061f6 movt r6, #502 ; 0x1f6 + 1f00ea4: eb000e9b bl 1f04918 + 1f00ea8: e2866802 add r6, r6, #131072 ; 0x20000 + 1f00eac: e28d300c add r3, sp, #12 + 1f00eb0: e3a02901 mov r2, #16384 ; 0x4000 + 1f00eb4: e3081018 movw r1, #32792 ; 0x8018 + 1f00eb8: e34011f6 movt r1, #502 ; 0x1f6 + 1f00ebc: e28d0010 add r0, sp, #16 + 1f00ec0: eb0031b0 bl 1f0d588 + 1f00ec4: e3a020ff mov r2, #255 ; 0xff + 1f00ec8: e1a01005 mov r1, r5 + 1f00ecc: e1a00006 mov r0, r6 + 1f00ed0: eb00fccb bl 1f40204 + 1f00ed4: e1a00004 mov r0, r4 + 1f00ed8: e3a04001 mov r4, #1 + 1f00edc: e5c64800 strb r4, [r6, #2048] ; 0x800 + 1f00ee0: eb000e8c bl 1f04918 + 1f00ee4: e28d0010 add r0, sp, #16 + 1f00ee8: eb0037ae bl 1f0eda8 + 1f00eec: e59d300c ldr r3, [sp, #12] + 1f00ef0: e1a01005 mov r1, r5 + 1f00ef4: e308011c movw r0, #33052 ; 0x811c + 1f00ef8: e34001f5 movt r0, #501 ; 0x1f5 + 1f00efc: e2432901 sub r2, r3, #16384 ; 0x4000 + 1f00f00: e16f2f12 clz r2, r2 + 1f00f04: e1a022a2 lsr r2, r2, #5 + 1f00f08: e58d2000 str r2, [sp] + 1f00f0c: e3a02901 mov r2, #16384 ; 0x4000 + 1f00f10: eb00f88d bl 1f3f14c + 1f00f14: e1a00004 mov r0, r4 + 1f00f18: eaffffdc b 1f00e90 + +01f00f1c : + 1f00f1c: e3100902 tst r0, #32768 ; 0x8000 + 1f00f20: 1a000008 bne 1f00f48 + 1f00f24: e7e23550 ubfx r3, r0, #10, #3 + 1f00f28: e3530001 cmp r3, #1 + 1f00f2c: 9a00000d bls 1f00f68 + 1f00f30: e3530006 cmp r3, #6 + 1f00f34: 0a000010 beq 1f00f7c + 1f00f38: e3530007 cmp r3, #7 + 1f00f3c: 0a000012 beq 1f00f8c + 1f00f40: e1a00420 lsr r0, r0, #8 + 1f00f44: e12fff1e bx lr + 1f00f48: e3083018 movw r3, #32792 ; 0x8018 + 1f00f4c: e34031f6 movt r3, #502 ; 0x1f6 + 1f00f50: e2832802 add r2, r3, #131072 ; 0x20000 + 1f00f54: e7ed0050 ubfx r0, r0, #0, #14 + 1f00f58: e5922808 ldr r2, [r2, #2056] ; 0x808 + 1f00f5c: e0833702 add r3, r3, r2, lsl #14 + 1f00f60: e7d30000 ldrb r0, [r3, r0] + 1f00f64: e12fff1e bx lr + 1f00f68: e7ea0050 ubfx r0, r0, #0, #11 + 1f00f6c: e30d3270 movw r3, #53872 ; 0xd270 + 1f00f70: e34031f9 movt r3, #505 ; 0x1f9 + 1f00f74: e7d30000 ldrb r0, [r3, r0] + 1f00f78: e12fff1e bx lr + 1f00f7c: e1a01000 mov r1, r0 + 1f00f80: e30902bc movw r0, #37564 ; 0x92bc + 1f00f84: e34001fa movt r0, #506 ; 0x1fa + 1f00f88: ea0076b1 b 1f1ea54 + 1f00f8c: e1a01000 mov r1, r0 + 1f00f90: e3090314 movw r0, #37652 ; 0x9314 + 1f00f94: e34001fa movt r0, #506 ; 0x1fa + 1f00f98: ea0076ad b 1f1ea54 + +01f00f9c : + 1f00f9c: e3100902 tst r0, #32768 ; 0x8000 + 1f00fa0: 1a000006 bne 1f00fc0 + 1f00fa4: e2003b06 and r3, r0, #6144 ; 0x1800 + 1f00fa8: e3530b06 cmp r3, #6144 ; 0x1800 + 1f00fac: 0a00000b beq 1f00fe0 + 1f00fb0: e30d3270 movw r3, #53872 ; 0xd270 + 1f00fb4: e34031f9 movt r3, #505 ; 0x1f9 + 1f00fb8: e7d30000 ldrb r0, [r3, r0] + 1f00fbc: e12fff1e bx lr + 1f00fc0: e3083018 movw r3, #32792 ; 0x8018 + 1f00fc4: e34031f6 movt r3, #502 ; 0x1f6 + 1f00fc8: e2832802 add r2, r3, #131072 ; 0x20000 + 1f00fcc: e7ed0050 ubfx r0, r0, #0, #14 + 1f00fd0: e5922808 ldr r2, [r2, #2056] ; 0x808 + 1f00fd4: e0833702 add r3, r3, r2, lsl #14 + 1f00fd8: e7d30000 ldrb r0, [r3, r0] + 1f00fdc: e12fff1e bx lr + 1f00fe0: e309227c movw r2, #37500 ; 0x927c + 1f00fe4: e34021fa movt r2, #506 ; 0x1fa + 1f00fe8: e7e03550 ubfx r3, r0, #10, #1 + 1f00fec: e3a0c058 mov ip, #88 ; 0x58 + 1f00ff0: e1a01000 mov r1, r0 + 1f00ff4: e020239c mla r0, ip, r3, r2 + 1f00ff8: e2800040 add r0, r0, #64 ; 0x40 + 1f00ffc: ea007694 b 1f1ea54 + +01f01000 : + 1f01000: e30a22f8 movw r2, #41720 ; 0xa2f8 + 1f01004: e340220d movt r2, #525 ; 0x20d + 1f01008: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f0100c: e5d22000 ldrb r2, [r2] + 1f01010: e3a03000 mov r3, #0 + 1f01014: e3433f20 movt r3, #16160 ; 0x3f20 + 1f01018: e3520000 cmp r2, #0 + 1f0101c: e3e01000 mvn r1, #0 + 1f01020: e24dd014 sub sp, sp, #20 + 1f01024: e5831028 str r1, [r3, #40] ; 0x28 + 1f01028: 1a000062 bne 1f011b8 + 1f0102c: e30a12f0 movw r1, #41712 ; 0xa2f0 + 1f01030: e340120d movt r1, #525 ; 0x20d + 1f01034: e5930000 ldr r0, [r3] + 1f01038: e30a22f4 movw r2, #41716 ; 0xa2f4 + 1f0103c: e340220d movt r2, #525 ; 0x20d + 1f01040: e5810000 str r0, [r1] + 1f01044: e5933004 ldr r3, [r3, #4] + 1f01048: e3833701 orr r3, r3, #262144 ; 0x40000 + 1f0104c: e3833c02 orr r3, r3, #512 ; 0x200 + 1f01050: e5823000 str r3, [r2] + 1f01054: e3a03a01 mov r3, #4096 ; 0x1000 + 1f01058: e3433f10 movt r3, #16144 ; 0x3f10 + 1f0105c: e3a02903 mov r2, #49152 ; 0xc000 + 1f01060: e3432f20 movt r2, #16160 ; 0x3f20 + 1f01064: e3a01a02 mov r1, #8192 ; 0x2000 + 1f01068: e3451a00 movt r1, #23040 ; 0x5a00 + 1f0106c: e3a00011 mov r0, #17 + 1f01070: e3450a00 movt r0, #23040 ; 0x5a00 + 1f01074: e58310a4 str r1, [r3, #164] ; 0xa4 + 1f01078: e3a01f6d mov r1, #436 ; 0x1b4 + 1f0107c: e58300a0 str r0, [r3, #160] ; 0xa0 + 1f01080: e3020161 movw r0, #8545 ; 0x2161 + 1f01084: e5821010 str r1, [r2, #16] + 1f01088: e3a03000 mov r3, #0 + 1f0108c: e5821020 str r1, [r2, #32] + 1f01090: e5820000 str r0, [r2] + 1f01094: e58d300c str r3, [sp, #12] + 1f01098: e59d200c ldr r2, [sp, #12] + 1f0109c: e3520004 cmp r2, #4 + 1f010a0: ca000021 bgt 1f0112c + 1f010a4: e30aa2b8 movw sl, #41656 ; 0xa2b8 + 1f010a8: e340a20d movt sl, #525 ; 0x20d + 1f010ac: e30a9300 movw r9, #41728 ; 0xa300 + 1f010b0: e340920d movt r9, #525 ; 0x20d + 1f010b4: e30a8308 movw r8, #41736 ; 0xa308 + 1f010b8: e340820d movt r8, #525 ; 0x20d + 1f010bc: e30a72d8 movw r7, #41688 ; 0xa2d8 + 1f010c0: e340720d movt r7, #525 ; 0x20d + 1f010c4: e30a62a0 movw r6, #41632 ; 0xa2a0 + 1f010c8: e340620d movt r6, #525 ; 0x20d + 1f010cc: e30a22c0 movw r2, #41664 ; 0xa2c0 + 1f010d0: e340220d movt r2, #525 ; 0x20d + 1f010d4: e3a0be4e mov fp, #1248 ; 0x4e0 + 1f010d8: e340b007 movt fp, #7 + 1f010dc: e58d2004 str r2, [sp, #4] + 1f010e0: e59d500c ldr r5, [sp, #12] + 1f010e4: e59d400c ldr r4, [sp, #12] + 1f010e8: e59de00c ldr lr, [sp, #12] + 1f010ec: e59dc00c ldr ip, [sp, #12] + 1f010f0: e59d000c ldr r0, [sp, #12] + 1f010f4: e59d100c ldr r1, [sp, #12] + 1f010f8: e59d200c ldr r2, [sp, #12] + 1f010fc: e7ca3005 strb r3, [sl, r5] + 1f01100: e2822001 add r2, r2, #1 + 1f01104: e58d200c str r2, [sp, #12] + 1f01108: e59d200c ldr r2, [sp, #12] + 1f0110c: e7c93004 strb r3, [r9, r4] + 1f01110: e3520004 cmp r2, #4 + 1f01114: e59d2004 ldr r2, [sp, #4] + 1f01118: e788310e str r3, [r8, lr, lsl #2] + 1f0111c: e787b10c str fp, [r7, ip, lsl #2] + 1f01120: e7863100 str r3, [r6, r0, lsl #2] + 1f01124: e7823101 str r3, [r2, r1, lsl #2] + 1f01128: daffffec ble 1f010e0 + 1f0112c: e30431cc movw r3, #16844 ; 0x41cc + 1f01130: e34031f6 movt r3, #502 ; 0x1f6 + 1f01134: e3a00002 mov r0, #2 + 1f01138: e3a01000 mov r1, #0 + 1f0113c: e5932000 ldr r2, [r3] + 1f01140: e5820094 str r0, [r2, #148] ; 0x94 + 1f01144: e58d100c str r1, [sp, #12] + 1f01148: e59d300c ldr r3, [sp, #12] + 1f0114c: e3530095 cmp r3, #149 ; 0x95 + 1f01150: ca000005 bgt 1f0116c + 1f01154: e59d300c ldr r3, [sp, #12] + 1f01158: e2833001 add r3, r3, #1 + 1f0115c: e58d300c str r3, [sp, #12] + 1f01160: e59d300c ldr r3, [sp, #12] + 1f01164: e3530095 cmp r3, #149 ; 0x95 + 1f01168: dafffff9 ble 1f01154 + 1f0116c: e3a03030 mov r3, #48 ; 0x30 + 1f01170: e34038c0 movt r3, #2240 ; 0x8c0 + 1f01174: e3a01000 mov r1, #0 + 1f01178: e5823098 str r3, [r2, #152] ; 0x98 + 1f0117c: e58d100c str r1, [sp, #12] + 1f01180: e59d300c ldr r3, [sp, #12] + 1f01184: e3530095 cmp r3, #149 ; 0x95 + 1f01188: ca000005 bgt 1f011a4 + 1f0118c: e59d300c ldr r3, [sp, #12] + 1f01190: e2833001 add r3, r3, #1 + 1f01194: e58d300c str r3, [sp, #12] + 1f01198: e59d300c ldr r3, [sp, #12] + 1f0119c: e3530095 cmp r3, #149 ; 0x95 + 1f011a0: dafffff9 ble 1f0118c + 1f011a4: e3a03000 mov r3, #0 + 1f011a8: e5823094 str r3, [r2, #148] ; 0x94 + 1f011ac: e5823098 str r3, [r2, #152] ; 0x98 + 1f011b0: e28dd014 add sp, sp, #20 + 1f011b4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f011b8: e3a01000 mov r1, #0 + 1f011bc: e3a00004 mov r0, #4 + 1f011c0: eb000beb bl 1f04174 + 1f011c4: e3a01000 mov r1, #0 + 1f011c8: e3a00005 mov r0, #5 + 1f011cc: eb000be8 bl 1f04174 + 1f011d0: e3a01000 mov r1, #0 + 1f011d4: e3a00014 mov r0, #20 + 1f011d8: eb000be5 bl 1f04174 + 1f011dc: e3a01000 mov r1, #0 + 1f011e0: e3a00015 mov r0, #21 + 1f011e4: eb000be2 bl 1f04174 + 1f011e8: e3a01000 mov r1, #0 + 1f011ec: e3a00016 mov r0, #22 + 1f011f0: eb000bdf bl 1f04174 + 1f011f4: e3a01000 mov r1, #0 + 1f011f8: e3a00017 mov r0, #23 + 1f011fc: eb000bdc bl 1f04174 + 1f01200: e3a01000 mov r1, #0 + 1f01204: e3a00018 mov r0, #24 + 1f01208: eb000bd9 bl 1f04174 + 1f0120c: e3a01000 mov r1, #0 + 1f01210: e3a00019 mov r0, #25 + 1f01214: eb000bd6 bl 1f04174 + 1f01218: e3a01000 mov r1, #0 + 1f0121c: e3a0001a mov r0, #26 + 1f01220: eb000bd3 bl 1f04174 + 1f01224: e3a01000 mov r1, #0 + 1f01228: e3a0001b mov r0, #27 + 1f0122c: eb000bd0 bl 1f04174 + 1f01230: e3a01001 mov r1, #1 + 1f01234: e3a00006 mov r0, #6 + 1f01238: eb000bcd bl 1f04174 + 1f0123c: e3a01001 mov r1, #1 + 1f01240: e3a0000c mov r0, #12 + 1f01244: eb000bca bl 1f04174 + 1f01248: e3a01001 mov r1, #1 + 1f0124c: e3a0000d mov r0, #13 + 1f01250: eb000bc7 bl 1f04174 + 1f01254: e3a01001 mov r1, #1 + 1f01258: e3a00010 mov r0, #16 + 1f0125c: eb000bc4 bl 1f04174 + 1f01260: e3a01001 mov r1, #1 + 1f01264: e3a00011 mov r0, #17 + 1f01268: eb000bc1 bl 1f04174 + 1f0126c: e3a01001 mov r1, #1 + 1f01270: e3a00012 mov r0, #18 + 1f01274: eb000bbe bl 1f04174 + 1f01278: e3a01001 mov r1, #1 + 1f0127c: e3a00013 mov r0, #19 + 1f01280: eb000bbb bl 1f04174 + 1f01284: eaffff72 b 1f01054 + +01f01288 : + 1f01288: e92d000c push {r2, r3} + 1f0128c: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f01290: e24dd00c sub sp, sp, #12 + 1f01294: e28d3014 add r3, sp, #20 + 1f01298: e1a01003 mov r1, r3 + 1f0129c: e59d0010 ldr r0, [sp, #16] + 1f012a0: e58d3004 str r3, [sp, #4] + 1f012a4: eb010f90 bl 1f450ec + 1f012a8: e28dd00c add sp, sp, #12 + 1f012ac: e49de004 pop {lr} ; (ldr lr, [sp], #4) + 1f012b0: e28dd008 add sp, sp, #8 + 1f012b4: e12fff1e bx lr + +01f012b8 : + 1f012b8: e92d4010 push {r4, lr} + 1f012bc: e1a04000 mov r4, r0 + 1f012c0: eb00099e bl 1f03940 + 1f012c4: e3a00003 mov r0, #3 + 1f012c8: e3400001 movt r0, #1 + 1f012cc: eb0009a7 bl 1f03970 + 1f012d0: eb000b3c bl 1f03fc8 + 1f012d4: e3a00003 mov r0, #3 + 1f012d8: e3400001 movt r0, #1 + 1f012dc: eb000b57 bl 1f04040 + 1f012e0: e2503000 subs r3, r0, #0 + 1f012e4: 0a00000d beq 1f01320 + 1f012e8: e5d32008 ldrb r2, [r3, #8] + 1f012ec: e3a00001 mov r0, #1 + 1f012f0: e5c42000 strb r2, [r4] + 1f012f4: e5d32009 ldrb r2, [r3, #9] + 1f012f8: e5c42001 strb r2, [r4, #1] + 1f012fc: e5d3200a ldrb r2, [r3, #10] + 1f01300: e5c42002 strb r2, [r4, #2] + 1f01304: e5d3200b ldrb r2, [r3, #11] + 1f01308: e5c42003 strb r2, [r4, #3] + 1f0130c: e5d3200c ldrb r2, [r3, #12] + 1f01310: e5c42004 strb r2, [r4, #4] + 1f01314: e5d3300d ldrb r3, [r3, #13] + 1f01318: e5c43005 strb r3, [r4, #5] + 1f0131c: e8bd8010 pop {r4, pc} + 1f01320: e1a00003 mov r0, r3 + 1f01324: e8bd8010 pop {r4, pc} + +01f01328 : + 1f01328: e3a01a0b mov r1, #45056 ; 0xb000 + 1f0132c: e3431f00 movt r1, #16128 ; 0x3f00 + 1f01330: e5912898 ldr r2, [r1, #2200] ; 0x898 + 1f01334: e3a03a0b mov r3, #45056 ; 0xb000 + 1f01338: e3433f00 movt r3, #16128 ; 0x3f00 + 1f0133c: e3520000 cmp r2, #0 + 1f01340: bafffffa blt 1f01330 + 1f01344: e3a00080 mov r0, #128 ; 0x80 + 1f01348: e1a02003 mov r2, r3 + 1f0134c: e1a01003 mov r1, r3 + 1f01350: e58308a0 str r0, [r3, #2208] ; 0x8a0 + 1f01354: e5923898 ldr r3, [r2, #2200] ; 0x898 + 1f01358: e3130101 tst r3, #1073741824 ; 0x40000000 + 1f0135c: 1afffffc bne 1f01354 + 1f01360: e5910880 ldr r0, [r1, #2176] ; 0x880 + 1f01364: e310000f tst r0, #15 + 1f01368: 1afffff9 bne 1f01354 + 1f0136c: e2400080 sub r0, r0, #128 ; 0x80 + 1f01370: e16f0f10 clz r0, r0 + 1f01374: e1a002a0 lsr r0, r0, #5 + 1f01378: e12fff1e bx lr + +01f0137c : + 1f0137c: e3500000 cmp r0, #0 + 1f01380: 012fff1e bxeq lr + 1f01384: e3a02a03 mov r2, #12288 ; 0x3000 + 1f01388: e3432f00 movt r2, #16128 ; 0x3f00 + 1f0138c: e3a0c000 mov ip, #0 + 1f01390: e5921004 ldr r1, [r2, #4] + 1f01394: e5923004 ldr r3, [r2, #4] + 1f01398: e1510003 cmp r1, r3 + 1f0139c: 0afffffc beq 1f01394 + 1f013a0: e28cc001 add ip, ip, #1 + 1f013a4: e150000c cmp r0, ip + 1f013a8: 1afffff8 bne 1f01390 + 1f013ac: e12fff1e bx lr + +01f013b0 : + 1f013b0: e3a03ffa mov r3, #1000 ; 0x3e8 + 1f013b4: e0000093 mul r0, r3, r0 + 1f013b8: e3500000 cmp r0, #0 + 1f013bc: 012fff1e bxeq lr + 1f013c0: e3a02a03 mov r2, #12288 ; 0x3000 + 1f013c4: e3432f00 movt r2, #16128 ; 0x3f00 + 1f013c8: e3a0c000 mov ip, #0 + 1f013cc: e5921004 ldr r1, [r2, #4] + 1f013d0: e5923004 ldr r3, [r2, #4] + 1f013d4: e1510003 cmp r1, r3 + 1f013d8: 0afffffc beq 1f013d0 + 1f013dc: e28cc001 add ip, ip, #1 + 1f013e0: e150000c cmp r0, ip + 1f013e4: 1afffff8 bne 1f013cc + 1f013e8: e12fff1e bx lr + +01f013ec : + 1f013ec: ea00e276 b 1f39dcc + +01f013f0 : + 1f013f0: ea00e293 b 1f39e44 + +01f013f4 : + 1f013f4: ea004220 b 1f11c7c + +01f013f8 : + 1f013f8: e3a00000 mov r0, #0 + 1f013fc: e12fff1e bx lr + +01f01400 : + 1f01400: e3100902 tst r0, #32768 ; 0x8000 + 1f01404: 1a000008 bne 1f0142c + 1f01408: e7e23550 ubfx r3, r0, #10, #3 + 1f0140c: e3530001 cmp r3, #1 + 1f01410: 9a00000d bls 1f0144c + 1f01414: e3530006 cmp r3, #6 + 1f01418: 0a000010 beq 1f01460 + 1f0141c: e3530007 cmp r3, #7 + 1f01420: 0a000012 beq 1f01470 + 1f01424: e1a00420 lsr r0, r0, #8 + 1f01428: e12fff1e bx lr + 1f0142c: e3083018 movw r3, #32792 ; 0x8018 + 1f01430: e34031f6 movt r3, #502 ; 0x1f6 + 1f01434: e2832802 add r2, r3, #131072 ; 0x20000 + 1f01438: e7ed0050 ubfx r0, r0, #0, #14 + 1f0143c: e5922808 ldr r2, [r2, #2056] ; 0x808 + 1f01440: e0833702 add r3, r3, r2, lsl #14 + 1f01444: e7d30000 ldrb r0, [r3, r0] + 1f01448: e12fff1e bx lr + 1f0144c: e7ea0050 ubfx r0, r0, #0, #11 + 1f01450: e30d3270 movw r3, #53872 ; 0xd270 + 1f01454: e34031f9 movt r3, #505 ; 0x1f9 + 1f01458: e7d30000 ldrb r0, [r3, r0] + 1f0145c: e12fff1e bx lr + 1f01460: e1a01000 mov r1, r0 + 1f01464: e30902bc movw r0, #37564 ; 0x92bc + 1f01468: e34001fa movt r0, #506 ; 0x1fa + 1f0146c: ea00766c b 1f1ee24 + 1f01470: e1a01000 mov r1, r0 + 1f01474: e3090314 movw r0, #37652 ; 0x9314 + 1f01478: e34001fa movt r0, #506 ; 0x1fa + 1f0147c: ea007668 b 1f1ee24 + +01f01480 : + 1f01480: e92d4010 push {r4, lr} + 1f01484: eb000d5c bl 1f049fc + 1f01488: eb000d40 bl 1f04990 + 1f0148c: e3a01008 mov r1, #8 + 1f01490: e3a00cc2 mov r0, #49664 ; 0xc200 + 1f01494: e3400001 movt r0, #1 + 1f01498: eb0008b7 bl 1f0377c + 1f0149c: e3a03010 mov r3, #16 + 1f014a0: e3a02c03 mov r2, #768 ; 0x300 + 1f014a4: e3a01b01 mov r1, #1024 ; 0x400 + 1f014a8: e30907a4 movw r0, #38820 ; 0x97a4 + 1f014ac: e34001fa movt r0, #506 ; 0x1fa + 1f014b0: eb00dfb8 bl 1f39398 + 1f014b4: eb000921 bl 1f03940 + 1f014b8: e3a01003 mov r1, #3 + 1f014bc: e3a00004 mov r0, #4 + 1f014c0: e3400003 movt r0, #3 + 1f014c4: eb000929 bl 1f03970 + 1f014c8: eb000abe bl 1f03fc8 + 1f014cc: e3a00004 mov r0, #4 + 1f014d0: e3400003 movt r0, #3 + 1f014d4: eb000ad9 bl 1f04040 + 1f014d8: e3500000 cmp r0, #0 + 1f014dc: 01a04000 moveq r4, r0 + 1f014e0: 1590400c ldrne r4, [r0, #12] + 1f014e4: eb000915 bl 1f03940 + 1f014e8: e3080002 movw r0, #32770 ; 0x8002 + 1f014ec: e3400003 movt r0, #3 + 1f014f0: e1a02004 mov r2, r4 + 1f014f4: e3a01003 mov r1, #3 + 1f014f8: eb00091c bl 1f03970 + 1f014fc: e8bd4010 pop {r4, lr} + 1f01500: ea000ab0 b 1f03fc8 + +01f01504 : + 1f01504: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f01508: e3a00006 mov r0, #6 + 1f0150c: e3a04000 mov r4, #0 + 1f01510: e24dd044 sub sp, sp, #68 ; 0x44 + 1f01514: e309a27c movw sl, #37500 ; 0x927c + 1f01518: e340a1fa movt sl, #506 ; 0x1fa + 1f0151c: eb00e30a bl 1f3a14c + 1f01520: e3098398 movw r8, #37784 ; 0x9398 + 1f01524: e34081fa movt r8, #506 ; 0x1fa + 1f01528: e30a22d7 movw r2, #41687 ; 0xa2d7 + 1f0152c: e340220d movt r2, #525 ; 0x20d + 1f01530: e309b79a movw fp, #38810 ; 0x979a + 1f01534: e340b1fa movt fp, #506 ; 0x1fa + 1f01538: e58d2030 str r2, [sp, #48] ; 0x30 + 1f0153c: e1a06004 mov r6, r4 + 1f01540: e30a2305 movw r2, #41733 ; 0xa305 + 1f01544: e340220d movt r2, #525 ; 0x20d + 1f01548: e58d003c str r0, [sp, #60] ; 0x3c + 1f0154c: e1a03004 mov r3, r4 + 1f01550: e58d2034 str r2, [sp, #52] ; 0x34 + 1f01554: e30a22d6 movw r2, #41686 ; 0xa2d6 + 1f01558: e340220d movt r2, #525 ; 0x20d + 1f0155c: e58d2038 str r2, [sp, #56] ; 0x38 + 1f01560: e58d4020 str r4, [sp, #32] + 1f01564: e3092278 movw r2, #37496 ; 0x9278 + 1f01568: e34021fa movt r2, #506 ; 0x1fa + 1f0156c: e58d202c str r2, [sp, #44] ; 0x2c + 1f01570: e58d4028 str r4, [sp, #40] ; 0x28 + 1f01574: e58d4024 str r4, [sp, #36] ; 0x24 + 1f01578: e58d401c str r4, [sp, #28] + 1f0157c: ea000099 b 1f017e8 + 1f01580: e1530006 cmp r3, r6 + 1f01584: 0a0000fe beq 1f01984 + 1f01588: e3e038ff mvn r3, #16711680 ; 0xff0000 + 1f0158c: e30907a4 movw r0, #38820 ; 0x97a4 + 1f01590: e34001fa movt r0, #506 ; 0x1fa + 1f01594: e58d3000 str r3, [sp] + 1f01598: e3a02faa mov r2, #680 ; 0x2a8 + 1f0159c: e30032c3 movw r3, #707 ; 0x2c3 + 1f015a0: e1a01004 mov r1, r4 + 1f015a4: eb00e0c2 bl 1f398b4 + 1f015a8: e1a03006 mov r3, r6 + 1f015ac: e3a01b01 mov r1, #1024 ; 0x400 + 1f015b0: e308216c movw r2, #33132 ; 0x816c + 1f015b4: e34021f5 movt r2, #501 ; 0x1f5 + 1f015b8: e3090398 movw r0, #37784 ; 0x9398 + 1f015bc: e34001fa movt r0, #506 ; 0x1fa + 1f015c0: eb00f905 bl 1f3f9dc + 1f015c4: e3a03000 mov r3, #0 + 1f015c8: e3a024ff mov r2, #-16777216 ; 0xff000000 + 1f015cc: e1a01003 mov r1, r3 + 1f015d0: e58d3014 str r3, [sp, #20] + 1f015d4: e3e0c000 mvn ip, #0 + 1f015d8: e58d3010 str r3, [sp, #16] + 1f015dc: e30907a4 movw r0, #38820 ; 0x97a4 + 1f015e0: e34001fa movt r0, #506 ; 0x1fa + 1f015e4: e58d300c str r3, [sp, #12] + 1f015e8: e300328a movw r3, #650 ; 0x28a + 1f015ec: e58d2004 str r2, [sp, #4] + 1f015f0: e3a020e8 mov r2, #232 ; 0xe8 + 1f015f4: e58d8000 str r8, [sp] + 1f015f8: e58dc008 str ip, [sp, #8] + 1f015fc: eb00e0c6 bl 1f3991c + 1f01600: e5db3000 ldrb r3, [fp] + 1f01604: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f01608: e3530000 cmp r3, #0 + 1f0160c: e5d29000 ldrb r9, [r2] + 1f01610: 0a0000c6 beq 1f01930 + 1f01614: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f01618: e1530009 cmp r3, r9 + 1f0161c: 0a0000c5 beq 1f01938 + 1f01620: e3a02cff mov r2, #65280 ; 0xff00 + 1f01624: e30907a4 movw r0, #38820 ; 0x97a4 + 1f01628: e34001fa movt r0, #506 ; 0x1fa + 1f0162c: e7df2812 bfi r2, r2, #16, #16 + 1f01630: e3a03e2e mov r3, #736 ; 0x2e0 + 1f01634: e58d2000 str r2, [sp] + 1f01638: e1a01004 mov r1, r4 + 1f0163c: e30022c5 movw r2, #709 ; 0x2c5 + 1f01640: e58d9024 str r9, [sp, #36] ; 0x24 + 1f01644: eb00e09a bl 1f398b4 + 1f01648: e1a03009 mov r3, r9 + 1f0164c: e3a01b01 mov r1, #1024 ; 0x400 + 1f01650: e308216c movw r2, #33132 ; 0x816c + 1f01654: e34021f5 movt r2, #501 ; 0x1f5 + 1f01658: e3090398 movw r0, #37784 ; 0x9398 + 1f0165c: e34001fa movt r0, #506 ; 0x1fa + 1f01660: eb00f8dd bl 1f3f9dc + 1f01664: e3a03000 mov r3, #0 + 1f01668: e3a024ff mov r2, #-16777216 ; 0xff000000 + 1f0166c: e1a01003 mov r1, r3 + 1f01670: e58d3014 str r3, [sp, #20] + 1f01674: e3e0c000 mvn ip, #0 + 1f01678: e58d3010 str r3, [sp, #16] + 1f0167c: e30907a4 movw r0, #38820 ; 0x97a4 + 1f01680: e34001fa movt r0, #506 ; 0x1fa + 1f01684: e58d300c str r3, [sp, #12] + 1f01688: e300328a movw r3, #650 ; 0x28a + 1f0168c: e58d2004 str r2, [sp, #4] + 1f01690: e3a02f46 mov r2, #280 ; 0x118 + 1f01694: e58d8000 str r8, [sp] + 1f01698: e58dc008 str ip, [sp, #8] + 1f0169c: eb00e09e bl 1f3991c + 1f016a0: e5db3000 ldrb r3, [fp] + 1f016a4: e59d2038 ldr r2, [sp, #56] ; 0x38 + 1f016a8: e3530000 cmp r3, #0 + 1f016ac: e5d29000 ldrb r9, [r2] + 1f016b0: 0a00009c beq 1f01928 + 1f016b4: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f016b8: e1530009 cmp r3, r9 + 1f016bc: 0a0000c3 beq 1f019d0 + 1f016c0: e3e030ff mvn r3, #255 ; 0xff + 1f016c4: e30907a4 movw r0, #38820 ; 0x97a4 + 1f016c8: e34001fa movt r0, #506 ; 0x1fa + 1f016cc: e58d3000 str r3, [sp] + 1f016d0: e30022e2 movw r2, #738 ; 0x2e2 + 1f016d4: e30032ff movw r3, #767 ; 0x2ff + 1f016d8: e1a01004 mov r1, r4 + 1f016dc: e58d601c str r6, [sp, #28] + 1f016e0: eb00e073 bl 1f398b4 + 1f016e4: e58d9028 str r9, [sp, #40] ; 0x28 + 1f016e8: e1a03009 mov r3, r9 + 1f016ec: e3a01b01 mov r1, #1024 ; 0x400 + 1f016f0: e308216c movw r2, #33132 ; 0x816c + 1f016f4: e34021f5 movt r2, #501 ; 0x1f5 + 1f016f8: e3090398 movw r0, #37784 ; 0x9398 + 1f016fc: e34001fa movt r0, #506 ; 0x1fa + 1f01700: eb00f8b5 bl 1f3f9dc + 1f01704: e3a03000 mov r3, #0 + 1f01708: e3a024ff mov r2, #-16777216 ; 0xff000000 + 1f0170c: e1a01003 mov r1, r3 + 1f01710: e58d3014 str r3, [sp, #20] + 1f01714: e3e0c000 mvn ip, #0 + 1f01718: e58d3010 str r3, [sp, #16] + 1f0171c: e30907a4 movw r0, #38820 ; 0x97a4 + 1f01720: e34001fa movt r0, #506 ; 0x1fa + 1f01724: e58d300c str r3, [sp, #12] + 1f01728: e300328a movw r3, #650 ; 0x28a + 1f0172c: e58d2004 str r2, [sp, #4] + 1f01730: e3a02f52 mov r2, #328 ; 0x148 + 1f01734: e58d8000 str r8, [sp] + 1f01738: e58dc008 str ip, [sp, #8] + 1f0173c: eb00e076 bl 1f3991c + 1f01740: e59a6014 ldr r6, [sl, #20] + 1f01744: e3540b01 cmp r4, #1024 ; 0x400 + 1f01748: e59d3020 ldr r3, [sp, #32] + 1f0174c: b2844001 addlt r4, r4, #1 + 1f01750: a3a04000 movge r4, #0 + 1f01754: e1530006 cmp r3, r6 + 1f01758: 0a00001a beq 1f017c8 + 1f0175c: e3160001 tst r6, #1 + 1f01760: e1a030a6 lsr r3, r6, #1 + 1f01764: 13a02005 movne r2, #5 + 1f01768: 03a02000 moveq r2, #0 + 1f0176c: e2833001 add r3, r3, #1 + 1f01770: e58d2000 str r2, [sp] + 1f01774: e3a01b01 mov r1, #1024 ; 0x400 + 1f01778: e3082158 movw r2, #33112 ; 0x8158 + 1f0177c: e34021f5 movt r2, #501 ; 0x1f5 + 1f01780: e3090398 movw r0, #37784 ; 0x9398 + 1f01784: e34001fa movt r0, #506 ; 0x1fa + 1f01788: eb00f893 bl 1f3f9dc + 1f0178c: e3a03000 mov r3, #0 + 1f01790: e3a024ff mov r2, #-16777216 ; 0xff000000 + 1f01794: e1a01003 mov r1, r3 + 1f01798: e58d3014 str r3, [sp, #20] + 1f0179c: e3e0c000 mvn ip, #0 + 1f017a0: e58d3010 str r3, [sp, #16] + 1f017a4: e30907a4 movw r0, #38820 ; 0x97a4 + 1f017a8: e34001fa movt r0, #506 ; 0x1fa + 1f017ac: e58d300c str r3, [sp, #12] + 1f017b0: e300328a movw r3, #650 ; 0x28a + 1f017b4: e58d2004 str r2, [sp, #4] + 1f017b8: e3a020a0 mov r2, #160 ; 0xa0 + 1f017bc: e58d8000 str r8, [sp] + 1f017c0: e58dc008 str ip, [sp, #8] + 1f017c4: eb00e054 bl 1f3991c + 1f017c8: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f017cc: e5d33000 ldrb r3, [r3] + 1f017d0: e3530000 cmp r3, #0 + 1f017d4: 1a00004c bne 1f0190c + 1f017d8: e320f002 wfe + 1f017dc: e58d6020 str r6, [sp, #32] + 1f017e0: e1a03005 mov r3, r5 + 1f017e4: e1a06007 mov r6, r7 + 1f017e8: e5da503d ldrb r5, [sl, #61] ; 0x3d + 1f017ec: e1530005 cmp r3, r5 + 1f017f0: 0a000018 beq 1f01858 + 1f017f4: e1a03005 mov r3, r5 + 1f017f8: e3a01b01 mov r1, #1024 ; 0x400 + 1f017fc: e308216c movw r2, #33132 ; 0x816c + 1f01800: e34021f5 movt r2, #501 ; 0x1f5 + 1f01804: e3090398 movw r0, #37784 ; 0x9398 + 1f01808: e34001fa movt r0, #506 ; 0x1fa + 1f0180c: eb00f872 bl 1f3f9dc + 1f01810: e3a03000 mov r3, #0 + 1f01814: e3550000 cmp r5, #0 + 1f01818: e3a020ff mov r2, #255 ; 0xff + 1f0181c: e34f2f00 movt r2, #65280 ; 0xff00 + 1f01820: 03a024ff moveq r2, #-16777216 ; 0xff000000 + 1f01824: e58d3014 str r3, [sp, #20] + 1f01828: e1a01003 mov r1, r3 + 1f0182c: e58d2004 str r2, [sp, #4] + 1f01830: e30907a4 movw r0, #38820 ; 0x97a4 + 1f01834: e34001fa movt r0, #506 ; 0x1fa + 1f01838: e3e02000 mvn r2, #0 + 1f0183c: e58d3010 str r3, [sp, #16] + 1f01840: e58d300c str r3, [sp, #12] + 1f01844: e300328a movw r3, #650 ; 0x28a + 1f01848: e58d2008 str r2, [sp, #8] + 1f0184c: e3a02020 mov r2, #32 + 1f01850: e58d8000 str r8, [sp] + 1f01854: eb00e030 bl 1f3991c + 1f01858: e5da703c ldrb r7, [sl, #60] ; 0x3c + 1f0185c: e1560007 cmp r6, r7 + 1f01860: 0a000015 beq 1f018bc + 1f01864: e1a03007 mov r3, r7 + 1f01868: e3a01b01 mov r1, #1024 ; 0x400 + 1f0186c: e308216c movw r2, #33132 ; 0x816c + 1f01870: e34021f5 movt r2, #501 ; 0x1f5 + 1f01874: e3090398 movw r0, #37784 ; 0x9398 + 1f01878: e34001fa movt r0, #506 ; 0x1fa + 1f0187c: eb00f856 bl 1f3f9dc + 1f01880: e3a03000 mov r3, #0 + 1f01884: e3a024ff mov r2, #-16777216 ; 0xff000000 + 1f01888: e1a01003 mov r1, r3 + 1f0188c: e58d3014 str r3, [sp, #20] + 1f01890: e3e0c000 mvn ip, #0 + 1f01894: e58d3010 str r3, [sp, #16] + 1f01898: e30907a4 movw r0, #38820 ; 0x97a4 + 1f0189c: e34001fa movt r0, #506 ; 0x1fa + 1f018a0: e58d300c str r3, [sp, #12] + 1f018a4: e300328a movw r3, #650 ; 0x28a + 1f018a8: e58d2004 str r2, [sp, #4] + 1f018ac: e3a02060 mov r2, #96 ; 0x60 + 1f018b0: e58d8000 str r8, [sp] + 1f018b4: e58dc008 str ip, [sp, #8] + 1f018b8: eb00e017 bl 1f3991c + 1f018bc: e5db3000 ldrb r3, [fp] + 1f018c0: e59d2030 ldr r2, [sp, #48] ; 0x30 + 1f018c4: e3530000 cmp r3, #0 + 1f018c8: e59d301c ldr r3, [sp, #28] + 1f018cc: e5d26000 ldrb r6, [r2] + 1f018d0: 1affff2a bne 1f01580 + 1f018d4: e1530006 cmp r3, r6 + 1f018d8: 1affff32 bne 1f015a8 + 1f018dc: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f018e0: e5d39000 ldrb r9, [r3] + 1f018e4: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f018e8: e1530009 cmp r3, r9 + 1f018ec: 1a00000a bne 1f0191c + 1f018f0: e59d3038 ldr r3, [sp, #56] ; 0x38 + 1f018f4: e5d39000 ldrb r9, [r3] + 1f018f8: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f018fc: e1530009 cmp r3, r9 + 1f01900: 0affff8e beq 1f01740 + 1f01904: e58d9028 str r9, [sp, #40] ; 0x28 + 1f01908: eaffff76 b 1f016e8 + 1f0190c: e30d01dc movw r0, #53724 ; 0xd1dc + 1f01910: e34001f9 movt r0, #505 ; 0x1f9 + 1f01914: eb00ed94 bl 1f3cf6c + 1f01918: eaffffae b 1f017d8 + 1f0191c: e59d601c ldr r6, [sp, #28] + 1f01920: e58d9024 str r9, [sp, #36] ; 0x24 + 1f01924: eaffff47 b 1f01648 + 1f01928: e58d601c str r6, [sp, #28] + 1f0192c: eafffff1 b 1f018f8 + 1f01930: e58d601c str r6, [sp, #28] + 1f01934: eaffffea b 1f018e4 + 1f01938: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f0193c: e30022c5 movw r2, #709 ; 0x2c5 + 1f01940: e58d3000 str r3, [sp] + 1f01944: e1a01004 mov r1, r4 + 1f01948: e3a03e2e mov r3, #736 ; 0x2e0 + 1f0194c: e30907a4 movw r0, #38820 ; 0x97a4 + 1f01950: e34001fa movt r0, #506 ; 0x1fa + 1f01954: eb00dfd6 bl 1f398b4 + 1f01958: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f0195c: e30907a4 movw r0, #38820 ; 0x97a4 + 1f01960: e34001fa movt r0, #506 ; 0x1fa + 1f01964: e3530000 cmp r3, #0 + 1f01968: e1a01004 mov r1, r4 + 1f0196c: e3a03cff mov r3, #65280 ; 0xff00 + 1f01970: e34f3f00 movt r3, #65280 ; 0xff00 + 1f01974: 130022c5 movwne r2, #709 ; 0x2c5 + 1f01978: 03a02e2e moveq r2, #736 ; 0x2e0 + 1f0197c: eb00df7c bl 1f39774 + 1f01980: eaffff46 b 1f016a0 + 1f01984: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f01988: e3a02faa mov r2, #680 ; 0x2a8 + 1f0198c: e58d3000 str r3, [sp] + 1f01990: e1a01004 mov r1, r4 + 1f01994: e30032c3 movw r3, #707 ; 0x2c3 + 1f01998: e30907a4 movw r0, #38820 ; 0x97a4 + 1f0199c: e34001fa movt r0, #506 ; 0x1fa + 1f019a0: eb00dfc3 bl 1f398b4 + 1f019a4: e59d301c ldr r3, [sp, #28] + 1f019a8: e30907a4 movw r0, #38820 ; 0x97a4 + 1f019ac: e34001fa movt r0, #506 ; 0x1fa + 1f019b0: e3530000 cmp r3, #0 + 1f019b4: e1a01004 mov r1, r4 + 1f019b8: e3e038ff mvn r3, #16711680 ; 0xff0000 + 1f019bc: 13a02faa movne r2, #680 ; 0x2a8 + 1f019c0: 030022c3 movweq r2, #707 ; 0x2c3 + 1f019c4: eb00df6a bl 1f39774 + 1f019c8: e59d601c ldr r6, [sp, #28] + 1f019cc: eaffff0b b 1f01600 + 1f019d0: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f019d4: e30022e2 movw r2, #738 ; 0x2e2 + 1f019d8: e58d3000 str r3, [sp] + 1f019dc: e1a01004 mov r1, r4 + 1f019e0: e30032ff movw r3, #767 ; 0x2ff + 1f019e4: e30907a4 movw r0, #38820 ; 0x97a4 + 1f019e8: e34001fa movt r0, #506 ; 0x1fa + 1f019ec: eb00dfb0 bl 1f398b4 + 1f019f0: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f019f4: e30907a4 movw r0, #38820 ; 0x97a4 + 1f019f8: e34001fa movt r0, #506 ; 0x1fa + 1f019fc: e3530000 cmp r3, #0 + 1f01a00: e1a01004 mov r1, r4 + 1f01a04: e3e030ff mvn r3, #255 ; 0xff + 1f01a08: 130022e2 movwne r2, #738 ; 0x2e2 + 1f01a0c: 030022ff movweq r2, #767 ; 0x2ff + 1f01a10: eb00df57 bl 1f39774 + 1f01a14: e58d601c str r6, [sp, #28] + 1f01a18: eaffff48 b 1f01740 + +01f01a1c : + 1f01a1c: e30dc1dc movw ip, #53724 ; 0xd1dc + 1f01a20: e340c1f9 movt ip, #505 ; 0x1f9 + 1f01a24: e92d4070 push {r4, r5, r6, lr} + 1f01a28: e59c3004 ldr r3, [ip, #4] + 1f01a2c: e306e965 movw lr, #26981 ; 0x6965 + 1f01a30: e340e192 movt lr, #402 ; 0x192 + 1f01a34: e59c5000 ldr r5, [ip] + 1f01a38: e0653003 rsb r3, r5, r3 + 1f01a3c: e1a03143 asr r3, r3, #2 + 1f01a40: e003039e mul r3, lr, r3 + 1f01a44: e3530000 cmp r3, #0 + 1f01a48: 1a000001 bne 1f01a54 + 1f01a4c: e3a00000 mov r0, #0 + 1f01a50: e8bd8070 pop {r4, r5, r6, pc} + 1f01a54: e3550000 cmp r5, #0 + 1f01a58: e3a03000 mov r3, #0 + 1f01a5c: e58c300c str r3, [ip, #12] + 1f01a60: 0afffff9 beq 1f01a4c + 1f01a64: e1a04000 mov r4, r0 + 1f01a68: e1a06001 mov r6, r1 + 1f01a6c: e309027c movw r0, #37500 ; 0x927c + 1f01a70: e34001fa movt r0, #506 ; 0x1fa + 1f01a74: e1a01005 mov r1, r5 + 1f01a78: eb00773c bl 1f1f770 + 1f01a7c: e1a02006 mov r2, r6 + 1f01a80: e1a01005 mov r1, r5 + 1f01a84: e1a00004 mov r0, r4 + 1f01a88: eb00e3cf bl 1f3a9cc + 1f01a8c: e1a00004 mov r0, r4 + 1f01a90: eb00e3ac bl 1f3a948 + 1f01a94: e3a00001 mov r0, #1 + 1f01a98: e8bd8070 pop {r4, r5, r6, pc} + +01f01a9c ::Instance()>: + 1f01a9c: e92d4070 push {r4, r5, r6, lr} + 1f01aa0: e3084010 movw r4, #32784 ; 0x8010 + 1f01aa4: e34041f6 movt r4, #502 ; 0x1f6 + 1f01aa8: e5940000 ldr r0, [r4] + 1f01aac: e3500000 cmp r0, #0 + 1f01ab0: 18bd8070 popne {r4, r5, r6, pc} + 1f01ab4: e3a00e23 mov r0, #560 ; 0x230 + 1f01ab8: ebfffaf2 bl 1f00688 + 1f01abc: e1a05000 mov r5, r0 + 1f01ac0: eb004256 bl 1f12420 + 1f01ac4: e5845000 str r5, [r4] + 1f01ac8: e1a00005 mov r0, r5 + 1f01acc: e8bd8070 pop {r4, r5, r6, pc} + +01f01ad0 ::Instance()>: + 1f01ad0: e92d4070 push {r4, r5, r6, lr} + 1f01ad4: e308400c movw r4, #32780 ; 0x800c + 1f01ad8: e34041f6 movt r4, #502 ; 0x1f6 + 1f01adc: e5940000 ldr r0, [r4] + 1f01ae0: e3500000 cmp r0, #0 + 1f01ae4: 18bd8070 popne {r4, r5, r6, pc} + 1f01ae8: e3a0000c mov r0, #12 + 1f01aec: ebfffae5 bl 1f00688 + 1f01af0: e1a05000 mov r5, r0 + 1f01af4: eb00ef21 bl 1f3d780 + 1f01af8: e5845000 str r5, [r4] + 1f01afc: e1a00005 mov r0, r5 + 1f01b00: e8bd8070 pop {r4, r5, r6, pc} + +01f01b04 : + 1f01b04: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f01b08: e3a04000 mov r4, #0 + 1f01b0c: e3a05000 mov r5, #0 + 1f01b10: e24ddc0d sub sp, sp, #3328 ; 0xd00 + 1f01b14: e3a064ff mov r6, #-16777216 ; 0xff000000 + 1f01b18: e24dd004 sub sp, sp, #4 + 1f01b1c: e3e07000 mvn r7, #0 + 1f01b20: ebfffe56 bl 1f01480 + 1f01b24: e3099279 movw r9, #37497 ; 0x9279 + 1f01b28: e34091fa movt r9, #506 ; 0x1fa + 1f01b2c: eb000c53 bl 1f04c80 + 1f01b30: ebfff9ba bl 1f00220 <_enable_unaligned_access> + 1f01b34: e30d01f8 movw r0, #53752 ; 0xd1f8 + 1f01b38: e34001f9 movt r0, #505 ; 0x1f9 + 1f01b3c: eb0092cb bl 1f26670 + 1f01b40: e30d01f8 movw r0, #53752 ; 0xd1f8 + 1f01b44: e34001f9 movt r0, #505 ; 0x1f9 + 1f01b48: eb009102 bl 1f25f58 + 1f01b4c: e3a03000 mov r3, #0 + 1f01b50: e3433f20 movt r3, #16160 ; 0x3f20 + 1f01b54: e3e02000 mvn r2, #0 + 1f01b58: e30f183c movw r1, #63548 ; 0xf83c + 1f01b5c: e34011f5 movt r1, #501 ; 0x1f5 + 1f01b60: e5832028 str r2, [r3, #40] ; 0x28 + 1f01b64: e28d0fa2 add r0, sp, #648 ; 0x288 + 1f01b68: e3a02001 mov r2, #1 + 1f01b6c: eb002c35 bl 1f0cc48 + 1f01b70: e28d203c add r2, sp, #60 ; 0x3c + 1f01b74: e28d3040 add r3, sp, #64 ; 0x40 + 1f01b78: e58d4004 str r4, [sp, #4] + 1f01b7c: e28d1e4d add r1, sp, #1232 ; 0x4d0 + 1f01b80: e30b0718 movw r0, #46872 ; 0xb718 + 1f01b84: e34001f5 movt r0, #501 ; 0x1f5 + 1f01b88: e58d1000 str r1, [sp] + 1f01b8c: e3031876 movw r1, #14454 ; 0x3876 + 1f01b90: eb00d98e bl 1f381d0 + 1f01b94: e59de040 ldr lr, [sp, #64] ; 0x40 + 1f01b98: e59dc03c ldr ip, [sp, #60] ; 0x3c + 1f01b9c: e1a01000 mov r1, r0 + 1f01ba0: e58de004 str lr, [sp, #4] + 1f01ba4: e1a03004 mov r3, r4 + 1f01ba8: e58dc000 str ip, [sp] + 1f01bac: e1a02004 mov r2, r4 + 1f01bb0: e30907a4 movw r0, #38820 ; 0x97a4 + 1f01bb4: e34001fa movt r0, #506 ; 0x1fa + 1f01bb8: eb00e00c bl 1f39bf0 + 1f01bbc: e30431c0 movw r3, #16832 ; 0x41c0 + 1f01bc0: e34031f6 movt r3, #502 ; 0x1f6 + 1f01bc4: e3a01b01 mov r1, #1024 ; 0x400 + 1f01bc8: e3090398 movw r0, #37784 ; 0x9398 + 1f01bcc: e34001fa movt r0, #506 ; 0x1fa + 1f01bd0: e5932000 ldr r2, [r3] + 1f01bd4: e30431c8 movw r3, #16840 ; 0x41c8 + 1f01bd8: e34031f6 movt r3, #502 ; 0x1f6 + 1f01bdc: e3520009 cmp r2, #9 + 1f01be0: e58d2000 str r2, [sp] + 1f01be4: 93082160 movwls r2, #33120 ; 0x8160 + 1f01be8: 83082168 movwhi r2, #33128 ; 0x8168 + 1f01bec: 934021f5 movtls r2, #501 ; 0x1f5 + 1f01bf0: 834021f5 movthi r2, #501 ; 0x1f5 + 1f01bf4: e5933000 ldr r3, [r3] + 1f01bf8: e3094398 movw r4, #37784 ; 0x9398 + 1f01bfc: e34041fa movt r4, #506 ; 0x1fa + 1f01c00: eb00f775 bl 1f3f9dc + 1f01c04: e3a00006 mov r0, #6 + 1f01c08: eb00e14f bl 1f3a14c + 1f01c0c: e3a03078 mov r3, #120 ; 0x78 + 1f01c10: e58d0004 str r0, [sp, #4] + 1f01c14: e1a01005 mov r1, r5 + 1f01c18: e3a02faf mov r2, #700 ; 0x2bc + 1f01c1c: e58d4000 str r4, [sp] + 1f01c20: e58d5014 str r5, [sp, #20] + 1f01c24: e30907a4 movw r0, #38820 ; 0x97a4 + 1f01c28: e34001fa movt r0, #506 ; 0x1fa + 1f01c2c: e58d5010 str r5, [sp, #16] + 1f01c30: e58d500c str r5, [sp, #12] + 1f01c34: e58d6008 str r6, [sp, #8] + 1f01c38: eb00df37 bl 1f3991c + 1f01c3c: e3a01b01 mov r1, #1024 ; 0x400 + 1f01c40: e1a00004 mov r0, r4 + 1f01c44: e3082170 movw r2, #33136 ; 0x8170 + 1f01c48: e34021f5 movt r2, #501 ; 0x1f5 + 1f01c4c: eb00f762 bl 1f3f9dc + 1f01c50: e3a030c8 mov r3, #200 ; 0xc8 + 1f01c54: e1a02005 mov r2, r5 + 1f01c58: e1a01005 mov r1, r5 + 1f01c5c: e58d5014 str r5, [sp, #20] + 1f01c60: e30907a4 movw r0, #38820 ; 0x97a4 + 1f01c64: e34001fa movt r0, #506 ; 0x1fa + 1f01c68: e58d5010 str r5, [sp, #16] + 1f01c6c: e58d500c str r5, [sp, #12] + 1f01c70: e58d6008 str r6, [sp, #8] + 1f01c74: e58d4000 str r4, [sp] + 1f01c78: e58d7004 str r7, [sp, #4] + 1f01c7c: eb00df26 bl 1f3991c + 1f01c80: e3a01b01 mov r1, #1024 ; 0x400 + 1f01c84: e1a00004 mov r0, r4 + 1f01c88: e3082190 movw r2, #33168 ; 0x8190 + 1f01c8c: e34021f5 movt r2, #501 ; 0x1f5 + 1f01c90: eb00f751 bl 1f3f9dc + 1f01c94: e3a030d8 mov r3, #216 ; 0xd8 + 1f01c98: e1a02005 mov r2, r5 + 1f01c9c: e1a01005 mov r1, r5 + 1f01ca0: e58d5014 str r5, [sp, #20] + 1f01ca4: e30907a4 movw r0, #38820 ; 0x97a4 + 1f01ca8: e34001fa movt r0, #506 ; 0x1fa + 1f01cac: e58d5010 str r5, [sp, #16] + 1f01cb0: e58d500c str r5, [sp, #12] + 1f01cb4: e58d6008 str r6, [sp, #8] + 1f01cb8: e58d7004 str r7, [sp, #4] + 1f01cbc: e58d4000 str r4, [sp] + 1f01cc0: eb00df15 bl 1f3991c + 1f01cc4: e3a01b01 mov r1, #1024 ; 0x400 + 1f01cc8: e1a00004 mov r0, r4 + 1f01ccc: e30821c0 movw r2, #33216 ; 0x81c0 + 1f01cd0: e34021f5 movt r2, #501 ; 0x1f5 + 1f01cd4: eb00f740 bl 1f3f9dc + 1f01cd8: e3a030e8 mov r3, #232 ; 0xe8 + 1f01cdc: e58d6008 str r6, [sp, #8] + 1f01ce0: e1a02005 mov r2, r5 + 1f01ce4: e58d5014 str r5, [sp, #20] + 1f01ce8: e1a01005 mov r1, r5 + 1f01cec: e58d5010 str r5, [sp, #16] + 1f01cf0: e30907a4 movw r0, #38820 ; 0x97a4 + 1f01cf4: e34001fa movt r0, #506 ; 0x1fa + 1f01cf8: e58d500c str r5, [sp, #12] + 1f01cfc: e58d7004 str r7, [sp, #4] + 1f01d00: e58d4000 str r4, [sp] + 1f01d04: eb00df04 bl 1f3991c + 1f01d08: e5d93000 ldrb r3, [r9] + 1f01d0c: e1530005 cmp r3, r5 + 1f01d10: 1a000009 bne 1f01d3c + 1f01d14: e30c36c0 movw r3, #50880 ; 0xc6c0 + 1f01d18: e340302d movt r3, #45 ; 0x2d + 1f01d1c: e3a02a03 mov r2, #12288 ; 0x3000 + 1f01d20: e3432f00 movt r2, #16128 ; 0x3f00 + 1f01d24: e5921004 ldr r1, [r2, #4] + 1f01d28: e5920004 ldr r0, [r2, #4] + 1f01d2c: e1510000 cmp r1, r0 + 1f01d30: 0afffffc beq 1f01d28 + 1f01d34: e2533001 subs r3, r3, #1 + 1f01d38: 1afffff9 bne 1f01d24 + 1f01d3c: eb003fbb bl 1f11c30 + 1f01d40: e309a79b movw sl, #38811 ; 0x979b + 1f01d44: e340a1fa movt sl, #506 ; 0x1fa + 1f01d48: eb00e005 bl 1f39d64 + 1f01d4c: eb0128f8 bl 1f4c134 + 1f01d50: eb01297c bl 1f4c348 + 1f01d54: e3500000 cmp r0, #0 + 1f01d58: 03080200 movweq r0, #33280 ; 0x8200 + 1f01d5c: 13080218 movwne r0, #33304 ; 0x8218 + 1f01d60: 034001f5 movteq r0, #501 ; 0x1f5 + 1f01d64: 134001f5 movtne r0, #501 ; 0x1f5 + 1f01d68: eb00f4f7 bl 1f3f14c + 1f01d6c: ebffff4a bl 1f01a9c ::Instance()> + 1f01d70: ebffff56 bl 1f01ad0 ::Instance()> + 1f01d74: e30937a4 movw r3, #38820 ; 0x97a4 + 1f01d78: e34031fa movt r3, #506 ; 0x1fa + 1f01d7c: e3a0c000 mov ip, #0 + 1f01d80: e308122c movw r1, #33324 ; 0x822c + 1f01d84: e34011f5 movt r1, #501 ; 0x1f5 + 1f01d88: e5cac000 strb ip, [sl] + 1f01d8c: e3a02001 mov r2, #1 + 1f01d90: e593c00c ldr ip, [r3, #12] + 1f01d94: e28d0040 add r0, sp, #64 ; 0x40 + 1f01d98: e5933010 ldr r3, [r3, #16] + 1f01d9c: e58dc024 str ip, [sp, #36] ; 0x24 + 1f01da0: e58d3028 str r3, [sp, #40] ; 0x28 + 1f01da4: eb002bda bl 1f0cd14 + 1f01da8: e2505000 subs r5, r0, #0 + 1f01dac: 0a000061 beq 1f01f38 + 1f01db0: e30461c4 movw r6, #16836 ; 0x41c4 + 1f01db4: e34061f6 movt r6, #502 ; 0x1f6 + 1f01db8: e3097798 movw r7, #38808 ; 0x9798 + 1f01dbc: e34071fa movt r7, #506 ; 0x1fa + 1f01dc0: e3095270 movw r5, #37488 ; 0x9270 + 1f01dc4: e34051fa movt r5, #506 ; 0x1fa + 1f01dc8: e3098799 movw r8, #38809 ; 0x9799 + 1f01dcc: e34081fa movt r8, #506 ; 0x1fa + 1f01dd0: e5d82000 ldrb r2, [r8] + 1f01dd4: e30a32f8 movw r3, #41720 ; 0xa2f8 + 1f01dd8: e340320d movt r3, #525 ; 0x20d + 1f01ddc: e3520000 cmp r2, #0 + 1f01de0: e5c32000 strb r2, [r3] + 1f01de4: 0a000013 beq 1f01e38 + 1f01de8: e304c1d4 movw ip, #16852 ; 0x41d4 + 1f01dec: e340c1f6 movt ip, #502 ; 0x1f6 + 1f01df0: e30401d8 movw r0, #16856 ; 0x41d8 + 1f01df4: e34001f6 movt r0, #502 ; 0x1f6 + 1f01df8: e30411dc movw r1, #16860 ; 0x41dc + 1f01dfc: e34011f6 movt r1, #502 ; 0x1f6 + 1f01e00: e30421e4 movw r2, #16868 ; 0x41e4 + 1f01e04: e34021f6 movt r2, #502 ; 0x1f6 + 1f01e08: e30431e0 movw r3, #16864 ; 0x41e0 + 1f01e0c: e34031f6 movt r3, #502 ; 0x1f6 + 1f01e10: e3a0e401 mov lr, #16777216 ; 0x1000000 + 1f01e14: e58ce000 str lr, [ip] + 1f01e18: e3a0c402 mov ip, #33554432 ; 0x2000000 + 1f01e1c: e580c000 str ip, [r0] + 1f01e20: e3a00301 mov r0, #67108864 ; 0x4000000 + 1f01e24: e5810000 str r0, [r1] + 1f01e28: e3a00602 mov r0, #2097152 ; 0x200000 + 1f01e2c: e3a01601 mov r1, #1048576 ; 0x100000 + 1f01e30: e5820000 str r0, [r2] + 1f01e34: e5831000 str r1, [r3] + 1f01e38: e5d52000 ldrb r2, [r5] + 1f01e3c: e30a32d4 movw r3, #41684 ; 0xa2d4 + 1f01e40: e340320d movt r3, #525 ; 0x20d + 1f01e44: e3520000 cmp r2, #0 + 1f01e48: e5c32000 strb r2, [r3] + 1f01e4c: 0a00000c beq 1f01e84 + 1f01e50: e30ac2d7 movw ip, #41687 ; 0xa2d7 + 1f01e54: e340c20d movt ip, #525 ; 0x20d + 1f01e58: e30a0305 movw r0, #41733 ; 0xa305 + 1f01e5c: e340020d movt r0, #525 ; 0x20d + 1f01e60: e30a12d6 movw r1, #41686 ; 0xa2d6 + 1f01e64: e340120d movt r1, #525 ; 0x20d + 1f01e68: e30a22d5 movw r2, #41685 ; 0xa2d5 + 1f01e6c: e340220d movt r2, #525 ; 0x20d + 1f01e70: e3a03001 mov r3, #1 + 1f01e74: e5cc3000 strb r3, [ip] + 1f01e78: e5c03000 strb r3, [r0] + 1f01e7c: e5c13000 strb r3, [r1] + 1f01e80: e5c23000 strb r3, [r2] + 1f01e84: e5d73000 ldrb r3, [r7] + 1f01e88: e3530000 cmp r3, #0 + 1f01e8c: 0a0000f4 beq 1f02264 + 1f01e90: e30802bc movw r0, #33468 ; 0x82bc + 1f01e94: e34001f5 movt r0, #501 ; 0x1f5 + 1f01e98: eb0034e7 bl 1f0f23c + 1f01e9c: e3083828 movw r3, #34856 ; 0x8828 + 1f01ea0: e34031f8 movt r3, #504 ; 0x1f8 + 1f01ea4: e5d62000 ldrb r2, [r6] + 1f01ea8: e5c32003 strb r2, [r3, #3] + 1f01eac: e309327c movw r3, #37500 ; 0x927c + 1f01eb0: e34031fa movt r3, #506 ; 0x1fa + 1f01eb4: e3120001 tst r2, #1 + 1f01eb8: 15d3105d ldrbne r1, [r3, #93] ; 0x5d + 1f01ebc: e58330bc str r3, [r3, #188] ; 0xbc + 1f01ec0: 13811020 orrne r1, r1, #32 + 1f01ec4: 15c3105d strbne r1, [r3, #93] ; 0x5d + 1f01ec8: e3120002 tst r2, #2 + 1f01ecc: e3091314 movw r1, #37652 ; 0x9314 + 1f01ed0: e34011fa movt r1, #506 ; 0x1fa + 1f01ed4: e5831008 str r1, [r3, #8] + 1f01ed8: 15d3205d ldrbne r2, [r3, #93] ; 0x5d + 1f01edc: 13822040 orrne r2, r2, #64 ; 0x40 + 1f01ee0: 15c3205d strbne r2, [r3, #93] ; 0x5d + 1f01ee4: e30f27a4 movw r2, #63396 ; 0xf7a4 + 1f01ee8: e34021f1 movt r2, #497 ; 0x1f1 + 1f01eec: e58320b8 str r2, [r3, #184] ; 0xb8 + 1f01ef0: e3002bf4 movw r2, #3060 ; 0xbf4 + 1f01ef4: e34021f0 movt r2, #496 ; 0x1f0 + 1f01ef8: e5832060 str r2, [r3, #96] ; 0x60 + 1f01efc: e3a02000 mov r2, #0 + 1f01f00: e5832064 str r2, [r3, #100] ; 0x64 + 1f01f04: ebfffc3d bl 1f01000 + 1f01f08: e3a02101 mov r2, #1073741824 ; 0x40000000 + 1f01f0c: e300332c movw r3, #812 ; 0x32c + 1f01f10: e34031f0 movt r3, #496 ; 0x1f0 + 1f01f14: e58230bc str r3, [r2, #188] ; 0xbc + 1f01f18: e320f004 sev + 1f01f1c: e58230ac str r3, [r2, #172] ; 0xac + 1f01f20: e320f004 sev + 1f01f24: e300329c movw r3, #668 ; 0x29c + 1f01f28: e34031f0 movt r3, #496 ; 0x1f0 + 1f01f2c: e582309c str r3, [r2, #156] ; 0x9c + 1f01f30: e320f004 sev + 1f01f34: ebfffd72 bl 1f01504 + 1f01f38: e3a00001 mov r0, #1 + 1f01f3c: e30461c4 movw r6, #16836 ; 0x41c4 + 1f01f40: e34061f6 movt r6, #502 ; 0x1f6 + 1f01f44: eb000a73 bl 1f04918 + 1f01f48: e3a02b01 mov r2, #1024 ; 0x400 + 1f01f4c: e28d3038 add r3, sp, #56 ; 0x38 + 1f01f50: e3091398 movw r1, #37784 ; 0x9398 + 1f01f54: e34011fa movt r1, #506 ; 0x1fa + 1f01f58: e28d0040 add r0, sp, #64 ; 0x40 + 1f01f5c: e3098799 movw r8, #38809 ; 0x9799 + 1f01f60: e34081fa movt r8, #506 ; 0x1fa + 1f01f64: eb002d87 bl 1f0d588 + 1f01f68: e1a00005 mov r0, r5 + 1f01f6c: eb000a69 bl 1f04918 + 1f01f70: e28d0040 add r0, sp, #64 ; 0x40 + 1f01f74: eb00338b bl 1f0eda8 + 1f01f78: e28d0e4d add r0, sp, #1232 ; 0x4d0 + 1f01f7c: eb0092aa bl 1f26a2c + 1f01f80: e28d0e4d add r0, sp, #1232 ; 0x4d0 + 1f01f84: e3091398 movw r1, #37784 ; 0x9398 + 1f01f88: e34011fa movt r1, #506 ; 0x1fa + 1f01f8c: eb0092bd bl 1f26a88 + 1f01f90: e59d14d4 ldr r1, [sp, #1236] ; 0x4d4 + 1f01f94: e5c61000 strb r1, [r6] + 1f01f98: e3080238 movw r0, #33336 ; 0x8238 + 1f01f9c: e34001f5 movt r0, #501 ; 0x1f5 + 1f01fa0: e6ef1071 uxtb r1, r1 + 1f01fa4: e3095270 movw r5, #37488 ; 0x9270 + 1f01fa8: e34051fa movt r5, #506 ; 0x1fa + 1f01fac: eb00f466 bl 1f3f14c + 1f01fb0: e59d14d8 ldr r1, [sp, #1240] ; 0x4d8 + 1f01fb4: e3080248 movw r0, #33352 ; 0x8248 + 1f01fb8: e34001f5 movt r0, #501 ; 0x1f5 + 1f01fbc: e2911000 adds r1, r1, #0 + 1f01fc0: e3097798 movw r7, #38808 ; 0x9798 + 1f01fc4: e34071fa movt r7, #506 ; 0x1fa + 1f01fc8: 13a01001 movne r1, #1 + 1f01fcc: e5ca1000 strb r1, [sl] + 1f01fd0: eb00f45d bl 1f3f14c + 1f01fd4: e59d14dc ldr r1, [sp, #1244] ; 0x4dc + 1f01fd8: e3083014 movw r3, #32788 ; 0x8014 + 1f01fdc: e34031f6 movt r3, #502 ; 0x1f6 + 1f01fe0: e2911000 adds r1, r1, #0 + 1f01fe4: e3080270 movw r0, #33392 ; 0x8270 + 1f01fe8: e34001f5 movt r0, #501 ; 0x1f5 + 1f01fec: 13a01001 movne r1, #1 + 1f01ff0: e5c31000 strb r1, [r3] + 1f01ff4: eb00f454 bl 1f3f14c + 1f01ff8: e59d14e0 ldr r1, [sp, #1248] ; 0x4e0 + 1f01ffc: e30937a0 movw r3, #38816 ; 0x97a0 + 1f02000: e34031fa movt r3, #506 ; 0x1fa + 1f02004: e59dc4e8 ldr ip, [sp, #1256] ; 0x4e8 + 1f02008: e2911000 adds r1, r1, #0 + 1f0200c: e59d24ec ldr r2, [sp, #1260] ; 0x4ec + 1f02010: 13a01001 movne r1, #1 + 1f02014: e29cc000 adds ip, ip, #0 + 1f02018: e5c31000 strb r1, [r3] + 1f0201c: e309379a movw r3, #38810 ; 0x979a + 1f02020: e34031fa movt r3, #506 ; 0x1fa + 1f02024: 13a0c001 movne ip, #1 + 1f02028: e59d04f0 ldr r0, [sp, #1264] ; 0x4f0 + 1f0202c: e2922000 adds r2, r2, #0 + 1f02030: e30d11d8 movw r1, #53720 ; 0xd1d8 + 1f02034: e34011f9 movt r1, #505 ; 0x1f9 + 1f02038: 13a02001 movne r2, #1 + 1f0203c: e5c92000 strb r2, [r9] + 1f02040: e59d24f4 ldr r2, [sp, #1268] ; 0x4f4 + 1f02044: e2900000 adds r0, r0, #0 + 1f02048: e5c3c000 strb ip, [r3] + 1f0204c: 13a00001 movne r0, #1 + 1f02050: e59d34f8 ldr r3, [sp, #1272] ; 0x4f8 + 1f02054: e2922000 adds r2, r2, #0 + 1f02058: e59dc4fc ldr ip, [sp, #1276] ; 0x4fc + 1f0205c: 13a02001 movne r2, #1 + 1f02060: e2933000 adds r3, r3, #0 + 1f02064: e5c72000 strb r2, [r7] + 1f02068: 13a03001 movne r3, #1 + 1f0206c: e35c0000 cmp ip, #0 + 1f02070: e5c53000 strb r3, [r5] + 1f02074: 13a03001 movne r3, #1 + 1f02078: 03a03000 moveq r3, #0 + 1f0207c: e5c83000 strb r3, [r8] + 1f02080: e3083018 movw r3, #32792 ; 0x8018 + 1f02084: e34031f6 movt r3, #502 ; 0x1f6 + 1f02088: e2833b82 add r3, r3, #133120 ; 0x20800 + 1f0208c: e3082018 movw r2, #32792 ; 0x8018 + 1f02090: e34021f6 movt r2, #502 ; 0x1f6 + 1f02094: e2833008 add r3, r3, #8 + 1f02098: e2822907 add r2, r2, #114688 ; 0x1c000 + 1f0209c: e58d3018 str r3, [sp, #24] + 1f020a0: e3a0a007 mov sl, #7 + 1f020a4: e2433f42 sub r3, r3, #264 ; 0x108 + 1f020a8: e5c10000 strb r0, [r1] + 1f020ac: 05c5c000 strbeq ip, [r5] + 1f020b0: e58d2020 str r2, [sp, #32] + 1f020b4: e58d301c str r3, [sp, #28] + 1f020b8: e59d2018 ldr r2, [sp, #24] + 1f020bc: e3a03000 mov r3, #0 + 1f020c0: e1a0100a mov r1, sl + 1f020c4: e28d0e4d add r0, sp, #1232 ; 0x4d0 + 1f020c8: e5623001 strb r3, [r2, #-1]! + 1f020cc: e58d2018 str r2, [sp, #24] + 1f020d0: eb00955b bl 1f27644 + 1f020d4: e19030da ldrsb r3, [r0, sl] + 1f020d8: e1a0b000 mov fp, r0 + 1f020dc: e3530000 cmp r3, #0 + 1f020e0: 1a000089 bne 1f0230c + 1f020e4: e59d301c ldr r3, [sp, #28] + 1f020e8: e24aa001 sub sl, sl, #1 + 1f020ec: e37a0001 cmn sl, #1 + 1f020f0: e2433c01 sub r3, r3, #256 ; 0x100 + 1f020f4: e58d301c str r3, [sp, #28] + 1f020f8: e59d3020 ldr r3, [sp, #32] + 1f020fc: e2433901 sub r3, r3, #16384 ; 0x4000 + 1f02100: e58d3020 str r3, [sp, #32] + 1f02104: 1affffeb bne 1f020b8 + 1f02108: e3083018 movw r3, #32792 ; 0x8018 + 1f0210c: e34031f6 movt r3, #502 ; 0x1f6 + 1f02110: e2833802 add r3, r3, #131072 ; 0x20000 + 1f02114: e5d33800 ldrb r3, [r3, #2048] ; 0x800 + 1f02118: e3530000 cmp r3, #0 + 1f0211c: 1affff2b bne 1f01dd0 + 1f02120: e3080294 movw r0, #33428 ; 0x8294 + 1f02124: e34001f5 movt r0, #501 ; 0x1f5 + 1f02128: ebfffb45 bl 1f00e44 + 1f0212c: e3500000 cmp r0, #0 + 1f02130: 1affff26 bne 1f01dd0 + 1f02134: e30802a0 movw r0, #33440 ; 0x82a0 + 1f02138: e34001f5 movt r0, #501 ; 0x1f5 + 1f0213c: ebfffb40 bl 1f00e44 + 1f02140: e3500000 cmp r0, #0 + 1f02144: 1affff21 bne 1f01dd0 + 1f02148: e30802a8 movw r0, #33448 ; 0x82a8 + 1f0214c: e34001f5 movt r0, #501 ; 0x1f5 + 1f02150: ebfffb3b bl 1f00e44 + 1f02154: e3500000 cmp r0, #0 + 1f02158: 1affff1c bne 1f01dd0 + 1f0215c: e30802b0 movw r0, #33456 ; 0x82b0 + 1f02160: e34001f5 movt r0, #501 ; 0x1f5 + 1f02164: ebfffb36 bl 1f00e44 + 1f02168: e2509000 subs r9, r0, #0 + 1f0216c: 1affff17 bne 1f01dd0 + 1f02170: e3a01b01 mov r1, #1024 ; 0x400 + 1f02174: e30822c4 movw r2, #33476 ; 0x82c4 + 1f02178: e34021f5 movt r2, #501 ; 0x1f5 + 1f0217c: e3090398 movw r0, #37784 ; 0x9398 + 1f02180: e34001fa movt r0, #506 ; 0x1fa + 1f02184: eb00f614 bl 1f3f9dc + 1f02188: e28d3034 add r3, sp, #52 ; 0x34 + 1f0218c: e1a01009 mov r1, r9 + 1f02190: e58d3000 str r3, [sp] + 1f02194: e3092398 movw r2, #37784 ; 0x9398 + 1f02198: e34021fa movt r2, #506 ; 0x1fa + 1f0219c: e28d3030 add r3, sp, #48 ; 0x30 + 1f021a0: e30907a4 movw r0, #38820 ; 0x97a4 + 1f021a4: e34001fa movt r0, #506 ; 0x1fa + 1f021a8: eb00de5e bl 1f39b28 + 1f021ac: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f021b0: e59d8030 ldr r8, [sp, #48] ; 0x30 + 1f021b4: e3a060ff mov r6, #255 ; 0xff + 1f021b8: e34f6f00 movt r6, #65280 ; 0xff00 + 1f021bc: e0688003 rsb r8, r8, r3 + 1f021c0: e59d7034 ldr r7, [sp, #52] ; 0x34 + 1f021c4: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f021c8: e3a05a03 mov r5, #12288 ; 0x3000 + 1f021cc: e3435f00 movt r5, #16128 ; 0x3f00 + 1f021d0: e0677003 rsb r7, r7, r3 + 1f021d4: e1a080a8 lsr r8, r8, #1 + 1f021d8: e1a070a7 lsr r7, r7, #1 + 1f021dc: e3a010ff mov r1, #255 ; 0xff + 1f021e0: e34f1f00 movt r1, #65280 ; 0xff00 + 1f021e4: e30907a4 movw r0, #38820 ; 0x97a4 + 1f021e8: e34001fa movt r0, #506 ; 0x1fa + 1f021ec: eb00dd38 bl 1f396d4 + 1f021f0: e3040e20 movw r0, #20000 ; 0x4e20 + 1f021f4: e5952004 ldr r2, [r5, #4] + 1f021f8: e5953004 ldr r3, [r5, #4] + 1f021fc: e1520003 cmp r2, r3 + 1f02200: 0afffffc beq 1f021f8 + 1f02204: e2500001 subs r0, r0, #1 + 1f02208: 1afffff9 bne 1f021f4 + 1f0220c: e58d0014 str r0, [sp, #20] + 1f02210: e1a01000 mov r1, r0 + 1f02214: e58d0010 str r0, [sp, #16] + 1f02218: e3e0c000 mvn ip, #0 + 1f0221c: e58d000c str r0, [sp, #12] + 1f02220: e1a03007 mov r3, r7 + 1f02224: e30907a4 movw r0, #38820 ; 0x97a4 + 1f02228: e34001fa movt r0, #506 ; 0x1fa + 1f0222c: e58d6008 str r6, [sp, #8] + 1f02230: e1a02008 mov r2, r8 + 1f02234: e58d4000 str r4, [sp] + 1f02238: e58dc004 str ip, [sp, #4] + 1f0223c: eb00ddb6 bl 1f3991c + 1f02240: e30836a0 movw r3, #34464 ; 0x86a0 + 1f02244: e3403001 movt r3, #1 + 1f02248: e5952004 ldr r2, [r5, #4] + 1f0224c: e5951004 ldr r1, [r5, #4] + 1f02250: e1520001 cmp r2, r1 + 1f02254: 0afffffc beq 1f0224c + 1f02258: e2533001 subs r3, r3, #1 + 1f0225c: 0affffde beq 1f021dc + 1f02260: eafffff8 b 1f02248 + 1f02264: e30c0de8 movw r0, #52712 ; 0xcde8 + 1f02268: eb00f0be bl 1f3e568 + 1f0226c: e2801ccd add r1, r0, #52480 ; 0xcd00 + 1f02270: e3082398 movw r2, #33688 ; 0x8398 + 1f02274: e34021f5 movt r2, #501 ; 0x1f5 + 1f02278: e1a03000 mov r3, r0 + 1f0227c: e28110c0 add r1, r1, #192 ; 0xc0 + 1f02280: f4620adf vld1.64 {d16-d17}, [r2 :64] + 1f02284: e2834010 add r4, r3, #16 + 1f02288: e283e020 add lr, r3, #32 + 1f0228c: e283c030 add ip, r3, #48 ; 0x30 + 1f02290: e2822010 add r2, r2, #16 + 1f02294: f3c82a30 vmovl.u8 q9, d16 + 1f02298: f3c80a31 vmovl.u8 q8, d17 + 1f0229c: f3d06a32 vmovl.u16 q11, d18 + 1f022a0: f3d04a30 vmovl.u16 q10, d16 + 1f022a4: f3d02a33 vmovl.u16 q9, d19 + 1f022a8: f3d00a31 vmovl.u16 q8, d17 + 1f022ac: f4436a8f vst1.32 {d22-d23}, [r3] + 1f022b0: e2833040 add r3, r3, #64 ; 0x40 + 1f022b4: e1530001 cmp r3, r1 + 1f022b8: f4442a8f vst1.32 {d18-d19}, [r4] + 1f022bc: f44e4a8f vst1.32 {d20-d21}, [lr] + 1f022c0: f44c0a8f vst1.32 {d16-d17}, [ip] + 1f022c4: 1affffed bne 1f02280 + 1f022c8: e2803903 add r3, r0, #49152 ; 0xc000 + 1f022cc: e304c1a0 movw ip, #16800 ; 0x41a0 + 1f022d0: e340c1f6 movt ip, #502 ; 0x1f6 + 1f022d4: e3a02080 mov r2, #128 ; 0x80 + 1f022d8: e3a0107f mov r1, #127 ; 0x7f + 1f022dc: e5832dc0 str r2, [r3, #3520] ; 0xdc0 + 1f022e0: e58c0004 str r0, [ip, #4] + 1f022e4: e5832dc8 str r2, [r3, #3528] ; 0xdc8 + 1f022e8: e5832dd0 str r2, [r3, #3536] ; 0xdd0 + 1f022ec: e5832dd4 str r2, [r3, #3540] ; 0xdd4 + 1f022f0: e5832ddc str r2, [r3, #3548] ; 0xddc + 1f022f4: e5832de4 str r2, [r3, #3556] ; 0xde4 + 1f022f8: e5831dc4 str r1, [r3, #3524] ; 0xdc4 + 1f022fc: e5831dcc str r1, [r3, #3532] ; 0xdcc + 1f02300: e5831dd8 str r1, [r3, #3544] ; 0xdd8 + 1f02304: e5831de0 str r1, [r3, #3552] ; 0xde0 + 1f02308: eafffee0 b 1f01e90 + 1f0230c: e1a01000 mov r1, r0 + 1f02310: e3a02001 mov r2, #1 + 1f02314: e28d0040 add r0, sp, #64 ; 0x40 + 1f02318: eb002a7d bl 1f0cd14 + 1f0231c: e2509000 subs r9, r0, #0 + 1f02320: 1affff6f bne 1f020e4 + 1f02324: e3a014ff mov r1, #-16777216 ; 0xff000000 + 1f02328: e30907a4 movw r0, #38820 ; 0x97a4 + 1f0232c: e34001fa movt r0, #506 ; 0x1fa + 1f02330: eb00dce7 bl 1f396d4 + 1f02334: e1a0300b mov r3, fp + 1f02338: e3a01b01 mov r1, #1024 ; 0x400 + 1f0233c: e3082280 movw r2, #33408 ; 0x8280 + 1f02340: e34021f5 movt r2, #501 ; 0x1f5 + 1f02344: e3090398 movw r0, #37784 ; 0x9398 + 1f02348: e34001fa movt r0, #506 ; 0x1fa + 1f0234c: eb00f5a2 bl 1f3f9dc + 1f02350: e28d3034 add r3, sp, #52 ; 0x34 + 1f02354: e1a01009 mov r1, r9 + 1f02358: e58d3000 str r3, [sp] + 1f0235c: e3092398 movw r2, #37784 ; 0x9398 + 1f02360: e34021fa movt r2, #506 ; 0x1fa + 1f02364: e28d3030 add r3, sp, #48 ; 0x30 + 1f02368: e30907a4 movw r0, #38820 ; 0x97a4 + 1f0236c: e34001fa movt r0, #506 ; 0x1fa + 1f02370: eb00ddec bl 1f39b28 + 1f02374: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f02378: e3a010ff mov r1, #255 ; 0xff + 1f0237c: e34f1f00 movt r1, #65280 ; 0xff00 + 1f02380: e58d1008 str r1, [sp, #8] + 1f02384: e30907a4 movw r0, #38820 ; 0x97a4 + 1f02388: e34001fa movt r0, #506 ; 0x1fa + 1f0238c: e59d1028 ldr r1, [sp, #40] ; 0x28 + 1f02390: e59d2030 ldr r2, [sp, #48] ; 0x30 + 1f02394: e0633001 rsb r3, r3, r1 + 1f02398: e59d1024 ldr r1, [sp, #36] ; 0x24 + 1f0239c: e58d9014 str r9, [sp, #20] + 1f023a0: e0622001 rsb r2, r2, r1 + 1f023a4: e1a030a3 lsr r3, r3, #1 + 1f023a8: e3e01000 mvn r1, #0 + 1f023ac: e58d9010 str r9, [sp, #16] + 1f023b0: e1a020a2 lsr r2, r2, #1 + 1f023b4: e58d1004 str r1, [sp, #4] + 1f023b8: e58d900c str r9, [sp, #12] + 1f023bc: e1a01009 mov r1, r9 + 1f023c0: e58d4000 str r4, [sp] + 1f023c4: eb00dd54 bl 1f3991c + 1f023c8: e3a00001 mov r0, #1 + 1f023cc: eb000951 bl 1f04918 + 1f023d0: e28d303c add r3, sp, #60 ; 0x3c + 1f023d4: e3a02901 mov r2, #16384 ; 0x4000 + 1f023d8: e59d1020 ldr r1, [sp, #32] + 1f023dc: e28d0040 add r0, sp, #64 ; 0x40 + 1f023e0: eb002c68 bl 1f0d588 + 1f023e4: e58d002c str r0, [sp, #44] ; 0x2c + 1f023e8: e1a00009 mov r0, r9 + 1f023ec: eb000949 bl 1f04918 + 1f023f0: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f023f4: e3530000 cmp r3, #0 + 1f023f8: 1a000009 bne 1f02424 + 1f023fc: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f02400: e3530901 cmp r3, #16384 ; 0x4000 + 1f02404: 1a000006 bne 1f02424 + 1f02408: e3a020ff mov r2, #255 ; 0xff + 1f0240c: e1a0100b mov r1, fp + 1f02410: e59d001c ldr r0, [sp, #28] + 1f02414: eb00f77a bl 1f40204 + 1f02418: e59d2018 ldr r2, [sp, #24] + 1f0241c: e3a03001 mov r3, #1 + 1f02420: e5c23000 strb r3, [r2] + 1f02424: e28d0040 add r0, sp, #64 ; 0x40 + 1f02428: eb00325e bl 1f0eda8 + 1f0242c: eaffff2c b 1f020e4 + +01f02430 : + 1f02430: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f02434: e3085018 movw r5, #32792 ; 0x8018 + 1f02438: e34051f6 movt r5, #502 ; 0x1f6 + 1f0243c: e24dd0f4 sub sp, sp, #244 ; 0xf4 + 1f02440: e2855802 add r5, r5, #131072 ; 0x20000 + 1f02444: e30d81dc movw r8, #53724 ; 0xd1dc + 1f02448: e34081f9 movt r8, #505 ; 0x1f9 + 1f0244c: ebfffd92 bl 1f01a9c ::Instance()> + 1f02450: e1a06000 mov r6, r0 + 1f02454: ebfffd9d bl 1f01ad0 ::Instance()> + 1f02458: e30431c4 movw r3, #16836 ; 0x41c4 + 1f0245c: e34031f6 movt r3, #502 ; 0x1f6 + 1f02460: e58d30dc str r3, [sp, #220] ; 0xdc + 1f02464: e58d00a8 str r0, [sp, #168] ; 0xa8 + 1f02468: e3a00054 mov r0, #84 ; 0x54 + 1f0246c: e3400001 movt r0, #1 + 1f02470: e3a04000 mov r4, #0 + 1f02474: e1a09003 mov r9, r3 + 1f02478: e585480c str r4, [r5, #2060] ; 0x80c + 1f0247c: e30937a4 movw r3, #38820 ; 0x97a4 + 1f02480: e34031fa movt r3, #506 ; 0x1fa + 1f02484: e5883014 str r3, [r8, #20] + 1f02488: ebfff87e bl 1f00688 + 1f0248c: e30dc1d8 movw ip, #53720 ; 0xd1d8 + 1f02490: e340c1f9 movt ip, #505 ; 0x1f9 + 1f02494: e5d93000 ldrb r3, [r9] + 1f02498: e1a07000 mov r7, r0 + 1f0249c: e2452802 sub r2, r5, #131072 ; 0x20000 + 1f024a0: e1a01008 mov r1, r8 + 1f024a4: e5dcc000 ldrb ip, [ip] + 1f024a8: e309a278 movw sl, #37496 ; 0x9278 + 1f024ac: e340a1fa movt sl, #506 ; 0x1fa + 1f024b0: e58dc000 str ip, [sp] + 1f024b4: e3a09a03 mov r9, #12288 ; 0x3000 + 1f024b8: e3439f00 movt r9, #16128 ; 0x3f00 + 1f024bc: eb00df0c bl 1f3a0f4 + 1f024c0: e1a00007 mov r0, r7 + 1f024c4: eb00e7e9 bl 1f3c470 + 1f024c8: e309027c movw r0, #37500 ; 0x927c + 1f024cc: e34001fa movt r0, #506 ; 0x1fa + 1f024d0: e58d0078 str r0, [sp, #120] ; 0x78 + 1f024d4: e3083828 movw r3, #34856 ; 0x8828 + 1f024d8: e34031f8 movt r3, #504 ; 0x1f8 + 1f024dc: e58d30d4 str r3, [sp, #212] ; 0xd4 + 1f024e0: eb003ff7 bl 1f124c4 + 1f024e4: e5ca4000 strb r4, [sl] + 1f024e8: e30a32ec movw r3, #41708 ; 0xa2ec + 1f024ec: e340320d movt r3, #525 ; 0x20d + 1f024f0: e58d30c8 str r3, [sp, #200] ; 0xc8 + 1f024f4: e58d401c str r4, [sp, #28] + 1f024f8: e30431e0 movw r3, #16864 ; 0x41e0 + 1f024fc: e34031f6 movt r3, #502 ; 0x1f6 + 1f02500: e58d306c str r3, [sp, #108] ; 0x6c + 1f02504: e58d4044 str r4, [sp, #68] ; 0x44 + 1f02508: e30a32d4 movw r3, #41684 ; 0xa2d4 + 1f0250c: e340320d movt r3, #525 ; 0x20d + 1f02510: e58d3060 str r3, [sp, #96] ; 0x60 + 1f02514: e58d4024 str r4, [sp, #36] ; 0x24 + 1f02518: e30a32bd movw r3, #41661 ; 0xa2bd + 1f0251c: e340320d movt r3, #525 ; 0x20d + 1f02520: e58d3010 str r3, [sp, #16] + 1f02524: e30a32b4 movw r3, #41652 ; 0xa2b4 + 1f02528: e340320d movt r3, #525 ; 0x20d + 1f0252c: e58d3080 str r3, [sp, #128] ; 0x80 + 1f02530: e30a32bf movw r3, #41663 ; 0xa2bf + 1f02534: e340320d movt r3, #525 ; 0x20d + 1f02538: e58d3084 str r3, [sp, #132] ; 0x84 + 1f0253c: e30a331c movw r3, #41756 ; 0xa31c + 1f02540: e340320d movt r3, #525 ; 0x20d + 1f02544: e58d3090 str r3, [sp, #144] ; 0x90 + 1f02548: e30a3298 movw r3, #41624 ; 0xa298 + 1f0254c: e340320d movt r3, #525 ; 0x20d + 1f02550: e58d3040 str r3, [sp, #64] ; 0x40 + 1f02554: e30a32be movw r3, #41662 ; 0xa2be + 1f02558: e340320d movt r3, #525 ; 0x20d + 1f0255c: e58d303c str r3, [sp, #60] ; 0x3c + 1f02560: e30a32d7 movw r3, #41687 ; 0xa2d7 + 1f02564: e340320d movt r3, #525 ; 0x20d + 1f02568: e58d307c str r3, [sp, #124] ; 0x7c + 1f0256c: e30a3305 movw r3, #41733 ; 0xa305 + 1f02570: e340320d movt r3, #525 ; 0x20d + 1f02574: e58d3088 str r3, [sp, #136] ; 0x88 + 1f02578: e30a32d6 movw r3, #41686 ; 0xa2d6 + 1f0257c: e340320d movt r3, #525 ; 0x20d + 1f02580: e58d3094 str r3, [sp, #148] ; 0x94 + 1f02584: e30a3307 movw r3, #41735 ; 0xa307 + 1f02588: e340320d movt r3, #525 ; 0x20d + 1f0258c: e58d3030 str r3, [sp, #48] ; 0x30 + 1f02590: e30a32f8 movw r3, #41720 ; 0xa2f8 + 1f02594: e340320d movt r3, #525 ; 0x20d + 1f02598: e58d3034 str r3, [sp, #52] ; 0x34 + 1f0259c: e30a32f4 movw r3, #41716 ; 0xa2f4 + 1f025a0: e340320d movt r3, #525 ; 0x20d + 1f025a4: e58d3068 str r3, [sp, #104] ; 0x68 + 1f025a8: e30a331d movw r3, #41757 ; 0xa31d + 1f025ac: e340320d movt r3, #525 ; 0x20d + 1f025b0: e58d3038 str r3, [sp, #56] ; 0x38 + 1f025b4: e30a3306 movw r3, #41734 ; 0xa306 + 1f025b8: e340320d movt r3, #525 ; 0x20d + 1f025bc: e58d3014 str r3, [sp, #20] + 1f025c0: e30d31f4 movw r3, #53748 ; 0xd1f4 + 1f025c4: e34031f9 movt r3, #505 ; 0x1f9 + 1f025c8: e58d3058 str r3, [sp, #88] ; 0x58 + 1f025cc: e309379b movw r3, #38811 ; 0x979b + 1f025d0: e34031fa movt r3, #506 ; 0x1fa + 1f025d4: e58d308c str r3, [sp, #140] ; 0x8c + 1f025d8: e30937a0 movw r3, #38816 ; 0x97a0 + 1f025dc: e34031fa movt r3, #506 ; 0x1fa + 1f025e0: e58d30e4 str r3, [sp, #228] ; 0xe4 + 1f025e4: e30c35b8 movw r3, #50616 ; 0xc5b8 + 1f025e8: e340320d movt r3, #525 ; 0x20d + 1f025ec: e58d3074 str r3, [sp, #116] ; 0x74 + 1f025f0: e3083014 movw r3, #32788 ; 0x8014 + 1f025f4: e34031f6 movt r3, #502 ; 0x1f6 + 1f025f8: e58d30e0 str r3, [sp, #224] ; 0xe0 + 1f025fc: e30c382c movw r3, #51244 ; 0xc82c + 1f02600: e34031f1 movt r3, #497 ; 0x1f1 + 1f02604: e58d3064 str r3, [sp, #100] ; 0x64 + 1f02608: e309379c movw r3, #38812 ; 0x979c + 1f0260c: e34031fa movt r3, #506 ; 0x1fa + 1f02610: e58d305c str r3, [sp, #92] ; 0x5c + 1f02614: e3083390 movw r3, #33680 ; 0x8390 + 1f02618: e34031f5 movt r3, #501 ; 0x1f5 + 1f0261c: e58d30d8 str r3, [sp, #216] ; 0xd8 + 1f02620: e3093274 movw r3, #37492 ; 0x9274 + 1f02624: e34031fa movt r3, #506 ; 0x1fa + 1f02628: e58d302c str r3, [sp, #44] ; 0x2c + 1f0262c: e3093798 movw r3, #38808 ; 0x9798 + 1f02630: e34031fa movt r3, #506 ; 0x1fa + 1f02634: e58d30cc str r3, [sp, #204] ; 0xcc + 1f02638: e30431a0 movw r3, #16800 ; 0x41a0 + 1f0263c: e34031f6 movt r3, #502 ; 0x1f6 + 1f02640: e58d30d0 str r3, [sp, #208] ; 0xd0 + 1f02644: e3063965 movw r3, #26981 ; 0x6965 + 1f02648: e3403192 movt r3, #402 ; 0x192 + 1f0264c: e58d300c str r3, [sp, #12] + 1f02650: e30831b3 movw r3, #33203 ; 0x81b3 + 1f02654: e340300a movt r3, #10 + 1f02658: e58d30ec str r3, [sp, #236] ; 0xec + 1f0265c: e1a03009 mov r3, r9 + 1f02660: e1a0b004 mov fp, r4 + 1f02664: e1a09007 mov r9, r7 + 1f02668: e1a0700a mov r7, sl + 1f0266c: e1a0a006 mov sl, r6 + 1f02670: e1a06003 mov r6, r3 + 1f02674: e35b0000 cmp fp, #0 + 1f02678: 0a000167 beq 1f02c1c + 1f0267c: e5982000 ldr r2, [r8] + 1f02680: e30d01dc movw r0, #53724 ; 0xd1dc + 1f02684: e34001f9 movt r0, #505 ; 0x1f9 + 1f02688: e5983004 ldr r3, [r8, #4] + 1f0268c: e3a04000 mov r4, #0 + 1f02690: e309c27c movw ip, #37500 ; 0x927c + 1f02694: e340c1fa movt ip, #506 ; 0x1fa + 1f02698: e0623003 rsb r3, r2, r3 + 1f0269c: e3092274 movw r2, #37492 ; 0x9274 + 1f026a0: e34021fa movt r2, #506 ; 0x1fa + 1f026a4: e58d20e8 str r2, [sp, #232] ; 0xe8 + 1f026a8: e59d200c ldr r2, [sp, #12] + 1f026ac: e1a03143 asr r3, r3, #2 + 1f026b0: e58dc018 str ip, [sp, #24] + 1f026b4: e1a0b004 mov fp, r4 + 1f026b8: e58d404c str r4, [sp, #76] ; 0x4c + 1f026bc: e0030392 mul r3, r2, r3 + 1f026c0: e58d3028 str r3, [sp, #40] ; 0x28 + 1f026c4: e353000a cmp r3, #10 + 1f026c8: e58d4048 str r4, [sp, #72] ; 0x48 + 1f026cc: 23a0300a movcs r3, #10 + 1f026d0: e58d3020 str r3, [sp, #32] + 1f026d4: eb00e9a9 bl 1f3cd80 + 1f026d8: e59d30e0 ldr r3, [sp, #224] ; 0xe0 + 1f026dc: e59d1078 ldr r1, [sp, #120] ; 0x78 + 1f026e0: e309036c movw r0, #37740 ; 0x936c + 1f026e4: e34001fa movt r0, #506 ; 0x1fa + 1f026e8: e5d32000 ldrb r2, [r3] + 1f026ec: e3003f9c movw r3, #3996 ; 0xf9c + 1f026f0: e34031f0 movt r3, #496 ; 0x1f0 + 1f026f4: e1520004 cmp r2, r4 + 1f026f8: e3002f1c movw r2, #3868 ; 0xf1c + 1f026fc: e34021f0 movt r2, #496 ; 0x1f0 + 1f02700: 11a02003 movne r2, r3 + 1f02704: e5812100 str r2, [r1, #256] ; 0x100 + 1f02708: e3002d70 movw r2, #3440 ; 0xd70 + 1f0270c: e34021f0 movt r2, #496 ; 0x1f0 + 1f02710: e3003df0 movw r3, #3568 ; 0xdf0 + 1f02714: e34031f0 movt r3, #496 ; 0x1f0 + 1f02718: 01a03002 moveq r3, r2 + 1f0271c: e59d2074 ldr r2, [sp, #116] ; 0x74 + 1f02720: e5813104 str r3, [r1, #260] ; 0x104 + 1f02724: e3a03020 mov r3, #32 + 1f02728: e5c130fc strb r3, [r1, #252] ; 0xfc + 1f0272c: e5824000 str r4, [r2] + 1f02730: e1a04001 mov r4, r1 + 1f02734: eb006d6e bl 1f1dcf4 + 1f02738: e59d30c8 ldr r3, [sp, #200] ; 0xc8 + 1f0273c: e309027c movw r0, #37500 ; 0x927c + 1f02740: e34001fa movt r0, #506 ; 0x1fa + 1f02744: e2802040 add r2, r0, #64 ; 0x40 + 1f02748: e5832000 str r2, [r3] + 1f0274c: eb003f6c bl 1f12504 + 1f02750: e5965004 ldr r5, [r6, #4] + 1f02754: e58d909c str r9, [sp, #156] ; 0x9c + 1f02758: e59d90a8 ldr r9, [sp, #168] ; 0xa8 + 1f0275c: e58da098 str sl, [sp, #152] ; 0x98 + 1f02760: e1a0a004 mov sl, r4 + 1f02764: e58d70a0 str r7, [sp, #160] ; 0xa0 + 1f02768: e1a0700b mov r7, fp + 1f0276c: eb0046b2 bl 1f1423c + 1f02770: e59a3108 ldr r3, [sl, #264] ; 0x108 + 1f02774: e59d2064 ldr r2, [sp, #100] ; 0x64 + 1f02778: e1530002 cmp r3, r2 + 1f0277c: 0a0001e0 beq 1f02f04 + 1f02780: e309036c movw r0, #37740 ; 0x936c + 1f02784: e34001fa movt r0, #506 ; 0x1fa + 1f02788: eb006d37 bl 1f1dc6c + 1f0278c: e3043e34 movw r3, #20020 ; 0x4e34 + 1f02790: e340300f movt r3, #15 + 1f02794: e1570003 cmp r7, r3 + 1f02798: da00004e ble 1f028d8 + 1f0279c: e59d3018 ldr r3, [sp, #24] + 1f027a0: e30a431d movw r4, #41757 ; 0xa31d + 1f027a4: e340420d movt r4, #525 ; 0x20d + 1f027a8: e5d3003d ldrb r0, [r3, #61] ; 0x3d + 1f027ac: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f027b0: e1530000 cmp r3, r0 + 1f027b4: e59d3038 ldr r3, [sp, #56] ; 0x38 + 1f027b8: e5c30000 strb r0, [r3] + 1f027bc: 0a000002 beq 1f027cc + 1f027c0: eb000854 bl 1f04918 + 1f027c4: e5d43000 ldrb r3, [r4] + 1f027c8: e58d3024 str r3, [sp, #36] ; 0x24 + 1f027cc: e5da3031 ldrb r3, [sl, #49] ; 0x31 + 1f027d0: e59d2050 ldr r2, [sp, #80] ; 0x50 + 1f027d4: e58d3070 str r3, [sp, #112] ; 0x70 + 1f027d8: e1520003 cmp r2, r3 + 1f027dc: e59d30cc ldr r3, [sp, #204] ; 0xcc + 1f027e0: e5d33000 ldrb r3, [r3] + 1f027e4: 0a00025a beq 1f03154 + 1f027e8: e3530000 cmp r3, #0 + 1f027ec: 0a0001b6 beq 1f02ecc + 1f027f0: e3043240 movw r3, #16960 ; 0x4240 + 1f027f4: e340300f movt r3, #15 + 1f027f8: e58d3048 str r3, [sp, #72] ; 0x48 + 1f027fc: e59d3014 ldr r3, [sp, #20] + 1f02800: e5d31000 ldrb r1, [r3] + 1f02804: e3a03d0d mov r3, #832 ; 0x340 + 1f02808: e58d304c str r3, [sp, #76] ; 0x4c + 1f0280c: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f02810: e5d33000 ldrb r3, [r3] + 1f02814: e3530000 cmp r3, #0 + 1f02818: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f0281c: e5d33000 ldrb r3, [r3] + 1f02820: 1a000067 bne 1f029c4 + 1f02824: e3530000 cmp r3, #0 + 1f02828: 13a00612 movne r0, #18874368 ; 0x1200000 + 1f0282c: 13a03401 movne r3, #16777216 ; 0x1000000 + 1f02830: 1a000006 bne 1f02850 + 1f02834: e59d3040 ldr r3, [sp, #64] ; 0x40 + 1f02838: e5d33000 ldrb r3, [r3] + 1f0283c: e3530000 cmp r3, #0 + 1f02840: 13a00612 movne r0, #18874368 ; 0x1200000 + 1f02844: 03a00602 moveq r0, #2097152 ; 0x200000 + 1f02848: 13a03401 movne r3, #16777216 ; 0x1000000 + 1f0284c: 03a03000 moveq r3, #0 + 1f02850: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f02854: e3a0b000 mov fp, #0 + 1f02858: e343bf20 movt fp, #16160 ; 0x3f20 + 1f0285c: e59dc068 ldr ip, [sp, #104] ; 0x68 + 1f02860: e3a0e000 mov lr, #0 + 1f02864: e5d22000 ldrb r2, [r2] + 1f02868: e3a04a12 mov r4, #73728 ; 0x12000 + 1f0286c: e59cc000 ldr ip, [ip] + 1f02870: e3520000 cmp r2, #0 + 1f02874: 01a00003 moveq r0, r3 + 1f02878: e3a03801 mov r3, #65536 ; 0x10000 + 1f0287c: e3ccc612 bic ip, ip, #18874368 ; 0x1200000 + 1f02880: e3a02a02 mov r2, #8192 ; 0x2000 + 1f02884: e18c0000 orr r0, ip, r0 + 1f02888: e58d2054 str r2, [sp, #84] ; 0x54 + 1f0288c: e1a0c003 mov ip, r3 + 1f02890: e58b0004 str r0, [fp, #4] + 1f02894: e58d4050 str r4, [sp, #80] ; 0x50 + 1f02898: e1a0000e mov r0, lr + 1f0289c: e59db024 ldr fp, [sp, #36] ; 0x24 + 1f028a0: e35b0000 cmp fp, #0 + 1f028a4: 11a0000c movne r0, ip + 1f028a8: e3a0c000 mov ip, #0 + 1f028ac: e343cf20 movt ip, #16160 ; 0x3f20 + 1f028b0: 059d2050 ldreq r2, [sp, #80] ; 0x50 + 1f028b4: 11a0300e movne r3, lr + 1f028b8: 059d4054 ldreq r4, [sp, #84] ; 0x54 + 1f028bc: e3510000 cmp r1, #0 + 1f028c0: e59d1070 ldr r1, [sp, #112] ; 0x70 + 1f028c4: 01a04000 moveq r4, r0 + 1f028c8: e58d1050 str r1, [sp, #80] ; 0x50 + 1f028cc: 01a03002 moveq r3, r2 + 1f028d0: e58c401c str r4, [ip, #28] + 1f028d4: e58c3028 str r3, [ip, #40] ; 0x28 + 1f028d8: e309027c movw r0, #37500 ; 0x927c + 1f028dc: e34001fa movt r0, #506 ; 0x1fa + 1f028e0: eb003efb bl 1f124d4 + 1f028e4: e59d2020 ldr r2, [sp, #32] + 1f028e8: e59d1028 ldr r1, [sp, #40] ; 0x28 + 1f028ec: e1a00009 mov r0, r9 + 1f028f0: eb00ee66 bl 1f3e290 + 1f028f4: e1a00009 mov r0, r9 + 1f028f8: eb00ebe0 bl 1f3d880 + 1f028fc: e5993004 ldr r3, [r9, #4] + 1f02900: e5991008 ldr r1, [r9, #8] + 1f02904: e183b001 orr fp, r3, r1 + 1f02908: e1a0200b mov r2, fp + 1f0290c: e21bb001 ands fp, fp, #1 + 1f02910: e7e020d2 ubfx r2, r2, #1, #1 + 1f02914: 1a00023a bne 1f03204 + 1f02918: e3520000 cmp r2, #0 + 1f0291c: 0a000020 beq 1f029a4 + 1f02920: e898000c ldm r8, {r2, r3} + 1f02924: e598100c ldr r1, [r8, #12] + 1f02928: e0623003 rsb r3, r2, r3 + 1f0292c: e2411001 sub r1, r1, #1 + 1f02930: e59d000c ldr r0, [sp, #12] + 1f02934: e1a03143 asr r3, r3, #2 + 1f02938: e0030390 mul r3, r0, r3 + 1f0293c: e730f311 udiv r0, r1, r3 + 1f02940: e0611093 mls r1, r3, r0, r1 + 1f02944: e588100c str r1, [r8, #12] + 1f02948: e309027c movw r0, #37500 ; 0x927c + 1f0294c: e34001fa movt r0, #506 ; 0x1fa + 1f02950: e1530001 cmp r3, r1 + 1f02954: 830831b4 movwhi r3, #33204 ; 0x81b4 + 1f02958: 91a0100b movls r1, fp + 1f0295c: 8340300a movthi r3, #10 + 1f02960: 80212193 mlahi r1, r3, r1, r2 + 1f02964: eb007381 bl 1f1f770 + 1f02968: e59d3010 ldr r3, [sp, #16] + 1f0296c: e5d33000 ldrb r3, [r3] + 1f02970: e3530000 cmp r3, #0 + 1f02974: 1a00008a bne 1f02ba4 + 1f02978: e3043e34 movw r3, #20020 ; 0x4e34 + 1f0297c: e340300f movt r3, #15 + 1f02980: e1570003 cmp r7, r3 + 1f02984: d2877001 addle r7, r7, #1 + 1f02988: d5965004 ldrle r5, [r6, #4] + 1f0298c: daffff76 ble 1f0276c + 1f02990: e5963004 ldr r3, [r6, #4] + 1f02994: e1550003 cmp r5, r3 + 1f02998: 0afffffc beq 1f02990 + 1f0299c: e1a05003 mov r5, r3 + 1f029a0: eaffff71 b 1f0276c + 1f029a4: e1813003 orr r3, r1, r3 + 1f029a8: e3130004 tst r3, #4 + 1f029ac: 0a000043 beq 1f02ac0 + 1f029b0: e898000c ldm r8, {r2, r3} + 1f029b4: e598100c ldr r1, [r8, #12] + 1f029b8: e0623003 rsb r3, r2, r3 + 1f029bc: e2811001 add r1, r1, #1 + 1f029c0: eaffffda b 1f02930 + 1f029c4: e3530000 cmp r3, #0 + 1f029c8: 1a0001c6 bne 1f030e8 + 1f029cc: e59d3040 ldr r3, [sp, #64] ; 0x40 + 1f029d0: e5d33000 ldrb r3, [r3] + 1f029d4: e3530000 cmp r3, #0 + 1f029d8: 03a00803 moveq r0, #196608 ; 0x30000 + 1f029dc: 13a00807 movne r0, #458752 ; 0x70000 + 1f029e0: 03a03a52 moveq r3, #335872 ; 0x52000 + 1f029e4: e58d00c4 str r0, [sp, #196] ; 0xc4 + 1f029e8: 13a03a12 movne r3, #73728 ; 0x12000 + 1f029ec: 03a00a12 moveq r0, #73728 ; 0x12000 + 1f029f0: 13a00a52 movne r0, #335872 ; 0x52000 + 1f029f4: e58d3050 str r3, [sp, #80] ; 0x50 + 1f029f8: e58d00bc str r0, [sp, #188] ; 0xbc + 1f029fc: 03a03a22 moveq r3, #139264 ; 0x22000 + 1f02a00: 03a00a72 moveq r0, #466944 ; 0x72000 + 1f02a04: 13a00a32 movne r0, #204800 ; 0x32000 + 1f02a08: 13a03a62 movne r3, #401408 ; 0x62000 + 1f02a0c: e58d00c0 str r0, [sp, #192] ; 0xc0 + 1f02a10: e58d3054 str r3, [sp, #84] ; 0x54 + 1f02a14: 03a00a02 moveq r0, #8192 ; 0x2000 + 1f02a18: 13a00a42 movne r0, #270336 ; 0x42000 + 1f02a1c: 03a0b000 moveq fp, #0 + 1f02a20: e58d00b4 str r0, [sp, #180] ; 0xb4 + 1f02a24: 13a0b701 movne fp, #262144 ; 0x40000 + 1f02a28: 03a00807 moveq r0, #458752 ; 0x70000 + 1f02a2c: 13a00803 movne r0, #196608 ; 0x30000 + 1f02a30: 03a02a42 moveq r2, #270336 ; 0x42000 + 1f02a34: e58d00a4 str r0, [sp, #164] ; 0xa4 + 1f02a38: 13a02a02 movne r2, #8192 ; 0x2000 + 1f02a3c: 03a00801 moveq r0, #65536 ; 0x10000 + 1f02a40: 13a00805 movne r0, #327680 ; 0x50000 + 1f02a44: 03a04a32 moveq r4, #204800 ; 0x32000 + 1f02a48: e58d00b0 str r0, [sp, #176] ; 0xb0 + 1f02a4c: 13a04a72 movne r4, #466944 ; 0x72000 + 1f02a50: 03a00806 moveq r0, #393216 ; 0x60000 + 1f02a54: 13a00802 movne r0, #131072 ; 0x20000 + 1f02a58: 03a03805 moveq r3, #327680 ; 0x50000 + 1f02a5c: e58d00ac str r0, [sp, #172] ; 0xac + 1f02a60: 13a03801 movne r3, #65536 ; 0x10000 + 1f02a64: 03a0ca62 moveq ip, #401408 ; 0x62000 + 1f02a68: 13a0ca22 movne ip, #139264 ; 0x22000 + 1f02a6c: 03a00802 moveq r0, #131072 ; 0x20000 + 1f02a70: 13a00806 movne r0, #393216 ; 0x60000 + 1f02a74: 03a0e701 moveq lr, #262144 ; 0x40000 + 1f02a78: 13a0e000 movne lr, #0 + 1f02a7c: e58db0b8 str fp, [sp, #184] ; 0xb8 + 1f02a80: e59db03c ldr fp, [sp, #60] ; 0x3c + 1f02a84: e5dbb000 ldrb fp, [fp] + 1f02a88: e35b0000 cmp fp, #0 + 1f02a8c: 159dc0c4 ldrne ip, [sp, #196] ; 0xc4 + 1f02a90: 1affff81 bne 1f0289c + 1f02a94: e59d30c0 ldr r3, [sp, #192] ; 0xc0 + 1f02a98: e1a0200c mov r2, ip + 1f02a9c: e58d3050 str r3, [sp, #80] ; 0x50 + 1f02aa0: e59d30b4 ldr r3, [sp, #180] ; 0xb4 + 1f02aa4: e58d3054 str r3, [sp, #84] ; 0x54 + 1f02aa8: e59d40bc ldr r4, [sp, #188] ; 0xbc + 1f02aac: e59d30a4 ldr r3, [sp, #164] ; 0xa4 + 1f02ab0: e59dc0b0 ldr ip, [sp, #176] ; 0xb0 + 1f02ab4: e59de0ac ldr lr, [sp, #172] ; 0xac + 1f02ab8: e59d00b8 ldr r0, [sp, #184] ; 0xb8 + 1f02abc: eaffff76 b 1f0289c + 1f02ac0: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f02ac4: e3530001 cmp r3, #1 + 1f02ac8: 9affffa6 bls 1f02968 + 1f02acc: e59d3074 ldr r3, [sp, #116] ; 0x74 + 1f02ad0: e5930000 ldr r0, [r3] + 1f02ad4: e3500000 cmp r0, #0 + 1f02ad8: 0affffa2 beq 1f02968 + 1f02adc: e59d3020 ldr r3, [sp, #32] + 1f02ae0: e3530000 cmp r3, #0 + 1f02ae4: 0a000027 beq 1f02b88 + 1f02ae8: e5984000 ldr r4, [r8] + 1f02aec: e1a0300b mov r3, fp + 1f02af0: e5982004 ldr r2, [r8, #4] + 1f02af4: e3a0e001 mov lr, #1 + 1f02af8: e1a01004 mov r1, r4 + 1f02afc: e58d5054 str r5, [sp, #84] ; 0x54 + 1f02b00: e0642002 rsb r2, r4, r2 + 1f02b04: e59d4018 ldr r4, [sp, #24] + 1f02b08: e598c00c ldr ip, [r8, #12] + 1f02b0c: e1a02142 asr r2, r2, #2 + 1f02b10: e59d5020 ldr r5, [sp, #32] + 1f02b14: e5944000 ldr r4, [r4] + 1f02b18: e58d4070 str r4, [sp, #112] ; 0x70 + 1f02b1c: e59d400c ldr r4, [sp, #12] + 1f02b20: e0020294 mul r2, r4, r2 + 1f02b24: e59d4070 ldr r4, [sp, #112] ; 0x70 + 1f02b28: e58d2070 str r2, [sp, #112] ; 0x70 + 1f02b2c: ea000004 b 1f02b44 + 1f02b30: e2833001 add r3, r3, #1 + 1f02b34: e281192a add r1, r1, #688128 ; 0xa8000 + 1f02b38: e1550003 cmp r5, r3 + 1f02b3c: e2811f6d add r1, r1, #436 ; 0x1b4 + 1f02b40: 0a000198 beq 1f031a8 + 1f02b44: e010231e ands r2, r0, lr, lsl r3 + 1f02b48: 0afffff8 beq 1f02b30 + 1f02b4c: e15c0003 cmp ip, r3 + 1f02b50: 0afffff6 beq 1f02b30 + 1f02b54: e59d2070 ldr r2, [sp, #112] ; 0x70 + 1f02b58: e1520003 cmp r2, r3 + 1f02b5c: 9afffff3 bls 1f02b30 + 1f02b60: e3510000 cmp r1, #0 + 1f02b64: e1a0c003 mov ip, r3 + 1f02b68: 0afffff0 beq 1f02b30 + 1f02b6c: e1540001 cmp r4, r1 + 1f02b70: 0affffee beq 1f02b30 + 1f02b74: e309027c movw r0, #37500 ; 0x927c + 1f02b78: e34001fa movt r0, #506 ; 0x1fa + 1f02b7c: e59d5054 ldr r5, [sp, #84] ; 0x54 + 1f02b80: e588300c str r3, [r8, #12] + 1f02b84: eb0072f9 bl 1f1f770 + 1f02b88: e59d2074 ldr r2, [sp, #116] ; 0x74 + 1f02b8c: e3a03000 mov r3, #0 + 1f02b90: e5823000 str r3, [r2] + 1f02b94: e59d3010 ldr r3, [sp, #16] + 1f02b98: e5d33000 ldrb r3, [r3] + 1f02b9c: e3530000 cmp r3, #0 + 1f02ba0: 0affff74 beq 1f02978 + 1f02ba4: e59d3060 ldr r3, [sp, #96] ; 0x60 + 1f02ba8: e3a0c000 mov ip, #0 + 1f02bac: e343cf20 movt ip, #16160 ; 0x3f20 + 1f02bb0: e59d206c ldr r2, [sp, #108] ; 0x6c + 1f02bb4: e5d33000 ldrb r3, [r3] + 1f02bb8: e59da098 ldr sl, [sp, #152] ; 0x98 + 1f02bbc: e5920000 ldr r0, [r2] + 1f02bc0: e3530000 cmp r3, #0 + 1f02bc4: e59d909c ldr r9, [sp, #156] ; 0x9c + 1f02bc8: 03a0e000 moveq lr, #0 + 1f02bcc: e59d70a0 ldr r7, [sp, #160] ; 0xa0 + 1f02bd0: 11a0e000 movne lr, r0 + 1f02bd4: e59c3034 ldr r3, [ip, #52] ; 0x34 + 1f02bd8: e0033000 and r3, r3, r0 + 1f02bdc: e153000e cmp r3, lr + 1f02be0: 0a00017f beq 1f031e4 + 1f02be4: e59d308c ldr r3, [sp, #140] ; 0x8c + 1f02be8: e3a02000 mov r2, #0 + 1f02bec: e59d1010 ldr r1, [sp, #16] + 1f02bf0: e5d33000 ldrb r3, [r3] + 1f02bf4: e5c12000 strb r2, [r1] + 1f02bf8: e59d201c ldr r2, [sp, #28] + 1f02bfc: e1923003 orrs r3, r2, r3 + 1f02c00: 0a000001 beq 1f02c0c + 1f02c04: e1a00009 mov r0, r9 + 1f02c08: eb00e618 bl 1f3c470 + 1f02c0c: e3a03000 mov r3, #0 + 1f02c10: e5c73000 strb r3, [r7] + 1f02c14: e3a03001 mov r3, #1 + 1f02c18: e58d3044 str r3, [sp, #68] ; 0x44 + 1f02c1c: e59d30c8 ldr r3, [sp, #200] ; 0xc8 + 1f02c20: e3080018 movw r0, #32792 ; 0x8018 + 1f02c24: e34001f6 movt r0, #502 ; 0x1f6 + 1f02c28: e583b000 str fp, [r3] + 1f02c2c: eb00eaa6 bl 1f3d6cc + 1f02c30: e1a00009 mov r0, r9 + 1f02c34: eb00df3e bl 1f3a934 + 1f02c38: e59d3060 ldr r3, [sp, #96] ; 0x60 + 1f02c3c: e59d206c ldr r2, [sp, #108] ; 0x6c + 1f02c40: e3a00000 mov r0, #0 + 1f02c44: e3430f20 movt r0, #16160 ; 0x3f20 + 1f02c48: e5d33000 ldrb r3, [r3] + 1f02c4c: e5921000 ldr r1, [r2] + 1f02c50: e3530000 cmp r3, #0 + 1f02c54: 11a0e001 movne lr, r1 + 1f02c58: 03a0e000 moveq lr, #0 + 1f02c5c: e5902034 ldr r2, [r0, #52] ; 0x34 + 1f02c60: e3a03000 mov r3, #0 + 1f02c64: e3433f20 movt r3, #16160 ; 0x3f20 + 1f02c68: e0022001 and r2, r2, r1 + 1f02c6c: e152000e cmp r2, lr + 1f02c70: 0a000153 beq 1f031c4 + 1f02c74: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f02c78: e59d0010 ldr r0, [sp, #16] + 1f02c7c: e5d21000 ldrb r1, [r2] + 1f02c80: e3a02000 mov r2, #0 + 1f02c84: e5c02000 strb r2, [r0] + 1f02c88: e59d0080 ldr r0, [sp, #128] ; 0x80 + 1f02c8c: e1510002 cmp r1, r2 + 1f02c90: e5c02000 strb r2, [r0] + 1f02c94: e59d0084 ldr r0, [sp, #132] ; 0x84 + 1f02c98: e5c02000 strb r2, [r0] + 1f02c9c: e59d0090 ldr r0, [sp, #144] ; 0x90 + 1f02ca0: e5c02000 strb r2, [r0] + 1f02ca4: e59d0040 ldr r0, [sp, #64] ; 0x40 + 1f02ca8: e5c02000 strb r2, [r0] + 1f02cac: e59d003c ldr r0, [sp, #60] ; 0x3c + 1f02cb0: e5c02000 strb r2, [r0] + 1f02cb4: e59d007c ldr r0, [sp, #124] ; 0x7c + 1f02cb8: e5c02000 strb r2, [r0] + 1f02cbc: e59d0088 ldr r0, [sp, #136] ; 0x88 + 1f02cc0: e5c02000 strb r2, [r0] + 1f02cc4: e59d0094 ldr r0, [sp, #148] ; 0x94 + 1f02cc8: e5c02000 strb r2, [r0] + 1f02ccc: e59d0030 ldr r0, [sp, #48] ; 0x30 + 1f02cd0: e5c02000 strb r2, [r0] + 1f02cd4: 1a000150 bne 1f0321c + 1f02cd8: e59d2068 ldr r2, [sp, #104] ; 0x68 + 1f02cdc: e3a04a02 mov r4, #8192 ; 0x2000 + 1f02ce0: e3a00a12 mov r0, #73728 ; 0x12000 + 1f02ce4: e5922000 ldr r2, [r2] + 1f02ce8: e3c22612 bic r2, r2, #18874368 ; 0x1200000 + 1f02cec: e5832004 str r2, [r3, #4] + 1f02cf0: e3a03801 mov r3, #65536 ; 0x10000 + 1f02cf4: e59d2038 ldr r2, [sp, #56] ; 0x38 + 1f02cf8: e3a0e000 mov lr, #0 + 1f02cfc: e343ef20 movt lr, #16160 ; 0x3f20 + 1f02d00: e5d22000 ldrb r2, [r2] + 1f02d04: e3520000 cmp r2, #0 + 1f02d08: 01a04000 moveq r4, r0 + 1f02d0c: e59d0014 ldr r0, [sp, #20] + 1f02d10: 11a03001 movne r3, r1 + 1f02d14: 03a01a02 moveq r1, #8192 ; 0x2000 + 1f02d18: 13a01a12 movne r1, #73728 ; 0x12000 + 1f02d1c: 13a02801 movne r2, #65536 ; 0x10000 + 1f02d20: e5d00000 ldrb r0, [r0] + 1f02d24: e3500000 cmp r0, #0 + 1f02d28: e8981001 ldm r8, {r0, ip} + 1f02d2c: 01a03004 moveq r3, r4 + 1f02d30: 01a01002 moveq r1, r2 + 1f02d34: e58e101c str r1, [lr, #28] + 1f02d38: e060c00c rsb ip, r0, ip + 1f02d3c: e58e3028 str r3, [lr, #40] ; 0x28 + 1f02d40: e59d30ec ldr r3, [sp, #236] ; 0xec + 1f02d44: e15c0003 cmp ip, r3 + 1f02d48: da00000d ble 1f02d84 + 1f02d4c: e3a04000 mov r4, #0 + 1f02d50: e1a05004 mov r5, r4 + 1f02d54: e0800004 add r0, r0, r4 + 1f02d58: e2855001 add r5, r5, #1 + 1f02d5c: eb0043a1 bl 1f13be8 + 1f02d60: e59d200c ldr r2, [sp, #12] + 1f02d64: e8980009 ldm r8, {r0, r3} + 1f02d68: e284492a add r4, r4, #688128 ; 0xa8000 + 1f02d6c: e0603003 rsb r3, r0, r3 + 1f02d70: e2844f6d add r4, r4, #436 ; 0x1b4 + 1f02d74: e1a03143 asr r3, r3, #2 + 1f02d78: e0030392 mul r3, r2, r3 + 1f02d7c: e1530005 cmp r3, r5 + 1f02d80: cafffff3 bgt 1f02d54 + 1f02d84: e59d3044 ldr r3, [sp, #68] ; 0x44 + 1f02d88: e599203c ldr r2, [r9, #60] ; 0x3c + 1f02d8c: e5892040 str r2, [r9, #64] ; 0x40 + 1f02d90: e3530000 cmp r3, #0 + 1f02d94: e59d2058 ldr r2, [sp, #88] ; 0x58 + 1f02d98: e3a03000 mov r3, #0 + 1f02d9c: e5880004 str r0, [r8, #4] + 1f02da0: e588300c str r3, [r8, #12] + 1f02da4: e5823000 str r3, [r2] + 1f02da8: e5c93028 strb r3, [r9, #40] ; 0x28 + 1f02dac: e5893048 str r3, [r9, #72] ; 0x48 + 1f02db0: e589304c str r3, [r9, #76] ; 0x4c + 1f02db4: e5893050 str r3, [r9, #80] ; 0x50 + 1f02db8: 0a000003 beq 1f02dcc + 1f02dbc: e59d308c ldr r3, [sp, #140] ; 0x8c + 1f02dc0: e5d33000 ldrb r3, [r3] + 1f02dc4: e3530000 cmp r3, #0 + 1f02dc8: 1a000002 bne 1f02dd8 + 1f02dcc: e59d301c ldr r3, [sp, #28] + 1f02dd0: e3530000 cmp r3, #0 + 1f02dd4: 0a000249 beq 1f03700 + 1f02dd8: e1a00009 mov r0, r9 + 1f02ddc: eb00e5a3 bl 1f3c470 + 1f02de0: e59d20a8 ldr r2, [sp, #168] ; 0xa8 + 1f02de4: e3a03000 mov r3, #0 + 1f02de8: e1a00009 mov r0, r9 + 1f02dec: e5823004 str r3, [r2, #4] + 1f02df0: e5823008 str r3, [r2, #8] + 1f02df4: eb00ded3 bl 1f3a948 + 1f02df8: e59d30e4 ldr r3, [sp, #228] ; 0xe4 + 1f02dfc: e5d33000 ldrb r3, [r3] + 1f02e00: e3530000 cmp r3, #0 + 1f02e04: 0a00010b beq 1f03238 + 1f02e08: e30d51dc movw r5, #53724 ; 0xd1dc + 1f02e0c: e34051f9 movt r5, #505 ; 0x1f9 + 1f02e10: e5d7b000 ldrb fp, [r7] + 1f02e14: ea000000 b 1f02e1c + 1f02e18: e5d7b000 ldrb fp, [r7] + 1f02e1c: e35b0000 cmp fp, #0 + 1f02e20: 1a000025 bne 1f02ebc + 1f02e24: e59a222c ldr r2, [sl, #556] ; 0x22c + 1f02e28: e59a3228 ldr r3, [sl, #552] ; 0x228 + 1f02e2c: e1530002 cmp r3, r2 + 1f02e30: 0afffffc beq 1f02e28 + 1f02e34: e59a3228 ldr r3, [sl, #552] ; 0x228 + 1f02e38: e1a00009 mov r0, r9 + 1f02e3c: e58a322c str r3, [sl, #556] ; 0x22c + 1f02e40: eb00e7a2 bl 1f3ccd0 + 1f02e44: e5d9b028 ldrb fp, [r9, #40] ; 0x28 + 1f02e48: e35b0000 cmp fp, #0 + 1f02e4c: 0afffff1 beq 1f02e18 + 1f02e50: e5984000 ldr r4, [r8] + 1f02e54: e5983004 ldr r3, [r8, #4] + 1f02e58: e59d200c ldr r2, [sp, #12] + 1f02e5c: e0643003 rsb r3, r4, r3 + 1f02e60: e1a03143 asr r3, r3, #2 + 1f02e64: e0030392 mul r3, r2, r3 + 1f02e68: e3530000 cmp r3, #0 + 1f02e6c: 0a0000ef beq 1f03230 + 1f02e70: e3540000 cmp r4, #0 + 1f02e74: e599202c ldr r2, [r9, #44] ; 0x2c + 1f02e78: e3a03000 mov r3, #0 + 1f02e7c: e58d2018 str r2, [sp, #24] + 1f02e80: e585300c str r3, [r5, #12] + 1f02e84: 0a0000e9 beq 1f03230 + 1f02e88: e1a01004 mov r1, r4 + 1f02e8c: e309027c movw r0, #37500 ; 0x927c + 1f02e90: e34001fa movt r0, #506 ; 0x1fa + 1f02e94: eb007235 bl 1f1f770 + 1f02e98: e1a00009 mov r0, r9 + 1f02e9c: e59d2018 ldr r2, [sp, #24] + 1f02ea0: e1a01004 mov r1, r4 + 1f02ea4: eb00dec8 bl 1f3a9cc + 1f02ea8: e1a00009 mov r0, r9 + 1f02eac: eb00dea5 bl 1f3a948 + 1f02eb0: e35b0000 cmp fp, #0 + 1f02eb4: e5c7b000 strb fp, [r7] + 1f02eb8: 0affffd9 beq 1f02e24 + 1f02ebc: e3a03000 mov r3, #0 + 1f02ec0: e58d301c str r3, [sp, #28] + 1f02ec4: e58d3044 str r3, [sp, #68] ; 0x44 + 1f02ec8: eafffde9 b 1f02674 + 1f02ecc: e3a02903 mov r2, #49152 ; 0xc000 + 1f02ed0: e3432f20 movt r2, #16160 ; 0x3f20 + 1f02ed4: e3a03a07 mov r3, #28672 ; 0x7000 + 1f02ed8: e3433f00 movt r3, #16128 ; 0x3f00 + 1f02edc: e3a01106 mov r1, #-2147483647 ; 0x80000001 + 1f02ee0: e5821008 str r1, [r2, #8] + 1f02ee4: e3a02001 mov r2, #1 + 1f02ee8: e59d10d0 ldr r1, [sp, #208] ; 0xd0 + 1f02eec: e5832ff0 str r2, [r3, #4080] ; 0xff0 + 1f02ef0: e5831004 str r1, [r3, #4] + 1f02ef4: e5832000 str r2, [r3] + 1f02ef8: e59d3014 ldr r3, [sp, #20] + 1f02efc: e5d31000 ldrb r1, [r3] + 1f02f00: eafffe41 b 1f0280c + 1f02f04: e59d3018 ldr r3, [sp, #24] + 1f02f08: e593310c ldr r3, [r3, #268] ; 0x10c + 1f02f0c: e3530000 cmp r3, #0 + 1f02f10: 1afffe1a bne 1f02780 + 1f02f14: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f02f18: e59d2018 ldr r2, [sp, #24] + 1f02f1c: e5933000 ldr r3, [r3] + 1f02f20: e1d22fb6 ldrh r2, [r2, #246] ; 0xf6 + 1f02f24: e3530000 cmp r3, #0 + 1f02f28: 1a00000a bne 1f02f58 + 1f02f2c: e30e1a2d movw r1, #59949 ; 0xea2d + 1f02f30: e30f0c07 movw r0, #64519 ; 0xfc07 + 1f02f34: e1520000 cmp r2, r0 + 1f02f38: 11520001 cmpne r2, r1 + 1f02f3c: e30e0a16 movw r0, #59926 ; 0xea16 + 1f02f40: 03a01001 moveq r1, #1 + 1f02f44: 13a01000 movne r1, #0 + 1f02f48: e1520000 cmp r2, r0 + 1f02f4c: 03811001 orreq r1, r1, #1 + 1f02f50: e3510000 cmp r1, #0 + 1f02f54: 1a000057 bne 1f030b8 + 1f02f58: e59d105c ldr r1, [sp, #92] ; 0x5c + 1f02f5c: e5911000 ldr r1, [r1] + 1f02f60: e1520001 cmp r2, r1 + 1f02f64: 1afffe05 bne 1f02780 + 1f02f68: e59d20d8 ldr r2, [sp, #216] ; 0xd8 + 1f02f6c: e5da10f9 ldrb r1, [sl, #249] ; 0xf9 + 1f02f70: e7d22003 ldrb r2, [r2, r3] + 1f02f74: e1520001 cmp r2, r1 + 1f02f78: 1a000054 bne 1f030d0 + 1f02f7c: e2833001 add r3, r3, #1 + 1f02f80: e59d202c ldr r2, [sp, #44] ; 0x2c + 1f02f84: e3530004 cmp r3, #4 + 1f02f88: e5823000 str r3, [r2] + 1f02f8c: e3093274 movw r3, #37492 ; 0x9274 + 1f02f90: e34031fa movt r3, #506 ; 0x1fa + 1f02f94: 1afffdf9 bne 1f02780 + 1f02f98: e59d2060 ldr r2, [sp, #96] ; 0x60 + 1f02f9c: e59d106c ldr r1, [sp, #108] ; 0x6c + 1f02fa0: e59d70a0 ldr r7, [sp, #160] ; 0xa0 + 1f02fa4: e5d2c000 ldrb ip, [r2] + 1f02fa8: e3a02000 mov r2, #0 + 1f02fac: e5911000 ldr r1, [r1] + 1f02fb0: e1a00002 mov r0, r2 + 1f02fb4: e15c0002 cmp ip, r2 + 1f02fb8: e59da098 ldr sl, [sp, #152] ; 0x98 + 1f02fbc: e59d909c ldr r9, [sp, #156] ; 0x9c + 1f02fc0: e3430f20 movt r0, #16160 ; 0x3f20 + 1f02fc4: e5832000 str r2, [r3] + 1f02fc8: 11a0e001 movne lr, r1 + 1f02fcc: 01a0e002 moveq lr, r2 + 1f02fd0: e5c72000 strb r2, [r7] + 1f02fd4: e5902034 ldr r2, [r0, #52] ; 0x34 + 1f02fd8: e3a03000 mov r3, #0 + 1f02fdc: e3433f20 movt r3, #16160 ; 0x3f20 + 1f02fe0: e0022001 and r2, r2, r1 + 1f02fe4: e152000e cmp r2, lr + 1f02fe8: 0a0001ca beq 1f03718 + 1f02fec: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f02ff0: e59d1010 ldr r1, [sp, #16] + 1f02ff4: e5d20000 ldrb r0, [r2] + 1f02ff8: e3a02000 mov r2, #0 + 1f02ffc: e5c12000 strb r2, [r1] + 1f03000: e59d1080 ldr r1, [sp, #128] ; 0x80 + 1f03004: e1500002 cmp r0, r2 + 1f03008: e5c12000 strb r2, [r1] + 1f0300c: e59d1084 ldr r1, [sp, #132] ; 0x84 + 1f03010: e5c12000 strb r2, [r1] + 1f03014: e59d1090 ldr r1, [sp, #144] ; 0x90 + 1f03018: e5c12000 strb r2, [r1] + 1f0301c: e59d1040 ldr r1, [sp, #64] ; 0x40 + 1f03020: e5c12000 strb r2, [r1] + 1f03024: e59d103c ldr r1, [sp, #60] ; 0x3c + 1f03028: e5c12000 strb r2, [r1] + 1f0302c: e59d107c ldr r1, [sp, #124] ; 0x7c + 1f03030: e5c12000 strb r2, [r1] + 1f03034: e59d1088 ldr r1, [sp, #136] ; 0x88 + 1f03038: e5c12000 strb r2, [r1] + 1f0303c: e59d1094 ldr r1, [sp, #148] ; 0x94 + 1f03040: e5c12000 strb r2, [r1] + 1f03044: e59d1030 ldr r1, [sp, #48] ; 0x30 + 1f03048: e5c12000 strb r2, [r1] + 1f0304c: 1a0001b9 bne 1f03738 + 1f03050: e59d2068 ldr r2, [sp, #104] ; 0x68 + 1f03054: e3a0ca02 mov ip, #8192 ; 0x2000 + 1f03058: e5921000 ldr r1, [r2] + 1f0305c: e3a02a12 mov r2, #73728 ; 0x12000 + 1f03060: e3c11612 bic r1, r1, #18874368 ; 0x1200000 + 1f03064: e5831004 str r1, [r3, #4] + 1f03068: e3a03801 mov r3, #65536 ; 0x10000 + 1f0306c: e59d1038 ldr r1, [sp, #56] ; 0x38 + 1f03070: e3a0b000 mov fp, #0 + 1f03074: e5d11000 ldrb r1, [r1] + 1f03078: e3510000 cmp r1, #0 + 1f0307c: 11a0200c movne r2, ip + 1f03080: e59dc014 ldr ip, [sp, #20] + 1f03084: 11a03000 movne r3, r0 + 1f03088: 03a00a02 moveq r0, #8192 ; 0x2000 + 1f0308c: 13a00a12 movne r0, #73728 ; 0x12000 + 1f03090: 13a01801 movne r1, #65536 ; 0x10000 + 1f03094: e5dce000 ldrb lr, [ip] + 1f03098: e3a0c000 mov ip, #0 + 1f0309c: e343cf20 movt ip, #16160 ; 0x3f20 + 1f030a0: e35e0000 cmp lr, #0 + 1f030a4: 01a00001 moveq r0, r1 + 1f030a8: 01a03002 moveq r3, r2 + 1f030ac: e58c001c str r0, [ip, #28] + 1f030b0: e58c3028 str r3, [ip, #40] ; 0x28 + 1f030b4: eafffed8 b 1f02c1c + 1f030b8: e59d3018 ldr r3, [sp, #24] + 1f030bc: e59d105c ldr r1, [sp, #92] ; 0x5c + 1f030c0: e5d330f9 ldrb r3, [r3, #249] ; 0xf9 + 1f030c4: e5812000 str r2, [r1] + 1f030c8: e3530043 cmp r3, #67 ; 0x43 + 1f030cc: 0a000038 beq 1f031b4 + 1f030d0: e59d202c ldr r2, [sp, #44] ; 0x2c + 1f030d4: e3a03000 mov r3, #0 + 1f030d8: e5823000 str r3, [r2] + 1f030dc: e59d205c ldr r2, [sp, #92] ; 0x5c + 1f030e0: e5823000 str r3, [r2] + 1f030e4: eafffda5 b 1f02780 + 1f030e8: e3a03a12 mov r3, #73728 ; 0x12000 + 1f030ec: e3a00807 mov r0, #458752 ; 0x70000 + 1f030f0: e58d3050 str r3, [sp, #80] ; 0x50 + 1f030f4: e3a0b701 mov fp, #262144 ; 0x40000 + 1f030f8: e3a03a62 mov r3, #401408 ; 0x62000 + 1f030fc: e58d00c4 str r0, [sp, #196] ; 0xc4 + 1f03100: e58d3054 str r3, [sp, #84] ; 0x54 + 1f03104: e3a00a52 mov r0, #335872 ; 0x52000 + 1f03108: e3a02a02 mov r2, #8192 ; 0x2000 + 1f0310c: e58d00bc str r0, [sp, #188] ; 0xbc + 1f03110: e3a04a72 mov r4, #466944 ; 0x72000 + 1f03114: e3a00a32 mov r0, #204800 ; 0x32000 + 1f03118: e3a03801 mov r3, #65536 ; 0x10000 + 1f0311c: e58d00c0 str r0, [sp, #192] ; 0xc0 + 1f03120: e3a0ca22 mov ip, #139264 ; 0x22000 + 1f03124: e3a00a42 mov r0, #270336 ; 0x42000 + 1f03128: e3a0e000 mov lr, #0 + 1f0312c: e58d00b4 str r0, [sp, #180] ; 0xb4 + 1f03130: e58db0b8 str fp, [sp, #184] ; 0xb8 + 1f03134: e3a00803 mov r0, #196608 ; 0x30000 + 1f03138: e58d00a4 str r0, [sp, #164] ; 0xa4 + 1f0313c: e3a00805 mov r0, #327680 ; 0x50000 + 1f03140: e58d00b0 str r0, [sp, #176] ; 0xb0 + 1f03144: e3a00802 mov r0, #131072 ; 0x20000 + 1f03148: e58d00ac str r0, [sp, #172] ; 0xac + 1f0314c: e3a00806 mov r0, #393216 ; 0x60000 + 1f03150: eafffe4a b 1f02a80 + 1f03154: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f03158: e3520000 cmp r2, #0 + 1f0315c: d3a03000 movle r3, #0 + 1f03160: c2033001 andgt r3, r3, #1 + 1f03164: e3530000 cmp r3, #0 + 1f03168: 0a000167 beq 1f0370c + 1f0316c: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f03170: e2433001 sub r3, r3, #1 + 1f03174: e58d304c str r3, [sp, #76] ; 0x4c + 1f03178: e3530000 cmp r3, #0 + 1f0317c: e59d3014 ldr r3, [sp, #20] + 1f03180: e5d31000 ldrb r1, [r3] + 1f03184: cafffda0 bgt 1f0280c + 1f03188: e2422c1a sub r2, r2, #6656 ; 0x1a00 + 1f0318c: e2211001 eor r1, r1, #1 + 1f03190: e2422008 sub r2, r2, #8 + 1f03194: e5c31000 strb r1, [r3] + 1f03198: e58d2048 str r2, [sp, #72] ; 0x48 + 1f0319c: e3002341 movw r2, #833 ; 0x341 + 1f031a0: e58d204c str r2, [sp, #76] ; 0x4c + 1f031a4: eafffd98 b 1f0280c + 1f031a8: e59d5054 ldr r5, [sp, #84] ; 0x54 + 1f031ac: e588c00c str ip, [r8, #12] + 1f031b0: eafffe74 b 1f02b88 + 1f031b4: e59d20e8 ldr r2, [sp, #232] ; 0xe8 + 1f031b8: e3a03001 mov r3, #1 + 1f031bc: e5823000 str r3, [r2] + 1f031c0: eafffd6e b 1f02780 + 1f031c4: e3a0c064 mov ip, #100 ; 0x64 + 1f031c8: e5962004 ldr r2, [r6, #4] + 1f031cc: e5963004 ldr r3, [r6, #4] + 1f031d0: e1520003 cmp r2, r3 + 1f031d4: 0afffffc beq 1f031cc + 1f031d8: e25cc001 subs ip, ip, #1 + 1f031dc: 1afffff9 bne 1f031c8 + 1f031e0: eafffe9d b 1f02c5c + 1f031e4: e3a01064 mov r1, #100 ; 0x64 + 1f031e8: e5962004 ldr r2, [r6, #4] + 1f031ec: e5963004 ldr r3, [r6, #4] + 1f031f0: e1520003 cmp r2, r3 + 1f031f4: 0afffffc beq 1f031ec + 1f031f8: e2511001 subs r1, r1, #1 + 1f031fc: 1afffff9 bne 1f031e8 + 1f03200: eafffe73 b 1f02bd4 + 1f03204: e59d70a0 ldr r7, [sp, #160] ; 0xa0 + 1f03208: e3a0b000 mov fp, #0 + 1f0320c: e59da098 ldr sl, [sp, #152] ; 0x98 + 1f03210: e59d909c ldr r9, [sp, #156] ; 0x9c + 1f03214: e5c7b000 strb fp, [r7] + 1f03218: eafffe7f b 1f02c1c + 1f0321c: e3a04a62 mov r4, #401408 ; 0x62000 + 1f03220: e3a00a72 mov r0, #466944 ; 0x72000 + 1f03224: e3a03807 mov r3, #458752 ; 0x70000 + 1f03228: e3a01806 mov r1, #393216 ; 0x60000 + 1f0322c: eafffeb0 b 1f02cf4 + 1f03230: e3a0b000 mov fp, #0 + 1f03234: eaffff1d b 1f02eb0 + 1f03238: e3080828 movw r0, #34856 ; 0x8828 + 1f0323c: e34001f8 movt r0, #504 ; 0x1f8 + 1f03240: e58d301c str r3, [sp, #28] + 1f03244: eb004c31 bl 1f16310 + 1f03248: e5d7b000 ldrb fp, [r7] + 1f0324c: e35b0000 cmp fp, #0 + 1f03250: 1a000012 bne 1f032a0 + 1f03254: e3080828 movw r0, #34856 ; 0x8828 + 1f03258: e34001f8 movt r0, #504 ; 0x1f8 + 1f0325c: eb005915 bl 1f196b8 + 1f03260: e3500007 cmp r0, #7 + 1f03264: 979ff100 ldrls pc, [pc, r0, lsl #2] + 1f03268: ea0000b0 b 1f03530 + 1f0326c: 01f0351c .word 0x01f0351c + 1f03270: 01f033f8 .word 0x01f033f8 + 1f03274: 01f0328c .word 0x01f0328c + 1f03278: 01f032bc .word 0x01f032bc + 1f0327c: 01f032ac .word 0x01f032ac + 1f03280: 01f0328c .word 0x01f0328c + 1f03284: 01f034c4 .word 0x01f034c4 + 1f03288: 01f032d4 .word 0x01f032d4 + 1f0328c: e1a00009 mov r0, r9 + 1f03290: eb00e470 bl 1f3c458 + 1f03294: e5d7b000 ldrb fp, [r7] + 1f03298: e35b0000 cmp fp, #0 + 1f0329c: 0affffec beq 1f03254 + 1f032a0: e3a03000 mov r3, #0 + 1f032a4: e58d3044 str r3, [sp, #68] ; 0x44 + 1f032a8: eafffcf1 b 1f02674 + 1f032ac: e1a00009 mov r0, r9 + 1f032b0: eb00e46e bl 1f3c470 + 1f032b4: e5d7b000 ldrb fp, [r7] + 1f032b8: eaffffe3 b 1f0324c + 1f032bc: e1a00009 mov r0, r9 + 1f032c0: eb00e474 bl 1f3c498 + 1f032c4: e1a00009 mov r0, r9 + 1f032c8: eb00dc43 bl 1f3a3dc + 1f032cc: e5d7b000 ldrb fp, [r7] + 1f032d0: eaffffdd b 1f0324c + 1f032d4: e59d308c ldr r3, [sp, #140] ; 0x8c + 1f032d8: e5d33000 ldrb r3, [r3] + 1f032dc: e3530000 cmp r3, #0 + 1f032e0: 1a000103 bne 1f036f4 + 1f032e4: e59d3060 ldr r3, [sp, #96] ; 0x60 + 1f032e8: e3a0c000 mov ip, #0 + 1f032ec: e343cf20 movt ip, #16160 ; 0x3f20 + 1f032f0: e59d206c ldr r2, [sp, #108] ; 0x6c + 1f032f4: e5d33000 ldrb r3, [r3] + 1f032f8: e5920000 ldr r0, [r2] + 1f032fc: e3530000 cmp r3, #0 + 1f03300: 03a0e000 moveq lr, #0 + 1f03304: 11a0e000 movne lr, r0 + 1f03308: e59c2034 ldr r2, [ip, #52] ; 0x34 + 1f0330c: e3a03000 mov r3, #0 + 1f03310: e3433f20 movt r3, #16160 ; 0x3f20 + 1f03314: e0022000 and r2, r2, r0 + 1f03318: e152000e cmp r2, lr + 1f0331c: 0a000085 beq 1f03538 + 1f03320: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f03324: e59d1010 ldr r1, [sp, #16] + 1f03328: e5d20000 ldrb r0, [r2] + 1f0332c: e3a02000 mov r2, #0 + 1f03330: e5c12000 strb r2, [r1] + 1f03334: e59d1080 ldr r1, [sp, #128] ; 0x80 + 1f03338: e1500002 cmp r0, r2 + 1f0333c: e5c12000 strb r2, [r1] + 1f03340: e59d1084 ldr r1, [sp, #132] ; 0x84 + 1f03344: e5c12000 strb r2, [r1] + 1f03348: e59d1090 ldr r1, [sp, #144] ; 0x90 + 1f0334c: e5c12000 strb r2, [r1] + 1f03350: e59d1040 ldr r1, [sp, #64] ; 0x40 + 1f03354: e5c12000 strb r2, [r1] + 1f03358: e59d103c ldr r1, [sp, #60] ; 0x3c + 1f0335c: e5c12000 strb r2, [r1] + 1f03360: e59d107c ldr r1, [sp, #124] ; 0x7c + 1f03364: e5c12000 strb r2, [r1] + 1f03368: e59d1088 ldr r1, [sp, #136] ; 0x88 + 1f0336c: e5c12000 strb r2, [r1] + 1f03370: e59d1094 ldr r1, [sp, #148] ; 0x94 + 1f03374: e5c12000 strb r2, [r1] + 1f03378: e59d1030 ldr r1, [sp, #48] ; 0x30 + 1f0337c: e5c12000 strb r2, [r1] + 1f03380: 1a000074 bne 1f03558 + 1f03384: e59d2068 ldr r2, [sp, #104] ; 0x68 + 1f03388: e3a0ca02 mov ip, #8192 ; 0x2000 + 1f0338c: e5921000 ldr r1, [r2] + 1f03390: e3a02a12 mov r2, #73728 ; 0x12000 + 1f03394: e3c11612 bic r1, r1, #18874368 ; 0x1200000 + 1f03398: e5831004 str r1, [r3, #4] + 1f0339c: e3a03801 mov r3, #65536 ; 0x10000 + 1f033a0: e59d1038 ldr r1, [sp, #56] ; 0x38 + 1f033a4: e3a0e000 mov lr, #0 + 1f033a8: e343ef20 movt lr, #16160 ; 0x3f20 + 1f033ac: e5d11000 ldrb r1, [r1] + 1f033b0: e3510000 cmp r1, #0 + 1f033b4: 11a03000 movne r3, r0 + 1f033b8: e59d0014 ldr r0, [sp, #20] + 1f033bc: 03a0ca02 moveq ip, #8192 ; 0x2000 + 1f033c0: 11a0200c movne r2, ip + 1f033c4: 13a01801 movne r1, #65536 ; 0x10000 + 1f033c8: 13a0ca12 movne ip, #73728 ; 0x12000 + 1f033cc: e5d00000 ldrb r0, [r0] + 1f033d0: e3500000 cmp r0, #0 + 1f033d4: e3080828 movw r0, #34856 ; 0x8828 + 1f033d8: e34001f8 movt r0, #504 ; 0x1f8 + 1f033dc: 01a0c001 moveq ip, r1 + 1f033e0: 01a03002 moveq r3, r2 + 1f033e4: e58ec01c str ip, [lr, #28] + 1f033e8: e58e3028 str r3, [lr, #40] ; 0x28 + 1f033ec: eb004bc7 bl 1f16310 + 1f033f0: e5d7b000 ldrb fp, [r7] + 1f033f4: eaffff94 b 1f0324c + 1f033f8: e59d3058 ldr r3, [sp, #88] ; 0x58 + 1f033fc: e3080828 movw r0, #34856 ; 0x8828 + 1f03400: e34001f8 movt r0, #504 ; 0x1f8 + 1f03404: e2800b51 add r0, r0, #82944 ; 0x14400 + 1f03408: e30d41f4 movw r4, #53748 ; 0xd1f4 + 1f0340c: e34041f9 movt r4, #505 ; 0x1f9 + 1f03410: e2800e39 add r0, r0, #912 ; 0x390 + 1f03414: e5830000 str r0, [r3] + 1f03418: eb003f18 bl 1f13080 + 1f0341c: e2505000 subs r5, r0, #0 + 1f03420: 0a000051 beq 1f0356c + 1f03424: e5941000 ldr r1, [r4] + 1f03428: e1a00009 mov r0, r9 + 1f0342c: eb00dcee bl 1f3a7ec + 1f03430: e2502000 subs r2, r0, #0 + 1f03434: 0a00005a beq 1f035a4 + 1f03438: e5983000 ldr r3, [r8] + 1f0343c: e30d01dc movw r0, #53724 ; 0xd1dc + 1f03440: e34001f9 movt r0, #505 ; 0x1f9 + 1f03444: e5981004 ldr r1, [r8, #4] + 1f03448: e59dc00c ldr ip, [sp, #12] + 1f0344c: e0631001 rsb r1, r3, r1 + 1f03450: e5945000 ldr r5, [r4] + 1f03454: e1a01141 asr r1, r1, #2 + 1f03458: e001019c mul r1, ip, r1 + 1f0345c: e3510000 cmp r1, #0 + 1f03460: 0a000011 beq 1f034ac + 1f03464: e3530000 cmp r3, #0 + 1f03468: e3a01000 mov r1, #0 + 1f0346c: e580100c str r1, [r0, #12] + 1f03470: 0a00000d beq 1f034ac + 1f03474: e1a01003 mov r1, r3 + 1f03478: e309027c movw r0, #37500 ; 0x927c + 1f0347c: e34001fa movt r0, #506 ; 0x1fa + 1f03480: e58d3018 str r3, [sp, #24] + 1f03484: e1a0b002 mov fp, r2 + 1f03488: eb0070b8 bl 1f1f770 + 1f0348c: e59d3018 ldr r3, [sp, #24] + 1f03490: e1a02005 mov r2, r5 + 1f03494: e1a00009 mov r0, r9 + 1f03498: e1a01003 mov r1, r3 + 1f0349c: eb00dd4a bl 1f3a9cc + 1f034a0: e1a00009 mov r0, r9 + 1f034a4: eb00dd27 bl 1f3a948 + 1f034a8: e5945000 ldr r5, [r4] + 1f034ac: e5c7b000 strb fp, [r7] + 1f034b0: e3550000 cmp r5, #0 + 1f034b4: 0a000033 beq 1f03588 + 1f034b8: e3a03001 mov r3, #1 + 1f034bc: e58d301c str r3, [sp, #28] + 1f034c0: eaffff61 b 1f0324c + 1f034c4: e59d30d4 ldr r3, [sp, #212] ; 0xd4 + 1f034c8: e1a00009 mov r0, r9 + 1f034cc: e59d40dc ldr r4, [sp, #220] ; 0xdc + 1f034d0: e5d33003 ldrb r3, [r3, #3] + 1f034d4: e5893034 str r3, [r9, #52] ; 0x34 + 1f034d8: e5c43000 strb r3, [r4] + 1f034dc: eb00dd19 bl 1f3a948 + 1f034e0: e5d42000 ldrb r2, [r4] + 1f034e4: e3120001 tst r2, #1 + 1f034e8: 159d1078 ldrne r1, [sp, #120] ; 0x78 + 1f034ec: 11a03001 movne r3, r1 + 1f034f0: 15d3305d ldrbne r3, [r3, #93] ; 0x5d + 1f034f4: 13833020 orrne r3, r3, #32 + 1f034f8: 15c1305d strbne r3, [r1, #93] ; 0x5d + 1f034fc: e3120002 tst r2, #2 + 1f03500: 0a00000a beq 1f03530 + 1f03504: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f03508: e5d7b000 ldrb fp, [r7] + 1f0350c: e5d2305d ldrb r3, [r2, #93] ; 0x5d + 1f03510: e3833040 orr r3, r3, #64 ; 0x40 + 1f03514: e5c2305d strb r3, [r2, #93] ; 0x5d + 1f03518: eaffff4b b 1f0324c + 1f0351c: e1a00009 mov r0, r9 + 1f03520: eb00e5ea bl 1f3ccd0 + 1f03524: e5d9c028 ldrb ip, [r9, #40] ; 0x28 + 1f03528: e35c0000 cmp ip, #0 + 1f0352c: 1a000054 bne 1f03684 + 1f03530: e5d7b000 ldrb fp, [r7] + 1f03534: eaffff44 b 1f0324c + 1f03538: e3a01064 mov r1, #100 ; 0x64 + 1f0353c: e5962004 ldr r2, [r6, #4] + 1f03540: e5963004 ldr r3, [r6, #4] + 1f03544: e1520003 cmp r2, r3 + 1f03548: 0afffffc beq 1f03540 + 1f0354c: e2511001 subs r1, r1, #1 + 1f03550: 1afffff9 bne 1f0353c + 1f03554: eaffff6b b 1f03308 + 1f03558: e3a0ca62 mov ip, #401408 ; 0x62000 + 1f0355c: e3a02a72 mov r2, #466944 ; 0x72000 + 1f03560: e3a03807 mov r3, #458752 ; 0x70000 + 1f03564: e3a00806 mov r0, #393216 ; 0x60000 + 1f03568: eaffff8c b 1f033a0 + 1f0356c: e5940000 ldr r0, [r4] + 1f03570: eb003e7d bl 1f12f6c + 1f03574: e3500000 cmp r0, #0 + 1f03578: 1a000010 bne 1f035c0 + 1f0357c: e59d2058 ldr r2, [sp, #88] ; 0x58 + 1f03580: e3a03000 mov r3, #0 + 1f03584: e5823000 str r3, [r2] + 1f03588: e3080828 movw r0, #34856 ; 0x8828 + 1f0358c: e34001f8 movt r0, #504 ; 0x1f8 + 1f03590: eb004a71 bl 1f15f5c + 1f03594: e3a03001 mov r3, #1 + 1f03598: e5d7b000 ldrb fp, [r7] + 1f0359c: e58d301c str r3, [sp, #28] + 1f035a0: eaffff29 b 1f0324c + 1f035a4: e3080828 movw r0, #34856 ; 0x8828 + 1f035a8: e34001f8 movt r0, #504 ; 0x1f8 + 1f035ac: e58d2018 str r2, [sp, #24] + 1f035b0: eb004a69 bl 1f15f5c + 1f035b4: e59d2018 ldr r2, [sp, #24] + 1f035b8: e5842000 str r2, [r4] + 1f035bc: eafffff1 b 1f03588 + 1f035c0: e3081828 movw r1, #34856 ; 0x8828 + 1f035c4: e34011f8 movt r1, #504 ; 0x1f8 + 1f035c8: e2811b52 add r1, r1, #83968 ; 0x14800 + 1f035cc: e3080348 movw r0, #33608 ; 0x8348 + 1f035d0: e34001f5 movt r0, #501 ; 0x1f5 + 1f035d4: e28110aa add r1, r1, #170 ; 0xaa + 1f035d8: e30d41dc movw r4, #53724 ; 0xd1dc + 1f035dc: e34041f9 movt r4, #505 ; 0x1f9 + 1f035e0: eb00eed9 bl 1f3f14c + 1f035e4: e3083828 movw r3, #34856 ; 0x8828 + 1f035e8: e34031f8 movt r3, #504 ; 0x1f8 + 1f035ec: e2833905 add r3, r3, #81920 ; 0x14000 + 1f035f0: e1a00004 mov r0, r4 + 1f035f4: e2831e89 add r1, r3, #2192 ; 0x890 + 1f035f8: e5d3289c ldrb r2, [r3, #2204] ; 0x89c + 1f035fc: e2022001 and r2, r2, #1 + 1f03600: eb00e7bf bl 1f3d504 + 1f03604: e2502000 subs r2, r0, #0 + 1f03608: 0affffdb beq 1f0357c + 1f0360c: e594b000 ldr fp, [r4] + 1f03610: e5943004 ldr r3, [r4, #4] + 1f03614: e59d100c ldr r1, [sp, #12] + 1f03618: e06b3003 rsb r3, fp, r3 + 1f0361c: e1a03143 asr r3, r3, #2 + 1f03620: e0030391 mul r3, r1, r3 + 1f03624: e3530000 cmp r3, #0 + 1f03628: 0a000010 beq 1f03670 + 1f0362c: e35b0000 cmp fp, #0 + 1f03630: e584500c str r5, [r4, #12] + 1f03634: 0a00000d beq 1f03670 + 1f03638: e1a0100b mov r1, fp + 1f0363c: e309027c movw r0, #37500 ; 0x927c + 1f03640: e34001fa movt r0, #506 ; 0x1fa + 1f03644: e1a05002 mov r5, r2 + 1f03648: eb007048 bl 1f1f770 + 1f0364c: e3082828 movw r2, #34856 ; 0x8828 + 1f03650: e34021f8 movt r2, #504 ; 0x1f8 + 1f03654: e2822b52 add r2, r2, #83968 ; 0x14800 + 1f03658: e1a00009 mov r0, r9 + 1f0365c: e1a0100b mov r1, fp + 1f03660: e28220aa add r2, r2, #170 ; 0xaa + 1f03664: eb00dcd8 bl 1f3a9cc + 1f03668: e1a00009 mov r0, r9 + 1f0366c: eb00dcb5 bl 1f3a948 + 1f03670: e59d3058 ldr r3, [sp, #88] ; 0x58 + 1f03674: e1a0b005 mov fp, r5 + 1f03678: e5c75000 strb r5, [r7] + 1f0367c: e5935000 ldr r5, [r3] + 1f03680: eaffff8a b 1f034b0 + 1f03684: e5984000 ldr r4, [r8] + 1f03688: e30d11dc movw r1, #53724 ; 0xd1dc + 1f0368c: e34011f9 movt r1, #505 ; 0x1f9 + 1f03690: e5983004 ldr r3, [r8, #4] + 1f03694: e59d200c ldr r2, [sp, #12] + 1f03698: e0643003 rsb r3, r4, r3 + 1f0369c: e599502c ldr r5, [r9, #44] ; 0x2c + 1f036a0: e1a03143 asr r3, r3, #2 + 1f036a4: e0030392 mul r3, r2, r3 + 1f036a8: e3530000 cmp r3, #0 + 1f036ac: 0a00000e beq 1f036ec + 1f036b0: e3540000 cmp r4, #0 + 1f036b4: e3a03000 mov r3, #0 + 1f036b8: e581300c str r3, [r1, #12] + 1f036bc: 0a00000a beq 1f036ec + 1f036c0: e1a01004 mov r1, r4 + 1f036c4: e309027c movw r0, #37500 ; 0x927c + 1f036c8: e34001fa movt r0, #506 ; 0x1fa + 1f036cc: e1a0b00c mov fp, ip + 1f036d0: eb007026 bl 1f1f770 + 1f036d4: e1a00009 mov r0, r9 + 1f036d8: e1a02005 mov r2, r5 + 1f036dc: e1a01004 mov r1, r4 + 1f036e0: eb00dcb9 bl 1f3a9cc + 1f036e4: e1a00009 mov r0, r9 + 1f036e8: eb00dc96 bl 1f3a948 + 1f036ec: e5c7b000 strb fp, [r7] + 1f036f0: eafffed5 b 1f0324c + 1f036f4: e1a00009 mov r0, r9 + 1f036f8: eb00e35c bl 1f3c470 + 1f036fc: eafffef8 b 1f032e4 + 1f03700: e1a00009 mov r0, r9 + 1f03704: eb00db34 bl 1f3a3dc + 1f03708: eafffdb4 b 1f02de0 + 1f0370c: e59d3014 ldr r3, [sp, #20] + 1f03710: e5d31000 ldrb r1, [r3] + 1f03714: eafffc3c b 1f0280c + 1f03718: e3a0c064 mov ip, #100 ; 0x64 + 1f0371c: e5962004 ldr r2, [r6, #4] + 1f03720: e5963004 ldr r3, [r6, #4] + 1f03724: e1520003 cmp r2, r3 + 1f03728: 0afffffc beq 1f03720 + 1f0372c: e25cc001 subs ip, ip, #1 + 1f03730: 1afffff9 bne 1f0371c + 1f03734: eafffe26 b 1f02fd4 + 1f03738: e3a0ca62 mov ip, #401408 ; 0x62000 + 1f0373c: e3a02a72 mov r2, #466944 ; 0x72000 + 1f03740: e3a03807 mov r3, #458752 ; 0x70000 + 1f03744: e3a00806 mov r0, #393216 ; 0x60000 + 1f03748: eafffe47 b 1f0306c + +01f0374c : + 1f0374c: e92d4010 push {r4, lr} + 1f03750: eb00054a bl 1f04c80 + 1f03754: ebfff2b1 bl 1f00220 <_enable_unaligned_access> + 1f03758: ebfff304 bl 1f00370 <_get_core> + 1f0375c: e1a01000 mov r1, r0 + 1f03760: e308035c movw r0, #33628 ; 0x835c + 1f03764: e34001f5 movt r0, #501 ; 0x1f5 + 1f03768: eb00ee77 bl 1f3f14c + 1f0376c: ebfffb2f bl 1f02430 + +01f03770 : + 1f03770: e3a00a05 mov r0, #20480 ; 0x5000 + 1f03774: e3430f21 movt r0, #16161 ; 0x3f21 + 1f03778: e12fff1e bx lr + +01f0377c : + 1f0377c: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f03780: e1a04000 mov r4, r0 + 1f03784: e1a05001 mov r5, r1 + 1f03788: e24dd008 sub sp, sp, #8 + 1f0378c: ebfff2c0 bl 1f00294 <_data_memory_barrier> + 1f03790: eb00006a bl 1f03940 + 1f03794: e3a01004 mov r1, #4 + 1f03798: e3a00002 mov r0, #2 + 1f0379c: e3400003 movt r0, #3 + 1f037a0: eb000072 bl 1f03970 + 1f037a4: eb000207 bl 1f03fc8 + 1f037a8: e3a00002 mov r0, #2 + 1f037ac: e3400003 movt r0, #3 + 1f037b0: eb000222 bl 1f04040 + 1f037b4: e3500000 cmp r0, #0 + 1f037b8: 0a00004b beq 1f038ec + 1f037bc: e590600c ldr r6, [r0, #12] + 1f037c0: e30b3280 movw r3, #45696 ; 0xb280 + 1f037c4: e3403ee6 movt r3, #3814 ; 0xee6 + 1f037c8: e3560000 cmp r6, #0 + 1f037cc: 01a06003 moveq r6, r3 + 1f037d0: ebfff2af bl 1f00294 <_data_memory_barrier> + 1f037d4: e3a01002 mov r1, #2 + 1f037d8: e3a0000e mov r0, #14 + 1f037dc: eb000264 bl 1f04174 + 1f037e0: e3a01002 mov r1, #2 + 1f037e4: e3a0000f mov r0, #15 + 1f037e8: eb000261 bl 1f04174 + 1f037ec: ebfff2a8 bl 1f00294 <_data_memory_barrier> + 1f037f0: e30431cc movw r3, #16844 ; 0x41cc + 1f037f4: e34031f6 movt r3, #502 ; 0x1f6 + 1f037f8: e3a00002 mov r0, #2 + 1f037fc: e3a01000 mov r1, #0 + 1f03800: e5932000 ldr r2, [r3] + 1f03804: e5820094 str r0, [r2, #148] ; 0x94 + 1f03808: e58d1004 str r1, [sp, #4] + 1f0380c: e59d3004 ldr r3, [sp, #4] + 1f03810: e3530ffa cmp r3, #1000 ; 0x3e8 + 1f03814: aa000005 bge 1f03830 + 1f03818: e59d3004 ldr r3, [sp, #4] + 1f0381c: e2833001 add r3, r3, #1 + 1f03820: e58d3004 str r3, [sp, #4] + 1f03824: e59d3004 ldr r3, [sp, #4] + 1f03828: e3530ffa cmp r3, #1000 ; 0x3e8 + 1f0382c: bafffff9 blt 1f03818 + 1f03830: e3a03000 mov r3, #0 + 1f03834: e3a01903 mov r1, #49152 ; 0xc000 + 1f03838: e5821098 str r1, [r2, #152] ; 0x98 + 1f0383c: e58d3004 str r3, [sp, #4] + 1f03840: e59d3004 ldr r3, [sp, #4] + 1f03844: e3530ffa cmp r3, #1000 ; 0x3e8 + 1f03848: aa000005 bge 1f03864 + 1f0384c: e59d3004 ldr r3, [sp, #4] + 1f03850: e2833001 add r3, r3, #1 + 1f03854: e58d3004 str r3, [sp, #4] + 1f03858: e59d3004 ldr r3, [sp, #4] + 1f0385c: e3530ffa cmp r3, #1000 ; 0x3e8 + 1f03860: bafffff9 blt 1f0384c + 1f03864: e3a07a05 mov r7, #20480 ; 0x5000 + 1f03868: e3437f21 movt r7, #16161 ; 0x3f21 + 1f0386c: e3a03002 mov r3, #2 + 1f03870: e3a08000 mov r8, #0 + 1f03874: e5823094 str r3, [r2, #148] ; 0x94 + 1f03878: e5828098 str r8, [r2, #152] ; 0x98 + 1f0387c: ebfff284 bl 1f00294 <_data_memory_barrier> + 1f03880: e3a03001 mov r3, #1 + 1f03884: e5873004 str r3, [r7, #4] + 1f03888: ebfff281 bl 1f00294 <_data_memory_barrier> + 1f0388c: e3550008 cmp r5, #8 + 1f03890: e5878060 str r8, [r7, #96] ; 0x60 + 1f03894: 1587804c strne r8, [r7, #76] ; 0x4c + 1f03898: 0a000010 beq 1f038e0 + 1f0389c: e1a04184 lsl r4, r4, #3 + 1f038a0: e3a05a05 mov r5, #20480 ; 0x5000 + 1f038a4: e3435f21 movt r5, #16161 ; 0x3f21 + 1f038a8: e716f416 sdiv r6, r6, r4 + 1f038ac: e3a03000 mov r3, #0 + 1f038b0: e3a020c6 mov r2, #198 ; 0xc6 + 1f038b4: e5853050 str r3, [r5, #80] ; 0x50 + 1f038b8: e2466001 sub r6, r6, #1 + 1f038bc: e5853044 str r3, [r5, #68] ; 0x44 + 1f038c0: e5852048 str r2, [r5, #72] ; 0x48 + 1f038c4: e5856068 str r6, [r5, #104] ; 0x68 + 1f038c8: ebfff271 bl 1f00294 <_data_memory_barrier> + 1f038cc: e3a03003 mov r3, #3 + 1f038d0: e5853060 str r3, [r5, #96] ; 0x60 + 1f038d4: ebfff26e bl 1f00294 <_data_memory_barrier> + 1f038d8: e28dd008 add sp, sp, #8 + 1f038dc: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f038e0: e3a03003 mov r3, #3 + 1f038e4: e587304c str r3, [r7, #76] ; 0x4c + 1f038e8: eaffffeb b 1f0389c + 1f038ec: e30b6280 movw r6, #45696 ; 0xb280 + 1f038f0: e3406ee6 movt r6, #3814 ; 0xee6 + 1f038f4: eaffffb5 b 1f037d0 + +01f038f8 : + 1f038f8: e3a01a05 mov r1, #20480 ; 0x5000 + 1f038fc: e3431f21 movt r1, #16161 ; 0x3f21 + 1f03900: e5912054 ldr r2, [r1, #84] ; 0x54 + 1f03904: e3a03a05 mov r3, #20480 ; 0x5000 + 1f03908: e3433f21 movt r3, #16161 ; 0x3f21 + 1f0390c: e3120020 tst r2, #32 + 1f03910: 0afffffa beq 1f03900 + 1f03914: e5830040 str r0, [r3, #64] ; 0x40 + 1f03918: e12fff1e bx lr + +01f0391c : + 1f0391c: e92d4010 push {r4, lr} + 1f03920: e3a01008 mov r1, #8 + 1f03924: e1a04000 mov r4, r0 + 1f03928: e3a00cc2 mov r0, #49664 ; 0xc200 + 1f0392c: e3400001 movt r0, #1 + 1f03930: ebffff91 bl 1f0377c + 1f03934: e1a00004 mov r0, r4 + 1f03938: e8bd4010 pop {r4, lr} + 1f0393c: ea00ee02 b 1f3f14c + +01f03940 : + 1f03940: e3093bd0 movw r3, #39888 ; 0x9bd0 + 1f03944: e34031fa movt r3, #506 ; 0x1fa + 1f03948: e3012bd0 movw r2, #7120 ; 0x1bd0 + 1f0394c: e34021fb movt r2, #507 ; 0x1fb + 1f03950: e3a0100c mov r1, #12 + 1f03954: e3a00002 mov r0, #2 + 1f03958: e5831000 str r1, [r3] + 1f0395c: e3a01000 mov r1, #0 + 1f03960: e5820000 str r0, [r2] + 1f03964: e5831004 str r1, [r3, #4] + 1f03968: e5831008 str r1, [r3, #8] + 1f0396c: e12fff1e bx lr + +01f03970 : + 1f03970: e92d000f push {r0, r1, r2, r3} + 1f03974: e3010bd0 movw r0, #7120 ; 0x1bd0 + 1f03978: e34001fb movt r0, #507 ; 0x1fb + 1f0397c: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f03980: e5903000 ldr r3, [r0] + 1f03984: e3092bd0 movw r2, #39888 ; 0x9bd0 + 1f03988: e34021fa movt r2, #506 ; 0x1fa + 1f0398c: e24dd008 sub sp, sp, #8 + 1f03990: e3a0c009 mov ip, #9 + 1f03994: e340c004 movt ip, #4 + 1f03998: e28de02c add lr, sp, #44 ; 0x2c + 1f0399c: e59d1028 ldr r1, [sp, #40] ; 0x28 + 1f039a0: e7821103 str r1, [r2, r3, lsl #2] + 1f039a4: e151000c cmp r1, ip + 1f039a8: e58de004 str lr, [sp, #4] + 1f039ac: e283c001 add ip, r3, #1 + 1f039b0: e580c000 str ip, [r0] + 1f039b4: 0a0000e7 beq 1f03d58 + 1f039b8: 8a000039 bhi 1f03aa4 + 1f039bc: e3a0400a mov r4, #10 + 1f039c0: e3404003 movt r4, #3 + 1f039c4: e1510004 cmp r1, r4 + 1f039c8: 8a000015 bhi 1f03a24 + 1f039cc: e3a04002 mov r4, #2 + 1f039d0: e3404003 movt r4, #3 + 1f039d4: e1510004 cmp r1, r4 + 1f039d8: 2a000021 bcs 1f03a64 + 1f039dc: e3a0e006 mov lr, #6 + 1f039e0: e340e001 movt lr, #1 + 1f039e4: e151000e cmp r1, lr + 1f039e8: 9a0000a8 bls 1f03c90 + 1f039ec: e3a0e001 mov lr, #1 + 1f039f0: e340e002 movt lr, #2 + 1f039f4: e151000e cmp r1, lr + 1f039f8: 0a000148 beq 1f03f20 + 1f039fc: e308e001 movw lr, #32769 ; 0x8001 + 1f03a00: e340e002 movt lr, #2 + 1f03a04: e151000e cmp r1, lr + 1f03a08: 0a000144 beq 1f03f20 + 1f03a0c: e3a0e007 mov lr, #7 + 1f03a10: e340e001 movt lr, #1 + 1f03a14: e151000e cmp r1, lr + 1f03a18: 0a0000c1 beq 1f03d24 + 1f03a1c: e5803000 str r3, [r0] + 1f03a20: ea000019 b 1f03a8c + 1f03a24: e3a04004 mov r4, #4 + 1f03a28: e3404004 movt r4, #4 + 1f03a2c: e1510004 cmp r1, r4 + 1f03a30: 8a0000a6 bhi 1f03cd0 + 1f03a34: e3a04003 mov r4, #3 + 1f03a38: e3404004 movt r4, #4 + 1f03a3c: e1510004 cmp r1, r4 + 1f03a40: 2a0000c4 bcs 1f03d58 + 1f03a44: e3a04010 mov r4, #16 + 1f03a48: e3404003 movt r4, #3 + 1f03a4c: e1510004 cmp r1, r4 + 1f03a50: 0a0000f1 beq 1f03e1c + 1f03a54: e3a04001 mov r4, #1 + 1f03a58: e3404004 movt r4, #4 + 1f03a5c: e1510004 cmp r1, r4 + 1f03a60: 1affffed bne 1f03a1c + 1f03a64: e2834002 add r4, r3, #2 + 1f03a68: e2831003 add r1, r3, #3 + 1f03a6c: e59ee000 ldr lr, [lr] + 1f03a70: e3a05008 mov r5, #8 + 1f03a74: e2833005 add r3, r3, #5 + 1f03a78: e782510c str r5, [r2, ip, lsl #2] + 1f03a7c: e5803000 str r3, [r0] + 1f03a80: e3a0c000 mov ip, #0 + 1f03a84: e782c104 str ip, [r2, r4, lsl #2] + 1f03a88: e782e101 str lr, [r2, r1, lsl #2] + 1f03a8c: e3a01000 mov r1, #0 + 1f03a90: e7821103 str r1, [r2, r3, lsl #2] + 1f03a94: e28dd008 add sp, sp, #8 + 1f03a98: e8bd47f0 pop {r4, r5, r6, r7, r8, r9, sl, lr} + 1f03a9c: e28dd010 add sp, sp, #16 + 1f03aa0: e12fff1e bx lr + 1f03aa4: e3084004 movw r4, #32772 ; 0x8004 + 1f03aa8: e3404004 movt r4, #4 + 1f03aac: e1510004 cmp r1, r4 + 1f03ab0: 9a0000c5 bls 1f03dcc + 1f03ab4: e308400a movw r4, #32778 ; 0x800a + 1f03ab8: e3404004 movt r4, #4 + 1f03abc: e1510004 cmp r1, r4 + 1f03ac0: 0a0000f6 beq 1f03ea0 + 1f03ac4: 9a00007d bls 1f03cc0 + 1f03ac8: e3a04001 mov r4, #1 + 1f03acc: e3404005 movt r4, #5 + 1f03ad0: e1510004 cmp r1, r4 + 1f03ad4: 0a000092 beq 1f03d24 + 1f03ad8: e3a04001 mov r4, #1 + 1f03adc: e3404006 movt r4, #6 + 1f03ae0: e1510004 cmp r1, r4 + 1f03ae4: 0a00006d beq 1f03ca0 + 1f03ae8: e308400b movw r4, #32779 ; 0x800b + 1f03aec: e3404004 movt r4, #4 + 1f03af0: e1510004 cmp r1, r4 + 1f03af4: 1affffc8 bne 1f03a1c + 1f03af8: e59e6000 ldr r6, [lr] + 1f03afc: e2831002 add r1, r3, #2 + 1f03b00: e3a08000 mov r8, #0 + 1f03b04: e2837003 add r7, r3, #3 + 1f03b08: e1a0e006 mov lr, r6 + 1f03b0c: e5964004 ldr r4, [r6, #4] + 1f03b10: e2845002 add r5, r4, #2 + 1f03b14: e1540008 cmp r4, r8 + 1f03b18: e1a05105 lsl r5, r5, #2 + 1f03b1c: e782510c str r5, [r2, ip, lsl #2] + 1f03b20: e7828101 str r8, [r2, r1, lsl #2] + 1f03b24: e2831004 add r1, r3, #4 + 1f03b28: e28dc030 add ip, sp, #48 ; 0x30 + 1f03b2c: e58dc004 str ip, [sp, #4] + 1f03b30: e49e5008 ldr r5, [lr], #8 + 1f03b34: e7825107 str r5, [r2, r7, lsl #2] + 1f03b38: e2835005 add r5, r3, #5 + 1f03b3c: e7824101 str r4, [r2, r1, lsl #2] + 1f03b40: e5805000 str r5, [r0] + 1f03b44: da00011d ble 1f03fc0 + 1f03b48: e2838009 add r8, r3, #9 + 1f03b4c: e2861018 add r1, r6, #24 + 1f03b50: e1a08108 lsl r8, r8, #2 + 1f03b54: e2487010 sub r7, r8, #16 + 1f03b58: e0829008 add r9, r2, r8 + 1f03b5c: e082a007 add sl, r2, r7 + 1f03b60: e159000e cmp r9, lr + 1f03b64: 8151000a cmphi r1, sl + 1f03b68: 93a01001 movls r1, #1 + 1f03b6c: 83a01000 movhi r1, #0 + 1f03b70: e354000b cmp r4, #11 + 1f03b74: 93a01000 movls r1, #0 + 1f03b78: 82011001 andhi r1, r1, #1 + 1f03b7c: e3510000 cmp r1, #0 + 1f03b80: 0a000106 beq 1f03fa0 + 1f03b84: e7a0115a sbfx r1, sl, #2, #1 + 1f03b88: e309cbd0 movw ip, #39888 ; 0x9bd0 + 1f03b8c: e340c1fa movt ip, #506 ; 0x1fa + 1f03b90: e2011003 and r1, r1, #3 + 1f03b94: e1510004 cmp r1, r4 + 1f03b98: 21a01004 movcs r1, r4 + 1f03b9c: e3510000 cmp r1, #0 + 1f03ba0: 0a0000fa beq 1f03f90 + 1f03ba4: e3510001 cmp r1, #1 + 1f03ba8: e5968008 ldr r8, [r6, #8] + 1f03bac: e78c8105 str r8, [ip, r5, lsl #2] + 1f03bb0: e286900c add r9, r6, #12 + 1f03bb4: e2838006 add r8, r3, #6 + 1f03bb8: 0a0000f6 beq 1f03f98 + 1f03bbc: e596900c ldr r9, [r6, #12] + 1f03bc0: e3510003 cmp r1, #3 + 1f03bc4: e78c9108 str r9, [ip, r8, lsl #2] + 1f03bc8: e283a007 add sl, r3, #7 + 1f03bcc: e2869010 add r9, r6, #16 + 1f03bd0: 02838008 addeq r8, r3, #8 + 1f03bd4: 05969010 ldreq r9, [r6, #16] + 1f03bd8: 01a03001 moveq r3, r1 + 1f03bdc: 078c910a streq r9, [ip, sl, lsl #2] + 1f03be0: 11a0800a movne r8, sl + 1f03be4: 02869014 addeq r9, r6, #20 + 1f03be8: 13a03002 movne r3, #2 + 1f03bec: e061c004 rsb ip, r1, r4 + 1f03bf0: e1a01101 lsl r1, r1, #2 + 1f03bf4: e24c6004 sub r6, ip, #4 + 1f03bf8: e0877001 add r7, r7, r1 + 1f03bfc: e0827007 add r7, r2, r7 + 1f03c00: e08e1001 add r1, lr, r1 + 1f03c04: e1a06126 lsr r6, r6, #2 + 1f03c08: e3a0e000 mov lr, #0 + 1f03c0c: e2866001 add r6, r6, #1 + 1f03c10: e1a0a106 lsl sl, r6, #2 + 1f03c14: f4610a8f vld1.32 {d16-d17}, [r1] + 1f03c18: e28ee001 add lr, lr, #1 + 1f03c1c: e156000e cmp r6, lr + 1f03c20: e2811010 add r1, r1, #16 + 1f03c24: e2877010 add r7, r7, #16 + 1f03c28: ed470b04 vstr d16, [r7, #-16] + 1f03c2c: ed471b02 vstr d17, [r7, #-8] + 1f03c30: 8afffff7 bhi 1f03c14 + 1f03c34: e15a000c cmp sl, ip + 1f03c38: e083300a add r3, r3, sl + 1f03c3c: e088800a add r8, r8, sl + 1f03c40: e089c10a add ip, r9, sl, lsl #2 + 1f03c44: 0a00000e beq 1f03c84 + 1f03c48: e2831001 add r1, r3, #1 + 1f03c4c: e799e10a ldr lr, [r9, sl, lsl #2] + 1f03c50: e1510004 cmp r1, r4 + 1f03c54: e782e108 str lr, [r2, r8, lsl #2] + 1f03c58: e3091bd0 movw r1, #39888 ; 0x9bd0 + 1f03c5c: e34011fa movt r1, #506 ; 0x1fa + 1f03c60: e288e001 add lr, r8, #1 + 1f03c64: aa000006 bge 1f03c84 + 1f03c68: e2833002 add r3, r3, #2 + 1f03c6c: e2888002 add r8, r8, #2 + 1f03c70: e1540003 cmp r4, r3 + 1f03c74: e59c3004 ldr r3, [ip, #4] + 1f03c78: e781310e str r3, [r1, lr, lsl #2] + 1f03c7c: c59c3008 ldrgt r3, [ip, #8] + 1f03c80: c7813108 strgt r3, [r1, r8, lsl #2] + 1f03c84: e0853004 add r3, r5, r4 + 1f03c88: e5803000 str r3, [r0] + 1f03c8c: eaffff7e b 1f03a8c + 1f03c90: e3510801 cmp r1, #65536 ; 0x10000 + 1f03c94: 8a000001 bhi 1f03ca0 + 1f03c98: e3510001 cmp r1, #1 + 1f03c9c: 1affff5e bne 1f03a1c + 1f03ca0: e2831002 add r1, r3, #2 + 1f03ca4: e3a0e008 mov lr, #8 + 1f03ca8: e2833005 add r3, r3, #5 + 1f03cac: e782e10c str lr, [r2, ip, lsl #2] + 1f03cb0: e5803000 str r3, [r0] + 1f03cb4: e3a00000 mov r0, #0 + 1f03cb8: e7820101 str r0, [r2, r1, lsl #2] + 1f03cbc: eaffff72 b 1f03a8c + 1f03cc0: e308e007 movw lr, #32775 ; 0x8007 + 1f03cc4: e340e004 movt lr, #4 + 1f03cc8: e151000e cmp r1, lr + 1f03ccc: 8a0000aa bhi 1f03f7c + 1f03cd0: e2410912 sub r0, r1, #294912 ; 0x48000 + 1f03cd4: e2831002 add r1, r3, #2 + 1f03cd8: e2400005 sub r0, r0, #5 + 1f03cdc: e3a0e004 mov lr, #4 + 1f03ce0: e3500002 cmp r0, #2 + 1f03ce4: e782e10c str lr, [r2, ip, lsl #2] + 1f03ce8: e3a0c000 mov ip, #0 + 1f03cec: e782c101 str ip, [r2, r1, lsl #2] + 1f03cf0: 959de004 ldrls lr, [sp, #4] + 1f03cf4: e3011bd0 movw r1, #7120 ; 0x1bd0 + 1f03cf8: e34011fb movt r1, #507 ; 0x1fb + 1f03cfc: e283c003 add ip, r3, #3 + 1f03d00: e3090bd0 movw r0, #39888 ; 0x9bd0 + 1f03d04: e34001fa movt r0, #506 ; 0x1fa + 1f03d08: 92833004 addls r3, r3, #4 + 1f03d0c: 95813000 strls r3, [r1] + 1f03d10: 959e1000 ldrls r1, [lr] + 1f03d14: 82833004 addhi r3, r3, #4 + 1f03d18: 9780110c strls r1, [r0, ip, lsl #2] + 1f03d1c: 85813000 strhi r3, [r1] + 1f03d20: eaffff59 b 1f03a8c + 1f03d24: e2831002 add r1, r3, #2 + 1f03d28: e2833c01 add r3, r3, #256 ; 0x100 + 1f03d2c: e2833003 add r3, r3, #3 + 1f03d30: e3a0eb01 mov lr, #1024 ; 0x400 + 1f03d34: e5803000 str r3, [r0] + 1f03d38: e3a00000 mov r0, #0 + 1f03d3c: e782e10c str lr, [r2, ip, lsl #2] + 1f03d40: e7820101 str r0, [r2, r1, lsl #2] + 1f03d44: eaffff50 b 1f03a8c + 1f03d48: e241e911 sub lr, r1, #278528 ; 0x44000 + 1f03d4c: e24ee003 sub lr, lr, #3 + 1f03d50: e35e0001 cmp lr, #1 + 1f03d54: 8affff30 bhi 1f03a1c + 1f03d58: e3084009 movw r4, #32777 ; 0x8009 + 1f03d5c: e3404004 movt r4, #4 + 1f03d60: e283e002 add lr, r3, #2 + 1f03d64: e1510004 cmp r1, r4 + 1f03d68: e3a05000 mov r5, #0 + 1f03d6c: e3a04008 mov r4, #8 + 1f03d70: e782410c str r4, [r2, ip, lsl #2] + 1f03d74: e2834003 add r4, r3, #3 + 1f03d78: e301cbd0 movw ip, #7120 ; 0x1bd0 + 1f03d7c: e340c1fb movt ip, #507 ; 0x1fb + 1f03d80: e782510e str r5, [r2, lr, lsl #2] + 1f03d84: e5804000 str r4, [r0] + 1f03d88: 0a000006 beq 1f03da8 + 1f03d8c: e2411911 sub r1, r1, #278528 ; 0x44000 + 1f03d90: e2411003 sub r1, r1, #3 + 1f03d94: e3c11901 bic r1, r1, #16384 ; 0x4000 + 1f03d98: e3510001 cmp r1, #1 + 1f03d9c: 82833005 addhi r3, r3, #5 + 1f03da0: 858c3000 strhi r3, [ip] + 1f03da4: 8affff38 bhi 1f03a8c + 1f03da8: e59d1004 ldr r1, [sp, #4] + 1f03dac: e283c004 add ip, r3, #4 + 1f03db0: e2833005 add r3, r3, #5 + 1f03db4: e5803000 str r3, [r0] + 1f03db8: e5910000 ldr r0, [r1] + 1f03dbc: e7820104 str r0, [r2, r4, lsl #2] + 1f03dc0: e5911004 ldr r1, [r1, #4] + 1f03dc4: e782110c str r1, [r2, ip, lsl #2] + 1f03dc8: eaffff2f b 1f03a8c + 1f03dcc: e308e003 movw lr, #32771 ; 0x8003 + 1f03dd0: e340e004 movt lr, #4 + 1f03dd4: e151000e cmp r1, lr + 1f03dd8: 2affffde bcs 1f03d58 + 1f03ddc: e3a0e010 mov lr, #16 + 1f03de0: e340e004 movt lr, #4 + 1f03de4: e151000e cmp r1, lr + 1f03de8: 8affffd6 bhi 1f03d48 + 1f03dec: e3a0e00f mov lr, #15 + 1f03df0: e340e004 movt lr, #4 + 1f03df4: e151000e cmp r1, lr + 1f03df8: 3a000024 bcc 1f03e90 + 1f03dfc: e2831002 add r1, r3, #2 + 1f03e00: e3a0e004 mov lr, #4 + 1f03e04: e083300e add r3, r3, lr + 1f03e08: e782e10c str lr, [r2, ip, lsl #2] + 1f03e0c: e5803000 str r3, [r0] + 1f03e10: e3a00000 mov r0, #0 + 1f03e14: e7820101 str r0, [r2, r1, lsl #2] + 1f03e18: eaffff1b b 1f03a8c + 1f03e1c: e2837002 add r7, r3, #2 + 1f03e20: e2831003 add r1, r3, #3 + 1f03e24: e3a0501c mov r5, #28 + 1f03e28: e782510c str r5, [r2, ip, lsl #2] + 1f03e2c: e3a0c000 mov ip, #0 + 1f03e30: e2834004 add r4, r3, #4 + 1f03e34: e782c107 str ip, [r2, r7, lsl #2] + 1f03e38: e2836005 add r6, r3, #5 + 1f03e3c: e2835006 add r5, r3, #6 + 1f03e40: e283c007 add ip, r3, #7 + 1f03e44: e59e7000 ldr r7, [lr] + 1f03e48: e7827101 str r7, [r2, r1, lsl #2] + 1f03e4c: e2831009 add r1, r3, #9 + 1f03e50: e59e7004 ldr r7, [lr, #4] + 1f03e54: e7827104 str r7, [r2, r4, lsl #2] + 1f03e58: e2834008 add r4, r3, #8 + 1f03e5c: e283300a add r3, r3, #10 + 1f03e60: e5803000 str r3, [r0] + 1f03e64: e59e7008 ldr r7, [lr, #8] + 1f03e68: e7827106 str r7, [r2, r6, lsl #2] + 1f03e6c: e59e600c ldr r6, [lr, #12] + 1f03e70: e7826105 str r6, [r2, r5, lsl #2] + 1f03e74: e59e5010 ldr r5, [lr, #16] + 1f03e78: e782510c str r5, [r2, ip, lsl #2] + 1f03e7c: e59e5014 ldr r5, [lr, #20] + 1f03e80: e59ec018 ldr ip, [lr, #24] + 1f03e84: e7825104 str r5, [r2, r4, lsl #2] + 1f03e88: e782c101 str ip, [r2, r1, lsl #2] + 1f03e8c: eafffefe b 1f03a8c + 1f03e90: e3a0e00a mov lr, #10 + 1f03e94: e340e004 movt lr, #4 + 1f03e98: e151000e cmp r1, lr + 1f03e9c: 1afffede bne 1f03a1c + 1f03ea0: e308400a movw r4, #32778 ; 0x800a + 1f03ea4: e3404004 movt r4, #4 + 1f03ea8: e1510004 cmp r1, r4 + 1f03eac: e283e002 add lr, r3, #2 + 1f03eb0: e3a01010 mov r1, #16 + 1f03eb4: e782110c str r1, [r2, ip, lsl #2] + 1f03eb8: e301cbd0 movw ip, #7120 ; 0x1bd0 + 1f03ebc: e340c1fb movt ip, #507 ; 0x1fb + 1f03ec0: e3a04000 mov r4, #0 + 1f03ec4: e3091bd0 movw r1, #39888 ; 0x9bd0 + 1f03ec8: e34011fa movt r1, #506 ; 0x1fa + 1f03ecc: e782410e str r4, [r2, lr, lsl #2] + 1f03ed0: e283e003 add lr, r3, #3 + 1f03ed4: 12833007 addne r3, r3, #7 + 1f03ed8: e580e000 str lr, [r0] + 1f03edc: 158c3000 strne r3, [ip] + 1f03ee0: 1afffee9 bne 1f03a8c + 1f03ee4: e59d0004 ldr r0, [sp, #4] + 1f03ee8: e2835004 add r5, r3, #4 + 1f03eec: e2834005 add r4, r3, #5 + 1f03ef0: e5906000 ldr r6, [r0] + 1f03ef4: e781610e str r6, [r1, lr, lsl #2] + 1f03ef8: e283e006 add lr, r3, #6 + 1f03efc: e2833007 add r3, r3, #7 + 1f03f00: e58c3000 str r3, [ip] + 1f03f04: e590c004 ldr ip, [r0, #4] + 1f03f08: e781c105 str ip, [r1, r5, lsl #2] + 1f03f0c: e590c008 ldr ip, [r0, #8] + 1f03f10: e781c104 str ip, [r1, r4, lsl #2] + 1f03f14: e590000c ldr r0, [r0, #12] + 1f03f18: e781010e str r0, [r1, lr, lsl #2] + 1f03f1c: eafffeda b 1f03a8c + 1f03f20: e283e002 add lr, r3, #2 + 1f03f24: e3084001 movw r4, #32769 ; 0x8001 + 1f03f28: e3404002 movt r4, #2 + 1f03f2c: e1510004 cmp r1, r4 + 1f03f30: e3a04000 mov r4, #0 + 1f03f34: e3a01008 mov r1, #8 + 1f03f38: e782110c str r1, [r2, ip, lsl #2] + 1f03f3c: e782410e str r4, [r2, lr, lsl #2] + 1f03f40: e2831003 add r1, r3, #3 + 1f03f44: 059de004 ldreq lr, [sp, #4] + 1f03f48: e309cbd0 movw ip, #39888 ; 0x9bd0 + 1f03f4c: e340c1fa movt ip, #506 ; 0x1fa + 1f03f50: 02834004 addeq r4, r3, #4 + 1f03f54: e5801000 str r1, [r0] + 1f03f58: 059e5000 ldreq r5, [lr] + 1f03f5c: 02833005 addeq r3, r3, #5 + 1f03f60: 078c5101 streq r5, [ip, r1, lsl #2] + 1f03f64: 12833005 addne r3, r3, #5 + 1f03f68: e2833001 add r3, r3, #1 + 1f03f6c: e5803000 str r3, [r0] + 1f03f70: 059e1004 ldreq r1, [lr, #4] + 1f03f74: 078c1104 streq r1, [ip, r4, lsl #2] + 1f03f78: eafffec3 b 1f03a8c + 1f03f7c: e308e009 movw lr, #32777 ; 0x8009 + 1f03f80: e340e004 movt lr, #4 + 1f03f84: e151000e cmp r1, lr + 1f03f88: 0affff72 beq 1f03d58 + 1f03f8c: eafffea2 b 1f03a1c + 1f03f90: e1a08005 mov r8, r5 + 1f03f94: e1a0900e mov r9, lr + 1f03f98: e1a03001 mov r3, r1 + 1f03f9c: eaffff12 b 1f03bec + 1f03fa0: e2483014 sub r3, r8, #20 + 1f03fa4: e08ec104 add ip, lr, r4, lsl #2 + 1f03fa8: e0823003 add r3, r2, r3 + 1f03fac: e49e1004 ldr r1, [lr], #4 + 1f03fb0: e5a31004 str r1, [r3, #4]! + 1f03fb4: e15e000c cmp lr, ip + 1f03fb8: 1afffffb bne 1f03fac + 1f03fbc: eaffff30 b 1f03c84 + 1f03fc0: e1a03005 mov r3, r5 + 1f03fc4: eafffeb0 b 1f03a8c + +01f03fc8 : + 1f03fc8: e3012bd0 movw r2, #7120 ; 0x1bd0 + 1f03fcc: e34021fb movt r2, #507 ; 0x1fb + 1f03fd0: e92d4010 push {r4, lr} + 1f03fd4: e5922000 ldr r2, [r2] + 1f03fd8: e3093bd0 movw r3, #39888 ; 0x9bd0 + 1f03fdc: e34031fa movt r3, #506 ; 0x1fa + 1f03fe0: e2822001 add r2, r2, #1 + 1f03fe4: e3a00008 mov r0, #8 + 1f03fe8: e1a01003 mov r1, r3 + 1f03fec: e3a0c000 mov ip, #0 + 1f03ff0: e1a02102 lsl r2, r2, #2 + 1f03ff4: e583c004 str ip, [r3, #4] + 1f03ff8: e5832000 str r2, [r3] + 1f03ffc: eb000034 bl 1f040d4 + 1f04000: e3a00008 mov r0, #8 + 1f04004: e8bd4010 pop {r4, lr} + 1f04008: ea00003c b 1f04100 + +01f0400c : + 1f0400c: e3012bd0 movw r2, #7120 ; 0x1bd0 + 1f04010: e34021fb movt r2, #507 ; 0x1fb + 1f04014: e3093bd0 movw r3, #39888 ; 0x9bd0 + 1f04018: e34031fa movt r3, #506 ; 0x1fa + 1f0401c: e3a0c000 mov ip, #0 + 1f04020: e1a01003 mov r1, r3 + 1f04024: e5922000 ldr r2, [r2] + 1f04028: e3a00008 mov r0, #8 + 1f0402c: e583c004 str ip, [r3, #4] + 1f04030: e2822001 add r2, r2, #1 + 1f04034: e1a02102 lsl r2, r2, #2 + 1f04038: e5832000 str r2, [r3] + 1f0403c: ea000024 b 1f040d4 + +01f04040 : + 1f04040: e3091bd0 movw r1, #39888 ; 0x9bd0 + 1f04044: e34011fa movt r1, #506 ; 0x1fa + 1f04048: e92d4010 push {r4, lr} + 1f0404c: e591c000 ldr ip, [r1] + 1f04050: e30947c4 movw r4, #38852 ; 0x97c4 + 1f04054: e34041fa movt r4, #506 ; 0x1fa + 1f04058: e1a0c14c asr ip, ip, #2 + 1f0405c: e35c0002 cmp ip, #2 + 1f04060: e5840000 str r0, [r4] + 1f04064: da00000e ble 1f040a4 + 1f04068: e5913008 ldr r3, [r1, #8] + 1f0406c: e1500003 cmp r0, r3 + 1f04070: e3a03002 mov r3, #2 + 1f04074: 0a00000c beq 1f040ac + 1f04078: e1a0e001 mov lr, r1 + 1f0407c: ea000002 b 1f0408c + 1f04080: e79e2103 ldr r2, [lr, r3, lsl #2] + 1f04084: e1500002 cmp r0, r2 + 1f04088: 0a000007 beq 1f040ac + 1f0408c: e2832001 add r2, r3, #1 + 1f04090: e7912102 ldr r2, [r1, r2, lsl #2] + 1f04094: e0833142 add r3, r3, r2, asr #2 + 1f04098: e2833003 add r3, r3, #3 + 1f0409c: e153000c cmp r3, ip + 1f040a0: bafffff6 blt 1f04080 + 1f040a4: e3a00000 mov r0, #0 + 1f040a8: e8bd8010 pop {r4, pc} + 1f040ac: e0813103 add r3, r1, r3, lsl #2 + 1f040b0: e30907cc movw r0, #38860 ; 0x97cc + 1f040b4: e34001fa movt r0, #506 ; 0x1fa + 1f040b8: e283100c add r1, r3, #12 + 1f040bc: e1d320b8 ldrh r2, [r3, #8] + 1f040c0: e5842004 str r2, [r4, #4] + 1f040c4: eb00eb4d bl 1f3ee00 + 1f040c8: e30907c4 movw r0, #38852 ; 0x97c4 + 1f040cc: e34001fa movt r0, #506 ; 0x1fa + 1f040d0: e8bd8010 pop {r4, pc} + +01f040d4 : + 1f040d4: e3c1100f bic r1, r1, #15 + 1f040d8: e3a0cb2e mov ip, #47104 ; 0xb800 + 1f040dc: e343cf00 movt ip, #16128 ; 0x3f00 + 1f040e0: e1800001 orr r0, r0, r1 + 1f040e4: e59c2098 ldr r2, [ip, #152] ; 0x98 + 1f040e8: e3a03b2e mov r3, #47104 ; 0xb800 + 1f040ec: e3433f00 movt r3, #16128 ; 0x3f00 + 1f040f0: e3520000 cmp r2, #0 + 1f040f4: bafffffa blt 1f040e4 + 1f040f8: e58300a0 str r0, [r3, #160] ; 0xa0 + 1f040fc: e12fff1e bx lr + +01f04100 : + 1f04100: e350000f cmp r0, #15 + 1f04104: 0a00000b beq 1f04138 + 1f04108: e3a02b2e mov r2, #47104 ; 0xb800 + 1f0410c: e3432f00 movt r2, #16128 ; 0x3f00 + 1f04110: e1a0c002 mov ip, r2 + 1f04114: e5923098 ldr r3, [r2, #152] ; 0x98 + 1f04118: e3130101 tst r3, #1073741824 ; 0x40000000 + 1f0411c: 1afffffc bne 1f04114 + 1f04120: e59c3080 ldr r3, [ip, #128] ; 0x80 + 1f04124: e203100f and r1, r3, #15 + 1f04128: e1510000 cmp r1, r0 + 1f0412c: 1afffff8 bne 1f04114 + 1f04130: e1a00243 asr r0, r3, #4 + 1f04134: e12fff1e bx lr + 1f04138: e3e00000 mvn r0, #0 + 1f0413c: e12fff1e bx lr + +01f04140 : + 1f04140: e92d4010 push {r4, lr} + 1f04144: e3a04b2e mov r4, #47104 ; 0xb800 + 1f04148: e3434f00 movt r4, #16128 ; 0x3f00 + 1f0414c: e5943098 ldr r3, [r4, #152] ; 0x98 + 1f04150: e3130101 tst r3, #1073741824 ; 0x40000000 + 1f04154: 18bd8010 popne {r4, pc} + 1f04158: e3a00014 mov r0, #20 + 1f0415c: e5943080 ldr r3, [r4, #128] ; 0x80 + 1f04160: ebfff485 bl 1f0137c + 1f04164: e5943098 ldr r3, [r4, #152] ; 0x98 + 1f04168: e3130101 tst r3, #1073741824 ; 0x40000000 + 1f0416c: 0afffff9 beq 1f04158 + 1f04170: e8bd8010 pop {r4, pc} + +01f04174 : + 1f04174: e30c2ccd movw r2, #52429 ; 0xcccd + 1f04178: e34c2ccc movt r2, #52428 ; 0xcccc + 1f0417c: e304c1cc movw ip, #16844 ; 0x41cc + 1f04180: e340c1f6 movt ip, #502 ; 0x1f6 + 1f04184: e0832290 umull r2, r3, r0, r2 + 1f04188: e92d4030 push {r4, r5, lr} + 1f0418c: e59ce000 ldr lr, [ip] + 1f04190: e1a0c1a3 lsr ip, r3, #3 + 1f04194: e24dd00c sub sp, sp, #12 + 1f04198: e3a05007 mov r5, #7 + 1f0419c: e1a0218c lsl r2, ip, #3 + 1f041a0: e6ef407c uxtb r4, ip + 1f041a4: e082208c add r2, r2, ip, lsl #1 + 1f041a8: e0620000 rsb r0, r2, r0 + 1f041ac: e79e3104 ldr r3, [lr, r4, lsl #2] + 1f041b0: e6ef0070 uxtb r0, r0 + 1f041b4: e58d3004 str r3, [sp, #4] + 1f041b8: e59d3004 ldr r3, [sp, #4] + 1f041bc: e0800080 add r0, r0, r0, lsl #1 + 1f041c0: e1c33015 bic r3, r3, r5, lsl r0 + 1f041c4: e58d3004 str r3, [sp, #4] + 1f041c8: e59d3004 ldr r3, [sp, #4] + 1f041cc: e1831011 orr r1, r3, r1, lsl r0 + 1f041d0: e58d1004 str r1, [sp, #4] + 1f041d4: e59d3004 ldr r3, [sp, #4] + 1f041d8: e78e3104 str r3, [lr, r4, lsl #2] + 1f041dc: e28dd00c add sp, sp, #12 + 1f041e0: e8bd8030 pop {r4, r5, pc} + +01f041e4 : + 1f041e4: e30c2ccd movw r2, #52429 ; 0xcccd + 1f041e8: e34c2ccc movt r2, #52428 ; 0xcccc + 1f041ec: e30411cc movw r1, #16844 ; 0x41cc + 1f041f0: e34011f6 movt r1, #502 ; 0x1f6 + 1f041f4: e0832290 umull r2, r3, r0, r2 + 1f041f8: e92d4030 push {r4, r5, lr} + 1f041fc: e591c000 ldr ip, [r1] + 1f04200: e1a011a3 lsr r1, r3, #3 + 1f04204: e24dd00c sub sp, sp, #12 + 1f04208: e3a05007 mov r5, #7 + 1f0420c: e1a02181 lsl r2, r1, #3 + 1f04210: e6ef4071 uxtb r4, r1 + 1f04214: e0822081 add r2, r2, r1, lsl #1 + 1f04218: e3a0e001 mov lr, #1 + 1f0421c: e0620000 rsb r0, r2, r0 + 1f04220: e79c3104 ldr r3, [ip, r4, lsl #2] + 1f04224: e6ef0070 uxtb r0, r0 + 1f04228: e58d3004 str r3, [sp, #4] + 1f0422c: e59d3004 ldr r3, [sp, #4] + 1f04230: e0800080 add r0, r0, r0, lsl #1 + 1f04234: e1c33015 bic r3, r3, r5, lsl r0 + 1f04238: e58d3004 str r3, [sp, #4] + 1f0423c: e59d3004 ldr r3, [sp, #4] + 1f04240: e183001e orr r0, r3, lr, lsl r0 + 1f04244: e58d0004 str r0, [sp, #4] + 1f04248: e59d3004 ldr r3, [sp, #4] + 1f0424c: e78c3104 str r3, [ip, r4, lsl #2] + 1f04250: e28dd00c add sp, sp, #12 + 1f04254: e8bd8030 pop {r4, r5, pc} + +01f04258 : + 1f04258: e30c2ccd movw r2, #52429 ; 0xcccd + 1f0425c: e34c2ccc movt r2, #52428 ; 0xcccc + 1f04260: e30411cc movw r1, #16844 ; 0x41cc + 1f04264: e34011f6 movt r1, #502 ; 0x1f6 + 1f04268: e0832290 umull r2, r3, r0, r2 + 1f0426c: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f04270: e1a021a3 lsr r2, r3, #3 + 1f04274: e5911000 ldr r1, [r1] + 1f04278: e24dd00c sub sp, sp, #12 + 1f0427c: e3a0e007 mov lr, #7 + 1f04280: e1a03182 lsl r3, r2, #3 + 1f04284: e6efc072 uxtb ip, r2 + 1f04288: e0833082 add r3, r3, r2, lsl #1 + 1f0428c: e0630000 rsb r0, r3, r0 + 1f04290: e791310c ldr r3, [r1, ip, lsl #2] + 1f04294: e6ef0070 uxtb r0, r0 + 1f04298: e58d3004 str r3, [sp, #4] + 1f0429c: e59d3004 ldr r3, [sp, #4] + 1f042a0: e0800080 add r0, r0, r0, lsl #1 + 1f042a4: e1c3001e bic r0, r3, lr, lsl r0 + 1f042a8: e58d0004 str r0, [sp, #4] + 1f042ac: e59d3004 ldr r3, [sp, #4] + 1f042b0: e58d3004 str r3, [sp, #4] + 1f042b4: e59d3004 ldr r3, [sp, #4] + 1f042b8: e781310c str r3, [r1, ip, lsl #2] + 1f042bc: e28dd00c add sp, sp, #12 + 1f042c0: e49df004 pop {pc} ; (ldr pc, [sp], #4) + +01f042c4 : + 1f042c4: e1b022a0 lsrs r2, r0, #5 + 1f042c8: 0a00000f beq 1f0430c + 1f042cc: e3520001 cmp r2, #1 + 1f042d0: 1a00000b bne 1f04304 + 1f042d4: e30431cc movw r3, #16844 ; 0x41cc + 1f042d8: e34031f6 movt r3, #502 ; 0x1f6 + 1f042dc: e2400020 sub r0, r0, #32 + 1f042e0: e5933000 ldr r3, [r3] + 1f042e4: e5933038 ldr r3, [r3, #56] ; 0x38 + 1f042e8: e0030012 and r0, r3, r2, lsl r0 + 1f042ec: e6ef0070 uxtb r0, r0 + 1f042f0: e3500004 cmp r0, #4 + 1f042f4: 012fff1e bxeq lr + 1f042f8: e2900000 adds r0, r0, #0 + 1f042fc: 13a00001 movne r0, #1 + 1f04300: e12fff1e bx lr + 1f04304: e3a00004 mov r0, #4 + 1f04308: e12fff1e bx lr + 1f0430c: e30431cc movw r3, #16844 ; 0x41cc + 1f04310: e34031f6 movt r3, #502 ; 0x1f6 + 1f04314: e3a02001 mov r2, #1 + 1f04318: e5933000 ldr r3, [r3] + 1f0431c: e5933034 ldr r3, [r3, #52] ; 0x34 + 1f04320: e0030012 and r0, r3, r2, lsl r0 + 1f04324: e6ef0070 uxtb r0, r0 + 1f04328: e3500004 cmp r0, #4 + 1f0432c: 1afffff1 bne 1f042f8 + 1f04330: e12fff1e bx lr + +01f04334 : + 1f04334: e1b022a0 lsrs r2, r0, #5 + 1f04338: 0a000016 beq 1f04398 + 1f0433c: e3520001 cmp r2, #1 + 1f04340: 1a00000a bne 1f04370 + 1f04344: e30431cc movw r3, #16844 ; 0x41cc + 1f04348: e34031f6 movt r3, #502 ; 0x1f6 + 1f0434c: e2400020 sub r0, r0, #32 + 1f04350: e5931000 ldr r1, [r3] + 1f04354: e1a00012 lsl r0, r2, r0 + 1f04358: e5913038 ldr r3, [r1, #56] ; 0x38 + 1f0435c: e0033000 and r3, r3, r0 + 1f04360: e31300ff tst r3, #255 ; 0xff + 1f04364: 0a000016 beq 1f043c4 + 1f04368: e581002c str r0, [r1, #44] ; 0x2c + 1f0436c: e12fff1e bx lr + 1f04370: e3520000 cmp r2, #0 + 1f04374: 0a000016 beq 1f043d4 + 1f04378: e3520001 cmp r2, #1 + 1f0437c: 112fff1e bxne lr + 1f04380: e30411cc movw r1, #16844 ; 0x41cc + 1f04384: e34011f6 movt r1, #502 ; 0x1f6 + 1f04388: e2403020 sub r3, r0, #32 + 1f0438c: e5911000 ldr r1, [r1] + 1f04390: e1a00312 lsl r0, r2, r3 + 1f04394: eafffff3 b 1f04368 + 1f04398: e30431cc movw r3, #16844 ; 0x41cc + 1f0439c: e34031f6 movt r3, #502 ; 0x1f6 + 1f043a0: e3a01001 mov r1, #1 + 1f043a4: e5932000 ldr r2, [r3] + 1f043a8: e1a00011 lsl r0, r1, r0 + 1f043ac: e5923034 ldr r3, [r2, #52] ; 0x34 + 1f043b0: e0033000 and r3, r3, r0 + 1f043b4: e31300ff tst r3, #255 ; 0xff + 1f043b8: 0a000003 beq 1f043cc + 1f043bc: e5820028 str r0, [r2, #40] ; 0x28 + 1f043c0: e12fff1e bx lr + 1f043c4: e5810020 str r0, [r1, #32] + 1f043c8: e12fff1e bx lr + 1f043cc: e582001c str r0, [r2, #28] + 1f043d0: e12fff1e bx lr + 1f043d4: e30431cc movw r3, #16844 ; 0x41cc + 1f043d8: e34031f6 movt r3, #502 ; 0x1f6 + 1f043dc: e3a01001 mov r1, #1 + 1f043e0: e5932000 ldr r2, [r3] + 1f043e4: e1a00011 lsl r0, r1, r0 + 1f043e8: eafffff3 b 1f043bc + +01f043ec : + 1f043ec: e1b032a0 lsrs r3, r0, #5 + 1f043f0: 0a000009 beq 1f0441c + 1f043f4: e3530001 cmp r3, #1 + 1f043f8: 1a000006 bne 1f04418 + 1f043fc: e30421cc movw r2, #16844 ; 0x41cc + 1f04400: e34021f6 movt r2, #502 ; 0x1f6 + 1f04404: e2400020 sub r0, r0, #32 + 1f04408: e5922000 ldr r2, [r2] + 1f0440c: e1a00013 lsl r0, r3, r0 + 1f04410: e5820020 str r0, [r2, #32] + 1f04414: e12fff1e bx lr + 1f04418: e12fff1e bx lr + 1f0441c: e30421cc movw r2, #16844 ; 0x41cc + 1f04420: e34021f6 movt r2, #502 ; 0x1f6 + 1f04424: e3a03001 mov r3, #1 + 1f04428: e5922000 ldr r2, [r2] + 1f0442c: e1a00013 lsl r0, r3, r0 + 1f04430: e582001c str r0, [r2, #28] + 1f04434: e12fff1e bx lr + +01f04438 : + 1f04438: e1b032a0 lsrs r3, r0, #5 + 1f0443c: 0a000009 beq 1f04468 + 1f04440: e3530001 cmp r3, #1 + 1f04444: 1a000006 bne 1f04464 + 1f04448: e30421cc movw r2, #16844 ; 0x41cc + 1f0444c: e34021f6 movt r2, #502 ; 0x1f6 + 1f04450: e2400020 sub r0, r0, #32 + 1f04454: e5922000 ldr r2, [r2] + 1f04458: e1a00013 lsl r0, r3, r0 + 1f0445c: e582002c str r0, [r2, #44] ; 0x2c + 1f04460: e12fff1e bx lr + 1f04464: e12fff1e bx lr + 1f04468: e30421cc movw r2, #16844 ; 0x41cc + 1f0446c: e34021f6 movt r2, #502 ; 0x1f6 + 1f04470: e3a03001 mov r3, #1 + 1f04474: e5922000 ldr r2, [r2] + 1f04478: e1a00013 lsl r0, r3, r0 + 1f0447c: e5820028 str r0, [r2, #40] ; 0x28 + 1f04480: e12fff1e bx lr + +01f04484 : + 1f04484: e3510003 cmp r1, #3 + 1f04488: 13510000 cmpne r1, #0 + 1f0448c: 0a000007 beq 1f044b0 + 1f04490: e2413001 sub r3, r1, #1 + 1f04494: e3530001 cmp r3, #1 + 1f04498: 812fff1e bxhi lr + 1f0449c: e1b032a0 lsrs r3, r0, #5 + 1f044a0: 0a00001c beq 1f04518 + 1f044a4: e3530001 cmp r3, #1 + 1f044a8: 0a000013 beq 1f044fc + 1f044ac: e12fff1e bx lr + 1f044b0: e1b032a0 lsrs r3, r0, #5 + 1f044b4: 0a000002 beq 1f044c4 + 1f044b8: e3530001 cmp r3, #1 + 1f044bc: 0a000007 beq 1f044e0 + 1f044c0: e12fff1e bx lr + 1f044c4: e30421cc movw r2, #16844 ; 0x41cc + 1f044c8: e34021f6 movt r2, #502 ; 0x1f6 + 1f044cc: e3a03001 mov r3, #1 + 1f044d0: e5922000 ldr r2, [r2] + 1f044d4: e1a00013 lsl r0, r3, r0 + 1f044d8: e5820028 str r0, [r2, #40] ; 0x28 + 1f044dc: e12fff1e bx lr + 1f044e0: e30421cc movw r2, #16844 ; 0x41cc + 1f044e4: e34021f6 movt r2, #502 ; 0x1f6 + 1f044e8: e2400020 sub r0, r0, #32 + 1f044ec: e5922000 ldr r2, [r2] + 1f044f0: e1a00013 lsl r0, r3, r0 + 1f044f4: e582002c str r0, [r2, #44] ; 0x2c + 1f044f8: e12fff1e bx lr + 1f044fc: e30421cc movw r2, #16844 ; 0x41cc + 1f04500: e34021f6 movt r2, #502 ; 0x1f6 + 1f04504: e2400020 sub r0, r0, #32 + 1f04508: e5922000 ldr r2, [r2] + 1f0450c: e1a00013 lsl r0, r3, r0 + 1f04510: e5820020 str r0, [r2, #32] + 1f04514: e12fff1e bx lr + 1f04518: e30421cc movw r2, #16844 ; 0x41cc + 1f0451c: e34021f6 movt r2, #502 ; 0x1f6 + 1f04520: e3a03001 mov r3, #1 + 1f04524: e5922000 ldr r2, [r2] + 1f04528: e1a00013 lsl r0, r3, r0 + 1f0452c: e582001c str r0, [r2, #28] + 1f04530: e12fff1e bx lr + +01f04534 : + 1f04534: e30f3fb4 movw r3, #65460 ; 0xffb4 + 1f04538: e34c30df movt r3, #49375 ; 0xc0df + 1f0453c: e3a02001 mov r2, #1 + 1f04540: e0813003 add r3, r1, r3 + 1f04544: e1a012a0 lsr r1, r0, #5 + 1f04548: e1a00012 lsl r0, r2, r0 + 1f0454c: e353003c cmp r3, #60 ; 0x3c + 1f04550: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f04554: ea000043 b 1f04668 + 1f04558: 01f0466c .word 0x01f0466c + 1f0455c: 01f04668 .word 0x01f04668 + 1f04560: 01f04668 .word 0x01f04668 + 1f04564: 01f04668 .word 0x01f04668 + 1f04568: 01f04668 .word 0x01f04668 + 1f0456c: 01f04668 .word 0x01f04668 + 1f04570: 01f04668 .word 0x01f04668 + 1f04574: 01f04668 .word 0x01f04668 + 1f04578: 01f04668 .word 0x01f04668 + 1f0457c: 01f04668 .word 0x01f04668 + 1f04580: 01f04668 .word 0x01f04668 + 1f04584: 01f04668 .word 0x01f04668 + 1f04588: 01f0468c .word 0x01f0468c + 1f0458c: 01f04668 .word 0x01f04668 + 1f04590: 01f04668 .word 0x01f04668 + 1f04594: 01f04668 .word 0x01f04668 + 1f04598: 01f04668 .word 0x01f04668 + 1f0459c: 01f04668 .word 0x01f04668 + 1f045a0: 01f04668 .word 0x01f04668 + 1f045a4: 01f04668 .word 0x01f04668 + 1f045a8: 01f04668 .word 0x01f04668 + 1f045ac: 01f04668 .word 0x01f04668 + 1f045b0: 01f04668 .word 0x01f04668 + 1f045b4: 01f04668 .word 0x01f04668 + 1f045b8: 01f046ac .word 0x01f046ac + 1f045bc: 01f04668 .word 0x01f04668 + 1f045c0: 01f04668 .word 0x01f04668 + 1f045c4: 01f04668 .word 0x01f04668 + 1f045c8: 01f04668 .word 0x01f04668 + 1f045cc: 01f04668 .word 0x01f04668 + 1f045d0: 01f04668 .word 0x01f04668 + 1f045d4: 01f04668 .word 0x01f04668 + 1f045d8: 01f04668 .word 0x01f04668 + 1f045dc: 01f04668 .word 0x01f04668 + 1f045e0: 01f04668 .word 0x01f04668 + 1f045e4: 01f04668 .word 0x01f04668 + 1f045e8: 01f046cc .word 0x01f046cc + 1f045ec: 01f04668 .word 0x01f04668 + 1f045f0: 01f04668 .word 0x01f04668 + 1f045f4: 01f04668 .word 0x01f04668 + 1f045f8: 01f04668 .word 0x01f04668 + 1f045fc: 01f04668 .word 0x01f04668 + 1f04600: 01f04668 .word 0x01f04668 + 1f04604: 01f04668 .word 0x01f04668 + 1f04608: 01f04668 .word 0x01f04668 + 1f0460c: 01f04668 .word 0x01f04668 + 1f04610: 01f04668 .word 0x01f04668 + 1f04614: 01f04668 .word 0x01f04668 + 1f04618: 01f046ec .word 0x01f046ec + 1f0461c: 01f04668 .word 0x01f04668 + 1f04620: 01f04668 .word 0x01f04668 + 1f04624: 01f04668 .word 0x01f04668 + 1f04628: 01f04668 .word 0x01f04668 + 1f0462c: 01f04668 .word 0x01f04668 + 1f04630: 01f04668 .word 0x01f04668 + 1f04634: 01f04668 .word 0x01f04668 + 1f04638: 01f04668 .word 0x01f04668 + 1f0463c: 01f04668 .word 0x01f04668 + 1f04640: 01f04668 .word 0x01f04668 + 1f04644: 01f04668 .word 0x01f04668 + 1f04648: 01f0464c .word 0x01f0464c + 1f0464c: e30431cc movw r3, #16844 ; 0x41cc + 1f04650: e34031f6 movt r3, #502 ; 0x1f6 + 1f04654: e5933000 ldr r3, [r3] + 1f04658: e0831101 add r1, r3, r1, lsl #2 + 1f0465c: e5912088 ldr r2, [r1, #136] ; 0x88 + 1f04660: e1800002 orr r0, r0, r2 + 1f04664: e5810088 str r0, [r1, #136] ; 0x88 + 1f04668: e12fff1e bx lr + 1f0466c: e30431cc movw r3, #16844 ; 0x41cc + 1f04670: e34031f6 movt r3, #502 ; 0x1f6 + 1f04674: e5933000 ldr r3, [r3] + 1f04678: e0831101 add r1, r3, r1, lsl #2 + 1f0467c: e591204c ldr r2, [r1, #76] ; 0x4c + 1f04680: e1800002 orr r0, r0, r2 + 1f04684: e581004c str r0, [r1, #76] ; 0x4c + 1f04688: e12fff1e bx lr + 1f0468c: e30431cc movw r3, #16844 ; 0x41cc + 1f04690: e34031f6 movt r3, #502 ; 0x1f6 + 1f04694: e5933000 ldr r3, [r3] + 1f04698: e0831101 add r1, r3, r1, lsl #2 + 1f0469c: e5912058 ldr r2, [r1, #88] ; 0x58 + 1f046a0: e1800002 orr r0, r0, r2 + 1f046a4: e5810058 str r0, [r1, #88] ; 0x58 + 1f046a8: e12fff1e bx lr + 1f046ac: e30431cc movw r3, #16844 ; 0x41cc + 1f046b0: e34031f6 movt r3, #502 ; 0x1f6 + 1f046b4: e5933000 ldr r3, [r3] + 1f046b8: e0831101 add r1, r3, r1, lsl #2 + 1f046bc: e5912064 ldr r2, [r1, #100] ; 0x64 + 1f046c0: e1800002 orr r0, r0, r2 + 1f046c4: e5810064 str r0, [r1, #100] ; 0x64 + 1f046c8: e12fff1e bx lr + 1f046cc: e30431cc movw r3, #16844 ; 0x41cc + 1f046d0: e34031f6 movt r3, #502 ; 0x1f6 + 1f046d4: e5933000 ldr r3, [r3] + 1f046d8: e0831101 add r1, r3, r1, lsl #2 + 1f046dc: e5912070 ldr r2, [r1, #112] ; 0x70 + 1f046e0: e1800002 orr r0, r0, r2 + 1f046e4: e5810070 str r0, [r1, #112] ; 0x70 + 1f046e8: e12fff1e bx lr + 1f046ec: e30431cc movw r3, #16844 ; 0x41cc + 1f046f0: e34031f6 movt r3, #502 ; 0x1f6 + 1f046f4: e5933000 ldr r3, [r3] + 1f046f8: e0831101 add r1, r3, r1, lsl #2 + 1f046fc: e591207c ldr r2, [r1, #124] ; 0x7c + 1f04700: e1800002 orr r0, r0, r2 + 1f04704: e581007c str r0, [r1, #124] ; 0x7c + 1f04708: e12fff1e bx lr + +01f0470c : + 1f0470c: e200201f and r2, r0, #31 + 1f04710: e3a0c001 mov ip, #1 + 1f04714: e30f3fb4 movw r3, #65460 ; 0xffb4 + 1f04718: e34c30df movt r3, #49375 ; 0xc0df + 1f0471c: e0813003 add r3, r1, r3 + 1f04720: e1a002a0 lsr r0, r0, #5 + 1f04724: e1e0221c mvn r2, ip, lsl r2 + 1f04728: e353003c cmp r3, #60 ; 0x3c + 1f0472c: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f04730: ea000043 b 1f04844 + 1f04734: 01f04848 .word 0x01f04848 + 1f04738: 01f04844 .word 0x01f04844 + 1f0473c: 01f04844 .word 0x01f04844 + 1f04740: 01f04844 .word 0x01f04844 + 1f04744: 01f04844 .word 0x01f04844 + 1f04748: 01f04844 .word 0x01f04844 + 1f0474c: 01f04844 .word 0x01f04844 + 1f04750: 01f04844 .word 0x01f04844 + 1f04754: 01f04844 .word 0x01f04844 + 1f04758: 01f04844 .word 0x01f04844 + 1f0475c: 01f04844 .word 0x01f04844 + 1f04760: 01f04844 .word 0x01f04844 + 1f04764: 01f04868 .word 0x01f04868 + 1f04768: 01f04844 .word 0x01f04844 + 1f0476c: 01f04844 .word 0x01f04844 + 1f04770: 01f04844 .word 0x01f04844 + 1f04774: 01f04844 .word 0x01f04844 + 1f04778: 01f04844 .word 0x01f04844 + 1f0477c: 01f04844 .word 0x01f04844 + 1f04780: 01f04844 .word 0x01f04844 + 1f04784: 01f04844 .word 0x01f04844 + 1f04788: 01f04844 .word 0x01f04844 + 1f0478c: 01f04844 .word 0x01f04844 + 1f04790: 01f04844 .word 0x01f04844 + 1f04794: 01f04888 .word 0x01f04888 + 1f04798: 01f04844 .word 0x01f04844 + 1f0479c: 01f04844 .word 0x01f04844 + 1f047a0: 01f04844 .word 0x01f04844 + 1f047a4: 01f04844 .word 0x01f04844 + 1f047a8: 01f04844 .word 0x01f04844 + 1f047ac: 01f04844 .word 0x01f04844 + 1f047b0: 01f04844 .word 0x01f04844 + 1f047b4: 01f04844 .word 0x01f04844 + 1f047b8: 01f04844 .word 0x01f04844 + 1f047bc: 01f04844 .word 0x01f04844 + 1f047c0: 01f04844 .word 0x01f04844 + 1f047c4: 01f048a8 .word 0x01f048a8 + 1f047c8: 01f04844 .word 0x01f04844 + 1f047cc: 01f04844 .word 0x01f04844 + 1f047d0: 01f04844 .word 0x01f04844 + 1f047d4: 01f04844 .word 0x01f04844 + 1f047d8: 01f04844 .word 0x01f04844 + 1f047dc: 01f04844 .word 0x01f04844 + 1f047e0: 01f04844 .word 0x01f04844 + 1f047e4: 01f04844 .word 0x01f04844 + 1f047e8: 01f04844 .word 0x01f04844 + 1f047ec: 01f04844 .word 0x01f04844 + 1f047f0: 01f04844 .word 0x01f04844 + 1f047f4: 01f048c8 .word 0x01f048c8 + 1f047f8: 01f04844 .word 0x01f04844 + 1f047fc: 01f04844 .word 0x01f04844 + 1f04800: 01f04844 .word 0x01f04844 + 1f04804: 01f04844 .word 0x01f04844 + 1f04808: 01f04844 .word 0x01f04844 + 1f0480c: 01f04844 .word 0x01f04844 + 1f04810: 01f04844 .word 0x01f04844 + 1f04814: 01f04844 .word 0x01f04844 + 1f04818: 01f04844 .word 0x01f04844 + 1f0481c: 01f04844 .word 0x01f04844 + 1f04820: 01f04844 .word 0x01f04844 + 1f04824: 01f04828 .word 0x01f04828 + 1f04828: e30431cc movw r3, #16844 ; 0x41cc + 1f0482c: e34031f6 movt r3, #502 ; 0x1f6 + 1f04830: e5933000 ldr r3, [r3] + 1f04834: e0830100 add r0, r3, r0, lsl #2 + 1f04838: e590c088 ldr ip, [r0, #136] ; 0x88 + 1f0483c: e002200c and r2, r2, ip + 1f04840: e5802088 str r2, [r0, #136] ; 0x88 + 1f04844: e12fff1e bx lr + 1f04848: e30431cc movw r3, #16844 ; 0x41cc + 1f0484c: e34031f6 movt r3, #502 ; 0x1f6 + 1f04850: e5933000 ldr r3, [r3] + 1f04854: e0830100 add r0, r3, r0, lsl #2 + 1f04858: e590c04c ldr ip, [r0, #76] ; 0x4c + 1f0485c: e002200c and r2, r2, ip + 1f04860: e580204c str r2, [r0, #76] ; 0x4c + 1f04864: e12fff1e bx lr + 1f04868: e30431cc movw r3, #16844 ; 0x41cc + 1f0486c: e34031f6 movt r3, #502 ; 0x1f6 + 1f04870: e5933000 ldr r3, [r3] + 1f04874: e0830100 add r0, r3, r0, lsl #2 + 1f04878: e590c058 ldr ip, [r0, #88] ; 0x58 + 1f0487c: e002200c and r2, r2, ip + 1f04880: e5802058 str r2, [r0, #88] ; 0x58 + 1f04884: e12fff1e bx lr + 1f04888: e30431cc movw r3, #16844 ; 0x41cc + 1f0488c: e34031f6 movt r3, #502 ; 0x1f6 + 1f04890: e5933000 ldr r3, [r3] + 1f04894: e0830100 add r0, r3, r0, lsl #2 + 1f04898: e590c064 ldr ip, [r0, #100] ; 0x64 + 1f0489c: e002200c and r2, r2, ip + 1f048a0: e5802064 str r2, [r0, #100] ; 0x64 + 1f048a4: e12fff1e bx lr + 1f048a8: e30431cc movw r3, #16844 ; 0x41cc + 1f048ac: e34031f6 movt r3, #502 ; 0x1f6 + 1f048b0: e5933000 ldr r3, [r3] + 1f048b4: e0830100 add r0, r3, r0, lsl #2 + 1f048b8: e590c070 ldr ip, [r0, #112] ; 0x70 + 1f048bc: e002200c and r2, r2, ip + 1f048c0: e5802070 str r2, [r0, #112] ; 0x70 + 1f048c4: e12fff1e bx lr + 1f048c8: e30431cc movw r3, #16844 ; 0x41cc + 1f048cc: e34031f6 movt r3, #502 ; 0x1f6 + 1f048d0: e5933000 ldr r3, [r3] + 1f048d4: e0830100 add r0, r3, r0, lsl #2 + 1f048d8: e590c07c ldr ip, [r0, #124] ; 0x7c + 1f048dc: e002200c and r2, r2, ip + 1f048e0: e580207c str r2, [r0, #124] ; 0x7c + 1f048e4: e12fff1e bx lr + +01f048e8 : + 1f048e8: e30411cc movw r1, #16844 ; 0x41cc + 1f048ec: e34011f6 movt r1, #502 ; 0x1f6 + 1f048f0: e200c01f and ip, r0, #31 + 1f048f4: e1a002a0 lsr r0, r0, #5 + 1f048f8: e3a02001 mov r2, #1 + 1f048fc: e5913000 ldr r3, [r1] + 1f04900: e1e02c12 mvn r2, r2, lsl ip + 1f04904: e0830100 add r0, r3, r0, lsl #2 + 1f04908: e5903040 ldr r3, [r0, #64] ; 0x40 + 1f0490c: e1823003 orr r3, r2, r3 + 1f04910: e5803040 str r3, [r0, #64] ; 0x40 + 1f04914: e12fff1e bx lr + +01f04918 : + 1f04918: e3013bd4 movw r3, #7124 ; 0x1bd4 + 1f0491c: e34031fb movt r3, #507 ; 0x1fb + 1f04920: e5932000 ldr r2, [r3] + 1f04924: e3520000 cmp r2, #0 + 1f04928: 012fff1e bxeq lr + 1f0492c: e301cbe0 movw ip, #7136 ; 0x1be0 + 1f04930: e340c1fb movt ip, #507 ; 0x1fb + 1f04934: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f04938: e59c2000 ldr r2, [ip] + 1f0493c: e1a0e822 lsr lr, r2, #16 + 1f04940: e6ff2072 uxth r2, r2 + 1f04944: e062100e rsb r1, r2, lr + 1f04948: e6bf1071 sxth r1, r1 + 1f0494c: e3510000 cmp r1, #0 + 1f04950: c3a01001 movgt r1, #1 + 1f04954: d3a01000 movle r1, #0 + 1f04958: e1500001 cmp r0, r1 + 1f0495c: 049df004 popeq {pc} ; (ldreq pc, [sp], #4) + 1f04960: e3500000 cmp r0, #0 + 1f04964: 128ee001 addne lr, lr, #1 + 1f04968: 02821001 addeq r1, r2, #1 + 1f0496c: 16ffe07e uxthne lr, lr + 1f04970: 06ff2071 uxtheq r2, r1 + 1f04974: e182280e orr r2, r2, lr, lsl #16 + 1f04978: e58c2000 str r2, [ip] + 1f0497c: f57ff05f dmb sy + 1f04980: e5933000 ldr r3, [r3] + 1f04984: e59c2000 ldr r2, [ip] + 1f04988: e5832000 str r2, [r3] + 1f0498c: e49df004 pop {pc} ; (ldr pc, [sp], #4) + +01f04990 : + 1f04990: e92d4010 push {r4, lr} + 1f04994: ebfffbe9 bl 1f03940 + 1f04998: e3a0000f mov r0, #15 + 1f0499c: e3400004 movt r0, #4 + 1f049a0: ebfffbf2 bl 1f03970 + 1f049a4: ebfffd87 bl 1f03fc8 + 1f049a8: e3a0000f mov r0, #15 + 1f049ac: e3400004 movt r0, #4 + 1f049b0: ebfffda2 bl 1f04040 + 1f049b4: e3500000 cmp r0, #0 + 1f049b8: e3013bd8 movw r3, #7128 ; 0x1bd8 + 1f049bc: e34031fb movt r3, #507 ; 0x1fb + 1f049c0: 15902008 ldrne r2, [r0, #8] + 1f049c4: 05830000 streq r0, [r3] + 1f049c8: 13c22103 bicne r2, r2, #-1073741824 ; 0xc0000000 + 1f049cc: 15832000 strne r2, [r3] + 1f049d0: e8bd8010 pop {r4, pc} + +01f049d4 : + 1f049d4: e3013bd8 movw r3, #7128 ; 0x1bd8 + 1f049d8: e34031fb movt r3, #507 ; 0x1fb + 1f049dc: e3a0200b mov r2, #11 + 1f049e0: e5933000 ldr r3, [r3] + 1f049e4: e5c32002 strb r2, [r3, #2] + 1f049e8: e12fff1e bx lr + +01f049ec : + 1f049ec: e3013bd4 movw r3, #7124 ; 0x1bd4 + 1f049f0: e34031fb movt r3, #507 ; 0x1fb + 1f049f4: e5930000 ldr r0, [r3] + 1f049f8: e12fff1e bx lr + +01f049fc : + 1f049fc: e92d4010 push {r4, lr} + 1f04a00: ebfffbce bl 1f03940 + 1f04a04: e3a00010 mov r0, #16 + 1f04a08: e3400004 movt r0, #4 + 1f04a0c: ebfffbd7 bl 1f03970 + 1f04a10: ebfffd6c bl 1f03fc8 + 1f04a14: e3a00010 mov r0, #16 + 1f04a18: e3400004 movt r0, #4 + 1f04a1c: ebfffd87 bl 1f04040 + 1f04a20: e3500000 cmp r0, #0 + 1f04a24: e3013bd4 movw r3, #7124 ; 0x1bd4 + 1f04a28: e34031fb movt r3, #507 ; 0x1fb + 1f04a2c: 15902008 ldrne r2, [r0, #8] + 1f04a30: 05830000 streq r0, [r3] + 1f04a34: 13c22103 bicne r2, r2, #-1073741824 ; 0xc0000000 + 1f04a38: 15832000 strne r2, [r3] + 1f04a3c: e8bd8010 pop {r4, pc} + +01f04a40 : + 1f04a40: e3011bd4 movw r1, #7124 ; 0x1bd4 + 1f04a44: e34011fb movt r1, #507 ; 0x1fb + 1f04a48: e5913000 ldr r3, [r1] + 1f04a4c: e3530000 cmp r3, #0 + 1f04a50: 012fff1e bxeq lr + 1f04a54: e301cbe0 movw ip, #7136 ; 0x1be0 + 1f04a58: e340c1fb movt ip, #507 ; 0x1fb + 1f04a5c: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f04a60: e59c3000 ldr r3, [ip] + 1f04a64: e1a0e823 lsr lr, r3, #16 + 1f04a68: e6ff3073 uxth r3, r3 + 1f04a6c: e063200e rsb r2, r3, lr + 1f04a70: e6bf2072 sxth r2, r2 + 1f04a74: e3520000 cmp r2, #0 + 1f04a78: c3a02001 movgt r2, #1 + 1f04a7c: d3a02000 movle r2, #0 + 1f04a80: e1500002 cmp r0, r2 + 1f04a84: 049df004 popeq {pc} ; (ldreq pc, [sp], #4) + 1f04a88: e3500000 cmp r0, #0 + 1f04a8c: 128ee001 addne lr, lr, #1 + 1f04a90: 02832001 addeq r2, r3, #1 + 1f04a94: 16ffe07e uxthne lr, lr + 1f04a98: 06ff3072 uxtheq r3, r2 + 1f04a9c: e183380e orr r3, r3, lr, lsl #16 + 1f04aa0: e58c3000 str r3, [ip] + 1f04aa4: f57ff05f dmb sy + 1f04aa8: e5913000 ldr r3, [r1] + 1f04aac: e59c2000 ldr r2, [ip] + 1f04ab0: e5832000 str r2, [r3] + 1f04ab4: e49df004 pop {pc} ; (ldr pc, [sp], #4) + +01f04ab8 : + 1f04ab8: e3a00cb2 mov r0, #45568 ; 0xb200 + 1f04abc: e3430f00 movt r0, #16128 ; 0x3f00 + 1f04ac0: e12fff1e bx lr + +01f04ac4 : + 1f04ac4: e3a02000 mov r2, #0 + 1f04ac8: e1a03302 lsl r3, r2, #6 + 1f04acc: ee073f56 mcr 15, 0, r3, cr7, cr6, {2} + 1f04ad0: e3831101 orr r1, r3, #1073741824 ; 0x40000000 + 1f04ad4: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04ad8: e3831102 orr r1, r3, #-2147483648 ; 0x80000000 + 1f04adc: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04ae0: e3833103 orr r3, r3, #-1073741824 ; 0xc0000000 + 1f04ae4: ee073f56 mcr 15, 0, r3, cr7, cr6, {2} + 1f04ae8: e2822001 add r2, r2, #1 + 1f04aec: e3520080 cmp r2, #128 ; 0x80 + 1f04af0: 1afffff4 bne 1f04ac8 + 1f04af4: e3a02000 mov r2, #0 + 1f04af8: e1a03302 lsl r3, r2, #6 + 1f04afc: e3831002 orr r1, r3, #2 + 1f04b00: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04b04: e3831221 orr r1, r3, #268435458 ; 0x10000002 + 1f04b08: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04b0c: e3831222 orr r1, r3, #536870914 ; 0x20000002 + 1f04b10: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04b14: e3831223 orr r1, r3, #805306370 ; 0x30000002 + 1f04b18: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04b1c: e3831109 orr r1, r3, #1073741826 ; 0x40000002 + 1f04b20: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04b24: e3831225 orr r1, r3, #1342177282 ; 0x50000002 + 1f04b28: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04b2c: e3831226 orr r1, r3, #1610612738 ; 0x60000002 + 1f04b30: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04b34: e3831227 orr r1, r3, #1879048194 ; 0x70000002 + 1f04b38: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04b3c: e383110a orr r1, r3, #-2147483646 ; 0x80000002 + 1f04b40: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04b44: e3831229 orr r1, r3, #-1879048190 ; 0x90000002 + 1f04b48: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04b4c: e383122a orr r1, r3, #-1610612734 ; 0xa0000002 + 1f04b50: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04b54: e383122b orr r1, r3, #-1342177278 ; 0xb0000002 + 1f04b58: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04b5c: e383110b orr r1, r3, #-1073741822 ; 0xc0000002 + 1f04b60: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04b64: e383122d orr r1, r3, #-805306366 ; 0xd0000002 + 1f04b68: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04b6c: e383122e orr r1, r3, #-536870910 ; 0xe0000002 + 1f04b70: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04b74: e383322f orr r3, r3, #-268435454 ; 0xf0000002 + 1f04b78: ee073f56 mcr 15, 0, r3, cr7, cr6, {2} + 1f04b7c: e2822001 add r2, r2, #1 + 1f04b80: e3520c02 cmp r2, #512 ; 0x200 + 1f04b84: 1affffdb bne 1f04af8 + 1f04b88: e12fff1e bx lr + +01f04b8c : + 1f04b8c: e3a02000 mov r2, #0 + 1f04b90: e1a03302 lsl r3, r2, #6 + 1f04b94: ee073f5a mcr 15, 0, r3, cr7, cr10, {2} + 1f04b98: e3831101 orr r1, r3, #1073741824 ; 0x40000000 + 1f04b9c: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04ba0: e3831102 orr r1, r3, #-2147483648 ; 0x80000000 + 1f04ba4: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04ba8: e3833103 orr r3, r3, #-1073741824 ; 0xc0000000 + 1f04bac: ee073f5a mcr 15, 0, r3, cr7, cr10, {2} + 1f04bb0: e2822001 add r2, r2, #1 + 1f04bb4: e3520080 cmp r2, #128 ; 0x80 + 1f04bb8: 1afffff4 bne 1f04b90 + 1f04bbc: e3a02000 mov r2, #0 + 1f04bc0: e1a03302 lsl r3, r2, #6 + 1f04bc4: e3831002 orr r1, r3, #2 + 1f04bc8: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04bcc: e3831221 orr r1, r3, #268435458 ; 0x10000002 + 1f04bd0: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04bd4: e3831222 orr r1, r3, #536870914 ; 0x20000002 + 1f04bd8: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04bdc: e3831223 orr r1, r3, #805306370 ; 0x30000002 + 1f04be0: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04be4: e3831109 orr r1, r3, #1073741826 ; 0x40000002 + 1f04be8: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04bec: e3831225 orr r1, r3, #1342177282 ; 0x50000002 + 1f04bf0: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04bf4: e3831226 orr r1, r3, #1610612738 ; 0x60000002 + 1f04bf8: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04bfc: e3831227 orr r1, r3, #1879048194 ; 0x70000002 + 1f04c00: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04c04: e383110a orr r1, r3, #-2147483646 ; 0x80000002 + 1f04c08: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04c0c: e3831229 orr r1, r3, #-1879048190 ; 0x90000002 + 1f04c10: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04c14: e383122a orr r1, r3, #-1610612734 ; 0xa0000002 + 1f04c18: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04c1c: e383122b orr r1, r3, #-1342177278 ; 0xb0000002 + 1f04c20: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04c24: e383110b orr r1, r3, #-1073741822 ; 0xc0000002 + 1f04c28: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04c2c: e383122d orr r1, r3, #-805306366 ; 0xd0000002 + 1f04c30: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04c34: e383122e orr r1, r3, #-536870910 ; 0xe0000002 + 1f04c38: ee071f5a mcr 15, 0, r1, cr7, cr10, {2} + 1f04c3c: e383322f orr r3, r3, #-268435454 ; 0xf0000002 + 1f04c40: ee073f5a mcr 15, 0, r3, cr7, cr10, {2} + 1f04c44: e2822001 add r2, r2, #1 + 1f04c48: e3520c02 cmp r2, #512 ; 0x200 + 1f04c4c: 1affffdb bne 1f04bc0 + 1f04c50: e12fff1e bx lr + +01f04c54 : + 1f04c54: e92d4070 push {r4, r5, r6, lr} + 1f04c58: e1a04000 mov r4, r0 + 1f04c5c: e1a00600 lsl r0, r0, #12 + 1f04c60: e1a05001 mov r5, r1 + 1f04c64: ebffed88 bl 1f0028c <_invalidate_dtlb_mva> + 1f04c68: e3003000 movw r3, #0 + 1f04c6c: e340320e movt r3, #526 ; 0x20e + 1f04c70: e3002176 movw r2, #374 ; 0x176 + 1f04c74: e1821605 orr r1, r2, r5, lsl #12 + 1f04c78: e7831104 str r1, [r3, r4, lsl #2] + 1f04c7c: e8bd8070 pop {r4, r5, r6, pc} + +01f04c80 : + 1f04c80: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f04c84: e3a02000 mov r2, #0 + 1f04c88: e3045000 movw r5, #16384 ; 0x4000 + 1f04c8c: e340520e movt r5, #526 ; 0x20e + 1f04c90: e1a03a02 lsl r3, r2, #20 + 1f04c94: e3833b57 orr r3, r3, #89088 ; 0x15c00 + 1f04c98: e3833006 orr r3, r3, #6 + 1f04c9c: e7853102 str r3, [r5, r2, lsl #2] + 1f04ca0: e2822001 add r2, r2, #1 + 1f04ca4: e3520040 cmp r2, #64 ; 0x40 + 1f04ca8: 1afffff8 bne 1f04c90 + 1f04cac: e1a03a02 lsl r3, r2, #20 + 1f04cb0: e3833b57 orr r3, r3, #89088 ; 0x15c00 + 1f04cb4: e3833002 orr r3, r3, #2 + 1f04cb8: e7853102 str r3, [r5, r2, lsl #2] + 1f04cbc: e2822001 add r2, r2, #1 + 1f04cc0: e3520080 cmp r2, #128 ; 0x80 + 1f04cc4: 1afffff8 bne 1f04cac + 1f04cc8: e1a03a02 lsl r3, r2, #20 + 1f04ccc: e3833b07 orr r3, r3, #7168 ; 0x1c00 + 1f04cd0: e3833002 orr r3, r3, #2 + 1f04cd4: e7853102 str r3, [r5, r2, lsl #2] + 1f04cd8: e2822001 add r2, r2, #1 + 1f04cdc: e3520e3f cmp r2, #1008 ; 0x3f0 + 1f04ce0: 1afffff8 bne 1f04cc8 + 1f04ce4: e1a03a02 lsl r3, r2, #20 + 1f04ce8: e3044000 movw r4, #16384 ; 0x4000 + 1f04cec: e340420e movt r4, #526 ; 0x20e + 1f04cf0: e3833b43 orr r3, r3, #68608 ; 0x10c00 + 1f04cf4: e3833016 orr r3, r3, #22 + 1f04cf8: e7853102 str r3, [r5, r2, lsl #2] + 1f04cfc: e2822001 add r2, r2, #1 + 1f04d00: e3520a01 cmp r2, #4096 ; 0x1000 + 1f04d04: 1afffff6 bne 1f04ce4 + 1f04d08: e3a00a0f mov r0, #61440 ; 0xf000 + 1f04d0c: e34003ff movt r0, #1023 ; 0x3ff + 1f04d10: e3a01000 mov r1, #0 + 1f04d14: e3007000 movw r7, #0 + 1f04d18: e340720e movt r7, #526 ; 0x20e + 1f04d1c: eb00e837 bl 1f3ee00 + 1f04d20: e5847000 str r7, [r4] + 1f04d24: e2872b01 add r2, r7, #1024 ; 0x400 + 1f04d28: e3a06000 mov r6, #0 + 1f04d2c: e5943000 ldr r3, [r4] + 1f04d30: e2833001 add r3, r3, #1 + 1f04d34: e5843000 str r3, [r4] + 1f04d38: e5842004 str r2, [r4, #4] + 1f04d3c: e5943004 ldr r3, [r4, #4] + 1f04d40: e2833001 add r3, r3, #1 + 1f04d44: e5843004 str r3, [r4, #4] + 1f04d48: e1a04606 lsl r4, r6, #12 + 1f04d4c: e1a00004 mov r0, r4 + 1f04d50: ebffed4d bl 1f0028c <_invalidate_dtlb_mva> + 1f04d54: e3840f5d orr r0, r4, #372 ; 0x174 + 1f04d58: e3800002 orr r0, r0, #2 + 1f04d5c: e7870106 str r0, [r7, r6, lsl #2] + 1f04d60: e2866001 add r6, r6, #1 + 1f04d64: e3560c02 cmp r6, #512 ; 0x200 + 1f04d68: 1afffff6 bne 1f04d48 + 1f04d6c: e3a03a0f mov r3, #61440 ; 0xf000 + 1f04d70: e34033ff movt r3, #1023 ; 0x3ff + 1f04d74: ee0c3f10 mcr 15, 0, r3, cr12, cr0, {0} + 1f04d78: ec523f1f mrrc 15, 1, r3, r2, cr15 + 1f04d7c: e3a03001 mov r3, #1 + 1f04d80: ee033f10 mcr 15, 0, r3, cr3, cr0, {0} + 1f04d84: e3a02000 mov r2, #0 + 1f04d88: ee022f50 mcr 15, 0, r2, cr2, cr0, {2} + 1f04d8c: ee123f50 mrc 15, 0, r3, cr2, cr0, {2} + 1f04d90: e385504a orr r5, r5, #74 ; 0x4a + 1f04d94: ee025f10 mcr 15, 0, r5, cr2, cr0, {0} + 1f04d98: ee123f10 mrc 15, 0, r3, cr2, cr0, {0} + 1f04d9c: f57ff06f isb sy + 1f04da0: e1a03302 lsl r3, r2, #6 + 1f04da4: ee073f56 mcr 15, 0, r3, cr7, cr6, {2} + 1f04da8: e3831101 orr r1, r3, #1073741824 ; 0x40000000 + 1f04dac: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04db0: e3831102 orr r1, r3, #-2147483648 ; 0x80000000 + 1f04db4: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04db8: e3833103 orr r3, r3, #-1073741824 ; 0xc0000000 + 1f04dbc: ee073f56 mcr 15, 0, r3, cr7, cr6, {2} + 1f04dc0: e2822001 add r2, r2, #1 + 1f04dc4: e3520080 cmp r2, #128 ; 0x80 + 1f04dc8: 1afffff4 bne 1f04da0 + 1f04dcc: e3a02000 mov r2, #0 + 1f04dd0: e1a03302 lsl r3, r2, #6 + 1f04dd4: e3831002 orr r1, r3, #2 + 1f04dd8: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04ddc: e3831221 orr r1, r3, #268435458 ; 0x10000002 + 1f04de0: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04de4: e3831222 orr r1, r3, #536870914 ; 0x20000002 + 1f04de8: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04dec: e3831223 orr r1, r3, #805306370 ; 0x30000002 + 1f04df0: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04df4: e3831109 orr r1, r3, #1073741826 ; 0x40000002 + 1f04df8: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04dfc: e3831225 orr r1, r3, #1342177282 ; 0x50000002 + 1f04e00: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04e04: e3831226 orr r1, r3, #1610612738 ; 0x60000002 + 1f04e08: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04e0c: e3831227 orr r1, r3, #1879048194 ; 0x70000002 + 1f04e10: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04e14: e383110a orr r1, r3, #-2147483646 ; 0x80000002 + 1f04e18: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04e1c: e3831229 orr r1, r3, #-1879048190 ; 0x90000002 + 1f04e20: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04e24: e383122a orr r1, r3, #-1610612734 ; 0xa0000002 + 1f04e28: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04e2c: e383122b orr r1, r3, #-1342177278 ; 0xb0000002 + 1f04e30: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04e34: e383110b orr r1, r3, #-1073741822 ; 0xc0000002 + 1f04e38: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04e3c: e383122d orr r1, r3, #-805306366 ; 0xd0000002 + 1f04e40: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04e44: e383122e orr r1, r3, #-536870910 ; 0xe0000002 + 1f04e48: ee071f56 mcr 15, 0, r1, cr7, cr6, {2} + 1f04e4c: e383322f orr r3, r3, #-268435454 ; 0xf0000002 + 1f04e50: ee073f56 mcr 15, 0, r3, cr7, cr6, {2} + 1f04e54: e2822001 add r2, r2, #1 + 1f04e58: e3520c02 cmp r2, #512 ; 0x200 + 1f04e5c: 1affffdb bne 1f04dd0 + 1f04e60: ee113f10 mrc 15, 0, r3, cr1, cr0, {0} + 1f04e64: e3833b06 orr r3, r3, #6144 ; 0x1800 + 1f04e68: e3833005 orr r3, r3, #5 + 1f04e6c: ee013f10 mcr 15, 0, r3, cr1, cr0, {0} + 1f04e70: ee113f10 mrc 15, 0, r3, cr1, cr0, {0} + 1f04e74: ee103f30 mrc 15, 0, r3, cr0, cr0, {1} + 1f04e78: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f04e7c : + 1f04e7c: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f04e80: e30ecfa0 movw ip, #61344 ; 0xefa0 + 1f04e84: e340c1f5 movt ip, #501 ; 0x1f5 + 1f04e88: e1a07000 mov r7, r0 + 1f04e8c: e0815002 add r5, r1, r2 + 1f04e90: e1a08003 mov r8, r3 + 1f04e94: e1510005 cmp r1, r5 + 1f04e98: 0a00000a beq 1f04ec8 + 1f04e9c: e4d10001 ldrb r0, [r1], #1 + 1f04ea0: e08c2000 add r2, ip, r0 + 1f04ea4: e6ff0070 uxth r0, r0 + 1f04ea8: e2403061 sub r3, r0, #97 ; 0x61 + 1f04eac: e3530019 cmp r3, #25 + 1f04eb0: 9afffff7 bls 1f04e94 + 1f04eb4: e350007f cmp r0, #127 ; 0x7f + 1f04eb8: 85520080 ldrbhi r0, [r2, #-128] ; 0xffffff80 + 1f04ebc: e3500000 cmp r0, #0 + 1f04ec0: 1afffff3 bne 1f04e94 + 1f04ec4: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f04ec8: e1d790d0 ldrsb r9, [r7] + 1f04ecc: e2983000 adds r3, r8, #0 + 1f04ed0: 13a03001 movne r3, #1 + 1f04ed4: e3590000 cmp r9, #0 + 1f04ed8: 13a03000 movne r3, #0 + 1f04edc: e3530000 cmp r3, #0 + 1f04ee0: 1a000024 bne 1f04f78 + 1f04ee4: e30e6fa0 movw r6, #61344 ; 0xefa0 + 1f04ee8: e34061f5 movt r6, #501 ; 0x1f5 + 1f04eec: e1a0c007 mov ip, r7 + 1f04ef0: e1a03009 mov r3, r9 + 1f04ef4: e1a04005 mov r4, r5 + 1f04ef8: ea000004 b 1f04f10 + 1f04efc: e2433020 sub r3, r3, #32 + 1f04f00: e6ff3073 uxth r3, r3 + 1f04f04: e1530002 cmp r3, r2 + 1f04f08: 1a00002e bne 1f04fc8 + 1f04f0c: e1fc30d1 ldrsb r3, [ip, #1]! + 1f04f10: e353002a cmp r3, #42 ; 0x2a + 1f04f14: 1353003f cmpne r3, #63 ; 0x3f + 1f04f18: e1a0000c mov r0, ip + 1f04f1c: 0a000017 beq 1f04f80 + 1f04f20: e6ef3073 uxtb r3, r3 + 1f04f24: e6ff2073 uxth r2, r3 + 1f04f28: e2421061 sub r1, r2, #97 ; 0x61 + 1f04f2c: e3510019 cmp r1, #25 + 1f04f30: 92422020 subls r2, r2, #32 + 1f04f34: 96ff2072 uxthls r2, r2 + 1f04f38: 9a000002 bls 1f04f48 + 1f04f3c: e352007f cmp r2, #127 ; 0x7f + 1f04f40: 80863003 addhi r3, r6, r3 + 1f04f44: 85532080 ldrbhi r2, [r3, #-128] ; 0xffffff80 + 1f04f48: e4d41001 ldrb r1, [r4], #1 + 1f04f4c: e6ff3071 uxth r3, r1 + 1f04f50: e2430061 sub r0, r3, #97 ; 0x61 + 1f04f54: e3500019 cmp r0, #25 + 1f04f58: 9affffe7 bls 1f04efc + 1f04f5c: e353007f cmp r3, #127 ; 0x7f + 1f04f60: 80861001 addhi r1, r6, r1 + 1f04f64: 85513080 ldrbhi r3, [r1, #-128] ; 0xffffff80 + 1f04f68: e1530002 cmp r3, r2 + 1f04f6c: 1a000015 bne 1f04fc8 + 1f04f70: e3530000 cmp r3, #0 + 1f04f74: 1affffe4 bne 1f04f0c + 1f04f78: e3a00001 mov r0, #1 + 1f04f7c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f04f80: e3a03000 mov r3, #0 + 1f04f84: e1dc10d0 ldrsb r1, [ip] + 1f04f88: e1a02003 mov r2, r3 + 1f04f8c: e351003f cmp r1, #63 ; 0x3f + 1f04f90: e1f010d1 ldrsb r1, [r0, #1]! + 1f04f94: 03a0c001 moveq ip, #1 + 1f04f98: 13a0c000 movne ip, #0 + 1f04f9c: 13a03001 movne r3, #1 + 1f04fa0: e351003f cmp r1, #63 ; 0x3f + 1f04fa4: 1351002a cmpne r1, #42 ; 0x2a + 1f04fa8: e082200c add r2, r2, ip + 1f04fac: 0afffff6 beq 1f04f8c + 1f04fb0: e1a01004 mov r1, r4 + 1f04fb4: ebffffb0 bl 1f04e7c + 1f04fb8: e3500000 cmp r0, #0 + 1f04fbc: 1affffed bne 1f04f78 + 1f04fc0: e1d430d0 ldrsb r3, [r4] + 1f04fc4: e6ff3073 uxth r3, r3 + 1f04fc8: e3530000 cmp r3, #0 + 1f04fcc: 13580000 cmpne r8, #0 + 1f04fd0: e2855001 add r5, r5, #1 + 1f04fd4: 1affffc4 bne 1f04eec + 1f04fd8: e3a00000 mov r0, #0 + 1f04fdc: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + +01f04fe0 : + 1f04fe0: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f04fe4: e5905044 ldr r5, [r0, #68] ; 0x44 + 1f04fe8: e2807048 add r7, r0, #72 ; 0x48 + 1f04fec: e1a04000 mov r4, r0 + 1f04ff0: e3a03001 mov r3, #1 + 1f04ff4: e1a01007 mov r1, r7 + 1f04ff8: e5d00001 ldrb r0, [r0, #1] + 1f04ffc: e1a02005 mov r2, r5 + 1f05000: eb0085d0 bl 1f26748 + 1f05004: e3500000 cmp r0, #0 + 1f05008: 1a000013 bne 1f0505c + 1f0500c: e5943038 ldr r3, [r4, #56] ; 0x38 + 1f05010: e5942030 ldr r2, [r4, #48] ; 0x30 + 1f05014: e0633005 rsb r3, r3, r5 + 1f05018: e5c40003 strb r0, [r4, #3] + 1f0501c: e1530002 cmp r3, r2 + 1f05020: 35d46002 ldrbcc r6, [r4, #2] + 1f05024: 3a000001 bcc 1f05030 + 1f05028: e3a00000 mov r0, #0 + 1f0502c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f05030: e3560001 cmp r6, #1 + 1f05034: e3a03001 mov r3, #1 + 1f05038: e1a01007 mov r1, r7 + 1f0503c: e2466001 sub r6, r6, #1 + 1f05040: 9afffff8 bls 1f05028 + 1f05044: e5942030 ldr r2, [r4, #48] ; 0x30 + 1f05048: e5d40001 ldrb r0, [r4, #1] + 1f0504c: e0855002 add r5, r5, r2 + 1f05050: e1a02005 mov r2, r5 + 1f05054: eb0085bb bl 1f26748 + 1f05058: eafffff4 b 1f05030 + 1f0505c: e3a00001 mov r0, #1 + 1f05060: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f05064 : + 1f05064: e3a03000 mov r3, #0 + 1f05068: e92d43f0 push {r4, r5, r6, r7, r8, r9, lr} + 1f0506c: e5904000 ldr r4, [r0] + 1f05070: e5c1301a strb r3, [r1, #26] + 1f05074: e5902030 ldr r2, [r0, #48] ; 0x30 + 1f05078: e1520003 cmp r2, r3 + 1f0507c: 08bd83f0 popeq {r4, r5, r6, r7, r8, r9, pc} + 1f05080: e5d42000 ldrb r2, [r4] + 1f05084: e3520004 cmp r2, #4 + 1f05088: 0a0000d5 beq 1f053e4 + 1f0508c: e5902044 ldr r2, [r0, #68] ; 0x44 + 1f05090: e3720001 cmn r2, #1 + 1f05094: 0a000091 beq 1f052e0 + 1f05098: e594200c ldr r2, [r4, #12] + 1f0509c: e1d220b0 ldrh r2, [r2] + 1f050a0: e3520000 cmp r2, #0 + 1f050a4: 1281c019 addne ip, r1, #25 + 1f050a8: 1a000002 bne 1f050b8 + 1f050ac: ea0000ca b 1f053dc + 1f050b0: e35300ff cmp r3, #255 ; 0xff + 1f050b4: 0a0000c8 beq 1f053dc + 1f050b8: e5ec2001 strb r2, [ip, #1]! + 1f050bc: e2833001 add r3, r3, #1 + 1f050c0: e594e00c ldr lr, [r4, #12] + 1f050c4: e1a02083 lsl r2, r3, #1 + 1f050c8: e19e20b2 ldrh r2, [lr, r2] + 1f050cc: e3520000 cmp r2, #0 + 1f050d0: 1afffff6 bne 1f050b0 + 1f050d4: e0813003 add r3, r1, r3 + 1f050d8: e3a0e000 mov lr, #0 + 1f050dc: e5c3e01a strb lr, [r3, #26] + 1f050e0: e1d131da ldrsb r3, [r1, #26] + 1f050e4: e153000e cmp r3, lr + 1f050e8: 0a00007c beq 1f052e0 + 1f050ec: e5902034 ldr r2, [r0, #52] ; 0x34 + 1f050f0: e1d2c0d0 ldrsb ip, [r2] + 1f050f4: e35c0020 cmp ip, #32 + 1f050f8: 01a0300e moveq r3, lr + 1f050fc: 0a000004 beq 1f05114 + 1f05100: e35c0005 cmp ip, #5 + 1f05104: e3a03001 mov r3, #1 + 1f05108: 03e0c01a mvneq ip, #26 + 1f0510c: e5c1c00d strb ip, [r1, #13] + 1f05110: e5902034 ldr r2, [r0, #52] ; 0x34 + 1f05114: e1d2c0d1 ldrsb ip, [r2, #1] + 1f05118: e35c0020 cmp ip, #32 + 1f0511c: 0a000005 beq 1f05138 + 1f05120: e0812003 add r2, r1, r3 + 1f05124: e35c0005 cmp ip, #5 + 1f05128: 03e0c01a mvneq ip, #26 + 1f0512c: e2833001 add r3, r3, #1 + 1f05130: e5c2c00d strb ip, [r2, #13] + 1f05134: e5902034 ldr r2, [r0, #52] ; 0x34 + 1f05138: e1d2c0d2 ldrsb ip, [r2, #2] + 1f0513c: e35c0020 cmp ip, #32 + 1f05140: 0a000005 beq 1f0515c + 1f05144: e0812003 add r2, r1, r3 + 1f05148: e35c0005 cmp ip, #5 + 1f0514c: 03e0c01a mvneq ip, #26 + 1f05150: e2833001 add r3, r3, #1 + 1f05154: e5c2c00d strb ip, [r2, #13] + 1f05158: e5902034 ldr r2, [r0, #52] ; 0x34 + 1f0515c: e1d2c0d3 ldrsb ip, [r2, #3] + 1f05160: e35c0020 cmp ip, #32 + 1f05164: 0a000005 beq 1f05180 + 1f05168: e0812003 add r2, r1, r3 + 1f0516c: e35c0005 cmp ip, #5 + 1f05170: 03e0c01a mvneq ip, #26 + 1f05174: e2833001 add r3, r3, #1 + 1f05178: e5c2c00d strb ip, [r2, #13] + 1f0517c: e5902034 ldr r2, [r0, #52] ; 0x34 + 1f05180: e1d2c0d4 ldrsb ip, [r2, #4] + 1f05184: e35c0020 cmp ip, #32 + 1f05188: 0a000005 beq 1f051a4 + 1f0518c: e0812003 add r2, r1, r3 + 1f05190: e35c0005 cmp ip, #5 + 1f05194: 03e0c01a mvneq ip, #26 + 1f05198: e2833001 add r3, r3, #1 + 1f0519c: e5c2c00d strb ip, [r2, #13] + 1f051a0: e5902034 ldr r2, [r0, #52] ; 0x34 + 1f051a4: e1d2c0d5 ldrsb ip, [r2, #5] + 1f051a8: e35c0020 cmp ip, #32 + 1f051ac: 0a000005 beq 1f051c8 + 1f051b0: e0812003 add r2, r1, r3 + 1f051b4: e35c0005 cmp ip, #5 + 1f051b8: 03e0c01a mvneq ip, #26 + 1f051bc: e2833001 add r3, r3, #1 + 1f051c0: e5c2c00d strb ip, [r2, #13] + 1f051c4: e5902034 ldr r2, [r0, #52] ; 0x34 + 1f051c8: e1d2c0d6 ldrsb ip, [r2, #6] + 1f051cc: e35c0020 cmp ip, #32 + 1f051d0: 0a000005 beq 1f051ec + 1f051d4: e0812003 add r2, r1, r3 + 1f051d8: e35c0005 cmp ip, #5 + 1f051dc: 03e0c01a mvneq ip, #26 + 1f051e0: e2833001 add r3, r3, #1 + 1f051e4: e5c2c00d strb ip, [r2, #13] + 1f051e8: e5902034 ldr r2, [r0, #52] ; 0x34 + 1f051ec: e1d2c0d7 ldrsb ip, [r2, #7] + 1f051f0: e35c0020 cmp ip, #32 + 1f051f4: 0a000005 beq 1f05210 + 1f051f8: e0812003 add r2, r1, r3 + 1f051fc: e35c0005 cmp ip, #5 + 1f05200: 03e0c01a mvneq ip, #26 + 1f05204: e2833001 add r3, r3, #1 + 1f05208: e5c2c00d strb ip, [r2, #13] + 1f0520c: e5902034 ldr r2, [r0, #52] ; 0x34 + 1f05210: e1d2c0d8 ldrsb ip, [r2, #8] + 1f05214: e35c0020 cmp ip, #32 + 1f05218: 0a000007 beq 1f0523c + 1f0521c: e0812003 add r2, r1, r3 + 1f05220: e35c0005 cmp ip, #5 + 1f05224: 03e0c01a mvneq ip, #26 + 1f05228: e3a0e02e mov lr, #46 ; 0x2e + 1f0522c: e2833002 add r3, r3, #2 + 1f05230: e5c2c00e strb ip, [r2, #14] + 1f05234: e5c2e00d strb lr, [r2, #13] + 1f05238: e5902034 ldr r2, [r0, #52] ; 0x34 + 1f0523c: e1d2c0d9 ldrsb ip, [r2, #9] + 1f05240: e35c0020 cmp ip, #32 + 1f05244: 0a000005 beq 1f05260 + 1f05248: e0812003 add r2, r1, r3 + 1f0524c: e35c0005 cmp ip, #5 + 1f05250: 03e0c01a mvneq ip, #26 + 1f05254: e2833001 add r3, r3, #1 + 1f05258: e5c2c00d strb ip, [r2, #13] + 1f0525c: e5902034 ldr r2, [r0, #52] ; 0x34 + 1f05260: e1d220da ldrsb r2, [r2, #10] + 1f05264: e3520020 cmp r2, #32 + 1f05268: 00814003 addeq r4, r1, r3 + 1f0526c: 0a000005 beq 1f05288 + 1f05270: e081c003 add ip, r1, r3 + 1f05274: e3520005 cmp r2, #5 + 1f05278: e2833001 add r3, r3, #1 + 1f0527c: 03e0201a mvneq r2, #26 + 1f05280: e0814003 add r4, r1, r3 + 1f05284: e5cc200d strb r2, [ip, #13] + 1f05288: e3a0c000 mov ip, #0 + 1f0528c: e5c4c00d strb ip, [r4, #13] + 1f05290: e5903034 ldr r3, [r0, #52] ; 0x34 + 1f05294: e5d3300b ldrb r3, [r3, #11] + 1f05298: e5c1300c strb r3, [r1, #12] + 1f0529c: e5902034 ldr r2, [r0, #52] ; 0x34 + 1f052a0: e1d2e1be ldrh lr, [r2, #30] + 1f052a4: e5d2301d ldrb r3, [r2, #29] + 1f052a8: e5d2001c ldrb r0, [r2, #28] + 1f052ac: e183340e orr r3, r3, lr, lsl #8 + 1f052b0: e581c004 str ip, [r1, #4] + 1f052b4: e1803403 orr r3, r0, r3, lsl #8 + 1f052b8: e5813000 str r3, [r1] + 1f052bc: e1d201b8 ldrh r0, [r2, #24] + 1f052c0: e5d23017 ldrb r3, [r2, #23] + 1f052c4: e5d22016 ldrb r2, [r2, #22] + 1f052c8: e1833400 orr r3, r3, r0, lsl #8 + 1f052cc: e1823403 orr r3, r2, r3, lsl #8 + 1f052d0: e1c130ba strh r3, [r1, #10] + 1f052d4: e1a03823 lsr r3, r3, #16 + 1f052d8: e1c130b8 strh r3, [r1, #8] + 1f052dc: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f052e0: e3a03000 mov r3, #0 + 1f052e4: e3e0601a mvn r6, #26 + 1f052e8: e1a02003 mov r2, r3 + 1f052ec: e3a0702e mov r7, #46 ; 0x2e + 1f052f0: ea000013 b 1f05344 + 1f052f4: e35c0009 cmp ip, #9 + 1f052f8: 0a00001f beq 1f0537c + 1f052fc: e0814003 add r4, r1, r3 + 1f05300: e24e5041 sub r5, lr, #65 ; 0x41 + 1f05304: e3550019 cmp r5, #25 + 1f05308: e5c4200d strb r2, [r4, #13] + 1f0530c: 8a000007 bhi 1f05330 + 1f05310: e5905034 ldr r5, [r0, #52] ; 0x34 + 1f05314: e35c0009 cmp ip, #9 + 1f05318: 33a08008 movcc r8, #8 + 1f0531c: 23a08010 movcs r8, #16 + 1f05320: e5d5500c ldrb r5, [r5, #12] + 1f05324: e1180005 tst r8, r5 + 1f05328: 128ee020 addne lr, lr, #32 + 1f0532c: 16af207e sxtbne r2, lr + 1f05330: e5c4201a strb r2, [r4, #26] + 1f05334: e2833001 add r3, r3, #1 + 1f05338: e35c000b cmp ip, #11 + 1f0533c: e1a0200c mov r2, ip + 1f05340: 0a00001d beq 1f053bc + 1f05344: e590e034 ldr lr, [r0, #52] ; 0x34 + 1f05348: e282c001 add ip, r2, #1 + 1f0534c: e7dee002 ldrb lr, [lr, r2] + 1f05350: e6af207e sxtb r2, lr + 1f05354: e3520020 cmp r2, #32 + 1f05358: 0afffff6 beq 1f05338 + 1f0535c: e3520005 cmp r2, #5 + 1f05360: 1affffe3 bne 1f052f4 + 1f05364: e35c0009 cmp ip, #9 + 1f05368: 10814003 addne r4, r1, r3 + 1f0536c: 13e0201a mvnne r2, #26 + 1f05370: 15c4600d strbne r6, [r4, #13] + 1f05374: 1affffed bne 1f05330 + 1f05378: e3e0201a mvn r2, #26 + 1f0537c: e2835001 add r5, r3, #1 + 1f05380: e6efe072 uxtb lr, r2 + 1f05384: e0813003 add r3, r1, r3 + 1f05388: e0814005 add r4, r1, r5 + 1f0538c: e24e8041 sub r8, lr, #65 ; 0x41 + 1f05390: e3580019 cmp r8, #25 + 1f05394: e5c3701a strb r7, [r3, #26] + 1f05398: e5c3700d strb r7, [r3, #13] + 1f0539c: 81a03005 movhi r3, r5 + 1f053a0: e5c4200d strb r2, [r4, #13] + 1f053a4: 8affffe1 bhi 1f05330 + 1f053a8: e5909034 ldr r9, [r0, #52] ; 0x34 + 1f053ac: e1a03005 mov r3, r5 + 1f053b0: e3a08010 mov r8, #16 + 1f053b4: e5d9500c ldrb r5, [r9, #12] + 1f053b8: eaffffd9 b 1f05324 + 1f053bc: e0814003 add r4, r1, r3 + 1f053c0: e3a03000 mov r3, #0 + 1f053c4: e5c4301a strb r3, [r4, #26] + 1f053c8: e5903034 ldr r3, [r0, #52] ; 0x34 + 1f053cc: e5d3300c ldrb r3, [r3, #12] + 1f053d0: e3530000 cmp r3, #0 + 1f053d4: 01a04001 moveq r4, r1 + 1f053d8: eaffffaa b 1f05288 + 1f053dc: e3a03000 mov r3, #0 + 1f053e0: eaffff3b b 1f050d4 + 1f053e4: e5944010 ldr r4, [r4, #16] + 1f053e8: e5d42023 ldrb r2, [r4, #35] ; 0x23 + 1f053ec: e1520003 cmp r2, r3 + 1f053f0: 1281e019 addne lr, r1, #25 + 1f053f4: 13a00040 movne r0, #64 ; 0x40 + 1f053f8: 0a000041 beq 1f05504 + 1f053fc: e310001f tst r0, #31 + 1f05400: 02800002 addeq r0, r0, #2 + 1f05404: e084c000 add ip, r4, r0 + 1f05408: e7d42000 ldrb r2, [r4, r0] + 1f0540c: e2800002 add r0, r0, #2 + 1f05410: e5dcc001 ldrb ip, [ip, #1] + 1f05414: e182240c orr r2, r2, ip, lsl #8 + 1f05418: e6bf2072 sxth r2, r2 + 1f0541c: e3520000 cmp r2, #0 + 1f05420: 135300ff cmpne r3, #255 ; 0xff + 1f05424: e2833001 add r3, r3, #1 + 1f05428: 0a000035 beq 1f05504 + 1f0542c: e5ee2001 strb r2, [lr, #1]! + 1f05430: e5d42023 ldrb r2, [r4, #35] ; 0x23 + 1f05434: e1520003 cmp r2, r3 + 1f05438: 8affffef bhi 1f053fc + 1f0543c: e0813003 add r3, r1, r3 + 1f05440: e3a02000 mov r2, #0 + 1f05444: e5c3201a strb r2, [r3, #26] + 1f05448: e5c1200d strb r2, [r1, #13] + 1f0544c: e5d43004 ldrb r3, [r4, #4] + 1f05450: e5c1300c strb r3, [r1, #12] + 1f05454: e3130010 tst r3, #16 + 1f05458: 13a02000 movne r2, #0 + 1f0545c: 13a03000 movne r3, #0 + 1f05460: 1a00001d bne 1f054dc + 1f05464: e594003c ldr r0, [r4, #60] ; 0x3c + 1f05468: e3a03000 mov r3, #0 + 1f0546c: e5d4203b ldrb r2, [r4, #59] ; 0x3b + 1f05470: e3a07000 mov r7, #0 + 1f05474: e5d4603a ldrb r6, [r4, #58] ; 0x3a + 1f05478: ee800b90 vdup.32 d16, r0 + 1f0547c: f3e000b0 vshr.u64 d16, d16, #32 + 1f05480: f2c815b0 vshl.s64 d17, d16, #8 + 1f05484: ec598b31 vmov r8, r9, d17 + 1f05488: e1899003 orr r9, r9, r3 + 1f0548c: e1888002 orr r8, r8, r2 + 1f05490: e3a03000 mov r3, #0 + 1f05494: e5d42039 ldrb r2, [r4, #57] ; 0x39 + 1f05498: e1a09409 lsl r9, r9, #8 + 1f0549c: e1899c28 orr r9, r9, r8, lsr #24 + 1f054a0: e1a08408 lsl r8, r8, #8 + 1f054a4: e1899007 orr r9, r9, r7 + 1f054a8: e1888006 orr r8, r8, r6 + 1f054ac: e5d46038 ldrb r6, [r4, #56] ; 0x38 + 1f054b0: e3a07000 mov r7, #0 + 1f054b4: e1a09409 lsl r9, r9, #8 + 1f054b8: e1899c28 orr r9, r9, r8, lsr #24 + 1f054bc: e1a08408 lsl r8, r8, #8 + 1f054c0: e1833009 orr r3, r3, r9 + 1f054c4: e1822008 orr r2, r2, r8 + 1f054c8: e1a03403 lsl r3, r3, #8 + 1f054cc: e1833c22 orr r3, r3, r2, lsr #24 + 1f054d0: e1a02402 lsl r2, r2, #8 + 1f054d4: e1822006 orr r2, r2, r6 + 1f054d8: e1833007 orr r3, r3, r7 + 1f054dc: e1c120f0 strd r2, [r1] + 1f054e0: e5d4200d ldrb r2, [r4, #13] + 1f054e4: e5d4300c ldrb r3, [r4, #12] + 1f054e8: e1833402 orr r3, r3, r2, lsl #8 + 1f054ec: e1c130ba strh r3, [r1, #10] + 1f054f0: e5d4200f ldrb r2, [r4, #15] + 1f054f4: e5d4300e ldrb r3, [r4, #14] + 1f054f8: e1833402 orr r3, r3, r2, lsl #8 + 1f054fc: e1c130b8 strh r3, [r1, #8] + 1f05500: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f05504: e3a0203f mov r2, #63 ; 0x3f + 1f05508: e3a03001 mov r3, #1 + 1f0550c: e5c1201a strb r2, [r1, #26] + 1f05510: eaffffc9 b 1f0543c + +01f05514 : + 1f05514: e3710001 cmn r1, #1 + 1f05518: e3a03000 mov r3, #0 + 1f0551c: e92d4070 push {r4, r5, r6, lr} + 1f05520: e3e06000 mvn r6, #0 + 1f05524: e1a04000 mov r4, r0 + 1f05528: e5c03003 strb r3, [r0, #3] + 1f0552c: e5806044 str r6, [r0, #68] ; 0x44 + 1f05530: 0a00000b beq 1f05564 + 1f05534: e1a02001 mov r2, r1 + 1f05538: e1a05001 mov r5, r1 + 1f0553c: e3a03001 mov r3, #1 + 1f05540: e2801048 add r1, r0, #72 ; 0x48 + 1f05544: e5d00001 ldrb r0, [r0, #1] + 1f05548: eb008460 bl 1f266d0 + 1f0554c: e3500000 cmp r0, #0 + 1f05550: 0a000002 beq 1f05560 + 1f05554: e5846044 str r6, [r4, #68] ; 0x44 + 1f05558: e3a00004 mov r0, #4 + 1f0555c: e8bd8070 pop {r4, r5, r6, pc} + 1f05560: e5845044 str r5, [r4, #68] ; 0x44 + 1f05564: e5d41247 ldrb r1, [r4, #583] ; 0x247 + 1f05568: e30a2a55 movw r2, #43605 ; 0xaa55 + 1f0556c: e5d43246 ldrb r3, [r4, #582] ; 0x246 + 1f05570: e1833401 orr r3, r3, r1, lsl #8 + 1f05574: e1530002 cmp r3, r2 + 1f05578: 0a000001 beq 1f05584 + 1f0557c: e3a00003 mov r0, #3 + 1f05580: e8bd8070 pop {r4, r5, r6, pc} + 1f05584: e5d43048 ldrb r3, [r4, #72] ; 0x48 + 1f05588: e35300e9 cmp r3, #233 ; 0xe9 + 1f0558c: 0a000018 beq 1f055f4 + 1f05590: e5943048 ldr r3, [r4, #72] ; 0x48 + 1f05594: e3a020eb mov r2, #235 ; 0xeb + 1f05598: e3402090 movt r2, #144 ; 0x90 + 1f0559c: e3c334ff bic r3, r3, #-16777216 ; 0xff000000 + 1f055a0: e3c33cff bic r3, r3, #65280 ; 0xff00 + 1f055a4: e1530002 cmp r3, r2 + 1f055a8: 0a000011 beq 1f055f4 + 1f055ac: e30fc020 movw ip, #61472 ; 0xf020 + 1f055b0: e340c1f5 movt ip, #501 ; 0x1f5 + 1f055b4: e2844047 add r4, r4, #71 ; 0x47 + 1f055b8: e3a0100b mov r1, #11 + 1f055bc: e2511001 subs r1, r1, #1 + 1f055c0: e5f43001 ldrb r3, [r4, #1]! + 1f055c4: e4dc0001 ldrb r0, [ip], #1 + 1f055c8: 13a02001 movne r2, #1 + 1f055cc: 03a02000 moveq r2, #0 + 1f055d0: e1530000 cmp r3, r0 + 1f055d4: 13a02000 movne r2, #0 + 1f055d8: 02022001 andeq r2, r2, #1 + 1f055dc: e3520000 cmp r2, #0 + 1f055e0: 1afffff5 bne 1f055bc + 1f055e4: e1530000 cmp r3, r0 + 1f055e8: 03a00001 moveq r0, #1 + 1f055ec: 13a00002 movne r0, #2 + 1f055f0: e8bd8070 pop {r4, r5, r6, pc} + 1f055f4: e1d408b0 ldrh r0, [r4, #128] ; 0x80 + 1f055f8: e3041146 movw r1, #16710 ; 0x4146 + 1f055fc: e3401054 movt r1, #84 ; 0x54 + 1f05600: e5d4307f ldrb r3, [r4, #127] ; 0x7f + 1f05604: e5d4207e ldrb r2, [r4, #126] ; 0x7e + 1f05608: e1833400 orr r3, r3, r0, lsl #8 + 1f0560c: e1823403 orr r3, r2, r3, lsl #8 + 1f05610: e3c334ff bic r3, r3, #-16777216 ; 0xff000000 + 1f05614: e1530001 cmp r3, r1 + 1f05618: 0a000008 beq 1f05640 + 1f0561c: e1d409bc ldrh r0, [r4, #156] ; 0x9c + 1f05620: e3041146 movw r1, #16710 ; 0x4146 + 1f05624: e3431354 movt r1, #13140 ; 0x3354 + 1f05628: e5d4209b ldrb r2, [r4, #155] ; 0x9b + 1f0562c: e5d4309a ldrb r3, [r4, #154] ; 0x9a + 1f05630: e1822400 orr r2, r2, r0, lsl #8 + 1f05634: e1833402 orr r3, r3, r2, lsl #8 + 1f05638: e1530001 cmp r3, r1 + 1f0563c: 1affffda bne 1f055ac + 1f05640: e3a00000 mov r0, #0 + 1f05644: e8bd8070 pop {r4, r5, r6, pc} + +01f05648 : + 1f05648: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f0564c: e5905044 ldr r5, [r0, #68] ; 0x44 + 1f05650: e1550001 cmp r5, r1 + 1f05654: 0a00001e beq 1f056d4 + 1f05658: e5d03003 ldrb r3, [r0, #3] + 1f0565c: e1a04000 mov r4, r0 + 1f05660: e1a06001 mov r6, r1 + 1f05664: e2807048 add r7, r0, #72 ; 0x48 + 1f05668: e3530000 cmp r3, #0 + 1f0566c: 0a00001c beq 1f056e4 + 1f05670: e3a03001 mov r3, #1 + 1f05674: e1a02005 mov r2, r5 + 1f05678: e1a01007 mov r1, r7 + 1f0567c: e5d00001 ldrb r0, [r0, #1] + 1f05680: eb008430 bl 1f26748 + 1f05684: e3500000 cmp r0, #0 + 1f05688: 1a000013 bne 1f056dc + 1f0568c: e5943038 ldr r3, [r4, #56] ; 0x38 + 1f05690: e5942030 ldr r2, [r4, #48] ; 0x30 + 1f05694: e0633005 rsb r3, r3, r5 + 1f05698: e5c40003 strb r0, [r4, #3] + 1f0569c: e1530002 cmp r3, r2 + 1f056a0: 2a00000f bcs 1f056e4 + 1f056a4: e5d48002 ldrb r8, [r4, #2] + 1f056a8: e3580001 cmp r8, #1 + 1f056ac: e3a03001 mov r3, #1 + 1f056b0: e1a01007 mov r1, r7 + 1f056b4: e2488001 sub r8, r8, #1 + 1f056b8: 9a000009 bls 1f056e4 + 1f056bc: e5942030 ldr r2, [r4, #48] ; 0x30 + 1f056c0: e5d40001 ldrb r0, [r4, #1] + 1f056c4: e0855002 add r5, r5, r2 + 1f056c8: e1a02005 mov r2, r5 + 1f056cc: eb00841d bl 1f26748 + 1f056d0: eafffff4 b 1f056a8 + 1f056d4: e3a00000 mov r0, #0 + 1f056d8: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f056dc: e3a00001 mov r0, #1 + 1f056e0: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f056e4: e1a02006 mov r2, r6 + 1f056e8: e1a01007 mov r1, r7 + 1f056ec: e3a03001 mov r3, #1 + 1f056f0: e5d40001 ldrb r0, [r4, #1] + 1f056f4: eb0083f5 bl 1f266d0 + 1f056f8: e3500000 cmp r0, #0 + 1f056fc: 13e06000 mvnne r6, #0 + 1f05700: 13a00001 movne r0, #1 + 1f05704: 03a00000 moveq r0, #0 + 1f05708: e5846044 str r6, [r4, #68] ; 0x44 + 1f0570c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f05710 : + 1f05710: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f05714: e3a03000 mov r3, #0 + 1f05718: e5813000 str r3, [r1] + 1f0571c: e5904000 ldr r4, [r0] + 1f05720: e1540003 cmp r4, r3 + 1f05724: 0a000077 beq 1f05908 + 1f05728: e1d450d0 ldrsb r5, [r4] + 1f0572c: e6ef3075 uxtb r3, r5 + 1f05730: e355003a cmp r5, #58 ; 0x3a + 1f05734: 1353001f cmpne r3, #31 + 1f05738: 9a00003b bls 1f0582c + 1f0573c: e1a0c004 mov ip, r4 + 1f05740: e1fc30d1 ldrsb r3, [ip, #1]! + 1f05744: e6efe073 uxtb lr, r3 + 1f05748: e353003a cmp r3, #58 ; 0x3a + 1f0574c: 135e001f cmpne lr, #31 + 1f05750: 8afffffa bhi 1f05740 + 1f05754: e353003a cmp r3, #58 ; 0x3a + 1f05758: 0a00001c beq 1f057d0 + 1f0575c: e3013e50 movw r3, #7760 ; 0x1e50 + 1f05760: e34031fb movt r3, #507 ; 0x1fb + 1f05764: e5934000 ldr r4, [r3] + 1f05768: e3540000 cmp r4, #0 + 1f0576c: 0a00001e beq 1f057ec + 1f05770: e5814000 str r4, [r1] + 1f05774: e20250fe and r5, r2, #254 ; 0xfe + 1f05778: e5d43000 ldrb r3, [r4] + 1f0577c: e3530000 cmp r3, #0 + 1f05780: 1a000007 bne 1f057a4 + 1f05784: e3a00000 mov r0, #0 + 1f05788: e5c40000 strb r0, [r4] + 1f0578c: e5c40001 strb r0, [r4, #1] + 1f05790: eb0083cc bl 1f266c8 + 1f05794: e3100001 tst r0, #1 + 1f05798: 0a000015 beq 1f057f4 + 1f0579c: e3a00003 mov r0, #3 + 1f057a0: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f057a4: e5d40001 ldrb r0, [r4, #1] + 1f057a8: eb0083c4 bl 1f266c0 + 1f057ac: e3100001 tst r0, #1 + 1f057b0: 1afffff3 bne 1f05784 + 1f057b4: e3550000 cmp r5, #0 + 1f057b8: 0a000050 beq 1f05900 + 1f057bc: e2000004 and r0, r0, #4 + 1f057c0: e21000ff ands r0, r0, #255 ; 0xff + 1f057c4: 08bd87f0 popeq {r4, r5, r6, r7, r8, r9, sl, pc} + 1f057c8: e3a0000a mov r0, #10 + 1f057cc: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f057d0: e2844001 add r4, r4, #1 + 1f057d4: e15c0004 cmp ip, r4 + 1f057d8: 03550030 cmpeq r5, #48 ; 0x30 + 1f057dc: 1a000049 bne 1f05908 + 1f057e0: e28cc001 add ip, ip, #1 + 1f057e4: e580c000 str ip, [r0] + 1f057e8: eaffffdb b 1f0575c + 1f057ec: e3a0000c mov r0, #12 + 1f057f0: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f057f4: e3550000 cmp r5, #0 + 1f057f8: 0a000001 beq 1f05804 + 1f057fc: e3100004 tst r0, #4 + 1f05800: 1afffff0 bne 1f057c8 + 1f05804: e3a01000 mov r1, #0 + 1f05808: e1a00004 mov r0, r4 + 1f0580c: ebffff40 bl 1f05514 + 1f05810: e3500002 cmp r0, #2 + 1f05814: 13a06000 movne r6, #0 + 1f05818: 0a000006 beq 1f05838 + 1f0581c: e3500004 cmp r0, #4 + 1f05820: 1a000031 bne 1f058ec + 1f05824: e3a00001 mov r0, #1 + 1f05828: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f0582c: e1a03005 mov r3, r5 + 1f05830: e1a0c004 mov ip, r4 + 1f05834: eaffffc6 b 1f05754 + 1f05838: e5d4520a ldrb r5, [r4, #522] ; 0x20a + 1f0583c: e3550000 cmp r5, #0 + 1f05840: 0a000005 beq 1f0585c + 1f05844: e2842e21 add r2, r4, #528 ; 0x210 + 1f05848: e5d4320f ldrb r3, [r4, #527] ; 0x20f + 1f0584c: e5d4120e ldrb r1, [r4, #526] ; 0x20e + 1f05850: e1d250b0 ldrh r5, [r2] + 1f05854: e1833405 orr r3, r3, r5, lsl #8 + 1f05858: e1815403 orr r5, r1, r3, lsl #8 + 1f0585c: e5d4821a ldrb r8, [r4, #538] ; 0x21a + 1f05860: e3580000 cmp r8, #0 + 1f05864: 0a000005 beq 1f05880 + 1f05868: e2842e22 add r2, r4, #544 ; 0x220 + 1f0586c: e5d4321f ldrb r3, [r4, #543] ; 0x21f + 1f05870: e5d4121e ldrb r1, [r4, #542] ; 0x21e + 1f05874: e1d280b0 ldrh r8, [r2] + 1f05878: e1833408 orr r3, r3, r8, lsl #8 + 1f0587c: e1818403 orr r8, r1, r3, lsl #8 + 1f05880: e5d4722a ldrb r7, [r4, #554] ; 0x22a + 1f05884: e3570000 cmp r7, #0 + 1f05888: 0a000005 beq 1f058a4 + 1f0588c: e2842e23 add r2, r4, #560 ; 0x230 + 1f05890: e5d4322f ldrb r3, [r4, #559] ; 0x22f + 1f05894: e5d4122e ldrb r1, [r4, #558] ; 0x22e + 1f05898: e1d270b0 ldrh r7, [r2] + 1f0589c: e1833407 orr r3, r3, r7, lsl #8 + 1f058a0: e1817403 orr r7, r1, r3, lsl #8 + 1f058a4: e5d4623a ldrb r6, [r4, #570] ; 0x23a + 1f058a8: e3560000 cmp r6, #0 + 1f058ac: 0a000005 beq 1f058c8 + 1f058b0: e2841d09 add r1, r4, #576 ; 0x240 + 1f058b4: e5d4223f ldrb r2, [r4, #575] ; 0x23f + 1f058b8: e5d4323e ldrb r3, [r4, #574] ; 0x23e + 1f058bc: e1d160b0 ldrh r6, [r1] + 1f058c0: e1826406 orr r6, r2, r6, lsl #8 + 1f058c4: e1836406 orr r6, r3, r6, lsl #8 + 1f058c8: e3550000 cmp r5, #0 + 1f058cc: 1a00000f bne 1f05910 + 1f058d0: e3580000 cmp r8, #0 + 1f058d4: 1a000079 bne 1f05ac0 + 1f058d8: e3570000 cmp r7, #0 + 1f058dc: 1a00007e bne 1f05adc + 1f058e0: e3560000 cmp r6, #0 + 1f058e4: 03a00003 moveq r0, #3 + 1f058e8: 1a000133 bne 1f05dbc + 1f058ec: e1a05006 mov r5, r6 + 1f058f0: e3500001 cmp r0, #1 + 1f058f4: 9a00000a bls 1f05924 + 1f058f8: e3a0000d mov r0, #13 + 1f058fc: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f05900: e1a00005 mov r0, r5 + 1f05904: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f05908: e3a0000b mov r0, #11 + 1f0590c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f05910: e1a01005 mov r1, r5 + 1f05914: e1a00004 mov r0, r4 + 1f05918: ebfffefd bl 1f05514 + 1f0591c: e3500001 cmp r0, #1 + 1f05920: 8affffea bhi 1f058d0 + 1f05924: e3500001 cmp r0, #1 + 1f05928: 0a000072 beq 1f05af8 + 1f0592c: e5d42054 ldrb r2, [r4, #84] ; 0x54 + 1f05930: e5d43053 ldrb r3, [r4, #83] ; 0x53 + 1f05934: e1833402 orr r3, r3, r2, lsl #8 + 1f05938: e3530c02 cmp r3, #512 ; 0x200 + 1f0593c: 1affffed bne 1f058f8 + 1f05940: e5d4105f ldrb r1, [r4, #95] ; 0x5f + 1f05944: e5d4305e ldrb r3, [r4, #94] ; 0x5e + 1f05948: e5d4c058 ldrb ip, [r4, #88] ; 0x58 + 1f0594c: e1931401 orrs r1, r3, r1, lsl #8 + 1f05950: e5c4c002 strb ip, [r4, #2] + 1f05954: 01d416be ldrheq r1, [r4, #110] ; 0x6e + 1f05958: 05d4306d ldrbeq r3, [r4, #109] ; 0x6d + 1f0595c: 05d4206c ldrbeq r2, [r4, #108] ; 0x6c + 1f05960: 01833401 orreq r3, r3, r1, lsl #8 + 1f05964: 01821403 orreq r1, r2, r3, lsl #8 + 1f05968: e24c3001 sub r3, ip, #1 + 1f0596c: e3530001 cmp r3, #1 + 1f05970: e5841030 str r1, [r4, #48] ; 0x30 + 1f05974: 8affffdf bhi 1f058f8 + 1f05978: e5d43055 ldrb r3, [r4, #85] ; 0x55 + 1f0597c: e00c0c91 mul ip, r1, ip + 1f05980: e6ff2073 uxth r2, r3 + 1f05984: e1c420ba strh r2, [r4, #10] + 1f05988: e3520000 cmp r2, #0 + 1f0598c: 0affffd9 beq 1f058f8 + 1f05990: e2432001 sub r2, r3, #1 + 1f05994: e1120003 tst r2, r3 + 1f05998: 1affffd6 bne 1f058f8 + 1f0599c: e5d4605a ldrb r6, [r4, #90] ; 0x5a + 1f059a0: e5d42059 ldrb r2, [r4, #89] ; 0x59 + 1f059a4: e1826406 orr r6, r2, r6, lsl #8 + 1f059a8: e1c460b8 strh r6, [r4, #8] + 1f059ac: e316000f tst r6, #15 + 1f059b0: 1affffd0 bne 1f058f8 + 1f059b4: e5d4005c ldrb r0, [r4, #92] ; 0x5c + 1f059b8: e5d4205b ldrb r2, [r4, #91] ; 0x5b + 1f059bc: e1922400 orrs r2, r2, r0, lsl #8 + 1f059c0: 01d4e6ba ldrheq lr, [r4, #106] ; 0x6a + 1f059c4: 05d40069 ldrbeq r0, [r4, #105] ; 0x69 + 1f059c8: 05d42068 ldrbeq r2, [r4, #104] ; 0x68 + 1f059cc: 0180040e orreq r0, r0, lr, lsl #8 + 1f059d0: e5d4e057 ldrb lr, [r4, #87] ; 0x57 + 1f059d4: 01822400 orreq r2, r2, r0, lsl #8 + 1f059d8: e5d40056 ldrb r0, [r4, #86] ; 0x56 + 1f059dc: e190040e orrs r0, r0, lr, lsl #8 + 1f059e0: 0affffc4 beq 1f058f8 + 1f059e4: e080e226 add lr, r0, r6, lsr #4 + 1f059e8: e08ee00c add lr, lr, ip + 1f059ec: e152000e cmp r2, lr + 1f059f0: 3affffc0 bcc 1f058f8 + 1f059f4: e06e2002 rsb r2, lr, r2 + 1f059f8: e733f312 udiv r3, r2, r3 + 1f059fc: e3530000 cmp r3, #0 + 1f05a00: 0affffbc beq 1f058f8 + 1f05a04: e30f2ff5 movw r2, #65525 ; 0xfff5 + 1f05a08: e1530002 cmp r3, r2 + 1f05a0c: 8a0000f0 bhi 1f05dd4 + 1f05a10: e3002ff5 movw r2, #4085 ; 0xff5 + 1f05a14: e1530002 cmp r3, r2 + 1f05a18: 8a000115 bhi 1f05e74 + 1f05a1c: e3560000 cmp r6, #0 + 1f05a20: e2833002 add r3, r3, #2 + 1f05a24: e0800005 add r0, r0, r5 + 1f05a28: e08ee005 add lr, lr, r5 + 1f05a2c: e584302c str r3, [r4, #44] ; 0x2c + 1f05a30: e5840038 str r0, [r4, #56] ; 0x38 + 1f05a34: e5845034 str r5, [r4, #52] ; 0x34 + 1f05a38: e584e040 str lr, [r4, #64] ; 0x40 + 1f05a3c: 0affffad beq 1f058f8 + 1f05a40: e2032001 and r2, r3, #1 + 1f05a44: e0833083 add r3, r3, r3, lsl #1 + 1f05a48: e2822f7f add r2, r2, #508 ; 0x1fc + 1f05a4c: e08c0000 add r0, ip, r0 + 1f05a50: e2822003 add r2, r2, #3 + 1f05a54: e584003c str r0, [r4, #60] ; 0x3c + 1f05a58: e08230a3 add r3, r2, r3, lsr #1 + 1f05a5c: e15104a3 cmp r1, r3, lsr #9 + 1f05a60: 3affffa4 bcc 1f058f8 + 1f05a64: e3e02000 mvn r2, #0 + 1f05a68: e3e0107f mvn r1, #127 ; 0x7f + 1f05a6c: e5842018 str r2, [r4, #24] + 1f05a70: e3a03001 mov r3, #1 + 1f05a74: e5842014 str r2, [r4, #20] + 1f05a78: e5c41004 strb r1, [r4, #4] + 1f05a7c: e3012e48 movw r2, #7752 ; 0x1e48 + 1f05a80: e34021fb movt r2, #507 ; 0x1fb + 1f05a84: e5c43000 strb r3, [r4] + 1f05a88: e3a00000 mov r0, #0 + 1f05a8c: e3011e58 movw r1, #7768 ; 0x1e58 + 1f05a90: e34011fb movt r1, #507 ; 0x1fb + 1f05a94: e1d230b0 ldrh r3, [r2] + 1f05a98: e301cbe8 movw ip, #7144 ; 0x1be8 + 1f05a9c: e340c1fb movt ip, #507 ; 0x1fb + 1f05aa0: e584c010 str ip, [r4, #16] + 1f05aa4: e2833001 add r3, r3, #1 + 1f05aa8: e584100c str r1, [r4, #12] + 1f05aac: e584001c str r0, [r4, #28] + 1f05ab0: e6ff3073 uxth r3, r3 + 1f05ab4: e1c230b0 strh r3, [r2] + 1f05ab8: e1c430b6 strh r3, [r4, #6] + 1f05abc: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f05ac0: e1a01008 mov r1, r8 + 1f05ac4: e1a00004 mov r0, r4 + 1f05ac8: ebfffe91 bl 1f05514 + 1f05acc: e3500001 cmp r0, #1 + 1f05ad0: 91a05008 movls r5, r8 + 1f05ad4: 9affff85 bls 1f058f0 + 1f05ad8: eaffff7e b 1f058d8 + 1f05adc: e1a01007 mov r1, r7 + 1f05ae0: e1a00004 mov r0, r4 + 1f05ae4: ebfffe8a bl 1f05514 + 1f05ae8: e3500001 cmp r0, #1 + 1f05aec: 91a05007 movls r5, r7 + 1f05af0: 9affff7e bls 1f058f0 + 1f05af4: eaffff79 b 1f058e0 + 1f05af8: e2843052 add r3, r4, #82 ; 0x52 + 1f05afc: e2841087 add r1, r4, #135 ; 0x87 + 1f05b00: e5f32001 ldrb r2, [r3, #1]! + 1f05b04: e3520000 cmp r2, #0 + 1f05b08: 1affff7a bne 1f058f8 + 1f05b0c: e1510003 cmp r1, r3 + 1f05b10: 1afffffa bne 1f05b00 + 1f05b14: e5d420b1 ldrb r2, [r4, #177] ; 0xb1 + 1f05b18: e5d430b0 ldrb r3, [r4, #176] ; 0xb0 + 1f05b1c: e1833402 orr r3, r3, r2, lsl #8 + 1f05b20: e3530c01 cmp r3, #256 ; 0x100 + 1f05b24: 1affff73 bne 1f058f8 + 1f05b28: e5d420b4 ldrb r2, [r4, #180] ; 0xb4 + 1f05b2c: e3a03001 mov r3, #1 + 1f05b30: e1a03213 lsl r3, r3, r2 + 1f05b34: e3530c02 cmp r3, #512 ; 0x200 + 1f05b38: 1affff6e bne 1f058f8 + 1f05b3c: e594c094 ldr ip, [r4, #148] ; 0x94 + 1f05b40: e3a03000 mov r3, #0 + 1f05b44: e5d42093 ldrb r2, [r4, #147] ; 0x93 + 1f05b48: e3a01000 mov r1, #0 + 1f05b4c: e5d40092 ldrb r0, [r4, #146] ; 0x92 + 1f05b50: ee80cb90 vdup.32 d16, ip + 1f05b54: f3e000b0 vshr.u64 d16, d16, #32 + 1f05b58: f2c815b0 vshl.s64 d17, d16, #8 + 1f05b5c: ec576b31 vmov r6, r7, d17 + 1f05b60: e1877003 orr r7, r7, r3 + 1f05b64: e1866002 orr r6, r6, r2 + 1f05b68: e3a03000 mov r3, #0 + 1f05b6c: e5d42091 ldrb r2, [r4, #145] ; 0x91 + 1f05b70: e1a07407 lsl r7, r7, #8 + 1f05b74: e1877c26 orr r7, r7, r6, lsr #24 + 1f05b78: e1a06406 lsl r6, r6, #8 + 1f05b7c: e1811007 orr r1, r1, r7 + 1f05b80: e1800006 orr r0, r0, r6 + 1f05b84: e3a07000 mov r7, #0 + 1f05b88: e3e06000 mvn r6, #0 + 1f05b8c: e1a01401 lsl r1, r1, #8 + 1f05b90: e1811c20 orr r1, r1, r0, lsr #24 + 1f05b94: e1a00400 lsl r0, r0, #8 + 1f05b98: e1833001 orr r3, r3, r1 + 1f05b9c: e1822000 orr r2, r2, r0 + 1f05ba0: e5d40090 ldrb r0, [r4, #144] ; 0x90 + 1f05ba4: e3a01000 mov r1, #0 + 1f05ba8: e1a03403 lsl r3, r3, #8 + 1f05bac: e1833c22 orr r3, r3, r2, lsr #24 + 1f05bb0: e1a02402 lsl r2, r2, #8 + 1f05bb4: e1800002 orr r0, r0, r2 + 1f05bb8: e1811003 orr r1, r1, r3 + 1f05bbc: e0900005 adds r0, r0, r5 + 1f05bc0: e2a11000 adc r1, r1, #0 + 1f05bc4: e1510007 cmp r1, r7 + 1f05bc8: 01500006 cmpeq r0, r6 + 1f05bcc: 8affff49 bhi 1f058f8 + 1f05bd0: e1d4c9be ldrh ip, [r4, #158] ; 0x9e + 1f05bd4: e5d4209d ldrb r2, [r4, #157] ; 0x9d + 1f05bd8: e5d430b6 ldrb r3, [r4, #182] ; 0xb6 + 1f05bdc: e182c40c orr ip, r2, ip, lsl #8 + 1f05be0: e5d4209c ldrb r2, [r4, #156] ; 0x9c + 1f05be4: e3530001 cmp r3, #1 + 1f05be8: e5c43002 strb r3, [r4, #2] + 1f05bec: e182240c orr r2, r2, ip, lsl #8 + 1f05bf0: e5842030 str r2, [r4, #48] ; 0x30 + 1f05bf4: 1affff3f bne 1f058f8 + 1f05bf8: e5d420b5 ldrb r2, [r4, #181] ; 0xb5 + 1f05bfc: e1a03213 lsl r3, r3, r2 + 1f05c00: e6ff3073 uxth r3, r3 + 1f05c04: e1c430ba strh r3, [r4, #10] + 1f05c08: e3530000 cmp r3, #0 + 1f05c0c: 0affff39 beq 1f058f8 + 1f05c10: e1d4eab6 ldrh lr, [r4, #166] ; 0xa6 + 1f05c14: e5d420a5 ldrb r2, [r4, #165] ; 0xa5 + 1f05c18: e5d4c0a4 ldrb ip, [r4, #164] ; 0xa4 + 1f05c1c: e182240e orr r2, r2, lr, lsl #8 + 1f05c20: e18cc402 orr ip, ip, r2, lsl #8 + 1f05c24: e37c010e cmn ip, #-2147483645 ; 0x80000003 + 1f05c28: 8affff32 bhi 1f058f8 + 1f05c2c: e1d47ab2 ldrh r7, [r4, #162] ; 0xa2 + 1f05c30: e28c6002 add r6, ip, #2 + 1f05c34: e5d4e0a1 ldrb lr, [r4, #161] ; 0xa1 + 1f05c38: e5d420a0 ldrb r2, [r4, #160] ; 0xa0 + 1f05c3c: e18ee407 orr lr, lr, r7, lsl #8 + 1f05c40: e1d489ba ldrh r8, [r4, #154] ; 0x9a + 1f05c44: e009039c mul r9, ip, r3 + 1f05c48: e182240e orr r2, r2, lr, lsl #8 + 1f05c4c: e584602c str r6, [r4, #44] ; 0x2c + 1f05c50: e0822005 add r2, r2, r5 + 1f05c54: e5d4e099 ldrb lr, [r4, #153] ; 0x99 + 1f05c58: e0926009 adds r6, r2, r9 + 1f05c5c: e3a07000 mov r7, #0 + 1f05c60: e2a77000 adc r7, r7, #0 + 1f05c64: e18e8408 orr r8, lr, r8, lsl #8 + 1f05c68: e1510007 cmp r1, r7 + 1f05c6c: e5d4e098 ldrb lr, [r4, #152] ; 0x98 + 1f05c70: 01500006 cmpeq r0, r6 + 1f05c74: e5845034 str r5, [r4, #52] ; 0x34 + 1f05c78: e18e1408 orr r1, lr, r8, lsl #8 + 1f05c7c: e5842040 str r2, [r4, #64] ; 0x40 + 1f05c80: e0815005 add r5, r1, r5 + 1f05c84: e5845038 str r5, [r4, #56] ; 0x38 + 1f05c88: 3affff1a bcc 1f058f8 + 1f05c8c: e1d4eaba ldrh lr, [r4, #170] ; 0xaa + 1f05c90: e5d400a9 ldrb r0, [r4, #169] ; 0xa9 + 1f05c94: e5d410a8 ldrb r1, [r4, #168] ; 0xa8 + 1f05c98: e180040e orr r0, r0, lr, lsl #8 + 1f05c9c: e1811400 orr r1, r1, r0, lsl #8 + 1f05ca0: e584103c str r1, [r4, #60] ; 0x3c + 1f05ca4: e2411002 sub r1, r1, #2 + 1f05ca8: e1a00004 mov r0, r4 + 1f05cac: e15c0001 cmp ip, r1 + 1f05cb0: 93a01000 movls r1, #0 + 1f05cb4: 80212391 mlahi r1, r1, r3, r2 + 1f05cb8: ebfffe62 bl 1f05648 + 1f05cbc: e3500000 cmp r0, #0 + 1f05cc0: 1afffed7 bne 1f05824 + 1f05cc4: e5d43048 ldrb r3, [r4, #72] ; 0x48 + 1f05cc8: e3530081 cmp r3, #129 ; 0x81 + 1f05ccc: 0a0000bb beq 1f05fc0 + 1f05cd0: e5d43068 ldrb r3, [r4, #104] ; 0x68 + 1f05cd4: e3530081 cmp r3, #129 ; 0x81 + 1f05cd8: 0a0000b0 beq 1f05fa0 + 1f05cdc: e5d43088 ldrb r3, [r4, #136] ; 0x88 + 1f05ce0: e3530081 cmp r3, #129 ; 0x81 + 1f05ce4: 0a0000a5 beq 1f05f80 + 1f05ce8: e5d430a8 ldrb r3, [r4, #168] ; 0xa8 + 1f05cec: e3530081 cmp r3, #129 ; 0x81 + 1f05cf0: 0a00009a beq 1f05f60 + 1f05cf4: e5d430c8 ldrb r3, [r4, #200] ; 0xc8 + 1f05cf8: e3530081 cmp r3, #129 ; 0x81 + 1f05cfc: 0a00008f beq 1f05f40 + 1f05d00: e5d430e8 ldrb r3, [r4, #232] ; 0xe8 + 1f05d04: e3530081 cmp r3, #129 ; 0x81 + 1f05d08: 0a000084 beq 1f05f20 + 1f05d0c: e5d43108 ldrb r3, [r4, #264] ; 0x108 + 1f05d10: e3530081 cmp r3, #129 ; 0x81 + 1f05d14: 0a000077 beq 1f05ef8 + 1f05d18: e5d43128 ldrb r3, [r4, #296] ; 0x128 + 1f05d1c: e3530081 cmp r3, #129 ; 0x81 + 1f05d20: 0a00006a beq 1f05ed0 + 1f05d24: e5d43148 ldrb r3, [r4, #328] ; 0x148 + 1f05d28: e3530081 cmp r3, #129 ; 0x81 + 1f05d2c: 0a0000c9 beq 1f06058 + 1f05d30: e5d43168 ldrb r3, [r4, #360] ; 0x168 + 1f05d34: e3530081 cmp r3, #129 ; 0x81 + 1f05d38: 0a0000bc beq 1f06030 + 1f05d3c: e5d43188 ldrb r3, [r4, #392] ; 0x188 + 1f05d40: e3530081 cmp r3, #129 ; 0x81 + 1f05d44: 0a0000af beq 1f06008 + 1f05d48: e5d431a8 ldrb r3, [r4, #424] ; 0x1a8 + 1f05d4c: e3530081 cmp r3, #129 ; 0x81 + 1f05d50: 0a0000a2 beq 1f05fe0 + 1f05d54: e5d431c8 ldrb r3, [r4, #456] ; 0x1c8 + 1f05d58: e3530081 cmp r3, #129 ; 0x81 + 1f05d5c: 0a0000d1 beq 1f060a8 + 1f05d60: e5d431e8 ldrb r3, [r4, #488] ; 0x1e8 + 1f05d64: e3530081 cmp r3, #129 ; 0x81 + 1f05d68: 0a0000c4 beq 1f06080 + 1f05d6c: e5d43208 ldrb r3, [r4, #520] ; 0x208 + 1f05d70: e3530081 cmp r3, #129 ; 0x81 + 1f05d74: 0a0000d5 beq 1f060d0 + 1f05d78: e5d43228 ldrb r3, [r4, #552] ; 0x228 + 1f05d7c: e3530081 cmp r3, #129 ; 0x81 + 1f05d80: 1afffedc bne 1f058f8 + 1f05d84: e2841f8f add r1, r4, #572 ; 0x23c + 1f05d88: e5d4223d ldrb r2, [r4, #573] ; 0x23d + 1f05d8c: e2811002 add r1, r1, #2 + 1f05d90: e5d4323c ldrb r3, [r4, #572] ; 0x23c + 1f05d94: e1d110b0 ldrh r1, [r1] + 1f05d98: e1822401 orr r2, r2, r1, lsl #8 + 1f05d9c: e1833402 orr r3, r3, r2, lsl #8 + 1f05da0: e3530002 cmp r3, #2 + 1f05da4: 1afffed3 bne 1f058f8 + 1f05da8: e3e02000 mvn r2, #0 + 1f05dac: e3a03004 mov r3, #4 + 1f05db0: e5842018 str r2, [r4, #24] + 1f05db4: e5842014 str r2, [r4, #20] + 1f05db8: eaffff2f b 1f05a7c + 1f05dbc: e1a01006 mov r1, r6 + 1f05dc0: e1a00004 mov r0, r4 + 1f05dc4: ebfffdd2 bl 1f05514 + 1f05dc8: e3500001 cmp r0, #1 + 1f05dcc: 9afffec6 bls 1f058ec + 1f05dd0: eafffe91 b 1f0581c + 1f05dd4: e5d4c073 ldrb ip, [r4, #115] ; 0x73 + 1f05dd8: e2833002 add r3, r3, #2 + 1f05ddc: e5d42072 ldrb r2, [r4, #114] ; 0x72 + 1f05de0: e0800005 add r0, r0, r5 + 1f05de4: e08ee005 add lr, lr, r5 + 1f05de8: e584302c str r3, [r4, #44] ; 0x2c + 1f05dec: e192240c orrs r2, r2, ip, lsl #8 + 1f05df0: e5840038 str r0, [r4, #56] ; 0x38 + 1f05df4: 13a02001 movne r2, #1 + 1f05df8: 03a02000 moveq r2, #0 + 1f05dfc: e3560000 cmp r6, #0 + 1f05e00: 01a06002 moveq r6, r2 + 1f05e04: 13826001 orrne r6, r2, #1 + 1f05e08: e584e040 str lr, [r4, #64] ; 0x40 + 1f05e0c: e3560000 cmp r6, #0 + 1f05e10: e5845034 str r5, [r4, #52] ; 0x34 + 1f05e14: 1afffeb7 bne 1f058f8 + 1f05e18: e1a03103 lsl r3, r3, #2 + 1f05e1c: e1d4c7b6 ldrh ip, [r4, #118] ; 0x76 + 1f05e20: e2833f7f add r3, r3, #508 ; 0x1fc + 1f05e24: e5d40075 ldrb r0, [r4, #117] ; 0x75 + 1f05e28: e2833003 add r3, r3, #3 + 1f05e2c: e5d42074 ldrb r2, [r4, #116] ; 0x74 + 1f05e30: e180040c orr r0, r0, ip, lsl #8 + 1f05e34: e15104a3 cmp r1, r3, lsr #9 + 1f05e38: e1823400 orr r3, r2, r0, lsl #8 + 1f05e3c: e584303c str r3, [r4, #60] ; 0x3c + 1f05e40: 3afffeac bcc 1f058f8 + 1f05e44: e5d40079 ldrb r0, [r4, #121] ; 0x79 + 1f05e48: e3e02000 mvn r2, #0 + 1f05e4c: e5d43078 ldrb r3, [r4, #120] ; 0x78 + 1f05e50: e3e0107f mvn r1, #127 ; 0x7f + 1f05e54: e5842018 str r2, [r4, #24] + 1f05e58: e1833400 orr r3, r3, r0, lsl #8 + 1f05e5c: e5842014 str r2, [r4, #20] + 1f05e60: e3530001 cmp r3, #1 + 1f05e64: e5c41004 strb r1, [r4, #4] + 1f05e68: 0a0000a2 beq 1f060f8 + 1f05e6c: e3a03003 mov r3, #3 + 1f05e70: eaffff01 b 1f05a7c + 1f05e74: e3560000 cmp r6, #0 + 1f05e78: e2833002 add r3, r3, #2 + 1f05e7c: e0800005 add r0, r0, r5 + 1f05e80: e08ee005 add lr, lr, r5 + 1f05e84: e584302c str r3, [r4, #44] ; 0x2c + 1f05e88: e5840038 str r0, [r4, #56] ; 0x38 + 1f05e8c: e5845034 str r5, [r4, #52] ; 0x34 + 1f05e90: e584e040 str lr, [r4, #64] ; 0x40 + 1f05e94: 0afffe97 beq 1f058f8 + 1f05e98: e1a03083 lsl r3, r3, #1 + 1f05e9c: e08c0000 add r0, ip, r0 + 1f05ea0: e2833f7f add r3, r3, #508 ; 0x1fc + 1f05ea4: e584003c str r0, [r4, #60] ; 0x3c + 1f05ea8: e2833003 add r3, r3, #3 + 1f05eac: e15104a3 cmp r1, r3, lsr #9 + 1f05eb0: 3afffe90 bcc 1f058f8 + 1f05eb4: e3e02000 mvn r2, #0 + 1f05eb8: e3e0107f mvn r1, #127 ; 0x7f + 1f05ebc: e5842018 str r2, [r4, #24] + 1f05ec0: e3a03002 mov r3, #2 + 1f05ec4: e5842014 str r2, [r4, #20] + 1f05ec8: e5c41004 strb r1, [r4, #4] + 1f05ecc: eafffeea b 1f05a7c + 1f05ed0: e2841f4f add r1, r4, #316 ; 0x13c + 1f05ed4: e5d4213d ldrb r2, [r4, #317] ; 0x13d + 1f05ed8: e2811002 add r1, r1, #2 + 1f05edc: e5d4313c ldrb r3, [r4, #316] ; 0x13c + 1f05ee0: e1d110b0 ldrh r1, [r1] + 1f05ee4: e1822401 orr r2, r2, r1, lsl #8 + 1f05ee8: e1833402 orr r3, r3, r2, lsl #8 + 1f05eec: e3530002 cmp r3, #2 + 1f05ef0: 1affff8b bne 1f05d24 + 1f05ef4: eaffffab b 1f05da8 + 1f05ef8: e2841f47 add r1, r4, #284 ; 0x11c + 1f05efc: e5d4211d ldrb r2, [r4, #285] ; 0x11d + 1f05f00: e2811002 add r1, r1, #2 + 1f05f04: e5d4311c ldrb r3, [r4, #284] ; 0x11c + 1f05f08: e1d110b0 ldrh r1, [r1] + 1f05f0c: e1822401 orr r2, r2, r1, lsl #8 + 1f05f10: e1833402 orr r3, r3, r2, lsl #8 + 1f05f14: e3530002 cmp r3, #2 + 1f05f18: 1affff7e bne 1f05d18 + 1f05f1c: eaffffa1 b 1f05da8 + 1f05f20: e1d41fbe ldrh r1, [r4, #254] ; 0xfe + 1f05f24: e5d420fd ldrb r2, [r4, #253] ; 0xfd + 1f05f28: e5d430fc ldrb r3, [r4, #252] ; 0xfc + 1f05f2c: e1822401 orr r2, r2, r1, lsl #8 + 1f05f30: e1833402 orr r3, r3, r2, lsl #8 + 1f05f34: e3530002 cmp r3, #2 + 1f05f38: 1affff73 bne 1f05d0c + 1f05f3c: eaffff99 b 1f05da8 + 1f05f40: e1d41dbe ldrh r1, [r4, #222] ; 0xde + 1f05f44: e5d420dd ldrb r2, [r4, #221] ; 0xdd + 1f05f48: e5d430dc ldrb r3, [r4, #220] ; 0xdc + 1f05f4c: e1822401 orr r2, r2, r1, lsl #8 + 1f05f50: e1833402 orr r3, r3, r2, lsl #8 + 1f05f54: e3530002 cmp r3, #2 + 1f05f58: 1affff68 bne 1f05d00 + 1f05f5c: eaffff91 b 1f05da8 + 1f05f60: e1d41bbe ldrh r1, [r4, #190] ; 0xbe + 1f05f64: e5d420bd ldrb r2, [r4, #189] ; 0xbd + 1f05f68: e5d430bc ldrb r3, [r4, #188] ; 0xbc + 1f05f6c: e1822401 orr r2, r2, r1, lsl #8 + 1f05f70: e1833402 orr r3, r3, r2, lsl #8 + 1f05f74: e3530002 cmp r3, #2 + 1f05f78: 1affff5d bne 1f05cf4 + 1f05f7c: eaffff89 b 1f05da8 + 1f05f80: e1d419be ldrh r1, [r4, #158] ; 0x9e + 1f05f84: e5d4209d ldrb r2, [r4, #157] ; 0x9d + 1f05f88: e5d4309c ldrb r3, [r4, #156] ; 0x9c + 1f05f8c: e1822401 orr r2, r2, r1, lsl #8 + 1f05f90: e1833402 orr r3, r3, r2, lsl #8 + 1f05f94: e3530002 cmp r3, #2 + 1f05f98: 1affff52 bne 1f05ce8 + 1f05f9c: eaffff81 b 1f05da8 + 1f05fa0: e1d417be ldrh r1, [r4, #126] ; 0x7e + 1f05fa4: e5d4207d ldrb r2, [r4, #125] ; 0x7d + 1f05fa8: e5d4307c ldrb r3, [r4, #124] ; 0x7c + 1f05fac: e1822401 orr r2, r2, r1, lsl #8 + 1f05fb0: e1833402 orr r3, r3, r2, lsl #8 + 1f05fb4: e3530002 cmp r3, #2 + 1f05fb8: 1affff47 bne 1f05cdc + 1f05fbc: eaffff79 b 1f05da8 + 1f05fc0: e1d415be ldrh r1, [r4, #94] ; 0x5e + 1f05fc4: e5d4205d ldrb r2, [r4, #93] ; 0x5d + 1f05fc8: e5d4305c ldrb r3, [r4, #92] ; 0x5c + 1f05fcc: e1822401 orr r2, r2, r1, lsl #8 + 1f05fd0: e1833402 orr r3, r3, r2, lsl #8 + 1f05fd4: e3530002 cmp r3, #2 + 1f05fd8: 1affff3c bne 1f05cd0 + 1f05fdc: eaffff71 b 1f05da8 + 1f05fe0: e2841f6f add r1, r4, #444 ; 0x1bc + 1f05fe4: e5d421bd ldrb r2, [r4, #445] ; 0x1bd + 1f05fe8: e2811002 add r1, r1, #2 + 1f05fec: e5d431bc ldrb r3, [r4, #444] ; 0x1bc + 1f05ff0: e1d110b0 ldrh r1, [r1] + 1f05ff4: e1822401 orr r2, r2, r1, lsl #8 + 1f05ff8: e1833402 orr r3, r3, r2, lsl #8 + 1f05ffc: e3530002 cmp r3, #2 + 1f06000: 1affff53 bne 1f05d54 + 1f06004: eaffff67 b 1f05da8 + 1f06008: e2841f67 add r1, r4, #412 ; 0x19c + 1f0600c: e5d4219d ldrb r2, [r4, #413] ; 0x19d + 1f06010: e2811002 add r1, r1, #2 + 1f06014: e5d4319c ldrb r3, [r4, #412] ; 0x19c + 1f06018: e1d110b0 ldrh r1, [r1] + 1f0601c: e1822401 orr r2, r2, r1, lsl #8 + 1f06020: e1833402 orr r3, r3, r2, lsl #8 + 1f06024: e3530002 cmp r3, #2 + 1f06028: 1affff46 bne 1f05d48 + 1f0602c: eaffff5d b 1f05da8 + 1f06030: e2841f5f add r1, r4, #380 ; 0x17c + 1f06034: e5d4217d ldrb r2, [r4, #381] ; 0x17d + 1f06038: e2811002 add r1, r1, #2 + 1f0603c: e5d4317c ldrb r3, [r4, #380] ; 0x17c + 1f06040: e1d110b0 ldrh r1, [r1] + 1f06044: e1822401 orr r2, r2, r1, lsl #8 + 1f06048: e1833402 orr r3, r3, r2, lsl #8 + 1f0604c: e3530002 cmp r3, #2 + 1f06050: 1affff39 bne 1f05d3c + 1f06054: eaffff53 b 1f05da8 + 1f06058: e2841f57 add r1, r4, #348 ; 0x15c + 1f0605c: e5d4215d ldrb r2, [r4, #349] ; 0x15d + 1f06060: e2811002 add r1, r1, #2 + 1f06064: e5d4315c ldrb r3, [r4, #348] ; 0x15c + 1f06068: e1d110b0 ldrh r1, [r1] + 1f0606c: e1822401 orr r2, r2, r1, lsl #8 + 1f06070: e1833402 orr r3, r3, r2, lsl #8 + 1f06074: e3530002 cmp r3, #2 + 1f06078: 1affff2c bne 1f05d30 + 1f0607c: eaffff49 b 1f05da8 + 1f06080: e2841f7f add r1, r4, #508 ; 0x1fc + 1f06084: e5d421fd ldrb r2, [r4, #509] ; 0x1fd + 1f06088: e2811002 add r1, r1, #2 + 1f0608c: e5d431fc ldrb r3, [r4, #508] ; 0x1fc + 1f06090: e1d110b0 ldrh r1, [r1] + 1f06094: e1822401 orr r2, r2, r1, lsl #8 + 1f06098: e1833402 orr r3, r3, r2, lsl #8 + 1f0609c: e3530002 cmp r3, #2 + 1f060a0: 1affff31 bne 1f05d6c + 1f060a4: eaffff3f b 1f05da8 + 1f060a8: e2841f77 add r1, r4, #476 ; 0x1dc + 1f060ac: e5d421dd ldrb r2, [r4, #477] ; 0x1dd + 1f060b0: e2811002 add r1, r1, #2 + 1f060b4: e5d431dc ldrb r3, [r4, #476] ; 0x1dc + 1f060b8: e1d110b0 ldrh r1, [r1] + 1f060bc: e1822401 orr r2, r2, r1, lsl #8 + 1f060c0: e1833402 orr r3, r3, r2, lsl #8 + 1f060c4: e3530002 cmp r3, #2 + 1f060c8: 1affff24 bne 1f05d60 + 1f060cc: eaffff35 b 1f05da8 + 1f060d0: e2841f87 add r1, r4, #540 ; 0x21c + 1f060d4: e5d4221d ldrb r2, [r4, #541] ; 0x21d + 1f060d8: e2811002 add r1, r1, #2 + 1f060dc: e5d4321c ldrb r3, [r4, #540] ; 0x21c + 1f060e0: e1d110b0 ldrh r1, [r1] + 1f060e4: e1822401 orr r2, r2, r1, lsl #8 + 1f060e8: e1833402 orr r3, r3, r2, lsl #8 + 1f060ec: e3530002 cmp r3, #2 + 1f060f0: 1affff20 bne 1f05d78 + 1f060f4: eaffff2b b 1f05da8 + 1f060f8: e2851001 add r1, r5, #1 + 1f060fc: e1a00004 mov r0, r4 + 1f06100: ebfffd50 bl 1f05648 + 1f06104: e3500000 cmp r0, #0 + 1f06108: 1affff57 bne 1f05e6c + 1f0610c: e5d41247 ldrb r1, [r4, #583] ; 0x247 + 1f06110: e30a2a55 movw r2, #43605 ; 0xaa55 + 1f06114: e5d43246 ldrb r3, [r4, #582] ; 0x246 + 1f06118: e5c40004 strb r0, [r4, #4] + 1f0611c: e1833401 orr r3, r3, r1, lsl #8 + 1f06120: e1530002 cmp r3, r2 + 1f06124: 1affff50 bne 1f05e6c + 1f06128: e1d404ba ldrh r0, [r4, #74] ; 0x4a + 1f0612c: e3051252 movw r1, #21074 ; 0x5252 + 1f06130: e3441161 movt r1, #16737 ; 0x4161 + 1f06134: e5d42049 ldrb r2, [r4, #73] ; 0x49 + 1f06138: e5d43048 ldrb r3, [r4, #72] ; 0x48 + 1f0613c: e1822400 orr r2, r2, r0, lsl #8 + 1f06140: e1833402 orr r3, r3, r2, lsl #8 + 1f06144: e1530001 cmp r3, r1 + 1f06148: 1affff47 bne 1f05e6c + 1f0614c: e2841f8b add r1, r4, #556 ; 0x22c + 1f06150: e5d4222d ldrb r2, [r4, #557] ; 0x22d + 1f06154: e2811002 add r1, r1, #2 + 1f06158: e5d4322c ldrb r3, [r4, #556] ; 0x22c + 1f0615c: e3070272 movw r0, #29298 ; 0x7272 + 1f06160: e3460141 movt r0, #24897 ; 0x6141 + 1f06164: e1d110b0 ldrh r1, [r1] + 1f06168: e1822401 orr r2, r2, r1, lsl #8 + 1f0616c: e1833402 orr r3, r3, r2, lsl #8 + 1f06170: e1530000 cmp r3, r0 + 1f06174: 1affff3c bne 1f05e6c + 1f06178: e2843e23 add r3, r4, #560 ; 0x230 + 1f0617c: e5d4e231 ldrb lr, [r4, #561] ; 0x231 + 1f06180: e5d4c230 ldrb ip, [r4, #560] ; 0x230 + 1f06184: e2840f8d add r0, r4, #564 ; 0x234 + 1f06188: e2800002 add r0, r0, #2 + 1f0618c: e5d41235 ldrb r1, [r4, #565] ; 0x235 + 1f06190: e1d350b2 ldrh r5, [r3, #2] + 1f06194: e3a03003 mov r3, #3 + 1f06198: e5d42234 ldrb r2, [r4, #564] ; 0x234 + 1f0619c: e18ee405 orr lr, lr, r5, lsl #8 + 1f061a0: e18cc40e orr ip, ip, lr, lsl #8 + 1f061a4: e584c018 str ip, [r4, #24] + 1f061a8: e1d000b0 ldrh r0, [r0] + 1f061ac: e1811400 orr r1, r1, r0, lsl #8 + 1f061b0: e1822401 orr r2, r2, r1, lsl #8 + 1f061b4: e5842014 str r2, [r4, #20] + 1f061b8: eafffe2f b 1f05a7c + +01f061bc : + 1f061bc: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f061c0: e1a04000 mov r4, r0 + 1f061c4: e5d03003 ldrb r3, [r0, #3] + 1f061c8: e3530000 cmp r3, #0 + 1f061cc: 1a000009 bne 1f061f8 + 1f061d0: e5d43000 ldrb r3, [r4] + 1f061d4: e3530003 cmp r3, #3 + 1f061d8: 0a000026 beq 1f06278 + 1f061dc: e3a02000 mov r2, #0 + 1f061e0: e5d40001 ldrb r0, [r4, #1] + 1f061e4: e1a01002 mov r1, r2 + 1f061e8: eb008174 bl 1f267c0 + 1f061ec: e2900000 adds r0, r0, #0 + 1f061f0: 13a00001 movne r0, #1 + 1f061f4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f061f8: e5905044 ldr r5, [r0, #68] ; 0x44 + 1f061fc: e2807048 add r7, r0, #72 ; 0x48 + 1f06200: e1a01007 mov r1, r7 + 1f06204: e3a03001 mov r3, #1 + 1f06208: e1a02005 mov r2, r5 + 1f0620c: e5d00001 ldrb r0, [r0, #1] + 1f06210: eb00814c bl 1f26748 + 1f06214: e3500000 cmp r0, #0 + 1f06218: 1a000014 bne 1f06270 + 1f0621c: e5942038 ldr r2, [r4, #56] ; 0x38 + 1f06220: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f06224: e0622005 rsb r2, r2, r5 + 1f06228: e5c40003 strb r0, [r4, #3] + 1f0622c: e1520003 cmp r2, r3 + 1f06230: 2affffe6 bcs 1f061d0 + 1f06234: e5d46002 ldrb r6, [r4, #2] + 1f06238: e3560001 cmp r6, #1 + 1f0623c: 8a000001 bhi 1f06248 + 1f06240: eaffffe2 b 1f061d0 + 1f06244: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f06248: e0855003 add r5, r5, r3 + 1f0624c: e2466001 sub r6, r6, #1 + 1f06250: e1a02005 mov r2, r5 + 1f06254: e3a03001 mov r3, #1 + 1f06258: e1a01007 mov r1, r7 + 1f0625c: e5d40001 ldrb r0, [r4, #1] + 1f06260: eb008138 bl 1f26748 + 1f06264: e3560001 cmp r6, #1 + 1f06268: 1afffff5 bne 1f06244 + 1f0626c: eaffffd7 b 1f061d0 + 1f06270: e3a00001 mov r0, #1 + 1f06274: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f06278: e5d43004 ldrb r3, [r4, #4] + 1f0627c: e3530001 cmp r3, #1 + 1f06280: 1affffd5 bne 1f061dc + 1f06284: e2841048 add r1, r4, #72 ; 0x48 + 1f06288: e2013007 and r3, r1, #7 + 1f0628c: e2633000 rsb r3, r3, #0 + 1f06290: e213300f ands r3, r3, #15 + 1f06294: 0a00009f beq 1f06518 + 1f06298: e3530001 cmp r3, #1 + 1f0629c: e3a02000 mov r2, #0 + 1f062a0: e2840049 add r0, r4, #73 ; 0x49 + 1f062a4: e5c42048 strb r2, [r4, #72] ; 0x48 + 1f062a8: 0a0000ae beq 1f06568 + 1f062ac: e3530002 cmp r3, #2 + 1f062b0: e5c42049 strb r2, [r4, #73] ; 0x49 + 1f062b4: e284004a add r0, r4, #74 ; 0x4a + 1f062b8: 0a0000ae beq 1f06578 + 1f062bc: e3530003 cmp r3, #3 + 1f062c0: e5c4204a strb r2, [r4, #74] ; 0x4a + 1f062c4: e284004b add r0, r4, #75 ; 0x4b + 1f062c8: 0a0000a8 beq 1f06570 + 1f062cc: e3530004 cmp r3, #4 + 1f062d0: e5c4204b strb r2, [r4, #75] ; 0x4b + 1f062d4: e284004c add r0, r4, #76 ; 0x4c + 1f062d8: 0a0000ae beq 1f06598 + 1f062dc: e3530005 cmp r3, #5 + 1f062e0: e5c4204c strb r2, [r4, #76] ; 0x4c + 1f062e4: e284004d add r0, r4, #77 ; 0x4d + 1f062e8: 0a0000a8 beq 1f06590 + 1f062ec: e3530006 cmp r3, #6 + 1f062f0: e5c4204d strb r2, [r4, #77] ; 0x4d + 1f062f4: e284004e add r0, r4, #78 ; 0x4e + 1f062f8: 0a0000a2 beq 1f06588 + 1f062fc: e3530007 cmp r3, #7 + 1f06300: e5c4204e strb r2, [r4, #78] ; 0x4e + 1f06304: e284004f add r0, r4, #79 ; 0x4f + 1f06308: 0a00009c beq 1f06580 + 1f0630c: e3530008 cmp r3, #8 + 1f06310: e2840050 add r0, r4, #80 ; 0x50 + 1f06314: e5c4204f strb r2, [r4, #79] ; 0x4f + 1f06318: 0a00008e beq 1f06558 + 1f0631c: e3530009 cmp r3, #9 + 1f06320: e5c42050 strb r2, [r4, #80] ; 0x50 + 1f06324: e2840051 add r0, r4, #81 ; 0x51 + 1f06328: 0a000088 beq 1f06550 + 1f0632c: e353000a cmp r3, #10 + 1f06330: e5c42051 strb r2, [r4, #81] ; 0x51 + 1f06334: e2840052 add r0, r4, #82 ; 0x52 + 1f06338: 0a000082 beq 1f06548 + 1f0633c: e353000b cmp r3, #11 + 1f06340: e5c42052 strb r2, [r4, #82] ; 0x52 + 1f06344: e2840053 add r0, r4, #83 ; 0x53 + 1f06348: 0a00007c beq 1f06540 + 1f0634c: e353000c cmp r3, #12 + 1f06350: e5c42053 strb r2, [r4, #83] ; 0x53 + 1f06354: e2840054 add r0, r4, #84 ; 0x54 + 1f06358: 0a000076 beq 1f06538 + 1f0635c: e353000d cmp r3, #13 + 1f06360: e5c42054 strb r2, [r4, #84] ; 0x54 + 1f06364: e2840055 add r0, r4, #85 ; 0x55 + 1f06368: 0a000070 beq 1f06530 + 1f0636c: e353000f cmp r3, #15 + 1f06370: e5c42055 strb r2, [r4, #85] ; 0x55 + 1f06374: e2840056 add r0, r4, #86 ; 0x56 + 1f06378: 1a000078 bne 1f06560 + 1f0637c: e5c42056 strb r2, [r4, #86] ; 0x56 + 1f06380: e2840057 add r0, r4, #87 ; 0x57 + 1f06384: e30021f1 movw r2, #497 ; 0x1f1 + 1f06388: e2636c02 rsb r6, r3, #512 ; 0x200 + 1f0638c: e3a05e1f mov r5, #496 ; 0x1f0 + 1f06390: e3a0e01f mov lr, #31 + 1f06394: f2c00050 vmov.i32 q8, #0 ; 0x00000000 + 1f06398: e0813003 add r3, r1, r3 + 1f0639c: e3a0c000 mov ip, #0 + 1f063a0: e28cc001 add ip, ip, #1 + 1f063a4: f4430adf vst1.64 {d16-d17}, [r3 :64] + 1f063a8: e15c000e cmp ip, lr + 1f063ac: e2833010 add r3, r3, #16 + 1f063b0: 3afffffa bcc 1f063a0 + 1f063b4: e1560005 cmp r6, r5 + 1f063b8: e0653002 rsb r3, r5, r2 + 1f063bc: e0802005 add r2, r0, r5 + 1f063c0: 0a00002a beq 1f06470 + 1f063c4: e3530001 cmp r3, #1 + 1f063c8: e3a0c000 mov ip, #0 + 1f063cc: e7c0c005 strb ip, [r0, r5] + 1f063d0: 0a000026 beq 1f06470 + 1f063d4: e3530002 cmp r3, #2 + 1f063d8: e5c2c001 strb ip, [r2, #1] + 1f063dc: 0a000023 beq 1f06470 + 1f063e0: e3530003 cmp r3, #3 + 1f063e4: e5c2c002 strb ip, [r2, #2] + 1f063e8: 0a000020 beq 1f06470 + 1f063ec: e3530004 cmp r3, #4 + 1f063f0: e5c2c003 strb ip, [r2, #3] + 1f063f4: 0a00001d beq 1f06470 + 1f063f8: e3530005 cmp r3, #5 + 1f063fc: e5c2c004 strb ip, [r2, #4] + 1f06400: 0a00001a beq 1f06470 + 1f06404: e3530006 cmp r3, #6 + 1f06408: e5c2c005 strb ip, [r2, #5] + 1f0640c: 0a000017 beq 1f06470 + 1f06410: e3530007 cmp r3, #7 + 1f06414: e5c2c006 strb ip, [r2, #6] + 1f06418: 0a000014 beq 1f06470 + 1f0641c: e3530008 cmp r3, #8 + 1f06420: e5c2c007 strb ip, [r2, #7] + 1f06424: 0a000011 beq 1f06470 + 1f06428: e3530009 cmp r3, #9 + 1f0642c: e5c2c008 strb ip, [r2, #8] + 1f06430: 0a00000e beq 1f06470 + 1f06434: e353000a cmp r3, #10 + 1f06438: e5c2c009 strb ip, [r2, #9] + 1f0643c: 0a00000b beq 1f06470 + 1f06440: e353000b cmp r3, #11 + 1f06444: e5c2c00a strb ip, [r2, #10] + 1f06448: 0a000008 beq 1f06470 + 1f0644c: e353000c cmp r3, #12 + 1f06450: e5c2c00b strb ip, [r2, #11] + 1f06454: 0a000005 beq 1f06470 + 1f06458: e353000d cmp r3, #13 + 1f0645c: e5c2c00c strb ip, [r2, #12] + 1f06460: 0a000002 beq 1f06470 + 1f06464: e353000e cmp r3, #14 + 1f06468: e5c2c00d strb ip, [r2, #13] + 1f0646c: 15c2c00e strbne ip, [r2, #14] + 1f06470: e5942018 ldr r2, [r4, #24] + 1f06474: e3a05052 mov r5, #82 ; 0x52 + 1f06478: e5943014 ldr r3, [r4, #20] + 1f0647c: e3a07055 mov r7, #85 ; 0x55 + 1f06480: e5940034 ldr r0, [r4, #52] ; 0x34 + 1f06484: e3e06055 mvn r6, #85 ; 0x55 + 1f06488: e1a0c422 lsr ip, r2, #8 + 1f0648c: e5c42230 strb r2, [r4, #560] ; 0x230 + 1f06490: e2800001 add r0, r0, #1 + 1f06494: e1a0e423 lsr lr, r3, #8 + 1f06498: e5c4c231 strb ip, [r4, #561] ; 0x231 + 1f0649c: e1a0c822 lsr ip, r2, #16 + 1f064a0: e5c43234 strb r3, [r4, #564] ; 0x234 + 1f064a4: e1a02c22 lsr r2, r2, #24 + 1f064a8: e5c4c232 strb ip, [r4, #562] ; 0x232 + 1f064ac: e1a0c823 lsr ip, r3, #16 + 1f064b0: e5c42233 strb r2, [r4, #563] ; 0x233 + 1f064b4: e1a03c23 lsr r3, r3, #24 + 1f064b8: e5c4e235 strb lr, [r4, #565] ; 0x235 + 1f064bc: e1a02000 mov r2, r0 + 1f064c0: e3a0e061 mov lr, #97 ; 0x61 + 1f064c4: e5c4c236 strb ip, [r4, #566] ; 0x236 + 1f064c8: e5c43237 strb r3, [r4, #567] ; 0x237 + 1f064cc: e3a0c041 mov ip, #65 ; 0x41 + 1f064d0: e5840044 str r0, [r4, #68] ; 0x44 + 1f064d4: e3a03001 mov r3, #1 + 1f064d8: e3a00072 mov r0, #114 ; 0x72 + 1f064dc: e5c47246 strb r7, [r4, #582] ; 0x246 + 1f064e0: e5c4022c strb r0, [r4, #556] ; 0x22c + 1f064e4: e5c4022d strb r0, [r4, #557] ; 0x22d + 1f064e8: e5c46247 strb r6, [r4, #583] ; 0x247 + 1f064ec: e5c45048 strb r5, [r4, #72] ; 0x48 + 1f064f0: e5c45049 strb r5, [r4, #73] ; 0x49 + 1f064f4: e5c4e04a strb lr, [r4, #74] ; 0x4a + 1f064f8: e5c4e22f strb lr, [r4, #559] ; 0x22f + 1f064fc: e5c4c04b strb ip, [r4, #75] ; 0x4b + 1f06500: e5c4c22e strb ip, [r4, #558] ; 0x22e + 1f06504: e5d40001 ldrb r0, [r4, #1] + 1f06508: eb00808e bl 1f26748 + 1f0650c: e3a03000 mov r3, #0 + 1f06510: e5c43004 strb r3, [r4, #4] + 1f06514: eaffff30 b 1f061dc + 1f06518: e3a05c02 mov r5, #512 ; 0x200 + 1f0651c: e1a00001 mov r0, r1 + 1f06520: e1a06005 mov r6, r5 + 1f06524: e1a02005 mov r2, r5 + 1f06528: e3a0e020 mov lr, #32 + 1f0652c: eaffff98 b 1f06394 + 1f06530: e30021f3 movw r2, #499 ; 0x1f3 + 1f06534: eaffff93 b 1f06388 + 1f06538: e3a02f7d mov r2, #500 ; 0x1f4 + 1f0653c: eaffff91 b 1f06388 + 1f06540: e30021f5 movw r2, #501 ; 0x1f5 + 1f06544: eaffff8f b 1f06388 + 1f06548: e30021f6 movw r2, #502 ; 0x1f6 + 1f0654c: eaffff8d b 1f06388 + 1f06550: e30021f7 movw r2, #503 ; 0x1f7 + 1f06554: eaffff8b b 1f06388 + 1f06558: e3a02f7e mov r2, #504 ; 0x1f8 + 1f0655c: eaffff89 b 1f06388 + 1f06560: e30021f2 movw r2, #498 ; 0x1f2 + 1f06564: eaffff87 b 1f06388 + 1f06568: e30021ff movw r2, #511 ; 0x1ff + 1f0656c: eaffff85 b 1f06388 + 1f06570: e30021fd movw r2, #509 ; 0x1fd + 1f06574: eaffff83 b 1f06388 + 1f06578: e30021fe movw r2, #510 ; 0x1fe + 1f0657c: eaffff81 b 1f06388 + 1f06580: e30021f9 movw r2, #505 ; 0x1f9 + 1f06584: eaffff7f b 1f06388 + 1f06588: e30021fa movw r2, #506 ; 0x1fa + 1f0658c: eaffff7d b 1f06388 + 1f06590: e30021fb movw r2, #507 ; 0x1fb + 1f06594: eaffff7b b 1f06388 + 1f06598: e3a02f7f mov r2, #508 ; 0x1fc + 1f0659c: eaffff79 b 1f06388 + +01f065a0 : + 1f065a0: e92d4ff8 push {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f065a4: e1a06001 mov r6, r1 + 1f065a8: e1a04000 mov r4, r0 + 1f065ac: e5d01000 ldrb r1, [r0] + 1f065b0: e1a07002 mov r7, r2 + 1f065b4: e2413001 sub r3, r1, #1 + 1f065b8: e3530003 cmp r3, #3 + 1f065bc: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f065c0: ea00010a b 1f069f0 + 1f065c4: 01f066f0 .word 0x01f066f0 + 1f065c8: 01f06680 .word 0x01f06680 + 1f065cc: 01f065d4 .word 0x01f065d4 + 1f065d0: 01f065d4 .word 0x01f065d4 + 1f065d4: e5909038 ldr r9, [r0, #56] ; 0x38 + 1f065d8: e5908044 ldr r8, [r0, #68] ; 0x44 + 1f065dc: e08993a6 add r9, r9, r6, lsr #7 + 1f065e0: e1590008 cmp r9, r8 + 1f065e4: 0a0000f8 beq 1f069cc + 1f065e8: e5d03003 ldrb r3, [r0, #3] + 1f065ec: e2805048 add r5, r0, #72 ; 0x48 + 1f065f0: e3530000 cmp r3, #0 + 1f065f4: 1a0000bf bne 1f068f8 + 1f065f8: e3a03001 mov r3, #1 + 1f065fc: e1a01005 mov r1, r5 + 1f06600: e1a02009 mov r2, r9 + 1f06604: e5d40001 ldrb r0, [r4, #1] + 1f06608: eb008030 bl 1f266d0 + 1f0660c: e3500000 cmp r0, #0 + 1f06610: 1a0000d6 bne 1f06970 + 1f06614: e5d41000 ldrb r1, [r4] + 1f06618: e5849044 str r9, [r4, #68] ; 0x44 + 1f0661c: e3510004 cmp r1, #4 + 1f06620: 01a03106 lsleq r3, r6, #2 + 1f06624: 02033f7f andeq r3, r3, #508 ; 0x1fc + 1f06628: 00853003 addeq r3, r5, r3 + 1f0662c: 0a000008 beq 1f06654 + 1f06630: e1a06106 lsl r6, r6, #2 + 1f06634: e3c7720f bic r7, r7, #-268435456 ; 0xf0000000 + 1f06638: e2066f7f and r6, r6, #508 ; 0x1fc + 1f0663c: e0855006 add r5, r5, r6 + 1f06640: e1a03005 mov r3, r5 + 1f06644: e1d520b2 ldrh r2, [r5, #2] + 1f06648: e1a02802 lsl r2, r2, #16 + 1f0664c: e202220f and r2, r2, #-268435456 ; 0xf0000000 + 1f06650: e1827007 orr r7, r2, r7 + 1f06654: e5c37000 strb r7, [r3] + 1f06658: e1a01427 lsr r1, r7, #8 + 1f0665c: e1a02827 lsr r2, r7, #16 + 1f06660: e5c31001 strb r1, [r3, #1] + 1f06664: e5c32002 strb r2, [r3, #2] + 1f06668: e1a07c27 lsr r7, r7, #24 + 1f0666c: e3a02001 mov r2, #1 + 1f06670: e5c37003 strb r7, [r3, #3] + 1f06674: e3a00000 mov r0, #0 + 1f06678: e5c42003 strb r2, [r4, #3] + 1f0667c: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f06680: e5908038 ldr r8, [r0, #56] ; 0x38 + 1f06684: e590a044 ldr sl, [r0, #68] ; 0x44 + 1f06688: e0888426 add r8, r8, r6, lsr #8 + 1f0668c: e158000a cmp r8, sl + 1f06690: 0a0000d1 beq 1f069dc + 1f06694: e5d03003 ldrb r3, [r0, #3] + 1f06698: e2805048 add r5, r0, #72 ; 0x48 + 1f0669c: e3530000 cmp r3, #0 + 1f066a0: 1a00005c bne 1f06818 + 1f066a4: e3a03001 mov r3, #1 + 1f066a8: e1a01005 mov r1, r5 + 1f066ac: e1a02008 mov r2, r8 + 1f066b0: e5d40001 ldrb r0, [r4, #1] + 1f066b4: eb008005 bl 1f266d0 + 1f066b8: e3500000 cmp r0, #0 + 1f066bc: 1a0000ab bne 1f06970 + 1f066c0: e5848044 str r8, [r4, #68] ; 0x44 + 1f066c4: e1a06086 lsl r6, r6, #1 + 1f066c8: e30031fe movw r3, #510 ; 0x1fe + 1f066cc: e0033006 and r3, r3, r6 + 1f066d0: e1a0c447 asr ip, r7, #8 + 1f066d4: e0851003 add r1, r5, r3 + 1f066d8: e3a02001 mov r2, #1 + 1f066dc: e3a00000 mov r0, #0 + 1f066e0: e7c57003 strb r7, [r5, r3] + 1f066e4: e5c1c001 strb ip, [r1, #1] + 1f066e8: e5c42003 strb r2, [r4, #3] + 1f066ec: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f066f0: e08690a6 add r9, r6, r6, lsr #1 + 1f066f4: e590a038 ldr sl, [r0, #56] ; 0x38 + 1f066f8: e590b044 ldr fp, [r0, #68] ; 0x44 + 1f066fc: e08aa4a9 add sl, sl, r9, lsr #9 + 1f06700: e15a000b cmp sl, fp + 1f06704: 0a0000b2 beq 1f069d4 + 1f06708: e5d03003 ldrb r3, [r0, #3] + 1f0670c: e2805048 add r5, r0, #72 ; 0x48 + 1f06710: e3530000 cmp r3, #0 + 1f06714: 1a00005b bne 1f06888 + 1f06718: e3a03001 mov r3, #1 + 1f0671c: e1a01005 mov r1, r5 + 1f06720: e1a0200a mov r2, sl + 1f06724: e5d40001 ldrb r0, [r4, #1] + 1f06728: eb007fe8 bl 1f266d0 + 1f0672c: e3500000 cmp r0, #0 + 1f06730: 1a00008e bne 1f06970 + 1f06734: e584a044 str sl, [r4, #68] ; 0x44 + 1f06738: e2166001 ands r6, r6, #1 + 1f0673c: e289a001 add sl, r9, #1 + 1f06740: e7e89059 ubfx r9, r9, #0, #9 + 1f06744: 0a00008d beq 1f06980 + 1f06748: e7d53009 ldrb r3, [r5, r9] + 1f0674c: e3a02001 mov r2, #1 + 1f06750: e203300f and r3, r3, #15 + 1f06754: e1833207 orr r3, r3, r7, lsl #4 + 1f06758: e7c53009 strb r3, [r5, r9] + 1f0675c: e5c42003 strb r2, [r4, #3] + 1f06760: e5949038 ldr r9, [r4, #56] ; 0x38 + 1f06764: e5948044 ldr r8, [r4, #68] ; 0x44 + 1f06768: e08994aa add r9, r9, sl, lsr #9 + 1f0676c: e1580009 cmp r8, r9 + 1f06770: 0a00009b beq 1f069e4 + 1f06774: e3a03001 mov r3, #1 + 1f06778: e1a02008 mov r2, r8 + 1f0677c: e1a01005 mov r1, r5 + 1f06780: e5d40001 ldrb r0, [r4, #1] + 1f06784: eb007fef bl 1f26748 + 1f06788: e3500000 cmp r0, #0 + 1f0678c: 1a000075 bne 1f06968 + 1f06790: e5942038 ldr r2, [r4, #56] ; 0x38 + 1f06794: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f06798: e0622008 rsb r2, r2, r8 + 1f0679c: e5c40003 strb r0, [r4, #3] + 1f067a0: e1520003 cmp r2, r3 + 1f067a4: 2a00000d bcs 1f067e0 + 1f067a8: e5d4b002 ldrb fp, [r4, #2] + 1f067ac: e35b0001 cmp fp, #1 + 1f067b0: 8a000001 bhi 1f067bc + 1f067b4: ea000009 b 1f067e0 + 1f067b8: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f067bc: e0888003 add r8, r8, r3 + 1f067c0: e24bb001 sub fp, fp, #1 + 1f067c4: e1a02008 mov r2, r8 + 1f067c8: e3a03001 mov r3, #1 + 1f067cc: e1a01005 mov r1, r5 + 1f067d0: e5d40001 ldrb r0, [r4, #1] + 1f067d4: eb007fdb bl 1f26748 + 1f067d8: e35b0001 cmp fp, #1 + 1f067dc: 1afffff5 bne 1f067b8 + 1f067e0: e3a03001 mov r3, #1 + 1f067e4: e1a02009 mov r2, r9 + 1f067e8: e1a01005 mov r1, r5 + 1f067ec: e5d40001 ldrb r0, [r4, #1] + 1f067f0: eb007fb6 bl 1f266d0 + 1f067f4: e3500000 cmp r0, #0 + 1f067f8: 1a00005c bne 1f06970 + 1f067fc: e3560000 cmp r6, #0 + 1f06800: e7e8a05a ubfx sl, sl, #0, #9 + 1f06804: e085500a add r5, r5, sl + 1f06808: e5849044 str r9, [r4, #68] ; 0x44 + 1f0680c: 0a000065 beq 1f069a8 + 1f06810: e7e77257 ubfx r7, r7, #4, #8 + 1f06814: ea000067 b 1f069b8 + 1f06818: e3a03001 mov r3, #1 + 1f0681c: e1a01005 mov r1, r5 + 1f06820: e1a0200a mov r2, sl + 1f06824: e5d00001 ldrb r0, [r0, #1] + 1f06828: eb007fc6 bl 1f26748 + 1f0682c: e3500000 cmp r0, #0 + 1f06830: 1a00004c bne 1f06968 + 1f06834: e5942038 ldr r2, [r4, #56] ; 0x38 + 1f06838: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f0683c: e062200a rsb r2, r2, sl + 1f06840: e5c40003 strb r0, [r4, #3] + 1f06844: e1520003 cmp r2, r3 + 1f06848: 2affff95 bcs 1f066a4 + 1f0684c: e5d49002 ldrb r9, [r4, #2] + 1f06850: e3590001 cmp r9, #1 + 1f06854: 8a000001 bhi 1f06860 + 1f06858: eaffff91 b 1f066a4 + 1f0685c: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f06860: e08aa003 add sl, sl, r3 + 1f06864: e2499001 sub r9, r9, #1 + 1f06868: e1a0200a mov r2, sl + 1f0686c: e3a03001 mov r3, #1 + 1f06870: e1a01005 mov r1, r5 + 1f06874: e5d40001 ldrb r0, [r4, #1] + 1f06878: eb007fb2 bl 1f26748 + 1f0687c: e3590001 cmp r9, #1 + 1f06880: 1afffff5 bne 1f0685c + 1f06884: eaffff86 b 1f066a4 + 1f06888: e3a03001 mov r3, #1 + 1f0688c: e1a01005 mov r1, r5 + 1f06890: e1a0200b mov r2, fp + 1f06894: e5d00001 ldrb r0, [r0, #1] + 1f06898: eb007faa bl 1f26748 + 1f0689c: e3500000 cmp r0, #0 + 1f068a0: 1a000030 bne 1f06968 + 1f068a4: e5942038 ldr r2, [r4, #56] ; 0x38 + 1f068a8: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f068ac: e062200b rsb r2, r2, fp + 1f068b0: e5c40003 strb r0, [r4, #3] + 1f068b4: e1520003 cmp r2, r3 + 1f068b8: 2affff96 bcs 1f06718 + 1f068bc: e5d48002 ldrb r8, [r4, #2] + 1f068c0: e3580001 cmp r8, #1 + 1f068c4: 8a000001 bhi 1f068d0 + 1f068c8: eaffff92 b 1f06718 + 1f068cc: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f068d0: e08bb003 add fp, fp, r3 + 1f068d4: e2488001 sub r8, r8, #1 + 1f068d8: e1a0200b mov r2, fp + 1f068dc: e3a03001 mov r3, #1 + 1f068e0: e1a01005 mov r1, r5 + 1f068e4: e5d40001 ldrb r0, [r4, #1] + 1f068e8: eb007f96 bl 1f26748 + 1f068ec: e3580001 cmp r8, #1 + 1f068f0: 1afffff5 bne 1f068cc + 1f068f4: eaffff87 b 1f06718 + 1f068f8: e3a03001 mov r3, #1 + 1f068fc: e1a01005 mov r1, r5 + 1f06900: e1a02008 mov r2, r8 + 1f06904: e5d00001 ldrb r0, [r0, #1] + 1f06908: eb007f8e bl 1f26748 + 1f0690c: e3500000 cmp r0, #0 + 1f06910: 1a000014 bne 1f06968 + 1f06914: e5942038 ldr r2, [r4, #56] ; 0x38 + 1f06918: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f0691c: e0622008 rsb r2, r2, r8 + 1f06920: e5c40003 strb r0, [r4, #3] + 1f06924: e1520003 cmp r2, r3 + 1f06928: 2affff32 bcs 1f065f8 + 1f0692c: e5d4a002 ldrb sl, [r4, #2] + 1f06930: e35a0001 cmp sl, #1 + 1f06934: 8a000001 bhi 1f06940 + 1f06938: eaffff2e b 1f065f8 + 1f0693c: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f06940: e0888003 add r8, r8, r3 + 1f06944: e24aa001 sub sl, sl, #1 + 1f06948: e1a02008 mov r2, r8 + 1f0694c: e3a03001 mov r3, #1 + 1f06950: e1a01005 mov r1, r5 + 1f06954: e5d40001 ldrb r0, [r4, #1] + 1f06958: eb007f7a bl 1f26748 + 1f0695c: e35a0001 cmp sl, #1 + 1f06960: 1afffff5 bne 1f0693c + 1f06964: eaffff23 b 1f065f8 + 1f06968: e3a00001 mov r0, #1 + 1f0696c: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f06970: e3e03000 mvn r3, #0 + 1f06974: e3a00001 mov r0, #1 + 1f06978: e5843044 str r3, [r4, #68] ; 0x44 + 1f0697c: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f06980: e7c57009 strb r7, [r5, r9] + 1f06984: e3a03001 mov r3, #1 + 1f06988: e5c43003 strb r3, [r4, #3] + 1f0698c: e5949038 ldr r9, [r4, #56] ; 0x38 + 1f06990: e5948044 ldr r8, [r4, #68] ; 0x44 + 1f06994: e08994aa add r9, r9, sl, lsr #9 + 1f06998: e1580009 cmp r8, r9 + 1f0699c: 1affff74 bne 1f06774 + 1f069a0: e7e8a05a ubfx sl, sl, #0, #9 + 1f069a4: e085500a add r5, r5, sl + 1f069a8: e5d53000 ldrb r3, [r5] + 1f069ac: e7e37457 ubfx r7, r7, #8, #4 + 1f069b0: e3c3300f bic r3, r3, #15 + 1f069b4: e1837007 orr r7, r3, r7 + 1f069b8: e5c57000 strb r7, [r5] + 1f069bc: e3a03001 mov r3, #1 + 1f069c0: e3a00000 mov r0, #0 + 1f069c4: e5c43003 strb r3, [r4, #3] + 1f069c8: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f069cc: e2805048 add r5, r0, #72 ; 0x48 + 1f069d0: eaffff11 b 1f0661c + 1f069d4: e2805048 add r5, r0, #72 ; 0x48 + 1f069d8: eaffff56 b 1f06738 + 1f069dc: e2805048 add r5, r0, #72 ; 0x48 + 1f069e0: eaffff37 b 1f066c4 + 1f069e4: e7e8a05a ubfx sl, sl, #0, #9 + 1f069e8: e085500a add r5, r5, sl + 1f069ec: eaffff87 b 1f06810 + 1f069f0: e3a00002 mov r0, #2 + 1f069f4: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + +01f069f8 : + 1f069f8: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f069fc: e3510001 cmp r1, #1 + 1f06a00: e24dd01c sub sp, sp, #28 + 1f06a04: e58d2004 str r2, [sp, #4] + 1f06a08: 9a000005 bls 1f06a24 + 1f06a0c: e590a000 ldr sl, [r0] + 1f06a10: e1a04001 mov r4, r1 + 1f06a14: e1a0b000 mov fp, r0 + 1f06a18: e59a302c ldr r3, [sl, #44] ; 0x2c + 1f06a1c: e1510003 cmp r1, r3 + 1f06a20: 3a000002 bcc 1f06a30 + 1f06a24: e3a00002 mov r0, #2 + 1f06a28: e28dd01c add sp, sp, #28 + 1f06a2c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f06a30: e3520000 cmp r2, #0 + 1f06a34: 0a000011 beq 1f06a80 + 1f06a38: e5da2000 ldrb r2, [sl] + 1f06a3c: e3520004 cmp r2, #4 + 1f06a40: 0a00000b beq 1f06a74 + 1f06a44: e59d2004 ldr r2, [sp, #4] + 1f06a48: e3520001 cmp r2, #1 + 1f06a4c: 81530002 cmphi r3, r2 + 1f06a50: 9afffff3 bls 1f06a24 + 1f06a54: e1a01002 mov r1, r2 + 1f06a58: e1a0000a mov r0, sl + 1f06a5c: e3e02000 mvn r2, #0 + 1f06a60: ebfffece bl 1f065a0 + 1f06a64: e3500000 cmp r0, #0 + 1f06a68: 1affffee bne 1f06a28 + 1f06a6c: e59b5000 ldr r5, [fp] + 1f06a70: ea000003 b 1f06a84 + 1f06a74: e5d02007 ldrb r2, [r0, #7] + 1f06a78: e3520002 cmp r2, #2 + 1f06a7c: 1afffff0 bne 1f06a44 + 1f06a80: e1a0500a mov r5, sl + 1f06a84: e58d4000 str r4, [sp] + 1f06a88: e3a09001 mov r9, #1 + 1f06a8c: e3540001 cmp r4, #1 + 1f06a90: 9affffe3 bls 1f06a24 + 1f06a94: e595302c ldr r3, [r5, #44] ; 0x2c + 1f06a98: e1540003 cmp r4, r3 + 1f06a9c: 2affffe0 bcs 1f06a24 + 1f06aa0: e5d53000 ldrb r3, [r5] + 1f06aa4: e2433001 sub r3, r3, #1 + 1f06aa8: e3530003 cmp r3, #3 + 1f06aac: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f06ab0: eaffffdb b 1f06a24 + 1f06ab4: 01f06ccc .word 0x01f06ccc + 1f06ab8: 01f06c68 .word 0x01f06c68 + 1f06abc: 01f06b58 .word 0x01f06b58 + 1f06ac0: 01f06ac4 .word 0x01f06ac4 + 1f06ac4: e1cb21d0 ldrd r2, [fp, #16] + 1f06ac8: e1921003 orrs r1, r2, r3 + 1f06acc: 0affffd4 beq 1f06a24 + 1f06ad0: e5db1007 ldrb r1, [fp, #7] + 1f06ad4: e59b0008 ldr r0, [fp, #8] + 1f06ad8: e3510002 cmp r1, #2 + 1f06adc: e0600004 rsb r0, r0, r4 + 1f06ae0: 0a00018d beq 1f0711c + 1f06ae4: e3510003 cmp r1, #3 + 1f06ae8: 0a000103 beq 1f06efc + 1f06aec: e5953038 ldr r3, [r5, #56] ; 0x38 + 1f06af0: e5956044 ldr r6, [r5, #68] ; 0x44 + 1f06af4: e08383a4 add r8, r3, r4, lsr #7 + 1f06af8: e1580006 cmp r8, r6 + 1f06afc: 0a0001b0 beq 1f071c4 + 1f06b00: e5d53003 ldrb r3, [r5, #3] + 1f06b04: e2857048 add r7, r5, #72 ; 0x48 + 1f06b08: e3530000 cmp r3, #0 + 1f06b0c: 1a00018d bne 1f07148 + 1f06b10: e3a03001 mov r3, #1 + 1f06b14: e1a02008 mov r2, r8 + 1f06b18: e1a01007 mov r1, r7 + 1f06b1c: e5d50001 ldrb r0, [r5, #1] + 1f06b20: eb007eea bl 1f266d0 + 1f06b24: e3500000 cmp r0, #0 + 1f06b28: 1a0000d3 bne 1f06e7c + 1f06b2c: e5858044 str r8, [r5, #68] ; 0x44 + 1f06b30: e1a03104 lsl r3, r4, #2 + 1f06b34: e2033f7f and r3, r3, #508 ; 0x1fc + 1f06b38: e0872003 add r2, r7, r3 + 1f06b3c: e7d73003 ldrb r3, [r7, r3] + 1f06b40: e1d250b2 ldrh r5, [r2, #2] + 1f06b44: e5d22001 ldrb r2, [r2, #1] + 1f06b48: e1825405 orr r5, r2, r5, lsl #8 + 1f06b4c: e1835405 orr r5, r3, r5, lsl #8 + 1f06b50: e3c55102 bic r5, r5, #-2147483648 ; 0x80000000 + 1f06b54: ea000019 b 1f06bc0 + 1f06b58: e5956038 ldr r6, [r5, #56] ; 0x38 + 1f06b5c: e5957044 ldr r7, [r5, #68] ; 0x44 + 1f06b60: e08663a4 add r6, r6, r4, lsr #7 + 1f06b64: e1560007 cmp r6, r7 + 1f06b68: 0a000167 beq 1f0710c + 1f06b6c: e5d53003 ldrb r3, [r5, #3] + 1f06b70: e2858048 add r8, r5, #72 ; 0x48 + 1f06b74: e3530000 cmp r3, #0 + 1f06b78: 1a000140 bne 1f07080 + 1f06b7c: e3a03001 mov r3, #1 + 1f06b80: e1a02006 mov r2, r6 + 1f06b84: e1a01008 mov r1, r8 + 1f06b88: e5d50001 ldrb r0, [r5, #1] + 1f06b8c: eb007ecf bl 1f266d0 + 1f06b90: e3500000 cmp r0, #0 + 1f06b94: 1a0000b8 bne 1f06e7c + 1f06b98: e5856044 str r6, [r5, #68] ; 0x44 + 1f06b9c: e1a03104 lsl r3, r4, #2 + 1f06ba0: e2033f7f and r3, r3, #508 ; 0x1fc + 1f06ba4: e0882003 add r2, r8, r3 + 1f06ba8: e7d83003 ldrb r3, [r8, r3] + 1f06bac: e1d250b2 ldrh r5, [r2, #2] + 1f06bb0: e5d22001 ldrb r2, [r2, #1] + 1f06bb4: e1825405 orr r5, r2, r5, lsl #8 + 1f06bb8: e1835405 orr r5, r3, r5, lsl #8 + 1f06bbc: e3c5520f bic r5, r5, #-268435456 ; 0xf0000000 + 1f06bc0: e3550000 cmp r5, #0 + 1f06bc4: 0a0000b5 beq 1f06ea0 + 1f06bc8: e3550001 cmp r5, #1 + 1f06bcc: 0affff94 beq 1f06a24 + 1f06bd0: e3750001 cmn r5, #1 + 1f06bd4: 0a0000aa beq 1f06e84 + 1f06bd8: e5da3000 ldrb r3, [sl] + 1f06bdc: e3530004 cmp r3, #4 + 1f06be0: 0a00000a beq 1f06c10 + 1f06be4: e3540001 cmp r4, #1 + 1f06be8: 9affff8d bls 1f06a24 + 1f06bec: e59a302c ldr r3, [sl, #44] ; 0x2c + 1f06bf0: e1540003 cmp r4, r3 + 1f06bf4: 2affff8a bcs 1f06a24 + 1f06bf8: e3a02000 mov r2, #0 + 1f06bfc: e1a01004 mov r1, r4 + 1f06c00: e1a0000a mov r0, sl + 1f06c04: ebfffe65 bl 1f065a0 + 1f06c08: e3500000 cmp r0, #0 + 1f06c0c: 1affff85 bne 1f06a28 + 1f06c10: e59a202c ldr r2, [sl, #44] ; 0x2c + 1f06c14: e59a3018 ldr r3, [sl, #24] + 1f06c18: e2421002 sub r1, r2, #2 + 1f06c1c: e1530001 cmp r3, r1 + 1f06c20: 2a000004 bcs 1f06c38 + 1f06c24: e5da1004 ldrb r1, [sl, #4] + 1f06c28: e2833001 add r3, r3, #1 + 1f06c2c: e58a3018 str r3, [sl, #24] + 1f06c30: e3813001 orr r3, r1, #1 + 1f06c34: e5ca3004 strb r3, [sl, #4] + 1f06c38: e2844001 add r4, r4, #1 + 1f06c3c: e1540005 cmp r4, r5 + 1f06c40: 0a000003 beq 1f06c54 + 1f06c44: e5da3000 ldrb r3, [sl] + 1f06c48: e3530004 cmp r3, #4 + 1f06c4c: 158d5000 strne r5, [sp] + 1f06c50: 0a000054 beq 1f06da8 + 1f06c54: e1550002 cmp r5, r2 + 1f06c58: 2a000090 bcs 1f06ea0 + 1f06c5c: e1a04005 mov r4, r5 + 1f06c60: e59b5000 ldr r5, [fp] + 1f06c64: eaffff88 b 1f06a8c + 1f06c68: e5956038 ldr r6, [r5, #56] ; 0x38 + 1f06c6c: e5957044 ldr r7, [r5, #68] ; 0x44 + 1f06c70: e0866424 add r6, r6, r4, lsr #8 + 1f06c74: e1560007 cmp r6, r7 + 1f06c78: 0a000125 beq 1f07114 + 1f06c7c: e5d53003 ldrb r3, [r5, #3] + 1f06c80: e2858048 add r8, r5, #72 ; 0x48 + 1f06c84: e3530000 cmp r3, #0 + 1f06c88: 1a0000bc bne 1f06f80 + 1f06c8c: e3a03001 mov r3, #1 + 1f06c90: e1a02006 mov r2, r6 + 1f06c94: e1a01008 mov r1, r8 + 1f06c98: e5d50001 ldrb r0, [r5, #1] + 1f06c9c: eb007e8b bl 1f266d0 + 1f06ca0: e3500000 cmp r0, #0 + 1f06ca4: 1a000074 bne 1f06e7c + 1f06ca8: e5856044 str r6, [r5, #68] ; 0x44 + 1f06cac: e1a02084 lsl r2, r4, #1 + 1f06cb0: e30031fe movw r3, #510 ; 0x1fe + 1f06cb4: e0033002 and r3, r3, r2 + 1f06cb8: e0882003 add r2, r8, r3 + 1f06cbc: e7d83003 ldrb r3, [r8, r3] + 1f06cc0: e5d25001 ldrb r5, [r2, #1] + 1f06cc4: e1835405 orr r5, r3, r5, lsl #8 + 1f06cc8: eaffffbc b 1f06bc0 + 1f06ccc: e08430a4 add r3, r4, r4, lsr #1 + 1f06cd0: e5957038 ldr r7, [r5, #56] ; 0x38 + 1f06cd4: e5956044 ldr r6, [r5, #68] ; 0x44 + 1f06cd8: e08784a3 add r8, r7, r3, lsr #9 + 1f06cdc: e58d300c str r3, [sp, #12] + 1f06ce0: e1560008 cmp r6, r8 + 1f06ce4: 0a00000d beq 1f06d20 + 1f06ce8: e5d53003 ldrb r3, [r5, #3] + 1f06cec: e3530000 cmp r3, #0 + 1f06cf0: e2853048 add r3, r5, #72 ; 0x48 + 1f06cf4: 058d3008 streq r3, [sp, #8] + 1f06cf8: 1a0000bf bne 1f06ffc + 1f06cfc: e59d1008 ldr r1, [sp, #8] + 1f06d00: e3a03001 mov r3, #1 + 1f06d04: e1a02008 mov r2, r8 + 1f06d08: e5d50001 ldrb r0, [r5, #1] + 1f06d0c: eb007e6f bl 1f266d0 + 1f06d10: e3500000 cmp r0, #0 + 1f06d14: 1a000058 bne 1f06e7c + 1f06d18: e5957038 ldr r7, [r5, #56] ; 0x38 + 1f06d1c: e5858044 str r8, [r5, #68] ; 0x44 + 1f06d20: e59d100c ldr r1, [sp, #12] + 1f06d24: e2813001 add r3, r1, #1 + 1f06d28: e58d300c str r3, [sp, #12] + 1f06d2c: e1a02003 mov r2, r3 + 1f06d30: e7e83051 ubfx r3, r1, #0, #9 + 1f06d34: e0853003 add r3, r5, r3 + 1f06d38: e08774a2 add r7, r7, r2, lsr #9 + 1f06d3c: e1580007 cmp r8, r7 + 1f06d40: e5d33048 ldrb r3, [r3, #72] ; 0x48 + 1f06d44: e58d3010 str r3, [sp, #16] + 1f06d48: 0a00000c beq 1f06d80 + 1f06d4c: e5d53003 ldrb r3, [r5, #3] + 1f06d50: e3530000 cmp r3, #0 + 1f06d54: e2853048 add r3, r5, #72 ; 0x48 + 1f06d58: 058d3008 streq r3, [sp, #8] + 1f06d5c: 1a00011d bne 1f071d8 + 1f06d60: e59d1008 ldr r1, [sp, #8] + 1f06d64: e3a03001 mov r3, #1 + 1f06d68: e1a02007 mov r2, r7 + 1f06d6c: e5d50001 ldrb r0, [r5, #1] + 1f06d70: eb007e56 bl 1f266d0 + 1f06d74: e3500000 cmp r0, #0 + 1f06d78: 1a00003f bne 1f06e7c + 1f06d7c: e5857044 str r7, [r5, #68] ; 0x44 + 1f06d80: e59d300c ldr r3, [sp, #12] + 1f06d84: e3140001 tst r4, #1 + 1f06d88: e59d2010 ldr r2, [sp, #16] + 1f06d8c: e7e83053 ubfx r3, r3, #0, #9 + 1f06d90: e0855003 add r5, r5, r3 + 1f06d94: e5d53048 ldrb r3, [r5, #72] ; 0x48 + 1f06d98: e1825403 orr r5, r2, r3, lsl #8 + 1f06d9c: 07eb5055 ubfxeq r5, r5, #0, #12 + 1f06da0: 11a05225 lsrne r5, r5, #4 + 1f06da4: eaffff85 b 1f06bc0 + 1f06da8: e59d1000 ldr r1, [sp] + 1f06dac: e59a2040 ldr r2, [sl, #64] ; 0x40 + 1f06db0: e2416002 sub r6, r1, #2 + 1f06db4: e0618004 rsb r8, r1, r4 + 1f06db8: e2063007 and r3, r6, #7 + 1f06dbc: e58d5008 str r5, [sp, #8] + 1f06dc0: e0822626 add r2, r2, r6, lsr #12 + 1f06dc4: e58db00c str fp, [sp, #12] + 1f06dc8: e1a04319 lsl r4, r9, r3 + 1f06dcc: e58d2000 str r2, [sp] + 1f06dd0: e7e861d6 ubfx r6, r6, #3, #9 + 1f06dd4: e1a03002 mov r3, r2 + 1f06dd8: e6ef4074 uxtb r4, r4 + 1f06ddc: e59a5044 ldr r5, [sl, #68] ; 0x44 + 1f06de0: e2832001 add r2, r3, #1 + 1f06de4: e58d2010 str r2, [sp, #16] + 1f06de8: e1550003 cmp r5, r3 + 1f06dec: 0a00000f beq 1f06e30 + 1f06df0: e5da3003 ldrb r3, [sl, #3] + 1f06df4: e28ab048 add fp, sl, #72 ; 0x48 + 1f06df8: e3530000 cmp r3, #0 + 1f06dfc: 1a000043 bne 1f06f10 + 1f06e00: e1a0100b mov r1, fp + 1f06e04: e3a03001 mov r3, #1 + 1f06e08: e59d2000 ldr r2, [sp] + 1f06e0c: e5da0001 ldrb r0, [sl, #1] + 1f06e10: eb007e2e bl 1f266d0 + 1f06e14: e3500000 cmp r0, #0 + 1f06e18: 13e03000 mvnne r3, #0 + 1f06e1c: 13a00001 movne r0, #1 + 1f06e20: 158a3044 strne r3, [sl, #68] ; 0x44 + 1f06e24: 1afffeff bne 1f06a28 + 1f06e28: e59d3000 ldr r3, [sp] + 1f06e2c: e58a3044 str r3, [sl, #68] ; 0x44 + 1f06e30: e08a1006 add r1, sl, r6 + 1f06e34: ea00000a b 1f06e64 + 1f06e38: e2588001 subs r8, r8, #1 + 1f06e3c: e5c13048 strb r3, [r1, #72] ; 0x48 + 1f06e40: e5ca9003 strb r9, [sl, #3] + 1f06e44: 0a000010 beq 1f06e8c + 1f06e48: e21240ff ands r4, r2, #255 ; 0xff + 1f06e4c: 1a000005 bne 1f06e68 + 1f06e50: e2866001 add r6, r6, #1 + 1f06e54: e3a04001 mov r4, #1 + 1f06e58: e3560c02 cmp r6, #512 ; 0x200 + 1f06e5c: e08a1006 add r1, sl, r6 + 1f06e60: 0a0000a5 beq 1f070fc + 1f06e64: e5d13048 ldrb r3, [r1, #72] ; 0x48 + 1f06e68: e1140003 tst r4, r3 + 1f06e6c: e1a02084 lsl r2, r4, #1 + 1f06e70: e0233004 eor r3, r3, r4 + 1f06e74: 1affffef bne 1f06e38 + 1f06e78: eafffee9 b 1f06a24 + 1f06e7c: e3e03000 mvn r3, #0 + 1f06e80: e5853044 str r3, [r5, #68] ; 0x44 + 1f06e84: e3a00001 mov r0, #1 + 1f06e88: eafffee6 b 1f06a28 + 1f06e8c: e59d5008 ldr r5, [sp, #8] + 1f06e90: e59db00c ldr fp, [sp, #12] + 1f06e94: e59a202c ldr r2, [sl, #44] ; 0x2c + 1f06e98: e58d5000 str r5, [sp] + 1f06e9c: eaffff6c b 1f06c54 + 1f06ea0: e5da3000 ldrb r3, [sl] + 1f06ea4: e3530004 cmp r3, #4 + 1f06ea8: 0a000001 beq 1f06eb4 + 1f06eac: e3a00000 mov r0, #0 + 1f06eb0: eafffedc b 1f06a28 + 1f06eb4: e59d3004 ldr r3, [sp, #4] + 1f06eb8: e3530000 cmp r3, #0 + 1f06ebc: 0a0000c2 beq 1f071cc + 1f06ec0: e5db3007 ldrb r3, [fp, #7] + 1f06ec4: e3530003 cmp r3, #3 + 1f06ec8: 1afffff7 bne 1f06eac + 1f06ecc: e59b3008 ldr r3, [fp, #8] + 1f06ed0: e59d1004 ldr r1, [sp, #4] + 1f06ed4: e1510003 cmp r1, r3 + 1f06ed8: 3afffff3 bcc 1f06eac + 1f06edc: e59b2018 ldr r2, [fp, #24] + 1f06ee0: e0833002 add r3, r3, r2 + 1f06ee4: e1510003 cmp r1, r3 + 1f06ee8: 8affffef bhi 1f06eac + 1f06eec: e3a03002 mov r3, #2 + 1f06ef0: e3a00000 mov r0, #0 + 1f06ef4: e5cb3007 strb r3, [fp, #7] + 1f06ef8: eafffeca b 1f06a28 + 1f06efc: e59b3018 ldr r3, [fp, #24] + 1f06f00: e1500003 cmp r0, r3 + 1f06f04: 2afffef8 bcs 1f06aec + 1f06f08: e2845001 add r5, r4, #1 + 1f06f0c: eaffff2b b 1f06bc0 + 1f06f10: e3a03001 mov r3, #1 + 1f06f14: e1a0100b mov r1, fp + 1f06f18: e1a02005 mov r2, r5 + 1f06f1c: e5da0001 ldrb r0, [sl, #1] + 1f06f20: eb007e08 bl 1f26748 + 1f06f24: e3500000 cmp r0, #0 + 1f06f28: 1affffd5 bne 1f06e84 + 1f06f2c: e59a2038 ldr r2, [sl, #56] ; 0x38 + 1f06f30: e59a3030 ldr r3, [sl, #48] ; 0x30 + 1f06f34: e0622005 rsb r2, r2, r5 + 1f06f38: e5ca0003 strb r0, [sl, #3] + 1f06f3c: e1520003 cmp r2, r3 + 1f06f40: 2affffae bcs 1f06e00 + 1f06f44: e5da7002 ldrb r7, [sl, #2] + 1f06f48: e3570001 cmp r7, #1 + 1f06f4c: 8a000001 bhi 1f06f58 + 1f06f50: eaffffaa b 1f06e00 + 1f06f54: e59a3030 ldr r3, [sl, #48] ; 0x30 + 1f06f58: e0855003 add r5, r5, r3 + 1f06f5c: e2477001 sub r7, r7, #1 + 1f06f60: e1a02005 mov r2, r5 + 1f06f64: e3a03001 mov r3, #1 + 1f06f68: e1a0100b mov r1, fp + 1f06f6c: e5da0001 ldrb r0, [sl, #1] + 1f06f70: eb007df4 bl 1f26748 + 1f06f74: e3570001 cmp r7, #1 + 1f06f78: 1afffff5 bne 1f06f54 + 1f06f7c: eaffff9f b 1f06e00 + 1f06f80: e3a03001 mov r3, #1 + 1f06f84: e1a01008 mov r1, r8 + 1f06f88: e1a02007 mov r2, r7 + 1f06f8c: e5d50001 ldrb r0, [r5, #1] + 1f06f90: eb007dec bl 1f26748 + 1f06f94: e3500000 cmp r0, #0 + 1f06f98: 1affffb9 bne 1f06e84 + 1f06f9c: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f06fa0: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f06fa4: e0622007 rsb r2, r2, r7 + 1f06fa8: e5c50003 strb r0, [r5, #3] + 1f06fac: e1520003 cmp r2, r3 + 1f06fb0: 2affff35 bcs 1f06c8c + 1f06fb4: e5d52002 ldrb r2, [r5, #2] + 1f06fb8: e3520001 cmp r2, #1 + 1f06fbc: 9affff32 bls 1f06c8c + 1f06fc0: e58da008 str sl, [sp, #8] + 1f06fc4: e1a0a002 mov sl, r2 + 1f06fc8: ea000000 b 1f06fd0 + 1f06fcc: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f06fd0: e0877003 add r7, r7, r3 + 1f06fd4: e24aa001 sub sl, sl, #1 + 1f06fd8: e1a02007 mov r2, r7 + 1f06fdc: e3a03001 mov r3, #1 + 1f06fe0: e1a01008 mov r1, r8 + 1f06fe4: e5d50001 ldrb r0, [r5, #1] + 1f06fe8: eb007dd6 bl 1f26748 + 1f06fec: e35a0001 cmp sl, #1 + 1f06ff0: 1afffff5 bne 1f06fcc + 1f06ff4: e59da008 ldr sl, [sp, #8] + 1f06ff8: eaffff23 b 1f06c8c + 1f06ffc: e1a02003 mov r2, r3 + 1f07000: e5d50001 ldrb r0, [r5, #1] + 1f07004: e58d2008 str r2, [sp, #8] + 1f07008: e1a01002 mov r1, r2 + 1f0700c: e3a03001 mov r3, #1 + 1f07010: e1a02006 mov r2, r6 + 1f07014: eb007dcb bl 1f26748 + 1f07018: e3500000 cmp r0, #0 + 1f0701c: 1affff98 bne 1f06e84 + 1f07020: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f07024: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07028: e0622006 rsb r2, r2, r6 + 1f0702c: e5c50003 strb r0, [r5, #3] + 1f07030: e1520003 cmp r2, r3 + 1f07034: 2affff30 bcs 1f06cfc + 1f07038: e5d57002 ldrb r7, [r5, #2] + 1f0703c: e3570001 cmp r7, #1 + 1f07040: 9affff2d bls 1f06cfc + 1f07044: e58da010 str sl, [sp, #16] + 1f07048: e59da008 ldr sl, [sp, #8] + 1f0704c: ea000000 b 1f07054 + 1f07050: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07054: e0866003 add r6, r6, r3 + 1f07058: e2477001 sub r7, r7, #1 + 1f0705c: e1a02006 mov r2, r6 + 1f07060: e3a03001 mov r3, #1 + 1f07064: e1a0100a mov r1, sl + 1f07068: e5d50001 ldrb r0, [r5, #1] + 1f0706c: eb007db5 bl 1f26748 + 1f07070: e3570001 cmp r7, #1 + 1f07074: 1afffff5 bne 1f07050 + 1f07078: e59da010 ldr sl, [sp, #16] + 1f0707c: eaffff1e b 1f06cfc + 1f07080: e3a03001 mov r3, #1 + 1f07084: e1a01008 mov r1, r8 + 1f07088: e1a02007 mov r2, r7 + 1f0708c: e5d50001 ldrb r0, [r5, #1] + 1f07090: eb007dac bl 1f26748 + 1f07094: e3500000 cmp r0, #0 + 1f07098: 1affff79 bne 1f06e84 + 1f0709c: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f070a0: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f070a4: e0622007 rsb r2, r2, r7 + 1f070a8: e5c50003 strb r0, [r5, #3] + 1f070ac: e1520003 cmp r2, r3 + 1f070b0: 2afffeb1 bcs 1f06b7c + 1f070b4: e5d52002 ldrb r2, [r5, #2] + 1f070b8: e3520001 cmp r2, #1 + 1f070bc: 9afffeae bls 1f06b7c + 1f070c0: e58da008 str sl, [sp, #8] + 1f070c4: e1a0a002 mov sl, r2 + 1f070c8: ea000000 b 1f070d0 + 1f070cc: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f070d0: e0877003 add r7, r7, r3 + 1f070d4: e24aa001 sub sl, sl, #1 + 1f070d8: e1a02007 mov r2, r7 + 1f070dc: e3a03001 mov r3, #1 + 1f070e0: e1a01008 mov r1, r8 + 1f070e4: e5d50001 ldrb r0, [r5, #1] + 1f070e8: eb007d96 bl 1f26748 + 1f070ec: e35a0001 cmp sl, #1 + 1f070f0: 1afffff5 bne 1f070cc + 1f070f4: e59da008 ldr sl, [sp, #8] + 1f070f8: eafffe9f b 1f06b7c + 1f070fc: e59d3010 ldr r3, [sp, #16] + 1f07100: e3a06000 mov r6, #0 + 1f07104: e58d3000 str r3, [sp] + 1f07108: eaffff33 b 1f06ddc + 1f0710c: e2858048 add r8, r5, #72 ; 0x48 + 1f07110: eafffea1 b 1f06b9c + 1f07114: e2858048 add r8, r5, #72 ; 0x48 + 1f07118: eafffee3 b 1f06cac + 1f0711c: e2522001 subs r2, r2, #1 + 1f07120: e1d510ba ldrh r1, [r5, #10] + 1f07124: e2c33000 sbc r3, r3, #0 + 1f07128: e1a024a2 lsr r2, r2, #9 + 1f0712c: e1822b83 orr r2, r2, r3, lsl #23 + 1f07130: e732f112 udiv r2, r2, r1 + 1f07134: e1500002 cmp r0, r2 + 1f07138: 8afffe39 bhi 1f06a24 + 1f0713c: 1affff71 bne 1f06f08 + 1f07140: e3e05102 mvn r5, #-2147483648 ; 0x80000000 + 1f07144: eafffea3 b 1f06bd8 + 1f07148: e3a03001 mov r3, #1 + 1f0714c: e1a01007 mov r1, r7 + 1f07150: e1a02006 mov r2, r6 + 1f07154: e5d50001 ldrb r0, [r5, #1] + 1f07158: eb007d7a bl 1f26748 + 1f0715c: e3500000 cmp r0, #0 + 1f07160: 1affff47 bne 1f06e84 + 1f07164: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f07168: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f0716c: e0622006 rsb r2, r2, r6 + 1f07170: e5c50003 strb r0, [r5, #3] + 1f07174: e1520003 cmp r2, r3 + 1f07178: 2afffe64 bcs 1f06b10 + 1f0717c: e5d52002 ldrb r2, [r5, #2] + 1f07180: e3520001 cmp r2, #1 + 1f07184: 9afffe61 bls 1f06b10 + 1f07188: e58da008 str sl, [sp, #8] + 1f0718c: e1a0a002 mov sl, r2 + 1f07190: ea000000 b 1f07198 + 1f07194: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07198: e0866003 add r6, r6, r3 + 1f0719c: e24aa001 sub sl, sl, #1 + 1f071a0: e1a02006 mov r2, r6 + 1f071a4: e3a03001 mov r3, #1 + 1f071a8: e1a01007 mov r1, r7 + 1f071ac: e5d50001 ldrb r0, [r5, #1] + 1f071b0: eb007d64 bl 1f26748 + 1f071b4: e35a0001 cmp sl, #1 + 1f071b8: 1afffff5 bne 1f07194 + 1f071bc: e59da008 ldr sl, [sp, #8] + 1f071c0: eafffe52 b 1f06b10 + 1f071c4: e2857048 add r7, r5, #72 ; 0x48 + 1f071c8: eafffe58 b 1f06b30 + 1f071cc: e1a00003 mov r0, r3 + 1f071d0: e5cb3007 strb r3, [fp, #7] + 1f071d4: eafffe13 b 1f06a28 + 1f071d8: e1a02003 mov r2, r3 + 1f071dc: e5d50001 ldrb r0, [r5, #1] + 1f071e0: e58d2008 str r2, [sp, #8] + 1f071e4: e1a01002 mov r1, r2 + 1f071e8: e3a03001 mov r3, #1 + 1f071ec: e1a02008 mov r2, r8 + 1f071f0: eb007d54 bl 1f26748 + 1f071f4: e3500000 cmp r0, #0 + 1f071f8: 1affff21 bne 1f06e84 + 1f071fc: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f07200: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07204: e0622008 rsb r2, r2, r8 + 1f07208: e5c50003 strb r0, [r5, #3] + 1f0720c: e1520003 cmp r2, r3 + 1f07210: 2afffed2 bcs 1f06d60 + 1f07214: e5d56002 ldrb r6, [r5, #2] + 1f07218: e3560001 cmp r6, #1 + 1f0721c: 9afffecf bls 1f06d60 + 1f07220: e58da014 str sl, [sp, #20] + 1f07224: e59da008 ldr sl, [sp, #8] + 1f07228: ea000000 b 1f07230 + 1f0722c: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07230: e0888003 add r8, r8, r3 + 1f07234: e2466001 sub r6, r6, #1 + 1f07238: e1a02008 mov r2, r8 + 1f0723c: e3a03001 mov r3, #1 + 1f07240: e1a0100a mov r1, sl + 1f07244: e5d50001 ldrb r0, [r5, #1] + 1f07248: eb007d3e bl 1f26748 + 1f0724c: e3560001 cmp r6, #1 + 1f07250: 1afffff5 bne 1f0722c + 1f07254: e59da014 ldr sl, [sp, #20] + 1f07258: eafffec0 b 1f06d60 + +01f0725c : + 1f0725c: e3510001 cmp r1, #1 + 1f07260: 9a00009b bls 1f074d4 + 1f07264: e92d4ff8 push {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f07268: e5905000 ldr r5, [r0] + 1f0726c: e595302c ldr r3, [r5, #44] ; 0x2c + 1f07270: e1510003 cmp r1, r3 + 1f07274: 2a000009 bcs 1f072a0 + 1f07278: e5d53000 ldrb r3, [r5] + 1f0727c: e1a04001 mov r4, r1 + 1f07280: e2433001 sub r3, r3, #1 + 1f07284: e3530003 cmp r3, #3 + 1f07288: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f0728c: ea000003 b 1f072a0 + 1f07290: 01f0740c .word 0x01f0740c + 1f07294: 01f073a8 .word 0x01f073a8 + 1f07298: 01f0733c .word 0x01f0733c + 1f0729c: 01f072a8 .word 0x01f072a8 + 1f072a0: e3a00001 mov r0, #1 + 1f072a4: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f072a8: e1c061d0 ldrd r6, [r0, #16] + 1f072ac: e1963007 orrs r3, r6, r7 + 1f072b0: 0afffffa beq 1f072a0 + 1f072b4: e5d02007 ldrb r2, [r0, #7] + 1f072b8: e5903008 ldr r3, [r0, #8] + 1f072bc: e3520002 cmp r2, #2 + 1f072c0: e0631001 rsb r1, r3, r1 + 1f072c4: 0a000084 beq 1f074dc + 1f072c8: e3520003 cmp r2, #3 + 1f072cc: 0a0000e9 beq 1f07678 + 1f072d0: e5956038 ldr r6, [r5, #56] ; 0x38 + 1f072d4: e5958044 ldr r8, [r5, #68] ; 0x44 + 1f072d8: e08663a4 add r6, r6, r4, lsr #7 + 1f072dc: e1560008 cmp r6, r8 + 1f072e0: 0a000104 beq 1f076f8 + 1f072e4: e5d53003 ldrb r3, [r5, #3] + 1f072e8: e2859048 add r9, r5, #72 ; 0x48 + 1f072ec: e3530000 cmp r3, #0 + 1f072f0: 1a0000e4 bne 1f07688 + 1f072f4: e3a03001 mov r3, #1 + 1f072f8: e1a02006 mov r2, r6 + 1f072fc: e1a01009 mov r1, r9 + 1f07300: e5d50001 ldrb r0, [r5, #1] + 1f07304: eb007cf1 bl 1f266d0 + 1f07308: e3500000 cmp r0, #0 + 1f0730c: 1a00006d bne 1f074c8 + 1f07310: e5856044 str r6, [r5, #68] ; 0x44 + 1f07314: e1a03104 lsl r3, r4, #2 + 1f07318: e2033f7f and r3, r3, #508 ; 0x1fc + 1f0731c: e0892003 add r2, r9, r3 + 1f07320: e7d93003 ldrb r3, [r9, r3] + 1f07324: e1d200b2 ldrh r0, [r2, #2] + 1f07328: e5d22001 ldrb r2, [r2, #1] + 1f0732c: e1820400 orr r0, r2, r0, lsl #8 + 1f07330: e1830400 orr r0, r3, r0, lsl #8 + 1f07334: e3c00102 bic r0, r0, #-2147483648 ; 0x80000000 + 1f07338: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0733c: e5956038 ldr r6, [r5, #56] ; 0x38 + 1f07340: e5958044 ldr r8, [r5, #68] ; 0x44 + 1f07344: e08663a1 add r6, r6, r1, lsr #7 + 1f07348: e1560008 cmp r6, r8 + 1f0734c: 0a0000c5 beq 1f07668 + 1f07350: e5d53003 ldrb r3, [r5, #3] + 1f07354: e2859048 add r9, r5, #72 ; 0x48 + 1f07358: e3530000 cmp r3, #0 + 1f0735c: 1a000069 bne 1f07508 + 1f07360: e3a03001 mov r3, #1 + 1f07364: e1a02006 mov r2, r6 + 1f07368: e1a01009 mov r1, r9 + 1f0736c: e5d50001 ldrb r0, [r5, #1] + 1f07370: eb007cd6 bl 1f266d0 + 1f07374: e3500000 cmp r0, #0 + 1f07378: 1a000052 bne 1f074c8 + 1f0737c: e5856044 str r6, [r5, #68] ; 0x44 + 1f07380: e1a00104 lsl r0, r4, #2 + 1f07384: e2000f7f and r0, r0, #508 ; 0x1fc + 1f07388: e0892000 add r2, r9, r0 + 1f0738c: e7d93000 ldrb r3, [r9, r0] + 1f07390: e1d200b2 ldrh r0, [r2, #2] + 1f07394: e5d22001 ldrb r2, [r2, #1] + 1f07398: e1820400 orr r0, r2, r0, lsl #8 + 1f0739c: e1830400 orr r0, r3, r0, lsl #8 + 1f073a0: e3c0020f bic r0, r0, #-268435456 ; 0xf0000000 + 1f073a4: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f073a8: e5956038 ldr r6, [r5, #56] ; 0x38 + 1f073ac: e5958044 ldr r8, [r5, #68] ; 0x44 + 1f073b0: e0866421 add r6, r6, r1, lsr #8 + 1f073b4: e1560008 cmp r6, r8 + 1f073b8: 0a0000ac beq 1f07670 + 1f073bc: e5d53003 ldrb r3, [r5, #3] + 1f073c0: e2859048 add r9, r5, #72 ; 0x48 + 1f073c4: e3530000 cmp r3, #0 + 1f073c8: 1a00006c bne 1f07580 + 1f073cc: e3a03001 mov r3, #1 + 1f073d0: e1a02006 mov r2, r6 + 1f073d4: e1a01009 mov r1, r9 + 1f073d8: e5d50001 ldrb r0, [r5, #1] + 1f073dc: eb007cbb bl 1f266d0 + 1f073e0: e3500000 cmp r0, #0 + 1f073e4: 1a000037 bne 1f074c8 + 1f073e8: e5856044 str r6, [r5, #68] ; 0x44 + 1f073ec: e1a01084 lsl r1, r4, #1 + 1f073f0: e30031fe movw r3, #510 ; 0x1fe + 1f073f4: e0033001 and r3, r3, r1 + 1f073f8: e0892003 add r2, r9, r3 + 1f073fc: e7d93003 ldrb r3, [r9, r3] + 1f07400: e5d20001 ldrb r0, [r2, #1] + 1f07404: e1830400 orr r0, r3, r0, lsl #8 + 1f07408: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0740c: e081a0a1 add sl, r1, r1, lsr #1 + 1f07410: e5953038 ldr r3, [r5, #56] ; 0x38 + 1f07414: e5958044 ldr r8, [r5, #68] ; 0x44 + 1f07418: e08394aa add r9, r3, sl, lsr #9 + 1f0741c: e1590008 cmp r9, r8 + 1f07420: 0a00008e beq 1f07660 + 1f07424: e5d53003 ldrb r3, [r5, #3] + 1f07428: e2857048 add r7, r5, #72 ; 0x48 + 1f0742c: e3530000 cmp r3, #0 + 1f07430: 1a00006e bne 1f075f0 + 1f07434: e1a01007 mov r1, r7 + 1f07438: e3a03001 mov r3, #1 + 1f0743c: e1a02009 mov r2, r9 + 1f07440: e5d50001 ldrb r0, [r5, #1] + 1f07444: eb007ca1 bl 1f266d0 + 1f07448: e3500000 cmp r0, #0 + 1f0744c: 1a00001d bne 1f074c8 + 1f07450: e5953038 ldr r3, [r5, #56] ; 0x38 + 1f07454: e1a07009 mov r7, r9 + 1f07458: e5859044 str r9, [r5, #68] ; 0x44 + 1f0745c: e28a8001 add r8, sl, #1 + 1f07460: e7e8a05a ubfx sl, sl, #0, #9 + 1f07464: e085a00a add sl, r5, sl + 1f07468: e08364a8 add r6, r3, r8, lsr #9 + 1f0746c: e1560009 cmp r6, r9 + 1f07470: e5daa048 ldrb sl, [sl, #72] ; 0x48 + 1f07474: 0a00000b beq 1f074a8 + 1f07478: e5d53003 ldrb r3, [r5, #3] + 1f0747c: e285b048 add fp, r5, #72 ; 0x48 + 1f07480: e3530000 cmp r3, #0 + 1f07484: 1a00009d bne 1f07700 + 1f07488: e1a0100b mov r1, fp + 1f0748c: e3a03001 mov r3, #1 + 1f07490: e1a02006 mov r2, r6 + 1f07494: e5d50001 ldrb r0, [r5, #1] + 1f07498: eb007c8c bl 1f266d0 + 1f0749c: e3500000 cmp r0, #0 + 1f074a0: 1a000008 bne 1f074c8 + 1f074a4: e5856044 str r6, [r5, #68] ; 0x44 + 1f074a8: e7e88058 ubfx r8, r8, #0, #9 + 1f074ac: e3140001 tst r4, #1 + 1f074b0: e0855008 add r5, r5, r8 + 1f074b4: e5d53048 ldrb r3, [r5, #72] ; 0x48 + 1f074b8: e18a0403 orr r0, sl, r3, lsl #8 + 1f074bc: 11a00220 lsrne r0, r0, #4 + 1f074c0: 07eb0050 ubfxeq r0, r0, #0, #12 + 1f074c4: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f074c8: e3e00000 mvn r0, #0 + 1f074cc: e5850044 str r0, [r5, #68] ; 0x44 + 1f074d0: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f074d4: e3a00001 mov r0, #1 + 1f074d8: e12fff1e bx lr + 1f074dc: e2562001 subs r2, r6, #1 + 1f074e0: e1d500ba ldrh r0, [r5, #10] + 1f074e4: e2c73000 sbc r3, r7, #0 + 1f074e8: e1a024a2 lsr r2, r2, #9 + 1f074ec: e1822b83 orr r2, r2, r3, lsl #23 + 1f074f0: e732f012 udiv r2, r2, r0 + 1f074f4: e1510002 cmp r1, r2 + 1f074f8: 8affff68 bhi 1f072a0 + 1f074fc: 0a00009b beq 1f07770 + 1f07500: e2840001 add r0, r4, #1 + 1f07504: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f07508: e3a03001 mov r3, #1 + 1f0750c: e1a01009 mov r1, r9 + 1f07510: e1a02008 mov r2, r8 + 1f07514: e5d50001 ldrb r0, [r5, #1] + 1f07518: eb007c8a bl 1f26748 + 1f0751c: e3500000 cmp r0, #0 + 1f07520: 1a000014 bne 1f07578 + 1f07524: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f07528: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f0752c: e0622008 rsb r2, r2, r8 + 1f07530: e5c50003 strb r0, [r5, #3] + 1f07534: e1520003 cmp r2, r3 + 1f07538: 2affff88 bcs 1f07360 + 1f0753c: e5d57002 ldrb r7, [r5, #2] + 1f07540: e3570001 cmp r7, #1 + 1f07544: 8a000001 bhi 1f07550 + 1f07548: eaffff84 b 1f07360 + 1f0754c: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07550: e0888003 add r8, r8, r3 + 1f07554: e2477001 sub r7, r7, #1 + 1f07558: e1a02008 mov r2, r8 + 1f0755c: e3a03001 mov r3, #1 + 1f07560: e1a01009 mov r1, r9 + 1f07564: e5d50001 ldrb r0, [r5, #1] + 1f07568: eb007c76 bl 1f26748 + 1f0756c: e3570001 cmp r7, #1 + 1f07570: 1afffff5 bne 1f0754c + 1f07574: eaffff79 b 1f07360 + 1f07578: e3e00000 mvn r0, #0 + 1f0757c: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f07580: e3a03001 mov r3, #1 + 1f07584: e1a01009 mov r1, r9 + 1f07588: e1a02008 mov r2, r8 + 1f0758c: e5d50001 ldrb r0, [r5, #1] + 1f07590: eb007c6c bl 1f26748 + 1f07594: e3500000 cmp r0, #0 + 1f07598: 1afffff6 bne 1f07578 + 1f0759c: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f075a0: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f075a4: e0622008 rsb r2, r2, r8 + 1f075a8: e5c50003 strb r0, [r5, #3] + 1f075ac: e1520003 cmp r2, r3 + 1f075b0: 2affff85 bcs 1f073cc + 1f075b4: e5d57002 ldrb r7, [r5, #2] + 1f075b8: e3570001 cmp r7, #1 + 1f075bc: 8a000001 bhi 1f075c8 + 1f075c0: eaffff81 b 1f073cc + 1f075c4: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f075c8: e0888003 add r8, r8, r3 + 1f075cc: e2477001 sub r7, r7, #1 + 1f075d0: e1a02008 mov r2, r8 + 1f075d4: e3a03001 mov r3, #1 + 1f075d8: e1a01009 mov r1, r9 + 1f075dc: e5d50001 ldrb r0, [r5, #1] + 1f075e0: eb007c58 bl 1f26748 + 1f075e4: e3570001 cmp r7, #1 + 1f075e8: 1afffff5 bne 1f075c4 + 1f075ec: eaffff76 b 1f073cc + 1f075f0: e3a03001 mov r3, #1 + 1f075f4: e1a01007 mov r1, r7 + 1f075f8: e1a02008 mov r2, r8 + 1f075fc: e5d50001 ldrb r0, [r5, #1] + 1f07600: eb007c50 bl 1f26748 + 1f07604: e3500000 cmp r0, #0 + 1f07608: 1affffda bne 1f07578 + 1f0760c: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f07610: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07614: e0622008 rsb r2, r2, r8 + 1f07618: e5c50003 strb r0, [r5, #3] + 1f0761c: e1520003 cmp r2, r3 + 1f07620: 2affff83 bcs 1f07434 + 1f07624: e5d56002 ldrb r6, [r5, #2] + 1f07628: e3560001 cmp r6, #1 + 1f0762c: 8a000001 bhi 1f07638 + 1f07630: eaffff7f b 1f07434 + 1f07634: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07638: e0888003 add r8, r8, r3 + 1f0763c: e2466001 sub r6, r6, #1 + 1f07640: e1a02008 mov r2, r8 + 1f07644: e3a03001 mov r3, #1 + 1f07648: e1a01007 mov r1, r7 + 1f0764c: e5d50001 ldrb r0, [r5, #1] + 1f07650: eb007c3c bl 1f26748 + 1f07654: e3560001 cmp r6, #1 + 1f07658: 1afffff5 bne 1f07634 + 1f0765c: eaffff74 b 1f07434 + 1f07660: e1a07009 mov r7, r9 + 1f07664: eaffff7c b 1f0745c + 1f07668: e2859048 add r9, r5, #72 ; 0x48 + 1f0766c: eaffff43 b 1f07380 + 1f07670: e2859048 add r9, r5, #72 ; 0x48 + 1f07674: eaffff5c b 1f073ec + 1f07678: e5903018 ldr r3, [r0, #24] + 1f0767c: e1510003 cmp r1, r3 + 1f07680: 2affff12 bcs 1f072d0 + 1f07684: eaffff9d b 1f07500 + 1f07688: e3a03001 mov r3, #1 + 1f0768c: e1a01009 mov r1, r9 + 1f07690: e1a02008 mov r2, r8 + 1f07694: e5d50001 ldrb r0, [r5, #1] + 1f07698: eb007c2a bl 1f26748 + 1f0769c: e3500000 cmp r0, #0 + 1f076a0: 1affffb4 bne 1f07578 + 1f076a4: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f076a8: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f076ac: e0622008 rsb r2, r2, r8 + 1f076b0: e5c50003 strb r0, [r5, #3] + 1f076b4: e1520003 cmp r2, r3 + 1f076b8: 2affff0d bcs 1f072f4 + 1f076bc: e5d57002 ldrb r7, [r5, #2] + 1f076c0: e3570001 cmp r7, #1 + 1f076c4: 8a000001 bhi 1f076d0 + 1f076c8: eaffff09 b 1f072f4 + 1f076cc: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f076d0: e0888003 add r8, r8, r3 + 1f076d4: e2477001 sub r7, r7, #1 + 1f076d8: e1a02008 mov r2, r8 + 1f076dc: e3a03001 mov r3, #1 + 1f076e0: e1a01009 mov r1, r9 + 1f076e4: e5d50001 ldrb r0, [r5, #1] + 1f076e8: eb007c16 bl 1f26748 + 1f076ec: e3570001 cmp r7, #1 + 1f076f0: 1afffff5 bne 1f076cc + 1f076f4: eafffefe b 1f072f4 + 1f076f8: e2859048 add r9, r5, #72 ; 0x48 + 1f076fc: eaffff04 b 1f07314 + 1f07700: e3a03001 mov r3, #1 + 1f07704: e1a0100b mov r1, fp + 1f07708: e1a02009 mov r2, r9 + 1f0770c: e5d50001 ldrb r0, [r5, #1] + 1f07710: eb007c0c bl 1f26748 + 1f07714: e3500000 cmp r0, #0 + 1f07718: 1affff96 bne 1f07578 + 1f0771c: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f07720: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07724: e0629009 rsb r9, r2, r9 + 1f07728: e5c50003 strb r0, [r5, #3] + 1f0772c: e1590003 cmp r9, r3 + 1f07730: 2affff54 bcs 1f07488 + 1f07734: e5d59002 ldrb r9, [r5, #2] + 1f07738: e3590001 cmp r9, #1 + 1f0773c: 8a000001 bhi 1f07748 + 1f07740: eaffff50 b 1f07488 + 1f07744: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07748: e0877003 add r7, r7, r3 + 1f0774c: e2499001 sub r9, r9, #1 + 1f07750: e1a02007 mov r2, r7 + 1f07754: e3a03001 mov r3, #1 + 1f07758: e1a0100b mov r1, fp + 1f0775c: e5d50001 ldrb r0, [r5, #1] + 1f07760: eb007bf8 bl 1f26748 + 1f07764: e3590001 cmp r9, #1 + 1f07768: 1afffff5 bne 1f07744 + 1f0776c: eaffff45 b 1f07488 + 1f07770: e3e00102 mvn r0, #-2147483648 ; 0x80000000 + 1f07774: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + +01f07778 : + 1f07778: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f0777c: e2513000 subs r3, r1, #0 + 1f07780: e1a0b000 mov fp, r0 + 1f07784: e24dd01c sub sp, sp, #28 + 1f07788: e5906000 ldr r6, [r0] + 1f0778c: e58d3004 str r3, [sp, #4] + 1f07790: 1a000105 bne 1f07bac + 1f07794: e596a014 ldr sl, [r6, #20] + 1f07798: e35a0000 cmp sl, #0 + 1f0779c: 1a0000dc bne 1f07b14 + 1f077a0: e5d63000 ldrb r3, [r6] + 1f077a4: e3530004 cmp r3, #4 + 1f077a8: 0a00010c beq 1f07be0 + 1f077ac: e596302c ldr r3, [r6, #44] ; 0x2c + 1f077b0: e3a0a001 mov sl, #1 + 1f077b4: e1a0400a mov r4, sl + 1f077b8: e1a09006 mov r9, r6 + 1f077bc: e2844001 add r4, r4, #1 + 1f077c0: e1540003 cmp r4, r3 + 1f077c4: 3a000059 bcc 1f07930 + 1f077c8: e35a0001 cmp sl, #1 + 1f077cc: 9a0000f3 bls 1f07ba0 + 1f077d0: e59b5000 ldr r5, [fp] + 1f077d4: e3a04002 mov r4, #2 + 1f077d8: e595302c ldr r3, [r5, #44] ; 0x2c + 1f077dc: e1540003 cmp r4, r3 + 1f077e0: 2a000055 bcs 1f0793c + 1f077e4: e5d53000 ldrb r3, [r5] + 1f077e8: e2433001 sub r3, r3, #1 + 1f077ec: e3530003 cmp r3, #3 + 1f077f0: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f077f4: ea000050 b 1f0793c + 1f077f8: 01f07a38 .word 0x01f07a38 + 1f077fc: 01f07948 .word 0x01f07948 + 1f07800: 01f0789c .word 0x01f0789c + 1f07804: 01f07808 .word 0x01f07808 + 1f07808: e1cb21d0 ldrd r2, [fp, #16] + 1f0780c: e1921003 orrs r1, r2, r3 + 1f07810: 0a000049 beq 1f0793c + 1f07814: e5db1007 ldrb r1, [fp, #7] + 1f07818: e59b0008 ldr r0, [fp, #8] + 1f0781c: e3510002 cmp r1, #2 + 1f07820: e0600004 rsb r0, r0, r4 + 1f07824: 0a000155 beq 1f07d80 + 1f07828: e3510003 cmp r1, #3 + 1f0782c: 0a0001af beq 1f07ef0 + 1f07830: e5953038 ldr r3, [r5, #56] ; 0x38 + 1f07834: e5956044 ldr r6, [r5, #68] ; 0x44 + 1f07838: e08383a4 add r8, r3, r4, lsr #7 + 1f0783c: e1580006 cmp r8, r6 + 1f07840: 0a0000e9 beq 1f07bec + 1f07844: e5d53003 ldrb r3, [r5, #3] + 1f07848: e2857048 add r7, r5, #72 ; 0x48 + 1f0784c: e3530000 cmp r3, #0 + 1f07850: 1a0001aa bne 1f07f00 + 1f07854: e3a03001 mov r3, #1 + 1f07858: e1a02008 mov r2, r8 + 1f0785c: e1a01007 mov r1, r7 + 1f07860: e5d50001 ldrb r0, [r5, #1] + 1f07864: eb007b99 bl 1f266d0 + 1f07868: e3500000 cmp r0, #0 + 1f0786c: 1a0000c7 bne 1f07b90 + 1f07870: e5858044 str r8, [r5, #68] ; 0x44 + 1f07874: e1a03104 lsl r3, r4, #2 + 1f07878: e2033f7f and r3, r3, #508 ; 0x1fc + 1f0787c: e0872003 add r2, r7, r3 + 1f07880: e7d73003 ldrb r3, [r7, r3] + 1f07884: e1d200b2 ldrh r0, [r2, #2] + 1f07888: e5d22001 ldrb r2, [r2, #1] + 1f0788c: e1820400 orr r0, r2, r0, lsl #8 + 1f07890: e1830400 orr r0, r3, r0, lsl #8 + 1f07894: e3c00102 bic r0, r0, #-2147483648 ; 0x80000000 + 1f07898: ea000019 b 1f07904 + 1f0789c: e5956038 ldr r6, [r5, #56] ; 0x38 + 1f078a0: e5957044 ldr r7, [r5, #68] ; 0x44 + 1f078a4: e08663a4 add r6, r6, r4, lsr #7 + 1f078a8: e1560007 cmp r6, r7 + 1f078ac: 0a00012f beq 1f07d70 + 1f078b0: e5d53003 ldrb r3, [r5, #3] + 1f078b4: e2858048 add r8, r5, #72 ; 0x48 + 1f078b8: e3530000 cmp r3, #0 + 1f078bc: 1a0000cc bne 1f07bf4 + 1f078c0: e3a03001 mov r3, #1 + 1f078c4: e1a02006 mov r2, r6 + 1f078c8: e1a01008 mov r1, r8 + 1f078cc: e5d50001 ldrb r0, [r5, #1] + 1f078d0: eb007b7e bl 1f266d0 + 1f078d4: e3500000 cmp r0, #0 + 1f078d8: 1a0000ac bne 1f07b90 + 1f078dc: e5856044 str r6, [r5, #68] ; 0x44 + 1f078e0: e1a03104 lsl r3, r4, #2 + 1f078e4: e2033f7f and r3, r3, #508 ; 0x1fc + 1f078e8: e0882003 add r2, r8, r3 + 1f078ec: e7d83003 ldrb r3, [r8, r3] + 1f078f0: e1d200b2 ldrh r0, [r2, #2] + 1f078f4: e5d22001 ldrb r2, [r2, #1] + 1f078f8: e1820400 orr r0, r2, r0, lsl #8 + 1f078fc: e1830400 orr r0, r3, r0, lsl #8 + 1f07900: e3c0020f bic r0, r0, #-268435456 ; 0xf0000000 + 1f07904: e3500000 cmp r0, #0 + 1f07908: 0a000028 beq 1f079b0 + 1f0790c: e3700001 cmn r0, #1 + 1f07910: 13500001 cmpne r0, #1 + 1f07914: 0a000009 beq 1f07940 + 1f07918: e15a0004 cmp sl, r4 + 1f0791c: 0a00009f beq 1f07ba0 + 1f07920: e599302c ldr r3, [r9, #44] ; 0x2c + 1f07924: e2844001 add r4, r4, #1 + 1f07928: e1540003 cmp r4, r3 + 1f0792c: 2affffa5 bcs 1f077c8 + 1f07930: e3540001 cmp r4, #1 + 1f07934: e59b5000 ldr r5, [fp] + 1f07938: 8affffa6 bhi 1f077d8 + 1f0793c: e3a00001 mov r0, #1 + 1f07940: e28dd01c add sp, sp, #28 + 1f07944: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f07948: e5956038 ldr r6, [r5, #56] ; 0x38 + 1f0794c: e5957044 ldr r7, [r5, #68] ; 0x44 + 1f07950: e0866424 add r6, r6, r4, lsr #8 + 1f07954: e1560007 cmp r6, r7 + 1f07958: 0a000106 beq 1f07d78 + 1f0795c: e5d53003 ldrb r3, [r5, #3] + 1f07960: e2858048 add r8, r5, #72 ; 0x48 + 1f07964: e3530000 cmp r3, #0 + 1f07968: 1a0000c0 bne 1f07c70 + 1f0796c: e3a03001 mov r3, #1 + 1f07970: e1a02006 mov r2, r6 + 1f07974: e1a01008 mov r1, r8 + 1f07978: e5d50001 ldrb r0, [r5, #1] + 1f0797c: eb007b53 bl 1f266d0 + 1f07980: e3500000 cmp r0, #0 + 1f07984: 1a000081 bne 1f07b90 + 1f07988: e5856044 str r6, [r5, #68] ; 0x44 + 1f0798c: e1a02084 lsl r2, r4, #1 + 1f07990: e30031fe movw r3, #510 ; 0x1fe + 1f07994: e0033002 and r3, r3, r2 + 1f07998: e0882003 add r2, r8, r3 + 1f0799c: e7d83003 ldrb r3, [r8, r3] + 1f079a0: e5d20001 ldrb r0, [r2, #1] + 1f079a4: e1830400 orr r0, r3, r0, lsl #8 + 1f079a8: e3500000 cmp r0, #0 + 1f079ac: 1affffd6 bne 1f0790c + 1f079b0: e5d93000 ldrb r3, [r9] + 1f079b4: e1a06009 mov r6, r9 + 1f079b8: e3530004 cmp r3, #4 + 1f079bc: 0a00016e beq 1f07f7c + 1f079c0: e596302c ldr r3, [r6, #44] ; 0x2c + 1f079c4: e1530004 cmp r3, r4 + 1f079c8: 9affffdb bls 1f0793c + 1f079cc: e3e02000 mvn r2, #0 + 1f079d0: e1a01004 mov r1, r4 + 1f079d4: e1a00006 mov r0, r6 + 1f079d8: ebfffaf0 bl 1f065a0 + 1f079dc: e59d2004 ldr r2, [sp, #4] + 1f079e0: e16f3f10 clz r3, r0 + 1f079e4: e3520000 cmp r2, #0 + 1f079e8: e1a032a3 lsr r3, r3, #5 + 1f079ec: 03a03000 moveq r3, #0 + 1f079f0: e3530000 cmp r3, #0 + 1f079f4: 0a000008 beq 1f07a1c + 1f079f8: e3520001 cmp r2, #1 + 1f079fc: 9affffce bls 1f0793c + 1f07a00: e596302c ldr r3, [r6, #44] ; 0x2c + 1f07a04: e1520003 cmp r2, r3 + 1f07a08: 2affffcb bcs 1f0793c + 1f07a0c: e1a01002 mov r1, r2 + 1f07a10: e1a00006 mov r0, r6 + 1f07a14: e1a02004 mov r2, r4 + 1f07a18: ebfffae0 bl 1f065a0 + 1f07a1c: e3500000 cmp r0, #0 + 1f07a20: 0a000158 beq 1f07f88 + 1f07a24: e3500001 cmp r0, #1 + 1f07a28: 1affffc3 bne 1f0793c + 1f07a2c: e3e00000 mvn r0, #0 + 1f07a30: e28dd01c add sp, sp, #28 + 1f07a34: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f07a38: e08430a4 add r3, r4, r4, lsr #1 + 1f07a3c: e5958038 ldr r8, [r5, #56] ; 0x38 + 1f07a40: e5956044 ldr r6, [r5, #68] ; 0x44 + 1f07a44: e08874a3 add r7, r8, r3, lsr #9 + 1f07a48: e58d300c str r3, [sp, #12] + 1f07a4c: e1560007 cmp r6, r7 + 1f07a50: 0a00000d beq 1f07a8c + 1f07a54: e5d53003 ldrb r3, [r5, #3] + 1f07a58: e3530000 cmp r3, #0 + 1f07a5c: e2853048 add r3, r5, #72 ; 0x48 + 1f07a60: 058d3008 streq r3, [sp, #8] + 1f07a64: 1a0000a0 bne 1f07cec + 1f07a68: e59d1008 ldr r1, [sp, #8] + 1f07a6c: e3a03001 mov r3, #1 + 1f07a70: e1a02007 mov r2, r7 + 1f07a74: e5d50001 ldrb r0, [r5, #1] + 1f07a78: eb007b14 bl 1f266d0 + 1f07a7c: e3500000 cmp r0, #0 + 1f07a80: 1a000042 bne 1f07b90 + 1f07a84: e5958038 ldr r8, [r5, #56] ; 0x38 + 1f07a88: e5857044 str r7, [r5, #68] ; 0x44 + 1f07a8c: e59d100c ldr r1, [sp, #12] + 1f07a90: e2813001 add r3, r1, #1 + 1f07a94: e58d300c str r3, [sp, #12] + 1f07a98: e1a02003 mov r2, r3 + 1f07a9c: e7e83051 ubfx r3, r1, #0, #9 + 1f07aa0: e0853003 add r3, r5, r3 + 1f07aa4: e08884a2 add r8, r8, r2, lsr #9 + 1f07aa8: e1570008 cmp r7, r8 + 1f07aac: e5d33048 ldrb r3, [r3, #72] ; 0x48 + 1f07ab0: e58d3010 str r3, [sp, #16] + 1f07ab4: 0a00000c beq 1f07aec + 1f07ab8: e5d53003 ldrb r3, [r5, #3] + 1f07abc: e3530000 cmp r3, #0 + 1f07ac0: e2853048 add r3, r5, #72 ; 0x48 + 1f07ac4: 058d3008 streq r3, [sp, #8] + 1f07ac8: 1a000164 bne 1f08060 + 1f07acc: e59d1008 ldr r1, [sp, #8] + 1f07ad0: e3a03001 mov r3, #1 + 1f07ad4: e1a02008 mov r2, r8 + 1f07ad8: e5d50001 ldrb r0, [r5, #1] + 1f07adc: eb007afb bl 1f266d0 + 1f07ae0: e3500000 cmp r0, #0 + 1f07ae4: 1a000029 bne 1f07b90 + 1f07ae8: e5858044 str r8, [r5, #68] ; 0x44 + 1f07aec: e59d300c ldr r3, [sp, #12] + 1f07af0: e3140001 tst r4, #1 + 1f07af4: e59d2010 ldr r2, [sp, #16] + 1f07af8: e7e83053 ubfx r3, r3, #0, #9 + 1f07afc: e0855003 add r5, r5, r3 + 1f07b00: e5d53048 ldrb r3, [r5, #72] ; 0x48 + 1f07b04: e1820403 orr r0, r2, r3, lsl #8 + 1f07b08: 07eb0050 ubfxeq r0, r0, #0, #12 + 1f07b0c: 11a00220 lsrne r0, r0, #4 + 1f07b10: eaffff7b b 1f07904 + 1f07b14: e596302c ldr r3, [r6, #44] ; 0x2c + 1f07b18: e15a0003 cmp sl, r3 + 1f07b1c: 2affff1f bcs 1f077a0 + 1f07b20: e5d62000 ldrb r2, [r6] + 1f07b24: e3520004 cmp r2, #4 + 1f07b28: 1affff21 bne 1f077b4 + 1f07b2c: e24a4002 sub r4, sl, #2 + 1f07b30: e2433002 sub r3, r3, #2 + 1f07b34: e1540003 cmp r4, r3 + 1f07b38: 23a04000 movcs r4, #0 + 1f07b3c: e1a05004 mov r5, r4 + 1f07b40: e5967040 ldr r7, [r6, #64] ; 0x40 + 1f07b44: e5968044 ldr r8, [r6, #68] ; 0x44 + 1f07b48: e0877625 add r7, r7, r5, lsr #12 + 1f07b4c: e1580007 cmp r8, r7 + 1f07b50: 0a000096 beq 1f07db0 + 1f07b54: e5d63003 ldrb r3, [r6, #3] + 1f07b58: e3530000 cmp r3, #0 + 1f07b5c: e2863048 add r3, r6, #72 ; 0x48 + 1f07b60: 058d3008 streq r3, [sp, #8] + 1f07b64: 1a00011c bne 1f07fdc + 1f07b68: e59d1008 ldr r1, [sp, #8] + 1f07b6c: e3a03001 mov r3, #1 + 1f07b70: e1a02007 mov r2, r7 + 1f07b74: e5d60001 ldrb r0, [r6, #1] + 1f07b78: eb007ad4 bl 1f266d0 + 1f07b7c: e3500000 cmp r0, #0 + 1f07b80: 0a000089 beq 1f07dac + 1f07b84: e3e00000 mvn r0, #0 + 1f07b88: e5860044 str r0, [r6, #68] ; 0x44 + 1f07b8c: eaffff6b b 1f07940 + 1f07b90: e3e00000 mvn r0, #0 + 1f07b94: e5850044 str r0, [r5, #68] ; 0x44 + 1f07b98: e28dd01c add sp, sp, #28 + 1f07b9c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f07ba0: e3a00000 mov r0, #0 + 1f07ba4: e28dd01c add sp, sp, #28 + 1f07ba8: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f07bac: ebfffdaa bl 1f0725c + 1f07bb0: e3500001 cmp r0, #1 + 1f07bb4: 9affff60 bls 1f0793c + 1f07bb8: e3700001 cmn r0, #1 + 1f07bbc: 0affff9a beq 1f07a2c + 1f07bc0: e596302c ldr r3, [r6, #44] ; 0x2c + 1f07bc4: e1500003 cmp r0, r3 + 1f07bc8: 3affff5c bcc 1f07940 + 1f07bcc: e5d62000 ldrb r2, [r6] + 1f07bd0: e59da004 ldr sl, [sp, #4] + 1f07bd4: e3520004 cmp r2, #4 + 1f07bd8: 1afffef5 bne 1f077b4 + 1f07bdc: eaffffd2 b 1f07b2c + 1f07be0: e3a0a001 mov sl, #1 + 1f07be4: e3a04000 mov r4, #0 + 1f07be8: eaffffd3 b 1f07b3c + 1f07bec: e2857048 add r7, r5, #72 ; 0x48 + 1f07bf0: eaffff1f b 1f07874 + 1f07bf4: e3a03001 mov r3, #1 + 1f07bf8: e1a01008 mov r1, r8 + 1f07bfc: e1a02007 mov r2, r7 + 1f07c00: e5d50001 ldrb r0, [r5, #1] + 1f07c04: eb007acf bl 1f26748 + 1f07c08: e3500000 cmp r0, #0 + 1f07c0c: 1affff86 bne 1f07a2c + 1f07c10: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f07c14: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07c18: e0622007 rsb r2, r2, r7 + 1f07c1c: e5c50003 strb r0, [r5, #3] + 1f07c20: e1520003 cmp r2, r3 + 1f07c24: 2affff25 bcs 1f078c0 + 1f07c28: e5d52002 ldrb r2, [r5, #2] + 1f07c2c: e3520001 cmp r2, #1 + 1f07c30: 9affff22 bls 1f078c0 + 1f07c34: e58d4008 str r4, [sp, #8] + 1f07c38: e1a04002 mov r4, r2 + 1f07c3c: ea000000 b 1f07c44 + 1f07c40: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07c44: e0877003 add r7, r7, r3 + 1f07c48: e2444001 sub r4, r4, #1 + 1f07c4c: e1a02007 mov r2, r7 + 1f07c50: e3a03001 mov r3, #1 + 1f07c54: e1a01008 mov r1, r8 + 1f07c58: e5d50001 ldrb r0, [r5, #1] + 1f07c5c: eb007ab9 bl 1f26748 + 1f07c60: e3540001 cmp r4, #1 + 1f07c64: 1afffff5 bne 1f07c40 + 1f07c68: e59d4008 ldr r4, [sp, #8] + 1f07c6c: eaffff13 b 1f078c0 + 1f07c70: e3a03001 mov r3, #1 + 1f07c74: e1a01008 mov r1, r8 + 1f07c78: e1a02007 mov r2, r7 + 1f07c7c: e5d50001 ldrb r0, [r5, #1] + 1f07c80: eb007ab0 bl 1f26748 + 1f07c84: e3500000 cmp r0, #0 + 1f07c88: 1affff67 bne 1f07a2c + 1f07c8c: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f07c90: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07c94: e0622007 rsb r2, r2, r7 + 1f07c98: e5c50003 strb r0, [r5, #3] + 1f07c9c: e1520003 cmp r2, r3 + 1f07ca0: 2affff31 bcs 1f0796c + 1f07ca4: e5d52002 ldrb r2, [r5, #2] + 1f07ca8: e3520001 cmp r2, #1 + 1f07cac: 9affff2e bls 1f0796c + 1f07cb0: e58d4008 str r4, [sp, #8] + 1f07cb4: e1a04002 mov r4, r2 + 1f07cb8: ea000000 b 1f07cc0 + 1f07cbc: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07cc0: e0877003 add r7, r7, r3 + 1f07cc4: e2444001 sub r4, r4, #1 + 1f07cc8: e1a02007 mov r2, r7 + 1f07ccc: e3a03001 mov r3, #1 + 1f07cd0: e1a01008 mov r1, r8 + 1f07cd4: e5d50001 ldrb r0, [r5, #1] + 1f07cd8: eb007a9a bl 1f26748 + 1f07cdc: e3540001 cmp r4, #1 + 1f07ce0: 1afffff5 bne 1f07cbc + 1f07ce4: e59d4008 ldr r4, [sp, #8] + 1f07ce8: eaffff1f b 1f0796c + 1f07cec: e1a02003 mov r2, r3 + 1f07cf0: e5d50001 ldrb r0, [r5, #1] + 1f07cf4: e58d2008 str r2, [sp, #8] + 1f07cf8: e1a01002 mov r1, r2 + 1f07cfc: e3a03001 mov r3, #1 + 1f07d00: e1a02006 mov r2, r6 + 1f07d04: eb007a8f bl 1f26748 + 1f07d08: e3500000 cmp r0, #0 + 1f07d0c: 1affff46 bne 1f07a2c + 1f07d10: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f07d14: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07d18: e0622006 rsb r2, r2, r6 + 1f07d1c: e5c50003 strb r0, [r5, #3] + 1f07d20: e1520003 cmp r2, r3 + 1f07d24: 2affff4f bcs 1f07a68 + 1f07d28: e5d58002 ldrb r8, [r5, #2] + 1f07d2c: e3580001 cmp r8, #1 + 1f07d30: 9affff4c bls 1f07a68 + 1f07d34: e58d4010 str r4, [sp, #16] + 1f07d38: e59d4008 ldr r4, [sp, #8] + 1f07d3c: ea000000 b 1f07d44 + 1f07d40: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07d44: e0866003 add r6, r6, r3 + 1f07d48: e2488001 sub r8, r8, #1 + 1f07d4c: e1a02006 mov r2, r6 + 1f07d50: e3a03001 mov r3, #1 + 1f07d54: e1a01004 mov r1, r4 + 1f07d58: e5d50001 ldrb r0, [r5, #1] + 1f07d5c: eb007a79 bl 1f26748 + 1f07d60: e3580001 cmp r8, #1 + 1f07d64: 1afffff5 bne 1f07d40 + 1f07d68: e59d4010 ldr r4, [sp, #16] + 1f07d6c: eaffff3d b 1f07a68 + 1f07d70: e2858048 add r8, r5, #72 ; 0x48 + 1f07d74: eafffed9 b 1f078e0 + 1f07d78: e2858048 add r8, r5, #72 ; 0x48 + 1f07d7c: eaffff02 b 1f0798c + 1f07d80: e2522001 subs r2, r2, #1 + 1f07d84: e1d510ba ldrh r1, [r5, #10] + 1f07d88: e2c33000 sbc r3, r3, #0 + 1f07d8c: e1a024a2 lsr r2, r2, #9 + 1f07d90: e1822b83 orr r2, r2, r3, lsl #23 + 1f07d94: e732f112 udiv r2, r2, r1 + 1f07d98: e1500002 cmp r0, r2 + 1f07d9c: 8afffee6 bhi 1f0793c + 1f07da0: 0afffedc beq 1f07918 + 1f07da4: e2840001 add r0, r4, #1 + 1f07da8: eafffed5 b 1f07904 + 1f07dac: e5867044 str r7, [r6, #68] ; 0x44 + 1f07db0: e2052007 and r2, r5, #7 + 1f07db4: e3a03001 mov r3, #1 + 1f07db8: e596802c ldr r8, [r6, #44] ; 0x2c + 1f07dbc: e7e801d5 ubfx r0, r5, #3, #9 + 1f07dc0: e1a03213 lsl r3, r3, r2 + 1f07dc4: e2488002 sub r8, r8, #2 + 1f07dc8: e6ef3073 uxtb r3, r3 + 1f07dcc: e0862000 add r2, r6, r0 + 1f07dd0: e285c001 add ip, r5, #1 + 1f07dd4: e1a0e083 lsl lr, r3, #1 + 1f07dd8: e15c0008 cmp ip, r8 + 1f07ddc: e3a01000 mov r1, #0 + 1f07de0: 23a00a01 movcs r0, #4096 ; 0x1000 + 1f07de4: e5d27048 ldrb r7, [r2, #72] ; 0x48 + 1f07de8: 31a0100c movcc r1, ip + 1f07dec: e0077003 and r7, r7, r3 + 1f07df0: 36ef307e uxtbcc r3, lr + 1f07df4: 21a03001 movcs r3, r1 + 1f07df8: e3570000 cmp r7, #0 + 1f07dfc: 1a000031 bne 1f07ec8 + 1f07e00: e37c0003 cmn ip, #3 + 1f07e04: e2854002 add r4, r5, #2 + 1f07e08: 8a0000d9 bhi 1f08174 + 1f07e0c: e5962040 ldr r2, [r6, #64] ; 0x40 + 1f07e10: e2058007 and r8, r5, #7 + 1f07e14: e5969044 ldr r9, [r6, #68] ; 0x44 + 1f07e18: e3a03001 mov r3, #1 + 1f07e1c: e0822625 add r2, r2, r5, lsr #12 + 1f07e20: e7e851d5 ubfx r5, r5, #3, #9 + 1f07e24: e1a08813 lsl r8, r3, r8 + 1f07e28: e1590002 cmp r9, r2 + 1f07e2c: e58d2008 str r2, [sp, #8] + 1f07e30: e6ef8078 uxtb r8, r8 + 1f07e34: 0a00000d beq 1f07e70 + 1f07e38: e5d62003 ldrb r2, [r6, #3] + 1f07e3c: e3520000 cmp r2, #0 + 1f07e40: 02863048 addeq r3, r6, #72 ; 0x48 + 1f07e44: 058d300c streq r3, [sp, #12] + 1f07e48: 1a0000a5 bne 1f080e4 + 1f07e4c: e59d100c ldr r1, [sp, #12] + 1f07e50: e3a03001 mov r3, #1 + 1f07e54: e59d2008 ldr r2, [sp, #8] + 1f07e58: e5d60001 ldrb r0, [r6, #1] + 1f07e5c: eb007a1b bl 1f266d0 + 1f07e60: e3500000 cmp r0, #0 + 1f07e64: 1affff46 bne 1f07b84 + 1f07e68: e59d3008 ldr r3, [sp, #8] + 1f07e6c: e5863044 str r3, [r6, #68] ; 0x44 + 1f07e70: e0865005 add r5, r6, r5 + 1f07e74: e5d53048 ldrb r3, [r5, #72] ; 0x48 + 1f07e78: e1180003 tst r8, r3 + 1f07e7c: 1afffeae bne 1f0793c + 1f07e80: e59d2004 ldr r2, [sp, #4] + 1f07e84: e0288003 eor r8, r8, r3 + 1f07e88: e3a03001 mov r3, #1 + 1f07e8c: e5c58048 strb r8, [r5, #72] ; 0x48 + 1f07e90: e3520000 cmp r2, #0 + 1f07e94: e5c63003 strb r3, [r6, #3] + 1f07e98: 03a03002 moveq r3, #2 + 1f07e9c: 05cb3007 strbeq r3, [fp, #7] + 1f07ea0: 0a0000af beq 1f08164 + 1f07ea4: e5db3007 ldrb r3, [fp, #7] + 1f07ea8: e3530002 cmp r3, #2 + 1f07eac: 0a000041 beq 1f07fb8 + 1f07eb0: e5d63000 ldrb r3, [r6] + 1f07eb4: e3530004 cmp r3, #4 + 1f07eb8: 0a00002f beq 1f07f7c + 1f07ebc: e3540001 cmp r4, #1 + 1f07ec0: 9afffe9d bls 1f0793c + 1f07ec4: eafffebd b 1f079c0 + 1f07ec8: e1540001 cmp r4, r1 + 1f07ecc: e1a05001 mov r5, r1 + 1f07ed0: 0affff32 beq 1f07ba0 + 1f07ed4: e3530000 cmp r3, #0 + 1f07ed8: 1affffbb bne 1f07dcc + 1f07edc: e2800001 add r0, r0, #1 + 1f07ee0: e3a03001 mov r3, #1 + 1f07ee4: e3500c02 cmp r0, #512 ; 0x200 + 1f07ee8: 3affffb7 bcc 1f07dcc + 1f07eec: eaffff13 b 1f07b40 + 1f07ef0: e59b3018 ldr r3, [fp, #24] + 1f07ef4: e1500003 cmp r0, r3 + 1f07ef8: 2afffe4c bcs 1f07830 + 1f07efc: eaffffa8 b 1f07da4 + 1f07f00: e3a03001 mov r3, #1 + 1f07f04: e1a01007 mov r1, r7 + 1f07f08: e1a02006 mov r2, r6 + 1f07f0c: e5d50001 ldrb r0, [r5, #1] + 1f07f10: eb007a0c bl 1f26748 + 1f07f14: e3500000 cmp r0, #0 + 1f07f18: 1afffec3 bne 1f07a2c + 1f07f1c: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f07f20: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07f24: e0622006 rsb r2, r2, r6 + 1f07f28: e5c50003 strb r0, [r5, #3] + 1f07f2c: e1520003 cmp r2, r3 + 1f07f30: 2afffe47 bcs 1f07854 + 1f07f34: e5d52002 ldrb r2, [r5, #2] + 1f07f38: e3520001 cmp r2, #1 + 1f07f3c: 9afffe44 bls 1f07854 + 1f07f40: e58d4008 str r4, [sp, #8] + 1f07f44: e1a04002 mov r4, r2 + 1f07f48: ea000000 b 1f07f50 + 1f07f4c: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f07f50: e0866003 add r6, r6, r3 + 1f07f54: e2444001 sub r4, r4, #1 + 1f07f58: e1a02006 mov r2, r6 + 1f07f5c: e3a03001 mov r3, #1 + 1f07f60: e1a01007 mov r1, r7 + 1f07f64: e5d50001 ldrb r0, [r5, #1] + 1f07f68: eb0079f6 bl 1f26748 + 1f07f6c: e3540001 cmp r4, #1 + 1f07f70: 1afffff5 bne 1f07f4c + 1f07f74: e59d4008 ldr r4, [sp, #8] + 1f07f78: eafffe35 b 1f07854 + 1f07f7c: e5db3007 ldrb r3, [fp, #7] + 1f07f80: e3530002 cmp r3, #2 + 1f07f84: 1affffcc bne 1f07ebc + 1f07f88: e596302c ldr r3, [r6, #44] ; 0x2c + 1f07f8c: e1a00004 mov r0, r4 + 1f07f90: e5962018 ldr r2, [r6, #24] + 1f07f94: e2433002 sub r3, r3, #2 + 1f07f98: e5864014 str r4, [r6, #20] + 1f07f9c: e1520003 cmp r2, r3 + 1f07fa0: e5d63004 ldrb r3, [r6, #4] + 1f07fa4: 32422001 subcc r2, r2, #1 + 1f07fa8: 35862018 strcc r2, [r6, #24] + 1f07fac: e3833001 orr r3, r3, #1 + 1f07fb0: e5c63004 strb r3, [r6, #4] + 1f07fb4: eafffe61 b 1f07940 + 1f07fb8: e28a3001 add r3, sl, #1 + 1f07fbc: e1530004 cmp r3, r4 + 1f07fc0: 0a000067 beq 1f08164 + 1f07fc4: e59b3008 ldr r3, [fp, #8] + 1f07fc8: e3a02003 mov r2, #3 + 1f07fcc: e5cb2007 strb r2, [fp, #7] + 1f07fd0: e063300a rsb r3, r3, sl + 1f07fd4: e58b3018 str r3, [fp, #24] + 1f07fd8: eaffffb4 b 1f07eb0 + 1f07fdc: e1a02003 mov r2, r3 + 1f07fe0: e5d60001 ldrb r0, [r6, #1] + 1f07fe4: e58d2008 str r2, [sp, #8] + 1f07fe8: e1a01002 mov r1, r2 + 1f07fec: e3a03001 mov r3, #1 + 1f07ff0: e1a02008 mov r2, r8 + 1f07ff4: eb0079d3 bl 1f26748 + 1f07ff8: e3500000 cmp r0, #0 + 1f07ffc: 1afffe8a bne 1f07a2c + 1f08000: e5962038 ldr r2, [r6, #56] ; 0x38 + 1f08004: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f08008: e0622008 rsb r2, r2, r8 + 1f0800c: e5c60003 strb r0, [r6, #3] + 1f08010: e1520003 cmp r2, r3 + 1f08014: 2afffed3 bcs 1f07b68 + 1f08018: e5d69002 ldrb r9, [r6, #2] + 1f0801c: e3590001 cmp r9, #1 + 1f08020: 9afffed0 bls 1f07b68 + 1f08024: e58da00c str sl, [sp, #12] + 1f08028: e59da008 ldr sl, [sp, #8] + 1f0802c: ea000000 b 1f08034 + 1f08030: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f08034: e0888003 add r8, r8, r3 + 1f08038: e2499001 sub r9, r9, #1 + 1f0803c: e1a02008 mov r2, r8 + 1f08040: e3a03001 mov r3, #1 + 1f08044: e1a0100a mov r1, sl + 1f08048: e5d60001 ldrb r0, [r6, #1] + 1f0804c: eb0079bd bl 1f26748 + 1f08050: e3590001 cmp r9, #1 + 1f08054: 1afffff5 bne 1f08030 + 1f08058: e59da00c ldr sl, [sp, #12] + 1f0805c: eafffec1 b 1f07b68 + 1f08060: e1a02003 mov r2, r3 + 1f08064: e5d50001 ldrb r0, [r5, #1] + 1f08068: e58d2008 str r2, [sp, #8] + 1f0806c: e1a01002 mov r1, r2 + 1f08070: e3a03001 mov r3, #1 + 1f08074: e1a02007 mov r2, r7 + 1f08078: eb0079b2 bl 1f26748 + 1f0807c: e3500000 cmp r0, #0 + 1f08080: 1afffe69 bne 1f07a2c + 1f08084: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f08088: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f0808c: e0622007 rsb r2, r2, r7 + 1f08090: e5c50003 strb r0, [r5, #3] + 1f08094: e1520003 cmp r2, r3 + 1f08098: 2afffe8b bcs 1f07acc + 1f0809c: e5d56002 ldrb r6, [r5, #2] + 1f080a0: e3560001 cmp r6, #1 + 1f080a4: 9afffe88 bls 1f07acc + 1f080a8: e58d4014 str r4, [sp, #20] + 1f080ac: e59d4008 ldr r4, [sp, #8] + 1f080b0: ea000000 b 1f080b8 + 1f080b4: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f080b8: e0877003 add r7, r7, r3 + 1f080bc: e2466001 sub r6, r6, #1 + 1f080c0: e1a02007 mov r2, r7 + 1f080c4: e3a03001 mov r3, #1 + 1f080c8: e1a01004 mov r1, r4 + 1f080cc: e5d50001 ldrb r0, [r5, #1] + 1f080d0: eb00799c bl 1f26748 + 1f080d4: e3560001 cmp r6, #1 + 1f080d8: 1afffff5 bne 1f080b4 + 1f080dc: e59d4014 ldr r4, [sp, #20] + 1f080e0: eafffe79 b 1f07acc + 1f080e4: e2862048 add r2, r6, #72 ; 0x48 + 1f080e8: e5d60001 ldrb r0, [r6, #1] + 1f080ec: e58d200c str r2, [sp, #12] + 1f080f0: e1a01002 mov r1, r2 + 1f080f4: e1a02009 mov r2, r9 + 1f080f8: eb007992 bl 1f26748 + 1f080fc: e3500000 cmp r0, #0 + 1f08100: 1afffe49 bne 1f07a2c + 1f08104: e5962038 ldr r2, [r6, #56] ; 0x38 + 1f08108: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f0810c: e0622009 rsb r2, r2, r9 + 1f08110: e5c67003 strb r7, [r6, #3] + 1f08114: e1520003 cmp r2, r3 + 1f08118: 2affff4b bcs 1f07e4c + 1f0811c: e5d67002 ldrb r7, [r6, #2] + 1f08120: e3570001 cmp r7, #1 + 1f08124: 9affff48 bls 1f07e4c + 1f08128: e58d4010 str r4, [sp, #16] + 1f0812c: e59d400c ldr r4, [sp, #12] + 1f08130: ea000000 b 1f08138 + 1f08134: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f08138: e0899003 add r9, r9, r3 + 1f0813c: e2477001 sub r7, r7, #1 + 1f08140: e1a02009 mov r2, r9 + 1f08144: e3a03001 mov r3, #1 + 1f08148: e1a01004 mov r1, r4 + 1f0814c: e5d60001 ldrb r0, [r6, #1] + 1f08150: eb00797c bl 1f26748 + 1f08154: e3570001 cmp r7, #1 + 1f08158: 1afffff5 bne 1f08134 + 1f0815c: e59d4010 ldr r4, [sp, #16] + 1f08160: eaffff39 b 1f07e4c + 1f08164: e5d63000 ldrb r3, [r6] + 1f08168: e3530004 cmp r3, #4 + 1f0816c: 1affff52 bne 1f07ebc + 1f08170: eaffff84 b 1f07f88 + 1f08174: e1a00004 mov r0, r4 + 1f08178: eafffdf0 b 1f07940 + +01f0817c : + 1f0817c: e5902030 ldr r2, [r0, #48] ; 0x30 + 1f08180: e3520000 cmp r2, #0 + 1f08184: 1a000001 bne 1f08190 + 1f08188: e3a00004 mov r0, #4 + 1f0818c: e12fff1e bx lr + 1f08190: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f08194: e5905000 ldr r5, [r0] + 1f08198: e5904028 ldr r4, [r0, #40] ; 0x28 + 1f0819c: e5d51000 ldrb r1, [r5] + 1f081a0: e2844020 add r4, r4, #32 + 1f081a4: e3510004 cmp r1, #4 + 1f081a8: 03a01201 moveq r1, #268435456 ; 0x10000000 + 1f081ac: 13a01602 movne r1, #2097152 ; 0x200000 + 1f081b0: e1540001 cmp r4, r1 + 1f081b4: 3a000001 bcc 1f081c0 + 1f081b8: e3a00004 mov r0, #4 + 1f081bc: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f081c0: e7e86054 ubfx r6, r4, #0, #9 + 1f081c4: e1a08000 mov r8, r0 + 1f081c8: e3560000 cmp r6, #0 + 1f081cc: 1a000018 bne 1f08234 + 1f081d0: e590102c ldr r1, [r0, #44] ; 0x2c + 1f081d4: e2822001 add r2, r2, #1 + 1f081d8: e5802030 str r2, [r0, #48] ; 0x30 + 1f081dc: e3510000 cmp r1, #0 + 1f081e0: 0a000019 beq 1f0824c + 1f081e4: e1d520ba ldrh r2, [r5, #10] + 1f081e8: e2422001 sub r2, r2, #1 + 1f081ec: e01274a4 ands r7, r2, r4, lsr #9 + 1f081f0: 1a00000f bne 1f08234 + 1f081f4: ebfffc18 bl 1f0725c + 1f081f8: e3500001 cmp r0, #1 + 1f081fc: 9a000019 bls 1f08268 + 1f08200: e3700001 cmn r0, #1 + 1f08204: 0a000019 beq 1f08270 + 1f08208: e595202c ldr r2, [r5, #44] ; 0x2c + 1f0820c: e1500002 cmp r0, r2 + 1f08210: 2a000010 bcs 1f08258 + 1f08214: e2422002 sub r2, r2, #2 + 1f08218: e2401002 sub r1, r0, #2 + 1f0821c: e1510002 cmp r1, r2 + 1f08220: e588002c str r0, [r8, #44] ; 0x2c + 1f08224: 31d520ba ldrhcc r2, [r5, #10] + 1f08228: 35957040 ldrcc r7, [r5, #64] ; 0x40 + 1f0822c: 30277291 mlacc r7, r1, r2, r7 + 1f08230: e5887030 str r7, [r8, #48] ; 0x30 + 1f08234: e2852048 add r2, r5, #72 ; 0x48 + 1f08238: e5884028 str r4, [r8, #40] ; 0x28 + 1f0823c: e0822006 add r2, r2, r6 + 1f08240: e3a00000 mov r0, #0 + 1f08244: e5882034 str r2, [r8, #52] ; 0x34 + 1f08248: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f0824c: e1d520b8 ldrh r2, [r5, #8] + 1f08250: e15202a4 cmp r2, r4, lsr #5 + 1f08254: 8afffff6 bhi 1f08234 + 1f08258: e3a02000 mov r2, #0 + 1f0825c: e3a00004 mov r0, #4 + 1f08260: e5882030 str r2, [r8, #48] ; 0x30 + 1f08264: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f08268: e3a00002 mov r0, #2 + 1f0826c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f08270: e3a00001 mov r0, #1 + 1f08274: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f08278 : + 1f08278: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f0827c: e590b000 ldr fp, [r0] + 1f08280: e24dd01c sub sp, sp, #28 + 1f08284: e5db3000 ldrb r3, [fp] + 1f08288: e3530004 cmp r3, #4 + 1f0828c: 13a03602 movne r3, #2097152 ; 0x200000 + 1f08290: 03a03201 moveq r3, #268435456 ; 0x10000000 + 1f08294: e1530001 cmp r3, r1 + 1f08298: 8a000002 bhi 1f082a8 + 1f0829c: e3a00002 mov r0, #2 + 1f082a0: e28dd01c add sp, sp, #28 + 1f082a4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f082a8: e211301f ands r3, r1, #31 + 1f082ac: e1a04001 mov r4, r1 + 1f082b0: e58d3000 str r3, [sp] + 1f082b4: 1afffff8 bne 1f0829c + 1f082b8: e590a008 ldr sl, [r0, #8] + 1f082bc: e1a05000 mov r5, r0 + 1f082c0: e35a0000 cmp sl, #0 + 1f082c4: e5851028 str r1, [r5, #40] ; 0x28 + 1f082c8: 1a000019 bne 1f08334 + 1f082cc: e5db3000 ldrb r3, [fp] + 1f082d0: e3530002 cmp r3, #2 + 1f082d4: 9a000004 bls 1f082ec + 1f082d8: e59b303c ldr r3, [fp, #60] ; 0x3c + 1f082dc: e5c0a007 strb sl, [r0, #7] + 1f082e0: e3530000 cmp r3, #0 + 1f082e4: 11a0a003 movne sl, r3 + 1f082e8: 1a000011 bne 1f08334 + 1f082ec: e1db30b8 ldrh r3, [fp, #8] + 1f082f0: e15302a4 cmp r3, r4, lsr #5 + 1f082f4: 9affffe8 bls 1f0829c + 1f082f8: e59b303c ldr r3, [fp, #60] ; 0x3c + 1f082fc: e58d3000 str r3, [sp] + 1f08300: e5853030 str r3, [r5, #48] ; 0x30 + 1f08304: e3530000 cmp r3, #0 + 1f08308: e585a02c str sl, [r5, #44] ; 0x2c + 1f0830c: 0affffe2 beq 1f0829c + 1f08310: e1a01003 mov r1, r3 + 1f08314: e7e82054 ubfx r2, r4, #0, #9 + 1f08318: e28b3048 add r3, fp, #72 ; 0x48 + 1f0831c: e08144a4 add r4, r1, r4, lsr #9 + 1f08320: e0833002 add r3, r3, r2 + 1f08324: e5854030 str r4, [r5, #48] ; 0x30 + 1f08328: e3a00000 mov r0, #0 + 1f0832c: e5853034 str r3, [r5, #52] ; 0x34 + 1f08330: eaffffda b 1f082a0 + 1f08334: e1db30ba ldrh r3, [fp, #10] + 1f08338: e1a09483 lsl r9, r3, #9 + 1f0833c: e1540009 cmp r4, r9 + 1f08340: 3a00017f bcc 1f08944 + 1f08344: e0694004 rsb r4, r9, r4 + 1f08348: e1a0600b mov r6, fp + 1f0834c: e1a08005 mov r8, r5 + 1f08350: e35a0001 cmp sl, #1 + 1f08354: 9affffd0 bls 1f0829c + 1f08358: e596302c ldr r3, [r6, #44] ; 0x2c + 1f0835c: e153000a cmp r3, sl + 1f08360: 9affffcd bls 1f0829c + 1f08364: e5d63000 ldrb r3, [r6] + 1f08368: e2433001 sub r3, r3, #1 + 1f0836c: e3530003 cmp r3, #3 + 1f08370: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f08374: eaffffc8 b 1f0829c + 1f08378: 01f08504 .word 0x01f08504 + 1f0837c: 01f08498 .word 0x01f08498 + 1f08380: 01f08424 .word 0x01f08424 + 1f08384: 01f08388 .word 0x01f08388 + 1f08388: e1c821d0 ldrd r2, [r8, #16] + 1f0838c: e1921003 orrs r1, r2, r3 + 1f08390: 0affffc1 beq 1f0829c + 1f08394: e5d81007 ldrb r1, [r8, #7] + 1f08398: e5980008 ldr r0, [r8, #8] + 1f0839c: e3510002 cmp r1, #2 + 1f083a0: e060000a rsb r0, r0, sl + 1f083a4: 0a00010b beq 1f087d8 + 1f083a8: e3510003 cmp r1, #3 + 1f083ac: 0a000116 beq 1f0880c + 1f083b0: e5963038 ldr r3, [r6, #56] ; 0x38 + 1f083b4: e5965044 ldr r5, [r6, #68] ; 0x44 + 1f083b8: e08333aa add r3, r3, sl, lsr #7 + 1f083bc: e58d3004 str r3, [sp, #4] + 1f083c0: e1530005 cmp r3, r5 + 1f083c4: 0a000133 beq 1f08898 + 1f083c8: e5d63003 ldrb r3, [r6, #3] + 1f083cc: e2867048 add r7, r6, #72 ; 0x48 + 1f083d0: e3530000 cmp r3, #0 + 1f083d4: 1a000110 bne 1f0881c + 1f083d8: e3a03001 mov r3, #1 + 1f083dc: e59d2004 ldr r2, [sp, #4] + 1f083e0: e1a01007 mov r1, r7 + 1f083e4: e5d60001 ldrb r0, [r6, #1] + 1f083e8: eb0078b8 bl 1f266d0 + 1f083ec: e3500000 cmp r0, #0 + 1f083f0: 1a00008a bne 1f08620 + 1f083f4: e59d3004 ldr r3, [sp, #4] + 1f083f8: e5863044 str r3, [r6, #68] ; 0x44 + 1f083fc: e1a0310a lsl r3, sl, #2 + 1f08400: e2033f7f and r3, r3, #508 ; 0x1fc + 1f08404: e0872003 add r2, r7, r3 + 1f08408: e7d73003 ldrb r3, [r7, r3] + 1f0840c: e1d2a0b2 ldrh sl, [r2, #2] + 1f08410: e5d22001 ldrb r2, [r2, #1] + 1f08414: e182a40a orr sl, r2, sl, lsl #8 + 1f08418: e183a40a orr sl, r3, sl, lsl #8 + 1f0841c: e3caa102 bic sl, sl, #-2147483648 ; 0x80000000 + 1f08420: ea000070 b 1f085e8 + 1f08424: e5965038 ldr r5, [r6, #56] ; 0x38 + 1f08428: e5967044 ldr r7, [r6, #68] ; 0x44 + 1f0842c: e08533aa add r3, r5, sl, lsr #7 + 1f08430: e58d3004 str r3, [sp, #4] + 1f08434: e1530007 cmp r3, r7 + 1f08438: 0a000076 beq 1f08618 + 1f0843c: e5d63003 ldrb r3, [r6, #3] + 1f08440: e2865048 add r5, r6, #72 ; 0x48 + 1f08444: e3530000 cmp r3, #0 + 1f08448: 1a000097 bne 1f086ac + 1f0844c: e3a03001 mov r3, #1 + 1f08450: e59d2004 ldr r2, [sp, #4] + 1f08454: e1a01005 mov r1, r5 + 1f08458: e5d60001 ldrb r0, [r6, #1] + 1f0845c: eb00789b bl 1f266d0 + 1f08460: e3500000 cmp r0, #0 + 1f08464: 1a00006d bne 1f08620 + 1f08468: e59d3004 ldr r3, [sp, #4] + 1f0846c: e5863044 str r3, [r6, #68] ; 0x44 + 1f08470: e1a0a10a lsl sl, sl, #2 + 1f08474: e20aaf7f and sl, sl, #508 ; 0x1fc + 1f08478: e085200a add r2, r5, sl + 1f0847c: e7d5300a ldrb r3, [r5, sl] + 1f08480: e1d2a0b2 ldrh sl, [r2, #2] + 1f08484: e5d22001 ldrb r2, [r2, #1] + 1f08488: e182a40a orr sl, r2, sl, lsl #8 + 1f0848c: e183a40a orr sl, r3, sl, lsl #8 + 1f08490: e3caa20f bic sl, sl, #-268435456 ; 0xf0000000 + 1f08494: ea000053 b 1f085e8 + 1f08498: e5965038 ldr r5, [r6, #56] ; 0x38 + 1f0849c: e5967044 ldr r7, [r6, #68] ; 0x44 + 1f084a0: e085342a add r3, r5, sl, lsr #8 + 1f084a4: e58d3004 str r3, [sp, #4] + 1f084a8: e1530007 cmp r3, r7 + 1f084ac: 0a000057 beq 1f08610 + 1f084b0: e5d63003 ldrb r3, [r6, #3] + 1f084b4: e2865048 add r5, r6, #72 ; 0x48 + 1f084b8: e3530000 cmp r3, #0 + 1f084bc: 1a00005b bne 1f08630 + 1f084c0: e3a03001 mov r3, #1 + 1f084c4: e59d2004 ldr r2, [sp, #4] + 1f084c8: e1a01005 mov r1, r5 + 1f084cc: e5d60001 ldrb r0, [r6, #1] + 1f084d0: eb00787e bl 1f266d0 + 1f084d4: e3500000 cmp r0, #0 + 1f084d8: 1a000050 bne 1f08620 + 1f084dc: e59d3004 ldr r3, [sp, #4] + 1f084e0: e5863044 str r3, [r6, #68] ; 0x44 + 1f084e4: e1a0a08a lsl sl, sl, #1 + 1f084e8: e30031fe movw r3, #510 ; 0x1fe + 1f084ec: e003300a and r3, r3, sl + 1f084f0: e0852003 add r2, r5, r3 + 1f084f4: e7d53003 ldrb r3, [r5, r3] + 1f084f8: e5d2a001 ldrb sl, [r2, #1] + 1f084fc: e183a40a orr sl, r3, sl, lsl #8 + 1f08500: ea000038 b 1f085e8 + 1f08504: e08a30aa add r3, sl, sl, lsr #1 + 1f08508: e5967038 ldr r7, [r6, #56] ; 0x38 + 1f0850c: e5965044 ldr r5, [r6, #68] ; 0x44 + 1f08510: e58d300c str r3, [sp, #12] + 1f08514: e08734a3 add r3, r7, r3, lsr #9 + 1f08518: e1550003 cmp r5, r3 + 1f0851c: e58d3004 str r3, [sp, #4] + 1f08520: 0a00000e beq 1f08560 + 1f08524: e5d63003 ldrb r3, [r6, #3] + 1f08528: e3530000 cmp r3, #0 + 1f0852c: e2863048 add r3, r6, #72 ; 0x48 + 1f08530: 058d3008 streq r3, [sp, #8] + 1f08534: 1a00007b bne 1f08728 + 1f08538: e59d1008 ldr r1, [sp, #8] + 1f0853c: e3a03001 mov r3, #1 + 1f08540: e59d2004 ldr r2, [sp, #4] + 1f08544: e5d60001 ldrb r0, [r6, #1] + 1f08548: eb007860 bl 1f266d0 + 1f0854c: e3500000 cmp r0, #0 + 1f08550: 1a000032 bne 1f08620 + 1f08554: e59d3004 ldr r3, [sp, #4] + 1f08558: e5967038 ldr r7, [r6, #56] ; 0x38 + 1f0855c: e5863044 str r3, [r6, #68] ; 0x44 + 1f08560: e59d100c ldr r1, [sp, #12] + 1f08564: e2813001 add r3, r1, #1 + 1f08568: e58d300c str r3, [sp, #12] + 1f0856c: e1a02003 mov r2, r3 + 1f08570: e7e83051 ubfx r3, r1, #0, #9 + 1f08574: e0863003 add r3, r6, r3 + 1f08578: e08774a2 add r7, r7, r2, lsr #9 + 1f0857c: e59d2004 ldr r2, [sp, #4] + 1f08580: e1520007 cmp r2, r7 + 1f08584: e5d33048 ldrb r3, [r3, #72] ; 0x48 + 1f08588: e58d3010 str r3, [sp, #16] + 1f0858c: 0a00000c beq 1f085c4 + 1f08590: e5d63003 ldrb r3, [r6, #3] + 1f08594: e3530000 cmp r3, #0 + 1f08598: 1a0000c2 bne 1f088a8 + 1f0859c: e2863048 add r3, r6, #72 ; 0x48 + 1f085a0: e58d3008 str r3, [sp, #8] + 1f085a4: e59d1008 ldr r1, [sp, #8] + 1f085a8: e3a03001 mov r3, #1 + 1f085ac: e1a02007 mov r2, r7 + 1f085b0: e5d60001 ldrb r0, [r6, #1] + 1f085b4: eb007845 bl 1f266d0 + 1f085b8: e3500000 cmp r0, #0 + 1f085bc: 1a000017 bne 1f08620 + 1f085c0: e5867044 str r7, [r6, #68] ; 0x44 + 1f085c4: e59d300c ldr r3, [sp, #12] + 1f085c8: e31a0001 tst sl, #1 + 1f085cc: e59d2010 ldr r2, [sp, #16] + 1f085d0: e7e83053 ubfx r3, r3, #0, #9 + 1f085d4: e0866003 add r6, r6, r3 + 1f085d8: e5d63048 ldrb r3, [r6, #72] ; 0x48 + 1f085dc: e182a403 orr sl, r2, r3, lsl #8 + 1f085e0: 07eba05a ubfxeq sl, sl, #0, #12 + 1f085e4: 11a0a22a lsrne sl, sl, #4 + 1f085e8: e35a0001 cmp sl, #1 + 1f085ec: 9affff2a bls 1f0829c + 1f085f0: e59b302c ldr r3, [fp, #44] ; 0x2c + 1f085f4: e153000a cmp r3, sl + 1f085f8: 9affff27 bls 1f0829c + 1f085fc: e1590004 cmp r9, r4 + 1f08600: 8a000069 bhi 1f087ac + 1f08604: e0694004 rsb r4, r9, r4 + 1f08608: e5986000 ldr r6, [r8] + 1f0860c: eaffff4f b 1f08350 + 1f08610: e2865048 add r5, r6, #72 ; 0x48 + 1f08614: eaffffb2 b 1f084e4 + 1f08618: e2865048 add r5, r6, #72 ; 0x48 + 1f0861c: eaffff93 b 1f08470 + 1f08620: e3e03000 mvn r3, #0 + 1f08624: e5863044 str r3, [r6, #68] ; 0x44 + 1f08628: e3a00001 mov r0, #1 + 1f0862c: eaffff1b b 1f082a0 + 1f08630: e3a03001 mov r3, #1 + 1f08634: e1a01005 mov r1, r5 + 1f08638: e1a02007 mov r2, r7 + 1f0863c: e5d60001 ldrb r0, [r6, #1] + 1f08640: eb007840 bl 1f26748 + 1f08644: e3500000 cmp r0, #0 + 1f08648: 1afffff6 bne 1f08628 + 1f0864c: e5962038 ldr r2, [r6, #56] ; 0x38 + 1f08650: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f08654: e0622007 rsb r2, r2, r7 + 1f08658: e5c60003 strb r0, [r6, #3] + 1f0865c: e1520003 cmp r2, r3 + 1f08660: 2affff96 bcs 1f084c0 + 1f08664: e5d62002 ldrb r2, [r6, #2] + 1f08668: e3520001 cmp r2, #1 + 1f0866c: 9affff93 bls 1f084c0 + 1f08670: e58db008 str fp, [sp, #8] + 1f08674: e1a0b002 mov fp, r2 + 1f08678: ea000000 b 1f08680 + 1f0867c: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f08680: e0877003 add r7, r7, r3 + 1f08684: e24bb001 sub fp, fp, #1 + 1f08688: e1a02007 mov r2, r7 + 1f0868c: e3a03001 mov r3, #1 + 1f08690: e1a01005 mov r1, r5 + 1f08694: e5d60001 ldrb r0, [r6, #1] + 1f08698: eb00782a bl 1f26748 + 1f0869c: e35b0001 cmp fp, #1 + 1f086a0: 1afffff5 bne 1f0867c + 1f086a4: e59db008 ldr fp, [sp, #8] + 1f086a8: eaffff84 b 1f084c0 + 1f086ac: e3a03001 mov r3, #1 + 1f086b0: e1a01005 mov r1, r5 + 1f086b4: e1a02007 mov r2, r7 + 1f086b8: e5d60001 ldrb r0, [r6, #1] + 1f086bc: eb007821 bl 1f26748 + 1f086c0: e3500000 cmp r0, #0 + 1f086c4: 1affffd7 bne 1f08628 + 1f086c8: e5962038 ldr r2, [r6, #56] ; 0x38 + 1f086cc: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f086d0: e0622007 rsb r2, r2, r7 + 1f086d4: e5c60003 strb r0, [r6, #3] + 1f086d8: e1520003 cmp r2, r3 + 1f086dc: 2affff5a bcs 1f0844c + 1f086e0: e5d62002 ldrb r2, [r6, #2] + 1f086e4: e3520001 cmp r2, #1 + 1f086e8: 9affff57 bls 1f0844c + 1f086ec: e58db008 str fp, [sp, #8] + 1f086f0: e1a0b002 mov fp, r2 + 1f086f4: ea000000 b 1f086fc + 1f086f8: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f086fc: e0877003 add r7, r7, r3 + 1f08700: e24bb001 sub fp, fp, #1 + 1f08704: e1a02007 mov r2, r7 + 1f08708: e3a03001 mov r3, #1 + 1f0870c: e1a01005 mov r1, r5 + 1f08710: e5d60001 ldrb r0, [r6, #1] + 1f08714: eb00780b bl 1f26748 + 1f08718: e35b0001 cmp fp, #1 + 1f0871c: 1afffff5 bne 1f086f8 + 1f08720: e59db008 ldr fp, [sp, #8] + 1f08724: eaffff48 b 1f0844c + 1f08728: e1a02003 mov r2, r3 + 1f0872c: e5d60001 ldrb r0, [r6, #1] + 1f08730: e58d2008 str r2, [sp, #8] + 1f08734: e1a01002 mov r1, r2 + 1f08738: e3a03001 mov r3, #1 + 1f0873c: e1a02005 mov r2, r5 + 1f08740: eb007800 bl 1f26748 + 1f08744: e3500000 cmp r0, #0 + 1f08748: 1affffb6 bne 1f08628 + 1f0874c: e5962038 ldr r2, [r6, #56] ; 0x38 + 1f08750: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f08754: e0622005 rsb r2, r2, r5 + 1f08758: e5c60003 strb r0, [r6, #3] + 1f0875c: e1520003 cmp r2, r3 + 1f08760: 2affff74 bcs 1f08538 + 1f08764: e5d67002 ldrb r7, [r6, #2] + 1f08768: e3570001 cmp r7, #1 + 1f0876c: 9affff71 bls 1f08538 + 1f08770: e58db010 str fp, [sp, #16] + 1f08774: e59db008 ldr fp, [sp, #8] + 1f08778: ea000000 b 1f08780 + 1f0877c: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f08780: e0855003 add r5, r5, r3 + 1f08784: e2477001 sub r7, r7, #1 + 1f08788: e1a02005 mov r2, r5 + 1f0878c: e3a03001 mov r3, #1 + 1f08790: e1a0100b mov r1, fp + 1f08794: e5d60001 ldrb r0, [r6, #1] + 1f08798: eb0077ea bl 1f26748 + 1f0879c: e3570001 cmp r7, #1 + 1f087a0: 1afffff5 bne 1f0877c + 1f087a4: e59db010 ldr fp, [sp, #16] + 1f087a8: eaffff62 b 1f08538 + 1f087ac: e1a05008 mov r5, r8 + 1f087b0: e2433002 sub r3, r3, #2 + 1f087b4: e24a2002 sub r2, sl, #2 + 1f087b8: e1520003 cmp r2, r3 + 1f087bc: 359b3040 ldrcc r3, [fp, #64] ; 0x40 + 1f087c0: 31db10ba ldrhcc r1, [fp, #10] + 1f087c4: 30233192 mlacc r3, r2, r1, r3 + 1f087c8: 358d3000 strcc r3, [sp] + 1f087cc: e59d3000 ldr r3, [sp] + 1f087d0: e5853030 str r3, [r5, #48] ; 0x30 + 1f087d4: eafffeca b 1f08304 + 1f087d8: e2522001 subs r2, r2, #1 + 1f087dc: e1d610ba ldrh r1, [r6, #10] + 1f087e0: e2c33000 sbc r3, r3, #0 + 1f087e4: e1a024a2 lsr r2, r2, #9 + 1f087e8: e1822b83 orr r2, r2, r3, lsl #23 + 1f087ec: e732f112 udiv r2, r2, r1 + 1f087f0: e1500002 cmp r0, r2 + 1f087f4: 8afffea8 bhi 1f0829c + 1f087f8: 0a000028 beq 1f088a0 + 1f087fc: e28aa001 add sl, sl, #1 + 1f08800: e37a0001 cmn sl, #1 + 1f08804: 1affff77 bne 1f085e8 + 1f08808: eaffff86 b 1f08628 + 1f0880c: e5983018 ldr r3, [r8, #24] + 1f08810: e1500003 cmp r0, r3 + 1f08814: 2afffee5 bcs 1f083b0 + 1f08818: eafffff7 b 1f087fc + 1f0881c: e3a03001 mov r3, #1 + 1f08820: e1a01007 mov r1, r7 + 1f08824: e1a02005 mov r2, r5 + 1f08828: e5d60001 ldrb r0, [r6, #1] + 1f0882c: eb0077c5 bl 1f26748 + 1f08830: e3500000 cmp r0, #0 + 1f08834: 1affff7b bne 1f08628 + 1f08838: e5962038 ldr r2, [r6, #56] ; 0x38 + 1f0883c: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f08840: e0622005 rsb r2, r2, r5 + 1f08844: e5c60003 strb r0, [r6, #3] + 1f08848: e1520003 cmp r2, r3 + 1f0884c: 2afffee1 bcs 1f083d8 + 1f08850: e5d62002 ldrb r2, [r6, #2] + 1f08854: e3520001 cmp r2, #1 + 1f08858: 9afffede bls 1f083d8 + 1f0885c: e58db008 str fp, [sp, #8] + 1f08860: e1a0b002 mov fp, r2 + 1f08864: ea000000 b 1f0886c + 1f08868: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f0886c: e0855003 add r5, r5, r3 + 1f08870: e24bb001 sub fp, fp, #1 + 1f08874: e1a02005 mov r2, r5 + 1f08878: e3a03001 mov r3, #1 + 1f0887c: e1a01007 mov r1, r7 + 1f08880: e5d60001 ldrb r0, [r6, #1] + 1f08884: eb0077af bl 1f26748 + 1f08888: e35b0001 cmp fp, #1 + 1f0888c: 1afffff5 bne 1f08868 + 1f08890: e59db008 ldr fp, [sp, #8] + 1f08894: eafffecf b 1f083d8 + 1f08898: e2867048 add r7, r6, #72 ; 0x48 + 1f0889c: eafffed6 b 1f083fc + 1f088a0: e3e0a102 mvn sl, #-2147483648 ; 0x80000000 + 1f088a4: eaffff51 b 1f085f0 + 1f088a8: e2863048 add r3, r6, #72 ; 0x48 + 1f088ac: e1a05002 mov r5, r2 + 1f088b0: e1a02003 mov r2, r3 + 1f088b4: e5d60001 ldrb r0, [r6, #1] + 1f088b8: e58d2008 str r2, [sp, #8] + 1f088bc: e1a01002 mov r1, r2 + 1f088c0: e3a03001 mov r3, #1 + 1f088c4: e1a02005 mov r2, r5 + 1f088c8: eb00779e bl 1f26748 + 1f088cc: e3500000 cmp r0, #0 + 1f088d0: 1affff54 bne 1f08628 + 1f088d4: e5962038 ldr r2, [r6, #56] ; 0x38 + 1f088d8: e1a01005 mov r1, r5 + 1f088dc: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f088e0: e0622005 rsb r2, r2, r5 + 1f088e4: e5c60003 strb r0, [r6, #3] + 1f088e8: e1520003 cmp r2, r3 + 1f088ec: 2affff2c bcs 1f085a4 + 1f088f0: e5d65002 ldrb r5, [r6, #2] + 1f088f4: e3550001 cmp r5, #1 + 1f088f8: 9affff29 bls 1f085a4 + 1f088fc: e58db004 str fp, [sp, #4] + 1f08900: e58d9014 str r9, [sp, #20] + 1f08904: e1a09001 mov r9, r1 + 1f08908: e59db008 ldr fp, [sp, #8] + 1f0890c: ea000000 b 1f08914 + 1f08910: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f08914: e0899003 add r9, r9, r3 + 1f08918: e2455001 sub r5, r5, #1 + 1f0891c: e1a02009 mov r2, r9 + 1f08920: e3a03001 mov r3, #1 + 1f08924: e1a0100b mov r1, fp + 1f08928: e5d60001 ldrb r0, [r6, #1] + 1f0892c: eb007785 bl 1f26748 + 1f08930: e3550001 cmp r5, #1 + 1f08934: 1afffff5 bne 1f08910 + 1f08938: e59db004 ldr fp, [sp, #4] + 1f0893c: e59d9014 ldr r9, [sp, #20] + 1f08940: eaffff17 b 1f085a4 + 1f08944: e59b302c ldr r3, [fp, #44] ; 0x2c + 1f08948: eaffff98 b 1f087b0 + +01f0894c : + 1f0894c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f08950: e1a0b001 mov fp, r1 + 1f08954: e3a01000 mov r1, #0 + 1f08958: ed2d8b04 vpush {d8-d9} + 1f0895c: e24dd01c sub sp, sp, #28 + 1f08960: e1a06000 mov r6, r0 + 1f08964: e5904000 ldr r4, [r0] + 1f08968: ebfffe42 bl 1f08278 + 1f0896c: e2508000 subs r8, r0, #0 + 1f08970: 0a000033 beq 1f08a44 + 1f08974: e3580004 cmp r8, #4 + 1f08978: 0a00002c beq 1f08a30 + 1f0897c: e1a00008 mov r0, r8 + 1f08980: e28dd01c add sp, sp, #28 + 1f08984: ecbd8b04 vpop {d8-d9} + 1f08988: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0898c: e5845044 str r5, [r4, #68] ; 0x44 + 1f08990: e5d43000 ldrb r3, [r4] + 1f08994: e3530004 cmp r3, #4 + 1f08998: e5963034 ldr r3, [r6, #52] ; 0x34 + 1f0899c: e5d33000 ldrb r3, [r3] + 1f089a0: 01e03003 mvneq r3, r3 + 1f089a4: 07e033d3 ubfxeq r3, r3, #7, #1 + 1f089a8: 0a000003 beq 1f089bc + 1f089ac: e3530000 cmp r3, #0 + 1f089b0: 135300e5 cmpne r3, #229 ; 0xe5 + 1f089b4: 03a03001 moveq r3, #1 + 1f089b8: 13a03000 movne r3, #0 + 1f089bc: e3530000 cmp r3, #0 + 1f089c0: 0a000035 beq 1f08a9c + 1f089c4: e2877001 add r7, r7, #1 + 1f089c8: e157000b cmp r7, fp + 1f089cc: 0a000061 beq 1f08b58 + 1f089d0: e5965030 ldr r5, [r6, #48] ; 0x30 + 1f089d4: e3550000 cmp r5, #0 + 1f089d8: 0a000014 beq 1f08a30 + 1f089dc: e5969000 ldr r9, [r6] + 1f089e0: e5968028 ldr r8, [r6, #40] ; 0x28 + 1f089e4: e5d93000 ldrb r3, [r9] + 1f089e8: e2888020 add r8, r8, #32 + 1f089ec: e3530004 cmp r3, #4 + 1f089f0: 13a03602 movne r3, #2097152 ; 0x200000 + 1f089f4: 03a03201 moveq r3, #268435456 ; 0x10000000 + 1f089f8: e1580003 cmp r8, r3 + 1f089fc: 2a00000b bcs 1f08a30 + 1f08a00: e7e8a058 ubfx sl, r8, #0, #9 + 1f08a04: e35a0000 cmp sl, #0 + 1f08a08: 1a00004d bne 1f08b44 + 1f08a0c: e596102c ldr r1, [r6, #44] ; 0x2c + 1f08a10: e2855001 add r5, r5, #1 + 1f08a14: e5865030 str r5, [r6, #48] ; 0x30 + 1f08a18: e3510000 cmp r1, #0 + 1f08a1c: 1a000044 bne 1f08b34 + 1f08a20: e1d930b8 ldrh r3, [r9, #8] + 1f08a24: e15302a8 cmp r3, r8, lsr #5 + 1f08a28: 8a000045 bhi 1f08b44 + 1f08a2c: e5861030 str r1, [r6, #48] ; 0x30 + 1f08a30: e3a08007 mov r8, #7 + 1f08a34: e1a00008 mov r0, r8 + 1f08a38: e28dd01c add sp, sp, #28 + 1f08a3c: ecbd8b04 vpop {d8-d9} + 1f08a40: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f08a44: f2808050 vmov.i32 q4, #0 ; 0x00000000 + 1f08a48: e5965030 ldr r5, [r6, #48] ; 0x30 + 1f08a4c: e1a07008 mov r7, r8 + 1f08a50: e58d8004 str r8, [sp, #4] + 1f08a54: e5948044 ldr r8, [r4, #68] ; 0x44 + 1f08a58: e1580005 cmp r8, r5 + 1f08a5c: 0affffcb beq 1f08990 + 1f08a60: e5d43003 ldrb r3, [r4, #3] + 1f08a64: e284a048 add sl, r4, #72 ; 0x48 + 1f08a68: e3530000 cmp r3, #0 + 1f08a6c: 1a00000c bne 1f08aa4 + 1f08a70: e1a0100a mov r1, sl + 1f08a74: e3a03001 mov r3, #1 + 1f08a78: e1a02005 mov r2, r5 + 1f08a7c: e5d40001 ldrb r0, [r4, #1] + 1f08a80: eb007712 bl 1f266d0 + 1f08a84: e3500000 cmp r0, #0 + 1f08a88: 0affffbf beq 1f0898c + 1f08a8c: e3e03000 mvn r3, #0 + 1f08a90: e3a08001 mov r8, #1 + 1f08a94: e5843044 str r3, [r4, #68] ; 0x44 + 1f08a98: eaffffb7 b 1f0897c + 1f08a9c: e1a07003 mov r7, r3 + 1f08aa0: eaffffca b 1f089d0 + 1f08aa4: e3a03001 mov r3, #1 + 1f08aa8: e1a0100a mov r1, sl + 1f08aac: e1a02008 mov r2, r8 + 1f08ab0: e5d40001 ldrb r0, [r4, #1] + 1f08ab4: eb007723 bl 1f26748 + 1f08ab8: e3500000 cmp r0, #0 + 1f08abc: 1a00001a bne 1f08b2c + 1f08ac0: e5942038 ldr r2, [r4, #56] ; 0x38 + 1f08ac4: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f08ac8: e0622008 rsb r2, r2, r8 + 1f08acc: e5c40003 strb r0, [r4, #3] + 1f08ad0: e1520003 cmp r2, r3 + 1f08ad4: 2affffe5 bcs 1f08a70 + 1f08ad8: e5d49002 ldrb r9, [r4, #2] + 1f08adc: e3590001 cmp r9, #1 + 1f08ae0: 8a000001 bhi 1f08aec + 1f08ae4: eaffffe1 b 1f08a70 + 1f08ae8: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f08aec: e0888003 add r8, r8, r3 + 1f08af0: e2499001 sub r9, r9, #1 + 1f08af4: e1a02008 mov r2, r8 + 1f08af8: e3a03001 mov r3, #1 + 1f08afc: e1a0100a mov r1, sl + 1f08b00: e5d40001 ldrb r0, [r4, #1] + 1f08b04: eb00770f bl 1f26748 + 1f08b08: e3590001 cmp r9, #1 + 1f08b0c: 1afffff5 bne 1f08ae8 + 1f08b10: eaffffd6 b 1f08a70 + 1f08b14: e1a00009 mov r0, r9 + 1f08b18: e58d3008 str r3, [sp, #8] + 1f08b1c: ebfff12f bl 1f04fe0 + 1f08b20: e3500000 cmp r0, #0 + 1f08b24: e59d3008 ldr r3, [sp, #8] + 1f08b28: 0a00002b beq 1f08bdc + 1f08b2c: e3a08001 mov r8, #1 + 1f08b30: eaffff91 b 1f0897c + 1f08b34: e1d930ba ldrh r3, [r9, #10] + 1f08b38: e2433001 sub r3, r3, #1 + 1f08b3c: e01334a8 ands r3, r3, r8, lsr #9 + 1f08b40: 0a000006 beq 1f08b60 + 1f08b44: e2892048 add r2, r9, #72 ; 0x48 + 1f08b48: e082a00a add sl, r2, sl + 1f08b4c: e5868028 str r8, [r6, #40] ; 0x28 + 1f08b50: e586a034 str sl, [r6, #52] ; 0x34 + 1f08b54: eaffffbe b 1f08a54 + 1f08b58: e59d8004 ldr r8, [sp, #4] + 1f08b5c: eaffff86 b 1f0897c + 1f08b60: e1a00006 mov r0, r6 + 1f08b64: e58d3008 str r3, [sp, #8] + 1f08b68: ebfff9bb bl 1f0725c + 1f08b6c: e3500001 cmp r0, #1 + 1f08b70: e1a05000 mov r5, r0 + 1f08b74: 9a0000bd bls 1f08e70 + 1f08b78: e3700001 cmn r0, #1 + 1f08b7c: e59d3008 ldr r3, [sp, #8] + 1f08b80: 0affffe9 beq 1f08b2c + 1f08b84: e599002c ldr r0, [r9, #44] ; 0x2c + 1f08b88: e1550000 cmp r5, r0 + 1f08b8c: 32892048 addcc r2, r9, #72 ; 0x48 + 1f08b90: 32451002 subcc r1, r5, #2 + 1f08b94: 3a0000c1 bcc 1f08ea0 + 1f08b98: e596102c ldr r1, [r6, #44] ; 0x2c + 1f08b9c: e1a00006 mov r0, r6 + 1f08ba0: e58d3008 str r3, [sp, #8] + 1f08ba4: ebfffaf3 bl 1f07778 + 1f08ba8: e2505000 subs r5, r0, #0 + 1f08bac: e59d3008 ldr r3, [sp, #8] + 1f08bb0: 0affff9e beq 1f08a30 + 1f08bb4: e3550001 cmp r5, #1 + 1f08bb8: 0a0000ac beq 1f08e70 + 1f08bbc: e3750001 cmn r5, #1 + 1f08bc0: 0affffd9 beq 1f08b2c + 1f08bc4: e5d62007 ldrb r2, [r6, #7] + 1f08bc8: e3822004 orr r2, r2, #4 + 1f08bcc: e5c62007 strb r2, [r6, #7] + 1f08bd0: e5d92003 ldrb r2, [r9, #3] + 1f08bd4: e3520000 cmp r2, #0 + 1f08bd8: 1affffcd bne 1f08b14 + 1f08bdc: e2892048 add r2, r9, #72 ; 0x48 + 1f08be0: e58d2008 str r2, [sp, #8] + 1f08be4: e2020007 and r0, r2, #7 + 1f08be8: e2600000 rsb r0, r0, #0 + 1f08bec: e210000f ands r0, r0, #15 + 1f08bf0: 0a0000b3 beq 1f08ec4 + 1f08bf4: e3500001 cmp r0, #1 + 1f08bf8: e3a02000 mov r2, #0 + 1f08bfc: e2891049 add r1, r9, #73 ; 0x49 + 1f08c00: e5c92048 strb r2, [r9, #72] ; 0x48 + 1f08c04: 0a0000b6 beq 1f08ee4 + 1f08c08: e3500002 cmp r0, #2 + 1f08c0c: e5c92049 strb r2, [r9, #73] ; 0x49 + 1f08c10: e289104a add r1, r9, #74 ; 0x4a + 1f08c14: 0a0000bc beq 1f08f0c + 1f08c18: e3500003 cmp r0, #3 + 1f08c1c: e5c9204a strb r2, [r9, #74] ; 0x4a + 1f08c20: e289104b add r1, r9, #75 ; 0x4b + 1f08c24: 0a0000b6 beq 1f08f04 + 1f08c28: e3500004 cmp r0, #4 + 1f08c2c: e5c9204b strb r2, [r9, #75] ; 0x4b + 1f08c30: e289104c add r1, r9, #76 ; 0x4c + 1f08c34: 0a0000b0 beq 1f08efc + 1f08c38: e3500005 cmp r0, #5 + 1f08c3c: e5c9204c strb r2, [r9, #76] ; 0x4c + 1f08c40: e289104d add r1, r9, #77 ; 0x4d + 1f08c44: 0a0000aa beq 1f08ef4 + 1f08c48: e3500006 cmp r0, #6 + 1f08c4c: e5c9204d strb r2, [r9, #77] ; 0x4d + 1f08c50: e289104e add r1, r9, #78 ; 0x4e + 1f08c54: 0a0000bc beq 1f08f4c + 1f08c58: e3500007 cmp r0, #7 + 1f08c5c: e5c9204e strb r2, [r9, #78] ; 0x4e + 1f08c60: e289104f add r1, r9, #79 ; 0x4f + 1f08c64: 0a0000b6 beq 1f08f44 + 1f08c68: e3500008 cmp r0, #8 + 1f08c6c: e5c9204f strb r2, [r9, #79] ; 0x4f + 1f08c70: e2891050 add r1, r9, #80 ; 0x50 + 1f08c74: 0a0000b0 beq 1f08f3c + 1f08c78: e3500009 cmp r0, #9 + 1f08c7c: e5c92050 strb r2, [r9, #80] ; 0x50 + 1f08c80: e2891051 add r1, r9, #81 ; 0x51 + 1f08c84: 0a0000aa beq 1f08f34 + 1f08c88: e350000a cmp r0, #10 + 1f08c8c: e2891052 add r1, r9, #82 ; 0x52 + 1f08c90: e5c92051 strb r2, [r9, #81] ; 0x51 + 1f08c94: 0a0000a4 beq 1f08f2c + 1f08c98: e350000b cmp r0, #11 + 1f08c9c: e5c92052 strb r2, [r9, #82] ; 0x52 + 1f08ca0: e2891053 add r1, r9, #83 ; 0x53 + 1f08ca4: 0a00009e beq 1f08f24 + 1f08ca8: e350000c cmp r0, #12 + 1f08cac: e5c92053 strb r2, [r9, #83] ; 0x53 + 1f08cb0: e2891054 add r1, r9, #84 ; 0x54 + 1f08cb4: 0a000098 beq 1f08f1c + 1f08cb8: e350000d cmp r0, #13 + 1f08cbc: e5c92054 strb r2, [r9, #84] ; 0x54 + 1f08cc0: e2891055 add r1, r9, #85 ; 0x55 + 1f08cc4: 0a000092 beq 1f08f14 + 1f08cc8: e350000f cmp r0, #15 + 1f08ccc: e5c92055 strb r2, [r9, #85] ; 0x55 + 1f08cd0: e2891056 add r1, r9, #86 ; 0x56 + 1f08cd4: 1a000084 bne 1f08eec + 1f08cd8: e5c92056 strb r2, [r9, #86] ; 0x56 + 1f08cdc: e2891057 add r1, r9, #87 ; 0x57 + 1f08ce0: e30021f1 movw r2, #497 ; 0x1f1 + 1f08ce4: e260cc02 rsb ip, r0, #512 ; 0x200 + 1f08ce8: e58dc010 str ip, [sp, #16] + 1f08cec: e3a0c01f mov ip, #31 + 1f08cf0: e58dc00c str ip, [sp, #12] + 1f08cf4: e59dc008 ldr ip, [sp, #8] + 1f08cf8: e3a0ee1f mov lr, #496 ; 0x1f0 + 1f08cfc: e58d3014 str r3, [sp, #20] + 1f08d00: e08c0000 add r0, ip, r0 + 1f08d04: e59d300c ldr r3, [sp, #12] + 1f08d08: e3a0c000 mov ip, #0 + 1f08d0c: e28cc001 add ip, ip, #1 + 1f08d10: f4008adf vst1.64 {d8-d9}, [r0 :64] + 1f08d14: e15c0003 cmp ip, r3 + 1f08d18: e2800010 add r0, r0, #16 + 1f08d1c: 3afffffa bcc 1f08d0c + 1f08d20: e59d0010 ldr r0, [sp, #16] + 1f08d24: e06e2002 rsb r2, lr, r2 + 1f08d28: e59d3014 ldr r3, [sp, #20] + 1f08d2c: e15e0000 cmp lr, r0 + 1f08d30: e081000e add r0, r1, lr + 1f08d34: 0a00002a beq 1f08de4 + 1f08d38: e3520001 cmp r2, #1 + 1f08d3c: e3a0c000 mov ip, #0 + 1f08d40: e7c1c00e strb ip, [r1, lr] + 1f08d44: 0a000026 beq 1f08de4 + 1f08d48: e3520002 cmp r2, #2 + 1f08d4c: e5c0c001 strb ip, [r0, #1] + 1f08d50: 0a000023 beq 1f08de4 + 1f08d54: e3520003 cmp r2, #3 + 1f08d58: e5c0c002 strb ip, [r0, #2] + 1f08d5c: 0a000020 beq 1f08de4 + 1f08d60: e3520004 cmp r2, #4 + 1f08d64: e5c0c003 strb ip, [r0, #3] + 1f08d68: 0a00001d beq 1f08de4 + 1f08d6c: e3520005 cmp r2, #5 + 1f08d70: e5c0c004 strb ip, [r0, #4] + 1f08d74: 0a00001a beq 1f08de4 + 1f08d78: e3520006 cmp r2, #6 + 1f08d7c: e5c0c005 strb ip, [r0, #5] + 1f08d80: 0a000017 beq 1f08de4 + 1f08d84: e3520007 cmp r2, #7 + 1f08d88: e5c0c006 strb ip, [r0, #6] + 1f08d8c: 0a000014 beq 1f08de4 + 1f08d90: e3520008 cmp r2, #8 + 1f08d94: e5c0c007 strb ip, [r0, #7] + 1f08d98: 0a000011 beq 1f08de4 + 1f08d9c: e3520009 cmp r2, #9 + 1f08da0: e5c0c008 strb ip, [r0, #8] + 1f08da4: 0a00000e beq 1f08de4 + 1f08da8: e352000a cmp r2, #10 + 1f08dac: e5c0c009 strb ip, [r0, #9] + 1f08db0: 0a00000b beq 1f08de4 + 1f08db4: e352000b cmp r2, #11 + 1f08db8: e5c0c00a strb ip, [r0, #10] + 1f08dbc: 0a000008 beq 1f08de4 + 1f08dc0: e352000c cmp r2, #12 + 1f08dc4: e5c0c00b strb ip, [r0, #11] + 1f08dc8: 0a000005 beq 1f08de4 + 1f08dcc: e352000d cmp r2, #13 + 1f08dd0: e5c0c00c strb ip, [r0, #12] + 1f08dd4: 0a000002 beq 1f08de4 + 1f08dd8: e352000e cmp r2, #14 + 1f08ddc: e5c0c00d strb ip, [r0, #13] + 1f08de0: 15c0c00e strbne ip, [r0, #14] + 1f08de4: e599002c ldr r0, [r9, #44] ; 0x2c + 1f08de8: e2451002 sub r1, r5, #2 + 1f08dec: e2402002 sub r2, r0, #2 + 1f08df0: e1510002 cmp r1, r2 + 1f08df4: e1d920ba ldrh r2, [r9, #10] + 1f08df8: 23a0c000 movcs ip, #0 + 1f08dfc: 3599c040 ldrcc ip, [r9, #64] ; 0x40 + 1f08e00: 302cc291 mlacc ip, r1, r2, ip + 1f08e04: e3520000 cmp r2, #0 + 1f08e08: e589c044 str ip, [r9, #68] ; 0x44 + 1f08e0c: 0a000020 beq 1f08e94 + 1f08e10: e3a02000 mov r2, #0 + 1f08e14: e58d600c str r6, [sp, #12] + 1f08e18: e58db010 str fp, [sp, #16] + 1f08e1c: e1a06003 mov r6, r3 + 1f08e20: e1a0b005 mov fp, r5 + 1f08e24: e1a05004 mov r5, r4 + 1f08e28: e1a04002 mov r4, r2 + 1f08e2c: ea000006 b 1f08e4c + 1f08e30: e1d900ba ldrh r0, [r9, #10] + 1f08e34: e599c044 ldr ip, [r9, #68] ; 0x44 + 1f08e38: e1500004 cmp r0, r4 + 1f08e3c: e59d1014 ldr r1, [sp, #20] + 1f08e40: e28cc001 add ip, ip, #1 + 1f08e44: e589c044 str ip, [r9, #68] ; 0x44 + 1f08e48: 9a00000a bls 1f08e78 + 1f08e4c: e3a03001 mov r3, #1 + 1f08e50: e1a00009 mov r0, r9 + 1f08e54: e5c93003 strb r3, [r9, #3] + 1f08e58: e2844001 add r4, r4, #1 + 1f08e5c: e58d1014 str r1, [sp, #20] + 1f08e60: ebfff05e bl 1f04fe0 + 1f08e64: e3500000 cmp r0, #0 + 1f08e68: 0afffff0 beq 1f08e30 + 1f08e6c: eaffff2e b 1f08b2c + 1f08e70: e3a08002 mov r8, #2 + 1f08e74: eafffec0 b 1f0897c + 1f08e78: e1a02004 mov r2, r4 + 1f08e7c: e1a03006 mov r3, r6 + 1f08e80: e1a04005 mov r4, r5 + 1f08e84: e59d600c ldr r6, [sp, #12] + 1f08e88: e1a0500b mov r5, fp + 1f08e8c: e599002c ldr r0, [r9, #44] ; 0x2c + 1f08e90: e59db010 ldr fp, [sp, #16] + 1f08e94: e062200c rsb r2, r2, ip + 1f08e98: e5892044 str r2, [r9, #68] ; 0x44 + 1f08e9c: e59d2008 ldr r2, [sp, #8] + 1f08ea0: e2400002 sub r0, r0, #2 + 1f08ea4: e586502c str r5, [r6, #44] ; 0x2c + 1f08ea8: e1510000 cmp r1, r0 + 1f08eac: 35993040 ldrcc r3, [r9, #64] ; 0x40 + 1f08eb0: 31d900ba ldrhcc r0, [r9, #10] + 1f08eb4: 30233091 mlacc r3, r1, r0, r3 + 1f08eb8: e5863030 str r3, [r6, #48] ; 0x30 + 1f08ebc: e1a05003 mov r5, r3 + 1f08ec0: eaffff20 b 1f08b48 + 1f08ec4: e1a01002 mov r1, r2 + 1f08ec8: e3a0ec02 mov lr, #512 ; 0x200 + 1f08ecc: e3a0c020 mov ip, #32 + 1f08ed0: e58de010 str lr, [sp, #16] + 1f08ed4: e58dc00c str ip, [sp, #12] + 1f08ed8: e1a0200e mov r2, lr + 1f08edc: e1a0c001 mov ip, r1 + 1f08ee0: eaffff85 b 1f08cfc + 1f08ee4: e30021ff movw r2, #511 ; 0x1ff + 1f08ee8: eaffff7d b 1f08ce4 + 1f08eec: e30021f2 movw r2, #498 ; 0x1f2 + 1f08ef0: eaffff7b b 1f08ce4 + 1f08ef4: e30021fb movw r2, #507 ; 0x1fb + 1f08ef8: eaffff79 b 1f08ce4 + 1f08efc: e3a02f7f mov r2, #508 ; 0x1fc + 1f08f00: eaffff77 b 1f08ce4 + 1f08f04: e30021fd movw r2, #509 ; 0x1fd + 1f08f08: eaffff75 b 1f08ce4 + 1f08f0c: e30021fe movw r2, #510 ; 0x1fe + 1f08f10: eaffff73 b 1f08ce4 + 1f08f14: e30021f3 movw r2, #499 ; 0x1f3 + 1f08f18: eaffff71 b 1f08ce4 + 1f08f1c: e3a02f7d mov r2, #500 ; 0x1f4 + 1f08f20: eaffff6f b 1f08ce4 + 1f08f24: e30021f5 movw r2, #501 ; 0x1f5 + 1f08f28: eaffff6d b 1f08ce4 + 1f08f2c: e30021f6 movw r2, #502 ; 0x1f6 + 1f08f30: eaffff6b b 1f08ce4 + 1f08f34: e30021f7 movw r2, #503 ; 0x1f7 + 1f08f38: eaffff69 b 1f08ce4 + 1f08f3c: e3a02f7e mov r2, #504 ; 0x1f8 + 1f08f40: eaffff67 b 1f08ce4 + 1f08f44: e30021f9 movw r2, #505 ; 0x1f9 + 1f08f48: eaffff65 b 1f08ce4 + 1f08f4c: e30021fa movw r2, #506 ; 0x1fa + 1f08f50: eaffff63 b 1f08ce4 + +01f08f54 : + 1f08f54: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f08f58: e1a07000 mov r7, r0 + 1f08f5c: e3a03000 mov r3, #0 + 1f08f60: e24dd00c sub sp, sp, #12 + 1f08f64: e1a00003 mov r0, r3 + 1f08f68: e5972000 ldr r2, [r7] + 1f08f6c: e5924010 ldr r4, [r2, #16] + 1f08f70: e5d42001 ldrb r2, [r4, #1] + 1f08f74: e58d2004 str r2, [sp, #4] + 1f08f78: e282c001 add ip, r2, #1 + 1f08f7c: e1a0c28c lsl ip, ip, #5 + 1f08f80: e3500002 cmp r0, #2 + 1f08f84: 03a00004 moveq r0, #4 + 1f08f88: e2131001 ands r1, r3, #1 + 1f08f8c: 13a01902 movne r1, #32768 ; 0x8000 + 1f08f90: e7d42000 ldrb r2, [r4, r0] + 1f08f94: e2800001 add r0, r0, #1 + 1f08f98: e15c0000 cmp ip, r0 + 1f08f9c: e08230a3 add r3, r2, r3, lsr #1 + 1f08fa0: e0833001 add r3, r3, r1 + 1f08fa4: e6ff3073 uxth r3, r3 + 1f08fa8: 8afffff4 bhi 1f08f80 + 1f08fac: e5c43002 strb r3, [r4, #2] + 1f08fb0: e1a03443 asr r3, r3, #8 + 1f08fb4: e5c43003 strb r3, [r4, #3] + 1f08fb8: e1a00007 mov r0, r7 + 1f08fbc: e5971044 ldr r1, [r7, #68] ; 0x44 + 1f08fc0: ebfffcac bl 1f08278 + 1f08fc4: e3500000 cmp r0, #0 + 1f08fc8: 1a000150 bne 1f09510 + 1f08fcc: e5975000 ldr r5, [r7] + 1f08fd0: e1a0a000 mov sl, r0 + 1f08fd4: e5978030 ldr r8, [r7, #48] ; 0x30 + 1f08fd8: e5956044 ldr r6, [r5, #68] ; 0x44 + 1f08fdc: e1560008 cmp r6, r8 + 1f08fe0: 0a000010 beq 1f09028 + 1f08fe4: e5d53003 ldrb r3, [r5, #3] + 1f08fe8: e285b048 add fp, r5, #72 ; 0x48 + 1f08fec: e3530000 cmp r3, #0 + 1f08ff0: 1a0000e2 bne 1f09380 + 1f08ff4: e1a0100b mov r1, fp + 1f08ff8: e3a03001 mov r3, #1 + 1f08ffc: e1a02008 mov r2, r8 + 1f09000: e5d50001 ldrb r0, [r5, #1] + 1f09004: eb0075b1 bl 1f266d0 + 1f09008: e3500000 cmp r0, #0 + 1f0900c: 0a000004 beq 1f09024 + 1f09010: e3e03000 mvn r3, #0 + 1f09014: e3a00001 mov r0, #1 + 1f09018: e5853044 str r3, [r5, #68] ; 0x44 + 1f0901c: e28dd00c add sp, sp, #12 + 1f09020: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f09024: e5858044 str r8, [r5, #68] ; 0x44 + 1f09028: e5973034 ldr r3, [r7, #52] ; 0x34 + 1f0902c: e2842010 add r2, r4, #16 + 1f09030: e283e010 add lr, r3, #16 + 1f09034: e1530002 cmp r3, r2 + 1f09038: 3154000e cmpcc r4, lr + 1f0903c: 3a0000eb bcc 1f093f0 + 1f09040: e2042007 and r2, r4, #7 + 1f09044: e2622000 rsb r2, r2, #0 + 1f09048: e212200f ands r2, r2, #15 + 1f0904c: 0a0000c0 beq 1f09354 + 1f09050: e3520001 cmp r2, #1 + 1f09054: e5d41000 ldrb r1, [r4] + 1f09058: e5c31000 strb r1, [r3] + 1f0905c: e283c001 add ip, r3, #1 + 1f09060: e2840001 add r0, r4, #1 + 1f09064: 0a000107 beq 1f09488 + 1f09068: e3520002 cmp r2, #2 + 1f0906c: e5d41001 ldrb r1, [r4, #1] + 1f09070: e5c31001 strb r1, [r3, #1] + 1f09074: e283c002 add ip, r3, #2 + 1f09078: e2840002 add r0, r4, #2 + 1f0907c: 0a0000ff beq 1f09480 + 1f09080: e3520003 cmp r2, #3 + 1f09084: e5d41002 ldrb r1, [r4, #2] + 1f09088: e5c31002 strb r1, [r3, #2] + 1f0908c: e283c003 add ip, r3, #3 + 1f09090: e2840003 add r0, r4, #3 + 1f09094: 0a0000f7 beq 1f09478 + 1f09098: e3520004 cmp r2, #4 + 1f0909c: e5d41003 ldrb r1, [r4, #3] + 1f090a0: e5c31003 strb r1, [r3, #3] + 1f090a4: e283c004 add ip, r3, #4 + 1f090a8: e2840004 add r0, r4, #4 + 1f090ac: 0a0000ef beq 1f09470 + 1f090b0: e3520005 cmp r2, #5 + 1f090b4: e5d41004 ldrb r1, [r4, #4] + 1f090b8: e5c31004 strb r1, [r3, #4] + 1f090bc: e283c005 add ip, r3, #5 + 1f090c0: e2840005 add r0, r4, #5 + 1f090c4: 0a0000ff beq 1f094c8 + 1f090c8: e3520006 cmp r2, #6 + 1f090cc: e5d41005 ldrb r1, [r4, #5] + 1f090d0: e5c31005 strb r1, [r3, #5] + 1f090d4: e283c006 add ip, r3, #6 + 1f090d8: e2840006 add r0, r4, #6 + 1f090dc: 0a0000f7 beq 1f094c0 + 1f090e0: e3520007 cmp r2, #7 + 1f090e4: e5d41006 ldrb r1, [r4, #6] + 1f090e8: e5c31006 strb r1, [r3, #6] + 1f090ec: e283c007 add ip, r3, #7 + 1f090f0: e2840007 add r0, r4, #7 + 1f090f4: 0a0000ef beq 1f094b8 + 1f090f8: e3520008 cmp r2, #8 + 1f090fc: e5d41007 ldrb r1, [r4, #7] + 1f09100: e5c31007 strb r1, [r3, #7] + 1f09104: e283c008 add ip, r3, #8 + 1f09108: e2840008 add r0, r4, #8 + 1f0910c: 0a0000e7 beq 1f094b0 + 1f09110: e3520009 cmp r2, #9 + 1f09114: e5d41008 ldrb r1, [r4, #8] + 1f09118: e5c31008 strb r1, [r3, #8] + 1f0911c: e283c009 add ip, r3, #9 + 1f09120: e2840009 add r0, r4, #9 + 1f09124: 0a0000df beq 1f094a8 + 1f09128: e352000a cmp r2, #10 + 1f0912c: e5d41009 ldrb r1, [r4, #9] + 1f09130: e5c31009 strb r1, [r3, #9] + 1f09134: e283c00a add ip, r3, #10 + 1f09138: e284000a add r0, r4, #10 + 1f0913c: 0a0000d7 beq 1f094a0 + 1f09140: e352000b cmp r2, #11 + 1f09144: e5d4100a ldrb r1, [r4, #10] + 1f09148: e5c3100a strb r1, [r3, #10] + 1f0914c: e283c00b add ip, r3, #11 + 1f09150: e284000b add r0, r4, #11 + 1f09154: 0a0000cf beq 1f09498 + 1f09158: e352000c cmp r2, #12 + 1f0915c: e5d4100b ldrb r1, [r4, #11] + 1f09160: e5c3100b strb r1, [r3, #11] + 1f09164: e283c00c add ip, r3, #12 + 1f09168: e284000c add r0, r4, #12 + 1f0916c: 0a0000c7 beq 1f09490 + 1f09170: e352000d cmp r2, #13 + 1f09174: e5d4100c ldrb r1, [r4, #12] + 1f09178: e5c3100c strb r1, [r3, #12] + 1f0917c: e283c00d add ip, r3, #13 + 1f09180: e284000d add r0, r4, #13 + 1f09184: 0a0000b7 beq 1f09468 + 1f09188: e352000f cmp r2, #15 + 1f0918c: e5d4100d ldrb r1, [r4, #13] + 1f09190: e5c3100d strb r1, [r3, #13] + 1f09194: e283c00e add ip, r3, #14 + 1f09198: e284000e add r0, r4, #14 + 1f0919c: 1a0000af bne 1f09460 + 1f091a0: e5d4100e ldrb r1, [r4, #14] + 1f091a4: e283c00f add ip, r3, #15 + 1f091a8: e5c3100e strb r1, [r3, #14] + 1f091ac: e284000f add r0, r4, #15 + 1f091b0: e3a01011 mov r1, #17 + 1f091b4: e084e002 add lr, r4, r2 + 1f091b8: e0833002 add r3, r3, r2 + 1f091bc: e3a05010 mov r5, #16 + 1f091c0: e2622020 rsb r2, r2, #32 + 1f091c4: f46e0adf vld1.64 {d16-d17}, [lr :64] + 1f091c8: f4430a0f vst1.8 {d16-d17}, [r3] + 1f091cc: e1520005 cmp r2, r5 + 1f091d0: e0653001 rsb r3, r5, r1 + 1f091d4: e08c2005 add r2, ip, r5 + 1f091d8: e0801005 add r1, r0, r5 + 1f091dc: 0a000038 beq 1f092c4 + 1f091e0: e3530001 cmp r3, #1 + 1f091e4: e7d00005 ldrb r0, [r0, r5] + 1f091e8: e7cc0005 strb r0, [ip, r5] + 1f091ec: 0a000034 beq 1f092c4 + 1f091f0: e3530002 cmp r3, #2 + 1f091f4: e5d10001 ldrb r0, [r1, #1] + 1f091f8: e5c20001 strb r0, [r2, #1] + 1f091fc: 0a000030 beq 1f092c4 + 1f09200: e3530003 cmp r3, #3 + 1f09204: e5d10002 ldrb r0, [r1, #2] + 1f09208: e5c20002 strb r0, [r2, #2] + 1f0920c: 0a00002c beq 1f092c4 + 1f09210: e3530004 cmp r3, #4 + 1f09214: e5d10003 ldrb r0, [r1, #3] + 1f09218: e5c20003 strb r0, [r2, #3] + 1f0921c: 0a000028 beq 1f092c4 + 1f09220: e3530005 cmp r3, #5 + 1f09224: e5d10004 ldrb r0, [r1, #4] + 1f09228: e5c20004 strb r0, [r2, #4] + 1f0922c: 0a000024 beq 1f092c4 + 1f09230: e3530006 cmp r3, #6 + 1f09234: e5d10005 ldrb r0, [r1, #5] + 1f09238: e5c20005 strb r0, [r2, #5] + 1f0923c: 0a000020 beq 1f092c4 + 1f09240: e3530007 cmp r3, #7 + 1f09244: e5d10006 ldrb r0, [r1, #6] + 1f09248: e5c20006 strb r0, [r2, #6] + 1f0924c: 0a00001c beq 1f092c4 + 1f09250: e3530008 cmp r3, #8 + 1f09254: e5d10007 ldrb r0, [r1, #7] + 1f09258: e5c20007 strb r0, [r2, #7] + 1f0925c: 0a000018 beq 1f092c4 + 1f09260: e3530009 cmp r3, #9 + 1f09264: e5d10008 ldrb r0, [r1, #8] + 1f09268: e5c20008 strb r0, [r2, #8] + 1f0926c: 0a000014 beq 1f092c4 + 1f09270: e353000a cmp r3, #10 + 1f09274: e5d10009 ldrb r0, [r1, #9] + 1f09278: e5c20009 strb r0, [r2, #9] + 1f0927c: 0a000010 beq 1f092c4 + 1f09280: e353000b cmp r3, #11 + 1f09284: e5d1000a ldrb r0, [r1, #10] + 1f09288: e5c2000a strb r0, [r2, #10] + 1f0928c: 0a00000c beq 1f092c4 + 1f09290: e353000c cmp r3, #12 + 1f09294: e5d1000b ldrb r0, [r1, #11] + 1f09298: e5c2000b strb r0, [r2, #11] + 1f0929c: 0a000008 beq 1f092c4 + 1f092a0: e353000d cmp r3, #13 + 1f092a4: e5d1000c ldrb r0, [r1, #12] + 1f092a8: e5c2000c strb r0, [r2, #12] + 1f092ac: 0a000004 beq 1f092c4 + 1f092b0: e353000e cmp r3, #14 + 1f092b4: e5d1300d ldrb r3, [r1, #13] + 1f092b8: e5c2300d strb r3, [r2, #13] + 1f092bc: 15d1300e ldrbne r3, [r1, #14] + 1f092c0: 15c2300e strbne r3, [r2, #14] + 1f092c4: e59d2004 ldr r2, [sp, #4] + 1f092c8: e5973000 ldr r3, [r7] + 1f092cc: e152000a cmp r2, sl + 1f092d0: e3a02001 mov r2, #1 + 1f092d4: e5c32003 strb r2, [r3, #3] + 1f092d8: 0a00007c beq 1f094d0 + 1f092dc: e5978030 ldr r8, [r7, #48] ; 0x30 + 1f092e0: e3580000 cmp r8, #0 + 1f092e4: 1a000002 bne 1f092f4 + 1f092e8: e3a00002 mov r0, #2 + 1f092ec: e28dd00c add sp, sp, #12 + 1f092f0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f092f4: e5979000 ldr r9, [r7] + 1f092f8: e5976028 ldr r6, [r7, #40] ; 0x28 + 1f092fc: e5d93000 ldrb r3, [r9] + 1f09300: e2866020 add r6, r6, #32 + 1f09304: e3530004 cmp r3, #4 + 1f09308: 13a03602 movne r3, #2097152 ; 0x200000 + 1f0930c: 03a03201 moveq r3, #268435456 ; 0x10000000 + 1f09310: e1560003 cmp r6, r3 + 1f09314: 2afffff3 bcs 1f092e8 + 1f09318: e7e8b056 ubfx fp, r6, #0, #9 + 1f0931c: e35b0000 cmp fp, #0 + 1f09320: 1a000046 bne 1f09440 + 1f09324: e597102c ldr r1, [r7, #44] ; 0x2c + 1f09328: e2888001 add r8, r8, #1 + 1f0932c: e5878030 str r8, [r7, #48] ; 0x30 + 1f09330: e3510000 cmp r1, #0 + 1f09334: 1a000035 bne 1f09410 + 1f09338: e1d930b8 ldrh r3, [r9, #8] + 1f0933c: e15302a6 cmp r3, r6, lsr #5 + 1f09340: 8a00003e bhi 1f09440 + 1f09344: e3a03000 mov r3, #0 + 1f09348: e3a00002 mov r0, #2 + 1f0934c: e5873030 str r3, [r7, #48] ; 0x30 + 1f09350: eaffff31 b 1f0901c + 1f09354: f4640adf vld1.64 {d16-d17}, [r4 :64] + 1f09358: e3a01020 mov r1, #32 + 1f0935c: e1a0c003 mov ip, r3 + 1f09360: e1a02001 mov r2, r1 + 1f09364: e1a05001 mov r5, r1 + 1f09368: e1a00004 mov r0, r4 + 1f0936c: f4430a0f vst1.8 {d16-d17}, [r3] + 1f09370: edd40b04 vldr d16, [r4, #16] + 1f09374: edd41b06 vldr d17, [r4, #24] + 1f09378: f44e0a0f vst1.8 {d16-d17}, [lr] + 1f0937c: eaffff92 b 1f091cc + 1f09380: e3a03001 mov r3, #1 + 1f09384: e1a0100b mov r1, fp + 1f09388: e1a02006 mov r2, r6 + 1f0938c: e5d50001 ldrb r0, [r5, #1] + 1f09390: eb0074ec bl 1f26748 + 1f09394: e3500000 cmp r0, #0 + 1f09398: 1a000026 bne 1f09438 + 1f0939c: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f093a0: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f093a4: e0622006 rsb r2, r2, r6 + 1f093a8: e5c50003 strb r0, [r5, #3] + 1f093ac: e1520003 cmp r2, r3 + 1f093b0: 2affff0f bcs 1f08ff4 + 1f093b4: e5d59002 ldrb r9, [r5, #2] + 1f093b8: e3590001 cmp r9, #1 + 1f093bc: 8a000001 bhi 1f093c8 + 1f093c0: eaffff0b b 1f08ff4 + 1f093c4: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f093c8: e0866003 add r6, r6, r3 + 1f093cc: e2499001 sub r9, r9, #1 + 1f093d0: e1a02006 mov r2, r6 + 1f093d4: e3a03001 mov r3, #1 + 1f093d8: e1a0100b mov r1, fp + 1f093dc: e5d50001 ldrb r0, [r5, #1] + 1f093e0: eb0074d8 bl 1f26748 + 1f093e4: e3590001 cmp r9, #1 + 1f093e8: 1afffff5 bne 1f093c4 + 1f093ec: eaffff00 b 1f08ff4 + 1f093f0: e2433001 sub r3, r3, #1 + 1f093f4: e2840020 add r0, r4, #32 + 1f093f8: e1a02004 mov r2, r4 + 1f093fc: e4d21001 ldrb r1, [r2], #1 + 1f09400: e5e31001 strb r1, [r3, #1]! + 1f09404: e1520000 cmp r2, r0 + 1f09408: 1afffffb bne 1f093fc + 1f0940c: eaffffac b 1f092c4 + 1f09410: e1d930ba ldrh r3, [r9, #10] + 1f09414: e2433001 sub r3, r3, #1 + 1f09418: e01354a6 ands r5, r3, r6, lsr #9 + 1f0941c: 1a000007 bne 1f09440 + 1f09420: e1a00007 mov r0, r7 + 1f09424: ebfff78c bl 1f0725c + 1f09428: e3500001 cmp r0, #1 + 1f0942c: 9affffad bls 1f092e8 + 1f09430: e3700001 cmn r0, #1 + 1f09434: 1a000027 bne 1f094d8 + 1f09438: e3a00001 mov r0, #1 + 1f0943c: eafffef6 b 1f0901c + 1f09440: e1a05009 mov r5, r9 + 1f09444: e2899048 add r9, r9, #72 ; 0x48 + 1f09448: e2844020 add r4, r4, #32 + 1f0944c: e089300b add r3, r9, fp + 1f09450: e5876028 str r6, [r7, #40] ; 0x28 + 1f09454: e5873034 str r3, [r7, #52] ; 0x34 + 1f09458: e28aa001 add sl, sl, #1 + 1f0945c: eafffedd b 1f08fd8 + 1f09460: e3a01012 mov r1, #18 + 1f09464: eaffff52 b 1f091b4 + 1f09468: e3a01013 mov r1, #19 + 1f0946c: eaffff50 b 1f091b4 + 1f09470: e3a0101c mov r1, #28 + 1f09474: eaffff4e b 1f091b4 + 1f09478: e3a0101d mov r1, #29 + 1f0947c: eaffff4c b 1f091b4 + 1f09480: e3a0101e mov r1, #30 + 1f09484: eaffff4a b 1f091b4 + 1f09488: e3a0101f mov r1, #31 + 1f0948c: eaffff48 b 1f091b4 + 1f09490: e3a01014 mov r1, #20 + 1f09494: eaffff46 b 1f091b4 + 1f09498: e3a01015 mov r1, #21 + 1f0949c: eaffff44 b 1f091b4 + 1f094a0: e3a01016 mov r1, #22 + 1f094a4: eaffff42 b 1f091b4 + 1f094a8: e3a01017 mov r1, #23 + 1f094ac: eaffff40 b 1f091b4 + 1f094b0: e3a01018 mov r1, #24 + 1f094b4: eaffff3e b 1f091b4 + 1f094b8: e3a01019 mov r1, #25 + 1f094bc: eaffff3c b 1f091b4 + 1f094c0: e3a0101a mov r1, #26 + 1f094c4: eaffff3a b 1f091b4 + 1f094c8: e3a0101b mov r1, #27 + 1f094cc: eaffff38 b 1f091b4 + 1f094d0: e3a00000 mov r0, #0 + 1f094d4: eafffed0 b 1f0901c + 1f094d8: e599302c ldr r3, [r9, #44] ; 0x2c + 1f094dc: e1500003 cmp r0, r3 + 1f094e0: 2affff97 bcs 1f09344 + 1f094e4: e2433002 sub r3, r3, #2 + 1f094e8: e2402002 sub r2, r0, #2 + 1f094ec: e1520003 cmp r2, r3 + 1f094f0: e587002c str r0, [r7, #44] ; 0x2c + 1f094f4: 31d950ba ldrhcc r5, [r9, #10] + 1f094f8: 35993040 ldrcc r3, [r9, #64] ; 0x40 + 1f094fc: 30253592 mlacc r5, r2, r5, r3 + 1f09500: e5875030 str r5, [r7, #48] ; 0x30 + 1f09504: e1a08005 mov r8, r5 + 1f09508: e5975000 ldr r5, [r7] + 1f0950c: eaffffcc b 1f09444 + 1f09510: e3500002 cmp r0, #2 + 1f09514: 31a0a000 movcc sl, r0 + 1f09518: 23a0a002 movcs sl, #2 + 1f0951c: e6ef007a uxtb r0, sl + 1f09520: eafffebd b 1f0901c + +01f09524 : + 1f09524: e5901044 ldr r1, [r0, #68] ; 0x44 + 1f09528: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f0952c: e3710001 cmn r1, #1 + 1f09530: e1a07000 mov r7, r0 + 1f09534: e24dd00c sub sp, sp, #12 + 1f09538: e5904000 ldr r4, [r0] + 1f0953c: e590a028 ldr sl, [r0, #40] ; 0x28 + 1f09540: 0a000004 beq 1f09558 + 1f09544: ebfffb4b bl 1f08278 + 1f09548: e3500000 cmp r0, #0 + 1f0954c: 0a000001 beq 1f09558 + 1f09550: e28dd00c add sp, sp, #12 + 1f09554: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f09558: e5976030 ldr r6, [r7, #48] ; 0x30 + 1f0955c: e3a0b001 mov fp, #1 + 1f09560: e5945044 ldr r5, [r4, #68] ; 0x44 + 1f09564: e1550006 cmp r5, r6 + 1f09568: 0a000010 beq 1f095b0 + 1f0956c: e5d43003 ldrb r3, [r4, #3] + 1f09570: e2849048 add r9, r4, #72 ; 0x48 + 1f09574: e3530000 cmp r3, #0 + 1f09578: 1a000051 bne 1f096c4 + 1f0957c: e1a01009 mov r1, r9 + 1f09580: e3a03001 mov r3, #1 + 1f09584: e1a02006 mov r2, r6 + 1f09588: e5d40001 ldrb r0, [r4, #1] + 1f0958c: eb00744f bl 1f266d0 + 1f09590: e3500000 cmp r0, #0 + 1f09594: 0a000004 beq 1f095ac + 1f09598: e3e03000 mvn r3, #0 + 1f0959c: e3a00001 mov r0, #1 + 1f095a0: e5843044 str r3, [r4, #68] ; 0x44 + 1f095a4: e28dd00c add sp, sp, #12 + 1f095a8: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f095ac: e5846044 str r6, [r4, #68] ; 0x44 + 1f095b0: e5d43000 ldrb r3, [r4] + 1f095b4: e3530004 cmp r3, #4 + 1f095b8: 13e0201a mvnne r2, #26 + 1f095bc: 05972034 ldreq r2, [r7, #52] ; 0x34 + 1f095c0: 15973034 ldrne r3, [r7, #52] ; 0x34 + 1f095c4: 05d23000 ldrbeq r3, [r2] + 1f095c8: 15c32000 strbne r2, [r3] + 1f095cc: 0203307f andeq r3, r3, #127 ; 0x7f + 1f095d0: 05c23000 strbeq r3, [r2] + 1f095d4: e5c4b003 strb fp, [r4, #3] + 1f095d8: e5973028 ldr r3, [r7, #40] ; 0x28 + 1f095dc: e15a0003 cmp sl, r3 + 1f095e0: 9a000055 bls 1f0973c + 1f095e4: e5976030 ldr r6, [r7, #48] ; 0x30 + 1f095e8: e3560000 cmp r6, #0 + 1f095ec: 1a000001 bne 1f095f8 + 1f095f0: e3a00002 mov r0, #2 + 1f095f4: eaffffd5 b 1f09550 + 1f095f8: e5978000 ldr r8, [r7] + 1f095fc: e2835020 add r5, r3, #32 + 1f09600: e5d83000 ldrb r3, [r8] + 1f09604: e3530004 cmp r3, #4 + 1f09608: 13a03602 movne r3, #2097152 ; 0x200000 + 1f0960c: 03a03201 moveq r3, #268435456 ; 0x10000000 + 1f09610: e1550003 cmp r5, r3 + 1f09614: 2afffff5 bcs 1f095f0 + 1f09618: e7e89055 ubfx r9, r5, #0, #9 + 1f0961c: e3590000 cmp r9, #0 + 1f09620: 1a000022 bne 1f096b0 + 1f09624: e597102c ldr r1, [r7, #44] ; 0x2c + 1f09628: e2866001 add r6, r6, #1 + 1f0962c: e5876030 str r6, [r7, #48] ; 0x30 + 1f09630: e3510000 cmp r1, #0 + 1f09634: 1a000005 bne 1f09650 + 1f09638: e1d830b8 ldrh r3, [r8, #8] + 1f0963c: e15302a5 cmp r3, r5, lsr #5 + 1f09640: 8a00001a bhi 1f096b0 + 1f09644: e3a03000 mov r3, #0 + 1f09648: e5873030 str r3, [r7, #48] ; 0x30 + 1f0964c: eaffffe7 b 1f095f0 + 1f09650: e1d830ba ldrh r3, [r8, #10] + 1f09654: e2433001 sub r3, r3, #1 + 1f09658: e01334a5 ands r3, r3, r5, lsr #9 + 1f0965c: 1a000013 bne 1f096b0 + 1f09660: e1a00007 mov r0, r7 + 1f09664: e58d3004 str r3, [sp, #4] + 1f09668: ebfff6fb bl 1f0725c + 1f0966c: e3500001 cmp r0, #1 + 1f09670: 9affffde bls 1f095f0 + 1f09674: e3700001 cmn r0, #1 + 1f09678: 0a00002d beq 1f09734 + 1f0967c: e598202c ldr r2, [r8, #44] ; 0x2c + 1f09680: e1500002 cmp r0, r2 + 1f09684: 2affffee bcs 1f09644 + 1f09688: e2422002 sub r2, r2, #2 + 1f0968c: e2401002 sub r1, r0, #2 + 1f09690: e1510002 cmp r1, r2 + 1f09694: e59d3004 ldr r3, [sp, #4] + 1f09698: e587002c str r0, [r7, #44] ; 0x2c + 1f0969c: 35983040 ldrcc r3, [r8, #64] ; 0x40 + 1f096a0: 31d820ba ldrhcc r2, [r8, #10] + 1f096a4: 30233291 mlacc r3, r1, r2, r3 + 1f096a8: e5873030 str r3, [r7, #48] ; 0x30 + 1f096ac: e1a06003 mov r6, r3 + 1f096b0: e2888048 add r8, r8, #72 ; 0x48 + 1f096b4: e5875028 str r5, [r7, #40] ; 0x28 + 1f096b8: e0888009 add r8, r8, r9 + 1f096bc: e5878034 str r8, [r7, #52] ; 0x34 + 1f096c0: eaffffa6 b 1f09560 + 1f096c4: e3a03001 mov r3, #1 + 1f096c8: e1a01009 mov r1, r9 + 1f096cc: e1a02005 mov r2, r5 + 1f096d0: e5d40001 ldrb r0, [r4, #1] + 1f096d4: eb00741b bl 1f26748 + 1f096d8: e3500000 cmp r0, #0 + 1f096dc: 1a000014 bne 1f09734 + 1f096e0: e5942038 ldr r2, [r4, #56] ; 0x38 + 1f096e4: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f096e8: e0622005 rsb r2, r2, r5 + 1f096ec: e5c40003 strb r0, [r4, #3] + 1f096f0: e1520003 cmp r2, r3 + 1f096f4: 2affffa0 bcs 1f0957c + 1f096f8: e5d48002 ldrb r8, [r4, #2] + 1f096fc: e3580001 cmp r8, #1 + 1f09700: 8a000001 bhi 1f0970c + 1f09704: eaffff9c b 1f0957c + 1f09708: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f0970c: e0855003 add r5, r5, r3 + 1f09710: e2488001 sub r8, r8, #1 + 1f09714: e1a02005 mov r2, r5 + 1f09718: e3a03001 mov r3, #1 + 1f0971c: e1a01009 mov r1, r9 + 1f09720: e5d40001 ldrb r0, [r4, #1] + 1f09724: eb007407 bl 1f26748 + 1f09728: e3580001 cmp r8, #1 + 1f0972c: 1afffff5 bne 1f09708 + 1f09730: eaffff91 b 1f0957c + 1f09734: e3a00001 mov r0, #1 + 1f09738: eaffff84 b 1f09550 + 1f0973c: e3a00000 mov r0, #0 + 1f09740: eaffff82 b 1f09550 + +01f09744 : + 1f09744: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f09748: e5906000 ldr r6, [r0] + 1f0974c: e1a04000 mov r4, r0 + 1f09750: e5908030 ldr r8, [r0, #48] ; 0x30 + 1f09754: e24dd00c sub sp, sp, #12 + 1f09758: e5967044 ldr r7, [r6, #68] ; 0x44 + 1f0975c: e5965010 ldr r5, [r6, #16] + 1f09760: e1580007 cmp r8, r7 + 1f09764: 0a000010 beq 1f097ac + 1f09768: e5d63003 ldrb r3, [r6, #3] + 1f0976c: e286a048 add sl, r6, #72 ; 0x48 + 1f09770: e3530000 cmp r3, #0 + 1f09774: 1a000013 bne 1f097c8 + 1f09778: e1a0100a mov r1, sl + 1f0977c: e3a03001 mov r3, #1 + 1f09780: e1a02008 mov r2, r8 + 1f09784: e5d60001 ldrb r0, [r6, #1] + 1f09788: eb0073d0 bl 1f266d0 + 1f0978c: e3500000 cmp r0, #0 + 1f09790: 0a000004 beq 1f097a8 + 1f09794: e3e03000 mvn r3, #0 + 1f09798: e3a00001 mov r0, #1 + 1f0979c: e5863044 str r3, [r6, #68] ; 0x44 + 1f097a0: e28dd00c add sp, sp, #12 + 1f097a4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f097a8: e5868044 str r8, [r6, #68] ; 0x44 + 1f097ac: e5943034 ldr r3, [r4, #52] ; 0x34 + 1f097b0: e5d32000 ldrb r2, [r3] + 1f097b4: e3520085 cmp r2, #133 ; 0x85 + 1f097b8: 0a000020 beq 1f09840 + 1f097bc: e3a00002 mov r0, #2 + 1f097c0: e28dd00c add sp, sp, #12 + 1f097c4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f097c8: e3a03001 mov r3, #1 + 1f097cc: e1a0100a mov r1, sl + 1f097d0: e1a02007 mov r2, r7 + 1f097d4: e5d60001 ldrb r0, [r6, #1] + 1f097d8: eb0073da bl 1f26748 + 1f097dc: e3500000 cmp r0, #0 + 1f097e0: 1a000014 bne 1f09838 + 1f097e4: e5962038 ldr r2, [r6, #56] ; 0x38 + 1f097e8: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f097ec: e0622007 rsb r2, r2, r7 + 1f097f0: e5c60003 strb r0, [r6, #3] + 1f097f4: e1520003 cmp r2, r3 + 1f097f8: 2affffde bcs 1f09778 + 1f097fc: e5d69002 ldrb r9, [r6, #2] + 1f09800: e3590001 cmp r9, #1 + 1f09804: 8a000001 bhi 1f09810 + 1f09808: eaffffda b 1f09778 + 1f0980c: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f09810: e0877003 add r7, r7, r3 + 1f09814: e2499001 sub r9, r9, #1 + 1f09818: e1a02007 mov r2, r7 + 1f0981c: e3a03001 mov r3, #1 + 1f09820: e1a0100a mov r1, sl + 1f09824: e5d60001 ldrb r0, [r6, #1] + 1f09828: eb0073c6 bl 1f26748 + 1f0982c: e3590001 cmp r9, #1 + 1f09830: 1afffff5 bne 1f0980c + 1f09834: eaffffcf b 1f09778 + 1f09838: e3a00001 mov r0, #1 + 1f0983c: eaffffdf b 1f097c0 + 1f09840: e2856010 add r6, r5, #16 + 1f09844: e2832010 add r2, r3, #16 + 1f09848: e1550002 cmp r5, r2 + 1f0984c: 31530006 cmpcc r3, r6 + 1f09850: 3a000190 bcc 1f09e98 + 1f09854: e2032007 and r2, r3, #7 + 1f09858: e2622000 rsb r2, r2, #0 + 1f0985c: e212200f ands r2, r2, #15 + 1f09860: 0a000181 beq 1f09e6c + 1f09864: e3520001 cmp r2, #1 + 1f09868: e3e0107a mvn r1, #122 ; 0x7a + 1f0986c: e2850001 add r0, r5, #1 + 1f09870: e5c51000 strb r1, [r5] + 1f09874: e283c001 add ip, r3, #1 + 1f09878: 0a000292 beq 1f0a2c8 + 1f0987c: e3520002 cmp r2, #2 + 1f09880: e5d31001 ldrb r1, [r3, #1] + 1f09884: e5c51001 strb r1, [r5, #1] + 1f09888: e2850002 add r0, r5, #2 + 1f0988c: e283c002 add ip, r3, #2 + 1f09890: 0a00028a beq 1f0a2c0 + 1f09894: e3520003 cmp r2, #3 + 1f09898: e5d31002 ldrb r1, [r3, #2] + 1f0989c: e5c51002 strb r1, [r5, #2] + 1f098a0: e2850003 add r0, r5, #3 + 1f098a4: e283c003 add ip, r3, #3 + 1f098a8: 0a000272 beq 1f0a278 + 1f098ac: e3520004 cmp r2, #4 + 1f098b0: e5d31003 ldrb r1, [r3, #3] + 1f098b4: e5c51003 strb r1, [r5, #3] + 1f098b8: e2850004 add r0, r5, #4 + 1f098bc: e283c004 add ip, r3, #4 + 1f098c0: 0a00026a beq 1f0a270 + 1f098c4: e3520005 cmp r2, #5 + 1f098c8: e5d31004 ldrb r1, [r3, #4] + 1f098cc: e5c51004 strb r1, [r5, #4] + 1f098d0: e2850005 add r0, r5, #5 + 1f098d4: e283c005 add ip, r3, #5 + 1f098d8: 0a000262 beq 1f0a268 + 1f098dc: e3520006 cmp r2, #6 + 1f098e0: e5d31005 ldrb r1, [r3, #5] + 1f098e4: e5c51005 strb r1, [r5, #5] + 1f098e8: e2850006 add r0, r5, #6 + 1f098ec: e283c006 add ip, r3, #6 + 1f098f0: 0a00025a beq 1f0a260 + 1f098f4: e3520007 cmp r2, #7 + 1f098f8: e5d31006 ldrb r1, [r3, #6] + 1f098fc: e5c51006 strb r1, [r5, #6] + 1f09900: e2850007 add r0, r5, #7 + 1f09904: e283c007 add ip, r3, #7 + 1f09908: 0a00026a beq 1f0a2b8 + 1f0990c: e3520008 cmp r2, #8 + 1f09910: e5d31007 ldrb r1, [r3, #7] + 1f09914: e5c51007 strb r1, [r5, #7] + 1f09918: e2850008 add r0, r5, #8 + 1f0991c: e283c008 add ip, r3, #8 + 1f09920: 0a000262 beq 1f0a2b0 + 1f09924: e3520009 cmp r2, #9 + 1f09928: e5d31008 ldrb r1, [r3, #8] + 1f0992c: e5c51008 strb r1, [r5, #8] + 1f09930: e2850009 add r0, r5, #9 + 1f09934: e283c009 add ip, r3, #9 + 1f09938: 0a00025a beq 1f0a2a8 + 1f0993c: e352000a cmp r2, #10 + 1f09940: e5d31009 ldrb r1, [r3, #9] + 1f09944: e5c51009 strb r1, [r5, #9] + 1f09948: e285000a add r0, r5, #10 + 1f0994c: e283c00a add ip, r3, #10 + 1f09950: 0a000252 beq 1f0a2a0 + 1f09954: e352000b cmp r2, #11 + 1f09958: e5d3100a ldrb r1, [r3, #10] + 1f0995c: e5c5100a strb r1, [r5, #10] + 1f09960: e285000b add r0, r5, #11 + 1f09964: e283c00b add ip, r3, #11 + 1f09968: 0a00024a beq 1f0a298 + 1f0996c: e352000c cmp r2, #12 + 1f09970: e5d3100b ldrb r1, [r3, #11] + 1f09974: e5c5100b strb r1, [r5, #11] + 1f09978: e285000c add r0, r5, #12 + 1f0997c: e283c00c add ip, r3, #12 + 1f09980: 0a000242 beq 1f0a290 + 1f09984: e352000d cmp r2, #13 + 1f09988: e5d3100c ldrb r1, [r3, #12] + 1f0998c: e5c5100c strb r1, [r5, #12] + 1f09990: e285000d add r0, r5, #13 + 1f09994: e283c00d add ip, r3, #13 + 1f09998: 0a00023a beq 1f0a288 + 1f0999c: e352000f cmp r2, #15 + 1f099a0: e5d3100d ldrb r1, [r3, #13] + 1f099a4: e5c5100d strb r1, [r5, #13] + 1f099a8: e285000e add r0, r5, #14 + 1f099ac: e283c00e add ip, r3, #14 + 1f099b0: 1a000232 bne 1f0a280 + 1f099b4: e5d3100e ldrb r1, [r3, #14] + 1f099b8: e285000f add r0, r5, #15 + 1f099bc: e5c5100e strb r1, [r5, #14] + 1f099c0: e283c00f add ip, r3, #15 + 1f099c4: e3a01011 mov r1, #17 + 1f099c8: e0833002 add r3, r3, r2 + 1f099cc: e0856002 add r6, r5, r2 + 1f099d0: e3a0e010 mov lr, #16 + 1f099d4: e2622020 rsb r2, r2, #32 + 1f099d8: f4630adf vld1.64 {d16-d17}, [r3 :64] + 1f099dc: f4460a0f vst1.8 {d16-d17}, [r6] + 1f099e0: e15e0002 cmp lr, r2 + 1f099e4: e06e3001 rsb r3, lr, r1 + 1f099e8: e080200e add r2, r0, lr + 1f099ec: e08c100e add r1, ip, lr + 1f099f0: 0a000038 beq 1f09ad8 + 1f099f4: e3530001 cmp r3, #1 + 1f099f8: e7dcc00e ldrb ip, [ip, lr] + 1f099fc: e7c0c00e strb ip, [r0, lr] + 1f09a00: 0a000034 beq 1f09ad8 + 1f09a04: e3530002 cmp r3, #2 + 1f09a08: e5d10001 ldrb r0, [r1, #1] + 1f09a0c: e5c20001 strb r0, [r2, #1] + 1f09a10: 0a000030 beq 1f09ad8 + 1f09a14: e3530003 cmp r3, #3 + 1f09a18: e5d10002 ldrb r0, [r1, #2] + 1f09a1c: e5c20002 strb r0, [r2, #2] + 1f09a20: 0a00002c beq 1f09ad8 + 1f09a24: e3530004 cmp r3, #4 + 1f09a28: e5d10003 ldrb r0, [r1, #3] + 1f09a2c: e5c20003 strb r0, [r2, #3] + 1f09a30: 0a000028 beq 1f09ad8 + 1f09a34: e3530005 cmp r3, #5 + 1f09a38: e5d10004 ldrb r0, [r1, #4] + 1f09a3c: e5c20004 strb r0, [r2, #4] + 1f09a40: 0a000024 beq 1f09ad8 + 1f09a44: e3530006 cmp r3, #6 + 1f09a48: e5d10005 ldrb r0, [r1, #5] + 1f09a4c: e5c20005 strb r0, [r2, #5] + 1f09a50: 0a000020 beq 1f09ad8 + 1f09a54: e3530007 cmp r3, #7 + 1f09a58: e5d10006 ldrb r0, [r1, #6] + 1f09a5c: e5c20006 strb r0, [r2, #6] + 1f09a60: 0a00001c beq 1f09ad8 + 1f09a64: e3530008 cmp r3, #8 + 1f09a68: e5d10007 ldrb r0, [r1, #7] + 1f09a6c: e5c20007 strb r0, [r2, #7] + 1f09a70: 0a000018 beq 1f09ad8 + 1f09a74: e3530009 cmp r3, #9 + 1f09a78: e5d10008 ldrb r0, [r1, #8] + 1f09a7c: e5c20008 strb r0, [r2, #8] + 1f09a80: 0a000014 beq 1f09ad8 + 1f09a84: e353000a cmp r3, #10 + 1f09a88: e5d10009 ldrb r0, [r1, #9] + 1f09a8c: e5c20009 strb r0, [r2, #9] + 1f09a90: 0a000010 beq 1f09ad8 + 1f09a94: e353000b cmp r3, #11 + 1f09a98: e5d1000a ldrb r0, [r1, #10] + 1f09a9c: e5c2000a strb r0, [r2, #10] + 1f09aa0: 0a00000c beq 1f09ad8 + 1f09aa4: e353000c cmp r3, #12 + 1f09aa8: e5d1000b ldrb r0, [r1, #11] + 1f09aac: e5c2000b strb r0, [r2, #11] + 1f09ab0: 0a000008 beq 1f09ad8 + 1f09ab4: e353000d cmp r3, #13 + 1f09ab8: e5d1000c ldrb r0, [r1, #12] + 1f09abc: e5c2000c strb r0, [r2, #12] + 1f09ac0: 0a000004 beq 1f09ad8 + 1f09ac4: e353000e cmp r3, #14 + 1f09ac8: e5d1300d ldrb r3, [r1, #13] + 1f09acc: e5c2300d strb r3, [r2, #13] + 1f09ad0: 15d1300e ldrbne r3, [r1, #14] + 1f09ad4: 15c2300e strbne r3, [r2, #14] + 1f09ad8: e1a00004 mov r0, r4 + 1f09adc: e5d59001 ldrb r9, [r5, #1] + 1f09ae0: ebfff9a5 bl 1f0817c + 1f09ae4: e3500000 cmp r0, #0 + 1f09ae8: 1affff34 bne 1f097c0 + 1f09aec: e5946000 ldr r6, [r4] + 1f09af0: e5948030 ldr r8, [r4, #48] ; 0x30 + 1f09af4: e5967044 ldr r7, [r6, #68] ; 0x44 + 1f09af8: e1580007 cmp r8, r7 + 1f09afc: 0a00000b beq 1f09b30 + 1f09b00: e5d63003 ldrb r3, [r6, #3] + 1f09b04: e286b048 add fp, r6, #72 ; 0x48 + 1f09b08: e3530000 cmp r3, #0 + 1f09b0c: 1a0000e8 bne 1f09eb4 + 1f09b10: e1a0100b mov r1, fp + 1f09b14: e3a03001 mov r3, #1 + 1f09b18: e1a02008 mov r2, r8 + 1f09b1c: e5d60001 ldrb r0, [r6, #1] + 1f09b20: eb0072ea bl 1f266d0 + 1f09b24: e3500000 cmp r0, #0 + 1f09b28: 1affff19 bne 1f09794 + 1f09b2c: e5868044 str r8, [r6, #68] ; 0x44 + 1f09b30: e5943034 ldr r3, [r4, #52] ; 0x34 + 1f09b34: e5d32000 ldrb r2, [r3] + 1f09b38: e35200c0 cmp r2, #192 ; 0xc0 + 1f09b3c: 1affff1e bne 1f097bc + 1f09b40: e285c020 add ip, r5, #32 + 1f09b44: e285e030 add lr, r5, #48 ; 0x30 + 1f09b48: e2832010 add r2, r3, #16 + 1f09b4c: e15c0002 cmp ip, r2 + 1f09b50: 3153000e cmpcc r3, lr + 1f09b54: 3a000217 bcc 1f0a3b8 + 1f09b58: e2031007 and r1, r3, #7 + 1f09b5c: e2611000 rsb r1, r1, #0 + 1f09b60: e211100f ands r1, r1, #15 + 1f09b64: 0a00020a beq 1f0a394 + 1f09b68: e3510001 cmp r1, #1 + 1f09b6c: e3e0203f mvn r2, #63 ; 0x3f + 1f09b70: e285c021 add ip, r5, #33 ; 0x21 + 1f09b74: e5c52020 strb r2, [r5, #32] + 1f09b78: e2830001 add r0, r3, #1 + 1f09b7c: 0a000231 beq 1f0a448 + 1f09b80: e3510002 cmp r1, #2 + 1f09b84: e5d32001 ldrb r2, [r3, #1] + 1f09b88: e5c52021 strb r2, [r5, #33] ; 0x21 + 1f09b8c: e285c022 add ip, r5, #34 ; 0x22 + 1f09b90: e2830002 add r0, r3, #2 + 1f09b94: 0a000235 beq 1f0a470 + 1f09b98: e3510003 cmp r1, #3 + 1f09b9c: e5d32002 ldrb r2, [r3, #2] + 1f09ba0: e5c52022 strb r2, [r5, #34] ; 0x22 + 1f09ba4: e285c023 add ip, r5, #35 ; 0x23 + 1f09ba8: e2830003 add r0, r3, #3 + 1f09bac: 0a00022d beq 1f0a468 + 1f09bb0: e3510004 cmp r1, #4 + 1f09bb4: e5d32003 ldrb r2, [r3, #3] + 1f09bb8: e5c52023 strb r2, [r5, #35] ; 0x23 + 1f09bbc: e285c024 add ip, r5, #36 ; 0x24 + 1f09bc0: e2830004 add r0, r3, #4 + 1f09bc4: 0a000225 beq 1f0a460 + 1f09bc8: e3510005 cmp r1, #5 + 1f09bcc: e5d32004 ldrb r2, [r3, #4] + 1f09bd0: e5c52024 strb r2, [r5, #36] ; 0x24 + 1f09bd4: e285c025 add ip, r5, #37 ; 0x25 + 1f09bd8: e2830005 add r0, r3, #5 + 1f09bdc: 0a00021d beq 1f0a458 + 1f09be0: e3510006 cmp r1, #6 + 1f09be4: e5d32005 ldrb r2, [r3, #5] + 1f09be8: e5c52025 strb r2, [r5, #37] ; 0x25 + 1f09bec: e285c026 add ip, r5, #38 ; 0x26 + 1f09bf0: e2830006 add r0, r3, #6 + 1f09bf4: 0a00022d beq 1f0a4b0 + 1f09bf8: e3510007 cmp r1, #7 + 1f09bfc: e5d32006 ldrb r2, [r3, #6] + 1f09c00: e5c52026 strb r2, [r5, #38] ; 0x26 + 1f09c04: e285c027 add ip, r5, #39 ; 0x27 + 1f09c08: e2830007 add r0, r3, #7 + 1f09c0c: 0a000225 beq 1f0a4a8 + 1f09c10: e3510008 cmp r1, #8 + 1f09c14: e5d32007 ldrb r2, [r3, #7] + 1f09c18: e5c52027 strb r2, [r5, #39] ; 0x27 + 1f09c1c: e285c028 add ip, r5, #40 ; 0x28 + 1f09c20: e2830008 add r0, r3, #8 + 1f09c24: 0a00021d beq 1f0a4a0 + 1f09c28: e3510009 cmp r1, #9 + 1f09c2c: e5d32008 ldrb r2, [r3, #8] + 1f09c30: e5c52028 strb r2, [r5, #40] ; 0x28 + 1f09c34: e285c029 add ip, r5, #41 ; 0x29 + 1f09c38: e2830009 add r0, r3, #9 + 1f09c3c: 0a000215 beq 1f0a498 + 1f09c40: e351000a cmp r1, #10 + 1f09c44: e5d32009 ldrb r2, [r3, #9] + 1f09c48: e5c52029 strb r2, [r5, #41] ; 0x29 + 1f09c4c: e285c02a add ip, r5, #42 ; 0x2a + 1f09c50: e283000a add r0, r3, #10 + 1f09c54: 0a00020d beq 1f0a490 + 1f09c58: e351000b cmp r1, #11 + 1f09c5c: e5d3200a ldrb r2, [r3, #10] + 1f09c60: e5c5202a strb r2, [r5, #42] ; 0x2a + 1f09c64: e285c02b add ip, r5, #43 ; 0x2b + 1f09c68: e283000b add r0, r3, #11 + 1f09c6c: 0a000205 beq 1f0a488 + 1f09c70: e351000c cmp r1, #12 + 1f09c74: e5d3200b ldrb r2, [r3, #11] + 1f09c78: e5c5202b strb r2, [r5, #43] ; 0x2b + 1f09c7c: e285c02c add ip, r5, #44 ; 0x2c + 1f09c80: e283000c add r0, r3, #12 + 1f09c84: 0a0001fd beq 1f0a480 + 1f09c88: e351000d cmp r1, #13 + 1f09c8c: e5d3200c ldrb r2, [r3, #12] + 1f09c90: e5c5202c strb r2, [r5, #44] ; 0x2c + 1f09c94: e285c02d add ip, r5, #45 ; 0x2d + 1f09c98: e283000d add r0, r3, #13 + 1f09c9c: 0a0001f5 beq 1f0a478 + 1f09ca0: e351000f cmp r1, #15 + 1f09ca4: e5d3200d ldrb r2, [r3, #13] + 1f09ca8: e5c5202d strb r2, [r5, #45] ; 0x2d + 1f09cac: e285c02e add ip, r5, #46 ; 0x2e + 1f09cb0: e283000e add r0, r3, #14 + 1f09cb4: 1a0001e5 bne 1f0a450 + 1f09cb8: e5d3200e ldrb r2, [r3, #14] + 1f09cbc: e285c02f add ip, r5, #47 ; 0x2f + 1f09cc0: e5c5202e strb r2, [r5, #46] ; 0x2e + 1f09cc4: e283000f add r0, r3, #15 + 1f09cc8: e3a02011 mov r2, #17 + 1f09ccc: e0836001 add r6, r3, r1 + 1f09cd0: e085e001 add lr, r5, r1 + 1f09cd4: e28ee020 add lr, lr, #32 + 1f09cd8: e1a03000 mov r3, r0 + 1f09cdc: f4660adf vld1.64 {d16-d17}, [r6 :64] + 1f09ce0: e2611020 rsb r1, r1, #32 + 1f09ce4: e3a00010 mov r0, #16 + 1f09ce8: f44e0a0f vst1.8 {d16-d17}, [lr] + 1f09cec: e1510000 cmp r1, r0 + 1f09cf0: e0602002 rsb r2, r0, r2 + 1f09cf4: e08c1000 add r1, ip, r0 + 1f09cf8: e083e000 add lr, r3, r0 + 1f09cfc: 0a000038 beq 1f09de4 + 1f09d00: e3520001 cmp r2, #1 + 1f09d04: e7d33000 ldrb r3, [r3, r0] + 1f09d08: e7cc3000 strb r3, [ip, r0] + 1f09d0c: 0a000034 beq 1f09de4 + 1f09d10: e3520002 cmp r2, #2 + 1f09d14: e5de3001 ldrb r3, [lr, #1] + 1f09d18: e5c13001 strb r3, [r1, #1] + 1f09d1c: 0a000030 beq 1f09de4 + 1f09d20: e3520003 cmp r2, #3 + 1f09d24: e5de3002 ldrb r3, [lr, #2] + 1f09d28: e5c13002 strb r3, [r1, #2] + 1f09d2c: 0a00002c beq 1f09de4 + 1f09d30: e3520004 cmp r2, #4 + 1f09d34: e5de3003 ldrb r3, [lr, #3] + 1f09d38: e5c13003 strb r3, [r1, #3] + 1f09d3c: 0a000028 beq 1f09de4 + 1f09d40: e3520005 cmp r2, #5 + 1f09d44: e5de3004 ldrb r3, [lr, #4] + 1f09d48: e5c13004 strb r3, [r1, #4] + 1f09d4c: 0a000024 beq 1f09de4 + 1f09d50: e3520006 cmp r2, #6 + 1f09d54: e5de3005 ldrb r3, [lr, #5] + 1f09d58: e5c13005 strb r3, [r1, #5] + 1f09d5c: 0a000020 beq 1f09de4 + 1f09d60: e3520007 cmp r2, #7 + 1f09d64: e5de3006 ldrb r3, [lr, #6] + 1f09d68: e5c13006 strb r3, [r1, #6] + 1f09d6c: 0a00001c beq 1f09de4 + 1f09d70: e3520008 cmp r2, #8 + 1f09d74: e5de3007 ldrb r3, [lr, #7] + 1f09d78: e5c13007 strb r3, [r1, #7] + 1f09d7c: 0a000018 beq 1f09de4 + 1f09d80: e3520009 cmp r2, #9 + 1f09d84: e5de3008 ldrb r3, [lr, #8] + 1f09d88: e5c13008 strb r3, [r1, #8] + 1f09d8c: 0a000014 beq 1f09de4 + 1f09d90: e352000a cmp r2, #10 + 1f09d94: e5de3009 ldrb r3, [lr, #9] + 1f09d98: e5c13009 strb r3, [r1, #9] + 1f09d9c: 0a000010 beq 1f09de4 + 1f09da0: e352000b cmp r2, #11 + 1f09da4: e5de300a ldrb r3, [lr, #10] + 1f09da8: e5c1300a strb r3, [r1, #10] + 1f09dac: 0a00000c beq 1f09de4 + 1f09db0: e352000c cmp r2, #12 + 1f09db4: e5de300b ldrb r3, [lr, #11] + 1f09db8: e5c1300b strb r3, [r1, #11] + 1f09dbc: 0a000008 beq 1f09de4 + 1f09dc0: e352000d cmp r2, #13 + 1f09dc4: e5de300c ldrb r3, [lr, #12] + 1f09dc8: e5c1300c strb r3, [r1, #12] + 1f09dcc: 0a000004 beq 1f09de4 + 1f09dd0: e5de300d ldrb r3, [lr, #13] + 1f09dd4: e352000e cmp r2, #14 + 1f09dd8: e5c1300d strb r3, [r1, #13] + 1f09ddc: 15de300e ldrbne r3, [lr, #14] + 1f09de0: 15c1300e strbne r3, [r1, #14] + 1f09de4: e2493002 sub r3, r9, #2 + 1f09de8: e2899001 add r9, r9, #1 + 1f09dec: e3530010 cmp r3, #16 + 1f09df0: 83a00004 movhi r0, #4 + 1f09df4: 8afffe71 bhi 1f097c0 + 1f09df8: e1a03289 lsl r3, r9, #5 + 1f09dfc: e2856040 add r6, r5, #64 ; 0x40 + 1f09e00: e58d3004 str r3, [sp, #4] + 1f09e04: e3a0a040 mov sl, #64 ; 0x40 + 1f09e08: e58d5000 str r5, [sp] + 1f09e0c: e1a00004 mov r0, r4 + 1f09e10: ebfff8d9 bl 1f0817c + 1f09e14: e3500000 cmp r0, #0 + 1f09e18: 1afffe68 bne 1f097c0 + 1f09e1c: e5947000 ldr r7, [r4] + 1f09e20: e5949030 ldr r9, [r4, #48] ; 0x30 + 1f09e24: e5975044 ldr r5, [r7, #68] ; 0x44 + 1f09e28: e1590005 cmp r9, r5 + 1f09e2c: 0a00003d beq 1f09f28 + 1f09e30: e5d73003 ldrb r3, [r7, #3] + 1f09e34: e287b048 add fp, r7, #72 ; 0x48 + 1f09e38: e3530000 cmp r3, #0 + 1f09e3c: 1a000131 bne 1f0a308 + 1f09e40: e1a0100b mov r1, fp + 1f09e44: e3a03001 mov r3, #1 + 1f09e48: e1a02009 mov r2, r9 + 1f09e4c: e5d70001 ldrb r0, [r7, #1] + 1f09e50: eb00721e bl 1f266d0 + 1f09e54: e3500000 cmp r0, #0 + 1f09e58: 0a000031 beq 1f09f24 + 1f09e5c: e3e03000 mvn r3, #0 + 1f09e60: e3a00001 mov r0, #1 + 1f09e64: e5873044 str r3, [r7, #68] ; 0x44 + 1f09e68: eafffe54 b 1f097c0 + 1f09e6c: f4630adf vld1.64 {d16-d17}, [r3 :64] + 1f09e70: e3a0e020 mov lr, #32 + 1f09e74: e1a0c003 mov ip, r3 + 1f09e78: e1a0200e mov r2, lr + 1f09e7c: e1a0100e mov r1, lr + 1f09e80: e1a00005 mov r0, r5 + 1f09e84: f4450a0f vst1.8 {d16-d17}, [r5] + 1f09e88: edd30b04 vldr d16, [r3, #16] + 1f09e8c: edd31b06 vldr d17, [r3, #24] + 1f09e90: f4460a0f vst1.8 {d16-d17}, [r6] + 1f09e94: eafffed1 b 1f099e0 + 1f09e98: e2452001 sub r2, r5, #1 + 1f09e9c: e2830020 add r0, r3, #32 + 1f09ea0: e4d31001 ldrb r1, [r3], #1 + 1f09ea4: e5e21001 strb r1, [r2, #1]! + 1f09ea8: e1500003 cmp r0, r3 + 1f09eac: 1afffffb bne 1f09ea0 + 1f09eb0: eaffff08 b 1f09ad8 + 1f09eb4: e3a03001 mov r3, #1 + 1f09eb8: e1a0100b mov r1, fp + 1f09ebc: e1a02007 mov r2, r7 + 1f09ec0: e5d60001 ldrb r0, [r6, #1] + 1f09ec4: eb00721f bl 1f26748 + 1f09ec8: e3500000 cmp r0, #0 + 1f09ecc: 1afffe59 bne 1f09838 + 1f09ed0: e5962038 ldr r2, [r6, #56] ; 0x38 + 1f09ed4: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f09ed8: e0622007 rsb r2, r2, r7 + 1f09edc: e5c60003 strb r0, [r6, #3] + 1f09ee0: e1520003 cmp r2, r3 + 1f09ee4: 2affff09 bcs 1f09b10 + 1f09ee8: e5d6a002 ldrb sl, [r6, #2] + 1f09eec: e35a0001 cmp sl, #1 + 1f09ef0: 8a000001 bhi 1f09efc + 1f09ef4: eaffff05 b 1f09b10 + 1f09ef8: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f09efc: e0877003 add r7, r7, r3 + 1f09f00: e24aa001 sub sl, sl, #1 + 1f09f04: e1a02007 mov r2, r7 + 1f09f08: e3a03001 mov r3, #1 + 1f09f0c: e1a0100b mov r1, fp + 1f09f10: e5d60001 ldrb r0, [r6, #1] + 1f09f14: eb00720b bl 1f26748 + 1f09f18: e35a0001 cmp sl, #1 + 1f09f1c: 1afffff5 bne 1f09ef8 + 1f09f20: eafffefa b 1f09b10 + 1f09f24: e5879044 str r9, [r7, #68] ; 0x44 + 1f09f28: e5943034 ldr r3, [r4, #52] ; 0x34 + 1f09f2c: e5d32000 ldrb r2, [r3] + 1f09f30: e35200c1 cmp r2, #193 ; 0xc1 + 1f09f34: 1afffe20 bne 1f097bc + 1f09f38: e2831010 add r1, r3, #16 + 1f09f3c: e2862010 add r2, r6, #16 + 1f09f40: e1510006 cmp r1, r6 + 1f09f44: 83a01000 movhi r1, #0 + 1f09f48: 93a01001 movls r1, #1 + 1f09f4c: e1530002 cmp r3, r2 + 1f09f50: 31a02001 movcc r2, r1 + 1f09f54: 23812001 orrcs r2, r1, #1 + 1f09f58: e3520000 cmp r2, #0 + 1f09f5c: 0a000105 beq 1f0a378 + 1f09f60: e2030007 and r0, r3, #7 + 1f09f64: e2600000 rsb r0, r0, #0 + 1f09f68: e210000f ands r0, r0, #15 + 1f09f6c: 0a0000d7 beq 1f0a2d0 + 1f09f70: e3500001 cmp r0, #1 + 1f09f74: e3e0103e mvn r1, #62 ; 0x3e + 1f09f78: e2862001 add r2, r6, #1 + 1f09f7c: e5c61000 strb r1, [r6] + 1f09f80: e283c001 add ip, r3, #1 + 1f09f84: 0a000115 beq 1f0a3e0 + 1f09f88: e3500002 cmp r0, #2 + 1f09f8c: e5d32001 ldrb r2, [r3, #1] + 1f09f90: e5c62001 strb r2, [r6, #1] + 1f09f94: e283c002 add ip, r3, #2 + 1f09f98: e2862002 add r2, r6, #2 + 1f09f9c: 0a00010d beq 1f0a3d8 + 1f09fa0: e3500003 cmp r0, #3 + 1f09fa4: e5d32002 ldrb r2, [r3, #2] + 1f09fa8: e5c62002 strb r2, [r6, #2] + 1f09fac: e283c003 add ip, r3, #3 + 1f09fb0: e2862003 add r2, r6, #3 + 1f09fb4: 0a000111 beq 1f0a400 + 1f09fb8: e3500004 cmp r0, #4 + 1f09fbc: e5d32003 ldrb r2, [r3, #3] + 1f09fc0: e5c62003 strb r2, [r6, #3] + 1f09fc4: e283c004 add ip, r3, #4 + 1f09fc8: e2862004 add r2, r6, #4 + 1f09fcc: 0a000109 beq 1f0a3f8 + 1f09fd0: e3500005 cmp r0, #5 + 1f09fd4: e5d32004 ldrb r2, [r3, #4] + 1f09fd8: e5c62004 strb r2, [r6, #4] + 1f09fdc: e283c005 add ip, r3, #5 + 1f09fe0: e2862005 add r2, r6, #5 + 1f09fe4: 0a000101 beq 1f0a3f0 + 1f09fe8: e3500006 cmp r0, #6 + 1f09fec: e5d32005 ldrb r2, [r3, #5] + 1f09ff0: e5c62005 strb r2, [r6, #5] + 1f09ff4: e283c006 add ip, r3, #6 + 1f09ff8: e2862006 add r2, r6, #6 + 1f09ffc: 0a0000f9 beq 1f0a3e8 + 1f0a000: e3500007 cmp r0, #7 + 1f0a004: e5d32006 ldrb r2, [r3, #6] + 1f0a008: e5c62006 strb r2, [r6, #6] + 1f0a00c: e283c007 add ip, r3, #7 + 1f0a010: e2862007 add r2, r6, #7 + 1f0a014: 0a000109 beq 1f0a440 + 1f0a018: e3500008 cmp r0, #8 + 1f0a01c: e5d32007 ldrb r2, [r3, #7] + 1f0a020: e5c62007 strb r2, [r6, #7] + 1f0a024: e283c008 add ip, r3, #8 + 1f0a028: e2862008 add r2, r6, #8 + 1f0a02c: 0a000101 beq 1f0a438 + 1f0a030: e3500009 cmp r0, #9 + 1f0a034: e5d32008 ldrb r2, [r3, #8] + 1f0a038: e5c62008 strb r2, [r6, #8] + 1f0a03c: e283c009 add ip, r3, #9 + 1f0a040: e2862009 add r2, r6, #9 + 1f0a044: 0a0000f9 beq 1f0a430 + 1f0a048: e350000a cmp r0, #10 + 1f0a04c: e5d32009 ldrb r2, [r3, #9] + 1f0a050: e5c62009 strb r2, [r6, #9] + 1f0a054: e283c00a add ip, r3, #10 + 1f0a058: e286200a add r2, r6, #10 + 1f0a05c: 0a0000f1 beq 1f0a428 + 1f0a060: e350000b cmp r0, #11 + 1f0a064: e5d3200a ldrb r2, [r3, #10] + 1f0a068: e5c6200a strb r2, [r6, #10] + 1f0a06c: e283c00b add ip, r3, #11 + 1f0a070: e286200b add r2, r6, #11 + 1f0a074: 0a0000e9 beq 1f0a420 + 1f0a078: e350000c cmp r0, #12 + 1f0a07c: e5d3200b ldrb r2, [r3, #11] + 1f0a080: e5c6200b strb r2, [r6, #11] + 1f0a084: e283c00c add ip, r3, #12 + 1f0a088: e286200c add r2, r6, #12 + 1f0a08c: 0a0000e1 beq 1f0a418 + 1f0a090: e350000d cmp r0, #13 + 1f0a094: e5d3200c ldrb r2, [r3, #12] + 1f0a098: e5c6200c strb r2, [r6, #12] + 1f0a09c: e283c00d add ip, r3, #13 + 1f0a0a0: e286200d add r2, r6, #13 + 1f0a0a4: 0a0000d9 beq 1f0a410 + 1f0a0a8: e350000f cmp r0, #15 + 1f0a0ac: e5d3200d ldrb r2, [r3, #13] + 1f0a0b0: e5c6200d strb r2, [r6, #13] + 1f0a0b4: e283c00e add ip, r3, #14 + 1f0a0b8: e286200e add r2, r6, #14 + 1f0a0bc: 1a0000d1 bne 1f0a408 + 1f0a0c0: e5d3100e ldrb r1, [r3, #14] + 1f0a0c4: e286200f add r2, r6, #15 + 1f0a0c8: e5c6100e strb r1, [r6, #14] + 1f0a0cc: e283c00f add ip, r3, #15 + 1f0a0d0: e3a01011 mov r1, #17 + 1f0a0d4: e0833000 add r3, r3, r0 + 1f0a0d8: e59de000 ldr lr, [sp] + 1f0a0dc: f4630adf vld1.64 {d16-d17}, [r3 :64] + 1f0a0e0: e08e500a add r5, lr, sl + 1f0a0e4: e0855000 add r5, r5, r0 + 1f0a0e8: e3a0e010 mov lr, #16 + 1f0a0ec: e2600020 rsb r0, r0, #32 + 1f0a0f0: f4450a0f vst1.8 {d16-d17}, [r5] + 1f0a0f4: e150000e cmp r0, lr + 1f0a0f8: e06e1001 rsb r1, lr, r1 + 1f0a0fc: e082300e add r3, r2, lr + 1f0a100: e08c000e add r0, ip, lr + 1f0a104: 0a000038 beq 1f0a1ec + 1f0a108: e3510001 cmp r1, #1 + 1f0a10c: e7dcc00e ldrb ip, [ip, lr] + 1f0a110: e7c2c00e strb ip, [r2, lr] + 1f0a114: 0a000034 beq 1f0a1ec + 1f0a118: e3510002 cmp r1, #2 + 1f0a11c: e5d02001 ldrb r2, [r0, #1] + 1f0a120: e5c32001 strb r2, [r3, #1] + 1f0a124: 0a000030 beq 1f0a1ec + 1f0a128: e3510003 cmp r1, #3 + 1f0a12c: e5d02002 ldrb r2, [r0, #2] + 1f0a130: e5c32002 strb r2, [r3, #2] + 1f0a134: 0a00002c beq 1f0a1ec + 1f0a138: e3510004 cmp r1, #4 + 1f0a13c: e5d02003 ldrb r2, [r0, #3] + 1f0a140: e5c32003 strb r2, [r3, #3] + 1f0a144: 0a000028 beq 1f0a1ec + 1f0a148: e3510005 cmp r1, #5 + 1f0a14c: e5d02004 ldrb r2, [r0, #4] + 1f0a150: e5c32004 strb r2, [r3, #4] + 1f0a154: 0a000024 beq 1f0a1ec + 1f0a158: e3510006 cmp r1, #6 + 1f0a15c: e5d02005 ldrb r2, [r0, #5] + 1f0a160: e5c32005 strb r2, [r3, #5] + 1f0a164: 0a000020 beq 1f0a1ec + 1f0a168: e3510007 cmp r1, #7 + 1f0a16c: e5d02006 ldrb r2, [r0, #6] + 1f0a170: e5c32006 strb r2, [r3, #6] + 1f0a174: 0a00001c beq 1f0a1ec + 1f0a178: e3510008 cmp r1, #8 + 1f0a17c: e5d02007 ldrb r2, [r0, #7] + 1f0a180: e5c32007 strb r2, [r3, #7] + 1f0a184: 0a000018 beq 1f0a1ec + 1f0a188: e3510009 cmp r1, #9 + 1f0a18c: e5d02008 ldrb r2, [r0, #8] + 1f0a190: e5c32008 strb r2, [r3, #8] + 1f0a194: 0a000014 beq 1f0a1ec + 1f0a198: e351000a cmp r1, #10 + 1f0a19c: e5d02009 ldrb r2, [r0, #9] + 1f0a1a0: e5c32009 strb r2, [r3, #9] + 1f0a1a4: 0a000010 beq 1f0a1ec + 1f0a1a8: e351000b cmp r1, #11 + 1f0a1ac: e5d0200a ldrb r2, [r0, #10] + 1f0a1b0: e5c3200a strb r2, [r3, #10] + 1f0a1b4: 0a00000c beq 1f0a1ec + 1f0a1b8: e351000c cmp r1, #12 + 1f0a1bc: e5d0200b ldrb r2, [r0, #11] + 1f0a1c0: e5c3200b strb r2, [r3, #11] + 1f0a1c4: 0a000008 beq 1f0a1ec + 1f0a1c8: e351000d cmp r1, #13 + 1f0a1cc: e5d0200c ldrb r2, [r0, #12] + 1f0a1d0: e5c3200c strb r2, [r3, #12] + 1f0a1d4: 0a000004 beq 1f0a1ec + 1f0a1d8: e5d0200d ldrb r2, [r0, #13] + 1f0a1dc: e351000e cmp r1, #14 + 1f0a1e0: e5c3200d strb r2, [r3, #13] + 1f0a1e4: 15d0200e ldrbne r2, [r0, #14] + 1f0a1e8: 15c3200e strbne r2, [r3, #14] + 1f0a1ec: e59d3004 ldr r3, [sp, #4] + 1f0a1f0: e28aa020 add sl, sl, #32 + 1f0a1f4: e2866020 add r6, r6, #32 + 1f0a1f8: e153000a cmp r3, sl + 1f0a1fc: 8affff02 bhi 1f09e0c + 1f0a200: e59d5000 ldr r5, [sp] + 1f0a204: e3a03000 mov r3, #0 + 1f0a208: e1a00003 mov r0, r3 + 1f0a20c: e5d5c001 ldrb ip, [r5, #1] + 1f0a210: e28cc001 add ip, ip, #1 + 1f0a214: e1a0c28c lsl ip, ip, #5 + 1f0a218: e3500002 cmp r0, #2 + 1f0a21c: 03a00004 moveq r0, #4 + 1f0a220: e2132001 ands r2, r3, #1 + 1f0a224: 13a02902 movne r2, #32768 ; 0x8000 + 1f0a228: e7d51000 ldrb r1, [r5, r0] + 1f0a22c: e2800001 add r0, r0, #1 + 1f0a230: e15c0000 cmp ip, r0 + 1f0a234: e08130a3 add r3, r1, r3, lsr #1 + 1f0a238: e0822003 add r2, r2, r3 + 1f0a23c: e6ff3072 uxth r3, r2 + 1f0a240: 8afffff4 bhi 1f0a218 + 1f0a244: e5d51003 ldrb r1, [r5, #3] + 1f0a248: e5d52002 ldrb r2, [r5, #2] + 1f0a24c: e1822401 orr r2, r2, r1, lsl #8 + 1f0a250: e1520003 cmp r2, r3 + 1f0a254: 03a00000 moveq r0, #0 + 1f0a258: 1afffd57 bne 1f097bc + 1f0a25c: eafffd57 b 1f097c0 + 1f0a260: e3a0101a mov r1, #26 + 1f0a264: eafffdd7 b 1f099c8 + 1f0a268: e3a0101b mov r1, #27 + 1f0a26c: eafffdd5 b 1f099c8 + 1f0a270: e3a0101c mov r1, #28 + 1f0a274: eafffdd3 b 1f099c8 + 1f0a278: e3a0101d mov r1, #29 + 1f0a27c: eafffdd1 b 1f099c8 + 1f0a280: e3a01012 mov r1, #18 + 1f0a284: eafffdcf b 1f099c8 + 1f0a288: e3a01013 mov r1, #19 + 1f0a28c: eafffdcd b 1f099c8 + 1f0a290: e3a01014 mov r1, #20 + 1f0a294: eafffdcb b 1f099c8 + 1f0a298: e3a01015 mov r1, #21 + 1f0a29c: eafffdc9 b 1f099c8 + 1f0a2a0: e3a01016 mov r1, #22 + 1f0a2a4: eafffdc7 b 1f099c8 + 1f0a2a8: e3a01017 mov r1, #23 + 1f0a2ac: eafffdc5 b 1f099c8 + 1f0a2b0: e3a01018 mov r1, #24 + 1f0a2b4: eafffdc3 b 1f099c8 + 1f0a2b8: e3a01019 mov r1, #25 + 1f0a2bc: eafffdc1 b 1f099c8 + 1f0a2c0: e3a0101e mov r1, #30 + 1f0a2c4: eafffdbf b 1f099c8 + 1f0a2c8: e3a0101f mov r1, #31 + 1f0a2cc: eafffdbd b 1f099c8 + 1f0a2d0: f4630adf vld1.64 {d16-d17}, [r3 :64] + 1f0a2d4: e3a01020 mov r1, #32 + 1f0a2d8: e1a0c003 mov ip, r3 + 1f0a2dc: e59d2000 ldr r2, [sp] + 1f0a2e0: e1a00001 mov r0, r1 + 1f0a2e4: e1a0e001 mov lr, r1 + 1f0a2e8: e082200a add r2, r2, sl + 1f0a2ec: e2825010 add r5, r2, #16 + 1f0a2f0: f4420a0f vst1.8 {d16-d17}, [r2] + 1f0a2f4: e1a02006 mov r2, r6 + 1f0a2f8: edd30b04 vldr d16, [r3, #16] + 1f0a2fc: edd31b06 vldr d17, [r3, #24] + 1f0a300: f4450a0f vst1.8 {d16-d17}, [r5] + 1f0a304: eaffff7a b 1f0a0f4 + 1f0a308: e3a03001 mov r3, #1 + 1f0a30c: e1a0100b mov r1, fp + 1f0a310: e1a02005 mov r2, r5 + 1f0a314: e5d70001 ldrb r0, [r7, #1] + 1f0a318: eb00710a bl 1f26748 + 1f0a31c: e3500000 cmp r0, #0 + 1f0a320: 1afffd44 bne 1f09838 + 1f0a324: e5972038 ldr r2, [r7, #56] ; 0x38 + 1f0a328: e5973030 ldr r3, [r7, #48] ; 0x30 + 1f0a32c: e0622005 rsb r2, r2, r5 + 1f0a330: e5c70003 strb r0, [r7, #3] + 1f0a334: e1520003 cmp r2, r3 + 1f0a338: 2afffec0 bcs 1f09e40 + 1f0a33c: e5d78002 ldrb r8, [r7, #2] + 1f0a340: e3580001 cmp r8, #1 + 1f0a344: 8a000001 bhi 1f0a350 + 1f0a348: eafffebc b 1f09e40 + 1f0a34c: e5973030 ldr r3, [r7, #48] ; 0x30 + 1f0a350: e0855003 add r5, r5, r3 + 1f0a354: e2488001 sub r8, r8, #1 + 1f0a358: e1a02005 mov r2, r5 + 1f0a35c: e3a03001 mov r3, #1 + 1f0a360: e1a0100b mov r1, fp + 1f0a364: e5d70001 ldrb r0, [r7, #1] + 1f0a368: eb0070f6 bl 1f26748 + 1f0a36c: e3580001 cmp r8, #1 + 1f0a370: 1afffff5 bne 1f0a34c + 1f0a374: eafffeb1 b 1f09e40 + 1f0a378: e2462001 sub r2, r6, #1 + 1f0a37c: e2830020 add r0, r3, #32 + 1f0a380: e4d31001 ldrb r1, [r3], #1 + 1f0a384: e5e21001 strb r1, [r2, #1]! + 1f0a388: e1530000 cmp r3, r0 + 1f0a38c: 1afffffb bne 1f0a380 + 1f0a390: eaffff95 b 1f0a1ec + 1f0a394: f4630adf vld1.64 {d16-d17}, [r3 :64] + 1f0a398: e3a00020 mov r0, #32 + 1f0a39c: e1a01000 mov r1, r0 + 1f0a3a0: e1a02000 mov r2, r0 + 1f0a3a4: f44c0a0f vst1.8 {d16-d17}, [ip] + 1f0a3a8: edd30b04 vldr d16, [r3, #16] + 1f0a3ac: edd31b06 vldr d17, [r3, #24] + 1f0a3b0: f44e0a0f vst1.8 {d16-d17}, [lr] + 1f0a3b4: eafffe4c b 1f09cec + 1f0a3b8: e2433001 sub r3, r3, #1 + 1f0a3bc: e285201f add r2, r5, #31 + 1f0a3c0: e285103f add r1, r5, #63 ; 0x3f + 1f0a3c4: e5f30001 ldrb r0, [r3, #1]! + 1f0a3c8: e5e20001 strb r0, [r2, #1]! + 1f0a3cc: e1510002 cmp r1, r2 + 1f0a3d0: 1afffffb bne 1f0a3c4 + 1f0a3d4: eafffe82 b 1f09de4 + 1f0a3d8: e3a0101e mov r1, #30 + 1f0a3dc: eaffff3c b 1f0a0d4 + 1f0a3e0: e3a0101f mov r1, #31 + 1f0a3e4: eaffff3a b 1f0a0d4 + 1f0a3e8: e3a0101a mov r1, #26 + 1f0a3ec: eaffff38 b 1f0a0d4 + 1f0a3f0: e3a0101b mov r1, #27 + 1f0a3f4: eaffff36 b 1f0a0d4 + 1f0a3f8: e3a0101c mov r1, #28 + 1f0a3fc: eaffff34 b 1f0a0d4 + 1f0a400: e3a0101d mov r1, #29 + 1f0a404: eaffff32 b 1f0a0d4 + 1f0a408: e3a01012 mov r1, #18 + 1f0a40c: eaffff30 b 1f0a0d4 + 1f0a410: e3a01013 mov r1, #19 + 1f0a414: eaffff2e b 1f0a0d4 + 1f0a418: e3a01014 mov r1, #20 + 1f0a41c: eaffff2c b 1f0a0d4 + 1f0a420: e3a01015 mov r1, #21 + 1f0a424: eaffff2a b 1f0a0d4 + 1f0a428: e3a01016 mov r1, #22 + 1f0a42c: eaffff28 b 1f0a0d4 + 1f0a430: e3a01017 mov r1, #23 + 1f0a434: eaffff26 b 1f0a0d4 + 1f0a438: e3a01018 mov r1, #24 + 1f0a43c: eaffff24 b 1f0a0d4 + 1f0a440: e3a01019 mov r1, #25 + 1f0a444: eaffff22 b 1f0a0d4 + 1f0a448: e3a0201f mov r2, #31 + 1f0a44c: eafffe1e b 1f09ccc + 1f0a450: e3a02012 mov r2, #18 + 1f0a454: eafffe1c b 1f09ccc + 1f0a458: e3a0201b mov r2, #27 + 1f0a45c: eafffe1a b 1f09ccc + 1f0a460: e3a0201c mov r2, #28 + 1f0a464: eafffe18 b 1f09ccc + 1f0a468: e3a0201d mov r2, #29 + 1f0a46c: eafffe16 b 1f09ccc + 1f0a470: e3a0201e mov r2, #30 + 1f0a474: eafffe14 b 1f09ccc + 1f0a478: e3a02013 mov r2, #19 + 1f0a47c: eafffe12 b 1f09ccc + 1f0a480: e3a02014 mov r2, #20 + 1f0a484: eafffe10 b 1f09ccc + 1f0a488: e3a02015 mov r2, #21 + 1f0a48c: eafffe0e b 1f09ccc + 1f0a490: e3a02016 mov r2, #22 + 1f0a494: eafffe0c b 1f09ccc + 1f0a498: e3a02017 mov r2, #23 + 1f0a49c: eafffe0a b 1f09ccc + 1f0a4a0: e3a02018 mov r2, #24 + 1f0a4a4: eafffe08 b 1f09ccc + 1f0a4a8: e3a02019 mov r2, #25 + 1f0a4ac: eafffe06 b 1f09ccc + 1f0a4b0: e3a0201a mov r2, #26 + 1f0a4b4: eafffe04 b 1f09ccc + +01f0a4b8 : + 1f0a4b8: e92d4ff8 push {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f0a4bc: e5906030 ldr r6, [r0, #48] ; 0x30 + 1f0a4c0: e1a05000 mov r5, r0 + 1f0a4c4: e5904000 ldr r4, [r0] + 1f0a4c8: e3560000 cmp r6, #0 + 1f0a4cc: 0a00002b beq 1f0a580 + 1f0a4d0: e3a0b0ff mov fp, #255 ; 0xff + 1f0a4d4: e1a0800b mov r8, fp + 1f0a4d8: e5947044 ldr r7, [r4, #68] ; 0x44 + 1f0a4dc: e1570006 cmp r7, r6 + 1f0a4e0: 0a000011 beq 1f0a52c + 1f0a4e4: e5d43003 ldrb r3, [r4, #3] + 1f0a4e8: e284a048 add sl, r4, #72 ; 0x48 + 1f0a4ec: e3530000 cmp r3, #0 + 1f0a4f0: 1a000043 bne 1f0a604 + 1f0a4f4: e1a0100a mov r1, sl + 1f0a4f8: e3a03001 mov r3, #1 + 1f0a4fc: e1a02006 mov r2, r6 + 1f0a500: e5d40001 ldrb r0, [r4, #1] + 1f0a504: eb007071 bl 1f266d0 + 1f0a508: e3500000 cmp r0, #0 + 1f0a50c: 0a000005 beq 1f0a528 + 1f0a510: e3e03000 mvn r3, #0 + 1f0a514: e3a00001 mov r0, #1 + 1f0a518: e5843044 str r3, [r4, #68] ; 0x44 + 1f0a51c: e3a03000 mov r3, #0 + 1f0a520: e5853030 str r3, [r5, #48] ; 0x30 + 1f0a524: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0a528: e5846044 str r6, [r4, #68] ; 0x44 + 1f0a52c: e5951034 ldr r1, [r5, #52] ; 0x34 + 1f0a530: e5d13000 ldrb r3, [r1] + 1f0a534: e3530000 cmp r3, #0 + 1f0a538: 0a000010 beq 1f0a580 + 1f0a53c: e5d42000 ldrb r2, [r4] + 1f0a540: e3520004 cmp r2, #4 + 1f0a544: 0a00002a beq 1f0a5f4 + 1f0a548: e5d1200b ldrb r2, [r1, #11] + 1f0a54c: e353002e cmp r3, #46 ; 0x2e + 1f0a550: 135300e5 cmpne r3, #229 ; 0xe5 + 1f0a554: e202203f and r2, r2, #63 ; 0x3f + 1f0a558: e5c52006 strb r2, [r5, #6] + 1f0a55c: 0a000002 beq 1f0a56c + 1f0a560: e3c20020 bic r0, r2, #32 + 1f0a564: e3500008 cmp r0, #8 + 1f0a568: 1a000041 bne 1f0a674 + 1f0a56c: e5957028 ldr r7, [r5, #40] ; 0x28 + 1f0a570: e3a080ff mov r8, #255 ; 0xff + 1f0a574: e5956030 ldr r6, [r5, #48] ; 0x30 + 1f0a578: e3560000 cmp r6, #0 + 1f0a57c: 1a000001 bne 1f0a588 + 1f0a580: e3a00004 mov r0, #4 + 1f0a584: eaffffe4 b 1f0a51c + 1f0a588: e595a000 ldr sl, [r5] + 1f0a58c: e2877020 add r7, r7, #32 + 1f0a590: e5da2000 ldrb r2, [sl] + 1f0a594: e3520004 cmp r2, #4 + 1f0a598: 13a02602 movne r2, #2097152 ; 0x200000 + 1f0a59c: 03a02201 moveq r2, #268435456 ; 0x10000000 + 1f0a5a0: e1570002 cmp r7, r2 + 1f0a5a4: 2afffff5 bcs 1f0a580 + 1f0a5a8: e7e82057 ubfx r2, r7, #0, #9 + 1f0a5ac: e3520000 cmp r2, #0 + 1f0a5b0: 1a000044 bne 1f0a6c8 + 1f0a5b4: e595102c ldr r1, [r5, #44] ; 0x2c + 1f0a5b8: e2866001 add r6, r6, #1 + 1f0a5bc: e5856030 str r6, [r5, #48] ; 0x30 + 1f0a5c0: e3510000 cmp r1, #0 + 1f0a5c4: 0a000048 beq 1f0a6ec + 1f0a5c8: e1da20ba ldrh r2, [sl, #10] + 1f0a5cc: e2422001 sub r2, r2, #1 + 1f0a5d0: e01294a7 ands r9, r2, r7, lsr #9 + 1f0a5d4: 0a000033 beq 1f0a6a8 + 1f0a5d8: e3560000 cmp r6, #0 + 1f0a5dc: e28a3048 add r3, sl, #72 ; 0x48 + 1f0a5e0: e5857028 str r7, [r5, #40] ; 0x28 + 1f0a5e4: e5853034 str r3, [r5, #52] ; 0x34 + 1f0a5e8: 1affffba bne 1f0a4d8 + 1f0a5ec: e3a00000 mov r0, #0 + 1f0a5f0: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0a5f4: e3530085 cmp r3, #133 ; 0x85 + 1f0a5f8: 0a00003f beq 1f0a6fc + 1f0a5fc: e5957028 ldr r7, [r5, #40] ; 0x28 + 1f0a600: eaffffdb b 1f0a574 + 1f0a604: e3a03001 mov r3, #1 + 1f0a608: e1a0100a mov r1, sl + 1f0a60c: e1a02007 mov r2, r7 + 1f0a610: e5d40001 ldrb r0, [r4, #1] + 1f0a614: eb00704b bl 1f26748 + 1f0a618: e3500000 cmp r0, #0 + 1f0a61c: 1a000027 bne 1f0a6c0 + 1f0a620: e5942038 ldr r2, [r4, #56] ; 0x38 + 1f0a624: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f0a628: e0622007 rsb r2, r2, r7 + 1f0a62c: e5c40003 strb r0, [r4, #3] + 1f0a630: e1520003 cmp r2, r3 + 1f0a634: 2affffae bcs 1f0a4f4 + 1f0a638: e5d49002 ldrb r9, [r4, #2] + 1f0a63c: e3590001 cmp r9, #1 + 1f0a640: 8a000001 bhi 1f0a64c + 1f0a644: eaffffaa b 1f0a4f4 + 1f0a648: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f0a64c: e0877003 add r7, r7, r3 + 1f0a650: e2499001 sub r9, r9, #1 + 1f0a654: e1a02007 mov r2, r7 + 1f0a658: e3a03001 mov r3, #1 + 1f0a65c: e1a0100a mov r1, sl + 1f0a660: e5d40001 ldrb r0, [r4, #1] + 1f0a664: eb007037 bl 1f26748 + 1f0a668: e3590001 cmp r9, #1 + 1f0a66c: 1afffff5 bne 1f0a648 + 1f0a670: eaffff9f b 1f0a4f4 + 1f0a674: e352000f cmp r2, #15 + 1f0a678: 1a0000a1 bne 1f0a904 + 1f0a67c: e3130040 tst r3, #64 ; 0x40 + 1f0a680: e5957028 ldr r7, [r5, #40] ; 0x28 + 1f0a684: 0a000014 beq 1f0a6dc + 1f0a688: e5d1b00d ldrb fp, [r1, #13] + 1f0a68c: e20330bf and r3, r3, #191 ; 0xbf + 1f0a690: e5857044 str r7, [r5, #68] ; 0x44 + 1f0a694: e5d1200d ldrb r2, [r1, #13] + 1f0a698: e152000b cmp r2, fp + 1f0a69c: 0a000021 beq 1f0a728 + 1f0a6a0: e3a080ff mov r8, #255 ; 0xff + 1f0a6a4: eaffffb2 b 1f0a574 + 1f0a6a8: e1a00005 mov r0, r5 + 1f0a6ac: ebfff2ea bl 1f0725c + 1f0a6b0: e3500001 cmp r0, #1 + 1f0a6b4: 9a000090 bls 1f0a8fc + 1f0a6b8: e3700001 cmn r0, #1 + 1f0a6bc: 1a000081 bne 1f0a8c8 + 1f0a6c0: e3a00001 mov r0, #1 + 1f0a6c4: eaffff94 b 1f0a51c + 1f0a6c8: e28a3048 add r3, sl, #72 ; 0x48 + 1f0a6cc: e5857028 str r7, [r5, #40] ; 0x28 + 1f0a6d0: e0833002 add r3, r3, r2 + 1f0a6d4: e5853034 str r3, [r5, #52] ; 0x34 + 1f0a6d8: eaffff7e b 1f0a4d8 + 1f0a6dc: e1530008 cmp r3, r8 + 1f0a6e0: 0affffeb beq 1f0a694 + 1f0a6e4: e3a080ff mov r8, #255 ; 0xff + 1f0a6e8: eaffffa1 b 1f0a574 + 1f0a6ec: e1da20b8 ldrh r2, [sl, #8] + 1f0a6f0: e15202a7 cmp r2, r7, lsr #5 + 1f0a6f4: 9affffa1 bls 1f0a580 + 1f0a6f8: eaffffb6 b 1f0a5d8 + 1f0a6fc: e5953028 ldr r3, [r5, #40] ; 0x28 + 1f0a700: e1a00005 mov r0, r5 + 1f0a704: e5853044 str r3, [r5, #68] ; 0x44 + 1f0a708: ebfffc0d bl 1f09744 + 1f0a70c: e3500000 cmp r0, #0 + 1f0a710: 1affff81 bne 1f0a51c + 1f0a714: e5943010 ldr r3, [r4, #16] + 1f0a718: e5d33004 ldrb r3, [r3, #4] + 1f0a71c: e203303f and r3, r3, #63 ; 0x3f + 1f0a720: e5c53006 strb r3, [r5, #6] + 1f0a724: eaffffb0 b 1f0a5ec + 1f0a728: e5d1c01b ldrb ip, [r1, #27] + 1f0a72c: e5d1001a ldrb r0, [r1, #26] + 1f0a730: e190040c orrs r0, r0, ip, lsl #8 + 1f0a734: 1a0000a2 bne 1f0a9c4 + 1f0a738: e5d1c000 ldrb ip, [r1] + 1f0a73c: e5d1e002 ldrb lr, [r1, #2] + 1f0a740: e5d10001 ldrb r0, [r1, #1] + 1f0a744: e20cc03f and ip, ip, #63 ; 0x3f + 1f0a748: e24cc001 sub ip, ip, #1 + 1f0a74c: e180e40e orr lr, r0, lr, lsl #8 + 1f0a750: e3a0000d mov r0, #13 + 1f0a754: e00c0c90 mul ip, r0, ip + 1f0a758: e35c00fe cmp ip, #254 ; 0xfe + 1f0a75c: 8a000098 bhi 1f0a9c4 + 1f0a760: e1a0608c lsl r6, ip, #1 + 1f0a764: e594800c ldr r8, [r4, #12] + 1f0a768: e35e0000 cmp lr, #0 + 1f0a76c: e28c0001 add r0, ip, #1 + 1f0a770: e188e0b6 strh lr, [r8, r6] + 1f0a774: e5d16004 ldrb r6, [r1, #4] + 1f0a778: e5d1e003 ldrb lr, [r1, #3] + 1f0a77c: e18e6406 orr r6, lr, r6, lsl #8 + 1f0a780: 1a000092 bne 1f0a9d0 + 1f0a784: e30fcfff movw ip, #65535 ; 0xffff + 1f0a788: e156000c cmp r6, ip + 1f0a78c: 1a00008c bne 1f0a9c4 + 1f0a790: e5d16006 ldrb r6, [r1, #6] + 1f0a794: e5d1c005 ldrb ip, [r1, #5] + 1f0a798: e18c6406 orr r6, ip, r6, lsl #8 + 1f0a79c: e30fcfff movw ip, #65535 ; 0xffff + 1f0a7a0: e156000c cmp r6, ip + 1f0a7a4: 1a000086 bne 1f0a9c4 + 1f0a7a8: e5d16008 ldrb r6, [r1, #8] + 1f0a7ac: e5d1c007 ldrb ip, [r1, #7] + 1f0a7b0: e18c6406 orr r6, ip, r6, lsl #8 + 1f0a7b4: e30fcfff movw ip, #65535 ; 0xffff + 1f0a7b8: e156000c cmp r6, ip + 1f0a7bc: 1a000080 bne 1f0a9c4 + 1f0a7c0: e5d1600a ldrb r6, [r1, #10] + 1f0a7c4: e5d1c009 ldrb ip, [r1, #9] + 1f0a7c8: e18c6406 orr r6, ip, r6, lsl #8 + 1f0a7cc: e30fcfff movw ip, #65535 ; 0xffff + 1f0a7d0: e156000c cmp r6, ip + 1f0a7d4: 1a00007a bne 1f0a9c4 + 1f0a7d8: e5d1600f ldrb r6, [r1, #15] + 1f0a7dc: e5d1c00e ldrb ip, [r1, #14] + 1f0a7e0: e18c6406 orr r6, ip, r6, lsl #8 + 1f0a7e4: e30fcfff movw ip, #65535 ; 0xffff + 1f0a7e8: e156000c cmp r6, ip + 1f0a7ec: 1a000074 bne 1f0a9c4 + 1f0a7f0: e5d16011 ldrb r6, [r1, #17] + 1f0a7f4: e5d1c010 ldrb ip, [r1, #16] + 1f0a7f8: e18c6406 orr r6, ip, r6, lsl #8 + 1f0a7fc: e30fcfff movw ip, #65535 ; 0xffff + 1f0a800: e156000c cmp r6, ip + 1f0a804: 1a00006e bne 1f0a9c4 + 1f0a808: e5d16013 ldrb r6, [r1, #19] + 1f0a80c: e5d1c012 ldrb ip, [r1, #18] + 1f0a810: e18c6406 orr r6, ip, r6, lsl #8 + 1f0a814: e30fcfff movw ip, #65535 ; 0xffff + 1f0a818: e156000c cmp r6, ip + 1f0a81c: 1a000068 bne 1f0a9c4 + 1f0a820: e5d16015 ldrb r6, [r1, #21] + 1f0a824: e5d1c014 ldrb ip, [r1, #20] + 1f0a828: e18c6406 orr r6, ip, r6, lsl #8 + 1f0a82c: e30fcfff movw ip, #65535 ; 0xffff + 1f0a830: e156000c cmp r6, ip + 1f0a834: 1a000062 bne 1f0a9c4 + 1f0a838: e5d16017 ldrb r6, [r1, #23] + 1f0a83c: e5d1c016 ldrb ip, [r1, #22] + 1f0a840: e18c6406 orr r6, ip, r6, lsl #8 + 1f0a844: e30fcfff movw ip, #65535 ; 0xffff + 1f0a848: e156000c cmp r6, ip + 1f0a84c: 1a00005c bne 1f0a9c4 + 1f0a850: e5d16019 ldrb r6, [r1, #25] + 1f0a854: e5d1c018 ldrb ip, [r1, #24] + 1f0a858: e18c6406 orr r6, ip, r6, lsl #8 + 1f0a85c: e30fcfff movw ip, #65535 ; 0xffff + 1f0a860: e156000c cmp r6, ip + 1f0a864: 1a000056 bne 1f0a9c4 + 1f0a868: e5d1601d ldrb r6, [r1, #29] + 1f0a86c: e5d1c01c ldrb ip, [r1, #28] + 1f0a870: e18c6406 orr r6, ip, r6, lsl #8 + 1f0a874: e30fcfff movw ip, #65535 ; 0xffff + 1f0a878: e156000c cmp r6, ip + 1f0a87c: 1a000050 bne 1f0a9c4 + 1f0a880: e5d1601f ldrb r6, [r1, #31] + 1f0a884: e5d1c01e ldrb ip, [r1, #30] + 1f0a888: e18c6406 orr r6, ip, r6, lsl #8 + 1f0a88c: e30fcfff movw ip, #65535 ; 0xffff + 1f0a890: e156000c cmp r6, ip + 1f0a894: 1a00004a bne 1f0a9c4 + 1f0a898: e5d11000 ldrb r1, [r1] + 1f0a89c: e3110040 tst r1, #64 ; 0x40 + 1f0a8a0: 0a000004 beq 1f0a8b8 + 1f0a8a4: e35000ff cmp r0, #255 ; 0xff + 1f0a8a8: 0a000045 beq 1f0a9c4 + 1f0a8ac: e1a00080 lsl r0, r0, #1 + 1f0a8b0: e3a01000 mov r1, #0 + 1f0a8b4: e18810b0 strh r1, [r8, r0] + 1f0a8b8: e2433001 sub r3, r3, #1 + 1f0a8bc: e1a0b002 mov fp, r2 + 1f0a8c0: e6ef8073 uxtb r8, r3 + 1f0a8c4: eaffff2a b 1f0a574 + 1f0a8c8: e59a202c ldr r2, [sl, #44] ; 0x2c + 1f0a8cc: e1500002 cmp r0, r2 + 1f0a8d0: 2affff2a bcs 1f0a580 + 1f0a8d4: e2422002 sub r2, r2, #2 + 1f0a8d8: e2401002 sub r1, r0, #2 + 1f0a8dc: e1510002 cmp r1, r2 + 1f0a8e0: e585002c str r0, [r5, #44] ; 0x2c + 1f0a8e4: 31da60ba ldrhcc r6, [sl, #10] + 1f0a8e8: 359a2040 ldrcc r2, [sl, #64] ; 0x40 + 1f0a8ec: 30292691 mlacc r9, r1, r6, r2 + 1f0a8f0: e5859030 str r9, [r5, #48] ; 0x30 + 1f0a8f4: e1a06009 mov r6, r9 + 1f0a8f8: eaffff36 b 1f0a5d8 + 1f0a8fc: e3a00002 mov r0, #2 + 1f0a900: eaffff05 b 1f0a51c + 1f0a904: e3580000 cmp r8, #0 + 1f0a908: 1a00002a bne 1f0a9b8 + 1f0a90c: e5d1e000 ldrb lr, [r1] + 1f0a910: e5d13001 ldrb r3, [r1, #1] + 1f0a914: e5d10002 ldrb r0, [r1, #2] + 1f0a918: e083338e add r3, r3, lr, lsl #7 + 1f0a91c: e5d12003 ldrb r2, [r1, #3] + 1f0a920: e083e0ae add lr, r3, lr, lsr #1 + 1f0a924: e5d13004 ldrb r3, [r1, #4] + 1f0a928: e5d16005 ldrb r6, [r1, #5] + 1f0a92c: e6efe07e uxtb lr, lr + 1f0a930: e5d14006 ldrb r4, [r1, #6] + 1f0a934: e5d1c007 ldrb ip, [r1, #7] + 1f0a938: e080038e add r0, r0, lr, lsl #7 + 1f0a93c: e080e0ae add lr, r0, lr, lsr #1 + 1f0a940: e5d1000a ldrb r0, [r1, #10] + 1f0a944: e20ee0ff and lr, lr, #255 ; 0xff + 1f0a948: e082238e add r2, r2, lr, lsl #7 + 1f0a94c: e082e0ae add lr, r2, lr, lsr #1 + 1f0a950: e5d12008 ldrb r2, [r1, #8] + 1f0a954: e20ee0ff and lr, lr, #255 ; 0xff + 1f0a958: e083338e add r3, r3, lr, lsl #7 + 1f0a95c: e083e0ae add lr, r3, lr, lsr #1 + 1f0a960: e5d13009 ldrb r3, [r1, #9] + 1f0a964: e20ee0ff and lr, lr, #255 ; 0xff + 1f0a968: e086138e add r1, r6, lr, lsl #7 + 1f0a96c: e08110ae add r1, r1, lr, lsr #1 + 1f0a970: e201e0ff and lr, r1, #255 ; 0xff + 1f0a974: e084138e add r1, r4, lr, lsl #7 + 1f0a978: e08110ae add r1, r1, lr, lsr #1 + 1f0a97c: e201e0ff and lr, r1, #255 ; 0xff + 1f0a980: e08c138e add r1, ip, lr, lsl #7 + 1f0a984: e08110ae add r1, r1, lr, lsr #1 + 1f0a988: e20110ff and r1, r1, #255 ; 0xff + 1f0a98c: e0822381 add r2, r2, r1, lsl #7 + 1f0a990: e08220a1 add r2, r2, r1, lsr #1 + 1f0a994: e20220ff and r2, r2, #255 ; 0xff + 1f0a998: e0833382 add r3, r3, r2, lsl #7 + 1f0a99c: e08330a2 add r3, r3, r2, lsr #1 + 1f0a9a0: e20330ff and r3, r3, #255 ; 0xff + 1f0a9a4: e0800383 add r0, r0, r3, lsl #7 + 1f0a9a8: e08030a3 add r3, r0, r3, lsr #1 + 1f0a9ac: e20330ff and r3, r3, #255 ; 0xff + 1f0a9b0: e153000b cmp r3, fp + 1f0a9b4: 0affff0c beq 1f0a5ec + 1f0a9b8: e3e03000 mvn r3, #0 + 1f0a9bc: e5853044 str r3, [r5, #68] ; 0x44 + 1f0a9c0: eaffff09 b 1f0a5ec + 1f0a9c4: e1a0b002 mov fp, r2 + 1f0a9c8: e3a080ff mov r8, #255 ; 0xff + 1f0a9cc: eafffee8 b 1f0a574 + 1f0a9d0: e35000ff cmp r0, #255 ; 0xff + 1f0a9d4: 0afffffa beq 1f0a9c4 + 1f0a9d8: e1a0e080 lsl lr, r0, #1 + 1f0a9dc: e3560000 cmp r6, #0 + 1f0a9e0: e28c0002 add r0, ip, #2 + 1f0a9e4: e18860be strh r6, [r8, lr] + 1f0a9e8: e5d19006 ldrb r9, [r1, #6] + 1f0a9ec: e5d16005 ldrb r6, [r1, #5] + 1f0a9f0: e1866409 orr r6, r6, r9, lsl #8 + 1f0a9f4: 0affff68 beq 1f0a79c + 1f0a9f8: e35000ff cmp r0, #255 ; 0xff + 1f0a9fc: 0afffff0 beq 1f0a9c4 + 1f0aa00: e088e00e add lr, r8, lr + 1f0aa04: e3560000 cmp r6, #0 + 1f0aa08: e28c0003 add r0, ip, #3 + 1f0aa0c: e1ce60b2 strh r6, [lr, #2] + 1f0aa10: e5d19008 ldrb r9, [r1, #8] + 1f0aa14: e5d16007 ldrb r6, [r1, #7] + 1f0aa18: e1866409 orr r6, r6, r9, lsl #8 + 1f0aa1c: 0affff64 beq 1f0a7b4 + 1f0aa20: e35000ff cmp r0, #255 ; 0xff + 1f0aa24: 0affffe6 beq 1f0a9c4 + 1f0aa28: e1ce60b4 strh r6, [lr, #4] + 1f0aa2c: e3560000 cmp r6, #0 + 1f0aa30: e28c0004 add r0, ip, #4 + 1f0aa34: e5d1900a ldrb r9, [r1, #10] + 1f0aa38: e5d16009 ldrb r6, [r1, #9] + 1f0aa3c: e1866409 orr r6, r6, r9, lsl #8 + 1f0aa40: 0affff61 beq 1f0a7cc + 1f0aa44: e35000ff cmp r0, #255 ; 0xff + 1f0aa48: 0affffdd beq 1f0a9c4 + 1f0aa4c: e1ce60b6 strh r6, [lr, #6] + 1f0aa50: e3560000 cmp r6, #0 + 1f0aa54: e28c0005 add r0, ip, #5 + 1f0aa58: e5d1900f ldrb r9, [r1, #15] + 1f0aa5c: e5d1600e ldrb r6, [r1, #14] + 1f0aa60: e1866409 orr r6, r6, r9, lsl #8 + 1f0aa64: 0affff5e beq 1f0a7e4 + 1f0aa68: e35000ff cmp r0, #255 ; 0xff + 1f0aa6c: 0affffd4 beq 1f0a9c4 + 1f0aa70: e1ce60b8 strh r6, [lr, #8] + 1f0aa74: e3560000 cmp r6, #0 + 1f0aa78: e28c0006 add r0, ip, #6 + 1f0aa7c: e5d19011 ldrb r9, [r1, #17] + 1f0aa80: e5d16010 ldrb r6, [r1, #16] + 1f0aa84: e1866409 orr r6, r6, r9, lsl #8 + 1f0aa88: 0affff5b beq 1f0a7fc + 1f0aa8c: e35000ff cmp r0, #255 ; 0xff + 1f0aa90: 0affffcb beq 1f0a9c4 + 1f0aa94: e1ce60ba strh r6, [lr, #10] + 1f0aa98: e3560000 cmp r6, #0 + 1f0aa9c: e28c0007 add r0, ip, #7 + 1f0aaa0: e5d19013 ldrb r9, [r1, #19] + 1f0aaa4: e5d16012 ldrb r6, [r1, #18] + 1f0aaa8: e1866409 orr r6, r6, r9, lsl #8 + 1f0aaac: 0affff58 beq 1f0a814 + 1f0aab0: e35000ff cmp r0, #255 ; 0xff + 1f0aab4: 0affffc2 beq 1f0a9c4 + 1f0aab8: e1ce60bc strh r6, [lr, #12] + 1f0aabc: e3560000 cmp r6, #0 + 1f0aac0: e28c0008 add r0, ip, #8 + 1f0aac4: e5d19015 ldrb r9, [r1, #21] + 1f0aac8: e5d16014 ldrb r6, [r1, #20] + 1f0aacc: e1866409 orr r6, r6, r9, lsl #8 + 1f0aad0: 0affff55 beq 1f0a82c + 1f0aad4: e35000ff cmp r0, #255 ; 0xff + 1f0aad8: 0affffb9 beq 1f0a9c4 + 1f0aadc: e1ce60be strh r6, [lr, #14] + 1f0aae0: e3560000 cmp r6, #0 + 1f0aae4: e28c0009 add r0, ip, #9 + 1f0aae8: e5d19017 ldrb r9, [r1, #23] + 1f0aaec: e5d16016 ldrb r6, [r1, #22] + 1f0aaf0: e1866409 orr r6, r6, r9, lsl #8 + 1f0aaf4: 0affff52 beq 1f0a844 + 1f0aaf8: e35000ff cmp r0, #255 ; 0xff + 1f0aafc: 0affffb0 beq 1f0a9c4 + 1f0ab00: e1ce61b0 strh r6, [lr, #16] + 1f0ab04: e3560000 cmp r6, #0 + 1f0ab08: e28c000a add r0, ip, #10 + 1f0ab0c: e5d19019 ldrb r9, [r1, #25] + 1f0ab10: e5d16018 ldrb r6, [r1, #24] + 1f0ab14: e1866409 orr r6, r6, r9, lsl #8 + 1f0ab18: 0affff4f beq 1f0a85c + 1f0ab1c: e35000ff cmp r0, #255 ; 0xff + 1f0ab20: 0affffa7 beq 1f0a9c4 + 1f0ab24: e1ce61b2 strh r6, [lr, #18] + 1f0ab28: e3560000 cmp r6, #0 + 1f0ab2c: e28c000b add r0, ip, #11 + 1f0ab30: e5d1901d ldrb r9, [r1, #29] + 1f0ab34: e5d1601c ldrb r6, [r1, #28] + 1f0ab38: e1866409 orr r6, r6, r9, lsl #8 + 1f0ab3c: 0affff4c beq 1f0a874 + 1f0ab40: e35000ff cmp r0, #255 ; 0xff + 1f0ab44: 0affff9e beq 1f0a9c4 + 1f0ab48: e1ce61b4 strh r6, [lr, #20] + 1f0ab4c: e3560000 cmp r6, #0 + 1f0ab50: e28c000c add r0, ip, #12 + 1f0ab54: e5d1901f ldrb r9, [r1, #31] + 1f0ab58: e5d1601e ldrb r6, [r1, #30] + 1f0ab5c: e1866409 orr r6, r6, r9, lsl #8 + 1f0ab60: 0affff49 beq 1f0a88c + 1f0ab64: e35000ff cmp r0, #255 ; 0xff + 1f0ab68: 0affff95 beq 1f0a9c4 + 1f0ab6c: e28c000d add r0, ip, #13 + 1f0ab70: e1ce61b6 strh r6, [lr, #22] + 1f0ab74: eaffff47 b 1f0a898 + +01f0ab78 : + 1f0ab78: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f0ab7c: e3a01000 mov r1, #0 + 1f0ab80: e1a05000 mov r5, r0 + 1f0ab84: e24dd00c sub sp, sp, #12 + 1f0ab88: e5904000 ldr r4, [r0] + 1f0ab8c: ebfff5b9 bl 1f08278 + 1f0ab90: e3500000 cmp r0, #0 + 1f0ab94: 1a000018 bne 1f0abfc + 1f0ab98: e5d43000 ldrb r3, [r4] + 1f0ab9c: e3530004 cmp r3, #4 + 1f0aba0: 0a0000f8 beq 1f0af88 + 1f0aba4: e3a0b0ff mov fp, #255 ; 0xff + 1f0aba8: e5957030 ldr r7, [r5, #48] ; 0x30 + 1f0abac: e3e03000 mvn r3, #0 + 1f0abb0: e1a0a00b mov sl, fp + 1f0abb4: e5853044 str r3, [r5, #68] ; 0x44 + 1f0abb8: e5946044 ldr r6, [r4, #68] ; 0x44 + 1f0abbc: e1560007 cmp r6, r7 + 1f0abc0: 0a000010 beq 1f0ac08 + 1f0abc4: e5d43003 ldrb r3, [r4, #3] + 1f0abc8: e2849048 add r9, r4, #72 ; 0x48 + 1f0abcc: e3530000 cmp r3, #0 + 1f0abd0: 1a000099 bne 1f0ae3c + 1f0abd4: e1a01009 mov r1, r9 + 1f0abd8: e3a03001 mov r3, #1 + 1f0abdc: e1a02007 mov r2, r7 + 1f0abe0: e5d40001 ldrb r0, [r4, #1] + 1f0abe4: eb006eb9 bl 1f266d0 + 1f0abe8: e3500000 cmp r0, #0 + 1f0abec: 0a000004 beq 1f0ac04 + 1f0abf0: e3e03000 mvn r3, #0 + 1f0abf4: e3a00001 mov r0, #1 + 1f0abf8: e5843044 str r3, [r4, #68] ; 0x44 + 1f0abfc: e28dd00c add sp, sp, #12 + 1f0ac00: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0ac04: e5847044 str r7, [r4, #68] ; 0x44 + 1f0ac08: e5953034 ldr r3, [r5, #52] ; 0x34 + 1f0ac0c: e5d32000 ldrb r2, [r3] + 1f0ac10: e3520000 cmp r2, #0 + 1f0ac14: 0a00000f beq 1f0ac58 + 1f0ac18: e5d3000b ldrb r0, [r3, #11] + 1f0ac1c: e35200e5 cmp r2, #229 ; 0xe5 + 1f0ac20: e200103f and r1, r0, #63 ; 0x3f + 1f0ac24: e5c51006 strb r1, [r5, #6] + 1f0ac28: 0a000003 beq 1f0ac3c + 1f0ac2c: e3100008 tst r0, #8 + 1f0ac30: 0a00000b beq 1f0ac64 + 1f0ac34: e351000f cmp r1, #15 + 1f0ac38: 0a00009b beq 1f0aeac + 1f0ac3c: e5951028 ldr r1, [r5, #40] ; 0x28 + 1f0ac40: e3e03000 mvn r3, #0 + 1f0ac44: e3a0a0ff mov sl, #255 ; 0xff + 1f0ac48: e5853044 str r3, [r5, #68] ; 0x44 + 1f0ac4c: e5957030 ldr r7, [r5, #48] ; 0x30 + 1f0ac50: e3570000 cmp r7, #0 + 1f0ac54: 1a000044 bne 1f0ad6c + 1f0ac58: e3a00004 mov r0, #4 + 1f0ac5c: e28dd00c add sp, sp, #12 + 1f0ac60: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0ac64: e351000f cmp r1, #15 + 1f0ac68: 0a00008f beq 1f0aeac + 1f0ac6c: e35a0000 cmp sl, #0 + 1f0ac70: 1a00002a bne 1f0ad20 + 1f0ac74: e5d36000 ldrb r6, [r3] + 1f0ac78: e5d31001 ldrb r1, [r3, #1] + 1f0ac7c: e5d32002 ldrb r2, [r3, #2] + 1f0ac80: e0811386 add r1, r1, r6, lsl #7 + 1f0ac84: e5d3c003 ldrb ip, [r3, #3] + 1f0ac88: e08160a6 add r6, r1, r6, lsr #1 + 1f0ac8c: e5d30004 ldrb r0, [r3, #4] + 1f0ac90: e5d31005 ldrb r1, [r3, #5] + 1f0ac94: e6ef6076 uxtb r6, r6 + 1f0ac98: e5d3e007 ldrb lr, [r3, #7] + 1f0ac9c: e0822386 add r2, r2, r6, lsl #7 + 1f0aca0: e08260a6 add r6, r2, r6, lsr #1 + 1f0aca4: e5d32006 ldrb r2, [r3, #6] + 1f0aca8: e20660ff and r6, r6, #255 ; 0xff + 1f0acac: e08cc386 add ip, ip, r6, lsl #7 + 1f0acb0: e08c60a6 add r6, ip, r6, lsr #1 + 1f0acb4: e5d3c00a ldrb ip, [r3, #10] + 1f0acb8: e20660ff and r6, r6, #255 ; 0xff + 1f0acbc: e0800386 add r0, r0, r6, lsl #7 + 1f0acc0: e08060a6 add r6, r0, r6, lsr #1 + 1f0acc4: e5d30008 ldrb r0, [r3, #8] + 1f0acc8: e20660ff and r6, r6, #255 ; 0xff + 1f0accc: e0811386 add r1, r1, r6, lsl #7 + 1f0acd0: e08160a6 add r6, r1, r6, lsr #1 + 1f0acd4: e5d31009 ldrb r1, [r3, #9] + 1f0acd8: e20660ff and r6, r6, #255 ; 0xff + 1f0acdc: e0822386 add r2, r2, r6, lsl #7 + 1f0ace0: e08220a6 add r2, r2, r6, lsr #1 + 1f0ace4: e20260ff and r6, r2, #255 ; 0xff + 1f0ace8: e08e2386 add r2, lr, r6, lsl #7 + 1f0acec: e08220a6 add r2, r2, r6, lsr #1 + 1f0acf0: e20220ff and r2, r2, #255 ; 0xff + 1f0acf4: e0800382 add r0, r0, r2, lsl #7 + 1f0acf8: e08020a2 add r2, r0, r2, lsr #1 + 1f0acfc: e20220ff and r2, r2, #255 ; 0xff + 1f0ad00: e0811382 add r1, r1, r2, lsl #7 + 1f0ad04: e08120a2 add r2, r1, r2, lsr #1 + 1f0ad08: e20220ff and r2, r2, #255 ; 0xff + 1f0ad0c: e08cc382 add ip, ip, r2, lsl #7 + 1f0ad10: e08c20a2 add r2, ip, r2, lsr #1 + 1f0ad14: e20220ff and r2, r2, #255 ; 0xff + 1f0ad18: e15b0002 cmp fp, r2 + 1f0ad1c: 0a000010 beq 1f0ad64 + 1f0ad20: e5d52043 ldrb r2, [r5, #67] ; 0x43 + 1f0ad24: e3120001 tst r2, #1 + 1f0ad28: 1affffc3 bne 1f0ac3c + 1f0ad2c: e285e038 add lr, r5, #56 ; 0x38 + 1f0ad30: e3a0100b mov r1, #11 + 1f0ad34: e2511001 subs r1, r1, #1 + 1f0ad38: e4d3c001 ldrb ip, [r3], #1 + 1f0ad3c: e4de0001 ldrb r0, [lr], #1 + 1f0ad40: 13a02001 movne r2, #1 + 1f0ad44: 03a02000 moveq r2, #0 + 1f0ad48: e15c0000 cmp ip, r0 + 1f0ad4c: 13a02000 movne r2, #0 + 1f0ad50: 02022001 andeq r2, r2, #1 + 1f0ad54: e3520000 cmp r2, #0 + 1f0ad58: 1afffff5 bne 1f0ad34 + 1f0ad5c: e15c0000 cmp ip, r0 + 1f0ad60: 1affffb5 bne 1f0ac3c + 1f0ad64: e3a00000 mov r0, #0 + 1f0ad68: eaffffa3 b 1f0abfc + 1f0ad6c: e5958000 ldr r8, [r5] + 1f0ad70: e2816020 add r6, r1, #32 + 1f0ad74: e5d83000 ldrb r3, [r8] + 1f0ad78: e3530004 cmp r3, #4 + 1f0ad7c: 13a03602 movne r3, #2097152 ; 0x200000 + 1f0ad80: 03a03201 moveq r3, #268435456 ; 0x10000000 + 1f0ad84: e1560003 cmp r6, r3 + 1f0ad88: 2affffb2 bcs 1f0ac58 + 1f0ad8c: e7e89056 ubfx r9, r6, #0, #9 + 1f0ad90: e3590000 cmp r9, #0 + 1f0ad94: 1a000023 bne 1f0ae28 + 1f0ad98: e595102c ldr r1, [r5, #44] ; 0x2c + 1f0ad9c: e2877001 add r7, r7, #1 + 1f0ada0: e5857030 str r7, [r5, #48] ; 0x30 + 1f0ada4: e3510000 cmp r1, #0 + 1f0ada8: 1a000006 bne 1f0adc8 + 1f0adac: e1d830b8 ldrh r3, [r8, #8] + 1f0adb0: e15302a6 cmp r3, r6, lsr #5 + 1f0adb4: 8a00001b bhi 1f0ae28 + 1f0adb8: e3a03000 mov r3, #0 + 1f0adbc: e3a00004 mov r0, #4 + 1f0adc0: e5853030 str r3, [r5, #48] ; 0x30 + 1f0adc4: eaffff8c b 1f0abfc + 1f0adc8: e1d830ba ldrh r3, [r8, #10] + 1f0adcc: e2433001 sub r3, r3, #1 + 1f0add0: e01334a6 ands r3, r3, r6, lsr #9 + 1f0add4: 1a000013 bne 1f0ae28 + 1f0add8: e1a00005 mov r0, r5 + 1f0addc: e58d3004 str r3, [sp, #4] + 1f0ade0: ebfff11d bl 1f0725c + 1f0ade4: e3500001 cmp r0, #1 + 1f0ade8: 9a00009f bls 1f0b06c + 1f0adec: e3700001 cmn r0, #1 + 1f0adf0: 0a00005e beq 1f0af70 + 1f0adf4: e598202c ldr r2, [r8, #44] ; 0x2c + 1f0adf8: e1500002 cmp r0, r2 + 1f0adfc: 2affffed bcs 1f0adb8 + 1f0ae00: e2422002 sub r2, r2, #2 + 1f0ae04: e2401002 sub r1, r0, #2 + 1f0ae08: e1510002 cmp r1, r2 + 1f0ae0c: e59d3004 ldr r3, [sp, #4] + 1f0ae10: e585002c str r0, [r5, #44] ; 0x2c + 1f0ae14: 35983040 ldrcc r3, [r8, #64] ; 0x40 + 1f0ae18: 31d820ba ldrhcc r2, [r8, #10] + 1f0ae1c: 30233291 mlacc r3, r1, r2, r3 + 1f0ae20: e5853030 str r3, [r5, #48] ; 0x30 + 1f0ae24: e1a07003 mov r7, r3 + 1f0ae28: e2888048 add r8, r8, #72 ; 0x48 + 1f0ae2c: e5856028 str r6, [r5, #40] ; 0x28 + 1f0ae30: e0888009 add r8, r8, r9 + 1f0ae34: e5858034 str r8, [r5, #52] ; 0x34 + 1f0ae38: eaffff5e b 1f0abb8 + 1f0ae3c: e3a03001 mov r3, #1 + 1f0ae40: e1a01009 mov r1, r9 + 1f0ae44: e1a02006 mov r2, r6 + 1f0ae48: e5d40001 ldrb r0, [r4, #1] + 1f0ae4c: eb006e3d bl 1f26748 + 1f0ae50: e3500000 cmp r0, #0 + 1f0ae54: 1a000045 bne 1f0af70 + 1f0ae58: e5942038 ldr r2, [r4, #56] ; 0x38 + 1f0ae5c: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f0ae60: e0622006 rsb r2, r2, r6 + 1f0ae64: e5c40003 strb r0, [r4, #3] + 1f0ae68: e1520003 cmp r2, r3 + 1f0ae6c: 2affff58 bcs 1f0abd4 + 1f0ae70: e5d48002 ldrb r8, [r4, #2] + 1f0ae74: e3580001 cmp r8, #1 + 1f0ae78: 8a000001 bhi 1f0ae84 + 1f0ae7c: eaffff54 b 1f0abd4 + 1f0ae80: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f0ae84: e0866003 add r6, r6, r3 + 1f0ae88: e2488001 sub r8, r8, #1 + 1f0ae8c: e1a02006 mov r2, r6 + 1f0ae90: e3a03001 mov r3, #1 + 1f0ae94: e1a01009 mov r1, r9 + 1f0ae98: e5d40001 ldrb r0, [r4, #1] + 1f0ae9c: eb006e29 bl 1f26748 + 1f0aea0: e3580001 cmp r8, #1 + 1f0aea4: 1afffff5 bne 1f0ae80 + 1f0aea8: eaffff49 b 1f0abd4 + 1f0aeac: e5d51043 ldrb r1, [r5, #67] ; 0x43 + 1f0aeb0: e3110040 tst r1, #64 ; 0x40 + 1f0aeb4: e5951028 ldr r1, [r5, #40] ; 0x28 + 1f0aeb8: 1affff63 bne 1f0ac4c + 1f0aebc: e3120040 tst r2, #64 ; 0x40 + 1f0aec0: 0a00002c beq 1f0af78 + 1f0aec4: e202a0bf and sl, r2, #191 ; 0xbf + 1f0aec8: e5d3200d ldrb r2, [r3, #13] + 1f0aecc: e5851044 str r1, [r5, #68] ; 0x44 + 1f0aed0: e5d3b00d ldrb fp, [r3, #13] + 1f0aed4: e15b0002 cmp fp, r2 + 1f0aed8: 11a0b002 movne fp, r2 + 1f0aedc: 13a0a0ff movne sl, #255 ; 0xff + 1f0aee0: 1affff59 bne 1f0ac4c + 1f0aee4: e5d3001b ldrb r0, [r3, #27] + 1f0aee8: e5d3201a ldrb r2, [r3, #26] + 1f0aeec: e1922400 orrs r2, r2, r0, lsl #8 + 1f0aef0: 1a000022 bne 1f0af80 + 1f0aef4: e5d39000 ldrb r9, [r3] + 1f0aef8: e3a0600d mov r6, #13 + 1f0aefc: e30e0f90 movw r0, #61328 ; 0xef90 + 1f0af00: e34001f5 movt r0, #501 ; 0x1f5 + 1f0af04: e209203f and r2, r9, #63 ; 0x3f + 1f0af08: e0807006 add r7, r0, r6 + 1f0af0c: e2422001 sub r2, r2, #1 + 1f0af10: e594800c ldr r8, [r4, #12] + 1f0af14: e3a0e001 mov lr, #1 + 1f0af18: e0060296 mul r6, r6, r2 + 1f0af1c: ea000008 b 1f0af44 + 1f0af20: e35600fe cmp r6, #254 ; 0xfe + 1f0af24: e1a0c086 lsl ip, r6, #1 + 1f0af28: 8a000014 bhi 1f0af80 + 1f0af2c: e198e0bc ldrh lr, [r8, ip] + 1f0af30: e15e0002 cmp lr, r2 + 1f0af34: 1a000011 bne 1f0af80 + 1f0af38: e2866001 add r6, r6, #1 + 1f0af3c: e1500007 cmp r0, r7 + 1f0af40: 0a000050 beq 1f0b088 + 1f0af44: e4d02001 ldrb r2, [r0], #1 + 1f0af48: e35e0000 cmp lr, #0 + 1f0af4c: e083c002 add ip, r3, r2 + 1f0af50: e7d32002 ldrb r2, [r3, r2] + 1f0af54: e5dcc001 ldrb ip, [ip, #1] + 1f0af58: e182240c orr r2, r2, ip, lsl #8 + 1f0af5c: 1affffef bne 1f0af20 + 1f0af60: e30fcfff movw ip, #65535 ; 0xffff + 1f0af64: e152000c cmp r2, ip + 1f0af68: 0afffff3 beq 1f0af3c + 1f0af6c: ea000003 b 1f0af80 + 1f0af70: e3a00001 mov r0, #1 + 1f0af74: eaffff20 b 1f0abfc + 1f0af78: e15a0002 cmp sl, r2 + 1f0af7c: 0a000050 beq 1f0b0c4 + 1f0af80: e3a0a0ff mov sl, #255 ; 0xff + 1f0af84: eaffff30 b 1f0ac4c + 1f0af88: e594300c ldr r3, [r4, #12] + 1f0af8c: e283e002 add lr, r3, #2 + 1f0af90: e1d3c0b0 ldrh ip, [r3] + 1f0af94: e35c0000 cmp ip, #0 + 1f0af98: 0a000045 beq 1f0b0b4 + 1f0af9c: e1a06000 mov r6, r0 + 1f0afa0: e1a02000 mov r2, r0 + 1f0afa4: ea000001 b 1f0afb0 + 1f0afa8: e2162001 ands r2, r6, #1 + 1f0afac: 13a02902 movne r2, #32768 ; 0x8000 + 1f0afb0: e6ef307c uxtb r3, ip + 1f0afb4: e1a0144c asr r1, ip, #8 + 1f0afb8: e08360c6 add r6, r3, r6, asr #1 + 1f0afbc: e0dec0b2 ldrh ip, [lr], #2 + 1f0afc0: e0826006 add r6, r2, r6 + 1f0afc4: e6ff6076 uxth r6, r6 + 1f0afc8: e2163001 ands r3, r6, #1 + 1f0afcc: 13a03902 movne r3, #32768 ; 0x8000 + 1f0afd0: e08160a6 add r6, r1, r6, lsr #1 + 1f0afd4: e0833006 add r3, r3, r6 + 1f0afd8: e35c0000 cmp ip, #0 + 1f0afdc: e6ff6073 uxth r6, r3 + 1f0afe0: 1afffff0 bne 1f0afa8 + 1f0afe4: e1a00005 mov r0, r5 + 1f0afe8: ebfffd32 bl 1f0a4b8 + 1f0afec: e3500000 cmp r0, #0 + 1f0aff0: 1affff01 bne 1f0abfc + 1f0aff4: e5943010 ldr r3, [r4, #16] + 1f0aff8: e5d31025 ldrb r1, [r3, #37] ; 0x25 + 1f0affc: e5d32024 ldrb r2, [r3, #36] ; 0x24 + 1f0b000: e1822401 orr r2, r2, r1, lsl #8 + 1f0b004: e1520006 cmp r2, r6 + 1f0b008: 1afffff5 bne 1f0afe4 + 1f0b00c: e5d32023 ldrb r2, [r3, #35] ; 0x23 + 1f0b010: e3520000 cmp r2, #0 + 1f0b014: 0a000028 beq 1f0b0bc + 1f0b018: e2429001 sub r9, r2, #1 + 1f0b01c: e594800c ldr r8, [r4, #12] + 1f0b020: e3a02040 mov r2, #64 ; 0x40 + 1f0b024: e6ef9079 uxtb r9, r9 + 1f0b028: e248e002 sub lr, r8, #2 + 1f0b02c: e2899001 add r9, r9, #1 + 1f0b030: ea000001 b 1f0b03c + 1f0b034: e1500009 cmp r0, r9 + 1f0b038: 0a00000d beq 1f0b074 + 1f0b03c: e312001f tst r2, #31 + 1f0b040: e1fe70b2 ldrh r7, [lr, #2]! + 1f0b044: 02822002 addeq r2, r2, #2 + 1f0b048: e2800001 add r0, r0, #1 + 1f0b04c: e083c002 add ip, r3, r2 + 1f0b050: e7d31002 ldrb r1, [r3, r2] + 1f0b054: e2822002 add r2, r2, #2 + 1f0b058: e5dcc001 ldrb ip, [ip, #1] + 1f0b05c: e181140c orr r1, r1, ip, lsl #8 + 1f0b060: e1570001 cmp r7, r1 + 1f0b064: 0afffff2 beq 1f0b034 + 1f0b068: eaffffdd b 1f0afe4 + 1f0b06c: e3a00002 mov r0, #2 + 1f0b070: eafffee1 b 1f0abfc + 1f0b074: e1a02080 lsl r2, r0, #1 + 1f0b078: e19830b2 ldrh r3, [r8, r2] + 1f0b07c: e3530000 cmp r3, #0 + 1f0b080: 1affffd7 bne 1f0afe4 + 1f0b084: eaffff36 b 1f0ad64 + 1f0b088: e29ee000 adds lr, lr, #0 + 1f0b08c: 13a0e001 movne lr, #1 + 1f0b090: e01e3329 ands r3, lr, r9, lsr #6 + 1f0b094: 0a000003 beq 1f0b0a8 + 1f0b098: e1a06086 lsl r6, r6, #1 + 1f0b09c: e19830b6 ldrh r3, [r8, r6] + 1f0b0a0: e3530000 cmp r3, #0 + 1f0b0a4: 1affffb5 bne 1f0af80 + 1f0b0a8: e24aa001 sub sl, sl, #1 + 1f0b0ac: e6efa07a uxtb sl, sl + 1f0b0b0: eafffee5 b 1f0ac4c + 1f0b0b4: e1a0600c mov r6, ip + 1f0b0b8: eaffffc9 b 1f0afe4 + 1f0b0bc: e594800c ldr r8, [r4, #12] + 1f0b0c0: eaffffec b 1f0b078 + 1f0b0c4: e1a0200b mov r2, fp + 1f0b0c8: eaffff80 b 1f0aed0 + +01f0b0cc : + 1f0b0cc: e5d03043 ldrb r3, [r0, #67] ; 0x43 + 1f0b0d0: e21320a0 ands r2, r3, #160 ; 0xa0 + 1f0b0d4: 0a000001 beq 1f0b0e0 + 1f0b0d8: e3a00006 mov r0, #6 + 1f0b0dc: e12fff1e bx lr + 1f0b0e0: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f0b0e4: e5906000 ldr r6, [r0] + 1f0b0e8: e24dd06c sub sp, sp, #108 ; 0x6c + 1f0b0ec: e596300c ldr r3, [r6, #12] + 1f0b0f0: e1d3a0b0 ldrh sl, [r3] + 1f0b0f4: e35a0000 cmp sl, #0 + 1f0b0f8: 0a000004 beq 1f0b110 + 1f0b0fc: e1a0a002 mov sl, r2 + 1f0b100: e1f320b2 ldrh r2, [r3, #2]! + 1f0b104: e28aa001 add sl, sl, #1 + 1f0b108: e3520000 cmp r2, #0 + 1f0b10c: 1afffffb bne 1f0b100 + 1f0b110: e5d63000 ldrb r3, [r6] + 1f0b114: e1a04000 mov r4, r0 + 1f0b118: e3530004 cmp r3, #4 + 1f0b11c: 0a00023c beq 1f0ba14 + 1f0b120: e5d03043 ldrb r3, [r0, #67] ; 0x43 + 1f0b124: edd00b0e vldr d16, [r0, #56] ; 0x38 + 1f0b128: e5d01040 ldrb r1, [r0, #64] ; 0x40 + 1f0b12c: e2805038 add r5, r0, #56 ; 0x38 + 1f0b130: e3130001 tst r3, #1 + 1f0b134: e1a08003 mov r8, r3 + 1f0b138: e5cd3023 strb r3, [sp, #35] ; 0x23 + 1f0b13c: e5d02041 ldrb r2, [r0, #65] ; 0x41 + 1f0b140: edcd0b06 vstr d16, [sp, #24] + 1f0b144: e5d03042 ldrb r3, [r0, #66] ; 0x42 + 1f0b148: e5cd1020 strb r1, [sp, #32] + 1f0b14c: e2801040 add r1, r0, #64 ; 0x40 + 1f0b150: e5cd2021 strb r2, [sp, #33] ; 0x21 + 1f0b154: e58d1008 str r1, [sp, #8] + 1f0b158: e5cd3022 strb r3, [sp, #34] ; 0x22 + 1f0b15c: 0a000114 beq 1f0b5b4 + 1f0b160: e3a03040 mov r3, #64 ; 0x40 + 1f0b164: e3a09001 mov r9, #1 + 1f0b168: e5c03043 strb r3, [r0, #67] ; 0x43 + 1f0b16c: e3a0707e mov r7, #126 ; 0x7e + 1f0b170: e5dd0019 ldrb r0, [sp, #25] + 1f0b174: e3590005 cmp r9, #5 + 1f0b178: e5dd301a ldrb r3, [sp, #26] + 1f0b17c: e596200c ldr r2, [r6, #12] + 1f0b180: e5c40039 strb r0, [r4, #57] ; 0x39 + 1f0b184: e5c4303a strb r3, [r4, #58] ; 0x3a + 1f0b188: e5dd001b ldrb r0, [sp, #27] + 1f0b18c: e5dd301c ldrb r3, [sp, #28] + 1f0b190: e5c4003b strb r0, [r4, #59] ; 0x3b + 1f0b194: e5c4303c strb r3, [r4, #60] ; 0x3c + 1f0b198: e5dd001d ldrb r0, [sp, #29] + 1f0b19c: e5dd301e ldrb r3, [sp, #30] + 1f0b1a0: e5c4003d strb r0, [r4, #61] ; 0x3d + 1f0b1a4: e5c4303e strb r3, [r4, #62] ; 0x3e + 1f0b1a8: e5dd001f ldrb r0, [sp, #31] + 1f0b1ac: e5dd3020 ldrb r3, [sp, #32] + 1f0b1b0: e5dd1018 ldrb r1, [sp, #24] + 1f0b1b4: e5c4003f strb r0, [r4, #63] ; 0x3f + 1f0b1b8: e5c43040 strb r3, [r4, #64] ; 0x40 + 1f0b1bc: e5dd0021 ldrb r0, [sp, #33] ; 0x21 + 1f0b1c0: e5dd3022 ldrb r3, [sp, #34] ; 0x22 + 1f0b1c4: e5c43042 strb r3, [r4, #66] ; 0x42 + 1f0b1c8: 91a03009 movls r3, r9 + 1f0b1cc: e5c41038 strb r1, [r4, #56] ; 0x38 + 1f0b1d0: e5c40041 strb r0, [r4, #65] ; 0x41 + 1f0b1d4: 9a000071 bls 1f0b3a0 + 1f0b1d8: e2422002 sub r2, r2, #2 + 1f0b1dc: e1a03009 mov r3, r9 + 1f0b1e0: ea00006b b 1f0b394 + 1f0b1e4: e20ec001 and ip, lr, #1 + 1f0b1e8: e1a0e0ce asr lr, lr, #1 + 1f0b1ec: e08cc083 add ip, ip, r3, lsl #1 + 1f0b1f0: e31c0801 tst ip, #65536 ; 0x10000 + 1f0b1f4: e6ff007e uxth r0, lr + 1f0b1f8: 122cca11 eorne ip, ip, #69632 ; 0x11000 + 1f0b1fc: e2000001 and r0, r0, #1 + 1f0b200: 122cc021 eorne ip, ip, #33 ; 0x21 + 1f0b204: e1a030ce asr r3, lr, #1 + 1f0b208: e080c08c add ip, r0, ip, lsl #1 + 1f0b20c: e6ff0073 uxth r0, r3 + 1f0b210: e31c0801 tst ip, #65536 ; 0x10000 + 1f0b214: e2000001 and r0, r0, #1 + 1f0b218: 122cca11 eorne ip, ip, #69632 ; 0x11000 + 1f0b21c: e1a030c3 asr r3, r3, #1 + 1f0b220: 122cc021 eorne ip, ip, #33 ; 0x21 + 1f0b224: e080c08c add ip, r0, ip, lsl #1 + 1f0b228: e6ff0073 uxth r0, r3 + 1f0b22c: e31c0801 tst ip, #65536 ; 0x10000 + 1f0b230: e2000001 and r0, r0, #1 + 1f0b234: 122cca11 eorne ip, ip, #69632 ; 0x11000 + 1f0b238: e1a030c3 asr r3, r3, #1 + 1f0b23c: 122cc021 eorne ip, ip, #33 ; 0x21 + 1f0b240: e080c08c add ip, r0, ip, lsl #1 + 1f0b244: e6ff0073 uxth r0, r3 + 1f0b248: e31c0801 tst ip, #65536 ; 0x10000 + 1f0b24c: e2000001 and r0, r0, #1 + 1f0b250: 122cca11 eorne ip, ip, #69632 ; 0x11000 + 1f0b254: e1a030c3 asr r3, r3, #1 + 1f0b258: 122cc021 eorne ip, ip, #33 ; 0x21 + 1f0b25c: e080c08c add ip, r0, ip, lsl #1 + 1f0b260: e6ff0073 uxth r0, r3 + 1f0b264: e31c0801 tst ip, #65536 ; 0x10000 + 1f0b268: e2000001 and r0, r0, #1 + 1f0b26c: 122cca11 eorne ip, ip, #69632 ; 0x11000 + 1f0b270: e1a030c3 asr r3, r3, #1 + 1f0b274: 122cc021 eorne ip, ip, #33 ; 0x21 + 1f0b278: e080c08c add ip, r0, ip, lsl #1 + 1f0b27c: e6ff0073 uxth r0, r3 + 1f0b280: e31c0801 tst ip, #65536 ; 0x10000 + 1f0b284: e2000001 and r0, r0, #1 + 1f0b288: 122cca11 eorne ip, ip, #69632 ; 0x11000 + 1f0b28c: e1a030c3 asr r3, r3, #1 + 1f0b290: 122cc021 eorne ip, ip, #33 ; 0x21 + 1f0b294: e080c08c add ip, r0, ip, lsl #1 + 1f0b298: e6ff0073 uxth r0, r3 + 1f0b29c: e31c0801 tst ip, #65536 ; 0x10000 + 1f0b2a0: e2000001 and r0, r0, #1 + 1f0b2a4: 122cca11 eorne ip, ip, #69632 ; 0x11000 + 1f0b2a8: e1a030c3 asr r3, r3, #1 + 1f0b2ac: 122cc021 eorne ip, ip, #33 ; 0x21 + 1f0b2b0: e080c08c add ip, r0, ip, lsl #1 + 1f0b2b4: e6ff0073 uxth r0, r3 + 1f0b2b8: e31c0801 tst ip, #65536 ; 0x10000 + 1f0b2bc: e2000001 and r0, r0, #1 + 1f0b2c0: 122cca11 eorne ip, ip, #69632 ; 0x11000 + 1f0b2c4: e1a030c3 asr r3, r3, #1 + 1f0b2c8: 122cc021 eorne ip, ip, #33 ; 0x21 + 1f0b2cc: e080c08c add ip, r0, ip, lsl #1 + 1f0b2d0: e6ff0073 uxth r0, r3 + 1f0b2d4: e31c0801 tst ip, #65536 ; 0x10000 + 1f0b2d8: e2000001 and r0, r0, #1 + 1f0b2dc: 122cca11 eorne ip, ip, #69632 ; 0x11000 + 1f0b2e0: e1a030c3 asr r3, r3, #1 + 1f0b2e4: 122cc021 eorne ip, ip, #33 ; 0x21 + 1f0b2e8: e080c08c add ip, r0, ip, lsl #1 + 1f0b2ec: e6ff0073 uxth r0, r3 + 1f0b2f0: e31c0801 tst ip, #65536 ; 0x10000 + 1f0b2f4: e2000001 and r0, r0, #1 + 1f0b2f8: 122cca11 eorne ip, ip, #69632 ; 0x11000 + 1f0b2fc: e1a030c3 asr r3, r3, #1 + 1f0b300: 122cc021 eorne ip, ip, #33 ; 0x21 + 1f0b304: e080c08c add ip, r0, ip, lsl #1 + 1f0b308: e6ff0073 uxth r0, r3 + 1f0b30c: e31c0801 tst ip, #65536 ; 0x10000 + 1f0b310: e2000001 and r0, r0, #1 + 1f0b314: 122cca11 eorne ip, ip, #69632 ; 0x11000 + 1f0b318: e1a030c3 asr r3, r3, #1 + 1f0b31c: 122cc021 eorne ip, ip, #33 ; 0x21 + 1f0b320: e080c08c add ip, r0, ip, lsl #1 + 1f0b324: e6ff0073 uxth r0, r3 + 1f0b328: e31c0801 tst ip, #65536 ; 0x10000 + 1f0b32c: e2000001 and r0, r0, #1 + 1f0b330: 122cca11 eorne ip, ip, #69632 ; 0x11000 + 1f0b334: e1a030c3 asr r3, r3, #1 + 1f0b338: 122cc021 eorne ip, ip, #33 ; 0x21 + 1f0b33c: e080c08c add ip, r0, ip, lsl #1 + 1f0b340: e6ff0073 uxth r0, r3 + 1f0b344: e31c0801 tst ip, #65536 ; 0x10000 + 1f0b348: e2000001 and r0, r0, #1 + 1f0b34c: 122cca11 eorne ip, ip, #69632 ; 0x11000 + 1f0b350: e1a030c3 asr r3, r3, #1 + 1f0b354: 122cc021 eorne ip, ip, #33 ; 0x21 + 1f0b358: e080c08c add ip, r0, ip, lsl #1 + 1f0b35c: e6ff0073 uxth r0, r3 + 1f0b360: e31c0801 tst ip, #65536 ; 0x10000 + 1f0b364: e2000001 and r0, r0, #1 + 1f0b368: 122cca11 eorne ip, ip, #69632 ; 0x11000 + 1f0b36c: e1a030c3 asr r3, r3, #1 + 1f0b370: 122cc021 eorne ip, ip, #33 ; 0x21 + 1f0b374: e080008c add r0, r0, ip, lsl #1 + 1f0b378: e3100801 tst r0, #65536 ; 0x10000 + 1f0b37c: 12200a11 eorne r0, r0, #69632 ; 0x11000 + 1f0b380: 12200021 eorne r0, r0, #33 ; 0x21 + 1f0b384: e0833080 add r3, r3, r0, lsl #1 + 1f0b388: e3130801 tst r3, #65536 ; 0x10000 + 1f0b38c: 12233a11 eorne r3, r3, #69632 ; 0x11000 + 1f0b390: 12233021 eorne r3, r3, #33 ; 0x21 + 1f0b394: e1f2e0b2 ldrh lr, [r2, #2]! + 1f0b398: e35e0000 cmp lr, #0 + 1f0b39c: 1affff90 bne 1f0b1e4 + 1f0b3a0: e203000f and r0, r3, #15 + 1f0b3a4: e2802030 add r2, r0, #48 ; 0x30 + 1f0b3a8: e3520039 cmp r2, #57 ; 0x39 + 1f0b3ac: 82802037 addhi r2, r0, #55 ; 0x37 + 1f0b3b0: e1b03223 lsrs r3, r3, #4 + 1f0b3b4: e5cd2017 strb r2, [sp, #23] + 1f0b3b8: 0a000132 beq 1f0b888 + 1f0b3bc: e203000f and r0, r3, #15 + 1f0b3c0: e2802030 add r2, r0, #48 ; 0x30 + 1f0b3c4: e3520039 cmp r2, #57 ; 0x39 + 1f0b3c8: 82802037 addhi r2, r0, #55 ; 0x37 + 1f0b3cc: e1b03223 lsrs r3, r3, #4 + 1f0b3d0: e5cd2016 strb r2, [sp, #22] + 1f0b3d4: 0a00012f beq 1f0b898 + 1f0b3d8: e203000f and r0, r3, #15 + 1f0b3dc: e2802030 add r2, r0, #48 ; 0x30 + 1f0b3e0: e3520039 cmp r2, #57 ; 0x39 + 1f0b3e4: 82802037 addhi r2, r0, #55 ; 0x37 + 1f0b3e8: e1b03223 lsrs r3, r3, #4 + 1f0b3ec: e5cd2015 strb r2, [sp, #21] + 1f0b3f0: 0a000126 beq 1f0b890 + 1f0b3f4: e203000f and r0, r3, #15 + 1f0b3f8: e2802030 add r2, r0, #48 ; 0x30 + 1f0b3fc: e3520039 cmp r2, #57 ; 0x39 + 1f0b400: 82802037 addhi r2, r0, #55 ; 0x37 + 1f0b404: e1b03223 lsrs r3, r3, #4 + 1f0b408: e5cd2014 strb r2, [sp, #20] + 1f0b40c: 0a000119 beq 1f0b878 + 1f0b410: e203000f and r0, r3, #15 + 1f0b414: e2802030 add r2, r0, #48 ; 0x30 + 1f0b418: e3520039 cmp r2, #57 ; 0x39 + 1f0b41c: 82802037 addhi r2, r0, #55 ; 0x37 + 1f0b420: e1b03223 lsrs r3, r3, #4 + 1f0b424: e5cd2013 strb r2, [sp, #19] + 1f0b428: 0a000107 beq 1f0b84c + 1f0b42c: e203000f and r0, r3, #15 + 1f0b430: e2802030 add r2, r0, #48 ; 0x30 + 1f0b434: e3520039 cmp r2, #57 ; 0x39 + 1f0b438: 82802037 addhi r2, r0, #55 ; 0x37 + 1f0b43c: e1b03223 lsrs r3, r3, #4 + 1f0b440: e5cd2012 strb r2, [sp, #18] + 1f0b444: 0a00010d beq 1f0b880 + 1f0b448: e203000f and r0, r3, #15 + 1f0b44c: e2802030 add r2, r0, #48 ; 0x30 + 1f0b450: e3520039 cmp r2, #57 ; 0x39 + 1f0b454: 82802037 addhi r2, r0, #55 ; 0x37 + 1f0b458: e1b03223 lsrs r3, r3, #4 + 1f0b45c: e5cd2011 strb r2, [sp, #17] + 1f0b460: 0a0000f3 beq 1f0b834 + 1f0b464: e6ef3073 uxtb r3, r3 + 1f0b468: e2832030 add r2, r3, #48 ; 0x30 + 1f0b46c: e3520039 cmp r2, #57 ; 0x39 + 1f0b470: 82832037 addhi r2, r3, #55 ; 0x37 + 1f0b474: e3510020 cmp r1, #32 + 1f0b478: e5cd2010 strb r2, [sp, #16] + 1f0b47c: 0a000288 beq 1f0bea4 + 1f0b480: e3e0c000 mvn ip, #0 + 1f0b484: e2842039 add r2, r4, #57 ; 0x39 + 1f0b488: e3a01000 mov r1, #0 + 1f0b48c: ea000003 b 1f0b4a0 + 1f0b490: e5d0e000 ldrb lr, [r0] + 1f0b494: e35e0020 cmp lr, #32 + 1f0b498: 0a000097 beq 1f0b6fc + 1f0b49c: e1a01003 mov r1, r3 + 1f0b4a0: e2813001 add r3, r1, #1 + 1f0b4a4: e1a00002 mov r0, r2 + 1f0b4a8: e153000c cmp r3, ip + 1f0b4ac: e2822001 add r2, r2, #1 + 1f0b4b0: 3afffff6 bcc 1f0b490 + 1f0b4b4: e35c0007 cmp ip, #7 + 1f0b4b8: e2811002 add r1, r1, #2 + 1f0b4bc: e0850003 add r0, r5, r3 + 1f0b4c0: 9a000090 bls 1f0b708 + 1f0b4c4: e3510007 cmp r1, #7 + 1f0b4c8: e3a02020 mov r2, #32 + 1f0b4cc: e5c02000 strb r2, [r0] + 1f0b4d0: 8a00002a bhi 1f0b580 + 1f0b4d4: e2832002 add r2, r3, #2 + 1f0b4d8: e085e001 add lr, r5, r1 + 1f0b4dc: e3520008 cmp r2, #8 + 1f0b4e0: e3a03020 mov r3, #32 + 1f0b4e4: 12821001 addne r1, r2, #1 + 1f0b4e8: e5ce3000 strb r3, [lr] + 1f0b4ec: 10850002 addne r0, r5, r2 + 1f0b4f0: 0a000022 beq 1f0b580 + 1f0b4f4: e3510008 cmp r1, #8 + 1f0b4f8: e3a03020 mov r3, #32 + 1f0b4fc: 12822002 addne r2, r2, #2 + 1f0b500: e5c03000 strb r3, [r0] + 1f0b504: 1085e001 addne lr, r5, r1 + 1f0b508: 0a00001c beq 1f0b580 + 1f0b50c: e3520008 cmp r2, #8 + 1f0b510: e3a03020 mov r3, #32 + 1f0b514: 12821001 addne r1, r2, #1 + 1f0b518: e5ce3000 strb r3, [lr] + 1f0b51c: 1085e002 addne lr, r5, r2 + 1f0b520: 0a000016 beq 1f0b580 + 1f0b524: e3510008 cmp r1, #8 + 1f0b528: e3a03020 mov r3, #32 + 1f0b52c: 12822002 addne r2, r2, #2 + 1f0b530: e5ce3000 strb r3, [lr] + 1f0b534: 1085e001 addne lr, r5, r1 + 1f0b538: 0a000010 beq 1f0b580 + 1f0b53c: e3520008 cmp r2, #8 + 1f0b540: e3a03020 mov r3, #32 + 1f0b544: 12821001 addne r1, r2, #1 + 1f0b548: e5ce3000 strb r3, [lr] + 1f0b54c: 1085e002 addne lr, r5, r2 + 1f0b550: 0a00000a beq 1f0b580 + 1f0b554: e3510008 cmp r1, #8 + 1f0b558: e3a00020 mov r0, #32 + 1f0b55c: 12823002 addne r3, r2, #2 + 1f0b560: e5ce0000 strb r0, [lr] + 1f0b564: 10852001 addne r2, r5, r1 + 1f0b568: 11a01000 movne r1, r0 + 1f0b56c: 0a000003 beq 1f0b580 + 1f0b570: e3530008 cmp r3, #8 + 1f0b574: e5c21000 strb r1, [r2] + 1f0b578: 13a03020 movne r3, #32 + 1f0b57c: 15c4303f strbne r3, [r4, #63] ; 0x3f + 1f0b580: e1a00004 mov r0, r4 + 1f0b584: ebfffd7b bl 1f0ab78 + 1f0b588: e3500000 cmp r0, #0 + 1f0b58c: 1a000005 bne 1f0b5a8 + 1f0b590: e2899001 add r9, r9, #1 + 1f0b594: e3590064 cmp r9, #100 ; 0x64 + 1f0b598: 1afffef4 bne 1f0b170 + 1f0b59c: e3a00007 mov r0, #7 + 1f0b5a0: e28dd06c add sp, sp, #108 ; 0x6c + 1f0b5a4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0b5a8: e3500004 cmp r0, #4 + 1f0b5ac: 1afffffb bne 1f0b5a0 + 1f0b5b0: e5c48043 strb r8, [r4, #67] ; 0x43 + 1f0b5b4: e3180002 tst r8, #2 + 1f0b5b8: 0a0000b8 beq 1f0b8a0 + 1f0b5bc: e28aa00c add sl, sl, #12 + 1f0b5c0: e30e2c4f movw r2, #60495 ; 0xec4f + 1f0b5c4: e3442ec4 movt r2, #20164 ; 0x4ec4 + 1f0b5c8: e1a00004 mov r0, r4 + 1f0b5cc: e083229a umull r2, r3, sl, r2 + 1f0b5d0: e1a07123 lsr r7, r3, #2 + 1f0b5d4: e2871001 add r1, r7, #1 + 1f0b5d8: ebfff4db bl 1f0894c + 1f0b5dc: e3500000 cmp r0, #0 + 1f0b5e0: 1affffee bne 1f0b5a0 + 1f0b5e4: e3570000 cmp r7, #0 + 1f0b5e8: 0a0000b1 beq 1f0b8b4 + 1f0b5ec: e5941028 ldr r1, [r4, #40] ; 0x28 + 1f0b5f0: e1a00004 mov r0, r4 + 1f0b5f4: e0411287 sub r1, r1, r7, lsl #5 + 1f0b5f8: ebfff31e bl 1f08278 + 1f0b5fc: e3500000 cmp r0, #0 + 1f0b600: 1affffe6 bne 1f0b5a0 + 1f0b604: e5d41038 ldrb r1, [r4, #56] ; 0x38 + 1f0b608: e5d43039 ldrb r3, [r4, #57] ; 0x39 + 1f0b60c: e58d000c str r0, [sp, #12] + 1f0b610: e0833381 add r3, r3, r1, lsl #7 + 1f0b614: e5d4203a ldrb r2, [r4, #58] ; 0x3a + 1f0b618: e08300a1 add r0, r3, r1, lsr #1 + 1f0b61c: e5d4303b ldrb r3, [r4, #59] ; 0x3b + 1f0b620: e5d4103c ldrb r1, [r4, #60] ; 0x3c + 1f0b624: e6ef0070 uxtb r0, r0 + 1f0b628: e0822380 add r2, r2, r0, lsl #7 + 1f0b62c: e08200a0 add r0, r2, r0, lsr #1 + 1f0b630: e5d4203d ldrb r2, [r4, #61] ; 0x3d + 1f0b634: e20000ff and r0, r0, #255 ; 0xff + 1f0b638: e0833380 add r3, r3, r0, lsl #7 + 1f0b63c: e08300a0 add r0, r3, r0, lsr #1 + 1f0b640: e5d4303e ldrb r3, [r4, #62] ; 0x3e + 1f0b644: e20000ff and r0, r0, #255 ; 0xff + 1f0b648: e0811380 add r1, r1, r0, lsl #7 + 1f0b64c: e08100a0 add r0, r1, r0, lsr #1 + 1f0b650: e5d4103f ldrb r1, [r4, #63] ; 0x3f + 1f0b654: e20000ff and r0, r0, #255 ; 0xff + 1f0b658: e0822380 add r2, r2, r0, lsl #7 + 1f0b65c: e08200a0 add r0, r2, r0, lsr #1 + 1f0b660: e5d42040 ldrb r2, [r4, #64] ; 0x40 + 1f0b664: e20000ff and r0, r0, #255 ; 0xff + 1f0b668: e0833380 add r3, r3, r0, lsl #7 + 1f0b66c: e08300a0 add r0, r3, r0, lsr #1 + 1f0b670: e5d43041 ldrb r3, [r4, #65] ; 0x41 + 1f0b674: e20000ff and r0, r0, #255 ; 0xff + 1f0b678: e0811380 add r1, r1, r0, lsl #7 + 1f0b67c: e08100a0 add r0, r1, r0, lsr #1 + 1f0b680: e5d41042 ldrb r1, [r4, #66] ; 0x42 + 1f0b684: e20000ff and r0, r0, #255 ; 0xff + 1f0b688: e0822380 add r2, r2, r0, lsl #7 + 1f0b68c: e08220a0 add r2, r2, r0, lsr #1 + 1f0b690: e20220ff and r2, r2, #255 ; 0xff + 1f0b694: e0833382 add r3, r3, r2, lsl #7 + 1f0b698: e08330a2 add r3, r3, r2, lsr #1 + 1f0b69c: e20330ff and r3, r3, #255 ; 0xff + 1f0b6a0: e0811383 add r1, r1, r3, lsl #7 + 1f0b6a4: e08130a3 add r3, r1, r3, lsr #1 + 1f0b6a8: e20330ff and r3, r3, #255 ; 0xff + 1f0b6ac: e58d3004 str r3, [sp, #4] + 1f0b6b0: e594b030 ldr fp, [r4, #48] ; 0x30 + 1f0b6b4: e5968044 ldr r8, [r6, #68] ; 0x44 + 1f0b6b8: e15b0008 cmp fp, r8 + 1f0b6bc: 0a000273 beq 1f0c090 + 1f0b6c0: e5d63003 ldrb r3, [r6, #3] + 1f0b6c4: e2869048 add r9, r6, #72 ; 0x48 + 1f0b6c8: e3530000 cmp r3, #0 + 1f0b6cc: 1a000320 bne 1f0c354 + 1f0b6d0: e1a01009 mov r1, r9 + 1f0b6d4: e3a03001 mov r3, #1 + 1f0b6d8: e1a0200b mov r2, fp + 1f0b6dc: e5d60001 ldrb r0, [r6, #1] + 1f0b6e0: eb006bfa bl 1f266d0 + 1f0b6e4: e3500000 cmp r0, #0 + 1f0b6e8: 0a000267 beq 1f0c08c + 1f0b6ec: e3e03000 mvn r3, #0 + 1f0b6f0: e3a00001 mov r0, #1 + 1f0b6f4: e5863044 str r3, [r6, #68] ; 0x44 + 1f0b6f8: eaffffa8 b 1f0b5a0 + 1f0b6fc: e35c0007 cmp ip, #7 + 1f0b700: e2811002 add r1, r1, #2 + 1f0b704: 8affff6e bhi 1f0b4c4 + 1f0b708: e3510007 cmp r1, #7 + 1f0b70c: e5c07000 strb r7, [r0] + 1f0b710: e28c0001 add r0, ip, #1 + 1f0b714: 8affff99 bhi 1f0b580 + 1f0b718: e3500008 cmp r0, #8 + 1f0b71c: e2832002 add r2, r3, #2 + 1f0b720: e085e001 add lr, r5, r1 + 1f0b724: 0affff6c beq 1f0b4dc + 1f0b728: e28de068 add lr, sp, #104 ; 0x68 + 1f0b72c: e3520008 cmp r2, #8 + 1f0b730: e08e0000 add r0, lr, r0 + 1f0b734: e28ce002 add lr, ip, #2 + 1f0b738: e5500058 ldrb r0, [r0, #-88] ; 0xffffffa8 + 1f0b73c: e7c50001 strb r0, [r5, r1] + 1f0b740: 0affff8e beq 1f0b580 + 1f0b744: e35e0008 cmp lr, #8 + 1f0b748: e2831003 add r1, r3, #3 + 1f0b74c: e0850002 add r0, r5, r2 + 1f0b750: 0affff67 beq 1f0b4f4 + 1f0b754: e28d0068 add r0, sp, #104 ; 0x68 + 1f0b758: e3510008 cmp r1, #8 + 1f0b75c: e080e00e add lr, r0, lr + 1f0b760: e28c0003 add r0, ip, #3 + 1f0b764: e55ee058 ldrb lr, [lr, #-88] ; 0xffffffa8 + 1f0b768: e7c5e002 strb lr, [r5, r2] + 1f0b76c: 0affff83 beq 1f0b580 + 1f0b770: e3500008 cmp r0, #8 + 1f0b774: e2832004 add r2, r3, #4 + 1f0b778: e085e001 add lr, r5, r1 + 1f0b77c: 0affff62 beq 1f0b50c + 1f0b780: e28de068 add lr, sp, #104 ; 0x68 + 1f0b784: e3520008 cmp r2, #8 + 1f0b788: e08ee000 add lr, lr, r0 + 1f0b78c: e28c0004 add r0, ip, #4 + 1f0b790: e55ee058 ldrb lr, [lr, #-88] ; 0xffffffa8 + 1f0b794: e7c5e001 strb lr, [r5, r1] + 1f0b798: 0affff78 beq 1f0b580 + 1f0b79c: e3500008 cmp r0, #8 + 1f0b7a0: e2831005 add r1, r3, #5 + 1f0b7a4: e085e002 add lr, r5, r2 + 1f0b7a8: 0affff5d beq 1f0b524 + 1f0b7ac: e28de068 add lr, sp, #104 ; 0x68 + 1f0b7b0: e3510008 cmp r1, #8 + 1f0b7b4: e08ee000 add lr, lr, r0 + 1f0b7b8: e28c0005 add r0, ip, #5 + 1f0b7bc: e55ee058 ldrb lr, [lr, #-88] ; 0xffffffa8 + 1f0b7c0: e7c5e002 strb lr, [r5, r2] + 1f0b7c4: 0affff6d beq 1f0b580 + 1f0b7c8: e3500008 cmp r0, #8 + 1f0b7cc: e2832006 add r2, r3, #6 + 1f0b7d0: e085e001 add lr, r5, r1 + 1f0b7d4: 0affff58 beq 1f0b53c + 1f0b7d8: e28de068 add lr, sp, #104 ; 0x68 + 1f0b7dc: e3520008 cmp r2, #8 + 1f0b7e0: e08ee000 add lr, lr, r0 + 1f0b7e4: e28c0006 add r0, ip, #6 + 1f0b7e8: e55ee058 ldrb lr, [lr, #-88] ; 0xffffffa8 + 1f0b7ec: e7c5e001 strb lr, [r5, r1] + 1f0b7f0: 0affff62 beq 1f0b580 + 1f0b7f4: e3500008 cmp r0, #8 + 1f0b7f8: e2831007 add r1, r3, #7 + 1f0b7fc: e085e002 add lr, r5, r2 + 1f0b800: 0affff53 beq 1f0b554 + 1f0b804: e28de068 add lr, sp, #104 ; 0x68 + 1f0b808: e3510008 cmp r1, #8 + 1f0b80c: e08e0000 add r0, lr, r0 + 1f0b810: e5500058 ldrb r0, [r0, #-88] ; 0xffffffa8 + 1f0b814: e7c50002 strb r0, [r5, r2] + 1f0b818: 0affff58 beq 1f0b580 + 1f0b81c: e35c0000 cmp ip, #0 + 1f0b820: e2833008 add r3, r3, #8 + 1f0b824: e0852001 add r2, r5, r1 + 1f0b828: 1a00019b bne 1f0be9c + 1f0b82c: e5dd1017 ldrb r1, [sp, #23] + 1f0b830: eaffff4e b 1f0b570 + 1f0b834: e3a00001 mov r0, #1 + 1f0b838: e5cd7010 strb r7, [sp, #16] + 1f0b83c: e1a0c003 mov ip, r3 + 1f0b840: e5c47038 strb r7, [r4, #56] ; 0x38 + 1f0b844: e1a01000 mov r1, r0 + 1f0b848: eaffffb2 b 1f0b718 + 1f0b84c: e3a0c002 mov ip, #2 + 1f0b850: e28d3068 add r3, sp, #104 ; 0x68 + 1f0b854: e3510020 cmp r1, #32 + 1f0b858: e083300c add r3, r3, ip + 1f0b85c: e5437058 strb r7, [r3, #-88] ; 0xffffffa8 + 1f0b860: 1affff07 bne 1f0b484 + 1f0b864: e5c47038 strb r7, [r4, #56] ; 0x38 + 1f0b868: e28c0001 add r0, ip, #1 + 1f0b86c: e3a03000 mov r3, #0 + 1f0b870: e3a01001 mov r1, #1 + 1f0b874: eaffffa7 b 1f0b718 + 1f0b878: e3a0c003 mov ip, #3 + 1f0b87c: eafffff3 b 1f0b850 + 1f0b880: e3a0c001 mov ip, #1 + 1f0b884: eafffff1 b 1f0b850 + 1f0b888: e3a0c006 mov ip, #6 + 1f0b88c: eaffffef b 1f0b850 + 1f0b890: e3a0c004 mov ip, #4 + 1f0b894: eaffffed b 1f0b850 + 1f0b898: e3a0c005 mov ip, #5 + 1f0b89c: eaffffeb b 1f0b850 + 1f0b8a0: e3a01001 mov r1, #1 + 1f0b8a4: e1a00004 mov r0, r4 + 1f0b8a8: ebfff427 bl 1f0894c + 1f0b8ac: e3500000 cmp r0, #0 + 1f0b8b0: 1affff3a bne 1f0b5a0 + 1f0b8b4: e594a030 ldr sl, [r4, #48] ; 0x30 + 1f0b8b8: e5967044 ldr r7, [r6, #68] ; 0x44 + 1f0b8bc: e157000a cmp r7, sl + 1f0b8c0: 0a00000b beq 1f0b8f4 + 1f0b8c4: e5d63003 ldrb r3, [r6, #3] + 1f0b8c8: e2868048 add r8, r6, #72 ; 0x48 + 1f0b8cc: e3530000 cmp r3, #0 + 1f0b8d0: 1a0001c3 bne 1f0bfe4 + 1f0b8d4: e1a01008 mov r1, r8 + 1f0b8d8: e3a03001 mov r3, #1 + 1f0b8dc: e1a0200a mov r2, sl + 1f0b8e0: e5d60001 ldrb r0, [r6, #1] + 1f0b8e4: eb006b79 bl 1f266d0 + 1f0b8e8: e3500000 cmp r0, #0 + 1f0b8ec: 1affff7e bne 1f0b6ec + 1f0b8f0: e586a044 str sl, [r6, #68] ; 0x44 + 1f0b8f4: e5943034 ldr r3, [r4, #52] ; 0x34 + 1f0b8f8: e2031007 and r1, r3, #7 + 1f0b8fc: e2611000 rsb r1, r1, #0 + 1f0b900: e211100f ands r1, r1, #15 + 1f0b904: 0a00016a beq 1f0beb4 + 1f0b908: e3510001 cmp r1, #1 + 1f0b90c: e3a02000 mov r2, #0 + 1f0b910: e2830001 add r0, r3, #1 + 1f0b914: e5c32000 strb r2, [r3] + 1f0b918: 0a0002e5 beq 1f0c4b4 + 1f0b91c: e3510002 cmp r1, #2 + 1f0b920: e5c32001 strb r2, [r3, #1] + 1f0b924: e2830002 add r0, r3, #2 + 1f0b928: 0a0002df beq 1f0c4ac + 1f0b92c: e3510003 cmp r1, #3 + 1f0b930: e5c32002 strb r2, [r3, #2] + 1f0b934: e2830003 add r0, r3, #3 + 1f0b938: 0a0002d9 beq 1f0c4a4 + 1f0b93c: e3510004 cmp r1, #4 + 1f0b940: e5c32003 strb r2, [r3, #3] + 1f0b944: e2830004 add r0, r3, #4 + 1f0b948: 0a0002d3 beq 1f0c49c + 1f0b94c: e3510005 cmp r1, #5 + 1f0b950: e5c32004 strb r2, [r3, #4] + 1f0b954: e2830005 add r0, r3, #5 + 1f0b958: 0a0002cd beq 1f0c494 + 1f0b95c: e3510006 cmp r1, #6 + 1f0b960: e5c32005 strb r2, [r3, #5] + 1f0b964: e2830006 add r0, r3, #6 + 1f0b968: 0a0002c7 beq 1f0c48c + 1f0b96c: e3510007 cmp r1, #7 + 1f0b970: e5c32006 strb r2, [r3, #6] + 1f0b974: e2830007 add r0, r3, #7 + 1f0b978: 0a0002c1 beq 1f0c484 + 1f0b97c: e3510008 cmp r1, #8 + 1f0b980: e5c32007 strb r2, [r3, #7] + 1f0b984: e2830008 add r0, r3, #8 + 1f0b988: 0a0002bb beq 1f0c47c + 1f0b98c: e3510009 cmp r1, #9 + 1f0b990: e5c32008 strb r2, [r3, #8] + 1f0b994: e2830009 add r0, r3, #9 + 1f0b998: 0a0002b5 beq 1f0c474 + 1f0b99c: e351000a cmp r1, #10 + 1f0b9a0: e283000a add r0, r3, #10 + 1f0b9a4: e5c32009 strb r2, [r3, #9] + 1f0b9a8: 0a0002af beq 1f0c46c + 1f0b9ac: e351000b cmp r1, #11 + 1f0b9b0: e5c3200a strb r2, [r3, #10] + 1f0b9b4: e283000b add r0, r3, #11 + 1f0b9b8: 0a0002a9 beq 1f0c464 + 1f0b9bc: e351000c cmp r1, #12 + 1f0b9c0: e5c3200b strb r2, [r3, #11] + 1f0b9c4: e283000c add r0, r3, #12 + 1f0b9c8: 0a0002a3 beq 1f0c45c + 1f0b9cc: e351000d cmp r1, #13 + 1f0b9d0: e5c3200c strb r2, [r3, #12] + 1f0b9d4: e283000d add r0, r3, #13 + 1f0b9d8: 0a000286 beq 1f0c3f8 + 1f0b9dc: e351000f cmp r1, #15 + 1f0b9e0: e5c3200d strb r2, [r3, #13] + 1f0b9e4: e283000e add r0, r3, #14 + 1f0b9e8: 1a000280 bne 1f0c3f0 + 1f0b9ec: e5c3200e strb r2, [r3, #14] + 1f0b9f0: e283000f add r0, r3, #15 + 1f0b9f4: e3a02011 mov r2, #17 + 1f0b9f8: f2c00050 vmov.i32 q8, #0 ; 0x00000000 + 1f0b9fc: e083e001 add lr, r3, r1 + 1f0ba00: e3a0c010 mov ip, #16 + 1f0ba04: e2611020 rsb r1, r1, #32 + 1f0ba08: e1a03000 mov r3, r0 + 1f0ba0c: f44e0adf vst1.64 {d16-d17}, [lr :64] + 1f0ba10: ea00012e b 1f0bed0 + 1f0ba14: e28aa00e add sl, sl, #14 + 1f0ba18: e3082889 movw r2, #34953 ; 0x8889 + 1f0ba1c: e3482888 movt r2, #34952 ; 0x8888 + 1f0ba20: e083229a umull r2, r3, sl, r2 + 1f0ba24: e1a051a3 lsr r5, r3, #3 + 1f0ba28: e2851002 add r1, r5, #2 + 1f0ba2c: ebfff3c6 bl 1f0894c + 1f0ba30: e3500000 cmp r0, #0 + 1f0ba34: 1afffed9 bne 1f0b5a0 + 1f0ba38: e5941008 ldr r1, [r4, #8] + 1f0ba3c: e2855342 add r5, r5, #134217729 ; 0x8000001 + 1f0ba40: e5943028 ldr r3, [r4, #40] ; 0x28 + 1f0ba44: e3510000 cmp r1, #0 + 1f0ba48: e0435285 sub r5, r3, r5, lsl #5 + 1f0ba4c: e5845044 str r5, [r4, #68] ; 0x44 + 1f0ba50: 0a00004e beq 1f0bb90 + 1f0ba54: e5d40007 ldrb r0, [r4, #7] + 1f0ba58: e3100004 tst r0, #4 + 1f0ba5c: 0a00004b beq 1f0bb90 + 1f0ba60: e2000003 and r0, r0, #3 + 1f0ba64: e5c40007 strb r0, [r4, #7] + 1f0ba68: e1c421d0 ldrd r2, [r4, #16] + 1f0ba6c: e1d6e0ba ldrh lr, [r6, #10] + 1f0ba70: e3a0cc02 mov ip, #512 ; 0x200 + 1f0ba74: e3500003 cmp r0, #3 + 1f0ba78: e0a32e9c umlal r2, r3, ip, lr + 1f0ba7c: e1c421f0 strd r2, [r4, #16] + 1f0ba80: 0a000251 beq 1f0c3cc + 1f0ba84: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f0ba88: e28d0018 add r0, sp, #24 + 1f0ba8c: e5943020 ldr r3, [r4, #32] + 1f0ba90: e1a01002 mov r1, r2 + 1f0ba94: e594c000 ldr ip, [r4] + 1f0ba98: e5cd301f strb r3, [sp, #31] + 1f0ba9c: e3c330ff bic r3, r3, #255 ; 0xff + 1f0baa0: e58d3028 str r3, [sp, #40] ; 0x28 + 1f0baa4: e594301c ldr r3, [r4, #28] + 1f0baa8: e58d205c str r2, [sp, #92] ; 0x5c + 1f0baac: e3a02000 mov r2, #0 + 1f0bab0: e58dc018 str ip, [sp, #24] + 1f0bab4: e58d3020 str r3, [sp, #32] + 1f0bab8: e58d202c str r2, [sp, #44] ; 0x2c + 1f0babc: ebfff1ed bl 1f08278 + 1f0bac0: e3500000 cmp r0, #0 + 1f0bac4: 1afffeb5 bne 1f0b5a0 + 1f0bac8: e28d0018 add r0, sp, #24 + 1f0bacc: ebfff71c bl 1f09744 + 1f0bad0: e3500000 cmp r0, #0 + 1f0bad4: 1afffeb1 bne 1f0b5a0 + 1f0bad8: e1c421d0 ldrd r2, [r4, #16] + 1f0badc: e5961010 ldr r1, [r6, #16] + 1f0bae0: e28d0018 add r0, sp, #24 + 1f0bae4: e1a08822 lsr r8, r2, #16 + 1f0bae8: e1a0a422 lsr sl, r2, #8 + 1f0baec: e1888803 orr r8, r8, r3, lsl #16 + 1f0baf0: e5c1803a strb r8, [r1, #58] ; 0x3a + 1f0baf4: e1a08c22 lsr r8, r2, #24 + 1f0baf8: e5c12038 strb r2, [r1, #56] ; 0x38 + 1f0bafc: e5c1303c strb r3, [r1, #60] ; 0x3c + 1f0bb00: e18aac03 orr sl, sl, r3, lsl #24 + 1f0bb04: e1888403 orr r8, r8, r3, lsl #8 + 1f0bb08: e5c1a039 strb sl, [r1, #57] ; 0x39 + 1f0bb0c: e5c1803b strb r8, [r1, #59] ; 0x3b + 1f0bb10: e1a0c423 lsr ip, r3, #8 + 1f0bb14: e1a02823 lsr r2, r3, #16 + 1f0bb18: e5c1c03d strb ip, [r1, #61] ; 0x3d + 1f0bb1c: e5c1203e strb r2, [r1, #62] ; 0x3e + 1f0bb20: e1a03c23 lsr r3, r3, #24 + 1f0bb24: e5c1303f strb r3, [r1, #63] ; 0x3f + 1f0bb28: e1c421d0 ldrd r2, [r4, #16] + 1f0bb2c: e5961010 ldr r1, [r6, #16] + 1f0bb30: e1a08822 lsr r8, r2, #16 + 1f0bb34: e1a0a422 lsr sl, r2, #8 + 1f0bb38: e1888803 orr r8, r8, r3, lsl #16 + 1f0bb3c: e5c1802a strb r8, [r1, #42] ; 0x2a + 1f0bb40: e1a08c22 lsr r8, r2, #24 + 1f0bb44: e5c12028 strb r2, [r1, #40] ; 0x28 + 1f0bb48: e5c1302c strb r3, [r1, #44] ; 0x2c + 1f0bb4c: e1a0c423 lsr ip, r3, #8 + 1f0bb50: e1a02823 lsr r2, r3, #16 + 1f0bb54: e5c1c02d strb ip, [r1, #45] ; 0x2d + 1f0bb58: e5c1202e strb r2, [r1, #46] ; 0x2e + 1f0bb5c: e18aac03 orr sl, sl, r3, lsl #24 + 1f0bb60: e1888403 orr r8, r8, r3, lsl #8 + 1f0bb64: e5c1a029 strb sl, [r1, #41] ; 0x29 + 1f0bb68: e5c1802b strb r8, [r1, #43] ; 0x2b + 1f0bb6c: e1a03c23 lsr r3, r3, #24 + 1f0bb70: e5c1302f strb r3, [r1, #47] ; 0x2f + 1f0bb74: e5962010 ldr r2, [r6, #16] + 1f0bb78: e5d43007 ldrb r3, [r4, #7] + 1f0bb7c: e3833001 orr r3, r3, #1 + 1f0bb80: e5c23021 strb r3, [r2, #33] ; 0x21 + 1f0bb84: ebfff4f2 bl 1f08f54 + 1f0bb88: e3500000 cmp r0, #0 + 1f0bb8c: 1afffe83 bne 1f0b5a0 + 1f0bb90: e5967010 ldr r7, [r6, #16] + 1f0bb94: e596c00c ldr ip, [r6, #12] + 1f0bb98: e2072007 and r2, r7, #7 + 1f0bb9c: e2622000 rsb r2, r2, #0 + 1f0bba0: e212200f ands r2, r2, #15 + 1f0bba4: 0a00012a beq 1f0c054 + 1f0bba8: e3520001 cmp r2, #1 + 1f0bbac: e3a03000 mov r3, #0 + 1f0bbb0: e2871001 add r1, r7, #1 + 1f0bbb4: e5c73000 strb r3, [r7] + 1f0bbb8: 0a00023f beq 1f0c4bc + 1f0bbbc: e3520002 cmp r2, #2 + 1f0bbc0: e5c73001 strb r3, [r7, #1] + 1f0bbc4: e2871002 add r1, r7, #2 + 1f0bbc8: 0a000250 beq 1f0c510 + 1f0bbcc: e3520003 cmp r2, #3 + 1f0bbd0: e5c73002 strb r3, [r7, #2] + 1f0bbd4: e2871003 add r1, r7, #3 + 1f0bbd8: 0a00024a beq 1f0c508 + 1f0bbdc: e3520004 cmp r2, #4 + 1f0bbe0: e5c73003 strb r3, [r7, #3] + 1f0bbe4: e2871004 add r1, r7, #4 + 1f0bbe8: 0a000261 beq 1f0c574 + 1f0bbec: e3520005 cmp r2, #5 + 1f0bbf0: e5c73004 strb r3, [r7, #4] + 1f0bbf4: e2871005 add r1, r7, #5 + 1f0bbf8: 0a00025b beq 1f0c56c + 1f0bbfc: e3520006 cmp r2, #6 + 1f0bc00: e5c73005 strb r3, [r7, #5] + 1f0bc04: e2871006 add r1, r7, #6 + 1f0bc08: 0a000255 beq 1f0c564 + 1f0bc0c: e3520007 cmp r2, #7 + 1f0bc10: e5c73006 strb r3, [r7, #6] + 1f0bc14: e2871007 add r1, r7, #7 + 1f0bc18: 0a00024f beq 1f0c55c + 1f0bc1c: e3520008 cmp r2, #8 + 1f0bc20: e5c73007 strb r3, [r7, #7] + 1f0bc24: e2871008 add r1, r7, #8 + 1f0bc28: 0a000249 beq 1f0c554 + 1f0bc2c: e3520009 cmp r2, #9 + 1f0bc30: e5c73008 strb r3, [r7, #8] + 1f0bc34: e2871009 add r1, r7, #9 + 1f0bc38: 0a000243 beq 1f0c54c + 1f0bc3c: e352000a cmp r2, #10 + 1f0bc40: e287100a add r1, r7, #10 + 1f0bc44: e5c73009 strb r3, [r7, #9] + 1f0bc48: 0a00023d beq 1f0c544 + 1f0bc4c: e352000b cmp r2, #11 + 1f0bc50: e5c7300a strb r3, [r7, #10] + 1f0bc54: e287100b add r1, r7, #11 + 1f0bc58: 0a000237 beq 1f0c53c + 1f0bc5c: e352000c cmp r2, #12 + 1f0bc60: e5c7300b strb r3, [r7, #11] + 1f0bc64: e287100c add r1, r7, #12 + 1f0bc68: 0a000231 beq 1f0c534 + 1f0bc6c: e352000d cmp r2, #13 + 1f0bc70: e5c7300c strb r3, [r7, #12] + 1f0bc74: e287100d add r1, r7, #13 + 1f0bc78: 0a00022b beq 1f0c52c + 1f0bc7c: e352000f cmp r2, #15 + 1f0bc80: e5c7300d strb r3, [r7, #13] + 1f0bc84: e287100e add r1, r7, #14 + 1f0bc88: 1a000225 bne 1f0c524 + 1f0bc8c: e5c7300e strb r3, [r7, #14] + 1f0bc90: e287100f add r1, r7, #15 + 1f0bc94: e3a03031 mov r3, #49 ; 0x31 + 1f0bc98: e2620040 rsb r0, r2, #64 ; 0x40 + 1f0bc9c: e3a04003 mov r4, #3 + 1f0bca0: e3a0e030 mov lr, #48 ; 0x30 + 1f0bca4: f2c00050 vmov.i32 q8, #0 ; 0x00000000 + 1f0bca8: e0872002 add r2, r7, r2 + 1f0bcac: e3540004 cmp r4, #4 + 1f0bcb0: f4420adf vst1.64 {d16-d17}, [r2 :64] + 1f0bcb4: edc20b04 vstr d16, [r2, #16] + 1f0bcb8: edc21b06 vstr d17, [r2, #24] + 1f0bcbc: edc20b08 vstr d16, [r2, #32] + 1f0bcc0: edc21b0a vstr d17, [r2, #40] ; 0x28 + 1f0bcc4: 1a000001 bne 1f0bcd0 + 1f0bcc8: edc20b0c vstr d16, [r2, #48] ; 0x30 + 1f0bccc: edc21b0e vstr d17, [r2, #56] ; 0x38 + 1f0bcd0: e15e0000 cmp lr, r0 + 1f0bcd4: e06e3003 rsb r3, lr, r3 + 1f0bcd8: e081200e add r2, r1, lr + 1f0bcdc: 0a00002a beq 1f0bd8c + 1f0bce0: e3530001 cmp r3, #1 + 1f0bce4: e3a00000 mov r0, #0 + 1f0bce8: e7c1000e strb r0, [r1, lr] + 1f0bcec: 0a000026 beq 1f0bd8c + 1f0bcf0: e3530002 cmp r3, #2 + 1f0bcf4: e5c20001 strb r0, [r2, #1] + 1f0bcf8: 0a000023 beq 1f0bd8c + 1f0bcfc: e3530003 cmp r3, #3 + 1f0bd00: e5c20002 strb r0, [r2, #2] + 1f0bd04: 0a000020 beq 1f0bd8c + 1f0bd08: e3530004 cmp r3, #4 + 1f0bd0c: e5c20003 strb r0, [r2, #3] + 1f0bd10: 0a00001d beq 1f0bd8c + 1f0bd14: e3530005 cmp r3, #5 + 1f0bd18: e5c20004 strb r0, [r2, #4] + 1f0bd1c: 0a00001a beq 1f0bd8c + 1f0bd20: e3530006 cmp r3, #6 + 1f0bd24: e5c20005 strb r0, [r2, #5] + 1f0bd28: 0a000017 beq 1f0bd8c + 1f0bd2c: e3530007 cmp r3, #7 + 1f0bd30: e5c20006 strb r0, [r2, #6] + 1f0bd34: 0a000014 beq 1f0bd8c + 1f0bd38: e3530008 cmp r3, #8 + 1f0bd3c: e5c20007 strb r0, [r2, #7] + 1f0bd40: 0a000011 beq 1f0bd8c + 1f0bd44: e3530009 cmp r3, #9 + 1f0bd48: e5c20008 strb r0, [r2, #8] + 1f0bd4c: 0a00000e beq 1f0bd8c + 1f0bd50: e353000a cmp r3, #10 + 1f0bd54: e5c20009 strb r0, [r2, #9] + 1f0bd58: 0a00000b beq 1f0bd8c + 1f0bd5c: e353000b cmp r3, #11 + 1f0bd60: e5c2000a strb r0, [r2, #10] + 1f0bd64: 0a000008 beq 1f0bd8c + 1f0bd68: e353000c cmp r3, #12 + 1f0bd6c: e5c2000b strb r0, [r2, #11] + 1f0bd70: 0a000005 beq 1f0bd8c + 1f0bd74: e353000d cmp r3, #13 + 1f0bd78: e5c2000c strb r0, [r2, #12] + 1f0bd7c: 0a000002 beq 1f0bd8c + 1f0bd80: e353000e cmp r3, #14 + 1f0bd84: e5c2000d strb r0, [r2, #13] + 1f0bd88: 15c2000e strbne r0, [r2, #14] + 1f0bd8c: e3e0207a mvn r2, #122 ; 0x7a + 1f0bd90: e3e0303f mvn r3, #63 ; 0x3f + 1f0bd94: e5c72000 strb r2, [r7] + 1f0bd98: e28c4002 add r4, ip, #2 + 1f0bd9c: e5c73020 strb r3, [r7, #32] + 1f0bda0: e1dce0b0 ldrh lr, [ip] + 1f0bda4: e35e0000 cmp lr, #0 + 1f0bda8: 0a0001da beq 1f0c518 + 1f0bdac: e3a02000 mov r2, #0 + 1f0bdb0: e1a03002 mov r3, r2 + 1f0bdb4: ea000001 b 1f0bdc0 + 1f0bdb8: e2123001 ands r3, r2, #1 + 1f0bdbc: 13a03902 movne r3, #32768 ; 0x8000 + 1f0bdc0: e6ef007e uxtb r0, lr + 1f0bdc4: e1a0144e asr r1, lr, #8 + 1f0bdc8: e08020a2 add r2, r0, r2, lsr #1 + 1f0bdcc: e0d4e0b2 ldrh lr, [r4], #2 + 1f0bdd0: e0833002 add r3, r3, r2 + 1f0bdd4: e6ff3073 uxth r3, r3 + 1f0bdd8: e2132001 ands r2, r3, #1 + 1f0bddc: 13a02902 movne r2, #32768 ; 0x8000 + 1f0bde0: e08130a3 add r3, r1, r3, lsr #1 + 1f0bde4: e0833002 add r3, r3, r2 + 1f0bde8: e35e0000 cmp lr, #0 + 1f0bdec: e6ff2073 uxth r2, r3 + 1f0bdf0: 1afffff0 bne 1f0bdb8 + 1f0bdf4: e6ef1072 uxtb r1, r2 + 1f0bdf8: e1a02422 lsr r2, r2, #8 + 1f0bdfc: e3a06000 mov r6, #0 + 1f0be00: e3a03001 mov r3, #1 + 1f0be04: e5c71024 strb r1, [r7, #36] ; 0x24 + 1f0be08: e1a08003 mov r8, r3 + 1f0be0c: e5c72025 strb r2, [r7, #37] ; 0x25 + 1f0be10: e1a0e006 mov lr, r6 + 1f0be14: e1a0a006 mov sl, r6 + 1f0be18: e3a01040 mov r1, #64 ; 0x40 + 1f0be1c: e3e0903e mvn r9, #62 ; 0x3e + 1f0be20: e2810001 add r0, r1, #1 + 1f0be24: e7c79001 strb r9, [r7, r1] + 1f0be28: e0872001 add r2, r7, r1 + 1f0be2c: e2811002 add r1, r1, #2 + 1f0be30: e7c7a000 strb sl, [r7, r0] + 1f0be34: ea000007 b 1f0be58 + 1f0be38: e08c508e add r5, ip, lr, lsl #1 + 1f0be3c: e1a04003 mov r4, r3 + 1f0be40: e2811002 add r1, r1, #2 + 1f0be44: e5c24002 strb r4, [r2, #2] + 1f0be48: e311001f tst r1, #31 + 1f0be4c: e5c20003 strb r0, [r2, #3] + 1f0be50: e2822002 add r2, r2, #2 + 1f0be54: 0a000084 beq 1f0c06c + 1f0be58: e3530000 cmp r3, #0 + 1f0be5c: e1a0408e lsl r4, lr, #1 + 1f0be60: e08c5004 add r5, ip, r4 + 1f0be64: e1a00003 mov r0, r3 + 1f0be68: 0afffff2 beq 1f0be38 + 1f0be6c: e19c30b4 ldrh r3, [ip, r4] + 1f0be70: e286b001 add fp, r6, #1 + 1f0be74: e3530000 cmp r3, #0 + 1f0be78: e1a00003 mov r0, r3 + 1f0be7c: e1a04003 mov r4, r3 + 1f0be80: 0affffee beq 1f0be40 + 1f0be84: e6ef607b uxtb r6, fp + 1f0be88: e6ef4073 uxtb r4, r3 + 1f0be8c: e1a00423 lsr r0, r3, #8 + 1f0be90: e6bfe076 sxth lr, r6 + 1f0be94: e08c508e add r5, ip, lr, lsl #1 + 1f0be98: eaffffe8 b 1f0be40 + 1f0be9c: e3a01020 mov r1, #32 + 1f0bea0: eafffdb2 b 1f0b570 + 1f0bea4: e5c41038 strb r1, [r4, #56] ; 0x38 + 1f0bea8: e3a03000 mov r3, #0 + 1f0beac: e3a01001 mov r1, #1 + 1f0beb0: eafffd87 b 1f0b4d4 + 1f0beb4: f2c00050 vmov.i32 q8, #0 ; 0x00000000 + 1f0beb8: e3a02020 mov r2, #32 + 1f0bebc: e1a01002 mov r1, r2 + 1f0bec0: e1a0c002 mov ip, r2 + 1f0bec4: f4430adf vst1.64 {d16-d17}, [r3 :64] + 1f0bec8: edc30b04 vstr d16, [r3, #16] + 1f0becc: edc31b06 vstr d17, [r3, #24] + 1f0bed0: e151000c cmp r1, ip + 1f0bed4: e06c2002 rsb r2, ip, r2 + 1f0bed8: e083100c add r1, r3, ip + 1f0bedc: 0a00002a beq 1f0bf8c + 1f0bee0: e3520001 cmp r2, #1 + 1f0bee4: e3a00000 mov r0, #0 + 1f0bee8: e7c3000c strb r0, [r3, ip] + 1f0beec: 0a000026 beq 1f0bf8c + 1f0bef0: e3520002 cmp r2, #2 + 1f0bef4: e5c10001 strb r0, [r1, #1] + 1f0bef8: 0a000023 beq 1f0bf8c + 1f0befc: e3520003 cmp r2, #3 + 1f0bf00: e5c10002 strb r0, [r1, #2] + 1f0bf04: 0a000020 beq 1f0bf8c + 1f0bf08: e3520004 cmp r2, #4 + 1f0bf0c: e5c10003 strb r0, [r1, #3] + 1f0bf10: 0a00001d beq 1f0bf8c + 1f0bf14: e3520005 cmp r2, #5 + 1f0bf18: e5c10004 strb r0, [r1, #4] + 1f0bf1c: 0a00001a beq 1f0bf8c + 1f0bf20: e3520006 cmp r2, #6 + 1f0bf24: e5c10005 strb r0, [r1, #5] + 1f0bf28: 0a000017 beq 1f0bf8c + 1f0bf2c: e3520007 cmp r2, #7 + 1f0bf30: e5c10006 strb r0, [r1, #6] + 1f0bf34: 0a000014 beq 1f0bf8c + 1f0bf38: e3520008 cmp r2, #8 + 1f0bf3c: e5c10007 strb r0, [r1, #7] + 1f0bf40: 0a000011 beq 1f0bf8c + 1f0bf44: e3520009 cmp r2, #9 + 1f0bf48: e5c10008 strb r0, [r1, #8] + 1f0bf4c: 0a00000e beq 1f0bf8c + 1f0bf50: e352000a cmp r2, #10 + 1f0bf54: e5c10009 strb r0, [r1, #9] + 1f0bf58: 0a00000b beq 1f0bf8c + 1f0bf5c: e352000b cmp r2, #11 + 1f0bf60: e5c1000a strb r0, [r1, #10] + 1f0bf64: 0a000008 beq 1f0bf8c + 1f0bf68: e352000c cmp r2, #12 + 1f0bf6c: e5c1000b strb r0, [r1, #11] + 1f0bf70: 0a000005 beq 1f0bf8c + 1f0bf74: e352000d cmp r2, #13 + 1f0bf78: e5c1000c strb r0, [r1, #12] + 1f0bf7c: 0a000002 beq 1f0bf8c + 1f0bf80: e352000e cmp r2, #14 + 1f0bf84: e5c1000d strb r0, [r1, #13] + 1f0bf88: 15c1000e strbne r0, [r1, #14] + 1f0bf8c: e5943034 ldr r3, [r4, #52] ; 0x34 + 1f0bf90: e59d1008 ldr r1, [sp, #8] + 1f0bf94: e2832008 add r2, r3, #8 + 1f0bf98: e1530001 cmp r3, r1 + 1f0bf9c: 31550002 cmpcc r5, r2 + 1f0bfa0: 3a000147 bcc 1f0c4c4 + 1f0bfa4: edd40b0e vldr d16, [r4, #56] ; 0x38 + 1f0bfa8: f443070f vst1.8 {d16}, [r3] + 1f0bfac: e5d42040 ldrb r2, [r4, #64] ; 0x40 + 1f0bfb0: e3a00000 mov r0, #0 + 1f0bfb4: e5c32008 strb r2, [r3, #8] + 1f0bfb8: e5d42041 ldrb r2, [r4, #65] ; 0x41 + 1f0bfbc: e5c32009 strb r2, [r3, #9] + 1f0bfc0: e5d42042 ldrb r2, [r4, #66] ; 0x42 + 1f0bfc4: e5c3200a strb r2, [r3, #10] + 1f0bfc8: e3a02001 mov r2, #1 + 1f0bfcc: e5941034 ldr r1, [r4, #52] ; 0x34 + 1f0bfd0: e5d43043 ldrb r3, [r4, #67] ; 0x43 + 1f0bfd4: e2033018 and r3, r3, #24 + 1f0bfd8: e5c1300c strb r3, [r1, #12] + 1f0bfdc: e5c62003 strb r2, [r6, #3] + 1f0bfe0: eafffd6e b 1f0b5a0 + 1f0bfe4: e3a03001 mov r3, #1 + 1f0bfe8: e1a01008 mov r1, r8 + 1f0bfec: e1a02007 mov r2, r7 + 1f0bff0: e5d60001 ldrb r0, [r6, #1] + 1f0bff4: eb0069d3 bl 1f26748 + 1f0bff8: e3500000 cmp r0, #0 + 1f0bffc: 1a0000f0 bne 1f0c3c4 + 1f0c000: e5962038 ldr r2, [r6, #56] ; 0x38 + 1f0c004: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f0c008: e0622007 rsb r2, r2, r7 + 1f0c00c: e5c60003 strb r0, [r6, #3] + 1f0c010: e1520003 cmp r2, r3 + 1f0c014: 2afffe2e bcs 1f0b8d4 + 1f0c018: e5d69002 ldrb r9, [r6, #2] + 1f0c01c: e3590001 cmp r9, #1 + 1f0c020: 8a000001 bhi 1f0c02c + 1f0c024: eafffe2a b 1f0b8d4 + 1f0c028: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f0c02c: e0877003 add r7, r7, r3 + 1f0c030: e2499001 sub r9, r9, #1 + 1f0c034: e1a02007 mov r2, r7 + 1f0c038: e3a03001 mov r3, #1 + 1f0c03c: e1a01008 mov r1, r8 + 1f0c040: e5d60001 ldrb r0, [r6, #1] + 1f0c044: eb0069bf bl 1f26748 + 1f0c048: e3590001 cmp r9, #1 + 1f0c04c: 1afffff5 bne 1f0c028 + 1f0c050: eafffe1f b 1f0b8d4 + 1f0c054: e3a03040 mov r3, #64 ; 0x40 + 1f0c058: e1a01007 mov r1, r7 + 1f0c05c: e1a00003 mov r0, r3 + 1f0c060: e1a0e003 mov lr, r3 + 1f0c064: e3a04004 mov r4, #4 + 1f0c068: eaffff0d b 1f0bca4 + 1f0c06c: e1d500b0 ldrh r0, [r5] + 1f0c070: e2888001 add r8, r8, #1 + 1f0c074: e3500000 cmp r0, #0 + 1f0c078: e6ef8078 uxtb r8, r8 + 1f0c07c: 1affff67 bne 1f0be20 + 1f0c080: e5c76023 strb r6, [r7, #35] ; 0x23 + 1f0c084: e5c78001 strb r8, [r7, #1] + 1f0c088: eafffd44 b 1f0b5a0 + 1f0c08c: e586b044 str fp, [r6, #68] ; 0x44 + 1f0c090: e6efe077 uxtb lr, r7 + 1f0c094: e3a0200d mov r2, #13 + 1f0c098: e24e0001 sub r0, lr, #1 + 1f0c09c: e5943034 ldr r3, [r4, #52] ; 0x34 + 1f0c0a0: e596c00c ldr ip, [r6, #12] + 1f0c0a4: e30f1ffd movw r1, #65533 ; 0xfffd + 1f0c0a8: e0000092 mul r0, r2, r0 + 1f0c0ac: e5dd2004 ldrb r2, [sp, #4] + 1f0c0b0: e5c3200d strb r2, [r3, #13] + 1f0c0b4: e2808001 add r8, r0, #1 + 1f0c0b8: e3a0200f mov r2, #15 + 1f0c0bc: e1a00080 lsl r0, r0, #1 + 1f0c0c0: e5c3200b strb r2, [r3, #11] + 1f0c0c4: e59d200c ldr r2, [sp, #12] + 1f0c0c8: e5c3200c strb r2, [r3, #12] + 1f0c0cc: e5c3201a strb r2, [r3, #26] + 1f0c0d0: e5c3201b strb r2, [r3, #27] + 1f0c0d4: e19c20b0 ldrh r2, [ip, r0] + 1f0c0d8: e5c32001 strb r2, [r3, #1] + 1f0c0dc: e2429001 sub r9, r2, #1 + 1f0c0e0: e1a02442 asr r2, r2, #8 + 1f0c0e4: e5c32002 strb r2, [r3, #2] + 1f0c0e8: e6ff2079 uxth r2, r9 + 1f0c0ec: e1520001 cmp r2, r1 + 1f0c0f0: 8a000093 bhi 1f0c344 + 1f0c0f4: e1a02088 lsl r2, r8, #1 + 1f0c0f8: e19c80b2 ldrh r8, [ip, r2] + 1f0c0fc: e5c38003 strb r8, [r3, #3] + 1f0c100: e2489001 sub r9, r8, #1 + 1f0c104: e1a08448 asr r8, r8, #8 + 1f0c108: e5c38004 strb r8, [r3, #4] + 1f0c10c: e6ff8079 uxth r8, r9 + 1f0c110: e1580001 cmp r8, r1 + 1f0c114: 9a00002b bls 1f0c1c8 + 1f0c118: e3e02000 mvn r2, #0 + 1f0c11c: e5c32005 strb r2, [r3, #5] + 1f0c120: e5c32006 strb r2, [r3, #6] + 1f0c124: e3e02000 mvn r2, #0 + 1f0c128: e5c32007 strb r2, [r3, #7] + 1f0c12c: e5c32008 strb r2, [r3, #8] + 1f0c130: e3e02000 mvn r2, #0 + 1f0c134: e5c32009 strb r2, [r3, #9] + 1f0c138: e5c3200a strb r2, [r3, #10] + 1f0c13c: e3e02000 mvn r2, #0 + 1f0c140: e5c3200e strb r2, [r3, #14] + 1f0c144: e5c3200f strb r2, [r3, #15] + 1f0c148: e3e02000 mvn r2, #0 + 1f0c14c: e5c32010 strb r2, [r3, #16] + 1f0c150: e5c32011 strb r2, [r3, #17] + 1f0c154: e3e02000 mvn r2, #0 + 1f0c158: e5c32012 strb r2, [r3, #18] + 1f0c15c: e5c32013 strb r2, [r3, #19] + 1f0c160: e3e02000 mvn r2, #0 + 1f0c164: e5c32014 strb r2, [r3, #20] + 1f0c168: e5c32015 strb r2, [r3, #21] + 1f0c16c: e3e02000 mvn r2, #0 + 1f0c170: e5c32016 strb r2, [r3, #22] + 1f0c174: e5c32017 strb r2, [r3, #23] + 1f0c178: e3e02000 mvn r2, #0 + 1f0c17c: e5c32018 strb r2, [r3, #24] + 1f0c180: e5c32019 strb r2, [r3, #25] + 1f0c184: e3e02000 mvn r2, #0 + 1f0c188: e5c3201c strb r2, [r3, #28] + 1f0c18c: e5c3201d strb r2, [r3, #29] + 1f0c190: e3e02000 mvn r2, #0 + 1f0c194: e5c3201e strb r2, [r3, #30] + 1f0c198: e5c3201f strb r2, [r3, #31] + 1f0c19c: e38ee040 orr lr, lr, #64 ; 0x40 + 1f0c1a0: e5c3e000 strb lr, [r3] + 1f0c1a4: e1a00004 mov r0, r4 + 1f0c1a8: e3a03001 mov r3, #1 + 1f0c1ac: e5c63003 strb r3, [r6, #3] + 1f0c1b0: ebffeff1 bl 1f0817c + 1f0c1b4: e3500000 cmp r0, #0 + 1f0c1b8: 1afffcf8 bne 1f0b5a0 + 1f0c1bc: e2577001 subs r7, r7, #1 + 1f0c1c0: 1afffd3a bne 1f0b6b0 + 1f0c1c4: eafffdba b 1f0b8b4 + 1f0c1c8: e08c2002 add r2, ip, r2 + 1f0c1cc: e1d280b2 ldrh r8, [r2, #2] + 1f0c1d0: e5c38005 strb r8, [r3, #5] + 1f0c1d4: e2489001 sub r9, r8, #1 + 1f0c1d8: e1a08448 asr r8, r8, #8 + 1f0c1dc: e5c38006 strb r8, [r3, #6] + 1f0c1e0: e6ff8079 uxth r8, r9 + 1f0c1e4: e1580001 cmp r8, r1 + 1f0c1e8: 8affffcd bhi 1f0c124 + 1f0c1ec: e1d280b4 ldrh r8, [r2, #4] + 1f0c1f0: e5c38007 strb r8, [r3, #7] + 1f0c1f4: e2489001 sub r9, r8, #1 + 1f0c1f8: e1a08448 asr r8, r8, #8 + 1f0c1fc: e5c38008 strb r8, [r3, #8] + 1f0c200: e6ff8079 uxth r8, r9 + 1f0c204: e1580001 cmp r8, r1 + 1f0c208: 8affffc8 bhi 1f0c130 + 1f0c20c: e1d280b6 ldrh r8, [r2, #6] + 1f0c210: e5c38009 strb r8, [r3, #9] + 1f0c214: e2489001 sub r9, r8, #1 + 1f0c218: e1a08448 asr r8, r8, #8 + 1f0c21c: e5c3800a strb r8, [r3, #10] + 1f0c220: e6ff8079 uxth r8, r9 + 1f0c224: e1580001 cmp r8, r1 + 1f0c228: 8affffc3 bhi 1f0c13c + 1f0c22c: e1d280b8 ldrh r8, [r2, #8] + 1f0c230: e5c3800e strb r8, [r3, #14] + 1f0c234: e2489001 sub r9, r8, #1 + 1f0c238: e1a08448 asr r8, r8, #8 + 1f0c23c: e5c3800f strb r8, [r3, #15] + 1f0c240: e6ff8079 uxth r8, r9 + 1f0c244: e1580001 cmp r8, r1 + 1f0c248: 8affffbe bhi 1f0c148 + 1f0c24c: e1d280ba ldrh r8, [r2, #10] + 1f0c250: e5c38010 strb r8, [r3, #16] + 1f0c254: e2489001 sub r9, r8, #1 + 1f0c258: e1a08448 asr r8, r8, #8 + 1f0c25c: e5c38011 strb r8, [r3, #17] + 1f0c260: e6ff8079 uxth r8, r9 + 1f0c264: e1580001 cmp r8, r1 + 1f0c268: 8affffb9 bhi 1f0c154 + 1f0c26c: e1d280bc ldrh r8, [r2, #12] + 1f0c270: e5c38012 strb r8, [r3, #18] + 1f0c274: e2489001 sub r9, r8, #1 + 1f0c278: e1a08448 asr r8, r8, #8 + 1f0c27c: e5c38013 strb r8, [r3, #19] + 1f0c280: e6ff8079 uxth r8, r9 + 1f0c284: e1580001 cmp r8, r1 + 1f0c288: 8affffb4 bhi 1f0c160 + 1f0c28c: e1d280be ldrh r8, [r2, #14] + 1f0c290: e5c38014 strb r8, [r3, #20] + 1f0c294: e2489001 sub r9, r8, #1 + 1f0c298: e1a08448 asr r8, r8, #8 + 1f0c29c: e5c38015 strb r8, [r3, #21] + 1f0c2a0: e6ff8079 uxth r8, r9 + 1f0c2a4: e1580001 cmp r8, r1 + 1f0c2a8: 8affffaf bhi 1f0c16c + 1f0c2ac: e1d281b0 ldrh r8, [r2, #16] + 1f0c2b0: e5c38016 strb r8, [r3, #22] + 1f0c2b4: e2489001 sub r9, r8, #1 + 1f0c2b8: e1a08448 asr r8, r8, #8 + 1f0c2bc: e5c38017 strb r8, [r3, #23] + 1f0c2c0: e6ff8079 uxth r8, r9 + 1f0c2c4: e1580001 cmp r8, r1 + 1f0c2c8: 8affffaa bhi 1f0c178 + 1f0c2cc: e1d211b2 ldrh r1, [r2, #18] + 1f0c2d0: e30f8ffd movw r8, #65533 ; 0xfffd + 1f0c2d4: e5c31018 strb r1, [r3, #24] + 1f0c2d8: e2419001 sub r9, r1, #1 + 1f0c2dc: e1a01441 asr r1, r1, #8 + 1f0c2e0: e5c31019 strb r1, [r3, #25] + 1f0c2e4: e6ff1079 uxth r1, r9 + 1f0c2e8: e1510008 cmp r1, r8 + 1f0c2ec: 8affffa4 bhi 1f0c184 + 1f0c2f0: e1d211b4 ldrh r1, [r2, #20] + 1f0c2f4: e5c3101c strb r1, [r3, #28] + 1f0c2f8: e2419001 sub r9, r1, #1 + 1f0c2fc: e1a01441 asr r1, r1, #8 + 1f0c300: e5c3101d strb r1, [r3, #29] + 1f0c304: e6ff1079 uxth r1, r9 + 1f0c308: e1510008 cmp r1, r8 + 1f0c30c: 8affff9f bhi 1f0c190 + 1f0c310: e1d221b6 ldrh r2, [r2, #22] + 1f0c314: e5c3201e strb r2, [r3, #30] + 1f0c318: e2421001 sub r1, r2, #1 + 1f0c31c: e1a02442 asr r2, r2, #8 + 1f0c320: e5c3201f strb r2, [r3, #31] + 1f0c324: e6ff2071 uxth r2, r1 + 1f0c328: e1520008 cmp r2, r8 + 1f0c32c: 8affff9a bhi 1f0c19c + 1f0c330: e08c0000 add r0, ip, r0 + 1f0c334: e1d021ba ldrh r2, [r0, #26] + 1f0c338: e3520000 cmp r2, #0 + 1f0c33c: 0affff96 beq 1f0c19c + 1f0c340: eaffff96 b 1f0c1a0 + 1f0c344: e3e02000 mvn r2, #0 + 1f0c348: e5c32003 strb r2, [r3, #3] + 1f0c34c: e5c32004 strb r2, [r3, #4] + 1f0c350: eaffff70 b 1f0c118 + 1f0c354: e3a03001 mov r3, #1 + 1f0c358: e1a01009 mov r1, r9 + 1f0c35c: e1a02008 mov r2, r8 + 1f0c360: e5d60001 ldrb r0, [r6, #1] + 1f0c364: eb0068f7 bl 1f26748 + 1f0c368: e3500000 cmp r0, #0 + 1f0c36c: 1a000014 bne 1f0c3c4 + 1f0c370: e5962038 ldr r2, [r6, #56] ; 0x38 + 1f0c374: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f0c378: e0622008 rsb r2, r2, r8 + 1f0c37c: e5c60003 strb r0, [r6, #3] + 1f0c380: e1520003 cmp r2, r3 + 1f0c384: 2afffcd1 bcs 1f0b6d0 + 1f0c388: e5d6a002 ldrb sl, [r6, #2] + 1f0c38c: e35a0001 cmp sl, #1 + 1f0c390: 8a000001 bhi 1f0c39c + 1f0c394: eafffccd b 1f0b6d0 + 1f0c398: e5963030 ldr r3, [r6, #48] ; 0x30 + 1f0c39c: e0888003 add r8, r8, r3 + 1f0c3a0: e24aa001 sub sl, sl, #1 + 1f0c3a4: e1a02008 mov r2, r8 + 1f0c3a8: e3a03001 mov r3, #1 + 1f0c3ac: e1a01009 mov r1, r9 + 1f0c3b0: e5d60001 ldrb r0, [r6, #1] + 1f0c3b4: eb0068e3 bl 1f26748 + 1f0c3b8: e35a0001 cmp sl, #1 + 1f0c3bc: 1afffff5 bne 1f0c398 + 1f0c3c0: eafffcc2 b 1f0b6d0 + 1f0c3c4: e3a00001 mov r0, #1 + 1f0c3c8: eafffc74 b 1f0b5a0 + 1f0c3cc: e5947018 ldr r7, [r4, #24] + 1f0c3d0: e3570000 cmp r7, #0 + 1f0c3d4: 0a00001d beq 1f0c450 + 1f0c3d8: e3510001 cmp r1, #1 + 1f0c3dc: e5940000 ldr r0, [r4] + 1f0c3e0: e2815001 add r5, r1, #1 + 1f0c3e4: 8a000005 bhi 1f0c400 + 1f0c3e8: e3a00002 mov r0, #2 + 1f0c3ec: eafffc6b b 1f0b5a0 + 1f0c3f0: e3a02012 mov r2, #18 + 1f0c3f4: eafffd7f b 1f0b9f8 + 1f0c3f8: e3a02013 mov r2, #19 + 1f0c3fc: eafffd7d b 1f0b9f8 + 1f0c400: e590302c ldr r3, [r0, #44] ; 0x2c + 1f0c404: e1510003 cmp r1, r3 + 1f0c408: 2afffff6 bcs 1f0c3e8 + 1f0c40c: e0817007 add r7, r1, r7 + 1f0c410: e1a02005 mov r2, r5 + 1f0c414: e2451001 sub r1, r5, #1 + 1f0c418: ebffe860 bl 1f065a0 + 1f0c41c: e3500000 cmp r0, #0 + 1f0c420: 1afffc5e bne 1f0b5a0 + 1f0c424: e1550007 cmp r5, r7 + 1f0c428: 0a000008 beq 1f0c450 + 1f0c42c: e3550001 cmp r5, #1 + 1f0c430: 9affffec bls 1f0c3e8 + 1f0c434: e5940000 ldr r0, [r4] + 1f0c438: e2853001 add r3, r5, #1 + 1f0c43c: e590202c ldr r2, [r0, #44] ; 0x2c + 1f0c440: e1520005 cmp r2, r5 + 1f0c444: 9affffe7 bls 1f0c3e8 + 1f0c448: e1a05003 mov r5, r3 + 1f0c44c: eaffffef b 1f0c410 + 1f0c450: e3a03000 mov r3, #0 + 1f0c454: e5c43007 strb r3, [r4, #7] + 1f0c458: eafffd89 b 1f0ba84 + 1f0c45c: e3a02014 mov r2, #20 + 1f0c460: eafffd64 b 1f0b9f8 + 1f0c464: e3a02015 mov r2, #21 + 1f0c468: eafffd62 b 1f0b9f8 + 1f0c46c: e3a02016 mov r2, #22 + 1f0c470: eafffd60 b 1f0b9f8 + 1f0c474: e3a02017 mov r2, #23 + 1f0c478: eafffd5e b 1f0b9f8 + 1f0c47c: e3a02018 mov r2, #24 + 1f0c480: eafffd5c b 1f0b9f8 + 1f0c484: e3a02019 mov r2, #25 + 1f0c488: eafffd5a b 1f0b9f8 + 1f0c48c: e3a0201a mov r2, #26 + 1f0c490: eafffd58 b 1f0b9f8 + 1f0c494: e3a0201b mov r2, #27 + 1f0c498: eafffd56 b 1f0b9f8 + 1f0c49c: e3a0201c mov r2, #28 + 1f0c4a0: eafffd54 b 1f0b9f8 + 1f0c4a4: e3a0201d mov r2, #29 + 1f0c4a8: eafffd52 b 1f0b9f8 + 1f0c4ac: e3a0201e mov r2, #30 + 1f0c4b0: eafffd50 b 1f0b9f8 + 1f0c4b4: e3a0201f mov r2, #31 + 1f0c4b8: eafffd4e b 1f0b9f8 + 1f0c4bc: e3a0303f mov r3, #63 ; 0x3f + 1f0c4c0: eafffdf4 b 1f0bc98 + 1f0c4c4: e5d42038 ldrb r2, [r4, #56] ; 0x38 + 1f0c4c8: e5c32000 strb r2, [r3] + 1f0c4cc: e5d42039 ldrb r2, [r4, #57] ; 0x39 + 1f0c4d0: e5c32001 strb r2, [r3, #1] + 1f0c4d4: e5d4203a ldrb r2, [r4, #58] ; 0x3a + 1f0c4d8: e5c32002 strb r2, [r3, #2] + 1f0c4dc: e5d4203b ldrb r2, [r4, #59] ; 0x3b + 1f0c4e0: e5c32003 strb r2, [r3, #3] + 1f0c4e4: e5d4203c ldrb r2, [r4, #60] ; 0x3c + 1f0c4e8: e5c32004 strb r2, [r3, #4] + 1f0c4ec: e5d4203d ldrb r2, [r4, #61] ; 0x3d + 1f0c4f0: e5c32005 strb r2, [r3, #5] + 1f0c4f4: e5d4203e ldrb r2, [r4, #62] ; 0x3e + 1f0c4f8: e5c32006 strb r2, [r3, #6] + 1f0c4fc: e5d4203f ldrb r2, [r4, #63] ; 0x3f + 1f0c500: e5c32007 strb r2, [r3, #7] + 1f0c504: eafffea8 b 1f0bfac + 1f0c508: e3a0303d mov r3, #61 ; 0x3d + 1f0c50c: eafffde1 b 1f0bc98 + 1f0c510: e3a0303e mov r3, #62 ; 0x3e + 1f0c514: eafffddf b 1f0bc98 + 1f0c518: e1a0200e mov r2, lr + 1f0c51c: e1a0100e mov r1, lr + 1f0c520: eafffe35 b 1f0bdfc + 1f0c524: e3a03032 mov r3, #50 ; 0x32 + 1f0c528: eafffdda b 1f0bc98 + 1f0c52c: e3a03033 mov r3, #51 ; 0x33 + 1f0c530: eafffdd8 b 1f0bc98 + 1f0c534: e3a03034 mov r3, #52 ; 0x34 + 1f0c538: eafffdd6 b 1f0bc98 + 1f0c53c: e3a03035 mov r3, #53 ; 0x35 + 1f0c540: eafffdd4 b 1f0bc98 + 1f0c544: e3a03036 mov r3, #54 ; 0x36 + 1f0c548: eafffdd2 b 1f0bc98 + 1f0c54c: e3a03037 mov r3, #55 ; 0x37 + 1f0c550: eafffdd0 b 1f0bc98 + 1f0c554: e3a03038 mov r3, #56 ; 0x38 + 1f0c558: eafffdce b 1f0bc98 + 1f0c55c: e3a03039 mov r3, #57 ; 0x39 + 1f0c560: eafffdcc b 1f0bc98 + 1f0c564: e3a0303a mov r3, #58 ; 0x3a + 1f0c568: eafffdca b 1f0bc98 + 1f0c56c: e3a0303b mov r3, #59 ; 0x3b + 1f0c570: eafffdc8 b 1f0bc98 + 1f0c574: e3a0303c mov r3, #60 ; 0x3c + 1f0c578: eafffdc6 b 1f0bc98 + +01f0c57c : + 1f0c57c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f0c580: e1a09001 mov r9, r1 + 1f0c584: e1a08000 mov r8, r0 + 1f0c588: e1d130d0 ldrsb r3, [r1] + 1f0c58c: e24dd054 sub sp, sp, #84 ; 0x54 + 1f0c590: e5904000 ldr r4, [r0] + 1f0c594: e353002f cmp r3, #47 ; 0x2f + 1f0c598: 1353005c cmpne r3, #92 ; 0x5c + 1f0c59c: 0a00001b beq 1f0c610 + 1f0c5a0: e594301c ldr r3, [r4, #28] + 1f0c5a4: e5803008 str r3, [r0, #8] + 1f0c5a8: e5d42000 ldrb r2, [r4] + 1f0c5ac: e3520004 cmp r2, #4 + 1f0c5b0: 1a00001c bne 1f0c628 + 1f0c5b4: e3530000 cmp r3, #0 + 1f0c5b8: 0a00001a beq 1f0c628 + 1f0c5bc: e5943028 ldr r3, [r4, #40] ; 0x28 + 1f0c5c0: e1a0000d mov r0, sp + 1f0c5c4: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f0c5c8: e594c020 ldr ip, [r4, #32] + 1f0c5cc: e1a01003 mov r1, r3 + 1f0c5d0: e5882020 str r2, [r8, #32] + 1f0c5d4: e3c2e0ff bic lr, r2, #255 ; 0xff + 1f0c5d8: e5883024 str r3, [r8, #36] ; 0x24 + 1f0c5dc: e588c01c str ip, [r8, #28] + 1f0c5e0: e5cd2007 strb r2, [sp, #7] + 1f0c5e4: e3a02000 mov r2, #0 + 1f0c5e8: e58d3044 str r3, [sp, #68] ; 0x44 + 1f0c5ec: e58d4000 str r4, [sp] + 1f0c5f0: e58de010 str lr, [sp, #16] + 1f0c5f4: e58dc008 str ip, [sp, #8] + 1f0c5f8: e58d2014 str r2, [sp, #20] + 1f0c5fc: ebffef1d bl 1f08278 + 1f0c600: e2503000 subs r3, r0, #0 + 1f0c604: 0a00017e beq 1f0cc04 + 1f0c608: e1a00003 mov r0, r3 + 1f0c60c: ea000033 b 1f0c6e0 + 1f0c610: e1f930d1 ldrsb r3, [r9, #1]! + 1f0c614: e353002f cmp r3, #47 ; 0x2f + 1f0c618: 1353005c cmpne r3, #92 ; 0x5c + 1f0c61c: 0afffffb beq 1f0c610 + 1f0c620: e3a03000 mov r3, #0 + 1f0c624: e5883008 str r3, [r8, #8] + 1f0c628: e1d930d0 ldrsb r3, [r9] + 1f0c62c: e6ef2073 uxtb r2, r3 + 1f0c630: e352001f cmp r2, #31 + 1f0c634: 9a00015e bls 1f0cbb4 + 1f0c638: e30e5fa0 movw r5, #61344 ; 0xefa0 + 1f0c63c: e34051f5 movt r5, #501 ; 0x1f5 + 1f0c640: e6ff3073 uxth r3, r3 + 1f0c644: e5982000 ldr r2, [r8] + 1f0c648: e353001f cmp r3, #31 + 1f0c64c: e592c00c ldr ip, [r2, #12] + 1f0c650: 9a000024 bls 1f0c6e8 + 1f0c654: e353002f cmp r3, #47 ; 0x2f + 1f0c658: 1353005c cmpne r3, #92 ; 0x5c + 1f0c65c: 0a000040 beq 1f0c764 + 1f0c660: e21330ff ands r3, r3, #255 ; 0xff + 1f0c664: 0a00001c beq 1f0c6dc + 1f0c668: e24c6002 sub r6, ip, #2 + 1f0c66c: e1a0e009 mov lr, r9 + 1f0c670: e3a00001 mov r0, #1 + 1f0c674: e353007f cmp r3, #127 ; 0x7f + 1f0c678: 8a000009 bhi 1f0c6a4 + 1f0c67c: e3530022 cmp r3, #34 ; 0x22 + 1f0c680: 0a000015 beq 1f0c6dc + 1f0c684: e30f102c movw r1, #61484 ; 0xf02c + 1f0c688: e34011f5 movt r1, #501 ; 0x1f5 + 1f0c68c: ea000001 b 1f0c698 + 1f0c690: e1530002 cmp r3, r2 + 1f0c694: 0a000010 beq 1f0c6dc + 1f0c698: e1f120d1 ldrsb r2, [r1, #1]! + 1f0c69c: e3520000 cmp r2, #0 + 1f0c6a0: 1afffffa bne 1f0c690 + 1f0c6a4: e1e630b2 strh r3, [r6, #2]! + 1f0c6a8: e2802001 add r2, r0, #1 + 1f0c6ac: e1fe30d1 ldrsb r3, [lr, #1]! + 1f0c6b0: e6ff3073 uxth r3, r3 + 1f0c6b4: e353001f cmp r3, #31 + 1f0c6b8: 9a00000c bls 1f0c6f0 + 1f0c6bc: e353005c cmp r3, #92 ; 0x5c + 1f0c6c0: 1353002f cmpne r3, #47 ; 0x2f + 1f0c6c4: 0a000028 beq 1f0c76c + 1f0c6c8: e3520c01 cmp r2, #256 ; 0x100 + 1f0c6cc: 0a000002 beq 1f0c6dc + 1f0c6d0: e21330ff ands r3, r3, #255 ; 0xff + 1f0c6d4: 11a00002 movne r0, r2 + 1f0c6d8: 1affffe5 bne 1f0c674 + 1f0c6dc: e3a00006 mov r0, #6 + 1f0c6e0: e28dd054 add sp, sp, #84 ; 0x54 + 1f0c6e4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0c6e8: e3a00000 mov r0, #0 + 1f0c6ec: e3a02001 mov r2, #1 + 1f0c6f0: e3500001 cmp r0, #1 + 1f0c6f4: e0899002 add r9, r9, r2 + 1f0c6f8: e3a03024 mov r3, #36 ; 0x24 + 1f0c6fc: e3a0e004 mov lr, #4 + 1f0c700: 0a000029 beq 1f0c7ac + 1f0c704: e3500002 cmp r0, #2 + 1f0c708: 0a000113 beq 1f0cb5c + 1f0c70c: e3500000 cmp r0, #0 + 1f0c710: 0a00000e beq 1f0c750 + 1f0c714: e2403106 sub r3, r0, #-2147483647 ; 0x80000001 + 1f0c718: e1a03083 lsl r3, r3, #1 + 1f0c71c: e19c30b3 ldrh r3, [ip, r3] + 1f0c720: e3530020 cmp r3, #32 + 1f0c724: 1353002e cmpne r3, #46 ; 0x2e + 1f0c728: 02402106 subeq r2, r0, #-2147483647 ; 0x80000001 + 1f0c72c: 008c2082 addeq r2, ip, r2, lsl #1 + 1f0c730: 0a000004 beq 1f0c748 + 1f0c734: ea000031 b 1f0c800 + 1f0c738: e17230b2 ldrh r3, [r2, #-2]! + 1f0c73c: e3530020 cmp r3, #32 + 1f0c740: 1353002e cmpne r3, #46 ; 0x2e + 1f0c744: 1a00002d bne 1f0c800 + 1f0c748: e2500001 subs r0, r0, #1 + 1f0c74c: 1afffff9 bne 1f0c738 + 1f0c750: e3a03000 mov r3, #0 + 1f0c754: e3a00006 mov r0, #6 + 1f0c758: e1cc30b0 strh r3, [ip] + 1f0c75c: e28dd054 add sp, sp, #84 ; 0x54 + 1f0c760: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0c764: e3a00000 mov r0, #0 + 1f0c768: e3a02001 mov r2, #1 + 1f0c76c: e19930d2 ldrsb r3, [r9, r2] + 1f0c770: e0891002 add r1, r9, r2 + 1f0c774: e353002f cmp r3, #47 ; 0x2f + 1f0c778: 1353005c cmpne r3, #92 ; 0x5c + 1f0c77c: 1a000112 bne 1f0cbcc + 1f0c780: e2823001 add r3, r2, #1 + 1f0c784: e0893003 add r3, r9, r3 + 1f0c788: e1a09003 mov r9, r3 + 1f0c78c: e0d320d1 ldrsb r2, [r3], #1 + 1f0c790: e352002f cmp r2, #47 ; 0x2f + 1f0c794: 1352005c cmpne r2, #92 ; 0x5c + 1f0c798: 0afffffa beq 1f0c788 + 1f0c79c: e3a03020 mov r3, #32 + 1f0c7a0: e3a0e000 mov lr, #0 + 1f0c7a4: e3500001 cmp r0, #1 + 1f0c7a8: 1affffd5 bne 1f0c704 + 1f0c7ac: e1dc20b0 ldrh r2, [ip] + 1f0c7b0: e352002e cmp r2, #46 ; 0x2e + 1f0c7b4: 13a03000 movne r3, #0 + 1f0c7b8: 1affffd7 bne 1f0c71c + 1f0c7bc: e3a01000 mov r1, #0 + 1f0c7c0: e1cc10b2 strh r1, [ip, #2] + 1f0c7c4: e3a01020 mov r1, #32 + 1f0c7c8: e5c82038 strb r2, [r8, #56] ; 0x38 + 1f0c7cc: e5c81039 strb r1, [r8, #57] ; 0x39 + 1f0c7d0: e5c83043 strb r3, [r8, #67] ; 0x43 + 1f0c7d4: e3a03020 mov r3, #32 + 1f0c7d8: e5c8303a strb r3, [r8, #58] ; 0x3a + 1f0c7dc: e5c8303b strb r3, [r8, #59] ; 0x3b + 1f0c7e0: e5c8303c strb r3, [r8, #60] ; 0x3c + 1f0c7e4: e5c8303d strb r3, [r8, #61] ; 0x3d + 1f0c7e8: e5c8303e strb r3, [r8, #62] ; 0x3e + 1f0c7ec: e5c8303f strb r3, [r8, #63] ; 0x3f + 1f0c7f0: e5c83040 strb r3, [r8, #64] ; 0x40 + 1f0c7f4: e5c83041 strb r3, [r8, #65] ; 0x41 + 1f0c7f8: e5c83042 strb r3, [r8, #66] ; 0x42 + 1f0c7fc: ea00007f b 1f0ca00 + 1f0c800: e1a06080 lsl r6, r0, #1 + 1f0c804: e3a03020 mov r3, #32 + 1f0c808: e3a02000 mov r2, #0 + 1f0c80c: e08c1006 add r1, ip, r6 + 1f0c810: e18c20b6 strh r2, [ip, r6] + 1f0c814: e5c83038 strb r3, [r8, #56] ; 0x38 + 1f0c818: e5c83039 strb r3, [r8, #57] ; 0x39 + 1f0c81c: e5c8303a strb r3, [r8, #58] ; 0x3a + 1f0c820: e5c8303b strb r3, [r8, #59] ; 0x3b + 1f0c824: e5c8303c strb r3, [r8, #60] ; 0x3c + 1f0c828: e5c8303d strb r3, [r8, #61] ; 0x3d + 1f0c82c: e5c8303e strb r3, [r8, #62] ; 0x3e + 1f0c830: e5c8303f strb r3, [r8, #63] ; 0x3f + 1f0c834: e5c83040 strb r3, [r8, #64] ; 0x40 + 1f0c838: e5c83041 strb r3, [r8, #65] ; 0x41 + 1f0c83c: e5c83042 strb r3, [r8, #66] ; 0x42 + 1f0c840: e1dc30b0 ldrh r3, [ip] + 1f0c844: e353002e cmp r3, #46 ; 0x2e + 1f0c848: 13530020 cmpne r3, #32 + 1f0c84c: 13a06000 movne r6, #0 + 1f0c850: 03a06001 moveq r6, #1 + 1f0c854: 11a02006 movne r2, r6 + 1f0c858: 1a00000b bne 1f0c88c + 1f0c85c: e1a0600c mov r6, ip + 1f0c860: e1f630b2 ldrh r3, [r6, #2]! + 1f0c864: e2822001 add r2, r2, #1 + 1f0c868: e353002e cmp r3, #46 ; 0x2e + 1f0c86c: 13530020 cmpne r3, #32 + 1f0c870: 0afffffa beq 1f0c860 + 1f0c874: e17160b2 ldrh r6, [r1, #-2]! + 1f0c878: e38ee003 orr lr, lr, #3 + 1f0c87c: e356002e cmp r6, #46 ; 0x2e + 1f0c880: 0a000004 beq 1f0c898 + 1f0c884: e2500001 subs r0, r0, #1 + 1f0c888: 0a000002 beq 1f0c898 + 1f0c88c: e17160b2 ldrh r6, [r1, #-2]! + 1f0c890: e356002e cmp r6, #46 ; 0x2e + 1f0c894: 1afffffa bne 1f0c884 + 1f0c898: e3a07000 mov r7, #0 + 1f0c89c: e3a0b008 mov fp, #8 + 1f0c8a0: e1a0a007 mov sl, r7 + 1f0c8a4: ea00000f b 1f0c8e8 + 1f0c8a8: e1520000 cmp r2, r0 + 1f0c8ac: 1157000b cmpne r7, fp + 1f0c8b0: 3a00001a bcc 1f0c920 + 1f0c8b4: e35b000b cmp fp, #11 + 1f0c8b8: 0a0000ae beq 1f0cb78 + 1f0c8bc: e1520000 cmp r2, r0 + 1f0c8c0: 0a000001 beq 1f0c8cc + 1f0c8c4: e38ee003 orr lr, lr, #3 + 1f0c8c8: 8a000038 bhi 1f0c9b0 + 1f0c8cc: e1a0a10a lsl sl, sl, #2 + 1f0c8d0: e1a02000 mov r2, r0 + 1f0c8d4: e3a0b00b mov fp, #11 + 1f0c8d8: e3a07008 mov r7, #8 + 1f0c8dc: e6efa07a uxtb sl, sl + 1f0c8e0: e1a03082 lsl r3, r2, #1 + 1f0c8e4: e19c30b3 ldrh r3, [ip, r3] + 1f0c8e8: e3530000 cmp r3, #0 + 1f0c8ec: e2822001 add r2, r2, #1 + 1f0c8f0: 0a00002e beq 1f0c9b0 + 1f0c8f4: e3530020 cmp r3, #32 + 1f0c8f8: 0a000006 beq 1f0c918 + 1f0c8fc: e243102e sub r1, r3, #46 ; 0x2e + 1f0c900: e1520000 cmp r2, r0 + 1f0c904: e16f1f11 clz r1, r1 + 1f0c908: e1a012a1 lsr r1, r1, #5 + 1f0c90c: 03a01000 moveq r1, #0 + 1f0c910: e3510000 cmp r1, #0 + 1f0c914: 0affffe3 beq 1f0c8a8 + 1f0c918: e38ee003 orr lr, lr, #3 + 1f0c91c: eaffffef b 1f0c8e0 + 1f0c920: e353007f cmp r3, #127 ; 0x7f + 1f0c924: 9a00000a bls 1f0c954 + 1f0c928: e0853003 add r3, r5, r3 + 1f0c92c: e38ee002 orr lr, lr, #2 + 1f0c930: e5533080 ldrb r3, [r3, #-128] ; 0xffffff80 + 1f0c934: e3530000 cmp r3, #0 + 1f0c938: 1a000005 bne 1f0c954 + 1f0c93c: e38ee003 orr lr, lr, #3 + 1f0c940: e3a0305f mov r3, #95 ; 0x5f + 1f0c944: e0881007 add r1, r8, r7 + 1f0c948: e2877001 add r7, r7, #1 + 1f0c94c: e5c13038 strb r3, [r1, #56] ; 0x38 + 1f0c950: eaffffe2 b 1f0c8e0 + 1f0c954: e353002b cmp r3, #43 ; 0x2b + 1f0c958: 0afffff7 beq 1f0c93c + 1f0c95c: e30f6038 movw r6, #61496 ; 0xf038 + 1f0c960: e34061f5 movt r6, #501 ; 0x1f5 + 1f0c964: ea000001 b 1f0c970 + 1f0c968: e1510003 cmp r1, r3 + 1f0c96c: 0afffff2 beq 1f0c93c + 1f0c970: e1f610d1 ldrsb r1, [r6, #1]! + 1f0c974: e3510000 cmp r1, #0 + 1f0c978: 1afffffa bne 1f0c968 + 1f0c97c: e2431041 sub r1, r3, #65 ; 0x41 + 1f0c980: e6ff1071 uxth r1, r1 + 1f0c984: e3510019 cmp r1, #25 + 1f0c988: 938aa002 orrls sl, sl, #2 + 1f0c98c: 96ef3073 uxtbls r3, r3 + 1f0c990: 9affffeb bls 1f0c944 + 1f0c994: e2431061 sub r1, r3, #97 ; 0x61 + 1f0c998: e6ff1071 uxth r1, r1 + 1f0c99c: e3510019 cmp r1, #25 + 1f0c9a0: 92433020 subls r3, r3, #32 + 1f0c9a4: 938aa001 orrls sl, sl, #1 + 1f0c9a8: e6ef3073 uxtb r3, r3 + 1f0c9ac: eaffffe4 b 1f0c944 + 1f0c9b0: e5d83038 ldrb r3, [r8, #56] ; 0x38 + 1f0c9b4: e35300e5 cmp r3, #229 ; 0xe5 + 1f0c9b8: 0a000072 beq 1f0cb88 + 1f0c9bc: e35b0008 cmp fp, #8 + 1f0c9c0: 01a0a10a lsleq sl, sl, #2 + 1f0c9c4: 06efa07a uxtbeq sl, sl + 1f0c9c8: e20a300c and r3, sl, #12 + 1f0c9cc: e353000c cmp r3, #12 + 1f0c9d0: 0a000066 beq 1f0cb70 + 1f0c9d4: e20a2003 and r2, sl, #3 + 1f0c9d8: e3520003 cmp r2, #3 + 1f0c9dc: 0a000063 beq 1f0cb70 + 1f0c9e0: e31e0002 tst lr, #2 + 1f0c9e4: 1a000004 bne 1f0c9fc + 1f0c9e8: e20aa003 and sl, sl, #3 + 1f0c9ec: e35a0001 cmp sl, #1 + 1f0c9f0: 038ee010 orreq lr, lr, #16 + 1f0c9f4: e3530004 cmp r3, #4 + 1f0c9f8: 038ee008 orreq lr, lr, #8 + 1f0c9fc: e5c8e043 strb lr, [r8, #67] ; 0x43 + 1f0ca00: e1a00008 mov r0, r8 + 1f0ca04: ebfff85b bl 1f0ab78 + 1f0ca08: e3500000 cmp r0, #0 + 1f0ca0c: e5d83043 ldrb r3, [r8, #67] ; 0x43 + 1f0ca10: 0a000007 beq 1f0ca34 + 1f0ca14: e3500004 cmp r0, #4 + 1f0ca18: 1affff30 bne 1f0c6e0 + 1f0ca1c: e3130020 tst r3, #32 + 1f0ca20: 0a000073 beq 1f0cbf4 + 1f0ca24: e3130004 tst r3, #4 + 1f0ca28: 1a00006b bne 1f0cbdc + 1f0ca2c: e1d930d0 ldrsb r3, [r9] + 1f0ca30: eaffff02 b 1f0c640 + 1f0ca34: e3130004 tst r3, #4 + 1f0ca38: 1affff28 bne 1f0c6e0 + 1f0ca3c: e5d83006 ldrb r3, [r8, #6] + 1f0ca40: e3130010 tst r3, #16 + 1f0ca44: 0a000068 beq 1f0cbec + 1f0ca48: e5d41000 ldrb r1, [r4] + 1f0ca4c: e3510004 cmp r1, #4 + 1f0ca50: 0a00000d beq 1f0ca8c + 1f0ca54: e5982028 ldr r2, [r8, #40] ; 0x28 + 1f0ca58: e2843048 add r3, r4, #72 ; 0x48 + 1f0ca5c: e3510003 cmp r1, #3 + 1f0ca60: e7e82052 ubfx r2, r2, #0, #9 + 1f0ca64: e0833002 add r3, r3, r2 + 1f0ca68: e5d3101b ldrb r1, [r3, #27] + 1f0ca6c: e5d3201a ldrb r2, [r3, #26] + 1f0ca70: e1822401 orr r2, r2, r1, lsl #8 + 1f0ca74: 05d31015 ldrbeq r1, [r3, #21] + 1f0ca78: 05d33014 ldrbeq r3, [r3, #20] + 1f0ca7c: 01833401 orreq r3, r3, r1, lsl #8 + 1f0ca80: 01822803 orreq r2, r2, r3, lsl #16 + 1f0ca84: e5882008 str r2, [r8, #8] + 1f0ca88: eaffffe7 b 1f0ca2c + 1f0ca8c: e5982010 ldr r2, [r8, #16] + 1f0ca90: e3a07000 mov r7, #0 + 1f0ca94: e5d83007 ldrb r3, [r8, #7] + 1f0ca98: e3c220ff bic r2, r2, #255 ; 0xff + 1f0ca9c: e5980008 ldr r0, [r8, #8] + 1f0caa0: e1822003 orr r2, r2, r3 + 1f0caa4: e5981044 ldr r1, [r8, #68] ; 0x44 + 1f0caa8: e5943010 ldr r3, [r4, #16] + 1f0caac: e5882020 str r2, [r8, #32] + 1f0cab0: e588001c str r0, [r8, #28] + 1f0cab4: e5881024 str r1, [r8, #36] ; 0x24 + 1f0cab8: e1d303b6 ldrh r0, [r3, #54] ; 0x36 + 1f0cabc: e5d31035 ldrb r1, [r3, #53] ; 0x35 + 1f0cac0: e5d32034 ldrb r2, [r3, #52] ; 0x34 + 1f0cac4: e1811400 orr r1, r1, r0, lsl #8 + 1f0cac8: e1822401 orr r2, r2, r1, lsl #8 + 1f0cacc: e5882008 str r2, [r8, #8] + 1f0cad0: e3a01000 mov r1, #0 + 1f0cad4: e5d33021 ldrb r3, [r3, #33] ; 0x21 + 1f0cad8: e2033002 and r3, r3, #2 + 1f0cadc: e5c83007 strb r3, [r8, #7] + 1f0cae0: e594c010 ldr ip, [r4, #16] + 1f0cae4: e59c303c ldr r3, [ip, #60] ; 0x3c + 1f0cae8: e5dc603b ldrb r6, [ip, #59] ; 0x3b + 1f0caec: e5dc003a ldrb r0, [ip, #58] ; 0x3a + 1f0caf0: ee803b90 vdup.32 d16, r3 + 1f0caf4: f3e000b0 vshr.u64 d16, d16, #32 + 1f0caf8: f2c815b0 vshl.s64 d17, d16, #8 + 1f0cafc: ec532b31 vmov r2, r3, d17 + 1f0cb00: e1833007 orr r3, r3, r7 + 1f0cb04: e1822006 orr r2, r2, r6 + 1f0cb08: e5dc6038 ldrb r6, [ip, #56] ; 0x38 + 1f0cb0c: e3a07000 mov r7, #0 + 1f0cb10: e1a03403 lsl r3, r3, #8 + 1f0cb14: e1833c22 orr r3, r3, r2, lsr #24 + 1f0cb18: e1a02402 lsl r2, r2, #8 + 1f0cb1c: e1833001 orr r3, r3, r1 + 1f0cb20: e1822000 orr r2, r2, r0 + 1f0cb24: e3a01000 mov r1, #0 + 1f0cb28: e5dc0039 ldrb r0, [ip, #57] ; 0x39 + 1f0cb2c: e1a03403 lsl r3, r3, #8 + 1f0cb30: e1833c22 orr r3, r3, r2, lsr #24 + 1f0cb34: e1a02402 lsl r2, r2, #8 + 1f0cb38: e1833001 orr r3, r3, r1 + 1f0cb3c: e1822000 orr r2, r2, r0 + 1f0cb40: e1a03403 lsl r3, r3, #8 + 1f0cb44: e1833c22 orr r3, r3, r2, lsr #24 + 1f0cb48: e1a02402 lsl r2, r2, #8 + 1f0cb4c: e1822006 orr r2, r2, r6 + 1f0cb50: e1833007 orr r3, r3, r7 + 1f0cb54: e1c821f0 strd r2, [r8, #16] + 1f0cb58: eaffffb3 b 1f0ca2c + 1f0cb5c: e1dc20b2 ldrh r2, [ip, #2] + 1f0cb60: e352002e cmp r2, #46 ; 0x2e + 1f0cb64: 0a00000a beq 1f0cb94 + 1f0cb68: e1a03000 mov r3, r0 + 1f0cb6c: eafffeea b 1f0c71c + 1f0cb70: e38ee002 orr lr, lr, #2 + 1f0cb74: eaffff99 b 1f0c9e0 + 1f0cb78: e5d83038 ldrb r3, [r8, #56] ; 0x38 + 1f0cb7c: e38ee003 orr lr, lr, #3 + 1f0cb80: e35300e5 cmp r3, #229 ; 0xe5 + 1f0cb84: 1affff8f bne 1f0c9c8 + 1f0cb88: e3a03005 mov r3, #5 + 1f0cb8c: e5c83038 strb r3, [r8, #56] ; 0x38 + 1f0cb90: eaffff89 b 1f0c9bc + 1f0cb94: e1dc20b0 ldrh r2, [ip] + 1f0cb98: e352002e cmp r2, #46 ; 0x2e + 1f0cb9c: 1afffff1 bne 1f0cb68 + 1f0cba0: e3a01000 mov r1, #0 + 1f0cba4: e1cc10b4 strh r1, [ip, #4] + 1f0cba8: e5c82038 strb r2, [r8, #56] ; 0x38 + 1f0cbac: e5c82039 strb r2, [r8, #57] ; 0x39 + 1f0cbb0: eaffff06 b 1f0c7d0 + 1f0cbb4: e3e0307f mvn r3, #127 ; 0x7f + 1f0cbb8: e1a00008 mov r0, r8 + 1f0cbbc: e5c83043 strb r3, [r8, #67] ; 0x43 + 1f0cbc0: e3a01000 mov r1, #0 + 1f0cbc4: ebffedab bl 1f08278 + 1f0cbc8: eafffec4 b 1f0c6e0 + 1f0cbcc: e1a09001 mov r9, r1 + 1f0cbd0: e3a03020 mov r3, #32 + 1f0cbd4: e3a0e000 mov lr, #0 + 1f0cbd8: eafffef1 b 1f0c7a4 + 1f0cbdc: e3e0307f mvn r3, #127 ; 0x7f + 1f0cbe0: e3a00000 mov r0, #0 + 1f0cbe4: e5c83043 strb r3, [r8, #67] ; 0x43 + 1f0cbe8: eafffebc b 1f0c6e0 + 1f0cbec: e3a00005 mov r0, #5 + 1f0cbf0: eafffeba b 1f0c6e0 + 1f0cbf4: e3130004 tst r3, #4 + 1f0cbf8: 03a00005 moveq r0, #5 + 1f0cbfc: 13a00004 movne r0, #4 + 1f0cc00: eafffeb6 b 1f0c6e0 + 1f0cc04: e1a0000d mov r0, sp + 1f0cc08: ebfff2cd bl 1f09744 + 1f0cc0c: e3500000 cmp r0, #0 + 1f0cc10: e1a03000 mov r3, r0 + 1f0cc14: 1afffe7b bne 1f0c608 + 1f0cc18: e5943010 ldr r3, [r4, #16] + 1f0cc1c: e1d3c3ba ldrh ip, [r3, #58] ; 0x3a + 1f0cc20: e5d31039 ldrb r1, [r3, #57] ; 0x39 + 1f0cc24: e5d32038 ldrb r2, [r3, #56] ; 0x38 + 1f0cc28: e181140c orr r1, r1, ip, lsl #8 + 1f0cc2c: e5880014 str r0, [r8, #20] + 1f0cc30: e1822401 orr r2, r2, r1, lsl #8 + 1f0cc34: e5882010 str r2, [r8, #16] + 1f0cc38: e5d33021 ldrb r3, [r3, #33] ; 0x21 + 1f0cc3c: e2033002 and r3, r3, #2 + 1f0cc40: e5c83007 strb r3, [r8, #7] + 1f0cc44: eafffe77 b 1f0c628 + +01f0cc48 : + 1f0cc48: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f0cc4c: e251c000 subs ip, r1, #0 + 1f0cc50: e24dd00c sub sp, sp, #12 + 1f0cc54: e58d0004 str r0, [sp, #4] + 1f0cc58: e58d1000 str r1, [sp] + 1f0cc5c: 0a000027 beq 1f0cd00 + 1f0cc60: e1dce0d0 ldrsb lr, [ip] + 1f0cc64: e6ef307e uxtb r3, lr + 1f0cc68: e35e003a cmp lr, #58 ; 0x3a + 1f0cc6c: 1353001f cmpne r3, #31 + 1f0cc70: 9a000024 bls 1f0cd08 + 1f0cc74: e1a0100c mov r1, ip + 1f0cc78: e1f130d1 ldrsb r3, [r1, #1]! + 1f0cc7c: e6ef0073 uxtb r0, r3 + 1f0cc80: e353003a cmp r3, #58 ; 0x3a + 1f0cc84: 1350001f cmpne r0, #31 + 1f0cc88: 8afffffa bhi 1f0cc78 + 1f0cc8c: e353003a cmp r3, #58 ; 0x3a + 1f0cc90: 0a000016 beq 1f0ccf0 + 1f0cc94: e3013e50 movw r3, #7760 ; 0x1e50 + 1f0cc98: e34031fb movt r3, #507 ; 0x1fb + 1f0cc9c: e5931000 ldr r1, [r3] + 1f0cca0: e3510000 cmp r1, #0 + 1f0cca4: 13a00000 movne r0, #0 + 1f0cca8: 15c10000 strbne r0, [r1] + 1f0ccac: e59d0004 ldr r0, [sp, #4] + 1f0ccb0: e3500000 cmp r0, #0 + 1f0ccb4: 05830000 streq r0, [r3] + 1f0ccb8: 0a000005 beq 1f0ccd4 + 1f0ccbc: e3520001 cmp r2, #1 + 1f0ccc0: e3a02000 mov r2, #0 + 1f0ccc4: e5830000 str r0, [r3] + 1f0ccc8: e5c02000 strb r2, [r0] + 1f0cccc: 11a00002 movne r0, r2 + 1f0ccd0: 0a000001 beq 1f0ccdc + 1f0ccd4: e28dd00c add sp, sp, #12 + 1f0ccd8: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f0ccdc: e28d1004 add r1, sp, #4 + 1f0cce0: e1a0000d mov r0, sp + 1f0cce4: ebffe289 bl 1f05710 + 1f0cce8: e28dd00c add sp, sp, #12 + 1f0ccec: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f0ccf0: e28cc001 add ip, ip, #1 + 1f0ccf4: e151000c cmp r1, ip + 1f0ccf8: 035e0030 cmpeq lr, #48 ; 0x30 + 1f0ccfc: 0affffe4 beq 1f0cc94 + 1f0cd00: e3a0000b mov r0, #11 + 1f0cd04: eafffff2 b 1f0ccd4 + 1f0cd08: e1a0300e mov r3, lr + 1f0cd0c: e1a0100c mov r1, ip + 1f0cd10: eaffffdd b 1f0cc8c + +01f0cd14 : + 1f0cd14: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f0cd18: e3500000 cmp r0, #0 + 1f0cd1c: e24dd060 sub sp, sp, #96 ; 0x60 + 1f0cd20: 03a00009 moveq r0, #9 + 1f0cd24: e58d1004 str r1, [sp, #4] + 1f0cd28: 0a00000a beq 1f0cd58 + 1f0cd2c: e202503f and r5, r2, #63 ; 0x3f + 1f0cd30: e1a06002 mov r6, r2 + 1f0cd34: e1a04000 mov r4, r0 + 1f0cd38: e28d100c add r1, sp, #12 + 1f0cd3c: e1a02005 mov r2, r5 + 1f0cd40: e28d0004 add r0, sp, #4 + 1f0cd44: ebffe271 bl 1f05710 + 1f0cd48: e3500000 cmp r0, #0 + 1f0cd4c: 0a000003 beq 1f0cd60 + 1f0cd50: e3a03000 mov r3, #0 + 1f0cd54: e5843000 str r3, [r4] + 1f0cd58: e28dd060 add sp, sp, #96 ; 0x60 + 1f0cd5c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f0cd60: e59d300c ldr r3, [sp, #12] + 1f0cd64: e28d0010 add r0, sp, #16 + 1f0cd68: e59d1004 ldr r1, [sp, #4] + 1f0cd6c: e58d3010 str r3, [sp, #16] + 1f0cd70: ebfffe01 bl 1f0c57c + 1f0cd74: e3500000 cmp r0, #0 + 1f0cd78: 1a00000b bne 1f0cdac + 1f0cd7c: e1dd35d3 ldrsb r3, [sp, #83] ; 0x53 + 1f0cd80: e3530000 cmp r3, #0 + 1f0cd84: ba000115 blt 1f0d1e0 + 1f0cd88: e316001c tst r6, #28 + 1f0cd8c: 0a0000c5 beq 1f0d0a8 + 1f0cd90: e5dd3016 ldrb r3, [sp, #22] + 1f0cd94: e3130011 tst r3, #17 + 1f0cd98: 1a0000c9 bne 1f0d0c4 + 1f0cd9c: e3160004 tst r6, #4 + 1f0cda0: 0a00000a beq 1f0cdd0 + 1f0cda4: e3a00008 mov r0, #8 + 1f0cda8: eaffffe8 b 1f0cd50 + 1f0cdac: e316001c tst r6, #28 + 1f0cdb0: 0affffe6 beq 1f0cd50 + 1f0cdb4: e3500004 cmp r0, #4 + 1f0cdb8: 1affffe4 bne 1f0cd50 + 1f0cdbc: e28d0010 add r0, sp, #16 + 1f0cdc0: ebfff8c1 bl 1f0b0cc + 1f0cdc4: e3500000 cmp r0, #0 + 1f0cdc8: 1affffe0 bne 1f0cd50 + 1f0cdcc: e3855008 orr r5, r5, #8 + 1f0cdd0: e3150008 tst r5, #8 + 1f0cdd4: 1a000105 bne 1f0d1f0 + 1f0cdd8: e59d300c ldr r3, [sp, #12] + 1f0cddc: e5931044 ldr r1, [r3, #68] ; 0x44 + 1f0cde0: e59d2044 ldr r2, [sp, #68] ; 0x44 + 1f0cde4: e5841040 str r1, [r4, #64] ; 0x40 + 1f0cde8: e5842044 str r2, [r4, #68] ; 0x44 + 1f0cdec: e5d30000 ldrb r0, [r3] + 1f0cdf0: e3500004 cmp r0, #4 + 1f0cdf4: 0a0000c6 beq 1f0d114 + 1f0cdf8: e5d2c01b ldrb ip, [r2, #27] + 1f0cdfc: e3500003 cmp r0, #3 + 1f0ce00: e5d2101a ldrb r1, [r2, #26] + 1f0ce04: 05d20014 ldrbeq r0, [r2, #20] + 1f0ce08: e181140c orr r1, r1, ip, lsl #8 + 1f0ce0c: 05d2c015 ldrbeq ip, [r2, #21] + 1f0ce10: 0180040c orreq r0, r0, ip, lsl #8 + 1f0ce14: 01811800 orreq r1, r1, r0, lsl #16 + 1f0ce18: e5841008 str r1, [r4, #8] + 1f0ce1c: e3a00000 mov r0, #0 + 1f0ce20: e1d2c1be ldrh ip, [r2, #30] + 1f0ce24: e5d2101d ldrb r1, [r2, #29] + 1f0ce28: e5d2201c ldrb r2, [r2, #28] + 1f0ce2c: e181140c orr r1, r1, ip, lsl #8 + 1f0ce30: e5840014 str r0, [r4, #20] + 1f0ce34: e1822401 orr r2, r2, r1, lsl #8 + 1f0ce38: e5842010 str r2, [r4, #16] + 1f0ce3c: e284a048 add sl, r4, #72 ; 0x48 + 1f0ce40: f2c00010 vmov.i32 d16, #0 ; 0x00000000 + 1f0ce44: e20a2007 and r2, sl, #7 + 1f0ce48: e1d310b6 ldrh r1, [r3, #6] + 1f0ce4c: e2622000 rsb r2, r2, #0 + 1f0ce50: e1c410b4 strh r1, [r4, #4] + 1f0ce54: e212200f ands r2, r2, #15 + 1f0ce58: e3a01000 mov r1, #0 + 1f0ce5c: edc40b0c vstr d16, [r4, #48] ; 0x30 + 1f0ce60: e5843000 str r3, [r4] + 1f0ce64: e5c45028 strb r5, [r4, #40] ; 0x28 + 1f0ce68: e5c41029 strb r1, [r4, #41] ; 0x29 + 1f0ce6c: e584103c str r1, [r4, #60] ; 0x3c + 1f0ce70: 0a0000a1 beq 1f0d0fc + 1f0ce74: e3520001 cmp r2, #1 + 1f0ce78: e5c41048 strb r1, [r4, #72] ; 0x48 + 1f0ce7c: e2840049 add r0, r4, #73 ; 0x49 + 1f0ce80: 0a000138 beq 1f0d368 + 1f0ce84: e3520002 cmp r2, #2 + 1f0ce88: e5c41049 strb r1, [r4, #73] ; 0x49 + 1f0ce8c: e284004a add r0, r4, #74 ; 0x4a + 1f0ce90: 0a000140 beq 1f0d398 + 1f0ce94: e3520003 cmp r2, #3 + 1f0ce98: e5c4104a strb r1, [r4, #74] ; 0x4a + 1f0ce9c: e284004b add r0, r4, #75 ; 0x4b + 1f0cea0: 0a00013a beq 1f0d390 + 1f0cea4: e3520004 cmp r2, #4 + 1f0cea8: e5c4104b strb r1, [r4, #75] ; 0x4b + 1f0ceac: e284004c add r0, r4, #76 ; 0x4c + 1f0ceb0: 0a000134 beq 1f0d388 + 1f0ceb4: e3520005 cmp r2, #5 + 1f0ceb8: e5c4104c strb r1, [r4, #76] ; 0x4c + 1f0cebc: e284004d add r0, r4, #77 ; 0x4d + 1f0cec0: 0a00012e beq 1f0d380 + 1f0cec4: e3520006 cmp r2, #6 + 1f0cec8: e5c4104d strb r1, [r4, #77] ; 0x4d + 1f0cecc: e284004e add r0, r4, #78 ; 0x4e + 1f0ced0: 0a000140 beq 1f0d3d8 + 1f0ced4: e3520007 cmp r2, #7 + 1f0ced8: e5c4104e strb r1, [r4, #78] ; 0x4e + 1f0cedc: e284004f add r0, r4, #79 ; 0x4f + 1f0cee0: 0a00013a beq 1f0d3d0 + 1f0cee4: e3520008 cmp r2, #8 + 1f0cee8: e5c4104f strb r1, [r4, #79] ; 0x4f + 1f0ceec: e2840050 add r0, r4, #80 ; 0x50 + 1f0cef0: 0a000134 beq 1f0d3c8 + 1f0cef4: e3520009 cmp r2, #9 + 1f0cef8: e5c41050 strb r1, [r4, #80] ; 0x50 + 1f0cefc: e2840051 add r0, r4, #81 ; 0x51 + 1f0cf00: 0a00012e beq 1f0d3c0 + 1f0cf04: e352000a cmp r2, #10 + 1f0cf08: e2840052 add r0, r4, #82 ; 0x52 + 1f0cf0c: e5c41051 strb r1, [r4, #81] ; 0x51 + 1f0cf10: 0a000128 beq 1f0d3b8 + 1f0cf14: e352000b cmp r2, #11 + 1f0cf18: e5c41052 strb r1, [r4, #82] ; 0x52 + 1f0cf1c: e2840053 add r0, r4, #83 ; 0x53 + 1f0cf20: 0a000122 beq 1f0d3b0 + 1f0cf24: e352000c cmp r2, #12 + 1f0cf28: e5c41053 strb r1, [r4, #83] ; 0x53 + 1f0cf2c: e2840054 add r0, r4, #84 ; 0x54 + 1f0cf30: 0a00011c beq 1f0d3a8 + 1f0cf34: e352000d cmp r2, #13 + 1f0cf38: e5c41054 strb r1, [r4, #84] ; 0x54 + 1f0cf3c: e2840055 add r0, r4, #85 ; 0x55 + 1f0cf40: 0a000116 beq 1f0d3a0 + 1f0cf44: e352000f cmp r2, #15 + 1f0cf48: e5c41055 strb r1, [r4, #85] ; 0x55 + 1f0cf4c: e2840056 add r0, r4, #86 ; 0x56 + 1f0cf50: 1a000108 bne 1f0d378 + 1f0cf54: e5c41056 strb r1, [r4, #86] ; 0x56 + 1f0cf58: e2840057 add r0, r4, #87 ; 0x57 + 1f0cf5c: e30011f1 movw r1, #497 ; 0x1f1 + 1f0cf60: e2627c02 rsb r7, r2, #512 ; 0x200 + 1f0cf64: e3a0e01f mov lr, #31 + 1f0cf68: e3a06e1f mov r6, #496 ; 0x1f0 + 1f0cf6c: f2c00050 vmov.i32 q8, #0 ; 0x00000000 + 1f0cf70: e08a2002 add r2, sl, r2 + 1f0cf74: e3a0c000 mov ip, #0 + 1f0cf78: e28cc001 add ip, ip, #1 + 1f0cf7c: f4420adf vst1.64 {d16-d17}, [r2 :64] + 1f0cf80: e15c000e cmp ip, lr + 1f0cf84: e2822010 add r2, r2, #16 + 1f0cf88: 3afffffa bcc 1f0cf78 + 1f0cf8c: e1560007 cmp r6, r7 + 1f0cf90: e0662001 rsb r2, r6, r1 + 1f0cf94: e0801006 add r1, r0, r6 + 1f0cf98: 0a00002a beq 1f0d048 + 1f0cf9c: e3520001 cmp r2, #1 + 1f0cfa0: e3a0c000 mov ip, #0 + 1f0cfa4: e7c0c006 strb ip, [r0, r6] + 1f0cfa8: 0a000026 beq 1f0d048 + 1f0cfac: e3520002 cmp r2, #2 + 1f0cfb0: e5c1c001 strb ip, [r1, #1] + 1f0cfb4: 0a000023 beq 1f0d048 + 1f0cfb8: e3520003 cmp r2, #3 + 1f0cfbc: e5c1c002 strb ip, [r1, #2] + 1f0cfc0: 0a000020 beq 1f0d048 + 1f0cfc4: e3520004 cmp r2, #4 + 1f0cfc8: e5c1c003 strb ip, [r1, #3] + 1f0cfcc: 0a00001d beq 1f0d048 + 1f0cfd0: e3520005 cmp r2, #5 + 1f0cfd4: e5c1c004 strb ip, [r1, #4] + 1f0cfd8: 0a00001a beq 1f0d048 + 1f0cfdc: e3520006 cmp r2, #6 + 1f0cfe0: e5c1c005 strb ip, [r1, #5] + 1f0cfe4: 0a000017 beq 1f0d048 + 1f0cfe8: e3520007 cmp r2, #7 + 1f0cfec: e5c1c006 strb ip, [r1, #6] + 1f0cff0: 0a000014 beq 1f0d048 + 1f0cff4: e3520008 cmp r2, #8 + 1f0cff8: e5c1c007 strb ip, [r1, #7] + 1f0cffc: 0a000011 beq 1f0d048 + 1f0d000: e3520009 cmp r2, #9 + 1f0d004: e5c1c008 strb ip, [r1, #8] + 1f0d008: 0a00000e beq 1f0d048 + 1f0d00c: e352000a cmp r2, #10 + 1f0d010: e5c1c009 strb ip, [r1, #9] + 1f0d014: 0a00000b beq 1f0d048 + 1f0d018: e352000b cmp r2, #11 + 1f0d01c: e5c1c00a strb ip, [r1, #10] + 1f0d020: 0a000008 beq 1f0d048 + 1f0d024: e352000c cmp r2, #12 + 1f0d028: e5c1c00b strb ip, [r1, #11] + 1f0d02c: 0a000005 beq 1f0d048 + 1f0d030: e352000d cmp r2, #13 + 1f0d034: e5c1c00c strb ip, [r1, #12] + 1f0d038: 0a000002 beq 1f0d048 + 1f0d03c: e352000e cmp r2, #14 + 1f0d040: e5c1c00d strb ip, [r1, #13] + 1f0d044: 15c1c00e strbne ip, [r1, #14] + 1f0d048: e3150020 tst r5, #32 + 1f0d04c: 0a00001e beq 1f0d0cc + 1f0d050: e1c461d0 ldrd r6, [r4, #16] + 1f0d054: e1962007 orrs r2, r6, r7 + 1f0d058: 0a00001b beq 1f0d0cc + 1f0d05c: e1d380ba ldrh r8, [r3, #10] + 1f0d060: e3a09000 mov r9, #0 + 1f0d064: e5943008 ldr r3, [r4, #8] + 1f0d068: e1c463f0 strd r6, [r4, #48] ; 0x30 + 1f0d06c: e1a08488 lsl r8, r8, #9 + 1f0d070: e1570009 cmp r7, r9 + 1f0d074: e1a01003 mov r1, r3 + 1f0d078: 01560008 cmpeq r6, r8 + 1f0d07c: e1a00004 mov r0, r4 + 1f0d080: 9a00009b bls 1f0d2f4 + 1f0d084: ebffe874 bl 1f0725c + 1f0d088: e3500001 cmp r0, #1 + 1f0d08c: e1a03000 mov r3, r0 + 1f0d090: 9a000012 bls 1f0d0e0 + 1f0d094: e3700001 cmn r0, #1 + 1f0d098: 0a00000d beq 1f0d0d4 + 1f0d09c: e0566008 subs r6, r6, r8 + 1f0d0a0: e0c77009 sbc r7, r7, r9 + 1f0d0a4: eafffff1 b 1f0d070 + 1f0d0a8: e5dd3016 ldrb r3, [sp, #22] + 1f0d0ac: e3130010 tst r3, #16 + 1f0d0b0: 1a00004c bne 1f0d1e8 + 1f0d0b4: e3160002 tst r6, #2 + 1f0d0b8: 0a00000a beq 1f0d0e8 + 1f0d0bc: e3130001 tst r3, #1 + 1f0d0c0: 0a000008 beq 1f0d0e8 + 1f0d0c4: e3a00007 mov r0, #7 + 1f0d0c8: eaffff20 b 1f0cd50 + 1f0d0cc: e3a00000 mov r0, #0 + 1f0d0d0: eaffff20 b 1f0cd58 + 1f0d0d4: e3a00001 mov r0, #1 + 1f0d0d8: e5843038 str r3, [r4, #56] ; 0x38 + 1f0d0dc: eaffff1b b 1f0cd50 + 1f0d0e0: e3a00002 mov r0, #2 + 1f0d0e4: eafffffb b 1f0d0d8 + 1f0d0e8: e3160008 tst r6, #8 + 1f0d0ec: e59d300c ldr r3, [sp, #12] + 1f0d0f0: 0affff39 beq 1f0cddc + 1f0d0f4: e3855040 orr r5, r5, #64 ; 0x40 + 1f0d0f8: eaffff37 b 1f0cddc + 1f0d0fc: e3a01c02 mov r1, #512 ; 0x200 + 1f0d100: e1a0000a mov r0, sl + 1f0d104: e1a07001 mov r7, r1 + 1f0d108: e1a06001 mov r6, r1 + 1f0d10c: e3a0e020 mov lr, #32 + 1f0d110: eaffff95 b 1f0cf6c + 1f0d114: e5932010 ldr r2, [r3, #16] + 1f0d118: e3a07000 mov r7, #0 + 1f0d11c: e59d1020 ldr r1, [sp, #32] + 1f0d120: e1d2e3b6 ldrh lr, [r2, #54] ; 0x36 + 1f0d124: e3c110ff bic r1, r1, #255 ; 0xff + 1f0d128: e5d2c035 ldrb ip, [r2, #53] ; 0x35 + 1f0d12c: e5d20034 ldrb r0, [r2, #52] ; 0x34 + 1f0d130: e18ce40e orr lr, ip, lr, lsl #8 + 1f0d134: e5ddc017 ldrb ip, [sp, #23] + 1f0d138: e180040e orr r0, r0, lr, lsl #8 + 1f0d13c: e5840008 str r0, [r4, #8] + 1f0d140: e181c00c orr ip, r1, ip + 1f0d144: e59de018 ldr lr, [sp, #24] + 1f0d148: e592103c ldr r1, [r2, #60] ; 0x3c + 1f0d14c: e5d2603b ldrb r6, [r2, #59] ; 0x3b + 1f0d150: ee801b90 vdup.32 d16, r1 + 1f0d154: f3e000b0 vshr.u64 d16, d16, #32 + 1f0d158: f2c815b0 vshl.s64 d17, d16, #8 + 1f0d15c: ec510b31 vmov r0, r1, d17 + 1f0d160: e1811007 orr r1, r1, r7 + 1f0d164: e1800006 orr r0, r0, r6 + 1f0d168: e3a07000 mov r7, #0 + 1f0d16c: e5d2603a ldrb r6, [r2, #58] ; 0x3a + 1f0d170: e1a01401 lsl r1, r1, #8 + 1f0d174: e1811c20 orr r1, r1, r0, lsr #24 + 1f0d178: e1a00400 lsl r0, r0, #8 + 1f0d17c: e1811007 orr r1, r1, r7 + 1f0d180: e1800006 orr r0, r0, r6 + 1f0d184: e3a07000 mov r7, #0 + 1f0d188: e5d26039 ldrb r6, [r2, #57] ; 0x39 + 1f0d18c: e1a01401 lsl r1, r1, #8 + 1f0d190: e1811c20 orr r1, r1, r0, lsr #24 + 1f0d194: e1a00400 lsl r0, r0, #8 + 1f0d198: e1811007 orr r1, r1, r7 + 1f0d19c: e1800006 orr r0, r0, r6 + 1f0d1a0: e5d26038 ldrb r6, [r2, #56] ; 0x38 + 1f0d1a4: e3a07000 mov r7, #0 + 1f0d1a8: e1a01401 lsl r1, r1, #8 + 1f0d1ac: e1811c20 orr r1, r1, r0, lsr #24 + 1f0d1b0: e1a00400 lsl r0, r0, #8 + 1f0d1b4: e1811007 orr r1, r1, r7 + 1f0d1b8: e1800006 orr r0, r0, r6 + 1f0d1bc: e1c401f0 strd r0, [r4, #16] + 1f0d1c0: e59d1054 ldr r1, [sp, #84] ; 0x54 + 1f0d1c4: e5d22021 ldrb r2, [r2, #33] ; 0x21 + 1f0d1c8: e584c020 str ip, [r4, #32] + 1f0d1cc: e2022002 and r2, r2, #2 + 1f0d1d0: e584e01c str lr, [r4, #28] + 1f0d1d4: e5c42007 strb r2, [r4, #7] + 1f0d1d8: e5841024 str r1, [r4, #36] ; 0x24 + 1f0d1dc: eaffff16 b 1f0ce3c + 1f0d1e0: e3a00006 mov r0, #6 + 1f0d1e4: eafffed9 b 1f0cd50 + 1f0d1e8: e3a00004 mov r0, #4 + 1f0d1ec: eafffed7 b 1f0cd50 + 1f0d1f0: ebffd080 bl 1f013f8 + 1f0d1f4: e59d300c ldr r3, [sp, #12] + 1f0d1f8: e1a02000 mov r2, r0 + 1f0d1fc: e5d31000 ldrb r1, [r3] + 1f0d200: e3510004 cmp r1, #4 + 1f0d204: 0a000075 beq 1f0d3e0 + 1f0d208: e59d1044 ldr r1, [sp, #68] ; 0x44 + 1f0d20c: e6efe070 uxtb lr, r0 + 1f0d210: e7e7c450 ubfx ip, r0, #8, #8 + 1f0d214: e1a02c22 lsr r2, r2, #24 + 1f0d218: e7e70850 ubfx r0, r0, #16, #8 + 1f0d21c: e3a06020 mov r6, #32 + 1f0d220: e5c1e00e strb lr, [r1, #14] + 1f0d224: e5c1c00f strb ip, [r1, #15] + 1f0d228: e5c10010 strb r0, [r1, #16] + 1f0d22c: e5c12011 strb r2, [r1, #17] + 1f0d230: e59d1044 ldr r1, [sp, #68] ; 0x44 + 1f0d234: e5c1e016 strb lr, [r1, #22] + 1f0d238: e5c1c017 strb ip, [r1, #23] + 1f0d23c: e5c10018 strb r0, [r1, #24] + 1f0d240: e5c12019 strb r2, [r1, #25] + 1f0d244: e59d2044 ldr r2, [sp, #68] ; 0x44 + 1f0d248: e5c2600b strb r6, [r2, #11] + 1f0d24c: e59d2044 ldr r2, [sp, #68] ; 0x44 + 1f0d250: e5d31000 ldrb r1, [r3] + 1f0d254: e5d2601b ldrb r6, [r2, #27] + 1f0d258: e3510003 cmp r1, #3 + 1f0d25c: e5d2101a ldrb r1, [r2, #26] + 1f0d260: 05d20015 ldrbeq r0, [r2, #21] + 1f0d264: e1816406 orr r6, r1, r6, lsl #8 + 1f0d268: 05d21014 ldrbeq r1, [r2, #20] + 1f0d26c: 01811400 orreq r1, r1, r0, lsl #8 + 1f0d270: 01866801 orreq r6, r6, r1, lsl #16 + 1f0d274: e3a01000 mov r1, #0 + 1f0d278: e5c2101a strb r1, [r2, #26] + 1f0d27c: e5c2101b strb r1, [r2, #27] + 1f0d280: e5d30000 ldrb r0, [r3] + 1f0d284: e3500003 cmp r0, #3 + 1f0d288: 05c21014 strbeq r1, [r2, #20] + 1f0d28c: 05c21015 strbeq r1, [r2, #21] + 1f0d290: e3560000 cmp r6, #0 + 1f0d294: e3a02000 mov r2, #0 + 1f0d298: e3a00001 mov r0, #1 + 1f0d29c: e59d1044 ldr r1, [sp, #68] ; 0x44 + 1f0d2a0: e5c1201c strb r2, [r1, #28] + 1f0d2a4: e5c1201d strb r2, [r1, #29] + 1f0d2a8: e5c1201e strb r2, [r1, #30] + 1f0d2ac: e5c1201f strb r2, [r1, #31] + 1f0d2b0: e5c30003 strb r0, [r3, #3] + 1f0d2b4: 0affff8e beq 1f0d0f4 + 1f0d2b8: e28d0010 add r0, sp, #16 + 1f0d2bc: e1a01006 mov r1, r6 + 1f0d2c0: e5937044 ldr r7, [r3, #68] ; 0x44 + 1f0d2c4: ebffe5cb bl 1f069f8 + 1f0d2c8: e3500000 cmp r0, #0 + 1f0d2cc: 1afffe9f bne 1f0cd50 + 1f0d2d0: e1a01007 mov r1, r7 + 1f0d2d4: e59d000c ldr r0, [sp, #12] + 1f0d2d8: ebffe0da bl 1f05648 + 1f0d2dc: e59d300c ldr r3, [sp, #12] + 1f0d2e0: e2466001 sub r6, r6, #1 + 1f0d2e4: e5836014 str r6, [r3, #20] + 1f0d2e8: e3500000 cmp r0, #0 + 1f0d2ec: 0affff80 beq 1f0d0f4 + 1f0d2f0: eafffe96 b 1f0cd50 + 1f0d2f4: e30001ff movw r0, #511 ; 0x1ff + 1f0d2f8: e3a01000 mov r1, #0 + 1f0d2fc: e0000006 and r0, r0, r6 + 1f0d300: e0011007 and r1, r1, r7 + 1f0d304: e1902001 orrs r2, r0, r1 + 1f0d308: e5843038 str r3, [r4, #56] ; 0x38 + 1f0d30c: 0affff6e beq 1f0d0cc + 1f0d310: e59d000c ldr r0, [sp, #12] + 1f0d314: e2433002 sub r3, r3, #2 + 1f0d318: e590202c ldr r2, [r0, #44] ; 0x2c + 1f0d31c: e2422002 sub r2, r2, #2 + 1f0d320: e1530002 cmp r3, r2 + 1f0d324: 2a000011 bcs 1f0d370 + 1f0d328: e1d010ba ldrh r1, [r0, #10] + 1f0d32c: e5902040 ldr r2, [r0, #64] ; 0x40 + 1f0d330: e0332391 mlas r3, r1, r3, r2 + 1f0d334: 0a00000d beq 1f0d370 + 1f0d338: e1a064a6 lsr r6, r6, #9 + 1f0d33c: e1a0100a mov r1, sl + 1f0d340: e1866b87 orr r6, r6, r7, lsl #23 + 1f0d344: e0832006 add r2, r3, r6 + 1f0d348: e584203c str r2, [r4, #60] ; 0x3c + 1f0d34c: e3a03001 mov r3, #1 + 1f0d350: e5d00001 ldrb r0, [r0, #1] + 1f0d354: eb0064dd bl 1f266d0 + 1f0d358: e3500000 cmp r0, #0 + 1f0d35c: 0affff5a beq 1f0d0cc + 1f0d360: e3a00001 mov r0, #1 + 1f0d364: eafffe79 b 1f0cd50 + 1f0d368: e30011ff movw r1, #511 ; 0x1ff + 1f0d36c: eafffefb b 1f0cf60 + 1f0d370: e3a00002 mov r0, #2 + 1f0d374: eafffe75 b 1f0cd50 + 1f0d378: e30011f2 movw r1, #498 ; 0x1f2 + 1f0d37c: eafffef7 b 1f0cf60 + 1f0d380: e30011fb movw r1, #507 ; 0x1fb + 1f0d384: eafffef5 b 1f0cf60 + 1f0d388: e3a01f7f mov r1, #508 ; 0x1fc + 1f0d38c: eafffef3 b 1f0cf60 + 1f0d390: e30011fd movw r1, #509 ; 0x1fd + 1f0d394: eafffef1 b 1f0cf60 + 1f0d398: e30011fe movw r1, #510 ; 0x1fe + 1f0d39c: eafffeef b 1f0cf60 + 1f0d3a0: e30011f3 movw r1, #499 ; 0x1f3 + 1f0d3a4: eafffeed b 1f0cf60 + 1f0d3a8: e3a01f7d mov r1, #500 ; 0x1f4 + 1f0d3ac: eafffeeb b 1f0cf60 + 1f0d3b0: e30011f5 movw r1, #501 ; 0x1f5 + 1f0d3b4: eafffee9 b 1f0cf60 + 1f0d3b8: e30011f6 movw r1, #502 ; 0x1f6 + 1f0d3bc: eafffee7 b 1f0cf60 + 1f0d3c0: e30011f7 movw r1, #503 ; 0x1f7 + 1f0d3c4: eafffee5 b 1f0cf60 + 1f0d3c8: e3a01f7e mov r1, #504 ; 0x1f8 + 1f0d3cc: eafffee3 b 1f0cf60 + 1f0d3d0: e30011f9 movw r1, #505 ; 0x1f9 + 1f0d3d4: eafffee1 b 1f0cf60 + 1f0d3d8: e30011fa movw r1, #506 ; 0x1fa + 1f0d3dc: eafffedf b 1f0cf60 + 1f0d3e0: e5931010 ldr r1, [r3, #16] + 1f0d3e4: e3a09000 mov r9, #0 + 1f0d3e8: e5843000 str r3, [r4] + 1f0d3ec: e6efc072 uxtb ip, r2 + 1f0d3f0: e28d0010 add r0, sp, #16 + 1f0d3f4: e1d173b6 ldrh r7, [r1, #54] ; 0x36 + 1f0d3f8: e5d1e035 ldrb lr, [r1, #53] ; 0x35 + 1f0d3fc: e5d16034 ldrb r6, [r1, #52] ; 0x34 + 1f0d400: e18e7407 orr r7, lr, r7, lsl #8 + 1f0d404: e7e7e452 ubfx lr, r2, #8, #8 + 1f0d408: e1866407 orr r6, r6, r7, lsl #8 + 1f0d40c: e5846008 str r6, [r4, #8] + 1f0d410: e591603c ldr r6, [r1, #60] ; 0x3c + 1f0d414: e5d1803b ldrb r8, [r1, #59] ; 0x3b + 1f0d418: ee806b90 vdup.32 d16, r6 + 1f0d41c: f3e000b0 vshr.u64 d16, d16, #32 + 1f0d420: f2c815b0 vshl.s64 d17, d16, #8 + 1f0d424: ec576b31 vmov r6, r7, d17 + 1f0d428: e1877009 orr r7, r7, r9 + 1f0d42c: e1866008 orr r6, r6, r8 + 1f0d430: e3a09000 mov r9, #0 + 1f0d434: e5d1803a ldrb r8, [r1, #58] ; 0x3a + 1f0d438: e1a07407 lsl r7, r7, #8 + 1f0d43c: e1877c26 orr r7, r7, r6, lsr #24 + 1f0d440: e1a06406 lsl r6, r6, #8 + 1f0d444: e1877009 orr r7, r7, r9 + 1f0d448: e1866008 orr r6, r6, r8 + 1f0d44c: e3a09000 mov r9, #0 + 1f0d450: e5d18039 ldrb r8, [r1, #57] ; 0x39 + 1f0d454: e1a07407 lsl r7, r7, #8 + 1f0d458: e1877c26 orr r7, r7, r6, lsr #24 + 1f0d45c: e1a06406 lsl r6, r6, #8 + 1f0d460: e1877009 orr r7, r7, r9 + 1f0d464: e1866008 orr r6, r6, r8 + 1f0d468: e5d18038 ldrb r8, [r1, #56] ; 0x38 + 1f0d46c: e3a09000 mov r9, #0 + 1f0d470: e1a07407 lsl r7, r7, #8 + 1f0d474: e1877c26 orr r7, r7, r6, lsr #24 + 1f0d478: e1a06406 lsl r6, r6, #8 + 1f0d47c: e1866008 orr r6, r6, r8 + 1f0d480: e1877009 orr r7, r7, r9 + 1f0d484: e1c461f0 strd r6, [r4, #16] + 1f0d488: e7e78852 ubfx r8, r2, #16, #8 + 1f0d48c: e1a02c22 lsr r2, r2, #24 + 1f0d490: e5d11021 ldrb r1, [r1, #33] ; 0x21 + 1f0d494: e3a06000 mov r6, #0 + 1f0d498: e3a09020 mov r9, #32 + 1f0d49c: e3a07001 mov r7, #1 + 1f0d4a0: e2011002 and r1, r1, #2 + 1f0d4a4: e5c41007 strb r1, [r4, #7] + 1f0d4a8: e5931010 ldr r1, [r3, #16] + 1f0d4ac: e5c1c008 strb ip, [r1, #8] + 1f0d4b0: e5c1e009 strb lr, [r1, #9] + 1f0d4b4: e5c1800a strb r8, [r1, #10] + 1f0d4b8: e5c1200b strb r2, [r1, #11] + 1f0d4bc: e5931010 ldr r1, [r3, #16] + 1f0d4c0: e5c16014 strb r6, [r1, #20] + 1f0d4c4: e5931010 ldr r1, [r3, #16] + 1f0d4c8: e5c1c00c strb ip, [r1, #12] + 1f0d4cc: e5c1e00d strb lr, [r1, #13] + 1f0d4d0: e5c1800e strb r8, [r1, #14] + 1f0d4d4: e5c1200f strb r2, [r1, #15] + 1f0d4d8: e5932010 ldr r2, [r3, #16] + 1f0d4dc: e5c26015 strb r6, [r2, #21] + 1f0d4e0: e5932010 ldr r2, [r3, #16] + 1f0d4e4: e5c29004 strb r9, [r2, #4] + 1f0d4e8: e5932010 ldr r2, [r3, #16] + 1f0d4ec: e5c26034 strb r6, [r2, #52] ; 0x34 + 1f0d4f0: e5c26035 strb r6, [r2, #53] ; 0x35 + 1f0d4f4: e5c26036 strb r6, [r2, #54] ; 0x36 + 1f0d4f8: e5c26037 strb r6, [r2, #55] ; 0x37 + 1f0d4fc: e5932010 ldr r2, [r3, #16] + 1f0d500: e5c26038 strb r6, [r2, #56] ; 0x38 + 1f0d504: e5c26039 strb r6, [r2, #57] ; 0x39 + 1f0d508: e5c2603a strb r6, [r2, #58] ; 0x3a + 1f0d50c: e5c2603b strb r6, [r2, #59] ; 0x3b + 1f0d510: e5c2603c strb r6, [r2, #60] ; 0x3c + 1f0d514: e5c2603d strb r6, [r2, #61] ; 0x3d + 1f0d518: e5c2603e strb r6, [r2, #62] ; 0x3e + 1f0d51c: e5c2603f strb r6, [r2, #63] ; 0x3f + 1f0d520: e5932010 ldr r2, [r3, #16] + 1f0d524: e5c26028 strb r6, [r2, #40] ; 0x28 + 1f0d528: e5c26029 strb r6, [r2, #41] ; 0x29 + 1f0d52c: e5c2602a strb r6, [r2, #42] ; 0x2a + 1f0d530: e5c2602b strb r6, [r2, #43] ; 0x2b + 1f0d534: e5c2602c strb r6, [r2, #44] ; 0x2c + 1f0d538: e5c2602d strb r6, [r2, #45] ; 0x2d + 1f0d53c: e5c2602e strb r6, [r2, #46] ; 0x2e + 1f0d540: e5c2602f strb r6, [r2, #47] ; 0x2f + 1f0d544: e5933010 ldr r3, [r3, #16] + 1f0d548: e5c37021 strb r7, [r3, #33] ; 0x21 + 1f0d54c: ebffee80 bl 1f08f54 + 1f0d550: e3500000 cmp r0, #0 + 1f0d554: 1afffdfd bne 1f0cd50 + 1f0d558: e5941008 ldr r1, [r4, #8] + 1f0d55c: e1510006 cmp r1, r6 + 1f0d560: 059d300c ldreq r3, [sp, #12] + 1f0d564: 0afffee2 beq 1f0d0f4 + 1f0d568: e1a02000 mov r2, r0 + 1f0d56c: e1a00004 mov r0, r4 + 1f0d570: ebffe520 bl 1f069f8 + 1f0d574: e59d300c ldr r3, [sp, #12] + 1f0d578: e5942008 ldr r2, [r4, #8] + 1f0d57c: e2422001 sub r2, r2, #1 + 1f0d580: e5832014 str r2, [r3, #20] + 1f0d584: eaffff57 b 1f0d2e8 + +01f0d588 : + 1f0d588: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f0d58c: e1a0c003 mov ip, r3 + 1f0d590: e2505000 subs r5, r0, #0 + 1f0d594: e24dd02c sub sp, sp, #44 ; 0x2c + 1f0d598: e1a08002 mov r8, r2 + 1f0d59c: e58d3004 str r3, [sp, #4] + 1f0d5a0: e3a03000 mov r3, #0 + 1f0d5a4: e58c3000 str r3, [ip] + 1f0d5a8: 0a000005 beq 1f0d5c4 + 1f0d5ac: e5953000 ldr r3, [r5] + 1f0d5b0: e3530000 cmp r3, #0 + 1f0d5b4: 0a000002 beq 1f0d5c4 + 1f0d5b8: e5d32000 ldrb r2, [r3] + 1f0d5bc: e3520000 cmp r2, #0 + 1f0d5c0: 1a000002 bne 1f0d5d0 + 1f0d5c4: e3a00009 mov r0, #9 + 1f0d5c8: e28dd02c add sp, sp, #44 ; 0x2c + 1f0d5cc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0d5d0: e1a04001 mov r4, r1 + 1f0d5d4: e1d520b4 ldrh r2, [r5, #4] + 1f0d5d8: e1d310b6 ldrh r1, [r3, #6] + 1f0d5dc: e1510002 cmp r1, r2 + 1f0d5e0: 1afffff7 bne 1f0d5c4 + 1f0d5e4: e5d30001 ldrb r0, [r3, #1] + 1f0d5e8: eb006434 bl 1f266c0 + 1f0d5ec: e3100001 tst r0, #1 + 1f0d5f0: 1afffff3 bne 1f0d5c4 + 1f0d5f4: e5d50029 ldrb r0, [r5, #41] ; 0x29 + 1f0d5f8: e3500000 cmp r0, #0 + 1f0d5fc: 1afffff1 bne 1f0d5c8 + 1f0d600: e5d53028 ldrb r3, [r5, #40] ; 0x28 + 1f0d604: e3130001 tst r3, #1 + 1f0d608: 03a00007 moveq r0, #7 + 1f0d60c: 0affffed beq 1f0d5c8 + 1f0d610: e1c523d0 ldrd r2, [r5, #48] ; 0x30 + 1f0d614: e1c501d0 ldrd r0, [r5, #16] + 1f0d618: e3a07000 mov r7, #0 + 1f0d61c: e0500002 subs r0, r0, r2 + 1f0d620: e0c11003 sbc r1, r1, r3 + 1f0d624: e1510007 cmp r1, r7 + 1f0d628: 01500008 cmpeq r0, r8 + 1f0d62c: 31a08000 movcc r8, r0 + 1f0d630: e3580000 cmp r8, #0 + 1f0d634: 0a00020d beq 1f0de70 + 1f0d638: e1a01005 mov r1, r5 + 1f0d63c: e2850058 add r0, r5, #88 ; 0x58 + 1f0d640: e58d0018 str r0, [sp, #24] + 1f0d644: e491b048 ldr fp, [r1], #72 ; 0x48 + 1f0d648: e1a0a001 mov sl, r1 + 1f0d64c: e2011007 and r1, r1, #7 + 1f0d650: e2611000 rsb r1, r1, #0 + 1f0d654: e201100f and r1, r1, #15 + 1f0d658: e58d1014 str r1, [sp, #20] + 1f0d65c: e1a00001 mov r0, r1 + 1f0d660: e2611e1f rsb r1, r1, #496 ; 0x1f0 + 1f0d664: e2600c02 rsb r0, r0, #512 ; 0x200 + 1f0d668: e58d0020 str r0, [sp, #32] + 1f0d66c: e1a01221 lsr r1, r1, #4 + 1f0d670: e2811001 add r1, r1, #1 + 1f0d674: e58d1024 str r1, [sp, #36] ; 0x24 + 1f0d678: e1a01201 lsl r1, r1, #4 + 1f0d67c: e58d101c str r1, [sp, #28] + 1f0d680: ea000036 b 1f0d760 + 1f0d684: e1db70ba ldrh r7, [fp, #10] + 1f0d688: e1a004a2 lsr r0, r2, #9 + 1f0d68c: e1800b83 orr r0, r0, r3, lsl #23 + 1f0d690: e2471001 sub r1, r7, #1 + 1f0d694: e0117000 ands r7, r1, r0 + 1f0d698: 15950038 ldrne r0, [r5, #56] ; 0x38 + 1f0d69c: 1a000007 bne 1f0d6c0 + 1f0d6a0: e1923003 orrs r3, r2, r3 + 1f0d6a4: 1a000127 bne 1f0db48 + 1f0d6a8: e5950008 ldr r0, [r5, #8] + 1f0d6ac: e3500001 cmp r0, #1 + 1f0d6b0: 9a0001f0 bls 1f0de78 + 1f0d6b4: e3700001 cmn r0, #1 + 1f0d6b8: 0a0001f1 beq 1f0de84 + 1f0d6bc: e5850038 str r0, [r5, #56] ; 0x38 + 1f0d6c0: e59b302c ldr r3, [fp, #44] ; 0x2c + 1f0d6c4: e2406002 sub r6, r0, #2 + 1f0d6c8: e2433002 sub r3, r3, #2 + 1f0d6cc: e1560003 cmp r6, r3 + 1f0d6d0: 2a0001e8 bcs 1f0de78 + 1f0d6d4: e1db30ba ldrh r3, [fp, #10] + 1f0d6d8: e59b2040 ldr r2, [fp, #64] ; 0x40 + 1f0d6dc: e58d200c str r2, [sp, #12] + 1f0d6e0: e0010693 mul r1, r3, r6 + 1f0d6e4: e58d1008 str r1, [sp, #8] + 1f0d6e8: e0919002 adds r9, r1, r2 + 1f0d6ec: 0a0001e1 beq 1f0de78 + 1f0d6f0: e1b064a8 lsrs r6, r8, #9 + 1f0d6f4: e0879009 add r9, r7, r9 + 1f0d6f8: 0a0000f7 beq 1f0dadc + 1f0d6fc: e0872006 add r2, r7, r6 + 1f0d700: e1a01004 mov r1, r4 + 1f0d704: e1520003 cmp r2, r3 + 1f0d708: e5db0001 ldrb r0, [fp, #1] + 1f0d70c: 80676003 rsbhi r6, r7, r3 + 1f0d710: e1a02009 mov r2, r9 + 1f0d714: e1a03006 mov r3, r6 + 1f0d718: eb0063ec bl 1f266d0 + 1f0d71c: e3500000 cmp r0, #0 + 1f0d720: 1a0001d7 bne 1f0de84 + 1f0d724: e1d532d8 ldrsb r3, [r5, #40] ; 0x28 + 1f0d728: e3530000 cmp r3, #0 + 1f0d72c: ba000109 blt 1f0db58 + 1f0d730: e1a01486 lsl r1, r6, #9 + 1f0d734: e1c523d0 ldrd r2, [r5, #48] ; 0x30 + 1f0d738: e59dc004 ldr ip, [sp, #4] + 1f0d73c: e0844001 add r4, r4, r1 + 1f0d740: e0922001 adds r2, r2, r1 + 1f0d744: e2a33000 adc r3, r3, #0 + 1f0d748: e0588001 subs r8, r8, r1 + 1f0d74c: e59c0000 ldr r0, [ip] + 1f0d750: e1c523f0 strd r2, [r5, #48] ; 0x30 + 1f0d754: e0801001 add r1, r0, r1 + 1f0d758: e58c1000 str r1, [ip] + 1f0d75c: 0a0001c3 beq 1f0de70 + 1f0d760: e30001ff movw r0, #511 ; 0x1ff + 1f0d764: e3a01000 mov r1, #0 + 1f0d768: e0000002 and r0, r0, r2 + 1f0d76c: e0011003 and r1, r1, r3 + 1f0d770: e1901001 orrs r1, r0, r1 + 1f0d774: 0affffc2 beq 1f0d684 + 1f0d778: e7e82052 ubfx r2, r2, #0, #9 + 1f0d77c: e2840010 add r0, r4, #16 + 1f0d780: e2621c02 rsb r1, r2, #512 ; 0x200 + 1f0d784: e282c010 add ip, r2, #16 + 1f0d788: e1510008 cmp r1, r8 + 1f0d78c: e08ac00c add ip, sl, ip + 1f0d790: e08a3002 add r3, sl, r2 + 1f0d794: 21a01008 movcs r1, r8 + 1f0d798: e1530000 cmp r3, r0 + 1f0d79c: 3154000c cmpcc r4, ip + 1f0d7a0: 23a00001 movcs r0, #1 + 1f0d7a4: 33a00000 movcc r0, #0 + 1f0d7a8: e3510015 cmp r1, #21 + 1f0d7ac: 93a00000 movls r0, #0 + 1f0d7b0: 82000001 andhi r0, r0, #1 + 1f0d7b4: e3500000 cmp r0, #0 + 1f0d7b8: 0a0000db beq 1f0db2c + 1f0d7bc: e2030007 and r0, r3, #7 + 1f0d7c0: e2600000 rsb r0, r0, #0 + 1f0d7c4: e200000f and r0, r0, #15 + 1f0d7c8: e1500001 cmp r0, r1 + 1f0d7cc: 21a00001 movcs r0, r1 + 1f0d7d0: e3500000 cmp r0, #0 + 1f0d7d4: 0a0000d0 beq 1f0db1c + 1f0d7d8: e3500001 cmp r0, #1 + 1f0d7dc: e7dac002 ldrb ip, [sl, r2] + 1f0d7e0: e2419001 sub r9, r1, #1 + 1f0d7e4: e5c4c000 strb ip, [r4] + 1f0d7e8: e1a0e009 mov lr, r9 + 1f0d7ec: e284c001 add ip, r4, #1 + 1f0d7f0: e2836001 add r6, r3, #1 + 1f0d7f4: 0a00005e beq 1f0d974 + 1f0d7f8: e3500002 cmp r0, #2 + 1f0d7fc: e5d3c001 ldrb ip, [r3, #1] + 1f0d800: e5c4c001 strb ip, [r4, #1] + 1f0d804: e2836002 add r6, r3, #2 + 1f0d808: e284c002 add ip, r4, #2 + 1f0d80c: e241e002 sub lr, r1, #2 + 1f0d810: 0a000057 beq 1f0d974 + 1f0d814: e3500003 cmp r0, #3 + 1f0d818: e5d3c002 ldrb ip, [r3, #2] + 1f0d81c: e5c4c002 strb ip, [r4, #2] + 1f0d820: e2836003 add r6, r3, #3 + 1f0d824: e284c003 add ip, r4, #3 + 1f0d828: e241e003 sub lr, r1, #3 + 1f0d82c: 0a000050 beq 1f0d974 + 1f0d830: e3500004 cmp r0, #4 + 1f0d834: e5d3c003 ldrb ip, [r3, #3] + 1f0d838: e5c4c003 strb ip, [r4, #3] + 1f0d83c: e2836004 add r6, r3, #4 + 1f0d840: e284c004 add ip, r4, #4 + 1f0d844: e241e004 sub lr, r1, #4 + 1f0d848: 0a000049 beq 1f0d974 + 1f0d84c: e3500005 cmp r0, #5 + 1f0d850: e5d3c004 ldrb ip, [r3, #4] + 1f0d854: e5c4c004 strb ip, [r4, #4] + 1f0d858: e2836005 add r6, r3, #5 + 1f0d85c: e284c005 add ip, r4, #5 + 1f0d860: e241e005 sub lr, r1, #5 + 1f0d864: 0a000042 beq 1f0d974 + 1f0d868: e3500006 cmp r0, #6 + 1f0d86c: e5d3c005 ldrb ip, [r3, #5] + 1f0d870: e5c4c005 strb ip, [r4, #5] + 1f0d874: e2836006 add r6, r3, #6 + 1f0d878: e284c006 add ip, r4, #6 + 1f0d87c: e241e006 sub lr, r1, #6 + 1f0d880: 0a00003b beq 1f0d974 + 1f0d884: e3500007 cmp r0, #7 + 1f0d888: e5d3c006 ldrb ip, [r3, #6] + 1f0d88c: e5c4c006 strb ip, [r4, #6] + 1f0d890: e2836007 add r6, r3, #7 + 1f0d894: e284c007 add ip, r4, #7 + 1f0d898: e241e007 sub lr, r1, #7 + 1f0d89c: 0a000034 beq 1f0d974 + 1f0d8a0: e3500008 cmp r0, #8 + 1f0d8a4: e5d3c007 ldrb ip, [r3, #7] + 1f0d8a8: e5c4c007 strb ip, [r4, #7] + 1f0d8ac: e2836008 add r6, r3, #8 + 1f0d8b0: e284c008 add ip, r4, #8 + 1f0d8b4: e241e008 sub lr, r1, #8 + 1f0d8b8: 0a00002d beq 1f0d974 + 1f0d8bc: e3500009 cmp r0, #9 + 1f0d8c0: e5d3c008 ldrb ip, [r3, #8] + 1f0d8c4: e5c4c008 strb ip, [r4, #8] + 1f0d8c8: e2836009 add r6, r3, #9 + 1f0d8cc: e284c009 add ip, r4, #9 + 1f0d8d0: e241e009 sub lr, r1, #9 + 1f0d8d4: 0a000026 beq 1f0d974 + 1f0d8d8: e350000a cmp r0, #10 + 1f0d8dc: e5d3c009 ldrb ip, [r3, #9] + 1f0d8e0: e5c4c009 strb ip, [r4, #9] + 1f0d8e4: e283600a add r6, r3, #10 + 1f0d8e8: e284c00a add ip, r4, #10 + 1f0d8ec: e241e00a sub lr, r1, #10 + 1f0d8f0: 0a00001f beq 1f0d974 + 1f0d8f4: e350000b cmp r0, #11 + 1f0d8f8: e5d3c00a ldrb ip, [r3, #10] + 1f0d8fc: e5c4c00a strb ip, [r4, #10] + 1f0d900: e283600b add r6, r3, #11 + 1f0d904: e284c00b add ip, r4, #11 + 1f0d908: e241e00b sub lr, r1, #11 + 1f0d90c: 0a000018 beq 1f0d974 + 1f0d910: e350000c cmp r0, #12 + 1f0d914: e5d3c00b ldrb ip, [r3, #11] + 1f0d918: e5c4c00b strb ip, [r4, #11] + 1f0d91c: e283600c add r6, r3, #12 + 1f0d920: e284c00c add ip, r4, #12 + 1f0d924: e241e00c sub lr, r1, #12 + 1f0d928: 0a000011 beq 1f0d974 + 1f0d92c: e350000d cmp r0, #13 + 1f0d930: e5d3c00c ldrb ip, [r3, #12] + 1f0d934: e5c4c00c strb ip, [r4, #12] + 1f0d938: e283600d add r6, r3, #13 + 1f0d93c: e284c00d add ip, r4, #13 + 1f0d940: e241e00d sub lr, r1, #13 + 1f0d944: 0a00000a beq 1f0d974 + 1f0d948: e5d3c00d ldrb ip, [r3, #13] + 1f0d94c: e350000f cmp r0, #15 + 1f0d950: e5c4c00d strb ip, [r4, #13] + 1f0d954: e284c00e add ip, r4, #14 + 1f0d958: e283600e add r6, r3, #14 + 1f0d95c: e241e00e sub lr, r1, #14 + 1f0d960: 05d3c00e ldrbeq ip, [r3, #14] + 1f0d964: 0283600f addeq r6, r3, #15 + 1f0d968: 05c4c00e strbeq ip, [r4, #14] + 1f0d96c: 0241e00f subeq lr, r1, #15 + 1f0d970: 0284c00f addeq ip, r4, #15 + 1f0d974: e1a03006 mov r3, r6 + 1f0d978: e0607001 rsb r7, r0, r1 + 1f0d97c: e0609009 rsb r9, r0, r9 + 1f0d980: e2476010 sub r6, r7, #16 + 1f0d984: e359000e cmp r9, #14 + 1f0d988: e1a06226 lsr r6, r6, #4 + 1f0d98c: e2866001 add r6, r6, #1 + 1f0d990: e1a09206 lsl r9, r6, #4 + 1f0d994: 9a000016 bls 1f0d9f4 + 1f0d998: e0822000 add r2, r2, r0 + 1f0d99c: e58d3010 str r3, [sp, #16] + 1f0d9a0: e08a2002 add r2, sl, r2 + 1f0d9a4: e58d2008 str r2, [sp, #8] + 1f0d9a8: e3a02000 mov r2, #0 + 1f0d9ac: e58d200c str r2, [sp, #12] + 1f0d9b0: e59d300c ldr r3, [sp, #12] + 1f0d9b4: e0840000 add r0, r4, r0 + 1f0d9b8: e59d2008 ldr r2, [sp, #8] + 1f0d9bc: f4620adf vld1.64 {d16-d17}, [r2 :64] + 1f0d9c0: e2833001 add r3, r3, #1 + 1f0d9c4: e1530006 cmp r3, r6 + 1f0d9c8: e58d300c str r3, [sp, #12] + 1f0d9cc: e2822010 add r2, r2, #16 + 1f0d9d0: f4400a0f vst1.8 {d16-d17}, [r0] + 1f0d9d4: e2800010 add r0, r0, #16 + 1f0d9d8: 3afffff7 bcc 1f0d9bc + 1f0d9dc: e59d3010 ldr r3, [sp, #16] + 1f0d9e0: e1570009 cmp r7, r9 + 1f0d9e4: e069e00e rsb lr, r9, lr + 1f0d9e8: e08cc009 add ip, ip, r9 + 1f0d9ec: e0833009 add r3, r3, r9 + 1f0d9f0: 0affff4f beq 1f0d734 + 1f0d9f4: e35e0001 cmp lr, #1 + 1f0d9f8: e5d32000 ldrb r2, [r3] + 1f0d9fc: e5cc2000 strb r2, [ip] + 1f0da00: 0affff4b beq 1f0d734 + 1f0da04: e35e0002 cmp lr, #2 + 1f0da08: e5d32001 ldrb r2, [r3, #1] + 1f0da0c: e5cc2001 strb r2, [ip, #1] + 1f0da10: 0affff47 beq 1f0d734 + 1f0da14: e35e0003 cmp lr, #3 + 1f0da18: e5d32002 ldrb r2, [r3, #2] + 1f0da1c: e5cc2002 strb r2, [ip, #2] + 1f0da20: 0affff43 beq 1f0d734 + 1f0da24: e35e0004 cmp lr, #4 + 1f0da28: e5d32003 ldrb r2, [r3, #3] + 1f0da2c: e5cc2003 strb r2, [ip, #3] + 1f0da30: 0affff3f beq 1f0d734 + 1f0da34: e35e0005 cmp lr, #5 + 1f0da38: e5d32004 ldrb r2, [r3, #4] + 1f0da3c: e5cc2004 strb r2, [ip, #4] + 1f0da40: 0affff3b beq 1f0d734 + 1f0da44: e35e0006 cmp lr, #6 + 1f0da48: e5d32005 ldrb r2, [r3, #5] + 1f0da4c: e5cc2005 strb r2, [ip, #5] + 1f0da50: 0affff37 beq 1f0d734 + 1f0da54: e35e0007 cmp lr, #7 + 1f0da58: e5d32006 ldrb r2, [r3, #6] + 1f0da5c: e5cc2006 strb r2, [ip, #6] + 1f0da60: 0affff33 beq 1f0d734 + 1f0da64: e35e0008 cmp lr, #8 + 1f0da68: e5d32007 ldrb r2, [r3, #7] + 1f0da6c: e5cc2007 strb r2, [ip, #7] + 1f0da70: 0affff2f beq 1f0d734 + 1f0da74: e35e0009 cmp lr, #9 + 1f0da78: e5d32008 ldrb r2, [r3, #8] + 1f0da7c: e5cc2008 strb r2, [ip, #8] + 1f0da80: 0affff2b beq 1f0d734 + 1f0da84: e35e000a cmp lr, #10 + 1f0da88: e5d32009 ldrb r2, [r3, #9] + 1f0da8c: e5cc2009 strb r2, [ip, #9] + 1f0da90: 0affff27 beq 1f0d734 + 1f0da94: e35e000b cmp lr, #11 + 1f0da98: e5d3200a ldrb r2, [r3, #10] + 1f0da9c: e5cc200a strb r2, [ip, #10] + 1f0daa0: 0affff23 beq 1f0d734 + 1f0daa4: e35e000c cmp lr, #12 + 1f0daa8: e5d3200b ldrb r2, [r3, #11] + 1f0daac: e5cc200b strb r2, [ip, #11] + 1f0dab0: 0affff1f beq 1f0d734 + 1f0dab4: e35e000d cmp lr, #13 + 1f0dab8: e5d3200c ldrb r2, [r3, #12] + 1f0dabc: e5cc200c strb r2, [ip, #12] + 1f0dac0: 0affff1b beq 1f0d734 + 1f0dac4: e5d3200d ldrb r2, [r3, #13] + 1f0dac8: e35e000e cmp lr, #14 + 1f0dacc: e5cc200d strb r2, [ip, #13] + 1f0dad0: 15d3300e ldrbne r3, [r3, #14] + 1f0dad4: 15cc300e strbne r3, [ip, #14] + 1f0dad8: eaffff15 b 1f0d734 + 1f0dadc: e595203c ldr r2, [r5, #60] ; 0x3c + 1f0dae0: e1590002 cmp r9, r2 + 1f0dae4: 0a000009 beq 1f0db10 + 1f0dae8: e1d532d8 ldrsb r3, [r5, #40] ; 0x28 + 1f0daec: e3530000 cmp r3, #0 + 1f0daf0: ba0000d4 blt 1f0de48 + 1f0daf4: e3a03001 mov r3, #1 + 1f0daf8: e1a02009 mov r2, r9 + 1f0dafc: e1a0100a mov r1, sl + 1f0db00: e5db0001 ldrb r0, [fp, #1] + 1f0db04: eb0062f1 bl 1f266d0 + 1f0db08: e3500000 cmp r0, #0 + 1f0db0c: 1a0000dc bne 1f0de84 + 1f0db10: e1c523d0 ldrd r2, [r5, #48] ; 0x30 + 1f0db14: e585903c str r9, [r5, #60] ; 0x3c + 1f0db18: eaffff16 b 1f0d778 + 1f0db1c: e1a0c004 mov ip, r4 + 1f0db20: e1a0e001 mov lr, r1 + 1f0db24: e2419001 sub r9, r1, #1 + 1f0db28: eaffff92 b 1f0d978 + 1f0db2c: e2442001 sub r2, r4, #1 + 1f0db30: e083c001 add ip, r3, r1 + 1f0db34: e4d30001 ldrb r0, [r3], #1 + 1f0db38: e5e20001 strb r0, [r2, #1]! + 1f0db3c: e153000c cmp r3, ip + 1f0db40: 1afffffb bne 1f0db34 + 1f0db44: eafffefa b 1f0d734 + 1f0db48: e5951038 ldr r1, [r5, #56] ; 0x38 + 1f0db4c: e1a00005 mov r0, r5 + 1f0db50: ebffe5c1 bl 1f0725c + 1f0db54: eafffed4 b 1f0d6ac + 1f0db58: e595203c ldr r2, [r5, #60] ; 0x3c + 1f0db5c: e0699002 rsb r9, r9, r2 + 1f0db60: e1560009 cmp r6, r9 + 1f0db64: 9afffef1 bls 1f0d730 + 1f0db68: e59d300c ldr r3, [sp, #12] + 1f0db6c: e59d1008 ldr r1, [sp, #8] + 1f0db70: e0632002 rsb r2, r3, r2 + 1f0db74: e59dc018 ldr ip, [sp, #24] + 1f0db78: e0672002 rsb r2, r7, r2 + 1f0db7c: e0843489 add r3, r4, r9, lsl #9 + 1f0db80: e0612002 rsb r2, r1, r2 + 1f0db84: e1a02482 lsl r2, r2, #9 + 1f0db88: e2821010 add r1, r2, #16 + 1f0db8c: e0840002 add r0, r4, r2 + 1f0db90: e0841001 add r1, r4, r1 + 1f0db94: e150000c cmp r0, ip + 1f0db98: 315a0001 cmpcc sl, r1 + 1f0db9c: 3a0000be bcc 1f0de9c + 1f0dba0: e59d0014 ldr r0, [sp, #20] + 1f0dba4: e3500000 cmp r0, #0 + 1f0dba8: 0a0000b8 beq 1f0de90 + 1f0dbac: e3500001 cmp r0, #1 + 1f0dbb0: e5d51048 ldrb r1, [r5, #72] ; 0x48 + 1f0dbb4: e5c31000 strb r1, [r3] + 1f0dbb8: e285c049 add ip, r5, #73 ; 0x49 + 1f0dbbc: e2831001 add r1, r3, #1 + 1f0dbc0: 0a0000e4 beq 1f0df58 + 1f0dbc4: e3500002 cmp r0, #2 + 1f0dbc8: e5d51049 ldrb r1, [r5, #73] ; 0x49 + 1f0dbcc: e5c31001 strb r1, [r3, #1] + 1f0dbd0: e285c04a add ip, r5, #74 ; 0x4a + 1f0dbd4: e2831002 add r1, r3, #2 + 1f0dbd8: 0a0000db beq 1f0df4c + 1f0dbdc: e3500003 cmp r0, #3 + 1f0dbe0: e5d5104a ldrb r1, [r5, #74] ; 0x4a + 1f0dbe4: e5c31002 strb r1, [r3, #2] + 1f0dbe8: e285c04b add ip, r5, #75 ; 0x4b + 1f0dbec: e2831003 add r1, r3, #3 + 1f0dbf0: 0a0000d2 beq 1f0df40 + 1f0dbf4: e3500004 cmp r0, #4 + 1f0dbf8: e5d5104b ldrb r1, [r5, #75] ; 0x4b + 1f0dbfc: e5c31003 strb r1, [r3, #3] + 1f0dc00: e285c04c add ip, r5, #76 ; 0x4c + 1f0dc04: e2831004 add r1, r3, #4 + 1f0dc08: 0a0000c9 beq 1f0df34 + 1f0dc0c: e3500005 cmp r0, #5 + 1f0dc10: e5d5104c ldrb r1, [r5, #76] ; 0x4c + 1f0dc14: e5c31004 strb r1, [r3, #4] + 1f0dc18: e285c04d add ip, r5, #77 ; 0x4d + 1f0dc1c: e2831005 add r1, r3, #5 + 1f0dc20: 0a0000c0 beq 1f0df28 + 1f0dc24: e3500006 cmp r0, #6 + 1f0dc28: e5d5104d ldrb r1, [r5, #77] ; 0x4d + 1f0dc2c: e5c31005 strb r1, [r3, #5] + 1f0dc30: e285c04e add ip, r5, #78 ; 0x4e + 1f0dc34: e2831006 add r1, r3, #6 + 1f0dc38: 0a0000b7 beq 1f0df1c + 1f0dc3c: e3500007 cmp r0, #7 + 1f0dc40: e5d5104e ldrb r1, [r5, #78] ; 0x4e + 1f0dc44: e5c31006 strb r1, [r3, #6] + 1f0dc48: e285c04f add ip, r5, #79 ; 0x4f + 1f0dc4c: e2831007 add r1, r3, #7 + 1f0dc50: 0a0000ae beq 1f0df10 + 1f0dc54: e3500008 cmp r0, #8 + 1f0dc58: e5d5104f ldrb r1, [r5, #79] ; 0x4f + 1f0dc5c: e5c31007 strb r1, [r3, #7] + 1f0dc60: e285c050 add ip, r5, #80 ; 0x50 + 1f0dc64: e2831008 add r1, r3, #8 + 1f0dc68: 0a0000a5 beq 1f0df04 + 1f0dc6c: e3500009 cmp r0, #9 + 1f0dc70: e5d51050 ldrb r1, [r5, #80] ; 0x50 + 1f0dc74: e5c31008 strb r1, [r3, #8] + 1f0dc78: e285c051 add ip, r5, #81 ; 0x51 + 1f0dc7c: e2831009 add r1, r3, #9 + 1f0dc80: 0a00009c beq 1f0def8 + 1f0dc84: e350000a cmp r0, #10 + 1f0dc88: e5d51051 ldrb r1, [r5, #81] ; 0x51 + 1f0dc8c: e5c31009 strb r1, [r3, #9] + 1f0dc90: e285c052 add ip, r5, #82 ; 0x52 + 1f0dc94: e283100a add r1, r3, #10 + 1f0dc98: 0a000093 beq 1f0deec + 1f0dc9c: e350000b cmp r0, #11 + 1f0dca0: e5d51052 ldrb r1, [r5, #82] ; 0x52 + 1f0dca4: e5c3100a strb r1, [r3, #10] + 1f0dca8: e285c053 add ip, r5, #83 ; 0x53 + 1f0dcac: e283100b add r1, r3, #11 + 1f0dcb0: 0a00008a beq 1f0dee0 + 1f0dcb4: e350000c cmp r0, #12 + 1f0dcb8: e5d51053 ldrb r1, [r5, #83] ; 0x53 + 1f0dcbc: e5c3100b strb r1, [r3, #11] + 1f0dcc0: e285c054 add ip, r5, #84 ; 0x54 + 1f0dcc4: e283100c add r1, r3, #12 + 1f0dcc8: 0a000081 beq 1f0ded4 + 1f0dccc: e350000d cmp r0, #13 + 1f0dcd0: e5d51054 ldrb r1, [r5, #84] ; 0x54 + 1f0dcd4: e5c3100c strb r1, [r3, #12] + 1f0dcd8: e285c055 add ip, r5, #85 ; 0x55 + 1f0dcdc: e283100d add r1, r3, #13 + 1f0dce0: 0a000078 beq 1f0dec8 + 1f0dce4: e350000f cmp r0, #15 + 1f0dce8: e5d51055 ldrb r1, [r5, #85] ; 0x55 + 1f0dcec: e5c3100d strb r1, [r3, #13] + 1f0dcf0: e285c056 add ip, r5, #86 ; 0x56 + 1f0dcf4: e283100e add r1, r3, #14 + 1f0dcf8: 1a00006f bne 1f0debc + 1f0dcfc: e5d51056 ldrb r1, [r5, #86] ; 0x56 + 1f0dd00: e285c057 add ip, r5, #87 ; 0x57 + 1f0dd04: e5c3100e strb r1, [r3, #14] + 1f0dd08: e30001f1 movw r0, #497 ; 0x1f1 + 1f0dd0c: e283300f add r3, r3, #15 + 1f0dd10: e59d1014 ldr r1, [sp, #20] + 1f0dd14: e3a0e000 mov lr, #0 + 1f0dd18: e59d7024 ldr r7, [sp, #36] ; 0x24 + 1f0dd1c: e0812002 add r2, r1, r2 + 1f0dd20: e08a1001 add r1, sl, r1 + 1f0dd24: e0842002 add r2, r4, r2 + 1f0dd28: f4610adf vld1.64 {d16-d17}, [r1 :64] + 1f0dd2c: e28ee001 add lr, lr, #1 + 1f0dd30: e157000e cmp r7, lr + 1f0dd34: e2811010 add r1, r1, #16 + 1f0dd38: f4420a0f vst1.8 {d16-d17}, [r2] + 1f0dd3c: e2822010 add r2, r2, #16 + 1f0dd40: 8afffff8 bhi 1f0dd28 + 1f0dd44: e59de01c ldr lr, [sp, #28] + 1f0dd48: e59d1020 ldr r1, [sp, #32] + 1f0dd4c: e06e0000 rsb r0, lr, r0 + 1f0dd50: e083200e add r2, r3, lr + 1f0dd54: e15e0001 cmp lr, r1 + 1f0dd58: e08c100e add r1, ip, lr + 1f0dd5c: 0afffe73 beq 1f0d730 + 1f0dd60: e3500001 cmp r0, #1 + 1f0dd64: e7dcc00e ldrb ip, [ip, lr] + 1f0dd68: e7c3c00e strb ip, [r3, lr] + 1f0dd6c: 0afffe6f beq 1f0d730 + 1f0dd70: e3500002 cmp r0, #2 + 1f0dd74: e5d13001 ldrb r3, [r1, #1] + 1f0dd78: e5c23001 strb r3, [r2, #1] + 1f0dd7c: 0afffe6b beq 1f0d730 + 1f0dd80: e3500003 cmp r0, #3 + 1f0dd84: e5d13002 ldrb r3, [r1, #2] + 1f0dd88: e5c23002 strb r3, [r2, #2] + 1f0dd8c: 0afffe67 beq 1f0d730 + 1f0dd90: e3500004 cmp r0, #4 + 1f0dd94: e5d13003 ldrb r3, [r1, #3] + 1f0dd98: e5c23003 strb r3, [r2, #3] + 1f0dd9c: 0afffe63 beq 1f0d730 + 1f0dda0: e3500005 cmp r0, #5 + 1f0dda4: e5d13004 ldrb r3, [r1, #4] + 1f0dda8: e5c23004 strb r3, [r2, #4] + 1f0ddac: 0afffe5f beq 1f0d730 + 1f0ddb0: e3500006 cmp r0, #6 + 1f0ddb4: e5d13005 ldrb r3, [r1, #5] + 1f0ddb8: e5c23005 strb r3, [r2, #5] + 1f0ddbc: 0afffe5b beq 1f0d730 + 1f0ddc0: e3500007 cmp r0, #7 + 1f0ddc4: e5d13006 ldrb r3, [r1, #6] + 1f0ddc8: e5c23006 strb r3, [r2, #6] + 1f0ddcc: 0afffe57 beq 1f0d730 + 1f0ddd0: e3500008 cmp r0, #8 + 1f0ddd4: e5d13007 ldrb r3, [r1, #7] + 1f0ddd8: e5c23007 strb r3, [r2, #7] + 1f0dddc: 0afffe53 beq 1f0d730 + 1f0dde0: e3500009 cmp r0, #9 + 1f0dde4: e5d13008 ldrb r3, [r1, #8] + 1f0dde8: e5c23008 strb r3, [r2, #8] + 1f0ddec: 0afffe4f beq 1f0d730 + 1f0ddf0: e350000a cmp r0, #10 + 1f0ddf4: e5d13009 ldrb r3, [r1, #9] + 1f0ddf8: e5c23009 strb r3, [r2, #9] + 1f0ddfc: 0afffe4b beq 1f0d730 + 1f0de00: e350000b cmp r0, #11 + 1f0de04: e5d1300a ldrb r3, [r1, #10] + 1f0de08: e5c2300a strb r3, [r2, #10] + 1f0de0c: 0afffe47 beq 1f0d730 + 1f0de10: e350000c cmp r0, #12 + 1f0de14: e5d1300b ldrb r3, [r1, #11] + 1f0de18: e5c2300b strb r3, [r2, #11] + 1f0de1c: 0afffe43 beq 1f0d730 + 1f0de20: e350000d cmp r0, #13 + 1f0de24: e5d1300c ldrb r3, [r1, #12] + 1f0de28: e5c2300c strb r3, [r2, #12] + 1f0de2c: 0afffe3f beq 1f0d730 + 1f0de30: e5d1300d ldrb r3, [r1, #13] + 1f0de34: e350000e cmp r0, #14 + 1f0de38: e5c2300d strb r3, [r2, #13] + 1f0de3c: 15d1300e ldrbne r3, [r1, #14] + 1f0de40: 15c2300e strbne r3, [r2, #14] + 1f0de44: eafffe39 b 1f0d730 + 1f0de48: e3a03001 mov r3, #1 + 1f0de4c: e1a0100a mov r1, sl + 1f0de50: e5db0001 ldrb r0, [fp, #1] + 1f0de54: eb00623b bl 1f26748 + 1f0de58: e3500000 cmp r0, #0 + 1f0de5c: 1a000008 bne 1f0de84 + 1f0de60: e5d53028 ldrb r3, [r5, #40] ; 0x28 + 1f0de64: e203307f and r3, r3, #127 ; 0x7f + 1f0de68: e5c53028 strb r3, [r5, #40] ; 0x28 + 1f0de6c: eaffff20 b 1f0daf4 + 1f0de70: e3a00000 mov r0, #0 + 1f0de74: eafffdd3 b 1f0d5c8 + 1f0de78: e3a00002 mov r0, #2 + 1f0de7c: e5c50029 strb r0, [r5, #41] ; 0x29 + 1f0de80: eafffdd0 b 1f0d5c8 + 1f0de84: e3a00001 mov r0, #1 + 1f0de88: e5c50029 strb r0, [r5, #41] ; 0x29 + 1f0de8c: eafffdcd b 1f0d5c8 + 1f0de90: e1a0c00a mov ip, sl + 1f0de94: e3a00c02 mov r0, #512 ; 0x200 + 1f0de98: eaffff9c b 1f0dd10 + 1f0de9c: e2433001 sub r3, r3, #1 + 1f0dea0: e2850f92 add r0, r5, #584 ; 0x248 + 1f0dea4: e1a0200a mov r2, sl + 1f0dea8: e4d21001 ldrb r1, [r2], #1 + 1f0deac: e5e31001 strb r1, [r3, #1]! + 1f0deb0: e1520000 cmp r2, r0 + 1f0deb4: 1afffffb bne 1f0dea8 + 1f0deb8: eafffe1c b 1f0d730 + 1f0debc: e1a03001 mov r3, r1 + 1f0dec0: e30001f2 movw r0, #498 ; 0x1f2 + 1f0dec4: eaffff91 b 1f0dd10 + 1f0dec8: e1a03001 mov r3, r1 + 1f0decc: e30001f3 movw r0, #499 ; 0x1f3 + 1f0ded0: eaffff8e b 1f0dd10 + 1f0ded4: e1a03001 mov r3, r1 + 1f0ded8: e3a00f7d mov r0, #500 ; 0x1f4 + 1f0dedc: eaffff8b b 1f0dd10 + 1f0dee0: e1a03001 mov r3, r1 + 1f0dee4: e30001f5 movw r0, #501 ; 0x1f5 + 1f0dee8: eaffff88 b 1f0dd10 + 1f0deec: e1a03001 mov r3, r1 + 1f0def0: e30001f6 movw r0, #502 ; 0x1f6 + 1f0def4: eaffff85 b 1f0dd10 + 1f0def8: e1a03001 mov r3, r1 + 1f0defc: e30001f7 movw r0, #503 ; 0x1f7 + 1f0df00: eaffff82 b 1f0dd10 + 1f0df04: e1a03001 mov r3, r1 + 1f0df08: e3a00f7e mov r0, #504 ; 0x1f8 + 1f0df0c: eaffff7f b 1f0dd10 + 1f0df10: e1a03001 mov r3, r1 + 1f0df14: e30001f9 movw r0, #505 ; 0x1f9 + 1f0df18: eaffff7c b 1f0dd10 + 1f0df1c: e1a03001 mov r3, r1 + 1f0df20: e30001fa movw r0, #506 ; 0x1fa + 1f0df24: eaffff79 b 1f0dd10 + 1f0df28: e1a03001 mov r3, r1 + 1f0df2c: e30001fb movw r0, #507 ; 0x1fb + 1f0df30: eaffff76 b 1f0dd10 + 1f0df34: e1a03001 mov r3, r1 + 1f0df38: e3a00f7f mov r0, #508 ; 0x1fc + 1f0df3c: eaffff73 b 1f0dd10 + 1f0df40: e1a03001 mov r3, r1 + 1f0df44: e30001fd movw r0, #509 ; 0x1fd + 1f0df48: eaffff70 b 1f0dd10 + 1f0df4c: e1a03001 mov r3, r1 + 1f0df50: e30001fe movw r0, #510 ; 0x1fe + 1f0df54: eaffff6d b 1f0dd10 + 1f0df58: e1a03001 mov r3, r1 + 1f0df5c: e30001ff movw r0, #511 ; 0x1ff + 1f0df60: eaffff6a b 1f0dd10 + +01f0df64 : + 1f0df64: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f0df68: e1a0c003 mov ip, r3 + 1f0df6c: e2505000 subs r5, r0, #0 + 1f0df70: e24dd00c sub sp, sp, #12 + 1f0df74: e1a06002 mov r6, r2 + 1f0df78: e58d3000 str r3, [sp] + 1f0df7c: e3a03000 mov r3, #0 + 1f0df80: e58c3000 str r3, [ip] + 1f0df84: 0a000005 beq 1f0dfa0 + 1f0df88: e5953000 ldr r3, [r5] + 1f0df8c: e3530000 cmp r3, #0 + 1f0df90: 0a000002 beq 1f0dfa0 + 1f0df94: e5d32000 ldrb r2, [r3] + 1f0df98: e3520000 cmp r2, #0 + 1f0df9c: 1a000002 bne 1f0dfac + 1f0dfa0: e3a00009 mov r0, #9 + 1f0dfa4: e28dd00c add sp, sp, #12 + 1f0dfa8: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0dfac: e1a04001 mov r4, r1 + 1f0dfb0: e1d520b4 ldrh r2, [r5, #4] + 1f0dfb4: e1d310b6 ldrh r1, [r3, #6] + 1f0dfb8: e1510002 cmp r1, r2 + 1f0dfbc: 1afffff7 bne 1f0dfa0 + 1f0dfc0: e5d30001 ldrb r0, [r3, #1] + 1f0dfc4: eb0061bd bl 1f266c0 + 1f0dfc8: e3100001 tst r0, #1 + 1f0dfcc: 1afffff3 bne 1f0dfa0 + 1f0dfd0: e5d50029 ldrb r0, [r5, #41] ; 0x29 + 1f0dfd4: e3500000 cmp r0, #0 + 1f0dfd8: 1afffff1 bne 1f0dfa4 + 1f0dfdc: e5d53028 ldrb r3, [r5, #40] ; 0x28 + 1f0dfe0: e3130002 tst r3, #2 + 1f0dfe4: 03a00007 moveq r0, #7 + 1f0dfe8: 0affffed beq 1f0dfa4 + 1f0dfec: e595b000 ldr fp, [r5] + 1f0dff0: e5db2000 ldrb r2, [fp] + 1f0dff4: e3520004 cmp r2, #4 + 1f0dff8: 0a000002 beq 1f0e008 + 1f0dffc: e5952030 ldr r2, [r5, #48] ; 0x30 + 1f0e000: e1760002 cmn r6, r2 + 1f0e004: 21e06002 mvncs r6, r2 + 1f0e008: e3560000 cmp r6, #0 + 1f0e00c: 0a000144 beq 1f0e524 + 1f0e010: e1c523d0 ldrd r2, [r5, #48] ; 0x30 + 1f0e014: ea000045 b 1f0e130 + 1f0e018: e1db90ba ldrh r9, [fp, #10] + 1f0e01c: e1a004a2 lsr r0, r2, #9 + 1f0e020: e1800b83 orr r0, r0, r3, lsl #23 + 1f0e024: e2491001 sub r1, r9, #1 + 1f0e028: e0119000 ands r9, r1, r0 + 1f0e02c: 1a00000c bne 1f0e064 + 1f0e030: e1923003 orrs r3, r2, r3 + 1f0e034: 1a000134 bne 1f0e50c + 1f0e038: e5950008 ldr r0, [r5, #8] + 1f0e03c: e3500000 cmp r0, #0 + 1f0e040: 0a000206 beq 1f0e860 + 1f0e044: e3500001 cmp r0, #1 + 1f0e048: 0a00021b beq 1f0e8bc + 1f0e04c: e3700001 cmn r0, #1 + 1f0e050: 0a000216 beq 1f0e8b0 + 1f0e054: e5953008 ldr r3, [r5, #8] + 1f0e058: e5850038 str r0, [r5, #56] ; 0x38 + 1f0e05c: e3530000 cmp r3, #0 + 1f0e060: 05850008 streq r0, [r5, #8] + 1f0e064: e1d532d8 ldrsb r3, [r5, #40] ; 0x28 + 1f0e068: e3530000 cmp r3, #0 + 1f0e06c: ba0001f0 blt 1f0e834 + 1f0e070: e595a038 ldr sl, [r5, #56] ; 0x38 + 1f0e074: e59b302c ldr r3, [fp, #44] ; 0x2c + 1f0e078: e24aa002 sub sl, sl, #2 + 1f0e07c: e2433002 sub r3, r3, #2 + 1f0e080: e15a0003 cmp sl, r3 + 1f0e084: 2a00020c bcs 1f0e8bc + 1f0e088: e1db30ba ldrh r3, [fp, #10] + 1f0e08c: e59b2040 ldr r2, [fp, #64] ; 0x40 + 1f0e090: e58d2004 str r2, [sp, #4] + 1f0e094: e00a0a93 mul sl, r3, sl + 1f0e098: e09a8002 adds r8, sl, r2 + 1f0e09c: 0a000206 beq 1f0e8bc + 1f0e0a0: e1b074a6 lsrs r7, r6, #9 + 1f0e0a4: e0898008 add r8, r9, r8 + 1f0e0a8: 0a000101 beq 1f0e4b4 + 1f0e0ac: e0892007 add r2, r9, r7 + 1f0e0b0: e1a01004 mov r1, r4 + 1f0e0b4: e1520003 cmp r2, r3 + 1f0e0b8: e5db0001 ldrb r0, [fp, #1] + 1f0e0bc: 80697003 rsbhi r7, r9, r3 + 1f0e0c0: e1a02008 mov r2, r8 + 1f0e0c4: e1a03007 mov r3, r7 + 1f0e0c8: eb00619e bl 1f26748 + 1f0e0cc: e3500000 cmp r0, #0 + 1f0e0d0: 1a0001f6 bne 1f0e8b0 + 1f0e0d4: e595303c ldr r3, [r5, #60] ; 0x3c + 1f0e0d8: e0688003 rsb r8, r8, r3 + 1f0e0dc: e1570008 cmp r7, r8 + 1f0e0e0: 8a000113 bhi 1f0e534 + 1f0e0e4: e1a07487 lsl r7, r7, #9 + 1f0e0e8: e084c007 add ip, r4, r7 + 1f0e0ec: e1c523d0 ldrd r2, [r5, #48] ; 0x30 + 1f0e0f0: e1c501d0 ldrd r0, [r5, #16] + 1f0e0f4: e0922007 adds r2, r2, r7 + 1f0e0f8: e59de000 ldr lr, [sp] + 1f0e0fc: e2a33000 adc r3, r3, #0 + 1f0e100: e1a0400c mov r4, ip + 1f0e104: e1510003 cmp r1, r3 + 1f0e108: 01500002 cmpeq r0, r2 + 1f0e10c: e59ec000 ldr ip, [lr] + 1f0e110: 31a00002 movcc r0, r2 + 1f0e114: 31a01003 movcc r1, r3 + 1f0e118: e0566007 subs r6, r6, r7 + 1f0e11c: e08c7007 add r7, ip, r7 + 1f0e120: e1c523f0 strd r2, [r5, #48] ; 0x30 + 1f0e124: e1c501f0 strd r0, [r5, #16] + 1f0e128: e58e7000 str r7, [lr] + 1f0e12c: 0a0000fb beq 1f0e520 + 1f0e130: e30001ff movw r0, #511 ; 0x1ff + 1f0e134: e3a01000 mov r1, #0 + 1f0e138: e0000002 and r0, r0, r2 + 1f0e13c: e0011003 and r1, r1, r3 + 1f0e140: e1901001 orrs r1, r0, r1 + 1f0e144: 0affffb3 beq 1f0e018 + 1f0e148: e2859048 add r9, r5, #72 ; 0x48 + 1f0e14c: e7e82052 ubfx r2, r2, #0, #9 + 1f0e150: e2841010 add r1, r4, #16 + 1f0e154: e2627c02 rsb r7, r2, #512 ; 0x200 + 1f0e158: e2820010 add r0, r2, #16 + 1f0e15c: e1570006 cmp r7, r6 + 1f0e160: e0890000 add r0, r9, r0 + 1f0e164: e0893002 add r3, r9, r2 + 1f0e168: 21a07006 movcs r7, r6 + 1f0e16c: e1530001 cmp r3, r1 + 1f0e170: 31540000 cmpcc r4, r0 + 1f0e174: 23a01001 movcs r1, #1 + 1f0e178: 33a01000 movcc r1, #0 + 1f0e17c: e3570015 cmp r7, #21 + 1f0e180: 93a01000 movls r1, #0 + 1f0e184: 82011001 andhi r1, r1, #1 + 1f0e188: e3510000 cmp r1, #0 + 1f0e18c: 0a0000d7 beq 1f0e4f0 + 1f0e190: e2041007 and r1, r4, #7 + 1f0e194: e2611000 rsb r1, r1, #0 + 1f0e198: e201100f and r1, r1, #15 + 1f0e19c: e1510007 cmp r1, r7 + 1f0e1a0: 21a01007 movcs r1, r7 + 1f0e1a4: e3510000 cmp r1, #0 + 1f0e1a8: 0a0000cc beq 1f0e4e0 + 1f0e1ac: e3510001 cmp r1, #1 + 1f0e1b0: e5d40000 ldrb r0, [r4] + 1f0e1b4: e2478001 sub r8, r7, #1 + 1f0e1b8: e5c30000 strb r0, [r3] + 1f0e1bc: e1a0c008 mov ip, r8 + 1f0e1c0: e283e001 add lr, r3, #1 + 1f0e1c4: e2840001 add r0, r4, #1 + 1f0e1c8: 0a00005e beq 1f0e348 + 1f0e1cc: e3510002 cmp r1, #2 + 1f0e1d0: e5d40001 ldrb r0, [r4, #1] + 1f0e1d4: e5c30001 strb r0, [r3, #1] + 1f0e1d8: e283e002 add lr, r3, #2 + 1f0e1dc: e2840002 add r0, r4, #2 + 1f0e1e0: e247c002 sub ip, r7, #2 + 1f0e1e4: 0a000057 beq 1f0e348 + 1f0e1e8: e3510003 cmp r1, #3 + 1f0e1ec: e5d40002 ldrb r0, [r4, #2] + 1f0e1f0: e5c30002 strb r0, [r3, #2] + 1f0e1f4: e283e003 add lr, r3, #3 + 1f0e1f8: e2840003 add r0, r4, #3 + 1f0e1fc: e247c003 sub ip, r7, #3 + 1f0e200: 0a000050 beq 1f0e348 + 1f0e204: e3510004 cmp r1, #4 + 1f0e208: e5d40003 ldrb r0, [r4, #3] + 1f0e20c: e5c30003 strb r0, [r3, #3] + 1f0e210: e283e004 add lr, r3, #4 + 1f0e214: e2840004 add r0, r4, #4 + 1f0e218: e247c004 sub ip, r7, #4 + 1f0e21c: 0a000049 beq 1f0e348 + 1f0e220: e3510005 cmp r1, #5 + 1f0e224: e5d40004 ldrb r0, [r4, #4] + 1f0e228: e5c30004 strb r0, [r3, #4] + 1f0e22c: e283e005 add lr, r3, #5 + 1f0e230: e2840005 add r0, r4, #5 + 1f0e234: e247c005 sub ip, r7, #5 + 1f0e238: 0a000042 beq 1f0e348 + 1f0e23c: e3510006 cmp r1, #6 + 1f0e240: e5d40005 ldrb r0, [r4, #5] + 1f0e244: e5c30005 strb r0, [r3, #5] + 1f0e248: e283e006 add lr, r3, #6 + 1f0e24c: e2840006 add r0, r4, #6 + 1f0e250: e247c006 sub ip, r7, #6 + 1f0e254: 0a00003b beq 1f0e348 + 1f0e258: e3510007 cmp r1, #7 + 1f0e25c: e5d40006 ldrb r0, [r4, #6] + 1f0e260: e5c30006 strb r0, [r3, #6] + 1f0e264: e283e007 add lr, r3, #7 + 1f0e268: e2840007 add r0, r4, #7 + 1f0e26c: e247c007 sub ip, r7, #7 + 1f0e270: 0a000034 beq 1f0e348 + 1f0e274: e3510008 cmp r1, #8 + 1f0e278: e5d40007 ldrb r0, [r4, #7] + 1f0e27c: e5c30007 strb r0, [r3, #7] + 1f0e280: e283e008 add lr, r3, #8 + 1f0e284: e2840008 add r0, r4, #8 + 1f0e288: e247c008 sub ip, r7, #8 + 1f0e28c: 0a00002d beq 1f0e348 + 1f0e290: e3510009 cmp r1, #9 + 1f0e294: e5d40008 ldrb r0, [r4, #8] + 1f0e298: e5c30008 strb r0, [r3, #8] + 1f0e29c: e283e009 add lr, r3, #9 + 1f0e2a0: e2840009 add r0, r4, #9 + 1f0e2a4: e247c009 sub ip, r7, #9 + 1f0e2a8: 0a000026 beq 1f0e348 + 1f0e2ac: e351000a cmp r1, #10 + 1f0e2b0: e5d40009 ldrb r0, [r4, #9] + 1f0e2b4: e5c30009 strb r0, [r3, #9] + 1f0e2b8: e283e00a add lr, r3, #10 + 1f0e2bc: e284000a add r0, r4, #10 + 1f0e2c0: e247c00a sub ip, r7, #10 + 1f0e2c4: 0a00001f beq 1f0e348 + 1f0e2c8: e351000b cmp r1, #11 + 1f0e2cc: e5d4000a ldrb r0, [r4, #10] + 1f0e2d0: e5c3000a strb r0, [r3, #10] + 1f0e2d4: e283e00b add lr, r3, #11 + 1f0e2d8: e284000b add r0, r4, #11 + 1f0e2dc: e247c00b sub ip, r7, #11 + 1f0e2e0: 0a000018 beq 1f0e348 + 1f0e2e4: e351000c cmp r1, #12 + 1f0e2e8: e5d4000b ldrb r0, [r4, #11] + 1f0e2ec: e5c3000b strb r0, [r3, #11] + 1f0e2f0: e283e00c add lr, r3, #12 + 1f0e2f4: e284000c add r0, r4, #12 + 1f0e2f8: e247c00c sub ip, r7, #12 + 1f0e2fc: 0a000011 beq 1f0e348 + 1f0e300: e351000d cmp r1, #13 + 1f0e304: e5d4000c ldrb r0, [r4, #12] + 1f0e308: e5c3000c strb r0, [r3, #12] + 1f0e30c: e283e00d add lr, r3, #13 + 1f0e310: e284000d add r0, r4, #13 + 1f0e314: e247c00d sub ip, r7, #13 + 1f0e318: 0a00000a beq 1f0e348 + 1f0e31c: e5d4000d ldrb r0, [r4, #13] + 1f0e320: e351000f cmp r1, #15 + 1f0e324: e5c3000d strb r0, [r3, #13] + 1f0e328: e284000e add r0, r4, #14 + 1f0e32c: e283e00e add lr, r3, #14 + 1f0e330: e247c00e sub ip, r7, #14 + 1f0e334: 05d4000e ldrbeq r0, [r4, #14] + 1f0e338: 0283e00f addeq lr, r3, #15 + 1f0e33c: 05c3000e strbeq r0, [r3, #14] + 1f0e340: 0247c00f subeq ip, r7, #15 + 1f0e344: 0284000f addeq r0, r4, #15 + 1f0e348: e1a0300e mov r3, lr + 1f0e34c: e061a007 rsb sl, r1, r7 + 1f0e350: e0618008 rsb r8, r1, r8 + 1f0e354: e24ae010 sub lr, sl, #16 + 1f0e358: e358000e cmp r8, #14 + 1f0e35c: e1a0e22e lsr lr, lr, #4 + 1f0e360: e28ee001 add lr, lr, #1 + 1f0e364: e1a0820e lsl r8, lr, #4 + 1f0e368: 9a00000f bls 1f0e3ac + 1f0e36c: e0822001 add r2, r2, r1 + 1f0e370: e0841001 add r1, r4, r1 + 1f0e374: e0892002 add r2, r9, r2 + 1f0e378: e3a09000 mov r9, #0 + 1f0e37c: f4610adf vld1.64 {d16-d17}, [r1 :64] + 1f0e380: e2899001 add r9, r9, #1 + 1f0e384: e159000e cmp r9, lr + 1f0e388: e2811010 add r1, r1, #16 + 1f0e38c: f4420a0f vst1.8 {d16-d17}, [r2] + 1f0e390: e2822010 add r2, r2, #16 + 1f0e394: 3afffff8 bcc 1f0e37c + 1f0e398: e15a0008 cmp sl, r8 + 1f0e39c: e068c00c rsb ip, r8, ip + 1f0e3a0: e0833008 add r3, r3, r8 + 1f0e3a4: e0800008 add r0, r0, r8 + 1f0e3a8: 0a00003f beq 1f0e4ac + 1f0e3ac: e35c0001 cmp ip, #1 + 1f0e3b0: e5d02000 ldrb r2, [r0] + 1f0e3b4: e5c32000 strb r2, [r3] + 1f0e3b8: 0a00003b beq 1f0e4ac + 1f0e3bc: e35c0002 cmp ip, #2 + 1f0e3c0: e5d02001 ldrb r2, [r0, #1] + 1f0e3c4: e5c32001 strb r2, [r3, #1] + 1f0e3c8: 0a000037 beq 1f0e4ac + 1f0e3cc: e35c0003 cmp ip, #3 + 1f0e3d0: e5d02002 ldrb r2, [r0, #2] + 1f0e3d4: e5c32002 strb r2, [r3, #2] + 1f0e3d8: 0a000033 beq 1f0e4ac + 1f0e3dc: e35c0004 cmp ip, #4 + 1f0e3e0: e5d02003 ldrb r2, [r0, #3] + 1f0e3e4: e5c32003 strb r2, [r3, #3] + 1f0e3e8: 0a00002f beq 1f0e4ac + 1f0e3ec: e35c0005 cmp ip, #5 + 1f0e3f0: e5d02004 ldrb r2, [r0, #4] + 1f0e3f4: e5c32004 strb r2, [r3, #4] + 1f0e3f8: 0a00002b beq 1f0e4ac + 1f0e3fc: e35c0006 cmp ip, #6 + 1f0e400: e5d02005 ldrb r2, [r0, #5] + 1f0e404: e5c32005 strb r2, [r3, #5] + 1f0e408: 0a000027 beq 1f0e4ac + 1f0e40c: e35c0007 cmp ip, #7 + 1f0e410: e5d02006 ldrb r2, [r0, #6] + 1f0e414: e5c32006 strb r2, [r3, #6] + 1f0e418: 0a000023 beq 1f0e4ac + 1f0e41c: e35c0008 cmp ip, #8 + 1f0e420: e5d02007 ldrb r2, [r0, #7] + 1f0e424: e5c32007 strb r2, [r3, #7] + 1f0e428: 0a00001f beq 1f0e4ac + 1f0e42c: e35c0009 cmp ip, #9 + 1f0e430: e5d02008 ldrb r2, [r0, #8] + 1f0e434: e5c32008 strb r2, [r3, #8] + 1f0e438: 0a00001b beq 1f0e4ac + 1f0e43c: e35c000a cmp ip, #10 + 1f0e440: e5d02009 ldrb r2, [r0, #9] + 1f0e444: e5c32009 strb r2, [r3, #9] + 1f0e448: 0a000017 beq 1f0e4ac + 1f0e44c: e35c000b cmp ip, #11 + 1f0e450: e5d0200a ldrb r2, [r0, #10] + 1f0e454: e5c3200a strb r2, [r3, #10] + 1f0e458: 0a000013 beq 1f0e4ac + 1f0e45c: e35c000c cmp ip, #12 + 1f0e460: e5d0200b ldrb r2, [r0, #11] + 1f0e464: e5c3200b strb r2, [r3, #11] + 1f0e468: 0a00000f beq 1f0e4ac + 1f0e46c: e35c000d cmp ip, #13 + 1f0e470: e5d0200c ldrb r2, [r0, #12] + 1f0e474: e5c3200c strb r2, [r3, #12] + 1f0e478: 0a00000b beq 1f0e4ac + 1f0e47c: e5d0200d ldrb r2, [r0, #13] + 1f0e480: e35c000e cmp ip, #14 + 1f0e484: e5c3200d strb r2, [r3, #13] + 1f0e488: 1084c007 addne ip, r4, r7 + 1f0e48c: 15d0200e ldrbne r2, [r0, #14] + 1f0e490: 15c3200e strbne r2, [r3, #14] + 1f0e494: 0a000004 beq 1f0e4ac + 1f0e498: e5d53028 ldrb r3, [r5, #40] ; 0x28 + 1f0e49c: e1e03c83 mvn r3, r3, lsl #25 + 1f0e4a0: e1e03ca3 mvn r3, r3, lsr #25 + 1f0e4a4: e5c53028 strb r3, [r5, #40] ; 0x28 + 1f0e4a8: eaffff0f b 1f0e0ec + 1f0e4ac: e084c007 add ip, r4, r7 + 1f0e4b0: eafffff8 b 1f0e498 + 1f0e4b4: e595303c ldr r3, [r5, #60] ; 0x3c + 1f0e4b8: e1580003 cmp r8, r3 + 1f0e4bc: e1c523d0 ldrd r2, [r5, #48] ; 0x30 + 1f0e4c0: 0a0000d9 beq 1f0e82c + 1f0e4c4: e1c501d0 ldrd r0, [r5, #16] + 1f0e4c8: e2859048 add r9, r5, #72 ; 0x48 + 1f0e4cc: e1530001 cmp r3, r1 + 1f0e4d0: 01520000 cmpeq r2, r0 + 1f0e4d4: 3a0000e5 bcc 1f0e870 + 1f0e4d8: e585803c str r8, [r5, #60] ; 0x3c + 1f0e4dc: eaffff1a b 1f0e14c + 1f0e4e0: e1a00004 mov r0, r4 + 1f0e4e4: e1a0c007 mov ip, r7 + 1f0e4e8: e2478001 sub r8, r7, #1 + 1f0e4ec: eaffff96 b 1f0e34c + 1f0e4f0: e2433001 sub r3, r3, #1 + 1f0e4f4: e084c007 add ip, r4, r7 + 1f0e4f8: e4d42001 ldrb r2, [r4], #1 + 1f0e4fc: e5e32001 strb r2, [r3, #1]! + 1f0e500: e154000c cmp r4, ip + 1f0e504: 1afffffb bne 1f0e4f8 + 1f0e508: eaffffe2 b 1f0e498 + 1f0e50c: e5951038 ldr r1, [r5, #56] ; 0x38 + 1f0e510: e1a00005 mov r0, r5 + 1f0e514: ebffe497 bl 1f07778 + 1f0e518: e3500000 cmp r0, #0 + 1f0e51c: 1afffec8 bne 1f0e044 + 1f0e520: e5d53028 ldrb r3, [r5, #40] ; 0x28 + 1f0e524: e3833040 orr r3, r3, #64 ; 0x40 + 1f0e528: e3a00000 mov r0, #0 + 1f0e52c: e5c53028 strb r3, [r5, #40] ; 0x28 + 1f0e530: eafffe9b b 1f0dfa4 + 1f0e534: e59d2004 ldr r2, [sp, #4] + 1f0e538: e285c048 add ip, r5, #72 ; 0x48 + 1f0e53c: e0848488 add r8, r4, r8, lsl #9 + 1f0e540: e0623003 rsb r3, r2, r3 + 1f0e544: e06aa003 rsb sl, sl, r3 + 1f0e548: e2853058 add r3, r5, #88 ; 0x58 + 1f0e54c: e069900a rsb r9, r9, sl + 1f0e550: e1a09489 lsl r9, r9, #9 + 1f0e554: e2891010 add r1, r9, #16 + 1f0e558: e0842009 add r2, r4, r9 + 1f0e55c: e0841001 add r1, r4, r1 + 1f0e560: e1520003 cmp r2, r3 + 1f0e564: 315c0001 cmpcc ip, r1 + 1f0e568: 3a0000d6 bcc 1f0e8c8 + 1f0e56c: e202a007 and sl, r2, #7 + 1f0e570: e26aa000 rsb sl, sl, #0 + 1f0e574: e21aa00f ands sl, sl, #15 + 1f0e578: 0a0000c5 beq 1f0e894 + 1f0e57c: e35a0001 cmp sl, #1 + 1f0e580: e5d83000 ldrb r3, [r8] + 1f0e584: e5c53048 strb r3, [r5, #72] ; 0x48 + 1f0e588: e2852049 add r2, r5, #73 ; 0x49 + 1f0e58c: e2883001 add r3, r8, #1 + 1f0e590: 0a0000e1 beq 1f0e91c + 1f0e594: e35a0002 cmp sl, #2 + 1f0e598: e5d83001 ldrb r3, [r8, #1] + 1f0e59c: e5c53049 strb r3, [r5, #73] ; 0x49 + 1f0e5a0: e285204a add r2, r5, #74 ; 0x4a + 1f0e5a4: e2883002 add r3, r8, #2 + 1f0e5a8: 0a0000df beq 1f0e92c + 1f0e5ac: e35a0003 cmp sl, #3 + 1f0e5b0: e5d83002 ldrb r3, [r8, #2] + 1f0e5b4: e5c5304a strb r3, [r5, #74] ; 0x4a + 1f0e5b8: e285204b add r2, r5, #75 ; 0x4b + 1f0e5bc: e2883003 add r3, r8, #3 + 1f0e5c0: 0a0000d7 beq 1f0e924 + 1f0e5c4: e35a0004 cmp sl, #4 + 1f0e5c8: e5d83003 ldrb r3, [r8, #3] + 1f0e5cc: e5c5304b strb r3, [r5, #75] ; 0x4b + 1f0e5d0: e285204c add r2, r5, #76 ; 0x4c + 1f0e5d4: e2883004 add r3, r8, #4 + 1f0e5d8: 0a0000db beq 1f0e94c + 1f0e5dc: e35a0005 cmp sl, #5 + 1f0e5e0: e5d83004 ldrb r3, [r8, #4] + 1f0e5e4: e5c5304c strb r3, [r5, #76] ; 0x4c + 1f0e5e8: e285204d add r2, r5, #77 ; 0x4d + 1f0e5ec: e2883005 add r3, r8, #5 + 1f0e5f0: 0a0000d3 beq 1f0e944 + 1f0e5f4: e35a0006 cmp sl, #6 + 1f0e5f8: e5d83005 ldrb r3, [r8, #5] + 1f0e5fc: e5c5304d strb r3, [r5, #77] ; 0x4d + 1f0e600: e285204e add r2, r5, #78 ; 0x4e + 1f0e604: e2883006 add r3, r8, #6 + 1f0e608: 0a0000cb beq 1f0e93c + 1f0e60c: e35a0007 cmp sl, #7 + 1f0e610: e5d83006 ldrb r3, [r8, #6] + 1f0e614: e5c5304e strb r3, [r5, #78] ; 0x4e + 1f0e618: e285204f add r2, r5, #79 ; 0x4f + 1f0e61c: e2883007 add r3, r8, #7 + 1f0e620: 0a0000c3 beq 1f0e934 + 1f0e624: e35a0008 cmp sl, #8 + 1f0e628: e5d83007 ldrb r3, [r8, #7] + 1f0e62c: e5c5304f strb r3, [r5, #79] ; 0x4f + 1f0e630: e2852050 add r2, r5, #80 ; 0x50 + 1f0e634: e2883008 add r3, r8, #8 + 1f0e638: 0a0000b3 beq 1f0e90c + 1f0e63c: e35a0009 cmp sl, #9 + 1f0e640: e5d83008 ldrb r3, [r8, #8] + 1f0e644: e5c53050 strb r3, [r5, #80] ; 0x50 + 1f0e648: e2852051 add r2, r5, #81 ; 0x51 + 1f0e64c: e2883009 add r3, r8, #9 + 1f0e650: 0a0000ab beq 1f0e904 + 1f0e654: e35a000a cmp sl, #10 + 1f0e658: e5d83009 ldrb r3, [r8, #9] + 1f0e65c: e5c53051 strb r3, [r5, #81] ; 0x51 + 1f0e660: e2852052 add r2, r5, #82 ; 0x52 + 1f0e664: e288300a add r3, r8, #10 + 1f0e668: 0a0000a3 beq 1f0e8fc + 1f0e66c: e35a000b cmp sl, #11 + 1f0e670: e5d8300a ldrb r3, [r8, #10] + 1f0e674: e5c53052 strb r3, [r5, #82] ; 0x52 + 1f0e678: e2852053 add r2, r5, #83 ; 0x53 + 1f0e67c: e288300b add r3, r8, #11 + 1f0e680: 0a00009b beq 1f0e8f4 + 1f0e684: e35a000c cmp sl, #12 + 1f0e688: e5d8300b ldrb r3, [r8, #11] + 1f0e68c: e5c53053 strb r3, [r5, #83] ; 0x53 + 1f0e690: e2852054 add r2, r5, #84 ; 0x54 + 1f0e694: e288300c add r3, r8, #12 + 1f0e698: 0a000093 beq 1f0e8ec + 1f0e69c: e35a000d cmp sl, #13 + 1f0e6a0: e5d8300c ldrb r3, [r8, #12] + 1f0e6a4: e5c53054 strb r3, [r5, #84] ; 0x54 + 1f0e6a8: e2852055 add r2, r5, #85 ; 0x55 + 1f0e6ac: e288300d add r3, r8, #13 + 1f0e6b0: 0a00008b beq 1f0e8e4 + 1f0e6b4: e35a000f cmp sl, #15 + 1f0e6b8: e5d8300d ldrb r3, [r8, #13] + 1f0e6bc: e5c53055 strb r3, [r5, #85] ; 0x55 + 1f0e6c0: e2852056 add r2, r5, #86 ; 0x56 + 1f0e6c4: e288300e add r3, r8, #14 + 1f0e6c8: 1a000091 bne 1f0e914 + 1f0e6cc: e5d8200e ldrb r2, [r8, #14] + 1f0e6d0: e288300f add r3, r8, #15 + 1f0e6d4: e5c52056 strb r2, [r5, #86] ; 0x56 + 1f0e6d8: e30011f1 movw r1, #497 ; 0x1f1 + 1f0e6dc: e2852057 add r2, r5, #87 ; 0x57 + 1f0e6e0: e1a08003 mov r8, r3 + 1f0e6e4: e26aec02 rsb lr, sl, #512 ; 0x200 + 1f0e6e8: e3a0301f mov r3, #31 + 1f0e6ec: e3a00e1f mov r0, #496 ; 0x1f0 + 1f0e6f0: e58d3004 str r3, [sp, #4] + 1f0e6f4: e08a3009 add r3, sl, r9 + 1f0e6f8: e08cc00a add ip, ip, sl + 1f0e6fc: e59da004 ldr sl, [sp, #4] + 1f0e700: e0843003 add r3, r4, r3 + 1f0e704: e3a09000 mov r9, #0 + 1f0e708: f4630adf vld1.64 {d16-d17}, [r3 :64] + 1f0e70c: e2899001 add r9, r9, #1 + 1f0e710: e159000a cmp r9, sl + 1f0e714: e2833010 add r3, r3, #16 + 1f0e718: f44c0a0f vst1.8 {d16-d17}, [ip] + 1f0e71c: e28cc010 add ip, ip, #16 + 1f0e720: 3afffff8 bcc 1f0e708 + 1f0e724: e15e0000 cmp lr, r0 + 1f0e728: e0601001 rsb r1, r0, r1 + 1f0e72c: e0823000 add r3, r2, r0 + 1f0e730: e088c000 add ip, r8, r0 + 1f0e734: 0a000038 beq 1f0e81c + 1f0e738: e3510001 cmp r1, #1 + 1f0e73c: e7d8e000 ldrb lr, [r8, r0] + 1f0e740: e7c2e000 strb lr, [r2, r0] + 1f0e744: 0a000034 beq 1f0e81c + 1f0e748: e3510002 cmp r1, #2 + 1f0e74c: e5dc2001 ldrb r2, [ip, #1] + 1f0e750: e5c32001 strb r2, [r3, #1] + 1f0e754: 0a000030 beq 1f0e81c + 1f0e758: e3510003 cmp r1, #3 + 1f0e75c: e5dc2002 ldrb r2, [ip, #2] + 1f0e760: e5c32002 strb r2, [r3, #2] + 1f0e764: 0a00002c beq 1f0e81c + 1f0e768: e3510004 cmp r1, #4 + 1f0e76c: e5dc2003 ldrb r2, [ip, #3] + 1f0e770: e5c32003 strb r2, [r3, #3] + 1f0e774: 0a000028 beq 1f0e81c + 1f0e778: e3510005 cmp r1, #5 + 1f0e77c: e5dc2004 ldrb r2, [ip, #4] + 1f0e780: e5c32004 strb r2, [r3, #4] + 1f0e784: 0a000024 beq 1f0e81c + 1f0e788: e3510006 cmp r1, #6 + 1f0e78c: e5dc2005 ldrb r2, [ip, #5] + 1f0e790: e5c32005 strb r2, [r3, #5] + 1f0e794: 0a000020 beq 1f0e81c + 1f0e798: e3510007 cmp r1, #7 + 1f0e79c: e5dc2006 ldrb r2, [ip, #6] + 1f0e7a0: e5c32006 strb r2, [r3, #6] + 1f0e7a4: 0a00001c beq 1f0e81c + 1f0e7a8: e3510008 cmp r1, #8 + 1f0e7ac: e5dc2007 ldrb r2, [ip, #7] + 1f0e7b0: e5c32007 strb r2, [r3, #7] + 1f0e7b4: 0a000018 beq 1f0e81c + 1f0e7b8: e3510009 cmp r1, #9 + 1f0e7bc: e5dc2008 ldrb r2, [ip, #8] + 1f0e7c0: e5c32008 strb r2, [r3, #8] + 1f0e7c4: 0a000014 beq 1f0e81c + 1f0e7c8: e351000a cmp r1, #10 + 1f0e7cc: e5dc2009 ldrb r2, [ip, #9] + 1f0e7d0: e5c32009 strb r2, [r3, #9] + 1f0e7d4: 0a000010 beq 1f0e81c + 1f0e7d8: e351000b cmp r1, #11 + 1f0e7dc: e5dc200a ldrb r2, [ip, #10] + 1f0e7e0: e5c3200a strb r2, [r3, #10] + 1f0e7e4: 0a00000c beq 1f0e81c + 1f0e7e8: e351000c cmp r1, #12 + 1f0e7ec: e5dc200b ldrb r2, [ip, #11] + 1f0e7f0: e5c3200b strb r2, [r3, #11] + 1f0e7f4: 0a000008 beq 1f0e81c + 1f0e7f8: e351000d cmp r1, #13 + 1f0e7fc: e5dc200c ldrb r2, [ip, #12] + 1f0e800: e5c3200c strb r2, [r3, #12] + 1f0e804: 0a000004 beq 1f0e81c + 1f0e808: e5dc200d ldrb r2, [ip, #13] + 1f0e80c: e351000e cmp r1, #14 + 1f0e810: e5c3200d strb r2, [r3, #13] + 1f0e814: 15dc200e ldrbne r2, [ip, #14] + 1f0e818: 15c3200e strbne r2, [r3, #14] + 1f0e81c: e5d53028 ldrb r3, [r5, #40] ; 0x28 + 1f0e820: e203307f and r3, r3, #127 ; 0x7f + 1f0e824: e5c53028 strb r3, [r5, #40] ; 0x28 + 1f0e828: eafffe2d b 1f0e0e4 + 1f0e82c: e2859048 add r9, r5, #72 ; 0x48 + 1f0e830: eaffff28 b 1f0e4d8 + 1f0e834: e3a03001 mov r3, #1 + 1f0e838: e595203c ldr r2, [r5, #60] ; 0x3c + 1f0e83c: e2851048 add r1, r5, #72 ; 0x48 + 1f0e840: e5db0001 ldrb r0, [fp, #1] + 1f0e844: eb005fbf bl 1f26748 + 1f0e848: e3500000 cmp r0, #0 + 1f0e84c: 1a000017 bne 1f0e8b0 + 1f0e850: e5d53028 ldrb r3, [r5, #40] ; 0x28 + 1f0e854: e203307f and r3, r3, #127 ; 0x7f + 1f0e858: e5c53028 strb r3, [r5, #40] ; 0x28 + 1f0e85c: eafffe03 b 1f0e070 + 1f0e860: e1a01000 mov r1, r0 + 1f0e864: e1a00005 mov r0, r5 + 1f0e868: ebffe3c2 bl 1f07778 + 1f0e86c: eaffff29 b 1f0e518 + 1f0e870: e3a03001 mov r3, #1 + 1f0e874: e1a01009 mov r1, r9 + 1f0e878: e1a02008 mov r2, r8 + 1f0e87c: e5db0001 ldrb r0, [fp, #1] + 1f0e880: eb005f92 bl 1f266d0 + 1f0e884: e3500000 cmp r0, #0 + 1f0e888: 1a000008 bne 1f0e8b0 + 1f0e88c: e1c523d0 ldrd r2, [r5, #48] ; 0x30 + 1f0e890: eaffff10 b 1f0e4d8 + 1f0e894: e3a01c02 mov r1, #512 ; 0x200 + 1f0e898: e3a03020 mov r3, #32 + 1f0e89c: e1a0200c mov r2, ip + 1f0e8a0: e1a0e001 mov lr, r1 + 1f0e8a4: e1a00001 mov r0, r1 + 1f0e8a8: e58d3004 str r3, [sp, #4] + 1f0e8ac: eaffff90 b 1f0e6f4 + 1f0e8b0: e3a00001 mov r0, #1 + 1f0e8b4: e5c50029 strb r0, [r5, #41] ; 0x29 + 1f0e8b8: eafffdb9 b 1f0dfa4 + 1f0e8bc: e3a00002 mov r0, #2 + 1f0e8c0: e5c50029 strb r0, [r5, #41] ; 0x29 + 1f0e8c4: eafffdb6 b 1f0dfa4 + 1f0e8c8: e2853047 add r3, r5, #71 ; 0x47 + 1f0e8cc: e2881c02 add r1, r8, #512 ; 0x200 + 1f0e8d0: e4d82001 ldrb r2, [r8], #1 + 1f0e8d4: e5e32001 strb r2, [r3, #1]! + 1f0e8d8: e1580001 cmp r8, r1 + 1f0e8dc: 1afffffb bne 1f0e8d0 + 1f0e8e0: eaffffcd b 1f0e81c + 1f0e8e4: e30011f3 movw r1, #499 ; 0x1f3 + 1f0e8e8: eaffff7c b 1f0e6e0 + 1f0e8ec: e3a01f7d mov r1, #500 ; 0x1f4 + 1f0e8f0: eaffff7a b 1f0e6e0 + 1f0e8f4: e30011f5 movw r1, #501 ; 0x1f5 + 1f0e8f8: eaffff78 b 1f0e6e0 + 1f0e8fc: e30011f6 movw r1, #502 ; 0x1f6 + 1f0e900: eaffff76 b 1f0e6e0 + 1f0e904: e30011f7 movw r1, #503 ; 0x1f7 + 1f0e908: eaffff74 b 1f0e6e0 + 1f0e90c: e3a01f7e mov r1, #504 ; 0x1f8 + 1f0e910: eaffff72 b 1f0e6e0 + 1f0e914: e30011f2 movw r1, #498 ; 0x1f2 + 1f0e918: eaffff70 b 1f0e6e0 + 1f0e91c: e30011ff movw r1, #511 ; 0x1ff + 1f0e920: eaffff6e b 1f0e6e0 + 1f0e924: e30011fd movw r1, #509 ; 0x1fd + 1f0e928: eaffff6c b 1f0e6e0 + 1f0e92c: e30011fe movw r1, #510 ; 0x1fe + 1f0e930: eaffff6a b 1f0e6e0 + 1f0e934: e30011f9 movw r1, #505 ; 0x1f9 + 1f0e938: eaffff68 b 1f0e6e0 + 1f0e93c: e30011fa movw r1, #506 ; 0x1fa + 1f0e940: eaffff66 b 1f0e6e0 + 1f0e944: e30011fb movw r1, #507 ; 0x1fb + 1f0e948: eaffff64 b 1f0e6e0 + 1f0e94c: e3a01f7f mov r1, #508 ; 0x1fc + 1f0e950: eaffff62 b 1f0e6e0 + +01f0e954 : + 1f0e954: e3500000 cmp r0, #0 + 1f0e958: 0a000005 beq 1f0e974 + 1f0e95c: e5903000 ldr r3, [r0] + 1f0e960: e3530000 cmp r3, #0 + 1f0e964: 0a000002 beq 1f0e974 + 1f0e968: e5d32000 ldrb r2, [r3] + 1f0e96c: e3520000 cmp r2, #0 + 1f0e970: 1a000001 bne 1f0e97c + 1f0e974: e3a00009 mov r0, #9 + 1f0e978: e12fff1e bx lr + 1f0e97c: e1d310b6 ldrh r1, [r3, #6] + 1f0e980: e1d020b4 ldrh r2, [r0, #4] + 1f0e984: e1510002 cmp r1, r2 + 1f0e988: 1afffff9 bne 1f0e974 + 1f0e98c: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f0e990: e1a04000 mov r4, r0 + 1f0e994: e24dd050 sub sp, sp, #80 ; 0x50 + 1f0e998: e5d30001 ldrb r0, [r3, #1] + 1f0e99c: eb005f47 bl 1f266c0 + 1f0e9a0: e3100001 tst r0, #1 + 1f0e9a4: 13a00009 movne r0, #9 + 1f0e9a8: 1a000020 bne 1f0ea30 + 1f0e9ac: e5d43028 ldrb r3, [r4, #40] ; 0x28 + 1f0e9b0: e2030040 and r0, r3, #64 ; 0x40 + 1f0e9b4: e21000ff ands r0, r0, #255 ; 0xff + 1f0e9b8: 0a00001c beq 1f0ea30 + 1f0e9bc: e3130080 tst r3, #128 ; 0x80 + 1f0e9c0: e5945000 ldr r5, [r4] + 1f0e9c4: 1a000058 bne 1f0eb2c + 1f0e9c8: ebffca8a bl 1f013f8 + 1f0e9cc: e5d53000 ldrb r3, [r5] + 1f0e9d0: e1a06000 mov r6, r0 + 1f0e9d4: e3530004 cmp r3, #4 + 1f0e9d8: 1a000016 bne 1f0ea38 + 1f0e9dc: e5d43007 ldrb r3, [r4, #7] + 1f0e9e0: e3530003 cmp r3, #3 + 1f0e9e4: 0a0000cd beq 1f0ed20 + 1f0e9e8: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f0e9ec: e1a0000d mov r0, sp + 1f0e9f0: e5943020 ldr r3, [r4, #32] + 1f0e9f4: e1a01002 mov r1, r2 + 1f0e9f8: e58d2044 str r2, [sp, #68] ; 0x44 + 1f0e9fc: e5942000 ldr r2, [r4] + 1f0ea00: e58d2000 str r2, [sp] + 1f0ea04: e594201c ldr r2, [r4, #28] + 1f0ea08: e5cd3007 strb r3, [sp, #7] + 1f0ea0c: e3c330ff bic r3, r3, #255 ; 0xff + 1f0ea10: e58d2008 str r2, [sp, #8] + 1f0ea14: e58d3010 str r3, [sp, #16] + 1f0ea18: e3a03000 mov r3, #0 + 1f0ea1c: e58d3014 str r3, [sp, #20] + 1f0ea20: ebffe614 bl 1f08278 + 1f0ea24: e2501000 subs r1, r0, #0 + 1f0ea28: 0a000067 beq 1f0ebcc + 1f0ea2c: e1a00001 mov r0, r1 + 1f0ea30: e28dd050 add sp, sp, #80 ; 0x50 + 1f0ea34: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f0ea38: e5948040 ldr r8, [r4, #64] ; 0x40 + 1f0ea3c: e5957044 ldr r7, [r5, #68] ; 0x44 + 1f0ea40: e1580007 cmp r8, r7 + 1f0ea44: 0a00000e beq 1f0ea84 + 1f0ea48: e5d53003 ldrb r3, [r5, #3] + 1f0ea4c: e285a048 add sl, r5, #72 ; 0x48 + 1f0ea50: e3530000 cmp r3, #0 + 1f0ea54: 1a000040 bne 1f0eb5c + 1f0ea58: e1a0100a mov r1, sl + 1f0ea5c: e3a03001 mov r3, #1 + 1f0ea60: e1a02008 mov r2, r8 + 1f0ea64: e5d50001 ldrb r0, [r5, #1] + 1f0ea68: eb005f18 bl 1f266d0 + 1f0ea6c: e3500000 cmp r0, #0 + 1f0ea70: 13e03000 mvnne r3, #0 + 1f0ea74: 13a00001 movne r0, #1 + 1f0ea78: 15853044 strne r3, [r5, #68] ; 0x44 + 1f0ea7c: 1affffeb bne 1f0ea30 + 1f0ea80: e5858044 str r8, [r5, #68] ; 0x44 + 1f0ea84: e5943044 ldr r3, [r4, #68] ; 0x44 + 1f0ea88: e1a0c426 lsr ip, r6, #8 + 1f0ea8c: e5d3200b ldrb r2, [r3, #11] + 1f0ea90: e3822020 orr r2, r2, #32 + 1f0ea94: e5c3200b strb r2, [r3, #11] + 1f0ea98: e5942008 ldr r2, [r4, #8] + 1f0ea9c: e5941000 ldr r1, [r4] + 1f0eaa0: e5c3201a strb r2, [r3, #26] + 1f0eaa4: e1a00442 asr r0, r2, #8 + 1f0eaa8: e5c3001b strb r0, [r3, #27] + 1f0eaac: e5d11000 ldrb r1, [r1] + 1f0eab0: e3510003 cmp r1, #3 + 1f0eab4: e1a01826 lsr r1, r6, #16 + 1f0eab8: 01a02822 lsreq r2, r2, #16 + 1f0eabc: 05c32014 strbeq r2, [r3, #20] + 1f0eac0: 01a02442 asreq r2, r2, #8 + 1f0eac4: 05c32015 strbeq r2, [r3, #21] + 1f0eac8: e5942010 ldr r2, [r4, #16] + 1f0eacc: e5c3201c strb r2, [r3, #28] + 1f0ead0: e5c36016 strb r6, [r3, #22] + 1f0ead4: e1a06c26 lsr r6, r6, #24 + 1f0ead8: e5c3c017 strb ip, [r3, #23] + 1f0eadc: e1a00422 lsr r0, r2, #8 + 1f0eae0: e5c31018 strb r1, [r3, #24] + 1f0eae4: e3a01001 mov r1, #1 + 1f0eae8: e5c3001d strb r0, [r3, #29] + 1f0eaec: e1a00822 lsr r0, r2, #16 + 1f0eaf0: e5c36019 strb r6, [r3, #25] + 1f0eaf4: e1a02c22 lsr r2, r2, #24 + 1f0eaf8: e5c3001e strb r0, [r3, #30] + 1f0eafc: e1a00005 mov r0, r5 + 1f0eb00: e5c3201f strb r2, [r3, #31] + 1f0eb04: e3a02000 mov r2, #0 + 1f0eb08: e5c32012 strb r2, [r3, #18] + 1f0eb0c: e5c32013 strb r2, [r3, #19] + 1f0eb10: e5c51003 strb r1, [r5, #3] + 1f0eb14: ebffdda8 bl 1f061bc + 1f0eb18: e5d43028 ldrb r3, [r4, #40] ; 0x28 + 1f0eb1c: e3c33040 bic r3, r3, #64 ; 0x40 + 1f0eb20: e5c43028 strb r3, [r4, #40] ; 0x28 + 1f0eb24: e28dd050 add sp, sp, #80 ; 0x50 + 1f0eb28: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f0eb2c: e3a03001 mov r3, #1 + 1f0eb30: e594203c ldr r2, [r4, #60] ; 0x3c + 1f0eb34: e2841048 add r1, r4, #72 ; 0x48 + 1f0eb38: e5d50001 ldrb r0, [r5, #1] + 1f0eb3c: eb005f01 bl 1f26748 + 1f0eb40: e3500000 cmp r0, #0 + 1f0eb44: 05d43028 ldrbeq r3, [r4, #40] ; 0x28 + 1f0eb48: 0203307f andeq r3, r3, #127 ; 0x7f + 1f0eb4c: 05c43028 strbeq r3, [r4, #40] ; 0x28 + 1f0eb50: 0affff9c beq 1f0e9c8 + 1f0eb54: e3a00001 mov r0, #1 + 1f0eb58: eaffffb4 b 1f0ea30 + 1f0eb5c: e3a03001 mov r3, #1 + 1f0eb60: e1a0100a mov r1, sl + 1f0eb64: e1a02007 mov r2, r7 + 1f0eb68: e5d50001 ldrb r0, [r5, #1] + 1f0eb6c: eb005ef5 bl 1f26748 + 1f0eb70: e3500000 cmp r0, #0 + 1f0eb74: 1afffff6 bne 1f0eb54 + 1f0eb78: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f0eb7c: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f0eb80: e0622007 rsb r2, r2, r7 + 1f0eb84: e5c50003 strb r0, [r5, #3] + 1f0eb88: e1520003 cmp r2, r3 + 1f0eb8c: 2affffb1 bcs 1f0ea58 + 1f0eb90: e5d59002 ldrb r9, [r5, #2] + 1f0eb94: e3590001 cmp r9, #1 + 1f0eb98: 8a000001 bhi 1f0eba4 + 1f0eb9c: eaffffad b 1f0ea58 + 1f0eba0: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f0eba4: e0877003 add r7, r7, r3 + 1f0eba8: e2499001 sub r9, r9, #1 + 1f0ebac: e1a02007 mov r2, r7 + 1f0ebb0: e3a03001 mov r3, #1 + 1f0ebb4: e1a0100a mov r1, sl + 1f0ebb8: e5d50001 ldrb r0, [r5, #1] + 1f0ebbc: eb005ee1 bl 1f26748 + 1f0ebc0: e3590001 cmp r9, #1 + 1f0ebc4: 1afffff5 bne 1f0eba0 + 1f0ebc8: eaffffa2 b 1f0ea58 + 1f0ebcc: e1a0000d mov r0, sp + 1f0ebd0: ebffeadb bl 1f09744 + 1f0ebd4: e2501000 subs r1, r0, #0 + 1f0ebd8: 1affff93 bne 1f0ea2c + 1f0ebdc: e5952010 ldr r2, [r5, #16] + 1f0ebe0: e1a0e426 lsr lr, r6, #8 + 1f0ebe4: e1a07826 lsr r7, r6, #16 + 1f0ebe8: e1a0000d mov r0, sp + 1f0ebec: e5d23004 ldrb r3, [r2, #4] + 1f0ebf0: e3833020 orr r3, r3, #32 + 1f0ebf4: e5c23004 strb r3, [r2, #4] + 1f0ebf8: e5952010 ldr r2, [r5, #16] + 1f0ebfc: e5d43007 ldrb r3, [r4, #7] + 1f0ec00: e3833001 orr r3, r3, #1 + 1f0ec04: e5c23021 strb r3, [r2, #33] ; 0x21 + 1f0ec08: e5942008 ldr r2, [r4, #8] + 1f0ec0c: e5953010 ldr r3, [r5, #16] + 1f0ec10: e1a0c422 lsr ip, r2, #8 + 1f0ec14: e1a08822 lsr r8, r2, #16 + 1f0ec18: e5c3c035 strb ip, [r3, #53] ; 0x35 + 1f0ec1c: e1a0cc22 lsr ip, r2, #24 + 1f0ec20: e5c38036 strb r8, [r3, #54] ; 0x36 + 1f0ec24: e5c32034 strb r2, [r3, #52] ; 0x34 + 1f0ec28: e5c3c037 strb ip, [r3, #55] ; 0x37 + 1f0ec2c: e1c421d0 ldrd r2, [r4, #16] + 1f0ec30: e595c010 ldr ip, [r5, #16] + 1f0ec34: e1a08422 lsr r8, r2, #8 + 1f0ec38: e1888c03 orr r8, r8, r3, lsl #24 + 1f0ec3c: e5cc8039 strb r8, [ip, #57] ; 0x39 + 1f0ec40: e1a08822 lsr r8, r2, #16 + 1f0ec44: e5cc2038 strb r2, [ip, #56] ; 0x38 + 1f0ec48: e1888803 orr r8, r8, r3, lsl #16 + 1f0ec4c: e5cc803a strb r8, [ip, #58] ; 0x3a + 1f0ec50: e1a08c22 lsr r8, r2, #24 + 1f0ec54: e5cc303c strb r3, [ip, #60] ; 0x3c + 1f0ec58: e1888403 orr r8, r8, r3, lsl #8 + 1f0ec5c: e1a02423 lsr r2, r3, #8 + 1f0ec60: e5cc803b strb r8, [ip, #59] ; 0x3b + 1f0ec64: e5cc203d strb r2, [ip, #61] ; 0x3d + 1f0ec68: e1a02823 lsr r2, r3, #16 + 1f0ec6c: e1a03c23 lsr r3, r3, #24 + 1f0ec70: e5cc203e strb r2, [ip, #62] ; 0x3e + 1f0ec74: e5cc303f strb r3, [ip, #63] ; 0x3f + 1f0ec78: e1c481d0 ldrd r8, [r4, #16] + 1f0ec7c: e595c010 ldr ip, [r5, #16] + 1f0ec80: e1a02428 lsr r2, r8, #8 + 1f0ec84: e1a03429 lsr r3, r9, #8 + 1f0ec88: e1822c09 orr r2, r2, r9, lsl #24 + 1f0ec8c: e5cc2029 strb r2, [ip, #41] ; 0x29 + 1f0ec90: e1a02828 lsr r2, r8, #16 + 1f0ec94: e5cc302d strb r3, [ip, #45] ; 0x2d + 1f0ec98: e1822809 orr r2, r2, r9, lsl #16 + 1f0ec9c: e5cc202a strb r2, [ip, #42] ; 0x2a + 1f0eca0: e1a02c28 lsr r2, r8, #24 + 1f0eca4: e5cc8028 strb r8, [ip, #40] ; 0x28 + 1f0eca8: e1822409 orr r2, r2, r9, lsl #8 + 1f0ecac: e5cc902c strb r9, [ip, #44] ; 0x2c + 1f0ecb0: e5cc202b strb r2, [ip, #43] ; 0x2b + 1f0ecb4: e1a03c29 lsr r3, r9, #24 + 1f0ecb8: e1a02829 lsr r2, r9, #16 + 1f0ecbc: e5cc302f strb r3, [ip, #47] ; 0x2f + 1f0ecc0: e5cc202e strb r2, [ip, #46] ; 0x2e + 1f0ecc4: e1a02c26 lsr r2, r6, #24 + 1f0ecc8: e5953010 ldr r3, [r5, #16] + 1f0eccc: e5c3600c strb r6, [r3, #12] + 1f0ecd0: e5c3e00d strb lr, [r3, #13] + 1f0ecd4: e5c3700e strb r7, [r3, #14] + 1f0ecd8: e5c3200f strb r2, [r3, #15] + 1f0ecdc: e5953010 ldr r3, [r5, #16] + 1f0ece0: e5c31015 strb r1, [r3, #21] + 1f0ece4: e5953010 ldr r3, [r5, #16] + 1f0ece8: e5c31010 strb r1, [r3, #16] + 1f0ecec: e5c31011 strb r1, [r3, #17] + 1f0ecf0: e5c31012 strb r1, [r3, #18] + 1f0ecf4: e5c31013 strb r1, [r3, #19] + 1f0ecf8: ebffe895 bl 1f08f54 + 1f0ecfc: e2501000 subs r1, r0, #0 + 1f0ed00: 1affff49 bne 1f0ea2c + 1f0ed04: e1a00005 mov r0, r5 + 1f0ed08: ebffdd2b bl 1f061bc + 1f0ed0c: e5d43028 ldrb r3, [r4, #40] ; 0x28 + 1f0ed10: e1a01000 mov r1, r0 + 1f0ed14: e3c33040 bic r3, r3, #64 ; 0x40 + 1f0ed18: e5c43028 strb r3, [r4, #40] ; 0x28 + 1f0ed1c: eaffff42 b 1f0ea2c + 1f0ed20: e5948018 ldr r8, [r4, #24] + 1f0ed24: e5947008 ldr r7, [r4, #8] + 1f0ed28: e3580000 cmp r8, #0 + 1f0ed2c: 0a00001a beq 1f0ed9c + 1f0ed30: e3570001 cmp r7, #1 + 1f0ed34: 8a000002 bhi 1f0ed44 + 1f0ed38: e3a00002 mov r0, #2 + 1f0ed3c: e28dd050 add sp, sp, #80 ; 0x50 + 1f0ed40: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f0ed44: e5940000 ldr r0, [r4] + 1f0ed48: e590302c ldr r3, [r0, #44] ; 0x2c + 1f0ed4c: e1570003 cmp r7, r3 + 1f0ed50: 2afffff8 bcs 1f0ed38 + 1f0ed54: e0878008 add r8, r7, r8 + 1f0ed58: e2877001 add r7, r7, #1 + 1f0ed5c: ea000007 b 1f0ed80 + 1f0ed60: e3570001 cmp r7, #1 + 1f0ed64: 9afffff3 bls 1f0ed38 + 1f0ed68: e5940000 ldr r0, [r4] + 1f0ed6c: e2873001 add r3, r7, #1 + 1f0ed70: e590202c ldr r2, [r0, #44] ; 0x2c + 1f0ed74: e1520007 cmp r2, r7 + 1f0ed78: 9affffee bls 1f0ed38 + 1f0ed7c: e1a07003 mov r7, r3 + 1f0ed80: e1a02007 mov r2, r7 + 1f0ed84: e2471001 sub r1, r7, #1 + 1f0ed88: ebffde04 bl 1f065a0 + 1f0ed8c: e3500000 cmp r0, #0 + 1f0ed90: 1affff26 bne 1f0ea30 + 1f0ed94: e1570008 cmp r7, r8 + 1f0ed98: 1afffff0 bne 1f0ed60 + 1f0ed9c: e3a03000 mov r3, #0 + 1f0eda0: e5c43007 strb r3, [r4, #7] + 1f0eda4: eaffff0f b 1f0e9e8 + +01f0eda8 : + 1f0eda8: e3500000 cmp r0, #0 + 1f0edac: 0a000005 beq 1f0edc8 + 1f0edb0: e5903000 ldr r3, [r0] + 1f0edb4: e3530000 cmp r3, #0 + 1f0edb8: 0a000002 beq 1f0edc8 + 1f0edbc: e5d32000 ldrb r2, [r3] + 1f0edc0: e3520000 cmp r2, #0 + 1f0edc4: 1a000002 bne 1f0edd4 + 1f0edc8: e3a01009 mov r1, #9 + 1f0edcc: e1a00001 mov r0, r1 + 1f0edd0: e12fff1e bx lr + 1f0edd4: e1d310b6 ldrh r1, [r3, #6] + 1f0edd8: e1d020b4 ldrh r2, [r0, #4] + 1f0eddc: e1510002 cmp r1, r2 + 1f0ede0: 1afffff8 bne 1f0edc8 + 1f0ede4: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f0ede8: e1a04000 mov r4, r0 + 1f0edec: e24dd050 sub sp, sp, #80 ; 0x50 + 1f0edf0: e5d30001 ldrb r0, [r3, #1] + 1f0edf4: eb005e31 bl 1f266c0 + 1f0edf8: e3100001 tst r0, #1 + 1f0edfc: 0a000003 beq 1f0ee10 + 1f0ee00: e3a01009 mov r1, #9 + 1f0ee04: e1a00001 mov r0, r1 + 1f0ee08: e28dd050 add sp, sp, #80 ; 0x50 + 1f0ee0c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f0ee10: e5d43028 ldrb r3, [r4, #40] ; 0x28 + 1f0ee14: e5945000 ldr r5, [r4] + 1f0ee18: e3130040 tst r3, #64 ; 0x40 + 1f0ee1c: 0a000071 beq 1f0efe8 + 1f0ee20: e3130080 tst r3, #128 ; 0x80 + 1f0ee24: 1a0000b7 bne 1f0f108 + 1f0ee28: ebffc972 bl 1f013f8 + 1f0ee2c: e5d53000 ldrb r3, [r5] + 1f0ee30: e1a06000 mov r6, r0 + 1f0ee34: e3530004 cmp r3, #4 + 1f0ee38: 1a00007a bne 1f0f028 + 1f0ee3c: e5d43007 ldrb r3, [r4, #7] + 1f0ee40: e3530003 cmp r3, #3 + 1f0ee44: 0a0000d7 beq 1f0f1a8 + 1f0ee48: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f0ee4c: e1a0000d mov r0, sp + 1f0ee50: e5943020 ldr r3, [r4, #32] + 1f0ee54: e1a01002 mov r1, r2 + 1f0ee58: e58d2044 str r2, [sp, #68] ; 0x44 + 1f0ee5c: e5942000 ldr r2, [r4] + 1f0ee60: e58d2000 str r2, [sp] + 1f0ee64: e594201c ldr r2, [r4, #28] + 1f0ee68: e5cd3007 strb r3, [sp, #7] + 1f0ee6c: e3c330ff bic r3, r3, #255 ; 0xff + 1f0ee70: e58d2008 str r2, [sp, #8] + 1f0ee74: e58d3010 str r3, [sp, #16] + 1f0ee78: e3a03000 mov r3, #0 + 1f0ee7c: e58d3014 str r3, [sp, #20] + 1f0ee80: ebffe4fc bl 1f08278 + 1f0ee84: e2501000 subs r1, r0, #0 + 1f0ee88: 1affffdd bne 1f0ee04 + 1f0ee8c: e1a0000d mov r0, sp + 1f0ee90: ebffea2b bl 1f09744 + 1f0ee94: e2501000 subs r1, r0, #0 + 1f0ee98: 1affffd9 bne 1f0ee04 + 1f0ee9c: e5952010 ldr r2, [r5, #16] + 1f0eea0: e1a0e426 lsr lr, r6, #8 + 1f0eea4: e1a07826 lsr r7, r6, #16 + 1f0eea8: e1a0000d mov r0, sp + 1f0eeac: e5d23004 ldrb r3, [r2, #4] + 1f0eeb0: e3833020 orr r3, r3, #32 + 1f0eeb4: e5c23004 strb r3, [r2, #4] + 1f0eeb8: e5952010 ldr r2, [r5, #16] + 1f0eebc: e5d43007 ldrb r3, [r4, #7] + 1f0eec0: e3833001 orr r3, r3, #1 + 1f0eec4: e5c23021 strb r3, [r2, #33] ; 0x21 + 1f0eec8: e5942008 ldr r2, [r4, #8] + 1f0eecc: e5953010 ldr r3, [r5, #16] + 1f0eed0: e1a0c422 lsr ip, r2, #8 + 1f0eed4: e1a08822 lsr r8, r2, #16 + 1f0eed8: e5c3c035 strb ip, [r3, #53] ; 0x35 + 1f0eedc: e1a0cc22 lsr ip, r2, #24 + 1f0eee0: e5c38036 strb r8, [r3, #54] ; 0x36 + 1f0eee4: e5c32034 strb r2, [r3, #52] ; 0x34 + 1f0eee8: e5c3c037 strb ip, [r3, #55] ; 0x37 + 1f0eeec: e1c421d0 ldrd r2, [r4, #16] + 1f0eef0: e595c010 ldr ip, [r5, #16] + 1f0eef4: e1a08422 lsr r8, r2, #8 + 1f0eef8: e1888c03 orr r8, r8, r3, lsl #24 + 1f0eefc: e5cc8039 strb r8, [ip, #57] ; 0x39 + 1f0ef00: e1a08822 lsr r8, r2, #16 + 1f0ef04: e5cc2038 strb r2, [ip, #56] ; 0x38 + 1f0ef08: e1888803 orr r8, r8, r3, lsl #16 + 1f0ef0c: e5cc803a strb r8, [ip, #58] ; 0x3a + 1f0ef10: e1a08c22 lsr r8, r2, #24 + 1f0ef14: e5cc303c strb r3, [ip, #60] ; 0x3c + 1f0ef18: e1888403 orr r8, r8, r3, lsl #8 + 1f0ef1c: e1a02423 lsr r2, r3, #8 + 1f0ef20: e5cc803b strb r8, [ip, #59] ; 0x3b + 1f0ef24: e5cc203d strb r2, [ip, #61] ; 0x3d + 1f0ef28: e1a02823 lsr r2, r3, #16 + 1f0ef2c: e1a03c23 lsr r3, r3, #24 + 1f0ef30: e5cc203e strb r2, [ip, #62] ; 0x3e + 1f0ef34: e5cc303f strb r3, [ip, #63] ; 0x3f + 1f0ef38: e1c481d0 ldrd r8, [r4, #16] + 1f0ef3c: e595c010 ldr ip, [r5, #16] + 1f0ef40: e1a02428 lsr r2, r8, #8 + 1f0ef44: e1a03429 lsr r3, r9, #8 + 1f0ef48: e1822c09 orr r2, r2, r9, lsl #24 + 1f0ef4c: e5cc2029 strb r2, [ip, #41] ; 0x29 + 1f0ef50: e1a02828 lsr r2, r8, #16 + 1f0ef54: e5cc302d strb r3, [ip, #45] ; 0x2d + 1f0ef58: e1822809 orr r2, r2, r9, lsl #16 + 1f0ef5c: e5cc202a strb r2, [ip, #42] ; 0x2a + 1f0ef60: e1a02c28 lsr r2, r8, #24 + 1f0ef64: e5cc8028 strb r8, [ip, #40] ; 0x28 + 1f0ef68: e1822409 orr r2, r2, r9, lsl #8 + 1f0ef6c: e5cc902c strb r9, [ip, #44] ; 0x2c + 1f0ef70: e5cc202b strb r2, [ip, #43] ; 0x2b + 1f0ef74: e1a03c29 lsr r3, r9, #24 + 1f0ef78: e1a02829 lsr r2, r9, #16 + 1f0ef7c: e5cc302f strb r3, [ip, #47] ; 0x2f + 1f0ef80: e5cc202e strb r2, [ip, #46] ; 0x2e + 1f0ef84: e1a02c26 lsr r2, r6, #24 + 1f0ef88: e5953010 ldr r3, [r5, #16] + 1f0ef8c: e5c3600c strb r6, [r3, #12] + 1f0ef90: e5c3e00d strb lr, [r3, #13] + 1f0ef94: e5c3700e strb r7, [r3, #14] + 1f0ef98: e5c3200f strb r2, [r3, #15] + 1f0ef9c: e5953010 ldr r3, [r5, #16] + 1f0efa0: e5c31015 strb r1, [r3, #21] + 1f0efa4: e5953010 ldr r3, [r5, #16] + 1f0efa8: e5c31010 strb r1, [r3, #16] + 1f0efac: e5c31011 strb r1, [r3, #17] + 1f0efb0: e5c31012 strb r1, [r3, #18] + 1f0efb4: e5c31013 strb r1, [r3, #19] + 1f0efb8: ebffe7e5 bl 1f08f54 + 1f0efbc: e2501000 subs r1, r0, #0 + 1f0efc0: 01a00005 moveq r0, r5 + 1f0efc4: 1affff8e bne 1f0ee04 + 1f0efc8: ebffdc7b bl 1f061bc + 1f0efcc: e5d43028 ldrb r3, [r4, #40] ; 0x28 + 1f0efd0: e3500000 cmp r0, #0 + 1f0efd4: e1a01000 mov r1, r0 + 1f0efd8: e3c33040 bic r3, r3, #64 ; 0x40 + 1f0efdc: e5c43028 strb r3, [r4, #40] ; 0x28 + 1f0efe0: 05945000 ldreq r5, [r4] + 1f0efe4: 1affff86 bne 1f0ee04 + 1f0efe8: e3550000 cmp r5, #0 + 1f0efec: 0affff83 beq 1f0ee00 + 1f0eff0: e5d53000 ldrb r3, [r5] + 1f0eff4: e3530000 cmp r3, #0 + 1f0eff8: 0affff80 beq 1f0ee00 + 1f0effc: e1d520b6 ldrh r2, [r5, #6] + 1f0f000: e1d430b4 ldrh r3, [r4, #4] + 1f0f004: e1520003 cmp r2, r3 + 1f0f008: 1affff7c bne 1f0ee00 + 1f0f00c: e5d50001 ldrb r0, [r5, #1] + 1f0f010: eb005daa bl 1f266c0 + 1f0f014: e2100001 ands r0, r0, #1 + 1f0f018: 01a01000 moveq r1, r0 + 1f0f01c: 05840000 streq r0, [r4] + 1f0f020: 0affff77 beq 1f0ee04 + 1f0f024: eaffff75 b 1f0ee00 + 1f0f028: e5948040 ldr r8, [r4, #64] ; 0x40 + 1f0f02c: e5957044 ldr r7, [r5, #68] ; 0x44 + 1f0f030: e1580007 cmp r8, r7 + 1f0f034: 0a00000e beq 1f0f074 + 1f0f038: e5d53003 ldrb r3, [r5, #3] + 1f0f03c: e285a048 add sl, r5, #72 ; 0x48 + 1f0f040: e3530000 cmp r3, #0 + 1f0f044: 1a00003b bne 1f0f138 + 1f0f048: e1a0100a mov r1, sl + 1f0f04c: e3a03001 mov r3, #1 + 1f0f050: e1a02008 mov r2, r8 + 1f0f054: e5d50001 ldrb r0, [r5, #1] + 1f0f058: eb005d9c bl 1f266d0 + 1f0f05c: e3500000 cmp r0, #0 + 1f0f060: 13e03000 mvnne r3, #0 + 1f0f064: 13a01001 movne r1, #1 + 1f0f068: 15853044 strne r3, [r5, #68] ; 0x44 + 1f0f06c: 1affff64 bne 1f0ee04 + 1f0f070: e5858044 str r8, [r5, #68] ; 0x44 + 1f0f074: e5943044 ldr r3, [r4, #68] ; 0x44 + 1f0f078: e1a0c426 lsr ip, r6, #8 + 1f0f07c: e5d3200b ldrb r2, [r3, #11] + 1f0f080: e3822020 orr r2, r2, #32 + 1f0f084: e5c3200b strb r2, [r3, #11] + 1f0f088: e5942008 ldr r2, [r4, #8] + 1f0f08c: e5941000 ldr r1, [r4] + 1f0f090: e5c3201a strb r2, [r3, #26] + 1f0f094: e1a00442 asr r0, r2, #8 + 1f0f098: e5c3001b strb r0, [r3, #27] + 1f0f09c: e5d11000 ldrb r1, [r1] + 1f0f0a0: e3510003 cmp r1, #3 + 1f0f0a4: e1a01826 lsr r1, r6, #16 + 1f0f0a8: 01a02822 lsreq r2, r2, #16 + 1f0f0ac: 05c32014 strbeq r2, [r3, #20] + 1f0f0b0: 01a02442 asreq r2, r2, #8 + 1f0f0b4: 05c32015 strbeq r2, [r3, #21] + 1f0f0b8: e5942010 ldr r2, [r4, #16] + 1f0f0bc: e5c3201c strb r2, [r3, #28] + 1f0f0c0: e5c36016 strb r6, [r3, #22] + 1f0f0c4: e1a06c26 lsr r6, r6, #24 + 1f0f0c8: e1a00422 lsr r0, r2, #8 + 1f0f0cc: e5c31018 strb r1, [r3, #24] + 1f0f0d0: e5c3001d strb r0, [r3, #29] + 1f0f0d4: e3a01001 mov r1, #1 + 1f0f0d8: e1a00822 lsr r0, r2, #16 + 1f0f0dc: e5c3c017 strb ip, [r3, #23] + 1f0f0e0: e1a02c22 lsr r2, r2, #24 + 1f0f0e4: e5c3001e strb r0, [r3, #30] + 1f0f0e8: e5c3201f strb r2, [r3, #31] + 1f0f0ec: e1a00005 mov r0, r5 + 1f0f0f0: e3a02000 mov r2, #0 + 1f0f0f4: e5c36019 strb r6, [r3, #25] + 1f0f0f8: e5c32012 strb r2, [r3, #18] + 1f0f0fc: e5c32013 strb r2, [r3, #19] + 1f0f100: e5c51003 strb r1, [r5, #3] + 1f0f104: eaffffaf b 1f0efc8 + 1f0f108: e3a03001 mov r3, #1 + 1f0f10c: e594203c ldr r2, [r4, #60] ; 0x3c + 1f0f110: e2841048 add r1, r4, #72 ; 0x48 + 1f0f114: e5d50001 ldrb r0, [r5, #1] + 1f0f118: eb005d8a bl 1f26748 + 1f0f11c: e3500000 cmp r0, #0 + 1f0f120: 05d43028 ldrbeq r3, [r4, #40] ; 0x28 + 1f0f124: 0203307f andeq r3, r3, #127 ; 0x7f + 1f0f128: 05c43028 strbeq r3, [r4, #40] ; 0x28 + 1f0f12c: 0affff3d beq 1f0ee28 + 1f0f130: e3a01001 mov r1, #1 + 1f0f134: eaffff32 b 1f0ee04 + 1f0f138: e3a03001 mov r3, #1 + 1f0f13c: e1a0100a mov r1, sl + 1f0f140: e1a02007 mov r2, r7 + 1f0f144: e5d50001 ldrb r0, [r5, #1] + 1f0f148: eb005d7e bl 1f26748 + 1f0f14c: e3500000 cmp r0, #0 + 1f0f150: 1afffff6 bne 1f0f130 + 1f0f154: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f0f158: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f0f15c: e0622007 rsb r2, r2, r7 + 1f0f160: e5c50003 strb r0, [r5, #3] + 1f0f164: e1520003 cmp r2, r3 + 1f0f168: 2affffb6 bcs 1f0f048 + 1f0f16c: e5d59002 ldrb r9, [r5, #2] + 1f0f170: e3590001 cmp r9, #1 + 1f0f174: 8a000001 bhi 1f0f180 + 1f0f178: eaffffb2 b 1f0f048 + 1f0f17c: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f0f180: e0877003 add r7, r7, r3 + 1f0f184: e2499001 sub r9, r9, #1 + 1f0f188: e1a02007 mov r2, r7 + 1f0f18c: e3a03001 mov r3, #1 + 1f0f190: e1a0100a mov r1, sl + 1f0f194: e5d50001 ldrb r0, [r5, #1] + 1f0f198: eb005d6a bl 1f26748 + 1f0f19c: e3590001 cmp r9, #1 + 1f0f1a0: 1afffff5 bne 1f0f17c + 1f0f1a4: eaffffa7 b 1f0f048 + 1f0f1a8: e5948018 ldr r8, [r4, #24] + 1f0f1ac: e5947008 ldr r7, [r4, #8] + 1f0f1b0: e3580000 cmp r8, #0 + 1f0f1b4: 0a00001b beq 1f0f228 + 1f0f1b8: e3570001 cmp r7, #1 + 1f0f1bc: 8a000003 bhi 1f0f1d0 + 1f0f1c0: e3a01002 mov r1, #2 + 1f0f1c4: e1a00001 mov r0, r1 + 1f0f1c8: e28dd050 add sp, sp, #80 ; 0x50 + 1f0f1cc: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f0f1d0: e5940000 ldr r0, [r4] + 1f0f1d4: e590302c ldr r3, [r0, #44] ; 0x2c + 1f0f1d8: e1530007 cmp r3, r7 + 1f0f1dc: 9afffff7 bls 1f0f1c0 + 1f0f1e0: e0878008 add r8, r7, r8 + 1f0f1e4: e2877001 add r7, r7, #1 + 1f0f1e8: ea000007 b 1f0f20c + 1f0f1ec: e3570001 cmp r7, #1 + 1f0f1f0: 9afffff2 bls 1f0f1c0 + 1f0f1f4: e5940000 ldr r0, [r4] + 1f0f1f8: e2873001 add r3, r7, #1 + 1f0f1fc: e590202c ldr r2, [r0, #44] ; 0x2c + 1f0f200: e1520007 cmp r2, r7 + 1f0f204: 9affffed bls 1f0f1c0 + 1f0f208: e1a07003 mov r7, r3 + 1f0f20c: e1a02007 mov r2, r7 + 1f0f210: e2471001 sub r1, r7, #1 + 1f0f214: ebffdce1 bl 1f065a0 + 1f0f218: e3500000 cmp r0, #0 + 1f0f21c: 1a000004 bne 1f0f234 + 1f0f220: e1570008 cmp r7, r8 + 1f0f224: 1afffff0 bne 1f0f1ec + 1f0f228: e3a03000 mov r3, #0 + 1f0f22c: e5c43007 strb r3, [r4, #7] + 1f0f230: eaffff04 b 1f0ee48 + 1f0f234: e1a01000 mov r1, r0 + 1f0f238: eafffef1 b 1f0ee04 + +01f0f23c : + 1f0f23c: e92d4010 push {r4, lr} + 1f0f240: e3a02000 mov r2, #0 + 1f0f244: e24dd060 sub sp, sp, #96 ; 0x60 + 1f0f248: e28d100c add r1, sp, #12 + 1f0f24c: e58d0004 str r0, [sp, #4] + 1f0f250: e28d0004 add r0, sp, #4 + 1f0f254: ebffd92d bl 1f05710 + 1f0f258: e3500000 cmp r0, #0 + 1f0f25c: 0a000001 beq 1f0f268 + 1f0f260: e28dd060 add sp, sp, #96 ; 0x60 + 1f0f264: e8bd8010 pop {r4, pc} + 1f0f268: e59d300c ldr r3, [sp, #12] + 1f0f26c: e28d0010 add r0, sp, #16 + 1f0f270: e59d1004 ldr r1, [sp, #4] + 1f0f274: e58d3010 str r3, [sp, #16] + 1f0f278: ebfff4bf bl 1f0c57c + 1f0f27c: e3500000 cmp r0, #0 + 1f0f280: 1a000015 bne 1f0f2dc + 1f0f284: e1dd35d3 ldrsb r3, [sp, #83] ; 0x53 + 1f0f288: e3530000 cmp r3, #0 + 1f0f28c: ba000016 blt 1f0f2ec + 1f0f290: e5dd3016 ldrb r3, [sp, #22] + 1f0f294: e3130010 tst r3, #16 + 1f0f298: 03a00005 moveq r0, #5 + 1f0f29c: 0affffef beq 1f0f260 + 1f0f2a0: e59d300c ldr r3, [sp, #12] + 1f0f2a4: e5d32000 ldrb r2, [r3] + 1f0f2a8: e3520004 cmp r2, #4 + 1f0f2ac: 0a00001b beq 1f0f320 + 1f0f2b0: e59d1044 ldr r1, [sp, #68] ; 0x44 + 1f0f2b4: e3520003 cmp r2, #3 + 1f0f2b8: e5d1c01b ldrb ip, [r1, #27] + 1f0f2bc: e5d1201a ldrb r2, [r1, #26] + 1f0f2c0: e182240c orr r2, r2, ip, lsl #8 + 1f0f2c4: 05d1c015 ldrbeq ip, [r1, #21] + 1f0f2c8: 05d11014 ldrbeq r1, [r1, #20] + 1f0f2cc: 0181140c orreq r1, r1, ip, lsl #8 + 1f0f2d0: 01822801 orreq r2, r2, r1, lsl #16 + 1f0f2d4: e583201c str r2, [r3, #28] + 1f0f2d8: eaffffe0 b 1f0f260 + 1f0f2dc: e3500004 cmp r0, #4 + 1f0f2e0: 03a00005 moveq r0, #5 + 1f0f2e4: e28dd060 add sp, sp, #96 ; 0x60 + 1f0f2e8: e8bd8010 pop {r4, pc} + 1f0f2ec: e59d300c ldr r3, [sp, #12] + 1f0f2f0: e59d1018 ldr r1, [sp, #24] + 1f0f2f4: e5d32000 ldrb r2, [r3] + 1f0f2f8: e583101c str r1, [r3, #28] + 1f0f2fc: e3520004 cmp r2, #4 + 1f0f300: 1affffd6 bne 1f0f260 + 1f0f304: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f0f308: e59d1030 ldr r1, [sp, #48] ; 0x30 + 1f0f30c: e59dc02c ldr ip, [sp, #44] ; 0x2c + 1f0f310: e583c020 str ip, [r3, #32] + 1f0f314: e5831024 str r1, [r3, #36] ; 0x24 + 1f0f318: e5832028 str r2, [r3, #40] ; 0x28 + 1f0f31c: eaffffcf b 1f0f260 + 1f0f320: e593e010 ldr lr, [r3, #16] + 1f0f324: e59dc020 ldr ip, [sp, #32] + 1f0f328: e5dd1017 ldrb r1, [sp, #23] + 1f0f32c: e1de43b6 ldrh r4, [lr, #54] ; 0x36 + 1f0f330: e3ccc0ff bic ip, ip, #255 ; 0xff + 1f0f334: e5de2035 ldrb r2, [lr, #53] ; 0x35 + 1f0f338: e18cc001 orr ip, ip, r1 + 1f0f33c: e5de1034 ldrb r1, [lr, #52] ; 0x34 + 1f0f340: e1822404 orr r2, r2, r4, lsl #8 + 1f0f344: e59de054 ldr lr, [sp, #84] ; 0x54 + 1f0f348: e59d4018 ldr r4, [sp, #24] + 1f0f34c: e1812402 orr r2, r1, r2, lsl #8 + 1f0f350: e583c024 str ip, [r3, #36] ; 0x24 + 1f0f354: e583201c str r2, [r3, #28] + 1f0f358: e5834020 str r4, [r3, #32] + 1f0f35c: e583e028 str lr, [r3, #40] ; 0x28 + 1f0f360: eaffffbe b 1f0f260 + +01f0f364 : + 1f0f364: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f0f368: e3a03000 mov r3, #0 + 1f0f36c: e1a07001 mov r7, r1 + 1f0f370: e24ddf63 sub sp, sp, #396 ; 0x18c + 1f0f374: e1a02003 mov r2, r3 + 1f0f378: e58d000c str r0, [sp, #12] + 1f0f37c: e58d1004 str r1, [sp, #4] + 1f0f380: e28d1014 add r1, sp, #20 + 1f0f384: e5c03000 strb r3, [r0] + 1f0f388: e28d000c add r0, sp, #12 + 1f0f38c: ebffd8df bl 1f05710 + 1f0f390: e2506000 subs r6, r0, #0 + 1f0f394: 1a000025 bne 1f0f430 + 1f0f398: e59d3014 ldr r3, [sp, #20] + 1f0f39c: e58d3018 str r3, [sp, #24] + 1f0f3a0: e5d32000 ldrb r2, [r3] + 1f0f3a4: e3520004 cmp r2, #4 + 1f0f3a8: 0a000023 beq 1f0f43c + 1f0f3ac: e593501c ldr r5, [r3, #28] + 1f0f3b0: e58d5020 str r5, [sp, #32] + 1f0f3b4: e3550000 cmp r5, #0 + 1f0f3b8: 0a00001f beq 1f0f43c + 1f0f3bc: e28d4082 add r4, sp, #130 ; 0x82 + 1f0f3c0: e58d6008 str r6, [sp, #8] + 1f0f3c4: e3a01020 mov r1, #32 + 1f0f3c8: e28d0018 add r0, sp, #24 + 1f0f3cc: ebffe3a9 bl 1f08278 + 1f0f3d0: e3500000 cmp r0, #0 + 1f0f3d4: 1a000063 bne 1f0f568 + 1f0f3d8: e59db014 ldr fp, [sp, #20] + 1f0f3dc: e59d8048 ldr r8, [sp, #72] ; 0x48 + 1f0f3e0: e59b6044 ldr r6, [fp, #68] ; 0x44 + 1f0f3e4: e1580006 cmp r8, r6 + 1f0f3e8: 0a00001a beq 1f0f458 + 1f0f3ec: e5db3003 ldrb r3, [fp, #3] + 1f0f3f0: e28ba048 add sl, fp, #72 ; 0x48 + 1f0f3f4: e3530000 cmp r3, #0 + 1f0f3f8: 1a0000a5 bne 1f0f694 + 1f0f3fc: e1a0100a mov r1, sl + 1f0f400: e3a03001 mov r3, #1 + 1f0f404: e1a02008 mov r2, r8 + 1f0f408: e5db0001 ldrb r0, [fp, #1] + 1f0f40c: eb005caf bl 1f266d0 + 1f0f410: e3500000 cmp r0, #0 + 1f0f414: 0a00000d beq 1f0f450 + 1f0f418: e3e03000 mvn r3, #0 + 1f0f41c: e3a06001 mov r6, #1 + 1f0f420: e58b3044 str r3, [fp, #68] ; 0x44 + 1f0f424: e59d200c ldr r2, [sp, #12] + 1f0f428: e3a03000 mov r3, #0 + 1f0f42c: e5c23000 strb r3, [r2] + 1f0f430: e1a00006 mov r0, r6 + 1f0f434: e28ddf63 add sp, sp, #396 ; 0x18c + 1f0f438: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0f43c: e59d300c ldr r3, [sp, #12] + 1f0f440: e3a0102f mov r1, #47 ; 0x2f + 1f0f444: e2832001 add r2, r3, #1 + 1f0f448: e5c31000 strb r1, [r3] + 1f0f44c: eafffff5 b 1f0f428 + 1f0f450: e58b8044 str r8, [fp, #68] ; 0x44 + 1f0f454: e59db014 ldr fp, [sp, #20] + 1f0f458: e59d204c ldr r2, [sp, #76] ; 0x4c + 1f0f45c: e28d0018 add r0, sp, #24 + 1f0f460: e5db3000 ldrb r3, [fp] + 1f0f464: e5d2101b ldrb r1, [r2, #27] + 1f0f468: e3530003 cmp r3, #3 + 1f0f46c: e5d2301a ldrb r3, [r2, #26] + 1f0f470: e1833401 orr r3, r3, r1, lsl #8 + 1f0f474: 05d21015 ldrbeq r1, [r2, #21] + 1f0f478: 05d22014 ldrbeq r2, [r2, #20] + 1f0f47c: 01822401 orreq r2, r2, r1, lsl #8 + 1f0f480: e3a01000 mov r1, #0 + 1f0f484: 01833802 orreq r3, r3, r2, lsl #16 + 1f0f488: e58d3020 str r3, [sp, #32] + 1f0f48c: ebffe379 bl 1f08278 + 1f0f490: e3500000 cmp r0, #0 + 1f0f494: 1a000033 bne 1f0f568 + 1f0f498: e28d0018 add r0, sp, #24 + 1f0f49c: ebffec05 bl 1f0a4b8 + 1f0f4a0: e3500000 cmp r0, #0 + 1f0f4a4: 1a00002d bne 1f0f560 + 1f0f4a8: e59d3014 ldr r3, [sp, #20] + 1f0f4ac: e59d204c ldr r2, [sp, #76] ; 0x4c + 1f0f4b0: e5d33000 ldrb r3, [r3] + 1f0f4b4: e5d2101b ldrb r1, [r2, #27] + 1f0f4b8: e3530003 cmp r3, #3 + 1f0f4bc: e5d2301a ldrb r3, [r2, #26] + 1f0f4c0: e1833401 orr r3, r3, r1, lsl #8 + 1f0f4c4: 05d21015 ldrbeq r1, [r2, #21] + 1f0f4c8: 05d22014 ldrbeq r2, [r2, #20] + 1f0f4cc: 01822401 orreq r2, r2, r1, lsl #8 + 1f0f4d0: 01833802 orreq r3, r3, r2, lsl #16 + 1f0f4d4: e1530005 cmp r3, r5 + 1f0f4d8: 0a000024 beq 1f0f570 + 1f0f4dc: e59d3048 ldr r3, [sp, #72] ; 0x48 + 1f0f4e0: e3530000 cmp r3, #0 + 1f0f4e4: 1a000001 bne 1f0f4f0 + 1f0f4e8: e3a06002 mov r6, #2 + 1f0f4ec: eaffffcc b 1f0f424 + 1f0f4f0: e59d8018 ldr r8, [sp, #24] + 1f0f4f4: e59d6040 ldr r6, [sp, #64] ; 0x40 + 1f0f4f8: e5d82000 ldrb r2, [r8] + 1f0f4fc: e2866020 add r6, r6, #32 + 1f0f500: e3520004 cmp r2, #4 + 1f0f504: 13a02602 movne r2, #2097152 ; 0x200000 + 1f0f508: 03a02201 moveq r2, #268435456 ; 0x10000000 + 1f0f50c: e1560002 cmp r6, r2 + 1f0f510: 2afffff4 bcs 1f0f4e8 + 1f0f514: e7e89056 ubfx r9, r6, #0, #9 + 1f0f518: e3590000 cmp r9, #0 + 1f0f51c: 1a000007 bne 1f0f540 + 1f0f520: e59d1044 ldr r1, [sp, #68] ; 0x44 + 1f0f524: e2833001 add r3, r3, #1 + 1f0f528: e58d3048 str r3, [sp, #72] ; 0x48 + 1f0f52c: e3510000 cmp r1, #0 + 1f0f530: 1a000041 bne 1f0f63c + 1f0f534: e1d830b8 ldrh r3, [r8, #8] + 1f0f538: e15302a6 cmp r3, r6, lsr #5 + 1f0f53c: 9affffe9 bls 1f0f4e8 + 1f0f540: e2883048 add r3, r8, #72 ; 0x48 + 1f0f544: e28d0018 add r0, sp, #24 + 1f0f548: e0833009 add r3, r3, r9 + 1f0f54c: e58d6040 str r6, [sp, #64] ; 0x40 + 1f0f550: e58d304c str r3, [sp, #76] ; 0x4c + 1f0f554: ebffebd7 bl 1f0a4b8 + 1f0f558: e3500000 cmp r0, #0 + 1f0f55c: 0affffd1 beq 1f0f4a8 + 1f0f560: e3500004 cmp r0, #4 + 1f0f564: 0affffdf beq 1f0f4e8 + 1f0f568: e1a06000 mov r6, r0 + 1f0f56c: eaffffac b 1f0f424 + 1f0f570: e28d1068 add r1, sp, #104 ; 0x68 + 1f0f574: e28d0018 add r0, sp, #24 + 1f0f578: ebffd6b9 bl 1f05064 + 1f0f57c: e5dd3082 ldrb r3, [sp, #130] ; 0x82 + 1f0f580: e3530000 cmp r3, #0 + 1f0f584: 11a02004 movne r2, r4 + 1f0f588: 13a03000 movne r3, #0 + 1f0f58c: 1a000001 bne 1f0f598 + 1f0f590: ea000061 b 1f0f71c + 1f0f594: e1a03000 mov r3, r0 + 1f0f598: e1f210d1 ldrsb r1, [r2, #1]! + 1f0f59c: e2830001 add r0, r3, #1 + 1f0f5a0: e3510000 cmp r1, #0 + 1f0f5a4: 1afffffa bne 1f0f594 + 1f0f5a8: e2832004 add r2, r3, #4 + 1f0f5ac: e1520007 cmp r2, r7 + 1f0f5b0: 8a00005b bhi 1f0f724 + 1f0f5b4: e283301b add r3, r3, #27 + 1f0f5b8: e28d1068 add r1, sp, #104 ; 0x68 + 1f0f5bc: e1a02007 mov r2, r7 + 1f0f5c0: e0813003 add r3, r1, r3 + 1f0f5c4: e173c0d1 ldrsb ip, [r3, #-1]! + 1f0f5c8: e2422001 sub r2, r2, #1 + 1f0f5cc: e59d100c ldr r1, [sp, #12] + 1f0f5d0: e1540003 cmp r4, r3 + 1f0f5d4: e7c1c002 strb ip, [r1, r2] + 1f0f5d8: 1afffff9 bne 1f0f5c4 + 1f0f5dc: e0607007 rsb r7, r0, r7 + 1f0f5e0: e2477001 sub r7, r7, #1 + 1f0f5e4: e59d300c ldr r3, [sp, #12] + 1f0f5e8: e3a0202f mov r2, #47 ; 0x2f + 1f0f5ec: e7c32007 strb r2, [r3, r7] + 1f0f5f0: e59d5020 ldr r5, [sp, #32] + 1f0f5f4: e3550000 cmp r5, #0 + 1f0f5f8: 1affff71 bne 1f0f3c4 + 1f0f5fc: e99d0041 ldmib sp, {r0, r6} + 1f0f600: e59d300c ldr r3, [sp, #12] + 1f0f604: e1500007 cmp r0, r7 + 1f0f608: 0affff8c beq 1f0f440 + 1f0f60c: e1a02003 mov r2, r3 + 1f0f610: e1a01003 mov r1, r3 + 1f0f614: ea000000 b 1f0f61c + 1f0f618: e59d100c ldr r1, [sp, #12] + 1f0f61c: e2873001 add r3, r7, #1 + 1f0f620: e19110d7 ldrsb r1, [r1, r7] + 1f0f624: e1500003 cmp r0, r3 + 1f0f628: e1a07003 mov r7, r3 + 1f0f62c: e4c21001 strb r1, [r2], #1 + 1f0f630: 8afffff8 bhi 1f0f618 + 1f0f634: e3a06000 mov r6, #0 + 1f0f638: eaffff7a b 1f0f428 + 1f0f63c: e1d830ba ldrh r3, [r8, #10] + 1f0f640: e2433001 sub r3, r3, #1 + 1f0f644: e013a4a6 ands sl, r3, r6, lsr #9 + 1f0f648: 1affffbc bne 1f0f540 + 1f0f64c: e28d0018 add r0, sp, #24 + 1f0f650: ebffdf01 bl 1f0725c + 1f0f654: e3500001 cmp r0, #1 + 1f0f658: 9a00002d bls 1f0f714 + 1f0f65c: e3700001 cmn r0, #1 + 1f0f660: 0a000029 beq 1f0f70c + 1f0f664: e598302c ldr r3, [r8, #44] ; 0x2c + 1f0f668: e1500003 cmp r0, r3 + 1f0f66c: 2affff9d bcs 1f0f4e8 + 1f0f670: e2433002 sub r3, r3, #2 + 1f0f674: e2402002 sub r2, r0, #2 + 1f0f678: e1520003 cmp r2, r3 + 1f0f67c: e58d0044 str r0, [sp, #68] ; 0x44 + 1f0f680: 31d8a0ba ldrhcc sl, [r8, #10] + 1f0f684: 35983040 ldrcc r3, [r8, #64] ; 0x40 + 1f0f688: 302a3a92 mlacc sl, r2, sl, r3 + 1f0f68c: e58da048 str sl, [sp, #72] ; 0x48 + 1f0f690: eaffffaa b 1f0f540 + 1f0f694: e3a03001 mov r3, #1 + 1f0f698: e1a0100a mov r1, sl + 1f0f69c: e1a02006 mov r2, r6 + 1f0f6a0: e5db0001 ldrb r0, [fp, #1] + 1f0f6a4: eb005c27 bl 1f26748 + 1f0f6a8: e3500000 cmp r0, #0 + 1f0f6ac: 1a000014 bne 1f0f704 + 1f0f6b0: e59b2038 ldr r2, [fp, #56] ; 0x38 + 1f0f6b4: e59b3030 ldr r3, [fp, #48] ; 0x30 + 1f0f6b8: e0622006 rsb r2, r2, r6 + 1f0f6bc: e5cb0003 strb r0, [fp, #3] + 1f0f6c0: e1520003 cmp r2, r3 + 1f0f6c4: 2affff4c bcs 1f0f3fc + 1f0f6c8: e5db9002 ldrb r9, [fp, #2] + 1f0f6cc: e3590001 cmp r9, #1 + 1f0f6d0: 8a000001 bhi 1f0f6dc + 1f0f6d4: eaffff48 b 1f0f3fc + 1f0f6d8: e59b3030 ldr r3, [fp, #48] ; 0x30 + 1f0f6dc: e0866003 add r6, r6, r3 + 1f0f6e0: e2499001 sub r9, r9, #1 + 1f0f6e4: e1a02006 mov r2, r6 + 1f0f6e8: e3a03001 mov r3, #1 + 1f0f6ec: e1a0100a mov r1, sl + 1f0f6f0: e5db0001 ldrb r0, [fp, #1] + 1f0f6f4: eb005c13 bl 1f26748 + 1f0f6f8: e3590001 cmp r9, #1 + 1f0f6fc: 1afffff5 bne 1f0f6d8 + 1f0f700: eaffff3d b 1f0f3fc + 1f0f704: e3a06001 mov r6, #1 + 1f0f708: eaffff45 b 1f0f424 + 1f0f70c: e3a00001 mov r0, #1 + 1f0f710: eaffff94 b 1f0f568 + 1f0f714: e3a00002 mov r0, #2 + 1f0f718: eaffff92 b 1f0f568 + 1f0f71c: e3570002 cmp r7, #2 + 1f0f720: 8affffae bhi 1f0f5e0 + 1f0f724: e3a06011 mov r6, #17 + 1f0f728: eaffff3d b 1f0f424 + +01f0f72c : + 1f0f72c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f0f730: e2504000 subs r4, r0, #0 + 1f0f734: e24dd00c sub sp, sp, #12 + 1f0f738: 0a000007 beq 1f0f75c + 1f0f73c: e1a0b003 mov fp, r3 + 1f0f740: e5943000 ldr r3, [r4] + 1f0f744: e3530000 cmp r3, #0 + 1f0f748: 0a000003 beq 1f0f75c + 1f0f74c: e1a0a002 mov sl, r2 + 1f0f750: e5d32000 ldrb r2, [r3] + 1f0f754: e3520000 cmp r2, #0 + 1f0f758: 1a000002 bne 1f0f768 + 1f0f75c: e3a00009 mov r0, #9 + 1f0f760: e28dd00c add sp, sp, #12 + 1f0f764: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0f768: e1d310b6 ldrh r1, [r3, #6] + 1f0f76c: e1d420b4 ldrh r2, [r4, #4] + 1f0f770: e1510002 cmp r1, r2 + 1f0f774: 1afffff8 bne 1f0f75c + 1f0f778: e5d30001 ldrb r0, [r3, #1] + 1f0f77c: eb005bcf bl 1f266c0 + 1f0f780: e3100001 tst r0, #1 + 1f0f784: 1afffff4 bne 1f0f75c + 1f0f788: e5d40029 ldrb r0, [r4, #41] ; 0x29 + 1f0f78c: e5945000 ldr r5, [r4] + 1f0f790: e3500000 cmp r0, #0 + 1f0f794: 1afffff1 bne 1f0f760 + 1f0f798: e3a01000 mov r1, #0 + 1f0f79c: e3e00000 mvn r0, #0 + 1f0f7a0: e15b0001 cmp fp, r1 + 1f0f7a4: e5d52000 ldrb r2, [r5] + 1f0f7a8: 015a0000 cmpeq sl, r0 + 1f0f7ac: 83a03001 movhi r3, #1 + 1f0f7b0: 93a03000 movls r3, #0 + 1f0f7b4: e3520004 cmp r2, #4 + 1f0f7b8: 03a03000 moveq r3, #0 + 1f0f7bc: 12033001 andne r3, r3, #1 + 1f0f7c0: e3530000 cmp r3, #0 + 1f0f7c4: 0a000055 beq 1f0f920 + 1f0f7c8: e1c4a1d0 ldrd sl, [r4, #16] + 1f0f7cc: e3a03000 mov r3, #0 + 1f0f7d0: e3e02001 mvn r2, #1 + 1f0f7d4: e15b0003 cmp fp, r3 + 1f0f7d8: 015a0002 cmpeq sl, r2 + 1f0f7dc: 8a000002 bhi 1f0f7ec + 1f0f7e0: e5d43028 ldrb r3, [r4, #40] ; 0x28 + 1f0f7e4: e3130002 tst r3, #2 + 1f0f7e8: 0a000054 beq 1f0f940 + 1f0f7ec: f2c00010 vmov.i32 d16, #0 ; 0x00000000 + 1f0f7f0: e1a0a000 mov sl, r0 + 1f0f7f4: e1a0b001 mov fp, r1 + 1f0f7f8: e1c463d0 ldrd r6, [r4, #48] ; 0x30 + 1f0f7fc: edc40b0c vstr d16, [r4, #48] ; 0x30 + 1f0f800: e1d580ba ldrh r8, [r5, #10] + 1f0f804: e1963007 orrs r3, r6, r7 + 1f0f808: e1a08488 lsl r8, r8, #9 + 1f0f80c: 0a000053 beq 1f0f960 + 1f0f810: e2566001 subs r6, r6, #1 + 1f0f814: e1a02008 mov r2, r8 + 1f0f818: e2c77000 sbc r7, r7, #0 + 1f0f81c: e25a0001 subs r0, sl, #1 + 1f0f820: e2cb1000 sbc r1, fp, #0 + 1f0f824: e3a03000 mov r3, #0 + 1f0f828: eb00f1cb bl 1f4bf5c <__aeabi_uldivmod> + 1f0f82c: e1a02008 mov r2, r8 + 1f0f830: e1cd00f0 strd r0, [sp] + 1f0f834: e3a03000 mov r3, #0 + 1f0f838: e1a00006 mov r0, r6 + 1f0f83c: e1a01007 mov r1, r7 + 1f0f840: eb00f1c5 bl 1f4bf5c <__aeabi_uldivmod> + 1f0f844: e1cd20d0 ldrd r2, [sp] + 1f0f848: e1530001 cmp r3, r1 + 1f0f84c: 01520000 cmpeq r2, r0 + 1f0f850: 3a000042 bcc 1f0f960 + 1f0f854: e2483001 sub r3, r8, #1 + 1f0f858: e5942038 ldr r2, [r4, #56] ; 0x38 + 1f0f85c: e1c66003 bic r6, r6, r3 + 1f0f860: e05aa006 subs sl, sl, r6 + 1f0f864: e0cbb007 sbc fp, fp, r7 + 1f0f868: e3520000 cmp r2, #0 + 1f0f86c: e1c463f0 strd r6, [r4, #48] ; 0x30 + 1f0f870: 0a000042 beq 1f0f980 + 1f0f874: e3a09000 mov r9, #0 + 1f0f878: e15b0009 cmp fp, r9 + 1f0f87c: 015a0008 cmpeq sl, r8 + 1f0f880: 9a00007a bls 1f0fa70 + 1f0f884: e05aa008 subs sl, sl, r8 + 1f0f888: e0cbb009 sbc fp, fp, r9 + 1f0f88c: ea000016 b 1f0f8ec + 1f0f890: e1c421d0 ldrd r2, [r4, #16] + 1f0f894: e38cc040 orr ip, ip, #64 ; 0x40 + 1f0f898: e1570003 cmp r7, r3 + 1f0f89c: 01560002 cmpeq r6, r2 + 1f0f8a0: 81c461f0 strdhi r6, [r4, #16] + 1f0f8a4: 85c4c028 strbhi ip, [r4, #40] ; 0x28 + 1f0f8a8: ebffdfb2 bl 1f07778 + 1f0f8ac: e2502000 subs r2, r0, #0 + 1f0f8b0: 0a000084 beq 1f0fac8 + 1f0f8b4: e3720001 cmn r2, #1 + 1f0f8b8: 0a00004e beq 1f0f9f8 + 1f0f8bc: e3520001 cmp r2, #1 + 1f0f8c0: 9a000050 bls 1f0fa08 + 1f0f8c4: e595302c ldr r3, [r5, #44] ; 0x2c + 1f0f8c8: e1520003 cmp r2, r3 + 1f0f8cc: 2a00004d bcs 1f0fa08 + 1f0f8d0: e15b0009 cmp fp, r9 + 1f0f8d4: e5842038 str r2, [r4, #56] ; 0x38 + 1f0f8d8: 015a0008 cmpeq sl, r8 + 1f0f8dc: 9a000062 bls 1f0fa6c + 1f0f8e0: e1c463d0 ldrd r6, [r4, #48] ; 0x30 + 1f0f8e4: e05aa008 subs sl, sl, r8 + 1f0f8e8: e0cbb009 sbc fp, fp, r9 + 1f0f8ec: e5d4c028 ldrb ip, [r4, #40] ; 0x28 + 1f0f8f0: e0966008 adds r6, r6, r8 + 1f0f8f4: e0a77009 adc r7, r7, r9 + 1f0f8f8: e1a01002 mov r1, r2 + 1f0f8fc: e31c0002 tst ip, #2 + 1f0f900: e1a00004 mov r0, r4 + 1f0f904: e1c463f0 strd r6, [r4, #48] ; 0x30 + 1f0f908: 1affffe0 bne 1f0f890 + 1f0f90c: e1a01002 mov r1, r2 + 1f0f910: e1a00004 mov r0, r4 + 1f0f914: ebffde50 bl 1f0725c + 1f0f918: e1a02000 mov r2, r0 + 1f0f91c: eaffffe4 b 1f0f8b4 + 1f0f920: e1c421d0 ldrd r2, [r4, #16] + 1f0f924: e15b0003 cmp fp, r3 + 1f0f928: 015a0002 cmpeq sl, r2 + 1f0f92c: 9a000003 bls 1f0f940 + 1f0f930: e5d41028 ldrb r1, [r4, #40] ; 0x28 + 1f0f934: e3110002 tst r1, #2 + 1f0f938: 01a0a002 moveq sl, r2 + 1f0f93c: 01a0b003 moveq fp, r3 + 1f0f940: f2c00010 vmov.i32 d16, #0 ; 0x00000000 + 1f0f944: e19a300b orrs r3, sl, fp + 1f0f948: e1c463d0 ldrd r6, [r4, #48] ; 0x30 + 1f0f94c: edc40b0c vstr d16, [r4, #48] ; 0x30 + 1f0f950: 1affffaa bne 1f0f800 + 1f0f954: e3a00000 mov r0, #0 + 1f0f958: e28dd00c add sp, sp, #12 + 1f0f95c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0f960: e5942008 ldr r2, [r4, #8] + 1f0f964: e3520000 cmp r2, #0 + 1f0f968: 13a06000 movne r6, #0 + 1f0f96c: 13a07000 movne r7, #0 + 1f0f970: 0a000028 beq 1f0fa18 + 1f0f974: e3520000 cmp r2, #0 + 1f0f978: e5842038 str r2, [r4, #56] ; 0x38 + 1f0f97c: 1affffbc bne 1f0f874 + 1f0f980: e1a08002 mov r8, r2 + 1f0f984: e1c421d0 ldrd r2, [r4, #16] + 1f0f988: e1530007 cmp r3, r7 + 1f0f98c: 01520006 cmpeq r2, r6 + 1f0f990: 2a000051 bcs 1f0fadc + 1f0f994: e5d43028 ldrb r3, [r4, #40] ; 0x28 + 1f0f998: e30001ff movw r0, #511 ; 0x1ff + 1f0f99c: e3a01000 mov r1, #0 + 1f0f9a0: e1c461f0 strd r6, [r4, #16] + 1f0f9a4: e3833040 orr r3, r3, #64 ; 0x40 + 1f0f9a8: e0066000 and r6, r6, r0 + 1f0f9ac: e0077001 and r7, r7, r1 + 1f0f9b0: e5c43028 strb r3, [r4, #40] ; 0x28 + 1f0f9b4: e1963007 orrs r3, r6, r7 + 1f0f9b8: 0affffe5 beq 1f0f954 + 1f0f9bc: e594203c ldr r2, [r4, #60] ; 0x3c + 1f0f9c0: e1580002 cmp r8, r2 + 1f0f9c4: 0affffe2 beq 1f0f954 + 1f0f9c8: e1d432d8 ldrsb r3, [r4, #40] ; 0x28 + 1f0f9cc: e2846048 add r6, r4, #72 ; 0x48 + 1f0f9d0: e3530000 cmp r3, #0 + 1f0f9d4: ba00001a blt 1f0fa44 + 1f0f9d8: e1a01006 mov r1, r6 + 1f0f9dc: e5d50001 ldrb r0, [r5, #1] + 1f0f9e0: e3a03001 mov r3, #1 + 1f0f9e4: e1a02008 mov r2, r8 + 1f0f9e8: eb005b38 bl 1f266d0 + 1f0f9ec: e3500000 cmp r0, #0 + 1f0f9f0: 0584803c streq r8, [r4, #60] ; 0x3c + 1f0f9f4: 0affff59 beq 1f0f760 + 1f0f9f8: e3a00001 mov r0, #1 + 1f0f9fc: e5c40029 strb r0, [r4, #41] ; 0x29 + 1f0fa00: e28dd00c add sp, sp, #12 + 1f0fa04: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0fa08: e3a00002 mov r0, #2 + 1f0fa0c: e5c40029 strb r0, [r4, #41] ; 0x29 + 1f0fa10: e28dd00c add sp, sp, #12 + 1f0fa14: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f0fa18: e1a01002 mov r1, r2 + 1f0fa1c: e1a00004 mov r0, r4 + 1f0fa20: ebffdf54 bl 1f07778 + 1f0fa24: e3500001 cmp r0, #1 + 1f0fa28: e1a02000 mov r2, r0 + 1f0fa2c: 0afffff5 beq 1f0fa08 + 1f0fa30: e3700001 cmn r0, #1 + 1f0fa34: 0affffef beq 1f0f9f8 + 1f0fa38: e5840008 str r0, [r4, #8] + 1f0fa3c: e1c463d0 ldrd r6, [r4, #48] ; 0x30 + 1f0fa40: eaffffcb b 1f0f974 + 1f0fa44: e1a01006 mov r1, r6 + 1f0fa48: e3a03001 mov r3, #1 + 1f0fa4c: e5d50001 ldrb r0, [r5, #1] + 1f0fa50: eb005b3c bl 1f26748 + 1f0fa54: e3500000 cmp r0, #0 + 1f0fa58: 1affffe6 bne 1f0f9f8 + 1f0fa5c: e5d43028 ldrb r3, [r4, #40] ; 0x28 + 1f0fa60: e203307f and r3, r3, #127 ; 0x7f + 1f0fa64: e5c43028 strb r3, [r4, #40] ; 0x28 + 1f0fa68: eaffffda b 1f0f9d8 + 1f0fa6c: e1c463d0 ldrd r6, [r4, #48] ; 0x30 + 1f0fa70: e30001ff movw r0, #511 ; 0x1ff + 1f0fa74: e3a01000 mov r1, #0 + 1f0fa78: e096600a adds r6, r6, sl + 1f0fa7c: e000000a and r0, r0, sl + 1f0fa80: e001100b and r1, r1, fp + 1f0fa84: e0a7700b adc r7, r7, fp + 1f0fa88: e1903001 orrs r3, r0, r1 + 1f0fa8c: e1c463f0 strd r6, [r4, #48] ; 0x30 + 1f0fa90: 0a00000f beq 1f0fad4 + 1f0fa94: e595302c ldr r3, [r5, #44] ; 0x2c + 1f0fa98: e2422002 sub r2, r2, #2 + 1f0fa9c: e2433002 sub r3, r3, #2 + 1f0faa0: e1520003 cmp r2, r3 + 1f0faa4: 2affffd7 bcs 1f0fa08 + 1f0faa8: e1d580ba ldrh r8, [r5, #10] + 1f0faac: e5953040 ldr r3, [r5, #64] ; 0x40 + 1f0fab0: e0323298 mlas r2, r8, r2, r3 + 1f0fab4: 0affffd3 beq 1f0fa08 + 1f0fab8: e1a084aa lsr r8, sl, #9 + 1f0fabc: e1888b8b orr r8, r8, fp, lsl #23 + 1f0fac0: e0828008 add r8, r2, r8 + 1f0fac4: eaffffae b 1f0f984 + 1f0fac8: e1a08002 mov r8, r2 + 1f0facc: e1c463d0 ldrd r6, [r4, #48] ; 0x30 + 1f0fad0: eaffffab b 1f0f984 + 1f0fad4: e3a08000 mov r8, #0 + 1f0fad8: eaffffa9 b 1f0f984 + 1f0fadc: e30021ff movw r2, #511 ; 0x1ff + 1f0fae0: e3a03000 mov r3, #0 + 1f0fae4: e0066002 and r6, r6, r2 + 1f0fae8: e0077003 and r7, r7, r3 + 1f0faec: eaffffb0 b 1f0f9b4 + +01f0faf0 : + 1f0faf0: e92d40d0 push {r4, r6, r7, lr} + 1f0faf4: e3500000 cmp r0, #0 + 1f0faf8: e24dd010 sub sp, sp, #16 + 1f0fafc: 03a00009 moveq r0, #9 + 1f0fb00: e58d1004 str r1, [sp, #4] + 1f0fb04: 0a000008 beq 1f0fb2c + 1f0fb08: e1a04000 mov r4, r0 + 1f0fb0c: e3a02000 mov r2, #0 + 1f0fb10: e28d100c add r1, sp, #12 + 1f0fb14: e28d0004 add r0, sp, #4 + 1f0fb18: ebffd6fc bl 1f05710 + 1f0fb1c: e3500000 cmp r0, #0 + 1f0fb20: 0a000003 beq 1f0fb34 + 1f0fb24: e3a03000 mov r3, #0 + 1f0fb28: e5843000 str r3, [r4] + 1f0fb2c: e28dd010 add sp, sp, #16 + 1f0fb30: e8bd80d0 pop {r4, r6, r7, pc} + 1f0fb34: e59d300c ldr r3, [sp, #12] + 1f0fb38: e1a00004 mov r0, r4 + 1f0fb3c: e5843000 str r3, [r4] + 1f0fb40: e59d1004 ldr r1, [sp, #4] + 1f0fb44: ebfff28c bl 1f0c57c + 1f0fb48: e3500000 cmp r0, #0 + 1f0fb4c: 1a00001f bne 1f0fbd0 + 1f0fb50: e1d434d3 ldrsb r3, [r4, #67] ; 0x43 + 1f0fb54: e3530000 cmp r3, #0 + 1f0fb58: ba000022 blt 1f0fbe8 + 1f0fb5c: e5d43006 ldrb r3, [r4, #6] + 1f0fb60: e3130010 tst r3, #16 + 1f0fb64: 0a00001b beq 1f0fbd8 + 1f0fb68: e59d300c ldr r3, [sp, #12] + 1f0fb6c: e5d32000 ldrb r2, [r3] + 1f0fb70: e3520004 cmp r2, #4 + 1f0fb74: 0a00001d beq 1f0fbf0 + 1f0fb78: e5941034 ldr r1, [r4, #52] ; 0x34 + 1f0fb7c: e3520003 cmp r2, #3 + 1f0fb80: e5d1001b ldrb r0, [r1, #27] + 1f0fb84: e5d1201a ldrb r2, [r1, #26] + 1f0fb88: e1822400 orr r2, r2, r0, lsl #8 + 1f0fb8c: 05d10015 ldrbeq r0, [r1, #21] + 1f0fb90: 05d11014 ldrbeq r1, [r1, #20] + 1f0fb94: 01811400 orreq r1, r1, r0, lsl #8 + 1f0fb98: 01822801 orreq r2, r2, r1, lsl #16 + 1f0fb9c: e5842008 str r2, [r4, #8] + 1f0fba0: e1d330b6 ldrh r3, [r3, #6] + 1f0fba4: e3a01000 mov r1, #0 + 1f0fba8: e1c430b4 strh r3, [r4, #4] + 1f0fbac: e1a00004 mov r0, r4 + 1f0fbb0: ebffe1b0 bl 1f08278 + 1f0fbb4: e3500004 cmp r0, #4 + 1f0fbb8: e1a03000 mov r3, r0 + 1f0fbbc: 0a000005 beq 1f0fbd8 + 1f0fbc0: e3530000 cmp r3, #0 + 1f0fbc4: 01a00003 moveq r0, r3 + 1f0fbc8: 0affffd7 beq 1f0fb2c + 1f0fbcc: eaffffd4 b 1f0fb24 + 1f0fbd0: e3500004 cmp r0, #4 + 1f0fbd4: 1affffd2 bne 1f0fb24 + 1f0fbd8: e3a03000 mov r3, #0 + 1f0fbdc: e3a00005 mov r0, #5 + 1f0fbe0: e5843000 str r3, [r4] + 1f0fbe4: eaffffd0 b 1f0fb2c + 1f0fbe8: e59d300c ldr r3, [sp, #12] + 1f0fbec: eaffffeb b 1f0fba0 + 1f0fbf0: e5941010 ldr r1, [r4, #16] + 1f0fbf4: e5d42007 ldrb r2, [r4, #7] + 1f0fbf8: e3c110ff bic r1, r1, #255 ; 0xff + 1f0fbfc: e594c008 ldr ip, [r4, #8] + 1f0fc00: e1811002 orr r1, r1, r2 + 1f0fc04: e5940044 ldr r0, [r4, #68] ; 0x44 + 1f0fc08: e5932010 ldr r2, [r3, #16] + 1f0fc0c: e5841020 str r1, [r4, #32] + 1f0fc10: e584c01c str ip, [r4, #28] + 1f0fc14: e5840024 str r0, [r4, #36] ; 0x24 + 1f0fc18: e1d2c3b6 ldrh ip, [r2, #54] ; 0x36 + 1f0fc1c: e5d20035 ldrb r0, [r2, #53] ; 0x35 + 1f0fc20: e5d21034 ldrb r1, [r2, #52] ; 0x34 + 1f0fc24: e180040c orr r0, r0, ip, lsl #8 + 1f0fc28: e1811400 orr r1, r1, r0, lsl #8 + 1f0fc2c: e5841008 str r1, [r4, #8] + 1f0fc30: e3a01000 mov r1, #0 + 1f0fc34: e592c03c ldr ip, [r2, #60] ; 0x3c + 1f0fc38: e5d2003b ldrb r0, [r2, #59] ; 0x3b + 1f0fc3c: ee80cb90 vdup.32 d16, ip + 1f0fc40: f3e000b0 vshr.u64 d16, d16, #32 + 1f0fc44: f2c815b0 vshl.s64 d17, d16, #8 + 1f0fc48: ec576b31 vmov r6, r7, d17 + 1f0fc4c: e1877001 orr r7, r7, r1 + 1f0fc50: e1866000 orr r6, r6, r0 + 1f0fc54: e3a01000 mov r1, #0 + 1f0fc58: e5d2003a ldrb r0, [r2, #58] ; 0x3a + 1f0fc5c: e1a07407 lsl r7, r7, #8 + 1f0fc60: e1877c26 orr r7, r7, r6, lsr #24 + 1f0fc64: e1a06406 lsl r6, r6, #8 + 1f0fc68: e1877001 orr r7, r7, r1 + 1f0fc6c: e1866000 orr r6, r6, r0 + 1f0fc70: e3a01000 mov r1, #0 + 1f0fc74: e5d20039 ldrb r0, [r2, #57] ; 0x39 + 1f0fc78: e1a07407 lsl r7, r7, #8 + 1f0fc7c: e1877c26 orr r7, r7, r6, lsr #24 + 1f0fc80: e1a06406 lsl r6, r6, #8 + 1f0fc84: e1811007 orr r1, r1, r7 + 1f0fc88: e1800006 orr r0, r0, r6 + 1f0fc8c: e5d26038 ldrb r6, [r2, #56] ; 0x38 + 1f0fc90: e3a07000 mov r7, #0 + 1f0fc94: e1a01401 lsl r1, r1, #8 + 1f0fc98: e1811c20 orr r1, r1, r0, lsr #24 + 1f0fc9c: e1a00400 lsl r0, r0, #8 + 1f0fca0: e1800006 orr r0, r0, r6 + 1f0fca4: e1811007 orr r1, r1, r7 + 1f0fca8: e1c401f0 strd r0, [r4, #16] + 1f0fcac: e5d22021 ldrb r2, [r2, #33] ; 0x21 + 1f0fcb0: e2022002 and r2, r2, #2 + 1f0fcb4: e5c42007 strb r2, [r4, #7] + 1f0fcb8: eaffffb8 b 1f0fba0 + +01f0fcbc : + 1f0fcbc: e3500000 cmp r0, #0 + 1f0fcc0: 0a000005 beq 1f0fcdc + 1f0fcc4: e5903000 ldr r3, [r0] + 1f0fcc8: e3530000 cmp r3, #0 + 1f0fccc: 0a000002 beq 1f0fcdc + 1f0fcd0: e5d32000 ldrb r2, [r3] + 1f0fcd4: e3520000 cmp r2, #0 + 1f0fcd8: 1a000001 bne 1f0fce4 + 1f0fcdc: e3a00009 mov r0, #9 + 1f0fce0: e12fff1e bx lr + 1f0fce4: e1d310b6 ldrh r1, [r3, #6] + 1f0fce8: e1d020b4 ldrh r2, [r0, #4] + 1f0fcec: e1510002 cmp r1, r2 + 1f0fcf0: 1afffff9 bne 1f0fcdc + 1f0fcf4: e92d4010 push {r4, lr} + 1f0fcf8: e1a04000 mov r4, r0 + 1f0fcfc: e5d30001 ldrb r0, [r3, #1] + 1f0fd00: eb005a6e bl 1f266c0 + 1f0fd04: e2100001 ands r0, r0, #1 + 1f0fd08: 13a00009 movne r0, #9 + 1f0fd0c: 05840000 streq r0, [r4] + 1f0fd10: e8bd8010 pop {r4, pc} + +01f0fd14 : + 1f0fd14: e3500000 cmp r0, #0 + 1f0fd18: 0a000005 beq 1f0fd34 + 1f0fd1c: e5903000 ldr r3, [r0] + 1f0fd20: e3530000 cmp r3, #0 + 1f0fd24: 0a000002 beq 1f0fd34 + 1f0fd28: e5d32000 ldrb r2, [r3] + 1f0fd2c: e3520000 cmp r2, #0 + 1f0fd30: 1a000001 bne 1f0fd3c + 1f0fd34: e3a00009 mov r0, #9 + 1f0fd38: e12fff1e bx lr + 1f0fd3c: e1d3c0b6 ldrh ip, [r3, #6] + 1f0fd40: e1d020b4 ldrh r2, [r0, #4] + 1f0fd44: e15c0002 cmp ip, r2 + 1f0fd48: 1afffff9 bne 1f0fd34 + 1f0fd4c: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f0fd50: e1a04000 mov r4, r0 + 1f0fd54: e1a05001 mov r5, r1 + 1f0fd58: e5d30001 ldrb r0, [r3, #1] + 1f0fd5c: eb005a57 bl 1f266c0 + 1f0fd60: e3100001 tst r0, #1 + 1f0fd64: 0a000001 beq 1f0fd70 + 1f0fd68: e3a00009 mov r0, #9 + 1f0fd6c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f0fd70: e3550000 cmp r5, #0 + 1f0fd74: 0a000022 beq 1f0fe04 + 1f0fd78: e1a00004 mov r0, r4 + 1f0fd7c: ebffe9cd bl 1f0a4b8 + 1f0fd80: e31000fb tst r0, #251 ; 0xfb + 1f0fd84: 18bd81f0 popne {r4, r5, r6, r7, r8, pc} + 1f0fd88: e1a01005 mov r1, r5 + 1f0fd8c: e1a00004 mov r0, r4 + 1f0fd90: ebffd4b3 bl 1f05064 + 1f0fd94: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f0fd98: e3530000 cmp r3, #0 + 1f0fd9c: 1a000001 bne 1f0fda8 + 1f0fda0: e3a00000 mov r0, #0 + 1f0fda4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f0fda8: e5946000 ldr r6, [r4] + 1f0fdac: e5945028 ldr r5, [r4, #40] ; 0x28 + 1f0fdb0: e5d62000 ldrb r2, [r6] + 1f0fdb4: e2855020 add r5, r5, #32 + 1f0fdb8: e3520004 cmp r2, #4 + 1f0fdbc: 03a02201 moveq r2, #268435456 ; 0x10000000 + 1f0fdc0: 13a02602 movne r2, #2097152 ; 0x200000 + 1f0fdc4: e1550002 cmp r5, r2 + 1f0fdc8: 2afffff4 bcs 1f0fda0 + 1f0fdcc: e7e87055 ubfx r7, r5, #0, #9 + 1f0fdd0: e3570000 cmp r7, #0 + 1f0fdd4: 1a000023 bne 1f0fe68 + 1f0fdd8: e594102c ldr r1, [r4, #44] ; 0x2c + 1f0fddc: e2833001 add r3, r3, #1 + 1f0fde0: e5843030 str r3, [r4, #48] ; 0x30 + 1f0fde4: e3510000 cmp r1, #0 + 1f0fde8: 1a000009 bne 1f0fe14 + 1f0fdec: e1d630b8 ldrh r3, [r6, #8] + 1f0fdf0: e15302a5 cmp r3, r5, lsr #5 + 1f0fdf4: 8a00001b bhi 1f0fe68 + 1f0fdf8: e3a03000 mov r3, #0 + 1f0fdfc: e5843030 str r3, [r4, #48] ; 0x30 + 1f0fe00: eaffffe6 b 1f0fda0 + 1f0fe04: e1a01005 mov r1, r5 + 1f0fe08: e1a00004 mov r0, r4 + 1f0fe0c: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f0fe10: eaffe118 b 1f08278 + 1f0fe14: e1d630ba ldrh r3, [r6, #10] + 1f0fe18: e2433001 sub r3, r3, #1 + 1f0fe1c: e01384a5 ands r8, r3, r5, lsr #9 + 1f0fe20: 1a000010 bne 1f0fe68 + 1f0fe24: e1a00004 mov r0, r4 + 1f0fe28: ebffdd0b bl 1f0725c + 1f0fe2c: e3500001 cmp r0, #1 + 1f0fe30: 9a000012 bls 1f0fe80 + 1f0fe34: e3700001 cmn r0, #1 + 1f0fe38: 0a000012 beq 1f0fe88 + 1f0fe3c: e596302c ldr r3, [r6, #44] ; 0x2c + 1f0fe40: e1500003 cmp r0, r3 + 1f0fe44: 2affffeb bcs 1f0fdf8 + 1f0fe48: e2433002 sub r3, r3, #2 + 1f0fe4c: e2402002 sub r2, r0, #2 + 1f0fe50: e1520003 cmp r2, r3 + 1f0fe54: e584002c str r0, [r4, #44] ; 0x2c + 1f0fe58: 31d630ba ldrhcc r3, [r6, #10] + 1f0fe5c: 35968040 ldrcc r8, [r6, #64] ; 0x40 + 1f0fe60: 30288392 mlacc r8, r2, r3, r8 + 1f0fe64: e5848030 str r8, [r4, #48] ; 0x30 + 1f0fe68: e2863048 add r3, r6, #72 ; 0x48 + 1f0fe6c: e5845028 str r5, [r4, #40] ; 0x28 + 1f0fe70: e0833007 add r3, r3, r7 + 1f0fe74: e3a00000 mov r0, #0 + 1f0fe78: e5843034 str r3, [r4, #52] ; 0x34 + 1f0fe7c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f0fe80: e3a00002 mov r0, #2 + 1f0fe84: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f0fe88: e3a00001 mov r0, #1 + 1f0fe8c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f0fe90 : + 1f0fe90: e92d4070 push {r4, r5, r6, lr} + 1f0fe94: e30e4fa0 movw r4, #61344 ; 0xefa0 + 1f0fe98: e34041f5 movt r4, #501 ; 0x1f5 + 1f0fe9c: e1a05000 mov r5, r0 + 1f0fea0: e1a06001 mov r6, r1 + 1f0fea4: e3550000 cmp r5, #0 + 1f0fea8: 0a000009 beq 1f0fed4 + 1f0feac: e5953000 ldr r3, [r5] + 1f0feb0: e3530000 cmp r3, #0 + 1f0feb4: 0a000006 beq 1f0fed4 + 1f0feb8: e5d32000 ldrb r2, [r3] + 1f0febc: e3520000 cmp r2, #0 + 1f0fec0: 0a000003 beq 1f0fed4 + 1f0fec4: e1d310b6 ldrh r1, [r3, #6] + 1f0fec8: e1d520b4 ldrh r2, [r5, #4] + 1f0fecc: e1510002 cmp r1, r2 + 1f0fed0: 0a000001 beq 1f0fedc + 1f0fed4: e3a00009 mov r0, #9 + 1f0fed8: e8bd8070 pop {r4, r5, r6, pc} + 1f0fedc: e5d30001 ldrb r0, [r3, #1] + 1f0fee0: eb0059f6 bl 1f266c0 + 1f0fee4: e3100001 tst r0, #1 + 1f0fee8: 1afffff9 bne 1f0fed4 + 1f0feec: e3560000 cmp r6, #0 + 1f0fef0: 0a000044 beq 1f10008 + 1f0fef4: e1a00005 mov r0, r5 + 1f0fef8: ebffe96e bl 1f0a4b8 + 1f0fefc: e31000fb tst r0, #251 ; 0xfb + 1f0ff00: 18bd8070 popne {r4, r5, r6, pc} + 1f0ff04: e1a01006 mov r1, r6 + 1f0ff08: e1a00005 mov r0, r5 + 1f0ff0c: ebffd454 bl 1f05064 + 1f0ff10: e1a00005 mov r0, r5 + 1f0ff14: ebffe098 bl 1f0817c + 1f0ff18: e3500004 cmp r0, #4 + 1f0ff1c: 0a000001 beq 1f0ff28 + 1f0ff20: e3500000 cmp r0, #0 + 1f0ff24: 18bd8070 popne {r4, r5, r6, pc} + 1f0ff28: e1d601da ldrsb r0, [r6, #26] + 1f0ff2c: e3500000 cmp r0, #0 + 1f0ff30: 08bd8070 popeq {r4, r5, r6, pc} + 1f0ff34: e595c048 ldr ip, [r5, #72] ; 0x48 + 1f0ff38: e286101a add r1, r6, #26 + 1f0ff3c: e1dc20d0 ldrsb r2, [ip] + 1f0ff40: e1a0000c mov r0, ip + 1f0ff44: e28cc001 add ip, ip, #1 + 1f0ff48: e352002a cmp r2, #42 ; 0x2a + 1f0ff4c: 1352003f cmpne r2, #63 ; 0x3f + 1f0ff50: 0a00001b beq 1f0ffc4 + 1f0ff54: e6ef2072 uxtb r2, r2 + 1f0ff58: e6ff3072 uxth r3, r2 + 1f0ff5c: e2430061 sub r0, r3, #97 ; 0x61 + 1f0ff60: e3500019 cmp r0, #25 + 1f0ff64: 92433020 subls r3, r3, #32 + 1f0ff68: 96ff3073 uxthls r3, r3 + 1f0ff6c: 9a000002 bls 1f0ff7c + 1f0ff70: e353007f cmp r3, #127 ; 0x7f + 1f0ff74: 80842002 addhi r2, r4, r2 + 1f0ff78: 85523080 ldrbhi r3, [r2, #-128] ; 0xffffff80 + 1f0ff7c: e4d12001 ldrb r2, [r1], #1 + 1f0ff80: e6ff0072 uxth r0, r2 + 1f0ff84: e240e061 sub lr, r0, #97 ; 0x61 + 1f0ff88: e35e0019 cmp lr, #25 + 1f0ff8c: 8a000004 bhi 1f0ffa4 + 1f0ff90: e2400020 sub r0, r0, #32 + 1f0ff94: e6ff0070 uxth r0, r0 + 1f0ff98: e1500003 cmp r0, r3 + 1f0ff9c: 0affffe6 beq 1f0ff3c + 1f0ffa0: eaffffbf b 1f0fea4 + 1f0ffa4: e350007f cmp r0, #127 ; 0x7f + 1f0ffa8: 80842002 addhi r2, r4, r2 + 1f0ffac: 85520080 ldrbhi r0, [r2, #-128] ; 0xffffff80 + 1f0ffb0: e1500003 cmp r0, r3 + 1f0ffb4: 1affffba bne 1f0fea4 + 1f0ffb8: e3500000 cmp r0, #0 + 1f0ffbc: 1affffde bne 1f0ff3c + 1f0ffc0: e8bd8070 pop {r4, r5, r6, pc} + 1f0ffc4: e3a03000 mov r3, #0 + 1f0ffc8: e1a0c002 mov ip, r2 + 1f0ffcc: e1a02003 mov r2, r3 + 1f0ffd0: e35c003f cmp ip, #63 ; 0x3f + 1f0ffd4: e1f0c0d1 ldrsb ip, [r0, #1]! + 1f0ffd8: 03a0e001 moveq lr, #1 + 1f0ffdc: 13a0e000 movne lr, #0 + 1f0ffe0: 13a03001 movne r3, #1 + 1f0ffe4: e35c003f cmp ip, #63 ; 0x3f + 1f0ffe8: 135c002a cmpne ip, #42 ; 0x2a + 1f0ffec: e082200e add r2, r2, lr + 1f0fff0: 0afffff6 beq 1f0ffd0 + 1f0fff4: ebffd3a0 bl 1f04e7c + 1f0fff8: e3500000 cmp r0, #0 + 1f0fffc: 0affffa8 beq 1f0fea4 + 1f10000: e3a00000 mov r0, #0 + 1f10004: e8bd8070 pop {r4, r5, r6, pc} + 1f10008: e1a01006 mov r1, r6 + 1f1000c: e1a00005 mov r0, r5 + 1f10010: e8bd4070 pop {r4, r5, r6, lr} + 1f10014: eaffe097 b 1f08278 + +01f10018 : + 1f10018: e92d40f0 push {r4, r5, r6, r7, lr} + 1f1001c: e3500000 cmp r0, #0 + 1f10020: e5803048 str r3, [r0, #72] ; 0x48 + 1f10024: e24dd00c sub sp, sp, #12 + 1f10028: 03a00009 moveq r0, #9 + 1f1002c: e58d2000 str r2, [sp] + 1f10030: 0a000009 beq 1f1005c + 1f10034: e1a05001 mov r5, r1 + 1f10038: e1a04000 mov r4, r0 + 1f1003c: e3a02000 mov r2, #0 + 1f10040: e28d1004 add r1, sp, #4 + 1f10044: e1a0000d mov r0, sp + 1f10048: ebffd5b0 bl 1f05710 + 1f1004c: e3500000 cmp r0, #0 + 1f10050: 0a000003 beq 1f10064 + 1f10054: e3a03000 mov r3, #0 + 1f10058: e5843000 str r3, [r4] + 1f1005c: e28dd00c add sp, sp, #12 + 1f10060: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f10064: e59d3004 ldr r3, [sp, #4] + 1f10068: e1a00004 mov r0, r4 + 1f1006c: e5843000 str r3, [r4] + 1f10070: e59d1000 ldr r1, [sp] + 1f10074: ebfff140 bl 1f0c57c + 1f10078: e3500000 cmp r0, #0 + 1f1007c: 1a000021 bne 1f10108 + 1f10080: e1d434d3 ldrsb r3, [r4, #67] ; 0x43 + 1f10084: e3530000 cmp r3, #0 + 1f10088: ba000024 blt 1f10120 + 1f1008c: e5d43006 ldrb r3, [r4, #6] + 1f10090: e3130010 tst r3, #16 + 1f10094: 0a00001d beq 1f10110 + 1f10098: e59d3004 ldr r3, [sp, #4] + 1f1009c: e5d32000 ldrb r2, [r3] + 1f100a0: e3520004 cmp r2, #4 + 1f100a4: 0a00001f beq 1f10128 + 1f100a8: e5941034 ldr r1, [r4, #52] ; 0x34 + 1f100ac: e3520003 cmp r2, #3 + 1f100b0: e5d1001b ldrb r0, [r1, #27] + 1f100b4: e5d1201a ldrb r2, [r1, #26] + 1f100b8: e1822400 orr r2, r2, r0, lsl #8 + 1f100bc: 05d10015 ldrbeq r0, [r1, #21] + 1f100c0: 05d11014 ldrbeq r1, [r1, #20] + 1f100c4: 01811400 orreq r1, r1, r0, lsl #8 + 1f100c8: 01822801 orreq r2, r2, r1, lsl #16 + 1f100cc: e5842008 str r2, [r4, #8] + 1f100d0: e1d330b6 ldrh r3, [r3, #6] + 1f100d4: e3a01000 mov r1, #0 + 1f100d8: e1c430b4 strh r3, [r4, #4] + 1f100dc: e1a00004 mov r0, r4 + 1f100e0: ebffe064 bl 1f08278 + 1f100e4: e3500004 cmp r0, #4 + 1f100e8: 0a000008 beq 1f10110 + 1f100ec: e3500000 cmp r0, #0 + 1f100f0: 1affffd7 bne 1f10054 + 1f100f4: e1a01005 mov r1, r5 + 1f100f8: e1a00004 mov r0, r4 + 1f100fc: ebffff63 bl 1f0fe90 + 1f10100: e28dd00c add sp, sp, #12 + 1f10104: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f10108: e3500004 cmp r0, #4 + 1f1010c: 1affffd0 bne 1f10054 + 1f10110: e3a03000 mov r3, #0 + 1f10114: e3a00005 mov r0, #5 + 1f10118: e5843000 str r3, [r4] + 1f1011c: eaffffce b 1f1005c + 1f10120: e59d3004 ldr r3, [sp, #4] + 1f10124: eaffffe9 b 1f100d0 + 1f10128: e5941010 ldr r1, [r4, #16] + 1f1012c: e5d42007 ldrb r2, [r4, #7] + 1f10130: e3c110ff bic r1, r1, #255 ; 0xff + 1f10134: e594c008 ldr ip, [r4, #8] + 1f10138: e1811002 orr r1, r1, r2 + 1f1013c: e5940044 ldr r0, [r4, #68] ; 0x44 + 1f10140: e5932010 ldr r2, [r3, #16] + 1f10144: e5841020 str r1, [r4, #32] + 1f10148: e584c01c str ip, [r4, #28] + 1f1014c: e5840024 str r0, [r4, #36] ; 0x24 + 1f10150: e1d2c3b6 ldrh ip, [r2, #54] ; 0x36 + 1f10154: e5d20035 ldrb r0, [r2, #53] ; 0x35 + 1f10158: e5d21034 ldrb r1, [r2, #52] ; 0x34 + 1f1015c: e180040c orr r0, r0, ip, lsl #8 + 1f10160: e1811400 orr r1, r1, r0, lsl #8 + 1f10164: e5841008 str r1, [r4, #8] + 1f10168: e3a01000 mov r1, #0 + 1f1016c: e592c03c ldr ip, [r2, #60] ; 0x3c + 1f10170: e5d2003b ldrb r0, [r2, #59] ; 0x3b + 1f10174: ee80cb90 vdup.32 d16, ip + 1f10178: f3e000b0 vshr.u64 d16, d16, #32 + 1f1017c: f2c815b0 vshl.s64 d17, d16, #8 + 1f10180: ec576b31 vmov r6, r7, d17 + 1f10184: e1877001 orr r7, r7, r1 + 1f10188: e1866000 orr r6, r6, r0 + 1f1018c: e3a01000 mov r1, #0 + 1f10190: e5d2003a ldrb r0, [r2, #58] ; 0x3a + 1f10194: e1a07407 lsl r7, r7, #8 + 1f10198: e1877c26 orr r7, r7, r6, lsr #24 + 1f1019c: e1a06406 lsl r6, r6, #8 + 1f101a0: e1877001 orr r7, r7, r1 + 1f101a4: e1866000 orr r6, r6, r0 + 1f101a8: e3a01000 mov r1, #0 + 1f101ac: e5d20039 ldrb r0, [r2, #57] ; 0x39 + 1f101b0: e1a07407 lsl r7, r7, #8 + 1f101b4: e1877c26 orr r7, r7, r6, lsr #24 + 1f101b8: e1a06406 lsl r6, r6, #8 + 1f101bc: e1811007 orr r1, r1, r7 + 1f101c0: e1800006 orr r0, r0, r6 + 1f101c4: e5d26038 ldrb r6, [r2, #56] ; 0x38 + 1f101c8: e3a07000 mov r7, #0 + 1f101cc: e1a01401 lsl r1, r1, #8 + 1f101d0: e1811c20 orr r1, r1, r0, lsr #24 + 1f101d4: e1a00400 lsl r0, r0, #8 + 1f101d8: e1800006 orr r0, r0, r6 + 1f101dc: e1811007 orr r1, r1, r7 + 1f101e0: e1c401f0 strd r0, [r4, #16] + 1f101e4: e5d22021 ldrb r2, [r2, #33] ; 0x21 + 1f101e8: e2022002 and r2, r2, #2 + 1f101ec: e5c42007 strb r2, [r4, #7] + 1f101f0: eaffffb6 b 1f100d0 + +01f101f4 : + 1f101f4: e92d4030 push {r4, r5, lr} + 1f101f8: e3a02000 mov r2, #0 + 1f101fc: e1a05001 mov r5, r1 + 1f10200: e24dd05c sub sp, sp, #92 ; 0x5c + 1f10204: e28d1008 add r1, sp, #8 + 1f10208: e58d0004 str r0, [sp, #4] + 1f1020c: e28d0004 add r0, sp, #4 + 1f10210: ebffd53e bl 1f05710 + 1f10214: e2504000 subs r4, r0, #0 + 1f10218: 0a000002 beq 1f10228 + 1f1021c: e1a00004 mov r0, r4 + 1f10220: e28dd05c add sp, sp, #92 ; 0x5c + 1f10224: e8bd8030 pop {r4, r5, pc} + 1f10228: e59d1004 ldr r1, [sp, #4] + 1f1022c: e28d0008 add r0, sp, #8 + 1f10230: ebfff0d1 bl 1f0c57c + 1f10234: e2504000 subs r4, r0, #0 + 1f10238: 1afffff7 bne 1f1021c + 1f1023c: e1dd34db ldrsb r3, [sp, #75] ; 0x4b + 1f10240: e3530000 cmp r3, #0 + 1f10244: b3a04006 movlt r4, #6 + 1f10248: bafffff3 blt 1f1021c + 1f1024c: e3550000 cmp r5, #0 + 1f10250: 0afffff1 beq 1f1021c + 1f10254: e28d0008 add r0, sp, #8 + 1f10258: e1a01005 mov r1, r5 + 1f1025c: ebffd380 bl 1f05064 + 1f10260: e1a00004 mov r0, r4 + 1f10264: e28dd05c add sp, sp, #92 ; 0x5c + 1f10268: e8bd8030 pop {r4, r5, pc} + +01f1026c : + 1f1026c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f10270: e1a04002 mov r4, r2 + 1f10274: e3a02000 mov r2, #0 + 1f10278: e24dd044 sub sp, sp, #68 ; 0x44 + 1f1027c: e58d000c str r0, [sp, #12] + 1f10280: e28d000c add r0, sp, #12 + 1f10284: e58d1000 str r1, [sp] + 1f10288: e28d1014 add r1, sp, #20 + 1f1028c: ebffd51f bl 1f05710 + 1f10290: e250b000 subs fp, r0, #0 + 1f10294: 1a00003a bne 1f10384 + 1f10298: e59d5014 ldr r5, [sp, #20] + 1f1029c: e5845000 str r5, [r4] + 1f102a0: e595702c ldr r7, [r5, #44] ; 0x2c + 1f102a4: e5953018 ldr r3, [r5, #24] + 1f102a8: e2476002 sub r6, r7, #2 + 1f102ac: e1530006 cmp r3, r6 + 1f102b0: 9a000036 bls 1f10390 + 1f102b4: e5d51000 ldrb r1, [r5] + 1f102b8: e3510001 cmp r1, #1 + 1f102bc: 0a000098 beq 1f10524 + 1f102c0: e3510004 cmp r1, #4 + 1f102c4: 0a000036 beq 1f103a4 + 1f102c8: e5959038 ldr r9, [r5, #56] ; 0x38 + 1f102cc: e1a0000b mov r0, fp + 1f102d0: e1a0600b mov r6, fp + 1f102d4: e1a0400b mov r4, fp + 1f102d8: e58db004 str fp, [sp, #4] + 1f102dc: ea00000d b 1f10318 + 1f102e0: e3510002 cmp r1, #2 + 1f102e4: 0a000053 beq 1f10438 + 1f102e8: e1d0c0b2 ldrh ip, [r0, #2] + 1f102ec: e2466004 sub r6, r6, #4 + 1f102f0: e5d03001 ldrb r3, [r0, #1] + 1f102f4: e2800004 add r0, r0, #4 + 1f102f8: e5502004 ldrb r2, [r0, #-4] + 1f102fc: e183340c orr r3, r3, ip, lsl #8 + 1f10300: e1823403 orr r3, r2, r3, lsl #8 + 1f10304: e3c3320f bic r3, r3, #-268435456 ; 0xf0000000 + 1f10308: e3530000 cmp r3, #0 + 1f1030c: 02844001 addeq r4, r4, #1 + 1f10310: e2577001 subs r7, r7, #1 + 1f10314: 0a00004f beq 1f10458 + 1f10318: e3560000 cmp r6, #0 + 1f1031c: 1affffef bne 1f102e0 + 1f10320: e5958044 ldr r8, [r5, #68] ; 0x44 + 1f10324: e289b001 add fp, r9, #1 + 1f10328: e1590008 cmp r9, r8 + 1f1032c: 0a00003c beq 1f10424 + 1f10330: e5d53003 ldrb r3, [r5, #3] + 1f10334: e285a048 add sl, r5, #72 ; 0x48 + 1f10338: e3530000 cmp r3, #0 + 1f1033c: 1a00005c bne 1f104b4 + 1f10340: e1a0100a mov r1, sl + 1f10344: e3a03001 mov r3, #1 + 1f10348: e1a02009 mov r2, r9 + 1f1034c: e5d50001 ldrb r0, [r5, #1] + 1f10350: eb0058de bl 1f266d0 + 1f10354: e3500000 cmp r0, #0 + 1f10358: 0a00002e beq 1f10418 + 1f1035c: e3e03000 mvn r3, #0 + 1f10360: e5853044 str r3, [r5, #68] ; 0x44 + 1f10364: e59d5014 ldr r5, [sp, #20] + 1f10368: e3a0b001 mov fp, #1 + 1f1036c: e59d3000 ldr r3, [sp] + 1f10370: e5834000 str r4, [r3] + 1f10374: e5854018 str r4, [r5, #24] + 1f10378: e5d53004 ldrb r3, [r5, #4] + 1f1037c: e3833001 orr r3, r3, #1 + 1f10380: e5c53004 strb r3, [r5, #4] + 1f10384: e1a0000b mov r0, fp + 1f10388: e28dd044 add sp, sp, #68 ; 0x44 + 1f1038c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f10390: e59d2000 ldr r2, [sp] + 1f10394: e1a0000b mov r0, fp + 1f10398: e5823000 str r3, [r2] + 1f1039c: e28dd044 add sp, sp, #68 ; 0x44 + 1f103a0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f103a4: e595a040 ldr sl, [r5, #64] ; 0x40 + 1f103a8: e1a0700b mov r7, fp + 1f103ac: e1a0400b mov r4, fp + 1f103b0: e58db008 str fp, [sp, #8] + 1f103b4: e3570000 cmp r7, #0 + 1f103b8: 0a000028 beq 1f10460 + 1f103bc: e0853007 add r3, r5, r7 + 1f103c0: e3560000 cmp r6, #0 + 1f103c4: e5d32048 ldrb r2, [r3, #72] ; 0x48 + 1f103c8: 0a000010 beq 1f10410 + 1f103cc: e3a01008 mov r1, #8 + 1f103d0: e3120001 tst r2, #1 + 1f103d4: e1a020a2 lsr r2, r2, #1 + 1f103d8: 03a00001 moveq r0, #1 + 1f103dc: 13a00000 movne r0, #0 + 1f103e0: e2511001 subs r1, r1, #1 + 1f103e4: e0844000 add r4, r4, r0 + 1f103e8: 03a03001 moveq r3, #1 + 1f103ec: 13a03000 movne r3, #0 + 1f103f0: e2566001 subs r6, r6, #1 + 1f103f4: 03833001 orreq r3, r3, #1 + 1f103f8: e3530000 cmp r3, #0 + 1f103fc: 0afffff3 beq 1f103d0 + 1f10400: e3560000 cmp r6, #0 + 1f10404: e2877001 add r7, r7, #1 + 1f10408: e7e87057 ubfx r7, r7, #0, #9 + 1f1040c: 1affffe8 bne 1f103b4 + 1f10410: e59db008 ldr fp, [sp, #8] + 1f10414: eaffffd4 b 1f1036c + 1f10418: e5859044 str r9, [r5, #68] ; 0x44 + 1f1041c: e59d5014 ldr r5, [sp, #20] + 1f10420: e5d51000 ldrb r1, [r5] + 1f10424: e3510002 cmp r1, #2 + 1f10428: e1a0900b mov r9, fp + 1f1042c: e2850048 add r0, r5, #72 ; 0x48 + 1f10430: e3a06c02 mov r6, #512 ; 0x200 + 1f10434: 1affffab bne 1f102e8 + 1f10438: e5d02001 ldrb r2, [r0, #1] + 1f1043c: e2466002 sub r6, r6, #2 + 1f10440: e5d03000 ldrb r3, [r0] + 1f10444: e2800002 add r0, r0, #2 + 1f10448: e1933402 orrs r3, r3, r2, lsl #8 + 1f1044c: 02844001 addeq r4, r4, #1 + 1f10450: e2577001 subs r7, r7, #1 + 1f10454: 1affffaf bne 1f10318 + 1f10458: e59db004 ldr fp, [sp, #4] + 1f1045c: eaffffc2 b 1f1036c + 1f10460: e5958044 ldr r8, [r5, #68] ; 0x44 + 1f10464: e28a3001 add r3, sl, #1 + 1f10468: e58d3004 str r3, [sp, #4] + 1f1046c: e15a0008 cmp sl, r8 + 1f10470: 0a00005f beq 1f105f4 + 1f10474: e5d53003 ldrb r3, [r5, #3] + 1f10478: e285b048 add fp, r5, #72 ; 0x48 + 1f1047c: e3530000 cmp r3, #0 + 1f10480: 1a00003f bne 1f10584 + 1f10484: e1a0100b mov r1, fp + 1f10488: e3a03001 mov r3, #1 + 1f1048c: e1a0200a mov r2, sl + 1f10490: e5d50001 ldrb r0, [r5, #1] + 1f10494: eb00588d bl 1f266d0 + 1f10498: e3500000 cmp r0, #0 + 1f1049c: 0a000034 beq 1f10574 + 1f104a0: e3e03000 mvn r3, #0 + 1f104a4: e5853044 str r3, [r5, #68] ; 0x44 + 1f104a8: e59d5014 ldr r5, [sp, #20] + 1f104ac: e3a0b001 mov fp, #1 + 1f104b0: eaffffad b 1f1036c + 1f104b4: e3a03001 mov r3, #1 + 1f104b8: e1a0100a mov r1, sl + 1f104bc: e1a02008 mov r2, r8 + 1f104c0: e5d50001 ldrb r0, [r5, #1] + 1f104c4: eb00589f bl 1f26748 + 1f104c8: e3500000 cmp r0, #0 + 1f104cc: 1afffff5 bne 1f104a8 + 1f104d0: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f104d4: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f104d8: e0622008 rsb r2, r2, r8 + 1f104dc: e5c56003 strb r6, [r5, #3] + 1f104e0: e1520003 cmp r2, r3 + 1f104e4: 2affff95 bcs 1f10340 + 1f104e8: e5d56002 ldrb r6, [r5, #2] + 1f104ec: e3560001 cmp r6, #1 + 1f104f0: 8a000001 bhi 1f104fc + 1f104f4: eaffff91 b 1f10340 + 1f104f8: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f104fc: e0888003 add r8, r8, r3 + 1f10500: e2466001 sub r6, r6, #1 + 1f10504: e1a02008 mov r2, r8 + 1f10508: e3a03001 mov r3, #1 + 1f1050c: e1a0100a mov r1, sl + 1f10510: e5d50001 ldrb r0, [r5, #1] + 1f10514: eb00588b bl 1f26748 + 1f10518: e3560001 cmp r6, #1 + 1f1051c: 1afffff5 bne 1f104f8 + 1f10520: eaffff86 b 1f10340 + 1f10524: e28d7040 add r7, sp, #64 ; 0x40 + 1f10528: e3a06002 mov r6, #2 + 1f1052c: e1a0400b mov r4, fp + 1f10530: e5275028 str r5, [r7, #-40]! ; 0xffffffd8 + 1f10534: ea000007 b 1f10558 + 1f10538: e3500001 cmp r0, #1 + 1f1053c: e59d5014 ldr r5, [sp, #20] + 1f10540: 0a00002d beq 1f105fc + 1f10544: e595302c ldr r3, [r5, #44] ; 0x2c + 1f10548: e3500000 cmp r0, #0 + 1f1054c: 02844001 addeq r4, r4, #1 + 1f10550: e1560003 cmp r6, r3 + 1f10554: 2affff84 bcs 1f1036c + 1f10558: e1a01006 mov r1, r6 + 1f1055c: e1a00007 mov r0, r7 + 1f10560: ebffdb3d bl 1f0725c + 1f10564: e3700001 cmn r0, #1 + 1f10568: e2866001 add r6, r6, #1 + 1f1056c: 1afffff1 bne 1f10538 + 1f10570: eaffffcc b 1f104a8 + 1f10574: e585a044 str sl, [r5, #68] ; 0x44 + 1f10578: e59da004 ldr sl, [sp, #4] + 1f1057c: e59d5014 ldr r5, [sp, #20] + 1f10580: eaffff8d b 1f103bc + 1f10584: e3a03001 mov r3, #1 + 1f10588: e1a0100b mov r1, fp + 1f1058c: e1a02008 mov r2, r8 + 1f10590: e5d50001 ldrb r0, [r5, #1] + 1f10594: eb00586b bl 1f26748 + 1f10598: e3500000 cmp r0, #0 + 1f1059c: 1affffc1 bne 1f104a8 + 1f105a0: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f105a4: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f105a8: e0622008 rsb r2, r2, r8 + 1f105ac: e5c57003 strb r7, [r5, #3] + 1f105b0: e1520003 cmp r2, r3 + 1f105b4: 2affffb2 bcs 1f10484 + 1f105b8: e5d59002 ldrb r9, [r5, #2] + 1f105bc: e3590001 cmp r9, #1 + 1f105c0: 8a000001 bhi 1f105cc + 1f105c4: eaffffae b 1f10484 + 1f105c8: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f105cc: e0888003 add r8, r8, r3 + 1f105d0: e2499001 sub r9, r9, #1 + 1f105d4: e1a02008 mov r2, r8 + 1f105d8: e3a03001 mov r3, #1 + 1f105dc: e1a0100b mov r1, fp + 1f105e0: e5d50001 ldrb r0, [r5, #1] + 1f105e4: eb005857 bl 1f26748 + 1f105e8: e3590001 cmp r9, #1 + 1f105ec: 1afffff5 bne 1f105c8 + 1f105f0: eaffffa3 b 1f10484 + 1f105f4: e1a0a003 mov sl, r3 + 1f105f8: eaffff6f b 1f103bc + 1f105fc: e3a0b002 mov fp, #2 + 1f10600: eaffff59 b 1f1036c + +01f10604 : + 1f10604: e3500000 cmp r0, #0 + 1f10608: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f1060c: 0a000005 beq 1f10628 + 1f10610: e5903000 ldr r3, [r0] + 1f10614: e3530000 cmp r3, #0 + 1f10618: 0a000002 beq 1f10628 + 1f1061c: e5d32000 ldrb r2, [r3] + 1f10620: e3520000 cmp r2, #0 + 1f10624: 1a000002 bne 1f10634 + 1f10628: e3a04009 mov r4, #9 + 1f1062c: e1a00004 mov r0, r4 + 1f10630: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f10634: e1d310b6 ldrh r1, [r3, #6] + 1f10638: e1d020b4 ldrh r2, [r0, #4] + 1f1063c: e1510002 cmp r1, r2 + 1f10640: 1afffff8 bne 1f10628 + 1f10644: e1a05000 mov r5, r0 + 1f10648: e5d30001 ldrb r0, [r3, #1] + 1f1064c: eb00581b bl 1f266c0 + 1f10650: e3100001 tst r0, #1 + 1f10654: 1afffff3 bne 1f10628 + 1f10658: e5d54029 ldrb r4, [r5, #41] ; 0x29 + 1f1065c: e3540000 cmp r4, #0 + 1f10660: 1afffff1 bne 1f1062c + 1f10664: e5d53028 ldrb r3, [r5, #40] ; 0x28 + 1f10668: e3130002 tst r3, #2 + 1f1066c: 1a000001 bne 1f10678 + 1f10670: e3a00007 mov r0, #7 + 1f10674: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f10678: e1c503d0 ldrd r0, [r5, #48] ; 0x30 + 1f1067c: e1c521d0 ldrd r2, [r5, #16] + 1f10680: e1530001 cmp r3, r1 + 1f10684: 01520000 cmpeq r2, r0 + 1f10688: 9a000010 bls 1f106d0 + 1f1068c: e1903001 orrs r3, r0, r1 + 1f10690: e5956000 ldr r6, [r5] + 1f10694: 1a000017 bne 1f106f8 + 1f10698: e1a02004 mov r2, r4 + 1f1069c: e5951008 ldr r1, [r5, #8] + 1f106a0: e1a00005 mov r0, r5 + 1f106a4: ebffd8d3 bl 1f069f8 + 1f106a8: e5854008 str r4, [r5, #8] + 1f106ac: e5d53028 ldrb r3, [r5, #40] ; 0x28 + 1f106b0: e3500000 cmp r0, #0 + 1f106b4: e1c583d0 ldrd r8, [r5, #48] ; 0x30 + 1f106b8: e3833040 orr r3, r3, #64 ; 0x40 + 1f106bc: e5c53028 strb r3, [r5, #40] ; 0x28 + 1f106c0: e1c581f0 strd r8, [r5, #16] + 1f106c4: 1a000009 bne 1f106f0 + 1f106c8: e3130080 tst r3, #128 ; 0x80 + 1f106cc: 1a000020 bne 1f10754 + 1f106d0: e3a00000 mov r0, #0 + 1f106d4: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f106d8: e3a00001 mov r0, #1 + 1f106dc: e5d53028 ldrb r3, [r5, #40] ; 0x28 + 1f106e0: e1c563d0 ldrd r6, [r5, #48] ; 0x30 + 1f106e4: e3833040 orr r3, r3, #64 ; 0x40 + 1f106e8: e5c53028 strb r3, [r5, #40] ; 0x28 + 1f106ec: e1c561f0 strd r6, [r5, #16] + 1f106f0: e5c50029 strb r0, [r5, #41] ; 0x29 + 1f106f4: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f106f8: e5951038 ldr r1, [r5, #56] ; 0x38 + 1f106fc: e1a00005 mov r0, r5 + 1f10700: ebffdad5 bl 1f0725c + 1f10704: e3700001 cmn r0, #1 + 1f10708: 0afffff2 beq 1f106d8 + 1f1070c: e3500001 cmp r0, #1 + 1f10710: 0a000008 beq 1f10738 + 1f10714: e596302c ldr r3, [r6, #44] ; 0x2c + 1f10718: e1500003 cmp r0, r3 + 1f1071c: 3a000007 bcc 1f10740 + 1f10720: e5d53028 ldrb r3, [r5, #40] ; 0x28 + 1f10724: e1c503d0 ldrd r0, [r5, #48] ; 0x30 + 1f10728: e3833040 orr r3, r3, #64 ; 0x40 + 1f1072c: e5c53028 strb r3, [r5, #40] ; 0x28 + 1f10730: e1c501f0 strd r0, [r5, #16] + 1f10734: eaffffe3 b 1f106c8 + 1f10738: e3a00002 mov r0, #2 + 1f1073c: eaffffe6 b 1f106dc + 1f10740: e1a01000 mov r1, r0 + 1f10744: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f10748: e1a00005 mov r0, r5 + 1f1074c: ebffd8a9 bl 1f069f8 + 1f10750: eaffffd5 b 1f106ac + 1f10754: e5d60001 ldrb r0, [r6, #1] + 1f10758: e3a03001 mov r3, #1 + 1f1075c: e595203c ldr r2, [r5, #60] ; 0x3c + 1f10760: e2851048 add r1, r5, #72 ; 0x48 + 1f10764: eb0057f7 bl 1f26748 + 1f10768: e3500000 cmp r0, #0 + 1f1076c: 05d53028 ldrbeq r3, [r5, #40] ; 0x28 + 1f10770: 0203307f andeq r3, r3, #127 ; 0x7f + 1f10774: 05c53028 strbeq r3, [r5, #40] ; 0x28 + 1f10778: 0affffd4 beq 1f106d0 + 1f1077c: e3a00001 mov r0, #1 + 1f10780: eaffffda b 1f106f0 + +01f10784 : + 1f10784: e92d43f0 push {r4, r5, r6, r7, r8, r9, lr} + 1f10788: e3a02002 mov r2, #2 + 1f1078c: e24dd0dc sub sp, sp, #220 ; 0xdc + 1f10790: e28d100c add r1, sp, #12 + 1f10794: e58d0004 str r0, [sp, #4] + 1f10798: e28d0004 add r0, sp, #4 + 1f1079c: ebffd3db bl 1f05710 + 1f107a0: e3500000 cmp r0, #0 + 1f107a4: e59d300c ldr r3, [sp, #12] + 1f107a8: e58d3038 str r3, [sp, #56] ; 0x38 + 1f107ac: 0a000001 beq 1f107b8 + 1f107b0: e28dd0dc add sp, sp, #220 ; 0xdc + 1f107b4: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f107b8: e59d1004 ldr r1, [sp, #4] + 1f107bc: e28d0038 add r0, sp, #56 ; 0x38 + 1f107c0: ebffef6d bl 1f0c57c + 1f107c4: e3500000 cmp r0, #0 + 1f107c8: 1afffff8 bne 1f107b0 + 1f107cc: e5dd307b ldrb r3, [sp, #123] ; 0x7b + 1f107d0: e3130020 tst r3, #32 + 1f107d4: 0a000002 beq 1f107e4 + 1f107d8: e3a00006 mov r0, #6 + 1f107dc: e28dd0dc add sp, sp, #220 ; 0xdc + 1f107e0: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f107e4: e3130080 tst r3, #128 ; 0x80 + 1f107e8: 1afffffa bne 1f107d8 + 1f107ec: e5dd203e ldrb r2, [sp, #62] ; 0x3e + 1f107f0: e3120001 tst r2, #1 + 1f107f4: 0a000002 beq 1f10804 + 1f107f8: e3a00007 mov r0, #7 + 1f107fc: e28dd0dc add sp, sp, #220 ; 0xdc + 1f10800: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f10804: e59d300c ldr r3, [sp, #12] + 1f10808: e58d3010 str r3, [sp, #16] + 1f1080c: e5d31000 ldrb r1, [r3] + 1f10810: e3510004 cmp r1, #4 + 1f10814: 0a000029 beq 1f108c0 + 1f10818: e59d006c ldr r0, [sp, #108] ; 0x6c + 1f1081c: e3510003 cmp r1, #3 + 1f10820: e5d0401b ldrb r4, [r0, #27] + 1f10824: e5d0c01a ldrb ip, [r0, #26] + 1f10828: e18c4404 orr r4, ip, r4, lsl #8 + 1f1082c: 05d0c015 ldrbeq ip, [r0, #21] + 1f10830: 05d00014 ldrbeq r0, [r0, #20] + 1f10834: 0180040c orreq r0, r0, ip, lsl #8 + 1f10838: 01844800 orreq r4, r4, r0, lsl #16 + 1f1083c: e3120010 tst r2, #16 + 1f10840: 0a000011 beq 1f1088c + 1f10844: e593201c ldr r2, [r3, #28] + 1f10848: e1540002 cmp r4, r2 + 1f1084c: 0affffe9 beq 1f107f8 + 1f10850: e3510004 cmp r1, #4 + 1f10854: e58d3088 str r3, [sp, #136] ; 0x88 + 1f10858: e58d4090 str r4, [sp, #144] ; 0x90 + 1f1085c: 0a000046 beq 1f1097c + 1f10860: e3a01000 mov r1, #0 + 1f10864: e28d0088 add r0, sp, #136 ; 0x88 + 1f10868: ebffde82 bl 1f08278 + 1f1086c: e3500000 cmp r0, #0 + 1f10870: 1affffce bne 1f107b0 + 1f10874: e28d0088 add r0, sp, #136 ; 0x88 + 1f10878: ebffe70e bl 1f0a4b8 + 1f1087c: e3500000 cmp r0, #0 + 1f10880: 0affffdc beq 1f107f8 + 1f10884: e3500004 cmp r0, #4 + 1f10888: 1affffc8 bne 1f107b0 + 1f1088c: e28d0038 add r0, sp, #56 ; 0x38 + 1f10890: ebffe323 bl 1f09524 + 1f10894: e16f3f10 clz r3, r0 + 1f10898: e3540000 cmp r4, #0 + 1f1089c: e1a032a3 lsr r3, r3, #5 + 1f108a0: 03a03000 moveq r3, #0 + 1f108a4: e3530000 cmp r3, #0 + 1f108a8: 1a00002e bne 1f10968 + 1f108ac: e3500000 cmp r0, #0 + 1f108b0: 1affffbe bne 1f107b0 + 1f108b4: e59d000c ldr r0, [sp, #12] + 1f108b8: ebffd63f bl 1f061bc + 1f108bc: eaffffbb b 1f107b0 + 1f108c0: e5930010 ldr r0, [r3, #16] + 1f108c4: e3a09000 mov r9, #0 + 1f108c8: e3a07000 mov r7, #0 + 1f108cc: e590c03c ldr ip, [r0, #60] ; 0x3c + 1f108d0: e5d0803b ldrb r8, [r0, #59] ; 0x3b + 1f108d4: e5d0603a ldrb r6, [r0, #58] ; 0x3a + 1f108d8: ee80cb90 vdup.32 d16, ip + 1f108dc: e1d0c3b6 ldrh ip, [r0, #54] ; 0x36 + 1f108e0: e5d0e035 ldrb lr, [r0, #53] ; 0x35 + 1f108e4: e18ec40c orr ip, lr, ip, lsl #8 + 1f108e8: f3e000b0 vshr.u64 d16, d16, #32 + 1f108ec: f2c815b0 vshl.s64 d17, d16, #8 + 1f108f0: ec554b31 vmov r4, r5, d17 + 1f108f4: e1855009 orr r5, r5, r9 + 1f108f8: e1844008 orr r4, r4, r8 + 1f108fc: e5d08038 ldrb r8, [r0, #56] ; 0x38 + 1f10900: e3a09000 mov r9, #0 + 1f10904: e1a05405 lsl r5, r5, #8 + 1f10908: e1855c24 orr r5, r5, r4, lsr #24 + 1f1090c: e1a04404 lsl r4, r4, #8 + 1f10910: e1855007 orr r5, r5, r7 + 1f10914: e1844006 orr r4, r4, r6 + 1f10918: e3a07000 mov r7, #0 + 1f1091c: e5d06039 ldrb r6, [r0, #57] ; 0x39 + 1f10920: e1a05405 lsl r5, r5, #8 + 1f10924: e1855c24 orr r5, r5, r4, lsr #24 + 1f10928: e1a04404 lsl r4, r4, #8 + 1f1092c: e1855007 orr r5, r5, r7 + 1f10930: e1844006 orr r4, r4, r6 + 1f10934: e1a05405 lsl r5, r5, #8 + 1f10938: e1855c24 orr r5, r5, r4, lsr #24 + 1f1093c: e1a04404 lsl r4, r4, #8 + 1f10940: e1888004 orr r8, r8, r4 + 1f10944: e5d04034 ldrb r4, [r0, #52] ; 0x34 + 1f10948: e5d00021 ldrb r0, [r0, #33] ; 0x21 + 1f1094c: e1899005 orr r9, r9, r5 + 1f10950: e184440c orr r4, r4, ip, lsl #8 + 1f10954: e58d4018 str r4, [sp, #24] + 1f10958: e2000002 and r0, r0, #2 + 1f1095c: e5cd0017 strb r0, [sp, #23] + 1f10960: e1cd82f0 strd r8, [sp, #32] + 1f10964: eaffffb4 b 1f1083c + 1f10968: e1a01004 mov r1, r4 + 1f1096c: e3a02000 mov r2, #0 + 1f10970: e28d0010 add r0, sp, #16 + 1f10974: ebffd81f bl 1f069f8 + 1f10978: eaffffcb b 1f108ac + 1f1097c: e1cd02d0 ldrd r0, [sp, #32] + 1f10980: e5dd3017 ldrb r3, [sp, #23] + 1f10984: e1cd09f8 strd r0, [sp, #152] ; 0x98 + 1f10988: e5cd308f strb r3, [sp, #143] ; 0x8f + 1f1098c: eaffffb3 b 1f10860 + +01f10990 : + 1f10990: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f10994: e3a02002 mov r2, #2 + 1f10998: ed2d8b04 vpush {d8-d9} + 1f1099c: e24dd07c sub sp, sp, #124 ; 0x7c + 1f109a0: e28d1024 add r1, sp, #36 ; 0x24 + 1f109a4: e58d001c str r0, [sp, #28] + 1f109a8: e28d001c add r0, sp, #28 + 1f109ac: ebffd357 bl 1f05710 + 1f109b0: e2504000 subs r4, r0, #0 + 1f109b4: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f109b8: e58d3028 str r3, [sp, #40] ; 0x28 + 1f109bc: 0a000003 beq 1f109d0 + 1f109c0: e1a00004 mov r0, r4 + 1f109c4: e28dd07c add sp, sp, #124 ; 0x7c + 1f109c8: ecbd8b04 vpop {d8-d9} + 1f109cc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f109d0: e59d101c ldr r1, [sp, #28] + 1f109d4: e28d0028 add r0, sp, #40 ; 0x28 + 1f109d8: ebffeee7 bl 1f0c57c + 1f109dc: e2504000 subs r4, r0, #0 + 1f109e0: 03a04008 moveq r4, #8 + 1f109e4: 0afffff5 beq 1f109c0 + 1f109e8: e3540004 cmp r4, #4 + 1f109ec: 1afffff3 bne 1f109c0 + 1f109f0: e5dd706b ldrb r7, [sp, #107] ; 0x6b + 1f109f4: e2077020 and r7, r7, #32 + 1f109f8: e21770ff ands r7, r7, #255 ; 0xff + 1f109fc: 13a04006 movne r4, #6 + 1f10a00: 1affffee bne 1f109c0 + 1f10a04: e1a01007 mov r1, r7 + 1f10a08: e28d0028 add r0, sp, #40 ; 0x28 + 1f10a0c: ebffdb59 bl 1f07778 + 1f10a10: e59d4024 ldr r4, [sp, #36] ; 0x24 + 1f10a14: e2503000 subs r3, r0, #0 + 1f10a18: e58d3004 str r3, [sp, #4] + 1f10a1c: e1d430ba ldrh r3, [r4, #10] + 1f10a20: e58d703c str r7, [sp, #60] ; 0x3c + 1f10a24: e1a03483 lsl r3, r3, #9 + 1f10a28: e58d3038 str r3, [sp, #56] ; 0x38 + 1f10a2c: 1a000006 bne 1f10a4c + 1f10a30: e3a04007 mov r4, #7 + 1f10a34: ebffc26f bl 1f013f8 + 1f10a38: e59d1004 ldr r1, [sp, #4] + 1f10a3c: e28d0028 add r0, sp, #40 ; 0x28 + 1f10a40: e3a02000 mov r2, #0 + 1f10a44: ebffd7eb bl 1f069f8 + 1f10a48: eaffffdc b 1f109c0 + 1f10a4c: e59d3004 ldr r3, [sp, #4] + 1f10a50: e3530001 cmp r3, #1 + 1f10a54: 03a04002 moveq r4, #2 + 1f10a58: 0afffff5 beq 1f10a34 + 1f10a5c: e3730001 cmn r3, #1 + 1f10a60: 1a000001 bne 1f10a6c + 1f10a64: e3a04001 mov r4, #1 + 1f10a68: eafffff1 b 1f10a34 + 1f10a6c: e5d43003 ldrb r3, [r4, #3] + 1f10a70: e3530000 cmp r3, #0 + 1f10a74: 1a000259 bne 1f113e0 + 1f10a78: ebffc25e bl 1f013f8 + 1f10a7c: e59d4024 ldr r4, [sp, #36] ; 0x24 + 1f10a80: e59d3004 ldr r3, [sp, #4] + 1f10a84: e58d0018 str r0, [sp, #24] + 1f10a88: e2432002 sub r2, r3, #2 + 1f10a8c: e594302c ldr r3, [r4, #44] ; 0x2c + 1f10a90: e2433002 sub r3, r3, #2 + 1f10a94: e1520003 cmp r2, r3 + 1f10a98: 23a09000 movcs r9, #0 + 1f10a9c: 31d490ba ldrhcc r9, [r4, #10] + 1f10aa0: 35943040 ldrcc r3, [r4, #64] ; 0x40 + 1f10aa4: 30293992 mlacc r9, r2, r9, r3 + 1f10aa8: e2843048 add r3, r4, #72 ; 0x48 + 1f10aac: e58d3008 str r3, [sp, #8] + 1f10ab0: e2036007 and r6, r3, #7 + 1f10ab4: e2666000 rsb r6, r6, #0 + 1f10ab8: e216600f ands r6, r6, #15 + 1f10abc: 0a000241 beq 1f113c8 + 1f10ac0: e3560001 cmp r6, #1 + 1f10ac4: e3a03000 mov r3, #0 + 1f10ac8: e2842049 add r2, r4, #73 ; 0x49 + 1f10acc: e5c43048 strb r3, [r4, #72] ; 0x48 + 1f10ad0: 0a0002bf beq 1f115d4 + 1f10ad4: e3560002 cmp r6, #2 + 1f10ad8: e5c43049 strb r3, [r4, #73] ; 0x49 + 1f10adc: e284204a add r2, r4, #74 ; 0x4a + 1f10ae0: 0a0002b9 beq 1f115cc + 1f10ae4: e3560003 cmp r6, #3 + 1f10ae8: e5c4304a strb r3, [r4, #74] ; 0x4a + 1f10aec: e284204b add r2, r4, #75 ; 0x4b + 1f10af0: 0a0002a3 beq 1f11584 + 1f10af4: e3560004 cmp r6, #4 + 1f10af8: e5c4304b strb r3, [r4, #75] ; 0x4b + 1f10afc: e284204c add r2, r4, #76 ; 0x4c + 1f10b00: 0a00029d beq 1f1157c + 1f10b04: e3560005 cmp r6, #5 + 1f10b08: e5c4304c strb r3, [r4, #76] ; 0x4c + 1f10b0c: e284204d add r2, r4, #77 ; 0x4d + 1f10b10: 0a000297 beq 1f11574 + 1f10b14: e3560006 cmp r6, #6 + 1f10b18: e5c4304d strb r3, [r4, #77] ; 0x4d + 1f10b1c: e284204e add r2, r4, #78 ; 0x4e + 1f10b20: 0a000291 beq 1f1156c + 1f10b24: e3560007 cmp r6, #7 + 1f10b28: e5c4304e strb r3, [r4, #78] ; 0x4e + 1f10b2c: e284204f add r2, r4, #79 ; 0x4f + 1f10b30: 0a0002a3 beq 1f115c4 + 1f10b34: e3560008 cmp r6, #8 + 1f10b38: e5c4304f strb r3, [r4, #79] ; 0x4f + 1f10b3c: e2842050 add r2, r4, #80 ; 0x50 + 1f10b40: 0a00029d beq 1f115bc + 1f10b44: e3560009 cmp r6, #9 + 1f10b48: e5c43050 strb r3, [r4, #80] ; 0x50 + 1f10b4c: e2842051 add r2, r4, #81 ; 0x51 + 1f10b50: 0a000297 beq 1f115b4 + 1f10b54: e356000a cmp r6, #10 + 1f10b58: e2842052 add r2, r4, #82 ; 0x52 + 1f10b5c: e5c43051 strb r3, [r4, #81] ; 0x51 + 1f10b60: 0a000291 beq 1f115ac + 1f10b64: e356000b cmp r6, #11 + 1f10b68: e5c43052 strb r3, [r4, #82] ; 0x52 + 1f10b6c: e2842053 add r2, r4, #83 ; 0x53 + 1f10b70: 0a00028b beq 1f115a4 + 1f10b74: e356000c cmp r6, #12 + 1f10b78: e5c43053 strb r3, [r4, #83] ; 0x53 + 1f10b7c: e2842054 add r2, r4, #84 ; 0x54 + 1f10b80: 0a000285 beq 1f1159c + 1f10b84: e356000d cmp r6, #13 + 1f10b88: e5c43054 strb r3, [r4, #84] ; 0x54 + 1f10b8c: e2842055 add r2, r4, #85 ; 0x55 + 1f10b90: 0a00027f beq 1f11594 + 1f10b94: e356000f cmp r6, #15 + 1f10b98: e5c43055 strb r3, [r4, #85] ; 0x55 + 1f10b9c: e2842056 add r2, r4, #86 ; 0x56 + 1f10ba0: 1a000279 bne 1f1158c + 1f10ba4: e5c43056 strb r3, [r4, #86] ; 0x56 + 1f10ba8: e2842057 add r2, r4, #87 ; 0x57 + 1f10bac: e30031f1 movw r3, #497 ; 0x1f1 + 1f10bb0: e2665c02 rsb r5, r6, #512 ; 0x200 + 1f10bb4: e3a0ce1f mov ip, #496 ; 0x1f0 + 1f10bb8: e3a0e01f mov lr, #31 + 1f10bbc: f2c00050 vmov.i32 q8, #0 ; 0x00000000 + 1f10bc0: e2861048 add r1, r6, #72 ; 0x48 + 1f10bc4: e0840001 add r0, r4, r1 + 1f10bc8: e58d1014 str r1, [sp, #20] + 1f10bcc: e3a01000 mov r1, #0 + 1f10bd0: e2811001 add r1, r1, #1 + 1f10bd4: f4400adf vst1.64 {d16-d17}, [r0 :64] + 1f10bd8: e151000e cmp r1, lr + 1f10bdc: e2800010 add r0, r0, #16 + 1f10be0: 3afffffa bcc 1f10bd0 + 1f10be4: e15c0005 cmp ip, r5 + 1f10be8: e06c3003 rsb r3, ip, r3 + 1f10bec: e082100c add r1, r2, ip + 1f10bf0: 0a00002a beq 1f10ca0 + 1f10bf4: e3530001 cmp r3, #1 + 1f10bf8: e3a00000 mov r0, #0 + 1f10bfc: e7c2000c strb r0, [r2, ip] + 1f10c00: 0a000026 beq 1f10ca0 + 1f10c04: e3530002 cmp r3, #2 + 1f10c08: e5c10001 strb r0, [r1, #1] + 1f10c0c: 0a000023 beq 1f10ca0 + 1f10c10: e3530003 cmp r3, #3 + 1f10c14: e5c10002 strb r0, [r1, #2] + 1f10c18: 0a000020 beq 1f10ca0 + 1f10c1c: e3530004 cmp r3, #4 + 1f10c20: e5c10003 strb r0, [r1, #3] + 1f10c24: 0a00001d beq 1f10ca0 + 1f10c28: e3530005 cmp r3, #5 + 1f10c2c: e5c10004 strb r0, [r1, #4] + 1f10c30: 0a00001a beq 1f10ca0 + 1f10c34: e3530006 cmp r3, #6 + 1f10c38: e5c10005 strb r0, [r1, #5] + 1f10c3c: 0a000017 beq 1f10ca0 + 1f10c40: e3530007 cmp r3, #7 + 1f10c44: e5c10006 strb r0, [r1, #6] + 1f10c48: 0a000014 beq 1f10ca0 + 1f10c4c: e3530008 cmp r3, #8 + 1f10c50: e5c10007 strb r0, [r1, #7] + 1f10c54: 0a000011 beq 1f10ca0 + 1f10c58: e3530009 cmp r3, #9 + 1f10c5c: e5c10008 strb r0, [r1, #8] + 1f10c60: 0a00000e beq 1f10ca0 + 1f10c64: e353000a cmp r3, #10 + 1f10c68: e5c10009 strb r0, [r1, #9] + 1f10c6c: 0a00000b beq 1f10ca0 + 1f10c70: e353000b cmp r3, #11 + 1f10c74: e5c1000a strb r0, [r1, #10] + 1f10c78: 0a000008 beq 1f10ca0 + 1f10c7c: e353000c cmp r3, #12 + 1f10c80: e5c1000b strb r0, [r1, #11] + 1f10c84: 0a000005 beq 1f10ca0 + 1f10c88: e353000d cmp r3, #13 + 1f10c8c: e5c1000c strb r0, [r1, #12] + 1f10c90: 0a000002 beq 1f10ca0 + 1f10c94: e353000e cmp r3, #14 + 1f10c98: e5c1000d strb r0, [r1, #13] + 1f10c9c: 15c1000e strbne r0, [r1, #14] + 1f10ca0: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f10ca4: e5d53000 ldrb r3, [r5] + 1f10ca8: e3530004 cmp r3, #4 + 1f10cac: 0a0000d5 beq 1f11008 + 1f10cb0: f2c20e10 vmov.i8 d16, #32 ; 0x20 + 1f10cb4: e59d0008 ldr r0, [sp, #8] + 1f10cb8: e59dc004 ldr ip, [sp, #4] + 1f10cbc: e3a03020 mov r3, #32 + 1f10cc0: e3a0202e mov r2, #46 ; 0x2e + 1f10cc4: e3a01010 mov r1, #16 + 1f10cc8: f440070f vst1.8 {d16}, [r0] + 1f10ccc: e59d0018 ldr r0, [sp, #24] + 1f10cd0: e5c4005e strb r0, [r4, #94] ; 0x5e + 1f10cd4: e5c43050 strb r3, [r4, #80] ; 0x50 + 1f10cd8: e5c43051 strb r3, [r4, #81] ; 0x51 + 1f10cdc: e5c43052 strb r3, [r4, #82] ; 0x52 + 1f10ce0: e1a03820 lsr r3, r0, #16 + 1f10ce4: e5c42048 strb r2, [r4, #72] ; 0x48 + 1f10ce8: e1a02420 lsr r2, r0, #8 + 1f10cec: e5c43060 strb r3, [r4, #96] ; 0x60 + 1f10cf0: e1a0344c asr r3, ip, #8 + 1f10cf4: e5c4205f strb r2, [r4, #95] ; 0x5f + 1f10cf8: e1a02c20 lsr r2, r0, #24 + 1f10cfc: e5c4c062 strb ip, [r4, #98] ; 0x62 + 1f10d00: e2840068 add r0, r4, #104 ; 0x68 + 1f10d04: e5c42061 strb r2, [r4, #97] ; 0x61 + 1f10d08: e5c41053 strb r1, [r4, #83] ; 0x53 + 1f10d0c: e5c43063 strb r3, [r4, #99] ; 0x63 + 1f10d10: e59d2008 ldr r2, [sp, #8] + 1f10d14: e5d53000 ldrb r3, [r5] + 1f10d18: e2845078 add r5, r4, #120 ; 0x78 + 1f10d1c: e3530003 cmp r3, #3 + 1f10d20: 01a0300c moveq r3, ip + 1f10d24: 01a03823 lsreq r3, r3, #16 + 1f10d28: 05c4305c strbeq r3, [r4, #92] ; 0x5c + 1f10d2c: 01a03443 asreq r3, r3, #8 + 1f10d30: 05c4305d strbeq r3, [r4, #93] ; 0x5d + 1f10d34: e2843058 add r3, r4, #88 ; 0x58 + 1f10d38: e1520005 cmp r2, r5 + 1f10d3c: 31500003 cmpcc r0, r3 + 1f10d40: 3a000202 bcc 1f11550 + 1f10d44: e3560000 cmp r6, #0 + 1f10d48: 0a0001ef beq 1f1150c + 1f10d4c: e3560001 cmp r6, #1 + 1f10d50: e5d43048 ldrb r3, [r4, #72] ; 0x48 + 1f10d54: e5c43068 strb r3, [r4, #104] ; 0x68 + 1f10d58: e2841069 add r1, r4, #105 ; 0x69 + 1f10d5c: e2842049 add r2, r4, #73 ; 0x49 + 1f10d60: 0a00021f beq 1f115e4 + 1f10d64: e3560002 cmp r6, #2 + 1f10d68: e5d43049 ldrb r3, [r4, #73] ; 0x49 + 1f10d6c: e5c43069 strb r3, [r4, #105] ; 0x69 + 1f10d70: e284106a add r1, r4, #106 ; 0x6a + 1f10d74: e284204a add r2, r4, #74 ; 0x4a + 1f10d78: 0a000221 beq 1f11604 + 1f10d7c: e3560003 cmp r6, #3 + 1f10d80: e5d4304a ldrb r3, [r4, #74] ; 0x4a + 1f10d84: e5c4306a strb r3, [r4, #106] ; 0x6a + 1f10d88: e284106b add r1, r4, #107 ; 0x6b + 1f10d8c: e284204b add r2, r4, #75 ; 0x4b + 1f10d90: 0a000219 beq 1f115fc + 1f10d94: e3560004 cmp r6, #4 + 1f10d98: e5d4304b ldrb r3, [r4, #75] ; 0x4b + 1f10d9c: e5c4306b strb r3, [r4, #107] ; 0x6b + 1f10da0: e284106c add r1, r4, #108 ; 0x6c + 1f10da4: e284204c add r2, r4, #76 ; 0x4c + 1f10da8: 0a000211 beq 1f115f4 + 1f10dac: e3560005 cmp r6, #5 + 1f10db0: e5d4304c ldrb r3, [r4, #76] ; 0x4c + 1f10db4: e5c4306c strb r3, [r4, #108] ; 0x6c + 1f10db8: e284106d add r1, r4, #109 ; 0x6d + 1f10dbc: e284204d add r2, r4, #77 ; 0x4d + 1f10dc0: 0a000209 beq 1f115ec + 1f10dc4: e3560006 cmp r6, #6 + 1f10dc8: e5d4304d ldrb r3, [r4, #77] ; 0x4d + 1f10dcc: e5c4306d strb r3, [r4, #109] ; 0x6d + 1f10dd0: e284106e add r1, r4, #110 ; 0x6e + 1f10dd4: e284204e add r2, r4, #78 ; 0x4e + 1f10dd8: 0a000219 beq 1f11644 + 1f10ddc: e3560007 cmp r6, #7 + 1f10de0: e5d4304e ldrb r3, [r4, #78] ; 0x4e + 1f10de4: e5c4306e strb r3, [r4, #110] ; 0x6e + 1f10de8: e284106f add r1, r4, #111 ; 0x6f + 1f10dec: e284204f add r2, r4, #79 ; 0x4f + 1f10df0: 0a000211 beq 1f1163c + 1f10df4: e3560008 cmp r6, #8 + 1f10df8: e5d4304f ldrb r3, [r4, #79] ; 0x4f + 1f10dfc: e5c4306f strb r3, [r4, #111] ; 0x6f + 1f10e00: e2841070 add r1, r4, #112 ; 0x70 + 1f10e04: e2842050 add r2, r4, #80 ; 0x50 + 1f10e08: 0a000209 beq 1f11634 + 1f10e0c: e3560009 cmp r6, #9 + 1f10e10: e5d43050 ldrb r3, [r4, #80] ; 0x50 + 1f10e14: e5c43070 strb r3, [r4, #112] ; 0x70 + 1f10e18: e2841071 add r1, r4, #113 ; 0x71 + 1f10e1c: e2842051 add r2, r4, #81 ; 0x51 + 1f10e20: 0a000201 beq 1f1162c + 1f10e24: e356000a cmp r6, #10 + 1f10e28: e5d43051 ldrb r3, [r4, #81] ; 0x51 + 1f10e2c: e5c43071 strb r3, [r4, #113] ; 0x71 + 1f10e30: e2841072 add r1, r4, #114 ; 0x72 + 1f10e34: e2842052 add r2, r4, #82 ; 0x52 + 1f10e38: 0a0001f9 beq 1f11624 + 1f10e3c: e356000b cmp r6, #11 + 1f10e40: e5d43052 ldrb r3, [r4, #82] ; 0x52 + 1f10e44: e5c43072 strb r3, [r4, #114] ; 0x72 + 1f10e48: e2841073 add r1, r4, #115 ; 0x73 + 1f10e4c: e2842053 add r2, r4, #83 ; 0x53 + 1f10e50: 0a0001f1 beq 1f1161c + 1f10e54: e356000c cmp r6, #12 + 1f10e58: e5d43053 ldrb r3, [r4, #83] ; 0x53 + 1f10e5c: e5c43073 strb r3, [r4, #115] ; 0x73 + 1f10e60: e2841074 add r1, r4, #116 ; 0x74 + 1f10e64: e2842054 add r2, r4, #84 ; 0x54 + 1f10e68: 0a0001e9 beq 1f11614 + 1f10e6c: e356000d cmp r6, #13 + 1f10e70: e5d43054 ldrb r3, [r4, #84] ; 0x54 + 1f10e74: e5c43074 strb r3, [r4, #116] ; 0x74 + 1f10e78: e2841075 add r1, r4, #117 ; 0x75 + 1f10e7c: e2842055 add r2, r4, #85 ; 0x55 + 1f10e80: 0a0001e1 beq 1f1160c + 1f10e84: e356000f cmp r6, #15 + 1f10e88: e5d43055 ldrb r3, [r4, #85] ; 0x55 + 1f10e8c: e5c43075 strb r3, [r4, #117] ; 0x75 + 1f10e90: e2841076 add r1, r4, #118 ; 0x76 + 1f10e94: e2842056 add r2, r4, #86 ; 0x56 + 1f10e98: 1a0001cf bne 1f115dc + 1f10e9c: e5d43056 ldrb r3, [r4, #86] ; 0x56 + 1f10ea0: e2841077 add r1, r4, #119 ; 0x77 + 1f10ea4: e5c43076 strb r3, [r4, #118] ; 0x76 + 1f10ea8: e2842057 add r2, r4, #87 ; 0x57 + 1f10eac: e3a03011 mov r3, #17 + 1f10eb0: e084c006 add ip, r4, r6 + 1f10eb4: e0800006 add r0, r0, r6 + 1f10eb8: e266e020 rsb lr, r6, #32 + 1f10ebc: eddc0b12 vldr d16, [ip, #72] ; 0x48 + 1f10ec0: eddc1b14 vldr d17, [ip, #80] ; 0x50 + 1f10ec4: e3a0c010 mov ip, #16 + 1f10ec8: f4400a0f vst1.8 {d16-d17}, [r0] + 1f10ecc: e15c000e cmp ip, lr + 1f10ed0: e06c3003 rsb r3, ip, r3 + 1f10ed4: e081000c add r0, r1, ip + 1f10ed8: e082e00c add lr, r2, ip + 1f10edc: 0a000038 beq 1f10fc4 + 1f10ee0: e3530001 cmp r3, #1 + 1f10ee4: e7d2200c ldrb r2, [r2, ip] + 1f10ee8: e7c1200c strb r2, [r1, ip] + 1f10eec: 0a000034 beq 1f10fc4 + 1f10ef0: e3530002 cmp r3, #2 + 1f10ef4: e5de2001 ldrb r2, [lr, #1] + 1f10ef8: e5c02001 strb r2, [r0, #1] + 1f10efc: 0a000030 beq 1f10fc4 + 1f10f00: e3530003 cmp r3, #3 + 1f10f04: e5de2002 ldrb r2, [lr, #2] + 1f10f08: e5c02002 strb r2, [r0, #2] + 1f10f0c: 0a00002c beq 1f10fc4 + 1f10f10: e3530004 cmp r3, #4 + 1f10f14: e5de2003 ldrb r2, [lr, #3] + 1f10f18: e5c02003 strb r2, [r0, #3] + 1f10f1c: 0a000028 beq 1f10fc4 + 1f10f20: e3530005 cmp r3, #5 + 1f10f24: e5de2004 ldrb r2, [lr, #4] + 1f10f28: e5c02004 strb r2, [r0, #4] + 1f10f2c: 0a000024 beq 1f10fc4 + 1f10f30: e3530006 cmp r3, #6 + 1f10f34: e5de2005 ldrb r2, [lr, #5] + 1f10f38: e5c02005 strb r2, [r0, #5] + 1f10f3c: 0a000020 beq 1f10fc4 + 1f10f40: e3530007 cmp r3, #7 + 1f10f44: e5de2006 ldrb r2, [lr, #6] + 1f10f48: e5c02006 strb r2, [r0, #6] + 1f10f4c: 0a00001c beq 1f10fc4 + 1f10f50: e3530008 cmp r3, #8 + 1f10f54: e5de2007 ldrb r2, [lr, #7] + 1f10f58: e5c02007 strb r2, [r0, #7] + 1f10f5c: 0a000018 beq 1f10fc4 + 1f10f60: e3530009 cmp r3, #9 + 1f10f64: e5de2008 ldrb r2, [lr, #8] + 1f10f68: e5c02008 strb r2, [r0, #8] + 1f10f6c: 0a000014 beq 1f10fc4 + 1f10f70: e353000a cmp r3, #10 + 1f10f74: e5de2009 ldrb r2, [lr, #9] + 1f10f78: e5c02009 strb r2, [r0, #9] + 1f10f7c: 0a000010 beq 1f10fc4 + 1f10f80: e353000b cmp r3, #11 + 1f10f84: e5de200a ldrb r2, [lr, #10] + 1f10f88: e5c0200a strb r2, [r0, #10] + 1f10f8c: 0a00000c beq 1f10fc4 + 1f10f90: e353000c cmp r3, #12 + 1f10f94: e5de200b ldrb r2, [lr, #11] + 1f10f98: e5c0200b strb r2, [r0, #11] + 1f10f9c: 0a000008 beq 1f10fc4 + 1f10fa0: e353000d cmp r3, #13 + 1f10fa4: e5de200c ldrb r2, [lr, #12] + 1f10fa8: e5c0200c strb r2, [r0, #12] + 1f10fac: 0a000004 beq 1f10fc4 + 1f10fb0: e353000e cmp r3, #14 + 1f10fb4: e5de300d ldrb r3, [lr, #13] + 1f10fb8: e5c0300d strb r3, [r0, #13] + 1f10fbc: 15de300e ldrbne r3, [lr, #14] + 1f10fc0: 15c0300e strbne r3, [r0, #14] + 1f10fc4: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f10fc8: e3a0302e mov r3, #46 ; 0x2e + 1f10fcc: e5c43069 strb r3, [r4, #105] ; 0x69 + 1f10fd0: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f10fd4: e5d52000 ldrb r2, [r5] + 1f10fd8: e3520003 cmp r2, #3 + 1f10fdc: 0a000155 beq 1f11538 + 1f10fe0: e6ef7073 uxtb r7, r3 + 1f10fe4: e7e72453 ubfx r2, r3, #8, #8 + 1f10fe8: e5c47082 strb r7, [r4, #130] ; 0x82 + 1f10fec: e5c42083 strb r2, [r4, #131] ; 0x83 + 1f10ff0: e5d52000 ldrb r2, [r5] + 1f10ff4: e3520003 cmp r2, #3 + 1f10ff8: 01a03823 lsreq r3, r3, #16 + 1f10ffc: 05c4307c strbeq r3, [r4, #124] ; 0x7c + 1f11000: 01a03443 asreq r3, r3, #8 + 1f11004: 05c4307d strbeq r3, [r4, #125] ; 0x7d + 1f11008: e1d530ba ldrh r3, [r5, #10] + 1f1100c: e3530000 cmp r3, #0 + 1f11010: 0a0000ac beq 1f112c8 + 1f11014: e266be1f rsb fp, r6, #496 ; 0x1f0 + 1f11018: f2808050 vmov.i32 q4, #0 ; 0x00000000 + 1f1101c: e2433001 sub r3, r3, #1 + 1f11020: e2662c02 rsb r2, r6, #512 ; 0x200 + 1f11024: e1a0b22b lsr fp, fp, #4 + 1f11028: e0833009 add r3, r3, r9 + 1f1102c: e28bb001 add fp, fp, #1 + 1f11030: e58d3000 str r3, [sp] + 1f11034: e58d200c str r2, [sp, #12] + 1f11038: e1a0320b lsl r3, fp, #4 + 1f1103c: e58d3010 str r3, [sp, #16] + 1f11040: e285a048 add sl, r5, #72 ; 0x48 + 1f11044: e3a03001 mov r3, #1 + 1f11048: e5859044 str r9, [r5, #68] ; 0x44 + 1f1104c: e1a0100a mov r1, sl + 1f11050: e5c53003 strb r3, [r5, #3] + 1f11054: e1a02009 mov r2, r9 + 1f11058: e3a03001 mov r3, #1 + 1f1105c: e5d50001 ldrb r0, [r5, #1] + 1f11060: eb0055b8 bl 1f26748 + 1f11064: e3500000 cmp r0, #0 + 1f11068: 1a000091 bne 1f112b4 + 1f1106c: e5952038 ldr r2, [r5, #56] ; 0x38 + 1f11070: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f11074: e0622009 rsb r2, r2, r9 + 1f11078: e5c50003 strb r0, [r5, #3] + 1f1107c: e1520003 cmp r2, r3 + 1f11080: 2a00000e bcs 1f110c0 + 1f11084: e5d57002 ldrb r7, [r5, #2] + 1f11088: e3570001 cmp r7, #1 + 1f1108c: 9a00000b bls 1f110c0 + 1f11090: e1a08009 mov r8, r9 + 1f11094: ea000000 b 1f1109c + 1f11098: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f1109c: e0888003 add r8, r8, r3 + 1f110a0: e2477001 sub r7, r7, #1 + 1f110a4: e1a02008 mov r2, r8 + 1f110a8: e3a03001 mov r3, #1 + 1f110ac: e1a0100a mov r1, sl + 1f110b0: e5d50001 ldrb r0, [r5, #1] + 1f110b4: eb0055a3 bl 1f26748 + 1f110b8: e3570001 cmp r7, #1 + 1f110bc: 1afffff5 bne 1f11098 + 1f110c0: e3560000 cmp r6, #0 + 1f110c4: 0a00007c beq 1f112bc + 1f110c8: e3560001 cmp r6, #1 + 1f110cc: e3a03000 mov r3, #0 + 1f110d0: e2842049 add r2, r4, #73 ; 0x49 + 1f110d4: e5c43048 strb r3, [r4, #72] ; 0x48 + 1f110d8: 0a0000a8 beq 1f11380 + 1f110dc: e3560002 cmp r6, #2 + 1f110e0: e5c43049 strb r3, [r4, #73] ; 0x49 + 1f110e4: e284204a add r2, r4, #74 ; 0x4a + 1f110e8: 0a0000a2 beq 1f11378 + 1f110ec: e3560003 cmp r6, #3 + 1f110f0: e5c4304a strb r3, [r4, #74] ; 0x4a + 1f110f4: e284204b add r2, r4, #75 ; 0x4b + 1f110f8: 0a00009c beq 1f11370 + 1f110fc: e3560004 cmp r6, #4 + 1f11100: e5c4304b strb r3, [r4, #75] ; 0x4b + 1f11104: e284204c add r2, r4, #76 ; 0x4c + 1f11108: 0a000096 beq 1f11368 + 1f1110c: e3560005 cmp r6, #5 + 1f11110: e5c4304c strb r3, [r4, #76] ; 0x4c + 1f11114: e284204d add r2, r4, #77 ; 0x4d + 1f11118: 0a0000a8 beq 1f113c0 + 1f1111c: e3560006 cmp r6, #6 + 1f11120: e5c4304d strb r3, [r4, #77] ; 0x4d + 1f11124: e284204e add r2, r4, #78 ; 0x4e + 1f11128: 0a0000a2 beq 1f113b8 + 1f1112c: e3560007 cmp r6, #7 + 1f11130: e5c4304e strb r3, [r4, #78] ; 0x4e + 1f11134: e284204f add r2, r4, #79 ; 0x4f + 1f11138: 0a00009c beq 1f113b0 + 1f1113c: e3560008 cmp r6, #8 + 1f11140: e5c4304f strb r3, [r4, #79] ; 0x4f + 1f11144: e2842050 add r2, r4, #80 ; 0x50 + 1f11148: 0a000096 beq 1f113a8 + 1f1114c: e3560009 cmp r6, #9 + 1f11150: e5c43050 strb r3, [r4, #80] ; 0x50 + 1f11154: e2842051 add r2, r4, #81 ; 0x51 + 1f11158: 0a000090 beq 1f113a0 + 1f1115c: e356000a cmp r6, #10 + 1f11160: e2842052 add r2, r4, #82 ; 0x52 + 1f11164: e5c43051 strb r3, [r4, #81] ; 0x51 + 1f11168: 0a00008a beq 1f11398 + 1f1116c: e356000b cmp r6, #11 + 1f11170: e5c43052 strb r3, [r4, #82] ; 0x52 + 1f11174: e2842053 add r2, r4, #83 ; 0x53 + 1f11178: 0a000084 beq 1f11390 + 1f1117c: e356000c cmp r6, #12 + 1f11180: e5c43053 strb r3, [r4, #83] ; 0x53 + 1f11184: e2842054 add r2, r4, #84 ; 0x54 + 1f11188: 0a00007e beq 1f11388 + 1f1118c: e356000d cmp r6, #13 + 1f11190: e5c43054 strb r3, [r4, #84] ; 0x54 + 1f11194: e2842055 add r2, r4, #85 ; 0x55 + 1f11198: 0a000070 beq 1f11360 + 1f1119c: e356000f cmp r6, #15 + 1f111a0: e5c43055 strb r3, [r4, #85] ; 0x55 + 1f111a4: e2842056 add r2, r4, #86 ; 0x56 + 1f111a8: 1a00006a bne 1f11358 + 1f111ac: e5c43056 strb r3, [r4, #86] ; 0x56 + 1f111b0: e2842057 add r2, r4, #87 ; 0x57 + 1f111b4: e30031f1 movw r3, #497 ; 0x1f1 + 1f111b8: e59d1014 ldr r1, [sp, #20] + 1f111bc: e0840001 add r0, r4, r1 + 1f111c0: e3a01000 mov r1, #0 + 1f111c4: e2811001 add r1, r1, #1 + 1f111c8: f4008adf vst1.64 {d8-d9}, [r0 :64] + 1f111cc: e15b0001 cmp fp, r1 + 1f111d0: e2800010 add r0, r0, #16 + 1f111d4: 8afffffa bhi 1f111c4 + 1f111d8: e59dc010 ldr ip, [sp, #16] + 1f111dc: e59d000c ldr r0, [sp, #12] + 1f111e0: e06c3003 rsb r3, ip, r3 + 1f111e4: e082100c add r1, r2, ip + 1f111e8: e150000c cmp r0, ip + 1f111ec: 0a00002a beq 1f1129c + 1f111f0: e3530001 cmp r3, #1 + 1f111f4: e3a00000 mov r0, #0 + 1f111f8: e7c2000c strb r0, [r2, ip] + 1f111fc: 0a000026 beq 1f1129c + 1f11200: e3530002 cmp r3, #2 + 1f11204: e5c10001 strb r0, [r1, #1] + 1f11208: 0a000023 beq 1f1129c + 1f1120c: e3530003 cmp r3, #3 + 1f11210: e5c10002 strb r0, [r1, #2] + 1f11214: 0a000020 beq 1f1129c + 1f11218: e3530004 cmp r3, #4 + 1f1121c: e5c10003 strb r0, [r1, #3] + 1f11220: 0a00001d beq 1f1129c + 1f11224: e3530005 cmp r3, #5 + 1f11228: e5c10004 strb r0, [r1, #4] + 1f1122c: 0a00001a beq 1f1129c + 1f11230: e3530006 cmp r3, #6 + 1f11234: e5c10005 strb r0, [r1, #5] + 1f11238: 0a000017 beq 1f1129c + 1f1123c: e3530007 cmp r3, #7 + 1f11240: e5c10006 strb r0, [r1, #6] + 1f11244: 0a000014 beq 1f1129c + 1f11248: e3530008 cmp r3, #8 + 1f1124c: e5c10007 strb r0, [r1, #7] + 1f11250: 0a000011 beq 1f1129c + 1f11254: e3530009 cmp r3, #9 + 1f11258: e5c10008 strb r0, [r1, #8] + 1f1125c: 0a00000e beq 1f1129c + 1f11260: e353000a cmp r3, #10 + 1f11264: e5c10009 strb r0, [r1, #9] + 1f11268: 0a00000b beq 1f1129c + 1f1126c: e353000b cmp r3, #11 + 1f11270: e5c1000a strb r0, [r1, #10] + 1f11274: 0a000008 beq 1f1129c + 1f11278: e353000c cmp r3, #12 + 1f1127c: e5c1000b strb r0, [r1, #11] + 1f11280: 0a000005 beq 1f1129c + 1f11284: e353000d cmp r3, #13 + 1f11288: e5c1000c strb r0, [r1, #12] + 1f1128c: 0a000002 beq 1f1129c + 1f11290: e353000e cmp r3, #14 + 1f11294: e5c1000d strb r0, [r1, #13] + 1f11298: 15c1000e strbne r0, [r1, #14] + 1f1129c: e59d3000 ldr r3, [sp] + 1f112a0: e1590003 cmp r9, r3 + 1f112a4: 0a000007 beq 1f112c8 + 1f112a8: e2899001 add r9, r9, #1 + 1f112ac: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f112b0: eaffff62 b 1f11040 + 1f112b4: e3a04001 mov r4, #1 + 1f112b8: eafffdde b 1f10a38 + 1f112bc: e59d2008 ldr r2, [sp, #8] + 1f112c0: e3a03c02 mov r3, #512 ; 0x200 + 1f112c4: eaffffbb b 1f111b8 + 1f112c8: e28d0028 add r0, sp, #40 ; 0x28 + 1f112cc: ebffe77e bl 1f0b0cc + 1f112d0: e2504000 subs r4, r0, #0 + 1f112d4: 1afffdd7 bne 1f10a38 + 1f112d8: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f112dc: e5d32000 ldrb r2, [r3] + 1f112e0: e3520004 cmp r2, #4 + 1f112e4: 0a00005b beq 1f11458 + 1f112e8: e59d205c ldr r2, [sp, #92] ; 0x5c + 1f112ec: e59d4018 ldr r4, [sp, #24] + 1f112f0: e59d5004 ldr r5, [sp, #4] + 1f112f4: e5c24016 strb r4, [r2, #22] + 1f112f8: e1a00c24 lsr r0, r4, #24 + 1f112fc: e5c2501a strb r5, [r2, #26] + 1f11300: e5c20019 strb r0, [r2, #25] + 1f11304: e1a01445 asr r1, r5, #8 + 1f11308: e1a0e424 lsr lr, r4, #8 + 1f1130c: e5c2101b strb r1, [r2, #27] + 1f11310: e5c2e017 strb lr, [r2, #23] + 1f11314: e1a0c824 lsr ip, r4, #16 + 1f11318: e5c2c018 strb ip, [r2, #24] + 1f1131c: e3a00010 mov r0, #16 + 1f11320: e5d31000 ldrb r1, [r3] + 1f11324: e5c2000b strb r0, [r2, #11] + 1f11328: e3510003 cmp r1, #3 + 1f1132c: 01a01005 moveq r1, r5 + 1f11330: 01a01821 lsreq r1, r1, #16 + 1f11334: 05c21014 strbeq r1, [r2, #20] + 1f11338: 01a01441 asreq r1, r1, #8 + 1f1133c: 05c21015 strbeq r1, [r2, #21] + 1f11340: e3a01001 mov r1, #1 + 1f11344: e5c31003 strb r1, [r3, #3] + 1f11348: e1a00003 mov r0, r3 + 1f1134c: ebffd39a bl 1f061bc + 1f11350: e1a04000 mov r4, r0 + 1f11354: eafffd99 b 1f109c0 + 1f11358: e30031f2 movw r3, #498 ; 0x1f2 + 1f1135c: eaffff95 b 1f111b8 + 1f11360: e30031f3 movw r3, #499 ; 0x1f3 + 1f11364: eaffff93 b 1f111b8 + 1f11368: e3a03f7f mov r3, #508 ; 0x1fc + 1f1136c: eaffff91 b 1f111b8 + 1f11370: e30031fd movw r3, #509 ; 0x1fd + 1f11374: eaffff8f b 1f111b8 + 1f11378: e30031fe movw r3, #510 ; 0x1fe + 1f1137c: eaffff8d b 1f111b8 + 1f11380: e30031ff movw r3, #511 ; 0x1ff + 1f11384: eaffff8b b 1f111b8 + 1f11388: e3a03f7d mov r3, #500 ; 0x1f4 + 1f1138c: eaffff89 b 1f111b8 + 1f11390: e30031f5 movw r3, #501 ; 0x1f5 + 1f11394: eaffff87 b 1f111b8 + 1f11398: e30031f6 movw r3, #502 ; 0x1f6 + 1f1139c: eaffff85 b 1f111b8 + 1f113a0: e30031f7 movw r3, #503 ; 0x1f7 + 1f113a4: eaffff83 b 1f111b8 + 1f113a8: e3a03f7e mov r3, #504 ; 0x1f8 + 1f113ac: eaffff81 b 1f111b8 + 1f113b0: e30031f9 movw r3, #505 ; 0x1f9 + 1f113b4: eaffff7f b 1f111b8 + 1f113b8: e30031fa movw r3, #506 ; 0x1fa + 1f113bc: eaffff7d b 1f111b8 + 1f113c0: e30031fb movw r3, #507 ; 0x1fb + 1f113c4: eaffff7b b 1f111b8 + 1f113c8: e3a0cc02 mov ip, #512 ; 0x200 + 1f113cc: e1a02003 mov r2, r3 + 1f113d0: e1a0500c mov r5, ip + 1f113d4: e1a0300c mov r3, ip + 1f113d8: e3a0e020 mov lr, #32 + 1f113dc: eafffdf6 b 1f10bbc + 1f113e0: e5945044 ldr r5, [r4, #68] ; 0x44 + 1f113e4: e2848048 add r8, r4, #72 ; 0x48 + 1f113e8: e1a01008 mov r1, r8 + 1f113ec: e3a03001 mov r3, #1 + 1f113f0: e1a02005 mov r2, r5 + 1f113f4: e5d40001 ldrb r0, [r4, #1] + 1f113f8: eb0054d2 bl 1f26748 + 1f113fc: e3500000 cmp r0, #0 + 1f11400: 1afffd97 bne 1f10a64 + 1f11404: e5942038 ldr r2, [r4, #56] ; 0x38 + 1f11408: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f1140c: e0622005 rsb r2, r2, r5 + 1f11410: e5c47003 strb r7, [r4, #3] + 1f11414: e1520003 cmp r2, r3 + 1f11418: 2afffd96 bcs 1f10a78 + 1f1141c: e5d46002 ldrb r6, [r4, #2] + 1f11420: e3560001 cmp r6, #1 + 1f11424: 8a000001 bhi 1f11430 + 1f11428: eafffd92 b 1f10a78 + 1f1142c: e5943030 ldr r3, [r4, #48] ; 0x30 + 1f11430: e0855003 add r5, r5, r3 + 1f11434: e2466001 sub r6, r6, #1 + 1f11438: e1a02005 mov r2, r5 + 1f1143c: e3a03001 mov r3, #1 + 1f11440: e1a01008 mov r1, r8 + 1f11444: e5d40001 ldrb r0, [r4, #1] + 1f11448: eb0054be bl 1f26748 + 1f1144c: e3560001 cmp r6, #1 + 1f11450: 1afffff5 bne 1f1142c + 1f11454: eafffd87 b 1f10a78 + 1f11458: e5932010 ldr r2, [r3, #16] + 1f1145c: e3a06003 mov r6, #3 + 1f11460: e59de018 ldr lr, [sp, #24] + 1f11464: e28d0028 add r0, sp, #40 ; 0x28 + 1f11468: e59d7004 ldr r7, [sp, #4] + 1f1146c: e3a05010 mov r5, #16 + 1f11470: e5c2e00c strb lr, [r2, #12] + 1f11474: e1a0c42e lsr ip, lr, #8 + 1f11478: e1a0182e lsr r1, lr, #16 + 1f1147c: e5c2c00d strb ip, [r2, #13] + 1f11480: e1a04c2e lsr r4, lr, #24 + 1f11484: e5c2100e strb r1, [r2, #14] + 1f11488: e1a0e427 lsr lr, r7, #8 + 1f1148c: e5c2400f strb r4, [r2, #15] + 1f11490: e1a0c827 lsr ip, r7, #16 + 1f11494: e1a01c27 lsr r1, r7, #24 + 1f11498: e5932010 ldr r2, [r3, #16] + 1f1149c: e5c2e035 strb lr, [r2, #53] ; 0x35 + 1f114a0: e5c2c036 strb ip, [r2, #54] ; 0x36 + 1f114a4: e5c27034 strb r7, [r2, #52] ; 0x34 + 1f114a8: e5c21037 strb r1, [r2, #55] ; 0x37 + 1f114ac: e59d2038 ldr r2, [sp, #56] ; 0x38 + 1f114b0: e5931010 ldr r1, [r3, #16] + 1f114b4: e7e7e452 ubfx lr, r2, #8, #8 + 1f114b8: e7e7c852 ubfx ip, r2, #16, #8 + 1f114bc: e6ef4072 uxtb r4, r2 + 1f114c0: e1a02c22 lsr r2, r2, #24 + 1f114c4: e5c14038 strb r4, [r1, #56] ; 0x38 + 1f114c8: e5c1e039 strb lr, [r1, #57] ; 0x39 + 1f114cc: e5c1c03a strb ip, [r1, #58] ; 0x3a + 1f114d0: e5c1203b strb r2, [r1, #59] ; 0x3b + 1f114d4: e5931010 ldr r1, [r3, #16] + 1f114d8: e5c14028 strb r4, [r1, #40] ; 0x28 + 1f114dc: e5c1e029 strb lr, [r1, #41] ; 0x29 + 1f114e0: e5c1c02a strb ip, [r1, #42] ; 0x2a + 1f114e4: e5c1202b strb r2, [r1, #43] ; 0x2b + 1f114e8: e5932010 ldr r2, [r3, #16] + 1f114ec: e5c26021 strb r6, [r2, #33] ; 0x21 + 1f114f0: e5933010 ldr r3, [r3, #16] + 1f114f4: e5c35004 strb r5, [r3, #4] + 1f114f8: ebffde95 bl 1f08f54 + 1f114fc: e2504000 subs r4, r0, #0 + 1f11500: 059d3024 ldreq r3, [sp, #36] ; 0x24 + 1f11504: 1afffd2d bne 1f109c0 + 1f11508: eaffff8e b 1f11348 + 1f1150c: edd40b12 vldr d16, [r4, #72] ; 0x48 + 1f11510: edd41b14 vldr d17, [r4, #80] ; 0x50 + 1f11514: e3a03020 mov r3, #32 + 1f11518: e1a01000 mov r1, r0 + 1f1151c: e1a0e003 mov lr, r3 + 1f11520: e1a0c003 mov ip, r3 + 1f11524: f4400a0f vst1.8 {d16-d17}, [r0] + 1f11528: edd20b04 vldr d16, [r2, #16] + 1f1152c: edd21b06 vldr d17, [r2, #24] + 1f11530: f4450a0f vst1.8 {d16-d17}, [r5] + 1f11534: eafffe64 b 1f10ecc + 1f11538: e595203c ldr r2, [r5, #60] ; 0x3c + 1f1153c: e1530002 cmp r3, r2 + 1f11540: 1afffea6 bne 1f10fe0 + 1f11544: e3a02000 mov r2, #0 + 1f11548: e1a03002 mov r3, r2 + 1f1154c: eafffea5 b 1f10fe8 + 1f11550: e1a03002 mov r3, r2 + 1f11554: e2842067 add r2, r4, #103 ; 0x67 + 1f11558: e4d31001 ldrb r1, [r3], #1 + 1f1155c: e5e21001 strb r1, [r2, #1]! + 1f11560: e1500003 cmp r0, r3 + 1f11564: 1afffffb bne 1f11558 + 1f11568: eafffe95 b 1f10fc4 + 1f1156c: e30031fa movw r3, #506 ; 0x1fa + 1f11570: eafffd8e b 1f10bb0 + 1f11574: e30031fb movw r3, #507 ; 0x1fb + 1f11578: eafffd8c b 1f10bb0 + 1f1157c: e3a03f7f mov r3, #508 ; 0x1fc + 1f11580: eafffd8a b 1f10bb0 + 1f11584: e30031fd movw r3, #509 ; 0x1fd + 1f11588: eafffd88 b 1f10bb0 + 1f1158c: e30031f2 movw r3, #498 ; 0x1f2 + 1f11590: eafffd86 b 1f10bb0 + 1f11594: e30031f3 movw r3, #499 ; 0x1f3 + 1f11598: eafffd84 b 1f10bb0 + 1f1159c: e3a03f7d mov r3, #500 ; 0x1f4 + 1f115a0: eafffd82 b 1f10bb0 + 1f115a4: e30031f5 movw r3, #501 ; 0x1f5 + 1f115a8: eafffd80 b 1f10bb0 + 1f115ac: e30031f6 movw r3, #502 ; 0x1f6 + 1f115b0: eafffd7e b 1f10bb0 + 1f115b4: e30031f7 movw r3, #503 ; 0x1f7 + 1f115b8: eafffd7c b 1f10bb0 + 1f115bc: e3a03f7e mov r3, #504 ; 0x1f8 + 1f115c0: eafffd7a b 1f10bb0 + 1f115c4: e30031f9 movw r3, #505 ; 0x1f9 + 1f115c8: eafffd78 b 1f10bb0 + 1f115cc: e30031fe movw r3, #510 ; 0x1fe + 1f115d0: eafffd76 b 1f10bb0 + 1f115d4: e30031ff movw r3, #511 ; 0x1ff + 1f115d8: eafffd74 b 1f10bb0 + 1f115dc: e3a03012 mov r3, #18 + 1f115e0: eafffe32 b 1f10eb0 + 1f115e4: e3a0301f mov r3, #31 + 1f115e8: eafffe30 b 1f10eb0 + 1f115ec: e3a0301b mov r3, #27 + 1f115f0: eafffe2e b 1f10eb0 + 1f115f4: e3a0301c mov r3, #28 + 1f115f8: eafffe2c b 1f10eb0 + 1f115fc: e3a0301d mov r3, #29 + 1f11600: eafffe2a b 1f10eb0 + 1f11604: e3a0301e mov r3, #30 + 1f11608: eafffe28 b 1f10eb0 + 1f1160c: e3a03013 mov r3, #19 + 1f11610: eafffe26 b 1f10eb0 + 1f11614: e3a03014 mov r3, #20 + 1f11618: eafffe24 b 1f10eb0 + 1f1161c: e3a03015 mov r3, #21 + 1f11620: eafffe22 b 1f10eb0 + 1f11624: e3a03016 mov r3, #22 + 1f11628: eafffe20 b 1f10eb0 + 1f1162c: e3a03017 mov r3, #23 + 1f11630: eafffe1e b 1f10eb0 + 1f11634: e3a03018 mov r3, #24 + 1f11638: eafffe1c b 1f10eb0 + 1f1163c: e3a03019 mov r3, #25 + 1f11640: eafffe1a b 1f10eb0 + 1f11644: e3a0301a mov r3, #26 + 1f11648: eafffe18 b 1f10eb0 + +01f1164c : + 1f1164c: e92d40f0 push {r4, r5, r6, r7, lr} + 1f11650: e2514000 subs r4, r1, #0 + 1f11654: ed2d8b10 vpush {d8-d15} + 1f11658: e24dd0f4 sub sp, sp, #244 ; 0xf4 + 1f1165c: e58d0004 str r0, [sp, #4] + 1f11660: 0a000010 beq 1f116a8 + 1f11664: e1d400d0 ldrsb r0, [r4] + 1f11668: e6ef3070 uxtb r3, r0 + 1f1166c: e350003a cmp r0, #58 ; 0x3a + 1f11670: 1353001f cmpne r3, #31 + 1f11674: 9a000054 bls 1f117cc + 1f11678: e1a02004 mov r2, r4 + 1f1167c: e1f230d1 ldrsb r3, [r2, #1]! + 1f11680: e6ef1073 uxtb r1, r3 + 1f11684: e353003a cmp r3, #58 ; 0x3a + 1f11688: 1351001f cmpne r1, #31 + 1f1168c: 8afffffa bhi 1f1167c + 1f11690: e353003a cmp r3, #58 ; 0x3a + 1f11694: 1a000003 bne 1f116a8 + 1f11698: e2843001 add r3, r4, #1 + 1f1169c: e1520003 cmp r2, r3 + 1f116a0: 03500030 cmpeq r0, #48 ; 0x30 + 1f116a4: 02824001 addeq r4, r2, #1 + 1f116a8: e3a02002 mov r2, #2 + 1f116ac: e28d100c add r1, sp, #12 + 1f116b0: e28d0004 add r0, sp, #4 + 1f116b4: ebffd015 bl 1f05710 + 1f116b8: e3500000 cmp r0, #0 + 1f116bc: 0a000002 beq 1f116cc + 1f116c0: e28dd0f4 add sp, sp, #244 ; 0xf4 + 1f116c4: ecbd8b10 vpop {d8-d15} + 1f116c8: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f116cc: e59d300c ldr r3, [sp, #12] + 1f116d0: e28d0050 add r0, sp, #80 ; 0x50 + 1f116d4: e59d1004 ldr r1, [sp, #4] + 1f116d8: e58d3050 str r3, [sp, #80] ; 0x50 + 1f116dc: ebffeba6 bl 1f0c57c + 1f116e0: e3500000 cmp r0, #0 + 1f116e4: 1afffff5 bne 1f116c0 + 1f116e8: e5dd3093 ldrb r3, [sp, #147] ; 0x93 + 1f116ec: e31300a0 tst r3, #160 ; 0xa0 + 1f116f0: 13a00006 movne r0, #6 + 1f116f4: 1afffff1 bne 1f116c0 + 1f116f8: e59d300c ldr r3, [sp, #12] + 1f116fc: e5d32000 ldrb r2, [r3] + 1f11700: e3520004 cmp r2, #4 + 1f11704: 0a000074 beq 1f118dc + 1f11708: eddd0b14 vldr d16, [sp, #80] ; 0x50 + 1f1170c: eddd1b16 vldr d17, [sp, #88] ; 0x58 + 1f11710: e28d50a0 add r5, sp, #160 ; 0xa0 + 1f11714: e1a01004 mov r1, r4 + 1f11718: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f1171c: e1a00005 mov r0, r5 + 1f11720: eddd6b18 vldr d22, [sp, #96] ; 0x60 + 1f11724: eddd7b1a vldr d23, [sp, #104] ; 0x68 + 1f11728: e283200b add r2, r3, #11 + 1f1172c: eddd4b1c vldr d20, [sp, #112] ; 0x70 + 1f11730: eddd5b1e vldr d21, [sp, #120] ; 0x78 + 1f11734: f4628a0f vld1.8 {d24-d25}, [r2] + 1f11738: edcd0b28 vstr d16, [sp, #160] ; 0xa0 + 1f1173c: edcd1b2a vstr d17, [sp, #168] ; 0xa8 + 1f11740: eddd2b20 vldr d18, [sp, #128] ; 0x80 + 1f11744: eddd3b22 vldr d19, [sp, #136] ; 0x88 + 1f11748: eddd0b24 vldr d16, [sp, #144] ; 0x90 + 1f1174c: eddd1b26 vldr d17, [sp, #152] ; 0x98 + 1f11750: e5d3c01b ldrb ip, [r3, #27] + 1f11754: edcd8b04 vstr d24, [sp, #16] + 1f11758: edcd9b06 vstr d25, [sp, #24] + 1f1175c: e5d3201c ldrb r2, [r3, #28] + 1f11760: e5d3701d ldrb r7, [r3, #29] + 1f11764: e5d3601e ldrb r6, [r3, #30] + 1f11768: e5d3401f ldrb r4, [r3, #31] + 1f1176c: edcd6b2c vstr d22, [sp, #176] ; 0xb0 + 1f11770: edcd7b2e vstr d23, [sp, #184] ; 0xb8 + 1f11774: e5cdc020 strb ip, [sp, #32] + 1f11778: edcd4b30 vstr d20, [sp, #192] ; 0xc0 + 1f1177c: edcd5b32 vstr d21, [sp, #200] ; 0xc8 + 1f11780: e5cd2021 strb r2, [sp, #33] ; 0x21 + 1f11784: edcd2b34 vstr d18, [sp, #208] ; 0xd0 + 1f11788: edcd3b36 vstr d19, [sp, #216] ; 0xd8 + 1f1178c: e5cd7022 strb r7, [sp, #34] ; 0x22 + 1f11790: edcd0b38 vstr d16, [sp, #224] ; 0xe0 + 1f11794: edcd1b3a vstr d17, [sp, #232] ; 0xe8 + 1f11798: e5cd6023 strb r6, [sp, #35] ; 0x23 + 1f1179c: e5cd4024 strb r4, [sp, #36] ; 0x24 + 1f117a0: ebffeb75 bl 1f0c57c + 1f117a4: e3500000 cmp r0, #0 + 1f117a8: 1a00000a bne 1f117d8 + 1f117ac: e59d20a8 ldr r2, [sp, #168] ; 0xa8 + 1f117b0: e59d3058 ldr r3, [sp, #88] ; 0x58 + 1f117b4: e1520003 cmp r2, r3 + 1f117b8: 0a0000a4 beq 1f11a50 + 1f117bc: e3a00008 mov r0, #8 + 1f117c0: e28dd0f4 add sp, sp, #244 ; 0xf4 + 1f117c4: ecbd8b10 vpop {d8-d15} + 1f117c8: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f117cc: e1a03000 mov r3, r0 + 1f117d0: e1a02004 mov r2, r4 + 1f117d4: eaffffad b 1f11690 + 1f117d8: e3500004 cmp r0, #4 + 1f117dc: 1affffb7 bne 1f116c0 + 1f117e0: e1a00005 mov r0, r5 + 1f117e4: ebffe638 bl 1f0b0cc + 1f117e8: e3500000 cmp r0, #0 + 1f117ec: 1affffb3 bne 1f116c0 + 1f117f0: e28d3012 add r3, sp, #18 + 1f117f4: e59d20d4 ldr r2, [sp, #212] ; 0xd4 + 1f117f8: e59d000c ldr r0, [sp, #12] + 1f117fc: e3a01001 mov r1, #1 + 1f11800: f4630a0f vld1.8 {d16-d17}, [r3] + 1f11804: e282c00d add ip, r2, #13 + 1f11808: e5dd3010 ldrb r3, [sp, #16] + 1f1180c: e3833020 orr r3, r3, #32 + 1f11810: f44c0a0f vst1.8 {d16-d17}, [ip] + 1f11814: e5c2300b strb r3, [r2, #11] + 1f11818: e5c2701d strb r7, [r2, #29] + 1f1181c: e5c2601e strb r6, [r2, #30] + 1f11820: e5c2401f strb r4, [r2, #31] + 1f11824: e5c01003 strb r1, [r0, #3] + 1f11828: e5d2300b ldrb r3, [r2, #11] + 1f1182c: e3130010 tst r3, #16 + 1f11830: 0a000076 beq 1f11a10 + 1f11834: e59d1058 ldr r1, [sp, #88] ; 0x58 + 1f11838: e59d30a8 ldr r3, [sp, #168] ; 0xa8 + 1f1183c: e1510003 cmp r1, r3 + 1f11840: 0a000072 beq 1f11a10 + 1f11844: e5d03000 ldrb r3, [r0] + 1f11848: e5d2101b ldrb r1, [r2, #27] + 1f1184c: e3530003 cmp r3, #3 + 1f11850: e5d2301a ldrb r3, [r2, #26] + 1f11854: e1833401 orr r3, r3, r1, lsl #8 + 1f11858: 05d21015 ldrbeq r1, [r2, #21] + 1f1185c: 05d22014 ldrbeq r2, [r2, #20] + 1f11860: 01822401 orreq r2, r2, r1, lsl #8 + 1f11864: 01833802 orreq r3, r3, r2, lsl #16 + 1f11868: e590202c ldr r2, [r0, #44] ; 0x2c + 1f1186c: e2433002 sub r3, r3, #2 + 1f11870: e2422002 sub r2, r2, #2 + 1f11874: e1530002 cmp r3, r2 + 1f11878: 2a000079 bcs 1f11a64 + 1f1187c: e1d010ba ldrh r1, [r0, #10] + 1f11880: e5902040 ldr r2, [r0, #64] ; 0x40 + 1f11884: e0312193 mlas r1, r3, r1, r2 + 1f11888: 0a000075 beq 1f11a64 + 1f1188c: ebffcf6d bl 1f05648 + 1f11890: e3500000 cmp r0, #0 + 1f11894: 1affff89 bne 1f116c0 + 1f11898: e59d200c ldr r2, [sp, #12] + 1f1189c: e5d23069 ldrb r3, [r2, #105] ; 0x69 + 1f118a0: e353002e cmp r3, #46 ; 0x2e + 1f118a4: 1a000059 bne 1f11a10 + 1f118a8: e59d30a8 ldr r3, [sp, #168] ; 0xa8 + 1f118ac: e5d21000 ldrb r1, [r2] + 1f118b0: e5c23082 strb r3, [r2, #130] ; 0x82 + 1f118b4: e3510003 cmp r1, #3 + 1f118b8: e1a01443 asr r1, r3, #8 + 1f118bc: 01a03823 lsreq r3, r3, #16 + 1f118c0: e5c21083 strb r1, [r2, #131] ; 0x83 + 1f118c4: 05c2307c strbeq r3, [r2, #124] ; 0x7c + 1f118c8: 01a03443 asreq r3, r3, #8 + 1f118cc: 05c2307d strbeq r3, [r2, #125] ; 0x7d + 1f118d0: e3a03001 mov r3, #1 + 1f118d4: e5c23003 strb r3, [r2, #3] + 1f118d8: ea00004c b 1f11a10 + 1f118dc: eddd0b14 vldr d16, [sp, #80] ; 0x50 + 1f118e0: eddd1b16 vldr d17, [sp, #88] ; 0x58 + 1f118e4: e28d50a0 add r5, sp, #160 ; 0xa0 + 1f118e8: e1a01004 mov r1, r4 + 1f118ec: e5933010 ldr r3, [r3, #16] + 1f118f0: eddd2b18 vldr d18, [sp, #96] ; 0x60 + 1f118f4: eddd3b1a vldr d19, [sp, #104] ; 0x68 + 1f118f8: e2830010 add r0, r3, #16 + 1f118fc: f423ea0f vld1.8 {d14-d15}, [r3] + 1f11900: edcd0b28 vstr d16, [sp, #160] ; 0xa0 + 1f11904: edcd1b2a vstr d17, [sp, #168] ; 0xa8 + 1f11908: eddd0b1c vldr d16, [sp, #112] ; 0x70 + 1f1190c: eddd1b1e vldr d17, [sp, #120] ; 0x78 + 1f11910: e283c020 add ip, r3, #32 + 1f11914: e2832030 add r2, r3, #48 ; 0x30 + 1f11918: f420ca0f vld1.8 {d12-d13}, [r0] + 1f1191c: edcd2b2c vstr d18, [sp, #176] ; 0xb0 + 1f11920: edcd3b2e vstr d19, [sp, #184] ; 0xb8 + 1f11924: f42caa0f vld1.8 {d10-d11}, [ip] + 1f11928: e1a00005 mov r0, r5 + 1f1192c: f4228a0f vld1.8 {d8-d9}, [r2] + 1f11930: ed8deb04 vstr d14, [sp, #16] + 1f11934: ed8dfb06 vstr d15, [sp, #24] + 1f11938: eddd2b20 vldr d18, [sp, #128] ; 0x80 + 1f1193c: eddd3b22 vldr d19, [sp, #136] ; 0x88 + 1f11940: edcd0b30 vstr d16, [sp, #192] ; 0xc0 + 1f11944: edcd1b32 vstr d17, [sp, #200] ; 0xc8 + 1f11948: eddd0b24 vldr d16, [sp, #144] ; 0x90 + 1f1194c: eddd1b26 vldr d17, [sp, #152] ; 0x98 + 1f11950: ed8dcb08 vstr d12, [sp, #32] + 1f11954: ed8ddb0a vstr d13, [sp, #40] ; 0x28 + 1f11958: ed8dab0c vstr d10, [sp, #48] ; 0x30 + 1f1195c: ed8dbb0e vstr d11, [sp, #56] ; 0x38 + 1f11960: ed8d8b10 vstr d8, [sp, #64] ; 0x40 + 1f11964: ed8d9b12 vstr d9, [sp, #72] ; 0x48 + 1f11968: edcd2b34 vstr d18, [sp, #208] ; 0xd0 + 1f1196c: edcd3b36 vstr d19, [sp, #216] ; 0xd8 + 1f11970: edcd0b38 vstr d16, [sp, #224] ; 0xe0 + 1f11974: edcd1b3a vstr d17, [sp, #232] ; 0xe8 + 1f11978: ebffeaff bl 1f0c57c + 1f1197c: e3500000 cmp r0, #0 + 1f11980: 0a000029 beq 1f11a2c + 1f11984: e3500004 cmp r0, #4 + 1f11988: 1affff4c bne 1f116c0 + 1f1198c: e1a00005 mov r0, r5 + 1f11990: ebffe5cd bl 1f0b0cc + 1f11994: e3500000 cmp r0, #0 + 1f11998: 1affff48 bne 1f116c0 + 1f1199c: e59d300c ldr r3, [sp, #12] + 1f119a0: e1a00005 mov r0, r5 + 1f119a4: e5933010 ldr r3, [r3, #16] + 1f119a8: e2832020 add r2, r3, #32 + 1f119ac: e2835010 add r5, r3, #16 + 1f119b0: e2834030 add r4, r3, #48 ; 0x30 + 1f119b4: e5d3c001 ldrb ip, [r3, #1] + 1f119b8: e5d31025 ldrb r1, [r3, #37] ; 0x25 + 1f119bc: f403ea0f vst1.8 {d14-d15}, [r3] + 1f119c0: e5d3e023 ldrb lr, [r3, #35] ; 0x23 + 1f119c4: e5d33024 ldrb r3, [r3, #36] ; 0x24 + 1f119c8: f405ca0f vst1.8 {d12-d13}, [r5] + 1f119cc: f402aa0f vst1.8 {d10-d11}, [r2] + 1f119d0: e59d200c ldr r2, [sp, #12] + 1f119d4: f4048a0f vst1.8 {d8-d9}, [r4] + 1f119d8: e1833401 orr r3, r3, r1, lsl #8 + 1f119dc: e6bf3073 sxth r3, r3 + 1f119e0: e7e71453 ubfx r1, r3, #8, #8 + 1f119e4: e5922010 ldr r2, [r2, #16] + 1f119e8: e5c2c001 strb ip, [r2, #1] + 1f119ec: e59d200c ldr r2, [sp, #12] + 1f119f0: e592c010 ldr ip, [r2, #16] + 1f119f4: e5cce023 strb lr, [ip, #35] ; 0x23 + 1f119f8: e5922010 ldr r2, [r2, #16] + 1f119fc: e5c23024 strb r3, [r2, #36] ; 0x24 + 1f11a00: e5c21025 strb r1, [r2, #37] ; 0x25 + 1f11a04: ebffdd52 bl 1f08f54 + 1f11a08: e3500000 cmp r0, #0 + 1f11a0c: 1affff2b bne 1f116c0 + 1f11a10: e28d0050 add r0, sp, #80 ; 0x50 + 1f11a14: ebffdec2 bl 1f09524 + 1f11a18: e3500000 cmp r0, #0 + 1f11a1c: 1affff27 bne 1f116c0 + 1f11a20: e59d000c ldr r0, [sp, #12] + 1f11a24: ebffd1e4 bl 1f061bc + 1f11a28: eaffff24 b 1f116c0 + 1f11a2c: e59d20a8 ldr r2, [sp, #168] ; 0xa8 + 1f11a30: e59d3058 ldr r3, [sp, #88] ; 0x58 + 1f11a34: e1520003 cmp r2, r3 + 1f11a38: 1affff5f bne 1f117bc + 1f11a3c: e59d20c8 ldr r2, [sp, #200] ; 0xc8 + 1f11a40: e59d3078 ldr r3, [sp, #120] ; 0x78 + 1f11a44: e1520003 cmp r2, r3 + 1f11a48: 1affff5b bne 1f117bc + 1f11a4c: eaffffce b 1f1198c + 1f11a50: e59d20c8 ldr r2, [sp, #200] ; 0xc8 + 1f11a54: e59d3078 ldr r3, [sp, #120] ; 0x78 + 1f11a58: e1520003 cmp r2, r3 + 1f11a5c: 1affff56 bne 1f117bc + 1f11a60: eaffff5e b 1f117e0 + 1f11a64: e3a00002 mov r0, #2 + 1f11a68: eaffff14 b 1f116c0 + +01f11a6c : + 1f11a6c: e92d4030 push {r4, r5, lr} + 1f11a70: e1a04001 mov r4, r1 + 1f11a74: e1a05002 mov r5, r2 + 1f11a78: e24dd064 sub sp, sp, #100 ; 0x64 + 1f11a7c: e3a02002 mov r2, #2 + 1f11a80: e28d100c add r1, sp, #12 + 1f11a84: e58d0004 str r0, [sp, #4] + 1f11a88: e28d0004 add r0, sp, #4 + 1f11a8c: ebffcf1f bl 1f05710 + 1f11a90: e3500000 cmp r0, #0 + 1f11a94: e59d300c ldr r3, [sp, #12] + 1f11a98: e58d3010 str r3, [sp, #16] + 1f11a9c: 0a000001 beq 1f11aa8 + 1f11aa0: e28dd064 add sp, sp, #100 ; 0x64 + 1f11aa4: e8bd8030 pop {r4, r5, pc} + 1f11aa8: e59d1004 ldr r1, [sp, #4] + 1f11aac: e28d0010 add r0, sp, #16 + 1f11ab0: ebffeab1 bl 1f0c57c + 1f11ab4: e3500000 cmp r0, #0 + 1f11ab8: 1afffff8 bne 1f11aa0 + 1f11abc: e5dd3053 ldrb r3, [sp, #83] ; 0x53 + 1f11ac0: e31300a0 tst r3, #160 ; 0xa0 + 1f11ac4: 13a00006 movne r0, #6 + 1f11ac8: 1afffff4 bne 1f11aa0 + 1f11acc: e59d000c ldr r0, [sp, #12] + 1f11ad0: e2055027 and r5, r5, #39 ; 0x27 + 1f11ad4: e5d03000 ldrb r3, [r0] + 1f11ad8: e3530004 cmp r3, #4 + 1f11adc: 0a000009 beq 1f11b08 + 1f11ae0: e59d3044 ldr r3, [sp, #68] ; 0x44 + 1f11ae4: e3a01001 mov r1, #1 + 1f11ae8: e5d3200b ldrb r2, [r3, #11] + 1f11aec: e0244002 eor r4, r4, r2 + 1f11af0: e0055004 and r5, r5, r4 + 1f11af4: e0255002 eor r5, r5, r2 + 1f11af8: e5c3500b strb r5, [r3, #11] + 1f11afc: e5c01003 strb r1, [r0, #3] + 1f11b00: ebffd1ad bl 1f061bc + 1f11b04: eaffffe5 b 1f11aa0 + 1f11b08: e5903010 ldr r3, [r0, #16] + 1f11b0c: e28d0010 add r0, sp, #16 + 1f11b10: e5d32004 ldrb r2, [r3, #4] + 1f11b14: e0244002 eor r4, r4, r2 + 1f11b18: e0055004 and r5, r5, r4 + 1f11b1c: e0255002 eor r5, r5, r2 + 1f11b20: e5c35004 strb r5, [r3, #4] + 1f11b24: ebffdd0a bl 1f08f54 + 1f11b28: e3500000 cmp r0, #0 + 1f11b2c: 059d000c ldreq r0, [sp, #12] + 1f11b30: 1affffda bne 1f11aa0 + 1f11b34: eafffff1 b 1f11b00 + +01f11b38 : + 1f11b38: e92d4010 push {r4, lr} + 1f11b3c: e3a02002 mov r2, #2 + 1f11b40: e1a04001 mov r4, r1 + 1f11b44: e24dd060 sub sp, sp, #96 ; 0x60 + 1f11b48: e28d100c add r1, sp, #12 + 1f11b4c: e58d0004 str r0, [sp, #4] + 1f11b50: e28d0004 add r0, sp, #4 + 1f11b54: ebffceed bl 1f05710 + 1f11b58: e3500000 cmp r0, #0 + 1f11b5c: e59d300c ldr r3, [sp, #12] + 1f11b60: e58d3010 str r3, [sp, #16] + 1f11b64: 0a000001 beq 1f11b70 + 1f11b68: e28dd060 add sp, sp, #96 ; 0x60 + 1f11b6c: e8bd8010 pop {r4, pc} + 1f11b70: e59d1004 ldr r1, [sp, #4] + 1f11b74: e28d0010 add r0, sp, #16 + 1f11b78: ebffea7f bl 1f0c57c + 1f11b7c: e3500000 cmp r0, #0 + 1f11b80: 1afffff8 bne 1f11b68 + 1f11b84: e5dd3053 ldrb r3, [sp, #83] ; 0x53 + 1f11b88: e31300a0 tst r3, #160 ; 0xa0 + 1f11b8c: 13a00006 movne r0, #6 + 1f11b90: 1afffff4 bne 1f11b68 + 1f11b94: e59d100c ldr r1, [sp, #12] + 1f11b98: e5d13000 ldrb r3, [r1] + 1f11b9c: e3530004 cmp r3, #4 + 1f11ba0: 0a00000f beq 1f11be4 + 1f11ba4: e1d4c0b8 ldrh ip, [r4, #8] + 1f11ba8: e3a00001 mov r0, #1 + 1f11bac: e1d430ba ldrh r3, [r4, #10] + 1f11bb0: e59d2044 ldr r2, [sp, #68] ; 0x44 + 1f11bb4: e183380c orr r3, r3, ip, lsl #16 + 1f11bb8: e1a0c423 lsr ip, r3, #8 + 1f11bbc: e5c23016 strb r3, [r2, #22] + 1f11bc0: e5c2c017 strb ip, [r2, #23] + 1f11bc4: e1a0c823 lsr ip, r3, #16 + 1f11bc8: e1a03c23 lsr r3, r3, #24 + 1f11bcc: e5c2c018 strb ip, [r2, #24] + 1f11bd0: e5c23019 strb r3, [r2, #25] + 1f11bd4: e5c10003 strb r0, [r1, #3] + 1f11bd8: e1a00001 mov r0, r1 + 1f11bdc: ebffd176 bl 1f061bc + 1f11be0: eaffffe0 b 1f11b68 + 1f11be4: e1d4c0b8 ldrh ip, [r4, #8] + 1f11be8: e28d0010 add r0, sp, #16 + 1f11bec: e1d430ba ldrh r3, [r4, #10] + 1f11bf0: e5912010 ldr r2, [r1, #16] + 1f11bf4: e183380c orr r3, r3, ip, lsl #16 + 1f11bf8: e1a01823 lsr r1, r3, #16 + 1f11bfc: e1a0c423 lsr ip, r3, #8 + 1f11c00: e5c2300c strb r3, [r2, #12] + 1f11c04: e1a03c23 lsr r3, r3, #24 + 1f11c08: e5c2100e strb r1, [r2, #14] + 1f11c0c: e5c2c00d strb ip, [r2, #13] + 1f11c10: e5c2300f strb r3, [r2, #15] + 1f11c14: ebffdcce bl 1f08f54 + 1f11c18: e3500000 cmp r0, #0 + 1f11c1c: 059d100c ldreq r1, [sp, #12] + 1f11c20: 1affffd0 bne 1f11b68 + 1f11c24: eaffffeb b 1f11bd8 + +01f11c28 : + 1f11c28: e12fff1e bx lr + +01f11c2c : + 1f11c2c: e12fff1e bx lr + +01f11c30 : + 1f11c30: f57ff06f isb sy + 1f11c34: f57ff05f dmb sy + 1f11c38: e3a03a0b mov r3, #45056 ; 0xb000 + 1f11c3c: e3433f00 movt r3, #16128 ; 0x3f00 + 1f11c40: e3e02000 mvn r2, #0 + 1f11c44: e3a01000 mov r1, #0 + 1f11c48: e583120c str r1, [r3, #524] ; 0x20c + 1f11c4c: e583221c str r2, [r3, #540] ; 0x21c + 1f11c50: e5832220 str r2, [r3, #544] ; 0x220 + 1f11c54: e5832224 str r2, [r3, #548] ; 0x224 + 1f11c58: e5932200 ldr r2, [r3, #512] ; 0x200 + 1f11c5c: e5832200 str r2, [r3, #512] ; 0x200 + 1f11c60: e5932204 ldr r2, [r3, #516] ; 0x204 + 1f11c64: e5832204 str r2, [r3, #516] ; 0x204 + 1f11c68: e5932208 ldr r2, [r3, #520] ; 0x208 + 1f11c6c: e5832208 str r2, [r3, #520] ; 0x208 + 1f11c70: f57ff05f dmb sy + 1f11c74: f1080080 cpsie i + 1f11c78: e12fff1e bx lr + +01f11c7c : + 1f11c7c: e302c178 movw ip, #8568 ; 0x2178 + 1f11c80: e340c1fb movt ip, #507 ; 0x1fb + 1f11c84: e3023058 movw r3, #8280 ; 0x2058 + 1f11c88: e34031fb movt r3, #507 ; 0x1fb + 1f11c8c: e78c1100 str r1, [ip, r0, lsl #2] + 1f11c90: e7832100 str r2, [r3, r0, lsl #2] + 1f11c94: f57ff05f dmb sy + 1f11c98: e350001f cmp r0, #31 + 1f11c9c: 930b3210 movwls r3, #45584 ; 0xb210 + 1f11ca0: 93433f00 movtls r3, #16128 ; 0x3f00 + 1f11ca4: 9a000005 bls 1f11cc0 + 1f11ca8: e30b2214 movw r2, #45588 ; 0xb214 + 1f11cac: e3432f00 movt r2, #16128 ; 0x3f00 + 1f11cb0: e350003f cmp r0, #63 ; 0x3f + 1f11cb4: e30b3218 movw r3, #45592 ; 0xb218 + 1f11cb8: e3433f00 movt r3, #16128 ; 0x3f00 + 1f11cbc: 91a03002 movls r3, r2 + 1f11cc0: e3a02001 mov r2, #1 + 1f11cc4: e200001f and r0, r0, #31 + 1f11cc8: e1a00012 lsl r0, r2, r0 + 1f11ccc: e5830000 str r0, [r3] + 1f11cd0: f57ff05f dmb sy + 1f11cd4: e12fff1e bx lr + +01f11cd8 : + 1f11cd8: f57ff05f dmb sy + 1f11cdc: e350001f cmp r0, #31 + 1f11ce0: 930b321c movwls r3, #45596 ; 0xb21c + 1f11ce4: 93433f00 movtls r3, #16128 ; 0x3f00 + 1f11ce8: 9a000005 bls 1f11d04 + 1f11cec: e30b2220 movw r2, #45600 ; 0xb220 + 1f11cf0: e3432f00 movt r2, #16128 ; 0x3f00 + 1f11cf4: e350003f cmp r0, #63 ; 0x3f + 1f11cf8: e30b3224 movw r3, #45604 ; 0xb224 + 1f11cfc: e3433f00 movt r3, #16128 ; 0x3f00 + 1f11d00: 91a03002 movls r3, r2 + 1f11d04: e200101f and r1, r0, #31 + 1f11d08: e3a02001 mov r2, #1 + 1f11d0c: e1a02112 lsl r2, r2, r1 + 1f11d10: e5832000 str r2, [r3] + 1f11d14: f57ff05f dmb sy + 1f11d18: e3022178 movw r2, #8568 ; 0x2178 + 1f11d1c: e34021fb movt r2, #507 ; 0x1fb + 1f11d20: e3023058 movw r3, #8280 ; 0x2058 + 1f11d24: e34031fb movt r3, #507 ; 0x1fb + 1f11d28: e3a01000 mov r1, #0 + 1f11d2c: e7821100 str r1, [r2, r0, lsl #2] + 1f11d30: e7831100 str r1, [r3, r0, lsl #2] + 1f11d34: e12fff1e bx lr + +01f11d38 : + 1f11d38: f57ff05f dmb sy + 1f11d3c: e350001f cmp r0, #31 + 1f11d40: 930b3210 movwls r3, #45584 ; 0xb210 + 1f11d44: 93433f00 movtls r3, #16128 ; 0x3f00 + 1f11d48: 9a000005 bls 1f11d64 + 1f11d4c: e30b2214 movw r2, #45588 ; 0xb214 + 1f11d50: e3432f00 movt r2, #16128 ; 0x3f00 + 1f11d54: e350003f cmp r0, #63 ; 0x3f + 1f11d58: e30b3218 movw r3, #45592 ; 0xb218 + 1f11d5c: e3433f00 movt r3, #16128 ; 0x3f00 + 1f11d60: 91a03002 movls r3, r2 + 1f11d64: e3a02001 mov r2, #1 + 1f11d68: e200001f and r0, r0, #31 + 1f11d6c: e1a00012 lsl r0, r2, r0 + 1f11d70: e5830000 str r0, [r3] + 1f11d74: f57ff05f dmb sy + 1f11d78: e12fff1e bx lr + +01f11d7c : + 1f11d7c: f57ff05f dmb sy + 1f11d80: e350001f cmp r0, #31 + 1f11d84: 930b321c movwls r3, #45596 ; 0xb21c + 1f11d88: 93433f00 movtls r3, #16128 ; 0x3f00 + 1f11d8c: 9a000005 bls 1f11da8 + 1f11d90: e30b2220 movw r2, #45600 ; 0xb220 + 1f11d94: e3432f00 movt r2, #16128 ; 0x3f00 + 1f11d98: e350003f cmp r0, #63 ; 0x3f + 1f11d9c: e30b3224 movw r3, #45604 ; 0xb224 + 1f11da0: e3433f00 movt r3, #16128 ; 0x3f00 + 1f11da4: 91a03002 movls r3, r2 + 1f11da8: e3a02001 mov r2, #1 + 1f11dac: e200001f and r0, r0, #31 + 1f11db0: e1a00012 lsl r0, r2, r0 + 1f11db4: e5830000 str r0, [r3] + 1f11db8: f57ff05f dmb sy + 1f11dbc: e12fff1e bx lr + +01f11dc0 : + 1f11dc0: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f11dc4: f57ff05f dmb sy + 1f11dc8: e3a03a0b mov r3, #45056 ; 0xb000 + 1f11dcc: e3433f00 movt r3, #16128 ; 0x3f00 + 1f11dd0: e3026178 movw r6, #8568 ; 0x2178 + 1f11dd4: e34061fb movt r6, #507 ; 0x1fb + 1f11dd8: e3027058 movw r7, #8280 ; 0x2058 + 1f11ddc: e34071fb movt r7, #507 ; 0x1fb + 1f11de0: e1a08003 mov r8, r3 + 1f11de4: e5935204 ldr r5, [r3, #516] ; 0x204 + 1f11de8: e3a04000 mov r4, #0 + 1f11dec: ea000004 b 1f11e04 + 1f11df0: e7970104 ldr r0, [r7, r4, lsl #2] + 1f11df4: e12fff32 blx r2 + 1f11df8: e2844001 add r4, r4, #1 + 1f11dfc: e3540020 cmp r4, #32 + 1f11e00: 0a00000c beq 1f11e38 + 1f11e04: e3a03001 mov r3, #1 + 1f11e08: e1a03413 lsl r3, r3, r4 + 1f11e0c: e1130005 tst r3, r5 + 1f11e10: 0afffff8 beq 1f11df8 + 1f11e14: e7962104 ldr r2, [r6, r4, lsl #2] + 1f11e18: e3520000 cmp r2, #0 + 1f11e1c: 1afffff3 bne 1f11df0 + 1f11e20: f57ff05f dmb sy + 1f11e24: e588321c str r3, [r8, #540] ; 0x21c + 1f11e28: f57ff05f dmb sy + 1f11e2c: e2844001 add r4, r4, #1 + 1f11e30: e3540020 cmp r4, #32 + 1f11e34: 1afffff2 bne 1f11e04 + 1f11e38: e3a03a0b mov r3, #45056 ; 0xb000 + 1f11e3c: e3433f00 movt r3, #16128 ; 0x3f00 + 1f11e40: e3028178 movw r8, #8568 ; 0x2178 + 1f11e44: e34081fb movt r8, #507 ; 0x1fb + 1f11e48: e3026058 movw r6, #8280 ; 0x2058 + 1f11e4c: e34061fb movt r6, #507 ; 0x1fb + 1f11e50: e1a07003 mov r7, r3 + 1f11e54: e5935208 ldr r5, [r3, #520] ; 0x208 + 1f11e58: ea000004 b 1f11e70 + 1f11e5c: e7960104 ldr r0, [r6, r4, lsl #2] + 1f11e60: e12fff32 blx r2 + 1f11e64: e2844001 add r4, r4, #1 + 1f11e68: e3540040 cmp r4, #64 ; 0x40 + 1f11e6c: 0a00000d beq 1f11ea8 + 1f11e70: e204201f and r2, r4, #31 + 1f11e74: e3a03001 mov r3, #1 + 1f11e78: e1a03213 lsl r3, r3, r2 + 1f11e7c: e1130005 tst r3, r5 + 1f11e80: 0afffff7 beq 1f11e64 + 1f11e84: e7982104 ldr r2, [r8, r4, lsl #2] + 1f11e88: e3520000 cmp r2, #0 + 1f11e8c: 1afffff2 bne 1f11e5c + 1f11e90: f57ff05f dmb sy + 1f11e94: e5873220 str r3, [r7, #544] ; 0x220 + 1f11e98: f57ff05f dmb sy + 1f11e9c: e2844001 add r4, r4, #1 + 1f11ea0: e3540040 cmp r4, #64 ; 0x40 + 1f11ea4: 1afffff1 bne 1f11e70 + 1f11ea8: e3a03a0b mov r3, #45056 ; 0xb000 + 1f11eac: e3433f00 movt r3, #16128 ; 0x3f00 + 1f11eb0: e3028178 movw r8, #8568 ; 0x2178 + 1f11eb4: e34081fb movt r8, #507 ; 0x1fb + 1f11eb8: e3026058 movw r6, #8280 ; 0x2058 + 1f11ebc: e34061fb movt r6, #507 ; 0x1fb + 1f11ec0: e1a07003 mov r7, r3 + 1f11ec4: e5935200 ldr r5, [r3, #512] ; 0x200 + 1f11ec8: ea000004 b 1f11ee0 + 1f11ecc: e7960104 ldr r0, [r6, r4, lsl #2] + 1f11ed0: e12fff32 blx r2 + 1f11ed4: e2844001 add r4, r4, #1 + 1f11ed8: e3540048 cmp r4, #72 ; 0x48 + 1f11edc: 0a00000d beq 1f11f18 + 1f11ee0: e204201f and r2, r4, #31 + 1f11ee4: e3a03001 mov r3, #1 + 1f11ee8: e1a03213 lsl r3, r3, r2 + 1f11eec: e1130005 tst r3, r5 + 1f11ef0: 0afffff7 beq 1f11ed4 + 1f11ef4: e7982104 ldr r2, [r8, r4, lsl #2] + 1f11ef8: e3520000 cmp r2, #0 + 1f11efc: 1afffff2 bne 1f11ecc + 1f11f00: f57ff05f dmb sy + 1f11f04: e5873224 str r3, [r7, #548] ; 0x224 + 1f11f08: f57ff05f dmb sy + 1f11f0c: e2844001 add r4, r4, #1 + 1f11f10: e3540048 cmp r4, #72 ; 0x48 + 1f11f14: 1afffff1 bne 1f11ee0 + 1f11f18: f57ff05f dmb sy + 1f11f1c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f11f20 ::~Singleton()>: + 1f11f20: e12fff1e bx lr + +01f11f24 : + 1f11f24: e12fff1e bx lr + +01f11f28 : + 1f11f28: e92d4010 push {r4, lr} + 1f11f2c: e1a04000 mov r4, r0 + 1f11f30: ebffb9d5 bl 1f0068c + 1f11f34: e1a00004 mov r0, r4 + 1f11f38: e8bd8010 pop {r4, pc} + +01f11f3c ::~Singleton()>: + 1f11f3c: e92d4010 push {r4, lr} + 1f11f40: e1a04000 mov r4, r0 + 1f11f44: ebffb9d0 bl 1f0068c + 1f11f48: e1a00004 mov r0, r4 + 1f11f4c: e8bd8010 pop {r4, pc} + +01f11f50 : + 1f11f50: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f11f54: e3085010 movw r5, #32784 ; 0x8010 + 1f11f58: e34051f6 movt r5, #502 ; 0x1f6 + 1f11f5c: e1a08002 mov r8, r2 + 1f11f60: e5954000 ldr r4, [r5] + 1f11f64: e3540000 cmp r4, #0 + 1f11f68: 0a000038 beq 1f12050 + 1f11f6c: e3a06000 mov r6, #0 + 1f11f70: e2847028 add r7, r4, #40 ; 0x28 + 1f11f74: e1a05006 mov r5, r6 + 1f11f78: e1a0e006 mov lr, r6 + 1f11f7c: e2866001 add r6, r6, #1 + 1f11f80: e1a02007 mov r2, r7 + 1f11f84: e3a03000 mov r3, #0 + 1f11f88: e084c186 add ip, r4, r6, lsl #3 + 1f11f8c: e1cc00d0 ldrd r0, [ip] + 1f11f90: e2639020 rsb r9, r3, #32 + 1f11f94: e243a020 sub sl, r3, #32 + 1f11f98: e1a00330 lsr r0, r0, r3 + 1f11f9c: e1800911 orr r0, r0, r1, lsl r9 + 1f11fa0: e1800a31 orr r0, r0, r1, lsr sl + 1f11fa4: e3a01000 mov r1, #0 + 1f11fa8: e2000001 and r0, r0, #1 + 1f11fac: e1901001 orrs r1, r0, r1 + 1f11fb0: 0582e000 streq lr, [r2] + 1f11fb4: 0a000007 beq 1f11fd8 + 1f11fb8: e5921000 ldr r1, [r2] + 1f11fbc: e3a05001 mov r5, #1 + 1f11fc0: e0811005 add r1, r1, r5 + 1f11fc4: e5821000 str r1, [r2] + 1f11fc8: e3510003 cmp r1, #3 + 1f11fcc: 85941228 ldrhi r1, [r4, #552] ; 0x228 + 1f11fd0: 80811005 addhi r1, r1, r5 + 1f11fd4: 85841228 strhi r1, [r4, #552] ; 0x228 + 1f11fd8: e2833001 add r3, r3, #1 + 1f11fdc: e2822004 add r2, r2, #4 + 1f11fe0: e3530040 cmp r3, #64 ; 0x40 + 1f11fe4: 1affffe8 bne 1f11f8c + 1f11fe8: e3560002 cmp r6, #2 + 1f11fec: e2877c01 add r7, r7, #256 ; 0x100 + 1f11ff0: 1affffe1 bne 1f11f7c + 1f11ff4: e1c420d8 ldrd r2, [r4, #8] + 1f11ff8: e5940224 ldr r0, [r4, #548] ; 0x224 + 1f11ffc: e1c421f8 strd r2, [r4, #24] + 1f12000: e3500000 cmp r0, #0 + 1f12004: e1c421d0 ldrd r2, [r4, #16] + 1f12008: e1c422f0 strd r2, [r4, #32] + 1f1200c: 1a000009 bne 1f12038 + 1f12010: e3550000 cmp r5, #0 + 1f12014: 08bd87f0 popeq {r4, r5, r6, r7, r8, r9, sl, pc} + 1f12018: e1a03008 mov r3, r8 + 1f1201c: e3011f50 movw r1, #8016 ; 0x1f50 + 1f12020: e34011f1 movt r1, #497 ; 0x1f1 + 1f12024: e3a02000 mov r2, #0 + 1f12028: e3a00008 mov r0, #8 + 1f1202c: eb009f66 bl 1f39dcc + 1f12030: e5840224 str r0, [r4, #548] ; 0x224 + 1f12034: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f12038: eb009f81 bl 1f39e44 + 1f1203c: e3550000 cmp r5, #0 + 1f12040: e3a03000 mov r3, #0 + 1f12044: e5843224 str r3, [r4, #548] ; 0x224 + 1f12048: 08bd87f0 popeq {r4, r5, r6, r7, r8, r9, sl, pc} + 1f1204c: eafffff1 b 1f12018 + 1f12050: e3a00e23 mov r0, #560 ; 0x230 + 1f12054: ebffb98b bl 1f00688 + 1f12058: f2c00010 vmov.i32 d16, #0 ; 0x00000000 + 1f1205c: e1a06000 mov r6, r0 + 1f12060: e1a01004 mov r1, r4 + 1f12064: e3e03000 mvn r3, #0 + 1f12068: e3a02f7f mov r2, #508 ; 0x1fc + 1f1206c: e30fc048 movw ip, #61512 ; 0xf048 + 1f12070: e340c1f5 movt ip, #501 ; 0x1f5 + 1f12074: e5864228 str r4, [r6, #552] ; 0x228 + 1f12078: e2800028 add r0, r0, #40 ; 0x28 + 1f1207c: edc60b02 vstr d16, [r6, #8] + 1f12080: e5c64004 strb r4, [r6, #4] + 1f12084: e5864224 str r4, [r6, #548] ; 0x224 + 1f12088: e1a04006 mov r4, r6 + 1f1208c: e586c000 str ip, [r6] + 1f12090: edc60b04 vstr d16, [r6, #16] + 1f12094: e586322c str r3, [r6, #556] ; 0x22c + 1f12098: eb00b3df bl 1f3f01c + 1f1209c: e30200b0 movw r0, #8368 ; 0x20b0 + 1f120a0: e34001f1 movt r0, #497 ; 0x1f1 + 1f120a4: eb00e8ba bl 1f4c394 + 1f120a8: e5856000 str r6, [r5] + 1f120ac: eaffffae b 1f11f6c + +01f120b0 : + 1f120b0: e92d4ff8 push {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f120b4: e3086010 movw r6, #32784 ; 0x8010 + 1f120b8: e34061f6 movt r6, #502 ; 0x1f6 + 1f120bc: e1a07000 mov r7, r0 + 1f120c0: e1a08001 mov r8, r1 + 1f120c4: e1a05002 mov r5, r2 + 1f120c8: e5964000 ldr r4, [r6] + 1f120cc: e3540000 cmp r4, #0 + 1f120d0: 0a0000b7 beq 1f123b4 + 1f120d4: e1c420d8 ldrd r2, [r4, #8] + 1f120d8: f2c00010 vmov.i32 d16, #0 ; 0x00000000 + 1f120dc: e1c421f8 strd r2, [r4, #24] + 1f120e0: e5c48004 strb r8, [r4, #4] + 1f120e4: e1c421d0 ldrd r2, [r4, #16] + 1f120e8: e1c422f0 strd r2, [r4, #32] + 1f120ec: edc40b02 vstr d16, [r4, #8] + 1f120f0: edc40b04 vstr d16, [r4, #16] + 1f120f4: e5d53000 ldrb r3, [r5] + 1f120f8: e3530003 cmp r3, #3 + 1f120fc: 93a06000 movls r6, #0 + 1f12100: 9a000012 bls 1f12150 + 1f12104: e203103f and r1, r3, #63 ; 0x3f + 1f12108: e353003f cmp r3, #63 ; 0x3f + 1f1210c: eddf0bc1 vldr d16, [pc, #772] ; 1f12418 + 1f12110: 93a02000 movls r2, #0 + 1f12114: ee011b90 vmov.32 d17[0], r1 + 1f12118: 83a02001 movhi r2, #1 + 1f1211c: e0842182 add r2, r4, r2, lsl #3 + 1f12120: f37104a0 vshl.u64 d16, d16, d17 + 1f12124: e1c281d8 ldrd r8, [r2, #24] + 1f12128: ec5bab30 vmov sl, fp, d16 + 1f1212c: e008800a and r8, r8, sl + 1f12130: e009900b and r9, r9, fp + 1f12134: e1981009 orrs r1, r8, r9 + 1f12138: 0a000092 beq 1f12388 + 1f1213c: e1c200d8 ldrd r0, [r2, #8] + 1f12140: e3a06001 mov r6, #1 + 1f12144: e180000a orr r0, r0, sl + 1f12148: e181100b orr r1, r1, fp + 1f1214c: e1c200f8 strd r0, [r2, #8] + 1f12150: e5d53001 ldrb r3, [r5, #1] + 1f12154: e3530003 cmp r3, #3 + 1f12158: 9a000012 bls 1f121a8 + 1f1215c: e203103f and r1, r3, #63 ; 0x3f + 1f12160: e353003f cmp r3, #63 ; 0x3f + 1f12164: eddf0bab vldr d16, [pc, #684] ; 1f12418 + 1f12168: 93a02000 movls r2, #0 + 1f1216c: ee011b90 vmov.32 d17[0], r1 + 1f12170: 83a02001 movhi r2, #1 + 1f12174: e0842182 add r2, r4, r2, lsl #3 + 1f12178: f37104a0 vshl.u64 d16, d16, d17 + 1f1217c: e1c281d8 ldrd r8, [r2, #24] + 1f12180: ec5bab30 vmov sl, fp, d16 + 1f12184: e008800a and r8, r8, sl + 1f12188: e009900b and r9, r9, fp + 1f1218c: e1981009 orrs r1, r8, r9 + 1f12190: 0a000078 beq 1f12378 + 1f12194: e1c200d8 ldrd r0, [r2, #8] + 1f12198: e3a06001 mov r6, #1 + 1f1219c: e180000a orr r0, r0, sl + 1f121a0: e181100b orr r1, r1, fp + 1f121a4: e1c200f8 strd r0, [r2, #8] + 1f121a8: e5d53002 ldrb r3, [r5, #2] + 1f121ac: e3530003 cmp r3, #3 + 1f121b0: 9a000012 bls 1f12200 + 1f121b4: e203103f and r1, r3, #63 ; 0x3f + 1f121b8: e353003f cmp r3, #63 ; 0x3f + 1f121bc: eddf0b95 vldr d16, [pc, #596] ; 1f12418 + 1f121c0: 93a02000 movls r2, #0 + 1f121c4: ee011b90 vmov.32 d17[0], r1 + 1f121c8: 83a02001 movhi r2, #1 + 1f121cc: e0842182 add r2, r4, r2, lsl #3 + 1f121d0: f37104a0 vshl.u64 d16, d16, d17 + 1f121d4: e1c281d8 ldrd r8, [r2, #24] + 1f121d8: ec5bab30 vmov sl, fp, d16 + 1f121dc: e008800a and r8, r8, sl + 1f121e0: e009900b and r9, r9, fp + 1f121e4: e1981009 orrs r1, r8, r9 + 1f121e8: 0a00005e beq 1f12368 + 1f121ec: e1c200d8 ldrd r0, [r2, #8] + 1f121f0: e3a06001 mov r6, #1 + 1f121f4: e180000a orr r0, r0, sl + 1f121f8: e181100b orr r1, r1, fp + 1f121fc: e1c200f8 strd r0, [r2, #8] + 1f12200: e5d52003 ldrb r2, [r5, #3] + 1f12204: e3520003 cmp r2, #3 + 1f12208: 9a000012 bls 1f12258 + 1f1220c: e202103f and r1, r2, #63 ; 0x3f + 1f12210: e352003f cmp r2, #63 ; 0x3f + 1f12214: eddf0b7f vldr d16, [pc, #508] ; 1f12418 + 1f12218: 93a03000 movls r3, #0 + 1f1221c: ee011b90 vmov.32 d17[0], r1 + 1f12220: 83a03001 movhi r3, #1 + 1f12224: e0843183 add r3, r4, r3, lsl #3 + 1f12228: f37104a0 vshl.u64 d16, d16, d17 + 1f1222c: e1c381d8 ldrd r8, [r3, #24] + 1f12230: ec5bab30 vmov sl, fp, d16 + 1f12234: e008800a and r8, r8, sl + 1f12238: e009900b and r9, r9, fp + 1f1223c: e1981009 orrs r1, r8, r9 + 1f12240: 0a000044 beq 1f12358 + 1f12244: e1c300d8 ldrd r0, [r3, #8] + 1f12248: e3a06001 mov r6, #1 + 1f1224c: e180000a orr r0, r0, sl + 1f12250: e181100b orr r1, r1, fp + 1f12254: e1c300f8 strd r0, [r3, #8] + 1f12258: e5d52004 ldrb r2, [r5, #4] + 1f1225c: e3520003 cmp r2, #3 + 1f12260: 9a000012 bls 1f122b0 + 1f12264: e202103f and r1, r2, #63 ; 0x3f + 1f12268: e352003f cmp r2, #63 ; 0x3f + 1f1226c: eddf0b69 vldr d16, [pc, #420] ; 1f12418 + 1f12270: 93a03000 movls r3, #0 + 1f12274: ee011b90 vmov.32 d17[0], r1 + 1f12278: 83a03001 movhi r3, #1 + 1f1227c: e0843183 add r3, r4, r3, lsl #3 + 1f12280: f37104a0 vshl.u64 d16, d16, d17 + 1f12284: e1c381d8 ldrd r8, [r3, #24] + 1f12288: ec5bab30 vmov sl, fp, d16 + 1f1228c: e008800a and r8, r8, sl + 1f12290: e009900b and r9, r9, fp + 1f12294: e1981009 orrs r1, r8, r9 + 1f12298: 0a00002a beq 1f12348 + 1f1229c: e1c300d8 ldrd r0, [r3, #8] + 1f122a0: e3a06001 mov r6, #1 + 1f122a4: e180000a orr r0, r0, sl + 1f122a8: e181100b orr r1, r1, fp + 1f122ac: e1c300f8 strd r0, [r3, #8] + 1f122b0: e5d52005 ldrb r2, [r5, #5] + 1f122b4: e3520003 cmp r2, #3 + 1f122b8: 9a00001a bls 1f12328 + 1f122bc: e202c03f and ip, r2, #63 ; 0x3f + 1f122c0: e352003f cmp r2, #63 ; 0x3f + 1f122c4: eddf0b53 vldr d16, [pc, #332] ; 1f12418 + 1f122c8: 93a03000 movls r3, #0 + 1f122cc: ee01cb90 vmov.32 d17[0], ip + 1f122d0: 83a03001 movhi r3, #1 + 1f122d4: e0843183 add r3, r4, r3, lsl #3 + 1f122d8: f37104a0 vshl.u64 d16, d16, d17 + 1f122dc: e1c381d8 ldrd r8, [r3, #24] + 1f122e0: ec510b30 vmov r0, r1, d16 + 1f122e4: e0088000 and r8, r8, r0 + 1f122e8: e0099001 and r9, r9, r1 + 1f122ec: e198c009 orrs ip, r8, r9 + 1f122f0: 0282200a addeq r2, r2, #10 + 1f122f4: 03a0c000 moveq ip, #0 + 1f122f8: 0784c102 streq ip, [r4, r2, lsl #2] + 1f122fc: e1c380d8 ldrd r8, [r3, #8] + 1f12300: e1800008 orr r0, r0, r8 + 1f12304: e1811009 orr r1, r1, r9 + 1f12308: e1c300f8 strd r0, [r3, #8] + 1f1230c: e5942224 ldr r2, [r4, #548] ; 0x224 + 1f12310: e3520000 cmp r2, #0 + 1f12314: 0a00001f beq 1f12398 + 1f12318: e5943228 ldr r3, [r4, #552] ; 0x228 + 1f1231c: e2833001 add r3, r3, #1 + 1f12320: e5843228 str r3, [r4, #552] ; 0x228 + 1f12324: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f12328: e3560000 cmp r6, #0 + 1f1232c: 1afffff6 bne 1f1230c + 1f12330: e5940224 ldr r0, [r4, #548] ; 0x224 + 1f12334: e3500000 cmp r0, #0 + 1f12338: 0afffff6 beq 1f12318 + 1f1233c: eb009ec0 bl 1f39e44 + 1f12340: e5846224 str r6, [r4, #548] ; 0x224 + 1f12344: eafffff3 b 1f12318 + 1f12348: e282200a add r2, r2, #10 + 1f1234c: e3a01000 mov r1, #0 + 1f12350: e7841102 str r1, [r4, r2, lsl #2] + 1f12354: eaffffd0 b 1f1229c + 1f12358: e282200a add r2, r2, #10 + 1f1235c: e3a01000 mov r1, #0 + 1f12360: e7841102 str r1, [r4, r2, lsl #2] + 1f12364: eaffffb6 b 1f12244 + 1f12368: e283300a add r3, r3, #10 + 1f1236c: e3a01000 mov r1, #0 + 1f12370: e7841103 str r1, [r4, r3, lsl #2] + 1f12374: eaffff9c b 1f121ec + 1f12378: e283300a add r3, r3, #10 + 1f1237c: e3a01000 mov r1, #0 + 1f12380: e7841103 str r1, [r4, r3, lsl #2] + 1f12384: eaffff82 b 1f12194 + 1f12388: e283300a add r3, r3, #10 + 1f1238c: e3a01000 mov r1, #0 + 1f12390: e7841103 str r1, [r4, r3, lsl #2] + 1f12394: eaffff68 b 1f1213c + 1f12398: e1a03007 mov r3, r7 + 1f1239c: e3011f50 movw r1, #8016 ; 0x1f50 + 1f123a0: e34011f1 movt r1, #497 ; 0x1f1 + 1f123a4: e3a00008 mov r0, #8 + 1f123a8: eb009e87 bl 1f39dcc + 1f123ac: e5840224 str r0, [r4, #548] ; 0x224 + 1f123b0: eaffffd8 b 1f12318 + 1f123b4: e3a00e23 mov r0, #560 ; 0x230 + 1f123b8: ebffb8b2 bl 1f00688 + 1f123bc: f2c00010 vmov.i32 d16, #0 ; 0x00000000 + 1f123c0: e1a09000 mov r9, r0 + 1f123c4: e1a01004 mov r1, r4 + 1f123c8: e3a02f7f mov r2, #508 ; 0x1fc + 1f123cc: e30f3048 movw r3, #61512 ; 0xf048 + 1f123d0: e34031f5 movt r3, #501 ; 0x1f5 + 1f123d4: e5894228 str r4, [r9, #552] ; 0x228 + 1f123d8: e2800028 add r0, r0, #40 ; 0x28 + 1f123dc: edc90b02 vstr d16, [r9, #8] + 1f123e0: e5c94004 strb r4, [r9, #4] + 1f123e4: e5894224 str r4, [r9, #548] ; 0x224 + 1f123e8: e1a04009 mov r4, r9 + 1f123ec: edc90b04 vstr d16, [r9, #16] + 1f123f0: e5893000 str r3, [r9] + 1f123f4: e3e03000 mvn r3, #0 + 1f123f8: e589322c str r3, [r9, #556] ; 0x22c + 1f123fc: eb00b306 bl 1f3f01c + 1f12400: e30200b0 movw r0, #8368 ; 0x20b0 + 1f12404: e34001f1 movt r0, #497 ; 0x1f1 + 1f12408: eb00e7e1 bl 1f4c394 + 1f1240c: e5869000 str r9, [r6] + 1f12410: eaffff2f b 1f120d4 + 1f12414: e320f000 nop {0} + 1f12418: 00000001 .word 0x00000001 + 1f1241c: 00000000 .word 0x00000000 + +01f12420 : + 1f12420: f2c00010 vmov.i32 d16, #0 ; 0x00000000 + 1f12424: e92d4010 push {r4, lr} + 1f12428: e1a04000 mov r4, r0 + 1f1242c: e3a03000 mov r3, #0 + 1f12430: e1a01003 mov r1, r3 + 1f12434: e3e02000 mvn r2, #0 + 1f12438: e30f0048 movw r0, #61512 ; 0xf048 + 1f1243c: e34001f5 movt r0, #501 ; 0x1f5 + 1f12440: e5843228 str r3, [r4, #552] ; 0x228 + 1f12444: e5840000 str r0, [r4] + 1f12448: e2840028 add r0, r4, #40 ; 0x28 + 1f1244c: edc40b02 vstr d16, [r4, #8] + 1f12450: e584222c str r2, [r4, #556] ; 0x22c + 1f12454: e5c43004 strb r3, [r4, #4] + 1f12458: e3a02f7f mov r2, #508 ; 0x1fc + 1f1245c: edc40b04 vstr d16, [r4, #16] + 1f12460: e5843224 str r3, [r4, #548] ; 0x224 + 1f12464: eb00b2ec bl 1f3f01c + 1f12468: e30200b0 movw r0, #8368 ; 0x20b0 + 1f1246c: e34001f1 movt r0, #497 ; 0x1f1 + 1f12470: eb00e7c7 bl 1f4c394 + 1f12474: e1a00004 mov r0, r4 + 1f12478: e8bd8010 pop {r4, pc} + +01f1247c : + 1f1247c: e92d4010 push {r4, lr} + 1f12480: e1a04000 mov r4, r0 + 1f12484: eb003448 bl 1f1f5ac + 1f12488: e2840040 add r0, r4, #64 ; 0x40 + 1f1248c: eb002e29 bl 1f1dd38 + 1f12490: e2840098 add r0, r4, #152 ; 0x98 + 1f12494: eb002e27 bl 1f1dd38 + 1f12498: e1a03004 mov r3, r4 + 1f1249c: e3a02000 mov r2, #0 + 1f124a0: e3a01020 mov r1, #32 + 1f124a4: e5842100 str r2, [r4, #256] ; 0x100 + 1f124a8: e1a00004 mov r0, r4 + 1f124ac: e5c410fc strb r1, [r4, #252] ; 0xfc + 1f124b0: e5842104 str r2, [r4, #260] ; 0x104 + 1f124b4: e5e32118 strb r2, [r3, #280]! ; 0x118 + 1f124b8: e5843040 str r3, [r4, #64] ; 0x40 + 1f124bc: e5843098 str r3, [r4, #152] ; 0x98 + 1f124c0: e8bd8010 pop {r4, pc} + +01f124c4 : + 1f124c4: e2803f46 add r3, r0, #280 ; 0x118 + 1f124c8: e5803040 str r3, [r0, #64] ; 0x40 + 1f124cc: e5803098 str r3, [r0, #152] ; 0x98 + 1f124d0: e12fff1e bx lr + +01f124d4 : + 1f124d4: e92d4010 push {r4, lr} + 1f124d8: e1a04000 mov r4, r0 + 1f124dc: eb003540 bl 1f1f9e4 + 1f124e0: e3500000 cmp r0, #0 + 1f124e4: e2840098 add r0, r4, #152 ; 0x98 + 1f124e8: 15d430fc ldrbne r3, [r4, #252] ; 0xfc + 1f124ec: 13833040 orrne r3, r3, #64 ; 0x40 + 1f124f0: 15c430fc strbne r3, [r4, #252] ; 0xfc + 1f124f4: eb002f31 bl 1f1e1c0 + 1f124f8: e2840040 add r0, r4, #64 ; 0x40 + 1f124fc: e8bd4010 pop {r4, lr} + 1f12500: ea002f2e b 1f1e1c0 + +01f12504 : + 1f12504: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f12508: e1a04000 mov r4, r0 + 1f1250c: e2800040 add r0, r0, #64 ; 0x40 + 1f12510: eb002e41 bl 1f1de1c + 1f12514: e2840098 add r0, r4, #152 ; 0x98 + 1f12518: eb002e3f bl 1f1de1c + 1f1251c: e1a00004 mov r0, r4 + 1f12520: eb00345c bl 1f1f698 + 1f12524: e30a22d4 movw r2, #41684 ; 0xa2d4 + 1f12528: e340220d movt r2, #525 ; 0x20d + 1f1252c: e30431e0 movw r3, #16864 ; 0x41e0 + 1f12530: e34031f6 movt r3, #502 ; 0x1f6 + 1f12534: e3a05000 mov r5, #0 + 1f12538: e3435f20 movt r5, #16160 ; 0x3f20 + 1f1253c: e5d21000 ldrb r1, [r2] + 1f12540: e3a02a03 mov r2, #12288 ; 0x3000 + 1f12544: e3432f00 movt r2, #16128 ; 0x3f00 + 1f12548: e593c000 ldr ip, [r3] + 1f1254c: e3510000 cmp r1, #0 + 1f12550: 03a06000 moveq r6, #0 + 1f12554: 11a0600c movne r6, ip + 1f12558: e5953034 ldr r3, [r5, #52] ; 0x34 + 1f1255c: e3a0e000 mov lr, #0 + 1f12560: e343ef20 movt lr, #16160 ; 0x3f20 + 1f12564: e003300c and r3, r3, ip + 1f12568: e1530006 cmp r3, r6 + 1f1256c: 0a000042 beq 1f1267c + 1f12570: e30a32f8 movw r3, #41720 ; 0xa2f8 + 1f12574: e340320d movt r3, #525 ; 0x20d + 1f12578: e30a52b4 movw r5, #41652 ; 0xa2b4 + 1f1257c: e340520d movt r5, #525 ; 0x20d + 1f12580: e30ac2bf movw ip, #41663 ; 0xa2bf + 1f12584: e340c20d movt ip, #525 ; 0x20d + 1f12588: e30a131c movw r1, #41756 ; 0xa31c + 1f1258c: e340120d movt r1, #525 ; 0x20d + 1f12590: e30a2298 movw r2, #41624 ; 0xa298 + 1f12594: e340220d movt r2, #525 ; 0x20d + 1f12598: e5d30000 ldrb r0, [r3] + 1f1259c: e30a72bd movw r7, #41661 ; 0xa2bd + 1f125a0: e340720d movt r7, #525 ; 0x20d + 1f125a4: e3a03000 mov r3, #0 + 1f125a8: e30a62be movw r6, #41662 ; 0xa2be + 1f125ac: e340620d movt r6, #525 ; 0x20d + 1f125b0: e5c53000 strb r3, [r5] + 1f125b4: e30a52d7 movw r5, #41687 ; 0xa2d7 + 1f125b8: e340520d movt r5, #525 ; 0x20d + 1f125bc: e5cc3000 strb r3, [ip] + 1f125c0: e30ac305 movw ip, #41733 ; 0xa305 + 1f125c4: e340c20d movt ip, #525 ; 0x20d + 1f125c8: e5c13000 strb r3, [r1] + 1f125cc: e30a12d6 movw r1, #41686 ; 0xa2d6 + 1f125d0: e340120d movt r1, #525 ; 0x20d + 1f125d4: e5c23000 strb r3, [r2] + 1f125d8: e30a2307 movw r2, #41735 ; 0xa307 + 1f125dc: e340220d movt r2, #525 ; 0x20d + 1f125e0: e3500000 cmp r0, #0 + 1f125e4: e5c73000 strb r3, [r7] + 1f125e8: e5c63000 strb r3, [r6] + 1f125ec: e5c53000 strb r3, [r5] + 1f125f0: e5cc3000 strb r3, [ip] + 1f125f4: e5c13000 strb r3, [r1] + 1f125f8: e5c23000 strb r3, [r2] + 1f125fc: 1a000026 bne 1f1269c + 1f12600: e30a12f4 movw r1, #41716 ; 0xa2f4 + 1f12604: e340120d movt r1, #525 ; 0x20d + 1f12608: e3a0ca02 mov ip, #8192 ; 0x2000 + 1f1260c: e3a02a12 mov r2, #73728 ; 0x12000 + 1f12610: e3a03801 mov r3, #65536 ; 0x10000 + 1f12614: e5911000 ldr r1, [r1] + 1f12618: e3c11612 bic r1, r1, #18874368 ; 0x1200000 + 1f1261c: e58e1004 str r1, [lr, #4] + 1f12620: e30a131d movw r1, #41757 ; 0xa31d + 1f12624: e340120d movt r1, #525 ; 0x20d + 1f12628: e30ae306 movw lr, #41734 ; 0xa306 + 1f1262c: e340e20d movt lr, #525 ; 0x20d + 1f12630: e5d11000 ldrb r1, [r1] + 1f12634: e5dee000 ldrb lr, [lr] + 1f12638: e3510000 cmp r1, #0 + 1f1263c: 11a0200c movne r2, ip + 1f12640: e3a0c000 mov ip, #0 + 1f12644: e343cf20 movt ip, #16160 ; 0x3f20 + 1f12648: 11a03000 movne r3, r0 + 1f1264c: 03a00a02 moveq r0, #8192 ; 0x2000 + 1f12650: 13a00a12 movne r0, #73728 ; 0x12000 + 1f12654: 13a01801 movne r1, #65536 ; 0x10000 + 1f12658: e35e0000 cmp lr, #0 + 1f1265c: 01a03002 moveq r3, r2 + 1f12660: 01a00001 moveq r0, r1 + 1f12664: e58c001c str r0, [ip, #28] + 1f12668: e58c3028 str r3, [ip, #40] ; 0x28 + 1f1266c: e5d4305d ldrb r3, [r4, #93] ; 0x5d + 1f12670: e383301a orr r3, r3, #26 + 1f12674: e5c4305d strb r3, [r4, #93] ; 0x5d + 1f12678: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f1267c: e3a00064 mov r0, #100 ; 0x64 + 1f12680: e5921004 ldr r1, [r2, #4] + 1f12684: e5923004 ldr r3, [r2, #4] + 1f12688: e1510003 cmp r1, r3 + 1f1268c: 0afffffc beq 1f12684 + 1f12690: e2500001 subs r0, r0, #1 + 1f12694: 1afffff9 bne 1f12680 + 1f12698: eaffffae b 1f12558 + 1f1269c: e3a0ca62 mov ip, #401408 ; 0x62000 + 1f126a0: e3a02a72 mov r2, #466944 ; 0x72000 + 1f126a4: e3a03807 mov r3, #458752 ; 0x70000 + 1f126a8: e3a00806 mov r0, #393216 ; 0x60000 + 1f126ac: eaffffdb b 1f12620 + +01f126b0 : + 1f126b0: e92d4070 push {r4, r5, r6, lr} + 1f126b4: e1a05000 mov r5, r0 + 1f126b8: e3a0200a mov r2, #10 + 1f126bc: e24ddfd6 sub sp, sp, #856 ; 0x358 + 1f126c0: e28d0e11 add r0, sp, #272 ; 0x110 + 1f126c4: e595100c ldr r1, [r5, #12] + 1f126c8: e281101a add r1, r1, #26 + 1f126cc: ebffe990 bl 1f0cd14 + 1f126d0: e2506000 subs r6, r0, #0 + 1f126d4: 1a000036 bne 1f127b4 + 1f126d8: e30f007c movw r0, #61564 ; 0xf07c + 1f126dc: e34001f5 movt r0, #501 ; 0x1f5 + 1f126e0: eb00b299 bl 1f3f14c + 1f126e4: e308415f movw r4, #33119 ; 0x815f + 1f126e8: e340400a movt r4, #10 + 1f126ec: e3a02c01 mov r2, #256 ; 0x100 + 1f126f0: e1a01006 mov r1, r6 + 1f126f4: e28d0010 add r0, sp, #16 + 1f126f8: e0854004 add r4, r5, r4 + 1f126fc: eb00b246 bl 1f3f01c + 1f12700: e3a02001 mov r2, #1 + 1f12704: e58d6000 str r6, [sp] + 1f12708: e28d0010 add r0, sp, #16 + 1f1270c: e30f109c movw r1, #61596 ; 0xf09c + 1f12710: e34011f5 movt r1, #501 ; 0x1f5 + 1f12714: e1a03006 mov r3, r6 + 1f12718: eb00b502 bl 1f3fb28 + 1f1271c: e1a00006 mov r0, r6 + 1f12720: e1a01004 mov r1, r4 + 1f12724: e3a02002 mov r2, #2 + 1f12728: e2803008 add r3, r0, #8 + 1f1272c: e5f1e001 ldrb lr, [r1, #1]! + 1f12730: e28d6fd6 add r6, sp, #856 ; 0x358 + 1f12734: e282c001 add ip, r2, #1 + 1f12738: e0863083 add r3, r6, r3, lsl #1 + 1f1273c: e35e0000 cmp lr, #0 + 1f12740: 12800001 addne r0, r0, #1 + 1f12744: 1551e0a8 ldrbne lr, [r1, #-168] ; 0xffffff58 + 1f12748: 15432348 strbne r2, [r3, #-840] ; 0xfffffcb8 + 1f1274c: e6ef207c uxtb r2, ip + 1f12750: 1543e347 strbne lr, [r3, #-839] ; 0xfffffcb9 + 1f12754: e3520056 cmp r2, #86 ; 0x56 + 1f12758: 1afffff2 bne 1f12728 + 1f1275c: e3a00001 mov r0, #1 + 1f12760: ebffc86c bl 1f04918 + 1f12764: e28d1010 add r1, sp, #16 + 1f12768: e28d300c add r3, sp, #12 + 1f1276c: e3a02c01 mov r2, #256 ; 0x100 + 1f12770: e28d0e11 add r0, sp, #272 ; 0x110 + 1f12774: ebffedfa bl 1f0df64 + 1f12778: e3500000 cmp r0, #0 + 1f1277c: 0a000014 beq 1f127d4 + 1f12780: e30f00ec movw r0, #61676 ; 0xf0ec + 1f12784: e34001f5 movt r0, #501 ; 0x1f5 + 1f12788: eb00b26f bl 1f3f14c + 1f1278c: e3a00000 mov r0, #0 + 1f12790: ebffc860 bl 1f04918 + 1f12794: e28d0e11 add r0, sp, #272 ; 0x110 + 1f12798: ebfff182 bl 1f0eda8 + 1f1279c: e30f00b0 movw r0, #61616 ; 0xf0b0 + 1f127a0: e34001f5 movt r0, #501 ; 0x1f5 + 1f127a4: eb00b268 bl 1f3f14c + 1f127a8: e3a00001 mov r0, #1 + 1f127ac: e28ddfd6 add sp, sp, #856 ; 0x358 + 1f127b0: e8bd8070 pop {r4, r5, r6, pc} + 1f127b4: e595100c ldr r1, [r5, #12] + 1f127b8: e30f00cc movw r0, #61644 ; 0xf0cc + 1f127bc: e34001f5 movt r0, #501 ; 0x1f5 + 1f127c0: e281101a add r1, r1, #26 + 1f127c4: eb00b260 bl 1f3f14c + 1f127c8: e3a00000 mov r0, #0 + 1f127cc: e28ddfd6 add sp, sp, #856 ; 0x358 + 1f127d0: e8bd8070 pop {r4, r5, r6, pc} + 1f127d4: e59d300c ldr r3, [sp, #12] + 1f127d8: e3530c01 cmp r3, #256 ; 0x100 + 1f127dc: 1affffe7 bne 1f12780 + 1f127e0: e30861b3 movw r6, #33203 ; 0x81b3 + 1f127e4: e340600a movt r6, #10 + 1f127e8: e0856006 add r6, r5, r6 + 1f127ec: e2855010 add r5, r5, #16 + 1f127f0: ea000002 b 1f12800 + 1f127f4: e1560004 cmp r6, r4 + 1f127f8: e2855a02 add r5, r5, #8192 ; 0x2000 + 1f127fc: 0affffe2 beq 1f1278c + 1f12800: e5f43001 ldrb r3, [r4, #1]! + 1f12804: e3530000 cmp r3, #0 + 1f12808: 0afffff9 beq 1f127f4 + 1f1280c: e28d300c add r3, sp, #12 + 1f12810: e3a02a02 mov r2, #8192 ; 0x2000 + 1f12814: e1a01005 mov r1, r5 + 1f12818: e28d0e11 add r0, sp, #272 ; 0x110 + 1f1281c: ebffedd0 bl 1f0df64 + 1f12820: e3500000 cmp r0, #0 + 1f12824: e30f00ec movw r0, #61676 ; 0xf0ec + 1f12828: e34001f5 movt r0, #501 ; 0x1f5 + 1f1282c: 1a000002 bne 1f1283c + 1f12830: e59d300c ldr r3, [sp, #12] + 1f12834: e3530a02 cmp r3, #8192 ; 0x2000 + 1f12838: 0affffed beq 1f127f4 + 1f1283c: eb00b242 bl 1f3f14c + 1f12840: eaffffeb b 1f127f4 + +01f12844 : + 1f12844: e92d4010 push {r4, lr} + 1f12848: e1a04000 mov r4, r0 + 1f1284c: e3a00001 mov r0, #1 + 1f12850: e24dde25 sub sp, sp, #592 ; 0x250 + 1f12854: ebffc82f bl 1f04918 + 1f12858: e5d43000 ldrb r3, [r4] + 1f1285c: e3530000 cmp r3, #0 + 1f12860: 0a00000c beq 1f12898 + 1f12864: e594100c ldr r1, [r4, #12] + 1f12868: e28d0008 add r0, sp, #8 + 1f1286c: e3a02001 mov r2, #1 + 1f12870: e281101a add r1, r1, #26 + 1f12874: ebffe926 bl 1f0cd14 + 1f12878: e3500000 cmp r0, #0 + 1f1287c: 0a00000a beq 1f128ac + 1f12880: e3a04000 mov r4, #0 + 1f12884: e3a00000 mov r0, #0 + 1f12888: ebffc822 bl 1f04918 + 1f1288c: e1a00004 mov r0, r4 + 1f12890: e28dde25 add sp, sp, #592 ; 0x250 + 1f12894: e8bd8010 pop {r4, pc} + 1f12898: e1a00004 mov r0, r4 + 1f1289c: ebffff83 bl 1f126b0 + 1f128a0: e3500000 cmp r0, #0 + 1f128a4: 0afffff5 beq 1f12880 + 1f128a8: eaffffed b 1f12864 + 1f128ac: e1a0300d mov r3, sp + 1f128b0: e3a02702 mov r2, #524288 ; 0x80000 + 1f128b4: e3021298 movw r1, #8856 ; 0x2298 + 1f128b8: e34011fb movt r1, #507 ; 0x1fb + 1f128bc: e28d0008 add r0, sp, #8 + 1f128c0: ebffeb30 bl 1f0d588 + 1f128c4: e28d0008 add r0, sp, #8 + 1f128c8: ebfff136 bl 1f0eda8 + 1f128cc: e594100c ldr r1, [r4, #12] + 1f128d0: e59d2000 ldr r2, [sp] + 1f128d4: e30f0108 movw r0, #61704 ; 0xf108 + 1f128d8: e34001f5 movt r0, #501 ; 0x1f5 + 1f128dc: e281101a add r1, r1, #26 + 1f128e0: eb00b219 bl 1f3f14c + 1f128e4: e3021298 movw r1, #8856 ; 0x2298 + 1f128e8: e3401203 movt r1, #515 ; 0x203 + 1f128ec: e3020298 movw r0, #8856 ; 0x2298 + 1f128f0: e34001fb movt r0, #507 ; 0x1fb + 1f128f4: e59d2000 ldr r2, [sp] + 1f128f8: eb004446 bl 1f23a18 + 1f128fc: e3500000 cmp r0, #0 + 1f12900: e58d0000 str r0, [sp] + 1f12904: 0affffdd beq 1f12880 + 1f12908: e594100c ldr r1, [r4, #12] + 1f1290c: e3a0200a mov r2, #10 + 1f12910: e28d0008 add r0, sp, #8 + 1f12914: e281101a add r1, r1, #26 + 1f12918: ebffe8fd bl 1f0cd14 + 1f1291c: e3500000 cmp r0, #0 + 1f12920: 1affffd6 bne 1f12880 + 1f12924: e59d4000 ldr r4, [sp] + 1f12928: e3021298 movw r1, #8856 ; 0x2298 + 1f1292c: e3401203 movt r1, #515 ; 0x203 + 1f12930: e1a02004 mov r2, r4 + 1f12934: e28d3004 add r3, sp, #4 + 1f12938: e28d0008 add r0, sp, #8 + 1f1293c: ebffed88 bl 1f0df64 + 1f12940: e3500000 cmp r0, #0 + 1f12944: 1a000002 bne 1f12954 + 1f12948: e59d3004 ldr r3, [sp, #4] + 1f1294c: e1540003 cmp r4, r3 + 1f12950: 0a000006 beq 1f12970 + 1f12954: e3a04000 mov r4, #0 + 1f12958: e30f012c movw r0, #61740 ; 0xf12c + 1f1295c: e34001f5 movt r0, #501 ; 0x1f5 + 1f12960: eb00b1f9 bl 1f3f14c + 1f12964: e28d0008 add r0, sp, #8 + 1f12968: ebfff10e bl 1f0eda8 + 1f1296c: eaffffc4 b 1f12884 + 1f12970: e3a04001 mov r4, #1 + 1f12974: eafffffa b 1f12964 + +01f12978 : + 1f12978: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f1297c: e1a06000 mov r6, r0 + 1f12980: e3a0200a mov r2, #10 + 1f12984: e24ddc45 sub sp, sp, #17664 ; 0x4500 + 1f12988: e24dd004 sub sp, sp, #4 + 1f1298c: e596100c ldr r1, [r6, #12] + 1f12990: e28d0e2b add r0, sp, #688 ; 0x2b0 + 1f12994: e281101a add r1, r1, #26 + 1f12998: ebffe8dd bl 1f0cd14 + 1f1299c: e2504000 subs r4, r0, #0 + 1f129a0: 1a000029 bne 1f12a4c + 1f129a4: e3a02e15 mov r2, #336 ; 0x150 + 1f129a8: e1a01004 mov r1, r4 + 1f129ac: e28d0010 add r0, sp, #16 + 1f129b0: eb00b199 bl 1f3f01c + 1f129b4: e3a02e15 mov r2, #336 ; 0x150 + 1f129b8: e1a01004 mov r1, r4 + 1f129bc: e28d0e16 add r0, sp, #352 ; 0x160 + 1f129c0: eb00b195 bl 1f3f01c + 1f129c4: e30f0148 movw r0, #61768 ; 0xf148 + 1f129c8: e34001f5 movt r0, #501 ; 0x1f5 + 1f129cc: eb00b1de bl 1f3f14c + 1f129d0: e28d0004 add r0, sp, #4 + 1f129d4: e30f1160 movw r1, #61792 ; 0xf160 + 1f129d8: e34011f5 movt r1, #501 ; 0x1f5 + 1f129dc: eb00b58f bl 1f40020 + 1f129e0: e3a00001 mov r0, #1 + 1f129e4: e3e02007 mvn r2, #7 + 1f129e8: e3a03054 mov r3, #84 ; 0x54 + 1f129ec: e5cd200e strb r2, [sp, #14] + 1f129f0: e5cd300d strb r3, [sp, #13] + 1f129f4: e3a0301e mov r3, #30 + 1f129f8: e5cd400c strb r4, [sp, #12] + 1f129fc: e5cd300f strb r3, [sp, #15] + 1f12a00: ebffc7c4 bl 1f04918 + 1f12a04: e28d1004 add r1, sp, #4 + 1f12a08: e1a0300d mov r3, sp + 1f12a0c: e3a0200c mov r2, #12 + 1f12a10: e28d0e2b add r0, sp, #688 ; 0x2b0 + 1f12a14: ebffed52 bl 1f0df64 + 1f12a18: e2508000 subs r8, r0, #0 + 1f12a1c: 0a000013 beq 1f12a70 + 1f12a20: e3a00000 mov r0, #0 + 1f12a24: ebffc7bb bl 1f04918 + 1f12a28: e30f0188 movw r0, #61832 ; 0xf188 + 1f12a2c: e34001f5 movt r0, #501 ; 0x1f5 + 1f12a30: eb00b1c5 bl 1f3f14c + 1f12a34: e28d0e2b add r0, sp, #688 ; 0x2b0 + 1f12a38: ebfff0da bl 1f0eda8 + 1f12a3c: e3a00000 mov r0, #0 + 1f12a40: e28ddc45 add sp, sp, #17664 ; 0x4500 + 1f12a44: e28dd004 add sp, sp, #4 + 1f12a48: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f12a4c: e596100c ldr r1, [r6, #12] + 1f12a50: e30f00cc movw r0, #61644 ; 0xf0cc + 1f12a54: e34001f5 movt r0, #501 ; 0x1f5 + 1f12a58: e281101a add r1, r1, #26 + 1f12a5c: eb00b1ba bl 1f3f14c + 1f12a60: e3a00000 mov r0, #0 + 1f12a64: e28ddc45 add sp, sp, #17664 ; 0x4500 + 1f12a68: e28dd004 add sp, sp, #4 + 1f12a6c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f12a70: e59d3000 ldr r3, [sp] + 1f12a74: e353000c cmp r3, #12 + 1f12a78: 1affffe8 bne 1f12a20 + 1f12a7c: e286792a add r7, r6, #688128 ; 0xa8000 + 1f12a80: ebffc7a4 bl 1f04918 + 1f12a84: e287400e add r4, r7, #14 + 1f12a88: e2875e16 add r5, r7, #352 ; 0x160 + 1f12a8c: e28d3c02 add r3, sp, #512 ; 0x200 + 1f12a90: e1a0e004 mov lr, r4 + 1f12a94: e1a01005 mov r1, r5 + 1f12a98: e28d2f57 add r2, sp, #348 ; 0x15c + 1f12a9c: e28390ac add r9, r3, #172 ; 0xac + 1f12aa0: e28dc00c add ip, sp, #12 + 1f12aa4: e301aefa movw sl, #7930 ; 0x1efa + 1f12aa8: e1fe30b2 ldrh r3, [lr, #2]! + 1f12aac: e3530000 cmp r3, #0 + 1f12ab0: e1a00003 mov r0, r3 + 1f12ab4: 0a000006 beq 1f12ad4 + 1f12ab8: e5d10000 ldrb r0, [r1] + 1f12abc: e00b089a mul fp, sl, r8 + 1f12ac0: e2503000 subs r3, r0, #0 + 1f12ac4: 128b0fab addne r0, fp, #684 ; 0x2ac + 1f12ac8: 12888001 addne r8, r8, #1 + 1f12acc: 155130a8 ldrbne r3, [r1, #-168] ; 0xffffff58 + 1f12ad0: 12033003 andne r3, r3, #3 + 1f12ad4: e5a23004 str r3, [r2, #4]! + 1f12ad8: e2811001 add r1, r1, #1 + 1f12adc: e5ac0004 str r0, [ip, #4]! + 1f12ae0: e1520009 cmp r2, r9 + 1f12ae4: 1affffef bne 1f12aa8 + 1f12ae8: e28d3c01 add r3, sp, #256 ; 0x100 + 1f12aec: e3a00001 mov r0, #1 + 1f12af0: e28d8010 add r8, sp, #16 + 1f12af4: e2839060 add r9, r3, #96 ; 0x60 + 1f12af8: e28dac25 add sl, sp, #9472 ; 0x2500 + 1f12afc: ebffc785 bl 1f04918 + 1f12b00: ea000004 b 1f12b18 + 1f12b04: e51a3004 ldr r3, [sl, #-4] + 1f12b08: e3530004 cmp r3, #4 + 1f12b0c: 1a00000a bne 1f12b3c + 1f12b10: e1590008 cmp r9, r8 + 1f12b14: 0a000008 beq 1f12b3c + 1f12b18: e28d3d93 add r3, sp, #9408 ; 0x24c0 + 1f12b1c: e3a02004 mov r2, #4 + 1f12b20: e1a01008 mov r1, r8 + 1f12b24: e283303c add r3, r3, #60 ; 0x3c + 1f12b28: e28d0e2b add r0, sp, #688 ; 0x2b0 + 1f12b2c: e0888002 add r8, r8, r2 + 1f12b30: ebffed0b bl 1f0df64 + 1f12b34: e3500000 cmp r0, #0 + 1f12b38: 0afffff1 beq 1f12b04 + 1f12b3c: e28d3c02 add r3, sp, #512 ; 0x200 + 1f12b40: e28d8e16 add r8, sp, #352 ; 0x160 + 1f12b44: e28390b0 add r9, r3, #176 ; 0xb0 + 1f12b48: ea000004 b 1f12b60 + 1f12b4c: e51a3004 ldr r3, [sl, #-4] + 1f12b50: e3530004 cmp r3, #4 + 1f12b54: 1a00000a bne 1f12b84 + 1f12b58: e1590008 cmp r9, r8 + 1f12b5c: 0a000008 beq 1f12b84 + 1f12b60: e28d3d93 add r3, sp, #9408 ; 0x24c0 + 1f12b64: e3a02004 mov r2, #4 + 1f12b68: e1a01008 mov r1, r8 + 1f12b6c: e283303c add r3, r3, #60 ; 0x3c + 1f12b70: e28d0e2b add r0, sp, #688 ; 0x2b0 + 1f12b74: e0888002 add r8, r8, r2 + 1f12b78: ebffecf9 bl 1f0df64 + 1f12b7c: e3500000 cmp r0, #0 + 1f12b80: 0afffff1 beq 1f12b4c + 1f12b84: e3a00000 mov r0, #0 + 1f12b88: e2866010 add r6, r6, #16 + 1f12b8c: e28770b6 add r7, r7, #182 ; 0xb6 + 1f12b90: e3019ef8 movw r9, #7928 ; 0x1ef8 + 1f12b94: e24ab002 sub fp, sl, #2 + 1f12b98: ebffc75e bl 1f04918 + 1f12b9c: ea000005 b 1f12bb8 + 1f12ba0: e3580000 cmp r8, #0 + 1f12ba4: 1a000007 bne 1f12bc8 + 1f12ba8: e1540007 cmp r4, r7 + 1f12bac: e2855001 add r5, r5, #1 + 1f12bb0: e2866a02 add r6, r6, #8192 ; 0x2000 + 1f12bb4: 0a00002a beq 1f12c64 + 1f12bb8: e1f480b2 ldrh r8, [r4, #2]! + 1f12bbc: e1580009 cmp r8, r9 + 1f12bc0: 9afffff6 bls 1f12ba0 + 1f12bc4: e3018ef8 movw r8, #7928 ; 0x1ef8 + 1f12bc8: e5d53000 ldrb r3, [r5] + 1f12bcc: e3530000 cmp r3, #0 + 1f12bd0: 0afffff4 beq 1f12ba8 + 1f12bd4: e3012ef8 movw r2, #7928 ; 0x1ef8 + 1f12bd8: e3a01055 mov r1, #85 ; 0x55 + 1f12bdc: e1a0000b mov r0, fp + 1f12be0: eb00b10d bl 1f3f01c + 1f12be4: e28d0e4f add r0, sp, #1264 ; 0x4f0 + 1f12be8: e1a02008 mov r2, r8 + 1f12bec: e1a01006 mov r1, r6 + 1f12bf0: e280000c add r0, r0, #12 + 1f12bf4: e1a03428 lsr r3, r8, #8 + 1f12bf8: e54a8004 strb r8, [sl, #-4] + 1f12bfc: e54a3003 strb r3, [sl, #-3] + 1f12c00: eb00b07e bl 1f3ee00 + 1f12c04: e28d1e4f add r1, sp, #1264 ; 0x4f0 + 1f12c08: e1a02008 mov r2, r8 + 1f12c0c: e281100c add r1, r1, #12 + 1f12c10: e1a0000b mov r0, fp + 1f12c14: eb00b079 bl 1f3ee00 + 1f12c18: e3a00001 mov r0, #1 + 1f12c1c: ebffc73d bl 1f04918 + 1f12c20: e28d1d93 add r1, sp, #9408 ; 0x24c0 + 1f12c24: e1a0300d mov r3, sp + 1f12c28: e3012efa movw r2, #7930 ; 0x1efa + 1f12c2c: e281103c add r1, r1, #60 ; 0x3c + 1f12c30: e28d0e2b add r0, sp, #688 ; 0x2b0 + 1f12c34: ebffecca bl 1f0df64 + 1f12c38: e3500000 cmp r0, #0 + 1f12c3c: e3013efa movw r3, #7930 ; 0x1efa + 1f12c40: 1a000010 bne 1f12c88 + 1f12c44: e59d2000 ldr r2, [sp] + 1f12c48: e1520003 cmp r2, r3 + 1f12c4c: 1a00000d bne 1f12c88 + 1f12c50: ebffc730 bl 1f04918 + 1f12c54: e1540007 cmp r4, r7 + 1f12c58: e2855001 add r5, r5, #1 + 1f12c5c: e2866a02 add r6, r6, #8192 ; 0x2000 + 1f12c60: 1affffd4 bne 1f12bb8 + 1f12c64: e28d0e2b add r0, sp, #688 ; 0x2b0 + 1f12c68: ebfff04e bl 1f0eda8 + 1f12c6c: e30f016c movw r0, #61804 ; 0xf16c + 1f12c70: e34001f5 movt r0, #501 ; 0x1f5 + 1f12c74: eb00b134 bl 1f3f14c + 1f12c78: e3a00001 mov r0, #1 + 1f12c7c: e28ddc45 add sp, sp, #17664 ; 0x4500 + 1f12c80: e28dd004 add sp, sp, #4 + 1f12c84: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f12c88: e3a00000 mov r0, #0 + 1f12c8c: ebffc721 bl 1f04918 + 1f12c90: e30f00ec movw r0, #61676 ; 0xf0ec + 1f12c94: e34001f5 movt r0, #501 ; 0x1f5 + 1f12c98: eb00b12b bl 1f3f14c + 1f12c9c: e28d0e2b add r0, sp, #688 ; 0x2b0 + 1f12ca0: ebfff040 bl 1f0eda8 + 1f12ca4: e3a00000 mov r0, #0 + 1f12ca8: e28ddc45 add sp, sp, #17664 ; 0x4500 + 1f12cac: e28dd004 add sp, sp, #4 + 1f12cb0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + +01f12cb4 : + 1f12cb4: e92d4010 push {r4, lr} + 1f12cb8: e1a04000 mov r4, r0 + 1f12cbc: e3a03000 mov r3, #0 + 1f12cc0: e3a0292a mov r2, #688128 ; 0xa8000 + 1f12cc4: e3a01055 mov r1, #85 ; 0x55 + 1f12cc8: e2800010 add r0, r0, #16 + 1f12ccc: e5c43000 strb r3, [r4] + 1f12cd0: e5c43001 strb r3, [r4, #1] + 1f12cd4: e5843004 str r3, [r4, #4] + 1f12cd8: e584300c str r3, [r4, #12] + 1f12cdc: eb00b0ce bl 1f3f01c + 1f12ce0: e1a00004 mov r0, r4 + 1f12ce4: e8bd8010 pop {r4, pc} + +01f12ce8 : + 1f12ce8: e2813915 add r3, r1, #344064 ; 0x54000 + 1f12cec: e1a02000 mov r2, r0 + 1f12cf0: e2833008 add r3, r3, #8 + 1f12cf4: e30f01a4 movw r0, #61860 ; 0xf1a4 + 1f12cf8: e34001f5 movt r0, #501 ; 0x1f5 + 1f12cfc: e1a03083 lsl r3, r3, #1 + 1f12d00: e92d4070 push {r4, r5, r6, lr} + 1f12d04: e19260b3 ldrh r6, [r2, r3] + 1f12d08: e0825681 add r5, r2, r1, lsl #13 + 1f12d0c: e1a02006 mov r2, r6 + 1f12d10: eb00b10d bl 1f3f14c + 1f12d14: e3560000 cmp r6, #0 + 1f12d18: 08bd8070 popeq {r4, r5, r6, pc} + 1f12d1c: e2855010 add r5, r5, #16 + 1f12d20: e3a04000 mov r4, #0 + 1f12d24: e2455001 sub r5, r5, #1 + 1f12d28: e1a01004 mov r1, r4 + 1f12d2c: e30f01c4 movw r0, #61892 ; 0xf1c4 + 1f12d30: e34001f5 movt r0, #501 ; 0x1f5 + 1f12d34: e5f52001 ldrb r2, [r5, #1]! + 1f12d38: e2844001 add r4, r4, #1 + 1f12d3c: eb00b102 bl 1f3f14c + 1f12d40: e1560004 cmp r6, r4 + 1f12d44: 1afffff7 bne 1f12d28 + 1f12d48: e8bd8070 pop {r4, r5, r6, pc} + +01f12d4c : + 1f12d4c: e5d03000 ldrb r3, [r0] + 1f12d50: e3530000 cmp r3, #0 + 1f12d54: 0a000001 beq 1f12d60 + 1f12d58: e1a00003 mov r0, r3 + 1f12d5c: e12fff1e bx lr + 1f12d60: eaffff04 b 1f12978 + +01f12d64 : + 1f12d64: e5d03001 ldrb r3, [r0, #1] + 1f12d68: e92d4010 push {r4, lr} + 1f12d6c: e3530000 cmp r3, #0 + 1f12d70: e1a04000 mov r4, r0 + 1f12d74: 0a000004 beq 1f12d8c + 1f12d78: e5d03000 ldrb r3, [r0] + 1f12d7c: e3530000 cmp r3, #0 + 1f12d80: 0a000004 beq 1f12d98 + 1f12d84: e3a03000 mov r3, #0 + 1f12d88: e5c43001 strb r3, [r4, #1] + 1f12d8c: e3a03000 mov r3, #0 + 1f12d90: e5843004 str r3, [r4, #4] + 1f12d94: e8bd8010 pop {r4, pc} + 1f12d98: ebfffef6 bl 1f12978 + 1f12d9c: eafffff8 b 1f12d84 + +01f12da0 : + 1f12da0: e5d03000 ldrb r3, [r0] + 1f12da4: e3530000 cmp r3, #0 + 1f12da8: 0a000001 beq 1f12db4 + 1f12dac: e1a00003 mov r0, r3 + 1f12db0: e12fff1e bx lr + 1f12db4: eafffe3d b 1f126b0 + +01f12db8 : + 1f12db8: e5d03001 ldrb r3, [r0, #1] + 1f12dbc: e92d4010 push {r4, lr} + 1f12dc0: e3530000 cmp r3, #0 + 1f12dc4: e1a04000 mov r4, r0 + 1f12dc8: 0a000004 beq 1f12de0 + 1f12dcc: e5d03000 ldrb r3, [r0] + 1f12dd0: e3530000 cmp r3, #0 + 1f12dd4: 0a000004 beq 1f12dec + 1f12dd8: e3a03000 mov r3, #0 + 1f12ddc: e5c43001 strb r3, [r4, #1] + 1f12de0: e3a03000 mov r3, #0 + 1f12de4: e5843004 str r3, [r4, #4] + 1f12de8: e8bd8010 pop {r4, pc} + 1f12dec: ebfffe2f bl 1f126b0 + 1f12df0: eafffff8 b 1f12dd8 + +01f12df4 : + 1f12df4: e5d03000 ldrb r3, [r0] + 1f12df8: e3530000 cmp r3, #0 + 1f12dfc: 0a000001 beq 1f12e08 + 1f12e00: e1a00003 mov r0, r3 + 1f12e04: e12fff1e bx lr + 1f12e08: eafffe8d b 1f12844 + +01f12e0c : + 1f12e0c: e5d03001 ldrb r3, [r0, #1] + 1f12e10: e92d4010 push {r4, lr} + 1f12e14: e3530000 cmp r3, #0 + 1f12e18: e1a04000 mov r4, r0 + 1f12e1c: 0a000004 beq 1f12e34 + 1f12e20: e5d03000 ldrb r3, [r0] + 1f12e24: e3530000 cmp r3, #0 + 1f12e28: 0a000004 beq 1f12e40 + 1f12e2c: e3a03000 mov r3, #0 + 1f12e30: e5c43001 strb r3, [r4, #1] + 1f12e34: e3a03000 mov r3, #0 + 1f12e38: e5843004 str r3, [r4, #4] + 1f12e3c: e8bd8010 pop {r4, pc} + 1f12e40: ebfffe7f bl 1f12844 + 1f12e44: eafffff8 b 1f12e2c + +01f12e48 : + 1f12e48: e92d4010 push {r4, lr} + 1f12e4c: e3a0102e mov r1, #46 ; 0x2e + 1f12e50: eb00b524 bl 1f402e8 + 1f12e54: e2504000 subs r4, r0, #0 + 1f12e58: 0a000025 beq 1f12ef4 + 1f12e5c: e1d400d1 ldrsb r0, [r4, #1] + 1f12e60: eb00bfda bl 1f42dd0 + 1f12e64: e3500047 cmp r0, #71 ; 0x47 + 1f12e68: 0a000019 beq 1f12ed4 + 1f12e6c: e1d400d1 ldrsb r0, [r4, #1] + 1f12e70: eb00bfd6 bl 1f42dd0 + 1f12e74: e350004e cmp r0, #78 ; 0x4e + 1f12e78: 0a000027 beq 1f12f1c + 1f12e7c: e1d400d1 ldrsb r0, [r4, #1] + 1f12e80: eb00bfd2 bl 1f42dd0 + 1f12e84: e350004e cmp r0, #78 ; 0x4e + 1f12e88: 0a00002d beq 1f12f44 + 1f12e8c: e1d400d1 ldrsb r0, [r4, #1] + 1f12e90: eb00bfce bl 1f42dd0 + 1f12e94: e3500044 cmp r0, #68 ; 0x44 + 1f12e98: 0a000017 beq 1f12efc + 1f12e9c: e1d400d1 ldrsb r0, [r4, #1] + 1f12ea0: eb00bfca bl 1f42dd0 + 1f12ea4: e350004c cmp r0, #76 ; 0x4c + 1f12ea8: 1a000011 bne 1f12ef4 + 1f12eac: e1d400d2 ldrsb r0, [r4, #2] + 1f12eb0: eb00bfc6 bl 1f42dd0 + 1f12eb4: e3500053 cmp r0, #83 ; 0x53 + 1f12eb8: 1a00000d bne 1f12ef4 + 1f12ebc: e1d400d3 ldrsb r0, [r4, #3] + 1f12ec0: eb00bfc2 bl 1f42dd0 + 1f12ec4: e3500054 cmp r0, #84 ; 0x54 + 1f12ec8: 1a000009 bne 1f12ef4 + 1f12ecc: e3a00005 mov r0, #5 + 1f12ed0: e8bd8010 pop {r4, pc} + 1f12ed4: e1d430d2 ldrsb r3, [r4, #2] + 1f12ed8: e3530036 cmp r3, #54 ; 0x36 + 1f12edc: 1affffe2 bne 1f12e6c + 1f12ee0: e1d430d3 ldrsb r3, [r4, #3] + 1f12ee4: e3530034 cmp r3, #52 ; 0x34 + 1f12ee8: 1affffdf bne 1f12e6c + 1f12eec: e3a00002 mov r0, #2 + 1f12ef0: e8bd8010 pop {r4, pc} + 1f12ef4: e3a00000 mov r0, #0 + 1f12ef8: e8bd8010 pop {r4, pc} + 1f12efc: e1d430d2 ldrsb r3, [r4, #2] + 1f12f00: e3530036 cmp r3, #54 ; 0x36 + 1f12f04: 1affffe4 bne 1f12e9c + 1f12f08: e1d430d3 ldrsb r3, [r4, #3] + 1f12f0c: e3530034 cmp r3, #52 ; 0x34 + 1f12f10: 1affffe1 bne 1f12e9c + 1f12f14: e3a00001 mov r0, #1 + 1f12f18: e8bd8010 pop {r4, pc} + 1f12f1c: e1d400d2 ldrsb r0, [r4, #2] + 1f12f20: eb00bfaa bl 1f42dd0 + 1f12f24: e3500049 cmp r0, #73 ; 0x49 + 1f12f28: 1affffd3 bne 1f12e7c + 1f12f2c: e1d400d3 ldrsb r0, [r4, #3] + 1f12f30: eb00bfa6 bl 1f42dd0 + 1f12f34: e3500042 cmp r0, #66 ; 0x42 + 1f12f38: 1affffcf bne 1f12e7c + 1f12f3c: e3a00003 mov r0, #3 + 1f12f40: e8bd8010 pop {r4, pc} + 1f12f44: e1d400d2 ldrsb r0, [r4, #2] + 1f12f48: eb00bfa0 bl 1f42dd0 + 1f12f4c: e3500042 cmp r0, #66 ; 0x42 + 1f12f50: 1affffcd bne 1f12e8c + 1f12f54: e1d400d3 ldrsb r0, [r4, #3] + 1f12f58: eb00bf9c bl 1f42dd0 + 1f12f5c: e350005a cmp r0, #90 ; 0x5a + 1f12f60: 1affffc9 bne 1f12e8c + 1f12f64: e3a00004 mov r0, #4 + 1f12f68: e8bd8010 pop {r4, pc} + +01f12f6c : + 1f12f6c: e92d4010 push {r4, lr} + 1f12f70: e3a0102e mov r1, #46 ; 0x2e + 1f12f74: eb00b4db bl 1f402e8 + 1f12f78: e2504000 subs r4, r0, #0 + 1f12f7c: 0a000024 beq 1f13014 + 1f12f80: e1d400d1 ldrsb r0, [r4, #1] + 1f12f84: eb00bf91 bl 1f42dd0 + 1f12f88: e3500047 cmp r0, #71 ; 0x47 + 1f12f8c: 0a000019 beq 1f12ff8 + 1f12f90: e1d400d1 ldrsb r0, [r4, #1] + 1f12f94: eb00bf8d bl 1f42dd0 + 1f12f98: e350004e cmp r0, #78 ; 0x4e + 1f12f9c: 0a000025 beq 1f13038 + 1f12fa0: e1d400d1 ldrsb r0, [r4, #1] + 1f12fa4: eb00bf89 bl 1f42dd0 + 1f12fa8: e350004e cmp r0, #78 ; 0x4e + 1f12fac: 0a00002a beq 1f1305c + 1f12fb0: e1d400d1 ldrsb r0, [r4, #1] + 1f12fb4: eb00bf85 bl 1f42dd0 + 1f12fb8: e3500044 cmp r0, #68 ; 0x44 + 1f12fbc: 0a000016 beq 1f1301c + 1f12fc0: e1d400d1 ldrsb r0, [r4, #1] + 1f12fc4: eb00bf81 bl 1f42dd0 + 1f12fc8: e350004c cmp r0, #76 ; 0x4c + 1f12fcc: 1a000010 bne 1f13014 + 1f12fd0: e1d400d2 ldrsb r0, [r4, #2] + 1f12fd4: eb00bf7d bl 1f42dd0 + 1f12fd8: e3500053 cmp r0, #83 ; 0x53 + 1f12fdc: 1a00000c bne 1f13014 + 1f12fe0: e1d400d3 ldrsb r0, [r4, #3] + 1f12fe4: eb00bf79 bl 1f42dd0 + 1f12fe8: e3500054 cmp r0, #84 ; 0x54 + 1f12fec: 1a000008 bne 1f13014 + 1f12ff0: e3a00001 mov r0, #1 + 1f12ff4: e8bd8010 pop {r4, pc} + 1f12ff8: e1d430d2 ldrsb r3, [r4, #2] + 1f12ffc: e3530036 cmp r3, #54 ; 0x36 + 1f13000: 1affffe2 bne 1f12f90 + 1f13004: e1d430d3 ldrsb r3, [r4, #3] + 1f13008: e3530034 cmp r3, #52 ; 0x34 + 1f1300c: 1affffdf bne 1f12f90 + 1f13010: eafffff6 b 1f12ff0 + 1f13014: e3a00000 mov r0, #0 + 1f13018: e8bd8010 pop {r4, pc} + 1f1301c: e1d430d2 ldrsb r3, [r4, #2] + 1f13020: e3530036 cmp r3, #54 ; 0x36 + 1f13024: 1affffe5 bne 1f12fc0 + 1f13028: e1d430d3 ldrsb r3, [r4, #3] + 1f1302c: e3530034 cmp r3, #52 ; 0x34 + 1f13030: 1affffe2 bne 1f12fc0 + 1f13034: eaffffed b 1f12ff0 + 1f13038: e1d400d2 ldrsb r0, [r4, #2] + 1f1303c: eb00bf63 bl 1f42dd0 + 1f13040: e3500049 cmp r0, #73 ; 0x49 + 1f13044: 1affffd5 bne 1f12fa0 + 1f13048: e1d400d3 ldrsb r0, [r4, #3] + 1f1304c: eb00bf5f bl 1f42dd0 + 1f13050: e3500042 cmp r0, #66 ; 0x42 + 1f13054: 1affffd1 bne 1f12fa0 + 1f13058: eaffffe4 b 1f12ff0 + 1f1305c: e1d400d2 ldrsb r0, [r4, #2] + 1f13060: eb00bf5a bl 1f42dd0 + 1f13064: e3500042 cmp r0, #66 ; 0x42 + 1f13068: 1affffd0 bne 1f12fb0 + 1f1306c: e1d400d3 ldrsb r0, [r4, #3] + 1f13070: eb00bf56 bl 1f42dd0 + 1f13074: e350005a cmp r0, #90 ; 0x5a + 1f13078: 1affffcc bne 1f12fb0 + 1f1307c: eaffffdb b 1f12ff0 + +01f13080 : + 1f13080: e92d4010 push {r4, lr} + 1f13084: e3a0102e mov r1, #46 ; 0x2e + 1f13088: eb00b496 bl 1f402e8 + 1f1308c: e2504000 subs r4, r0, #0 + 1f13090: 0a000003 beq 1f130a4 + 1f13094: e1d400d1 ldrsb r0, [r4, #1] + 1f13098: eb00bf4c bl 1f42dd0 + 1f1309c: e350004c cmp r0, #76 ; 0x4c + 1f130a0: 0a000001 beq 1f130ac + 1f130a4: e3a00000 mov r0, #0 + 1f130a8: e8bd8010 pop {r4, pc} + 1f130ac: e1d400d2 ldrsb r0, [r4, #2] + 1f130b0: eb00bf46 bl 1f42dd0 + 1f130b4: e3500053 cmp r0, #83 ; 0x53 + 1f130b8: 1afffff9 bne 1f130a4 + 1f130bc: e1d400d3 ldrsb r0, [r4, #3] + 1f130c0: eb00bf42 bl 1f42dd0 + 1f130c4: e3500054 cmp r0, #84 ; 0x54 + 1f130c8: 1afffff5 bne 1f130a4 + 1f130cc: e3a00001 mov r0, #1 + 1f130d0: e8bd8010 pop {r4, pc} + +01f130d4 : + 1f130d4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f130d8: e281c915 add ip, r1, #344064 ; 0x54000 + 1f130dc: e0801681 add r1, r0, r1, lsl #13 + 1f130e0: e24dd00c sub sp, sp, #12 + 1f130e4: e28cc008 add ip, ip, #8 + 1f130e8: e2815010 add r5, r1, #16 + 1f130ec: e2027007 and r7, r2, #7 + 1f130f0: e1a0c08c lsl ip, ip, #1 + 1f130f4: e08541c2 add r4, r5, r2, asr #3 + 1f130f8: e59d8030 ldr r8, [sp, #48] ; 0x30 + 1f130fc: e7d5b1c2 ldrb fp, [r5, r2, asr #3] + 1f13100: e19060bc ldrh r6, [r0, ip] + 1f13104: e3580000 cmp r8, #0 + 1f13108: e1a0b71b lsl fp, fp, r7 + 1f1310c: e0856006 add r6, r5, r6 + 1f13110: da000045 ble 1f1322c + 1f13114: e1a09003 mov r9, r3 + 1f13118: e6efb07b uxtb fp, fp + 1f1311c: e3a0a000 mov sl, #0 + 1f13120: ea000018 b 1f13188 + 1f13124: e4d43001 ldrb r3, [r4], #1 + 1f13128: e5cd3001 strb r3, [sp, #1] + 1f1312c: e1560004 cmp r6, r4 + 1f13130: e5cdb000 strb fp, [sp] + 1f13134: 91a04005 movls r4, r5 + 1f13138: e4d43001 ldrb r3, [r4], #1 + 1f1313c: e5cd3002 strb r3, [sp, #2] + 1f13140: e1560004 cmp r6, r4 + 1f13144: 91a04005 movls r4, r5 + 1f13148: e4d42001 ldrb r2, [r4], #1 + 1f1314c: e5cd2003 strb r2, [sp, #3] + 1f13150: e1560004 cmp r6, r4 + 1f13154: 91a04005 movls r4, r5 + 1f13158: e4d43001 ldrb r3, [r4], #1 + 1f1315c: e1560004 cmp r6, r4 + 1f13160: 91a04005 movls r4, r5 + 1f13164: e5d4b000 ldrb fp, [r4] + 1f13168: e1a01009 mov r1, r9 + 1f1316c: e28aa001 add sl, sl, #1 + 1f13170: e1a0000d mov r0, sp + 1f13174: e5cd3004 strb r3, [sp, #4] + 1f13178: eb003379 bl 1f1ff64 + 1f1317c: e158000a cmp r8, sl + 1f13180: e2899004 add r9, r9, #4 + 1f13184: 0a000028 beq 1f1322c + 1f13188: e2844001 add r4, r4, #1 + 1f1318c: e1560004 cmp r6, r4 + 1f13190: 91a04005 movls r4, r5 + 1f13194: e3570000 cmp r7, #0 + 1f13198: 0affffe1 beq 1f13124 + 1f1319c: e4d41001 ldrb r1, [r4], #1 + 1f131a0: e1560004 cmp r6, r4 + 1f131a4: 91a04005 movls r4, r5 + 1f131a8: e1a01711 lsl r1, r1, r7 + 1f131ac: e18bb441 orr fp, fp, r1, asr #8 + 1f131b0: e5cdb000 strb fp, [sp] + 1f131b4: e4d43001 ldrb r3, [r4], #1 + 1f131b8: e1560004 cmp r6, r4 + 1f131bc: 91a04005 movls r4, r5 + 1f131c0: e1a03713 lsl r3, r3, r7 + 1f131c4: e1811443 orr r1, r1, r3, asr #8 + 1f131c8: e5cd1001 strb r1, [sp, #1] + 1f131cc: e4d42001 ldrb r2, [r4], #1 + 1f131d0: e1560004 cmp r6, r4 + 1f131d4: 91a04005 movls r4, r5 + 1f131d8: e1a02712 lsl r2, r2, r7 + 1f131dc: e1833442 orr r3, r3, r2, asr #8 + 1f131e0: e5cd3002 strb r3, [sp, #2] + 1f131e4: e4d43001 ldrb r3, [r4], #1 + 1f131e8: e6ef2072 uxtb r2, r2 + 1f131ec: e1560004 cmp r6, r4 + 1f131f0: e1a03713 lsl r3, r3, r7 + 1f131f4: 91a04005 movls r4, r5 + 1f131f8: e1822443 orr r2, r2, r3, asr #8 + 1f131fc: e6ef3073 uxtb r3, r3 + 1f13200: e5cd2003 strb r2, [sp, #3] + 1f13204: 8a000005 bhi 1f13220 + 1f13208: e5d4b000 ldrb fp, [r4] + 1f1320c: e1a0b71b lsl fp, fp, r7 + 1f13210: e183344b orr r3, r3, fp, asr #8 + 1f13214: e6efb07b uxtb fp, fp + 1f13218: e6ef3073 uxtb r3, r3 + 1f1321c: eaffffd1 b 1f13168 + 1f13220: e3570000 cmp r7, #0 + 1f13224: 0affffce beq 1f13164 + 1f13228: eafffff6 b 1f13208 + 1f1322c: e28dd00c add sp, sp, #12 + 1f13230: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + +01f13234 : + 1f13234: e0801681 add r1, r0, r1, lsl #13 + 1f13238: e92d4030 push {r4, r5, lr} + 1f1323c: e081c1c2 add ip, r1, r2, asr #3 + 1f13240: e202e007 and lr, r2, #7 + 1f13244: e59d000c ldr r0, [sp, #12] + 1f13248: e3a05001 mov r5, #1 + 1f1324c: e3a04000 mov r4, #0 + 1f13250: e5dcc010 ldrb ip, [ip, #16] + 1f13254: e1a0ee1c lsl lr, ip, lr + 1f13258: e6efe07e uxtb lr, lr + 1f1325c: ea000003 b 1f13270 + 1f13260: e1a0e08e lsl lr, lr, #1 + 1f13264: e2822001 add r2, r2, #1 + 1f13268: e6efe07e uxtb lr, lr + 1f1326c: e2433001 sub r3, r3, #1 + 1f13270: e3530000 cmp r3, #0 + 1f13274: 0a00001a beq 1f132e4 + 1f13278: e31e0080 tst lr, #128 ; 0x80 + 1f1327c: 1a00000f bne 1f132c0 + 1f13280: e1e0c004 mvn ip, r4 + 1f13284: e7e9c05c ubfx ip, ip, #0, #10 + 1f13288: e35c0000 cmp ip, #0 + 1f1328c: 0a000016 beq 1f132ec + 1f13290: e1a04084 lsl r4, r4, #1 + 1f13294: e3a05001 mov r5, #1 + 1f13298: e1e0c002 mvn ip, r2 + 1f1329c: e21cc007 ands ip, ip, #7 + 1f132a0: 1affffee bne 1f13260 + 1f132a4: e2822001 add r2, r2, #1 + 1f132a8: e3520801 cmp r2, #65536 ; 0x10000 + 1f132ac: b1a0c1c2 asrlt ip, r2, #3 + 1f132b0: a1a0200c movge r2, ip + 1f132b4: e081c00c add ip, r1, ip + 1f132b8: e5dce010 ldrb lr, [ip, #16] + 1f132bc: eaffffea b 1f1326c + 1f132c0: e3500000 cmp r0, #0 + 1f132c4: 03a05000 moveq r5, #0 + 1f132c8: 12055001 andne r5, r5, #1 + 1f132cc: e1a04084 lsl r4, r4, #1 + 1f132d0: e3550000 cmp r5, #0 + 1f132d4: e3844001 orr r4, r4, #1 + 1f132d8: 15802000 strne r2, [r0] + 1f132dc: e3a05000 mov r5, #0 + 1f132e0: eaffffec b 1f13298 + 1f132e4: e3e00000 mvn r0, #0 + 1f132e8: e8bd8030 pop {r4, r5, pc} + 1f132ec: e1a00002 mov r0, r2 + 1f132f0: e8bd8030 pop {r4, r5, pc} + +01f132f4 : + 1f132f4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f132f8: e3a07000 mov r7, #0 + 1f132fc: e24dd03c sub sp, sp, #60 ; 0x3c + 1f13300: e1a05007 mov r5, r7 + 1f13304: e58d2018 str r2, [sp, #24] + 1f13308: e1a02681 lsl r2, r1, #13 + 1f1330c: e58d301c str r3, [sp, #28] + 1f13310: e0803002 add r3, r0, r2 + 1f13314: e58d1010 str r1, [sp, #16] + 1f13318: e58d3008 str r3, [sp, #8] + 1f1331c: e2823010 add r3, r2, #16 + 1f13320: e58d000c str r0, [sp, #12] + 1f13324: e58d3014 str r3, [sp, #20] + 1f13328: e3e03000 mvn r3, #0 + 1f1332c: e58d7004 str r7, [sp, #4] + 1f13330: e58d3000 str r3, [sp] + 1f13334: e59dc008 ldr ip, [sp, #8] + 1f13338: e3a00801 mov r0, #65536 ; 0x10000 + 1f1333c: e59d2004 ldr r2, [sp, #4] + 1f13340: e3a01000 mov r1, #0 + 1f13344: e08c2002 add r2, ip, r2 + 1f13348: e5d22010 ldrb r2, [r2, #16] + 1f1334c: e1a03512 lsl r3, r2, r5 + 1f13350: e6ef3073 uxtb r3, r3 + 1f13354: ea000004 b 1f1336c + 1f13358: e1a03083 lsl r3, r3, #1 + 1f1335c: e2500001 subs r0, r0, #1 + 1f13360: e2877001 add r7, r7, #1 + 1f13364: e6ef3073 uxtb r3, r3 + 1f13368: 0a000013 beq 1f133bc + 1f1336c: e3130080 tst r3, #128 ; 0x80 + 1f13370: 11a01081 lslne r1, r1, #1 + 1f13374: 13811001 orrne r1, r1, #1 + 1f13378: 1a000004 bne 1f13390 + 1f1337c: e1e02001 mvn r2, r1 + 1f13380: e7e92052 ubfx r2, r2, #0, #10 + 1f13384: e3520000 cmp r2, #0 + 1f13388: 0a00000c beq 1f133c0 + 1f1338c: e1a01081 lsl r1, r1, #1 + 1f13390: e1e02007 mvn r2, r7 + 1f13394: e2122007 ands r2, r2, #7 + 1f13398: 1affffee bne 1f13358 + 1f1339c: e2877001 add r7, r7, #1 + 1f133a0: e3570801 cmp r7, #65536 ; 0x10000 + 1f133a4: b1a021c7 asrlt r2, r7, #3 + 1f133a8: a1a07002 movge r7, r2 + 1f133ac: e08c2002 add r2, ip, r2 + 1f133b0: e2500001 subs r0, r0, #1 + 1f133b4: e5d23010 ldrb r3, [r2, #16] + 1f133b8: 1affffeb bne 1f1336c + 1f133bc: e3e07000 mvn r7, #0 + 1f133c0: e59d3000 ldr r3, [sp] + 1f133c4: e1530007 cmp r3, r7 + 1f133c8: 0a000068 beq 1f13570 + 1f133cc: e59d000c ldr r0, [sp, #12] + 1f133d0: e1a011c7 asr r1, r7, #3 + 1f133d4: e59dc014 ldr ip, [sp, #20] + 1f133d8: e2075007 and r5, r7, #7 + 1f133dc: e59d2010 ldr r2, [sp, #16] + 1f133e0: e28db02c add fp, sp, #44 ; 0x2c + 1f133e4: e080800c add r8, r0, ip + 1f133e8: e58d1004 str r1, [sp, #4] + 1f133ec: e2822915 add r2, r2, #344064 ; 0x54000 + 1f133f0: e1a0c001 mov ip, r1 + 1f133f4: e2822008 add r2, r2, #8 + 1f133f8: e2531000 subs r1, r3, #0 + 1f133fc: b1a01007 movlt r1, r7 + 1f13400: e7d861c7 ldrb r6, [r8, r7, asr #3] + 1f13404: e58d1000 str r1, [sp] + 1f13408: e1a01082 lsl r1, r2, #1 + 1f1340c: e088400c add r4, r8, ip + 1f13410: e28da034 add sl, sp, #52 ; 0x34 + 1f13414: e1a06516 lsl r6, r6, r5 + 1f13418: e19090b1 ldrh r9, [r0, r1] + 1f1341c: e6ef6076 uxtb r6, r6 + 1f13420: e0889009 add r9, r8, r9 + 1f13424: ea000017 b 1f13488 + 1f13428: e4d43001 ldrb r3, [r4], #1 + 1f1342c: e5cd3025 strb r3, [sp, #37] ; 0x25 + 1f13430: e1590004 cmp r9, r4 + 1f13434: e5cd6024 strb r6, [sp, #36] ; 0x24 + 1f13438: 91a04008 movls r4, r8 + 1f1343c: e4d43001 ldrb r3, [r4], #1 + 1f13440: e5cd3026 strb r3, [sp, #38] ; 0x26 + 1f13444: e1590004 cmp r9, r4 + 1f13448: 91a04008 movls r4, r8 + 1f1344c: e4d42001 ldrb r2, [r4], #1 + 1f13450: e5cd2027 strb r2, [sp, #39] ; 0x27 + 1f13454: e1590004 cmp r9, r4 + 1f13458: 91a04008 movls r4, r8 + 1f1345c: e4d43001 ldrb r3, [r4], #1 + 1f13460: e1590004 cmp r9, r4 + 1f13464: 91a04008 movls r4, r8 + 1f13468: e5d46000 ldrb r6, [r4] + 1f1346c: e1a0100b mov r1, fp + 1f13470: e28d0024 add r0, sp, #36 ; 0x24 + 1f13474: e28bb004 add fp, fp, #4 + 1f13478: e5cd3028 strb r3, [sp, #40] ; 0x28 + 1f1347c: eb0032b8 bl 1f1ff64 + 1f13480: e15b000a cmp fp, sl + 1f13484: 0a000028 beq 1f1352c + 1f13488: e2844001 add r4, r4, #1 + 1f1348c: e1540009 cmp r4, r9 + 1f13490: 21a04008 movcs r4, r8 + 1f13494: e3550000 cmp r5, #0 + 1f13498: 0affffe2 beq 1f13428 + 1f1349c: e4d41001 ldrb r1, [r4], #1 + 1f134a0: e1590004 cmp r9, r4 + 1f134a4: 91a04008 movls r4, r8 + 1f134a8: e1a01511 lsl r1, r1, r5 + 1f134ac: e1866441 orr r6, r6, r1, asr #8 + 1f134b0: e5cd6024 strb r6, [sp, #36] ; 0x24 + 1f134b4: e4d43001 ldrb r3, [r4], #1 + 1f134b8: e1590004 cmp r9, r4 + 1f134bc: 91a04008 movls r4, r8 + 1f134c0: e1a03513 lsl r3, r3, r5 + 1f134c4: e1811443 orr r1, r1, r3, asr #8 + 1f134c8: e5cd1025 strb r1, [sp, #37] ; 0x25 + 1f134cc: e4d42001 ldrb r2, [r4], #1 + 1f134d0: e1590004 cmp r9, r4 + 1f134d4: 91a04008 movls r4, r8 + 1f134d8: e1a02512 lsl r2, r2, r5 + 1f134dc: e1833442 orr r3, r3, r2, asr #8 + 1f134e0: e5cd3026 strb r3, [sp, #38] ; 0x26 + 1f134e4: e4d43001 ldrb r3, [r4], #1 + 1f134e8: e6ef2072 uxtb r2, r2 + 1f134ec: e1590004 cmp r9, r4 + 1f134f0: e1a03513 lsl r3, r3, r5 + 1f134f4: 91a04008 movls r4, r8 + 1f134f8: e1822443 orr r2, r2, r3, asr #8 + 1f134fc: e6ef3073 uxtb r3, r3 + 1f13500: e5cd2027 strb r2, [sp, #39] ; 0x27 + 1f13504: 8a000005 bhi 1f13520 + 1f13508: e5d46000 ldrb r6, [r4] + 1f1350c: e1a06516 lsl r6, r6, r5 + 1f13510: e1833446 orr r3, r3, r6, asr #8 + 1f13514: e6ef6076 uxtb r6, r6 + 1f13518: e6ef3073 uxtb r3, r3 + 1f1351c: eaffffd2 b 1f1346c + 1f13520: e3550000 cmp r5, #0 + 1f13524: 0affffcf beq 1f13468 + 1f13528: eafffff6 b 1f13508 + 1f1352c: e5dd202c ldrb r2, [sp, #44] ; 0x2c + 1f13530: e3520008 cmp r2, #8 + 1f13534: 1affff7e bne 1f13334 + 1f13538: e5dd202e ldrb r2, [sp, #46] ; 0x2e + 1f1353c: e59d3018 ldr r3, [sp, #24] + 1f13540: e1520003 cmp r2, r3 + 1f13544: 1affff7a bne 1f13334 + 1f13548: e59d101c ldr r1, [sp, #28] + 1f1354c: e3510000 cmp r1, #0 + 1f13550: 0a000009 beq 1f1357c + 1f13554: e5dd2031 ldrb r2, [sp, #49] ; 0x31 + 1f13558: e1a00007 mov r0, r7 + 1f1355c: e5dd3030 ldrb r3, [sp, #48] ; 0x30 + 1f13560: e5c12000 strb r2, [r1] + 1f13564: e5c13001 strb r3, [r1, #1] + 1f13568: e28dd03c add sp, sp, #60 ; 0x3c + 1f1356c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f13570: e3e00000 mvn r0, #0 + 1f13574: e28dd03c add sp, sp, #60 ; 0x3c + 1f13578: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f1357c: e1a00007 mov r0, r7 + 1f13580: eafffffb b 1f13574 + +01f13584 : + 1f13584: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f13588: e1a07003 mov r7, r3 + 1f1358c: e3a03000 mov r3, #0 + 1f13590: e24ddf45 sub sp, sp, #276 ; 0x114 + 1f13594: e1a06000 mov r6, r0 + 1f13598: e1a04001 mov r4, r1 + 1f1359c: ebffff54 bl 1f132f4 + 1f135a0: e3500000 cmp r0, #0 + 1f135a4: ba000022 blt 1f13634 + 1f135a8: e1a05684 lsl r5, r4, #13 + 1f135ac: e2002007 and r2, r0, #7 + 1f135b0: e086e005 add lr, r6, r5 + 1f135b4: e3a0cd41 mov ip, #4160 ; 0x1040 + 1f135b8: e08e31c0 add r3, lr, r0, asr #3 + 1f135bc: e3a01000 mov r1, #0 + 1f135c0: e5d33010 ldrb r3, [r3, #16] + 1f135c4: e1a02213 lsl r2, r3, r2 + 1f135c8: e6ef2072 uxtb r2, r2 + 1f135cc: ea000004 b 1f135e4 + 1f135d0: e1a02082 lsl r2, r2, #1 + 1f135d4: e25cc001 subs ip, ip, #1 + 1f135d8: e2800001 add r0, r0, #1 + 1f135dc: e6ef2072 uxtb r2, r2 + 1f135e0: 0a000013 beq 1f13634 + 1f135e4: e3120080 tst r2, #128 ; 0x80 + 1f135e8: 11a01081 lslne r1, r1, #1 + 1f135ec: 13811001 orrne r1, r1, #1 + 1f135f0: 1a000004 bne 1f13608 + 1f135f4: e1e03001 mvn r3, r1 + 1f135f8: e7e93053 ubfx r3, r3, #0, #10 + 1f135fc: e3530000 cmp r3, #0 + 1f13600: 0a00000e beq 1f13640 + 1f13604: e1a01081 lsl r1, r1, #1 + 1f13608: e1e03000 mvn r3, r0 + 1f1360c: e2133007 ands r3, r3, #7 + 1f13610: 1affffee bne 1f135d0 + 1f13614: e2800001 add r0, r0, #1 + 1f13618: e3500801 cmp r0, #65536 ; 0x10000 + 1f1361c: b1a031c0 asrlt r3, r0, #3 + 1f13620: a1a00003 movge r0, r3 + 1f13624: e08e3003 add r3, lr, r3 + 1f13628: e25cc001 subs ip, ip, #1 + 1f1362c: e5d32010 ldrb r2, [r3, #16] + 1f13630: 1affffeb bne 1f135e4 + 1f13634: e3a00000 mov r0, #0 + 1f13638: e28ddf45 add sp, sp, #276 ; 0x114 + 1f1363c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f13640: e2855010 add r5, r5, #16 + 1f13644: e2843915 add r3, r4, #344064 ; 0x54000 + 1f13648: e0865005 add r5, r6, r5 + 1f1364c: e2833008 add r3, r3, #8 + 1f13650: e2009007 and r9, r0, #7 + 1f13654: e08541c0 add r4, r5, r0, asr #3 + 1f13658: e1a03083 lsl r3, r3, #1 + 1f1365c: e28da008 add sl, sp, #8 + 1f13660: e7d5b1c0 ldrb fp, [r5, r0, asr #3] + 1f13664: e28d8f43 add r8, sp, #268 ; 0x10c + 1f13668: e19660b3 ldrh r6, [r6, r3] + 1f1366c: e1a0b91b lsl fp, fp, r9 + 1f13670: e0856006 add r6, r5, r6 + 1f13674: e6efb07b uxtb fp, fp + 1f13678: ea000017 b 1f136dc + 1f1367c: e4d43001 ldrb r3, [r4], #1 + 1f13680: e5cd3001 strb r3, [sp, #1] + 1f13684: e1560004 cmp r6, r4 + 1f13688: e5cdb000 strb fp, [sp] + 1f1368c: 91a04005 movls r4, r5 + 1f13690: e4d43001 ldrb r3, [r4], #1 + 1f13694: e5cd3002 strb r3, [sp, #2] + 1f13698: e1560004 cmp r6, r4 + 1f1369c: 91a04005 movls r4, r5 + 1f136a0: e4d42001 ldrb r2, [r4], #1 + 1f136a4: e5cd2003 strb r2, [sp, #3] + 1f136a8: e1560004 cmp r6, r4 + 1f136ac: 91a04005 movls r4, r5 + 1f136b0: e4d43001 ldrb r3, [r4], #1 + 1f136b4: e1560004 cmp r6, r4 + 1f136b8: 91a04005 movls r4, r5 + 1f136bc: e5d4b000 ldrb fp, [r4] + 1f136c0: e1a0100a mov r1, sl + 1f136c4: e1a0000d mov r0, sp + 1f136c8: e28aa004 add sl, sl, #4 + 1f136cc: e5cd3004 strb r3, [sp, #4] + 1f136d0: eb003223 bl 1f1ff64 + 1f136d4: e15a0008 cmp sl, r8 + 1f136d8: 0a000028 beq 1f13780 + 1f136dc: e2844001 add r4, r4, #1 + 1f136e0: e1540006 cmp r4, r6 + 1f136e4: 21a04005 movcs r4, r5 + 1f136e8: e3590000 cmp r9, #0 + 1f136ec: 0affffe2 beq 1f1367c + 1f136f0: e4d41001 ldrb r1, [r4], #1 + 1f136f4: e1560004 cmp r6, r4 + 1f136f8: 91a04005 movls r4, r5 + 1f136fc: e1a01911 lsl r1, r1, r9 + 1f13700: e18bb441 orr fp, fp, r1, asr #8 + 1f13704: e5cdb000 strb fp, [sp] + 1f13708: e4d43001 ldrb r3, [r4], #1 + 1f1370c: e1560004 cmp r6, r4 + 1f13710: 91a04005 movls r4, r5 + 1f13714: e1a03913 lsl r3, r3, r9 + 1f13718: e1811443 orr r1, r1, r3, asr #8 + 1f1371c: e5cd1001 strb r1, [sp, #1] + 1f13720: e4d42001 ldrb r2, [r4], #1 + 1f13724: e1560004 cmp r6, r4 + 1f13728: 91a04005 movls r4, r5 + 1f1372c: e1a02912 lsl r2, r2, r9 + 1f13730: e1833442 orr r3, r3, r2, asr #8 + 1f13734: e5cd3002 strb r3, [sp, #2] + 1f13738: e4d43001 ldrb r3, [r4], #1 + 1f1373c: e6ef2072 uxtb r2, r2 + 1f13740: e1560004 cmp r6, r4 + 1f13744: e1a03913 lsl r3, r3, r9 + 1f13748: 91a04005 movls r4, r5 + 1f1374c: e1822443 orr r2, r2, r3, asr #8 + 1f13750: e6ef3073 uxtb r3, r3 + 1f13754: e5cd2003 strb r2, [sp, #3] + 1f13758: 8a000005 bhi 1f13774 + 1f1375c: e5d4b000 ldrb fp, [r4] + 1f13760: e1a0b91b lsl fp, fp, r9 + 1f13764: e183344b orr r3, r3, fp, asr #8 + 1f13768: e6efb07b uxtb fp, fp + 1f1376c: e6ef3073 uxtb r3, r3 + 1f13770: eaffffd2 b 1f136c0 + 1f13774: e3590000 cmp r9, #0 + 1f13778: 0affffcf beq 1f136bc + 1f1377c: eafffff6 b 1f1375c + 1f13780: e5dd3009 ldrb r3, [sp, #9] + 1f13784: e287500f add r5, r7, #15 + 1f13788: e5dd2109 ldrb r2, [sp, #265] ; 0x109 + 1f1378c: e287401f add r4, r7, #31 + 1f13790: e5dd000a ldrb r0, [sp, #10] + 1f13794: e287e02f add lr, r7, #47 ; 0x2f + 1f13798: e5ddc00b ldrb ip, [sp, #11] + 1f1379c: e0222003 eor r2, r2, r3 + 1f137a0: e5dd100c ldrb r1, [sp, #12] + 1f137a4: e287805f add r8, r7, #95 ; 0x5f + 1f137a8: e5c73000 strb r3, [r7] + 1f137ac: e0203002 eor r3, r0, r2 + 1f137b0: e5c70001 strb r0, [r7, #1] + 1f137b4: e023300c eor r3, r3, ip + 1f137b8: e5dd000d ldrb r0, [sp, #13] + 1f137bc: e0233001 eor r3, r3, r1 + 1f137c0: e5dd200e ldrb r2, [sp, #14] + 1f137c4: f2c06050 vmov.i32 q11, #0 ; 0x00000000 + 1f137c8: e5c71003 strb r1, [r7, #3] + 1f137cc: e0233000 eor r3, r3, r0 + 1f137d0: e5dd100f ldrb r1, [sp, #15] + 1f137d4: e0233002 eor r3, r3, r2 + 1f137d8: e5c72005 strb r2, [r7, #5] + 1f137dc: e5dd2010 ldrb r2, [sp, #16] + 1f137e0: e0233001 eor r3, r3, r1 + 1f137e4: e5c72007 strb r2, [r7, #7] + 1f137e8: e0222003 eor r2, r2, r3 + 1f137ec: e5dd3011 ldrb r3, [sp, #17] + 1f137f0: e5dd6012 ldrb r6, [sp, #18] + 1f137f4: eddd0b06 vldr d16, [sp, #24] + 1f137f8: eddd1b08 vldr d17, [sp, #32] + 1f137fc: e5c71006 strb r1, [r7, #6] + 1f13800: e5c73008 strb r3, [r7, #8] + 1f13804: e0233002 eor r3, r3, r2 + 1f13808: e5dd1013 ldrb r1, [sp, #19] + 1f1380c: e0233006 eor r3, r3, r6 + 1f13810: e5dd2014 ldrb r2, [sp, #20] + 1f13814: e5c7100a strb r1, [r7, #10] + 1f13818: e0211003 eor r1, r1, r3 + 1f1381c: e5c76009 strb r6, [r7, #9] + 1f13820: e5dd3016 ldrb r3, [sp, #22] + 1f13824: e5dd6015 ldrb r6, [sp, #21] + 1f13828: e5c7200b strb r2, [r7, #11] + 1f1382c: e0222001 eor r2, r2, r1 + 1f13830: e5dd1017 ldrb r1, [sp, #23] + 1f13834: e0222006 eor r2, r2, r6 + 1f13838: e5c7c002 strb ip, [r7, #2] + 1f1383c: e287c03f add ip, r7, #63 ; 0x3f + 1f13840: e5c70004 strb r0, [r7, #4] + 1f13844: e287004f add r0, r7, #79 ; 0x4f + 1f13848: e5c7600c strb r6, [r7, #12] + 1f1384c: e287606f add r6, r7, #111 ; 0x6f + 1f13850: e5c7300d strb r3, [r7, #13] + 1f13854: e0233002 eor r3, r3, r2 + 1f13858: e5c7100e strb r1, [r7, #14] + 1f1385c: f4450a0f vst1.8 {d16-d17}, [r5] + 1f13860: eddd2b0a vldr d18, [sp, #40] ; 0x28 + 1f13864: eddd3b0c vldr d19, [sp, #48] ; 0x30 + 1f13868: e287507f add r5, r7, #127 ; 0x7f + 1f1386c: e0233001 eor r3, r3, r1 + 1f13870: eddd4b0e vldr d20, [sp, #56] ; 0x38 + 1f13874: eddd5b10 vldr d21, [sp, #64] ; 0x40 + 1f13878: e287108f add r1, r7, #143 ; 0x8f + 1f1387c: eddd8b1e vldr d24, [sp, #120] ; 0x78 + 1f13880: eddd9b20 vldr d25, [sp, #128] ; 0x80 + 1f13884: f34001f2 veor q8, q8, q9 + 1f13888: f4442a0f vst1.8 {d18-d19}, [r4] + 1f1388c: eddd2b12 vldr d18, [sp, #72] ; 0x48 + 1f13890: eddd3b14 vldr d19, [sp, #80] ; 0x50 + 1f13894: f44e4a0f vst1.8 {d20-d21}, [lr] + 1f13898: e28740af add r4, r7, #175 ; 0xaf + 1f1389c: e5dd2008 ldrb r2, [sp, #8] + 1f138a0: e287e0bf add lr, r7, #191 ; 0xbf + 1f138a4: f34001f4 veor q8, q8, q10 + 1f138a8: eddd4b16 vldr d20, [sp, #88] ; 0x58 + 1f138ac: eddd5b18 vldr d21, [sp, #96] ; 0x60 + 1f138b0: e3520007 cmp r2, #7 + 1f138b4: f44c2a0f vst1.8 {d18-d19}, [ip] + 1f138b8: e287209f add r2, r7, #159 ; 0x9f + 1f138bc: e287c0cf add ip, r7, #207 ; 0xcf + 1f138c0: f34001f2 veor q8, q8, q9 + 1f138c4: eddd2b1a vldr d18, [sp, #104] ; 0x68 + 1f138c8: eddd3b1c vldr d19, [sp, #112] ; 0x70 + 1f138cc: f4404a0f vst1.8 {d20-d21}, [r0] + 1f138d0: e28700df add r0, r7, #223 ; 0xdf + 1f138d4: f34041f4 veor q10, q8, q10 + 1f138d8: eddd0b22 vldr d16, [sp, #136] ; 0x88 + 1f138dc: eddd1b24 vldr d17, [sp, #144] ; 0x90 + 1f138e0: f4482a0f vst1.8 {d18-d19}, [r8] + 1f138e4: f4468a0f vst1.8 {d24-d25}, [r6] + 1f138e8: f34421f2 veor q9, q10, q9 + 1f138ec: eddd4b2a vldr d20, [sp, #168] ; 0xa8 + 1f138f0: eddd5b2c vldr d21, [sp, #176] ; 0xb0 + 1f138f4: f4450a0f vst1.8 {d16-d17}, [r5] + 1f138f8: f34221f8 veor q9, q9, q12 + 1f138fc: eddd8b26 vldr d24, [sp, #152] ; 0x98 + 1f13900: eddd9b28 vldr d25, [sp, #160] ; 0xa0 + 1f13904: f34201f0 veor q8, q9, q8 + 1f13908: eddd2b2e vldr d18, [sp, #184] ; 0xb8 + 1f1390c: eddd3b30 vldr d19, [sp, #192] ; 0xc0 + 1f13910: f4418a0f vst1.8 {d24-d25}, [r1] + 1f13914: e28710ef add r1, r7, #239 ; 0xef + 1f13918: f4424a0f vst1.8 {d20-d21}, [r2] + 1f1391c: e5dd2108 ldrb r2, [sp, #264] ; 0x108 + 1f13920: f34001f8 veor q8, q8, q12 + 1f13924: eddd8b32 vldr d24, [sp, #200] ; 0xc8 + 1f13928: eddd9b34 vldr d25, [sp, #208] ; 0xd0 + 1f1392c: f4442a0f vst1.8 {d18-d19}, [r4] + 1f13930: e0233002 eor r3, r3, r2 + 1f13934: f34041f4 veor q10, q8, q10 + 1f13938: eddd0b36 vldr d16, [sp, #216] ; 0xd8 + 1f1393c: eddd1b38 vldr d17, [sp, #224] ; 0xe0 + 1f13940: f44e8a0f vst1.8 {d24-d25}, [lr] + 1f13944: f34421f2 veor q9, q10, q9 + 1f13948: eddd4b3a vldr d20, [sp, #232] ; 0xe8 + 1f1394c: eddd5b3c vldr d21, [sp, #240] ; 0xf0 + 1f13950: f44c0a0f vst1.8 {d16-d17}, [ip] + 1f13954: f34221f8 veor q9, q9, q12 + 1f13958: f4404a0f vst1.8 {d20-d21}, [r0] + 1f1395c: f34201f0 veor q8, q9, q8 + 1f13960: eddd2b3e vldr d18, [sp, #248] ; 0xf8 + 1f13964: eddd3b40 vldr d19, [sp, #256] ; 0x100 + 1f13968: f34001f4 veor q8, q8, q10 + 1f1396c: f4412a0f vst1.8 {d18-d19}, [r1] + 1f13970: e5c720ff strb r2, [r7, #255] ; 0xff + 1f13974: f34201f0 veor q8, q9, q8 + 1f13978: f2f028e6 vext.8 q9, q8, q11, #8 + 1f1397c: f34201f0 veor q8, q9, q8 + 1f13980: f2f024e6 vext.8 q9, q8, q11, #4 + 1f13984: f34221f0 veor q9, q9, q8 + 1f13988: f2f202e6 vext.8 q8, q9, q11, #2 + 1f1398c: f34001f2 veor q8, q8, q9 + 1f13990: f2f061e6 vext.8 q11, q8, q11, #1 + 1f13994: f34601f0 veor q8, q11, q8 + 1f13998: eed02b90 vmov.u8 r2, d16[0] + 1f1399c: 1affff24 bne 1f13634 + 1f139a0: e0630002 rsb r0, r3, r2 + 1f139a4: e16f0f10 clz r0, r0 + 1f139a8: e1a002a0 lsr r0, r0, #5 + 1f139ac: e28ddf45 add sp, sp, #276 ; 0x114 + 1f139b0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + +01f139b4 : + 1f139b4: e3510000 cmp r1, #0 + 1f139b8: 0a000006 beq 1f139d8 + 1f139bc: e2411106 sub r1, r1, #-2147483647 ; 0x80000001 + 1f139c0: e1a01081 lsl r1, r1, #1 + 1f139c4: e080c001 add ip, r0, r1 + 1f139c8: e28cc92a add ip, ip, #688128 ; 0xa8000 + 1f139cc: e5dcc160 ldrb ip, [ip, #352] ; 0x160 + 1f139d0: e35c0000 cmp ip, #0 + 1f139d4: 1a000001 bne 1f139e0 + 1f139d8: e3a00000 mov r0, #0 + 1f139dc: e12fff1e bx lr + 1f139e0: eafffee7 b 1f13584 + +01f139e4 : + 1f139e4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f139e8: e1a07000 mov r7, r0 + 1f139ec: e3a0200a mov r2, #10 + 1f139f0: e24dd803 sub sp, sp, #196608 ; 0x30000 + 1f139f4: e24ddf95 sub sp, sp, #596 ; 0x254 + 1f139f8: e597100c ldr r1, [r7, #12] + 1f139fc: e28d0008 add r0, sp, #8 + 1f13a00: e281101a add r1, r1, #26 + 1f13a04: ebffe4c2 bl 1f0cd14 + 1f13a08: e250a000 subs sl, r0, #0 + 1f13a0c: 1a000045 bne 1f13b28 + 1f13a10: e30f01d0 movw r0, #61904 ; 0xf1d0 + 1f13a14: e34001f5 movt r0, #501 ; 0x1f5 + 1f13a18: eb00adcb bl 1f3f14c + 1f13a1c: e3a02803 mov r2, #196608 ; 0x30000 + 1f13a20: e1a0100a mov r1, sl + 1f13a24: e28d0e25 add r0, sp, #592 ; 0x250 + 1f13a28: eb00ad7b bl 1f3f01c + 1f13a2c: e1a0300d mov r3, sp + 1f13a30: e1a0200a mov r2, sl + 1f13a34: e3a01022 mov r1, #34 ; 0x22 + 1f13a38: e1a00007 mov r0, r7 + 1f13a3c: ebfffe2c bl 1f132f4 + 1f13a40: e3500000 cmp r0, #0 + 1f13a44: ba00004b blt 1f13b78 + 1f13a48: e30fb050 movw fp, #61520 ; 0xf050 + 1f13a4c: e340b1f5 movt fp, #501 ; 0x1f5 + 1f13a50: e1a0600a mov r6, sl + 1f13a54: e28d9e25 add r9, sp, #592 ; 0x250 + 1f13a58: e286392a add r3, r6, #688128 ; 0xa8000 + 1f13a5c: e2833e16 add r3, r3, #352 ; 0x160 + 1f13a60: e7d73003 ldrb r3, [r7, r3] + 1f13a64: e3530000 cmp r3, #0 + 1f13a68: 0a00000f beq 1f13aac + 1f13a6c: e7db80c6 ldrb r8, [fp, r6, asr #1] + 1f13a70: e3580000 cmp r8, #0 + 1f13a74: 0a00000c beq 1f13aac + 1f13a78: e1a05009 mov r5, r9 + 1f13a7c: e3a04000 mov r4, #0 + 1f13a80: e1a03005 mov r3, r5 + 1f13a84: e1a02004 mov r2, r4 + 1f13a88: e1a01006 mov r1, r6 + 1f13a8c: e2844001 add r4, r4, #1 + 1f13a90: e1a00007 mov r0, r7 + 1f13a94: e2855c01 add r5, r5, #256 ; 0x100 + 1f13a98: ebfffeb9 bl 1f13584 + 1f13a9c: e1540008 cmp r4, r8 + 1f13aa0: 1afffff6 bne 1f13a80 + 1f13aa4: e0899404 add r9, r9, r4, lsl #8 + 1f13aa8: e08aa004 add sl, sl, r4 + 1f13aac: e2866002 add r6, r6, #2 + 1f13ab0: e3560052 cmp r6, #82 ; 0x52 + 1f13ab4: 1affffe7 bne 1f13a58 + 1f13ab8: e3a00001 mov r0, #1 + 1f13abc: e1a0440a lsl r4, sl, #8 + 1f13ac0: ebffc394 bl 1f04918 + 1f13ac4: e1a02004 mov r2, r4 + 1f13ac8: e28d3004 add r3, sp, #4 + 1f13acc: e28d1e25 add r1, sp, #592 ; 0x250 + 1f13ad0: e28d0008 add r0, sp, #8 + 1f13ad4: ebffe922 bl 1f0df64 + 1f13ad8: e2505000 subs r5, r0, #0 + 1f13adc: 1a00001a bne 1f13b4c + 1f13ae0: e59d3004 ldr r3, [sp, #4] + 1f13ae4: e1540003 cmp r4, r3 + 1f13ae8: 1a000017 bne 1f13b4c + 1f13aec: e28d0008 add r0, sp, #8 + 1f13af0: ebffecac bl 1f0eda8 + 1f13af4: e597100c ldr r1, [r7, #12] + 1f13af8: e281001a add r0, r1, #26 + 1f13afc: ebfff80d bl 1f11b38 + 1f13b00: e1a00005 mov r0, r5 + 1f13b04: ebffc383 bl 1f04918 + 1f13b08: e1a0100a mov r1, sl + 1f13b0c: e30f0224 movw r0, #61988 ; 0xf224 + 1f13b10: e34001f5 movt r0, #501 ; 0x1f5 + 1f13b14: eb00ad8c bl 1f3f14c + 1f13b18: e3a00001 mov r0, #1 + 1f13b1c: e28dd803 add sp, sp, #196608 ; 0x30000 + 1f13b20: e28ddf95 add sp, sp, #596 ; 0x254 + 1f13b24: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f13b28: e597100c ldr r1, [r7, #12] + 1f13b2c: e30f00cc movw r0, #61644 ; 0xf0cc + 1f13b30: e34001f5 movt r0, #501 ; 0x1f5 + 1f13b34: e281101a add r1, r1, #26 + 1f13b38: eb00ad83 bl 1f3f14c + 1f13b3c: e3a00000 mov r0, #0 + 1f13b40: e28dd803 add sp, sp, #196608 ; 0x30000 + 1f13b44: e28ddf95 add sp, sp, #596 ; 0x254 + 1f13b48: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f13b4c: e3a00000 mov r0, #0 + 1f13b50: ebffc370 bl 1f04918 + 1f13b54: e30f0208 movw r0, #61960 ; 0xf208 + 1f13b58: e34001f5 movt r0, #501 ; 0x1f5 + 1f13b5c: eb00ad7a bl 1f3f14c + 1f13b60: e28d0008 add r0, sp, #8 + 1f13b64: ebffec8f bl 1f0eda8 + 1f13b68: e3a00000 mov r0, #0 + 1f13b6c: e28dd803 add sp, sp, #196608 ; 0x30000 + 1f13b70: e28ddf95 add sp, sp, #596 ; 0x254 + 1f13b74: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f13b78: e30f01e8 movw r0, #61928 ; 0xf1e8 + 1f13b7c: e34001f5 movt r0, #501 ; 0x1f5 + 1f13b80: eb00ad71 bl 1f3f14c + 1f13b84: e1a0000a mov r0, sl + 1f13b88: e28dd803 add sp, sp, #196608 ; 0x30000 + 1f13b8c: e28ddf95 add sp, sp, #596 ; 0x254 + 1f13b90: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + +01f13b94 : + 1f13b94: e5d03000 ldrb r3, [r0] + 1f13b98: e3530000 cmp r3, #0 + 1f13b9c: 0a000001 beq 1f13ba8 + 1f13ba0: e1a00003 mov r0, r3 + 1f13ba4: e12fff1e bx lr + 1f13ba8: eaffff8d b 1f139e4 + +01f13bac : + 1f13bac: e5d03001 ldrb r3, [r0, #1] + 1f13bb0: e92d4010 push {r4, lr} + 1f13bb4: e3530000 cmp r3, #0 + 1f13bb8: e1a04000 mov r4, r0 + 1f13bbc: 0a000004 beq 1f13bd4 + 1f13bc0: e5d03000 ldrb r3, [r0] + 1f13bc4: e3530000 cmp r3, #0 + 1f13bc8: 0a000004 beq 1f13be0 + 1f13bcc: e3a03000 mov r3, #0 + 1f13bd0: e5c43001 strb r3, [r4, #1] + 1f13bd4: e3a03000 mov r3, #0 + 1f13bd8: e5843004 str r3, [r4, #4] + 1f13bdc: e8bd8010 pop {r4, pc} + 1f13be0: ebffff7f bl 1f139e4 + 1f13be4: eafffff8 b 1f13bcc + +01f13be8 : + 1f13be8: e5d03008 ldrb r3, [r0, #8] + 1f13bec: e92d4010 push {r4, lr} + 1f13bf0: e2433001 sub r3, r3, #1 + 1f13bf4: e1a04000 mov r4, r0 + 1f13bf8: e3530003 cmp r3, #3 + 1f13bfc: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f13c00: ea00000d b 1f13c3c + 1f13c04: 01f13c14 .word 0x01f13c14 + 1f13c08: 01f13cb0 .word 0x01f13cb0 + 1f13c0c: 01f13c90 .word 0x01f13c90 + 1f13c10: 01f13c70 .word 0x01f13c70 + 1f13c14: e5d03001 ldrb r3, [r0, #1] + 1f13c18: e3530000 cmp r3, #0 + 1f13c1c: 0a000004 beq 1f13c34 + 1f13c20: e5d03000 ldrb r3, [r0] + 1f13c24: e3530000 cmp r3, #0 + 1f13c28: 0a000028 beq 1f13cd0 + 1f13c2c: e3a03000 mov r3, #0 + 1f13c30: e5c43001 strb r3, [r4, #1] + 1f13c34: e3a03000 mov r3, #0 + 1f13c38: e5843004 str r3, [r4, #4] + 1f13c3c: e3a0292a mov r2, #688128 ; 0xa8000 + 1f13c40: e3a01055 mov r1, #85 ; 0x55 + 1f13c44: e2840010 add r0, r4, #16 + 1f13c48: eb00acf3 bl 1f3f01c + 1f13c4c: e284092a add r0, r4, #688128 ; 0xa8000 + 1f13c50: e2800010 add r0, r0, #16 + 1f13c54: e3a020a8 mov r2, #168 ; 0xa8 + 1f13c58: e3a01000 mov r1, #0 + 1f13c5c: eb00acee bl 1f3f01c + 1f13c60: e3a03000 mov r3, #0 + 1f13c64: e5c43008 strb r3, [r4, #8] + 1f13c68: e584300c str r3, [r4, #12] + 1f13c6c: e8bd8010 pop {r4, pc} + 1f13c70: e5d03001 ldrb r3, [r0, #1] + 1f13c74: e3530000 cmp r3, #0 + 1f13c78: 0affffed beq 1f13c34 + 1f13c7c: e5d03000 ldrb r3, [r0] + 1f13c80: e3530000 cmp r3, #0 + 1f13c84: 1affffe8 bne 1f13c2c + 1f13c88: ebfffaed bl 1f12844 + 1f13c8c: eaffffe6 b 1f13c2c + 1f13c90: e5d03001 ldrb r3, [r0, #1] + 1f13c94: e3530000 cmp r3, #0 + 1f13c98: 0affffe5 beq 1f13c34 + 1f13c9c: e5d03000 ldrb r3, [r0] + 1f13ca0: e3530000 cmp r3, #0 + 1f13ca4: 1affffe0 bne 1f13c2c + 1f13ca8: ebfffa80 bl 1f126b0 + 1f13cac: eaffffde b 1f13c2c + 1f13cb0: e5d03001 ldrb r3, [r0, #1] + 1f13cb4: e3530000 cmp r3, #0 + 1f13cb8: 0affffdd beq 1f13c34 + 1f13cbc: e5d03000 ldrb r3, [r0] + 1f13cc0: e3530000 cmp r3, #0 + 1f13cc4: 1affffd8 bne 1f13c2c + 1f13cc8: ebfffb2a bl 1f12978 + 1f13ccc: eaffffd6 b 1f13c2c + 1f13cd0: ebffff43 bl 1f139e4 + 1f13cd4: eaffffd4 b 1f13c2c + +01f13cd8 : + 1f13cd8: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f13cdc: e1a06000 mov r6, r0 + 1f13ce0: e1a04003 mov r4, r3 + 1f13ce4: e24dd034 sub sp, sp, #52 ; 0x34 + 1f13ce8: e30635a2 movw r3, #26018 ; 0x65a2 + 1f13cec: e3403001 movt r3, #1 + 1f13cf0: e1a05001 mov r5, r1 + 1f13cf4: e1a07003 mov r7, r3 + 1f13cf8: e1a09002 mov r9, r2 + 1f13cfc: e58d2024 str r2, [sp, #36] ; 0x24 + 1f13d00: e286a92a add sl, r6, #688128 ; 0xa8000 + 1f13d04: e58d002c str r0, [sp, #44] ; 0x2c + 1f13d08: ebffffb6 bl 1f13be8 + 1f13d0c: e3540803 cmp r4, #196608 ; 0x30000 + 1f13d10: e28a200e add r2, sl, #14 + 1f13d14: 31a01004 movcc r1, r4 + 1f13d18: 23a01803 movcs r1, #196608 ; 0x30000 + 1f13d1c: e2863010 add r3, r6, #16 + 1f13d20: e3a08000 mov r8, #0 + 1f13d24: e58d2010 str r2, [sp, #16] + 1f13d28: e58d300c str r3, [sp, #12] + 1f13d2c: e0892007 add r2, r9, r7 + 1f13d30: e30f3050 movw r3, #61520 ; 0xf050 + 1f13d34: e34031f5 movt r3, #501 ; 0x1f5 + 1f13d38: e586500c str r5, [r6, #12] + 1f13d3c: e28aae16 add sl, sl, #352 ; 0x160 + 1f13d40: e58d101c str r1, [sp, #28] + 1f13d44: e3a07015 mov r7, #21 + 1f13d48: e5861004 str r1, [r6, #4] + 1f13d4c: e58d2028 str r2, [sp, #40] ; 0x28 + 1f13d50: e58d8018 str r8, [sp, #24] + 1f13d54: e58d3014 str r3, [sp, #20] + 1f13d58: e0873087 add r3, r7, r7, lsl #1 + 1f13d5c: e59d2010 ldr r2, [sp, #16] + 1f13d60: e2185001 ands r5, r8, #1 + 1f13d64: e0633203 rsb r3, r3, r3, lsl #4 + 1f13d68: e0873183 add r3, r7, r3, lsl #3 + 1f13d6c: e1e230b2 strh r3, [r2, #2]! + 1f13d70: 13a03000 movne r3, #0 + 1f13d74: 15ca3000 strbne r3, [sl] + 1f13d78: e58d2010 str r2, [sp, #16] + 1f13d7c: 1a000021 bne 1f13e08 + 1f13d80: e59d101c ldr r1, [sp, #28] + 1f13d84: e59d2018 ldr r2, [sp, #24] + 1f13d88: e1510002 cmp r1, r2 + 1f13d8c: 95ca5000 strbls r5, [sl] + 1f13d90: 9a00001c bls 1f13e08 + 1f13d94: e3570000 cmp r7, #0 + 1f13d98: e3a03001 mov r3, #1 + 1f13d9c: e5ca3000 strb r3, [sl] + 1f13da0: 0a000018 beq 1f13e08 + 1f13da4: e59d1024 ldr r1, [sp, #36] ; 0x24 + 1f13da8: e1a09338 lsr r9, r8, r3 + 1f13dac: e58da020 str sl, [sp, #32] + 1f13db0: e1a0b005 mov fp, r5 + 1f13db4: e59d400c ldr r4, [sp, #12] + 1f13db8: e0899003 add r9, r9, r3 + 1f13dbc: e59da028 ldr sl, [sp, #40] ; 0x28 + 1f13dc0: e0816002 add r6, r1, r2 + 1f13dc4: e1a03005 mov r3, r5 + 1f13dc8: e1a01004 mov r1, r4 + 1f13dcc: e1a00006 mov r0, r6 + 1f13dd0: e58db004 str fp, [sp, #4] + 1f13dd4: e58da000 str sl, [sp] + 1f13dd8: e2855001 add r5, r5, #1 + 1f13ddc: e1a02009 mov r2, r9 + 1f13de0: e2844f5a add r4, r4, #360 ; 0x168 + 1f13de4: eb003470 bl 1f20fac + 1f13de8: e1550007 cmp r5, r7 + 1f13dec: e2844001 add r4, r4, #1 + 1f13df0: e2866c01 add r6, r6, #256 ; 0x100 + 1f13df4: 1afffff2 bne 1f13dc4 + 1f13df8: e59d3018 ldr r3, [sp, #24] + 1f13dfc: e59da020 ldr sl, [sp, #32] + 1f13e00: e0833405 add r3, r3, r5, lsl #8 + 1f13e04: e58d3018 str r3, [sp, #24] + 1f13e08: e2888001 add r8, r8, #1 + 1f13e0c: e59d300c ldr r3, [sp, #12] + 1f13e10: e3580054 cmp r8, #84 ; 0x54 + 1f13e14: e28aa001 add sl, sl, #1 + 1f13e18: e2833a02 add r3, r3, #8192 ; 0x2000 + 1f13e1c: e58d300c str r3, [sp, #12] + 1f13e20: 159d3014 ldrne r3, [sp, #20] + 1f13e24: 17d370a8 ldrbne r7, [r3, r8, lsr #1] + 1f13e28: 1affffca bne 1f13d58 + 1f13e2c: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f13e30: e3a00001 mov r0, #1 + 1f13e34: e5c30008 strb r0, [r3, #8] + 1f13e38: e28dd034 add sp, sp, #52 ; 0x34 + 1f13e3c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + +01f13e40 : + 1f13e40: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f13e44: e1a06000 mov r6, r0 + 1f13e48: e1a0b002 mov fp, r2 + 1f13e4c: e24dd00c sub sp, sp, #12 + 1f13e50: e1a05001 mov r5, r1 + 1f13e54: e1a04003 mov r4, r3 + 1f13e58: e58d0004 str r0, [sp, #4] + 1f13e5c: ebffff61 bl 1f13be8 + 1f13e60: e1a0000b mov r0, fp + 1f13e64: e586500c str r5, [r6, #12] + 1f13e68: e30f1160 movw r1, #61792 ; 0xf160 + 1f13e6c: e34011f5 movt r1, #501 ; 0x1f5 + 1f13e70: e5864004 str r4, [r6, #4] + 1f13e74: e3a02008 mov r2, #8 + 1f13e78: eb00abb4 bl 1f3ed50 + 1f13e7c: e3500000 cmp r0, #0 + 1f13e80: 13a00000 movne r0, #0 + 1f13e84: 1a00002e bne 1f13f44 + 1f13e88: e5dba009 ldrb sl, [fp, #9] + 1f13e8c: e28b600c add r6, fp, #12 + 1f13e90: e35a0000 cmp sl, #0 + 1f13e94: 0a000026 beq 1f13f34 + 1f13e98: e59d2004 ldr r2, [sp, #4] + 1f13e9c: e3053318 movw r3, #21272 ; 0x5318 + 1f13ea0: e34031f6 movt r3, #502 ; 0x1f6 + 1f13ea4: e282492a add r4, r2, #688128 ; 0xa8000 + 1f13ea8: e2828010 add r8, r2, #16 + 1f13eac: e1a02003 mov r2, r3 + 1f13eb0: e28490b7 add r9, r4, #183 ; 0xb7 + 1f13eb4: e2847010 add r7, r4, #16 + 1f13eb8: e1a0300b mov r3, fp + 1f13ebc: e1a05000 mov r5, r0 + 1f13ec0: e2844e16 add r4, r4, #352 ; 0x160 + 1f13ec4: e1a0b002 mov fp, r2 + 1f13ec8: ea000009 b 1f13ef4 + 1f13ecc: e6ef2072 uxtb r2, r2 + 1f13ed0: e79b2102 ldr r2, [fp, r2, lsl #2] + 1f13ed4: e1c720b0 strh r2, [r7] + 1f13ed8: e5c4c000 strb ip, [r4] + 1f13edc: e2855001 add r5, r5, #1 + 1f13ee0: e2877002 add r7, r7, #2 + 1f13ee4: e155000a cmp r5, sl + 1f13ee8: e2844001 add r4, r4, #1 + 1f13eec: e2888a02 add r8, r8, #8192 ; 0x2000 + 1f13ef0: 0a00000f beq 1f13f34 + 1f13ef4: e496c004 ldr ip, [r6], #4 + 1f13ef8: e35c0000 cmp ip, #0 + 1f13efc: e596214c ldr r2, [r6, #332] ; 0x14c + 1f13f00: e5e92001 strb r2, [r9, #1]! + 1f13f04: 0afffff0 beq 1f13ecc + 1f13f08: e083100c add r1, r3, ip + 1f13f0c: e19320bc ldrh r2, [r3, ip] + 1f13f10: e1a00008 mov r0, r8 + 1f13f14: e2811002 add r1, r1, #2 + 1f13f18: e1c720b0 strh r2, [r7] + 1f13f1c: e58d3000 str r3, [sp] + 1f13f20: eb00abb6 bl 1f3ee00 + 1f13f24: e3a03001 mov r3, #1 + 1f13f28: e5c43000 strb r3, [r4] + 1f13f2c: e59d3000 ldr r3, [sp] + 1f13f30: eaffffe9 b 1f13edc + 1f13f34: e59d2004 ldr r2, [sp, #4] + 1f13f38: e3a03002 mov r3, #2 + 1f13f3c: e3a00001 mov r0, #1 + 1f13f40: e5c23008 strb r3, [r2, #8] + 1f13f44: e28dd00c add sp, sp, #12 + 1f13f48: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + +01f13f4c : + 1f13f4c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f13f50: e1a08000 mov r8, r0 + 1f13f54: e1a07002 mov r7, r2 + 1f13f58: e24dd014 sub sp, sp, #20 + 1f13f5c: e1a05001 mov r5, r1 + 1f13f60: e1a04003 mov r4, r3 + 1f13f64: ebffff1f bl 1f13be8 + 1f13f68: e1a00007 mov r0, r7 + 1f13f6c: e588500c str r5, [r8, #12] + 1f13f70: e30f1248 movw r1, #62024 ; 0xf248 + 1f13f74: e34011f5 movt r1, #501 ; 0x1f5 + 1f13f78: e5884004 str r4, [r8, #4] + 1f13f7c: e3a0200d mov r2, #13 + 1f13f80: eb00ab72 bl 1f3ed50 + 1f13f84: e3500000 cmp r0, #0 + 1f13f88: 13a00000 movne r0, #0 + 1f13f8c: 1a000041 bne 1f14098 + 1f13f90: e288392a add r3, r8, #688128 ; 0xa8000 + 1f13f94: e308215f movw r2, #33119 ; 0x815f + 1f13f98: e340200a movt r2, #10 + 1f13f9c: e28310b7 add r1, r3, #183 ; 0xb7 + 1f13fa0: e3055318 movw r5, #21272 ; 0x5318 + 1f13fa4: e34051f6 movt r5, #502 ; 0x1f6 + 1f13fa8: e0882002 add r2, r8, r2 + 1f13fac: e1a0e000 mov lr, r0 + 1f13fb0: e283300e add r3, r3, #14 + 1f13fb4: e5f1c001 ldrb ip, [r1, #1]! + 1f13fb8: e2800001 add r0, r0, #1 + 1f13fbc: e3500054 cmp r0, #84 ; 0x54 + 1f13fc0: e795c10c ldr ip, [r5, ip, lsl #2] + 1f13fc4: e1e3c0b2 strh ip, [r3, #2]! + 1f13fc8: e5e2e001 strb lr, [r2, #1]! + 1f13fcc: 1afffff8 bne 1f13fb4 + 1f13fd0: e5d74010 ldrb r4, [r7, #16] + 1f13fd4: e3540000 cmp r4, #0 + 1f13fd8: 0a000030 beq 1f140a0 + 1f13fdc: e305b308 movw fp, #21256 ; 0x5308 + 1f13fe0: e340b1f6 movt fp, #502 ; 0x1f6 + 1f13fe4: e2879c01 add r9, r7, #256 ; 0x100 + 1f13fe8: e3a0a000 mov sl, #0 + 1f13fec: e2444002 sub r4, r4, #2 + 1f13ff0: e5d7c011 ldrb ip, [r7, #17] + 1f13ff4: e0886004 add r6, r8, r4 + 1f13ff8: e2143001 ands r3, r4, #1 + 1f13ffc: e286692a add r6, r6, #688128 ; 0xa8000 + 1f14000: 13a03005 movne r3, #5 + 1f14004: e20cc003 and ip, ip, #3 + 1f14008: e1a020c4 asr r2, r4, #1 + 1f1400c: e1a01004 mov r1, r4 + 1f14010: e30f0258 movw r0, #62040 ; 0xf258 + 1f14014: e34001f5 movt r0, #501 ; 0x1f5 + 1f14018: e5c6c0b8 strb ip, [r6, #184] ; 0xb8 + 1f1401c: e28aa001 add sl, sl, #1 + 1f14020: eb00ac49 bl 1f3f14c + 1f14024: e0880684 add r0, r8, r4, lsl #13 + 1f14028: e2844915 add r4, r4, #344064 ; 0x54000 + 1f1402c: e5d610b8 ldrb r1, [r6, #184] ; 0xb8 + 1f14030: e2844008 add r4, r4, #8 + 1f14034: e3a03000 mov r3, #0 + 1f14038: e2800010 add r0, r0, #16 + 1f1403c: e28d200c add r2, sp, #12 + 1f14040: e1a04084 lsl r4, r4, #1 + 1f14044: e795e101 ldr lr, [r5, r1, lsl #2] + 1f14048: e79bc101 ldr ip, [fp, r1, lsl #2] + 1f1404c: e1a01009 mov r1, r9 + 1f14050: e58de004 str lr, [sp, #4] + 1f14054: e2899a02 add r9, r9, #8192 ; 0x2000 + 1f14058: e58dc000 str ip, [sp] + 1f1405c: e2877002 add r7, r7, #2 + 1f14060: eb0036dd bl 1f21bdc + 1f14064: e3a03001 mov r3, #1 + 1f14068: e18800b4 strh r0, [r8, r4] + 1f1406c: e5c63160 strb r3, [r6, #352] ; 0x160 + 1f14070: e5d74010 ldrb r4, [r7, #16] + 1f14074: e3540000 cmp r4, #0 + 1f14078: 1affffdb bne 1f13fec + 1f1407c: e1a0100a mov r1, sl + 1f14080: e30f027c movw r0, #62076 ; 0xf27c + 1f14084: e34001f5 movt r0, #501 ; 0x1f5 + 1f14088: eb00ac2f bl 1f3f14c + 1f1408c: e3a03003 mov r3, #3 + 1f14090: e3a00001 mov r0, #1 + 1f14094: e5c83008 strb r3, [r8, #8] + 1f14098: e28dd014 add sp, sp, #20 + 1f1409c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f140a0: e1a0a004 mov sl, r4 + 1f140a4: eafffff4 b 1f1407c + +01f140a8 : + 1f140a8: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f140ac: e1a05002 mov r5, r2 + 1f140b0: e5d02008 ldrb r2, [r0, #8] + 1f140b4: e1a04000 mov r4, r0 + 1f140b8: e1a07001 mov r7, r1 + 1f140bc: e2422001 sub r2, r2, #1 + 1f140c0: e1a06003 mov r6, r3 + 1f140c4: e3520003 cmp r2, #3 + 1f140c8: 979ff102 ldrls pc, [pc, r2, lsl #2] + 1f140cc: ea00000d b 1f14108 + 1f140d0: 01f1419c .word 0x01f1419c + 1f140d4: 01f140e0 .word 0x01f140e0 + 1f140d8: 01f1417c .word 0x01f1417c + 1f140dc: 01f1415c .word 0x01f1415c + 1f140e0: e5d03001 ldrb r3, [r0, #1] + 1f140e4: e3530000 cmp r3, #0 + 1f140e8: 0a000004 beq 1f14100 + 1f140ec: e5d03000 ldrb r3, [r0] + 1f140f0: e3530000 cmp r3, #0 + 1f140f4: 0a00003a beq 1f141e4 + 1f140f8: e3a03000 mov r3, #0 + 1f140fc: e5c43001 strb r3, [r4, #1] + 1f14100: e3a03000 mov r3, #0 + 1f14104: e5843004 str r3, [r4, #4] + 1f14108: e3a0292a mov r2, #688128 ; 0xa8000 + 1f1410c: e3a01055 mov r1, #85 ; 0x55 + 1f14110: e2840010 add r0, r4, #16 + 1f14114: eb00abc0 bl 1f3f01c + 1f14118: e284092a add r0, r4, #688128 ; 0xa8000 + 1f1411c: e3a020a8 mov r2, #168 ; 0xa8 + 1f14120: e3a01000 mov r1, #0 + 1f14124: e2800010 add r0, r0, #16 + 1f14128: eb00abbb bl 1f3f01c + 1f1412c: e3a03000 mov r3, #0 + 1f14130: e1a02006 mov r2, r6 + 1f14134: e5c43008 strb r3, [r4, #8] + 1f14138: e584300c str r3, [r4, #12] + 1f1413c: e1a00005 mov r0, r5 + 1f14140: e3021298 movw r1, #8856 ; 0x2298 + 1f14144: e3401203 movt r1, #515 ; 0x203 + 1f14148: eb0040c3 bl 1f2445c + 1f1414c: e2503000 subs r3, r0, #0 + 1f14150: 1a000019 bne 1f141bc + 1f14154: e3a00000 mov r0, #0 + 1f14158: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f1415c: e5d03001 ldrb r3, [r0, #1] + 1f14160: e3530000 cmp r3, #0 + 1f14164: 0affffe5 beq 1f14100 + 1f14168: e5d03000 ldrb r3, [r0] + 1f1416c: e3530000 cmp r3, #0 + 1f14170: 1affffe0 bne 1f140f8 + 1f14174: ebfff9b2 bl 1f12844 + 1f14178: eaffffde b 1f140f8 + 1f1417c: e5d03001 ldrb r3, [r0, #1] + 1f14180: e3530000 cmp r3, #0 + 1f14184: 0affffdd beq 1f14100 + 1f14188: e5d03000 ldrb r3, [r0] + 1f1418c: e3530000 cmp r3, #0 + 1f14190: 1affffd8 bne 1f140f8 + 1f14194: ebfff945 bl 1f126b0 + 1f14198: eaffffd6 b 1f140f8 + 1f1419c: e5d03001 ldrb r3, [r0, #1] + 1f141a0: e3530000 cmp r3, #0 + 1f141a4: 0affffd5 beq 1f14100 + 1f141a8: e5d03000 ldrb r3, [r0] + 1f141ac: e3530000 cmp r3, #0 + 1f141b0: 1affffd0 bne 1f140f8 + 1f141b4: ebfffe0a bl 1f139e4 + 1f141b8: eaffffce b 1f140f8 + 1f141bc: e1a01007 mov r1, r7 + 1f141c0: e3022298 movw r2, #8856 ; 0x2298 + 1f141c4: e3402203 movt r2, #515 ; 0x203 + 1f141c8: e1a00004 mov r0, r4 + 1f141cc: ebffff5e bl 1f13f4c + 1f141d0: e3500000 cmp r0, #0 + 1f141d4: 0affffde beq 1f14154 + 1f141d8: e3a03003 mov r3, #3 + 1f141dc: e5c43008 strb r3, [r4, #8] + 1f141e0: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f141e4: ebfff9e3 bl 1f12978 + 1f141e8: eaffffc2 b 1f140f8 + +01f141ec : + 1f141ec: e1a03002 mov r3, r2 + 1f141f0: e3a02000 mov r2, #0 + 1f141f4: e92d4010 push {r4, lr} + 1f141f8: ebfffc3d bl 1f132f4 + 1f141fc: e1e00000 mvn r0, r0 + 1f14200: e1a00fa0 lsr r0, r0, #31 + 1f14204: e8bd8010 pop {r4, pc} + +01f14208 : + 1f14208: e308215f movw r2, #33119 ; 0x815f + 1f1420c: e340200a movt r2, #10 + 1f14210: e3a01000 mov r1, #0 + 1f14214: e0802002 add r2, r0, r2 + 1f14218: e1a03001 mov r3, r1 + 1f1421c: e5f20001 ldrb r0, [r2, #1]! + 1f14220: e3500000 cmp r0, #0 + 1f14224: 11a01003 movne r1, r3 + 1f14228: e2833001 add r3, r3, #1 + 1f1422c: e3530054 cmp r3, #84 ; 0x54 + 1f14230: 1afffff9 bne 1f1421c + 1f14234: e1a00001 mov r0, r1 + 1f14238: e12fff1e bx lr + +01f1423c : + 1f1423c: e3a03000 mov r3, #0 + 1f14240: e3433f20 movt r3, #16160 ; 0x3f20 + 1f14244: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f14248: e30a12b8 movw r1, #41656 ; 0xa2b8 + 1f1424c: e340120d movt r1, #525 ; 0x20d + 1f14250: e5934034 ldr r4, [r3, #52] ; 0x34 + 1f14254: e30a22a0 movw r2, #41632 ; 0xa2a0 + 1f14258: e340220d movt r2, #525 ; 0x20d + 1f1425c: e30ae300 movw lr, #41728 ; 0xa300 + 1f14260: e340e20d movt lr, #525 ; 0x20d + 1f14264: e30a02c0 movw r0, #41664 ; 0xa2c0 + 1f14268: e340020d movt r0, #525 ; 0x20d + 1f1426c: e3140302 tst r4, #134217728 ; 0x8000000 + 1f14270: e5d13000 ldrb r3, [r1] + 1f14274: e5925000 ldr r5, [r2] + 1f14278: e5ce3000 strb r3, [lr] + 1f1427c: e30a3308 movw r3, #41736 ; 0xa308 + 1f14280: e340320d movt r3, #525 ; 0x20d + 1f14284: e5805000 str r5, [r0] + 1f14288: 0a000064 beq 1f14420 + 1f1428c: e30ac2d8 movw ip, #41688 ; 0xa2d8 + 1f14290: e340c20d movt ip, #525 ; 0x20d + 1f14294: e3a05000 mov r5, #0 + 1f14298: e3a06e4e mov r6, #1248 ; 0x4e0 + 1f1429c: e3406007 movt r6, #7 + 1f142a0: e5835000 str r5, [r3] + 1f142a4: e58c6000 str r6, [ip] + 1f142a8: e5c15000 strb r5, [r1] + 1f142ac: e5825000 str r5, [r2] + 1f142b0: e5805000 str r5, [r0] + 1f142b4: e3140501 tst r4, #4194304 ; 0x400000 + 1f142b8: e5d15001 ldrb r5, [r1, #1] + 1f142bc: e5928004 ldr r8, [r2, #4] + 1f142c0: e30a62b8 movw r6, #41656 ; 0xa2b8 + 1f142c4: e340620d movt r6, #525 ; 0x20d + 1f142c8: e5ce5001 strb r5, [lr, #1] + 1f142cc: e30a72c0 movw r7, #41664 ; 0xa2c0 + 1f142d0: e340720d movt r7, #525 ; 0x20d + 1f142d4: e30a52a0 movw r5, #41632 ; 0xa2a0 + 1f142d8: e340520d movt r5, #525 ; 0x20d + 1f142dc: e5808004 str r8, [r0, #4] + 1f142e0: 0a00011f beq 1f14764 + 1f142e4: e3a08e4e mov r8, #1248 ; 0x4e0 + 1f142e8: e3408007 movt r8, #7 + 1f142ec: e58c8004 str r8, [ip, #4] + 1f142f0: e3a08000 mov r8, #0 + 1f142f4: e5c68001 strb r8, [r6, #1] + 1f142f8: e5838004 str r8, [r3, #4] + 1f142fc: e5858004 str r8, [r5, #4] + 1f14300: e5878004 str r8, [r7, #4] + 1f14304: e3140502 tst r4, #8388608 ; 0x800000 + 1f14308: e5d15002 ldrb r5, [r1, #2] + 1f1430c: e5928008 ldr r8, [r2, #8] + 1f14310: e30a62b8 movw r6, #41656 ; 0xa2b8 + 1f14314: e340620d movt r6, #525 ; 0x20d + 1f14318: e5ce5002 strb r5, [lr, #2] + 1f1431c: e30a72c0 movw r7, #41664 ; 0xa2c0 + 1f14320: e340720d movt r7, #525 ; 0x20d + 1f14324: e30a52a0 movw r5, #41632 ; 0xa2a0 + 1f14328: e340520d movt r5, #525 ; 0x20d + 1f1432c: e5808008 str r8, [r0, #8] + 1f14330: 0a0000ed beq 1f146ec + 1f14334: e3a08e4e mov r8, #1248 ; 0x4e0 + 1f14338: e3408007 movt r8, #7 + 1f1433c: e58c8008 str r8, [ip, #8] + 1f14340: e3a08000 mov r8, #0 + 1f14344: e5c68002 strb r8, [r6, #2] + 1f14348: e5838008 str r8, [r3, #8] + 1f1434c: e5858008 str r8, [r5, #8] + 1f14350: e5878008 str r8, [r7, #8] + 1f14354: e3140010 tst r4, #16 + 1f14358: e5d15003 ldrb r5, [r1, #3] + 1f1435c: e592800c ldr r8, [r2, #12] + 1f14360: e30a62b8 movw r6, #41656 ; 0xa2b8 + 1f14364: e340620d movt r6, #525 ; 0x20d + 1f14368: e5ce5003 strb r5, [lr, #3] + 1f1436c: e30a72c0 movw r7, #41664 ; 0xa2c0 + 1f14370: e340720d movt r7, #525 ; 0x20d + 1f14374: e30a52a0 movw r5, #41632 ; 0xa2a0 + 1f14378: e340520d movt r5, #525 ; 0x20d + 1f1437c: e580800c str r8, [r0, #12] + 1f14380: 0a0000c6 beq 1f146a0 + 1f14384: e3a08e4e mov r8, #1248 ; 0x4e0 + 1f14388: e3408007 movt r8, #7 + 1f1438c: e58c800c str r8, [ip, #12] + 1f14390: e3a08000 mov r8, #0 + 1f14394: e5c68003 strb r8, [r6, #3] + 1f14398: e583800c str r8, [r3, #12] + 1f1439c: e585800c str r8, [r5, #12] + 1f143a0: e587800c str r8, [r7, #12] + 1f143a4: e3140020 tst r4, #32 + 1f143a8: e5d16004 ldrb r6, [r1, #4] + 1f143ac: e5925010 ldr r5, [r2, #16] + 1f143b0: e30a12b8 movw r1, #41656 ; 0xa2b8 + 1f143b4: e340120d movt r1, #525 ; 0x20d + 1f143b8: e30a22a0 movw r2, #41632 ; 0xa2a0 + 1f143bc: e340220d movt r2, #525 ; 0x20d + 1f143c0: e5805010 str r5, [r0, #16] + 1f143c4: e30a02c0 movw r0, #41664 ; 0xa2c0 + 1f143c8: e340020d movt r0, #525 ; 0x20d + 1f143cc: e5ce6004 strb r6, [lr, #4] + 1f143d0: 1a000025 bne 1f1446c + 1f143d4: e5930010 ldr r0, [r3, #16] + 1f143d8: e304ee20 movw lr, #20000 ; 0x4e20 + 1f143dc: e2800001 add r0, r0, #1 + 1f143e0: e5830010 str r0, [r3, #16] + 1f143e4: e150000e cmp r0, lr + 1f143e8: 0a000100 beq 1f147f0 + 1f143ec: e59c1010 ldr r1, [ip, #16] + 1f143f0: e30a32d8 movw r3, #41688 ; 0xa2d8 + 1f143f4: e340320d movt r3, #525 ; 0x20d + 1f143f8: e1500001 cmp r0, r1 + 1f143fc: 1a000022 bne 1f1448c + 1f14400: e2855001 add r5, r5, #1 + 1f14404: e3a01e4e mov r1, #1248 ; 0x4e0 + 1f14408: e3401007 movt r1, #7 + 1f1440c: e5825010 str r5, [r2, #16] + 1f14410: e735f511 udiv r5, r1, r5 + 1f14414: e0850000 add r0, r5, r0 + 1f14418: e5830010 str r0, [r3, #16] + 1f1441c: ea00001a b 1f1448c + 1f14420: e5936000 ldr r6, [r3] + 1f14424: e304ce20 movw ip, #20000 ; 0x4e20 + 1f14428: e2866001 add r6, r6, #1 + 1f1442c: e5836000 str r6, [r3] + 1f14430: e156000c cmp r6, ip + 1f14434: e30ac2d8 movw ip, #41688 ; 0xa2d8 + 1f14438: e340c20d movt ip, #525 ; 0x20d + 1f1443c: 0a0000f3 beq 1f14810 + 1f14440: e59c7000 ldr r7, [ip] + 1f14444: e1570006 cmp r7, r6 + 1f14448: 1affff99 bne 1f142b4 + 1f1444c: e2855001 add r5, r5, #1 + 1f14450: e3a06e4e mov r6, #1248 ; 0x4e0 + 1f14454: e3406007 movt r6, #7 + 1f14458: e5825000 str r5, [r2] + 1f1445c: e735f516 udiv r5, r6, r5 + 1f14460: e0855007 add r5, r5, r7 + 1f14464: e58c5000 str r5, [ip] + 1f14468: eaffff91 b 1f142b4 + 1f1446c: e3a0ee4e mov lr, #1248 ; 0x4e0 + 1f14470: e340e007 movt lr, #7 + 1f14474: e58ce010 str lr, [ip, #16] + 1f14478: e3a0c000 mov ip, #0 + 1f1447c: e5c1c004 strb ip, [r1, #4] + 1f14480: e583c010 str ip, [r3, #16] + 1f14484: e582c010 str ip, [r2, #16] + 1f14488: e580c010 str ip, [r0, #16] + 1f1448c: e30a62ec movw r6, #41708 ; 0xa2ec + 1f14490: e340620d movt r6, #525 ; 0x20d + 1f14494: e30a72d4 movw r7, #41684 ; 0xa2d4 + 1f14498: e340720d movt r7, #525 ; 0x20d + 1f1449c: e30421d4 movw r2, #16852 ; 0x41d4 + 1f144a0: e34021f6 movt r2, #502 ; 0x1f6 + 1f144a4: e596c000 ldr ip, [r6] + 1f144a8: e30a02d7 movw r0, #41687 ; 0xa2d7 + 1f144ac: e340020d movt r0, #525 ; 0x20d + 1f144b0: e5d73000 ldrb r3, [r7] + 1f144b4: e35c0000 cmp ip, #0 + 1f144b8: e5922000 ldr r2, [r2] + 1f144bc: 128c501c addne r5, ip, #28 + 1f144c0: 01a0500c moveq r5, ip + 1f144c4: e3530000 cmp r3, #0 + 1f144c8: e002e004 and lr, r2, r4 + 1f144cc: 03a02000 moveq r2, #0 + 1f144d0: e06e1002 rsb r1, lr, r2 + 1f144d4: e5d08000 ldrb r8, [r0] + 1f144d8: e16f1f11 clz r1, r1 + 1f144dc: e1a012a1 lsr r1, r1, #5 + 1f144e0: e1580001 cmp r8, r1 + 1f144e4: 0a0000be beq 1f147e4 + 1f144e8: e35c0000 cmp ip, #0 + 1f144ec: e5c01000 strb r1, [r0] + 1f144f0: 0a0000bb beq 1f147e4 + 1f144f4: e5d53002 ldrb r3, [r5, #2] + 1f144f8: e3130010 tst r3, #16 + 1f144fc: 130a32b4 movwne r3, #41652 ; 0xa2b4 + 1f14500: 130a8307 movwne r8, #41735 ; 0xa307 + 1f14504: 1340320d movtne r3, #525 ; 0x20d + 1f14508: 1340820d movtne r8, #525 ; 0x20d + 1f1450c: 030a8307 movweq r8, #41735 ; 0xa307 + 1f14510: 0340820d movteq r8, #525 ; 0x20d + 1f14514: 15d33000 ldrbne r3, [r3] + 1f14518: 10233001 eorne r3, r3, r1 + 1f1451c: 15c83000 strbne r3, [r8] + 1f14520: e5d53001 ldrb r3, [r5, #1] + 1f14524: e152000e cmp r2, lr + 1f14528: 03833080 orreq r3, r3, #128 ; 0x80 + 1f1452c: 1203307f andne r3, r3, #127 ; 0x7f + 1f14530: e5c53001 strb r3, [r5, #1] + 1f14534: e5960000 ldr r0, [r6] + 1f14538: eb002668 bl 1f1dee0 + 1f1453c: e5d73000 ldrb r3, [r7] + 1f14540: e3550000 cmp r5, #0 + 1f14544: 0a000003 beq 1f14558 + 1f14548: e5d52002 ldrb r2, [r5, #2] + 1f1454c: e2022010 and r2, r2, #16 + 1f14550: e21220ff ands r2, r2, #255 ; 0xff + 1f14554: 0a000033 beq 1f14628 + 1f14558: e5d82000 ldrb r2, [r8] + 1f1455c: e3520000 cmp r2, #0 + 1f14560: 0a000031 beq 1f1462c + 1f14564: e5961000 ldr r1, [r6] + 1f14568: e30a2305 movw r2, #41733 ; 0xa305 + 1f1456c: e340220d movt r2, #525 ; 0x20d + 1f14570: e3510000 cmp r1, #0 + 1f14574: e3a01001 mov r1, #1 + 1f14578: e5c21000 strb r1, [r2] + 1f1457c: 15d52001 ldrbne r2, [r5, #1] + 1f14580: 11822001 orrne r2, r2, r1 + 1f14584: 15c52001 strbne r2, [r5, #1] + 1f14588: e30a22be movw r2, #41662 ; 0xa2be + 1f1458c: e340220d movt r2, #525 ; 0x20d + 1f14590: e5d22000 ldrb r2, [r2] + 1f14594: e3520000 cmp r2, #0 + 1f14598: 1a000066 bne 1f14738 + 1f1459c: e30421dc movw r2, #16860 ; 0x41dc + 1f145a0: e34021f6 movt r2, #502 ; 0x1f6 + 1f145a4: e3530000 cmp r3, #0 + 1f145a8: e5920000 ldr r0, [r2] + 1f145ac: e0042000 and r2, r4, r0 + 1f145b0: 1a00007e bne 1f147b0 + 1f145b4: e30a12d6 movw r1, #41686 ; 0xa2d6 + 1f145b8: e340120d movt r1, #525 ; 0x20d + 1f145bc: e16f2f12 clz r2, r2 + 1f145c0: e5d10000 ldrb r0, [r1] + 1f145c4: e1a022a2 lsr r2, r2, #5 + 1f145c8: e1500002 cmp r0, r2 + 1f145cc: 0a0000af beq 1f14890 + 1f145d0: e5960000 ldr r0, [r6] + 1f145d4: e5c12000 strb r2, [r1] + 1f145d8: e3500000 cmp r0, #0 + 1f145dc: 0a000004 beq 1f145f4 + 1f145e0: e3520000 cmp r2, #0 + 1f145e4: e5d52001 ldrb r2, [r5, #1] + 1f145e8: 1a00005a bne 1f14758 + 1f145ec: e3c22004 bic r2, r2, #4 + 1f145f0: e5c52001 strb r2, [r5, #1] + 1f145f4: e30421e0 movw r2, #16864 ; 0x41e0 + 1f145f8: e34021f6 movt r2, #502 ; 0x1f6 + 1f145fc: e3530000 cmp r3, #0 + 1f14600: e5923000 ldr r3, [r2] + 1f14604: e0044003 and r4, r4, r3 + 1f14608: 03a03000 moveq r3, #0 + 1f1460c: e30a22bd movw r2, #41661 ; 0xa2bd + 1f14610: e340220d movt r2, #525 ; 0x20d + 1f14614: e0643003 rsb r3, r4, r3 + 1f14618: e16f3f13 clz r3, r3 + 1f1461c: e1a032a3 lsr r3, r3, #5 + 1f14620: e5c23000 strb r3, [r2] + 1f14624: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f14628: e5c82000 strb r2, [r8] + 1f1462c: e30a2298 movw r2, #41624 ; 0xa298 + 1f14630: e340220d movt r2, #525 ; 0x20d + 1f14634: e5d22000 ldrb r2, [r2] + 1f14638: e3520000 cmp r2, #0 + 1f1463c: 1affffc8 bne 1f14564 + 1f14640: e30421d8 movw r2, #16856 ; 0x41d8 + 1f14644: e34021f6 movt r2, #502 ; 0x1f6 + 1f14648: e3530000 cmp r3, #0 + 1f1464c: e30a1305 movw r1, #41733 ; 0xa305 + 1f14650: e340120d movt r1, #525 ; 0x20d + 1f14654: e5922000 ldr r2, [r2] + 1f14658: e004c002 and ip, r4, r2 + 1f1465c: 03a02000 moveq r2, #0 + 1f14660: e06c0002 rsb r0, ip, r2 + 1f14664: e5d1e000 ldrb lr, [r1] + 1f14668: e16f0f10 clz r0, r0 + 1f1466c: e1a002a0 lsr r0, r0, #5 + 1f14670: e15e0000 cmp lr, r0 + 1f14674: 0affffc3 beq 1f14588 + 1f14678: e596e000 ldr lr, [r6] + 1f1467c: e5c10000 strb r0, [r1] + 1f14680: e35e0000 cmp lr, #0 + 1f14684: 0affffbf beq 1f14588 + 1f14688: e152000c cmp r2, ip + 1f1468c: e5d52001 ldrb r2, [r5, #1] + 1f14690: 03822001 orreq r2, r2, #1 + 1f14694: 13c22001 bicne r2, r2, #1 + 1f14698: e5c52001 strb r2, [r5, #1] + 1f1469c: eaffffb9 b 1f14588 + 1f146a0: e593700c ldr r7, [r3, #12] + 1f146a4: e3049e20 movw r9, #20000 ; 0x4e20 + 1f146a8: e2877001 add r7, r7, #1 + 1f146ac: e583700c str r7, [r3, #12] + 1f146b0: e1570009 cmp r7, r9 + 1f146b4: 0a000065 beq 1f14850 + 1f146b8: e59c900c ldr r9, [ip, #12] + 1f146bc: e30a62d8 movw r6, #41688 ; 0xa2d8 + 1f146c0: e340620d movt r6, #525 ; 0x20d + 1f146c4: e1570009 cmp r7, r9 + 1f146c8: 1affff35 bne 1f143a4 + 1f146cc: e2888001 add r8, r8, #1 + 1f146d0: e3a09e4e mov r9, #1248 ; 0x4e0 + 1f146d4: e3409007 movt r9, #7 + 1f146d8: e585800c str r8, [r5, #12] + 1f146dc: e739f819 udiv r9, r9, r8 + 1f146e0: e0897007 add r7, r9, r7 + 1f146e4: e586700c str r7, [r6, #12] + 1f146e8: eaffff2d b 1f143a4 + 1f146ec: e5937008 ldr r7, [r3, #8] + 1f146f0: e3049e20 movw r9, #20000 ; 0x4e20 + 1f146f4: e2877001 add r7, r7, #1 + 1f146f8: e5837008 str r7, [r3, #8] + 1f146fc: e1570009 cmp r7, r9 + 1f14700: 0a00005a beq 1f14870 + 1f14704: e59c9008 ldr r9, [ip, #8] + 1f14708: e30a62d8 movw r6, #41688 ; 0xa2d8 + 1f1470c: e340620d movt r6, #525 ; 0x20d + 1f14710: e1570009 cmp r7, r9 + 1f14714: 1affff0e bne 1f14354 + 1f14718: e2888001 add r8, r8, #1 + 1f1471c: e3a09e4e mov r9, #1248 ; 0x4e0 + 1f14720: e3409007 movt r9, #7 + 1f14724: e5858008 str r8, [r5, #8] + 1f14728: e739f819 udiv r9, r9, r8 + 1f1472c: e0897007 add r7, r9, r7 + 1f14730: e5867008 str r7, [r6, #8] + 1f14734: eaffff06 b 1f14354 + 1f14738: e5961000 ldr r1, [r6] + 1f1473c: e30a22d6 movw r2, #41686 ; 0xa2d6 + 1f14740: e340220d movt r2, #525 ; 0x20d + 1f14744: e3510000 cmp r1, #0 + 1f14748: e3a01001 mov r1, #1 + 1f1474c: e5c21000 strb r1, [r2] + 1f14750: 0affffa7 beq 1f145f4 + 1f14754: e5d52001 ldrb r2, [r5, #1] + 1f14758: e3822004 orr r2, r2, #4 + 1f1475c: e5c52001 strb r2, [r5, #1] + 1f14760: eaffffa3 b 1f145f4 + 1f14764: e5937004 ldr r7, [r3, #4] + 1f14768: e3049e20 movw r9, #20000 ; 0x4e20 + 1f1476c: e2877001 add r7, r7, #1 + 1f14770: e5837004 str r7, [r3, #4] + 1f14774: e1570009 cmp r7, r9 + 1f14778: 0a00002c beq 1f14830 + 1f1477c: e59c9004 ldr r9, [ip, #4] + 1f14780: e30a62d8 movw r6, #41688 ; 0xa2d8 + 1f14784: e340620d movt r6, #525 ; 0x20d + 1f14788: e1590007 cmp r9, r7 + 1f1478c: 1afffedc bne 1f14304 + 1f14790: e2888001 add r8, r8, #1 + 1f14794: e3a07e4e mov r7, #1248 ; 0x4e0 + 1f14798: e3407007 movt r7, #7 + 1f1479c: e5858004 str r8, [r5, #4] + 1f147a0: e737f817 udiv r7, r7, r8 + 1f147a4: e0877009 add r7, r7, r9 + 1f147a8: e5867004 str r7, [r6, #4] + 1f147ac: eafffed4 b 1f14304 + 1f147b0: e30a12d6 movw r1, #41686 ; 0xa2d6 + 1f147b4: e340120d movt r1, #525 ; 0x20d + 1f147b8: e0622000 rsb r2, r2, r0 + 1f147bc: e16f2f12 clz r2, r2 + 1f147c0: e5d10000 ldrb r0, [r1] + 1f147c4: e1a022a2 lsr r2, r2, #5 + 1f147c8: e1500002 cmp r0, r2 + 1f147cc: 1affff7f bne 1f145d0 + 1f147d0: e30431e0 movw r3, #16864 ; 0x41e0 + 1f147d4: e34031f6 movt r3, #502 ; 0x1f6 + 1f147d8: e5933000 ldr r3, [r3] + 1f147dc: e0044003 and r4, r4, r3 + 1f147e0: eaffff89 b 1f1460c + 1f147e4: e30a8307 movw r8, #41735 ; 0xa307 + 1f147e8: e340820d movt r8, #525 ; 0x20d + 1f147ec: eaffff53 b 1f14540 + 1f147f0: e2855001 add r5, r5, #1 + 1f147f4: e3a03c53 mov r3, #21248 ; 0x5300 + 1f147f8: e3403007 movt r3, #7 + 1f147fc: e58c3010 str r3, [ip, #16] + 1f14800: e5825010 str r5, [r2, #16] + 1f14804: e3a03001 mov r3, #1 + 1f14808: e5c13004 strb r3, [r1, #4] + 1f1480c: eaffff1e b 1f1448c + 1f14810: e2855001 add r5, r5, #1 + 1f14814: e5825000 str r5, [r2] + 1f14818: e3a05c53 mov r5, #21248 ; 0x5300 + 1f1481c: e3405007 movt r5, #7 + 1f14820: e58c5000 str r5, [ip] + 1f14824: e3a05001 mov r5, #1 + 1f14828: e5c15000 strb r5, [r1] + 1f1482c: eafffea0 b 1f142b4 + 1f14830: e2888001 add r8, r8, #1 + 1f14834: e3a07001 mov r7, #1 + 1f14838: e5858004 str r8, [r5, #4] + 1f1483c: e3a05c53 mov r5, #21248 ; 0x5300 + 1f14840: e3405007 movt r5, #7 + 1f14844: e58c5004 str r5, [ip, #4] + 1f14848: e5c67001 strb r7, [r6, #1] + 1f1484c: eafffeac b 1f14304 + 1f14850: e2888001 add r8, r8, #1 + 1f14854: e3a07001 mov r7, #1 + 1f14858: e585800c str r8, [r5, #12] + 1f1485c: e3a05c53 mov r5, #21248 ; 0x5300 + 1f14860: e3405007 movt r5, #7 + 1f14864: e58c500c str r5, [ip, #12] + 1f14868: e5c67003 strb r7, [r6, #3] + 1f1486c: eafffecc b 1f143a4 + 1f14870: e2887001 add r7, r8, #1 + 1f14874: e5857008 str r7, [r5, #8] + 1f14878: e3a05c53 mov r5, #21248 ; 0x5300 + 1f1487c: e3405007 movt r5, #7 + 1f14880: e3a07001 mov r7, #1 + 1f14884: e58c5008 str r5, [ip, #8] + 1f14888: e5c67002 strb r7, [r6, #2] + 1f1488c: eafffeb0 b 1f14354 + 1f14890: e30421e0 movw r2, #16864 ; 0x41e0 + 1f14894: e34021f6 movt r2, #502 ; 0x1f6 + 1f14898: e5922000 ldr r2, [r2] + 1f1489c: e0044002 and r4, r4, r2 + 1f148a0: eaffff59 b 1f1460c + +01f148a4 : + 1f148a4: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f148a8: e3a03000 mov r3, #0 + 1f148ac: e5c13000 strb r3, [r1] + 1f148b0: e1a06000 mov r6, r0 + 1f148b4: e1a05001 mov r5, r1 + 1f148b8: e1d000d0 ldrsb r0, [r0] + 1f148bc: e1a07002 mov r7, r2 + 1f148c0: eb00a721 bl 1f3e54c + 1f148c4: e3500000 cmp r0, #0 + 1f148c8: 1a000009 bne 1f148f4 + 1f148cc: e1d600d0 ldrsb r0, [r6] + 1f148d0: e350002c cmp r0, #44 ; 0x2c + 1f148d4: 1350003d cmpne r0, #61 ; 0x3d + 1f148d8: 03a03001 moveq r3, #1 + 1f148dc: 13a03000 movne r3, #0 + 1f148e0: e350003a cmp r0, #58 ; 0x3a + 1f148e4: 03833001 orreq r3, r3, #1 + 1f148e8: e3530000 cmp r3, #0 + 1f148ec: 01a04006 moveq r4, r6 + 1f148f0: 0a000007 beq 1f14914 + 1f148f4: e1d600d1 ldrsb r0, [r6, #1] + 1f148f8: e2864001 add r4, r6, #1 + 1f148fc: e3500000 cmp r0, #0 + 1f14900: 0a000005 beq 1f1491c + 1f14904: eb00a710 bl 1f3e54c + 1f14908: e3500000 cmp r0, #0 + 1f1490c: 0a000006 beq 1f1492c + 1f14910: e1f400d1 ldrsb r0, [r4, #1]! + 1f14914: e3500000 cmp r0, #0 + 1f14918: 1afffff9 bne 1f14904 + 1f1491c: e3a03000 mov r3, #0 + 1f14920: e1a00004 mov r0, r4 + 1f14924: e5c53000 strb r3, [r5] + 1f14928: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f1492c: e1d400d0 ldrsb r0, [r4] + 1f14930: e3500000 cmp r0, #0 + 1f14934: 0afffff8 beq 1f1491c + 1f14938: e3570000 cmp r7, #0 + 1f1493c: 1a00000d bne 1f14978 + 1f14940: ea000019 b 1f149ac + 1f14944: e3510019 cmp r1, #25 + 1f14948: e2855001 add r5, r5, #1 + 1f1494c: e2844001 add r4, r4, #1 + 1f14950: 92233080 eorls r3, r3, #128 ; 0x80 + 1f14954: 9a000003 bls 1f14968 + 1f14958: e2432041 sub r2, r3, #65 ; 0x41 + 1f1495c: e3520019 cmp r2, #25 + 1f14960: 92833020 addls r3, r3, #32 + 1f14964: 96ef3073 uxtbls r3, r3 + 1f14968: e5453001 strb r3, [r5, #-1] + 1f1496c: e1d400d0 ldrsb r0, [r4] + 1f14970: e3500000 cmp r0, #0 + 1f14974: 0affffe8 beq 1f1491c + 1f14978: e350003d cmp r0, #61 ; 0x3d + 1f1497c: 1350002c cmpne r0, #44 ; 0x2c + 1f14980: e6ef3070 uxtb r3, r0 + 1f14984: 03a02001 moveq r2, #1 + 1f14988: 13a02000 movne r2, #0 + 1f1498c: e350003a cmp r0, #58 ; 0x3a + 1f14990: 11a00002 movne r0, r2 + 1f14994: 03820001 orreq r0, r2, #1 + 1f14998: e283103f add r1, r3, #63 ; 0x3f + 1f1499c: e3500000 cmp r0, #0 + 1f149a0: e6ef1071 uxtb r1, r1 + 1f149a4: 0affffe6 beq 1f14944 + 1f149a8: eaffffdb b 1f1491c + 1f149ac: e1a06004 mov r6, r4 + 1f149b0: ea00000c b 1f149e8 + 1f149b4: e3510019 cmp r1, #25 + 1f149b8: e2432041 sub r2, r3, #65 ; 0x41 + 1f149bc: e2855001 add r5, r5, #1 + 1f149c0: e1a04006 mov r4, r6 + 1f149c4: 92233080 eorls r3, r3, #128 ; 0x80 + 1f149c8: 9a000002 bls 1f149d8 + 1f149cc: e3520019 cmp r2, #25 + 1f149d0: 92833020 addls r3, r3, #32 + 1f149d4: 96ef3073 uxtbls r3, r3 + 1f149d8: e5453001 strb r3, [r5, #-1] + 1f149dc: e1d600d0 ldrsb r0, [r6] + 1f149e0: e3500000 cmp r0, #0 + 1f149e4: 0affffcc beq 1f1491c + 1f149e8: eb00a6d7 bl 1f3e54c + 1f149ec: e3500000 cmp r0, #0 + 1f149f0: e1a04006 mov r4, r6 + 1f149f4: 1affffc8 bne 1f1491c + 1f149f8: e0d620d1 ldrsb r2, [r6], #1 + 1f149fc: e352002c cmp r2, #44 ; 0x2c + 1f14a00: 1352003d cmpne r2, #61 ; 0x3d + 1f14a04: 03a01001 moveq r1, #1 + 1f14a08: 13a01000 movne r1, #0 + 1f14a0c: e6ef3072 uxtb r3, r2 + 1f14a10: e352003a cmp r2, #58 ; 0x3a + 1f14a14: 11a02001 movne r2, r1 + 1f14a18: 03812001 orreq r2, r1, #1 + 1f14a1c: e3520000 cmp r2, #0 + 1f14a20: e283103f add r1, r3, #63 ; 0x3f + 1f14a24: e6ef1071 uxtb r1, r1 + 1f14a28: 0affffe1 beq 1f149b4 + 1f14a2c: eaffffba b 1f1491c + +01f14a30 : + 1f14a30: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f14a34: e3520000 cmp r2, #0 + 1f14a38: e30aa2d7 movw sl, #41687 ; 0xa2d7 + 1f14a3c: e340a20d movt sl, #525 ; 0x20d + 1f14a40: e24dd054 sub sp, sp, #84 ; 0x54 + 1f14a44: 130a4305 movwne r4, #41733 ; 0xa305 + 1f14a48: e1a09000 mov r9, r0 + 1f14a4c: 1340420d movtne r4, #525 ; 0x20d + 1f14a50: e58d101c str r1, [sp, #28] + 1f14a54: 1a000028 bne 1f14afc + 1f14a58: e30a32be movw r3, #41662 ; 0xa2be + 1f14a5c: e340320d movt r3, #525 ; 0x20d + 1f14a60: e58d3010 str r3, [sp, #16] + 1f14a64: e5d33000 ldrb r3, [r3] + 1f14a68: e3530000 cmp r3, #0 + 1f14a6c: 0a0001c4 beq 1f15184 + 1f14a70: e3a02a03 mov r2, #12288 ; 0x3000 + 1f14a74: e3432f00 movt r2, #16128 ; 0x3f00 + 1f14a78: e3a00028 mov r0, #40 ; 0x28 + 1f14a7c: e5921004 ldr r1, [r2, #4] + 1f14a80: e5923004 ldr r3, [r2, #4] + 1f14a84: e1510003 cmp r1, r3 + 1f14a88: 0afffffc beq 1f14a80 + 1f14a8c: e2500001 subs r0, r0, #1 + 1f14a90: 1afffff9 bne 1f14a7c + 1f14a94: e30a4305 movw r4, #41733 ; 0xa305 + 1f14a98: e340420d movt r4, #525 ; 0x20d + 1f14a9c: ea000002 b 1f14aac + 1f14aa0: e5d48000 ldrb r8, [r4] + 1f14aa4: e3580000 cmp r8, #0 + 1f14aa8: 0a000032 beq 1f14b78 + 1f14aac: ebfffde2 bl 1f1423c + 1f14ab0: e5d92005 ldrb r2, [r9, #5] + 1f14ab4: e30a7305 movw r7, #41733 ; 0xa305 + 1f14ab8: e340720d movt r7, #525 ; 0x20d + 1f14abc: e3520002 cmp r2, #2 + 1f14ac0: e5da3000 ldrb r3, [sl] + 1f14ac4: 0a000023 beq 1f14b58 + 1f14ac8: e3530000 cmp r3, #0 + 1f14acc: 0afffff3 beq 1f14aa0 + 1f14ad0: e3a00001 mov r0, #1 + 1f14ad4: e5c90005 strb r0, [r9, #5] + 1f14ad8: e1a08000 mov r8, r0 + 1f14adc: e1a00008 mov r0, r8 + 1f14ae0: e28dd054 add sp, sp, #84 ; 0x54 + 1f14ae4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f14ae8: e3530000 cmp r3, #0 + 1f14aec: 0a00001b beq 1f14b60 + 1f14af0: e5d43000 ldrb r3, [r4] + 1f14af4: e3530000 cmp r3, #0 + 1f14af8: 1a00000e bne 1f14b38 + 1f14afc: ebfffdce bl 1f1423c + 1f14b00: e5d92005 ldrb r2, [r9, #5] + 1f14b04: e30a7305 movw r7, #41733 ; 0xa305 + 1f14b08: e340720d movt r7, #525 ; 0x20d + 1f14b0c: e3520002 cmp r2, #2 + 1f14b10: e5da3000 ldrb r3, [sl] + 1f14b14: 0afffff3 beq 1f14ae8 + 1f14b18: e3530000 cmp r3, #0 + 1f14b1c: 0afffff3 beq 1f14af0 + 1f14b20: eaffffea b 1f14ad0 + 1f14b24: e3530000 cmp r3, #0 + 1f14b28: 0a00000c beq 1f14b60 + 1f14b2c: e5d73000 ldrb r3, [r7] + 1f14b30: e3530000 cmp r3, #0 + 1f14b34: 0affffc7 beq 1f14a58 + 1f14b38: ebfffdbf bl 1f1423c + 1f14b3c: e5d92005 ldrb r2, [r9, #5] + 1f14b40: e5da3000 ldrb r3, [sl] + 1f14b44: e3520002 cmp r2, #2 + 1f14b48: 0afffff5 beq 1f14b24 + 1f14b4c: e3530000 cmp r3, #0 + 1f14b50: 1affffde bne 1f14ad0 + 1f14b54: eafffff4 b 1f14b2c + 1f14b58: e3530000 cmp r3, #0 + 1f14b5c: 1affffcf bne 1f14aa0 + 1f14b60: e3a08001 mov r8, #1 + 1f14b64: e3a03003 mov r3, #3 + 1f14b68: e1a00008 mov r0, r8 + 1f14b6c: e5c93005 strb r3, [r9, #5] + 1f14b70: e28dd054 add sp, sp, #84 ; 0x54 + 1f14b74: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f14b78: e3a02a03 mov r2, #12288 ; 0x3000 + 1f14b7c: e3432f00 movt r2, #16128 ; 0x3f00 + 1f14b80: e3a01015 mov r1, #21 + 1f14b84: e5920004 ldr r0, [r2, #4] + 1f14b88: e5923004 ldr r3, [r2, #4] + 1f14b8c: e1500003 cmp r0, r3 + 1f14b90: 0afffffc beq 1f14b88 + 1f14b94: e2511001 subs r1, r1, #1 + 1f14b98: 1afffff9 bne 1f14b84 + 1f14b9c: e30a2307 movw r2, #41735 ; 0xa307 + 1f14ba0: e340220d movt r2, #525 ; 0x20d + 1f14ba4: e30a3298 movw r3, #41624 ; 0xa298 + 1f14ba8: e340320d movt r3, #525 ; 0x20d + 1f14bac: e1a0c003 mov ip, r3 + 1f14bb0: e58d3040 str r3, [sp, #64] ; 0x40 + 1f14bb4: e5d22000 ldrb r2, [r2] + 1f14bb8: e30a32f8 movw r3, #41720 ; 0xa2f8 + 1f14bbc: e340320d movt r3, #525 ; 0x20d + 1f14bc0: e1a0e002 mov lr, r2 + 1f14bc4: e58d2000 str r2, [sp] + 1f14bc8: e30a2306 movw r2, #41734 ; 0xa306 + 1f14bcc: e340220d movt r2, #525 ; 0x20d + 1f14bd0: e30a031d movw r0, #41757 ; 0xa31d + 1f14bd4: e340020d movt r0, #525 ; 0x20d + 1f14bd8: e5d33000 ldrb r3, [r3] + 1f14bdc: e35e0000 cmp lr, #0 + 1f14be0: e5d22000 ldrb r2, [r2] + 1f14be4: e3a04000 mov r4, #0 + 1f14be8: e3434f20 movt r4, #16160 ; 0x3f20 + 1f14bec: e58d2008 str r2, [sp, #8] + 1f14bf0: e30ab2f4 movw fp, #41716 ; 0xa2f4 + 1f14bf4: e340b20d movt fp, #525 ; 0x20d + 1f14bf8: e59d2010 ldr r2, [sp, #16] + 1f14bfc: e5dc5000 ldrb r5, [ip] + 1f14c00: e1a0c00e mov ip, lr + 1f14c04: e5d00000 ldrb r0, [r0] + 1f14c08: 13a0c401 movne ip, #16777216 ; 0x1000000 + 1f14c0c: e5d22000 ldrb r2, [r2] + 1f14c10: 03a0c000 moveq ip, #0 + 1f14c14: e1a0e001 mov lr, r1 + 1f14c18: e58dc020 str ip, [sp, #32] + 1f14c1c: e58d0004 str r0, [sp, #4] + 1f14c20: 13a0c612 movne ip, #18874368 ; 0x1200000 + 1f14c24: 03a0c602 moveq ip, #2097152 ; 0x200000 + 1f14c28: e1a00002 mov r0, r2 + 1f14c2c: e58dc018 str ip, [sp, #24] + 1f14c30: e1a0c003 mov ip, r3 + 1f14c34: e58d9014 str r9, [sp, #20] + 1f14c38: e3a03a03 mov r3, #12288 ; 0x3000 + 1f14c3c: e3433f00 movt r3, #16128 ; 0x3f00 + 1f14c40: e58da04c str sl, [sp, #76] ; 0x4c + 1f14c44: e1a01005 mov r1, r5 + 1f14c48: e58d8044 str r8, [sp, #68] ; 0x44 + 1f14c4c: e1a0200c mov r2, ip + 1f14c50: e1a0900e mov r9, lr + 1f14c54: e58d7048 str r7, [sp, #72] ; 0x48 + 1f14c58: e1a0a000 mov sl, r0 + 1f14c5c: e3a0e02d mov lr, #45 ; 0x2d + 1f14c60: e593c004 ldr ip, [r3, #4] + 1f14c64: e5930004 ldr r0, [r3, #4] + 1f14c68: e15c0000 cmp ip, r0 + 1f14c6c: 0afffffc beq 1f14c64 + 1f14c70: e25ee001 subs lr, lr, #1 + 1f14c74: 1afffff9 bne 1f14c60 + 1f14c78: e59d001c ldr r0, [sp, #28] + 1f14c7c: e1a00950 asr r0, r0, r9 + 1f14c80: e3100001 tst r0, #1 + 1f14c84: 0a00006c beq 1f14e3c + 1f14c88: e3510000 cmp r1, #0 + 1f14c8c: 1a0000d0 bne 1f14fd4 + 1f14c90: e3a0e016 mov lr, #22 + 1f14c94: e593c004 ldr ip, [r3, #4] + 1f14c98: e5930004 ldr r0, [r3, #4] + 1f14c9c: e15c0000 cmp ip, r0 + 1f14ca0: 0afffffc beq 1f14c98 + 1f14ca4: e25ee001 subs lr, lr, #1 + 1f14ca8: 1afffff9 bne 1f14c94 + 1f14cac: e35a0000 cmp sl, #0 + 1f14cb0: 1a0000a3 bne 1f14f44 + 1f14cb4: e59d0014 ldr r0, [sp, #20] + 1f14cb8: e5d00002 ldrb r0, [r0, #2] + 1f14cbc: e3100004 tst r0, #4 + 1f14cc0: 0a000049 beq 1f14dec + 1f14cc4: e3a0e022 mov lr, #34 ; 0x22 + 1f14cc8: e593c004 ldr ip, [r3, #4] + 1f14ccc: e5930004 ldr r0, [r3, #4] + 1f14cd0: e15c0000 cmp ip, r0 + 1f14cd4: 0afffffc beq 1f14ccc + 1f14cd8: e25ee001 subs lr, lr, #1 + 1f14cdc: 1afffff9 bne 1f14cc8 + 1f14ce0: e3520000 cmp r2, #0 + 1f14ce4: e59d0000 ldr r0, [sp] + 1f14ce8: 1a000049 bne 1f14e14 + 1f14cec: e3500000 cmp r0, #0 + 1f14cf0: 13a0e401 movne lr, #16777216 ; 0x1000000 + 1f14cf4: 1a000002 bne 1f14d04 + 1f14cf8: e3510000 cmp r1, #0 + 1f14cfc: 03a0e000 moveq lr, #0 + 1f14d00: 13a0e401 movne lr, #16777216 ; 0x1000000 + 1f14d04: e59bc000 ldr ip, [fp] + 1f14d08: e3a00000 mov r0, #0 + 1f14d0c: e3ccc612 bic ip, ip, #18874368 ; 0x1200000 + 1f14d10: e38cc602 orr ip, ip, #2097152 ; 0x200000 + 1f14d14: e18cc00e orr ip, ip, lr + 1f14d18: e584c004 str ip, [r4, #4] + 1f14d1c: e1a0c000 mov ip, r0 + 1f14d20: e59de004 ldr lr, [sp, #4] + 1f14d24: e35e0000 cmp lr, #0 + 1f14d28: e59de008 ldr lr, [sp, #8] + 1f14d2c: 138cc801 orrne ip, ip, #65536 ; 0x10000 + 1f14d30: 03800801 orreq r0, r0, #65536 ; 0x10000 + 1f14d34: e35e0000 cmp lr, #0 + 1f14d38: e3a0e016 mov lr, #22 + 1f14d3c: 138cca02 orrne ip, ip, #8192 ; 0x2000 + 1f14d40: 03800a02 orreq r0, r0, #8192 ; 0x2000 + 1f14d44: e584c01c str ip, [r4, #28] + 1f14d48: e5840028 str r0, [r4, #40] ; 0x28 + 1f14d4c: e593c004 ldr ip, [r3, #4] + 1f14d50: e5930004 ldr r0, [r3, #4] + 1f14d54: e15c0000 cmp ip, r0 + 1f14d58: 0afffffc beq 1f14d50 + 1f14d5c: e25ee001 subs lr, lr, #1 + 1f14d60: 1afffff9 bne 1f14d4c + 1f14d64: e3510000 cmp r1, #0 + 1f14d68: 1a000058 bne 1f14ed0 + 1f14d6c: e3a0100e mov r1, #14 + 1f14d70: e593c004 ldr ip, [r3, #4] + 1f14d74: e5930004 ldr r0, [r3, #4] + 1f14d78: e15c0000 cmp ip, r0 + 1f14d7c: 0afffffc beq 1f14d74 + 1f14d80: e2511001 subs r1, r1, #1 + 1f14d84: 1afffff9 bne 1f14d70 + 1f14d88: e2899001 add r9, r9, #1 + 1f14d8c: e3a0a001 mov sl, #1 + 1f14d90: e3590008 cmp r9, #8 + 1f14d94: 1affffb0 bne 1f14c5c + 1f14d98: e59d3040 ldr r3, [sp, #64] ; 0x40 + 1f14d9c: e1a0200a mov r2, sl + 1f14da0: e59d8044 ldr r8, [sp, #68] ; 0x44 + 1f14da4: e59d9014 ldr r9, [sp, #20] + 1f14da8: e5c35000 strb r5, [r3] + 1f14dac: e59d3010 ldr r3, [sp, #16] + 1f14db0: e59d7048 ldr r7, [sp, #72] ; 0x48 + 1f14db4: e59da04c ldr sl, [sp, #76] ; 0x4c + 1f14db8: e5c32000 strb r2, [r3] + 1f14dbc: ea000002 b 1f14dcc + 1f14dc0: e5d73000 ldrb r3, [r7] + 1f14dc4: e3530000 cmp r3, #0 + 1f14dc8: 1affff43 bne 1f14adc + 1f14dcc: ebfffd1a bl 1f1423c + 1f14dd0: e5d92005 ldrb r2, [r9, #5] + 1f14dd4: e5da3000 ldrb r3, [sl] + 1f14dd8: e3520002 cmp r2, #2 + 1f14ddc: 0a000038 beq 1f14ec4 + 1f14de0: e3530000 cmp r3, #0 + 1f14de4: 1affff39 bne 1f14ad0 + 1f14de8: eafffff4 b 1f14dc0 + 1f14dec: e3a0e04b mov lr, #75 ; 0x4b + 1f14df0: e593c004 ldr ip, [r3, #4] + 1f14df4: e5930004 ldr r0, [r3, #4] + 1f14df8: e15c0000 cmp ip, r0 + 1f14dfc: 0afffffc beq 1f14df4 + 1f14e00: e25ee001 subs lr, lr, #1 + 1f14e04: 1afffff9 bne 1f14df0 + 1f14e08: e3520000 cmp r2, #0 + 1f14e0c: e59d0000 ldr r0, [sp] + 1f14e10: 0affffb5 beq 1f14cec + 1f14e14: e3500000 cmp r0, #0 + 1f14e18: 13a0c806 movne ip, #393216 ; 0x60000 + 1f14e1c: 13a00000 movne r0, #0 + 1f14e20: 1affffbe bne 1f14d20 + 1f14e24: e3510000 cmp r1, #0 + 1f14e28: 13a0c806 movne ip, #393216 ; 0x60000 + 1f14e2c: 03a0c802 moveq ip, #131072 ; 0x20000 + 1f14e30: 13a00000 movne r0, #0 + 1f14e34: 03a00701 moveq r0, #262144 ; 0x40000 + 1f14e38: eaffffb8 b 1f14d20 + 1f14e3c: e3510000 cmp r1, #0 + 1f14e40: 1affff92 bne 1f14c90 + 1f14e44: e3520000 cmp r2, #0 + 1f14e48: 1a0000fd bne 1f15244 + 1f14e4c: e59b5000 ldr r5, [fp] + 1f14e50: e35a0000 cmp sl, #0 + 1f14e54: 03a01401 moveq r1, #16777216 ; 0x1000000 + 1f14e58: 13a01612 movne r1, #18874368 ; 0x1200000 + 1f14e5c: e3a00a02 mov r0, #8192 ; 0x2000 + 1f14e60: e3c55612 bic r5, r5, #18874368 ; 0x1200000 + 1f14e64: e3a0ca12 mov ip, #73728 ; 0x12000 + 1f14e68: e1851001 orr r1, r5, r1 + 1f14e6c: e3a0e801 mov lr, #65536 ; 0x10000 + 1f14e70: e5841004 str r1, [r4, #4] + 1f14e74: e1a08000 mov r8, r0 + 1f14e78: e1a0700c mov r7, ip + 1f14e7c: e58de00c str lr, [sp, #12] + 1f14e80: e1a06002 mov r6, r2 + 1f14e84: e1a01002 mov r1, r2 + 1f14e88: e59d5004 ldr r5, [sp, #4] + 1f14e8c: e3550000 cmp r5, #0 + 1f14e90: e59d5008 ldr r5, [sp, #8] + 1f14e94: 11a0e006 movne lr, r6 + 1f14e98: 01a00007 moveq r0, r7 + 1f14e9c: 159d100c ldrne r1, [sp, #12] + 1f14ea0: 01a0c008 moveq ip, r8 + 1f14ea4: e3550000 cmp r5, #0 + 1f14ea8: e3a05001 mov r5, #1 + 1f14eac: 11a0100c movne r1, ip + 1f14eb0: 11a0000e movne r0, lr + 1f14eb4: e584101c str r1, [r4, #28] + 1f14eb8: e1a01005 mov r1, r5 + 1f14ebc: e5840028 str r0, [r4, #40] ; 0x28 + 1f14ec0: eaffff72 b 1f14c90 + 1f14ec4: e3530000 cmp r3, #0 + 1f14ec8: 1affffbc bne 1f14dc0 + 1f14ecc: eaffff23 b 1f14b60 + 1f14ed0: e3520000 cmp r2, #0 + 1f14ed4: 1a000060 bne 1f1505c + 1f14ed8: e59bc000 ldr ip, [fp] + 1f14edc: e3a01a02 mov r1, #8192 ; 0x2000 + 1f14ee0: e59de018 ldr lr, [sp, #24] + 1f14ee4: e3a00a12 mov r0, #73728 ; 0x12000 + 1f14ee8: e3a05801 mov r5, #65536 ; 0x10000 + 1f14eec: e3ccc612 bic ip, ip, #18874368 ; 0x1200000 + 1f14ef0: e18cc00e orr ip, ip, lr + 1f14ef4: e1a08001 mov r8, r1 + 1f14ef8: e584c004 str ip, [r4, #4] + 1f14efc: e1a07000 mov r7, r0 + 1f14f00: e1a0e005 mov lr, r5 + 1f14f04: e1a0c002 mov ip, r2 + 1f14f08: e1a06002 mov r6, r2 + 1f14f0c: e59da004 ldr sl, [sp, #4] + 1f14f10: e35a0000 cmp sl, #0 + 1f14f14: 01a0c005 moveq ip, r5 + 1f14f18: e59d5008 ldr r5, [sp, #8] + 1f14f1c: 01a01007 moveq r1, r7 + 1f14f20: 01a0e006 moveq lr, r6 + 1f14f24: 01a00008 moveq r0, r8 + 1f14f28: e3550000 cmp r5, #0 + 1f14f2c: 11a0e000 movne lr, r0 + 1f14f30: 01a0c001 moveq ip, r1 + 1f14f34: e584e01c str lr, [r4, #28] + 1f14f38: e3a05000 mov r5, #0 + 1f14f3c: e584c028 str ip, [r4, #40] ; 0x28 + 1f14f40: eaffff89 b 1f14d6c + 1f14f44: e3520000 cmp r2, #0 + 1f14f48: e59d0000 ldr r0, [sp] + 1f14f4c: 1a000016 bne 1f14fac + 1f14f50: e3500000 cmp r0, #0 + 1f14f54: 13a0c401 movne ip, #16777216 ; 0x1000000 + 1f14f58: 1a000002 bne 1f14f68 + 1f14f5c: e3510000 cmp r1, #0 + 1f14f60: 03a0c000 moveq ip, #0 + 1f14f64: 13a0c401 movne ip, #16777216 ; 0x1000000 + 1f14f68: e59be000 ldr lr, [fp] + 1f14f6c: e3a00000 mov r0, #0 + 1f14f70: e3cee612 bic lr, lr, #18874368 ; 0x1200000 + 1f14f74: e18ec00c orr ip, lr, ip + 1f14f78: e584c004 str ip, [r4, #4] + 1f14f7c: e1a0c000 mov ip, r0 + 1f14f80: e59de004 ldr lr, [sp, #4] + 1f14f84: e35e0000 cmp lr, #0 + 1f14f88: e59de008 ldr lr, [sp, #8] + 1f14f8c: 138cc801 orrne ip, ip, #65536 ; 0x10000 + 1f14f90: 03800801 orreq r0, r0, #65536 ; 0x10000 + 1f14f94: e35e0000 cmp lr, #0 + 1f14f98: 138cca02 orrne ip, ip, #8192 ; 0x2000 + 1f14f9c: 03800a02 orreq r0, r0, #8192 ; 0x2000 + 1f14fa0: e584c01c str ip, [r4, #28] + 1f14fa4: e5840028 str r0, [r4, #40] ; 0x28 + 1f14fa8: eaffff41 b 1f14cb4 + 1f14fac: e3500000 cmp r0, #0 + 1f14fb0: 13a00802 movne r0, #131072 ; 0x20000 + 1f14fb4: 13a0c701 movne ip, #262144 ; 0x40000 + 1f14fb8: 1afffff0 bne 1f14f80 + 1f14fbc: e3510000 cmp r1, #0 + 1f14fc0: 13a00802 movne r0, #131072 ; 0x20000 + 1f14fc4: 03a00806 moveq r0, #393216 ; 0x60000 + 1f14fc8: 13a0c701 movne ip, #262144 ; 0x40000 + 1f14fcc: 03a0c000 moveq ip, #0 + 1f14fd0: eaffffea b 1f14f80 + 1f14fd4: e3520000 cmp r2, #0 + 1f14fd8: 1a000032 bne 1f150a8 + 1f14fdc: e59d0018 ldr r0, [sp, #24] + 1f14fe0: e35a0000 cmp sl, #0 + 1f14fe4: e59b1000 ldr r1, [fp] + 1f14fe8: e3a06a02 mov r6, #8192 ; 0x2000 + 1f14fec: e59dc020 ldr ip, [sp, #32] + 1f14ff0: 11a0c000 movne ip, r0 + 1f14ff4: e3c11612 bic r1, r1, #18874368 ; 0x1200000 + 1f14ff8: e3a00801 mov r0, #65536 ; 0x10000 + 1f14ffc: e181100c orr r1, r1, ip + 1f15000: e3a05a12 mov r5, #73728 ; 0x12000 + 1f15004: e5841004 str r1, [r4, #4] + 1f15008: e1a08006 mov r8, r6 + 1f1500c: e58d500c str r5, [sp, #12] + 1f15010: e1a0e000 mov lr, r0 + 1f15014: e1a07002 mov r7, r2 + 1f15018: e1a0c002 mov ip, r2 + 1f1501c: e59d1004 ldr r1, [sp, #4] + 1f15020: e3510000 cmp r1, #0 + 1f15024: 11a0c00e movne ip, lr + 1f15028: e59de008 ldr lr, [sp, #8] + 1f1502c: 11a01005 movne r1, r5 + 1f15030: 059d600c ldreq r6, [sp, #12] + 1f15034: 11a00007 movne r0, r7 + 1f15038: 01a01008 moveq r1, r8 + 1f1503c: e3a05000 mov r5, #0 + 1f15040: e35e0000 cmp lr, #0 + 1f15044: 11a0c001 movne ip, r1 + 1f15048: 11a06000 movne r6, r0 + 1f1504c: e584c01c str ip, [r4, #28] + 1f15050: e1a01005 mov r1, r5 + 1f15054: e5846028 str r6, [r4, #40] ; 0x28 + 1f15058: eaffff0c b 1f14c90 + 1f1505c: e59d1000 ldr r1, [sp] + 1f15060: e3510000 cmp r1, #0 + 1f15064: 03a01a42 moveq r1, #270336 ; 0x42000 + 1f15068: 13a01a02 movne r1, #8192 ; 0x2000 + 1f1506c: 03a00a32 moveq r0, #204800 ; 0x32000 + 1f15070: 13a00a72 movne r0, #466944 ; 0x72000 + 1f15074: 03a07a52 moveq r7, #335872 ; 0x52000 + 1f15078: 13a07a12 movne r7, #73728 ; 0x12000 + 1f1507c: 03a08a22 moveq r8, #139264 ; 0x22000 + 1f15080: 13a08a62 movne r8, #401408 ; 0x62000 + 1f15084: 03a06802 moveq r6, #131072 ; 0x20000 + 1f15088: 13a06806 movne r6, #393216 ; 0x60000 + 1f1508c: 03a0c701 moveq ip, #262144 ; 0x40000 + 1f15090: 13a0c000 movne ip, #0 + 1f15094: 03a05805 moveq r5, #327680 ; 0x50000 + 1f15098: 13a05801 movne r5, #65536 ; 0x10000 + 1f1509c: 03a0e803 moveq lr, #196608 ; 0x30000 + 1f150a0: 13a0e807 movne lr, #458752 ; 0x70000 + 1f150a4: eaffff98 b 1f14f0c + 1f150a8: e59d1000 ldr r1, [sp] + 1f150ac: e3510000 cmp r1, #0 + 1f150b0: 13a0ca12 movne ip, #73728 ; 0x12000 + 1f150b4: 03a0ca52 moveq ip, #335872 ; 0x52000 + 1f150b8: e58dc034 str ip, [sp, #52] ; 0x34 + 1f150bc: 13a0c807 movne ip, #458752 ; 0x70000 + 1f150c0: 03a0c803 moveq ip, #196608 ; 0x30000 + 1f150c4: e58dc028 str ip, [sp, #40] ; 0x28 + 1f150c8: 13a0c806 movne ip, #393216 ; 0x60000 + 1f150cc: 03a0c802 moveq ip, #131072 ; 0x20000 + 1f150d0: e58dc024 str ip, [sp, #36] ; 0x24 + 1f150d4: 13a0c000 movne ip, #0 + 1f150d8: 03a0c701 moveq ip, #262144 ; 0x40000 + 1f150dc: 13a01a02 movne r1, #8192 ; 0x2000 + 1f150e0: 03a01a42 moveq r1, #270336 ; 0x42000 + 1f150e4: 13a00a72 movne r0, #466944 ; 0x72000 + 1f150e8: e58d103c str r1, [sp, #60] ; 0x3c + 1f150ec: 03a00a32 moveq r0, #204800 ; 0x32000 + 1f150f0: 13a0ea62 movne lr, #401408 ; 0x62000 + 1f150f4: 03a0ea22 moveq lr, #139264 ; 0x22000 + 1f150f8: 13a07801 movne r7, #65536 ; 0x10000 + 1f150fc: 03a07805 moveq r7, #327680 ; 0x50000 + 1f15100: 13a01a32 movne r1, #204800 ; 0x32000 + 1f15104: 03a01a72 moveq r1, #466944 ; 0x72000 + 1f15108: e58d0038 str r0, [sp, #56] ; 0x38 + 1f1510c: 13a06a22 movne r6, #139264 ; 0x22000 + 1f15110: e58de030 str lr, [sp, #48] ; 0x30 + 1f15114: 03a06a62 moveq r6, #401408 ; 0x62000 + 1f15118: e58d702c str r7, [sp, #44] ; 0x2c + 1f1511c: 13a05a52 movne r5, #335872 ; 0x52000 + 1f15120: 03a05a12 moveq r5, #73728 ; 0x12000 + 1f15124: e58d100c str r1, [sp, #12] + 1f15128: 13a08a42 movne r8, #270336 ; 0x42000 + 1f1512c: e1a0100c mov r1, ip + 1f15130: 03a08a02 moveq r8, #8192 ; 0x2000 + 1f15134: 13a00803 movne r0, #196608 ; 0x30000 + 1f15138: 03a00807 moveq r0, #458752 ; 0x70000 + 1f1513c: 13a0e805 movne lr, #327680 ; 0x50000 + 1f15140: 03a0e801 moveq lr, #65536 ; 0x10000 + 1f15144: 13a07802 movne r7, #131072 ; 0x20000 + 1f15148: 03a07806 moveq r7, #393216 ; 0x60000 + 1f1514c: 13a0c701 movne ip, #262144 ; 0x40000 + 1f15150: 03a0c000 moveq ip, #0 + 1f15154: e35a0000 cmp sl, #0 + 1f15158: 0affffaf beq 1f1501c + 1f1515c: e59d7034 ldr r7, [sp, #52] ; 0x34 + 1f15160: e58d700c str r7, [sp, #12] + 1f15164: e1a07001 mov r7, r1 + 1f15168: e59d603c ldr r6, [sp, #60] ; 0x3c + 1f1516c: e59d5038 ldr r5, [sp, #56] ; 0x38 + 1f15170: e59d8030 ldr r8, [sp, #48] ; 0x30 + 1f15174: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f15178: e59de028 ldr lr, [sp, #40] ; 0x28 + 1f1517c: e59dc024 ldr ip, [sp, #36] ; 0x24 + 1f15180: eaffffa5 b 1f1501c + 1f15184: e30a22f8 movw r2, #41720 ; 0xa2f8 + 1f15188: e340220d movt r2, #525 ; 0x20d + 1f1518c: e59d0010 ldr r0, [sp, #16] + 1f15190: e3a01001 mov r1, #1 + 1f15194: e5d22000 ldrb r2, [r2] + 1f15198: e5c01000 strb r1, [r0] + 1f1519c: e3520000 cmp r2, #0 + 1f151a0: 1a00003a bne 1f15290 + 1f151a4: e30a3307 movw r3, #41735 ; 0xa307 + 1f151a8: e340320d movt r3, #525 ; 0x20d + 1f151ac: e5d33000 ldrb r3, [r3] + 1f151b0: e3530000 cmp r3, #0 + 1f151b4: 13a00401 movne r0, #16777216 ; 0x1000000 + 1f151b8: 1a000005 bne 1f151d4 + 1f151bc: e30a3298 movw r3, #41624 ; 0xa298 + 1f151c0: e340320d movt r3, #525 ; 0x20d + 1f151c4: e5d33000 ldrb r3, [r3] + 1f151c8: e3530000 cmp r3, #0 + 1f151cc: 13a00401 movne r0, #16777216 ; 0x1000000 + 1f151d0: 03a00000 moveq r0, #0 + 1f151d4: e30a22f4 movw r2, #41716 ; 0xa2f4 + 1f151d8: e340220d movt r2, #525 ; 0x20d + 1f151dc: e3a0c000 mov ip, #0 + 1f151e0: e343cf20 movt ip, #16160 ; 0x3f20 + 1f151e4: e3a03000 mov r3, #0 + 1f151e8: e5921000 ldr r1, [r2] + 1f151ec: e1a02003 mov r2, r3 + 1f151f0: e3c11612 bic r1, r1, #18874368 ; 0x1200000 + 1f151f4: e3811602 orr r1, r1, #2097152 ; 0x200000 + 1f151f8: e1811000 orr r1, r1, r0 + 1f151fc: e58c1004 str r1, [ip, #4] + 1f15200: e30a131d movw r1, #41757 ; 0xa31d + 1f15204: e340120d movt r1, #525 ; 0x20d + 1f15208: e5d11000 ldrb r1, [r1] + 1f1520c: e3510000 cmp r1, #0 + 1f15210: e30a1306 movw r1, #41734 ; 0xa306 + 1f15214: e340120d movt r1, #525 ; 0x20d + 1f15218: 13822801 orrne r2, r2, #65536 ; 0x10000 + 1f1521c: 03833801 orreq r3, r3, #65536 ; 0x10000 + 1f15220: e5d11000 ldrb r1, [r1] + 1f15224: e3510000 cmp r1, #0 + 1f15228: e3a01000 mov r1, #0 + 1f1522c: e3431f20 movt r1, #16160 ; 0x3f20 + 1f15230: 13822a02 orrne r2, r2, #8192 ; 0x2000 + 1f15234: 03833a02 orreq r3, r3, #8192 ; 0x2000 + 1f15238: e581201c str r2, [r1, #28] + 1f1523c: e5813028 str r3, [r1, #40] ; 0x28 + 1f15240: eafffe0a b 1f14a70 + 1f15244: e35a0000 cmp sl, #0 + 1f15248: 13a01807 movne r1, #458752 ; 0x70000 + 1f1524c: 03a01805 moveq r1, #327680 ; 0x50000 + 1f15250: 13a00a02 movne r0, #8192 ; 0x2000 + 1f15254: e58d100c str r1, [sp, #12] + 1f15258: 03a00a22 moveq r0, #139264 ; 0x22000 + 1f1525c: 13a0ca72 movne ip, #466944 ; 0x72000 + 1f15260: 03a0ca52 moveq ip, #335872 ; 0x52000 + 1f15264: 13a07a12 movne r7, #73728 ; 0x12000 + 1f15268: 03a07a32 moveq r7, #204800 ; 0x32000 + 1f1526c: 13a08a62 movne r8, #401408 ; 0x62000 + 1f15270: 03a08a42 moveq r8, #270336 ; 0x42000 + 1f15274: 13a0e801 movne lr, #65536 ; 0x10000 + 1f15278: 03a0e803 moveq lr, #196608 ; 0x30000 + 1f1527c: 13a06000 movne r6, #0 + 1f15280: 03a06802 moveq r6, #131072 ; 0x20000 + 1f15284: 13a01806 movne r1, #393216 ; 0x60000 + 1f15288: 03a01701 moveq r1, #262144 ; 0x40000 + 1f1528c: eafffefd b 1f14e88 + 1f15290: e30a2307 movw r2, #41735 ; 0xa307 + 1f15294: e340220d movt r2, #525 ; 0x20d + 1f15298: e5d22000 ldrb r2, [r2] + 1f1529c: e3520000 cmp r2, #0 + 1f152a0: 13a02806 movne r2, #393216 ; 0x60000 + 1f152a4: 1affffd5 bne 1f15200 + 1f152a8: e30a3298 movw r3, #41624 ; 0xa298 + 1f152ac: e340320d movt r3, #525 ; 0x20d + 1f152b0: e5d33000 ldrb r3, [r3] + 1f152b4: e3530000 cmp r3, #0 + 1f152b8: 03a02802 moveq r2, #131072 ; 0x20000 + 1f152bc: 13a02806 movne r2, #393216 ; 0x60000 + 1f152c0: 03a03701 moveq r3, #262144 ; 0x40000 + 1f152c4: 13a03000 movne r3, #0 + 1f152c8: eaffffcc b 1f15200 + +01f152cc : + 1f152cc: e30a32f8 movw r3, #41720 ; 0xa2f8 + 1f152d0: e340320d movt r3, #525 ; 0x20d + 1f152d4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f152d8: e5d33000 ldrb r3, [r3] + 1f152dc: e24dd014 sub sp, sp, #20 + 1f152e0: e3530000 cmp r3, #0 + 1f152e4: e30a3307 movw r3, #41735 ; 0xa307 + 1f152e8: e340320d movt r3, #525 ; 0x20d + 1f152ec: e5d33000 ldrb r3, [r3] + 1f152f0: 1a00002c bne 1f153a8 + 1f152f4: e3530000 cmp r3, #0 + 1f152f8: 13a00612 movne r0, #18874368 ; 0x1200000 + 1f152fc: 13a0c401 movne ip, #16777216 ; 0x1000000 + 1f15300: 0a000072 beq 1f154d0 + 1f15304: e30a22be movw r2, #41662 ; 0xa2be + 1f15308: e340220d movt r2, #525 ; 0x20d + 1f1530c: e30a32f4 movw r3, #41716 ; 0xa2f4 + 1f15310: e340320d movt r3, #525 ; 0x20d + 1f15314: e3a04000 mov r4, #0 + 1f15318: e3434f20 movt r4, #16160 ; 0x3f20 + 1f1531c: e5d22000 ldrb r2, [r2] + 1f15320: e3a01a02 mov r1, #8192 ; 0x2000 + 1f15324: e593e000 ldr lr, [r3] + 1f15328: e3a03a12 mov r3, #73728 ; 0x12000 + 1f1532c: e3520000 cmp r2, #0 + 1f15330: e3a02000 mov r2, #0 + 1f15334: 01a0000c moveq r0, ip + 1f15338: e3cee612 bic lr, lr, #18874368 ; 0x1200000 + 1f1533c: e3a0c801 mov ip, #65536 ; 0x10000 + 1f15340: e18e0000 orr r0, lr, r0 + 1f15344: e1a05001 mov r5, r1 + 1f15348: e5840004 str r0, [r4, #4] + 1f1534c: e1a06003 mov r6, r3 + 1f15350: e1a0000c mov r0, ip + 1f15354: e1a04002 mov r4, r2 + 1f15358: e30ae31d movw lr, #41757 ; 0xa31d + 1f1535c: e340e20d movt lr, #525 ; 0x20d + 1f15360: e5dee000 ldrb lr, [lr] + 1f15364: e35e0000 cmp lr, #0 + 1f15368: e30ae306 movw lr, #41734 ; 0xa306 + 1f1536c: e340e20d movt lr, #525 ; 0x20d + 1f15370: 01a0200c moveq r2, ip + 1f15374: e3a0c000 mov ip, #0 + 1f15378: e343cf20 movt ip, #16160 ; 0x3f20 + 1f1537c: e5dee000 ldrb lr, [lr] + 1f15380: 01a03005 moveq r3, r5 + 1f15384: 01a01006 moveq r1, r6 + 1f15388: 01a00004 moveq r0, r4 + 1f1538c: e35e0000 cmp lr, #0 + 1f15390: 01a03000 moveq r3, r0 + 1f15394: 01a02001 moveq r2, r1 + 1f15398: e58c301c str r3, [ip, #28] + 1f1539c: e58c2028 str r2, [ip, #40] ; 0x28 + 1f153a0: e28dd014 add sp, sp, #20 + 1f153a4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f153a8: e3530000 cmp r3, #0 + 1f153ac: 1a000033 bne 1f15480 + 1f153b0: e30a3298 movw r3, #41624 ; 0xa298 + 1f153b4: e340320d movt r3, #525 ; 0x20d + 1f153b8: e5d33000 ldrb r3, [r3] + 1f153bc: e3530000 cmp r3, #0 + 1f153c0: 03a02805 moveq r2, #327680 ; 0x50000 + 1f153c4: 13a02801 movne r2, #65536 ; 0x10000 + 1f153c8: 03a01a42 moveq r1, #270336 ; 0x42000 + 1f153cc: e58d200c str r2, [sp, #12] + 1f153d0: 13a01a02 movne r1, #8192 ; 0x2000 + 1f153d4: 03a02803 moveq r2, #196608 ; 0x30000 + 1f153d8: 13a02807 movne r2, #458752 ; 0x70000 + 1f153dc: 03a03a32 moveq r3, #204800 ; 0x32000 + 1f153e0: e58d2008 str r2, [sp, #8] + 1f153e4: 13a03a72 movne r3, #466944 ; 0x72000 + 1f153e8: 03a02806 moveq r2, #393216 ; 0x60000 + 1f153ec: 13a02802 movne r2, #131072 ; 0x20000 + 1f153f0: 03a06a52 moveq r6, #335872 ; 0x52000 + 1f153f4: e58d2004 str r2, [sp, #4] + 1f153f8: 13a06a12 movne r6, #73728 ; 0x12000 + 1f153fc: 03a05a22 moveq r5, #139264 ; 0x22000 + 1f15400: 13a05a62 movne r5, #401408 ; 0x62000 + 1f15404: 03a0ba62 moveq fp, #401408 ; 0x62000 + 1f15408: 13a0ba22 movne fp, #139264 ; 0x22000 + 1f1540c: 03a0aa12 moveq sl, #73728 ; 0x12000 + 1f15410: 13a0aa52 movne sl, #335872 ; 0x52000 + 1f15414: 03a09a72 moveq r9, #466944 ; 0x72000 + 1f15418: 13a09a32 movne r9, #204800 ; 0x32000 + 1f1541c: 03a08a02 moveq r8, #8192 ; 0x2000 + 1f15420: 13a08a42 movne r8, #270336 ; 0x42000 + 1f15424: 03a0c807 moveq ip, #458752 ; 0x70000 + 1f15428: 13a0c803 movne ip, #196608 ; 0x30000 + 1f1542c: 03a00801 moveq r0, #65536 ; 0x10000 + 1f15430: 13a00805 movne r0, #327680 ; 0x50000 + 1f15434: 03a04802 moveq r4, #131072 ; 0x20000 + 1f15438: 13a04806 movne r4, #393216 ; 0x60000 + 1f1543c: 03a02701 moveq r2, #262144 ; 0x40000 + 1f15440: 13a02000 movne r2, #0 + 1f15444: 03a07000 moveq r7, #0 + 1f15448: 13a07701 movne r7, #262144 ; 0x40000 + 1f1544c: e30ae2be movw lr, #41662 ; 0xa2be + 1f15450: e340e20d movt lr, #525 ; 0x20d + 1f15454: e5dee000 ldrb lr, [lr] + 1f15458: e35e0000 cmp lr, #0 + 1f1545c: 01a0100b moveq r1, fp + 1f15460: 01a0300a moveq r3, sl + 1f15464: 01a06009 moveq r6, r9 + 1f15468: 01a05008 moveq r5, r8 + 1f1546c: 059d2004 ldreq r2, [sp, #4] + 1f15470: 01a04007 moveq r4, r7 + 1f15474: 159dc00c ldrne ip, [sp, #12] + 1f15478: 159d0008 ldrne r0, [sp, #8] + 1f1547c: eaffffb5 b 1f15358 + 1f15480: e3a02801 mov r2, #65536 ; 0x10000 + 1f15484: e3a01a02 mov r1, #8192 ; 0x2000 + 1f15488: e58d200c str r2, [sp, #12] + 1f1548c: e3a03a72 mov r3, #466944 ; 0x72000 + 1f15490: e3a02807 mov r2, #458752 ; 0x70000 + 1f15494: e3a06a12 mov r6, #73728 ; 0x12000 + 1f15498: e58d2008 str r2, [sp, #8] + 1f1549c: e3a05a62 mov r5, #401408 ; 0x62000 + 1f154a0: e3a02802 mov r2, #131072 ; 0x20000 + 1f154a4: e3a0ba22 mov fp, #139264 ; 0x22000 + 1f154a8: e58d2004 str r2, [sp, #4] + 1f154ac: e3a0aa52 mov sl, #335872 ; 0x52000 + 1f154b0: e3a09a32 mov r9, #204800 ; 0x32000 + 1f154b4: e3a08a42 mov r8, #270336 ; 0x42000 + 1f154b8: e3a0c803 mov ip, #196608 ; 0x30000 + 1f154bc: e3a00805 mov r0, #327680 ; 0x50000 + 1f154c0: e3a04806 mov r4, #393216 ; 0x60000 + 1f154c4: e3a02000 mov r2, #0 + 1f154c8: e3a07701 mov r7, #262144 ; 0x40000 + 1f154cc: eaffffde b 1f1544c + 1f154d0: e30a3298 movw r3, #41624 ; 0xa298 + 1f154d4: e340320d movt r3, #525 ; 0x20d + 1f154d8: e5d33000 ldrb r3, [r3] + 1f154dc: e3530000 cmp r3, #0 + 1f154e0: 13a00612 movne r0, #18874368 ; 0x1200000 + 1f154e4: 03a00602 moveq r0, #2097152 ; 0x200000 + 1f154e8: 13a0c401 movne ip, #16777216 ; 0x1000000 + 1f154ec: 03a0c000 moveq ip, #0 + 1f154f0: eaffff83 b 1f15304 + +01f154f4 : + 1f154f4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f154f8: e30a8298 movw r8, #41624 ; 0xa298 + 1f154fc: e340820d movt r8, #525 ; 0x20d + 1f15500: e24dd034 sub sp, sp, #52 ; 0x34 + 1f15504: e1a04000 mov r4, r0 + 1f15508: e5d83000 ldrb r3, [r8] + 1f1550c: e58d1008 str r1, [sp, #8] + 1f15510: e3530000 cmp r3, #0 + 1f15514: 1a0000bd bne 1f15810 + 1f15518: e30a62d7 movw r6, #41687 ; 0xa2d7 + 1f1551c: e340620d movt r6, #525 ; 0x20d + 1f15520: e30a7305 movw r7, #41733 ; 0xa305 + 1f15524: e340720d movt r7, #525 ; 0x20d + 1f15528: ebfffb43 bl 1f1423c + 1f1552c: e5d43005 ldrb r3, [r4, #5] + 1f15530: e30a5305 movw r5, #41733 ; 0xa305 + 1f15534: e340520d movt r5, #525 ; 0x20d + 1f15538: e3530002 cmp r3, #2 + 1f1553c: e5d62000 ldrb r2, [r6] + 1f15540: 0a000047 beq 1f15664 + 1f15544: e3520000 cmp r2, #0 + 1f15548: 0a000005 beq 1f15564 + 1f1554c: e3a00001 mov r0, #1 + 1f15550: e5c40005 strb r0, [r4, #5] + 1f15554: e1a09000 mov r9, r0 + 1f15558: e1a00009 mov r0, r9 + 1f1555c: e28dd034 add sp, sp, #52 ; 0x34 + 1f15560: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f15564: e5d73000 ldrb r3, [r7] + 1f15568: e3530000 cmp r3, #0 + 1f1556c: 1affffed bne 1f15528 + 1f15570: e5843008 str r3, [r4, #8] + 1f15574: e30a92d6 movw r9, #41686 ; 0xa2d6 + 1f15578: e340920d movt r9, #525 ; 0x20d + 1f1557c: e3a030c8 mov r3, #200 ; 0xc8 + 1f15580: e3a0aa03 mov sl, #12288 ; 0x3000 + 1f15584: e343af00 movt sl, #16128 ; 0x3f00 + 1f15588: e584300c str r3, [r4, #12] + 1f1558c: ebfffb2a bl 1f1423c + 1f15590: e5d42005 ldrb r2, [r4, #5] + 1f15594: e5d63000 ldrb r3, [r6] + 1f15598: e3520002 cmp r2, #2 + 1f1559c: 0a000098 beq 1f15804 + 1f155a0: e3530000 cmp r3, #0 + 1f155a4: 1affffe8 bne 1f1554c + 1f155a8: e5d93000 ldrb r3, [r9] + 1f155ac: e30a72d6 movw r7, #41686 ; 0xa2d6 + 1f155b0: e340720d movt r7, #525 ; 0x20d + 1f155b4: e3530000 cmp r3, #0 + 1f155b8: 0a000031 beq 1f15684 + 1f155bc: e5942008 ldr r2, [r4, #8] + 1f155c0: e594300c ldr r3, [r4, #12] + 1f155c4: e1520003 cmp r2, r3 + 1f155c8: 2a000037 bcs 1f156ac + 1f155cc: e3a0a008 mov sl, #8 + 1f155d0: ea000004 b 1f155e8 + 1f155d4: e3530000 cmp r3, #0 + 1f155d8: 1affffdb bne 1f1554c + 1f155dc: e5d79000 ldrb r9, [r7] + 1f155e0: e3590000 cmp r9, #0 + 1f155e4: 0a000009 beq 1f15610 + 1f155e8: ebfffb13 bl 1f1423c + 1f155ec: e5d42005 ldrb r2, [r4, #5] + 1f155f0: e5d63000 ldrb r3, [r6] + 1f155f4: e3520002 cmp r2, #2 + 1f155f8: 1afffff5 bne 1f155d4 + 1f155fc: e3530000 cmp r3, #0 + 1f15600: 0a000019 beq 1f1566c + 1f15604: e5d79000 ldrb r9, [r7] + 1f15608: e3590000 cmp r9, #0 + 1f1560c: 1afffff5 bne 1f155e8 + 1f15610: e59d1008 ldr r1, [sp, #8] + 1f15614: e5d52000 ldrb r2, [r5] + 1f15618: e5d13000 ldrb r3, [r1] + 1f1561c: e2222001 eor r2, r2, #1 + 1f15620: e1a030c3 asr r3, r3, #1 + 1f15624: e1833382 orr r3, r3, r2, lsl #7 + 1f15628: e5c13000 strb r3, [r1] + 1f1562c: ea000004 b 1f15644 + 1f15630: e3530000 cmp r3, #0 + 1f15634: 1affffc4 bne 1f1554c + 1f15638: e5d73000 ldrb r3, [r7] + 1f1563c: e3530000 cmp r3, #0 + 1f15640: 1a0000e5 bne 1f159dc + 1f15644: ebfffafc bl 1f1423c + 1f15648: e5d42005 ldrb r2, [r4, #5] + 1f1564c: e5d63000 ldrb r3, [r6] + 1f15650: e3520002 cmp r2, #2 + 1f15654: 1afffff5 bne 1f15630 + 1f15658: e3530000 cmp r3, #0 + 1f1565c: 1afffff5 bne 1f15638 + 1f15660: ea000001 b 1f1566c + 1f15664: e3520000 cmp r2, #0 + 1f15668: 1affffbd bne 1f15564 + 1f1566c: e3a09001 mov r9, #1 + 1f15670: e3a03003 mov r3, #3 + 1f15674: e1a00009 mov r0, r9 + 1f15678: e5c43005 strb r3, [r4, #5] + 1f1567c: e28dd034 add sp, sp, #52 ; 0x34 + 1f15680: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f15684: e59a2004 ldr r2, [sl, #4] + 1f15688: e59a3004 ldr r3, [sl, #4] + 1f1568c: e1520003 cmp r2, r3 + 1f15690: 0afffffc beq 1f15688 + 1f15694: e5943008 ldr r3, [r4, #8] + 1f15698: e594200c ldr r2, [r4, #12] + 1f1569c: e2833001 add r3, r3, #1 + 1f156a0: e5843008 str r3, [r4, #8] + 1f156a4: e1530002 cmp r3, r2 + 1f156a8: 3affffb7 bcc 1f1558c + 1f156ac: e5d82000 ldrb r2, [r8] + 1f156b0: e30a3298 movw r3, #41624 ; 0xa298 + 1f156b4: e340320d movt r3, #525 ; 0x20d + 1f156b8: e3520000 cmp r2, #0 + 1f156bc: e30a02f8 movw r0, #41720 ; 0xa2f8 + 1f156c0: e340020d movt r0, #525 ; 0x20d + 1f156c4: 0a00010d beq 1f15b00 + 1f156c8: e30a32be movw r3, #41662 ; 0xa2be + 1f156cc: e340320d movt r3, #525 ; 0x20d + 1f156d0: e30a131d movw r1, #41757 ; 0xa31d + 1f156d4: e340120d movt r1, #525 ; 0x20d + 1f156d8: e30a2306 movw r2, #41734 ; 0xa306 + 1f156dc: e340220d movt r2, #525 ; 0x20d + 1f156e0: e3a09a03 mov r9, #12288 ; 0x3000 + 1f156e4: e3439f00 movt r9, #16128 ; 0x3f00 + 1f156e8: e3a0c049 mov ip, #73 ; 0x49 + 1f156ec: e599a004 ldr sl, [r9, #4] + 1f156f0: e599e004 ldr lr, [r9, #4] + 1f156f4: e15a000e cmp sl, lr + 1f156f8: 0afffffc beq 1f156f0 + 1f156fc: e25cc001 subs ip, ip, #1 + 1f15700: 1afffff9 bne 1f156ec + 1f15704: e5d00000 ldrb r0, [r0] + 1f15708: e5c8c000 strb ip, [r8] + 1f1570c: e3500000 cmp r0, #0 + 1f15710: 1a0000be bne 1f15a10 + 1f15714: e30ae307 movw lr, #41735 ; 0xa307 + 1f15718: e340e20d movt lr, #525 ; 0x20d + 1f1571c: e30a02f4 movw r0, #41716 ; 0xa2f4 + 1f15720: e340020d movt r0, #525 ; 0x20d + 1f15724: e5d3b000 ldrb fp, [r3] + 1f15728: e3a09000 mov r9, #0 + 1f1572c: e3439f20 movt r9, #16160 ; 0x3f20 + 1f15730: e5dee000 ldrb lr, [lr] + 1f15734: e1a0300c mov r3, ip + 1f15738: e590c000 ldr ip, [r0] + 1f1573c: e3a00a02 mov r0, #8192 ; 0x2000 + 1f15740: e35e0000 cmp lr, #0 + 1f15744: e3a0ea12 mov lr, #73728 ; 0x12000 + 1f15748: 03a0a000 moveq sl, #0 + 1f1574c: e58de000 str lr, [sp] + 1f15750: e58d0004 str r0, [sp, #4] + 1f15754: 13a0a401 movne sl, #16777216 ; 0x1000000 + 1f15758: e1a0000e mov r0, lr + 1f1575c: 03a0e602 moveq lr, #2097152 ; 0x200000 + 1f15760: 13a0e612 movne lr, #18874368 ; 0x1200000 + 1f15764: e35b0000 cmp fp, #0 + 1f15768: 01a0e00a moveq lr, sl + 1f1576c: e3ccc612 bic ip, ip, #18874368 ; 0x1200000 + 1f15770: e3a0a801 mov sl, #65536 ; 0x10000 + 1f15774: e18ce00e orr lr, ip, lr + 1f15778: e1a0b000 mov fp, r0 + 1f1577c: e589e004 str lr, [r9, #4] + 1f15780: e1a0c003 mov ip, r3 + 1f15784: e3a09a02 mov r9, #8192 ; 0x2000 + 1f15788: e1a0e00a mov lr, sl + 1f1578c: e5d11000 ldrb r1, [r1] + 1f15790: e3510000 cmp r1, #0 + 1f15794: 01a0e00c moveq lr, ip + 1f15798: e5d2c000 ldrb ip, [r2] + 1f1579c: e3a02000 mov r2, #0 + 1f157a0: e3432f20 movt r2, #16160 ; 0x3f20 + 1f157a4: 01a01009 moveq r1, r9 + 1f157a8: 01a0300a moveq r3, sl + 1f157ac: 159d0004 ldrne r0, [sp, #4] + 1f157b0: 01a0000b moveq r0, fp + 1f157b4: 159d1000 ldrne r1, [sp] + 1f157b8: e35c0000 cmp ip, #0 + 1f157bc: 01a0100e moveq r1, lr + 1f157c0: 01a03000 moveq r3, r0 + 1f157c4: e582101c str r1, [r2, #28] + 1f157c8: e5823028 str r3, [r2, #40] ; 0x28 + 1f157cc: ea000004 b 1f157e4 + 1f157d0: e3530000 cmp r3, #0 + 1f157d4: 1affff5c bne 1f1554c + 1f157d8: e5d73000 ldrb r3, [r7] + 1f157dc: e3530000 cmp r3, #0 + 1f157e0: 1a000079 bne 1f159cc + 1f157e4: ebfffa94 bl 1f1423c + 1f157e8: e5d42005 ldrb r2, [r4, #5] + 1f157ec: e5d63000 ldrb r3, [r6] + 1f157f0: e3520002 cmp r2, #2 + 1f157f4: 1afffff5 bne 1f157d0 + 1f157f8: e3530000 cmp r3, #0 + 1f157fc: 1afffff5 bne 1f157d8 + 1f15800: eaffff99 b 1f1566c + 1f15804: e3530000 cmp r3, #0 + 1f15808: 1affff66 bne 1f155a8 + 1f1580c: eaffff96 b 1f1566c + 1f15810: e30a02f8 movw r0, #41720 ; 0xa2f8 + 1f15814: e340020d movt r0, #525 ; 0x20d + 1f15818: e3a03000 mov r3, #0 + 1f1581c: e5c83000 strb r3, [r8] + 1f15820: e5d00000 ldrb r0, [r0] + 1f15824: e1500003 cmp r0, r3 + 1f15828: 0a000049 beq 1f15954 + 1f1582c: e30a2307 movw r2, #41735 ; 0xa307 + 1f15830: e340220d movt r2, #525 ; 0x20d + 1f15834: e30a32be movw r3, #41662 ; 0xa2be + 1f15838: e340320d movt r3, #525 ; 0x20d + 1f1583c: e5d22000 ldrb r2, [r2] + 1f15840: e5d3b000 ldrb fp, [r3] + 1f15844: e3520000 cmp r2, #0 + 1f15848: 03a03803 moveq r3, #196608 ; 0x30000 + 1f1584c: 13a03807 movne r3, #458752 ; 0x70000 + 1f15850: 03a0c807 moveq ip, #458752 ; 0x70000 + 1f15854: e58d3014 str r3, [sp, #20] + 1f15858: 03a06801 moveq r6, #65536 ; 0x10000 + 1f1585c: 03a03a02 moveq r3, #8192 ; 0x2000 + 1f15860: 13a03a42 movne r3, #270336 ; 0x42000 + 1f15864: 03a09a12 moveq r9, #73728 ; 0x12000 + 1f15868: e58d3000 str r3, [sp] + 1f1586c: 03a07a72 moveq r7, #466944 ; 0x72000 + 1f15870: 03a03806 moveq r3, #393216 ; 0x60000 + 1f15874: 13a0c803 movne ip, #196608 ; 0x30000 + 1f15878: 13a06805 movne r6, #327680 ; 0x50000 + 1f1587c: e58dc004 str ip, [sp, #4] + 1f15880: e58d600c str r6, [sp, #12] + 1f15884: 13a03802 movne r3, #131072 ; 0x20000 + 1f15888: 03a00a42 moveq r0, #270336 ; 0x42000 + 1f1588c: e58d3010 str r3, [sp, #16] + 1f15890: 03a02a32 moveq r2, #204800 ; 0x32000 + 1f15894: 03a05a52 moveq r5, #335872 ; 0x52000 + 1f15898: 03a0ea22 moveq lr, #139264 ; 0x22000 + 1f1589c: 13a01801 movne r1, #65536 ; 0x10000 + 1f158a0: 03a0aa62 moveq sl, #401408 ; 0x62000 + 1f158a4: 13a09a52 movne r9, #335872 ; 0x52000 + 1f158a8: 13a07a32 movne r7, #204800 ; 0x32000 + 1f158ac: 03a0c802 moveq ip, #131072 ; 0x20000 + 1f158b0: 03a03701 moveq r3, #262144 ; 0x40000 + 1f158b4: 03a06000 moveq r6, #0 + 1f158b8: 13a00a02 movne r0, #8192 ; 0x2000 + 1f158bc: 13a02a72 movne r2, #466944 ; 0x72000 + 1f158c0: 13a05a12 movne r5, #73728 ; 0x12000 + 1f158c4: 13a0ea62 movne lr, #401408 ; 0x62000 + 1f158c8: 03a01805 moveq r1, #327680 ; 0x50000 + 1f158cc: 13a0aa22 movne sl, #139264 ; 0x22000 + 1f158d0: 13a0c806 movne ip, #393216 ; 0x60000 + 1f158d4: 13a03000 movne r3, #0 + 1f158d8: 13a06701 movne r6, #262144 ; 0x40000 + 1f158dc: e35b0000 cmp fp, #0 + 1f158e0: 01a02009 moveq r2, r9 + 1f158e4: 01a05007 moveq r5, r7 + 1f158e8: 059de000 ldreq lr, [sp] + 1f158ec: 01a0000a moveq r0, sl + 1f158f0: 059d7004 ldreq r7, [sp, #4] + 1f158f4: 01a0c006 moveq ip, r6 + 1f158f8: 059d900c ldreq r9, [sp, #12] + 1f158fc: 11a07001 movne r7, r1 + 1f15900: 059d3010 ldreq r3, [sp, #16] + 1f15904: 159d9014 ldrne r9, [sp, #20] + 1f15908: e30a131d movw r1, #41757 ; 0xa31d + 1f1590c: e340120d movt r1, #525 ; 0x20d + 1f15910: e5d11000 ldrb r1, [r1] + 1f15914: e3510000 cmp r1, #0 + 1f15918: e3a01000 mov r1, #0 + 1f1591c: e3431f20 movt r1, #16160 ; 0x3f20 + 1f15920: 11a0e002 movne lr, r2 + 1f15924: e30a2306 movw r2, #41734 ; 0xa306 + 1f15928: e340220d movt r2, #525 ; 0x20d + 1f1592c: 01a03007 moveq r3, r7 + 1f15930: 01a00005 moveq r0, r5 + 1f15934: 01a0900c moveq r9, ip + 1f15938: e5d22000 ldrb r2, [r2] + 1f1593c: e3520000 cmp r2, #0 + 1f15940: 01a0e009 moveq lr, r9 + 1f15944: 01a03000 moveq r3, r0 + 1f15948: e581e01c str lr, [r1, #28] + 1f1594c: e5813028 str r3, [r1, #40] ; 0x28 + 1f15950: eafffef0 b 1f15518 + 1f15954: e30a1307 movw r1, #41735 ; 0xa307 + 1f15958: e340120d movt r1, #525 ; 0x20d + 1f1595c: e30a32be movw r3, #41662 ; 0xa2be + 1f15960: e340320d movt r3, #525 ; 0x20d + 1f15964: e30a22f4 movw r2, #41716 ; 0xa2f4 + 1f15968: e340220d movt r2, #525 ; 0x20d + 1f1596c: e5d11000 ldrb r1, [r1] + 1f15970: e3a0e000 mov lr, #0 + 1f15974: e343ef20 movt lr, #16160 ; 0x3f20 + 1f15978: e5d35000 ldrb r5, [r3] + 1f1597c: e3510000 cmp r1, #0 + 1f15980: e592c000 ldr ip, [r2] + 1f15984: 03a01602 moveq r1, #2097152 ; 0x200000 + 1f15988: 03a02000 moveq r2, #0 + 1f1598c: 13a01612 movne r1, #18874368 ; 0x1200000 + 1f15990: 13a02401 movne r2, #16777216 ; 0x1000000 + 1f15994: e3550000 cmp r5, #0 + 1f15998: e1a03000 mov r3, r0 + 1f1599c: 01a01002 moveq r1, r2 + 1f159a0: e3ccc612 bic ip, ip, #18874368 ; 0x1200000 + 1f159a4: e3a00a02 mov r0, #8192 ; 0x2000 + 1f159a8: e3a02a12 mov r2, #73728 ; 0x12000 + 1f159ac: e3a07801 mov r7, #65536 ; 0x10000 + 1f159b0: e18c1001 orr r1, ip, r1 + 1f159b4: e1a05002 mov r5, r2 + 1f159b8: e58e1004 str r1, [lr, #4] + 1f159bc: e1a0c003 mov ip, r3 + 1f159c0: e1a0e000 mov lr, r0 + 1f159c4: e1a09007 mov r9, r7 + 1f159c8: eaffffce b 1f15908 + 1f159cc: e5d43002 ldrb r3, [r4, #2] + 1f159d0: e3833002 orr r3, r3, #2 + 1f159d4: e5c43002 strb r3, [r4, #2] + 1f159d8: eafffefb b 1f155cc + 1f159dc: e24aa001 sub sl, sl, #1 + 1f159e0: e21aa0ff ands sl, sl, #255 ; 0xff + 1f159e4: 1afffeff bne 1f155e8 + 1f159e8: e5d82000 ldrb r2, [r8] + 1f159ec: e30a3298 movw r3, #41624 ; 0xa298 + 1f159f0: e340320d movt r3, #525 ; 0x20d + 1f159f4: e3520000 cmp r2, #0 + 1f159f8: 1afffed6 bne 1f15558 + 1f159fc: e3a02001 mov r2, #1 + 1f15a00: e1a0900a mov r9, sl + 1f15a04: e5c32000 strb r2, [r3] + 1f15a08: ebfffe2f bl 1f152cc + 1f15a0c: eafffed1 b 1f15558 + 1f15a10: e30a0307 movw r0, #41735 ; 0xa307 + 1f15a14: e340020d movt r0, #525 ; 0x20d + 1f15a18: e5d33000 ldrb r3, [r3] + 1f15a1c: e58d302c str r3, [sp, #44] ; 0x2c + 1f15a20: e5d03000 ldrb r3, [r0] + 1f15a24: e3530000 cmp r3, #0 + 1f15a28: 03a00801 moveq r0, #65536 ; 0x10000 + 1f15a2c: 13a00805 movne r0, #327680 ; 0x50000 + 1f15a30: e58d0020 str r0, [sp, #32] + 1f15a34: 03a00000 moveq r0, #0 + 1f15a38: 13a00701 movne r0, #262144 ; 0x40000 + 1f15a3c: e58d0024 str r0, [sp, #36] ; 0x24 + 1f15a40: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f15a44: 03a0ca32 moveq ip, #204800 ; 0x32000 + 1f15a48: 13a0ca72 movne ip, #466944 ; 0x72000 + 1f15a4c: 03a03a42 moveq r3, #270336 ; 0x42000 + 1f15a50: e58dc000 str ip, [sp] + 1f15a54: 13a03a02 movne r3, #8192 ; 0x2000 + 1f15a58: 03a0c803 moveq ip, #196608 ; 0x30000 + 1f15a5c: e58d3004 str r3, [sp, #4] + 1f15a60: 13a0c807 movne ip, #458752 ; 0x70000 + 1f15a64: 03a03a72 moveq r3, #466944 ; 0x72000 + 1f15a68: e58dc014 str ip, [sp, #20] + 1f15a6c: 13a03a32 movne r3, #204800 ; 0x32000 + 1f15a70: 03a0ca62 moveq ip, #401408 ; 0x62000 + 1f15a74: 13a0ca22 movne ip, #139264 ; 0x22000 + 1f15a78: e58d3028 str r3, [sp, #40] ; 0x28 + 1f15a7c: 03a0ea12 moveq lr, #73728 ; 0x12000 + 1f15a80: e58dc010 str ip, [sp, #16] + 1f15a84: 03a03807 moveq r3, #458752 ; 0x70000 + 1f15a88: 03a0ca02 moveq ip, #8192 ; 0x2000 + 1f15a8c: 13a0ca42 movne ip, #270336 ; 0x42000 + 1f15a90: 13a03803 movne r3, #196608 ; 0x30000 + 1f15a94: e58dc00c str ip, [sp, #12] + 1f15a98: e58d301c str r3, [sp, #28] + 1f15a9c: 03a0c806 moveq ip, #393216 ; 0x60000 + 1f15aa0: 13a0c802 movne ip, #131072 ; 0x20000 + 1f15aa4: 03a03701 moveq r3, #262144 ; 0x40000 + 1f15aa8: e58dc018 str ip, [sp, #24] + 1f15aac: 03a0ba52 moveq fp, #335872 ; 0x52000 + 1f15ab0: 03a09a22 moveq r9, #139264 ; 0x22000 + 1f15ab4: 03a0a805 moveq sl, #327680 ; 0x50000 + 1f15ab8: 13a0ea52 movne lr, #335872 ; 0x52000 + 1f15abc: 03a0c802 moveq ip, #131072 ; 0x20000 + 1f15ac0: 13a0ba12 movne fp, #73728 ; 0x12000 + 1f15ac4: 13a09a62 movne r9, #401408 ; 0x62000 + 1f15ac8: 13a0a801 movne sl, #65536 ; 0x10000 + 1f15acc: 13a0c806 movne ip, #393216 ; 0x60000 + 1f15ad0: 13a03000 movne r3, #0 + 1f15ad4: e3500000 cmp r0, #0 + 1f15ad8: 028d3018 addeq r3, sp, #24 + 1f15adc: 058de000 streq lr, [sp] + 1f15ae0: 059d0010 ldreq r0, [sp, #16] + 1f15ae4: 058d0004 streq r0, [sp, #4] + 1f15ae8: 059db028 ldreq fp, [sp, #40] ; 0x28 + 1f15aec: 059d900c ldreq r9, [sp, #12] + 1f15af0: 08934408 ldmeq r3, {r3, sl, lr} + 1f15af4: 059dc024 ldreq ip, [sp, #36] ; 0x24 + 1f15af8: 159de014 ldrne lr, [sp, #20] + 1f15afc: eaffff22 b 1f1578c + 1f15b00: e5d0c000 ldrb ip, [r0] + 1f15b04: e3a02001 mov r2, #1 + 1f15b08: e5c32000 strb r2, [r3] + 1f15b0c: e30a32be movw r3, #41662 ; 0xa2be + 1f15b10: e340320d movt r3, #525 ; 0x20d + 1f15b14: e35c0000 cmp ip, #0 + 1f15b18: 1a000026 bne 1f15bb8 + 1f15b1c: e30a22f4 movw r2, #41716 ; 0xa2f4 + 1f15b20: e340220d movt r2, #525 ; 0x20d + 1f15b24: e5d3e000 ldrb lr, [r3] + 1f15b28: e3a0a000 mov sl, #0 + 1f15b2c: e343af20 movt sl, #16160 ; 0x3f20 + 1f15b30: e5921000 ldr r1, [r2] + 1f15b34: e35e0000 cmp lr, #0 + 1f15b38: 13a0b612 movne fp, #18874368 ; 0x1200000 + 1f15b3c: 03a0b401 moveq fp, #16777216 ; 0x1000000 + 1f15b40: e3c11612 bic r1, r1, #18874368 ; 0x1200000 + 1f15b44: e3a02a02 mov r2, #8192 ; 0x2000 + 1f15b48: e181100b orr r1, r1, fp + 1f15b4c: e3a0ea12 mov lr, #73728 ; 0x12000 + 1f15b50: e58a1004 str r1, [sl, #4] + 1f15b54: e3a09801 mov r9, #65536 ; 0x10000 + 1f15b58: e1a0b00c mov fp, ip + 1f15b5c: e58d200c str r2, [sp, #12] + 1f15b60: e88d4200 stm sp, {r9, lr} + 1f15b64: e30a131d movw r1, #41757 ; 0xa31d + 1f15b68: e340120d movt r1, #525 ; 0x20d + 1f15b6c: e5d1a000 ldrb sl, [r1] + 1f15b70: e35a0000 cmp sl, #0 + 1f15b74: 058db000 streq fp, [sp] + 1f15b78: 11a0a002 movne sl, r2 + 1f15b7c: e30a2306 movw r2, #41734 ; 0xa306 + 1f15b80: e340220d movt r2, #525 ; 0x20d + 1f15b84: 01a0c009 moveq ip, r9 + 1f15b88: e3a09000 mov r9, #0 + 1f15b8c: e3439f20 movt r9, #16160 ; 0x3f20 + 1f15b90: e5d2b000 ldrb fp, [r2] + 1f15b94: 059da004 ldreq sl, [sp, #4] + 1f15b98: 059de00c ldreq lr, [sp, #12] + 1f15b9c: e35b0000 cmp fp, #0 + 1f15ba0: e59db000 ldr fp, [sp] + 1f15ba4: 01a0c00a moveq ip, sl + 1f15ba8: 01a0e00b moveq lr, fp + 1f15bac: e589e01c str lr, [r9, #28] + 1f15bb0: e589c028 str ip, [r9, #40] ; 0x28 + 1f15bb4: eafffec9 b 1f156e0 + 1f15bb8: e5d32000 ldrb r2, [r3] + 1f15bbc: e3520000 cmp r2, #0 + 1f15bc0: 03a01a32 moveq r1, #204800 ; 0x32000 + 1f15bc4: 13a01a12 movne r1, #73728 ; 0x12000 + 1f15bc8: 03a02a22 moveq r2, #139264 ; 0x22000 + 1f15bcc: e58d1004 str r1, [sp, #4] + 1f15bd0: 13a02a02 movne r2, #8192 ; 0x2000 + 1f15bd4: 03a01a42 moveq r1, #270336 ; 0x42000 + 1f15bd8: 13a01a62 movne r1, #401408 ; 0x62000 + 1f15bdc: 03a0ea52 moveq lr, #335872 ; 0x52000 + 1f15be0: e58d100c str r1, [sp, #12] + 1f15be4: 13a0ea72 movne lr, #466944 ; 0x72000 + 1f15be8: 03a01805 moveq r1, #327680 ; 0x50000 + 1f15bec: 13a01807 movne r1, #458752 ; 0x70000 + 1f15bf0: 03a09803 moveq r9, #196608 ; 0x30000 + 1f15bf4: 13a09801 movne r9, #65536 ; 0x10000 + 1f15bf8: e58d1000 str r1, [sp] + 1f15bfc: 03a0c802 moveq ip, #131072 ; 0x20000 + 1f15c00: 13a0c000 movne ip, #0 + 1f15c04: 03a0b701 moveq fp, #262144 ; 0x40000 + 1f15c08: 13a0b806 movne fp, #393216 ; 0x60000 + 1f15c0c: eaffffd4 b 1f15b64 + +01f15c10 : + 1f15c10: e92d4030 push {r4, r5, lr} + 1f15c14: e1a05001 mov r5, r1 + 1f15c18: e24dd014 sub sp, sp, #20 + 1f15c1c: e3500049 cmp r0, #73 ; 0x49 + 1f15c20: 979ff100 ldrls pc, [pc, r0, lsl #2] + 1f15c24: ea00006e b 1f15de4 + 1f15c28: 01f15d50 .word 0x01f15d50 + 1f15c2c: 01f15de4 .word 0x01f15de4 + 1f15c30: 01f15de4 .word 0x01f15de4 + 1f15c34: 01f15de4 .word 0x01f15de4 + 1f15c38: 01f15de4 .word 0x01f15de4 + 1f15c3c: 01f15de4 .word 0x01f15de4 + 1f15c40: 01f15de4 .word 0x01f15de4 + 1f15c44: 01f15de4 .word 0x01f15de4 + 1f15c48: 01f15de4 .word 0x01f15de4 + 1f15c4c: 01f15de4 .word 0x01f15de4 + 1f15c50: 01f15de4 .word 0x01f15de4 + 1f15c54: 01f15de4 .word 0x01f15de4 + 1f15c58: 01f15de4 .word 0x01f15de4 + 1f15c5c: 01f15de4 .word 0x01f15de4 + 1f15c60: 01f15de4 .word 0x01f15de4 + 1f15c64: 01f15de4 .word 0x01f15de4 + 1f15c68: 01f15de4 .word 0x01f15de4 + 1f15c6c: 01f15de4 .word 0x01f15de4 + 1f15c70: 01f15de4 .word 0x01f15de4 + 1f15c74: 01f15de4 .word 0x01f15de4 + 1f15c78: 01f15de4 .word 0x01f15de4 + 1f15c7c: 01f15de4 .word 0x01f15de4 + 1f15c80: 01f15de4 .word 0x01f15de4 + 1f15c84: 01f15de4 .word 0x01f15de4 + 1f15c88: 01f15de4 .word 0x01f15de4 + 1f15c8c: 01f15d84 .word 0x01f15d84 + 1f15c90: 01f15de4 .word 0x01f15de4 + 1f15c94: 01f15de4 .word 0x01f15de4 + 1f15c98: 01f15de4 .word 0x01f15de4 + 1f15c9c: 01f15de4 .word 0x01f15de4 + 1f15ca0: 01f15d94 .word 0x01f15d94 + 1f15ca4: 01f15d94 .word 0x01f15d94 + 1f15ca8: 01f15d94 .word 0x01f15d94 + 1f15cac: 01f15d94 .word 0x01f15d94 + 1f15cb0: 01f15d94 .word 0x01f15d94 + 1f15cb4: 01f15de4 .word 0x01f15de4 + 1f15cb8: 01f15de4 .word 0x01f15de4 + 1f15cbc: 01f15de4 .word 0x01f15de4 + 1f15cc0: 01f15de4 .word 0x01f15de4 + 1f15cc4: 01f15da4 .word 0x01f15da4 + 1f15cc8: 01f15de4 .word 0x01f15de4 + 1f15ccc: 01f15de4 .word 0x01f15de4 + 1f15cd0: 01f15de4 .word 0x01f15de4 + 1f15cd4: 01f15de4 .word 0x01f15de4 + 1f15cd8: 01f15de4 .word 0x01f15de4 + 1f15cdc: 01f15de4 .word 0x01f15de4 + 1f15ce0: 01f15de4 .word 0x01f15de4 + 1f15ce4: 01f15de4 .word 0x01f15de4 + 1f15ce8: 01f15de4 .word 0x01f15de4 + 1f15cec: 01f15de4 .word 0x01f15de4 + 1f15cf0: 01f15de4 .word 0x01f15de4 + 1f15cf4: 01f15de4 .word 0x01f15de4 + 1f15cf8: 01f15de4 .word 0x01f15de4 + 1f15cfc: 01f15de4 .word 0x01f15de4 + 1f15d00: 01f15de4 .word 0x01f15de4 + 1f15d04: 01f15de4 .word 0x01f15de4 + 1f15d08: 01f15de4 .word 0x01f15de4 + 1f15d0c: 01f15de4 .word 0x01f15de4 + 1f15d10: 01f15de4 .word 0x01f15de4 + 1f15d14: 01f15de4 .word 0x01f15de4 + 1f15d18: 01f15de4 .word 0x01f15de4 + 1f15d1c: 01f15de4 .word 0x01f15de4 + 1f15d20: 01f15db4 .word 0x01f15db4 + 1f15d24: 01f15dc4 .word 0x01f15dc4 + 1f15d28: 01f15de4 .word 0x01f15de4 + 1f15d2c: 01f15de4 .word 0x01f15de4 + 1f15d30: 01f15de4 .word 0x01f15de4 + 1f15d34: 01f15de4 .word 0x01f15de4 + 1f15d38: 01f15de4 .word 0x01f15de4 + 1f15d3c: 01f15de4 .word 0x01f15de4 + 1f15d40: 01f15de4 .word 0x01f15de4 + 1f15d44: 01f15de4 .word 0x01f15de4 + 1f15d48: 01f15de4 .word 0x01f15de4 + 1f15d4c: 01f15dd4 .word 0x01f15dd4 + 1f15d50: e30f32c8 movw r3, #62152 ; 0xf2c8 + 1f15d54: e34031f5 movt r3, #501 ; 0x1f5 + 1f15d58: e3a04000 mov r4, #0 + 1f15d5c: e58d2004 str r2, [sp, #4] + 1f15d60: e30f1320 movw r1, #62240 ; 0xf320 + 1f15d64: e34011f5 movt r1, #501 ; 0x1f5 + 1f15d68: e58d5000 str r5, [sp] + 1f15d6c: e1a02004 mov r2, r4 + 1f15d70: e30a0320 movw r0, #41760 ; 0xa320 + 1f15d74: e340020d movt r0, #525 ; 0x20d + 1f15d78: eb00a76a bl 1f3fb28 + 1f15d7c: e28dd014 add sp, sp, #20 + 1f15d80: e8bd8030 pop {r4, r5, pc} + 1f15d84: e30f32cc movw r3, #62156 ; 0xf2cc + 1f15d88: e34031f5 movt r3, #501 ; 0x1f5 + 1f15d8c: e3a04019 mov r4, #25 + 1f15d90: eafffff1 b 1f15d5c + 1f15d94: e30f32e0 movw r3, #62176 ; 0xf2e0 + 1f15d98: e34031f5 movt r3, #501 ; 0x1f5 + 1f15d9c: e1a04000 mov r4, r0 + 1f15da0: eaffffed b 1f15d5c + 1f15da4: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f15da8: e34031f5 movt r3, #501 ; 0x1f5 + 1f15dac: e3a04027 mov r4, #39 ; 0x27 + 1f15db0: eaffffe9 b 1f15d5c + 1f15db4: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f15db8: e34031f5 movt r3, #501 ; 0x1f5 + 1f15dbc: e3a0403e mov r4, #62 ; 0x3e + 1f15dc0: eaffffe5 b 1f15d5c + 1f15dc4: e30f3300 movw r3, #62208 ; 0xf300 + 1f15dc8: e34031f5 movt r3, #501 ; 0x1f5 + 1f15dcc: e3a0403f mov r4, #63 ; 0x3f + 1f15dd0: eaffffe1 b 1f15d5c + 1f15dd4: e30f32d8 movw r3, #62168 ; 0xf2d8 + 1f15dd8: e34031f5 movt r3, #501 ; 0x1f5 + 1f15ddc: e3a04049 mov r4, #73 ; 0x49 + 1f15de0: eaffffdd b 1f15d5c + 1f15de4: e1a04000 mov r4, r0 + 1f15de8: e30f0314 movw r0, #62228 ; 0xf314 + 1f15dec: e34001f5 movt r0, #501 ; 0x1f5 + 1f15df0: e1a01004 mov r1, r4 + 1f15df4: e58d200c str r2, [sp, #12] + 1f15df8: eb00a4d3 bl 1f3f14c + 1f15dfc: e30f330c movw r3, #62220 ; 0xf30c + 1f15e00: e34031f5 movt r3, #501 ; 0x1f5 + 1f15e04: e59d200c ldr r2, [sp, #12] + 1f15e08: eaffffd3 b 1f15d5c + +01f15e0c : + 1f15e0c: e5d03374 ldrb r3, [r0, #884] ; 0x374 + 1f15e10: e92d4030 push {r4, r5, lr} + 1f15e14: e3530000 cmp r3, #0 + 1f15e18: e1a04000 mov r4, r0 + 1f15e1c: e24dd00c sub sp, sp, #12 + 1f15e20: 0a000007 beq 1f15e44 + 1f15e24: e5d03368 ldrb r3, [r0, #872] ; 0x368 + 1f15e28: e2805e12 add r5, r0, #288 ; 0x120 + 1f15e2c: e3530000 cmp r3, #0 + 1f15e30: 1a000008 bne 1f15e58 + 1f15e34: e1a00005 mov r0, r5 + 1f15e38: ebffe3da bl 1f0eda8 + 1f15e3c: e3a03000 mov r3, #0 + 1f15e40: e5c43374 strb r3, [r4, #884] ; 0x374 + 1f15e44: e3a03000 mov r3, #0 + 1f15e48: e584336c str r3, [r4, #876] ; 0x36c + 1f15e4c: e5843370 str r3, [r4, #880] ; 0x370 + 1f15e50: e28dd00c add sp, sp, #12 + 1f15e54: e8bd8030 pop {r4, r5, pc} + 1f15e58: e2801fdd add r1, r0, #884 ; 0x374 + 1f15e5c: e28d3004 add r3, sp, #4 + 1f15e60: e1a00005 mov r0, r5 + 1f15e64: e2811001 add r1, r1, #1 + 1f15e68: e594236c ldr r2, [r4, #876] ; 0x36c + 1f15e6c: ebffe03c bl 1f0df64 + 1f15e70: eaffffef b 1f15e34 + +01f15e74 : + 1f15e74: e92d40f0 push {r4, r5, r6, r7, lr} + 1f15e78: e1a07000 mov r7, r0 + 1f15e7c: e3a00000 mov r0, #0 + 1f15e80: e24dd014 sub sp, sp, #20 + 1f15e84: e2871905 add r1, r7, #81920 ; 0x14000 + 1f15e88: e2876b4d add r6, r7, #78848 ; 0x13400 + 1f15e8c: e1a05000 mov r5, r0 + 1f15e90: e5d73002 ldrb r3, [r7, #2] + 1f15e94: e3a02008 mov r2, #8 + 1f15e98: e5870008 str r0, [r7, #8] + 1f15e9c: e2866038 add r6, r6, #56 ; 0x38 + 1f15ea0: e20330fa and r3, r3, #250 ; 0xfa + 1f15ea4: e5c72003 strb r2, [r7, #3] + 1f15ea8: e587000c str r0, [r7, #12] + 1f15eac: e7c13090 bfi r3, r0, #1, #1 + 1f15eb0: e5c70004 strb r0, [r7, #4] + 1f15eb4: e1a02000 mov r2, r0 + 1f15eb8: e5c73002 strb r3, [r7, #2] + 1f15ebc: e30f32c8 movw r3, #62152 ; 0xf2c8 + 1f15ec0: e34031f5 movt r3, #501 ; 0x1f5 + 1f15ec4: e58d0004 str r0, [sp, #4] + 1f15ec8: e2874e13 add r4, r7, #304 ; 0x130 + 1f15ecc: e58d0000 str r0, [sp] + 1f15ed0: e5c10790 strb r0, [r1, #1936] ; 0x790 + 1f15ed4: e30f1320 movw r1, #62240 ; 0xf320 + 1f15ed8: e34011f5 movt r1, #501 ; 0x1f5 + 1f15edc: e5c70005 strb r0, [r7, #5] + 1f15ee0: e5c70006 strb r0, [r7, #6] + 1f15ee4: e5c70001 strb r0, [r7, #1] + 1f15ee8: e30a0320 movw r0, #41760 ; 0xa320 + 1f15eec: e340020d movt r0, #525 ; 0x20d + 1f15ef0: eb00a70c bl 1f3fb28 + 1f15ef4: ea000008 b 1f15f1c + 1f15ef8: e1a00004 mov r0, r4 + 1f15efc: ebffe3a9 bl 1f0eda8 + 1f15f00: e5c45254 strb r5, [r4, #596] ; 0x254 + 1f15f04: e584524c str r5, [r4, #588] ; 0x24c + 1f15f08: e5845250 str r5, [r4, #592] ; 0x250 + 1f15f0c: e2844d51 add r4, r4, #5184 ; 0x1440 + 1f15f10: e2844038 add r4, r4, #56 ; 0x38 + 1f15f14: e1540006 cmp r4, r6 + 1f15f18: 0a00000c beq 1f15f50 + 1f15f1c: e5d43254 ldrb r3, [r4, #596] ; 0x254 + 1f15f20: e3530000 cmp r3, #0 + 1f15f24: 0afffff6 beq 1f15f04 + 1f15f28: e5d43248 ldrb r3, [r4, #584] ; 0x248 + 1f15f2c: e3530000 cmp r3, #0 + 1f15f30: 0afffff0 beq 1f15ef8 + 1f15f34: e2841f95 add r1, r4, #596 ; 0x254 + 1f15f38: e28d300c add r3, sp, #12 + 1f15f3c: e2811001 add r1, r1, #1 + 1f15f40: e594224c ldr r2, [r4, #588] ; 0x24c + 1f15f44: e1a00004 mov r0, r4 + 1f15f48: ebffe005 bl 1f0df64 + 1f15f4c: eaffffe9 b 1f15ef8 + 1f15f50: e1a00007 mov r0, r7 + 1f15f54: e28dd014 add sp, sp, #20 + 1f15f58: e8bd80f0 pop {r4, r5, r6, r7, pc} + +01f15f5c : + 1f15f5c: e92d4070 push {r4, r5, r6, lr} + 1f15f60: e2801905 add r1, r0, #81920 ; 0x14000 + 1f15f64: e3a0c000 mov ip, #0 + 1f15f68: e5d03002 ldrb r3, [r0, #2] + 1f15f6c: e24dd010 sub sp, sp, #16 + 1f15f70: e5c0c004 strb ip, [r0, #4] + 1f15f74: e2806b4d add r6, r0, #78848 ; 0x13400 + 1f15f78: e20330fe and r3, r3, #254 ; 0xfe + 1f15f7c: e2804e13 add r4, r0, #304 ; 0x130 + 1f15f80: e58dc004 str ip, [sp, #4] + 1f15f84: e7c1309f bfc r3, #1, #1 + 1f15f88: e58dc000 str ip, [sp] + 1f15f8c: e1a0200c mov r2, ip + 1f15f90: e5c03002 strb r3, [r0, #2] + 1f15f94: e30f32c8 movw r3, #62152 ; 0xf2c8 + 1f15f98: e34031f5 movt r3, #501 ; 0x1f5 + 1f15f9c: e5c1c790 strb ip, [r1, #1936] ; 0x790 + 1f15fa0: e30f1320 movw r1, #62240 ; 0xf320 + 1f15fa4: e34011f5 movt r1, #501 ; 0x1f5 + 1f15fa8: e5c0c005 strb ip, [r0, #5] + 1f15fac: e1a0500c mov r5, ip + 1f15fb0: e5c0c006 strb ip, [r0, #6] + 1f15fb4: e2866038 add r6, r6, #56 ; 0x38 + 1f15fb8: e5c0c001 strb ip, [r0, #1] + 1f15fbc: e30a0320 movw r0, #41760 ; 0xa320 + 1f15fc0: e340020d movt r0, #525 ; 0x20d + 1f15fc4: eb00a6d7 bl 1f3fb28 + 1f15fc8: ea000008 b 1f15ff0 + 1f15fcc: e1a00004 mov r0, r4 + 1f15fd0: ebffe374 bl 1f0eda8 + 1f15fd4: e5c45254 strb r5, [r4, #596] ; 0x254 + 1f15fd8: e584524c str r5, [r4, #588] ; 0x24c + 1f15fdc: e5845250 str r5, [r4, #592] ; 0x250 + 1f15fe0: e2844d51 add r4, r4, #5184 ; 0x1440 + 1f15fe4: e2844038 add r4, r4, #56 ; 0x38 + 1f15fe8: e1540006 cmp r4, r6 + 1f15fec: 0a00000c beq 1f16024 + 1f15ff0: e5d43254 ldrb r3, [r4, #596] ; 0x254 + 1f15ff4: e3530000 cmp r3, #0 + 1f15ff8: 0afffff6 beq 1f15fd8 + 1f15ffc: e5d43248 ldrb r3, [r4, #584] ; 0x248 + 1f16000: e3530000 cmp r3, #0 + 1f16004: 0afffff0 beq 1f15fcc + 1f16008: e2841f95 add r1, r4, #596 ; 0x254 + 1f1600c: e28d300c add r3, sp, #12 + 1f16010: e2811001 add r1, r1, #1 + 1f16014: e594224c ldr r2, [r4, #588] ; 0x24c + 1f16018: e1a00004 mov r0, r4 + 1f1601c: ebffdfd0 bl 1f0df64 + 1f16020: eaffffe9 b 1f15fcc + 1f16024: e28dd010 add sp, sp, #16 + 1f16028: e8bd8070 pop {r4, r5, r6, pc} + +01f1602c : + 1f1602c: e92d4070 push {r4, r5, r6, lr} + 1f16030: e2806b4d add r6, r0, #78848 ; 0x13400 + 1f16034: e3a05000 mov r5, #0 + 1f16038: e24dd008 sub sp, sp, #8 + 1f1603c: e2804e13 add r4, r0, #304 ; 0x130 + 1f16040: e2866038 add r6, r6, #56 ; 0x38 + 1f16044: ea000008 b 1f1606c + 1f16048: e1a00004 mov r0, r4 + 1f1604c: ebffe355 bl 1f0eda8 + 1f16050: e5c45254 strb r5, [r4, #596] ; 0x254 + 1f16054: e584524c str r5, [r4, #588] ; 0x24c + 1f16058: e5845250 str r5, [r4, #592] ; 0x250 + 1f1605c: e2844d51 add r4, r4, #5184 ; 0x1440 + 1f16060: e2844038 add r4, r4, #56 ; 0x38 + 1f16064: e1540006 cmp r4, r6 + 1f16068: 0a00000c beq 1f160a0 + 1f1606c: e5d43254 ldrb r3, [r4, #596] ; 0x254 + 1f16070: e3530000 cmp r3, #0 + 1f16074: 0afffff6 beq 1f16054 + 1f16078: e5d43248 ldrb r3, [r4, #584] ; 0x248 + 1f1607c: e3530000 cmp r3, #0 + 1f16080: 0afffff0 beq 1f16048 + 1f16084: e2841f95 add r1, r4, #596 ; 0x254 + 1f16088: e28d3004 add r3, sp, #4 + 1f1608c: e2811001 add r1, r1, #1 + 1f16090: e594224c ldr r2, [r4, #588] ; 0x24c + 1f16094: e1a00004 mov r0, r4 + 1f16098: ebffdfb1 bl 1f0df64 + 1f1609c: eaffffe9 b 1f16048 + 1f160a0: e28dd008 add sp, sp, #8 + 1f160a4: e8bd8070 pop {r4, r5, r6, pc} + +01f160a8 : + 1f160a8: e5d02005 ldrb r2, [r0, #5] + 1f160ac: e30a32d7 movw r3, #41687 ; 0xa2d7 + 1f160b0: e340320d movt r3, #525 ; 0x20d + 1f160b4: e3520002 cmp r2, #2 + 1f160b8: e5d33000 ldrb r3, [r3] + 1f160bc: 0a000004 beq 1f160d4 + 1f160c0: e3530000 cmp r3, #0 + 1f160c4: 13a02001 movne r2, #1 + 1f160c8: 15c02005 strbne r2, [r0, #5] + 1f160cc: e1a00003 mov r0, r3 + 1f160d0: e12fff1e bx lr + 1f160d4: e3530000 cmp r3, #0 + 1f160d8: e2233001 eor r3, r3, #1 + 1f160dc: 03a02003 moveq r2, #3 + 1f160e0: 05c02005 strbeq r2, [r0, #5] + 1f160e4: e1a00003 mov r0, r3 + 1f160e8: e12fff1e bx lr + +01f160ec : + 1f160ec: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f160f0: e1a04000 mov r4, r0 + 1f160f4: e1a06002 mov r6, r2 + 1f160f8: e1a05001 mov r5, r1 + 1f160fc: e3a02a03 mov r2, #12288 ; 0x3000 + 1f16100: e3432f00 movt r2, #16128 ; 0x3f00 + 1f16104: e3a00032 mov r0, #50 ; 0x32 + 1f16108: e5921004 ldr r1, [r2, #4] + 1f1610c: e5923004 ldr r3, [r2, #4] + 1f16110: e1530001 cmp r3, r1 + 1f16114: 0afffffc beq 1f1610c + 1f16118: e2500001 subs r0, r0, #1 + 1f1611c: 1afffff9 bne 1f16108 + 1f16120: e30a32be movw r3, #41662 ; 0xa2be + 1f16124: e340320d movt r3, #525 ; 0x20d + 1f16128: e5d32000 ldrb r2, [r3] + 1f1612c: e3520000 cmp r2, #0 + 1f16130: 1a00001b bne 1f161a4 + 1f16134: e30a72d7 movw r7, #41687 ; 0xa2d7 + 1f16138: e340720d movt r7, #525 ; 0x20d + 1f1613c: e30a8305 movw r8, #41733 ; 0xa305 + 1f16140: e340820d movt r8, #525 ; 0x20d + 1f16144: ebfff83c bl 1f1423c + 1f16148: e5d43005 ldrb r3, [r4, #5] + 1f1614c: e5d70000 ldrb r0, [r7] + 1f16150: e3530002 cmp r3, #2 + 1f16154: 0a00000c beq 1f1618c + 1f16158: e3500000 cmp r0, #0 + 1f1615c: 0a000002 beq 1f1616c + 1f16160: e3a03001 mov r3, #1 + 1f16164: e5c43005 strb r3, [r4, #5] + 1f16168: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f1616c: e5d83000 ldrb r3, [r8] + 1f16170: e3530000 cmp r3, #0 + 1f16174: 1afffff2 bne 1f16144 + 1f16178: e1a02006 mov r2, r6 + 1f1617c: e1a01005 mov r1, r5 + 1f16180: e1a00004 mov r0, r4 + 1f16184: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f16188: eafffa28 b 1f14a30 + 1f1618c: e3500000 cmp r0, #0 + 1f16190: 1afffff5 bne 1f1616c + 1f16194: e3a03003 mov r3, #3 + 1f16198: e3a00001 mov r0, #1 + 1f1619c: e5c43005 strb r3, [r4, #5] + 1f161a0: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f161a4: e30a22f8 movw r2, #41720 ; 0xa2f8 + 1f161a8: e340220d movt r2, #525 ; 0x20d + 1f161ac: e5c30000 strb r0, [r3] + 1f161b0: e5d23000 ldrb r3, [r2] + 1f161b4: e3530000 cmp r3, #0 + 1f161b8: e30a3307 movw r3, #41735 ; 0xa307 + 1f161bc: e340320d movt r3, #525 ; 0x20d + 1f161c0: e5d33000 ldrb r3, [r3] + 1f161c4: 1a00001d bne 1f16240 + 1f161c8: e3530000 cmp r3, #0 + 1f161cc: 13a01401 movne r1, #16777216 ; 0x1000000 + 1f161d0: 0a000027 beq 1f16274 + 1f161d4: e30a22f4 movw r2, #41716 ; 0xa2f4 + 1f161d8: e340220d movt r2, #525 ; 0x20d + 1f161dc: e3a0c000 mov ip, #0 + 1f161e0: e343cf20 movt ip, #16160 ; 0x3f20 + 1f161e4: e3a03000 mov r3, #0 + 1f161e8: e5920000 ldr r0, [r2] + 1f161ec: e1a02003 mov r2, r3 + 1f161f0: e3c00612 bic r0, r0, #18874368 ; 0x1200000 + 1f161f4: e1801001 orr r1, r0, r1 + 1f161f8: e58c1004 str r1, [ip, #4] + 1f161fc: e30a131d movw r1, #41757 ; 0xa31d + 1f16200: e340120d movt r1, #525 ; 0x20d + 1f16204: e5d11000 ldrb r1, [r1] + 1f16208: e3510000 cmp r1, #0 + 1f1620c: e30a1306 movw r1, #41734 ; 0xa306 + 1f16210: e340120d movt r1, #525 ; 0x20d + 1f16214: 13822801 orrne r2, r2, #65536 ; 0x10000 + 1f16218: 03833801 orreq r3, r3, #65536 ; 0x10000 + 1f1621c: e5d11000 ldrb r1, [r1] + 1f16220: e3510000 cmp r1, #0 + 1f16224: e3a01000 mov r1, #0 + 1f16228: e3431f20 movt r1, #16160 ; 0x3f20 + 1f1622c: 13822a02 orrne r2, r2, #8192 ; 0x2000 + 1f16230: 03833a02 orreq r3, r3, #8192 ; 0x2000 + 1f16234: e581201c str r2, [r1, #28] + 1f16238: e5813028 str r3, [r1, #40] ; 0x28 + 1f1623c: eaffffbc b 1f16134 + 1f16240: e3530000 cmp r3, #0 + 1f16244: 13a03802 movne r3, #131072 ; 0x20000 + 1f16248: 13a02701 movne r2, #262144 ; 0x40000 + 1f1624c: 1affffea bne 1f161fc + 1f16250: e30a3298 movw r3, #41624 ; 0xa298 + 1f16254: e340320d movt r3, #525 ; 0x20d + 1f16258: e5d33000 ldrb r3, [r3] + 1f1625c: e3530000 cmp r3, #0 + 1f16260: 03a03806 moveq r3, #393216 ; 0x60000 + 1f16264: 13a03802 movne r3, #131072 ; 0x20000 + 1f16268: 03a02000 moveq r2, #0 + 1f1626c: 13a02701 movne r2, #262144 ; 0x40000 + 1f16270: eaffffe1 b 1f161fc + 1f16274: e30a3298 movw r3, #41624 ; 0xa298 + 1f16278: e340320d movt r3, #525 ; 0x20d + 1f1627c: e5d33000 ldrb r3, [r3] + 1f16280: e3530000 cmp r3, #0 + 1f16284: 13a01401 movne r1, #16777216 ; 0x1000000 + 1f16288: 03a01000 moveq r1, #0 + 1f1628c: eaffffd0 b 1f161d4 + +01f16290 : + 1f16290: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f16294: e3a03000 mov r3, #0 + 1f16298: e30a52d7 movw r5, #41687 ; 0xa2d7 + 1f1629c: e340520d movt r5, #525 ; 0x20d + 1f162a0: e30a62d6 movw r6, #41686 ; 0xa2d6 + 1f162a4: e340620d movt r6, #525 ; 0x20d + 1f162a8: e1a07001 mov r7, r1 + 1f162ac: e1a04000 mov r4, r0 + 1f162b0: e5c13000 strb r3, [r1] + 1f162b4: ebfff7e0 bl 1f1423c + 1f162b8: e5d43005 ldrb r3, [r4, #5] + 1f162bc: e5d50000 ldrb r0, [r5] + 1f162c0: e3530002 cmp r3, #2 + 1f162c4: 0a00000b beq 1f162f8 + 1f162c8: e3500000 cmp r0, #0 + 1f162cc: 0a000002 beq 1f162dc + 1f162d0: e3a03001 mov r3, #1 + 1f162d4: e5c43005 strb r3, [r4, #5] + 1f162d8: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f162dc: e5d63000 ldrb r3, [r6] + 1f162e0: e3530000 cmp r3, #0 + 1f162e4: 1afffff2 bne 1f162b4 + 1f162e8: e1a01007 mov r1, r7 + 1f162ec: e1a00004 mov r0, r4 + 1f162f0: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f162f4: eafffc7e b 1f154f4 + 1f162f8: e3500000 cmp r0, #0 + 1f162fc: 1afffff6 bne 1f162dc + 1f16300: e3a03003 mov r3, #3 + 1f16304: e3a00001 mov r0, #1 + 1f16308: e5c43005 strb r3, [r4, #5] + 1f1630c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f16310 : + 1f16310: e30431c8 movw r3, #16840 ; 0x41c8 + 1f16314: e34031f6 movt r3, #502 ; 0x1f6 + 1f16318: e92d4070 push {r4, r5, r6, lr} + 1f1631c: e5d32000 ldrb r2, [r3] + 1f16320: e24dd010 sub sp, sp, #16 + 1f16324: e3520063 cmp r2, #99 ; 0x63 + 1f16328: 9a000066 bls 1f164c8 + 1f1632c: e308451f movw r4, #34079 ; 0x851f + 1f16330: e34541eb movt r4, #20971 ; 0x51eb + 1f16334: e3a0e064 mov lr, #100 ; 0x64 + 1f16338: e304c1e8 movw ip, #16872 ; 0x41e8 + 1f1633c: e340c1f6 movt ip, #502 ; 0x1f6 + 1f16340: e0854492 umull r4, r5, r2, r4 + 1f16344: e28c1012 add r1, ip, #18 + 1f16348: e1a032a5 lsr r3, r5, #5 + 1f1634c: e2834030 add r4, r3, #48 ; 0x30 + 1f16350: e5cc4011 strb r4, [ip, #17] + 1f16354: e062239e mls r2, lr, r3, r2 + 1f16358: e6ef2072 uxtb r2, r2 + 1f1635c: e30c4ccd movw r4, #52429 ; 0xcccd + 1f16360: e34c4ccc movt r4, #52428 ; 0xcccc + 1f16364: e30431c0 movw r3, #16832 ; 0x41c0 + 1f16368: e34031f6 movt r3, #502 ; 0x1f6 + 1f1636c: e0854492 umull r4, r5, r2, r4 + 1f16370: e3a0c02e mov ip, #46 ; 0x2e + 1f16374: e5c1c002 strb ip, [r1, #2] + 1f16378: e5d33000 ldrb r3, [r3] + 1f1637c: e1a0e1a5 lsr lr, r5, #3 + 1f16380: e3530063 cmp r3, #99 ; 0x63 + 1f16384: e28e4030 add r4, lr, #48 ; 0x30 + 1f16388: e1a0c18e lsl ip, lr, #3 + 1f1638c: e5c14000 strb r4, [r1] + 1f16390: e08cc08e add ip, ip, lr, lsl #1 + 1f16394: 9281e003 addls lr, r1, #3 + 1f16398: e06c2002 rsb r2, ip, r2 + 1f1639c: e2822030 add r2, r2, #48 ; 0x30 + 1f163a0: e5c12001 strb r2, [r1, #1] + 1f163a4: 9a000009 bls 1f163d0 + 1f163a8: e308451f movw r4, #34079 ; 0x851f + 1f163ac: e34541eb movt r4, #20971 ; 0x51eb + 1f163b0: e3a0c064 mov ip, #100 ; 0x64 + 1f163b4: e281e004 add lr, r1, #4 + 1f163b8: e0854493 umull r4, r5, r3, r4 + 1f163bc: e1a022a5 lsr r2, r5, #5 + 1f163c0: e2824030 add r4, r2, #48 ; 0x30 + 1f163c4: e5c14003 strb r4, [r1, #3] + 1f163c8: e063329c mls r3, ip, r2, r3 + 1f163cc: e6ef3073 uxtb r3, r3 + 1f163d0: e30c4ccd movw r4, #52429 ; 0xcccd + 1f163d4: e34c4ccc movt r4, #52428 ; 0xcccc + 1f163d8: e3a0c000 mov ip, #0 + 1f163dc: e58dc004 str ip, [sp, #4] + 1f163e0: e0854493 umull r4, r5, r3, r4 + 1f163e4: e58dc000 str ip, [sp] + 1f163e8: e2801905 add r1, r0, #81920 ; 0x14000 + 1f163ec: e2806b4d add r6, r0, #78848 ; 0x13400 + 1f163f0: e1a021a5 lsr r2, r5, #3 + 1f163f4: e2866038 add r6, r6, #56 ; 0x38 + 1f163f8: e1a0500c mov r5, ip + 1f163fc: e1a04182 lsl r4, r2, #3 + 1f16400: e0844082 add r4, r4, r2, lsl #1 + 1f16404: e2822030 add r2, r2, #48 ; 0x30 + 1f16408: e0643003 rsb r3, r4, r3 + 1f1640c: e5ce2000 strb r2, [lr] + 1f16410: e2833030 add r3, r3, #48 ; 0x30 + 1f16414: e5ce3001 strb r3, [lr, #1] + 1f16418: e2804e13 add r4, r0, #304 ; 0x130 + 1f1641c: e5c0c004 strb ip, [r0, #4] + 1f16420: e5d03002 ldrb r3, [r0, #2] + 1f16424: e1a0200c mov r2, ip + 1f16428: e20330fe and r3, r3, #254 ; 0xfe + 1f1642c: e7c1309f bfc r3, #1, #1 + 1f16430: e5c03002 strb r3, [r0, #2] + 1f16434: e5c1c790 strb ip, [r1, #1936] ; 0x790 + 1f16438: e30f32c8 movw r3, #62152 ; 0xf2c8 + 1f1643c: e34031f5 movt r3, #501 ; 0x1f5 + 1f16440: e5c0c005 strb ip, [r0, #5] + 1f16444: e30f1320 movw r1, #62240 ; 0xf320 + 1f16448: e34011f5 movt r1, #501 ; 0x1f5 + 1f1644c: e5c0c006 strb ip, [r0, #6] + 1f16450: e5c0c001 strb ip, [r0, #1] + 1f16454: e30a0320 movw r0, #41760 ; 0xa320 + 1f16458: e340020d movt r0, #525 ; 0x20d + 1f1645c: eb00a5b1 bl 1f3fb28 + 1f16460: ea000008 b 1f16488 + 1f16464: e1a00004 mov r0, r4 + 1f16468: ebffe24e bl 1f0eda8 + 1f1646c: e5c45254 strb r5, [r4, #596] ; 0x254 + 1f16470: e584524c str r5, [r4, #588] ; 0x24c + 1f16474: e5845250 str r5, [r4, #592] ; 0x250 + 1f16478: e2844d51 add r4, r4, #5184 ; 0x1440 + 1f1647c: e2844038 add r4, r4, #56 ; 0x38 + 1f16480: e1540006 cmp r4, r6 + 1f16484: 0a00000c beq 1f164bc + 1f16488: e5d43254 ldrb r3, [r4, #596] ; 0x254 + 1f1648c: e3530000 cmp r3, #0 + 1f16490: 0afffff6 beq 1f16470 + 1f16494: e5d43248 ldrb r3, [r4, #584] ; 0x248 + 1f16498: e3530000 cmp r3, #0 + 1f1649c: 0afffff0 beq 1f16464 + 1f164a0: e2841f95 add r1, r4, #596 ; 0x254 + 1f164a4: e28d300c add r3, sp, #12 + 1f164a8: e2811001 add r1, r1, #1 + 1f164ac: e594224c ldr r2, [r4, #588] ; 0x24c + 1f164b0: e1a00004 mov r0, r4 + 1f164b4: ebffdeaa bl 1f0df64 + 1f164b8: eaffffe9 b 1f16464 + 1f164bc: ebfff75e bl 1f1423c + 1f164c0: e28dd010 add sp, sp, #16 + 1f164c4: e8bd8070 pop {r4, r5, r6, pc} + 1f164c8: e30411f9 movw r1, #16889 ; 0x41f9 + 1f164cc: e34011f6 movt r1, #502 ; 0x1f6 + 1f164d0: eaffffa1 b 1f1635c + +01f164d4 : + 1f164d4: e92d40f0 push {r4, r5, r6, r7, lr} + 1f164d8: e1a04002 mov r4, r2 + 1f164dc: e1a06000 mov r6, r0 + 1f164e0: e2800b52 add r0, r0, #83968 ; 0x14800 + 1f164e4: e1a01002 mov r1, r2 + 1f164e8: e24dd00c sub sp, sp, #12 + 1f164ec: e3a02e12 mov r2, #288 ; 0x120 + 1f164f0: e2800090 add r0, r0, #144 ; 0x90 + 1f164f4: e284501a add r5, r4, #26 + 1f164f8: eb00a240 bl 1f3ee00 + 1f164fc: e1a00005 mov r0, r5 + 1f16500: ebfff299 bl 1f12f6c + 1f16504: e2507000 subs r7, r0, #0 + 1f16508: 1a000018 bne 1f16570 + 1f1650c: e5d4300c ldrb r3, [r4, #12] + 1f16510: e3130010 tst r3, #16 + 1f16514: 1a000002 bne 1f16524 + 1f16518: e1a00007 mov r0, r7 + 1f1651c: e28dd00c add sp, sp, #12 + 1f16520: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f16524: e1a00005 mov r0, r5 + 1f16528: ebffe343 bl 1f0f23c + 1f1652c: e3500000 cmp r0, #0 + 1f16530: 03a03002 moveq r3, #2 + 1f16534: 05c63000 strbeq r3, [r6] + 1f16538: 0afffff6 beq 1f16518 + 1f1653c: e58d7004 str r7, [sp, #4] + 1f16540: e3a0203e mov r2, #62 ; 0x3e + 1f16544: e58d7000 str r7, [sp] + 1f16548: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f1654c: e34031f5 movt r3, #501 ; 0x1f5 + 1f16550: e30f1320 movw r1, #62240 ; 0xf320 + 1f16554: e34011f5 movt r1, #501 ; 0x1f5 + 1f16558: e30a0320 movw r0, #41760 ; 0xa320 + 1f1655c: e340020d movt r0, #525 ; 0x20d + 1f16560: eb00a570 bl 1f3fb28 + 1f16564: e1a00007 mov r0, r7 + 1f16568: e28dd00c add sp, sp, #12 + 1f1656c: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f16570: e2860b51 add r0, r6, #82944 ; 0x14400 + 1f16574: e1a01005 mov r1, r5 + 1f16578: e2800e39 add r0, r0, #912 ; 0x390 + 1f1657c: eb00a6a7 bl 1f40020 + 1f16580: e1a00007 mov r0, r7 + 1f16584: e28dd00c add sp, sp, #12 + 1f16588: e8bd80f0 pop {r4, r5, r6, r7, pc} + +01f1658c : + 1f1658c: e92d40f0 push {r4, r5, r6, r7, lr} + 1f16590: e1a05000 mov r5, r0 + 1f16594: e1d230d0 ldrsb r3, [r2] + 1f16598: e24ddeb7 sub sp, sp, #2928 ; 0xb70 + 1f1659c: e24dd00c sub sp, sp, #12 + 1f165a0: e353002f cmp r3, #47 ; 0x2f + 1f165a4: e28d4058 add r4, sp, #88 ; 0x58 + 1f165a8: 0a00006e beq 1f16768 + 1f165ac: e1a01002 mov r1, r2 + 1f165b0: e1a00004 mov r0, r4 + 1f165b4: eb00a699 bl 1f40020 + 1f165b8: e1a00004 mov r0, r4 + 1f165bc: eb00a6d3 bl 1f40110 + 1f165c0: e2506000 subs r6, r0, #0 + 1f165c4: c2460001 subgt r0, r6, #1 + 1f165c8: c2442001 subgt r2, r4, #1 + 1f165cc: c0840000 addgt r0, r4, r0 + 1f165d0: ca000003 bgt 1f165e4 + 1f165d4: ea000013 b 1f16628 + 1f165d8: e1500002 cmp r0, r2 + 1f165dc: e5c23000 strb r3, [r2] + 1f165e0: 0a000010 beq 1f16628 + 1f165e4: e1f230d1 ldrsb r3, [r2, #1]! + 1f165e8: e353002f cmp r3, #47 ; 0x2f + 1f165ec: e6ef3073 uxtb r3, r3 + 1f165f0: e283103f add r1, r3, #63 ; 0x3f + 1f165f4: 03a0305c moveq r3, #92 ; 0x5c + 1f165f8: 0afffff6 beq 1f165d8 + 1f165fc: e6ef1071 uxtb r1, r1 + 1f16600: e3510019 cmp r1, #25 + 1f16604: 92233080 eorls r3, r3, #128 ; 0x80 + 1f16608: 9afffff2 bls 1f165d8 + 1f1660c: e2431041 sub r1, r3, #65 ; 0x41 + 1f16610: e283c020 add ip, r3, #32 + 1f16614: e3510019 cmp r1, #25 + 1f16618: 96ef307c uxtbls r3, ip + 1f1661c: e1500002 cmp r0, r2 + 1f16620: e5c23000 strb r3, [r2] + 1f16624: 1affffee bne 1f165e4 + 1f16628: e1a01004 mov r1, r4 + 1f1662c: e30f0344 movw r0, #62276 ; 0xf344 + 1f16630: e34001f5 movt r0, #501 ; 0x1f5 + 1f16634: eb00a2c4 bl 1f3f14c + 1f16638: e1d430d0 ldrsb r3, [r4] + 1f1663c: e353005f cmp r3, #95 ; 0x5f + 1f16640: 03560001 cmpeq r6, #1 + 1f16644: 03a01001 moveq r1, #1 + 1f16648: 13a01000 movne r1, #0 + 1f1664c: 0a00009c beq 1f168c4 + 1f16650: e3a02c01 mov r2, #256 ; 0x100 + 1f16654: e28d0f56 add r0, sp, #344 ; 0x158 + 1f16658: eb00a26f bl 1f3f01c + 1f1665c: e3a0105c mov r1, #92 ; 0x5c + 1f16660: e1a00004 mov r0, r4 + 1f16664: eb00a71f bl 1f402e8 + 1f16668: e2506000 subs r6, r0, #0 + 1f1666c: 0a000059 beq 1f167d8 + 1f16670: e0642006 rsb r2, r4, r6 + 1f16674: e1a01004 mov r1, r4 + 1f16678: e28d0f56 add r0, sp, #344 ; 0x158 + 1f1667c: eb00a6e0 bl 1f40204 + 1f16680: e28d1f96 add r1, sp, #600 ; 0x258 + 1f16684: e28d0f56 add r0, sp, #344 ; 0x158 + 1f16688: ebffe6d9 bl 1f101f4 + 1f1668c: e3500000 cmp r0, #0 + 1f16690: 0a00000d beq 1f166cc + 1f16694: e3a02000 mov r2, #0 + 1f16698: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f1669c: e34031f5 movt r3, #501 ; 0x1f5 + 1f166a0: e58d2004 str r2, [sp, #4] + 1f166a4: e30f1320 movw r1, #62240 ; 0xf320 + 1f166a8: e34011f5 movt r1, #501 ; 0x1f5 + 1f166ac: e58d2000 str r2, [sp] + 1f166b0: e30a0320 movw r0, #41760 ; 0xa320 + 1f166b4: e340020d movt r0, #525 ; 0x20d + 1f166b8: e3a0203e mov r2, #62 ; 0x3e + 1f166bc: eb00a519 bl 1f3fb28 + 1f166c0: e28ddeb7 add sp, sp, #2928 ; 0xb70 + 1f166c4: e28dd00c add sp, sp, #12 + 1f166c8: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f166cc: e5dd3264 ldrb r3, [sp, #612] ; 0x264 + 1f166d0: e3130010 tst r3, #16 + 1f166d4: 0affffee beq 1f16694 + 1f166d8: e3a01b01 mov r1, #1024 ; 0x400 + 1f166dc: e28d0fde add r0, sp, #888 ; 0x378 + 1f166e0: ebffe31f bl 1f0f364 + 1f166e4: e3500000 cmp r0, #0 + 1f166e8: 1afffff4 bne 1f166c0 + 1f166ec: e28d0f56 add r0, sp, #344 ; 0x158 + 1f166f0: ebffe2d1 bl 1f0f23c + 1f166f4: e28d0e77 add r0, sp, #1904 ; 0x770 + 1f166f8: e3a01b01 mov r1, #1024 ; 0x400 + 1f166fc: e2800008 add r0, r0, #8 + 1f16700: ebffe317 bl 1f0f364 + 1f16704: e2863001 add r3, r6, #1 + 1f16708: e30f234c movw r2, #62284 ; 0xf34c + 1f1670c: e34021f5 movt r2, #501 ; 0x1f5 + 1f16710: e28d1f96 add r1, sp, #600 ; 0x258 + 1f16714: e28d0008 add r0, sp, #8 + 1f16718: ebffe63e bl 1f10018 + 1f1671c: e2507000 subs r7, r0, #0 + 1f16720: 1a000002 bne 1f16730 + 1f16724: e5dd3272 ldrb r3, [sp, #626] ; 0x272 + 1f16728: e3530000 cmp r3, #0 + 1f1672c: 1a000016 bne 1f1678c + 1f16730: e3a02000 mov r2, #0 + 1f16734: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f16738: e34031f5 movt r3, #501 ; 0x1f5 + 1f1673c: e30f1320 movw r1, #62240 ; 0xf320 + 1f16740: e34011f5 movt r1, #501 ; 0x1f5 + 1f16744: e58d2004 str r2, [sp, #4] + 1f16748: e58d2000 str r2, [sp] + 1f1674c: e3a0203e mov r2, #62 ; 0x3e + 1f16750: e30a0320 movw r0, #41760 ; 0xa320 + 1f16754: e340020d movt r0, #525 ; 0x20d + 1f16758: eb00a4f2 bl 1f3fb28 + 1f1675c: e28d0fde add r0, sp, #888 ; 0x378 + 1f16760: ebffe2b5 bl 1f0f23c + 1f16764: eaffffd5 b 1f166c0 + 1f16768: e1d230d1 ldrsb r3, [r2, #1] + 1f1676c: e353002f cmp r3, #47 ; 0x2f + 1f16770: 1affff8d bne 1f165ac + 1f16774: e2822002 add r2, r2, #2 + 1f16778: e1a00004 mov r0, r4 + 1f1677c: e30f1338 movw r1, #62264 ; 0xf338 + 1f16780: e34011f5 movt r1, #501 ; 0x1f5 + 1f16784: eb00a4e7 bl 1f3fb28 + 1f16788: eaffff8a b 1f165b8 + 1f1678c: e28d3f96 add r3, sp, #600 ; 0x258 + 1f16790: e283401a add r4, r3, #26 + 1f16794: e1a00004 mov r0, r4 + 1f16798: ebfff1f3 bl 1f12f6c + 1f1679c: e2506000 subs r6, r0, #0 + 1f167a0: 0a000053 beq 1f168f4 + 1f167a4: e2851b52 add r1, r5, #83968 ; 0x14800 + 1f167a8: e1a00004 mov r0, r4 + 1f167ac: e2811090 add r1, r1, #144 ; 0x90 + 1f167b0: ebffe68f bl 1f101f4 + 1f167b4: e3500000 cmp r0, #0 + 1f167b8: 0a000058 beq 1f16920 + 1f167bc: e28d0fde add r0, sp, #888 ; 0x378 + 1f167c0: ebffe29d bl 1f0f23c + 1f167c4: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f167c8: e34031f5 movt r3, #501 ; 0x1f5 + 1f167cc: e58d7004 str r7, [sp, #4] + 1f167d0: e58d7000 str r7, [sp] + 1f167d4: ea000033 b 1f168a8 + 1f167d8: e28d0e77 add r0, sp, #1904 ; 0x770 + 1f167dc: e1a01004 mov r1, r4 + 1f167e0: e2800008 add r0, r0, #8 + 1f167e4: eb00a60d bl 1f40020 + 1f167e8: e3a0102e mov r1, #46 ; 0x2e + 1f167ec: e1a00004 mov r0, r4 + 1f167f0: eb00a6bc bl 1f402e8 + 1f167f4: e2507000 subs r7, r0, #0 + 1f167f8: 0a00004d beq 1f16934 + 1f167fc: e28d0e77 add r0, sp, #1904 ; 0x770 + 1f16800: e3a0102e mov r1, #46 ; 0x2e + 1f16804: e2800008 add r0, r0, #8 + 1f16808: eb00a6b6 bl 1f402e8 + 1f1680c: e3a0302a mov r3, #42 ; 0x2a + 1f16810: e5c03000 strb r3, [r0] + 1f16814: e1d730d0 ldrsb r3, [r7] + 1f16818: e5c03001 strb r3, [r0, #1] + 1f1681c: e1d730d1 ldrsb r3, [r7, #1] + 1f16820: e5c03002 strb r3, [r0, #2] + 1f16824: e1d730d2 ldrsb r3, [r7, #2] + 1f16828: e5c03003 strb r3, [r0, #3] + 1f1682c: e1d730d3 ldrsb r3, [r7, #3] + 1f16830: e5c03004 strb r3, [r0, #4] + 1f16834: e5c06005 strb r6, [r0, #5] + 1f16838: e28d3e77 add r3, sp, #1904 ; 0x770 + 1f1683c: e28d1f96 add r1, sp, #600 ; 0x258 + 1f16840: e2833008 add r3, r3, #8 + 1f16844: e30f234c movw r2, #62284 ; 0xf34c + 1f16848: e34021f5 movt r2, #501 ; 0x1f5 + 1f1684c: e28d0008 add r0, sp, #8 + 1f16850: ebffe5f0 bl 1f10018 + 1f16854: e2507000 subs r7, r0, #0 + 1f16858: 1affff8d bne 1f16694 + 1f1685c: e5dd3272 ldrb r3, [sp, #626] ; 0x272 + 1f16860: e3530000 cmp r3, #0 + 1f16864: 0affff8a beq 1f16694 + 1f16868: e28d3f96 add r3, sp, #600 ; 0x258 + 1f1686c: e283401a add r4, r3, #26 + 1f16870: e1a00004 mov r0, r4 + 1f16874: ebfff1bc bl 1f12f6c + 1f16878: e2506000 subs r6, r0, #0 + 1f1687c: 0a000015 beq 1f168d8 + 1f16880: e2851b52 add r1, r5, #83968 ; 0x14800 + 1f16884: e1a00004 mov r0, r4 + 1f16888: e2811090 add r1, r1, #144 ; 0x90 + 1f1688c: ebffe658 bl 1f101f4 + 1f16890: e3500000 cmp r0, #0 + 1f16894: 0a000021 beq 1f16920 + 1f16898: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f1689c: e34031f5 movt r3, #501 ; 0x1f5 + 1f168a0: e58d7004 str r7, [sp, #4] + 1f168a4: e58d7000 str r7, [sp] + 1f168a8: e30f1320 movw r1, #62240 ; 0xf320 + 1f168ac: e34011f5 movt r1, #501 ; 0x1f5 + 1f168b0: e30a0320 movw r0, #41760 ; 0xa320 + 1f168b4: e340020d movt r0, #525 ; 0x20d + 1f168b8: e3a0203e mov r2, #62 ; 0x3e + 1f168bc: eb00a499 bl 1f3fb28 + 1f168c0: eaffff7e b 1f166c0 + 1f168c4: e3a03003 mov r3, #3 + 1f168c8: e5c53000 strb r3, [r5] + 1f168cc: e28ddeb7 add sp, sp, #2928 ; 0xb70 + 1f168d0: e28dd00c add sp, sp, #12 + 1f168d4: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f168d8: e1a00004 mov r0, r4 + 1f168dc: ebffe256 bl 1f0f23c + 1f168e0: e3500000 cmp r0, #0 + 1f168e4: 1a000018 bne 1f1694c + 1f168e8: e3a03002 mov r3, #2 + 1f168ec: e5c53000 strb r3, [r5] + 1f168f0: eaffff72 b 1f166c0 + 1f168f4: e1a00004 mov r0, r4 + 1f168f8: ebffe24f bl 1f0f23c + 1f168fc: e3500000 cmp r0, #0 + 1f16900: 0afffff8 beq 1f168e8 + 1f16904: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f16908: e34031f5 movt r3, #501 ; 0x1f5 + 1f1690c: e30f1320 movw r1, #62240 ; 0xf320 + 1f16910: e34011f5 movt r1, #501 ; 0x1f5 + 1f16914: e58d6004 str r6, [sp, #4] + 1f16918: e58d6000 str r6, [sp] + 1f1691c: eaffff8a b 1f1674c + 1f16920: e2850b51 add r0, r5, #82944 ; 0x14400 + 1f16924: e1a01004 mov r1, r4 + 1f16928: e2800e39 add r0, r0, #912 ; 0x390 + 1f1692c: eb00a5bb bl 1f40020 + 1f16930: eaffff62 b 1f166c0 + 1f16934: e1a00004 mov r0, r4 + 1f16938: eb00a5f4 bl 1f40110 + 1f1693c: e350000f cmp r0, #15 + 1f16940: c3a0302a movgt r3, #42 ; 0x2a + 1f16944: c5cd3787 strbgt r3, [sp, #1927] ; 0x787 + 1f16948: eaffffba b 1f16838 + 1f1694c: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f16950: e34031f5 movt r3, #501 ; 0x1f5 + 1f16954: e58d6004 str r6, [sp, #4] + 1f16958: e58d6000 str r6, [sp] + 1f1695c: eaffffd1 b 1f168a8 + +01f16960 : + 1f16960: e92d4030 push {r4, r5, lr} + 1f16964: e1a04000 mov r4, r0 + 1f16968: e1d230d0 ldrsb r3, [r2] + 1f1696c: e24ddf41 sub sp, sp, #260 ; 0x104 + 1f16970: e1a0500d mov r5, sp + 1f16974: e353002f cmp r3, #47 ; 0x2f + 1f16978: 0a000024 beq 1f16a10 + 1f1697c: e1a01002 mov r1, r2 + 1f16980: e1a00005 mov r0, r5 + 1f16984: eb00a5a5 bl 1f40020 + 1f16988: e1a00005 mov r0, r5 + 1f1698c: eb00a5df bl 1f40110 + 1f16990: e3500000 cmp r0, #0 + 1f16994: c2400001 subgt r0, r0, #1 + 1f16998: c2452001 subgt r2, r5, #1 + 1f1699c: c0850000 addgt r0, r5, r0 + 1f169a0: ca000003 bgt 1f169b4 + 1f169a4: ea000013 b 1f169f8 + 1f169a8: e1500002 cmp r0, r2 + 1f169ac: e5c23000 strb r3, [r2] + 1f169b0: 0a000010 beq 1f169f8 + 1f169b4: e1f230d1 ldrsb r3, [r2, #1]! + 1f169b8: e353002f cmp r3, #47 ; 0x2f + 1f169bc: e6ef3073 uxtb r3, r3 + 1f169c0: e283103f add r1, r3, #63 ; 0x3f + 1f169c4: 03a0305c moveq r3, #92 ; 0x5c + 1f169c8: 0afffff6 beq 1f169a8 + 1f169cc: e6ef1071 uxtb r1, r1 + 1f169d0: e3510019 cmp r1, #25 + 1f169d4: 92233080 eorls r3, r3, #128 ; 0x80 + 1f169d8: 9afffff2 bls 1f169a8 + 1f169dc: e2431041 sub r1, r3, #65 ; 0x41 + 1f169e0: e283c020 add ip, r3, #32 + 1f169e4: e3510019 cmp r1, #25 + 1f169e8: 96ef307c uxtbls r3, ip + 1f169ec: e1500002 cmp r0, r2 + 1f169f0: e5c23000 strb r3, [r2] + 1f169f4: 1affffee bne 1f169b4 + 1f169f8: e1a00005 mov r0, r5 + 1f169fc: ebffe7e3 bl 1f10990 + 1f16a00: e3a03005 mov r3, #5 + 1f16a04: e5c43000 strb r3, [r4] + 1f16a08: e28ddf41 add sp, sp, #260 ; 0x104 + 1f16a0c: e8bd8030 pop {r4, r5, pc} + 1f16a10: e1d230d1 ldrsb r3, [r2, #1] + 1f16a14: e353002f cmp r3, #47 ; 0x2f + 1f16a18: 1affffd7 bne 1f1697c + 1f16a1c: e2822002 add r2, r2, #2 + 1f16a20: e1a0000d mov r0, sp + 1f16a24: e30f1338 movw r1, #62264 ; 0xf338 + 1f16a28: e34011f5 movt r1, #501 ; 0x1f5 + 1f16a2c: eb00a43d bl 1f3fb28 + 1f16a30: eaffffd4 b 1f16988 + +01f16a34 : + 1f16a34: e92d4030 push {r4, r5, lr} + 1f16a38: e303468d movw r4, #13965 ; 0x368d + 1f16a3c: e3404001 movt r4, #1 + 1f16a40: e24ddf9f sub sp, sp, #636 ; 0x27c + 1f16a44: e0804004 add r4, r0, r4 + 1f16a48: e1a05000 mov r5, r0 + 1f16a4c: e3a0103a mov r1, #58 ; 0x3a + 1f16a50: e1a00004 mov r0, r4 + 1f16a54: e3a03000 mov r3, #0 + 1f16a58: e5cd3058 strb r3, [sp, #88] ; 0x58 + 1f16a5c: eb00a48c bl 1f3fc94 + 1f16a60: e3500000 cmp r0, #0 + 1f16a64: 0a00001f beq 1f16ae8 + 1f16a68: e28d1058 add r1, sp, #88 ; 0x58 + 1f16a6c: e3a02000 mov r2, #0 + 1f16a70: ebfff78b bl 1f148a4 + 1f16a74: e1dd35d8 ldrsb r3, [sp, #88] ; 0x58 + 1f16a78: e3530000 cmp r3, #0 + 1f16a7c: 0a000024 beq 1f16b14 + 1f16a80: e28d3058 add r3, sp, #88 ; 0x58 + 1f16a84: e28d1f56 add r1, sp, #344 ; 0x158 + 1f16a88: e30f234c movw r2, #62284 ; 0xf34c + 1f16a8c: e34021f5 movt r2, #501 ; 0x1f5 + 1f16a90: e28d0008 add r0, sp, #8 + 1f16a94: ebffe55f bl 1f10018 + 1f16a98: e3500000 cmp r0, #0 + 1f16a9c: 1a000029 bne 1f16b48 + 1f16aa0: e5dd3172 ldrb r3, [sp, #370] ; 0x172 + 1f16aa4: e3530000 cmp r3, #0 + 1f16aa8: 0a000024 beq 1f16b40 + 1f16aac: e5dd3164 ldrb r3, [sp, #356] ; 0x164 + 1f16ab0: e3130010 tst r3, #16 + 1f16ab4: 0a000021 beq 1f16b40 + 1f16ab8: e28d3f56 add r3, sp, #344 ; 0x158 + 1f16abc: e30f0350 movw r0, #62288 ; 0xf350 + 1f16ac0: e34001f5 movt r0, #501 ; 0x1f5 + 1f16ac4: e283401a add r4, r3, #26 + 1f16ac8: e1a01004 mov r1, r4 + 1f16acc: eb00a19e bl 1f3f14c + 1f16ad0: e1a00004 mov r0, r4 + 1f16ad4: ebffe72a bl 1f10784 + 1f16ad8: e3a03005 mov r3, #5 + 1f16adc: e5c53000 strb r3, [r5] + 1f16ae0: e28ddf9f add sp, sp, #636 ; 0x27c + 1f16ae4: e8bd8030 pop {r4, r5, pc} + 1f16ae8: e3a0103d mov r1, #61 ; 0x3d + 1f16aec: e1a00004 mov r0, r4 + 1f16af0: eb00a467 bl 1f3fc94 + 1f16af4: e3500000 cmp r0, #0 + 1f16af8: 1affffda bne 1f16a68 + 1f16afc: e1a00004 mov r0, r4 + 1f16b00: e3a0102c mov r1, #44 ; 0x2c + 1f16b04: eb00a462 bl 1f3fc94 + 1f16b08: e3500000 cmp r0, #0 + 1f16b0c: 05cd0058 strbeq r0, [sp, #88] ; 0x58 + 1f16b10: 1affffd4 bne 1f16a68 + 1f16b14: e3a02000 mov r2, #0 + 1f16b18: e30f32e0 movw r3, #62176 ; 0xf2e0 + 1f16b1c: e34031f5 movt r3, #501 ; 0x1f5 + 1f16b20: e58d2004 str r2, [sp, #4] + 1f16b24: e30f1320 movw r1, #62240 ; 0xf320 + 1f16b28: e34011f5 movt r1, #501 ; 0x1f5 + 1f16b2c: e58d2000 str r2, [sp] + 1f16b30: e30a0320 movw r0, #41760 ; 0xa320 + 1f16b34: e340020d movt r0, #525 ; 0x20d + 1f16b38: e3a02022 mov r2, #34 ; 0x22 + 1f16b3c: eb00a3f9 bl 1f3fb28 + 1f16b40: e28ddf9f add sp, sp, #636 ; 0x27c + 1f16b44: e8bd8030 pop {r4, r5, pc} + 1f16b48: e3a02000 mov r2, #0 + 1f16b4c: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f16b50: e34031f5 movt r3, #501 ; 0x1f5 + 1f16b54: e58d2004 str r2, [sp, #4] + 1f16b58: e30f1320 movw r1, #62240 ; 0xf320 + 1f16b5c: e34011f5 movt r1, #501 ; 0x1f5 + 1f16b60: e58d2000 str r2, [sp] + 1f16b64: e30a0320 movw r0, #41760 ; 0xa320 + 1f16b68: e340020d movt r0, #525 ; 0x20d + 1f16b6c: e3a0203e mov r2, #62 ; 0x3e + 1f16b70: eb00a3ec bl 1f3fb28 + 1f16b74: e28ddf9f add sp, sp, #636 ; 0x27c + 1f16b78: e8bd8030 pop {r4, r5, pc} + +01f16b7c : + 1f16b7c: e92d4070 push {r4, r5, r6, lr} + 1f16b80: e2804a13 add r4, r0, #77824 ; 0x13000 + 1f16b84: e1a06000 mov r6, r0 + 1f16b88: e24dd008 sub sp, sp, #8 + 1f16b8c: e5d4068d ldrb r0, [r4, #1677] ; 0x68d + 1f16b90: eb00b08e bl 1f42dd0 + 1f16b94: e350004d cmp r0, #77 ; 0x4d + 1f16b98: 0a00002d beq 1f16c54 + 1f16b9c: e3500052 cmp r0, #82 ; 0x52 + 1f16ba0: 0a000027 beq 1f16c44 + 1f16ba4: e3500043 cmp r0, #67 ; 0x43 + 1f16ba8: 0a00000c beq 1f16be0 + 1f16bac: e3a02000 mov r2, #0 + 1f16bb0: e30f32e0 movw r3, #62176 ; 0xf2e0 + 1f16bb4: e34031f5 movt r3, #501 ; 0x1f5 + 1f16bb8: e58d2004 str r2, [sp, #4] + 1f16bbc: e30f1320 movw r1, #62240 ; 0xf320 + 1f16bc0: e34011f5 movt r1, #501 ; 0x1f5 + 1f16bc4: e58d2000 str r2, [sp] + 1f16bc8: e30a0320 movw r0, #41760 ; 0xa320 + 1f16bcc: e340020d movt r0, #525 ; 0x20d + 1f16bd0: e3a0201f mov r2, #31 + 1f16bd4: eb00a3d3 bl 1f3fb28 + 1f16bd8: e28dd008 add sp, sp, #8 + 1f16bdc: e8bd8070 pop {r4, r5, r6, pc} + 1f16be0: e2844d1a add r4, r4, #1664 ; 0x680 + 1f16be4: e284400d add r4, r4, #13 + 1f16be8: ea000002 b 1f16bf8 + 1f16bec: e3500000 cmp r0, #0 + 1f16bf0: ba000007 blt 1f16c14 + 1f16bf4: eb009e4d bl 1f3e530 + 1f16bf8: e1a05004 mov r5, r4 + 1f16bfc: e2844001 add r4, r4, #1 + 1f16c00: e1d500d0 ldrsb r0, [r5] + 1f16c04: eb009e49 bl 1f3e530 + 1f16c08: e3500000 cmp r0, #0 + 1f16c0c: e15400d1 ldrsb r0, [r4, #-1] + 1f16c10: 1afffff5 bne 1f16bec + 1f16c14: e2403020 sub r3, r0, #32 + 1f16c18: e31300df tst r3, #223 ; 0xdf + 1f16c1c: 0afffff4 beq 1f16bf4 + 1f16c20: e1d530d2 ldrsb r3, [r5, #2] + 1f16c24: e353003a cmp r3, #58 ; 0x3a + 1f16c28: 12852002 addne r2, r5, #2 + 1f16c2c: 0a000021 beq 1f16cb8 + 1f16c30: e1a00006 mov r0, r6 + 1f16c34: e3a01000 mov r1, #0 + 1f16c38: e28dd008 add sp, sp, #8 + 1f16c3c: e8bd4070 pop {r4, r5, r6, lr} + 1f16c40: eafffe51 b 1f1658c + 1f16c44: e1a00006 mov r0, r6 + 1f16c48: e28dd008 add sp, sp, #8 + 1f16c4c: e8bd4070 pop {r4, r5, r6, lr} + 1f16c50: eaffff77 b 1f16a34 + 1f16c54: e2844d1a add r4, r4, #1664 ; 0x680 + 1f16c58: e284400d add r4, r4, #13 + 1f16c5c: ea000002 b 1f16c6c + 1f16c60: e3500000 cmp r0, #0 + 1f16c64: ba000007 blt 1f16c88 + 1f16c68: eb009e30 bl 1f3e530 + 1f16c6c: e1a05004 mov r5, r4 + 1f16c70: e2844001 add r4, r4, #1 + 1f16c74: e1d500d0 ldrsb r0, [r5] + 1f16c78: eb009e2c bl 1f3e530 + 1f16c7c: e3500000 cmp r0, #0 + 1f16c80: e15400d1 ldrsb r0, [r4, #-1] + 1f16c84: 1afffff5 bne 1f16c60 + 1f16c88: e2403020 sub r3, r0, #32 + 1f16c8c: e31300df tst r3, #223 ; 0xdf + 1f16c90: 0afffff4 beq 1f16c68 + 1f16c94: e1d530d2 ldrsb r3, [r5, #2] + 1f16c98: e353003a cmp r3, #58 ; 0x3a + 1f16c9c: 12852002 addne r2, r5, #2 + 1f16ca0: 0a000006 beq 1f16cc0 + 1f16ca4: e1a00006 mov r0, r6 + 1f16ca8: e3a01000 mov r1, #0 + 1f16cac: e28dd008 add sp, sp, #8 + 1f16cb0: e8bd4070 pop {r4, r5, r6, lr} + 1f16cb4: eaffff29 b 1f16960 + 1f16cb8: e2852003 add r2, r5, #3 + 1f16cbc: eaffffdb b 1f16c30 + 1f16cc0: e2852003 add r2, r5, #3 + 1f16cc4: eafffff6 b 1f16ca4 + +01f16cc8 : + 1f16cc8: e92d4070 push {r4, r5, r6, lr} + 1f16ccc: e303468d movw r4, #13965 ; 0x368d + 1f16cd0: e3404001 movt r4, #1 + 1f16cd4: e24ddd2f sub sp, sp, #3008 ; 0xbc0 + 1f16cd8: e0804004 add r4, r0, r4 + 1f16cdc: e1a05000 mov r5, r0 + 1f16ce0: e3a0103a mov r1, #58 ; 0x3a + 1f16ce4: e1a00004 mov r0, r4 + 1f16ce8: e3a03000 mov r3, #0 + 1f16cec: e5cd3010 strb r3, [sp, #16] + 1f16cf0: eb00a3e7 bl 1f3fc94 + 1f16cf4: e3500000 cmp r0, #0 + 1f16cf8: 0a000029 beq 1f16da4 + 1f16cfc: e28d1010 add r1, sp, #16 + 1f16d00: e3a02000 mov r2, #0 + 1f16d04: ebfff6e6 bl 1f148a4 + 1f16d08: e1dd31d0 ldrsb r3, [sp, #16] + 1f16d0c: e1a04000 mov r4, r0 + 1f16d10: e3530000 cmp r3, #0 + 1f16d14: 0a00002d beq 1f16dd0 + 1f16d18: e28d0010 add r0, sp, #16 + 1f16d1c: e28d1e21 add r1, sp, #528 ; 0x210 + 1f16d20: ebffe533 bl 1f101f4 + 1f16d24: e3500004 cmp r0, #4 + 1f16d28: 1a000035 bne 1f16e04 + 1f16d2c: e3a06000 mov r6, #0 + 1f16d30: e3a0103a mov r1, #58 ; 0x3a + 1f16d34: e1a00004 mov r0, r4 + 1f16d38: e3a03000 mov r3, #0 + 1f16d3c: e5cd3110 strb r3, [sp, #272] ; 0x110 + 1f16d40: eb00a3d3 bl 1f3fc94 + 1f16d44: e3500000 cmp r0, #0 + 1f16d48: 0a000049 beq 1f16e74 + 1f16d4c: e28d1e11 add r1, sp, #272 ; 0x110 + 1f16d50: e3a02000 mov r2, #0 + 1f16d54: ebfff6d2 bl 1f148a4 + 1f16d58: e28d3e11 add r3, sp, #272 ; 0x110 + 1f16d5c: e1a04000 mov r4, r0 + 1f16d60: e1d330d0 ldrsb r3, [r3] + 1f16d64: e3530000 cmp r3, #0 + 1f16d68: 0a000023 beq 1f16dfc + 1f16d6c: e28d1e21 add r1, sp, #528 ; 0x210 + 1f16d70: e28d0e11 add r0, sp, #272 ; 0x110 + 1f16d74: ebffe51e bl 1f101f4 + 1f16d78: e3500000 cmp r0, #0 + 1f16d7c: 1a000030 bne 1f16e44 + 1f16d80: e5dd321c ldrb r3, [sp, #540] ; 0x21c + 1f16d84: e3130010 tst r3, #16 + 1f16d88: 0a000045 beq 1f16ea4 + 1f16d8c: e28d3e11 add r3, sp, #272 ; 0x110 + 1f16d90: e2866001 add r6, r6, #1 + 1f16d94: e1d330d0 ldrsb r3, [r3] + 1f16d98: e3530000 cmp r3, #0 + 1f16d9c: 1affffe3 bne 1f16d30 + 1f16da0: ea000015 b 1f16dfc + 1f16da4: e3a0103d mov r1, #61 ; 0x3d + 1f16da8: e1a00004 mov r0, r4 + 1f16dac: eb00a3b8 bl 1f3fc94 + 1f16db0: e3500000 cmp r0, #0 + 1f16db4: 1affffd0 bne 1f16cfc + 1f16db8: e1a00004 mov r0, r4 + 1f16dbc: e3a0102c mov r1, #44 ; 0x2c + 1f16dc0: eb00a3b3 bl 1f3fc94 + 1f16dc4: e3500000 cmp r0, #0 + 1f16dc8: 05cd0010 strbeq r0, [sp, #16] + 1f16dcc: 1affffca bne 1f16cfc + 1f16dd0: e3a02000 mov r2, #0 + 1f16dd4: e30f32e0 movw r3, #62176 ; 0xf2e0 + 1f16dd8: e34031f5 movt r3, #501 ; 0x1f5 + 1f16ddc: e58d2004 str r2, [sp, #4] + 1f16de0: e30f1320 movw r1, #62240 ; 0xf320 + 1f16de4: e34011f5 movt r1, #501 ; 0x1f5 + 1f16de8: e58d2000 str r2, [sp] + 1f16dec: e30a0320 movw r0, #41760 ; 0xa320 + 1f16df0: e340020d movt r0, #525 ; 0x20d + 1f16df4: e3a02022 mov r2, #34 ; 0x22 + 1f16df8: eb00a34a bl 1f3fb28 + 1f16dfc: e28ddd2f add sp, sp, #3008 ; 0xbc0 + 1f16e00: e8bd8070 pop {r4, r5, r6, pc} + 1f16e04: e30f035c movw r0, #62300 ; 0xf35c + 1f16e08: e34001f5 movt r0, #501 ; 0x1f5 + 1f16e0c: eb00a0ce bl 1f3f14c + 1f16e10: e3a02000 mov r2, #0 + 1f16e14: e30f3300 movw r3, #62208 ; 0xf300 + 1f16e18: e34031f5 movt r3, #501 ; 0x1f5 + 1f16e1c: e58d2004 str r2, [sp, #4] + 1f16e20: e30f1320 movw r1, #62240 ; 0xf320 + 1f16e24: e34011f5 movt r1, #501 ; 0x1f5 + 1f16e28: e58d2000 str r2, [sp] + 1f16e2c: e30a0320 movw r0, #41760 ; 0xa320 + 1f16e30: e340020d movt r0, #525 ; 0x20d + 1f16e34: e3a0203f mov r2, #63 ; 0x3f + 1f16e38: eb00a33a bl 1f3fb28 + 1f16e3c: e28ddd2f add sp, sp, #3008 ; 0xbc0 + 1f16e40: e8bd8070 pop {r4, r5, r6, pc} + 1f16e44: e3a02000 mov r2, #0 + 1f16e48: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f16e4c: e34031f5 movt r3, #501 ; 0x1f5 + 1f16e50: e58d2004 str r2, [sp, #4] + 1f16e54: e30f1320 movw r1, #62240 ; 0xf320 + 1f16e58: e34011f5 movt r1, #501 ; 0x1f5 + 1f16e5c: e58d2000 str r2, [sp] + 1f16e60: e30a0320 movw r0, #41760 ; 0xa320 + 1f16e64: e340020d movt r0, #525 ; 0x20d + 1f16e68: e3a0203e mov r2, #62 ; 0x3e + 1f16e6c: eb00a32d bl 1f3fb28 + 1f16e70: eaffffc5 b 1f16d8c + 1f16e74: e3a0103d mov r1, #61 ; 0x3d + 1f16e78: e1a00004 mov r0, r4 + 1f16e7c: eb00a384 bl 1f3fc94 + 1f16e80: e3500000 cmp r0, #0 + 1f16e84: 1affffb0 bne 1f16d4c + 1f16e88: e1a00004 mov r0, r4 + 1f16e8c: e3a0102c mov r1, #44 ; 0x2c + 1f16e90: eb00a37f bl 1f3fc94 + 1f16e94: e3500000 cmp r0, #0 + 1f16e98: 1affffab bne 1f16d4c + 1f16e9c: e28ddd2f add sp, sp, #3008 ; 0xbc0 + 1f16ea0: e8bd8070 pop {r4, r5, r6, pc} + 1f16ea4: e3a02001 mov r2, #1 + 1f16ea8: e28d0e33 add r0, sp, #816 ; 0x330 + 1f16eac: e28d1e11 add r1, sp, #272 ; 0x110 + 1f16eb0: ebffd797 bl 1f0cd14 + 1f16eb4: e3500000 cmp r0, #0 + 1f16eb8: 1a00000a bne 1f16ee8 + 1f16ebc: e3560000 cmp r6, #0 + 1f16ec0: e28d0e57 add r0, sp, #1392 ; 0x570 + 1f16ec4: 13a02032 movne r2, #50 ; 0x32 + 1f16ec8: 03a0200a moveq r2, #10 + 1f16ecc: e2800008 add r0, r0, #8 + 1f16ed0: e28d1010 add r1, sp, #16 + 1f16ed4: ebffd78e bl 1f0cd14 + 1f16ed8: e3500000 cmp r0, #0 + 1f16edc: 0a000017 beq 1f16f40 + 1f16ee0: e28d0e33 add r0, sp, #816 ; 0x330 + 1f16ee4: ebffdfaf bl 1f0eda8 + 1f16ee8: e3a02000 mov r2, #0 + 1f16eec: e30f32cc movw r3, #62156 ; 0xf2cc + 1f16ef0: e34031f5 movt r3, #501 ; 0x1f5 + 1f16ef4: e58d2004 str r2, [sp, #4] + 1f16ef8: e30f1320 movw r1, #62240 ; 0xf320 + 1f16efc: e34011f5 movt r1, #501 ; 0x1f5 + 1f16f00: e58d2000 str r2, [sp] + 1f16f04: e30a0320 movw r0, #41760 ; 0xa320 + 1f16f08: e340020d movt r0, #525 ; 0x20d + 1f16f0c: e3a02019 mov r2, #25 + 1f16f10: eb00a304 bl 1f3fb28 + 1f16f14: eaffff9c b 1f16d8c + 1f16f18: e28d0e57 add r0, sp, #1392 ; 0x570 + 1f16f1c: e28d300c add r3, sp, #12 + 1f16f20: e28d1d1f add r1, sp, #1984 ; 0x7c0 + 1f16f24: e2800008 add r0, r0, #8 + 1f16f28: ebffdc0d bl 1f0df64 + 1f16f2c: e3500000 cmp r0, #0 + 1f16f30: 1a000012 bne 1f16f80 + 1f16f34: e59d300c ldr r3, [sp, #12] + 1f16f38: e3530000 cmp r3, #0 + 1f16f3c: 0a000007 beq 1f16f60 + 1f16f40: e3a02b01 mov r2, #1024 ; 0x400 + 1f16f44: e28d300c add r3, sp, #12 + 1f16f48: e28d1d1f add r1, sp, #1984 ; 0x7c0 + 1f16f4c: e28d0e33 add r0, sp, #816 ; 0x330 + 1f16f50: ebffd98c bl 1f0d588 + 1f16f54: e59d200c ldr r2, [sp, #12] + 1f16f58: e3520000 cmp r2, #0 + 1f16f5c: 1affffed bne 1f16f18 + 1f16f60: e28d0e57 add r0, sp, #1392 ; 0x570 + 1f16f64: e2800008 add r0, r0, #8 + 1f16f68: ebffdf8e bl 1f0eda8 + 1f16f6c: e28d0e33 add r0, sp, #816 ; 0x330 + 1f16f70: ebffdf8c bl 1f0eda8 + 1f16f74: e3a03005 mov r3, #5 + 1f16f78: e5c53000 strb r3, [r5] + 1f16f7c: eaffff82 b 1f16d8c + 1f16f80: e28d0e57 add r0, sp, #1392 ; 0x570 + 1f16f84: e2800008 add r0, r0, #8 + 1f16f88: ebffdf86 bl 1f0eda8 + 1f16f8c: eaffffd3 b 1f16ee0 + +01f16f90 : + 1f16f90: e92d4030 push {r4, r5, lr} + 1f16f94: e2804a13 add r4, r0, #77824 ; 0x13000 + 1f16f98: e24dd00c sub sp, sp, #12 + 1f16f9c: e5943684 ldr r3, [r4, #1668] ; 0x684 + 1f16fa0: e3530002 cmp r3, #2 + 1f16fa4: 8a000001 bhi 1f16fb0 + 1f16fa8: e28dd00c add sp, sp, #12 + 1f16fac: e8bd8030 pop {r4, r5, pc} + 1f16fb0: e5d4068f ldrb r0, [r4, #1679] ; 0x68f + 1f16fb4: eb00af85 bl 1f42dd0 + 1f16fb8: e6af5070 sxtb r5, r0 + 1f16fbc: e3550057 cmp r5, #87 ; 0x57 + 1f16fc0: 13550052 cmpne r5, #82 ; 0x52 + 1f16fc4: 03a02001 moveq r2, #1 + 1f16fc8: 13a02000 movne r2, #0 + 1f16fcc: e3550045 cmp r5, #69 ; 0x45 + 1f16fd0: 03822001 orreq r2, r2, #1 + 1f16fd4: e3520000 cmp r2, #0 + 1f16fd8: 1a00000b bne 1f1700c + 1f16fdc: e58d2004 str r2, [sp, #4] + 1f16fe0: e30f32e0 movw r3, #62176 ; 0xf2e0 + 1f16fe4: e34031f5 movt r3, #501 ; 0x1f5 + 1f16fe8: e58d2000 str r2, [sp] + 1f16fec: e30f1320 movw r1, #62240 ; 0xf320 + 1f16ff0: e34011f5 movt r1, #501 ; 0x1f5 + 1f16ff4: e3a0201f mov r2, #31 + 1f16ff8: e30a0320 movw r0, #41760 ; 0xa320 + 1f16ffc: e340020d movt r0, #525 ; 0x20d + 1f17000: eb00a2c8 bl 1f3fb28 + 1f17004: e28dd00c add sp, sp, #12 + 1f17008: e8bd8030 pop {r4, r5, pc} + 1f1700c: e2840d1a add r0, r4, #1664 ; 0x680 + 1f17010: e3a0103a mov r1, #58 ; 0x3a + 1f17014: e280000d add r0, r0, #13 + 1f17018: eb00a31d bl 1f3fc94 + 1f1701c: e5943684 ldr r3, [r4, #1668] ; 0x684 + 1f17020: e3500000 cmp r0, #0 + 1f17024: 02840e69 addeq r0, r4, #1680 ; 0x690 + 1f17028: 12800001 addne r0, r0, #1 + 1f1702c: e2433003 sub r3, r3, #3 + 1f17030: e3530002 cmp r3, #2 + 1f17034: e1d010b0 ldrh r1, [r0] + 1f17038: d3a02001 movle r2, #1 + 1f1703c: da000002 ble 1f1704c + 1f17040: e5d02002 ldrb r2, [r0, #2] + 1f17044: e3520000 cmp r2, #0 + 1f17048: 03a02001 moveq r2, #1 + 1f1704c: e3550052 cmp r5, #82 ; 0x52 + 1f17050: 0a000008 beq 1f17078 + 1f17054: e3550057 cmp r5, #87 ; 0x57 + 1f17058: 0a00000b beq 1f1708c + 1f1705c: e3550045 cmp r5, #69 ; 0x45 + 1f17060: 1affffd0 bne 1f16fa8 + 1f17064: e30f0390 movw r0, #62352 ; 0xf390 + 1f17068: e34001f5 movt r0, #501 ; 0x1f5 + 1f1706c: e28dd00c add sp, sp, #12 + 1f17070: e8bd4030 pop {r4, r5, lr} + 1f17074: ea00a034 b 1f3f14c + 1f17078: e30f0370 movw r0, #62320 ; 0xf370 + 1f1707c: e34001f5 movt r0, #501 ; 0x1f5 + 1f17080: e28dd00c add sp, sp, #12 + 1f17084: e8bd4030 pop {r4, r5, lr} + 1f17088: ea00a02f b 1f3f14c + 1f1708c: e30f0380 movw r0, #62336 ; 0xf380 + 1f17090: e34001f5 movt r0, #501 ; 0x1f5 + 1f17094: eafffff9 b 1f17080 + +01f17098 : + 1f17098: e92d4070 push {r4, r5, r6, lr} + 1f1709c: e303568d movw r5, #13965 ; 0x368d + 1f170a0: e3405001 movt r5, #1 + 1f170a4: e24dde67 sub sp, sp, #1648 ; 0x670 + 1f170a8: e0805005 add r5, r0, r5 + 1f170ac: e24dd008 sub sp, sp, #8 + 1f170b0: e1a04000 mov r4, r0 + 1f170b4: e3a0103a mov r1, #58 ; 0x3a + 1f170b8: e1a00005 mov r0, r5 + 1f170bc: e3a03000 mov r3, #0 + 1f170c0: e5cd3010 strb r3, [sp, #16] + 1f170c4: eb00a2f2 bl 1f3fc94 + 1f170c8: e3500000 cmp r0, #0 + 1f170cc: 0a0000da beq 1f1743c + 1f170d0: e3a02000 mov r2, #0 + 1f170d4: e28d1010 add r1, sp, #16 + 1f170d8: ebfff5f1 bl 1f148a4 + 1f170dc: e2505000 subs r5, r0, #0 + 1f170e0: 0a0000e0 beq 1f17468 + 1f170e4: e3a0103a mov r1, #58 ; 0x3a + 1f170e8: e3a03000 mov r3, #0 + 1f170ec: e5cd3110 strb r3, [sp, #272] ; 0x110 + 1f170f0: eb00a2e7 bl 1f3fc94 + 1f170f4: e3500000 cmp r0, #0 + 1f170f8: 0a00001f beq 1f1717c + 1f170fc: e28d1e11 add r1, sp, #272 ; 0x110 + 1f17100: e3a02000 mov r2, #0 + 1f17104: ebfff5e6 bl 1f148a4 + 1f17108: e28d3e11 add r3, sp, #272 ; 0x110 + 1f1710c: e1d330d0 ldrsb r3, [r3] + 1f17110: e3530000 cmp r3, #0 + 1f17114: 0a000023 beq 1f171a8 + 1f17118: e30f13a4 movw r1, #62372 ; 0xf3a4 + 1f1711c: e34011f5 movt r1, #501 ; 0x1f5 + 1f17120: e28d0010 add r0, sp, #16 + 1f17124: eb00a5b0 bl 1f407ec + 1f17128: e3500000 cmp r0, #0 + 1f1712c: 0a0000db beq 1f174a0 + 1f17130: e28d0010 add r0, sp, #16 + 1f17134: e28d1e31 add r1, sp, #784 ; 0x310 + 1f17138: ebffe42d bl 1f101f4 + 1f1713c: e3500004 cmp r0, #4 + 1f17140: 0a000026 beq 1f171e0 + 1f17144: e3a02000 mov r2, #0 + 1f17148: e30f3300 movw r3, #62208 ; 0xf300 + 1f1714c: e34031f5 movt r3, #501 ; 0x1f5 + 1f17150: e58d2004 str r2, [sp, #4] + 1f17154: e30f1320 movw r1, #62240 ; 0xf320 + 1f17158: e34011f5 movt r1, #501 ; 0x1f5 + 1f1715c: e58d2000 str r2, [sp] + 1f17160: e30a0320 movw r0, #41760 ; 0xa320 + 1f17164: e340020d movt r0, #525 ; 0x20d + 1f17168: e3a0203f mov r2, #63 ; 0x3f + 1f1716c: eb00a26d bl 1f3fb28 + 1f17170: e28dde67 add sp, sp, #1648 ; 0x670 + 1f17174: e28dd008 add sp, sp, #8 + 1f17178: e8bd8070 pop {r4, r5, r6, pc} + 1f1717c: e3a0103d mov r1, #61 ; 0x3d + 1f17180: e1a00005 mov r0, r5 + 1f17184: eb00a2c2 bl 1f3fc94 + 1f17188: e3500000 cmp r0, #0 + 1f1718c: 1affffda bne 1f170fc + 1f17190: e1a00005 mov r0, r5 + 1f17194: e3a0102c mov r1, #44 ; 0x2c + 1f17198: eb00a2bd bl 1f3fc94 + 1f1719c: e3500000 cmp r0, #0 + 1f171a0: 05cd0110 strbeq r0, [sp, #272] ; 0x110 + 1f171a4: 1affffd4 bne 1f170fc + 1f171a8: e3a02000 mov r2, #0 + 1f171ac: e30f32e0 movw r3, #62176 ; 0xf2e0 + 1f171b0: e34031f5 movt r3, #501 ; 0x1f5 + 1f171b4: e58d2004 str r2, [sp, #4] + 1f171b8: e30f1320 movw r1, #62240 ; 0xf320 + 1f171bc: e34011f5 movt r1, #501 ; 0x1f5 + 1f171c0: e58d2000 str r2, [sp] + 1f171c4: e30a0320 movw r0, #41760 ; 0xa320 + 1f171c8: e340020d movt r0, #525 ; 0x20d + 1f171cc: e3a02022 mov r2, #34 ; 0x22 + 1f171d0: eb00a254 bl 1f3fb28 + 1f171d4: e28dde67 add sp, sp, #1648 ; 0x670 + 1f171d8: e28dd008 add sp, sp, #8 + 1f171dc: e8bd8070 pop {r4, r5, r6, pc} + 1f171e0: e28d1010 add r1, sp, #16 + 1f171e4: e3a0200a mov r2, #10 + 1f171e8: e28d0e43 add r0, sp, #1072 ; 0x430 + 1f171ec: ebffd6c8 bl 1f0cd14 + 1f171f0: e2501000 subs r1, r0, #0 + 1f171f4: 1affffdd bne 1f17170 + 1f171f8: e28d0e21 add r0, sp, #528 ; 0x210 + 1f171fc: e3a02c01 mov r2, #256 ; 0x100 + 1f17200: e3005165 movw r5, #357 ; 0x165 + 1f17204: eb009f84 bl 1f3f01c + 1f17208: ea000001 b 1f17214 + 1f1720c: e2555001 subs r5, r5, #1 + 1f17210: 0a000006 beq 1f17230 + 1f17214: e28d300c add r3, sp, #12 + 1f17218: e3a02c01 mov r2, #256 ; 0x100 + 1f1721c: e28d1e21 add r1, sp, #528 ; 0x210 + 1f17220: e28d0e43 add r0, sp, #1072 ; 0x430 + 1f17224: ebffdb4e bl 1f0df64 + 1f17228: e3500000 cmp r0, #0 + 1f1722c: 0afffff6 beq 1f1720c + 1f17230: e28d0010 add r0, sp, #16 + 1f17234: eb00a3b5 bl 1f40110 + 1f17238: e3500000 cmp r0, #0 + 1f1723c: da0000a7 ble 1f174e0 + 1f17240: e2405001 sub r5, r0, #1 + 1f17244: e28d3010 add r3, sp, #16 + 1f17248: e304c297 movw ip, #17047 ; 0x4297 + 1f1724c: e340c1f6 movt ip, #502 ; 0x1f6 + 1f17250: e28d100f add r1, sp, #15 + 1f17254: e0835005 add r5, r3, r5 + 1f17258: e5f13001 ldrb r3, [r1, #1]! + 1f1725c: e2432041 sub r2, r3, #65 ; 0x41 + 1f17260: e243e061 sub lr, r3, #97 ; 0x61 + 1f17264: e3520019 cmp r2, #25 + 1f17268: 9a000007 bls 1f1728c + 1f1726c: e35e0019 cmp lr, #25 + 1f17270: e283203f add r2, r3, #63 ; 0x3f + 1f17274: 92433020 subls r3, r3, #32 + 1f17278: e6ef2072 uxtb r2, r2 + 1f1727c: 96ef3073 uxtbls r3, r3 + 1f17280: 9a000002 bls 1f17290 + 1f17284: e3520019 cmp r2, #25 + 1f17288: 8a000000 bhi 1f17290 + 1f1728c: e2233080 eor r3, r3, #128 ; 0x80 + 1f17290: e1510005 cmp r1, r5 + 1f17294: e5ec3001 strb r3, [ip, #1]! + 1f17298: 1affffee bne 1f17258 + 1f1729c: e3500011 cmp r0, #17 + 1f172a0: e304c298 movw ip, #17048 ; 0x4298 + 1f172a4: e340c1f6 movt ip, #502 ; 0x1f6 + 1f172a8: e08cc000 add ip, ip, r0 + 1f172ac: ca000005 bgt 1f172c8 + 1f172b0: e3e0205f mvn r2, #95 ; 0x5f + 1f172b4: e06c0000 rsb r0, ip, r0 + 1f172b8: e4cc2001 strb r2, [ip], #1 + 1f172bc: e08c3000 add r3, ip, r0 + 1f172c0: e3530011 cmp r3, #17 + 1f172c4: dafffffb ble 1f172b8 + 1f172c8: e5dd3110 ldrb r3, [sp, #272] ; 0x110 + 1f172cc: e2432041 sub r2, r3, #65 ; 0x41 + 1f172d0: e3520019 cmp r2, #25 + 1f172d4: 9a000008 bls 1f172fc + 1f172d8: e2432061 sub r2, r3, #97 ; 0x61 + 1f172dc: e3520019 cmp r2, #25 + 1f172e0: 92433020 subls r3, r3, #32 + 1f172e4: 96ef3073 uxtbls r3, r3 + 1f172e8: 9a000004 bls 1f17300 + 1f172ec: e283203f add r2, r3, #63 ; 0x3f + 1f172f0: e6ef2072 uxtb r2, r2 + 1f172f4: e3520019 cmp r2, #25 + 1f172f8: 8a000000 bhi 1f17300 + 1f172fc: e2233080 eor r3, r3, #128 ; 0x80 + 1f17300: e5dd0111 ldrb r0, [sp, #273] ; 0x111 + 1f17304: e5cc3000 strb r3, [ip] + 1f17308: e2403041 sub r3, r0, #65 ; 0x41 + 1f1730c: e3530019 cmp r3, #25 + 1f17310: 9a000008 bls 1f17338 + 1f17314: e2403061 sub r3, r0, #97 ; 0x61 + 1f17318: e3530019 cmp r3, #25 + 1f1731c: 92400020 subls r0, r0, #32 + 1f17320: 96ef0070 uxtbls r0, r0 + 1f17324: 9a000004 bls 1f1733c + 1f17328: e280303f add r3, r0, #63 ; 0x3f + 1f1732c: e6ef3073 uxtb r3, r3 + 1f17330: e3530019 cmp r3, #25 + 1f17334: 8a000000 bhi 1f1733c + 1f17338: e2200080 eor r0, r0, #128 ; 0x80 + 1f1733c: e5cc0001 strb r0, [ip, #1] + 1f17340: e28d300c add r3, sp, #12 + 1f17344: e3a02c01 mov r2, #256 ; 0x100 + 1f17348: e3041208 movw r1, #16904 ; 0x4208 + 1f1734c: e34011f6 movt r1, #502 ; 0x1f6 + 1f17350: e28d0e43 add r0, sp, #1072 ; 0x430 + 1f17354: e3a05f51 mov r5, #324 ; 0x144 + 1f17358: ebffdb01 bl 1f0df64 + 1f1735c: e28d300c add r3, sp, #12 + 1f17360: e3a02c01 mov r2, #256 ; 0x100 + 1f17364: e28d1e21 add r1, sp, #528 ; 0x210 + 1f17368: e28d0e43 add r0, sp, #1072 ; 0x430 + 1f1736c: e3e0c000 mvn ip, #0 + 1f17370: e5cdc211 strb ip, [sp, #529] ; 0x211 + 1f17374: ebffdafa bl 1f0df64 + 1f17378: e3a03000 mov r3, #0 + 1f1737c: e5cd3211 strb r3, [sp, #529] ; 0x211 + 1f17380: ea000001 b 1f1738c + 1f17384: e2555001 subs r5, r5, #1 + 1f17388: 0a000006 beq 1f173a8 + 1f1738c: e28d300c add r3, sp, #12 + 1f17390: e3a02c01 mov r2, #256 ; 0x100 + 1f17394: e28d1e21 add r1, sp, #528 ; 0x210 + 1f17398: e28d0e43 add r0, sp, #1072 ; 0x430 + 1f1739c: ebffdaf0 bl 1f0df64 + 1f173a0: e3500000 cmp r0, #0 + 1f173a4: 0afffff6 beq 1f17384 + 1f173a8: e28d0e43 add r0, sp, #1072 ; 0x430 + 1f173ac: ebffde7d bl 1f0eda8 + 1f173b0: e28d1e31 add r1, sp, #784 ; 0x310 + 1f173b4: e28d0010 add r0, sp, #16 + 1f173b8: ebffe38d bl 1f101f4 + 1f173bc: e3500000 cmp r0, #0 + 1f173c0: 1affff6a bne 1f17170 + 1f173c4: e28d1e31 add r1, sp, #784 ; 0x310 + 1f173c8: e2840b52 add r0, r4, #83968 ; 0x14800 + 1f173cc: e281501a add r5, r1, #26 + 1f173d0: e3a02e12 mov r2, #288 ; 0x120 + 1f173d4: e2800090 add r0, r0, #144 ; 0x90 + 1f173d8: eb009e88 bl 1f3ee00 + 1f173dc: e1a00005 mov r0, r5 + 1f173e0: ebffeee1 bl 1f12f6c + 1f173e4: e2506000 subs r6, r0, #0 + 1f173e8: 1a000037 bne 1f174cc + 1f173ec: e5dd331c ldrb r3, [sp, #796] ; 0x31c + 1f173f0: e3130010 tst r3, #16 + 1f173f4: 0affff5d beq 1f17170 + 1f173f8: e1a00005 mov r0, r5 + 1f173fc: ebffdf8e bl 1f0f23c + 1f17400: e3500000 cmp r0, #0 + 1f17404: 03a03002 moveq r3, #2 + 1f17408: 05c43000 strbeq r3, [r4] + 1f1740c: 0affff57 beq 1f17170 + 1f17410: e58d6004 str r6, [sp, #4] + 1f17414: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f17418: e34031f5 movt r3, #501 ; 0x1f5 + 1f1741c: e58d6000 str r6, [sp] + 1f17420: e30f1320 movw r1, #62240 ; 0xf320 + 1f17424: e34011f5 movt r1, #501 ; 0x1f5 + 1f17428: e30a0320 movw r0, #41760 ; 0xa320 + 1f1742c: e340020d movt r0, #525 ; 0x20d + 1f17430: e3a0203e mov r2, #62 ; 0x3e + 1f17434: eb00a1bb bl 1f3fb28 + 1f17438: eaffff4c b 1f17170 + 1f1743c: e3a0103d mov r1, #61 ; 0x3d + 1f17440: e1a00005 mov r0, r5 + 1f17444: eb00a212 bl 1f3fc94 + 1f17448: e3500000 cmp r0, #0 + 1f1744c: 1affff1f bne 1f170d0 + 1f17450: e1a00005 mov r0, r5 + 1f17454: e3a0102c mov r1, #44 ; 0x2c + 1f17458: eb00a20d bl 1f3fc94 + 1f1745c: e3500000 cmp r0, #0 + 1f17460: 05cd0010 strbeq r0, [sp, #16] + 1f17464: 1affff19 bne 1f170d0 + 1f17468: e3a02000 mov r2, #0 + 1f1746c: e30f32e0 movw r3, #62176 ; 0xf2e0 + 1f17470: e34031f5 movt r3, #501 ; 0x1f5 + 1f17474: e58d2004 str r2, [sp, #4] + 1f17478: e30f1320 movw r1, #62240 ; 0xf320 + 1f1747c: e34011f5 movt r1, #501 ; 0x1f5 + 1f17480: e58d2000 str r2, [sp] + 1f17484: e30a0320 movw r0, #41760 ; 0xa320 + 1f17488: e340020d movt r0, #525 ; 0x20d + 1f1748c: e3a0201f mov r2, #31 + 1f17490: eb00a1a4 bl 1f3fb28 + 1f17494: e28dde67 add sp, sp, #1648 ; 0x670 + 1f17498: e28dd008 add sp, sp, #8 + 1f1749c: e8bd8070 pop {r4, r5, r6, pc} + 1f174a0: e30f139c movw r1, #62364 ; 0xf39c + 1f174a4: e34011f5 movt r1, #501 ; 0x1f5 + 1f174a8: e28d0010 add r0, sp, #16 + 1f174ac: eb00a4ce bl 1f407ec + 1f174b0: e3500000 cmp r0, #0 + 1f174b4: 1affff1d bne 1f17130 + 1f174b8: e30f13a4 movw r1, #62372 ; 0xf3a4 + 1f174bc: e34011f5 movt r1, #501 ; 0x1f5 + 1f174c0: e28d0010 add r0, sp, #16 + 1f174c4: eb00a1d1 bl 1f3fc10 + 1f174c8: eaffff18 b 1f17130 + 1f174cc: e2840b51 add r0, r4, #82944 ; 0x14400 + 1f174d0: e1a01005 mov r1, r5 + 1f174d4: e2800e39 add r0, r0, #912 ; 0x390 + 1f174d8: eb00a2d0 bl 1f40020 + 1f174dc: eaffff23 b 1f17170 + 1f174e0: e304c298 movw ip, #17048 ; 0x4298 + 1f174e4: e340c1f6 movt ip, #502 ; 0x1f6 + 1f174e8: e3a00000 mov r0, #0 + 1f174ec: eaffff6f b 1f172b0 + +01f174f0 : + 1f174f0: e92d4010 push {r4, lr} + 1f174f4: e303468d movw r4, #13965 ; 0x368d + 1f174f8: e3404001 movt r4, #1 + 1f174fc: e24ddfca sub sp, sp, #808 ; 0x328 + 1f17500: e0804004 add r4, r0, r4 + 1f17504: e3a0103a mov r1, #58 ; 0x3a + 1f17508: e1a00004 mov r0, r4 + 1f1750c: e3a03000 mov r3, #0 + 1f17510: e5cd3008 strb r3, [sp, #8] + 1f17514: eb00a1de bl 1f3fc94 + 1f17518: e3500000 cmp r0, #0 + 1f1751c: 0a000044 beq 1f17634 + 1f17520: e28d1008 add r1, sp, #8 + 1f17524: e3a02000 mov r2, #0 + 1f17528: ebfff4dd bl 1f148a4 + 1f1752c: e2504000 subs r4, r0, #0 + 1f17530: 0a00004a beq 1f17660 + 1f17534: e3a0103a mov r1, #58 ; 0x3a + 1f17538: e3a03000 mov r3, #0 + 1f1753c: e5cd3108 strb r3, [sp, #264] ; 0x108 + 1f17540: eb00a1d3 bl 1f3fc94 + 1f17544: e3500000 cmp r0, #0 + 1f17548: 0a000018 beq 1f175b0 + 1f1754c: e28d1f42 add r1, sp, #264 ; 0x108 + 1f17550: e3a02000 mov r2, #0 + 1f17554: ebfff4d2 bl 1f148a4 + 1f17558: e28d3f42 add r3, sp, #264 ; 0x108 + 1f1755c: e1d330d0 ldrsb r3, [r3] + 1f17560: e3530000 cmp r3, #0 + 1f17564: 0a00001c beq 1f175dc + 1f17568: e28d0008 add r0, sp, #8 + 1f1756c: e28d1f82 add r1, sp, #520 ; 0x208 + 1f17570: ebffe31f bl 1f101f4 + 1f17574: e3500004 cmp r0, #4 + 1f17578: 0a000024 beq 1f17610 + 1f1757c: e3a02000 mov r2, #0 + 1f17580: e30f3300 movw r3, #62208 ; 0xf300 + 1f17584: e34031f5 movt r3, #501 ; 0x1f5 + 1f17588: e58d2004 str r2, [sp, #4] + 1f1758c: e30f1320 movw r1, #62240 ; 0xf320 + 1f17590: e34011f5 movt r1, #501 ; 0x1f5 + 1f17594: e58d2000 str r2, [sp] + 1f17598: e30a0320 movw r0, #41760 ; 0xa320 + 1f1759c: e340020d movt r0, #525 ; 0x20d + 1f175a0: e3a0203f mov r2, #63 ; 0x3f + 1f175a4: eb00a15f bl 1f3fb28 + 1f175a8: e28ddfca add sp, sp, #808 ; 0x328 + 1f175ac: e8bd8010 pop {r4, pc} + 1f175b0: e3a0103d mov r1, #61 ; 0x3d + 1f175b4: e1a00004 mov r0, r4 + 1f175b8: eb00a1b5 bl 1f3fc94 + 1f175bc: e3500000 cmp r0, #0 + 1f175c0: 1affffe1 bne 1f1754c + 1f175c4: e1a00004 mov r0, r4 + 1f175c8: e3a0102c mov r1, #44 ; 0x2c + 1f175cc: eb00a1b0 bl 1f3fc94 + 1f175d0: e3500000 cmp r0, #0 + 1f175d4: 05cd0108 strbeq r0, [sp, #264] ; 0x108 + 1f175d8: 1affffdb bne 1f1754c + 1f175dc: e3a02000 mov r2, #0 + 1f175e0: e30f32e0 movw r3, #62176 ; 0xf2e0 + 1f175e4: e34031f5 movt r3, #501 ; 0x1f5 + 1f175e8: e58d2004 str r2, [sp, #4] + 1f175ec: e30f1320 movw r1, #62240 ; 0xf320 + 1f175f0: e34011f5 movt r1, #501 ; 0x1f5 + 1f175f4: e58d2000 str r2, [sp] + 1f175f8: e30a0320 movw r0, #41760 ; 0xa320 + 1f175fc: e340020d movt r0, #525 ; 0x20d + 1f17600: e3a02022 mov r2, #34 ; 0x22 + 1f17604: eb00a147 bl 1f3fb28 + 1f17608: e28ddfca add sp, sp, #808 ; 0x328 + 1f1760c: e8bd8010 pop {r4, pc} + 1f17610: e28d1f82 add r1, sp, #520 ; 0x208 + 1f17614: e28d0f42 add r0, sp, #264 ; 0x108 + 1f17618: ebffe2f5 bl 1f101f4 + 1f1761c: e3500000 cmp r0, #0 + 1f17620: 1a00001b bne 1f17694 + 1f17624: e28d1008 add r1, sp, #8 + 1f17628: e28d0f42 add r0, sp, #264 ; 0x108 + 1f1762c: ebffe806 bl 1f1164c + 1f17630: eaffffdc b 1f175a8 + 1f17634: e3a0103d mov r1, #61 ; 0x3d + 1f17638: e1a00004 mov r0, r4 + 1f1763c: eb00a194 bl 1f3fc94 + 1f17640: e3500000 cmp r0, #0 + 1f17644: 1affffb5 bne 1f17520 + 1f17648: e1a00004 mov r0, r4 + 1f1764c: e3a0102c mov r1, #44 ; 0x2c + 1f17650: eb00a18f bl 1f3fc94 + 1f17654: e3500000 cmp r0, #0 + 1f17658: 05cd0008 strbeq r0, [sp, #8] + 1f1765c: 1affffaf bne 1f17520 + 1f17660: e3a02000 mov r2, #0 + 1f17664: e30f32e0 movw r3, #62176 ; 0xf2e0 + 1f17668: e34031f5 movt r3, #501 ; 0x1f5 + 1f1766c: e58d2004 str r2, [sp, #4] + 1f17670: e30f1320 movw r1, #62240 ; 0xf320 + 1f17674: e34011f5 movt r1, #501 ; 0x1f5 + 1f17678: e58d2000 str r2, [sp] + 1f1767c: e30a0320 movw r0, #41760 ; 0xa320 + 1f17680: e340020d movt r0, #525 ; 0x20d + 1f17684: e3a0201f mov r2, #31 + 1f17688: eb00a126 bl 1f3fb28 + 1f1768c: e28ddfca add sp, sp, #808 ; 0x328 + 1f17690: e8bd8010 pop {r4, pc} + 1f17694: e3a02000 mov r2, #0 + 1f17698: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f1769c: e34031f5 movt r3, #501 ; 0x1f5 + 1f176a0: e58d2004 str r2, [sp, #4] + 1f176a4: e30f1320 movw r1, #62240 ; 0xf320 + 1f176a8: e34011f5 movt r1, #501 ; 0x1f5 + 1f176ac: e58d2000 str r2, [sp] + 1f176b0: e30a0320 movw r0, #41760 ; 0xa320 + 1f176b4: e340020d movt r0, #525 ; 0x20d + 1f176b8: e3a0203e mov r2, #62 ; 0x3e + 1f176bc: eb00a119 bl 1f3fb28 + 1f176c0: eaffffb8 b 1f175a8 + +01f176c4 : + 1f176c4: e92d4030 push {r4, r5, lr} + 1f176c8: e303468d movw r4, #13965 ; 0x368d + 1f176cc: e3404001 movt r4, #1 + 1f176d0: e24ddf9d sub sp, sp, #628 ; 0x274 + 1f176d4: e0804004 add r4, r0, r4 + 1f176d8: e3a0103a mov r1, #58 ; 0x3a + 1f176dc: e1a00004 mov r0, r4 + 1f176e0: e3a03000 mov r3, #0 + 1f176e4: e5cd3050 strb r3, [sp, #80] ; 0x50 + 1f176e8: eb00a169 bl 1f3fc94 + 1f176ec: e3500000 cmp r0, #0 + 1f176f0: 0a000039 beq 1f177dc + 1f176f4: e3a02000 mov r2, #0 + 1f176f8: e28d1050 add r1, sp, #80 ; 0x50 + 1f176fc: ebfff468 bl 1f148a4 + 1f17700: e28d2e15 add r2, sp, #336 ; 0x150 + 1f17704: e1dd35d0 ldrsb r3, [sp, #80] ; 0x50 + 1f17708: e1a05000 mov r5, r0 + 1f1770c: e282401a add r4, r2, #26 + 1f17710: e3530000 cmp r3, #0 + 1f17714: 0a00002e beq 1f177d4 + 1f17718: e30f234c movw r2, #62284 ; 0xf34c + 1f1771c: e34021f5 movt r2, #501 ; 0x1f5 + 1f17720: e1a0000d mov r0, sp + 1f17724: e28d3050 add r3, sp, #80 ; 0x50 + 1f17728: e28d1e15 add r1, sp, #336 ; 0x150 + 1f1772c: ebffe239 bl 1f10018 + 1f17730: e3500000 cmp r0, #0 + 1f17734: 0a00000a beq 1f17764 + 1f17738: ea00000e b 1f17778 + 1f1773c: e5dd315c ldrb r3, [sp, #348] ; 0x15c + 1f17740: e1a00004 mov r0, r4 + 1f17744: e3130010 tst r3, #16 + 1f17748: 1a000000 bne 1f17750 + 1f1774c: ebffe40c bl 1f10784 + 1f17750: e28d1e15 add r1, sp, #336 ; 0x150 + 1f17754: e1a0000d mov r0, sp + 1f17758: ebffe1cc bl 1f0fe90 + 1f1775c: e3500000 cmp r0, #0 + 1f17760: 1a000004 bne 1f17778 + 1f17764: e28d3f5a add r3, sp, #360 ; 0x168 + 1f17768: e2833002 add r3, r3, #2 + 1f1776c: e1d330d0 ldrsb r3, [r3] + 1f17770: e3530000 cmp r3, #0 + 1f17774: 1afffff0 bne 1f1773c + 1f17778: e3a0103a mov r1, #58 ; 0x3a + 1f1777c: e1a00005 mov r0, r5 + 1f17780: e3a03000 mov r3, #0 + 1f17784: e5cd3050 strb r3, [sp, #80] ; 0x50 + 1f17788: eb00a141 bl 1f3fc94 + 1f1778c: e3500000 cmp r0, #0 + 1f17790: 0a000005 beq 1f177ac + 1f17794: e3a02000 mov r2, #0 + 1f17798: e28d1050 add r1, sp, #80 ; 0x50 + 1f1779c: ebfff440 bl 1f148a4 + 1f177a0: e1dd35d0 ldrsb r3, [sp, #80] ; 0x50 + 1f177a4: e1a05000 mov r5, r0 + 1f177a8: eaffffd8 b 1f17710 + 1f177ac: e3a0103d mov r1, #61 ; 0x3d + 1f177b0: e1a00005 mov r0, r5 + 1f177b4: eb00a136 bl 1f3fc94 + 1f177b8: e3500000 cmp r0, #0 + 1f177bc: 1afffff4 bne 1f17794 + 1f177c0: e1a00005 mov r0, r5 + 1f177c4: e3a0102c mov r1, #44 ; 0x2c + 1f177c8: eb00a131 bl 1f3fc94 + 1f177cc: e3500000 cmp r0, #0 + 1f177d0: 1affffef bne 1f17794 + 1f177d4: e28ddf9d add sp, sp, #628 ; 0x274 + 1f177d8: e8bd8030 pop {r4, r5, pc} + 1f177dc: e3a0103d mov r1, #61 ; 0x3d + 1f177e0: e1a00004 mov r0, r4 + 1f177e4: eb00a12a bl 1f3fc94 + 1f177e8: e3500000 cmp r0, #0 + 1f177ec: 1affffc0 bne 1f176f4 + 1f177f0: e1a00004 mov r0, r4 + 1f177f4: e3a0102c mov r1, #44 ; 0x2c + 1f177f8: eb00a125 bl 1f3fc94 + 1f177fc: e3500000 cmp r0, #0 + 1f17800: 0afffff3 beq 1f177d4 + 1f17804: eaffffba b 1f176f4 + +01f17808 : + 1f17808: e92d4030 push {r4, r5, lr} + 1f1780c: e2804a13 add r4, r0, #77824 ; 0x13000 + 1f17810: e1a05000 mov r5, r0 + 1f17814: e24dd00c sub sp, sp, #12 + 1f17818: e5d4068e ldrb r0, [r4, #1678] ; 0x68e + 1f1781c: eb00ad6b bl 1f42dd0 + 1f17820: e350003a cmp r0, #58 ; 0x3a + 1f17824: 0a000022 beq 1f178b4 + 1f17828: ca00001a bgt 1f17898 + 1f1782c: e3500032 cmp r0, #50 ; 0x32 + 1f17830: ca00002c bgt 1f178e8 + 1f17834: e3500031 cmp r0, #49 ; 0x31 + 1f17838: aa000009 bge 1f17864 + 1f1783c: e3500030 cmp r0, #48 ; 0x30 + 1f17840: 1a000007 bne 1f17864 + 1f17844: e5d4368f ldrb r3, [r4, #1679] ; 0x68f + 1f17848: e203301f and r3, r3, #31 + 1f1784c: e353001e cmp r3, #30 + 1f17850: 1a000003 bne 1f17864 + 1f17854: e5d41690 ldrb r1, [r4, #1680] ; 0x690 + 1f17858: e2413004 sub r3, r1, #4 + 1f1785c: e353001a cmp r3, #26 + 1f17860: 9a000032 bls 1f17930 + 1f17864: e3a02000 mov r2, #0 + 1f17868: e30f32e0 movw r3, #62176 ; 0xf2e0 + 1f1786c: e34031f5 movt r3, #501 ; 0x1f5 + 1f17870: e58d2004 str r2, [sp, #4] + 1f17874: e30f1320 movw r1, #62240 ; 0xf320 + 1f17878: e34011f5 movt r1, #501 ; 0x1f5 + 1f1787c: e58d2000 str r2, [sp] + 1f17880: e30a0320 movw r0, #41760 ; 0xa320 + 1f17884: e340020d movt r0, #525 ; 0x20d + 1f17888: e3a0201f mov r2, #31 + 1f1788c: eb00a0a5 bl 1f3fb28 + 1f17890: e28dd00c add sp, sp, #12 + 1f17894: e8bd8030 pop {r4, r5, pc} + 1f17898: e3500049 cmp r0, #73 ; 0x49 + 1f1789c: 0a000013 beq 1f178f0 + 1f178a0: daffffef ble 1f17864 + 1f178a4: e350004a cmp r0, #74 ; 0x4a + 1f178a8: 0a000001 beq 1f178b4 + 1f178ac: e35000ca cmp r0, #202 ; 0xca + 1f178b0: 1affffeb bne 1f17864 + 1f178b4: e3a02000 mov r2, #0 + 1f178b8: e30f32d8 movw r3, #62168 ; 0xf2d8 + 1f178bc: e34031f5 movt r3, #501 ; 0x1f5 + 1f178c0: e58d2004 str r2, [sp, #4] + 1f178c4: e30f1320 movw r1, #62240 ; 0xf320 + 1f178c8: e34011f5 movt r1, #501 ; 0x1f5 + 1f178cc: e58d2000 str r2, [sp] + 1f178d0: e30a0320 movw r0, #41760 ; 0xa320 + 1f178d4: e340020d movt r0, #525 ; 0x20d + 1f178d8: e3a02049 mov r2, #73 ; 0x49 + 1f178dc: eb00a091 bl 1f3fb28 + 1f178e0: e28dd00c add sp, sp, #12 + 1f178e4: e8bd8030 pop {r4, r5, pc} + 1f178e8: e3500039 cmp r0, #57 ; 0x39 + 1f178ec: 1affffdc bne 1f17864 + 1f178f0: e5943684 ldr r3, [r4, #1668] ; 0x684 + 1f178f4: e3530002 cmp r3, #2 + 1f178f8: 0affffed beq 1f178b4 + 1f178fc: e5d4368f ldrb r3, [r4, #1679] ; 0x68f + 1f17900: e353002b cmp r3, #43 ; 0x2b + 1f17904: 0a000005 beq 1f17920 + 1f17908: e353002d cmp r3, #45 ; 0x2d + 1f1790c: 1affffe8 bne 1f178b4 + 1f17910: e5d53002 ldrb r3, [r5, #2] + 1f17914: e7c2311f bfc r3, #2, #1 + 1f17918: e5c53002 strb r3, [r5, #2] + 1f1791c: eaffffdb b 1f17890 + 1f17920: e5d53002 ldrb r3, [r5, #2] + 1f17924: e3833004 orr r3, r3, #4 + 1f17928: e5c53002 strb r3, [r5, #2] + 1f1792c: eaffffd7 b 1f17890 + 1f17930: e3a03006 mov r3, #6 + 1f17934: e5c51003 strb r1, [r5, #3] + 1f17938: e30f03ac movw r0, #62380 ; 0xf3ac + 1f1793c: e34001f5 movt r0, #501 ; 0x1f5 + 1f17940: e5c53000 strb r3, [r5] + 1f17944: e28dd00c add sp, sp, #12 + 1f17948: e8bd4030 pop {r4, r5, lr} + 1f1794c: ea009dfe b 1f3f14c + +01f17950 : + 1f17950: e92d4030 push {r4, r5, lr} + 1f17954: e2804a13 add r4, r0, #77824 ; 0x13000 + 1f17958: e3a02000 mov r2, #0 + 1f1795c: e24dd00c sub sp, sp, #12 + 1f17960: e1a05000 mov r5, r0 + 1f17964: e30f32c8 movw r3, #62152 ; 0xf2c8 + 1f17968: e34031f5 movt r3, #501 ; 0x1f5 + 1f1796c: e30f1320 movw r1, #62240 ; 0xf320 + 1f17970: e34011f5 movt r1, #501 ; 0x1f5 + 1f17974: e58d2004 str r2, [sp, #4] + 1f17978: e30a0320 movw r0, #41760 ; 0xa320 + 1f1797c: e340020d movt r0, #525 ; 0x20d + 1f17980: e58d2000 str r2, [sp] + 1f17984: eb00a067 bl 1f3fb28 + 1f17988: e5943684 ldr r3, [r4, #1668] ; 0x684 + 1f1798c: e3530000 cmp r3, #0 + 1f17990: 1a00000c bne 1f179c8 + 1f17994: e3a02000 mov r2, #0 + 1f17998: e30f32e0 movw r3, #62176 ; 0xf2e0 + 1f1799c: e34031f5 movt r3, #501 ; 0x1f5 + 1f179a0: e58d2004 str r2, [sp, #4] + 1f179a4: e30f1320 movw r1, #62240 ; 0xf320 + 1f179a8: e34011f5 movt r1, #501 ; 0x1f5 + 1f179ac: e58d2000 str r2, [sp] + 1f179b0: e30a0320 movw r0, #41760 ; 0xa320 + 1f179b4: e340020d movt r0, #525 ; 0x20d + 1f179b8: e3a0201e mov r2, #30 + 1f179bc: eb00a059 bl 1f3fb28 + 1f179c0: e28dd00c add sp, sp, #12 + 1f179c4: e8bd8030 pop {r4, r5, pc} + 1f179c8: e2433001 sub r3, r3, #1 + 1f179cc: e0842003 add r2, r4, r3 + 1f179d0: e5d2268d ldrb r2, [r2, #1677] ; 0x68d + 1f179d4: e352000d cmp r2, #13 + 1f179d8: 0a000035 beq 1f17ab4 + 1f179dc: e5d4068d ldrb r0, [r4, #1677] ; 0x68d + 1f179e0: eb00acfa bl 1f42dd0 + 1f179e4: e3500058 cmp r0, #88 ; 0x58 + 1f179e8: 0a000003 beq 1f179fc + 1f179ec: e5d4068e ldrb r0, [r4, #1678] ; 0x68e + 1f179f0: eb00acf6 bl 1f42dd0 + 1f179f4: e3500044 cmp r0, #68 ; 0x44 + 1f179f8: 0a000029 beq 1f17aa4 + 1f179fc: e5d4068d ldrb r0, [r4, #1677] ; 0x68d + 1f17a00: eb00acf2 bl 1f42dd0 + 1f17a04: e2400042 sub r0, r0, #66 ; 0x42 + 1f17a08: e3500016 cmp r0, #22 + 1f17a0c: 979ff100 ldrls pc, [pc, r0, lsl #2] + 1f17a10: ea000016 b 1f17a70 + 1f17a14: 01f17a70 .word 0x01f17a70 + 1f17a18: 01f17ad4 .word 0x01f17ad4 + 1f17a1c: 01f17a70 .word 0x01f17a70 + 1f17a20: 01f17a70 .word 0x01f17a70 + 1f17a24: 01f17a70 .word 0x01f17a70 + 1f17a28: 01f17a70 .word 0x01f17a70 + 1f17a2c: 01f17a70 .word 0x01f17a70 + 1f17a30: 01f179c0 .word 0x01f179c0 + 1f17a34: 01f17a70 .word 0x01f17a70 + 1f17a38: 01f17a70 .word 0x01f17a70 + 1f17a3c: 01f17a70 .word 0x01f17a70 + 1f17a40: 01f17af0 .word 0x01f17af0 + 1f17a44: 01f17b10 .word 0x01f17b10 + 1f17a48: 01f17a70 .word 0x01f17a70 + 1f17a4c: 01f17a70 .word 0x01f17a70 + 1f17a50: 01f17a70 .word 0x01f17a70 + 1f17a54: 01f17b00 .word 0x01f17b00 + 1f17a58: 01f17b30 .word 0x01f17b30 + 1f17a5c: 01f17a70 .word 0x01f17a70 + 1f17a60: 01f17b20 .word 0x01f17b20 + 1f17a64: 01f179c0 .word 0x01f179c0 + 1f17a68: 01f179c0 .word 0x01f179c0 + 1f17a6c: 01f17a70 .word 0x01f17a70 + 1f17a70: e3a02000 mov r2, #0 + 1f17a74: e30f32e0 movw r3, #62176 ; 0xf2e0 + 1f17a78: e34031f5 movt r3, #501 ; 0x1f5 + 1f17a7c: e58d2004 str r2, [sp, #4] + 1f17a80: e30f1320 movw r1, #62240 ; 0xf320 + 1f17a84: e34011f5 movt r1, #501 ; 0x1f5 + 1f17a88: e58d2000 str r2, [sp] + 1f17a8c: e30a0320 movw r0, #41760 ; 0xa320 + 1f17a90: e340020d movt r0, #525 ; 0x20d + 1f17a94: e3a0201f mov r2, #31 + 1f17a98: eb00a022 bl 1f3fb28 + 1f17a9c: e28dd00c add sp, sp, #12 + 1f17aa0: e8bd8030 pop {r4, r5, pc} + 1f17aa4: e1a00005 mov r0, r5 + 1f17aa8: e28dd00c add sp, sp, #12 + 1f17aac: e8bd4030 pop {r4, r5, lr} + 1f17ab0: eafffc31 b 1f16b7c + 1f17ab4: e3530000 cmp r3, #0 + 1f17ab8: e5843684 str r3, [r4, #1668] ; 0x684 + 1f17abc: 0affffb4 beq 1f17994 + 1f17ac0: e5d4068d ldrb r0, [r4, #1677] ; 0x68d + 1f17ac4: eb00acc1 bl 1f42dd0 + 1f17ac8: e3500058 cmp r0, #88 ; 0x58 + 1f17acc: 1affffc6 bne 1f179ec + 1f17ad0: eaffffc9 b 1f179fc + 1f17ad4: e5d4368e ldrb r3, [r4, #1678] ; 0x68e + 1f17ad8: e3530050 cmp r3, #80 ; 0x50 + 1f17adc: 0affffe3 beq 1f17a70 + 1f17ae0: e1a00005 mov r0, r5 + 1f17ae4: e28dd00c add sp, sp, #12 + 1f17ae8: e8bd4030 pop {r4, r5, lr} + 1f17aec: eafffc75 b 1f16cc8 + 1f17af0: e1a00005 mov r0, r5 + 1f17af4: e28dd00c add sp, sp, #12 + 1f17af8: e8bd4030 pop {r4, r5, lr} + 1f17afc: eafffd23 b 1f16f90 + 1f17b00: e1a00005 mov r0, r5 + 1f17b04: e28dd00c add sp, sp, #12 + 1f17b08: e8bd4030 pop {r4, r5, lr} + 1f17b0c: eafffe77 b 1f174f0 + 1f17b10: e1a00005 mov r0, r5 + 1f17b14: e28dd00c add sp, sp, #12 + 1f17b18: e8bd4030 pop {r4, r5, lr} + 1f17b1c: eafffd5d b 1f17098 + 1f17b20: e1a00005 mov r0, r5 + 1f17b24: e28dd00c add sp, sp, #12 + 1f17b28: e8bd4030 pop {r4, r5, lr} + 1f17b2c: eaffff35 b 1f17808 + 1f17b30: e5d4368e ldrb r3, [r4, #1678] ; 0x68e + 1f17b34: e353002d cmp r3, #45 ; 0x2d + 1f17b38: 0affffcc beq 1f17a70 + 1f17b3c: e1a00005 mov r0, r5 + 1f17b40: e28dd00c add sp, sp, #12 + 1f17b44: e8bd4030 pop {r4, r5, lr} + 1f17b48: eafffedd b 1f176c4 + +01f17b4c : + 1f17b4c: e92d40f0 push {r4, r5, r6, r7, lr} + 1f17b50: e1a05002 mov r5, r2 + 1f17b54: e1a07001 mov r7, r1 + 1f17b58: e24ddf41 sub sp, sp, #260 ; 0x104 + 1f17b5c: e1a01002 mov r1, r2 + 1f17b60: e1a0000d mov r0, sp + 1f17b64: e1a06003 mov r6, r3 + 1f17b68: eb00a12c bl 1f40020 + 1f17b6c: e1a00005 mov r0, r5 + 1f17b70: e3a0102e mov r1, #46 ; 0x2e + 1f17b74: eb00a1db bl 1f402e8 + 1f17b78: e2504000 subs r4, r0, #0 + 1f17b7c: 0a00001c beq 1f17bf4 + 1f17b80: e3a0102e mov r1, #46 ; 0x2e + 1f17b84: e1a0000d mov r0, sp + 1f17b88: eb00a1d6 bl 1f402e8 + 1f17b8c: e3a0202a mov r2, #42 ; 0x2a + 1f17b90: e5c02000 strb r2, [r0] + 1f17b94: e3a03000 mov r3, #0 + 1f17b98: e1d420d0 ldrsb r2, [r4] + 1f17b9c: e5c02001 strb r2, [r0, #1] + 1f17ba0: e1d420d1 ldrsb r2, [r4, #1] + 1f17ba4: e5c02002 strb r2, [r0, #2] + 1f17ba8: e1d420d2 ldrsb r2, [r4, #2] + 1f17bac: e5c02003 strb r2, [r0, #3] + 1f17bb0: e1d420d3 ldrsb r2, [r4, #3] + 1f17bb4: e5c02004 strb r2, [r0, #4] + 1f17bb8: e5c03005 strb r3, [r0, #5] + 1f17bbc: e1a0300d mov r3, sp + 1f17bc0: e1a00007 mov r0, r7 + 1f17bc4: e30f234c movw r2, #62284 ; 0xf34c + 1f17bc8: e34021f5 movt r2, #501 ; 0x1f5 + 1f17bcc: e1a01006 mov r1, r6 + 1f17bd0: ebffe110 bl 1f10018 + 1f17bd4: e3500000 cmp r0, #0 + 1f17bd8: 13a00000 movne r0, #0 + 1f17bdc: 1a000002 bne 1f17bec + 1f17be0: e1d601da ldrsb r0, [r6, #26] + 1f17be4: e2900000 adds r0, r0, #0 + 1f17be8: 13a00001 movne r0, #1 + 1f17bec: e28ddf41 add sp, sp, #260 ; 0x104 + 1f17bf0: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f17bf4: e1a00005 mov r0, r5 + 1f17bf8: eb00a144 bl 1f40110 + 1f17bfc: e350000f cmp r0, #15 + 1f17c00: c3a0302a movgt r3, #42 ; 0x2a + 1f17c04: c5cd300f strbgt r3, [sp, #15] + 1f17c08: eaffffeb b 1f17bbc + +01f17c0c : + 1f17c0c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f17c10: e591336c ldr r3, [r1, #876] ; 0x36c + 1f17c14: e1a07001 mov r7, r1 + 1f17c18: e24dd014 sub sp, sp, #20 + 1f17c1c: e3530000 cmp r3, #0 + 1f17c20: e58d2008 str r2, [sp, #8] + 1f17c24: 0a000044 beq 1f17d3c + 1f17c28: e30a92be movw r9, #41662 ; 0xa2be + 1f17c2c: e340920d movt r9, #525 ; 0x20d + 1f17c30: e30a52d7 movw r5, #41687 ; 0xa2d7 + 1f17c34: e340520d movt r5, #525 ; 0x20d + 1f17c38: e3a08a03 mov r8, #12288 ; 0x3000 + 1f17c3c: e3438f00 movt r8, #16128 ; 0x3f00 + 1f17c40: e30aa2f8 movw sl, #41720 ; 0xa2f8 + 1f17c44: e340a20d movt sl, #525 ; 0x20d + 1f17c48: e30a6305 movw r6, #41733 ; 0xa305 + 1f17c4c: e340620d movt r6, #525 ; 0x20d + 1f17c50: e2813fdd add r3, r1, #884 ; 0x374 + 1f17c54: e1a04000 mov r4, r0 + 1f17c58: e58d3004 str r3, [sp, #4] + 1f17c5c: e3a0b000 mov fp, #0 + 1f17c60: e59d3008 ldr r3, [sp, #8] + 1f17c64: e3530000 cmp r3, #0 + 1f17c68: 058d3000 streq r3, [sp] + 1f17c6c: 0a000009 beq 1f17c98 + 1f17c70: e1c700d0 ldrd r0, [r7] + 1f17c74: e3a03000 mov r3, #0 + 1f17c78: e5972370 ldr r2, [r7, #880] ; 0x370 + 1f17c7c: e2500001 subs r0, r0, #1 + 1f17c80: e2c11000 sbc r1, r1, #0 + 1f17c84: e1510003 cmp r1, r3 + 1f17c88: 01500002 cmpeq r0, r2 + 1f17c8c: 03a03001 moveq r3, #1 + 1f17c90: 13a03000 movne r3, #0 + 1f17c94: e58d3000 str r3, [sp] + 1f17c98: e59d3004 ldr r3, [sp, #4] + 1f17c9c: e3a01032 mov r1, #50 ; 0x32 + 1f17ca0: e5f32001 ldrb r2, [r3, #1]! + 1f17ca4: e58d200c str r2, [sp, #12] + 1f17ca8: e58d3004 str r3, [sp, #4] + 1f17cac: e5982004 ldr r2, [r8, #4] + 1f17cb0: e5983004 ldr r3, [r8, #4] + 1f17cb4: e1520003 cmp r2, r3 + 1f17cb8: 0afffffc beq 1f17cb0 + 1f17cbc: e2511001 subs r1, r1, #1 + 1f17cc0: 1afffff9 bne 1f17cac + 1f17cc4: e5d93000 ldrb r3, [r9] + 1f17cc8: e3530000 cmp r3, #0 + 1f17ccc: 1a000025 bne 1f17d68 + 1f17cd0: ebfff159 bl 1f1423c + 1f17cd4: e5d43005 ldrb r3, [r4, #5] + 1f17cd8: e5d50000 ldrb r0, [r5] + 1f17cdc: e3530002 cmp r3, #2 + 1f17ce0: 0a000019 beq 1f17d4c + 1f17ce4: e3500000 cmp r0, #0 + 1f17ce8: 0a000003 beq 1f17cfc + 1f17cec: e3a03001 mov r3, #1 + 1f17cf0: e5c43005 strb r3, [r4, #5] + 1f17cf4: e28dd014 add sp, sp, #20 + 1f17cf8: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f17cfc: e5d63000 ldrb r3, [r6] + 1f17d00: e3530000 cmp r3, #0 + 1f17d04: 1afffff1 bne 1f17cd0 + 1f17d08: e59d2000 ldr r2, [sp] + 1f17d0c: e1a00004 mov r0, r4 + 1f17d10: e59d100c ldr r1, [sp, #12] + 1f17d14: ebfff345 bl 1f14a30 + 1f17d18: e3500000 cmp r0, #0 + 1f17d1c: 1afffff4 bne 1f17cf4 + 1f17d20: e597236c ldr r2, [r7, #876] ; 0x36c + 1f17d24: e28bb001 add fp, fp, #1 + 1f17d28: e5973370 ldr r3, [r7, #880] ; 0x370 + 1f17d2c: e152000b cmp r2, fp + 1f17d30: e2833001 add r3, r3, #1 + 1f17d34: e5873370 str r3, [r7, #880] ; 0x370 + 1f17d38: 8affffc8 bhi 1f17c60 + 1f17d3c: e3a00000 mov r0, #0 + 1f17d40: e587036c str r0, [r7, #876] ; 0x36c + 1f17d44: e28dd014 add sp, sp, #20 + 1f17d48: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f17d4c: e3500000 cmp r0, #0 + 1f17d50: 1affffe9 bne 1f17cfc + 1f17d54: e3a03003 mov r3, #3 + 1f17d58: e3a00001 mov r0, #1 + 1f17d5c: e5c43005 strb r3, [r4, #5] + 1f17d60: e28dd014 add sp, sp, #20 + 1f17d64: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f17d68: e5da3000 ldrb r3, [sl] + 1f17d6c: e30a22be movw r2, #41662 ; 0xa2be + 1f17d70: e340220d movt r2, #525 ; 0x20d + 1f17d74: e3530000 cmp r3, #0 + 1f17d78: e30a3307 movw r3, #41735 ; 0xa307 + 1f17d7c: e340320d movt r3, #525 ; 0x20d + 1f17d80: e5c21000 strb r1, [r2] + 1f17d84: e5d33000 ldrb r3, [r3] + 1f17d88: 1a000023 bne 1f17e1c + 1f17d8c: e3530000 cmp r3, #0 + 1f17d90: 13a02401 movne r2, #16777216 ; 0x1000000 + 1f17d94: 1a000005 bne 1f17db0 + 1f17d98: e30a3298 movw r3, #41624 ; 0xa298 + 1f17d9c: e340320d movt r3, #525 ; 0x20d + 1f17da0: e5d33000 ldrb r3, [r3] + 1f17da4: e3530000 cmp r3, #0 + 1f17da8: 13a02401 movne r2, #16777216 ; 0x1000000 + 1f17dac: 03a02000 moveq r2, #0 + 1f17db0: e30a32f4 movw r3, #41716 ; 0xa2f4 + 1f17db4: e340320d movt r3, #525 ; 0x20d + 1f17db8: e3a00000 mov r0, #0 + 1f17dbc: e3430f20 movt r0, #16160 ; 0x3f20 + 1f17dc0: e5931000 ldr r1, [r3] + 1f17dc4: e3a03000 mov r3, #0 + 1f17dc8: e3c11612 bic r1, r1, #18874368 ; 0x1200000 + 1f17dcc: e1812002 orr r2, r1, r2 + 1f17dd0: e5802004 str r2, [r0, #4] + 1f17dd4: e1a02003 mov r2, r3 + 1f17dd8: e30a131d movw r1, #41757 ; 0xa31d + 1f17ddc: e340120d movt r1, #525 ; 0x20d + 1f17de0: e5d11000 ldrb r1, [r1] + 1f17de4: e3510000 cmp r1, #0 + 1f17de8: e30a1306 movw r1, #41734 ; 0xa306 + 1f17dec: e340120d movt r1, #525 ; 0x20d + 1f17df0: 13822801 orrne r2, r2, #65536 ; 0x10000 + 1f17df4: 03833801 orreq r3, r3, #65536 ; 0x10000 + 1f17df8: e5d11000 ldrb r1, [r1] + 1f17dfc: e3510000 cmp r1, #0 + 1f17e00: e3a01000 mov r1, #0 + 1f17e04: e3431f20 movt r1, #16160 ; 0x3f20 + 1f17e08: 13822a02 orrne r2, r2, #8192 ; 0x2000 + 1f17e0c: 03833a02 orreq r3, r3, #8192 ; 0x2000 + 1f17e10: e581201c str r2, [r1, #28] + 1f17e14: e5813028 str r3, [r1, #40] ; 0x28 + 1f17e18: eaffffac b 1f17cd0 + 1f17e1c: e3530000 cmp r3, #0 + 1f17e20: 13a03802 movne r3, #131072 ; 0x20000 + 1f17e24: 13a02701 movne r2, #262144 ; 0x40000 + 1f17e28: 1affffea bne 1f17dd8 + 1f17e2c: e30a3298 movw r3, #41624 ; 0xa298 + 1f17e30: e340320d movt r3, #525 ; 0x20d + 1f17e34: e5d33000 ldrb r3, [r3] + 1f17e38: e3530000 cmp r3, #0 + 1f17e3c: 03a03806 moveq r3, #393216 ; 0x60000 + 1f17e40: 13a03802 movne r3, #131072 ; 0x20000 + 1f17e44: 03a02000 moveq r2, #0 + 1f17e48: 13a02701 movne r2, #262144 ; 0x40000 + 1f17e4c: eaffffe1 b 1f17dd8 + +01f17e50 : + 1f17e50: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f17e54: e3013478 movw r3, #5240 ; 0x1478 + 1f17e58: e5d02004 ldrb r2, [r0, #4] + 1f17e5c: e24dd034 sub sp, sp, #52 ; 0x34 + 1f17e60: e0030293 mul r3, r3, r2 + 1f17e64: e0801003 add r1, r0, r3 + 1f17e68: e1d122da ldrsb r2, [r1, #42] ; 0x2a + 1f17e6c: e3520000 cmp r2, #0 + 1f17e70: 0a000098 beq 1f180d8 + 1f17e74: e1a0b000 mov fp, r0 + 1f17e78: e2832e13 add r2, r3, #304 ; 0x130 + 1f17e7c: e281afe1 add sl, r1, #900 ; 0x384 + 1f17e80: e2833fe1 add r3, r3, #900 ; 0x384 + 1f17e84: e28aa001 add sl, sl, #1 + 1f17e88: e08b2002 add r2, fp, r2 + 1f17e8c: e08b3003 add r3, fp, r3 + 1f17e90: e3a04a03 mov r4, #12288 ; 0x3000 + 1f17e94: e3434f00 movt r4, #16128 ; 0x3f00 + 1f17e98: e58d201c str r2, [sp, #28] + 1f17e9c: e1a09001 mov r9, r1 + 1f17ea0: e58d3020 str r3, [sp, #32] + 1f17ea4: e58da024 str sl, [sp, #36] ; 0x24 + 1f17ea8: e28d302c add r3, sp, #44 ; 0x2c + 1f17eac: e3a02a01 mov r2, #4096 ; 0x1000 + 1f17eb0: e59d1024 ldr r1, [sp, #36] ; 0x24 + 1f17eb4: e59d001c ldr r0, [sp, #28] + 1f17eb8: ebffd5b2 bl 1f0d588 + 1f17ebc: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f17ec0: e3530000 cmp r3, #0 + 1f17ec4: 1a000001 bne 1f17ed0 + 1f17ec8: e28dd034 add sp, sp, #52 ; 0x34 + 1f17ecc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f17ed0: e589337c str r3, [r9, #892] ; 0x37c + 1f17ed4: e30a62be movw r6, #41662 ; 0xa2be + 1f17ed8: e340620d movt r6, #525 ; 0x20d + 1f17edc: e59d3020 ldr r3, [sp, #32] + 1f17ee0: e30a52d7 movw r5, #41687 ; 0xa2d7 + 1f17ee4: e340520d movt r5, #525 ; 0x20d + 1f17ee8: e5997380 ldr r7, [r9, #896] ; 0x380 + 1f17eec: e30a8305 movw r8, #41733 ; 0xa305 + 1f17ef0: e340820d movt r8, #525 ; 0x20d + 1f17ef4: e58d300c str r3, [sp, #12] + 1f17ef8: e3a0a000 mov sl, #0 + 1f17efc: e1c921d0 ldrd r2, [r9, #16] + 1f17f00: e1cd21f0 strd r2, [sp, #16] + 1f17f04: e59d300c ldr r3, [sp, #12] + 1f17f08: e3a01032 mov r1, #50 ; 0x32 + 1f17f0c: e5f32001 ldrb r2, [r3, #1]! + 1f17f10: e58d2018 str r2, [sp, #24] + 1f17f14: e58d300c str r3, [sp, #12] + 1f17f18: e5942004 ldr r2, [r4, #4] + 1f17f1c: e5943004 ldr r3, [r4, #4] + 1f17f20: e1520003 cmp r2, r3 + 1f17f24: 0afffffc beq 1f17f1c + 1f17f28: e2511001 subs r1, r1, #1 + 1f17f2c: 1afffff9 bne 1f17f18 + 1f17f30: e5d63000 ldrb r3, [r6] + 1f17f34: e3530000 cmp r3, #0 + 1f17f38: 1a00002a bne 1f17fe8 + 1f17f3c: ebfff0be bl 1f1423c + 1f17f40: e5db3005 ldrb r3, [fp, #5] + 1f17f44: e5d52000 ldrb r2, [r5] + 1f17f48: e3530002 cmp r3, #2 + 1f17f4c: 0a000020 beq 1f17fd4 + 1f17f50: e3520000 cmp r2, #0 + 1f17f54: 13a03001 movne r3, #1 + 1f17f58: 15cb3005 strbne r3, [fp, #5] + 1f17f5c: 1affffd9 bne 1f17ec8 + 1f17f60: e5d83000 ldrb r3, [r8] + 1f17f64: e3530000 cmp r3, #0 + 1f17f68: 1afffff3 bne 1f17f3c + 1f17f6c: e1cd01d0 ldrd r0, [sp, #16] + 1f17f70: e3a03000 mov r3, #0 + 1f17f74: e1a02007 mov r2, r7 + 1f17f78: e2500001 subs r0, r0, #1 + 1f17f7c: e2c11000 sbc r1, r1, #0 + 1f17f80: e1510003 cmp r1, r3 + 1f17f84: e59d1018 ldr r1, [sp, #24] + 1f17f88: 01500007 cmpeq r0, r7 + 1f17f8c: e1a0000b mov r0, fp + 1f17f90: 03a02001 moveq r2, #1 + 1f17f94: 13a02000 movne r2, #0 + 1f17f98: ebfff2a4 bl 1f14a30 + 1f17f9c: e3500000 cmp r0, #0 + 1f17fa0: 1affffc8 bne 1f17ec8 + 1f17fa4: e599337c ldr r3, [r9, #892] ; 0x37c + 1f17fa8: e28aa001 add sl, sl, #1 + 1f17fac: e5997380 ldr r7, [r9, #896] ; 0x380 + 1f17fb0: e153000a cmp r3, sl + 1f17fb4: e2877001 add r7, r7, #1 + 1f17fb8: e5897380 str r7, [r9, #896] ; 0x380 + 1f17fbc: 8affffce bhi 1f17efc + 1f17fc0: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f17fc4: e589037c str r0, [r9, #892] ; 0x37c + 1f17fc8: e3530000 cmp r3, #0 + 1f17fcc: 1affffb5 bne 1f17ea8 + 1f17fd0: eaffffbc b 1f17ec8 + 1f17fd4: e3520000 cmp r2, #0 + 1f17fd8: 1affffe0 bne 1f17f60 + 1f17fdc: e3a03003 mov r3, #3 + 1f17fe0: e5cb3005 strb r3, [fp, #5] + 1f17fe4: eaffffb7 b 1f17ec8 + 1f17fe8: e30a32f8 movw r3, #41720 ; 0xa2f8 + 1f17fec: e340320d movt r3, #525 ; 0x20d + 1f17ff0: e30a22be movw r2, #41662 ; 0xa2be + 1f17ff4: e340220d movt r2, #525 ; 0x20d + 1f17ff8: e5d33000 ldrb r3, [r3] + 1f17ffc: e5c21000 strb r1, [r2] + 1f18000: e3530000 cmp r3, #0 + 1f18004: e30a3307 movw r3, #41735 ; 0xa307 + 1f18008: e340320d movt r3, #525 ; 0x20d + 1f1800c: e5d33000 ldrb r3, [r3] + 1f18010: 1a000023 bne 1f180a4 + 1f18014: e3530000 cmp r3, #0 + 1f18018: 13a02401 movne r2, #16777216 ; 0x1000000 + 1f1801c: 1a000005 bne 1f18038 + 1f18020: e30a3298 movw r3, #41624 ; 0xa298 + 1f18024: e340320d movt r3, #525 ; 0x20d + 1f18028: e5d33000 ldrb r3, [r3] + 1f1802c: e3530000 cmp r3, #0 + 1f18030: 13a02401 movne r2, #16777216 ; 0x1000000 + 1f18034: 03a02000 moveq r2, #0 + 1f18038: e30a32f4 movw r3, #41716 ; 0xa2f4 + 1f1803c: e340320d movt r3, #525 ; 0x20d + 1f18040: e3a00000 mov r0, #0 + 1f18044: e3430f20 movt r0, #16160 ; 0x3f20 + 1f18048: e5931000 ldr r1, [r3] + 1f1804c: e3a03000 mov r3, #0 + 1f18050: e3c11612 bic r1, r1, #18874368 ; 0x1200000 + 1f18054: e1812002 orr r2, r1, r2 + 1f18058: e5802004 str r2, [r0, #4] + 1f1805c: e1a02003 mov r2, r3 + 1f18060: e30a131d movw r1, #41757 ; 0xa31d + 1f18064: e340120d movt r1, #525 ; 0x20d + 1f18068: e5d11000 ldrb r1, [r1] + 1f1806c: e3510000 cmp r1, #0 + 1f18070: e30a1306 movw r1, #41734 ; 0xa306 + 1f18074: e340120d movt r1, #525 ; 0x20d + 1f18078: 13822801 orrne r2, r2, #65536 ; 0x10000 + 1f1807c: 03833801 orreq r3, r3, #65536 ; 0x10000 + 1f18080: e5d11000 ldrb r1, [r1] + 1f18084: e3510000 cmp r1, #0 + 1f18088: e3a01000 mov r1, #0 + 1f1808c: e3431f20 movt r1, #16160 ; 0x3f20 + 1f18090: 13822a02 orrne r2, r2, #8192 ; 0x2000 + 1f18094: 03833a02 orreq r3, r3, #8192 ; 0x2000 + 1f18098: e581201c str r2, [r1, #28] + 1f1809c: e5813028 str r3, [r1, #40] ; 0x28 + 1f180a0: eaffffa5 b 1f17f3c + 1f180a4: e3530000 cmp r3, #0 + 1f180a8: 13a03802 movne r3, #131072 ; 0x20000 + 1f180ac: 13a02701 movne r2, #262144 ; 0x40000 + 1f180b0: 1affffea bne 1f18060 + 1f180b4: e30a3298 movw r3, #41624 ; 0xa298 + 1f180b8: e340320d movt r3, #525 ; 0x20d + 1f180bc: e5d33000 ldrb r3, [r3] + 1f180c0: e3530000 cmp r3, #0 + 1f180c4: 03a03806 moveq r3, #393216 ; 0x60000 + 1f180c8: 13a03802 movne r3, #131072 ; 0x20000 + 1f180cc: 03a02000 moveq r2, #0 + 1f180d0: 13a02701 movne r2, #262144 ; 0x40000 + 1f180d4: eaffffe1 b 1f18060 + 1f180d8: e58d2004 str r2, [sp, #4] + 1f180dc: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f180e0: e34031f5 movt r3, #501 ; 0x1f5 + 1f180e4: e58d2000 str r2, [sp] + 1f180e8: e30f1320 movw r1, #62240 ; 0xf320 + 1f180ec: e34011f5 movt r1, #501 ; 0x1f5 + 1f180f0: e30a0320 movw r0, #41760 ; 0xa320 + 1f180f4: e340020d movt r0, #525 ; 0x20d + 1f180f8: e3a0203e mov r2, #62 ; 0x3e + 1f180fc: eb009e89 bl 1f3fb28 + 1f18100: eaffff70 b 1f17ec8 + +01f18104 : + 1f18104: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f18108: e3013478 movw r3, #5240 ; 0x1478 + 1f1810c: e5d08004 ldrb r8, [r0, #4] + 1f18110: e24dd00c sub sp, sp, #12 + 1f18114: e0080893 mul r8, r3, r8 + 1f18118: e0807008 add r7, r0, r8 + 1f1811c: e5d73384 ldrb r3, [r7, #900] ; 0x384 + 1f18120: e3530000 cmp r3, #0 + 1f18124: 0a000012 beq 1f18174 + 1f18128: e5d73378 ldrb r3, [r7, #888] ; 0x378 + 1f1812c: e3530000 cmp r3, #0 + 1f18130: 0a00000f beq 1f18174 + 1f18134: e30a52d7 movw r5, #41687 ; 0xa2d7 + 1f18138: e340520d movt r5, #525 ; 0x20d + 1f1813c: e30a62d6 movw r6, #41686 ; 0xa2d6 + 1f18140: e340620d movt r6, #525 ; 0x20d + 1f18144: e1a04000 mov r4, r0 + 1f18148: e3a09000 mov r9, #0 + 1f1814c: e5cd9003 strb r9, [sp, #3] + 1f18150: ebfff039 bl 1f1423c + 1f18154: e5d42005 ldrb r2, [r4, #5] + 1f18158: e5d53000 ldrb r3, [r5] + 1f1815c: e3520002 cmp r2, #2 + 1f18160: 0a000020 beq 1f181e8 + 1f18164: e3530000 cmp r3, #0 + 1f18168: 0a000003 beq 1f1817c + 1f1816c: e3a03001 mov r3, #1 + 1f18170: e5c43005 strb r3, [r4, #5] + 1f18174: e28dd00c add sp, sp, #12 + 1f18178: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f1817c: e5d63000 ldrb r3, [r6] + 1f18180: e3530000 cmp r3, #0 + 1f18184: 1afffff1 bne 1f18150 + 1f18188: e28d1003 add r1, sp, #3 + 1f1818c: e1a00004 mov r0, r4 + 1f18190: ebfff4d7 bl 1f154f4 + 1f18194: e250b000 subs fp, r0, #0 + 1f18198: 1afffff5 bne 1f18174 + 1f1819c: e597337c ldr r3, [r7, #892] ; 0x37c + 1f181a0: e0842008 add r2, r4, r8 + 1f181a4: e5dd0003 ldrb r0, [sp, #3] + 1f181a8: e0871003 add r1, r7, r3 + 1f181ac: e2833001 add r3, r3, #1 + 1f181b0: e587337c str r3, [r7, #892] ; 0x37c + 1f181b4: e5c10385 strb r0, [r1, #901] ; 0x385 + 1f181b8: e592337c ldr r3, [r2, #892] ; 0x37c + 1f181bc: e3530a01 cmp r3, #4096 ; 0x1000 + 1f181c0: 3affffe1 bcc 1f1814c + 1f181c4: e2821fe1 add r1, r2, #900 ; 0x384 + 1f181c8: e2880e13 add r0, r8, #304 ; 0x130 + 1f181cc: e0840000 add r0, r4, r0 + 1f181d0: e2811001 add r1, r1, #1 + 1f181d4: e28d3004 add r3, sp, #4 + 1f181d8: e3a02a01 mov r2, #4096 ; 0x1000 + 1f181dc: ebffd760 bl 1f0df64 + 1f181e0: e587b37c str fp, [r7, #892] ; 0x37c + 1f181e4: eaffffd7 b 1f18148 + 1f181e8: e3530000 cmp r3, #0 + 1f181ec: 1affffe2 bne 1f1817c + 1f181f0: e3a03003 mov r3, #3 + 1f181f4: e5c43005 strb r3, [r4, #5] + 1f181f8: e28dd00c add sp, sp, #12 + 1f181fc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + +01f18200 : + 1f18200: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f18204: e1a04000 mov r4, r0 + 1f18208: e30a0320 movw r0, #41760 ; 0xa320 + 1f1820c: e340020d movt r0, #525 ; 0x20d + 1f18210: e24dd00c sub sp, sp, #12 + 1f18214: e30a72be movw r7, #41662 ; 0xa2be + 1f18218: e340720d movt r7, #525 ; 0x20d + 1f1821c: e2409001 sub r9, r0, #1 + 1f18220: e30a52d7 movw r5, #41687 ; 0xa2d7 + 1f18224: e340520d movt r5, #525 ; 0x20d + 1f18228: eb009fb8 bl 1f40110 + 1f1822c: e3a0aa03 mov sl, #12288 ; 0x3000 + 1f18230: e343af00 movt sl, #16128 ; 0x3f00 + 1f18234: e30a82f8 movw r8, #41720 ; 0xa2f8 + 1f18238: e340820d movt r8, #525 ; 0x20d + 1f1823c: e30a6305 movw r6, #41733 ; 0xa305 + 1f18240: e340620d movt r6, #525 ; 0x20d + 1f18244: e58d0004 str r0, [sp, #4] + 1f18248: e1f9b0d1 ldrsb fp, [r9, #1]! + 1f1824c: e3a01032 mov r1, #50 ; 0x32 + 1f18250: e59a2004 ldr r2, [sl, #4] + 1f18254: e59a3004 ldr r3, [sl, #4] + 1f18258: e1520003 cmp r2, r3 + 1f1825c: 0afffffc beq 1f18254 + 1f18260: e2511001 subs r1, r1, #1 + 1f18264: 1afffff9 bne 1f18250 + 1f18268: e5d73000 ldrb r3, [r7] + 1f1826c: e3530000 cmp r3, #0 + 1f18270: 1a000023 bne 1f18304 + 1f18274: ebffeff0 bl 1f1423c + 1f18278: e5d43005 ldrb r3, [r4, #5] + 1f1827c: e5d52000 ldrb r2, [r5] + 1f18280: e3530002 cmp r3, #2 + 1f18284: 0a000018 beq 1f182ec + 1f18288: e3520000 cmp r2, #0 + 1f1828c: 0a000003 beq 1f182a0 + 1f18290: e3a03001 mov r3, #1 + 1f18294: e5c43005 strb r3, [r4, #5] + 1f18298: e28dd00c add sp, sp, #12 + 1f1829c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f182a0: e5d63000 ldrb r3, [r6] + 1f182a4: e3530000 cmp r3, #0 + 1f182a8: 1afffff1 bne 1f18274 + 1f182ac: e59d2004 ldr r2, [sp, #4] + 1f182b0: e30a3320 movw r3, #41760 ; 0xa320 + 1f182b4: e340320d movt r3, #525 ; 0x20d + 1f182b8: e0633009 rsb r3, r3, r9 + 1f182bc: e6ef107b uxtb r1, fp + 1f182c0: e062b003 rsb fp, r2, r3 + 1f182c4: e1a00004 mov r0, r4 + 1f182c8: e16fbf1b clz fp, fp + 1f182cc: e1a0b2ab lsr fp, fp, #5 + 1f182d0: e1a0200b mov r2, fp + 1f182d4: ebfff1d5 bl 1f14a30 + 1f182d8: e18b0000 orr r0, fp, r0 + 1f182dc: e31000ff tst r0, #255 ; 0xff + 1f182e0: 0affffd8 beq 1f18248 + 1f182e4: e28dd00c add sp, sp, #12 + 1f182e8: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f182ec: e3520000 cmp r2, #0 + 1f182f0: 1affffea bne 1f182a0 + 1f182f4: e3a03003 mov r3, #3 + 1f182f8: e5c43005 strb r3, [r4, #5] + 1f182fc: e28dd00c add sp, sp, #12 + 1f18300: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f18304: e5d83000 ldrb r3, [r8] + 1f18308: e30a22be movw r2, #41662 ; 0xa2be + 1f1830c: e340220d movt r2, #525 ; 0x20d + 1f18310: e3530000 cmp r3, #0 + 1f18314: e30a3307 movw r3, #41735 ; 0xa307 + 1f18318: e340320d movt r3, #525 ; 0x20d + 1f1831c: e5c21000 strb r1, [r2] + 1f18320: e5d33000 ldrb r3, [r3] + 1f18324: 1a000023 bne 1f183b8 + 1f18328: e3530000 cmp r3, #0 + 1f1832c: 13a02401 movne r2, #16777216 ; 0x1000000 + 1f18330: 1a000005 bne 1f1834c + 1f18334: e30a3298 movw r3, #41624 ; 0xa298 + 1f18338: e340320d movt r3, #525 ; 0x20d + 1f1833c: e5d33000 ldrb r3, [r3] + 1f18340: e3530000 cmp r3, #0 + 1f18344: 13a02401 movne r2, #16777216 ; 0x1000000 + 1f18348: 03a02000 moveq r2, #0 + 1f1834c: e30a32f4 movw r3, #41716 ; 0xa2f4 + 1f18350: e340320d movt r3, #525 ; 0x20d + 1f18354: e3a00000 mov r0, #0 + 1f18358: e3430f20 movt r0, #16160 ; 0x3f20 + 1f1835c: e5931000 ldr r1, [r3] + 1f18360: e3a03000 mov r3, #0 + 1f18364: e3c11612 bic r1, r1, #18874368 ; 0x1200000 + 1f18368: e1812002 orr r2, r1, r2 + 1f1836c: e5802004 str r2, [r0, #4] + 1f18370: e1a02003 mov r2, r3 + 1f18374: e30a131d movw r1, #41757 ; 0xa31d + 1f18378: e340120d movt r1, #525 ; 0x20d + 1f1837c: e5d11000 ldrb r1, [r1] + 1f18380: e3510000 cmp r1, #0 + 1f18384: e30a1306 movw r1, #41734 ; 0xa306 + 1f18388: e340120d movt r1, #525 ; 0x20d + 1f1838c: 13822801 orrne r2, r2, #65536 ; 0x10000 + 1f18390: 03833801 orreq r3, r3, #65536 ; 0x10000 + 1f18394: e5d11000 ldrb r1, [r1] + 1f18398: e3510000 cmp r1, #0 + 1f1839c: e3a01000 mov r1, #0 + 1f183a0: e3431f20 movt r1, #16160 ; 0x3f20 + 1f183a4: 13822a02 orrne r2, r2, #8192 ; 0x2000 + 1f183a8: 03833a02 orreq r3, r3, #8192 ; 0x2000 + 1f183ac: e581201c str r2, [r1, #28] + 1f183b0: e5813028 str r3, [r1, #40] ; 0x28 + 1f183b4: eaffffae b 1f18274 + 1f183b8: e3530000 cmp r3, #0 + 1f183bc: 13a03802 movne r3, #131072 ; 0x20000 + 1f183c0: 13a02701 movne r2, #262144 ; 0x40000 + 1f183c4: 1affffea bne 1f18374 + 1f183c8: e30a3298 movw r3, #41624 ; 0xa298 + 1f183cc: e340320d movt r3, #525 ; 0x20d + 1f183d0: e5d33000 ldrb r3, [r3] + 1f183d4: e3530000 cmp r3, #0 + 1f183d8: 03a03806 moveq r3, #393216 ; 0x60000 + 1f183dc: 13a03802 movne r3, #131072 ; 0x20000 + 1f183e0: 03a02000 moveq r2, #0 + 1f183e4: 13a02701 movne r2, #262144 ; 0x40000 + 1f183e8: eaffffe1 b 1f18374 + +01f183ec : + 1f183ec: e92d4ff8 push {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f183f0: e591b36c ldr fp, [r1, #876] ; 0x36c + 1f183f4: e2818fdd add r8, r1, #884 ; 0x374 + 1f183f8: e1a00002 mov r0, r2 + 1f183fc: e2888001 add r8, r8, #1 + 1f18400: e1a09003 mov r9, r3 + 1f18404: e088500b add r5, r8, fp + 1f18408: e1a06001 mov r6, r1 + 1f1840c: e1a04002 mov r4, r2 + 1f18410: e59d7028 ldr r7, [sp, #40] ; 0x28 + 1f18414: ebffead4 bl 1f12f6c + 1f18418: e3a02020 mov r2, #32 + 1f1841c: e1a0a000 mov sl, r0 + 1f18420: e1a01002 mov r1, r2 + 1f18424: e1a00005 mov r0, r5 + 1f18428: eb009afb bl 1f3f01c + 1f1842c: e3590ffa cmp r9, #1000 ; 0x3e8 + 1f18430: e3a02000 mov r2, #0 + 1f18434: e3a03001 mov r3, #1 + 1f18438: e5c5201f strb r2, [r5, #31] + 1f1843c: e1a02449 asr r2, r9, #8 + 1f18440: e7c8300b strb r3, [r8, fp] + 1f18444: e5c53001 strb r3, [r5, #1] + 1f18448: e5c59002 strb r9, [r5, #2] + 1f1844c: e5c52003 strb r2, [r5, #3] + 1f18450: 2a000098 bcs 1f186b8 + 1f18454: e3590063 cmp r9, #99 ; 0x63 + 1f18458: 8a00009a bhi 1f186c8 + 1f1845c: e359000a cmp r9, #10 + 1f18460: 33a0901a movcc r9, #26 + 1f18464: 23a09019 movcs r9, #25 + 1f18468: 33a03007 movcc r3, #7 + 1f1846c: 23a03006 movcs r3, #6 + 1f18470: 33a08008 movcc r8, #8 + 1f18474: 23a08007 movcs r8, #7 + 1f18478: e3a02022 mov r2, #34 ; 0x22 + 1f1847c: e1a00004 mov r0, r4 + 1f18480: e7c52003 strb r2, [r5, r3] + 1f18484: eb009f21 bl 1f40110 + 1f18488: e3500010 cmp r0, #16 + 1f1848c: 93a00000 movls r0, #0 + 1f18490: 820a0001 andhi r0, sl, #1 + 1f18494: e3500000 cmp r0, #0 + 1f18498: 0a00006e beq 1f18658 + 1f1849c: e3a0102e mov r1, #46 ; 0x2e + 1f184a0: e1a00004 mov r0, r4 + 1f184a4: eb009f8f bl 1f402e8 + 1f184a8: e085c008 add ip, r5, r8 + 1f184ac: e3a02000 mov r2, #0 + 1f184b0: e4d43001 ldrb r3, [r4], #1 + 1f184b4: e2822001 add r2, r2, #1 + 1f184b8: e2431041 sub r1, r3, #65 ; 0x41 + 1f184bc: e243e061 sub lr, r3, #97 ; 0x61 + 1f184c0: e3510019 cmp r1, #25 + 1f184c4: 9a000007 bls 1f184e8 + 1f184c8: e35e0019 cmp lr, #25 + 1f184cc: e283103f add r1, r3, #63 ; 0x3f + 1f184d0: 92433020 subls r3, r3, #32 + 1f184d4: e6ef1071 uxtb r1, r1 + 1f184d8: 96ef3073 uxtbls r3, r3 + 1f184dc: 9a000002 bls 1f184ec + 1f184e0: e3510019 cmp r1, #25 + 1f184e4: 8a000000 bhi 1f184ec + 1f184e8: e2233080 eor r3, r3, #128 ; 0x80 + 1f184ec: e4cc3001 strb r3, [ip], #1 + 1f184f0: e1d430d0 ldrsb r3, [r4] + 1f184f4: e3530000 cmp r3, #0 + 1f184f8: 13530022 cmpne r3, #34 ; 0x22 + 1f184fc: 0a000001 beq 1f18508 + 1f18500: e352000c cmp r2, #12 + 1f18504: 1affffe9 bne 1f184b0 + 1f18508: e5d03000 ldrb r3, [r0] + 1f1850c: e2821001 add r1, r2, #1 + 1f18510: e082c008 add ip, r2, r8 + 1f18514: e243e041 sub lr, r3, #65 ; 0x41 + 1f18518: e35e0019 cmp lr, #25 + 1f1851c: 9a000008 bls 1f18544 + 1f18520: e243e061 sub lr, r3, #97 ; 0x61 + 1f18524: e35e0019 cmp lr, #25 + 1f18528: 92433020 subls r3, r3, #32 + 1f1852c: 96ef3073 uxtbls r3, r3 + 1f18530: 9a000004 bls 1f18548 + 1f18534: e283e03f add lr, r3, #63 ; 0x3f + 1f18538: e6efe07e uxtb lr, lr + 1f1853c: e35e0019 cmp lr, #25 + 1f18540: 8a000000 bhi 1f18548 + 1f18544: e2233080 eor r3, r3, #128 ; 0x80 + 1f18548: e7c5300c strb r3, [r5, ip] + 1f1854c: e0811008 add r1, r1, r8 + 1f18550: e282c002 add ip, r2, #2 + 1f18554: e5d03001 ldrb r3, [r0, #1] + 1f18558: e243e041 sub lr, r3, #65 ; 0x41 + 1f1855c: e35e0019 cmp lr, #25 + 1f18560: 9a000008 bls 1f18588 + 1f18564: e243e061 sub lr, r3, #97 ; 0x61 + 1f18568: e35e0019 cmp lr, #25 + 1f1856c: 92433020 subls r3, r3, #32 + 1f18570: 96ef3073 uxtbls r3, r3 + 1f18574: 9a000004 bls 1f1858c + 1f18578: e283e03f add lr, r3, #63 ; 0x3f + 1f1857c: e6efe07e uxtb lr, lr + 1f18580: e35e0019 cmp lr, #25 + 1f18584: 8a000000 bhi 1f1858c + 1f18588: e2233080 eor r3, r3, #128 ; 0x80 + 1f1858c: e7c53001 strb r3, [r5, r1] + 1f18590: e08cc008 add ip, ip, r8 + 1f18594: e2821003 add r1, r2, #3 + 1f18598: e5d03002 ldrb r3, [r0, #2] + 1f1859c: e243e041 sub lr, r3, #65 ; 0x41 + 1f185a0: e35e0019 cmp lr, #25 + 1f185a4: 9a000008 bls 1f185cc + 1f185a8: e243e061 sub lr, r3, #97 ; 0x61 + 1f185ac: e35e0019 cmp lr, #25 + 1f185b0: 92433020 subls r3, r3, #32 + 1f185b4: 96ef3073 uxtbls r3, r3 + 1f185b8: 9a000004 bls 1f185d0 + 1f185bc: e283e03f add lr, r3, #63 ; 0x3f + 1f185c0: e6efe07e uxtb lr, lr + 1f185c4: e35e0019 cmp lr, #25 + 1f185c8: 8a000000 bhi 1f185d0 + 1f185cc: e2233080 eor r3, r3, #128 ; 0x80 + 1f185d0: e7c5300c strb r3, [r5, ip] + 1f185d4: e0881001 add r1, r8, r1 + 1f185d8: e5d03003 ldrb r3, [r0, #3] + 1f185dc: e2430041 sub r0, r3, #65 ; 0x41 + 1f185e0: e3500019 cmp r0, #25 + 1f185e4: 9a000008 bls 1f1860c + 1f185e8: e2430061 sub r0, r3, #97 ; 0x61 + 1f185ec: e3500019 cmp r0, #25 + 1f185f0: 92433020 subls r3, r3, #32 + 1f185f4: 96ef3073 uxtbls r3, r3 + 1f185f8: 9a000004 bls 1f18610 + 1f185fc: e283003f add r0, r3, #63 ; 0x3f + 1f18600: e6ef0070 uxtb r0, r0 + 1f18604: e3500019 cmp r0, #25 + 1f18608: 8a000000 bhi 1f18610 + 1f1860c: e2233080 eor r3, r3, #128 ; 0x80 + 1f18610: e7c53001 strb r3, [r5, r1] + 1f18614: e2820004 add r0, r2, #4 + 1f18618: e0877087 add r7, r7, r7, lsl #1 + 1f1861c: e30f33e0 movw r3, #62432 ; 0xf3e0 + 1f18620: e34031f5 movt r3, #501 ; 0x1f5 + 1f18624: e0850000 add r0, r5, r0 + 1f18628: e3a01022 mov r1, #34 ; 0x22 + 1f1862c: e7f32007 ldrb r2, [r3, r7]! + 1f18630: e7c01008 strb r1, [r0, r8] + 1f18634: e7e52009 strb r2, [r5, r9]! + 1f18638: e5d32001 ldrb r2, [r3, #1] + 1f1863c: e5d33002 ldrb r3, [r3, #2] + 1f18640: e5c52001 strb r2, [r5, #1] + 1f18644: e5c53002 strb r3, [r5, #2] + 1f18648: e596336c ldr r3, [r6, #876] ; 0x36c + 1f1864c: e2833020 add r3, r3, #32 + 1f18650: e586336c str r3, [r6, #876] ; 0x36c + 1f18654: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f18658: e0851008 add r1, r5, r8 + 1f1865c: e4d43001 ldrb r3, [r4], #1 + 1f18660: e2800001 add r0, r0, #1 + 1f18664: e2432041 sub r2, r3, #65 ; 0x41 + 1f18668: e243c061 sub ip, r3, #97 ; 0x61 + 1f1866c: e3520019 cmp r2, #25 + 1f18670: 9a000007 bls 1f18694 + 1f18674: e35c0019 cmp ip, #25 + 1f18678: e283203f add r2, r3, #63 ; 0x3f + 1f1867c: 92433020 subls r3, r3, #32 + 1f18680: e6ef2072 uxtb r2, r2 + 1f18684: 96ef3073 uxtbls r3, r3 + 1f18688: 9a000002 bls 1f18698 + 1f1868c: e3520019 cmp r2, #25 + 1f18690: 8a000000 bhi 1f18698 + 1f18694: e2233080 eor r3, r3, #128 ; 0x80 + 1f18698: e4c13001 strb r3, [r1], #1 + 1f1869c: e1d430d0 ldrsb r3, [r4] + 1f186a0: e3530000 cmp r3, #0 + 1f186a4: 13530022 cmpne r3, #34 ; 0x22 + 1f186a8: 0affffda beq 1f18618 + 1f186ac: e3500010 cmp r0, #16 + 1f186b0: 1affffe9 bne 1f1865c + 1f186b4: eaffffd7 b 1f18618 + 1f186b8: e3a09017 mov r9, #23 + 1f186bc: e3a03004 mov r3, #4 + 1f186c0: e3a08005 mov r8, #5 + 1f186c4: eaffff6b b 1f18478 + 1f186c8: e3a09018 mov r9, #24 + 1f186cc: e3a03005 mov r3, #5 + 1f186d0: e3a08006 mov r8, #6 + 1f186d4: eaffff67 b 1f18478 + +01f186d8 : + 1f186d8: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f186dc: e2803fe1 add r3, r0, #900 ; 0x384 + 1f186e0: e1a05000 mov r5, r0 + 1f186e4: e24ddf67 sub sp, sp, #412 ; 0x19c + 1f186e8: e2833001 add r3, r3, #1 + 1f186ec: e3a02020 mov r2, #32 + 1f186f0: e1a00003 mov r0, r3 + 1f186f4: e30411e8 movw r1, #16872 ; 0x41e8 + 1f186f8: e34011f6 movt r1, #502 ; 0x1f6 + 1f186fc: e58d3018 str r3, [sp, #24] + 1f18700: e2853010 add r3, r5, #16 + 1f18704: e58d3014 str r3, [sp, #20] + 1f18708: eb0099bc bl 1f3ee00 + 1f1870c: e3a03020 mov r3, #32 + 1f18710: e28d0028 add r0, sp, #40 ; 0x28 + 1f18714: e585337c str r3, [r5, #892] ; 0x37c + 1f18718: e30f134c movw r1, #62284 ; 0xf34c + 1f1871c: e34011f5 movt r1, #501 ; 0x1f5 + 1f18720: ebffdcf2 bl 1f0faf0 + 1f18724: e3500000 cmp r0, #0 + 1f18728: e30a32be movw r3, #41662 ; 0xa2be + 1f1872c: e340320d movt r3, #525 ; 0x20d + 1f18730: e30a62d7 movw r6, #41687 ; 0xa2d7 + 1f18734: e340620d movt r6, #525 ; 0x20d + 1f18738: e58d3010 str r3, [sp, #16] + 1f1873c: 12853fe1 addne r3, r5, #900 ; 0x384 + 1f18740: 158d3008 strne r3, [sp, #8] + 1f18744: 1a000010 bne 1f1878c + 1f18748: e3a04a03 mov r4, #12288 ; 0x3000 + 1f1874c: e3434f00 movt r4, #16128 ; 0x3f00 + 1f18750: e30ab305 movw fp, #41733 ; 0xa305 + 1f18754: e340b20d movt fp, #525 ; 0x20d + 1f18758: e2853fe1 add r3, r5, #900 ; 0x384 + 1f1875c: e58d3008 str r3, [sp, #8] + 1f18760: e28d1078 add r1, sp, #120 ; 0x78 + 1f18764: e28d0028 add r0, sp, #40 ; 0x28 + 1f18768: ebffdd69 bl 1f0fd14 + 1f1876c: e3a0102e mov r1, #46 ; 0x2e + 1f18770: e1a07000 mov r7, r0 + 1f18774: e28d0092 add r0, sp, #146 ; 0x92 + 1f18778: eb009eda bl 1f402e8 + 1f1877c: e3570000 cmp r7, #0 + 1f18780: 0a0000ce beq 1f18ac0 + 1f18784: e28d0028 add r0, sp, #40 ; 0x28 + 1f18788: ebffdd4b bl 1f0fcbc + 1f1878c: e595337c ldr r3, [r5, #892] ; 0x37c + 1f18790: e3530000 cmp r3, #0 + 1f18794: 0a000075 beq 1f18970 + 1f18798: e30a82f8 movw r8, #41720 ; 0xa2f8 + 1f1879c: e340820d movt r8, #525 ; 0x20d + 1f187a0: e1a03008 mov r3, r8 + 1f187a4: e3a0aa03 mov sl, #12288 ; 0x3000 + 1f187a8: e343af00 movt sl, #16128 ; 0x3f00 + 1f187ac: e59db008 ldr fp, [sp, #8] + 1f187b0: e30a92be movw r9, #41662 ; 0xa2be + 1f187b4: e340920d movt r9, #525 ; 0x20d + 1f187b8: e30a4305 movw r4, #41733 ; 0xa305 + 1f187bc: e340420d movt r4, #525 ; 0x20d + 1f187c0: e1a0800a mov r8, sl + 1f187c4: e3a07000 mov r7, #0 + 1f187c8: e1a0a003 mov sl, r3 + 1f187cc: e5fb3001 ldrb r3, [fp, #1]! + 1f187d0: e3a00032 mov r0, #50 ; 0x32 + 1f187d4: e58d3014 str r3, [sp, #20] + 1f187d8: e5982004 ldr r2, [r8, #4] + 1f187dc: e5983004 ldr r3, [r8, #4] + 1f187e0: e1520003 cmp r2, r3 + 1f187e4: 0afffffc beq 1f187dc + 1f187e8: e2500001 subs r0, r0, #1 + 1f187ec: 1afffff9 bne 1f187d8 + 1f187f0: e59d3010 ldr r3, [sp, #16] + 1f187f4: e5d32000 ldrb r2, [r3] + 1f187f8: e3520000 cmp r2, #0 + 1f187fc: 1a0000cb bne 1f18b30 + 1f18800: ebffee8d bl 1f1423c + 1f18804: e5d53005 ldrb r3, [r5, #5] + 1f18808: e5d62000 ldrb r2, [r6] + 1f1880c: e3530002 cmp r3, #2 + 1f18810: 0a00007a beq 1f18a00 + 1f18814: e3520000 cmp r2, #0 + 1f18818: 0a000045 beq 1f18934 + 1f1881c: e3a03001 mov r3, #1 + 1f18820: e5c53005 strb r3, [r5, #5] + 1f18824: e3a02020 mov r2, #32 + 1f18828: e59d0018 ldr r0, [sp, #24] + 1f1882c: e30f12a8 movw r1, #62120 ; 0xf2a8 + 1f18830: e34011f5 movt r1, #501 ; 0x1f5 + 1f18834: eb009971 bl 1f3ee00 + 1f18838: e30f083c movw r0, #63548 ; 0xf83c + 1f1883c: e34001f5 movt r0, #501 ; 0x1f5 + 1f18840: e28d2020 add r2, sp, #32 + 1f18844: e28d1024 add r1, sp, #36 ; 0x24 + 1f18848: ebffde87 bl 1f1026c + 1f1884c: e3500000 cmp r0, #0 + 1f18850: 1a00017a bne 1f18e40 + 1f18854: e59d2020 ldr r2, [sp, #32] + 1f18858: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f1885c: e1d220ba ldrh r2, [r2, #10] + 1f18860: e0030293 mul r3, r3, r2 + 1f18864: e1a03083 lsl r3, r3, #1 + 1f18868: e3530801 cmp r3, #65536 ; 0x10000 + 1f1886c: 95c53387 strbls r3, [r5, #903] ; 0x387 + 1f18870: 83e03000 mvnhi r3, #0 + 1f18874: 91a03423 lsrls r3, r3, #8 + 1f18878: 85c53387 strbhi r3, [r5, #903] ; 0x387 + 1f1887c: e5c53388 strb r3, [r5, #904] ; 0x388 + 1f18880: e59d3008 ldr r3, [sp, #8] + 1f18884: e3a08a03 mov r8, #12288 ; 0x3000 + 1f18888: e3438f00 movt r8, #16128 ; 0x3f00 + 1f1888c: e5959380 ldr r9, [r5, #896] ; 0x380 + 1f18890: e30aa2be movw sl, #41662 ; 0xa2be + 1f18894: e340a20d movt sl, #525 ; 0x20d + 1f18898: e58d3014 str r3, [sp, #20] + 1f1889c: e3a03020 mov r3, #32 + 1f188a0: e0890003 add r0, r9, r3 + 1f188a4: e30ab2f8 movw fp, #41720 ; 0xa2f8 + 1f188a8: e340b20d movt fp, #525 ; 0x20d + 1f188ac: ee800b90 vdup.32 d16, r0 + 1f188b0: e30a4305 movw r4, #41733 ; 0xa305 + 1f188b4: e340420d movt r4, #525 ; 0x20d + 1f188b8: e585337c str r3, [r5, #892] ; 0x37c + 1f188bc: e3a07000 mov r7, #0 + 1f188c0: f3e000b0 vshr.u64 d16, d16, #32 + 1f188c4: edcd0b02 vstr d16, [sp, #8] + 1f188c8: edc50b04 vstr d16, [r5, #16] + 1f188cc: e59d3014 ldr r3, [sp, #20] + 1f188d0: e3a01032 mov r1, #50 ; 0x32 + 1f188d4: e5f32001 ldrb r2, [r3, #1]! + 1f188d8: e58d2018 str r2, [sp, #24] + 1f188dc: e58d3014 str r3, [sp, #20] + 1f188e0: e5982004 ldr r2, [r8, #4] + 1f188e4: e5983004 ldr r3, [r8, #4] + 1f188e8: e1520003 cmp r2, r3 + 1f188ec: 0afffffc beq 1f188e4 + 1f188f0: e2511001 subs r1, r1, #1 + 1f188f4: 1afffff9 bne 1f188e0 + 1f188f8: e59d3010 ldr r3, [sp, #16] + 1f188fc: e5d33000 ldrb r3, [r3] + 1f18900: e3530000 cmp r3, #0 + 1f18904: 1a000042 bne 1f18a14 + 1f18908: ebffee4b bl 1f1423c + 1f1890c: e5d53005 ldrb r3, [r5, #5] + 1f18910: e5d62000 ldrb r2, [r6] + 1f18914: e3530002 cmp r3, #2 + 1f18918: 0a000032 beq 1f189e8 + 1f1891c: e3520000 cmp r2, #0 + 1f18920: 0a000015 beq 1f1897c + 1f18924: e3a03001 mov r3, #1 + 1f18928: e5c53005 strb r3, [r5, #5] + 1f1892c: e28ddf67 add sp, sp, #412 ; 0x19c + 1f18930: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f18934: e5d42000 ldrb r2, [r4] + 1f18938: e3520000 cmp r2, #0 + 1f1893c: 1affffaf bne 1f18800 + 1f18940: e59d1014 ldr r1, [sp, #20] + 1f18944: e1a00005 mov r0, r5 + 1f18948: ebfff038 bl 1f14a30 + 1f1894c: e3500000 cmp r0, #0 + 1f18950: 1affffb3 bne 1f18824 + 1f18954: e595137c ldr r1, [r5, #892] ; 0x37c + 1f18958: e2877001 add r7, r7, #1 + 1f1895c: e5952380 ldr r2, [r5, #896] ; 0x380 + 1f18960: e1510007 cmp r1, r7 + 1f18964: e2822001 add r2, r2, #1 + 1f18968: e5852380 str r2, [r5, #896] ; 0x380 + 1f1896c: 8affff96 bhi 1f187cc + 1f18970: e3a03000 mov r3, #0 + 1f18974: e585337c str r3, [r5, #892] ; 0x37c + 1f18978: eaffffa9 b 1f18824 + 1f1897c: e5d43000 ldrb r3, [r4] + 1f18980: e3530000 cmp r3, #0 + 1f18984: 1affffdf bne 1f18908 + 1f18988: e1cd00d8 ldrd r0, [sp, #8] + 1f1898c: e3a03000 mov r3, #0 + 1f18990: e1a02009 mov r2, r9 + 1f18994: e2500001 subs r0, r0, #1 + 1f18998: e2c11000 sbc r1, r1, #0 + 1f1899c: e1510003 cmp r1, r3 + 1f189a0: e59d1018 ldr r1, [sp, #24] + 1f189a4: 01500009 cmpeq r0, r9 + 1f189a8: e1a00005 mov r0, r5 + 1f189ac: 03a02001 moveq r2, #1 + 1f189b0: 13a02000 movne r2, #0 + 1f189b4: ebfff01d bl 1f14a30 + 1f189b8: e3500000 cmp r0, #0 + 1f189bc: 1affffda bne 1f1892c + 1f189c0: e595337c ldr r3, [r5, #892] ; 0x37c + 1f189c4: e2877001 add r7, r7, #1 + 1f189c8: e5952380 ldr r2, [r5, #896] ; 0x380 + 1f189cc: e1530007 cmp r3, r7 + 1f189d0: e2829001 add r9, r2, #1 + 1f189d4: e5859380 str r9, [r5, #896] ; 0x380 + 1f189d8: 9a00011c bls 1f18e50 + 1f189dc: e1c521d0 ldrd r2, [r5, #16] + 1f189e0: e1cd20f8 strd r2, [sp, #8] + 1f189e4: eaffffb8 b 1f188cc + 1f189e8: e3520000 cmp r2, #0 + 1f189ec: 1affffe2 bne 1f1897c + 1f189f0: e3a03003 mov r3, #3 + 1f189f4: e5c53005 strb r3, [r5, #5] + 1f189f8: e28ddf67 add sp, sp, #412 ; 0x19c + 1f189fc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f18a00: e3520000 cmp r2, #0 + 1f18a04: 1affffca bne 1f18934 + 1f18a08: e3a03003 mov r3, #3 + 1f18a0c: e5c53005 strb r3, [r5, #5] + 1f18a10: eaffff83 b 1f18824 + 1f18a14: e5db3000 ldrb r3, [fp] + 1f18a18: e5ca1000 strb r1, [sl] + 1f18a1c: e3530000 cmp r3, #0 + 1f18a20: e30a3307 movw r3, #41735 ; 0xa307 + 1f18a24: e340320d movt r3, #525 ; 0x20d + 1f18a28: e5d33000 ldrb r3, [r3] + 1f18a2c: 1a000077 bne 1f18c10 + 1f18a30: e3530000 cmp r3, #0 + 1f18a34: 13a02401 movne r2, #16777216 ; 0x1000000 + 1f18a38: 1a000005 bne 1f18a54 + 1f18a3c: e30a3298 movw r3, #41624 ; 0xa298 + 1f18a40: e340320d movt r3, #525 ; 0x20d + 1f18a44: e5d33000 ldrb r3, [r3] + 1f18a48: e3530000 cmp r3, #0 + 1f18a4c: 13a02401 movne r2, #16777216 ; 0x1000000 + 1f18a50: 03a02000 moveq r2, #0 + 1f18a54: e30a32f4 movw r3, #41716 ; 0xa2f4 + 1f18a58: e340320d movt r3, #525 ; 0x20d + 1f18a5c: e3a00000 mov r0, #0 + 1f18a60: e3430f20 movt r0, #16160 ; 0x3f20 + 1f18a64: e5931000 ldr r1, [r3] + 1f18a68: e3a03000 mov r3, #0 + 1f18a6c: e3c11612 bic r1, r1, #18874368 ; 0x1200000 + 1f18a70: e1812002 orr r2, r1, r2 + 1f18a74: e5802004 str r2, [r0, #4] + 1f18a78: e1a02003 mov r2, r3 + 1f18a7c: e30a131d movw r1, #41757 ; 0xa31d + 1f18a80: e340120d movt r1, #525 ; 0x20d + 1f18a84: e5d11000 ldrb r1, [r1] + 1f18a88: e3510000 cmp r1, #0 + 1f18a8c: e30a1306 movw r1, #41734 ; 0xa306 + 1f18a90: e340120d movt r1, #525 ; 0x20d + 1f18a94: 13822801 orrne r2, r2, #65536 ; 0x10000 + 1f18a98: 03833801 orreq r3, r3, #65536 ; 0x10000 + 1f18a9c: e5d11000 ldrb r1, [r1] + 1f18aa0: e3510000 cmp r1, #0 + 1f18aa4: e3a01000 mov r1, #0 + 1f18aa8: e3431f20 movt r1, #16160 ; 0x3f20 + 1f18aac: 13822a02 orrne r2, r2, #8192 ; 0x2000 + 1f18ab0: 03833a02 orreq r3, r3, #8192 ; 0x2000 + 1f18ab4: e581201c str r2, [r1, #28] + 1f18ab8: e5813028 str r3, [r1, #40] ; 0x28 + 1f18abc: eaffff91 b 1f18908 + 1f18ac0: e1dd29d2 ldrsb r2, [sp, #146] ; 0x92 + 1f18ac4: e3520000 cmp r2, #0 + 1f18ac8: 0affff2d beq 1f18784 + 1f18acc: e3500000 cmp r0, #0 + 1f18ad0: 0a000004 beq 1f18ae8 + 1f18ad4: e30f13c8 movw r1, #62408 ; 0xf3c8 + 1f18ad8: e34011f5 movt r1, #501 ; 0x1f5 + 1f18adc: eb009c2e bl 1f3fb9c + 1f18ae0: e3500000 cmp r0, #0 + 1f18ae4: 0a00000d beq 1f18b20 + 1f18ae8: e595337c ldr r3, [r5, #892] ; 0x37c + 1f18aec: e2632a01 rsb r2, r3, #4096 ; 0x1000 + 1f18af0: e352001f cmp r2, #31 + 1f18af4: 9a00005e bls 1f18c74 + 1f18af8: e5dd3084 ldrb r3, [sp, #132] ; 0x84 + 1f18afc: e3130010 tst r3, #16 + 1f18b00: 0a00004f beq 1f18c44 + 1f18b04: e3a02006 mov r2, #6 + 1f18b08: e3a03000 mov r3, #0 + 1f18b0c: e58d2000 str r2, [sp] + 1f18b10: e1a00005 mov r0, r5 + 1f18b14: e28d2092 add r2, sp, #146 ; 0x92 + 1f18b18: e59d1014 ldr r1, [sp, #20] + 1f18b1c: ebfffe32 bl 1f183ec + 1f18b20: e1dd39d2 ldrsb r3, [sp, #146] ; 0x92 + 1f18b24: e3530000 cmp r3, #0 + 1f18b28: 1affff0c bne 1f18760 + 1f18b2c: eaffff14 b 1f18784 + 1f18b30: e5da2000 ldrb r2, [sl] + 1f18b34: e5c90000 strb r0, [r9] + 1f18b38: e3520000 cmp r2, #0 + 1f18b3c: e30a2307 movw r2, #41735 ; 0xa307 + 1f18b40: e340220d movt r2, #525 ; 0x20d + 1f18b44: e5d22000 ldrb r2, [r2] + 1f18b48: 1a000023 bne 1f18bdc + 1f18b4c: e3520000 cmp r2, #0 + 1f18b50: 13a01401 movne r1, #16777216 ; 0x1000000 + 1f18b54: 1a000005 bne 1f18b70 + 1f18b58: e30a2298 movw r2, #41624 ; 0xa298 + 1f18b5c: e340220d movt r2, #525 ; 0x20d + 1f18b60: e5d22000 ldrb r2, [r2] + 1f18b64: e3520000 cmp r2, #0 + 1f18b68: 13a01401 movne r1, #16777216 ; 0x1000000 + 1f18b6c: 03a01000 moveq r1, #0 + 1f18b70: e30a22f4 movw r2, #41716 ; 0xa2f4 + 1f18b74: e340220d movt r2, #525 ; 0x20d + 1f18b78: e3a0c000 mov ip, #0 + 1f18b7c: e343cf20 movt ip, #16160 ; 0x3f20 + 1f18b80: e5920000 ldr r0, [r2] + 1f18b84: e3a02000 mov r2, #0 + 1f18b88: e3c00612 bic r0, r0, #18874368 ; 0x1200000 + 1f18b8c: e1801001 orr r1, r0, r1 + 1f18b90: e58c1004 str r1, [ip, #4] + 1f18b94: e1a01002 mov r1, r2 + 1f18b98: e30a031d movw r0, #41757 ; 0xa31d + 1f18b9c: e340020d movt r0, #525 ; 0x20d + 1f18ba0: e5d00000 ldrb r0, [r0] + 1f18ba4: e3500000 cmp r0, #0 + 1f18ba8: e30a0306 movw r0, #41734 ; 0xa306 + 1f18bac: e340020d movt r0, #525 ; 0x20d + 1f18bb0: 13811801 orrne r1, r1, #65536 ; 0x10000 + 1f18bb4: 03822801 orreq r2, r2, #65536 ; 0x10000 + 1f18bb8: e5d00000 ldrb r0, [r0] + 1f18bbc: e3500000 cmp r0, #0 + 1f18bc0: e3a00000 mov r0, #0 + 1f18bc4: e3430f20 movt r0, #16160 ; 0x3f20 + 1f18bc8: 13811a02 orrne r1, r1, #8192 ; 0x2000 + 1f18bcc: 03822a02 orreq r2, r2, #8192 ; 0x2000 + 1f18bd0: e580101c str r1, [r0, #28] + 1f18bd4: e5802028 str r2, [r0, #40] ; 0x28 + 1f18bd8: eaffff08 b 1f18800 + 1f18bdc: e3520000 cmp r2, #0 + 1f18be0: 13a02802 movne r2, #131072 ; 0x20000 + 1f18be4: 13a01701 movne r1, #262144 ; 0x40000 + 1f18be8: 1affffea bne 1f18b98 + 1f18bec: e30a2298 movw r2, #41624 ; 0xa298 + 1f18bf0: e340220d movt r2, #525 ; 0x20d + 1f18bf4: e5d22000 ldrb r2, [r2] + 1f18bf8: e3520000 cmp r2, #0 + 1f18bfc: 03a02806 moveq r2, #393216 ; 0x60000 + 1f18c00: 13a02802 movne r2, #131072 ; 0x20000 + 1f18c04: 03a01000 moveq r1, #0 + 1f18c08: 13a01701 movne r1, #262144 ; 0x40000 + 1f18c0c: eaffffe1 b 1f18b98 + 1f18c10: e3530000 cmp r3, #0 + 1f18c14: 13a03802 movne r3, #131072 ; 0x20000 + 1f18c18: 13a02701 movne r2, #262144 ; 0x40000 + 1f18c1c: 1affff96 bne 1f18a7c + 1f18c20: e30a3298 movw r3, #41624 ; 0xa298 + 1f18c24: e340320d movt r3, #525 ; 0x20d + 1f18c28: e5d33000 ldrb r3, [r3] + 1f18c2c: e3530000 cmp r3, #0 + 1f18c30: 03a03806 moveq r3, #393216 ; 0x60000 + 1f18c34: 13a03802 movne r3, #131072 ; 0x20000 + 1f18c38: 03a02000 moveq r2, #0 + 1f18c3c: 13a02701 movne r2, #262144 ; 0x40000 + 1f18c40: eaffff8d b 1f18a7c + 1f18c44: e1cd07d8 ldrd r0, [sp, #120] ; 0x78 + 1f18c48: e3a03002 mov r3, #2 + 1f18c4c: e58d3000 str r3, [sp] + 1f18c50: e28d2092 add r2, sp, #146 ; 0x92 + 1f18c54: e1a00420 lsr r0, r0, #8 + 1f18c58: e1800c01 orr r0, r0, r1, lsl #24 + 1f18c5c: e59d1014 ldr r1, [sp, #20] + 1f18c60: e2803001 add r3, r0, #1 + 1f18c64: e1a00005 mov r0, r5 + 1f18c68: e6ff3073 uxth r3, r3 + 1f18c6c: ebfffdde bl 1f183ec + 1f18c70: eaffffaa b 1f18b20 + 1f18c74: e3530000 cmp r3, #0 + 1f18c78: 0a00002f beq 1f18d3c + 1f18c7c: e1a03004 mov r3, r4 + 1f18c80: e30a82f8 movw r8, #41720 ; 0xa2f8 + 1f18c84: e340820d movt r8, #525 ; 0x20d + 1f18c88: e59da008 ldr sl, [sp, #8] + 1f18c8c: e30a92be movw r9, #41662 ; 0xa2be + 1f18c90: e340920d movt r9, #525 ; 0x20d + 1f18c94: e1a04008 mov r4, r8 + 1f18c98: e3a07000 mov r7, #0 + 1f18c9c: e1a08003 mov r8, r3 + 1f18ca0: e5fa3001 ldrb r3, [sl, #1]! + 1f18ca4: e3a00032 mov r0, #50 ; 0x32 + 1f18ca8: e58d301c str r3, [sp, #28] + 1f18cac: e5982004 ldr r2, [r8, #4] + 1f18cb0: e5983004 ldr r3, [r8, #4] + 1f18cb4: e1520003 cmp r2, r3 + 1f18cb8: 0afffffc beq 1f18cb0 + 1f18cbc: e2500001 subs r0, r0, #1 + 1f18cc0: 1afffff9 bne 1f18cac + 1f18cc4: e59d3010 ldr r3, [sp, #16] + 1f18cc8: e5d32000 ldrb r2, [r3] + 1f18ccc: e3520000 cmp r2, #0 + 1f18cd0: 1a000022 bne 1f18d60 + 1f18cd4: ebffed58 bl 1f1423c + 1f18cd8: e5d52005 ldrb r2, [r5, #5] + 1f18cdc: e5d63000 ldrb r3, [r6] + 1f18ce0: e3520002 cmp r2, #2 + 1f18ce4: 0a000017 beq 1f18d48 + 1f18ce8: e3530000 cmp r3, #0 + 1f18cec: 13a03001 movne r3, #1 + 1f18cf0: 11a04008 movne r4, r8 + 1f18cf4: 15c53005 strbne r3, [r5, #5] + 1f18cf8: 1affff7e bne 1f18af8 + 1f18cfc: e5db2000 ldrb r2, [fp] + 1f18d00: e3520000 cmp r2, #0 + 1f18d04: 1afffff2 bne 1f18cd4 + 1f18d08: e59d101c ldr r1, [sp, #28] + 1f18d0c: e1a00005 mov r0, r5 + 1f18d10: ebffef46 bl 1f14a30 + 1f18d14: e3500000 cmp r0, #0 + 1f18d18: 1a00004e bne 1f18e58 + 1f18d1c: e595137c ldr r1, [r5, #892] ; 0x37c + 1f18d20: e2877001 add r7, r7, #1 + 1f18d24: e5952380 ldr r2, [r5, #896] ; 0x380 + 1f18d28: e1510007 cmp r1, r7 + 1f18d2c: e2822001 add r2, r2, #1 + 1f18d30: e5852380 str r2, [r5, #896] ; 0x380 + 1f18d34: 8affffd9 bhi 1f18ca0 + 1f18d38: e1a04008 mov r4, r8 + 1f18d3c: e3a03000 mov r3, #0 + 1f18d40: e585337c str r3, [r5, #892] ; 0x37c + 1f18d44: eaffff6b b 1f18af8 + 1f18d48: e3530000 cmp r3, #0 + 1f18d4c: 1affffea bne 1f18cfc + 1f18d50: e3a03003 mov r3, #3 + 1f18d54: e1a04008 mov r4, r8 + 1f18d58: e5c53005 strb r3, [r5, #5] + 1f18d5c: eaffff65 b 1f18af8 + 1f18d60: e5d42000 ldrb r2, [r4] + 1f18d64: e5c90000 strb r0, [r9] + 1f18d68: e3520000 cmp r2, #0 + 1f18d6c: e30a2307 movw r2, #41735 ; 0xa307 + 1f18d70: e340220d movt r2, #525 ; 0x20d + 1f18d74: e5d22000 ldrb r2, [r2] + 1f18d78: 1a000023 bne 1f18e0c + 1f18d7c: e3520000 cmp r2, #0 + 1f18d80: 13a01401 movne r1, #16777216 ; 0x1000000 + 1f18d84: 1a000005 bne 1f18da0 + 1f18d88: e30a2298 movw r2, #41624 ; 0xa298 + 1f18d8c: e340220d movt r2, #525 ; 0x20d + 1f18d90: e5d22000 ldrb r2, [r2] + 1f18d94: e3520000 cmp r2, #0 + 1f18d98: 13a01401 movne r1, #16777216 ; 0x1000000 + 1f18d9c: 03a01000 moveq r1, #0 + 1f18da0: e30a22f4 movw r2, #41716 ; 0xa2f4 + 1f18da4: e340220d movt r2, #525 ; 0x20d + 1f18da8: e3a0c000 mov ip, #0 + 1f18dac: e343cf20 movt ip, #16160 ; 0x3f20 + 1f18db0: e5920000 ldr r0, [r2] + 1f18db4: e3a02000 mov r2, #0 + 1f18db8: e3c00612 bic r0, r0, #18874368 ; 0x1200000 + 1f18dbc: e1801001 orr r1, r0, r1 + 1f18dc0: e58c1004 str r1, [ip, #4] + 1f18dc4: e1a01002 mov r1, r2 + 1f18dc8: e30a031d movw r0, #41757 ; 0xa31d + 1f18dcc: e340020d movt r0, #525 ; 0x20d + 1f18dd0: e5d00000 ldrb r0, [r0] + 1f18dd4: e3500000 cmp r0, #0 + 1f18dd8: e30a0306 movw r0, #41734 ; 0xa306 + 1f18ddc: e340020d movt r0, #525 ; 0x20d + 1f18de0: 13811801 orrne r1, r1, #65536 ; 0x10000 + 1f18de4: 03822801 orreq r2, r2, #65536 ; 0x10000 + 1f18de8: e5d00000 ldrb r0, [r0] + 1f18dec: e3500000 cmp r0, #0 + 1f18df0: e3a00000 mov r0, #0 + 1f18df4: e3430f20 movt r0, #16160 ; 0x3f20 + 1f18df8: 13811a02 orrne r1, r1, #8192 ; 0x2000 + 1f18dfc: 03822a02 orreq r2, r2, #8192 ; 0x2000 + 1f18e00: e580101c str r1, [r0, #28] + 1f18e04: e5802028 str r2, [r0, #40] ; 0x28 + 1f18e08: eaffffb1 b 1f18cd4 + 1f18e0c: e3520000 cmp r2, #0 + 1f18e10: 13a02802 movne r2, #131072 ; 0x20000 + 1f18e14: 13a01701 movne r1, #262144 ; 0x40000 + 1f18e18: 1affffea bne 1f18dc8 + 1f18e1c: e30a2298 movw r2, #41624 ; 0xa298 + 1f18e20: e340220d movt r2, #525 ; 0x20d + 1f18e24: e5d22000 ldrb r2, [r2] + 1f18e28: e3520000 cmp r2, #0 + 1f18e2c: 03a02806 moveq r2, #393216 ; 0x60000 + 1f18e30: 13a02802 movne r2, #131072 ; 0x20000 + 1f18e34: 03a01000 moveq r1, #0 + 1f18e38: 13a01701 movne r1, #262144 ; 0x40000 + 1f18e3c: eaffffe1 b 1f18dc8 + 1f18e40: e3a03000 mov r3, #0 + 1f18e44: e5c53387 strb r3, [r5, #903] ; 0x387 + 1f18e48: e5c53388 strb r3, [r5, #904] ; 0x388 + 1f18e4c: eafffe8b b 1f18880 + 1f18e50: e585037c str r0, [r5, #892] ; 0x37c + 1f18e54: eafffeb4 b 1f1892c + 1f18e58: e1a04008 mov r4, r8 + 1f18e5c: eaffff25 b 1f18af8 + +01f18e60 : + 1f18e60: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f18e64: e3013478 movw r3, #5240 ; 0x1478 + 1f18e68: e3012385 movw r2, #4997 ; 0x1385 + 1f18e6c: e5d06004 ldrb r6, [r0, #4] + 1f18e70: e24ddf9a sub sp, sp, #616 ; 0x268 + 1f18e74: e0230693 mla r3, r3, r6, r0 + 1f18e78: e7d32002 ldrb r2, [r3, r2] + 1f18e7c: e2422023 sub r2, r2, #35 ; 0x23 + 1f18e80: e3520001 cmp r2, #1 + 1f18e84: 9a000086 bls 1f190a4 + 1f18e88: e5d33384 ldrb r3, [r3, #900] ; 0x384 + 1f18e8c: e3530000 cmp r3, #0 + 1f18e90: 1a000083 bne 1f190a4 + 1f18e94: e3560001 cmp r6, #1 + 1f18e98: e1a07000 mov r7, r0 + 1f18e9c: e5cd3008 strb r3, [sp, #8] + 1f18ea0: e5cd3010 strb r3, [sp, #16] + 1f18ea4: 0a000080 beq 1f190ac + 1f18ea8: e3014478 movw r4, #5240 ; 0x1478 + 1f18eac: e0247694 mla r4, r4, r6, r7 + 1f18eb0: e2844d4e add r4, r4, #4992 ; 0x1380 + 1f18eb4: e2844005 add r4, r4, #5 + 1f18eb8: ea000002 b 1f18ec8 + 1f18ebc: e3500000 cmp r0, #0 + 1f18ec0: ba000007 blt 1f18ee4 + 1f18ec4: eb009599 bl 1f3e530 + 1f18ec8: e1a05004 mov r5, r4 + 1f18ecc: e2844001 add r4, r4, #1 + 1f18ed0: e1d500d0 ldrsb r0, [r5] + 1f18ed4: eb009595 bl 1f3e530 + 1f18ed8: e3500000 cmp r0, #0 + 1f18edc: e15400d1 ldrsb r0, [r4, #-1] + 1f18ee0: 1afffff5 bne 1f18ebc + 1f18ee4: e2403020 sub r3, r0, #32 + 1f18ee8: e31300df tst r3, #223 ; 0xdf + 1f18eec: 0afffff4 beq 1f18ec4 + 1f18ef0: e350003a cmp r0, #58 ; 0x3a + 1f18ef4: 0a000071 beq 1f190c0 + 1f18ef8: e1a00005 mov r0, r5 + 1f18efc: e28d1068 add r1, sp, #104 ; 0x68 + 1f18f00: e3a02001 mov r2, #1 + 1f18f04: ebffee66 bl 1f148a4 + 1f18f08: e2504000 subs r4, r0, #0 + 1f18f0c: 0a000014 beq 1f18f64 + 1f18f10: e3a0103a mov r1, #58 ; 0x3a + 1f18f14: e3a03000 mov r3, #0 + 1f18f18: e5cd3008 strb r3, [sp, #8] + 1f18f1c: eb009b5c bl 1f3fc94 + 1f18f20: e3500000 cmp r0, #0 + 1f18f24: 0a0000a6 beq 1f191c4 + 1f18f28: e28d1008 add r1, sp, #8 + 1f18f2c: e3a02000 mov r2, #0 + 1f18f30: ebffee5b bl 1f148a4 + 1f18f34: e2504000 subs r4, r0, #0 + 1f18f38: 0a000009 beq 1f18f64 + 1f18f3c: e3a0103a mov r1, #58 ; 0x3a + 1f18f40: e3a03000 mov r3, #0 + 1f18f44: e5cd3010 strb r3, [sp, #16] + 1f18f48: eb009b51 bl 1f3fc94 + 1f18f4c: e2503000 subs r3, r0, #0 + 1f18f50: 0a00005f beq 1f190d4 + 1f18f54: e1a00003 mov r0, r3 + 1f18f58: e3a02000 mov r2, #0 + 1f18f5c: e28d1010 add r1, sp, #16 + 1f18f60: ebffee4f bl 1f148a4 + 1f18f64: e1dd00d8 ldrsb r0, [sp, #8] + 1f18f68: eb00a798 bl 1f42dd0 + 1f18f6c: e350004c cmp r0, #76 ; 0x4c + 1f18f70: 0a00004b beq 1f190a4 + 1f18f74: e1dd01d0 ldrsb r0, [sp, #16] + 1f18f78: eb00a794 bl 1f42dd0 + 1f18f7c: e3500041 cmp r0, #65 ; 0x41 + 1f18f80: 0a000050 beq 1f190c8 + 1f18f84: e3500057 cmp r0, #87 ; 0x57 + 1f18f88: 0a00005e beq 1f19108 + 1f18f8c: e3a08001 mov r8, #1 + 1f18f90: e3a0c000 mov ip, #0 + 1f18f94: e3013478 movw r3, #5240 ; 0x1478 + 1f18f98: e28d1068 add r1, sp, #104 ; 0x68 + 1f18f9c: e28d0f5a add r0, sp, #360 ; 0x168 + 1f18fa0: e0030693 mul r3, r3, r6 + 1f18fa4: e0872003 add r2, r7, r3 + 1f18fa8: e2833010 add r3, r3, #16 + 1f18fac: e0874003 add r4, r7, r3 + 1f18fb0: e5c2c378 strb ip, [r2, #888] ; 0x378 + 1f18fb4: eb009c19 bl 1f40020 + 1f18fb8: e3a0102e mov r1, #46 ; 0x2e + 1f18fbc: e28d0068 add r0, sp, #104 ; 0x68 + 1f18fc0: eb009cc8 bl 1f402e8 + 1f18fc4: e2505000 subs r5, r0, #0 + 1f18fc8: 0a000089 beq 1f191f4 + 1f18fcc: e3a0102e mov r1, #46 ; 0x2e + 1f18fd0: e28d0f5a add r0, sp, #360 ; 0x168 + 1f18fd4: eb009cc3 bl 1f402e8 + 1f18fd8: e3a0202a mov r2, #42 ; 0x2a + 1f18fdc: e5c02000 strb r2, [r0] + 1f18fe0: e3a03000 mov r3, #0 + 1f18fe4: e1d520d0 ldrsb r2, [r5] + 1f18fe8: e5c02001 strb r2, [r0, #1] + 1f18fec: e1d520d1 ldrsb r2, [r5, #1] + 1f18ff0: e5c02002 strb r2, [r0, #2] + 1f18ff4: e1d520d2 ldrsb r2, [r5, #2] + 1f18ff8: e5c02003 strb r2, [r0, #3] + 1f18ffc: e1d520d3 ldrsb r2, [r5, #3] + 1f19000: e5c02004 strb r2, [r0, #4] + 1f19004: e5c03005 strb r3, [r0, #5] + 1f19008: e28d3f5a add r3, sp, #360 ; 0x168 + 1f1900c: e28d0018 add r0, sp, #24 + 1f19010: e30f234c movw r2, #62284 ; 0xf34c + 1f19014: e34021f5 movt r2, #501 ; 0x1f5 + 1f19018: e1a01004 mov r1, r4 + 1f1901c: ebffdbfd bl 1f10018 + 1f19020: e3500000 cmp r0, #0 + 1f19024: 1a00004a bne 1f19154 + 1f19028: e3015478 movw r5, #5240 ; 0x1478 + 1f1902c: e0257695 mla r5, r5, r6, r7 + 1f19030: e1d532da ldrsb r3, [r5, #42] ; 0x2a + 1f19034: e3530000 cmp r3, #0 + 1f19038: 0a000045 beq 1f19154 + 1f1903c: e5d5301c ldrb r3, [r5, #28] + 1f19040: e3130010 tst r3, #16 + 1f19044: 0a000051 beq 1f19190 + 1f19048: e1a01004 mov r1, r4 + 1f1904c: e28d0018 add r0, sp, #24 + 1f19050: ebffdb8e bl 1f0fe90 + 1f19054: e5d5301c ldrb r3, [r5, #28] + 1f19058: e3130010 tst r3, #16 + 1f1905c: 1afffff9 bne 1f19048 + 1f19060: e3500000 cmp r0, #0 + 1f19064: 0a000046 beq 1f19184 + 1f19068: e28d1068 add r1, sp, #104 ; 0x68 + 1f1906c: e30f03d0 movw r0, #62416 ; 0xf3d0 + 1f19070: e34001f5 movt r0, #501 ; 0x1f5 + 1f19074: eb009834 bl 1f3f14c + 1f19078: e3a02000 mov r2, #0 + 1f1907c: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f19080: e34031f5 movt r3, #501 ; 0x1f5 + 1f19084: e58d2004 str r2, [sp, #4] + 1f19088: e30f1320 movw r1, #62240 ; 0xf320 + 1f1908c: e34011f5 movt r1, #501 ; 0x1f5 + 1f19090: e58d2000 str r2, [sp] + 1f19094: e30a0320 movw r0, #41760 ; 0xa320 + 1f19098: e340020d movt r0, #525 ; 0x20d + 1f1909c: e3a0203e mov r2, #62 ; 0x3e + 1f190a0: eb009aa0 bl 1f3fb28 + 1f190a4: e28ddf9a add sp, sp, #616 ; 0x268 + 1f190a8: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f190ac: e30f1254 movw r1, #62036 ; 0xf254 + 1f190b0: e34011f5 movt r1, #501 ; 0x1f5 + 1f190b4: e28d0010 add r0, sp, #16 + 1f190b8: eb009ad4 bl 1f3fc10 + 1f190bc: eaffff79 b 1f18ea8 + 1f190c0: e2855001 add r5, r5, #1 + 1f190c4: eaffff8b b 1f18ef8 + 1f190c8: e3a08032 mov r8, #50 ; 0x32 + 1f190cc: e3a0c001 mov ip, #1 + 1f190d0: eaffffaf b 1f18f94 + 1f190d4: e3a0103d mov r1, #61 ; 0x3d + 1f190d8: e1a00004 mov r0, r4 + 1f190dc: eb009aec bl 1f3fc94 + 1f190e0: e2503000 subs r3, r0, #0 + 1f190e4: 1affff9a bne 1f18f54 + 1f190e8: e1a00004 mov r0, r4 + 1f190ec: e3a0102c mov r1, #44 ; 0x2c + 1f190f0: eb009ae7 bl 1f3fc94 + 1f190f4: e2503000 subs r3, r0, #0 + 1f190f8: 05cd3010 strbeq r3, [sp, #16] + 1f190fc: 01dd00d8 ldrsbeq r0, [sp, #8] + 1f19100: 0affff98 beq 1f18f68 + 1f19104: eaffff92 b 1f18f54 + 1f19108: e3013478 movw r3, #5240 ; 0x1478 + 1f1910c: e3a05001 mov r5, #1 + 1f19110: e3a0200a mov r2, #10 + 1f19114: e28d1068 add r1, sp, #104 ; 0x68 + 1f19118: e0060693 mul r6, r3, r6 + 1f1911c: e0874006 add r4, r7, r6 + 1f19120: e2860e13 add r0, r6, #304 ; 0x130 + 1f19124: e0870000 add r0, r7, r0 + 1f19128: e5c45378 strb r5, [r4, #888] ; 0x378 + 1f1912c: ebffcef8 bl 1f0cd14 + 1f19130: e3500000 cmp r0, #0 + 1f19134: 1affffda bne 1f190a4 + 1f19138: e2861010 add r1, r6, #16 + 1f1913c: e584037c str r0, [r4, #892] ; 0x37c + 1f19140: e5c45384 strb r5, [r4, #900] ; 0x384 + 1f19144: e0871001 add r1, r7, r1 + 1f19148: e28d0068 add r0, sp, #104 ; 0x68 + 1f1914c: ebffdc28 bl 1f101f4 + 1f19150: eaffffd3 b 1f190a4 + 1f19154: e3a02000 mov r2, #0 + 1f19158: e30f32f0 movw r3, #62192 ; 0xf2f0 + 1f1915c: e34031f5 movt r3, #501 ; 0x1f5 + 1f19160: e58d2004 str r2, [sp, #4] + 1f19164: e30f1320 movw r1, #62240 ; 0xf320 + 1f19168: e34011f5 movt r1, #501 ; 0x1f5 + 1f1916c: e58d2000 str r2, [sp] + 1f19170: e30a0320 movw r0, #41760 ; 0xa320 + 1f19174: e340020d movt r0, #525 ; 0x20d + 1f19178: e3a0203e mov r2, #62 ; 0x3e + 1f1917c: eb009a69 bl 1f3fb28 + 1f19180: eaffffb8 b 1f19068 + 1f19184: e1d532da ldrsb r3, [r5, #42] ; 0x2a + 1f19188: e3530000 cmp r3, #0 + 1f1918c: 0affffb5 beq 1f19068 + 1f19190: e3013478 movw r3, #5240 ; 0x1478 + 1f19194: e1a02008 mov r2, r8 + 1f19198: e0060693 mul r6, r3, r6 + 1f1919c: e0871006 add r1, r7, r6 + 1f191a0: e2860e13 add r0, r6, #304 ; 0x130 + 1f191a4: e281102a add r1, r1, #42 ; 0x2a + 1f191a8: e0870000 add r0, r7, r0 + 1f191ac: ebffced8 bl 1f0cd14 + 1f191b0: e3500000 cmp r0, #0 + 1f191b4: 00876006 addeq r6, r7, r6 + 1f191b8: 03a03001 moveq r3, #1 + 1f191bc: 05c63384 strbeq r3, [r6, #900] ; 0x384 + 1f191c0: eaffffb7 b 1f190a4 + 1f191c4: e3a0103d mov r1, #61 ; 0x3d + 1f191c8: e1a00004 mov r0, r4 + 1f191cc: eb009ab0 bl 1f3fc94 + 1f191d0: e3500000 cmp r0, #0 + 1f191d4: 1affff53 bne 1f18f28 + 1f191d8: e1a00004 mov r0, r4 + 1f191dc: e3a0102c mov r1, #44 ; 0x2c + 1f191e0: eb009aab bl 1f3fc94 + 1f191e4: e3500000 cmp r0, #0 + 1f191e8: 05cd0008 strbeq r0, [sp, #8] + 1f191ec: 0affff5d beq 1f18f68 + 1f191f0: eaffff4c b 1f18f28 + 1f191f4: e28d0068 add r0, sp, #104 ; 0x68 + 1f191f8: eb009bc4 bl 1f40110 + 1f191fc: e350000f cmp r0, #15 + 1f19200: c3a0302a movgt r3, #42 ; 0x2a + 1f19204: c5cd3177 strbgt r3, [sp, #375] ; 0x177 + 1f19208: eaffff7e b 1f19008 + +01f1920c : + 1f1920c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f19210: e1a04000 mov r4, r0 + 1f19214: e5d03001 ldrb r3, [r0, #1] + 1f19218: e24dd00c sub sp, sp, #12 + 1f1921c: e203200f and r2, r3, #15 + 1f19220: e352000f cmp r2, #15 + 1f19224: 0a00001e beq 1f192a4 + 1f19228: e20330f0 and r3, r3, #240 ; 0xf0 + 1f1922c: e35300f0 cmp r3, #240 ; 0xf0 + 1f19230: 0a00001b beq 1f192a4 + 1f19234: ebffff09 bl 1f18e60 + 1f19238: e5d48004 ldrb r8, [r4, #4] + 1f1923c: e3013478 movw r3, #5240 ; 0x1478 + 1f19240: e0080893 mul r8, r3, r8 + 1f19244: e0847008 add r7, r4, r8 + 1f19248: e5d73384 ldrb r3, [r7, #900] ; 0x384 + 1f1924c: e3530000 cmp r3, #0 + 1f19250: 0a000041 beq 1f1935c + 1f19254: e5d73378 ldrb r3, [r7, #888] ; 0x378 + 1f19258: e3530000 cmp r3, #0 + 1f1925c: 0a00003e beq 1f1935c + 1f19260: e30a52d7 movw r5, #41687 ; 0xa2d7 + 1f19264: e340520d movt r5, #525 ; 0x20d + 1f19268: e30a62d6 movw r6, #41686 ; 0xa2d6 + 1f1926c: e340620d movt r6, #525 ; 0x20d + 1f19270: e3a09000 mov r9, #0 + 1f19274: e5cd9003 strb r9, [sp, #3] + 1f19278: ebffebef bl 1f1423c + 1f1927c: e5d42005 ldrb r2, [r4, #5] + 1f19280: e5d53000 ldrb r3, [r5] + 1f19284: e3520002 cmp r2, #2 + 1f19288: 0a000074 beq 1f19460 + 1f1928c: e3530000 cmp r3, #0 + 1f19290: 0a000057 beq 1f193f4 + 1f19294: e3a03001 mov r3, #1 + 1f19298: e5c43005 strb r3, [r4, #5] + 1f1929c: e28dd00c add sp, sp, #12 + 1f192a0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f192a4: e2847a13 add r7, r4, #77824 ; 0x13000 + 1f192a8: e5d7368c ldrb r3, [r7, #1676] ; 0x68c + 1f192ac: e3530000 cmp r3, #0 + 1f192b0: 0a000008 beq 1f192d8 + 1f192b4: e5d73680 ldrb r3, [r7, #1664] ; 0x680 + 1f192b8: e2875e43 add r5, r7, #1072 ; 0x430 + 1f192bc: e3530000 cmp r3, #0 + 1f192c0: 02855008 addeq r5, r5, #8 + 1f192c4: 1a00006a bne 1f19474 + 1f192c8: e1a00005 mov r0, r5 + 1f192cc: ebffd6b5 bl 1f0eda8 + 1f192d0: e3a03000 mov r3, #0 + 1f192d4: e5c7368c strb r3, [r7, #1676] ; 0x68c + 1f192d8: e3a03000 mov r3, #0 + 1f192dc: e30a52d7 movw r5, #41687 ; 0xa2d7 + 1f192e0: e340520d movt r5, #525 ; 0x20d + 1f192e4: e30a62d6 movw r6, #41686 ; 0xa2d6 + 1f192e8: e340620d movt r6, #525 ; 0x20d + 1f192ec: e5873684 str r3, [r7, #1668] ; 0x684 + 1f192f0: e1a08003 mov r8, r3 + 1f192f4: e5873688 str r3, [r7, #1672] ; 0x688 + 1f192f8: e5cd8004 strb r8, [sp, #4] + 1f192fc: ebffebce bl 1f1423c + 1f19300: e5d42005 ldrb r2, [r4, #5] + 1f19304: e5d53000 ldrb r3, [r5] + 1f19308: e3520002 cmp r2, #2 + 1f1930c: 0a000028 beq 1f193b4 + 1f19310: e3530000 cmp r3, #0 + 1f19314: 0a000012 beq 1f19364 + 1f19318: e3a03001 mov r3, #1 + 1f1931c: e5c43005 strb r3, [r4, #5] + 1f19320: e5973684 ldr r3, [r7, #1668] ; 0x684 + 1f19324: e3530001 cmp r3, #1 + 1f19328: 9a000028 bls 1f193d0 + 1f1932c: e2432001 sub r2, r3, #1 + 1f19330: e0871002 add r1, r7, r2 + 1f19334: e5d1168d ldrb r1, [r1, #1677] ; 0x68d + 1f19338: e351000d cmp r1, #13 + 1f1933c: 0a000029 beq 1f193e8 + 1f19340: e2432002 sub r2, r3, #2 + 1f19344: e0871002 add r1, r7, r2 + 1f19348: e5d1168d ldrb r1, [r1, #1677] ; 0x68d + 1f1934c: e351000d cmp r1, #13 + 1f19350: 0a000024 beq 1f193e8 + 1f19354: e3530a01 cmp r3, #4096 ; 0x1000 + 1f19358: 3a00001c bcc 1f193d0 + 1f1935c: e28dd00c add sp, sp, #12 + 1f19360: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f19364: e5d63000 ldrb r3, [r6] + 1f19368: e3530000 cmp r3, #0 + 1f1936c: 1affffe2 bne 1f192fc + 1f19370: e28d1004 add r1, sp, #4 + 1f19374: e1a00004 mov r0, r4 + 1f19378: ebfff05d bl 1f154f4 + 1f1937c: e3500000 cmp r0, #0 + 1f19380: 1affffe6 bne 1f19320 + 1f19384: e5973684 ldr r3, [r7, #1668] ; 0x684 + 1f19388: e3530a01 cmp r3, #4096 ; 0x1000 + 1f1938c: 30872003 addcc r2, r7, r3 + 1f19390: 32833001 addcc r3, r3, #1 + 1f19394: 35dd1004 ldrbcc r1, [sp, #4] + 1f19398: 35873684 strcc r3, [r7, #1668] ; 0x684 + 1f1939c: 35c2168d strbcc r1, [r2, #1677] ; 0x68d + 1f193a0: e5d43002 ldrb r3, [r4, #2] + 1f193a4: e3130002 tst r3, #2 + 1f193a8: 13833001 orrne r3, r3, #1 + 1f193ac: 15c43002 strbne r3, [r4, #2] + 1f193b0: eaffffd0 b 1f192f8 + 1f193b4: e3530000 cmp r3, #0 + 1f193b8: 1affffe9 bne 1f19364 + 1f193bc: e3a03003 mov r3, #3 + 1f193c0: e5c43005 strb r3, [r4, #5] + 1f193c4: e5973684 ldr r3, [r7, #1668] ; 0x684 + 1f193c8: e3530001 cmp r3, #1 + 1f193cc: 8affffd6 bhi 1f1932c + 1f193d0: e0872003 add r2, r7, r3 + 1f193d4: e3a01000 mov r1, #0 + 1f193d8: e2833001 add r3, r3, #1 + 1f193dc: e5873684 str r3, [r7, #1668] ; 0x684 + 1f193e0: e5c2168d strb r1, [r2, #1677] ; 0x68d + 1f193e4: eaffffdc b 1f1935c + 1f193e8: e5872684 str r2, [r7, #1668] ; 0x684 + 1f193ec: e1a03002 mov r3, r2 + 1f193f0: eaffffd7 b 1f19354 + 1f193f4: e5d63000 ldrb r3, [r6] + 1f193f8: e3530000 cmp r3, #0 + 1f193fc: 1affff9d bne 1f19278 + 1f19400: e28d1003 add r1, sp, #3 + 1f19404: e1a00004 mov r0, r4 + 1f19408: ebfff039 bl 1f154f4 + 1f1940c: e250b000 subs fp, r0, #0 + 1f19410: 1affffd1 bne 1f1935c + 1f19414: e597337c ldr r3, [r7, #892] ; 0x37c + 1f19418: e0842008 add r2, r4, r8 + 1f1941c: e5dd0003 ldrb r0, [sp, #3] + 1f19420: e0871003 add r1, r7, r3 + 1f19424: e2833001 add r3, r3, #1 + 1f19428: e587337c str r3, [r7, #892] ; 0x37c + 1f1942c: e5c10385 strb r0, [r1, #901] ; 0x385 + 1f19430: e592337c ldr r3, [r2, #892] ; 0x37c + 1f19434: e3530a01 cmp r3, #4096 ; 0x1000 + 1f19438: 3affff8d bcc 1f19274 + 1f1943c: e2821fe1 add r1, r2, #900 ; 0x384 + 1f19440: e2880e13 add r0, r8, #304 ; 0x130 + 1f19444: e0840000 add r0, r4, r0 + 1f19448: e2811001 add r1, r1, #1 + 1f1944c: e28d3004 add r3, sp, #4 + 1f19450: e3a02a01 mov r2, #4096 ; 0x1000 + 1f19454: ebffd2c2 bl 1f0df64 + 1f19458: e587b37c str fp, [r7, #892] ; 0x37c + 1f1945c: eaffff83 b 1f19270 + 1f19460: e3530000 cmp r3, #0 + 1f19464: 1affffe2 bne 1f193f4 + 1f19468: e3a03003 mov r3, #3 + 1f1946c: e5c43005 strb r3, [r4, #5] + 1f19470: eaffffb9 b 1f1935c + 1f19474: e2871d1a add r1, r7, #1664 ; 0x680 + 1f19478: e2855008 add r5, r5, #8 + 1f1947c: e281100d add r1, r1, #13 + 1f19480: e1a00005 mov r0, r5 + 1f19484: e28d3004 add r3, sp, #4 + 1f19488: e5972684 ldr r2, [r7, #1668] ; 0x684 + 1f1948c: ebffd2b4 bl 1f0df64 + 1f19490: eaffff8c b 1f192c8 + +01f19494 : + 1f19494: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f19498: e1a04000 mov r4, r0 + 1f1949c: e5d03001 ldrb r3, [r0, #1] + 1f194a0: e24dd00c sub sp, sp, #12 + 1f194a4: e353006f cmp r3, #111 ; 0x6f + 1f194a8: 0a00000b beq 1f194dc + 1f194ac: e2803a13 add r3, r0, #77824 ; 0x13000 + 1f194b0: e5d3368d ldrb r3, [r3, #1677] ; 0x68d + 1f194b4: e3530024 cmp r3, #36 ; 0x24 + 1f194b8: 0a000004 beq 1f194d0 + 1f194bc: ebfffe67 bl 1f18e60 + 1f194c0: e1a00004 mov r0, r4 + 1f194c4: e28dd00c add sp, sp, #12 + 1f194c8: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f194cc: eafffa5f b 1f17e50 + 1f194d0: e28dd00c add sp, sp, #12 + 1f194d4: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f194d8: eafffc7e b 1f186d8 + 1f194dc: e30a0320 movw r0, #41760 ; 0xa320 + 1f194e0: e340020d movt r0, #525 ; 0x20d + 1f194e4: e30a72be movw r7, #41662 ; 0xa2be + 1f194e8: e340720d movt r7, #525 ; 0x20d + 1f194ec: e2409001 sub r9, r0, #1 + 1f194f0: e30a52d7 movw r5, #41687 ; 0xa2d7 + 1f194f4: e340520d movt r5, #525 ; 0x20d + 1f194f8: eb009b04 bl 1f40110 + 1f194fc: e3a0aa03 mov sl, #12288 ; 0x3000 + 1f19500: e343af00 movt sl, #16128 ; 0x3f00 + 1f19504: e30a82f8 movw r8, #41720 ; 0xa2f8 + 1f19508: e340820d movt r8, #525 ; 0x20d + 1f1950c: e30a6305 movw r6, #41733 ; 0xa305 + 1f19510: e340620d movt r6, #525 ; 0x20d + 1f19514: e58d0004 str r0, [sp, #4] + 1f19518: e1f9b0d1 ldrsb fp, [r9, #1]! + 1f1951c: e3a01032 mov r1, #50 ; 0x32 + 1f19520: e59a2004 ldr r2, [sl, #4] + 1f19524: e59a3004 ldr r3, [sl, #4] + 1f19528: e1520003 cmp r2, r3 + 1f1952c: 0afffffc beq 1f19524 + 1f19530: e2511001 subs r1, r1, #1 + 1f19534: 1afffff9 bne 1f19520 + 1f19538: e5d73000 ldrb r3, [r7] + 1f1953c: e3530000 cmp r3, #0 + 1f19540: 1a000022 bne 1f195d0 + 1f19544: ebffeb3c bl 1f1423c + 1f19548: e5d43005 ldrb r3, [r4, #5] + 1f1954c: e5d52000 ldrb r2, [r5] + 1f19550: e3530002 cmp r3, #2 + 1f19554: 0a000017 beq 1f195b8 + 1f19558: e3520000 cmp r2, #0 + 1f1955c: 0a000003 beq 1f19570 + 1f19560: e3a03001 mov r3, #1 + 1f19564: e5c43005 strb r3, [r4, #5] + 1f19568: e28dd00c add sp, sp, #12 + 1f1956c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f19570: e5d63000 ldrb r3, [r6] + 1f19574: e3530000 cmp r3, #0 + 1f19578: 1afffff1 bne 1f19544 + 1f1957c: e59d2004 ldr r2, [sp, #4] + 1f19580: e30a3320 movw r3, #41760 ; 0xa320 + 1f19584: e340320d movt r3, #525 ; 0x20d + 1f19588: e0633009 rsb r3, r3, r9 + 1f1958c: e6ef107b uxtb r1, fp + 1f19590: e062b003 rsb fp, r2, r3 + 1f19594: e1a00004 mov r0, r4 + 1f19598: e16fbf1b clz fp, fp + 1f1959c: e1a0b2ab lsr fp, fp, #5 + 1f195a0: e1a0200b mov r2, fp + 1f195a4: ebffed21 bl 1f14a30 + 1f195a8: e18b0000 orr r0, fp, r0 + 1f195ac: e31000ff tst r0, #255 ; 0xff + 1f195b0: 0affffd8 beq 1f19518 + 1f195b4: eaffffeb b 1f19568 + 1f195b8: e3520000 cmp r2, #0 + 1f195bc: 1affffeb bne 1f19570 + 1f195c0: e3a03003 mov r3, #3 + 1f195c4: e5c43005 strb r3, [r4, #5] + 1f195c8: e28dd00c add sp, sp, #12 + 1f195cc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f195d0: e5d83000 ldrb r3, [r8] + 1f195d4: e30a22be movw r2, #41662 ; 0xa2be + 1f195d8: e340220d movt r2, #525 ; 0x20d + 1f195dc: e3530000 cmp r3, #0 + 1f195e0: e30a3307 movw r3, #41735 ; 0xa307 + 1f195e4: e340320d movt r3, #525 ; 0x20d + 1f195e8: e5c21000 strb r1, [r2] + 1f195ec: e5d33000 ldrb r3, [r3] + 1f195f0: 1a000023 bne 1f19684 + 1f195f4: e3530000 cmp r3, #0 + 1f195f8: 13a02401 movne r2, #16777216 ; 0x1000000 + 1f195fc: 1a000005 bne 1f19618 + 1f19600: e30a3298 movw r3, #41624 ; 0xa298 + 1f19604: e340320d movt r3, #525 ; 0x20d + 1f19608: e5d33000 ldrb r3, [r3] + 1f1960c: e3530000 cmp r3, #0 + 1f19610: 13a02401 movne r2, #16777216 ; 0x1000000 + 1f19614: 03a02000 moveq r2, #0 + 1f19618: e30a32f4 movw r3, #41716 ; 0xa2f4 + 1f1961c: e340320d movt r3, #525 ; 0x20d + 1f19620: e3a00000 mov r0, #0 + 1f19624: e3430f20 movt r0, #16160 ; 0x3f20 + 1f19628: e5931000 ldr r1, [r3] + 1f1962c: e3a03000 mov r3, #0 + 1f19630: e3c11612 bic r1, r1, #18874368 ; 0x1200000 + 1f19634: e1812002 orr r2, r1, r2 + 1f19638: e5802004 str r2, [r0, #4] + 1f1963c: e1a02003 mov r2, r3 + 1f19640: e30a131d movw r1, #41757 ; 0xa31d + 1f19644: e340120d movt r1, #525 ; 0x20d + 1f19648: e5d11000 ldrb r1, [r1] + 1f1964c: e3510000 cmp r1, #0 + 1f19650: e30a1306 movw r1, #41734 ; 0xa306 + 1f19654: e340120d movt r1, #525 ; 0x20d + 1f19658: 13822801 orrne r2, r2, #65536 ; 0x10000 + 1f1965c: 03833801 orreq r3, r3, #65536 ; 0x10000 + 1f19660: e5d11000 ldrb r1, [r1] + 1f19664: e3510000 cmp r1, #0 + 1f19668: e3a01000 mov r1, #0 + 1f1966c: e3431f20 movt r1, #16160 ; 0x3f20 + 1f19670: 13822a02 orrne r2, r2, #8192 ; 0x2000 + 1f19674: 03833a02 orreq r3, r3, #8192 ; 0x2000 + 1f19678: e581201c str r2, [r1, #28] + 1f1967c: e5813028 str r3, [r1, #40] ; 0x28 + 1f19680: eaffffaf b 1f19544 + 1f19684: e3530000 cmp r3, #0 + 1f19688: 13a03802 movne r3, #131072 ; 0x20000 + 1f1968c: 13a02701 movne r2, #262144 ; 0x40000 + 1f19690: 1affffea bne 1f19640 + 1f19694: e30a3298 movw r3, #41624 ; 0xa298 + 1f19698: e340320d movt r3, #525 ; 0x20d + 1f1969c: e5d33000 ldrb r3, [r3] + 1f196a0: e3530000 cmp r3, #0 + 1f196a4: 03a03806 moveq r3, #393216 ; 0x60000 + 1f196a8: 13a03802 movne r3, #131072 ; 0x20000 + 1f196ac: 03a02000 moveq r2, #0 + 1f196b0: 13a02701 movne r2, #262144 ; 0x40000 + 1f196b4: eaffffe1 b 1f19640 + +01f196b8 : + 1f196b8: e92d4070 push {r4, r5, r6, lr} + 1f196bc: e30a52bd movw r5, #41661 ; 0xa2bd + 1f196c0: e340520d movt r5, #525 ; 0x20d + 1f196c4: e5d52000 ldrb r2, [r5] + 1f196c8: e3520000 cmp r2, #0 + 1f196cc: 0a000017 beq 1f19730 + 1f196d0: e3a04a03 mov r4, #12288 ; 0x3000 + 1f196d4: e3434f00 movt r4, #16128 ; 0x3f00 + 1f196d8: ebffead7 bl 1f1423c + 1f196dc: e3a01064 mov r1, #100 ; 0x64 + 1f196e0: e5942004 ldr r2, [r4, #4] + 1f196e4: e5943004 ldr r3, [r4, #4] + 1f196e8: e1530002 cmp r3, r2 + 1f196ec: 0afffffc beq 1f196e4 + 1f196f0: e2511001 subs r1, r1, #1 + 1f196f4: 1afffff9 bne 1f196e0 + 1f196f8: e5d53000 ldrb r3, [r5] + 1f196fc: e3530000 cmp r3, #0 + 1f19700: 1afffff4 bne 1f196d8 + 1f19704: e3a02a03 mov r2, #12288 ; 0x3000 + 1f19708: e3432f00 movt r2, #16128 ; 0x3f00 + 1f1970c: e3a00014 mov r0, #20 + 1f19710: e5921004 ldr r1, [r2, #4] + 1f19714: e5923004 ldr r3, [r2, #4] + 1f19718: e1510003 cmp r1, r3 + 1f1971c: 0afffffc beq 1f19714 + 1f19720: e2500001 subs r0, r0, #1 + 1f19724: 1afffff9 bne 1f19710 + 1f19728: e3a00007 mov r0, #7 + 1f1972c: e8bd8070 pop {r4, r5, r6, pc} + 1f19730: e5d03005 ldrb r3, [r0, #5] + 1f19734: e1a04000 mov r4, r0 + 1f19738: e5c02000 strb r2, [r0] + 1f1973c: e3530004 cmp r3, #4 + 1f19740: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f19744: ea000004 b 1f1975c + 1f19748: 01f19a78 .word 0x01f19a78 + 1f1974c: 01f199f4 .word 0x01f199f4 + 1f19750: 01f19898 .word 0x01f19898 + 1f19754: 01f19808 .word 0x01f19808 + 1f19758: 01f19764 .word 0x01f19764 + 1f1975c: e3a00000 mov r0, #0 + 1f19760: e8bd8070 pop {r4, r5, r6, pc} + 1f19764: e30a32be movw r3, #41662 ; 0xa2be + 1f19768: e340320d movt r3, #525 ; 0x20d + 1f1976c: e5d32000 ldrb r2, [r3] + 1f19770: e3520000 cmp r2, #0 + 1f19774: 0a000002 beq 1f19784 + 1f19778: e3a02000 mov r2, #0 + 1f1977c: e5c32000 strb r2, [r3] + 1f19780: ebffeed1 bl 1f152cc + 1f19784: e30a3298 movw r3, #41624 ; 0xa298 + 1f19788: e340320d movt r3, #525 ; 0x20d + 1f1978c: e5d32000 ldrb r2, [r3] + 1f19790: e3520000 cmp r2, #0 + 1f19794: 0a000002 beq 1f197a4 + 1f19798: e3a02000 mov r2, #0 + 1f1979c: e5c32000 strb r2, [r3] + 1f197a0: ebffeec9 bl 1f152cc + 1f197a4: e5d43002 ldrb r3, [r4, #2] + 1f197a8: e3130001 tst r3, #1 + 1f197ac: 0a00000e beq 1f197ec + 1f197b0: e5d43004 ldrb r3, [r4, #4] + 1f197b4: e353000f cmp r3, #15 + 1f197b8: 0a00000f beq 1f197fc + 1f197bc: e3010478 movw r0, #5240 ; 0x1478 + 1f197c0: e2842a13 add r2, r4, #77824 ; 0x13000 + 1f197c4: e2821d1a add r1, r2, #1664 ; 0x680 + 1f197c8: e0204390 mla r0, r0, r3, r4 + 1f197cc: e281100d add r1, r1, #13 + 1f197d0: e5922684 ldr r2, [r2, #1668] ; 0x684 + 1f197d4: e2800d4e add r0, r0, #4992 ; 0x1380 + 1f197d8: e2800005 add r0, r0, #5 + 1f197dc: eb009587 bl 1f3ee00 + 1f197e0: e5d43002 ldrb r3, [r4, #2] + 1f197e4: e7c0301f bfc r3, #0, #1 + 1f197e8: e5c43002 strb r3, [r4, #2] + 1f197ec: e3a03000 mov r3, #0 + 1f197f0: e5d40000 ldrb r0, [r4] + 1f197f4: e5c43005 strb r3, [r4, #5] + 1f197f8: e8bd8070 pop {r4, r5, r6, pc} + 1f197fc: e1a00004 mov r0, r4 + 1f19800: ebfff852 bl 1f17950 + 1f19804: eafffff5 b 1f197e0 + 1f19808: e30a52d7 movw r5, #41687 ; 0xa2d7 + 1f1980c: e340520d movt r5, #525 ; 0x20d + 1f19810: e5d53000 ldrb r3, [r5] + 1f19814: e3530000 cmp r3, #0 + 1f19818: 0a000003 beq 1f1982c + 1f1981c: ebffea86 bl 1f1423c + 1f19820: e5d53000 ldrb r3, [r5] + 1f19824: e3530000 cmp r3, #0 + 1f19828: 1afffffb bne 1f1981c + 1f1982c: e5d43006 ldrb r3, [r4, #6] + 1f19830: e3530001 cmp r3, #1 + 1f19834: 0a000099 beq 1f19aa0 + 1f19838: e3530002 cmp r3, #2 + 1f1983c: 1a000011 bne 1f19888 + 1f19840: e30a3298 movw r3, #41624 ; 0xa298 + 1f19844: e340320d movt r3, #525 ; 0x20d + 1f19848: e5d32000 ldrb r2, [r3] + 1f1984c: e3520000 cmp r2, #0 + 1f19850: 0a000002 beq 1f19860 + 1f19854: e3a02000 mov r2, #0 + 1f19858: e5c32000 strb r2, [r3] + 1f1985c: ebffee9a bl 1f152cc + 1f19860: e30a32be movw r3, #41662 ; 0xa2be + 1f19864: e340320d movt r3, #525 ; 0x20d + 1f19868: e5d32000 ldrb r2, [r3] + 1f1986c: e3520000 cmp r2, #0 + 1f19870: 1a000002 bne 1f19880 + 1f19874: e3a02001 mov r2, #1 + 1f19878: e5c32000 strb r2, [r3] + 1f1987c: ebffee92 bl 1f152cc + 1f19880: e1a00004 mov r0, r4 + 1f19884: ebffff02 bl 1f19494 + 1f19888: e3a03004 mov r3, #4 + 1f1988c: e5d40000 ldrb r0, [r4] + 1f19890: e5c43005 strb r3, [r4, #5] + 1f19894: e8bd8070 pop {r4, r5, r6, pc} + 1f19898: e2801001 add r1, r0, #1 + 1f1989c: ebfff27b bl 1f16290 + 1f198a0: e5d42003 ldrb r2, [r4, #3] + 1f198a4: e5d43001 ldrb r3, [r4, #1] + 1f198a8: e2821020 add r1, r2, #32 + 1f198ac: e1530001 cmp r3, r1 + 1f198b0: 0a00002c beq 1f19968 + 1f198b4: e353003f cmp r3, #63 ; 0x3f + 1f198b8: 0a000043 beq 1f199cc + 1f198bc: e2822040 add r2, r2, #64 ; 0x40 + 1f198c0: e1530002 cmp r3, r2 + 1f198c4: 0a000034 beq 1f1999c + 1f198c8: e353005f cmp r3, #95 ; 0x5f + 1f198cc: 0a000044 beq 1f199e4 + 1f198d0: e2032060 and r2, r3, #96 ; 0x60 + 1f198d4: e3520060 cmp r2, #96 ; 0x60 + 1f198d8: 0a000019 beq 1f19944 + 1f198dc: e30a32be movw r3, #41662 ; 0xa2be + 1f198e0: e340320d movt r3, #525 ; 0x20d + 1f198e4: e5d32000 ldrb r2, [r3] + 1f198e8: e3520000 cmp r2, #0 + 1f198ec: 0a000002 beq 1f198fc + 1f198f0: e3a02000 mov r2, #0 + 1f198f4: e5c32000 strb r2, [r3] + 1f198f8: ebffee73 bl 1f152cc + 1f198fc: e30a3298 movw r3, #41624 ; 0xa298 + 1f19900: e340320d movt r3, #525 ; 0x20d + 1f19904: e5d32000 ldrb r2, [r3] + 1f19908: e3520000 cmp r2, #0 + 1f1990c: 0a000002 beq 1f1991c + 1f19910: e3a02000 mov r2, #0 + 1f19914: e5c32000 strb r2, [r3] + 1f19918: ebffee6b bl 1f152cc + 1f1991c: e30a52d7 movw r5, #41687 ; 0xa2d7 + 1f19920: e340520d movt r5, #525 ; 0x20d + 1f19924: e5d53000 ldrb r3, [r5] + 1f19928: e3530000 cmp r3, #0 + 1f1992c: 0affffd5 beq 1f19888 + 1f19930: ebffea41 bl 1f1423c + 1f19934: e5d53000 ldrb r3, [r5] + 1f19938: e3530000 cmp r3, #0 + 1f1993c: 1afffffb bne 1f19930 + 1f19940: eaffffd0 b 1f19888 + 1f19944: e20320f0 and r2, r3, #240 ; 0xf0 + 1f19948: e203300f and r3, r3, #15 + 1f1994c: e35200e0 cmp r2, #224 ; 0xe0 + 1f19950: e5c43004 strb r3, [r4, #4] + 1f19954: 0a000054 beq 1f19aac + 1f19958: e3a03003 mov r3, #3 + 1f1995c: e5d40000 ldrb r0, [r4] + 1f19960: e5c43005 strb r3, [r4, #5] + 1f19964: e8bd8070 pop {r4, r5, r6, pc} + 1f19968: e30a22d7 movw r2, #41687 ; 0xa2d7 + 1f1996c: e340220d movt r2, #525 ; 0x20d + 1f19970: e203300f and r3, r3, #15 + 1f19974: e5c43004 strb r3, [r4, #4] + 1f19978: e3a01001 mov r1, #1 + 1f1997c: e5c41006 strb r1, [r4, #6] + 1f19980: e5d23000 ldrb r3, [r2] + 1f19984: e3530000 cmp r3, #0 + 1f19988: 0afffff2 beq 1f19958 + 1f1998c: e3a03002 mov r3, #2 + 1f19990: e5d40000 ldrb r0, [r4] + 1f19994: e5c43005 strb r3, [r4, #5] + 1f19998: e8bd8070 pop {r4, r5, r6, pc} + 1f1999c: e30a22d7 movw r2, #41687 ; 0xa2d7 + 1f199a0: e340220d movt r2, #525 ; 0x20d + 1f199a4: e203300f and r3, r3, #15 + 1f199a8: e5c43004 strb r3, [r4, #4] + 1f199ac: e3a01002 mov r1, #2 + 1f199b0: e5c41006 strb r1, [r4, #6] + 1f199b4: e5d23000 ldrb r3, [r2] + 1f199b8: e3530000 cmp r3, #0 + 1f199bc: 0affffe5 beq 1f19958 + 1f199c0: e5c41005 strb r1, [r4, #5] + 1f199c4: e5d40000 ldrb r0, [r4] + 1f199c8: e8bd8070 pop {r4, r5, r6, pc} + 1f199cc: e5d43006 ldrb r3, [r4, #6] + 1f199d0: e3530001 cmp r3, #1 + 1f199d4: 1affffdf bne 1f19958 + 1f199d8: e3a03000 mov r3, #0 + 1f199dc: e5c43006 strb r3, [r4, #6] + 1f199e0: eaffffdc b 1f19958 + 1f199e4: e5d43006 ldrb r3, [r4, #6] + 1f199e8: e3530002 cmp r3, #2 + 1f199ec: 1affffd9 bne 1f19958 + 1f199f0: eafffff8 b 1f199d8 + 1f199f4: e30a32be movw r3, #41662 ; 0xa2be + 1f199f8: e340320d movt r3, #525 ; 0x20d + 1f199fc: e5d32000 ldrb r2, [r3] + 1f19a00: e3520000 cmp r2, #0 + 1f19a04: 0a000002 beq 1f19a14 + 1f19a08: e3a02000 mov r2, #0 + 1f19a0c: e5c32000 strb r2, [r3] + 1f19a10: ebffee2d bl 1f152cc + 1f19a14: e30a3298 movw r3, #41624 ; 0xa298 + 1f19a18: e340320d movt r3, #525 ; 0x20d + 1f19a1c: e5d32000 ldrb r2, [r3] + 1f19a20: e3520000 cmp r2, #0 + 1f19a24: 1a000002 bne 1f19a34 + 1f19a28: e3a02001 mov r2, #1 + 1f19a2c: e5c32000 strb r2, [r3] + 1f19a30: ebffee25 bl 1f152cc + 1f19a34: e30a52d6 movw r5, #41686 ; 0xa2d6 + 1f19a38: e340520d movt r5, #525 ; 0x20d + 1f19a3c: e3a02000 mov r2, #0 + 1f19a40: e5d43002 ldrb r3, [r4, #2] + 1f19a44: e3a00002 mov r0, #2 + 1f19a48: e5c42006 strb r2, [r4, #6] + 1f19a4c: e5d51000 ldrb r1, [r5] + 1f19a50: e7c13092 bfi r3, r2, #1, #1 + 1f19a54: e5c40005 strb r0, [r4, #5] + 1f19a58: e1510002 cmp r1, r2 + 1f19a5c: e5c43002 strb r3, [r4, #2] + 1f19a60: 1affffd7 bne 1f199c4 + 1f19a64: ebffe9f4 bl 1f1423c + 1f19a68: e5d53000 ldrb r3, [r5] + 1f19a6c: e3530000 cmp r3, #0 + 1f19a70: 0afffffb beq 1f19a64 + 1f19a74: eaffffd2 b 1f199c4 + 1f19a78: ebffe9ef bl 1f1423c + 1f19a7c: e30a32d7 movw r3, #41687 ; 0xa2d7 + 1f19a80: e340320d movt r3, #525 ; 0x20d + 1f19a84: e5d33000 ldrb r3, [r3] + 1f19a88: e3530000 cmp r3, #0 + 1f19a8c: 0a000010 beq 1f19ad4 + 1f19a90: e3a03001 mov r3, #1 + 1f19a94: e5d40000 ldrb r0, [r4] + 1f19a98: e5c43005 strb r3, [r4, #5] + 1f19a9c: e8bd8070 pop {r4, r5, r6, pc} + 1f19aa0: e1a00004 mov r0, r4 + 1f19aa4: ebfffdd8 bl 1f1920c + 1f19aa8: eaffff76 b 1f19888 + 1f19aac: e3012478 movw r2, #5240 ; 0x1478 + 1f19ab0: e0204392 mla r0, r2, r3, r4 + 1f19ab4: e2800010 add r0, r0, #16 + 1f19ab8: ebfff0d3 bl 1f15e0c + 1f19abc: e30a32d7 movw r3, #41687 ; 0xa2d7 + 1f19ac0: e340320d movt r3, #525 ; 0x20d + 1f19ac4: e5d33000 ldrb r3, [r3] + 1f19ac8: e3530000 cmp r3, #0 + 1f19acc: 0affffa1 beq 1f19958 + 1f19ad0: eaffffad b 1f1998c + 1f19ad4: e2843b51 add r3, r4, #82944 ; 0x14400 + 1f19ad8: e2833e39 add r3, r3, #912 ; 0x390 + 1f19adc: e1d330d0 ldrsb r3, [r3] + 1f19ae0: e3530000 cmp r3, #0 + 1f19ae4: 0affffb6 beq 1f199c4 + 1f19ae8: e3a00001 mov r0, #1 + 1f19aec: e5c40000 strb r0, [r4] + 1f19af0: e8bd8070 pop {r4, r5, r6, pc} + +01f19af4 : + 1f19af4: e92d4070 push {r4, r5, r6, lr} + 1f19af8: e1a05001 mov r5, r1 + 1f19afc: e3011478 movw r1, #5240 ; 0x1478 + 1f19b00: e24dd008 sub sp, sp, #8 + 1f19b04: e1a06000 mov r6, r0 + 1f19b08: e0010591 mul r1, r1, r5 + 1f19b0c: e0803001 add r3, r0, r1 + 1f19b10: e5d32384 ldrb r2, [r3, #900] ; 0x384 + 1f19b14: e3520000 cmp r2, #0 + 1f19b18: 0a00000a beq 1f19b48 + 1f19b1c: e5d32378 ldrb r2, [r3, #888] ; 0x378 + 1f19b20: e3520000 cmp r2, #0 + 1f19b24: 1a00000e bne 1f19b64 + 1f19b28: e2811e13 add r1, r1, #304 ; 0x130 + 1f19b2c: e0804001 add r4, r0, r1 + 1f19b30: e1a00004 mov r0, r4 + 1f19b34: ebffd49b bl 1f0eda8 + 1f19b38: e3013478 movw r3, #5240 ; 0x1478 + 1f19b3c: e3a02000 mov r2, #0 + 1f19b40: e0236593 mla r3, r3, r5, r6 + 1f19b44: e5c32384 strb r2, [r3, #900] ; 0x384 + 1f19b48: e3012478 movw r2, #5240 ; 0x1478 + 1f19b4c: e3a03000 mov r3, #0 + 1f19b50: e0256592 mla r5, r2, r5, r6 + 1f19b54: e585337c str r3, [r5, #892] ; 0x37c + 1f19b58: e5853380 str r3, [r5, #896] ; 0x380 + 1f19b5c: e28dd008 add sp, sp, #8 + 1f19b60: e8bd8070 pop {r4, r5, r6, pc} + 1f19b64: e2814e13 add r4, r1, #304 ; 0x130 + 1f19b68: e0801001 add r1, r0, r1 + 1f19b6c: e0804004 add r4, r0, r4 + 1f19b70: e2811fe1 add r1, r1, #900 ; 0x384 + 1f19b74: e593237c ldr r2, [r3, #892] ; 0x37c + 1f19b78: e2811001 add r1, r1, #1 + 1f19b7c: e1a00004 mov r0, r4 + 1f19b80: e28d3004 add r3, sp, #4 + 1f19b84: ebffd0f6 bl 1f0df64 + 1f19b88: eaffffe8 b 1f19b30 + +01f19b8c : + 1f19b8c: e5d03009 ldrb r3, [r0, #9] + 1f19b90: e1d020b4 ldrh r2, [r0, #4] + 1f19b94: e0132002 ands r2, r3, r2 + 1f19b98: 1a000005 bne 1f19bb4 + 1f19b9c: e5d0300c ldrb r3, [r0, #12] + 1f19ba0: e3833002 orr r3, r3, #2 + 1f19ba4: e203307e and r3, r3, #126 ; 0x7e + 1f19ba8: e5c02009 strb r2, [r0, #9] + 1f19bac: e5c0300c strb r3, [r0, #12] + 1f19bb0: e12fff1e bx lr + 1f19bb4: e5d0300c ldrb r3, [r0, #12] + 1f19bb8: e3120080 tst r2, #128 ; 0x80 + 1f19bbc: e20330fd and r3, r3, #253 ; 0xfd + 1f19bc0: 0afffff7 beq 1f19ba4 + 1f19bc4: e1e03003 mvn r3, r3 + 1f19bc8: e5c02009 strb r2, [r0, #9] + 1f19bcc: e203307e and r3, r3, #126 ; 0x7e + 1f19bd0: e1e03003 mvn r3, r3 + 1f19bd4: e5c0300c strb r3, [r0, #12] + 1f19bd8: e12fff1e bx lr + +01f19bdc : + 1f19bdc: e5d03009 ldrb r3, [r0, #9] + 1f19be0: e1d020b4 ldrh r2, [r0, #4] + 1f19be4: e0132002 ands r2, r3, r2 + 1f19be8: 1a000005 bne 1f19c04 + 1f19bec: e5d0300c ldrb r3, [r0, #12] + 1f19bf0: e3833002 orr r3, r3, #2 + 1f19bf4: e203307f and r3, r3, #127 ; 0x7f + 1f19bf8: e5c0300c strb r3, [r0, #12] + 1f19bfc: e5c02009 strb r2, [r0, #9] + 1f19c00: e12fff1e bx lr + 1f19c04: e5d0300c ldrb r3, [r0, #12] + 1f19c08: e3120080 tst r2, #128 ; 0x80 + 1f19c0c: e20330fd and r3, r3, #253 ; 0xfd + 1f19c10: e5c0300c strb r3, [r0, #12] + 1f19c14: 13833080 orrne r3, r3, #128 ; 0x80 + 1f19c18: 1afffff6 bne 1f19bf8 + 1f19c1c: eafffff4 b 1f19bf4 + +01f19c20 : + 1f19c20: e1d030b4 ldrh r3, [r0, #4] + 1f19c24: e5d0200c ldrb r2, [r0, #12] + 1f19c28: e590c018 ldr ip, [r0, #24] + 1f19c2c: e1a03083 lsl r3, r3, #1 + 1f19c30: e6ff3073 uxth r3, r3 + 1f19c34: e3130cff tst r3, #65280 ; 0xff00 + 1f19c38: 13822001 orrne r2, r2, #1 + 1f19c3c: 020220fe andeq r2, r2, #254 ; 0xfe + 1f19c40: e21310ff ands r1, r3, #255 ; 0xff + 1f19c44: 03822002 orreq r2, r2, #2 + 1f19c48: 120220fd andne r2, r2, #253 ; 0xfd + 1f19c4c: e3130080 tst r3, #128 ; 0x80 + 1f19c50: 13823080 orrne r3, r2, #128 ; 0x80 + 1f19c54: 0202307f andeq r3, r2, #127 ; 0x7f + 1f19c58: e30d2444 movw r2, #54340 ; 0xd444 + 1f19c5c: e34021f1 movt r2, #497 ; 0x1f1 + 1f19c60: e15c0002 cmp ip, r2 + 1f19c64: e5c0300c strb r3, [r0, #12] + 1f19c68: 0a000002 beq 1f19c78 + 1f19c6c: e5903014 ldr r3, [r0, #20] + 1f19c70: e1d000b0 ldrh r0, [r0] + 1f19c74: e12fff13 bx r3 + 1f19c78: e590301c ldr r3, [r0, #28] + 1f19c7c: e3530000 cmp r3, #0 + 1f19c80: 0a000003 beq 1f19c94 + 1f19c84: e35c0000 cmp ip, #0 + 1f19c88: 1afffff7 bne 1f19c6c + 1f19c8c: e3130001 tst r3, #1 + 1f19c90: 1afffff5 bne 1f19c6c + 1f19c94: e5c01009 strb r1, [r0, #9] + 1f19c98: e12fff1e bx lr + +01f19c9c : + 1f19c9c: e1d020b4 ldrh r2, [r0, #4] + 1f19ca0: e5d03009 ldrb r3, [r0, #9] + 1f19ca4: e1120003 tst r2, r3 + 1f19ca8: e5d0300c ldrb r3, [r0, #12] + 1f19cac: 03833002 orreq r3, r3, #2 + 1f19cb0: 120330fd andne r3, r3, #253 ; 0xfd + 1f19cb4: e3120040 tst r2, #64 ; 0x40 + 1f19cb8: 13833040 orrne r3, r3, #64 ; 0x40 + 1f19cbc: 020330bf andeq r3, r3, #191 ; 0xbf + 1f19cc0: e3120080 tst r2, #128 ; 0x80 + 1f19cc4: 13833080 orrne r3, r3, #128 ; 0x80 + 1f19cc8: 0203307f andeq r3, r3, #127 ; 0x7f + 1f19ccc: e5c0300c strb r3, [r0, #12] + 1f19cd0: e12fff1e bx lr + +01f19cd4 : + 1f19cd4: e12fff1e bx lr + +01f19cd8 : + 1f19cd8: e5d0300c ldrb r3, [r0, #12] + 1f19cdc: e3c33001 bic r3, r3, #1 + 1f19ce0: e5c0300c strb r3, [r0, #12] + 1f19ce4: e12fff1e bx lr + +01f19ce8 : + 1f19ce8: e5d0300c ldrb r3, [r0, #12] + 1f19cec: e3c33008 bic r3, r3, #8 + 1f19cf0: e5c0300c strb r3, [r0, #12] + 1f19cf4: e12fff1e bx lr + +01f19cf8 : + 1f19cf8: e5d0200c ldrb r2, [r0, #12] + 1f19cfc: e5d0300e ldrb r3, [r0, #14] + 1f19d00: e3c22004 bic r2, r2, #4 + 1f19d04: e5c0200c strb r2, [r0, #12] + 1f19d08: e3833001 orr r3, r3, #1 + 1f19d0c: e5c0300e strb r3, [r0, #14] + 1f19d10: e12fff1e bx lr + +01f19d14 : + 1f19d14: e5d0300c ldrb r3, [r0, #12] + 1f19d18: e3c33040 bic r3, r3, #64 ; 0x40 + 1f19d1c: e5c0300c strb r3, [r0, #12] + 1f19d20: e12fff1e bx lr + +01f19d24 : + 1f19d24: e1d030b4 ldrh r3, [r0, #4] + 1f19d28: e5d01009 ldrb r1, [r0, #9] + 1f19d2c: e6efc073 uxtb ip, r3 + 1f19d30: e0633001 rsb r3, r3, r1 + 1f19d34: e151000c cmp r1, ip + 1f19d38: e6ff2073 uxth r2, r3 + 1f19d3c: e5d0300c ldrb r3, [r0, #12] + 1f19d40: 23833001 orrcs r3, r3, #1 + 1f19d44: 320330fe andcc r3, r3, #254 ; 0xfe + 1f19d48: e151000c cmp r1, ip + 1f19d4c: 03833002 orreq r3, r3, #2 + 1f19d50: 120330fd andne r3, r3, #253 ; 0xfd + 1f19d54: e3120080 tst r2, #128 ; 0x80 + 1f19d58: 13833080 orrne r3, r3, #128 ; 0x80 + 1f19d5c: 0203307f andeq r3, r3, #127 ; 0x7f + 1f19d60: e5c0300c strb r3, [r0, #12] + 1f19d64: e12fff1e bx lr + +01f19d68 : + 1f19d68: e1d030b4 ldrh r3, [r0, #4] + 1f19d6c: e5d0100a ldrb r1, [r0, #10] + 1f19d70: e6efc073 uxtb ip, r3 + 1f19d74: e0633001 rsb r3, r3, r1 + 1f19d78: e151000c cmp r1, ip + 1f19d7c: e6ff2073 uxth r2, r3 + 1f19d80: e5d0300c ldrb r3, [r0, #12] + 1f19d84: 23833001 orrcs r3, r3, #1 + 1f19d88: 320330fe andcc r3, r3, #254 ; 0xfe + 1f19d8c: e151000c cmp r1, ip + 1f19d90: 03833002 orreq r3, r3, #2 + 1f19d94: 120330fd andne r3, r3, #253 ; 0xfd + 1f19d98: e3120080 tst r2, #128 ; 0x80 + 1f19d9c: 13833080 orrne r3, r3, #128 ; 0x80 + 1f19da0: 0203307f andeq r3, r3, #127 ; 0x7f + 1f19da4: e5c0300c strb r3, [r0, #12] + 1f19da8: e12fff1e bx lr + +01f19dac : + 1f19dac: e1d030b4 ldrh r3, [r0, #4] + 1f19db0: e5d0100b ldrb r1, [r0, #11] + 1f19db4: e6efc073 uxtb ip, r3 + 1f19db8: e0633001 rsb r3, r3, r1 + 1f19dbc: e151000c cmp r1, ip + 1f19dc0: e6ff2073 uxth r2, r3 + 1f19dc4: e5d0300c ldrb r3, [r0, #12] + 1f19dc8: 23833001 orrcs r3, r3, #1 + 1f19dcc: 320330fe andcc r3, r3, #254 ; 0xfe + 1f19dd0: e151000c cmp r1, ip + 1f19dd4: 03833002 orreq r3, r3, #2 + 1f19dd8: 120330fd andne r3, r3, #253 ; 0xfd + 1f19ddc: e3120080 tst r2, #128 ; 0x80 + 1f19de0: 13833080 orrne r3, r3, #128 ; 0x80 + 1f19de4: 0203307f andeq r3, r3, #127 ; 0x7f + 1f19de8: e5c0300c strb r3, [r0, #12] + 1f19dec: e12fff1e bx lr + +01f19df0 : + 1f19df0: e1d030b4 ldrh r3, [r0, #4] + 1f19df4: e5d0200c ldrb r2, [r0, #12] + 1f19df8: e2433001 sub r3, r3, #1 + 1f19dfc: e590c018 ldr ip, [r0, #24] + 1f19e00: e6ff3073 uxth r3, r3 + 1f19e04: e21310ff ands r1, r3, #255 ; 0xff + 1f19e08: 03822002 orreq r2, r2, #2 + 1f19e0c: 120220fd andne r2, r2, #253 ; 0xfd + 1f19e10: e3130080 tst r3, #128 ; 0x80 + 1f19e14: 13823080 orrne r3, r2, #128 ; 0x80 + 1f19e18: 0202307f andeq r3, r2, #127 ; 0x7f + 1f19e1c: e30d2444 movw r2, #54340 ; 0xd444 + 1f19e20: e34021f1 movt r2, #497 ; 0x1f1 + 1f19e24: e15c0002 cmp ip, r2 + 1f19e28: e5c0300c strb r3, [r0, #12] + 1f19e2c: 0a000002 beq 1f19e3c + 1f19e30: e5903014 ldr r3, [r0, #20] + 1f19e34: e1d000b0 ldrh r0, [r0] + 1f19e38: e12fff13 bx r3 + 1f19e3c: e590301c ldr r3, [r0, #28] + 1f19e40: e3530000 cmp r3, #0 + 1f19e44: 0a000003 beq 1f19e58 + 1f19e48: e35c0000 cmp ip, #0 + 1f19e4c: 1afffff7 bne 1f19e30 + 1f19e50: e3130001 tst r3, #1 + 1f19e54: 1afffff5 bne 1f19e30 + 1f19e58: e5c01009 strb r1, [r0, #9] + 1f19e5c: e12fff1e bx lr + +01f19e60 : + 1f19e60: e5d0300a ldrb r3, [r0, #10] + 1f19e64: e2433001 sub r3, r3, #1 + 1f19e68: e6ef3073 uxtb r3, r3 + 1f19e6c: e5c0300a strb r3, [r0, #10] + 1f19e70: e3530000 cmp r3, #0 + 1f19e74: 1a000004 bne 1f19e8c + 1f19e78: e5d0300c ldrb r3, [r0, #12] + 1f19e7c: e3833002 orr r3, r3, #2 + 1f19e80: e203307f and r3, r3, #127 ; 0x7f + 1f19e84: e5c0300c strb r3, [r0, #12] + 1f19e88: e12fff1e bx lr + 1f19e8c: e3130080 tst r3, #128 ; 0x80 + 1f19e90: e5d0300c ldrb r3, [r0, #12] + 1f19e94: e20330fd and r3, r3, #253 ; 0xfd + 1f19e98: e5c0300c strb r3, [r0, #12] + 1f19e9c: 13833080 orrne r3, r3, #128 ; 0x80 + 1f19ea0: 0afffff6 beq 1f19e80 + 1f19ea4: e5c0300c strb r3, [r0, #12] + 1f19ea8: e12fff1e bx lr + +01f19eac : + 1f19eac: e5d0300b ldrb r3, [r0, #11] + 1f19eb0: e2433001 sub r3, r3, #1 + 1f19eb4: e6ef3073 uxtb r3, r3 + 1f19eb8: e5c0300b strb r3, [r0, #11] + 1f19ebc: e3530000 cmp r3, #0 + 1f19ec0: 1a000004 bne 1f19ed8 + 1f19ec4: e5d0300c ldrb r3, [r0, #12] + 1f19ec8: e3833002 orr r3, r3, #2 + 1f19ecc: e203307f and r3, r3, #127 ; 0x7f + 1f19ed0: e5c0300c strb r3, [r0, #12] + 1f19ed4: e12fff1e bx lr + 1f19ed8: e3130080 tst r3, #128 ; 0x80 + 1f19edc: e5d0300c ldrb r3, [r0, #12] + 1f19ee0: e20330fd and r3, r3, #253 ; 0xfd + 1f19ee4: e5c0300c strb r3, [r0, #12] + 1f19ee8: 13833080 orrne r3, r3, #128 ; 0x80 + 1f19eec: 0afffff6 beq 1f19ecc + 1f19ef0: e5c0300c strb r3, [r0, #12] + 1f19ef4: e12fff1e bx lr + +01f19ef8 : + 1f19ef8: e5d02009 ldrb r2, [r0, #9] + 1f19efc: e1d030b4 ldrh r3, [r0, #4] + 1f19f00: e0233002 eor r3, r3, r2 + 1f19f04: e5d0200c ldrb r2, [r0, #12] + 1f19f08: e31300ff tst r3, #255 ; 0xff + 1f19f0c: e5c03009 strb r3, [r0, #9] + 1f19f10: 03822002 orreq r2, r2, #2 + 1f19f14: 120220fd andne r2, r2, #253 ; 0xfd + 1f19f18: e3130080 tst r3, #128 ; 0x80 + 1f19f1c: 13822080 orrne r2, r2, #128 ; 0x80 + 1f19f20: 0202207f andeq r2, r2, #127 ; 0x7f + 1f19f24: e5c0200c strb r2, [r0, #12] + 1f19f28: e12fff1e bx lr + +01f19f2c : + 1f19f2c: e1d030b4 ldrh r3, [r0, #4] + 1f19f30: e5d0200c ldrb r2, [r0, #12] + 1f19f34: e2833001 add r3, r3, #1 + 1f19f38: e590c018 ldr ip, [r0, #24] + 1f19f3c: e6ff3073 uxth r3, r3 + 1f19f40: e21310ff ands r1, r3, #255 ; 0xff + 1f19f44: 03822002 orreq r2, r2, #2 + 1f19f48: 120220fd andne r2, r2, #253 ; 0xfd + 1f19f4c: e3130080 tst r3, #128 ; 0x80 + 1f19f50: 13823080 orrne r3, r2, #128 ; 0x80 + 1f19f54: 0202307f andeq r3, r2, #127 ; 0x7f + 1f19f58: e30d2444 movw r2, #54340 ; 0xd444 + 1f19f5c: e34021f1 movt r2, #497 ; 0x1f1 + 1f19f60: e15c0002 cmp ip, r2 + 1f19f64: e5c0300c strb r3, [r0, #12] + 1f19f68: 0a000002 beq 1f19f78 + 1f19f6c: e5903014 ldr r3, [r0, #20] + 1f19f70: e1d000b0 ldrh r0, [r0] + 1f19f74: e12fff13 bx r3 + 1f19f78: e590301c ldr r3, [r0, #28] + 1f19f7c: e3530000 cmp r3, #0 + 1f19f80: 0a000003 beq 1f19f94 + 1f19f84: e35c0000 cmp ip, #0 + 1f19f88: 1afffff7 bne 1f19f6c + 1f19f8c: e3130001 tst r3, #1 + 1f19f90: 1afffff5 bne 1f19f6c + 1f19f94: e5c01009 strb r1, [r0, #9] + 1f19f98: e12fff1e bx lr + +01f19f9c : + 1f19f9c: e5d0300a ldrb r3, [r0, #10] + 1f19fa0: e2833001 add r3, r3, #1 + 1f19fa4: e6ef3073 uxtb r3, r3 + 1f19fa8: e5c0300a strb r3, [r0, #10] + 1f19fac: e3530000 cmp r3, #0 + 1f19fb0: 1a000004 bne 1f19fc8 + 1f19fb4: e5d0300c ldrb r3, [r0, #12] + 1f19fb8: e3833002 orr r3, r3, #2 + 1f19fbc: e203307f and r3, r3, #127 ; 0x7f + 1f19fc0: e5c0300c strb r3, [r0, #12] + 1f19fc4: e12fff1e bx lr + 1f19fc8: e3130080 tst r3, #128 ; 0x80 + 1f19fcc: e5d0300c ldrb r3, [r0, #12] + 1f19fd0: e20330fd and r3, r3, #253 ; 0xfd + 1f19fd4: e5c0300c strb r3, [r0, #12] + 1f19fd8: 13833080 orrne r3, r3, #128 ; 0x80 + 1f19fdc: 0afffff6 beq 1f19fbc + 1f19fe0: e5c0300c strb r3, [r0, #12] + 1f19fe4: e12fff1e bx lr + +01f19fe8 : + 1f19fe8: e5d0300b ldrb r3, [r0, #11] + 1f19fec: e2833001 add r3, r3, #1 + 1f19ff0: e6ef3073 uxtb r3, r3 + 1f19ff4: e5c0300b strb r3, [r0, #11] + 1f19ff8: e3530000 cmp r3, #0 + 1f19ffc: 1a000004 bne 1f1a014 + 1f1a000: e5d0300c ldrb r3, [r0, #12] + 1f1a004: e3833002 orr r3, r3, #2 + 1f1a008: e203307f and r3, r3, #127 ; 0x7f + 1f1a00c: e5c0300c strb r3, [r0, #12] + 1f1a010: e12fff1e bx lr + 1f1a014: e3130080 tst r3, #128 ; 0x80 + 1f1a018: e5d0300c ldrb r3, [r0, #12] + 1f1a01c: e20330fd and r3, r3, #253 ; 0xfd + 1f1a020: e5c0300c strb r3, [r0, #12] + 1f1a024: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a028: 0afffff6 beq 1f1a008 + 1f1a02c: e5c0300c strb r3, [r0, #12] + 1f1a030: e12fff1e bx lr + +01f1a034 : + 1f1a034: e12fff1e bx lr + +01f1a038 : + 1f1a038: e1d030b0 ldrh r3, [r0] + 1f1a03c: e1c030b6 strh r3, [r0, #6] + 1f1a040: e12fff1e bx lr + +01f1a044 : + 1f1a044: e12fff1e bx lr + +01f1a048 : + 1f1a048: e5d03004 ldrb r3, [r0, #4] + 1f1a04c: e5c03009 strb r3, [r0, #9] + 1f1a050: e3530000 cmp r3, #0 + 1f1a054: 1a000004 bne 1f1a06c + 1f1a058: e5d0300c ldrb r3, [r0, #12] + 1f1a05c: e3833002 orr r3, r3, #2 + 1f1a060: e203307f and r3, r3, #127 ; 0x7f + 1f1a064: e5c0300c strb r3, [r0, #12] + 1f1a068: e12fff1e bx lr + 1f1a06c: e3130080 tst r3, #128 ; 0x80 + 1f1a070: e5d0300c ldrb r3, [r0, #12] + 1f1a074: e20330fd and r3, r3, #253 ; 0xfd + 1f1a078: e5c0300c strb r3, [r0, #12] + 1f1a07c: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a080: 0afffff6 beq 1f1a060 + 1f1a084: e5c0300c strb r3, [r0, #12] + 1f1a088: e12fff1e bx lr + +01f1a08c : + 1f1a08c: e5d03004 ldrb r3, [r0, #4] + 1f1a090: e5c0300a strb r3, [r0, #10] + 1f1a094: e3530000 cmp r3, #0 + 1f1a098: 1a000004 bne 1f1a0b0 + 1f1a09c: e5d0300c ldrb r3, [r0, #12] + 1f1a0a0: e3833002 orr r3, r3, #2 + 1f1a0a4: e203307f and r3, r3, #127 ; 0x7f + 1f1a0a8: e5c0300c strb r3, [r0, #12] + 1f1a0ac: e12fff1e bx lr + 1f1a0b0: e3130080 tst r3, #128 ; 0x80 + 1f1a0b4: e5d0300c ldrb r3, [r0, #12] + 1f1a0b8: e20330fd and r3, r3, #253 ; 0xfd + 1f1a0bc: e5c0300c strb r3, [r0, #12] + 1f1a0c0: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a0c4: 0afffff6 beq 1f1a0a4 + 1f1a0c8: e5c0300c strb r3, [r0, #12] + 1f1a0cc: e12fff1e bx lr + +01f1a0d0 : + 1f1a0d0: e5d03004 ldrb r3, [r0, #4] + 1f1a0d4: e5c0300b strb r3, [r0, #11] + 1f1a0d8: e3530000 cmp r3, #0 + 1f1a0dc: 1a000004 bne 1f1a0f4 + 1f1a0e0: e5d0300c ldrb r3, [r0, #12] + 1f1a0e4: e3833002 orr r3, r3, #2 + 1f1a0e8: e203307f and r3, r3, #127 ; 0x7f + 1f1a0ec: e5c0300c strb r3, [r0, #12] + 1f1a0f0: e12fff1e bx lr + 1f1a0f4: e3130080 tst r3, #128 ; 0x80 + 1f1a0f8: e5d0300c ldrb r3, [r0, #12] + 1f1a0fc: e20330fd and r3, r3, #253 ; 0xfd + 1f1a100: e5c0300c strb r3, [r0, #12] + 1f1a104: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a108: 0afffff6 beq 1f1a0e8 + 1f1a10c: e5c0300c strb r3, [r0, #12] + 1f1a110: e12fff1e bx lr + +01f1a114 : + 1f1a114: e1d010b4 ldrh r1, [r0, #4] + 1f1a118: e5d0300c ldrb r3, [r0, #12] + 1f1a11c: e3110001 tst r1, #1 + 1f1a120: e590c018 ldr ip, [r0, #24] + 1f1a124: e1a010c1 asr r1, r1, #1 + 1f1a128: 13833001 orrne r3, r3, #1 + 1f1a12c: 020330fe andeq r3, r3, #254 ; 0xfe + 1f1a130: e6ff2071 uxth r2, r1 + 1f1a134: e6ef1071 uxtb r1, r1 + 1f1a138: e31200ff tst r2, #255 ; 0xff + 1f1a13c: 03833002 orreq r3, r3, #2 + 1f1a140: 120330fd andne r3, r3, #253 ; 0xfd + 1f1a144: e3120080 tst r2, #128 ; 0x80 + 1f1a148: e30d2444 movw r2, #54340 ; 0xd444 + 1f1a14c: e34021f1 movt r2, #497 ; 0x1f1 + 1f1a150: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a154: 0203307f andeq r3, r3, #127 ; 0x7f + 1f1a158: e15c0002 cmp ip, r2 + 1f1a15c: e5c0300c strb r3, [r0, #12] + 1f1a160: 0a000002 beq 1f1a170 + 1f1a164: e5903014 ldr r3, [r0, #20] + 1f1a168: e1d000b0 ldrh r0, [r0] + 1f1a16c: e12fff13 bx r3 + 1f1a170: e590301c ldr r3, [r0, #28] + 1f1a174: e3530000 cmp r3, #0 + 1f1a178: 0a000003 beq 1f1a18c + 1f1a17c: e35c0000 cmp ip, #0 + 1f1a180: 1afffff7 bne 1f1a164 + 1f1a184: e3130001 tst r3, #1 + 1f1a188: 1afffff5 bne 1f1a164 + 1f1a18c: e5c01009 strb r1, [r0, #9] + 1f1a190: e12fff1e bx lr + +01f1a194 : + 1f1a194: e12fff1e bx lr + +01f1a198 : + 1f1a198: e5d02009 ldrb r2, [r0, #9] + 1f1a19c: e1d030b4 ldrh r3, [r0, #4] + 1f1a1a0: e1823003 orr r3, r2, r3 + 1f1a1a4: e5d0200c ldrb r2, [r0, #12] + 1f1a1a8: e31300ff tst r3, #255 ; 0xff + 1f1a1ac: e5c03009 strb r3, [r0, #9] + 1f1a1b0: 03822002 orreq r2, r2, #2 + 1f1a1b4: 120220fd andne r2, r2, #253 ; 0xfd + 1f1a1b8: e3130080 tst r3, #128 ; 0x80 + 1f1a1bc: 13822080 orrne r2, r2, #128 ; 0x80 + 1f1a1c0: 0202207f andeq r2, r2, #127 ; 0x7f + 1f1a1c4: e5c0200c strb r2, [r0, #12] + 1f1a1c8: e12fff1e bx lr + +01f1a1cc : + 1f1a1cc: e1a03000 mov r3, r0 + 1f1a1d0: e5d0000d ldrb r0, [r0, #13] + 1f1a1d4: e2402001 sub r2, r0, #1 + 1f1a1d8: e2800c01 add r0, r0, #256 ; 0x100 + 1f1a1dc: e5d31009 ldrb r1, [r3, #9] + 1f1a1e0: e5c3200d strb r2, [r3, #13] + 1f1a1e4: e5933014 ldr r3, [r3, #20] + 1f1a1e8: e12fff13 bx r3 + +01f1a1ec : + 1f1a1ec: e1a03000 mov r3, r0 + 1f1a1f0: e5d0000d ldrb r0, [r0, #13] + 1f1a1f4: e2402001 sub r2, r0, #1 + 1f1a1f8: e2800c01 add r0, r0, #256 ; 0x100 + 1f1a1fc: e5d3100c ldrb r1, [r3, #12] + 1f1a200: e5c3200d strb r2, [r3, #13] + 1f1a204: e3811030 orr r1, r1, #48 ; 0x30 + 1f1a208: e5933014 ldr r3, [r3, #20] + 1f1a20c: e12fff13 bx r3 + +01f1a210 : + 1f1a210: e92d4010 push {r4, lr} + 1f1a214: e1a04000 mov r4, r0 + 1f1a218: e5d0000d ldrb r0, [r0, #13] + 1f1a21c: e2800001 add r0, r0, #1 + 1f1a220: e5943010 ldr r3, [r4, #16] + 1f1a224: e6ef0070 uxtb r0, r0 + 1f1a228: e5c4000d strb r0, [r4, #13] + 1f1a22c: e2800c01 add r0, r0, #256 ; 0x100 + 1f1a230: e12fff33 blx r3 + 1f1a234: e3500000 cmp r0, #0 + 1f1a238: e5c40009 strb r0, [r4, #9] + 1f1a23c: 1a000004 bne 1f1a254 + 1f1a240: e5d4300c ldrb r3, [r4, #12] + 1f1a244: e3833002 orr r3, r3, #2 + 1f1a248: e203307f and r3, r3, #127 ; 0x7f + 1f1a24c: e5c4300c strb r3, [r4, #12] + 1f1a250: e8bd8010 pop {r4, pc} + 1f1a254: e5d4300c ldrb r3, [r4, #12] + 1f1a258: e3100080 tst r0, #128 ; 0x80 + 1f1a25c: e20330fd and r3, r3, #253 ; 0xfd + 1f1a260: e5c4300c strb r3, [r4, #12] + 1f1a264: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a268: 0afffff6 beq 1f1a248 + 1f1a26c: e5c4300c strb r3, [r4, #12] + 1f1a270: e8bd8010 pop {r4, pc} + +01f1a274 : + 1f1a274: e92d4010 push {r4, lr} + 1f1a278: e1a04000 mov r4, r0 + 1f1a27c: e5d0000d ldrb r0, [r0, #13] + 1f1a280: e2800001 add r0, r0, #1 + 1f1a284: e5943010 ldr r3, [r4, #16] + 1f1a288: e6ef0070 uxtb r0, r0 + 1f1a28c: e5c4000d strb r0, [r4, #13] + 1f1a290: e2800c01 add r0, r0, #256 ; 0x100 + 1f1a294: e12fff33 blx r3 + 1f1a298: e3800020 orr r0, r0, #32 + 1f1a29c: e5c4000c strb r0, [r4, #12] + 1f1a2a0: e8bd8010 pop {r4, pc} + +01f1a2a4 : + 1f1a2a4: e5d0300c ldrb r3, [r0, #12] + 1f1a2a8: e1d010b4 ldrh r1, [r0, #4] + 1f1a2ac: e2032001 and r2, r3, #1 + 1f1a2b0: e590c018 ldr ip, [r0, #24] + 1f1a2b4: e1821081 orr r1, r2, r1, lsl #1 + 1f1a2b8: e6bf1071 sxth r1, r1 + 1f1a2bc: e6ff2071 uxth r2, r1 + 1f1a2c0: e6ef1071 uxtb r1, r1 + 1f1a2c4: e3120cff tst r2, #65280 ; 0xff00 + 1f1a2c8: 13833001 orrne r3, r3, #1 + 1f1a2cc: 020330fe andeq r3, r3, #254 ; 0xfe + 1f1a2d0: e31200ff tst r2, #255 ; 0xff + 1f1a2d4: 03833002 orreq r3, r3, #2 + 1f1a2d8: 120330fd andne r3, r3, #253 ; 0xfd + 1f1a2dc: e3120080 tst r2, #128 ; 0x80 + 1f1a2e0: e30d2444 movw r2, #54340 ; 0xd444 + 1f1a2e4: e34021f1 movt r2, #497 ; 0x1f1 + 1f1a2e8: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a2ec: 0203307f andeq r3, r3, #127 ; 0x7f + 1f1a2f0: e15c0002 cmp ip, r2 + 1f1a2f4: e5c0300c strb r3, [r0, #12] + 1f1a2f8: 0a000002 beq 1f1a308 + 1f1a2fc: e5903014 ldr r3, [r0, #20] + 1f1a300: e1d000b0 ldrh r0, [r0] + 1f1a304: e12fff13 bx r3 + 1f1a308: e590301c ldr r3, [r0, #28] + 1f1a30c: e3530000 cmp r3, #0 + 1f1a310: 0a000003 beq 1f1a324 + 1f1a314: e35c0000 cmp ip, #0 + 1f1a318: 1afffff7 bne 1f1a2fc + 1f1a31c: e3130001 tst r3, #1 + 1f1a320: 1afffff5 bne 1f1a2fc + 1f1a324: e5c01009 strb r1, [r0, #9] + 1f1a328: e12fff1e bx lr + +01f1a32c : + 1f1a32c: e5d0300c ldrb r3, [r0, #12] + 1f1a330: e1d020b4 ldrh r2, [r0, #4] + 1f1a334: e590c018 ldr ip, [r0, #24] + 1f1a338: e1a01383 lsl r1, r3, #7 + 1f1a33c: e3120001 tst r2, #1 + 1f1a340: 13833001 orrne r3, r3, #1 + 1f1a344: 020330fe andeq r3, r3, #254 ; 0xfe + 1f1a348: e6ef1071 uxtb r1, r1 + 1f1a34c: e18110a2 orr r1, r1, r2, lsr #1 + 1f1a350: e6ff2071 uxth r2, r1 + 1f1a354: e6ef1071 uxtb r1, r1 + 1f1a358: e31200ff tst r2, #255 ; 0xff + 1f1a35c: 03833002 orreq r3, r3, #2 + 1f1a360: 120330fd andne r3, r3, #253 ; 0xfd + 1f1a364: e3120080 tst r2, #128 ; 0x80 + 1f1a368: e30d2444 movw r2, #54340 ; 0xd444 + 1f1a36c: e34021f1 movt r2, #497 ; 0x1f1 + 1f1a370: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a374: 0203307f andeq r3, r3, #127 ; 0x7f + 1f1a378: e15c0002 cmp ip, r2 + 1f1a37c: e5c0300c strb r3, [r0, #12] + 1f1a380: 0a000002 beq 1f1a390 + 1f1a384: e5903014 ldr r3, [r0, #20] + 1f1a388: e1d000b0 ldrh r0, [r0] + 1f1a38c: e12fff13 bx r3 + 1f1a390: e590301c ldr r3, [r0, #28] + 1f1a394: e3530000 cmp r3, #0 + 1f1a398: 0a000003 beq 1f1a3ac + 1f1a39c: e35c0000 cmp ip, #0 + 1f1a3a0: 1afffff7 bne 1f1a384 + 1f1a3a4: e3130001 tst r3, #1 + 1f1a3a8: 1afffff5 bne 1f1a384 + 1f1a3ac: e5c01009 strb r1, [r0, #9] + 1f1a3b0: e12fff1e bx lr + +01f1a3b4 : + 1f1a3b4: e12fff1e bx lr + +01f1a3b8 : + 1f1a3b8: e12fff1e bx lr + +01f1a3bc : + 1f1a3bc: e5d0300c ldrb r3, [r0, #12] + 1f1a3c0: e3833001 orr r3, r3, #1 + 1f1a3c4: e5c0300c strb r3, [r0, #12] + 1f1a3c8: e12fff1e bx lr + +01f1a3cc : + 1f1a3cc: e5d0300c ldrb r3, [r0, #12] + 1f1a3d0: e3833008 orr r3, r3, #8 + 1f1a3d4: e5c0300c strb r3, [r0, #12] + 1f1a3d8: e12fff1e bx lr + +01f1a3dc : + 1f1a3dc: e5d0300c ldrb r3, [r0, #12] + 1f1a3e0: e3833004 orr r3, r3, #4 + 1f1a3e4: e5c0300c strb r3, [r0, #12] + 1f1a3e8: e12fff1e bx lr + +01f1a3ec : + 1f1a3ec: e5902018 ldr r2, [r0, #24] + 1f1a3f0: e30d3444 movw r3, #54340 ; 0xd444 + 1f1a3f4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1a3f8: e1520003 cmp r2, r3 + 1f1a3fc: e5d01009 ldrb r1, [r0, #9] + 1f1a400: 0a000002 beq 1f1a410 + 1f1a404: e5903014 ldr r3, [r0, #20] + 1f1a408: e1d000b0 ldrh r0, [r0] + 1f1a40c: e12fff13 bx r3 + 1f1a410: e590301c ldr r3, [r0, #28] + 1f1a414: e3530000 cmp r3, #0 + 1f1a418: 012fff1e bxeq lr + 1f1a41c: e3520000 cmp r2, #0 + 1f1a420: 1afffff7 bne 1f1a404 + 1f1a424: e3130001 tst r3, #1 + 1f1a428: 1afffff5 bne 1f1a404 + 1f1a42c: e12fff1e bx lr + +01f1a430 : + 1f1a430: e5902018 ldr r2, [r0, #24] + 1f1a434: e30d3444 movw r3, #54340 ; 0xd444 + 1f1a438: e34031f1 movt r3, #497 ; 0x1f1 + 1f1a43c: e1520003 cmp r2, r3 + 1f1a440: e5d0100a ldrb r1, [r0, #10] + 1f1a444: 0a000002 beq 1f1a454 + 1f1a448: e5903014 ldr r3, [r0, #20] + 1f1a44c: e1d000b0 ldrh r0, [r0] + 1f1a450: e12fff13 bx r3 + 1f1a454: e590301c ldr r3, [r0, #28] + 1f1a458: e3530000 cmp r3, #0 + 1f1a45c: 0a000003 beq 1f1a470 + 1f1a460: e3520000 cmp r2, #0 + 1f1a464: 1afffff7 bne 1f1a448 + 1f1a468: e3130001 tst r3, #1 + 1f1a46c: 1afffff5 bne 1f1a448 + 1f1a470: e5c01009 strb r1, [r0, #9] + 1f1a474: e12fff1e bx lr + +01f1a478 : + 1f1a478: e5902018 ldr r2, [r0, #24] + 1f1a47c: e30d3444 movw r3, #54340 ; 0xd444 + 1f1a480: e34031f1 movt r3, #497 ; 0x1f1 + 1f1a484: e1520003 cmp r2, r3 + 1f1a488: e5d0100b ldrb r1, [r0, #11] + 1f1a48c: 0a000002 beq 1f1a49c + 1f1a490: e5903014 ldr r3, [r0, #20] + 1f1a494: e1d000b0 ldrh r0, [r0] + 1f1a498: e12fff13 bx r3 + 1f1a49c: e590301c ldr r3, [r0, #28] + 1f1a4a0: e3530000 cmp r3, #0 + 1f1a4a4: 0a000003 beq 1f1a4b8 + 1f1a4a8: e3520000 cmp r2, #0 + 1f1a4ac: 1afffff7 bne 1f1a490 + 1f1a4b0: e3130001 tst r3, #1 + 1f1a4b4: 1afffff5 bne 1f1a490 + 1f1a4b8: e5c01009 strb r1, [r0, #9] + 1f1a4bc: e12fff1e bx lr + +01f1a4c0 : + 1f1a4c0: e5d03009 ldrb r3, [r0, #9] + 1f1a4c4: e5c0300a strb r3, [r0, #10] + 1f1a4c8: e3530000 cmp r3, #0 + 1f1a4cc: 1a000004 bne 1f1a4e4 + 1f1a4d0: e5d0300c ldrb r3, [r0, #12] + 1f1a4d4: e3833002 orr r3, r3, #2 + 1f1a4d8: e203307f and r3, r3, #127 ; 0x7f + 1f1a4dc: e5c0300c strb r3, [r0, #12] + 1f1a4e0: e12fff1e bx lr + 1f1a4e4: e3130080 tst r3, #128 ; 0x80 + 1f1a4e8: e5d0300c ldrb r3, [r0, #12] + 1f1a4ec: e20330fd and r3, r3, #253 ; 0xfd + 1f1a4f0: e5c0300c strb r3, [r0, #12] + 1f1a4f4: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a4f8: 0afffff6 beq 1f1a4d8 + 1f1a4fc: e5c0300c strb r3, [r0, #12] + 1f1a500: e12fff1e bx lr + +01f1a504 : + 1f1a504: e5d03009 ldrb r3, [r0, #9] + 1f1a508: e5c0300b strb r3, [r0, #11] + 1f1a50c: e3530000 cmp r3, #0 + 1f1a510: 1a000004 bne 1f1a528 + 1f1a514: e5d0300c ldrb r3, [r0, #12] + 1f1a518: e3833002 orr r3, r3, #2 + 1f1a51c: e203307f and r3, r3, #127 ; 0x7f + 1f1a520: e5c0300c strb r3, [r0, #12] + 1f1a524: e12fff1e bx lr + 1f1a528: e3130080 tst r3, #128 ; 0x80 + 1f1a52c: e5d0300c ldrb r3, [r0, #12] + 1f1a530: e20330fd and r3, r3, #253 ; 0xfd + 1f1a534: e5c0300c strb r3, [r0, #12] + 1f1a538: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a53c: 0afffff6 beq 1f1a51c + 1f1a540: e5c0300c strb r3, [r0, #12] + 1f1a544: e12fff1e bx lr + +01f1a548 : + 1f1a548: e5d0300d ldrb r3, [r0, #13] + 1f1a54c: e5c0300a strb r3, [r0, #10] + 1f1a550: e3530000 cmp r3, #0 + 1f1a554: 1a000004 bne 1f1a56c + 1f1a558: e5d0300c ldrb r3, [r0, #12] + 1f1a55c: e3833002 orr r3, r3, #2 + 1f1a560: e203307f and r3, r3, #127 ; 0x7f + 1f1a564: e5c0300c strb r3, [r0, #12] + 1f1a568: e12fff1e bx lr + 1f1a56c: e3130080 tst r3, #128 ; 0x80 + 1f1a570: e5d0300c ldrb r3, [r0, #12] + 1f1a574: e20330fd and r3, r3, #253 ; 0xfd + 1f1a578: e5c0300c strb r3, [r0, #12] + 1f1a57c: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a580: 0afffff6 beq 1f1a560 + 1f1a584: e5c0300c strb r3, [r0, #12] + 1f1a588: e12fff1e bx lr + +01f1a58c : + 1f1a58c: e5d0300a ldrb r3, [r0, #10] + 1f1a590: e5c03009 strb r3, [r0, #9] + 1f1a594: e3530000 cmp r3, #0 + 1f1a598: 1a000004 bne 1f1a5b0 + 1f1a59c: e5d0300c ldrb r3, [r0, #12] + 1f1a5a0: e3833002 orr r3, r3, #2 + 1f1a5a4: e203307f and r3, r3, #127 ; 0x7f + 1f1a5a8: e5c0300c strb r3, [r0, #12] + 1f1a5ac: e12fff1e bx lr + 1f1a5b0: e3130080 tst r3, #128 ; 0x80 + 1f1a5b4: e5d0300c ldrb r3, [r0, #12] + 1f1a5b8: e20330fd and r3, r3, #253 ; 0xfd + 1f1a5bc: e5c0300c strb r3, [r0, #12] + 1f1a5c0: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a5c4: 0afffff6 beq 1f1a5a4 + 1f1a5c8: e5c0300c strb r3, [r0, #12] + 1f1a5cc: e12fff1e bx lr + +01f1a5d0 : + 1f1a5d0: e5d0300a ldrb r3, [r0, #10] + 1f1a5d4: e5c0300d strb r3, [r0, #13] + 1f1a5d8: e12fff1e bx lr + +01f1a5dc : + 1f1a5dc: e5d0300b ldrb r3, [r0, #11] + 1f1a5e0: e5c03009 strb r3, [r0, #9] + 1f1a5e4: e3530000 cmp r3, #0 + 1f1a5e8: 1a000004 bne 1f1a600 + 1f1a5ec: e5d0300c ldrb r3, [r0, #12] + 1f1a5f0: e3833002 orr r3, r3, #2 + 1f1a5f4: e203307f and r3, r3, #127 ; 0x7f + 1f1a5f8: e5c0300c strb r3, [r0, #12] + 1f1a5fc: e12fff1e bx lr + 1f1a600: e3130080 tst r3, #128 ; 0x80 + 1f1a604: e5d0300c ldrb r3, [r0, #12] + 1f1a608: e20330fd and r3, r3, #253 ; 0xfd + 1f1a60c: e5c0300c strb r3, [r0, #12] + 1f1a610: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a614: 0afffff6 beq 1f1a5f4 + 1f1a618: e5c0300c strb r3, [r0, #12] + 1f1a61c: e12fff1e bx lr + +01f1a620 : + 1f1a620: e5d02009 ldrb r2, [r0, #9] + 1f1a624: e1d030b4 ldrh r3, [r0, #4] + 1f1a628: e0022003 and r2, r2, r3 + 1f1a62c: e5d0300c ldrb r3, [r0, #12] + 1f1a630: e3120001 tst r2, #1 + 1f1a634: 13833001 orrne r3, r3, #1 + 1f1a638: 020330fe andeq r3, r3, #254 ; 0xfe + 1f1a63c: e1b020c2 asrs r2, r2, #1 + 1f1a640: e5c02009 strb r2, [r0, #9] + 1f1a644: 03833002 orreq r3, r3, #2 + 1f1a648: 120330fd andne r3, r3, #253 ; 0xfd + 1f1a64c: e203307f and r3, r3, #127 ; 0x7f + 1f1a650: e5c0300c strb r3, [r0, #12] + 1f1a654: e12fff1e bx lr + +01f1a658 : + 1f1a658: e5d02009 ldrb r2, [r0, #9] + 1f1a65c: e1d010b4 ldrh r1, [r0, #4] + 1f1a660: e38230ee orr r3, r2, #238 ; 0xee + 1f1a664: e0133001 ands r3, r3, r1 + 1f1a668: 1a000007 bne 1f1a68c + 1f1a66c: e5d0200c ldrb r2, [r0, #12] + 1f1a670: e3822002 orr r2, r2, #2 + 1f1a674: e202207f and r2, r2, #127 ; 0x7f + 1f1a678: e6ef3073 uxtb r3, r3 + 1f1a67c: e5c0200c strb r2, [r0, #12] + 1f1a680: e5c0300a strb r3, [r0, #10] + 1f1a684: e5c03009 strb r3, [r0, #9] + 1f1a688: e12fff1e bx lr + 1f1a68c: e5d0200c ldrb r2, [r0, #12] + 1f1a690: e3130080 tst r3, #128 ; 0x80 + 1f1a694: e20220fd and r2, r2, #253 ; 0xfd + 1f1a698: e5c0200c strb r2, [r0, #12] + 1f1a69c: 13822080 orrne r2, r2, #128 ; 0x80 + 1f1a6a0: 1afffff4 bne 1f1a678 + 1f1a6a4: eafffff2 b 1f1a674 + +01f1a6a8 : + 1f1a6a8: e5d02004 ldrb r2, [r0, #4] + 1f1a6ac: e5c02009 strb r2, [r0, #9] + 1f1a6b0: e3520000 cmp r2, #0 + 1f1a6b4: 1a000005 bne 1f1a6d0 + 1f1a6b8: e5d0300c ldrb r3, [r0, #12] + 1f1a6bc: e5c0200a strb r2, [r0, #10] + 1f1a6c0: e203307f and r3, r3, #127 ; 0x7f + 1f1a6c4: e3833002 orr r3, r3, #2 + 1f1a6c8: e5c0300c strb r3, [r0, #12] + 1f1a6cc: e12fff1e bx lr + 1f1a6d0: e5d0100c ldrb r1, [r0, #12] + 1f1a6d4: e3120080 tst r2, #128 ; 0x80 + 1f1a6d8: e5c0200a strb r2, [r0, #10] + 1f1a6dc: e3c13002 bic r3, r1, #2 + 1f1a6e0: e5c0300c strb r3, [r0, #12] + 1f1a6e4: 0201307d andeq r3, r1, #125 ; 0x7d + 1f1a6e8: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a6ec: e5c0300c strb r3, [r0, #12] + 1f1a6f0: e12fff1e bx lr + +01f1a6f4 : + 1f1a6f4: e5d0200d ldrb r2, [r0, #13] + 1f1a6f8: e1d030b4 ldrh r3, [r0, #4] + 1f1a6fc: e0033002 and r3, r3, r2 + 1f1a700: e5c0300d strb r3, [r0, #13] + 1f1a704: e3530000 cmp r3, #0 + 1f1a708: e5c0300a strb r3, [r0, #10] + 1f1a70c: e5c03009 strb r3, [r0, #9] + 1f1a710: 1a000004 bne 1f1a728 + 1f1a714: e5d0300c ldrb r3, [r0, #12] + 1f1a718: e3833002 orr r3, r3, #2 + 1f1a71c: e203307f and r3, r3, #127 ; 0x7f + 1f1a720: e5c0300c strb r3, [r0, #12] + 1f1a724: e12fff1e bx lr + 1f1a728: e3130080 tst r3, #128 ; 0x80 + 1f1a72c: e5d0300c ldrb r3, [r0, #12] + 1f1a730: e20330fd and r3, r3, #253 ; 0xfd + 1f1a734: e5c0300c strb r3, [r0, #12] + 1f1a738: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a73c: 0afffff6 beq 1f1a71c + 1f1a740: e5c0300c strb r3, [r0, #12] + 1f1a744: e12fff1e bx lr + +01f1a748 : + 1f1a748: e5902018 ldr r2, [r0, #24] + 1f1a74c: e30d3444 movw r3, #54340 ; 0xd444 + 1f1a750: e34031f1 movt r3, #497 ; 0x1f1 + 1f1a754: e5d01009 ldrb r1, [r0, #9] + 1f1a758: e1520003 cmp r2, r3 + 1f1a75c: e5d0300a ldrb r3, [r0, #10] + 1f1a760: e0011003 and r1, r1, r3 + 1f1a764: 0a000002 beq 1f1a774 + 1f1a768: e5903014 ldr r3, [r0, #20] + 1f1a76c: e1d000b0 ldrh r0, [r0] + 1f1a770: e12fff13 bx r3 + 1f1a774: e590301c ldr r3, [r0, #28] + 1f1a778: e3530000 cmp r3, #0 + 1f1a77c: 0a000003 beq 1f1a790 + 1f1a780: e3520000 cmp r2, #0 + 1f1a784: 1afffff7 bne 1f1a768 + 1f1a788: e3130001 tst r3, #1 + 1f1a78c: 1afffff5 bne 1f1a768 + 1f1a790: e5c01009 strb r1, [r0, #9] + 1f1a794: e12fff1e bx lr + +01f1a798 : + 1f1a798: e5d0200a ldrb r2, [r0, #10] + 1f1a79c: e5d03009 ldrb r3, [r0, #9] + 1f1a7a0: e1d010b4 ldrh r1, [r0, #4] + 1f1a7a4: e0033002 and r3, r3, r2 + 1f1a7a8: e0613003 rsb r3, r1, r3 + 1f1a7ac: e6ff3073 uxth r3, r3 + 1f1a7b0: e6ef2073 uxtb r2, r3 + 1f1a7b4: e5c0200a strb r2, [r0, #10] + 1f1a7b8: e3520000 cmp r2, #0 + 1f1a7bc: 1a000007 bne 1f1a7e0 + 1f1a7c0: e5d0200c ldrb r2, [r0, #12] + 1f1a7c4: e3822002 orr r2, r2, #2 + 1f1a7c8: e202207f and r2, r2, #127 ; 0x7f + 1f1a7cc: e35300ff cmp r3, #255 ; 0xff + 1f1a7d0: 93822001 orrls r2, r2, #1 + 1f1a7d4: 820220fe andhi r2, r2, #254 ; 0xfe + 1f1a7d8: e5c0200c strb r2, [r0, #12] + 1f1a7dc: e12fff1e bx lr + 1f1a7e0: e3120080 tst r2, #128 ; 0x80 + 1f1a7e4: e5d0200c ldrb r2, [r0, #12] + 1f1a7e8: e20220fd and r2, r2, #253 ; 0xfd + 1f1a7ec: e5c0200c strb r2, [r0, #12] + 1f1a7f0: 0afffff4 beq 1f1a7c8 + 1f1a7f4: e3822080 orr r2, r2, #128 ; 0x80 + 1f1a7f8: eafffff3 b 1f1a7cc + +01f1a7fc : + 1f1a7fc: e92d4010 push {r4, lr} + 1f1a800: e30dc444 movw ip, #54340 ; 0xd444 + 1f1a804: e340c1f1 movt ip, #497 ; 0x1f1 + 1f1a808: e1d0e0b0 ldrh lr, [r0] + 1f1a80c: e5904018 ldr r4, [r0, #24] + 1f1a810: e5d01009 ldrb r1, [r0, #9] + 1f1a814: e5d0200a ldrb r2, [r0, #10] + 1f1a818: e1a0344e asr r3, lr, #8 + 1f1a81c: e154000c cmp r4, ip + 1f1a820: e2833001 add r3, r3, #1 + 1f1a824: e0011002 and r1, r1, r2 + 1f1a828: e0011003 and r1, r1, r3 + 1f1a82c: 0a000003 beq 1f1a840 + 1f1a830: e5903014 ldr r3, [r0, #20] + 1f1a834: e1a0000e mov r0, lr + 1f1a838: e8bd4010 pop {r4, lr} + 1f1a83c: e12fff13 bx r3 + 1f1a840: e590301c ldr r3, [r0, #28] + 1f1a844: e3530000 cmp r3, #0 + 1f1a848: 0a000003 beq 1f1a85c + 1f1a84c: e3540000 cmp r4, #0 + 1f1a850: 1afffff6 bne 1f1a830 + 1f1a854: e3130001 tst r3, #1 + 1f1a858: 1afffff4 bne 1f1a830 + 1f1a85c: e5c01009 strb r1, [r0, #9] + 1f1a860: e8bd8010 pop {r4, pc} + +01f1a864 : + 1f1a864: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f1a868: e30d2444 movw r2, #54340 ; 0xd444 + 1f1a86c: e34021f1 movt r2, #497 ; 0x1f1 + 1f1a870: e1d0c0b0 ldrh ip, [r0] + 1f1a874: e590e018 ldr lr, [r0, #24] + 1f1a878: e5d0100b ldrb r1, [r0, #11] + 1f1a87c: e1a0344c asr r3, ip, #8 + 1f1a880: e15e0002 cmp lr, r2 + 1f1a884: e2833001 add r3, r3, #1 + 1f1a888: e0011003 and r1, r1, r3 + 1f1a88c: 0a000003 beq 1f1a8a0 + 1f1a890: e5903014 ldr r3, [r0, #20] + 1f1a894: e1a0000c mov r0, ip + 1f1a898: e49de004 pop {lr} ; (ldr lr, [sp], #4) + 1f1a89c: e12fff13 bx r3 + 1f1a8a0: e590301c ldr r3, [r0, #28] + 1f1a8a4: e3530000 cmp r3, #0 + 1f1a8a8: 0a000003 beq 1f1a8bc + 1f1a8ac: e35e0000 cmp lr, #0 + 1f1a8b0: 1afffff6 bne 1f1a890 + 1f1a8b4: e3130001 tst r3, #1 + 1f1a8b8: 1afffff4 bne 1f1a890 + 1f1a8bc: e5c01009 strb r1, [r0, #9] + 1f1a8c0: e49df004 pop {pc} ; (ldr pc, [sp], #4) + +01f1a8c4 : + 1f1a8c4: e1d010b4 ldrh r1, [r0, #4] + 1f1a8c8: e5d02009 ldrb r2, [r0, #9] + 1f1a8cc: e2411001 sub r1, r1, #1 + 1f1a8d0: e5d0300c ldrb r3, [r0, #12] + 1f1a8d4: e590c018 ldr ip, [r0, #24] + 1f1a8d8: e6ef1071 uxtb r1, r1 + 1f1a8dc: e1520001 cmp r2, r1 + 1f1a8e0: e0612002 rsb r2, r1, r2 + 1f1a8e4: 23833001 orrcs r3, r3, #1 + 1f1a8e8: 320330fe andcc r3, r3, #254 ; 0xfe + 1f1a8ec: e6ff2072 uxth r2, r2 + 1f1a8f0: e31200ff tst r2, #255 ; 0xff + 1f1a8f4: 03833002 orreq r3, r3, #2 + 1f1a8f8: 120330fd andne r3, r3, #253 ; 0xfd + 1f1a8fc: e3120080 tst r2, #128 ; 0x80 + 1f1a900: e30d2444 movw r2, #54340 ; 0xd444 + 1f1a904: e34021f1 movt r2, #497 ; 0x1f1 + 1f1a908: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1a90c: 0203307f andeq r3, r3, #127 ; 0x7f + 1f1a910: e15c0002 cmp ip, r2 + 1f1a914: e5c0300c strb r3, [r0, #12] + 1f1a918: 0a000002 beq 1f1a928 + 1f1a91c: e5903014 ldr r3, [r0, #20] + 1f1a920: e1d000b0 ldrh r0, [r0] + 1f1a924: e12fff13 bx r3 + 1f1a928: e590301c ldr r3, [r0, #28] + 1f1a92c: e3530000 cmp r3, #0 + 1f1a930: 0a000003 beq 1f1a944 + 1f1a934: e35c0000 cmp ip, #0 + 1f1a938: 1afffff7 bne 1f1a91c + 1f1a93c: e3130001 tst r3, #1 + 1f1a940: 1afffff5 bne 1f1a91c + 1f1a944: e5c01009 strb r1, [r0, #9] + 1f1a948: e12fff1e bx lr + +01f1a94c : + 1f1a94c: e1d010b4 ldrh r1, [r0, #4] + 1f1a950: e5d02009 ldrb r2, [r0, #9] + 1f1a954: e5d0300c ldrb r3, [r0, #12] + 1f1a958: e1a01081 lsl r1, r1, #1 + 1f1a95c: e6ff1071 uxth r1, r1 + 1f1a960: e3110cff tst r1, #65280 ; 0xff00 + 1f1a964: e6ef1071 uxtb r1, r1 + 1f1a968: 13833001 orrne r3, r3, #1 + 1f1a96c: e1812002 orr r2, r1, r2 + 1f1a970: 020330fe andeq r3, r3, #254 ; 0xfe + 1f1a974: e3520000 cmp r2, #0 + 1f1a978: e5c0300c strb r3, [r0, #12] + 1f1a97c: e5c02009 strb r2, [r0, #9] + 1f1a980: 03833002 orreq r3, r3, #2 + 1f1a984: 0a00000d beq 1f1a9c0 + 1f1a988: e3120080 tst r2, #128 ; 0x80 + 1f1a98c: e20330fd and r3, r3, #253 ; 0xfd + 1f1a990: e5c0300c strb r3, [r0, #12] + 1f1a994: 0a000009 beq 1f1a9c0 + 1f1a998: e3833080 orr r3, r3, #128 ; 0x80 + 1f1a99c: e590c018 ldr ip, [r0, #24] + 1f1a9a0: e30d2444 movw r2, #54340 ; 0xd444 + 1f1a9a4: e34021f1 movt r2, #497 ; 0x1f1 + 1f1a9a8: e15c0002 cmp ip, r2 + 1f1a9ac: e5c0300c strb r3, [r0, #12] + 1f1a9b0: 0a000004 beq 1f1a9c8 + 1f1a9b4: e5903014 ldr r3, [r0, #20] + 1f1a9b8: e1d000b0 ldrh r0, [r0] + 1f1a9bc: e12fff13 bx r3 + 1f1a9c0: e203307f and r3, r3, #127 ; 0x7f + 1f1a9c4: eafffff4 b 1f1a99c + 1f1a9c8: e590301c ldr r3, [r0, #28] + 1f1a9cc: e3530000 cmp r3, #0 + 1f1a9d0: 0a000003 beq 1f1a9e4 + 1f1a9d4: e35c0000 cmp ip, #0 + 1f1a9d8: 1afffff5 bne 1f1a9b4 + 1f1a9dc: e3130001 tst r3, #1 + 1f1a9e0: 1afffff3 bne 1f1a9b4 + 1f1a9e4: e5c01009 strb r1, [r0, #9] + 1f1a9e8: e12fff1e bx lr + +01f1a9ec : + 1f1a9ec: e5d0300c ldrb r3, [r0, #12] + 1f1a9f0: e1d010b4 ldrh r1, [r0, #4] + 1f1a9f4: e2032001 and r2, r3, #1 + 1f1a9f8: e1821081 orr r1, r2, r1, lsl #1 + 1f1a9fc: e5d02009 ldrb r2, [r0, #9] + 1f1aa00: e6bf1071 sxth r1, r1 + 1f1aa04: e3110cff tst r1, #65280 ; 0xff00 + 1f1aa08: e6ef1071 uxtb r1, r1 + 1f1aa0c: 13833001 orrne r3, r3, #1 + 1f1aa10: e0022001 and r2, r2, r1 + 1f1aa14: 020330fe andeq r3, r3, #254 ; 0xfe + 1f1aa18: e3520000 cmp r2, #0 + 1f1aa1c: e5c0300c strb r3, [r0, #12] + 1f1aa20: e5c02009 strb r2, [r0, #9] + 1f1aa24: 03833002 orreq r3, r3, #2 + 1f1aa28: 0a00000d beq 1f1aa64 + 1f1aa2c: e3120080 tst r2, #128 ; 0x80 + 1f1aa30: e20330fd and r3, r3, #253 ; 0xfd + 1f1aa34: e5c0300c strb r3, [r0, #12] + 1f1aa38: 0a000009 beq 1f1aa64 + 1f1aa3c: e3833080 orr r3, r3, #128 ; 0x80 + 1f1aa40: e590c018 ldr ip, [r0, #24] + 1f1aa44: e30d2444 movw r2, #54340 ; 0xd444 + 1f1aa48: e34021f1 movt r2, #497 ; 0x1f1 + 1f1aa4c: e15c0002 cmp ip, r2 + 1f1aa50: e5c0300c strb r3, [r0, #12] + 1f1aa54: 0a000004 beq 1f1aa6c + 1f1aa58: e5903014 ldr r3, [r0, #20] + 1f1aa5c: e1d000b0 ldrh r0, [r0] + 1f1aa60: e12fff13 bx r3 + 1f1aa64: e203307f and r3, r3, #127 ; 0x7f + 1f1aa68: eafffff4 b 1f1aa40 + 1f1aa6c: e590301c ldr r3, [r0, #28] + 1f1aa70: e3530000 cmp r3, #0 + 1f1aa74: 0a000003 beq 1f1aa88 + 1f1aa78: e35c0000 cmp ip, #0 + 1f1aa7c: 1afffff5 bne 1f1aa58 + 1f1aa80: e3130001 tst r3, #1 + 1f1aa84: 1afffff3 bne 1f1aa58 + 1f1aa88: e5c01009 strb r1, [r0, #9] + 1f1aa8c: e12fff1e bx lr + +01f1aa90 : + 1f1aa90: e1d010b4 ldrh r1, [r0, #4] + 1f1aa94: e5d02009 ldrb r2, [r0, #9] + 1f1aa98: e3110001 tst r1, #1 + 1f1aa9c: e5d0300c ldrb r3, [r0, #12] + 1f1aaa0: e1a010c1 asr r1, r1, #1 + 1f1aaa4: 13833001 orrne r3, r3, #1 + 1f1aaa8: 020330fe andeq r3, r3, #254 ; 0xfe + 1f1aaac: e6ef1071 uxtb r1, r1 + 1f1aab0: e5c0300c strb r3, [r0, #12] + 1f1aab4: e0222001 eor r2, r2, r1 + 1f1aab8: e5c02009 strb r2, [r0, #9] + 1f1aabc: e3520000 cmp r2, #0 + 1f1aac0: 03833002 orreq r3, r3, #2 + 1f1aac4: 0a00000d beq 1f1ab00 + 1f1aac8: e3120080 tst r2, #128 ; 0x80 + 1f1aacc: e20330fd and r3, r3, #253 ; 0xfd + 1f1aad0: e5c0300c strb r3, [r0, #12] + 1f1aad4: 0a000009 beq 1f1ab00 + 1f1aad8: e3833080 orr r3, r3, #128 ; 0x80 + 1f1aadc: e590c018 ldr ip, [r0, #24] + 1f1aae0: e30d2444 movw r2, #54340 ; 0xd444 + 1f1aae4: e34021f1 movt r2, #497 ; 0x1f1 + 1f1aae8: e15c0002 cmp ip, r2 + 1f1aaec: e5c0300c strb r3, [r0, #12] + 1f1aaf0: 0a000004 beq 1f1ab08 + 1f1aaf4: e5903014 ldr r3, [r0, #20] + 1f1aaf8: e1d000b0 ldrh r0, [r0] + 1f1aafc: e12fff13 bx r3 + 1f1ab00: e203307f and r3, r3, #127 ; 0x7f + 1f1ab04: eafffff4 b 1f1aadc + 1f1ab08: e590301c ldr r3, [r0, #28] + 1f1ab0c: e3530000 cmp r3, #0 + 1f1ab10: 0a000003 beq 1f1ab24 + 1f1ab14: e35c0000 cmp ip, #0 + 1f1ab18: 1afffff5 bne 1f1aaf4 + 1f1ab1c: e3130001 tst r3, #1 + 1f1ab20: 1afffff3 bne 1f1aaf4 + 1f1ab24: e5c01009 strb r1, [r0, #9] + 1f1ab28: e12fff1e bx lr + +01f1ab2c : + 1f1ab2c: e92d4070 push {r4, r5, r6, lr} + 1f1ab30: e1a04000 mov r4, r0 + 1f1ab34: e30d2444 movw r2, #54340 ; 0xd444 + 1f1ab38: e34021f1 movt r2, #497 ; 0x1f1 + 1f1ab3c: e1d000b0 ldrh r0, [r0] + 1f1ab40: e594c018 ldr ip, [r4, #24] + 1f1ab44: e5d45009 ldrb r5, [r4, #9] + 1f1ab48: e5d4300a ldrb r3, [r4, #10] + 1f1ab4c: e1a01440 asr r1, r0, #8 + 1f1ab50: e15c0002 cmp ip, r2 + 1f1ab54: e2811001 add r1, r1, #1 + 1f1ab58: e0055003 and r5, r5, r3 + 1f1ab5c: e0011005 and r1, r1, r5 + 1f1ab60: 0a000003 beq 1f1ab74 + 1f1ab64: e5943014 ldr r3, [r4, #20] + 1f1ab68: e12fff33 blx r3 + 1f1ab6c: e5c4500d strb r5, [r4, #13] + 1f1ab70: e8bd8070 pop {r4, r5, r6, pc} + 1f1ab74: e594301c ldr r3, [r4, #28] + 1f1ab78: e3530000 cmp r3, #0 + 1f1ab7c: 0a000003 beq 1f1ab90 + 1f1ab80: e35c0000 cmp ip, #0 + 1f1ab84: 1afffff6 bne 1f1ab64 + 1f1ab88: e3130001 tst r3, #1 + 1f1ab8c: 1afffff4 bne 1f1ab64 + 1f1ab90: e5c41009 strb r1, [r4, #9] + 1f1ab94: e5c4500d strb r5, [r4, #13] + 1f1ab98: e8bd8070 pop {r4, r5, r6, pc} + +01f1ab9c : + 1f1ab9c: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f1aba0: e30d2444 movw r2, #54340 ; 0xd444 + 1f1aba4: e34021f1 movt r2, #497 ; 0x1f1 + 1f1aba8: e1d0c0b0 ldrh ip, [r0] + 1f1abac: e590e018 ldr lr, [r0, #24] + 1f1abb0: e5d0100a ldrb r1, [r0, #10] + 1f1abb4: e1a0344c asr r3, ip, #8 + 1f1abb8: e15e0002 cmp lr, r2 + 1f1abbc: e2833001 add r3, r3, #1 + 1f1abc0: e0011003 and r1, r1, r3 + 1f1abc4: 0a000003 beq 1f1abd8 + 1f1abc8: e5903014 ldr r3, [r0, #20] + 1f1abcc: e1a0000c mov r0, ip + 1f1abd0: e49de004 pop {lr} ; (ldr lr, [sp], #4) + 1f1abd4: e12fff13 bx r3 + 1f1abd8: e590301c ldr r3, [r0, #28] + 1f1abdc: e3530000 cmp r3, #0 + 1f1abe0: 0a000003 beq 1f1abf4 + 1f1abe4: e35e0000 cmp lr, #0 + 1f1abe8: 1afffff6 bne 1f1abc8 + 1f1abec: e3130001 tst r3, #1 + 1f1abf0: 1afffff4 bne 1f1abc8 + 1f1abf4: e5c01009 strb r1, [r0, #9] + 1f1abf8: e49df004 pop {pc} ; (ldr pc, [sp], #4) + +01f1abfc : + 1f1abfc: e5d03009 ldrb r3, [r0, #9] + 1f1ac00: e1d020b4 ldrh r2, [r0, #4] + 1f1ac04: e1e03003 mvn r3, r3 + 1f1ac08: e5d0100a ldrb r1, [r0, #10] + 1f1ac0c: e2033011 and r3, r3, #17 + 1f1ac10: e1e03003 mvn r3, r3 + 1f1ac14: e0033002 and r3, r3, r2 + 1f1ac18: e0133001 ands r3, r3, r1 + 1f1ac1c: 1a000005 bne 1f1ac38 + 1f1ac20: e5d0200c ldrb r2, [r0, #12] + 1f1ac24: e3822002 orr r2, r2, #2 + 1f1ac28: e202207f and r2, r2, #127 ; 0x7f + 1f1ac2c: e5c0200c strb r2, [r0, #12] + 1f1ac30: e5c03009 strb r3, [r0, #9] + 1f1ac34: e12fff1e bx lr + 1f1ac38: e5d0200c ldrb r2, [r0, #12] + 1f1ac3c: e3130080 tst r3, #128 ; 0x80 + 1f1ac40: e20220fd and r2, r2, #253 ; 0xfd + 1f1ac44: e5c0200c strb r2, [r0, #12] + 1f1ac48: 13822080 orrne r2, r2, #128 ; 0x80 + 1f1ac4c: 1afffff6 bne 1f1ac2c + 1f1ac50: eafffff4 b 1f1ac28 + +01f1ac54 : + 1f1ac54: e5903024 ldr r3, [r0, #36] ; 0x24 + 1f1ac58: e3130001 tst r3, #1 + 1f1ac5c: 008030c3 addeq r3, r0, r3, asr #1 + 1f1ac60: 179010c3 ldrne r1, [r0, r3, asr #1] + 1f1ac64: 108030c3 addne r3, r0, r3, asr #1 + 1f1ac68: 15902020 ldrne r2, [r0, #32] + 1f1ac6c: 05902020 ldreq r2, [r0, #32] + 1f1ac70: e1a00003 mov r0, r3 + 1f1ac74: 17912002 ldrne r2, [r1, r2] + 1f1ac78: e12fff12 bx r2 + +01f1ac7c : + 1f1ac7c: e92d4010 push {r4, lr} + 1f1ac80: e1a04000 mov r4, r0 + 1f1ac84: e5903010 ldr r3, [r0, #16] + 1f1ac88: e1d000b6 ldrh r0, [r0, #6] + 1f1ac8c: e12fff33 blx r3 + 1f1ac90: e30c382c movw r3, #51244 ; 0xc82c + 1f1ac94: e34031f1 movt r3, #497 ; 0x1f1 + 1f1ac98: e5843018 str r3, [r4, #24] + 1f1ac9c: e3a03000 mov r3, #0 + 1f1aca0: e584301c str r3, [r4, #28] + 1f1aca4: e8bd8010 pop {r4, pc} + +01f1aca8 : + 1f1aca8: e92d4010 push {r4, lr} + 1f1acac: e1a04000 mov r4, r0 + 1f1acb0: e1d000b6 ldrh r0, [r0, #6] + 1f1acb4: e2802001 add r2, r0, #1 + 1f1acb8: e5943010 ldr r3, [r4, #16] + 1f1acbc: e1c420b6 strh r2, [r4, #6] + 1f1acc0: e12fff33 blx r3 + 1f1acc4: e30d3348 movw r3, #54088 ; 0xd348 + 1f1acc8: e34031f1 movt r3, #497 ; 0x1f1 + 1f1accc: e5843018 str r3, [r4, #24] + 1f1acd0: e1c400b0 strh r0, [r4] + 1f1acd4: e3a03000 mov r3, #0 + 1f1acd8: e584301c str r3, [r4, #28] + 1f1acdc: e8bd8010 pop {r4, pc} + +01f1ace0 : + 1f1ace0: e92d4010 push {r4, lr} + 1f1ace4: e1a04000 mov r4, r0 + 1f1ace8: e1d000b6 ldrh r0, [r0, #6] + 1f1acec: e2802001 add r2, r0, #1 + 1f1acf0: e5943010 ldr r3, [r4, #16] + 1f1acf4: e1c420b6 strh r2, [r4, #6] + 1f1acf8: e12fff33 blx r3 + 1f1acfc: e30c3d50 movw r3, #52560 ; 0xcd50 + 1f1ad00: e34031f1 movt r3, #497 ; 0x1f1 + 1f1ad04: e5843018 str r3, [r4, #24] + 1f1ad08: e1c400b0 strh r0, [r4] + 1f1ad0c: e3a03000 mov r3, #0 + 1f1ad10: e584301c str r3, [r4, #28] + 1f1ad14: e8bd8010 pop {r4, pc} + +01f1ad18 : + 1f1ad18: e92d4010 push {r4, lr} + 1f1ad1c: e1a04000 mov r4, r0 + 1f1ad20: e1d000b6 ldrh r0, [r0, #6] + 1f1ad24: e2802001 add r2, r0, #1 + 1f1ad28: e5943010 ldr r3, [r4, #16] + 1f1ad2c: e1c420b6 strh r2, [r4, #6] + 1f1ad30: e12fff33 blx r3 + 1f1ad34: e30a3d50 movw r3, #44368 ; 0xad50 + 1f1ad38: e34031f1 movt r3, #497 ; 0x1f1 + 1f1ad3c: e5843018 str r3, [r4, #24] + 1f1ad40: e1c400b0 strh r0, [r4] + 1f1ad44: e3a03000 mov r3, #0 + 1f1ad48: e584301c str r3, [r4, #28] + 1f1ad4c: e8bd8010 pop {r4, pc} + +01f1ad50 : + 1f1ad50: e92d4010 push {r4, lr} + 1f1ad54: e1a04000 mov r4, r0 + 1f1ad58: e1d000b6 ldrh r0, [r0, #6] + 1f1ad5c: e2802001 add r2, r0, #1 + 1f1ad60: e5943010 ldr r3, [r4, #16] + 1f1ad64: e1c420b6 strh r2, [r4, #6] + 1f1ad68: e12fff33 blx r3 + 1f1ad6c: e1d430b0 ldrh r3, [r4] + 1f1ad70: e30d239c movw r2, #54172 ; 0xd39c + 1f1ad74: e34021f1 movt r2, #497 ; 0x1f1 + 1f1ad78: e1830400 orr r0, r3, r0, lsl #8 + 1f1ad7c: e5842018 str r2, [r4, #24] + 1f1ad80: e3a03000 mov r3, #0 + 1f1ad84: e1c400b0 strh r0, [r4] + 1f1ad88: e584301c str r3, [r4, #28] + 1f1ad8c: e8bd8010 pop {r4, pc} + +01f1ad90 : + 1f1ad90: e92d4010 push {r4, lr} + 1f1ad94: e1a04000 mov r4, r0 + 1f1ad98: e1d000b6 ldrh r0, [r0, #6] + 1f1ad9c: e2802001 add r2, r0, #1 + 1f1ada0: e5943010 ldr r3, [r4, #16] + 1f1ada4: e1c420b6 strh r2, [r4, #6] + 1f1ada8: e12fff33 blx r3 + 1f1adac: e30a3dc8 movw r3, #44488 ; 0xadc8 + 1f1adb0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1adb4: e5843018 str r3, [r4, #24] + 1f1adb8: e1c400b0 strh r0, [r4] + 1f1adbc: e3a03000 mov r3, #0 + 1f1adc0: e584301c str r3, [r4, #28] + 1f1adc4: e8bd8010 pop {r4, pc} + +01f1adc8 : + 1f1adc8: e92d4010 push {r4, lr} + 1f1adcc: e1a04000 mov r4, r0 + 1f1add0: e1d000b6 ldrh r0, [r0, #6] + 1f1add4: e2802001 add r2, r0, #1 + 1f1add8: e5943010 ldr r3, [r4, #16] + 1f1addc: e1c420b6 strh r2, [r4, #6] + 1f1ade0: e12fff33 blx r3 + 1f1ade4: e1d430b0 ldrh r3, [r4] + 1f1ade8: e30c2d94 movw r2, #52628 ; 0xcd94 + 1f1adec: e34021f1 movt r2, #497 ; 0x1f1 + 1f1adf0: e1830400 orr r0, r3, r0, lsl #8 + 1f1adf4: e5842018 str r2, [r4, #24] + 1f1adf8: e3a03000 mov r3, #0 + 1f1adfc: e1c400b0 strh r0, [r4] + 1f1ae00: e584301c str r3, [r4, #28] + 1f1ae04: e8bd8010 pop {r4, pc} + +01f1ae08 : + 1f1ae08: e92d4010 push {r4, lr} + 1f1ae0c: e1a04000 mov r4, r0 + 1f1ae10: e1d000b6 ldrh r0, [r0, #6] + 1f1ae14: e2802001 add r2, r0, #1 + 1f1ae18: e5943010 ldr r3, [r4, #16] + 1f1ae1c: e1c420b6 strh r2, [r4, #6] + 1f1ae20: e12fff33 blx r3 + 1f1ae24: e30a3e40 movw r3, #44608 ; 0xae40 + 1f1ae28: e34031f1 movt r3, #497 ; 0x1f1 + 1f1ae2c: e5843018 str r3, [r4, #24] + 1f1ae30: e1c400b2 strh r0, [r4, #2] + 1f1ae34: e3a03000 mov r3, #0 + 1f1ae38: e584301c str r3, [r4, #28] + 1f1ae3c: e8bd8010 pop {r4, pc} + +01f1ae40 : + 1f1ae40: e92d4010 push {r4, lr} + 1f1ae44: e1a04000 mov r4, r0 + 1f1ae48: e5903010 ldr r3, [r0, #16] + 1f1ae4c: e1d000b2 ldrh r0, [r0, #2] + 1f1ae50: e12fff33 blx r3 + 1f1ae54: e30a3e6c movw r3, #44652 ; 0xae6c + 1f1ae58: e34031f1 movt r3, #497 ; 0x1f1 + 1f1ae5c: e5843018 str r3, [r4, #24] + 1f1ae60: e3a03000 mov r3, #0 + 1f1ae64: e584301c str r3, [r4, #28] + 1f1ae68: e8bd8010 pop {r4, pc} + +01f1ae6c : + 1f1ae6c: e92d4010 push {r4, lr} + 1f1ae70: e1a04000 mov r4, r0 + 1f1ae74: e5d0300a ldrb r3, [r0, #10] + 1f1ae78: e1d000b2 ldrh r0, [r0, #2] + 1f1ae7c: e5942010 ldr r2, [r4, #16] + 1f1ae80: e0830000 add r0, r3, r0 + 1f1ae84: e6ef0070 uxtb r0, r0 + 1f1ae88: e2803001 add r3, r0, #1 + 1f1ae8c: e1c430b2 strh r3, [r4, #2] + 1f1ae90: e12fff32 blx r2 + 1f1ae94: e30a3eb0 movw r3, #44720 ; 0xaeb0 + 1f1ae98: e34031f1 movt r3, #497 ; 0x1f1 + 1f1ae9c: e5843018 str r3, [r4, #24] + 1f1aea0: e1c400b0 strh r0, [r4] + 1f1aea4: e3a03000 mov r3, #0 + 1f1aea8: e584301c str r3, [r4, #28] + 1f1aeac: e8bd8010 pop {r4, pc} + +01f1aeb0 : + 1f1aeb0: e92d4010 push {r4, lr} + 1f1aeb4: e1a04000 mov r4, r0 + 1f1aeb8: e5903010 ldr r3, [r0, #16] + 1f1aebc: e5d00002 ldrb r0, [r0, #2] + 1f1aec0: e12fff33 blx r3 + 1f1aec4: e30d23f0 movw r2, #54256 ; 0xd3f0 + 1f1aec8: e34021f1 movt r2, #497 ; 0x1f1 + 1f1aecc: e5842018 str r2, [r4, #24] + 1f1aed0: e1d430b0 ldrh r3, [r4] + 1f1aed4: e1830400 orr r0, r3, r0, lsl #8 + 1f1aed8: e3a03000 mov r3, #0 + 1f1aedc: e1c400b0 strh r0, [r4] + 1f1aee0: e584301c str r3, [r4, #28] + 1f1aee4: e8bd8010 pop {r4, pc} + +01f1aee8 : + 1f1aee8: e92d4010 push {r4, lr} + 1f1aeec: e1a04000 mov r4, r0 + 1f1aef0: e1d000b6 ldrh r0, [r0, #6] + 1f1aef4: e2802001 add r2, r0, #1 + 1f1aef8: e5943010 ldr r3, [r4, #16] + 1f1aefc: e1c420b6 strh r2, [r4, #6] + 1f1af00: e12fff33 blx r3 + 1f1af04: e30a3f20 movw r3, #44832 ; 0xaf20 + 1f1af08: e34031f1 movt r3, #497 ; 0x1f1 + 1f1af0c: e5843018 str r3, [r4, #24] + 1f1af10: e1c400b2 strh r0, [r4, #2] + 1f1af14: e3a03000 mov r3, #0 + 1f1af18: e584301c str r3, [r4, #28] + 1f1af1c: e8bd8010 pop {r4, pc} + +01f1af20 : + 1f1af20: e92d4010 push {r4, lr} + 1f1af24: e1a04000 mov r4, r0 + 1f1af28: e5903010 ldr r3, [r0, #16] + 1f1af2c: e1d000b2 ldrh r0, [r0, #2] + 1f1af30: e12fff33 blx r3 + 1f1af34: e30a3f4c movw r3, #44876 ; 0xaf4c + 1f1af38: e34031f1 movt r3, #497 ; 0x1f1 + 1f1af3c: e5843018 str r3, [r4, #24] + 1f1af40: e3a03000 mov r3, #0 + 1f1af44: e584301c str r3, [r4, #28] + 1f1af48: e8bd8010 pop {r4, pc} + +01f1af4c : + 1f1af4c: e92d4010 push {r4, lr} + 1f1af50: e1a04000 mov r4, r0 + 1f1af54: e5d0300a ldrb r3, [r0, #10] + 1f1af58: e1d000b2 ldrh r0, [r0, #2] + 1f1af5c: e5942010 ldr r2, [r4, #16] + 1f1af60: e0830000 add r0, r3, r0 + 1f1af64: e6ef0070 uxtb r0, r0 + 1f1af68: e2803001 add r3, r0, #1 + 1f1af6c: e1c430b2 strh r3, [r4, #2] + 1f1af70: e12fff32 blx r2 + 1f1af74: e30a3f90 movw r3, #44944 ; 0xaf90 + 1f1af78: e34031f1 movt r3, #497 ; 0x1f1 + 1f1af7c: e5843018 str r3, [r4, #24] + 1f1af80: e1c400b0 strh r0, [r4] + 1f1af84: e3a03000 mov r3, #0 + 1f1af88: e584301c str r3, [r4, #28] + 1f1af8c: e8bd8010 pop {r4, pc} + +01f1af90 : + 1f1af90: e92d4010 push {r4, lr} + 1f1af94: e1a04000 mov r4, r0 + 1f1af98: e5903010 ldr r3, [r0, #16] + 1f1af9c: e5d00002 ldrb r0, [r0, #2] + 1f1afa0: e12fff33 blx r3 + 1f1afa4: e30c2dd8 movw r2, #52696 ; 0xcdd8 + 1f1afa8: e34021f1 movt r2, #497 ; 0x1f1 + 1f1afac: e5842018 str r2, [r4, #24] + 1f1afb0: e1d430b0 ldrh r3, [r4] + 1f1afb4: e1830400 orr r0, r3, r0, lsl #8 + 1f1afb8: e3a03000 mov r3, #0 + 1f1afbc: e1c400b0 strh r0, [r4] + 1f1afc0: e584301c str r3, [r4, #28] + 1f1afc4: e8bd8010 pop {r4, pc} + +01f1afc8 : + 1f1afc8: e92d4010 push {r4, lr} + 1f1afcc: e1a04000 mov r4, r0 + 1f1afd0: e1d000b6 ldrh r0, [r0, #6] + 1f1afd4: e2802001 add r2, r0, #1 + 1f1afd8: e5943010 ldr r3, [r4, #16] + 1f1afdc: e1c420b6 strh r2, [r4, #6] + 1f1afe0: e12fff33 blx r3 + 1f1afe4: e30b3000 movw r3, #45056 ; 0xb000 + 1f1afe8: e34031f1 movt r3, #497 ; 0x1f1 + 1f1afec: e5843018 str r3, [r4, #24] + 1f1aff0: e1c400b2 strh r0, [r4, #2] + 1f1aff4: e3a03000 mov r3, #0 + 1f1aff8: e584301c str r3, [r4, #28] + 1f1affc: e8bd8010 pop {r4, pc} + +01f1b000 : + 1f1b000: e92d4010 push {r4, lr} + 1f1b004: e1a04000 mov r4, r0 + 1f1b008: e5903010 ldr r3, [r0, #16] + 1f1b00c: e1d000b2 ldrh r0, [r0, #2] + 1f1b010: e12fff33 blx r3 + 1f1b014: e30b302c movw r3, #45100 ; 0xb02c + 1f1b018: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b01c: e5843018 str r3, [r4, #24] + 1f1b020: e3a03000 mov r3, #0 + 1f1b024: e584301c str r3, [r4, #28] + 1f1b028: e8bd8010 pop {r4, pc} + +01f1b02c : + 1f1b02c: e92d4010 push {r4, lr} + 1f1b030: e1a04000 mov r4, r0 + 1f1b034: e5d0300a ldrb r3, [r0, #10] + 1f1b038: e1d000b2 ldrh r0, [r0, #2] + 1f1b03c: e5942010 ldr r2, [r4, #16] + 1f1b040: e0830000 add r0, r3, r0 + 1f1b044: e6ef0070 uxtb r0, r0 + 1f1b048: e2803001 add r3, r0, #1 + 1f1b04c: e1c430b2 strh r3, [r4, #2] + 1f1b050: e12fff32 blx r2 + 1f1b054: e30b3070 movw r3, #45168 ; 0xb070 + 1f1b058: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b05c: e5843018 str r3, [r4, #24] + 1f1b060: e1c400b0 strh r0, [r4] + 1f1b064: e3a03000 mov r3, #0 + 1f1b068: e584301c str r3, [r4, #28] + 1f1b06c: e8bd8010 pop {r4, pc} + +01f1b070 : + 1f1b070: e92d4010 push {r4, lr} + 1f1b074: e1a04000 mov r4, r0 + 1f1b078: e5903010 ldr r3, [r0, #16] + 1f1b07c: e5d00002 ldrb r0, [r0, #2] + 1f1b080: e12fff33 blx r3 + 1f1b084: e30b20a8 movw r2, #45224 ; 0xb0a8 + 1f1b088: e34021f1 movt r2, #497 ; 0x1f1 + 1f1b08c: e5842018 str r2, [r4, #24] + 1f1b090: e1d430b0 ldrh r3, [r4] + 1f1b094: e1830400 orr r0, r3, r0, lsl #8 + 1f1b098: e3a03000 mov r3, #0 + 1f1b09c: e1c400b0 strh r0, [r4] + 1f1b0a0: e584301c str r3, [r4, #28] + 1f1b0a4: e8bd8010 pop {r4, pc} + +01f1b0a8 : + 1f1b0a8: e92d4010 push {r4, lr} + 1f1b0ac: e1a04000 mov r4, r0 + 1f1b0b0: e5903010 ldr r3, [r0, #16] + 1f1b0b4: e1d000b0 ldrh r0, [r0] + 1f1b0b8: e12fff33 blx r3 + 1f1b0bc: e30b30d8 movw r3, #45272 ; 0xb0d8 + 1f1b0c0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b0c4: e5843018 str r3, [r4, #24] + 1f1b0c8: e1c400b4 strh r0, [r4, #4] + 1f1b0cc: e3a03000 mov r3, #0 + 1f1b0d0: e584301c str r3, [r4, #28] + 1f1b0d4: e8bd8010 pop {r4, pc} + +01f1b0d8 : + 1f1b0d8: e92d4010 push {r4, lr} + 1f1b0dc: e1a04000 mov r4, r0 + 1f1b0e0: e5903014 ldr r3, [r0, #20] + 1f1b0e4: e5d01004 ldrb r1, [r0, #4] + 1f1b0e8: e1d000b0 ldrh r0, [r0] + 1f1b0ec: e12fff33 blx r3 + 1f1b0f0: e30c3e1c movw r3, #52764 ; 0xce1c + 1f1b0f4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b0f8: e5843018 str r3, [r4, #24] + 1f1b0fc: e3a03000 mov r3, #0 + 1f1b100: e584301c str r3, [r4, #28] + 1f1b104: e8bd8010 pop {r4, pc} + +01f1b108 : + 1f1b108: e92d4010 push {r4, lr} + 1f1b10c: e1a04000 mov r4, r0 + 1f1b110: e1d000b6 ldrh r0, [r0, #6] + 1f1b114: e2802001 add r2, r0, #1 + 1f1b118: e5943010 ldr r3, [r4, #16] + 1f1b11c: e1c420b6 strh r2, [r4, #6] + 1f1b120: e12fff33 blx r3 + 1f1b124: e30b3140 movw r3, #45376 ; 0xb140 + 1f1b128: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b12c: e5843018 str r3, [r4, #24] + 1f1b130: e1c400b0 strh r0, [r4] + 1f1b134: e3a03000 mov r3, #0 + 1f1b138: e584301c str r3, [r4, #28] + 1f1b13c: e8bd8010 pop {r4, pc} + +01f1b140 : + 1f1b140: e92d4010 push {r4, lr} + 1f1b144: e1a04000 mov r4, r0 + 1f1b148: e1d000b6 ldrh r0, [r0, #6] + 1f1b14c: e2802001 add r2, r0, #1 + 1f1b150: e5943010 ldr r3, [r4, #16] + 1f1b154: e1c420b6 strh r2, [r4, #6] + 1f1b158: e12fff33 blx r3 + 1f1b15c: e1d430b0 ldrh r3, [r4] + 1f1b160: e30d281c movw r2, #55324 ; 0xd81c + 1f1b164: e34021f1 movt r2, #497 ; 0x1f1 + 1f1b168: e1830400 orr r0, r3, r0, lsl #8 + 1f1b16c: e5842018 str r2, [r4, #24] + 1f1b170: e3a03000 mov r3, #0 + 1f1b174: e1c400b0 strh r0, [r4] + 1f1b178: e584301c str r3, [r4, #28] + 1f1b17c: e8bd8010 pop {r4, pc} + +01f1b180 : + 1f1b180: e92d4010 push {r4, lr} + 1f1b184: e1a04000 mov r4, r0 + 1f1b188: e1d000b6 ldrh r0, [r0, #6] + 1f1b18c: e2802001 add r2, r0, #1 + 1f1b190: e5943010 ldr r3, [r4, #16] + 1f1b194: e1c420b6 strh r2, [r4, #6] + 1f1b198: e12fff33 blx r3 + 1f1b19c: e30b31b8 movw r3, #45496 ; 0xb1b8 + 1f1b1a0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b1a4: e5843018 str r3, [r4, #24] + 1f1b1a8: e1c400b0 strh r0, [r4] + 1f1b1ac: e3a03000 mov r3, #0 + 1f1b1b0: e584301c str r3, [r4, #28] + 1f1b1b4: e8bd8010 pop {r4, pc} + +01f1b1b8 : + 1f1b1b8: e92d4010 push {r4, lr} + 1f1b1bc: e1a04000 mov r4, r0 + 1f1b1c0: e1d000b6 ldrh r0, [r0, #6] + 1f1b1c4: e2802001 add r2, r0, #1 + 1f1b1c8: e5943010 ldr r3, [r4, #16] + 1f1b1cc: e1c420b6 strh r2, [r4, #6] + 1f1b1d0: e12fff33 blx r3 + 1f1b1d4: e1d430b0 ldrh r3, [r4] + 1f1b1d8: e30b21f8 movw r2, #45560 ; 0xb1f8 + 1f1b1dc: e34021f1 movt r2, #497 ; 0x1f1 + 1f1b1e0: e1830400 orr r0, r3, r0, lsl #8 + 1f1b1e4: e5842018 str r2, [r4, #24] + 1f1b1e8: e3a03000 mov r3, #0 + 1f1b1ec: e1c400b0 strh r0, [r4] + 1f1b1f0: e584301c str r3, [r4, #28] + 1f1b1f4: e8bd8010 pop {r4, pc} + +01f1b1f8 : + 1f1b1f8: e92d4010 push {r4, lr} + 1f1b1fc: e1a04000 mov r4, r0 + 1f1b200: e5903010 ldr r3, [r0, #16] + 1f1b204: e1d000b0 ldrh r0, [r0] + 1f1b208: e12fff33 blx r3 + 1f1b20c: e30c2e60 movw r2, #52832 ; 0xce60 + 1f1b210: e34021f1 movt r2, #497 ; 0x1f1 + 1f1b214: e5842018 str r2, [r4, #24] + 1f1b218: e1d410b0 ldrh r1, [r4] + 1f1b21c: e3a02000 mov r2, #0 + 1f1b220: e5d4300a ldrb r3, [r4, #10] + 1f1b224: e584201c str r2, [r4, #28] + 1f1b228: e0833001 add r3, r3, r1 + 1f1b22c: e1c430b0 strh r3, [r4] + 1f1b230: e8bd8010 pop {r4, pc} + +01f1b234 : + 1f1b234: e92d4010 push {r4, lr} + 1f1b238: e1a04000 mov r4, r0 + 1f1b23c: e1d000b6 ldrh r0, [r0, #6] + 1f1b240: e2802001 add r2, r0, #1 + 1f1b244: e5943010 ldr r3, [r4, #16] + 1f1b248: e1c420b6 strh r2, [r4, #6] + 1f1b24c: e12fff33 blx r3 + 1f1b250: e30b326c movw r3, #45676 ; 0xb26c + 1f1b254: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b258: e5843018 str r3, [r4, #24] + 1f1b25c: e1c400b0 strh r0, [r4] + 1f1b260: e3a03000 mov r3, #0 + 1f1b264: e584301c str r3, [r4, #28] + 1f1b268: e8bd8010 pop {r4, pc} + +01f1b26c : + 1f1b26c: e92d4010 push {r4, lr} + 1f1b270: e1a04000 mov r4, r0 + 1f1b274: e1d000b6 ldrh r0, [r0, #6] + 1f1b278: e2802001 add r2, r0, #1 + 1f1b27c: e5943010 ldr r3, [r4, #16] + 1f1b280: e1c420b6 strh r2, [r4, #6] + 1f1b284: e12fff33 blx r3 + 1f1b288: e1d430b0 ldrh r3, [r4] + 1f1b28c: e30d28b8 movw r2, #55480 ; 0xd8b8 + 1f1b290: e34021f1 movt r2, #497 ; 0x1f1 + 1f1b294: e1830400 orr r0, r3, r0, lsl #8 + 1f1b298: e5842018 str r2, [r4, #24] + 1f1b29c: e3a03000 mov r3, #0 + 1f1b2a0: e1c400b0 strh r0, [r4] + 1f1b2a4: e584301c str r3, [r4, #28] + 1f1b2a8: e8bd8010 pop {r4, pc} + +01f1b2ac : + 1f1b2ac: e92d4010 push {r4, lr} + 1f1b2b0: e1a04000 mov r4, r0 + 1f1b2b4: e1d000b6 ldrh r0, [r0, #6] + 1f1b2b8: e2802001 add r2, r0, #1 + 1f1b2bc: e5943010 ldr r3, [r4, #16] + 1f1b2c0: e1c420b6 strh r2, [r4, #6] + 1f1b2c4: e12fff33 blx r3 + 1f1b2c8: e30b32e4 movw r3, #45796 ; 0xb2e4 + 1f1b2cc: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b2d0: e5843018 str r3, [r4, #24] + 1f1b2d4: e1c400b0 strh r0, [r4] + 1f1b2d8: e3a03000 mov r3, #0 + 1f1b2dc: e584301c str r3, [r4, #28] + 1f1b2e0: e8bd8010 pop {r4, pc} + +01f1b2e4 : + 1f1b2e4: e92d4010 push {r4, lr} + 1f1b2e8: e1a04000 mov r4, r0 + 1f1b2ec: e1d000b6 ldrh r0, [r0, #6] + 1f1b2f0: e2802001 add r2, r0, #1 + 1f1b2f4: e5943010 ldr r3, [r4, #16] + 1f1b2f8: e1c420b6 strh r2, [r4, #6] + 1f1b2fc: e12fff33 blx r3 + 1f1b300: e1d430b0 ldrh r3, [r4] + 1f1b304: e30b2324 movw r2, #45860 ; 0xb324 + 1f1b308: e34021f1 movt r2, #497 ; 0x1f1 + 1f1b30c: e1830400 orr r0, r3, r0, lsl #8 + 1f1b310: e5842018 str r2, [r4, #24] + 1f1b314: e3a03000 mov r3, #0 + 1f1b318: e1c400b0 strh r0, [r4] + 1f1b31c: e584301c str r3, [r4, #28] + 1f1b320: e8bd8010 pop {r4, pc} + +01f1b324 : + 1f1b324: e92d4010 push {r4, lr} + 1f1b328: e1a04000 mov r4, r0 + 1f1b32c: e5903010 ldr r3, [r0, #16] + 1f1b330: e1d000b0 ldrh r0, [r0] + 1f1b334: e12fff33 blx r3 + 1f1b338: e30c2ea4 movw r2, #52900 ; 0xcea4 + 1f1b33c: e34021f1 movt r2, #497 ; 0x1f1 + 1f1b340: e5842018 str r2, [r4, #24] + 1f1b344: e1d410b0 ldrh r1, [r4] + 1f1b348: e3a02000 mov r2, #0 + 1f1b34c: e5d4300b ldrb r3, [r4, #11] + 1f1b350: e584201c str r2, [r4, #28] + 1f1b354: e0833001 add r3, r3, r1 + 1f1b358: e1c430b0 strh r3, [r4] + 1f1b35c: e8bd8010 pop {r4, pc} + +01f1b360 : + 1f1b360: e92d4010 push {r4, lr} + 1f1b364: e1a04000 mov r4, r0 + 1f1b368: e1d000b6 ldrh r0, [r0, #6] + 1f1b36c: e2802001 add r2, r0, #1 + 1f1b370: e5943010 ldr r3, [r4, #16] + 1f1b374: e1c420b6 strh r2, [r4, #6] + 1f1b378: e12fff33 blx r3 + 1f1b37c: e30b3398 movw r3, #45976 ; 0xb398 + 1f1b380: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b384: e5843018 str r3, [r4, #24] + 1f1b388: e1c400b0 strh r0, [r4] + 1f1b38c: e3a03000 mov r3, #0 + 1f1b390: e584301c str r3, [r4, #28] + 1f1b394: e8bd8010 pop {r4, pc} + +01f1b398 : + 1f1b398: e92d4010 push {r4, lr} + 1f1b39c: e1a04000 mov r4, r0 + 1f1b3a0: e5903010 ldr r3, [r0, #16] + 1f1b3a4: e1d000b0 ldrh r0, [r0] + 1f1b3a8: e12fff33 blx r3 + 1f1b3ac: e30d3614 movw r3, #54804 ; 0xd614 + 1f1b3b0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b3b4: e5843018 str r3, [r4, #24] + 1f1b3b8: e3a03000 mov r3, #0 + 1f1b3bc: e584301c str r3, [r4, #28] + 1f1b3c0: e8bd8010 pop {r4, pc} + +01f1b3c4 : + 1f1b3c4: e92d4010 push {r4, lr} + 1f1b3c8: e1a04000 mov r4, r0 + 1f1b3cc: e1d000b6 ldrh r0, [r0, #6] + 1f1b3d0: e2802001 add r2, r0, #1 + 1f1b3d4: e5943010 ldr r3, [r4, #16] + 1f1b3d8: e1c420b6 strh r2, [r4, #6] + 1f1b3dc: e12fff33 blx r3 + 1f1b3e0: e30b33fc movw r3, #46076 ; 0xb3fc + 1f1b3e4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b3e8: e5843018 str r3, [r4, #24] + 1f1b3ec: e1c400b0 strh r0, [r4] + 1f1b3f0: e3a03000 mov r3, #0 + 1f1b3f4: e584301c str r3, [r4, #28] + 1f1b3f8: e8bd8010 pop {r4, pc} + +01f1b3fc : + 1f1b3fc: e92d4010 push {r4, lr} + 1f1b400: e1a04000 mov r4, r0 + 1f1b404: e5903010 ldr r3, [r0, #16] + 1f1b408: e1d000b0 ldrh r0, [r0] + 1f1b40c: e12fff33 blx r3 + 1f1b410: e30d31a4 movw r3, #53668 ; 0xd1a4 + 1f1b414: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b418: e5843018 str r3, [r4, #24] + 1f1b41c: e3a03000 mov r3, #0 + 1f1b420: e584301c str r3, [r4, #28] + 1f1b424: e8bd8010 pop {r4, pc} + +01f1b428 : + 1f1b428: e92d4010 push {r4, lr} + 1f1b42c: e1a04000 mov r4, r0 + 1f1b430: e1d000b6 ldrh r0, [r0, #6] + 1f1b434: e2802001 add r2, r0, #1 + 1f1b438: e5943010 ldr r3, [r4, #16] + 1f1b43c: e1c420b6 strh r2, [r4, #6] + 1f1b440: e12fff33 blx r3 + 1f1b444: e30b3460 movw r3, #46176 ; 0xb460 + 1f1b448: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b44c: e5843018 str r3, [r4, #24] + 1f1b450: e1c400b0 strh r0, [r4] + 1f1b454: e3a03000 mov r3, #0 + 1f1b458: e584301c str r3, [r4, #28] + 1f1b45c: e8bd8010 pop {r4, pc} + +01f1b460 : + 1f1b460: e92d4010 push {r4, lr} + 1f1b464: e1a04000 mov r4, r0 + 1f1b468: e5903010 ldr r3, [r0, #16] + 1f1b46c: e1d000b0 ldrh r0, [r0] + 1f1b470: e12fff33 blx r3 + 1f1b474: e30d35b0 movw r3, #54704 ; 0xd5b0 + 1f1b478: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b47c: e5843018 str r3, [r4, #24] + 1f1b480: e3a03000 mov r3, #0 + 1f1b484: e584301c str r3, [r4, #28] + 1f1b488: e8bd8010 pop {r4, pc} + +01f1b48c : + 1f1b48c: e92d4010 push {r4, lr} + 1f1b490: e1a04000 mov r4, r0 + 1f1b494: e1d000b6 ldrh r0, [r0, #6] + 1f1b498: e2802001 add r2, r0, #1 + 1f1b49c: e5943010 ldr r3, [r4, #16] + 1f1b4a0: e1c420b6 strh r2, [r4, #6] + 1f1b4a4: e12fff33 blx r3 + 1f1b4a8: e30b34c4 movw r3, #46276 ; 0xb4c4 + 1f1b4ac: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b4b0: e5843018 str r3, [r4, #24] + 1f1b4b4: e1c400b0 strh r0, [r4] + 1f1b4b8: e3a03000 mov r3, #0 + 1f1b4bc: e584301c str r3, [r4, #28] + 1f1b4c0: e8bd8010 pop {r4, pc} + +01f1b4c4 : + 1f1b4c4: e92d4010 push {r4, lr} + 1f1b4c8: e1a04000 mov r4, r0 + 1f1b4cc: e5903010 ldr r3, [r0, #16] + 1f1b4d0: e1d000b0 ldrh r0, [r0] + 1f1b4d4: e12fff33 blx r3 + 1f1b4d8: e30d314c movw r3, #53580 ; 0xd14c + 1f1b4dc: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b4e0: e5843018 str r3, [r4, #24] + 1f1b4e4: e3a03000 mov r3, #0 + 1f1b4e8: e584301c str r3, [r4, #28] + 1f1b4ec: e8bd8010 pop {r4, pc} + +01f1b4f0 : + 1f1b4f0: e92d4010 push {r4, lr} + 1f1b4f4: e1a04000 mov r4, r0 + 1f1b4f8: e1d000b6 ldrh r0, [r0, #6] + 1f1b4fc: e2802001 add r2, r0, #1 + 1f1b500: e5943010 ldr r3, [r4, #16] + 1f1b504: e1c420b6 strh r2, [r4, #6] + 1f1b508: e12fff33 blx r3 + 1f1b50c: e30b3528 movw r3, #46376 ; 0xb528 + 1f1b510: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b514: e5843018 str r3, [r4, #24] + 1f1b518: e1c400b2 strh r0, [r4, #2] + 1f1b51c: e3a03000 mov r3, #0 + 1f1b520: e584301c str r3, [r4, #28] + 1f1b524: e8bd8010 pop {r4, pc} + +01f1b528 : + 1f1b528: e92d4010 push {r4, lr} + 1f1b52c: e1a04000 mov r4, r0 + 1f1b530: e1d000b2 ldrh r0, [r0, #2] + 1f1b534: e5943010 ldr r3, [r4, #16] + 1f1b538: e2802001 add r2, r0, #1 + 1f1b53c: e1c420b2 strh r2, [r4, #2] + 1f1b540: e12fff33 blx r3 + 1f1b544: e30b3560 movw r3, #46432 ; 0xb560 + 1f1b548: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b54c: e5843018 str r3, [r4, #24] + 1f1b550: e1c400b0 strh r0, [r4] + 1f1b554: e3a03000 mov r3, #0 + 1f1b558: e584301c str r3, [r4, #28] + 1f1b55c: e8bd8010 pop {r4, pc} + +01f1b560 : + 1f1b560: e92d4010 push {r4, lr} + 1f1b564: e1a04000 mov r4, r0 + 1f1b568: e5903010 ldr r3, [r0, #16] + 1f1b56c: e5d00002 ldrb r0, [r0, #2] + 1f1b570: e12fff33 blx r3 + 1f1b574: e30c26ec movw r2, #50924 ; 0xc6ec + 1f1b578: e34021f1 movt r2, #497 ; 0x1f1 + 1f1b57c: e5842018 str r2, [r4, #24] + 1f1b580: e1d430b0 ldrh r3, [r4] + 1f1b584: e1830400 orr r0, r3, r0, lsl #8 + 1f1b588: e3a03000 mov r3, #0 + 1f1b58c: e1c400b0 strh r0, [r4] + 1f1b590: e584301c str r3, [r4, #28] + 1f1b594: e8bd8010 pop {r4, pc} + +01f1b598 : + 1f1b598: e92d4010 push {r4, lr} + 1f1b59c: e1a04000 mov r4, r0 + 1f1b5a0: e1d000b6 ldrh r0, [r0, #6] + 1f1b5a4: e2802001 add r2, r0, #1 + 1f1b5a8: e5943010 ldr r3, [r4, #16] + 1f1b5ac: e1c420b6 strh r2, [r4, #6] + 1f1b5b0: e12fff33 blx r3 + 1f1b5b4: e30b35d0 movw r3, #46544 ; 0xb5d0 + 1f1b5b8: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b5bc: e5843018 str r3, [r4, #24] + 1f1b5c0: e1c400b2 strh r0, [r4, #2] + 1f1b5c4: e3a03000 mov r3, #0 + 1f1b5c8: e584301c str r3, [r4, #28] + 1f1b5cc: e8bd8010 pop {r4, pc} + +01f1b5d0 : + 1f1b5d0: e92d4010 push {r4, lr} + 1f1b5d4: e1a04000 mov r4, r0 + 1f1b5d8: e1d000b2 ldrh r0, [r0, #2] + 1f1b5dc: e5943010 ldr r3, [r4, #16] + 1f1b5e0: e2802001 add r2, r0, #1 + 1f1b5e4: e1c420b2 strh r2, [r4, #2] + 1f1b5e8: e12fff33 blx r3 + 1f1b5ec: e30b3608 movw r3, #46600 ; 0xb608 + 1f1b5f0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b5f4: e5843018 str r3, [r4, #24] + 1f1b5f8: e1c400b0 strh r0, [r4] + 1f1b5fc: e3a03000 mov r3, #0 + 1f1b600: e584301c str r3, [r4, #28] + 1f1b604: e8bd8010 pop {r4, pc} + +01f1b608 : + 1f1b608: e92d4010 push {r4, lr} + 1f1b60c: e1a04000 mov r4, r0 + 1f1b610: e5903010 ldr r3, [r0, #16] + 1f1b614: e5d00002 ldrb r0, [r0, #2] + 1f1b618: e12fff33 blx r3 + 1f1b61c: e30b2640 movw r2, #46656 ; 0xb640 + 1f1b620: e34021f1 movt r2, #497 ; 0x1f1 + 1f1b624: e5842018 str r2, [r4, #24] + 1f1b628: e1d430b0 ldrh r3, [r4] + 1f1b62c: e1830400 orr r0, r3, r0, lsl #8 + 1f1b630: e3a03000 mov r3, #0 + 1f1b634: e1c400b0 strh r0, [r4] + 1f1b638: e584301c str r3, [r4, #28] + 1f1b63c: e8bd8010 pop {r4, pc} + +01f1b640 : + 1f1b640: e92d4010 push {r4, lr} + 1f1b644: e1a04000 mov r4, r0 + 1f1b648: e5d0300b ldrb r3, [r0, #11] + 1f1b64c: e1d000b0 ldrh r0, [r0] + 1f1b650: e5942010 ldr r2, [r4, #16] + 1f1b654: e0830000 add r0, r3, r0 + 1f1b658: e6ff0070 uxth r0, r0 + 1f1b65c: e1c400b0 strh r0, [r4] + 1f1b660: e12fff32 blx r2 + 1f1b664: e30c3ee8 movw r3, #52968 ; 0xcee8 + 1f1b668: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b66c: e5843018 str r3, [r4, #24] + 1f1b670: e3a03000 mov r3, #0 + 1f1b674: e584301c str r3, [r4, #28] + 1f1b678: e8bd8010 pop {r4, pc} + +01f1b67c : + 1f1b67c: e92d4010 push {r4, lr} + 1f1b680: e1a04000 mov r4, r0 + 1f1b684: e1d000b6 ldrh r0, [r0, #6] + 1f1b688: e2802001 add r2, r0, #1 + 1f1b68c: e5943010 ldr r3, [r4, #16] + 1f1b690: e1c420b6 strh r2, [r4, #6] + 1f1b694: e12fff33 blx r3 + 1f1b698: e30b36b4 movw r3, #46772 ; 0xb6b4 + 1f1b69c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b6a0: e5843018 str r3, [r4, #24] + 1f1b6a4: e1c400b2 strh r0, [r4, #2] + 1f1b6a8: e3a03000 mov r3, #0 + 1f1b6ac: e584301c str r3, [r4, #28] + 1f1b6b0: e8bd8010 pop {r4, pc} + +01f1b6b4 : + 1f1b6b4: e92d4010 push {r4, lr} + 1f1b6b8: e1a04000 mov r4, r0 + 1f1b6bc: e1d000b2 ldrh r0, [r0, #2] + 1f1b6c0: e5943010 ldr r3, [r4, #16] + 1f1b6c4: e2802001 add r2, r0, #1 + 1f1b6c8: e1c420b2 strh r2, [r4, #2] + 1f1b6cc: e12fff33 blx r3 + 1f1b6d0: e30b36ec movw r3, #46828 ; 0xb6ec + 1f1b6d4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b6d8: e5843018 str r3, [r4, #24] + 1f1b6dc: e1c400b0 strh r0, [r4] + 1f1b6e0: e3a03000 mov r3, #0 + 1f1b6e4: e584301c str r3, [r4, #28] + 1f1b6e8: e8bd8010 pop {r4, pc} + +01f1b6ec : + 1f1b6ec: e92d4010 push {r4, lr} + 1f1b6f0: e1a04000 mov r4, r0 + 1f1b6f4: e5903010 ldr r3, [r0, #16] + 1f1b6f8: e5d00002 ldrb r0, [r0, #2] + 1f1b6fc: e12fff33 blx r3 + 1f1b700: e30b2724 movw r2, #46884 ; 0xb724 + 1f1b704: e34021f1 movt r2, #497 ; 0x1f1 + 1f1b708: e5842018 str r2, [r4, #24] + 1f1b70c: e1d430b0 ldrh r3, [r4] + 1f1b710: e1830400 orr r0, r3, r0, lsl #8 + 1f1b714: e3a03000 mov r3, #0 + 1f1b718: e1c400b0 strh r0, [r4] + 1f1b71c: e584301c str r3, [r4, #28] + 1f1b720: e8bd8010 pop {r4, pc} + +01f1b724 : + 1f1b724: e92d4010 push {r4, lr} + 1f1b728: e1a04000 mov r4, r0 + 1f1b72c: e5d0300b ldrb r3, [r0, #11] + 1f1b730: e1d000b0 ldrh r0, [r0] + 1f1b734: e5942010 ldr r2, [r4, #16] + 1f1b738: e0830000 add r0, r3, r0 + 1f1b73c: e6ff0070 uxth r0, r0 + 1f1b740: e1c400b0 strh r0, [r4] + 1f1b744: e12fff32 blx r2 + 1f1b748: e30b3760 movw r3, #46944 ; 0xb760 + 1f1b74c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b750: e5843018 str r3, [r4, #24] + 1f1b754: e3a03000 mov r3, #0 + 1f1b758: e584301c str r3, [r4, #28] + 1f1b75c: e8bd8010 pop {r4, pc} + +01f1b760 : + 1f1b760: e92d4010 push {r4, lr} + 1f1b764: e1a04000 mov r4, r0 + 1f1b768: e5903010 ldr r3, [r0, #16] + 1f1b76c: e1d000b0 ldrh r0, [r0] + 1f1b770: e12fff33 blx r3 + 1f1b774: e30b3790 movw r3, #46992 ; 0xb790 + 1f1b778: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b77c: e5843018 str r3, [r4, #24] + 1f1b780: e1c400b4 strh r0, [r4, #4] + 1f1b784: e3a03000 mov r3, #0 + 1f1b788: e584301c str r3, [r4, #28] + 1f1b78c: e8bd8010 pop {r4, pc} + +01f1b790 : + 1f1b790: e92d4010 push {r4, lr} + 1f1b794: e1a04000 mov r4, r0 + 1f1b798: e5903014 ldr r3, [r0, #20] + 1f1b79c: e5d01004 ldrb r1, [r0, #4] + 1f1b7a0: e1d000b0 ldrh r0, [r0] + 1f1b7a4: e12fff33 blx r3 + 1f1b7a8: e30c3f2c movw r3, #53036 ; 0xcf2c + 1f1b7ac: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b7b0: e5843018 str r3, [r4, #24] + 1f1b7b4: e3a03000 mov r3, #0 + 1f1b7b8: e584301c str r3, [r4, #28] + 1f1b7bc: e8bd8010 pop {r4, pc} + +01f1b7c0 : + 1f1b7c0: e92d4010 push {r4, lr} + 1f1b7c4: e1a04000 mov r4, r0 + 1f1b7c8: e1d000b6 ldrh r0, [r0, #6] + 1f1b7cc: e2802001 add r2, r0, #1 + 1f1b7d0: e5943010 ldr r3, [r4, #16] + 1f1b7d4: e1c420b6 strh r2, [r4, #6] + 1f1b7d8: e12fff33 blx r3 + 1f1b7dc: e30b37f8 movw r3, #47096 ; 0xb7f8 + 1f1b7e0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b7e4: e5843018 str r3, [r4, #24] + 1f1b7e8: e1c400b0 strh r0, [r4] + 1f1b7ec: e3a03000 mov r3, #0 + 1f1b7f0: e584301c str r3, [r4, #28] + 1f1b7f4: e8bd8010 pop {r4, pc} + +01f1b7f8 : + 1f1b7f8: e92d4010 push {r4, lr} + 1f1b7fc: e1a04000 mov r4, r0 + 1f1b800: e5903010 ldr r3, [r0, #16] + 1f1b804: e1d000b0 ldrh r0, [r0] + 1f1b808: e12fff33 blx r3 + 1f1b80c: e30b3828 movw r3, #47144 ; 0xb828 + 1f1b810: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b814: e5843018 str r3, [r4, #24] + 1f1b818: e1c400b4 strh r0, [r4, #4] + 1f1b81c: e3a03000 mov r3, #0 + 1f1b820: e584301c str r3, [r4, #28] + 1f1b824: e8bd8010 pop {r4, pc} + +01f1b828 : + 1f1b828: e92d4010 push {r4, lr} + 1f1b82c: e1a04000 mov r4, r0 + 1f1b830: e5903014 ldr r3, [r0, #20] + 1f1b834: e5d01004 ldrb r1, [r0, #4] + 1f1b838: e1d000b0 ldrh r0, [r0] + 1f1b83c: e12fff33 blx r3 + 1f1b840: e30c3f70 movw r3, #53104 ; 0xcf70 + 1f1b844: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b848: e5843018 str r3, [r4, #24] + 1f1b84c: e3a03000 mov r3, #0 + 1f1b850: e584301c str r3, [r4, #28] + 1f1b854: e8bd8010 pop {r4, pc} + +01f1b858 : + 1f1b858: e92d4010 push {r4, lr} + 1f1b85c: e1a04000 mov r4, r0 + 1f1b860: e1d000b6 ldrh r0, [r0, #6] + 1f1b864: e2802001 add r2, r0, #1 + 1f1b868: e5943010 ldr r3, [r4, #16] + 1f1b86c: e1c420b6 strh r2, [r4, #6] + 1f1b870: e12fff33 blx r3 + 1f1b874: e30b3890 movw r3, #47248 ; 0xb890 + 1f1b878: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b87c: e5843018 str r3, [r4, #24] + 1f1b880: e1c400b0 strh r0, [r4] + 1f1b884: e3a03000 mov r3, #0 + 1f1b888: e584301c str r3, [r4, #28] + 1f1b88c: e8bd8010 pop {r4, pc} + +01f1b890 : + 1f1b890: e92d4010 push {r4, lr} + 1f1b894: e1a04000 mov r4, r0 + 1f1b898: e1d000b6 ldrh r0, [r0, #6] + 1f1b89c: e2802001 add r2, r0, #1 + 1f1b8a0: e5943010 ldr r3, [r4, #16] + 1f1b8a4: e1c420b6 strh r2, [r4, #6] + 1f1b8a8: e12fff33 blx r3 + 1f1b8ac: e1d430b0 ldrh r3, [r4] + 1f1b8b0: e30b28d0 movw r2, #47312 ; 0xb8d0 + 1f1b8b4: e34021f1 movt r2, #497 ; 0x1f1 + 1f1b8b8: e1830400 orr r0, r3, r0, lsl #8 + 1f1b8bc: e5842018 str r2, [r4, #24] + 1f1b8c0: e3a03000 mov r3, #0 + 1f1b8c4: e1c400b0 strh r0, [r4] + 1f1b8c8: e584301c str r3, [r4, #28] + 1f1b8cc: e8bd8010 pop {r4, pc} + +01f1b8d0 : + 1f1b8d0: e92d4010 push {r4, lr} + 1f1b8d4: e1a04000 mov r4, r0 + 1f1b8d8: e5903010 ldr r3, [r0, #16] + 1f1b8dc: e1d000b0 ldrh r0, [r0] + 1f1b8e0: e12fff33 blx r3 + 1f1b8e4: e30b3900 movw r3, #47360 ; 0xb900 + 1f1b8e8: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b8ec: e5843018 str r3, [r4, #24] + 1f1b8f0: e1c400b4 strh r0, [r4, #4] + 1f1b8f4: e3a03000 mov r3, #0 + 1f1b8f8: e584301c str r3, [r4, #28] + 1f1b8fc: e8bd8010 pop {r4, pc} + +01f1b900 : + 1f1b900: e92d4010 push {r4, lr} + 1f1b904: e1a04000 mov r4, r0 + 1f1b908: e5903014 ldr r3, [r0, #20] + 1f1b90c: e5d01004 ldrb r1, [r0, #4] + 1f1b910: e1d000b0 ldrh r0, [r0] + 1f1b914: e12fff33 blx r3 + 1f1b918: e30c3fb4 movw r3, #53172 ; 0xcfb4 + 1f1b91c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b920: e5843018 str r3, [r4, #24] + 1f1b924: e3a03000 mov r3, #0 + 1f1b928: e584301c str r3, [r4, #28] + 1f1b92c: e8bd8010 pop {r4, pc} + +01f1b930 : + 1f1b930: e92d4010 push {r4, lr} + 1f1b934: e1a04000 mov r4, r0 + 1f1b938: e1d000b6 ldrh r0, [r0, #6] + 1f1b93c: e2802001 add r2, r0, #1 + 1f1b940: e5943010 ldr r3, [r4, #16] + 1f1b944: e1c420b6 strh r2, [r4, #6] + 1f1b948: e12fff33 blx r3 + 1f1b94c: e30b3968 movw r3, #47464 ; 0xb968 + 1f1b950: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b954: e5843018 str r3, [r4, #24] + 1f1b958: e1c400b0 strh r0, [r4] + 1f1b95c: e3a03000 mov r3, #0 + 1f1b960: e584301c str r3, [r4, #28] + 1f1b964: e8bd8010 pop {r4, pc} + +01f1b968 : + 1f1b968: e92d4010 push {r4, lr} + 1f1b96c: e1a04000 mov r4, r0 + 1f1b970: e5903010 ldr r3, [r0, #16] + 1f1b974: e1d000b0 ldrh r0, [r0] + 1f1b978: e12fff33 blx r3 + 1f1b97c: e30b3994 movw r3, #47508 ; 0xb994 + 1f1b980: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b984: e5843018 str r3, [r4, #24] + 1f1b988: e3a03000 mov r3, #0 + 1f1b98c: e584301c str r3, [r4, #28] + 1f1b990: e8bd8010 pop {r4, pc} + +01f1b994 : + 1f1b994: e92d4010 push {r4, lr} + 1f1b998: e1a04000 mov r4, r0 + 1f1b99c: e5d0300a ldrb r3, [r0, #10] + 1f1b9a0: e1d000b0 ldrh r0, [r0] + 1f1b9a4: e5942010 ldr r2, [r4, #16] + 1f1b9a8: e0830000 add r0, r3, r0 + 1f1b9ac: e6ef0070 uxtb r0, r0 + 1f1b9b0: e1c400b0 strh r0, [r4] + 1f1b9b4: e12fff32 blx r2 + 1f1b9b8: e30b39d4 movw r3, #47572 ; 0xb9d4 + 1f1b9bc: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b9c0: e5843018 str r3, [r4, #24] + 1f1b9c4: e1c400b4 strh r0, [r4, #4] + 1f1b9c8: e3a03000 mov r3, #0 + 1f1b9cc: e584301c str r3, [r4, #28] + 1f1b9d0: e8bd8010 pop {r4, pc} + +01f1b9d4 : + 1f1b9d4: e92d4010 push {r4, lr} + 1f1b9d8: e1a04000 mov r4, r0 + 1f1b9dc: e5903014 ldr r3, [r0, #20] + 1f1b9e0: e5d01004 ldrb r1, [r0, #4] + 1f1b9e4: e1d000b0 ldrh r0, [r0] + 1f1b9e8: e12fff33 blx r3 + 1f1b9ec: e30c3ff8 movw r3, #53240 ; 0xcff8 + 1f1b9f0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1b9f4: e5843018 str r3, [r4, #24] + 1f1b9f8: e3a03000 mov r3, #0 + 1f1b9fc: e584301c str r3, [r4, #28] + 1f1ba00: e8bd8010 pop {r4, pc} + +01f1ba04 : + 1f1ba04: e92d4010 push {r4, lr} + 1f1ba08: e1a04000 mov r4, r0 + 1f1ba0c: e1d000b6 ldrh r0, [r0, #6] + 1f1ba10: e2802001 add r2, r0, #1 + 1f1ba14: e5943010 ldr r3, [r4, #16] + 1f1ba18: e1c420b6 strh r2, [r4, #6] + 1f1ba1c: e12fff33 blx r3 + 1f1ba20: e30b3a3c movw r3, #47676 ; 0xba3c + 1f1ba24: e34031f1 movt r3, #497 ; 0x1f1 + 1f1ba28: e5843018 str r3, [r4, #24] + 1f1ba2c: e1c400b0 strh r0, [r4] + 1f1ba30: e3a03000 mov r3, #0 + 1f1ba34: e584301c str r3, [r4, #28] + 1f1ba38: e8bd8010 pop {r4, pc} + +01f1ba3c : + 1f1ba3c: e92d4010 push {r4, lr} + 1f1ba40: e1a04000 mov r4, r0 + 1f1ba44: e1d000b6 ldrh r0, [r0, #6] + 1f1ba48: e2802001 add r2, r0, #1 + 1f1ba4c: e5943010 ldr r3, [r4, #16] + 1f1ba50: e1c420b6 strh r2, [r4, #6] + 1f1ba54: e12fff33 blx r3 + 1f1ba58: e1d430b0 ldrh r3, [r4] + 1f1ba5c: e30b2a7c movw r2, #47740 ; 0xba7c + 1f1ba60: e34021f1 movt r2, #497 ; 0x1f1 + 1f1ba64: e1830400 orr r0, r3, r0, lsl #8 + 1f1ba68: e5842018 str r2, [r4, #24] + 1f1ba6c: e3a03000 mov r3, #0 + 1f1ba70: e1c400b0 strh r0, [r4] + 1f1ba74: e584301c str r3, [r4, #28] + 1f1ba78: e8bd8010 pop {r4, pc} + +01f1ba7c : + 1f1ba7c: e92d4010 push {r4, lr} + 1f1ba80: e1a04000 mov r4, r0 + 1f1ba84: e5d0300a ldrb r3, [r0, #10] + 1f1ba88: e1d000b0 ldrh r0, [r0] + 1f1ba8c: e5942010 ldr r2, [r4, #16] + 1f1ba90: e0830000 add r0, r3, r0 + 1f1ba94: e6ff0070 uxth r0, r0 + 1f1ba98: e1c400b0 strh r0, [r4] + 1f1ba9c: e12fff32 blx r2 + 1f1baa0: e30b3ab8 movw r3, #47800 ; 0xbab8 + 1f1baa4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1baa8: e5843018 str r3, [r4, #24] + 1f1baac: e3a03000 mov r3, #0 + 1f1bab0: e584301c str r3, [r4, #28] + 1f1bab4: e8bd8010 pop {r4, pc} + +01f1bab8 : + 1f1bab8: e92d4010 push {r4, lr} + 1f1babc: e1a04000 mov r4, r0 + 1f1bac0: e5903010 ldr r3, [r0, #16] + 1f1bac4: e1d000b0 ldrh r0, [r0] + 1f1bac8: e12fff33 blx r3 + 1f1bacc: e30b3ae8 movw r3, #47848 ; 0xbae8 + 1f1bad0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bad4: e5843018 str r3, [r4, #24] + 1f1bad8: e1c400b4 strh r0, [r4, #4] + 1f1badc: e3a03000 mov r3, #0 + 1f1bae0: e584301c str r3, [r4, #28] + 1f1bae4: e8bd8010 pop {r4, pc} + +01f1bae8 : + 1f1bae8: e92d4010 push {r4, lr} + 1f1baec: e1a04000 mov r4, r0 + 1f1baf0: e5903014 ldr r3, [r0, #20] + 1f1baf4: e5d01004 ldrb r1, [r0, #4] + 1f1baf8: e1d000b0 ldrh r0, [r0] + 1f1bafc: e12fff33 blx r3 + 1f1bb00: e30d303c movw r3, #53308 ; 0xd03c + 1f1bb04: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bb08: e5843018 str r3, [r4, #24] + 1f1bb0c: e3a03000 mov r3, #0 + 1f1bb10: e584301c str r3, [r4, #28] + 1f1bb14: e8bd8010 pop {r4, pc} + +01f1bb18 : + 1f1bb18: e92d4010 push {r4, lr} + 1f1bb1c: e1a04000 mov r4, r0 + 1f1bb20: e1d000b6 ldrh r0, [r0, #6] + 1f1bb24: e2802001 add r2, r0, #1 + 1f1bb28: e5943010 ldr r3, [r4, #16] + 1f1bb2c: e1c420b6 strh r2, [r4, #6] + 1f1bb30: e12fff33 blx r3 + 1f1bb34: e30b3b50 movw r3, #47952 ; 0xbb50 + 1f1bb38: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bb3c: e5843018 str r3, [r4, #24] + 1f1bb40: e1c400b0 strh r0, [r4] + 1f1bb44: e3a03000 mov r3, #0 + 1f1bb48: e584301c str r3, [r4, #28] + 1f1bb4c: e8bd8010 pop {r4, pc} + +01f1bb50 : + 1f1bb50: e92d4010 push {r4, lr} + 1f1bb54: e1a04000 mov r4, r0 + 1f1bb58: e1d000b6 ldrh r0, [r0, #6] + 1f1bb5c: e2802001 add r2, r0, #1 + 1f1bb60: e5943010 ldr r3, [r4, #16] + 1f1bb64: e1c420b6 strh r2, [r4, #6] + 1f1bb68: e12fff33 blx r3 + 1f1bb6c: e1d430b0 ldrh r3, [r4] + 1f1bb70: e30b2b90 movw r2, #48016 ; 0xbb90 + 1f1bb74: e34021f1 movt r2, #497 ; 0x1f1 + 1f1bb78: e1830400 orr r0, r3, r0, lsl #8 + 1f1bb7c: e5842018 str r2, [r4, #24] + 1f1bb80: e3a03000 mov r3, #0 + 1f1bb84: e1c400b0 strh r0, [r4] + 1f1bb88: e584301c str r3, [r4, #28] + 1f1bb8c: e8bd8010 pop {r4, pc} + +01f1bb90 : + 1f1bb90: e92d4010 push {r4, lr} + 1f1bb94: e1a04000 mov r4, r0 + 1f1bb98: e5d0300b ldrb r3, [r0, #11] + 1f1bb9c: e1d000b0 ldrh r0, [r0] + 1f1bba0: e5942010 ldr r2, [r4, #16] + 1f1bba4: e0830000 add r0, r3, r0 + 1f1bba8: e6ff0070 uxth r0, r0 + 1f1bbac: e1c400b0 strh r0, [r4] + 1f1bbb0: e12fff32 blx r2 + 1f1bbb4: e30b3bcc movw r3, #48076 ; 0xbbcc + 1f1bbb8: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bbbc: e5843018 str r3, [r4, #24] + 1f1bbc0: e3a03000 mov r3, #0 + 1f1bbc4: e584301c str r3, [r4, #28] + 1f1bbc8: e8bd8010 pop {r4, pc} + +01f1bbcc : + 1f1bbcc: e92d4010 push {r4, lr} + 1f1bbd0: e1a04000 mov r4, r0 + 1f1bbd4: e5903010 ldr r3, [r0, #16] + 1f1bbd8: e1d000b0 ldrh r0, [r0] + 1f1bbdc: e12fff33 blx r3 + 1f1bbe0: e30b3bfc movw r3, #48124 ; 0xbbfc + 1f1bbe4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bbe8: e5843018 str r3, [r4, #24] + 1f1bbec: e1c400b4 strh r0, [r4, #4] + 1f1bbf0: e3a03000 mov r3, #0 + 1f1bbf4: e584301c str r3, [r4, #28] + 1f1bbf8: e8bd8010 pop {r4, pc} + +01f1bbfc : + 1f1bbfc: e92d4010 push {r4, lr} + 1f1bc00: e1a04000 mov r4, r0 + 1f1bc04: e5903014 ldr r3, [r0, #20] + 1f1bc08: e5d01004 ldrb r1, [r0, #4] + 1f1bc0c: e1d000b0 ldrh r0, [r0] + 1f1bc10: e12fff33 blx r3 + 1f1bc14: e30d3080 movw r3, #53376 ; 0xd080 + 1f1bc18: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bc1c: e5843018 str r3, [r4, #24] + 1f1bc20: e3a03000 mov r3, #0 + 1f1bc24: e584301c str r3, [r4, #28] + 1f1bc28: e8bd8010 pop {r4, pc} + +01f1bc2c : + 1f1bc2c: e92d4010 push {r4, lr} + 1f1bc30: e1a04000 mov r4, r0 + 1f1bc34: e5903010 ldr r3, [r0, #16] + 1f1bc38: e1d000b6 ldrh r0, [r0, #6] + 1f1bc3c: e12fff33 blx r3 + 1f1bc40: e30d30c4 movw r3, #53444 ; 0xd0c4 + 1f1bc44: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bc48: e5843018 str r3, [r4, #24] + 1f1bc4c: e3a03000 mov r3, #0 + 1f1bc50: e584301c str r3, [r4, #28] + 1f1bc54: e8bd8010 pop {r4, pc} + +01f1bc58 : + 1f1bc58: e92d4010 push {r4, lr} + 1f1bc5c: e1a04000 mov r4, r0 + 1f1bc60: e5903010 ldr r3, [r0, #16] + 1f1bc64: e1d000b6 ldrh r0, [r0, #6] + 1f1bc68: e12fff33 blx r3 + 1f1bc6c: e30b3c84 movw r3, #48260 ; 0xbc84 + 1f1bc70: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bc74: e5843018 str r3, [r4, #24] + 1f1bc78: e3a03000 mov r3, #0 + 1f1bc7c: e584301c str r3, [r4, #28] + 1f1bc80: e8bd8010 pop {r4, pc} + +01f1bc84 : + 1f1bc84: e92d4010 push {r4, lr} + 1f1bc88: e1a04000 mov r4, r0 + 1f1bc8c: e5d0000d ldrb r0, [r0, #13] + 1f1bc90: e5943010 ldr r3, [r4, #16] + 1f1bc94: e2800c01 add r0, r0, #256 ; 0x100 + 1f1bc98: e12fff33 blx r3 + 1f1bc9c: e30d3108 movw r3, #53512 ; 0xd108 + 1f1bca0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bca4: e5843018 str r3, [r4, #24] + 1f1bca8: e3a03000 mov r3, #0 + 1f1bcac: e584301c str r3, [r4, #28] + 1f1bcb0: e8bd8010 pop {r4, pc} + +01f1bcb4 : + 1f1bcb4: e92d4010 push {r4, lr} + 1f1bcb8: e1a04000 mov r4, r0 + 1f1bcbc: e1d000b6 ldrh r0, [r0, #6] + 1f1bcc0: e2802001 add r2, r0, #1 + 1f1bcc4: e5943010 ldr r3, [r4, #16] + 1f1bcc8: e1c420b6 strh r2, [r4, #6] + 1f1bccc: e12fff33 blx r3 + 1f1bcd0: e30b3cec movw r3, #48364 ; 0xbcec + 1f1bcd4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bcd8: e5843018 str r3, [r4, #24] + 1f1bcdc: e1c400b0 strh r0, [r4] + 1f1bce0: e3a03000 mov r3, #0 + 1f1bce4: e584301c str r3, [r4, #28] + 1f1bce8: e8bd8010 pop {r4, pc} + +01f1bcec : + 1f1bcec: e92d4010 push {r4, lr} + 1f1bcf0: e1a04000 mov r4, r0 + 1f1bcf4: e5d0000d ldrb r0, [r0, #13] + 1f1bcf8: e5943010 ldr r3, [r4, #16] + 1f1bcfc: e2800c01 add r0, r0, #256 ; 0x100 + 1f1bd00: e12fff33 blx r3 + 1f1bd04: e30b3d1c movw r3, #48412 ; 0xbd1c + 1f1bd08: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bd0c: e5843018 str r3, [r4, #24] + 1f1bd10: e3a03000 mov r3, #0 + 1f1bd14: e584301c str r3, [r4, #28] + 1f1bd18: e8bd8010 pop {r4, pc} + +01f1bd1c : + 1f1bd1c: e92d4010 push {r4, lr} + 1f1bd20: e1d010b6 ldrh r1, [r0, #6] + 1f1bd24: e1a04000 mov r4, r0 + 1f1bd28: e5d0000d ldrb r0, [r0, #13] + 1f1bd2c: e5943014 ldr r3, [r4, #20] + 1f1bd30: e2402001 sub r2, r0, #1 + 1f1bd34: e1a01421 lsr r1, r1, #8 + 1f1bd38: e2800c01 add r0, r0, #256 ; 0x100 + 1f1bd3c: e5c4200d strb r2, [r4, #13] + 1f1bd40: e12fff33 blx r3 + 1f1bd44: e30b3d5c movw r3, #48476 ; 0xbd5c + 1f1bd48: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bd4c: e5843018 str r3, [r4, #24] + 1f1bd50: e3a03000 mov r3, #0 + 1f1bd54: e584301c str r3, [r4, #28] + 1f1bd58: e8bd8010 pop {r4, pc} + +01f1bd5c : + 1f1bd5c: e92d4010 push {r4, lr} + 1f1bd60: e1a04000 mov r4, r0 + 1f1bd64: e5d0000d ldrb r0, [r0, #13] + 1f1bd68: e5d41006 ldrb r1, [r4, #6] + 1f1bd6c: e2403001 sub r3, r0, #1 + 1f1bd70: e2800c01 add r0, r0, #256 ; 0x100 + 1f1bd74: e5c4300d strb r3, [r4, #13] + 1f1bd78: e5943014 ldr r3, [r4, #20] + 1f1bd7c: e12fff33 blx r3 + 1f1bd80: e30d3744 movw r3, #55108 ; 0xd744 + 1f1bd84: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bd88: e5843018 str r3, [r4, #24] + 1f1bd8c: e3a03000 mov r3, #0 + 1f1bd90: e584301c str r3, [r4, #28] + 1f1bd94: e8bd8010 pop {r4, pc} + +01f1bd98 : + 1f1bd98: e92d4010 push {r4, lr} + 1f1bd9c: e1a04000 mov r4, r0 + 1f1bda0: e1d000b6 ldrh r0, [r0, #6] + 1f1bda4: e2802001 add r2, r0, #1 + 1f1bda8: e5943010 ldr r3, [r4, #16] + 1f1bdac: e1c420b6 strh r2, [r4, #6] + 1f1bdb0: e12fff33 blx r3 + 1f1bdb4: e30b3dcc movw r3, #48588 ; 0xbdcc + 1f1bdb8: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bdbc: e5843018 str r3, [r4, #24] + 1f1bdc0: e3a03000 mov r3, #0 + 1f1bdc4: e584301c str r3, [r4, #28] + 1f1bdc8: e8bd8010 pop {r4, pc} + +01f1bdcc : + 1f1bdcc: e92d4010 push {r4, lr} + 1f1bdd0: e1a04000 mov r4, r0 + 1f1bdd4: e5d0000d ldrb r0, [r0, #13] + 1f1bdd8: e5943010 ldr r3, [r4, #16] + 1f1bddc: e2800c01 add r0, r0, #256 ; 0x100 + 1f1bde0: e12fff33 blx r3 + 1f1bde4: e30b3dfc movw r3, #48636 ; 0xbdfc + 1f1bde8: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bdec: e5843018 str r3, [r4, #24] + 1f1bdf0: e3a03000 mov r3, #0 + 1f1bdf4: e584301c str r3, [r4, #28] + 1f1bdf8: e8bd8010 pop {r4, pc} + +01f1bdfc : + 1f1bdfc: e92d4010 push {r4, lr} + 1f1be00: e1a04000 mov r4, r0 + 1f1be04: e5d0000d ldrb r0, [r0, #13] + 1f1be08: e2800001 add r0, r0, #1 + 1f1be0c: e5943010 ldr r3, [r4, #16] + 1f1be10: e6ef0070 uxtb r0, r0 + 1f1be14: e5c4000d strb r0, [r4, #13] + 1f1be18: e2800c01 add r0, r0, #256 ; 0x100 + 1f1be1c: e12fff33 blx r3 + 1f1be20: e30b3e3c movw r3, #48700 ; 0xbe3c + 1f1be24: e34031f1 movt r3, #497 ; 0x1f1 + 1f1be28: e5843018 str r3, [r4, #24] + 1f1be2c: e5c4000c strb r0, [r4, #12] + 1f1be30: e3a03000 mov r3, #0 + 1f1be34: e584301c str r3, [r4, #28] + 1f1be38: e8bd8010 pop {r4, pc} + +01f1be3c : + 1f1be3c: e92d4010 push {r4, lr} + 1f1be40: e1a04000 mov r4, r0 + 1f1be44: e5d0000d ldrb r0, [r0, #13] + 1f1be48: e2800001 add r0, r0, #1 + 1f1be4c: e5943010 ldr r3, [r4, #16] + 1f1be50: e6ef0070 uxtb r0, r0 + 1f1be54: e5c4000d strb r0, [r4, #13] + 1f1be58: e2800c01 add r0, r0, #256 ; 0x100 + 1f1be5c: e12fff33 blx r3 + 1f1be60: e30d37b0 movw r3, #55216 ; 0xd7b0 + 1f1be64: e34031f1 movt r3, #497 ; 0x1f1 + 1f1be68: e5843018 str r3, [r4, #24] + 1f1be6c: e1c400b6 strh r0, [r4, #6] + 1f1be70: e3a03000 mov r3, #0 + 1f1be74: e584301c str r3, [r4, #28] + 1f1be78: e8bd8010 pop {r4, pc} + +01f1be7c : + 1f1be7c: e92d4010 push {r4, lr} + 1f1be80: e1a04000 mov r4, r0 + 1f1be84: e1d000b6 ldrh r0, [r0, #6] + 1f1be88: e2802001 add r2, r0, #1 + 1f1be8c: e5943010 ldr r3, [r4, #16] + 1f1be90: e1c420b6 strh r2, [r4, #6] + 1f1be94: e12fff33 blx r3 + 1f1be98: e30d3678 movw r3, #54904 ; 0xd678 + 1f1be9c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bea0: e5843018 str r3, [r4, #24] + 1f1bea4: e1c400b0 strh r0, [r4] + 1f1bea8: e3a03000 mov r3, #0 + 1f1beac: e584301c str r3, [r4, #28] + 1f1beb0: e8bd8010 pop {r4, pc} + +01f1beb4 : + 1f1beb4: e92d4010 push {r4, lr} + 1f1beb8: e1a04000 mov r4, r0 + 1f1bebc: e1d000b6 ldrh r0, [r0, #6] + 1f1bec0: e2802001 add r2, r0, #1 + 1f1bec4: e5943010 ldr r3, [r4, #16] + 1f1bec8: e1c420b6 strh r2, [r4, #6] + 1f1becc: e12fff33 blx r3 + 1f1bed0: e30b3eec movw r3, #48876 ; 0xbeec + 1f1bed4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bed8: e5843018 str r3, [r4, #24] + 1f1bedc: e1c400b2 strh r0, [r4, #2] + 1f1bee0: e3a03000 mov r3, #0 + 1f1bee4: e584301c str r3, [r4, #28] + 1f1bee8: e8bd8010 pop {r4, pc} + +01f1beec : + 1f1beec: e92d4010 push {r4, lr} + 1f1bef0: e1a04000 mov r4, r0 + 1f1bef4: e1d000b6 ldrh r0, [r0, #6] + 1f1bef8: e2802001 add r2, r0, #1 + 1f1befc: e5943010 ldr r3, [r4, #16] + 1f1bf00: e1c420b6 strh r2, [r4, #6] + 1f1bf04: e12fff33 blx r3 + 1f1bf08: e1d430b2 ldrh r3, [r4, #2] + 1f1bf0c: e30b2f2c movw r2, #48940 ; 0xbf2c + 1f1bf10: e34021f1 movt r2, #497 ; 0x1f1 + 1f1bf14: e1830400 orr r0, r3, r0, lsl #8 + 1f1bf18: e5842018 str r2, [r4, #24] + 1f1bf1c: e3a03000 mov r3, #0 + 1f1bf20: e1c400b2 strh r0, [r4, #2] + 1f1bf24: e584301c str r3, [r4, #28] + 1f1bf28: e8bd8010 pop {r4, pc} + +01f1bf2c : + 1f1bf2c: e92d4010 push {r4, lr} + 1f1bf30: e1a04000 mov r4, r0 + 1f1bf34: e1d000b2 ldrh r0, [r0, #2] + 1f1bf38: e5943010 ldr r3, [r4, #16] + 1f1bf3c: e2802001 add r2, r0, #1 + 1f1bf40: e1c420b2 strh r2, [r4, #2] + 1f1bf44: e12fff33 blx r3 + 1f1bf48: e30d3554 movw r3, #54612 ; 0xd554 + 1f1bf4c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bf50: e5843018 str r3, [r4, #24] + 1f1bf54: e1c400b0 strh r0, [r4] + 1f1bf58: e3a03000 mov r3, #0 + 1f1bf5c: e584301c str r3, [r4, #28] + 1f1bf60: e8bd8010 pop {r4, pc} + +01f1bf64 : + 1f1bf64: e92d4010 push {r4, lr} + 1f1bf68: e1a04000 mov r4, r0 + 1f1bf6c: e1d000b6 ldrh r0, [r0, #6] + 1f1bf70: e2802001 add r2, r0, #1 + 1f1bf74: e5943010 ldr r3, [r4, #16] + 1f1bf78: e1c420b6 strh r2, [r4, #6] + 1f1bf7c: e12fff33 blx r3 + 1f1bf80: e30b3f98 movw r3, #49048 ; 0xbf98 + 1f1bf84: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bf88: e5843018 str r3, [r4, #24] + 1f1bf8c: e3a03000 mov r3, #0 + 1f1bf90: e584301c str r3, [r4, #28] + 1f1bf94: e8bd8010 pop {r4, pc} + +01f1bf98 : + 1f1bf98: e92d4010 push {r4, lr} + 1f1bf9c: e1a04000 mov r4, r0 + 1f1bfa0: e5d0000d ldrb r0, [r0, #13] + 1f1bfa4: e5943010 ldr r3, [r4, #16] + 1f1bfa8: e2800c01 add r0, r0, #256 ; 0x100 + 1f1bfac: e12fff33 blx r3 + 1f1bfb0: e30b3fc8 movw r3, #49096 ; 0xbfc8 + 1f1bfb4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bfb8: e5843018 str r3, [r4, #24] + 1f1bfbc: e3a03000 mov r3, #0 + 1f1bfc0: e584301c str r3, [r4, #28] + 1f1bfc4: e8bd8010 pop {r4, pc} + +01f1bfc8 : + 1f1bfc8: e92d4010 push {r4, lr} + 1f1bfcc: e1a04000 mov r4, r0 + 1f1bfd0: e5d0000d ldrb r0, [r0, #13] + 1f1bfd4: e2800001 add r0, r0, #1 + 1f1bfd8: e5943010 ldr r3, [r4, #16] + 1f1bfdc: e6ef0070 uxtb r0, r0 + 1f1bfe0: e5c4000d strb r0, [r4, #13] + 1f1bfe4: e2800c01 add r0, r0, #256 ; 0x100 + 1f1bfe8: e12fff33 blx r3 + 1f1bfec: e30c3008 movw r3, #49160 ; 0xc008 + 1f1bff0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1bff4: e5843018 str r3, [r4, #24] + 1f1bff8: e1c400b6 strh r0, [r4, #6] + 1f1bffc: e3a03000 mov r3, #0 + 1f1c000: e584301c str r3, [r4, #28] + 1f1c004: e8bd8010 pop {r4, pc} + +01f1c008 : + 1f1c008: e92d4010 push {r4, lr} + 1f1c00c: e1a04000 mov r4, r0 + 1f1c010: e5d0000d ldrb r0, [r0, #13] + 1f1c014: e2800001 add r0, r0, #1 + 1f1c018: e5943010 ldr r3, [r4, #16] + 1f1c01c: e6ef0070 uxtb r0, r0 + 1f1c020: e5c4000d strb r0, [r4, #13] + 1f1c024: e2800c01 add r0, r0, #256 ; 0x100 + 1f1c028: e12fff33 blx r3 + 1f1c02c: e1d430b6 ldrh r3, [r4, #6] + 1f1c030: e30d249c movw r2, #54428 ; 0xd49c + 1f1c034: e34021f1 movt r2, #497 ; 0x1f1 + 1f1c038: e1830400 orr r0, r3, r0, lsl #8 + 1f1c03c: e5842018 str r2, [r4, #24] + 1f1c040: e3a03000 mov r3, #0 + 1f1c044: e1c400b6 strh r0, [r4, #6] + 1f1c048: e584301c str r3, [r4, #28] + 1f1c04c: e8bd8010 pop {r4, pc} + +01f1c050 : + 1f1c050: e92d4010 push {r4, lr} + 1f1c054: e1a04000 mov r4, r0 + 1f1c058: e5903010 ldr r3, [r0, #16] + 1f1c05c: e1d000b6 ldrh r0, [r0, #6] + 1f1c060: e12fff33 blx r3 + 1f1c064: e30c2088 movw r2, #49288 ; 0xc088 + 1f1c068: e34021f1 movt r2, #497 ; 0x1f1 + 1f1c06c: e5842018 str r2, [r4, #24] + 1f1c070: e1d430b6 ldrh r3, [r4, #6] + 1f1c074: e2833001 add r3, r3, #1 + 1f1c078: e1c430b6 strh r3, [r4, #6] + 1f1c07c: e3a03000 mov r3, #0 + 1f1c080: e584301c str r3, [r4, #28] + 1f1c084: e8bd8010 pop {r4, pc} + +01f1c088 : + 1f1c088: e92d4010 push {r4, lr} + 1f1c08c: e1d010b6 ldrh r1, [r0, #6] + 1f1c090: e1a04000 mov r4, r0 + 1f1c094: e5d0000d ldrb r0, [r0, #13] + 1f1c098: e5943014 ldr r3, [r4, #20] + 1f1c09c: e2402001 sub r2, r0, #1 + 1f1c0a0: e1a01421 lsr r1, r1, #8 + 1f1c0a4: e2800c01 add r0, r0, #256 ; 0x100 + 1f1c0a8: e5c4200d strb r2, [r4, #13] + 1f1c0ac: e12fff33 blx r3 + 1f1c0b0: e30c30c8 movw r3, #49352 ; 0xc0c8 + 1f1c0b4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c0b8: e5843018 str r3, [r4, #24] + 1f1c0bc: e3a03000 mov r3, #0 + 1f1c0c0: e584301c str r3, [r4, #28] + 1f1c0c4: e8bd8010 pop {r4, pc} + +01f1c0c8 : + 1f1c0c8: e92d4010 push {r4, lr} + 1f1c0cc: e1a04000 mov r4, r0 + 1f1c0d0: e5d0000d ldrb r0, [r0, #13] + 1f1c0d4: e5d41006 ldrb r1, [r4, #6] + 1f1c0d8: e2403001 sub r3, r0, #1 + 1f1c0dc: e2800c01 add r0, r0, #256 ; 0x100 + 1f1c0e0: e5c4300d strb r3, [r4, #13] + 1f1c0e4: e5943014 ldr r3, [r4, #20] + 1f1c0e8: e12fff33 blx r3 + 1f1c0ec: e30c3990 movw r3, #51600 ; 0xc990 + 1f1c0f0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c0f4: e5843018 str r3, [r4, #24] + 1f1c0f8: e3a03000 mov r3, #0 + 1f1c0fc: e584301c str r3, [r4, #28] + 1f1c100: e8bd8010 pop {r4, pc} + +01f1c104 : + 1f1c104: e92d4010 push {r4, lr} + 1f1c108: e1a04000 mov r4, r0 + 1f1c10c: e30f0ffe movw r0, #65534 ; 0xfffe + 1f1c110: e5943010 ldr r3, [r4, #16] + 1f1c114: e12fff33 blx r3 + 1f1c118: e30d36dc movw r3, #55004 ; 0xd6dc + 1f1c11c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c120: e5843018 str r3, [r4, #24] + 1f1c124: e1c400b0 strh r0, [r4] + 1f1c128: e3a03000 mov r3, #0 + 1f1c12c: e584301c str r3, [r4, #28] + 1f1c130: e8bd8010 pop {r4, pc} + +01f1c134 : + 1f1c134: e92d4010 push {r4, lr} + 1f1c138: e1a04000 mov r4, r0 + 1f1c13c: e5903010 ldr r3, [r0, #16] + 1f1c140: e1d000b6 ldrh r0, [r0, #6] + 1f1c144: e12fff33 blx r3 + 1f1c148: e30c3160 movw r3, #49504 ; 0xc160 + 1f1c14c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c150: e5843018 str r3, [r4, #24] + 1f1c154: e3a03000 mov r3, #0 + 1f1c158: e584301c str r3, [r4, #28] + 1f1c15c: e8bd8010 pop {r4, pc} + +01f1c160 : + 1f1c160: e92d4010 push {r4, lr} + 1f1c164: e1a04000 mov r4, r0 + 1f1c168: e5d0000d ldrb r0, [r0, #13] + 1f1c16c: e5943010 ldr r3, [r4, #16] + 1f1c170: e2402001 sub r2, r0, #1 + 1f1c174: e2800c01 add r0, r0, #256 ; 0x100 + 1f1c178: e5c4200d strb r2, [r4, #13] + 1f1c17c: e12fff33 blx r3 + 1f1c180: e30c3198 movw r3, #49560 ; 0xc198 + 1f1c184: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c188: e5843018 str r3, [r4, #24] + 1f1c18c: e3a03000 mov r3, #0 + 1f1c190: e584301c str r3, [r4, #28] + 1f1c194: e8bd8010 pop {r4, pc} + +01f1c198 : + 1f1c198: e92d4010 push {r4, lr} + 1f1c19c: e1a04000 mov r4, r0 + 1f1c1a0: e5d0000d ldrb r0, [r0, #13] + 1f1c1a4: e5943010 ldr r3, [r4, #16] + 1f1c1a8: e2402001 sub r2, r0, #1 + 1f1c1ac: e2800c01 add r0, r0, #256 ; 0x100 + 1f1c1b0: e5c4200d strb r2, [r4, #13] + 1f1c1b4: e12fff33 blx r3 + 1f1c1b8: e30c31d0 movw r3, #49616 ; 0xc1d0 + 1f1c1bc: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c1c0: e5843018 str r3, [r4, #24] + 1f1c1c4: e3a03000 mov r3, #0 + 1f1c1c8: e584301c str r3, [r4, #28] + 1f1c1cc: e8bd8010 pop {r4, pc} + +01f1c1d0 : + 1f1c1d0: e92d4010 push {r4, lr} + 1f1c1d4: e1a04000 mov r4, r0 + 1f1c1d8: e5d0300c ldrb r3, [r0, #12] + 1f1c1dc: e5d0000d ldrb r0, [r0, #13] + 1f1c1e0: e3c33010 bic r3, r3, #16 + 1f1c1e4: e5942010 ldr r2, [r4, #16] + 1f1c1e8: e5c4300c strb r3, [r4, #12] + 1f1c1ec: e2403001 sub r3, r0, #1 + 1f1c1f0: e2800c01 add r0, r0, #256 ; 0x100 + 1f1c1f4: e5c4300d strb r3, [r4, #13] + 1f1c1f8: e12fff32 blx r2 + 1f1c1fc: e30c3214 movw r3, #49684 ; 0xc214 + 1f1c200: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c204: e5843018 str r3, [r4, #24] + 1f1c208: e3a03000 mov r3, #0 + 1f1c20c: e584301c str r3, [r4, #28] + 1f1c210: e8bd8010 pop {r4, pc} + +01f1c214 : + 1f1c214: e92d4010 push {r4, lr} + 1f1c218: e1a04000 mov r4, r0 + 1f1c21c: e30f0ffc movw r0, #65532 ; 0xfffc + 1f1c220: e5943010 ldr r3, [r4, #16] + 1f1c224: e12fff33 blx r3 + 1f1c228: e30c3244 movw r3, #49732 ; 0xc244 + 1f1c22c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c230: e5843018 str r3, [r4, #24] + 1f1c234: e1c400b0 strh r0, [r4] + 1f1c238: e3a03000 mov r3, #0 + 1f1c23c: e584301c str r3, [r4, #28] + 1f1c240: e8bd8010 pop {r4, pc} + +01f1c244 : + 1f1c244: e92d4070 push {r4, r5, r6, lr} + 1f1c248: e1a04000 mov r4, r0 + 1f1c24c: e30f0ffd movw r0, #65533 ; 0xfffd + 1f1c250: e1d450f0 ldrsh r5, [r4] + 1f1c254: e5943010 ldr r3, [r4, #16] + 1f1c258: e12fff33 blx r3 + 1f1c25c: e30c382c movw r3, #51244 ; 0xc82c + 1f1c260: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c264: e5843018 str r3, [r4, #24] + 1f1c268: e1850400 orr r0, r5, r0, lsl #8 + 1f1c26c: e3a03000 mov r3, #0 + 1f1c270: e1c400b6 strh r0, [r4, #6] + 1f1c274: e584301c str r3, [r4, #28] + 1f1c278: e8bd8070 pop {r4, r5, r6, pc} + +01f1c27c : + 1f1c27c: e92d4010 push {r4, lr} + 1f1c280: e1a04000 mov r4, r0 + 1f1c284: e5903010 ldr r3, [r0, #16] + 1f1c288: e1d000b6 ldrh r0, [r0, #6] + 1f1c28c: e12fff33 blx r3 + 1f1c290: e30c32a8 movw r3, #49832 ; 0xc2a8 + 1f1c294: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c298: e5843018 str r3, [r4, #24] + 1f1c29c: e3a03000 mov r3, #0 + 1f1c2a0: e584301c str r3, [r4, #28] + 1f1c2a4: e8bd8010 pop {r4, pc} + +01f1c2a8 : + 1f1c2a8: e92d4010 push {r4, lr} + 1f1c2ac: e1d010b6 ldrh r1, [r0, #6] + 1f1c2b0: e1a04000 mov r4, r0 + 1f1c2b4: e5d0000d ldrb r0, [r0, #13] + 1f1c2b8: e5943014 ldr r3, [r4, #20] + 1f1c2bc: e2402001 sub r2, r0, #1 + 1f1c2c0: e1a01421 lsr r1, r1, #8 + 1f1c2c4: e2800c01 add r0, r0, #256 ; 0x100 + 1f1c2c8: e5c4200d strb r2, [r4, #13] + 1f1c2cc: e12fff33 blx r3 + 1f1c2d0: e30c32e8 movw r3, #49896 ; 0xc2e8 + 1f1c2d4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c2d8: e5843018 str r3, [r4, #24] + 1f1c2dc: e3a03000 mov r3, #0 + 1f1c2e0: e584301c str r3, [r4, #28] + 1f1c2e4: e8bd8010 pop {r4, pc} + +01f1c2e8 : + 1f1c2e8: e92d4010 push {r4, lr} + 1f1c2ec: e1a04000 mov r4, r0 + 1f1c2f0: e5d0000d ldrb r0, [r0, #13] + 1f1c2f4: e5d41006 ldrb r1, [r4, #6] + 1f1c2f8: e2403001 sub r3, r0, #1 + 1f1c2fc: e2800c01 add r0, r0, #256 ; 0x100 + 1f1c300: e5c4300d strb r3, [r4, #13] + 1f1c304: e5943014 ldr r3, [r4, #20] + 1f1c308: e12fff33 blx r3 + 1f1c30c: e30c37e4 movw r3, #51172 ; 0xc7e4 + 1f1c310: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c314: e5843018 str r3, [r4, #24] + 1f1c318: e3a03000 mov r3, #0 + 1f1c31c: e584301c str r3, [r4, #28] + 1f1c320: e8bd8010 pop {r4, pc} + +01f1c324 : + 1f1c324: e92d4010 push {r4, lr} + 1f1c328: e1a04000 mov r4, r0 + 1f1c32c: e30f0ffe movw r0, #65534 ; 0xfffe + 1f1c330: e5943010 ldr r3, [r4, #16] + 1f1c334: e12fff33 blx r3 + 1f1c338: e30c3354 movw r3, #50004 ; 0xc354 + 1f1c33c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c340: e5843018 str r3, [r4, #24] + 1f1c344: e1c400b0 strh r0, [r4] + 1f1c348: e3a03000 mov r3, #0 + 1f1c34c: e584301c str r3, [r4, #28] + 1f1c350: e8bd8010 pop {r4, pc} + +01f1c354 : + 1f1c354: e92d4070 push {r4, r5, r6, lr} + 1f1c358: e1a04000 mov r4, r0 + 1f1c35c: e30f0fff movw r0, #65535 ; 0xffff + 1f1c360: e5d4300c ldrb r3, [r4, #12] + 1f1c364: e1d450f0 ldrsh r5, [r4] + 1f1c368: e3833004 orr r3, r3, #4 + 1f1c36c: e5942010 ldr r2, [r4, #16] + 1f1c370: e5c4300c strb r3, [r4, #12] + 1f1c374: e12fff32 blx r2 + 1f1c378: e30c38c0 movw r3, #51392 ; 0xc8c0 + 1f1c37c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c380: e5843018 str r3, [r4, #24] + 1f1c384: e1850400 orr r0, r5, r0, lsl #8 + 1f1c388: e3a03000 mov r3, #0 + 1f1c38c: e1c400b6 strh r0, [r4, #6] + 1f1c390: e584301c str r3, [r4, #28] + 1f1c394: e8bd8070 pop {r4, r5, r6, pc} + +01f1c398 : + 1f1c398: e92d4030 push {r4, r5, lr} + 1f1c39c: e5d04009 ldrb r4, [r0, #9] + 1f1c3a0: e5d0100c ldrb r1, [r0, #12] + 1f1c3a4: e1d0c0b4 ldrh ip, [r0, #4] + 1f1c3a8: e6ffe074 uxth lr, r4 + 1f1c3ac: e2013001 and r3, r1, #1 + 1f1c3b0: e08e200c add r2, lr, ip + 1f1c3b4: e0833002 add r3, r3, r2 + 1f1c3b8: e6ff3073 uxth r3, r3 + 1f1c3bc: e31300ff tst r3, #255 ; 0xff + 1f1c3c0: 03811002 orreq r1, r1, #2 + 1f1c3c4: 120110fd andne r1, r1, #253 ; 0xfd + 1f1c3c8: e3110008 tst r1, #8 + 1f1c3cc: e5c0100c strb r1, [r0, #12] + 1f1c3d0: 0a000020 beq 1f1c458 + 1f1c3d4: e204200f and r2, r4, #15 + 1f1c3d8: e20c300f and r3, ip, #15 + 1f1c3dc: e0823003 add r3, r2, r3 + 1f1c3e0: e2012001 and r2, r1, #1 + 1f1c3e4: e0832002 add r2, r3, r2 + 1f1c3e8: e3520009 cmp r2, #9 + 1f1c3ec: 8a00002b bhi 1f1c4a0 + 1f1c3f0: e20440f0 and r4, r4, #240 ; 0xf0 + 1f1c3f4: e20c30f0 and r3, ip, #240 ; 0xf0 + 1f1c3f8: e0843003 add r3, r4, r3 + 1f1c3fc: e0823003 add r3, r2, r3 + 1f1c400: e6ff3073 uxth r3, r3 + 1f1c404: e6efc07c uxtb ip, ip + 1f1c408: e02ee003 eor lr, lr, r3 + 1f1c40c: e02cc003 eor ip, ip, r3 + 1f1c410: e2032e1f and r2, r3, #496 ; 0x1f0 + 1f1c414: e00ee00c and lr, lr, ip + 1f1c418: e31e0080 tst lr, #128 ; 0x80 + 1f1c41c: 13811040 orrne r1, r1, #64 ; 0x40 + 1f1c420: 020110bf andeq r1, r1, #191 ; 0xbf + 1f1c424: e3130080 tst r3, #128 ; 0x80 + 1f1c428: 13811080 orrne r1, r1, #128 ; 0x80 + 1f1c42c: 0201107f andeq r1, r1, #127 ; 0x7f + 1f1c430: e3520090 cmp r2, #144 ; 0x90 + 1f1c434: e5c0100c strb r1, [r0, #12] + 1f1c438: 82833060 addhi r3, r3, #96 ; 0x60 + 1f1c43c: 86ff3073 uxthhi r3, r3 + 1f1c440: e5c03009 strb r3, [r0, #9] + 1f1c444: e3130cff tst r3, #65280 ; 0xff00 + 1f1c448: 13811001 orrne r1, r1, #1 + 1f1c44c: 03c11001 biceq r1, r1, #1 + 1f1c450: e5c0100c strb r1, [r0, #12] + 1f1c454: e8bd8030 pop {r4, r5, pc} + 1f1c458: e6efc07c uxtb ip, ip + 1f1c45c: e02ee003 eor lr, lr, r3 + 1f1c460: e02cc003 eor ip, ip, r3 + 1f1c464: e3130cff tst r3, #65280 ; 0xff00 + 1f1c468: e00ee00c and lr, lr, ip + 1f1c46c: 13811001 orrne r1, r1, #1 + 1f1c470: 020110fe andeq r1, r1, #254 ; 0xfe + 1f1c474: e31e0080 tst lr, #128 ; 0x80 + 1f1c478: 13811040 orrne r1, r1, #64 ; 0x40 + 1f1c47c: 020110bf andeq r1, r1, #191 ; 0xbf + 1f1c480: e3130080 tst r3, #128 ; 0x80 + 1f1c484: e5c0100c strb r1, [r0, #12] + 1f1c488: 11e01c81 mvnne r1, r1, lsl #25 + 1f1c48c: 0201107f andeq r1, r1, #127 ; 0x7f + 1f1c490: e5c03009 strb r3, [r0, #9] + 1f1c494: 11e01ca1 mvnne r1, r1, lsr #25 + 1f1c498: e5c0100c strb r1, [r0, #12] + 1f1c49c: e8bd8030 pop {r4, r5, pc} + 1f1c4a0: e20c50f0 and r5, ip, #240 ; 0xf0 + 1f1c4a4: e2822006 add r2, r2, #6 + 1f1c4a8: e20430f0 and r3, r4, #240 ; 0xf0 + 1f1c4ac: e2855010 add r5, r5, #16 + 1f1c4b0: e202200f and r2, r2, #15 + 1f1c4b4: e0833005 add r3, r3, r5 + 1f1c4b8: e0823003 add r3, r2, r3 + 1f1c4bc: e6ff3073 uxth r3, r3 + 1f1c4c0: eaffffcf b 1f1c404 + +01f1c4c4 : + 1f1c4c4: e5d0300c ldrb r3, [r0, #12] + 1f1c4c8: e5d01009 ldrb r1, [r0, #9] + 1f1c4cc: e1d020b4 ldrh r2, [r0, #4] + 1f1c4d0: e3130008 tst r3, #8 + 1f1c4d4: e203c001 and ip, r3, #1 + 1f1c4d8: e0022001 and r2, r2, r1 + 1f1c4dc: 0a000022 beq 1f1c56c + 1f1c4e0: e182140c orr r1, r2, ip, lsl #8 + 1f1c4e4: e35c0000 cmp ip, #0 + 1f1c4e8: e92d4010 push {r4, lr} + 1f1c4ec: e1a010c1 asr r1, r1, #1 + 1f1c4f0: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1c4f4: 0203307f andeq r3, r3, #127 ; 0x7f + 1f1c4f8: e3510000 cmp r1, #0 + 1f1c4fc: e6ffe071 uxth lr, r1 + 1f1c500: 03833002 orreq r3, r3, #2 + 1f1c504: e022c00e eor ip, r2, lr + 1f1c508: 120330fd andne r3, r3, #253 ; 0xfd + 1f1c50c: e2024001 and r4, r2, #1 + 1f1c510: e31c0040 tst ip, #64 ; 0x40 + 1f1c514: e202c00f and ip, r2, #15 + 1f1c518: 13833040 orrne r3, r3, #64 ; 0x40 + 1f1c51c: e08cc004 add ip, ip, r4 + 1f1c520: 020330bf andeq r3, r3, #191 ; 0xbf + 1f1c524: e35c0005 cmp ip, #5 + 1f1c528: c28ee006 addgt lr, lr, #6 + 1f1c52c: c20110f0 andgt r1, r1, #240 ; 0xf0 + 1f1c530: c20ee00f andgt lr, lr, #15 + 1f1c534: c18ee001 orrgt lr, lr, r1 + 1f1c538: e20210f0 and r1, r2, #240 ; 0xf0 + 1f1c53c: e2022010 and r2, r2, #16 + 1f1c540: e0812002 add r2, r1, r2 + 1f1c544: e3520050 cmp r2, #80 ; 0x50 + 1f1c548: c28e2060 addgt r2, lr, #96 ; 0x60 + 1f1c54c: c20e100f andgt r1, lr, #15 + 1f1c550: c20220f0 andgt r2, r2, #240 ; 0xf0 + 1f1c554: c3833001 orrgt r3, r3, #1 + 1f1c558: c182e001 orrgt lr, r2, r1 + 1f1c55c: d20330fe andle r3, r3, #254 ; 0xfe + 1f1c560: e5c0e009 strb lr, [r0, #9] + 1f1c564: e5c0300c strb r3, [r0, #12] + 1f1c568: e8bd8010 pop {r4, pc} + 1f1c56c: e182240c orr r2, r2, ip, lsl #8 + 1f1c570: e1a020c2 asr r2, r2, #1 + 1f1c574: e3520000 cmp r2, #0 + 1f1c578: e6ff1072 uxth r1, r2 + 1f1c57c: 03833002 orreq r3, r3, #2 + 1f1c580: 0a000004 beq 1f1c598 + 1f1c584: e3110080 tst r1, #128 ; 0x80 + 1f1c588: e20330fd and r3, r3, #253 ; 0xfd + 1f1c58c: e5c0300c strb r3, [r0, #12] + 1f1c590: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1c594: 1a000000 bne 1f1c59c + 1f1c598: e203307f and r3, r3, #127 ; 0x7f + 1f1c59c: e2011040 and r1, r1, #64 ; 0x40 + 1f1c5a0: e1a0c082 lsl ip, r2, #1 + 1f1c5a4: e20cc040 and ip, ip, #64 ; 0x40 + 1f1c5a8: e5c02009 strb r2, [r0, #9] + 1f1c5ac: e6ff1071 uxth r1, r1 + 1f1c5b0: e3510000 cmp r1, #0 + 1f1c5b4: 13833001 orrne r3, r3, #1 + 1f1c5b8: 020330fe andeq r3, r3, #254 ; 0xfe + 1f1c5bc: e15c0001 cmp ip, r1 + 1f1c5c0: 13833040 orrne r3, r3, #64 ; 0x40 + 1f1c5c4: 020330bf andeq r3, r3, #191 ; 0xbf + 1f1c5c8: e5c0300c strb r3, [r0, #12] + 1f1c5cc: e12fff1e bx lr + +01f1c5d0 : + 1f1c5d0: e92d40f0 push {r4, r5, r6, r7, lr} + 1f1c5d4: e5d06009 ldrb r6, [r0, #9] + 1f1c5d8: e5d0300c ldrb r3, [r0, #12] + 1f1c5dc: e1d0c0b4 ldrh ip, [r0, #4] + 1f1c5e0: e6ff5076 uxth r5, r6 + 1f1c5e4: e203e001 and lr, r3, #1 + 1f1c5e8: e06c1005 rsb r1, ip, r5 + 1f1c5ec: e22e2001 eor r2, lr, #1 + 1f1c5f0: e0621001 rsb r1, r2, r1 + 1f1c5f4: e3130008 tst r3, #8 + 1f1c5f8: e6ff1071 uxth r1, r1 + 1f1c5fc: 0a000026 beq 1f1c69c + 1f1c600: e206e00f and lr, r6, #15 + 1f1c604: e20c700f and r7, ip, #15 + 1f1c608: e1a0400e mov r4, lr + 1f1c60c: e067e00e rsb lr, r7, lr + 1f1c610: e062e00e rsb lr, r2, lr + 1f1c614: e20660f0 and r6, r6, #240 ; 0xf0 + 1f1c618: e20c20f0 and r2, ip, #240 ; 0xf0 + 1f1c61c: e1e0c00c mvn ip, ip + 1f1c620: e6ffe07e uxth lr, lr + 1f1c624: e0255001 eor r5, r5, r1 + 1f1c628: e31e0010 tst lr, #16 + 1f1c62c: e6efc07c uxtb ip, ip + 1f1c630: 124ee006 subne lr, lr, #6 + 1f1c634: 10622006 rsbne r2, r2, r6 + 1f1c638: 120ee00f andne lr, lr, #15 + 1f1c63c: 12422010 subne r2, r2, #16 + 1f1c640: 00622006 rsbeq r2, r2, r6 + 1f1c644: e02cc001 eor ip, ip, r1 + 1f1c648: e182200e orr r2, r2, lr + 1f1c64c: e00cc005 and ip, ip, r5 + 1f1c650: e6ff2072 uxth r2, r2 + 1f1c654: e3120c01 tst r2, #256 ; 0x100 + 1f1c658: 12422060 subne r2, r2, #96 ; 0x60 + 1f1c65c: 16ff2072 uxthne r2, r2 + 1f1c660: e35100ff cmp r1, #255 ; 0xff + 1f1c664: 93833001 orrls r3, r3, #1 + 1f1c668: 820330fe andhi r3, r3, #254 ; 0xfe + 1f1c66c: e31c0080 tst ip, #128 ; 0x80 + 1f1c670: e5c02009 strb r2, [r0, #9] + 1f1c674: 13833040 orrne r3, r3, #64 ; 0x40 + 1f1c678: 020330bf andeq r3, r3, #191 ; 0xbf + 1f1c67c: e31100ff tst r1, #255 ; 0xff + 1f1c680: 03833002 orreq r3, r3, #2 + 1f1c684: 120330fd andne r3, r3, #253 ; 0xfd + 1f1c688: e3110080 tst r1, #128 ; 0x80 + 1f1c68c: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1c690: 0203307f andeq r3, r3, #127 ; 0x7f + 1f1c694: e5c0300c strb r3, [r0, #12] + 1f1c698: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f1c69c: e1e0c00c mvn ip, ip + 1f1c6a0: e31100ff tst r1, #255 ; 0xff + 1f1c6a4: 03833002 orreq r3, r3, #2 + 1f1c6a8: 120330fd andne r3, r3, #253 ; 0xfd + 1f1c6ac: e6efc07c uxtb ip, ip + 1f1c6b0: e3110080 tst r1, #128 ; 0x80 + 1f1c6b4: e0255001 eor r5, r5, r1 + 1f1c6b8: e02cc001 eor ip, ip, r1 + 1f1c6bc: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1c6c0: 0203307f andeq r3, r3, #127 ; 0x7f + 1f1c6c4: e00cc005 and ip, ip, r5 + 1f1c6c8: e35100ff cmp r1, #255 ; 0xff + 1f1c6cc: 93833001 orrls r3, r3, #1 + 1f1c6d0: 820330fe andhi r3, r3, #254 ; 0xfe + 1f1c6d4: e31c0080 tst ip, #128 ; 0x80 + 1f1c6d8: e5c01009 strb r1, [r0, #9] + 1f1c6dc: 13833040 orrne r3, r3, #64 ; 0x40 + 1f1c6e0: 020330bf andeq r3, r3, #191 ; 0xbf + 1f1c6e4: e5c0300c strb r3, [r0, #12] + 1f1c6e8: e8bd80f0 pop {r4, r5, r6, r7, pc} + +01f1c6ec : + 1f1c6ec: e92d4010 push {r4, lr} + 1f1c6f0: e1a04000 mov r4, r0 + 1f1c6f4: e1d030b0 ldrh r3, [r0] + 1f1c6f8: e5d0000b ldrb r0, [r0, #11] + 1f1c6fc: e2032cff and r2, r3, #65280 ; 0xff00 + 1f1c700: e0830000 add r0, r3, r0 + 1f1c704: e6ff0070 uxth r0, r0 + 1f1c708: e1c400b0 strh r0, [r4] + 1f1c70c: e2003cff and r3, r0, #65280 ; 0xff00 + 1f1c710: e1520003 cmp r2, r3 + 1f1c714: 0a000009 beq 1f1c740 + 1f1c718: e6ef0070 uxtb r0, r0 + 1f1c71c: e5943010 ldr r3, [r4, #16] + 1f1c720: e1800002 orr r0, r0, r2 + 1f1c724: e12fff33 blx r3 + 1f1c728: e30d324c movw r3, #53836 ; 0xd24c + 1f1c72c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c730: e5843018 str r3, [r4, #24] + 1f1c734: e3a03000 mov r3, #0 + 1f1c738: e584301c str r3, [r4, #28] + 1f1c73c: e8bd8010 pop {r4, pc} + 1f1c740: e5943010 ldr r3, [r4, #16] + 1f1c744: e12fff33 blx r3 + 1f1c748: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1c74c: e1c400b4 strh r0, [r4, #4] + 1f1c750: e3130001 tst r3, #1 + 1f1c754: 108400c3 addne r0, r4, r3, asr #1 + 1f1c758: 008400c3 addeq r0, r4, r3, asr #1 + 1f1c75c: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1c760: 15943020 ldrne r3, [r4, #32] + 1f1c764: 05943020 ldreq r3, [r4, #32] + 1f1c768: 17923003 ldrne r3, [r2, r3] + 1f1c76c: e12fff33 blx r3 + 1f1c770: e30c382c movw r3, #51244 ; 0xc82c + 1f1c774: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c778: e5843018 str r3, [r4, #24] + 1f1c77c: e3a03000 mov r3, #0 + 1f1c780: e584301c str r3, [r4, #28] + 1f1c784: e8bd8010 pop {r4, pc} + +01f1c788 : + 1f1c788: e92d4010 push {r4, lr} + 1f1c78c: e1a04000 mov r4, r0 + 1f1c790: e5903010 ldr r3, [r0, #16] + 1f1c794: e1d000b2 ldrh r0, [r0, #2] + 1f1c798: e12fff33 blx r3 + 1f1c79c: e1d410b2 ldrh r1, [r4, #2] + 1f1c7a0: e1d420b0 ldrh r2, [r4] + 1f1c7a4: e0812002 add r2, r1, r2 + 1f1c7a8: e6ff3072 uxth r3, r2 + 1f1c7ac: e1c430b6 strh r3, [r4, #6] + 1f1c7b0: e0233001 eor r3, r3, r1 + 1f1c7b4: e3130cff tst r3, #65280 ; 0xff00 + 1f1c7b8: 030c382c movweq r3, #51244 ; 0xc82c + 1f1c7bc: 130a3c7c movwne r3, #44156 ; 0xac7c + 1f1c7c0: 05d4200e ldrbeq r2, [r4, #14] + 1f1c7c4: 034031f1 movteq r3, #497 ; 0x1f1 + 1f1c7c8: 134031f1 movtne r3, #497 ; 0x1f1 + 1f1c7cc: e5843018 str r3, [r4, #24] + 1f1c7d0: 03822002 orreq r2, r2, #2 + 1f1c7d4: e3a03000 mov r3, #0 + 1f1c7d8: 05c4200e strbeq r2, [r4, #14] + 1f1c7dc: e584301c str r3, [r4, #28] + 1f1c7e0: e8bd8010 pop {r4, pc} + +01f1c7e4 : + 1f1c7e4: e92d4010 push {r4, lr} + 1f1c7e8: e1a04000 mov r4, r0 + 1f1c7ec: e5d0300c ldrb r3, [r0, #12] + 1f1c7f0: e5d0000d ldrb r0, [r0, #13] + 1f1c7f4: e20330ef and r3, r3, #239 ; 0xef + 1f1c7f8: e5942014 ldr r2, [r4, #20] + 1f1c7fc: e2401001 sub r1, r0, #1 + 1f1c800: e5c4300c strb r3, [r4, #12] + 1f1c804: e5c4100d strb r1, [r4, #13] + 1f1c808: e2800c01 add r0, r0, #256 ; 0x100 + 1f1c80c: e1a01003 mov r1, r3 + 1f1c810: e12fff32 blx r2 + 1f1c814: e30c3324 movw r3, #49956 ; 0xc324 + 1f1c818: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c81c: e5843018 str r3, [r4, #24] + 1f1c820: e3a03000 mov r3, #0 + 1f1c824: e584301c str r3, [r4, #28] + 1f1c828: e8bd8010 pop {r4, pc} + +01f1c82c : + 1f1c82c: e92d4010 push {r4, lr} + 1f1c830: e1a04000 mov r4, r0 + 1f1c834: e5903010 ldr r3, [r0, #16] + 1f1c838: e1d000b6 ldrh r0, [r0, #6] + 1f1c83c: e12fff33 blx r3 + 1f1c840: e5d4200e ldrb r2, [r4, #14] + 1f1c844: e5c40008 strb r0, [r4, #8] + 1f1c848: e3120004 tst r2, #4 + 1f1c84c: 0a00000a beq 1f1c87c + 1f1c850: e5d4300c ldrb r3, [r4, #12] + 1f1c854: e2033004 and r3, r3, #4 + 1f1c858: e21330ff ands r3, r3, #255 ; 0xff + 1f1c85c: 1a000006 bne 1f1c87c + 1f1c860: e7c22113 bfi r2, r3, #2, #1 + 1f1c864: e584301c str r3, [r4, #28] + 1f1c868: e5c4200e strb r2, [r4, #14] + 1f1c86c: e30c327c movw r3, #49788 ; 0xc27c + 1f1c870: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c874: e5843018 str r3, [r4, #24] + 1f1c878: e8bd8010 pop {r4, pc} + 1f1c87c: e1d430b6 ldrh r3, [r4, #6] + 1f1c880: e1a0c180 lsl ip, r0, #3 + 1f1c884: e3042b08 movw r2, #19208 ; 0x4b08 + 1f1c888: e34021f6 movt r2, #502 ; 0x1f6 + 1f1c88c: e082200c add r2, r2, ip + 1f1c890: e2833001 add r3, r3, #1 + 1f1c894: e284e018 add lr, r4, #24 + 1f1c898: e1c430b6 strh r3, [r4, #6] + 1f1c89c: e3043308 movw r3, #17160 ; 0x4308 + 1f1c8a0: e34031f6 movt r3, #502 ; 0x1f6 + 1f1c8a4: e8920003 ldm r2, {r0, r1} + 1f1c8a8: e083300c add r3, r3, ip + 1f1c8ac: e2844020 add r4, r4, #32 + 1f1c8b0: e88e0003 stm lr, {r0, r1} + 1f1c8b4: e8930003 ldm r3, {r0, r1} + 1f1c8b8: e8840003 stm r4, {r0, r1} + 1f1c8bc: e8bd8010 pop {r4, pc} + +01f1c8c0 : + 1f1c8c0: e92d4010 push {r4, lr} + 1f1c8c4: e1a04000 mov r4, r0 + 1f1c8c8: e1d000b6 ldrh r0, [r0, #6] + 1f1c8cc: e2802001 add r2, r0, #1 + 1f1c8d0: e5943010 ldr r3, [r4, #16] + 1f1c8d4: e1c420b6 strh r2, [r4, #6] + 1f1c8d8: e12fff33 blx r3 + 1f1c8dc: e3042b08 movw r2, #19208 ; 0x4b08 + 1f1c8e0: e34021f6 movt r2, #502 ; 0x1f6 + 1f1c8e4: e1a01180 lsl r1, r0, #3 + 1f1c8e8: e5c40008 strb r0, [r4, #8] + 1f1c8ec: e0822001 add r2, r2, r1 + 1f1c8f0: e284c018 add ip, r4, #24 + 1f1c8f4: e3043308 movw r3, #17160 ; 0x4308 + 1f1c8f8: e34031f6 movt r3, #502 ; 0x1f6 + 1f1c8fc: e0833001 add r3, r3, r1 + 1f1c900: e2844020 add r4, r4, #32 + 1f1c904: e8920003 ldm r2, {r0, r1} + 1f1c908: e88c0003 stm ip, {r0, r1} + 1f1c90c: e8930003 ldm r3, {r0, r1} + 1f1c910: e8840003 stm r4, {r0, r1} + 1f1c914: e8bd8010 pop {r4, pc} + +01f1c918 : + 1f1c918: e92d4010 push {r4, lr} + 1f1c91c: e1a04000 mov r4, r0 + 1f1c920: e1d000b6 ldrh r0, [r0, #6] + 1f1c924: e2802001 add r2, r0, #1 + 1f1c928: e5943010 ldr r3, [r4, #16] + 1f1c92c: e1c420b6 strh r2, [r4, #6] + 1f1c930: e12fff33 blx r3 + 1f1c934: e1d430dc ldrsb r3, [r4, #12] + 1f1c938: e3100080 tst r0, #128 ; 0x80 + 1f1c93c: e6ff0070 uxth r0, r0 + 1f1c940: 13800cff orrne r0, r0, #65280 ; 0xff00 + 1f1c944: e3530000 cmp r3, #0 + 1f1c948: a30c382c movwge r3, #51244 ; 0xc82c + 1f1c94c: e1c400b0 strh r0, [r4] + 1f1c950: a34031f1 movtge r3, #497 ; 0x1f1 + 1f1c954: ba000003 blt 1f1c968 + 1f1c958: e5843018 str r3, [r4, #24] + 1f1c95c: e3a03000 mov r3, #0 + 1f1c960: e584301c str r3, [r4, #28] + 1f1c964: e8bd8010 pop {r4, pc} + 1f1c968: e1d410b6 ldrh r1, [r4, #6] + 1f1c96c: e30c3788 movw r3, #51080 ; 0xc788 + 1f1c970: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c974: e0800001 add r0, r0, r1 + 1f1c978: e3c120ff bic r2, r1, #255 ; 0xff + 1f1c97c: e1c410b2 strh r1, [r4, #2] + 1f1c980: e6ef0070 uxtb r0, r0 + 1f1c984: e1800002 orr r0, r0, r2 + 1f1c988: e1c400b6 strh r0, [r4, #6] + 1f1c98c: eafffff1 b 1f1c958 + +01f1c990 : + 1f1c990: e92d4070 push {r4, r5, r6, lr} + 1f1c994: e1a04000 mov r4, r0 + 1f1c998: e5d0300e ldrb r3, [r0, #14] + 1f1c99c: e5d0100c ldrb r1, [r0, #12] + 1f1c9a0: e3130004 tst r3, #4 + 1f1c9a4: e5d0000d ldrb r0, [r0, #13] + 1f1c9a8: 0a000010 beq 1f1c9f0 + 1f1c9ac: e2012004 and r2, r1, #4 + 1f1c9b0: e21250ff ands r5, r2, #255 ; 0xff + 1f1c9b4: 1a00000d bne 1f1c9f0 + 1f1c9b8: e20110ef and r1, r1, #239 ; 0xef + 1f1c9bc: e7c23115 bfi r3, r5, #2, #1 + 1f1c9c0: e5c4100c strb r1, [r4, #12] + 1f1c9c4: e5c4300e strb r3, [r4, #14] + 1f1c9c8: e2403001 sub r3, r0, #1 + 1f1c9cc: e2800c01 add r0, r0, #256 ; 0x100 + 1f1c9d0: e5c4300d strb r3, [r4, #13] + 1f1c9d4: e5943014 ldr r3, [r4, #20] + 1f1c9d8: e12fff33 blx r3 + 1f1c9dc: e30c3324 movw r3, #49956 ; 0xc324 + 1f1c9e0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1c9e4: e5843018 str r3, [r4, #24] + 1f1c9e8: e584501c str r5, [r4, #28] + 1f1c9ec: e8bd8070 pop {r4, r5, r6, pc} + 1f1c9f0: e2402001 sub r2, r0, #1 + 1f1c9f4: e5943014 ldr r3, [r4, #20] + 1f1c9f8: e3811030 orr r1, r1, #48 ; 0x30 + 1f1c9fc: e2800c01 add r0, r0, #256 ; 0x100 + 1f1ca00: e5c4200d strb r2, [r4, #13] + 1f1ca04: e12fff33 blx r3 + 1f1ca08: e30c3104 movw r3, #49412 ; 0xc104 + 1f1ca0c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1ca10: e5843018 str r3, [r4, #24] + 1f1ca14: e3a03000 mov r3, #0 + 1f1ca18: e584301c str r3, [r4, #28] + 1f1ca1c: e8bd8070 pop {r4, r5, r6, pc} + +01f1ca20 : + 1f1ca20: e92d4010 push {r4, lr} + 1f1ca24: e1a04000 mov r4, r0 + 1f1ca28: e1d000b6 ldrh r0, [r0, #6] + 1f1ca2c: e2802001 add r2, r0, #1 + 1f1ca30: e5943010 ldr r3, [r4, #16] + 1f1ca34: e1c420b6 strh r2, [r4, #6] + 1f1ca38: e12fff33 blx r3 + 1f1ca3c: e1d430dc ldrsb r3, [r4, #12] + 1f1ca40: e3100080 tst r0, #128 ; 0x80 + 1f1ca44: e6ff0070 uxth r0, r0 + 1f1ca48: 13800cff orrne r0, r0, #65280 ; 0xff00 + 1f1ca4c: e3530000 cmp r3, #0 + 1f1ca50: e1c400b0 strh r0, [r4] + 1f1ca54: ba00000c blt 1f1ca8c + 1f1ca58: e1d410b6 ldrh r1, [r4, #6] + 1f1ca5c: e30c3788 movw r3, #51080 ; 0xc788 + 1f1ca60: e34031f1 movt r3, #497 ; 0x1f1 + 1f1ca64: e0800001 add r0, r0, r1 + 1f1ca68: e3c120ff bic r2, r1, #255 ; 0xff + 1f1ca6c: e1c410b2 strh r1, [r4, #2] + 1f1ca70: e6ef0070 uxtb r0, r0 + 1f1ca74: e1800002 orr r0, r0, r2 + 1f1ca78: e1c400b6 strh r0, [r4, #6] + 1f1ca7c: e5843018 str r3, [r4, #24] + 1f1ca80: e3a03000 mov r3, #0 + 1f1ca84: e584301c str r3, [r4, #28] + 1f1ca88: e8bd8010 pop {r4, pc} + 1f1ca8c: e30c382c movw r3, #51244 ; 0xc82c + 1f1ca90: e34031f1 movt r3, #497 ; 0x1f1 + 1f1ca94: eafffff8 b 1f1ca7c + +01f1ca98 : + 1f1ca98: e92d4010 push {r4, lr} + 1f1ca9c: e1a04000 mov r4, r0 + 1f1caa0: e1d000b6 ldrh r0, [r0, #6] + 1f1caa4: e2802001 add r2, r0, #1 + 1f1caa8: e5943010 ldr r3, [r4, #16] + 1f1caac: e1c420b6 strh r2, [r4, #6] + 1f1cab0: e12fff33 blx r3 + 1f1cab4: e5d4300c ldrb r3, [r4, #12] + 1f1cab8: e3100080 tst r0, #128 ; 0x80 + 1f1cabc: e6ff0070 uxth r0, r0 + 1f1cac0: 13800cff orrne r0, r0, #65280 ; 0xff00 + 1f1cac4: e3130001 tst r3, #1 + 1f1cac8: 030c382c movweq r3, #51244 ; 0xc82c + 1f1cacc: e1c400b0 strh r0, [r4] + 1f1cad0: 034031f1 movteq r3, #497 ; 0x1f1 + 1f1cad4: 0a000008 beq 1f1cafc + 1f1cad8: e1d410b6 ldrh r1, [r4, #6] + 1f1cadc: e30c3788 movw r3, #51080 ; 0xc788 + 1f1cae0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1cae4: e0800001 add r0, r0, r1 + 1f1cae8: e3c120ff bic r2, r1, #255 ; 0xff + 1f1caec: e1c410b2 strh r1, [r4, #2] + 1f1caf0: e6ef0070 uxtb r0, r0 + 1f1caf4: e1800002 orr r0, r0, r2 + 1f1caf8: e1c400b6 strh r0, [r4, #6] + 1f1cafc: e5843018 str r3, [r4, #24] + 1f1cb00: e3a03000 mov r3, #0 + 1f1cb04: e584301c str r3, [r4, #28] + 1f1cb08: e8bd8010 pop {r4, pc} + +01f1cb0c : + 1f1cb0c: e92d4010 push {r4, lr} + 1f1cb10: e1a04000 mov r4, r0 + 1f1cb14: e1d000b6 ldrh r0, [r0, #6] + 1f1cb18: e2802001 add r2, r0, #1 + 1f1cb1c: e5943010 ldr r3, [r4, #16] + 1f1cb20: e1c420b6 strh r2, [r4, #6] + 1f1cb24: e12fff33 blx r3 + 1f1cb28: e5d4300c ldrb r3, [r4, #12] + 1f1cb2c: e3100080 tst r0, #128 ; 0x80 + 1f1cb30: e6ff0070 uxth r0, r0 + 1f1cb34: 13800cff orrne r0, r0, #65280 ; 0xff00 + 1f1cb38: e3130002 tst r3, #2 + 1f1cb3c: 030c382c movweq r3, #51244 ; 0xc82c + 1f1cb40: e1c400b0 strh r0, [r4] + 1f1cb44: 034031f1 movteq r3, #497 ; 0x1f1 + 1f1cb48: 0a000008 beq 1f1cb70 + 1f1cb4c: e1d410b6 ldrh r1, [r4, #6] + 1f1cb50: e30c3788 movw r3, #51080 ; 0xc788 + 1f1cb54: e34031f1 movt r3, #497 ; 0x1f1 + 1f1cb58: e0800001 add r0, r0, r1 + 1f1cb5c: e3c120ff bic r2, r1, #255 ; 0xff + 1f1cb60: e1c410b2 strh r1, [r4, #2] + 1f1cb64: e6ef0070 uxtb r0, r0 + 1f1cb68: e1800002 orr r0, r0, r2 + 1f1cb6c: e1c400b6 strh r0, [r4, #6] + 1f1cb70: e5843018 str r3, [r4, #24] + 1f1cb74: e3a03000 mov r3, #0 + 1f1cb78: e584301c str r3, [r4, #28] + 1f1cb7c: e8bd8010 pop {r4, pc} + +01f1cb80 : + 1f1cb80: e92d4010 push {r4, lr} + 1f1cb84: e1a04000 mov r4, r0 + 1f1cb88: e1d000b6 ldrh r0, [r0, #6] + 1f1cb8c: e2802001 add r2, r0, #1 + 1f1cb90: e5943010 ldr r3, [r4, #16] + 1f1cb94: e1c420b6 strh r2, [r4, #6] + 1f1cb98: e12fff33 blx r3 + 1f1cb9c: e5d4300c ldrb r3, [r4, #12] + 1f1cba0: e3100080 tst r0, #128 ; 0x80 + 1f1cba4: e6ff0070 uxth r0, r0 + 1f1cba8: 13800cff orrne r0, r0, #65280 ; 0xff00 + 1f1cbac: e3130001 tst r3, #1 + 1f1cbb0: 130c382c movwne r3, #51244 ; 0xc82c + 1f1cbb4: e1c400b0 strh r0, [r4] + 1f1cbb8: 134031f1 movtne r3, #497 ; 0x1f1 + 1f1cbbc: 1a000008 bne 1f1cbe4 + 1f1cbc0: e1d410b6 ldrh r1, [r4, #6] + 1f1cbc4: e30c3788 movw r3, #51080 ; 0xc788 + 1f1cbc8: e34031f1 movt r3, #497 ; 0x1f1 + 1f1cbcc: e0800001 add r0, r0, r1 + 1f1cbd0: e3c120ff bic r2, r1, #255 ; 0xff + 1f1cbd4: e1c410b2 strh r1, [r4, #2] + 1f1cbd8: e6ef0070 uxtb r0, r0 + 1f1cbdc: e1800002 orr r0, r0, r2 + 1f1cbe0: e1c400b6 strh r0, [r4, #6] + 1f1cbe4: e5843018 str r3, [r4, #24] + 1f1cbe8: e3a03000 mov r3, #0 + 1f1cbec: e584301c str r3, [r4, #28] + 1f1cbf0: e8bd8010 pop {r4, pc} + +01f1cbf4 : + 1f1cbf4: e92d4010 push {r4, lr} + 1f1cbf8: e1a04000 mov r4, r0 + 1f1cbfc: e1d000b6 ldrh r0, [r0, #6] + 1f1cc00: e2802001 add r2, r0, #1 + 1f1cc04: e5943010 ldr r3, [r4, #16] + 1f1cc08: e1c420b6 strh r2, [r4, #6] + 1f1cc0c: e12fff33 blx r3 + 1f1cc10: e5d4300c ldrb r3, [r4, #12] + 1f1cc14: e3100080 tst r0, #128 ; 0x80 + 1f1cc18: e6ff0070 uxth r0, r0 + 1f1cc1c: 13800cff orrne r0, r0, #65280 ; 0xff00 + 1f1cc20: e3130040 tst r3, #64 ; 0x40 + 1f1cc24: 130c382c movwne r3, #51244 ; 0xc82c + 1f1cc28: e1c400b0 strh r0, [r4] + 1f1cc2c: 134031f1 movtne r3, #497 ; 0x1f1 + 1f1cc30: 1a000008 bne 1f1cc58 + 1f1cc34: e1d410b6 ldrh r1, [r4, #6] + 1f1cc38: e30c3788 movw r3, #51080 ; 0xc788 + 1f1cc3c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1cc40: e0800001 add r0, r0, r1 + 1f1cc44: e3c120ff bic r2, r1, #255 ; 0xff + 1f1cc48: e1c410b2 strh r1, [r4, #2] + 1f1cc4c: e6ef0070 uxtb r0, r0 + 1f1cc50: e1800002 orr r0, r0, r2 + 1f1cc54: e1c400b6 strh r0, [r4, #6] + 1f1cc58: e5843018 str r3, [r4, #24] + 1f1cc5c: e3a03000 mov r3, #0 + 1f1cc60: e584301c str r3, [r4, #28] + 1f1cc64: e8bd8010 pop {r4, pc} + +01f1cc68 : + 1f1cc68: e92d4010 push {r4, lr} + 1f1cc6c: e1a04000 mov r4, r0 + 1f1cc70: e1d000b6 ldrh r0, [r0, #6] + 1f1cc74: e2802001 add r2, r0, #1 + 1f1cc78: e5943010 ldr r3, [r4, #16] + 1f1cc7c: e1c420b6 strh r2, [r4, #6] + 1f1cc80: e12fff33 blx r3 + 1f1cc84: e5d4300c ldrb r3, [r4, #12] + 1f1cc88: e3100080 tst r0, #128 ; 0x80 + 1f1cc8c: e6ff0070 uxth r0, r0 + 1f1cc90: 13800cff orrne r0, r0, #65280 ; 0xff00 + 1f1cc94: e3130002 tst r3, #2 + 1f1cc98: 130c382c movwne r3, #51244 ; 0xc82c + 1f1cc9c: e1c400b0 strh r0, [r4] + 1f1cca0: 134031f1 movtne r3, #497 ; 0x1f1 + 1f1cca4: 1a000008 bne 1f1cccc + 1f1cca8: e1d410b6 ldrh r1, [r4, #6] + 1f1ccac: e30c3788 movw r3, #51080 ; 0xc788 + 1f1ccb0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1ccb4: e0800001 add r0, r0, r1 + 1f1ccb8: e3c120ff bic r2, r1, #255 ; 0xff + 1f1ccbc: e1c410b2 strh r1, [r4, #2] + 1f1ccc0: e6ef0070 uxtb r0, r0 + 1f1ccc4: e1800002 orr r0, r0, r2 + 1f1ccc8: e1c400b6 strh r0, [r4, #6] + 1f1cccc: e5843018 str r3, [r4, #24] + 1f1ccd0: e3a03000 mov r3, #0 + 1f1ccd4: e584301c str r3, [r4, #28] + 1f1ccd8: e8bd8010 pop {r4, pc} + +01f1ccdc : + 1f1ccdc: e92d4010 push {r4, lr} + 1f1cce0: e1a04000 mov r4, r0 + 1f1cce4: e1d000b6 ldrh r0, [r0, #6] + 1f1cce8: e2802001 add r2, r0, #1 + 1f1ccec: e5943010 ldr r3, [r4, #16] + 1f1ccf0: e1c420b6 strh r2, [r4, #6] + 1f1ccf4: e12fff33 blx r3 + 1f1ccf8: e5d4300c ldrb r3, [r4, #12] + 1f1ccfc: e3100080 tst r0, #128 ; 0x80 + 1f1cd00: e6ff0070 uxth r0, r0 + 1f1cd04: 13800cff orrne r0, r0, #65280 ; 0xff00 + 1f1cd08: e3130040 tst r3, #64 ; 0x40 + 1f1cd0c: 030c382c movweq r3, #51244 ; 0xc82c + 1f1cd10: e1c400b0 strh r0, [r4] + 1f1cd14: 034031f1 movteq r3, #497 ; 0x1f1 + 1f1cd18: 0a000008 beq 1f1cd40 + 1f1cd1c: e1d410b6 ldrh r1, [r4, #6] + 1f1cd20: e30c3788 movw r3, #51080 ; 0xc788 + 1f1cd24: e34031f1 movt r3, #497 ; 0x1f1 + 1f1cd28: e0800001 add r0, r0, r1 + 1f1cd2c: e3c120ff bic r2, r1, #255 ; 0xff + 1f1cd30: e1c410b2 strh r1, [r4, #2] + 1f1cd34: e6ef0070 uxtb r0, r0 + 1f1cd38: e1800002 orr r0, r0, r2 + 1f1cd3c: e1c400b6 strh r0, [r4, #6] + 1f1cd40: e5843018 str r3, [r4, #24] + 1f1cd44: e3a03000 mov r3, #0 + 1f1cd48: e584301c str r3, [r4, #28] + 1f1cd4c: e8bd8010 pop {r4, pc} + +01f1cd50 : + 1f1cd50: e92d4010 push {r4, lr} + 1f1cd54: e1a04000 mov r4, r0 + 1f1cd58: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1cd5c: e3100001 tst r0, #1 + 1f1cd60: 008400c0 addeq r0, r4, r0, asr #1 + 1f1cd64: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1cd68: 108400c0 addne r0, r4, r0, asr #1 + 1f1cd6c: 15943020 ldrne r3, [r4, #32] + 1f1cd70: 05943020 ldreq r3, [r4, #32] + 1f1cd74: 17923003 ldrne r3, [r2, r3] + 1f1cd78: e12fff33 blx r3 + 1f1cd7c: e30c382c movw r3, #51244 ; 0xc82c + 1f1cd80: e34031f1 movt r3, #497 ; 0x1f1 + 1f1cd84: e5843018 str r3, [r4, #24] + 1f1cd88: e3a03000 mov r3, #0 + 1f1cd8c: e584301c str r3, [r4, #28] + 1f1cd90: e8bd8010 pop {r4, pc} + +01f1cd94 : + 1f1cd94: e92d4010 push {r4, lr} + 1f1cd98: e1a04000 mov r4, r0 + 1f1cd9c: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1cda0: e3100001 tst r0, #1 + 1f1cda4: 008400c0 addeq r0, r4, r0, asr #1 + 1f1cda8: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1cdac: 108400c0 addne r0, r4, r0, asr #1 + 1f1cdb0: 15943020 ldrne r3, [r4, #32] + 1f1cdb4: 05943020 ldreq r3, [r4, #32] + 1f1cdb8: 17923003 ldrne r3, [r2, r3] + 1f1cdbc: e12fff33 blx r3 + 1f1cdc0: e30c382c movw r3, #51244 ; 0xc82c + 1f1cdc4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1cdc8: e5843018 str r3, [r4, #24] + 1f1cdcc: e3a03000 mov r3, #0 + 1f1cdd0: e584301c str r3, [r4, #28] + 1f1cdd4: e8bd8010 pop {r4, pc} + +01f1cdd8 : + 1f1cdd8: e92d4010 push {r4, lr} + 1f1cddc: e1a04000 mov r4, r0 + 1f1cde0: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1cde4: e3100001 tst r0, #1 + 1f1cde8: 008400c0 addeq r0, r4, r0, asr #1 + 1f1cdec: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1cdf0: 108400c0 addne r0, r4, r0, asr #1 + 1f1cdf4: 15943020 ldrne r3, [r4, #32] + 1f1cdf8: 05943020 ldreq r3, [r4, #32] + 1f1cdfc: 17923003 ldrne r3, [r2, r3] + 1f1ce00: e12fff33 blx r3 + 1f1ce04: e30c382c movw r3, #51244 ; 0xc82c + 1f1ce08: e34031f1 movt r3, #497 ; 0x1f1 + 1f1ce0c: e5843018 str r3, [r4, #24] + 1f1ce10: e3a03000 mov r3, #0 + 1f1ce14: e584301c str r3, [r4, #28] + 1f1ce18: e8bd8010 pop {r4, pc} + +01f1ce1c : + 1f1ce1c: e92d4010 push {r4, lr} + 1f1ce20: e1a04000 mov r4, r0 + 1f1ce24: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1ce28: e3100001 tst r0, #1 + 1f1ce2c: 008400c0 addeq r0, r4, r0, asr #1 + 1f1ce30: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1ce34: 108400c0 addne r0, r4, r0, asr #1 + 1f1ce38: 15943020 ldrne r3, [r4, #32] + 1f1ce3c: 05943020 ldreq r3, [r4, #32] + 1f1ce40: 17923003 ldrne r3, [r2, r3] + 1f1ce44: e12fff33 blx r3 + 1f1ce48: e30c382c movw r3, #51244 ; 0xc82c + 1f1ce4c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1ce50: e5843018 str r3, [r4, #24] + 1f1ce54: e3a03000 mov r3, #0 + 1f1ce58: e584301c str r3, [r4, #28] + 1f1ce5c: e8bd8010 pop {r4, pc} + +01f1ce60 : + 1f1ce60: e92d4010 push {r4, lr} + 1f1ce64: e1a04000 mov r4, r0 + 1f1ce68: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1ce6c: e3100001 tst r0, #1 + 1f1ce70: 008400c0 addeq r0, r4, r0, asr #1 + 1f1ce74: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1ce78: 108400c0 addne r0, r4, r0, asr #1 + 1f1ce7c: 15943020 ldrne r3, [r4, #32] + 1f1ce80: 05943020 ldreq r3, [r4, #32] + 1f1ce84: 17923003 ldrne r3, [r2, r3] + 1f1ce88: e12fff33 blx r3 + 1f1ce8c: e30c382c movw r3, #51244 ; 0xc82c + 1f1ce90: e34031f1 movt r3, #497 ; 0x1f1 + 1f1ce94: e5843018 str r3, [r4, #24] + 1f1ce98: e3a03000 mov r3, #0 + 1f1ce9c: e584301c str r3, [r4, #28] + 1f1cea0: e8bd8010 pop {r4, pc} + +01f1cea4 : + 1f1cea4: e92d4010 push {r4, lr} + 1f1cea8: e1a04000 mov r4, r0 + 1f1ceac: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1ceb0: e3100001 tst r0, #1 + 1f1ceb4: 008400c0 addeq r0, r4, r0, asr #1 + 1f1ceb8: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1cebc: 108400c0 addne r0, r4, r0, asr #1 + 1f1cec0: 15943020 ldrne r3, [r4, #32] + 1f1cec4: 05943020 ldreq r3, [r4, #32] + 1f1cec8: 17923003 ldrne r3, [r2, r3] + 1f1cecc: e12fff33 blx r3 + 1f1ced0: e30c382c movw r3, #51244 ; 0xc82c + 1f1ced4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1ced8: e5843018 str r3, [r4, #24] + 1f1cedc: e3a03000 mov r3, #0 + 1f1cee0: e584301c str r3, [r4, #28] + 1f1cee4: e8bd8010 pop {r4, pc} + +01f1cee8 : + 1f1cee8: e92d4010 push {r4, lr} + 1f1ceec: e1a04000 mov r4, r0 + 1f1cef0: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1cef4: e3100001 tst r0, #1 + 1f1cef8: 008400c0 addeq r0, r4, r0, asr #1 + 1f1cefc: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1cf00: 108400c0 addne r0, r4, r0, asr #1 + 1f1cf04: 15943020 ldrne r3, [r4, #32] + 1f1cf08: 05943020 ldreq r3, [r4, #32] + 1f1cf0c: 17923003 ldrne r3, [r2, r3] + 1f1cf10: e12fff33 blx r3 + 1f1cf14: e30c382c movw r3, #51244 ; 0xc82c + 1f1cf18: e34031f1 movt r3, #497 ; 0x1f1 + 1f1cf1c: e5843018 str r3, [r4, #24] + 1f1cf20: e3a03000 mov r3, #0 + 1f1cf24: e584301c str r3, [r4, #28] + 1f1cf28: e8bd8010 pop {r4, pc} + +01f1cf2c : + 1f1cf2c: e92d4010 push {r4, lr} + 1f1cf30: e1a04000 mov r4, r0 + 1f1cf34: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1cf38: e3100001 tst r0, #1 + 1f1cf3c: 008400c0 addeq r0, r4, r0, asr #1 + 1f1cf40: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1cf44: 108400c0 addne r0, r4, r0, asr #1 + 1f1cf48: 15943020 ldrne r3, [r4, #32] + 1f1cf4c: 05943020 ldreq r3, [r4, #32] + 1f1cf50: 17923003 ldrne r3, [r2, r3] + 1f1cf54: e12fff33 blx r3 + 1f1cf58: e30c382c movw r3, #51244 ; 0xc82c + 1f1cf5c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1cf60: e5843018 str r3, [r4, #24] + 1f1cf64: e3a03000 mov r3, #0 + 1f1cf68: e584301c str r3, [r4, #28] + 1f1cf6c: e8bd8010 pop {r4, pc} + +01f1cf70 : + 1f1cf70: e92d4010 push {r4, lr} + 1f1cf74: e1a04000 mov r4, r0 + 1f1cf78: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1cf7c: e3100001 tst r0, #1 + 1f1cf80: 008400c0 addeq r0, r4, r0, asr #1 + 1f1cf84: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1cf88: 108400c0 addne r0, r4, r0, asr #1 + 1f1cf8c: 15943020 ldrne r3, [r4, #32] + 1f1cf90: 05943020 ldreq r3, [r4, #32] + 1f1cf94: 17923003 ldrne r3, [r2, r3] + 1f1cf98: e12fff33 blx r3 + 1f1cf9c: e30c382c movw r3, #51244 ; 0xc82c + 1f1cfa0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1cfa4: e5843018 str r3, [r4, #24] + 1f1cfa8: e3a03000 mov r3, #0 + 1f1cfac: e584301c str r3, [r4, #28] + 1f1cfb0: e8bd8010 pop {r4, pc} + +01f1cfb4 : + 1f1cfb4: e92d4010 push {r4, lr} + 1f1cfb8: e1a04000 mov r4, r0 + 1f1cfbc: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1cfc0: e3100001 tst r0, #1 + 1f1cfc4: 008400c0 addeq r0, r4, r0, asr #1 + 1f1cfc8: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1cfcc: 108400c0 addne r0, r4, r0, asr #1 + 1f1cfd0: 15943020 ldrne r3, [r4, #32] + 1f1cfd4: 05943020 ldreq r3, [r4, #32] + 1f1cfd8: 17923003 ldrne r3, [r2, r3] + 1f1cfdc: e12fff33 blx r3 + 1f1cfe0: e30c382c movw r3, #51244 ; 0xc82c + 1f1cfe4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1cfe8: e5843018 str r3, [r4, #24] + 1f1cfec: e3a03000 mov r3, #0 + 1f1cff0: e584301c str r3, [r4, #28] + 1f1cff4: e8bd8010 pop {r4, pc} + +01f1cff8 : + 1f1cff8: e92d4010 push {r4, lr} + 1f1cffc: e1a04000 mov r4, r0 + 1f1d000: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1d004: e3100001 tst r0, #1 + 1f1d008: 008400c0 addeq r0, r4, r0, asr #1 + 1f1d00c: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1d010: 108400c0 addne r0, r4, r0, asr #1 + 1f1d014: 15943020 ldrne r3, [r4, #32] + 1f1d018: 05943020 ldreq r3, [r4, #32] + 1f1d01c: 17923003 ldrne r3, [r2, r3] + 1f1d020: e12fff33 blx r3 + 1f1d024: e30c382c movw r3, #51244 ; 0xc82c + 1f1d028: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d02c: e5843018 str r3, [r4, #24] + 1f1d030: e3a03000 mov r3, #0 + 1f1d034: e584301c str r3, [r4, #28] + 1f1d038: e8bd8010 pop {r4, pc} + +01f1d03c : + 1f1d03c: e92d4010 push {r4, lr} + 1f1d040: e1a04000 mov r4, r0 + 1f1d044: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1d048: e3100001 tst r0, #1 + 1f1d04c: 008400c0 addeq r0, r4, r0, asr #1 + 1f1d050: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1d054: 108400c0 addne r0, r4, r0, asr #1 + 1f1d058: 15943020 ldrne r3, [r4, #32] + 1f1d05c: 05943020 ldreq r3, [r4, #32] + 1f1d060: 17923003 ldrne r3, [r2, r3] + 1f1d064: e12fff33 blx r3 + 1f1d068: e30c382c movw r3, #51244 ; 0xc82c + 1f1d06c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d070: e5843018 str r3, [r4, #24] + 1f1d074: e3a03000 mov r3, #0 + 1f1d078: e584301c str r3, [r4, #28] + 1f1d07c: e8bd8010 pop {r4, pc} + +01f1d080 : + 1f1d080: e92d4010 push {r4, lr} + 1f1d084: e1a04000 mov r4, r0 + 1f1d088: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1d08c: e3100001 tst r0, #1 + 1f1d090: 008400c0 addeq r0, r4, r0, asr #1 + 1f1d094: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1d098: 108400c0 addne r0, r4, r0, asr #1 + 1f1d09c: 15943020 ldrne r3, [r4, #32] + 1f1d0a0: 05943020 ldreq r3, [r4, #32] + 1f1d0a4: 17923003 ldrne r3, [r2, r3] + 1f1d0a8: e12fff33 blx r3 + 1f1d0ac: e30c382c movw r3, #51244 ; 0xc82c + 1f1d0b0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d0b4: e5843018 str r3, [r4, #24] + 1f1d0b8: e3a03000 mov r3, #0 + 1f1d0bc: e584301c str r3, [r4, #28] + 1f1d0c0: e8bd8010 pop {r4, pc} + +01f1d0c4 : + 1f1d0c4: e92d4010 push {r4, lr} + 1f1d0c8: e1a04000 mov r4, r0 + 1f1d0cc: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1d0d0: e3100001 tst r0, #1 + 1f1d0d4: 008400c0 addeq r0, r4, r0, asr #1 + 1f1d0d8: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1d0dc: 108400c0 addne r0, r4, r0, asr #1 + 1f1d0e0: 15943020 ldrne r3, [r4, #32] + 1f1d0e4: 05943020 ldreq r3, [r4, #32] + 1f1d0e8: 17923003 ldrne r3, [r2, r3] + 1f1d0ec: e12fff33 blx r3 + 1f1d0f0: e30c382c movw r3, #51244 ; 0xc82c + 1f1d0f4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d0f8: e5843018 str r3, [r4, #24] + 1f1d0fc: e3a03000 mov r3, #0 + 1f1d100: e584301c str r3, [r4, #28] + 1f1d104: e8bd8010 pop {r4, pc} + +01f1d108 : + 1f1d108: e92d4010 push {r4, lr} + 1f1d10c: e1a04000 mov r4, r0 + 1f1d110: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1d114: e3100001 tst r0, #1 + 1f1d118: 008400c0 addeq r0, r4, r0, asr #1 + 1f1d11c: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1d120: 108400c0 addne r0, r4, r0, asr #1 + 1f1d124: 15943020 ldrne r3, [r4, #32] + 1f1d128: 05943020 ldreq r3, [r4, #32] + 1f1d12c: 17923003 ldrne r3, [r2, r3] + 1f1d130: e12fff33 blx r3 + 1f1d134: e30c382c movw r3, #51244 ; 0xc82c + 1f1d138: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d13c: e5843018 str r3, [r4, #24] + 1f1d140: e3a03000 mov r3, #0 + 1f1d144: e584301c str r3, [r4, #28] + 1f1d148: e8bd8010 pop {r4, pc} + +01f1d14c : + 1f1d14c: e92d4010 push {r4, lr} + 1f1d150: e1a04000 mov r4, r0 + 1f1d154: e1d020b0 ldrh r2, [r0] + 1f1d158: e5d0300b ldrb r3, [r0, #11] + 1f1d15c: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1d160: e0833002 add r3, r3, r2 + 1f1d164: e3100001 tst r0, #1 + 1f1d168: e6ef3073 uxtb r3, r3 + 1f1d16c: e1c430b0 strh r3, [r4] + 1f1d170: 15943020 ldrne r3, [r4, #32] + 1f1d174: 008400c0 addeq r0, r4, r0, asr #1 + 1f1d178: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1d17c: 108400c0 addne r0, r4, r0, asr #1 + 1f1d180: 05943020 ldreq r3, [r4, #32] + 1f1d184: 17923003 ldrne r3, [r2, r3] + 1f1d188: e12fff33 blx r3 + 1f1d18c: e30c382c movw r3, #51244 ; 0xc82c + 1f1d190: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d194: e5843018 str r3, [r4, #24] + 1f1d198: e3a03000 mov r3, #0 + 1f1d19c: e584301c str r3, [r4, #28] + 1f1d1a0: e8bd8010 pop {r4, pc} + +01f1d1a4 : + 1f1d1a4: e92d4010 push {r4, lr} + 1f1d1a8: e1a04000 mov r4, r0 + 1f1d1ac: e1d020b0 ldrh r2, [r0] + 1f1d1b0: e5d0300a ldrb r3, [r0, #10] + 1f1d1b4: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1d1b8: e0833002 add r3, r3, r2 + 1f1d1bc: e3100001 tst r0, #1 + 1f1d1c0: e6ef3073 uxtb r3, r3 + 1f1d1c4: e1c430b0 strh r3, [r4] + 1f1d1c8: 15943020 ldrne r3, [r4, #32] + 1f1d1cc: 008400c0 addeq r0, r4, r0, asr #1 + 1f1d1d0: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1d1d4: 108400c0 addne r0, r4, r0, asr #1 + 1f1d1d8: 05943020 ldreq r3, [r4, #32] + 1f1d1dc: 17923003 ldrne r3, [r2, r3] + 1f1d1e0: e12fff33 blx r3 + 1f1d1e4: e30c382c movw r3, #51244 ; 0xc82c + 1f1d1e8: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d1ec: e5843018 str r3, [r4, #24] + 1f1d1f0: e3a03000 mov r3, #0 + 1f1d1f4: e584301c str r3, [r4, #28] + 1f1d1f8: e8bd8010 pop {r4, pc} + +01f1d1fc : + 1f1d1fc: e92d4010 push {r4, lr} + 1f1d200: e1a04000 mov r4, r0 + 1f1d204: e5903010 ldr r3, [r0, #16] + 1f1d208: e1d000b6 ldrh r0, [r0, #6] + 1f1d20c: e12fff33 blx r3 + 1f1d210: e5940024 ldr r0, [r4, #36] ; 0x24 + 1f1d214: e3100001 tst r0, #1 + 1f1d218: 008400c0 addeq r0, r4, r0, asr #1 + 1f1d21c: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1d220: 108400c0 addne r0, r4, r0, asr #1 + 1f1d224: 15943020 ldrne r3, [r4, #32] + 1f1d228: 05943020 ldreq r3, [r4, #32] + 1f1d22c: 17923003 ldrne r3, [r2, r3] + 1f1d230: e12fff33 blx r3 + 1f1d234: e30c382c movw r3, #51244 ; 0xc82c + 1f1d238: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d23c: e5843018 str r3, [r4, #24] + 1f1d240: e3a03000 mov r3, #0 + 1f1d244: e584301c str r3, [r4, #28] + 1f1d248: e8bd8010 pop {r4, pc} + +01f1d24c : + 1f1d24c: e92d4010 push {r4, lr} + 1f1d250: e1a04000 mov r4, r0 + 1f1d254: e5903010 ldr r3, [r0, #16] + 1f1d258: e1d000b0 ldrh r0, [r0] + 1f1d25c: e12fff33 blx r3 + 1f1d260: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1d264: e1c400b4 strh r0, [r4, #4] + 1f1d268: e3130001 tst r3, #1 + 1f1d26c: 108400c3 addne r0, r4, r3, asr #1 + 1f1d270: 008400c3 addeq r0, r4, r3, asr #1 + 1f1d274: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1d278: 15943020 ldrne r3, [r4, #32] + 1f1d27c: 05943020 ldreq r3, [r4, #32] + 1f1d280: 17923003 ldrne r3, [r2, r3] + 1f1d284: e12fff33 blx r3 + 1f1d288: e30c382c movw r3, #51244 ; 0xc82c + 1f1d28c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d290: e5843018 str r3, [r4, #24] + 1f1d294: e3a03000 mov r3, #0 + 1f1d298: e584301c str r3, [r4, #28] + 1f1d29c: e8bd8010 pop {r4, pc} + +01f1d2a0 : + 1f1d2a0: e92d4010 push {r4, lr} + 1f1d2a4: e1a04000 mov r4, r0 + 1f1d2a8: e5903010 ldr r3, [r0, #16] + 1f1d2ac: e1d000b0 ldrh r0, [r0] + 1f1d2b0: e12fff33 blx r3 + 1f1d2b4: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1d2b8: e1c400b4 strh r0, [r4, #4] + 1f1d2bc: e3130001 tst r3, #1 + 1f1d2c0: 108400c3 addne r0, r4, r3, asr #1 + 1f1d2c4: 008400c3 addeq r0, r4, r3, asr #1 + 1f1d2c8: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1d2cc: 15943020 ldrne r3, [r4, #32] + 1f1d2d0: 05943020 ldreq r3, [r4, #32] + 1f1d2d4: 17923003 ldrne r3, [r2, r3] + 1f1d2d8: e12fff33 blx r3 + 1f1d2dc: e30c382c movw r3, #51244 ; 0xc82c + 1f1d2e0: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d2e4: e5843018 str r3, [r4, #24] + 1f1d2e8: e3a03000 mov r3, #0 + 1f1d2ec: e584301c str r3, [r4, #28] + 1f1d2f0: e8bd8010 pop {r4, pc} + +01f1d2f4 : + 1f1d2f4: e92d4010 push {r4, lr} + 1f1d2f8: e1a04000 mov r4, r0 + 1f1d2fc: e5903010 ldr r3, [r0, #16] + 1f1d300: e1d000b0 ldrh r0, [r0] + 1f1d304: e12fff33 blx r3 + 1f1d308: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1d30c: e1c400b4 strh r0, [r4, #4] + 1f1d310: e3130001 tst r3, #1 + 1f1d314: 108400c3 addne r0, r4, r3, asr #1 + 1f1d318: 008400c3 addeq r0, r4, r3, asr #1 + 1f1d31c: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1d320: 15943020 ldrne r3, [r4, #32] + 1f1d324: 05943020 ldreq r3, [r4, #32] + 1f1d328: 17923003 ldrne r3, [r2, r3] + 1f1d32c: e12fff33 blx r3 + 1f1d330: e30c382c movw r3, #51244 ; 0xc82c + 1f1d334: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d338: e5843018 str r3, [r4, #24] + 1f1d33c: e3a03000 mov r3, #0 + 1f1d340: e584301c str r3, [r4, #28] + 1f1d344: e8bd8010 pop {r4, pc} + +01f1d348 : + 1f1d348: e92d4010 push {r4, lr} + 1f1d34c: e1a04000 mov r4, r0 + 1f1d350: e5903010 ldr r3, [r0, #16] + 1f1d354: e1d000b0 ldrh r0, [r0] + 1f1d358: e12fff33 blx r3 + 1f1d35c: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1d360: e1c400b4 strh r0, [r4, #4] + 1f1d364: e3130001 tst r3, #1 + 1f1d368: 108400c3 addne r0, r4, r3, asr #1 + 1f1d36c: 008400c3 addeq r0, r4, r3, asr #1 + 1f1d370: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1d374: 15943020 ldrne r3, [r4, #32] + 1f1d378: 05943020 ldreq r3, [r4, #32] + 1f1d37c: 17923003 ldrne r3, [r2, r3] + 1f1d380: e12fff33 blx r3 + 1f1d384: e30c382c movw r3, #51244 ; 0xc82c + 1f1d388: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d38c: e5843018 str r3, [r4, #24] + 1f1d390: e3a03000 mov r3, #0 + 1f1d394: e584301c str r3, [r4, #28] + 1f1d398: e8bd8010 pop {r4, pc} + +01f1d39c : + 1f1d39c: e92d4010 push {r4, lr} + 1f1d3a0: e1a04000 mov r4, r0 + 1f1d3a4: e5903010 ldr r3, [r0, #16] + 1f1d3a8: e1d000b0 ldrh r0, [r0] + 1f1d3ac: e12fff33 blx r3 + 1f1d3b0: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1d3b4: e1c400b4 strh r0, [r4, #4] + 1f1d3b8: e3130001 tst r3, #1 + 1f1d3bc: 108400c3 addne r0, r4, r3, asr #1 + 1f1d3c0: 008400c3 addeq r0, r4, r3, asr #1 + 1f1d3c4: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1d3c8: 15943020 ldrne r3, [r4, #32] + 1f1d3cc: 05943020 ldreq r3, [r4, #32] + 1f1d3d0: 17923003 ldrne r3, [r2, r3] + 1f1d3d4: e12fff33 blx r3 + 1f1d3d8: e30c382c movw r3, #51244 ; 0xc82c + 1f1d3dc: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d3e0: e5843018 str r3, [r4, #24] + 1f1d3e4: e3a03000 mov r3, #0 + 1f1d3e8: e584301c str r3, [r4, #28] + 1f1d3ec: e8bd8010 pop {r4, pc} + +01f1d3f0 : + 1f1d3f0: e92d4010 push {r4, lr} + 1f1d3f4: e1a04000 mov r4, r0 + 1f1d3f8: e5903010 ldr r3, [r0, #16] + 1f1d3fc: e1d000b0 ldrh r0, [r0] + 1f1d400: e12fff33 blx r3 + 1f1d404: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1d408: e1c400b4 strh r0, [r4, #4] + 1f1d40c: e3130001 tst r3, #1 + 1f1d410: 108400c3 addne r0, r4, r3, asr #1 + 1f1d414: 008400c3 addeq r0, r4, r3, asr #1 + 1f1d418: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1d41c: 15943020 ldrne r3, [r4, #32] + 1f1d420: 05943020 ldreq r3, [r4, #32] + 1f1d424: 17923003 ldrne r3, [r2, r3] + 1f1d428: e12fff33 blx r3 + 1f1d42c: e30c382c movw r3, #51244 ; 0xc82c + 1f1d430: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d434: e5843018 str r3, [r4, #24] + 1f1d438: e3a03000 mov r3, #0 + 1f1d43c: e584301c str r3, [r4, #28] + 1f1d440: e8bd8010 pop {r4, pc} + +01f1d444 : + 1f1d444: e92d4010 push {r4, lr} + 1f1d448: e1a04000 mov r4, r0 + 1f1d44c: e5903010 ldr r3, [r0, #16] + 1f1d450: e1d000b6 ldrh r0, [r0, #6] + 1f1d454: e12fff33 blx r3 + 1f1d458: e5940024 ldr r0, [r4, #36] ; 0x24 + 1f1d45c: e5d43009 ldrb r3, [r4, #9] + 1f1d460: e3100001 tst r0, #1 + 1f1d464: e1c430b4 strh r3, [r4, #4] + 1f1d468: 008400c0 addeq r0, r4, r0, asr #1 + 1f1d46c: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1d470: 108400c0 addne r0, r4, r0, asr #1 + 1f1d474: 15943020 ldrne r3, [r4, #32] + 1f1d478: 05943020 ldreq r3, [r4, #32] + 1f1d47c: 17923003 ldrne r3, [r2, r3] + 1f1d480: e12fff33 blx r3 + 1f1d484: e30c382c movw r3, #51244 ; 0xc82c + 1f1d488: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d48c: e5843018 str r3, [r4, #24] + 1f1d490: e3a03000 mov r3, #0 + 1f1d494: e584301c str r3, [r4, #28] + 1f1d498: e8bd8010 pop {r4, pc} + +01f1d49c : + 1f1d49c: e92d4010 push {r4, lr} + 1f1d4a0: e1a04000 mov r4, r0 + 1f1d4a4: e5903010 ldr r3, [r0, #16] + 1f1d4a8: e1d000b6 ldrh r0, [r0, #6] + 1f1d4ac: e12fff33 blx r3 + 1f1d4b0: e5940024 ldr r0, [r4, #36] ; 0x24 + 1f1d4b4: e1d430b6 ldrh r3, [r4, #6] + 1f1d4b8: e3100001 tst r0, #1 + 1f1d4bc: e2833001 add r3, r3, #1 + 1f1d4c0: e1c430b6 strh r3, [r4, #6] + 1f1d4c4: 179420c0 ldrne r2, [r4, r0, asr #1] + 1f1d4c8: 008400c0 addeq r0, r4, r0, asr #1 + 1f1d4cc: 15943020 ldrne r3, [r4, #32] + 1f1d4d0: 108400c0 addne r0, r4, r0, asr #1 + 1f1d4d4: 05943020 ldreq r3, [r4, #32] + 1f1d4d8: 17923003 ldrne r3, [r2, r3] + 1f1d4dc: e12fff33 blx r3 + 1f1d4e0: e30c382c movw r3, #51244 ; 0xc82c + 1f1d4e4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d4e8: e5843018 str r3, [r4, #24] + 1f1d4ec: e3a03000 mov r3, #0 + 1f1d4f0: e584301c str r3, [r4, #28] + 1f1d4f4: e8bd8010 pop {r4, pc} + +01f1d4f8 : + 1f1d4f8: e92d4010 push {r4, lr} + 1f1d4fc: e1a04000 mov r4, r0 + 1f1d500: e1d000b6 ldrh r0, [r0, #6] + 1f1d504: e2802001 add r2, r0, #1 + 1f1d508: e5943010 ldr r3, [r4, #16] + 1f1d50c: e1c420b6 strh r2, [r4, #6] + 1f1d510: e12fff33 blx r3 + 1f1d514: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1d518: e1c400b4 strh r0, [r4, #4] + 1f1d51c: e3130001 tst r3, #1 + 1f1d520: 108400c3 addne r0, r4, r3, asr #1 + 1f1d524: 008400c3 addeq r0, r4, r3, asr #1 + 1f1d528: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1d52c: 15943020 ldrne r3, [r4, #32] + 1f1d530: 05943020 ldreq r3, [r4, #32] + 1f1d534: 17923003 ldrne r3, [r2, r3] + 1f1d538: e12fff33 blx r3 + 1f1d53c: e30c382c movw r3, #51244 ; 0xc82c + 1f1d540: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d544: e5843018 str r3, [r4, #24] + 1f1d548: e3a03000 mov r3, #0 + 1f1d54c: e584301c str r3, [r4, #28] + 1f1d550: e8bd8010 pop {r4, pc} + +01f1d554 : + 1f1d554: e92d4010 push {r4, lr} + 1f1d558: e1a04000 mov r4, r0 + 1f1d55c: e5903010 ldr r3, [r0, #16] + 1f1d560: e1d000b2 ldrh r0, [r0, #2] + 1f1d564: e12fff33 blx r3 + 1f1d568: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1d56c: e1d420b0 ldrh r2, [r4] + 1f1d570: e3130001 tst r3, #1 + 1f1d574: e1820400 orr r0, r2, r0, lsl #8 + 1f1d578: e1c400b0 strh r0, [r4] + 1f1d57c: 108400c3 addne r0, r4, r3, asr #1 + 1f1d580: 008400c3 addeq r0, r4, r3, asr #1 + 1f1d584: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1d588: 15943020 ldrne r3, [r4, #32] + 1f1d58c: 05943020 ldreq r3, [r4, #32] + 1f1d590: 17923003 ldrne r3, [r2, r3] + 1f1d594: e12fff33 blx r3 + 1f1d598: e30c382c movw r3, #51244 ; 0xc82c + 1f1d59c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d5a0: e5843018 str r3, [r4, #24] + 1f1d5a4: e3a03000 mov r3, #0 + 1f1d5a8: e584301c str r3, [r4, #28] + 1f1d5ac: e8bd8010 pop {r4, pc} + +01f1d5b0 : + 1f1d5b0: e92d4010 push {r4, lr} + 1f1d5b4: e1a04000 mov r4, r0 + 1f1d5b8: e5d0300b ldrb r3, [r0, #11] + 1f1d5bc: e1d000b0 ldrh r0, [r0] + 1f1d5c0: e5942010 ldr r2, [r4, #16] + 1f1d5c4: e0830000 add r0, r3, r0 + 1f1d5c8: e6ef0070 uxtb r0, r0 + 1f1d5cc: e1c400b0 strh r0, [r4] + 1f1d5d0: e12fff32 blx r2 + 1f1d5d4: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1d5d8: e1c400b4 strh r0, [r4, #4] + 1f1d5dc: e3130001 tst r3, #1 + 1f1d5e0: 108400c3 addne r0, r4, r3, asr #1 + 1f1d5e4: 008400c3 addeq r0, r4, r3, asr #1 + 1f1d5e8: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1d5ec: 15943020 ldrne r3, [r4, #32] + 1f1d5f0: 05943020 ldreq r3, [r4, #32] + 1f1d5f4: 17923003 ldrne r3, [r2, r3] + 1f1d5f8: e12fff33 blx r3 + 1f1d5fc: e30c382c movw r3, #51244 ; 0xc82c + 1f1d600: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d604: e5843018 str r3, [r4, #24] + 1f1d608: e3a03000 mov r3, #0 + 1f1d60c: e584301c str r3, [r4, #28] + 1f1d610: e8bd8010 pop {r4, pc} + +01f1d614 : + 1f1d614: e92d4010 push {r4, lr} + 1f1d618: e1a04000 mov r4, r0 + 1f1d61c: e5d0300a ldrb r3, [r0, #10] + 1f1d620: e1d000b0 ldrh r0, [r0] + 1f1d624: e5942010 ldr r2, [r4, #16] + 1f1d628: e0830000 add r0, r3, r0 + 1f1d62c: e6ef0070 uxtb r0, r0 + 1f1d630: e1c400b0 strh r0, [r4] + 1f1d634: e12fff32 blx r2 + 1f1d638: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1d63c: e1c400b4 strh r0, [r4, #4] + 1f1d640: e3130001 tst r3, #1 + 1f1d644: 108400c3 addne r0, r4, r3, asr #1 + 1f1d648: 008400c3 addeq r0, r4, r3, asr #1 + 1f1d64c: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1d650: 15943020 ldrne r3, [r4, #32] + 1f1d654: 05943020 ldreq r3, [r4, #32] + 1f1d658: 17923003 ldrne r3, [r2, r3] + 1f1d65c: e12fff33 blx r3 + 1f1d660: e30c382c movw r3, #51244 ; 0xc82c + 1f1d664: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d668: e5843018 str r3, [r4, #24] + 1f1d66c: e3a03000 mov r3, #0 + 1f1d670: e584301c str r3, [r4, #28] + 1f1d674: e8bd8010 pop {r4, pc} + +01f1d678 : + 1f1d678: e92d4010 push {r4, lr} + 1f1d67c: e1a04000 mov r4, r0 + 1f1d680: e1d000b6 ldrh r0, [r0, #6] + 1f1d684: e2802001 add r2, r0, #1 + 1f1d688: e5943010 ldr r3, [r4, #16] + 1f1d68c: e1c420b6 strh r2, [r4, #6] + 1f1d690: e12fff33 blx r3 + 1f1d694: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1d698: e1d420b0 ldrh r2, [r4] + 1f1d69c: e3130001 tst r3, #1 + 1f1d6a0: e1820400 orr r0, r2, r0, lsl #8 + 1f1d6a4: e1c400b0 strh r0, [r4] + 1f1d6a8: 108400c3 addne r0, r4, r3, asr #1 + 1f1d6ac: 008400c3 addeq r0, r4, r3, asr #1 + 1f1d6b0: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1d6b4: 15943020 ldrne r3, [r4, #32] + 1f1d6b8: 05943020 ldreq r3, [r4, #32] + 1f1d6bc: 17923003 ldrne r3, [r2, r3] + 1f1d6c0: e12fff33 blx r3 + 1f1d6c4: e30c382c movw r3, #51244 ; 0xc82c + 1f1d6c8: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d6cc: e5843018 str r3, [r4, #24] + 1f1d6d0: e3a03000 mov r3, #0 + 1f1d6d4: e584301c str r3, [r4, #28] + 1f1d6d8: e8bd8010 pop {r4, pc} + +01f1d6dc : + 1f1d6dc: e92d4070 push {r4, r5, r6, lr} + 1f1d6e0: e1a04000 mov r4, r0 + 1f1d6e4: e30f0fff movw r0, #65535 ; 0xffff + 1f1d6e8: e5d4300c ldrb r3, [r4, #12] + 1f1d6ec: e5942010 ldr r2, [r4, #16] + 1f1d6f0: e3833004 orr r3, r3, #4 + 1f1d6f4: e5c4300c strb r3, [r4, #12] + 1f1d6f8: e1d450f0 ldrsh r5, [r4] + 1f1d6fc: e12fff32 blx r2 + 1f1d700: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1d704: e1850400 orr r0, r5, r0, lsl #8 + 1f1d708: e1c400b6 strh r0, [r4, #6] + 1f1d70c: e3130001 tst r3, #1 + 1f1d710: 108400c3 addne r0, r4, r3, asr #1 + 1f1d714: 008400c3 addeq r0, r4, r3, asr #1 + 1f1d718: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1d71c: 15943020 ldrne r3, [r4, #32] + 1f1d720: 05943020 ldreq r3, [r4, #32] + 1f1d724: 17923003 ldrne r3, [r2, r3] + 1f1d728: e12fff33 blx r3 + 1f1d72c: e30c382c movw r3, #51244 ; 0xc82c + 1f1d730: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d734: e5843018 str r3, [r4, #24] + 1f1d738: e3a03000 mov r3, #0 + 1f1d73c: e584301c str r3, [r4, #28] + 1f1d740: e8bd8070 pop {r4, r5, r6, pc} + +01f1d744 : + 1f1d744: e92d4010 push {r4, lr} + 1f1d748: e1a04000 mov r4, r0 + 1f1d74c: e1d000b6 ldrh r0, [r0, #6] + 1f1d750: e2802001 add r2, r0, #1 + 1f1d754: e5943010 ldr r3, [r4, #16] + 1f1d758: e1c420b6 strh r2, [r4, #6] + 1f1d75c: e12fff33 blx r3 + 1f1d760: e1d430b0 ldrh r3, [r4] + 1f1d764: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f1d768: e1830400 orr r0, r3, r0, lsl #8 + 1f1d76c: e3120001 tst r2, #1 + 1f1d770: e6ff0070 uxth r0, r0 + 1f1d774: e1c400b0 strh r0, [r4] + 1f1d778: 15943020 ldrne r3, [r4, #32] + 1f1d77c: 179410c2 ldrne r1, [r4, r2, asr #1] + 1f1d780: e1c400b6 strh r0, [r4, #6] + 1f1d784: 008400c2 addeq r0, r4, r2, asr #1 + 1f1d788: 05943020 ldreq r3, [r4, #32] + 1f1d78c: 108400c2 addne r0, r4, r2, asr #1 + 1f1d790: 17913003 ldrne r3, [r1, r3] + 1f1d794: e12fff33 blx r3 + 1f1d798: e30c382c movw r3, #51244 ; 0xc82c + 1f1d79c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d7a0: e5843018 str r3, [r4, #24] + 1f1d7a4: e3a03000 mov r3, #0 + 1f1d7a8: e584301c str r3, [r4, #28] + 1f1d7ac: e8bd8010 pop {r4, pc} + +01f1d7b0 : + 1f1d7b0: e92d4010 push {r4, lr} + 1f1d7b4: e1a04000 mov r4, r0 + 1f1d7b8: e5d0000d ldrb r0, [r0, #13] + 1f1d7bc: e2800001 add r0, r0, #1 + 1f1d7c0: e5943010 ldr r3, [r4, #16] + 1f1d7c4: e6ef0070 uxtb r0, r0 + 1f1d7c8: e5c4000d strb r0, [r4, #13] + 1f1d7cc: e2800c01 add r0, r0, #256 ; 0x100 + 1f1d7d0: e12fff33 blx r3 + 1f1d7d4: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1d7d8: e1d420b6 ldrh r2, [r4, #6] + 1f1d7dc: e3130001 tst r3, #1 + 1f1d7e0: e1820400 orr r0, r2, r0, lsl #8 + 1f1d7e4: e1c400b6 strh r0, [r4, #6] + 1f1d7e8: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1d7ec: 108400c3 addne r0, r4, r3, asr #1 + 1f1d7f0: 15943020 ldrne r3, [r4, #32] + 1f1d7f4: 008400c3 addeq r0, r4, r3, asr #1 + 1f1d7f8: 05943020 ldreq r3, [r4, #32] + 1f1d7fc: 17923003 ldrne r3, [r2, r3] + 1f1d800: e12fff33 blx r3 + 1f1d804: e30c382c movw r3, #51244 ; 0xc82c + 1f1d808: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d80c: e5843018 str r3, [r4, #24] + 1f1d810: e3a03000 mov r3, #0 + 1f1d814: e584301c str r3, [r4, #28] + 1f1d818: e8bd8010 pop {r4, pc} + +01f1d81c : + 1f1d81c: e92d4010 push {r4, lr} + 1f1d820: e1a04000 mov r4, r0 + 1f1d824: e1d030b0 ldrh r3, [r0] + 1f1d828: e5d0000a ldrb r0, [r0, #10] + 1f1d82c: e2032cff and r2, r3, #65280 ; 0xff00 + 1f1d830: e0830000 add r0, r3, r0 + 1f1d834: e6ff0070 uxth r0, r0 + 1f1d838: e1c400b0 strh r0, [r4] + 1f1d83c: e2003cff and r3, r0, #65280 ; 0xff00 + 1f1d840: e1520003 cmp r2, r3 + 1f1d844: 0a000009 beq 1f1d870 + 1f1d848: e6ef0070 uxtb r0, r0 + 1f1d84c: e5943010 ldr r3, [r4, #16] + 1f1d850: e1800002 orr r0, r0, r2 + 1f1d854: e12fff33 blx r3 + 1f1d858: e30d32a0 movw r3, #53920 ; 0xd2a0 + 1f1d85c: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d860: e5843018 str r3, [r4, #24] + 1f1d864: e3a03000 mov r3, #0 + 1f1d868: e584301c str r3, [r4, #28] + 1f1d86c: e8bd8010 pop {r4, pc} + 1f1d870: e5943010 ldr r3, [r4, #16] + 1f1d874: e12fff33 blx r3 + 1f1d878: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1d87c: e1c400b4 strh r0, [r4, #4] + 1f1d880: e3130001 tst r3, #1 + 1f1d884: 108400c3 addne r0, r4, r3, asr #1 + 1f1d888: 008400c3 addeq r0, r4, r3, asr #1 + 1f1d88c: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1d890: 15943020 ldrne r3, [r4, #32] + 1f1d894: 05943020 ldreq r3, [r4, #32] + 1f1d898: 17923003 ldrne r3, [r2, r3] + 1f1d89c: e12fff33 blx r3 + 1f1d8a0: e30c382c movw r3, #51244 ; 0xc82c + 1f1d8a4: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d8a8: e5843018 str r3, [r4, #24] + 1f1d8ac: e3a03000 mov r3, #0 + 1f1d8b0: e584301c str r3, [r4, #28] + 1f1d8b4: e8bd8010 pop {r4, pc} + +01f1d8b8 : + 1f1d8b8: e92d4010 push {r4, lr} + 1f1d8bc: e1a04000 mov r4, r0 + 1f1d8c0: e1d030b0 ldrh r3, [r0] + 1f1d8c4: e5d0000b ldrb r0, [r0, #11] + 1f1d8c8: e2032cff and r2, r3, #65280 ; 0xff00 + 1f1d8cc: e0830000 add r0, r3, r0 + 1f1d8d0: e6ff0070 uxth r0, r0 + 1f1d8d4: e1c400b0 strh r0, [r4] + 1f1d8d8: e2003cff and r3, r0, #65280 ; 0xff00 + 1f1d8dc: e1520003 cmp r2, r3 + 1f1d8e0: 0a000009 beq 1f1d90c + 1f1d8e4: e6ef0070 uxtb r0, r0 + 1f1d8e8: e5943010 ldr r3, [r4, #16] + 1f1d8ec: e1800002 orr r0, r0, r2 + 1f1d8f0: e12fff33 blx r3 + 1f1d8f4: e30d32f4 movw r3, #54004 ; 0xd2f4 + 1f1d8f8: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d8fc: e5843018 str r3, [r4, #24] + 1f1d900: e3a03000 mov r3, #0 + 1f1d904: e584301c str r3, [r4, #28] + 1f1d908: e8bd8010 pop {r4, pc} + 1f1d90c: e5943010 ldr r3, [r4, #16] + 1f1d910: e12fff33 blx r3 + 1f1d914: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1d918: e1c400b4 strh r0, [r4, #4] + 1f1d91c: e3130001 tst r3, #1 + 1f1d920: 108400c3 addne r0, r4, r3, asr #1 + 1f1d924: 008400c3 addeq r0, r4, r3, asr #1 + 1f1d928: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f1d92c: 15943020 ldrne r3, [r4, #32] + 1f1d930: 05943020 ldreq r3, [r4, #32] + 1f1d934: 17923003 ldrne r3, [r2, r3] + 1f1d938: e12fff33 blx r3 + 1f1d93c: e30c382c movw r3, #51244 ; 0xc82c + 1f1d940: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d944: e5843018 str r3, [r4, #24] + 1f1d948: e3a03000 mov r3, #0 + 1f1d94c: e584301c str r3, [r4, #28] + 1f1d950: e8bd8010 pop {r4, pc} + +01f1d954 : + 1f1d954: e92d4070 push {r4, r5, r6, lr} + 1f1d958: e1d030b4 ldrh r3, [r0, #4] + 1f1d95c: e1a04000 mov r4, r0 + 1f1d960: e5d0200c ldrb r2, [r0, #12] + 1f1d964: e5900018 ldr r0, [r0, #24] + 1f1d968: e3130001 tst r3, #1 + 1f1d96c: e1a01382 lsl r1, r2, #7 + 1f1d970: 13822001 orrne r2, r2, #1 + 1f1d974: 020220fe andeq r2, r2, #254 ; 0xfe + 1f1d978: e5c4200c strb r2, [r4, #12] + 1f1d97c: e6ef1071 uxtb r1, r1 + 1f1d980: e18110a3 orr r1, r1, r3, lsr #1 + 1f1d984: e30d3444 movw r3, #54340 ; 0xd444 + 1f1d988: e34031f1 movt r3, #497 ; 0x1f1 + 1f1d98c: e1500003 cmp r0, r3 + 1f1d990: e6ff5071 uxth r5, r1 + 1f1d994: e6ef1071 uxtb r1, r1 + 1f1d998: 0a00004b beq 1f1dacc + 1f1d99c: e5943014 ldr r3, [r4, #20] + 1f1d9a0: e1d400b0 ldrh r0, [r4] + 1f1d9a4: e12fff33 blx r3 + 1f1d9a8: e5d41009 ldrb r1, [r4, #9] + 1f1d9ac: e5d4200c ldrb r2, [r4, #12] + 1f1d9b0: e6efc075 uxtb ip, r5 + 1f1d9b4: e6ffe071 uxth lr, r1 + 1f1d9b8: e2023001 and r3, r2, #1 + 1f1d9bc: e08c000e add r0, ip, lr + 1f1d9c0: e0833000 add r3, r3, r0 + 1f1d9c4: e1c4c0b4 strh ip, [r4, #4] + 1f1d9c8: e6ff3073 uxth r3, r3 + 1f1d9cc: e31300ff tst r3, #255 ; 0xff + 1f1d9d0: 03822002 orreq r2, r2, #2 + 1f1d9d4: 120220fd andne r2, r2, #253 ; 0xfd + 1f1d9d8: e3120008 tst r2, #8 + 1f1d9dc: e5c4200c strb r2, [r4, #12] + 1f1d9e0: 0a00001f beq 1f1da64 + 1f1d9e4: e201000f and r0, r1, #15 + 1f1d9e8: e205300f and r3, r5, #15 + 1f1d9ec: e0803003 add r3, r0, r3 + 1f1d9f0: e2020001 and r0, r2, #1 + 1f1d9f4: e0830000 add r0, r3, r0 + 1f1d9f8: e3500009 cmp r0, #9 + 1f1d9fc: 8a000029 bhi 1f1daa8 + 1f1da00: e20110f0 and r1, r1, #240 ; 0xf0 + 1f1da04: e20530f0 and r3, r5, #240 ; 0xf0 + 1f1da08: e0813003 add r3, r1, r3 + 1f1da0c: e0803003 add r3, r0, r3 + 1f1da10: e6ff3073 uxth r3, r3 + 1f1da14: e02ee003 eor lr, lr, r3 + 1f1da18: e02cc003 eor ip, ip, r3 + 1f1da1c: e00cc00e and ip, ip, lr + 1f1da20: e2031e1f and r1, r3, #496 ; 0x1f0 + 1f1da24: e31c0080 tst ip, #128 ; 0x80 + 1f1da28: 13822040 orrne r2, r2, #64 ; 0x40 + 1f1da2c: 020220bf andeq r2, r2, #191 ; 0xbf + 1f1da30: e3130080 tst r3, #128 ; 0x80 + 1f1da34: 13822080 orrne r2, r2, #128 ; 0x80 + 1f1da38: 0202207f andeq r2, r2, #127 ; 0x7f + 1f1da3c: e3510090 cmp r1, #144 ; 0x90 + 1f1da40: e5c4200c strb r2, [r4, #12] + 1f1da44: 82833060 addhi r3, r3, #96 ; 0x60 + 1f1da48: 86ff3073 uxthhi r3, r3 + 1f1da4c: e5c43009 strb r3, [r4, #9] + 1f1da50: e3130cff tst r3, #65280 ; 0xff00 + 1f1da54: 13822001 orrne r2, r2, #1 + 1f1da58: 03c22001 biceq r2, r2, #1 + 1f1da5c: e5c4200c strb r2, [r4, #12] + 1f1da60: e8bd8070 pop {r4, r5, r6, pc} + 1f1da64: e02ee003 eor lr, lr, r3 + 1f1da68: e02cc003 eor ip, ip, r3 + 1f1da6c: e3130cff tst r3, #65280 ; 0xff00 + 1f1da70: e00cc00e and ip, ip, lr + 1f1da74: 13822001 orrne r2, r2, #1 + 1f1da78: 020220fe andeq r2, r2, #254 ; 0xfe + 1f1da7c: e31c0080 tst ip, #128 ; 0x80 + 1f1da80: e5c43009 strb r3, [r4, #9] + 1f1da84: 13822040 orrne r2, r2, #64 ; 0x40 + 1f1da88: 020220bf andeq r2, r2, #191 ; 0xbf + 1f1da8c: e3130080 tst r3, #128 ; 0x80 + 1f1da90: e5c4200c strb r2, [r4, #12] + 1f1da94: 11e02c82 mvnne r2, r2, lsl #25 + 1f1da98: 0202207f andeq r2, r2, #127 ; 0x7f + 1f1da9c: 11e02ca2 mvnne r2, r2, lsr #25 + 1f1daa0: e5c4200c strb r2, [r4, #12] + 1f1daa4: e8bd8070 pop {r4, r5, r6, pc} + 1f1daa8: e20530f0 and r3, r5, #240 ; 0xf0 + 1f1daac: e2800006 add r0, r0, #6 + 1f1dab0: e2833010 add r3, r3, #16 + 1f1dab4: e20110f0 and r1, r1, #240 ; 0xf0 + 1f1dab8: e200000f and r0, r0, #15 + 1f1dabc: e0813003 add r3, r1, r3 + 1f1dac0: e0803003 add r3, r0, r3 + 1f1dac4: e6ff3073 uxth r3, r3 + 1f1dac8: eaffffd1 b 1f1da14 + 1f1dacc: e594301c ldr r3, [r4, #28] + 1f1dad0: e3530000 cmp r3, #0 + 1f1dad4: 0a000003 beq 1f1dae8 + 1f1dad8: e3500000 cmp r0, #0 + 1f1dadc: 1affffae bne 1f1d99c + 1f1dae0: e3130001 tst r3, #1 + 1f1dae4: 1affffac bne 1f1d99c + 1f1dae8: e5c41009 strb r1, [r4, #9] + 1f1daec: eaffffaf b 1f1d9b0 + +01f1daf0 : + 1f1daf0: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f1daf4: e1d010b4 ldrh r1, [r0, #4] + 1f1daf8: e1a04000 mov r4, r0 + 1f1dafc: e5902018 ldr r2, [r0, #24] + 1f1db00: e30d3444 movw r3, #54340 ; 0xd444 + 1f1db04: e34031f1 movt r3, #497 ; 0x1f1 + 1f1db08: e2811001 add r1, r1, #1 + 1f1db0c: e1520003 cmp r2, r3 + 1f1db10: e6ef1071 uxtb r1, r1 + 1f1db14: e6ff0071 uxth r0, r1 + 1f1db18: e1c400b4 strh r0, [r4, #4] + 1f1db1c: 0a000048 beq 1f1dc44 + 1f1db20: e1d400b0 ldrh r0, [r4] + 1f1db24: e5943014 ldr r3, [r4, #20] + 1f1db28: e12fff33 blx r3 + 1f1db2c: e5d46009 ldrb r6, [r4, #9] + 1f1db30: e1d400b4 ldrh r0, [r4, #4] + 1f1db34: e5d4300c ldrb r3, [r4, #12] + 1f1db38: e6ff5076 uxth r5, r6 + 1f1db3c: e0601005 rsb r1, r0, r5 + 1f1db40: e203c001 and ip, r3, #1 + 1f1db44: e3130008 tst r3, #8 + 1f1db48: e22c2001 eor r2, ip, #1 + 1f1db4c: e0621001 rsb r1, r2, r1 + 1f1db50: e6ff1071 uxth r1, r1 + 1f1db54: 0a000026 beq 1f1dbf4 + 1f1db58: e206c00f and ip, r6, #15 + 1f1db5c: e200700f and r7, r0, #15 + 1f1db60: e1a0e00c mov lr, ip + 1f1db64: e067c00c rsb ip, r7, ip + 1f1db68: e062c00c rsb ip, r2, ip + 1f1db6c: e20660f0 and r6, r6, #240 ; 0xf0 + 1f1db70: e20020f0 and r2, r0, #240 ; 0xf0 + 1f1db74: e1e00000 mvn r0, r0 + 1f1db78: e6ffc07c uxth ip, ip + 1f1db7c: e0255001 eor r5, r5, r1 + 1f1db80: e31c0010 tst ip, #16 + 1f1db84: e6ef0070 uxtb r0, r0 + 1f1db88: 124cc006 subne ip, ip, #6 + 1f1db8c: 10622006 rsbne r2, r2, r6 + 1f1db90: 120cc00f andne ip, ip, #15 + 1f1db94: 12422010 subne r2, r2, #16 + 1f1db98: 00622006 rsbeq r2, r2, r6 + 1f1db9c: e0200001 eor r0, r0, r1 + 1f1dba0: e182200c orr r2, r2, ip + 1f1dba4: e0000005 and r0, r0, r5 + 1f1dba8: e6ff2072 uxth r2, r2 + 1f1dbac: e3120c01 tst r2, #256 ; 0x100 + 1f1dbb0: 12422060 subne r2, r2, #96 ; 0x60 + 1f1dbb4: 16ff2072 uxthne r2, r2 + 1f1dbb8: e35100ff cmp r1, #255 ; 0xff + 1f1dbbc: 93833001 orrls r3, r3, #1 + 1f1dbc0: 820330fe andhi r3, r3, #254 ; 0xfe + 1f1dbc4: e3100080 tst r0, #128 ; 0x80 + 1f1dbc8: e5c42009 strb r2, [r4, #9] + 1f1dbcc: 13833040 orrne r3, r3, #64 ; 0x40 + 1f1dbd0: 020330bf andeq r3, r3, #191 ; 0xbf + 1f1dbd4: e31100ff tst r1, #255 ; 0xff + 1f1dbd8: 03833002 orreq r3, r3, #2 + 1f1dbdc: 120330fd andne r3, r3, #253 ; 0xfd + 1f1dbe0: e3110080 tst r1, #128 ; 0x80 + 1f1dbe4: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1dbe8: 0203307f andeq r3, r3, #127 ; 0x7f + 1f1dbec: e5c4300c strb r3, [r4, #12] + 1f1dbf0: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f1dbf4: e1e02000 mvn r2, r0 + 1f1dbf8: e31100ff tst r1, #255 ; 0xff + 1f1dbfc: 03833002 orreq r3, r3, #2 + 1f1dc00: 120330fd andne r3, r3, #253 ; 0xfd + 1f1dc04: e6ef2072 uxtb r2, r2 + 1f1dc08: e3110080 tst r1, #128 ; 0x80 + 1f1dc0c: e0255001 eor r5, r5, r1 + 1f1dc10: e0222001 eor r2, r2, r1 + 1f1dc14: 13833080 orrne r3, r3, #128 ; 0x80 + 1f1dc18: 0203307f andeq r3, r3, #127 ; 0x7f + 1f1dc1c: e0022005 and r2, r2, r5 + 1f1dc20: e35100ff cmp r1, #255 ; 0xff + 1f1dc24: 93833001 orrls r3, r3, #1 + 1f1dc28: 820330fe andhi r3, r3, #254 ; 0xfe + 1f1dc2c: e3120080 tst r2, #128 ; 0x80 + 1f1dc30: e5c41009 strb r1, [r4, #9] + 1f1dc34: 13833040 orrne r3, r3, #64 ; 0x40 + 1f1dc38: 020330bf andeq r3, r3, #191 ; 0xbf + 1f1dc3c: e5c4300c strb r3, [r4, #12] + 1f1dc40: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f1dc44: e594301c ldr r3, [r4, #28] + 1f1dc48: e1a06001 mov r6, r1 + 1f1dc4c: e3530000 cmp r3, #0 + 1f1dc50: 0a000003 beq 1f1dc64 + 1f1dc54: e3520000 cmp r2, #0 + 1f1dc58: 1affffb0 bne 1f1db20 + 1f1dc5c: e3130001 tst r3, #1 + 1f1dc60: 1affffae bne 1f1db20 + 1f1dc64: e5c41009 strb r1, [r4, #9] + 1f1dc68: eaffffb1 b 1f1db34 + +01f1dc6c : + 1f1dc6c: e5d01028 ldrb r1, [r0, #40] ; 0x28 + 1f1dc70: e1a03000 mov r3, r0 + 1f1dc74: e3510000 cmp r1, #0 + 1f1dc78: 0a000018 beq 1f1dce0 + 1f1dc7c: e5d0200c ldrb r2, [r0, #12] + 1f1dc80: e3120004 tst r2, #4 + 1f1dc84: e5d0200e ldrb r2, [r0, #14] + 1f1dc88: 1a000002 bne 1f1dc98 + 1f1dc8c: e3120003 tst r2, #3 + 1f1dc90: 03822004 orreq r2, r2, #4 + 1f1dc94: 05c0200e strbeq r2, [r0, #14] + 1f1dc98: e3120001 tst r2, #1 + 1f1dc9c: e593001c ldr r0, [r3, #28] + 1f1dca0: 15d3200e ldrbne r2, [r3, #14] + 1f1dca4: 17c0201f bfcne r2, #0, #1 + 1f1dca8: 15c3200e strbne r2, [r3, #14] + 1f1dcac: 16ef2072 uxtbne r2, r2 + 1f1dcb0: e3120002 tst r2, #2 + 1f1dcb4: 15d3200e ldrbne r2, [r3, #14] + 1f1dcb8: 17c1209f bfcne r2, #1, #1 + 1f1dcbc: 15c3200e strbne r2, [r3, #14] + 1f1dcc0: e3100001 tst r0, #1 + 1f1dcc4: 008300c0 addeq r0, r3, r0, asr #1 + 1f1dcc8: 179320c0 ldrne r2, [r3, r0, asr #1] + 1f1dccc: 108300c0 addne r0, r3, r0, asr #1 + 1f1dcd0: 15933018 ldrne r3, [r3, #24] + 1f1dcd4: 05933018 ldreq r3, [r3, #24] + 1f1dcd8: 17923003 ldrne r3, [r2, r3] + 1f1dcdc: e12fff13 bx r3 + 1f1dce0: e5d0200e ldrb r2, [r0, #14] + 1f1dce4: e7c22111 bfi r2, r1, #2, #1 + 1f1dce8: e5c0200e strb r2, [r0, #14] + 1f1dcec: e6ef2072 uxtb r2, r2 + 1f1dcf0: eaffffe8 b 1f1dc98 + +01f1dcf4 : + 1f1dcf4: e92d4070 push {r4, r5, r6, lr} + 1f1dcf8: e1a04000 mov r4, r0 + 1f1dcfc: e3a05000 mov r5, #0 + 1f1dd00: e5d0300e ldrb r3, [r0, #14] + 1f1dd04: e5c05028 strb r5, [r0, #40] ; 0x28 + 1f1dd08: e20330fc and r3, r3, #252 ; 0xfc + 1f1dd0c: e5c0500d strb r5, [r0, #13] + 1f1dd10: e7c23115 bfi r3, r5, #2, #1 + 1f1dd14: e5902010 ldr r2, [r0, #16] + 1f1dd18: e5c0300e strb r3, [r0, #14] + 1f1dd1c: e1d000b6 ldrh r0, [r0, #6] + 1f1dd20: e12fff32 blx r2 + 1f1dd24: e30c3134 movw r3, #49460 ; 0xc134 + 1f1dd28: e34031f1 movt r3, #497 ; 0x1f1 + 1f1dd2c: e5843018 str r3, [r4, #24] + 1f1dd30: e584501c str r5, [r4, #28] + 1f1dd34: e8bd8070 pop {r4, r5, r6, pc} + +01f1dd38 : + 1f1dd38: e3a02000 mov r2, #0 + 1f1dd3c: e3e01000 mvn r1, #0 + 1f1dd40: e92d4010 push {r4, lr} + 1f1dd44: e3a0c001 mov ip, #1 + 1f1dd48: e3e04036 mvn r4, #54 ; 0x36 + 1f1dd4c: e3e0e004 mvn lr, #4 + 1f1dd50: e5c0403a strb r4, [r0, #58] ; 0x3a + 1f1dd54: e5c0e03b strb lr, [r0, #59] ; 0x3b + 1f1dd58: e5c02008 strb r2, [r0, #8] + 1f1dd5c: e5c02009 strb r2, [r0, #9] + 1f1dd60: e5c0200a strb r2, [r0, #10] + 1f1dd64: e580200c str r2, [r0, #12] + 1f1dd68: e5c0201c strb r2, [r0, #28] + 1f1dd6c: e5c0201d strb r2, [r0, #29] + 1f1dd70: e5c0201e strb r2, [r0, #30] + 1f1dd74: e5802020 str r2, [r0, #32] + 1f1dd78: e5c02004 strb r2, [r0, #4] + 1f1dd7c: e5c02005 strb r2, [r0, #5] + 1f1dd80: e5c02014 strb r2, [r0, #20] + 1f1dd84: e5c02015 strb r2, [r0, #21] + 1f1dd88: e5c02016 strb r2, [r0, #22] + 1f1dd8c: e5c02018 strb r2, [r0, #24] + 1f1dd90: e5c02029 strb r2, [r0, #41] ; 0x29 + 1f1dd94: e5c0202a strb r2, [r0, #42] ; 0x2a + 1f1dd98: e5c0202b strb r2, [r0, #43] ; 0x2b + 1f1dd9c: e5c0202d strb r2, [r0, #45] ; 0x2d + 1f1dda0: e5c02032 strb r2, [r0, #50] ; 0x32 + 1f1dda4: e5c02033 strb r2, [r0, #51] ; 0x33 + 1f1dda8: e5c02034 strb r2, [r0, #52] ; 0x34 + 1f1ddac: e5c02035 strb r2, [r0, #53] ; 0x35 + 1f1ddb0: e5c02037 strb r2, [r0, #55] ; 0x37 + 1f1ddb4: e5c02039 strb r2, [r0, #57] ; 0x39 + 1f1ddb8: e5c0203c strb r2, [r0, #60] ; 0x3c + 1f1ddbc: e5c0102e strb r1, [r0, #46] ; 0x2e + 1f1ddc0: e5c0102f strb r1, [r0, #47] ; 0x2f + 1f1ddc4: e5c01030 strb r1, [r0, #48] ; 0x30 + 1f1ddc8: e5c01031 strb r1, [r0, #49] ; 0x31 + 1f1ddcc: e5c0c038 strb ip, [r0, #56] ; 0x38 + 1f1ddd0: e5c0203d strb r2, [r0, #61] ; 0x3d + 1f1ddd4: e5c0203e strb r2, [r0, #62] ; 0x3e + 1f1ddd8: e5802044 str r2, [r0, #68] ; 0x44 + 1f1dddc: e5c02042 strb r2, [r0, #66] ; 0x42 + 1f1dde0: e5c02040 strb r2, [r0, #64] ; 0x40 + 1f1dde4: e5c0203f strb r2, [r0, #63] ; 0x3f + 1f1dde8: e5c02048 strb r2, [r0, #72] ; 0x48 + 1f1ddec: e5c02041 strb r2, [r0, #65] ; 0x41 + 1f1ddf0: e5c02043 strb r2, [r0, #67] ; 0x43 + 1f1ddf4: e5c02049 strb r2, [r0, #73] ; 0x49 + 1f1ddf8: e5c0204a strb r2, [r0, #74] ; 0x4a + 1f1ddfc: e5c0204b strb r2, [r0, #75] ; 0x4b + 1f1de00: e5c0c017 strb ip, [r0, #23] + 1f1de04: e5c0c02c strb ip, [r0, #44] ; 0x2c + 1f1de08: e580204c str r2, [r0, #76] ; 0x4c + 1f1de0c: e5802050 str r2, [r0, #80] ; 0x50 + 1f1de10: e5c02055 strb r2, [r0, #85] ; 0x55 + 1f1de14: e5c02054 strb r2, [r0, #84] ; 0x54 + 1f1de18: e8bd8010 pop {r4, pc} + +01f1de1c : + 1f1de1c: e3a03000 mov r3, #0 + 1f1de20: e3e02000 mvn r2, #0 + 1f1de24: e3a01001 mov r1, #1 + 1f1de28: e3e0c004 mvn ip, #4 + 1f1de2c: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f1de30: e5c0c03b strb ip, [r0, #59] ; 0x3b + 1f1de34: e3e0e036 mvn lr, #54 ; 0x36 + 1f1de38: e5c03004 strb r3, [r0, #4] + 1f1de3c: e5c0e03a strb lr, [r0, #58] ; 0x3a + 1f1de40: e5c03005 strb r3, [r0, #5] + 1f1de44: e5c03014 strb r3, [r0, #20] + 1f1de48: e5c03015 strb r3, [r0, #21] + 1f1de4c: e5c03016 strb r3, [r0, #22] + 1f1de50: e5c03018 strb r3, [r0, #24] + 1f1de54: e5c03029 strb r3, [r0, #41] ; 0x29 + 1f1de58: e5c0302a strb r3, [r0, #42] ; 0x2a + 1f1de5c: e5c0302b strb r3, [r0, #43] ; 0x2b + 1f1de60: e5c0302d strb r3, [r0, #45] ; 0x2d + 1f1de64: e5c03032 strb r3, [r0, #50] ; 0x32 + 1f1de68: e5c03033 strb r3, [r0, #51] ; 0x33 + 1f1de6c: e5c03034 strb r3, [r0, #52] ; 0x34 + 1f1de70: e5c03035 strb r3, [r0, #53] ; 0x35 + 1f1de74: e5c03037 strb r3, [r0, #55] ; 0x37 + 1f1de78: e5c03039 strb r3, [r0, #57] ; 0x39 + 1f1de7c: e5c0303c strb r3, [r0, #60] ; 0x3c + 1f1de80: e5c0303d strb r3, [r0, #61] ; 0x3d + 1f1de84: e5c0303e strb r3, [r0, #62] ; 0x3e + 1f1de88: e5803044 str r3, [r0, #68] ; 0x44 + 1f1de8c: e5c03042 strb r3, [r0, #66] ; 0x42 + 1f1de90: e5c03040 strb r3, [r0, #64] ; 0x40 + 1f1de94: e5c0303f strb r3, [r0, #63] ; 0x3f + 1f1de98: e5c03048 strb r3, [r0, #72] ; 0x48 + 1f1de9c: e5c03041 strb r3, [r0, #65] ; 0x41 + 1f1dea0: e5c0202e strb r2, [r0, #46] ; 0x2e + 1f1dea4: e5c0202f strb r2, [r0, #47] ; 0x2f + 1f1dea8: e5c02030 strb r2, [r0, #48] ; 0x30 + 1f1deac: e5c02031 strb r2, [r0, #49] ; 0x31 + 1f1deb0: e5c01038 strb r1, [r0, #56] ; 0x38 + 1f1deb4: e5c03043 strb r3, [r0, #67] ; 0x43 + 1f1deb8: e5c03049 strb r3, [r0, #73] ; 0x49 + 1f1debc: e5c0304a strb r3, [r0, #74] ; 0x4a + 1f1dec0: e5c0304b strb r3, [r0, #75] ; 0x4b + 1f1dec4: e5c01017 strb r1, [r0, #23] + 1f1dec8: e5c0102c strb r1, [r0, #44] ; 0x2c + 1f1decc: e580304c str r3, [r0, #76] ; 0x4c + 1f1ded0: e5803050 str r3, [r0, #80] ; 0x50 + 1f1ded4: e5c03055 strb r3, [r0, #85] ; 0x55 + 1f1ded8: e5c03054 strb r3, [r0, #84] ; 0x54 + 1f1dedc: e49df004 pop {pc} ; (ldr pc, [sp], #4) + +01f1dee0 : + 1f1dee0: e5d03016 ldrb r3, [r0, #22] + 1f1dee4: e1530001 cmp r3, r1 + 1f1dee8: 0a000003 beq 1f1defc + 1f1deec: e5d03004 ldrb r3, [r0, #4] + 1f1def0: e2032001 and r2, r3, #1 + 1f1def4: e1510002 cmp r1, r2 + 1f1def8: 0a000001 beq 1f1df04 + 1f1defc: e5c01016 strb r1, [r0, #22] + 1f1df00: e12fff1e bx lr + 1f1df04: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f1df08: e5d0c009 ldrb ip, [r0, #9] + 1f1df0c: e203302c and r3, r3, #44 ; 0x2c + 1f1df10: e5d0e00a ldrb lr, [r0, #10] + 1f1df14: e3530008 cmp r3, #8 + 1f1df18: e5d02008 ldrb r2, [r0, #8] + 1f1df1c: e1ccc00e bic ip, ip, lr + 1f1df20: e00e3002 and r3, lr, r2 + 1f1df24: e18c3003 orr r3, ip, r3 + 1f1df28: e5c03015 strb r3, [r0, #21] + 1f1df2c: 03a03000 moveq r3, #0 + 1f1df30: 05c03017 strbeq r3, [r0, #23] + 1f1df34: e5d03049 ldrb r3, [r0, #73] ; 0x49 + 1f1df38: e3130002 tst r3, #2 + 1f1df3c: 0a000001 beq 1f1df48 + 1f1df40: e5c01016 strb r1, [r0, #22] + 1f1df44: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f1df48: e5d0204a ldrb r2, [r0, #74] ; 0x4a + 1f1df4c: e383c002 orr ip, r3, #2 + 1f1df50: e5c0c049 strb ip, [r0, #73] ; 0x49 + 1f1df54: e202207f and r2, r2, #127 ; 0x7f + 1f1df58: e01c2002 ands r2, ip, r2 + 1f1df5c: 0a00000a beq 1f1df8c + 1f1df60: e31c0080 tst ip, #128 ; 0x80 + 1f1df64: 1afffff5 bne 1f1df40 + 1f1df68: e5902000 ldr r2, [r0] + 1f1df6c: e1e03003 mvn r3, r3 + 1f1df70: e203307d and r3, r3, #125 ; 0x7d + 1f1df74: e3520000 cmp r2, #0 + 1f1df78: e1e03003 mvn r3, r3 + 1f1df7c: e5c03049 strb r3, [r0, #73] ; 0x49 + 1f1df80: 13a03001 movne r3, #1 + 1f1df84: 15c23000 strbne r3, [r2] + 1f1df88: eaffffec b 1f1df40 + 1f1df8c: e31c0080 tst ip, #128 ; 0x80 + 1f1df90: 0affffea beq 1f1df40 + 1f1df94: e590c000 ldr ip, [r0] + 1f1df98: e203307f and r3, r3, #127 ; 0x7f + 1f1df9c: e3833002 orr r3, r3, #2 + 1f1dfa0: e5c03049 strb r3, [r0, #73] ; 0x49 + 1f1dfa4: e35c0000 cmp ip, #0 + 1f1dfa8: 15cc2000 strbne r2, [ip] + 1f1dfac: eaffffe3 b 1f1df40 + +01f1dfb0 : + 1f1dfb0: e5d03004 ldrb r3, [r0, #4] + 1f1dfb4: e3130008 tst r3, #8 + 1f1dfb8: 112fff1e bxne lr + 1f1dfbc: e5d02017 ldrb r2, [r0, #23] + 1f1dfc0: e1520001 cmp r2, r1 + 1f1dfc4: 0a000002 beq 1f1dfd4 + 1f1dfc8: e7e03153 ubfx r3, r3, #2, #1 + 1f1dfcc: e1510003 cmp r1, r3 + 1f1dfd0: 0a000001 beq 1f1dfdc + 1f1dfd4: e5c01017 strb r1, [r0, #23] + 1f1dfd8: e12fff1e bx lr + 1f1dfdc: e5d03049 ldrb r3, [r0, #73] ; 0x49 + 1f1dfe0: e3130001 tst r3, #1 + 1f1dfe4: 1afffffa bne 1f1dfd4 + 1f1dfe8: e5d0204a ldrb r2, [r0, #74] ; 0x4a + 1f1dfec: e383c001 orr ip, r3, #1 + 1f1dff0: e5c0c049 strb ip, [r0, #73] ; 0x49 + 1f1dff4: e202207f and r2, r2, #127 ; 0x7f + 1f1dff8: e01c2002 ands r2, ip, r2 + 1f1dffc: 0a00000a beq 1f1e02c + 1f1e000: e31c0080 tst ip, #128 ; 0x80 + 1f1e004: 1afffff2 bne 1f1dfd4 + 1f1e008: e5902000 ldr r2, [r0] + 1f1e00c: e1e03003 mvn r3, r3 + 1f1e010: e203307e and r3, r3, #126 ; 0x7e + 1f1e014: e3520000 cmp r2, #0 + 1f1e018: e1e03003 mvn r3, r3 + 1f1e01c: e5c03049 strb r3, [r0, #73] ; 0x49 + 1f1e020: 13a03001 movne r3, #1 + 1f1e024: 15c23000 strbne r3, [r2] + 1f1e028: eaffffe9 b 1f1dfd4 + 1f1e02c: e31c0080 tst ip, #128 ; 0x80 + 1f1e030: 0affffe7 beq 1f1dfd4 + 1f1e034: e590c000 ldr ip, [r0] + 1f1e038: e203307f and r3, r3, #127 ; 0x7f + 1f1e03c: e3833001 orr r3, r3, #1 + 1f1e040: e5c03049 strb r3, [r0, #73] ; 0x49 + 1f1e044: e35c0000 cmp ip, #0 + 1f1e048: 15cc2000 strbne r2, [ip] + 1f1e04c: eaffffe0 b 1f1dfd4 + +01f1e050 : + 1f1e050: e5d0302a ldrb r3, [r0, #42] ; 0x2a + 1f1e054: e1530001 cmp r3, r1 + 1f1e058: 0a000003 beq 1f1e06c + 1f1e05c: e5d03004 ldrb r3, [r0, #4] + 1f1e060: e2032001 and r2, r3, #1 + 1f1e064: e1510002 cmp r1, r2 + 1f1e068: 0a000001 beq 1f1e074 + 1f1e06c: e5c0102a strb r1, [r0, #42] ; 0x2a + 1f1e070: e12fff1e bx lr + 1f1e074: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f1e078: e5d0c01d ldrb ip, [r0, #29] + 1f1e07c: e20330e0 and r3, r3, #224 ; 0xe0 + 1f1e080: e5d0e01e ldrb lr, [r0, #30] + 1f1e084: e3530080 cmp r3, #128 ; 0x80 + 1f1e088: e5d0201c ldrb r2, [r0, #28] + 1f1e08c: e1ccc00e bic ip, ip, lr + 1f1e090: e00e3002 and r3, lr, r2 + 1f1e094: e18c3003 orr r3, ip, r3 + 1f1e098: e5c03029 strb r3, [r0, #41] ; 0x29 + 1f1e09c: 03a03000 moveq r3, #0 + 1f1e0a0: 05c0302c strbeq r3, [r0, #44] ; 0x2c + 1f1e0a4: e5d03049 ldrb r3, [r0, #73] ; 0x49 + 1f1e0a8: e3130010 tst r3, #16 + 1f1e0ac: 0a000001 beq 1f1e0b8 + 1f1e0b0: e5c0102a strb r1, [r0, #42] ; 0x2a + 1f1e0b4: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f1e0b8: e5d0204a ldrb r2, [r0, #74] ; 0x4a + 1f1e0bc: e383c010 orr ip, r3, #16 + 1f1e0c0: e5c0c049 strb ip, [r0, #73] ; 0x49 + 1f1e0c4: e202207f and r2, r2, #127 ; 0x7f + 1f1e0c8: e01c2002 ands r2, ip, r2 + 1f1e0cc: 0a00000a beq 1f1e0fc + 1f1e0d0: e31c0080 tst ip, #128 ; 0x80 + 1f1e0d4: 1afffff5 bne 1f1e0b0 + 1f1e0d8: e5902000 ldr r2, [r0] + 1f1e0dc: e1e03003 mvn r3, r3 + 1f1e0e0: e203306f and r3, r3, #111 ; 0x6f + 1f1e0e4: e3520000 cmp r2, #0 + 1f1e0e8: e1e03003 mvn r3, r3 + 1f1e0ec: e5c03049 strb r3, [r0, #73] ; 0x49 + 1f1e0f0: 13a03001 movne r3, #1 + 1f1e0f4: 15c23000 strbne r3, [r2] + 1f1e0f8: eaffffec b 1f1e0b0 + 1f1e0fc: e31c0080 tst ip, #128 ; 0x80 + 1f1e100: 0affffea beq 1f1e0b0 + 1f1e104: e590c000 ldr ip, [r0] + 1f1e108: e203307f and r3, r3, #127 ; 0x7f + 1f1e10c: e3833010 orr r3, r3, #16 + 1f1e110: e5c03049 strb r3, [r0, #73] ; 0x49 + 1f1e114: e35c0000 cmp ip, #0 + 1f1e118: 15cc2000 strbne r2, [ip] + 1f1e11c: eaffffe3 b 1f1e0b0 + +01f1e120 : + 1f1e120: e5d03004 ldrb r3, [r0, #4] + 1f1e124: e3130080 tst r3, #128 ; 0x80 + 1f1e128: 112fff1e bxne lr + 1f1e12c: e5d0202c ldrb r2, [r0, #44] ; 0x2c + 1f1e130: e1520001 cmp r2, r1 + 1f1e134: 0a000002 beq 1f1e144 + 1f1e138: e7e03353 ubfx r3, r3, #6, #1 + 1f1e13c: e1510003 cmp r1, r3 + 1f1e140: 0a000001 beq 1f1e14c + 1f1e144: e5c0102c strb r1, [r0, #44] ; 0x2c + 1f1e148: e12fff1e bx lr + 1f1e14c: e5d03049 ldrb r3, [r0, #73] ; 0x49 + 1f1e150: e3130008 tst r3, #8 + 1f1e154: 1afffffa bne 1f1e144 + 1f1e158: e5d0204a ldrb r2, [r0, #74] ; 0x4a + 1f1e15c: e383c008 orr ip, r3, #8 + 1f1e160: e5c0c049 strb ip, [r0, #73] ; 0x49 + 1f1e164: e202207f and r2, r2, #127 ; 0x7f + 1f1e168: e01c2002 ands r2, ip, r2 + 1f1e16c: 0a00000a beq 1f1e19c + 1f1e170: e31c0080 tst ip, #128 ; 0x80 + 1f1e174: 1afffff2 bne 1f1e144 + 1f1e178: e5902000 ldr r2, [r0] + 1f1e17c: e1e03003 mvn r3, r3 + 1f1e180: e2033077 and r3, r3, #119 ; 0x77 + 1f1e184: e3520000 cmp r2, #0 + 1f1e188: e1e03003 mvn r3, r3 + 1f1e18c: e5c03049 strb r3, [r0, #73] ; 0x49 + 1f1e190: 13a03001 movne r3, #1 + 1f1e194: 15c23000 strbne r3, [r2] + 1f1e198: eaffffe9 b 1f1e144 + 1f1e19c: e31c0080 tst ip, #128 ; 0x80 + 1f1e1a0: 0affffe7 beq 1f1e144 + 1f1e1a4: e590c000 ldr ip, [r0] + 1f1e1a8: e203307f and r3, r3, #127 ; 0x7f + 1f1e1ac: e3833008 orr r3, r3, #8 + 1f1e1b0: e5c03049 strb r3, [r0, #73] ; 0x49 + 1f1e1b4: e35c0000 cmp ip, #0 + 1f1e1b8: 15cc2000 strbne r2, [ip] + 1f1e1bc: eaffffe0 b 1f1e144 + +01f1e1c0 : + 1f1e1c0: e5d03017 ldrb r3, [r0, #23] + 1f1e1c4: e92d4070 push {r4, r5, r6, lr} + 1f1e1c8: e3530000 cmp r3, #0 + 1f1e1cc: e1a04000 mov r4, r0 + 1f1e1d0: 0a000003 beq 1f1e1e4 + 1f1e1d4: e5d03018 ldrb r3, [r0, #24] + 1f1e1d8: e3530000 cmp r3, #0 + 1f1e1dc: 13a03000 movne r3, #0 + 1f1e1e0: 15c03017 strbne r3, [r0, #23] + 1f1e1e4: e5d4302c ldrb r3, [r4, #44] ; 0x2c + 1f1e1e8: e3530000 cmp r3, #0 + 1f1e1ec: 0a000003 beq 1f1e200 + 1f1e1f0: e5d4302d ldrb r3, [r4, #45] ; 0x2d + 1f1e1f4: e3530000 cmp r3, #0 + 1f1e1f8: 13a03000 movne r3, #0 + 1f1e1fc: 15c4302c strbne r3, [r4, #44] ; 0x2c + 1f1e200: e5d43037 ldrb r3, [r4, #55] ; 0x37 + 1f1e204: e3530000 cmp r3, #0 + 1f1e208: 0a000052 beq 1f1e358 + 1f1e20c: e5d41035 ldrb r1, [r4, #53] ; 0x35 + 1f1e210: e3a03000 mov r3, #0 + 1f1e214: e1d423b0 ldrh r2, [r4, #48] ; 0x30 + 1f1e218: e1510003 cmp r1, r3 + 1f1e21c: e1c422be strh r2, [r4, #46] ; 0x2e + 1f1e220: e5c43037 strb r3, [r4, #55] ; 0x37 + 1f1e224: 0a000080 beq 1f1e42c + 1f1e228: e5d43036 ldrb r3, [r4, #54] ; 0x36 + 1f1e22c: e3530000 cmp r3, #0 + 1f1e230: 1a00015e bne 1f1e7b0 + 1f1e234: e1d421de ldrsb r2, [r4, #30] + 1f1e238: e5d4301d ldrb r3, [r4, #29] + 1f1e23c: e3a01000 mov r1, #0 + 1f1e240: e5d4c041 ldrb ip, [r4, #65] ; 0x41 + 1f1e244: e1c33002 bic r3, r3, r2 + 1f1e248: e5d40005 ldrb r0, [r4, #5] + 1f1e24c: e2033040 and r3, r3, #64 ; 0x40 + 1f1e250: e15c0001 cmp ip, r1 + 1f1e254: e7e22150 ubfx r2, r0, #2, #3 + 1f1e258: e5d4c055 ldrb ip, [r4, #85] ; 0x55 + 1f1e25c: e5c41033 strb r1, [r4, #51] ; 0x33 + 1f1e260: e6ef3073 uxtb r3, r3 + 1f1e264: e5c41055 strb r1, [r4, #85] ; 0x55 + 1f1e268: 0a00001c beq 1f1e2e0 + 1f1e26c: e5d4e043 ldrb lr, [r4, #67] ; 0x43 + 1f1e270: e5c41041 strb r1, [r4, #65] ; 0x41 + 1f1e274: e15e0001 cmp lr, r1 + 1f1e278: 1a000004 bne 1f1e290 + 1f1e27c: e5d41049 ldrb r1, [r4, #73] ; 0x49 + 1f1e280: e3a0e001 mov lr, #1 + 1f1e284: e5c4e043 strb lr, [r4, #67] ; 0x43 + 1f1e288: e3110020 tst r1, #32 + 1f1e28c: 0a00015a beq 1f1e7fc + 1f1e290: e200100c and r1, r0, #12 + 1f1e294: e3510004 cmp r1, #4 + 1f1e298: 0a00013b beq 1f1e78c + 1f1e29c: e5d4103c ldrb r1, [r4, #60] ; 0x3c + 1f1e2a0: e35100ff cmp r1, #255 ; 0xff + 1f1e2a4: 01d4e3ba ldrheq lr, [r4, #58] ; 0x3a + 1f1e2a8: 024ee001 subeq lr, lr, #1 + 1f1e2ac: 01c4e3ba strheq lr, [r4, #58] ; 0x3a + 1f1e2b0: e594e044 ldr lr, [r4, #68] ; 0x44 + 1f1e2b4: e35e0001 cmp lr, #1 + 1f1e2b8: 9a000005 bls 1f1e2d4 + 1f1e2bc: e5d4e03b ldrb lr, [r4, #59] ; 0x3b + 1f1e2c0: e35e0000 cmp lr, #0 + 1f1e2c4: 02811002 addeq r1, r1, #2 + 1f1e2c8: 03e0e000 mvneq lr, #0 + 1f1e2cc: 05c4e03b strbeq lr, [r4, #59] ; 0x3b + 1f1e2d0: 06ef1071 uxtbeq r1, r1 + 1f1e2d4: e5c4103a strb r1, [r4, #58] ; 0x3a + 1f1e2d8: e3a01000 mov r1, #0 + 1f1e2dc: e5c41042 strb r1, [r4, #66] ; 0x42 + 1f1e2e0: e5d4103e ldrb r1, [r4, #62] ; 0x3e + 1f1e2e4: e3510000 cmp r1, #0 + 1f1e2e8: e5d41040 ldrb r1, [r4, #64] ; 0x40 + 1f1e2ec: 0a00000c beq 1f1e324 + 1f1e2f0: e5d4e03f ldrb lr, [r4, #63] ; 0x3f + 1f1e2f4: e15e0001 cmp lr, r1 + 1f1e2f8: 0a000064 beq 1f1e490 + 1f1e2fc: e3510000 cmp r1, #0 + 1f1e300: e3a00000 mov r0, #0 + 1f1e304: e5c40043 strb r0, [r4, #67] ; 0x43 + 1f1e308: e1d403ba ldrh r0, [r4, #58] ; 0x3a + 1f1e30c: 1a00006c bne 1f1e4c4 + 1f1e310: e3500000 cmp r0, #0 + 1f1e314: 1a000002 bne 1f1e324 + 1f1e318: e5d40049 ldrb r0, [r4, #73] ; 0x49 + 1f1e31c: e3100020 tst r0, #32 + 1f1e320: 0a00017e beq 1f1e920 + 1f1e324: e2422001 sub r2, r2, #1 + 1f1e328: e5c43048 strb r3, [r4, #72] ; 0x48 + 1f1e32c: e5c4103f strb r1, [r4, #63] ; 0x3f + 1f1e330: e3520006 cmp r2, #6 + 1f1e334: 979ff102 ldrls pc, [pc, r2, lsl #2] + 1f1e338: ea000038 b 1f1e420 + 1f1e33c: 01f1e65c .word 0x01f1e65c + 1f1e340: 01f1e6a4 .word 0x01f1e6a4 + 1f1e344: 01f1e4e0 .word 0x01f1e4e0 + 1f1e348: 01f1e554 .word 0x01f1e554 + 1f1e34c: 01f1e578 .word 0x01f1e578 + 1f1e350: 01f1e618 .word 0x01f1e618 + 1f1e354: 01f1e6e4 .word 0x01f1e6e4 + 1f1e358: e5d43032 ldrb r3, [r4, #50] ; 0x32 + 1f1e35c: e3530000 cmp r3, #0 + 1f1e360: 0affffb3 beq 1f1e234 + 1f1e364: e5d43033 ldrb r3, [r4, #51] ; 0x33 + 1f1e368: e3530000 cmp r3, #0 + 1f1e36c: 1affffb0 bne 1f1e234 + 1f1e370: e1d432be ldrh r3, [r4, #46] ; 0x2e + 1f1e374: e3530000 cmp r3, #0 + 1f1e378: e2433001 sub r3, r3, #1 + 1f1e37c: e1c432be strh r3, [r4, #46] ; 0x2e + 1f1e380: 1affffab bne 1f1e234 + 1f1e384: e5d43035 ldrb r3, [r4, #53] ; 0x35 + 1f1e388: e3a02001 mov r2, #1 + 1f1e38c: e5c42037 strb r2, [r4, #55] ; 0x37 + 1f1e390: e3530000 cmp r3, #0 + 1f1e394: 0a00014a beq 1f1e8c4 + 1f1e398: e1d433b0 ldrh r3, [r4, #48] ; 0x30 + 1f1e39c: e3530001 cmp r3, #1 + 1f1e3a0: 9affffa3 bls 1f1e234 + 1f1e3a4: e5d42034 ldrb r2, [r4, #52] ; 0x34 + 1f1e3a8: e5d43038 ldrb r3, [r4, #56] ; 0x38 + 1f1e3ac: e3520000 cmp r2, #0 + 1f1e3b0: e2233001 eor r3, r3, #1 + 1f1e3b4: e5c43038 strb r3, [r4, #56] ; 0x38 + 1f1e3b8: 0affff9d beq 1f1e234 + 1f1e3bc: e5d4101e ldrb r1, [r4, #30] + 1f1e3c0: e6af2071 sxtb r2, r1 + 1f1e3c4: e3520000 cmp r2, #0 + 1f1e3c8: aaffff9a bge 1f1e238 + 1f1e3cc: e3530000 cmp r3, #0 + 1f1e3d0: e5945020 ldr r5, [r4, #32] + 1f1e3d4: e5d4301c ldrb r3, [r4, #28] + 1f1e3d8: 1a000189 bne 1f1ea04 + 1f1e3dc: e3550000 cmp r5, #0 + 1f1e3e0: e203307f and r3, r3, #127 ; 0x7f + 1f1e3e4: e5c4301c strb r3, [r4, #28] + 1f1e3e8: 0affff92 beq 1f1e238 + 1f1e3ec: e0011003 and r1, r1, r3 + 1f1e3f0: e5940024 ldr r0, [r4, #36] ; 0x24 + 1f1e3f4: e12fff35 blx r5 + 1f1e3f8: e1d421de ldrsb r2, [r4, #30] + 1f1e3fc: eaffff8d b 1f1e238 + 1f1e400: e3110080 tst r1, #128 ; 0x80 + 1f1e404: 0a000005 beq 1f1e420 + 1f1e408: e5941000 ldr r1, [r4] + 1f1e40c: e203307f and r3, r3, #127 ; 0x7f + 1f1e410: e3833004 orr r3, r3, #4 + 1f1e414: e5c43049 strb r3, [r4, #73] ; 0x49 + 1f1e418: e3510000 cmp r1, #0 + 1f1e41c: 15c12000 strbne r2, [r1] + 1f1e420: e5d4302a ldrb r3, [r4, #42] ; 0x2a + 1f1e424: e5c4302b strb r3, [r4, #43] ; 0x2b + 1f1e428: e8bd8070 pop {r4, r5, r6, pc} + 1f1e42c: e5d43039 ldrb r3, [r4, #57] ; 0x39 + 1f1e430: e3530000 cmp r3, #0 + 1f1e434: 1affff7e bne 1f1e234 + 1f1e438: e5d43049 ldrb r3, [r4, #73] ; 0x49 + 1f1e43c: e3a02001 mov r2, #1 + 1f1e440: e5c42039 strb r2, [r4, #57] ; 0x39 + 1f1e444: e3130040 tst r3, #64 ; 0x40 + 1f1e448: 1affff79 bne 1f1e234 + 1f1e44c: e5d4104a ldrb r1, [r4, #74] ; 0x4a + 1f1e450: e3830040 orr r0, r3, #64 ; 0x40 + 1f1e454: e5c40049 strb r0, [r4, #73] ; 0x49 + 1f1e458: e201107f and r1, r1, #127 ; 0x7f + 1f1e45c: e0101001 ands r1, r0, r1 + 1f1e460: 0a00013f beq 1f1e964 + 1f1e464: e3100080 tst r0, #128 ; 0x80 + 1f1e468: 1affff71 bne 1f1e234 + 1f1e46c: e5941000 ldr r1, [r4] + 1f1e470: e1e03d03 mvn r3, r3, lsl #26 + 1f1e474: e3510000 cmp r1, #0 + 1f1e478: e1e03d23 mvn r3, r3, lsr #26 + 1f1e47c: e5c43049 strb r3, [r4, #73] ; 0x49 + 1f1e480: 0affff6b beq 1f1e234 + 1f1e484: e5c12000 strb r2, [r1] + 1f1e488: e1d421de ldrsb r2, [r4, #30] + 1f1e48c: eaffff69 b 1f1e238 + 1f1e490: e5d4e03d ldrb lr, [r4, #61] ; 0x3d + 1f1e494: e35e0000 cmp lr, #0 + 1f1e498: 13a00000 movne r0, #0 + 1f1e49c: 15c4003d strbne r0, [r4, #61] ; 0x3d + 1f1e4a0: 1affff9f bne 1f1e324 + 1f1e4a4: e3510000 cmp r1, #0 + 1f1e4a8: 0a0000e4 beq 1f1e840 + 1f1e4ac: e3530000 cmp r3, #0 + 1f1e4b0: 1affff9b bne 1f1e324 + 1f1e4b4: e5d40048 ldrb r0, [r4, #72] ; 0x48 + 1f1e4b8: e3500001 cmp r0, #1 + 1f1e4bc: 1affff98 bne 1f1e324 + 1f1e4c0: e1d403ba ldrh r0, [r4, #58] ; 0x3a + 1f1e4c4: e2400001 sub r0, r0, #1 + 1f1e4c8: e6ff0070 uxth r0, r0 + 1f1e4cc: e1c403ba strh r0, [r4, #58] ; 0x3a + 1f1e4d0: e16f0f10 clz r0, r0 + 1f1e4d4: e1a002a0 lsr r0, r0, #5 + 1f1e4d8: e5c40041 strb r0, [r4, #65] ; 0x41 + 1f1e4dc: eaffff90 b 1f1e324 + 1f1e4e0: e5d4302b ldrb r3, [r4, #43] ; 0x2b + 1f1e4e4: e3530000 cmp r3, #0 + 1f1e4e8: 0affffcc beq 1f1e420 + 1f1e4ec: e5d4302a ldrb r3, [r4, #42] ; 0x2a + 1f1e4f0: e3530000 cmp r3, #0 + 1f1e4f4: 1affffca bne 1f1e424 + 1f1e4f8: e594204c ldr r2, [r4, #76] ; 0x4c + 1f1e4fc: e3120008 tst r2, #8 + 1f1e500: 1affffc7 bne 1f1e424 + 1f1e504: e2822001 add r2, r2, #1 + 1f1e508: e5d4004b ldrb r0, [r4, #75] ; 0x4b + 1f1e50c: e3520008 cmp r2, #8 + 1f1e510: e5d4102c ldrb r1, [r4, #44] ; 0x2c + 1f1e514: e584204c str r2, [r4, #76] ; 0x4c + 1f1e518: e1812080 orr r2, r1, r0, lsl #1 + 1f1e51c: e5c4204b strb r2, [r4, #75] ; 0x4b + 1f1e520: 1affffbf bne 1f1e424 + 1f1e524: e5d42049 ldrb r2, [r4, #73] ; 0x49 + 1f1e528: e3120004 tst r2, #4 + 1f1e52c: 1affffbc bne 1f1e424 + 1f1e530: e5d4104a ldrb r1, [r4, #74] ; 0x4a + 1f1e534: e3820004 orr r0, r2, #4 + 1f1e538: e5c40049 strb r0, [r4, #73] ; 0x49 + 1f1e53c: e201107f and r1, r1, #127 ; 0x7f + 1f1e540: e1100001 tst r0, r1 + 1f1e544: 0a00013f beq 1f1ea48 + 1f1e548: e3100080 tst r0, #128 ; 0x80 + 1f1e54c: 0a000085 beq 1f1e768 + 1f1e550: eaffffb3 b 1f1e424 + 1f1e554: e35c0000 cmp ip, #0 + 1f1e558: 0affffb0 beq 1f1e420 + 1f1e55c: e5d4104b ldrb r1, [r4, #75] ; 0x4b + 1f1e560: e5d4302a ldrb r3, [r4, #42] ; 0x2a + 1f1e564: e1a023a1 lsr r2, r1, #7 + 1f1e568: e5c42054 strb r2, [r4, #84] ; 0x54 + 1f1e56c: e1822081 orr r2, r2, r1, lsl #1 + 1f1e570: e5c4204b strb r2, [r4, #75] ; 0x4b + 1f1e574: eaffffaa b 1f1e424 + 1f1e578: e5943044 ldr r3, [r4, #68] ; 0x44 + 1f1e57c: e3530002 cmp r3, #2 + 1f1e580: 93a0c000 movls ip, #0 + 1f1e584: 820cc001 andhi ip, ip, #1 + 1f1e588: e35c0000 cmp ip, #0 + 1f1e58c: 0affffa3 beq 1f1e420 + 1f1e590: e594304c ldr r3, [r4, #76] ; 0x4c + 1f1e594: e3130008 tst r3, #8 + 1f1e598: 1affffa0 bne 1f1e420 + 1f1e59c: e5d4204b ldrb r2, [r4, #75] ; 0x4b + 1f1e5a0: e2833001 add r3, r3, #1 + 1f1e5a4: e3530008 cmp r3, #8 + 1f1e5a8: e584304c str r3, [r4, #76] ; 0x4c + 1f1e5ac: e1a033a2 lsr r3, r2, #7 + 1f1e5b0: e5c43054 strb r3, [r4, #84] ; 0x54 + 1f1e5b4: e1833082 orr r3, r3, r2, lsl #1 + 1f1e5b8: e5c4304b strb r3, [r4, #75] ; 0x4b + 1f1e5bc: 1affff97 bne 1f1e420 + 1f1e5c0: e5d43049 ldrb r3, [r4, #73] ; 0x49 + 1f1e5c4: e3130004 tst r3, #4 + 1f1e5c8: 1affff94 bne 1f1e420 + 1f1e5cc: e5d4204a ldrb r2, [r4, #74] ; 0x4a + 1f1e5d0: e3831004 orr r1, r3, #4 + 1f1e5d4: e5c41049 strb r1, [r4, #73] ; 0x49 + 1f1e5d8: e202207f and r2, r2, #127 ; 0x7f + 1f1e5dc: e0112002 ands r2, r1, r2 + 1f1e5e0: 0affff86 beq 1f1e400 + 1f1e5e4: e3110080 tst r1, #128 ; 0x80 + 1f1e5e8: 1affff8c bne 1f1e420 + 1f1e5ec: e5942000 ldr r2, [r4] + 1f1e5f0: e1e03003 mvn r3, r3 + 1f1e5f4: e203307b and r3, r3, #123 ; 0x7b + 1f1e5f8: e3520000 cmp r2, #0 + 1f1e5fc: e1e03003 mvn r3, r3 + 1f1e600: e5c43049 strb r3, [r4, #73] ; 0x49 + 1f1e604: 0affff85 beq 1f1e420 + 1f1e608: e3a01001 mov r1, #1 + 1f1e60c: e5d4302a ldrb r3, [r4, #42] ; 0x2a + 1f1e610: e5c21000 strb r1, [r2] + 1f1e614: eaffff82 b 1f1e424 + 1f1e618: e594304c ldr r3, [r4, #76] ; 0x4c + 1f1e61c: e3130008 tst r3, #8 + 1f1e620: 1affff7e bne 1f1e420 + 1f1e624: e5d4104b ldrb r1, [r4, #75] ; 0x4b + 1f1e628: e2833001 add r3, r3, #1 + 1f1e62c: e5942050 ldr r2, [r4, #80] ; 0x50 + 1f1e630: e3530008 cmp r3, #8 + 1f1e634: e584304c str r3, [r4, #76] ; 0x4c + 1f1e638: e16f2f12 clz r2, r2 + 1f1e63c: e1a033a1 lsr r3, r1, #7 + 1f1e640: e1831081 orr r1, r3, r1, lsl #1 + 1f1e644: e5c43054 strb r3, [r4, #84] ; 0x54 + 1f1e648: e1a022a2 lsr r2, r2, #5 + 1f1e64c: e5c4104b strb r1, [r4, #75] ; 0x4b + 1f1e650: e5842050 str r2, [r4, #80] ; 0x50 + 1f1e654: 1affff71 bne 1f1e420 + 1f1e658: eaffffd8 b 1f1e5c0 + 1f1e65c: e5943044 ldr r3, [r4, #68] ; 0x44 + 1f1e660: e3530002 cmp r3, #2 + 1f1e664: 93a0c000 movls ip, #0 + 1f1e668: 820cc001 andhi ip, ip, #1 + 1f1e66c: e35c0000 cmp ip, #0 + 1f1e670: 0affff6a beq 1f1e420 + 1f1e674: e594304c ldr r3, [r4, #76] ; 0x4c + 1f1e678: e3130008 tst r3, #8 + 1f1e67c: 1affff67 bne 1f1e420 + 1f1e680: e2833001 add r3, r3, #1 + 1f1e684: e5d4104b ldrb r1, [r4, #75] ; 0x4b + 1f1e688: e3530008 cmp r3, #8 + 1f1e68c: e5d4202c ldrb r2, [r4, #44] ; 0x2c + 1f1e690: e584304c str r3, [r4, #76] ; 0x4c + 1f1e694: e1823081 orr r3, r2, r1, lsl #1 + 1f1e698: e5c4304b strb r3, [r4, #75] ; 0x4b + 1f1e69c: 1affff5f bne 1f1e420 + 1f1e6a0: eaffffc6 b 1f1e5c0 + 1f1e6a4: e594304c ldr r3, [r4, #76] ; 0x4c + 1f1e6a8: e3130008 tst r3, #8 + 1f1e6ac: 1affff5b bne 1f1e420 + 1f1e6b0: e5942050 ldr r2, [r4, #80] ; 0x50 + 1f1e6b4: e2833001 add r3, r3, #1 + 1f1e6b8: e5d4004b ldrb r0, [r4, #75] ; 0x4b + 1f1e6bc: e3530008 cmp r3, #8 + 1f1e6c0: e16f2f12 clz r2, r2 + 1f1e6c4: e5d4102c ldrb r1, [r4, #44] ; 0x2c + 1f1e6c8: e584304c str r3, [r4, #76] ; 0x4c + 1f1e6cc: e1a022a2 lsr r2, r2, #5 + 1f1e6d0: e1813080 orr r3, r1, r0, lsl #1 + 1f1e6d4: e5842050 str r2, [r4, #80] ; 0x50 + 1f1e6d8: e5c4304b strb r3, [r4, #75] ; 0x4b + 1f1e6dc: 1affff4f bne 1f1e420 + 1f1e6e0: eaffffb6 b 1f1e5c0 + 1f1e6e4: e5d4302b ldrb r3, [r4, #43] ; 0x2b + 1f1e6e8: e3530000 cmp r3, #0 + 1f1e6ec: 0affff4b beq 1f1e420 + 1f1e6f0: e5d4302a ldrb r3, [r4, #42] ; 0x2a + 1f1e6f4: e3530000 cmp r3, #0 + 1f1e6f8: 1affff49 bne 1f1e424 + 1f1e6fc: e594204c ldr r2, [r4, #76] ; 0x4c + 1f1e700: e3120008 tst r2, #8 + 1f1e704: 1affff46 bne 1f1e424 + 1f1e708: e5d4004b ldrb r0, [r4, #75] ; 0x4b + 1f1e70c: e2822001 add r2, r2, #1 + 1f1e710: e5941050 ldr r1, [r4, #80] ; 0x50 + 1f1e714: e3520008 cmp r2, #8 + 1f1e718: e584204c str r2, [r4, #76] ; 0x4c + 1f1e71c: e16f1f11 clz r1, r1 + 1f1e720: e1a023a0 lsr r2, r0, #7 + 1f1e724: e1820080 orr r0, r2, r0, lsl #1 + 1f1e728: e5c42054 strb r2, [r4, #84] ; 0x54 + 1f1e72c: e1a012a1 lsr r1, r1, #5 + 1f1e730: e5c4004b strb r0, [r4, #75] ; 0x4b + 1f1e734: e5841050 str r1, [r4, #80] ; 0x50 + 1f1e738: 1affff39 bne 1f1e424 + 1f1e73c: e5d42049 ldrb r2, [r4, #73] ; 0x49 + 1f1e740: e3120004 tst r2, #4 + 1f1e744: 1affff36 bne 1f1e424 + 1f1e748: e5d4004a ldrb r0, [r4, #74] ; 0x4a + 1f1e74c: e3821004 orr r1, r2, #4 + 1f1e750: e5c41049 strb r1, [r4, #73] ; 0x49 + 1f1e754: e200007f and r0, r0, #127 ; 0x7f + 1f1e758: e1110000 tst r1, r0 + 1f1e75c: 0a0000b0 beq 1f1ea24 + 1f1e760: e3110080 tst r1, #128 ; 0x80 + 1f1e764: 1affff2e bne 1f1e424 + 1f1e768: e5941000 ldr r1, [r4] + 1f1e76c: e1e02002 mvn r2, r2 + 1f1e770: e202207b and r2, r2, #123 ; 0x7b + 1f1e774: e3510000 cmp r1, #0 + 1f1e778: e1e02002 mvn r2, r2 + 1f1e77c: e5c42049 strb r2, [r4, #73] ; 0x49 + 1f1e780: 13a02001 movne r2, #1 + 1f1e784: 15c12000 strbne r2, [r1] + 1f1e788: eaffff25 b 1f1e424 + 1f1e78c: e5941050 ldr r1, [r4, #80] ; 0x50 + 1f1e790: e3510000 cmp r1, #0 + 1f1e794: 13a0e001 movne lr, #1 + 1f1e798: 03a0e000 moveq lr, #0 + 1f1e79c: 03a01001 moveq r1, #1 + 1f1e7a0: 13a01000 movne r1, #0 + 1f1e7a4: e5c4e055 strb lr, [r4, #85] ; 0x55 + 1f1e7a8: e5841050 str r1, [r4, #80] ; 0x50 + 1f1e7ac: eafffeba b 1f1e29c + 1f1e7b0: e5d43049 ldrb r3, [r4, #73] ; 0x49 + 1f1e7b4: e3130040 tst r3, #64 ; 0x40 + 1f1e7b8: 1afffe9d bne 1f1e234 + 1f1e7bc: e5d4204a ldrb r2, [r4, #74] ; 0x4a + 1f1e7c0: e3831040 orr r1, r3, #64 ; 0x40 + 1f1e7c4: e5c41049 strb r1, [r4, #73] ; 0x49 + 1f1e7c8: e202207f and r2, r2, #127 ; 0x7f + 1f1e7cc: e0112002 ands r2, r1, r2 + 1f1e7d0: 0a00006e beq 1f1e990 + 1f1e7d4: e3110080 tst r1, #128 ; 0x80 + 1f1e7d8: 1afffe95 bne 1f1e234 + 1f1e7dc: e5942000 ldr r2, [r4] + 1f1e7e0: e1e03d03 mvn r3, r3, lsl #26 + 1f1e7e4: e3520000 cmp r2, #0 + 1f1e7e8: e1e03d23 mvn r3, r3, lsr #26 + 1f1e7ec: e5c43049 strb r3, [r4, #73] ; 0x49 + 1f1e7f0: 13a03001 movne r3, #1 + 1f1e7f4: 15c23000 strbne r3, [r2] + 1f1e7f8: eafffe8d b 1f1e234 + 1f1e7fc: e5d4504a ldrb r5, [r4, #74] ; 0x4a + 1f1e800: e3816020 orr r6, r1, #32 + 1f1e804: e5c46049 strb r6, [r4, #73] ; 0x49 + 1f1e808: e205507f and r5, r5, #127 ; 0x7f + 1f1e80c: e0165005 ands r5, r6, r5 + 1f1e810: 0a000038 beq 1f1e8f8 + 1f1e814: e3160080 tst r6, #128 ; 0x80 + 1f1e818: 1afffe9c bne 1f1e290 + 1f1e81c: e5945000 ldr r5, [r4] + 1f1e820: e1e01001 mvn r1, r1 + 1f1e824: e201105f and r1, r1, #95 ; 0x5f + 1f1e828: e3550000 cmp r5, #0 + 1f1e82c: e1e01001 mvn r1, r1 + 1f1e830: e5c41049 strb r1, [r4, #73] ; 0x49 + 1f1e834: 15c5e000 strbne lr, [r5] + 1f1e838: 15d40005 ldrbne r0, [r4, #5] + 1f1e83c: eafffe93 b 1f1e290 + 1f1e840: e1d4e3ba ldrh lr, [r4, #58] ; 0x3a + 1f1e844: e24ee001 sub lr, lr, #1 + 1f1e848: e6ffe07e uxth lr, lr + 1f1e84c: e1c4e3ba strh lr, [r4, #58] ; 0x3a + 1f1e850: e16f5f1e clz r5, lr + 1f1e854: e6efe07e uxtb lr, lr + 1f1e858: e35e00fe cmp lr, #254 ; 0xfe + 1f1e85c: e1a052a5 lsr r5, r5, #5 + 1f1e860: e5c45041 strb r5, [r4, #65] ; 0x41 + 1f1e864: 1afffeae bne 1f1e324 + 1f1e868: e594e044 ldr lr, [r4, #68] ; 0x44 + 1f1e86c: e200000c and r0, r0, #12 + 1f1e870: e2400004 sub r0, r0, #4 + 1f1e874: e28ee001 add lr, lr, #1 + 1f1e878: e16f0f10 clz r0, r0 + 1f1e87c: e35e0001 cmp lr, #1 + 1f1e880: e584e044 str lr, [r4, #68] ; 0x44 + 1f1e884: e1a002a0 lsr r0, r0, #5 + 1f1e888: 93a00000 movls r0, #0 + 1f1e88c: e3500000 cmp r0, #0 + 1f1e890: 0afffea3 beq 1f1e324 + 1f1e894: e5940050 ldr r0, [r4, #80] ; 0x50 + 1f1e898: e5d4e03c ldrb lr, [r4, #60] ; 0x3c + 1f1e89c: e3500000 cmp r0, #0 + 1f1e8a0: e5c41041 strb r1, [r4, #65] ; 0x41 + 1f1e8a4: 13a00001 movne r0, #1 + 1f1e8a8: 03a00000 moveq r0, #0 + 1f1e8ac: e5c4e03a strb lr, [r4, #58] ; 0x3a + 1f1e8b0: e5c40055 strb r0, [r4, #85] ; 0x55 + 1f1e8b4: 03a00001 moveq r0, #1 + 1f1e8b8: 13a00000 movne r0, #0 + 1f1e8bc: e5840050 str r0, [r4, #80] ; 0x50 + 1f1e8c0: eafffe97 b 1f1e324 + 1f1e8c4: e5d43039 ldrb r3, [r4, #57] ; 0x39 + 1f1e8c8: e3530000 cmp r3, #0 + 1f1e8cc: 1afffe58 bne 1f1e234 + 1f1e8d0: e5d43034 ldrb r3, [r4, #52] ; 0x34 + 1f1e8d4: e3530000 cmp r3, #0 + 1f1e8d8: 0afffe55 beq 1f1e234 + 1f1e8dc: e5d4301e ldrb r3, [r4, #30] + 1f1e8e0: e6af2073 sxtb r2, r3 + 1f1e8e4: e3520000 cmp r2, #0 + 1f1e8e8: ba00003a blt 1f1e9d8 + 1f1e8ec: e3a03000 mov r3, #0 + 1f1e8f0: e5c43038 strb r3, [r4, #56] ; 0x38 + 1f1e8f4: eafffe4f b 1f1e238 + 1f1e8f8: e3160080 tst r6, #128 ; 0x80 + 1f1e8fc: 0afffe63 beq 1f1e290 + 1f1e900: e594e000 ldr lr, [r4] + 1f1e904: e201107f and r1, r1, #127 ; 0x7f + 1f1e908: e3811020 orr r1, r1, #32 + 1f1e90c: e5c41049 strb r1, [r4, #73] ; 0x49 + 1f1e910: e35e0000 cmp lr, #0 + 1f1e914: 15ce5000 strbne r5, [lr] + 1f1e918: 15d40005 ldrbne r0, [r4, #5] + 1f1e91c: eafffe5b b 1f1e290 + 1f1e920: e5d4504a ldrb r5, [r4, #74] ; 0x4a + 1f1e924: e380e020 orr lr, r0, #32 + 1f1e928: e5c4e049 strb lr, [r4, #73] ; 0x49 + 1f1e92c: e205507f and r5, r5, #127 ; 0x7f + 1f1e930: e11e0005 tst lr, r5 + 1f1e934: 0a00001e beq 1f1e9b4 + 1f1e938: e31e0080 tst lr, #128 ; 0x80 + 1f1e93c: 1afffe78 bne 1f1e324 + 1f1e940: e594e000 ldr lr, [r4] + 1f1e944: e1e00000 mvn r0, r0 + 1f1e948: e200005f and r0, r0, #95 ; 0x5f + 1f1e94c: e35e0000 cmp lr, #0 + 1f1e950: e1e00000 mvn r0, r0 + 1f1e954: e5c40049 strb r0, [r4, #73] ; 0x49 + 1f1e958: 13a00001 movne r0, #1 + 1f1e95c: 15ce0000 strbne r0, [lr] + 1f1e960: eafffe6f b 1f1e324 + 1f1e964: e3100080 tst r0, #128 ; 0x80 + 1f1e968: 0afffe31 beq 1f1e234 + 1f1e96c: e5942000 ldr r2, [r4] + 1f1e970: e203307f and r3, r3, #127 ; 0x7f + 1f1e974: e3833040 orr r3, r3, #64 ; 0x40 + 1f1e978: e5c43049 strb r3, [r4, #73] ; 0x49 + 1f1e97c: e3520000 cmp r2, #0 + 1f1e980: 0afffe2b beq 1f1e234 + 1f1e984: e5c21000 strb r1, [r2] + 1f1e988: e1d421de ldrsb r2, [r4, #30] + 1f1e98c: eafffe29 b 1f1e238 + 1f1e990: e3110080 tst r1, #128 ; 0x80 + 1f1e994: 0afffe26 beq 1f1e234 + 1f1e998: e5941000 ldr r1, [r4] + 1f1e99c: e203307f and r3, r3, #127 ; 0x7f + 1f1e9a0: e3833040 orr r3, r3, #64 ; 0x40 + 1f1e9a4: e5c43049 strb r3, [r4, #73] ; 0x49 + 1f1e9a8: e3510000 cmp r1, #0 + 1f1e9ac: 1afffeb4 bne 1f1e484 + 1f1e9b0: eafffe1f b 1f1e234 + 1f1e9b4: e31e0080 tst lr, #128 ; 0x80 + 1f1e9b8: 0afffe59 beq 1f1e324 + 1f1e9bc: e594e000 ldr lr, [r4] + 1f1e9c0: e200007f and r0, r0, #127 ; 0x7f + 1f1e9c4: e3800020 orr r0, r0, #32 + 1f1e9c8: e5c40049 strb r0, [r4, #73] ; 0x49 + 1f1e9cc: e35e0000 cmp lr, #0 + 1f1e9d0: 15ce1000 strbne r1, [lr] + 1f1e9d4: eafffe52 b 1f1e324 + 1f1e9d8: e5945020 ldr r5, [r4, #32] + 1f1e9dc: e5d4101c ldrb r1, [r4, #28] + 1f1e9e0: e3550000 cmp r5, #0 + 1f1e9e4: e3811080 orr r1, r1, #128 ; 0x80 + 1f1e9e8: e5c4101c strb r1, [r4, #28] + 1f1e9ec: 0affffbe beq 1f1e8ec + 1f1e9f0: e0011003 and r1, r1, r3 + 1f1e9f4: e5940024 ldr r0, [r4, #36] ; 0x24 + 1f1e9f8: e12fff35 blx r5 + 1f1e9fc: e1d421de ldrsb r2, [r4, #30] + 1f1ea00: eaffffb9 b 1f1e8ec + 1f1ea04: e3550000 cmp r5, #0 + 1f1ea08: e3833080 orr r3, r3, #128 ; 0x80 + 1f1ea0c: e5c4301c strb r3, [r4, #28] + 1f1ea10: 0afffe08 beq 1f1e238 + 1f1ea14: e0011003 and r1, r1, r3 + 1f1ea18: e5940024 ldr r0, [r4, #36] ; 0x24 + 1f1ea1c: e12fff35 blx r5 + 1f1ea20: eafffe03 b 1f1e234 + 1f1ea24: e3110080 tst r1, #128 ; 0x80 + 1f1ea28: 0afffe7d beq 1f1e424 + 1f1ea2c: e5941000 ldr r1, [r4] + 1f1ea30: e202207f and r2, r2, #127 ; 0x7f + 1f1ea34: e3822004 orr r2, r2, #4 + 1f1ea38: e5c42049 strb r2, [r4, #73] ; 0x49 + 1f1ea3c: e3510000 cmp r1, #0 + 1f1ea40: 15c13000 strbne r3, [r1] + 1f1ea44: eafffe76 b 1f1e424 + 1f1ea48: e3100080 tst r0, #128 ; 0x80 + 1f1ea4c: 0afffe74 beq 1f1e424 + 1f1ea50: eafffff5 b 1f1ea2c + +01f1ea54 : + 1f1ea54: e201100f and r1, r1, #15 + 1f1ea58: e1a03000 mov r3, r0 + 1f1ea5c: e2411001 sub r1, r1, #1 + 1f1ea60: e351000e cmp r1, #14 + 1f1ea64: 979ff101 ldrls pc, [pc, r1, lsl #2] + 1f1ea68: ea000011 b 1f1eab4 + 1f1ea6c: 01f1eb04 .word 0x01f1eb04 + 1f1ea70: 01f1eb80 .word 0x01f1eb80 + 1f1ea74: 01f1eb88 .word 0x01f1eb88 + 1f1ea78: 01f1eb90 .word 0x01f1eb90 + 1f1ea7c: 01f1eba4 .word 0x01f1eba4 + 1f1ea80: 01f1ebac .word 0x01f1ebac + 1f1ea84: 01f1ebb4 .word 0x01f1ebb4 + 1f1ea88: 01f1ebbc .word 0x01f1ebbc + 1f1ea8c: 01f1ebd0 .word 0x01f1ebd0 + 1f1ea90: 01f1ebd8 .word 0x01f1ebd8 + 1f1ea94: 01f1ec34 .word 0x01f1ec34 + 1f1ea98: 01f1ec3c .word 0x01f1ec3c + 1f1ea9c: 01f1ec44 .word 0x01f1ec44 + 1f1eaa0: 01f1eaa8 .word 0x01f1eaa8 + 1f1eaa4: 01f1ec4c .word 0x01f1ec4c + 1f1eaa8: e5d0004a ldrb r0, [r0, #74] ; 0x4a + 1f1eaac: e3800080 orr r0, r0, #128 ; 0x80 + 1f1eab0: e12fff1e bx lr + 1f1eab4: e5d02028 ldrb r2, [r0, #40] ; 0x28 + 1f1eab8: e3520000 cmp r2, #0 + 1f1eabc: e5d02049 ldrb r2, [r0, #73] ; 0x49 + 1f1eac0: 1a000074 bne 1f1ec98 + 1f1eac4: e5d3001e ldrb r0, [r3, #30] + 1f1eac8: e5d3c01d ldrb ip, [r3, #29] + 1f1eacc: e5d3101c ldrb r1, [r3, #28] + 1f1ead0: e1ccc000 bic ip, ip, r0 + 1f1ead4: e0011000 and r1, r1, r0 + 1f1ead8: e18c0001 orr r0, ip, r1 + 1f1eadc: e3120018 tst r2, #24 + 1f1eae0: 1a000094 bne 1f1ed38 + 1f1eae4: e5d32034 ldrb r2, [r3, #52] ; 0x34 + 1f1eae8: e3520000 cmp r2, #0 + 1f1eaec: 012fff1e bxeq lr + 1f1eaf0: e5d33038 ldrb r3, [r3, #56] ; 0x38 + 1f1eaf4: e3530000 cmp r3, #0 + 1f1eaf8: 1affffeb bne 1f1eaac + 1f1eafc: e200007f and r0, r0, #127 ; 0x7f + 1f1eb00: e12fff1e bx lr + 1f1eb04: e5d02014 ldrb r2, [r0, #20] + 1f1eb08: e3520000 cmp r2, #0 + 1f1eb0c: e5d02049 ldrb r2, [r0, #73] ; 0x49 + 1f1eb10: 1a00005c bne 1f1ec88 + 1f1eb14: e5d3000a ldrb r0, [r3, #10] + 1f1eb18: e5d3c009 ldrb ip, [r3, #9] + 1f1eb1c: e5d31008 ldrb r1, [r3, #8] + 1f1eb20: e1ccc000 bic ip, ip, r0 + 1f1eb24: e0011000 and r1, r1, r0 + 1f1eb28: e18c0001 orr r0, ip, r1 + 1f1eb2c: e3120003 tst r2, #3 + 1f1eb30: 012fff1e bxeq lr + 1f1eb34: e3c22003 bic r2, r2, #3 + 1f1eb38: e5d3c04a ldrb ip, [r3, #74] ; 0x4a + 1f1eb3c: e6af2072 sxtb r2, r2 + 1f1eb40: e20cc07f and ip, ip, #127 ; 0x7f + 1f1eb44: e6ef1072 uxtb r1, r2 + 1f1eb48: e5c31049 strb r1, [r3, #73] ; 0x49 + 1f1eb4c: e011c00c ands ip, r1, ip + 1f1eb50: 0a00009a beq 1f1edc0 + 1f1eb54: e3520000 cmp r2, #0 + 1f1eb58: b12fff1e bxlt lr + 1f1eb5c: e5932000 ldr r2, [r3] + 1f1eb60: e1e01c81 mvn r1, r1, lsl #25 + 1f1eb64: e3520000 cmp r2, #0 + 1f1eb68: e1e01ca1 mvn r1, r1, lsr #25 + 1f1eb6c: e5c31049 strb r1, [r3, #73] ; 0x49 + 1f1eb70: 0a0000aa beq 1f1ee20 + 1f1eb74: e3a03001 mov r3, #1 + 1f1eb78: e5c23000 strb r3, [r2] + 1f1eb7c: e12fff1e bx lr + 1f1eb80: e5d0001e ldrb r0, [r0, #30] + 1f1eb84: e12fff1e bx lr + 1f1eb88: e5d0000a ldrb r0, [r0, #10] + 1f1eb8c: e12fff1e bx lr + 1f1eb90: e5d02049 ldrb r2, [r0, #73] ; 0x49 + 1f1eb94: e3120040 tst r2, #64 ; 0x40 + 1f1eb98: 1a000054 bne 1f1ecf0 + 1f1eb9c: e5d3002e ldrb r0, [r3, #46] ; 0x2e + 1f1eba0: e12fff1e bx lr + 1f1eba4: e5d0002f ldrb r0, [r0, #47] ; 0x2f + 1f1eba8: e12fff1e bx lr + 1f1ebac: e5d00030 ldrb r0, [r0, #48] ; 0x30 + 1f1ebb0: e12fff1e bx lr + 1f1ebb4: e5d00031 ldrb r0, [r0, #49] ; 0x31 + 1f1ebb8: e12fff1e bx lr + 1f1ebbc: e5d02049 ldrb r2, [r0, #73] ; 0x49 + 1f1ebc0: e3120020 tst r2, #32 + 1f1ebc4: 1a000037 bne 1f1eca8 + 1f1ebc8: e5d3003a ldrb r0, [r3, #58] ; 0x3a + 1f1ebcc: e12fff1e bx lr + 1f1ebd0: e5d0003b ldrb r0, [r0, #59] ; 0x3b + 1f1ebd4: e12fff1e bx lr + 1f1ebd8: e5d02049 ldrb r2, [r0, #73] ; 0x49 + 1f1ebdc: e5d0004b ldrb r0, [r0, #75] ; 0x4b + 1f1ebe0: e3120004 tst r2, #4 + 1f1ebe4: 012fff1e bxeq lr + 1f1ebe8: e3c22004 bic r2, r2, #4 + 1f1ebec: e5d3104a ldrb r1, [r3, #74] ; 0x4a + 1f1ebf0: e3a0c000 mov ip, #0 + 1f1ebf4: e583c04c str ip, [r3, #76] ; 0x4c + 1f1ebf8: e6af2072 sxtb r2, r2 + 1f1ebfc: e201107f and r1, r1, #127 ; 0x7f + 1f1ec00: e6efc072 uxtb ip, r2 + 1f1ec04: e5c3c049 strb ip, [r3, #73] ; 0x49 + 1f1ec08: e01c1001 ands r1, ip, r1 + 1f1ec0c: 0a00007b beq 1f1ee00 + 1f1ec10: e3520000 cmp r2, #0 + 1f1ec14: b12fff1e bxlt lr + 1f1ec18: e5932000 ldr r2, [r3] + 1f1ec1c: e1e0cc8c mvn ip, ip, lsl #25 + 1f1ec20: e3520000 cmp r2, #0 + 1f1ec24: e1e0ccac mvn ip, ip, lsr #25 + 1f1ec28: e5c3c049 strb ip, [r3, #73] ; 0x49 + 1f1ec2c: 1affffd0 bne 1f1eb74 + 1f1ec30: e12fff1e bx lr + 1f1ec34: e5d00005 ldrb r0, [r0, #5] + 1f1ec38: e12fff1e bx lr + 1f1ec3c: e5d00004 ldrb r0, [r0, #4] + 1f1ec40: e12fff1e bx lr + 1f1ec44: e5d00049 ldrb r0, [r0, #73] ; 0x49 + 1f1ec48: e12fff1e bx lr + 1f1ec4c: e5d02014 ldrb r2, [r0, #20] + 1f1ec50: e3520000 cmp r2, #0 + 1f1ec54: 0a000004 beq 1f1ec6c + 1f1ec58: e5d02049 ldrb r2, [r0, #73] ; 0x49 + 1f1ec5c: e3120002 tst r2, #2 + 1f1ec60: 0a000001 beq 1f1ec6c + 1f1ec64: e5d00015 ldrb r0, [r0, #21] + 1f1ec68: e12fff1e bx lr + 1f1ec6c: e5d3000a ldrb r0, [r3, #10] + 1f1ec70: e5d32009 ldrb r2, [r3, #9] + 1f1ec74: e5d33008 ldrb r3, [r3, #8] + 1f1ec78: e1c22000 bic r2, r2, r0 + 1f1ec7c: e0033000 and r3, r3, r0 + 1f1ec80: e1820003 orr r0, r2, r3 + 1f1ec84: e12fff1e bx lr + 1f1ec88: e3120002 tst r2, #2 + 1f1ec8c: 15d00015 ldrbne r0, [r0, #21] + 1f1ec90: 1affffa5 bne 1f1eb2c + 1f1ec94: eaffff9e b 1f1eb14 + 1f1ec98: e3120010 tst r2, #16 + 1f1ec9c: 15d00029 ldrbne r0, [r0, #41] ; 0x29 + 1f1eca0: 1affff8d bne 1f1eadc + 1f1eca4: eaffff86 b 1f1eac4 + 1f1eca8: e3c22020 bic r2, r2, #32 + 1f1ecac: e5d0004a ldrb r0, [r0, #74] ; 0x4a + 1f1ecb0: e6af2072 sxtb r2, r2 + 1f1ecb4: e200007f and r0, r0, #127 ; 0x7f + 1f1ecb8: e6ef1072 uxtb r1, r2 + 1f1ecbc: e5c31049 strb r1, [r3, #73] ; 0x49 + 1f1ecc0: e0110000 ands r0, r1, r0 + 1f1ecc4: 0a00002d beq 1f1ed80 + 1f1ecc8: e3520000 cmp r2, #0 + 1f1eccc: baffffbd blt 1f1ebc8 + 1f1ecd0: e5932000 ldr r2, [r3] + 1f1ecd4: e1e01c81 mvn r1, r1, lsl #25 + 1f1ecd8: e3520000 cmp r2, #0 + 1f1ecdc: e1e01ca1 mvn r1, r1, lsr #25 + 1f1ece0: e5c31049 strb r1, [r3, #73] ; 0x49 + 1f1ece4: 13a01001 movne r1, #1 + 1f1ece8: 15c21000 strbne r1, [r2] + 1f1ecec: eaffffb5 b 1f1ebc8 + 1f1ecf0: e3c22040 bic r2, r2, #64 ; 0x40 + 1f1ecf4: e5d0004a ldrb r0, [r0, #74] ; 0x4a + 1f1ecf8: e6af2072 sxtb r2, r2 + 1f1ecfc: e200007f and r0, r0, #127 ; 0x7f + 1f1ed00: e6ef1072 uxtb r1, r2 + 1f1ed04: e5c31049 strb r1, [r3, #73] ; 0x49 + 1f1ed08: e0110000 ands r0, r1, r0 + 1f1ed0c: 0a000033 beq 1f1ede0 + 1f1ed10: e3520000 cmp r2, #0 + 1f1ed14: baffffa0 blt 1f1eb9c + 1f1ed18: e5932000 ldr r2, [r3] + 1f1ed1c: e1e01c81 mvn r1, r1, lsl #25 + 1f1ed20: e3520000 cmp r2, #0 + 1f1ed24: e1e01ca1 mvn r1, r1, lsr #25 + 1f1ed28: e5c31049 strb r1, [r3, #73] ; 0x49 + 1f1ed2c: 13a01001 movne r1, #1 + 1f1ed30: 15c21000 strbne r1, [r2] + 1f1ed34: eaffff98 b 1f1eb9c + 1f1ed38: e3c22018 bic r2, r2, #24 + 1f1ed3c: e5d3c04a ldrb ip, [r3, #74] ; 0x4a + 1f1ed40: e6af2072 sxtb r2, r2 + 1f1ed44: e20cc07f and ip, ip, #127 ; 0x7f + 1f1ed48: e6ef1072 uxtb r1, r2 + 1f1ed4c: e5c31049 strb r1, [r3, #73] ; 0x49 + 1f1ed50: e011c00c ands ip, r1, ip + 1f1ed54: 0a000011 beq 1f1eda0 + 1f1ed58: e3520000 cmp r2, #0 + 1f1ed5c: baffff60 blt 1f1eae4 + 1f1ed60: e5932000 ldr r2, [r3] + 1f1ed64: e1e01c81 mvn r1, r1, lsl #25 + 1f1ed68: e3520000 cmp r2, #0 + 1f1ed6c: e1e01ca1 mvn r1, r1, lsr #25 + 1f1ed70: e5c31049 strb r1, [r3, #73] ; 0x49 + 1f1ed74: 13a01001 movne r1, #1 + 1f1ed78: 15c21000 strbne r1, [r2] + 1f1ed7c: eaffff58 b 1f1eae4 + 1f1ed80: e3520000 cmp r2, #0 + 1f1ed84: aaffff8f bge 1f1ebc8 + 1f1ed88: e5932000 ldr r2, [r3] + 1f1ed8c: e201107f and r1, r1, #127 ; 0x7f + 1f1ed90: e5c31049 strb r1, [r3, #73] ; 0x49 + 1f1ed94: e3520000 cmp r2, #0 + 1f1ed98: 15c20000 strbne r0, [r2] + 1f1ed9c: eaffff89 b 1f1ebc8 + 1f1eda0: e3520000 cmp r2, #0 + 1f1eda4: aaffff4e bge 1f1eae4 + 1f1eda8: e5932000 ldr r2, [r3] + 1f1edac: e201107f and r1, r1, #127 ; 0x7f + 1f1edb0: e5c31049 strb r1, [r3, #73] ; 0x49 + 1f1edb4: e3520000 cmp r2, #0 + 1f1edb8: 15c2c000 strbne ip, [r2] + 1f1edbc: eaffff48 b 1f1eae4 + 1f1edc0: e3520000 cmp r2, #0 + 1f1edc4: a12fff1e bxge lr + 1f1edc8: e5932000 ldr r2, [r3] + 1f1edcc: e201107f and r1, r1, #127 ; 0x7f + 1f1edd0: e5c31049 strb r1, [r3, #73] ; 0x49 + 1f1edd4: e3520000 cmp r2, #0 + 1f1edd8: 15c2c000 strbne ip, [r2] + 1f1eddc: e12fff1e bx lr + 1f1ede0: e3520000 cmp r2, #0 + 1f1ede4: aaffff6c bge 1f1eb9c + 1f1ede8: e5932000 ldr r2, [r3] + 1f1edec: e201107f and r1, r1, #127 ; 0x7f + 1f1edf0: e5c31049 strb r1, [r3, #73] ; 0x49 + 1f1edf4: e3520000 cmp r2, #0 + 1f1edf8: 15c20000 strbne r0, [r2] + 1f1edfc: eaffff66 b 1f1eb9c + 1f1ee00: e3520000 cmp r2, #0 + 1f1ee04: a12fff1e bxge lr + 1f1ee08: e5932000 ldr r2, [r3] + 1f1ee0c: e20cc07f and ip, ip, #127 ; 0x7f + 1f1ee10: e5c3c049 strb ip, [r3, #73] ; 0x49 + 1f1ee14: e3520000 cmp r2, #0 + 1f1ee18: 15c21000 strbne r1, [r2] + 1f1ee1c: e12fff1e bx lr + 1f1ee20: e12fff1e bx lr + +01f1ee24 : + 1f1ee24: e201100f and r1, r1, #15 + 1f1ee28: e2411001 sub r1, r1, #1 + 1f1ee2c: e351000e cmp r1, #14 + 1f1ee30: 979ff101 ldrls pc, [pc, r1, lsl #2] + 1f1ee34: ea000031 b 1f1ef00 + 1f1ee38: 01f1ee74 .word 0x01f1ee74 + 1f1ee3c: 01f1ee94 .word 0x01f1ee94 + 1f1ee40: 01f1ee9c .word 0x01f1ee9c + 1f1ee44: 01f1eea4 .word 0x01f1eea4 + 1f1ee48: 01f1eeac .word 0x01f1eeac + 1f1ee4c: 01f1eeb4 .word 0x01f1eeb4 + 1f1ee50: 01f1eebc .word 0x01f1eebc + 1f1ee54: 01f1eec4 .word 0x01f1eec4 + 1f1ee58: 01f1eecc .word 0x01f1eecc + 1f1ee5c: 01f1eed4 .word 0x01f1eed4 + 1f1ee60: 01f1eedc .word 0x01f1eedc + 1f1ee64: 01f1eee4 .word 0x01f1eee4 + 1f1ee68: 01f1eeec .word 0x01f1eeec + 1f1ee6c: 01f1eef4 .word 0x01f1eef4 + 1f1ee70: 01f1ee74 .word 0x01f1ee74 + 1f1ee74: e5d03014 ldrb r3, [r0, #20] + 1f1ee78: e3530000 cmp r3, #0 + 1f1ee7c: 0a000027 beq 1f1ef20 + 1f1ee80: e5d03049 ldrb r3, [r0, #73] ; 0x49 + 1f1ee84: e3130002 tst r3, #2 + 1f1ee88: 0a000024 beq 1f1ef20 + 1f1ee8c: e5d00015 ldrb r0, [r0, #21] + 1f1ee90: e12fff1e bx lr + 1f1ee94: e5d0001e ldrb r0, [r0, #30] + 1f1ee98: e12fff1e bx lr + 1f1ee9c: e5d0000a ldrb r0, [r0, #10] + 1f1eea0: e12fff1e bx lr + 1f1eea4: e5d0002e ldrb r0, [r0, #46] ; 0x2e + 1f1eea8: e12fff1e bx lr + 1f1eeac: e5d0002f ldrb r0, [r0, #47] ; 0x2f + 1f1eeb0: e12fff1e bx lr + 1f1eeb4: e5d00030 ldrb r0, [r0, #48] ; 0x30 + 1f1eeb8: e12fff1e bx lr + 1f1eebc: e5d00031 ldrb r0, [r0, #49] ; 0x31 + 1f1eec0: e12fff1e bx lr + 1f1eec4: e5d0003a ldrb r0, [r0, #58] ; 0x3a + 1f1eec8: e12fff1e bx lr + 1f1eecc: e5d0003b ldrb r0, [r0, #59] ; 0x3b + 1f1eed0: e12fff1e bx lr + 1f1eed4: e5d0004b ldrb r0, [r0, #75] ; 0x4b + 1f1eed8: e12fff1e bx lr + 1f1eedc: e5d00005 ldrb r0, [r0, #5] + 1f1eee0: e12fff1e bx lr + 1f1eee4: e5d00004 ldrb r0, [r0, #4] + 1f1eee8: e12fff1e bx lr + 1f1eeec: e5d00049 ldrb r0, [r0, #73] ; 0x49 + 1f1eef0: e12fff1e bx lr + 1f1eef4: e5d0004a ldrb r0, [r0, #74] ; 0x4a + 1f1eef8: e3800080 orr r0, r0, #128 ; 0x80 + 1f1eefc: e12fff1e bx lr + 1f1ef00: e5d03028 ldrb r3, [r0, #40] ; 0x28 + 1f1ef04: e3530000 cmp r3, #0 + 1f1ef08: 0a00000b beq 1f1ef3c + 1f1ef0c: e5d03049 ldrb r3, [r0, #73] ; 0x49 + 1f1ef10: e3130010 tst r3, #16 + 1f1ef14: 0a000008 beq 1f1ef3c + 1f1ef18: e5d00029 ldrb r0, [r0, #41] ; 0x29 + 1f1ef1c: e12fff1e bx lr + 1f1ef20: e5d0100a ldrb r1, [r0, #10] + 1f1ef24: e5d02009 ldrb r2, [r0, #9] + 1f1ef28: e5d03008 ldrb r3, [r0, #8] + 1f1ef2c: e1c22001 bic r2, r2, r1 + 1f1ef30: e0033001 and r3, r3, r1 + 1f1ef34: e1820003 orr r0, r2, r3 + 1f1ef38: e12fff1e bx lr + 1f1ef3c: e5d0101e ldrb r1, [r0, #30] + 1f1ef40: e5d0201d ldrb r2, [r0, #29] + 1f1ef44: e5d0301c ldrb r3, [r0, #28] + 1f1ef48: e1c22001 bic r2, r2, r1 + 1f1ef4c: e0033001 and r3, r3, r1 + 1f1ef50: e1820003 orr r0, r2, r3 + 1f1ef54: e12fff1e bx lr + +01f1ef58 : + 1f1ef58: e201100f and r1, r1, #15 + 1f1ef5c: e2411001 sub r1, r1, #1 + 1f1ef60: e92d4010 push {r4, lr} + 1f1ef64: e351000e cmp r1, #14 + 1f1ef68: 979ff101 ldrls pc, [pc, r1, lsl #2] + 1f1ef6c: ea000023 b 1f1f000 + 1f1ef70: 01f1f044 .word 0x01f1f044 + 1f1ef74: 01f1f0ac .word 0x01f1f0ac + 1f1ef78: 01f1f088 .word 0x01f1f088 + 1f1ef7c: 01f1f0d0 .word 0x01f1f0d0 + 1f1ef80: 01f1f0d8 .word 0x01f1f0d8 + 1f1ef84: 01f1f0d0 .word 0x01f1f0d0 + 1f1ef88: 01f1f164 .word 0x01f1f164 + 1f1ef8c: 01f1f35c .word 0x01f1f35c + 1f1ef90: 01f1f364 .word 0x01f1f364 + 1f1ef94: 01f1f1c0 .word 0x01f1f1c0 + 1f1ef98: 01f1f230 .word 0x01f1f230 + 1f1ef9c: 01f1f2a8 .word 0x01f1f2a8 + 1f1efa0: 01f1f308 .word 0x01f1f308 + 1f1efa4: 01f1efac .word 0x01f1efac + 1f1efa8: 01f1f064 .word 0x01f1f064 + 1f1efac: e6af1072 sxtb r1, r2 + 1f1efb0: e3510000 cmp r1, #0 + 1f1efb4: a5d0304a ldrbge r3, [r0, #74] ; 0x4a + 1f1efb8: b5d0104a ldrblt r1, [r0, #74] ; 0x4a + 1f1efbc: a1c32001 bicge r2, r3, r1 + 1f1efc0: e5d03049 ldrb r3, [r0, #73] ; 0x49 + 1f1efc4: b1822001 orrlt r2, r2, r1 + 1f1efc8: e202207f and r2, r2, #127 ; 0x7f + 1f1efcc: e5c0204a strb r2, [r0, #74] ; 0x4a + 1f1efd0: e0122003 ands r2, r2, r3 + 1f1efd4: 0a0000f2 beq 1f1f3a4 + 1f1efd8: e3130080 tst r3, #128 ; 0x80 + 1f1efdc: 18bd8010 popne {r4, pc} + 1f1efe0: e5902000 ldr r2, [r0] + 1f1efe4: e1e03c83 mvn r3, r3, lsl #25 + 1f1efe8: e3520000 cmp r2, #0 + 1f1efec: e1e03ca3 mvn r3, r3, lsr #25 + 1f1eff0: e5c03049 strb r3, [r0, #73] ; 0x49 + 1f1eff4: 13a03001 movne r3, #1 + 1f1eff8: 15c23000 strbne r3, [r2] + 1f1effc: e8bd8010 pop {r4, pc} + 1f1f000: e5d03049 ldrb r3, [r0, #73] ; 0x49 + 1f1f004: e3130018 tst r3, #24 + 1f1f008: 1a000110 bne 1f1f450 + 1f1f00c: e5d03004 ldrb r3, [r0, #4] + 1f1f010: e5c0201c strb r2, [r0, #28] + 1f1f014: e20330c0 and r3, r3, #192 ; 0xc0 + 1f1f018: e35300c0 cmp r3, #192 ; 0xc0 + 1f1f01c: 03a03000 moveq r3, #0 + 1f1f020: 05c0302c strbeq r3, [r0, #44] ; 0x2c + 1f1f024: e5903020 ldr r3, [r0, #32] + 1f1f028: e3530000 cmp r3, #0 + 1f1f02c: 08bd8010 popeq {r4, pc} + 1f1f030: e5d0101e ldrb r1, [r0, #30] + 1f1f034: e8bd4010 pop {r4, lr} + 1f1f038: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1f03c: e0011002 and r1, r1, r2 + 1f1f040: e12fff13 bx r3 + 1f1f044: e5d03049 ldrb r3, [r0, #73] ; 0x49 + 1f1f048: e3130003 tst r3, #3 + 1f1f04c: 1a000111 bne 1f1f498 + 1f1f050: e5d03004 ldrb r3, [r0, #4] + 1f1f054: e203300c and r3, r3, #12 + 1f1f058: e353000c cmp r3, #12 + 1f1f05c: 03a03000 moveq r3, #0 + 1f1f060: 05c03017 strbeq r3, [r0, #23] + 1f1f064: e590300c ldr r3, [r0, #12] + 1f1f068: e5c02008 strb r2, [r0, #8] + 1f1f06c: e3530000 cmp r3, #0 + 1f1f070: 08bd8010 popeq {r4, pc} + 1f1f074: e5d0100a ldrb r1, [r0, #10] + 1f1f078: e8bd4010 pop {r4, lr} + 1f1f07c: e5900010 ldr r0, [r0, #16] + 1f1f080: e0011002 and r1, r1, r2 + 1f1f084: e12fff13 bx r3 + 1f1f088: e590300c ldr r3, [r0, #12] + 1f1f08c: e5c0200a strb r2, [r0, #10] + 1f1f090: e3530000 cmp r3, #0 + 1f1f094: 08bd8010 popeq {r4, pc} + 1f1f098: e5d01008 ldrb r1, [r0, #8] + 1f1f09c: e8bd4010 pop {r4, lr} + 1f1f0a0: e5900010 ldr r0, [r0, #16] + 1f1f0a4: e0011002 and r1, r1, r2 + 1f1f0a8: e12fff13 bx r3 + 1f1f0ac: e5903020 ldr r3, [r0, #32] + 1f1f0b0: e5c0201e strb r2, [r0, #30] + 1f1f0b4: e3530000 cmp r3, #0 + 1f1f0b8: 08bd8010 popeq {r4, pc} + 1f1f0bc: e5d0101c ldrb r1, [r0, #28] + 1f1f0c0: e8bd4010 pop {r4, lr} + 1f1f0c4: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1f0c8: e0011002 and r1, r1, r2 + 1f1f0cc: e12fff13 bx r3 + 1f1f0d0: e5c02030 strb r2, [r0, #48] ; 0x30 + 1f1f0d4: e8bd8010 pop {r4, pc} + 1f1f0d8: e5d01049 ldrb r1, [r0, #73] ; 0x49 + 1f1f0dc: e3a0c001 mov ip, #1 + 1f1f0e0: e5c02031 strb r2, [r0, #49] ; 0x31 + 1f1f0e4: e3110040 tst r1, #64 ; 0x40 + 1f1f0e8: e5c0c032 strb ip, [r0, #50] ; 0x32 + 1f1f0ec: e1d033b0 ldrh r3, [r0, #48] ; 0x30 + 1f1f0f0: e1c032be strh r3, [r0, #46] ; 0x2e + 1f1f0f4: e5c0c033 strb ip, [r0, #51] ; 0x33 + 1f1f0f8: 1a0000c2 bne 1f1f408 + 1f1f0fc: e5d01034 ldrb r1, [r0, #52] ; 0x34 + 1f1f100: e16f3f13 clz r3, r3 + 1f1f104: e3a02001 mov r2, #1 + 1f1f108: e1a04000 mov r4, r0 + 1f1f10c: e3510000 cmp r1, #0 + 1f1f110: e1a032a3 lsr r3, r3, #5 + 1f1f114: e5c02036 strb r2, [r0, #54] ; 0x36 + 1f1f118: e5c02038 strb r2, [r0, #56] ; 0x38 + 1f1f11c: e5c03037 strb r3, [r0, #55] ; 0x37 + 1f1f120: 0a00000b beq 1f1f154 + 1f1f124: e5d0301e ldrb r3, [r0, #30] + 1f1f128: e3130080 tst r3, #128 ; 0x80 + 1f1f12c: 0a000008 beq 1f1f154 + 1f1f130: e5902020 ldr r2, [r0, #32] + 1f1f134: e5d0101c ldrb r1, [r0, #28] + 1f1f138: e3520000 cmp r2, #0 + 1f1f13c: e201107f and r1, r1, #127 ; 0x7f + 1f1f140: e5c0101c strb r1, [r0, #28] + 1f1f144: 0a000002 beq 1f1f154 + 1f1f148: e0011003 and r1, r1, r3 + 1f1f14c: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1f150: e12fff32 blx r2 + 1f1f154: e5d43035 ldrb r3, [r4, #53] ; 0x35 + 1f1f158: e3530000 cmp r3, #0 + 1f1f15c: 05c43039 strbeq r3, [r4, #57] ; 0x39 + 1f1f160: e8bd8010 pop {r4, pc} + 1f1f164: e5d0104a ldrb r1, [r0, #74] ; 0x4a + 1f1f168: e5c02031 strb r2, [r0, #49] ; 0x31 + 1f1f16c: e2013040 and r3, r1, #64 ; 0x40 + 1f1f170: e21330ff ands r3, r3, #255 ; 0xff + 1f1f174: 05c03036 strbeq r3, [r0, #54] ; 0x36 + 1f1f178: e5d03049 ldrb r3, [r0, #73] ; 0x49 + 1f1f17c: e3130040 tst r3, #64 ; 0x40 + 1f1f180: 08bd8010 popeq {r4, pc} + 1f1f184: e3c33040 bic r3, r3, #64 ; 0x40 + 1f1f188: e201107f and r1, r1, #127 ; 0x7f + 1f1f18c: e6af3073 sxtb r3, r3 + 1f1f190: e6ef2073 uxtb r2, r3 + 1f1f194: e5c02049 strb r2, [r0, #73] ; 0x49 + 1f1f198: e0121001 ands r1, r2, r1 + 1f1f19c: 1a000064 bne 1f1f334 + 1f1f1a0: e3530000 cmp r3, #0 + 1f1f1a4: a8bd8010 popge {r4, pc} + 1f1f1a8: e5903000 ldr r3, [r0] + 1f1f1ac: e202207f and r2, r2, #127 ; 0x7f + 1f1f1b0: e5c02049 strb r2, [r0, #73] ; 0x49 + 1f1f1b4: e3530000 cmp r3, #0 + 1f1f1b8: 15c31000 strbne r1, [r3] + 1f1f1bc: e8bd8010 pop {r4, pc} + 1f1f1c0: e5d03049 ldrb r3, [r0, #73] ; 0x49 + 1f1f1c4: e5c0204b strb r2, [r0, #75] ; 0x4b + 1f1f1c8: e3130004 tst r3, #4 + 1f1f1cc: 0a000012 beq 1f1f21c + 1f1f1d0: e3c33004 bic r3, r3, #4 + 1f1f1d4: e5d0204a ldrb r2, [r0, #74] ; 0x4a + 1f1f1d8: e3a01000 mov r1, #0 + 1f1f1dc: e580104c str r1, [r0, #76] ; 0x4c + 1f1f1e0: e6af3073 sxtb r3, r3 + 1f1f1e4: e202207f and r2, r2, #127 ; 0x7f + 1f1f1e8: e6ef1073 uxtb r1, r3 + 1f1f1ec: e5c01049 strb r1, [r0, #73] ; 0x49 + 1f1f1f0: e0112002 ands r2, r1, r2 + 1f1f1f4: 0a0000c2 beq 1f1f504 + 1f1f1f8: e3530000 cmp r3, #0 + 1f1f1fc: ba000006 blt 1f1f21c + 1f1f200: e5903000 ldr r3, [r0] + 1f1f204: e1e01c81 mvn r1, r1, lsl #25 + 1f1f208: e3530000 cmp r3, #0 + 1f1f20c: e1e01ca1 mvn r1, r1, lsr #25 + 1f1f210: e5c01049 strb r1, [r0, #73] ; 0x49 + 1f1f214: 13a02001 movne r2, #1 + 1f1f218: 15c32000 strbne r2, [r3] + 1f1f21c: e3a02001 mov r2, #1 + 1f1f220: e3a03000 mov r3, #0 + 1f1f224: e5802050 str r2, [r0, #80] ; 0x50 + 1f1f228: e5c03055 strb r3, [r0, #85] ; 0x55 + 1f1f22c: e8bd8010 pop {r4, pc} + 1f1f230: e6af3072 sxtb r3, r2 + 1f1f234: e2021001 and r1, r2, #1 + 1f1f238: e3530000 cmp r3, #0 + 1f1f23c: e5c02005 strb r2, [r0, #5] + 1f1f240: e1a03fa3 lsr r3, r3, #31 + 1f1f244: e5c01014 strb r1, [r0, #20] + 1f1f248: e5c03034 strb r3, [r0, #52] ; 0x34 + 1f1f24c: e7e010d2 ubfx r1, r2, #1, #1 + 1f1f250: e7e03352 ubfx r3, r2, #6, #1 + 1f1f254: e5c01028 strb r1, [r0, #40] ; 0x28 + 1f1f258: e7e022d2 ubfx r2, r2, #5, #1 + 1f1f25c: e5c03035 strb r3, [r0, #53] ; 0x35 + 1f1f260: e5c02040 strb r2, [r0, #64] ; 0x40 + 1f1f264: a8bd8010 popge {r4, pc} + 1f1f268: e5d02038 ldrb r2, [r0, #56] ; 0x38 + 1f1f26c: e5d0301e ldrb r3, [r0, #30] + 1f1f270: e3520000 cmp r2, #0 + 1f1f274: 1a000099 bne 1f1f4e0 + 1f1f278: e3130080 tst r3, #128 ; 0x80 + 1f1f27c: 08bd8010 popeq {r4, pc} + 1f1f280: e5902020 ldr r2, [r0, #32] + 1f1f284: e5d0101c ldrb r1, [r0, #28] + 1f1f288: e3520000 cmp r2, #0 + 1f1f28c: e201107f and r1, r1, #127 ; 0x7f + 1f1f290: e5c0101c strb r1, [r0, #28] + 1f1f294: 0a0000c3 beq 1f1f5a8 + 1f1f298: e0011003 and r1, r1, r3 + 1f1f29c: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f1f2a0: e8bd4010 pop {r4, lr} + 1f1f2a4: e12fff12 bx r2 + 1f1f2a8: e3120008 tst r2, #8 + 1f1f2ac: e5c02004 strb r2, [r0, #4] + 1f1f2b0: 0a000008 beq 1f1f2d8 + 1f1f2b4: e2023006 and r3, r2, #6 + 1f1f2b8: e2431002 sub r1, r3, #2 + 1f1f2bc: e2433006 sub r3, r3, #6 + 1f1f2c0: e16f1f11 clz r1, r1 + 1f1f2c4: e16f3f13 clz r3, r3 + 1f1f2c8: e1a012a1 lsr r1, r1, #5 + 1f1f2cc: e1a032a3 lsr r3, r3, #5 + 1f1f2d0: e5c01018 strb r1, [r0, #24] + 1f1f2d4: e5c03017 strb r3, [r0, #23] + 1f1f2d8: e3120080 tst r2, #128 ; 0x80 + 1f1f2dc: 08bd8010 popeq {r4, pc} + 1f1f2e0: e2022060 and r2, r2, #96 ; 0x60 + 1f1f2e4: e2423020 sub r3, r2, #32 + 1f1f2e8: e2422060 sub r2, r2, #96 ; 0x60 + 1f1f2ec: e16f3f13 clz r3, r3 + 1f1f2f0: e16f2f12 clz r2, r2 + 1f1f2f4: e1a032a3 lsr r3, r3, #5 + 1f1f2f8: e1a022a2 lsr r2, r2, #5 + 1f1f2fc: e5c0302d strb r3, [r0, #45] ; 0x2d + 1f1f300: e5c0202c strb r2, [r0, #44] ; 0x2c + 1f1f304: e8bd8010 pop {r4, pc} + 1f1f308: e5d03049 ldrb r3, [r0, #73] ; 0x49 + 1f1f30c: e1120003 tst r2, r3 + 1f1f310: 08bd8010 popeq {r4, pc} + 1f1f314: e1c33002 bic r3, r3, r2 + 1f1f318: e5d0104a ldrb r1, [r0, #74] ; 0x4a + 1f1f31c: e6af3073 sxtb r3, r3 + 1f1f320: e201107f and r1, r1, #127 ; 0x7f + 1f1f324: e6ef2073 uxtb r2, r3 + 1f1f328: e5c02049 strb r2, [r0, #73] ; 0x49 + 1f1f32c: e0121001 ands r1, r2, r1 + 1f1f330: 0affff9a beq 1f1f1a0 + 1f1f334: e3530000 cmp r3, #0 + 1f1f338: b8bd8010 poplt {r4, pc} + 1f1f33c: e5903000 ldr r3, [r0] + 1f1f340: e1e02c82 mvn r2, r2, lsl #25 + 1f1f344: e3530000 cmp r3, #0 + 1f1f348: e1e02ca2 mvn r2, r2, lsr #25 + 1f1f34c: e5c02049 strb r2, [r0, #73] ; 0x49 + 1f1f350: 13a02001 movne r2, #1 + 1f1f354: 15c32000 strbne r2, [r3] + 1f1f358: e8bd8010 pop {r4, pc} + 1f1f35c: e5c0203c strb r2, [r0, #60] ; 0x3c + 1f1f360: e8bd8010 pop {r4, pc} + 1f1f364: e5d03049 ldrb r3, [r0, #73] ; 0x49 + 1f1f368: e3a01000 mov r1, #0 + 1f1f36c: e5d0e03c ldrb lr, [r0, #60] ; 0x3c + 1f1f370: e3a0c001 mov ip, #1 + 1f1f374: e3130020 tst r3, #32 + 1f1f378: e5c0203b strb r2, [r0, #59] ; 0x3b + 1f1f37c: e5c0e03a strb lr, [r0, #58] ; 0x3a + 1f1f380: e5c0c03d strb ip, [r0, #61] ; 0x3d + 1f1f384: e5c0c03e strb ip, [r0, #62] ; 0x3e + 1f1f388: e5801044 str r1, [r0, #68] ; 0x44 + 1f1f38c: e5c01042 strb r1, [r0, #66] ; 0x42 + 1f1f390: e5c01041 strb r1, [r0, #65] ; 0x41 + 1f1f394: 1a00000a bne 1f1f3c4 + 1f1f398: e3a03000 mov r3, #0 + 1f1f39c: e5c03043 strb r3, [r0, #67] ; 0x43 + 1f1f3a0: e8bd8010 pop {r4, pc} + 1f1f3a4: e3130080 tst r3, #128 ; 0x80 + 1f1f3a8: 08bd8010 popeq {r4, pc} + 1f1f3ac: e5901000 ldr r1, [r0] + 1f1f3b0: e203307f and r3, r3, #127 ; 0x7f + 1f1f3b4: e5c03049 strb r3, [r0, #73] ; 0x49 + 1f1f3b8: e3510000 cmp r1, #0 + 1f1f3bc: 15c12000 strbne r2, [r1] + 1f1f3c0: e8bd8010 pop {r4, pc} + 1f1f3c4: e3c33020 bic r3, r3, #32 + 1f1f3c8: e5d0104a ldrb r1, [r0, #74] ; 0x4a + 1f1f3cc: e6af3073 sxtb r3, r3 + 1f1f3d0: e201107f and r1, r1, #127 ; 0x7f + 1f1f3d4: e6ef2073 uxtb r2, r3 + 1f1f3d8: e5c02049 strb r2, [r0, #73] ; 0x49 + 1f1f3dc: e0121001 ands r1, r2, r1 + 1f1f3e0: 0a00004f beq 1f1f524 + 1f1f3e4: e3530000 cmp r3, #0 + 1f1f3e8: baffffea blt 1f1f398 + 1f1f3ec: e5903000 ldr r3, [r0] + 1f1f3f0: e1e02c82 mvn r2, r2, lsl #25 + 1f1f3f4: e3530000 cmp r3, #0 + 1f1f3f8: e1e02ca2 mvn r2, r2, lsr #25 + 1f1f3fc: e5c02049 strb r2, [r0, #73] ; 0x49 + 1f1f400: 15c3c000 strbne ip, [r3] + 1f1f404: eaffffe3 b 1f1f398 + 1f1f408: e3c11040 bic r1, r1, #64 ; 0x40 + 1f1f40c: e5d0e04a ldrb lr, [r0, #74] ; 0x4a + 1f1f410: e6af1071 sxtb r1, r1 + 1f1f414: e20ee07f and lr, lr, #127 ; 0x7f + 1f1f418: e6ef2071 uxtb r2, r1 + 1f1f41c: e5c02049 strb r2, [r0, #73] ; 0x49 + 1f1f420: e012e00e ands lr, r2, lr + 1f1f424: 0a00004e beq 1f1f564 + 1f1f428: e3510000 cmp r1, #0 + 1f1f42c: baffff32 blt 1f1f0fc + 1f1f430: e5901000 ldr r1, [r0] + 1f1f434: e1e02c82 mvn r2, r2, lsl #25 + 1f1f438: e3510000 cmp r1, #0 + 1f1f43c: e1e02ca2 mvn r2, r2, lsr #25 + 1f1f440: e5c02049 strb r2, [r0, #73] ; 0x49 + 1f1f444: 15c1c000 strbne ip, [r1] + 1f1f448: 11d032be ldrhne r3, [r0, #46] ; 0x2e + 1f1f44c: eaffff2a b 1f1f0fc + 1f1f450: e3c33018 bic r3, r3, #24 + 1f1f454: e5d0c04a ldrb ip, [r0, #74] ; 0x4a + 1f1f458: e6af3073 sxtb r3, r3 + 1f1f45c: e20cc07f and ip, ip, #127 ; 0x7f + 1f1f460: e6ef1073 uxtb r1, r3 + 1f1f464: e5c01049 strb r1, [r0, #73] ; 0x49 + 1f1f468: e011c00c ands ip, r1, ip + 1f1f46c: 0a000034 beq 1f1f544 + 1f1f470: e3530000 cmp r3, #0 + 1f1f474: bafffee4 blt 1f1f00c + 1f1f478: e5903000 ldr r3, [r0] + 1f1f47c: e1e01c81 mvn r1, r1, lsl #25 + 1f1f480: e3530000 cmp r3, #0 + 1f1f484: e1e01ca1 mvn r1, r1, lsr #25 + 1f1f488: e5c01049 strb r1, [r0, #73] ; 0x49 + 1f1f48c: 13a01001 movne r1, #1 + 1f1f490: 15c31000 strbne r1, [r3] + 1f1f494: eafffedc b 1f1f00c + 1f1f498: e3c33003 bic r3, r3, #3 + 1f1f49c: e5d0c04a ldrb ip, [r0, #74] ; 0x4a + 1f1f4a0: e6af3073 sxtb r3, r3 + 1f1f4a4: e20cc07f and ip, ip, #127 ; 0x7f + 1f1f4a8: e6ef1073 uxtb r1, r3 + 1f1f4ac: e5c01049 strb r1, [r0, #73] ; 0x49 + 1f1f4b0: e011c00c ands ip, r1, ip + 1f1f4b4: 0a000033 beq 1f1f588 + 1f1f4b8: e3530000 cmp r3, #0 + 1f1f4bc: bafffee3 blt 1f1f050 + 1f1f4c0: e5903000 ldr r3, [r0] + 1f1f4c4: e1e01c81 mvn r1, r1, lsl #25 + 1f1f4c8: e3530000 cmp r3, #0 + 1f1f4cc: e1e01ca1 mvn r1, r1, lsr #25 + 1f1f4d0: e5c01049 strb r1, [r0, #73] ; 0x49 + 1f1f4d4: 13a01001 movne r1, #1 + 1f1f4d8: 15c31000 strbne r1, [r3] + 1f1f4dc: eafffedb b 1f1f050 + 1f1f4e0: e3130080 tst r3, #128 ; 0x80 + 1f1f4e4: 08bd8010 popeq {r4, pc} + 1f1f4e8: e5902020 ldr r2, [r0, #32] + 1f1f4ec: e5d0101c ldrb r1, [r0, #28] + 1f1f4f0: e3520000 cmp r2, #0 + 1f1f4f4: e3811080 orr r1, r1, #128 ; 0x80 + 1f1f4f8: e5c0101c strb r1, [r0, #28] + 1f1f4fc: 1affff65 bne 1f1f298 + 1f1f500: e8bd8010 pop {r4, pc} + 1f1f504: e3530000 cmp r3, #0 + 1f1f508: aaffff43 bge 1f1f21c + 1f1f50c: e5903000 ldr r3, [r0] + 1f1f510: e201107f and r1, r1, #127 ; 0x7f + 1f1f514: e5c01049 strb r1, [r0, #73] ; 0x49 + 1f1f518: e3530000 cmp r3, #0 + 1f1f51c: 15c32000 strbne r2, [r3] + 1f1f520: eaffff3d b 1f1f21c + 1f1f524: e3530000 cmp r3, #0 + 1f1f528: aaffff9a bge 1f1f398 + 1f1f52c: e5903000 ldr r3, [r0] + 1f1f530: e202207f and r2, r2, #127 ; 0x7f + 1f1f534: e5c02049 strb r2, [r0, #73] ; 0x49 + 1f1f538: e3530000 cmp r3, #0 + 1f1f53c: 15c31000 strbne r1, [r3] + 1f1f540: eaffff94 b 1f1f398 + 1f1f544: e3530000 cmp r3, #0 + 1f1f548: aafffeaf bge 1f1f00c + 1f1f54c: e5903000 ldr r3, [r0] + 1f1f550: e201107f and r1, r1, #127 ; 0x7f + 1f1f554: e5c01049 strb r1, [r0, #73] ; 0x49 + 1f1f558: e3530000 cmp r3, #0 + 1f1f55c: 15c3c000 strbne ip, [r3] + 1f1f560: eafffea9 b 1f1f00c + 1f1f564: e3510000 cmp r1, #0 + 1f1f568: aafffee3 bge 1f1f0fc + 1f1f56c: e5901000 ldr r1, [r0] + 1f1f570: e202207f and r2, r2, #127 ; 0x7f + 1f1f574: e5c02049 strb r2, [r0, #73] ; 0x49 + 1f1f578: e3510000 cmp r1, #0 + 1f1f57c: 15c1e000 strbne lr, [r1] + 1f1f580: 11d032be ldrhne r3, [r0, #46] ; 0x2e + 1f1f584: eafffedc b 1f1f0fc + 1f1f588: e3530000 cmp r3, #0 + 1f1f58c: aafffeaf bge 1f1f050 + 1f1f590: e5903000 ldr r3, [r0] + 1f1f594: e201107f and r1, r1, #127 ; 0x7f + 1f1f598: e5c01049 strb r1, [r0, #73] ; 0x49 + 1f1f59c: e3530000 cmp r3, #0 + 1f1f5a0: 15c3c000 strbne ip, [r3] + 1f1f5a4: eafffea9 b 1f1f050 + 1f1f5a8: e8bd8010 pop {r4, pc} + +01f1f5ac : + 1f1f5ac: e5901000 ldr r1, [r0] + 1f1f5b0: e3a02022 mov r2, #34 ; 0x22 + 1f1f5b4: e92d4010 push {r4, lr} + 1f1f5b8: e281192a add r1, r1, #688128 ; 0xa8000 + 1f1f5bc: e1a04000 mov r4, r0 + 1f1f5c0: e5900018 ldr r0, [r0, #24] + 1f1f5c4: e3a0c003 mov ip, #3 + 1f1f5c8: eddf6a30 vldr s13, [pc, #192] ; 1f1f690 + 1f1f5cc: e3a03000 mov r3, #0 + 1f1f5d0: e5842014 str r2, [r4, #20] + 1f1f5d4: e1d125b4 ldrh r2, [r1, #84] ; 0x54 + 1f1f5d8: e584c02c str ip, [r4, #44] ; 0x2c + 1f1f5dc: e584c020 str ip, [r4, #32] + 1f1f5e0: e1a02c12 lsl r2, r2, ip + 1f1f5e4: e5842034 str r2, [r4, #52] ; 0x34 + 1f1f5e8: e5843008 str r3, [r4, #8] + 1f1f5ec: ee072a90 vmov s15, r2 + 1f1f5f0: e5c43031 strb r3, [r4, #49] ; 0x31 + 1f1f5f4: e731f210 udiv r1, r0, r2 + 1f1f5f8: e5c4303c strb r3, [r4, #60] ; 0x3c + 1f1f5fc: e5c43030 strb r3, [r4, #48] ; 0x30 + 1f1f600: e5843010 str r3, [r4, #16] + 1f1f604: eeb87ae7 vcvt.f32.s32 s14, s15 + 1f1f608: e5c4303e strb r3, [r4, #62] ; 0x3e + 1f1f60c: e5843028 str r3, [r4, #40] ; 0x28 + 1f1f610: e5843024 str r3, [r4, #36] ; 0x24 + 1f1f614: eec67a87 vdiv.f32 s15, s13, s14 + 1f1f618: e0620192 mls r2, r2, r1, r0 + 1f1f61c: e5842018 str r2, [r4, #24] + 1f1f620: edc47a0e vstr s15, [r4, #56] ; 0x38 + 1f1f624: eb007edf bl 1f3f1a8 + 1f1f628: e3a01001 mov r1, #1 + 1f1f62c: ee070a90 vmov s15, r0 + 1f1f630: e3043240 movw r3, #16960 ; 0x4240 + 1f1f634: e340300f movt r3, #15 + 1f1f638: e5843004 str r3, [r4, #4] + 1f1f63c: ed9f7a14 vldr s14, [pc, #80] ; 1f1f694 + 1f1f640: e5940008 ldr r0, [r4, #8] + 1f1f644: eef86ae7 vcvt.f32.s32 s13, s15 + 1f1f648: eef37a02 vmov.f32 s15, #50 ; 0x41900000 18.0 + 1f1f64c: eee67a87 vfma.f32 s15, s13, s14 + 1f1f650: edc47a07 vstr s15, [r4, #28] + 1f1f654: ebfffa21 bl 1f1dee0 + 1f1f658: e5940008 ldr r0, [r4, #8] + 1f1f65c: e3a01001 mov r1, #1 + 1f1f660: ebfffa7a bl 1f1e050 + 1f1f664: e5940008 ldr r0, [r4, #8] + 1f1f668: e3a01001 mov r1, #1 + 1f1f66c: ebfffa4f bl 1f1dfb0 + 1f1f670: e5940008 ldr r0, [r4, #8] + 1f1f674: e3a01001 mov r1, #1 + 1f1f678: ebfffaa8 bl 1f1e120 + 1f1f67c: e3090dc5 movw r0, #40389 ; 0x9dc5 + 1f1f680: e348011c movt r0, #33052 ; 0x811c + 1f1f684: eb007ec0 bl 1f3f18c + 1f1f688: e1a00004 mov r0, r4 + 1f1f68c: e8bd8010 pop {r4, pc} + 1f1f690: 4a435000 .word 0x4a435000 + 1f1f694: 31000000 .word 0x31000000 + +01f1f698 : + 1f1f698: e5901000 ldr r1, [r0] + 1f1f69c: e3a02022 mov r2, #34 ; 0x22 + 1f1f6a0: e92d4010 push {r4, lr} + 1f1f6a4: e281192a add r1, r1, #688128 ; 0xa8000 + 1f1f6a8: e1a04000 mov r4, r0 + 1f1f6ac: e5900018 ldr r0, [r0, #24] + 1f1f6b0: e3a0c003 mov ip, #3 + 1f1f6b4: eddf6a2b vldr s13, [pc, #172] ; 1f1f768 + 1f1f6b8: e3a03000 mov r3, #0 + 1f1f6bc: e5842014 str r2, [r4, #20] + 1f1f6c0: e1d125b4 ldrh r2, [r1, #84] ; 0x54 + 1f1f6c4: e584c02c str ip, [r4, #44] ; 0x2c + 1f1f6c8: e584c020 str ip, [r4, #32] + 1f1f6cc: e1a02c12 lsl r2, r2, ip + 1f1f6d0: e5842034 str r2, [r4, #52] ; 0x34 + 1f1f6d4: e5c43031 strb r3, [r4, #49] ; 0x31 + 1f1f6d8: ee072a90 vmov s15, r2 + 1f1f6dc: e5c4303c strb r3, [r4, #60] ; 0x3c + 1f1f6e0: e731f210 udiv r1, r0, r2 + 1f1f6e4: e5c43030 strb r3, [r4, #48] ; 0x30 + 1f1f6e8: e5843010 str r3, [r4, #16] + 1f1f6ec: e5c4303e strb r3, [r4, #62] ; 0x3e + 1f1f6f0: eeb87ae7 vcvt.f32.s32 s14, s15 + 1f1f6f4: e5843028 str r3, [r4, #40] ; 0x28 + 1f1f6f8: e5843024 str r3, [r4, #36] ; 0x24 + 1f1f6fc: eec67a87 vdiv.f32 s15, s13, s14 + 1f1f700: e0620192 mls r2, r2, r1, r0 + 1f1f704: e5842018 str r2, [r4, #24] + 1f1f708: edc47a0e vstr s15, [r4, #56] ; 0x38 + 1f1f70c: eb007ea5 bl 1f3f1a8 + 1f1f710: e3a01001 mov r1, #1 + 1f1f714: ee070a90 vmov s15, r0 + 1f1f718: e3043240 movw r3, #16960 ; 0x4240 + 1f1f71c: e340300f movt r3, #15 + 1f1f720: e5843004 str r3, [r4, #4] + 1f1f724: ed9f7a10 vldr s14, [pc, #64] ; 1f1f76c + 1f1f728: e5940008 ldr r0, [r4, #8] + 1f1f72c: eef86ae7 vcvt.f32.s32 s13, s15 + 1f1f730: eef37a02 vmov.f32 s15, #50 ; 0x41900000 18.0 + 1f1f734: eee67a87 vfma.f32 s15, s13, s14 + 1f1f738: edc47a07 vstr s15, [r4, #28] + 1f1f73c: ebfff9e7 bl 1f1dee0 + 1f1f740: e5940008 ldr r0, [r4, #8] + 1f1f744: e3a01001 mov r1, #1 + 1f1f748: ebfffa40 bl 1f1e050 + 1f1f74c: e5940008 ldr r0, [r4, #8] + 1f1f750: e3a01001 mov r1, #1 + 1f1f754: ebfffa15 bl 1f1dfb0 + 1f1f758: e5940008 ldr r0, [r4, #8] + 1f1f75c: e3a01001 mov r1, #1 + 1f1f760: e8bd4010 pop {r4, lr} + 1f1f764: eafffa6d b 1f1e120 + 1f1f768: 4a435000 .word 0x4a435000 + 1f1f76c: 31000000 .word 0x31000000 + +01f1f770 : + 1f1f770: e3043240 movw r3, #16960 ; 0x4240 + 1f1f774: e340300f movt r3, #15 + 1f1f778: e880000a stm r0, {r1, r3} + 1f1f77c: e12fff1e bx lr + +01f1f780 : + 1f1f780: e5903000 ldr r3, [r0] + 1f1f784: e3530000 cmp r3, #0 + 1f1f788: 13a03000 movne r3, #0 + 1f1f78c: 15803000 strne r3, [r0] + 1f1f790: e12fff1e bx lr + +01f1f794 : + 1f1f794: e5900000 ldr r0, [r0] + 1f1f798: e3500000 cmp r0, #0 + 1f1f79c: 012fff1e bxeq lr + 1f1f7a0: eaffcd50 b 1f12ce8 + +01f1f7a4 : + 1f1f7a4: e5d03031 ldrb r3, [r0, #49] ; 0x31 + 1f1f7a8: e2012003 and r2, r1, #3 + 1f1f7ac: e7e0c151 ubfx ip, r1, #2, #1 + 1f1f7b0: e5c0c03c strb ip, [r0, #60] ; 0x3c + 1f1f7b4: e1520003 cmp r2, r3 + 1f1f7b8: 0a000028 beq 1f1f860 + 1f1f7bc: e243c001 sub ip, r3, #1 + 1f1f7c0: e20cc003 and ip, ip, #3 + 1f1f7c4: e15c0002 cmp ip, r2 + 1f1f7c8: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f1f7cc: 0a00001a beq 1f1f83c + 1f1f7d0: e2833001 add r3, r3, #1 + 1f1f7d4: e2033003 and r3, r3, #3 + 1f1f7d8: e1520003 cmp r2, r3 + 1f1f7dc: e5903014 ldr r3, [r0, #20] + 1f1f7e0: 0a00001a beq 1f1f850 + 1f1f7e4: e2833915 add r3, r3, #344064 ; 0x54000 + 1f1f7e8: e590e000 ldr lr, [r0] + 1f1f7ec: e2833008 add r3, r3, #8 + 1f1f7f0: e5c02031 strb r2, [r0, #49] ; 0x31 + 1f1f7f4: eddf6a1e vldr s13, [pc, #120] ; 1f1f874 + 1f1f7f8: e590c018 ldr ip, [r0, #24] + 1f1f7fc: e1a03083 lsl r3, r3, #1 + 1f1f800: e19e30b3 ldrh r3, [lr, r3] + 1f1f804: e1a03183 lsl r3, r3, #3 + 1f1f808: e5803034 str r3, [r0, #52] ; 0x34 + 1f1f80c: ee073a90 vmov s15, r3 + 1f1f810: e732f31c udiv r2, ip, r3 + 1f1f814: eeb87ae7 vcvt.f32.s32 s14, s15 + 1f1f818: eec67a87 vdiv.f32 s15, s13, s14 + 1f1f81c: e063c293 mls r3, r3, r2, ip + 1f1f820: e5803018 str r3, [r0, #24] + 1f1f824: e7e132d1 ubfx r3, r1, #5, #2 + 1f1f828: e7e011d1 ubfx r1, r1, #3, #1 + 1f1f82c: e580302c str r3, [r0, #44] ; 0x2c + 1f1f830: e5c0103d strb r1, [r0, #61] ; 0x3d + 1f1f834: edc07a0e vstr s15, [r0, #56] ; 0x38 + 1f1f838: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f1f83c: e5903014 ldr r3, [r0, #20] + 1f1f840: e3530000 cmp r3, #0 + 1f1f844: 12433001 subne r3, r3, #1 + 1f1f848: 15803014 strne r3, [r0, #20] + 1f1f84c: eaffffe4 b 1f1f7e4 + 1f1f850: e3530052 cmp r3, #82 ; 0x52 + 1f1f854: 92833001 addls r3, r3, #1 + 1f1f858: 95803014 strls r3, [r0, #20] + 1f1f85c: eaffffe0 b 1f1f7e4 + 1f1f860: e7e132d1 ubfx r3, r1, #5, #2 + 1f1f864: e7e011d1 ubfx r1, r1, #3, #1 + 1f1f868: e580302c str r3, [r0, #44] ; 0x2c + 1f1f86c: e5c0103d strb r1, [r0, #61] ; 0x3d + 1f1f870: e12fff1e bx lr + 1f1f874: 4a435000 .word 0x4a435000 + +01f1f878 : + 1f1f878: e5903018 ldr r3, [r0, #24] + 1f1f87c: e590c034 ldr ip, [r0, #52] ; 0x34 + 1f1f880: e2833001 add r3, r3, #1 + 1f1f884: e732fc13 udiv r2, r3, ip + 1f1f888: e063329c mls r3, ip, r2, r3 + 1f1f88c: e5803018 str r3, [r0, #24] + 1f1f890: e1a031a3 lsr r3, r3, #3 + 1f1f894: e5813000 str r3, [r1] + 1f1f898: e5900018 ldr r0, [r0, #24] + 1f1f89c: e1e00000 mvn r0, r0 + 1f1f8a0: e2000007 and r0, r0, #7 + 1f1f8a4: e12fff1e bx lr + +01f1f8a8 : + 1f1f8a8: e5902018 ldr r2, [r0, #24] + 1f1f8ac: e1a03000 mov r3, r0 + 1f1f8b0: e1a021a2 lsr r2, r2, #3 + 1f1f8b4: e5812000 str r2, [r1] + 1f1f8b8: e5900018 ldr r0, [r0, #24] + 1f1f8bc: e5932034 ldr r2, [r3, #52] ; 0x34 + 1f1f8c0: e280c001 add ip, r0, #1 + 1f1f8c4: e1e00000 mvn r0, r0 + 1f1f8c8: e2000007 and r0, r0, #7 + 1f1f8cc: e731f21c udiv r1, ip, r2 + 1f1f8d0: e062c192 mls r2, r2, r1, ip + 1f1f8d4: e5832018 str r2, [r3, #24] + 1f1f8d8: e12fff1e bx lr + +01f1f8dc : + 1f1f8dc: e5902018 ldr r2, [r0, #24] + 1f1f8e0: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f1f8e4: e590e034 ldr lr, [r0, #52] ; 0x34 + 1f1f8e8: e2822001 add r2, r2, #1 + 1f1f8ec: e590c000 ldr ip, [r0] + 1f1f8f0: e731fe12 udiv r1, r2, lr + 1f1f8f4: e59c3004 ldr r3, [ip, #4] + 1f1f8f8: e3530000 cmp r3, #0 + 1f1f8fc: 15903014 ldrne r3, [r0, #20] + 1f1f900: e062219e mls r2, lr, r1, r2 + 1f1f904: 108cc683 addne ip, ip, r3, lsl #13 + 1f1f908: e5802018 str r2, [r0, #24] + 1f1f90c: 11e00002 mvnne r0, r2 + 1f1f910: 108c21a2 addne r2, ip, r2, lsr #3 + 1f1f914: 12000007 andne r0, r0, #7 + 1f1f918: 15d23010 ldrbne r3, [r2, #16] + 1f1f91c: 11a00053 asrne r0, r3, r0 + 1f1f920: 12000001 andne r0, r0, #1 + 1f1f924: 01a00003 moveq r0, r3 + 1f1f928: e49df004 pop {pc} ; (ldr pc, [sp], #4) + +01f1f92c : + 1f1f92c: e92d4030 push {r4, r5, lr} + 1f1f930: e5904018 ldr r4, [r0, #24] + 1f1f934: e5903034 ldr r3, [r0, #52] ; 0x34 + 1f1f938: e284e001 add lr, r4, #1 + 1f1f93c: e590c000 ldr ip, [r0] + 1f1f940: e732f31e udiv r2, lr, r3 + 1f1f944: e59c5004 ldr r5, [ip, #4] + 1f1f948: e3550000 cmp r5, #0 + 1f1f94c: e063e293 mls r3, r3, r2, lr + 1f1f950: e5803018 str r3, [r0, #24] + 1f1f954: 08bd8030 popeq {r4, r5, pc} + 1f1f958: e5902014 ldr r2, [r0, #20] + 1f1f95c: e1e03004 mvn r3, r4 + 1f1f960: e3510000 cmp r1, #0 + 1f1f964: e1a041a4 lsr r4, r4, #3 + 1f1f968: e2033007 and r3, r3, #7 + 1f1f96c: e3a0e001 mov lr, #1 + 1f1f970: e1a01682 lsl r1, r2, #13 + 1f1f974: e08c0001 add r0, ip, r1 + 1f1f978: e1a0331e lsl r3, lr, r3 + 1f1f97c: e0800004 add r0, r0, r4 + 1f1f980: e6ef5073 uxtb r5, r3 + 1f1f984: e5d00010 ldrb r0, [r0, #16] + 1f1f988: 0a00000a beq 1f1f9b8 + 1f1f98c: e1100005 tst r0, r5 + 1f1f990: e1800005 orr r0, r0, r5 + 1f1f994: 008c2002 addeq r2, ip, r2 + 1f1f998: 0282292a addeq r2, r2, #688128 ; 0xa8000 + 1f1f99c: 05c2e10c strbeq lr, [r2, #268] ; 0x10c + 1f1f9a0: 05c2e160 strbeq lr, [r2, #352] ; 0x160 + 1f1f9a4: 05cce001 strbeq lr, [ip, #1] + 1f1f9a8: e08cc001 add ip, ip, r1 + 1f1f9ac: e08c4004 add r4, ip, r4 + 1f1f9b0: e5c40010 strb r0, [r4, #16] + 1f1f9b4: e8bd8030 pop {r4, r5, pc} + 1f1f9b8: e1100005 tst r0, r5 + 1f1f9bc: e1c03003 bic r3, r0, r3 + 1f1f9c0: 108c2002 addne r2, ip, r2 + 1f1f9c4: 1282292a addne r2, r2, #688128 ; 0xa8000 + 1f1f9c8: 15c2e10c strbne lr, [r2, #268] ; 0x10c + 1f1f9cc: 15c2e160 strbne lr, [r2, #352] ; 0x160 + 1f1f9d0: 15cce001 strbne lr, [ip, #1] + 1f1f9d4: e08cc001 add ip, ip, r1 + 1f1f9d8: e08cc004 add ip, ip, r4 + 1f1f9dc: e5cc3010 strb r3, [ip, #16] + 1f1f9e0: e8bd8030 pop {r4, r5, pc} + +01f1f9e4 : + 1f1f9e4: e5903004 ldr r3, [r0, #4] + 1f1f9e8: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f1f9ec: e3530000 cmp r3, #0 + 1f1f9f0: e1a04000 mov r4, r0 + 1f1f9f4: ed2d8b04 vpush {d8-d9} + 1f1f9f8: 0a000014 beq 1f1fa50 + 1f1f9fc: e2433001 sub r3, r3, #1 + 1f1fa00: e5803004 str r3, [r0, #4] + 1f1fa04: e3530000 cmp r3, #0 + 1f1fa08: 1a000071 bne 1f1fbd4 + 1f1fa0c: e5901000 ldr r1, [r0] + 1f1fa10: e5902008 ldr r2, [r0, #8] + 1f1fa14: e5d16000 ldrb r6, [r1] + 1f1fa18: e3560000 cmp r6, #0 + 1f1fa1c: 11a06003 movne r6, r3 + 1f1fa20: 05d2301d ldrbeq r3, [r2, #29] + 1f1fa24: 15d2101d ldrbne r1, [r2, #29] + 1f1fa28: 03833010 orreq r3, r3, #16 + 1f1fa2c: 13c13010 bicne r3, r1, #16 + 1f1fa30: e5c2301d strb r3, [r2, #29] + 1f1fa34: e5d41030 ldrb r1, [r4, #48] ; 0x30 + 1f1fa38: e5940008 ldr r0, [r4, #8] + 1f1fa3c: e2211001 eor r1, r1, #1 + 1f1fa40: ebfff926 bl 1f1dee0 + 1f1fa44: e1a00006 mov r0, r6 + 1f1fa48: ecbd8b04 vpop {d8-d9} + 1f1fa4c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f1fa50: e5906000 ldr r6, [r0] + 1f1fa54: e3560000 cmp r6, #0 + 1f1fa58: 0afffff5 beq 1f1fa34 + 1f1fa5c: e5d0603c ldrb r6, [r0, #60] ; 0x3c + 1f1fa60: e3560000 cmp r6, #0 + 1f1fa64: 0afffff2 beq 1f1fa34 + 1f1fa68: e5902008 ldr r2, [r0, #8] + 1f1fa6c: e3a05010 mov r5, #16 + 1f1fa70: eddf8aca vldr s17, [pc, #808] ; 1f1fda0 + 1f1fa74: e5d06030 ldrb r6, [r0, #48] ; 0x30 + 1f1fa78: ed9f9ac9 vldr s18, [pc, #804] ; 1f1fda4 + 1f1fa7c: e5d27004 ldrb r7, [r2, #4] + 1f1fa80: e3560000 cmp r6, #0 + 1f1fa84: 13a06001 movne r6, #1 + 1f1fa88: 15c03030 strbne r3, [r0, #48] ; 0x30 + 1f1fa8c: eeb78a00 vmov.f32 s16, #112 ; 0x3f800000 1.0 + 1f1fa90: e2077020 and r7, r7, #32 + 1f1fa94: e6ef7077 uxtb r7, r7 + 1f1fa98: ea000001 b 1f1faa4 + 1f1fa9c: e2555001 subs r5, r5, #1 + 1f1faa0: 0affffe3 beq 1f1fa34 + 1f1faa4: e3570000 cmp r7, #0 + 1f1faa8: 0a00002a beq 1f1fb58 + 1f1faac: edd47a03 vldr s15, [r4, #12] + 1f1fab0: ed947a0e vldr s14, [r4, #56] ; 0x38 + 1f1fab4: ee777a88 vadd.f32 s15, s15, s16 + 1f1fab8: eef47ac7 vcmpe.f32 s15, s14 + 1f1fabc: edc47a03 vstr s15, [r4, #12] + 1f1fac0: eef1fa10 vmrs APSR_nzcv, fpscr + 1f1fac4: ba000050 blt 1f1fc0c + 1f1fac8: e5943018 ldr r3, [r4, #24] + 1f1facc: e5940034 ldr r0, [r4, #52] ; 0x34 + 1f1fad0: e2833001 add r3, r3, #1 + 1f1fad4: e5941000 ldr r1, [r4] + 1f1fad8: ee777ac7 vsub.f32 s15, s15, s14 + 1f1fadc: e732f013 udiv r2, r3, r0 + 1f1fae0: e591c004 ldr ip, [r1, #4] + 1f1fae4: edc47a03 vstr s15, [r4, #12] + 1f1fae8: e35c0000 cmp ip, #0 + 1f1faec: e0633290 mls r3, r0, r2, r3 + 1f1faf0: e5843018 str r3, [r4, #24] + 1f1faf4: 0a000044 beq 1f1fc0c + 1f1faf8: e5940014 ldr r0, [r4, #20] + 1f1fafc: e1e02003 mvn r2, r3 + 1f1fb00: e2022007 and r2, r2, #7 + 1f1fb04: e0811680 add r1, r1, r0, lsl #13 + 1f1fb08: e08131a3 add r3, r1, r3, lsr #3 + 1f1fb0c: e5d33010 ldrb r3, [r3, #16] + 1f1fb10: e1a03253 asr r3, r3, r2 + 1f1fb14: e3130001 tst r3, #1 + 1f1fb18: 0a00003b beq 1f1fc0c + 1f1fb1c: e594202c ldr r2, [r4, #44] ; 0x2c + 1f1fb20: e3a03000 mov r3, #0 + 1f1fb24: e5842020 str r2, [r4, #32] + 1f1fb28: e5843024 str r3, [r4, #36] ; 0x24 + 1f1fb2c: eb007d9d bl 1f3f1a8 + 1f1fb30: ee070a90 vmov s15, r0 + 1f1fb34: ed9f7a9b vldr s14, [pc, #620] ; 1f1fda8 + 1f1fb38: eef86ae7 vcvt.f32.s32 s13, s15 + 1f1fb3c: eef37a02 vmov.f32 s15, #50 ; 0x41900000 18.0 + 1f1fb40: eee67a87 vfma.f32 s15, s13, s14 + 1f1fb44: ee777ae8 vsub.f32 s15, s15, s17 + 1f1fb48: eef57ac0 vcmpe.f32 s15, #0.0 + 1f1fb4c: edc47a07 vstr s15, [r4, #28] + 1f1fb50: eef1fa10 vmrs APSR_nzcv, fpscr + 1f1fb54: 9a000046 bls 1f1fc74 + 1f1fb58: e5943020 ldr r3, [r4, #32] + 1f1fb5c: e2833001 add r3, r3, #1 + 1f1fb60: e5843020 str r3, [r4, #32] + 1f1fb64: e3530010 cmp r3, #16 + 1f1fb68: 1affffcb bne 1f1fa9c + 1f1fb6c: e5943024 ldr r3, [r4, #36] ; 0x24 + 1f1fb70: e594202c ldr r2, [r4, #44] ; 0x2c + 1f1fb74: e2833001 add r3, r3, #1 + 1f1fb78: e5842020 str r2, [r4, #32] + 1f1fb7c: e2031003 and r1, r3, #3 + 1f1fb80: e203200f and r2, r3, #15 + 1f1fb84: e3510002 cmp r1, #2 + 1f1fb88: e5842024 str r2, [r4, #36] ; 0x24 + 1f1fb8c: 0a000020 beq 1f1fc14 + 1f1fb90: e2133002 ands r3, r3, #2 + 1f1fb94: 1affffc0 bne 1f1fa9c + 1f1fb98: e5942028 ldr r2, [r4, #40] ; 0x28 + 1f1fb9c: e3520008 cmp r2, #8 + 1f1fba0: 1affffbd bne 1f1fa9c + 1f1fba4: e5942008 ldr r2, [r4, #8] + 1f1fba8: e3570000 cmp r7, #0 + 1f1fbac: e5843028 str r3, [r4, #40] ; 0x28 + 1f1fbb0: e5d23004 ldrb r3, [r2, #4] + 1f1fbb4: e7e030d3 ubfx r3, r3, #1, #1 + 1f1fbb8: e5c43030 strb r3, [r4, #48] ; 0x30 + 1f1fbbc: 15d43010 ldrbne r3, [r4, #16] + 1f1fbc0: 05d23008 ldrbeq r3, [r2, #8] + 1f1fbc4: 15c4303e strbne r3, [r4, #62] ; 0x3e + 1f1fbc8: 05c4303e strbeq r3, [r4, #62] ; 0x3e + 1f1fbcc: 15c23009 strbne r3, [r2, #9] + 1f1fbd0: eaffffb1 b 1f1fa9c + 1f1fbd4: e3a02d9f mov r2, #10176 ; 0x27c0 + 1f1fbd8: e3402009 movt r2, #9 + 1f1fbdc: e1530002 cmp r3, r2 + 1f1fbe0: 8a00002e bhi 1f1fca0 + 1f1fbe4: e3a02d6a mov r2, #6784 ; 0x1a80 + 1f1fbe8: e3402006 movt r2, #6 + 1f1fbec: e1530002 cmp r3, r2 + 1f1fbf0: e5902008 ldr r2, [r0, #8] + 1f1fbf4: e3a06000 mov r6, #0 + 1f1fbf8: e5d2301d ldrb r3, [r2, #29] + 1f1fbfc: 83833010 orrhi r3, r3, #16 + 1f1fc00: 93c33010 bicls r3, r3, #16 + 1f1fc04: e5c2301d strb r3, [r2, #29] + 1f1fc08: eaffff89 b 1f1fa34 + 1f1fc0c: edd47a07 vldr s15, [r4, #28] + 1f1fc10: eaffffcb b 1f1fb44 + 1f1fc14: e2422002 sub r2, r2, #2 + 1f1fc18: e5943010 ldr r3, [r4, #16] + 1f1fc1c: e16f2f12 clz r2, r2 + 1f1fc20: e3570000 cmp r7, #0 + 1f1fc24: e1a022a2 lsr r2, r2, #5 + 1f1fc28: e1822083 orr r2, r2, r3, lsl #1 + 1f1fc2c: e5842010 str r2, [r4, #16] + 1f1fc30: 0a000020 beq 1f1fcb8 + 1f1fc34: e5d4303e ldrb r3, [r4, #62] ; 0x3e + 1f1fc38: e7e92052 ubfx r2, r2, #0, #10 + 1f1fc3c: e30013ff movw r1, #1023 ; 0x3ff + 1f1fc40: e1520001 cmp r2, r1 + 1f1fc44: e1a03083 lsl r3, r3, #1 + 1f1fc48: e5c4303e strb r3, [r4, #62] ; 0x3e + 1f1fc4c: 0a000027 beq 1f1fcf0 + 1f1fc50: e5942008 ldr r2, [r4, #8] + 1f1fc54: e5d2301d ldrb r3, [r2, #29] + 1f1fc58: e1e03c83 mvn r3, r3, lsl #25 + 1f1fc5c: e1e03ca3 mvn r3, r3, lsr #25 + 1f1fc60: e5c2301d strb r3, [r2, #29] + 1f1fc64: e5943028 ldr r3, [r4, #40] ; 0x28 + 1f1fc68: e2833001 add r3, r3, #1 + 1f1fc6c: e5843028 str r3, [r4, #40] ; 0x28 + 1f1fc70: eaffff89 b 1f1fa9c + 1f1fc74: e594202c ldr r2, [r4, #44] ; 0x2c + 1f1fc78: e3a03000 mov r3, #0 + 1f1fc7c: e5842020 str r2, [r4, #32] + 1f1fc80: e5843024 str r3, [r4, #36] ; 0x24 + 1f1fc84: eb007d47 bl 1f3f1a8 + 1f1fc88: ee070a90 vmov s15, r0 + 1f1fc8c: eeb87ae7 vcvt.f32.s32 s14, s15 + 1f1fc90: eef07a00 vmov.f32 s15, #0 ; 0x40000000 2.0 + 1f1fc94: eee77a09 vfma.f32 s15, s14, s18 + 1f1fc98: edc47a07 vstr s15, [r4, #28] + 1f1fc9c: eaffffad b 1f1fb58 + 1f1fca0: e5902008 ldr r2, [r0, #8] + 1f1fca4: e3a06000 mov r6, #0 + 1f1fca8: e5d2301d ldrb r3, [r2, #29] + 1f1fcac: e3c33010 bic r3, r3, #16 + 1f1fcb0: e5c2301d strb r3, [r2, #29] + 1f1fcb4: eaffff5e b 1f1fa34 + 1f1fcb8: e594e018 ldr lr, [r4, #24] + 1f1fcbc: e5942034 ldr r2, [r4, #52] ; 0x34 + 1f1fcc0: e28ec001 add ip, lr, #1 + 1f1fcc4: e5940000 ldr r0, [r4] + 1f1fcc8: e731f21c udiv r1, ip, r2 + 1f1fccc: e5903004 ldr r3, [r0, #4] + 1f1fcd0: e3530000 cmp r3, #0 + 1f1fcd4: e5d4303e ldrb r3, [r4, #62] ; 0x3e + 1f1fcd8: e062c192 mls r2, r2, r1, ip + 1f1fcdc: e5842018 str r2, [r4, #24] + 1f1fce0: 1a000009 bne 1f1fd0c + 1f1fce4: e1a03083 lsl r3, r3, #1 + 1f1fce8: e5c4303e strb r3, [r4, #62] ; 0x3e + 1f1fcec: eaffffdc b 1f1fc64 + 1f1fcf0: e5942008 ldr r2, [r4, #8] + 1f1fcf4: e3a03000 mov r3, #0 + 1f1fcf8: e5843028 str r3, [r4, #40] ; 0x28 + 1f1fcfc: e5d2301d ldrb r3, [r2, #29] + 1f1fd00: e203307f and r3, r3, #127 ; 0x7f + 1f1fd04: e5c2301d strb r3, [r2, #29] + 1f1fd08: eaffff63 b 1f1fa9c + 1f1fd0c: e5941014 ldr r1, [r4, #20] + 1f1fd10: e1e0200e mvn r2, lr + 1f1fd14: e3130080 tst r3, #128 ; 0x80 + 1f1fd18: e1a0e1ae lsr lr, lr, #3 + 1f1fd1c: e2022007 and r2, r2, #7 + 1f1fd20: e3a08001 mov r8, #1 + 1f1fd24: e1a03681 lsl r3, r1, #13 + 1f1fd28: e080c003 add ip, r0, r3 + 1f1fd2c: e1a02218 lsl r2, r8, r2 + 1f1fd30: e08cc00e add ip, ip, lr + 1f1fd34: e6ef9072 uxtb r9, r2 + 1f1fd38: e5dcc010 ldrb ip, [ip, #16] + 1f1fd3c: 0a00000b beq 1f1fd70 + 1f1fd40: e11c0009 tst ip, r9 + 1f1fd44: e18cc009 orr ip, ip, r9 + 1f1fd48: 00802001 addeq r2, r0, r1 + 1f1fd4c: 0282292a addeq r2, r2, #688128 ; 0xa8000 + 1f1fd50: 05c2810c strbeq r8, [r2, #268] ; 0x10c + 1f1fd54: 05c28160 strbeq r8, [r2, #352] ; 0x160 + 1f1fd58: 05c08001 strbeq r8, [r0, #1] + 1f1fd5c: e0800003 add r0, r0, r3 + 1f1fd60: e080e00e add lr, r0, lr + 1f1fd64: e5cec010 strb ip, [lr, #16] + 1f1fd68: e5d4303e ldrb r3, [r4, #62] ; 0x3e + 1f1fd6c: eaffffdc b 1f1fce4 + 1f1fd70: e11c0009 tst ip, r9 + 1f1fd74: e1cc2002 bic r2, ip, r2 + 1f1fd78: 10801001 addne r1, r0, r1 + 1f1fd7c: 1281192a addne r1, r1, #688128 ; 0xa8000 + 1f1fd80: 15c1810c strbne r8, [r1, #268] ; 0x10c + 1f1fd84: 15c18160 strbne r8, [r1, #352] ; 0x160 + 1f1fd88: 15c08001 strbne r8, [r0, #1] + 1f1fd8c: e0800003 add r0, r0, r3 + 1f1fd90: e080300e add r3, r0, lr + 1f1fd94: e5c32010 strb r2, [r3, #16] + 1f1fd98: e5d4303e ldrb r3, [r4, #62] ; 0x3e + 1f1fd9c: eaffffd0 b 1f1fce4 + 1f1fda0: 3d800000 .word 0x3d800000 + 1f1fda4: 32380000 .word 0x32380000 + 1f1fda8: 30800000 .word 0x30800000 + +01f1fdac : + 1f1fdac: e5902000 ldr r2, [r0] + 1f1fdb0: e2823001 add r3, r2, #1 + 1f1fdb4: e1510003 cmp r1, r3 + 1f1fdb8: 9a000026 bls 1f1fe58 + 1f1fdbc: e92d4010 push {r4, lr} + 1f1fdc0: e2414001 sub r4, r1, #1 + 1f1fdc4: ea000003 b 1f1fdd8 + 1f1fdc8: e1530004 cmp r3, r4 + 1f1fdcc: e1a02003 mov r2, r3 + 1f1fdd0: e5803000 str r3, [r0] + 1f1fdd4: 0a00001c beq 1f1fe4c + 1f1fdd8: e5d2c000 ldrb ip, [r2] + 1f1fddc: e2823001 add r3, r2, #1 + 1f1fde0: e1a0e003 mov lr, r3 + 1f1fde4: e20cc003 and ip, ip, #3 + 1f1fde8: e35c0003 cmp ip, #3 + 1f1fdec: 1afffff5 bne 1f1fdc8 + 1f1fdf0: e5d22001 ldrb r2, [r2, #1] + 1f1fdf4: e35200ff cmp r2, #255 ; 0xff + 1f1fdf8: 1afffff2 bne 1f1fdc8 + 1f1fdfc: e1510003 cmp r1, r3 + 1f1fe00: e5803000 str r3, [r0] + 1f1fe04: 9a00000c bls 1f1fe3c + 1f1fe08: e5d32000 ldrb r2, [r3] + 1f1fe0c: e35200ff cmp r2, #255 ; 0xff + 1f1fe10: 1a000009 bne 1f1fe3c + 1f1fe14: e2833001 add r3, r3, #1 + 1f1fe18: ea000002 b 1f1fe28 + 1f1fe1c: e5de2000 ldrb r2, [lr] + 1f1fe20: e35200ff cmp r2, #255 ; 0xff + 1f1fe24: 1a000004 bne 1f1fe3c + 1f1fe28: e1510003 cmp r1, r3 + 1f1fe2c: e5803000 str r3, [r0] + 1f1fe30: e1a0e003 mov lr, r3 + 1f1fe34: e2833001 add r3, r3, #1 + 1f1fe38: 1afffff7 bne 1f1fe1c + 1f1fe3c: e151000e cmp r1, lr + 1f1fe40: 93a00000 movls r0, #0 + 1f1fe44: 83a00001 movhi r0, #1 + 1f1fe48: e8bd8010 pop {r4, pc} + 1f1fe4c: e5801000 str r1, [r0] + 1f1fe50: e3a00000 mov r0, #0 + 1f1fe54: e8bd8010 pop {r4, pc} + 1f1fe58: e5801000 str r1, [r0] + 1f1fe5c: e3a00000 mov r0, #0 + 1f1fe60: e12fff1e bx lr + +01f1fe64 : + 1f1fe64: e5d02000 ldrb r2, [r0] + 1f1fe68: e30f3418 movw r3, #62488 ; 0xf418 + 1f1fe6c: e34031f5 movt r3, #501 ; 0x1f5 + 1f1fe70: e7d32242 ldrb r2, [r3, r2, asr #4] + 1f1fe74: e1a02182 lsl r2, r2, #3 + 1f1fe78: e6ef2072 uxtb r2, r2 + 1f1fe7c: e5c12000 strb r2, [r1] + 1f1fe80: e5d0c000 ldrb ip, [r0] + 1f1fe84: e20cc00f and ip, ip, #15 + 1f1fe88: e7d3c00c ldrb ip, [r3, ip] + 1f1fe8c: e182212c orr r2, r2, ip, lsr #2 + 1f1fe90: e5c12000 strb r2, [r1] + 1f1fe94: e5d02000 ldrb r2, [r0] + 1f1fe98: e202200f and r2, r2, #15 + 1f1fe9c: e7d32002 ldrb r2, [r3, r2] + 1f1fea0: e1a02302 lsl r2, r2, #6 + 1f1fea4: e6ef2072 uxtb r2, r2 + 1f1fea8: e5c12001 strb r2, [r1, #1] + 1f1feac: e5d0c001 ldrb ip, [r0, #1] + 1f1feb0: e7d3c24c ldrb ip, [r3, ip, asr #4] + 1f1feb4: e182208c orr r2, r2, ip, lsl #1 + 1f1feb8: e6af2072 sxtb r2, r2 + 1f1febc: e5c12001 strb r2, [r1, #1] + 1f1fec0: e5d0c001 ldrb ip, [r0, #1] + 1f1fec4: e20cc00f and ip, ip, #15 + 1f1fec8: e7d3c00c ldrb ip, [r3, ip] + 1f1fecc: e182222c orr r2, r2, ip, lsr #4 + 1f1fed0: e5c12001 strb r2, [r1, #1] + 1f1fed4: e5d02001 ldrb r2, [r0, #1] + 1f1fed8: e202200f and r2, r2, #15 + 1f1fedc: e7d32002 ldrb r2, [r3, r2] + 1f1fee0: e1a02202 lsl r2, r2, #4 + 1f1fee4: e6ef2072 uxtb r2, r2 + 1f1fee8: e5c12002 strb r2, [r1, #2] + 1f1feec: e5d0c002 ldrb ip, [r0, #2] + 1f1fef0: e7d3c24c ldrb ip, [r3, ip, asr #4] + 1f1fef4: e18220ac orr r2, r2, ip, lsr #1 + 1f1fef8: e5c12002 strb r2, [r1, #2] + 1f1fefc: e5d02002 ldrb r2, [r0, #2] + 1f1ff00: e7d32242 ldrb r2, [r3, r2, asr #4] + 1f1ff04: e1a02382 lsl r2, r2, #7 + 1f1ff08: e6ef2072 uxtb r2, r2 + 1f1ff0c: e5c12003 strb r2, [r1, #3] + 1f1ff10: e5d0c002 ldrb ip, [r0, #2] + 1f1ff14: e20cc00f and ip, ip, #15 + 1f1ff18: e7d3c00c ldrb ip, [r3, ip] + 1f1ff1c: e182210c orr r2, r2, ip, lsl #2 + 1f1ff20: e6af2072 sxtb r2, r2 + 1f1ff24: e5c12003 strb r2, [r1, #3] + 1f1ff28: e5d0c003 ldrb ip, [r0, #3] + 1f1ff2c: e7d3c24c ldrb ip, [r3, ip, asr #4] + 1f1ff30: e18221ac orr r2, r2, ip, lsr #3 + 1f1ff34: e5c12003 strb r2, [r1, #3] + 1f1ff38: e5d02003 ldrb r2, [r0, #3] + 1f1ff3c: e7d32242 ldrb r2, [r3, r2, asr #4] + 1f1ff40: e1a02282 lsl r2, r2, #5 + 1f1ff44: e6ef2072 uxtb r2, r2 + 1f1ff48: e5c12004 strb r2, [r1, #4] + 1f1ff4c: e5d00003 ldrb r0, [r0, #3] + 1f1ff50: e200000f and r0, r0, #15 + 1f1ff54: e7d33000 ldrb r3, [r3, r0] + 1f1ff58: e1822003 orr r2, r2, r3 + 1f1ff5c: e5c12004 strb r2, [r1, #4] + 1f1ff60: e12fff1e bx lr + +01f1ff64 : + 1f1ff64: e92d4070 push {r4, r5, r6, lr} + 1f1ff68: e30fc528 movw ip, #62760 ; 0xf528 + 1f1ff6c: e340c1f5 movt ip, #501 ; 0x1f5 + 1f1ff70: e5d0e000 ldrb lr, [r0] + 1f1ff74: e30f23f8 movw r2, #62456 ; 0xf3f8 + 1f1ff78: e34021f5 movt r2, #501 ; 0x1f5 + 1f1ff7c: e5d04001 ldrb r4, [r0, #1] + 1f1ff80: e1a0310e lsl r3, lr, #2 + 1f1ff84: e7d2e1ce ldrb lr, [r2, lr, asr #3] + 1f1ff88: e1833324 orr r3, r3, r4, lsr #6 + 1f1ff8c: e203301f and r3, r3, #31 + 1f1ff90: e7dc3003 ldrb r3, [ip, r3] + 1f1ff94: e18e4003 orr r4, lr, r3 + 1f1ff98: e5c14000 strb r4, [r1] + 1f1ff9c: e35300ff cmp r3, #255 ; 0xff + 1f1ffa0: 135e00ff cmpne lr, #255 ; 0xff + 1f1ffa4: e5d03001 ldrb r3, [r0, #1] + 1f1ffa8: 13a0e000 movne lr, #0 + 1f1ffac: e5d05002 ldrb r5, [r0, #2] + 1f1ffb0: 03a0e001 moveq lr, #1 + 1f1ffb4: e7e440d3 ubfx r4, r3, #1, #5 + 1f1ffb8: e1a03203 lsl r3, r3, #4 + 1f1ffbc: e1833225 orr r3, r3, r5, lsr #4 + 1f1ffc0: e203301f and r3, r3, #31 + 1f1ffc4: e7d25004 ldrb r5, [r2, r4] + 1f1ffc8: e7dc3003 ldrb r3, [ip, r3] + 1f1ffcc: e35300ff cmp r3, #255 ; 0xff + 1f1ffd0: 135500ff cmpne r5, #255 ; 0xff + 1f1ffd4: 11a0400e movne r4, lr + 1f1ffd8: 122ee001 eorne lr, lr, #1 + 1f1ffdc: 1a000003 bne 1f1fff0 + 1f1ffe0: e35e0000 cmp lr, #0 + 1f1ffe4: 03a04002 moveq r4, #2 + 1f1ffe8: 13a0e000 movne lr, #0 + 1f1ffec: 13a04001 movne r4, #1 + 1f1fff0: e1853003 orr r3, r5, r3 + 1f1fff4: e5c13001 strb r3, [r1, #1] + 1f1fff8: e5d03003 ldrb r3, [r0, #3] + 1f1fffc: e5d06002 ldrb r6, [r0, #2] + 1f20000: e7e45153 ubfx r5, r3, #2, #5 + 1f20004: e1a033c3 asr r3, r3, #7 + 1f20008: e1833086 orr r3, r3, r6, lsl #1 + 1f2000c: e203301f and r3, r3, #31 + 1f20010: e7dc5005 ldrb r5, [ip, r5] + 1f20014: e7d23003 ldrb r3, [r2, r3] + 1f20018: e1836005 orr r6, r3, r5 + 1f2001c: e5c16002 strb r6, [r1, #2] + 1f20020: e35500ff cmp r5, #255 ; 0xff + 1f20024: 135300ff cmpne r3, #255 ; 0xff + 1f20028: 03a05001 moveq r5, #1 + 1f2002c: e5d03004 ldrb r3, [r0, #4] + 1f20030: 13a05000 movne r5, #0 + 1f20034: e11e0005 tst lr, r5 + 1f20038: e5d0e003 ldrb lr, [r0, #3] + 1f2003c: e203001f and r0, r3, #31 + 1f20040: e1a032c3 asr r3, r3, #5 + 1f20044: 13a04003 movne r4, #3 + 1f20048: e183318e orr r3, r3, lr, lsl #3 + 1f2004c: e203301f and r3, r3, #31 + 1f20050: e7dc0000 ldrb r0, [ip, r0] + 1f20054: e7d23003 ldrb r3, [r2, r3] + 1f20058: e35000ff cmp r0, #255 ; 0xff + 1f2005c: 135300ff cmpne r3, #255 ; 0xff + 1f20060: 1a000006 bne 1f20080 + 1f20064: e3540000 cmp r4, #0 + 1f20068: 12444001 subne r4, r4, #1 + 1f2006c: 0a000009 beq 1f20098 + 1f20070: e1833000 orr r3, r3, r0 + 1f20074: e1a00004 mov r0, r4 + 1f20078: e5c13003 strb r3, [r1, #3] + 1f2007c: e8bd8070 pop {r4, r5, r6, pc} + 1f20080: e3540000 cmp r4, #0 + 1f20084: e1830000 orr r0, r3, r0 + 1f20088: e5c10003 strb r0, [r1, #3] + 1f2008c: 12440001 subne r0, r4, #1 + 1f20090: 03a00004 moveq r0, #4 + 1f20094: e8bd8070 pop {r4, r5, r6, pc} + 1f20098: e3a04003 mov r4, #3 + 1f2009c: eafffff3 b 1f20070 + +01f200a0 : + 1f200a0: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f200a4: e1a05002 mov r5, r2 + 1f200a8: e1a04000 mov r4, r0 + 1f200ac: e24dd901 sub sp, sp, #16384 ; 0x4000 + 1f200b0: e1a00002 mov r0, r2 + 1f200b4: e24dd014 sub sp, sp, #20 + 1f200b8: e3a02f41 mov r2, #260 ; 0x104 + 1f200bc: e1a06001 mov r6, r1 + 1f200c0: e3a01001 mov r1, #1 + 1f200c4: e1a09003 mov r9, r3 + 1f200c8: eb007bd3 bl 1f3f01c + 1f200cc: e2853002 add r3, r5, #2 + 1f200d0: e3a0204b mov r2, #75 ; 0x4b + 1f200d4: e2033007 and r3, r3, #7 + 1f200d8: e5c52001 strb r2, [r5, #1] + 1f200dc: e2633000 rsb r3, r3, #0 + 1f200e0: e3a02007 mov r2, #7 + 1f200e4: e213300f ands r3, r3, #15 + 1f200e8: e5c52000 strb r2, [r5] + 1f200ec: 0a0001b5 beq 1f207c8 + 1f200f0: e3530001 cmp r3, #1 + 1f200f4: e5d51002 ldrb r1, [r5, #2] + 1f200f8: 0a0001ef beq 1f208bc + 1f200fc: e5d50003 ldrb r0, [r5, #3] + 1f20100: e3530002 cmp r3, #2 + 1f20104: e0211000 eor r1, r1, r0 + 1f20108: 0a0001f1 beq 1f208d4 + 1f2010c: e5d50004 ldrb r0, [r5, #4] + 1f20110: e3530003 cmp r3, #3 + 1f20114: e0211000 eor r1, r1, r0 + 1f20118: 0a0001ea beq 1f208c8 + 1f2011c: e5d50005 ldrb r0, [r5, #5] + 1f20120: e3530004 cmp r3, #4 + 1f20124: e0211000 eor r1, r1, r0 + 1f20128: 0a0001e0 beq 1f208b0 + 1f2012c: e5d50006 ldrb r0, [r5, #6] + 1f20130: e3530005 cmp r3, #5 + 1f20134: e0211000 eor r1, r1, r0 + 1f20138: 0a0001d3 beq 1f2088c + 1f2013c: e5d50007 ldrb r0, [r5, #7] + 1f20140: e3530006 cmp r3, #6 + 1f20144: e0211000 eor r1, r1, r0 + 1f20148: 0a0001d5 beq 1f208a4 + 1f2014c: e1530002 cmp r3, r2 + 1f20150: e5d52008 ldrb r2, [r5, #8] + 1f20154: e0211002 eor r1, r1, r2 + 1f20158: 0a0001ce beq 1f20898 + 1f2015c: e5d52009 ldrb r2, [r5, #9] + 1f20160: e3530008 cmp r3, #8 + 1f20164: e0211002 eor r1, r1, r2 + 1f20168: 0a0001e2 beq 1f208f8 + 1f2016c: e5d5200a ldrb r2, [r5, #10] + 1f20170: e3530009 cmp r3, #9 + 1f20174: e0211002 eor r1, r1, r2 + 1f20178: 0a0001db beq 1f208ec + 1f2017c: e5d5200b ldrb r2, [r5, #11] + 1f20180: e353000a cmp r3, #10 + 1f20184: e0211002 eor r1, r1, r2 + 1f20188: 0a0001d4 beq 1f208e0 + 1f2018c: e5d5200c ldrb r2, [r5, #12] + 1f20190: e353000b cmp r3, #11 + 1f20194: e0211002 eor r1, r1, r2 + 1f20198: 0a0001df beq 1f2091c + 1f2019c: e5d5200d ldrb r2, [r5, #13] + 1f201a0: e353000c cmp r3, #12 + 1f201a4: e0211002 eor r1, r1, r2 + 1f201a8: 0a0001d8 beq 1f20910 + 1f201ac: e5d5200e ldrb r2, [r5, #14] + 1f201b0: e353000d cmp r3, #13 + 1f201b4: e0211002 eor r1, r1, r2 + 1f201b8: 0a0001da beq 1f20928 + 1f201bc: e5d5200f ldrb r2, [r5, #15] + 1f201c0: e353000e cmp r3, #14 + 1f201c4: e0211002 eor r1, r1, r2 + 1f201c8: 0a0001cd beq 1f20904 + 1f201cc: e5d52010 ldrb r2, [r5, #16] + 1f201d0: e3a080f1 mov r8, #241 ; 0xf1 + 1f201d4: e3a0c010 mov ip, #16 + 1f201d8: e0211002 eor r1, r1, r2 + 1f201dc: e263ec01 rsb lr, r3, #256 ; 0x100 + 1f201e0: e3a000f0 mov r0, #240 ; 0xf0 + 1f201e4: e3a0700f mov r7, #15 + 1f201e8: e2832002 add r2, r3, #2 + 1f201ec: e357000f cmp r7, #15 + 1f201f0: e0852002 add r2, r5, r2 + 1f201f4: edd22b04 vldr d18, [r2, #16] + 1f201f8: edd23b06 vldr d19, [r2, #24] + 1f201fc: f4620adf vld1.64 {d16-d17}, [r2 :64] + 1f20200: edd24b08 vldr d20, [r2, #32] + 1f20204: edd25b0a vldr d21, [r2, #40] ; 0x28 + 1f20208: edd26b0c vldr d22, [r2, #48] ; 0x30 + 1f2020c: edd27b0e vldr d23, [r2, #56] ; 0x38 + 1f20210: f34001f2 veor q8, q8, q9 + 1f20214: edd22b10 vldr d18, [r2, #64] ; 0x40 + 1f20218: edd23b12 vldr d19, [r2, #72] ; 0x48 + 1f2021c: f34001f4 veor q8, q8, q10 + 1f20220: edd24b14 vldr d20, [r2, #80] ; 0x50 + 1f20224: edd25b16 vldr d21, [r2, #88] ; 0x58 + 1f20228: f34001f6 veor q8, q8, q11 + 1f2022c: edd26b18 vldr d22, [r2, #96] ; 0x60 + 1f20230: edd27b1a vldr d23, [r2, #104] ; 0x68 + 1f20234: f34001f2 veor q8, q8, q9 + 1f20238: edd22b1c vldr d18, [r2, #112] ; 0x70 + 1f2023c: edd23b1e vldr d19, [r2, #120] ; 0x78 + 1f20240: f34001f4 veor q8, q8, q10 + 1f20244: edd24b20 vldr d20, [r2, #128] ; 0x80 + 1f20248: edd25b22 vldr d21, [r2, #136] ; 0x88 + 1f2024c: f34001f6 veor q8, q8, q11 + 1f20250: edd26b24 vldr d22, [r2, #144] ; 0x90 + 1f20254: edd27b26 vldr d23, [r2, #152] ; 0x98 + 1f20258: f34001f2 veor q8, q8, q9 + 1f2025c: edd22b28 vldr d18, [r2, #160] ; 0xa0 + 1f20260: edd23b2a vldr d19, [r2, #168] ; 0xa8 + 1f20264: f34001f4 veor q8, q8, q10 + 1f20268: edd24b2c vldr d20, [r2, #176] ; 0xb0 + 1f2026c: edd25b2e vldr d21, [r2, #184] ; 0xb8 + 1f20270: f34001f6 veor q8, q8, q11 + 1f20274: edd26b30 vldr d22, [r2, #192] ; 0xc0 + 1f20278: edd27b32 vldr d23, [r2, #200] ; 0xc8 + 1f2027c: f34021f2 veor q9, q8, q9 + 1f20280: edd20b34 vldr d16, [r2, #208] ; 0xd0 + 1f20284: edd21b36 vldr d17, [r2, #216] ; 0xd8 + 1f20288: f34221f4 veor q9, q9, q10 + 1f2028c: edd24b38 vldr d20, [r2, #224] ; 0xe0 + 1f20290: edd25b3a vldr d21, [r2, #232] ; 0xe8 + 1f20294: f34221f6 veor q9, q9, q11 + 1f20298: f34201f0 veor q8, q9, q8 + 1f2029c: f34001f4 veor q8, q8, q10 + 1f202a0: 0a000002 beq 1f202b0 + 1f202a4: edd22b3c vldr d18, [r2, #240] ; 0xf0 + 1f202a8: edd23b3e vldr d19, [r2, #248] ; 0xf8 + 1f202ac: f34001f2 veor q8, q8, q9 + 1f202b0: f2c02050 vmov.i32 q9, #0 ; 0x00000000 + 1f202b4: e150000e cmp r0, lr + 1f202b8: e080200c add r2, r0, ip + 1f202bc: e0600008 rsb r0, r0, r8 + 1f202c0: f2f048e2 vext.8 q10, q8, q9, #8 + 1f202c4: f34001f4 veor q8, q8, q10 + 1f202c8: f2f044e2 vext.8 q10, q8, q9, #4 + 1f202cc: f34001f4 veor q8, q8, q10 + 1f202d0: f2f042e2 vext.8 q10, q8, q9, #2 + 1f202d4: f34001f4 veor q8, q8, q10 + 1f202d8: f2f021e2 vext.8 q9, q8, q9, #1 + 1f202dc: f34001f2 veor q8, q8, q9 + 1f202e0: eed03b90 vmov.u8 r3, d16[0] + 1f202e4: e0233001 eor r3, r3, r1 + 1f202e8: e6ef3073 uxtb r3, r3 + 1f202ec: 0a000055 beq 1f20448 + 1f202f0: e085c002 add ip, r5, r2 + 1f202f4: e3500001 cmp r0, #1 + 1f202f8: e2821001 add r1, r2, #1 + 1f202fc: e5dcc001 ldrb ip, [ip, #1] + 1f20300: e023300c eor r3, r3, ip + 1f20304: 0a00004f beq 1f20448 + 1f20308: e0851001 add r1, r5, r1 + 1f2030c: e3500002 cmp r0, #2 + 1f20310: e282c002 add ip, r2, #2 + 1f20314: e5d11001 ldrb r1, [r1, #1] + 1f20318: e0233001 eor r3, r3, r1 + 1f2031c: 0a000049 beq 1f20448 + 1f20320: e085c00c add ip, r5, ip + 1f20324: e3500003 cmp r0, #3 + 1f20328: e2821003 add r1, r2, #3 + 1f2032c: e5dcc001 ldrb ip, [ip, #1] + 1f20330: e023300c eor r3, r3, ip + 1f20334: 0a000043 beq 1f20448 + 1f20338: e0851001 add r1, r5, r1 + 1f2033c: e3500004 cmp r0, #4 + 1f20340: e282c004 add ip, r2, #4 + 1f20344: e5d11001 ldrb r1, [r1, #1] + 1f20348: e0233001 eor r3, r3, r1 + 1f2034c: 0a00003d beq 1f20448 + 1f20350: e085c00c add ip, r5, ip + 1f20354: e3500005 cmp r0, #5 + 1f20358: e2821005 add r1, r2, #5 + 1f2035c: e5dcc001 ldrb ip, [ip, #1] + 1f20360: e023300c eor r3, r3, ip + 1f20364: 0a000037 beq 1f20448 + 1f20368: e0851001 add r1, r5, r1 + 1f2036c: e3500006 cmp r0, #6 + 1f20370: e282c006 add ip, r2, #6 + 1f20374: e5d11001 ldrb r1, [r1, #1] + 1f20378: e0233001 eor r3, r3, r1 + 1f2037c: 0a000031 beq 1f20448 + 1f20380: e085c00c add ip, r5, ip + 1f20384: e3500007 cmp r0, #7 + 1f20388: e2821007 add r1, r2, #7 + 1f2038c: e5dcc001 ldrb ip, [ip, #1] + 1f20390: e023300c eor r3, r3, ip + 1f20394: 0a00002b beq 1f20448 + 1f20398: e0851001 add r1, r5, r1 + 1f2039c: e3500008 cmp r0, #8 + 1f203a0: e282c008 add ip, r2, #8 + 1f203a4: e5d11001 ldrb r1, [r1, #1] + 1f203a8: e0233001 eor r3, r3, r1 + 1f203ac: 0a000025 beq 1f20448 + 1f203b0: e085c00c add ip, r5, ip + 1f203b4: e3500009 cmp r0, #9 + 1f203b8: e2821009 add r1, r2, #9 + 1f203bc: e5dcc001 ldrb ip, [ip, #1] + 1f203c0: e023300c eor r3, r3, ip + 1f203c4: 0a00001f beq 1f20448 + 1f203c8: e0851001 add r1, r5, r1 + 1f203cc: e350000a cmp r0, #10 + 1f203d0: e282c00a add ip, r2, #10 + 1f203d4: e5d11001 ldrb r1, [r1, #1] + 1f203d8: e0233001 eor r3, r3, r1 + 1f203dc: 0a000019 beq 1f20448 + 1f203e0: e085c00c add ip, r5, ip + 1f203e4: e350000b cmp r0, #11 + 1f203e8: e282100b add r1, r2, #11 + 1f203ec: e5dcc001 ldrb ip, [ip, #1] + 1f203f0: e023300c eor r3, r3, ip + 1f203f4: 0a000013 beq 1f20448 + 1f203f8: e0851001 add r1, r5, r1 + 1f203fc: e350000c cmp r0, #12 + 1f20400: e282c00c add ip, r2, #12 + 1f20404: e5d11001 ldrb r1, [r1, #1] + 1f20408: e0233001 eor r3, r3, r1 + 1f2040c: 0a00000d beq 1f20448 + 1f20410: e085c00c add ip, r5, ip + 1f20414: e350000d cmp r0, #13 + 1f20418: e282100d add r1, r2, #13 + 1f2041c: e5dcc001 ldrb ip, [ip, #1] + 1f20420: e023300c eor r3, r3, ip + 1f20424: 0a000007 beq 1f20448 + 1f20428: e350000e cmp r0, #14 + 1f2042c: e282200e add r2, r2, #14 + 1f20430: e0851001 add r1, r5, r1 + 1f20434: 10852002 addne r2, r5, r2 + 1f20438: e5d11001 ldrb r1, [r1, #1] + 1f2043c: 15d22001 ldrbne r2, [r2, #1] + 1f20440: e0233001 eor r3, r3, r1 + 1f20444: 10233002 eorne r3, r3, r2 + 1f20448: e0647006 rsb r7, r4, r6 + 1f2044c: e28d6010 add r6, sp, #16 + 1f20450: e5c53101 strb r3, [r5, #257] ; 0x101 + 1f20454: e1a01004 mov r1, r4 + 1f20458: e1a02007 mov r2, r7 + 1f2045c: e1a00006 mov r0, r6 + 1f20460: eb007a66 bl 1f3ee00 + 1f20464: e1a02007 mov r2, r7 + 1f20468: e1a01004 mov r1, r4 + 1f2046c: e0860007 add r0, r6, r7 + 1f20470: e0864087 add r4, r6, r7, lsl #1 + 1f20474: eb007a61 bl 1f3ee00 + 1f20478: e1540006 cmp r4, r6 + 1f2047c: 81a03006 movhi r3, r6 + 1f20480: 83a02000 movhi r2, #0 + 1f20484: 8a000005 bhi 1f204a0 + 1f20488: ea00000e b 1f204c8 + 1f2048c: e3520001 cmp r2, #1 + 1f20490: c3a02003 movgt r2, #3 + 1f20494: d3a02000 movle r2, #0 + 1f20498: e1530004 cmp r3, r4 + 1f2049c: 0a000006 beq 1f204bc + 1f204a0: e4d31001 ldrb r1, [r3], #1 + 1f204a4: e35100ff cmp r1, #255 ; 0xff + 1f204a8: 1afffff7 bne 1f2048c + 1f204ac: e3520001 cmp r2, #1 + 1f204b0: d2822001 addle r2, r2, #1 + 1f204b4: e1530004 cmp r3, r4 + 1f204b8: 1afffff8 bne 1f204a0 + 1f204bc: e3520003 cmp r2, #3 + 1f204c0: 01a0c006 moveq ip, r6 + 1f204c4: 0a000014 beq 1f2051c + 1f204c8: e3a00003 mov r0, #3 + 1f204cc: e28dd901 add sp, sp, #16384 ; 0x4000 + 1f204d0: e28dd014 add sp, sp, #20 + 1f204d4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f204d8: e5d32000 ldrb r2, [r3] + 1f204dc: e35200ff cmp r2, #255 ; 0xff + 1f204e0: 1a00000f bne 1f20524 + 1f204e4: e2811002 add r1, r1, #2 + 1f204e8: ea000000 b 1f204f0 + 1f204ec: e1a01002 mov r1, r2 + 1f204f0: e1540001 cmp r4, r1 + 1f204f4: e1a03001 mov r3, r1 + 1f204f8: e2812001 add r2, r1, #1 + 1f204fc: 9a000012 bls 1f2054c + 1f20500: e5d10000 ldrb r0, [r1] + 1f20504: e35000ff cmp r0, #255 ; 0xff + 1f20508: 0afffff7 beq 1f204ec + 1f2050c: e06c3001 rsb r3, ip, r1 + 1f20510: e3530c15 cmp r3, #5376 ; 0x1500 + 1f20514: caffffeb bgt 1f204c8 + 1f20518: e1a0c001 mov ip, r1 + 1f2051c: e1a0100c mov r1, ip + 1f20520: ea000000 b 1f20528 + 1f20524: e1a01003 mov r1, r3 + 1f20528: e2813001 add r3, r1, #1 + 1f2052c: e1540003 cmp r4, r3 + 1f20530: 9a000004 bls 1f20548 + 1f20534: e5532001 ldrb r2, [r3, #-1] + 1f20538: e2022003 and r2, r2, #3 + 1f2053c: e3520003 cmp r2, #3 + 1f20540: 1afffff7 bne 1f20524 + 1f20544: eaffffe3 b 1f204d8 + 1f20548: e1a03004 mov r3, r4 + 1f2054c: e06c3003 rsb r3, ip, r3 + 1f20550: e3530c15 cmp r3, #5376 ; 0x1500 + 1f20554: d1a01006 movle r1, r6 + 1f20558: d244a00a suble sl, r4, #10 + 1f2055c: d246800c suble r8, r6, #12 + 1f20560: d2467008 suble r7, r6, #8 + 1f20564: caffffd7 bgt 1f204c8 + 1f20568: ea000004 b 1f20580 + 1f2056c: e5d32000 ldrb r2, [r3] + 1f20570: e35200ff cmp r2, #255 ; 0xff + 1f20574: 02811002 addeq r1, r1, #2 + 1f20578: 0a00000b beq 1f205ac + 1f2057c: e1a01003 mov r1, r3 + 1f20580: e2813001 add r3, r1, #1 + 1f20584: e1540003 cmp r4, r3 + 1f20588: 9a00000b bls 1f205bc + 1f2058c: e5532001 ldrb r2, [r3, #-1] + 1f20590: e2022003 and r2, r2, #3 + 1f20594: e3520003 cmp r2, #3 + 1f20598: 1afffff7 bne 1f2057c + 1f2059c: eafffff2 b 1f2056c + 1f205a0: e5db3000 ldrb r3, [fp] + 1f205a4: e35300ff cmp r3, #255 ; 0xff + 1f205a8: 1a000020 bne 1f20630 + 1f205ac: e1540001 cmp r4, r1 + 1f205b0: e1a0b001 mov fp, r1 + 1f205b4: e2811001 add r1, r1, #1 + 1f205b8: 8afffff8 bhi 1f205a0 + 1f205bc: e1a01006 mov r1, r6 + 1f205c0: e244a00a sub sl, r4, #10 + 1f205c4: e246800c sub r8, r6, #12 + 1f205c8: e2467008 sub r7, r6, #8 + 1f205cc: ea000000 b 1f205d4 + 1f205d0: e1a01003 mov r1, r3 + 1f205d4: e2813001 add r3, r1, #1 + 1f205d8: e1540003 cmp r4, r3 + 1f205dc: 9a00000f bls 1f20620 + 1f205e0: e5532001 ldrb r2, [r3, #-1] + 1f205e4: e2022003 and r2, r2, #3 + 1f205e8: e3520003 cmp r2, #3 + 1f205ec: 1afffff7 bne 1f205d0 + 1f205f0: e5d32000 ldrb r2, [r3] + 1f205f4: e35200ff cmp r2, #255 ; 0xff + 1f205f8: 02811002 addeq r1, r1, #2 + 1f205fc: 1afffff3 bne 1f205d0 + 1f20600: ea000002 b 1f20610 + 1f20604: e5db3000 ldrb r3, [fp] + 1f20608: e35300ff cmp r3, #255 ; 0xff + 1f2060c: 1a00002b bne 1f206c0 + 1f20610: e1540001 cmp r4, r1 + 1f20614: e1a0b001 mov fp, r1 + 1f20618: e2811001 add r1, r1, #1 + 1f2061c: 8afffff8 bhi 1f20604 + 1f20620: e3a00002 mov r0, #2 + 1f20624: e28dd901 add sp, sp, #16384 ; 0x4000 + 1f20628: e28dd014 add sp, sp, #20 + 1f2062c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f20630: e15b000a cmp fp, sl + 1f20634: 2affffe0 bcs 1f205bc + 1f20638: e1a01008 mov r1, r8 + 1f2063c: e1a0000b mov r0, fp + 1f20640: ebfffe47 bl 1f1ff64 + 1f20644: e1a01007 mov r1, r7 + 1f20648: e28b0005 add r0, fp, #5 + 1f2064c: ebfffe44 bl 1f1ff64 + 1f20650: e556300c ldrb r3, [r6, #-12] + 1f20654: e28b1001 add r1, fp, #1 + 1f20658: e3530008 cmp r3, #8 + 1f2065c: 1affffc7 bne 1f20580 + 1f20660: e28d2901 add r2, sp, #16384 ; 0x4000 + 1f20664: e556300a ldrb r3, [r6, #-10] + 1f20668: e2822038 add r2, r2, #56 ; 0x38 + 1f2066c: e5922000 ldr r2, [r2] + 1f20670: e1530002 cmp r3, r2 + 1f20674: 1affffc1 bne 1f20580 + 1f20678: e5563009 ldrb r3, [r6, #-9] + 1f2067c: e1530009 cmp r3, r9 + 1f20680: 1affffbe bne 1f20580 + 1f20684: e28d2901 add r2, sp, #16384 ; 0x4000 + 1f20688: e5563007 ldrb r3, [r6, #-7] + 1f2068c: e282203c add r2, r2, #60 ; 0x3c + 1f20690: e5922000 ldr r2, [r2] + 1f20694: e5d22000 ldrb r2, [r2] + 1f20698: e1520003 cmp r2, r3 + 1f2069c: 1affffb7 bne 1f20580 + 1f206a0: e28d2901 add r2, sp, #16384 ; 0x4000 + 1f206a4: e5560008 ldrb r0, [r6, #-8] + 1f206a8: e282203c add r2, r2, #60 ; 0x3c + 1f206ac: e5922000 ldr r2, [r2] + 1f206b0: e5d22001 ldrb r2, [r2, #1] + 1f206b4: e1500002 cmp r0, r2 + 1f206b8: 1affffb0 bne 1f20580 + 1f206bc: ea000017 b 1f20720 + 1f206c0: e15b000a cmp fp, sl + 1f206c4: 2affffd5 bcs 1f20620 + 1f206c8: e1a01008 mov r1, r8 + 1f206cc: e1a0000b mov r0, fp + 1f206d0: ebfffe23 bl 1f1ff64 + 1f206d4: e1a01007 mov r1, r7 + 1f206d8: e28b0005 add r0, fp, #5 + 1f206dc: ebfffe20 bl 1f1ff64 + 1f206e0: e556300c ldrb r3, [r6, #-12] + 1f206e4: e28b1001 add r1, fp, #1 + 1f206e8: e3530007 cmp r3, #7 + 1f206ec: 0affffb8 beq 1f205d4 + 1f206f0: e28d0901 add r0, sp, #16384 ; 0x4000 + 1f206f4: e556200a ldrb r2, [r6, #-10] + 1f206f8: e2800038 add r0, r0, #56 ; 0x38 + 1f206fc: e5900000 ldr r0, [r0] + 1f20700: e1500002 cmp r0, r2 + 1f20704: 1affffb2 bne 1f205d4 + 1f20708: e5562009 ldrb r2, [r6, #-9] + 1f2070c: e1590002 cmp r9, r2 + 1f20710: 1affffaf bne 1f205d4 + 1f20714: e3530008 cmp r3, #8 + 1f20718: e5563007 ldrb r3, [r6, #-7] + 1f2071c: 1a000084 bne 1f20934 + 1f20720: e3a07001 mov r7, #1 + 1f20724: e556200a ldrb r2, [r6, #-10] + 1f20728: e556c00b ldrb ip, [r6, #-11] + 1f2072c: e5560009 ldrb r0, [r6, #-9] + 1f20730: e02cc002 eor ip, ip, r2 + 1f20734: e5562008 ldrb r2, [r6, #-8] + 1f20738: e020000c eor r0, r0, ip + 1f2073c: e0222000 eor r2, r2, r0 + 1f20740: e1520003 cmp r2, r3 + 1f20744: 0a000002 beq 1f20754 + 1f20748: e3570001 cmp r7, #1 + 1f2074c: 13a07002 movne r7, #2 + 1f20750: 03a07009 moveq r7, #9 + 1f20754: e241c002 sub ip, r1, #2 + 1f20758: e3a00000 mov r0, #0 + 1f2075c: e3500000 cmp r0, #0 + 1f20760: 05d13008 ldrbeq r3, [r1, #8] + 1f20764: 15dc3000 ldrbne r3, [ip] + 1f20768: e1a02403 lsl r2, r3, #8 + 1f2076c: e5fc3001 ldrb r3, [ip, #1]! + 1f20770: e2022c03 and r2, r2, #768 ; 0x300 + 1f20774: e1823003 orr r3, r2, r3 + 1f20778: e3130d0e tst r3, #896 ; 0x380 + 1f2077c: 0a000024 beq 1f20814 + 1f20780: e3130d07 tst r3, #448 ; 0x1c0 + 1f20784: 0a000022 beq 1f20814 + 1f20788: e31300e0 tst r3, #224 ; 0xe0 + 1f2078c: 0a000020 beq 1f20814 + 1f20790: e3130070 tst r3, #112 ; 0x70 + 1f20794: 0a00001e beq 1f20814 + 1f20798: e3130038 tst r3, #56 ; 0x38 + 1f2079c: 0a00001c beq 1f20814 + 1f207a0: e313001c tst r3, #28 + 1f207a4: 0a00001a beq 1f20814 + 1f207a8: e313000e tst r3, #14 + 1f207ac: 0a000018 beq 1f20814 + 1f207b0: e3130007 tst r3, #7 + 1f207b4: 0a000016 beq 1f20814 + 1f207b8: e2800001 add r0, r0, #1 + 1f207bc: e350000a cmp r0, #10 + 1f207c0: 1affffe5 bne 1f2075c + 1f207c4: ea00000a b 1f207f4 + 1f207c8: e3a00c01 mov r0, #256 ; 0x100 + 1f207cc: e3a07010 mov r7, #16 + 1f207d0: e1a0e000 mov lr, r0 + 1f207d4: e1a08000 mov r8, r0 + 1f207d8: e1a01003 mov r1, r3 + 1f207dc: e3a0c001 mov ip, #1 + 1f207e0: eafffe80 b 1f201e8 + 1f207e4: e5d32000 ldrb r2, [r3] + 1f207e8: e35200ff cmp r2, #255 ; 0xff + 1f207ec: 0a00001c beq 1f20864 + 1f207f0: e1a01003 mov r1, r3 + 1f207f4: e2813001 add r3, r1, #1 + 1f207f8: e1540003 cmp r4, r3 + 1f207fc: 9a000016 bls 1f2085c + 1f20800: e5532001 ldrb r2, [r3, #-1] + 1f20804: e2022003 and r2, r2, #3 + 1f20808: e3520003 cmp r2, #3 + 1f2080c: 1afffff7 bne 1f207f0 + 1f20810: eafffff3 b 1f207e4 + 1f20814: e3570001 cmp r7, #1 + 1f20818: 03a07006 moveq r7, #6 + 1f2081c: eaffffe5 b 1f207b8 + 1f20820: e288bf51 add fp, r8, #324 ; 0x144 + 1f20824: e2444005 sub r4, r4, #5 + 1f20828: e28bb001 add fp, fp, #1 + 1f2082c: e1a09008 mov r9, r8 + 1f20830: e1a0a005 mov sl, r5 + 1f20834: ea000002 b 1f20844 + 1f20838: ebfffdc9 bl 1f1ff64 + 1f2083c: e159000b cmp r9, fp + 1f20840: 0a00003d beq 1f2093c + 1f20844: e1540009 cmp r4, r9 + 1f20848: e1a0100a mov r1, sl + 1f2084c: e1a00009 mov r0, r9 + 1f20850: e28aa004 add sl, sl, #4 + 1f20854: e2899005 add r9, r9, #5 + 1f20858: 8afffff6 bhi 1f20838 + 1f2085c: e3a00004 mov r0, #4 + 1f20860: eaffff19 b 1f204cc + 1f20864: e2811002 add r1, r1, #2 + 1f20868: ea000002 b 1f20878 + 1f2086c: e5d83000 ldrb r3, [r8] + 1f20870: e35300ff cmp r3, #255 ; 0xff + 1f20874: 1affffe9 bne 1f20820 + 1f20878: e1540001 cmp r4, r1 + 1f2087c: e1a08001 mov r8, r1 + 1f20880: e2811001 add r1, r1, #1 + 1f20884: 8afffff8 bhi 1f2086c + 1f20888: eafffff3 b 1f2085c + 1f2088c: e3a080fb mov r8, #251 ; 0xfb + 1f20890: e3a0c006 mov ip, #6 + 1f20894: eafffe50 b 1f201dc + 1f20898: e3a080f9 mov r8, #249 ; 0xf9 + 1f2089c: e3a0c008 mov ip, #8 + 1f208a0: eafffe4d b 1f201dc + 1f208a4: e1a0c002 mov ip, r2 + 1f208a8: e3a080fa mov r8, #250 ; 0xfa + 1f208ac: eafffe4a b 1f201dc + 1f208b0: e3a080fc mov r8, #252 ; 0xfc + 1f208b4: e3a0c005 mov ip, #5 + 1f208b8: eafffe47 b 1f201dc + 1f208bc: e3a080ff mov r8, #255 ; 0xff + 1f208c0: e3a0c002 mov ip, #2 + 1f208c4: eafffe44 b 1f201dc + 1f208c8: e3a080fd mov r8, #253 ; 0xfd + 1f208cc: e3a0c004 mov ip, #4 + 1f208d0: eafffe41 b 1f201dc + 1f208d4: e3a080fe mov r8, #254 ; 0xfe + 1f208d8: e3a0c003 mov ip, #3 + 1f208dc: eafffe3e b 1f201dc + 1f208e0: e3a080f6 mov r8, #246 ; 0xf6 + 1f208e4: e3a0c00b mov ip, #11 + 1f208e8: eafffe3b b 1f201dc + 1f208ec: e3a080f7 mov r8, #247 ; 0xf7 + 1f208f0: e3a0c00a mov ip, #10 + 1f208f4: eafffe38 b 1f201dc + 1f208f8: e3a080f8 mov r8, #248 ; 0xf8 + 1f208fc: e3a0c009 mov ip, #9 + 1f20900: eafffe35 b 1f201dc + 1f20904: e3a080f2 mov r8, #242 ; 0xf2 + 1f20908: e3a0c00f mov ip, #15 + 1f2090c: eafffe32 b 1f201dc + 1f20910: e3a080f4 mov r8, #244 ; 0xf4 + 1f20914: e3a0c00d mov ip, #13 + 1f20918: eafffe2f b 1f201dc + 1f2091c: e3a080f5 mov r8, #245 ; 0xf5 + 1f20920: e3a0c00c mov ip, #12 + 1f20924: eafffe2c b 1f201dc + 1f20928: e3a080f3 mov r8, #243 ; 0xf3 + 1f2092c: e3a0c00e mov ip, #14 + 1f20930: eafffe29 b 1f201dc + 1f20934: e3a07002 mov r7, #2 + 1f20938: eaffff79 b 1f20724 + 1f2093c: e28d3901 add r3, sp, #16384 ; 0x4000 + 1f20940: e5562007 ldrb r2, [r6, #-7] + 1f20944: e283303c add r3, r3, #60 ; 0x3c + 1f20948: e5933000 ldr r3, [r3] + 1f2094c: e5d33000 ldrb r3, [r3] + 1f20950: e1520003 cmp r2, r3 + 1f20954: 0a000128 beq 1f20dfc + 1f20958: e3570001 cmp r7, #1 + 1f2095c: e3a0e001 mov lr, #1 + 1f20960: 03a0700b moveq r7, #11 + 1f20964: e2853001 add r3, r5, #1 + 1f20968: e2033007 and r3, r3, #7 + 1f2096c: e2633000 rsb r3, r3, #0 + 1f20970: e213300f ands r3, r3, #15 + 1f20974: 0a000119 beq 1f20de0 + 1f20978: e3530001 cmp r3, #1 + 1f2097c: e5d5c001 ldrb ip, [r5, #1] + 1f20980: 0a000113 beq 1f20dd4 + 1f20984: e5d52002 ldrb r2, [r5, #2] + 1f20988: e3530002 cmp r3, #2 + 1f2098c: e02cc002 eor ip, ip, r2 + 1f20990: 0a00010c beq 1f20dc8 + 1f20994: e5d52003 ldrb r2, [r5, #3] + 1f20998: e3530003 cmp r3, #3 + 1f2099c: e02cc002 eor ip, ip, r2 + 1f209a0: 0a000105 beq 1f20dbc + 1f209a4: e5d52004 ldrb r2, [r5, #4] + 1f209a8: e3530004 cmp r3, #4 + 1f209ac: e02cc002 eor ip, ip, r2 + 1f209b0: 0a0000fe beq 1f20db0 + 1f209b4: e5d52005 ldrb r2, [r5, #5] + 1f209b8: e3530005 cmp r3, #5 + 1f209bc: e02cc002 eor ip, ip, r2 + 1f209c0: 0a0000f7 beq 1f20da4 + 1f209c4: e5d52006 ldrb r2, [r5, #6] + 1f209c8: e3530006 cmp r3, #6 + 1f209cc: e02cc002 eor ip, ip, r2 + 1f209d0: 0a0000f0 beq 1f20d98 + 1f209d4: e5d52007 ldrb r2, [r5, #7] + 1f209d8: e3530007 cmp r3, #7 + 1f209dc: e02cc002 eor ip, ip, r2 + 1f209e0: 0a0000e9 beq 1f20d8c + 1f209e4: e5d52008 ldrb r2, [r5, #8] + 1f209e8: e3530008 cmp r3, #8 + 1f209ec: e02cc002 eor ip, ip, r2 + 1f209f0: 0a0000e2 beq 1f20d80 + 1f209f4: e5d52009 ldrb r2, [r5, #9] + 1f209f8: e3530009 cmp r3, #9 + 1f209fc: e02cc002 eor ip, ip, r2 + 1f20a00: 0a0000db beq 1f20d74 + 1f20a04: e5d5200a ldrb r2, [r5, #10] + 1f20a08: e353000a cmp r3, #10 + 1f20a0c: e02cc002 eor ip, ip, r2 + 1f20a10: 0a0000d4 beq 1f20d68 + 1f20a14: e5d5200b ldrb r2, [r5, #11] + 1f20a18: e353000b cmp r3, #11 + 1f20a1c: e02cc002 eor ip, ip, r2 + 1f20a20: 0a0000cd beq 1f20d5c + 1f20a24: e5d5200c ldrb r2, [r5, #12] + 1f20a28: e353000c cmp r3, #12 + 1f20a2c: e02cc002 eor ip, ip, r2 + 1f20a30: 0a0000c6 beq 1f20d50 + 1f20a34: e5d5200d ldrb r2, [r5, #13] + 1f20a38: e353000d cmp r3, #13 + 1f20a3c: e02cc002 eor ip, ip, r2 + 1f20a40: 0a0000bf beq 1f20d44 + 1f20a44: e5d5200e ldrb r2, [r5, #14] + 1f20a48: e353000e cmp r3, #14 + 1f20a4c: e02cc002 eor ip, ip, r2 + 1f20a50: 0a0000b8 beq 1f20d38 + 1f20a54: e5d5000f ldrb r0, [r5, #15] + 1f20a58: e3a010f1 mov r1, #241 ; 0xf1 + 1f20a5c: e3a02010 mov r2, #16 + 1f20a60: e02cc000 eor ip, ip, r0 + 1f20a64: e2634c01 rsb r4, r3, #256 ; 0x100 + 1f20a68: e3a0600f mov r6, #15 + 1f20a6c: e3a000f0 mov r0, #240 ; 0xf0 + 1f20a70: e2833001 add r3, r3, #1 + 1f20a74: e356000f cmp r6, #15 + 1f20a78: e0853003 add r3, r5, r3 + 1f20a7c: edd32b04 vldr d18, [r3, #16] + 1f20a80: edd33b06 vldr d19, [r3, #24] + 1f20a84: f4630adf vld1.64 {d16-d17}, [r3 :64] + 1f20a88: edd34b08 vldr d20, [r3, #32] + 1f20a8c: edd35b0a vldr d21, [r3, #40] ; 0x28 + 1f20a90: edd36b0c vldr d22, [r3, #48] ; 0x30 + 1f20a94: edd37b0e vldr d23, [r3, #56] ; 0x38 + 1f20a98: f34001f2 veor q8, q8, q9 + 1f20a9c: edd32b10 vldr d18, [r3, #64] ; 0x40 + 1f20aa0: edd33b12 vldr d19, [r3, #72] ; 0x48 + 1f20aa4: f34001f4 veor q8, q8, q10 + 1f20aa8: edd34b14 vldr d20, [r3, #80] ; 0x50 + 1f20aac: edd35b16 vldr d21, [r3, #88] ; 0x58 + 1f20ab0: f34001f6 veor q8, q8, q11 + 1f20ab4: edd36b18 vldr d22, [r3, #96] ; 0x60 + 1f20ab8: edd37b1a vldr d23, [r3, #104] ; 0x68 + 1f20abc: f34001f2 veor q8, q8, q9 + 1f20ac0: edd32b1c vldr d18, [r3, #112] ; 0x70 + 1f20ac4: edd33b1e vldr d19, [r3, #120] ; 0x78 + 1f20ac8: f34001f4 veor q8, q8, q10 + 1f20acc: edd34b20 vldr d20, [r3, #128] ; 0x80 + 1f20ad0: edd35b22 vldr d21, [r3, #136] ; 0x88 + 1f20ad4: f34001f6 veor q8, q8, q11 + 1f20ad8: edd36b24 vldr d22, [r3, #144] ; 0x90 + 1f20adc: edd37b26 vldr d23, [r3, #152] ; 0x98 + 1f20ae0: f34001f2 veor q8, q8, q9 + 1f20ae4: edd32b28 vldr d18, [r3, #160] ; 0xa0 + 1f20ae8: edd33b2a vldr d19, [r3, #168] ; 0xa8 + 1f20aec: f34001f4 veor q8, q8, q10 + 1f20af0: edd34b2c vldr d20, [r3, #176] ; 0xb0 + 1f20af4: edd35b2e vldr d21, [r3, #184] ; 0xb8 + 1f20af8: f34001f6 veor q8, q8, q11 + 1f20afc: edd36b30 vldr d22, [r3, #192] ; 0xc0 + 1f20b00: edd37b32 vldr d23, [r3, #200] ; 0xc8 + 1f20b04: f34021f2 veor q9, q8, q9 + 1f20b08: edd30b34 vldr d16, [r3, #208] ; 0xd0 + 1f20b0c: edd31b36 vldr d17, [r3, #216] ; 0xd8 + 1f20b10: f34221f4 veor q9, q9, q10 + 1f20b14: edd34b38 vldr d20, [r3, #224] ; 0xe0 + 1f20b18: edd35b3a vldr d21, [r3, #232] ; 0xe8 + 1f20b1c: f34221f6 veor q9, q9, q11 + 1f20b20: f34201f0 veor q8, q9, q8 + 1f20b24: f34001f4 veor q8, q8, q10 + 1f20b28: 0a000002 beq 1f20b38 + 1f20b2c: edd32b3c vldr d18, [r3, #240] ; 0xf0 + 1f20b30: edd33b3e vldr d19, [r3, #248] ; 0xf8 + 1f20b34: f34001f2 veor q8, q8, q9 + 1f20b38: f2c02050 vmov.i32 q9, #0 ; 0x00000000 + 1f20b3c: e0803002 add r3, r0, r2 + 1f20b40: e0602001 rsb r2, r0, r1 + 1f20b44: e1500004 cmp r0, r4 + 1f20b48: f2f048e2 vext.8 q10, q8, q9, #8 + 1f20b4c: f34401f0 veor q8, q10, q8 + 1f20b50: f2f044e2 vext.8 q10, q8, q9, #4 + 1f20b54: f34441f0 veor q10, q10, q8 + 1f20b58: f2f402e2 vext.8 q8, q10, q9, #2 + 1f20b5c: f34001f4 veor q8, q8, q10 + 1f20b60: f2f021e2 vext.8 q9, q8, q9, #1 + 1f20b64: f34201f0 veor q8, q9, q8 + 1f20b68: eed01b90 vmov.u8 r1, d16[0] + 1f20b6c: e02cc001 eor ip, ip, r1 + 1f20b70: e6efc07c uxtb ip, ip + 1f20b74: 0a000046 beq 1f20c94 + 1f20b78: e7d50003 ldrb r0, [r5, r3] + 1f20b7c: e3520001 cmp r2, #1 + 1f20b80: e2831001 add r1, r3, #1 + 1f20b84: e02cc000 eor ip, ip, r0 + 1f20b88: 0a000041 beq 1f20c94 + 1f20b8c: e7d50001 ldrb r0, [r5, r1] + 1f20b90: e3520002 cmp r2, #2 + 1f20b94: e2831002 add r1, r3, #2 + 1f20b98: e02cc000 eor ip, ip, r0 + 1f20b9c: 0a00003c beq 1f20c94 + 1f20ba0: e7d50001 ldrb r0, [r5, r1] + 1f20ba4: e3520003 cmp r2, #3 + 1f20ba8: e2831003 add r1, r3, #3 + 1f20bac: e02cc000 eor ip, ip, r0 + 1f20bb0: 0a000037 beq 1f20c94 + 1f20bb4: e7d50001 ldrb r0, [r5, r1] + 1f20bb8: e3520004 cmp r2, #4 + 1f20bbc: e2831004 add r1, r3, #4 + 1f20bc0: e02cc000 eor ip, ip, r0 + 1f20bc4: 0a000032 beq 1f20c94 + 1f20bc8: e7d50001 ldrb r0, [r5, r1] + 1f20bcc: e3520005 cmp r2, #5 + 1f20bd0: e2831005 add r1, r3, #5 + 1f20bd4: e02cc000 eor ip, ip, r0 + 1f20bd8: 0a00002d beq 1f20c94 + 1f20bdc: e7d50001 ldrb r0, [r5, r1] + 1f20be0: e3520006 cmp r2, #6 + 1f20be4: e2831006 add r1, r3, #6 + 1f20be8: e02cc000 eor ip, ip, r0 + 1f20bec: 0a000028 beq 1f20c94 + 1f20bf0: e7d50001 ldrb r0, [r5, r1] + 1f20bf4: e3520007 cmp r2, #7 + 1f20bf8: e2831007 add r1, r3, #7 + 1f20bfc: e02cc000 eor ip, ip, r0 + 1f20c00: 0a000023 beq 1f20c94 + 1f20c04: e7d50001 ldrb r0, [r5, r1] + 1f20c08: e3520008 cmp r2, #8 + 1f20c0c: e2831008 add r1, r3, #8 + 1f20c10: e02cc000 eor ip, ip, r0 + 1f20c14: 0a00001e beq 1f20c94 + 1f20c18: e7d50001 ldrb r0, [r5, r1] + 1f20c1c: e3520009 cmp r2, #9 + 1f20c20: e2831009 add r1, r3, #9 + 1f20c24: e02cc000 eor ip, ip, r0 + 1f20c28: 0a000019 beq 1f20c94 + 1f20c2c: e7d50001 ldrb r0, [r5, r1] + 1f20c30: e352000a cmp r2, #10 + 1f20c34: e283100a add r1, r3, #10 + 1f20c38: e02cc000 eor ip, ip, r0 + 1f20c3c: 0a000014 beq 1f20c94 + 1f20c40: e7d50001 ldrb r0, [r5, r1] + 1f20c44: e352000b cmp r2, #11 + 1f20c48: e283100b add r1, r3, #11 + 1f20c4c: e02cc000 eor ip, ip, r0 + 1f20c50: 0a00000f beq 1f20c94 + 1f20c54: e7d50001 ldrb r0, [r5, r1] + 1f20c58: e352000c cmp r2, #12 + 1f20c5c: e283100c add r1, r3, #12 + 1f20c60: e02cc000 eor ip, ip, r0 + 1f20c64: 0a00000a beq 1f20c94 + 1f20c68: e7d50001 ldrb r0, [r5, r1] + 1f20c6c: e352000d cmp r2, #13 + 1f20c70: e283100d add r1, r3, #13 + 1f20c74: e02cc000 eor ip, ip, r0 + 1f20c78: 0a000005 beq 1f20c94 + 1f20c7c: e283300e add r3, r3, #14 + 1f20c80: e352000e cmp r2, #14 + 1f20c84: e7d51001 ldrb r1, [r5, r1] + 1f20c88: 17d53003 ldrbne r3, [r5, r3] + 1f20c8c: e02cc001 eor ip, ip, r1 + 1f20c90: 102cc003 eorne ip, ip, r3 + 1f20c94: e5d53101 ldrb r3, [r5, #257] ; 0x101 + 1f20c98: e3a01000 mov r1, #0 + 1f20c9c: e2480001 sub r0, r8, #1 + 1f20ca0: e153000c cmp r3, ip + 1f20ca4: 11a0300e movne r3, lr + 1f20ca8: 038e3001 orreq r3, lr, #1 + 1f20cac: e6ef3073 uxtb r3, r3 + 1f20cb0: e1530001 cmp r3, r1 + 1f20cb4: 03a07005 moveq r7, #5 + 1f20cb8: ea000010 b 1f20d00 + 1f20cbc: e3130d07 tst r3, #448 ; 0x1c0 + 1f20cc0: 0a000017 beq 1f20d24 + 1f20cc4: e31300e0 tst r3, #224 ; 0xe0 + 1f20cc8: 0a000015 beq 1f20d24 + 1f20ccc: e3130070 tst r3, #112 ; 0x70 + 1f20cd0: 0a000013 beq 1f20d24 + 1f20cd4: e3130038 tst r3, #56 ; 0x38 + 1f20cd8: 0a000011 beq 1f20d24 + 1f20cdc: e313001c tst r3, #28 + 1f20ce0: 0a00000f beq 1f20d24 + 1f20ce4: e313000e tst r3, #14 + 1f20ce8: 0a00000d beq 1f20d24 + 1f20cec: e3130007 tst r3, #7 + 1f20cf0: 0a00000b beq 1f20d24 + 1f20cf4: e2811001 add r1, r1, #1 + 1f20cf8: e3510d05 cmp r1, #320 ; 0x140 + 1f20cfc: 0a00000b beq 1f20d30 + 1f20d00: e3510000 cmp r1, #0 + 1f20d04: 05d8313f ldrbeq r3, [r8, #319] ; 0x13f + 1f20d08: 15d03000 ldrbne r3, [r0] + 1f20d0c: e1a02403 lsl r2, r3, #8 + 1f20d10: e5f03001 ldrb r3, [r0, #1]! + 1f20d14: e2022c03 and r2, r2, #768 ; 0x300 + 1f20d18: e1823003 orr r3, r2, r3 + 1f20d1c: e3130d0e tst r3, #896 ; 0x380 + 1f20d20: 1affffe5 bne 1f20cbc + 1f20d24: e3570001 cmp r7, #1 + 1f20d28: 03a07006 moveq r7, #6 + 1f20d2c: eafffff0 b 1f20cf4 + 1f20d30: e1a00007 mov r0, r7 + 1f20d34: eafffde4 b 1f204cc + 1f20d38: e3a010f2 mov r1, #242 ; 0xf2 + 1f20d3c: e3a0200f mov r2, #15 + 1f20d40: eaffff47 b 1f20a64 + 1f20d44: e3a010f3 mov r1, #243 ; 0xf3 + 1f20d48: e3a0200e mov r2, #14 + 1f20d4c: eaffff44 b 1f20a64 + 1f20d50: e3a010f4 mov r1, #244 ; 0xf4 + 1f20d54: e3a0200d mov r2, #13 + 1f20d58: eaffff41 b 1f20a64 + 1f20d5c: e3a010f5 mov r1, #245 ; 0xf5 + 1f20d60: e3a0200c mov r2, #12 + 1f20d64: eaffff3e b 1f20a64 + 1f20d68: e3a010f6 mov r1, #246 ; 0xf6 + 1f20d6c: e3a0200b mov r2, #11 + 1f20d70: eaffff3b b 1f20a64 + 1f20d74: e3a010f7 mov r1, #247 ; 0xf7 + 1f20d78: e3a0200a mov r2, #10 + 1f20d7c: eaffff38 b 1f20a64 + 1f20d80: e3a010f8 mov r1, #248 ; 0xf8 + 1f20d84: e3a02009 mov r2, #9 + 1f20d88: eaffff35 b 1f20a64 + 1f20d8c: e3a010f9 mov r1, #249 ; 0xf9 + 1f20d90: e3a02008 mov r2, #8 + 1f20d94: eaffff32 b 1f20a64 + 1f20d98: e3a010fa mov r1, #250 ; 0xfa + 1f20d9c: e3a02007 mov r2, #7 + 1f20da0: eaffff2f b 1f20a64 + 1f20da4: e3a010fb mov r1, #251 ; 0xfb + 1f20da8: e3a02006 mov r2, #6 + 1f20dac: eaffff2c b 1f20a64 + 1f20db0: e3a010fc mov r1, #252 ; 0xfc + 1f20db4: e3a02005 mov r2, #5 + 1f20db8: eaffff29 b 1f20a64 + 1f20dbc: e3a010fd mov r1, #253 ; 0xfd + 1f20dc0: e3a02004 mov r2, #4 + 1f20dc4: eaffff26 b 1f20a64 + 1f20dc8: e3a010fe mov r1, #254 ; 0xfe + 1f20dcc: e3a02003 mov r2, #3 + 1f20dd0: eaffff23 b 1f20a64 + 1f20dd4: e3a010ff mov r1, #255 ; 0xff + 1f20dd8: e3a02002 mov r2, #2 + 1f20ddc: eaffff20 b 1f20a64 + 1f20de0: e3a01c01 mov r1, #256 ; 0x100 + 1f20de4: e3a02001 mov r2, #1 + 1f20de8: e1a04001 mov r4, r1 + 1f20dec: e1a00001 mov r0, r1 + 1f20df0: e1a0c003 mov ip, r3 + 1f20df4: e3a06010 mov r6, #16 + 1f20df8: eaffff1c b 1f20a70 + 1f20dfc: e28d3901 add r3, sp, #16384 ; 0x4000 + 1f20e00: e5562008 ldrb r2, [r6, #-8] + 1f20e04: e283303c add r3, r3, #60 ; 0x3c + 1f20e08: e5933000 ldr r3, [r3] + 1f20e0c: e5d33001 ldrb r3, [r3, #1] + 1f20e10: e1520003 cmp r2, r3 + 1f20e14: 1afffecf bne 1f20958 + 1f20e18: e257e001 subs lr, r7, #1 + 1f20e1c: e5d53000 ldrb r3, [r5] + 1f20e20: 13a0e001 movne lr, #1 + 1f20e24: e3530007 cmp r3, #7 + 1f20e28: 11a0300e movne r3, lr + 1f20e2c: 038e3001 orreq r3, lr, #1 + 1f20e30: e3530000 cmp r3, #0 + 1f20e34: 03a0e001 moveq lr, #1 + 1f20e38: 03a07004 moveq r7, #4 + 1f20e3c: eafffec8 b 1f20964 + +01f20e40 : + 1f20e40: e92d4070 push {r4, r5, r6, lr} + 1f20e44: e1a06001 mov r6, r1 + 1f20e48: e2805a02 add r5, r0, #8192 ; 0x2000 + 1f20e4c: e24dd010 sub sp, sp, #16 + 1f20e50: e1a04000 mov r4, r0 + 1f20e54: ea000000 b 1f20e5c + 1f20e58: e1a04003 mov r4, r3 + 1f20e5c: e2843001 add r3, r4, #1 + 1f20e60: e1550003 cmp r5, r3 + 1f20e64: 9a000012 bls 1f20eb4 + 1f20e68: e5532001 ldrb r2, [r3, #-1] + 1f20e6c: e2022003 and r2, r2, #3 + 1f20e70: e3520003 cmp r2, #3 + 1f20e74: 1afffff7 bne 1f20e58 + 1f20e78: e5d32000 ldrb r2, [r3] + 1f20e7c: e35200ff cmp r2, #255 ; 0xff + 1f20e80: 02843002 addeq r3, r4, #2 + 1f20e84: 1afffff3 bne 1f20e58 + 1f20e88: e1550003 cmp r5, r3 + 1f20e8c: e1a04003 mov r4, r3 + 1f20e90: e2833001 add r3, r3, #1 + 1f20e94: 9a000006 bls 1f20eb4 + 1f20e98: e5d42000 ldrb r2, [r4] + 1f20e9c: e35200ff cmp r2, #255 ; 0xff + 1f20ea0: 1a000006 bne 1f20ec0 + 1f20ea4: e1550003 cmp r5, r3 + 1f20ea8: e1a04003 mov r4, r3 + 1f20eac: e2833001 add r3, r3, #1 + 1f20eb0: 8afffff8 bhi 1f20e98 + 1f20eb4: e3a00000 mov r0, #0 + 1f20eb8: e28dd010 add sp, sp, #16 + 1f20ebc: e8bd8070 pop {r4, r5, r6, pc} + 1f20ec0: e28d1004 add r1, sp, #4 + 1f20ec4: e1a00004 mov r0, r4 + 1f20ec8: ebfffc25 bl 1f1ff64 + 1f20ecc: e28d1008 add r1, sp, #8 + 1f20ed0: e2840005 add r0, r4, #5 + 1f20ed4: ebfffc22 bl 1f1ff64 + 1f20ed8: e5dd3004 ldrb r3, [sp, #4] + 1f20edc: e3530008 cmp r3, #8 + 1f20ee0: 1affffdd bne 1f20e5c + 1f20ee4: e5dd3006 ldrb r3, [sp, #6] + 1f20ee8: e3530000 cmp r3, #0 + 1f20eec: 1affffda bne 1f20e5c + 1f20ef0: e5dd3007 ldrb r3, [sp, #7] + 1f20ef4: e3530012 cmp r3, #18 + 1f20ef8: 1affffd7 bne 1f20e5c + 1f20efc: e5dd2009 ldrb r2, [sp, #9] + 1f20f00: e3a00001 mov r0, #1 + 1f20f04: e5dd3008 ldrb r3, [sp, #8] + 1f20f08: e5c62000 strb r2, [r6] + 1f20f0c: e5c63001 strb r3, [r6, #1] + 1f20f10: e28dd010 add sp, sp, #16 + 1f20f14: e8bd8070 pop {r4, r5, r6, pc} + +01f20f18 : + 1f20f18: e2903a02 adds r3, r0, #8192 ; 0x2000 + 1f20f1c: 0a000013 beq 1f20f70 + 1f20f20: e92d4010 push {r4, lr} + 1f20f24: e3a02000 mov r2, #0 + 1f20f28: e1a04001 mov r4, r1 + 1f20f2c: e24dde11 sub sp, sp, #272 ; 0x110 + 1f20f30: e58d1004 str r1, [sp, #4] + 1f20f34: e1a01003 mov r1, r3 + 1f20f38: e58d2000 str r2, [sp] + 1f20f3c: e3a03012 mov r3, #18 + 1f20f40: e28d200c add r2, sp, #12 + 1f20f44: ebfffc55 bl 1f200a0 + 1f20f48: e3500001 cmp r0, #1 + 1f20f4c: 1350000b cmpne r0, #11 + 1f20f50: 13a00000 movne r0, #0 + 1f20f54: 03a00001 moveq r0, #1 + 1f20f58: 05dd20af ldrbeq r2, [sp, #175] ; 0xaf + 1f20f5c: 05dd30b0 ldrbeq r3, [sp, #176] ; 0xb0 + 1f20f60: 05c42000 strbeq r2, [r4] + 1f20f64: 05c43001 strbeq r3, [r4, #1] + 1f20f68: e28dde11 add sp, sp, #272 ; 0x110 + 1f20f6c: e8bd8010 pop {r4, pc} + 1f20f70: e3a00000 mov r0, #0 + 1f20f74: e12fff1e bx lr + +01f20f78 : + 1f20f78: e3530028 cmp r3, #40 ; 0x28 + 1f20f7c: e92d4030 push {r4, r5, lr} + 1f20f80: e59d400c ldr r4, [sp, #12] + 1f20f84: e59d5010 ldr r5, [sp, #16] + 1f20f88: ca000003 bgt 1f20f9c + 1f20f8c: e3510000 cmp r1, #0 + 1f20f90: 11510000 cmpne r1, r0 + 1f20f94: e1a0e000 mov lr, r0 + 1f20f98: 8a000001 bhi 1f20fa4 + 1f20f9c: e3a00000 mov r0, #0 + 1f20fa0: e8bd8030 pop {r4, r5, pc} + 1f20fa4: e8bd4030 pop {r4, r5, lr} + 1f20fa8: eafffc3c b 1f200a0 + +01f20fac : + 1f20fac: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f20fb0: e1a07001 mov r7, r1 + 1f20fb4: e1a05000 mov r5, r0 + 1f20fb8: e24ddf45 sub sp, sp, #276 ; 0x114 + 1f20fbc: e1a04002 mov r4, r2 + 1f20fc0: e1a0000d mov r0, sp + 1f20fc4: e3a02003 mov r2, #3 + 1f20fc8: e1a08003 mov r8, r3 + 1f20fcc: e59d613c ldr r6, [sp, #316] ; 0x13c + 1f20fd0: e59d1138 ldr r1, [sp, #312] ; 0x138 + 1f20fd4: eb007789 bl 1f3ee00 + 1f20fd8: e1a00007 mov r0, r7 + 1f20fdc: e3002169 movw r2, #361 ; 0x169 + 1f20fe0: e3a01055 mov r1, #85 ; 0x55 + 1f20fe4: eb00780c bl 1f3f01c + 1f20fe8: e3560003 cmp r6, #3 + 1f20fec: 0a00002e beq 1f210ac + 1f20ff0: e3560002 cmp r6, #2 + 1f20ff4: 0a00002e beq 1f210b4 + 1f20ff8: e3a02005 mov r2, #5 + 1f20ffc: e3a010ff mov r1, #255 ; 0xff + 1f21000: e1a00007 mov r0, r7 + 1f21004: eb007804 bl 1f3f01c + 1f21008: e356000b cmp r6, #11 + 1f2100c: e0280004 eor r0, r8, r4 + 1f21010: e2871005 add r1, r7, #5 + 1f21014: 05dd2001 ldrbeq r2, [sp, #1] + 1f21018: 05dd3000 ldrbeq r3, [sp] + 1f2101c: 01e02002 mvneq r2, r2 + 1f21020: 15dd2001 ldrbne r2, [sp, #1] + 1f21024: 01e03003 mvneq r3, r3 + 1f21028: 15dd3000 ldrbne r3, [sp] + 1f2102c: 06ef2072 uxtbeq r2, r2 + 1f21030: 05cd2001 strbeq r2, [sp, #1] + 1f21034: 06ef3073 uxtbeq r3, r3 + 1f21038: e0222000 eor r2, r2, r0 + 1f2103c: 05cd3000 strbeq r3, [sp] + 1f21040: e0233002 eor r3, r3, r2 + 1f21044: e3560009 cmp r6, #9 + 1f21048: e3a02008 mov r2, #8 + 1f2104c: e6ef3073 uxtb r3, r3 + 1f21050: e5cd8006 strb r8, [sp, #6] + 1f21054: e5cd4007 strb r4, [sp, #7] + 1f21058: e28d0004 add r0, sp, #4 + 1f2105c: e5cd2004 strb r2, [sp, #4] + 1f21060: e5cd3005 strb r3, [sp, #5] + 1f21064: 0a0000d6 beq 1f213c4 + 1f21068: ebfffb7d bl 1f1fe64 + 1f2106c: e5ddc001 ldrb ip, [sp, #1] + 1f21070: e5dd2000 ldrb r2, [sp] + 1f21074: e28d0004 add r0, sp, #4 + 1f21078: e287100a add r1, r7, #10 + 1f2107c: e3a0300f mov r3, #15 + 1f21080: e5cdc004 strb ip, [sp, #4] + 1f21084: e5cd2005 strb r2, [sp, #5] + 1f21088: e5cd3007 strb r3, [sp, #7] + 1f2108c: e5cd3006 strb r3, [sp, #6] + 1f21090: ebfffb73 bl 1f1fe64 + 1f21094: e3a02009 mov r2, #9 + 1f21098: e3a01055 mov r1, #85 ; 0x55 + 1f2109c: e287000f add r0, r7, #15 + 1f210a0: eb0077dd bl 1f3f01c + 1f210a4: e3560004 cmp r6, #4 + 1f210a8: 1a000001 bne 1f210b4 + 1f210ac: e28ddf45 add sp, sp, #276 ; 0x114 + 1f210b0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f210b4: e2874018 add r4, r7, #24 + 1f210b8: e3a02005 mov r2, #5 + 1f210bc: e3a010ff mov r1, #255 ; 0xff + 1f210c0: e1a00004 mov r0, r4 + 1f210c4: e285901f add r9, r5, #31 + 1f210c8: eb0077d3 bl 1f3f01c + 1f210cc: e285300f add r3, r5, #15 + 1f210d0: e5d5c002 ldrb ip, [r5, #2] + 1f210d4: e3a00007 mov r0, #7 + 1f210d8: f4630a0f vld1.8 {d16-d17}, [r3] + 1f210dc: e285a02f add sl, r5, #47 ; 0x2f + 1f210e0: e5d53001 ldrb r3, [r5, #1] + 1f210e4: e285803f add r8, r5, #63 ; 0x3f + 1f210e8: e5d51000 ldrb r1, [r5] + 1f210ec: e285704f add r7, r5, #79 ; 0x4f + 1f210f0: e5d52003 ldrb r2, [r5, #3] + 1f210f4: e3560005 cmp r6, #5 + 1f210f8: e5cd300a strb r3, [sp, #10] + 1f210fc: e023300c eor r3, r3, ip + 1f21100: e5cdc00b strb ip, [sp, #11] + 1f21104: e0233001 eor r3, r3, r1 + 1f21108: e5d5c004 ldrb ip, [r5, #4] + 1f2110c: e0233002 eor r3, r3, r2 + 1f21110: e5cd1009 strb r1, [sp, #9] + 1f21114: e285605f add r6, r5, #95 ; 0x5f + 1f21118: e5d51005 ldrb r1, [r5, #5] + 1f2111c: e023300c eor r3, r3, ip + 1f21120: e5cd200c strb r2, [sp, #12] + 1f21124: e285e06f add lr, r5, #111 ; 0x6f + 1f21128: e5d52006 ldrb r2, [r5, #6] + 1f2112c: e0233001 eor r3, r3, r1 + 1f21130: e5cd100e strb r1, [sp, #14] + 1f21134: f2c06050 vmov.i32 q11, #0 ; 0x00000000 + 1f21138: e5d51007 ldrb r1, [r5, #7] + 1f2113c: e0233002 eor r3, r3, r2 + 1f21140: e5cd1010 strb r1, [sp, #16] + 1f21144: e0233001 eor r3, r3, r1 + 1f21148: e5d51008 ldrb r1, [r5, #8] + 1f2114c: e5cd200f strb r2, [sp, #15] + 1f21150: e5d52009 ldrb r2, [r5, #9] + 1f21154: e5cd1011 strb r1, [sp, #17] + 1f21158: e0211003 eor r1, r1, r3 + 1f2115c: e5cd0008 strb r0, [sp, #8] + 1f21160: e5d5000a ldrb r0, [r5, #10] + 1f21164: e5d5300b ldrb r3, [r5, #11] + 1f21168: e5cd2012 strb r2, [sp, #18] + 1f2116c: e0222001 eor r2, r2, r1 + 1f21170: e0222000 eor r2, r2, r0 + 1f21174: e5d5100c ldrb r1, [r5, #12] + 1f21178: e5d5b00d ldrb fp, [r5, #13] + 1f2117c: e5cd3014 strb r3, [sp, #20] + 1f21180: e0233002 eor r3, r3, r2 + 1f21184: e5d5200e ldrb r2, [r5, #14] + 1f21188: e0233001 eor r3, r3, r1 + 1f2118c: e5cdc00d strb ip, [sp, #13] + 1f21190: e285c07f add ip, r5, #127 ; 0x7f + 1f21194: e5cd0013 strb r0, [sp, #19] + 1f21198: e285008f add r0, r5, #143 ; 0x8f + 1f2119c: e5cd1015 strb r1, [sp, #21] + 1f211a0: e285109f add r1, r5, #159 ; 0x9f + 1f211a4: e5cd2017 strb r2, [sp, #23] + 1f211a8: e023300b eor r3, r3, fp + 1f211ac: e5cdb016 strb fp, [sp, #22] + 1f211b0: edcd0b06 vstr d16, [sp, #24] + 1f211b4: edcd1b08 vstr d17, [sp, #32] + 1f211b8: f4694a0f vld1.8 {d20-d21}, [r9] + 1f211bc: e28590af add r9, r5, #175 ; 0xaf + 1f211c0: f46a2a0f vld1.8 {d18-d19}, [sl] + 1f211c4: e0233002 eor r3, r3, r2 + 1f211c8: f4688a0f vld1.8 {d24-d25}, [r8] + 1f211cc: e5d520ff ldrb r2, [r5, #255] ; 0xff + 1f211d0: e5cd2108 strb r2, [sp, #264] ; 0x108 + 1f211d4: f34001f4 veor q8, q8, q10 + 1f211d8: e0222003 eor r2, r2, r3 + 1f211dc: edcd4b0a vstr d20, [sp, #40] ; 0x28 + 1f211e0: edcd5b0c vstr d21, [sp, #48] ; 0x30 + 1f211e4: f4674a0f vld1.8 {d20-d21}, [r7] + 1f211e8: edcd2b0e vstr d18, [sp, #56] ; 0x38 + 1f211ec: edcd3b10 vstr d19, [sp, #64] ; 0x40 + 1f211f0: edcd8b12 vstr d24, [sp, #72] ; 0x48 + 1f211f4: edcd9b14 vstr d25, [sp, #80] ; 0x50 + 1f211f8: f34001f2 veor q8, q8, q9 + 1f211fc: f4662a0f vld1.8 {d18-d19}, [r6] + 1f21200: e28560bf add r6, r5, #191 ; 0xbf + 1f21204: edcd4b16 vstr d20, [sp, #88] ; 0x58 + 1f21208: edcd5b18 vstr d21, [sp, #96] ; 0x60 + 1f2120c: f34001f8 veor q8, q8, q12 + 1f21210: f46e8a0f vld1.8 {d24-d25}, [lr] + 1f21214: edcd2b1a vstr d18, [sp, #104] ; 0x68 + 1f21218: edcd3b1c vstr d19, [sp, #112] ; 0x70 + 1f2121c: e285e0cf add lr, r5, #207 ; 0xcf + 1f21220: f34041f4 veor q10, q8, q10 + 1f21224: f46c0a0f vld1.8 {d16-d17}, [ip] + 1f21228: edcd8b1e vstr d24, [sp, #120] ; 0x78 + 1f2122c: edcd9b20 vstr d25, [sp, #128] ; 0x80 + 1f21230: e285c0df add ip, r5, #223 ; 0xdf + 1f21234: f34421f2 veor q9, q10, q9 + 1f21238: f4614a0f vld1.8 {d20-d21}, [r1] + 1f2123c: edcd0b22 vstr d16, [sp, #136] ; 0x88 + 1f21240: edcd1b24 vstr d17, [sp, #144] ; 0x90 + 1f21244: e3a01000 mov r1, #0 + 1f21248: e5cd110a strb r1, [sp, #266] ; 0x10a + 1f2124c: f34221f8 veor q9, q9, q12 + 1f21250: f4608a0f vld1.8 {d24-d25}, [r0] + 1f21254: edcd4b2a vstr d20, [sp, #168] ; 0xa8 + 1f21258: edcd5b2c vstr d21, [sp, #176] ; 0xb0 + 1f2125c: e28500ef add r0, r5, #239 ; 0xef + 1f21260: f34201f0 veor q8, q9, q8 + 1f21264: f4692a0f vld1.8 {d18-d19}, [r9] + 1f21268: edcd8b26 vstr d24, [sp, #152] ; 0x98 + 1f2126c: edcd9b28 vstr d25, [sp, #160] ; 0xa0 + 1f21270: f34001f8 veor q8, q8, q12 + 1f21274: f4668a0f vld1.8 {d24-d25}, [r6] + 1f21278: edcd2b2e vstr d18, [sp, #184] ; 0xb8 + 1f2127c: edcd3b30 vstr d19, [sp, #192] ; 0xc0 + 1f21280: e2846f53 add r6, r4, #332 ; 0x14c + 1f21284: e2866003 add r6, r6, #3 + 1f21288: f34041f4 veor q10, q8, q10 + 1f2128c: f46e0a0f vld1.8 {d16-d17}, [lr] + 1f21290: edcd8b32 vstr d24, [sp, #200] ; 0xc8 + 1f21294: edcd9b34 vstr d25, [sp, #208] ; 0xd0 + 1f21298: f34421f2 veor q9, q10, q9 + 1f2129c: f46c4a0f vld1.8 {d20-d21}, [ip] + 1f212a0: edcd0b36 vstr d16, [sp, #216] ; 0xd8 + 1f212a4: edcd1b38 vstr d17, [sp, #224] ; 0xe0 + 1f212a8: f34221f8 veor q9, q9, q12 + 1f212ac: edcd4b3a vstr d20, [sp, #232] ; 0xe8 + 1f212b0: edcd5b3c vstr d21, [sp, #240] ; 0xf0 + 1f212b4: f34201f0 veor q8, q9, q8 + 1f212b8: f4602a0f vld1.8 {d18-d19}, [r0] + 1f212bc: f34001f4 veor q8, q8, q10 + 1f212c0: edcd2b3e vstr d18, [sp, #248] ; 0xf8 + 1f212c4: edcd3b40 vstr d19, [sp, #256] ; 0x100 + 1f212c8: f34201f0 veor q8, q9, q8 + 1f212cc: f2f028e6 vext.8 q9, q8, q11, #8 + 1f212d0: f34201f0 veor q8, q9, q8 + 1f212d4: f2f024e6 vext.8 q9, q8, q11, #4 + 1f212d8: f34221f0 veor q9, q9, q8 + 1f212dc: f2f202e6 vext.8 q8, q9, q11, #2 + 1f212e0: f34001f2 veor q8, q8, q9 + 1f212e4: f2f061e6 vext.8 q11, q8, q11, #1 + 1f212e8: f34601f0 veor q8, q11, q8 + 1f212ec: eed03b90 vmov.u8 r3, d16[0] + 1f212f0: e0233002 eor r3, r3, r2 + 1f212f4: e284200a add r2, r4, #10 + 1f212f8: e6ef3073 uxtb r3, r3 + 1f212fc: 01e03003 mvneq r3, r3 + 1f21300: 06ef3073 uxtbeq r3, r3 + 1f21304: e5cd3109 strb r3, [sp, #265] ; 0x109 + 1f21308: e30f3418 movw r3, #62488 ; 0xf418 + 1f2130c: e34031f5 movt r3, #501 ; 0x1f5 + 1f21310: e5cd110b strb r1, [sp, #267] ; 0x10b + 1f21314: e28d1008 add r1, sp, #8 + 1f21318: e5d15001 ldrb r5, [r1, #1] + 1f2131c: e2822005 add r2, r2, #5 + 1f21320: e5d10002 ldrb r0, [r1, #2] + 1f21324: e2811004 add r1, r1, #4 + 1f21328: e205a00f and sl, r5, #15 + 1f2132c: e551c004 ldrb ip, [r1, #-4] + 1f21330: e5519001 ldrb r9, [r1, #-1] + 1f21334: e200e00f and lr, r0, #15 + 1f21338: e20c800f and r8, ip, #15 + 1f2133c: e7d37245 ldrb r7, [r3, r5, asr #4] + 1f21340: e7d3b00a ldrb fp, [r3, sl] + 1f21344: e209500f and r5, r9, #15 + 1f21348: e7d3a249 ldrb sl, [r3, r9, asr #4] + 1f2134c: e7d39240 ldrb r9, [r3, r0, asr #4] + 1f21350: e7d38008 ldrb r8, [r3, r8] + 1f21354: e7d3000e ldrb r0, [r3, lr] + 1f21358: e1a0e24b asr lr, fp, #4 + 1f2135c: e18ee087 orr lr, lr, r7, lsl #1 + 1f21360: e7d3724c ldrb r7, [r3, ip, asr #4] + 1f21364: e1a0c0c9 asr ip, r9, #1 + 1f21368: e7d35005 ldrb r5, [r3, r5] + 1f2136c: e18cb20b orr fp, ip, fp, lsl #4 + 1f21370: e1a0c1ca asr ip, sl, #3 + 1f21374: e18c0100 orr r0, ip, r0, lsl #2 + 1f21378: e1a0c148 asr ip, r8, #2 + 1f2137c: e542b008 strb fp, [r2, #-8] + 1f21380: e1800389 orr r0, r0, r9, lsl #7 + 1f21384: e185528a orr r5, r5, sl, lsl #5 + 1f21388: e5420007 strb r0, [r2, #-7] + 1f2138c: e5425006 strb r5, [r2, #-6] + 1f21390: e18ee308 orr lr, lr, r8, lsl #6 + 1f21394: e18c0187 orr r0, ip, r7, lsl #3 + 1f21398: e542e009 strb lr, [r2, #-9] + 1f2139c: e542000a strb r0, [r2, #-10] + 1f213a0: e1560002 cmp r6, r2 + 1f213a4: 1affffdb bne 1f21318 + 1f213a8: e2840f52 add r0, r4, #328 ; 0x148 + 1f213ac: e3a02007 mov r2, #7 + 1f213b0: e3a01055 mov r1, #85 ; 0x55 + 1f213b4: e2800002 add r0, r0, #2 + 1f213b8: eb007717 bl 1f3f01c + 1f213bc: e28ddf45 add sp, sp, #276 ; 0x114 + 1f213c0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f213c4: e1e03003 mvn r3, r3 + 1f213c8: e5cd3005 strb r3, [sp, #5] + 1f213cc: ebfffaa4 bl 1f1fe64 + 1f213d0: e5dd3001 ldrb r3, [sp, #1] + 1f213d4: e5dd2000 ldrb r2, [sp] + 1f213d8: e28d0004 add r0, sp, #4 + 1f213dc: e287100a add r1, r7, #10 + 1f213e0: e5cd3004 strb r3, [sp, #4] + 1f213e4: e5cd2005 strb r2, [sp, #5] + 1f213e8: e3a0300f mov r3, #15 + 1f213ec: e5cd3007 strb r3, [sp, #7] + 1f213f0: e2874018 add r4, r7, #24 + 1f213f4: e5cd3006 strb r3, [sp, #6] + 1f213f8: ebfffa99 bl 1f1fe64 + 1f213fc: e1a02006 mov r2, r6 + 1f21400: e3a01055 mov r1, #85 ; 0x55 + 1f21404: e287000f add r0, r7, #15 + 1f21408: eb007703 bl 1f3f01c + 1f2140c: eaffff29 b 1f210b8 + +01f21410 : + 1f21410: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f21414: e30491d0 movw r9, #16848 ; 0x41d0 + 1f21418: e34091f6 movt r9, #502 ; 0x1f6 + 1f2141c: e24dd014 sub sp, sp, #20 + 1f21420: e5903000 ldr r3, [r0] + 1f21424: e5994000 ldr r4, [r9] + 1f21428: e1a0a003 mov sl, r3 + 1f2142c: e88d0003 stm sp, {r0, r1} + 1f21430: e2644a02 rsb r4, r4, #8192 ; 0x2000 + 1f21434: e58d200c str r2, [sp, #12] + 1f21438: e58d3008 str r3, [sp, #8] + 1f2143c: e0834004 add r4, r3, r4 + 1f21440: e59d300c ldr r3, [sp, #12] + 1f21444: e08a7003 add r7, sl, r3 + 1f21448: e1540007 cmp r4, r7 + 1f2144c: 8a000001 bhi 1f21458 + 1f21450: ea000082 b 1f21660 + 1f21454: e1a07003 mov r7, r3 + 1f21458: e2873001 add r3, r7, #1 + 1f2145c: e1540003 cmp r4, r3 + 1f21460: 9a00005b bls 1f215d4 + 1f21464: e5532001 ldrb r2, [r3, #-1] + 1f21468: e2022003 and r2, r2, #3 + 1f2146c: e3520003 cmp r2, #3 + 1f21470: 1afffff7 bne 1f21454 + 1f21474: e5d32000 ldrb r2, [r3] + 1f21478: e35200ff cmp r2, #255 ; 0xff + 1f2147c: 0287b002 addeq fp, r7, #2 + 1f21480: 1afffff3 bne 1f21454 + 1f21484: e154000b cmp r4, fp + 1f21488: e1a0700b mov r7, fp + 1f2148c: e28b8001 add r8, fp, #1 + 1f21490: 9a00004f bls 1f215d4 + 1f21494: e5db3000 ldrb r3, [fp] + 1f21498: e35300ff cmp r3, #255 ; 0xff + 1f2149c: 1a000007 bne 1f214c0 + 1f214a0: e1a0b008 mov fp, r8 + 1f214a4: e154000b cmp r4, fp + 1f214a8: e1a0700b mov r7, fp + 1f214ac: e28b8001 add r8, fp, #1 + 1f214b0: 9a000047 bls 1f215d4 + 1f214b4: e5db3000 ldrb r3, [fp] + 1f214b8: e35300ff cmp r3, #255 ; 0xff + 1f214bc: 0afffff7 beq 1f214a0 + 1f214c0: e1a0500a mov r5, sl + 1f214c4: e1a0600b mov r6, fp + 1f214c8: e5992000 ldr r2, [r9] + 1f214cc: e1a01006 mov r1, r6 + 1f214d0: e1a00005 mov r0, r5 + 1f214d4: eb00761d bl 1f3ed50 + 1f214d8: e3500000 cmp r0, #0 + 1f214dc: 0a000001 beq 1f214e8 + 1f214e0: eaffffdc b 1f21458 + 1f214e4: e1a05003 mov r5, r3 + 1f214e8: e2853001 add r3, r5, #1 + 1f214ec: e1540003 cmp r4, r3 + 1f214f0: 9a00000f bls 1f21534 + 1f214f4: e5532001 ldrb r2, [r3, #-1] + 1f214f8: e2022003 and r2, r2, #3 + 1f214fc: e3520003 cmp r2, #3 + 1f21500: 1afffff7 bne 1f214e4 + 1f21504: e5d32000 ldrb r2, [r3] + 1f21508: e35200ff cmp r2, #255 ; 0xff + 1f2150c: 1afffff4 bne 1f214e4 + 1f21510: e2853002 add r3, r5, #2 + 1f21514: ea000002 b 1f21524 + 1f21518: e5d52000 ldrb r2, [r5] + 1f2151c: e35200ff cmp r2, #255 ; 0xff + 1f21520: 1a000037 bne 1f21604 + 1f21524: e1540003 cmp r4, r3 + 1f21528: e1a05003 mov r5, r3 + 1f2152c: e2833001 add r3, r3, #1 + 1f21530: 8afffff8 bhi 1f21518 + 1f21534: e35b0000 cmp fp, #0 + 1f21538: 0affffc6 beq 1f21458 + 1f2153c: e599c000 ldr ip, [r9] + 1f21540: e35c0000 cmp ip, #0 + 1f21544: da000017 ble 1f215a8 + 1f21548: e08bc00c add ip, fp, ip + 1f2154c: e1a0300b mov r3, fp + 1f21550: e3a00000 mov r0, #0 + 1f21554: ea00000a b 1f21584 + 1f21558: e5d81000 ldrb r1, [r8] + 1f2155c: e1510002 cmp r1, r2 + 1f21560: 0a00000b beq 1f21594 + 1f21564: e5d31002 ldrb r1, [r3, #2] + 1f21568: e1510002 cmp r1, r2 + 1f2156c: 0a000008 beq 1f21594 + 1f21570: e5d31003 ldrb r1, [r3, #3] + 1f21574: e1510002 cmp r1, r2 + 1f21578: 0a000005 beq 1f21594 + 1f2157c: e153000c cmp r3, ip + 1f21580: 0a000006 beq 1f215a0 + 1f21584: e4d32001 ldrb r2, [r3], #1 + 1f21588: e4d81001 ldrb r1, [r8], #1 + 1f2158c: e1520001 cmp r2, r1 + 1f21590: 1afffff0 bne 1f21558 + 1f21594: e153000c cmp r3, ip + 1f21598: e2800001 add r0, r0, #1 + 1f2159c: 1afffff8 bne 1f21584 + 1f215a0: e3500001 cmp r0, #1 + 1f215a4: caffffab bgt 1f21458 + 1f215a8: e59d3000 ldr r3, [sp] + 1f215ac: e06a000b rsb r0, sl, fp + 1f215b0: e583a000 str sl, [r3] + 1f215b4: e59d3004 ldr r3, [sp, #4] + 1f215b8: e583b000 str fp, [r3] + 1f215bc: e28dd014 add sp, sp, #20 + 1f215c0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f215c4: e5d32000 ldrb r2, [r3] + 1f215c8: e35200ff cmp r2, #255 ; 0xff + 1f215cc: 0a00002c beq 1f21684 + 1f215d0: e1a0a003 mov sl, r3 + 1f215d4: e28a3001 add r3, sl, #1 + 1f215d8: e1540003 cmp r4, r3 + 1f215dc: 9a00001a bls 1f2164c + 1f215e0: e5532001 ldrb r2, [r3, #-1] + 1f215e4: e2022003 and r2, r2, #3 + 1f215e8: e3520003 cmp r2, #3 + 1f215ec: 1afffff7 bne 1f215d0 + 1f215f0: eafffff3 b 1f215c4 + 1f215f4: e5d32000 ldrb r2, [r3] + 1f215f8: e35200ff cmp r2, #255 ; 0xff + 1f215fc: 0a000008 beq 1f21624 + 1f21600: e1a06003 mov r6, r3 + 1f21604: e2863001 add r3, r6, #1 + 1f21608: e1540003 cmp r4, r3 + 1f2160c: 9affffc8 bls 1f21534 + 1f21610: e5532001 ldrb r2, [r3, #-1] + 1f21614: e2022003 and r2, r2, #3 + 1f21618: e3520003 cmp r2, #3 + 1f2161c: 1afffff7 bne 1f21600 + 1f21620: eafffff3 b 1f215f4 + 1f21624: e2863002 add r3, r6, #2 + 1f21628: ea000002 b 1f21638 + 1f2162c: e5d62000 ldrb r2, [r6] + 1f21630: e35200ff cmp r2, #255 ; 0xff + 1f21634: 1affffa3 bne 1f214c8 + 1f21638: e1540003 cmp r4, r3 + 1f2163c: e1a06003 mov r6, r3 + 1f21640: e2833001 add r3, r3, #1 + 1f21644: 8afffff8 bhi 1f2162c + 1f21648: eaffffb9 b 1f21534 + 1f2164c: e59d300c ldr r3, [sp, #12] + 1f21650: e1a0a004 mov sl, r4 + 1f21654: e08a7003 add r7, sl, r3 + 1f21658: e1540007 cmp r4, r7 + 1f2165c: 8affff7d bhi 1f21458 + 1f21660: e59d2000 ldr r2, [sp] + 1f21664: e3a00a02 mov r0, #8192 ; 0x2000 + 1f21668: e59d3008 ldr r3, [sp, #8] + 1f2166c: e5823000 str r3, [r2] + 1f21670: e283ba02 add fp, r3, #8192 ; 0x2000 + 1f21674: e59d3004 ldr r3, [sp, #4] + 1f21678: e583b000 str fp, [r3] + 1f2167c: e28dd014 add sp, sp, #20 + 1f21680: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f21684: e28a3002 add r3, sl, #2 + 1f21688: ea000002 b 1f21698 + 1f2168c: e5da2000 ldrb r2, [sl] + 1f21690: e35200ff cmp r2, #255 ; 0xff + 1f21694: 1affff69 bne 1f21440 + 1f21698: e1540003 cmp r4, r3 + 1f2169c: e1a0a003 mov sl, r3 + 1f216a0: e2833001 add r3, r3, #1 + 1f216a4: 8afffff8 bhi 1f2168c + 1f216a8: eaffff64 b 1f21440 + +01f216ac : + 1f216ac: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f216b0: e30461d0 movw r6, #16848 ; 0x41d0 + 1f216b4: e34061f6 movt r6, #502 ; 0x1f6 + 1f216b8: e5909000 ldr r9, [r0] + 1f216bc: e24dd00c sub sp, sp, #12 + 1f216c0: e5964000 ldr r4, [r6] + 1f216c4: e88d0003 stm sp, {r0, r1} + 1f216c8: e2644a02 rsb r4, r4, #8192 ; 0x2000 + 1f216cc: e0894004 add r4, r9, r4 + 1f216d0: e1590004 cmp r9, r4 + 1f216d4: 30898002 addcc r8, r9, r2 + 1f216d8: 31a05009 movcc r5, r9 + 1f216dc: 31a07006 movcc r7, r6 + 1f216e0: 2a000040 bcs 1f217e8 + 1f216e4: e1540008 cmp r4, r8 + 1f216e8: e1a0a008 mov sl, r8 + 1f216ec: 9a00002a bls 1f2179c + 1f216f0: e5962000 ldr r2, [r6] + 1f216f4: e1a0100a mov r1, sl + 1f216f8: e1a00005 mov r0, r5 + 1f216fc: eb007593 bl 1f3ed50 + 1f21700: e29a3000 adds r3, sl, #0 + 1f21704: 13a03001 movne r3, #1 + 1f21708: e3500000 cmp r0, #0 + 1f2170c: 13a03000 movne r3, #0 + 1f21710: e3530000 cmp r3, #0 + 1f21714: 028ab001 addeq fp, sl, #1 + 1f21718: 0a00001c beq 1f21790 + 1f2171c: e597e000 ldr lr, [r7] + 1f21720: e35e0000 cmp lr, #0 + 1f21724: da000028 ble 1f217cc + 1f21728: e28ab001 add fp, sl, #1 + 1f2172c: e08ae00e add lr, sl, lr + 1f21730: e1a0100b mov r1, fp + 1f21734: e1a0300a mov r3, sl + 1f21738: e3a0c000 mov ip, #0 + 1f2173c: ea00000a b 1f2176c + 1f21740: e5d10000 ldrb r0, [r1] + 1f21744: e1500002 cmp r0, r2 + 1f21748: 0a00000b beq 1f2177c + 1f2174c: e5d30002 ldrb r0, [r3, #2] + 1f21750: e1500002 cmp r0, r2 + 1f21754: 0a000008 beq 1f2177c + 1f21758: e5d30003 ldrb r0, [r3, #3] + 1f2175c: e1500002 cmp r0, r2 + 1f21760: 0a000005 beq 1f2177c + 1f21764: e15e0003 cmp lr, r3 + 1f21768: 0a000006 beq 1f21788 + 1f2176c: e4d32001 ldrb r2, [r3], #1 + 1f21770: e4d10001 ldrb r0, [r1], #1 + 1f21774: e1520000 cmp r2, r0 + 1f21778: 1afffff0 bne 1f21740 + 1f2177c: e15e0003 cmp lr, r3 + 1f21780: e28cc001 add ip, ip, #1 + 1f21784: 1afffff8 bne 1f2176c + 1f21788: e35c0001 cmp ip, #1 + 1f2178c: da00000e ble 1f217cc + 1f21790: e154000b cmp r4, fp + 1f21794: e1a0a00b mov sl, fp + 1f21798: 1affffd4 bne 1f216f0 + 1f2179c: e2855001 add r5, r5, #1 + 1f217a0: e2888001 add r8, r8, #1 + 1f217a4: e1540005 cmp r4, r5 + 1f217a8: 1affffcd bne 1f216e4 + 1f217ac: e59d3000 ldr r3, [sp] + 1f217b0: e5839000 str r9, [r3] + 1f217b4: e3a00a02 mov r0, #8192 ; 0x2000 + 1f217b8: e59d3004 ldr r3, [sp, #4] + 1f217bc: e2899a02 add r9, r9, #8192 ; 0x2000 + 1f217c0: e5839000 str r9, [r3] + 1f217c4: e28dd00c add sp, sp, #12 + 1f217c8: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f217cc: e59d3000 ldr r3, [sp] + 1f217d0: e065000a rsb r0, r5, sl + 1f217d4: e5835000 str r5, [r3] + 1f217d8: e59d3004 ldr r3, [sp, #4] + 1f217dc: e583a000 str sl, [r3] + 1f217e0: e28dd00c add sp, sp, #12 + 1f217e4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f217e8: e1a03000 mov r3, r0 + 1f217ec: eaffffef b 1f217b0 + +01f217f0 : + 1f217f0: e3510000 cmp r1, #0 + 1f217f4: da00001a ble 1f21864 + 1f217f8: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f217fc: e0801001 add r1, r0, r1 + 1f21800: e3a0e000 mov lr, #0 + 1f21804: e2802001 add r2, r0, #1 + 1f21808: ea00000a b 1f21838 + 1f2180c: e5d2c000 ldrb ip, [r2] + 1f21810: e15c0003 cmp ip, r3 + 1f21814: 0a00000b beq 1f21848 + 1f21818: e5d0c002 ldrb ip, [r0, #2] + 1f2181c: e15c0003 cmp ip, r3 + 1f21820: 0a000008 beq 1f21848 + 1f21824: e5d0c003 ldrb ip, [r0, #3] + 1f21828: e15c0003 cmp ip, r3 + 1f2182c: 0a000005 beq 1f21848 + 1f21830: e1510000 cmp r1, r0 + 1f21834: 0a000006 beq 1f21854 + 1f21838: e4d03001 ldrb r3, [r0], #1 + 1f2183c: e4d2c001 ldrb ip, [r2], #1 + 1f21840: e153000c cmp r3, ip + 1f21844: 1afffff0 bne 1f2180c + 1f21848: e1510000 cmp r1, r0 + 1f2184c: e28ee001 add lr, lr, #1 + 1f21850: 1afffff8 bne 1f21838 + 1f21854: e35e0001 cmp lr, #1 + 1f21858: c3a00000 movgt r0, #0 + 1f2185c: d3a00001 movle r0, #1 + 1f21860: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f21864: e3a00001 mov r0, #1 + 1f21868: e12fff1e bx lr + +01f2186c : + 1f2186c: e92d4070 push {r4, r5, r6, lr} + 1f21870: e0804081 add r4, r0, r1, lsl #1 + 1f21874: e3a03000 mov r3, #0 + 1f21878: e1a0e000 mov lr, r0 + 1f2187c: e5823000 str r3, [r2] + 1f21880: e244400a sub r4, r4, #10 + 1f21884: ea000000 b 1f2188c + 1f21888: e1a0e003 mov lr, r3 + 1f2188c: e28e3001 add r3, lr, #1 + 1f21890: e1540003 cmp r4, r3 + 1f21894: 9a00000f bls 1f218d8 + 1f21898: e553c001 ldrb ip, [r3, #-1] + 1f2189c: e20cc003 and ip, ip, #3 + 1f218a0: e35c0003 cmp ip, #3 + 1f218a4: 1afffff7 bne 1f21888 + 1f218a8: e5d3c000 ldrb ip, [r3] + 1f218ac: e35c00ff cmp ip, #255 ; 0xff + 1f218b0: 1afffff4 bne 1f21888 + 1f218b4: e28ee002 add lr, lr, #2 + 1f218b8: ea000002 b 1f218c8 + 1f218bc: e5d63000 ldrb r3, [r6] + 1f218c0: e35300ff cmp r3, #255 ; 0xff + 1f218c4: 1a000008 bne 1f218ec + 1f218c8: e154000e cmp r4, lr + 1f218cc: e1a0600e mov r6, lr + 1f218d0: e28ee001 add lr, lr, #1 + 1f218d4: 8afffff8 bhi 1f218bc + 1f218d8: e3a00000 mov r0, #0 + 1f218dc: e8bd8070 pop {r4, r5, r6, pc} + 1f218e0: e35c0052 cmp ip, #82 ; 0x52 + 1f218e4: 0a000019 beq 1f21950 + 1f218e8: e1a0600e mov r6, lr + 1f218ec: e1a0e006 mov lr, r6 + 1f218f0: ea000000 b 1f218f8 + 1f218f4: e1a0e003 mov lr, r3 + 1f218f8: e28e3001 add r3, lr, #1 + 1f218fc: e1540003 cmp r4, r3 + 1f21900: 9afffff4 bls 1f218d8 + 1f21904: e553c001 ldrb ip, [r3, #-1] + 1f21908: e20cc003 and ip, ip, #3 + 1f2190c: e35c0003 cmp ip, #3 + 1f21910: 1afffff7 bne 1f218f4 + 1f21914: e5d3c000 ldrb ip, [r3] + 1f21918: e35c00ff cmp ip, #255 ; 0xff + 1f2191c: 1afffff4 bne 1f218f4 + 1f21920: e28ee002 add lr, lr, #2 + 1f21924: ea000003 b 1f21938 + 1f21928: e5dec000 ldrb ip, [lr] + 1f2192c: e35c00ff cmp ip, #255 ; 0xff + 1f21930: 1affffea bne 1f218e0 + 1f21934: e1a0e005 mov lr, r5 + 1f21938: e154000e cmp r4, lr + 1f2193c: e1a0300e mov r3, lr + 1f21940: e28e5001 add r5, lr, #1 + 1f21944: 8afffff7 bhi 1f21928 + 1f21948: e3a00000 mov r0, #0 + 1f2194c: e8bd8070 pop {r4, r5, r6, pc} + 1f21950: e5d3c001 ldrb ip, [r3, #1] + 1f21954: e20cc0c0 and ip, ip, #192 ; 0xc0 + 1f21958: e35c0040 cmp ip, #64 ; 0x40 + 1f2195c: 0a000010 beq 1f219a4 + 1f21960: e154000e cmp r4, lr + 1f21964: 8affffdf bhi 1f218e8 + 1f21968: e0802001 add r2, r0, r1 + 1f2196c: e2433001 sub r3, r3, #1 + 1f21970: e1500003 cmp r0, r3 + 1f21974: 01a03002 moveq r3, r2 + 1f21978: e5d3c000 ldrb ip, [r3] + 1f2197c: e35c00ff cmp ip, #255 ; 0xff + 1f21980: 0afffff9 beq 1f2196c + 1f21984: e2830001 add r0, r3, #1 + 1f21988: e1500002 cmp r0, r2 + 1f2198c: 38bd8070 popcc {r4, r5, r6, pc} + 1f21990: e2611000 rsb r1, r1, #0 + 1f21994: e0800001 add r0, r0, r1 + 1f21998: e1500002 cmp r0, r2 + 1f2199c: 2afffffc bcs 1f21994 + 1f219a0: e8bd8070 pop {r4, r5, r6, pc} + 1f219a4: e5d3c002 ldrb ip, [r3, #2] + 1f219a8: e20cc00f and ip, ip, #15 + 1f219ac: e35c0005 cmp ip, #5 + 1f219b0: 1affffea bne 1f21960 + 1f219b4: e5d3c003 ldrb ip, [r3, #3] + 1f219b8: e20cc0fc and ip, ip, #252 ; 0xfc + 1f219bc: e35c0028 cmp ip, #40 ; 0x28 + 1f219c0: 1affffe6 bne 1f21960 + 1f219c4: e0666003 rsb r6, r6, r3 + 1f219c8: e5826000 str r6, [r2] + 1f219cc: eaffffe5 b 1f21968 + +01f219d0 : + 1f219d0: e92d40f0 push {r4, r5, r6, r7, lr} + 1f219d4: e0804081 add r4, r0, r1, lsl #1 + 1f219d8: e3a03000 mov r3, #0 + 1f219dc: e1a0e000 mov lr, r0 + 1f219e0: e5823000 str r3, [r2] + 1f219e4: e244400a sub r4, r4, #10 + 1f219e8: ea000000 b 1f219f0 + 1f219ec: e1a0e003 mov lr, r3 + 1f219f0: e28e3001 add r3, lr, #1 + 1f219f4: e1540003 cmp r4, r3 + 1f219f8: 9a00000f bls 1f21a3c + 1f219fc: e553c001 ldrb ip, [r3, #-1] + 1f21a00: e20cc003 and ip, ip, #3 + 1f21a04: e35c0003 cmp ip, #3 + 1f21a08: 1afffff7 bne 1f219ec + 1f21a0c: e5d3c000 ldrb ip, [r3] + 1f21a10: e35c00ff cmp ip, #255 ; 0xff + 1f21a14: 1afffff4 bne 1f219ec + 1f21a18: e28ee002 add lr, lr, #2 + 1f21a1c: ea000002 b 1f21a2c + 1f21a20: e5d63000 ldrb r3, [r6] + 1f21a24: e35300ff cmp r3, #255 ; 0xff + 1f21a28: 1a000005 bne 1f21a44 + 1f21a2c: e154000e cmp r4, lr + 1f21a30: e1a0600e mov r6, lr + 1f21a34: e28ee001 add lr, lr, #1 + 1f21a38: 8afffff8 bhi 1f21a20 + 1f21a3c: e3a00000 mov r0, #0 + 1f21a40: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f21a44: e3a07000 mov r7, #0 + 1f21a48: e1a0e006 mov lr, r6 + 1f21a4c: ea000000 b 1f21a54 + 1f21a50: e1a0e003 mov lr, r3 + 1f21a54: e28e3001 add r3, lr, #1 + 1f21a58: e1540003 cmp r4, r3 + 1f21a5c: 9a00000f bls 1f21aa0 + 1f21a60: e553c001 ldrb ip, [r3, #-1] + 1f21a64: e20cc003 and ip, ip, #3 + 1f21a68: e35c0003 cmp ip, #3 + 1f21a6c: 1afffff7 bne 1f21a50 + 1f21a70: e5d3c000 ldrb ip, [r3] + 1f21a74: e35c00ff cmp ip, #255 ; 0xff + 1f21a78: 1afffff4 bne 1f21a50 + 1f21a7c: e28ee002 add lr, lr, #2 + 1f21a80: ea000003 b 1f21a94 + 1f21a84: e5de3000 ldrb r3, [lr] + 1f21a88: e35300ff cmp r3, #255 ; 0xff + 1f21a8c: 1a000016 bne 1f21aec + 1f21a90: e1a0e00c mov lr, ip + 1f21a94: e154000e cmp r4, lr + 1f21a98: e28ec001 add ip, lr, #1 + 1f21a9c: 8afffff8 bhi 1f21a84 + 1f21aa0: e3570000 cmp r7, #0 + 1f21aa4: e5827000 str r7, [r2] + 1f21aa8: 0affffe3 beq 1f21a3c + 1f21aac: e1a03005 mov r3, r5 + 1f21ab0: e0802001 add r2, r0, r1 + 1f21ab4: e2433001 sub r3, r3, #1 + 1f21ab8: e1500003 cmp r0, r3 + 1f21abc: 01a03002 moveq r3, r2 + 1f21ac0: e5d3c000 ldrb ip, [r3] + 1f21ac4: e35c00ff cmp ip, #255 ; 0xff + 1f21ac8: 0afffff9 beq 1f21ab4 + 1f21acc: e2830001 add r0, r3, #1 + 1f21ad0: e1500002 cmp r0, r2 + 1f21ad4: 38bd80f0 popcc {r4, r5, r6, r7, pc} + 1f21ad8: e2611000 rsb r1, r1, #0 + 1f21adc: e0800001 add r0, r0, r1 + 1f21ae0: e1500002 cmp r0, r2 + 1f21ae4: 2afffffc bcs 1f21adc + 1f21ae8: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f21aec: e066600e rsb r6, r6, lr + 1f21af0: e1560007 cmp r6, r7 + 1f21af4: 81a07006 movhi r7, r6 + 1f21af8: 81a0500e movhi r5, lr + 1f21afc: e1a0600e mov r6, lr + 1f21b00: eaffffd0 b 1f21a48 + +01f21b04 : + 1f21b04: e3a0c000 mov ip, #0 + 1f21b08: e2401001 sub r1, r0, #1 + 1f21b0c: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f21b10: e1a0200c mov r2, ip + 1f21b14: e280ea01 add lr, r0, #4096 ; 0x1000 + 1f21b18: ea000014 b 1f21b70 + 1f21b1c: e2130d07 ands r0, r3, #448 ; 0x1c0 + 1f21b20: 0a00001b beq 1f21b94 + 1f21b24: e21300e0 ands r0, r3, #224 ; 0xe0 + 1f21b28: 0a000019 beq 1f21b94 + 1f21b2c: e2130070 ands r0, r3, #112 ; 0x70 + 1f21b30: 0a000017 beq 1f21b94 + 1f21b34: e2130038 ands r0, r3, #56 ; 0x38 + 1f21b38: 0a000015 beq 1f21b94 + 1f21b3c: e213001c ands r0, r3, #28 + 1f21b40: 0a000013 beq 1f21b94 + 1f21b44: e213000e ands r0, r3, #14 + 1f21b48: 0a000011 beq 1f21b94 + 1f21b4c: e2133007 ands r3, r3, #7 + 1f21b50: 01a0c003 moveq ip, r3 + 1f21b54: 0a000002 beq 1f21b64 + 1f21b58: e28cc001 add ip, ip, #1 + 1f21b5c: e35c003f cmp ip, #63 ; 0x3f + 1f21b60: ca000011 bgt 1f21bac + 1f21b64: e2822001 add r2, r2, #1 + 1f21b68: e3520a02 cmp r2, #8192 ; 0x2000 + 1f21b6c: 0a00000c beq 1f21ba4 + 1f21b70: e3520000 cmp r2, #0 + 1f21b74: 0a00000e beq 1f21bb4 + 1f21b78: e5d13000 ldrb r3, [r1] + 1f21b7c: e5f10001 ldrb r0, [r1, #1]! + 1f21b80: e1a03403 lsl r3, r3, #8 + 1f21b84: e2033c03 and r3, r3, #768 ; 0x300 + 1f21b88: e1803003 orr r3, r0, r3 + 1f21b8c: e2130d0e ands r0, r3, #896 ; 0x380 + 1f21b90: 1affffe1 bne 1f21b1c + 1f21b94: e2822001 add r2, r2, #1 + 1f21b98: e1a0c000 mov ip, r0 + 1f21b9c: e3520a02 cmp r2, #8192 ; 0x2000 + 1f21ba0: 1afffff2 bne 1f21b70 + 1f21ba4: e3a00000 mov r0, #0 + 1f21ba8: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f21bac: e3a00001 mov r0, #1 + 1f21bb0: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f21bb4: e5de0fff ldrb r0, [lr, #4095] ; 0xfff + 1f21bb8: e5f13001 ldrb r3, [r1, #1]! + 1f21bbc: e1a00400 lsl r0, r0, #8 + 1f21bc0: e2000c03 and r0, r0, #768 ; 0x300 + 1f21bc4: e1803003 orr r3, r0, r3 + 1f21bc8: e3130d0e tst r3, #896 ; 0x380 + 1f21bcc: 1affffd2 bne 1f21b1c + 1f21bd0: e1a0c002 mov ip, r2 + 1f21bd4: e3a02001 mov r2, #1 + 1f21bd8: eaffffe6 b 1f21b78 + +01f21bdc : + 1f21bdc: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f21be0: e3a06000 mov r6, #0 + 1f21be4: e2414001 sub r4, r1, #1 + 1f21be8: e24dd901 sub sp, sp, #16384 ; 0x4000 + 1f21bec: e2817a01 add r7, r1, #4096 ; 0x1000 + 1f21bf0: e24dd010 sub sp, sp, #16 + 1f21bf4: e1a0e006 mov lr, r6 + 1f21bf8: e28dc901 add ip, sp, #16384 ; 0x4000 + 1f21bfc: e28cc028 add ip, ip, #40 ; 0x28 + 1f21c00: e59c5000 ldr r5, [ip] + 1f21c04: e2455096 sub r5, r5, #150 ; 0x96 + 1f21c08: ea000014 b 1f21c60 + 1f21c0c: e21c8d07 ands r8, ip, #448 ; 0x1c0 + 1f21c10: 0a00001b beq 1f21c84 + 1f21c14: e21c80e0 ands r8, ip, #224 ; 0xe0 + 1f21c18: 0a000019 beq 1f21c84 + 1f21c1c: e21c8070 ands r8, ip, #112 ; 0x70 + 1f21c20: 0a000017 beq 1f21c84 + 1f21c24: e21c8038 ands r8, ip, #56 ; 0x38 + 1f21c28: 0a000015 beq 1f21c84 + 1f21c2c: e21c801c ands r8, ip, #28 + 1f21c30: 0a000013 beq 1f21c84 + 1f21c34: e21c800e ands r8, ip, #14 + 1f21c38: 0a000011 beq 1f21c84 + 1f21c3c: e21cc007 ands ip, ip, #7 + 1f21c40: 01a0600c moveq r6, ip + 1f21c44: 0a000002 beq 1f21c54 + 1f21c48: e2866001 add r6, r6, #1 + 1f21c4c: e356003f cmp r6, #63 ; 0x3f + 1f21c50: ca000014 bgt 1f21ca8 + 1f21c54: e28ee001 add lr, lr, #1 + 1f21c58: e35e0a02 cmp lr, #8192 ; 0x2000 + 1f21c5c: 0a00000c beq 1f21c94 + 1f21c60: e35e0000 cmp lr, #0 + 1f21c64: 0a0000c4 beq 1f21f7c + 1f21c68: e5d4c000 ldrb ip, [r4] + 1f21c6c: e5f48001 ldrb r8, [r4, #1]! + 1f21c70: e1a0c40c lsl ip, ip, #8 + 1f21c74: e20ccc03 and ip, ip, #768 ; 0x300 + 1f21c78: e188c00c orr ip, r8, ip + 1f21c7c: e21c8d0e ands r8, ip, #896 ; 0x380 + 1f21c80: 1affffe1 bne 1f21c0c + 1f21c84: e28ee001 add lr, lr, #1 + 1f21c88: e1a06008 mov r6, r8 + 1f21c8c: e35e0a02 cmp lr, #8192 ; 0x2000 + 1f21c90: 1afffff2 bne 1f21c60 + 1f21c94: e3a04000 mov r4, #0 + 1f21c98: e1a00004 mov r0, r4 + 1f21c9c: e28dd901 add sp, sp, #16384 ; 0x4000 + 1f21ca0: e28dd010 add sp, sp, #16 + 1f21ca4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f21ca8: e1a06003 mov r6, r3 + 1f21cac: e1a07002 mov r7, r2 + 1f21cb0: e1a03001 mov r3, r1 + 1f21cb4: e3a02901 mov r2, #16384 ; 0x4000 + 1f21cb8: e3a01000 mov r1, #0 + 1f21cbc: e1a08000 mov r8, r0 + 1f21cc0: e28d0010 add r0, sp, #16 + 1f21cc4: e58d3000 str r3, [sp] + 1f21cc8: eb0074d3 bl 1f3f01c + 1f21ccc: e59d1000 ldr r1, [sp] + 1f21cd0: e3a02a02 mov r2, #8192 ; 0x2000 + 1f21cd4: e28d0010 add r0, sp, #16 + 1f21cd8: eb007448 bl 1f3ee00 + 1f21cdc: e28d3901 add r3, sp, #16384 ; 0x4000 + 1f21ce0: e283302c add r3, r3, #44 ; 0x2c + 1f21ce4: e28d1004 add r1, sp, #4 + 1f21ce8: e1a02005 mov r2, r5 + 1f21cec: e1a0000d mov r0, sp + 1f21cf0: e5933000 ldr r3, [r3] + 1f21cf4: ebfffdc5 bl 1f21410 + 1f21cf8: e28d2901 add r2, sp, #16384 ; 0x4000 + 1f21cfc: e89d0012 ldm sp, {r1, r4} + 1f21d00: e282202c add r2, r2, #44 ; 0x2c + 1f21d04: e0614004 rsb r4, r1, r4 + 1f21d08: e1550004 cmp r5, r4 + 1f21d0c: e5922000 ldr r2, [r2] + 1f21d10: 93a03000 movls r3, #0 + 1f21d14: 83a03001 movhi r3, #1 + 1f21d18: e1520004 cmp r2, r4 + 1f21d1c: 33833001 orrcc r3, r3, #1 + 1f21d20: e3530000 cmp r3, #0 + 1f21d24: 1a000048 bne 1f21e4c + 1f21d28: e1a02004 mov r2, r4 + 1f21d2c: e28d0010 add r0, sp, #16 + 1f21d30: eb007432 bl 1f3ee00 + 1f21d34: e28d3010 add r3, sp, #16 + 1f21d38: e1a02004 mov r2, r4 + 1f21d3c: e59d1000 ldr r1, [sp] + 1f21d40: e0830004 add r0, r3, r4 + 1f21d44: eb00742d bl 1f3ee00 + 1f21d48: e3560000 cmp r6, #0 + 1f21d4c: 1a000025 bne 1f21de8 + 1f21d50: e3540a02 cmp r4, #8192 ; 0x2000 + 1f21d54: 0a000046 beq 1f21e74 + 1f21d58: e28d3010 add r3, sp, #16 + 1f21d5c: e28d2008 add r2, sp, #8 + 1f21d60: e1a01004 mov r1, r4 + 1f21d64: e1a00003 mov r0, r3 + 1f21d68: ebfffebf bl 1f2186c + 1f21d6c: e28d3010 add r3, sp, #16 + 1f21d70: e1a01004 mov r1, r4 + 1f21d74: e28d200c add r2, sp, #12 + 1f21d78: e1a05000 mov r5, r0 + 1f21d7c: e1a00003 mov r0, r3 + 1f21d80: ebffff12 bl 1f219d0 + 1f21d84: e59d300c ldr r3, [sp, #12] + 1f21d88: e3002171 movw r2, #369 ; 0x171 + 1f21d8c: e1a01000 mov r1, r0 + 1f21d90: e1530002 cmp r3, r2 + 1f21d94: 8a000026 bhi 1f21e34 + 1f21d98: e59d2008 ldr r2, [sp, #8] + 1f21d9c: e3520000 cmp r2, #0 + 1f21da0: 1a000052 bne 1f21ef0 + 1f21da4: e3530000 cmp r3, #0 + 1f21da8: 1a00003c bne 1f21ea0 + 1f21dac: e1a01004 mov r1, r4 + 1f21db0: e28d0010 add r0, sp, #16 + 1f21db4: eb0006ba bl 1f238a4 + 1f21db8: e2505000 subs r5, r0, #0 + 1f21dbc: 0a000068 beq 1f21f64 + 1f21dc0: e1a01005 mov r1, r5 + 1f21dc4: e1a00008 mov r0, r8 + 1f21dc8: e1a02004 mov r2, r4 + 1f21dcc: eb00740b bl 1f3ee00 + 1f21dd0: e3a03006 mov r3, #6 + 1f21dd4: e5873000 str r3, [r7] + 1f21dd8: e1a00004 mov r0, r4 + 1f21ddc: e28dd901 add sp, sp, #16384 ; 0x4000 + 1f21de0: e28dd010 add sp, sp, #16 + 1f21de4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f21de8: e3560005 cmp r6, #5 + 1f21dec: 0a000031 beq 1f21eb8 + 1f21df0: e3560006 cmp r6, #6 + 1f21df4: 0a000055 beq 1f21f50 + 1f21df8: e3560003 cmp r6, #3 + 1f21dfc: 0a000047 beq 1f21f20 + 1f21e00: e3560004 cmp r6, #4 + 1f21e04: 0a000040 beq 1f21f0c + 1f21e08: e3560001 cmp r6, #1 + 1f21e0c: 0a000048 beq 1f21f34 + 1f21e10: e3560002 cmp r6, #2 + 1f21e14: 1affffcd bne 1f21d50 + 1f21e18: e28d3010 add r3, sp, #16 + 1f21e1c: e5876000 str r6, [r7] + 1f21e20: e28d2008 add r2, sp, #8 + 1f21e24: e1a01004 mov r1, r4 + 1f21e28: e1a00003 mov r0, r3 + 1f21e2c: ebfffe8e bl 1f2186c + 1f21e30: ea000024 b 1f21ec8 + 1f21e34: e3a03001 mov r3, #1 + 1f21e38: e1a00008 mov r0, r8 + 1f21e3c: e1a02004 mov r2, r4 + 1f21e40: e5873000 str r3, [r7] + 1f21e44: eb0073ed bl 1f3ee00 + 1f21e48: eaffffe2 b 1f21dd8 + 1f21e4c: e28d3901 add r3, sp, #16384 ; 0x4000 + 1f21e50: e28d1004 add r1, sp, #4 + 1f21e54: e283302c add r3, r3, #44 ; 0x2c + 1f21e58: e1a02005 mov r2, r5 + 1f21e5c: e1a0000d mov r0, sp + 1f21e60: e5933000 ldr r3, [r3] + 1f21e64: ebfffe10 bl 1f216ac + 1f21e68: e89d0012 ldm sp, {r1, r4} + 1f21e6c: e0614004 rsb r4, r1, r4 + 1f21e70: eaffffac b 1f21d28 + 1f21e74: e1a01004 mov r1, r4 + 1f21e78: e28d0010 add r0, sp, #16 + 1f21e7c: eb000688 bl 1f238a4 + 1f21e80: e2501000 subs r1, r0, #0 + 1f21e84: 0affffb3 beq 1f21d58 + 1f21e88: e1a00008 mov r0, r8 + 1f21e8c: e1a02004 mov r2, r4 + 1f21e90: eb0073da bl 1f3ee00 + 1f21e94: e3a03006 mov r3, #6 + 1f21e98: e5873000 str r3, [r7] + 1f21e9c: eaffffcd b 1f21dd8 + 1f21ea0: e1a00008 mov r0, r8 + 1f21ea4: e1a02004 mov r2, r4 + 1f21ea8: eb0073d4 bl 1f3ee00 + 1f21eac: e3a03001 mov r3, #1 + 1f21eb0: e5873000 str r3, [r7] + 1f21eb4: eaffffc7 b 1f21dd8 + 1f21eb8: e5876000 str r6, [r7] + 1f21ebc: e1a01004 mov r1, r4 + 1f21ec0: e28d0010 add r0, sp, #16 + 1f21ec4: eb000653 bl 1f23818 + 1f21ec8: e3500000 cmp r0, #0 + 1f21ecc: 0affff9f beq 1f21d50 + 1f21ed0: e1a01000 mov r1, r0 + 1f21ed4: e1a02004 mov r2, r4 + 1f21ed8: e1a00008 mov r0, r8 + 1f21edc: eb0073c7 bl 1f3ee00 + 1f21ee0: e1a00004 mov r0, r4 + 1f21ee4: e28dd901 add sp, sp, #16384 ; 0x4000 + 1f21ee8: e28dd010 add sp, sp, #16 + 1f21eec: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f21ef0: e3a03002 mov r3, #2 + 1f21ef4: e1a01005 mov r1, r5 + 1f21ef8: e1a00008 mov r0, r8 + 1f21efc: e1a02004 mov r2, r4 + 1f21f00: e5873000 str r3, [r7] + 1f21f04: eb0073bd bl 1f3ee00 + 1f21f08: eaffffb2 b 1f21dd8 + 1f21f0c: e5876000 str r6, [r7] + 1f21f10: e1a01004 mov r1, r4 + 1f21f14: e28d0010 add r0, sp, #16 + 1f21f18: eb000680 bl 1f23920 + 1f21f1c: eaffffe9 b 1f21ec8 + 1f21f20: e5876000 str r6, [r7] + 1f21f24: e1a01004 mov r1, r4 + 1f21f28: e28d0010 add r0, sp, #16 + 1f21f2c: eb00069c bl 1f239a4 + 1f21f30: eaffffe4 b 1f21ec8 + 1f21f34: e28d3010 add r3, sp, #16 + 1f21f38: e5876000 str r6, [r7] + 1f21f3c: e28d200c add r2, sp, #12 + 1f21f40: e1a01004 mov r1, r4 + 1f21f44: e1a00003 mov r0, r3 + 1f21f48: ebfffea0 bl 1f219d0 + 1f21f4c: eaffffdd b 1f21ec8 + 1f21f50: e5876000 str r6, [r7] + 1f21f54: e1a01004 mov r1, r4 + 1f21f58: e28d0010 add r0, sp, #16 + 1f21f5c: eb000650 bl 1f238a4 + 1f21f60: eaffffd8 b 1f21ec8 + 1f21f64: e28d1010 add r1, sp, #16 + 1f21f68: e1a00008 mov r0, r8 + 1f21f6c: e1a02004 mov r2, r4 + 1f21f70: eb0073a2 bl 1f3ee00 + 1f21f74: e5875000 str r5, [r7] + 1f21f78: eaffff96 b 1f21dd8 + 1f21f7c: e5d7cfff ldrb ip, [r7, #4095] ; 0xfff + 1f21f80: e5f48001 ldrb r8, [r4, #1]! + 1f21f84: e1a0c40c lsl ip, ip, #8 + 1f21f88: e20ccc03 and ip, ip, #768 ; 0x300 + 1f21f8c: e18cc008 orr ip, ip, r8 + 1f21f90: e31c0d0e tst ip, #896 ; 0x380 + 1f21f94: 1affff1c bne 1f21c0c + 1f21f98: e1a0600e mov r6, lr + 1f21f9c: e3a0e001 mov lr, #1 + 1f21fa0: eaffff30 b 1f21c68 + +01f21fa4 : + 1f21fa4: e2411002 sub r1, r1, #2 + 1f21fa8: e0801001 add r1, r0, r1 + 1f21fac: e1500001 cmp r0, r1 + 1f21fb0: e92d4030 push {r4, r5, lr} + 1f21fb4: e3a05000 mov r5, #0 + 1f21fb8: 2a000015 bcs 1f22014 + 1f21fbc: e2411001 sub r1, r1, #1 + 1f21fc0: e1a04005 mov r4, r5 + 1f21fc4: e240c001 sub ip, r0, #1 + 1f21fc8: ea000001 b 1f21fd4 + 1f21fcc: e15c0001 cmp ip, r1 + 1f21fd0: 0a00000f beq 1f22014 + 1f21fd4: e5fce001 ldrb lr, [ip, #1]! + 1f21fd8: e15e0003 cmp lr, r3 + 1f21fdc: 15c0e000 strbne lr, [r0] + 1f21fe0: 13a04000 movne r4, #0 + 1f21fe4: 12800001 addne r0, r0, #1 + 1f21fe8: 1afffff7 bne 1f21fcc + 1f21fec: e1520004 cmp r2, r4 + 1f21ff0: 035300ff cmpeq r3, #255 ; 0xff + 1f21ff4: 0a00000b beq 1f22028 + 1f21ff8: e1520004 cmp r2, r4 + 1f21ffc: 0a000006 beq 1f2201c + 1f22000: e5c03000 strb r3, [r0] + 1f22004: e2800001 add r0, r0, #1 + 1f22008: e15c0001 cmp ip, r1 + 1f2200c: e2844001 add r4, r4, #1 + 1f22010: 1affffef bne 1f21fd4 + 1f22014: e1a00005 mov r0, r5 + 1f22018: e8bd8030 pop {r4, r5, pc} + 1f2201c: e5dce002 ldrb lr, [ip, #2] + 1f22020: e35e00ff cmp lr, #255 ; 0xff + 1f22024: 1afffff5 bne 1f22000 + 1f22028: e2855001 add r5, r5, #1 + 1f2202c: eafffff5 b 1f22008 + +01f22030 : + 1f22030: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f22034: e1510002 cmp r1, r2 + 1f22038: e5dd7018 ldrb r7, [sp, #24] + 1f2203c: da000024 ble 1f220d4 + 1f22040: e2416002 sub r6, r1, #2 + 1f22044: e0806006 add r6, r0, r6 + 1f22048: e1500006 cmp r0, r6 + 1f2204c: 2a000020 bcs 1f220d4 + 1f22050: e3a08000 mov r8, #0 + 1f22054: e2466001 sub r6, r6, #1 + 1f22058: e1a05008 mov r5, r8 + 1f2205c: e240c001 sub ip, r0, #1 + 1f22060: e1a04000 mov r4, r0 + 1f22064: ea000001 b 1f22070 + 1f22068: e156000c cmp r6, ip + 1f2206c: 0a00000f beq 1f220b0 + 1f22070: e5fce001 ldrb lr, [ip, #1]! + 1f22074: e157000e cmp r7, lr + 1f22078: 15c4e000 strbne lr, [r4] + 1f2207c: 13a05000 movne r5, #0 + 1f22080: 12844001 addne r4, r4, #1 + 1f22084: 1afffff7 bne 1f22068 + 1f22088: e1530005 cmp r3, r5 + 1f2208c: 035700ff cmpeq r7, #255 ; 0xff + 1f22090: 0a000014 beq 1f220e8 + 1f22094: e1530005 cmp r3, r5 + 1f22098: 0a00000f beq 1f220dc + 1f2209c: e5c47000 strb r7, [r4] + 1f220a0: e2844001 add r4, r4, #1 + 1f220a4: e156000c cmp r6, ip + 1f220a8: e2855001 add r5, r5, #1 + 1f220ac: 1affffef bne 1f22070 + 1f220b0: e0681001 rsb r1, r8, r1 + 1f220b4: e1520001 cmp r2, r1 + 1f220b8: b3a0c000 movlt ip, #0 + 1f220bc: a3a0c001 movge ip, #1 + 1f220c0: e3580000 cmp r8, #0 + 1f220c4: c1a0800c movgt r8, ip + 1f220c8: d38c8001 orrle r8, ip, #1 + 1f220cc: e3580000 cmp r8, #0 + 1f220d0: 0affffda beq 1f22040 + 1f220d4: e1a00001 mov r0, r1 + 1f220d8: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f220dc: e5dce002 ldrb lr, [ip, #2] + 1f220e0: e35e00ff cmp lr, #255 ; 0xff + 1f220e4: 1affffec bne 1f2209c + 1f220e8: e2888001 add r8, r8, #1 + 1f220ec: eaffffec b 1f220a4 + +01f220f0 : + 1f220f0: e3520000 cmp r2, #0 + 1f220f4: da0000ec ble 1f224ac + 1f220f8: e200c007 and ip, r0, #7 + 1f220fc: e26cc000 rsb ip, ip, #0 + 1f22100: e20cc00f and ip, ip, #15 + 1f22104: e15c0002 cmp ip, r2 + 1f22108: 21a0c002 movcs ip, r2 + 1f2210c: e3520011 cmp r2, #17 + 1f22110: e92d40f0 push {r4, r5, r6, r7, lr} + 1f22114: d1a0c002 movle ip, r2 + 1f22118: ca0000dc bgt 1f22490 + 1f2211c: e5d03000 ldrb r3, [r0] + 1f22120: e35c0001 cmp ip, #1 + 1f22124: e24330ff sub r3, r3, #255 ; 0xff + 1f22128: e16f3f13 clz r3, r3 + 1f2212c: e1a032a3 lsr r3, r3, #5 + 1f22130: 0a0000d4 beq 1f22488 + 1f22134: e5d0e001 ldrb lr, [r0, #1] + 1f22138: e35e00ff cmp lr, #255 ; 0xff + 1f2213c: 02833001 addeq r3, r3, #1 + 1f22140: e35c0002 cmp ip, #2 + 1f22144: 0a0000cf beq 1f22488 + 1f22148: e5d0e002 ldrb lr, [r0, #2] + 1f2214c: e35e00ff cmp lr, #255 ; 0xff + 1f22150: 02833001 addeq r3, r3, #1 + 1f22154: e35c0003 cmp ip, #3 + 1f22158: 0a0000ca beq 1f22488 + 1f2215c: e5d0e003 ldrb lr, [r0, #3] + 1f22160: e35e00ff cmp lr, #255 ; 0xff + 1f22164: 02833001 addeq r3, r3, #1 + 1f22168: e35c0004 cmp ip, #4 + 1f2216c: 0a0000c5 beq 1f22488 + 1f22170: e5d0e004 ldrb lr, [r0, #4] + 1f22174: e35e00ff cmp lr, #255 ; 0xff + 1f22178: 02833001 addeq r3, r3, #1 + 1f2217c: e35c0005 cmp ip, #5 + 1f22180: 0a0000c0 beq 1f22488 + 1f22184: e5d0e005 ldrb lr, [r0, #5] + 1f22188: e35e00ff cmp lr, #255 ; 0xff + 1f2218c: 02833001 addeq r3, r3, #1 + 1f22190: e35c0006 cmp ip, #6 + 1f22194: 0a0000bb beq 1f22488 + 1f22198: e5d0e006 ldrb lr, [r0, #6] + 1f2219c: e35e00ff cmp lr, #255 ; 0xff + 1f221a0: 02833001 addeq r3, r3, #1 + 1f221a4: e35c0007 cmp ip, #7 + 1f221a8: 0a0000b6 beq 1f22488 + 1f221ac: e5d0e007 ldrb lr, [r0, #7] + 1f221b0: e35e00ff cmp lr, #255 ; 0xff + 1f221b4: 02833001 addeq r3, r3, #1 + 1f221b8: e35c0008 cmp ip, #8 + 1f221bc: 0a0000b1 beq 1f22488 + 1f221c0: e5d0e008 ldrb lr, [r0, #8] + 1f221c4: e35e00ff cmp lr, #255 ; 0xff + 1f221c8: 02833001 addeq r3, r3, #1 + 1f221cc: e35c0009 cmp ip, #9 + 1f221d0: 0a0000ac beq 1f22488 + 1f221d4: e5d0e009 ldrb lr, [r0, #9] + 1f221d8: e35e00ff cmp lr, #255 ; 0xff + 1f221dc: 02833001 addeq r3, r3, #1 + 1f221e0: e35c000a cmp ip, #10 + 1f221e4: 0a0000b2 beq 1f224b4 + 1f221e8: e5d0e00a ldrb lr, [r0, #10] + 1f221ec: e35e00ff cmp lr, #255 ; 0xff + 1f221f0: 02833001 addeq r3, r3, #1 + 1f221f4: e35c000b cmp ip, #11 + 1f221f8: 0a0000a2 beq 1f22488 + 1f221fc: e5d0e00b ldrb lr, [r0, #11] + 1f22200: e35e00ff cmp lr, #255 ; 0xff + 1f22204: 02833001 addeq r3, r3, #1 + 1f22208: e35c000c cmp ip, #12 + 1f2220c: 0a00009d beq 1f22488 + 1f22210: e5d0e00c ldrb lr, [r0, #12] + 1f22214: e35e00ff cmp lr, #255 ; 0xff + 1f22218: 02833001 addeq r3, r3, #1 + 1f2221c: e35c000d cmp ip, #13 + 1f22220: 0a000098 beq 1f22488 + 1f22224: e5d0e00d ldrb lr, [r0, #13] + 1f22228: e35e00ff cmp lr, #255 ; 0xff + 1f2222c: 02833001 addeq r3, r3, #1 + 1f22230: e35c000e cmp ip, #14 + 1f22234: 0a000093 beq 1f22488 + 1f22238: e5d0e00e ldrb lr, [r0, #14] + 1f2223c: e35e00ff cmp lr, #255 ; 0xff + 1f22240: 02833001 addeq r3, r3, #1 + 1f22244: e35c000f cmp ip, #15 + 1f22248: 0a00008e beq 1f22488 + 1f2224c: e5d0e00f ldrb lr, [r0, #15] + 1f22250: e35e00ff cmp lr, #255 ; 0xff + 1f22254: 02833001 addeq r3, r3, #1 + 1f22258: e35c0010 cmp ip, #16 + 1f2225c: 0a000089 beq 1f22488 + 1f22260: e5d0e010 ldrb lr, [r0, #16] + 1f22264: e3a04011 mov r4, #17 + 1f22268: e35e00ff cmp lr, #255 ; 0xff + 1f2226c: 02833001 addeq r3, r3, #1 + 1f22270: e152000c cmp r2, ip + 1f22274: 0a00007d beq 1f22470 + 1f22278: e06c6002 rsb r6, ip, r2 + 1f2227c: e2425001 sub r5, r2, #1 + 1f22280: e246e010 sub lr, r6, #16 + 1f22284: e06c5005 rsb r5, ip, r5 + 1f22288: e355000e cmp r5, #14 + 1f2228c: e1a0e22e lsr lr, lr, #4 + 1f22290: e28ee001 add lr, lr, #1 + 1f22294: e1a0520e lsl r5, lr, #4 + 1f22298: 9a00001d bls 1f22314 + 1f2229c: f2c00050 vmov.i32 q8, #0 ; 0x00000000 + 1f222a0: e080c00c add ip, r0, ip + 1f222a4: f3c7ee5f vmov.i8 q15, #255 ; 0xff + 1f222a8: e3a07000 mov r7, #0 + 1f222ac: f2c0ce51 vmov.i8 q14, #1 ; 0x01 + 1f222b0: f2c0a050 vmov.i32 q13, #0 ; 0x00000000 + 1f222b4: f46c4adf vld1.64 {d20-d21}, [ip :64] + 1f222b8: e2877001 add r7, r7, #1 + 1f222bc: e15e0007 cmp lr, r7 + 1f222c0: e28cc010 add ip, ip, #16 + 1f222c4: f34448fe vceq.i8 q10, q10, q15 + 1f222c8: f35c41fa vbsl q10, q14, q13 + 1f222cc: f2c82a34 vmovl.s8 q9, d20 + 1f222d0: f2c84a35 vmovl.s8 q10, d21 + 1f222d4: f2d08a32 vmovl.s16 q12, d18 + 1f222d8: f2d06a33 vmovl.s16 q11, d19 + 1f222dc: f2d02a34 vmovl.s16 q9, d20 + 1f222e0: f2d04a35 vmovl.s16 q10, d21 + 1f222e4: f26808e0 vadd.i32 q8, q12, q8 + 1f222e8: f26608e0 vadd.i32 q8, q11, q8 + 1f222ec: f26208e0 vadd.i32 q8, q9, q8 + 1f222f0: f26408e0 vadd.i32 q8, q10, q8 + 1f222f4: 8affffee bhi 1f222b4 + 1f222f8: f26008a1 vadd.i32 d16, d16, d17 + 1f222fc: e1560005 cmp r6, r5 + 1f22300: e0844005 add r4, r4, r5 + 1f22304: f2600bb0 vpadd.i32 d16, d16, d16 + 1f22308: ee10eb90 vmov.32 lr, d16[0] + 1f2230c: e083300e add r3, r3, lr + 1f22310: 0a000056 beq 1f22470 + 1f22314: e7d0e004 ldrb lr, [r0, r4] + 1f22318: e284c001 add ip, r4, #1 + 1f2231c: e35e00ff cmp lr, #255 ; 0xff + 1f22320: 02833001 addeq r3, r3, #1 + 1f22324: e15c0002 cmp ip, r2 + 1f22328: aa000050 bge 1f22470 + 1f2232c: e7d0e00c ldrb lr, [r0, ip] + 1f22330: e284c002 add ip, r4, #2 + 1f22334: e35e00ff cmp lr, #255 ; 0xff + 1f22338: 02833001 addeq r3, r3, #1 + 1f2233c: e152000c cmp r2, ip + 1f22340: da00004a ble 1f22470 + 1f22344: e7d0e00c ldrb lr, [r0, ip] + 1f22348: e284c003 add ip, r4, #3 + 1f2234c: e35e00ff cmp lr, #255 ; 0xff + 1f22350: 02833001 addeq r3, r3, #1 + 1f22354: e152000c cmp r2, ip + 1f22358: da000044 ble 1f22470 + 1f2235c: e7d0e00c ldrb lr, [r0, ip] + 1f22360: e284c004 add ip, r4, #4 + 1f22364: e35e00ff cmp lr, #255 ; 0xff + 1f22368: 02833001 addeq r3, r3, #1 + 1f2236c: e152000c cmp r2, ip + 1f22370: da00003e ble 1f22470 + 1f22374: e7d0e00c ldrb lr, [r0, ip] + 1f22378: e284c005 add ip, r4, #5 + 1f2237c: e35e00ff cmp lr, #255 ; 0xff + 1f22380: 02833001 addeq r3, r3, #1 + 1f22384: e152000c cmp r2, ip + 1f22388: da000038 ble 1f22470 + 1f2238c: e7d0e00c ldrb lr, [r0, ip] + 1f22390: e284c006 add ip, r4, #6 + 1f22394: e35e00ff cmp lr, #255 ; 0xff + 1f22398: 02833001 addeq r3, r3, #1 + 1f2239c: e152000c cmp r2, ip + 1f223a0: da000032 ble 1f22470 + 1f223a4: e7d0e00c ldrb lr, [r0, ip] + 1f223a8: e284c007 add ip, r4, #7 + 1f223ac: e35e00ff cmp lr, #255 ; 0xff + 1f223b0: 02833001 addeq r3, r3, #1 + 1f223b4: e152000c cmp r2, ip + 1f223b8: da00002c ble 1f22470 + 1f223bc: e7d0e00c ldrb lr, [r0, ip] + 1f223c0: e284c008 add ip, r4, #8 + 1f223c4: e35e00ff cmp lr, #255 ; 0xff + 1f223c8: 02833001 addeq r3, r3, #1 + 1f223cc: e152000c cmp r2, ip + 1f223d0: da000026 ble 1f22470 + 1f223d4: e7d0e00c ldrb lr, [r0, ip] + 1f223d8: e284c009 add ip, r4, #9 + 1f223dc: e35e00ff cmp lr, #255 ; 0xff + 1f223e0: 02833001 addeq r3, r3, #1 + 1f223e4: e152000c cmp r2, ip + 1f223e8: da000020 ble 1f22470 + 1f223ec: e7d0e00c ldrb lr, [r0, ip] + 1f223f0: e284c00a add ip, r4, #10 + 1f223f4: e35e00ff cmp lr, #255 ; 0xff + 1f223f8: 02833001 addeq r3, r3, #1 + 1f223fc: e152000c cmp r2, ip + 1f22400: da00001a ble 1f22470 + 1f22404: e7d0e00c ldrb lr, [r0, ip] + 1f22408: e284c00b add ip, r4, #11 + 1f2240c: e35e00ff cmp lr, #255 ; 0xff + 1f22410: 02833001 addeq r3, r3, #1 + 1f22414: e152000c cmp r2, ip + 1f22418: da000014 ble 1f22470 + 1f2241c: e7d0e00c ldrb lr, [r0, ip] + 1f22420: e284c00c add ip, r4, #12 + 1f22424: e35e00ff cmp lr, #255 ; 0xff + 1f22428: 02833001 addeq r3, r3, #1 + 1f2242c: e152000c cmp r2, ip + 1f22430: da00000e ble 1f22470 + 1f22434: e7d0e00c ldrb lr, [r0, ip] + 1f22438: e284c00d add ip, r4, #13 + 1f2243c: e35e00ff cmp lr, #255 ; 0xff + 1f22440: 02833001 addeq r3, r3, #1 + 1f22444: e152000c cmp r2, ip + 1f22448: da000008 ble 1f22470 + 1f2244c: e7d0e00c ldrb lr, [r0, ip] + 1f22450: e284c00e add ip, r4, #14 + 1f22454: e35e00ff cmp lr, #255 ; 0xff + 1f22458: 02833001 addeq r3, r3, #1 + 1f2245c: e152000c cmp r2, ip + 1f22460: da000002 ble 1f22470 + 1f22464: e7d0000c ldrb r0, [r0, ip] + 1f22468: e35000ff cmp r0, #255 ; 0xff + 1f2246c: 02833001 addeq r3, r3, #1 + 1f22470: e3530000 cmp r3, #0 + 1f22474: 0a00000a beq 1f224a4 + 1f22478: e1520003 cmp r2, r3 + 1f2247c: 03810080 orreq r0, r1, #128 ; 0x80 + 1f22480: 11a00001 movne r0, r1 + 1f22484: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f22488: e1a0400c mov r4, ip + 1f2248c: eaffff77 b 1f22270 + 1f22490: e35c0000 cmp ip, #0 + 1f22494: 01a0300c moveq r3, ip + 1f22498: 01a0400c moveq r4, ip + 1f2249c: 0affff75 beq 1f22278 + 1f224a0: eaffff1d b 1f2211c + 1f224a4: e3810040 orr r0, r1, #64 ; 0x40 + 1f224a8: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f224ac: e3810040 orr r0, r1, #64 ; 0x40 + 1f224b0: e12fff1e bx lr + 1f224b4: e3a0400a mov r4, #10 + 1f224b8: eaffff6c b 1f22270 + +01f224bc : + 1f224bc: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f224c0: e1520003 cmp r2, r3 + 1f224c4: e3a0c000 mov ip, #0 + 1f224c8: e24ddf43 sub sp, sp, #268 ; 0x10c + 1f224cc: e1a04002 mov r4, r2 + 1f224d0: e1a05000 mov r5, r0 + 1f224d4: e1a06001 mov r6, r1 + 1f224d8: e59de134 ldr lr, [sp, #308] ; 0x134 + 1f224dc: e5cec000 strb ip, [lr] + 1f224e0: 0a0000a9 beq 1f2278c + 1f224e4: e3530000 cmp r3, #0 + 1f224e8: c3a00001 movgt r0, #1 + 1f224ec: d3a00000 movle r0, #0 + 1f224f0: e3540000 cmp r4, #0 + 1f224f4: d3a00000 movle r0, #0 + 1f224f8: c2000001 andgt r0, r0, #1 + 1f224fc: e3500000 cmp r0, #0 + 1f22500: 1a000003 bne 1f22514 + 1f22504: e1a04000 mov r4, r0 + 1f22508: e1a00004 mov r0, r4 + 1f2250c: e28ddf43 add sp, sp, #268 ; 0x10c + 1f22510: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f22514: e3a08000 mov r8, #0 + 1f22518: e0861003 add r1, r6, r3 + 1f2251c: e244b001 sub fp, r4, #1 + 1f22520: e58d1004 str r1, [sp, #4] + 1f22524: e1a07008 mov r7, r8 + 1f22528: e0851004 add r1, r5, r4 + 1f2252c: e1a02008 mov r2, r8 + 1f22530: e1a0e008 mov lr, r8 + 1f22534: e1a0c008 mov ip, r8 + 1f22538: e243a001 sub sl, r3, #1 + 1f2253c: e58d1000 str r1, [sp] + 1f22540: e7d5100c ldrb r1, [r5, ip] + 1f22544: e7d6000e ldrb r0, [r6, lr] + 1f22548: e1510000 cmp r1, r0 + 1f2254c: 0a00007f beq 1f22750 + 1f22550: e35100ff cmp r1, #255 ; 0xff + 1f22554: 02822001 addeq r2, r2, #1 + 1f22558: 024ee001 subeq lr, lr, #1 + 1f2255c: 0a00007b beq 1f22750 + 1f22560: e35000ff cmp r0, #255 ; 0xff + 1f22564: 02822001 addeq r2, r2, #1 + 1f22568: 024cc001 subeq ip, ip, #1 + 1f2256c: 0a000077 beq 1f22750 + 1f22570: e15c000b cmp ip, fp + 1f22574: aa000011 bge 1f225c0 + 1f22578: e15e000a cmp lr, sl + 1f2257c: aa00000f bge 1f225c0 + 1f22580: e3110001 tst r1, #1 + 1f22584: 0a000005 beq 1f225a0 + 1f22588: e085900c add r9, r5, ip + 1f2258c: e5d99001 ldrb r9, [r9, #1] + 1f22590: e35900ff cmp r9, #255 ; 0xff + 1f22594: 02877001 addeq r7, r7, #1 + 1f22598: 024ee001 subeq lr, lr, #1 + 1f2259c: 0a00006b beq 1f22750 + 1f225a0: e3100001 tst r0, #1 + 1f225a4: 0a000005 beq 1f225c0 + 1f225a8: e086900e add r9, r6, lr + 1f225ac: e5d99001 ldrb r9, [r9, #1] + 1f225b0: e35900ff cmp r9, #255 ; 0xff + 1f225b4: 02877001 addeq r7, r7, #1 + 1f225b8: 024cc001 subeq ip, ip, #1 + 1f225bc: 0a000063 beq 1f22750 + 1f225c0: e35c0000 cmp ip, #0 + 1f225c4: 1085900c addne r9, r5, ip + 1f225c8: 059d9000 ldreq r9, [sp] + 1f225cc: e5599001 ldrb r9, [r9, #-1] + 1f225d0: e1a09409 lsl r9, r9, #8 + 1f225d4: e2099c03 and r9, r9, #768 ; 0x300 + 1f225d8: e1891001 orr r1, r9, r1 + 1f225dc: e3110d0e tst r1, #896 ; 0x380 + 1f225e0: 0a000057 beq 1f22744 + 1f225e4: e3110d07 tst r1, #448 ; 0x1c0 + 1f225e8: 0a000055 beq 1f22744 + 1f225ec: e31100e0 tst r1, #224 ; 0xe0 + 1f225f0: 0a000053 beq 1f22744 + 1f225f4: e3110070 tst r1, #112 ; 0x70 + 1f225f8: 0a000051 beq 1f22744 + 1f225fc: e3110038 tst r1, #56 ; 0x38 + 1f22600: 0a00004f beq 1f22744 + 1f22604: e311001c tst r1, #28 + 1f22608: 0a00004d beq 1f22744 + 1f2260c: e311000e tst r1, #14 + 1f22610: 0a00004b beq 1f22744 + 1f22614: e3110007 tst r1, #7 + 1f22618: 0a000049 beq 1f22744 + 1f2261c: e35e0000 cmp lr, #0 + 1f22620: 1a000056 bne 1f22780 + 1f22624: e59d1004 ldr r1, [sp, #4] + 1f22628: e5511001 ldrb r1, [r1, #-1] + 1f2262c: e1a01401 lsl r1, r1, #8 + 1f22630: e2011c03 and r1, r1, #768 ; 0x300 + 1f22634: e1810000 orr r0, r1, r0 + 1f22638: e3100d0e tst r0, #896 ; 0x380 + 1f2263c: 0a000040 beq 1f22744 + 1f22640: e3100d07 tst r0, #448 ; 0x1c0 + 1f22644: 0a00003e beq 1f22744 + 1f22648: e31000e0 tst r0, #224 ; 0xe0 + 1f2264c: 0a00003c beq 1f22744 + 1f22650: e3100070 tst r0, #112 ; 0x70 + 1f22654: 0a00003a beq 1f22744 + 1f22658: e3100038 tst r0, #56 ; 0x38 + 1f2265c: 0a000038 beq 1f22744 + 1f22660: e310001c tst r0, #28 + 1f22664: 0a000036 beq 1f22744 + 1f22668: e310000e tst r0, #14 + 1f2266c: 0a000034 beq 1f22744 + 1f22670: e3100007 tst r0, #7 + 1f22674: 0a000032 beq 1f22744 + 1f22678: e15c000b cmp ip, fp + 1f2267c: ba00003a blt 1f2276c + 1f22680: e15e000a cmp lr, sl + 1f22684: a3a0a000 movge sl, #0 + 1f22688: b3a0a001 movlt sl, #1 + 1f2268c: e35200ff cmp r2, #255 ; 0xff + 1f22690: d35800ff cmple r8, #255 ; 0xff + 1f22694: d3a04001 movle r4, #1 + 1f22698: c3a04000 movgt r4, #0 + 1f2269c: e3520000 cmp r2, #0 + 1f226a0: 0a000006 beq 1f226c0 + 1f226a4: e28d0008 add r0, sp, #8 + 1f226a8: e30f1428 movw r1, #62504 ; 0xf428 + 1f226ac: e34011f5 movt r1, #501 ; 0x1f5 + 1f226b0: eb00751c bl 1f3fb28 + 1f226b4: e28d1008 add r1, sp, #8 + 1f226b8: e59d0134 ldr r0, [sp, #308] ; 0x134 + 1f226bc: eb007553 bl 1f3fc10 + 1f226c0: e3570000 cmp r7, #0 + 1f226c4: 0a000007 beq 1f226e8 + 1f226c8: e1a02007 mov r2, r7 + 1f226cc: e28d0008 add r0, sp, #8 + 1f226d0: e30f1434 movw r1, #62516 ; 0xf434 + 1f226d4: e34011f5 movt r1, #501 ; 0x1f5 + 1f226d8: eb007512 bl 1f3fb28 + 1f226dc: e28d1008 add r1, sp, #8 + 1f226e0: e59d0134 ldr r0, [sp, #308] ; 0x134 + 1f226e4: eb007549 bl 1f3fc10 + 1f226e8: e3580000 cmp r8, #0 + 1f226ec: 0a000007 beq 1f22710 + 1f226f0: e1a02008 mov r2, r8 + 1f226f4: e28d0008 add r0, sp, #8 + 1f226f8: e30f1444 movw r1, #62532 ; 0xf444 + 1f226fc: e34011f5 movt r1, #501 ; 0x1f5 + 1f22700: eb007508 bl 1f3fb28 + 1f22704: e28d1008 add r1, sp, #8 + 1f22708: e59d0134 ldr r0, [sp, #308] ; 0x134 + 1f2270c: eb00753f bl 1f3fc10 + 1f22710: e35a0000 cmp sl, #0 + 1f22714: 0affff7b beq 1f22508 + 1f22718: e3a02001 mov r2, #1 + 1f2271c: e28d0008 add r0, sp, #8 + 1f22720: e30f1450 movw r1, #62544 ; 0xf450 + 1f22724: e34011f5 movt r1, #501 ; 0x1f5 + 1f22728: eb0074fe bl 1f3fb28 + 1f2272c: e28d1008 add r1, sp, #8 + 1f22730: e59d0134 ldr r0, [sp, #308] ; 0x134 + 1f22734: eb007535 bl 1f3fc10 + 1f22738: e1a00004 mov r0, r4 + 1f2273c: e28ddf43 add sp, sp, #268 ; 0x10c + 1f22740: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f22744: e2888001 add r8, r8, #1 + 1f22748: e28cc001 add ip, ip, #1 + 1f2274c: e28ee001 add lr, lr, #1 + 1f22750: e28cc001 add ip, ip, #1 + 1f22754: e28ee001 add lr, lr, #1 + 1f22758: e154000e cmp r4, lr + 1f2275c: c153000c cmpgt r3, ip + 1f22760: caffff76 bgt 1f22540 + 1f22764: e15c000b cmp ip, fp + 1f22768: aaffffc4 bge 1f22680 + 1f2276c: e15e000a cmp lr, sl + 1f22770: e3a0a001 mov sl, #1 + 1f22774: b3a04000 movlt r4, #0 + 1f22778: baffffc7 blt 1f2269c + 1f2277c: eaffffc2 b 1f2268c + 1f22780: e086100e add r1, r6, lr + 1f22784: e5511001 ldrb r1, [r1, #-1] + 1f22788: eaffffa7 b 1f2262c + 1f2278c: e58d3000 str r3, [sp] + 1f22790: eb00716e bl 1f3ed50 + 1f22794: e3500000 cmp r0, #0 + 1f22798: 159d3000 ldrne r3, [sp] + 1f2279c: 1affff50 bne 1f224e4 + 1f227a0: e3a04001 mov r4, #1 + 1f227a4: eaffff57 b 1f22508 + +01f227a8 : + 1f227a8: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f227ac: e3530000 cmp r3, #0 + 1f227b0: 13520000 cmpne r2, #0 + 1f227b4: e1a04000 mov r4, r0 + 1f227b8: ed2d8b10 vpush {d8-d15} + 1f227bc: e24ddfd7 sub sp, sp, #860 ; 0x35c + 1f227c0: e3a00000 mov r0, #0 + 1f227c4: 03a0c001 moveq ip, #1 + 1f227c8: 13a0c000 movne ip, #0 + 1f227cc: e59de3cc ldr lr, [sp, #972] ; 0x3cc + 1f227d0: e5ce0000 strb r0, [lr] + 1f227d4: e59de3c8 ldr lr, [sp, #968] ; 0x3c8 + 1f227d8: 0a0001ed beq 1f22f94 + 1f227dc: e0820003 add r0, r2, r3 + 1f227e0: e3500901 cmp r0, #16384 ; 0x4000 + 1f227e4: 0a0001ea beq 1f22f94 + 1f227e8: e08eefae add lr, lr, lr, lsr #31 + 1f227ec: e3050338 movw r0, #21304 ; 0x5338 + 1f227f0: e34001f6 movt r0, #502 ; 0x1f6 + 1f227f4: e58d0028 str r0, [sp, #40] ; 0x28 + 1f227f8: e1a0e0ce asr lr, lr, #1 + 1f227fc: e58de014 str lr, [sp, #20] + 1f22800: e19000de ldrsb r0, [r0, lr] + 1f22804: e3500000 cmp r0, #0 + 1f22808: da000220 ble 1f23090 + 1f2280c: e0942002 adds r2, r4, r2 + 1f22810: e58d203c str r2, [sp, #60] ; 0x3c + 1f22814: e1a0e002 mov lr, r2 + 1f22818: 03a02001 moveq r2, #1 + 1f2281c: 13a02000 movne r2, #0 + 1f22820: e1a00004 mov r0, r4 + 1f22824: e58d4040 str r4, [sp, #64] ; 0x40 + 1f22828: e1a0400c mov r4, ip + 1f2282c: e58dc02c str ip, [sp, #44] ; 0x2c + 1f22830: e1a0c002 mov ip, r2 + 1f22834: e150000e cmp r0, lr + 1f22838: 238cc001 orrcs ip, ip, #1 + 1f2283c: e0913003 adds r3, r1, r3 + 1f22840: e1a02001 mov r2, r1 + 1f22844: e58d3038 str r3, [sp, #56] ; 0x38 + 1f22848: e58d1044 str r1, [sp, #68] ; 0x44 + 1f2284c: e1a01003 mov r1, r3 + 1f22850: 03a03001 moveq r3, #1 + 1f22854: 13a03000 movne r3, #0 + 1f22858: e1a00003 mov r0, r3 + 1f2285c: e58dc034 str ip, [sp, #52] ; 0x34 + 1f22860: e1520001 cmp r2, r1 + 1f22864: 23800001 orrcs r0, r0, #1 + 1f22868: e58d4010 str r4, [sp, #16] + 1f2286c: e58d0030 str r0, [sp, #48] ; 0x30 + 1f22870: ea0001b1 b 1f22f3c + 1f22874: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f22878: e3530000 cmp r3, #0 + 1f2287c: 13a03000 movne r3, #0 + 1f22880: 158d3018 strne r3, [sp, #24] + 1f22884: 0a0001ed beq 1f23040 + 1f22888: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f2288c: e3530000 cmp r3, #0 + 1f22890: 0a0001da beq 1f23000 + 1f22894: e59d3018 ldr r3, [sp, #24] + 1f22898: e3a02000 mov r2, #0 + 1f2289c: e58d2024 str r2, [sp, #36] ; 0x24 + 1f228a0: e16f3f13 clz r3, r3 + 1f228a4: e1a032a3 lsr r3, r3, #5 + 1f228a8: e58d3020 str r3, [sp, #32] + 1f228ac: ed9dab56 vldr d10, [sp, #344] ; 0x158 + 1f228b0: ed9dbb58 vldr d11, [sp, #352] ; 0x160 + 1f228b4: f2c0ae51 vmov.i8 q13, #1 ; 0x01 + 1f228b8: f2c0c050 vmov.i32 q14, #0 ; 0x00000000 + 1f228bc: ed9d8b5a vldr d8, [sp, #360] ; 0x168 + 1f228c0: ed9d9b5c vldr d9, [sp, #368] ; 0x170 + 1f228c4: edddeb5e vldr d30, [sp, #376] ; 0x178 + 1f228c8: edddfb60 vldr d31, [sp, #384] ; 0x180 + 1f228cc: f34a687a vceq.i8 q11, q5, q13 + 1f228d0: ed9d0b62 vldr d0, [sp, #392] ; 0x188 + 1f228d4: ed9d1b64 vldr d1, [sp, #400] ; 0x190 + 1f228d8: f308687a vceq.i8 q3, q4, q13 + 1f228dc: f30a8158 veor q4, q5, q4 + 1f228e0: ed9dab66 vldr d10, [sp, #408] ; 0x198 + 1f228e4: ed9dbb68 vldr d11, [sp, #416] ; 0x1a0 + 1f228e8: f35a61fc vbsl q11, q13, q14 + 1f228ec: f34e48fa vceq.i8 q10, q15, q13 + 1f228f0: e5dd314a ldrb r3, [sp, #330] ; 0x14a + 1f228f4: f31a61fc vbsl q3, q13, q14 + 1f228f8: e5dd2152 ldrb r2, [sp, #338] ; 0x152 + 1f228fc: f300e87a vceq.i8 q7, q0, q13 + 1f22900: e1a05003 mov r5, r3 + 1f22904: f2c80a36 vmovl.s8 q8, d22 + 1f22908: e5dd314b ldrb r3, [sp, #331] ; 0x14b + 1f2290c: f2c86a37 vmovl.s8 q11, d23 + 1f22910: e58d201c str r2, [sp, #28] + 1f22914: f2884a16 vmovl.s8 q2, d6 + 1f22918: e2432001 sub r2, r3, #1 + 1f2291c: f2886a17 vmovl.s8 q3, d7 + 1f22920: e16f2f12 clz r2, r2 + 1f22924: f2902a30 vmovl.s16 q1, d16 + 1f22928: e5ddb14c ldrb fp, [sp, #332] ; 0x14c + 1f2292c: f2d02a31 vmovl.s16 q9, d17 + 1f22930: e1a022a2 lsr r2, r2, #5 + 1f22934: f2d08a36 vmovl.s16 q12, d22 + 1f22938: e5dda14d ldrb sl, [sp, #333] ; 0x14d + 1f2293c: f2d06a37 vmovl.s16 q11, d23 + 1f22940: e3550001 cmp r5, #1 + 1f22944: 02822001 addeq r2, r2, #1 + 1f22948: f35a41fc vbsl q10, q13, q14 + 1f2294c: e35b0001 cmp fp, #1 + 1f22950: 02822001 addeq r2, r2, #1 + 1f22954: f2622862 vadd.i32 q9, q1, q9 + 1f22958: e023300b eor r3, r3, fp + 1f2295c: f2902a14 vmovl.s16 q1, d4 + 1f22960: e5dd4153 ldrb r4, [sp, #339] ; 0x153 + 1f22964: f2904a15 vmovl.s16 q2, d5 + 1f22968: e5dde154 ldrb lr, [sp, #340] ; 0x154 + 1f2296c: f308817e veor q4, q4, q15 + 1f22970: e5ddc155 ldrb ip, [sp, #341] ; 0x155 + 1f22974: f26828e2 vadd.i32 q9, q12, q9 + 1f22978: e5dd0156 ldrb r0, [sp, #342] ; 0x156 + 1f2297c: f2d08a16 vmovl.s16 q12, d6 + 1f22980: e5dd914e ldrb r9, [sp, #334] ; 0x14e + 1f22984: f2906a17 vmovl.s16 q3, d7 + 1f22988: e5dd814f ldrb r8, [sp, #335] ; 0x14f + 1f2298c: f31ae1fc vbsl q7, q13, q14 + 1f22990: e5dd7150 ldrb r7, [sp, #336] ; 0x150 + 1f22994: f26608e2 vadd.i32 q8, q11, q9 + 1f22998: e5dd6151 ldrb r6, [sp, #337] ; 0x151 + 1f2299c: f2c82a34 vmovl.s8 q9, d20 + 1f229a0: e5dd1157 ldrb r1, [sp, #343] ; 0x157 + 1f229a4: f2c84a35 vmovl.s8 q10, d21 + 1f229a8: e35a0001 cmp sl, #1 + 1f229ac: 02822001 addeq r2, r2, #1 + 1f229b0: f2c86a1e vmovl.s8 q11, d14 + 1f229b4: e023300a eor r3, r3, sl + 1f229b8: f2620860 vadd.i32 q8, q1, q8 + 1f229bc: e59da01c ldr sl, [sp, #28] + 1f229c0: f2902a32 vmovl.s16 q1, d18 + 1f229c4: e3590001 cmp r9, #1 + 1f229c8: 02822001 addeq r2, r2, #1 + 1f229cc: f2d0ea33 vmovl.s16 q15, d19 + 1f229d0: e0233009 eor r3, r3, r9 + 1f229d4: f3080150 veor q0, q4, q0 + 1f229d8: e3580001 cmp r8, #1 + 1f229dc: 02822001 addeq r2, r2, #1 + 1f229e0: f2640860 vadd.i32 q8, q2, q8 + 1f229e4: e0233008 eor r3, r3, r8 + 1f229e8: f2904a34 vmovl.s16 q2, d20 + 1f229ec: e3570001 cmp r7, #1 + 1f229f0: 02822001 addeq r2, r2, #1 + 1f229f4: f2d04a35 vmovl.s16 q10, d21 + 1f229f8: e0233007 eor r3, r3, r7 + 1f229fc: f300815a veor q4, q0, q5 + 1f22a00: ed9d0b6e vldr d0, [sp, #440] ; 0x1b8 + 1f22a04: ed9d1b70 vldr d1, [sp, #448] ; 0x1c0 + 1f22a08: f26808e0 vadd.i32 q8, q12, q8 + 1f22a0c: e3560001 cmp r6, #1 + 1f22a10: 02822001 addeq r2, r2, #1 + 1f22a14: f2d08a36 vmovl.s16 q12, d22 + 1f22a18: e0233006 eor r3, r3, r6 + 1f22a1c: f30aa87a vceq.i8 q5, q5, q13 + 1f22a20: e35a0001 cmp sl, #1 + 1f22a24: 02822001 addeq r2, r2, #1 + 1f22a28: f288ea1f vmovl.s8 q7, d15 + 1f22a2c: e023300a eor r3, r3, sl + 1f22a30: f2660860 vadd.i32 q8, q3, q8 + 1f22a34: e3540001 cmp r4, #1 + 1f22a38: 02822001 addeq r2, r2, #1 + 1f22a3c: f2d06a37 vmovl.s16 q11, d23 + 1f22a40: e0233004 eor r3, r3, r4 + 1f22a44: e35e0001 cmp lr, #1 + 1f22a48: 02822001 addeq r2, r2, #1 + 1f22a4c: e023300e eor r3, r3, lr + 1f22a50: f2906a1e vmovl.s16 q3, d14 + 1f22a54: e35c0001 cmp ip, #1 + 1f22a58: 02822001 addeq r2, r2, #1 + 1f22a5c: f2620860 vadd.i32 q8, q1, q8 + 1f22a60: ed9d2b6a vldr d2, [sp, #424] ; 0x1a8 + 1f22a64: ed9d3b6c vldr d3, [sp, #432] ; 0x1b0 + 1f22a68: f290ea1f vmovl.s16 q7, d15 + 1f22a6c: e023300c eor r3, r3, ip + 1f22a70: e3500001 cmp r0, #1 + 1f22a74: 02822001 addeq r2, r2, #1 + 1f22a78: e0233000 eor r3, r3, r0 + 1f22a7c: e0233001 eor r3, r3, r1 + 1f22a80: e3510001 cmp r1, #1 + 1f22a84: 11a01002 movne r1, r2 + 1f22a88: 02821001 addeq r1, r2, #1 + 1f22a8c: f26e28e0 vadd.i32 q9, q15, q8 + 1f22a90: f26a015a vorr q8, q5, q5 + 1f22a94: f342e87a vceq.i8 q15, q1, q13 + 1f22a98: f3088152 veor q4, q4, q1 + 1f22a9c: f2642862 vadd.i32 q9, q2, q9 + 1f22aa0: f35a01fc vbsl q8, q13, q14 + 1f22aa4: f35ae1fc vbsl q15, q13, q14 + 1f22aa8: f3088150 veor q4, q4, q0 + 1f22aac: f26428e2 vadd.i32 q9, q10, q9 + 1f22ab0: f2884a30 vmovl.s8 q2, d16 + 1f22ab4: f2c80a31 vmovl.s8 q8, d17 + 1f22ab8: f26828e2 vadd.i32 q9, q12, q9 + 1f22abc: f2d04a14 vmovl.s16 q10, d4 + 1f22ac0: f340887a vceq.i8 q12, q0, q13 + 1f22ac4: f2902a15 vmovl.s16 q1, d5 + 1f22ac8: f26628e2 vadd.i32 q9, q11, q9 + 1f22acc: f290ca30 vmovl.s16 q6, d16 + 1f22ad0: f35a81fc vbsl q12, q13, q14 + 1f22ad4: f290aa31 vmovl.s16 q5, d17 + 1f22ad8: f2662862 vadd.i32 q9, q3, q9 + 1f22adc: f2c80a3e vmovl.s8 q8, d30 + 1f22ae0: f2c8ea3f vmovl.s8 q15, d31 + 1f22ae4: f26e2862 vadd.i32 q9, q7, q9 + 1f22ae8: f2906a30 vmovl.s16 q3, d16 + 1f22aec: f2d06a31 vmovl.s16 q11, d17 + 1f22af0: f2c80a38 vmovl.s8 q8, d24 + 1f22af4: f26428e2 vadd.i32 q9, q10, q9 + 1f22af8: eddd4b72 vldr d20, [sp, #456] ; 0x1c8 + 1f22afc: eddd5b74 vldr d21, [sp, #464] ; 0x1d0 + 1f22b00: f2900a3e vmovl.s16 q0, d30 + 1f22b04: f2d0ea3f vmovl.s16 q15, d31 + 1f22b08: f2c88a39 vmovl.s8 q12, d25 + 1f22b0c: f2224862 vadd.i32 q2, q1, q9 + 1f22b10: f304e8fa vceq.i8 q7, q10, q13 + 1f22b14: f2d02a30 vmovl.s16 q9, d16 + 1f22b18: f3088174 veor q4, q4, q10 + 1f22b1c: f22c2844 vadd.i32 q1, q6, q2 + 1f22b20: f2d04a31 vmovl.s16 q10, d17 + 1f22b24: f22e415e vorr q2, q7, q7 + 1f22b28: f290ea38 vmovl.s16 q7, d24 + 1f22b2c: f26a0842 vadd.i32 q8, q5, q1 + 1f22b30: f2d08a39 vmovl.s16 q12, d25 + 1f22b34: f31a41fc vbsl q2, q13, q14 + 1f22b38: f2660860 vadd.i32 q8, q3, q8 + 1f22b3c: ed9d6b76 vldr d6, [sp, #472] ; 0x1d8 + 1f22b40: ed9d7b78 vldr d7, [sp, #480] ; 0x1e0 + 1f22b44: f2882a14 vmovl.s8 q1, d4 + 1f22b48: f2884a15 vmovl.s8 q2, d5 + 1f22b4c: f26608e0 vadd.i32 q8, q11, q8 + 1f22b50: f3088156 veor q4, q4, q3 + 1f22b54: f2d06a12 vmovl.s16 q11, d2 + 1f22b58: f306687a vceq.i8 q3, q3, q13 + 1f22b5c: f2600860 vadd.i32 q8, q0, q8 + 1f22b60: f2902a13 vmovl.s16 q1, d3 + 1f22b64: f2900a14 vmovl.s16 q0, d4 + 1f22b68: f31a61fc vbsl q3, q13, q14 + 1f22b6c: f26e08e0 vadd.i32 q8, q15, q8 + 1f22b70: f2904a15 vmovl.s16 q2, d5 + 1f22b74: f2c8ea16 vmovl.s8 q15, d6 + 1f22b78: f26208e0 vadd.i32 q8, q9, q8 + 1f22b7c: eddd2b98 vldr d18, [sp, #608] ; 0x260 + 1f22b80: eddd3b9a vldr d19, [sp, #616] ; 0x268 + 1f22b84: f2886a17 vmovl.s8 q3, d7 + 1f22b88: f290ca3e vmovl.s16 q6, d30 + 1f22b8c: f26408e0 vadd.i32 q8, q10, q8 + 1f22b90: f2d0ea3f vmovl.s16 q15, d31 + 1f22b94: f26e4860 vadd.i32 q10, q7, q8 + 1f22b98: eddd0b9c vldr d16, [sp, #624] ; 0x270 + 1f22b9c: eddd1b9e vldr d17, [sp, #632] ; 0x278 + 1f22ba0: f26848e4 vadd.i32 q10, q12, q10 + 1f22ba4: f302a1f0 veor q5, q9, q8 + 1f22ba8: eddd2ba0 vldr d18, [sp, #640] ; 0x280 + 1f22bac: eddd3ba2 vldr d19, [sp, #648] ; 0x288 + 1f22bb0: eddd0ba4 vldr d16, [sp, #656] ; 0x290 + 1f22bb4: eddd1ba6 vldr d17, [sp, #664] ; 0x298 + 1f22bb8: f26688e4 vadd.i32 q12, q11, q10 + 1f22bbc: eddd6ba8 vldr d22, [sp, #672] ; 0x2a0 + 1f22bc0: eddd7baa vldr d23, [sp, #680] ; 0x2a8 + 1f22bc4: f30aa172 veor q5, q5, q9 + 1f22bc8: eddd4bac vldr d20, [sp, #688] ; 0x2b0 + 1f22bcc: eddd5bae vldr d21, [sp, #696] ; 0x2b8 + 1f22bd0: f2628868 vadd.i32 q12, q1, q12 + 1f22bd4: eddd2bb0 vldr d18, [sp, #704] ; 0x2c0 + 1f22bd8: eddd3bb2 vldr d19, [sp, #712] ; 0x2c8 + 1f22bdc: f30aa170 veor q5, q5, q8 + 1f22be0: eddd0bb4 vldr d16, [sp, #720] ; 0x2d0 + 1f22be4: eddd1bb6 vldr d17, [sp, #728] ; 0x2d8 + 1f22be8: f2202868 vadd.i32 q1, q0, q12 + 1f22bec: ed9deb7a vldr d14, [sp, #488] ; 0x1e8 + 1f22bf0: ed9dfb7c vldr d15, [sp, #496] ; 0x1f0 + 1f22bf4: f34a6176 veor q11, q5, q11 + 1f22bf8: eddd8bb8 vldr d24, [sp, #736] ; 0x2e0 + 1f22bfc: eddd9bba vldr d25, [sp, #744] ; 0x2e8 + 1f22c00: f224a842 vadd.i32 q5, q2, q1 + 1f22c04: f2902a16 vmovl.s16 q1, d6 + 1f22c08: e5ddc253 ldrb ip, [sp, #595] ; 0x253 + 1f22c0c: f34641f4 veor q10, q11, q10 + 1f22c10: e5dd2254 ldrb r2, [sp, #596] ; 0x254 + 1f22c14: f30e087a vceq.i8 q0, q7, q13 + 1f22c18: e5dd0255 ldrb r0, [sp, #597] ; 0x255 + 1f22c1c: f26c684a vadd.i32 q11, q6, q5 + 1f22c20: ed9dcb7e vldr d12, [sp, #504] ; 0x1f8 + 1f22c24: ed9ddb80 vldr d13, [sp, #512] ; 0x200 + 1f22c28: f2904a17 vmovl.s16 q2, d7 + 1f22c2c: e022200c eor r2, r2, ip + 1f22c30: f308815e veor q4, q4, q7 + 1f22c34: e5ddc256 ldrb ip, [sp, #598] ; 0x256 + 1f22c38: e0222000 eor r2, r2, r0 + 1f22c3c: e5dd0257 ldrb r0, [sp, #599] ; 0x257 + 1f22c40: f22e68e6 vadd.i32 q3, q15, q11 + 1f22c44: eddd6b82 vldr d22, [sp, #520] ; 0x208 + 1f22c48: eddd7b84 vldr d23, [sp, #528] ; 0x210 + 1f22c4c: f260e150 vorr q15, q0, q0 + 1f22c50: e022200c eor r2, r2, ip + 1f22c54: f30401f2 veor q0, q10, q9 + 1f22c58: e5ddc258 ldrb ip, [sp, #600] ; 0x258 + 1f22c5c: f34c287a vceq.i8 q9, q6, q13 + 1f22c60: e0222000 eor r2, r2, r0 + 1f22c64: f2226846 vadd.i32 q3, q1, q3 + 1f22c68: e5dd0259 ldrb r0, [sp, #601] ; 0x259 + 1f22c6c: f35ae1fc vbsl q15, q13, q14 + 1f22c70: e022200c eor r2, r2, ip + 1f22c74: f3400170 veor q8, q0, q8 + 1f22c78: e5ddc25a ldrb ip, [sp, #602] ; 0x25a + 1f22c7c: f35a21fc vbsl q9, q13, q14 + 1f22c80: e0222000 eor r2, r2, r0 + 1f22c84: f2246846 vadd.i32 q3, q2, q3 + 1f22c88: e5dd025b ldrb r0, [sp, #603] ; 0x25b + 1f22c8c: f2c84a3e vmovl.s8 q10, d30 + 1f22c90: e022200c eor r2, r2, ip + 1f22c94: f2c8ea3f vmovl.s8 q15, d31 + 1f22c98: e5ddc25c ldrb ip, [sp, #604] ; 0x25c + 1f22c9c: f34081f8 veor q12, q8, q12 + 1f22ca0: e0222000 eor r2, r2, r0 + 1f22ca4: f308815c veor q4, q4, q6 + 1f22ca8: e5dd025d ldrb r0, [sp, #605] ; 0x25d + 1f22cac: f2904a34 vmovl.s16 q2, d20 + 1f22cb0: e022200c eor r2, r2, ip + 1f22cb4: f2902a35 vmovl.s16 q1, d21 + 1f22cb8: e5dde25e ldrb lr, [sp, #606] ; 0x25e + 1f22cbc: f2900a3e vmovl.s16 q0, d30 + 1f22cc0: e0222000 eor r2, r2, r0 + 1f22cc4: f2d0ea3f vmovl.s16 q15, d31 + 1f22cc8: e5dd425f ldrb r4, [sp, #607] ; 0x25f + 1f22ccc: f2246846 vadd.i32 q3, q2, q3 + 1f22cd0: e5ddc248 ldrb ip, [sp, #584] ; 0x248 + 1f22cd4: f2884a32 vmovl.s8 q2, d18 + 1f22cd8: e022000e eor r0, r2, lr + 1f22cdc: f2c82a33 vmovl.s8 q9, d19 + 1f22ce0: e5dd2350 ldrb r2, [sp, #848] ; 0x350 + 1f22ce4: f3088176 veor q4, q4, q11 + 1f22ce8: e020e004 eor lr, r0, r4 + 1f22cec: f2624846 vadd.i32 q10, q1, q3 + 1f22cf0: e023300c eor r3, r3, ip + 1f22cf4: f30668fa vceq.i8 q3, q11, q13 + 1f22cf8: e02ee002 eor lr, lr, r2 + 1f22cfc: f2902a14 vmovl.s16 q1, d4 + 1f22d00: e0254003 eor r4, r5, r3 + 1f22d04: f2904a15 vmovl.s16 q2, d5 + 1f22d08: e5dd0252 ldrb r0, [sp, #594] ; 0x252 + 1f22d0c: f2604864 vadd.i32 q10, q0, q10 + 1f22d10: ed9d0b86 vldr d0, [sp, #536] ; 0x218 + 1f22d14: ed9d1b88 vldr d1, [sp, #544] ; 0x220 + 1f22d18: f31a61fc vbsl q3, q13, q14 + 1f22d1c: e02ee000 eor lr, lr, r0 + 1f22d20: f290aa32 vmovl.s16 q5, d18 + 1f22d24: f2d00a33 vmovl.s16 q8, d19 + 1f22d28: f26e48e4 vadd.i32 q10, q15, q10 + 1f22d2c: f2c82a16 vmovl.s8 q9, d6 + 1f22d30: f2886a17 vmovl.s8 q3, d7 + 1f22d34: f262e864 vadd.i32 q15, q1, q10 + 1f22d38: f2d04a33 vmovl.s16 q10, d19 + 1f22d3c: f290ca16 vmovl.s16 q6, d6 + 1f22d40: f2906a17 vmovl.s16 q3, d7 + 1f22d44: f224286e vadd.i32 q1, q2, q15 + 1f22d48: f2904a32 vmovl.s16 q2, d18 + 1f22d4c: f340e87a vceq.i8 q15, q0, q13 + 1f22d50: f3080150 veor q0, q4, q0 + 1f22d54: f26a2842 vadd.i32 q9, q5, q1 + 1f22d58: ed9d2b8a vldr d2, [sp, #552] ; 0x228 + 1f22d5c: ed9d3b8c vldr d3, [sp, #560] ; 0x230 + 1f22d60: f35ae1fc vbsl q15, q13, q14 + 1f22d64: f26028e2 vadd.i32 q9, q8, q9 + 1f22d68: eddd0bbc vldr d16, [sp, #752] ; 0x2f0 + 1f22d6c: eddd1bbe vldr d17, [sp, #760] ; 0x2f8 + 1f22d70: f2c86a3e vmovl.s8 q11, d30 + 1f22d74: f2c8ea3f vmovl.s8 q15, d31 + 1f22d78: f2642862 vadd.i32 q9, q2, q9 + 1f22d7c: f34881f0 veor q12, q12, q8 + 1f22d80: eddd0bc0 vldr d16, [sp, #768] ; 0x300 + 1f22d84: eddd1bc2 vldr d17, [sp, #776] ; 0x308 + 1f22d88: f290aa36 vmovl.s16 q5, d22 + 1f22d8c: f2904a37 vmovl.s16 q2, d23 + 1f22d90: f26428e2 vadd.i32 q9, q10, q9 + 1f22d94: f26c4862 vadd.i32 q10, q6, q9 + 1f22d98: f308c1f0 veor q6, q12, q8 + 1f22d9c: eddd0bc4 vldr d16, [sp, #784] ; 0x310 + 1f22da0: eddd1bc6 vldr d17, [sp, #792] ; 0x318 + 1f22da4: f342287a vceq.i8 q9, q1, q13 + 1f22da8: f2d08a3e vmovl.s16 q12, d30 + 1f22dac: f2664864 vadd.i32 q10, q3, q10 + 1f22db0: f2d0ea3f vmovl.s16 q15, d31 + 1f22db4: f30cc170 veor q6, q6, q8 + 1f22db8: f35a21fc vbsl q9, q13, q14 + 1f22dbc: f22a6864 vadd.i32 q3, q5, q10 + 1f22dc0: eddd4bc8 vldr d20, [sp, #800] ; 0x320 + 1f22dc4: eddd5bca vldr d21, [sp, #808] ; 0x328 + 1f22dc8: f3002152 veor q1, q0, q1 + 1f22dcc: f2c80a32 vmovl.s8 q8, d18 + 1f22dd0: f2646846 vadd.i32 q11, q2, q3 + 1f22dd4: ed9d6b8e vldr d6, [sp, #568] ; 0x238 + 1f22dd8: ed9d7b90 vldr d7, [sp, #576] ; 0x240 + 1f22ddc: f30cc174 veor q6, q6, q10 + 1f22de0: eddd4bcc vldr d20, [sp, #816] ; 0x330 + 1f22de4: eddd5bce vldr d21, [sp, #824] ; 0x338 + 1f22de8: f2c82a33 vmovl.s8 q9, d19 + 1f22dec: f26868e6 vadd.i32 q11, q12, q11 + 1f22df0: f2d08a30 vmovl.s16 q12, d16 + 1f22df4: f26e68e6 vadd.i32 q11, q15, q11 + 1f22df8: f34ce174 veor q15, q6, q10 + 1f22dfc: eddd4bd0 vldr d20, [sp, #832] ; 0x340 + 1f22e00: eddd5bd2 vldr d21, [sp, #840] ; 0x348 + 1f22e04: f26868e6 vadd.i32 q11, q12, q11 + 1f22e08: f2d08a31 vmovl.s16 q12, d17 + 1f22e0c: f346087a vceq.i8 q8, q3, q13 + 1f22e10: f34ee1f4 veor q15, q15, q10 + 1f22e14: f3066152 veor q3, q3, q1 + 1f22e18: f2d04a32 vmovl.s16 q10, d18 + 1f22e1c: f35a01fc vbsl q8, q13, q14 + 1f22e20: f26868e6 vadd.i32 q11, q12, q11 + 1f22e24: f2f6a86c vext.8 q13, q3, q14, #8 + 1f22e28: f2fe88ec vext.8 q12, q15, q14, #8 + 1f22e2c: f26468e6 vadd.i32 q11, q10, q11 + 1f22e30: f2d04a33 vmovl.s16 q10, d19 + 1f22e34: f2c82a30 vmovl.s8 q9, d16 + 1f22e38: f306617a veor q3, q3, q13 + 1f22e3c: f34e81f8 veor q12, q15, q12 + 1f22e40: f26448e6 vadd.i32 q10, q10, q11 + 1f22e44: f2d06a32 vmovl.s16 q11, d18 + 1f22e48: f2f6e46c vext.8 q15, q3, q14, #4 + 1f22e4c: f2f8a4ec vext.8 q13, q12, q14, #4 + 1f22e50: f2c80a31 vmovl.s8 q8, d17 + 1f22e54: f26668e4 vadd.i32 q11, q11, q10 + 1f22e58: f2d02a33 vmovl.s16 q9, d19 + 1f22e5c: f34881fa veor q12, q12, q13 + 1f22e60: f346e17e veor q15, q3, q15 + 1f22e64: f2d04a30 vmovl.s16 q10, d16 + 1f22e68: f26228e6 vadd.i32 q9, q9, q11 + 1f22e6c: f2f862ec vext.8 q11, q12, q14, #2 + 1f22e70: f2fea2ec vext.8 q13, q15, q14, #2 + 1f22e74: f2d00a31 vmovl.s16 q8, d17 + 1f22e78: f26428e2 vadd.i32 q9, q10, q9 + 1f22e7c: f34841f6 veor q10, q12, q11 + 1f22e80: f34ea1fa veor q13, q15, q13 + 1f22e84: f26008e2 vadd.i32 q8, q8, q9 + 1f22e88: f2fa21ec vext.8 q9, q13, q14, #1 + 1f22e8c: f2f4c1ec vext.8 q14, q10, q14, #1 + 1f22e90: f26008a1 vadd.i32 d16, d16, d17 + 1f22e94: f34aa1f2 veor q13, q13, q9 + 1f22e98: f34441fc veor q10, q10, q14 + 1f22e9c: f2600bb0 vpadd.i32 d16, d16, d16 + 1f22ea0: eeda3b90 vmov.u8 r3, d26[0] + 1f22ea4: eed42b90 vmov.u8 r2, d20[0] + 1f22ea8: ee100b90 vmov.32 r0, d16[0] + 1f22eac: e0233004 eor r3, r3, r4 + 1f22eb0: e022200e eor r2, r2, lr + 1f22eb4: e59de020 ldr lr, [sp, #32] + 1f22eb8: e6ef3073 uxtb r3, r3 + 1f22ebc: e0801001 add r1, r0, r1 + 1f22ec0: e6ef2072 uxtb r2, r2 + 1f22ec4: e35c0001 cmp ip, #1 + 1f22ec8: 02811001 addeq r1, r1, #1 + 1f22ecc: e1520003 cmp r2, r3 + 1f22ed0: 13a0e000 movne lr, #0 + 1f22ed4: 020ee001 andeq lr, lr, #1 + 1f22ed8: e35e0000 cmp lr, #0 + 1f22edc: 1a000030 bne 1f22fa4 + 1f22ee0: e1520003 cmp r2, r3 + 1f22ee4: 0a000060 beq 1f2306c + 1f22ee8: e59d1024 ldr r1, [sp, #36] ; 0x24 + 1f22eec: e58d1008 str r1, [sp, #8] + 1f22ef0: e30f14b8 movw r1, #62648 ; 0xf4b8 + 1f22ef4: e34011f5 movt r1, #501 ; 0x1f5 + 1f22ef8: e58d2004 str r2, [sp, #4] + 1f22efc: e59d2018 ldr r2, [sp, #24] + 1f22f00: e28d0048 add r0, sp, #72 ; 0x48 + 1f22f04: e58d2000 str r2, [sp] + 1f22f08: e59d2010 ldr r2, [sp, #16] + 1f22f0c: eb007305 bl 1f3fb28 + 1f22f10: e28d1048 add r1, sp, #72 ; 0x48 + 1f22f14: e59d03cc ldr r0, [sp, #972] ; 0x3cc + 1f22f18: eb00733c bl 1f3fc10 + 1f22f1c: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f22f20: e59d2014 ldr r2, [sp, #20] + 1f22f24: e19300d2 ldrsb r0, [r3, r2] + 1f22f28: e59d3010 ldr r3, [sp, #16] + 1f22f2c: e2833001 add r3, r3, #1 + 1f22f30: e58d3010 str r3, [sp, #16] + 1f22f34: e1500003 cmp r0, r3 + 1f22f38: da000012 ble 1f22f88 + 1f22f3c: e3a02f41 mov r2, #260 ; 0x104 + 1f22f40: e3a01000 mov r1, #0 + 1f22f44: e28d0f52 add r0, sp, #328 ; 0x148 + 1f22f48: eb007033 bl 1f3f01c + 1f22f4c: e3a02f41 mov r2, #260 ; 0x104 + 1f22f50: e3a01000 mov r1, #0 + 1f22f54: e28d0e25 add r0, sp, #592 ; 0x250 + 1f22f58: eb00702f bl 1f3f01c + 1f22f5c: e59d3014 ldr r3, [sp, #20] + 1f22f60: e3530028 cmp r3, #40 ; 0x28 + 1f22f64: e3a03000 mov r3, #0 + 1f22f68: e5cd3048 strb r3, [sp, #72] ; 0x48 + 1f22f6c: dafffe40 ble 1f22874 + 1f22f70: e3a03000 mov r3, #0 + 1f22f74: e3a02001 mov r2, #1 + 1f22f78: e58d3024 str r3, [sp, #36] ; 0x24 + 1f22f7c: e58d2020 str r2, [sp, #32] + 1f22f80: e58d3018 str r3, [sp, #24] + 1f22f84: eafffe48 b 1f228ac + 1f22f88: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f22f8c: e1530000 cmp r3, r0 + 1f22f90: 0a000000 beq 1f22f98 + 1f22f94: e3a00000 mov r0, #0 + 1f22f98: e28ddfd7 add sp, sp, #860 ; 0x35c + 1f22f9c: ecbd8b10 vpop {d8-d15} + 1f22fa0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f22fa4: e35100fd cmp r1, #253 ; 0xfd + 1f22fa8: ca00000b bgt 1f22fdc + 1f22fac: e59d2018 ldr r2, [sp, #24] + 1f22fb0: e3520001 cmp r2, #1 + 1f22fb4: 0a000004 beq 1f22fcc + 1f22fb8: e30f145c movw r1, #62556 ; 0xf45c + 1f22fbc: e34011f5 movt r1, #501 ; 0x1f5 + 1f22fc0: e59d2010 ldr r2, [sp, #16] + 1f22fc4: e28d0048 add r0, sp, #72 ; 0x48 + 1f22fc8: eb0072d6 bl 1f3fb28 + 1f22fcc: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f22fd0: e2833001 add r3, r3, #1 + 1f22fd4: e58d302c str r3, [sp, #44] ; 0x2c + 1f22fd8: eaffffcc b 1f22f10 + 1f22fdc: e59d1018 ldr r1, [sp, #24] + 1f22fe0: e3510001 cmp r1, #1 + 1f22fe4: 0afffff8 beq 1f22fcc + 1f22fe8: e59d1024 ldr r1, [sp, #36] ; 0x24 + 1f22fec: e58d1008 str r1, [sp, #8] + 1f22ff0: e30f1484 movw r1, #62596 ; 0xf484 + 1f22ff4: e34011f5 movt r1, #501 ; 0x1f5 + 1f22ff8: e58d2004 str r2, [sp, #4] + 1f22ffc: eaffffbe b 1f22efc + 1f23000: e59d33c4 ldr r3, [sp, #964] ; 0x3c4 + 1f23004: e59d2010 ldr r2, [sp, #16] + 1f23008: e58d3004 str r3, [sp, #4] + 1f2300c: e58d2000 str r2, [sp] + 1f23010: e28d2e25 add r2, sp, #592 ; 0x250 + 1f23014: e59d3014 ldr r3, [sp, #20] + 1f23018: e59d1038 ldr r1, [sp, #56] ; 0x38 + 1f2301c: e59d0044 ldr r0, [sp, #68] ; 0x44 + 1f23020: ebfff41e bl 1f200a0 + 1f23024: e59d2018 ldr r2, [sp, #24] + 1f23028: e58d0024 str r0, [sp, #36] ; 0x24 + 1f2302c: e0623000 rsb r3, r2, r0 + 1f23030: e16f3f13 clz r3, r3 + 1f23034: e1a032a3 lsr r3, r3, #5 + 1f23038: e58d3020 str r3, [sp, #32] + 1f2303c: eafffe1a b 1f228ac + 1f23040: e59d33c0 ldr r3, [sp, #960] ; 0x3c0 + 1f23044: e59d2010 ldr r2, [sp, #16] + 1f23048: e58d3004 str r3, [sp, #4] + 1f2304c: e58d2000 str r2, [sp] + 1f23050: e28d2f52 add r2, sp, #328 ; 0x148 + 1f23054: e59d3014 ldr r3, [sp, #20] + 1f23058: e59d103c ldr r1, [sp, #60] ; 0x3c + 1f2305c: e59d0040 ldr r0, [sp, #64] ; 0x40 + 1f23060: ebfff40e bl 1f200a0 + 1f23064: e58d0018 str r0, [sp, #24] + 1f23068: eafffe06 b 1f22888 + 1f2306c: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f23070: e30f14e8 movw r1, #62696 ; 0xf4e8 + 1f23074: e34011f5 movt r1, #501 ; 0x1f5 + 1f23078: e58d3000 str r3, [sp] + 1f2307c: e28d0048 add r0, sp, #72 ; 0x48 + 1f23080: e59d3018 ldr r3, [sp, #24] + 1f23084: e59d2010 ldr r2, [sp, #16] + 1f23088: eb0072a6 bl 1f3fb28 + 1f2308c: eaffff9f b 1f22f10 + 1f23090: e58dc02c str ip, [sp, #44] ; 0x2c + 1f23094: e1a0300c mov r3, ip + 1f23098: eaffffbb b 1f22f8c + +01f2309c : + 1f2309c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f230a0: e0822fa2 add r2, r2, r2, lsr #31 + 1f230a4: e3057338 movw r7, #21304 ; 0x5338 + 1f230a8: e34071f6 movt r7, #502 ; 0x1f6 + 1f230ac: e24ddf49 sub sp, sp, #292 ; 0x124 + 1f230b0: e1a060c2 asr r6, r2, #1 + 1f230b4: e3a0c000 mov ip, #0 + 1f230b8: e59d8148 ldr r8, [sp, #328] ; 0x148 + 1f230bc: e5c8c000 strb ip, [r8] + 1f230c0: e19720d6 ldrsb r2, [r7, r6] + 1f230c4: e152000c cmp r2, ip + 1f230c8: da000049 ble 1f231f4 + 1f230cc: e0905001 adds r5, r0, r1 + 1f230d0: e1a0a003 mov sl, r3 + 1f230d4: 03a0b001 moveq fp, #1 + 1f230d8: 11a0b00c movne fp, ip + 1f230dc: e1500005 cmp r0, r5 + 1f230e0: 238bb001 orrcs fp, fp, #1 + 1f230e4: e3560028 cmp r6, #40 ; 0x28 + 1f230e8: e1a09000 mov r9, r0 + 1f230ec: ca000013 bgt 1f23140 + 1f230f0: e15b000c cmp fp, ip + 1f230f4: 128d500c addne r5, sp, #12 + 1f230f8: 0a000022 beq 1f23188 + 1f230fc: e1a0300c mov r3, ip + 1f23100: e3a02000 mov r2, #0 + 1f23104: e30f1508 movw r1, #62728 ; 0xf508 + 1f23108: e34011f5 movt r1, #501 ; 0x1f5 + 1f2310c: e1a00005 mov r0, r5 + 1f23110: e28c4001 add r4, ip, #1 + 1f23114: eb007283 bl 1f3fb28 + 1f23118: e1a01005 mov r1, r5 + 1f2311c: e1a00008 mov r0, r8 + 1f23120: eb0072ba bl 1f3fc10 + 1f23124: e19730d6 ldrsb r3, [r7, r6] + 1f23128: e1a0c004 mov ip, r4 + 1f2312c: e1540003 cmp r4, r3 + 1f23130: bafffff1 blt 1f230fc + 1f23134: e1a00004 mov r0, r4 + 1f23138: e28ddf49 add sp, sp, #292 ; 0x124 + 1f2313c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f23140: e28d500c add r5, sp, #12 + 1f23144: e1a0300c mov r3, ip + 1f23148: e3a02000 mov r2, #0 + 1f2314c: e30f1508 movw r1, #62728 ; 0xf508 + 1f23150: e34011f5 movt r1, #501 ; 0x1f5 + 1f23154: e1a00005 mov r0, r5 + 1f23158: e28c4001 add r4, ip, #1 + 1f2315c: eb007271 bl 1f3fb28 + 1f23160: e1a01005 mov r1, r5 + 1f23164: e1a00008 mov r0, r8 + 1f23168: eb0072a8 bl 1f3fc10 + 1f2316c: e19730d6 ldrsb r3, [r7, r6] + 1f23170: e1a0c004 mov ip, r4 + 1f23174: e1530004 cmp r3, r4 + 1f23178: cafffff1 bgt 1f23144 + 1f2317c: e1a00004 mov r0, r4 + 1f23180: e28ddf49 add sp, sp, #292 ; 0x124 + 1f23184: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f23188: e1a0400b mov r4, fp + 1f2318c: e58da004 str sl, [sp, #4] + 1f23190: e1a03006 mov r3, r6 + 1f23194: e58db000 str fp, [sp] + 1f23198: e28d201c add r2, sp, #28 + 1f2319c: e1a01005 mov r1, r5 + 1f231a0: e1a00009 mov r0, r9 + 1f231a4: ebfff3bd bl 1f200a0 + 1f231a8: e3500001 cmp r0, #1 + 1f231ac: 0a000009 beq 1f231d8 + 1f231b0: e1a02000 mov r2, r0 + 1f231b4: e30f1508 movw r1, #62728 ; 0xf508 + 1f231b8: e34011f5 movt r1, #501 ; 0x1f5 + 1f231bc: e1a0300b mov r3, fp + 1f231c0: e28d000c add r0, sp, #12 + 1f231c4: eb007257 bl 1f3fb28 + 1f231c8: e28d100c add r1, sp, #12 + 1f231cc: e1a00008 mov r0, r8 + 1f231d0: e2844001 add r4, r4, #1 + 1f231d4: eb00728d bl 1f3fc10 + 1f231d8: e19730d6 ldrsb r3, [r7, r6] + 1f231dc: e28bb001 add fp, fp, #1 + 1f231e0: e15b0003 cmp fp, r3 + 1f231e4: baffffe8 blt 1f2318c + 1f231e8: e1a00004 mov r0, r4 + 1f231ec: e28ddf49 add sp, sp, #292 ; 0x124 + 1f231f0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f231f4: e1a0400c mov r4, ip + 1f231f8: eaffffcd b 1f23134 + +01f231fc : + 1f231fc: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f23200: e0822fa2 add r2, r2, r2, lsr #31 + 1f23204: e305b338 movw fp, #21304 ; 0x5338 + 1f23208: e340b1f6 movt fp, #502 ; 0x1f6 + 1f2320c: e24ddf8b sub sp, sp, #556 ; 0x22c + 1f23210: e1a060c2 asr r6, r2, #1 + 1f23214: e3a05000 mov r5, #0 + 1f23218: e59d2250 ldr r2, [sp, #592] ; 0x250 + 1f2321c: e5cd5024 strb r5, [sp, #36] ; 0x24 + 1f23220: e5c25000 strb r5, [r2] + 1f23224: e19b20d6 ldrsb r2, [fp, r6] + 1f23228: e1520005 cmp r2, r5 + 1f2322c: da00003c ble 1f23324 + 1f23230: e0908001 adds r8, r0, r1 + 1f23234: e58d300c str r3, [sp, #12] + 1f23238: 03a09001 moveq r9, #1 + 1f2323c: 11a09005 movne r9, r5 + 1f23240: e1a0a000 mov sl, r0 + 1f23244: e1a07005 mov r7, r5 + 1f23248: e1500008 cmp r0, r8 + 1f2324c: 23899001 orrcs r9, r9, #1 + 1f23250: e28d4f89 add r4, sp, #548 ; 0x224 + 1f23254: ea000002 b 1f23264 + 1f23258: e2855001 add r5, r5, #1 + 1f2325c: e1520005 cmp r2, r5 + 1f23260: da000019 ble 1f232cc + 1f23264: e3560028 cmp r6, #40 ; 0x28 + 1f23268: cafffffa bgt 1f23258 + 1f2326c: e3590000 cmp r9, #0 + 1f23270: 1afffff8 bne 1f23258 + 1f23274: e59d300c ldr r3, [sp, #12] + 1f23278: e28d2f49 add r2, sp, #292 ; 0x124 + 1f2327c: e58d3004 str r3, [sp, #4] + 1f23280: e1a01008 mov r1, r8 + 1f23284: e1a03006 mov r3, r6 + 1f23288: e58d5000 str r5, [sp] + 1f2328c: e1a0000a mov r0, sl + 1f23290: ebfff382 bl 1f200a0 + 1f23294: e3500001 cmp r0, #1 + 1f23298: 1a000007 bne 1f232bc + 1f2329c: e28d3f49 add r3, sp, #292 ; 0x124 + 1f232a0: e2833001 add r3, r3, #1 + 1f232a4: ea000001 b 1f232b0 + 1f232a8: e1530004 cmp r3, r4 + 1f232ac: 0a000011 beq 1f232f8 + 1f232b0: e5f32001 ldrb r2, [r3, #1]! + 1f232b4: e3520001 cmp r2, #1 + 1f232b8: 0afffffa beq 1f232a8 + 1f232bc: e19b20d6 ldrsb r2, [fp, r6] + 1f232c0: e2855001 add r5, r5, #1 + 1f232c4: e1520005 cmp r2, r5 + 1f232c8: caffffe5 bgt 1f23264 + 1f232cc: e3570000 cmp r7, #0 + 1f232d0: 0a000005 beq 1f232ec + 1f232d4: e30f1514 movw r1, #62740 ; 0xf514 + 1f232d8: e34011f5 movt r1, #501 ; 0x1f5 + 1f232dc: e59d0250 ldr r0, [sp, #592] ; 0x250 + 1f232e0: e28d3024 add r3, sp, #36 ; 0x24 + 1f232e4: e1a02007 mov r2, r7 + 1f232e8: eb00720e bl 1f3fb28 + 1f232ec: e1a00007 mov r0, r7 + 1f232f0: e28ddf8b add sp, sp, #556 ; 0x22c + 1f232f4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f232f8: e1a02005 mov r2, r5 + 1f232fc: e30f1524 movw r1, #62756 ; 0xf524 + 1f23300: e34011f5 movt r1, #501 ; 0x1f5 + 1f23304: e28d0014 add r0, sp, #20 + 1f23308: e2877001 add r7, r7, #1 + 1f2330c: eb007205 bl 1f3fb28 + 1f23310: e28d1014 add r1, sp, #20 + 1f23314: e28d0024 add r0, sp, #36 ; 0x24 + 1f23318: eb00723c bl 1f3fc10 + 1f2331c: e19b20d6 ldrsb r2, [fp, r6] + 1f23320: eaffffe6 b 1f232c0 + 1f23324: e1a07005 mov r7, r5 + 1f23328: eaffffef b 1f232ec + +01f2332c : + 1f2332c: e3510000 cmp r1, #0 + 1f23330: da00000a ble 1f23360 + 1f23334: e1a0c000 mov ip, r0 + 1f23338: e3a00000 mov r0, #0 + 1f2333c: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f23340: e08c1001 add r1, ip, r1 + 1f23344: e4dce001 ldrb lr, [ip], #1 + 1f23348: e15e0002 cmp lr, r2 + 1f2334c: 054c3001 strbeq r3, [ip, #-1] + 1f23350: 02800001 addeq r0, r0, #1 + 1f23354: e15c0001 cmp ip, r1 + 1f23358: 1afffff9 bne 1f23344 + 1f2335c: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f23360: e3a00000 mov r0, #0 + 1f23364: e12fff1e bx lr + +01f23368 : + 1f23368: e3520000 cmp r2, #0 + 1f2336c: 10803002 addne r3, r0, r2 + 1f23370: 00801001 addeq r1, r0, r1 + 1f23374: e7d02002 ldrb r2, [r0, r2] + 1f23378: 05513001 ldrbeq r3, [r1, #-1] + 1f2337c: 15533001 ldrbne r3, [r3, #-1] + 1f23380: e1a03403 lsl r3, r3, #8 + 1f23384: e2033c03 and r3, r3, #768 ; 0x300 + 1f23388: e1833002 orr r3, r3, r2 + 1f2338c: e3130d0e tst r3, #896 ; 0x380 + 1f23390: 0a000012 beq 1f233e0 + 1f23394: e3130d07 tst r3, #448 ; 0x1c0 + 1f23398: 0a000012 beq 1f233e8 + 1f2339c: e31300e0 tst r3, #224 ; 0xe0 + 1f233a0: 0a000012 beq 1f233f0 + 1f233a4: e3130070 tst r3, #112 ; 0x70 + 1f233a8: 0a000012 beq 1f233f8 + 1f233ac: e3130038 tst r3, #56 ; 0x38 + 1f233b0: 0a000012 beq 1f23400 + 1f233b4: e313001c tst r3, #28 + 1f233b8: 0a000012 beq 1f23408 + 1f233bc: e313000e tst r3, #14 + 1f233c0: 0a000012 beq 1f23410 + 1f233c4: e3130007 tst r3, #7 + 1f233c8: 13a00003 movne r0, #3 + 1f233cc: 03a00007 moveq r0, #7 + 1f233d0: e3500006 cmp r0, #6 + 1f233d4: 93a00000 movls r0, #0 + 1f233d8: 83a00001 movhi r0, #1 + 1f233dc: e12fff1e bx lr + 1f233e0: e3a00d0e mov r0, #896 ; 0x380 + 1f233e4: eafffff9 b 1f233d0 + 1f233e8: e3a00d07 mov r0, #448 ; 0x1c0 + 1f233ec: eafffff7 b 1f233d0 + 1f233f0: e3a000e0 mov r0, #224 ; 0xe0 + 1f233f4: eafffff5 b 1f233d0 + 1f233f8: e3a00070 mov r0, #112 ; 0x70 + 1f233fc: eafffff3 b 1f233d0 + 1f23400: e3a00038 mov r0, #56 ; 0x38 + 1f23404: eafffff1 b 1f233d0 + 1f23408: e3a0001c mov r0, #28 + 1f2340c: eaffffef b 1f233d0 + 1f23410: e3a0000e mov r0, #14 + 1f23414: eaffffed b 1f233d0 + +01f23418 : + 1f23418: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f2341c: e2417001 sub r7, r1, #1 + 1f23420: e1a0b000 mov fp, r0 + 1f23424: e3570000 cmp r7, #0 + 1f23428: e24dd00c sub sp, sp, #12 + 1f2342c: 10803007 addne r3, r0, r7 + 1f23430: 01a0a000 moveq sl, r0 + 1f23434: 11a0a003 movne sl, r3 + 1f23438: e1a09007 mov r9, r7 + 1f2343c: e58d1004 str r1, [sp, #4] + 1f23440: 15531001 ldrbne r1, [r3, #-1] + 1f23444: 05d01000 ldrbeq r1, [r0] + 1f23448: e7d03007 ldrb r3, [r0, r7] + 1f2344c: e1a01401 lsl r1, r1, #8 + 1f23450: e2011c03 and r1, r1, #768 ; 0x300 + 1f23454: e1813003 orr r3, r1, r3 + 1f23458: e3130d0e tst r3, #896 ; 0x380 + 1f2345c: 0a0000b8 beq 1f23744 + 1f23460: e3130d07 tst r3, #448 ; 0x1c0 + 1f23464: 0a0000b6 beq 1f23744 + 1f23468: e31300e0 tst r3, #224 ; 0xe0 + 1f2346c: 0a0000b4 beq 1f23744 + 1f23470: e3130070 tst r3, #112 ; 0x70 + 1f23474: 0a0000b2 beq 1f23744 + 1f23478: e3130038 tst r3, #56 ; 0x38 + 1f2347c: 0a0000b0 beq 1f23744 + 1f23480: e313001c tst r3, #28 + 1f23484: 0a0000ae beq 1f23744 + 1f23488: e313000e tst r3, #14 + 1f2348c: 0a0000ac beq 1f23744 + 1f23490: e3130007 tst r3, #7 + 1f23494: 03a04001 moveq r4, #1 + 1f23498: 13a04000 movne r4, #0 + 1f2349c: e3570000 cmp r7, #0 + 1f234a0: c3a00000 movgt r0, #0 + 1f234a4: c1a0600b movgt r6, fp + 1f234a8: c1a0c000 movgt ip, r0 + 1f234ac: c24b5001 subgt r5, fp, #1 + 1f234b0: ca00000c bgt 1f234e8 + 1f234b4: ea0000aa b 1f23764 + 1f234b8: e3580006 cmp r8, #6 + 1f234bc: 8a000080 bhi 1f236c4 + 1f234c0: e3520000 cmp r2, #0 + 1f234c4: 13a03000 movne r3, #0 + 1f234c8: 13a04000 movne r4, #0 + 1f234cc: 17cb3009 strbne r3, [fp, r9] + 1f234d0: 01a04002 moveq r4, r2 + 1f234d4: e2800001 add r0, r0, #1 + 1f234d8: e15e0007 cmp lr, r7 + 1f234dc: e1a0900c mov r9, ip + 1f234e0: 0a00003a beq 1f235d0 + 1f234e4: e1a0c00e mov ip, lr + 1f234e8: e35c0000 cmp ip, #0 + 1f234ec: 15d53000 ldrbne r3, [r5] + 1f234f0: 05da3000 ldrbeq r3, [sl] + 1f234f4: e5f51001 ldrb r1, [r5, #1]! + 1f234f8: e1a03403 lsl r3, r3, #8 + 1f234fc: e2033c03 and r3, r3, #768 ; 0x300 + 1f23500: e1833001 orr r3, r3, r1 + 1f23504: e3130d0e tst r3, #896 ; 0x380 + 1f23508: 0a00007f beq 1f2370c + 1f2350c: e3130d07 tst r3, #448 ; 0x1c0 + 1f23510: 0a00007f beq 1f23714 + 1f23514: e31300e0 tst r3, #224 ; 0xe0 + 1f23518: 0a00007f beq 1f2371c + 1f2351c: e3130070 tst r3, #112 ; 0x70 + 1f23520: 0a00007f beq 1f23724 + 1f23524: e3130038 tst r3, #56 ; 0x38 + 1f23528: 0a00007f beq 1f2372c + 1f2352c: e313001c tst r3, #28 + 1f23530: 0a00007f beq 1f23734 + 1f23534: e313000e tst r3, #14 + 1f23538: 0a00007f beq 1f2373c + 1f2353c: e3130007 tst r3, #7 + 1f23540: 13a08003 movne r8, #3 + 1f23544: 03a08007 moveq r8, #7 + 1f23548: e29ce001 adds lr, ip, #1 + 1f2354c: 15d63000 ldrbne r3, [r6] + 1f23550: 05da3000 ldrbeq r3, [sl] + 1f23554: e5f61001 ldrb r1, [r6, #1]! + 1f23558: e1a03403 lsl r3, r3, #8 + 1f2355c: e2033c03 and r3, r3, #768 ; 0x300 + 1f23560: e1833001 orr r3, r3, r1 + 1f23564: e3130d0e tst r3, #896 ; 0x380 + 1f23568: 0a000051 beq 1f236b4 + 1f2356c: e3130d07 tst r3, #448 ; 0x1c0 + 1f23570: 0a00004f beq 1f236b4 + 1f23574: e31300e0 tst r3, #224 ; 0xe0 + 1f23578: 0a00004d beq 1f236b4 + 1f2357c: e3130070 tst r3, #112 ; 0x70 + 1f23580: 0a00004b beq 1f236b4 + 1f23584: e3130038 tst r3, #56 ; 0x38 + 1f23588: 0a000049 beq 1f236b4 + 1f2358c: e313001c tst r3, #28 + 1f23590: 0a000047 beq 1f236b4 + 1f23594: e313000e tst r3, #14 + 1f23598: 0a000045 beq 1f236b4 + 1f2359c: e3130007 tst r3, #7 + 1f235a0: 0a000043 beq 1f236b4 + 1f235a4: e3540001 cmp r4, #1 + 1f235a8: 0a00004b beq 1f236dc + 1f235ac: e3540002 cmp r4, #2 + 1f235b0: 0affffc0 beq 1f234b8 + 1f235b4: e3580006 cmp r8, #6 + 1f235b8: 9a000049 bls 1f236e4 + 1f235bc: e15e0007 cmp lr, r7 + 1f235c0: e2800001 add r0, r0, #1 + 1f235c4: e3a04002 mov r4, #2 + 1f235c8: e1a0900c mov r9, ip + 1f235cc: 1affffc4 bne 1f234e4 + 1f235d0: e59d3004 ldr r3, [sp, #4] + 1f235d4: e2437002 sub r7, r3, #2 + 1f235d8: e5da3000 ldrb r3, [sl] + 1f235dc: e5db1000 ldrb r1, [fp] + 1f235e0: e1a03403 lsl r3, r3, #8 + 1f235e4: e2033c03 and r3, r3, #768 ; 0x300 + 1f235e8: e1833001 orr r3, r3, r1 + 1f235ec: e3130d0e tst r3, #896 ; 0x380 + 1f235f0: 0a00005d beq 1f2376c + 1f235f4: e3130d07 tst r3, #448 ; 0x1c0 + 1f235f8: 0a00005d beq 1f23774 + 1f235fc: e31300e0 tst r3, #224 ; 0xe0 + 1f23600: 0a000061 beq 1f2378c + 1f23604: e3130070 tst r3, #112 ; 0x70 + 1f23608: 0a00005d beq 1f23784 + 1f2360c: e3130038 tst r3, #56 ; 0x38 + 1f23610: 0a000059 beq 1f2377c + 1f23614: e313001c tst r3, #28 + 1f23618: 0a00005f beq 1f2379c + 1f2361c: e313000e tst r3, #14 + 1f23620: 0a00005b beq 1f23794 + 1f23624: e3130007 tst r3, #7 + 1f23628: 13a0c003 movne ip, #3 + 1f2362c: 03a0c007 moveq ip, #7 + 1f23630: e1a01401 lsl r1, r1, #8 + 1f23634: e5db3001 ldrb r3, [fp, #1] + 1f23638: e2011c03 and r1, r1, #768 ; 0x300 + 1f2363c: e1813003 orr r3, r1, r3 + 1f23640: e3130d0e tst r3, #896 ; 0x380 + 1f23644: 0a000040 beq 1f2374c + 1f23648: e3130d07 tst r3, #448 ; 0x1c0 + 1f2364c: 0a00003e beq 1f2374c + 1f23650: e31300e0 tst r3, #224 ; 0xe0 + 1f23654: 0a00003c beq 1f2374c + 1f23658: e3130070 tst r3, #112 ; 0x70 + 1f2365c: 0a00003a beq 1f2374c + 1f23660: e3130038 tst r3, #56 ; 0x38 + 1f23664: 0a000038 beq 1f2374c + 1f23668: e313001c tst r3, #28 + 1f2366c: 0a000036 beq 1f2374c + 1f23670: e313000e tst r3, #14 + 1f23674: 0a000034 beq 1f2374c + 1f23678: e3130007 tst r3, #7 + 1f2367c: 0a000032 beq 1f2374c + 1f23680: e3540001 cmp r4, #1 + 1f23684: 0a00001c beq 1f236fc + 1f23688: e3540002 cmp r4, #2 + 1f2368c: 1a000006 bne 1f236ac + 1f23690: e35c0006 cmp ip, #6 + 1f23694: 8a000001 bhi 1f236a0 + 1f23698: e3520000 cmp r2, #0 + 1f2369c: 0a000001 beq 1f236a8 + 1f236a0: e3a03000 mov r3, #0 + 1f236a4: e7cb3007 strb r3, [fp, r7] + 1f236a8: e2800001 add r0, r0, #1 + 1f236ac: e28dd00c add sp, sp, #12 + 1f236b0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f236b4: e3540001 cmp r4, #1 + 1f236b8: 0a00000b beq 1f236ec + 1f236bc: e3540002 cmp r4, #2 + 1f236c0: 1affffbb bne 1f235b4 + 1f236c4: e3520000 cmp r2, #0 + 1f236c8: 03a04002 moveq r4, #2 + 1f236cc: 13a03000 movne r3, #0 + 1f236d0: 13a04002 movne r4, #2 + 1f236d4: 17cb3009 strbne r3, [fp, r9] + 1f236d8: eaffff7d b 1f234d4 + 1f236dc: e3580006 cmp r8, #6 + 1f236e0: 8a000001 bhi 1f236ec + 1f236e4: e3a04000 mov r4, #0 + 1f236e8: eaffff7a b 1f234d8 + 1f236ec: e3520000 cmp r2, #0 + 1f236f0: 13a03000 movne r3, #0 + 1f236f4: 17cb3009 strbne r3, [fp, r9] + 1f236f8: eaffffaf b 1f235bc + 1f236fc: e35c0006 cmp ip, #6 + 1f23700: 8affffe4 bhi 1f23698 + 1f23704: e28dd00c add sp, sp, #12 + 1f23708: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f2370c: e3a08d0e mov r8, #896 ; 0x380 + 1f23710: eaffff8c b 1f23548 + 1f23714: e3a08d07 mov r8, #448 ; 0x1c0 + 1f23718: eaffff8a b 1f23548 + 1f2371c: e3a080e0 mov r8, #224 ; 0xe0 + 1f23720: eaffff88 b 1f23548 + 1f23724: e3a08070 mov r8, #112 ; 0x70 + 1f23728: eaffff86 b 1f23548 + 1f2372c: e3a08038 mov r8, #56 ; 0x38 + 1f23730: eaffff84 b 1f23548 + 1f23734: e3a0801c mov r8, #28 + 1f23738: eaffff82 b 1f23548 + 1f2373c: e3a0800e mov r8, #14 + 1f23740: eaffff80 b 1f23548 + 1f23744: e3a04001 mov r4, #1 + 1f23748: eaffff53 b 1f2349c + 1f2374c: e3540001 cmp r4, #1 + 1f23750: 0affffd0 beq 1f23698 + 1f23754: e3540002 cmp r4, #2 + 1f23758: 0affffd0 beq 1f236a0 + 1f2375c: e28dd00c add sp, sp, #12 + 1f23760: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f23764: e3a00000 mov r0, #0 + 1f23768: eaffff9a b 1f235d8 + 1f2376c: e3a0cd0e mov ip, #896 ; 0x380 + 1f23770: eaffffae b 1f23630 + 1f23774: e3a0cd07 mov ip, #448 ; 0x1c0 + 1f23778: eaffffac b 1f23630 + 1f2377c: e3a0c038 mov ip, #56 ; 0x38 + 1f23780: eaffffaa b 1f23630 + 1f23784: e3a0c070 mov ip, #112 ; 0x70 + 1f23788: eaffffa8 b 1f23630 + 1f2378c: e3a0c0e0 mov ip, #224 ; 0xe0 + 1f23790: eaffffa6 b 1f23630 + 1f23794: e3a0c00e mov ip, #14 + 1f23798: eaffffa4 b 1f23630 + 1f2379c: e3a0c01c mov ip, #28 + 1f237a0: eaffffa2 b 1f23630 + +01f237a4 : + 1f237a4: e92d40f0 push {r4, r5, r6, r7, lr} + 1f237a8: e1a07001 mov r7, r1 + 1f237ac: e1a04000 mov r4, r0 + 1f237b0: e24dda02 sub sp, sp, #8192 ; 0x2000 + 1f237b4: e1a01000 mov r1, r0 + 1f237b8: e24dd004 sub sp, sp, #4 + 1f237bc: e1a05002 mov r5, r2 + 1f237c0: e1a0000d mov r0, sp + 1f237c4: e1a02007 mov r2, r7 + 1f237c8: eb006d8c bl 1f3ee00 + 1f237cc: e08d3007 add r3, sp, r7 + 1f237d0: e3570000 cmp r7, #0 + 1f237d4: e553c001 ldrb ip, [r3, #-1] + 1f237d8: da00000b ble 1f2380c + 1f237dc: e247e001 sub lr, r7, #1 + 1f237e0: e2656008 rsb r6, r5, #8 + 1f237e4: e24d0001 sub r0, sp, #1 + 1f237e8: e084e00e add lr, r4, lr + 1f237ec: e2442001 sub r2, r4, #1 + 1f237f0: e5f01001 ldrb r1, [r0, #1]! + 1f237f4: e1a0361c lsl r3, ip, r6 + 1f237f8: e1a0c001 mov ip, r1 + 1f237fc: e1833551 orr r3, r3, r1, asr r5 + 1f23800: e5e23001 strb r3, [r2, #1]! + 1f23804: e15e0002 cmp lr, r2 + 1f23808: 1afffff8 bne 1f237f0 + 1f2380c: e28dda02 add sp, sp, #8192 ; 0x2000 + 1f23810: e28dd004 add sp, sp, #4 + 1f23814: e8bd80f0 pop {r4, r5, r6, r7, pc} + +01f23818 : + 1f23818: e0801001 add r1, r0, r1 + 1f2381c: e1500001 cmp r0, r1 + 1f23820: 2a00001d bcs 1f2389c + 1f23824: e92d4010 push {r4, lr} + 1f23828: e1a0c000 mov ip, r0 + 1f2382c: e3a0e000 mov lr, #0 + 1f23830: ea000001 b 1f2383c + 1f23834: e151000c cmp r1, ip + 1f23838: 0a000015 beq 1f23894 + 1f2383c: e1a0400c mov r4, ip + 1f23840: e4dc3001 ldrb r3, [ip], #1 + 1f23844: e35300a5 cmp r3, #165 ; 0xa5 + 1f23848: 1353005a cmpne r3, #90 ; 0x5a + 1f2384c: e20330fd and r3, r3, #253 ; 0xfd + 1f23850: 03a02001 moveq r2, #1 + 1f23854: 13a02000 movne r2, #0 + 1f23858: e3530049 cmp r3, #73 ; 0x49 + 1f2385c: 11a03002 movne r3, r2 + 1f23860: 03823001 orreq r3, r2, #1 + 1f23864: e3530000 cmp r3, #0 + 1f23868: 01a0e003 moveq lr, r3 + 1f2386c: 0afffff0 beq 1f23834 + 1f23870: e35e0000 cmp lr, #0 + 1f23874: 0a000002 beq 1f23884 + 1f23878: e35e0005 cmp lr, #5 + 1f2387c: e1a04000 mov r4, r0 + 1f23880: c8bd8010 popgt {r4, pc} + 1f23884: e151000c cmp r1, ip + 1f23888: e28ee001 add lr, lr, #1 + 1f2388c: e1a00004 mov r0, r4 + 1f23890: 1affffe9 bne 1f2383c + 1f23894: e3a00000 mov r0, #0 + 1f23898: e8bd8010 pop {r4, pc} + 1f2389c: e3a00000 mov r0, #0 + 1f238a0: e12fff1e bx lr + +01f238a4 : + 1f238a4: e2411002 sub r1, r1, #2 + 1f238a8: e0801001 add r1, r0, r1 + 1f238ac: e1500001 cmp r0, r1 + 1f238b0: e92d4070 push {r4, r5, r6, lr} + 1f238b4: 2a000017 bcs 1f23918 + 1f238b8: e1a03000 mov r3, r0 + 1f238bc: e3a04000 mov r4, #0 + 1f238c0: e2811001 add r1, r1, #1 + 1f238c4: e1a0c004 mov ip, r4 + 1f238c8: e1a05004 mov r5, r4 + 1f238cc: e1a06004 mov r6, r4 + 1f238d0: e4d3e001 ldrb lr, [r3], #1 + 1f238d4: e4d32001 ldrb r2, [r3], #1 + 1f238d8: e15e0002 cmp lr, r2 + 1f238dc: 028cc001 addeq ip, ip, #1 + 1f238e0: 01a06003 moveq r6, r3 + 1f238e4: 0a000003 beq 1f238f8 + 1f238e8: e15c0004 cmp ip, r4 + 1f238ec: c1a0400c movgt r4, ip + 1f238f0: c1a05006 movgt r5, r6 + 1f238f4: e3a0c000 mov ip, #0 + 1f238f8: e1530001 cmp r3, r1 + 1f238fc: e1a0e002 mov lr, r2 + 1f23900: 1afffff3 bne 1f238d4 + 1f23904: e2800005 add r0, r0, #5 + 1f23908: e1550000 cmp r5, r0 + 1f2390c: 22450005 subcs r0, r5, #5 + 1f23910: 31a00005 movcc r0, r5 + 1f23914: e8bd8070 pop {r4, r5, r6, pc} + 1f23918: e3a05000 mov r5, #0 + 1f2391c: eafffff8 b 1f23904 + +01f23920 : + 1f23920: e92d4ff8 push {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f23924: e0807001 add r7, r0, r1 + 1f23928: e1500007 cmp r0, r7 + 1f2392c: 2a00001a bcs 1f2399c + 1f23930: e3a08000 mov r8, #0 + 1f23934: e1a06001 mov r6, r1 + 1f23938: e1a05000 mov r5, r0 + 1f2393c: e2804001 add r4, r0, #1 + 1f23940: e1a0b008 mov fp, r8 + 1f23944: e1a0a008 mov sl, r8 + 1f23948: e1a09008 mov r9, r8 + 1f2394c: e2442001 sub r2, r4, #1 + 1f23950: e1a01006 mov r1, r6 + 1f23954: e0652002 rsb r2, r5, r2 + 1f23958: e1a00005 mov r0, r5 + 1f2395c: ebfffe81 bl 1f23368 + 1f23960: e3500000 cmp r0, #0 + 1f23964: e1a03004 mov r3, r4 + 1f23968: 128bb001 addne fp, fp, #1 + 1f2396c: 11a09004 movne r9, r4 + 1f23970: 1a000004 bne 1f23988 + 1f23974: e15b0008 cmp fp, r8 + 1f23978: e1a03004 mov r3, r4 + 1f2397c: c1a0800b movgt r8, fp + 1f23980: c1a0a009 movgt sl, r9 + 1f23984: e1a0b000 mov fp, r0 + 1f23988: e1570003 cmp r7, r3 + 1f2398c: e2844001 add r4, r4, #1 + 1f23990: 8affffed bhi 1f2394c + 1f23994: e1a0000a mov r0, sl + 1f23998: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f2399c: e3a0a000 mov sl, #0 + 1f239a0: eafffffb b 1f23994 + +01f239a4 : + 1f239a4: e0801001 add r1, r0, r1 + 1f239a8: e1500001 cmp r0, r1 + 1f239ac: 2a000017 bcs 1f23a10 + 1f239b0: e92d4030 push {r4, r5, lr} + 1f239b4: e3a04000 mov r4, #0 + 1f239b8: e1a03000 mov r3, r0 + 1f239bc: e1a02004 mov r2, r4 + 1f239c0: e1a00004 mov r0, r4 + 1f239c4: e1a05004 mov r5, r4 + 1f239c8: ea000005 b 1f239e4 + 1f239cc: e1520004 cmp r2, r4 + 1f239d0: c1a04002 movgt r4, r2 + 1f239d4: c1a00005 movgt r0, r5 + 1f239d8: e1530001 cmp r3, r1 + 1f239dc: e3a02000 mov r2, #0 + 1f239e0: 0a000009 beq 1f23a0c + 1f239e4: e1a0c003 mov ip, r3 + 1f239e8: e2833001 add r3, r3, #1 + 1f239ec: e5dce000 ldrb lr, [ip] + 1f239f0: e35e00ff cmp lr, #255 ; 0xff + 1f239f4: 1afffff4 bne 1f239cc + 1f239f8: e3520000 cmp r2, #0 + 1f239fc: e2822001 add r2, r2, #1 + 1f23a00: 01a0500c moveq r5, ip + 1f23a04: e1530001 cmp r3, r1 + 1f23a08: 1afffff5 bne 1f239e4 + 1f23a0c: e8bd8030 pop {r4, r5, pc} + 1f23a10: e3a00000 mov r0, #0 + 1f23a14: e12fff1e bx lr + +01f23a18 : + 1f23a18: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f23a1c: e2523000 subs r3, r2, #0 + 1f23a20: e24dde42 sub sp, sp, #1056 ; 0x420 + 1f23a24: e24dd004 sub sp, sp, #4 + 1f23a28: e58d000c str r0, [sp, #12] + 1f23a2c: 01a00003 moveq r0, r3 + 1f23a30: e58d3018 str r3, [sp, #24] + 1f23a34: e58d1008 str r1, [sp, #8] + 1f23a38: 0a000094 beq 1f23c90 + 1f23a3c: f2c00050 vmov.i32 q8, #0 ; 0x00000000 + 1f23a40: e28d3020 add r3, sp, #32 + 1f23a44: f4430adf vst1.64 {d16-d17}, [r3 :64] + 1f23a48: e28d2e42 add r2, sp, #1056 ; 0x420 + 1f23a4c: e2833010 add r3, r3, #16 + 1f23a50: e1530002 cmp r3, r2 + 1f23a54: 1afffffa bne 1f23a44 + 1f23a58: e59d300c ldr r3, [sp, #12] + 1f23a5c: e59d2018 ldr r2, [sp, #24] + 1f23a60: e1a01003 mov r1, r3 + 1f23a64: e0833002 add r3, r3, r2 + 1f23a68: e58d301c str r3, [sp, #28] + 1f23a6c: e1a00003 mov r0, r3 + 1f23a70: e4d13001 ldrb r3, [r1], #1 + 1f23a74: e28d2e42 add r2, sp, #1056 ; 0x420 + 1f23a78: e1510000 cmp r1, r0 + 1f23a7c: e0823103 add r3, r2, r3, lsl #2 + 1f23a80: e5132400 ldr r2, [r3, #-1024] ; 0xfffffc00 + 1f23a84: e2822001 add r2, r2, #1 + 1f23a88: e5032400 str r2, [r3, #-1024] ; 0xfffffc00 + 1f23a8c: 1afffff7 bne 1f23a70 + 1f23a90: e28d2020 add r2, sp, #32 + 1f23a94: e3a03001 mov r3, #1 + 1f23a98: e3a0c000 mov ip, #0 + 1f23a9c: e28d1e42 add r1, sp, #1056 ; 0x420 + 1f23aa0: e5b2e004 ldr lr, [r2, #4]! + 1f23aa4: e081010c add r0, r1, ip, lsl #2 + 1f23aa8: e6ef1073 uxtb r1, r3 + 1f23aac: e2833001 add r3, r3, #1 + 1f23ab0: e5100400 ldr r0, [r0, #-1024] ; 0xfffffc00 + 1f23ab4: e15e0000 cmp lr, r0 + 1f23ab8: 31a0c001 movcc ip, r1 + 1f23abc: e3530c01 cmp r3, #256 ; 0x100 + 1f23ac0: 1afffff5 bne 1f23a9c + 1f23ac4: e3a03000 mov r3, #0 + 1f23ac8: e3a00001 mov r0, #1 + 1f23acc: e1a0b003 mov fp, r3 + 1f23ad0: e59d3008 ldr r3, [sp, #8] + 1f23ad4: e58dc010 str ip, [sp, #16] + 1f23ad8: e5c3c000 strb ip, [r3] + 1f23adc: e30836a0 movw r3, #34464 ; 0x86a0 + 1f23ae0: e3403001 movt r3, #1 + 1f23ae4: e58d3014 str r3, [sp, #20] + 1f23ae8: e59d3018 ldr r3, [sp, #24] + 1f23aec: e58d3004 str r3, [sp, #4] + 1f23af0: e59d3014 ldr r3, [sp, #20] + 1f23af4: e3a0e003 mov lr, #3 + 1f23af8: e59d200c ldr r2, [sp, #12] + 1f23afc: e15b0003 cmp fp, r3 + 1f23b00: 31a0700b movcc r7, fp + 1f23b04: 21a07003 movcs r7, r3 + 1f23b08: e3570002 cmp r7, #2 + 1f23b0c: e082c00b add ip, r2, fp + 1f23b10: 9a000099 bls 1f23d7c + 1f23b14: e7d2800b ldrb r8, [r2, fp] + 1f23b18: e1a0300e mov r3, lr + 1f23b1c: e3a0a000 mov sl, #0 + 1f23b20: ea000002 b 1f23b30 + 1f23b24: e2833001 add r3, r3, #1 + 1f23b28: e1530007 cmp r3, r7 + 1f23b2c: 8a00001d bhi 1f23ba8 + 1f23b30: e2632000 rsb r2, r3, #0 + 1f23b34: e08c1002 add r1, ip, r2 + 1f23b38: e7dc2002 ldrb r2, [ip, r2] + 1f23b3c: e1520008 cmp r2, r8 + 1f23b40: 1afffff7 bne 1f23b24 + 1f23b44: e7dc400e ldrb r4, [ip, lr] + 1f23b48: e7d1200e ldrb r2, [r1, lr] + 1f23b4c: e1540002 cmp r4, r2 + 1f23b50: 1afffff3 bne 1f23b24 + 1f23b54: e59d4004 ldr r4, [sp, #4] + 1f23b58: e1a02001 mov r2, r1 + 1f23b5c: e3a01000 mov r1, #0 + 1f23b60: e1540003 cmp r4, r3 + 1f23b64: 31a09004 movcc r9, r4 + 1f23b68: 21a09003 movcs r9, r3 + 1f23b6c: e1a0400c mov r4, ip + 1f23b70: ea000003 b 1f23b84 + 1f23b74: e5f46001 ldrb r6, [r4, #1]! + 1f23b78: e5f25001 ldrb r5, [r2, #1]! + 1f23b7c: e1560005 cmp r6, r5 + 1f23b80: 1a000063 bne 1f23d14 + 1f23b84: e2811001 add r1, r1, #1 + 1f23b88: e1590001 cmp r9, r1 + 1f23b8c: 1afffff8 bne 1f23b74 + 1f23b90: e15e0009 cmp lr, r9 + 1f23b94: 31a0e009 movcc lr, r9 + 1f23b98: 31a0a003 movcc sl, r3 + 1f23b9c: e2833001 add r3, r3, #1 + 1f23ba0: e1530007 cmp r3, r7 + 1f23ba4: 9affffe1 bls 1f23b30 + 1f23ba8: e35e0007 cmp lr, #7 + 1f23bac: 8a00003a bhi 1f23c9c + 1f23bb0: e35a007f cmp sl, #127 ; 0x7f + 1f23bb4: 935e0004 cmpls lr, #4 + 1f23bb8: 1a00005a bne 1f23d28 + 1f23bbc: e59d2008 ldr r2, [sp, #8] + 1f23bc0: e1a031ae lsr r3, lr, #3 + 1f23bc4: e2804001 add r4, r0, #1 + 1f23bc8: e5dd1010 ldrb r1, [sp, #16] + 1f23bcc: e082c004 add ip, r2, r4 + 1f23bd0: e1a03703 lsl r3, r3, #14 + 1f23bd4: e7c21000 strb r1, [r2, r0] + 1f23bd8: e1a03383 lsl r3, r3, #7 + 1f23bdc: e31304fe tst r3, #-33554432 ; 0xfe000000 + 1f23be0: 020e307f andeq r3, lr, #127 ; 0x7f + 1f23be4: 03a00001 moveq r0, #1 + 1f23be8: 1a00007d bne 1f23de4 + 1f23bec: e5cc3000 strb r3, [ip] + 1f23bf0: e1a021aa lsr r2, sl, #3 + 1f23bf4: e59d3008 ldr r3, [sp, #8] + 1f23bf8: e0800004 add r0, r0, r4 + 1f23bfc: e083c000 add ip, r3, r0 + 1f23c00: e1a03702 lsl r3, r2, #14 + 1f23c04: e31304fe tst r3, #-33554432 ; 0xfe000000 + 1f23c08: 1a00005d bne 1f23d84 + 1f23c0c: e1a02a82 lsl r2, r2, #21 + 1f23c10: e31204fe tst r2, #-33554432 ; 0xfe000000 + 1f23c14: 020a307f andeq r3, sl, #127 ; 0x7f + 1f23c18: 01a0400c moveq r4, ip + 1f23c1c: 03a05001 moveq r5, #1 + 1f23c20: 1a00006c bne 1f23dd8 + 1f23c24: e5c43000 strb r3, [r4] + 1f23c28: e0800005 add r0, r0, r5 + 1f23c2c: e59d3004 ldr r3, [sp, #4] + 1f23c30: e08bb00e add fp, fp, lr + 1f23c34: e06e3003 rsb r3, lr, r3 + 1f23c38: e58d3004 str r3, [sp, #4] + 1f23c3c: e3530003 cmp r3, #3 + 1f23c40: 8affffaa bhi 1f23af0 + 1f23c44: e59d2018 ldr r2, [sp, #24] + 1f23c48: e59dc010 ldr ip, [sp, #16] + 1f23c4c: e15b0002 cmp fp, r2 + 1f23c50: 2a00000e bcs 1f23c90 + 1f23c54: e59d200c ldr r2, [sp, #12] + 1f23c58: e3a01000 mov r1, #0 + 1f23c5c: e59d401c ldr r4, [sp, #28] + 1f23c60: e59de008 ldr lr, [sp, #8] + 1f23c64: e082300b add r3, r2, fp + 1f23c68: e4d32001 ldrb r2, [r3], #1 + 1f23c6c: e15c0002 cmp ip, r2 + 1f23c70: 07cec000 strbeq ip, [lr, r0] + 1f23c74: 02802001 addeq r2, r0, #1 + 1f23c78: 17ce2000 strbne r2, [lr, r0] + 1f23c7c: 02800002 addeq r0, r0, #2 + 1f23c80: 12800001 addne r0, r0, #1 + 1f23c84: 07ce1002 strbeq r1, [lr, r2] + 1f23c88: e1530004 cmp r3, r4 + 1f23c8c: 1afffff5 bne 1f23c68 + 1f23c90: e28dde42 add sp, sp, #1056 ; 0x420 + 1f23c94: e28dd004 add sp, sp, #4 + 1f23c98: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f23c9c: e1a031ae lsr r3, lr, #3 + 1f23ca0: e59d2008 ldr r2, [sp, #8] + 1f23ca4: e2804001 add r4, r0, #1 + 1f23ca8: e5dd1010 ldrb r1, [sp, #16] + 1f23cac: e1a03703 lsl r3, r3, #14 + 1f23cb0: e082c004 add ip, r2, r4 + 1f23cb4: e31304fe tst r3, #-33554432 ; 0xfe000000 + 1f23cb8: e7c21000 strb r1, [r2, r0] + 1f23cbc: 0affffc5 beq 1f23bd8 + 1f23cc0: e1a0500c mov r5, ip + 1f23cc4: e3a03002 mov r3, #2 + 1f23cc8: e3a00003 mov r0, #3 + 1f23ccc: e0632183 rsb r2, r3, r3, lsl #3 + 1f23cd0: e3530001 cmp r3, #1 + 1f23cd4: e2423007 sub r3, r2, #7 + 1f23cd8: e28cc001 add ip, ip, #1 + 1f23cdc: e1a0123e lsr r1, lr, r2 + 1f23ce0: e1a0333e lsr r3, lr, r3 + 1f23ce4: e1e01c81 mvn r1, r1, lsl #25 + 1f23ce8: e203307f and r3, r3, #127 ; 0x7f + 1f23cec: e1e01ca1 mvn r1, r1, lsr #25 + 1f23cf0: e5c51000 strb r1, [r5] + 1f23cf4: 0affffbc beq 1f23bec + 1f23cf8: e242200e sub r2, r2, #14 + 1f23cfc: e3833080 orr r3, r3, #128 ; 0x80 + 1f23d00: e5c53001 strb r3, [r5, #1] + 1f23d04: e285c002 add ip, r5, #2 + 1f23d08: e1a0323e lsr r3, lr, r2 + 1f23d0c: e203307f and r3, r3, #127 ; 0x7f + 1f23d10: eaffffb5 b 1f23bec + 1f23d14: e1a09001 mov r9, r1 + 1f23d18: e15e0009 cmp lr, r9 + 1f23d1c: 31a0e009 movcc lr, r9 + 1f23d20: 31a0a003 movcc sl, r3 + 1f23d24: eaffff9c b 1f23b9c + 1f23d28: e3033fff movw r3, #16383 ; 0x3fff + 1f23d2c: e15a0003 cmp sl, r3 + 1f23d30: 935e0005 cmpls lr, #5 + 1f23d34: 03a0e005 moveq lr, #5 + 1f23d38: 0affff9f beq 1f23bbc + 1f23d3c: e24e3006 sub r3, lr, #6 + 1f23d40: e3530001 cmp r3, #1 + 1f23d44: 9affffd4 bls 1f23c9c + 1f23d48: e5dc3000 ldrb r3, [ip] + 1f23d4c: e28bb001 add fp, fp, #1 + 1f23d50: e59d1010 ldr r1, [sp, #16] + 1f23d54: e59d2008 ldr r2, [sp, #8] + 1f23d58: e1510003 cmp r1, r3 + 1f23d5c: e7c23000 strb r3, [r2, r0] + 1f23d60: e2802001 add r2, r0, #1 + 1f23d64: 0a000022 beq 1f23df4 + 1f23d68: e59d3004 ldr r3, [sp, #4] + 1f23d6c: e1a00002 mov r0, r2 + 1f23d70: e2433001 sub r3, r3, #1 + 1f23d74: e58d3004 str r3, [sp, #4] + 1f23d78: eaffffaf b 1f23c3c + 1f23d7c: e3a0a000 mov sl, #0 + 1f23d80: eaffffed b 1f23d3c + 1f23d84: e3a03002 mov r3, #2 + 1f23d88: e3a05003 mov r5, #3 + 1f23d8c: e0632183 rsb r2, r3, r3, lsl #3 + 1f23d90: e3530001 cmp r3, #1 + 1f23d94: e59d6008 ldr r6, [sp, #8] + 1f23d98: e2423007 sub r3, r2, #7 + 1f23d9c: e1a0123a lsr r1, sl, r2 + 1f23da0: e28c4001 add r4, ip, #1 + 1f23da4: e1a0333a lsr r3, sl, r3 + 1f23da8: e1e01c81 mvn r1, r1, lsl #25 + 1f23dac: e203307f and r3, r3, #127 ; 0x7f + 1f23db0: e1e01ca1 mvn r1, r1, lsr #25 + 1f23db4: e7c61000 strb r1, [r6, r0] + 1f23db8: 0affff99 beq 1f23c24 + 1f23dbc: e242200e sub r2, r2, #14 + 1f23dc0: e3833080 orr r3, r3, #128 ; 0x80 + 1f23dc4: e28c4002 add r4, ip, #2 + 1f23dc8: e5cc3001 strb r3, [ip, #1] + 1f23dcc: e1a0a23a lsr sl, sl, r2 + 1f23dd0: e20a307f and r3, sl, #127 ; 0x7f + 1f23dd4: eaffff92 b 1f23c24 + 1f23dd8: e3a03001 mov r3, #1 + 1f23ddc: e3a05002 mov r5, #2 + 1f23de0: eaffffe9 b 1f23d8c + 1f23de4: e1a0500c mov r5, ip + 1f23de8: e3a03001 mov r3, #1 + 1f23dec: e3a00002 mov r0, #2 + 1f23df0: eaffffb5 b 1f23ccc + 1f23df4: e59d3008 ldr r3, [sp, #8] + 1f23df8: e3a01000 mov r1, #0 + 1f23dfc: e7c31002 strb r1, [r3, r2] + 1f23e00: e2802002 add r2, r0, #2 + 1f23e04: eaffffd7 b 1f23d68 + +01f23e08 : + 1f23e08: e3520000 cmp r2, #0 + 1f23e0c: 1a000001 bne 1f23e18 + 1f23e10: e3a00000 mov r0, #0 + 1f23e14: e12fff1e bx lr + 1f23e18: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f23e1c: e1a09000 mov r9, r0 + 1f23e20: e2820701 add r0, r2, #262144 ; 0x40000 + 1f23e24: e24dde42 sub sp, sp, #1056 ; 0x420 + 1f23e28: e24dd00c sub sp, sp, #12 + 1f23e2c: e58d100c str r1, [sp, #12] + 1f23e30: e58d2018 str r2, [sp, #24] + 1f23e34: eb0069cb bl 1f3e568 + 1f23e38: e2503000 subs r3, r0, #0 + 1f23e3c: e58d301c str r3, [sp, #28] + 1f23e40: e1a01003 mov r1, r3 + 1f23e44: 0a000182 beq 1f24454 + 1f23e48: e7a03153 sbfx r3, r3, #2, #1 + 1f23e4c: e2815701 add r5, r1, #262144 ; 0x40000 + 1f23e50: e2133003 ands r3, r3, #3 + 1f23e54: 0a000178 beq 1f2443c + 1f23e58: e3530001 cmp r3, #1 + 1f23e5c: e3e02000 mvn r2, #0 + 1f23e60: e5812000 str r2, [r1] + 1f23e64: 0a0000e7 beq 1f24208 + 1f23e68: e3530003 cmp r3, #3 + 1f23e6c: e5812004 str r2, [r1, #4] + 1f23e70: 1a0000e1 bne 1f241fc + 1f23e74: e5812008 str r2, [r1, #8] + 1f23e78: e30fcffd movw ip, #65533 ; 0xfffd + 1f23e7c: e1a00003 mov r0, r3 + 1f23e80: e2634801 rsb r4, r3, #65536 ; 0x10000 + 1f23e84: e3031fff movw r1, #16383 ; 0x3fff + 1f23e88: e30feffc movw lr, #65532 ; 0xfffc + 1f23e8c: e59d201c ldr r2, [sp, #28] + 1f23e90: f3c70e5f vmov.i8 q8, #255 ; 0xff + 1f23e94: e0823103 add r3, r2, r3, lsl #2 + 1f23e98: e3a02000 mov r2, #0 + 1f23e9c: e2822001 add r2, r2, #1 + 1f23ea0: f4430adf vst1.64 {d16-d17}, [r3 :64] + 1f23ea4: e1520001 cmp r2, r1 + 1f23ea8: e2833010 add r3, r3, #16 + 1f23eac: 3afffffa bcc 1f23e9c + 1f23eb0: e15e0004 cmp lr, r4 + 1f23eb4: e080000e add r0, r0, lr + 1f23eb8: e06ec00c rsb ip, lr, ip + 1f23ebc: 0a00000a beq 1f23eec + 1f23ec0: e59d101c ldr r1, [sp, #28] + 1f23ec4: e35c0001 cmp ip, #1 + 1f23ec8: e3e03000 mvn r3, #0 + 1f23ecc: e2802001 add r2, r0, #1 + 1f23ed0: e7813100 str r3, [r1, r0, lsl #2] + 1f23ed4: 0a000004 beq 1f23eec + 1f23ed8: e35c0002 cmp ip, #2 + 1f23edc: e7813102 str r3, [r1, r2, lsl #2] + 1f23ee0: e2800002 add r0, r0, #2 + 1f23ee4: 11a02001 movne r2, r1 + 1f23ee8: 17823100 strne r3, [r2, r0, lsl #2] + 1f23eec: e59d3018 ldr r3, [sp, #24] + 1f23ef0: e253e001 subs lr, r3, #1 + 1f23ef4: 0a00000f beq 1f23f38 + 1f23ef8: e59d301c ldr r3, [sp, #28] + 1f23efc: e1a00009 mov r0, r9 + 1f23f00: e3a01000 mov r1, #0 + 1f23f04: e283cbff add ip, r3, #261120 ; 0x3fc00 + 1f23f08: e1a02003 mov r2, r3 + 1f23f0c: e28ccfff add ip, ip, #1020 ; 0x3fc + 1f23f10: e5d04000 ldrb r4, [r0] + 1f23f14: e5f03001 ldrb r3, [r0, #1]! + 1f23f18: e1833404 orr r3, r3, r4, lsl #8 + 1f23f1c: e7924103 ldr r4, [r2, r3, lsl #2] + 1f23f20: e7821103 str r1, [r2, r3, lsl #2] + 1f23f24: e2811001 add r1, r1, #1 + 1f23f28: e151000e cmp r1, lr + 1f23f2c: e5ac4004 str r4, [ip, #4]! + 1f23f30: 1afffff6 bne 1f23f10 + 1f23f34: e59d3018 ldr r3, [sp, #24] + 1f23f38: e2433107 sub r3, r3, #-1073741823 ; 0xc0000001 + 1f23f3c: f2c00050 vmov.i32 q8, #0 ; 0x00000000 + 1f23f40: e3e02000 mvn r2, #0 + 1f23f44: e7852103 str r2, [r5, r3, lsl #2] + 1f23f48: e28d3028 add r3, sp, #40 ; 0x28 + 1f23f4c: e28d2e42 add r2, sp, #1056 ; 0x420 + 1f23f50: f4430adf vst1.64 {d16-d17}, [r3 :64] + 1f23f54: e2822008 add r2, r2, #8 + 1f23f58: e2833010 add r3, r3, #16 + 1f23f5c: e1530002 cmp r3, r2 + 1f23f60: 1afffff9 bne 1f23f4c + 1f23f64: e59d3018 ldr r3, [sp, #24] + 1f23f68: e1a01009 mov r1, r9 + 1f23f6c: e0893003 add r3, r9, r3 + 1f23f70: e58d3024 str r3, [sp, #36] ; 0x24 + 1f23f74: e1a00003 mov r0, r3 + 1f23f78: e4d13001 ldrb r3, [r1], #1 + 1f23f7c: e28d2e42 add r2, sp, #1056 ; 0x420 + 1f23f80: e2822008 add r2, r2, #8 + 1f23f84: e1510000 cmp r1, r0 + 1f23f88: e0823103 add r3, r2, r3, lsl #2 + 1f23f8c: e5132400 ldr r2, [r3, #-1024] ; 0xfffffc00 + 1f23f90: e2822001 add r2, r2, #1 + 1f23f94: e5032400 str r2, [r3, #-1024] ; 0xfffffc00 + 1f23f98: 1afffff6 bne 1f23f78 + 1f23f9c: e28d2028 add r2, sp, #40 ; 0x28 + 1f23fa0: e3a03001 mov r3, #1 + 1f23fa4: e3a0a000 mov sl, #0 + 1f23fa8: e28d1e42 add r1, sp, #1056 ; 0x420 + 1f23fac: e5b2c004 ldr ip, [r2, #4]! + 1f23fb0: e2811008 add r1, r1, #8 + 1f23fb4: e081010a add r0, r1, sl, lsl #2 + 1f23fb8: e6ef1073 uxtb r1, r3 + 1f23fbc: e2833001 add r3, r3, #1 + 1f23fc0: e5100400 ldr r0, [r0, #-1024] ; 0xfffffc00 + 1f23fc4: e15c0000 cmp ip, r0 + 1f23fc8: 31a0a001 movcc sl, r1 + 1f23fcc: e3530c01 cmp r3, #256 ; 0x100 + 1f23fd0: 1afffff4 bne 1f23fa8 + 1f23fd4: e59d300c ldr r3, [sp, #12] + 1f23fd8: e3a0b000 mov fp, #0 + 1f23fdc: e59d2018 ldr r2, [sp, #24] + 1f23fe0: e58d2008 str r2, [sp, #8] + 1f23fe4: e3a02001 mov r2, #1 + 1f23fe8: e5c3a000 strb sl, [r3] + 1f23fec: e30f3fff movw r3, #65535 ; 0xffff + 1f23ff0: e340301f movt r3, #31 + 1f23ff4: e58d3020 str r3, [sp, #32] + 1f23ff8: e308369f movw r3, #34463 ; 0x869f + 1f23ffc: e3403001 movt r3, #1 + 1f24000: e58da014 str sl, [sp, #20] + 1f24004: e1a0a003 mov sl, r3 + 1f24008: e58d2010 str r2, [sp, #16] + 1f2400c: e795e10b ldr lr, [r5, fp, lsl #2] + 1f24010: e089800b add r8, r9, fp + 1f24014: e37e0001 cmn lr, #1 + 1f24018: 0a0000b1 beq 1f242e4 + 1f2401c: e06e700b rsb r7, lr, fp + 1f24020: e3a03000 mov r3, #0 + 1f24024: e157000a cmp r7, sl + 1f24028: e3a06003 mov r6, #3 + 1f2402c: e58d3004 str r3, [sp, #4] + 1f24030: 9a000006 bls 1f24050 + 1f24034: ea0000ad b 1f242f0 + 1f24038: e795e10e ldr lr, [r5, lr, lsl #2] + 1f2403c: e37e0001 cmn lr, #1 + 1f24040: 0a000022 beq 1f240d0 + 1f24044: e06e700b rsb r7, lr, fp + 1f24048: e157000a cmp r7, sl + 1f2404c: 8a00001f bhi 1f240d0 + 1f24050: e089200e add r2, r9, lr + 1f24054: e7d83006 ldrb r3, [r8, r6] + 1f24058: e7d21006 ldrb r1, [r2, r6] + 1f2405c: e1510003 cmp r1, r3 + 1f24060: 1afffff4 bne 1f24038 + 1f24064: e59d3008 ldr r3, [sp, #8] + 1f24068: e1530007 cmp r3, r7 + 1f2406c: 31a04003 movcc r4, r3 + 1f24070: 21a04007 movcs r4, r7 + 1f24074: e3540002 cmp r4, #2 + 1f24078: 9a000094 bls 1f242d0 + 1f2407c: e5d21002 ldrb r1, [r2, #2] + 1f24080: e5d83002 ldrb r3, [r8, #2] + 1f24084: e1510003 cmp r1, r3 + 1f24088: 1a000090 bne 1f242d0 + 1f2408c: e2822002 add r2, r2, #2 + 1f24090: e2881002 add r1, r8, #2 + 1f24094: e3a03002 mov r3, #2 + 1f24098: ea000003 b 1f240ac + 1f2409c: e5f1c001 ldrb ip, [r1, #1]! + 1f240a0: e5f20001 ldrb r0, [r2, #1]! + 1f240a4: e15c0000 cmp ip, r0 + 1f240a8: 1a000059 bne 1f24214 + 1f240ac: e2833001 add r3, r3, #1 + 1f240b0: e1540003 cmp r4, r3 + 1f240b4: 1afffff8 bne 1f2409c + 1f240b8: e1560004 cmp r6, r4 + 1f240bc: 358d7004 strcc r7, [sp, #4] + 1f240c0: 31a06004 movcc r6, r4 + 1f240c4: e795e10e ldr lr, [r5, lr, lsl #2] + 1f240c8: e37e0001 cmn lr, #1 + 1f240cc: 1affffdc bne 1f24044 + 1f240d0: e3560007 cmp r6, #7 + 1f240d4: 8a000053 bhi 1f24228 + 1f240d8: e59d3004 ldr r3, [sp, #4] + 1f240dc: e353007f cmp r3, #127 ; 0x7f + 1f240e0: 93560004 cmpls r6, #4 + 1f240e4: 1a00006e bne 1f242a4 + 1f240e8: e59d2010 ldr r2, [sp, #16] + 1f240ec: e1a031a6 lsr r3, r6, #3 + 1f240f0: e59d100c ldr r1, [sp, #12] + 1f240f4: e5dd0014 ldrb r0, [sp, #20] + 1f240f8: e282c001 add ip, r2, #1 + 1f240fc: e1a03703 lsl r3, r3, #14 + 1f24100: e7c10002 strb r0, [r1, r2] + 1f24104: e081000c add r0, r1, ip + 1f24108: e1a03383 lsl r3, r3, #7 + 1f2410c: e31304fe tst r3, #-33554432 ; 0xfe000000 + 1f24110: 0206307f andeq r3, r6, #127 ; 0x7f + 1f24114: 03a0e001 moveq lr, #1 + 1f24118: 1a0000bd bne 1f24414 + 1f2411c: e59d2004 ldr r2, [sp, #4] + 1f24120: e08ec00c add ip, lr, ip + 1f24124: e5c03000 strb r3, [r0] + 1f24128: e59d300c ldr r3, [sp, #12] + 1f2412c: e1a021a2 lsr r2, r2, #3 + 1f24130: e312041e tst r2, #503316480 ; 0x1e000000 + 1f24134: e083100c add r1, r3, ip + 1f24138: 1a0000b2 bne 1f24408 + 1f2413c: e1a03382 lsl r3, r2, #7 + 1f24140: e31304fe tst r3, #-33554432 ; 0xfe000000 + 1f24144: 1a000088 bne 1f2436c + 1f24148: e1a03702 lsl r3, r2, #14 + 1f2414c: e31304fe tst r3, #-33554432 ; 0xfe000000 + 1f24150: 1a0000b6 bne 1f24430 + 1f24154: e1a02a82 lsl r2, r2, #21 + 1f24158: e31204fe tst r2, #-33554432 ; 0xfe000000 + 1f2415c: 1a0000b0 bne 1f24424 + 1f24160: e59d3004 ldr r3, [sp, #4] + 1f24164: e1a0e001 mov lr, r1 + 1f24168: e3a07001 mov r7, #1 + 1f2416c: e203307f and r3, r3, #127 ; 0x7f + 1f24170: e5ce3000 strb r3, [lr] + 1f24174: e08c3007 add r3, ip, r7 + 1f24178: e58d3010 str r3, [sp, #16] + 1f2417c: e08bb006 add fp, fp, r6 + 1f24180: e59d3008 ldr r3, [sp, #8] + 1f24184: e0663003 rsb r3, r6, r3 + 1f24188: e58d3008 str r3, [sp, #8] + 1f2418c: e3530003 cmp r3, #3 + 1f24190: 8affff9d bhi 1f2400c + 1f24194: e59d3018 ldr r3, [sp, #24] + 1f24198: e59da014 ldr sl, [sp, #20] + 1f2419c: e15b0003 cmp fp, r3 + 1f241a0: 2a00000f bcs 1f241e4 + 1f241a4: e59d3010 ldr r3, [sp, #16] + 1f241a8: e089b00b add fp, r9, fp + 1f241ac: e59dc024 ldr ip, [sp, #36] ; 0x24 + 1f241b0: e3a02000 mov r2, #0 + 1f241b4: e59d000c ldr r0, [sp, #12] + 1f241b8: e4db1001 ldrb r1, [fp], #1 + 1f241bc: e15a0001 cmp sl, r1 + 1f241c0: 07c0a003 strbeq sl, [r0, r3] + 1f241c4: 02831001 addeq r1, r3, #1 + 1f241c8: 17c01003 strbne r1, [r0, r3] + 1f241cc: 02833002 addeq r3, r3, #2 + 1f241d0: 12833001 addne r3, r3, #1 + 1f241d4: 07c02001 strbeq r2, [r0, r1] + 1f241d8: e15b000c cmp fp, ip + 1f241dc: 1afffff5 bne 1f241b8 + 1f241e0: e58d3010 str r3, [sp, #16] + 1f241e4: e59d001c ldr r0, [sp, #28] + 1f241e8: eb0068e6 bl 1f3e588 + 1f241ec: e59d0010 ldr r0, [sp, #16] + 1f241f0: e28dde42 add sp, sp, #1056 ; 0x420 + 1f241f4: e28dd00c add sp, sp, #12 + 1f241f8: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f241fc: e30fcffe movw ip, #65534 ; 0xfffe + 1f24200: e3a00002 mov r0, #2 + 1f24204: eaffff1d b 1f23e80 + 1f24208: e30fcfff movw ip, #65535 ; 0xffff + 1f2420c: e1a00003 mov r0, r3 + 1f24210: eaffff1a b 1f23e80 + 1f24214: e1a04003 mov r4, r3 + 1f24218: e1560004 cmp r6, r4 + 1f2421c: 358d7004 strcc r7, [sp, #4] + 1f24220: 31a06004 movcc r6, r4 + 1f24224: eaffffa6 b 1f240c4 + 1f24228: e1a031a6 lsr r3, r6, #3 + 1f2422c: e59d2010 ldr r2, [sp, #16] + 1f24230: e59d100c ldr r1, [sp, #12] + 1f24234: e1a03703 lsl r3, r3, #14 + 1f24238: e5dd0014 ldrb r0, [sp, #20] + 1f2423c: e31304fe tst r3, #-33554432 ; 0xfe000000 + 1f24240: e282c001 add ip, r2, #1 + 1f24244: e7c10002 strb r0, [r1, r2] + 1f24248: e081000c add r0, r1, ip + 1f2424c: 0affffad beq 1f24108 + 1f24250: e1a04000 mov r4, r0 + 1f24254: e3a03002 mov r3, #2 + 1f24258: e3a0e003 mov lr, #3 + 1f2425c: e0632183 rsb r2, r3, r3, lsl #3 + 1f24260: e3530001 cmp r3, #1 + 1f24264: e2423007 sub r3, r2, #7 + 1f24268: e2800001 add r0, r0, #1 + 1f2426c: e1a01236 lsr r1, r6, r2 + 1f24270: e1a03336 lsr r3, r6, r3 + 1f24274: e1e01c81 mvn r1, r1, lsl #25 + 1f24278: e203307f and r3, r3, #127 ; 0x7f + 1f2427c: e1e01ca1 mvn r1, r1, lsr #25 + 1f24280: e5c41000 strb r1, [r4] + 1f24284: 0affffa4 beq 1f2411c + 1f24288: e242200e sub r2, r2, #14 + 1f2428c: e3833080 orr r3, r3, #128 ; 0x80 + 1f24290: e2840002 add r0, r4, #2 + 1f24294: e5c43001 strb r3, [r4, #1] + 1f24298: e1a02236 lsr r2, r6, r2 + 1f2429c: e202307f and r3, r2, #127 ; 0x7f + 1f242a0: eaffff9d b 1f2411c + 1f242a4: e1a02003 mov r2, r3 + 1f242a8: e2463005 sub r3, r6, #5 + 1f242ac: e16f3f13 clz r3, r3 + 1f242b0: e3520901 cmp r2, #16384 ; 0x4000 + 1f242b4: e1a032a3 lsr r3, r3, #5 + 1f242b8: 23a03000 movcs r3, #0 + 1f242bc: e3530000 cmp r3, #0 + 1f242c0: 059d3004 ldreq r3, [sp, #4] + 1f242c4: 0a000009 beq 1f242f0 + 1f242c8: e3a06005 mov r6, #5 + 1f242cc: eaffff85 b 1f240e8 + 1f242d0: e3a04002 mov r4, #2 + 1f242d4: e1560004 cmp r6, r4 + 1f242d8: 358d7004 strcc r7, [sp, #4] + 1f242dc: 31a06004 movcc r6, r4 + 1f242e0: eaffff77 b 1f240c4 + 1f242e4: e3a03000 mov r3, #0 + 1f242e8: e3a06003 mov r6, #3 + 1f242ec: e58d3004 str r3, [sp, #4] + 1f242f0: e59d2020 ldr r2, [sp, #32] + 1f242f4: e1530002 cmp r3, r2 + 1f242f8: 93560006 cmpls r6, #6 + 1f242fc: 0a000006 beq 1f2431c + 1f24300: e373021f cmn r3, #-268435455 ; 0xf0000001 + 1f24304: 93560007 cmpls r6, #7 + 1f24308: 03a06001 moveq r6, #1 + 1f2430c: 13a06000 movne r6, #0 + 1f24310: 1a000003 bne 1f24324 + 1f24314: e3a06007 mov r6, #7 + 1f24318: eaffff72 b 1f240e8 + 1f2431c: e3a06006 mov r6, #6 + 1f24320: eaffff70 b 1f240e8 + 1f24324: e59d3010 ldr r3, [sp, #16] + 1f24328: e28bb001 add fp, fp, #1 + 1f2432c: e59d100c ldr r1, [sp, #12] + 1f24330: e5d82000 ldrb r2, [r8] + 1f24334: e7c12003 strb r2, [r1, r3] + 1f24338: e2833001 add r3, r3, #1 + 1f2433c: e59d1014 ldr r1, [sp, #20] + 1f24340: e1510002 cmp r1, r2 + 1f24344: 059d200c ldreq r2, [sp, #12] + 1f24348: 07c26003 strbeq r6, [r2, r3] + 1f2434c: e59d2008 ldr r2, [sp, #8] + 1f24350: 059d3010 ldreq r3, [sp, #16] + 1f24354: e2422001 sub r2, r2, #1 + 1f24358: e58d2008 str r2, [sp, #8] + 1f2435c: 02833002 addeq r3, r3, #2 + 1f24360: e58d3010 str r3, [sp, #16] + 1f24364: e1a03002 mov r3, r2 + 1f24368: eaffff87 b 1f2418c + 1f2436c: e3a04003 mov r4, #3 + 1f24370: e3a07004 mov r7, #4 + 1f24374: e59d8004 ldr r8, [sp, #4] + 1f24378: e0642184 rsb r2, r4, r4, lsl #3 + 1f2437c: e2423007 sub r3, r2, #7 + 1f24380: e3540001 cmp r4, #1 + 1f24384: e281e001 add lr, r1, #1 + 1f24388: e1a00238 lsr r0, r8, r2 + 1f2438c: e1a03338 lsr r3, r8, r3 + 1f24390: e59d800c ldr r8, [sp, #12] + 1f24394: e203307f and r3, r3, #127 ; 0x7f + 1f24398: e1e00c80 mvn r0, r0, lsl #25 + 1f2439c: e1e00ca0 mvn r0, r0, lsr #25 + 1f243a0: e7c8000c strb r0, [r8, ip] + 1f243a4: 0affff71 beq 1f24170 + 1f243a8: e59d8004 ldr r8, [sp, #4] + 1f243ac: e242000e sub r0, r2, #14 + 1f243b0: e3540002 cmp r4, #2 + 1f243b4: e3833080 orr r3, r3, #128 ; 0x80 + 1f243b8: e5c13001 strb r3, [r1, #1] + 1f243bc: e281e002 add lr, r1, #2 + 1f243c0: e1a03038 lsr r3, r8, r0 + 1f243c4: e203307f and r3, r3, #127 ; 0x7f + 1f243c8: 0affff68 beq 1f24170 + 1f243cc: e2420015 sub r0, r2, #21 + 1f243d0: e3540003 cmp r4, #3 + 1f243d4: e3833080 orr r3, r3, #128 ; 0x80 + 1f243d8: e5c13002 strb r3, [r1, #2] + 1f243dc: e1a03038 lsr r3, r8, r0 + 1f243e0: e281e003 add lr, r1, #3 + 1f243e4: e203307f and r3, r3, #127 ; 0x7f + 1f243e8: 0affff60 beq 1f24170 + 1f243ec: e242201c sub r2, r2, #28 + 1f243f0: e3833080 orr r3, r3, #128 ; 0x80 + 1f243f4: e281e004 add lr, r1, #4 + 1f243f8: e5c13003 strb r3, [r1, #3] + 1f243fc: e1a02238 lsr r2, r8, r2 + 1f24400: e202307f and r3, r2, #127 ; 0x7f + 1f24404: eaffff59 b 1f24170 + 1f24408: e3a04004 mov r4, #4 + 1f2440c: e3a07005 mov r7, #5 + 1f24410: eaffffd7 b 1f24374 + 1f24414: e1a04000 mov r4, r0 + 1f24418: e3a03001 mov r3, #1 + 1f2441c: e3a0e002 mov lr, #2 + 1f24420: eaffff8d b 1f2425c + 1f24424: e3a04001 mov r4, #1 + 1f24428: e3a07002 mov r7, #2 + 1f2442c: eaffffd0 b 1f24374 + 1f24430: e3a04002 mov r4, #2 + 1f24434: e3a07003 mov r7, #3 + 1f24438: eaffffcd b 1f24374 + 1f2443c: e3a0c801 mov ip, #65536 ; 0x10000 + 1f24440: e1a00003 mov r0, r3 + 1f24444: e1a0400c mov r4, ip + 1f24448: e1a0e00c mov lr, ip + 1f2444c: e3a01901 mov r1, #16384 ; 0x4000 + 1f24450: eafffe8d b 1f23e8c + 1f24454: e3a00000 mov r0, #0 + 1f24458: eaffff64 b 1f241f0 + +01f2445c : + 1f2445c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f24460: e252b000 subs fp, r2, #0 + 1f24464: e24dd014 sub sp, sp, #20 + 1f24468: 01a0000b moveq r0, fp + 1f2446c: 0a000016 beq 1f244cc + 1f24470: e5d0a000 ldrb sl, [r0] + 1f24474: e3a02000 mov r2, #0 + 1f24478: e3a0c001 mov ip, #1 + 1f2447c: ea000001 b 1f24488 + 1f24480: e15c000b cmp ip, fp + 1f24484: 2a00000f bcs 1f244c8 + 1f24488: e7d0300c ldrb r3, [r0, ip] + 1f2448c: e28c6001 add r6, ip, #1 + 1f24490: e15a0003 cmp sl, r3 + 1f24494: 17c13002 strbne r3, [r1, r2] + 1f24498: 11a0c006 movne ip, r6 + 1f2449c: 12822001 addne r2, r2, #1 + 1f244a0: 1afffff6 bne 1f24480 + 1f244a4: e7d03006 ldrb r3, [r0, r6] + 1f244a8: e0807006 add r7, r0, r6 + 1f244ac: e3530000 cmp r3, #0 + 1f244b0: 1a000007 bne 1f244d4 + 1f244b4: e28cc002 add ip, ip, #2 + 1f244b8: e7c1a002 strb sl, [r1, r2] + 1f244bc: e15c000b cmp ip, fp + 1f244c0: e2822001 add r2, r2, #1 + 1f244c4: 3affffef bcc 1f24488 + 1f244c8: e1a00002 mov r0, r2 + 1f244cc: e28dd014 add sp, sp, #20 + 1f244d0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f244d4: e1a05007 mov r5, r7 + 1f244d8: e3a0e000 mov lr, #0 + 1f244dc: e4d5c001 ldrb ip, [r5], #1 + 1f244e0: e3cc307f bic r3, ip, #127 ; 0x7f + 1f244e4: e20cc07f and ip, ip, #127 ; 0x7f + 1f244e8: e21330ff ands r3, r3, #255 ; 0xff + 1f244ec: e18ce38e orr lr, ip, lr, lsl #7 + 1f244f0: e067c005 rsb ip, r7, r5 + 1f244f4: 1afffff8 bne 1f244dc + 1f244f8: e086c00c add ip, r6, ip + 1f244fc: e080600c add r6, r0, ip + 1f24500: e1a05006 mov r5, r6 + 1f24504: e4d54001 ldrb r4, [r5], #1 + 1f24508: e3140080 tst r4, #128 ; 0x80 + 1f2450c: e204407f and r4, r4, #127 ; 0x7f + 1f24510: e1843383 orr r3, r4, r3, lsl #7 + 1f24514: e0664005 rsb r4, r6, r5 + 1f24518: 1afffff9 bne 1f24504 + 1f2451c: e35e0000 cmp lr, #0 + 1f24520: e08cc004 add ip, ip, r4 + 1f24524: 0affffd5 beq 1f24480 + 1f24528: e2824010 add r4, r2, #16 + 1f2452c: e0637002 rsb r7, r3, r2 + 1f24530: e0635004 rsb r5, r3, r4 + 1f24534: e1570004 cmp r7, r4 + 1f24538: b1520005 cmplt r2, r5 + 1f2453c: a3a04001 movge r4, #1 + 1f24540: b3a04000 movlt r4, #0 + 1f24544: e35e0015 cmp lr, #21 + 1f24548: 93a04000 movls r4, #0 + 1f2454c: 82044001 andhi r4, r4, #1 + 1f24550: e3540000 cmp r4, #0 + 1f24554: 0a0000ed beq 1f24910 + 1f24558: e0815007 add r5, r1, r7 + 1f2455c: e2055007 and r5, r5, #7 + 1f24560: e2655000 rsb r5, r5, #0 + 1f24564: e205500f and r5, r5, #15 + 1f24568: e155000e cmp r5, lr + 1f2456c: 21a0500e movcs r5, lr + 1f24570: e3550000 cmp r5, #0 + 1f24574: 0a0000e0 beq 1f248fc + 1f24578: e3550001 cmp r5, #1 + 1f2457c: e7d14007 ldrb r4, [r1, r7] + 1f24580: e7c14002 strb r4, [r1, r2] + 1f24584: e2824001 add r4, r2, #1 + 1f24588: 0a0000dc beq 1f24900 + 1f2458c: e0636004 rsb r6, r3, r4 + 1f24590: e3550002 cmp r5, #2 + 1f24594: e7d16006 ldrb r6, [r1, r6] + 1f24598: e7c16004 strb r6, [r1, r4] + 1f2459c: e2824002 add r4, r2, #2 + 1f245a0: 0a0000d6 beq 1f24900 + 1f245a4: e0636004 rsb r6, r3, r4 + 1f245a8: e3550003 cmp r5, #3 + 1f245ac: e7d16006 ldrb r6, [r1, r6] + 1f245b0: e7c16004 strb r6, [r1, r4] + 1f245b4: e2824003 add r4, r2, #3 + 1f245b8: 0a0000d0 beq 1f24900 + 1f245bc: e0636004 rsb r6, r3, r4 + 1f245c0: e3550004 cmp r5, #4 + 1f245c4: e7d16006 ldrb r6, [r1, r6] + 1f245c8: e7c16004 strb r6, [r1, r4] + 1f245cc: e2824004 add r4, r2, #4 + 1f245d0: 0a0000ca beq 1f24900 + 1f245d4: e0636004 rsb r6, r3, r4 + 1f245d8: e3550005 cmp r5, #5 + 1f245dc: e7d16006 ldrb r6, [r1, r6] + 1f245e0: e7c16004 strb r6, [r1, r4] + 1f245e4: e2824005 add r4, r2, #5 + 1f245e8: 0a0000c4 beq 1f24900 + 1f245ec: e0636004 rsb r6, r3, r4 + 1f245f0: e3550006 cmp r5, #6 + 1f245f4: e7d16006 ldrb r6, [r1, r6] + 1f245f8: e7c16004 strb r6, [r1, r4] + 1f245fc: e2824006 add r4, r2, #6 + 1f24600: 0a0000cb beq 1f24934 + 1f24604: e0636004 rsb r6, r3, r4 + 1f24608: e3550007 cmp r5, #7 + 1f2460c: e7d16006 ldrb r6, [r1, r6] + 1f24610: e7c16004 strb r6, [r1, r4] + 1f24614: e2824007 add r4, r2, #7 + 1f24618: 0a0000b8 beq 1f24900 + 1f2461c: e0636004 rsb r6, r3, r4 + 1f24620: e3550008 cmp r5, #8 + 1f24624: e7d16006 ldrb r6, [r1, r6] + 1f24628: e7c16004 strb r6, [r1, r4] + 1f2462c: e2824008 add r4, r2, #8 + 1f24630: 0a0000b2 beq 1f24900 + 1f24634: e0636004 rsb r6, r3, r4 + 1f24638: e3550009 cmp r5, #9 + 1f2463c: e7d16006 ldrb r6, [r1, r6] + 1f24640: e7c16004 strb r6, [r1, r4] + 1f24644: e2824009 add r4, r2, #9 + 1f24648: 0a0000ac beq 1f24900 + 1f2464c: e0636004 rsb r6, r3, r4 + 1f24650: e355000a cmp r5, #10 + 1f24654: e7d16006 ldrb r6, [r1, r6] + 1f24658: e7c16004 strb r6, [r1, r4] + 1f2465c: e282400a add r4, r2, #10 + 1f24660: 0a0000a6 beq 1f24900 + 1f24664: e0636004 rsb r6, r3, r4 + 1f24668: e355000b cmp r5, #11 + 1f2466c: e7d16006 ldrb r6, [r1, r6] + 1f24670: e7c16004 strb r6, [r1, r4] + 1f24674: e282400b add r4, r2, #11 + 1f24678: 0a0000a0 beq 1f24900 + 1f2467c: e0636004 rsb r6, r3, r4 + 1f24680: e355000c cmp r5, #12 + 1f24684: e7d16006 ldrb r6, [r1, r6] + 1f24688: e7c16004 strb r6, [r1, r4] + 1f2468c: e282400c add r4, r2, #12 + 1f24690: 0a00009a beq 1f24900 + 1f24694: e0636004 rsb r6, r3, r4 + 1f24698: e355000d cmp r5, #13 + 1f2469c: e7d16006 ldrb r6, [r1, r6] + 1f246a0: e7c16004 strb r6, [r1, r4] + 1f246a4: e282400d add r4, r2, #13 + 1f246a8: 0a000094 beq 1f24900 + 1f246ac: e0636004 rsb r6, r3, r4 + 1f246b0: e355000f cmp r5, #15 + 1f246b4: e7d16006 ldrb r6, [r1, r6] + 1f246b8: e7c16004 strb r6, [r1, r4] + 1f246bc: e282400e add r4, r2, #14 + 1f246c0: 1a00009d bne 1f2493c + 1f246c4: e0638004 rsb r8, r3, r4 + 1f246c8: e1a06005 mov r6, r5 + 1f246cc: e7d18008 ldrb r8, [r1, r8] + 1f246d0: e7c18004 strb r8, [r1, r4] + 1f246d4: e282400f add r4, r2, #15 + 1f246d8: e065800e rsb r8, r5, lr + 1f246dc: e58d8000 str r8, [sp] + 1f246e0: e2488010 sub r8, r8, #16 + 1f246e4: e24e9001 sub r9, lr, #1 + 1f246e8: e0659009 rsb r9, r5, r9 + 1f246ec: e1a08228 lsr r8, r8, #4 + 1f246f0: e359000e cmp r9, #14 + 1f246f4: e2888001 add r8, r8, #1 + 1f246f8: e1a09208 lsl r9, r8, #4 + 1f246fc: 9a000016 bls 1f2475c + 1f24700: e0857007 add r7, r5, r7 + 1f24704: e0825005 add r5, r2, r5 + 1f24708: e0815005 add r5, r1, r5 + 1f2470c: e58d5008 str r5, [sp, #8] + 1f24710: e3a05000 mov r5, #0 + 1f24714: e58d5004 str r5, [sp, #4] + 1f24718: e58d300c str r3, [sp, #12] + 1f2471c: e0817007 add r7, r1, r7 + 1f24720: e99d0028 ldmib sp, {r3, r5} + 1f24724: f4670adf vld1.64 {d16-d17}, [r7 :64] + 1f24728: e2833001 add r3, r3, #1 + 1f2472c: e1530008 cmp r3, r8 + 1f24730: e58d3004 str r3, [sp, #4] + 1f24734: e2877010 add r7, r7, #16 + 1f24738: f4450a0f vst1.8 {d16-d17}, [r5] + 1f2473c: e2855010 add r5, r5, #16 + 1f24740: 3afffff7 bcc 1f24724 + 1f24744: e59d5000 ldr r5, [sp] + 1f24748: e0866009 add r6, r6, r9 + 1f2474c: e59d300c ldr r3, [sp, #12] + 1f24750: e0844009 add r4, r4, r9 + 1f24754: e1550009 cmp r5, r9 + 1f24758: 0a00006a beq 1f24908 + 1f2475c: e0635004 rsb r5, r3, r4 + 1f24760: e2867001 add r7, r6, #1 + 1f24764: e157000e cmp r7, lr + 1f24768: e2848001 add r8, r4, #1 + 1f2476c: e7d15005 ldrb r5, [r1, r5] + 1f24770: e7c15004 strb r5, [r1, r4] + 1f24774: 2a000063 bcs 1f24908 + 1f24778: e0635008 rsb r5, r3, r8 + 1f2477c: e2867002 add r7, r6, #2 + 1f24780: e15e0007 cmp lr, r7 + 1f24784: e2847002 add r7, r4, #2 + 1f24788: e7d15005 ldrb r5, [r1, r5] + 1f2478c: e7c15008 strb r5, [r1, r8] + 1f24790: 9a00005c bls 1f24908 + 1f24794: e0638007 rsb r8, r3, r7 + 1f24798: e2865003 add r5, r6, #3 + 1f2479c: e15e0005 cmp lr, r5 + 1f247a0: e2845003 add r5, r4, #3 + 1f247a4: e7d18008 ldrb r8, [r1, r8] + 1f247a8: e7c18007 strb r8, [r1, r7] + 1f247ac: 9a000055 bls 1f24908 + 1f247b0: e0638005 rsb r8, r3, r5 + 1f247b4: e2867004 add r7, r6, #4 + 1f247b8: e15e0007 cmp lr, r7 + 1f247bc: e2847004 add r7, r4, #4 + 1f247c0: e7d18008 ldrb r8, [r1, r8] + 1f247c4: e7c18005 strb r8, [r1, r5] + 1f247c8: 9a00004e bls 1f24908 + 1f247cc: e0638007 rsb r8, r3, r7 + 1f247d0: e2865005 add r5, r6, #5 + 1f247d4: e15e0005 cmp lr, r5 + 1f247d8: e2845005 add r5, r4, #5 + 1f247dc: e7d18008 ldrb r8, [r1, r8] + 1f247e0: e7c18007 strb r8, [r1, r7] + 1f247e4: 9a000047 bls 1f24908 + 1f247e8: e0638005 rsb r8, r3, r5 + 1f247ec: e2867006 add r7, r6, #6 + 1f247f0: e15e0007 cmp lr, r7 + 1f247f4: e2847006 add r7, r4, #6 + 1f247f8: e7d18008 ldrb r8, [r1, r8] + 1f247fc: e7c18005 strb r8, [r1, r5] + 1f24800: 9a000040 bls 1f24908 + 1f24804: e0638007 rsb r8, r3, r7 + 1f24808: e2865007 add r5, r6, #7 + 1f2480c: e15e0005 cmp lr, r5 + 1f24810: e2845007 add r5, r4, #7 + 1f24814: e7d18008 ldrb r8, [r1, r8] + 1f24818: e7c18007 strb r8, [r1, r7] + 1f2481c: 9a000039 bls 1f24908 + 1f24820: e0638005 rsb r8, r3, r5 + 1f24824: e2867008 add r7, r6, #8 + 1f24828: e15e0007 cmp lr, r7 + 1f2482c: e2847008 add r7, r4, #8 + 1f24830: e7d18008 ldrb r8, [r1, r8] + 1f24834: e7c18005 strb r8, [r1, r5] + 1f24838: 9a000032 bls 1f24908 + 1f2483c: e0638007 rsb r8, r3, r7 + 1f24840: e2865009 add r5, r6, #9 + 1f24844: e15e0005 cmp lr, r5 + 1f24848: e2845009 add r5, r4, #9 + 1f2484c: e7d18008 ldrb r8, [r1, r8] + 1f24850: e7c18007 strb r8, [r1, r7] + 1f24854: 9a00002b bls 1f24908 + 1f24858: e0638005 rsb r8, r3, r5 + 1f2485c: e286700a add r7, r6, #10 + 1f24860: e15e0007 cmp lr, r7 + 1f24864: e284700a add r7, r4, #10 + 1f24868: e7d18008 ldrb r8, [r1, r8] + 1f2486c: e7c18005 strb r8, [r1, r5] + 1f24870: 9a000024 bls 1f24908 + 1f24874: e0638007 rsb r8, r3, r7 + 1f24878: e286500b add r5, r6, #11 + 1f2487c: e15e0005 cmp lr, r5 + 1f24880: e284500b add r5, r4, #11 + 1f24884: e7d18008 ldrb r8, [r1, r8] + 1f24888: e7c18007 strb r8, [r1, r7] + 1f2488c: 9a00001d bls 1f24908 + 1f24890: e0638005 rsb r8, r3, r5 + 1f24894: e286700c add r7, r6, #12 + 1f24898: e15e0007 cmp lr, r7 + 1f2489c: e284700c add r7, r4, #12 + 1f248a0: e7d18008 ldrb r8, [r1, r8] + 1f248a4: e7c18005 strb r8, [r1, r5] + 1f248a8: 9a000016 bls 1f24908 + 1f248ac: e0638007 rsb r8, r3, r7 + 1f248b0: e286500d add r5, r6, #13 + 1f248b4: e15e0005 cmp lr, r5 + 1f248b8: e284500d add r5, r4, #13 + 1f248bc: e7d18008 ldrb r8, [r1, r8] + 1f248c0: e7c18007 strb r8, [r1, r7] + 1f248c4: 9a00000f bls 1f24908 + 1f248c8: e0637005 rsb r7, r3, r5 + 1f248cc: e286600e add r6, r6, #14 + 1f248d0: e15e0006 cmp lr, r6 + 1f248d4: e284400e add r4, r4, #14 + 1f248d8: e7d16007 ldrb r6, [r1, r7] + 1f248dc: e7c16005 strb r6, [r1, r5] + 1f248e0: 9a000008 bls 1f24908 + 1f248e4: e0633004 rsb r3, r3, r4 + 1f248e8: e082e00e add lr, r2, lr + 1f248ec: e7d13003 ldrb r3, [r1, r3] + 1f248f0: e7c13004 strb r3, [r1, r4] + 1f248f4: e1a0200e mov r2, lr + 1f248f8: eafffee0 b 1f24480 + 1f248fc: e1a04002 mov r4, r2 + 1f24900: e1a06005 mov r6, r5 + 1f24904: eaffff73 b 1f246d8 + 1f24908: e082e00e add lr, r2, lr + 1f2490c: eafffff8 b 1f248f4 + 1f24910: e082e00e add lr, r2, lr + 1f24914: e0817007 add r7, r1, r7 + 1f24918: e0812002 add r2, r1, r2 + 1f2491c: e081400e add r4, r1, lr + 1f24920: e4d73001 ldrb r3, [r7], #1 + 1f24924: e4c23001 strb r3, [r2], #1 + 1f24928: e1520004 cmp r2, r4 + 1f2492c: 1afffffb bne 1f24920 + 1f24930: eaffffef b 1f248f4 + 1f24934: e3a06006 mov r6, #6 + 1f24938: eaffff66 b 1f246d8 + 1f2493c: e3a0600e mov r6, #14 + 1f24940: eaffff64 b 1f246d8 + +01f24944 : + 1f24944: f2c00010 vmov.i32 d16, #0 ; 0x00000000 + 1f24948: e3a02000 mov r2, #0 + 1f2494c: e5802008 str r2, [r0, #8] + 1f24950: edc00b00 vstr d16, [r0] + 1f24954: e12fff1e bx lr + +01f24958 : + 1f24958: e12fff1e bx lr + +01f2495c : + 1f2495c: e1c020f0 strd r2, [r0] + 1f24960: e1a01003 mov r1, r3 + 1f24964: e1a00002 mov r0, r2 + 1f24968: e12fff1e bx lr + +01f2496c : + 1f2496c: e92d4010 push {r4, lr} + 1f24970: ebff7bf2 bl 1f03940 + 1f24974: e3a02003 mov r2, #3 + 1f24978: e3a01000 mov r1, #0 + 1f2497c: e3080001 movw r0, #32769 ; 0x8001 + 1f24980: e3400002 movt r0, #2 + 1f24984: ebff7bf9 bl 1f03970 + 1f24988: ebff7d8e bl 1f03fc8 + 1f2498c: e3080001 movw r0, #32769 ; 0x8001 + 1f24990: e3400002 movt r0, #2 + 1f24994: ebff7da9 bl 1f04040 + 1f24998: e3500000 cmp r0, #0 + 1f2499c: 15900008 ldrne r0, [r0, #8] + 1f249a0: 12000003 andne r0, r0, #3 + 1f249a4: 12400001 subne r0, r0, #1 + 1f249a8: 116f0f10 clzne r0, r0 + 1f249ac: 11a002a0 lsrne r0, r0, #5 + 1f249b0: e8bd8010 pop {r4, pc} + +01f249b4 : + 1f249b4: e3a03000 mov r3, #0 + 1f249b8: e3433f30 movt r3, #16176 ; 0x3f30 + 1f249bc: e5932028 ldr r2, [r3, #40] ; 0x28 + 1f249c0: e3c22c01 bic r2, r2, #256 ; 0x100 + 1f249c4: e5832028 str r2, [r3, #40] ; 0x28 + 1f249c8: e12fff1e bx lr + +01f249cc : + 1f249cc: e1520001 cmp r2, r1 + 1f249d0: 83a0c001 movhi ip, #1 + 1f249d4: 8a000003 bhi 1f249e8 + 1f249d8: e73cf211 udiv ip, r1, r2 + 1f249dc: e0621c92 mls r2, r2, ip, r1 + 1f249e0: e3520000 cmp r2, #0 + 1f249e4: 124cc001 subne ip, ip, #1 + 1f249e8: e5903008 ldr r3, [r0, #8] + 1f249ec: e3530001 cmp r3, #1 + 1f249f0: 9a00000e bls 1f24a30 + 1f249f4: e3a0001f mov r0, #31 + 1f249f8: e3a02001 mov r2, #1 + 1f249fc: ea000001 b 1f24a08 + 1f24a00: e2500001 subs r0, r0, #1 + 1f24a04: 3a000007 bcc 1f24a28 + 1f24a08: e1a03012 lsl r3, r2, r0 + 1f24a0c: e11c0003 tst ip, r3 + 1f24a10: 0afffffa beq 1f24a00 + 1f24a14: e1dc3003 bics r3, ip, r3 + 1f24a18: 0a00000a beq 1f24a48 + 1f24a1c: e2800001 add r0, r0, #1 + 1f24a20: e3500020 cmp r0, #32 + 1f24a24: 1a00000a bne 1f24a54 + 1f24a28: e30f0fc0 movw r0, #65472 ; 0xffc0 + 1f24a2c: e12fff1e bx lr + 1f24a30: e92d4010 push {r4, lr} + 1f24a34: e30f0548 movw r0, #62792 ; 0xf548 + 1f24a38: e34001f5 movt r0, #501 ; 0x1f5 + 1f24a3c: eb0069c2 bl 1f3f14c + 1f24a40: e3e00000 mvn r0, #0 + 1f24a44: e8bd8010 pop {r4, pc} + 1f24a48: e3500000 cmp r0, #0 + 1f24a4c: 1a000000 bne 1f24a54 + 1f24a50: e12fff1e bx lr + 1f24a54: e2400001 sub r0, r0, #1 + 1f24a58: e3a03001 mov r3, #1 + 1f24a5c: e1a03013 lsl r3, r3, r0 + 1f24a60: e3530b01 cmp r3, #1024 ; 0x400 + 1f24a64: aaffffef bge 1f24a28 + 1f24a68: e1a00123 lsr r0, r3, #2 + 1f24a6c: e1a03403 lsl r3, r3, #8 + 1f24a70: e2033cff and r3, r3, #65280 ; 0xff00 + 1f24a74: e20000c0 and r0, r0, #192 ; 0xc0 + 1f24a78: e1800003 orr r0, r0, r3 + 1f24a7c: e12fff1e bx lr + +01f24a80 : + 1f24a80: e1510002 cmp r1, r2 + 1f24a84: e92d4070 push {r4, r5, r6, lr} + 1f24a88: 33a0c001 movcc ip, #1 + 1f24a8c: 3a000003 bcc 1f24aa0 + 1f24a90: e73cf211 udiv ip, r1, r2 + 1f24a94: e0611c92 mls r1, r2, ip, r1 + 1f24a98: e3510000 cmp r1, #0 + 1f24a9c: 124cc001 subne ip, ip, #1 + 1f24aa0: e5903008 ldr r3, [r0, #8] + 1f24aa4: e3530001 cmp r3, #1 + 1f24aa8: 9a000024 bls 1f24b40 + 1f24aac: e3a0301f mov r3, #31 + 1f24ab0: e3a01001 mov r1, #1 + 1f24ab4: ea000001 b 1f24ac0 + 1f24ab8: e2533001 subs r3, r3, #1 + 1f24abc: 3a00000c bcc 1f24af4 + 1f24ac0: e1a02311 lsl r2, r1, r3 + 1f24ac4: e112000c tst r2, ip + 1f24ac8: 0afffffa beq 1f24ab8 + 1f24acc: e1dc2002 bics r2, ip, r2 + 1f24ad0: 0a00004e beq 1f24c10 + 1f24ad4: e2833001 add r3, r3, #1 + 1f24ad8: e3530020 cmp r3, #32 + 1f24adc: 0a000004 beq 1f24af4 + 1f24ae0: e2433001 sub r3, r3, #1 + 1f24ae4: e3a02001 mov r2, #1 + 1f24ae8: e1a03312 lsl r3, r2, r3 + 1f24aec: e3530b01 cmp r3, #1024 ; 0x400 + 1f24af0: ba00004b blt 1f24c24 + 1f24af4: e3a0c0c0 mov ip, #192 ; 0xc0 + 1f24af8: e3a04cff mov r4, #65280 ; 0xff00 + 1f24afc: e3a0e000 mov lr, #0 + 1f24b00: e343ef30 movt lr, #16176 ; 0x3f30 + 1f24b04: e3a02a03 mov r2, #12288 ; 0x3000 + 1f24b08: e3432f00 movt r2, #16128 ; 0x3f00 + 1f24b0c: e59e1024 ldr r1, [lr, #36] ; 0x24 + 1f24b10: e3a03000 mov r3, #0 + 1f24b14: e3433f30 movt r3, #16176 ; 0x3f30 + 1f24b18: e3110003 tst r1, #3 + 1f24b1c: 0a000011 beq 1f24b68 + 1f24b20: e3a00ffa mov r0, #1000 ; 0x3e8 + 1f24b24: e5921004 ldr r1, [r2, #4] + 1f24b28: e5923004 ldr r3, [r2, #4] + 1f24b2c: e1510003 cmp r1, r3 + 1f24b30: 0afffffc beq 1f24b28 + 1f24b34: e2500001 subs r0, r0, #1 + 1f24b38: 1afffff9 bne 1f24b24 + 1f24b3c: eafffff2 b 1f24b0c + 1f24b40: e1a04002 mov r4, r2 + 1f24b44: e30f0548 movw r0, #62792 ; 0xf548 + 1f24b48: e34001f5 movt r0, #501 ; 0x1f5 + 1f24b4c: eb00697e bl 1f3f14c + 1f24b50: e1a01004 mov r1, r4 + 1f24b54: e30f0564 movw r0, #62820 ; 0xf564 + 1f24b58: e34001f5 movt r0, #501 ; 0x1f5 + 1f24b5c: eb00697a bl 1f3f14c + 1f24b60: e3e00000 mvn r0, #0 + 1f24b64: e8bd8070 pop {r4, r5, r6, pc} + 1f24b68: e593e02c ldr lr, [r3, #44] ; 0x2c + 1f24b6c: e3a02a03 mov r2, #12288 ; 0x3000 + 1f24b70: e3432f00 movt r2, #16128 ; 0x3f00 + 1f24b74: e3ce1004 bic r1, lr, #4 + 1f24b78: e3a00e7d mov r0, #2000 ; 0x7d0 + 1f24b7c: e583102c str r1, [r3, #44] ; 0x2c + 1f24b80: e5921004 ldr r1, [r2, #4] + 1f24b84: e5923004 ldr r3, [r2, #4] + 1f24b88: e1510003 cmp r1, r3 + 1f24b8c: 0afffffc beq 1f24b84 + 1f24b90: e2500001 subs r0, r0, #1 + 1f24b94: 1afffff9 bne 1f24b80 + 1f24b98: e3a05000 mov r5, #0 + 1f24b9c: e3435f30 movt r5, #16176 ; 0x3f30 + 1f24ba0: e3ce1cff bic r1, lr, #65280 ; 0xff00 + 1f24ba4: e184c00c orr ip, r4, ip + 1f24ba8: e3c110e4 bic r1, r1, #228 ; 0xe4 + 1f24bac: e3a02a03 mov r2, #12288 ; 0x3000 + 1f24bb0: e3432f00 movt r2, #16128 ; 0x3f00 + 1f24bb4: e18cc001 orr ip, ip, r1 + 1f24bb8: e3a00e7d mov r0, #2000 ; 0x7d0 + 1f24bbc: e585c02c str ip, [r5, #44] ; 0x2c + 1f24bc0: e5921004 ldr r1, [r2, #4] + 1f24bc4: e5923004 ldr r3, [r2, #4] + 1f24bc8: e1510003 cmp r1, r3 + 1f24bcc: 0afffffc beq 1f24bc4 + 1f24bd0: e2500001 subs r0, r0, #1 + 1f24bd4: 1afffff9 bne 1f24bc0 + 1f24bd8: e3a03000 mov r3, #0 + 1f24bdc: e3433f30 movt r3, #16176 ; 0x3f30 + 1f24be0: e38c1004 orr r1, ip, #4 + 1f24be4: e3a02a03 mov r2, #12288 ; 0x3000 + 1f24be8: e3432f00 movt r2, #16128 ; 0x3f00 + 1f24bec: e583102c str r1, [r3, #44] ; 0x2c + 1f24bf0: e3a00e7d mov r0, #2000 ; 0x7d0 + 1f24bf4: e5921004 ldr r1, [r2, #4] + 1f24bf8: e5923004 ldr r3, [r2, #4] + 1f24bfc: e1510003 cmp r1, r3 + 1f24c00: 0afffffc beq 1f24bf8 + 1f24c04: e2500001 subs r0, r0, #1 + 1f24c08: 1afffff9 bne 1f24bf4 + 1f24c0c: e8bd8070 pop {r4, r5, r6, pc} + 1f24c10: e3530000 cmp r3, #0 + 1f24c14: 1affffb1 bne 1f24ae0 + 1f24c18: e1a0c003 mov ip, r3 + 1f24c1c: e1a04003 mov r4, r3 + 1f24c20: eaffffb5 b 1f24afc + 1f24c24: e1a04403 lsl r4, r3, #8 + 1f24c28: e1a03123 lsr r3, r3, #2 + 1f24c2c: e2044cff and r4, r4, #65280 ; 0xff00 + 1f24c30: e203c0c0 and ip, r3, #192 ; 0xc0 + 1f24c34: eaffffb0 b 1f24afc + +01f24c38 : + 1f24c38: e3a03000 mov r3, #0 + 1f24c3c: e3433f30 movt r3, #16176 ; 0x3f30 + 1f24c40: e92d4010 push {r4, lr} + 1f24c44: e593102c ldr r1, [r3, #44] ; 0x2c + 1f24c48: e3a02a03 mov r2, #12288 ; 0x3000 + 1f24c4c: e3432f00 movt r2, #16128 ; 0x3f00 + 1f24c50: e3811402 orr r1, r1, #33554432 ; 0x2000000 + 1f24c54: e1a0e003 mov lr, r3 + 1f24c58: e300c3e9 movw ip, #1001 ; 0x3e9 + 1f24c5c: e583102c str r1, [r3, #44] ; 0x2c + 1f24c60: e5921004 ldr r1, [r2, #4] + 1f24c64: e5923004 ldr r3, [r2, #4] + 1f24c68: e1510003 cmp r1, r3 + 1f24c6c: 0afffffc beq 1f24c64 + 1f24c70: e59e302c ldr r3, [lr, #44] ; 0x2c + 1f24c74: e2133402 ands r3, r3, #33554432 ; 0x2000000 + 1f24c78: 0a00000d beq 1f24cb4 + 1f24c7c: e30003e7 movw r0, #999 ; 0x3e7 + 1f24c80: e5921004 ldr r1, [r2, #4] + 1f24c84: e5923004 ldr r3, [r2, #4] + 1f24c88: e1510003 cmp r1, r3 + 1f24c8c: 0afffffc beq 1f24c84 + 1f24c90: e2500001 subs r0, r0, #1 + 1f24c94: 1afffff9 bne 1f24c80 + 1f24c98: e25cc001 subs ip, ip, #1 + 1f24c9c: 1affffef bne 1f24c60 + 1f24ca0: e30f059c movw r0, #62876 ; 0xf59c + 1f24ca4: e34001f5 movt r0, #501 ; 0x1f5 + 1f24ca8: eb006927 bl 1f3f14c + 1f24cac: e3e00000 mvn r0, #0 + 1f24cb0: e8bd8010 pop {r4, pc} + 1f24cb4: e1a00003 mov r0, r3 + 1f24cb8: e8bd8010 pop {r4, pc} + +01f24cbc : + 1f24cbc: e3a03000 mov r3, #0 + 1f24cc0: e3433f30 movt r3, #16176 ; 0x3f30 + 1f24cc4: e92d4010 push {r4, lr} + 1f24cc8: e593102c ldr r1, [r3, #44] ; 0x2c + 1f24ccc: e3a02a03 mov r2, #12288 ; 0x3000 + 1f24cd0: e3432f00 movt r2, #16128 ; 0x3f00 + 1f24cd4: e3811301 orr r1, r1, #67108864 ; 0x4000000 + 1f24cd8: e1a0e003 mov lr, r3 + 1f24cdc: e300c3e9 movw ip, #1001 ; 0x3e9 + 1f24ce0: e583102c str r1, [r3, #44] ; 0x2c + 1f24ce4: e5921004 ldr r1, [r2, #4] + 1f24ce8: e5923004 ldr r3, [r2, #4] + 1f24cec: e1510003 cmp r1, r3 + 1f24cf0: 0afffffc beq 1f24ce8 + 1f24cf4: e59e302c ldr r3, [lr, #44] ; 0x2c + 1f24cf8: e2133301 ands r3, r3, #67108864 ; 0x4000000 + 1f24cfc: 0a00000d beq 1f24d38 + 1f24d00: e30003e7 movw r0, #999 ; 0x3e7 + 1f24d04: e5921004 ldr r1, [r2, #4] + 1f24d08: e5923004 ldr r3, [r2, #4] + 1f24d0c: e1510003 cmp r1, r3 + 1f24d10: 0afffffc beq 1f24d08 + 1f24d14: e2500001 subs r0, r0, #1 + 1f24d18: 1afffff9 bne 1f24d04 + 1f24d1c: e25cc001 subs ip, ip, #1 + 1f24d20: 1affffef bne 1f24ce4 + 1f24d24: e30f05bc movw r0, #62908 ; 0xf5bc + 1f24d28: e34001f5 movt r0, #501 ; 0x1f5 + 1f24d2c: eb006906 bl 1f3f14c + 1f24d30: e3e00000 mvn r0, #0 + 1f24d34: e8bd8010 pop {r4, pc} + 1f24d38: e1a00003 mov r0, r3 + 1f24d3c: e8bd8010 pop {r4, pc} + +01f24d40 : + 1f24d40: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f24d44: e590e068 ldr lr, [r0, #104] ; 0x68 + 1f24d48: e3a05000 mov r5, #0 + 1f24d4c: e5801048 str r1, [r0, #72] ; 0x48 + 1f24d50: e35e0801 cmp lr, #65536 ; 0x10000 + 1f24d54: e5805050 str r5, [r0, #80] ; 0x50 + 1f24d58: aa000030 bge 1f24e20 + 1f24d5c: e3044dd3 movw r4, #19923 ; 0x4dd3 + 1f24d60: e3414062 movt r4, #4194 ; 0x1062 + 1f24d64: e3a0c000 mov ip, #0 + 1f24d68: e343cf30 movt ip, #16176 ; 0x3f30 + 1f24d6c: e0854493 umull r4, r5, r3, r4 + 1f24d70: e590306c ldr r3, [r0, #108] ; 0x6c + 1f24d74: e1a0600c mov r6, ip + 1f24d78: e1a04325 lsr r4, r5, #6 + 1f24d7c: e183380e orr r3, r3, lr, lsl #16 + 1f24d80: e1a05004 mov r5, r4 + 1f24d84: e58c3004 str r3, [ip, #4] + 1f24d88: e58c2008 str r2, [ip, #8] + 1f24d8c: e3a02a03 mov r2, #12288 ; 0x3000 + 1f24d90: e3432f00 movt r2, #16128 ; 0x3f00 + 1f24d94: e58c100c str r1, [ip, #12] + 1f24d98: e592c004 ldr ip, [r2, #4] + 1f24d9c: e5923004 ldr r3, [r2, #4] + 1f24da0: e15c0003 cmp ip, r3 + 1f24da4: 0afffffc beq 1f24d9c + 1f24da8: e596c030 ldr ip, [r6, #48] ; 0x30 + 1f24dac: e3083001 movw r3, #32769 ; 0x8001 + 1f24db0: e003300c and r3, r3, ip + 1f24db4: e3530000 cmp r3, #0 + 1f24db8: 0a00000e beq 1f24df8 + 1f24dbc: e3a03000 mov r3, #0 + 1f24dc0: e3433f30 movt r3, #16176 ; 0x3f30 + 1f24dc4: e3a0c001 mov ip, #1 + 1f24dc8: e34fcfff movt ip, #65535 ; 0xffff + 1f24dcc: e5932030 ldr r2, [r3, #48] ; 0x30 + 1f24dd0: e583c030 str ip, [r3, #48] ; 0x30 + 1f24dd4: e3c2ccff bic ip, r2, #65280 ; 0xff00 + 1f24dd8: e3ccc0fe bic ip, ip, #254 ; 0xfe + 1f24ddc: e35c0001 cmp ip, #1 + 1f24de0: 0a000015 beq 1f24e3c + 1f24de4: e1a03822 lsr r3, r2, #16 + 1f24de8: e580202c str r2, [r0, #44] ; 0x2c + 1f24dec: e1a03803 lsl r3, r3, #16 + 1f24df0: e5803030 str r3, [r0, #48] ; 0x30 + 1f24df4: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f24df8: e300e3e7 movw lr, #999 ; 0x3e7 + 1f24dfc: e592c004 ldr ip, [r2, #4] + 1f24e00: e5923004 ldr r3, [r2, #4] + 1f24e04: e15c0003 cmp ip, r3 + 1f24e08: 0afffffc beq 1f24e00 + 1f24e0c: e25ee001 subs lr, lr, #1 + 1f24e10: 1afffff9 bne 1f24dfc + 1f24e14: e2555001 subs r5, r5, #1 + 1f24e18: 2affffde bcs 1f24d98 + 1f24e1c: eaffffe6 b 1f24dbc + 1f24e20: e1a04000 mov r4, r0 + 1f24e24: e1a0100e mov r1, lr + 1f24e28: e30f05dc movw r0, #62940 ; 0xf5dc + 1f24e2c: e34001f5 movt r0, #501 ; 0x1f5 + 1f24e30: eb0068c5 bl 1f3f14c + 1f24e34: e5845050 str r5, [r4, #80] ; 0x50 + 1f24e38: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f24e3c: e2012803 and r2, r1, #196608 ; 0x30000 + 1f24e40: e3520802 cmp r2, #131072 ; 0x20000 + 1f24e44: 0a00007e beq 1f25044 + 1f24e48: e3520803 cmp r2, #196608 ; 0x30000 + 1f24e4c: 0a00007c beq 1f25044 + 1f24e50: e3520801 cmp r2, #65536 ; 0x10000 + 1f24e54: 1a000007 bne 1f24e78 + 1f24e58: e593c010 ldr ip, [r3, #16] + 1f24e5c: e580c054 str ip, [r0, #84] ; 0x54 + 1f24e60: e593c014 ldr ip, [r3, #20] + 1f24e64: e580c058 str ip, [r0, #88] ; 0x58 + 1f24e68: e593c018 ldr ip, [r3, #24] + 1f24e6c: e580c05c str ip, [r0, #92] ; 0x5c + 1f24e70: e593301c ldr r3, [r3, #28] + 1f24e74: e5803060 str r3, [r0, #96] ; 0x60 + 1f24e78: e3110602 tst r1, #2097152 ; 0x200000 + 1f24e7c: 0a00003c beq 1f24f74 + 1f24e80: e2013010 and r3, r1, #16 + 1f24e84: e3082020 movw r2, #32800 ; 0x8020 + 1f24e88: e3530000 cmp r3, #0 + 1f24e8c: e3a03020 mov r3, #32 + 1f24e90: e34f3fff movt r3, #65535 ; 0xffff + 1f24e94: e3a0e010 mov lr, #16 + 1f24e98: e34fefff movt lr, #65535 ; 0xffff + 1f24e9c: e3086010 movw r6, #32784 ; 0x8010 + 1f24ea0: e3a09000 mov r9, #0 + 1f24ea4: e3439f30 movt r9, #16176 ; 0x3f30 + 1f24ea8: 11a06002 movne r6, r2 + 1f24eac: 11a0e003 movne lr, r3 + 1f24eb0: e3a02a03 mov r2, #12288 ; 0x3000 + 1f24eb4: e3432f00 movt r2, #16128 ; 0x3f00 + 1f24eb8: 03a07001 moveq r7, #1 + 1f24ebc: 13a07000 movne r7, #0 + 1f24ec0: 03a08010 moveq r8, #16 + 1f24ec4: 13a08020 movne r8, #32 + 1f24ec8: e1a05004 mov r5, r4 + 1f24ecc: e5921004 ldr r1, [r2, #4] + 1f24ed0: e5923004 ldr r3, [r2, #4] + 1f24ed4: e1510003 cmp r1, r3 + 1f24ed8: 0afffffc beq 1f24ed0 + 1f24edc: e5993030 ldr r3, [r9, #48] ; 0x30 + 1f24ee0: e1160003 tst r6, r3 + 1f24ee4: 0a00000b beq 1f24f18 + 1f24ee8: e3a02000 mov r2, #0 + 1f24eec: e3432f30 movt r2, #16176 ; 0x3f30 + 1f24ef0: e5921030 ldr r1, [r2, #48] ; 0x30 + 1f24ef4: e582e030 str lr, [r2, #48] ; 0x30 + 1f24ef8: e00ee001 and lr, lr, r1 + 1f24efc: e158000e cmp r8, lr + 1f24f00: 0a00000e beq 1f24f40 + 1f24f04: e1a03821 lsr r3, r1, #16 + 1f24f08: e580102c str r1, [r0, #44] ; 0x2c + 1f24f0c: e1a03803 lsl r3, r3, #16 + 1f24f10: e5803030 str r3, [r0, #48] ; 0x30 + 1f24f14: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f24f18: e300c3e7 movw ip, #999 ; 0x3e7 + 1f24f1c: e5921004 ldr r1, [r2, #4] + 1f24f20: e5923004 ldr r3, [r2, #4] + 1f24f24: e1510003 cmp r1, r3 + 1f24f28: 0afffffc beq 1f24f20 + 1f24f2c: e25cc001 subs ip, ip, #1 + 1f24f30: 1afffff9 bne 1f24f1c + 1f24f34: e2555001 subs r5, r5, #1 + 1f24f38: 2affffe3 bcs 1f24ecc + 1f24f3c: eaffffe9 b 1f24ee8 + 1f24f40: e590c06c ldr ip, [r0, #108] ; 0x6c + 1f24f44: e3570000 cmp r7, #0 + 1f24f48: e5903068 ldr r3, [r0, #104] ; 0x68 + 1f24f4c: e5901064 ldr r1, [r0, #100] ; 0x64 + 1f24f50: e0030c93 mul r3, r3, ip + 1f24f54: 1a000033 bne 1f25028 + 1f24f58: e3530000 cmp r3, #0 + 1f24f5c: 0a000006 beq 1f24f7c + 1f24f60: e2533004 subs r3, r3, #4 + 1f24f64: e592c020 ldr ip, [r2, #32] + 1f24f68: e481c004 str ip, [r1], #4 + 1f24f6c: 1afffffb bne 1f24f60 + 1f24f70: ea000001 b 1f24f7c + 1f24f74: e3520803 cmp r2, #196608 ; 0x30000 + 1f24f78: 1a000018 bne 1f24fe0 + 1f24f7c: e3a02a03 mov r2, #12288 ; 0x3000 + 1f24f80: e3432f00 movt r2, #16128 ; 0x3f00 + 1f24f84: e3a0e000 mov lr, #0 + 1f24f88: e343ef30 movt lr, #16176 ; 0x3f30 + 1f24f8c: e5923004 ldr r3, [r2, #4] + 1f24f90: e5921004 ldr r1, [r2, #4] + 1f24f94: e1530001 cmp r3, r1 + 1f24f98: 0afffffc beq 1f24f90 + 1f24f9c: e59e1030 ldr r1, [lr, #48] ; 0x30 + 1f24fa0: e3083002 movw r3, #32770 ; 0x8002 + 1f24fa4: e0033001 and r3, r3, r1 + 1f24fa8: e3530000 cmp r3, #0 + 1f24fac: 0a00000e beq 1f24fec + 1f24fb0: e3a03000 mov r3, #0 + 1f24fb4: e3433f30 movt r3, #16176 ; 0x3f30 + 1f24fb8: e3a02002 mov r2, #2 + 1f24fbc: e34f2fef movt r2, #65519 ; 0xffef + 1f24fc0: e3a01002 mov r1, #2 + 1f24fc4: e34f1fff movt r1, #65535 ; 0xffff + 1f24fc8: e593c030 ldr ip, [r3, #48] ; 0x30 + 1f24fcc: e5831030 str r1, [r3, #48] ; 0x30 + 1f24fd0: e002200c and r2, r2, ip + 1f24fd4: e3520002 cmp r2, #2 + 1f24fd8: 05831030 streq r1, [r3, #48] ; 0x30 + 1f24fdc: 1a00000c bne 1f25014 + 1f24fe0: e3a03001 mov r3, #1 + 1f24fe4: e5803050 str r3, [r0, #80] ; 0x50 + 1f24fe8: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f24fec: e300c3e7 movw ip, #999 ; 0x3e7 + 1f24ff0: e5921004 ldr r1, [r2, #4] + 1f24ff4: e5923004 ldr r3, [r2, #4] + 1f24ff8: e1510003 cmp r1, r3 + 1f24ffc: 0afffffc beq 1f24ff4 + 1f25000: e25cc001 subs ip, ip, #1 + 1f25004: 1afffff9 bne 1f24ff0 + 1f25008: e2544001 subs r4, r4, #1 + 1f2500c: 2affffde bcs 1f24f8c + 1f25010: eaffffe6 b 1f24fb0 + 1f25014: e1a0382c lsr r3, ip, #16 + 1f25018: e580c02c str ip, [r0, #44] ; 0x2c + 1f2501c: e1a03803 lsl r3, r3, #16 + 1f25020: e5803030 str r3, [r0, #48] ; 0x30 + 1f25024: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f25028: e3530000 cmp r3, #0 + 1f2502c: 0affffd2 beq 1f24f7c + 1f25030: e2533004 subs r3, r3, #4 + 1f25034: e491c004 ldr ip, [r1], #4 + 1f25038: e582c020 str ip, [r2, #32] + 1f2503c: 1afffffb bne 1f25030 + 1f25040: eaffffcd b 1f24f7c + 1f25044: e3a03000 mov r3, #0 + 1f25048: e3433f30 movt r3, #16176 ; 0x3f30 + 1f2504c: e5933010 ldr r3, [r3, #16] + 1f25050: e5803054 str r3, [r0, #84] ; 0x54 + 1f25054: eaffff87 b 1f24e78 + +01f25058 : + 1f25058: e5902028 ldr r2, [r0, #40] ; 0x28 + 1f2505c: e3520000 cmp r2, #0 + 1f25060: 012fff1e bxeq lr + 1f25064: e30a3120 movw r3, #41248 ; 0xa120 + 1f25068: e3403007 movt r3, #7 + 1f2506c: e3a01000 mov r1, #0 + 1f25070: e3401d0a movt r1, #3338 ; 0xd0a + 1f25074: e1a02802 lsl r2, r2, #16 + 1f25078: eaffff30 b 1f24d40 + +01f2507c : + 1f2507c: e3a03000 mov r3, #0 + 1f25080: e3433f30 movt r3, #16176 ; 0x3f30 + 1f25084: e92d4070 push {r4, r5, r6, lr} + 1f25088: e5935030 ldr r5, [r3, #48] ; 0x30 + 1f2508c: e1a06000 mov r6, r0 + 1f25090: e2054001 and r4, r5, #1 + 1f25094: e3150002 tst r5, #2 + 1f25098: 13844002 orrne r4, r4, #2 + 1f2509c: e3150004 tst r5, #4 + 1f250a0: 13844004 orrne r4, r4, #4 + 1f250a4: e3150008 tst r5, #8 + 1f250a8: 13844008 orrne r4, r4, #8 + 1f250ac: e3150010 tst r5, #16 + 1f250b0: 1a000032 bne 1f25180 + 1f250b4: e3150020 tst r5, #32 + 1f250b8: 1a000012 bne 1f25108 + 1f250bc: e3150040 tst r5, #64 ; 0x40 + 1f250c0: 13844040 orrne r4, r4, #64 ; 0x40 + 1f250c4: e3150080 tst r5, #128 ; 0x80 + 1f250c8: 13a03001 movne r3, #1 + 1f250cc: 13844080 orrne r4, r4, #128 ; 0x80 + 1f250d0: 15863070 strne r3, [r6, #112] ; 0x70 + 1f250d4: e3150c01 tst r5, #256 ; 0x100 + 1f250d8: 0a000003 beq 1f250ec + 1f250dc: e5962028 ldr r2, [r6, #40] ; 0x28 + 1f250e0: e3520000 cmp r2, #0 + 1f250e4: 1a000043 bne 1f251f8 + 1f250e8: e3844c01 orr r4, r4, #256 ; 0x100 + 1f250ec: e3150902 tst r5, #32768 ; 0x8000 + 1f250f0: e3a03000 mov r3, #0 + 1f250f4: e3433f30 movt r3, #16176 ; 0x3f30 + 1f250f8: 11e04804 mvnne r4, r4, lsl #16 + 1f250fc: 11e04824 mvnne r4, r4, lsr #16 + 1f25100: e5834030 str r4, [r3, #48] ; 0x30 + 1f25104: e8bd8070 pop {r4, r5, r6, pc} + 1f25108: e3a03000 mov r3, #0 + 1f2510c: e3433f30 movt r3, #16176 ; 0x3f30 + 1f25110: e3a02a03 mov r2, #12288 ; 0x3000 + 1f25114: e3432f00 movt r2, #16128 ; 0x3f00 + 1f25118: e3844020 orr r4, r4, #32 + 1f2511c: e1a0e003 mov lr, r3 + 1f25120: e593102c ldr r1, [r3, #44] ; 0x2c + 1f25124: e300c3e9 movw ip, #1001 ; 0x3e9 + 1f25128: e3811301 orr r1, r1, #67108864 ; 0x4000000 + 1f2512c: e583102c str r1, [r3, #44] ; 0x2c + 1f25130: e5921004 ldr r1, [r2, #4] + 1f25134: e5923004 ldr r3, [r2, #4] + 1f25138: e1510003 cmp r1, r3 + 1f2513c: 0afffffc beq 1f25134 + 1f25140: e59e302c ldr r3, [lr, #44] ; 0x2c + 1f25144: e3130301 tst r3, #67108864 ; 0x4000000 + 1f25148: 0affffdb beq 1f250bc + 1f2514c: e30003e7 movw r0, #999 ; 0x3e7 + 1f25150: e5921004 ldr r1, [r2, #4] + 1f25154: e5923004 ldr r3, [r2, #4] + 1f25158: e1510003 cmp r1, r3 + 1f2515c: 0afffffc beq 1f25154 + 1f25160: e2500001 subs r0, r0, #1 + 1f25164: 1afffff9 bne 1f25150 + 1f25168: e25cc001 subs ip, ip, #1 + 1f2516c: 1affffef bne 1f25130 + 1f25170: e30f05bc movw r0, #62908 ; 0xf5bc + 1f25174: e34001f5 movt r0, #501 ; 0x1f5 + 1f25178: eb0067f3 bl 1f3f14c + 1f2517c: eaffffce b 1f250bc + 1f25180: e3a03000 mov r3, #0 + 1f25184: e3433f30 movt r3, #16176 ; 0x3f30 + 1f25188: e3a02a03 mov r2, #12288 ; 0x3000 + 1f2518c: e3432f00 movt r2, #16128 ; 0x3f00 + 1f25190: e3844010 orr r4, r4, #16 + 1f25194: e1a0e003 mov lr, r3 + 1f25198: e593102c ldr r1, [r3, #44] ; 0x2c + 1f2519c: e300c3e9 movw ip, #1001 ; 0x3e9 + 1f251a0: e3811301 orr r1, r1, #67108864 ; 0x4000000 + 1f251a4: e583102c str r1, [r3, #44] ; 0x2c + 1f251a8: e5921004 ldr r1, [r2, #4] + 1f251ac: e5923004 ldr r3, [r2, #4] + 1f251b0: e1510003 cmp r1, r3 + 1f251b4: 0afffffc beq 1f251ac + 1f251b8: e59e302c ldr r3, [lr, #44] ; 0x2c + 1f251bc: e3130301 tst r3, #67108864 ; 0x4000000 + 1f251c0: 0affffbb beq 1f250b4 + 1f251c4: e30003e7 movw r0, #999 ; 0x3e7 + 1f251c8: e5921004 ldr r1, [r2, #4] + 1f251cc: e5923004 ldr r3, [r2, #4] + 1f251d0: e1510003 cmp r1, r3 + 1f251d4: 0afffffc beq 1f251cc + 1f251d8: e2500001 subs r0, r0, #1 + 1f251dc: 1afffff9 bne 1f251c8 + 1f251e0: e25cc001 subs ip, ip, #1 + 1f251e4: 1affffef bne 1f251a8 + 1f251e8: e30f05bc movw r0, #62908 ; 0xf5bc + 1f251ec: e34001f5 movt r0, #501 ; 0x1f5 + 1f251f0: eb0067d5 bl 1f3f14c + 1f251f4: eaffffae b 1f250b4 + 1f251f8: e1a02802 lsl r2, r2, #16 + 1f251fc: e1a00006 mov r0, r6 + 1f25200: e30a3120 movw r3, #41248 ; 0xa120 + 1f25204: e3403007 movt r3, #7 + 1f25208: e3a01000 mov r1, #0 + 1f2520c: e3401d0a movt r1, #3338 ; 0xd0a + 1f25210: ebfffeca bl 1f24d40 + 1f25214: eaffffb3 b 1f250e8 + +01f25218 : + 1f25218: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f2521c: e1a05000 mov r5, r0 + 1f25220: e1a06001 mov r6, r1 + 1f25224: e1a07002 mov r7, r2 + 1f25228: ebffff93 bl 1f2507c + 1f2522c: e5954070 ldr r4, [r5, #112] ; 0x70 + 1f25230: e3540000 cmp r4, #0 + 1f25234: 1a000010 bne 1f2527c + 1f25238: e3560000 cmp r6, #0 + 1f2523c: ba000012 blt 1f2528c + 1f25240: e30f3ad8 movw r3, #64216 ; 0xfad8 + 1f25244: e34031f5 movt r3, #501 ; 0x1f5 + 1f25248: e7931106 ldr r1, [r3, r6, lsl #2] + 1f2524c: e3710001 cmn r1, #1 + 1f25250: 1585604c strne r6, [r5, #76] ; 0x4c + 1f25254: 11a02007 movne r2, r7 + 1f25258: 0a000024 beq 1f252f0 + 1f2525c: e30a3120 movw r3, #41248 ; 0xa120 + 1f25260: e3403007 movt r3, #7 + 1f25264: e1a00005 mov r0, r5 + 1f25268: ebfffeb4 bl 1f24d40 + 1f2526c: e5954050 ldr r4, [r5, #80] ; 0x50 + 1f25270: e2940000 adds r0, r4, #0 + 1f25274: 13a00001 movne r0, #1 + 1f25278: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f2527c: e3a04000 mov r4, #0 + 1f25280: e5854050 str r4, [r5, #80] ; 0x50 + 1f25284: e1a00004 mov r0, r4 + 1f25288: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f2528c: e6ef6076 uxtb r6, r6 + 1f25290: e30f3bd8 movw r3, #64472 ; 0xfbd8 + 1f25294: e34031f5 movt r3, #501 ; 0x1f5 + 1f25298: e7938106 ldr r8, [r3, r6, lsl #2] + 1f2529c: e3780001 cmn r8, #1 + 1f252a0: 0a000019 beq 1f2530c + 1f252a4: e5952028 ldr r2, [r5, #40] ; 0x28 + 1f252a8: e3a03037 mov r3, #55 ; 0x37 + 1f252ac: e3a01000 mov r1, #0 + 1f252b0: e343170a movt r1, #14090 ; 0x370a + 1f252b4: e3520000 cmp r2, #0 + 1f252b8: e585304c str r3, [r5, #76] ; 0x4c + 1f252bc: 11a02802 lslne r2, r2, #16 + 1f252c0: e30a3120 movw r3, #41248 ; 0xa120 + 1f252c4: e3403007 movt r3, #7 + 1f252c8: e1a00005 mov r0, r5 + 1f252cc: ebfffe9b bl 1f24d40 + 1f252d0: e5954050 ldr r4, [r5, #80] ; 0x50 + 1f252d4: e3540000 cmp r4, #0 + 1f252d8: 0affffe4 beq 1f25270 + 1f252dc: e3866102 orr r6, r6, #-2147483648 ; 0x80000000 + 1f252e0: e1a02007 mov r2, r7 + 1f252e4: e585604c str r6, [r5, #76] ; 0x4c + 1f252e8: e1a01008 mov r1, r8 + 1f252ec: eaffffda b 1f2525c + 1f252f0: e1a01006 mov r1, r6 + 1f252f4: e30f061c movw r0, #63004 ; 0xf61c + 1f252f8: e34001f5 movt r0, #501 ; 0x1f5 + 1f252fc: eb006792 bl 1f3f14c + 1f25300: e5854050 str r4, [r5, #80] ; 0x50 + 1f25304: e1a00004 mov r0, r4 + 1f25308: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f2530c: e1a01006 mov r1, r6 + 1f25310: e30f0600 movw r0, #62976 ; 0xf600 + 1f25314: e34001f5 movt r0, #501 ; 0x1f5 + 1f25318: eb00678b bl 1f3f14c + 1f2531c: e5854050 str r4, [r5, #80] ; 0x50 + 1f25320: e1a00004 mov r0, r4 + 1f25324: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f25328 : + 1f25328: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f2532c: e1a05000 mov r5, r0 + 1f25330: e1a06001 mov r6, r1 + 1f25334: e1a08002 mov r8, r2 + 1f25338: e1a07003 mov r7, r3 + 1f2533c: ebffff4e bl 1f2507c + 1f25340: e5954070 ldr r4, [r5, #112] ; 0x70 + 1f25344: e3540000 cmp r4, #0 + 1f25348: 1a00000f bne 1f2538c + 1f2534c: e3560000 cmp r6, #0 + 1f25350: ba000011 blt 1f2539c + 1f25354: e30f3ad8 movw r3, #64216 ; 0xfad8 + 1f25358: e34031f5 movt r3, #501 ; 0x1f5 + 1f2535c: e7931106 ldr r1, [r3, r6, lsl #2] + 1f25360: e3710001 cmn r1, #1 + 1f25364: 0a000028 beq 1f2540c + 1f25368: e585604c str r6, [r5, #76] ; 0x4c + 1f2536c: e1a03007 mov r3, r7 + 1f25370: e1a02008 mov r2, r8 + 1f25374: e1a00005 mov r0, r5 + 1f25378: ebfffe70 bl 1f24d40 + 1f2537c: e5954050 ldr r4, [r5, #80] ; 0x50 + 1f25380: e2940000 adds r0, r4, #0 + 1f25384: 13a00001 movne r0, #1 + 1f25388: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f2538c: e3a04000 mov r4, #0 + 1f25390: e5854050 str r4, [r5, #80] ; 0x50 + 1f25394: e1a00004 mov r0, r4 + 1f25398: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f2539c: e6ef6076 uxtb r6, r6 + 1f253a0: e30f3bd8 movw r3, #64472 ; 0xfbd8 + 1f253a4: e34031f5 movt r3, #501 ; 0x1f5 + 1f253a8: e7939106 ldr r9, [r3, r6, lsl #2] + 1f253ac: e3790001 cmn r9, #1 + 1f253b0: 0a00001c beq 1f25428 + 1f253b4: e5952028 ldr r2, [r5, #40] ; 0x28 + 1f253b8: e3a03037 mov r3, #55 ; 0x37 + 1f253bc: e3a01000 mov r1, #0 + 1f253c0: e343170a movt r1, #14090 ; 0x370a + 1f253c4: e3520000 cmp r2, #0 + 1f253c8: e585304c str r3, [r5, #76] ; 0x4c + 1f253cc: 11a02802 lslne r2, r2, #16 + 1f253d0: e1a03007 mov r3, r7 + 1f253d4: e1a00005 mov r0, r5 + 1f253d8: ebfffe58 bl 1f24d40 + 1f253dc: e5954050 ldr r4, [r5, #80] ; 0x50 + 1f253e0: e3540000 cmp r4, #0 + 1f253e4: 0affffe5 beq 1f25380 + 1f253e8: e3866102 orr r6, r6, #-2147483648 ; 0x80000000 + 1f253ec: e1a03007 mov r3, r7 + 1f253f0: e585604c str r6, [r5, #76] ; 0x4c + 1f253f4: e1a02008 mov r2, r8 + 1f253f8: e1a01009 mov r1, r9 + 1f253fc: e1a00005 mov r0, r5 + 1f25400: ebfffe4e bl 1f24d40 + 1f25404: e5954050 ldr r4, [r5, #80] ; 0x50 + 1f25408: eaffffdc b 1f25380 + 1f2540c: e1a01006 mov r1, r6 + 1f25410: e30f061c movw r0, #63004 ; 0xf61c + 1f25414: e34001f5 movt r0, #501 ; 0x1f5 + 1f25418: eb00674b bl 1f3f14c + 1f2541c: e5854050 str r4, [r5, #80] ; 0x50 + 1f25420: e1a00004 mov r0, r4 + 1f25424: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f25428: e1a01006 mov r1, r6 + 1f2542c: e30f0600 movw r0, #62976 ; 0xf600 + 1f25430: e34001f5 movt r0, #501 ; 0x1f5 + 1f25434: eb006744 bl 1f3f14c + 1f25438: e5854050 str r4, [r5, #80] ; 0x50 + 1f2543c: e1a00004 mov r0, r4 + 1f25440: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + +01f25444 : + 1f25444: e92d4ff8 push {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f25448: e3a06000 mov r6, #0 + 1f2544c: e3436f30 movt r6, #16176 ; 0x3f30 + 1f25450: e3a04a03 mov r4, #12288 ; 0x3000 + 1f25454: e3434f00 movt r4, #16128 ; 0x3f00 + 1f25458: e308bb59 movw fp, #35673 ; 0x8b59 + 1f2545c: e340b14f movt fp, #335 ; 0x14f + 1f25460: e1a05000 mov r5, r0 + 1f25464: e596302c ldr r3, [r6, #44] ; 0x2c + 1f25468: e30003e9 movw r0, #1001 ; 0x3e9 + 1f2546c: e3c33005 bic r3, r3, #5 + 1f25470: e3833401 orr r3, r3, #16777216 ; 0x1000000 + 1f25474: e586302c str r3, [r6, #44] ; 0x2c + 1f25478: e5942004 ldr r2, [r4, #4] + 1f2547c: e5943004 ldr r3, [r4, #4] + 1f25480: e1520003 cmp r2, r3 + 1f25484: 0afffffc beq 1f2547c + 1f25488: e596702c ldr r7, [r6, #44] ; 0x2c + 1f2548c: e2177407 ands r7, r7, #117440512 ; 0x7000000 + 1f25490: 0a00000d beq 1f254cc + 1f25494: e30013e7 movw r1, #999 ; 0x3e7 + 1f25498: e5942004 ldr r2, [r4, #4] + 1f2549c: e5943004 ldr r3, [r4, #4] + 1f254a0: e1520003 cmp r2, r3 + 1f254a4: 0afffffc beq 1f2549c + 1f254a8: e2511001 subs r1, r1, #1 + 1f254ac: 1afffff9 bne 1f25498 + 1f254b0: e2500001 subs r0, r0, #1 + 1f254b4: 1affffef bne 1f25478 + 1f254b8: e30f0634 movw r0, #63028 ; 0xf634 + 1f254bc: e34001f5 movt r0, #501 ; 0x1f5 + 1f254c0: eb006721 bl 1f3f14c + 1f254c4: e3e07000 mvn r7, #0 + 1f254c8: ea00006b b 1f2567c + 1f254cc: e30001f5 movw r0, #501 ; 0x1f5 + 1f254d0: e5942004 ldr r2, [r4, #4] + 1f254d4: e5943004 ldr r3, [r4, #4] + 1f254d8: e1520003 cmp r2, r3 + 1f254dc: 0afffffc beq 1f254d4 + 1f254e0: e5963024 ldr r3, [r6, #36] ; 0x24 + 1f254e4: e3130801 tst r3, #65536 ; 0x10000 + 1f254e8: 0a000053 beq 1f2563c + 1f254ec: e5963024 ldr r3, [r6, #36] ; 0x24 + 1f254f0: e3130801 tst r3, #65536 ; 0x10000 + 1f254f4: 0a00005c beq 1f2566c + 1f254f8: e3a03000 mov r3, #0 + 1f254fc: e586303c str r3, [r6, #60] ; 0x3c + 1f25500: ebff790e bl 1f03940 + 1f25504: e3a01001 mov r1, #1 + 1f25508: e3a00002 mov r0, #2 + 1f2550c: e3400003 movt r0, #3 + 1f25510: ebff7916 bl 1f03970 + 1f25514: ebff7aab bl 1f03fc8 + 1f25518: e3a00002 mov r0, #2 + 1f2551c: e3400003 movt r0, #3 + 1f25520: ebff7ac6 bl 1f04040 + 1f25524: e3500000 cmp r0, #0 + 1f25528: 0a000055 beq 1f25684 + 1f2552c: e590800c ldr r8, [r0, #12] + 1f25530: e3580000 cmp r8, #0 + 1f25534: 0a000052 beq 1f25684 + 1f25538: e3013a7f movw r3, #6783 ; 0x1a7f + 1f2553c: e3403006 movt r3, #6 + 1f25540: e1580003 cmp r8, r3 + 1f25544: e596302c ldr r3, [r6, #44] ; 0x2c + 1f25548: 93a02001 movls r2, #1 + 1f2554c: e3831001 orr r1, r3, #1 + 1f25550: 9a000007 bls 1f25574 + 1f25554: e1a023a8 lsr r2, r8, #7 + 1f25558: e3a00d6a mov r0, #6784 ; 0x1a80 + 1f2555c: e3400006 movt r0, #6 + 1f25560: e0832b92 umull r2, r3, r2, fp + 1f25564: e1a02223 lsr r2, r3, #4 + 1f25568: e0608290 mls r0, r0, r2, r8 + 1f2556c: e3500000 cmp r0, #0 + 1f25570: 12422001 subne r2, r2, #1 + 1f25574: e5953008 ldr r3, [r5, #8] + 1f25578: e3530001 cmp r3, #1 + 1f2557c: 9a00004b bls 1f256b0 + 1f25580: e3a0301f mov r3, #31 + 1f25584: e3a0c001 mov ip, #1 + 1f25588: ea000001 b 1f25594 + 1f2558c: e2533001 subs r3, r3, #1 + 1f25590: 3a00000c bcc 1f255c8 + 1f25594: e1a0031c lsl r0, ip, r3 + 1f25598: e1100002 tst r0, r2 + 1f2559c: 0afffffa beq 1f2558c + 1f255a0: e1d22000 bics r2, r2, r0 + 1f255a4: 0a000196 beq 1f25c04 + 1f255a8: e2833001 add r3, r3, #1 + 1f255ac: e3530020 cmp r3, #32 + 1f255b0: 0a000004 beq 1f255c8 + 1f255b4: e2433001 sub r3, r3, #1 + 1f255b8: e3a02001 mov r2, #1 + 1f255bc: e1a03312 lsl r3, r2, r3 + 1f255c0: e3530b01 cmp r3, #1024 ; 0x400 + 1f255c4: ba00021c blt 1f25e3c + 1f255c8: e3a030c0 mov r3, #192 ; 0xc0 + 1f255cc: e3a07cff mov r7, #65280 ; 0xff00 + 1f255d0: e1833007 orr r3, r3, r7 + 1f255d4: e30003e9 movw r0, #1001 ; 0x3e9 + 1f255d8: e1833001 orr r3, r3, r1 + 1f255dc: e3c3380f bic r3, r3, #983040 ; 0xf0000 + 1f255e0: e383380b orr r3, r3, #720896 ; 0xb0000 + 1f255e4: e586302c str r3, [r6, #44] ; 0x2c + 1f255e8: e5942004 ldr r2, [r4, #4] + 1f255ec: e5943004 ldr r3, [r4, #4] + 1f255f0: e1520003 cmp r2, r3 + 1f255f4: 0afffffc beq 1f255ec + 1f255f8: e596302c ldr r3, [r6, #44] ; 0x2c + 1f255fc: e3130002 tst r3, #2 + 1f25600: 1a000032 bne 1f256d0 + 1f25604: e30013e7 movw r1, #999 ; 0x3e7 + 1f25608: e5942004 ldr r2, [r4, #4] + 1f2560c: e5943004 ldr r3, [r4, #4] + 1f25610: e1520003 cmp r2, r3 + 1f25614: 0afffffc beq 1f2560c + 1f25618: e2511001 subs r1, r1, #1 + 1f2561c: 1afffff9 bne 1f25608 + 1f25620: e2500001 subs r0, r0, #1 + 1f25624: 1affffef bne 1f255e8 + 1f25628: e30f06c8 movw r0, #63176 ; 0xf6c8 + 1f2562c: e34001f5 movt r0, #501 ; 0x1f5 + 1f25630: eb0066c5 bl 1f3f14c + 1f25634: e3e07000 mvn r7, #0 + 1f25638: ea00000f b 1f2567c + 1f2563c: e30013e7 movw r1, #999 ; 0x3e7 + 1f25640: e5942004 ldr r2, [r4, #4] + 1f25644: e5943004 ldr r3, [r4, #4] + 1f25648: e1520003 cmp r2, r3 + 1f2564c: 0afffffc beq 1f25644 + 1f25650: e2511001 subs r1, r1, #1 + 1f25654: 1afffff9 bne 1f25640 + 1f25658: e2500001 subs r0, r0, #1 + 1f2565c: 1affff9b bne 1f254d0 + 1f25660: e5963024 ldr r3, [r6, #36] ; 0x24 + 1f25664: e3130801 tst r3, #65536 ; 0x10000 + 1f25668: 1affffa2 bne 1f254f8 + 1f2566c: e3e07000 mvn r7, #0 + 1f25670: e30f0658 movw r0, #63064 ; 0xf658 + 1f25674: e34001f5 movt r0, #501 ; 0x1f5 + 1f25678: eb0066b3 bl 1f3f14c + 1f2567c: e1a00007 mov r0, r7 + 1f25680: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f25684: e30f066c movw r0, #63084 ; 0xf66c + 1f25688: e34001f5 movt r0, #501 ; 0x1f5 + 1f2568c: eb0066ae bl 1f3f14c + 1f25690: e596302c ldr r3, [r6, #44] ; 0x2c + 1f25694: e3a08ce1 mov r8, #57600 ; 0xe100 + 1f25698: e34085f5 movt r8, #1525 ; 0x5f5 + 1f2569c: e3831001 orr r1, r3, #1 + 1f256a0: e5953008 ldr r3, [r5, #8] + 1f256a4: e3a020fa mov r2, #250 ; 0xfa + 1f256a8: e3530001 cmp r3, #1 + 1f256ac: 8affffb3 bhi 1f25580 + 1f256b0: e30f0548 movw r0, #62792 ; 0xf548 + 1f256b4: e34001f5 movt r0, #501 ; 0x1f5 + 1f256b8: eb0066a3 bl 1f3f14c + 1f256bc: e30f0690 movw r0, #63120 ; 0xf690 + 1f256c0: e34001f5 movt r0, #501 ; 0x1f5 + 1f256c4: eb0066a0 bl 1f3f14c + 1f256c8: e3e07000 mvn r7, #0 + 1f256cc: eaffffea b 1f2567c + 1f256d0: e3a01e7d mov r1, #2000 ; 0x7d0 + 1f256d4: e5942004 ldr r2, [r4, #4] + 1f256d8: e5943004 ldr r3, [r4, #4] + 1f256dc: e1520003 cmp r2, r3 + 1f256e0: 0afffffc beq 1f256d8 + 1f256e4: e2511001 subs r1, r1, #1 + 1f256e8: 1afffff9 bne 1f256d4 + 1f256ec: e596302c ldr r3, [r6, #44] ; 0x2c + 1f256f0: e3a01e7d mov r1, #2000 ; 0x7d0 + 1f256f4: e3833004 orr r3, r3, #4 + 1f256f8: e586302c str r3, [r6, #44] ; 0x2c + 1f256fc: e5942004 ldr r2, [r4, #4] + 1f25700: e5943004 ldr r3, [r4, #4] + 1f25704: e1520003 cmp r2, r3 + 1f25708: 0afffffc beq 1f25700 + 1f2570c: e2511001 subs r1, r1, #1 + 1f25710: 1afffff9 bne 1f256fc + 1f25714: e5861038 str r1, [r6, #56] ; 0x38 + 1f25718: e3e02000 mvn r2, #0 + 1f2571c: e3e03c01 mvn r3, #256 ; 0x100 + 1f25720: e5862030 str r2, [r6, #48] ; 0x30 + 1f25724: e3a07e7d mov r7, #2000 ; 0x7d0 + 1f25728: e5863034 str r3, [r6, #52] ; 0x34 + 1f2572c: e5942004 ldr r2, [r4, #4] + 1f25730: e5943004 ldr r3, [r4, #4] + 1f25734: e1520003 cmp r2, r3 + 1f25738: 0afffffc beq 1f25730 + 1f2573c: e2577001 subs r7, r7, #1 + 1f25740: 1afffff9 bne 1f2572c + 1f25744: f2c00010 vmov.i32 d16, #0 ; 0x00000000 + 1f25748: e285302c add r3, r5, #44 ; 0x2c + 1f2574c: e285c014 add ip, r5, #20 + 1f25750: e285101c add r1, r5, #28 + 1f25754: e2852024 add r2, r5, #36 ; 0x24 + 1f25758: e285a00c add sl, r5, #12 + 1f2575c: e1a00005 mov r0, r5 + 1f25760: f44a078f vst1.32 {d16}, [sl] + 1f25764: f44c078f vst1.32 {d16}, [ip] + 1f25768: f441078f vst1.32 {d16}, [r1] + 1f2576c: f442078f vst1.32 {d16}, [r2] + 1f25770: f443078f vst1.32 {d16}, [r3] + 1f25774: e5857044 str r7, [r5, #68] ; 0x44 + 1f25778: e5857048 str r7, [r5, #72] ; 0x48 + 1f2577c: e585704c str r7, [r5, #76] ; 0x4c + 1f25780: e5857050 str r7, [r5, #80] ; 0x50 + 1f25784: e5857054 str r7, [r5, #84] ; 0x54 + 1f25788: e5857058 str r7, [r5, #88] ; 0x58 + 1f2578c: e585705c str r7, [r5, #92] ; 0x5c + 1f25790: e5857060 str r7, [r5, #96] ; 0x60 + 1f25794: e5857064 str r7, [r5, #100] ; 0x64 + 1f25798: e5857068 str r7, [r5, #104] ; 0x68 + 1f2579c: e585706c str r7, [r5, #108] ; 0x6c + 1f257a0: e5857070 str r7, [r5, #112] ; 0x70 + 1f257a4: e5858074 str r8, [r5, #116] ; 0x74 + 1f257a8: ebfffe33 bl 1f2507c + 1f257ac: e5953070 ldr r3, [r5, #112] ; 0x70 + 1f257b0: e3530000 cmp r3, #0 + 1f257b4: 1a000115 bne 1f25c10 + 1f257b8: e585704c str r7, [r5, #76] ; 0x4c + 1f257bc: e30a3120 movw r3, #41248 ; 0xa120 + 1f257c0: e3403007 movt r3, #7 + 1f257c4: e1a02007 mov r2, r7 + 1f257c8: e1a01007 mov r1, r7 + 1f257cc: e1a00005 mov r0, r5 + 1f257d0: ebfffd5a bl 1f24d40 + 1f257d4: e5953050 ldr r3, [r5, #80] ; 0x50 + 1f257d8: e3530000 cmp r3, #0 + 1f257dc: 0a00010c beq 1f25c14 + 1f257e0: e1a00005 mov r0, r5 + 1f257e4: ebfffe24 bl 1f2507c + 1f257e8: e5953070 ldr r3, [r5, #112] ; 0x70 + 1f257ec: e3530000 cmp r3, #0 + 1f257f0: 15857050 strne r7, [r5, #80] ; 0x50 + 1f257f4: 1a00000b bne 1f25828 + 1f257f8: e3a02008 mov r2, #8 + 1f257fc: e30a3120 movw r3, #41248 ; 0xa120 + 1f25800: e3403007 movt r3, #7 + 1f25804: e585204c str r2, [r5, #76] ; 0x4c + 1f25808: e3a01000 mov r1, #0 + 1f2580c: e340180a movt r1, #2058 ; 0x80a + 1f25810: e30021aa movw r2, #426 ; 0x1aa + 1f25814: e1a00005 mov r0, r5 + 1f25818: ebfffd48 bl 1f24d40 + 1f2581c: e5953050 ldr r3, [r5, #80] ; 0x50 + 1f25820: e3530000 cmp r3, #0 + 1f25824: 1a00000a bne 1f25854 + 1f25828: e5957030 ldr r7, [r5, #48] ; 0x30 + 1f2582c: e3570000 cmp r7, #0 + 1f25830: 0a00000d beq 1f2586c + 1f25834: e3170801 tst r7, #65536 ; 0x10000 + 1f25838: 1a0000fa bne 1f25c28 + 1f2583c: e595102c ldr r1, [r5, #44] ; 0x2c + 1f25840: e30f0704 movw r0, #63236 ; 0xf704 + 1f25844: e34001f5 movt r0, #501 ; 0x1f5 + 1f25848: eb00663f bl 1f3f14c + 1f2584c: e3e07000 mvn r7, #0 + 1f25850: eaffff89 b 1f2567c + 1f25854: e5953054 ldr r3, [r5, #84] ; 0x54 + 1f25858: e30021aa movw r2, #426 ; 0x1aa + 1f2585c: e7eb3053 ubfx r3, r3, #0, #12 + 1f25860: e1530002 cmp r3, r2 + 1f25864: 1a000179 bne 1f25e50 + 1f25868: e3a07001 mov r7, #1 + 1f2586c: e1a00005 mov r0, r5 + 1f25870: ebfffe01 bl 1f2507c + 1f25874: e5952070 ldr r2, [r5, #112] ; 0x70 + 1f25878: e3520000 cmp r2, #0 + 1f2587c: 13a03000 movne r3, #0 + 1f25880: 15853050 strne r3, [r5, #80] ; 0x50 + 1f25884: 1a000009 bne 1f258b0 + 1f25888: e3a03005 mov r3, #5 + 1f2588c: e3a01000 mov r1, #0 + 1f25890: e3401501 movt r1, #1281 ; 0x501 + 1f25894: e585304c str r3, [r5, #76] ; 0x4c + 1f25898: e1a00005 mov r0, r5 + 1f2589c: e3023710 movw r3, #10000 ; 0x2710 + 1f258a0: ebfffd26 bl 1f24d40 + 1f258a4: e5953050 ldr r3, [r5, #80] ; 0x50 + 1f258a8: e3530000 cmp r3, #0 + 1f258ac: 1a0000cc bne 1f25be4 + 1f258b0: e5953030 ldr r3, [r5, #48] ; 0x30 + 1f258b4: e3530000 cmp r3, #0 + 1f258b8: 0a000010 beq 1f25900 + 1f258bc: e3130801 tst r3, #65536 ; 0x10000 + 1f258c0: 0a0000c7 beq 1f25be4 + 1f258c4: e596302c ldr r3, [r6, #44] ; 0x2c + 1f258c8: e30003e9 movw r0, #1001 ; 0x3e9 + 1f258cc: e3833402 orr r3, r3, #33554432 ; 0x2000000 + 1f258d0: e586302c str r3, [r6, #44] ; 0x2c + 1f258d4: e5942004 ldr r2, [r4, #4] + 1f258d8: e5943004 ldr r3, [r4, #4] + 1f258dc: e1520003 cmp r2, r3 + 1f258e0: 0afffffc beq 1f258d8 + 1f258e4: e596302c ldr r3, [r6, #44] ; 0x2c + 1f258e8: e3130402 tst r3, #33554432 ; 0x2000000 + 1f258ec: 1a00001c bne 1f25964 + 1f258f0: e3a02000 mov r2, #0 + 1f258f4: e3432f30 movt r2, #16176 ; 0x3f30 + 1f258f8: e3a03801 mov r3, #65536 ; 0x10000 + 1f258fc: e5823030 str r3, [r2, #48] ; 0x30 + 1f25900: e1a00005 mov r0, r5 + 1f25904: ebfffddc bl 1f2507c + 1f25908: e5953070 ldr r3, [r5, #112] ; 0x70 + 1f2590c: e3530000 cmp r3, #0 + 1f25910: 1a0000b8 bne 1f25bf8 + 1f25914: e5953028 ldr r3, [r5, #40] ; 0x28 + 1f25918: e3a02037 mov r2, #55 ; 0x37 + 1f2591c: e3a01000 mov r1, #0 + 1f25920: e343170a movt r1, #14090 ; 0x370a + 1f25924: e3530000 cmp r3, #0 + 1f25928: e585204c str r2, [r5, #76] ; 0x4c + 1f2592c: e1a00005 mov r0, r5 + 1f25930: 11a02803 lslne r2, r3, #16 + 1f25934: 01a02003 moveq r2, r3 + 1f25938: e30a3120 movw r3, #41248 ; 0xa120 + 1f2593c: e3403007 movt r3, #7 + 1f25940: ebfffcfe bl 1f24d40 + 1f25944: e5953050 ldr r3, [r5, #80] ; 0x50 + 1f25948: e3530000 cmp r3, #0 + 1f2594c: 1a000012 bne 1f2599c + 1f25950: e30f0764 movw r0, #63332 ; 0xf764 + 1f25954: e34001f5 movt r0, #501 ; 0x1f5 + 1f25958: eb0065fb bl 1f3f14c + 1f2595c: e3e07000 mvn r7, #0 + 1f25960: eaffff45 b 1f2567c + 1f25964: e30013e7 movw r1, #999 ; 0x3e7 + 1f25968: e5942004 ldr r2, [r4, #4] + 1f2596c: e5943004 ldr r3, [r4, #4] + 1f25970: e1520003 cmp r2, r3 + 1f25974: 0afffffc beq 1f2596c + 1f25978: e2511001 subs r1, r1, #1 + 1f2597c: 1afffff9 bne 1f25968 + 1f25980: e2500001 subs r0, r0, #1 + 1f25984: 1affffd2 bne 1f258d4 + 1f25988: e30f059c movw r0, #62876 ; 0xf59c + 1f2598c: e34001f5 movt r0, #501 ; 0x1f5 + 1f25990: eb0065ed bl 1f3f14c + 1f25994: e3e07000 mvn r7, #0 + 1f25998: eaffff37 b 1f2567c + 1f2599c: e3a021a6 mov r2, #-2147483607 ; 0x80000029 + 1f259a0: e30a3120 movw r3, #41248 ; 0xa120 + 1f259a4: e3403007 movt r3, #7 + 1f259a8: e585204c str r2, [r5, #76] ; 0x4c + 1f259ac: e3a01000 mov r1, #0 + 1f259b0: e3421902 movt r1, #10498 ; 0x2902 + 1f259b4: e3a02000 mov r2, #0 + 1f259b8: e1a00005 mov r0, r5 + 1f259bc: ebfffcdf bl 1f24d40 + 1f259c0: e5953050 ldr r3, [r5, #80] ; 0x50 + 1f259c4: e3530000 cmp r3, #0 + 1f259c8: 0affffe0 beq 1f25950 + 1f259cc: e3a03902 mov r3, #32768 ; 0x8000 + 1f259d0: e34030ff movt r3, #255 ; 0xff + 1f259d4: e3570000 cmp r7, #0 + 1f259d8: e3a09902 mov r9, #32768 ; 0x8000 + 1f259dc: e34590ff movt r9, #20735 ; 0x50ff + 1f259e0: 01a09003 moveq r9, r3 + 1f259e4: e1a00005 mov r0, r5 + 1f259e8: ebfffda3 bl 1f2507c + 1f259ec: e5957070 ldr r7, [r5, #112] ; 0x70 + 1f259f0: e3570000 cmp r7, #0 + 1f259f4: 1a00002b bne 1f25aa8 + 1f259f8: e5952028 ldr r2, [r5, #40] ; 0x28 + 1f259fc: e3a03037 mov r3, #55 ; 0x37 + 1f25a00: e3a01000 mov r1, #0 + 1f25a04: e343170a movt r1, #14090 ; 0x370a + 1f25a08: e3520000 cmp r2, #0 + 1f25a0c: e585304c str r3, [r5, #76] ; 0x4c + 1f25a10: 11a02802 lslne r2, r2, #16 + 1f25a14: 01a02007 moveq r2, r7 + 1f25a18: e30a3120 movw r3, #41248 ; 0xa120 + 1f25a1c: e3403007 movt r3, #7 + 1f25a20: e1a00005 mov r0, r5 + 1f25a24: ebfffcc5 bl 1f24d40 + 1f25a28: e5953050 ldr r3, [r5, #80] ; 0x50 + 1f25a2c: e3530000 cmp r3, #0 + 1f25a30: 1a000004 bne 1f25a48 + 1f25a34: e30f077c movw r0, #63356 ; 0xf77c + 1f25a38: e34001f5 movt r0, #501 ; 0x1f5 + 1f25a3c: eb0065c2 bl 1f3f14c + 1f25a40: e3e07000 mvn r7, #0 + 1f25a44: eaffff0c b 1f2567c + 1f25a48: e3a021a6 mov r2, #-2147483607 ; 0x80000029 + 1f25a4c: e30a3120 movw r3, #41248 ; 0xa120 + 1f25a50: e3403007 movt r3, #7 + 1f25a54: e585204c str r2, [r5, #76] ; 0x4c + 1f25a58: e3a01000 mov r1, #0 + 1f25a5c: e3421902 movt r1, #10498 ; 0x2902 + 1f25a60: e1a02009 mov r2, r9 + 1f25a64: e1a00005 mov r0, r5 + 1f25a68: ebfffcb4 bl 1f24d40 + 1f25a6c: e5953050 ldr r3, [r5, #80] ; 0x50 + 1f25a70: e3530000 cmp r3, #0 + 1f25a74: 0affffee beq 1f25a34 + 1f25a78: e5953054 ldr r3, [r5, #84] ; 0x54 + 1f25a7c: e3530000 cmp r3, #0 + 1f25a80: ba00000b blt 1f25ab4 + 1f25a84: e30a1120 movw r1, #41248 ; 0xa120 + 1f25a88: e3401007 movt r1, #7 + 1f25a8c: e5942004 ldr r2, [r4, #4] + 1f25a90: e5943004 ldr r3, [r4, #4] + 1f25a94: e1520003 cmp r2, r3 + 1f25a98: 0afffffc beq 1f25a90 + 1f25a9c: e2511001 subs r1, r1, #1 + 1f25aa0: 1afffff9 bne 1f25a8c + 1f25aa4: eaffffce b 1f259e4 + 1f25aa8: e3a03000 mov r3, #0 + 1f25aac: e5853050 str r3, [r5, #80] ; 0x50 + 1f25ab0: eaffffdf b 1f25a34 + 1f25ab4: e7ef2453 ubfx r2, r3, #8, #16 + 1f25ab8: e1a01008 mov r1, r8 + 1f25abc: e7e03f53 ubfx r3, r3, #30, #1 + 1f25ac0: e5852024 str r2, [r5, #36] ; 0x24 + 1f25ac4: e585301c str r3, [r5, #28] + 1f25ac8: e3072840 movw r2, #30784 ; 0x7840 + 1f25acc: e340217d movt r2, #381 ; 0x17d + 1f25ad0: e1a00005 mov r0, r5 + 1f25ad4: e3018388 movw r8, #5000 ; 0x1388 + 1f25ad8: ebfffbe8 bl 1f24a80 + 1f25adc: e5942004 ldr r2, [r4, #4] + 1f25ae0: e5943004 ldr r3, [r4, #4] + 1f25ae4: e1520003 cmp r2, r3 + 1f25ae8: 0afffffc beq 1f25ae0 + 1f25aec: e2588001 subs r8, r8, #1 + 1f25af0: 1afffff9 bne 1f25adc + 1f25af4: e5953020 ldr r3, [r5, #32] + 1f25af8: e3530000 cmp r3, #0 + 1f25afc: 0a000052 beq 1f25c4c + 1f25b00: e1a00005 mov r0, r5 + 1f25b04: ebfffd5c bl 1f2507c + 1f25b08: e5953070 ldr r3, [r5, #112] ; 0x70 + 1f25b0c: e3530000 cmp r3, #0 + 1f25b10: 15858050 strne r8, [r5, #80] ; 0x50 + 1f25b14: 1a00002c bne 1f25bcc + 1f25b18: e3a0100b mov r1, #11 + 1f25b1c: e1a02008 mov r2, r8 + 1f25b20: e585104c str r1, [r5, #76] ; 0x4c + 1f25b24: e30a3120 movw r3, #41248 ; 0xa120 + 1f25b28: e3403007 movt r3, #7 + 1f25b2c: e3a01000 mov r1, #0 + 1f25b30: e3401b0a movt r1, #2826 ; 0xb0a + 1f25b34: e1a00005 mov r0, r5 + 1f25b38: ebfffc80 bl 1f24d40 + 1f25b3c: e5953050 ldr r3, [r5, #80] ; 0x50 + 1f25b40: e3530000 cmp r3, #0 + 1f25b44: 0a000020 beq 1f25bcc + 1f25b48: e596302c ldr r3, [r6, #44] ; 0x2c + 1f25b4c: e3c33004 bic r3, r3, #4 + 1f25b50: e586302c str r3, [r6, #44] ; 0x2c + 1f25b54: e5963024 ldr r3, [r6, #36] ; 0x24 + 1f25b58: e313060f tst r3, #15728640 ; 0xf00000 + 1f25b5c: 1a00001a bne 1f25bcc + 1f25b60: e5963028 ldr r3, [r6, #40] ; 0x28 + 1f25b64: e3011388 movw r1, #5000 ; 0x1388 + 1f25b68: e3833c01 orr r3, r3, #256 ; 0x100 + 1f25b6c: e5863028 str r3, [r6, #40] ; 0x28 + 1f25b70: e5942004 ldr r2, [r4, #4] + 1f25b74: e5943004 ldr r3, [r4, #4] + 1f25b78: e1520003 cmp r2, r3 + 1f25b7c: 0afffffc beq 1f25b74 + 1f25b80: e2511001 subs r1, r1, #1 + 1f25b84: 1afffff9 bne 1f25b70 + 1f25b88: e5963028 ldr r3, [r6, #40] ; 0x28 + 1f25b8c: e3130c01 tst r3, #256 ; 0x100 + 1f25b90: 0a00000d beq 1f25bcc + 1f25b94: e596302c ldr r3, [r6, #44] ; 0x2c + 1f25b98: e3021710 movw r1, #10000 ; 0x2710 + 1f25b9c: e3833004 orr r3, r3, #4 + 1f25ba0: e586302c str r3, [r6, #44] ; 0x2c + 1f25ba4: e5942004 ldr r2, [r4, #4] + 1f25ba8: e5943004 ldr r3, [r4, #4] + 1f25bac: e1520003 cmp r2, r3 + 1f25bb0: 0afffffc beq 1f25ba8 + 1f25bb4: e2511001 subs r1, r1, #1 + 1f25bb8: 1afffff9 bne 1f25ba4 + 1f25bbc: e5963024 ldr r3, [r6, #36] ; 0x24 + 1f25bc0: e7e33a53 ubfx r3, r3, #20, #4 + 1f25bc4: e353000f cmp r3, #15 + 1f25bc8: 0a00001f beq 1f25c4c + 1f25bcc: e3a03001 mov r3, #1 + 1f25bd0: e5853044 str r3, [r5, #68] ; 0x44 + 1f25bd4: e5963028 ldr r3, [r6, #40] ; 0x28 + 1f25bd8: e3c33c01 bic r3, r3, #256 ; 0x100 + 1f25bdc: e5863028 str r3, [r6, #40] ; 0x28 + 1f25be0: eafffe1f b 1f25464 + 1f25be4: e30f0734 movw r0, #63284 ; 0xf734 + 1f25be8: e34001f5 movt r0, #501 ; 0x1f5 + 1f25bec: eb006556 bl 1f3f14c + 1f25bf0: e3e07000 mvn r7, #0 + 1f25bf4: eafffea0 b 1f2567c + 1f25bf8: e3a03000 mov r3, #0 + 1f25bfc: e5853050 str r3, [r5, #80] ; 0x50 + 1f25c00: eaffff52 b 1f25950 + 1f25c04: e3530000 cmp r3, #0 + 1f25c08: 0afffe70 beq 1f255d0 + 1f25c0c: eafffe68 b 1f255b4 + 1f25c10: e5857050 str r7, [r5, #80] ; 0x50 + 1f25c14: e30f06f0 movw r0, #63216 ; 0xf6f0 + 1f25c18: e34001f5 movt r0, #501 ; 0x1f5 + 1f25c1c: eb00654a bl 1f3f14c + 1f25c20: e3e07000 mvn r7, #0 + 1f25c24: eafffe94 b 1f2567c + 1f25c28: e1a00005 mov r0, r5 + 1f25c2c: ebfffc01 bl 1f24c38 + 1f25c30: e3700001 cmn r0, #1 + 1f25c34: e1a07000 mov r7, r0 + 1f25c38: 0afffe8f beq 1f2567c + 1f25c3c: e3a03801 mov r3, #65536 ; 0x10000 + 1f25c40: e3a07000 mov r7, #0 + 1f25c44: e5863030 str r3, [r6, #48] ; 0x30 + 1f25c48: eaffff07 b 1f2586c + 1f25c4c: e3a02000 mov r2, #0 + 1f25c50: e3a01002 mov r1, #2 + 1f25c54: e1a00005 mov r0, r5 + 1f25c58: ebfffd6e bl 1f25218 + 1f25c5c: e3500000 cmp r0, #0 + 1f25c60: 0a00006b beq 1f25e14 + 1f25c64: e2853054 add r3, r5, #84 ; 0x54 + 1f25c68: e3a02000 mov r2, #0 + 1f25c6c: e3a01003 mov r1, #3 + 1f25c70: e1a00005 mov r0, r5 + 1f25c74: f4630a8f vld1.32 {d16-d17}, [r3] + 1f25c78: f44a0a8f vst1.32 {d16-d17}, [sl] + 1f25c7c: ebfffd65 bl 1f25218 + 1f25c80: e3500000 cmp r0, #0 + 1f25c84: 0a00005d beq 1f25e00 + 1f25c88: e5953054 ldr r3, [r5, #84] ; 0x54 + 1f25c8c: e3130902 tst r3, #32768 ; 0x8000 + 1f25c90: e7e00753 ubfx r0, r3, #14, #1 + 1f25c94: e1a02823 lsr r2, r3, #16 + 1f25c98: e7e016d3 ubfx r1, r3, #13, #1 + 1f25c9c: e5852028 str r2, [r5, #40] ; 0x28 + 1f25ca0: e7e03453 ubfx r3, r3, #8, #1 + 1f25ca4: 1a00007d bne 1f25ea0 + 1f25ca8: e3500000 cmp r0, #0 + 1f25cac: 1a000076 bne 1f25e8c + 1f25cb0: e3510000 cmp r1, #0 + 1f25cb4: 1a00006f bne 1f25e78 + 1f25cb8: e3530000 cmp r3, #0 + 1f25cbc: 0a000068 beq 1f25e64 + 1f25cc0: e1a02802 lsl r2, r2, #16 + 1f25cc4: e3a01007 mov r1, #7 + 1f25cc8: e1a00005 mov r0, r5 + 1f25ccc: ebfffd51 bl 1f25218 + 1f25cd0: e3500000 cmp r0, #0 + 1f25cd4: 0a00007b beq 1f25ec8 + 1f25cd8: e5951054 ldr r1, [r5, #84] ; 0x54 + 1f25cdc: e7e314d1 ubfx r1, r1, #9, #4 + 1f25ce0: e2413003 sub r3, r1, #3 + 1f25ce4: e3530001 cmp r3, #1 + 1f25ce8: 8a000071 bhi 1f25eb4 + 1f25cec: e595301c ldr r3, [r5, #28] + 1f25cf0: e3530000 cmp r3, #0 + 1f25cf4: 1a000005 bne 1f25d10 + 1f25cf8: e3a02c02 mov r2, #512 ; 0x200 + 1f25cfc: e3a01010 mov r1, #16 + 1f25d00: e1a00005 mov r0, r5 + 1f25d04: ebfffd43 bl 1f25218 + 1f25d08: e3500000 cmp r0, #0 + 1f25d0c: 0a000045 beq 1f25e28 + 1f25d10: e3a0c000 mov ip, #0 + 1f25d14: e343cf30 movt ip, #16176 ; 0x3f30 + 1f25d18: e2853034 add r3, r5, #52 ; 0x34 + 1f25d1c: e3a0e008 mov lr, #8 + 1f25d20: e3a02000 mov r2, #0 + 1f25d24: e3a04001 mov r4, #1 + 1f25d28: e59c0004 ldr r0, [ip, #4] + 1f25d2c: e3a011ce mov r1, #-2147483597 ; 0x80000033 + 1f25d30: e3c00eff bic r0, r0, #4080 ; 0xff0 + 1f25d34: e3c0000f bic r0, r0, #15 + 1f25d38: e3800c02 orr r0, r0, #512 ; 0x200 + 1f25d3c: e58c0004 str r0, [ip, #4] + 1f25d40: e5853064 str r3, [r5, #100] ; 0x64 + 1f25d44: e1a00005 mov r0, r5 + 1f25d48: e585e06c str lr, [r5, #108] ; 0x6c + 1f25d4c: e5854068 str r4, [r5, #104] ; 0x68 + 1f25d50: ebfffd30 bl 1f25218 + 1f25d54: e5953050 ldr r3, [r5, #80] ; 0x50 + 1f25d58: e3a02c02 mov r2, #512 ; 0x200 + 1f25d5c: e585206c str r2, [r5, #108] ; 0x6c + 1f25d60: e3530000 cmp r3, #0 + 1f25d64: 0a000020 beq 1f25dec + 1f25d68: e5952034 ldr r2, [r5, #52] ; 0x34 + 1f25d6c: e3a03000 mov r3, #0 + 1f25d70: e5853040 str r3, [r5, #64] ; 0x40 + 1f25d74: e6bf2f32 rev r2, r2 + 1f25d78: e7e31c52 ubfx r1, r2, #24, #4 + 1f25d7c: e7e0c7d2 ubfx ip, r2, #15, #1 + 1f25d80: e1510003 cmp r1, r3 + 1f25d84: e1a00822 lsr r0, r2, #16 + 1f25d88: e200e00f and lr, r0, #15 + 1f25d8c: e7e02552 ubfx r2, r2, #10, #1 + 1f25d90: e585e03c str lr, [r5, #60] ; 0x3c + 1f25d94: 01a03004 moveq r3, r4 + 1f25d98: 05854040 streq r4, [r5, #64] ; 0x40 + 1f25d9c: 0a000005 beq 1f25db8 + 1f25da0: e3510001 cmp r1, #1 + 1f25da4: 03a03002 moveq r3, #2 + 1f25da8: 05853040 streq r3, [r5, #64] ; 0x40 + 1f25dac: 0a000001 beq 1f25db8 + 1f25db0: e3510002 cmp r1, #2 + 1f25db4: 0a000048 beq 1f25edc + 1f25db8: e3100004 tst r0, #4 + 1f25dbc: 1a00004f bne 1f25f00 + 1f25dc0: e3052398 movw r2, #21400 ; 0x5398 + 1f25dc4: e34021f6 movt r2, #502 ; 0x1f6 + 1f25dc8: e30f0898 movw r0, #63640 ; 0xf898 + 1f25dcc: e34001f5 movt r0, #501 ; 0x1f5 + 1f25dd0: e7921103 ldr r1, [r2, r3, lsl #2] + 1f25dd4: eb0064dc bl 1f3f14c + 1f25dd8: e3a03000 mov r3, #0 + 1f25ddc: e3433f30 movt r3, #16176 ; 0x3f30 + 1f25de0: e3e02000 mvn r2, #0 + 1f25de4: e5832030 str r2, [r3, #48] ; 0x30 + 1f25de8: eafffe23 b 1f2567c + 1f25dec: e30f085c movw r0, #63580 ; 0xf85c + 1f25df0: e34001f5 movt r0, #501 ; 0x1f5 + 1f25df4: eb0064d4 bl 1f3f14c + 1f25df8: e3e07000 mvn r7, #0 + 1f25dfc: eafffe1e b 1f2567c + 1f25e00: e30f07b0 movw r0, #63408 ; 0xf7b0 + 1f25e04: e34001f5 movt r0, #501 ; 0x1f5 + 1f25e08: eb0064cf bl 1f3f14c + 1f25e0c: e3e07000 mvn r7, #0 + 1f25e10: eafffe19 b 1f2567c + 1f25e14: e30f0794 movw r0, #63380 ; 0xf794 + 1f25e18: e34001f5 movt r0, #501 ; 0x1f5 + 1f25e1c: eb0064ca bl 1f3f14c + 1f25e20: e3e07000 mvn r7, #0 + 1f25e24: eafffe14 b 1f2567c + 1f25e28: e30f0840 movw r0, #63552 ; 0xf840 + 1f25e2c: e34001f5 movt r0, #501 ; 0x1f5 + 1f25e30: eb0064c5 bl 1f3f14c + 1f25e34: e3e07000 mvn r7, #0 + 1f25e38: eafffe0f b 1f2567c + 1f25e3c: e1a07403 lsl r7, r3, #8 + 1f25e40: e1a03123 lsr r3, r3, #2 + 1f25e44: e2077cff and r7, r7, #65280 ; 0xff00 + 1f25e48: e20330c0 and r3, r3, #192 ; 0xc0 + 1f25e4c: eafffddf b 1f255d0 + 1f25e50: e30f0724 movw r0, #63268 ; 0xf724 + 1f25e54: e34001f5 movt r0, #501 ; 0x1f5 + 1f25e58: eb0064bb bl 1f3f14c + 1f25e5c: e3e07000 mvn r7, #0 + 1f25e60: eafffe05 b 1f2567c + 1f25e64: e30f0800 movw r0, #63488 ; 0xf800 + 1f25e68: e34001f5 movt r0, #501 ; 0x1f5 + 1f25e6c: eb0064b6 bl 1f3f14c + 1f25e70: e3e07000 mvn r7, #0 + 1f25e74: eafffe00 b 1f2567c + 1f25e78: e30f07f0 movw r0, #63472 ; 0xf7f0 + 1f25e7c: e34001f5 movt r0, #501 ; 0x1f5 + 1f25e80: eb0064b1 bl 1f3f14c + 1f25e84: e3e07000 mvn r7, #0 + 1f25e88: eafffdfb b 1f2567c + 1f25e8c: e30f07e0 movw r0, #63456 ; 0xf7e0 + 1f25e90: e34001f5 movt r0, #501 ; 0x1f5 + 1f25e94: eb0064ac bl 1f3f14c + 1f25e98: e3e07000 mvn r7, #0 + 1f25e9c: eafffdf6 b 1f2567c + 1f25ea0: e30f07d4 movw r0, #63444 ; 0xf7d4 + 1f25ea4: e34001f5 movt r0, #501 ; 0x1f5 + 1f25ea8: eb0064a7 bl 1f3f14c + 1f25eac: e3e07000 mvn r7, #0 + 1f25eb0: eafffdf1 b 1f2567c + 1f25eb4: e30f0828 movw r0, #63528 ; 0xf828 + 1f25eb8: e34001f5 movt r0, #501 ; 0x1f5 + 1f25ebc: eb0064a2 bl 1f3f14c + 1f25ec0: e3e07000 mvn r7, #0 + 1f25ec4: eafffdec b 1f2567c + 1f25ec8: e30f0814 movw r0, #63508 ; 0xf814 + 1f25ecc: e34001f5 movt r0, #501 ; 0x1f5 + 1f25ed0: eb00649d bl 1f3f14c + 1f25ed4: e3e07000 mvn r7, #0 + 1f25ed8: eafffde7 b 1f2567c + 1f25edc: e35c0000 cmp ip, #0 + 1f25ee0: 03a03003 moveq r3, #3 + 1f25ee4: 05853040 streq r3, [r5, #64] ; 0x40 + 1f25ee8: 0affffb2 beq 1f25db8 + 1f25eec: e3520000 cmp r2, #0 + 1f25ef0: 03a03004 moveq r3, #4 + 1f25ef4: 13a03005 movne r3, #5 + 1f25ef8: e5853040 str r3, [r5, #64] ; 0x40 + 1f25efc: eaffffad b 1f25db8 + 1f25f00: e3a04000 mov r4, #0 + 1f25f04: e3434f30 movt r4, #16176 ; 0x3f30 + 1f25f08: e3a02002 mov r2, #2 + 1f25f0c: e3a0111a mov r1, #-2147483642 ; 0x80000006 + 1f25f10: e1a00005 mov r0, r5 + 1f25f14: e5946034 ldr r6, [r4, #52] ; 0x34 + 1f25f18: e3c63c01 bic r3, r6, #256 ; 0x100 + 1f25f1c: e5843034 str r3, [r4, #52] ; 0x34 + 1f25f20: ebfffcbc bl 1f25218 + 1f25f24: e3500000 cmp r0, #0 + 1f25f28: 0a000005 beq 1f25f44 + 1f25f2c: e5943028 ldr r3, [r4, #40] ; 0x28 + 1f25f30: e3833002 orr r3, r3, #2 + 1f25f34: e5843028 str r3, [r4, #40] ; 0x28 + 1f25f38: e5846034 str r6, [r4, #52] ; 0x34 + 1f25f3c: e5953040 ldr r3, [r5, #64] ; 0x40 + 1f25f40: eaffff9e b 1f25dc0 + 1f25f44: e30f0874 movw r0, #63604 ; 0xf874 + 1f25f48: e34001f5 movt r0, #501 ; 0x1f5 + 1f25f4c: eb00647e bl 1f3f14c + 1f25f50: e5953040 ldr r3, [r5, #64] ; 0x40 + 1f25f54: eaffff99 b 1f25dc0 + +01f25f58 : + 1f25f58: e92d4010 push {r4, lr} + 1f25f5c: e1a04000 mov r4, r0 + 1f25f60: ebff7676 bl 1f03940 + 1f25f64: e3a02003 mov r2, #3 + 1f25f68: e3a01000 mov r1, #0 + 1f25f6c: e3080001 movw r0, #32769 ; 0x8001 + 1f25f70: e3400002 movt r0, #2 + 1f25f74: ebff767d bl 1f03970 + 1f25f78: ebff7812 bl 1f03fc8 + 1f25f7c: e3080001 movw r0, #32769 ; 0x8001 + 1f25f80: e3400002 movt r0, #2 + 1f25f84: ebff782d bl 1f04040 + 1f25f88: e3a03000 mov r3, #0 + 1f25f8c: e3433f30 movt r3, #16176 ; 0x3f30 + 1f25f90: e59330fc ldr r3, [r3, #252] ; 0xfc + 1f25f94: e7e73853 ubfx r3, r3, #16, #8 + 1f25f98: e5843008 str r3, [r4, #8] + 1f25f9c: e3530001 cmp r3, #1 + 1f25fa0: 9a000004 bls 1f25fb8 + 1f25fa4: e1a00004 mov r0, r4 + 1f25fa8: ebfffd25 bl 1f25444 + 1f25fac: e16f0f10 clz r0, r0 + 1f25fb0: e1a002a0 lsr r0, r0, #5 + 1f25fb4: e8bd8010 pop {r4, pc} + 1f25fb8: e30f08bc movw r0, #63676 ; 0xf8bc + 1f25fbc: e34001f5 movt r0, #501 ; 0x1f5 + 1f25fc0: eb006461 bl 1f3f14c + 1f25fc4: e3a00000 mov r0, #0 + 1f25fc8: e8bd8010 pop {r4, pc} + +01f25fcc : + 1f25fcc: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f25fd0: e5906028 ldr r6, [r0, #40] ; 0x28 + 1f25fd4: e1a04000 mov r4, r0 + 1f25fd8: e3560000 cmp r6, #0 + 1f25fdc: 1a000003 bne 1f25ff0 + 1f25fe0: ebfffd17 bl 1f25444 + 1f25fe4: e3500000 cmp r0, #0 + 1f25fe8: 1a000037 bne 1f260cc + 1f25fec: e5946028 ldr r6, [r4, #40] ; 0x28 + 1f25ff0: e1a00004 mov r0, r4 + 1f25ff4: ebfffc20 bl 1f2507c + 1f25ff8: e5945070 ldr r5, [r4, #112] ; 0x70 + 1f25ffc: e3550000 cmp r5, #0 + 1f26000: 13a03000 movne r3, #0 + 1f26004: 15843050 strne r3, [r4, #80] ; 0x50 + 1f26008: 1a00008f bne 1f2624c + 1f2600c: e3a0100d mov r1, #13 + 1f26010: e1a02806 lsl r2, r6, #16 + 1f26014: e584104c str r1, [r4, #76] ; 0x4c + 1f26018: e30a3120 movw r3, #41248 ; 0xa120 + 1f2601c: e3403007 movt r3, #7 + 1f26020: e3a01000 mov r1, #0 + 1f26024: e3401d0a movt r1, #3338 ; 0xd0a + 1f26028: e1a00004 mov r0, r4 + 1f2602c: ebfffb43 bl 1f24d40 + 1f26030: e5943050 ldr r3, [r4, #80] ; 0x50 + 1f26034: e3530000 cmp r3, #0 + 1f26038: 0a000083 beq 1f2624c + 1f2603c: e5943054 ldr r3, [r4, #84] ; 0x54 + 1f26040: e7e334d3 ubfx r3, r3, #9, #4 + 1f26044: e3530003 cmp r3, #3 + 1f26048: 0a00005b beq 1f261bc + 1f2604c: e3530005 cmp r3, #5 + 1f26050: 0a00002a beq 1f26100 + 1f26054: e3530004 cmp r3, #4 + 1f26058: 0a000019 beq 1f260c4 + 1f2605c: e1a00004 mov r0, r4 + 1f26060: ebfffcf7 bl 1f25444 + 1f26064: e3500000 cmp r0, #0 + 1f26068: 1a000017 bne 1f260cc + 1f2606c: e1a00004 mov r0, r4 + 1f26070: e5947028 ldr r7, [r4, #40] ; 0x28 + 1f26074: ebfffc00 bl 1f2507c + 1f26078: e5946070 ldr r6, [r4, #112] ; 0x70 + 1f2607c: e3560000 cmp r6, #0 + 1f26080: 1a000014 bne 1f260d8 + 1f26084: e3a0100d mov r1, #13 + 1f26088: e1a02807 lsl r2, r7, #16 + 1f2608c: e584104c str r1, [r4, #76] ; 0x4c + 1f26090: e30a3120 movw r3, #41248 ; 0xa120 + 1f26094: e3403007 movt r3, #7 + 1f26098: e3a01000 mov r1, #0 + 1f2609c: e3401d0a movt r1, #3338 ; 0xd0a + 1f260a0: e1a00004 mov r0, r4 + 1f260a4: ebfffb25 bl 1f24d40 + 1f260a8: e5943050 ldr r3, [r4, #80] ; 0x50 + 1f260ac: e3530000 cmp r3, #0 + 1f260b0: 0a00000a beq 1f260e0 + 1f260b4: e5941054 ldr r1, [r4, #84] ; 0x54 + 1f260b8: e7e314d1 ubfx r1, r1, #9, #4 + 1f260bc: e3510004 cmp r1, #4 + 1f260c0: 1a00005a bne 1f26230 + 1f260c4: e1a00005 mov r0, r5 + 1f260c8: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f260cc: e1a05000 mov r5, r0 + 1f260d0: e1a00005 mov r0, r5 + 1f260d4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f260d8: e3a03000 mov r3, #0 + 1f260dc: e5843050 str r3, [r4, #80] ; 0x50 + 1f260e0: e3e05000 mvn r5, #0 + 1f260e4: e30f0960 movw r0, #63840 ; 0xf960 + 1f260e8: e34001f5 movt r0, #501 ; 0x1f5 + 1f260ec: eb006416 bl 1f3f14c + 1f260f0: e3a03000 mov r3, #0 + 1f260f4: e1a00005 mov r0, r5 + 1f260f8: e5843028 str r3, [r4, #40] ; 0x28 + 1f260fc: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f26100: e1a00004 mov r0, r4 + 1f26104: ebfffbdc bl 1f2507c + 1f26108: e5943070 ldr r3, [r4, #112] ; 0x70 + 1f2610c: e3530000 cmp r3, #0 + 1f26110: 15845050 strne r5, [r4, #80] ; 0x50 + 1f26114: 1a000054 bne 1f2626c + 1f26118: e3a0200c mov r2, #12 + 1f2611c: e30a3120 movw r3, #41248 ; 0xa120 + 1f26120: e3403007 movt r3, #7 + 1f26124: e584204c str r2, [r4, #76] ; 0x4c + 1f26128: e3a01000 mov r1, #0 + 1f2612c: e3401ccb movt r1, #3275 ; 0xccb + 1f26130: e1a02005 mov r2, r5 + 1f26134: e1a00004 mov r0, r4 + 1f26138: ebfffb00 bl 1f24d40 + 1f2613c: e5943050 ldr r3, [r4, #80] ; 0x50 + 1f26140: e3530000 cmp r3, #0 + 1f26144: 0a000048 beq 1f2626c + 1f26148: e3a03000 mov r3, #0 + 1f2614c: e3433f30 movt r3, #16176 ; 0x3f30 + 1f26150: e3a02a03 mov r2, #12288 ; 0x3000 + 1f26154: e3432f00 movt r2, #16128 ; 0x3f00 + 1f26158: e1a0e003 mov lr, r3 + 1f2615c: e300c3e9 movw ip, #1001 ; 0x3e9 + 1f26160: e593102c ldr r1, [r3, #44] ; 0x2c + 1f26164: e3811301 orr r1, r1, #67108864 ; 0x4000000 + 1f26168: e583102c str r1, [r3, #44] ; 0x2c + 1f2616c: e5921004 ldr r1, [r2, #4] + 1f26170: e5923004 ldr r3, [r2, #4] + 1f26174: e1510003 cmp r1, r3 + 1f26178: 0afffffc beq 1f26170 + 1f2617c: e59e302c ldr r3, [lr, #44] ; 0x2c + 1f26180: e3130301 tst r3, #67108864 ; 0x4000000 + 1f26184: 0affffb8 beq 1f2606c + 1f26188: e30003e7 movw r0, #999 ; 0x3e7 + 1f2618c: e5921004 ldr r1, [r2, #4] + 1f26190: e5923004 ldr r3, [r2, #4] + 1f26194: e1510003 cmp r1, r3 + 1f26198: 0afffffc beq 1f26190 + 1f2619c: e2500001 subs r0, r0, #1 + 1f261a0: 1afffff9 bne 1f2618c + 1f261a4: e25cc001 subs ip, ip, #1 + 1f261a8: 1affffef bne 1f2616c + 1f261ac: e30f05bc movw r0, #62908 ; 0xf5bc + 1f261b0: e34001f5 movt r0, #501 ; 0x1f5 + 1f261b4: eb0063e4 bl 1f3f14c + 1f261b8: eaffffab b 1f2606c + 1f261bc: e1a00004 mov r0, r4 + 1f261c0: e5946028 ldr r6, [r4, #40] ; 0x28 + 1f261c4: ebfffbac bl 1f2507c + 1f261c8: e5943070 ldr r3, [r4, #112] ; 0x70 + 1f261cc: e3530000 cmp r3, #0 + 1f261d0: e1a06806 lsl r6, r6, #16 + 1f261d4: 15845050 strne r5, [r4, #80] ; 0x50 + 1f261d8: 1a00000c bne 1f26210 + 1f261dc: e3a03007 mov r3, #7 + 1f261e0: e584304c str r3, [r4, #76] ; 0x4c + 1f261e4: e1a02006 mov r2, r6 + 1f261e8: e3a01000 mov r1, #0 + 1f261ec: e340170b movt r1, #1803 ; 0x70b + 1f261f0: e1a03803 lsl r3, r3, #16 + 1f261f4: e1a00004 mov r0, r4 + 1f261f8: e3833ca1 orr r3, r3, #41216 ; 0xa100 + 1f261fc: e3833020 orr r3, r3, #32 + 1f26200: ebffface bl 1f24d40 + 1f26204: e5943050 ldr r3, [r4, #80] ; 0x50 + 1f26208: e3530000 cmp r3, #0 + 1f2620c: 1affff96 bne 1f2606c + 1f26210: e3e05000 mvn r5, #0 + 1f26214: e30f0910 movw r0, #63760 ; 0xf910 + 1f26218: e34001f5 movt r0, #501 ; 0x1f5 + 1f2621c: eb0063ca bl 1f3f14c + 1f26220: e3a03000 mov r3, #0 + 1f26224: e1a00005 mov r0, r5 + 1f26228: e5843028 str r3, [r4, #40] ; 0x28 + 1f2622c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f26230: e3e05000 mvn r5, #0 + 1f26234: e30f0988 movw r0, #63880 ; 0xf988 + 1f26238: e34001f5 movt r0, #501 ; 0x1f5 + 1f2623c: eb0063c2 bl 1f3f14c + 1f26240: e5846028 str r6, [r4, #40] ; 0x28 + 1f26244: e1a00005 mov r0, r5 + 1f26248: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f2624c: e3e05000 mvn r5, #0 + 1f26250: e30f08e8 movw r0, #63720 ; 0xf8e8 + 1f26254: e34001f5 movt r0, #501 ; 0x1f5 + 1f26258: eb0063bb bl 1f3f14c + 1f2625c: e3a03000 mov r3, #0 + 1f26260: e1a00005 mov r0, r5 + 1f26264: e5843028 str r3, [r4, #40] ; 0x28 + 1f26268: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f2626c: e3e05000 mvn r5, #0 + 1f26270: e30f0938 movw r0, #63800 ; 0xf938 + 1f26274: e34001f5 movt r0, #501 ; 0x1f5 + 1f26278: eb0063b3 bl 1f3f14c + 1f2627c: e3a03000 mov r3, #0 + 1f26280: e1a00005 mov r0, r5 + 1f26284: e5843028 str r3, [r4, #40] ; 0x28 + 1f26288: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f2628c : + 1f2628c: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f26290: e1a04000 mov r4, r0 + 1f26294: e590001c ldr r0, [r0, #28] + 1f26298: e59d8020 ldr r8, [sp, #32] + 1f2629c: e3500000 cmp r0, #0 + 1f262a0: e594006c ldr r0, [r4, #108] ; 0x6c + 1f262a4: 01a08488 lsleq r8, r8, #9 + 1f262a8: e1500003 cmp r0, r3 + 1f262ac: 8a000049 bhi 1f263d8 + 1f262b0: e73cf013 udiv ip, r3, r0 + 1f262b4: e584c068 str ip, [r4, #104] ; 0x68 + 1f262b8: e06e3c90 mls lr, r0, ip, r3 + 1f262bc: e35e0000 cmp lr, #0 + 1f262c0: 1a000036 bne 1f263a0 + 1f262c4: e3510000 cmp r1, #0 + 1f262c8: e5842064 str r2, [r4, #100] ; 0x64 + 1f262cc: 1a00002e bne 1f2638c + 1f262d0: e35c0001 cmp ip, #1 + 1f262d4: da000039 ble 1f263c0 + 1f262d8: e3a07012 mov r7, #18 + 1f262dc: e1a0a007 mov sl, r7 + 1f262e0: e30f9ad8 movw r9, #64216 ; 0xfad8 + 1f262e4: e34091f5 movt r9, #501 ; 0x1f5 + 1f262e8: e3a05003 mov r5, #3 + 1f262ec: ea000011 b 1f26338 + 1f262f0: e584704c str r7, [r4, #76] ; 0x4c + 1f262f4: ebfffa91 bl 1f24d40 + 1f262f8: e5943050 ldr r3, [r4, #80] ; 0x50 + 1f262fc: e3530000 cmp r3, #0 + 1f26300: 1a00002c bne 1f263b8 + 1f26304: e1a0100a mov r1, sl + 1f26308: e30f0a78 movw r0, #64120 ; 0xfa78 + 1f2630c: e34001f5 movt r0, #501 ; 0x1f5 + 1f26310: eb00638d bl 1f3f14c + 1f26314: e30f0a90 movw r0, #64144 ; 0xfa90 + 1f26318: e34001f5 movt r0, #501 ; 0x1f5 + 1f2631c: e5941030 ldr r1, [r4, #48] ; 0x30 + 1f26320: eb006389 bl 1f3f14c + 1f26324: e2555001 subs r5, r5, #1 + 1f26328: e30f0a60 movw r0, #64096 ; 0xfa60 + 1f2632c: e34001f5 movt r0, #501 ; 0x1f5 + 1f26330: 0a00002f beq 1f263f4 + 1f26334: eb006384 bl 1f3f14c + 1f26338: e1a00004 mov r0, r4 + 1f2633c: ebfffb4e bl 1f2507c + 1f26340: e5946070 ldr r6, [r4, #112] ; 0x70 + 1f26344: e3043b40 movw r3, #19264 ; 0x4b40 + 1f26348: e340304c movt r3, #76 ; 0x4c + 1f2634c: e3560000 cmp r6, #0 + 1f26350: e1a02008 mov r2, r8 + 1f26354: 13a03000 movne r3, #0 + 1f26358: e1a00004 mov r0, r4 + 1f2635c: 15843050 strne r3, [r4, #80] ; 0x50 + 1f26360: 1affffe7 bne 1f26304 + 1f26364: e799c107 ldr ip, [r9, r7, lsl #2] + 1f26368: e37c0001 cmn ip, #1 + 1f2636c: e1a0100c mov r1, ip + 1f26370: 1affffde bne 1f262f0 + 1f26374: e30f061c movw r0, #63004 ; 0xf61c + 1f26378: e34001f5 movt r0, #501 ; 0x1f5 + 1f2637c: e1a01007 mov r1, r7 + 1f26380: eb006371 bl 1f3f14c + 1f26384: e5846050 str r6, [r4, #80] ; 0x50 + 1f26388: eaffffdd b 1f26304 + 1f2638c: e35c0001 cmp ip, #1 + 1f26390: da00000d ble 1f263cc + 1f26394: e3a07019 mov r7, #25 + 1f26398: e1a0a007 mov sl, r7 + 1f2639c: eaffffcf b 1f262e0 + 1f263a0: e3e06000 mvn r6, #0 + 1f263a4: e1a02000 mov r2, r0 + 1f263a8: e1a01003 mov r1, r3 + 1f263ac: e30f0a08 movw r0, #64008 ; 0xfa08 + 1f263b0: e34001f5 movt r0, #501 ; 0x1f5 + 1f263b4: eb006364 bl 1f3f14c + 1f263b8: e1a00006 mov r0, r6 + 1f263bc: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f263c0: e3a07011 mov r7, #17 + 1f263c4: e1a0a007 mov sl, r7 + 1f263c8: eaffffc4 b 1f262e0 + 1f263cc: e3a07018 mov r7, #24 + 1f263d0: e1a0a007 mov sl, r7 + 1f263d4: eaffffc1 b 1f262e0 + 1f263d8: e1a02000 mov r2, r0 + 1f263dc: e1a01003 mov r1, r3 + 1f263e0: e30f09c0 movw r0, #63936 ; 0xf9c0 + 1f263e4: e34001f5 movt r0, #501 ; 0x1f5 + 1f263e8: eb006357 bl 1f3f14c + 1f263ec: e3e06000 mvn r6, #0 + 1f263f0: eafffff0 b 1f263b8 + 1f263f4: e30f0a6c movw r0, #64108 ; 0xfa6c + 1f263f8: e34001f5 movt r0, #501 ; 0x1f5 + 1f263fc: eb006352 bl 1f3f14c + 1f26400: e3e06000 mvn r6, #0 + 1f26404: e5845028 str r5, [r4, #40] ; 0x28 + 1f26408: eaffffea b 1f263b8 + +01f2640c : + 1f2640c: e92d43f0 push {r4, r5, r6, r7, r8, r9, lr} + 1f26410: e1c060d0 ldrd r6, [r0] + 1f26414: e30081ff movw r8, #511 ; 0x1ff + 1f26418: e3a09000 mov r9, #0 + 1f2641c: e0088006 and r8, r8, r6 + 1f26420: e0099007 and r9, r9, r7 + 1f26424: e198c009 orrs ip, r8, r9 + 1f26428: e24dd00c sub sp, sp, #12 + 1f2642c: 1a000018 bne 1f26494 + 1f26430: e1a064a6 lsr r6, r6, #9 + 1f26434: e1a04002 mov r4, r2 + 1f26438: e1a08001 mov r8, r1 + 1f2643c: e1a05000 mov r5, r0 + 1f26440: e1866b87 orr r6, r6, r7, lsl #23 + 1f26444: f57ff05f dmb sy + 1f26448: ebfffedf bl 1f25fcc + 1f2644c: e2501000 subs r1, r0, #0 + 1f26450: 1a00000a bne 1f26480 + 1f26454: e58d6000 str r6, [sp] + 1f26458: e1a02008 mov r2, r8 + 1f2645c: e1a00005 mov r0, r5 + 1f26460: e1a03004 mov r3, r4 + 1f26464: ebffff88 bl 1f2628c + 1f26468: e3500000 cmp r0, #0 + 1f2646c: ba000003 blt 1f26480 + 1f26470: e1a00004 mov r0, r4 + 1f26474: f57ff05f dmb sy + 1f26478: e28dd00c add sp, sp, #12 + 1f2647c: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f26480: e3740001 cmn r4, #1 + 1f26484: 0afffff9 beq 1f26470 + 1f26488: f57ff05f dmb sy + 1f2648c: e3e00000 mvn r0, #0 + 1f26490: eafffff8 b 1f26478 + 1f26494: e3e00000 mvn r0, #0 + 1f26498: eafffff6 b 1f26478 + +01f2649c : + 1f2649c: e92d43f0 push {r4, r5, r6, r7, r8, r9, lr} + 1f264a0: e1c060d0 ldrd r6, [r0] + 1f264a4: e30081ff movw r8, #511 ; 0x1ff + 1f264a8: e3a09000 mov r9, #0 + 1f264ac: e0088006 and r8, r8, r6 + 1f264b0: e0099007 and r9, r9, r7 + 1f264b4: e198c009 orrs ip, r8, r9 + 1f264b8: e24dd00c sub sp, sp, #12 + 1f264bc: 1a000019 bne 1f26528 + 1f264c0: e1a064a6 lsr r6, r6, #9 + 1f264c4: e1a04002 mov r4, r2 + 1f264c8: e1a08001 mov r8, r1 + 1f264cc: e1a05000 mov r5, r0 + 1f264d0: e1866b87 orr r6, r6, r7, lsl #23 + 1f264d4: f57ff05f dmb sy + 1f264d8: ebfffebb bl 1f25fcc + 1f264dc: e3500000 cmp r0, #0 + 1f264e0: 1a00000b bne 1f26514 + 1f264e4: e58d6000 str r6, [sp] + 1f264e8: e1a02008 mov r2, r8 + 1f264ec: e1a00005 mov r0, r5 + 1f264f0: e1a03004 mov r3, r4 + 1f264f4: e3a01001 mov r1, #1 + 1f264f8: ebffff63 bl 1f2628c + 1f264fc: e3500000 cmp r0, #0 + 1f26500: ba000003 blt 1f26514 + 1f26504: e1a00004 mov r0, r4 + 1f26508: f57ff05f dmb sy + 1f2650c: e28dd00c add sp, sp, #12 + 1f26510: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f26514: e3740001 cmn r4, #1 + 1f26518: 0afffff9 beq 1f26504 + 1f2651c: f57ff05f dmb sy + 1f26520: e3e00000 mvn r0, #0 + 1f26524: eafffff8 b 1f2650c + 1f26528: e3e00000 mvn r0, #0 + 1f2652c: eafffff6 b 1f2650c + +01f26530 : + 1f26530: e92d40f0 push {r4, r5, r6, r7, lr} + 1f26534: e1a06001 mov r6, r1 + 1f26538: e1a04002 mov r4, r2 + 1f2653c: e24dd00c sub sp, sp, #12 + 1f26540: e1a07003 mov r7, r3 + 1f26544: e1a05000 mov r5, r0 + 1f26548: ebfffe9f bl 1f25fcc + 1f2654c: e2501000 subs r1, r0, #0 + 1f26550: 1a000009 bne 1f2657c + 1f26554: e58d7000 str r7, [sp] + 1f26558: e1a02006 mov r2, r6 + 1f2655c: e1a00005 mov r0, r5 + 1f26560: e1a03004 mov r3, r4 + 1f26564: ebffff48 bl 1f2628c + 1f26568: e3500000 cmp r0, #0 + 1f2656c: ba000002 blt 1f2657c + 1f26570: e1a00004 mov r0, r4 + 1f26574: e28dd00c add sp, sp, #12 + 1f26578: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f2657c: e3e00000 mvn r0, #0 + 1f26580: e28dd00c add sp, sp, #12 + 1f26584: e8bd80f0 pop {r4, r5, r6, r7, pc} + +01f26588 : + 1f26588: e92d40f0 push {r4, r5, r6, r7, lr} + 1f2658c: e1a06001 mov r6, r1 + 1f26590: e1a04002 mov r4, r2 + 1f26594: e24dd00c sub sp, sp, #12 + 1f26598: e1a07003 mov r7, r3 + 1f2659c: e1a05000 mov r5, r0 + 1f265a0: ebfffe89 bl 1f25fcc + 1f265a4: e3500000 cmp r0, #0 + 1f265a8: 1a00000a bne 1f265d8 + 1f265ac: e58d7000 str r7, [sp] + 1f265b0: e1a02006 mov r2, r6 + 1f265b4: e1a00005 mov r0, r5 + 1f265b8: e1a03004 mov r3, r4 + 1f265bc: e3a01001 mov r1, #1 + 1f265c0: ebffff31 bl 1f2628c + 1f265c4: e3500000 cmp r0, #0 + 1f265c8: ba000002 blt 1f265d8 + 1f265cc: e1a00004 mov r0, r4 + 1f265d0: e28dd00c add sp, sp, #12 + 1f265d4: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f265d8: e3e00000 mvn r0, #0 + 1f265dc: e28dd00c add sp, sp, #12 + 1f265e0: e8bd80f0 pop {r4, r5, r6, r7, pc} + +01f265e4 : + 1f265e4: e92d4070 push {r4, r5, r6, lr} + 1f265e8: e59d0010 ldr r0, [sp, #16] + 1f265ec: e304cdd3 movw ip, #19923 ; 0x4dd3 + 1f265f0: e341c062 movt ip, #4194 ; 0x1062 + 1f265f4: e1a06001 mov r6, r1 + 1f265f8: e0810c90 umull r0, r1, r0, ip + 1f265fc: e3a0ca03 mov ip, #12288 ; 0x3000 + 1f26600: e343cf00 movt ip, #16128 ; 0x3f00 + 1f26604: e1a05321 lsr r5, r1, #6 + 1f26608: e59ce004 ldr lr, [ip, #4] + 1f2660c: e59c0004 ldr r0, [ip, #4] + 1f26610: e15e0000 cmp lr, r0 + 1f26614: 0afffffc beq 1f2660c + 1f26618: e5961000 ldr r1, [r6] + 1f2661c: e1120001 tst r2, r1 + 1f26620: 016f0f13 clzeq r0, r3 + 1f26624: 01a002a0 lsreq r0, r0, #5 + 1f26628: 0a000001 beq 1f26634 + 1f2662c: e2930000 adds r0, r3, #0 + 1f26630: 13a00001 movne r0, #1 + 1f26634: e3500000 cmp r0, #0 + 1f26638: 1a00000a bne 1f26668 + 1f2663c: e30043e7 movw r4, #999 ; 0x3e7 + 1f26640: e59ce004 ldr lr, [ip, #4] + 1f26644: e59c0004 ldr r0, [ip, #4] + 1f26648: e15e0000 cmp lr, r0 + 1f2664c: 0afffffc beq 1f26644 + 1f26650: e2544001 subs r4, r4, #1 + 1f26654: 1afffff9 bne 1f26640 + 1f26658: e2555001 subs r5, r5, #1 + 1f2665c: 2affffe9 bcs 1f26608 + 1f26660: e1a00005 mov r0, r5 + 1f26664: e8bd8070 pop {r4, r5, r6, pc} + 1f26668: e3a00000 mov r0, #0 + 1f2666c: e8bd8070 pop {r4, r5, r6, pc} + +01f26670 : + 1f26670: e30a3360 movw r3, #41824 ; 0xa360 + 1f26674: e340320d movt r3, #525 ; 0x20d + 1f26678: e5830000 str r0, [r3] + 1f2667c: e12fff1e bx lr + +01f26680 : + 1f26680: e3a00000 mov r0, #0 + 1f26684: e12fff1e bx lr + +01f26688 : + 1f26688: e30ac360 movw ip, #41824 ; 0xa360 + 1f2668c: e340c20d movt ip, #525 ; 0x20d + 1f26690: e1a03002 mov r3, r2 + 1f26694: e1a02001 mov r2, r1 + 1f26698: e1a01000 mov r1, r0 + 1f2669c: e59c0000 ldr r0, [ip] + 1f266a0: eaffffa2 b 1f26530 + +01f266a4 : + 1f266a4: e30ac360 movw ip, #41824 ; 0xa360 + 1f266a8: e340c20d movt ip, #525 ; 0x20d + 1f266ac: e1a03002 mov r3, r2 + 1f266b0: e1a02001 mov r2, r1 + 1f266b4: e1a01000 mov r1, r0 + 1f266b8: e59c0000 ldr r0, [ip] + 1f266bc: eaffffb1 b 1f26588 + +01f266c0 : + 1f266c0: e3a00000 mov r0, #0 + 1f266c4: e12fff1e bx lr + +01f266c8 : + 1f266c8: e3a00000 mov r0, #0 + 1f266cc: e12fff1e bx lr + +01f266d0 : + 1f266d0: e3500000 cmp r0, #0 + 1f266d4: 0a000001 beq 1f266e0 + 1f266d8: e3a00004 mov r0, #4 + 1f266dc: e12fff1e bx lr + 1f266e0: e3530000 cmp r3, #0 + 1f266e4: 0a000015 beq 1f26740 + 1f266e8: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f266ec: e30a7360 movw r7, #41824 ; 0xa360 + 1f266f0: e340720d movt r7, #525 ; 0x20d + 1f266f4: e1a05001 mov r5, r1 + 1f266f8: e0836002 add r6, r3, r2 + 1f266fc: e1a04002 mov r4, r2 + 1f26700: ea000001 b 1f2670c + 1f26704: e1540006 cmp r4, r6 + 1f26708: 0a00000a beq 1f26738 + 1f2670c: e1a03004 mov r3, r4 + 1f26710: e1a01005 mov r1, r5 + 1f26714: e3a02c02 mov r2, #512 ; 0x200 + 1f26718: e5970000 ldr r0, [r7] + 1f2671c: ebffff83 bl 1f26530 + 1f26720: e3500c02 cmp r0, #512 ; 0x200 + 1f26724: e2844001 add r4, r4, #1 + 1f26728: e2855c02 add r5, r5, #512 ; 0x200 + 1f2672c: 2afffff4 bcs 1f26704 + 1f26730: e3a00001 mov r0, #1 + 1f26734: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f26738: e3a00000 mov r0, #0 + 1f2673c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f26740: e3a00000 mov r0, #0 + 1f26744: e12fff1e bx lr + +01f26748 : + 1f26748: e3500000 cmp r0, #0 + 1f2674c: 0a000001 beq 1f26758 + 1f26750: e3a00004 mov r0, #4 + 1f26754: e12fff1e bx lr + 1f26758: e3530000 cmp r3, #0 + 1f2675c: 0a000015 beq 1f267b8 + 1f26760: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f26764: e30a7360 movw r7, #41824 ; 0xa360 + 1f26768: e340720d movt r7, #525 ; 0x20d + 1f2676c: e1a05001 mov r5, r1 + 1f26770: e0836002 add r6, r3, r2 + 1f26774: e1a04002 mov r4, r2 + 1f26778: ea000001 b 1f26784 + 1f2677c: e1540006 cmp r4, r6 + 1f26780: 0a00000a beq 1f267b0 + 1f26784: e1a03004 mov r3, r4 + 1f26788: e1a01005 mov r1, r5 + 1f2678c: e3a02c02 mov r2, #512 ; 0x200 + 1f26790: e5970000 ldr r0, [r7] + 1f26794: ebffff7b bl 1f26588 + 1f26798: e3500c02 cmp r0, #512 ; 0x200 + 1f2679c: e2844001 add r4, r4, #1 + 1f267a0: e2855c02 add r5, r5, #512 ; 0x200 + 1f267a4: 2afffff4 bcs 1f2677c + 1f267a8: e3a00001 mov r0, #1 + 1f267ac: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f267b0: e3a00000 mov r0, #0 + 1f267b4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f267b8: e3a00000 mov r0, #0 + 1f267bc: e12fff1e bx lr + +01f267c0 : + 1f267c0: e3a00004 mov r0, #4 + 1f267c4: e12fff1e bx lr + +01f267c8 : + 1f267c8: e92d4010 push {r4, lr} + 1f267cc: e5903000 ldr r3, [r0] + 1f267d0: e1a04000 mov r4, r0 + 1f267d4: e1d300d0 ldrsb r0, [r3] + 1f267d8: e3500000 cmp r0, #0 + 1f267dc: 08bd8010 popeq {r4, pc} + 1f267e0: eb005f59 bl 1f3e54c + 1f267e4: e3500000 cmp r0, #0 + 1f267e8: 08bd8010 popeq {r4, pc} + 1f267ec: e5943000 ldr r3, [r4] + 1f267f0: e2832001 add r2, r3, #1 + 1f267f4: e5842000 str r2, [r4] + 1f267f8: e1d300d1 ldrsb r0, [r3, #1] + 1f267fc: e3500000 cmp r0, #0 + 1f26800: 1afffff6 bne 1f267e0 + 1f26804: e8bd8010 pop {r4, pc} + +01f26808 : + 1f26808: e92d4010 push {r4, lr} + 1f2680c: e5903000 ldr r3, [r0] + 1f26810: e1a04000 mov r4, r0 + 1f26814: e1d300d0 ldrsb r0, [r3] + 1f26818: e3500000 cmp r0, #0 + 1f2681c: 1a000005 bne 1f26838 + 1f26820: ea000030 b 1f268e8 + 1f26824: e2832001 add r2, r3, #1 + 1f26828: e5842000 str r2, [r4] + 1f2682c: e1d300d1 ldrsb r0, [r3, #1] + 1f26830: e3500000 cmp r0, #0 + 1f26834: 0a00002b beq 1f268e8 + 1f26838: eb005f43 bl 1f3e54c + 1f2683c: e3500000 cmp r0, #0 + 1f26840: e5943000 ldr r3, [r4] + 1f26844: 1afffff6 bne 1f26824 + 1f26848: e1d320d0 ldrsb r2, [r3] + 1f2684c: e352002f cmp r2, #47 ; 0x2f + 1f26850: 1a000024 bne 1f268e8 + 1f26854: e1d320d1 ldrsb r2, [r3, #1] + 1f26858: e352002f cmp r2, #47 ; 0x2f + 1f2685c: 0a000023 beq 1f268f0 + 1f26860: e352002a cmp r2, #42 ; 0x2a + 1f26864: 02833002 addeq r3, r3, #2 + 1f26868: 05843000 streq r3, [r4] + 1f2686c: 1a00001d bne 1f268e8 + 1f26870: ea000000 b 1f26878 + 1f26874: e1a03002 mov r3, r2 + 1f26878: e1d310d0 ldrsb r1, [r3] + 1f2687c: e2832001 add r2, r3, #1 + 1f26880: e3510000 cmp r1, #0 + 1f26884: 0a000015 beq 1f268e0 + 1f26888: e5842000 str r2, [r4] + 1f2688c: e15210d1 ldrsb r1, [r2, #-1] + 1f26890: e351002a cmp r1, #42 ; 0x2a + 1f26894: 1afffff6 bne 1f26874 + 1f26898: e1d310d1 ldrsb r1, [r3, #1] + 1f2689c: e351002f cmp r1, #47 ; 0x2f + 1f268a0: 1afffff3 bne 1f26874 + 1f268a4: e2832002 add r2, r3, #2 + 1f268a8: e5842000 str r2, [r4] + 1f268ac: e1d300d2 ldrsb r0, [r3, #2] + 1f268b0: e3500000 cmp r0, #0 + 1f268b4: 1a000006 bne 1f268d4 + 1f268b8: ea000008 b 1f268e0 + 1f268bc: e5943000 ldr r3, [r4] + 1f268c0: e2832001 add r2, r3, #1 + 1f268c4: e5842000 str r2, [r4] + 1f268c8: e1d300d1 ldrsb r0, [r3, #1] + 1f268cc: e3500000 cmp r0, #0 + 1f268d0: 0a000002 beq 1f268e0 + 1f268d4: eb005f1c bl 1f3e54c + 1f268d8: e3500000 cmp r0, #0 + 1f268dc: 1afffff6 bne 1f268bc + 1f268e0: e3a00001 mov r0, #1 + 1f268e4: e8bd8010 pop {r4, pc} + 1f268e8: e3a00000 mov r0, #0 + 1f268ec: e8bd8010 pop {r4, pc} + 1f268f0: e2832002 add r2, r3, #2 + 1f268f4: e5842000 str r2, [r4] + 1f268f8: e1d300d2 ldrsb r0, [r3, #2] + 1f268fc: e3500000 cmp r0, #0 + 1f26900: 1350000a cmpne r0, #10 + 1f26904: 0a000005 beq 1f26920 + 1f26908: e2822001 add r2, r2, #1 + 1f2690c: e5842000 str r2, [r4] + 1f26910: e1d200d0 ldrsb r0, [r2] + 1f26914: e350000a cmp r0, #10 + 1f26918: 13500000 cmpne r0, #0 + 1f2691c: 1afffff9 bne 1f26908 + 1f26920: e3500000 cmp r0, #0 + 1f26924: 1a000006 bne 1f26944 + 1f26928: eaffffec b 1f268e0 + 1f2692c: e5943000 ldr r3, [r4] + 1f26930: e2832001 add r2, r3, #1 + 1f26934: e5842000 str r2, [r4] + 1f26938: e1d300d1 ldrsb r0, [r3, #1] + 1f2693c: e3500000 cmp r0, #0 + 1f26940: 0affffe6 beq 1f268e0 + 1f26944: eb005f00 bl 1f3e54c + 1f26948: e3500000 cmp r0, #0 + 1f2694c: 1afffff6 bne 1f2692c + 1f26950: eaffffe2 b 1f268e0 + +01f26954 : + 1f26954: e92d4070 push {r4, r5, r6, lr} + 1f26958: e1a04000 mov r4, r0 + 1f2695c: e1a05001 mov r5, r1 + 1f26960: e1a00004 mov r0, r4 + 1f26964: ebffffa7 bl 1f26808 + 1f26968: e3500000 cmp r0, #0 + 1f2696c: 1afffffb bne 1f26960 + 1f26970: e5943000 ldr r3, [r4] + 1f26974: e1d300d0 ldrsb r0, [r3] + 1f26978: e3500000 cmp r0, #0 + 1f2697c: 1a000008 bne 1f269a4 + 1f26980: ea000026 b 1f26a20 + 1f26984: e1130005 tst r3, r5 + 1f26988: 1a00000a bne 1f269b8 + 1f2698c: e5943000 ldr r3, [r4] + 1f26990: e2832001 add r2, r3, #1 + 1f26994: e5842000 str r2, [r4] + 1f26998: e1d300d1 ldrsb r0, [r3, #1] + 1f2699c: e3500000 cmp r0, #0 + 1f269a0: 0a00001e beq 1f26a20 + 1f269a4: eb005ee8 bl 1f3e54c + 1f269a8: e3500000 cmp r0, #0 + 1f269ac: 13a03001 movne r3, #1 + 1f269b0: 03a03000 moveq r3, #0 + 1f269b4: 1afffff2 bne 1f26984 + 1f269b8: e5946000 ldr r6, [r4] + 1f269bc: e1d600d0 ldrsb r0, [r6] + 1f269c0: e3500000 cmp r0, #0 + 1f269c4: 1a000009 bne 1f269f0 + 1f269c8: ea000014 b 1f26a20 + 1f269cc: e1d320d0 ldrsb r2, [r3] + 1f269d0: e2831001 add r1, r3, #1 + 1f269d4: e352000d cmp r2, #13 + 1f269d8: 1352000a cmpne r2, #10 + 1f269dc: 0a000009 beq 1f26a08 + 1f269e0: e5841000 str r1, [r4] + 1f269e4: e1d300d1 ldrsb r0, [r3, #1] + 1f269e8: e3500000 cmp r0, #0 + 1f269ec: 0a000009 beq 1f26a18 + 1f269f0: eb005ed5 bl 1f3e54c + 1f269f4: e2900000 adds r0, r0, #0 + 1f269f8: 13a00001 movne r0, #1 + 1f269fc: e5943000 ldr r3, [r4] + 1f26a00: e1500005 cmp r0, r5 + 1f26a04: 9afffff0 bls 1f269cc + 1f26a08: e2831001 add r1, r3, #1 + 1f26a0c: e3a02000 mov r2, #0 + 1f26a10: e5841000 str r1, [r4] + 1f26a14: e5c32000 strb r2, [r3] + 1f26a18: e1a00006 mov r0, r6 + 1f26a1c: e8bd8070 pop {r4, r5, r6, pc} + 1f26a20: e3a06000 mov r6, #0 + 1f26a24: e1a00006 mov r0, r6 + 1f26a28: e8bd8070 pop {r4, r5, r6, pc} + +01f26a2c : + 1f26a2c: e3a02000 mov r2, #0 + 1f26a30: e3a01008 mov r1, #8 + 1f26a34: e5802000 str r2, [r0] + 1f26a38: e5801004 str r1, [r0, #4] + 1f26a3c: e5802008 str r2, [r0, #8] + 1f26a40: e580200c str r2, [r0, #12] + 1f26a44: e5802010 str r2, [r0, #16] + 1f26a48: e5802014 str r2, [r0, #20] + 1f26a4c: e5802018 str r2, [r0, #24] + 1f26a50: e580201c str r2, [r0, #28] + 1f26a54: e5802020 str r2, [r0, #32] + 1f26a58: e5802024 str r2, [r0, #36] ; 0x24 + 1f26a5c: e5802028 str r2, [r0, #40] ; 0x28 + 1f26a60: e580202c str r2, [r0, #44] ; 0x2c + 1f26a64: e5c02030 strb r2, [r0, #48] ; 0x30 + 1f26a68: e5c02130 strb r2, [r0, #304] ; 0x130 + 1f26a6c: e5c02230 strb r2, [r0, #560] ; 0x230 + 1f26a70: e5c02330 strb r2, [r0, #816] ; 0x330 + 1f26a74: e5c02430 strb r2, [r0, #1072] ; 0x430 + 1f26a78: e5c02530 strb r2, [r0, #1328] ; 0x530 + 1f26a7c: e5c02630 strb r2, [r0, #1584] ; 0x630 + 1f26a80: e5c02730 strb r2, [r0, #1840] ; 0x730 + 1f26a84: e12fff1e bx lr + +01f26a88 : + 1f26a88: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f26a8c: e1a04000 mov r4, r0 + 1f26a90: e5801000 str r1, [r0] + 1f26a94: e1a00004 mov r0, r4 + 1f26a98: ebffff5a bl 1f26808 + 1f26a9c: e3500000 cmp r0, #0 + 1f26aa0: 1afffffb bne 1f26a94 + 1f26aa4: e5943000 ldr r3, [r4] + 1f26aa8: e1d300d0 ldrsb r0, [r3] + 1f26aac: e3500000 cmp r0, #0 + 1f26ab0: 1a000006 bne 1f26ad0 + 1f26ab4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f26ab8: e5943000 ldr r3, [r4] + 1f26abc: e2832001 add r2, r3, #1 + 1f26ac0: e5842000 str r2, [r4] + 1f26ac4: e1d300d1 ldrsb r0, [r3, #1] + 1f26ac8: e3500000 cmp r0, #0 + 1f26acc: 0a000092 beq 1f26d1c + 1f26ad0: eb005e9d bl 1f3e54c + 1f26ad4: e3500000 cmp r0, #0 + 1f26ad8: 1afffff6 bne 1f26ab8 + 1f26adc: e5945000 ldr r5, [r4] + 1f26ae0: e1d500d0 ldrsb r0, [r5] + 1f26ae4: e3500000 cmp r0, #0 + 1f26ae8: 1a000009 bne 1f26b14 + 1f26aec: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f26af0: e1d320d0 ldrsb r2, [r3] + 1f26af4: e2831001 add r1, r3, #1 + 1f26af8: e352000a cmp r2, #10 + 1f26afc: 1352000d cmpne r2, #13 + 1f26b00: 0a000007 beq 1f26b24 + 1f26b04: e5841000 str r1, [r4] + 1f26b08: e1d300d1 ldrsb r0, [r3, #1] + 1f26b0c: e3500000 cmp r0, #0 + 1f26b10: 0a000007 beq 1f26b34 + 1f26b14: eb005e8c bl 1f3e54c + 1f26b18: e3500000 cmp r0, #0 + 1f26b1c: e5943000 ldr r3, [r4] + 1f26b20: 0afffff2 beq 1f26af0 + 1f26b24: e2831001 add r1, r3, #1 + 1f26b28: e3a02000 mov r2, #0 + 1f26b2c: e5841000 str r1, [r4] + 1f26b30: e5c32000 strb r2, [r3] + 1f26b34: e3550000 cmp r5, #0 + 1f26b38: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc} + 1f26b3c: e1a00004 mov r0, r4 + 1f26b40: ebffff30 bl 1f26808 + 1f26b44: e3500000 cmp r0, #0 + 1f26b48: 1afffffb bne 1f26b3c + 1f26b4c: e5943000 ldr r3, [r4] + 1f26b50: e1d300d0 ldrsb r0, [r3] + 1f26b54: e3500000 cmp r0, #0 + 1f26b58: 1a000005 bne 1f26b74 + 1f26b5c: ea00001d b 1f26bd8 + 1f26b60: e2832001 add r2, r3, #1 + 1f26b64: e5842000 str r2, [r4] + 1f26b68: e1d300d1 ldrsb r0, [r3, #1] + 1f26b6c: e3500000 cmp r0, #0 + 1f26b70: 0a000018 beq 1f26bd8 + 1f26b74: eb005e74 bl 1f3e54c + 1f26b78: e3500000 cmp r0, #0 + 1f26b7c: e5943000 ldr r3, [r4] + 1f26b80: 1afffff6 bne 1f26b60 + 1f26b84: e1d300d0 ldrsb r0, [r3] + 1f26b88: e3500000 cmp r0, #0 + 1f26b8c: 1a000009 bne 1f26bb8 + 1f26b90: ea000010 b 1f26bd8 + 1f26b94: e1d320d0 ldrsb r2, [r3] + 1f26b98: e2831001 add r1, r3, #1 + 1f26b9c: e352000d cmp r2, #13 + 1f26ba0: 1352000a cmpne r2, #10 + 1f26ba4: 0a000007 beq 1f26bc8 + 1f26ba8: e5841000 str r1, [r4] + 1f26bac: e1d300d1 ldrsb r0, [r3, #1] + 1f26bb0: e3500000 cmp r0, #0 + 1f26bb4: 0a000007 beq 1f26bd8 + 1f26bb8: eb005e63 bl 1f3e54c + 1f26bbc: e3500000 cmp r0, #0 + 1f26bc0: e5943000 ldr r3, [r4] + 1f26bc4: 0afffff2 beq 1f26b94 + 1f26bc8: e2831001 add r1, r3, #1 + 1f26bcc: e3a02000 mov r2, #0 + 1f26bd0: e5841000 str r1, [r4] + 1f26bd4: e5c32000 strb r2, [r3] + 1f26bd8: e1a00004 mov r0, r4 + 1f26bdc: ebffff09 bl 1f26808 + 1f26be0: e3500000 cmp r0, #0 + 1f26be4: 1afffffb bne 1f26bd8 + 1f26be8: e5943000 ldr r3, [r4] + 1f26bec: e1d300d0 ldrsb r0, [r3] + 1f26bf0: e3500000 cmp r0, #0 + 1f26bf4: 1a000006 bne 1f26c14 + 1f26bf8: ea000048 b 1f26d20 + 1f26bfc: e5943000 ldr r3, [r4] + 1f26c00: e2832001 add r2, r3, #1 + 1f26c04: e5842000 str r2, [r4] + 1f26c08: e1d300d1 ldrsb r0, [r3, #1] + 1f26c0c: e3500000 cmp r0, #0 + 1f26c10: 0a000042 beq 1f26d20 + 1f26c14: eb005e4c bl 1f3e54c + 1f26c18: e3500000 cmp r0, #0 + 1f26c1c: 1afffff6 bne 1f26bfc + 1f26c20: e5947000 ldr r7, [r4] + 1f26c24: e1d760d0 ldrsb r6, [r7] + 1f26c28: e3560000 cmp r6, #0 + 1f26c2c: 1a000009 bne 1f26c58 + 1f26c30: ea000097 b 1f26e94 + 1f26c34: e1d320d0 ldrsb r2, [r3] + 1f26c38: e2831001 add r1, r3, #1 + 1f26c3c: e352000d cmp r2, #13 + 1f26c40: 1352000a cmpne r2, #10 + 1f26c44: 0a000008 beq 1f26c6c + 1f26c48: e5841000 str r1, [r4] + 1f26c4c: e1d360d1 ldrsb r6, [r3, #1] + 1f26c50: e3560000 cmp r6, #0 + 1f26c54: 0a000008 beq 1f26c7c + 1f26c58: e1a00006 mov r0, r6 + 1f26c5c: eb005e3a bl 1f3e54c + 1f26c60: e3500000 cmp r0, #0 + 1f26c64: e5943000 ldr r3, [r4] + 1f26c68: 0afffff1 beq 1f26c34 + 1f26c6c: e2831001 add r1, r3, #1 + 1f26c70: e3a02000 mov r2, #0 + 1f26c74: e5841000 str r1, [r4] + 1f26c78: e5c32000 strb r2, [r3] + 1f26c7c: e30f1cd8 movw r1, #64728 ; 0xfcd8 + 1f26c80: e34011f5 movt r1, #501 ; 0x1f5 + 1f26c84: e1a00005 mov r0, r5 + 1f26c88: eb0063c3 bl 1f3fb9c + 1f26c8c: e3500000 cmp r0, #0 + 1f26c90: 1a000057 bne 1f26df4 + 1f26c94: e3570000 cmp r7, #0 + 1f26c98: 0affff7d beq 1f26a94 + 1f26c9c: e1d720d0 ldrsb r2, [r7] + 1f26ca0: e3520000 cmp r2, #0 + 1f26ca4: 0affff7a beq 1f26a94 + 1f26ca8: e352000d cmp r2, #13 + 1f26cac: e2877001 add r7, r7, #1 + 1f26cb0: 0a000152 beq 1f27200 + 1f26cb4: e2422030 sub r2, r2, #48 ; 0x30 + 1f26cb8: e6ef3072 uxtb r3, r2 + 1f26cbc: e3530009 cmp r3, #9 + 1f26cc0: 9a00000a bls 1f26cf0 + 1f26cc4: eaffff72 b 1f26a94 + 1f26cc8: e3510009 cmp r1, #9 + 1f26ccc: 8affff70 bhi 1f26a94 + 1f26cd0: e3730001 cmn r3, #1 + 1f26cd4: 13a01000 movne r1, #0 + 1f26cd8: 03a01001 moveq r1, #1 + 1f26cdc: e1530002 cmp r3, r2 + 1f26ce0: 33811001 orrcc r1, r1, #1 + 1f26ce4: e1a02003 mov r2, r3 + 1f26ce8: e3510000 cmp r1, #0 + 1f26cec: 1affff68 bne 1f26a94 + 1f26cf0: e0d700d1 ldrsb r0, [r7], #1 + 1f26cf4: e1a03182 lsl r3, r2, #3 + 1f26cf8: e0833082 add r3, r3, r2, lsl #1 + 1f26cfc: e2401030 sub r1, r0, #48 ; 0x30 + 1f26d00: e350000d cmp r0, #13 + 1f26d04: 13500000 cmpne r0, #0 + 1f26d08: e0813003 add r3, r1, r3 + 1f26d0c: e6ef1071 uxtb r1, r1 + 1f26d10: 1affffec bne 1f26cc8 + 1f26d14: e5842004 str r2, [r4, #4] + 1f26d18: eaffff5d b 1f26a94 + 1f26d1c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f26d20: e30f1cd8 movw r1, #64728 ; 0xfcd8 + 1f26d24: e34011f5 movt r1, #501 ; 0x1f5 + 1f26d28: e1a00005 mov r0, r5 + 1f26d2c: eb00639a bl 1f3fb9c + 1f26d30: e3500000 cmp r0, #0 + 1f26d34: 0affff56 beq 1f26a94 + 1f26d38: e30f1ce4 movw r1, #64740 ; 0xfce4 + 1f26d3c: e34011f5 movt r1, #501 ; 0x1f5 + 1f26d40: e1a00005 mov r0, r5 + 1f26d44: eb006394 bl 1f3fb9c + 1f26d48: e3500000 cmp r0, #0 + 1f26d4c: 13a07000 movne r7, #0 + 1f26d50: 0affff4f beq 1f26a94 + 1f26d54: e30f1d04 movw r1, #64772 ; 0xfd04 + 1f26d58: e34011f5 movt r1, #501 ; 0x1f5 + 1f26d5c: e1a00005 mov r0, r5 + 1f26d60: eb00638d bl 1f3fb9c + 1f26d64: e3500000 cmp r0, #0 + 1f26d68: 1a00005c bne 1f26ee0 + 1f26d6c: e3570000 cmp r7, #0 + 1f26d70: 0affff47 beq 1f26a94 + 1f26d74: e1d720d0 ldrsb r2, [r7] + 1f26d78: e3520000 cmp r2, #0 + 1f26d7c: 0affff44 beq 1f26a94 + 1f26d80: e352000d cmp r2, #13 + 1f26d84: e2877001 add r7, r7, #1 + 1f26d88: 0a000196 beq 1f273e8 + 1f26d8c: e2422030 sub r2, r2, #48 ; 0x30 + 1f26d90: e6ef3072 uxtb r3, r2 + 1f26d94: e3530009 cmp r3, #9 + 1f26d98: 9a00000a bls 1f26dc8 + 1f26d9c: eaffff3c b 1f26a94 + 1f26da0: e3510009 cmp r1, #9 + 1f26da4: 8affff3a bhi 1f26a94 + 1f26da8: e3730001 cmn r3, #1 + 1f26dac: 13a01000 movne r1, #0 + 1f26db0: 03a01001 moveq r1, #1 + 1f26db4: e1530002 cmp r3, r2 + 1f26db8: 33811001 orrcc r1, r1, #1 + 1f26dbc: e1a02003 mov r2, r3 + 1f26dc0: e3510000 cmp r1, #0 + 1f26dc4: 1affff32 bne 1f26a94 + 1f26dc8: e0d700d1 ldrsb r0, [r7], #1 + 1f26dcc: e1a03182 lsl r3, r2, #3 + 1f26dd0: e0833082 add r3, r3, r2, lsl #1 + 1f26dd4: e2401030 sub r1, r0, #48 ; 0x30 + 1f26dd8: e350000d cmp r0, #13 + 1f26ddc: 13500000 cmpne r0, #0 + 1f26de0: e0813003 add r3, r1, r3 + 1f26de4: e6ef1071 uxtb r1, r1 + 1f26de8: 1affffec bne 1f26da0 + 1f26dec: e584200c str r2, [r4, #12] + 1f26df0: eaffff27 b 1f26a94 + 1f26df4: e30f1ce4 movw r1, #64740 ; 0xfce4 + 1f26df8: e34011f5 movt r1, #501 ; 0x1f5 + 1f26dfc: e1a00005 mov r0, r5 + 1f26e00: eb006365 bl 1f3fb9c + 1f26e04: e3500000 cmp r0, #0 + 1f26e08: 1affffd1 bne 1f26d54 + 1f26e0c: e3570000 cmp r7, #0 + 1f26e10: 0affff1f beq 1f26a94 + 1f26e14: e1d720d0 ldrsb r2, [r7] + 1f26e18: e3520000 cmp r2, #0 + 1f26e1c: 0affff1c beq 1f26a94 + 1f26e20: e352000d cmp r2, #13 + 1f26e24: e2877001 add r7, r7, #1 + 1f26e28: 0a000170 beq 1f273f0 + 1f26e2c: e2422030 sub r2, r2, #48 ; 0x30 + 1f26e30: e6ef3072 uxtb r3, r2 + 1f26e34: e3530009 cmp r3, #9 + 1f26e38: 9a00000a bls 1f26e68 + 1f26e3c: eaffff14 b 1f26a94 + 1f26e40: e3510009 cmp r1, #9 + 1f26e44: 8affff12 bhi 1f26a94 + 1f26e48: e3730001 cmn r3, #1 + 1f26e4c: 13a01000 movne r1, #0 + 1f26e50: 03a01001 moveq r1, #1 + 1f26e54: e1530002 cmp r3, r2 + 1f26e58: 33811001 orrcc r1, r1, #1 + 1f26e5c: e1a02003 mov r2, r3 + 1f26e60: e3510000 cmp r1, #0 + 1f26e64: 1affff0a bne 1f26a94 + 1f26e68: e0d700d1 ldrsb r0, [r7], #1 + 1f26e6c: e1a03182 lsl r3, r2, #3 + 1f26e70: e0833082 add r3, r3, r2, lsl #1 + 1f26e74: e2401030 sub r1, r0, #48 ; 0x30 + 1f26e78: e350000d cmp r0, #13 + 1f26e7c: 13500000 cmpne r0, #0 + 1f26e80: e0813003 add r3, r1, r3 + 1f26e84: e6ef1071 uxtb r1, r1 + 1f26e88: 1affffec bne 1f26e40 + 1f26e8c: e5842008 str r2, [r4, #8] + 1f26e90: eafffeff b 1f26a94 + 1f26e94: e30f1cd8 movw r1, #64728 ; 0xfcd8 + 1f26e98: e34011f5 movt r1, #501 ; 0x1f5 + 1f26e9c: e1a00005 mov r0, r5 + 1f26ea0: eb00633d bl 1f3fb9c + 1f26ea4: e3500000 cmp r0, #0 + 1f26ea8: 0afffef9 beq 1f26a94 + 1f26eac: e30f1ce4 movw r1, #64740 ; 0xfce4 + 1f26eb0: e34011f5 movt r1, #501 ; 0x1f5 + 1f26eb4: e1a00005 mov r0, r5 + 1f26eb8: eb006337 bl 1f3fb9c + 1f26ebc: e3500000 cmp r0, #0 + 1f26ec0: 0afffef3 beq 1f26a94 + 1f26ec4: e30f1d04 movw r1, #64772 ; 0xfd04 + 1f26ec8: e34011f5 movt r1, #501 ; 0x1f5 + 1f26ecc: e1a00005 mov r0, r5 + 1f26ed0: eb006331 bl 1f3fb9c + 1f26ed4: e3500000 cmp r0, #0 + 1f26ed8: 11a07006 movne r7, r6 + 1f26edc: 0afffeec beq 1f26a94 + 1f26ee0: e30f1d10 movw r1, #64784 ; 0xfd10 + 1f26ee4: e34011f5 movt r1, #501 ; 0x1f5 + 1f26ee8: e1a00005 mov r0, r5 + 1f26eec: eb00632a bl 1f3fb9c + 1f26ef0: e3500000 cmp r0, #0 + 1f26ef4: 1a000021 bne 1f26f80 + 1f26ef8: e3570000 cmp r7, #0 + 1f26efc: 0afffee4 beq 1f26a94 + 1f26f00: e1d730d0 ldrsb r3, [r7] + 1f26f04: e3530000 cmp r3, #0 + 1f26f08: 0afffee1 beq 1f26a94 + 1f26f0c: e353000d cmp r3, #13 + 1f26f10: e2877001 add r7, r7, #1 + 1f26f14: 0a000139 beq 1f27400 + 1f26f18: e2432030 sub r2, r3, #48 ; 0x30 + 1f26f1c: e6ef3072 uxtb r3, r2 + 1f26f20: e3530009 cmp r3, #9 + 1f26f24: 9a00000a bls 1f26f54 + 1f26f28: eafffed9 b 1f26a94 + 1f26f2c: e3510009 cmp r1, #9 + 1f26f30: 8afffed7 bhi 1f26a94 + 1f26f34: e3730001 cmn r3, #1 + 1f26f38: 13a01000 movne r1, #0 + 1f26f3c: 03a01001 moveq r1, #1 + 1f26f40: e1530002 cmp r3, r2 + 1f26f44: 33811001 orrcc r1, r1, #1 + 1f26f48: e1a02003 mov r2, r3 + 1f26f4c: e3510000 cmp r1, #0 + 1f26f50: 1afffecf bne 1f26a94 + 1f26f54: e0d700d1 ldrsb r0, [r7], #1 + 1f26f58: e1a03182 lsl r3, r2, #3 + 1f26f5c: e0833082 add r3, r3, r2, lsl #1 + 1f26f60: e2401030 sub r1, r0, #48 ; 0x30 + 1f26f64: e350000d cmp r0, #13 + 1f26f68: 13500000 cmpne r0, #0 + 1f26f6c: e0813003 add r3, r1, r3 + 1f26f70: e6ef1071 uxtb r1, r1 + 1f26f74: 1affffec bne 1f26f2c + 1f26f78: e5842010 str r2, [r4, #16] + 1f26f7c: eafffec4 b 1f26a94 + 1f26f80: e30f1d28 movw r1, #64808 ; 0xfd28 + 1f26f84: e34011f5 movt r1, #501 ; 0x1f5 + 1f26f88: e1a00005 mov r0, r5 + 1f26f8c: eb006302 bl 1f3fb9c + 1f26f90: e3500000 cmp r0, #0 + 1f26f94: 1a000021 bne 1f27020 + 1f26f98: e3570000 cmp r7, #0 + 1f26f9c: 0afffebc beq 1f26a94 + 1f26fa0: e1d730d0 ldrsb r3, [r7] + 1f26fa4: e3530000 cmp r3, #0 + 1f26fa8: 0afffeb9 beq 1f26a94 + 1f26fac: e353000d cmp r3, #13 + 1f26fb0: e2877001 add r7, r7, #1 + 1f26fb4: 0a000115 beq 1f27410 + 1f26fb8: e2432030 sub r2, r3, #48 ; 0x30 + 1f26fbc: e6ef3072 uxtb r3, r2 + 1f26fc0: e3530009 cmp r3, #9 + 1f26fc4: 9a00000a bls 1f26ff4 + 1f26fc8: eafffeb1 b 1f26a94 + 1f26fcc: e3510009 cmp r1, #9 + 1f26fd0: 8afffeaf bhi 1f26a94 + 1f26fd4: e3730001 cmn r3, #1 + 1f26fd8: 13a01000 movne r1, #0 + 1f26fdc: 03a01001 moveq r1, #1 + 1f26fe0: e1530002 cmp r3, r2 + 1f26fe4: 33811001 orrcc r1, r1, #1 + 1f26fe8: e1a02003 mov r2, r3 + 1f26fec: e3510000 cmp r1, #0 + 1f26ff0: 1afffea7 bne 1f26a94 + 1f26ff4: e0d700d1 ldrsb r0, [r7], #1 + 1f26ff8: e1a03182 lsl r3, r2, #3 + 1f26ffc: e0833082 add r3, r3, r2, lsl #1 + 1f27000: e2401030 sub r1, r0, #48 ; 0x30 + 1f27004: e350000d cmp r0, #13 + 1f27008: 13500000 cmpne r0, #0 + 1f2700c: e0813003 add r3, r1, r3 + 1f27010: e6ef1071 uxtb r1, r1 + 1f27014: 1affffec bne 1f26fcc + 1f27018: e5842014 str r2, [r4, #20] + 1f2701c: eafffe9c b 1f26a94 + 1f27020: e30f1d3c movw r1, #64828 ; 0xfd3c + 1f27024: e34011f5 movt r1, #501 ; 0x1f5 + 1f27028: e1a00005 mov r0, r5 + 1f2702c: eb0062da bl 1f3fb9c + 1f27030: e3500000 cmp r0, #0 + 1f27034: 1a000021 bne 1f270c0 + 1f27038: e3570000 cmp r7, #0 + 1f2703c: 0afffe94 beq 1f26a94 + 1f27040: e1d730d0 ldrsb r3, [r7] + 1f27044: e3530000 cmp r3, #0 + 1f27048: 0afffe91 beq 1f26a94 + 1f2704c: e353000d cmp r3, #13 + 1f27050: e2877001 add r7, r7, #1 + 1f27054: 0a0000eb beq 1f27408 + 1f27058: e2432030 sub r2, r3, #48 ; 0x30 + 1f2705c: e6ef3072 uxtb r3, r2 + 1f27060: e3530009 cmp r3, #9 + 1f27064: 9a00000a bls 1f27094 + 1f27068: eafffe89 b 1f26a94 + 1f2706c: e3510009 cmp r1, #9 + 1f27070: 8afffe87 bhi 1f26a94 + 1f27074: e3730001 cmn r3, #1 + 1f27078: 13a01000 movne r1, #0 + 1f2707c: 03a01001 moveq r1, #1 + 1f27080: e1530002 cmp r3, r2 + 1f27084: 33811001 orrcc r1, r1, #1 + 1f27088: e1a02003 mov r2, r3 + 1f2708c: e3510000 cmp r1, #0 + 1f27090: 1afffe7f bne 1f26a94 + 1f27094: e0d700d1 ldrsb r0, [r7], #1 + 1f27098: e1a03182 lsl r3, r2, #3 + 1f2709c: e0833082 add r3, r3, r2, lsl #1 + 1f270a0: e2401030 sub r1, r0, #48 ; 0x30 + 1f270a4: e350000d cmp r0, #13 + 1f270a8: 13500000 cmpne r0, #0 + 1f270ac: e0813003 add r3, r1, r3 + 1f270b0: e6ef1071 uxtb r1, r1 + 1f270b4: 1affffec bne 1f2706c + 1f270b8: e5842018 str r2, [r4, #24] + 1f270bc: eafffe74 b 1f26a94 + 1f270c0: e30f1d48 movw r1, #64840 ; 0xfd48 + 1f270c4: e34011f5 movt r1, #501 ; 0x1f5 + 1f270c8: e1a00005 mov r0, r5 + 1f270cc: eb0062b2 bl 1f3fb9c + 1f270d0: e3500000 cmp r0, #0 + 1f270d4: 1a000021 bne 1f27160 + 1f270d8: e3570000 cmp r7, #0 + 1f270dc: 0afffe6c beq 1f26a94 + 1f270e0: e1d730d0 ldrsb r3, [r7] + 1f270e4: e3530000 cmp r3, #0 + 1f270e8: 0afffe69 beq 1f26a94 + 1f270ec: e353000d cmp r3, #13 + 1f270f0: e2877001 add r7, r7, #1 + 1f270f4: 0a0000d6 beq 1f27454 + 1f270f8: e2433030 sub r3, r3, #48 ; 0x30 + 1f270fc: e6ef2073 uxtb r2, r3 + 1f27100: e3520009 cmp r2, #9 + 1f27104: 9a00000a bls 1f27134 + 1f27108: eafffe61 b 1f26a94 + 1f2710c: e3510009 cmp r1, #9 + 1f27110: 8afffe5f bhi 1f26a94 + 1f27114: e3720001 cmn r2, #1 + 1f27118: 13a01000 movne r1, #0 + 1f2711c: 03a01001 moveq r1, #1 + 1f27120: e1520003 cmp r2, r3 + 1f27124: 33811001 orrcc r1, r1, #1 + 1f27128: e1a03002 mov r3, r2 + 1f2712c: e3510000 cmp r1, #0 + 1f27130: 1afffe57 bne 1f26a94 + 1f27134: e0d700d1 ldrsb r0, [r7], #1 + 1f27138: e1a02183 lsl r2, r3, #3 + 1f2713c: e0822083 add r2, r2, r3, lsl #1 + 1f27140: e2401030 sub r1, r0, #48 ; 0x30 + 1f27144: e350000d cmp r0, #13 + 1f27148: 13500000 cmpne r0, #0 + 1f2714c: e0812002 add r2, r1, r2 + 1f27150: e6ef1071 uxtb r1, r1 + 1f27154: 1affffec bne 1f2710c + 1f27158: e584301c str r3, [r4, #28] + 1f2715c: eafffe4c b 1f26a94 + 1f27160: e30f1d54 movw r1, #64852 ; 0xfd54 + 1f27164: e34011f5 movt r1, #501 ; 0x1f5 + 1f27168: e1a00005 mov r0, r5 + 1f2716c: eb00628a bl 1f3fb9c + 1f27170: e3500000 cmp r0, #0 + 1f27174: 1a000023 bne 1f27208 + 1f27178: e3570000 cmp r7, #0 + 1f2717c: 0afffe44 beq 1f26a94 + 1f27180: e1d730d0 ldrsb r3, [r7] + 1f27184: e3530000 cmp r3, #0 + 1f27188: 0afffe41 beq 1f26a94 + 1f2718c: e353000d cmp r3, #13 + 1f27190: e2877001 add r7, r7, #1 + 1f27194: 0a0000ac beq 1f2744c + 1f27198: e2433030 sub r3, r3, #48 ; 0x30 + 1f2719c: e6ef2073 uxtb r2, r3 + 1f271a0: e3520009 cmp r2, #9 + 1f271a4: 9a00000a bls 1f271d4 + 1f271a8: eafffe39 b 1f26a94 + 1f271ac: e3510009 cmp r1, #9 + 1f271b0: 8afffe37 bhi 1f26a94 + 1f271b4: e3720001 cmn r2, #1 + 1f271b8: 13a01000 movne r1, #0 + 1f271bc: 03a01001 moveq r1, #1 + 1f271c0: e1520003 cmp r2, r3 + 1f271c4: 33811001 orrcc r1, r1, #1 + 1f271c8: e1a03002 mov r3, r2 + 1f271cc: e3510000 cmp r1, #0 + 1f271d0: 1afffe2f bne 1f26a94 + 1f271d4: e0d700d1 ldrsb r0, [r7], #1 + 1f271d8: e1a02183 lsl r2, r3, #3 + 1f271dc: e0822083 add r2, r2, r3, lsl #1 + 1f271e0: e2401030 sub r1, r0, #48 ; 0x30 + 1f271e4: e350000d cmp r0, #13 + 1f271e8: 13500000 cmpne r0, #0 + 1f271ec: e0812002 add r2, r1, r2 + 1f271f0: e6ef1071 uxtb r1, r1 + 1f271f4: 1affffec bne 1f271ac + 1f271f8: e5843020 str r3, [r4, #32] + 1f271fc: eafffe24 b 1f26a94 + 1f27200: e1a02000 mov r2, r0 + 1f27204: eafffec2 b 1f26d14 + 1f27208: e30f1d64 movw r1, #64868 ; 0xfd64 + 1f2720c: e34011f5 movt r1, #501 ; 0x1f5 + 1f27210: e1a00005 mov r0, r5 + 1f27214: eb006260 bl 1f3fb9c + 1f27218: e3500000 cmp r0, #0 + 1f2721c: 0a000027 beq 1f272c0 + 1f27220: e30f1d70 movw r1, #64880 ; 0xfd70 + 1f27224: e34011f5 movt r1, #501 ; 0x1f5 + 1f27228: e1a00005 mov r0, r5 + 1f2722c: eb00625a bl 1f3fb9c + 1f27230: e3500000 cmp r0, #0 + 1f27234: 1a000043 bne 1f27348 + 1f27238: e3570000 cmp r7, #0 + 1f2723c: 0afffe14 beq 1f26a94 + 1f27240: e1d730d0 ldrsb r3, [r7] + 1f27244: e3530000 cmp r3, #0 + 1f27248: 0afffe11 beq 1f26a94 + 1f2724c: e353000d cmp r3, #13 + 1f27250: e2877001 add r7, r7, #1 + 1f27254: 0a000080 beq 1f2745c + 1f27258: e2433030 sub r3, r3, #48 ; 0x30 + 1f2725c: e6ef2073 uxtb r2, r3 + 1f27260: e3520009 cmp r2, #9 + 1f27264: 9a00000a bls 1f27294 + 1f27268: eafffe09 b 1f26a94 + 1f2726c: e3510009 cmp r1, #9 + 1f27270: 8afffe07 bhi 1f26a94 + 1f27274: e3720001 cmn r2, #1 + 1f27278: 13a01000 movne r1, #0 + 1f2727c: 03a01001 moveq r1, #1 + 1f27280: e1520003 cmp r2, r3 + 1f27284: 33811001 orrcc r1, r1, #1 + 1f27288: e1a03002 mov r3, r2 + 1f2728c: e3510000 cmp r1, #0 + 1f27290: 1afffdff bne 1f26a94 + 1f27294: e0d700d1 ldrsb r0, [r7], #1 + 1f27298: e1a02183 lsl r2, r3, #3 + 1f2729c: e0822083 add r2, r2, r3, lsl #1 + 1f272a0: e2401030 sub r1, r0, #48 ; 0x30 + 1f272a4: e350000d cmp r0, #13 + 1f272a8: 13500000 cmpne r0, #0 + 1f272ac: e0812002 add r2, r1, r2 + 1f272b0: e6ef1071 uxtb r1, r1 + 1f272b4: 1affffec bne 1f2726c + 1f272b8: e5843028 str r3, [r4, #40] ; 0x28 + 1f272bc: eafffdf4 b 1f26a94 + 1f272c0: e3570000 cmp r7, #0 + 1f272c4: 0afffdf2 beq 1f26a94 + 1f272c8: e1d730d0 ldrsb r3, [r7] + 1f272cc: e3530000 cmp r3, #0 + 1f272d0: 0afffdef beq 1f26a94 + 1f272d4: e353000d cmp r3, #13 + 1f272d8: e2877001 add r7, r7, #1 + 1f272dc: 0a000045 beq 1f273f8 + 1f272e0: e2433030 sub r3, r3, #48 ; 0x30 + 1f272e4: e6ef2073 uxtb r2, r3 + 1f272e8: e3520009 cmp r2, #9 + 1f272ec: 9a00000a bls 1f2731c + 1f272f0: eafffde7 b 1f26a94 + 1f272f4: e3510009 cmp r1, #9 + 1f272f8: 8afffde5 bhi 1f26a94 + 1f272fc: e3720001 cmn r2, #1 + 1f27300: 13a01000 movne r1, #0 + 1f27304: 03a01001 moveq r1, #1 + 1f27308: e1520003 cmp r2, r3 + 1f2730c: 33811001 orrcc r1, r1, #1 + 1f27310: e1a03002 mov r3, r2 + 1f27314: e3510000 cmp r1, #0 + 1f27318: 1afffddd bne 1f26a94 + 1f2731c: e0d700d1 ldrsb r0, [r7], #1 + 1f27320: e1a02183 lsl r2, r3, #3 + 1f27324: e0822083 add r2, r2, r3, lsl #1 + 1f27328: e2401030 sub r1, r0, #48 ; 0x30 + 1f2732c: e350000d cmp r0, #13 + 1f27330: 13500000 cmpne r0, #0 + 1f27334: e0812002 add r2, r1, r2 + 1f27338: e6ef1071 uxtb r1, r1 + 1f2733c: 1affffec bne 1f272f4 + 1f27340: e5843024 str r3, [r4, #36] ; 0x24 + 1f27344: eafffdd2 b 1f26a94 + 1f27348: e30f1d80 movw r1, #64896 ; 0xfd80 + 1f2734c: e34011f5 movt r1, #501 ; 0x1f5 + 1f27350: e1a00005 mov r0, r5 + 1f27354: eb006210 bl 1f3fb9c + 1f27358: e3500000 cmp r0, #0 + 1f2735c: 1a00002f bne 1f27420 + 1f27360: e3570000 cmp r7, #0 + 1f27364: 0afffdca beq 1f26a94 + 1f27368: e1d730d0 ldrsb r3, [r7] + 1f2736c: e3530000 cmp r3, #0 + 1f27370: 0afffdc7 beq 1f26a94 + 1f27374: e353000d cmp r3, #13 + 1f27378: e2877001 add r7, r7, #1 + 1f2737c: 0a000025 beq 1f27418 + 1f27380: e2433030 sub r3, r3, #48 ; 0x30 + 1f27384: e6ef2073 uxtb r2, r3 + 1f27388: e3520009 cmp r2, #9 + 1f2738c: 9a00000a bls 1f273bc + 1f27390: eafffdbf b 1f26a94 + 1f27394: e3510009 cmp r1, #9 + 1f27398: 8afffdbd bhi 1f26a94 + 1f2739c: e3720001 cmn r2, #1 + 1f273a0: 13a01000 movne r1, #0 + 1f273a4: 03a01001 moveq r1, #1 + 1f273a8: e1520003 cmp r2, r3 + 1f273ac: 33811001 orrcc r1, r1, #1 + 1f273b0: e1a03002 mov r3, r2 + 1f273b4: e3510000 cmp r1, #0 + 1f273b8: 1afffdb5 bne 1f26a94 + 1f273bc: e0d700d1 ldrsb r0, [r7], #1 + 1f273c0: e1a02183 lsl r2, r3, #3 + 1f273c4: e0822083 add r2, r2, r3, lsl #1 + 1f273c8: e2401030 sub r1, r0, #48 ; 0x30 + 1f273cc: e350000d cmp r0, #13 + 1f273d0: 13500000 cmpne r0, #0 + 1f273d4: e0812002 add r2, r1, r2 + 1f273d8: e6ef1071 uxtb r1, r1 + 1f273dc: 1affffec bne 1f27394 + 1f273e0: e584302c str r3, [r4, #44] ; 0x2c + 1f273e4: eafffdaa b 1f26a94 + 1f273e8: e1a02000 mov r2, r0 + 1f273ec: eafffe7e b 1f26dec + 1f273f0: e1a02000 mov r2, r0 + 1f273f4: eafffea4 b 1f26e8c + 1f273f8: e1a03000 mov r3, r0 + 1f273fc: eaffffcf b 1f27340 + 1f27400: e1a02000 mov r2, r0 + 1f27404: eafffedb b 1f26f78 + 1f27408: e1a02000 mov r2, r0 + 1f2740c: eaffff29 b 1f270b8 + 1f27410: e1a02000 mov r2, r0 + 1f27414: eafffeff b 1f27018 + 1f27418: e3a03000 mov r3, #0 + 1f2741c: eaffffef b 1f273e0 + 1f27420: e30f1d90 movw r1, #64912 ; 0xfd90 + 1f27424: e34011f5 movt r1, #501 ; 0x1f5 + 1f27428: e1a00005 mov r0, r5 + 1f2742c: eb0061da bl 1f3fb9c + 1f27430: e3500000 cmp r0, #0 + 1f27434: 1a00000a bne 1f27464 + 1f27438: e1a01007 mov r1, r7 + 1f2743c: e3a020ff mov r2, #255 ; 0xff + 1f27440: e2840030 add r0, r4, #48 ; 0x30 + 1f27444: eb00636e bl 1f40204 + 1f27448: eafffd91 b 1f26a94 + 1f2744c: e1a03000 mov r3, r0 + 1f27450: eaffff68 b 1f271f8 + 1f27454: e1a03000 mov r3, r0 + 1f27458: eaffff3e b 1f27158 + 1f2745c: e3a03000 mov r3, #0 + 1f27460: eaffff94 b 1f272b8 + 1f27464: e30f1d94 movw r1, #64916 ; 0xfd94 + 1f27468: e34011f5 movt r1, #501 ; 0x1f5 + 1f2746c: e1a00005 mov r0, r5 + 1f27470: eb0061c9 bl 1f3fb9c + 1f27474: e3500000 cmp r0, #0 + 1f27478: 0affffee beq 1f27438 + 1f2747c: e30f1dcc movw r1, #64972 ; 0xfdcc + 1f27480: e34011f5 movt r1, #501 ; 0x1f5 + 1f27484: e1a00005 mov r0, r5 + 1f27488: eb0061c3 bl 1f3fb9c + 1f2748c: e3500000 cmp r0, #0 + 1f27490: 1a000004 bne 1f274a8 + 1f27494: e1a01007 mov r1, r7 + 1f27498: e3a020ff mov r2, #255 ; 0xff + 1f2749c: e2840e13 add r0, r4, #304 ; 0x130 + 1f274a0: eb006357 bl 1f40204 + 1f274a4: eafffd7a b 1f26a94 + 1f274a8: e30f1d9c movw r1, #64924 ; 0xfd9c + 1f274ac: e34011f5 movt r1, #501 ; 0x1f5 + 1f274b0: e1a00005 mov r0, r5 + 1f274b4: eb0061b8 bl 1f3fb9c + 1f274b8: e3500000 cmp r0, #0 + 1f274bc: 1a000004 bne 1f274d4 + 1f274c0: e1a01007 mov r1, r7 + 1f274c4: e3a020ff mov r2, #255 ; 0xff + 1f274c8: e2840e23 add r0, r4, #560 ; 0x230 + 1f274cc: eb00634c bl 1f40204 + 1f274d0: eafffd6f b 1f26a94 + 1f274d4: e30f1da4 movw r1, #64932 ; 0xfda4 + 1f274d8: e34011f5 movt r1, #501 ; 0x1f5 + 1f274dc: e1a00005 mov r0, r5 + 1f274e0: eb0061ad bl 1f3fb9c + 1f274e4: e3500000 cmp r0, #0 + 1f274e8: 1a000004 bne 1f27500 + 1f274ec: e1a01007 mov r1, r7 + 1f274f0: e3a020ff mov r2, #255 ; 0xff + 1f274f4: e2840e33 add r0, r4, #816 ; 0x330 + 1f274f8: eb006341 bl 1f40204 + 1f274fc: eafffd64 b 1f26a94 + 1f27500: e30f1dac movw r1, #64940 ; 0xfdac + 1f27504: e34011f5 movt r1, #501 ; 0x1f5 + 1f27508: e1a00005 mov r0, r5 + 1f2750c: eb0061a2 bl 1f3fb9c + 1f27510: e3500000 cmp r0, #0 + 1f27514: 1a000004 bne 1f2752c + 1f27518: e1a01007 mov r1, r7 + 1f2751c: e3a020ff mov r2, #255 ; 0xff + 1f27520: e2840e43 add r0, r4, #1072 ; 0x430 + 1f27524: eb006336 bl 1f40204 + 1f27528: eafffd59 b 1f26a94 + 1f2752c: e30f1db4 movw r1, #64948 ; 0xfdb4 + 1f27530: e34011f5 movt r1, #501 ; 0x1f5 + 1f27534: e1a00005 mov r0, r5 + 1f27538: eb006197 bl 1f3fb9c + 1f2753c: e3500000 cmp r0, #0 + 1f27540: 1a000004 bne 1f27558 + 1f27544: e1a01007 mov r1, r7 + 1f27548: e3a020ff mov r2, #255 ; 0xff + 1f2754c: e2840e53 add r0, r4, #1328 ; 0x530 + 1f27550: eb00632b bl 1f40204 + 1f27554: eafffd4e b 1f26a94 + 1f27558: e30f1dbc movw r1, #64956 ; 0xfdbc + 1f2755c: e34011f5 movt r1, #501 ; 0x1f5 + 1f27560: e1a00005 mov r0, r5 + 1f27564: eb00618c bl 1f3fb9c + 1f27568: e3500000 cmp r0, #0 + 1f2756c: 1a000004 bne 1f27584 + 1f27570: e1a01007 mov r1, r7 + 1f27574: e3a020ff mov r2, #255 ; 0xff + 1f27578: e2840e63 add r0, r4, #1584 ; 0x630 + 1f2757c: eb006320 bl 1f40204 + 1f27580: eafffd43 b 1f26a94 + 1f27584: e1a00005 mov r0, r5 + 1f27588: e30f1dc4 movw r1, #64964 ; 0xfdc4 + 1f2758c: e34011f5 movt r1, #501 ; 0x1f5 + 1f27590: eb006181 bl 1f3fb9c + 1f27594: e3500000 cmp r0, #0 + 1f27598: 1afffd3d bne 1f26a94 + 1f2759c: e1a01007 mov r1, r7 + 1f275a0: e3a020ff mov r2, #255 ; 0xff + 1f275a4: e2840e73 add r0, r4, #1840 ; 0x730 + 1f275a8: eb006315 bl 1f40204 + 1f275ac: eafffd38 b 1f26a94 + +01f275b0 : + 1f275b0: e3500000 cmp r0, #0 + 1f275b4: 0a000002 beq 1f275c4 + 1f275b8: e1d030d0 ldrsb r3, [r0] + 1f275bc: e3530000 cmp r3, #0 + 1f275c0: 1a000001 bne 1f275cc + 1f275c4: e3e00000 mvn r0, #0 + 1f275c8: e12fff1e bx lr + 1f275cc: e353000d cmp r3, #13 + 1f275d0: e280c001 add ip, r0, #1 + 1f275d4: 0a000018 beq 1f2763c + 1f275d8: e2430030 sub r0, r3, #48 ; 0x30 + 1f275dc: e6ef3070 uxtb r3, r0 + 1f275e0: e3530009 cmp r3, #9 + 1f275e4: 9a00000a bls 1f27614 + 1f275e8: eafffff5 b 1f275c4 + 1f275ec: e3520009 cmp r2, #9 + 1f275f0: 8afffff3 bhi 1f275c4 + 1f275f4: e3730001 cmn r3, #1 + 1f275f8: 13a02000 movne r2, #0 + 1f275fc: 03a02001 moveq r2, #1 + 1f27600: e1530000 cmp r3, r0 + 1f27604: 33822001 orrcc r2, r2, #1 + 1f27608: e1a00003 mov r0, r3 + 1f2760c: e3520000 cmp r2, #0 + 1f27610: 1affffeb bne 1f275c4 + 1f27614: e0dc10d1 ldrsb r1, [ip], #1 + 1f27618: e1a03180 lsl r3, r0, #3 + 1f2761c: e0833080 add r3, r3, r0, lsl #1 + 1f27620: e2412030 sub r2, r1, #48 ; 0x30 + 1f27624: e351000d cmp r1, #13 + 1f27628: 13510000 cmpne r1, #0 + 1f2762c: e0823003 add r3, r2, r3 + 1f27630: e6ef2072 uxtb r2, r2 + 1f27634: 1affffec bne 1f275ec + 1f27638: e12fff1e bx lr + 1f2763c: e3a00000 mov r0, #0 + 1f27640: e12fff1e bx lr + +01f27644 : + 1f27644: e2411001 sub r1, r1, #1 + 1f27648: e3510006 cmp r1, #6 + 1f2764c: 979ff101 ldrls pc, [pc, r1, lsl #2] + 1f27650: ea000014 b 1f276a8 + 1f27654: 01f27678 .word 0x01f27678 + 1f27658: 01f27680 .word 0x01f27680 + 1f2765c: 01f27688 .word 0x01f27688 + 1f27660: 01f27690 .word 0x01f27690 + 1f27664: 01f27698 .word 0x01f27698 + 1f27668: 01f276a0 .word 0x01f276a0 + 1f2766c: 01f27670 .word 0x01f27670 + 1f27670: e2800e73 add r0, r0, #1840 ; 0x730 + 1f27674: e12fff1e bx lr + 1f27678: e2800e13 add r0, r0, #304 ; 0x130 + 1f2767c: e12fff1e bx lr + 1f27680: e2800e23 add r0, r0, #560 ; 0x230 + 1f27684: e12fff1e bx lr + 1f27688: e2800e33 add r0, r0, #816 ; 0x330 + 1f2768c: e12fff1e bx lr + 1f27690: e2800e43 add r0, r0, #1072 ; 0x430 + 1f27694: e12fff1e bx lr + 1f27698: e2800e53 add r0, r0, #1328 ; 0x530 + 1f2769c: e12fff1e bx lr + 1f276a0: e2800e63 add r0, r0, #1584 ; 0x630 + 1f276a4: e12fff1e bx lr + 1f276a8: e2800030 add r0, r0, #48 ; 0x30 + 1f276ac: e12fff1e bx lr + +01f276b0 : + 1f276b0: e590301c ldr r3, [r0, #28] + 1f276b4: e7832001 str r2, [r3, r1] + 1f276b8: e12fff1e bx lr + +01f276bc : + 1f276bc: e92d4030 push {r4, r5, lr} + 1f276c0: e590401c ldr r4, [r0, #28] + 1f276c4: e7e75852 ubfx r5, r2, #16, #8 + 1f276c8: e281c001 add ip, r1, #1 + 1f276cc: e2813002 add r3, r1, #2 + 1f276d0: e7e7e452 ubfx lr, r2, #8, #8 + 1f276d4: e6ef2072 uxtb r2, r2 + 1f276d8: e7c45001 strb r5, [r4, r1] + 1f276dc: e590101c ldr r1, [r0, #28] + 1f276e0: e7c1e00c strb lr, [r1, ip] + 1f276e4: e590101c ldr r1, [r0, #28] + 1f276e8: e7c12003 strb r2, [r1, r3] + 1f276ec: e8bd8030 pop {r4, r5, pc} + +01f276f0 : + 1f276f0: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f276f4: e590c01c ldr ip, [r0, #28] + 1f276f8: e1a0e1c2 asr lr, r2, #3 + 1f276fc: e7e409d2 ubfx r0, r2, #19, #5 + 1f27700: e1a022a2 lsr r2, r2, #5 + 1f27704: e2023e7e and r3, r2, #2016 ; 0x7e0 + 1f27708: e180258e orr r2, r0, lr, lsl #11 + 1f2770c: e1822003 orr r2, r2, r3 + 1f27710: e18c20b1 strh r2, [ip, r1] + 1f27714: e49df004 pop {pc} ; (ldr pc, [sp], #4) + +01f27718 : + 1f27718: e590301c ldr r3, [r0, #28] + 1f2771c: e6ef2072 uxtb r2, r2 + 1f27720: e7c32001 strb r2, [r3, r1] + 1f27724: e12fff1e bx lr + +01f27728 : + 1f27728: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f2772c: e1a0a0c2 asr sl, r2, #1 + 1f27730: e35a0000 cmp sl, #0 + 1f27734: e24ddb02 sub sp, sp, #2048 ; 0x800 + 1f27738: e24dd004 sub sp, sp, #4 + 1f2773c: e0070193 mul r7, r3, r1 + 1f27740: da00002c ble 1f277f8 + 1f27744: e2428001 sub r8, r2, #1 + 1f27748: e1a09000 mov r9, r0 + 1f2774c: e3a0b000 mov fp, #0 + 1f27750: e0280897 mla r8, r7, r8, r0 + 1f27754: e3570000 cmp r7, #0 + 1f27758: e1a05009 mov r5, r9 + 1f2775c: e1a06008 mov r6, r8 + 1f27760: 0a00001f beq 1f277e4 + 1f27764: e1a04007 mov r4, r7 + 1f27768: e3a02b02 mov r2, #2048 ; 0x800 + 1f2776c: e1a01005 mov r1, r5 + 1f27770: e1540002 cmp r4, r2 + 1f27774: e1a0000d mov r0, sp + 1f27778: 3a00000d bcc 1f277b4 + 1f2777c: eb005d9f bl 1f3ee00 + 1f27780: e1a01006 mov r1, r6 + 1f27784: e3a02b02 mov r2, #2048 ; 0x800 + 1f27788: e1a00005 mov r0, r5 + 1f2778c: eb005d9b bl 1f3ee00 + 1f27790: e1a00006 mov r0, r6 + 1f27794: e3a02b02 mov r2, #2048 ; 0x800 + 1f27798: e1a0100d mov r1, sp + 1f2779c: eb005d97 bl 1f3ee00 + 1f277a0: e2544b02 subs r4, r4, #2048 ; 0x800 + 1f277a4: e2855b02 add r5, r5, #2048 ; 0x800 + 1f277a8: e2866b02 add r6, r6, #2048 ; 0x800 + 1f277ac: 1affffed bne 1f27768 + 1f277b0: ea00000b b 1f277e4 + 1f277b4: e1a02004 mov r2, r4 + 1f277b8: e1a01005 mov r1, r5 + 1f277bc: e1a0000d mov r0, sp + 1f277c0: eb005d8e bl 1f3ee00 + 1f277c4: e1a02004 mov r2, r4 + 1f277c8: e1a01006 mov r1, r6 + 1f277cc: e1a00005 mov r0, r5 + 1f277d0: eb005d8a bl 1f3ee00 + 1f277d4: e1a02004 mov r2, r4 + 1f277d8: e1a0100d mov r1, sp + 1f277dc: e1a00006 mov r0, r6 + 1f277e0: eb005d86 bl 1f3ee00 + 1f277e4: e28bb001 add fp, fp, #1 + 1f277e8: e0899007 add r9, r9, r7 + 1f277ec: e15b000a cmp fp, sl + 1f277f0: e0678008 rsb r8, r7, r8 + 1f277f4: 1affffd6 bne 1f27754 + 1f277f8: e28ddb02 add sp, sp, #2048 ; 0x800 + 1f277fc: e28dd004 add sp, sp, #4 + 1f27800: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + +01f27804 : + 1f27804: e59030a8 ldr r3, [r0, #168] ; 0xa8 + 1f27808: e59020ac ldr r2, [r0, #172] ; 0xac + 1f2780c: e1530002 cmp r3, r2 + 1f27810: 3a000018 bcc 1f27878 + 1f27814: e5903020 ldr r3, [r0, #32] + 1f27818: e3530000 cmp r3, #0 + 1f2781c: 1a000001 bne 1f27828 + 1f27820: e1a00003 mov r0, r3 + 1f27824: e12fff1e bx lr + 1f27828: e92d4070 push {r4, r5, r6, lr} + 1f2782c: e2805028 add r5, r0, #40 ; 0x28 + 1f27830: e1a04000 mov r4, r0 + 1f27834: e1a01005 mov r1, r5 + 1f27838: e5903010 ldr r3, [r0, #16] + 1f2783c: e5902024 ldr r2, [r0, #36] ; 0x24 + 1f27840: e590001c ldr r0, [r0, #28] + 1f27844: e12fff33 blx r3 + 1f27848: e2503000 subs r3, r0, #0 + 1f2784c: 02845029 addeq r5, r4, #41 ; 0x29 + 1f27850: 10855003 addne r5, r5, r3 + 1f27854: 05843020 streq r3, [r4, #32] + 1f27858: 01a00003 moveq r0, r3 + 1f2785c: 05c43028 strbeq r3, [r4, #40] ; 0x28 + 1f27860: 12843029 addne r3, r4, #41 ; 0x29 + 1f27864: 01a03005 moveq r3, r5 + 1f27868: 15d40028 ldrbne r0, [r4, #40] ; 0x28 + 1f2786c: e58450ac str r5, [r4, #172] ; 0xac + 1f27870: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f27874: e8bd8070 pop {r4, r5, r6, pc} + 1f27878: e2832001 add r2, r3, #1 + 1f2787c: e58020a8 str r2, [r0, #168] ; 0xa8 + 1f27880: e5d30000 ldrb r0, [r3] + 1f27884: e12fff1e bx lr + +01f27888 : + 1f27888: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f2788c: e3510000 cmp r1, #0 + 1f27890: e1a06002 mov r6, r2 + 1f27894: e24dd00c sub sp, sp, #12 + 1f27898: e1a05000 mov r5, r0 + 1f2789c: e5dd2030 ldrb r2, [sp, #48] ; 0x30 + 1f278a0: 0a000017 beq 1f27904 + 1f278a4: e2421040 sub r1, r2, #64 ; 0x40 + 1f278a8: e2820060 add r0, r2, #96 ; 0x60 + 1f278ac: e6ef1071 uxtb r1, r1 + 1f278b0: e6ef0070 uxtb r0, r0 + 1f278b4: e351001f cmp r1, #31 + 1f278b8: 8350001f cmphi r0, #31 + 1f278bc: 9a0000e8 bls 1f27c64 + 1f278c0: e282c040 add ip, r2, #64 ; 0x40 + 1f278c4: e6efc07c uxtb ip, ip + 1f278c8: e35c001f cmp ip, #31 + 1f278cc: 9a0000e9 bls 1f27c78 + 1f278d0: e352001f cmp r2, #31 + 1f278d4: 9a0000e7 bls 1f27c78 + 1f278d8: e242e060 sub lr, r2, #96 ; 0x60 + 1f278dc: e2820070 add r0, r2, #112 ; 0x70 + 1f278e0: e30f1e58 movw r1, #65112 ; 0xfe58 + 1f278e4: e34011f5 movt r1, #501 ; 0x1f5 + 1f278e8: e6ef0070 uxtb r0, r0 + 1f278ec: e6efe07e uxtb lr, lr + 1f278f0: e350000f cmp r0, #15 + 1f278f4: 835e001f cmphi lr, #31 + 1f278f8: e3a00008 mov r0, #8 + 1f278fc: 91a0200c movls r2, ip + 1f27900: ea000002 b 1f27910 + 1f27904: e3011ed8 movw r1, #7896 ; 0x1ed8 + 1f27908: e34011f6 movt r1, #502 ; 0x1f6 + 1f2790c: e3a00010 mov r0, #16 + 1f27910: e0291290 mla r9, r0, r2, r1 + 1f27914: e1a07003 mov r7, r3 + 1f27918: e0802003 add r2, r0, r3 + 1f2791c: e286b001 add fp, r6, #1 + 1f27920: e2863003 add r3, r6, #3 + 1f27924: e58d2004 str r2, [sp, #4] + 1f27928: e286a002 add sl, r6, #2 + 1f2792c: e58d3000 str r3, [sp] + 1f27930: ea000032 b 1f27a00 + 1f27934: e1a04084 lsl r4, r4, #1 + 1f27938: e6ef4074 uxtb r4, r4 + 1f2793c: e153000b cmp r3, fp + 1f27940: 3a000003 bcc 1f27954 + 1f27944: e3140080 tst r4, #128 ; 0x80 + 1f27948: 1a000060 bne 1f27ad0 + 1f2794c: e1a04084 lsl r4, r4, #1 + 1f27950: e6ef4074 uxtb r4, r4 + 1f27954: e153000a cmp r3, sl + 1f27958: 3a000003 bcc 1f2796c + 1f2795c: e3140080 tst r4, #128 ; 0x80 + 1f27960: 1a000072 bne 1f27b30 + 1f27964: e1a04084 lsl r4, r4, #1 + 1f27968: e6ef4074 uxtb r4, r4 + 1f2796c: e59d2000 ldr r2, [sp] + 1f27970: e1530002 cmp r3, r2 + 1f27974: 3a000003 bcc 1f27988 + 1f27978: e3140080 tst r4, #128 ; 0x80 + 1f2797c: 1a000046 bne 1f27a9c + 1f27980: e1a04084 lsl r4, r4, #1 + 1f27984: e6ef4074 uxtb r4, r4 + 1f27988: e2861004 add r1, r6, #4 + 1f2798c: e1530001 cmp r3, r1 + 1f27990: 3a000003 bcc 1f279a4 + 1f27994: e3140080 tst r4, #128 ; 0x80 + 1f27998: 1a000070 bne 1f27b60 + 1f2799c: e1a04084 lsl r4, r4, #1 + 1f279a0: e6ef4074 uxtb r4, r4 + 1f279a4: e2861005 add r1, r6, #5 + 1f279a8: e1530001 cmp r3, r1 + 1f279ac: 3a000003 bcc 1f279c0 + 1f279b0: e3140080 tst r4, #128 ; 0x80 + 1f279b4: 1a000051 bne 1f27b00 + 1f279b8: e1a04084 lsl r4, r4, #1 + 1f279bc: e6ef4074 uxtb r4, r4 + 1f279c0: e2861006 add r1, r6, #6 + 1f279c4: e1530001 cmp r3, r1 + 1f279c8: 3a000003 bcc 1f279dc + 1f279cc: e3140080 tst r4, #128 ; 0x80 + 1f279d0: 1a00006e bne 1f27b90 + 1f279d4: e1a04084 lsl r4, r4, #1 + 1f279d8: e6ef4074 uxtb r4, r4 + 1f279dc: e2861007 add r1, r6, #7 + 1f279e0: e1530001 cmp r3, r1 + 1f279e4: 3a000001 bcc 1f279f0 + 1f279e8: e3140080 tst r4, #128 ; 0x80 + 1f279ec: 1a00001a bne 1f27a5c + 1f279f0: e59d3004 ldr r3, [sp, #4] + 1f279f4: e2877001 add r7, r7, #1 + 1f279f8: e1530007 cmp r3, r7 + 1f279fc: 0a000024 beq 1f27a94 + 1f27a00: e5953010 ldr r3, [r5, #16] + 1f27a04: e1530007 cmp r3, r7 + 1f27a08: 3a000021 bcc 1f27a94 + 1f27a0c: e595300c ldr r3, [r5, #12] + 1f27a10: e5958018 ldr r8, [r5, #24] + 1f27a14: e1560003 cmp r6, r3 + 1f27a18: e4d94001 ldrb r4, [r9], #1 + 1f27a1c: e0080798 mul r8, r8, r7 + 1f27a20: 8affffc5 bhi 1f2793c + 1f27a24: e3140080 tst r4, #128 ; 0x80 + 1f27a28: 0affffc1 beq 1f27934 + 1f27a2c: e5950004 ldr r0, [r5, #4] + 1f27a30: e3100001 tst r0, #1 + 1f27a34: 1a000080 bne 1f27c3c + 1f27a38: e5953000 ldr r3, [r5] + 1f27a3c: e08500c0 add r0, r5, r0, asr #1 + 1f27a40: e5951014 ldr r1, [r5, #20] + 1f27a44: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f27a48: e1a011a1 lsr r1, r1, #3 + 1f27a4c: e0218196 mla r1, r6, r1, r8 + 1f27a50: e12fff33 blx r3 + 1f27a54: e595300c ldr r3, [r5, #12] + 1f27a58: eaffffb5 b 1f27934 + 1f27a5c: e5950004 ldr r0, [r5, #4] + 1f27a60: e3100001 tst r0, #1 + 1f27a64: 1a000055 bne 1f27bc0 + 1f27a68: e5953000 ldr r3, [r5] + 1f27a6c: e08500c0 add r0, r5, r0, asr #1 + 1f27a70: e595c014 ldr ip, [r5, #20] + 1f27a74: e2877001 add r7, r7, #1 + 1f27a78: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f27a7c: e1a0c1ac lsr ip, ip, #3 + 1f27a80: e0218c91 mla r1, r1, ip, r8 + 1f27a84: e12fff33 blx r3 + 1f27a88: e59d3004 ldr r3, [sp, #4] + 1f27a8c: e1530007 cmp r3, r7 + 1f27a90: 1affffda bne 1f27a00 + 1f27a94: e28dd00c add sp, sp, #12 + 1f27a98: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f27a9c: e5950004 ldr r0, [r5, #4] + 1f27aa0: e3100001 tst r0, #1 + 1f27aa4: 1a000059 bne 1f27c10 + 1f27aa8: e5953000 ldr r3, [r5] + 1f27aac: e08500c0 add r0, r5, r0, asr #1 + 1f27ab0: e1a0c002 mov ip, r2 + 1f27ab4: e5951014 ldr r1, [r5, #20] + 1f27ab8: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f27abc: e1a011a1 lsr r1, r1, #3 + 1f27ac0: e021819c mla r1, ip, r1, r8 + 1f27ac4: e12fff33 blx r3 + 1f27ac8: e595300c ldr r3, [r5, #12] + 1f27acc: eaffffab b 1f27980 + 1f27ad0: e5950004 ldr r0, [r5, #4] + 1f27ad4: e3100001 tst r0, #1 + 1f27ad8: 1a000042 bne 1f27be8 + 1f27adc: e5953000 ldr r3, [r5] + 1f27ae0: e08500c0 add r0, r5, r0, asr #1 + 1f27ae4: e5951014 ldr r1, [r5, #20] + 1f27ae8: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f27aec: e1a011a1 lsr r1, r1, #3 + 1f27af0: e021819b mla r1, fp, r1, r8 + 1f27af4: e12fff33 blx r3 + 1f27af8: e595300c ldr r3, [r5, #12] + 1f27afc: eaffff92 b 1f2794c + 1f27b00: e5950004 ldr r0, [r5, #4] + 1f27b04: e3100001 tst r0, #1 + 1f27b08: 1a000046 bne 1f27c28 + 1f27b0c: e5953000 ldr r3, [r5] + 1f27b10: e08500c0 add r0, r5, r0, asr #1 + 1f27b14: e595c014 ldr ip, [r5, #20] + 1f27b18: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f27b1c: e1a0c1ac lsr ip, ip, #3 + 1f27b20: e0218c91 mla r1, r1, ip, r8 + 1f27b24: e12fff33 blx r3 + 1f27b28: e595300c ldr r3, [r5, #12] + 1f27b2c: eaffffa1 b 1f279b8 + 1f27b30: e5950004 ldr r0, [r5, #4] + 1f27b34: e3100001 tst r0, #1 + 1f27b38: 1a000025 bne 1f27bd4 + 1f27b3c: e5953000 ldr r3, [r5] + 1f27b40: e08500c0 add r0, r5, r0, asr #1 + 1f27b44: e5951014 ldr r1, [r5, #20] + 1f27b48: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f27b4c: e1a011a1 lsr r1, r1, #3 + 1f27b50: e021819a mla r1, sl, r1, r8 + 1f27b54: e12fff33 blx r3 + 1f27b58: e595300c ldr r3, [r5, #12] + 1f27b5c: eaffff80 b 1f27964 + 1f27b60: e5950004 ldr r0, [r5, #4] + 1f27b64: e3100001 tst r0, #1 + 1f27b68: 1a000023 bne 1f27bfc + 1f27b6c: e5953000 ldr r3, [r5] + 1f27b70: e08500c0 add r0, r5, r0, asr #1 + 1f27b74: e595c014 ldr ip, [r5, #20] + 1f27b78: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f27b7c: e1a0c1ac lsr ip, ip, #3 + 1f27b80: e0218c91 mla r1, r1, ip, r8 + 1f27b84: e12fff33 blx r3 + 1f27b88: e595300c ldr r3, [r5, #12] + 1f27b8c: eaffff82 b 1f2799c + 1f27b90: e5950004 ldr r0, [r5, #4] + 1f27b94: e3100001 tst r0, #1 + 1f27b98: 1a00002c bne 1f27c50 + 1f27b9c: e5953000 ldr r3, [r5] + 1f27ba0: e08500c0 add r0, r5, r0, asr #1 + 1f27ba4: e595c014 ldr ip, [r5, #20] + 1f27ba8: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f27bac: e1a0c1ac lsr ip, ip, #3 + 1f27bb0: e0218c91 mla r1, r1, ip, r8 + 1f27bb4: e12fff33 blx r3 + 1f27bb8: e595300c ldr r3, [r5, #12] + 1f27bbc: eaffff84 b 1f279d4 + 1f27bc0: e79520c0 ldr r2, [r5, r0, asr #1] + 1f27bc4: e08500c0 add r0, r5, r0, asr #1 + 1f27bc8: e5953000 ldr r3, [r5] + 1f27bcc: e7923003 ldr r3, [r2, r3] + 1f27bd0: eaffffa6 b 1f27a70 + 1f27bd4: e79520c0 ldr r2, [r5, r0, asr #1] + 1f27bd8: e08500c0 add r0, r5, r0, asr #1 + 1f27bdc: e5953000 ldr r3, [r5] + 1f27be0: e7923003 ldr r3, [r2, r3] + 1f27be4: eaffffd6 b 1f27b44 + 1f27be8: e79520c0 ldr r2, [r5, r0, asr #1] + 1f27bec: e08500c0 add r0, r5, r0, asr #1 + 1f27bf0: e5953000 ldr r3, [r5] + 1f27bf4: e7923003 ldr r3, [r2, r3] + 1f27bf8: eaffffb9 b 1f27ae4 + 1f27bfc: e79520c0 ldr r2, [r5, r0, asr #1] + 1f27c00: e08500c0 add r0, r5, r0, asr #1 + 1f27c04: e5953000 ldr r3, [r5] + 1f27c08: e7923003 ldr r3, [r2, r3] + 1f27c0c: eaffffd8 b 1f27b74 + 1f27c10: e79520c0 ldr r2, [r5, r0, asr #1] + 1f27c14: e08500c0 add r0, r5, r0, asr #1 + 1f27c18: e5953000 ldr r3, [r5] + 1f27c1c: e59dc000 ldr ip, [sp] + 1f27c20: e7923003 ldr r3, [r2, r3] + 1f27c24: eaffffa2 b 1f27ab4 + 1f27c28: e79520c0 ldr r2, [r5, r0, asr #1] + 1f27c2c: e08500c0 add r0, r5, r0, asr #1 + 1f27c30: e5953000 ldr r3, [r5] + 1f27c34: e7923003 ldr r3, [r2, r3] + 1f27c38: eaffffb5 b 1f27b14 + 1f27c3c: e79520c0 ldr r2, [r5, r0, asr #1] + 1f27c40: e08500c0 add r0, r5, r0, asr #1 + 1f27c44: e5953000 ldr r3, [r5] + 1f27c48: e7923003 ldr r3, [r2, r3] + 1f27c4c: eaffff7b b 1f27a40 + 1f27c50: e79520c0 ldr r2, [r5, r0, asr #1] + 1f27c54: e08500c0 add r0, r5, r0, asr #1 + 1f27c58: e5953000 ldr r3, [r5] + 1f27c5c: e7923003 ldr r3, [r2, r3] + 1f27c60: eaffffcf b 1f27ba4 + 1f27c64: e1a02001 mov r2, r1 + 1f27c68: e3a00008 mov r0, #8 + 1f27c6c: e30f1e58 movw r1, #65112 ; 0xfe58 + 1f27c70: e34011f5 movt r1, #501 ; 0x1f5 + 1f27c74: eaffff25 b 1f27910 + 1f27c78: e2429080 sub r9, r2, #128 ; 0x80 + 1f27c7c: e30f1e58 movw r1, #65112 ; 0xfe58 + 1f27c80: e34011f5 movt r1, #501 ; 0x1f5 + 1f27c84: e6ef2079 uxtb r2, r9 + 1f27c88: e3a00008 mov r0, #8 + 1f27c8c: eaffff1f b 1f27910 + +01f27c90 : + 1f27c90: e3520000 cmp r2, #0 + 1f27c94: d12fff1e bxle lr + 1f27c98: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f27c9c: e1a08003 mov r8, r3 + 1f27ca0: e1a04000 mov r4, r0 + 1f27ca4: e1a07002 mov r7, r2 + 1f27ca8: e2815003 add r5, r1, #3 + 1f27cac: e3a06000 mov r6, #0 + 1f27cb0: e2809028 add r9, r0, #40 ; 0x28 + 1f27cb4: ea000049 b 1f27de0 + 1f27cb8: e5943020 ldr r3, [r4, #32] + 1f27cbc: e3530000 cmp r3, #0 + 1f27cc0: 0a00000f beq 1f27d04 + 1f27cc4: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f27cc8: e1a01009 mov r1, r9 + 1f27ccc: e5943010 ldr r3, [r4, #16] + 1f27cd0: e594001c ldr r0, [r4, #28] + 1f27cd4: e12fff33 blx r3 + 1f27cd8: e3500000 cmp r0, #0 + 1f27cdc: 02842029 addeq r2, r4, #41 ; 0x29 + 1f27ce0: 10892000 addne r2, r9, r0 + 1f27ce4: 15d43028 ldrbne r3, [r4, #40] ; 0x28 + 1f27ce8: 01a01002 moveq r1, r2 + 1f27cec: 12841029 addne r1, r4, #41 ; 0x29 + 1f27cf0: 05840020 streq r0, [r4, #32] + 1f27cf4: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f27cf8: 01a03000 moveq r3, r0 + 1f27cfc: e58420ac str r2, [r4, #172] ; 0xac + 1f27d00: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f27d04: e5453001 strb r3, [r5, #-1] + 1f27d08: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f27d0c: e59420ac ldr r2, [r4, #172] ; 0xac + 1f27d10: e1530002 cmp r3, r2 + 1f27d14: 3a000039 bcc 1f27e00 + 1f27d18: e5943020 ldr r3, [r4, #32] + 1f27d1c: e3530000 cmp r3, #0 + 1f27d20: 0a00000f beq 1f27d64 + 1f27d24: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f27d28: e1a01009 mov r1, r9 + 1f27d2c: e5943010 ldr r3, [r4, #16] + 1f27d30: e594001c ldr r0, [r4, #28] + 1f27d34: e12fff33 blx r3 + 1f27d38: e3500000 cmp r0, #0 + 1f27d3c: 02842029 addeq r2, r4, #41 ; 0x29 + 1f27d40: 10892000 addne r2, r9, r0 + 1f27d44: 15d43028 ldrbne r3, [r4, #40] ; 0x28 + 1f27d48: 01a01002 moveq r1, r2 + 1f27d4c: 12841029 addne r1, r4, #41 ; 0x29 + 1f27d50: 05840020 streq r0, [r4, #32] + 1f27d54: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f27d58: 01a03000 moveq r3, r0 + 1f27d5c: e58420ac str r2, [r4, #172] ; 0xac + 1f27d60: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f27d64: e5453002 strb r3, [r5, #-2] + 1f27d68: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f27d6c: e59420ac ldr r2, [r4, #172] ; 0xac + 1f27d70: e1530002 cmp r3, r2 + 1f27d74: 3a000025 bcc 1f27e10 + 1f27d78: e5941020 ldr r1, [r4, #32] + 1f27d7c: e3510000 cmp r1, #0 + 1f27d80: 0a00000f beq 1f27dc4 + 1f27d84: e5943010 ldr r3, [r4, #16] + 1f27d88: e1a01009 mov r1, r9 + 1f27d8c: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f27d90: e594001c ldr r0, [r4, #28] + 1f27d94: e12fff33 blx r3 + 1f27d98: e3500000 cmp r0, #0 + 1f27d9c: 02843029 addeq r3, r4, #41 ; 0x29 + 1f27da0: 10893000 addne r3, r9, r0 + 1f27da4: 15d41028 ldrbne r1, [r4, #40] ; 0x28 + 1f27da8: 01a02003 moveq r2, r3 + 1f27dac: 12842029 addne r2, r4, #41 ; 0x29 + 1f27db0: 05840020 streq r0, [r4, #32] + 1f27db4: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f27db8: 01a01000 moveq r1, r0 + 1f27dbc: e58430ac str r3, [r4, #172] ; 0xac + 1f27dc0: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f27dc4: e0583006 subs r3, r8, r6 + 1f27dc8: e2866001 add r6, r6, #1 + 1f27dcc: 13e03000 mvnne r3, #0 + 1f27dd0: e1570006 cmp r7, r6 + 1f27dd4: e5451003 strb r1, [r5, #-3] + 1f27dd8: e4c53004 strb r3, [r5], #4 + 1f27ddc: 0a00000f beq 1f27e20 + 1f27de0: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f27de4: e59420ac ldr r2, [r4, #172] ; 0xac + 1f27de8: e1530002 cmp r3, r2 + 1f27dec: 2affffb1 bcs 1f27cb8 + 1f27df0: e2832001 add r2, r3, #1 + 1f27df4: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f27df8: e5d33000 ldrb r3, [r3] + 1f27dfc: eaffffc0 b 1f27d04 + 1f27e00: e2832001 add r2, r3, #1 + 1f27e04: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f27e08: e5d33000 ldrb r3, [r3] + 1f27e0c: eaffffd4 b 1f27d64 + 1f27e10: e2832001 add r2, r3, #1 + 1f27e14: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f27e18: e5d31000 ldrb r1, [r3] + 1f27e1c: eaffffe8 b 1f27dc4 + 1f27e20: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + +01f27e24 : + 1f27e24: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f27e28: e1a05001 mov r5, r1 + 1f27e2c: e1a06002 mov r6, r2 + 1f27e30: e24dd0ac sub sp, sp, #172 ; 0xac + 1f27e34: e1a04000 mov r4, r0 + 1f27e38: e3a01000 mov r1, #0 + 1f27e3c: e3a02044 mov r2, #68 ; 0x44 + 1f27e40: e28d0064 add r0, sp, #100 ; 0x64 + 1f27e44: eb005c74 bl 1f3f01c + 1f27e48: e3a01000 mov r1, #0 + 1f27e4c: e1a00004 mov r0, r4 + 1f27e50: e3a02b01 mov r2, #1024 ; 0x400 + 1f27e54: eb005c70 bl 1f3f01c + 1f27e58: e3560000 cmp r6, #0 + 1f27e5c: c1a01005 movgt r1, r5 + 1f27e60: c0850006 addgt r0, r5, r6 + 1f27e64: da000007 ble 1f27e88 + 1f27e68: e4d13001 ldrb r3, [r1], #1 + 1f27e6c: e28d20a8 add r2, sp, #168 ; 0xa8 + 1f27e70: e1510000 cmp r1, r0 + 1f27e74: e0823103 add r3, r2, r3, lsl #2 + 1f27e78: e5132044 ldr r2, [r3, #-68] ; 0xffffffbc + 1f27e7c: e2822001 add r2, r2, #1 + 1f27e80: e5032044 str r2, [r3, #-68] ; 0xffffffbc + 1f27e84: 1afffff7 bne 1f27e68 + 1f27e88: e59d2068 ldr r2, [sp, #104] ; 0x68 + 1f27e8c: e3a03000 mov r3, #0 + 1f27e90: e58d3064 str r3, [sp, #100] ; 0x64 + 1f27e94: e3520002 cmp r2, #2 + 1f27e98: ca00015c bgt 1f28410 + 1f27e9c: e59d306c ldr r3, [sp, #108] ; 0x6c + 1f27ea0: e3530004 cmp r3, #4 + 1f27ea4: ca000159 bgt 1f28410 + 1f27ea8: e59d1070 ldr r1, [sp, #112] ; 0x70 + 1f27eac: e3510008 cmp r1, #8 + 1f27eb0: ca000156 bgt 1f28410 + 1f27eb4: e59d0074 ldr r0, [sp, #116] ; 0x74 + 1f27eb8: e3500010 cmp r0, #16 + 1f27ebc: ca000153 bgt 1f28410 + 1f27ec0: e59dc078 ldr ip, [sp, #120] ; 0x78 + 1f27ec4: e35c0020 cmp ip, #32 + 1f27ec8: ca000150 bgt 1f28410 + 1f27ecc: e59de07c ldr lr, [sp, #124] ; 0x7c + 1f27ed0: e35e0040 cmp lr, #64 ; 0x40 + 1f27ed4: ca00014d bgt 1f28410 + 1f27ed8: e59da080 ldr sl, [sp, #128] ; 0x80 + 1f27edc: e35a0080 cmp sl, #128 ; 0x80 + 1f27ee0: ca00014a bgt 1f28410 + 1f27ee4: e59db084 ldr fp, [sp, #132] ; 0x84 + 1f27ee8: e35b0c01 cmp fp, #256 ; 0x100 + 1f27eec: ca000147 bgt 1f28410 + 1f27ef0: e59d7088 ldr r7, [sp, #136] ; 0x88 + 1f27ef4: e58d7004 str r7, [sp, #4] + 1f27ef8: e3570c02 cmp r7, #512 ; 0x200 + 1f27efc: ca000143 bgt 1f28410 + 1f27f00: e59d708c ldr r7, [sp, #140] ; 0x8c + 1f27f04: e58d7008 str r7, [sp, #8] + 1f27f08: e3570b01 cmp r7, #1024 ; 0x400 + 1f27f0c: ca00013f bgt 1f28410 + 1f27f10: e59d7090 ldr r7, [sp, #144] ; 0x90 + 1f27f14: e58d700c str r7, [sp, #12] + 1f27f18: e3570b02 cmp r7, #2048 ; 0x800 + 1f27f1c: ca00013b bgt 1f28410 + 1f27f20: e59d7094 ldr r7, [sp, #148] ; 0x94 + 1f27f24: e58d7010 str r7, [sp, #16] + 1f27f28: e3570a01 cmp r7, #4096 ; 0x1000 + 1f27f2c: ca000137 bgt 1f28410 + 1f27f30: e59d7098 ldr r7, [sp, #152] ; 0x98 + 1f27f34: e58d7014 str r7, [sp, #20] + 1f27f38: e3570a02 cmp r7, #8192 ; 0x2000 + 1f27f3c: ca000133 bgt 1f28410 + 1f27f40: e59d709c ldr r7, [sp, #156] ; 0x9c + 1f27f44: e58d7018 str r7, [sp, #24] + 1f27f48: e3570901 cmp r7, #16384 ; 0x4000 + 1f27f4c: ca00012f bgt 1f28410 + 1f27f50: e59d70a0 ldr r7, [sp, #160] ; 0xa0 + 1f27f54: e58d701c str r7, [sp, #28] + 1f27f58: e3570902 cmp r7, #32768 ; 0x8000 + 1f27f5c: ca00012b bgt 1f28410 + 1f27f60: e3008402 movw r8, #1026 ; 0x402 + 1f27f64: e3a07000 mov r7, #0 + 1f27f68: e3009468 movw r9, #1128 ; 0x468 + 1f27f6c: e3530000 cmp r3, #0 + 1f27f70: e58d7028 str r7, [sp, #40] ; 0x28 + 1f27f74: e18470b8 strh r7, [r4, r8] + 1f27f78: e3008466 movw r8, #1126 ; 0x466 + 1f27f7c: e18470b8 strh r7, [r4, r8] + 1f27f80: e3008404 movw r8, #1028 ; 0x404 + 1f27f84: e1a07082 lsl r7, r2, #1 + 1f27f88: e18420b9 strh r2, [r4, r9] + 1f27f8c: e58d702c str r7, [sp, #44] ; 0x2c + 1f27f90: e0879003 add r9, r7, r3 + 1f27f94: e18470b8 strh r7, [r4, r8] + 1f27f98: e1a08782 lsl r8, r2, #15 + 1f27f9c: e5848424 str r8, [r4, #1060] ; 0x424 + 1f27fa0: 0a000001 beq 1f27fac + 1f27fa4: e3590004 cmp r9, #4 + 1f27fa8: ca000110 bgt 1f283f0 + 1f27fac: e300846a movw r8, #1130 ; 0x46a + 1f27fb0: e3007406 movw r7, #1030 ; 0x406 + 1f27fb4: e3510000 cmp r1, #0 + 1f27fb8: e0823003 add r3, r2, r3 + 1f27fbc: e1a02089 lsl r2, r9, #1 + 1f27fc0: e1a09709 lsl r9, r9, #14 + 1f27fc4: e18430b8 strh r3, [r4, r8] + 1f27fc8: e0828001 add r8, r2, r1 + 1f27fcc: e18420b7 strh r2, [r4, r7] + 1f27fd0: e58d2030 str r2, [sp, #48] ; 0x30 + 1f27fd4: e5849428 str r9, [r4, #1064] ; 0x428 + 1f27fd8: 0a000001 beq 1f27fe4 + 1f27fdc: e3580008 cmp r8, #8 + 1f27fe0: ca000102 bgt 1f283f0 + 1f27fe4: e300946c movw r9, #1132 ; 0x46c + 1f27fe8: e3007408 movw r7, #1032 ; 0x408 + 1f27fec: e3500000 cmp r0, #0 + 1f27ff0: e1a02088 lsl r2, r8, #1 + 1f27ff4: e0833001 add r3, r3, r1 + 1f27ff8: e1a08688 lsl r8, r8, #13 + 1f27ffc: e18430b9 strh r3, [r4, r9] + 1f28000: e0829000 add r9, r2, r0 + 1f28004: e18420b7 strh r2, [r4, r7] + 1f28008: e58d2034 str r2, [sp, #52] ; 0x34 + 1f2800c: e584842c str r8, [r4, #1068] ; 0x42c + 1f28010: 0a000001 beq 1f2801c + 1f28014: e3590010 cmp r9, #16 + 1f28018: ca0000f4 bgt 1f283f0 + 1f2801c: e300846e movw r8, #1134 ; 0x46e + 1f28020: e300740a movw r7, #1034 ; 0x40a + 1f28024: e35c0000 cmp ip, #0 + 1f28028: e1a02089 lsl r2, r9, #1 + 1f2802c: e0833000 add r3, r3, r0 + 1f28030: e1a09609 lsl r9, r9, #12 + 1f28034: e18430b8 strh r3, [r4, r8] + 1f28038: e082800c add r8, r2, ip + 1f2803c: e18420b7 strh r2, [r4, r7] + 1f28040: e58d2038 str r2, [sp, #56] ; 0x38 + 1f28044: e5849430 str r9, [r4, #1072] ; 0x430 + 1f28048: 0a000001 beq 1f28054 + 1f2804c: e3580020 cmp r8, #32 + 1f28050: ca0000e6 bgt 1f283f0 + 1f28054: e300740c movw r7, #1036 ; 0x40c + 1f28058: e2842e47 add r2, r4, #1136 ; 0x470 + 1f2805c: e35e0000 cmp lr, #0 + 1f28060: e1a01088 lsl r1, r8, #1 + 1f28064: e083300c add r3, r3, ip + 1f28068: e1a08588 lsl r8, r8, #11 + 1f2806c: e18410b7 strh r1, [r4, r7] + 1f28070: e081700e add r7, r1, lr + 1f28074: e5848434 str r8, [r4, #1076] ; 0x434 + 1f28078: e58d103c str r1, [sp, #60] ; 0x3c + 1f2807c: e1c230b0 strh r3, [r2] + 1f28080: 0a000001 beq 1f2808c + 1f28084: e3570040 cmp r7, #64 ; 0x40 + 1f28088: ca0000d8 bgt 1f283f0 + 1f2808c: e3001472 movw r1, #1138 ; 0x472 + 1f28090: e300240e movw r2, #1038 ; 0x40e + 1f28094: e35a0000 cmp sl, #0 + 1f28098: e1a00087 lsl r0, r7, #1 + 1f2809c: e083300e add r3, r3, lr + 1f280a0: e1a07507 lsl r7, r7, #10 + 1f280a4: e18430b1 strh r3, [r4, r1] + 1f280a8: e080100a add r1, r0, sl + 1f280ac: e18400b2 strh r0, [r4, r2] + 1f280b0: e58d0040 str r0, [sp, #64] ; 0x40 + 1f280b4: e5847438 str r7, [r4, #1080] ; 0x438 + 1f280b8: 0a000001 beq 1f280c4 + 1f280bc: e3510080 cmp r1, #128 ; 0x80 + 1f280c0: ca0000ca bgt 1f283f0 + 1f280c4: e2842e41 add r2, r4, #1040 ; 0x410 + 1f280c8: e3000474 movw r0, #1140 ; 0x474 + 1f280cc: e35b0000 cmp fp, #0 + 1f280d0: e1a0c481 lsl ip, r1, #9 + 1f280d4: e1a01081 lsl r1, r1, #1 + 1f280d8: e584c43c str ip, [r4, #1084] ; 0x43c + 1f280dc: e083300a add r3, r3, sl + 1f280e0: e1c210b0 strh r1, [r2] + 1f280e4: e58d1044 str r1, [sp, #68] ; 0x44 + 1f280e8: e081100b add r1, r1, fp + 1f280ec: e18430b0 strh r3, [r4, r0] + 1f280f0: 1a0000bc bne 1f283e8 + 1f280f4: e59de004 ldr lr, [sp, #4] + 1f280f8: e3000476 movw r0, #1142 ; 0x476 + 1f280fc: e3002412 movw r2, #1042 ; 0x412 + 1f28100: e1a0c081 lsl ip, r1, #1 + 1f28104: e35e0000 cmp lr, #0 + 1f28108: e083300b add r3, r3, fp + 1f2810c: e1a01401 lsl r1, r1, #8 + 1f28110: e18430b0 strh r3, [r4, r0] + 1f28114: e58dc048 str ip, [sp, #72] ; 0x48 + 1f28118: e08c000e add r0, ip, lr + 1f2811c: e184c0b2 strh ip, [r4, r2] + 1f28120: e5841440 str r1, [r4, #1088] ; 0x440 + 1f28124: 0a000001 beq 1f28130 + 1f28128: e3500c02 cmp r0, #512 ; 0x200 + 1f2812c: ca0000af bgt 1f283f0 + 1f28130: e59de008 ldr lr, [sp, #8] + 1f28134: e3001478 movw r1, #1144 ; 0x478 + 1f28138: e59dc004 ldr ip, [sp, #4] + 1f2813c: e3002414 movw r2, #1044 ; 0x414 + 1f28140: e35e0000 cmp lr, #0 + 1f28144: e083300c add r3, r3, ip + 1f28148: e1a0c080 lsl ip, r0, #1 + 1f2814c: e18430b1 strh r3, [r4, r1] + 1f28150: e1a00380 lsl r0, r0, #7 + 1f28154: e184c0b2 strh ip, [r4, r2] + 1f28158: e08c100e add r1, ip, lr + 1f2815c: e58dc04c str ip, [sp, #76] ; 0x4c + 1f28160: e5840444 str r0, [r4, #1092] ; 0x444 + 1f28164: 0a000001 beq 1f28170 + 1f28168: e3510b01 cmp r1, #1024 ; 0x400 + 1f2816c: ca00009f bgt 1f283f0 + 1f28170: e59de00c ldr lr, [sp, #12] + 1f28174: e300047a movw r0, #1146 ; 0x47a + 1f28178: e59dc008 ldr ip, [sp, #8] + 1f2817c: e3002416 movw r2, #1046 ; 0x416 + 1f28180: e35e0000 cmp lr, #0 + 1f28184: e083300c add r3, r3, ip + 1f28188: e1a0c081 lsl ip, r1, #1 + 1f2818c: e18430b0 strh r3, [r4, r0] + 1f28190: e1a01301 lsl r1, r1, #6 + 1f28194: e184c0b2 strh ip, [r4, r2] + 1f28198: e08c000e add r0, ip, lr + 1f2819c: e58dc050 str ip, [sp, #80] ; 0x50 + 1f281a0: e5841448 str r1, [r4, #1096] ; 0x448 + 1f281a4: 0a000001 beq 1f281b0 + 1f281a8: e3500b02 cmp r0, #2048 ; 0x800 + 1f281ac: ca00008f bgt 1f283f0 + 1f281b0: e59d7010 ldr r7, [sp, #16] + 1f281b4: e300147c movw r1, #1148 ; 0x47c + 1f281b8: e300c418 movw ip, #1048 ; 0x418 + 1f281bc: e59d200c ldr r2, [sp, #12] + 1f281c0: e3570000 cmp r7, #0 + 1f281c4: e1a0e080 lsl lr, r0, #1 + 1f281c8: e0833002 add r3, r3, r2 + 1f281cc: e58de054 str lr, [sp, #84] ; 0x54 + 1f281d0: e18430b1 strh r3, [r4, r1] + 1f281d4: e1a02280 lsl r2, r0, #5 + 1f281d8: e184e0bc strh lr, [r4, ip] + 1f281dc: e08e1007 add r1, lr, r7 + 1f281e0: e584244c str r2, [r4, #1100] ; 0x44c + 1f281e4: 0a000001 beq 1f281f0 + 1f281e8: e3510a01 cmp r1, #4096 ; 0x1000 + 1f281ec: ca00007f bgt 1f283f0 + 1f281f0: e59d7014 ldr r7, [sp, #20] + 1f281f4: e300e47e movw lr, #1150 ; 0x47e + 1f281f8: e300c41a movw ip, #1050 ; 0x41a + 1f281fc: e59d2010 ldr r2, [sp, #16] + 1f28200: e3570000 cmp r7, #0 + 1f28204: e1a00081 lsl r0, r1, #1 + 1f28208: e0833002 add r3, r3, r2 + 1f2820c: e58d0058 str r0, [sp, #88] ; 0x58 + 1f28210: e1a02201 lsl r2, r1, #4 + 1f28214: e18430be strh r3, [r4, lr] + 1f28218: e0801007 add r1, r0, r7 + 1f2821c: e18400bc strh r0, [r4, ip] + 1f28220: e5842450 str r2, [r4, #1104] ; 0x450 + 1f28224: 0a000001 beq 1f28230 + 1f28228: e3510a02 cmp r1, #8192 ; 0x2000 + 1f2822c: ca00006f bgt 1f283f0 + 1f28230: e59de018 ldr lr, [sp, #24] + 1f28234: e300241c movw r2, #1052 ; 0x41c + 1f28238: e59dc014 ldr ip, [sp, #20] + 1f2823c: e2840d12 add r0, r4, #1152 ; 0x480 + 1f28240: e35e0000 cmp lr, #0 + 1f28244: e083300c add r3, r3, ip + 1f28248: e1a0c081 lsl ip, r1, #1 + 1f2824c: e1a01181 lsl r1, r1, #3 + 1f28250: e184c0b2 strh ip, [r4, r2] + 1f28254: e58dc05c str ip, [sp, #92] ; 0x5c + 1f28258: e08c200e add r2, ip, lr + 1f2825c: e5841454 str r1, [r4, #1108] ; 0x454 + 1f28260: e1c030b0 strh r3, [r0] + 1f28264: 0a000001 beq 1f28270 + 1f28268: e3520901 cmp r2, #16384 ; 0x4000 + 1f2826c: ca00005f bgt 1f283f0 + 1f28270: e59de01c ldr lr, [sp, #28] + 1f28274: e300c482 movw ip, #1154 ; 0x482 + 1f28278: e59d1018 ldr r1, [sp, #24] + 1f2827c: e300041e movw r0, #1054 ; 0x41e + 1f28280: e35e0000 cmp lr, #0 + 1f28284: e0833001 add r3, r3, r1 + 1f28288: e1a01082 lsl r1, r2, #1 + 1f2828c: e18430bc strh r3, [r4, ip] + 1f28290: e1a02102 lsl r2, r2, #2 + 1f28294: e18410b0 strh r1, [r4, r0] + 1f28298: e08e3001 add r3, lr, r1 + 1f2829c: e58d1060 str r1, [sp, #96] ; 0x60 + 1f282a0: e5842458 str r2, [r4, #1112] ; 0x458 + 1f282a4: 0a000001 beq 1f282b0 + 1f282a8: e3530902 cmp r3, #32768 ; 0x8000 + 1f282ac: ca00004f bgt 1f283f0 + 1f282b0: e3560000 cmp r6, #0 + 1f282b4: e1a03083 lsl r3, r3, #1 + 1f282b8: e3a02801 mov r2, #65536 ; 0x10000 + 1f282bc: e584345c str r3, [r4, #1116] ; 0x45c + 1f282c0: e5842460 str r2, [r4, #1120] ; 0x460 + 1f282c4: c2455001 subgt r5, r5, #1 + 1f282c8: c3a0e000 movgt lr, #0 + 1f282cc: c3a0b001 movgt fp, #1 + 1f282d0: da000041 ble 1f283dc + 1f282d4: e5f51001 ldrb r1, [r5, #1]! + 1f282d8: e3510000 cmp r1, #0 + 1f282dc: 0a00003b beq 1f283d0 + 1f282e0: e0842081 add r2, r4, r1, lsl #1 + 1f282e4: e28d30a8 add r3, sp, #168 ; 0xa8 + 1f282e8: e1a09101 lsl r9, r1, #2 + 1f282ec: e3510009 cmp r1, #9 + 1f282f0: e0830009 add r0, r3, r9 + 1f282f4: e2823b01 add r3, r2, #1024 ; 0x400 + 1f282f8: e2822e46 add r2, r2, #1120 ; 0x460 + 1f282fc: e2822004 add r2, r2, #4 + 1f28300: e1d330b0 ldrh r3, [r3] + 1f28304: e5107084 ldr r7, [r0, #-132] ; 0xffffff7c + 1f28308: e1d220b0 ldrh r2, [r2] + 1f2830c: e0633007 rsb r3, r3, r7 + 1f28310: e0833002 add r3, r3, r2 + 1f28314: e2832e2d add r2, r3, #720 ; 0x2d0 + 1f28318: e0843003 add r3, r4, r3 + 1f2831c: e0842082 add r2, r4, r2, lsl #1 + 1f28320: e5c31484 strb r1, [r3, #1156] ; 0x484 + 1f28324: e1c2e0b4 strh lr, [r2, #4] + 1f28328: ca000024 bgt 1f283c0 + 1f2832c: e1a0c0c7 asr ip, r7, #1 + 1f28330: e1a00087 lsl r0, r7, #1 + 1f28334: e3052555 movw r2, #21845 ; 0x5555 + 1f28338: e30a3aaa movw r3, #43690 ; 0xaaaa + 1f2833c: e002200c and r2, r2, ip + 1f28340: e0033000 and r3, r3, r0 + 1f28344: e1823003 orr r3, r2, r3 + 1f28348: e303c333 movw ip, #13107 ; 0x3333 + 1f2834c: e30c2ccc movw r2, #52428 ; 0xcccc + 1f28350: e3000f0f movw r0, #3855 ; 0xf0f + 1f28354: e1a08143 asr r8, r3, #2 + 1f28358: e1a03103 lsl r3, r3, #2 + 1f2835c: e00cc008 and ip, ip, r8 + 1f28360: e0022003 and r2, r2, r3 + 1f28364: e18c2002 orr r2, ip, r2 + 1f28368: e30f30f0 movw r3, #61680 ; 0xf0f0 + 1f2836c: e261a010 rsb sl, r1, #16 + 1f28370: e1a0c11b lsl ip, fp, r1 + 1f28374: e1a08242 asr r8, r2, #4 + 1f28378: e1a02202 lsl r2, r2, #4 + 1f2837c: e0000008 and r0, r0, r8 + 1f28380: e0033002 and r3, r3, r2 + 1f28384: e1803003 orr r3, r0, r3 + 1f28388: e18e1481 orr r1, lr, r1, lsl #9 + 1f2838c: e1a0808c lsl r8, ip, #1 + 1f28390: e3a00000 mov r0, #0 + 1f28394: e1a02403 lsl r2, r3, #8 + 1f28398: e6ff1071 uxth r1, r1 + 1f2839c: e6ff2072 uxth r2, r2 + 1f283a0: e1823423 orr r3, r2, r3, lsr #8 + 1f283a4: e1a03a53 asr r3, r3, sl + 1f283a8: e0842083 add r2, r4, r3, lsl #1 + 1f283ac: e083300c add r3, r3, ip + 1f283b0: e18210b0 strh r1, [r2, r0] + 1f283b4: e3530c02 cmp r3, #512 ; 0x200 + 1f283b8: e0800008 add r0, r0, r8 + 1f283bc: bafffffa blt 1f283ac + 1f283c0: e28d30a8 add r3, sp, #168 ; 0xa8 + 1f283c4: e2877001 add r7, r7, #1 + 1f283c8: e0839009 add r9, r3, r9 + 1f283cc: e5097084 str r7, [r9, #-132] ; 0xffffff7c + 1f283d0: e28ee001 add lr, lr, #1 + 1f283d4: e156000e cmp r6, lr + 1f283d8: 1affffbd bne 1f282d4 + 1f283dc: e3a00001 mov r0, #1 + 1f283e0: e28dd0ac add sp, sp, #172 ; 0xac + 1f283e4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f283e8: e3510c01 cmp r1, #256 ; 0x100 + 1f283ec: daffff40 ble 1f280f4 + 1f283f0: e30a336c movw r3, #41836 ; 0xa36c + 1f283f4: e340320d movt r3, #525 ; 0x20d + 1f283f8: e3a00000 mov r0, #0 + 1f283fc: e3002f18 movw r2, #3864 ; 0xf18 + 1f28400: e34021f6 movt r2, #502 ; 0x1f6 + 1f28404: e5832000 str r2, [r3] + 1f28408: e28dd0ac add sp, sp, #172 ; 0xac + 1f2840c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f28410: e30a336c movw r3, #41836 ; 0xa36c + 1f28414: e340320d movt r3, #525 ; 0x20d + 1f28418: e3a00000 mov r0, #0 + 1f2841c: e3002f0c movw r2, #3852 ; 0xf0c + 1f28420: e34021f6 movt r2, #502 ; 0x1f6 + 1f28424: e5832000 str r2, [r3] + 1f28428: e28dd0ac add sp, sp, #172 ; 0xac + 1f2842c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + +01f28430 : + 1f28430: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f28434: e590c008 ldr ip, [r0, #8] + 1f28438: e1a04000 mov r4, r0 + 1f2843c: e24ddea2 sub sp, sp, #2592 ; 0xa20 + 1f28440: e35c0004 cmp ip, #4 + 1f28444: e24dd00c sub sp, sp, #12 + 1f28448: c590500c ldrgt r5, [r0, #12] + 1f2844c: ca000014 bgt 1f284a4 + 1f28450: e590e004 ldr lr, [r0, #4] + 1f28454: e1a0300c mov r3, ip + 1f28458: e590500c ldr r5, [r0, #12] + 1f2845c: e5901000 ldr r1, [r0] + 1f28460: e15e0001 cmp lr, r1 + 1f28464: e2810001 add r0, r1, #1 + 1f28468: 85840000 strhi r0, [r4] + 1f2846c: e3a02000 mov r2, #0 + 1f28470: 85d12000 ldrbhi r2, [r1] + 1f28474: 81a01000 movhi r1, r0 + 1f28478: 81a02312 lslhi r2, r2, r3 + 1f2847c: e2833008 add r3, r3, #8 + 1f28480: e3530018 cmp r3, #24 + 1f28484: e1855002 orr r5, r5, r2 + 1f28488: e5843008 str r3, [r4, #8] + 1f2848c: e584500c str r5, [r4, #12] + 1f28490: dafffff2 ble 1f28460 + 1f28494: e26c3018 rsb r3, ip, #24 + 1f28498: e28cc008 add ip, ip, #8 + 1f2849c: e3c33007 bic r3, r3, #7 + 1f284a0: e083c00c add ip, r3, ip + 1f284a4: e24c3005 sub r3, ip, #5 + 1f284a8: e1a062a5 lsr r6, r5, #5 + 1f284ac: e3530004 cmp r3, #4 + 1f284b0: e5843008 str r3, [r4, #8] + 1f284b4: e584600c str r6, [r4, #12] + 1f284b8: ca000011 bgt 1f28504 + 1f284bc: e8944002 ldm r4, {r1, lr} + 1f284c0: e15e0001 cmp lr, r1 + 1f284c4: e2810001 add r0, r1, #1 + 1f284c8: 85840000 strhi r0, [r4] + 1f284cc: e3a02000 mov r2, #0 + 1f284d0: 85d12000 ldrbhi r2, [r1] + 1f284d4: 81a01000 movhi r1, r0 + 1f284d8: 81a02312 lslhi r2, r2, r3 + 1f284dc: e2833008 add r3, r3, #8 + 1f284e0: e3530018 cmp r3, #24 + 1f284e4: e1866002 orr r6, r6, r2 + 1f284e8: e5843008 str r3, [r4, #8] + 1f284ec: e584600c str r6, [r4, #12] + 1f284f0: dafffff2 ble 1f284c0 + 1f284f4: e26c301d rsb r3, ip, #29 + 1f284f8: e28cc003 add ip, ip, #3 + 1f284fc: e3c33007 bic r3, r3, #7 + 1f28500: e083300c add r3, r3, ip + 1f28504: e2432005 sub r2, r3, #5 + 1f28508: e1a012a6 lsr r1, r6, #5 + 1f2850c: e3520003 cmp r2, #3 + 1f28510: e5842008 str r2, [r4, #8] + 1f28514: e584100c str r1, [r4, #12] + 1f28518: ca000012 bgt 1f28568 + 1f2851c: e5947004 ldr r7, [r4, #4] + 1f28520: e594c000 ldr ip, [r4] + 1f28524: e157000c cmp r7, ip + 1f28528: e28ce001 add lr, ip, #1 + 1f2852c: 8584e000 strhi lr, [r4] + 1f28530: e3a00000 mov r0, #0 + 1f28534: 85dc0000 ldrbhi r0, [ip] + 1f28538: 81a0c00e movhi ip, lr + 1f2853c: 81a00210 lslhi r0, r0, r2 + 1f28540: e2822008 add r2, r2, #8 + 1f28544: e3520018 cmp r2, #24 + 1f28548: e1811000 orr r1, r1, r0 + 1f2854c: e5842008 str r2, [r4, #8] + 1f28550: e584100c str r1, [r4, #12] + 1f28554: dafffff2 ble 1f28524 + 1f28558: e263201d rsb r2, r3, #29 + 1f2855c: e2833003 add r3, r3, #3 + 1f28560: e3c22007 bic r2, r2, #7 + 1f28564: e0822003 add r2, r2, r3 + 1f28568: e1a03221 lsr r3, r1, #4 + 1f2856c: e2422004 sub r2, r2, #4 + 1f28570: e201700f and r7, r1, #15 + 1f28574: e5842008 str r2, [r4, #8] + 1f28578: e28d0028 add r0, sp, #40 ; 0x28 + 1f2857c: e3a02013 mov r2, #19 + 1f28580: e584300c str r3, [r4, #12] + 1f28584: e3a01000 mov r1, #0 + 1f28588: eb005aa3 bl 1f3f01c + 1f2858c: e300aef7 movw sl, #3831 ; 0xef7 + 1f28590: e340a1f6 movt sl, #502 ; 0x1f6 + 1f28594: e2877004 add r7, r7, #4 + 1f28598: e594e008 ldr lr, [r4, #8] + 1f2859c: e594200c ldr r2, [r4, #12] + 1f285a0: e3a09000 mov r9, #0 + 1f285a4: e35e0002 cmp lr, #2 + 1f285a8: ca000013 bgt 1f285fc + 1f285ac: e5948004 ldr r8, [r4, #4] + 1f285b0: e1a0300e mov r3, lr + 1f285b4: e5940000 ldr r0, [r4] + 1f285b8: e1580000 cmp r8, r0 + 1f285bc: e280c001 add ip, r0, #1 + 1f285c0: 8584c000 strhi ip, [r4] + 1f285c4: e3a01000 mov r1, #0 + 1f285c8: 85d01000 ldrbhi r1, [r0] + 1f285cc: 81a0000c movhi r0, ip + 1f285d0: 81a01311 lslhi r1, r1, r3 + 1f285d4: e2833008 add r3, r3, #8 + 1f285d8: e3530018 cmp r3, #24 + 1f285dc: e1822001 orr r2, r2, r1 + 1f285e0: e5843008 str r3, [r4, #8] + 1f285e4: e584200c str r2, [r4, #12] + 1f285e8: dafffff2 ble 1f285b8 + 1f285ec: e26e3018 rsb r3, lr, #24 + 1f285f0: e28ee008 add lr, lr, #8 + 1f285f4: e3c33007 bic r3, r3, #7 + 1f285f8: e083e00e add lr, r3, lr + 1f285fc: e2021007 and r1, r2, #7 + 1f28600: e24ee003 sub lr, lr, #3 + 1f28604: e1a021a2 lsr r2, r2, #3 + 1f28608: e584e008 str lr, [r4, #8] + 1f2860c: e584200c str r2, [r4, #12] + 1f28610: e28d0ea2 add r0, sp, #2592 ; 0xa20 + 1f28614: e2800008 add r0, r0, #8 + 1f28618: e2899001 add r9, r9, #1 + 1f2861c: e5fa3001 ldrb r3, [sl, #1]! + 1f28620: e1570009 cmp r7, r9 + 1f28624: e0803003 add r3, r0, r3 + 1f28628: e5431a00 strb r1, [r3, #-2560] ; 0xfffff600 + 1f2862c: caffffdc bgt 1f285a4 + 1f28630: e3a02044 mov r2, #68 ; 0x44 + 1f28634: e3a01000 mov r1, #0 + 1f28638: e28d007c add r0, sp, #124 ; 0x7c + 1f2863c: eb005a76 bl 1f3f01c + 1f28640: e3a01000 mov r1, #0 + 1f28644: e28d0f91 add r0, sp, #580 ; 0x244 + 1f28648: e3a02b01 mov r2, #1024 ; 0x400 + 1f2864c: eb005a72 bl 1f3f01c + 1f28650: e28d3027 add r3, sp, #39 ; 0x27 + 1f28654: e28d003a add r0, sp, #58 ; 0x3a + 1f28658: e58d3010 str r3, [sp, #16] + 1f2865c: e1a01003 mov r1, r3 + 1f28660: e5f13001 ldrb r3, [r1, #1]! + 1f28664: e28d2ea2 add r2, sp, #2592 ; 0xa20 + 1f28668: e2822008 add r2, r2, #8 + 1f2866c: e1500001 cmp r0, r1 + 1f28670: e0823103 add r3, r2, r3, lsl #2 + 1f28674: e51329ac ldr r2, [r3, #-2476] ; 0xfffff654 + 1f28678: e2822001 add r2, r2, #1 + 1f2867c: e50329ac str r2, [r3, #-2476] ; 0xfffff654 + 1f28680: 1afffff6 bne 1f28660 + 1f28684: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f28688: e3a03000 mov r3, #0 + 1f2868c: e58d307c str r3, [sp, #124] ; 0x7c + 1f28690: e3520002 cmp r2, #2 + 1f28694: ca000265 bgt 1f29030 + 1f28698: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f2869c: e3530004 cmp r3, #4 + 1f286a0: ca000262 bgt 1f29030 + 1f286a4: e59d1088 ldr r1, [sp, #136] ; 0x88 + 1f286a8: e3510008 cmp r1, #8 + 1f286ac: ca00025f bgt 1f29030 + 1f286b0: e59d008c ldr r0, [sp, #140] ; 0x8c + 1f286b4: e3500010 cmp r0, #16 + 1f286b8: ca00025c bgt 1f29030 + 1f286bc: e59db090 ldr fp, [sp, #144] ; 0x90 + 1f286c0: e35b0020 cmp fp, #32 + 1f286c4: ca000259 bgt 1f29030 + 1f286c8: e59d9094 ldr r9, [sp, #148] ; 0x94 + 1f286cc: e3590040 cmp r9, #64 ; 0x40 + 1f286d0: ca000256 bgt 1f29030 + 1f286d4: e59da098 ldr sl, [sp, #152] ; 0x98 + 1f286d8: e35a0080 cmp sl, #128 ; 0x80 + 1f286dc: ca000253 bgt 1f29030 + 1f286e0: e59dc09c ldr ip, [sp, #156] ; 0x9c + 1f286e4: e58dc004 str ip, [sp, #4] + 1f286e8: e35c0c01 cmp ip, #256 ; 0x100 + 1f286ec: ca00024f bgt 1f29030 + 1f286f0: e59dc0a0 ldr ip, [sp, #160] ; 0xa0 + 1f286f4: e58dc008 str ip, [sp, #8] + 1f286f8: e35c0c02 cmp ip, #512 ; 0x200 + 1f286fc: ca00024b bgt 1f29030 + 1f28700: e59dc0a4 ldr ip, [sp, #164] ; 0xa4 + 1f28704: e58dc00c str ip, [sp, #12] + 1f28708: e35c0b01 cmp ip, #1024 ; 0x400 + 1f2870c: ca000247 bgt 1f29030 + 1f28710: e59dc0a8 ldr ip, [sp, #168] ; 0xa8 + 1f28714: e58dc014 str ip, [sp, #20] + 1f28718: e35c0b02 cmp ip, #2048 ; 0x800 + 1f2871c: ca000243 bgt 1f29030 + 1f28720: e59dc0ac ldr ip, [sp, #172] ; 0xac + 1f28724: e58dc018 str ip, [sp, #24] + 1f28728: e35c0a01 cmp ip, #4096 ; 0x1000 + 1f2872c: ca00023f bgt 1f29030 + 1f28730: e59dc0b0 ldr ip, [sp, #176] ; 0xb0 + 1f28734: e58dc01c str ip, [sp, #28] + 1f28738: e35c0a02 cmp ip, #8192 ; 0x2000 + 1f2873c: ca00023b bgt 1f29030 + 1f28740: e59dc0b4 ldr ip, [sp, #180] ; 0xb4 + 1f28744: e58dc020 str ip, [sp, #32] + 1f28748: e35c0901 cmp ip, #16384 ; 0x4000 + 1f2874c: ca000237 bgt 1f29030 + 1f28750: e59dc0b8 ldr ip, [sp, #184] ; 0xb8 + 1f28754: e58dc024 str ip, [sp, #36] ; 0x24 + 1f28758: e35c0902 cmp ip, #32768 ; 0x8000 + 1f2875c: ca000233 bgt 1f29030 + 1f28760: e28dcf91 add ip, sp, #580 ; 0x244 + 1f28764: e3008402 movw r8, #1026 ; 0x402 + 1f28768: e3a07000 mov r7, #0 + 1f2876c: e28def92 add lr, sp, #584 ; 0x248 + 1f28770: e28eeb01 add lr, lr, #1024 ; 0x400 + 1f28774: e3530000 cmp r3, #0 + 1f28778: e18c70b8 strh r7, [ip, r8] + 1f2877c: e3008466 movw r8, #1126 ; 0x466 + 1f28780: e58d7040 str r7, [sp, #64] ; 0x40 + 1f28784: e18c70b8 strh r7, [ip, r8] + 1f28788: e3008468 movw r8, #1128 ; 0x468 + 1f2878c: e1a07082 lsl r7, r2, #1 + 1f28790: e1ce70b0 strh r7, [lr] + 1f28794: e58d7044 str r7, [sp, #68] ; 0x44 + 1f28798: e1a0e782 lsl lr, r2, #15 + 1f2879c: e18c20b8 strh r2, [ip, r8] + 1f287a0: e083c007 add ip, r3, r7 + 1f287a4: e58de668 str lr, [sp, #1640] ; 0x668 + 1f287a8: 0a000001 beq 1f287b4 + 1f287ac: e35c0004 cmp ip, #4 + 1f287b0: ca000163 bgt 1f28d44 + 1f287b4: e28def91 add lr, sp, #580 ; 0x244 + 1f287b8: e300846a movw r8, #1130 ; 0x46a + 1f287bc: e3007406 movw r7, #1030 ; 0x406 + 1f287c0: e3510000 cmp r1, #0 + 1f287c4: e0823003 add r3, r2, r3 + 1f287c8: e1a0208c lsl r2, ip, #1 + 1f287cc: e18e30b8 strh r3, [lr, r8] + 1f287d0: e1a0c70c lsl ip, ip, #14 + 1f287d4: e18e20b7 strh r2, [lr, r7] + 1f287d8: e082e001 add lr, r2, r1 + 1f287dc: e58d2048 str r2, [sp, #72] ; 0x48 + 1f287e0: e58dc66c str ip, [sp, #1644] ; 0x66c + 1f287e4: 0a000001 beq 1f287f0 + 1f287e8: e35e0008 cmp lr, #8 + 1f287ec: ca000154 bgt 1f28d44 + 1f287f0: e28dcf91 add ip, sp, #580 ; 0x244 + 1f287f4: e300846c movw r8, #1132 ; 0x46c + 1f287f8: e3007408 movw r7, #1032 ; 0x408 + 1f287fc: e3500000 cmp r0, #0 + 1f28800: e1a0208e lsl r2, lr, #1 + 1f28804: e0833001 add r3, r3, r1 + 1f28808: e1a0e68e lsl lr, lr, #13 + 1f2880c: e18c30b8 strh r3, [ip, r8] + 1f28810: e18c20b7 strh r2, [ip, r7] + 1f28814: e080c002 add ip, r0, r2 + 1f28818: e58d204c str r2, [sp, #76] ; 0x4c + 1f2881c: e58de670 str lr, [sp, #1648] ; 0x670 + 1f28820: 0a000001 beq 1f2882c + 1f28824: e35c0010 cmp ip, #16 + 1f28828: ca000145 bgt 1f28d44 + 1f2882c: e28d2f91 add r2, sp, #580 ; 0x244 + 1f28830: e300746e movw r7, #1134 ; 0x46e + 1f28834: e300e40a movw lr, #1034 ; 0x40a + 1f28838: e35b0000 cmp fp, #0 + 1f2883c: e1a0108c lsl r1, ip, #1 + 1f28840: e0803003 add r3, r0, r3 + 1f28844: e1a0c60c lsl ip, ip, #12 + 1f28848: e18230b7 strh r3, [r2, r7] + 1f2884c: e18210be strh r1, [r2, lr] + 1f28850: e08b2001 add r2, fp, r1 + 1f28854: e58d1050 str r1, [sp, #80] ; 0x50 + 1f28858: e58dc674 str ip, [sp, #1652] ; 0x674 + 1f2885c: 0a000001 beq 1f28868 + 1f28860: e3520020 cmp r2, #32 + 1f28864: ca000136 bgt 1f28d44 + 1f28868: e28d1f91 add r1, sp, #580 ; 0x244 + 1f2886c: e300e40c movw lr, #1036 ; 0x40c + 1f28870: e281ce47 add ip, r1, #1136 ; 0x470 + 1f28874: e3590000 cmp r9, #0 + 1f28878: e1a00082 lsl r0, r2, #1 + 1f2887c: e08b3003 add r3, fp, r3 + 1f28880: e1a02582 lsl r2, r2, #11 + 1f28884: e18100be strh r0, [r1, lr] + 1f28888: e1cc30b0 strh r3, [ip] + 1f2888c: e0891000 add r1, r9, r0 + 1f28890: e58d0054 str r0, [sp, #84] ; 0x54 + 1f28894: e58d2678 str r2, [sp, #1656] ; 0x678 + 1f28898: 0a000001 beq 1f288a4 + 1f2889c: e3510040 cmp r1, #64 ; 0x40 + 1f288a0: ca000127 bgt 1f28d44 + 1f288a4: e28d2f91 add r2, sp, #580 ; 0x244 + 1f288a8: e300c472 movw ip, #1138 ; 0x472 + 1f288ac: e300040e movw r0, #1038 ; 0x40e + 1f288b0: e35a0000 cmp sl, #0 + 1f288b4: e1a0e081 lsl lr, r1, #1 + 1f288b8: e0893003 add r3, r9, r3 + 1f288bc: e1a01501 lsl r1, r1, #10 + 1f288c0: e18230bc strh r3, [r2, ip] + 1f288c4: e182e0b0 strh lr, [r2, r0] + 1f288c8: e08a200e add r2, sl, lr + 1f288cc: e58de058 str lr, [sp, #88] ; 0x58 + 1f288d0: e58d167c str r1, [sp, #1660] ; 0x67c + 1f288d4: 0a000001 beq 1f288e0 + 1f288d8: e3520080 cmp r2, #128 ; 0x80 + 1f288dc: ca000118 bgt 1f28d44 + 1f288e0: e59de004 ldr lr, [sp, #4] + 1f288e4: e28d1f92 add r1, sp, #584 ; 0x248 + 1f288e8: e28d0f92 add r0, sp, #584 ; 0x248 + 1f288ec: e2811b01 add r1, r1, #1024 ; 0x400 + 1f288f0: e2800e47 add r0, r0, #1136 ; 0x470 + 1f288f4: e35e0000 cmp lr, #0 + 1f288f8: e1a0c082 lsl ip, r2, #1 + 1f288fc: e08a3003 add r3, sl, r3 + 1f28900: e1a02482 lsl r2, r2, #9 + 1f28904: e1c1c0bc strh ip, [r1, #12] + 1f28908: e1c030b0 strh r3, [r0] + 1f2890c: e08e100c add r1, lr, ip + 1f28910: e58dc05c str ip, [sp, #92] ; 0x5c + 1f28914: e58d2680 str r2, [sp, #1664] ; 0x680 + 1f28918: 0a000001 beq 1f28924 + 1f2891c: e3510c01 cmp r1, #256 ; 0x100 + 1f28920: ca000107 bgt 1f28d44 + 1f28924: e59d7008 ldr r7, [sp, #8] + 1f28928: e28d2f91 add r2, sp, #580 ; 0x244 + 1f2892c: e59de004 ldr lr, [sp, #4] + 1f28930: e300c476 movw ip, #1142 ; 0x476 + 1f28934: e3000412 movw r0, #1042 ; 0x412 + 1f28938: e3570000 cmp r7, #0 + 1f2893c: e08e3003 add r3, lr, r3 + 1f28940: e1a0e081 lsl lr, r1, #1 + 1f28944: e18230bc strh r3, [r2, ip] + 1f28948: e1a01401 lsl r1, r1, #8 + 1f2894c: e182e0b0 strh lr, [r2, r0] + 1f28950: e087200e add r2, r7, lr + 1f28954: e58de060 str lr, [sp, #96] ; 0x60 + 1f28958: e58d1684 str r1, [sp, #1668] ; 0x684 + 1f2895c: 1a0000f6 bne 1f28d3c + 1f28960: e28d1f92 add r1, sp, #584 ; 0x248 + 1f28964: e59de00c ldr lr, [sp, #12] + 1f28968: e2810e47 add r0, r1, #1136 ; 0x470 + 1f2896c: e59dc008 ldr ip, [sp, #8] + 1f28970: e2811e41 add r1, r1, #1040 ; 0x410 + 1f28974: e35e0000 cmp lr, #0 + 1f28978: e08c3003 add r3, ip, r3 + 1f2897c: e1a0c082 lsl ip, r2, #1 + 1f28980: e1c030b4 strh r3, [r0, #4] + 1f28984: e1a02382 lsl r2, r2, #7 + 1f28988: e08e000c add r0, lr, ip + 1f2898c: e1c1c0b0 strh ip, [r1] + 1f28990: e58dc064 str ip, [sp, #100] ; 0x64 + 1f28994: e58d2688 str r2, [sp, #1672] ; 0x688 + 1f28998: 0a000001 beq 1f289a4 + 1f2899c: e3500b01 cmp r0, #1024 ; 0x400 + 1f289a0: ca0000e7 bgt 1f28d44 + 1f289a4: e59d7014 ldr r7, [sp, #20] + 1f289a8: e28d2f91 add r2, sp, #580 ; 0x244 + 1f289ac: e59de00c ldr lr, [sp, #12] + 1f289b0: e300c47a movw ip, #1146 ; 0x47a + 1f289b4: e3001416 movw r1, #1046 ; 0x416 + 1f289b8: e3570000 cmp r7, #0 + 1f289bc: e08e3003 add r3, lr, r3 + 1f289c0: e1a0e080 lsl lr, r0, #1 + 1f289c4: e18230bc strh r3, [r2, ip] + 1f289c8: e1a00300 lsl r0, r0, #6 + 1f289cc: e182e0b1 strh lr, [r2, r1] + 1f289d0: e087200e add r2, r7, lr + 1f289d4: e58de068 str lr, [sp, #104] ; 0x68 + 1f289d8: e58d068c str r0, [sp, #1676] ; 0x68c + 1f289dc: 0a000001 beq 1f289e8 + 1f289e0: e3520b02 cmp r2, #2048 ; 0x800 + 1f289e4: ca0000d6 bgt 1f28d44 + 1f289e8: e59d7018 ldr r7, [sp, #24] + 1f289ec: e28d1f91 add r1, sp, #580 ; 0x244 + 1f289f0: e59de014 ldr lr, [sp, #20] + 1f289f4: e300c47c movw ip, #1148 ; 0x47c + 1f289f8: e3000418 movw r0, #1048 ; 0x418 + 1f289fc: e3570000 cmp r7, #0 + 1f28a00: e08e3003 add r3, lr, r3 + 1f28a04: e1a0e082 lsl lr, r2, #1 + 1f28a08: e18130bc strh r3, [r1, ip] + 1f28a0c: e1a02282 lsl r2, r2, #5 + 1f28a10: e181e0b0 strh lr, [r1, r0] + 1f28a14: e087100e add r1, r7, lr + 1f28a18: e58de06c str lr, [sp, #108] ; 0x6c + 1f28a1c: e58d2690 str r2, [sp, #1680] ; 0x690 + 1f28a20: 0a000001 beq 1f28a2c + 1f28a24: e3510a01 cmp r1, #4096 ; 0x1000 + 1f28a28: ca0000c5 bgt 1f28d44 + 1f28a2c: e59d701c ldr r7, [sp, #28] + 1f28a30: e28d2f91 add r2, sp, #580 ; 0x244 + 1f28a34: e59de018 ldr lr, [sp, #24] + 1f28a38: e300c47e movw ip, #1150 ; 0x47e + 1f28a3c: e300041a movw r0, #1050 ; 0x41a + 1f28a40: e3570000 cmp r7, #0 + 1f28a44: e08e3003 add r3, lr, r3 + 1f28a48: e1a0e081 lsl lr, r1, #1 + 1f28a4c: e18230bc strh r3, [r2, ip] + 1f28a50: e1a01201 lsl r1, r1, #4 + 1f28a54: e182e0b0 strh lr, [r2, r0] + 1f28a58: e087200e add r2, r7, lr + 1f28a5c: e58de070 str lr, [sp, #112] ; 0x70 + 1f28a60: e58d1694 str r1, [sp, #1684] ; 0x694 + 1f28a64: 0a000001 beq 1f28a70 + 1f28a68: e3520a02 cmp r2, #8192 ; 0x2000 + 1f28a6c: ca0000b4 bgt 1f28d44 + 1f28a70: e28d0f91 add r0, sp, #580 ; 0x244 + 1f28a74: e59d8020 ldr r8, [sp, #32] + 1f28a78: e300e41c movw lr, #1052 ; 0x41c + 1f28a7c: e280cd12 add ip, r0, #1152 ; 0x480 + 1f28a80: e59d101c ldr r1, [sp, #28] + 1f28a84: e3580000 cmp r8, #0 + 1f28a88: e1a07082 lsl r7, r2, #1 + 1f28a8c: e58d7074 str r7, [sp, #116] ; 0x74 + 1f28a90: e0813003 add r3, r1, r3 + 1f28a94: e18070be strh r7, [r0, lr] + 1f28a98: e1a01182 lsl r1, r2, #3 + 1f28a9c: e1cc30b0 strh r3, [ip] + 1f28aa0: e0872008 add r2, r7, r8 + 1f28aa4: e58d1698 str r1, [sp, #1688] ; 0x698 + 1f28aa8: 0a000001 beq 1f28ab4 + 1f28aac: e3520901 cmp r2, #16384 ; 0x4000 + 1f28ab0: ca0000a3 bgt 1f28d44 + 1f28ab4: e59d7024 ldr r7, [sp, #36] ; 0x24 + 1f28ab8: e28d1f91 add r1, sp, #580 ; 0x244 + 1f28abc: e59d0020 ldr r0, [sp, #32] + 1f28ac0: e300e482 movw lr, #1154 ; 0x482 + 1f28ac4: e300c41e movw ip, #1054 ; 0x41e + 1f28ac8: e3570000 cmp r7, #0 + 1f28acc: e0833000 add r3, r3, r0 + 1f28ad0: e1a00082 lsl r0, r2, #1 + 1f28ad4: e18130be strh r3, [r1, lr] + 1f28ad8: e1a02102 lsl r2, r2, #2 + 1f28adc: e0803007 add r3, r0, r7 + 1f28ae0: e18100bc strh r0, [r1, ip] + 1f28ae4: e58d0078 str r0, [sp, #120] ; 0x78 + 1f28ae8: e58d269c str r2, [sp, #1692] ; 0x69c + 1f28aec: 0a000001 beq 1f28af8 + 1f28af0: e3530902 cmp r3, #32768 ; 0x8000 + 1f28af4: ca000092 bgt 1f28d44 + 1f28af8: e59d8010 ldr r8, [sp, #16] + 1f28afc: e1a03083 lsl r3, r3, #1 + 1f28b00: e3a02801 mov r2, #65536 ; 0x10000 + 1f28b04: e58d36a0 str r3, [sp, #1696] ; 0x6a0 + 1f28b08: e3a0e000 mov lr, #0 + 1f28b0c: e58d26a4 str r2, [sp, #1700] ; 0x6a4 + 1f28b10: e28dbf91 add fp, sp, #580 ; 0x244 + 1f28b14: e58d5004 str r5, [sp, #4] + 1f28b18: e5f83001 ldrb r3, [r8, #1]! + 1f28b1c: e3530000 cmp r3, #0 + 1f28b20: 0a000040 beq 1f28c28 + 1f28b24: e2832c02 add r2, r3, #512 ; 0x200 + 1f28b28: e28d0ea2 add r0, sp, #2592 ; 0xa20 + 1f28b2c: e1a07103 lsl r7, r3, #2 + 1f28b30: e2831e23 add r1, r3, #560 ; 0x230 + 1f28b34: e2800008 add r0, r0, #8 + 1f28b38: e1a02082 lsl r2, r2, #1 + 1f28b3c: e0800007 add r0, r0, r7 + 1f28b40: e08b1081 add r1, fp, r1, lsl #1 + 1f28b44: e3530009 cmp r3, #9 + 1f28b48: e19b20b2 ldrh r2, [fp, r2] + 1f28b4c: e510c9ec ldr ip, [r0, #-2540] ; 0xfffff614 + 1f28b50: e28d0ea2 add r0, sp, #2592 ; 0xa20 + 1f28b54: e1d110b4 ldrh r1, [r1, #4] + 1f28b58: e2800008 add r0, r0, #8 + 1f28b5c: e062200c rsb r2, r2, ip + 1f28b60: e0822001 add r2, r2, r1 + 1f28b64: e2821e2d add r1, r2, #720 ; 0x2d0 + 1f28b68: e0802002 add r2, r0, r2 + 1f28b6c: e08b1081 add r1, fp, r1, lsl #1 + 1f28b70: e5423360 strb r3, [r2, #-864] ; 0xfffffca0 + 1f28b74: e1c1e0b4 strh lr, [r1, #4] + 1f28b78: ca000025 bgt 1f28c14 + 1f28b7c: e1a050cc asr r5, ip, #1 + 1f28b80: e1a0008c lsl r0, ip, #1 + 1f28b84: e3051555 movw r1, #21845 ; 0x5555 + 1f28b88: e30a2aaa movw r2, #43690 ; 0xaaaa + 1f28b8c: e0022000 and r2, r2, r0 + 1f28b90: e0011005 and r1, r1, r5 + 1f28b94: e1811002 orr r1, r1, r2 + 1f28b98: e30c0ccc movw r0, #52428 ; 0xcccc + 1f28b9c: e3032333 movw r2, #13107 ; 0x3333 + 1f28ba0: e3009f0f movw r9, #3855 ; 0xf0f + 1f28ba4: e1a05141 asr r5, r1, #2 + 1f28ba8: e1a01101 lsl r1, r1, #2 + 1f28bac: e0000001 and r0, r0, r1 + 1f28bb0: e0022005 and r2, r2, r5 + 1f28bb4: e1822000 orr r2, r2, r0 + 1f28bb8: e30f10f0 movw r1, #61680 ; 0xf0f0 + 1f28bbc: e3a00001 mov r0, #1 + 1f28bc0: e263a010 rsb sl, r3, #16 + 1f28bc4: e1a05242 asr r5, r2, #4 + 1f28bc8: e1a02202 lsl r2, r2, #4 + 1f28bcc: e0011002 and r1, r1, r2 + 1f28bd0: e0099005 and r9, r9, r5 + 1f28bd4: e1899001 orr r9, r9, r1 + 1f28bd8: e1a00310 lsl r0, r0, r3 + 1f28bdc: e18e2483 orr r2, lr, r3, lsl #9 + 1f28be0: e3a01000 mov r1, #0 + 1f28be4: e1a03409 lsl r3, r9, #8 + 1f28be8: e1a05080 lsl r5, r0, #1 + 1f28bec: e6ff2072 uxth r2, r2 + 1f28bf0: e6ff3073 uxth r3, r3 + 1f28bf4: e1833429 orr r3, r3, r9, lsr #8 + 1f28bf8: e1a0aa53 asr sl, r3, sl + 1f28bfc: e08b308a add r3, fp, sl, lsl #1 + 1f28c00: e08aa000 add sl, sl, r0 + 1f28c04: e18320b1 strh r2, [r3, r1] + 1f28c08: e35a0c02 cmp sl, #512 ; 0x200 + 1f28c0c: e0811005 add r1, r1, r5 + 1f28c10: bafffffa blt 1f28c00 + 1f28c14: e28d3ea2 add r3, sp, #2592 ; 0xa20 + 1f28c18: e28cc001 add ip, ip, #1 + 1f28c1c: e2833008 add r3, r3, #8 + 1f28c20: e0837007 add r7, r3, r7 + 1f28c24: e507c9ec str ip, [r7, #-2540] ; 0xfffff614 + 1f28c28: e28ee001 add lr, lr, #1 + 1f28c2c: e35e0013 cmp lr, #19 + 1f28c30: 1affffb8 bne 1f28b18 + 1f28c34: e59d5004 ldr r5, [sp, #4] + 1f28c38: e206601f and r6, r6, #31 + 1f28c3c: e2868001 add r8, r6, #1 + 1f28c40: e28d6f91 add r6, sp, #580 ; 0x244 + 1f28c44: e205501f and r5, r5, #31 + 1f28c48: e2857c01 add r7, r5, #256 ; 0x100 + 1f28c4c: e3a05000 mov r5, #0 + 1f28c50: e2877001 add r7, r7, #1 + 1f28c54: e0879008 add r9, r7, r8 + 1f28c58: e594e008 ldr lr, [r4, #8] + 1f28c5c: e35e000f cmp lr, #15 + 1f28c60: c594200c ldrgt r2, [r4, #12] + 1f28c64: ca000014 bgt 1f28cbc + 1f28c68: e594a004 ldr sl, [r4, #4] + 1f28c6c: e1a0300e mov r3, lr + 1f28c70: e594200c ldr r2, [r4, #12] + 1f28c74: e5940000 ldr r0, [r4] + 1f28c78: e15a0000 cmp sl, r0 + 1f28c7c: e280c001 add ip, r0, #1 + 1f28c80: 8584c000 strhi ip, [r4] + 1f28c84: e3a01000 mov r1, #0 + 1f28c88: 85d01000 ldrbhi r1, [r0] + 1f28c8c: 81a0000c movhi r0, ip + 1f28c90: 81a01311 lslhi r1, r1, r3 + 1f28c94: e2833008 add r3, r3, #8 + 1f28c98: e3530018 cmp r3, #24 + 1f28c9c: e1822001 orr r2, r2, r1 + 1f28ca0: e5843008 str r3, [r4, #8] + 1f28ca4: e584200c str r2, [r4, #12] + 1f28ca8: dafffff2 ble 1f28c78 + 1f28cac: e26e3018 rsb r3, lr, #24 + 1f28cb0: e28e1008 add r1, lr, #8 + 1f28cb4: e3c33007 bic r3, r3, #7 + 1f28cb8: e083e001 add lr, r3, r1 + 1f28cbc: e7e83052 ubfx r3, r2, #0, #9 + 1f28cc0: e1a03083 lsl r3, r3, #1 + 1f28cc4: e19600b3 ldrh r0, [r6, r3] + 1f28cc8: e3500000 cmp r0, #0 + 1f28ccc: 0a00004b beq 1f28e00 + 1f28cd0: e1a034c0 asr r3, r0, #9 + 1f28cd4: e7e80050 ubfx r0, r0, #0, #9 + 1f28cd8: e063100e rsb r1, r3, lr + 1f28cdc: e5841008 str r1, [r4, #8] + 1f28ce0: e1a03332 lsr r3, r2, r3 + 1f28ce4: e584300c str r3, [r4, #12] + 1f28ce8: e3500012 cmp r0, #18 + 1f28cec: ca000009 bgt 1f28d18 + 1f28cf0: e350000f cmp r0, #15 + 1f28cf4: ca000018 bgt 1f28d5c + 1f28cf8: e28d3ea2 add r3, sp, #2592 ; 0xa20 + 1f28cfc: e2833008 add r3, r3, #8 + 1f28d00: e0833005 add r3, r3, r5 + 1f28d04: e2855001 add r5, r5, #1 + 1f28d08: e54309ac strb r0, [r3, #-2476] ; 0xfffff654 + 1f28d0c: e1590005 cmp r9, r5 + 1f28d10: caffffd0 bgt 1f28c58 + 1f28d14: 0a0000ce beq 1f29054 + 1f28d18: e30a336c movw r3, #41836 ; 0xa36c + 1f28d1c: e340320d movt r3, #525 ; 0x20d + 1f28d20: e3002f18 movw r2, #3864 ; 0xf18 + 1f28d24: e34021f6 movt r2, #502 ; 0x1f6 + 1f28d28: e3a00000 mov r0, #0 + 1f28d2c: e5832000 str r2, [r3] + 1f28d30: e28ddea2 add sp, sp, #2592 ; 0xa20 + 1f28d34: e28dd00c add sp, sp, #12 + 1f28d38: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f28d3c: e3520c02 cmp r2, #512 ; 0x200 + 1f28d40: daffff06 ble 1f28960 + 1f28d44: e30a336c movw r3, #41836 ; 0xa36c + 1f28d48: e340320d movt r3, #525 ; 0x20d + 1f28d4c: e3002f18 movw r2, #3864 ; 0xf18 + 1f28d50: e34021f6 movt r2, #502 ; 0x1f6 + 1f28d54: e5832000 str r2, [r3] + 1f28d58: ea0000b9 b 1f29044 + 1f28d5c: e3500010 cmp r0, #16 + 1f28d60: 0a000080 beq 1f28f68 + 1f28d64: e3500011 cmp r0, #17 + 1f28d68: 0a000060 beq 1f28ef0 + 1f28d6c: e3510006 cmp r1, #6 + 1f28d70: ca000013 bgt 1f28dc4 + 1f28d74: e594a004 ldr sl, [r4, #4] + 1f28d78: e1a02001 mov r2, r1 + 1f28d7c: e594c000 ldr ip, [r4] + 1f28d80: e15a000c cmp sl, ip + 1f28d84: e28ce001 add lr, ip, #1 + 1f28d88: 8584e000 strhi lr, [r4] + 1f28d8c: e3a00000 mov r0, #0 + 1f28d90: 85dc0000 ldrbhi r0, [ip] + 1f28d94: 81a0c00e movhi ip, lr + 1f28d98: 81a00210 lslhi r0, r0, r2 + 1f28d9c: e2822008 add r2, r2, #8 + 1f28da0: e3520018 cmp r2, #24 + 1f28da4: e1833000 orr r3, r3, r0 + 1f28da8: e5842008 str r2, [r4, #8] + 1f28dac: e584300c str r3, [r4, #12] + 1f28db0: dafffff2 ble 1f28d80 + 1f28db4: e2612018 rsb r2, r1, #24 + 1f28db8: e2811008 add r1, r1, #8 + 1f28dbc: e3c22007 bic r2, r2, #7 + 1f28dc0: e0821001 add r1, r2, r1 + 1f28dc4: e203207f and r2, r3, #127 ; 0x7f + 1f28dc8: e2411007 sub r1, r1, #7 + 1f28dcc: e1a033a3 lsr r3, r3, #7 + 1f28dd0: e5841008 str r1, [r4, #8] + 1f28dd4: e282200b add r2, r2, #11 + 1f28dd8: e3a01000 mov r1, #0 + 1f28ddc: e584300c str r3, [r4, #12] + 1f28de0: e0653009 rsb r3, r5, r9 + 1f28de4: e1520003 cmp r2, r3 + 1f28de8: caffffca bgt 1f28d18 + 1f28dec: e28d307c add r3, sp, #124 ; 0x7c + 1f28df0: e0830005 add r0, r3, r5 + 1f28df4: e0855002 add r5, r5, r2 + 1f28df8: eb005887 bl 1f3f01c + 1f28dfc: eaffffc2 b 1f28d0c + 1f28e00: e1a0c0c2 asr ip, r2, #1 + 1f28e04: e1a00082 lsl r0, r2, #1 + 1f28e08: e3051555 movw r1, #21845 ; 0x5555 + 1f28e0c: e30a3aaa movw r3, #43690 ; 0xaaaa + 1f28e10: e0033000 and r3, r3, r0 + 1f28e14: e001100c and r1, r1, ip + 1f28e18: e1811003 orr r1, r1, r3 + 1f28e1c: e3030333 movw r0, #13107 ; 0x3333 + 1f28e20: e30c3ccc movw r3, #52428 ; 0xcccc + 1f28e24: e1a0c141 asr ip, r1, #2 + 1f28e28: e1a01101 lsl r1, r1, #2 + 1f28e2c: e000000c and r0, r0, ip + 1f28e30: e0033001 and r3, r3, r1 + 1f28e34: e1803003 orr r3, r0, r3 + 1f28e38: e30f10f0 movw r1, #61680 ; 0xf0f0 + 1f28e3c: e3000f0f movw r0, #3855 ; 0xf0f + 1f28e40: e1a0c243 asr ip, r3, #4 + 1f28e44: e1a03203 lsl r3, r3, #4 + 1f28e48: e000000c and r0, r0, ip + 1f28e4c: e0011003 and r1, r1, r3 + 1f28e50: e1801001 orr r1, r0, r1 + 1f28e54: e59d368c ldr r3, [sp, #1676] ; 0x68c + 1f28e58: e1a00401 lsl r0, r1, #8 + 1f28e5c: e6ff0070 uxth r0, r0 + 1f28e60: e1800421 orr r0, r0, r1, lsr #8 + 1f28e64: e1530000 cmp r3, r0 + 1f28e68: ca000061 bgt 1f28ff4 + 1f28e6c: e59d3690 ldr r3, [sp, #1680] ; 0x690 + 1f28e70: e1500003 cmp r0, r3 + 1f28e74: ba00006a blt 1f29024 + 1f28e78: e59d3694 ldr r3, [sp, #1684] ; 0x694 + 1f28e7c: e1530000 cmp r3, r0 + 1f28e80: ca000064 bgt 1f29018 + 1f28e84: e59d3698 ldr r3, [sp, #1688] ; 0x698 + 1f28e88: e1500003 cmp r0, r3 + 1f28e8c: ba00005e blt 1f2900c + 1f28e90: e59d369c ldr r3, [sp, #1692] ; 0x69c + 1f28e94: e1530000 cmp r3, r0 + 1f28e98: ca000058 bgt 1f29000 + 1f28e9c: e59d36a0 ldr r3, [sp, #1696] ; 0x6a0 + 1f28ea0: e1530000 cmp r3, r0 + 1f28ea4: daffff9b ble 1f28d18 + 1f28ea8: e3a0a001 mov sl, #1 + 1f28eac: e3a0100f mov r1, #15 + 1f28eb0: e281bc02 add fp, r1, #512 ; 0x200 + 1f28eb4: e281ce23 add ip, r1, #560 ; 0x230 + 1f28eb8: e1a03132 lsr r3, r2, r1 + 1f28ebc: e061100e rsb r1, r1, lr + 1f28ec0: e1a0b08b lsl fp, fp, #1 + 1f28ec4: e086208c add r2, r6, ip, lsl #1 + 1f28ec8: e584300c str r3, [r4, #12] + 1f28ecc: e5841008 str r1, [r4, #8] + 1f28ed0: e196c0bb ldrh ip, [r6, fp] + 1f28ed4: e1d220b4 ldrh r2, [r2, #4] + 1f28ed8: e06c0a50 rsb r0, ip, r0, asr sl + 1f28edc: e0802002 add r2, r0, r2 + 1f28ee0: e2822e2d add r2, r2, #720 ; 0x2d0 + 1f28ee4: e0862082 add r2, r6, r2, lsl #1 + 1f28ee8: e1d200b4 ldrh r0, [r2, #4] + 1f28eec: eaffff7d b 1f28ce8 + 1f28ef0: e3510002 cmp r1, #2 + 1f28ef4: ca000013 bgt 1f28f48 + 1f28ef8: e594a004 ldr sl, [r4, #4] + 1f28efc: e1a02001 mov r2, r1 + 1f28f00: e594c000 ldr ip, [r4] + 1f28f04: e15a000c cmp sl, ip + 1f28f08: e28ce001 add lr, ip, #1 + 1f28f0c: 8584e000 strhi lr, [r4] + 1f28f10: e3a00000 mov r0, #0 + 1f28f14: 85dc0000 ldrbhi r0, [ip] + 1f28f18: 81a0c00e movhi ip, lr + 1f28f1c: 81a00210 lslhi r0, r0, r2 + 1f28f20: e2822008 add r2, r2, #8 + 1f28f24: e3520018 cmp r2, #24 + 1f28f28: e1833000 orr r3, r3, r0 + 1f28f2c: e5842008 str r2, [r4, #8] + 1f28f30: e584300c str r3, [r4, #12] + 1f28f34: dafffff2 ble 1f28f04 + 1f28f38: e2612018 rsb r2, r1, #24 + 1f28f3c: e2811008 add r1, r1, #8 + 1f28f40: e3c22007 bic r2, r2, #7 + 1f28f44: e0821001 add r1, r2, r1 + 1f28f48: e2032007 and r2, r3, #7 + 1f28f4c: e2411003 sub r1, r1, #3 + 1f28f50: e1a031a3 lsr r3, r3, #3 + 1f28f54: e5841008 str r1, [r4, #8] + 1f28f58: e2822003 add r2, r2, #3 + 1f28f5c: e584300c str r3, [r4, #12] + 1f28f60: e3a01000 mov r1, #0 + 1f28f64: eaffff9d b 1f28de0 + 1f28f68: e3510001 cmp r1, #1 + 1f28f6c: ca000013 bgt 1f28fc0 + 1f28f70: e594a004 ldr sl, [r4, #4] + 1f28f74: e1a02001 mov r2, r1 + 1f28f78: e594c000 ldr ip, [r4] + 1f28f7c: e15a000c cmp sl, ip + 1f28f80: e28ce001 add lr, ip, #1 + 1f28f84: 8584e000 strhi lr, [r4] + 1f28f88: e3a00000 mov r0, #0 + 1f28f8c: 85dc0000 ldrbhi r0, [ip] + 1f28f90: 81a0c00e movhi ip, lr + 1f28f94: 81a00210 lslhi r0, r0, r2 + 1f28f98: e2822008 add r2, r2, #8 + 1f28f9c: e3520018 cmp r2, #24 + 1f28fa0: e1833000 orr r3, r3, r0 + 1f28fa4: e5842008 str r2, [r4, #8] + 1f28fa8: e584300c str r3, [r4, #12] + 1f28fac: dafffff2 ble 1f28f7c + 1f28fb0: e2612018 rsb r2, r1, #24 + 1f28fb4: e2811008 add r1, r1, #8 + 1f28fb8: e3c22007 bic r2, r2, #7 + 1f28fbc: e0821001 add r1, r2, r1 + 1f28fc0: e3550000 cmp r5, #0 + 1f28fc4: e2032003 and r2, r3, #3 + 1f28fc8: e2411002 sub r1, r1, #2 + 1f28fcc: e1a03123 lsr r3, r3, #2 + 1f28fd0: e2822003 add r2, r2, #3 + 1f28fd4: e5841008 str r1, [r4, #8] + 1f28fd8: e584300c str r3, [r4, #12] + 1f28fdc: 0affff4d beq 1f28d18 + 1f28fe0: e28d3ea2 add r3, sp, #2592 ; 0xa20 + 1f28fe4: e2833008 add r3, r3, #8 + 1f28fe8: e0833005 add r3, r3, r5 + 1f28fec: e55319ad ldrb r1, [r3, #-2477] ; 0xfffff653 + 1f28ff0: eaffff7a b 1f28de0 + 1f28ff4: e3a0a006 mov sl, #6 + 1f28ff8: e3a0100a mov r1, #10 + 1f28ffc: eaffffab b 1f28eb0 + 1f29000: e3a0a002 mov sl, #2 + 1f29004: e3a0100e mov r1, #14 + 1f29008: eaffffa8 b 1f28eb0 + 1f2900c: e3a0a003 mov sl, #3 + 1f29010: e3a0100d mov r1, #13 + 1f29014: eaffffa5 b 1f28eb0 + 1f29018: e3a0a004 mov sl, #4 + 1f2901c: e3a0100c mov r1, #12 + 1f29020: eaffffa2 b 1f28eb0 + 1f29024: e3a0a005 mov sl, #5 + 1f29028: e3a0100b mov r1, #11 + 1f2902c: eaffff9f b 1f28eb0 + 1f29030: e30a336c movw r3, #41836 ; 0xa36c + 1f29034: e340320d movt r3, #525 ; 0x20d + 1f29038: e3002f0c movw r2, #3852 ; 0xf0c + 1f2903c: e34021f6 movt r2, #502 ; 0x1f6 + 1f29040: e5832000 str r2, [r3] + 1f29044: e3a00000 mov r0, #0 + 1f29048: e28ddea2 add sp, sp, #2592 ; 0xa20 + 1f2904c: e28dd00c add sp, sp, #12 + 1f29050: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f29054: e1a02007 mov r2, r7 + 1f29058: e28d107c add r1, sp, #124 ; 0x7c + 1f2905c: e2840020 add r0, r4, #32 + 1f29060: ebfffb6f bl 1f27e24 + 1f29064: e3500000 cmp r0, #0 + 1f29068: 0affff30 beq 1f28d30 + 1f2906c: e28d307c add r3, sp, #124 ; 0x7c + 1f29070: e2840b02 add r0, r4, #2048 ; 0x800 + 1f29074: e1a02008 mov r2, r8 + 1f29078: e2800004 add r0, r0, #4 + 1f2907c: e0831007 add r1, r3, r7 + 1f29080: ebfffb67 bl 1f27e24 + 1f29084: e2900000 adds r0, r0, #0 + 1f29088: 13a00001 movne r0, #1 + 1f2908c: eaffff27 b 1f28d30 + +01f29090 : + 1f29090: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f29094: e3510000 cmp r1, #0 + 1f29098: e24dd0bc sub sp, sp, #188 ; 0xbc + 1f2909c: 1a00069d bne 1f2ab18 + 1f290a0: e3a03000 mov r3, #0 + 1f290a4: e30121a8 movw r2, #4520 ; 0x11a8 + 1f290a8: e34021f6 movt r2, #502 ; 0x1f6 + 1f290ac: e1a06002 mov r6, r2 + 1f290b0: e1a05003 mov r5, r3 + 1f290b4: e5803008 str r3, [r0, #8] + 1f290b8: e1a02003 mov r2, r3 + 1f290bc: e580300c str r3, [r0, #12] + 1f290c0: e3013350 movw r3, #4944 ; 0x1350 + 1f290c4: e34031f6 movt r3, #502 ; 0x1f6 + 1f290c8: e1a04000 mov r4, r0 + 1f290cc: e1a07003 mov r7, r3 + 1f290d0: e3520000 cmp r2, #0 + 1f290d4: ca000013 bgt 1f29128 + 1f290d8: e594e004 ldr lr, [r4, #4] + 1f290dc: e1a03002 mov r3, r2 + 1f290e0: e5940000 ldr r0, [r4] + 1f290e4: e15e0000 cmp lr, r0 + 1f290e8: e280c001 add ip, r0, #1 + 1f290ec: 8584c000 strhi ip, [r4] + 1f290f0: e3a01000 mov r1, #0 + 1f290f4: 85d01000 ldrbhi r1, [r0] + 1f290f8: 81a0000c movhi r0, ip + 1f290fc: 81a01311 lslhi r1, r1, r3 + 1f29100: e2833008 add r3, r3, #8 + 1f29104: e3530018 cmp r3, #24 + 1f29108: e1855001 orr r5, r5, r1 + 1f2910c: e5843008 str r3, [r4, #8] + 1f29110: e584500c str r5, [r4, #12] + 1f29114: dafffff2 ble 1f290e4 + 1f29118: e2623018 rsb r3, r2, #24 + 1f2911c: e2822008 add r2, r2, #8 + 1f29120: e3c33007 bic r3, r3, #7 + 1f29124: e0832002 add r2, r3, r2 + 1f29128: e2423001 sub r3, r2, #1 + 1f2912c: e1a010a5 lsr r1, r5, #1 + 1f29130: e3530001 cmp r3, #1 + 1f29134: e2050001 and r0, r5, #1 + 1f29138: e5843008 str r3, [r4, #8] + 1f2913c: e584100c str r1, [r4, #12] + 1f29140: e58d0000 str r0, [sp] + 1f29144: ca000012 bgt 1f29194 + 1f29148: e5945004 ldr r5, [r4, #4] + 1f2914c: e594c000 ldr ip, [r4] + 1f29150: e155000c cmp r5, ip + 1f29154: e28ce001 add lr, ip, #1 + 1f29158: 8584e000 strhi lr, [r4] + 1f2915c: e3a00000 mov r0, #0 + 1f29160: 85dc0000 ldrbhi r0, [ip] + 1f29164: 81a0c00e movhi ip, lr + 1f29168: 81a00310 lslhi r0, r0, r3 + 1f2916c: e2833008 add r3, r3, #8 + 1f29170: e3530018 cmp r3, #24 + 1f29174: e1811000 orr r1, r1, r0 + 1f29178: e5843008 str r3, [r4, #8] + 1f2917c: e584100c str r1, [r4, #12] + 1f29180: dafffff2 ble 1f29150 + 1f29184: e2623019 rsb r3, r2, #25 + 1f29188: e2822007 add r2, r2, #7 + 1f2918c: e3c33007 bic r3, r3, #7 + 1f29190: e0833002 add r3, r3, r2 + 1f29194: e2112003 ands r2, r1, #3 + 1f29198: e2433002 sub r3, r3, #2 + 1f2919c: e1a01121 lsr r1, r1, #2 + 1f291a0: e5843008 str r3, [r4, #8] + 1f291a4: e584100c str r1, [r4, #12] + 1f291a8: 0a0002c2 beq 1f29cb8 + 1f291ac: e3520003 cmp r2, #3 + 1f291b0: 0a00019b beq 1f29824 + 1f291b4: e3520001 cmp r2, #1 + 1f291b8: 0a0002eb beq 1f29d6c + 1f291bc: e1a00004 mov r0, r4 + 1f291c0: ebfffc9a bl 1f28430 + 1f291c4: e3500000 cmp r0, #0 + 1f291c8: 0a000195 beq 1f29824 + 1f291cc: e5943010 ldr r3, [r4, #16] + 1f291d0: e5949008 ldr r9, [r4, #8] + 1f291d4: e359000f cmp r9, #15 + 1f291d8: c594100c ldrgt r1, [r4, #12] + 1f291dc: ca000014 bgt 1f29234 + 1f291e0: e5945004 ldr r5, [r4, #4] + 1f291e4: e1a02009 mov r2, r9 + 1f291e8: e594100c ldr r1, [r4, #12] + 1f291ec: e594c000 ldr ip, [r4] + 1f291f0: e155000c cmp r5, ip + 1f291f4: e28ce001 add lr, ip, #1 + 1f291f8: 8584e000 strhi lr, [r4] + 1f291fc: e3a00000 mov r0, #0 + 1f29200: 85dc0000 ldrbhi r0, [ip] + 1f29204: 81a0c00e movhi ip, lr + 1f29208: 81a00210 lslhi r0, r0, r2 + 1f2920c: e2822008 add r2, r2, #8 + 1f29210: e3520018 cmp r2, #24 + 1f29214: e1811000 orr r1, r1, r0 + 1f29218: e5842008 str r2, [r4, #8] + 1f2921c: e584100c str r1, [r4, #12] + 1f29220: dafffff2 ble 1f291f0 + 1f29224: e2690018 rsb r0, r9, #24 + 1f29228: e2892008 add r2, r9, #8 + 1f2922c: e3c00007 bic r0, r0, #7 + 1f29230: e0809002 add r9, r0, r2 + 1f29234: e7e82051 ubfx r2, r1, #0, #9 + 1f29238: e0842082 add r2, r4, r2, lsl #1 + 1f2923c: e1d282b0 ldrh r8, [r2, #32] + 1f29240: e3580000 cmp r8, #0 + 1f29244: 0a000147 beq 1f29768 + 1f29248: e1a004c8 asr r0, r8, #9 + 1f2924c: e7e88058 ubfx r8, r8, #0, #9 + 1f29250: e0602009 rsb r2, r0, r9 + 1f29254: e5842008 str r2, [r4, #8] + 1f29258: e1a01031 lsr r1, r1, r0 + 1f2925c: e584100c str r1, [r4, #12] + 1f29260: e35800ff cmp r8, #255 ; 0xff + 1f29264: ca00001a bgt 1f292d4 + 1f29268: e5945018 ldr r5, [r4, #24] + 1f2926c: e1550003 cmp r5, r3 + 1f29270: 8a000014 bhi 1f292c8 + 1f29274: e594201c ldr r2, [r4, #28] + 1f29278: e5843010 str r3, [r4, #16] + 1f2927c: e3520000 cmp r2, #0 + 1f29280: 0a000267 beq 1f29c24 + 1f29284: e5940014 ldr r0, [r4, #20] + 1f29288: e0609003 rsb r9, r0, r3 + 1f2928c: e0605005 rsb r5, r0, r5 + 1f29290: e1590005 cmp r9, r5 + 1f29294: ba000002 blt 1f292a4 + 1f29298: e1a05085 lsl r5, r5, #1 + 1f2929c: e1590005 cmp r9, r5 + 1f292a0: aafffffc bge 1f29298 + 1f292a4: e1a01005 mov r1, r5 + 1f292a8: eb0057d3 bl 1f3f1fc + 1f292ac: e3500000 cmp r0, #0 + 1f292b0: 0a000261 beq 1f29c3c + 1f292b4: e0803009 add r3, r0, r9 + 1f292b8: e0805005 add r5, r0, r5 + 1f292bc: e5843010 str r3, [r4, #16] + 1f292c0: e5845018 str r5, [r4, #24] + 1f292c4: e5840014 str r0, [r4, #20] + 1f292c8: e5c38000 strb r8, [r3] + 1f292cc: e2833001 add r3, r3, #1 + 1f292d0: eaffffbe b 1f291d0 + 1f292d4: e3580c01 cmp r8, #256 ; 0x100 + 1f292d8: 0a000575 beq 1f2a8b4 + 1f292dc: e2488c01 sub r8, r8, #256 ; 0x100 + 1f292e0: e2488001 sub r8, r8, #1 + 1f292e4: e7979108 ldr r9, [r7, r8, lsl #2] + 1f292e8: e7965108 ldr r5, [r6, r8, lsl #2] + 1f292ec: e3590000 cmp r9, #0 + 1f292f0: 1a00018b bne 1f29924 + 1f292f4: e352000f cmp r2, #15 + 1f292f8: ca000013 bgt 1f2934c + 1f292fc: e5949004 ldr r9, [r4, #4] + 1f29300: e1a00002 mov r0, r2 + 1f29304: e594e000 ldr lr, [r4] + 1f29308: e159000e cmp r9, lr + 1f2930c: e28e8001 add r8, lr, #1 + 1f29310: 85848000 strhi r8, [r4] + 1f29314: e3a0c000 mov ip, #0 + 1f29318: 85dec000 ldrbhi ip, [lr] + 1f2931c: 81a0e008 movhi lr, r8 + 1f29320: 81a0c01c lslhi ip, ip, r0 + 1f29324: e2800008 add r0, r0, #8 + 1f29328: e3500018 cmp r0, #24 + 1f2932c: e181100c orr r1, r1, ip + 1f29330: e5840008 str r0, [r4, #8] + 1f29334: e584100c str r1, [r4, #12] + 1f29338: dafffff2 ble 1f29308 + 1f2933c: e2620018 rsb r0, r2, #24 + 1f29340: e2822008 add r2, r2, #8 + 1f29344: e3c00007 bic r0, r0, #7 + 1f29348: e0802002 add r2, r0, r2 + 1f2934c: e7e80051 ubfx r0, r1, #0, #9 + 1f29350: e284cb02 add ip, r4, #2048 ; 0x800 + 1f29354: e28cc004 add ip, ip, #4 + 1f29358: e1a00080 lsl r0, r0, #1 + 1f2935c: e19c00b0 ldrh r0, [ip, r0] + 1f29360: e3500000 cmp r0, #0 + 1f29364: 0a000131 beq 1f29830 + 1f29368: e1a0c4c0 asr ip, r0, #9 + 1f2936c: e7e80050 ubfx r0, r0, #0, #9 + 1f29370: e06c2002 rsb r2, ip, r2 + 1f29374: e5842008 str r2, [r4, #8] + 1f29378: e1a01c31 lsr r1, r1, ip + 1f2937c: e584100c str r1, [r4, #12] + 1f29380: e300ee58 movw lr, #3672 ; 0xe58 + 1f29384: e340e1f6 movt lr, #502 ; 0x1f6 + 1f29388: e301c3d0 movw ip, #5072 ; 0x13d0 + 1f2938c: e340c1f6 movt ip, #502 ; 0x1f6 + 1f29390: e79ee100 ldr lr, [lr, r0, lsl #2] + 1f29394: e79c9100 ldr r9, [ip, r0, lsl #2] + 1f29398: e35e0000 cmp lr, #0 + 1f2939c: 1a000179 bne 1f29988 + 1f293a0: e5940014 ldr r0, [r4, #20] + 1f293a4: e060b003 rsb fp, r0, r3 + 1f293a8: e15b0009 cmp fp, r9 + 1f293ac: ba000191 blt 1f299f8 + 1f293b0: e5948018 ldr r8, [r4, #24] + 1f293b4: e0832005 add r2, r3, r5 + 1f293b8: e1a0a005 mov sl, r5 + 1f293bc: e1580002 cmp r8, r2 + 1f293c0: 2a000013 bcs 1f29414 + 1f293c4: e594201c ldr r2, [r4, #28] + 1f293c8: e5843010 str r3, [r4, #16] + 1f293cc: e3520000 cmp r2, #0 + 1f293d0: 0a000213 beq 1f29c24 + 1f293d4: e0608008 rsb r8, r0, r8 + 1f293d8: e08b3005 add r3, fp, r5 + 1f293dc: e1530008 cmp r3, r8 + 1f293e0: da000002 ble 1f293f0 + 1f293e4: e1a08088 lsl r8, r8, #1 + 1f293e8: e1530008 cmp r3, r8 + 1f293ec: cafffffc bgt 1f293e4 + 1f293f0: e1a01008 mov r1, r8 + 1f293f4: eb005780 bl 1f3f1fc + 1f293f8: e3500000 cmp r0, #0 + 1f293fc: 0a00020e beq 1f29c3c + 1f29400: e080300b add r3, r0, fp + 1f29404: e0808008 add r8, r0, r8 + 1f29408: e5843010 str r3, [r4, #16] + 1f2940c: e5848018 str r8, [r4, #24] + 1f29410: e5840014 str r0, [r4, #20] + 1f29414: e3590001 cmp r9, #1 + 1f29418: e0692003 rsb r2, r9, r3 + 1f2941c: 0a00017b beq 1f29a10 + 1f29420: e3550000 cmp r5, #0 + 1f29424: 0affff69 beq 1f291d0 + 1f29428: e2690010 rsb r0, r9, #16 + 1f2942c: e2831010 add r1, r3, #16 + 1f29430: e3500000 cmp r0, #0 + 1f29434: c3a00000 movgt r0, #0 + 1f29438: d3a00001 movle r0, #1 + 1f2943c: e1520001 cmp r2, r1 + 1f29440: 31a01000 movcc r1, r0 + 1f29444: 23801001 orrcs r1, r0, #1 + 1f29448: e3550013 cmp r5, #19 + 1f2944c: 93a01000 movls r1, #0 + 1f29450: 82011001 andhi r1, r1, #1 + 1f29454: e3510000 cmp r1, #0 + 1f29458: 0a0001fd beq 1f29c54 + 1f2945c: e2021007 and r1, r2, #7 + 1f29460: e2611000 rsb r1, r1, #0 + 1f29464: e201100f and r1, r1, #15 + 1f29468: e1510005 cmp r1, r5 + 1f2946c: 21a01005 movcs r1, r5 + 1f29470: e3510000 cmp r1, #0 + 1f29474: 01a00003 moveq r0, r3 + 1f29478: 0a000066 beq 1f29618 + 1f2947c: e3510001 cmp r1, #1 + 1f29480: e5d20000 ldrb r0, [r2] + 1f29484: e5c30000 strb r0, [r3] + 1f29488: e282c001 add ip, r2, #1 + 1f2948c: e2830001 add r0, r3, #1 + 1f29490: e245e001 sub lr, r5, #1 + 1f29494: 0a0001b2 beq 1f29b64 + 1f29498: e3510002 cmp r1, #2 + 1f2949c: e5d20001 ldrb r0, [r2, #1] + 1f294a0: e5c30001 strb r0, [r3, #1] + 1f294a4: e282c002 add ip, r2, #2 + 1f294a8: e2830002 add r0, r3, #2 + 1f294ac: e245e002 sub lr, r5, #2 + 1f294b0: 0a0001ab beq 1f29b64 + 1f294b4: e3510003 cmp r1, #3 + 1f294b8: e5d20002 ldrb r0, [r2, #2] + 1f294bc: e5c30002 strb r0, [r3, #2] + 1f294c0: e282c003 add ip, r2, #3 + 1f294c4: e2830003 add r0, r3, #3 + 1f294c8: e245e003 sub lr, r5, #3 + 1f294cc: 0a0001a4 beq 1f29b64 + 1f294d0: e3510004 cmp r1, #4 + 1f294d4: e5d20003 ldrb r0, [r2, #3] + 1f294d8: e5c30003 strb r0, [r3, #3] + 1f294dc: e282c004 add ip, r2, #4 + 1f294e0: e2830004 add r0, r3, #4 + 1f294e4: e245e004 sub lr, r5, #4 + 1f294e8: 0a00019d beq 1f29b64 + 1f294ec: e3510005 cmp r1, #5 + 1f294f0: e5d20004 ldrb r0, [r2, #4] + 1f294f4: e5c30004 strb r0, [r3, #4] + 1f294f8: e282c005 add ip, r2, #5 + 1f294fc: e2830005 add r0, r3, #5 + 1f29500: e245e005 sub lr, r5, #5 + 1f29504: 0a000196 beq 1f29b64 + 1f29508: e3510006 cmp r1, #6 + 1f2950c: e5d20005 ldrb r0, [r2, #5] + 1f29510: e5c30005 strb r0, [r3, #5] + 1f29514: e282c006 add ip, r2, #6 + 1f29518: e2830006 add r0, r3, #6 + 1f2951c: e245e006 sub lr, r5, #6 + 1f29520: 0a00018f beq 1f29b64 + 1f29524: e3510007 cmp r1, #7 + 1f29528: e5d20006 ldrb r0, [r2, #6] + 1f2952c: e5c30006 strb r0, [r3, #6] + 1f29530: e282c007 add ip, r2, #7 + 1f29534: e2830007 add r0, r3, #7 + 1f29538: e245e007 sub lr, r5, #7 + 1f2953c: 0a000188 beq 1f29b64 + 1f29540: e3510008 cmp r1, #8 + 1f29544: e5d20007 ldrb r0, [r2, #7] + 1f29548: e5c30007 strb r0, [r3, #7] + 1f2954c: e282c008 add ip, r2, #8 + 1f29550: e2830008 add r0, r3, #8 + 1f29554: e245e008 sub lr, r5, #8 + 1f29558: 0a000181 beq 1f29b64 + 1f2955c: e3510009 cmp r1, #9 + 1f29560: e5d20008 ldrb r0, [r2, #8] + 1f29564: e5c30008 strb r0, [r3, #8] + 1f29568: e282c009 add ip, r2, #9 + 1f2956c: e2830009 add r0, r3, #9 + 1f29570: e245e009 sub lr, r5, #9 + 1f29574: 0a00017a beq 1f29b64 + 1f29578: e351000a cmp r1, #10 + 1f2957c: e5d20009 ldrb r0, [r2, #9] + 1f29580: e5c30009 strb r0, [r3, #9] + 1f29584: e282c00a add ip, r2, #10 + 1f29588: e283000a add r0, r3, #10 + 1f2958c: e245e00a sub lr, r5, #10 + 1f29590: 0a000173 beq 1f29b64 + 1f29594: e351000b cmp r1, #11 + 1f29598: e5d2000a ldrb r0, [r2, #10] + 1f2959c: e5c3000a strb r0, [r3, #10] + 1f295a0: e282c00b add ip, r2, #11 + 1f295a4: e283000b add r0, r3, #11 + 1f295a8: e245e00b sub lr, r5, #11 + 1f295ac: 0a00016c beq 1f29b64 + 1f295b0: e351000c cmp r1, #12 + 1f295b4: e5d2000b ldrb r0, [r2, #11] + 1f295b8: e5c3000b strb r0, [r3, #11] + 1f295bc: e282c00c add ip, r2, #12 + 1f295c0: e283000c add r0, r3, #12 + 1f295c4: e245e00c sub lr, r5, #12 + 1f295c8: 0a000165 beq 1f29b64 + 1f295cc: e351000d cmp r1, #13 + 1f295d0: e5d2000c ldrb r0, [r2, #12] + 1f295d4: e5c3000c strb r0, [r3, #12] + 1f295d8: e282c00d add ip, r2, #13 + 1f295dc: e283000d add r0, r3, #13 + 1f295e0: e245e00d sub lr, r5, #13 + 1f295e4: 0a00015e beq 1f29b64 + 1f295e8: e351000f cmp r1, #15 + 1f295ec: e5d2000d ldrb r0, [r2, #13] + 1f295f0: e5c3000d strb r0, [r3, #13] + 1f295f4: e282c00e add ip, r2, #14 + 1f295f8: e283000e add r0, r3, #14 + 1f295fc: e245e00e sub lr, r5, #14 + 1f29600: 1a000157 bne 1f29b64 + 1f29604: e5d2000e ldrb r0, [r2, #14] + 1f29608: e245500f sub r5, r5, #15 + 1f2960c: e5c3000e strb r0, [r3, #14] + 1f29610: e282200f add r2, r2, #15 + 1f29614: e283000f add r0, r3, #15 + 1f29618: e061800a rsb r8, r1, sl + 1f2961c: e24ae001 sub lr, sl, #1 + 1f29620: e248c010 sub ip, r8, #16 + 1f29624: e061e00e rsb lr, r1, lr + 1f29628: e35e000e cmp lr, #14 + 1f2962c: e1a0c22c lsr ip, ip, #4 + 1f29630: e28cc001 add ip, ip, #1 + 1f29634: e1a0e20c lsl lr, ip, #4 + 1f29638: 9a00000f bls 1f2967c + 1f2963c: e0699001 rsb r9, r9, r1 + 1f29640: e3a0b000 mov fp, #0 + 1f29644: e0831001 add r1, r3, r1 + 1f29648: e0839009 add r9, r3, r9 + 1f2964c: f4690adf vld1.64 {d16-d17}, [r9 :64] + 1f29650: e28bb001 add fp, fp, #1 + 1f29654: e15c000b cmp ip, fp + 1f29658: e2899010 add r9, r9, #16 + 1f2965c: f4410a0f vst1.8 {d16-d17}, [r1] + 1f29660: e2811010 add r1, r1, #16 + 1f29664: 8afffff8 bhi 1f2964c + 1f29668: e15e0008 cmp lr, r8 + 1f2966c: e080000e add r0, r0, lr + 1f29670: e082200e add r2, r2, lr + 1f29674: e06e5005 rsb r5, lr, r5 + 1f29678: 0a000038 beq 1f29760 + 1f2967c: e3550001 cmp r5, #1 + 1f29680: e5d21000 ldrb r1, [r2] + 1f29684: e5c01000 strb r1, [r0] + 1f29688: 0a000034 beq 1f29760 + 1f2968c: e3550002 cmp r5, #2 + 1f29690: e5d21001 ldrb r1, [r2, #1] + 1f29694: e5c01001 strb r1, [r0, #1] + 1f29698: 0a000030 beq 1f29760 + 1f2969c: e3550003 cmp r5, #3 + 1f296a0: e5d21002 ldrb r1, [r2, #2] + 1f296a4: e5c01002 strb r1, [r0, #2] + 1f296a8: 0a00002c beq 1f29760 + 1f296ac: e3550004 cmp r5, #4 + 1f296b0: e5d21003 ldrb r1, [r2, #3] + 1f296b4: e5c01003 strb r1, [r0, #3] + 1f296b8: 0a000028 beq 1f29760 + 1f296bc: e3550005 cmp r5, #5 + 1f296c0: e5d21004 ldrb r1, [r2, #4] + 1f296c4: e5c01004 strb r1, [r0, #4] + 1f296c8: 0a000024 beq 1f29760 + 1f296cc: e3550006 cmp r5, #6 + 1f296d0: e5d21005 ldrb r1, [r2, #5] + 1f296d4: e5c01005 strb r1, [r0, #5] + 1f296d8: 0a000020 beq 1f29760 + 1f296dc: e3550007 cmp r5, #7 + 1f296e0: e5d21006 ldrb r1, [r2, #6] + 1f296e4: e5c01006 strb r1, [r0, #6] + 1f296e8: 0a00001c beq 1f29760 + 1f296ec: e3550008 cmp r5, #8 + 1f296f0: e5d21007 ldrb r1, [r2, #7] + 1f296f4: e5c01007 strb r1, [r0, #7] + 1f296f8: 0a000018 beq 1f29760 + 1f296fc: e3550009 cmp r5, #9 + 1f29700: e5d21008 ldrb r1, [r2, #8] + 1f29704: e5c01008 strb r1, [r0, #8] + 1f29708: 0a000014 beq 1f29760 + 1f2970c: e355000a cmp r5, #10 + 1f29710: e5d21009 ldrb r1, [r2, #9] + 1f29714: e5c01009 strb r1, [r0, #9] + 1f29718: 0a000010 beq 1f29760 + 1f2971c: e355000b cmp r5, #11 + 1f29720: e5d2100a ldrb r1, [r2, #10] + 1f29724: e5c0100a strb r1, [r0, #10] + 1f29728: 0a00000c beq 1f29760 + 1f2972c: e355000c cmp r5, #12 + 1f29730: e5d2100b ldrb r1, [r2, #11] + 1f29734: e5c0100b strb r1, [r0, #11] + 1f29738: 0a000008 beq 1f29760 + 1f2973c: e355000d cmp r5, #13 + 1f29740: e5d2100c ldrb r1, [r2, #12] + 1f29744: e5c0100c strb r1, [r0, #12] + 1f29748: 0a000004 beq 1f29760 + 1f2974c: e5d2100d ldrb r1, [r2, #13] + 1f29750: e355000e cmp r5, #14 + 1f29754: e5c0100d strb r1, [r0, #13] + 1f29758: 15d2200e ldrbne r2, [r2, #14] + 1f2975c: 15c0200e strbne r2, [r0, #14] + 1f29760: e083300a add r3, r3, sl + 1f29764: eafffe99 b 1f291d0 + 1f29768: e1a0e0c1 asr lr, r1, #1 + 1f2976c: e1a00081 lsl r0, r1, #1 + 1f29770: e305c555 movw ip, #21845 ; 0x5555 + 1f29774: e30a2aaa movw r2, #43690 ; 0xaaaa + 1f29778: e0022000 and r2, r2, r0 + 1f2977c: e00cc00e and ip, ip, lr + 1f29780: e18cc002 orr ip, ip, r2 + 1f29784: e3030333 movw r0, #13107 ; 0x3333 + 1f29788: e30c2ccc movw r2, #52428 ; 0xcccc + 1f2978c: e300ef0f movw lr, #3855 ; 0xf0f + 1f29790: e1a0514c asr r5, ip, #2 + 1f29794: e1a0c10c lsl ip, ip, #2 + 1f29798: e0000005 and r0, r0, r5 + 1f2979c: e002200c and r2, r2, ip + 1f297a0: e1802002 orr r2, r0, r2 + 1f297a4: e30f00f0 movw r0, #61680 ; 0xf0f0 + 1f297a8: e594c468 ldr ip, [r4, #1128] ; 0x468 + 1f297ac: e1a05242 asr r5, r2, #4 + 1f297b0: e1a02202 lsl r2, r2, #4 + 1f297b4: e0000002 and r0, r0, r2 + 1f297b8: e00ee005 and lr, lr, r5 + 1f297bc: e18e0000 orr r0, lr, r0 + 1f297c0: e1a02400 lsl r2, r0, #8 + 1f297c4: e6ff2072 uxth r2, r2 + 1f297c8: e1820420 orr r0, r2, r0, lsr #8 + 1f297cc: e150000c cmp r0, ip + 1f297d0: ba000104 blt 1f29be8 + 1f297d4: e594246c ldr r2, [r4, #1132] ; 0x46c + 1f297d8: e1500002 cmp r0, r2 + 1f297dc: ba0000fe blt 1f29bdc + 1f297e0: e5942470 ldr r2, [r4, #1136] ; 0x470 + 1f297e4: e1500002 cmp r0, r2 + 1f297e8: ba0000f8 blt 1f29bd0 + 1f297ec: e5942474 ldr r2, [r4, #1140] ; 0x474 + 1f297f0: e1500002 cmp r0, r2 + 1f297f4: ba0000f2 blt 1f29bc4 + 1f297f8: e5942478 ldr r2, [r4, #1144] ; 0x478 + 1f297fc: e1500002 cmp r0, r2 + 1f29800: ba0000ec blt 1f29bb8 + 1f29804: e594247c ldr r2, [r4, #1148] ; 0x47c + 1f29808: e1500002 cmp r0, r2 + 1f2980c: ba0000d7 blt 1f29b70 + 1f29810: e30a336c movw r3, #41836 ; 0xa36c + 1f29814: e340320d movt r3, #525 ; 0x20d + 1f29818: e3002f9c movw r2, #3996 ; 0xf9c + 1f2981c: e34021f6 movt r2, #502 ; 0x1f6 + 1f29820: e5832000 str r2, [r3] + 1f29824: e3a00000 mov r0, #0 + 1f29828: e28dd0bc add sp, sp, #188 ; 0xbc + 1f2982c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f29830: e1a090c1 asr r9, r1, #1 + 1f29834: e1a08081 lsl r8, r1, #1 + 1f29838: e305e555 movw lr, #21845 ; 0x5555 + 1f2983c: e30a0aaa movw r0, #43690 ; 0xaaaa + 1f29840: e00ee009 and lr, lr, r9 + 1f29844: e0000008 and r0, r0, r8 + 1f29848: e18e0000 orr r0, lr, r0 + 1f2984c: e3039333 movw r9, #13107 ; 0x3333 + 1f29850: e30ceccc movw lr, #52428 ; 0xcccc + 1f29854: e3008f0f movw r8, #3855 ; 0xf0f + 1f29858: e1a0a140 asr sl, r0, #2 + 1f2985c: e1a00100 lsl r0, r0, #2 + 1f29860: e009900a and r9, r9, sl + 1f29864: e00ee000 and lr, lr, r0 + 1f29868: e189e00e orr lr, r9, lr + 1f2986c: e30f00f0 movw r0, #61680 ; 0xf0f0 + 1f29870: e5949c4c ldr r9, [r4, #3148] ; 0xc4c + 1f29874: e1a0a24e asr sl, lr, #4 + 1f29878: e1a0e20e lsl lr, lr, #4 + 1f2987c: e000000e and r0, r0, lr + 1f29880: e008800a and r8, r8, sl + 1f29884: e1880000 orr r0, r8, r0 + 1f29888: e1a0e400 lsl lr, r0, #8 + 1f2988c: e6ffe07e uxth lr, lr + 1f29890: e18e0420 orr r0, lr, r0, lsr #8 + 1f29894: e1500009 cmp r0, r9 + 1f29898: ba0000f5 blt 1f29c74 + 1f2989c: e594ec50 ldr lr, [r4, #3152] ; 0xc50 + 1f298a0: e150000e cmp r0, lr + 1f298a4: ba0000fe blt 1f29ca4 + 1f298a8: e594ec54 ldr lr, [r4, #3156] ; 0xc54 + 1f298ac: e150000e cmp r0, lr + 1f298b0: ba0000f8 blt 1f29c98 + 1f298b4: e594ec58 ldr lr, [r4, #3160] ; 0xc58 + 1f298b8: e150000e cmp r0, lr + 1f298bc: ba0000f2 blt 1f29c8c + 1f298c0: e594ec5c ldr lr, [r4, #3164] ; 0xc5c + 1f298c4: e150000e cmp r0, lr + 1f298c8: ba0000ec blt 1f29c80 + 1f298cc: e594ec60 ldr lr, [r4, #3168] ; 0xc60 + 1f298d0: e150000e cmp r0, lr + 1f298d4: aaffffcd bge 1f29810 + 1f298d8: e3a09001 mov r9, #1 + 1f298dc: e3a0a00f mov sl, #15 + 1f298e0: e084808a add r8, r4, sl, lsl #1 + 1f298e4: e1a01a31 lsr r1, r1, sl + 1f298e8: e288eb03 add lr, r8, #3072 ; 0xc00 + 1f298ec: e2888ec6 add r8, r8, #3168 ; 0xc60 + 1f298f0: e28ee004 add lr, lr, #4 + 1f298f4: e2888008 add r8, r8, #8 + 1f298f8: e06a2002 rsb r2, sl, r2 + 1f298fc: e1dee0b0 ldrh lr, [lr] + 1f29900: e1d880b0 ldrh r8, [r8] + 1f29904: e06e0950 rsb r0, lr, r0, asr r9 + 1f29908: e584100c str r1, [r4, #12] + 1f2990c: e0800008 add r0, r0, r8 + 1f29910: e5842008 str r2, [r4, #8] + 1f29914: e2800e2d add r0, r0, #720 ; 0x2d0 + 1f29918: e08cc080 add ip, ip, r0, lsl #1 + 1f2991c: e1dc00b4 ldrh r0, [ip, #4] + 1f29920: eafffe96 b 1f29380 + 1f29924: e1590002 cmp r9, r2 + 1f29928: da00000e ble 1f29968 + 1f2992c: e5948004 ldr r8, [r4, #4] + 1f29930: e594c000 ldr ip, [r4] + 1f29934: e158000c cmp r8, ip + 1f29938: e28ce001 add lr, ip, #1 + 1f2993c: 8584e000 strhi lr, [r4] + 1f29940: e3a00000 mov r0, #0 + 1f29944: 85dc0000 ldrbhi r0, [ip] + 1f29948: 81a0c00e movhi ip, lr + 1f2994c: 81a00210 lslhi r0, r0, r2 + 1f29950: e2822008 add r2, r2, #8 + 1f29954: e3520018 cmp r2, #24 + 1f29958: e1811000 orr r1, r1, r0 + 1f2995c: e5842008 str r2, [r4, #8] + 1f29960: e584100c str r1, [r4, #12] + 1f29964: dafffff2 ble 1f29934 + 1f29968: e3e00000 mvn r0, #0 + 1f2996c: e0692002 rsb r2, r9, r2 + 1f29970: e5842008 str r2, [r4, #8] + 1f29974: e1c10910 bic r0, r1, r0, lsl r9 + 1f29978: e1a01931 lsr r1, r1, r9 + 1f2997c: e0855000 add r5, r5, r0 + 1f29980: e584100c str r1, [r4, #12] + 1f29984: eafffe5a b 1f292f4 + 1f29988: e15e0002 cmp lr, r2 + 1f2998c: da00000e ble 1f299cc + 1f29990: e594a004 ldr sl, [r4, #4] + 1f29994: e594c000 ldr ip, [r4] + 1f29998: e15a000c cmp sl, ip + 1f2999c: e28c8001 add r8, ip, #1 + 1f299a0: 85848000 strhi r8, [r4] + 1f299a4: e3a00000 mov r0, #0 + 1f299a8: 85dc0000 ldrbhi r0, [ip] + 1f299ac: 81a0c008 movhi ip, r8 + 1f299b0: 81a00210 lslhi r0, r0, r2 + 1f299b4: e2822008 add r2, r2, #8 + 1f299b8: e3520018 cmp r2, #24 + 1f299bc: e1811000 orr r1, r1, r0 + 1f299c0: e5842008 str r2, [r4, #8] + 1f299c4: e584100c str r1, [r4, #12] + 1f299c8: dafffff2 ble 1f29998 + 1f299cc: e3e00000 mvn r0, #0 + 1f299d0: e1a0ce31 lsr ip, r1, lr + 1f299d4: e06e2002 rsb r2, lr, r2 + 1f299d8: e584c00c str ip, [r4, #12] + 1f299dc: e1c11e10 bic r1, r1, r0, lsl lr + 1f299e0: e5940014 ldr r0, [r4, #20] + 1f299e4: e0819009 add r9, r1, r9 + 1f299e8: e5842008 str r2, [r4, #8] + 1f299ec: e060b003 rsb fp, r0, r3 + 1f299f0: e15b0009 cmp fp, r9 + 1f299f4: aafffe6d bge 1f293b0 + 1f299f8: e30a336c movw r3, #41836 ; 0xa36c + 1f299fc: e340320d movt r3, #525 ; 0x20d + 1f29a00: e3002fb0 movw r2, #4016 ; 0xfb0 + 1f29a04: e34021f6 movt r2, #502 ; 0x1f6 + 1f29a08: e5832000 str r2, [r3] + 1f29a0c: eaffff84 b 1f29824 + 1f29a10: e3550000 cmp r5, #0 + 1f29a14: 0afffded beq 1f291d0 + 1f29a18: e203c007 and ip, r3, #7 + 1f29a1c: e1d200d0 ldrsb r0, [r2] + 1f29a20: e26cc000 rsb ip, ip, #0 + 1f29a24: e20cc00f and ip, ip, #15 + 1f29a28: e15c0005 cmp ip, r5 + 1f29a2c: 21a0c005 movcs ip, r5 + 1f29a30: e3550012 cmp r5, #18 + 1f29a34: 91a0c005 movls ip, r5 + 1f29a38: e35c0000 cmp ip, #0 + 1f29a3c: 0a00009b beq 1f29cb0 + 1f29a40: e083100c add r1, r3, ip + 1f29a44: e1a02003 mov r2, r3 + 1f29a48: e4c20001 strb r0, [r2], #1 + 1f29a4c: e2455001 sub r5, r5, #1 + 1f29a50: e1510002 cmp r1, r2 + 1f29a54: 1afffffb bne 1f29a48 + 1f29a58: e15a000c cmp sl, ip + 1f29a5c: 0affff3f beq 1f29760 + 1f29a60: e06ce00a rsb lr, ip, sl + 1f29a64: e24a8001 sub r8, sl, #1 + 1f29a68: e24e2010 sub r2, lr, #16 + 1f29a6c: e06c8008 rsb r8, ip, r8 + 1f29a70: e358000e cmp r8, #14 + 1f29a74: e1a02222 lsr r2, r2, #4 + 1f29a78: e2822001 add r2, r2, #1 + 1f29a7c: e1a08202 lsl r8, r2, #4 + 1f29a80: 9a00000b bls 1f29ab4 + 1f29a84: eee00b90 vdup.8 q8, r0 + 1f29a88: e083c00c add ip, r3, ip + 1f29a8c: e3a09000 mov r9, #0 + 1f29a90: e2899001 add r9, r9, #1 + 1f29a94: f44c0adf vst1.64 {d16-d17}, [ip :64] + 1f29a98: e1590002 cmp r9, r2 + 1f29a9c: e28cc010 add ip, ip, #16 + 1f29aa0: 3afffffa bcc 1f29a90 + 1f29aa4: e158000e cmp r8, lr + 1f29aa8: e0811008 add r1, r1, r8 + 1f29aac: e0685005 rsb r5, r8, r5 + 1f29ab0: 0affff2a beq 1f29760 + 1f29ab4: e3550001 cmp r5, #1 + 1f29ab8: e5c10000 strb r0, [r1] + 1f29abc: 0affff27 beq 1f29760 + 1f29ac0: e3550002 cmp r5, #2 + 1f29ac4: e5c10001 strb r0, [r1, #1] + 1f29ac8: 0affff24 beq 1f29760 + 1f29acc: e3550003 cmp r5, #3 + 1f29ad0: e5c10002 strb r0, [r1, #2] + 1f29ad4: 0affff21 beq 1f29760 + 1f29ad8: e3550004 cmp r5, #4 + 1f29adc: e5c10003 strb r0, [r1, #3] + 1f29ae0: 0affff1e beq 1f29760 + 1f29ae4: e3550005 cmp r5, #5 + 1f29ae8: e5c10004 strb r0, [r1, #4] + 1f29aec: 0affff1b beq 1f29760 + 1f29af0: e3550006 cmp r5, #6 + 1f29af4: e5c10005 strb r0, [r1, #5] + 1f29af8: 0affff18 beq 1f29760 + 1f29afc: e3550007 cmp r5, #7 + 1f29b00: e5c10006 strb r0, [r1, #6] + 1f29b04: 0affff15 beq 1f29760 + 1f29b08: e3550008 cmp r5, #8 + 1f29b0c: e5c10007 strb r0, [r1, #7] + 1f29b10: 0affff12 beq 1f29760 + 1f29b14: e3550009 cmp r5, #9 + 1f29b18: e5c10008 strb r0, [r1, #8] + 1f29b1c: 0affff0f beq 1f29760 + 1f29b20: e355000a cmp r5, #10 + 1f29b24: e5c10009 strb r0, [r1, #9] + 1f29b28: 0affff0c beq 1f29760 + 1f29b2c: e355000b cmp r5, #11 + 1f29b30: e5c1000a strb r0, [r1, #10] + 1f29b34: 0affff09 beq 1f29760 + 1f29b38: e355000c cmp r5, #12 + 1f29b3c: e5c1000b strb r0, [r1, #11] + 1f29b40: 0affff06 beq 1f29760 + 1f29b44: e355000d cmp r5, #13 + 1f29b48: e5c1000c strb r0, [r1, #12] + 1f29b4c: 0affff03 beq 1f29760 + 1f29b50: e355000e cmp r5, #14 + 1f29b54: e5c1000d strb r0, [r1, #13] + 1f29b58: 15c1000e strbne r0, [r1, #14] + 1f29b5c: e083300a add r3, r3, sl + 1f29b60: eafffd9a b 1f291d0 + 1f29b64: e1a0500e mov r5, lr + 1f29b68: e1a0200c mov r2, ip + 1f29b6c: eafffea9 b 1f29618 + 1f29b70: e3a05001 mov r5, #1 + 1f29b74: e3a0200f mov r2, #15 + 1f29b78: e084e082 add lr, r4, r2, lsl #1 + 1f29b7c: e1a01231 lsr r1, r1, r2 + 1f29b80: e28ece42 add ip, lr, #1056 ; 0x420 + 1f29b84: e28eed12 add lr, lr, #1152 ; 0x480 + 1f29b88: e28ee004 add lr, lr, #4 + 1f29b8c: e0622009 rsb r2, r2, r9 + 1f29b90: e1dcc0b0 ldrh ip, [ip] + 1f29b94: e1dee0b0 ldrh lr, [lr] + 1f29b98: e06c0550 rsb r0, ip, r0, asr r5 + 1f29b9c: e584100c str r1, [r4, #12] + 1f29ba0: e080000e add r0, r0, lr + 1f29ba4: e5842008 str r2, [r4, #8] + 1f29ba8: e2800e2d add r0, r0, #720 ; 0x2d0 + 1f29bac: e0840080 add r0, r4, r0, lsl #1 + 1f29bb0: e1d082b4 ldrh r8, [r0, #36] ; 0x24 + 1f29bb4: eafffda9 b 1f29260 + 1f29bb8: e3a05002 mov r5, #2 + 1f29bbc: e3a0200e mov r2, #14 + 1f29bc0: eaffffec b 1f29b78 + 1f29bc4: e3a05003 mov r5, #3 + 1f29bc8: e3a0200d mov r2, #13 + 1f29bcc: eaffffe9 b 1f29b78 + 1f29bd0: e3a05004 mov r5, #4 + 1f29bd4: e3a0200c mov r2, #12 + 1f29bd8: eaffffe6 b 1f29b78 + 1f29bdc: e3a05005 mov r5, #5 + 1f29be0: e3a0200b mov r2, #11 + 1f29be4: eaffffe3 b 1f29b78 + 1f29be8: e3a05006 mov r5, #6 + 1f29bec: e3a0200a mov r2, #10 + 1f29bf0: eaffffe0 b 1f29b78 + 1f29bf4: e8940006 ldm r4, {r1, r2} + 1f29bf8: e0813005 add r3, r1, r5 + 1f29bfc: e1520003 cmp r2, r3 + 1f29c00: 3a0003be bcc 1f2ab00 + 1f29c04: e5942010 ldr r2, [r4, #16] + 1f29c08: e5943018 ldr r3, [r4, #24] + 1f29c0c: e0820005 add r0, r2, r5 + 1f29c10: e1530000 cmp r3, r0 + 1f29c14: 2a0003aa bcs 1f2aac4 + 1f29c18: e594101c ldr r1, [r4, #28] + 1f29c1c: e3510000 cmp r1, #0 + 1f29c20: 1a000394 bne 1f2aa78 + 1f29c24: e30a336c movw r3, #41836 ; 0xa36c + 1f29c28: e340320d movt r3, #525 ; 0x20d + 1f29c2c: e3002f7c movw r2, #3964 ; 0xf7c + 1f29c30: e34021f6 movt r2, #502 ; 0x1f6 + 1f29c34: e5832000 str r2, [r3] + 1f29c38: eafffef9 b 1f29824 + 1f29c3c: e30a336c movw r3, #41836 ; 0xa36c + 1f29c40: e340320d movt r3, #525 ; 0x20d + 1f29c44: e3002f90 movw r2, #3984 ; 0xf90 + 1f29c48: e34021f6 movt r2, #502 ; 0x1f6 + 1f29c4c: e5832000 str r2, [r3] + 1f29c50: eafffef3 b 1f29824 + 1f29c54: e0825005 add r5, r2, r5 + 1f29c58: e2431001 sub r1, r3, #1 + 1f29c5c: e4d20001 ldrb r0, [r2], #1 + 1f29c60: e5e10001 strb r0, [r1, #1]! + 1f29c64: e1550002 cmp r5, r2 + 1f29c68: 1afffffb bne 1f29c5c + 1f29c6c: e083300a add r3, r3, sl + 1f29c70: eafffd56 b 1f291d0 + 1f29c74: e3a09006 mov r9, #6 + 1f29c78: e3a0a00a mov sl, #10 + 1f29c7c: eaffff17 b 1f298e0 + 1f29c80: e3a09002 mov r9, #2 + 1f29c84: e3a0a00e mov sl, #14 + 1f29c88: eaffff14 b 1f298e0 + 1f29c8c: e3a09003 mov r9, #3 + 1f29c90: e3a0a00d mov sl, #13 + 1f29c94: eaffff11 b 1f298e0 + 1f29c98: e3a09004 mov r9, #4 + 1f29c9c: e3a0a00c mov sl, #12 + 1f29ca0: eaffff0e b 1f298e0 + 1f29ca4: e3a09005 mov r9, #5 + 1f29ca8: e3a0a00b mov sl, #11 + 1f29cac: eaffff0b b 1f298e0 + 1f29cb0: e1a01003 mov r1, r3 + 1f29cb4: eaffff69 b 1f29a60 + 1f29cb8: e2135007 ands r5, r3, #7 + 1f29cbc: 1a000303 bne 1f2a8d0 + 1f29cc0: e3530000 cmp r3, #0 + 1f29cc4: da000317 ble 1f2a928 + 1f29cc8: e2432008 sub r2, r3, #8 + 1f29ccc: e6efc071 uxtb ip, r1 + 1f29cd0: e3520000 cmp r2, #0 + 1f29cd4: e1a00421 lsr r0, r1, #8 + 1f29cd8: e5842008 str r2, [r4, #8] + 1f29cdc: e5cdc074 strb ip, [sp, #116] ; 0x74 + 1f29ce0: e584000c str r0, [r4, #12] + 1f29ce4: da00035f ble 1f2aa68 + 1f29ce8: e2432010 sub r2, r3, #16 + 1f29cec: e6ef0070 uxtb r0, r0 + 1f29cf0: e3520000 cmp r2, #0 + 1f29cf4: e5842008 str r2, [r4, #8] + 1f29cf8: e5cd0075 strb r0, [sp, #117] ; 0x75 + 1f29cfc: e1a02821 lsr r2, r1, #16 + 1f29d00: e584200c str r2, [r4, #12] + 1f29d04: da000353 ble 1f2aa58 + 1f29d08: e2435018 sub r5, r3, #24 + 1f29d0c: e6efe072 uxtb lr, r2 + 1f29d10: e3550000 cmp r5, #0 + 1f29d14: e1a01c21 lsr r1, r1, #24 + 1f29d18: e5cde076 strb lr, [sp, #118] ; 0x76 + 1f29d1c: e5845008 str r5, [r4, #8] + 1f29d20: e584100c str r1, [r4, #12] + 1f29d24: da000322 ble 1f2a9b4 + 1f29d28: e2433020 sub r3, r3, #32 + 1f29d2c: e1a02401 lsl r2, r1, #8 + 1f29d30: e5843008 str r3, [r4, #8] + 1f29d34: e3a03000 mov r3, #0 + 1f29d38: e584300c str r3, [r4, #12] + 1f29d3c: e08c5400 add r5, ip, r0, lsl #8 + 1f29d40: e08e2002 add r2, lr, r2 + 1f29d44: e2253cff eor r3, r5, #65280 ; 0xff00 + 1f29d48: e22330ff eor r3, r3, #255 ; 0xff + 1f29d4c: e1520003 cmp r2, r3 + 1f29d50: 0affffa7 beq 1f29bf4 + 1f29d54: e30a336c movw r3, #41836 ; 0xa36c + 1f29d58: e340320d movt r3, #525 ; 0x20d + 1f29d5c: e3002f58 movw r2, #3928 ; 0xf58 + 1f29d60: e34021f6 movt r2, #502 ; 0x1f6 + 1f29d64: e5832000 str r2, [r3] + 1f29d68: eafffead b 1f29824 + 1f29d6c: e3a02044 mov r2, #68 ; 0x44 + 1f29d70: e3a01000 mov r1, #0 + 1f29d74: e28d0074 add r0, sp, #116 ; 0x74 + 1f29d78: e3019227 movw r9, #4647 ; 0x1227 + 1f29d7c: e34091f6 movt r9, #502 ; 0x1f6 + 1f29d80: eb0054a5 bl 1f3f01c + 1f29d84: e3a01000 mov r1, #0 + 1f29d88: e3a02b01 mov r2, #1024 ; 0x400 + 1f29d8c: e2840020 add r0, r4, #32 + 1f29d90: eb0054a1 bl 1f3f01c + 1f29d94: e2890e12 add r0, r9, #288 ; 0x120 + 1f29d98: e1a01009 mov r1, r9 + 1f29d9c: e5f13001 ldrb r3, [r1, #1]! + 1f29da0: e28d20b8 add r2, sp, #184 ; 0xb8 + 1f29da4: e1500001 cmp r0, r1 + 1f29da8: e0823103 add r3, r2, r3, lsl #2 + 1f29dac: e5132044 ldr r2, [r3, #-68] ; 0xffffffbc + 1f29db0: e2822001 add r2, r2, #1 + 1f29db4: e5032044 str r2, [r3, #-68] ; 0xffffffbc + 1f29db8: 1afffff7 bne 1f29d9c + 1f29dbc: e59d3078 ldr r3, [sp, #120] ; 0x78 + 1f29dc0: e3a02000 mov r2, #0 + 1f29dc4: e58d2074 str r2, [sp, #116] ; 0x74 + 1f29dc8: e3530002 cmp r3, #2 + 1f29dcc: ca0002b2 bgt 1f2a89c + 1f29dd0: e59da07c ldr sl, [sp, #124] ; 0x7c + 1f29dd4: e35a0004 cmp sl, #4 + 1f29dd8: ca0002af bgt 1f2a89c + 1f29ddc: e59dc080 ldr ip, [sp, #128] ; 0x80 + 1f29de0: e35c0008 cmp ip, #8 + 1f29de4: ca0002ac bgt 1f2a89c + 1f29de8: e59d0084 ldr r0, [sp, #132] ; 0x84 + 1f29dec: e3500010 cmp r0, #16 + 1f29df0: ca0002a9 bgt 1f2a89c + 1f29df4: e59d1088 ldr r1, [sp, #136] ; 0x88 + 1f29df8: e3510020 cmp r1, #32 + 1f29dfc: ca0002a6 bgt 1f2a89c + 1f29e00: e59d208c ldr r2, [sp, #140] ; 0x8c + 1f29e04: e3520040 cmp r2, #64 ; 0x40 + 1f29e08: ca0002a3 bgt 1f2a89c + 1f29e0c: e59de090 ldr lr, [sp, #144] ; 0x90 + 1f29e10: e58de004 str lr, [sp, #4] + 1f29e14: e35e0080 cmp lr, #128 ; 0x80 + 1f29e18: ca00029f bgt 1f2a89c + 1f29e1c: e59de094 ldr lr, [sp, #148] ; 0x94 + 1f29e20: e58de008 str lr, [sp, #8] + 1f29e24: e35e0c01 cmp lr, #256 ; 0x100 + 1f29e28: ca00029b bgt 1f2a89c + 1f29e2c: e59d5098 ldr r5, [sp, #152] ; 0x98 + 1f29e30: e58d500c str r5, [sp, #12] + 1f29e34: e3550c02 cmp r5, #512 ; 0x200 + 1f29e38: ca000297 bgt 1f2a89c + 1f29e3c: e59d809c ldr r8, [sp, #156] ; 0x9c + 1f29e40: e58d8010 str r8, [sp, #16] + 1f29e44: e3580b01 cmp r8, #1024 ; 0x400 + 1f29e48: ca000293 bgt 1f2a89c + 1f29e4c: e59de0a0 ldr lr, [sp, #160] ; 0xa0 + 1f29e50: e58de014 str lr, [sp, #20] + 1f29e54: e35e0b02 cmp lr, #2048 ; 0x800 + 1f29e58: ca00028f bgt 1f2a89c + 1f29e5c: e59d80a4 ldr r8, [sp, #164] ; 0xa4 + 1f29e60: e58d8018 str r8, [sp, #24] + 1f29e64: e3580a01 cmp r8, #4096 ; 0x1000 + 1f29e68: ca00028b bgt 1f2a89c + 1f29e6c: e59de0a8 ldr lr, [sp, #168] ; 0xa8 + 1f29e70: e58de01c str lr, [sp, #28] + 1f29e74: e35e0a02 cmp lr, #8192 ; 0x2000 + 1f29e78: ca000287 bgt 1f2a89c + 1f29e7c: e59de0ac ldr lr, [sp, #172] ; 0xac + 1f29e80: e58de020 str lr, [sp, #32] + 1f29e84: e35e0901 cmp lr, #16384 ; 0x4000 + 1f29e88: ca000283 bgt 1f2a89c + 1f29e8c: e59d50b0 ldr r5, [sp, #176] ; 0xb0 + 1f29e90: e58d5024 str r5, [sp, #36] ; 0x24 + 1f29e94: e3550902 cmp r5, #32768 ; 0x8000 + 1f29e98: ca00027f bgt 1f2a89c + 1f29e9c: e2848e42 add r8, r4, #1056 ; 0x420 + 1f29ea0: e2845d12 add r5, r4, #1152 ; 0x480 + 1f29ea4: e3a0e000 mov lr, #0 + 1f29ea8: e288b004 add fp, r8, #4 + 1f29eac: e58db028 str fp, [sp, #40] ; 0x28 + 1f29eb0: e1a0b783 lsl fp, r3, #15 + 1f29eb4: e1c8e0b2 strh lr, [r8, #2] + 1f29eb8: e1a08005 mov r8, r5 + 1f29ebc: e1c5e0b6 strh lr, [r5, #6] + 1f29ec0: e1a05083 lsl r5, r3, #1 + 1f29ec4: e584b444 str fp, [r4, #1092] ; 0x444 + 1f29ec8: e58de038 str lr, [sp, #56] ; 0x38 + 1f29ecc: e085e00a add lr, r5, sl + 1f29ed0: e59db028 ldr fp, [sp, #40] ; 0x28 + 1f29ed4: e35a0000 cmp sl, #0 + 1f29ed8: 135e0004 cmpne lr, #4 + 1f29edc: e58d503c str r5, [sp, #60] ; 0x3c + 1f29ee0: e1cb50b0 strh r5, [fp] + 1f29ee4: e1c830b8 strh r3, [r8, #8] + 1f29ee8: ca000265 bgt 1f2a884 + 1f29eec: e1a0808e lsl r8, lr, #1 + 1f29ef0: e083300a add r3, r3, sl + 1f29ef4: e284be42 add fp, r4, #1056 ; 0x420 + 1f29ef8: e2845d12 add r5, r4, #1152 ; 0x480 + 1f29efc: e088a00c add sl, r8, ip + 1f29f00: e1a0e70e lsl lr, lr, #14 + 1f29f04: e35c0000 cmp ip, #0 + 1f29f08: 135a0008 cmpne sl, #8 + 1f29f0c: e584e448 str lr, [r4, #1096] ; 0x448 + 1f29f10: e58d8040 str r8, [sp, #64] ; 0x40 + 1f29f14: e1cb80b6 strh r8, [fp, #6] + 1f29f18: e1c530ba strh r3, [r5, #10] + 1f29f1c: ca000258 bgt 1f2a884 + 1f29f20: e1a0508a lsl r5, sl, #1 + 1f29f24: e284ed12 add lr, r4, #1152 ; 0x480 + 1f29f28: e284be42 add fp, r4, #1056 ; 0x420 + 1f29f2c: e0858000 add r8, r5, r0 + 1f29f30: e3500000 cmp r0, #0 + 1f29f34: 13580010 cmpne r8, #16 + 1f29f38: e083300c add r3, r3, ip + 1f29f3c: e1a0a68a lsl sl, sl, #13 + 1f29f40: e58d5044 str r5, [sp, #68] ; 0x44 + 1f29f44: e584a44c str sl, [r4, #1100] ; 0x44c + 1f29f48: e28ee00c add lr, lr, #12 + 1f29f4c: e1cb50b8 strh r5, [fp, #8] + 1f29f50: e1ce30b0 strh r3, [lr] + 1f29f54: ca00024a bgt 1f2a884 + 1f29f58: e1a05088 lsl r5, r8, #1 + 1f29f5c: e284ed12 add lr, r4, #1152 ; 0x480 + 1f29f60: e284ae42 add sl, r4, #1056 ; 0x420 + 1f29f64: e085c001 add ip, r5, r1 + 1f29f68: e3510000 cmp r1, #0 + 1f29f6c: 135c0020 cmpne ip, #32 + 1f29f70: e0833000 add r3, r3, r0 + 1f29f74: e1a08608 lsl r8, r8, #12 + 1f29f78: e58d5048 str r5, [sp, #72] ; 0x48 + 1f29f7c: e5848450 str r8, [r4, #1104] ; 0x450 + 1f29f80: e28ee00e add lr, lr, #14 + 1f29f84: e1ca50ba strh r5, [sl, #10] + 1f29f88: e1ce30b0 strh r3, [lr] + 1f29f8c: ca00023c bgt 1f2a884 + 1f29f90: e1a0808c lsl r8, ip, #1 + 1f29f94: e0833001 add r3, r3, r1 + 1f29f98: e2845e42 add r5, r4, #1056 ; 0x420 + 1f29f9c: e088e002 add lr, r8, r2 + 1f29fa0: e2841e49 add r1, r4, #1168 ; 0x490 + 1f29fa4: e3520000 cmp r2, #0 + 1f29fa8: 135e0040 cmpne lr, #64 ; 0x40 + 1f29fac: e1a0c58c lsl ip, ip, #11 + 1f29fb0: e58d804c str r8, [sp, #76] ; 0x4c + 1f29fb4: e584c454 str ip, [r4, #1108] ; 0x454 + 1f29fb8: e1c580bc strh r8, [r5, #12] + 1f29fbc: e1c130b0 strh r3, [r1] + 1f29fc0: ca00022f bgt 1f2a884 + 1f29fc4: e59d8004 ldr r8, [sp, #4] + 1f29fc8: e1a0c08e lsl ip, lr, #1 + 1f29fcc: e2841e42 add r1, r4, #1056 ; 0x420 + 1f29fd0: e2840e49 add r0, r4, #1168 ; 0x490 + 1f29fd4: e08c5008 add r5, ip, r8 + 1f29fd8: e0833002 add r3, r3, r2 + 1f29fdc: e3580000 cmp r8, #0 + 1f29fe0: 13550080 cmpne r5, #128 ; 0x80 + 1f29fe4: e1a0e50e lsl lr, lr, #10 + 1f29fe8: e58dc050 str ip, [sp, #80] ; 0x50 + 1f29fec: e584e458 str lr, [r4, #1112] ; 0x458 + 1f29ff0: e1c1c0be strh ip, [r1, #14] + 1f29ff4: e1c030b2 strh r3, [r0, #2] + 1f29ff8: ca000221 bgt 1f2a884 + 1f29ffc: e59dc008 ldr ip, [sp, #8] + 1f2a000: e1a02085 lsl r2, r5, #1 + 1f2a004: e083b008 add fp, r3, r8 + 1f2a008: e2840e49 add r0, r4, #1168 ; 0x490 + 1f2a00c: e2843e43 add r3, r4, #1072 ; 0x430 + 1f2a010: e082100c add r1, r2, ip + 1f2a014: e35c0000 cmp ip, #0 + 1f2a018: 13510c01 cmpne r1, #256 ; 0x100 + 1f2a01c: e1a05485 lsl r5, r5, #9 + 1f2a020: e1a0e00c mov lr, ip + 1f2a024: e584545c str r5, [r4, #1116] ; 0x45c + 1f2a028: e58d2054 str r2, [sp, #84] ; 0x54 + 1f2a02c: e1c320b0 strh r2, [r3] + 1f2a030: e1c0b0b4 strh fp, [r0, #4] + 1f2a034: ca000212 bgt 1f2a884 + 1f2a038: e59d500c ldr r5, [sp, #12] + 1f2a03c: e1a00081 lsl r0, r1, #1 + 1f2a040: e1a0e003 mov lr, r3 + 1f2a044: e2842e49 add r2, r4, #1168 ; 0x490 + 1f2a048: e08b300c add r3, fp, ip + 1f2a04c: e080c005 add ip, r0, r5 + 1f2a050: e3550000 cmp r5, #0 + 1f2a054: 135c0c02 cmpne ip, #512 ; 0x200 + 1f2a058: e1a01401 lsl r1, r1, #8 + 1f2a05c: e58d0058 str r0, [sp, #88] ; 0x58 + 1f2a060: e28ee002 add lr, lr, #2 + 1f2a064: e5841460 str r1, [r4, #1120] ; 0x460 + 1f2a068: e1ce00b0 strh r0, [lr] + 1f2a06c: e1c230b6 strh r3, [r2, #6] + 1f2a070: ca000203 bgt 1f2a884 + 1f2a074: e59d8010 ldr r8, [sp, #16] + 1f2a078: e1a0108c lsl r1, ip, #1 + 1f2a07c: e284ee43 add lr, r4, #1072 ; 0x430 + 1f2a080: e2842e49 add r2, r4, #1168 ; 0x490 + 1f2a084: e0810008 add r0, r1, r8 + 1f2a088: e0833005 add r3, r3, r5 + 1f2a08c: e3580000 cmp r8, #0 + 1f2a090: 13500b01 cmpne r0, #1024 ; 0x400 + 1f2a094: e1a0c38c lsl ip, ip, #7 + 1f2a098: e58d105c str r1, [sp, #92] ; 0x5c + 1f2a09c: e28ee004 add lr, lr, #4 + 1f2a0a0: e584c464 str ip, [r4, #1124] ; 0x464 + 1f2a0a4: e1ce10b0 strh r1, [lr] + 1f2a0a8: e1c230b8 strh r3, [r2, #8] + 1f2a0ac: ca0001f4 bgt 1f2a884 + 1f2a0b0: e59d5014 ldr r5, [sp, #20] + 1f2a0b4: e1a0c080 lsl ip, r0, #1 + 1f2a0b8: e2841e43 add r1, r4, #1072 ; 0x430 + 1f2a0bc: e2842e49 add r2, r4, #1168 ; 0x490 + 1f2a0c0: e08ce005 add lr, ip, r5 + 1f2a0c4: e0833008 add r3, r3, r8 + 1f2a0c8: e3550000 cmp r5, #0 + 1f2a0cc: 135e0b02 cmpne lr, #2048 ; 0x800 + 1f2a0d0: e1a00300 lsl r0, r0, #6 + 1f2a0d4: e58dc060 str ip, [sp, #96] ; 0x60 + 1f2a0d8: e5840468 str r0, [r4, #1128] ; 0x468 + 1f2a0dc: e1c1c0b6 strh ip, [r1, #6] + 1f2a0e0: e1c230ba strh r3, [r2, #10] + 1f2a0e4: ca0001e6 bgt 1f2a884 + 1f2a0e8: e59d8018 ldr r8, [sp, #24] + 1f2a0ec: e1a0008e lsl r0, lr, #1 + 1f2a0f0: e2841e43 add r1, r4, #1072 ; 0x430 + 1f2a0f4: e2842e49 add r2, r4, #1168 ; 0x490 + 1f2a0f8: e080c008 add ip, r0, r8 + 1f2a0fc: e0833005 add r3, r3, r5 + 1f2a100: e3580000 cmp r8, #0 + 1f2a104: 135c0a01 cmpne ip, #4096 ; 0x1000 + 1f2a108: e1a0e28e lsl lr, lr, #5 + 1f2a10c: e58d0064 str r0, [sp, #100] ; 0x64 + 1f2a110: e584e46c str lr, [r4, #1132] ; 0x46c + 1f2a114: e1c100b8 strh r0, [r1, #8] + 1f2a118: e1c230bc strh r3, [r2, #12] + 1f2a11c: ca0001d8 bgt 1f2a884 + 1f2a120: e59d501c ldr r5, [sp, #28] + 1f2a124: e1a0008c lsl r0, ip, #1 + 1f2a128: e2841e43 add r1, r4, #1072 ; 0x430 + 1f2a12c: e2842e49 add r2, r4, #1168 ; 0x490 + 1f2a130: e080e005 add lr, r0, r5 + 1f2a134: e0833008 add r3, r3, r8 + 1f2a138: e3550000 cmp r5, #0 + 1f2a13c: 135e0a02 cmpne lr, #8192 ; 0x2000 + 1f2a140: e1a0c20c lsl ip, ip, #4 + 1f2a144: e58d0068 str r0, [sp, #104] ; 0x68 + 1f2a148: e584c470 str ip, [r4, #1136] ; 0x470 + 1f2a14c: e1c100ba strh r0, [r1, #10] + 1f2a150: e1c230be strh r3, [r2, #14] + 1f2a154: ca0001ca bgt 1f2a884 + 1f2a158: e59d8020 ldr r8, [sp, #32] + 1f2a15c: e1a0008e lsl r0, lr, #1 + 1f2a160: e2841e43 add r1, r4, #1072 ; 0x430 + 1f2a164: e284ce4a add ip, r4, #1184 ; 0x4a0 + 1f2a168: e0802008 add r2, r0, r8 + 1f2a16c: e0833005 add r3, r3, r5 + 1f2a170: e3580000 cmp r8, #0 + 1f2a174: 13520901 cmpne r2, #16384 ; 0x4000 + 1f2a178: e1a0e18e lsl lr, lr, #3 + 1f2a17c: e58d006c str r0, [sp, #108] ; 0x6c + 1f2a180: e584e474 str lr, [r4, #1140] ; 0x474 + 1f2a184: e1c100bc strh r0, [r1, #12] + 1f2a188: e1a0100c mov r1, ip + 1f2a18c: e1cc30b0 strh r3, [ip] + 1f2a190: ca0001bb bgt 1f2a884 + 1f2a194: e0835008 add r5, r3, r8 + 1f2a198: e59d8024 ldr r8, [sp, #36] ; 0x24 + 1f2a19c: e1a0e082 lsl lr, r2, #1 + 1f2a1a0: e1a00001 mov r0, r1 + 1f2a1a4: e284ce43 add ip, r4, #1072 ; 0x430 + 1f2a1a8: e08e1008 add r1, lr, r8 + 1f2a1ac: e3580000 cmp r8, #0 + 1f2a1b0: 13510902 cmpne r1, #32768 ; 0x8000 + 1f2a1b4: e1a03102 lsl r3, r2, #2 + 1f2a1b8: e58de070 str lr, [sp, #112] ; 0x70 + 1f2a1bc: e5843478 str r3, [r4, #1144] ; 0x478 + 1f2a1c0: e1cce0be strh lr, [ip, #14] + 1f2a1c4: e1c050b2 strh r5, [r0, #2] + 1f2a1c8: ca0001ad bgt 1f2a884 + 1f2a1cc: e1a01081 lsl r1, r1, #1 + 1f2a1d0: e3a03801 mov r3, #65536 ; 0x10000 + 1f2a1d4: e584147c str r1, [r4, #1148] ; 0x47c + 1f2a1d8: e3a0c000 mov ip, #0 + 1f2a1dc: e5843480 str r3, [r4, #1152] ; 0x480 + 1f2a1e0: e3a0b001 mov fp, #1 + 1f2a1e4: e5f92001 ldrb r2, [r9, #1]! + 1f2a1e8: e3520000 cmp r2, #0 + 1f2a1ec: 0a00003a beq 1f2a2dc + 1f2a1f0: e0841082 add r1, r4, r2, lsl #1 + 1f2a1f4: e28d30b8 add r3, sp, #184 ; 0xb8 + 1f2a1f8: e1a08102 lsl r8, r2, #2 + 1f2a1fc: e3520009 cmp r2, #9 + 1f2a200: e0830008 add r0, r3, r8 + 1f2a204: e2813e42 add r3, r1, #1056 ; 0x420 + 1f2a208: e2811d12 add r1, r1, #1152 ; 0x480 + 1f2a20c: e2811004 add r1, r1, #4 + 1f2a210: e1d330b0 ldrh r3, [r3] + 1f2a214: e5105084 ldr r5, [r0, #-132] ; 0xffffff7c + 1f2a218: e1d110b0 ldrh r1, [r1] + 1f2a21c: e0633005 rsb r3, r3, r5 + 1f2a220: e0833001 add r3, r3, r1 + 1f2a224: e2831e2d add r1, r3, #720 ; 0x2d0 + 1f2a228: e0843003 add r3, r4, r3 + 1f2a22c: e0841081 add r1, r4, r1, lsl #1 + 1f2a230: e5c324a4 strb r2, [r3, #1188] ; 0x4a4 + 1f2a234: e1c1c2b4 strh ip, [r1, #36] ; 0x24 + 1f2a238: ca000023 bgt 1f2a2cc + 1f2a23c: e1a0e0c5 asr lr, r5, #1 + 1f2a240: e1a00085 lsl r0, r5, #1 + 1f2a244: e3051555 movw r1, #21845 ; 0x5555 + 1f2a248: e30a3aaa movw r3, #43690 ; 0xaaaa + 1f2a24c: e001100e and r1, r1, lr + 1f2a250: e0033000 and r3, r3, r0 + 1f2a254: e1813003 orr r3, r1, r3 + 1f2a258: e303e333 movw lr, #13107 ; 0x3333 + 1f2a25c: e30c1ccc movw r1, #52428 ; 0xcccc + 1f2a260: e3000f0f movw r0, #3855 ; 0xf0f + 1f2a264: e1a0a143 asr sl, r3, #2 + 1f2a268: e1a03103 lsl r3, r3, #2 + 1f2a26c: e00ee00a and lr, lr, sl + 1f2a270: e0011003 and r1, r1, r3 + 1f2a274: e18e1001 orr r1, lr, r1 + 1f2a278: e30f30f0 movw r3, #61680 ; 0xf0f0 + 1f2a27c: e262a010 rsb sl, r2, #16 + 1f2a280: e1a0e241 asr lr, r1, #4 + 1f2a284: e1a01201 lsl r1, r1, #4 + 1f2a288: e000000e and r0, r0, lr + 1f2a28c: e0033001 and r3, r3, r1 + 1f2a290: e1803003 orr r3, r0, r3 + 1f2a294: e18c1482 orr r1, ip, r2, lsl #9 + 1f2a298: e1a0021b lsl r0, fp, r2 + 1f2a29c: e1a02403 lsl r2, r3, #8 + 1f2a2a0: e6ff1071 uxth r1, r1 + 1f2a2a4: e1a0e080 lsl lr, r0, #1 + 1f2a2a8: e6ff2072 uxth r2, r2 + 1f2a2ac: e1823423 orr r3, r2, r3, lsr #8 + 1f2a2b0: e1a03a53 asr r3, r3, sl + 1f2a2b4: e0842083 add r2, r4, r3, lsl #1 + 1f2a2b8: e0833000 add r3, r3, r0 + 1f2a2bc: e1c212b0 strh r1, [r2, #32] + 1f2a2c0: e3530c02 cmp r3, #512 ; 0x200 + 1f2a2c4: e082200e add r2, r2, lr + 1f2a2c8: bafffffa blt 1f2a2b8 + 1f2a2cc: e28d30b8 add r3, sp, #184 ; 0xb8 + 1f2a2d0: e2855001 add r5, r5, #1 + 1f2a2d4: e0838008 add r8, r3, r8 + 1f2a2d8: e5085084 str r5, [r8, #-132] ; 0xffffff7c + 1f2a2dc: e28cc001 add ip, ip, #1 + 1f2a2e0: e35c0e12 cmp ip, #288 ; 0x120 + 1f2a2e4: 1affffbe bne 1f2a1e4 + 1f2a2e8: e2845b02 add r5, r4, #2048 ; 0x800 + 1f2a2ec: e3a02044 mov r2, #68 ; 0x44 + 1f2a2f0: e3a01000 mov r1, #0 + 1f2a2f4: e28d0074 add r0, sp, #116 ; 0x74 + 1f2a2f8: e2855004 add r5, r5, #4 + 1f2a2fc: eb005346 bl 1f3f01c + 1f2a300: e3009ed7 movw r9, #3799 ; 0xed7 + 1f2a304: e34091f6 movt r9, #502 ; 0x1f6 + 1f2a308: e3a01000 mov r1, #0 + 1f2a30c: e1a00005 mov r0, r5 + 1f2a310: e3a02b01 mov r2, #1024 ; 0x400 + 1f2a314: eb005340 bl 1f3f01c + 1f2a318: e2890020 add r0, r9, #32 + 1f2a31c: e1a01009 mov r1, r9 + 1f2a320: e5f13001 ldrb r3, [r1, #1]! + 1f2a324: e28d20b8 add r2, sp, #184 ; 0xb8 + 1f2a328: e1510000 cmp r1, r0 + 1f2a32c: e0823103 add r3, r2, r3, lsl #2 + 1f2a330: e5132044 ldr r2, [r3, #-68] ; 0xffffffbc + 1f2a334: e2822001 add r2, r2, #1 + 1f2a338: e5032044 str r2, [r3, #-68] ; 0xffffffbc + 1f2a33c: 1afffff7 bne 1f2a320 + 1f2a340: e59d3078 ldr r3, [sp, #120] ; 0x78 + 1f2a344: e3a02000 mov r2, #0 + 1f2a348: e58d2074 str r2, [sp, #116] ; 0x74 + 1f2a34c: e3530002 cmp r3, #2 + 1f2a350: ca000151 bgt 1f2a89c + 1f2a354: e59da07c ldr sl, [sp, #124] ; 0x7c + 1f2a358: e35a0004 cmp sl, #4 + 1f2a35c: ca00014e bgt 1f2a89c + 1f2a360: e59d0080 ldr r0, [sp, #128] ; 0x80 + 1f2a364: e3500008 cmp r0, #8 + 1f2a368: ca00014b bgt 1f2a89c + 1f2a36c: e59d1084 ldr r1, [sp, #132] ; 0x84 + 1f2a370: e58d1004 str r1, [sp, #4] + 1f2a374: e3510010 cmp r1, #16 + 1f2a378: ca000147 bgt 1f2a89c + 1f2a37c: e59d2088 ldr r2, [sp, #136] ; 0x88 + 1f2a380: e3520020 cmp r2, #32 + 1f2a384: ca000144 bgt 1f2a89c + 1f2a388: e59db08c ldr fp, [sp, #140] ; 0x8c + 1f2a38c: e35b0040 cmp fp, #64 ; 0x40 + 1f2a390: ca000141 bgt 1f2a89c + 1f2a394: e59dc090 ldr ip, [sp, #144] ; 0x90 + 1f2a398: e58dc008 str ip, [sp, #8] + 1f2a39c: e35c0080 cmp ip, #128 ; 0x80 + 1f2a3a0: ca00013d bgt 1f2a89c + 1f2a3a4: e59de094 ldr lr, [sp, #148] ; 0x94 + 1f2a3a8: e58de00c str lr, [sp, #12] + 1f2a3ac: e35e0c01 cmp lr, #256 ; 0x100 + 1f2a3b0: ca000139 bgt 1f2a89c + 1f2a3b4: e59d8098 ldr r8, [sp, #152] ; 0x98 + 1f2a3b8: e58d8010 str r8, [sp, #16] + 1f2a3bc: e3580c02 cmp r8, #512 ; 0x200 + 1f2a3c0: ca000135 bgt 1f2a89c + 1f2a3c4: e59dc09c ldr ip, [sp, #156] ; 0x9c + 1f2a3c8: e58dc014 str ip, [sp, #20] + 1f2a3cc: e35c0b01 cmp ip, #1024 ; 0x400 + 1f2a3d0: ca000131 bgt 1f2a89c + 1f2a3d4: e59de0a0 ldr lr, [sp, #160] ; 0xa0 + 1f2a3d8: e58de018 str lr, [sp, #24] + 1f2a3dc: e35e0b02 cmp lr, #2048 ; 0x800 + 1f2a3e0: ca00012d bgt 1f2a89c + 1f2a3e4: e59dc0a4 ldr ip, [sp, #164] ; 0xa4 + 1f2a3e8: e58dc01c str ip, [sp, #28] + 1f2a3ec: e35c0a01 cmp ip, #4096 ; 0x1000 + 1f2a3f0: ca000129 bgt 1f2a89c + 1f2a3f4: e59d80a8 ldr r8, [sp, #168] ; 0xa8 + 1f2a3f8: e58d8020 str r8, [sp, #32] + 1f2a3fc: e3580a02 cmp r8, #8192 ; 0x2000 + 1f2a400: ca000125 bgt 1f2a89c + 1f2a404: e59de0ac ldr lr, [sp, #172] ; 0xac + 1f2a408: e58de024 str lr, [sp, #36] ; 0x24 + 1f2a40c: e35e0901 cmp lr, #16384 ; 0x4000 + 1f2a410: ca000121 bgt 1f2a89c + 1f2a414: e59dc0b0 ldr ip, [sp, #176] ; 0xb0 + 1f2a418: e58dc028 str ip, [sp, #40] ; 0x28 + 1f2a41c: e35c0902 cmp ip, #32768 ; 0x8000 + 1f2a420: ca00011d bgt 1f2a89c + 1f2a424: e2858b01 add r8, r5, #1024 ; 0x400 + 1f2a428: e285ee46 add lr, r5, #1120 ; 0x460 + 1f2a42c: e3a0c000 mov ip, #0 + 1f2a430: e2881004 add r1, r8, #4 + 1f2a434: e58d102c str r1, [sp, #44] ; 0x2c + 1f2a438: e1a01783 lsl r1, r3, #15 + 1f2a43c: e1c8c0b2 strh ip, [r8, #2] + 1f2a440: e1a0800e mov r8, lr + 1f2a444: e1cec0b6 strh ip, [lr, #6] + 1f2a448: e1a0e083 lsl lr, r3, #1 + 1f2a44c: e5841c28 str r1, [r4, #3112] ; 0xc28 + 1f2a450: e58dc038 str ip, [sp, #56] ; 0x38 + 1f2a454: e08ec00a add ip, lr, sl + 1f2a458: e59d102c ldr r1, [sp, #44] ; 0x2c + 1f2a45c: e35a0000 cmp sl, #0 + 1f2a460: 135c0004 cmpne ip, #4 + 1f2a464: e58de03c str lr, [sp, #60] ; 0x3c + 1f2a468: e1c1e0b0 strh lr, [r1] + 1f2a46c: e1c830b8 strh r3, [r8, #8] + 1f2a470: ca000103 bgt 1f2a884 + 1f2a474: e1a0808c lsl r8, ip, #1 + 1f2a478: e285ee46 add lr, r5, #1120 ; 0x460 + 1f2a47c: e083300a add r3, r3, sl + 1f2a480: e2851b01 add r1, r5, #1024 ; 0x400 + 1f2a484: e088a000 add sl, r8, r0 + 1f2a488: e1a0c70c lsl ip, ip, #14 + 1f2a48c: e3500000 cmp r0, #0 + 1f2a490: 135a0008 cmpne sl, #8 + 1f2a494: e584cc2c str ip, [r4, #3116] ; 0xc2c + 1f2a498: e58d8040 str r8, [sp, #64] ; 0x40 + 1f2a49c: e28ee00a add lr, lr, #10 + 1f2a4a0: e1c180b6 strh r8, [r1, #6] + 1f2a4a4: e1ce30b0 strh r3, [lr] + 1f2a4a8: ca0000f5 bgt 1f2a884 + 1f2a4ac: e59d1004 ldr r1, [sp, #4] + 1f2a4b0: e1a0808a lsl r8, sl, #1 + 1f2a4b4: e285eb01 add lr, r5, #1024 ; 0x400 + 1f2a4b8: e0833000 add r3, r3, r0 + 1f2a4bc: e088c001 add ip, r8, r1 + 1f2a4c0: e2840ec7 add r0, r4, #3184 ; 0xc70 + 1f2a4c4: e3510000 cmp r1, #0 + 1f2a4c8: 135c0010 cmpne ip, #16 + 1f2a4cc: e1a0a68a lsl sl, sl, #13 + 1f2a4d0: e58d8044 str r8, [sp, #68] ; 0x44 + 1f2a4d4: e28ee008 add lr, lr, #8 + 1f2a4d8: e584ac30 str sl, [r4, #3120] ; 0xc30 + 1f2a4dc: e1ce80b0 strh r8, [lr] + 1f2a4e0: e1c030b0 strh r3, [r0] + 1f2a4e4: ca0000e6 bgt 1f2a884 + 1f2a4e8: e1a0808c lsl r8, ip, #1 + 1f2a4ec: e285ee46 add lr, r5, #1120 ; 0x460 + 1f2a4f0: e2850b01 add r0, r5, #1024 ; 0x400 + 1f2a4f4: e088a002 add sl, r8, r2 + 1f2a4f8: e3520000 cmp r2, #0 + 1f2a4fc: 135a0020 cmpne sl, #32 + 1f2a500: e0833001 add r3, r3, r1 + 1f2a504: e1a0c60c lsl ip, ip, #12 + 1f2a508: e58d8048 str r8, [sp, #72] ; 0x48 + 1f2a50c: e584cc34 str ip, [r4, #3124] ; 0xc34 + 1f2a510: e28ee00e add lr, lr, #14 + 1f2a514: e1c080ba strh r8, [r0, #10] + 1f2a518: e1ce30b0 strh r3, [lr] + 1f2a51c: ca0000d8 bgt 1f2a884 + 1f2a520: e1a0008a lsl r0, sl, #1 + 1f2a524: e083e002 add lr, r3, r2 + 1f2a528: e2841ec1 add r1, r4, #3088 ; 0xc10 + 1f2a52c: e080300b add r3, r0, fp + 1f2a530: e2852e47 add r2, r5, #1136 ; 0x470 + 1f2a534: e35b0000 cmp fp, #0 + 1f2a538: 13530040 cmpne r3, #64 ; 0x40 + 1f2a53c: e1a0a58a lsl sl, sl, #11 + 1f2a540: e58d004c str r0, [sp, #76] ; 0x4c + 1f2a544: e584ac38 str sl, [r4, #3128] ; 0xc38 + 1f2a548: e1c100b0 strh r0, [r1] + 1f2a54c: e1c2e0b0 strh lr, [r2] + 1f2a550: ca0000cb bgt 1f2a884 + 1f2a554: e08eb00b add fp, lr, fp + 1f2a558: e59de008 ldr lr, [sp, #8] + 1f2a55c: e1a00083 lsl r0, r3, #1 + 1f2a560: e1a01002 mov r1, r2 + 1f2a564: e285cb01 add ip, r5, #1024 ; 0x400 + 1f2a568: e080200e add r2, r0, lr + 1f2a56c: e35e0000 cmp lr, #0 + 1f2a570: 13520080 cmpne r2, #128 ; 0x80 + 1f2a574: e1a03503 lsl r3, r3, #10 + 1f2a578: e58d0050 str r0, [sp, #80] ; 0x50 + 1f2a57c: e5843c3c str r3, [r4, #3132] ; 0xc3c + 1f2a580: e1cc00be strh r0, [ip, #14] + 1f2a584: e1c1b0b2 strh fp, [r1, #2] + 1f2a588: ca0000bd bgt 1f2a884 + 1f2a58c: e59d800c ldr r8, [sp, #12] + 1f2a590: e1a03082 lsl r3, r2, #1 + 1f2a594: e285ce47 add ip, r5, #1136 ; 0x470 + 1f2a598: e2850e41 add r0, r5, #1040 ; 0x410 + 1f2a59c: e0831008 add r1, r3, r8 + 1f2a5a0: e08bb00e add fp, fp, lr + 1f2a5a4: e3580000 cmp r8, #0 + 1f2a5a8: 13510c01 cmpne r1, #256 ; 0x100 + 1f2a5ac: e1a02482 lsl r2, r2, #9 + 1f2a5b0: e1a0e008 mov lr, r8 + 1f2a5b4: e5842c40 str r2, [r4, #3136] ; 0xc40 + 1f2a5b8: e58d3054 str r3, [sp, #84] ; 0x54 + 1f2a5bc: e1c030b0 strh r3, [r0] + 1f2a5c0: e1ccb0b4 strh fp, [ip, #4] + 1f2a5c4: ca0000ae bgt 1f2a884 + 1f2a5c8: e08b3008 add r3, fp, r8 + 1f2a5cc: e59d8010 ldr r8, [sp, #16] + 1f2a5d0: e1a0e000 mov lr, r0 + 1f2a5d4: e1a00081 lsl r0, r1, #1 + 1f2a5d8: e2852e47 add r2, r5, #1136 ; 0x470 + 1f2a5dc: e080c008 add ip, r0, r8 + 1f2a5e0: e3580000 cmp r8, #0 + 1f2a5e4: 135c0c02 cmpne ip, #512 ; 0x200 + 1f2a5e8: e1a01401 lsl r1, r1, #8 + 1f2a5ec: e58d0058 str r0, [sp, #88] ; 0x58 + 1f2a5f0: e28ee002 add lr, lr, #2 + 1f2a5f4: e5841c44 str r1, [r4, #3140] ; 0xc44 + 1f2a5f8: e1ce00b0 strh r0, [lr] + 1f2a5fc: e1c230b6 strh r3, [r2, #6] + 1f2a600: ca00009f bgt 1f2a884 + 1f2a604: e0833008 add r3, r3, r8 + 1f2a608: e59d8014 ldr r8, [sp, #20] + 1f2a60c: e1a0108c lsl r1, ip, #1 + 1f2a610: e285ee41 add lr, r5, #1040 ; 0x410 + 1f2a614: e2852e47 add r2, r5, #1136 ; 0x470 + 1f2a618: e0810008 add r0, r1, r8 + 1f2a61c: e3580000 cmp r8, #0 + 1f2a620: 13500b01 cmpne r0, #1024 ; 0x400 + 1f2a624: e1a0c38c lsl ip, ip, #7 + 1f2a628: e58d105c str r1, [sp, #92] ; 0x5c + 1f2a62c: e28ee004 add lr, lr, #4 + 1f2a630: e584cc48 str ip, [r4, #3144] ; 0xc48 + 1f2a634: e1ce10b0 strh r1, [lr] + 1f2a638: e1c230b8 strh r3, [r2, #8] + 1f2a63c: ca000090 bgt 1f2a884 + 1f2a640: e0833008 add r3, r3, r8 + 1f2a644: e59d8018 ldr r8, [sp, #24] + 1f2a648: e1a01080 lsl r1, r0, #1 + 1f2a64c: e285ee41 add lr, r5, #1040 ; 0x410 + 1f2a650: e2852e47 add r2, r5, #1136 ; 0x470 + 1f2a654: e081c008 add ip, r1, r8 + 1f2a658: e3580000 cmp r8, #0 + 1f2a65c: 135c0b02 cmpne ip, #2048 ; 0x800 + 1f2a660: e1a00300 lsl r0, r0, #6 + 1f2a664: e58d1060 str r1, [sp, #96] ; 0x60 + 1f2a668: e28ee006 add lr, lr, #6 + 1f2a66c: e5840c4c str r0, [r4, #3148] ; 0xc4c + 1f2a670: e1ce10b0 strh r1, [lr] + 1f2a674: e1c230ba strh r3, [r2, #10] + 1f2a678: ca000081 bgt 1f2a884 + 1f2a67c: e59da01c ldr sl, [sp, #28] + 1f2a680: e1a0008c lsl r0, ip, #1 + 1f2a684: e2851e41 add r1, r5, #1040 ; 0x410 + 1f2a688: e284ed32 add lr, r4, #3200 ; 0xc80 + 1f2a68c: e080200a add r2, r0, sl + 1f2a690: e0833008 add r3, r3, r8 + 1f2a694: e35a0000 cmp sl, #0 + 1f2a698: 13520a01 cmpne r2, #4096 ; 0x1000 + 1f2a69c: e1a0c28c lsl ip, ip, #5 + 1f2a6a0: e58d0064 str r0, [sp, #100] ; 0x64 + 1f2a6a4: e584cc50 str ip, [r4, #3152] ; 0xc50 + 1f2a6a8: e1c100b8 strh r0, [r1, #8] + 1f2a6ac: e1ce30b0 strh r3, [lr] + 1f2a6b0: ca000073 bgt 1f2a884 + 1f2a6b4: e59d8020 ldr r8, [sp, #32] + 1f2a6b8: e1a0c082 lsl ip, r2, #1 + 1f2a6bc: e2850e41 add r0, r5, #1040 ; 0x410 + 1f2a6c0: e2851e47 add r1, r5, #1136 ; 0x470 + 1f2a6c4: e08ce008 add lr, ip, r8 + 1f2a6c8: e083300a add r3, r3, sl + 1f2a6cc: e3580000 cmp r8, #0 + 1f2a6d0: 135e0a02 cmpne lr, #8192 ; 0x2000 + 1f2a6d4: e1a02202 lsl r2, r2, #4 + 1f2a6d8: e58dc068 str ip, [sp, #104] ; 0x68 + 1f2a6dc: e5842c54 str r2, [r4, #3156] ; 0xc54 + 1f2a6e0: e1c0c0ba strh ip, [r0, #10] + 1f2a6e4: e1c130be strh r3, [r1, #14] + 1f2a6e8: ca000065 bgt 1f2a884 + 1f2a6ec: e0833008 add r3, r3, r8 + 1f2a6f0: e59d8024 ldr r8, [sp, #36] ; 0x24 + 1f2a6f4: e1a0008e lsl r0, lr, #1 + 1f2a6f8: e2841ec2 add r1, r4, #3104 ; 0xc20 + 1f2a6fc: e0802008 add r2, r0, r8 + 1f2a700: e285cd12 add ip, r5, #1152 ; 0x480 + 1f2a704: e3580000 cmp r8, #0 + 1f2a708: 13520901 cmpne r2, #16384 ; 0x4000 + 1f2a70c: e1a0e18e lsl lr, lr, #3 + 1f2a710: e58d006c str r0, [sp, #108] ; 0x6c + 1f2a714: e584ec58 str lr, [r4, #3160] ; 0xc58 + 1f2a718: e1c100b0 strh r0, [r1] + 1f2a71c: e1cc30b0 strh r3, [ip] + 1f2a720: ca000057 bgt 1f2a884 + 1f2a724: e0833008 add r3, r3, r8 + 1f2a728: e59d8028 ldr r8, [sp, #40] ; 0x28 + 1f2a72c: e1a0c082 lsl ip, r2, #1 + 1f2a730: e2850e41 add r0, r5, #1040 ; 0x410 + 1f2a734: e2851d12 add r1, r5, #1152 ; 0x480 + 1f2a738: e08ce008 add lr, ip, r8 + 1f2a73c: e3580000 cmp r8, #0 + 1f2a740: 135e0902 cmpne lr, #32768 ; 0x8000 + 1f2a744: e1a02102 lsl r2, r2, #2 + 1f2a748: e58dc070 str ip, [sp, #112] ; 0x70 + 1f2a74c: e5842c5c str r2, [r4, #3164] ; 0xc5c + 1f2a750: e1c0c0be strh ip, [r0, #14] + 1f2a754: e1c130b2 strh r3, [r1, #2] + 1f2a758: ca000049 bgt 1f2a884 + 1f2a75c: e1a0e08e lsl lr, lr, #1 + 1f2a760: e3a03801 mov r3, #65536 ; 0x10000 + 1f2a764: e584ec60 str lr, [r4, #3168] ; 0xc60 + 1f2a768: e3a0c000 mov ip, #0 + 1f2a76c: e5843c64 str r3, [r4, #3172] ; 0xc64 + 1f2a770: e5f92001 ldrb r2, [r9, #1]! + 1f2a774: e3520000 cmp r2, #0 + 1f2a778: 0a00003d beq 1f2a874 + 1f2a77c: e0841082 add r1, r4, r2, lsl #1 + 1f2a780: e1a08102 lsl r8, r2, #2 + 1f2a784: e2813b03 add r3, r1, #3072 ; 0xc00 + 1f2a788: e28d00b8 add r0, sp, #184 ; 0xb8 + 1f2a78c: e2811ec6 add r1, r1, #3168 ; 0xc60 + 1f2a790: e2833004 add r3, r3, #4 + 1f2a794: e0800008 add r0, r0, r8 + 1f2a798: e2811008 add r1, r1, #8 + 1f2a79c: e3520009 cmp r2, #9 + 1f2a7a0: e1d330b0 ldrh r3, [r3] + 1f2a7a4: e510e084 ldr lr, [r0, #-132] ; 0xffffff7c + 1f2a7a8: e1d110b0 ldrh r1, [r1] + 1f2a7ac: e063300e rsb r3, r3, lr + 1f2a7b0: e0833001 add r3, r3, r1 + 1f2a7b4: e2831e2d add r1, r3, #720 ; 0x2d0 + 1f2a7b8: e0843003 add r3, r4, r3 + 1f2a7bc: e0851081 add r1, r5, r1, lsl #1 + 1f2a7c0: e5c32c88 strb r2, [r3, #3208] ; 0xc88 + 1f2a7c4: e1c1c0b4 strh ip, [r1, #4] + 1f2a7c8: ca000025 bgt 1f2a864 + 1f2a7cc: e1a0a0ce asr sl, lr, #1 + 1f2a7d0: e1a0008e lsl r0, lr, #1 + 1f2a7d4: e3051555 movw r1, #21845 ; 0x5555 + 1f2a7d8: e30a3aaa movw r3, #43690 ; 0xaaaa + 1f2a7dc: e001100a and r1, r1, sl + 1f2a7e0: e0033000 and r3, r3, r0 + 1f2a7e4: e1813003 orr r3, r1, r3 + 1f2a7e8: e303a333 movw sl, #13107 ; 0x3333 + 1f2a7ec: e30c1ccc movw r1, #52428 ; 0xcccc + 1f2a7f0: e3000f0f movw r0, #3855 ; 0xf0f + 1f2a7f4: e1a0b143 asr fp, r3, #2 + 1f2a7f8: e1a03103 lsl r3, r3, #2 + 1f2a7fc: e00aa00b and sl, sl, fp + 1f2a800: e0011003 and r1, r1, r3 + 1f2a804: e18a1001 orr r1, sl, r1 + 1f2a808: e30f30f0 movw r3, #61680 ; 0xf0f0 + 1f2a80c: e262b010 rsb fp, r2, #16 + 1f2a810: e1a0a241 asr sl, r1, #4 + 1f2a814: e1a01201 lsl r1, r1, #4 + 1f2a818: e000000a and r0, r0, sl + 1f2a81c: e0033001 and r3, r3, r1 + 1f2a820: e1803003 orr r3, r0, r3 + 1f2a824: e3a01001 mov r1, #1 + 1f2a828: e1a00211 lsl r0, r1, r2 + 1f2a82c: e18c1482 orr r1, ip, r2, lsl #9 + 1f2a830: e1a02403 lsl r2, r3, #8 + 1f2a834: e1a0a080 lsl sl, r0, #1 + 1f2a838: e6ff1071 uxth r1, r1 + 1f2a83c: e6ff2072 uxth r2, r2 + 1f2a840: e1823423 orr r3, r2, r3, lsr #8 + 1f2a844: e1a03b53 asr r3, r3, fp + 1f2a848: e2832b01 add r2, r3, #1024 ; 0x400 + 1f2a84c: e2822002 add r2, r2, #2 + 1f2a850: e0842082 add r2, r4, r2, lsl #1 + 1f2a854: e0833000 add r3, r3, r0 + 1f2a858: e08210ba strh r1, [r2], sl + 1f2a85c: e3530c02 cmp r3, #512 ; 0x200 + 1f2a860: bafffffb blt 1f2a854 + 1f2a864: e28d30b8 add r3, sp, #184 ; 0xb8 + 1f2a868: e28ee001 add lr, lr, #1 + 1f2a86c: e0838008 add r8, r3, r8 + 1f2a870: e508e084 str lr, [r8, #-132] ; 0xffffff7c + 1f2a874: e28cc001 add ip, ip, #1 + 1f2a878: e35c0020 cmp ip, #32 + 1f2a87c: 1affffbb bne 1f2a770 + 1f2a880: eafffa51 b 1f291cc + 1f2a884: e30a336c movw r3, #41836 ; 0xa36c + 1f2a888: e340320d movt r3, #525 ; 0x20d + 1f2a88c: e3002f18 movw r2, #3864 ; 0xf18 + 1f2a890: e34021f6 movt r2, #502 ; 0x1f6 + 1f2a894: e5832000 str r2, [r3] + 1f2a898: eafffbe1 b 1f29824 + 1f2a89c: e30a336c movw r3, #41836 ; 0xa36c + 1f2a8a0: e340320d movt r3, #525 ; 0x20d + 1f2a8a4: e3002f0c movw r2, #3852 ; 0xf0c + 1f2a8a8: e34021f6 movt r2, #502 ; 0x1f6 + 1f2a8ac: e5832000 str r2, [r3] + 1f2a8b0: eafffbdb b 1f29824 + 1f2a8b4: e5843010 str r3, [r4, #16] + 1f2a8b8: e59d3000 ldr r3, [sp] + 1f2a8bc: e3530000 cmp r3, #0 + 1f2a8c0: 1a00008b bne 1f2aaf4 + 1f2a8c4: e5942008 ldr r2, [r4, #8] + 1f2a8c8: e594500c ldr r5, [r4, #12] + 1f2a8cc: eafff9ff b 1f290d0 + 1f2a8d0: e1530005 cmp r3, r5 + 1f2a8d4: aa00000d bge 1f2a910 + 1f2a8d8: e8944001 ldm r4, {r0, lr} + 1f2a8dc: e15e0000 cmp lr, r0 + 1f2a8e0: e280c001 add ip, r0, #1 + 1f2a8e4: 8584c000 strhi ip, [r4] + 1f2a8e8: e3a02000 mov r2, #0 + 1f2a8ec: 85d02000 ldrbhi r2, [r0] + 1f2a8f0: 81a0000c movhi r0, ip + 1f2a8f4: 81a02312 lslhi r2, r2, r3 + 1f2a8f8: e2833008 add r3, r3, #8 + 1f2a8fc: e3530018 cmp r3, #24 + 1f2a900: e1811002 orr r1, r1, r2 + 1f2a904: e5843008 str r3, [r4, #8] + 1f2a908: e584100c str r1, [r4, #12] + 1f2a90c: dafffff2 ble 1f2a8dc + 1f2a910: e0653003 rsb r3, r5, r3 + 1f2a914: e1a01531 lsr r1, r1, r5 + 1f2a918: e3530000 cmp r3, #0 + 1f2a91c: e584100c str r1, [r4, #12] + 1f2a920: e5843008 str r3, [r4, #8] + 1f2a924: cafffce7 bgt 1f29cc8 + 1f2a928: e3a01002 mov r1, #2 + 1f2a92c: e3a00001 mov r0, #1 + 1f2a930: e3a02000 mov r2, #0 + 1f2a934: e5945004 ldr r5, [r4, #4] + 1f2a938: e594c000 ldr ip, [r4] + 1f2a93c: e15c0005 cmp ip, r5 + 1f2a940: 2a00003d bcs 1f2aa3c + 1f2a944: e28de0b8 add lr, sp, #184 ; 0xb8 + 1f2a948: e28c3001 add r3, ip, #1 + 1f2a94c: e08ee002 add lr, lr, r2 + 1f2a950: e5843000 str r3, [r4] + 1f2a954: e1530005 cmp r3, r5 + 1f2a958: e5dc8000 ldrb r8, [ip] + 1f2a95c: 328c3002 addcc r3, ip, #2 + 1f2a960: e54e8044 strb r8, [lr, #-68] ; 0xffffffbc + 1f2a964: 23a0c000 movcs ip, #0 + 1f2a968: 35843000 strcc r3, [r4] + 1f2a96c: 35dcc001 ldrbcc ip, [ip, #1] + 1f2a970: e28de0b8 add lr, sp, #184 ; 0xb8 + 1f2a974: e3510004 cmp r1, #4 + 1f2a978: e08e0000 add r0, lr, r0 + 1f2a97c: e540c044 strb ip, [r0, #-68] ; 0xffffffbc + 1f2a980: 0a000027 beq 1f2aa24 + 1f2a984: e1550003 cmp r5, r3 + 1f2a988: 8a000017 bhi 1f2a9ec + 1f2a98c: e28d30b8 add r3, sp, #184 ; 0xb8 + 1f2a990: e3520000 cmp r2, #0 + 1f2a994: e0831001 add r1, r3, r1 + 1f2a998: e3a03000 mov r3, #0 + 1f2a99c: e5413044 strb r3, [r1, #-68] ; 0xffffffbc + 1f2a9a0: 1a00001f bne 1f2aa24 + 1f2a9a4: e5dd0075 ldrb r0, [sp, #117] ; 0x75 + 1f2a9a8: e5ddc074 ldrb ip, [sp, #116] ; 0x74 + 1f2a9ac: e5dde076 ldrb lr, [sp, #118] ; 0x76 + 1f2a9b0: eafffce1 b 1f29d3c + 1f2a9b4: e5942004 ldr r2, [r4, #4] + 1f2a9b8: e5943000 ldr r3, [r4] + 1f2a9bc: e1530002 cmp r3, r2 + 1f2a9c0: 23a02000 movcs r2, #0 + 1f2a9c4: 2afffcdc bcs 1f29d3c + 1f2a9c8: e2832001 add r2, r3, #1 + 1f2a9cc: e5842000 str r2, [r4] + 1f2a9d0: e5dd0075 ldrb r0, [sp, #117] ; 0x75 + 1f2a9d4: e5d32000 ldrb r2, [r3] + 1f2a9d8: e5cd2077 strb r2, [sp, #119] ; 0x77 + 1f2a9dc: e5ddc074 ldrb ip, [sp, #116] ; 0x74 + 1f2a9e0: e1a02402 lsl r2, r2, #8 + 1f2a9e4: e5dde076 ldrb lr, [sp, #118] ; 0x76 + 1f2a9e8: eafffcd3 b 1f29d3c + 1f2a9ec: e28d00b8 add r0, sp, #184 ; 0xb8 + 1f2a9f0: e3520000 cmp r2, #0 + 1f2a9f4: e0801001 add r1, r0, r1 + 1f2a9f8: e2830001 add r0, r3, #1 + 1f2a9fc: e5840000 str r0, [r4] + 1f2aa00: e5d3c000 ldrb ip, [r3] + 1f2aa04: e541c044 strb ip, [r1, #-68] ; 0xffffffbc + 1f2aa08: 1a000005 bne 1f2aa24 + 1f2aa0c: e1500005 cmp r0, r5 + 1f2aa10: 32832002 addcc r2, r3, #2 + 1f2aa14: 35842000 strcc r2, [r4] + 1f2aa18: 35d32001 ldrbcc r2, [r3, #1] + 1f2aa1c: 31a02402 lslcc r2, r2, #8 + 1f2aa20: eaffffdf b 1f2a9a4 + 1f2aa24: e5dd2077 ldrb r2, [sp, #119] ; 0x77 + 1f2aa28: e5dd0075 ldrb r0, [sp, #117] ; 0x75 + 1f2aa2c: e5ddc074 ldrb ip, [sp, #116] ; 0x74 + 1f2aa30: e1a02402 lsl r2, r2, #8 + 1f2aa34: e5dde076 ldrb lr, [sp, #118] ; 0x76 + 1f2aa38: eafffcbf b 1f29d3c + 1f2aa3c: e28de0b8 add lr, sp, #184 ; 0xb8 + 1f2aa40: e3a08000 mov r8, #0 + 1f2aa44: e08ee002 add lr, lr, r2 + 1f2aa48: e1a0300c mov r3, ip + 1f2aa4c: e1a0c008 mov ip, r8 + 1f2aa50: e54e8044 strb r8, [lr, #-68] ; 0xffffffbc + 1f2aa54: eaffffc5 b 1f2a970 + 1f2aa58: e3a01004 mov r1, #4 + 1f2aa5c: e3a00003 mov r0, #3 + 1f2aa60: e3a02002 mov r2, #2 + 1f2aa64: eaffffb2 b 1f2a934 + 1f2aa68: e3a01003 mov r1, #3 + 1f2aa6c: e3a00002 mov r0, #2 + 1f2aa70: e3a02001 mov r2, #1 + 1f2aa74: eaffffae b 1f2a934 + 1f2aa78: e5940014 ldr r0, [r4, #20] + 1f2aa7c: e0608002 rsb r8, r0, r2 + 1f2aa80: e0609003 rsb r9, r0, r3 + 1f2aa84: e0853008 add r3, r5, r8 + 1f2aa88: e1530009 cmp r3, r9 + 1f2aa8c: da000002 ble 1f2aa9c + 1f2aa90: e1a09089 lsl r9, r9, #1 + 1f2aa94: e1530009 cmp r3, r9 + 1f2aa98: cafffffc bgt 1f2aa90 + 1f2aa9c: e1a01009 mov r1, r9 + 1f2aaa0: eb0051d5 bl 1f3f1fc + 1f2aaa4: e3500000 cmp r0, #0 + 1f2aaa8: 0afffc63 beq 1f29c3c + 1f2aaac: e5941000 ldr r1, [r4] + 1f2aab0: e0802008 add r2, r0, r8 + 1f2aab4: e0803009 add r3, r0, r9 + 1f2aab8: e5842010 str r2, [r4, #16] + 1f2aabc: e5843018 str r3, [r4, #24] + 1f2aac0: e5840014 str r0, [r4, #20] + 1f2aac4: e1a00002 mov r0, r2 + 1f2aac8: e1a02005 mov r2, r5 + 1f2aacc: eb0050cb bl 1f3ee00 + 1f2aad0: e5943000 ldr r3, [r4] + 1f2aad4: e5940010 ldr r0, [r4, #16] + 1f2aad8: e0833005 add r3, r3, r5 + 1f2aadc: e5843000 str r3, [r4] + 1f2aae0: e59d3000 ldr r3, [sp] + 1f2aae4: e0800005 add r0, r0, r5 + 1f2aae8: e5840010 str r0, [r4, #16] + 1f2aaec: e3530000 cmp r3, #0 + 1f2aaf0: 0affff73 beq 1f2a8c4 + 1f2aaf4: e3a00001 mov r0, #1 + 1f2aaf8: e28dd0bc add sp, sp, #188 ; 0xbc + 1f2aafc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f2ab00: e30a336c movw r3, #41836 ; 0xa36c + 1f2ab04: e340320d movt r3, #525 ; 0x20d + 1f2ab08: e3002f68 movw r2, #3944 ; 0xf68 + 1f2ab0c: e34021f6 movt r2, #502 ; 0x1f6 + 1f2ab10: e5832000 str r2, [r3] + 1f2ab14: eafffb42 b 1f29824 + 1f2ab18: e5901004 ldr r1, [r0, #4] + 1f2ab1c: e5902000 ldr r2, [r0] + 1f2ab20: e1510002 cmp r1, r2 + 1f2ab24: 9a000025 bls 1f2abc0 + 1f2ab28: e2823001 add r3, r2, #1 + 1f2ab2c: e5803000 str r3, [r0] + 1f2ab30: e1510003 cmp r1, r3 + 1f2ab34: e5d23000 ldrb r3, [r2] + 1f2ab38: e203100f and r1, r3, #15 + 1f2ab3c: 9a000014 bls 1f2ab94 + 1f2ab40: e282c002 add ip, r2, #2 + 1f2ab44: e580c000 str ip, [r0] + 1f2ab48: e3004843 movw r4, #2115 ; 0x843 + 1f2ab4c: e3484421 movt r4, #33825 ; 0x8421 + 1f2ab50: e5d2c001 ldrb ip, [r2, #1] + 1f2ab54: e08c3403 add r3, ip, r3, lsl #8 + 1f2ab58: e0c54493 smull r4, r5, r3, r4 + 1f2ab5c: e1a02fc3 asr r2, r3, #31 + 1f2ab60: e083e005 add lr, r3, r5 + 1f2ab64: e062224e rsb r2, r2, lr, asr #4 + 1f2ab68: e0622282 rsb r2, r2, r2, lsl #5 + 1f2ab6c: e1530002 cmp r3, r2 + 1f2ab70: 1a000018 bne 1f2abd8 + 1f2ab74: e31c0020 tst ip, #32 + 1f2ab78: 0a00000e beq 1f2abb8 + 1f2ab7c: e30a336c movw r3, #41836 ; 0xa36c + 1f2ab80: e340320d movt r3, #525 ; 0x20d + 1f2ab84: e3002f38 movw r2, #3896 ; 0xf38 + 1f2ab88: e34021f6 movt r2, #502 ; 0x1f6 + 1f2ab8c: e5832000 str r2, [r3] + 1f2ab90: eafffb23 b 1f29824 + 1f2ab94: e1a03403 lsl r3, r3, #8 + 1f2ab98: e3004843 movw r4, #2115 ; 0x843 + 1f2ab9c: e3484421 movt r4, #33825 ; 0x8421 + 1f2aba0: e0c54493 smull r4, r5, r3, r4 + 1f2aba4: e0832005 add r2, r3, r5 + 1f2aba8: e1a02242 asr r2, r2, #4 + 1f2abac: e0622282 rsb r2, r2, r2, lsl #5 + 1f2abb0: e1530002 cmp r3, r2 + 1f2abb4: 1a000007 bne 1f2abd8 + 1f2abb8: e3510008 cmp r1, #8 + 1f2abbc: 0afff937 beq 1f290a0 + 1f2abc0: e30a336c movw r3, #41836 ; 0xa36c + 1f2abc4: e340320d movt r3, #525 ; 0x20d + 1f2abc8: e3002f48 movw r2, #3912 ; 0xf48 + 1f2abcc: e34021f6 movt r2, #502 ; 0x1f6 + 1f2abd0: e5832000 str r2, [r3] + 1f2abd4: eafffb12 b 1f29824 + 1f2abd8: e30a336c movw r3, #41836 ; 0xa36c + 1f2abdc: e340320d movt r3, #525 ; 0x20d + 1f2abe0: e3002f28 movw r2, #3880 ; 0xf28 + 1f2abe4: e34021f6 movt r2, #502 ; 0x1f6 + 1f2abe8: e5832000 str r2, [r3] + 1f2abec: eafffb0c b 1f29824 + +01f2abf0 : + 1f2abf0: e59020a8 ldr r2, [r0, #168] ; 0xa8 + 1f2abf4: e59010ac ldr r1, [r0, #172] ; 0xac + 1f2abf8: e92d4070 push {r4, r5, r6, lr} + 1f2abfc: e1520001 cmp r2, r1 + 1f2ac00: e1a04000 mov r4, r0 + 1f2ac04: 3a00001f bcc 1f2ac88 + 1f2ac08: e5900020 ldr r0, [r0, #32] + 1f2ac0c: e3500000 cmp r0, #0 + 1f2ac10: 01a05000 moveq r5, r0 + 1f2ac14: 1a000001 bne 1f2ac20 + 1f2ac18: e0850000 add r0, r5, r0 + 1f2ac1c: e8bd8070 pop {r4, r5, r6, pc} + 1f2ac20: e2845028 add r5, r4, #40 ; 0x28 + 1f2ac24: e5943010 ldr r3, [r4, #16] + 1f2ac28: e1a01005 mov r1, r5 + 1f2ac2c: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f2ac30: e594001c ldr r0, [r4, #28] + 1f2ac34: e12fff33 blx r3 + 1f2ac38: e3500000 cmp r0, #0 + 1f2ac3c: 02841029 addeq r1, r4, #41 ; 0x29 + 1f2ac40: 10851000 addne r1, r5, r0 + 1f2ac44: 01a03001 moveq r3, r1 + 1f2ac48: 12843029 addne r3, r4, #41 ; 0x29 + 1f2ac4c: 01a02000 moveq r2, r0 + 1f2ac50: 15d42028 ldrbne r2, [r4, #40] ; 0x28 + 1f2ac54: 05840020 streq r0, [r4, #32] + 1f2ac58: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f2ac5c: e1530001 cmp r3, r1 + 1f2ac60: e58410ac str r1, [r4, #172] ; 0xac + 1f2ac64: e1a05002 mov r5, r2 + 1f2ac68: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f2ac6c: 2a00000a bcs 1f2ac9c + 1f2ac70: e2832001 add r2, r3, #1 + 1f2ac74: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f2ac78: e5d30000 ldrb r0, [r3] + 1f2ac7c: e1a00400 lsl r0, r0, #8 + 1f2ac80: e0850000 add r0, r5, r0 + 1f2ac84: e8bd8070 pop {r4, r5, r6, pc} + 1f2ac88: e2823001 add r3, r2, #1 + 1f2ac8c: e58030a8 str r3, [r0, #168] ; 0xa8 + 1f2ac90: e1530001 cmp r3, r1 + 1f2ac94: e5d25000 ldrb r5, [r2] + 1f2ac98: 3afffff4 bcc 1f2ac70 + 1f2ac9c: e5940020 ldr r0, [r4, #32] + 1f2aca0: e3500000 cmp r0, #0 + 1f2aca4: 0affffdb beq 1f2ac18 + 1f2aca8: e2846028 add r6, r4, #40 ; 0x28 + 1f2acac: e5943010 ldr r3, [r4, #16] + 1f2acb0: e1a01006 mov r1, r6 + 1f2acb4: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f2acb8: e594001c ldr r0, [r4, #28] + 1f2acbc: e12fff33 blx r3 + 1f2acc0: e3500000 cmp r0, #0 + 1f2acc4: 10866000 addne r6, r6, r0 + 1f2acc8: 02846029 addeq r6, r4, #41 ; 0x29 + 1f2accc: 15d42028 ldrbne r2, [r4, #40] ; 0x28 + 1f2acd0: 01a03006 moveq r3, r6 + 1f2acd4: 05840020 streq r0, [r4, #32] + 1f2acd8: 12843029 addne r3, r4, #41 ; 0x29 + 1f2acdc: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f2ace0: 11a00402 lslne r0, r2, #8 + 1f2ace4: e58460ac str r6, [r4, #172] ; 0xac + 1f2ace8: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f2acec: e0850000 add r0, r5, r0 + 1f2acf0: e8bd8070 pop {r4, r5, r6, pc} + +01f2acf4 : + 1f2acf4: e59030a8 ldr r3, [r0, #168] ; 0xa8 + 1f2acf8: e59010ac ldr r1, [r0, #172] ; 0xac + 1f2acfc: e92d4070 push {r4, r5, r6, lr} + 1f2ad00: e1530001 cmp r3, r1 + 1f2ad04: e1a04000 mov r4, r0 + 1f2ad08: 3a00001f bcc 1f2ad8c + 1f2ad0c: e5900020 ldr r0, [r0, #32] + 1f2ad10: e3500000 cmp r0, #0 + 1f2ad14: 01a05000 moveq r5, r0 + 1f2ad18: 1a000001 bne 1f2ad24 + 1f2ad1c: e0800005 add r0, r0, r5 + 1f2ad20: e8bd8070 pop {r4, r5, r6, pc} + 1f2ad24: e2845028 add r5, r4, #40 ; 0x28 + 1f2ad28: e5943010 ldr r3, [r4, #16] + 1f2ad2c: e1a01005 mov r1, r5 + 1f2ad30: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f2ad34: e594001c ldr r0, [r4, #28] + 1f2ad38: e12fff33 blx r3 + 1f2ad3c: e3500000 cmp r0, #0 + 1f2ad40: 02841029 addeq r1, r4, #41 ; 0x29 + 1f2ad44: 12843029 addne r3, r4, #41 ; 0x29 + 1f2ad48: 15d42028 ldrbne r2, [r4, #40] ; 0x28 + 1f2ad4c: 01a03001 moveq r3, r1 + 1f2ad50: 10851000 addne r1, r5, r0 + 1f2ad54: 05840020 streq r0, [r4, #32] + 1f2ad58: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f2ad5c: 01a05000 moveq r5, r0 + 1f2ad60: 11a05402 lslne r5, r2, #8 + 1f2ad64: e1a02003 mov r2, r3 + 1f2ad68: e1520001 cmp r2, r1 + 1f2ad6c: e58410ac str r1, [r4, #172] ; 0xac + 1f2ad70: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f2ad74: 2a00000a bcs 1f2ada4 + 1f2ad78: e2823001 add r3, r2, #1 + 1f2ad7c: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f2ad80: e5d20000 ldrb r0, [r2] + 1f2ad84: e0800005 add r0, r0, r5 + 1f2ad88: e8bd8070 pop {r4, r5, r6, pc} + 1f2ad8c: e2832001 add r2, r3, #1 + 1f2ad90: e58020a8 str r2, [r0, #168] ; 0xa8 + 1f2ad94: e1520001 cmp r2, r1 + 1f2ad98: e5d35000 ldrb r5, [r3] + 1f2ad9c: e1a05405 lsl r5, r5, #8 + 1f2ada0: 3afffff4 bcc 1f2ad78 + 1f2ada4: e5940020 ldr r0, [r4, #32] + 1f2ada8: e3500000 cmp r0, #0 + 1f2adac: 0affffda beq 1f2ad1c + 1f2adb0: e2846028 add r6, r4, #40 ; 0x28 + 1f2adb4: e5943010 ldr r3, [r4, #16] + 1f2adb8: e1a01006 mov r1, r6 + 1f2adbc: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f2adc0: e594001c ldr r0, [r4, #28] + 1f2adc4: e12fff33 blx r3 + 1f2adc8: e2503000 subs r3, r0, #0 + 1f2adcc: 02846029 addeq r6, r4, #41 ; 0x29 + 1f2add0: 01a00003 moveq r0, r3 + 1f2add4: 15d40028 ldrbne r0, [r4, #40] ; 0x28 + 1f2add8: 10866003 addne r6, r6, r3 + 1f2addc: 05843020 streq r3, [r4, #32] + 1f2ade0: 12843029 addne r3, r4, #41 ; 0x29 + 1f2ade4: 05c43028 strbeq r3, [r4, #40] ; 0x28 + 1f2ade8: e0800005 add r0, r0, r5 + 1f2adec: 01a03006 moveq r3, r6 + 1f2adf0: e58460ac str r6, [r4, #172] ; 0xac + 1f2adf4: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f2adf8: e8bd8070 pop {r4, r5, r6, pc} + +01f2adfc : + 1f2adfc: e59030a8 ldr r3, [r0, #168] ; 0xa8 + 1f2ae00: e59010ac ldr r1, [r0, #172] ; 0xac + 1f2ae04: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f2ae08: e1530001 cmp r3, r1 + 1f2ae0c: e1a04000 mov r4, r0 + 1f2ae10: 3a00002d bcc 1f2aecc + 1f2ae14: e5905020 ldr r5, [r0, #32] + 1f2ae18: e3550000 cmp r5, #0 + 1f2ae1c: 1a000005 bne 1f2ae38 + 1f2ae20: e3a03000 mov r3, #0 + 1f2ae24: e1a05805 lsl r5, r5, #16 + 1f2ae28: e1a07003 mov r7, r3 + 1f2ae2c: e0870003 add r0, r7, r3 + 1f2ae30: e0800005 add r0, r0, r5 + 1f2ae34: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f2ae38: e2806028 add r6, r0, #40 ; 0x28 + 1f2ae3c: e5903010 ldr r3, [r0, #16] + 1f2ae40: e1a01006 mov r1, r6 + 1f2ae44: e5902024 ldr r2, [r0, #36] ; 0x24 + 1f2ae48: e590001c ldr r0, [r0, #28] + 1f2ae4c: e12fff33 blx r3 + 1f2ae50: e2505000 subs r5, r0, #0 + 1f2ae54: 02841029 addeq r1, r4, #41 ; 0x29 + 1f2ae58: 12843029 addne r3, r4, #41 ; 0x29 + 1f2ae5c: 15d40028 ldrbne r0, [r4, #40] ; 0x28 + 1f2ae60: 01a03001 moveq r3, r1 + 1f2ae64: 10861005 addne r1, r6, r5 + 1f2ae68: e1a02003 mov r2, r3 + 1f2ae6c: 05845020 streq r5, [r4, #32] + 1f2ae70: 05c45028 strbeq r5, [r4, #40] ; 0x28 + 1f2ae74: 11a05400 lslne r5, r0, #8 + 1f2ae78: e1520001 cmp r2, r1 + 1f2ae7c: e58410ac str r1, [r4, #172] ; 0xac + 1f2ae80: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f2ae84: 2a000016 bcs 1f2aee4 + 1f2ae88: e2823001 add r3, r2, #1 + 1f2ae8c: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f2ae90: e1530001 cmp r3, r1 + 1f2ae94: e5d20000 ldrb r0, [r2] + 1f2ae98: e0805005 add r5, r0, r5 + 1f2ae9c: e1a05805 lsl r5, r5, #16 + 1f2aea0: 2a000028 bcs 1f2af48 + 1f2aea4: e2832001 add r2, r3, #1 + 1f2aea8: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f2aeac: e1520001 cmp r2, r1 + 1f2aeb0: e5d30000 ldrb r0, [r3] + 1f2aeb4: e1a07400 lsl r7, r0, #8 + 1f2aeb8: 2a00003a bcs 1f2afa8 + 1f2aebc: e2821001 add r1, r2, #1 + 1f2aec0: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f2aec4: e5d23000 ldrb r3, [r2] + 1f2aec8: eaffffd7 b 1f2ae2c + 1f2aecc: e2832001 add r2, r3, #1 + 1f2aed0: e58020a8 str r2, [r0, #168] ; 0xa8 + 1f2aed4: e1520001 cmp r2, r1 + 1f2aed8: e5d35000 ldrb r5, [r3] + 1f2aedc: e1a05405 lsl r5, r5, #8 + 1f2aee0: 3affffe8 bcc 1f2ae88 + 1f2aee4: e5943020 ldr r3, [r4, #32] + 1f2aee8: e3530000 cmp r3, #0 + 1f2aeec: 0affffcb beq 1f2ae20 + 1f2aef0: e2846028 add r6, r4, #40 ; 0x28 + 1f2aef4: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f2aef8: e1a01006 mov r1, r6 + 1f2aefc: e5943010 ldr r3, [r4, #16] + 1f2af00: e594001c ldr r0, [r4, #28] + 1f2af04: e12fff33 blx r3 + 1f2af08: e2503000 subs r3, r0, #0 + 1f2af0c: 02841029 addeq r1, r4, #41 ; 0x29 + 1f2af10: 12842029 addne r2, r4, #41 ; 0x29 + 1f2af14: 01a02001 moveq r2, r1 + 1f2af18: 15d40028 ldrbne r0, [r4, #40] ; 0x28 + 1f2af1c: 01a00003 moveq r0, r3 + 1f2af20: 10861003 addne r1, r6, r3 + 1f2af24: 05843020 streq r3, [r4, #32] + 1f2af28: e0805005 add r5, r0, r5 + 1f2af2c: 05c43028 strbeq r3, [r4, #40] ; 0x28 + 1f2af30: e1a03002 mov r3, r2 + 1f2af34: e1530001 cmp r3, r1 + 1f2af38: e58410ac str r1, [r4, #172] ; 0xac + 1f2af3c: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f2af40: e1a05805 lsl r5, r5, #16 + 1f2af44: 3affffd6 bcc 1f2aea4 + 1f2af48: e5947020 ldr r7, [r4, #32] + 1f2af4c: e3570000 cmp r7, #0 + 1f2af50: 0a000029 beq 1f2affc + 1f2af54: e2846028 add r6, r4, #40 ; 0x28 + 1f2af58: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f2af5c: e1a01006 mov r1, r6 + 1f2af60: e5943010 ldr r3, [r4, #16] + 1f2af64: e594001c ldr r0, [r4, #28] + 1f2af68: e12fff33 blx r3 + 1f2af6c: e3500000 cmp r0, #0 + 1f2af70: 02841029 addeq r1, r4, #41 ; 0x29 + 1f2af74: 1284c029 addne ip, r4, #41 ; 0x29 + 1f2af78: 15d47028 ldrbne r7, [r4, #40] ; 0x28 + 1f2af7c: 01a0c001 moveq ip, r1 + 1f2af80: 10861000 addne r1, r6, r0 + 1f2af84: e1a0200c mov r2, ip + 1f2af88: 05840020 streq r0, [r4, #32] + 1f2af8c: 01a07000 moveq r7, r0 + 1f2af90: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f2af94: 11a07407 lslne r7, r7, #8 + 1f2af98: e1520001 cmp r2, r1 + 1f2af9c: e58410ac str r1, [r4, #172] ; 0xac + 1f2afa0: e584c0a8 str ip, [r4, #168] ; 0xa8 + 1f2afa4: 3affffc4 bcc 1f2aebc + 1f2afa8: e5943020 ldr r3, [r4, #32] + 1f2afac: e3530000 cmp r3, #0 + 1f2afb0: 0affff9d beq 1f2ae2c + 1f2afb4: e2846028 add r6, r4, #40 ; 0x28 + 1f2afb8: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f2afbc: e5943010 ldr r3, [r4, #16] + 1f2afc0: e1a01006 mov r1, r6 + 1f2afc4: e594001c ldr r0, [r4, #28] + 1f2afc8: e12fff33 blx r3 + 1f2afcc: e3500000 cmp r0, #0 + 1f2afd0: 02846029 addeq r6, r4, #41 ; 0x29 + 1f2afd4: 10866000 addne r6, r6, r0 + 1f2afd8: 01a02006 moveq r2, r6 + 1f2afdc: 12842029 addne r2, r4, #41 ; 0x29 + 1f2afe0: 05840020 streq r0, [r4, #32] + 1f2afe4: 01a03000 moveq r3, r0 + 1f2afe8: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f2afec: 15d43028 ldrbne r3, [r4, #40] ; 0x28 + 1f2aff0: e58460ac str r6, [r4, #172] ; 0xac + 1f2aff4: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f2aff8: eaffff8b b 1f2ae2c + 1f2affc: e1a03007 mov r3, r7 + 1f2b000: eaffff89 b 1f2ae2c + +01f2b004 : + 1f2b004: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f2b008: e1a04002 mov r4, r2 + 1f2b00c: e1a06000 mov r6, r0 + 1f2b010: ed2d8b10 vpush {d8-d15} + 1f2b014: e24ddf87 sub sp, sp, #540 ; 0x21c + 1f2b018: e1942003 orrs r2, r4, r3 + 1f2b01c: e58d3018 str r3, [sp, #24] + 1f2b020: 4a00000a bmi 1f2b050 + 1f2b024: e3530000 cmp r3, #0 + 1f2b028: e1a05001 mov r5, r1 + 1f2b02c: e1a02003 mov r2, r3 + 1f2b030: 1a000090 bne 1f2b278 + 1f2b034: e59d3280 ldr r3, [sp, #640] ; 0x280 + 1f2b038: e3530000 cmp r3, #0 + 1f2b03c: e59d3018 ldr r3, [sp, #24] + 1f2b040: e0030394 mul r3, r4, r3 + 1f2b044: e58d3010 str r3, [sp, #16] + 1f2b048: e1a02003 mov r2, r3 + 1f2b04c: aa00000a bge 1f2b07c + 1f2b050: e1a00006 mov r0, r6 + 1f2b054: eb004d4b bl 1f3e588 + 1f2b058: e30a336c movw r3, #41836 ; 0xa36c + 1f2b05c: e340320d movt r3, #525 ; 0x20d + 1f2b060: e3a00000 mov r0, #0 + 1f2b064: e3002f90 movw r2, #3984 ; 0xf90 + 1f2b068: e34021f6 movt r2, #502 ; 0x1f6 + 1f2b06c: e5832000 str r2, [r3] + 1f2b070: e28ddf87 add sp, sp, #540 ; 0x21c + 1f2b074: ecbd8b10 vpop {d8-d15} + 1f2b078: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f2b07c: 0a0003ef beq 1f2c040 + 1f2b080: e59d1280 ldr r1, [sp, #640] ; 0x280 + 1f2b084: e3e03102 mvn r3, #-2147483648 ; 0x80000000 + 1f2b088: e713f113 sdiv r3, r3, r1 + 1f2b08c: e1520003 cmp r2, r3 + 1f2b090: caffffee bgt 1f2b050 + 1f2b094: e0000192 mul r0, r2, r1 + 1f2b098: eb004d32 bl 1f3e568 + 1f2b09c: e250b000 subs fp, r0, #0 + 1f2b0a0: 0affffea beq 1f2b050 + 1f2b0a4: e59dc018 ldr ip, [sp, #24] + 1f2b0a8: e0844185 add r4, r4, r5, lsl #3 + 1f2b0ac: e244400a sub r4, r4, #10 + 1f2b0b0: f2c4c85d vmov.i16 q14, #77 ; 0x004d + 1f2b0b4: e24c2002 sub r2, ip, #2 + 1f2b0b8: e1a0300c mov r3, ip + 1f2b0bc: e1a08002 mov r8, r2 + 1f2b0c0: e58d2020 str r2, [sp, #32] + 1f2b0c4: e3780001 cmn r8, #1 + 1f2b0c8: e24c2001 sub r2, ip, #1 + 1f2b0cc: b3a03001 movlt r3, #1 + 1f2b0d0: e1a0e002 mov lr, r2 + 1f2b0d4: e1a01003 mov r1, r3 + 1f2b0d8: e58d2008 str r2, [sp, #8] + 1f2b0dc: e2410010 sub r0, r1, #16 + 1f2b0e0: e2411011 sub r1, r1, #17 + 1f2b0e4: e1a0208c lsl r2, ip, #1 + 1f2b0e8: e58d301c str r3, [sp, #28] + 1f2b0ec: e1a00220 lsr r0, r0, #4 + 1f2b0f0: e1a01221 lsr r1, r1, #4 + 1f2b0f4: e2800001 add r0, r0, #1 + 1f2b0f8: e2811001 add r1, r1, #1 + 1f2b0fc: e1a07001 mov r7, r1 + 1f2b100: e58d1058 str r1, [sp, #88] ; 0x58 + 1f2b104: e1a0100c mov r1, ip + 1f2b108: b3a03001 movlt r3, #1 + 1f2b10c: e00c059c mul ip, ip, r5 + 1f2b110: e58dc00c str ip, [sp, #12] + 1f2b114: e1a0c200 lsl ip, r0, #4 + 1f2b118: e1a0900c mov r9, ip + 1f2b11c: e58dc034 str ip, [sp, #52] ; 0x34 + 1f2b120: e1a0c207 lsl ip, r7, #4 + 1f2b124: a3a03000 movge r3, #0 + 1f2b128: e1a05000 mov r5, r0 + 1f2b12c: e1a0a00c mov sl, ip + 1f2b130: e58d0040 str r0, [sp, #64] ; 0x40 + 1f2b134: e1a00280 lsl r0, r0, #5 + 1f2b138: e58dc050 str ip, [sp, #80] ; 0x50 + 1f2b13c: e1a0c287 lsl ip, r7, #5 + 1f2b140: e58d003c str r0, [sp, #60] ; 0x3c + 1f2b144: e1a0000e mov r0, lr + 1f2b148: e58dc054 str ip, [sp, #84] ; 0x54 + 1f2b14c: a1a0c002 movge ip, r2 + 1f2b150: b3a0c002 movlt ip, #2 + 1f2b154: e58d4014 str r4, [sp, #20] + 1f2b158: e58dc02c str ip, [sp, #44] ; 0x2c + 1f2b15c: e069400e rsb r4, r9, lr + 1f2b160: e35e000e cmp lr, #14 + 1f2b164: 81a0c003 movhi ip, r3 + 1f2b168: 9383c001 orrls ip, r3, #1 + 1f2b16c: e58d4044 str r4, [sp, #68] ; 0x44 + 1f2b170: e58dc024 str ip, [sp, #36] ; 0x24 + 1f2b174: e06a4000 rsb r4, sl, r0 + 1f2b178: e1a0c000 mov ip, r0 + 1f2b17c: e59de03c ldr lr, [sp, #60] ; 0x3c + 1f2b180: e59d0054 ldr r0, [sp, #84] ; 0x54 + 1f2b184: e3780001 cmn r8, #1 + 1f2b188: a0822001 addge r2, r2, r1 + 1f2b18c: b3a02003 movlt r2, #3 + 1f2b190: e08ee009 add lr, lr, r9 + 1f2b194: e080000a add r0, r0, sl + 1f2b198: e58de048 str lr, [sp, #72] ; 0x48 + 1f2b19c: e58d405c str r4, [sp, #92] ; 0x5c + 1f2b1a0: e3a0e096 mov lr, #150 ; 0x96 + 1f2b1a4: e58d0060 str r0, [sp, #96] ; 0x60 + 1f2b1a8: e3a0401d mov r4, #29 + 1f2b1ac: e1a00305 lsl r0, r5, #6 + 1f2b1b0: e58d2028 str r2, [sp, #40] ; 0x28 + 1f2b1b4: e58d004c str r0, [sp, #76] ; 0x4c + 1f2b1b8: b3a02004 movlt r2, #4 + 1f2b1bc: a1a02101 lslge r2, r1, #2 + 1f2b1c0: e1a00307 lsl r0, r7, #6 + 1f2b1c4: e35c000f cmp ip, #15 + 1f2b1c8: 93833001 orrls r3, r3, #1 + 1f2b1cc: e58d0064 str r0, [sp, #100] ; 0x64 + 1f2b1d0: e1a01006 mov r1, r6 + 1f2b1d4: e58d2030 str r2, [sp, #48] ; 0x30 + 1f2b1d8: e1a0000b mov r0, fp + 1f2b1dc: e58d3038 str r3, [sp, #56] ; 0x38 + 1f2b1e0: e3a0c000 mov ip, #0 + 1f2b1e4: e3a0504d mov r5, #77 ; 0x4d + 1f2b1e8: e58db004 str fp, [sp, #4] + 1f2b1ec: e59d3004 ldr r3, [sp, #4] + 1f2b1f0: e0668001 rsb r8, r6, r1 + 1f2b1f4: e59d9014 ldr r9, [sp, #20] + 1f2b1f8: e1a02001 mov r2, r1 + 1f2b1fc: e0637000 rsb r7, r3, r0 + 1f2b200: e1a03000 mov r3, r0 + 1f2b204: e3590019 cmp r9, #25 + 1f2b208: 979ff109 ldrls pc, [pc, r9, lsl #2] + 1f2b20c: ea00037c b 1f2c004 + 1f2b210: 01f2bc50 .word 0x01f2bc50 + 1f2b214: 01f2bb7c .word 0x01f2bb7c + 1f2b218: 01f2bdcc .word 0x01f2bdcc + 1f2b21c: 01f2c004 .word 0x01f2c004 + 1f2b220: 01f2c004 .word 0x01f2c004 + 1f2b224: 01f2c004 .word 0x01f2c004 + 1f2b228: 01f2c004 .word 0x01f2c004 + 1f2b22c: 01f2bd14 .word 0x01f2bd14 + 1f2b230: 01f2c004 .word 0x01f2c004 + 1f2b234: 01f2baa4 .word 0x01f2baa4 + 1f2b238: 01f2b9c8 .word 0x01f2b9c8 + 1f2b23c: 01f2c004 .word 0x01f2c004 + 1f2b240: 01f2c004 .word 0x01f2c004 + 1f2b244: 01f2c004 .word 0x01f2c004 + 1f2b248: 01f2c004 .word 0x01f2c004 + 1f2b24c: 01f2b870 .word 0x01f2b870 + 1f2b250: 01f2b708 .word 0x01f2b708 + 1f2b254: 01f2c004 .word 0x01f2c004 + 1f2b258: 01f2b628 .word 0x01f2b628 + 1f2b25c: 01f2c004 .word 0x01f2c004 + 1f2b260: 01f2c004 .word 0x01f2c004 + 1f2b264: 01f2c004 .word 0x01f2c004 + 1f2b268: 01f2c004 .word 0x01f2c004 + 1f2b26c: 01f2b4d0 .word 0x01f2b4d0 + 1f2b270: 01f2b368 .word 0x01f2b368 + 1f2b274: 01f2b28c .word 0x01f2b28c + 1f2b278: e3e03102 mvn r3, #-2147483648 ; 0x80000000 + 1f2b27c: e713f213 sdiv r3, r3, r2 + 1f2b280: e1540003 cmp r4, r3 + 1f2b284: daffff6a ble 1f2b034 + 1f2b288: eaffff70 b 1f2b050 + 1f2b28c: e59d9008 ldr r9, [sp, #8] + 1f2b290: e3790001 cmn r9, #1 + 1f2b294: 0a00035a beq 1f2c004 + 1f2b298: e59d9030 ldr r9, [sp, #48] ; 0x30 + 1f2b29c: e0898008 add r8, r9, r8 + 1f2b2a0: e59d9028 ldr r9, [sp, #40] ; 0x28 + 1f2b2a4: e0868008 add r8, r6, r8 + 1f2b2a8: e0897007 add r7, r9, r7 + 1f2b2ac: e59d9004 ldr r9, [sp, #4] + 1f2b2b0: e0897007 add r7, r9, r7 + 1f2b2b4: e59d9020 ldr r9, [sp, #32] + 1f2b2b8: e1510007 cmp r1, r7 + 1f2b2bc: 31500008 cmpcc r0, r8 + 1f2b2c0: e59d7018 ldr r7, [sp, #24] + 1f2b2c4: 23a08001 movcs r8, #1 + 1f2b2c8: 33a08000 movcc r8, #0 + 1f2b2cc: e357000f cmp r7, #15 + 1f2b2d0: 93a07000 movls r7, #0 + 1f2b2d4: 83a07001 movhi r7, #1 + 1f2b2d8: e3790001 cmn r9, #1 + 1f2b2dc: b3a07000 movlt r7, #0 + 1f2b2e0: e1180007 tst r8, r7 + 1f2b2e4: 0a00079e beq 1f2d164 + 1f2b2e8: e59d7038 ldr r7, [sp, #56] ; 0x38 + 1f2b2ec: e3570000 cmp r7, #0 + 1f2b2f0: 1a00048d bne 1f2c52c + 1f2b2f4: e1a02000 mov r2, r0 + 1f2b2f8: e1a03001 mov r3, r1 + 1f2b2fc: f463010f vld4.8 {d16,d18,d20,d22}, [r3] + 1f2b300: e2839020 add r9, r3, #32 + 1f2b304: e59d8058 ldr r8, [sp, #88] ; 0x58 + 1f2b308: e2877001 add r7, r7, #1 + 1f2b30c: e2833040 add r3, r3, #64 ; 0x40 + 1f2b310: e1580007 cmp r8, r7 + 1f2b314: e2828018 add r8, r2, #24 + 1f2b318: f469110f vld4.8 {d17,d19,d21,d23}, [r9] + 1f2b31c: f22041f0 vorr q2, q8, q8 + 1f2b320: f22261f2 vorr q3, q9, q9 + 1f2b324: f22481f4 vorr q4, q10, q10 + 1f2b328: f402450f vst3.8 {d4,d6,d8}, [r2] + 1f2b32c: e2822030 add r2, r2, #48 ; 0x30 + 1f2b330: f408550f vst3.8 {d5,d7,d9}, [r8] + 1f2b334: 8afffff0 bhi 1f2b2fc + 1f2b338: e28d3068 add r3, sp, #104 ; 0x68 + 1f2b33c: e59d2050 ldr r2, [sp, #80] ; 0x50 + 1f2b340: ec834b0c vstmia r3, {d4-d9} + 1f2b344: e59d301c ldr r3, [sp, #28] + 1f2b348: e1530002 cmp r3, r2 + 1f2b34c: e59d3064 ldr r3, [sp, #100] ; 0x64 + 1f2b350: e0812003 add r2, r1, r3 + 1f2b354: e59d3060 ldr r3, [sp, #96] ; 0x60 + 1f2b358: e0803003 add r3, r0, r3 + 1f2b35c: 0a000328 beq 1f2c004 + 1f2b360: e59d705c ldr r7, [sp, #92] ; 0x5c + 1f2b364: ea000471 b 1f2c530 + 1f2b368: e59d9008 ldr r9, [sp, #8] + 1f2b36c: e3790001 cmn r9, #1 + 1f2b370: 0a000323 beq 1f2c004 + 1f2b374: e59d9030 ldr r9, [sp, #48] ; 0x30 + 1f2b378: e0898008 add r8, r9, r8 + 1f2b37c: e59d902c ldr r9, [sp, #44] ; 0x2c + 1f2b380: e0868008 add r8, r6, r8 + 1f2b384: e0897007 add r7, r9, r7 + 1f2b388: e59d9004 ldr r9, [sp, #4] + 1f2b38c: e0897007 add r7, r9, r7 + 1f2b390: e59d9020 ldr r9, [sp, #32] + 1f2b394: e1510007 cmp r1, r7 + 1f2b398: 31500008 cmpcc r0, r8 + 1f2b39c: e59d7018 ldr r7, [sp, #24] + 1f2b3a0: 23a08001 movcs r8, #1 + 1f2b3a4: 33a08000 movcc r8, #0 + 1f2b3a8: e357000f cmp r7, #15 + 1f2b3ac: 93a07000 movls r7, #0 + 1f2b3b0: 83a07001 movhi r7, #1 + 1f2b3b4: e3790001 cmn r9, #1 + 1f2b3b8: b3a07000 movlt r7, #0 + 1f2b3bc: e1180007 tst r8, r7 + 1f2b3c0: 0a000734 beq 1f2d098 + 1f2b3c4: e59d8024 ldr r8, [sp, #36] ; 0x24 + 1f2b3c8: e3580000 cmp r8, #0 + 1f2b3cc: 1a000465 bne 1f2c568 + 1f2b3d0: f3c1a856 vmov.i16 q13, #150 ; 0x0096 + 1f2b3d4: e59d9040 ldr r9, [sp, #64] ; 0x40 + 1f2b3d8: f2c1885d vmov.i16 q12, #29 ; 0x001d + 1f2b3dc: e1a07000 mov r7, r0 + 1f2b3e0: e1a03001 mov r3, r1 + 1f2b3e4: e1a02008 mov r2, r8 + 1f2b3e8: f423010f vld4.8 {d0,d2,d4,d6}, [r3] + 1f2b3ec: e2838020 add r8, r3, #32 + 1f2b3f0: e2822001 add r2, r2, #1 + 1f2b3f4: e2833040 add r3, r3, #64 ; 0x40 + 1f2b3f8: e1590002 cmp r9, r2 + 1f2b3fc: f428110f vld4.8 {d1,d3,d5,d7}, [r8] + 1f2b400: f3c80a10 vmovl.u8 q8, d0 + 1f2b404: f3c86a12 vmovl.u8 q11, d2 + 1f2b408: f3c84a13 vmovl.u8 q10, d3 + 1f2b40c: f388ca11 vmovl.u8 q6, d1 + 1f2b410: f2d0ecac vmull.s16 q15, d16, d28 + 1f2b414: f2d12cad vmull.s16 q9, d17, d29 + 1f2b418: f2d60caa vmull.s16 q8, d22, d26 + 1f2b41c: f2d76cab vmull.s16 q11, d23, d27 + 1f2b420: f226a156 vorr q5, q3, q3 + 1f2b424: f26ee8e0 vadd.i32 q15, q15, q8 + 1f2b428: f3c80a14 vmovl.u8 q8, d4 + 1f2b42c: f26228e6 vadd.i32 q9, q9, q11 + 1f2b430: f2dc6c2c vmull.s16 q11, d12, d28 + 1f2b434: f29dcc2d vmull.s16 q6, d13, d29 + 1f2b438: f290eca8 vmull.s16 q7, d16, d24 + 1f2b43c: f2d10ca9 vmull.s16 q8, d17, d25 + 1f2b440: f26ee8ce vadd.i32 q15, q15, q7 + 1f2b444: f26208e0 vadd.i32 q8, q9, q8 + 1f2b448: f294ecaa vmull.s16 q7, d20, d26 + 1f2b44c: f2d52cab vmull.s16 q9, d21, d27 + 1f2b450: f2f8e07e vshr.s32 q15, q15, #8 + 1f2b454: f2f84070 vshr.s32 q10, q8, #8 + 1f2b458: f26668ce vadd.i32 q11, q11, q7 + 1f2b45c: f388ea15 vmovl.u8 q7, d5 + 1f2b460: f26c2862 vadd.i32 q9, q6, q9 + 1f2b464: f3b6c22e vmovn.i32 d12, q15 + 1f2b468: f3b6d224 vmovn.i32 d13, q10 + 1f2b46c: f2df0c29 vmull.s16 q8, d15, d25 + 1f2b470: f2de4c28 vmull.s16 q10, d14, d24 + 1f2b474: f26208e0 vadd.i32 q8, q9, q8 + 1f2b478: f26668e4 vadd.i32 q11, q11, q10 + 1f2b47c: f2f80070 vshr.s32 q8, q8, #8 + 1f2b480: f2f86076 vshr.s32 q11, q11, #8 + 1f2b484: f3f62226 vmovn.i32 d18, q11 + 1f2b488: f3f63220 vmovn.i32 d19, q8 + 1f2b48c: f3b2820c vmovn.i16 d8, q6 + 1f2b490: f3b29222 vmovn.i16 d9, q9 + 1f2b494: f407830f vst2.8 {d8-d11}, [r7] + 1f2b498: e2877020 add r7, r7, #32 + 1f2b49c: 8affffd1 bhi 1f2b3e8 + 1f2b4a0: e28d3098 add r3, sp, #152 ; 0x98 + 1f2b4a4: e59d201c ldr r2, [sp, #28] + 1f2b4a8: f40382df vst1.64 {d8-d11}, [r3 :64] + 1f2b4ac: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f2b4b0: e1530002 cmp r3, r2 + 1f2b4b4: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f2b4b8: e0812003 add r2, r1, r3 + 1f2b4bc: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f2b4c0: e0803003 add r3, r0, r3 + 1f2b4c4: 0a0002ce beq 1f2c004 + 1f2b4c8: e59d7044 ldr r7, [sp, #68] ; 0x44 + 1f2b4cc: ea000426 b 1f2c56c + 1f2b4d0: e59d9008 ldr r9, [sp, #8] + 1f2b4d4: e3790001 cmn r9, #1 + 1f2b4d8: 0a0002c9 beq 1f2c004 + 1f2b4dc: e59d9030 ldr r9, [sp, #48] ; 0x30 + 1f2b4e0: e0898008 add r8, r9, r8 + 1f2b4e4: e59d901c ldr r9, [sp, #28] + 1f2b4e8: e0868008 add r8, r6, r8 + 1f2b4ec: e0897007 add r7, r9, r7 + 1f2b4f0: e59d9004 ldr r9, [sp, #4] + 1f2b4f4: e0897007 add r7, r9, r7 + 1f2b4f8: e59d9020 ldr r9, [sp, #32] + 1f2b4fc: e1510007 cmp r1, r7 + 1f2b500: 31500008 cmpcc r0, r8 + 1f2b504: e59d7018 ldr r7, [sp, #24] + 1f2b508: 23a08001 movcs r8, #1 + 1f2b50c: 33a08000 movcc r8, #0 + 1f2b510: e357000f cmp r7, #15 + 1f2b514: 93a07000 movls r7, #0 + 1f2b518: 83a07001 movhi r7, #1 + 1f2b51c: e3790001 cmn r9, #1 + 1f2b520: b3a07000 movlt r7, #0 + 1f2b524: e1180007 tst r8, r7 + 1f2b528: 0a0006fe beq 1f2d128 + 1f2b52c: e59d8038 ldr r8, [sp, #56] ; 0x38 + 1f2b530: e3580000 cmp r8, #0 + 1f2b534: 1a0003ed bne 1f2c4f0 + 1f2b538: f3818856 vmov.i16 q4, #150 ; 0x0096 + 1f2b53c: e59d9058 ldr r9, [sp, #88] ; 0x58 + 1f2b540: f2c1e85d vmov.i16 q15, #29 ; 0x001d + 1f2b544: e1a07000 mov r7, r0 + 1f2b548: e1a03001 mov r3, r1 + 1f2b54c: e1a02008 mov r2, r8 + 1f2b550: f423010f vld4.8 {d0,d2,d4,d6}, [r3] + 1f2b554: e2838020 add r8, r3, #32 + 1f2b558: e2822001 add r2, r2, #1 + 1f2b55c: e2833040 add r3, r3, #64 ; 0x40 + 1f2b560: e1590002 cmp r9, r2 + 1f2b564: f428110f vld4.8 {d1,d3,d5,d7}, [r8] + 1f2b568: f3c82a12 vmovl.u8 q9, d2 + 1f2b56c: f3c86a10 vmovl.u8 q11, d0 + 1f2b570: f388ca13 vmovl.u8 q6, d3 + 1f2b574: f3c80a11 vmovl.u8 q8, d1 + 1f2b578: f2d24c88 vmull.s16 q10, d18, d8 + 1f2b57c: f2d6acac vmull.s16 q13, d22, d28 + 1f2b580: f388aa14 vmovl.u8 q5, d4 + 1f2b584: f2d76cad vmull.s16 q11, d23, d29 + 1f2b588: f2d38c89 vmull.s16 q12, d19, d9 + 1f2b58c: f26aa8e4 vadd.i32 q13, q13, q10 + 1f2b590: f2dc2c08 vmull.s16 q9, d12, d8 + 1f2b594: f3886a15 vmovl.u8 q3, d5 + 1f2b598: f2d04cac vmull.s16 q10, d16, d28 + 1f2b59c: f29dcc09 vmull.s16 q6, d13, d9 + 1f2b5a0: f2d10cad vmull.s16 q8, d17, d29 + 1f2b5a4: f26688e8 vadd.i32 q12, q11, q12 + 1f2b5a8: f26448e2 vadd.i32 q10, q10, q9 + 1f2b5ac: f29a2c2e vmull.s16 q1, d10, d30 + 1f2b5b0: f26028cc vadd.i32 q9, q8, q6 + 1f2b5b4: f2db6c2f vmull.s16 q11, d11, d31 + 1f2b5b8: f2964c2e vmull.s16 q2, d6, d30 + 1f2b5bc: f2d70c2f vmull.s16 q8, d7, d31 + 1f2b5c0: f26aa8c2 vadd.i32 q13, q13, q1 + 1f2b5c4: f26868e6 vadd.i32 q11, q12, q11 + 1f2b5c8: f26448c4 vadd.i32 q10, q10, q2 + 1f2b5cc: f26208e0 vadd.i32 q8, q9, q8 + 1f2b5d0: f2f8807a vshr.s32 q12, q13, #8 + 1f2b5d4: f2f86076 vshr.s32 q11, q11, #8 + 1f2b5d8: f2f82074 vshr.s32 q9, q10, #8 + 1f2b5dc: f2f80070 vshr.s32 q8, q8, #8 + 1f2b5e0: f3f6a228 vmovn.i32 d26, q12 + 1f2b5e4: f3f6b226 vmovn.i32 d27, q11 + 1f2b5e8: f3f64222 vmovn.i32 d20, q9 + 1f2b5ec: f3f65220 vmovn.i32 d21, q8 + 1f2b5f0: f3f2022a vmovn.i16 d16, q13 + 1f2b5f4: f3f21224 vmovn.i16 d17, q10 + 1f2b5f8: f4470a0f vst1.8 {d16-d17}, [r7] + 1f2b5fc: e2877010 add r7, r7, #16 + 1f2b600: 8affffd2 bhi 1f2b550 + 1f2b604: e59d201c ldr r2, [sp, #28] + 1f2b608: e59d3050 ldr r3, [sp, #80] ; 0x50 + 1f2b60c: e1520003 cmp r2, r3 + 1f2b610: e59d2064 ldr r2, [sp, #100] ; 0x64 + 1f2b614: e0803003 add r3, r0, r3 + 1f2b618: e0812002 add r2, r1, r2 + 1f2b61c: 0a000278 beq 1f2c004 + 1f2b620: e59da05c ldr sl, [sp, #92] ; 0x5c + 1f2b624: ea0003b2 b 1f2c4f4 + 1f2b628: e59d9008 ldr r9, [sp, #8] + 1f2b62c: e3790001 cmn r9, #1 + 1f2b630: 0a000273 beq 1f2c004 + 1f2b634: e59d9028 ldr r9, [sp, #40] ; 0x28 + 1f2b638: e0898008 add r8, r9, r8 + 1f2b63c: e59d9030 ldr r9, [sp, #48] ; 0x30 + 1f2b640: e0868008 add r8, r6, r8 + 1f2b644: e0897007 add r7, r9, r7 + 1f2b648: e59d9004 ldr r9, [sp, #4] + 1f2b64c: e0897007 add r7, r9, r7 + 1f2b650: e59d9020 ldr r9, [sp, #32] + 1f2b654: e1510007 cmp r1, r7 + 1f2b658: 31500008 cmpcc r0, r8 + 1f2b65c: e59d7018 ldr r7, [sp, #24] + 1f2b660: 23a08001 movcs r8, #1 + 1f2b664: 33a08000 movcc r8, #0 + 1f2b668: e357000f cmp r7, #15 + 1f2b66c: 93a07000 movls r7, #0 + 1f2b670: 83a07001 movhi r7, #1 + 1f2b674: e3790001 cmn r9, #1 + 1f2b678: b3a07000 movlt r7, #0 + 1f2b67c: e1180007 tst r8, r7 + 1f2b680: 0a000697 beq 1f2d0e4 + 1f2b684: e59d7024 ldr r7, [sp, #36] ; 0x24 + 1f2b688: e3570000 cmp r7, #0 + 1f2b68c: 1a000469 bne 1f2c838 + 1f2b690: e1a02000 mov r2, r0 + 1f2b694: e1a03001 mov r3, r1 + 1f2b698: f423450f vld3.8 {d4,d6,d8}, [r3] + 1f2b69c: e2839018 add r9, r3, #24 + 1f2b6a0: e59d8040 ldr r8, [sp, #64] ; 0x40 + 1f2b6a4: f3c76e5f vmov.i8 q11, #255 ; 0xff + 1f2b6a8: e2877001 add r7, r7, #1 + 1f2b6ac: e2833030 add r3, r3, #48 ; 0x30 + 1f2b6b0: e1580007 cmp r8, r7 + 1f2b6b4: e2828020 add r8, r2, #32 + 1f2b6b8: f429550f vld3.8 {d5,d7,d9}, [r9] + 1f2b6bc: f2640154 vorr q8, q2, q2 + 1f2b6c0: f2662156 vorr q9, q3, q3 + 1f2b6c4: f2684158 vorr q10, q4, q4 + 1f2b6c8: f442010f vst4.8 {d16,d18,d20,d22}, [r2] + 1f2b6cc: e2822040 add r2, r2, #64 ; 0x40 + 1f2b6d0: f448110f vst4.8 {d17,d19,d21,d23}, [r8] + 1f2b6d4: 8affffef bhi 1f2b698 + 1f2b6d8: e28d30b8 add r3, sp, #184 ; 0xb8 + 1f2b6dc: e59d201c ldr r2, [sp, #28] + 1f2b6e0: ecc30b10 vstmia r3, {d16-d23} + 1f2b6e4: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f2b6e8: e1530002 cmp r3, r2 + 1f2b6ec: e59d3048 ldr r3, [sp, #72] ; 0x48 + 1f2b6f0: e0812003 add r2, r1, r3 + 1f2b6f4: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f2b6f8: e0803003 add r3, r0, r3 + 1f2b6fc: 0a000240 beq 1f2c004 + 1f2b700: e59d7044 ldr r7, [sp, #68] ; 0x44 + 1f2b704: ea00044c b 1f2c83c + 1f2b708: e59d9008 ldr r9, [sp, #8] + 1f2b70c: e3790001 cmn r9, #1 + 1f2b710: 0a00023b beq 1f2c004 + 1f2b714: e59d9028 ldr r9, [sp, #40] ; 0x28 + 1f2b718: e0898008 add r8, r9, r8 + 1f2b71c: e59d902c ldr r9, [sp, #44] ; 0x2c + 1f2b720: e0868008 add r8, r6, r8 + 1f2b724: e0897007 add r7, r9, r7 + 1f2b728: e59d9004 ldr r9, [sp, #4] + 1f2b72c: e0897007 add r7, r9, r7 + 1f2b730: e59d9020 ldr r9, [sp, #32] + 1f2b734: e1510007 cmp r1, r7 + 1f2b738: 31500008 cmpcc r0, r8 + 1f2b73c: e59d7018 ldr r7, [sp, #24] + 1f2b740: 23a08001 movcs r8, #1 + 1f2b744: 33a08000 movcc r8, #0 + 1f2b748: e357000f cmp r7, #15 + 1f2b74c: 93a07000 movls r7, #0 + 1f2b750: 83a07001 movhi r7, #1 + 1f2b754: e3790001 cmn r9, #1 + 1f2b758: b3a07000 movlt r7, #0 + 1f2b75c: e1180007 tst r8, r7 + 1f2b760: 0a00069d beq 1f2d1dc + 1f2b764: e59d8024 ldr r8, [sp, #36] ; 0x24 + 1f2b768: e3580000 cmp r8, #0 + 1f2b76c: 1a0002b9 bne 1f2c258 + 1f2b770: f3814856 vmov.i16 q2, #150 ; 0x0096 + 1f2b774: e59d9040 ldr r9, [sp, #64] ; 0x40 + 1f2b778: f281685d vmov.i16 q3, #29 ; 0x001d + 1f2b77c: e1a07000 mov r7, r0 + 1f2b780: e1a03001 mov r3, r1 + 1f2b784: e1a02008 mov r2, r8 + 1f2b788: f463050f vld3.8 {d16,d18,d20}, [r3] + 1f2b78c: e2838018 add r8, r3, #24 + 1f2b790: f3c7ae5f vmov.i8 q13, #255 ; 0xff + 1f2b794: e2822001 add r2, r2, #1 + 1f2b798: e1590002 cmp r9, r2 + 1f2b79c: e2833030 add r3, r3, #48 ; 0x30 + 1f2b7a0: f468150f vld3.8 {d17,d19,d21}, [r8] + 1f2b7a4: f3c86a32 vmovl.u8 q11, d18 + 1f2b7a8: f3c8ea30 vmovl.u8 q15, d16 + 1f2b7ac: f388ca31 vmovl.u8 q6, d17 + 1f2b7b0: f3880a33 vmovl.u8 q0, d19 + 1f2b7b4: f2968c84 vmull.s16 q4, d22, d4 + 1f2b7b8: f29eacac vmull.s16 q5, d30, d28 + 1f2b7bc: f2972c85 vmull.s16 q1, d23, d5 + 1f2b7c0: f3c80a35 vmovl.u8 q8, d21 + 1f2b7c4: f2d02c04 vmull.s16 q9, d0, d4 + 1f2b7c8: f2dfecad vmull.s16 q15, d31, d29 + 1f2b7cc: f22aa848 vadd.i32 q5, q5, q4 + 1f2b7d0: f2dc6c2c vmull.s16 q11, d12, d28 + 1f2b7d4: f3888a34 vmovl.u8 q4, d20 + 1f2b7d8: f2910c05 vmull.s16 q0, d1, d5 + 1f2b7dc: f2dd4c2d vmull.s16 q10, d13, d29 + 1f2b7e0: f26668e2 vadd.i32 q11, q11, q9 + 1f2b7e4: f22ec8c2 vadd.i32 q6, q15, q1 + 1f2b7e8: f2982c06 vmull.s16 q1, d8, d6 + 1f2b7ec: f26428c0 vadd.i32 q9, q10, q0 + 1f2b7f0: f2d9ec07 vmull.s16 q15, d9, d7 + 1f2b7f4: f2d04c86 vmull.s16 q10, d16, d6 + 1f2b7f8: f2d10c87 vmull.s16 q8, d17, d7 + 1f2b7fc: f22a2842 vadd.i32 q1, q5, q1 + 1f2b800: f26ce86e vadd.i32 q15, q6, q15 + 1f2b804: f26648e4 vadd.i32 q10, q11, q10 + 1f2b808: f26208e0 vadd.i32 q8, q9, q8 + 1f2b80c: f2b82052 vshr.s32 q1, q1, #8 + 1f2b810: f2f8e07e vshr.s32 q15, q15, #8 + 1f2b814: f2f82074 vshr.s32 q9, q10, #8 + 1f2b818: f2f80070 vshr.s32 q8, q8, #8 + 1f2b81c: f3f66202 vmovn.i32 d22, q1 + 1f2b820: f3f6722e vmovn.i32 d23, q15 + 1f2b824: f3f64222 vmovn.i32 d20, q9 + 1f2b828: f3f65220 vmovn.i32 d21, q8 + 1f2b82c: f3f28226 vmovn.i16 d24, q11 + 1f2b830: f3f29224 vmovn.i16 d25, q10 + 1f2b834: f447830f vst2.8 {d24-d27}, [r7] + 1f2b838: e2877020 add r7, r7, #32 + 1f2b83c: 8affffd1 bhi 1f2b788 + 1f2b840: e28d30f8 add r3, sp, #248 ; 0xf8 + 1f2b844: e59d201c ldr r2, [sp, #28] + 1f2b848: f44382df vst1.64 {d24-d27}, [r3 :64] + 1f2b84c: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f2b850: e1530002 cmp r3, r2 + 1f2b854: e59d3048 ldr r3, [sp, #72] ; 0x48 + 1f2b858: e0812003 add r2, r1, r3 + 1f2b85c: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f2b860: e0803003 add r3, r0, r3 + 1f2b864: 0a0001e6 beq 1f2c004 + 1f2b868: e59d7044 ldr r7, [sp, #68] ; 0x44 + 1f2b86c: ea00027a b 1f2c25c + 1f2b870: e59d9008 ldr r9, [sp, #8] + 1f2b874: e3790001 cmn r9, #1 + 1f2b878: 0a0001e1 beq 1f2c004 + 1f2b87c: e59d9028 ldr r9, [sp, #40] ; 0x28 + 1f2b880: e0898008 add r8, r9, r8 + 1f2b884: e59d901c ldr r9, [sp, #28] + 1f2b888: e0868008 add r8, r6, r8 + 1f2b88c: e0897007 add r7, r9, r7 + 1f2b890: e59d9004 ldr r9, [sp, #4] + 1f2b894: e0897007 add r7, r9, r7 + 1f2b898: e59d9020 ldr r9, [sp, #32] + 1f2b89c: e1510007 cmp r1, r7 + 1f2b8a0: 31500008 cmpcc r0, r8 + 1f2b8a4: e59d7018 ldr r7, [sp, #24] + 1f2b8a8: 23a08001 movcs r8, #1 + 1f2b8ac: 33a08000 movcc r8, #0 + 1f2b8b0: e357000f cmp r7, #15 + 1f2b8b4: 93a07000 movls r7, #0 + 1f2b8b8: 83a07001 movhi r7, #1 + 1f2b8bc: e3790001 cmn r9, #1 + 1f2b8c0: b3a07000 movlt r7, #0 + 1f2b8c4: e1180007 tst r8, r7 + 1f2b8c8: 0a0005d7 beq 1f2d02c + 1f2b8cc: e59d8024 ldr r8, [sp, #36] ; 0x24 + 1f2b8d0: e3580000 cmp r8, #0 + 1f2b8d4: 1a000460 bne 1f2ca5c + 1f2b8d8: f3814856 vmov.i16 q2, #150 ; 0x0096 + 1f2b8dc: e59d9040 ldr r9, [sp, #64] ; 0x40 + 1f2b8e0: f281685d vmov.i16 q3, #29 ; 0x001d + 1f2b8e4: e1a07000 mov r7, r0 + 1f2b8e8: e1a03001 mov r3, r1 + 1f2b8ec: e1a02008 mov r2, r8 + 1f2b8f0: f463050f vld3.8 {d16,d18,d20}, [r3] + 1f2b8f4: e2838018 add r8, r3, #24 + 1f2b8f8: e2822001 add r2, r2, #1 + 1f2b8fc: e2833030 add r3, r3, #48 ; 0x30 + 1f2b900: e1590002 cmp r9, r2 + 1f2b904: f468150f vld3.8 {d17,d19,d21}, [r8] + 1f2b908: f3c88a30 vmovl.u8 q12, d16 + 1f2b90c: f3c86a32 vmovl.u8 q11, d18 + 1f2b910: f388aa31 vmovl.u8 q5, d17 + 1f2b914: f3880a33 vmovl.u8 q0, d19 + 1f2b918: f2d8ecac vmull.s16 q15, d24, d28 + 1f2b91c: f2d6ac84 vmull.s16 q13, d22, d4 + 1f2b920: f2d98cad vmull.s16 q12, d25, d29 + 1f2b924: f2d76c85 vmull.s16 q11, d23, d5 + 1f2b928: f3888a34 vmovl.u8 q4, d20 + 1f2b92c: f3c80a35 vmovl.u8 q8, d21 + 1f2b930: f26ee8ea vadd.i32 q15, q15, q13 + 1f2b934: f2db4c2d vmull.s16 q10, d11, d29 + 1f2b938: f268a8e6 vadd.i32 q13, q12, q11 + 1f2b93c: f29a2c2c vmull.s16 q1, d10, d28 + 1f2b940: f2d06c04 vmull.s16 q11, d0, d4 + 1f2b944: f2d12c05 vmull.s16 q9, d1, d5 + 1f2b948: f298ac06 vmull.s16 q5, d8, d6 + 1f2b94c: f2d98c07 vmull.s16 q12, d9, d7 + 1f2b950: f2626866 vadd.i32 q11, q1, q11 + 1f2b954: f26428e2 vadd.i32 q9, q10, q9 + 1f2b958: f2d04c86 vmull.s16 q10, d16, d6 + 1f2b95c: f2d10c87 vmull.s16 q8, d17, d7 + 1f2b960: f26a88e8 vadd.i32 q12, q13, q12 + 1f2b964: f26ee8ca vadd.i32 q15, q15, q5 + 1f2b968: f26648e4 vadd.i32 q10, q11, q10 + 1f2b96c: f26208e0 vadd.i32 q8, q9, q8 + 1f2b970: f2f88078 vshr.s32 q12, q12, #8 + 1f2b974: f2f8a07e vshr.s32 q13, q15, #8 + 1f2b978: f2f82074 vshr.s32 q9, q10, #8 + 1f2b97c: f2f80070 vshr.s32 q8, q8, #8 + 1f2b980: f3f6622a vmovn.i32 d22, q13 + 1f2b984: f3f67228 vmovn.i32 d23, q12 + 1f2b988: f3f64222 vmovn.i32 d20, q9 + 1f2b98c: f3f65220 vmovn.i32 d21, q8 + 1f2b990: f3f20226 vmovn.i16 d16, q11 + 1f2b994: f3f21224 vmovn.i16 d17, q10 + 1f2b998: f4470a0f vst1.8 {d16-d17}, [r7] + 1f2b99c: e2877010 add r7, r7, #16 + 1f2b9a0: 8affffd2 bhi 1f2b8f0 + 1f2b9a4: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f2b9a8: e59d201c ldr r2, [sp, #28] + 1f2b9ac: e1530002 cmp r3, r2 + 1f2b9b0: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f2b9b4: e0803003 add r3, r0, r3 + 1f2b9b8: e0812002 add r2, r1, r2 + 1f2b9bc: 0a000190 beq 1f2c004 + 1f2b9c0: e59d7044 ldr r7, [sp, #68] ; 0x44 + 1f2b9c4: ea000425 b 1f2ca60 + 1f2b9c8: e59d9008 ldr r9, [sp, #8] + 1f2b9cc: e3790001 cmn r9, #1 + 1f2b9d0: 0a00018b beq 1f2c004 + 1f2b9d4: e59d902c ldr r9, [sp, #44] ; 0x2c + 1f2b9d8: e0898008 add r8, r9, r8 + 1f2b9dc: e59d9030 ldr r9, [sp, #48] ; 0x30 + 1f2b9e0: e0868008 add r8, r6, r8 + 1f2b9e4: e0897007 add r7, r9, r7 + 1f2b9e8: e59d9004 ldr r9, [sp, #4] + 1f2b9ec: e0897007 add r7, r9, r7 + 1f2b9f0: e59d9020 ldr r9, [sp, #32] + 1f2b9f4: e1510007 cmp r1, r7 + 1f2b9f8: 31500008 cmpcc r0, r8 + 1f2b9fc: e59d7018 ldr r7, [sp, #24] + 1f2ba00: 23a08001 movcs r8, #1 + 1f2ba04: 33a08000 movcc r8, #0 + 1f2ba08: e357000f cmp r7, #15 + 1f2ba0c: 93a07000 movls r7, #0 + 1f2ba10: 83a07001 movhi r7, #1 + 1f2ba14: e3790001 cmn r9, #1 + 1f2ba18: b3a07000 movlt r7, #0 + 1f2ba1c: e1180007 tst r8, r7 + 1f2ba20: 0a0005de beq 1f2d1a0 + 1f2ba24: e59d8024 ldr r8, [sp, #36] ; 0x24 + 1f2ba28: e3580000 cmp r8, #0 + 1f2ba2c: 1a000191 bne 1f2c078 + 1f2ba30: e1a03000 mov r3, r0 + 1f2ba34: e1a07001 mov r7, r1 + 1f2ba38: e1a02008 mov r2, r8 + 1f2ba3c: f467830f vld2.8 {d24-d27}, [r7] + 1f2ba40: e2822001 add r2, r2, #1 + 1f2ba44: e2877020 add r7, r7, #32 + 1f2ba48: e59d8040 ldr r8, [sp, #64] ; 0x40 + 1f2ba4c: e1580002 cmp r8, r2 + 1f2ba50: e2838020 add r8, r3, #32 + 1f2ba54: f26801f8 vorr q8, q12, q12 + 1f2ba58: f26821f8 vorr q9, q12, q12 + 1f2ba5c: f26841f8 vorr q10, q12, q12 + 1f2ba60: f26a61fa vorr q11, q13, q13 + 1f2ba64: f443010f vst4.8 {d16,d18,d20,d22}, [r3] + 1f2ba68: e2833040 add r3, r3, #64 ; 0x40 + 1f2ba6c: f448110f vst4.8 {d17,d19,d21,d23}, [r8] + 1f2ba70: 8afffff1 bhi 1f2ba3c + 1f2ba74: e28d3f46 add r3, sp, #280 ; 0x118 + 1f2ba78: e59d201c ldr r2, [sp, #28] + 1f2ba7c: ecc30b10 vstmia r3, {d16-d23} + 1f2ba80: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f2ba84: e1530002 cmp r3, r2 + 1f2ba88: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f2ba8c: e0812003 add r2, r1, r3 + 1f2ba90: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f2ba94: e0803003 add r3, r0, r3 + 1f2ba98: 0a000159 beq 1f2c004 + 1f2ba9c: e59d7044 ldr r7, [sp, #68] ; 0x44 + 1f2baa0: ea000175 b 1f2c07c + 1f2baa4: e59d9008 ldr r9, [sp, #8] + 1f2baa8: e3790001 cmn r9, #1 + 1f2baac: 0a000154 beq 1f2c004 + 1f2bab0: e59d902c ldr r9, [sp, #44] ; 0x2c + 1f2bab4: e0898008 add r8, r9, r8 + 1f2bab8: e59d9028 ldr r9, [sp, #40] ; 0x28 + 1f2babc: e0868008 add r8, r6, r8 + 1f2bac0: e0897007 add r7, r9, r7 + 1f2bac4: e59d9004 ldr r9, [sp, #4] + 1f2bac8: e0897007 add r7, r9, r7 + 1f2bacc: e59d9020 ldr r9, [sp, #32] + 1f2bad0: e1510007 cmp r1, r7 + 1f2bad4: 31500008 cmpcc r0, r8 + 1f2bad8: e59d7018 ldr r7, [sp, #24] + 1f2badc: 23a08001 movcs r8, #1 + 1f2bae0: 33a08000 movcc r8, #0 + 1f2bae4: e357000f cmp r7, #15 + 1f2bae8: 93a07000 movls r7, #0 + 1f2baec: 83a07001 movhi r7, #1 + 1f2baf0: e3790001 cmn r9, #1 + 1f2baf4: b3a07000 movlt r7, #0 + 1f2baf8: e1180007 tst r8, r7 + 1f2bafc: 0a00052f beq 1f2cfc0 + 1f2bb00: e59d8038 ldr r8, [sp, #56] ; 0x38 + 1f2bb04: e3580000 cmp r8, #0 + 1f2bb08: 1a0004b5 bne 1f2cde4 + 1f2bb0c: e1a03000 mov r3, r0 + 1f2bb10: e1a07001 mov r7, r1 + 1f2bb14: e1a02008 mov r2, r8 + 1f2bb18: f467830f vld2.8 {d24-d27}, [r7] + 1f2bb1c: e2822001 add r2, r2, #1 + 1f2bb20: e2877020 add r7, r7, #32 + 1f2bb24: e59d8058 ldr r8, [sp, #88] ; 0x58 + 1f2bb28: e1580002 cmp r8, r2 + 1f2bb2c: e2838018 add r8, r3, #24 + 1f2bb30: f26801f8 vorr q8, q12, q12 + 1f2bb34: f26821f8 vorr q9, q12, q12 + 1f2bb38: f26841f8 vorr q10, q12, q12 + 1f2bb3c: f443050f vst3.8 {d16,d18,d20}, [r3] + 1f2bb40: e2833030 add r3, r3, #48 ; 0x30 + 1f2bb44: f448150f vst3.8 {d17,d19,d21}, [r8] + 1f2bb48: 8afffff2 bhi 1f2bb18 + 1f2bb4c: e28d3f56 add r3, sp, #344 ; 0x158 + 1f2bb50: e59d2050 ldr r2, [sp, #80] ; 0x50 + 1f2bb54: ecc30b0c vstmia r3, {d16-d21} + 1f2bb58: e59d301c ldr r3, [sp, #28] + 1f2bb5c: e1530002 cmp r3, r2 + 1f2bb60: e59d3054 ldr r3, [sp, #84] ; 0x54 + 1f2bb64: e0812003 add r2, r1, r3 + 1f2bb68: e59d3060 ldr r3, [sp, #96] ; 0x60 + 1f2bb6c: e0803003 add r3, r0, r3 + 1f2bb70: 0a000123 beq 1f2c004 + 1f2bb74: e59d705c ldr r7, [sp, #92] ; 0x5c + 1f2bb78: ea00049a b 1f2cde8 + 1f2bb7c: e59d9008 ldr r9, [sp, #8] + 1f2bb80: e3790001 cmn r9, #1 + 1f2bb84: 0a00011e beq 1f2c004 + 1f2bb88: e59d901c ldr r9, [sp, #28] + 1f2bb8c: e0898008 add r8, r9, r8 + 1f2bb90: e59d9028 ldr r9, [sp, #40] ; 0x28 + 1f2bb94: e0868008 add r8, r6, r8 + 1f2bb98: e0897007 add r7, r9, r7 + 1f2bb9c: e59d9004 ldr r9, [sp, #4] + 1f2bba0: e0897007 add r7, r9, r7 + 1f2bba4: e59d9020 ldr r9, [sp, #32] + 1f2bba8: e1510007 cmp r1, r7 + 1f2bbac: 31500008 cmpcc r0, r8 + 1f2bbb0: e59d7018 ldr r7, [sp, #24] + 1f2bbb4: 23a08001 movcs r8, #1 + 1f2bbb8: 33a08000 movcc r8, #0 + 1f2bbbc: e357000f cmp r7, #15 + 1f2bbc0: 93a07000 movls r7, #0 + 1f2bbc4: 83a07001 movhi r7, #1 + 1f2bbc8: e3790001 cmn r9, #1 + 1f2bbcc: b3a07000 movlt r7, #0 + 1f2bbd0: e1180007 tst r8, r7 + 1f2bbd4: 0a00059c beq 1f2d24c + 1f2bbd8: e59d8024 ldr r8, [sp, #36] ; 0x24 + 1f2bbdc: e3580000 cmp r8, #0 + 1f2bbe0: 1a0000af bne 1f2bea4 + 1f2bbe4: e1a03000 mov r3, r0 + 1f2bbe8: e1a07001 mov r7, r1 + 1f2bbec: e1a02008 mov r2, r8 + 1f2bbf0: f4676a0f vld1.8 {d22-d23}, [r7] + 1f2bbf4: e2822001 add r2, r2, #1 + 1f2bbf8: e59d8040 ldr r8, [sp, #64] ; 0x40 + 1f2bbfc: e2877010 add r7, r7, #16 + 1f2bc00: e1580002 cmp r8, r2 + 1f2bc04: e2838018 add r8, r3, #24 + 1f2bc08: f26601f6 vorr q8, q11, q11 + 1f2bc0c: f26621f6 vorr q9, q11, q11 + 1f2bc10: f26641f6 vorr q10, q11, q11 + 1f2bc14: f443050f vst3.8 {d16,d18,d20}, [r3] + 1f2bc18: e2833030 add r3, r3, #48 ; 0x30 + 1f2bc1c: f448150f vst3.8 {d17,d19,d21}, [r8] + 1f2bc20: 8afffff2 bhi 1f2bbf0 + 1f2bc24: e28d3f72 add r3, sp, #456 ; 0x1c8 + 1f2bc28: e59d201c ldr r2, [sp, #28] + 1f2bc2c: ecc30b0c vstmia r3, {d16-d21} + 1f2bc30: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f2bc34: e1530002 cmp r3, r2 + 1f2bc38: e0812003 add r2, r1, r3 + 1f2bc3c: e59d3048 ldr r3, [sp, #72] ; 0x48 + 1f2bc40: e0803003 add r3, r0, r3 + 1f2bc44: 0a0000ee beq 1f2c004 + 1f2bc48: e59d7044 ldr r7, [sp, #68] ; 0x44 + 1f2bc4c: ea000095 b 1f2bea8 + 1f2bc50: e59d9008 ldr r9, [sp, #8] + 1f2bc54: e3790001 cmn r9, #1 + 1f2bc58: 0a0000e9 beq 1f2c004 + 1f2bc5c: e59d902c ldr r9, [sp, #44] ; 0x2c + 1f2bc60: e0897007 add r7, r9, r7 + 1f2bc64: e59d901c ldr r9, [sp, #28] + 1f2bc68: e0898008 add r8, r9, r8 + 1f2bc6c: e59d9004 ldr r9, [sp, #4] + 1f2bc70: e0868008 add r8, r6, r8 + 1f2bc74: e0897007 add r7, r9, r7 + 1f2bc78: e59d9020 ldr r9, [sp, #32] + 1f2bc7c: e1500008 cmp r0, r8 + 1f2bc80: 31510007 cmpcc r1, r7 + 1f2bc84: e59d8018 ldr r8, [sp, #24] + 1f2bc88: 23a07001 movcs r7, #1 + 1f2bc8c: 33a07000 movcc r7, #0 + 1f2bc90: e358000f cmp r8, #15 + 1f2bc94: 93a08000 movls r8, #0 + 1f2bc98: 83a08001 movhi r8, #1 + 1f2bc9c: e3790001 cmn r9, #1 + 1f2bca0: b3a08000 movlt r8, #0 + 1f2bca4: e1170008 tst r7, r8 + 1f2bca8: 0a0004ee beq 1f2d068 + 1f2bcac: e59d8024 ldr r8, [sp, #36] ; 0x24 + 1f2bcb0: e3580000 cmp r8, #0 + 1f2bcb4: 1a0003fe bne 1f2ccb4 + 1f2bcb8: e1a03008 mov r3, r8 + 1f2bcbc: e59d8040 ldr r8, [sp, #64] ; 0x40 + 1f2bcc0: e1a07000 mov r7, r0 + 1f2bcc4: e1a02001 mov r2, r1 + 1f2bcc8: f4620a0f vld1.8 {d16-d17}, [r2] + 1f2bccc: f3c72e5f vmov.i8 q9, #255 ; 0xff + 1f2bcd0: e2833001 add r3, r3, #1 + 1f2bcd4: e2822010 add r2, r2, #16 + 1f2bcd8: e1580003 cmp r8, r3 + 1f2bcdc: f447030f vst2.8 {d16-d19}, [r7] + 1f2bce0: e2877020 add r7, r7, #32 + 1f2bce4: 8afffff7 bhi 1f2bcc8 + 1f2bce8: e28d3f7e add r3, sp, #504 ; 0x1f8 + 1f2bcec: e59d201c ldr r2, [sp, #28] + 1f2bcf0: f44302df vst1.64 {d16-d19}, [r3 :64] + 1f2bcf4: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f2bcf8: e1530002 cmp r3, r2 + 1f2bcfc: e0812003 add r2, r1, r3 + 1f2bd00: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f2bd04: e0803003 add r3, r0, r3 + 1f2bd08: 0a0000bd beq 1f2c004 + 1f2bd0c: e59d7044 ldr r7, [sp, #68] ; 0x44 + 1f2bd10: ea0003e8 b 1f2ccb8 + 1f2bd14: e59d9008 ldr r9, [sp, #8] + 1f2bd18: e3790001 cmn r9, #1 + 1f2bd1c: 0a0000b8 beq 1f2c004 + 1f2bd20: e59d902c ldr r9, [sp, #44] ; 0x2c + 1f2bd24: e0898008 add r8, r9, r8 + 1f2bd28: e59d901c ldr r9, [sp, #28] + 1f2bd2c: e0868008 add r8, r6, r8 + 1f2bd30: e0897007 add r7, r9, r7 + 1f2bd34: e59d9004 ldr r9, [sp, #4] + 1f2bd38: e0897007 add r7, r9, r7 + 1f2bd3c: e59d9020 ldr r9, [sp, #32] + 1f2bd40: e1510007 cmp r1, r7 + 1f2bd44: 31500008 cmpcc r0, r8 + 1f2bd48: e59d7018 ldr r7, [sp, #24] + 1f2bd4c: 23a08001 movcs r8, #1 + 1f2bd50: 33a08000 movcc r8, #0 + 1f2bd54: e357000f cmp r7, #15 + 1f2bd58: 93a07000 movls r7, #0 + 1f2bd5c: 83a07001 movhi r7, #1 + 1f2bd60: e3790001 cmn r9, #1 + 1f2bd64: b3a07000 movlt r7, #0 + 1f2bd68: e1180007 tst r8, r7 + 1f2bd6c: 0a00052d beq 1f2d228 + 1f2bd70: e59d8038 ldr r8, [sp, #56] ; 0x38 + 1f2bd74: e3580000 cmp r8, #0 + 1f2bd78: 1a0000b5 bne 1f2c054 + 1f2bd7c: e1a03008 mov r3, r8 + 1f2bd80: e59d8058 ldr r8, [sp, #88] ; 0x58 + 1f2bd84: e1a07000 mov r7, r0 + 1f2bd88: e1a02001 mov r2, r1 + 1f2bd8c: f462030f vld2.8 {d16-d19}, [r2] + 1f2bd90: e2833001 add r3, r3, #1 + 1f2bd94: e1580003 cmp r8, r3 + 1f2bd98: e2822020 add r2, r2, #32 + 1f2bd9c: f4470a0f vst1.8 {d16-d17}, [r7] + 1f2bda0: e2877010 add r7, r7, #16 + 1f2bda4: 8afffff8 bhi 1f2bd8c + 1f2bda8: e59d201c ldr r2, [sp, #28] + 1f2bdac: e59d3050 ldr r3, [sp, #80] ; 0x50 + 1f2bdb0: e1520003 cmp r2, r3 + 1f2bdb4: e59d2054 ldr r2, [sp, #84] ; 0x54 + 1f2bdb8: e0803003 add r3, r0, r3 + 1f2bdbc: e0812002 add r2, r1, r2 + 1f2bdc0: 0a00008f beq 1f2c004 + 1f2bdc4: e59d705c ldr r7, [sp, #92] ; 0x5c + 1f2bdc8: ea0000a2 b 1f2c058 + 1f2bdcc: e59d9008 ldr r9, [sp, #8] + 1f2bdd0: e3790001 cmn r9, #1 + 1f2bdd4: 0a00008a beq 1f2c004 + 1f2bdd8: e59d901c ldr r9, [sp, #28] + 1f2bddc: e0898008 add r8, r9, r8 + 1f2bde0: e59d9030 ldr r9, [sp, #48] ; 0x30 + 1f2bde4: e0868008 add r8, r6, r8 + 1f2bde8: e0897007 add r7, r9, r7 + 1f2bdec: e59d9004 ldr r9, [sp, #4] + 1f2bdf0: e0897007 add r7, r9, r7 + 1f2bdf4: e59d9020 ldr r9, [sp, #32] + 1f2bdf8: e1510007 cmp r1, r7 + 1f2bdfc: 31500008 cmpcc r0, r8 + 1f2be00: e59d7018 ldr r7, [sp, #24] + 1f2be04: 23a08001 movcs r8, #1 + 1f2be08: 33a08000 movcc r8, #0 + 1f2be0c: e357000f cmp r7, #15 + 1f2be10: 93a07000 movls r7, #0 + 1f2be14: 83a07001 movhi r7, #1 + 1f2be18: e3790001 cmn r9, #1 + 1f2be1c: b3a07000 movlt r7, #0 + 1f2be20: e1180007 tst r8, r7 + 1f2be24: 0a000472 beq 1f2cff4 + 1f2be28: e59d8024 ldr r8, [sp, #36] ; 0x24 + 1f2be2c: e3580000 cmp r8, #0 + 1f2be30: 1a0003f8 bne 1f2ce18 + 1f2be34: e1a03000 mov r3, r0 + 1f2be38: e1a07001 mov r7, r1 + 1f2be3c: e1a02008 mov r2, r8 + 1f2be40: f4678a0f vld1.8 {d24-d25}, [r7] + 1f2be44: f3c76e5f vmov.i8 q11, #255 ; 0xff + 1f2be48: e59d8040 ldr r8, [sp, #64] ; 0x40 + 1f2be4c: e2822001 add r2, r2, #1 + 1f2be50: e2877010 add r7, r7, #16 + 1f2be54: e1580002 cmp r8, r2 + 1f2be58: e2838020 add r8, r3, #32 + 1f2be5c: f26801f8 vorr q8, q12, q12 + 1f2be60: f26821f8 vorr q9, q12, q12 + 1f2be64: f26841f8 vorr q10, q12, q12 + 1f2be68: f443010f vst4.8 {d16,d18,d20,d22}, [r3] + 1f2be6c: e2833040 add r3, r3, #64 ; 0x40 + 1f2be70: f448110f vst4.8 {d17,d19,d21,d23}, [r8] + 1f2be74: 8afffff1 bhi 1f2be40 + 1f2be78: e28d3f62 add r3, sp, #392 ; 0x188 + 1f2be7c: e59d201c ldr r2, [sp, #28] + 1f2be80: ecc30b10 vstmia r3, {d16-d23} + 1f2be84: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f2be88: e1530002 cmp r3, r2 + 1f2be8c: e0812003 add r2, r1, r3 + 1f2be90: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f2be94: e0803003 add r3, r0, r3 + 1f2be98: 0a000059 beq 1f2c004 + 1f2be9c: e59d7044 ldr r7, [sp, #68] ; 0x44 + 1f2bea0: ea0003dd b 1f2ce1c + 1f2bea4: e59d7008 ldr r7, [sp, #8] + 1f2bea8: e3570000 cmp r7, #0 + 1f2beac: e5d28000 ldrb r8, [r2] + 1f2beb0: e5c38002 strb r8, [r3, #2] + 1f2beb4: e5c38001 strb r8, [r3, #1] + 1f2beb8: e5c38000 strb r8, [r3] + 1f2bebc: 0a000050 beq 1f2c004 + 1f2bec0: e3570001 cmp r7, #1 + 1f2bec4: e5d28001 ldrb r8, [r2, #1] + 1f2bec8: e5c38005 strb r8, [r3, #5] + 1f2becc: e5c38004 strb r8, [r3, #4] + 1f2bed0: e5c38003 strb r8, [r3, #3] + 1f2bed4: 0a00004a beq 1f2c004 + 1f2bed8: e3570002 cmp r7, #2 + 1f2bedc: e5d28002 ldrb r8, [r2, #2] + 1f2bee0: e5c38008 strb r8, [r3, #8] + 1f2bee4: e5c38007 strb r8, [r3, #7] + 1f2bee8: e5c38006 strb r8, [r3, #6] + 1f2beec: 0a000044 beq 1f2c004 + 1f2bef0: e3570003 cmp r7, #3 + 1f2bef4: e5d28003 ldrb r8, [r2, #3] + 1f2bef8: e5c3800b strb r8, [r3, #11] + 1f2befc: e5c3800a strb r8, [r3, #10] + 1f2bf00: e5c38009 strb r8, [r3, #9] + 1f2bf04: 0a00003e beq 1f2c004 + 1f2bf08: e3570004 cmp r7, #4 + 1f2bf0c: e5d28004 ldrb r8, [r2, #4] + 1f2bf10: e5c3800e strb r8, [r3, #14] + 1f2bf14: e5c3800d strb r8, [r3, #13] + 1f2bf18: e5c3800c strb r8, [r3, #12] + 1f2bf1c: 0a000038 beq 1f2c004 + 1f2bf20: e3570005 cmp r7, #5 + 1f2bf24: e5d28005 ldrb r8, [r2, #5] + 1f2bf28: e5c38011 strb r8, [r3, #17] + 1f2bf2c: e5c38010 strb r8, [r3, #16] + 1f2bf30: e5c3800f strb r8, [r3, #15] + 1f2bf34: 0a000032 beq 1f2c004 + 1f2bf38: e3570006 cmp r7, #6 + 1f2bf3c: e5d28006 ldrb r8, [r2, #6] + 1f2bf40: e5c38014 strb r8, [r3, #20] + 1f2bf44: e5c38013 strb r8, [r3, #19] + 1f2bf48: e5c38012 strb r8, [r3, #18] + 1f2bf4c: 0a00002c beq 1f2c004 + 1f2bf50: e3570007 cmp r7, #7 + 1f2bf54: e5d28007 ldrb r8, [r2, #7] + 1f2bf58: e5c38017 strb r8, [r3, #23] + 1f2bf5c: e5c38016 strb r8, [r3, #22] + 1f2bf60: e5c38015 strb r8, [r3, #21] + 1f2bf64: 0a000026 beq 1f2c004 + 1f2bf68: e3570008 cmp r7, #8 + 1f2bf6c: e5d28008 ldrb r8, [r2, #8] + 1f2bf70: e5c3801a strb r8, [r3, #26] + 1f2bf74: e5c38019 strb r8, [r3, #25] + 1f2bf78: e5c38018 strb r8, [r3, #24] + 1f2bf7c: 0a000020 beq 1f2c004 + 1f2bf80: e3570009 cmp r7, #9 + 1f2bf84: e5d28009 ldrb r8, [r2, #9] + 1f2bf88: e5c3801d strb r8, [r3, #29] + 1f2bf8c: e5c3801c strb r8, [r3, #28] + 1f2bf90: e5c3801b strb r8, [r3, #27] + 1f2bf94: 0a00001a beq 1f2c004 + 1f2bf98: e357000a cmp r7, #10 + 1f2bf9c: e5d2800a ldrb r8, [r2, #10] + 1f2bfa0: e5c38020 strb r8, [r3, #32] + 1f2bfa4: e5c3801f strb r8, [r3, #31] + 1f2bfa8: e5c3801e strb r8, [r3, #30] + 1f2bfac: 0a000014 beq 1f2c004 + 1f2bfb0: e357000b cmp r7, #11 + 1f2bfb4: e5d2800b ldrb r8, [r2, #11] + 1f2bfb8: e5c38023 strb r8, [r3, #35] ; 0x23 + 1f2bfbc: e5c38022 strb r8, [r3, #34] ; 0x22 + 1f2bfc0: e5c38021 strb r8, [r3, #33] ; 0x21 + 1f2bfc4: 0a00000e beq 1f2c004 + 1f2bfc8: e357000c cmp r7, #12 + 1f2bfcc: e5d2800c ldrb r8, [r2, #12] + 1f2bfd0: e5c38026 strb r8, [r3, #38] ; 0x26 + 1f2bfd4: e5c38025 strb r8, [r3, #37] ; 0x25 + 1f2bfd8: e5c38024 strb r8, [r3, #36] ; 0x24 + 1f2bfdc: 0a000008 beq 1f2c004 + 1f2bfe0: e357000d cmp r7, #13 + 1f2bfe4: e5d2700d ldrb r7, [r2, #13] + 1f2bfe8: e5c37029 strb r7, [r3, #41] ; 0x29 + 1f2bfec: e5c37028 strb r7, [r3, #40] ; 0x28 + 1f2bff0: e5c37027 strb r7, [r3, #39] ; 0x27 + 1f2bff4: 15d2200e ldrbne r2, [r2, #14] + 1f2bff8: 15c3202c strbne r2, [r3, #44] ; 0x2c + 1f2bffc: 15c3202b strbne r2, [r3, #43] ; 0x2b + 1f2c000: 15c3202a strbne r2, [r3, #42] ; 0x2a + 1f2c004: e59d300c ldr r3, [sp, #12] + 1f2c008: e28cc001 add ip, ip, #1 + 1f2c00c: e0811003 add r1, r1, r3 + 1f2c010: e59d3280 ldr r3, [sp, #640] ; 0x280 + 1f2c014: e153000c cmp r3, ip + 1f2c018: e59d3010 ldr r3, [sp, #16] + 1f2c01c: e0800003 add r0, r0, r3 + 1f2c020: 1afffc71 bne 1f2b1ec + 1f2c024: e59db004 ldr fp, [sp, #4] + 1f2c028: e1a00006 mov r0, r6 + 1f2c02c: eb004955 bl 1f3e588 + 1f2c030: e1a0000b mov r0, fp + 1f2c034: e28ddf87 add sp, sp, #540 ; 0x21c + 1f2c038: ecbd8b10 vpop {d8-d15} + 1f2c03c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f2c040: e59d0280 ldr r0, [sp, #640] ; 0x280 + 1f2c044: eb004947 bl 1f3e568 + 1f2c048: e250b000 subs fp, r0, #0 + 1f2c04c: 0afffbff beq 1f2b050 + 1f2c050: eafffff4 b 1f2c028 + 1f2c054: e59d7008 ldr r7, [sp, #8] + 1f2c058: e2822002 add r2, r2, #2 + 1f2c05c: e2477001 sub r7, r7, #1 + 1f2c060: e5528002 ldrb r8, [r2, #-2] + 1f2c064: e3770001 cmn r7, #1 + 1f2c068: e4c38001 strb r8, [r3], #1 + 1f2c06c: e2822002 add r2, r2, #2 + 1f2c070: 1afffff9 bne 1f2c05c + 1f2c074: eaffffe2 b 1f2c004 + 1f2c078: e59d7008 ldr r7, [sp, #8] + 1f2c07c: e5d28000 ldrb r8, [r2] + 1f2c080: e3570000 cmp r7, #0 + 1f2c084: e5c38002 strb r8, [r3, #2] + 1f2c088: e5c38001 strb r8, [r3, #1] + 1f2c08c: e5c38000 strb r8, [r3] + 1f2c090: e5d28001 ldrb r8, [r2, #1] + 1f2c094: e5c38003 strb r8, [r3, #3] + 1f2c098: 0affffd9 beq 1f2c004 + 1f2c09c: e5d28002 ldrb r8, [r2, #2] + 1f2c0a0: e3570001 cmp r7, #1 + 1f2c0a4: e5c38006 strb r8, [r3, #6] + 1f2c0a8: e5c38005 strb r8, [r3, #5] + 1f2c0ac: e5c38004 strb r8, [r3, #4] + 1f2c0b0: e5d28003 ldrb r8, [r2, #3] + 1f2c0b4: e5c38007 strb r8, [r3, #7] + 1f2c0b8: 0affffd1 beq 1f2c004 + 1f2c0bc: e5d28004 ldrb r8, [r2, #4] + 1f2c0c0: e3570002 cmp r7, #2 + 1f2c0c4: e5c3800a strb r8, [r3, #10] + 1f2c0c8: e5c38009 strb r8, [r3, #9] + 1f2c0cc: e5c38008 strb r8, [r3, #8] + 1f2c0d0: e5d28005 ldrb r8, [r2, #5] + 1f2c0d4: e5c3800b strb r8, [r3, #11] + 1f2c0d8: 0affffc9 beq 1f2c004 + 1f2c0dc: e5d28006 ldrb r8, [r2, #6] + 1f2c0e0: e3570003 cmp r7, #3 + 1f2c0e4: e5c3800e strb r8, [r3, #14] + 1f2c0e8: e5c3800d strb r8, [r3, #13] + 1f2c0ec: e5c3800c strb r8, [r3, #12] + 1f2c0f0: e5d28007 ldrb r8, [r2, #7] + 1f2c0f4: e5c3800f strb r8, [r3, #15] + 1f2c0f8: 0affffc1 beq 1f2c004 + 1f2c0fc: e5d28008 ldrb r8, [r2, #8] + 1f2c100: e3570004 cmp r7, #4 + 1f2c104: e5c38012 strb r8, [r3, #18] + 1f2c108: e5c38011 strb r8, [r3, #17] + 1f2c10c: e5c38010 strb r8, [r3, #16] + 1f2c110: e5d28009 ldrb r8, [r2, #9] + 1f2c114: e5c38013 strb r8, [r3, #19] + 1f2c118: 0affffb9 beq 1f2c004 + 1f2c11c: e5d2800a ldrb r8, [r2, #10] + 1f2c120: e3570005 cmp r7, #5 + 1f2c124: e5c38016 strb r8, [r3, #22] + 1f2c128: e5c38015 strb r8, [r3, #21] + 1f2c12c: e5c38014 strb r8, [r3, #20] + 1f2c130: e5d2800b ldrb r8, [r2, #11] + 1f2c134: e5c38017 strb r8, [r3, #23] + 1f2c138: 0affffb1 beq 1f2c004 + 1f2c13c: e5d2800c ldrb r8, [r2, #12] + 1f2c140: e3570006 cmp r7, #6 + 1f2c144: e5c3801a strb r8, [r3, #26] + 1f2c148: e5c38019 strb r8, [r3, #25] + 1f2c14c: e5c38018 strb r8, [r3, #24] + 1f2c150: e5d2800d ldrb r8, [r2, #13] + 1f2c154: e5c3801b strb r8, [r3, #27] + 1f2c158: 0affffa9 beq 1f2c004 + 1f2c15c: e5d2800e ldrb r8, [r2, #14] + 1f2c160: e3570007 cmp r7, #7 + 1f2c164: e5c3801e strb r8, [r3, #30] + 1f2c168: e5c3801d strb r8, [r3, #29] + 1f2c16c: e5c3801c strb r8, [r3, #28] + 1f2c170: e5d2800f ldrb r8, [r2, #15] + 1f2c174: e5c3801f strb r8, [r3, #31] + 1f2c178: 0affffa1 beq 1f2c004 + 1f2c17c: e5d28010 ldrb r8, [r2, #16] + 1f2c180: e3570008 cmp r7, #8 + 1f2c184: e5c38022 strb r8, [r3, #34] ; 0x22 + 1f2c188: e5c38021 strb r8, [r3, #33] ; 0x21 + 1f2c18c: e5c38020 strb r8, [r3, #32] + 1f2c190: e5d28011 ldrb r8, [r2, #17] + 1f2c194: e5c38023 strb r8, [r3, #35] ; 0x23 + 1f2c198: 0affff99 beq 1f2c004 + 1f2c19c: e5d28012 ldrb r8, [r2, #18] + 1f2c1a0: e3570009 cmp r7, #9 + 1f2c1a4: e5c38026 strb r8, [r3, #38] ; 0x26 + 1f2c1a8: e5c38025 strb r8, [r3, #37] ; 0x25 + 1f2c1ac: e5c38024 strb r8, [r3, #36] ; 0x24 + 1f2c1b0: e5d28013 ldrb r8, [r2, #19] + 1f2c1b4: e5c38027 strb r8, [r3, #39] ; 0x27 + 1f2c1b8: 0affff91 beq 1f2c004 + 1f2c1bc: e5d28014 ldrb r8, [r2, #20] + 1f2c1c0: e357000a cmp r7, #10 + 1f2c1c4: e5c3802a strb r8, [r3, #42] ; 0x2a + 1f2c1c8: e5c38029 strb r8, [r3, #41] ; 0x29 + 1f2c1cc: e5c38028 strb r8, [r3, #40] ; 0x28 + 1f2c1d0: e5d28015 ldrb r8, [r2, #21] + 1f2c1d4: e5c3802b strb r8, [r3, #43] ; 0x2b + 1f2c1d8: 0affff89 beq 1f2c004 + 1f2c1dc: e5d28016 ldrb r8, [r2, #22] + 1f2c1e0: e357000b cmp r7, #11 + 1f2c1e4: e5c3802e strb r8, [r3, #46] ; 0x2e + 1f2c1e8: e5c3802d strb r8, [r3, #45] ; 0x2d + 1f2c1ec: e5c3802c strb r8, [r3, #44] ; 0x2c + 1f2c1f0: e5d28017 ldrb r8, [r2, #23] + 1f2c1f4: e5c3802f strb r8, [r3, #47] ; 0x2f + 1f2c1f8: 0affff81 beq 1f2c004 + 1f2c1fc: e5d28018 ldrb r8, [r2, #24] + 1f2c200: e357000c cmp r7, #12 + 1f2c204: e5c38032 strb r8, [r3, #50] ; 0x32 + 1f2c208: e5c38031 strb r8, [r3, #49] ; 0x31 + 1f2c20c: e5c38030 strb r8, [r3, #48] ; 0x30 + 1f2c210: e5d28019 ldrb r8, [r2, #25] + 1f2c214: e5c38033 strb r8, [r3, #51] ; 0x33 + 1f2c218: 0affff79 beq 1f2c004 + 1f2c21c: e5d2801a ldrb r8, [r2, #26] + 1f2c220: e357000d cmp r7, #13 + 1f2c224: e5c38036 strb r8, [r3, #54] ; 0x36 + 1f2c228: e5c38035 strb r8, [r3, #53] ; 0x35 + 1f2c22c: e5c38034 strb r8, [r3, #52] ; 0x34 + 1f2c230: e5d2701b ldrb r7, [r2, #27] + 1f2c234: e5c37037 strb r7, [r3, #55] ; 0x37 + 1f2c238: 0affff71 beq 1f2c004 + 1f2c23c: e5d2701c ldrb r7, [r2, #28] + 1f2c240: e5c3703a strb r7, [r3, #58] ; 0x3a + 1f2c244: e5c37039 strb r7, [r3, #57] ; 0x39 + 1f2c248: e5c37038 strb r7, [r3, #56] ; 0x38 + 1f2c24c: e5d2201d ldrb r2, [r2, #29] + 1f2c250: e5c3203b strb r2, [r3, #59] ; 0x3b + 1f2c254: eaffff6a b 1f2c004 + 1f2c258: e59d7008 ldr r7, [sp, #8] + 1f2c25c: e5d2a001 ldrb sl, [r2, #1] + 1f2c260: e3570000 cmp r7, #0 + 1f2c264: e5d2b000 ldrb fp, [r2] + 1f2c268: e3e08000 mvn r8, #0 + 1f2c26c: e1690e8a smulbb r9, sl, lr + 1f2c270: e10a9b85 smlabb sl, r5, fp, r9 + 1f2c274: e5d29002 ldrb r9, [r2, #2] + 1f2c278: e5c38001 strb r8, [r3, #1] + 1f2c27c: e109a984 smlabb r9, r4, r9, sl + 1f2c280: e1a09449 asr r9, r9, #8 + 1f2c284: e5c39000 strb r9, [r3] + 1f2c288: 0affff5d beq 1f2c004 + 1f2c28c: e5d2b004 ldrb fp, [r2, #4] + 1f2c290: e3570001 cmp r7, #1 + 1f2c294: e5d2a003 ldrb sl, [r2, #3] + 1f2c298: e5d29005 ldrb r9, [r2, #5] + 1f2c29c: e16b0e8b smulbb fp, fp, lr + 1f2c2a0: e10aba85 smlabb sl, r5, sl, fp + 1f2c2a4: e5c38003 strb r8, [r3, #3] + 1f2c2a8: e109a984 smlabb r9, r4, r9, sl + 1f2c2ac: e1a09449 asr r9, r9, #8 + 1f2c2b0: e5c39002 strb r9, [r3, #2] + 1f2c2b4: 0affff52 beq 1f2c004 + 1f2c2b8: e5d2b007 ldrb fp, [r2, #7] + 1f2c2bc: e3570002 cmp r7, #2 + 1f2c2c0: e5d2a006 ldrb sl, [r2, #6] + 1f2c2c4: e5d29008 ldrb r9, [r2, #8] + 1f2c2c8: e16b0e8b smulbb fp, fp, lr + 1f2c2cc: e10aba85 smlabb sl, r5, sl, fp + 1f2c2d0: e5c38005 strb r8, [r3, #5] + 1f2c2d4: e109a984 smlabb r9, r4, r9, sl + 1f2c2d8: e1a09449 asr r9, r9, #8 + 1f2c2dc: e5c39004 strb r9, [r3, #4] + 1f2c2e0: 0affff47 beq 1f2c004 + 1f2c2e4: e5d2b00a ldrb fp, [r2, #10] + 1f2c2e8: e3570003 cmp r7, #3 + 1f2c2ec: e5d2a009 ldrb sl, [r2, #9] + 1f2c2f0: e5d2900b ldrb r9, [r2, #11] + 1f2c2f4: e16b0e8b smulbb fp, fp, lr + 1f2c2f8: e10aba85 smlabb sl, r5, sl, fp + 1f2c2fc: e5c38007 strb r8, [r3, #7] + 1f2c300: e109a984 smlabb r9, r4, r9, sl + 1f2c304: e1a09449 asr r9, r9, #8 + 1f2c308: e5c39006 strb r9, [r3, #6] + 1f2c30c: 0affff3c beq 1f2c004 + 1f2c310: e5d2b00d ldrb fp, [r2, #13] + 1f2c314: e3570004 cmp r7, #4 + 1f2c318: e5d2a00c ldrb sl, [r2, #12] + 1f2c31c: e5d2900e ldrb r9, [r2, #14] + 1f2c320: e16b0e8b smulbb fp, fp, lr + 1f2c324: e10aba85 smlabb sl, r5, sl, fp + 1f2c328: e5c38009 strb r8, [r3, #9] + 1f2c32c: e109a984 smlabb r9, r4, r9, sl + 1f2c330: e1a09449 asr r9, r9, #8 + 1f2c334: e5c39008 strb r9, [r3, #8] + 1f2c338: 0affff31 beq 1f2c004 + 1f2c33c: e5d2b010 ldrb fp, [r2, #16] + 1f2c340: e3570005 cmp r7, #5 + 1f2c344: e5d2a00f ldrb sl, [r2, #15] + 1f2c348: e5d29011 ldrb r9, [r2, #17] + 1f2c34c: e16b0e8b smulbb fp, fp, lr + 1f2c350: e10aba85 smlabb sl, r5, sl, fp + 1f2c354: e5c3800b strb r8, [r3, #11] + 1f2c358: e109a984 smlabb r9, r4, r9, sl + 1f2c35c: e1a09449 asr r9, r9, #8 + 1f2c360: e5c3900a strb r9, [r3, #10] + 1f2c364: 0affff26 beq 1f2c004 + 1f2c368: e5d2b013 ldrb fp, [r2, #19] + 1f2c36c: e3570006 cmp r7, #6 + 1f2c370: e5d2a012 ldrb sl, [r2, #18] + 1f2c374: e5d29014 ldrb r9, [r2, #20] + 1f2c378: e16b0e8b smulbb fp, fp, lr + 1f2c37c: e10aba85 smlabb sl, r5, sl, fp + 1f2c380: e5c3800d strb r8, [r3, #13] + 1f2c384: e109a984 smlabb r9, r4, r9, sl + 1f2c388: e1a09449 asr r9, r9, #8 + 1f2c38c: e5c3900c strb r9, [r3, #12] + 1f2c390: 0affff1b beq 1f2c004 + 1f2c394: e5d2b016 ldrb fp, [r2, #22] + 1f2c398: e3570007 cmp r7, #7 + 1f2c39c: e5d2a015 ldrb sl, [r2, #21] + 1f2c3a0: e5d29017 ldrb r9, [r2, #23] + 1f2c3a4: e16b0e8b smulbb fp, fp, lr + 1f2c3a8: e10aba85 smlabb sl, r5, sl, fp + 1f2c3ac: e5c3800f strb r8, [r3, #15] + 1f2c3b0: e109a984 smlabb r9, r4, r9, sl + 1f2c3b4: e1a09449 asr r9, r9, #8 + 1f2c3b8: e5c3900e strb r9, [r3, #14] + 1f2c3bc: 0affff10 beq 1f2c004 + 1f2c3c0: e5d2b019 ldrb fp, [r2, #25] + 1f2c3c4: e3570008 cmp r7, #8 + 1f2c3c8: e5d2a018 ldrb sl, [r2, #24] + 1f2c3cc: e5d2901a ldrb r9, [r2, #26] + 1f2c3d0: e16b0e8b smulbb fp, fp, lr + 1f2c3d4: e10aba85 smlabb sl, r5, sl, fp + 1f2c3d8: e5c38011 strb r8, [r3, #17] + 1f2c3dc: e109a984 smlabb r9, r4, r9, sl + 1f2c3e0: e1a09449 asr r9, r9, #8 + 1f2c3e4: e5c39010 strb r9, [r3, #16] + 1f2c3e8: 0affff05 beq 1f2c004 + 1f2c3ec: e5d2b01c ldrb fp, [r2, #28] + 1f2c3f0: e3570009 cmp r7, #9 + 1f2c3f4: e5d2a01b ldrb sl, [r2, #27] + 1f2c3f8: e5d2901d ldrb r9, [r2, #29] + 1f2c3fc: e16b0e8b smulbb fp, fp, lr + 1f2c400: e10aba85 smlabb sl, r5, sl, fp + 1f2c404: e5c38013 strb r8, [r3, #19] + 1f2c408: e109a984 smlabb r9, r4, r9, sl + 1f2c40c: e1a09449 asr r9, r9, #8 + 1f2c410: e5c39012 strb r9, [r3, #18] + 1f2c414: 0afffefa beq 1f2c004 + 1f2c418: e5d2a01f ldrb sl, [r2, #31] + 1f2c41c: e357000a cmp r7, #10 + 1f2c420: e5d2b01e ldrb fp, [r2, #30] + 1f2c424: e1690e8a smulbb r9, sl, lr + 1f2c428: e10a9b85 smlabb sl, r5, fp, r9 + 1f2c42c: e5d29020 ldrb r9, [r2, #32] + 1f2c430: e5c38015 strb r8, [r3, #21] + 1f2c434: e109a984 smlabb r9, r4, r9, sl + 1f2c438: e1a09449 asr r9, r9, #8 + 1f2c43c: e5c39014 strb r9, [r3, #20] + 1f2c440: 0afffeef beq 1f2c004 + 1f2c444: e5d2b022 ldrb fp, [r2, #34] ; 0x22 + 1f2c448: e357000b cmp r7, #11 + 1f2c44c: e5d2a021 ldrb sl, [r2, #33] ; 0x21 + 1f2c450: e5d29023 ldrb r9, [r2, #35] ; 0x23 + 1f2c454: e16b0e8b smulbb fp, fp, lr + 1f2c458: e10aba85 smlabb sl, r5, sl, fp + 1f2c45c: e5c38017 strb r8, [r3, #23] + 1f2c460: e109a984 smlabb r9, r4, r9, sl + 1f2c464: e1a09449 asr r9, r9, #8 + 1f2c468: e5c39016 strb r9, [r3, #22] + 1f2c46c: 0afffee4 beq 1f2c004 + 1f2c470: e5d2b025 ldrb fp, [r2, #37] ; 0x25 + 1f2c474: e357000c cmp r7, #12 + 1f2c478: e5d2a024 ldrb sl, [r2, #36] ; 0x24 + 1f2c47c: e5d29026 ldrb r9, [r2, #38] ; 0x26 + 1f2c480: e16b0e8b smulbb fp, fp, lr + 1f2c484: e10aba85 smlabb sl, r5, sl, fp + 1f2c488: e5c38019 strb r8, [r3, #25] + 1f2c48c: e109a984 smlabb r9, r4, r9, sl + 1f2c490: e1a09449 asr r9, r9, #8 + 1f2c494: e5c39018 strb r9, [r3, #24] + 1f2c498: 0afffed9 beq 1f2c004 + 1f2c49c: e5d29028 ldrb r9, [r2, #40] ; 0x28 + 1f2c4a0: e357000d cmp r7, #13 + 1f2c4a4: e5d2a027 ldrb sl, [r2, #39] ; 0x27 + 1f2c4a8: e5d27029 ldrb r7, [r2, #41] ; 0x29 + 1f2c4ac: e1690e89 smulbb r9, r9, lr + 1f2c4b0: e1099a85 smlabb r9, r5, sl, r9 + 1f2c4b4: e5c3801b strb r8, [r3, #27] + 1f2c4b8: e1099784 smlabb r9, r4, r7, r9 + 1f2c4bc: e1a09449 asr r9, r9, #8 + 1f2c4c0: e5c3901a strb r9, [r3, #26] + 1f2c4c4: 0afffece beq 1f2c004 + 1f2c4c8: e5d2902b ldrb r9, [r2, #43] ; 0x2b + 1f2c4cc: e5d2702a ldrb r7, [r2, #42] ; 0x2a + 1f2c4d0: e5d2202c ldrb r2, [r2, #44] ; 0x2c + 1f2c4d4: e1690e89 smulbb r9, r9, lr + 1f2c4d8: e1099785 smlabb r9, r5, r7, r9 + 1f2c4dc: e5c3801d strb r8, [r3, #29] + 1f2c4e0: e1099284 smlabb r9, r4, r2, r9 + 1f2c4e4: e1a09449 asr r9, r9, #8 + 1f2c4e8: e5c3901c strb r9, [r3, #28] + 1f2c4ec: eafffec4 b 1f2c004 + 1f2c4f0: e59da008 ldr sl, [sp, #8] + 1f2c4f4: e2822004 add r2, r2, #4 + 1f2c4f8: e5527003 ldrb r7, [r2, #-3] + 1f2c4fc: e24aa001 sub sl, sl, #1 + 1f2c500: e5529004 ldrb r9, [r2, #-4] + 1f2c504: e37a0001 cmn sl, #1 + 1f2c508: e5528002 ldrb r8, [r2, #-2] + 1f2c50c: e2822004 add r2, r2, #4 + 1f2c510: e1670e87 smulbb r7, r7, lr + 1f2c514: e1077985 smlabb r7, r5, r9, r7 + 1f2c518: e1077884 smlabb r7, r4, r8, r7 + 1f2c51c: e1a07447 asr r7, r7, #8 + 1f2c520: e4c37001 strb r7, [r3], #1 + 1f2c524: 1afffff3 bne 1f2c4f8 + 1f2c528: eafffeb5 b 1f2c004 + 1f2c52c: e59d7008 ldr r7, [sp, #8] + 1f2c530: e2822004 add r2, r2, #4 + 1f2c534: e2833003 add r3, r3, #3 + 1f2c538: e5528004 ldrb r8, [r2, #-4] + 1f2c53c: e2477001 sub r7, r7, #1 + 1f2c540: e5438003 strb r8, [r3, #-3] + 1f2c544: e3770001 cmn r7, #1 + 1f2c548: e2822004 add r2, r2, #4 + 1f2c54c: e2833003 add r3, r3, #3 + 1f2c550: e5528007 ldrb r8, [r2, #-7] + 1f2c554: e5438005 strb r8, [r3, #-5] + 1f2c558: e5528006 ldrb r8, [r2, #-6] + 1f2c55c: e5438004 strb r8, [r3, #-4] + 1f2c560: 1afffff4 bne 1f2c538 + 1f2c564: eafffea6 b 1f2c004 + 1f2c568: e59d7008 ldr r7, [sp, #8] + 1f2c56c: e5d2a001 ldrb sl, [r2, #1] + 1f2c570: e3570000 cmp r7, #0 + 1f2c574: e5d29000 ldrb r9, [r2] + 1f2c578: e5d28002 ldrb r8, [r2, #2] + 1f2c57c: e16a0e8a smulbb sl, sl, lr + 1f2c580: e109a985 smlabb r9, r5, r9, sl + 1f2c584: e1089884 smlabb r8, r4, r8, r9 + 1f2c588: e1a08448 asr r8, r8, #8 + 1f2c58c: e5c38000 strb r8, [r3] + 1f2c590: e5d28003 ldrb r8, [r2, #3] + 1f2c594: e5c38001 strb r8, [r3, #1] + 1f2c598: 0afffe99 beq 1f2c004 + 1f2c59c: e5d2a005 ldrb sl, [r2, #5] + 1f2c5a0: e3570001 cmp r7, #1 + 1f2c5a4: e5d29004 ldrb r9, [r2, #4] + 1f2c5a8: e5d28006 ldrb r8, [r2, #6] + 1f2c5ac: e16a0e8a smulbb sl, sl, lr + 1f2c5b0: e109a985 smlabb r9, r5, r9, sl + 1f2c5b4: e1089884 smlabb r8, r4, r8, r9 + 1f2c5b8: e1a08448 asr r8, r8, #8 + 1f2c5bc: e5c38002 strb r8, [r3, #2] + 1f2c5c0: e5d28007 ldrb r8, [r2, #7] + 1f2c5c4: e5c38003 strb r8, [r3, #3] + 1f2c5c8: 0afffe8d beq 1f2c004 + 1f2c5cc: e5d2a009 ldrb sl, [r2, #9] + 1f2c5d0: e3570002 cmp r7, #2 + 1f2c5d4: e5d29008 ldrb r9, [r2, #8] + 1f2c5d8: e5d2800a ldrb r8, [r2, #10] + 1f2c5dc: e16a0e8a smulbb sl, sl, lr + 1f2c5e0: e109a985 smlabb r9, r5, r9, sl + 1f2c5e4: e1089884 smlabb r8, r4, r8, r9 + 1f2c5e8: e1a08448 asr r8, r8, #8 + 1f2c5ec: e5c38004 strb r8, [r3, #4] + 1f2c5f0: e5d2800b ldrb r8, [r2, #11] + 1f2c5f4: e5c38005 strb r8, [r3, #5] + 1f2c5f8: 0afffe81 beq 1f2c004 + 1f2c5fc: e5d2a00d ldrb sl, [r2, #13] + 1f2c600: e3570003 cmp r7, #3 + 1f2c604: e5d2900c ldrb r9, [r2, #12] + 1f2c608: e5d2800e ldrb r8, [r2, #14] + 1f2c60c: e16a0e8a smulbb sl, sl, lr + 1f2c610: e109a985 smlabb r9, r5, r9, sl + 1f2c614: e1089884 smlabb r8, r4, r8, r9 + 1f2c618: e1a08448 asr r8, r8, #8 + 1f2c61c: e5c38006 strb r8, [r3, #6] + 1f2c620: e5d2800f ldrb r8, [r2, #15] + 1f2c624: e5c38007 strb r8, [r3, #7] + 1f2c628: 0afffe75 beq 1f2c004 + 1f2c62c: e5d2a011 ldrb sl, [r2, #17] + 1f2c630: e3570004 cmp r7, #4 + 1f2c634: e5d29010 ldrb r9, [r2, #16] + 1f2c638: e5d28012 ldrb r8, [r2, #18] + 1f2c63c: e16a0e8a smulbb sl, sl, lr + 1f2c640: e109a985 smlabb r9, r5, r9, sl + 1f2c644: e1089884 smlabb r8, r4, r8, r9 + 1f2c648: e1a08448 asr r8, r8, #8 + 1f2c64c: e5c38008 strb r8, [r3, #8] + 1f2c650: e5d28013 ldrb r8, [r2, #19] + 1f2c654: e5c38009 strb r8, [r3, #9] + 1f2c658: 0afffe69 beq 1f2c004 + 1f2c65c: e5d2a015 ldrb sl, [r2, #21] + 1f2c660: e3570005 cmp r7, #5 + 1f2c664: e5d29014 ldrb r9, [r2, #20] + 1f2c668: e5d28016 ldrb r8, [r2, #22] + 1f2c66c: e16a0e8a smulbb sl, sl, lr + 1f2c670: e109a985 smlabb r9, r5, r9, sl + 1f2c674: e1089884 smlabb r8, r4, r8, r9 + 1f2c678: e1a08448 asr r8, r8, #8 + 1f2c67c: e5c3800a strb r8, [r3, #10] + 1f2c680: e5d28017 ldrb r8, [r2, #23] + 1f2c684: e5c3800b strb r8, [r3, #11] + 1f2c688: 0afffe5d beq 1f2c004 + 1f2c68c: e5d2a019 ldrb sl, [r2, #25] + 1f2c690: e3570006 cmp r7, #6 + 1f2c694: e5d29018 ldrb r9, [r2, #24] + 1f2c698: e5d2801a ldrb r8, [r2, #26] + 1f2c69c: e16a0e8a smulbb sl, sl, lr + 1f2c6a0: e109a985 smlabb r9, r5, r9, sl + 1f2c6a4: e1089884 smlabb r8, r4, r8, r9 + 1f2c6a8: e1a08448 asr r8, r8, #8 + 1f2c6ac: e5c3800c strb r8, [r3, #12] + 1f2c6b0: e5d2801b ldrb r8, [r2, #27] + 1f2c6b4: e5c3800d strb r8, [r3, #13] + 1f2c6b8: 0afffe51 beq 1f2c004 + 1f2c6bc: e5d2a01d ldrb sl, [r2, #29] + 1f2c6c0: e3570007 cmp r7, #7 + 1f2c6c4: e5d2901c ldrb r9, [r2, #28] + 1f2c6c8: e5d2801e ldrb r8, [r2, #30] + 1f2c6cc: e16a0e8a smulbb sl, sl, lr + 1f2c6d0: e109a985 smlabb r9, r5, r9, sl + 1f2c6d4: e1089884 smlabb r8, r4, r8, r9 + 1f2c6d8: e1a08448 asr r8, r8, #8 + 1f2c6dc: e5c3800e strb r8, [r3, #14] + 1f2c6e0: e5d2801f ldrb r8, [r2, #31] + 1f2c6e4: e5c3800f strb r8, [r3, #15] + 1f2c6e8: 0afffe45 beq 1f2c004 + 1f2c6ec: e5d2a021 ldrb sl, [r2, #33] ; 0x21 + 1f2c6f0: e3570008 cmp r7, #8 + 1f2c6f4: e5d29020 ldrb r9, [r2, #32] + 1f2c6f8: e5d28022 ldrb r8, [r2, #34] ; 0x22 + 1f2c6fc: e16a0e8a smulbb sl, sl, lr + 1f2c700: e109a985 smlabb r9, r5, r9, sl + 1f2c704: e1089884 smlabb r8, r4, r8, r9 + 1f2c708: e1a08448 asr r8, r8, #8 + 1f2c70c: e5c38010 strb r8, [r3, #16] + 1f2c710: e5d28023 ldrb r8, [r2, #35] ; 0x23 + 1f2c714: e5c38011 strb r8, [r3, #17] + 1f2c718: 0afffe39 beq 1f2c004 + 1f2c71c: e5d2a025 ldrb sl, [r2, #37] ; 0x25 + 1f2c720: e3570009 cmp r7, #9 + 1f2c724: e5d29024 ldrb r9, [r2, #36] ; 0x24 + 1f2c728: e5d28026 ldrb r8, [r2, #38] ; 0x26 + 1f2c72c: e16a0e8a smulbb sl, sl, lr + 1f2c730: e109a985 smlabb r9, r5, r9, sl + 1f2c734: e1089884 smlabb r8, r4, r8, r9 + 1f2c738: e1a08448 asr r8, r8, #8 + 1f2c73c: e5c38012 strb r8, [r3, #18] + 1f2c740: e5d28027 ldrb r8, [r2, #39] ; 0x27 + 1f2c744: e5c38013 strb r8, [r3, #19] + 1f2c748: 0afffe2d beq 1f2c004 + 1f2c74c: e5d2a029 ldrb sl, [r2, #41] ; 0x29 + 1f2c750: e357000a cmp r7, #10 + 1f2c754: e5d29028 ldrb r9, [r2, #40] ; 0x28 + 1f2c758: e5d2802a ldrb r8, [r2, #42] ; 0x2a + 1f2c75c: e16a0e8a smulbb sl, sl, lr + 1f2c760: e109a985 smlabb r9, r5, r9, sl + 1f2c764: e1089884 smlabb r8, r4, r8, r9 + 1f2c768: e1a08448 asr r8, r8, #8 + 1f2c76c: e5c38014 strb r8, [r3, #20] + 1f2c770: e5d2802b ldrb r8, [r2, #43] ; 0x2b + 1f2c774: e5c38015 strb r8, [r3, #21] + 1f2c778: 0afffe21 beq 1f2c004 + 1f2c77c: e5d2a02d ldrb sl, [r2, #45] ; 0x2d + 1f2c780: e357000b cmp r7, #11 + 1f2c784: e5d2902c ldrb r9, [r2, #44] ; 0x2c + 1f2c788: e5d2802e ldrb r8, [r2, #46] ; 0x2e + 1f2c78c: e16a0e8a smulbb sl, sl, lr + 1f2c790: e109a985 smlabb r9, r5, r9, sl + 1f2c794: e1089884 smlabb r8, r4, r8, r9 + 1f2c798: e1a08448 asr r8, r8, #8 + 1f2c79c: e5c38016 strb r8, [r3, #22] + 1f2c7a0: e5d2802f ldrb r8, [r2, #47] ; 0x2f + 1f2c7a4: e5c38017 strb r8, [r3, #23] + 1f2c7a8: 0afffe15 beq 1f2c004 + 1f2c7ac: e5d2a031 ldrb sl, [r2, #49] ; 0x31 + 1f2c7b0: e357000c cmp r7, #12 + 1f2c7b4: e5d29030 ldrb r9, [r2, #48] ; 0x30 + 1f2c7b8: e5d28032 ldrb r8, [r2, #50] ; 0x32 + 1f2c7bc: e16a0e8a smulbb sl, sl, lr + 1f2c7c0: e109a985 smlabb r9, r5, r9, sl + 1f2c7c4: e1089884 smlabb r8, r4, r8, r9 + 1f2c7c8: e1a08448 asr r8, r8, #8 + 1f2c7cc: e5c38018 strb r8, [r3, #24] + 1f2c7d0: e5d28033 ldrb r8, [r2, #51] ; 0x33 + 1f2c7d4: e5c38019 strb r8, [r3, #25] + 1f2c7d8: 0afffe09 beq 1f2c004 + 1f2c7dc: e5d28035 ldrb r8, [r2, #53] ; 0x35 + 1f2c7e0: e357000d cmp r7, #13 + 1f2c7e4: e5d29034 ldrb r9, [r2, #52] ; 0x34 + 1f2c7e8: e5d27036 ldrb r7, [r2, #54] ; 0x36 + 1f2c7ec: e1680e88 smulbb r8, r8, lr + 1f2c7f0: e1088985 smlabb r8, r5, r9, r8 + 1f2c7f4: e1088784 smlabb r8, r4, r7, r8 + 1f2c7f8: e1a08448 asr r8, r8, #8 + 1f2c7fc: e5c3801a strb r8, [r3, #26] + 1f2c800: e5d27037 ldrb r7, [r2, #55] ; 0x37 + 1f2c804: e5c3701b strb r7, [r3, #27] + 1f2c808: 0afffdfd beq 1f2c004 + 1f2c80c: e5d29039 ldrb r9, [r2, #57] ; 0x39 + 1f2c810: e5d28038 ldrb r8, [r2, #56] ; 0x38 + 1f2c814: e5d2703a ldrb r7, [r2, #58] ; 0x3a + 1f2c818: e1690e89 smulbb r9, r9, lr + 1f2c81c: e1089885 smlabb r8, r5, r8, r9 + 1f2c820: e1078784 smlabb r7, r4, r7, r8 + 1f2c824: e1a07447 asr r7, r7, #8 + 1f2c828: e5c3701c strb r7, [r3, #28] + 1f2c82c: e5d2203b ldrb r2, [r2, #59] ; 0x3b + 1f2c830: e5c3201d strb r2, [r3, #29] + 1f2c834: eafffdf2 b 1f2c004 + 1f2c838: e59d7008 ldr r7, [sp, #8] + 1f2c83c: e5d28000 ldrb r8, [r2] + 1f2c840: e3570000 cmp r7, #0 + 1f2c844: e5c38000 strb r8, [r3] + 1f2c848: e3e08000 mvn r8, #0 + 1f2c84c: e5d29001 ldrb r9, [r2, #1] + 1f2c850: e5c39001 strb r9, [r3, #1] + 1f2c854: e5d29002 ldrb r9, [r2, #2] + 1f2c858: e5c39002 strb r9, [r3, #2] + 1f2c85c: e5c38003 strb r8, [r3, #3] + 1f2c860: 0afffde7 beq 1f2c004 + 1f2c864: e5d29003 ldrb r9, [r2, #3] + 1f2c868: e3570001 cmp r7, #1 + 1f2c86c: e5c39004 strb r9, [r3, #4] + 1f2c870: e5d29004 ldrb r9, [r2, #4] + 1f2c874: e5c39005 strb r9, [r3, #5] + 1f2c878: e5d29005 ldrb r9, [r2, #5] + 1f2c87c: e5c39006 strb r9, [r3, #6] + 1f2c880: e5c38007 strb r8, [r3, #7] + 1f2c884: 0afffdde beq 1f2c004 + 1f2c888: e5d29006 ldrb r9, [r2, #6] + 1f2c88c: e3570002 cmp r7, #2 + 1f2c890: e5c39008 strb r9, [r3, #8] + 1f2c894: e5d29007 ldrb r9, [r2, #7] + 1f2c898: e5c39009 strb r9, [r3, #9] + 1f2c89c: e5d29008 ldrb r9, [r2, #8] + 1f2c8a0: e5c3900a strb r9, [r3, #10] + 1f2c8a4: e5c3800b strb r8, [r3, #11] + 1f2c8a8: 0afffdd5 beq 1f2c004 + 1f2c8ac: e5d29009 ldrb r9, [r2, #9] + 1f2c8b0: e3570003 cmp r7, #3 + 1f2c8b4: e5c3900c strb r9, [r3, #12] + 1f2c8b8: e5d2900a ldrb r9, [r2, #10] + 1f2c8bc: e5c3900d strb r9, [r3, #13] + 1f2c8c0: e5d2900b ldrb r9, [r2, #11] + 1f2c8c4: e5c3900e strb r9, [r3, #14] + 1f2c8c8: e5c3800f strb r8, [r3, #15] + 1f2c8cc: 0afffdcc beq 1f2c004 + 1f2c8d0: e5d2900c ldrb r9, [r2, #12] + 1f2c8d4: e3570004 cmp r7, #4 + 1f2c8d8: e5c39010 strb r9, [r3, #16] + 1f2c8dc: e5d2900d ldrb r9, [r2, #13] + 1f2c8e0: e5c39011 strb r9, [r3, #17] + 1f2c8e4: e5d2900e ldrb r9, [r2, #14] + 1f2c8e8: e5c39012 strb r9, [r3, #18] + 1f2c8ec: e5c38013 strb r8, [r3, #19] + 1f2c8f0: 0afffdc3 beq 1f2c004 + 1f2c8f4: e5d2900f ldrb r9, [r2, #15] + 1f2c8f8: e3570005 cmp r7, #5 + 1f2c8fc: e5c39014 strb r9, [r3, #20] + 1f2c900: e5d29010 ldrb r9, [r2, #16] + 1f2c904: e5c39015 strb r9, [r3, #21] + 1f2c908: e5d29011 ldrb r9, [r2, #17] + 1f2c90c: e5c39016 strb r9, [r3, #22] + 1f2c910: e5c38017 strb r8, [r3, #23] + 1f2c914: 0afffdba beq 1f2c004 + 1f2c918: e5d29012 ldrb r9, [r2, #18] + 1f2c91c: e3570006 cmp r7, #6 + 1f2c920: e5c39018 strb r9, [r3, #24] + 1f2c924: e5d29013 ldrb r9, [r2, #19] + 1f2c928: e5c39019 strb r9, [r3, #25] + 1f2c92c: e5d29014 ldrb r9, [r2, #20] + 1f2c930: e5c3901a strb r9, [r3, #26] + 1f2c934: e5c3801b strb r8, [r3, #27] + 1f2c938: 0afffdb1 beq 1f2c004 + 1f2c93c: e5d29015 ldrb r9, [r2, #21] + 1f2c940: e3570007 cmp r7, #7 + 1f2c944: e5c3901c strb r9, [r3, #28] + 1f2c948: e5d29016 ldrb r9, [r2, #22] + 1f2c94c: e5c3901d strb r9, [r3, #29] + 1f2c950: e5d29017 ldrb r9, [r2, #23] + 1f2c954: e5c3901e strb r9, [r3, #30] + 1f2c958: e5c3801f strb r8, [r3, #31] + 1f2c95c: 0afffda8 beq 1f2c004 + 1f2c960: e5d29018 ldrb r9, [r2, #24] + 1f2c964: e3570008 cmp r7, #8 + 1f2c968: e5c39020 strb r9, [r3, #32] + 1f2c96c: e5d29019 ldrb r9, [r2, #25] + 1f2c970: e5c39021 strb r9, [r3, #33] ; 0x21 + 1f2c974: e5d2901a ldrb r9, [r2, #26] + 1f2c978: e5c39022 strb r9, [r3, #34] ; 0x22 + 1f2c97c: e5c38023 strb r8, [r3, #35] ; 0x23 + 1f2c980: 0afffd9f beq 1f2c004 + 1f2c984: e5d2901b ldrb r9, [r2, #27] + 1f2c988: e3570009 cmp r7, #9 + 1f2c98c: e5c39024 strb r9, [r3, #36] ; 0x24 + 1f2c990: e5d2901c ldrb r9, [r2, #28] + 1f2c994: e5c39025 strb r9, [r3, #37] ; 0x25 + 1f2c998: e5d2901d ldrb r9, [r2, #29] + 1f2c99c: e5c39026 strb r9, [r3, #38] ; 0x26 + 1f2c9a0: e5c38027 strb r8, [r3, #39] ; 0x27 + 1f2c9a4: 0afffd96 beq 1f2c004 + 1f2c9a8: e5d2801e ldrb r8, [r2, #30] + 1f2c9ac: e357000a cmp r7, #10 + 1f2c9b0: e5c38028 strb r8, [r3, #40] ; 0x28 + 1f2c9b4: e3e08000 mvn r8, #0 + 1f2c9b8: e5d2901f ldrb r9, [r2, #31] + 1f2c9bc: e5c39029 strb r9, [r3, #41] ; 0x29 + 1f2c9c0: e5d29020 ldrb r9, [r2, #32] + 1f2c9c4: e5c3902a strb r9, [r3, #42] ; 0x2a + 1f2c9c8: e5c3802b strb r8, [r3, #43] ; 0x2b + 1f2c9cc: 0afffd8c beq 1f2c004 + 1f2c9d0: e5d29021 ldrb r9, [r2, #33] ; 0x21 + 1f2c9d4: e357000b cmp r7, #11 + 1f2c9d8: e5c3902c strb r9, [r3, #44] ; 0x2c + 1f2c9dc: e5d29022 ldrb r9, [r2, #34] ; 0x22 + 1f2c9e0: e5c3902d strb r9, [r3, #45] ; 0x2d + 1f2c9e4: e5d29023 ldrb r9, [r2, #35] ; 0x23 + 1f2c9e8: e5c3902e strb r9, [r3, #46] ; 0x2e + 1f2c9ec: e5c3802f strb r8, [r3, #47] ; 0x2f + 1f2c9f0: 0afffd83 beq 1f2c004 + 1f2c9f4: e5d29024 ldrb r9, [r2, #36] ; 0x24 + 1f2c9f8: e357000c cmp r7, #12 + 1f2c9fc: e5c39030 strb r9, [r3, #48] ; 0x30 + 1f2ca00: e5d29025 ldrb r9, [r2, #37] ; 0x25 + 1f2ca04: e5c39031 strb r9, [r3, #49] ; 0x31 + 1f2ca08: e5d29026 ldrb r9, [r2, #38] ; 0x26 + 1f2ca0c: e5c39032 strb r9, [r3, #50] ; 0x32 + 1f2ca10: e5c38033 strb r8, [r3, #51] ; 0x33 + 1f2ca14: 0afffd7a beq 1f2c004 + 1f2ca18: e5d29027 ldrb r9, [r2, #39] ; 0x27 + 1f2ca1c: e357000d cmp r7, #13 + 1f2ca20: e5c39034 strb r9, [r3, #52] ; 0x34 + 1f2ca24: e5d27028 ldrb r7, [r2, #40] ; 0x28 + 1f2ca28: e5c37035 strb r7, [r3, #53] ; 0x35 + 1f2ca2c: e5d27029 ldrb r7, [r2, #41] ; 0x29 + 1f2ca30: e5c37036 strb r7, [r3, #54] ; 0x36 + 1f2ca34: e5c38037 strb r8, [r3, #55] ; 0x37 + 1f2ca38: 0afffd71 beq 1f2c004 + 1f2ca3c: e5d2702a ldrb r7, [r2, #42] ; 0x2a + 1f2ca40: e5c37038 strb r7, [r3, #56] ; 0x38 + 1f2ca44: e5d2702b ldrb r7, [r2, #43] ; 0x2b + 1f2ca48: e5c37039 strb r7, [r3, #57] ; 0x39 + 1f2ca4c: e5d2202c ldrb r2, [r2, #44] ; 0x2c + 1f2ca50: e5c3203a strb r2, [r3, #58] ; 0x3a + 1f2ca54: e5c3803b strb r8, [r3, #59] ; 0x3b + 1f2ca58: eafffd69 b 1f2c004 + 1f2ca5c: e59d7008 ldr r7, [sp, #8] + 1f2ca60: e5d2a001 ldrb sl, [r2, #1] + 1f2ca64: e3570000 cmp r7, #0 + 1f2ca68: e5d29000 ldrb r9, [r2] + 1f2ca6c: e5d28002 ldrb r8, [r2, #2] + 1f2ca70: e16a0e8a smulbb sl, sl, lr + 1f2ca74: e109a985 smlabb r9, r5, r9, sl + 1f2ca78: e1089884 smlabb r8, r4, r8, r9 + 1f2ca7c: e1a08448 asr r8, r8, #8 + 1f2ca80: e5c38000 strb r8, [r3] + 1f2ca84: 0afffd5e beq 1f2c004 + 1f2ca88: e5d2a004 ldrb sl, [r2, #4] + 1f2ca8c: e3570001 cmp r7, #1 + 1f2ca90: e5d29003 ldrb r9, [r2, #3] + 1f2ca94: e5d28005 ldrb r8, [r2, #5] + 1f2ca98: e16a0e8a smulbb sl, sl, lr + 1f2ca9c: e109a985 smlabb r9, r5, r9, sl + 1f2caa0: e1089884 smlabb r8, r4, r8, r9 + 1f2caa4: e1a08448 asr r8, r8, #8 + 1f2caa8: e5c38001 strb r8, [r3, #1] + 1f2caac: 0afffd54 beq 1f2c004 + 1f2cab0: e5d2a007 ldrb sl, [r2, #7] + 1f2cab4: e3570002 cmp r7, #2 + 1f2cab8: e5d29006 ldrb r9, [r2, #6] + 1f2cabc: e5d28008 ldrb r8, [r2, #8] + 1f2cac0: e16a0e8a smulbb sl, sl, lr + 1f2cac4: e109a985 smlabb r9, r5, r9, sl + 1f2cac8: e1089884 smlabb r8, r4, r8, r9 + 1f2cacc: e1a08448 asr r8, r8, #8 + 1f2cad0: e5c38002 strb r8, [r3, #2] + 1f2cad4: 0afffd4a beq 1f2c004 + 1f2cad8: e5d2a00a ldrb sl, [r2, #10] + 1f2cadc: e3570003 cmp r7, #3 + 1f2cae0: e5d29009 ldrb r9, [r2, #9] + 1f2cae4: e5d2800b ldrb r8, [r2, #11] + 1f2cae8: e16a0e8a smulbb sl, sl, lr + 1f2caec: e109a985 smlabb r9, r5, r9, sl + 1f2caf0: e1089884 smlabb r8, r4, r8, r9 + 1f2caf4: e1a08448 asr r8, r8, #8 + 1f2caf8: e5c38003 strb r8, [r3, #3] + 1f2cafc: 0afffd40 beq 1f2c004 + 1f2cb00: e5d2a00d ldrb sl, [r2, #13] + 1f2cb04: e3570004 cmp r7, #4 + 1f2cb08: e5d2900c ldrb r9, [r2, #12] + 1f2cb0c: e5d2800e ldrb r8, [r2, #14] + 1f2cb10: e16a0e8a smulbb sl, sl, lr + 1f2cb14: e109a985 smlabb r9, r5, r9, sl + 1f2cb18: e1089884 smlabb r8, r4, r8, r9 + 1f2cb1c: e1a08448 asr r8, r8, #8 + 1f2cb20: e5c38004 strb r8, [r3, #4] + 1f2cb24: 0afffd36 beq 1f2c004 + 1f2cb28: e5d2a010 ldrb sl, [r2, #16] + 1f2cb2c: e3570005 cmp r7, #5 + 1f2cb30: e5d2900f ldrb r9, [r2, #15] + 1f2cb34: e5d28011 ldrb r8, [r2, #17] + 1f2cb38: e16a0e8a smulbb sl, sl, lr + 1f2cb3c: e109a985 smlabb r9, r5, r9, sl + 1f2cb40: e1089884 smlabb r8, r4, r8, r9 + 1f2cb44: e1a08448 asr r8, r8, #8 + 1f2cb48: e5c38005 strb r8, [r3, #5] + 1f2cb4c: 0afffd2c beq 1f2c004 + 1f2cb50: e5d2a013 ldrb sl, [r2, #19] + 1f2cb54: e3570006 cmp r7, #6 + 1f2cb58: e5d29012 ldrb r9, [r2, #18] + 1f2cb5c: e5d28014 ldrb r8, [r2, #20] + 1f2cb60: e16a0e8a smulbb sl, sl, lr + 1f2cb64: e109a985 smlabb r9, r5, r9, sl + 1f2cb68: e1089884 smlabb r8, r4, r8, r9 + 1f2cb6c: e1a08448 asr r8, r8, #8 + 1f2cb70: e5c38006 strb r8, [r3, #6] + 1f2cb74: 0afffd22 beq 1f2c004 + 1f2cb78: e5d2a016 ldrb sl, [r2, #22] + 1f2cb7c: e3570007 cmp r7, #7 + 1f2cb80: e5d29015 ldrb r9, [r2, #21] + 1f2cb84: e5d28017 ldrb r8, [r2, #23] + 1f2cb88: e16a0e8a smulbb sl, sl, lr + 1f2cb8c: e109a985 smlabb r9, r5, r9, sl + 1f2cb90: e1089884 smlabb r8, r4, r8, r9 + 1f2cb94: e1a08448 asr r8, r8, #8 + 1f2cb98: e5c38007 strb r8, [r3, #7] + 1f2cb9c: 0afffd18 beq 1f2c004 + 1f2cba0: e5d2a019 ldrb sl, [r2, #25] + 1f2cba4: e3570008 cmp r7, #8 + 1f2cba8: e5d29018 ldrb r9, [r2, #24] + 1f2cbac: e5d2801a ldrb r8, [r2, #26] + 1f2cbb0: e16a0e8a smulbb sl, sl, lr + 1f2cbb4: e109a985 smlabb r9, r5, r9, sl + 1f2cbb8: e1089884 smlabb r8, r4, r8, r9 + 1f2cbbc: e1a08448 asr r8, r8, #8 + 1f2cbc0: e5c38008 strb r8, [r3, #8] + 1f2cbc4: 0afffd0e beq 1f2c004 + 1f2cbc8: e5d2a01c ldrb sl, [r2, #28] + 1f2cbcc: e3570009 cmp r7, #9 + 1f2cbd0: e5d2901b ldrb r9, [r2, #27] + 1f2cbd4: e5d2801d ldrb r8, [r2, #29] + 1f2cbd8: e16a0e8a smulbb sl, sl, lr + 1f2cbdc: e109a985 smlabb r9, r5, r9, sl + 1f2cbe0: e1089884 smlabb r8, r4, r8, r9 + 1f2cbe4: e1a08448 asr r8, r8, #8 + 1f2cbe8: e5c38009 strb r8, [r3, #9] + 1f2cbec: 0afffd04 beq 1f2c004 + 1f2cbf0: e5d2a01f ldrb sl, [r2, #31] + 1f2cbf4: e357000a cmp r7, #10 + 1f2cbf8: e5d2901e ldrb r9, [r2, #30] + 1f2cbfc: e5d28020 ldrb r8, [r2, #32] + 1f2cc00: e16a0e8a smulbb sl, sl, lr + 1f2cc04: e109a985 smlabb r9, r5, r9, sl + 1f2cc08: e1089884 smlabb r8, r4, r8, r9 + 1f2cc0c: e1a08448 asr r8, r8, #8 + 1f2cc10: e5c3800a strb r8, [r3, #10] + 1f2cc14: 0afffcfa beq 1f2c004 + 1f2cc18: e5d2a022 ldrb sl, [r2, #34] ; 0x22 + 1f2cc1c: e357000b cmp r7, #11 + 1f2cc20: e5d29021 ldrb r9, [r2, #33] ; 0x21 + 1f2cc24: e5d28023 ldrb r8, [r2, #35] ; 0x23 + 1f2cc28: e16a0e8a smulbb sl, sl, lr + 1f2cc2c: e109a985 smlabb r9, r5, r9, sl + 1f2cc30: e1089884 smlabb r8, r4, r8, r9 + 1f2cc34: e1a08448 asr r8, r8, #8 + 1f2cc38: e5c3800b strb r8, [r3, #11] + 1f2cc3c: 0afffcf0 beq 1f2c004 + 1f2cc40: e5d2a025 ldrb sl, [r2, #37] ; 0x25 + 1f2cc44: e357000c cmp r7, #12 + 1f2cc48: e5d29024 ldrb r9, [r2, #36] ; 0x24 + 1f2cc4c: e5d28026 ldrb r8, [r2, #38] ; 0x26 + 1f2cc50: e16a0e8a smulbb sl, sl, lr + 1f2cc54: e109a985 smlabb r9, r5, r9, sl + 1f2cc58: e1089884 smlabb r8, r4, r8, r9 + 1f2cc5c: e1a08448 asr r8, r8, #8 + 1f2cc60: e5c3800c strb r8, [r3, #12] + 1f2cc64: 0afffce6 beq 1f2c004 + 1f2cc68: e5d28028 ldrb r8, [r2, #40] ; 0x28 + 1f2cc6c: e357000d cmp r7, #13 + 1f2cc70: e5d29027 ldrb r9, [r2, #39] ; 0x27 + 1f2cc74: e5d27029 ldrb r7, [r2, #41] ; 0x29 + 1f2cc78: e1680e88 smulbb r8, r8, lr + 1f2cc7c: e1088985 smlabb r8, r5, r9, r8 + 1f2cc80: e1088784 smlabb r8, r4, r7, r8 + 1f2cc84: e1a08448 asr r8, r8, #8 + 1f2cc88: e5c3800d strb r8, [r3, #13] + 1f2cc8c: 0afffcdc beq 1f2c004 + 1f2cc90: e5d2802b ldrb r8, [r2, #43] ; 0x2b + 1f2cc94: e5d2702a ldrb r7, [r2, #42] ; 0x2a + 1f2cc98: e5d2202c ldrb r2, [r2, #44] ; 0x2c + 1f2cc9c: e1680e88 smulbb r8, r8, lr + 1f2cca0: e1088785 smlabb r8, r5, r7, r8 + 1f2cca4: e1088284 smlabb r8, r4, r2, r8 + 1f2cca8: e1a08448 asr r8, r8, #8 + 1f2ccac: e5c3800e strb r8, [r3, #14] + 1f2ccb0: eafffcd3 b 1f2c004 + 1f2ccb4: e59d7008 ldr r7, [sp, #8] + 1f2ccb8: e3570000 cmp r7, #0 + 1f2ccbc: e5d28000 ldrb r8, [r2] + 1f2ccc0: e5c38000 strb r8, [r3] + 1f2ccc4: e3e08000 mvn r8, #0 + 1f2ccc8: e5c38001 strb r8, [r3, #1] + 1f2cccc: 0afffccc beq 1f2c004 + 1f2ccd0: e3570001 cmp r7, #1 + 1f2ccd4: e5d29001 ldrb r9, [r2, #1] + 1f2ccd8: e5c39002 strb r9, [r3, #2] + 1f2ccdc: e5c38003 strb r8, [r3, #3] + 1f2cce0: 0afffcc7 beq 1f2c004 + 1f2cce4: e3570002 cmp r7, #2 + 1f2cce8: e5d29002 ldrb r9, [r2, #2] + 1f2ccec: e5c39004 strb r9, [r3, #4] + 1f2ccf0: e5c38005 strb r8, [r3, #5] + 1f2ccf4: 0afffcc2 beq 1f2c004 + 1f2ccf8: e3570003 cmp r7, #3 + 1f2ccfc: e5d29003 ldrb r9, [r2, #3] + 1f2cd00: e5c39006 strb r9, [r3, #6] + 1f2cd04: e5c38007 strb r8, [r3, #7] + 1f2cd08: 0afffcbd beq 1f2c004 + 1f2cd0c: e3570004 cmp r7, #4 + 1f2cd10: e5d29004 ldrb r9, [r2, #4] + 1f2cd14: e5c39008 strb r9, [r3, #8] + 1f2cd18: e5c38009 strb r8, [r3, #9] + 1f2cd1c: 0afffcb8 beq 1f2c004 + 1f2cd20: e3570005 cmp r7, #5 + 1f2cd24: e5d29005 ldrb r9, [r2, #5] + 1f2cd28: e5c3900a strb r9, [r3, #10] + 1f2cd2c: e5c3800b strb r8, [r3, #11] + 1f2cd30: 0afffcb3 beq 1f2c004 + 1f2cd34: e3570006 cmp r7, #6 + 1f2cd38: e5d29006 ldrb r9, [r2, #6] + 1f2cd3c: e5c3900c strb r9, [r3, #12] + 1f2cd40: e5c3800d strb r8, [r3, #13] + 1f2cd44: 0afffcae beq 1f2c004 + 1f2cd48: e3570007 cmp r7, #7 + 1f2cd4c: e5d29007 ldrb r9, [r2, #7] + 1f2cd50: e5c3900e strb r9, [r3, #14] + 1f2cd54: e5c3800f strb r8, [r3, #15] + 1f2cd58: 0afffca9 beq 1f2c004 + 1f2cd5c: e3570008 cmp r7, #8 + 1f2cd60: e5d29008 ldrb r9, [r2, #8] + 1f2cd64: e5c39010 strb r9, [r3, #16] + 1f2cd68: e5c38011 strb r8, [r3, #17] + 1f2cd6c: 0afffca4 beq 1f2c004 + 1f2cd70: e3570009 cmp r7, #9 + 1f2cd74: e5d29009 ldrb r9, [r2, #9] + 1f2cd78: e5c39012 strb r9, [r3, #18] + 1f2cd7c: e5c38013 strb r8, [r3, #19] + 1f2cd80: 0afffc9f beq 1f2c004 + 1f2cd84: e357000a cmp r7, #10 + 1f2cd88: e5d2800a ldrb r8, [r2, #10] + 1f2cd8c: e5c38014 strb r8, [r3, #20] + 1f2cd90: e3e08000 mvn r8, #0 + 1f2cd94: e5c38015 strb r8, [r3, #21] + 1f2cd98: 0afffc99 beq 1f2c004 + 1f2cd9c: e357000b cmp r7, #11 + 1f2cda0: e5d2900b ldrb r9, [r2, #11] + 1f2cda4: e5c39016 strb r9, [r3, #22] + 1f2cda8: e5c38017 strb r8, [r3, #23] + 1f2cdac: 0afffc94 beq 1f2c004 + 1f2cdb0: e357000c cmp r7, #12 + 1f2cdb4: e5d2900c ldrb r9, [r2, #12] + 1f2cdb8: e5c39018 strb r9, [r3, #24] + 1f2cdbc: e5c38019 strb r8, [r3, #25] + 1f2cdc0: 0afffc8f beq 1f2c004 + 1f2cdc4: e357000d cmp r7, #13 + 1f2cdc8: e5d2700d ldrb r7, [r2, #13] + 1f2cdcc: e5c3701a strb r7, [r3, #26] + 1f2cdd0: e5c3801b strb r8, [r3, #27] + 1f2cdd4: 15d2200e ldrbne r2, [r2, #14] + 1f2cdd8: 15c3201c strbne r2, [r3, #28] + 1f2cddc: 15c3801d strbne r8, [r3, #29] + 1f2cde0: eafffc87 b 1f2c004 + 1f2cde4: e59d7008 ldr r7, [sp, #8] + 1f2cde8: e2822002 add r2, r2, #2 + 1f2cdec: e2833003 add r3, r3, #3 + 1f2cdf0: e2477001 sub r7, r7, #1 + 1f2cdf4: e5528002 ldrb r8, [r2, #-2] + 1f2cdf8: e3770001 cmn r7, #1 + 1f2cdfc: e5438001 strb r8, [r3, #-1] + 1f2ce00: e5438002 strb r8, [r3, #-2] + 1f2ce04: e2822002 add r2, r2, #2 + 1f2ce08: e5438003 strb r8, [r3, #-3] + 1f2ce0c: e2833003 add r3, r3, #3 + 1f2ce10: 1afffff6 bne 1f2cdf0 + 1f2ce14: eafffc7a b 1f2c004 + 1f2ce18: e59d7008 ldr r7, [sp, #8] + 1f2ce1c: e3570000 cmp r7, #0 + 1f2ce20: e5d29000 ldrb r9, [r2] + 1f2ce24: e3e08000 mvn r8, #0 + 1f2ce28: e5c39002 strb r9, [r3, #2] + 1f2ce2c: e5c39001 strb r9, [r3, #1] + 1f2ce30: e5c39000 strb r9, [r3] + 1f2ce34: e5c38003 strb r8, [r3, #3] + 1f2ce38: 0afffc71 beq 1f2c004 + 1f2ce3c: e3570001 cmp r7, #1 + 1f2ce40: e5d29001 ldrb r9, [r2, #1] + 1f2ce44: e5c39006 strb r9, [r3, #6] + 1f2ce48: e5c39005 strb r9, [r3, #5] + 1f2ce4c: e5c39004 strb r9, [r3, #4] + 1f2ce50: e5c38007 strb r8, [r3, #7] + 1f2ce54: 0afffc6a beq 1f2c004 + 1f2ce58: e3570002 cmp r7, #2 + 1f2ce5c: e5d29002 ldrb r9, [r2, #2] + 1f2ce60: e5c3900a strb r9, [r3, #10] + 1f2ce64: e5c39009 strb r9, [r3, #9] + 1f2ce68: e5c39008 strb r9, [r3, #8] + 1f2ce6c: e5c3800b strb r8, [r3, #11] + 1f2ce70: 0afffc63 beq 1f2c004 + 1f2ce74: e3570003 cmp r7, #3 + 1f2ce78: e5d29003 ldrb r9, [r2, #3] + 1f2ce7c: e5c3900e strb r9, [r3, #14] + 1f2ce80: e5c3900d strb r9, [r3, #13] + 1f2ce84: e5c3900c strb r9, [r3, #12] + 1f2ce88: e5c3800f strb r8, [r3, #15] + 1f2ce8c: 0afffc5c beq 1f2c004 + 1f2ce90: e3570004 cmp r7, #4 + 1f2ce94: e5d29004 ldrb r9, [r2, #4] + 1f2ce98: e5c39012 strb r9, [r3, #18] + 1f2ce9c: e5c39011 strb r9, [r3, #17] + 1f2cea0: e5c39010 strb r9, [r3, #16] + 1f2cea4: e5c38013 strb r8, [r3, #19] + 1f2cea8: 0afffc55 beq 1f2c004 + 1f2ceac: e3570005 cmp r7, #5 + 1f2ceb0: e5d29005 ldrb r9, [r2, #5] + 1f2ceb4: e5c39016 strb r9, [r3, #22] + 1f2ceb8: e5c39015 strb r9, [r3, #21] + 1f2cebc: e5c39014 strb r9, [r3, #20] + 1f2cec0: e5c38017 strb r8, [r3, #23] + 1f2cec4: 0afffc4e beq 1f2c004 + 1f2cec8: e3570006 cmp r7, #6 + 1f2cecc: e5d29006 ldrb r9, [r2, #6] + 1f2ced0: e5c3901a strb r9, [r3, #26] + 1f2ced4: e5c39019 strb r9, [r3, #25] + 1f2ced8: e5c39018 strb r9, [r3, #24] + 1f2cedc: e5c3801b strb r8, [r3, #27] + 1f2cee0: 0afffc47 beq 1f2c004 + 1f2cee4: e3570007 cmp r7, #7 + 1f2cee8: e5d29007 ldrb r9, [r2, #7] + 1f2ceec: e5c3901e strb r9, [r3, #30] + 1f2cef0: e5c3901d strb r9, [r3, #29] + 1f2cef4: e5c3901c strb r9, [r3, #28] + 1f2cef8: e5c3801f strb r8, [r3, #31] + 1f2cefc: 0afffc40 beq 1f2c004 + 1f2cf00: e3570008 cmp r7, #8 + 1f2cf04: e5d29008 ldrb r9, [r2, #8] + 1f2cf08: e5c39022 strb r9, [r3, #34] ; 0x22 + 1f2cf0c: e5c39021 strb r9, [r3, #33] ; 0x21 + 1f2cf10: e5c39020 strb r9, [r3, #32] + 1f2cf14: e5c38023 strb r8, [r3, #35] ; 0x23 + 1f2cf18: 0afffc39 beq 1f2c004 + 1f2cf1c: e3570009 cmp r7, #9 + 1f2cf20: e5d29009 ldrb r9, [r2, #9] + 1f2cf24: e5c39026 strb r9, [r3, #38] ; 0x26 + 1f2cf28: e5c39025 strb r9, [r3, #37] ; 0x25 + 1f2cf2c: e5c39024 strb r9, [r3, #36] ; 0x24 + 1f2cf30: e5c38027 strb r8, [r3, #39] ; 0x27 + 1f2cf34: 0afffc32 beq 1f2c004 + 1f2cf38: e357000a cmp r7, #10 + 1f2cf3c: e5d2900a ldrb r9, [r2, #10] + 1f2cf40: e5c3902a strb r9, [r3, #42] ; 0x2a + 1f2cf44: e5c39029 strb r9, [r3, #41] ; 0x29 + 1f2cf48: e5c39028 strb r9, [r3, #40] ; 0x28 + 1f2cf4c: e5c3802b strb r8, [r3, #43] ; 0x2b + 1f2cf50: 0afffc2b beq 1f2c004 + 1f2cf54: e357000b cmp r7, #11 + 1f2cf58: e5d2900b ldrb r9, [r2, #11] + 1f2cf5c: e5c3902e strb r9, [r3, #46] ; 0x2e + 1f2cf60: e5c3902d strb r9, [r3, #45] ; 0x2d + 1f2cf64: e5c3902c strb r9, [r3, #44] ; 0x2c + 1f2cf68: e5c3802f strb r8, [r3, #47] ; 0x2f + 1f2cf6c: 0afffc24 beq 1f2c004 + 1f2cf70: e357000c cmp r7, #12 + 1f2cf74: e5d2900c ldrb r9, [r2, #12] + 1f2cf78: e5c39032 strb r9, [r3, #50] ; 0x32 + 1f2cf7c: e5c39031 strb r9, [r3, #49] ; 0x31 + 1f2cf80: e5c39030 strb r9, [r3, #48] ; 0x30 + 1f2cf84: e5c38033 strb r8, [r3, #51] ; 0x33 + 1f2cf88: 0afffc1d beq 1f2c004 + 1f2cf8c: e357000d cmp r7, #13 + 1f2cf90: e5d2700d ldrb r7, [r2, #13] + 1f2cf94: e5c37036 strb r7, [r3, #54] ; 0x36 + 1f2cf98: e5c37035 strb r7, [r3, #53] ; 0x35 + 1f2cf9c: e5c37034 strb r7, [r3, #52] ; 0x34 + 1f2cfa0: e5c38037 strb r8, [r3, #55] ; 0x37 + 1f2cfa4: 0afffc16 beq 1f2c004 + 1f2cfa8: e5d2200e ldrb r2, [r2, #14] + 1f2cfac: e5c3203a strb r2, [r3, #58] ; 0x3a + 1f2cfb0: e5c32039 strb r2, [r3, #57] ; 0x39 + 1f2cfb4: e5c32038 strb r2, [r3, #56] ; 0x38 + 1f2cfb8: e5c3803b strb r8, [r3, #59] ; 0x3b + 1f2cfbc: eafffc10 b 1f2c004 + 1f2cfc0: e59d7008 ldr r7, [sp, #8] + 1f2cfc4: e2818002 add r8, r1, #2 + 1f2cfc8: e2803003 add r3, r0, #3 + 1f2cfcc: e2477001 sub r7, r7, #1 + 1f2cfd0: e5582002 ldrb r2, [r8, #-2] + 1f2cfd4: e3770001 cmn r7, #1 + 1f2cfd8: e5432001 strb r2, [r3, #-1] + 1f2cfdc: e5432002 strb r2, [r3, #-2] + 1f2cfe0: e2888002 add r8, r8, #2 + 1f2cfe4: e5432003 strb r2, [r3, #-3] + 1f2cfe8: e2833003 add r3, r3, #3 + 1f2cfec: 1afffff6 bne 1f2cfcc + 1f2cff0: eafffc03 b 1f2c004 + 1f2cff4: e59d7008 ldr r7, [sp, #8] + 1f2cff8: e2803004 add r3, r0, #4 + 1f2cffc: e2418001 sub r8, r1, #1 + 1f2d000: e3e09000 mvn r9, #0 + 1f2d004: e2477001 sub r7, r7, #1 + 1f2d008: e5f82001 ldrb r2, [r8, #1]! + 1f2d00c: e3770001 cmn r7, #1 + 1f2d010: e5432002 strb r2, [r3, #-2] + 1f2d014: e5432003 strb r2, [r3, #-3] + 1f2d018: e2833004 add r3, r3, #4 + 1f2d01c: e5432008 strb r2, [r3, #-8] + 1f2d020: e5439005 strb r9, [r3, #-5] + 1f2d024: 1afffff6 bne 1f2d004 + 1f2d028: eafffbf5 b 1f2c004 + 1f2d02c: e59da008 ldr sl, [sp, #8] + 1f2d030: e2819003 add r9, r1, #3 + 1f2d034: e5592002 ldrb r2, [r9, #-2] + 1f2d038: e24aa001 sub sl, sl, #1 + 1f2d03c: e5598003 ldrb r8, [r9, #-3] + 1f2d040: e37a0001 cmn sl, #1 + 1f2d044: e5597001 ldrb r7, [r9, #-1] + 1f2d048: e2899003 add r9, r9, #3 + 1f2d04c: e1620e82 smulbb r2, r2, lr + 1f2d050: e1022885 smlabb r2, r5, r8, r2 + 1f2d054: e1022784 smlabb r2, r4, r7, r2 + 1f2d058: e1a02442 asr r2, r2, #8 + 1f2d05c: e4c32001 strb r2, [r3], #1 + 1f2d060: 1afffff3 bne 1f2d034 + 1f2d064: eafffbe6 b 1f2c004 + 1f2d068: e59d2008 ldr r2, [sp, #8] + 1f2d06c: e2803002 add r3, r0, #2 + 1f2d070: e2417001 sub r7, r1, #1 + 1f2d074: e3e09000 mvn r9, #0 + 1f2d078: e2422001 sub r2, r2, #1 + 1f2d07c: e5f78001 ldrb r8, [r7, #1]! + 1f2d080: e3720001 cmn r2, #1 + 1f2d084: e5438002 strb r8, [r3, #-2] + 1f2d088: e5439001 strb r9, [r3, #-1] + 1f2d08c: e2833002 add r3, r3, #2 + 1f2d090: 1afffff8 bne 1f2d078 + 1f2d094: eafffbda b 1f2c004 + 1f2d098: e59da008 ldr sl, [sp, #8] + 1f2d09c: e2818004 add r8, r1, #4 + 1f2d0a0: e2809002 add r9, r0, #2 + 1f2d0a4: e5583003 ldrb r3, [r8, #-3] + 1f2d0a8: e24aa001 sub sl, sl, #1 + 1f2d0ac: e5587004 ldrb r7, [r8, #-4] + 1f2d0b0: e37a0001 cmn sl, #1 + 1f2d0b4: e5582002 ldrb r2, [r8, #-2] + 1f2d0b8: e2899002 add r9, r9, #2 + 1f2d0bc: e1630e83 smulbb r3, r3, lr + 1f2d0c0: e1033785 smlabb r3, r5, r7, r3 + 1f2d0c4: e2888004 add r8, r8, #4 + 1f2d0c8: e1033284 smlabb r3, r4, r2, r3 + 1f2d0cc: e1a03443 asr r3, r3, #8 + 1f2d0d0: e5493004 strb r3, [r9, #-4] + 1f2d0d4: e5583005 ldrb r3, [r8, #-5] + 1f2d0d8: e5493003 strb r3, [r9, #-3] + 1f2d0dc: 1afffff0 bne 1f2d0a4 + 1f2d0e0: eafffbc7 b 1f2c004 + 1f2d0e4: e59d7008 ldr r7, [sp, #8] + 1f2d0e8: e2812003 add r2, r1, #3 + 1f2d0ec: e2803004 add r3, r0, #4 + 1f2d0f0: e3e09000 mvn r9, #0 + 1f2d0f4: e5528003 ldrb r8, [r2, #-3] + 1f2d0f8: e2477001 sub r7, r7, #1 + 1f2d0fc: e5438004 strb r8, [r3, #-4] + 1f2d100: e3770001 cmn r7, #1 + 1f2d104: e2822003 add r2, r2, #3 + 1f2d108: e2833004 add r3, r3, #4 + 1f2d10c: e5528005 ldrb r8, [r2, #-5] + 1f2d110: e5438007 strb r8, [r3, #-7] + 1f2d114: e5528004 ldrb r8, [r2, #-4] + 1f2d118: e5438006 strb r8, [r3, #-6] + 1f2d11c: e5439005 strb r9, [r3, #-5] + 1f2d120: 1afffff3 bne 1f2d0f4 + 1f2d124: eafffbb6 b 1f2c004 + 1f2d128: e59da008 ldr sl, [sp, #8] + 1f2d12c: e2819004 add r9, r1, #4 + 1f2d130: e5592003 ldrb r2, [r9, #-3] + 1f2d134: e24aa001 sub sl, sl, #1 + 1f2d138: e5598004 ldrb r8, [r9, #-4] + 1f2d13c: e37a0001 cmn sl, #1 + 1f2d140: e5597002 ldrb r7, [r9, #-2] + 1f2d144: e2899004 add r9, r9, #4 + 1f2d148: e1620e82 smulbb r2, r2, lr + 1f2d14c: e1022885 smlabb r2, r5, r8, r2 + 1f2d150: e1022784 smlabb r2, r4, r7, r2 + 1f2d154: e1a02442 asr r2, r2, #8 + 1f2d158: e4c32001 strb r2, [r3], #1 + 1f2d15c: 1afffff3 bne 1f2d130 + 1f2d160: eafffba7 b 1f2c004 + 1f2d164: e59d7008 ldr r7, [sp, #8] + 1f2d168: e2812004 add r2, r1, #4 + 1f2d16c: e2803003 add r3, r0, #3 + 1f2d170: e5528004 ldrb r8, [r2, #-4] + 1f2d174: e2477001 sub r7, r7, #1 + 1f2d178: e5438003 strb r8, [r3, #-3] + 1f2d17c: e3770001 cmn r7, #1 + 1f2d180: e2822004 add r2, r2, #4 + 1f2d184: e2833003 add r3, r3, #3 + 1f2d188: e5528007 ldrb r8, [r2, #-7] + 1f2d18c: e5438005 strb r8, [r3, #-5] + 1f2d190: e5528006 ldrb r8, [r2, #-6] + 1f2d194: e5438004 strb r8, [r3, #-4] + 1f2d198: 1afffff4 bne 1f2d170 + 1f2d19c: eafffb98 b 1f2c004 + 1f2d1a0: e59d8008 ldr r8, [sp, #8] + 1f2d1a4: e2812002 add r2, r1, #2 + 1f2d1a8: e2803004 add r3, r0, #4 + 1f2d1ac: e5527002 ldrb r7, [r2, #-2] + 1f2d1b0: e2488001 sub r8, r8, #1 + 1f2d1b4: e5437002 strb r7, [r3, #-2] + 1f2d1b8: e3780001 cmn r8, #1 + 1f2d1bc: e5437003 strb r7, [r3, #-3] + 1f2d1c0: e2822002 add r2, r2, #2 + 1f2d1c4: e5437004 strb r7, [r3, #-4] + 1f2d1c8: e2833004 add r3, r3, #4 + 1f2d1cc: e5527003 ldrb r7, [r2, #-3] + 1f2d1d0: e5437005 strb r7, [r3, #-5] + 1f2d1d4: 1afffff4 bne 1f2d1ac + 1f2d1d8: eafffb89 b 1f2c004 + 1f2d1dc: e59da008 ldr sl, [sp, #8] + 1f2d1e0: e2818003 add r8, r1, #3 + 1f2d1e4: e2809002 add r9, r0, #2 + 1f2d1e8: e3e0b000 mvn fp, #0 + 1f2d1ec: e5583002 ldrb r3, [r8, #-2] + 1f2d1f0: e24aa001 sub sl, sl, #1 + 1f2d1f4: e5587003 ldrb r7, [r8, #-3] + 1f2d1f8: e37a0001 cmn sl, #1 + 1f2d1fc: e5582001 ldrb r2, [r8, #-1] + 1f2d200: e2899002 add r9, r9, #2 + 1f2d204: e1630e83 smulbb r3, r3, lr + 1f2d208: e1033785 smlabb r3, r5, r7, r3 + 1f2d20c: e549b003 strb fp, [r9, #-3] + 1f2d210: e2888003 add r8, r8, #3 + 1f2d214: e1033284 smlabb r3, r4, r2, r3 + 1f2d218: e1a03443 asr r3, r3, #8 + 1f2d21c: e5493004 strb r3, [r9, #-4] + 1f2d220: 1afffff1 bne 1f2d1ec + 1f2d224: eafffb76 b 1f2c004 + 1f2d228: e59d2008 ldr r2, [sp, #8] + 1f2d22c: e2817002 add r7, r1, #2 + 1f2d230: e2422001 sub r2, r2, #1 + 1f2d234: e5578002 ldrb r8, [r7, #-2] + 1f2d238: e3720001 cmn r2, #1 + 1f2d23c: e4c38001 strb r8, [r3], #1 + 1f2d240: e2877002 add r7, r7, #2 + 1f2d244: 1afffff9 bne 1f2d230 + 1f2d248: eafffb6d b 1f2c004 + 1f2d24c: e59d7008 ldr r7, [sp, #8] + 1f2d250: e2803003 add r3, r0, #3 + 1f2d254: e2418001 sub r8, r1, #1 + 1f2d258: e2477001 sub r7, r7, #1 + 1f2d25c: e5f82001 ldrb r2, [r8, #1]! + 1f2d260: e3770001 cmn r7, #1 + 1f2d264: e5432001 strb r2, [r3, #-1] + 1f2d268: e5432002 strb r2, [r3, #-2] + 1f2d26c: e2833003 add r3, r3, #3 + 1f2d270: e5432006 strb r2, [r3, #-6] + 1f2d274: 1afffff7 bne 1f2d258 + 1f2d278: eafffb61 b 1f2c004 + +01f2d27c : + 1f2d27c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f2d280: e1a07003 mov r7, r3 + 1f2d284: e1a0c000 mov ip, r0 + 1f2d288: ed2d8b08 vpush {d8-d11} + 1f2d28c: e24dd0fc sub sp, sp, #252 ; 0xfc + 1f2d290: e58d2018 str r2, [sp, #24] + 1f2d294: e59d214c ldr r2, [sp, #332] ; 0x14c + 1f2d298: e59d3144 ldr r3, [sp, #324] ; 0x144 + 1f2d29c: e3520010 cmp r2, #16 + 1f2d2a0: e59d2148 ldr r2, [sp, #328] ; 0x148 + 1f2d2a4: 03a05002 moveq r5, #2 + 1f2d2a8: 13a05001 movne r5, #1 + 1f2d2ac: e1933002 orrs r3, r3, r2 + 1f2d2b0: e59d3144 ldr r3, [sp, #324] ; 0x144 + 1f2d2b4: e58d1040 str r1, [sp, #64] ; 0x40 + 1f2d2b8: e1a06005 mov r6, r5 + 1f2d2bc: e58d3048 str r3, [sp, #72] ; 0x48 + 1f2d2c0: 5a00000b bpl 1f2d2f4 + 1f2d2c4: e59d2040 ldr r2, [sp, #64] ; 0x40 + 1f2d2c8: e3a03000 mov r3, #0 + 1f2d2cc: e5823000 str r3, [r2] + 1f2d2d0: e30a336c movw r3, #41836 ; 0xa36c + 1f2d2d4: e340320d movt r3, #525 ; 0x20d + 1f2d2d8: e3a00000 mov r0, #0 + 1f2d2dc: e3002f90 movw r2, #3984 ; 0xf90 + 1f2d2e0: e34021f6 movt r2, #502 ; 0x1f6 + 1f2d2e4: e5832000 str r2, [r3] + 1f2d2e8: e28dd0fc add sp, sp, #252 ; 0xfc + 1f2d2ec: ecbd8b08 vpop {d8-d11} + 1f2d2f0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f2d2f4: e3520000 cmp r2, #0 + 1f2d2f8: 1a00005f bne 1f2d47c + 1f2d2fc: e59d1144 ldr r1, [sp, #324] ; 0x144 + 1f2d300: e59d3140 ldr r3, [sp, #320] ; 0x140 + 1f2d304: e59d2148 ldr r2, [sp, #328] ; 0x148 + 1f2d308: e0030396 mul r3, r6, r3 + 1f2d30c: e0020192 mul r2, r2, r1 + 1f2d310: e58d2064 str r2, [sp, #100] ; 0x64 + 1f2d314: e1a01002 mov r1, r2 + 1f2d318: e2532000 subs r2, r3, #0 + 1f2d31c: e58d3020 str r3, [sp, #32] + 1f2d320: baffffe7 blt 1f2d2c4 + 1f2d324: 1a000d55 bne 1f30880 + 1f2d328: e59d3064 ldr r3, [sp, #100] ; 0x64 + 1f2d32c: e59d2020 ldr r2, [sp, #32] + 1f2d330: e0000293 mul r0, r3, r2 + 1f2d334: e59c3008 ldr r3, [ip, #8] + 1f2d338: e58d303c str r3, [sp, #60] ; 0x3c + 1f2d33c: eb004489 bl 1f3e568 + 1f2d340: e59d3040 ldr r3, [sp, #64] ; 0x40 + 1f2d344: e3500000 cmp r0, #0 + 1f2d348: e1a04000 mov r4, r0 + 1f2d34c: e5830000 str r0, [r3] + 1f2d350: 0affffde beq 1f2d2d0 + 1f2d354: e59d2144 ldr r2, [sp, #324] ; 0x144 + 1f2d358: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f2d35c: e0030293 mul r3, r3, r2 + 1f2d360: e59d214c ldr r2, [sp, #332] ; 0x14c + 1f2d364: e58d3060 str r3, [sp, #96] ; 0x60 + 1f2d368: e0030293 mul r3, r3, r2 + 1f2d36c: e59d2148 ldr r2, [sp, #328] ; 0x148 + 1f2d370: e2833007 add r3, r3, #7 + 1f2d374: e1a031a3 lsr r3, r3, #3 + 1f2d378: e58d3054 str r3, [sp, #84] ; 0x54 + 1f2d37c: e0232293 mla r3, r3, r2, r2 + 1f2d380: e1530007 cmp r3, r7 + 1f2d384: 8a000c8f bhi 1f305c8 + 1f2d388: e3520000 cmp r2, #0 + 1f2d38c: 0a000d37 beq 1f30870 + 1f2d390: e59d3018 ldr r3, [sp, #24] + 1f2d394: e2833001 add r3, r3, #1 + 1f2d398: e553b001 ldrb fp, [r3, #-1] + 1f2d39c: e58d3008 str r3, [sp, #8] + 1f2d3a0: e35b0004 cmp fp, #4 + 1f2d3a4: ca00043b bgt 1f2e498 + 1f2d3a8: e59d2140 ldr r2, [sp, #320] ; 0x140 + 1f2d3ac: e3a01000 mov r1, #0 + 1f2d3b0: e59d3144 ldr r3, [sp, #324] ; 0x144 + 1f2d3b4: e3010348 movw r0, #4936 ; 0x1348 + 1f2d3b8: e34001f6 movt r0, #502 ; 0x1f6 + 1f2d3bc: e58d0068 str r0, [sp, #104] ; 0x68 + 1f2d3c0: e58d1028 str r1, [sp, #40] ; 0x28 + 1f2d3c4: e0030293 mul r3, r3, r2 + 1f2d3c8: e58d305c str r3, [sp, #92] ; 0x5c + 1f2d3cc: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f2d3d0: e0030395 mul r3, r5, r3 + 1f2d3d4: e58d3024 str r3, [sp, #36] ; 0x24 + 1f2d3d8: e58d101c str r1, [sp, #28] + 1f2d3dc: e59d314c ldr r3, [sp, #332] ; 0x14c + 1f2d3e0: e59d1140 ldr r1, [sp, #320] ; 0x140 + 1f2d3e4: e00a0692 mul sl, r2, r6 + 1f2d3e8: e1510002 cmp r1, r2 + 1f2d3ec: 13530007 cmpne r3, #7 + 1f2d3f0: d3a03001 movle r3, #1 + 1f2d3f4: c3a03000 movgt r3, #0 + 1f2d3f8: e58d304c str r3, [sp, #76] ; 0x4c + 1f2d3fc: e59d3144 ldr r3, [sp, #324] ; 0x144 + 1f2d400: e2433001 sub r3, r3, #1 + 1f2d404: e58d3050 str r3, [sp, #80] ; 0x50 + 1f2d408: e59d314c ldr r3, [sp, #332] ; 0x14c + 1f2d40c: e3530007 cmp r3, #7 + 1f2d410: e59d301c ldr r3, [sp, #28] + 1f2d414: ca0005c2 bgt 1f2eb24 + 1f2d418: e59d2054 ldr r2, [sp, #84] ; 0x54 + 1f2d41c: e3530000 cmp r3, #0 + 1f2d420: e59d105c ldr r1, [sp, #92] ; 0x5c + 1f2d424: e3a0a001 mov sl, #1 + 1f2d428: e58d2048 str r2, [sp, #72] ; 0x48 + 1f2d42c: e0623001 rsb r3, r2, r1 + 1f2d430: e0844003 add r4, r4, r3 + 1f2d434: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f2d438: e0633004 rsb r3, r3, r4 + 1f2d43c: e58d3004 str r3, [sp, #4] + 1f2d440: 0a001002 beq 1f31450 + 1f2d444: e59d2008 ldr r2, [sp, #8] + 1f2d448: e1a03004 mov r3, r4 + 1f2d44c: e59d1004 ldr r1, [sp, #4] + 1f2d450: e3a05000 mov r5, #0 + 1f2d454: e35b0006 cmp fp, #6 + 1f2d458: 979ff10b ldrls pc, [pc, fp, lsl #2] + 1f2d45c: ea00000e b 1f2d49c + 1f2d460: 01f2d494 .word 0x01f2d494 + 1f2d464: 01f2d494 .word 0x01f2d494 + 1f2d468: 01f2d538 .word 0x01f2d538 + 1f2d46c: 01f2d524 .word 0x01f2d524 + 1f2d470: 01f2d54c .word 0x01f2d54c + 1f2d474: 01f2d494 .word 0x01f2d494 + 1f2d478: 01f2d494 .word 0x01f2d494 + 1f2d47c: e3e03102 mvn r3, #-2147483648 ; 0x80000000 + 1f2d480: e713f213 sdiv r3, r3, r2 + 1f2d484: e59d2144 ldr r2, [sp, #324] ; 0x144 + 1f2d488: e1520003 cmp r2, r3 + 1f2d48c: daffff9a ble 1f2d2fc + 1f2d490: eaffff8b b 1f2d2c4 + 1f2d494: e5d20000 ldrb r0, [r2] + 1f2d498: e5c30000 strb r0, [r3] + 1f2d49c: e2855001 add r5, r5, #1 + 1f2d4a0: e2822001 add r2, r2, #1 + 1f2d4a4: e155000a cmp r5, sl + 1f2d4a8: e2833001 add r3, r3, #1 + 1f2d4ac: e2811001 add r1, r1, #1 + 1f2d4b0: baffffe7 blt 1f2d454 + 1f2d4b4: e59d314c ldr r3, [sp, #332] ; 0x14c + 1f2d4b8: e3530008 cmp r3, #8 + 1f2d4bc: 0a0005a2 beq 1f2eb4c + 1f2d4c0: e3530010 cmp r3, #16 + 1f2d4c4: 0a000bf9 beq 1f304b0 + 1f2d4c8: e59d3018 ldr r3, [sp, #24] + 1f2d4cc: e2849001 add r9, r4, #1 + 1f2d4d0: e2833002 add r3, r3, #2 + 1f2d4d4: e58d3018 str r3, [sp, #24] + 1f2d4d8: e59d3004 ldr r3, [sp, #4] + 1f2d4dc: e2838001 add r8, r3, #1 + 1f2d4e0: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f2d4e4: e3530000 cmp r3, #0 + 1f2d4e8: 0a0005a8 beq 1f2eb90 + 1f2d4ec: e59d3048 ldr r3, [sp, #72] ; 0x48 + 1f2d4f0: e2433001 sub r3, r3, #1 + 1f2d4f4: e003039a mul r3, sl, r3 + 1f2d4f8: e58d3004 str r3, [sp, #4] + 1f2d4fc: e35b0006 cmp fp, #6 + 1f2d500: 979ff10b ldrls pc, [pc, fp, lsl #2] + 1f2d504: ea0003cc b 1f2e43c + 1f2d508: 01f2e42c .word 0x01f2e42c + 1f2d50c: 01f2dfac .word 0x01f2dfac + 1f2d510: 01f2e4bc .word 0x01f2e4bc + 1f2d514: 01f2d9b0 .word 0x01f2d9b0 + 1f2d518: 01f2d648 .word 0x01f2d648 + 1f2d51c: 01f2d790 .word 0x01f2d790 + 1f2d520: 01f2d71c .word 0x01f2d71c + 1f2d524: e5d1c000 ldrb ip, [r1] + 1f2d528: e5d20000 ldrb r0, [r2] + 1f2d52c: e08000ac add r0, r0, ip, lsr #1 + 1f2d530: e5c30000 strb r0, [r3] + 1f2d534: eaffffd8 b 1f2d49c + 1f2d538: e5d20000 ldrb r0, [r2] + 1f2d53c: e5d1c000 ldrb ip, [r1] + 1f2d540: e080000c add r0, r0, ip + 1f2d544: e5c30000 strb r0, [r3] + 1f2d548: eaffffd3 b 1f2d49c + 1f2d54c: e59d3008 ldr r3, [sp, #8] + 1f2d550: e58d4010 str r4, [sp, #16] + 1f2d554: e0831005 add r1, r3, r5 + 1f2d558: e59d3004 ldr r3, [sp, #4] + 1f2d55c: e58db014 str fp, [sp, #20] + 1f2d560: e0832005 add r2, r3, r5 + 1f2d564: e0843005 add r3, r4, r5 + 1f2d568: e1a09002 mov r9, r2 + 1f2d56c: e1a04001 mov r4, r1 + 1f2d570: e58da00c str sl, [sp, #12] + 1f2d574: e1a0b003 mov fp, r3 + 1f2d578: e4d96001 ldrb r6, [r9], #1 + 1f2d57c: e2855001 add r5, r5, #1 + 1f2d580: e4d48001 ldrb r8, [r4], #1 + 1f2d584: e1a00006 mov r0, r6 + 1f2d588: eb0043b6 bl 1f3e468 + 1f2d58c: e1a07000 mov r7, r0 + 1f2d590: e3a00000 mov r0, #0 + 1f2d594: eb0043b3 bl 1f3e468 + 1f2d598: e1a0a000 mov sl, r0 + 1f2d59c: e1a00006 mov r0, r6 + 1f2d5a0: eb0043b0 bl 1f3e468 + 1f2d5a4: e157000a cmp r7, sl + 1f2d5a8: d1570000 cmple r7, r0 + 1f2d5ac: d3a07001 movle r7, #1 + 1f2d5b0: c3a07000 movgt r7, #0 + 1f2d5b4: e15a0000 cmp sl, r0 + 1f2d5b8: e59d300c ldr r3, [sp, #12] + 1f2d5bc: c3a02000 movgt r2, #0 + 1f2d5c0: d3a02001 movle r2, #1 + 1f2d5c4: e1520007 cmp r2, r7 + 1f2d5c8: 93a06000 movls r6, #0 + 1f2d5cc: e1550003 cmp r5, r3 + 1f2d5d0: e0886006 add r6, r8, r6 + 1f2d5d4: e4cb6001 strb r6, [fp], #1 + 1f2d5d8: baffffe6 blt 1f2d578 + 1f2d5dc: e1a0a003 mov sl, r3 + 1f2d5e0: e59d314c ldr r3, [sp, #332] ; 0x14c + 1f2d5e4: e59d4010 ldr r4, [sp, #16] + 1f2d5e8: e3530008 cmp r3, #8 + 1f2d5ec: e59db014 ldr fp, [sp, #20] + 1f2d5f0: 1affffb2 bne 1f2d4c0 + 1f2d5f4: e59d2140 ldr r2, [sp, #320] ; 0x140 + 1f2d5f8: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f2d5fc: e1520003 cmp r2, r3 + 1f2d600: 0a000556 beq 1f2eb60 + 1f2d604: e59d204c ldr r2, [sp, #76] ; 0x4c + 1f2d608: e3520000 cmp r2, #0 + 1f2d60c: e3e02000 mvn r2, #0 + 1f2d610: e7c42003 strb r2, [r4, r3] + 1f2d614: e59d2008 ldr r2, [sp, #8] + 1f2d618: e0823003 add r3, r2, r3 + 1f2d61c: e58d3018 str r3, [sp, #24] + 1f2d620: e59d3140 ldr r3, [sp, #320] ; 0x140 + 1f2d624: e59d2140 ldr r2, [sp, #320] ; 0x140 + 1f2d628: e0849003 add r9, r4, r3 + 1f2d62c: e59d3004 ldr r3, [sp, #4] + 1f2d630: e0838002 add r8, r3, r2 + 1f2d634: 0a000555 beq 1f2eb90 + 1f2d638: e59d3048 ldr r3, [sp, #72] ; 0x48 + 1f2d63c: e2433001 sub r3, r3, #1 + 1f2d640: e003039a mul r3, sl, r3 + 1f2d644: e58d3004 str r3, [sp, #4] + 1f2d648: e59d3004 ldr r3, [sp, #4] + 1f2d64c: e3530000 cmp r3, #0 + 1f2d650: da000379 ble 1f2e43c + 1f2d654: e26a3000 rsb r3, sl, #0 + 1f2d658: e1a02009 mov r2, r9 + 1f2d65c: e0891003 add r1, r9, r3 + 1f2d660: e0883003 add r3, r8, r3 + 1f2d664: e58d3008 str r3, [sp, #8] + 1f2d668: e2485001 sub r5, r8, #1 + 1f2d66c: e59d3004 ldr r3, [sp, #4] + 1f2d670: e1a0b002 mov fp, r2 + 1f2d674: e58da030 str sl, [sp, #48] ; 0x30 + 1f2d678: e1a02005 mov r2, r5 + 1f2d67c: e0893003 add r3, r9, r3 + 1f2d680: e58d302c str r3, [sp, #44] ; 0x2c + 1f2d684: e59d3018 ldr r3, [sp, #24] + 1f2d688: e2439001 sub r9, r3, #1 + 1f2d68c: e1a03009 mov r3, r9 + 1f2d690: e5f28001 ldrb r8, [r2, #1]! + 1f2d694: e58d2010 str r2, [sp, #16] + 1f2d698: e59d2008 ldr r2, [sp, #8] + 1f2d69c: e4d16001 ldrb r6, [r1], #1 + 1f2d6a0: e5f37001 ldrb r7, [r3, #1]! + 1f2d6a4: e4d2a001 ldrb sl, [r2], #1 + 1f2d6a8: e0864008 add r4, r6, r8 + 1f2d6ac: e58d1014 str r1, [sp, #20] + 1f2d6b0: e06a4004 rsb r4, sl, r4 + 1f2d6b4: e58d2008 str r2, [sp, #8] + 1f2d6b8: e0660004 rsb r0, r6, r4 + 1f2d6bc: e58d300c str r3, [sp, #12] + 1f2d6c0: eb004368 bl 1f3e468 + 1f2d6c4: e1a05000 mov r5, r0 + 1f2d6c8: e0680004 rsb r0, r8, r4 + 1f2d6cc: eb004365 bl 1f3e468 + 1f2d6d0: e1a09000 mov r9, r0 + 1f2d6d4: e06a0004 rsb r0, sl, r4 + 1f2d6d8: eb004362 bl 1f3e468 + 1f2d6dc: e1550009 cmp r5, r9 + 1f2d6e0: d1550000 cmple r5, r0 + 1f2d6e4: e59d300c ldr r3, [sp, #12] + 1f2d6e8: e59d2010 ldr r2, [sp, #16] + 1f2d6ec: e59d1014 ldr r1, [sp, #20] + 1f2d6f0: da000002 ble 1f2d700 + 1f2d6f4: e1590000 cmp r9, r0 + 1f2d6f8: c1a0600a movgt r6, sl + 1f2d6fc: d1a06008 movle r6, r8 + 1f2d700: e0876006 add r6, r7, r6 + 1f2d704: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f2d708: e4cb6001 strb r6, [fp], #1 + 1f2d70c: e150000b cmp r0, fp + 1f2d710: 1affffde bne 1f2d690 + 1f2d714: e59da030 ldr sl, [sp, #48] ; 0x30 + 1f2d718: ea000347 b 1f2e43c + 1f2d71c: e59d3004 ldr r3, [sp, #4] + 1f2d720: e3530000 cmp r3, #0 + 1f2d724: da000344 ble 1f2e43c + 1f2d728: e59d2018 ldr r2, [sp, #24] + 1f2d72c: e0893003 add r3, r9, r3 + 1f2d730: e1a06009 mov r6, r9 + 1f2d734: e06a8009 rsb r8, sl, r9 + 1f2d738: e58da008 str sl, [sp, #8] + 1f2d73c: e2429001 sub r9, r2, #1 + 1f2d740: e1a0b003 mov fp, r3 + 1f2d744: e4d84001 ldrb r4, [r8], #1 + 1f2d748: e3a00000 mov r0, #0 + 1f2d74c: e5f95001 ldrb r5, [r9, #1]! + 1f2d750: eb004344 bl 1f3e468 + 1f2d754: e1a07000 mov r7, r0 + 1f2d758: e1a00004 mov r0, r4 + 1f2d75c: eb004341 bl 1f3e468 + 1f2d760: e1a0a000 mov sl, r0 + 1f2d764: e1a00004 mov r0, r4 + 1f2d768: eb00433e bl 1f3e468 + 1f2d76c: e157000a cmp r7, sl + 1f2d770: d1570000 cmple r7, r0 + 1f2d774: c3a04000 movgt r4, #0 + 1f2d778: e0854004 add r4, r5, r4 + 1f2d77c: e4c64001 strb r4, [r6], #1 + 1f2d780: e15b0006 cmp fp, r6 + 1f2d784: 1affffee bne 1f2d744 + 1f2d788: e59da008 ldr sl, [sp, #8] + 1f2d78c: ea00032a b 1f2e43c + 1f2d790: e59d3004 ldr r3, [sp, #4] + 1f2d794: e3530000 cmp r3, #0 + 1f2d798: da000327 ble 1f2e43c + 1f2d79c: e2891010 add r1, r9, #16 + 1f2d7a0: e59de018 ldr lr, [sp, #24] + 1f2d7a4: e06a0009 rsb r0, sl, r9 + 1f2d7a8: e26a2010 rsb r2, sl, #16 + 1f2d7ac: e1510000 cmp r1, r0 + 1f2d7b0: e28e3010 add r3, lr, #16 + 1f2d7b4: 83a0c000 movhi ip, #0 + 1f2d7b8: 93a0c001 movls ip, #1 + 1f2d7bc: e3520000 cmp r2, #0 + 1f2d7c0: c1a0200c movgt r2, ip + 1f2d7c4: d38c2001 orrle r2, ip, #1 + 1f2d7c8: e15e0001 cmp lr, r1 + 1f2d7cc: 31590003 cmpcc r9, r3 + 1f2d7d0: 23a03001 movcs r3, #1 + 1f2d7d4: 33a03000 movcc r3, #0 + 1f2d7d8: e0033002 and r3, r3, r2 + 1f2d7dc: e59d2004 ldr r2, [sp, #4] + 1f2d7e0: e3520012 cmp r2, #18 + 1f2d7e4: 93a03000 movls r3, #0 + 1f2d7e8: 82033001 andhi r3, r3, #1 + 1f2d7ec: e3530000 cmp r3, #0 + 1f2d7f0: 0a000e4b beq 1f31124 + 1f2d7f4: e20e3007 and r3, lr, #7 + 1f2d7f8: e2633000 rsb r3, r3, #0 + 1f2d7fc: e203300f and r3, r3, #15 + 1f2d800: e1530002 cmp r3, r2 + 1f2d804: 21a03002 movcs r3, r2 + 1f2d808: e3530000 cmp r3, #0 + 1f2d80c: 0a00042c beq 1f2e8c4 + 1f2d810: e5d01000 ldrb r1, [r0] + 1f2d814: e3530001 cmp r3, #1 + 1f2d818: e5de2000 ldrb r2, [lr] + 1f2d81c: e08220a1 add r2, r2, r1, lsr #1 + 1f2d820: e5c92000 strb r2, [r9] + 1f2d824: 0a000426 beq 1f2e8c4 + 1f2d828: e26a1001 rsb r1, sl, #1 + 1f2d82c: e5de2001 ldrb r2, [lr, #1] + 1f2d830: e3530002 cmp r3, #2 + 1f2d834: e7d91001 ldrb r1, [r9, r1] + 1f2d838: e08220a1 add r2, r2, r1, lsr #1 + 1f2d83c: e5c92001 strb r2, [r9, #1] + 1f2d840: 0a00041f beq 1f2e8c4 + 1f2d844: e26a1002 rsb r1, sl, #2 + 1f2d848: e5de2002 ldrb r2, [lr, #2] + 1f2d84c: e3530003 cmp r3, #3 + 1f2d850: e7d91001 ldrb r1, [r9, r1] + 1f2d854: e08220a1 add r2, r2, r1, lsr #1 + 1f2d858: e5c92002 strb r2, [r9, #2] + 1f2d85c: 0a000418 beq 1f2e8c4 + 1f2d860: e26a1003 rsb r1, sl, #3 + 1f2d864: e5de2003 ldrb r2, [lr, #3] + 1f2d868: e3530004 cmp r3, #4 + 1f2d86c: e7d91001 ldrb r1, [r9, r1] + 1f2d870: e08220a1 add r2, r2, r1, lsr #1 + 1f2d874: e5c92003 strb r2, [r9, #3] + 1f2d878: 0a000411 beq 1f2e8c4 + 1f2d87c: e26a1004 rsb r1, sl, #4 + 1f2d880: e5de2004 ldrb r2, [lr, #4] + 1f2d884: e3530005 cmp r3, #5 + 1f2d888: e7d91001 ldrb r1, [r9, r1] + 1f2d88c: e08220a1 add r2, r2, r1, lsr #1 + 1f2d890: e5c92004 strb r2, [r9, #4] + 1f2d894: 0a00040a beq 1f2e8c4 + 1f2d898: e26a1005 rsb r1, sl, #5 + 1f2d89c: e5de2005 ldrb r2, [lr, #5] + 1f2d8a0: e3530006 cmp r3, #6 + 1f2d8a4: e7d91001 ldrb r1, [r9, r1] + 1f2d8a8: e08220a1 add r2, r2, r1, lsr #1 + 1f2d8ac: e5c92005 strb r2, [r9, #5] + 1f2d8b0: 0a000403 beq 1f2e8c4 + 1f2d8b4: e26a1006 rsb r1, sl, #6 + 1f2d8b8: e5de2006 ldrb r2, [lr, #6] + 1f2d8bc: e3530007 cmp r3, #7 + 1f2d8c0: e7d91001 ldrb r1, [r9, r1] + 1f2d8c4: e08220a1 add r2, r2, r1, lsr #1 + 1f2d8c8: e5c92006 strb r2, [r9, #6] + 1f2d8cc: 0a000edd beq 1f31448 + 1f2d8d0: e26a1007 rsb r1, sl, #7 + 1f2d8d4: e5de2007 ldrb r2, [lr, #7] + 1f2d8d8: e3530008 cmp r3, #8 + 1f2d8dc: e7d91001 ldrb r1, [r9, r1] + 1f2d8e0: e08220a1 add r2, r2, r1, lsr #1 + 1f2d8e4: e5c92007 strb r2, [r9, #7] + 1f2d8e8: 0a0003f5 beq 1f2e8c4 + 1f2d8ec: e26a1008 rsb r1, sl, #8 + 1f2d8f0: e5de2008 ldrb r2, [lr, #8] + 1f2d8f4: e3530009 cmp r3, #9 + 1f2d8f8: e7d91001 ldrb r1, [r9, r1] + 1f2d8fc: e08220a1 add r2, r2, r1, lsr #1 + 1f2d900: e5c92008 strb r2, [r9, #8] + 1f2d904: 0a0003ee beq 1f2e8c4 + 1f2d908: e26a1009 rsb r1, sl, #9 + 1f2d90c: e5de2009 ldrb r2, [lr, #9] + 1f2d910: e353000a cmp r3, #10 + 1f2d914: e7d91001 ldrb r1, [r9, r1] + 1f2d918: e08220a1 add r2, r2, r1, lsr #1 + 1f2d91c: e5c92009 strb r2, [r9, #9] + 1f2d920: 0a0003e7 beq 1f2e8c4 + 1f2d924: e26a100a rsb r1, sl, #10 + 1f2d928: e5de200a ldrb r2, [lr, #10] + 1f2d92c: e353000b cmp r3, #11 + 1f2d930: e7d91001 ldrb r1, [r9, r1] + 1f2d934: e08220a1 add r2, r2, r1, lsr #1 + 1f2d938: e5c9200a strb r2, [r9, #10] + 1f2d93c: 0a0003e0 beq 1f2e8c4 + 1f2d940: e26a100b rsb r1, sl, #11 + 1f2d944: e5de200b ldrb r2, [lr, #11] + 1f2d948: e353000c cmp r3, #12 + 1f2d94c: e7d91001 ldrb r1, [r9, r1] + 1f2d950: e08220a1 add r2, r2, r1, lsr #1 + 1f2d954: e5c9200b strb r2, [r9, #11] + 1f2d958: 0a0003d9 beq 1f2e8c4 + 1f2d95c: e26a100c rsb r1, sl, #12 + 1f2d960: e5de200c ldrb r2, [lr, #12] + 1f2d964: e353000d cmp r3, #13 + 1f2d968: e7d91001 ldrb r1, [r9, r1] + 1f2d96c: e08220a1 add r2, r2, r1, lsr #1 + 1f2d970: e5c9200c strb r2, [r9, #12] + 1f2d974: 0a0003d2 beq 1f2e8c4 + 1f2d978: e26a100d rsb r1, sl, #13 + 1f2d97c: e5de200d ldrb r2, [lr, #13] + 1f2d980: e353000e cmp r3, #14 + 1f2d984: e7d91001 ldrb r1, [r9, r1] + 1f2d988: e08220a1 add r2, r2, r1, lsr #1 + 1f2d98c: e5c9200d strb r2, [r9, #13] + 1f2d990: 0a0003cb beq 1f2e8c4 + 1f2d994: e26a000e rsb r0, sl, #14 + 1f2d998: e5de100e ldrb r1, [lr, #14] + 1f2d99c: e3a0200f mov r2, #15 + 1f2d9a0: e7d90000 ldrb r0, [r9, r0] + 1f2d9a4: e08110a0 add r1, r1, r0, lsr #1 + 1f2d9a8: e5c9100e strb r1, [r9, #14] + 1f2d9ac: ea0003c5 b 1f2e8c8 + 1f2d9b0: e59d3004 ldr r3, [sp, #4] + 1f2d9b4: e3530000 cmp r3, #0 + 1f2d9b8: da00029f ble 1f2e43c + 1f2d9bc: e2892010 add r2, r9, #16 + 1f2d9c0: e06ac009 rsb ip, sl, r9 + 1f2d9c4: e152000c cmp r2, ip + 1f2d9c8: e2883010 add r3, r8, #16 + 1f2d9cc: e59de018 ldr lr, [sp, #24] + 1f2d9d0: 83a00000 movhi r0, #0 + 1f2d9d4: 93a00001 movls r0, #1 + 1f2d9d8: e26a1010 rsb r1, sl, #16 + 1f2d9dc: e3510000 cmp r1, #0 + 1f2d9e0: c1a01000 movgt r1, r0 + 1f2d9e4: d3801001 orrle r1, r0, #1 + 1f2d9e8: e1580002 cmp r8, r2 + 1f2d9ec: 31590003 cmpcc r9, r3 + 1f2d9f0: e28e0010 add r0, lr, #16 + 1f2d9f4: 23a03001 movcs r3, #1 + 1f2d9f8: 33a03000 movcc r3, #0 + 1f2d9fc: e15e0002 cmp lr, r2 + 1f2da00: 31590000 cmpcc r9, r0 + 1f2da04: e0033001 and r3, r3, r1 + 1f2da08: e1a0100e mov r1, lr + 1f2da0c: e59de004 ldr lr, [sp, #4] + 1f2da10: 23a00001 movcs r0, #1 + 1f2da14: 33a00000 movcc r0, #0 + 1f2da18: e35e0011 cmp lr, #17 + 1f2da1c: 93a03000 movls r3, #0 + 1f2da20: 82033001 andhi r3, r3, #1 + 1f2da24: e1130000 tst r3, r0 + 1f2da28: 0a000dc8 beq 1f31150 + 1f2da2c: e2013007 and r3, r1, #7 + 1f2da30: e1a02001 mov r2, r1 + 1f2da34: e2633000 rsb r3, r3, #0 + 1f2da38: e203300f and r3, r3, #15 + 1f2da3c: e153000e cmp r3, lr + 1f2da40: 21a0300e movcs r3, lr + 1f2da44: e3530000 cmp r3, #0 + 1f2da48: 0a000ba7 beq 1f308ec + 1f2da4c: e5dc0000 ldrb r0, [ip] + 1f2da50: e1a0e002 mov lr, r2 + 1f2da54: e5d81000 ldrb r1, [r8] + 1f2da58: e3530001 cmp r3, #1 + 1f2da5c: e5d22000 ldrb r2, [r2] + 1f2da60: e0811000 add r1, r1, r0 + 1f2da64: e08220c1 add r2, r2, r1, asr #1 + 1f2da68: e5c92000 strb r2, [r9] + 1f2da6c: 0a000d7c beq 1f31064 + 1f2da70: e26a1001 rsb r1, sl, #1 + 1f2da74: e5d80001 ldrb r0, [r8, #1] + 1f2da78: e5de2001 ldrb r2, [lr, #1] + 1f2da7c: e3530002 cmp r3, #2 + 1f2da80: e7d91001 ldrb r1, [r9, r1] + 1f2da84: e0811000 add r1, r1, r0 + 1f2da88: e08220c1 add r2, r2, r1, asr #1 + 1f2da8c: e5c92001 strb r2, [r9, #1] + 1f2da90: 0a000d73 beq 1f31064 + 1f2da94: e26a1002 rsb r1, sl, #2 + 1f2da98: e5d80002 ldrb r0, [r8, #2] + 1f2da9c: e5de2002 ldrb r2, [lr, #2] + 1f2daa0: e3530003 cmp r3, #3 + 1f2daa4: e7d91001 ldrb r1, [r9, r1] + 1f2daa8: e0811000 add r1, r1, r0 + 1f2daac: e08220c1 add r2, r2, r1, asr #1 + 1f2dab0: e5c92002 strb r2, [r9, #2] + 1f2dab4: 0a000d6a beq 1f31064 + 1f2dab8: e26a1003 rsb r1, sl, #3 + 1f2dabc: e5d80003 ldrb r0, [r8, #3] + 1f2dac0: e5de2003 ldrb r2, [lr, #3] + 1f2dac4: e3530004 cmp r3, #4 + 1f2dac8: e7d91001 ldrb r1, [r9, r1] + 1f2dacc: e0811000 add r1, r1, r0 + 1f2dad0: e08220c1 add r2, r2, r1, asr #1 + 1f2dad4: e5c92003 strb r2, [r9, #3] + 1f2dad8: 0a000d61 beq 1f31064 + 1f2dadc: e26a1004 rsb r1, sl, #4 + 1f2dae0: e5d80004 ldrb r0, [r8, #4] + 1f2dae4: e5de2004 ldrb r2, [lr, #4] + 1f2dae8: e3530005 cmp r3, #5 + 1f2daec: e7d91001 ldrb r1, [r9, r1] + 1f2daf0: e0811000 add r1, r1, r0 + 1f2daf4: e08220c1 add r2, r2, r1, asr #1 + 1f2daf8: e5c92004 strb r2, [r9, #4] + 1f2dafc: 0a000d58 beq 1f31064 + 1f2db00: e26a1005 rsb r1, sl, #5 + 1f2db04: e5d80005 ldrb r0, [r8, #5] + 1f2db08: e5de2005 ldrb r2, [lr, #5] + 1f2db0c: e3530006 cmp r3, #6 + 1f2db10: e7d91001 ldrb r1, [r9, r1] + 1f2db14: e0811000 add r1, r1, r0 + 1f2db18: e08220c1 add r2, r2, r1, asr #1 + 1f2db1c: e5c92005 strb r2, [r9, #5] + 1f2db20: 0a000d4f beq 1f31064 + 1f2db24: e26a1006 rsb r1, sl, #6 + 1f2db28: e5d80006 ldrb r0, [r8, #6] + 1f2db2c: e5de2006 ldrb r2, [lr, #6] + 1f2db30: e3530007 cmp r3, #7 + 1f2db34: e7d91001 ldrb r1, [r9, r1] + 1f2db38: e0811000 add r1, r1, r0 + 1f2db3c: e08220c1 add r2, r2, r1, asr #1 + 1f2db40: e5c92006 strb r2, [r9, #6] + 1f2db44: 0a000e3c beq 1f3143c + 1f2db48: e26a1007 rsb r1, sl, #7 + 1f2db4c: e5d80007 ldrb r0, [r8, #7] + 1f2db50: e5de2007 ldrb r2, [lr, #7] + 1f2db54: e3530008 cmp r3, #8 + 1f2db58: e7d91001 ldrb r1, [r9, r1] + 1f2db5c: e0811000 add r1, r1, r0 + 1f2db60: e08220c1 add r2, r2, r1, asr #1 + 1f2db64: e5c92007 strb r2, [r9, #7] + 1f2db68: 0a000d3d beq 1f31064 + 1f2db6c: e26a1008 rsb r1, sl, #8 + 1f2db70: e5d80008 ldrb r0, [r8, #8] + 1f2db74: e5de2008 ldrb r2, [lr, #8] + 1f2db78: e3530009 cmp r3, #9 + 1f2db7c: e7d91001 ldrb r1, [r9, r1] + 1f2db80: e0811000 add r1, r1, r0 + 1f2db84: e08220c1 add r2, r2, r1, asr #1 + 1f2db88: e5c92008 strb r2, [r9, #8] + 1f2db8c: 0a000d34 beq 1f31064 + 1f2db90: e26a1009 rsb r1, sl, #9 + 1f2db94: e5d80009 ldrb r0, [r8, #9] + 1f2db98: e5de2009 ldrb r2, [lr, #9] + 1f2db9c: e353000a cmp r3, #10 + 1f2dba0: e7d91001 ldrb r1, [r9, r1] + 1f2dba4: e0811000 add r1, r1, r0 + 1f2dba8: e08220c1 add r2, r2, r1, asr #1 + 1f2dbac: e5c92009 strb r2, [r9, #9] + 1f2dbb0: 0a000d2b beq 1f31064 + 1f2dbb4: e26a100a rsb r1, sl, #10 + 1f2dbb8: e5d8000a ldrb r0, [r8, #10] + 1f2dbbc: e5de200a ldrb r2, [lr, #10] + 1f2dbc0: e353000b cmp r3, #11 + 1f2dbc4: e7d91001 ldrb r1, [r9, r1] + 1f2dbc8: e0811000 add r1, r1, r0 + 1f2dbcc: e08220c1 add r2, r2, r1, asr #1 + 1f2dbd0: e5c9200a strb r2, [r9, #10] + 1f2dbd4: 0a000d22 beq 1f31064 + 1f2dbd8: e26a100b rsb r1, sl, #11 + 1f2dbdc: e5d8000b ldrb r0, [r8, #11] + 1f2dbe0: e5de200b ldrb r2, [lr, #11] + 1f2dbe4: e353000c cmp r3, #12 + 1f2dbe8: e7d91001 ldrb r1, [r9, r1] + 1f2dbec: e0811000 add r1, r1, r0 + 1f2dbf0: e08220c1 add r2, r2, r1, asr #1 + 1f2dbf4: e5c9200b strb r2, [r9, #11] + 1f2dbf8: 0a000d19 beq 1f31064 + 1f2dbfc: e26a100c rsb r1, sl, #12 + 1f2dc00: e5d8000c ldrb r0, [r8, #12] + 1f2dc04: e5de200c ldrb r2, [lr, #12] + 1f2dc08: e353000d cmp r3, #13 + 1f2dc0c: e7d91001 ldrb r1, [r9, r1] + 1f2dc10: e0811000 add r1, r1, r0 + 1f2dc14: e08220c1 add r2, r2, r1, asr #1 + 1f2dc18: e5c9200c strb r2, [r9, #12] + 1f2dc1c: 0a000d10 beq 1f31064 + 1f2dc20: e26a100d rsb r1, sl, #13 + 1f2dc24: e5d8000d ldrb r0, [r8, #13] + 1f2dc28: e5de200d ldrb r2, [lr, #13] + 1f2dc2c: e353000e cmp r3, #14 + 1f2dc30: e7d91001 ldrb r1, [r9, r1] + 1f2dc34: e0811000 add r1, r1, r0 + 1f2dc38: e08220c1 add r2, r2, r1, asr #1 + 1f2dc3c: e5c9200d strb r2, [r9, #13] + 1f2dc40: 0a000d07 beq 1f31064 + 1f2dc44: e26a000e rsb r0, sl, #14 + 1f2dc48: e5d8c00e ldrb ip, [r8, #14] + 1f2dc4c: e5de100e ldrb r1, [lr, #14] + 1f2dc50: e3a0200f mov r2, #15 + 1f2dc54: e7d90000 ldrb r0, [r9, r0] + 1f2dc58: e080000c add r0, r0, ip + 1f2dc5c: e08100c0 add r0, r1, r0, asr #1 + 1f2dc60: e59d1004 ldr r1, [sp, #4] + 1f2dc64: e5c9000e strb r0, [r9, #14] + 1f2dc68: e063c001 rsb ip, r3, r1 + 1f2dc6c: e2411001 sub r1, r1, #1 + 1f2dc70: e24c0010 sub r0, ip, #16 + 1f2dc74: e0631001 rsb r1, r3, r1 + 1f2dc78: e351000e cmp r1, #14 + 1f2dc7c: e1a00220 lsr r0, r0, #4 + 1f2dc80: e2800001 add r0, r0, #1 + 1f2dc84: e1a0e200 lsl lr, r0, #4 + 1f2dc88: 9a000030 bls 1f2dd50 + 1f2dc8c: e59d4018 ldr r4, [sp, #24] + 1f2dc90: e06a1003 rsb r1, sl, r3 + 1f2dc94: e0885003 add r5, r8, r3 + 1f2dc98: e0891001 add r1, r9, r1 + 1f2dc9c: e0844003 add r4, r4, r3 + 1f2dca0: e3a06000 mov r6, #0 + 1f2dca4: e0893003 add r3, r9, r3 + 1f2dca8: f4652a0f vld1.8 {d18-d19}, [r5] + 1f2dcac: e2866001 add r6, r6, #1 + 1f2dcb0: f4610a0f vld1.8 {d16-d17}, [r1] + 1f2dcb4: e1560000 cmp r6, r0 + 1f2dcb8: e2855010 add r5, r5, #16 + 1f2dcbc: e2811010 add r1, r1, #16 + 1f2dcc0: e2844010 add r4, r4, #16 + 1f2dcc4: f3c86a32 vmovl.u8 q11, d18 + 1f2dcc8: f3c84a30 vmovl.u8 q10, d16 + 1f2dccc: f3c82a33 vmovl.u8 q9, d19 + 1f2dcd0: f3c80a31 vmovl.u8 q8, d17 + 1f2dcd4: f3d0ca36 vmovl.u16 q14, d22 + 1f2dcd8: f3d08a34 vmovl.u16 q12, d20 + 1f2dcdc: f3d06a37 vmovl.u16 q11, d23 + 1f2dce0: f3d0aa32 vmovl.u16 q13, d18 + 1f2dce4: f3d04a35 vmovl.u16 q10, d21 + 1f2dce8: f3d02a33 vmovl.u16 q9, d19 + 1f2dcec: f26cc8e8 vadd.i32 q14, q14, q12 + 1f2dcf0: f3d08a30 vmovl.u16 q12, d16 + 1f2dcf4: f3d00a31 vmovl.u16 q8, d17 + 1f2dcf8: f26648e4 vadd.i32 q10, q11, q10 + 1f2dcfc: f2ffc07c vshr.s32 q14, q14, #1 + 1f2dd00: f26a68e8 vadd.i32 q11, q13, q12 + 1f2dd04: ed548b04 vldr d24, [r4, #-16] + 1f2dd08: ed549b02 vldr d25, [r4, #-8] + 1f2dd0c: f26208e0 vadd.i32 q8, q9, q8 + 1f2dd10: f2ff2074 vshr.s32 q9, q10, #1 + 1f2dd14: f2ff4076 vshr.s32 q10, q11, #1 + 1f2dd18: f2ff0070 vshr.s32 q8, q8, #1 + 1f2dd1c: f3f6622c vmovn.i32 d22, q14 + 1f2dd20: f3f67222 vmovn.i32 d23, q9 + 1f2dd24: f3f62224 vmovn.i32 d18, q10 + 1f2dd28: f3f63220 vmovn.i32 d19, q8 + 1f2dd2c: f3f20226 vmovn.i16 d16, q11 + 1f2dd30: f3f21222 vmovn.i16 d17, q9 + 1f2dd34: f24008e8 vadd.i8 q8, q8, q12 + 1f2dd38: f4430a0f vst1.8 {d16-d17}, [r3] + 1f2dd3c: e2833010 add r3, r3, #16 + 1f2dd40: 3affffd8 bcc 1f2dca8 + 1f2dd44: e15c000e cmp ip, lr + 1f2dd48: e082200e add r2, r2, lr + 1f2dd4c: 0a0001ba beq 1f2e43c + 1f2dd50: e06a1002 rsb r1, sl, r2 + 1f2dd54: e59d4018 ldr r4, [sp, #24] + 1f2dd58: e7d80002 ldrb r0, [r8, r2] + 1f2dd5c: e2823001 add r3, r2, #1 + 1f2dd60: e59de004 ldr lr, [sp, #4] + 1f2dd64: e7d91001 ldrb r1, [r9, r1] + 1f2dd68: e15e0003 cmp lr, r3 + 1f2dd6c: e1a0c00e mov ip, lr + 1f2dd70: e0810000 add r0, r1, r0 + 1f2dd74: e7d41002 ldrb r1, [r4, r2] + 1f2dd78: e08110c0 add r1, r1, r0, asr #1 + 1f2dd7c: e7c91002 strb r1, [r9, r2] + 1f2dd80: da0001ad ble 1f2e43c + 1f2dd84: e06a0003 rsb r0, sl, r3 + 1f2dd88: e7d8c003 ldrb ip, [r8, r3] + 1f2dd8c: e2821002 add r1, r2, #2 + 1f2dd90: e15e0001 cmp lr, r1 + 1f2dd94: e7d90000 ldrb r0, [r9, r0] + 1f2dd98: e080c00c add ip, r0, ip + 1f2dd9c: e7d40003 ldrb r0, [r4, r3] + 1f2dda0: e08000cc add r0, r0, ip, asr #1 + 1f2dda4: e7c90003 strb r0, [r9, r3] + 1f2dda8: da0001a3 ble 1f2e43c + 1f2ddac: e06a0001 rsb r0, sl, r1 + 1f2ddb0: e7d8c001 ldrb ip, [r8, r1] + 1f2ddb4: e2823003 add r3, r2, #3 + 1f2ddb8: e15e0003 cmp lr, r3 + 1f2ddbc: e7d90000 ldrb r0, [r9, r0] + 1f2ddc0: e080c00c add ip, r0, ip + 1f2ddc4: e7d40001 ldrb r0, [r4, r1] + 1f2ddc8: e08000cc add r0, r0, ip, asr #1 + 1f2ddcc: e7c90001 strb r0, [r9, r1] + 1f2ddd0: da000199 ble 1f2e43c + 1f2ddd4: e06a0003 rsb r0, sl, r3 + 1f2ddd8: e7d8c003 ldrb ip, [r8, r3] + 1f2dddc: e2821004 add r1, r2, #4 + 1f2dde0: e15e0001 cmp lr, r1 + 1f2dde4: e7d90000 ldrb r0, [r9, r0] + 1f2dde8: e080c00c add ip, r0, ip + 1f2ddec: e7d40003 ldrb r0, [r4, r3] + 1f2ddf0: e08000cc add r0, r0, ip, asr #1 + 1f2ddf4: e7c90003 strb r0, [r9, r3] + 1f2ddf8: da00018f ble 1f2e43c + 1f2ddfc: e06a0001 rsb r0, sl, r1 + 1f2de00: e7d8c001 ldrb ip, [r8, r1] + 1f2de04: e2823005 add r3, r2, #5 + 1f2de08: e15e0003 cmp lr, r3 + 1f2de0c: e7d90000 ldrb r0, [r9, r0] + 1f2de10: e080c00c add ip, r0, ip + 1f2de14: e7d40001 ldrb r0, [r4, r1] + 1f2de18: e08000cc add r0, r0, ip, asr #1 + 1f2de1c: e7c90001 strb r0, [r9, r1] + 1f2de20: da000185 ble 1f2e43c + 1f2de24: e06a0003 rsb r0, sl, r3 + 1f2de28: e7d8c003 ldrb ip, [r8, r3] + 1f2de2c: e2821006 add r1, r2, #6 + 1f2de30: e15e0001 cmp lr, r1 + 1f2de34: e7d90000 ldrb r0, [r9, r0] + 1f2de38: e080c00c add ip, r0, ip + 1f2de3c: e7d40003 ldrb r0, [r4, r3] + 1f2de40: e08000cc add r0, r0, ip, asr #1 + 1f2de44: e7c90003 strb r0, [r9, r3] + 1f2de48: da00017b ble 1f2e43c + 1f2de4c: e06a0001 rsb r0, sl, r1 + 1f2de50: e7d8c001 ldrb ip, [r8, r1] + 1f2de54: e2823007 add r3, r2, #7 + 1f2de58: e15e0003 cmp lr, r3 + 1f2de5c: e7d90000 ldrb r0, [r9, r0] + 1f2de60: e080c00c add ip, r0, ip + 1f2de64: e7d40001 ldrb r0, [r4, r1] + 1f2de68: e08000cc add r0, r0, ip, asr #1 + 1f2de6c: e7c90001 strb r0, [r9, r1] + 1f2de70: da000171 ble 1f2e43c + 1f2de74: e06a0003 rsb r0, sl, r3 + 1f2de78: e7d8c003 ldrb ip, [r8, r3] + 1f2de7c: e2821008 add r1, r2, #8 + 1f2de80: e15e0001 cmp lr, r1 + 1f2de84: e7d90000 ldrb r0, [r9, r0] + 1f2de88: e080c00c add ip, r0, ip + 1f2de8c: e7d40003 ldrb r0, [r4, r3] + 1f2de90: e08000cc add r0, r0, ip, asr #1 + 1f2de94: e7c90003 strb r0, [r9, r3] + 1f2de98: da000167 ble 1f2e43c + 1f2de9c: e06a0001 rsb r0, sl, r1 + 1f2dea0: e7d8c001 ldrb ip, [r8, r1] + 1f2dea4: e2823009 add r3, r2, #9 + 1f2dea8: e15e0003 cmp lr, r3 + 1f2deac: e7d90000 ldrb r0, [r9, r0] + 1f2deb0: e080c00c add ip, r0, ip + 1f2deb4: e7d40001 ldrb r0, [r4, r1] + 1f2deb8: e08000cc add r0, r0, ip, asr #1 + 1f2debc: e7c90001 strb r0, [r9, r1] + 1f2dec0: da00015d ble 1f2e43c + 1f2dec4: e06a0003 rsb r0, sl, r3 + 1f2dec8: e7d8c003 ldrb ip, [r8, r3] + 1f2decc: e282100a add r1, r2, #10 + 1f2ded0: e15e0001 cmp lr, r1 + 1f2ded4: e7d90000 ldrb r0, [r9, r0] + 1f2ded8: e080c00c add ip, r0, ip + 1f2dedc: e7d40003 ldrb r0, [r4, r3] + 1f2dee0: e08000cc add r0, r0, ip, asr #1 + 1f2dee4: e7c90003 strb r0, [r9, r3] + 1f2dee8: da000153 ble 1f2e43c + 1f2deec: e06a0001 rsb r0, sl, r1 + 1f2def0: e7d8c001 ldrb ip, [r8, r1] + 1f2def4: e282300b add r3, r2, #11 + 1f2def8: e15e0003 cmp lr, r3 + 1f2defc: e7d90000 ldrb r0, [r9, r0] + 1f2df00: e080c00c add ip, r0, ip + 1f2df04: e7d40001 ldrb r0, [r4, r1] + 1f2df08: e08000cc add r0, r0, ip, asr #1 + 1f2df0c: e7c90001 strb r0, [r9, r1] + 1f2df10: da000149 ble 1f2e43c + 1f2df14: e06a0003 rsb r0, sl, r3 + 1f2df18: e7d8c003 ldrb ip, [r8, r3] + 1f2df1c: e282100c add r1, r2, #12 + 1f2df20: e15e0001 cmp lr, r1 + 1f2df24: e7d90000 ldrb r0, [r9, r0] + 1f2df28: e080c00c add ip, r0, ip + 1f2df2c: e7d40003 ldrb r0, [r4, r3] + 1f2df30: e08000cc add r0, r0, ip, asr #1 + 1f2df34: e7c90003 strb r0, [r9, r3] + 1f2df38: da00013f ble 1f2e43c + 1f2df3c: e06a0001 rsb r0, sl, r1 + 1f2df40: e7d8c001 ldrb ip, [r8, r1] + 1f2df44: e282300d add r3, r2, #13 + 1f2df48: e15e0003 cmp lr, r3 + 1f2df4c: e7d90000 ldrb r0, [r9, r0] + 1f2df50: e080c00c add ip, r0, ip + 1f2df54: e7d40001 ldrb r0, [r4, r1] + 1f2df58: e08000cc add r0, r0, ip, asr #1 + 1f2df5c: e7c90001 strb r0, [r9, r1] + 1f2df60: da000135 ble 1f2e43c + 1f2df64: e06a0003 rsb r0, sl, r3 + 1f2df68: e7d81003 ldrb r1, [r8, r3] + 1f2df6c: e282200e add r2, r2, #14 + 1f2df70: e7d4c003 ldrb ip, [r4, r3] + 1f2df74: e15e0002 cmp lr, r2 + 1f2df78: e7d90000 ldrb r0, [r9, r0] + 1f2df7c: e0801001 add r1, r0, r1 + 1f2df80: e08c10c1 add r1, ip, r1, asr #1 + 1f2df84: e7c91003 strb r1, [r9, r3] + 1f2df88: da00012b ble 1f2e43c + 1f2df8c: e06a0002 rsb r0, sl, r2 + 1f2df90: e7d81002 ldrb r1, [r8, r2] + 1f2df94: e7d43002 ldrb r3, [r4, r2] + 1f2df98: e7d90000 ldrb r0, [r9, r0] + 1f2df9c: e0801001 add r1, r0, r1 + 1f2dfa0: e08330c1 add r3, r3, r1, asr #1 + 1f2dfa4: e7c93002 strb r3, [r9, r2] + 1f2dfa8: ea000123 b 1f2e43c + 1f2dfac: e59d3004 ldr r3, [sp, #4] + 1f2dfb0: e3530000 cmp r3, #0 + 1f2dfb4: da000120 ble 1f2e43c + 1f2dfb8: e2890010 add r0, r9, #16 + 1f2dfbc: e59de018 ldr lr, [sp, #24] + 1f2dfc0: e06a2009 rsb r2, sl, r9 + 1f2dfc4: e26a3010 rsb r3, sl, #16 + 1f2dfc8: e1520000 cmp r2, r0 + 1f2dfcc: e28e1010 add r1, lr, #16 + 1f2dfd0: 33a0c000 movcc ip, #0 + 1f2dfd4: 23a0c001 movcs ip, #1 + 1f2dfd8: e3530000 cmp r3, #0 + 1f2dfdc: c1a0300c movgt r3, ip + 1f2dfe0: d38c3001 orrle r3, ip, #1 + 1f2dfe4: e15e0000 cmp lr, r0 + 1f2dfe8: 31590001 cmpcc r9, r1 + 1f2dfec: 23a00001 movcs r0, #1 + 1f2dff0: 33a00000 movcc r0, #0 + 1f2dff4: e0033000 and r3, r3, r0 + 1f2dff8: e59d0004 ldr r0, [sp, #4] + 1f2dffc: e3500013 cmp r0, #19 + 1f2e000: 93a03000 movls r3, #0 + 1f2e004: 82033001 andhi r3, r3, #1 + 1f2e008: e3530000 cmp r3, #0 + 1f2e00c: 0a000c5d beq 1f31188 + 1f2e010: e20e3007 and r3, lr, #7 + 1f2e014: e2633000 rsb r3, r3, #0 + 1f2e018: e203300f and r3, r3, #15 + 1f2e01c: e1530000 cmp r3, r0 + 1f2e020: 21a03000 movcs r3, r0 + 1f2e024: e3530000 cmp r3, #0 + 1f2e028: 0a000a2c beq 1f308e0 + 1f2e02c: e5d21000 ldrb r1, [r2] + 1f2e030: e3530001 cmp r3, #1 + 1f2e034: e5de2000 ldrb r2, [lr] + 1f2e038: e0822001 add r2, r2, r1 + 1f2e03c: e5c92000 strb r2, [r9] + 1f2e040: 0a000a26 beq 1f308e0 + 1f2e044: e26a1001 rsb r1, sl, #1 + 1f2e048: e5de0001 ldrb r0, [lr, #1] + 1f2e04c: e3530002 cmp r3, #2 + 1f2e050: e7d92001 ldrb r2, [r9, r1] + 1f2e054: e0822000 add r2, r2, r0 + 1f2e058: e5c92001 strb r2, [r9, #1] + 1f2e05c: 0a000c0d beq 1f31098 + 1f2e060: e26a1002 rsb r1, sl, #2 + 1f2e064: e5de0002 ldrb r0, [lr, #2] + 1f2e068: e3530003 cmp r3, #3 + 1f2e06c: e7d92001 ldrb r2, [r9, r1] + 1f2e070: e0822000 add r2, r2, r0 + 1f2e074: e5c92002 strb r2, [r9, #2] + 1f2e078: 0a000c06 beq 1f31098 + 1f2e07c: e26a1003 rsb r1, sl, #3 + 1f2e080: e5de0003 ldrb r0, [lr, #3] + 1f2e084: e3530004 cmp r3, #4 + 1f2e088: e7d92001 ldrb r2, [r9, r1] + 1f2e08c: e0822000 add r2, r2, r0 + 1f2e090: e5c92003 strb r2, [r9, #3] + 1f2e094: 0a000bff beq 1f31098 + 1f2e098: e26a1004 rsb r1, sl, #4 + 1f2e09c: e5de0004 ldrb r0, [lr, #4] + 1f2e0a0: e3530005 cmp r3, #5 + 1f2e0a4: e7d92001 ldrb r2, [r9, r1] + 1f2e0a8: e0822000 add r2, r2, r0 + 1f2e0ac: e5c92004 strb r2, [r9, #4] + 1f2e0b0: 0a000bf8 beq 1f31098 + 1f2e0b4: e26a1005 rsb r1, sl, #5 + 1f2e0b8: e5de0005 ldrb r0, [lr, #5] + 1f2e0bc: e3530006 cmp r3, #6 + 1f2e0c0: e7d92001 ldrb r2, [r9, r1] + 1f2e0c4: e0822000 add r2, r2, r0 + 1f2e0c8: e5c92005 strb r2, [r9, #5] + 1f2e0cc: 0a000bf1 beq 1f31098 + 1f2e0d0: e26a1006 rsb r1, sl, #6 + 1f2e0d4: e5de0006 ldrb r0, [lr, #6] + 1f2e0d8: e3530007 cmp r3, #7 + 1f2e0dc: e7d92001 ldrb r2, [r9, r1] + 1f2e0e0: e0822000 add r2, r2, r0 + 1f2e0e4: e5c92006 strb r2, [r9, #6] + 1f2e0e8: 0a000ccd beq 1f31424 + 1f2e0ec: e26a1007 rsb r1, sl, #7 + 1f2e0f0: e5de0007 ldrb r0, [lr, #7] + 1f2e0f4: e3530008 cmp r3, #8 + 1f2e0f8: e7d92001 ldrb r2, [r9, r1] + 1f2e0fc: e0822000 add r2, r2, r0 + 1f2e100: e5c92007 strb r2, [r9, #7] + 1f2e104: 0a000be3 beq 1f31098 + 1f2e108: e26a1008 rsb r1, sl, #8 + 1f2e10c: e5de0008 ldrb r0, [lr, #8] + 1f2e110: e3530009 cmp r3, #9 + 1f2e114: e7d92001 ldrb r2, [r9, r1] + 1f2e118: e0822000 add r2, r2, r0 + 1f2e11c: e5c92008 strb r2, [r9, #8] + 1f2e120: 0a000bdc beq 1f31098 + 1f2e124: e26a1009 rsb r1, sl, #9 + 1f2e128: e5de0009 ldrb r0, [lr, #9] + 1f2e12c: e353000a cmp r3, #10 + 1f2e130: e7d92001 ldrb r2, [r9, r1] + 1f2e134: e0822000 add r2, r2, r0 + 1f2e138: e5c92009 strb r2, [r9, #9] + 1f2e13c: 0a000bd5 beq 1f31098 + 1f2e140: e26a100a rsb r1, sl, #10 + 1f2e144: e5de000a ldrb r0, [lr, #10] + 1f2e148: e353000b cmp r3, #11 + 1f2e14c: e7d92001 ldrb r2, [r9, r1] + 1f2e150: e0822000 add r2, r2, r0 + 1f2e154: e5c9200a strb r2, [r9, #10] + 1f2e158: 0a000bce beq 1f31098 + 1f2e15c: e26a100b rsb r1, sl, #11 + 1f2e160: e5de000b ldrb r0, [lr, #11] + 1f2e164: e353000c cmp r3, #12 + 1f2e168: e7d92001 ldrb r2, [r9, r1] + 1f2e16c: e0822000 add r2, r2, r0 + 1f2e170: e5c9200b strb r2, [r9, #11] + 1f2e174: 0a000bc7 beq 1f31098 + 1f2e178: e26a100c rsb r1, sl, #12 + 1f2e17c: e5de000c ldrb r0, [lr, #12] + 1f2e180: e353000d cmp r3, #13 + 1f2e184: e7d92001 ldrb r2, [r9, r1] + 1f2e188: e0822000 add r2, r2, r0 + 1f2e18c: e5c9200c strb r2, [r9, #12] + 1f2e190: 0a000bc0 beq 1f31098 + 1f2e194: e26a100d rsb r1, sl, #13 + 1f2e198: e5de000d ldrb r0, [lr, #13] + 1f2e19c: e353000e cmp r3, #14 + 1f2e1a0: e7d92001 ldrb r2, [r9, r1] + 1f2e1a4: e0822000 add r2, r2, r0 + 1f2e1a8: e5c9200d strb r2, [r9, #13] + 1f2e1ac: 0a000bb9 beq 1f31098 + 1f2e1b0: e26a100e rsb r1, sl, #14 + 1f2e1b4: e5de000e ldrb r0, [lr, #14] + 1f2e1b8: e3a0200f mov r2, #15 + 1f2e1bc: e7d91001 ldrb r1, [r9, r1] + 1f2e1c0: e0811000 add r1, r1, r0 + 1f2e1c4: e5c9100e strb r1, [r9, #14] + 1f2e1c8: e59d1004 ldr r1, [sp, #4] + 1f2e1cc: e063c001 rsb ip, r3, r1 + 1f2e1d0: e2411001 sub r1, r1, #1 + 1f2e1d4: e24c0010 sub r0, ip, #16 + 1f2e1d8: e0631001 rsb r1, r3, r1 + 1f2e1dc: e351000e cmp r1, #14 + 1f2e1e0: e1a01220 lsr r1, r0, #4 + 1f2e1e4: e2811001 add r1, r1, #1 + 1f2e1e8: e1a0e201 lsl lr, r1, #4 + 1f2e1ec: 9a000012 bls 1f2e23c + 1f2e1f0: e59d4018 ldr r4, [sp, #24] + 1f2e1f4: e06a0003 rsb r0, sl, r3 + 1f2e1f8: e0890000 add r0, r9, r0 + 1f2e1fc: e0845003 add r5, r4, r3 + 1f2e200: e0893003 add r3, r9, r3 + 1f2e204: e3a04000 mov r4, #0 + 1f2e208: f4602a0f vld1.8 {d18-d19}, [r0] + 1f2e20c: e2844001 add r4, r4, #1 + 1f2e210: f4650adf vld1.64 {d16-d17}, [r5 :64] + 1f2e214: e1510004 cmp r1, r4 + 1f2e218: e2800010 add r0, r0, #16 + 1f2e21c: e2855010 add r5, r5, #16 + 1f2e220: f24208e0 vadd.i8 q8, q9, q8 + 1f2e224: f4430a0f vst1.8 {d16-d17}, [r3] + 1f2e228: e2833010 add r3, r3, #16 + 1f2e22c: 8afffff5 bhi 1f2e208 + 1f2e230: e15c000e cmp ip, lr + 1f2e234: e082200e add r2, r2, lr + 1f2e238: 0a00007f beq 1f2e43c + 1f2e23c: e06a1002 rsb r1, sl, r2 + 1f2e240: e59dc018 ldr ip, [sp, #24] + 1f2e244: e59d4004 ldr r4, [sp, #4] + 1f2e248: e2823001 add r3, r2, #1 + 1f2e24c: e7dc0002 ldrb r0, [ip, r2] + 1f2e250: e1540003 cmp r4, r3 + 1f2e254: e7d91001 ldrb r1, [r9, r1] + 1f2e258: e1a0e004 mov lr, r4 + 1f2e25c: e0811000 add r1, r1, r0 + 1f2e260: e7c91002 strb r1, [r9, r2] + 1f2e264: da000074 ble 1f2e43c + 1f2e268: e06a0003 rsb r0, sl, r3 + 1f2e26c: e2821002 add r1, r2, #2 + 1f2e270: e1a0e00c mov lr, ip + 1f2e274: e1540001 cmp r4, r1 + 1f2e278: e7dcc003 ldrb ip, [ip, r3] + 1f2e27c: e7d90000 ldrb r0, [r9, r0] + 1f2e280: e080000c add r0, r0, ip + 1f2e284: e7c90003 strb r0, [r9, r3] + 1f2e288: da00006b ble 1f2e43c + 1f2e28c: e06a0001 rsb r0, sl, r1 + 1f2e290: e2823003 add r3, r2, #3 + 1f2e294: e7dec001 ldrb ip, [lr, r1] + 1f2e298: e1540003 cmp r4, r3 + 1f2e29c: e7d90000 ldrb r0, [r9, r0] + 1f2e2a0: e080000c add r0, r0, ip + 1f2e2a4: e7c90001 strb r0, [r9, r1] + 1f2e2a8: da000063 ble 1f2e43c + 1f2e2ac: e06a0003 rsb r0, sl, r3 + 1f2e2b0: e2821004 add r1, r2, #4 + 1f2e2b4: e7dec003 ldrb ip, [lr, r3] + 1f2e2b8: e1540001 cmp r4, r1 + 1f2e2bc: e7d90000 ldrb r0, [r9, r0] + 1f2e2c0: e080000c add r0, r0, ip + 1f2e2c4: e7c90003 strb r0, [r9, r3] + 1f2e2c8: da00005b ble 1f2e43c + 1f2e2cc: e06a0001 rsb r0, sl, r1 + 1f2e2d0: e2823005 add r3, r2, #5 + 1f2e2d4: e7dec001 ldrb ip, [lr, r1] + 1f2e2d8: e1540003 cmp r4, r3 + 1f2e2dc: e7d90000 ldrb r0, [r9, r0] + 1f2e2e0: e080000c add r0, r0, ip + 1f2e2e4: e7c90001 strb r0, [r9, r1] + 1f2e2e8: da000053 ble 1f2e43c + 1f2e2ec: e06a0003 rsb r0, sl, r3 + 1f2e2f0: e2821006 add r1, r2, #6 + 1f2e2f4: e7dec003 ldrb ip, [lr, r3] + 1f2e2f8: e1540001 cmp r4, r1 + 1f2e2fc: e7d90000 ldrb r0, [r9, r0] + 1f2e300: e080000c add r0, r0, ip + 1f2e304: e7c90003 strb r0, [r9, r3] + 1f2e308: da00004b ble 1f2e43c + 1f2e30c: e06a0001 rsb r0, sl, r1 + 1f2e310: e2823007 add r3, r2, #7 + 1f2e314: e7dec001 ldrb ip, [lr, r1] + 1f2e318: e1540003 cmp r4, r3 + 1f2e31c: e7d90000 ldrb r0, [r9, r0] + 1f2e320: e080000c add r0, r0, ip + 1f2e324: e7c90001 strb r0, [r9, r1] + 1f2e328: da000043 ble 1f2e43c + 1f2e32c: e06a0003 rsb r0, sl, r3 + 1f2e330: e2821008 add r1, r2, #8 + 1f2e334: e7dec003 ldrb ip, [lr, r3] + 1f2e338: e1540001 cmp r4, r1 + 1f2e33c: e7d90000 ldrb r0, [r9, r0] + 1f2e340: e080000c add r0, r0, ip + 1f2e344: e7c90003 strb r0, [r9, r3] + 1f2e348: da00003b ble 1f2e43c + 1f2e34c: e06a0001 rsb r0, sl, r1 + 1f2e350: e2823009 add r3, r2, #9 + 1f2e354: e7dec001 ldrb ip, [lr, r1] + 1f2e358: e1540003 cmp r4, r3 + 1f2e35c: e7d90000 ldrb r0, [r9, r0] + 1f2e360: e080000c add r0, r0, ip + 1f2e364: e7c90001 strb r0, [r9, r1] + 1f2e368: da000033 ble 1f2e43c + 1f2e36c: e06a0003 rsb r0, sl, r3 + 1f2e370: e282100a add r1, r2, #10 + 1f2e374: e7dec003 ldrb ip, [lr, r3] + 1f2e378: e1540001 cmp r4, r1 + 1f2e37c: e7d90000 ldrb r0, [r9, r0] + 1f2e380: e080000c add r0, r0, ip + 1f2e384: e7c90003 strb r0, [r9, r3] + 1f2e388: da00002b ble 1f2e43c + 1f2e38c: e06a0001 rsb r0, sl, r1 + 1f2e390: e282300b add r3, r2, #11 + 1f2e394: e7dec001 ldrb ip, [lr, r1] + 1f2e398: e1540003 cmp r4, r3 + 1f2e39c: e7d90000 ldrb r0, [r9, r0] + 1f2e3a0: e080000c add r0, r0, ip + 1f2e3a4: e7c90001 strb r0, [r9, r1] + 1f2e3a8: da000023 ble 1f2e43c + 1f2e3ac: e06a0003 rsb r0, sl, r3 + 1f2e3b0: e282100c add r1, r2, #12 + 1f2e3b4: e7dec003 ldrb ip, [lr, r3] + 1f2e3b8: e1540001 cmp r4, r1 + 1f2e3bc: e7d90000 ldrb r0, [r9, r0] + 1f2e3c0: e080000c add r0, r0, ip + 1f2e3c4: e7c90003 strb r0, [r9, r3] + 1f2e3c8: da00001b ble 1f2e43c + 1f2e3cc: e06a0001 rsb r0, sl, r1 + 1f2e3d0: e282300d add r3, r2, #13 + 1f2e3d4: e7dec001 ldrb ip, [lr, r1] + 1f2e3d8: e1540003 cmp r4, r3 + 1f2e3dc: e7d90000 ldrb r0, [r9, r0] + 1f2e3e0: e080000c add r0, r0, ip + 1f2e3e4: e7c90001 strb r0, [r9, r1] + 1f2e3e8: da000013 ble 1f2e43c + 1f2e3ec: e06a0003 rsb r0, sl, r3 + 1f2e3f0: e282200e add r2, r2, #14 + 1f2e3f4: e7de1003 ldrb r1, [lr, r3] + 1f2e3f8: e1540002 cmp r4, r2 + 1f2e3fc: e1a0c00e mov ip, lr + 1f2e400: e7d90000 ldrb r0, [r9, r0] + 1f2e404: e0801001 add r1, r0, r1 + 1f2e408: e7c91003 strb r1, [r9, r3] + 1f2e40c: da00000a ble 1f2e43c + 1f2e410: e59d1018 ldr r1, [sp, #24] + 1f2e414: e06a3002 rsb r3, sl, r2 + 1f2e418: e7d11002 ldrb r1, [r1, r2] + 1f2e41c: e7d93003 ldrb r3, [r9, r3] + 1f2e420: e0833001 add r3, r3, r1 + 1f2e424: e7c93002 strb r3, [r9, r2] + 1f2e428: ea000003 b 1f2e43c + 1f2e42c: e1a00009 mov r0, r9 + 1f2e430: e59d2004 ldr r2, [sp, #4] + 1f2e434: e59d1018 ldr r1, [sp, #24] + 1f2e438: eb004270 bl 1f3ee00 + 1f2e43c: e59d3018 ldr r3, [sp, #24] + 1f2e440: e59d2004 ldr r2, [sp, #4] + 1f2e444: e0833002 add r3, r3, r2 + 1f2e448: e58d3018 str r3, [sp, #24] + 1f2e44c: e59d301c ldr r3, [sp, #28] + 1f2e450: e59d2148 ldr r2, [sp, #328] ; 0x148 + 1f2e454: e2833001 add r3, r3, #1 + 1f2e458: e58d301c str r3, [sp, #28] + 1f2e45c: e1520003 cmp r2, r3 + 1f2e460: 0a000861 beq 1f305ec + 1f2e464: e59d3018 ldr r3, [sp, #24] + 1f2e468: e59d2028 ldr r2, [sp, #40] ; 0x28 + 1f2e46c: e59d1024 ldr r1, [sp, #36] ; 0x24 + 1f2e470: e2833001 add r3, r3, #1 + 1f2e474: e553b001 ldrb fp, [r3, #-1] + 1f2e478: e0822001 add r2, r2, r1 + 1f2e47c: e59d1040 ldr r1, [sp, #64] ; 0x40 + 1f2e480: e35b0004 cmp fp, #4 + 1f2e484: e58d2028 str r2, [sp, #40] ; 0x28 + 1f2e488: e58d3008 str r3, [sp, #8] + 1f2e48c: e5914000 ldr r4, [r1] + 1f2e490: e0844002 add r4, r4, r2 + 1f2e494: dafffbdb ble 1f2d408 + 1f2e498: e30a336c movw r3, #41836 ; 0xa36c + 1f2e49c: e340320d movt r3, #525 ; 0x20d + 1f2e4a0: e3a00000 mov r0, #0 + 1f2e4a4: e3002fd0 movw r2, #4048 ; 0xfd0 + 1f2e4a8: e34021f6 movt r2, #502 ; 0x1f6 + 1f2e4ac: e5832000 str r2, [r3] + 1f2e4b0: e28dd0fc add sp, sp, #252 ; 0xfc + 1f2e4b4: ecbd8b08 vpop {d8-d11} + 1f2e4b8: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f2e4bc: e59d3004 ldr r3, [sp, #4] + 1f2e4c0: e3530000 cmp r3, #0 + 1f2e4c4: daffffdc ble 1f2e43c + 1f2e4c8: e59dc018 ldr ip, [sp, #24] + 1f2e4cc: e2893010 add r3, r9, #16 + 1f2e4d0: e2881010 add r1, r8, #16 + 1f2e4d4: e1a00003 mov r0, r3 + 1f2e4d8: e1580000 cmp r8, r0 + 1f2e4dc: 31590001 cmpcc r9, r1 + 1f2e4e0: e28c2010 add r2, ip, #16 + 1f2e4e4: 23a01001 movcs r1, #1 + 1f2e4e8: 33a01000 movcc r1, #0 + 1f2e4ec: e15c0000 cmp ip, r0 + 1f2e4f0: 31590002 cmpcc r9, r2 + 1f2e4f4: e1a0300c mov r3, ip + 1f2e4f8: 23a03001 movcs r3, #1 + 1f2e4fc: 33a03000 movcc r3, #0 + 1f2e500: e0033001 and r3, r3, r1 + 1f2e504: e59d1004 ldr r1, [sp, #4] + 1f2e508: e3510013 cmp r1, #19 + 1f2e50c: 93a03000 movls r3, #0 + 1f2e510: 82033001 andhi r3, r3, #1 + 1f2e514: e1a02001 mov r2, r1 + 1f2e518: e3530000 cmp r3, #0 + 1f2e51c: 0a000af4 beq 1f310f4 + 1f2e520: e20c3007 and r3, ip, #7 + 1f2e524: e2633000 rsb r3, r3, #0 + 1f2e528: e203300f and r3, r3, #15 + 1f2e52c: e1530001 cmp r3, r1 + 1f2e530: 21a03001 movcs r3, r1 + 1f2e534: e3530000 cmp r3, #0 + 1f2e538: 01a02003 moveq r2, r3 + 1f2e53c: 0a000059 beq 1f2e6a8 + 1f2e540: e5dc2000 ldrb r2, [ip] + 1f2e544: e3530001 cmp r3, #1 + 1f2e548: e5d81000 ldrb r1, [r8] + 1f2e54c: e0822001 add r2, r2, r1 + 1f2e550: e5c92000 strb r2, [r9] + 1f2e554: 0a000abf beq 1f31058 + 1f2e558: e5dc2001 ldrb r2, [ip, #1] + 1f2e55c: e3530002 cmp r3, #2 + 1f2e560: e5d81001 ldrb r1, [r8, #1] + 1f2e564: e0822001 add r2, r2, r1 + 1f2e568: e5c92001 strb r2, [r9, #1] + 1f2e56c: 0a000ab9 beq 1f31058 + 1f2e570: e5dc2002 ldrb r2, [ip, #2] + 1f2e574: e3530003 cmp r3, #3 + 1f2e578: e5d81002 ldrb r1, [r8, #2] + 1f2e57c: e0822001 add r2, r2, r1 + 1f2e580: e5c92002 strb r2, [r9, #2] + 1f2e584: 0a000ab3 beq 1f31058 + 1f2e588: e5dc2003 ldrb r2, [ip, #3] + 1f2e58c: e3530004 cmp r3, #4 + 1f2e590: e5d81003 ldrb r1, [r8, #3] + 1f2e594: e0822001 add r2, r2, r1 + 1f2e598: e5c92003 strb r2, [r9, #3] + 1f2e59c: 0a000aad beq 1f31058 + 1f2e5a0: e5dc2004 ldrb r2, [ip, #4] + 1f2e5a4: e3530005 cmp r3, #5 + 1f2e5a8: e5d81004 ldrb r1, [r8, #4] + 1f2e5ac: e0822001 add r2, r2, r1 + 1f2e5b0: e5c92004 strb r2, [r9, #4] + 1f2e5b4: 0a000aa7 beq 1f31058 + 1f2e5b8: e5dc2005 ldrb r2, [ip, #5] + 1f2e5bc: e3530006 cmp r3, #6 + 1f2e5c0: e5d81005 ldrb r1, [r8, #5] + 1f2e5c4: e0822001 add r2, r2, r1 + 1f2e5c8: e5c92005 strb r2, [r9, #5] + 1f2e5cc: 0a000aa1 beq 1f31058 + 1f2e5d0: e5dc2006 ldrb r2, [ip, #6] + 1f2e5d4: e3530007 cmp r3, #7 + 1f2e5d8: e5d81006 ldrb r1, [r8, #6] + 1f2e5dc: e0822001 add r2, r2, r1 + 1f2e5e0: e5c92006 strb r2, [r9, #6] + 1f2e5e4: 0a000b91 beq 1f31430 + 1f2e5e8: e5dc2007 ldrb r2, [ip, #7] + 1f2e5ec: e3530008 cmp r3, #8 + 1f2e5f0: e5d81007 ldrb r1, [r8, #7] + 1f2e5f4: e0822001 add r2, r2, r1 + 1f2e5f8: e5c92007 strb r2, [r9, #7] + 1f2e5fc: 0a000a95 beq 1f31058 + 1f2e600: e5dc2008 ldrb r2, [ip, #8] + 1f2e604: e3530009 cmp r3, #9 + 1f2e608: e5d81008 ldrb r1, [r8, #8] + 1f2e60c: e0822001 add r2, r2, r1 + 1f2e610: e5c92008 strb r2, [r9, #8] + 1f2e614: 0a000a8f beq 1f31058 + 1f2e618: e5dc2009 ldrb r2, [ip, #9] + 1f2e61c: e353000a cmp r3, #10 + 1f2e620: e5d81009 ldrb r1, [r8, #9] + 1f2e624: e0822001 add r2, r2, r1 + 1f2e628: e5c92009 strb r2, [r9, #9] + 1f2e62c: 0a000a89 beq 1f31058 + 1f2e630: e5dc200a ldrb r2, [ip, #10] + 1f2e634: e353000b cmp r3, #11 + 1f2e638: e5d8100a ldrb r1, [r8, #10] + 1f2e63c: e0822001 add r2, r2, r1 + 1f2e640: e5c9200a strb r2, [r9, #10] + 1f2e644: 0a000a83 beq 1f31058 + 1f2e648: e5dc200b ldrb r2, [ip, #11] + 1f2e64c: e353000c cmp r3, #12 + 1f2e650: e5d8100b ldrb r1, [r8, #11] + 1f2e654: e0822001 add r2, r2, r1 + 1f2e658: e5c9200b strb r2, [r9, #11] + 1f2e65c: 0a000a7d beq 1f31058 + 1f2e660: e5dc200c ldrb r2, [ip, #12] + 1f2e664: e353000d cmp r3, #13 + 1f2e668: e5d8100c ldrb r1, [r8, #12] + 1f2e66c: e0822001 add r2, r2, r1 + 1f2e670: e5c9200c strb r2, [r9, #12] + 1f2e674: 0a000a77 beq 1f31058 + 1f2e678: e5dc200d ldrb r2, [ip, #13] + 1f2e67c: e353000e cmp r3, #14 + 1f2e680: e5d8100d ldrb r1, [r8, #13] + 1f2e684: e0822001 add r2, r2, r1 + 1f2e688: e5c9200d strb r2, [r9, #13] + 1f2e68c: 0a000a71 beq 1f31058 + 1f2e690: e5dc100e ldrb r1, [ip, #14] + 1f2e694: e3a0200f mov r2, #15 + 1f2e698: e5d8000e ldrb r0, [r8, #14] + 1f2e69c: e0811000 add r1, r1, r0 + 1f2e6a0: e5c9100e strb r1, [r9, #14] + 1f2e6a4: e59d1004 ldr r1, [sp, #4] + 1f2e6a8: e0630001 rsb r0, r3, r1 + 1f2e6ac: e2411001 sub r1, r1, #1 + 1f2e6b0: e240c010 sub ip, r0, #16 + 1f2e6b4: e0631001 rsb r1, r3, r1 + 1f2e6b8: e351000e cmp r1, #14 + 1f2e6bc: e1a0122c lsr r1, ip, #4 + 1f2e6c0: e2811001 add r1, r1, #1 + 1f2e6c4: e1a0c201 lsl ip, r1, #4 + 1f2e6c8: 9a000011 bls 1f2e714 + 1f2e6cc: e59de018 ldr lr, [sp, #24] + 1f2e6d0: e0884003 add r4, r8, r3 + 1f2e6d4: e08e5003 add r5, lr, r3 + 1f2e6d8: e0893003 add r3, r9, r3 + 1f2e6dc: e3a0e000 mov lr, #0 + 1f2e6e0: f4642a0f vld1.8 {d18-d19}, [r4] + 1f2e6e4: e28ee001 add lr, lr, #1 + 1f2e6e8: f4650adf vld1.64 {d16-d17}, [r5 :64] + 1f2e6ec: e15e0001 cmp lr, r1 + 1f2e6f0: e2844010 add r4, r4, #16 + 1f2e6f4: e2855010 add r5, r5, #16 + 1f2e6f8: f24208e0 vadd.i8 q8, q9, q8 + 1f2e6fc: f4430a0f vst1.8 {d16-d17}, [r3] + 1f2e700: e2833010 add r3, r3, #16 + 1f2e704: 3afffff5 bcc 1f2e6e0 + 1f2e708: e150000c cmp r0, ip + 1f2e70c: e082200c add r2, r2, ip + 1f2e710: 0affff49 beq 1f2e43c + 1f2e714: e59dc018 ldr ip, [sp, #24] + 1f2e718: e2823001 add r3, r2, #1 + 1f2e71c: e59d4004 ldr r4, [sp, #4] + 1f2e720: e7d80002 ldrb r0, [r8, r2] + 1f2e724: e7dc1002 ldrb r1, [ip, r2] + 1f2e728: e1540003 cmp r4, r3 + 1f2e72c: e1a0e004 mov lr, r4 + 1f2e730: e0811000 add r1, r1, r0 + 1f2e734: e7c91002 strb r1, [r9, r2] + 1f2e738: daffff3f ble 1f2e43c + 1f2e73c: e2821002 add r1, r2, #2 + 1f2e740: e7dc0003 ldrb r0, [ip, r3] + 1f2e744: e1a0e00c mov lr, ip + 1f2e748: e1540001 cmp r4, r1 + 1f2e74c: e7d8c003 ldrb ip, [r8, r3] + 1f2e750: e080000c add r0, r0, ip + 1f2e754: e7c90003 strb r0, [r9, r3] + 1f2e758: daffff37 ble 1f2e43c + 1f2e75c: e2823003 add r3, r2, #3 + 1f2e760: e7de0001 ldrb r0, [lr, r1] + 1f2e764: e7d8c001 ldrb ip, [r8, r1] + 1f2e768: e1540003 cmp r4, r3 + 1f2e76c: e080000c add r0, r0, ip + 1f2e770: e7c90001 strb r0, [r9, r1] + 1f2e774: daffff30 ble 1f2e43c + 1f2e778: e2821004 add r1, r2, #4 + 1f2e77c: e7de0003 ldrb r0, [lr, r3] + 1f2e780: e7d8c003 ldrb ip, [r8, r3] + 1f2e784: e1540001 cmp r4, r1 + 1f2e788: e080000c add r0, r0, ip + 1f2e78c: e7c90003 strb r0, [r9, r3] + 1f2e790: daffff29 ble 1f2e43c + 1f2e794: e2823005 add r3, r2, #5 + 1f2e798: e7de0001 ldrb r0, [lr, r1] + 1f2e79c: e7d8c001 ldrb ip, [r8, r1] + 1f2e7a0: e1540003 cmp r4, r3 + 1f2e7a4: e080000c add r0, r0, ip + 1f2e7a8: e7c90001 strb r0, [r9, r1] + 1f2e7ac: daffff22 ble 1f2e43c + 1f2e7b0: e2821006 add r1, r2, #6 + 1f2e7b4: e7de0003 ldrb r0, [lr, r3] + 1f2e7b8: e7d8c003 ldrb ip, [r8, r3] + 1f2e7bc: e1540001 cmp r4, r1 + 1f2e7c0: e080000c add r0, r0, ip + 1f2e7c4: e7c90003 strb r0, [r9, r3] + 1f2e7c8: daffff1b ble 1f2e43c + 1f2e7cc: e2823007 add r3, r2, #7 + 1f2e7d0: e7de0001 ldrb r0, [lr, r1] + 1f2e7d4: e7d8c001 ldrb ip, [r8, r1] + 1f2e7d8: e1540003 cmp r4, r3 + 1f2e7dc: e080000c add r0, r0, ip + 1f2e7e0: e7c90001 strb r0, [r9, r1] + 1f2e7e4: daffff14 ble 1f2e43c + 1f2e7e8: e2821008 add r1, r2, #8 + 1f2e7ec: e7de0003 ldrb r0, [lr, r3] + 1f2e7f0: e7d8c003 ldrb ip, [r8, r3] + 1f2e7f4: e1540001 cmp r4, r1 + 1f2e7f8: e080000c add r0, r0, ip + 1f2e7fc: e7c90003 strb r0, [r9, r3] + 1f2e800: daffff0d ble 1f2e43c + 1f2e804: e2823009 add r3, r2, #9 + 1f2e808: e7de0001 ldrb r0, [lr, r1] + 1f2e80c: e7d8c001 ldrb ip, [r8, r1] + 1f2e810: e1540003 cmp r4, r3 + 1f2e814: e080000c add r0, r0, ip + 1f2e818: e7c90001 strb r0, [r9, r1] + 1f2e81c: daffff06 ble 1f2e43c + 1f2e820: e282100a add r1, r2, #10 + 1f2e824: e7de0003 ldrb r0, [lr, r3] + 1f2e828: e7d8c003 ldrb ip, [r8, r3] + 1f2e82c: e1540001 cmp r4, r1 + 1f2e830: e080000c add r0, r0, ip + 1f2e834: e7c90003 strb r0, [r9, r3] + 1f2e838: dafffeff ble 1f2e43c + 1f2e83c: e282300b add r3, r2, #11 + 1f2e840: e7de0001 ldrb r0, [lr, r1] + 1f2e844: e7d8c001 ldrb ip, [r8, r1] + 1f2e848: e1540003 cmp r4, r3 + 1f2e84c: e080000c add r0, r0, ip + 1f2e850: e7c90001 strb r0, [r9, r1] + 1f2e854: dafffef8 ble 1f2e43c + 1f2e858: e282100c add r1, r2, #12 + 1f2e85c: e7de0003 ldrb r0, [lr, r3] + 1f2e860: e7d8c003 ldrb ip, [r8, r3] + 1f2e864: e1540001 cmp r4, r1 + 1f2e868: e080000c add r0, r0, ip + 1f2e86c: e7c90003 strb r0, [r9, r3] + 1f2e870: dafffef1 ble 1f2e43c + 1f2e874: e282300d add r3, r2, #13 + 1f2e878: e7de0001 ldrb r0, [lr, r1] + 1f2e87c: e7d8c001 ldrb ip, [r8, r1] + 1f2e880: e1540003 cmp r4, r3 + 1f2e884: e080000c add r0, r0, ip + 1f2e888: e7c90001 strb r0, [r9, r1] + 1f2e88c: dafffeea ble 1f2e43c + 1f2e890: e282200e add r2, r2, #14 + 1f2e894: e7de1003 ldrb r1, [lr, r3] + 1f2e898: e7d80003 ldrb r0, [r8, r3] + 1f2e89c: e1540002 cmp r4, r2 + 1f2e8a0: e0811000 add r1, r1, r0 + 1f2e8a4: e7c91003 strb r1, [r9, r3] + 1f2e8a8: dafffee3 ble 1f2e43c + 1f2e8ac: e59d3018 ldr r3, [sp, #24] + 1f2e8b0: e7d81002 ldrb r1, [r8, r2] + 1f2e8b4: e7d33002 ldrb r3, [r3, r2] + 1f2e8b8: e0833001 add r3, r3, r1 + 1f2e8bc: e7c93002 strb r3, [r9, r2] + 1f2e8c0: eafffedd b 1f2e43c + 1f2e8c4: e1a02003 mov r2, r3 + 1f2e8c8: e59d1004 ldr r1, [sp, #4] + 1f2e8cc: e063c001 rsb ip, r3, r1 + 1f2e8d0: e2411001 sub r1, r1, #1 + 1f2e8d4: e24c0010 sub r0, ip, #16 + 1f2e8d8: e0631001 rsb r1, r3, r1 + 1f2e8dc: e351000e cmp r1, #14 + 1f2e8e0: e1a01220 lsr r1, r0, #4 + 1f2e8e4: e2811001 add r1, r1, #1 + 1f2e8e8: e1a0e201 lsl lr, r1, #4 + 1f2e8ec: 9a000013 bls 1f2e940 + 1f2e8f0: e59d4018 ldr r4, [sp, #24] + 1f2e8f4: e06a0003 rsb r0, sl, r3 + 1f2e8f8: e0890000 add r0, r9, r0 + 1f2e8fc: e0845003 add r5, r4, r3 + 1f2e900: e0893003 add r3, r9, r3 + 1f2e904: e3a04000 mov r4, #0 + 1f2e908: f4602a0f vld1.8 {d18-d19}, [r0] + 1f2e90c: e2844001 add r4, r4, #1 + 1f2e910: f4650adf vld1.64 {d16-d17}, [r5 :64] + 1f2e914: e1540001 cmp r4, r1 + 1f2e918: e2800010 add r0, r0, #16 + 1f2e91c: e2855010 add r5, r5, #16 + 1f2e920: f3cf2072 vshr.u8 q9, q9, #1 + 1f2e924: f24208e0 vadd.i8 q8, q9, q8 + 1f2e928: f4430a0f vst1.8 {d16-d17}, [r3] + 1f2e92c: e2833010 add r3, r3, #16 + 1f2e930: 3afffff4 bcc 1f2e908 + 1f2e934: e15c000e cmp ip, lr + 1f2e938: e082200e add r2, r2, lr + 1f2e93c: 0afffebe beq 1f2e43c + 1f2e940: e06a0002 rsb r0, sl, r2 + 1f2e944: e59de018 ldr lr, [sp, #24] + 1f2e948: e59d4004 ldr r4, [sp, #4] + 1f2e94c: e2823001 add r3, r2, #1 + 1f2e950: e7d90000 ldrb r0, [r9, r0] + 1f2e954: e1540003 cmp r4, r3 + 1f2e958: e7de1002 ldrb r1, [lr, r2] + 1f2e95c: e1a0c004 mov ip, r4 + 1f2e960: e08110a0 add r1, r1, r0, lsr #1 + 1f2e964: e7c91002 strb r1, [r9, r2] + 1f2e968: dafffeb3 ble 1f2e43c + 1f2e96c: e06ac003 rsb ip, sl, r3 + 1f2e970: e2821002 add r1, r2, #2 + 1f2e974: e7de0003 ldrb r0, [lr, r3] + 1f2e978: e1540001 cmp r4, r1 + 1f2e97c: e7d9c00c ldrb ip, [r9, ip] + 1f2e980: e08000ac add r0, r0, ip, lsr #1 + 1f2e984: e7c90003 strb r0, [r9, r3] + 1f2e988: dafffeab ble 1f2e43c + 1f2e98c: e06ac001 rsb ip, sl, r1 + 1f2e990: e2823003 add r3, r2, #3 + 1f2e994: e7de0001 ldrb r0, [lr, r1] + 1f2e998: e1540003 cmp r4, r3 + 1f2e99c: e7d9c00c ldrb ip, [r9, ip] + 1f2e9a0: e08000ac add r0, r0, ip, lsr #1 + 1f2e9a4: e7c90001 strb r0, [r9, r1] + 1f2e9a8: dafffea3 ble 1f2e43c + 1f2e9ac: e06ac003 rsb ip, sl, r3 + 1f2e9b0: e2821004 add r1, r2, #4 + 1f2e9b4: e7de0003 ldrb r0, [lr, r3] + 1f2e9b8: e1540001 cmp r4, r1 + 1f2e9bc: e7d9c00c ldrb ip, [r9, ip] + 1f2e9c0: e08000ac add r0, r0, ip, lsr #1 + 1f2e9c4: e7c90003 strb r0, [r9, r3] + 1f2e9c8: dafffe9b ble 1f2e43c + 1f2e9cc: e06ac001 rsb ip, sl, r1 + 1f2e9d0: e2823005 add r3, r2, #5 + 1f2e9d4: e7de0001 ldrb r0, [lr, r1] + 1f2e9d8: e1540003 cmp r4, r3 + 1f2e9dc: e7d9c00c ldrb ip, [r9, ip] + 1f2e9e0: e08000ac add r0, r0, ip, lsr #1 + 1f2e9e4: e7c90001 strb r0, [r9, r1] + 1f2e9e8: dafffe93 ble 1f2e43c + 1f2e9ec: e06ac003 rsb ip, sl, r3 + 1f2e9f0: e2821006 add r1, r2, #6 + 1f2e9f4: e7de0003 ldrb r0, [lr, r3] + 1f2e9f8: e1540001 cmp r4, r1 + 1f2e9fc: e7d9c00c ldrb ip, [r9, ip] + 1f2ea00: e08000ac add r0, r0, ip, lsr #1 + 1f2ea04: e7c90003 strb r0, [r9, r3] + 1f2ea08: dafffe8b ble 1f2e43c + 1f2ea0c: e06ac001 rsb ip, sl, r1 + 1f2ea10: e2823007 add r3, r2, #7 + 1f2ea14: e7de0001 ldrb r0, [lr, r1] + 1f2ea18: e1540003 cmp r4, r3 + 1f2ea1c: e7d9c00c ldrb ip, [r9, ip] + 1f2ea20: e08000ac add r0, r0, ip, lsr #1 + 1f2ea24: e7c90001 strb r0, [r9, r1] + 1f2ea28: dafffe83 ble 1f2e43c + 1f2ea2c: e06ac003 rsb ip, sl, r3 + 1f2ea30: e2821008 add r1, r2, #8 + 1f2ea34: e7de0003 ldrb r0, [lr, r3] + 1f2ea38: e1540001 cmp r4, r1 + 1f2ea3c: e7d9c00c ldrb ip, [r9, ip] + 1f2ea40: e08000ac add r0, r0, ip, lsr #1 + 1f2ea44: e7c90003 strb r0, [r9, r3] + 1f2ea48: dafffe7b ble 1f2e43c + 1f2ea4c: e06ac001 rsb ip, sl, r1 + 1f2ea50: e2823009 add r3, r2, #9 + 1f2ea54: e7de0001 ldrb r0, [lr, r1] + 1f2ea58: e1540003 cmp r4, r3 + 1f2ea5c: e7d9c00c ldrb ip, [r9, ip] + 1f2ea60: e08000ac add r0, r0, ip, lsr #1 + 1f2ea64: e7c90001 strb r0, [r9, r1] + 1f2ea68: dafffe73 ble 1f2e43c + 1f2ea6c: e06ac003 rsb ip, sl, r3 + 1f2ea70: e282100a add r1, r2, #10 + 1f2ea74: e7de0003 ldrb r0, [lr, r3] + 1f2ea78: e1540001 cmp r4, r1 + 1f2ea7c: e7d9c00c ldrb ip, [r9, ip] + 1f2ea80: e08000ac add r0, r0, ip, lsr #1 + 1f2ea84: e7c90003 strb r0, [r9, r3] + 1f2ea88: dafffe6b ble 1f2e43c + 1f2ea8c: e06ac001 rsb ip, sl, r1 + 1f2ea90: e282300b add r3, r2, #11 + 1f2ea94: e7de0001 ldrb r0, [lr, r1] + 1f2ea98: e1540003 cmp r4, r3 + 1f2ea9c: e7d9c00c ldrb ip, [r9, ip] + 1f2eaa0: e08000ac add r0, r0, ip, lsr #1 + 1f2eaa4: e7c90001 strb r0, [r9, r1] + 1f2eaa8: dafffe63 ble 1f2e43c + 1f2eaac: e06ac003 rsb ip, sl, r3 + 1f2eab0: e282100c add r1, r2, #12 + 1f2eab4: e7de0003 ldrb r0, [lr, r3] + 1f2eab8: e1540001 cmp r4, r1 + 1f2eabc: e7d9c00c ldrb ip, [r9, ip] + 1f2eac0: e08000ac add r0, r0, ip, lsr #1 + 1f2eac4: e7c90003 strb r0, [r9, r3] + 1f2eac8: dafffe5b ble 1f2e43c + 1f2eacc: e06ac001 rsb ip, sl, r1 + 1f2ead0: e282300d add r3, r2, #13 + 1f2ead4: e7de0001 ldrb r0, [lr, r1] + 1f2ead8: e1540003 cmp r4, r3 + 1f2eadc: e7d9c00c ldrb ip, [r9, ip] + 1f2eae0: e08000ac add r0, r0, ip, lsr #1 + 1f2eae4: e7c90001 strb r0, [r9, r1] + 1f2eae8: dafffe53 ble 1f2e43c + 1f2eaec: e06a0003 rsb r0, sl, r3 + 1f2eaf0: e282200e add r2, r2, #14 + 1f2eaf4: e7de1003 ldrb r1, [lr, r3] + 1f2eaf8: e1540002 cmp r4, r2 + 1f2eafc: e7d90000 ldrb r0, [r9, r0] + 1f2eb00: e08110a0 add r1, r1, r0, lsr #1 + 1f2eb04: e7c91003 strb r1, [r9, r3] + 1f2eb08: dafffe4b ble 1f2e43c + 1f2eb0c: e06a1002 rsb r1, sl, r2 + 1f2eb10: e7de3002 ldrb r3, [lr, r2] + 1f2eb14: e7d91001 ldrb r1, [r9, r1] + 1f2eb18: e08330a1 add r3, r3, r1, lsr #1 + 1f2eb1c: e7c93002 strb r3, [r9, r2] + 1f2eb20: eafffe45 b 1f2e43c + 1f2eb24: e3530000 cmp r3, #0 + 1f2eb28: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f2eb2c: e0633004 rsb r3, r3, r4 + 1f2eb30: e58d3004 str r3, [sp, #4] + 1f2eb34: 0a000a45 beq 1f31450 + 1f2eb38: e35a0000 cmp sl, #0 + 1f2eb3c: cafffa40 bgt 1f2d444 + 1f2eb40: e59d314c ldr r3, [sp, #332] ; 0x14c + 1f2eb44: e3530008 cmp r3, #8 + 1f2eb48: 1afffa5c bne 1f2d4c0 + 1f2eb4c: e59d2140 ldr r2, [sp, #320] ; 0x140 + 1f2eb50: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f2eb54: e1520003 cmp r2, r3 + 1f2eb58: 13e02000 mvnne r2, #0 + 1f2eb5c: 17c42003 strbne r2, [r4, r3] + 1f2eb60: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f2eb64: e59d3008 ldr r3, [sp, #8] + 1f2eb68: e0833002 add r3, r3, r2 + 1f2eb6c: e58d3018 str r3, [sp, #24] + 1f2eb70: e59d3140 ldr r3, [sp, #320] ; 0x140 + 1f2eb74: e59d2140 ldr r2, [sp, #320] ; 0x140 + 1f2eb78: e0849003 add r9, r4, r3 + 1f2eb7c: e59d3004 ldr r3, [sp, #4] + 1f2eb80: e0838002 add r8, r3, r2 + 1f2eb84: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f2eb88: e3530000 cmp r3, #0 + 1f2eb8c: 1afffa56 bne 1f2d4ec + 1f2eb90: e35b0006 cmp fp, #6 + 1f2eb94: 979ff10b ldrls pc, [pc, fp, lsl #2] + 1f2eb98: ea00003d b 1f2ec94 + 1f2eb9c: 01f3017c .word 0x01f3017c + 1f2eba0: 01f2fcf0 .word 0x01f2fcf0 + 1f2eba4: 01f2f794 .word 0x01f2f794 + 1f2eba8: 01f2f178 .word 0x01f2f178 + 1f2ebac: 01f2fba4 .word 0x01f2fba4 + 1f2ebb0: 01f2ece8 .word 0x01f2ece8 + 1f2ebb4: 01f2ebb8 .word 0x01f2ebb8 + 1f2ebb8: e59d3050 ldr r3, [sp, #80] ; 0x50 + 1f2ebbc: e3530000 cmp r3, #0 + 1f2ebc0: 0a000033 beq 1f2ec94 + 1f2ebc4: e59d2018 ldr r2, [sp, #24] + 1f2ebc8: e58d3010 str r3, [sp, #16] + 1f2ebcc: e2422001 sub r2, r2, #1 + 1f2ebd0: e58d900c str r9, [sp, #12] + 1f2ebd4: e58d2008 str r2, [sp, #8] + 1f2ebd8: e58da004 str sl, [sp, #4] + 1f2ebdc: e59d3004 ldr r3, [sp, #4] + 1f2ebe0: e3530000 cmp r3, #0 + 1f2ebe4: da000017 ble 1f2ec48 + 1f2ebe8: e59d300c ldr r3, [sp, #12] + 1f2ebec: e59d2020 ldr r2, [sp, #32] + 1f2ebf0: e59db008 ldr fp, [sp, #8] + 1f2ebf4: e1a06003 mov r6, r3 + 1f2ebf8: e062a003 rsb sl, r2, r3 + 1f2ebfc: e59d2004 ldr r2, [sp, #4] + 1f2ec00: e0838002 add r8, r3, r2 + 1f2ec04: e4da4001 ldrb r4, [sl], #1 + 1f2ec08: e3a00000 mov r0, #0 + 1f2ec0c: e5fb5001 ldrb r5, [fp, #1]! + 1f2ec10: eb003e14 bl 1f3e468 + 1f2ec14: e1a07000 mov r7, r0 + 1f2ec18: e1a00004 mov r0, r4 + 1f2ec1c: eb003e11 bl 1f3e468 + 1f2ec20: e1a09000 mov r9, r0 + 1f2ec24: e1a00004 mov r0, r4 + 1f2ec28: eb003e0e bl 1f3e468 + 1f2ec2c: e1570009 cmp r7, r9 + 1f2ec30: d1570000 cmple r7, r0 + 1f2ec34: c3a04000 movgt r4, #0 + 1f2ec38: e0854004 add r4, r5, r4 + 1f2ec3c: e4c64001 strb r4, [r6], #1 + 1f2ec40: e1580006 cmp r8, r6 + 1f2ec44: 1affffee bne 1f2ec04 + 1f2ec48: e59d3010 ldr r3, [sp, #16] + 1f2ec4c: e3e01000 mvn r1, #0 + 1f2ec50: e59d2004 ldr r2, [sp, #4] + 1f2ec54: e2533001 subs r3, r3, #1 + 1f2ec58: e58d3010 str r3, [sp, #16] + 1f2ec5c: e59d300c ldr r3, [sp, #12] + 1f2ec60: e7c31002 strb r1, [r3, r2] + 1f2ec64: e59d1008 ldr r1, [sp, #8] + 1f2ec68: e0812002 add r2, r1, r2 + 1f2ec6c: e58d2008 str r2, [sp, #8] + 1f2ec70: e59d2020 ldr r2, [sp, #32] + 1f2ec74: e0833002 add r3, r3, r2 + 1f2ec78: e58d300c str r3, [sp, #12] + 1f2ec7c: 1affffd6 bne 1f2ebdc + 1f2ec80: e59da004 ldr sl, [sp, #4] + 1f2ec84: e59d2018 ldr r2, [sp, #24] + 1f2ec88: e59d3050 ldr r3, [sp, #80] ; 0x50 + 1f2ec8c: e023239a mla r3, sl, r3, r2 + 1f2ec90: e58d3018 str r3, [sp, #24] + 1f2ec94: e59d314c ldr r3, [sp, #332] ; 0x14c + 1f2ec98: e3530010 cmp r3, #16 + 1f2ec9c: 1afffdea bne 1f2e44c + 1f2eca0: e59d3144 ldr r3, [sp, #324] ; 0x144 + 1f2eca4: e3530000 cmp r3, #0 + 1f2eca8: e59d3040 ldr r3, [sp, #64] ; 0x40 + 1f2ecac: e5932000 ldr r2, [r3] + 1f2ecb0: 0afffde5 beq 1f2e44c + 1f2ecb4: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f2ecb8: e3a01000 mov r1, #0 + 1f2ecbc: e59d0144 ldr r0, [sp, #324] ; 0x144 + 1f2ecc0: e08a3003 add r3, sl, r3 + 1f2ecc4: e0823003 add r3, r2, r3 + 1f2ecc8: e59d2020 ldr r2, [sp, #32] + 1f2eccc: e2811001 add r1, r1, #1 + 1f2ecd0: e3e0c000 mvn ip, #0 + 1f2ecd4: e1500001 cmp r0, r1 + 1f2ecd8: e5c3c001 strb ip, [r3, #1] + 1f2ecdc: e0833002 add r3, r3, r2 + 1f2ece0: 1afffff9 bne 1f2eccc + 1f2ece4: eafffdd8 b 1f2e44c + 1f2ece8: e59db050 ldr fp, [sp, #80] ; 0x50 + 1f2ecec: e35b0000 cmp fp, #0 + 1f2ecf0: 0affffe7 beq 1f2ec94 + 1f2ecf4: e59d2020 ldr r2, [sp, #32] + 1f2ecf8: e289c010 add ip, r9, #16 + 1f2ecfc: e1a0800b mov r8, fp + 1f2ed00: e2623000 rsb r3, r2, #0 + 1f2ed04: e58d3014 str r3, [sp, #20] + 1f2ed08: e0890003 add r0, r9, r3 + 1f2ed0c: e59d3018 ldr r3, [sp, #24] + 1f2ed10: e2621010 rsb r1, r2, #16 + 1f2ed14: e1a0e002 mov lr, r2 + 1f2ed18: e58d1004 str r1, [sp, #4] + 1f2ed1c: e24a1001 sub r1, sl, #1 + 1f2ed20: e58d1010 str r1, [sp, #16] + 1f2ed24: e35a0000 cmp sl, #0 + 1f2ed28: da000109 ble 1f2f154 + 1f2ed2c: e15c0000 cmp ip, r0 + 1f2ed30: e59d4004 ldr r4, [sp, #4] + 1f2ed34: e2832010 add r2, r3, #16 + 1f2ed38: 83a01000 movhi r1, #0 + 1f2ed3c: 93a01001 movls r1, #1 + 1f2ed40: e3540000 cmp r4, #0 + 1f2ed44: d3811001 orrle r1, r1, #1 + 1f2ed48: e153000c cmp r3, ip + 1f2ed4c: 31590002 cmpcc r9, r2 + 1f2ed50: 23a02001 movcs r2, #1 + 1f2ed54: 33a02000 movcc r2, #0 + 1f2ed58: e0022001 and r2, r2, r1 + 1f2ed5c: e35a0012 cmp sl, #18 + 1f2ed60: 93a02000 movls r2, #0 + 1f2ed64: 82022001 andhi r2, r2, #1 + 1f2ed68: e3520000 cmp r2, #0 + 1f2ed6c: 0a0005ff beq 1f30570 + 1f2ed70: e2032007 and r2, r3, #7 + 1f2ed74: e2622000 rsb r2, r2, #0 + 1f2ed78: e202200f and r2, r2, #15 + 1f2ed7c: e152000a cmp r2, sl + 1f2ed80: 21a0200a movcs r2, sl + 1f2ed84: e3520000 cmp r2, #0 + 1f2ed88: 0a0005b5 beq 1f30464 + 1f2ed8c: e59d1014 ldr r1, [sp, #20] + 1f2ed90: e3520001 cmp r2, #1 + 1f2ed94: e7d94001 ldrb r4, [r9, r1] + 1f2ed98: e5d31000 ldrb r1, [r3] + 1f2ed9c: e08110a4 add r1, r1, r4, lsr #1 + 1f2eda0: e5c91000 strb r1, [r9] + 1f2eda4: 0a0005ae beq 1f30464 + 1f2eda8: e5d04001 ldrb r4, [r0, #1] + 1f2edac: e3520002 cmp r2, #2 + 1f2edb0: e5d31001 ldrb r1, [r3, #1] + 1f2edb4: e08110a4 add r1, r1, r4, lsr #1 + 1f2edb8: e5c91001 strb r1, [r9, #1] + 1f2edbc: 0a0005a8 beq 1f30464 + 1f2edc0: e5d04002 ldrb r4, [r0, #2] + 1f2edc4: e3520003 cmp r2, #3 + 1f2edc8: e5d31002 ldrb r1, [r3, #2] + 1f2edcc: e08110a4 add r1, r1, r4, lsr #1 + 1f2edd0: e5c91002 strb r1, [r9, #2] + 1f2edd4: 0a0005a2 beq 1f30464 + 1f2edd8: e5d04003 ldrb r4, [r0, #3] + 1f2eddc: e3520004 cmp r2, #4 + 1f2ede0: e5d31003 ldrb r1, [r3, #3] + 1f2ede4: e08110a4 add r1, r1, r4, lsr #1 + 1f2ede8: e5c91003 strb r1, [r9, #3] + 1f2edec: 0a00059c beq 1f30464 + 1f2edf0: e5d04004 ldrb r4, [r0, #4] + 1f2edf4: e3520005 cmp r2, #5 + 1f2edf8: e5d31004 ldrb r1, [r3, #4] + 1f2edfc: e08110a4 add r1, r1, r4, lsr #1 + 1f2ee00: e5c91004 strb r1, [r9, #4] + 1f2ee04: 0a000596 beq 1f30464 + 1f2ee08: e5d04005 ldrb r4, [r0, #5] + 1f2ee0c: e3520006 cmp r2, #6 + 1f2ee10: e5d31005 ldrb r1, [r3, #5] + 1f2ee14: e08110a4 add r1, r1, r4, lsr #1 + 1f2ee18: e5c91005 strb r1, [r9, #5] + 1f2ee1c: 0a000590 beq 1f30464 + 1f2ee20: e5d04006 ldrb r4, [r0, #6] + 1f2ee24: e3520007 cmp r2, #7 + 1f2ee28: e5d31006 ldrb r1, [r3, #6] + 1f2ee2c: e08110a4 add r1, r1, r4, lsr #1 + 1f2ee30: e5c91006 strb r1, [r9, #6] + 1f2ee34: 0a00088f beq 1f31078 + 1f2ee38: e5d04007 ldrb r4, [r0, #7] + 1f2ee3c: e3520008 cmp r2, #8 + 1f2ee40: e5d31007 ldrb r1, [r3, #7] + 1f2ee44: e08110a4 add r1, r1, r4, lsr #1 + 1f2ee48: e5c91007 strb r1, [r9, #7] + 1f2ee4c: 0a000584 beq 1f30464 + 1f2ee50: e5d04008 ldrb r4, [r0, #8] + 1f2ee54: e3520009 cmp r2, #9 + 1f2ee58: e5d31008 ldrb r1, [r3, #8] + 1f2ee5c: e08110a4 add r1, r1, r4, lsr #1 + 1f2ee60: e5c91008 strb r1, [r9, #8] + 1f2ee64: 0a00057e beq 1f30464 + 1f2ee68: e5d04009 ldrb r4, [r0, #9] + 1f2ee6c: e352000a cmp r2, #10 + 1f2ee70: e5d31009 ldrb r1, [r3, #9] + 1f2ee74: e08110a4 add r1, r1, r4, lsr #1 + 1f2ee78: e5c91009 strb r1, [r9, #9] + 1f2ee7c: 0a000578 beq 1f30464 + 1f2ee80: e5d0400a ldrb r4, [r0, #10] + 1f2ee84: e352000b cmp r2, #11 + 1f2ee88: e5d3100a ldrb r1, [r3, #10] + 1f2ee8c: e08110a4 add r1, r1, r4, lsr #1 + 1f2ee90: e5c9100a strb r1, [r9, #10] + 1f2ee94: 0a000572 beq 1f30464 + 1f2ee98: e5d0400b ldrb r4, [r0, #11] + 1f2ee9c: e352000c cmp r2, #12 + 1f2eea0: e5d3100b ldrb r1, [r3, #11] + 1f2eea4: e08110a4 add r1, r1, r4, lsr #1 + 1f2eea8: e5c9100b strb r1, [r9, #11] + 1f2eeac: 0a00056c beq 1f30464 + 1f2eeb0: e5d0400c ldrb r4, [r0, #12] + 1f2eeb4: e352000d cmp r2, #13 + 1f2eeb8: e5d3100c ldrb r1, [r3, #12] + 1f2eebc: e08110a4 add r1, r1, r4, lsr #1 + 1f2eec0: e5c9100c strb r1, [r9, #12] + 1f2eec4: 0a000566 beq 1f30464 + 1f2eec8: e5d0400d ldrb r4, [r0, #13] + 1f2eecc: e352000e cmp r2, #14 + 1f2eed0: e5d3100d ldrb r1, [r3, #13] + 1f2eed4: e08110a4 add r1, r1, r4, lsr #1 + 1f2eed8: e5c9100d strb r1, [r9, #13] + 1f2eedc: 0a000560 beq 1f30464 + 1f2eee0: e5d0500e ldrb r5, [r0, #14] + 1f2eee4: e3a0100f mov r1, #15 + 1f2eee8: e5d3400e ldrb r4, [r3, #14] + 1f2eeec: e08440a5 add r4, r4, r5, lsr #1 + 1f2eef0: e5c9400e strb r4, [r9, #14] + 1f2eef4: e59d4010 ldr r4, [sp, #16] + 1f2eef8: e062600a rsb r6, r2, sl + 1f2eefc: e0625004 rsb r5, r2, r4 + 1f2ef00: e2464010 sub r4, r6, #16 + 1f2ef04: e355000e cmp r5, #14 + 1f2ef08: e1a04224 lsr r4, r4, #4 + 1f2ef0c: e2844001 add r4, r4, #1 + 1f2ef10: e1a07204 lsl r7, r4, #4 + 1f2ef14: 9a000019 bls 1f2ef80 + 1f2ef18: e06e5002 rsb r5, lr, r2 + 1f2ef1c: e083b002 add fp, r3, r2 + 1f2ef20: e0892002 add r2, r9, r2 + 1f2ef24: e58d200c str r2, [sp, #12] + 1f2ef28: e3a02000 mov r2, #0 + 1f2ef2c: e58d2008 str r2, [sp, #8] + 1f2ef30: e58d302c str r3, [sp, #44] ; 0x2c + 1f2ef34: e0895005 add r5, r9, r5 + 1f2ef38: e59d200c ldr r2, [sp, #12] + 1f2ef3c: e59d3008 ldr r3, [sp, #8] + 1f2ef40: f4652a0f vld1.8 {d18-d19}, [r5] + 1f2ef44: e2833001 add r3, r3, #1 + 1f2ef48: f46b0adf vld1.64 {d16-d17}, [fp :64] + 1f2ef4c: e1530004 cmp r3, r4 + 1f2ef50: e2855010 add r5, r5, #16 + 1f2ef54: e58d3008 str r3, [sp, #8] + 1f2ef58: e28bb010 add fp, fp, #16 + 1f2ef5c: f3cf2072 vshr.u8 q9, q9, #1 + 1f2ef60: f24208e0 vadd.i8 q8, q9, q8 + 1f2ef64: f4420a0f vst1.8 {d16-d17}, [r2] + 1f2ef68: e2822010 add r2, r2, #16 + 1f2ef6c: 3afffff3 bcc 1f2ef40 + 1f2ef70: e1560007 cmp r6, r7 + 1f2ef74: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f2ef78: e0811007 add r1, r1, r7 + 1f2ef7c: 0a000074 beq 1f2f154 + 1f2ef80: e06e5001 rsb r5, lr, r1 + 1f2ef84: e2812001 add r2, r1, #1 + 1f2ef88: e7d34001 ldrb r4, [r3, r1] + 1f2ef8c: e15a0002 cmp sl, r2 + 1f2ef90: e7d95005 ldrb r5, [r9, r5] + 1f2ef94: e08440a5 add r4, r4, r5, lsr #1 + 1f2ef98: e7c94001 strb r4, [r9, r1] + 1f2ef9c: da00006c ble 1f2f154 + 1f2efa0: e06e6002 rsb r6, lr, r2 + 1f2efa4: e2814002 add r4, r1, #2 + 1f2efa8: e7d35002 ldrb r5, [r3, r2] + 1f2efac: e15a0004 cmp sl, r4 + 1f2efb0: e7d96006 ldrb r6, [r9, r6] + 1f2efb4: e08550a6 add r5, r5, r6, lsr #1 + 1f2efb8: e7c95002 strb r5, [r9, r2] + 1f2efbc: da000064 ble 1f2f154 + 1f2efc0: e06e6004 rsb r6, lr, r4 + 1f2efc4: e2812003 add r2, r1, #3 + 1f2efc8: e7d35004 ldrb r5, [r3, r4] + 1f2efcc: e15a0002 cmp sl, r2 + 1f2efd0: e7d96006 ldrb r6, [r9, r6] + 1f2efd4: e08550a6 add r5, r5, r6, lsr #1 + 1f2efd8: e7c95004 strb r5, [r9, r4] + 1f2efdc: da00005c ble 1f2f154 + 1f2efe0: e06e6002 rsb r6, lr, r2 + 1f2efe4: e2814004 add r4, r1, #4 + 1f2efe8: e7d35002 ldrb r5, [r3, r2] + 1f2efec: e15a0004 cmp sl, r4 + 1f2eff0: e7d96006 ldrb r6, [r9, r6] + 1f2eff4: e08550a6 add r5, r5, r6, lsr #1 + 1f2eff8: e7c95002 strb r5, [r9, r2] + 1f2effc: da000054 ble 1f2f154 + 1f2f000: e06e6004 rsb r6, lr, r4 + 1f2f004: e2812005 add r2, r1, #5 + 1f2f008: e7d35004 ldrb r5, [r3, r4] + 1f2f00c: e15a0002 cmp sl, r2 + 1f2f010: e7d96006 ldrb r6, [r9, r6] + 1f2f014: e08550a6 add r5, r5, r6, lsr #1 + 1f2f018: e7c95004 strb r5, [r9, r4] + 1f2f01c: da00004c ble 1f2f154 + 1f2f020: e06e6002 rsb r6, lr, r2 + 1f2f024: e2814006 add r4, r1, #6 + 1f2f028: e7d35002 ldrb r5, [r3, r2] + 1f2f02c: e15a0004 cmp sl, r4 + 1f2f030: e7d96006 ldrb r6, [r9, r6] + 1f2f034: e08550a6 add r5, r5, r6, lsr #1 + 1f2f038: e7c95002 strb r5, [r9, r2] + 1f2f03c: da000044 ble 1f2f154 + 1f2f040: e06e6004 rsb r6, lr, r4 + 1f2f044: e2812007 add r2, r1, #7 + 1f2f048: e7d35004 ldrb r5, [r3, r4] + 1f2f04c: e15a0002 cmp sl, r2 + 1f2f050: e7d96006 ldrb r6, [r9, r6] + 1f2f054: e08550a6 add r5, r5, r6, lsr #1 + 1f2f058: e7c95004 strb r5, [r9, r4] + 1f2f05c: da00003c ble 1f2f154 + 1f2f060: e06e6002 rsb r6, lr, r2 + 1f2f064: e2814008 add r4, r1, #8 + 1f2f068: e7d35002 ldrb r5, [r3, r2] + 1f2f06c: e15a0004 cmp sl, r4 + 1f2f070: e7d96006 ldrb r6, [r9, r6] + 1f2f074: e08550a6 add r5, r5, r6, lsr #1 + 1f2f078: e7c95002 strb r5, [r9, r2] + 1f2f07c: da000034 ble 1f2f154 + 1f2f080: e06e6004 rsb r6, lr, r4 + 1f2f084: e2812009 add r2, r1, #9 + 1f2f088: e7d35004 ldrb r5, [r3, r4] + 1f2f08c: e15a0002 cmp sl, r2 + 1f2f090: e7d96006 ldrb r6, [r9, r6] + 1f2f094: e08550a6 add r5, r5, r6, lsr #1 + 1f2f098: e7c95004 strb r5, [r9, r4] + 1f2f09c: da00002c ble 1f2f154 + 1f2f0a0: e06e6002 rsb r6, lr, r2 + 1f2f0a4: e281400a add r4, r1, #10 + 1f2f0a8: e7d35002 ldrb r5, [r3, r2] + 1f2f0ac: e15a0004 cmp sl, r4 + 1f2f0b0: e7d96006 ldrb r6, [r9, r6] + 1f2f0b4: e08550a6 add r5, r5, r6, lsr #1 + 1f2f0b8: e7c95002 strb r5, [r9, r2] + 1f2f0bc: da000024 ble 1f2f154 + 1f2f0c0: e06e6004 rsb r6, lr, r4 + 1f2f0c4: e281200b add r2, r1, #11 + 1f2f0c8: e7d35004 ldrb r5, [r3, r4] + 1f2f0cc: e15a0002 cmp sl, r2 + 1f2f0d0: e7d96006 ldrb r6, [r9, r6] + 1f2f0d4: e08550a6 add r5, r5, r6, lsr #1 + 1f2f0d8: e7c95004 strb r5, [r9, r4] + 1f2f0dc: da00001c ble 1f2f154 + 1f2f0e0: e06e6002 rsb r6, lr, r2 + 1f2f0e4: e281400c add r4, r1, #12 + 1f2f0e8: e7d35002 ldrb r5, [r3, r2] + 1f2f0ec: e15a0004 cmp sl, r4 + 1f2f0f0: e7d96006 ldrb r6, [r9, r6] + 1f2f0f4: e08550a6 add r5, r5, r6, lsr #1 + 1f2f0f8: e7c95002 strb r5, [r9, r2] + 1f2f0fc: da000014 ble 1f2f154 + 1f2f100: e06e6004 rsb r6, lr, r4 + 1f2f104: e281200d add r2, r1, #13 + 1f2f108: e7d35004 ldrb r5, [r3, r4] + 1f2f10c: e15a0002 cmp sl, r2 + 1f2f110: e7d96006 ldrb r6, [r9, r6] + 1f2f114: e08550a6 add r5, r5, r6, lsr #1 + 1f2f118: e7c95004 strb r5, [r9, r4] + 1f2f11c: da00000c ble 1f2f154 + 1f2f120: e06e5002 rsb r5, lr, r2 + 1f2f124: e281100e add r1, r1, #14 + 1f2f128: e7d34002 ldrb r4, [r3, r2] + 1f2f12c: e15a0001 cmp sl, r1 + 1f2f130: e7d95005 ldrb r5, [r9, r5] + 1f2f134: e08440a5 add r4, r4, r5, lsr #1 + 1f2f138: e7c94002 strb r4, [r9, r2] + 1f2f13c: da000004 ble 1f2f154 + 1f2f140: e06e4001 rsb r4, lr, r1 + 1f2f144: e7d32001 ldrb r2, [r3, r1] + 1f2f148: e7d94004 ldrb r4, [r9, r4] + 1f2f14c: e08220a4 add r2, r2, r4, lsr #1 + 1f2f150: e7c92001 strb r2, [r9, r1] + 1f2f154: e2588001 subs r8, r8, #1 + 1f2f158: e3e02000 mvn r2, #0 + 1f2f15c: e083300a add r3, r3, sl + 1f2f160: e7c9200a strb r2, [r9, sl] + 1f2f164: e080000e add r0, r0, lr + 1f2f168: e089900e add r9, r9, lr + 1f2f16c: e08cc00e add ip, ip, lr + 1f2f170: 1afffeeb bne 1f2ed24 + 1f2f174: eafffec2 b 1f2ec84 + 1f2f178: e59db050 ldr fp, [sp, #80] ; 0x50 + 1f2f17c: e35b0000 cmp fp, #0 + 1f2f180: 0afffec3 beq 1f2ec94 + 1f2f184: e59d2020 ldr r2, [sp, #32] + 1f2f188: e58db004 str fp, [sp, #4] + 1f2f18c: e2623000 rsb r3, r2, #0 + 1f2f190: e58d302c str r3, [sp, #44] ; 0x2c + 1f2f194: e1a01003 mov r1, r3 + 1f2f198: e59d3018 ldr r3, [sp, #24] + 1f2f19c: e0890001 add r0, r9, r1 + 1f2f1a0: e1a0c002 mov ip, r2 + 1f2f1a4: e2621010 rsb r1, r2, #16 + 1f2f1a8: e58d1008 str r1, [sp, #8] + 1f2f1ac: e24a1001 sub r1, sl, #1 + 1f2f1b0: e58d1014 str r1, [sp, #20] + 1f2f1b4: e35a0000 cmp sl, #0 + 1f2f1b8: da00016a ble 1f2f768 + 1f2f1bc: e2891010 add r1, r9, #16 + 1f2f1c0: e2882010 add r2, r8, #16 + 1f2f1c4: e1a0e001 mov lr, r1 + 1f2f1c8: e1510000 cmp r1, r0 + 1f2f1cc: 83a01000 movhi r1, #0 + 1f2f1d0: 93a01001 movls r1, #1 + 1f2f1d4: e158000e cmp r8, lr + 1f2f1d8: 31590002 cmpcc r9, r2 + 1f2f1dc: e59d2008 ldr r2, [sp, #8] + 1f2f1e0: 23a04001 movcs r4, #1 + 1f2f1e4: 33a04000 movcc r4, #0 + 1f2f1e8: e3520000 cmp r2, #0 + 1f2f1ec: c1a02001 movgt r2, r1 + 1f2f1f0: d3812001 orrle r2, r1, #1 + 1f2f1f4: e2831010 add r1, r3, #16 + 1f2f1f8: e153000e cmp r3, lr + 1f2f1fc: 31590001 cmpcc r9, r1 + 1f2f200: e0022004 and r2, r2, r4 + 1f2f204: 23a01001 movcs r1, #1 + 1f2f208: 33a01000 movcc r1, #0 + 1f2f20c: e35a0011 cmp sl, #17 + 1f2f210: 93a02000 movls r2, #0 + 1f2f214: 82022001 andhi r2, r2, #1 + 1f2f218: e1120001 tst r2, r1 + 1f2f21c: 0a0004b2 beq 1f304ec + 1f2f220: e2032007 and r2, r3, #7 + 1f2f224: e2622000 rsb r2, r2, #0 + 1f2f228: e202200f and r2, r2, #15 + 1f2f22c: e152000a cmp r2, sl + 1f2f230: 21a0200a movcs r2, sl + 1f2f234: e3520000 cmp r2, #0 + 1f2f238: 0a00048f beq 1f3047c + 1f2f23c: e59de02c ldr lr, [sp, #44] ; 0x2c + 1f2f240: e3520001 cmp r2, #1 + 1f2f244: e5d81000 ldrb r1, [r8] + 1f2f248: e7d9400e ldrb r4, [r9, lr] + 1f2f24c: e5d3e000 ldrb lr, [r3] + 1f2f250: e0811004 add r1, r1, r4 + 1f2f254: e08e10c1 add r1, lr, r1, asr #1 + 1f2f258: e5c91000 strb r1, [r9] + 1f2f25c: 0a000486 beq 1f3047c + 1f2f260: e5d81001 ldrb r1, [r8, #1] + 1f2f264: e3520002 cmp r2, #2 + 1f2f268: e5d04001 ldrb r4, [r0, #1] + 1f2f26c: e5d3e001 ldrb lr, [r3, #1] + 1f2f270: e0811004 add r1, r1, r4 + 1f2f274: e08e10c1 add r1, lr, r1, asr #1 + 1f2f278: e5c91001 strb r1, [r9, #1] + 1f2f27c: 0a00047e beq 1f3047c + 1f2f280: e5d81002 ldrb r1, [r8, #2] + 1f2f284: e3520003 cmp r2, #3 + 1f2f288: e5d04002 ldrb r4, [r0, #2] + 1f2f28c: e5d3e002 ldrb lr, [r3, #2] + 1f2f290: e0811004 add r1, r1, r4 + 1f2f294: e08e10c1 add r1, lr, r1, asr #1 + 1f2f298: e5c91002 strb r1, [r9, #2] + 1f2f29c: 0a000476 beq 1f3047c + 1f2f2a0: e5d81003 ldrb r1, [r8, #3] + 1f2f2a4: e3520004 cmp r2, #4 + 1f2f2a8: e5d04003 ldrb r4, [r0, #3] + 1f2f2ac: e5d3e003 ldrb lr, [r3, #3] + 1f2f2b0: e0811004 add r1, r1, r4 + 1f2f2b4: e08e10c1 add r1, lr, r1, asr #1 + 1f2f2b8: e5c91003 strb r1, [r9, #3] + 1f2f2bc: 0a00046e beq 1f3047c + 1f2f2c0: e5d81004 ldrb r1, [r8, #4] + 1f2f2c4: e3520005 cmp r2, #5 + 1f2f2c8: e5d04004 ldrb r4, [r0, #4] + 1f2f2cc: e5d3e004 ldrb lr, [r3, #4] + 1f2f2d0: e0811004 add r1, r1, r4 + 1f2f2d4: e08e10c1 add r1, lr, r1, asr #1 + 1f2f2d8: e5c91004 strb r1, [r9, #4] + 1f2f2dc: 0a000466 beq 1f3047c + 1f2f2e0: e5d81005 ldrb r1, [r8, #5] + 1f2f2e4: e3520006 cmp r2, #6 + 1f2f2e8: e5d04005 ldrb r4, [r0, #5] + 1f2f2ec: e5d3e005 ldrb lr, [r3, #5] + 1f2f2f0: e0811004 add r1, r1, r4 + 1f2f2f4: e08e10c1 add r1, lr, r1, asr #1 + 1f2f2f8: e5c91005 strb r1, [r9, #5] + 1f2f2fc: 0a00045e beq 1f3047c + 1f2f300: e5d81006 ldrb r1, [r8, #6] + 1f2f304: e3520007 cmp r2, #7 + 1f2f308: e5d04006 ldrb r4, [r0, #6] + 1f2f30c: e5d3e006 ldrb lr, [r3, #6] + 1f2f310: e0811004 add r1, r1, r4 + 1f2f314: e08e10c1 add r1, lr, r1, asr #1 + 1f2f318: e5c91006 strb r1, [r9, #6] + 1f2f31c: 0a000753 beq 1f31070 + 1f2f320: e5d81007 ldrb r1, [r8, #7] + 1f2f324: e3520008 cmp r2, #8 + 1f2f328: e5d04007 ldrb r4, [r0, #7] + 1f2f32c: e5d3e007 ldrb lr, [r3, #7] + 1f2f330: e0811004 add r1, r1, r4 + 1f2f334: e08e10c1 add r1, lr, r1, asr #1 + 1f2f338: e5c91007 strb r1, [r9, #7] + 1f2f33c: 0a00044e beq 1f3047c + 1f2f340: e5d81008 ldrb r1, [r8, #8] + 1f2f344: e3520009 cmp r2, #9 + 1f2f348: e5d04008 ldrb r4, [r0, #8] + 1f2f34c: e5d3e008 ldrb lr, [r3, #8] + 1f2f350: e0811004 add r1, r1, r4 + 1f2f354: e08e10c1 add r1, lr, r1, asr #1 + 1f2f358: e5c91008 strb r1, [r9, #8] + 1f2f35c: 0a000446 beq 1f3047c + 1f2f360: e5d81009 ldrb r1, [r8, #9] + 1f2f364: e352000a cmp r2, #10 + 1f2f368: e5d04009 ldrb r4, [r0, #9] + 1f2f36c: e5d3e009 ldrb lr, [r3, #9] + 1f2f370: e0811004 add r1, r1, r4 + 1f2f374: e08e10c1 add r1, lr, r1, asr #1 + 1f2f378: e5c91009 strb r1, [r9, #9] + 1f2f37c: 0a00043e beq 1f3047c + 1f2f380: e5d8100a ldrb r1, [r8, #10] + 1f2f384: e352000b cmp r2, #11 + 1f2f388: e5d0400a ldrb r4, [r0, #10] + 1f2f38c: e5d3e00a ldrb lr, [r3, #10] + 1f2f390: e0811004 add r1, r1, r4 + 1f2f394: e08e10c1 add r1, lr, r1, asr #1 + 1f2f398: e5c9100a strb r1, [r9, #10] + 1f2f39c: 0a000436 beq 1f3047c + 1f2f3a0: e5d8100b ldrb r1, [r8, #11] + 1f2f3a4: e352000c cmp r2, #12 + 1f2f3a8: e5d0400b ldrb r4, [r0, #11] + 1f2f3ac: e5d3e00b ldrb lr, [r3, #11] + 1f2f3b0: e0811004 add r1, r1, r4 + 1f2f3b4: e08e10c1 add r1, lr, r1, asr #1 + 1f2f3b8: e5c9100b strb r1, [r9, #11] + 1f2f3bc: 0a00042e beq 1f3047c + 1f2f3c0: e5d8100c ldrb r1, [r8, #12] + 1f2f3c4: e352000d cmp r2, #13 + 1f2f3c8: e5d0400c ldrb r4, [r0, #12] + 1f2f3cc: e5d3e00c ldrb lr, [r3, #12] + 1f2f3d0: e0811004 add r1, r1, r4 + 1f2f3d4: e08e10c1 add r1, lr, r1, asr #1 + 1f2f3d8: e5c9100c strb r1, [r9, #12] + 1f2f3dc: 0a000426 beq 1f3047c + 1f2f3e0: e5d8100d ldrb r1, [r8, #13] + 1f2f3e4: e352000e cmp r2, #14 + 1f2f3e8: e5d0400d ldrb r4, [r0, #13] + 1f2f3ec: e5d3e00d ldrb lr, [r3, #13] + 1f2f3f0: e0811004 add r1, r1, r4 + 1f2f3f4: e08e10c1 add r1, lr, r1, asr #1 + 1f2f3f8: e5c9100d strb r1, [r9, #13] + 1f2f3fc: 0a00041e beq 1f3047c + 1f2f400: e5d8e00e ldrb lr, [r8, #14] + 1f2f404: e3a0100f mov r1, #15 + 1f2f408: e5d0400e ldrb r4, [r0, #14] + 1f2f40c: e08e4004 add r4, lr, r4 + 1f2f410: e5d3e00e ldrb lr, [r3, #14] + 1f2f414: e08ee0c4 add lr, lr, r4, asr #1 + 1f2f418: e5c9e00e strb lr, [r9, #14] + 1f2f41c: e59de014 ldr lr, [sp, #20] + 1f2f420: e062500a rsb r5, r2, sl + 1f2f424: e062400e rsb r4, r2, lr + 1f2f428: e245e010 sub lr, r5, #16 + 1f2f42c: e354000e cmp r4, #14 + 1f2f430: e1a0e22e lsr lr, lr, #4 + 1f2f434: e28ee001 add lr, lr, #1 + 1f2f438: e1a0620e lsl r6, lr, #4 + 1f2f43c: 9a000036 bls 1f2f51c + 1f2f440: e06c4002 rsb r4, ip, r2 + 1f2f444: e083b002 add fp, r3, r2 + 1f2f448: e0887002 add r7, r8, r2 + 1f2f44c: e0892002 add r2, r9, r2 + 1f2f450: e58d2010 str r2, [sp, #16] + 1f2f454: e3a02000 mov r2, #0 + 1f2f458: e58d200c str r2, [sp, #12] + 1f2f45c: e0894004 add r4, r9, r4 + 1f2f460: e58d3030 str r3, [sp, #48] ; 0x30 + 1f2f464: e59d2010 ldr r2, [sp, #16] + 1f2f468: e59d300c ldr r3, [sp, #12] + 1f2f46c: f4672a0f vld1.8 {d18-d19}, [r7] + 1f2f470: e2833001 add r3, r3, #1 + 1f2f474: f4640a0f vld1.8 {d16-d17}, [r4] + 1f2f478: e153000e cmp r3, lr + 1f2f47c: e58d300c str r3, [sp, #12] + 1f2f480: e2877010 add r7, r7, #16 + 1f2f484: e2844010 add r4, r4, #16 + 1f2f488: e28bb010 add fp, fp, #16 + 1f2f48c: f3c86a32 vmovl.u8 q11, d18 + 1f2f490: f3c84a30 vmovl.u8 q10, d16 + 1f2f494: f3c82a33 vmovl.u8 q9, d19 + 1f2f498: f3c80a31 vmovl.u8 q8, d17 + 1f2f49c: f3d0ca36 vmovl.u16 q14, d22 + 1f2f4a0: f3d08a34 vmovl.u16 q12, d20 + 1f2f4a4: f3d06a37 vmovl.u16 q11, d23 + 1f2f4a8: f3d0aa32 vmovl.u16 q13, d18 + 1f2f4ac: f3d04a35 vmovl.u16 q10, d21 + 1f2f4b0: f3d02a33 vmovl.u16 q9, d19 + 1f2f4b4: f26cc8e8 vadd.i32 q14, q14, q12 + 1f2f4b8: f3d08a30 vmovl.u16 q12, d16 + 1f2f4bc: f3d00a31 vmovl.u16 q8, d17 + 1f2f4c0: f26648e4 vadd.i32 q10, q11, q10 + 1f2f4c4: f2ffc07c vshr.s32 q14, q14, #1 + 1f2f4c8: f26a68e8 vadd.i32 q11, q13, q12 + 1f2f4cc: ed5b8b04 vldr d24, [fp, #-16] + 1f2f4d0: ed5b9b02 vldr d25, [fp, #-8] + 1f2f4d4: f26208e0 vadd.i32 q8, q9, q8 + 1f2f4d8: f2ff2074 vshr.s32 q9, q10, #1 + 1f2f4dc: f2ff4076 vshr.s32 q10, q11, #1 + 1f2f4e0: f2ff0070 vshr.s32 q8, q8, #1 + 1f2f4e4: f3f6622c vmovn.i32 d22, q14 + 1f2f4e8: f3f67222 vmovn.i32 d23, q9 + 1f2f4ec: f3f62224 vmovn.i32 d18, q10 + 1f2f4f0: f3f63220 vmovn.i32 d19, q8 + 1f2f4f4: f3f20226 vmovn.i16 d16, q11 + 1f2f4f8: f3f21222 vmovn.i16 d17, q9 + 1f2f4fc: f24008e8 vadd.i8 q8, q8, q12 + 1f2f500: f4420a0f vst1.8 {d16-d17}, [r2] + 1f2f504: e2822010 add r2, r2, #16 + 1f2f508: 3affffd7 bcc 1f2f46c + 1f2f50c: e1550006 cmp r5, r6 + 1f2f510: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f2f514: e0811006 add r1, r1, r6 + 1f2f518: 0a000092 beq 1f2f768 + 1f2f51c: e06ce001 rsb lr, ip, r1 + 1f2f520: e7d84001 ldrb r4, [r8, r1] + 1f2f524: e2812001 add r2, r1, #1 + 1f2f528: e15a0002 cmp sl, r2 + 1f2f52c: e7d9e00e ldrb lr, [r9, lr] + 1f2f530: e08e4004 add r4, lr, r4 + 1f2f534: e7d3e001 ldrb lr, [r3, r1] + 1f2f538: e08ee0c4 add lr, lr, r4, asr #1 + 1f2f53c: e7c9e001 strb lr, [r9, r1] + 1f2f540: da000088 ble 1f2f768 + 1f2f544: e06c4002 rsb r4, ip, r2 + 1f2f548: e7d85002 ldrb r5, [r8, r2] + 1f2f54c: e281e002 add lr, r1, #2 + 1f2f550: e15a000e cmp sl, lr + 1f2f554: e7d94004 ldrb r4, [r9, r4] + 1f2f558: e0845005 add r5, r4, r5 + 1f2f55c: e7d34002 ldrb r4, [r3, r2] + 1f2f560: e08440c5 add r4, r4, r5, asr #1 + 1f2f564: e7c94002 strb r4, [r9, r2] + 1f2f568: da00007e ble 1f2f768 + 1f2f56c: e06c400e rsb r4, ip, lr + 1f2f570: e7d8500e ldrb r5, [r8, lr] + 1f2f574: e2812003 add r2, r1, #3 + 1f2f578: e15a0002 cmp sl, r2 + 1f2f57c: e7d94004 ldrb r4, [r9, r4] + 1f2f580: e0845005 add r5, r4, r5 + 1f2f584: e7d3400e ldrb r4, [r3, lr] + 1f2f588: e08440c5 add r4, r4, r5, asr #1 + 1f2f58c: e7c9400e strb r4, [r9, lr] + 1f2f590: da000074 ble 1f2f768 + 1f2f594: e06c4002 rsb r4, ip, r2 + 1f2f598: e7d85002 ldrb r5, [r8, r2] + 1f2f59c: e281e004 add lr, r1, #4 + 1f2f5a0: e15a000e cmp sl, lr + 1f2f5a4: e7d94004 ldrb r4, [r9, r4] + 1f2f5a8: e0845005 add r5, r4, r5 + 1f2f5ac: e7d34002 ldrb r4, [r3, r2] + 1f2f5b0: e08440c5 add r4, r4, r5, asr #1 + 1f2f5b4: e7c94002 strb r4, [r9, r2] + 1f2f5b8: da00006a ble 1f2f768 + 1f2f5bc: e06c400e rsb r4, ip, lr + 1f2f5c0: e7d8500e ldrb r5, [r8, lr] + 1f2f5c4: e2812005 add r2, r1, #5 + 1f2f5c8: e15a0002 cmp sl, r2 + 1f2f5cc: e7d94004 ldrb r4, [r9, r4] + 1f2f5d0: e0845005 add r5, r4, r5 + 1f2f5d4: e7d3400e ldrb r4, [r3, lr] + 1f2f5d8: e08440c5 add r4, r4, r5, asr #1 + 1f2f5dc: e7c9400e strb r4, [r9, lr] + 1f2f5e0: da000060 ble 1f2f768 + 1f2f5e4: e06c4002 rsb r4, ip, r2 + 1f2f5e8: e7d85002 ldrb r5, [r8, r2] + 1f2f5ec: e281e006 add lr, r1, #6 + 1f2f5f0: e15a000e cmp sl, lr + 1f2f5f4: e7d94004 ldrb r4, [r9, r4] + 1f2f5f8: e0845005 add r5, r4, r5 + 1f2f5fc: e7d34002 ldrb r4, [r3, r2] + 1f2f600: e08440c5 add r4, r4, r5, asr #1 + 1f2f604: e7c94002 strb r4, [r9, r2] + 1f2f608: da000056 ble 1f2f768 + 1f2f60c: e06c400e rsb r4, ip, lr + 1f2f610: e7d8500e ldrb r5, [r8, lr] + 1f2f614: e2812007 add r2, r1, #7 + 1f2f618: e15a0002 cmp sl, r2 + 1f2f61c: e7d94004 ldrb r4, [r9, r4] + 1f2f620: e0845005 add r5, r4, r5 + 1f2f624: e7d3400e ldrb r4, [r3, lr] + 1f2f628: e08440c5 add r4, r4, r5, asr #1 + 1f2f62c: e7c9400e strb r4, [r9, lr] + 1f2f630: da00004c ble 1f2f768 + 1f2f634: e06c4002 rsb r4, ip, r2 + 1f2f638: e7d85002 ldrb r5, [r8, r2] + 1f2f63c: e281e008 add lr, r1, #8 + 1f2f640: e15a000e cmp sl, lr + 1f2f644: e7d94004 ldrb r4, [r9, r4] + 1f2f648: e0845005 add r5, r4, r5 + 1f2f64c: e7d34002 ldrb r4, [r3, r2] + 1f2f650: e08440c5 add r4, r4, r5, asr #1 + 1f2f654: e7c94002 strb r4, [r9, r2] + 1f2f658: da000042 ble 1f2f768 + 1f2f65c: e06c400e rsb r4, ip, lr + 1f2f660: e7d8500e ldrb r5, [r8, lr] + 1f2f664: e2812009 add r2, r1, #9 + 1f2f668: e15a0002 cmp sl, r2 + 1f2f66c: e7d94004 ldrb r4, [r9, r4] + 1f2f670: e0845005 add r5, r4, r5 + 1f2f674: e7d3400e ldrb r4, [r3, lr] + 1f2f678: e08440c5 add r4, r4, r5, asr #1 + 1f2f67c: e7c9400e strb r4, [r9, lr] + 1f2f680: da000038 ble 1f2f768 + 1f2f684: e06c4002 rsb r4, ip, r2 + 1f2f688: e7d85002 ldrb r5, [r8, r2] + 1f2f68c: e281e00a add lr, r1, #10 + 1f2f690: e15a000e cmp sl, lr + 1f2f694: e7d94004 ldrb r4, [r9, r4] + 1f2f698: e0845005 add r5, r4, r5 + 1f2f69c: e7d34002 ldrb r4, [r3, r2] + 1f2f6a0: e08440c5 add r4, r4, r5, asr #1 + 1f2f6a4: e7c94002 strb r4, [r9, r2] + 1f2f6a8: da00002e ble 1f2f768 + 1f2f6ac: e06c400e rsb r4, ip, lr + 1f2f6b0: e7d8500e ldrb r5, [r8, lr] + 1f2f6b4: e281200b add r2, r1, #11 + 1f2f6b8: e15a0002 cmp sl, r2 + 1f2f6bc: e7d94004 ldrb r4, [r9, r4] + 1f2f6c0: e0845005 add r5, r4, r5 + 1f2f6c4: e7d3400e ldrb r4, [r3, lr] + 1f2f6c8: e08440c5 add r4, r4, r5, asr #1 + 1f2f6cc: e7c9400e strb r4, [r9, lr] + 1f2f6d0: da000024 ble 1f2f768 + 1f2f6d4: e06c4002 rsb r4, ip, r2 + 1f2f6d8: e7d85002 ldrb r5, [r8, r2] + 1f2f6dc: e281e00c add lr, r1, #12 + 1f2f6e0: e15a000e cmp sl, lr + 1f2f6e4: e7d94004 ldrb r4, [r9, r4] + 1f2f6e8: e0845005 add r5, r4, r5 + 1f2f6ec: e7d34002 ldrb r4, [r3, r2] + 1f2f6f0: e08440c5 add r4, r4, r5, asr #1 + 1f2f6f4: e7c94002 strb r4, [r9, r2] + 1f2f6f8: da00001a ble 1f2f768 + 1f2f6fc: e06c400e rsb r4, ip, lr + 1f2f700: e7d8500e ldrb r5, [r8, lr] + 1f2f704: e281200d add r2, r1, #13 + 1f2f708: e15a0002 cmp sl, r2 + 1f2f70c: e7d94004 ldrb r4, [r9, r4] + 1f2f710: e0845005 add r5, r4, r5 + 1f2f714: e7d3400e ldrb r4, [r3, lr] + 1f2f718: e08440c5 add r4, r4, r5, asr #1 + 1f2f71c: e7c9400e strb r4, [r9, lr] + 1f2f720: da000010 ble 1f2f768 + 1f2f724: e06c4002 rsb r4, ip, r2 + 1f2f728: e7d8e002 ldrb lr, [r8, r2] + 1f2f72c: e281100e add r1, r1, #14 + 1f2f730: e7d35002 ldrb r5, [r3, r2] + 1f2f734: e15a0001 cmp sl, r1 + 1f2f738: e7d94004 ldrb r4, [r9, r4] + 1f2f73c: e084e00e add lr, r4, lr + 1f2f740: e08550ce add r5, r5, lr, asr #1 + 1f2f744: e7c95002 strb r5, [r9, r2] + 1f2f748: da000006 ble 1f2f768 + 1f2f74c: e06c2001 rsb r2, ip, r1 + 1f2f750: e7d84001 ldrb r4, [r8, r1] + 1f2f754: e7d3e001 ldrb lr, [r3, r1] + 1f2f758: e7d92002 ldrb r2, [r9, r2] + 1f2f75c: e0822004 add r2, r2, r4 + 1f2f760: e08e20c2 add r2, lr, r2, asr #1 + 1f2f764: e7c92001 strb r2, [r9, r1] + 1f2f768: e59d2004 ldr r2, [sp, #4] + 1f2f76c: e083300a add r3, r3, sl + 1f2f770: e088800c add r8, r8, ip + 1f2f774: e080000c add r0, r0, ip + 1f2f778: e2522001 subs r2, r2, #1 + 1f2f77c: e58d2004 str r2, [sp, #4] + 1f2f780: e3e02000 mvn r2, #0 + 1f2f784: e7c9200a strb r2, [r9, sl] + 1f2f788: e089900c add r9, r9, ip + 1f2f78c: 1afffe88 bne 1f2f1b4 + 1f2f790: eafffd3b b 1f2ec84 + 1f2f794: e59db050 ldr fp, [sp, #80] ; 0x50 + 1f2f798: e35b0000 cmp fp, #0 + 1f2f79c: 0afffd3c beq 1f2ec94 + 1f2f7a0: e59d3018 ldr r3, [sp, #24] + 1f2f7a4: e24a2001 sub r2, sl, #1 + 1f2f7a8: e59de020 ldr lr, [sp, #32] + 1f2f7ac: e2890010 add r0, r9, #16 + 1f2f7b0: e58d200c str r2, [sp, #12] + 1f2f7b4: e1a0600b mov r6, fp + 1f2f7b8: e35a0000 cmp sl, #0 + 1f2f7bc: da000332 ble 1f3048c + 1f2f7c0: e2881010 add r1, r8, #16 + 1f2f7c4: e2832010 add r2, r3, #16 + 1f2f7c8: e1580000 cmp r8, r0 + 1f2f7cc: 31590001 cmpcc r9, r1 + 1f2f7d0: 23a01001 movcs r1, #1 + 1f2f7d4: 33a01000 movcc r1, #0 + 1f2f7d8: e1530000 cmp r3, r0 + 1f2f7dc: 31590002 cmpcc r9, r2 + 1f2f7e0: 23a02001 movcs r2, #1 + 1f2f7e4: 33a02000 movcc r2, #0 + 1f2f7e8: e0022001 and r2, r2, r1 + 1f2f7ec: e35a0013 cmp sl, #19 + 1f2f7f0: 93a02000 movls r2, #0 + 1f2f7f4: 82022001 andhi r2, r2, #1 + 1f2f7f8: e3520000 cmp r2, #0 + 1f2f7fc: 0a000348 beq 1f30524 + 1f2f800: e2032007 and r2, r3, #7 + 1f2f804: e2622000 rsb r2, r2, #0 + 1f2f808: e202200f and r2, r2, #15 + 1f2f80c: e152000a cmp r2, sl + 1f2f810: 21a0200a movcs r2, sl + 1f2f814: e3520000 cmp r2, #0 + 1f2f818: 0a000313 beq 1f3046c + 1f2f81c: e5d31000 ldrb r1, [r3] + 1f2f820: e3520001 cmp r2, #1 + 1f2f824: e5d8c000 ldrb ip, [r8] + 1f2f828: e081100c add r1, r1, ip + 1f2f82c: e5c91000 strb r1, [r9] + 1f2f830: 0a00030d beq 1f3046c + 1f2f834: e5d31001 ldrb r1, [r3, #1] + 1f2f838: e3520002 cmp r2, #2 + 1f2f83c: e5d8c001 ldrb ip, [r8, #1] + 1f2f840: e081100c add r1, r1, ip + 1f2f844: e5c91001 strb r1, [r9, #1] + 1f2f848: 0a000307 beq 1f3046c + 1f2f84c: e5d31002 ldrb r1, [r3, #2] + 1f2f850: e3520003 cmp r2, #3 + 1f2f854: e5d8c002 ldrb ip, [r8, #2] + 1f2f858: e081100c add r1, r1, ip + 1f2f85c: e5c91002 strb r1, [r9, #2] + 1f2f860: 0a000301 beq 1f3046c + 1f2f864: e5d31003 ldrb r1, [r3, #3] + 1f2f868: e3520004 cmp r2, #4 + 1f2f86c: e5d8c003 ldrb ip, [r8, #3] + 1f2f870: e081100c add r1, r1, ip + 1f2f874: e5c91003 strb r1, [r9, #3] + 1f2f878: 0a0002fb beq 1f3046c + 1f2f87c: e5d31004 ldrb r1, [r3, #4] + 1f2f880: e3520005 cmp r2, #5 + 1f2f884: e5d8c004 ldrb ip, [r8, #4] + 1f2f888: e081100c add r1, r1, ip + 1f2f88c: e5c91004 strb r1, [r9, #4] + 1f2f890: 0a0002f5 beq 1f3046c + 1f2f894: e5d31005 ldrb r1, [r3, #5] + 1f2f898: e3520006 cmp r2, #6 + 1f2f89c: e5d8c005 ldrb ip, [r8, #5] + 1f2f8a0: e081100c add r1, r1, ip + 1f2f8a4: e5c91005 strb r1, [r9, #5] + 1f2f8a8: 0a0002ef beq 1f3046c + 1f2f8ac: e5d31006 ldrb r1, [r3, #6] + 1f2f8b0: e3520007 cmp r2, #7 + 1f2f8b4: e5d8c006 ldrb ip, [r8, #6] + 1f2f8b8: e081100c add r1, r1, ip + 1f2f8bc: e5c91006 strb r1, [r9, #6] + 1f2f8c0: 0a0005f0 beq 1f31088 + 1f2f8c4: e5d31007 ldrb r1, [r3, #7] + 1f2f8c8: e3520008 cmp r2, #8 + 1f2f8cc: e5d8c007 ldrb ip, [r8, #7] + 1f2f8d0: e081100c add r1, r1, ip + 1f2f8d4: e5c91007 strb r1, [r9, #7] + 1f2f8d8: 0a0002e3 beq 1f3046c + 1f2f8dc: e5d31008 ldrb r1, [r3, #8] + 1f2f8e0: e3520009 cmp r2, #9 + 1f2f8e4: e5d8c008 ldrb ip, [r8, #8] + 1f2f8e8: e081100c add r1, r1, ip + 1f2f8ec: e5c91008 strb r1, [r9, #8] + 1f2f8f0: 0a0002dd beq 1f3046c + 1f2f8f4: e5d31009 ldrb r1, [r3, #9] + 1f2f8f8: e352000a cmp r2, #10 + 1f2f8fc: e5d8c009 ldrb ip, [r8, #9] + 1f2f900: e081100c add r1, r1, ip + 1f2f904: e5c91009 strb r1, [r9, #9] + 1f2f908: 0a0002d7 beq 1f3046c + 1f2f90c: e5d3100a ldrb r1, [r3, #10] + 1f2f910: e352000b cmp r2, #11 + 1f2f914: e5d8c00a ldrb ip, [r8, #10] + 1f2f918: e081100c add r1, r1, ip + 1f2f91c: e5c9100a strb r1, [r9, #10] + 1f2f920: 0a0002d1 beq 1f3046c + 1f2f924: e5d3100b ldrb r1, [r3, #11] + 1f2f928: e352000c cmp r2, #12 + 1f2f92c: e5d8c00b ldrb ip, [r8, #11] + 1f2f930: e081100c add r1, r1, ip + 1f2f934: e5c9100b strb r1, [r9, #11] + 1f2f938: 0a0002cb beq 1f3046c + 1f2f93c: e5d3100c ldrb r1, [r3, #12] + 1f2f940: e352000d cmp r2, #13 + 1f2f944: e5d8c00c ldrb ip, [r8, #12] + 1f2f948: e081100c add r1, r1, ip + 1f2f94c: e5c9100c strb r1, [r9, #12] + 1f2f950: 0a0002c5 beq 1f3046c + 1f2f954: e5d3100d ldrb r1, [r3, #13] + 1f2f958: e352000e cmp r2, #14 + 1f2f95c: e5d8c00d ldrb ip, [r8, #13] + 1f2f960: e081100c add r1, r1, ip + 1f2f964: e5c9100d strb r1, [r9, #13] + 1f2f968: 0a0002bf beq 1f3046c + 1f2f96c: e5d3c00e ldrb ip, [r3, #14] + 1f2f970: e3a0100f mov r1, #15 + 1f2f974: e5d8400e ldrb r4, [r8, #14] + 1f2f978: e08cc004 add ip, ip, r4 + 1f2f97c: e5c9c00e strb ip, [r9, #14] + 1f2f980: e59dc00c ldr ip, [sp, #12] + 1f2f984: e062400a rsb r4, r2, sl + 1f2f988: e062500c rsb r5, r2, ip + 1f2f98c: e244c010 sub ip, r4, #16 + 1f2f990: e355000e cmp r5, #14 + 1f2f994: e1a0c22c lsr ip, ip, #4 + 1f2f998: e28cc001 add ip, ip, #1 + 1f2f99c: e1a0520c lsl r5, ip, #4 + 1f2f9a0: 9a000017 bls 1f2fa04 + 1f2f9a4: e083b002 add fp, r3, r2 + 1f2f9a8: e0887002 add r7, r8, r2 + 1f2f9ac: e0892002 add r2, r9, r2 + 1f2f9b0: e58d2008 str r2, [sp, #8] + 1f2f9b4: e3a02000 mov r2, #0 + 1f2f9b8: e58d2004 str r2, [sp, #4] + 1f2f9bc: e58d3010 str r3, [sp, #16] + 1f2f9c0: e59d2008 ldr r2, [sp, #8] + 1f2f9c4: e59d3004 ldr r3, [sp, #4] + 1f2f9c8: f4672a0f vld1.8 {d18-d19}, [r7] + 1f2f9cc: e2833001 add r3, r3, #1 + 1f2f9d0: f46b0adf vld1.64 {d16-d17}, [fp :64] + 1f2f9d4: e153000c cmp r3, ip + 1f2f9d8: e2877010 add r7, r7, #16 + 1f2f9dc: e58d3004 str r3, [sp, #4] + 1f2f9e0: e28bb010 add fp, fp, #16 + 1f2f9e4: f24208e0 vadd.i8 q8, q9, q8 + 1f2f9e8: f4420a0f vst1.8 {d16-d17}, [r2] + 1f2f9ec: e2822010 add r2, r2, #16 + 1f2f9f0: 3afffff4 bcc 1f2f9c8 + 1f2f9f4: e1540005 cmp r4, r5 + 1f2f9f8: e59d3010 ldr r3, [sp, #16] + 1f2f9fc: e0811005 add r1, r1, r5 + 1f2fa00: 0a0002a1 beq 1f3048c + 1f2fa04: e2812001 add r2, r1, #1 + 1f2fa08: e7d3c001 ldrb ip, [r3, r1] + 1f2fa0c: e7d84001 ldrb r4, [r8, r1] + 1f2fa10: e15a0002 cmp sl, r2 + 1f2fa14: e08cc004 add ip, ip, r4 + 1f2fa18: e7c9c001 strb ip, [r9, r1] + 1f2fa1c: da00029a ble 1f3048c + 1f2fa20: e281c002 add ip, r1, #2 + 1f2fa24: e7d34002 ldrb r4, [r3, r2] + 1f2fa28: e7d85002 ldrb r5, [r8, r2] + 1f2fa2c: e15a000c cmp sl, ip + 1f2fa30: e0844005 add r4, r4, r5 + 1f2fa34: e7c94002 strb r4, [r9, r2] + 1f2fa38: da000293 ble 1f3048c + 1f2fa3c: e2812003 add r2, r1, #3 + 1f2fa40: e7d3400c ldrb r4, [r3, ip] + 1f2fa44: e7d8500c ldrb r5, [r8, ip] + 1f2fa48: e15a0002 cmp sl, r2 + 1f2fa4c: e0844005 add r4, r4, r5 + 1f2fa50: e7c9400c strb r4, [r9, ip] + 1f2fa54: da00028c ble 1f3048c + 1f2fa58: e281c004 add ip, r1, #4 + 1f2fa5c: e7d34002 ldrb r4, [r3, r2] + 1f2fa60: e7d85002 ldrb r5, [r8, r2] + 1f2fa64: e15a000c cmp sl, ip + 1f2fa68: e0844005 add r4, r4, r5 + 1f2fa6c: e7c94002 strb r4, [r9, r2] + 1f2fa70: da000285 ble 1f3048c + 1f2fa74: e2812005 add r2, r1, #5 + 1f2fa78: e7d3400c ldrb r4, [r3, ip] + 1f2fa7c: e7d8500c ldrb r5, [r8, ip] + 1f2fa80: e15a0002 cmp sl, r2 + 1f2fa84: e0844005 add r4, r4, r5 + 1f2fa88: e7c9400c strb r4, [r9, ip] + 1f2fa8c: da00027e ble 1f3048c + 1f2fa90: e281c006 add ip, r1, #6 + 1f2fa94: e7d34002 ldrb r4, [r3, r2] + 1f2fa98: e7d85002 ldrb r5, [r8, r2] + 1f2fa9c: e15a000c cmp sl, ip + 1f2faa0: e0844005 add r4, r4, r5 + 1f2faa4: e7c94002 strb r4, [r9, r2] + 1f2faa8: da000277 ble 1f3048c + 1f2faac: e2812007 add r2, r1, #7 + 1f2fab0: e7d3400c ldrb r4, [r3, ip] + 1f2fab4: e7d8500c ldrb r5, [r8, ip] + 1f2fab8: e15a0002 cmp sl, r2 + 1f2fabc: e0844005 add r4, r4, r5 + 1f2fac0: e7c9400c strb r4, [r9, ip] + 1f2fac4: da000270 ble 1f3048c + 1f2fac8: e281c008 add ip, r1, #8 + 1f2facc: e7d34002 ldrb r4, [r3, r2] + 1f2fad0: e7d85002 ldrb r5, [r8, r2] + 1f2fad4: e15a000c cmp sl, ip + 1f2fad8: e0844005 add r4, r4, r5 + 1f2fadc: e7c94002 strb r4, [r9, r2] + 1f2fae0: da000269 ble 1f3048c + 1f2fae4: e2812009 add r2, r1, #9 + 1f2fae8: e7d3400c ldrb r4, [r3, ip] + 1f2faec: e7d8500c ldrb r5, [r8, ip] + 1f2faf0: e15a0002 cmp sl, r2 + 1f2faf4: e0844005 add r4, r4, r5 + 1f2faf8: e7c9400c strb r4, [r9, ip] + 1f2fafc: da000262 ble 1f3048c + 1f2fb00: e281c00a add ip, r1, #10 + 1f2fb04: e7d34002 ldrb r4, [r3, r2] + 1f2fb08: e7d85002 ldrb r5, [r8, r2] + 1f2fb0c: e15a000c cmp sl, ip + 1f2fb10: e0844005 add r4, r4, r5 + 1f2fb14: e7c94002 strb r4, [r9, r2] + 1f2fb18: da00025b ble 1f3048c + 1f2fb1c: e281200b add r2, r1, #11 + 1f2fb20: e7d3400c ldrb r4, [r3, ip] + 1f2fb24: e7d8500c ldrb r5, [r8, ip] + 1f2fb28: e15a0002 cmp sl, r2 + 1f2fb2c: e0844005 add r4, r4, r5 + 1f2fb30: e7c9400c strb r4, [r9, ip] + 1f2fb34: da000254 ble 1f3048c + 1f2fb38: e281c00c add ip, r1, #12 + 1f2fb3c: e7d34002 ldrb r4, [r3, r2] + 1f2fb40: e7d85002 ldrb r5, [r8, r2] + 1f2fb44: e15a000c cmp sl, ip + 1f2fb48: e0844005 add r4, r4, r5 + 1f2fb4c: e7c94002 strb r4, [r9, r2] + 1f2fb50: da00024d ble 1f3048c + 1f2fb54: e281200d add r2, r1, #13 + 1f2fb58: e7d3400c ldrb r4, [r3, ip] + 1f2fb5c: e7d8500c ldrb r5, [r8, ip] + 1f2fb60: e15a0002 cmp sl, r2 + 1f2fb64: e0844005 add r4, r4, r5 + 1f2fb68: e7c9400c strb r4, [r9, ip] + 1f2fb6c: da000246 ble 1f3048c + 1f2fb70: e281100e add r1, r1, #14 + 1f2fb74: e7d3c002 ldrb ip, [r3, r2] + 1f2fb78: e7d84002 ldrb r4, [r8, r2] + 1f2fb7c: e15a0001 cmp sl, r1 + 1f2fb80: e08cc004 add ip, ip, r4 + 1f2fb84: e7c9c002 strb ip, [r9, r2] + 1f2fb88: da00023f ble 1f3048c + 1f2fb8c: e7d32001 ldrb r2, [r3, r1] + 1f2fb90: e083300a add r3, r3, sl + 1f2fb94: e7d8c001 ldrb ip, [r8, r1] + 1f2fb98: e082200c add r2, r2, ip + 1f2fb9c: e7c92001 strb r2, [r9, r1] + 1f2fba0: ea00023a b 1f30490 + 1f2fba4: e59d3050 ldr r3, [sp, #80] ; 0x50 + 1f2fba8: e3530000 cmp r3, #0 + 1f2fbac: 0afffc38 beq 1f2ec94 + 1f2fbb0: e59d2018 ldr r2, [sp, #24] + 1f2fbb4: e58d3044 str r3, [sp, #68] ; 0x44 + 1f2fbb8: e59d3020 ldr r3, [sp, #32] + 1f2fbbc: e2422001 sub r2, r2, #1 + 1f2fbc0: e58d9034 str r9, [sp, #52] ; 0x34 + 1f2fbc4: e2633000 rsb r3, r3, #0 + 1f2fbc8: e58d2030 str r2, [sp, #48] ; 0x30 + 1f2fbcc: e58d3058 str r3, [sp, #88] ; 0x58 + 1f2fbd0: e58d8038 str r8, [sp, #56] ; 0x38 + 1f2fbd4: e58da02c str sl, [sp, #44] ; 0x2c + 1f2fbd8: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f2fbdc: e3530000 cmp r3, #0 + 1f2fbe0: da00002b ble 1f2fc94 + 1f2fbe4: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f2fbe8: e59d0038 ldr r0, [sp, #56] ; 0x38 + 1f2fbec: e59d2058 ldr r2, [sp, #88] ; 0x58 + 1f2fbf0: e1a09003 mov r9, r3 + 1f2fbf4: e2401001 sub r1, r0, #1 + 1f2fbf8: e0835002 add r5, r3, r2 + 1f2fbfc: e0802002 add r2, r0, r2 + 1f2fc00: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f2fc04: e1a06005 mov r6, r5 + 1f2fc08: e0833000 add r3, r3, r0 + 1f2fc0c: e58d3014 str r3, [sp, #20] + 1f2fc10: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f2fc14: e5f17001 ldrb r7, [r1, #1]! + 1f2fc18: e4d65001 ldrb r5, [r6], #1 + 1f2fc1c: e4d28001 ldrb r8, [r2], #1 + 1f2fc20: e0854007 add r4, r5, r7 + 1f2fc24: e58d200c str r2, [sp, #12] + 1f2fc28: e0684004 rsb r4, r8, r4 + 1f2fc2c: e5f32001 ldrb r2, [r3, #1]! + 1f2fc30: e0650004 rsb r0, r5, r4 + 1f2fc34: e58d1010 str r1, [sp, #16] + 1f2fc38: e98d000c stmib sp, {r2, r3} + 1f2fc3c: eb003a09 bl 1f3e468 + 1f2fc40: e1a0a000 mov sl, r0 + 1f2fc44: e0670004 rsb r0, r7, r4 + 1f2fc48: eb003a06 bl 1f3e468 + 1f2fc4c: e1a0b000 mov fp, r0 + 1f2fc50: e0680004 rsb r0, r8, r4 + 1f2fc54: eb003a03 bl 1f3e468 + 1f2fc58: e15a000b cmp sl, fp + 1f2fc5c: d15a0000 cmple sl, r0 + 1f2fc60: e59d3008 ldr r3, [sp, #8] + 1f2fc64: e59d200c ldr r2, [sp, #12] + 1f2fc68: e59d1010 ldr r1, [sp, #16] + 1f2fc6c: da000002 ble 1f2fc7c + 1f2fc70: e15b0000 cmp fp, r0 + 1f2fc74: c1a05008 movgt r5, r8 + 1f2fc78: d1a05007 movle r5, r7 + 1f2fc7c: e59d0004 ldr r0, [sp, #4] + 1f2fc80: e0805005 add r5, r0, r5 + 1f2fc84: e59d0014 ldr r0, [sp, #20] + 1f2fc88: e4c95001 strb r5, [r9], #1 + 1f2fc8c: e1500009 cmp r0, r9 + 1f2fc90: 1affffdf bne 1f2fc14 + 1f2fc94: e59d3044 ldr r3, [sp, #68] ; 0x44 + 1f2fc98: e3e01000 mvn r1, #0 + 1f2fc9c: e59d202c ldr r2, [sp, #44] ; 0x2c + 1f2fca0: e2533001 subs r3, r3, #1 + 1f2fca4: e58d3044 str r3, [sp, #68] ; 0x44 + 1f2fca8: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f2fcac: e59d0038 ldr r0, [sp, #56] ; 0x38 + 1f2fcb0: e7c31002 strb r1, [r3, r2] + 1f2fcb4: e59d1020 ldr r1, [sp, #32] + 1f2fcb8: e0833001 add r3, r3, r1 + 1f2fcbc: e58d3034 str r3, [sp, #52] ; 0x34 + 1f2fcc0: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f2fcc4: e0800001 add r0, r0, r1 + 1f2fcc8: e58d0038 str r0, [sp, #56] ; 0x38 + 1f2fccc: e0833002 add r3, r3, r2 + 1f2fcd0: e58d3030 str r3, [sp, #48] ; 0x30 + 1f2fcd4: 1affffbf bne 1f2fbd8 + 1f2fcd8: e1a0a002 mov sl, r2 + 1f2fcdc: e59d3050 ldr r3, [sp, #80] ; 0x50 + 1f2fce0: e59d2018 ldr r2, [sp, #24] + 1f2fce4: e023239a mla r3, sl, r3, r2 + 1f2fce8: e58d3018 str r3, [sp, #24] + 1f2fcec: eafffbe8 b 1f2ec94 + 1f2fcf0: e59db050 ldr fp, [sp, #80] ; 0x50 + 1f2fcf4: e35b0000 cmp fp, #0 + 1f2fcf8: 0afffbe5 beq 1f2ec94 + 1f2fcfc: e59d2020 ldr r2, [sp, #32] + 1f2fd00: e289c010 add ip, r9, #16 + 1f2fd04: e1a0800b mov r8, fp + 1f2fd08: e2623000 rsb r3, r2, #0 + 1f2fd0c: e58d3014 str r3, [sp, #20] + 1f2fd10: e0890003 add r0, r9, r3 + 1f2fd14: e59d3018 ldr r3, [sp, #24] + 1f2fd18: e2621010 rsb r1, r2, #16 + 1f2fd1c: e1a0e002 mov lr, r2 + 1f2fd20: e58d1004 str r1, [sp, #4] + 1f2fd24: e24a1001 sub r1, sl, #1 + 1f2fd28: e58d1010 str r1, [sp, #16] + 1f2fd2c: e35a0000 cmp sl, #0 + 1f2fd30: da000108 ble 1f30158 + 1f2fd34: e15c0000 cmp ip, r0 + 1f2fd38: e59d4004 ldr r4, [sp, #4] + 1f2fd3c: e2832010 add r2, r3, #16 + 1f2fd40: 83a01000 movhi r1, #0 + 1f2fd44: 93a01001 movls r1, #1 + 1f2fd48: e3540000 cmp r4, #0 + 1f2fd4c: d3811001 orrle r1, r1, #1 + 1f2fd50: e153000c cmp r3, ip + 1f2fd54: 31590002 cmpcc r9, r2 + 1f2fd58: 23a02001 movcs r2, #1 + 1f2fd5c: 33a02000 movcc r2, #0 + 1f2fd60: e0022001 and r2, r2, r1 + 1f2fd64: e35a0013 cmp sl, #19 + 1f2fd68: 93a02000 movls r2, #0 + 1f2fd6c: 82022001 andhi r2, r2, #1 + 1f2fd70: e3520000 cmp r2, #0 + 1f2fd74: 0a000208 beq 1f3059c + 1f2fd78: e2032007 and r2, r3, #7 + 1f2fd7c: e2622000 rsb r2, r2, #0 + 1f2fd80: e202200f and r2, r2, #15 + 1f2fd84: e152000a cmp r2, sl + 1f2fd88: 21a0200a movcs r2, sl + 1f2fd8c: e3520000 cmp r2, #0 + 1f2fd90: 0a0001b7 beq 1f30474 + 1f2fd94: e59d4014 ldr r4, [sp, #20] + 1f2fd98: e3520001 cmp r2, #1 + 1f2fd9c: e5d31000 ldrb r1, [r3] + 1f2fda0: e7d94004 ldrb r4, [r9, r4] + 1f2fda4: e0811004 add r1, r1, r4 + 1f2fda8: e5c91000 strb r1, [r9] + 1f2fdac: 0a0001b0 beq 1f30474 + 1f2fdb0: e5d31001 ldrb r1, [r3, #1] + 1f2fdb4: e3520002 cmp r2, #2 + 1f2fdb8: e5d04001 ldrb r4, [r0, #1] + 1f2fdbc: e0811004 add r1, r1, r4 + 1f2fdc0: e5c91001 strb r1, [r9, #1] + 1f2fdc4: 0a0001aa beq 1f30474 + 1f2fdc8: e5d31002 ldrb r1, [r3, #2] + 1f2fdcc: e3520003 cmp r2, #3 + 1f2fdd0: e5d04002 ldrb r4, [r0, #2] + 1f2fdd4: e0811004 add r1, r1, r4 + 1f2fdd8: e5c91002 strb r1, [r9, #2] + 1f2fddc: 0a0001a4 beq 1f30474 + 1f2fde0: e5d31003 ldrb r1, [r3, #3] + 1f2fde4: e3520004 cmp r2, #4 + 1f2fde8: e5d04003 ldrb r4, [r0, #3] + 1f2fdec: e0811004 add r1, r1, r4 + 1f2fdf0: e5c91003 strb r1, [r9, #3] + 1f2fdf4: 0a00019e beq 1f30474 + 1f2fdf8: e5d31004 ldrb r1, [r3, #4] + 1f2fdfc: e3520005 cmp r2, #5 + 1f2fe00: e5d04004 ldrb r4, [r0, #4] + 1f2fe04: e0811004 add r1, r1, r4 + 1f2fe08: e5c91004 strb r1, [r9, #4] + 1f2fe0c: 0a000198 beq 1f30474 + 1f2fe10: e5d31005 ldrb r1, [r3, #5] + 1f2fe14: e3520006 cmp r2, #6 + 1f2fe18: e5d04005 ldrb r4, [r0, #5] + 1f2fe1c: e0811004 add r1, r1, r4 + 1f2fe20: e5c91005 strb r1, [r9, #5] + 1f2fe24: 0a000192 beq 1f30474 + 1f2fe28: e5d31006 ldrb r1, [r3, #6] + 1f2fe2c: e3520007 cmp r2, #7 + 1f2fe30: e5d04006 ldrb r4, [r0, #6] + 1f2fe34: e0811004 add r1, r1, r4 + 1f2fe38: e5c91006 strb r1, [r9, #6] + 1f2fe3c: 0a00048f beq 1f31080 + 1f2fe40: e5d31007 ldrb r1, [r3, #7] + 1f2fe44: e3520008 cmp r2, #8 + 1f2fe48: e5d04007 ldrb r4, [r0, #7] + 1f2fe4c: e0811004 add r1, r1, r4 + 1f2fe50: e5c91007 strb r1, [r9, #7] + 1f2fe54: 0a000186 beq 1f30474 + 1f2fe58: e5d31008 ldrb r1, [r3, #8] + 1f2fe5c: e3520009 cmp r2, #9 + 1f2fe60: e5d04008 ldrb r4, [r0, #8] + 1f2fe64: e0811004 add r1, r1, r4 + 1f2fe68: e5c91008 strb r1, [r9, #8] + 1f2fe6c: 0a000180 beq 1f30474 + 1f2fe70: e5d31009 ldrb r1, [r3, #9] + 1f2fe74: e352000a cmp r2, #10 + 1f2fe78: e5d04009 ldrb r4, [r0, #9] + 1f2fe7c: e0811004 add r1, r1, r4 + 1f2fe80: e5c91009 strb r1, [r9, #9] + 1f2fe84: 0a00017a beq 1f30474 + 1f2fe88: e5d3100a ldrb r1, [r3, #10] + 1f2fe8c: e352000b cmp r2, #11 + 1f2fe90: e5d0400a ldrb r4, [r0, #10] + 1f2fe94: e0811004 add r1, r1, r4 + 1f2fe98: e5c9100a strb r1, [r9, #10] + 1f2fe9c: 0a000174 beq 1f30474 + 1f2fea0: e5d3100b ldrb r1, [r3, #11] + 1f2fea4: e352000c cmp r2, #12 + 1f2fea8: e5d0400b ldrb r4, [r0, #11] + 1f2feac: e0811004 add r1, r1, r4 + 1f2feb0: e5c9100b strb r1, [r9, #11] + 1f2feb4: 0a00016e beq 1f30474 + 1f2feb8: e5d3100c ldrb r1, [r3, #12] + 1f2febc: e352000d cmp r2, #13 + 1f2fec0: e5d0400c ldrb r4, [r0, #12] + 1f2fec4: e0811004 add r1, r1, r4 + 1f2fec8: e5c9100c strb r1, [r9, #12] + 1f2fecc: 0a000168 beq 1f30474 + 1f2fed0: e5d3100d ldrb r1, [r3, #13] + 1f2fed4: e352000e cmp r2, #14 + 1f2fed8: e5d0400d ldrb r4, [r0, #13] + 1f2fedc: e0811004 add r1, r1, r4 + 1f2fee0: e5c9100d strb r1, [r9, #13] + 1f2fee4: 0a000162 beq 1f30474 + 1f2fee8: e5d3400e ldrb r4, [r3, #14] + 1f2feec: e3a0100f mov r1, #15 + 1f2fef0: e5d0500e ldrb r5, [r0, #14] + 1f2fef4: e0844005 add r4, r4, r5 + 1f2fef8: e5c9400e strb r4, [r9, #14] + 1f2fefc: e59d4010 ldr r4, [sp, #16] + 1f2ff00: e062600a rsb r6, r2, sl + 1f2ff04: e0625004 rsb r5, r2, r4 + 1f2ff08: e2464010 sub r4, r6, #16 + 1f2ff0c: e355000e cmp r5, #14 + 1f2ff10: e1a04224 lsr r4, r4, #4 + 1f2ff14: e2844001 add r4, r4, #1 + 1f2ff18: e1a07204 lsl r7, r4, #4 + 1f2ff1c: 9a000018 bls 1f2ff84 + 1f2ff20: e06e5002 rsb r5, lr, r2 + 1f2ff24: e083b002 add fp, r3, r2 + 1f2ff28: e0892002 add r2, r9, r2 + 1f2ff2c: e58d200c str r2, [sp, #12] + 1f2ff30: e3a02000 mov r2, #0 + 1f2ff34: e58d2008 str r2, [sp, #8] + 1f2ff38: e58d302c str r3, [sp, #44] ; 0x2c + 1f2ff3c: e0895005 add r5, r9, r5 + 1f2ff40: e59d200c ldr r2, [sp, #12] + 1f2ff44: e59d3008 ldr r3, [sp, #8] + 1f2ff48: f4652a0f vld1.8 {d18-d19}, [r5] + 1f2ff4c: e2833001 add r3, r3, #1 + 1f2ff50: f46b0adf vld1.64 {d16-d17}, [fp :64] + 1f2ff54: e1530004 cmp r3, r4 + 1f2ff58: e2855010 add r5, r5, #16 + 1f2ff5c: e58d3008 str r3, [sp, #8] + 1f2ff60: e28bb010 add fp, fp, #16 + 1f2ff64: f24208e0 vadd.i8 q8, q9, q8 + 1f2ff68: f4420a0f vst1.8 {d16-d17}, [r2] + 1f2ff6c: e2822010 add r2, r2, #16 + 1f2ff70: 3afffff4 bcc 1f2ff48 + 1f2ff74: e1560007 cmp r6, r7 + 1f2ff78: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f2ff7c: e0811007 add r1, r1, r7 + 1f2ff80: 0a000074 beq 1f30158 + 1f2ff84: e06e4001 rsb r4, lr, r1 + 1f2ff88: e2812001 add r2, r1, #1 + 1f2ff8c: e7d35001 ldrb r5, [r3, r1] + 1f2ff90: e152000a cmp r2, sl + 1f2ff94: e7d94004 ldrb r4, [r9, r4] + 1f2ff98: e0844005 add r4, r4, r5 + 1f2ff9c: e7c94001 strb r4, [r9, r1] + 1f2ffa0: aa00006c bge 1f30158 + 1f2ffa4: e06e5002 rsb r5, lr, r2 + 1f2ffa8: e2814002 add r4, r1, #2 + 1f2ffac: e7d36002 ldrb r6, [r3, r2] + 1f2ffb0: e154000a cmp r4, sl + 1f2ffb4: e7d95005 ldrb r5, [r9, r5] + 1f2ffb8: e0855006 add r5, r5, r6 + 1f2ffbc: e7c95002 strb r5, [r9, r2] + 1f2ffc0: aa000064 bge 1f30158 + 1f2ffc4: e06e5004 rsb r5, lr, r4 + 1f2ffc8: e2812003 add r2, r1, #3 + 1f2ffcc: e7d36004 ldrb r6, [r3, r4] + 1f2ffd0: e152000a cmp r2, sl + 1f2ffd4: e7d95005 ldrb r5, [r9, r5] + 1f2ffd8: e0855006 add r5, r5, r6 + 1f2ffdc: e7c95004 strb r5, [r9, r4] + 1f2ffe0: aa00005c bge 1f30158 + 1f2ffe4: e06e5002 rsb r5, lr, r2 + 1f2ffe8: e2814004 add r4, r1, #4 + 1f2ffec: e7d36002 ldrb r6, [r3, r2] + 1f2fff0: e154000a cmp r4, sl + 1f2fff4: e7d95005 ldrb r5, [r9, r5] + 1f2fff8: e0855006 add r5, r5, r6 + 1f2fffc: e7c95002 strb r5, [r9, r2] + 1f30000: aa000054 bge 1f30158 + 1f30004: e06e5004 rsb r5, lr, r4 + 1f30008: e2812005 add r2, r1, #5 + 1f3000c: e7d36004 ldrb r6, [r3, r4] + 1f30010: e152000a cmp r2, sl + 1f30014: e7d95005 ldrb r5, [r9, r5] + 1f30018: e0855006 add r5, r5, r6 + 1f3001c: e7c95004 strb r5, [r9, r4] + 1f30020: aa00004c bge 1f30158 + 1f30024: e06e5002 rsb r5, lr, r2 + 1f30028: e2814006 add r4, r1, #6 + 1f3002c: e7d36002 ldrb r6, [r3, r2] + 1f30030: e154000a cmp r4, sl + 1f30034: e7d95005 ldrb r5, [r9, r5] + 1f30038: e0855006 add r5, r5, r6 + 1f3003c: e7c95002 strb r5, [r9, r2] + 1f30040: aa000044 bge 1f30158 + 1f30044: e06e5004 rsb r5, lr, r4 + 1f30048: e2812007 add r2, r1, #7 + 1f3004c: e7d36004 ldrb r6, [r3, r4] + 1f30050: e152000a cmp r2, sl + 1f30054: e7d95005 ldrb r5, [r9, r5] + 1f30058: e0855006 add r5, r5, r6 + 1f3005c: e7c95004 strb r5, [r9, r4] + 1f30060: aa00003c bge 1f30158 + 1f30064: e06e5002 rsb r5, lr, r2 + 1f30068: e2814008 add r4, r1, #8 + 1f3006c: e7d36002 ldrb r6, [r3, r2] + 1f30070: e154000a cmp r4, sl + 1f30074: e7d95005 ldrb r5, [r9, r5] + 1f30078: e0855006 add r5, r5, r6 + 1f3007c: e7c95002 strb r5, [r9, r2] + 1f30080: aa000034 bge 1f30158 + 1f30084: e06e5004 rsb r5, lr, r4 + 1f30088: e2812009 add r2, r1, #9 + 1f3008c: e7d36004 ldrb r6, [r3, r4] + 1f30090: e152000a cmp r2, sl + 1f30094: e7d95005 ldrb r5, [r9, r5] + 1f30098: e0855006 add r5, r5, r6 + 1f3009c: e7c95004 strb r5, [r9, r4] + 1f300a0: aa00002c bge 1f30158 + 1f300a4: e06e5002 rsb r5, lr, r2 + 1f300a8: e281400a add r4, r1, #10 + 1f300ac: e7d36002 ldrb r6, [r3, r2] + 1f300b0: e154000a cmp r4, sl + 1f300b4: e7d95005 ldrb r5, [r9, r5] + 1f300b8: e0855006 add r5, r5, r6 + 1f300bc: e7c95002 strb r5, [r9, r2] + 1f300c0: aa000024 bge 1f30158 + 1f300c4: e06e5004 rsb r5, lr, r4 + 1f300c8: e281200b add r2, r1, #11 + 1f300cc: e7d36004 ldrb r6, [r3, r4] + 1f300d0: e152000a cmp r2, sl + 1f300d4: e7d95005 ldrb r5, [r9, r5] + 1f300d8: e0855006 add r5, r5, r6 + 1f300dc: e7c95004 strb r5, [r9, r4] + 1f300e0: aa00001c bge 1f30158 + 1f300e4: e06e5002 rsb r5, lr, r2 + 1f300e8: e281400c add r4, r1, #12 + 1f300ec: e7d36002 ldrb r6, [r3, r2] + 1f300f0: e154000a cmp r4, sl + 1f300f4: e7d95005 ldrb r5, [r9, r5] + 1f300f8: e0855006 add r5, r5, r6 + 1f300fc: e7c95002 strb r5, [r9, r2] + 1f30100: aa000014 bge 1f30158 + 1f30104: e06e5004 rsb r5, lr, r4 + 1f30108: e281200d add r2, r1, #13 + 1f3010c: e7d36004 ldrb r6, [r3, r4] + 1f30110: e152000a cmp r2, sl + 1f30114: e7d95005 ldrb r5, [r9, r5] + 1f30118: e0855006 add r5, r5, r6 + 1f3011c: e7c95004 strb r5, [r9, r4] + 1f30120: aa00000c bge 1f30158 + 1f30124: e06e5002 rsb r5, lr, r2 + 1f30128: e281100e add r1, r1, #14 + 1f3012c: e7d34002 ldrb r4, [r3, r2] + 1f30130: e151000a cmp r1, sl + 1f30134: e7d95005 ldrb r5, [r9, r5] + 1f30138: e0854004 add r4, r5, r4 + 1f3013c: e7c94002 strb r4, [r9, r2] + 1f30140: aa000004 bge 1f30158 + 1f30144: e06e2001 rsb r2, lr, r1 + 1f30148: e7d34001 ldrb r4, [r3, r1] + 1f3014c: e7d92002 ldrb r2, [r9, r2] + 1f30150: e0822004 add r2, r2, r4 + 1f30154: e7c92001 strb r2, [r9, r1] + 1f30158: e2588001 subs r8, r8, #1 + 1f3015c: e3e02000 mvn r2, #0 + 1f30160: e083300a add r3, r3, sl + 1f30164: e7c9200a strb r2, [r9, sl] + 1f30168: e080000e add r0, r0, lr + 1f3016c: e089900e add r9, r9, lr + 1f30170: e08cc00e add ip, ip, lr + 1f30174: 1afffeec bne 1f2fd2c + 1f30178: eafffac1 b 1f2ec84 + 1f3017c: e59dc050 ldr ip, [sp, #80] ; 0x50 + 1f30180: e35c0000 cmp ip, #0 + 1f30184: 0afffac2 beq 1f2ec94 + 1f30188: e59d3018 ldr r3, [sp, #24] + 1f3018c: e24a7001 sub r7, sl, #1 + 1f30190: e59d1020 ldr r1, [sp, #32] + 1f30194: e35a0000 cmp sl, #0 + 1f30198: da0000aa ble 1f30448 + 1f3019c: e2892010 add r2, r9, #16 + 1f301a0: e2830010 add r0, r3, #16 + 1f301a4: e1590000 cmp r9, r0 + 1f301a8: 31530002 cmpcc r3, r2 + 1f301ac: 23a02001 movcs r2, #1 + 1f301b0: 33a02000 movcc r2, #0 + 1f301b4: e35a0015 cmp sl, #21 + 1f301b8: 93a02000 movls r2, #0 + 1f301bc: 82022001 andhi r2, r2, #1 + 1f301c0: e3520000 cmp r2, #0 + 1f301c4: 0a0000e1 beq 1f30550 + 1f301c8: e2032007 and r2, r3, #7 + 1f301cc: e2622000 rsb r2, r2, #0 + 1f301d0: e202200f and r2, r2, #15 + 1f301d4: e152000a cmp r2, sl + 1f301d8: 21a0200a movcs r2, sl + 1f301dc: e3520000 cmp r2, #0 + 1f301e0: 0a0000a7 beq 1f30484 + 1f301e4: e3520001 cmp r2, #1 + 1f301e8: e5d30000 ldrb r0, [r3] + 1f301ec: e5c90000 strb r0, [r9] + 1f301f0: 0a0000a3 beq 1f30484 + 1f301f4: e3520002 cmp r2, #2 + 1f301f8: e5d30001 ldrb r0, [r3, #1] + 1f301fc: e5c90001 strb r0, [r9, #1] + 1f30200: 0a00009f beq 1f30484 + 1f30204: e3520003 cmp r2, #3 + 1f30208: e5d30002 ldrb r0, [r3, #2] + 1f3020c: e5c90002 strb r0, [r9, #2] + 1f30210: 0a00009b beq 1f30484 + 1f30214: e3520004 cmp r2, #4 + 1f30218: e5d30003 ldrb r0, [r3, #3] + 1f3021c: e5c90003 strb r0, [r9, #3] + 1f30220: 0a000097 beq 1f30484 + 1f30224: e3520005 cmp r2, #5 + 1f30228: e5d30004 ldrb r0, [r3, #4] + 1f3022c: e5c90004 strb r0, [r9, #4] + 1f30230: 0a000093 beq 1f30484 + 1f30234: e3520006 cmp r2, #6 + 1f30238: e5d30005 ldrb r0, [r3, #5] + 1f3023c: e5c90005 strb r0, [r9, #5] + 1f30240: 0a00008f beq 1f30484 + 1f30244: e3520007 cmp r2, #7 + 1f30248: e5d30006 ldrb r0, [r3, #6] + 1f3024c: e5c90006 strb r0, [r9, #6] + 1f30250: 0a00038e beq 1f31090 + 1f30254: e3520008 cmp r2, #8 + 1f30258: e5d30007 ldrb r0, [r3, #7] + 1f3025c: e5c90007 strb r0, [r9, #7] + 1f30260: 0a000087 beq 1f30484 + 1f30264: e3520009 cmp r2, #9 + 1f30268: e5d30008 ldrb r0, [r3, #8] + 1f3026c: e5c90008 strb r0, [r9, #8] + 1f30270: 0a000083 beq 1f30484 + 1f30274: e352000a cmp r2, #10 + 1f30278: e5d30009 ldrb r0, [r3, #9] + 1f3027c: e5c90009 strb r0, [r9, #9] + 1f30280: 0a00007f beq 1f30484 + 1f30284: e352000b cmp r2, #11 + 1f30288: e5d3000a ldrb r0, [r3, #10] + 1f3028c: e5c9000a strb r0, [r9, #10] + 1f30290: 0a00007b beq 1f30484 + 1f30294: e352000c cmp r2, #12 + 1f30298: e5d3000b ldrb r0, [r3, #11] + 1f3029c: e5c9000b strb r0, [r9, #11] + 1f302a0: 0a000077 beq 1f30484 + 1f302a4: e352000d cmp r2, #13 + 1f302a8: e5d3000c ldrb r0, [r3, #12] + 1f302ac: e5c9000c strb r0, [r9, #12] + 1f302b0: 0a000073 beq 1f30484 + 1f302b4: e352000e cmp r2, #14 + 1f302b8: e5d3000d ldrb r0, [r3, #13] + 1f302bc: e5c9000d strb r0, [r9, #13] + 1f302c0: 0a00006f beq 1f30484 + 1f302c4: e5d3e00e ldrb lr, [r3, #14] + 1f302c8: e3a0000f mov r0, #15 + 1f302cc: e5c9e00e strb lr, [r9, #14] + 1f302d0: e062500a rsb r5, r2, sl + 1f302d4: e0624007 rsb r4, r2, r7 + 1f302d8: e245e010 sub lr, r5, #16 + 1f302dc: e354000e cmp r4, #14 + 1f302e0: e1a0e22e lsr lr, lr, #4 + 1f302e4: e28ee001 add lr, lr, #1 + 1f302e8: e1a0420e lsl r4, lr, #4 + 1f302ec: 9a00000c bls 1f30324 + 1f302f0: e0838002 add r8, r3, r2 + 1f302f4: e3a06000 mov r6, #0 + 1f302f8: e0892002 add r2, r9, r2 + 1f302fc: f4680adf vld1.64 {d16-d17}, [r8 :64] + 1f30300: e2866001 add r6, r6, #1 + 1f30304: e156000e cmp r6, lr + 1f30308: e2888010 add r8, r8, #16 + 1f3030c: f4420a0f vst1.8 {d16-d17}, [r2] + 1f30310: e2822010 add r2, r2, #16 + 1f30314: 3afffff8 bcc 1f302fc + 1f30318: e1550004 cmp r5, r4 + 1f3031c: e0800004 add r0, r0, r4 + 1f30320: 0a000048 beq 1f30448 + 1f30324: e280e001 add lr, r0, #1 + 1f30328: e7d32000 ldrb r2, [r3, r0] + 1f3032c: e15e000a cmp lr, sl + 1f30330: e7c92000 strb r2, [r9, r0] + 1f30334: aa000043 bge 1f30448 + 1f30338: e2802002 add r2, r0, #2 + 1f3033c: e7d3400e ldrb r4, [r3, lr] + 1f30340: e152000a cmp r2, sl + 1f30344: e7c9400e strb r4, [r9, lr] + 1f30348: aa00003e bge 1f30448 + 1f3034c: e280e003 add lr, r0, #3 + 1f30350: e7d34002 ldrb r4, [r3, r2] + 1f30354: e15e000a cmp lr, sl + 1f30358: e7c94002 strb r4, [r9, r2] + 1f3035c: aa000039 bge 1f30448 + 1f30360: e2802004 add r2, r0, #4 + 1f30364: e7d3400e ldrb r4, [r3, lr] + 1f30368: e152000a cmp r2, sl + 1f3036c: e7c9400e strb r4, [r9, lr] + 1f30370: aa000034 bge 1f30448 + 1f30374: e280e005 add lr, r0, #5 + 1f30378: e7d34002 ldrb r4, [r3, r2] + 1f3037c: e15e000a cmp lr, sl + 1f30380: e7c94002 strb r4, [r9, r2] + 1f30384: aa00002f bge 1f30448 + 1f30388: e2802006 add r2, r0, #6 + 1f3038c: e7d3400e ldrb r4, [r3, lr] + 1f30390: e152000a cmp r2, sl + 1f30394: e7c9400e strb r4, [r9, lr] + 1f30398: aa00002a bge 1f30448 + 1f3039c: e280e007 add lr, r0, #7 + 1f303a0: e7d34002 ldrb r4, [r3, r2] + 1f303a4: e15e000a cmp lr, sl + 1f303a8: e7c94002 strb r4, [r9, r2] + 1f303ac: aa000025 bge 1f30448 + 1f303b0: e2802008 add r2, r0, #8 + 1f303b4: e7d3400e ldrb r4, [r3, lr] + 1f303b8: e152000a cmp r2, sl + 1f303bc: e7c9400e strb r4, [r9, lr] + 1f303c0: aa000020 bge 1f30448 + 1f303c4: e280e009 add lr, r0, #9 + 1f303c8: e7d34002 ldrb r4, [r3, r2] + 1f303cc: e15e000a cmp lr, sl + 1f303d0: e7c94002 strb r4, [r9, r2] + 1f303d4: aa00001b bge 1f30448 + 1f303d8: e280200a add r2, r0, #10 + 1f303dc: e7d3400e ldrb r4, [r3, lr] + 1f303e0: e152000a cmp r2, sl + 1f303e4: e7c9400e strb r4, [r9, lr] + 1f303e8: aa000016 bge 1f30448 + 1f303ec: e280e00b add lr, r0, #11 + 1f303f0: e7d34002 ldrb r4, [r3, r2] + 1f303f4: e15e000a cmp lr, sl + 1f303f8: e7c94002 strb r4, [r9, r2] + 1f303fc: aa000011 bge 1f30448 + 1f30400: e280200c add r2, r0, #12 + 1f30404: e7d3400e ldrb r4, [r3, lr] + 1f30408: e152000a cmp r2, sl + 1f3040c: e7c9400e strb r4, [r9, lr] + 1f30410: aa00000c bge 1f30448 + 1f30414: e280e00d add lr, r0, #13 + 1f30418: e7d34002 ldrb r4, [r3, r2] + 1f3041c: e15e000a cmp lr, sl + 1f30420: e7c94002 strb r4, [r9, r2] + 1f30424: aa000007 bge 1f30448 + 1f30428: e280200e add r2, r0, #14 + 1f3042c: e7d3000e ldrb r0, [r3, lr] + 1f30430: e152000a cmp r2, sl + 1f30434: e7c9000e strb r0, [r9, lr] + 1f30438: b7d30002 ldrblt r0, [r3, r2] + 1f3043c: b083300a addlt r3, r3, sl + 1f30440: b7c90002 strblt r0, [r9, r2] + 1f30444: ba000000 blt 1f3044c + 1f30448: e083300a add r3, r3, sl + 1f3044c: e25cc001 subs ip, ip, #1 + 1f30450: e3e02000 mvn r2, #0 + 1f30454: e7c9200a strb r2, [r9, sl] + 1f30458: e0899001 add r9, r9, r1 + 1f3045c: 1affff4c bne 1f30194 + 1f30460: eafffa07 b 1f2ec84 + 1f30464: e1a01002 mov r1, r2 + 1f30468: eafffaa1 b 1f2eef4 + 1f3046c: e1a01002 mov r1, r2 + 1f30470: eafffd42 b 1f2f980 + 1f30474: e1a01002 mov r1, r2 + 1f30478: eafffe9f b 1f2fefc + 1f3047c: e1a01002 mov r1, r2 + 1f30480: eafffbe5 b 1f2f41c + 1f30484: e1a00002 mov r0, r2 + 1f30488: eaffff90 b 1f302d0 + 1f3048c: e083300a add r3, r3, sl + 1f30490: e2566001 subs r6, r6, #1 + 1f30494: e3e02000 mvn r2, #0 + 1f30498: e088800e add r8, r8, lr + 1f3049c: e7c9200a strb r2, [r9, sl] + 1f304a0: e080000e add r0, r0, lr + 1f304a4: e089900e add r9, r9, lr + 1f304a8: 1afffcc2 bne 1f2f7b8 + 1f304ac: eafff9f4 b 1f2ec84 + 1f304b0: e59d3140 ldr r3, [sp, #320] ; 0x140 + 1f304b4: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f304b8: e1530002 cmp r3, r2 + 1f304bc: 11a03004 movne r3, r4 + 1f304c0: 13e02000 mvnne r2, #0 + 1f304c4: 17e3200a strbne r2, [r3, sl]! + 1f304c8: 15c32001 strbne r2, [r3, #1] + 1f304cc: e59d3008 ldr r3, [sp, #8] + 1f304d0: e59d2004 ldr r2, [sp, #4] + 1f304d4: e083300a add r3, r3, sl + 1f304d8: e58d3018 str r3, [sp, #24] + 1f304dc: e59d3020 ldr r3, [sp, #32] + 1f304e0: e0849003 add r9, r4, r3 + 1f304e4: e0828003 add r8, r2, r3 + 1f304e8: eafff3fc b 1f2d4e0 + 1f304ec: e2437001 sub r7, r3, #1 + 1f304f0: e2486001 sub r6, r8, #1 + 1f304f4: e1a04009 mov r4, r9 + 1f304f8: e089b00a add fp, r9, sl + 1f304fc: e1a05000 mov r5, r0 + 1f30500: e4d5e001 ldrb lr, [r5], #1 + 1f30504: e5f62001 ldrb r2, [r6, #1]! + 1f30508: e5f71001 ldrb r1, [r7, #1]! + 1f3050c: e082200e add r2, r2, lr + 1f30510: e08120c2 add r2, r1, r2, asr #1 + 1f30514: e4c42001 strb r2, [r4], #1 + 1f30518: e15b0004 cmp fp, r4 + 1f3051c: 1afffff7 bne 1f30500 + 1f30520: eafffc90 b 1f2f768 + 1f30524: e1a0c003 mov ip, r3 + 1f30528: e2485001 sub r5, r8, #1 + 1f3052c: e083300a add r3, r3, sl + 1f30530: e2494001 sub r4, r9, #1 + 1f30534: e4dc2001 ldrb r2, [ip], #1 + 1f30538: e5f51001 ldrb r1, [r5, #1]! + 1f3053c: e153000c cmp r3, ip + 1f30540: e0822001 add r2, r2, r1 + 1f30544: e5e42001 strb r2, [r4, #1]! + 1f30548: 1afffff9 bne 1f30534 + 1f3054c: eaffffcf b 1f30490 + 1f30550: e1a02003 mov r2, r3 + 1f30554: e2490001 sub r0, r9, #1 + 1f30558: e083300a add r3, r3, sl + 1f3055c: e4d2e001 ldrb lr, [r2], #1 + 1f30560: e5e0e001 strb lr, [r0, #1]! + 1f30564: e1520003 cmp r2, r3 + 1f30568: 1afffffb bne 1f3055c + 1f3056c: eaffffb6 b 1f3044c + 1f30570: e2436001 sub r6, r3, #1 + 1f30574: e1a04009 mov r4, r9 + 1f30578: e089700a add r7, r9, sl + 1f3057c: e1a05000 mov r5, r0 + 1f30580: e4d51001 ldrb r1, [r5], #1 + 1f30584: e5f62001 ldrb r2, [r6, #1]! + 1f30588: e08220a1 add r2, r2, r1, lsr #1 + 1f3058c: e4c42001 strb r2, [r4], #1 + 1f30590: e1570004 cmp r7, r4 + 1f30594: 1afffff9 bne 1f30580 + 1f30598: eafffaed b 1f2f154 + 1f3059c: e2436001 sub r6, r3, #1 + 1f305a0: e1a04009 mov r4, r9 + 1f305a4: e089700a add r7, r9, sl + 1f305a8: e1a05000 mov r5, r0 + 1f305ac: e4d52001 ldrb r2, [r5], #1 + 1f305b0: e5f61001 ldrb r1, [r6, #1]! + 1f305b4: e0822001 add r2, r2, r1 + 1f305b8: e4c42001 strb r2, [r4], #1 + 1f305bc: e1570004 cmp r7, r4 + 1f305c0: 1afffff9 bne 1f305ac + 1f305c4: eafffee3 b 1f30158 + 1f305c8: e30a336c movw r3, #41836 ; 0xa36c + 1f305cc: e340320d movt r3, #525 ; 0x20d + 1f305d0: e3a00000 mov r0, #0 + 1f305d4: e3002fbc movw r2, #4028 ; 0xfbc + 1f305d8: e34021f6 movt r2, #502 ; 0x1f6 + 1f305dc: e5832000 str r2, [r3] + 1f305e0: e28dd0fc add sp, sp, #252 ; 0xfc + 1f305e4: ecbd8b08 vpop {d8-d11} + 1f305e8: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f305ec: e59d314c ldr r3, [sp, #332] ; 0x14c + 1f305f0: e3530007 cmp r3, #7 + 1f305f4: ca0000a6 bgt 1f30894 + 1f305f8: e59de060 ldr lr, [sp, #96] ; 0x60 + 1f305fc: f2806e51 vmov.i8 q3, #1 ; 0x01 + 1f30600: e59d2054 ldr r2, [sp, #84] ; 0x54 + 1f30604: f2802e53 vmov.i8 q1, #3 ; 0x03 + 1f30608: e24e3008 sub r3, lr, #8 + 1f3060c: e58d3078 str r3, [sp, #120] ; 0x78 + 1f30610: e1a05003 mov r5, r3 + 1f30614: e24e3004 sub r3, lr, #4 + 1f30618: e1a07003 mov r7, r3 + 1f3061c: e58d3068 str r3, [sp, #104] ; 0x68 + 1f30620: e24e3002 sub r3, lr, #2 + 1f30624: e58d3048 str r3, [sp, #72] ; 0x48 + 1f30628: e1a08003 mov r8, r3 + 1f3062c: e59d305c ldr r3, [sp, #92] ; 0x5c + 1f30630: f2800e5f vmov.i8 q0, #15 ; 0x0f + 1f30634: e1a010a8 lsr r1, r8, #1 + 1f30638: e0629003 rsb r9, r2, r3 + 1f3063c: e1a04001 mov r4, r1 + 1f30640: e1a03127 lsr r3, r7, #2 + 1f30644: e1a021a5 lsr r2, r5, #3 + 1f30648: e58d10a0 str r1, [sp, #160] ; 0xa0 + 1f3064c: e241100f sub r1, r1, #15 + 1f30650: e242c00f sub ip, r2, #15 + 1f30654: e243000f sub r0, r3, #15 + 1f30658: e2826001 add r6, r2, #1 + 1f3065c: e1a01221 lsr r1, r1, #4 + 1f30660: e1a0c22c lsr ip, ip, #4 + 1f30664: e2811001 add r1, r1, #1 + 1f30668: e1a00220 lsr r0, r0, #4 + 1f3066c: e58d102c str r1, [sp, #44] ; 0x2c + 1f30670: e28cc001 add ip, ip, #1 + 1f30674: e2800001 add r0, r0, #1 + 1f30678: e59d102c ldr r1, [sp, #44] ; 0x2c + 1f3067c: e1a0b006 mov fp, r6 + 1f30680: e58d6028 str r6, [sp, #40] ; 0x28 + 1f30684: e1a06000 mov r6, r0 + 1f30688: e284a001 add sl, r4, #1 + 1f3068c: e58d009c str r0, [sp, #156] ; 0x9c + 1f30690: e2830001 add r0, r3, #1 + 1f30694: e58d000c str r0, [sp, #12] + 1f30698: e1a00004 mov r0, r4 + 1f3069c: e1a0438c lsl r4, ip, #7 + 1f306a0: e58d4070 str r4, [sp, #112] ; 0x70 + 1f306a4: e1a04006 mov r4, r6 + 1f306a8: e1a06306 lsl r6, r6, #6 + 1f306ac: e58d6058 str r6, [sp, #88] ; 0x58 + 1f306b0: e1a06281 lsl r6, r1, #5 + 1f306b4: e1a0100e mov r1, lr + 1f306b8: e59de070 ldr lr, [sp, #112] ; 0x70 + 1f306bc: e58d6038 str r6, [sp, #56] ; 0x38 + 1f306c0: e0452182 sub r2, r5, r2, lsl #3 + 1f306c4: e06ee001 rsb lr, lr, r1 + 1f306c8: e58de08c str lr, [sp, #140] ; 0x8c + 1f306cc: e59de058 ldr lr, [sp, #88] ; 0x58 + 1f306d0: e35b000f cmp fp, #15 + 1f306d4: e58d206c str r2, [sp, #108] ; 0x6c + 1f306d8: e1a0218b lsl r2, fp, #3 + 1f306dc: e06ee001 rsb lr, lr, r1 + 1f306e0: e58de098 str lr, [sp, #152] ; 0x98 + 1f306e4: e59de038 ldr lr, [sp, #56] ; 0x38 + 1f306e8: e3a06000 mov r6, #0 + 1f306ec: e58d2020 str r2, [sp, #32] + 1f306f0: e0472103 sub r2, r7, r3, lsl #2 + 1f306f4: e06ee001 rsb lr, lr, r1 + 1f306f8: e59d102c ldr r1, [sp, #44] ; 0x2c + 1f306fc: e59d300c ldr r3, [sp, #12] + 1f30700: e1a0b009 mov fp, r9 + 1f30704: e58d2054 str r2, [sp, #84] ; 0x54 + 1f30708: e1a07006 mov r7, r6 + 1f3070c: e1a01201 lsl r1, r1, #4 + 1f30710: e58d105c str r1, [sp, #92] ; 0x5c + 1f30714: e1a01005 mov r1, r5 + 1f30718: 93a01000 movls r1, #0 + 1f3071c: 83a01001 movhi r1, #1 + 1f30720: e353000f cmp r3, #15 + 1f30724: 93a02000 movls r2, #0 + 1f30728: 83a02001 movhi r2, #1 + 1f3072c: e35a000f cmp sl, #15 + 1f30730: e1a03103 lsl r3, r3, #2 + 1f30734: e58dc094 str ip, [sp, #148] ; 0x94 + 1f30738: e1a0c20c lsl ip, ip, #4 + 1f3073c: e58de07c str lr, [sp, #124] ; 0x7c + 1f30740: e58dc088 str ip, [sp, #136] ; 0x88 + 1f30744: e1a0c204 lsl ip, r4, #4 + 1f30748: e58d1064 str r1, [sp, #100] ; 0x64 + 1f3074c: e58dc074 str ip, [sp, #116] ; 0x74 + 1f30750: e58d2044 str r2, [sp, #68] ; 0x44 + 1f30754: e58d301c str r3, [sp, #28] + 1f30758: 93a03000 movls r3, #0 + 1f3075c: 83a03001 movhi r3, #1 + 1f30760: e58d3030 str r3, [sp, #48] ; 0x30 + 1f30764: e1a0308a lsl r3, sl, #1 + 1f30768: e58d3018 str r3, [sp, #24] + 1f3076c: e0483080 sub r3, r8, r0, lsl #1 + 1f30770: e58d3034 str r3, [sp, #52] ; 0x34 + 1f30774: e30f3e48 movw r3, #65096 ; 0xfe48 + 1f30778: e34031f5 movt r3, #501 ; 0x1f5 + 1f3077c: e58d3010 str r3, [sp, #16] + 1f30780: e3e08000 mvn r8, #0 + 1f30784: e59d3144 ldr r3, [sp, #324] ; 0x144 + 1f30788: e59d5040 ldr r5, [sp, #64] ; 0x40 + 1f3078c: e59de14c ldr lr, [sp, #332] ; 0x14c + 1f30790: e1a03083 lsl r3, r3, #1 + 1f30794: e58d304c str r3, [sp, #76] ; 0x4c + 1f30798: e59d3144 ldr r3, [sp, #324] ; 0x144 + 1f3079c: e98d0600 stmib sp, {r9, sl} + 1f307a0: e1a03103 lsl r3, r3, #2 + 1f307a4: e58d3014 str r3, [sp, #20] + 1f307a8: e59d3150 ldr r3, [sp, #336] ; 0x150 + 1f307ac: e5951000 ldr r1, [r5] + 1f307b0: e3530000 cmp r3, #0 + 1f307b4: e59d3004 ldr r3, [sp, #4] + 1f307b8: e081c006 add ip, r1, r6 + 1f307bc: e0862003 add r2, r6, r3 + 1f307c0: 059d3010 ldreq r3, [sp, #16] + 1f307c4: 13a03001 movne r3, #1 + 1f307c8: e0812002 add r2, r1, r2 + 1f307cc: 07d3300e ldrbeq r3, [r3, lr] + 1f307d0: e35e0004 cmp lr, #4 + 1f307d4: 0a000047 beq 1f308f8 + 1f307d8: e35e0002 cmp lr, #2 + 1f307dc: 0a00012a beq 1f30c8c + 1f307e0: e35e0001 cmp lr, #1 + 1f307e4: 0a00019a beq 1f30e54 + 1f307e8: e59d3140 ldr r3, [sp, #320] ; 0x140 + 1f307ec: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f307f0: e1530002 cmp r3, r2 + 1f307f4: 0a000016 beq 1f30854 + 1f307f8: e1a03002 mov r3, r2 + 1f307fc: e59d2050 ldr r2, [sp, #80] ; 0x50 + 1f30800: e3530001 cmp r3, #1 + 1f30804: e5953000 ldr r3, [r5] + 1f30808: e0833006 add r3, r3, r6 + 1f3080c: 0a000111 beq 1f30c58 + 1f30810: e3720001 cmn r2, #1 + 1f30814: 0a00000e beq 1f30854 + 1f30818: e59d1014 ldr r1, [sp, #20] + 1f3081c: e0833001 add r3, r3, r1 + 1f30820: e1a01002 mov r1, r2 + 1f30824: e59d2144 ldr r2, [sp, #324] ; 0x144 + 1f30828: e0622003 rsb r2, r2, r3 + 1f3082c: e5438001 strb r8, [r3, #-1] + 1f30830: e2411001 sub r1, r1, #1 + 1f30834: e3710001 cmn r1, #1 + 1f30838: e5520001 ldrb r0, [r2, #-1] + 1f3083c: e5430002 strb r0, [r3, #-2] + 1f30840: e5520002 ldrb r0, [r2, #-2] + 1f30844: e5430003 strb r0, [r3, #-3] + 1f30848: e5720003 ldrb r0, [r2, #-3]! + 1f3084c: e5630004 strb r0, [r3, #-4]! + 1f30850: 1afffff5 bne 1f3082c + 1f30854: e59d2148 ldr r2, [sp, #328] ; 0x148 + 1f30858: e2877001 add r7, r7, #1 + 1f3085c: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f30860: e1520007 cmp r2, r7 + 1f30864: e0866003 add r6, r6, r3 + 1f30868: e08bb003 add fp, fp, r3 + 1f3086c: 1affffcd bne 1f307a8 + 1f30870: e3a00001 mov r0, #1 + 1f30874: e28dd0fc add sp, sp, #252 ; 0xfc + 1f30878: ecbd8b08 vpop {d8-d11} + 1f3087c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f30880: e3e03102 mvn r3, #-2147483648 ; 0x80000000 + 1f30884: e713f213 sdiv r3, r3, r2 + 1f30888: e1510003 cmp r1, r3 + 1f3088c: dafff2a5 ble 1f2d328 + 1f30890: eafff28b b 1f2d2c4 + 1f30894: e3530010 cmp r3, #16 + 1f30898: 1afffff4 bne 1f30870 + 1f3089c: e59d3140 ldr r3, [sp, #320] ; 0x140 + 1f308a0: e59d2064 ldr r2, [sp, #100] ; 0x64 + 1f308a4: e00c0293 mul ip, r3, r2 + 1f308a8: e59d3040 ldr r3, [sp, #64] ; 0x40 + 1f308ac: e35c0000 cmp ip, #0 + 1f308b0: e5933000 ldr r3, [r3] + 1f308b4: 0affffed beq 1f30870 + 1f308b8: e2433002 sub r3, r3, #2 + 1f308bc: e3a00000 mov r0, #0 + 1f308c0: e5d3e002 ldrb lr, [r3, #2] + 1f308c4: e2800001 add r0, r0, #1 + 1f308c8: e5d32003 ldrb r2, [r3, #3] + 1f308cc: e15c0000 cmp ip, r0 + 1f308d0: e182240e orr r2, r2, lr, lsl #8 + 1f308d4: e1e320b2 strh r2, [r3, #2]! + 1f308d8: 1afffff8 bne 1f308c0 + 1f308dc: eaffffe3 b 1f30870 + 1f308e0: e1a02003 mov r2, r3 + 1f308e4: e1a01000 mov r1, r0 + 1f308e8: eafff637 b 1f2e1cc + 1f308ec: e1a02003 mov r2, r3 + 1f308f0: e1a0100e mov r1, lr + 1f308f4: eafff4db b 1f2dc68 + 1f308f8: e59d0060 ldr r0, [sp, #96] ; 0x60 + 1f308fc: e3500001 cmp r0, #1 + 1f30900: da00029c ble 1f31378 + 1f30904: e59d0018 ldr r0, [sp, #24] + 1f30908: e59d4008 ldr r4, [sp, #8] + 1f3090c: e0860000 add r0, r6, r0 + 1f30910: e08b4004 add r4, fp, r4 + 1f30914: e1560004 cmp r6, r4 + 1f30918: b15b0000 cmplt fp, r0 + 1f3091c: e59d4030 ldr r4, [sp, #48] ; 0x30 + 1f30920: a3a00001 movge r0, #1 + 1f30924: b3a00000 movlt r0, #0 + 1f30928: e1140000 tst r4, r0 + 1f3092c: 0a0001e0 beq 1f310b4 + 1f30930: e59d0048 ldr r0, [sp, #72] ; 0x48 + 1f30934: e350001d cmp r0, #29 + 1f30938: 9a0001d9 bls 1f310a4 + 1f3093c: eee43b90 vdup.8 q10, r3 + 1f30940: e081100b add r1, r1, fp + 1f30944: e59da02c ldr sl, [sp, #44] ; 0x2c + 1f30948: e1a09001 mov r9, r1 + 1f3094c: e1a0400c mov r4, ip + 1f30950: e3a00000 mov r0, #0 + 1f30954: f4692a0f vld1.8 {d18-d19}, [r9] + 1f30958: e2800001 add r0, r0, #1 + 1f3095c: f4610a0f vld1.8 {d16-d17}, [r1] + 1f30960: e15a0000 cmp sl, r0 + 1f30964: e2899010 add r9, r9, #16 + 1f30968: e2811010 add r1, r1, #16 + 1f3096c: f3cc2072 vshr.u8 q9, q9, #4 + 1f30970: f24001d0 vand q8, q8, q0 + 1f30974: f20289f4 vmul.i8 q4, q9, q10 + 1f30978: f200a9f4 vmul.i8 q5, q8, q10 + 1f3097c: f404830f vst2.8 {d8-d11}, [r4] + 1f30980: e2844020 add r4, r4, #32 + 1f30984: 8afffff2 bhi 1f30954 + 1f30988: e59d105c ldr r1, [sp, #92] ; 0x5c + 1f3098c: e59d0008 ldr r0, [sp, #8] + 1f30990: e1510000 cmp r1, r0 + 1f30994: e0820001 add r0, r2, r1 + 1f30998: e59d1038 ldr r1, [sp, #56] ; 0x38 + 1f3099c: e08c1001 add r1, ip, r1 + 1f309a0: 0a0000a1 beq 1f30c2c + 1f309a4: e59d407c ldr r4, [sp, #124] ; 0x7c + 1f309a8: e5d09000 ldrb r9, [r0] + 1f309ac: e244a002 sub sl, r4, #2 + 1f309b0: e35a0001 cmp sl, #1 + 1f309b4: e1a09249 asr r9, r9, #4 + 1f309b8: e1690389 smulbb r9, r9, r3 + 1f309bc: e5c19000 strb r9, [r1] + 1f309c0: e5d09000 ldrb r9, [r0] + 1f309c4: e209900f and r9, r9, #15 + 1f309c8: e1690389 smulbb r9, r9, r3 + 1f309cc: e5c19001 strb r9, [r1, #1] + 1f309d0: da000095 ble 1f30c2c + 1f309d4: e5d09001 ldrb r9, [r0, #1] + 1f309d8: e244a004 sub sl, r4, #4 + 1f309dc: e35a0001 cmp sl, #1 + 1f309e0: e1a09249 asr r9, r9, #4 + 1f309e4: e1690389 smulbb r9, r9, r3 + 1f309e8: e5c19002 strb r9, [r1, #2] + 1f309ec: e5d09001 ldrb r9, [r0, #1] + 1f309f0: e209900f and r9, r9, #15 + 1f309f4: e1690389 smulbb r9, r9, r3 + 1f309f8: e5c19003 strb r9, [r1, #3] + 1f309fc: da00008a ble 1f30c2c + 1f30a00: e5d09002 ldrb r9, [r0, #2] + 1f30a04: e244a006 sub sl, r4, #6 + 1f30a08: e35a0001 cmp sl, #1 + 1f30a0c: e1a09249 asr r9, r9, #4 + 1f30a10: e1690389 smulbb r9, r9, r3 + 1f30a14: e5c19004 strb r9, [r1, #4] + 1f30a18: e5d09002 ldrb r9, [r0, #2] + 1f30a1c: e209900f and r9, r9, #15 + 1f30a20: e1690389 smulbb r9, r9, r3 + 1f30a24: e5c19005 strb r9, [r1, #5] + 1f30a28: da00007f ble 1f30c2c + 1f30a2c: e5d09003 ldrb r9, [r0, #3] + 1f30a30: e244a008 sub sl, r4, #8 + 1f30a34: e35a0001 cmp sl, #1 + 1f30a38: e1a09249 asr r9, r9, #4 + 1f30a3c: e1690389 smulbb r9, r9, r3 + 1f30a40: e5c19006 strb r9, [r1, #6] + 1f30a44: e5d09003 ldrb r9, [r0, #3] + 1f30a48: e209900f and r9, r9, #15 + 1f30a4c: e1690389 smulbb r9, r9, r3 + 1f30a50: e5c19007 strb r9, [r1, #7] + 1f30a54: da000074 ble 1f30c2c + 1f30a58: e5d09004 ldrb r9, [r0, #4] + 1f30a5c: e244a00a sub sl, r4, #10 + 1f30a60: e35a0001 cmp sl, #1 + 1f30a64: e1a09249 asr r9, r9, #4 + 1f30a68: e1690389 smulbb r9, r9, r3 + 1f30a6c: e5c19008 strb r9, [r1, #8] + 1f30a70: e5d09004 ldrb r9, [r0, #4] + 1f30a74: e209900f and r9, r9, #15 + 1f30a78: e1690389 smulbb r9, r9, r3 + 1f30a7c: e5c19009 strb r9, [r1, #9] + 1f30a80: da000069 ble 1f30c2c + 1f30a84: e5d09005 ldrb r9, [r0, #5] + 1f30a88: e244a00c sub sl, r4, #12 + 1f30a8c: e35a0001 cmp sl, #1 + 1f30a90: e1a09249 asr r9, r9, #4 + 1f30a94: e1690389 smulbb r9, r9, r3 + 1f30a98: e5c1900a strb r9, [r1, #10] + 1f30a9c: e5d09005 ldrb r9, [r0, #5] + 1f30aa0: e209900f and r9, r9, #15 + 1f30aa4: e1690389 smulbb r9, r9, r3 + 1f30aa8: e5c1900b strb r9, [r1, #11] + 1f30aac: da00005e ble 1f30c2c + 1f30ab0: e5d09006 ldrb r9, [r0, #6] + 1f30ab4: e244a00e sub sl, r4, #14 + 1f30ab8: e35a0001 cmp sl, #1 + 1f30abc: e1a09249 asr r9, r9, #4 + 1f30ac0: e1690389 smulbb r9, r9, r3 + 1f30ac4: e5c1900c strb r9, [r1, #12] + 1f30ac8: e5d09006 ldrb r9, [r0, #6] + 1f30acc: e209900f and r9, r9, #15 + 1f30ad0: e1690389 smulbb r9, r9, r3 + 1f30ad4: e5c1900d strb r9, [r1, #13] + 1f30ad8: da000053 ble 1f30c2c + 1f30adc: e5d09007 ldrb r9, [r0, #7] + 1f30ae0: e244a010 sub sl, r4, #16 + 1f30ae4: e35a0001 cmp sl, #1 + 1f30ae8: e1a09249 asr r9, r9, #4 + 1f30aec: e1690389 smulbb r9, r9, r3 + 1f30af0: e5c1900e strb r9, [r1, #14] + 1f30af4: e5d09007 ldrb r9, [r0, #7] + 1f30af8: e209900f and r9, r9, #15 + 1f30afc: e1690389 smulbb r9, r9, r3 + 1f30b00: e5c1900f strb r9, [r1, #15] + 1f30b04: da000048 ble 1f30c2c + 1f30b08: e5d09008 ldrb r9, [r0, #8] + 1f30b0c: e244a012 sub sl, r4, #18 + 1f30b10: e35a0001 cmp sl, #1 + 1f30b14: e1a09249 asr r9, r9, #4 + 1f30b18: e1690389 smulbb r9, r9, r3 + 1f30b1c: e5c19010 strb r9, [r1, #16] + 1f30b20: e5d09008 ldrb r9, [r0, #8] + 1f30b24: e209900f and r9, r9, #15 + 1f30b28: e1690389 smulbb r9, r9, r3 + 1f30b2c: e5c19011 strb r9, [r1, #17] + 1f30b30: da00003d ble 1f30c2c + 1f30b34: e5d09009 ldrb r9, [r0, #9] + 1f30b38: e244a014 sub sl, r4, #20 + 1f30b3c: e35a0001 cmp sl, #1 + 1f30b40: e1a09249 asr r9, r9, #4 + 1f30b44: e1690389 smulbb r9, r9, r3 + 1f30b48: e5c19012 strb r9, [r1, #18] + 1f30b4c: e5d09009 ldrb r9, [r0, #9] + 1f30b50: e209900f and r9, r9, #15 + 1f30b54: e1690389 smulbb r9, r9, r3 + 1f30b58: e5c19013 strb r9, [r1, #19] + 1f30b5c: da000032 ble 1f30c2c + 1f30b60: e5d0900a ldrb r9, [r0, #10] + 1f30b64: e244a016 sub sl, r4, #22 + 1f30b68: e35a0001 cmp sl, #1 + 1f30b6c: e1a09249 asr r9, r9, #4 + 1f30b70: e1690389 smulbb r9, r9, r3 + 1f30b74: e5c19014 strb r9, [r1, #20] + 1f30b78: e5d0900a ldrb r9, [r0, #10] + 1f30b7c: e209900f and r9, r9, #15 + 1f30b80: e1690389 smulbb r9, r9, r3 + 1f30b84: e5c19015 strb r9, [r1, #21] + 1f30b88: da000027 ble 1f30c2c + 1f30b8c: e5d0900b ldrb r9, [r0, #11] + 1f30b90: e244a018 sub sl, r4, #24 + 1f30b94: e35a0001 cmp sl, #1 + 1f30b98: e1a09249 asr r9, r9, #4 + 1f30b9c: e1690389 smulbb r9, r9, r3 + 1f30ba0: e5c19016 strb r9, [r1, #22] + 1f30ba4: e5d0900b ldrb r9, [r0, #11] + 1f30ba8: e209900f and r9, r9, #15 + 1f30bac: e1690389 smulbb r9, r9, r3 + 1f30bb0: e5c19017 strb r9, [r1, #23] + 1f30bb4: da00001c ble 1f30c2c + 1f30bb8: e5d0900c ldrb r9, [r0, #12] + 1f30bbc: e244a01a sub sl, r4, #26 + 1f30bc0: e35a0001 cmp sl, #1 + 1f30bc4: e1a09249 asr r9, r9, #4 + 1f30bc8: e1690389 smulbb r9, r9, r3 + 1f30bcc: e5c19018 strb r9, [r1, #24] + 1f30bd0: e5d0900c ldrb r9, [r0, #12] + 1f30bd4: e209900f and r9, r9, #15 + 1f30bd8: e1690389 smulbb r9, r9, r3 + 1f30bdc: e5c19019 strb r9, [r1, #25] + 1f30be0: da000011 ble 1f30c2c + 1f30be4: e5d0900d ldrb r9, [r0, #13] + 1f30be8: e354001d cmp r4, #29 + 1f30bec: e1a04249 asr r4, r9, #4 + 1f30bf0: e1640384 smulbb r4, r4, r3 + 1f30bf4: e5c1401a strb r4, [r1, #26] + 1f30bf8: e5d0400d ldrb r4, [r0, #13] + 1f30bfc: e204400f and r4, r4, #15 + 1f30c00: e1640384 smulbb r4, r4, r3 + 1f30c04: e5c1401b strb r4, [r1, #27] + 1f30c08: da000007 ble 1f30c2c + 1f30c0c: e5d0400e ldrb r4, [r0, #14] + 1f30c10: e1a04244 asr r4, r4, #4 + 1f30c14: e1640384 smulbb r4, r4, r3 + 1f30c18: e5c1401c strb r4, [r1, #28] + 1f30c1c: e5d0000e ldrb r0, [r0, #14] + 1f30c20: e200000f and r0, r0, #15 + 1f30c24: e1600380 smulbb r0, r0, r3 + 1f30c28: e5c1001d strb r0, [r1, #29] + 1f30c2c: e59d1018 ldr r1, [sp, #24] + 1f30c30: e08cc001 add ip, ip, r1 + 1f30c34: e59d1008 ldr r1, [sp, #8] + 1f30c38: e0822001 add r2, r2, r1 + 1f30c3c: e59d1034 ldr r1, [sp, #52] ; 0x34 + 1f30c40: e3510001 cmp r1, #1 + 1f30c44: 05d22000 ldrbeq r2, [r2] + 1f30c48: 01a02242 asreq r2, r2, #4 + 1f30c4c: 01630382 smulbbeq r3, r2, r3 + 1f30c50: 05cc3000 strbeq r3, [ip] + 1f30c54: eafffee3 b 1f307e8 + 1f30c58: e3720001 cmn r2, #1 + 1f30c5c: 0afffefc beq 1f30854 + 1f30c60: e59d104c ldr r1, [sp, #76] ; 0x4c + 1f30c64: e59d0144 ldr r0, [sp, #324] ; 0x144 + 1f30c68: e0831001 add r1, r3, r1 + 1f30c6c: e0833000 add r3, r3, r0 + 1f30c70: e5418001 strb r8, [r1, #-1] + 1f30c74: e2422001 sub r2, r2, #1 + 1f30c78: e3720001 cmn r2, #1 + 1f30c7c: e5730001 ldrb r0, [r3, #-1]! + 1f30c80: e5610002 strb r0, [r1, #-2]! + 1f30c84: 1afffff9 bne 1f30c70 + 1f30c88: eafffef1 b 1f30854 + 1f30c8c: e59d0060 ldr r0, [sp, #96] ; 0x60 + 1f30c90: e3500003 cmp r0, #3 + 1f30c94: da00005c ble 1f30e0c + 1f30c98: e59d001c ldr r0, [sp, #28] + 1f30c9c: e59d400c ldr r4, [sp, #12] + 1f30ca0: e0860000 add r0, r6, r0 + 1f30ca4: e08b4004 add r4, fp, r4 + 1f30ca8: e1560004 cmp r6, r4 + 1f30cac: b15b0000 cmplt fp, r0 + 1f30cb0: e59d4044 ldr r4, [sp, #68] ; 0x44 + 1f30cb4: a3a00001 movge r0, #1 + 1f30cb8: b3a00000 movlt r0, #0 + 1f30cbc: e1140000 tst r4, r0 + 1f30cc0: 0a00013d beq 1f311bc + 1f30cc4: e59d0068 ldr r0, [sp, #104] ; 0x68 + 1f30cc8: e350003b cmp r0, #59 ; 0x3b + 1f30ccc: 9a000030 bls 1f30d94 + 1f30cd0: e081100b add r1, r1, fp + 1f30cd4: e3a04000 mov r4, #0 + 1f30cd8: eee03b90 vdup.8 q8, r3 + 1f30cdc: e58d3080 str r3, [sp, #128] ; 0x80 + 1f30ce0: e1a09001 mov r9, r1 + 1f30ce4: e1a0a001 mov sl, r1 + 1f30ce8: e58d1040 str r1, [sp, #64] ; 0x40 + 1f30cec: e1a0000c mov r0, ip + 1f30cf0: e1a03004 mov r3, r4 + 1f30cf4: f4616a0f vld1.8 {d22-d23}, [r1] + 1f30cf8: e2833001 add r3, r3, #1 + 1f30cfc: f4694a0f vld1.8 {d20-d21}, [r9] + 1f30d00: e2811010 add r1, r1, #16 + 1f30d04: e59d409c ldr r4, [sp, #156] ; 0x9c + 1f30d08: e2899010 add r9, r9, #16 + 1f30d0c: f46a2a0f vld1.8 {d18-d19}, [sl] + 1f30d10: e28aa010 add sl, sl, #16 + 1f30d14: e1530004 cmp r3, r4 + 1f30d18: e59d4040 ldr r4, [sp, #64] ; 0x40 + 1f30d1c: f3ca6076 vshr.u8 q11, q11, #6 + 1f30d20: f3cc4074 vshr.u8 q10, q10, #4 + 1f30d24: f3ce2072 vshr.u8 q9, q9, #2 + 1f30d28: f24689f0 vmul.i8 q12, q11, q8 + 1f30d2c: f4646a0f vld1.8 {d22-d23}, [r4] + 1f30d30: f24441d2 vand q10, q10, q1 + 1f30d34: e2844010 add r4, r4, #16 + 1f30d38: e58d4040 str r4, [sp, #64] ; 0x40 + 1f30d3c: e2804020 add r4, r0, #32 + 1f30d40: f24221d2 vand q9, q9, q1 + 1f30d44: f244a9f0 vmul.i8 q13, q10, q8 + 1f30d48: f24641d2 vand q10, q11, q1 + 1f30d4c: f242c9f0 vmul.i8 q14, q9, q8 + 1f30d50: f244e9f0 vmul.i8 q15, q10, q8 + 1f30d54: f440810f vst4.8 {d24,d26,d28,d30}, [r0] + 1f30d58: e2800040 add r0, r0, #64 ; 0x40 + 1f30d5c: f444910f vst4.8 {d25,d27,d29,d31}, [r4] + 1f30d60: 3affffe3 bcc 1f30cf4 + 1f30d64: e28d10b0 add r1, sp, #176 ; 0xb0 + 1f30d68: e59d000c ldr r0, [sp, #12] + 1f30d6c: e59d3080 ldr r3, [sp, #128] ; 0x80 + 1f30d70: ecc18b10 vstmia r1, {d24-d31} + 1f30d74: e59d1074 ldr r1, [sp, #116] ; 0x74 + 1f30d78: e1510000 cmp r1, r0 + 1f30d7c: e0824001 add r4, r2, r1 + 1f30d80: e59d1058 ldr r1, [sp, #88] ; 0x58 + 1f30d84: e08c1001 add r1, ip, r1 + 1f30d88: 0a00001b beq 1f30dfc + 1f30d8c: e59d9098 ldr r9, [sp, #152] ; 0x98 + 1f30d90: ea000002 b 1f30da0 + 1f30d94: e59d9060 ldr r9, [sp, #96] ; 0x60 + 1f30d98: e1a0100c mov r1, ip + 1f30d9c: e1a04002 mov r4, r2 + 1f30da0: e2811004 add r1, r1, #4 + 1f30da4: e5d40000 ldrb r0, [r4] + 1f30da8: e2499004 sub r9, r9, #4 + 1f30dac: e3590003 cmp r9, #3 + 1f30db0: e2811004 add r1, r1, #4 + 1f30db4: e1a00340 asr r0, r0, #6 + 1f30db8: e1600380 smulbb r0, r0, r3 + 1f30dbc: e5410008 strb r0, [r1, #-8] + 1f30dc0: e5d40000 ldrb r0, [r4] + 1f30dc4: e7e10250 ubfx r0, r0, #4, #2 + 1f30dc8: e1600380 smulbb r0, r0, r3 + 1f30dcc: e5410007 strb r0, [r1, #-7] + 1f30dd0: e5d40000 ldrb r0, [r4] + 1f30dd4: e7e10150 ubfx r0, r0, #2, #2 + 1f30dd8: e1600380 smulbb r0, r0, r3 + 1f30ddc: e5410006 strb r0, [r1, #-6] + 1f30de0: e4d40001 ldrb r0, [r4], #1 + 1f30de4: e2000003 and r0, r0, #3 + 1f30de8: e1600380 smulbb r0, r0, r3 + 1f30dec: e5410005 strb r0, [r1, #-5] + 1f30df0: caffffeb bgt 1f30da4 + 1f30df4: e59d100c ldr r1, [sp, #12] + 1f30df8: e0824001 add r4, r2, r1 + 1f30dfc: e59d201c ldr r2, [sp, #28] + 1f30e00: e59d0054 ldr r0, [sp, #84] ; 0x54 + 1f30e04: e08cc002 add ip, ip, r2 + 1f30e08: e1a02004 mov r2, r4 + 1f30e0c: e3500000 cmp r0, #0 + 1f30e10: dafffe74 ble 1f307e8 + 1f30e14: e5d21000 ldrb r1, [r2] + 1f30e18: e3500001 cmp r0, #1 + 1f30e1c: e1a01341 asr r1, r1, #6 + 1f30e20: e1610381 smulbb r1, r1, r3 + 1f30e24: e5cc1000 strb r1, [ip] + 1f30e28: 0afffe6e beq 1f307e8 + 1f30e2c: e5d21000 ldrb r1, [r2] + 1f30e30: e3500003 cmp r0, #3 + 1f30e34: e7e11251 ubfx r1, r1, #4, #2 + 1f30e38: e1610381 smulbb r1, r1, r3 + 1f30e3c: e5cc1001 strb r1, [ip, #1] + 1f30e40: 05d22000 ldrbeq r2, [r2] + 1f30e44: 07e12152 ubfxeq r2, r2, #2, #2 + 1f30e48: 01630382 smulbbeq r3, r2, r3 + 1f30e4c: 05cc3002 strbeq r3, [ip, #2] + 1f30e50: eafffe64 b 1f307e8 + 1f30e54: e59d0060 ldr r0, [sp, #96] ; 0x60 + 1f30e58: e3500007 cmp r0, #7 + 1f30e5c: da00016e ble 1f3141c + 1f30e60: e59d0020 ldr r0, [sp, #32] + 1f30e64: e59d4028 ldr r4, [sp, #40] ; 0x28 + 1f30e68: e0860000 add r0, r6, r0 + 1f30e6c: e08b4004 add r4, fp, r4 + 1f30e70: e1560004 cmp r6, r4 + 1f30e74: b15b0000 cmplt fp, r0 + 1f30e78: e59d4064 ldr r4, [sp, #100] ; 0x64 + 1f30e7c: a3a00001 movge r0, #1 + 1f30e80: b3a00000 movlt r0, #0 + 1f30e84: e1140000 tst r4, r0 + 1f30e88: 0a00013c beq 1f31380 + 1f30e8c: e59d0078 ldr r0, [sp, #120] ; 0x78 + 1f30e90: e3500077 cmp r0, #119 ; 0x77 + 1f30e94: 9a0000df bls 1f31218 + 1f30e98: eee43b10 vdup.8 q2, r3 + 1f30e9c: e081a00b add sl, r1, fp + 1f30ea0: e1a0900c mov r9, ip + 1f30ea4: e3a01000 mov r1, #0 + 1f30ea8: e58da0a4 str sl, [sp, #164] ; 0xa4 + 1f30eac: e58da0a8 str sl, [sp, #168] ; 0xa8 + 1f30eb0: e58da0ac str sl, [sp, #172] ; 0xac + 1f30eb4: e58da040 str sl, [sp, #64] ; 0x40 + 1f30eb8: e58da080 str sl, [sp, #128] ; 0x80 + 1f30ebc: e58da084 str sl, [sp, #132] ; 0x84 + 1f30ec0: e58da0f0 str sl, [sp, #240] ; 0xf0 + 1f30ec4: e58d1090 str r1, [sp, #144] ; 0x90 + 1f30ec8: e58d30f4 str r3, [sp, #244] ; 0xf4 + 1f30ecc: e59d10a4 ldr r1, [sp, #164] ; 0xa4 + 1f30ed0: e59d3090 ldr r3, [sp, #144] ; 0x90 + 1f30ed4: e59d4080 ldr r4, [sp, #128] ; 0x80 + 1f30ed8: f4618a0f vld1.8 {d24-d25}, [r1] + 1f30edc: e2811010 add r1, r1, #16 + 1f30ee0: e58d10a4 str r1, [sp, #164] ; 0xa4 + 1f30ee4: e2830001 add r0, r3, #1 + 1f30ee8: e59d1084 ldr r1, [sp, #132] ; 0x84 + 1f30eec: e59d3094 ldr r3, [sp, #148] ; 0x94 + 1f30ef0: e58d0090 str r0, [sp, #144] ; 0x90 + 1f30ef4: f4610a0f vld1.8 {d16-d17}, [r1] + 1f30ef8: e1500003 cmp r0, r3 + 1f30efc: e59d1080 ldr r1, [sp, #128] ; 0x80 + 1f30f00: f3ca8078 vshr.u8 q12, q12, #6 + 1f30f04: e59d00ac ldr r0, [sp, #172] ; 0xac + 1f30f08: e59d30a8 ldr r3, [sp, #168] ; 0xa8 + 1f30f0c: e2811010 add r1, r1, #16 + 1f30f10: e58d1080 str r1, [sp, #128] ; 0x80 + 1f30f14: e59d1040 ldr r1, [sp, #64] ; 0x40 + 1f30f18: f3cf0070 vshr.u8 q8, q8, #1 + 1f30f1c: f4642a0f vld1.8 {d18-d19}, [r4] + 1f30f20: f24881d6 vand q12, q12, q3 + 1f30f24: f4604a0f vld1.8 {d20-d21}, [r0] + 1f30f28: e2800010 add r0, r0, #16 + 1f30f2c: f463ca0f vld1.8 {d28-d29}, [r3] + 1f30f30: e2833010 add r3, r3, #16 + 1f30f34: f461aa0f vld1.8 {d26-d27}, [r1] + 1f30f38: f24001d6 vand q8, q8, q3 + 1f30f3c: e59d10f0 ldr r1, [sp, #240] ; 0xf0 + 1f30f40: f24889d4 vmul.i8 q12, q12, q2 + 1f30f44: f46aea0f vld1.8 {d30-d31}, [sl] + 1f30f48: f3ce2072 vshr.u8 q9, q9, #2 + 1f30f4c: f3cc4074 vshr.u8 q10, q10, #4 + 1f30f50: e58d00ac str r0, [sp, #172] ; 0xac + 1f30f54: f4616a0f vld1.8 {d22-d23}, [r1] + 1f30f58: f3cbc07c vshr.u8 q14, q14, #5 + 1f30f5c: f3cda07a vshr.u8 q13, q13, #3 + 1f30f60: e2810010 add r0, r1, #16 + 1f30f64: f24221d6 vand q9, q9, q3 + 1f30f68: e59d1084 ldr r1, [sp, #132] ; 0x84 + 1f30f6c: f24441d6 vand q10, q10, q3 + 1f30f70: e58d30a8 str r3, [sp, #168] ; 0xa8 + 1f30f74: f24cc1d6 vand q14, q14, q3 + 1f30f78: e2813010 add r3, r1, #16 + 1f30f7c: f24661d6 vand q11, q11, q3 + 1f30f80: e59d1040 ldr r1, [sp, #64] ; 0x40 + 1f30f84: f24aa1d6 vand q13, q13, q3 + 1f30f88: e2894010 add r4, r9, #16 + 1f30f8c: f3c9e07e vshr.u8 q15, q15, #7 + 1f30f90: e58d00f0 str r0, [sp, #240] ; 0xf0 + 1f30f94: f24229d4 vmul.i8 q9, q9, q2 + 1f30f98: e2890020 add r0, r9, #32 + 1f30f9c: f24449d4 vmul.i8 q10, q10, q2 + 1f30fa0: e58d3084 str r3, [sp, #132] ; 0x84 + 1f30fa4: f24669d4 vmul.i8 q11, q11, q2 + 1f30fa8: e2813010 add r3, r1, #16 + 1f30fac: f24cc9d4 vmul.i8 q14, q14, q2 + 1f30fb0: e2891030 add r1, r9, #48 ; 0x30 + 1f30fb4: f24009d4 vmul.i8 q8, q8, q2 + 1f30fb8: e58d3040 str r3, [sp, #64] ; 0x40 + 1f30fbc: f24aa9d4 vmul.i8 q13, q13, q2 + 1f30fc0: e2893040 add r3, r9, #64 ; 0x40 + 1f30fc4: f24ee9d4 vmul.i8 q15, q15, q2 + 1f30fc8: e28aa010 add sl, sl, #16 + 1f30fcc: f3f281e2 vzip.8 q12, q9 + 1f30fd0: f3f241e6 vzip.8 q10, q11 + 1f30fd4: f3f2c1e0 vzip.8 q14, q8 + 1f30fd8: f3f2e1ea vzip.8 q15, q13 + 1f30fdc: f3f281e4 vzip.8 q12, q10 + 1f30fe0: f3f221e6 vzip.8 q9, q11 + 1f30fe4: f3f2e1ec vzip.8 q15, q14 + 1f30fe8: f3f2a1e0 vzip.8 q13, q8 + 1f30fec: f3f2e1e8 vzip.8 q15, q12 + 1f30ff0: f3f2c1e4 vzip.8 q14, q10 + 1f30ff4: f3f2a1e2 vzip.8 q13, q9 + 1f30ff8: f3f201e6 vzip.8 q8, q11 + 1f30ffc: f449ea0f vst1.8 {d30-d31}, [r9] + 1f31000: f4448a0f vst1.8 {d24-d25}, [r4] + 1f31004: e2894050 add r4, r9, #80 ; 0x50 + 1f31008: f440ca0f vst1.8 {d28-d29}, [r0] + 1f3100c: e2890060 add r0, r9, #96 ; 0x60 + 1f31010: f4414a0f vst1.8 {d20-d21}, [r1] + 1f31014: e2891070 add r1, r9, #112 ; 0x70 + 1f31018: f443aa0f vst1.8 {d26-d27}, [r3] + 1f3101c: e2899080 add r9, r9, #128 ; 0x80 + 1f31020: f4442a0f vst1.8 {d18-d19}, [r4] + 1f31024: f4400a0f vst1.8 {d16-d17}, [r0] + 1f31028: f4416a0f vst1.8 {d22-d23}, [r1] + 1f3102c: 3affffa6 bcc 1f30ecc + 1f31030: e59d1088 ldr r1, [sp, #136] ; 0x88 + 1f31034: e59d0028 ldr r0, [sp, #40] ; 0x28 + 1f31038: e59d30f4 ldr r3, [sp, #244] ; 0xf4 + 1f3103c: e1510000 cmp r1, r0 + 1f31040: e0820001 add r0, r2, r1 + 1f31044: e59d1070 ldr r1, [sp, #112] ; 0x70 + 1f31048: e08c1001 add r1, ip, r1 + 1f3104c: 0a00009b beq 1f312c0 + 1f31050: e59d908c ldr r9, [sp, #140] ; 0x8c + 1f31054: ea000072 b 1f31224 + 1f31058: e1a02003 mov r2, r3 + 1f3105c: e59d1004 ldr r1, [sp, #4] + 1f31060: eafff590 b 1f2e6a8 + 1f31064: e1a02003 mov r2, r3 + 1f31068: e59d1004 ldr r1, [sp, #4] + 1f3106c: eafff2fd b 1f2dc68 + 1f31070: e3a01007 mov r1, #7 + 1f31074: eafff8e8 b 1f2f41c + 1f31078: e3a01007 mov r1, #7 + 1f3107c: eafff79c b 1f2eef4 + 1f31080: e3a01007 mov r1, #7 + 1f31084: eafffb9c b 1f2fefc + 1f31088: e3a01007 mov r1, #7 + 1f3108c: eafffa3b b 1f2f980 + 1f31090: e3a00007 mov r0, #7 + 1f31094: eafffc8d b 1f302d0 + 1f31098: e1a02003 mov r2, r3 + 1f3109c: e59d1004 ldr r1, [sp, #4] + 1f310a0: eafff449 b 1f2e1cc + 1f310a4: e1a0100c mov r1, ip + 1f310a8: e1a00002 mov r0, r2 + 1f310ac: e59d4060 ldr r4, [sp, #96] ; 0x60 + 1f310b0: eafffe3c b 1f309a8 + 1f310b4: e59d10a0 ldr r1, [sp, #160] ; 0xa0 + 1f310b8: e28c4002 add r4, ip, #2 + 1f310bc: e2420001 sub r0, r2, #1 + 1f310c0: e0829001 add r9, r2, r1 + 1f310c4: e5f01001 ldrb r1, [r0, #1]! + 1f310c8: e2844002 add r4, r4, #2 + 1f310cc: e1590000 cmp r9, r0 + 1f310d0: e1a01241 asr r1, r1, #4 + 1f310d4: e1610381 smulbb r1, r1, r3 + 1f310d8: e5441004 strb r1, [r4, #-4] + 1f310dc: e5d01000 ldrb r1, [r0] + 1f310e0: e201100f and r1, r1, #15 + 1f310e4: e1610381 smulbb r1, r1, r3 + 1f310e8: e5441003 strb r1, [r4, #-3] + 1f310ec: 1afffff4 bne 1f310c4 + 1f310f0: eafffecd b 1f30c2c + 1f310f4: e1a02001 mov r2, r1 + 1f310f8: e1a0000c mov r0, ip + 1f310fc: e248e001 sub lr, r8, #1 + 1f31100: e2491001 sub r1, r9, #1 + 1f31104: e08cc002 add ip, ip, r2 + 1f31108: e4d03001 ldrb r3, [r0], #1 + 1f3110c: e5fe2001 ldrb r2, [lr, #1]! + 1f31110: e150000c cmp r0, ip + 1f31114: e0833002 add r3, r3, r2 + 1f31118: e5e13001 strb r3, [r1, #1]! + 1f3111c: 1afffff9 bne 1f31108 + 1f31120: eafff4c5 b 1f2e43c + 1f31124: e59d3018 ldr r3, [sp, #24] + 1f31128: e1a01009 mov r1, r9 + 1f3112c: e089e002 add lr, r9, r2 + 1f31130: e243c001 sub ip, r3, #1 + 1f31134: e4d02001 ldrb r2, [r0], #1 + 1f31138: e5fc3001 ldrb r3, [ip, #1]! + 1f3113c: e08330a2 add r3, r3, r2, lsr #1 + 1f31140: e4c13001 strb r3, [r1], #1 + 1f31144: e15e0001 cmp lr, r1 + 1f31148: 1afffff9 bne 1f31134 + 1f3114c: eafff4ba b 1f2e43c + 1f31150: e59d3018 ldr r3, [sp, #24] + 1f31154: e089400e add r4, r9, lr + 1f31158: e1a01009 mov r1, r9 + 1f3115c: e2485001 sub r5, r8, #1 + 1f31160: e243e001 sub lr, r3, #1 + 1f31164: e4dc0001 ldrb r0, [ip], #1 + 1f31168: e5f52001 ldrb r2, [r5, #1]! + 1f3116c: e5fe3001 ldrb r3, [lr, #1]! + 1f31170: e0822000 add r2, r2, r0 + 1f31174: e08330c2 add r3, r3, r2, asr #1 + 1f31178: e4c13001 strb r3, [r1], #1 + 1f3117c: e1540001 cmp r4, r1 + 1f31180: 1afffff7 bne 1f31164 + 1f31184: eafff4ac b 1f2e43c + 1f31188: e1a03000 mov r3, r0 + 1f3118c: e1a01009 mov r1, r9 + 1f31190: e089e003 add lr, r9, r3 + 1f31194: e59d3018 ldr r3, [sp, #24] + 1f31198: e1a00002 mov r0, r2 + 1f3119c: e243c001 sub ip, r3, #1 + 1f311a0: e4d03001 ldrb r3, [r0], #1 + 1f311a4: e5fc2001 ldrb r2, [ip, #1]! + 1f311a8: e0833002 add r3, r3, r2 + 1f311ac: e4c13001 strb r3, [r1], #1 + 1f311b0: e15e0001 cmp lr, r1 + 1f311b4: 1afffff9 bne 1f311a0 + 1f311b8: eafff49f b 1f2e43c + 1f311bc: e59d000c ldr r0, [sp, #12] + 1f311c0: e28c1004 add r1, ip, #4 + 1f311c4: e0824000 add r4, r2, r0 + 1f311c8: e5d20000 ldrb r0, [r2] + 1f311cc: e2811004 add r1, r1, #4 + 1f311d0: e1a00340 asr r0, r0, #6 + 1f311d4: e1600380 smulbb r0, r0, r3 + 1f311d8: e5410008 strb r0, [r1, #-8] + 1f311dc: e5d20000 ldrb r0, [r2] + 1f311e0: e7e10250 ubfx r0, r0, #4, #2 + 1f311e4: e1600380 smulbb r0, r0, r3 + 1f311e8: e5410007 strb r0, [r1, #-7] + 1f311ec: e5d20000 ldrb r0, [r2] + 1f311f0: e7e10150 ubfx r0, r0, #2, #2 + 1f311f4: e1600380 smulbb r0, r0, r3 + 1f311f8: e5410006 strb r0, [r1, #-6] + 1f311fc: e4d20001 ldrb r0, [r2], #1 + 1f31200: e2000003 and r0, r0, #3 + 1f31204: e1520004 cmp r2, r4 + 1f31208: e1600380 smulbb r0, r0, r3 + 1f3120c: e5410005 strb r0, [r1, #-5] + 1f31210: 1affffec bne 1f311c8 + 1f31214: eafffef8 b 1f30dfc + 1f31218: e59d9060 ldr r9, [sp, #96] ; 0x60 + 1f3121c: e1a0100c mov r1, ip + 1f31220: e1a00002 mov r0, r2 + 1f31224: e2811008 add r1, r1, #8 + 1f31228: e5d04000 ldrb r4, [r0] + 1f3122c: e2499008 sub r9, r9, #8 + 1f31230: e3590007 cmp r9, #7 + 1f31234: e2811008 add r1, r1, #8 + 1f31238: e1a043c4 asr r4, r4, #7 + 1f3123c: e1640384 smulbb r4, r4, r3 + 1f31240: e5414010 strb r4, [r1, #-16] + 1f31244: e5d04000 ldrb r4, [r0] + 1f31248: e7e04354 ubfx r4, r4, #6, #1 + 1f3124c: e1640384 smulbb r4, r4, r3 + 1f31250: e541400f strb r4, [r1, #-15] + 1f31254: e5d04000 ldrb r4, [r0] + 1f31258: e7e042d4 ubfx r4, r4, #5, #1 + 1f3125c: e1640384 smulbb r4, r4, r3 + 1f31260: e541400e strb r4, [r1, #-14] + 1f31264: e5d04000 ldrb r4, [r0] + 1f31268: e7e04254 ubfx r4, r4, #4, #1 + 1f3126c: e1640384 smulbb r4, r4, r3 + 1f31270: e541400d strb r4, [r1, #-13] + 1f31274: e5d04000 ldrb r4, [r0] + 1f31278: e7e041d4 ubfx r4, r4, #3, #1 + 1f3127c: e1640384 smulbb r4, r4, r3 + 1f31280: e541400c strb r4, [r1, #-12] + 1f31284: e5d04000 ldrb r4, [r0] + 1f31288: e7e04154 ubfx r4, r4, #2, #1 + 1f3128c: e1640384 smulbb r4, r4, r3 + 1f31290: e541400b strb r4, [r1, #-11] + 1f31294: e5d04000 ldrb r4, [r0] + 1f31298: e7e040d4 ubfx r4, r4, #1, #1 + 1f3129c: e1640384 smulbb r4, r4, r3 + 1f312a0: e541400a strb r4, [r1, #-10] + 1f312a4: e4d04001 ldrb r4, [r0], #1 + 1f312a8: e2044001 and r4, r4, #1 + 1f312ac: e1640384 smulbb r4, r4, r3 + 1f312b0: e5414009 strb r4, [r1, #-9] + 1f312b4: caffffdb bgt 1f31228 + 1f312b8: e59d1028 ldr r1, [sp, #40] ; 0x28 + 1f312bc: e0820001 add r0, r2, r1 + 1f312c0: e59d2020 ldr r2, [sp, #32] + 1f312c4: e59d106c ldr r1, [sp, #108] ; 0x6c + 1f312c8: e08cc002 add ip, ip, r2 + 1f312cc: e1a02000 mov r2, r0 + 1f312d0: e3510000 cmp r1, #0 + 1f312d4: dafffd43 ble 1f307e8 + 1f312d8: e5d20000 ldrb r0, [r2] + 1f312dc: e3510001 cmp r1, #1 + 1f312e0: e1a003c0 asr r0, r0, #7 + 1f312e4: e1600380 smulbb r0, r0, r3 + 1f312e8: e5cc0000 strb r0, [ip] + 1f312ec: 0afffd3d beq 1f307e8 + 1f312f0: e5d20000 ldrb r0, [r2] + 1f312f4: e3510002 cmp r1, #2 + 1f312f8: e7e00350 ubfx r0, r0, #6, #1 + 1f312fc: e1600380 smulbb r0, r0, r3 + 1f31300: e5cc0001 strb r0, [ip, #1] + 1f31304: 0afffd37 beq 1f307e8 + 1f31308: e5d20000 ldrb r0, [r2] + 1f3130c: e3510003 cmp r1, #3 + 1f31310: e7e002d0 ubfx r0, r0, #5, #1 + 1f31314: e1600380 smulbb r0, r0, r3 + 1f31318: e5cc0002 strb r0, [ip, #2] + 1f3131c: 0afffd31 beq 1f307e8 + 1f31320: e5d20000 ldrb r0, [r2] + 1f31324: e3510004 cmp r1, #4 + 1f31328: e7e00250 ubfx r0, r0, #4, #1 + 1f3132c: e1600380 smulbb r0, r0, r3 + 1f31330: e5cc0003 strb r0, [ip, #3] + 1f31334: 0afffd2b beq 1f307e8 + 1f31338: e5d20000 ldrb r0, [r2] + 1f3133c: e3510005 cmp r1, #5 + 1f31340: e7e001d0 ubfx r0, r0, #3, #1 + 1f31344: e1600380 smulbb r0, r0, r3 + 1f31348: e5cc0004 strb r0, [ip, #4] + 1f3134c: 0afffd25 beq 1f307e8 + 1f31350: e5d20000 ldrb r0, [r2] + 1f31354: e3510007 cmp r1, #7 + 1f31358: e7e01150 ubfx r1, r0, #2, #1 + 1f3135c: e1610381 smulbb r1, r1, r3 + 1f31360: e5cc1005 strb r1, [ip, #5] + 1f31364: 05d22000 ldrbeq r2, [r2] + 1f31368: 07e020d2 ubfxeq r2, r2, #1, #1 + 1f3136c: 01630382 smulbbeq r3, r2, r3 + 1f31370: 05cc3006 strbeq r3, [ip, #6] + 1f31374: eafffd1b b 1f307e8 + 1f31378: e1a01000 mov r1, r0 + 1f3137c: eafffe2f b 1f30c40 + 1f31380: e59d0028 ldr r0, [sp, #40] ; 0x28 + 1f31384: e28c1008 add r1, ip, #8 + 1f31388: e0820000 add r0, r2, r0 + 1f3138c: e5d24000 ldrb r4, [r2] + 1f31390: e2811008 add r1, r1, #8 + 1f31394: e1a043c4 asr r4, r4, #7 + 1f31398: e1640384 smulbb r4, r4, r3 + 1f3139c: e5414010 strb r4, [r1, #-16] + 1f313a0: e5d24000 ldrb r4, [r2] + 1f313a4: e7e04354 ubfx r4, r4, #6, #1 + 1f313a8: e1640384 smulbb r4, r4, r3 + 1f313ac: e541400f strb r4, [r1, #-15] + 1f313b0: e5d24000 ldrb r4, [r2] + 1f313b4: e7e042d4 ubfx r4, r4, #5, #1 + 1f313b8: e1640384 smulbb r4, r4, r3 + 1f313bc: e541400e strb r4, [r1, #-14] + 1f313c0: e5d24000 ldrb r4, [r2] + 1f313c4: e7e04254 ubfx r4, r4, #4, #1 + 1f313c8: e1640384 smulbb r4, r4, r3 + 1f313cc: e541400d strb r4, [r1, #-13] + 1f313d0: e5d24000 ldrb r4, [r2] + 1f313d4: e7e041d4 ubfx r4, r4, #3, #1 + 1f313d8: e1640384 smulbb r4, r4, r3 + 1f313dc: e541400c strb r4, [r1, #-12] + 1f313e0: e5d24000 ldrb r4, [r2] + 1f313e4: e7e04154 ubfx r4, r4, #2, #1 + 1f313e8: e1640384 smulbb r4, r4, r3 + 1f313ec: e541400b strb r4, [r1, #-11] + 1f313f0: e5d24000 ldrb r4, [r2] + 1f313f4: e7e040d4 ubfx r4, r4, #1, #1 + 1f313f8: e1640384 smulbb r4, r4, r3 + 1f313fc: e541400a strb r4, [r1, #-10] + 1f31400: e4d24001 ldrb r4, [r2], #1 + 1f31404: e2044001 and r4, r4, #1 + 1f31408: e1520000 cmp r2, r0 + 1f3140c: e1640384 smulbb r4, r4, r3 + 1f31410: e5414009 strb r4, [r1, #-9] + 1f31414: 1affffdc bne 1f3138c + 1f31418: eaffffa8 b 1f312c0 + 1f3141c: e1a01000 mov r1, r0 + 1f31420: eaffffaa b 1f312d0 + 1f31424: e3a02007 mov r2, #7 + 1f31428: e59d1004 ldr r1, [sp, #4] + 1f3142c: eafff366 b 1f2e1cc + 1f31430: e3a02007 mov r2, #7 + 1f31434: e59d1004 ldr r1, [sp, #4] + 1f31438: eafff49a b 1f2e6a8 + 1f3143c: e3a02007 mov r2, #7 + 1f31440: e59d1004 ldr r1, [sp, #4] + 1f31444: eafff207 b 1f2dc68 + 1f31448: e3a02007 mov r2, #7 + 1f3144c: eafff51d b 1f2e8c8 + 1f31450: e59d3068 ldr r3, [sp, #104] ; 0x68 + 1f31454: e7d3b00b ldrb fp, [r3, fp] + 1f31458: eafff5b6 b 1f2eb38 + +01f3145c : + 1f3145c: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f31460: e3003828 movw r3, #2088 ; 0x828 + 1f31464: e0805101 add r5, r0, r1, lsl #2 + 1f31468: e1a04000 mov r4, r0 + 1f3146c: e19520f3 ldrsh r2, [r5, r3] + 1f31470: e3520000 cmp r2, #0 + 1f31474: ba00005f blt 1f315f8 + 1f31478: e0806102 add r6, r0, r2, lsl #2 + 1f3147c: e19620f3 ldrsh r2, [r6, r3] + 1f31480: e3520000 cmp r2, #0 + 1f31484: ba000032 blt 1f31554 + 1f31488: e0807102 add r7, r0, r2, lsl #2 + 1f3148c: e19720f3 ldrsh r2, [r7, r3] + 1f31490: e3520000 cmp r2, #0 + 1f31494: ba000082 blt 1f316a4 + 1f31498: e0808102 add r8, r0, r2, lsl #2 + 1f3149c: e19810f3 ldrsh r1, [r8, r3] + 1f314a0: e3510000 cmp r1, #0 + 1f314a4: ba000001 blt 1f314b0 + 1f314a8: e6ff1071 uxth r1, r1 + 1f314ac: ebffffea bl 1f3145c + 1f314b0: e2842901 add r2, r4, #16384 ; 0x4000 + 1f314b4: e592384c ldr r3, [r2, #2124] ; 0x84c + 1f314b8: e5920844 ldr r0, [r2, #2116] ; 0x844 + 1f314bc: e1530000 cmp r3, r0 + 1f314c0: a8bd87f0 popge {r4, r5, r6, r7, r8, r9, sl, pc} + 1f314c4: e5d8882b ldrb r8, [r8, #2091] ; 0x82b + 1f314c8: e592e828 ldr lr, [r2, #2088] ; 0x828 + 1f314cc: e5921848 ldr r1, [r2, #2120] ; 0x848 + 1f314d0: e08ec108 add ip, lr, r8, lsl #2 + 1f314d4: e1dc90d3 ldrsb r9, [ip, #3] + 1f314d8: e3590000 cmp r9, #0 + 1f314dc: ba0000c8 blt 1f31804 + 1f314e0: e592c840 ldr ip, [r2, #2112] ; 0x840 + 1f314e4: e2811004 add r1, r1, #4 + 1f314e8: e5821848 str r1, [r2, #2120] ; 0x848 + 1f314ec: e151000c cmp r1, ip + 1f314f0: ba00006e blt 1f316b0 + 1f314f4: e5921830 ldr r1, [r2, #2096] ; 0x830 + 1f314f8: e592e838 ldr lr, [r2, #2104] ; 0x838 + 1f314fc: e0833001 add r3, r3, r1 + 1f31500: e582e848 str lr, [r2, #2120] ; 0x848 + 1f31504: e1530000 cmp r3, r0 + 1f31508: e582384c str r3, [r2, #2124] ; 0x84c + 1f3150c: ba00006a blt 1f316bc + 1f31510: e592182c ldr r1, [r2, #2092] ; 0x82c + 1f31514: e3510000 cmp r1, #0 + 1f31518: d8bd87f0 pople {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3151c: e5929850 ldr r9, [r2, #2128] ; 0x850 + 1f31520: e592883c ldr r8, [r2, #2108] ; 0x83c + 1f31524: ea000001 b 1f31530 + 1f31528: e3510000 cmp r1, #0 + 1f3152c: 0a000092 beq 1f3177c + 1f31530: e1a0c119 lsl ip, r9, r1 + 1f31534: e2411001 sub r1, r1, #1 + 1f31538: e08830cc add r3, r8, ip, asr #1 + 1f3153c: e1530000 cmp r3, r0 + 1f31540: aafffff8 bge 1f31528 + 1f31544: e582c830 str ip, [r2, #2096] ; 0x830 + 1f31548: e582384c str r3, [r2, #2124] ; 0x84c + 1f3154c: e582182c str r1, [r2, #2092] ; 0x82c + 1f31550: ea000059 b 1f316bc + 1f31554: e2802901 add r2, r0, #16384 ; 0x4000 + 1f31558: e592384c ldr r3, [r2, #2124] ; 0x84c + 1f3155c: e5920844 ldr r0, [r2, #2116] ; 0x844 + 1f31560: e1530000 cmp r3, r0 + 1f31564: a8bd87f0 popge {r4, r5, r6, r7, r8, r9, sl, pc} + 1f31568: e592e848 ldr lr, [r2, #2120] ; 0x848 + 1f3156c: e5d6682b ldrb r6, [r6, #2091] ; 0x82b + 1f31570: e592c828 ldr ip, [r2, #2088] ; 0x828 + 1f31574: e08c1106 add r1, ip, r6, lsl #2 + 1f31578: e1d170d3 ldrsb r7, [r1, #3] + 1f3157c: e3570000 cmp r7, #0 + 1f31580: ba000081 blt 1f3178c + 1f31584: e5921840 ldr r1, [r2, #2112] ; 0x840 + 1f31588: e28ee004 add lr, lr, #4 + 1f3158c: e582e848 str lr, [r2, #2120] ; 0x848 + 1f31590: e15e0001 cmp lr, r1 + 1f31594: ba00001a blt 1f31604 + 1f31598: e5921830 ldr r1, [r2, #2096] ; 0x830 + 1f3159c: e592e838 ldr lr, [r2, #2104] ; 0x838 + 1f315a0: e0833001 add r3, r3, r1 + 1f315a4: e582e848 str lr, [r2, #2120] ; 0x848 + 1f315a8: e1530000 cmp r3, r0 + 1f315ac: e582384c str r3, [r2, #2124] ; 0x84c + 1f315b0: ba000016 blt 1f31610 + 1f315b4: e592182c ldr r1, [r2, #2092] ; 0x82c + 1f315b8: e3510000 cmp r1, #0 + 1f315bc: d8bd87f0 pople {r4, r5, r6, r7, r8, r9, sl, pc} + 1f315c0: e5927850 ldr r7, [r2, #2128] ; 0x850 + 1f315c4: e592683c ldr r6, [r2, #2108] ; 0x83c + 1f315c8: ea000001 b 1f315d4 + 1f315cc: e3510000 cmp r1, #0 + 1f315d0: 0a000069 beq 1f3177c + 1f315d4: e1a0c117 lsl ip, r7, r1 + 1f315d8: e2411001 sub r1, r1, #1 + 1f315dc: e08630cc add r3, r6, ip, asr #1 + 1f315e0: e1530000 cmp r3, r0 + 1f315e4: aafffff8 bge 1f315cc + 1f315e8: e582c830 str ip, [r2, #2096] ; 0x830 + 1f315ec: e582384c str r3, [r2, #2124] ; 0x84c + 1f315f0: e582182c str r1, [r2, #2092] ; 0x82c + 1f315f4: ea000005 b 1f31610 + 1f315f8: e2802901 add r2, r0, #16384 ; 0x4000 + 1f315fc: e592384c ldr r3, [r2, #2124] ; 0x84c + 1f31600: e5920844 ldr r0, [r2, #2116] ; 0x844 + 1f31604: e1530000 cmp r3, r0 + 1f31608: a8bd87f0 popge {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3160c: e592e848 ldr lr, [r2, #2120] ; 0x848 + 1f31610: e5d5c82b ldrb ip, [r5, #2091] ; 0x82b + 1f31614: e5920828 ldr r0, [r2, #2088] ; 0x828 + 1f31618: e080110c add r1, r0, ip, lsl #2 + 1f3161c: e1d150d3 ldrsb r5, [r1, #3] + 1f31620: e3550000 cmp r5, #0 + 1f31624: ba000047 blt 1f31748 + 1f31628: e5921840 ldr r1, [r2, #2112] ; 0x840 + 1f3162c: e28e3004 add r3, lr, #4 + 1f31630: e5823848 str r3, [r2, #2120] ; 0x848 + 1f31634: e1530001 cmp r3, r1 + 1f31638: b8bd87f0 poplt {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3163c: e592384c ldr r3, [r2, #2124] ; 0x84c + 1f31640: e5921830 ldr r1, [r2, #2096] ; 0x830 + 1f31644: e592c844 ldr ip, [r2, #2116] ; 0x844 + 1f31648: e0833001 add r3, r3, r1 + 1f3164c: e5921838 ldr r1, [r2, #2104] ; 0x838 + 1f31650: e153000c cmp r3, ip + 1f31654: e582384c str r3, [r2, #2124] ; 0x84c + 1f31658: e5821848 str r1, [r2, #2120] ; 0x848 + 1f3165c: b8bd87f0 poplt {r4, r5, r6, r7, r8, r9, sl, pc} + 1f31660: e592382c ldr r3, [r2, #2092] ; 0x82c + 1f31664: e3530000 cmp r3, #0 + 1f31668: d8bd87f0 pople {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3166c: e5924850 ldr r4, [r2, #2128] ; 0x850 + 1f31670: e592e83c ldr lr, [r2, #2108] ; 0x83c + 1f31674: ea000001 b 1f31680 + 1f31678: e3530000 cmp r3, #0 + 1f3167c: 0a000004 beq 1f31694 + 1f31680: e1a00314 lsl r0, r4, r3 + 1f31684: e2433001 sub r3, r3, #1 + 1f31688: e08e10c0 add r1, lr, r0, asr #1 + 1f3168c: e151000c cmp r1, ip + 1f31690: aafffff8 bge 1f31678 + 1f31694: e5820830 str r0, [r2, #2096] ; 0x830 + 1f31698: e582184c str r1, [r2, #2124] ; 0x84c + 1f3169c: e582382c str r3, [r2, #2092] ; 0x82c + 1f316a0: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f316a4: e2802901 add r2, r0, #16384 ; 0x4000 + 1f316a8: e592384c ldr r3, [r2, #2124] ; 0x84c + 1f316ac: e5920844 ldr r0, [r2, #2116] ; 0x844 + 1f316b0: e1530000 cmp r3, r0 + 1f316b4: a8bd87f0 popge {r4, r5, r6, r7, r8, r9, sl, pc} + 1f316b8: e592e848 ldr lr, [r2, #2120] ; 0x848 + 1f316bc: e5d7882b ldrb r8, [r7, #2091] ; 0x82b + 1f316c0: e5927828 ldr r7, [r2, #2088] ; 0x828 + 1f316c4: e087c108 add ip, r7, r8, lsl #2 + 1f316c8: e1dc10d3 ldrsb r1, [ip, #3] + 1f316cc: e3510000 cmp r1, #0 + 1f316d0: ba00003c blt 1f317c8 + 1f316d4: e592c840 ldr ip, [r2, #2112] ; 0x840 + 1f316d8: e28e1004 add r1, lr, #4 + 1f316dc: e5821848 str r1, [r2, #2120] ; 0x848 + 1f316e0: e151000c cmp r1, ip + 1f316e4: baffff9d blt 1f31560 + 1f316e8: e5921830 ldr r1, [r2, #2096] ; 0x830 + 1f316ec: e592e838 ldr lr, [r2, #2104] ; 0x838 + 1f316f0: e0833001 add r3, r3, r1 + 1f316f4: e582e848 str lr, [r2, #2120] ; 0x848 + 1f316f8: e1530000 cmp r3, r0 + 1f316fc: e582384c str r3, [r2, #2124] ; 0x84c + 1f31700: baffff99 blt 1f3156c + 1f31704: e592182c ldr r1, [r2, #2092] ; 0x82c + 1f31708: e3510000 cmp r1, #0 + 1f3170c: d8bd87f0 pople {r4, r5, r6, r7, r8, r9, sl, pc} + 1f31710: e5928850 ldr r8, [r2, #2128] ; 0x850 + 1f31714: e592783c ldr r7, [r2, #2108] ; 0x83c + 1f31718: ea000001 b 1f31724 + 1f3171c: e3510000 cmp r1, #0 + 1f31720: 0a000015 beq 1f3177c + 1f31724: e1a0c118 lsl ip, r8, r1 + 1f31728: e2411001 sub r1, r1, #1 + 1f3172c: e08730cc add r3, r7, ip, asr #1 + 1f31730: e1530000 cmp r3, r0 + 1f31734: aafffff8 bge 1f3171c + 1f31738: e582c830 str ip, [r2, #2096] ; 0x830 + 1f3173c: e582384c str r3, [r2, #2124] ; 0x84c + 1f31740: e582182c str r1, [r2, #2092] ; 0x82c + 1f31744: eaffff88 b 1f3156c + 1f31748: e5944008 ldr r4, [r4, #8] + 1f3174c: e083300e add r3, r3, lr + 1f31750: e5d15002 ldrb r5, [r1, #2] + 1f31754: e084e003 add lr, r4, r3 + 1f31758: e7c45003 strb r5, [r4, r3] + 1f3175c: e5d13001 ldrb r3, [r1, #1] + 1f31760: e5ce3001 strb r3, [lr, #1] + 1f31764: e7d0310c ldrb r3, [r0, ip, lsl #2] + 1f31768: e5ce3002 strb r3, [lr, #2] + 1f3176c: e5d13003 ldrb r3, [r1, #3] + 1f31770: e5ce3003 strb r3, [lr, #3] + 1f31774: e592e848 ldr lr, [r2, #2120] ; 0x848 + 1f31778: eaffffaa b 1f31628 + 1f3177c: e582c830 str ip, [r2, #2096] ; 0x830 + 1f31780: e582384c str r3, [r2, #2124] ; 0x84c + 1f31784: e582182c str r1, [r2, #2092] ; 0x82c + 1f31788: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3178c: e083300e add r3, r3, lr + 1f31790: e594e008 ldr lr, [r4, #8] + 1f31794: e5d17002 ldrb r7, [r1, #2] + 1f31798: e08e0003 add r0, lr, r3 + 1f3179c: e7ce7003 strb r7, [lr, r3] + 1f317a0: e5d13001 ldrb r3, [r1, #1] + 1f317a4: e5c03001 strb r3, [r0, #1] + 1f317a8: e7dc3106 ldrb r3, [ip, r6, lsl #2] + 1f317ac: e5c03002 strb r3, [r0, #2] + 1f317b0: e5d13003 ldrb r3, [r1, #3] + 1f317b4: e5c03003 strb r3, [r0, #3] + 1f317b8: e592e848 ldr lr, [r2, #2120] ; 0x848 + 1f317bc: e592384c ldr r3, [r2, #2124] ; 0x84c + 1f317c0: e5920844 ldr r0, [r2, #2116] ; 0x844 + 1f317c4: eaffff6e b 1f31584 + 1f317c8: e5941008 ldr r1, [r4, #8] + 1f317cc: e083300e add r3, r3, lr + 1f317d0: e5dce002 ldrb lr, [ip, #2] + 1f317d4: e0810003 add r0, r1, r3 + 1f317d8: e7c1e003 strb lr, [r1, r3] + 1f317dc: e5dc3001 ldrb r3, [ip, #1] + 1f317e0: e5c03001 strb r3, [r0, #1] + 1f317e4: e7d73108 ldrb r3, [r7, r8, lsl #2] + 1f317e8: e5c03002 strb r3, [r0, #2] + 1f317ec: e5dc3003 ldrb r3, [ip, #3] + 1f317f0: e5c03003 strb r3, [r0, #3] + 1f317f4: e592e848 ldr lr, [r2, #2120] ; 0x848 + 1f317f8: e592384c ldr r3, [r2, #2124] ; 0x84c + 1f317fc: e5920844 ldr r0, [r2, #2116] ; 0x844 + 1f31800: eaffffb3 b 1f316d4 + 1f31804: e5940008 ldr r0, [r4, #8] + 1f31808: e0831001 add r1, r3, r1 + 1f3180c: e5dc9002 ldrb r9, [ip, #2] + 1f31810: e0803001 add r3, r0, r1 + 1f31814: e7c09001 strb r9, [r0, r1] + 1f31818: e5dc1001 ldrb r1, [ip, #1] + 1f3181c: e5c31001 strb r1, [r3, #1] + 1f31820: e7de1108 ldrb r1, [lr, r8, lsl #2] + 1f31824: e5c31002 strb r1, [r3, #2] + 1f31828: e5dc1003 ldrb r1, [ip, #3] + 1f3182c: e5c31003 strb r1, [r3, #3] + 1f31830: e5921848 ldr r1, [r2, #2120] ; 0x848 + 1f31834: e592384c ldr r3, [r2, #2124] ; 0x84c + 1f31838: e5920844 ldr r0, [r2, #2116] ; 0x844 + 1f3183c: eaffff27 b 1f314e0 + +01f31840 : + 1f31840: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f31844: e5904000 ldr r4, [r0] + 1f31848: e3a02000 mov r2, #0 + 1f3184c: e24dd01c sub sp, sp, #28 + 1f31850: e1a09000 mov r9, r0 + 1f31854: e5802008 str r2, [r0, #8] + 1f31858: e59430ac ldr r3, [r4, #172] ; 0xac + 1f3185c: e59410a8 ldr r1, [r4, #168] ; 0xa8 + 1f31860: e5802004 str r2, [r0, #4] + 1f31864: e1530001 cmp r3, r1 + 1f31868: e580200c str r2, [r0, #12] + 1f3186c: 8a00001a bhi 1f318dc + 1f31870: e5943020 ldr r3, [r4, #32] + 1f31874: e1530002 cmp r3, r2 + 1f31878: 1a000008 bne 1f318a0 + 1f3187c: e30a336c movw r3, #41836 ; 0xa36c + 1f31880: e340320d movt r3, #525 ; 0x20d + 1f31884: e3001fe0 movw r1, #4064 ; 0xfe0 + 1f31888: e34011f6 movt r1, #502 ; 0x1f6 + 1f3188c: e3a02000 mov r2, #0 + 1f31890: e5831000 str r1, [r3] + 1f31894: e1a00002 mov r0, r2 + 1f31898: e28dd01c add sp, sp, #28 + 1f3189c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f318a0: e2845028 add r5, r4, #40 ; 0x28 + 1f318a4: e5943010 ldr r3, [r4, #16] + 1f318a8: e1a01005 mov r1, r5 + 1f318ac: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f318b0: e594001c ldr r0, [r4, #28] + 1f318b4: e12fff33 blx r3 + 1f318b8: e3500000 cmp r0, #0 + 1f318bc: 0a000114 beq 1f31d14 + 1f318c0: e0853000 add r3, r5, r0 + 1f318c4: e5d40028 ldrb r0, [r4, #40] ; 0x28 + 1f318c8: e2841029 add r1, r4, #41 ; 0x29 + 1f318cc: e58430ac str r3, [r4, #172] ; 0xac + 1f318d0: e1a02001 mov r2, r1 + 1f318d4: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f318d8: ea000002 b 1f318e8 + 1f318dc: e2812001 add r2, r1, #1 + 1f318e0: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f318e4: e5d10000 ldrb r0, [r1] + 1f318e8: e3500089 cmp r0, #137 ; 0x89 + 1f318ec: 1affffe2 bne 1f3187c + 1f318f0: e1520003 cmp r2, r3 + 1f318f4: 3a000012 bcc 1f31944 + 1f318f8: e5943020 ldr r3, [r4, #32] + 1f318fc: e3530000 cmp r3, #0 + 1f31900: 0affffdd beq 1f3187c + 1f31904: e2845028 add r5, r4, #40 ; 0x28 + 1f31908: e5943010 ldr r3, [r4, #16] + 1f3190c: e1a01005 mov r1, r5 + 1f31910: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f31914: e594001c ldr r0, [r4, #28] + 1f31918: e12fff33 blx r3 + 1f3191c: e3500000 cmp r0, #0 + 1f31920: 1a00011e bne 1f31da0 + 1f31924: e2843029 add r3, r4, #41 ; 0x29 + 1f31928: e5840020 str r0, [r4, #32] + 1f3192c: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f31930: e1a02003 mov r2, r3 + 1f31934: e58430ac str r3, [r4, #172] ; 0xac + 1f31938: e1a01002 mov r1, r2 + 1f3193c: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f31940: ea000002 b 1f31950 + 1f31944: e2821001 add r1, r2, #1 + 1f31948: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f3194c: e5d20000 ldrb r0, [r2] + 1f31950: e3500050 cmp r0, #80 ; 0x50 + 1f31954: 1affffc8 bne 1f3187c + 1f31958: e1530001 cmp r3, r1 + 1f3195c: 9a000061 bls 1f31ae8 + 1f31960: e2812001 add r2, r1, #1 + 1f31964: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f31968: e5d10000 ldrb r0, [r1] + 1f3196c: e350004e cmp r0, #78 ; 0x4e + 1f31970: 1affffc1 bne 1f3187c + 1f31974: e1530002 cmp r3, r2 + 1f31978: 9a00006c bls 1f31b30 + 1f3197c: e2821001 add r1, r2, #1 + 1f31980: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f31984: e5d20000 ldrb r0, [r2] + 1f31988: e3500047 cmp r0, #71 ; 0x47 + 1f3198c: 1affffba bne 1f3187c + 1f31990: e1530001 cmp r3, r1 + 1f31994: 9a000077 bls 1f31b78 + 1f31998: e2812001 add r2, r1, #1 + 1f3199c: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f319a0: e5d10000 ldrb r0, [r1] + 1f319a4: e350000d cmp r0, #13 + 1f319a8: 1affffb3 bne 1f3187c + 1f319ac: e1530002 cmp r3, r2 + 1f319b0: 9a000082 bls 1f31bc0 + 1f319b4: e2821001 add r1, r2, #1 + 1f319b8: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f319bc: e5d20000 ldrb r0, [r2] + 1f319c0: e350000a cmp r0, #10 + 1f319c4: 1affffac bne 1f3187c + 1f319c8: e1530001 cmp r3, r1 + 1f319cc: 9a0000a9 bls 1f31c78 + 1f319d0: e2812001 add r2, r1, #1 + 1f319d4: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f319d8: e5d10000 ldrb r0, [r1] + 1f319dc: e350001a cmp r0, #26 + 1f319e0: 1affffa5 bne 1f3187c + 1f319e4: e1530002 cmp r3, r2 + 1f319e8: 9a0000b4 bls 1f31cc0 + 1f319ec: e2823001 add r3, r2, #1 + 1f319f0: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f319f4: e5d23000 ldrb r3, [r2] + 1f319f8: e353000a cmp r3, #10 + 1f319fc: 1affff9e bne 1f3187c + 1f31a00: e3a06000 mov r6, #0 + 1f31a04: e304ae44 movw sl, #20036 ; 0x4e44 + 1f31a08: e344a945 movt sl, #18757 ; 0x4945 + 1f31a0c: e305b445 movw fp, #21573 ; 0x5445 + 1f31a10: e345b04c movt fp, #20556 ; 0x504c + 1f31a14: e30a3aab movw r3, #43691 ; 0xaaab + 1f31a18: e34a3aaa movt r3, #43690 ; 0xaaaa + 1f31a1c: e58d6004 str r6, [sp, #4] + 1f31a20: e58d3014 str r3, [sp, #20] + 1f31a24: e3043e53 movw r3, #20051 ; 0x4e53 + 1f31a28: e3473452 movt r3, #29778 ; 0x7452 + 1f31a2c: e58d3008 str r3, [sp, #8] + 1f31a30: e3043452 movw r3, #17490 ; 0x4452 + 1f31a34: e3443948 movt r3, #18760 ; 0x4948 + 1f31a38: e58d3010 str r3, [sp, #16] + 1f31a3c: e3043249 movw r3, #16969 ; 0x4249 + 1f31a40: e3443367 movt r3, #17255 ; 0x4367 + 1f31a44: e58d300c str r3, [sp, #12] + 1f31a48: e3a03001 mov r3, #1 + 1f31a4c: e58d3000 str r3, [sp] + 1f31a50: e1a00004 mov r0, r4 + 1f31a54: ebffe4e8 bl 1f2adfc + 1f31a58: e1a05000 mov r5, r0 + 1f31a5c: e1a00004 mov r0, r4 + 1f31a60: ebffe4e5 bl 1f2adfc + 1f31a64: e150000a cmp r0, sl + 1f31a68: 0a0000e9 beq 1f31e14 + 1f31a6c: 9a000065 bls 1f31c08 + 1f31a70: e150000b cmp r0, fp + 1f31a74: 0a0000ff beq 1f31e78 + 1f31a78: e59d3008 ldr r3, [sp, #8] + 1f31a7c: e1500003 cmp r0, r3 + 1f31a80: 0a0000ef beq 1f31e44 + 1f31a84: e59d3010 ldr r3, [sp, #16] + 1f31a88: e1500003 cmp r0, r3 + 1f31a8c: 0a0000a5 beq 1f31d28 + 1f31a90: e59d3000 ldr r3, [sp] + 1f31a94: e3530000 cmp r3, #0 + 1f31a98: 1a0000e0 bne 1f31e20 + 1f31a9c: e3100202 tst r0, #536870912 ; 0x20000000 + 1f31aa0: 0a0001c8 beq 1f321c8 + 1f31aa4: e3550000 cmp r5, #0 + 1f31aa8: b59430ac ldrlt r3, [r4, #172] ; 0xac + 1f31aac: b58430a8 strlt r3, [r4, #168] ; 0xa8 + 1f31ab0: ba000009 blt 1f31adc + 1f31ab4: e5943010 ldr r3, [r4, #16] + 1f31ab8: e3530000 cmp r3, #0 + 1f31abc: 0a0001db beq 1f32230 + 1f31ac0: e59420ac ldr r2, [r4, #172] ; 0xac + 1f31ac4: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f31ac8: e0631002 rsb r1, r3, r2 + 1f31acc: e1550001 cmp r5, r1 + 1f31ad0: ca0001b6 bgt 1f321b0 + 1f31ad4: e0833005 add r3, r3, r5 + 1f31ad8: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f31adc: e1a00004 mov r0, r4 + 1f31ae0: ebffe4c5 bl 1f2adfc + 1f31ae4: eaffffd9 b 1f31a50 + 1f31ae8: e5943020 ldr r3, [r4, #32] + 1f31aec: e3530000 cmp r3, #0 + 1f31af0: 0affff61 beq 1f3187c + 1f31af4: e2845028 add r5, r4, #40 ; 0x28 + 1f31af8: e5943010 ldr r3, [r4, #16] + 1f31afc: e1a01005 mov r1, r5 + 1f31b00: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f31b04: e594001c ldr r0, [r4, #28] + 1f31b08: e12fff33 blx r3 + 1f31b0c: e3500000 cmp r0, #0 + 1f31b10: 0a0000a6 beq 1f31db0 + 1f31b14: e0853000 add r3, r5, r0 + 1f31b18: e5d40028 ldrb r0, [r4, #40] ; 0x28 + 1f31b1c: e2841029 add r1, r4, #41 ; 0x29 + 1f31b20: e58430ac str r3, [r4, #172] ; 0xac + 1f31b24: e1a02001 mov r2, r1 + 1f31b28: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f31b2c: eaffff8e b 1f3196c + 1f31b30: e5943020 ldr r3, [r4, #32] + 1f31b34: e3530000 cmp r3, #0 + 1f31b38: 0affff4f beq 1f3187c + 1f31b3c: e2845028 add r5, r4, #40 ; 0x28 + 1f31b40: e5943010 ldr r3, [r4, #16] + 1f31b44: e1a01005 mov r1, r5 + 1f31b48: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f31b4c: e594001c ldr r0, [r4, #28] + 1f31b50: e12fff33 blx r3 + 1f31b54: e3500000 cmp r0, #0 + 1f31b58: 0a000099 beq 1f31dc4 + 1f31b5c: e0853000 add r3, r5, r0 + 1f31b60: e5d40028 ldrb r0, [r4, #40] ; 0x28 + 1f31b64: e2842029 add r2, r4, #41 ; 0x29 + 1f31b68: e58430ac str r3, [r4, #172] ; 0xac + 1f31b6c: e1a01002 mov r1, r2 + 1f31b70: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f31b74: eaffff83 b 1f31988 + 1f31b78: e5943020 ldr r3, [r4, #32] + 1f31b7c: e3530000 cmp r3, #0 + 1f31b80: 0affff3d beq 1f3187c + 1f31b84: e2845028 add r5, r4, #40 ; 0x28 + 1f31b88: e5943010 ldr r3, [r4, #16] + 1f31b8c: e1a01005 mov r1, r5 + 1f31b90: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f31b94: e594001c ldr r0, [r4, #28] + 1f31b98: e12fff33 blx r3 + 1f31b9c: e3500000 cmp r0, #0 + 1f31ba0: 0a00008c beq 1f31dd8 + 1f31ba4: e0853000 add r3, r5, r0 + 1f31ba8: e5d40028 ldrb r0, [r4, #40] ; 0x28 + 1f31bac: e2841029 add r1, r4, #41 ; 0x29 + 1f31bb0: e58430ac str r3, [r4, #172] ; 0xac + 1f31bb4: e1a02001 mov r2, r1 + 1f31bb8: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f31bbc: eaffff78 b 1f319a4 + 1f31bc0: e5943020 ldr r3, [r4, #32] + 1f31bc4: e3530000 cmp r3, #0 + 1f31bc8: 0affff2b beq 1f3187c + 1f31bcc: e2845028 add r5, r4, #40 ; 0x28 + 1f31bd0: e5943010 ldr r3, [r4, #16] + 1f31bd4: e1a01005 mov r1, r5 + 1f31bd8: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f31bdc: e594001c ldr r0, [r4, #28] + 1f31be0: e12fff33 blx r3 + 1f31be4: e3500000 cmp r0, #0 + 1f31be8: 0a00007f beq 1f31dec + 1f31bec: e0853000 add r3, r5, r0 + 1f31bf0: e5d40028 ldrb r0, [r4, #40] ; 0x28 + 1f31bf4: e2842029 add r2, r4, #41 ; 0x29 + 1f31bf8: e58430ac str r3, [r4, #172] ; 0xac + 1f31bfc: e1a01002 mov r1, r2 + 1f31c00: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f31c04: eaffff6d b 1f319c0 + 1f31c08: e59d300c ldr r3, [sp, #12] + 1f31c0c: e1500003 cmp r0, r3 + 1f31c10: 0affffa3 beq 1f31aa4 + 1f31c14: e3043154 movw r3, #16724 ; 0x4154 + 1f31c18: e3443944 movt r3, #18756 ; 0x4944 + 1f31c1c: e1500003 cmp r0, r3 + 1f31c20: 1affff9a bne 1f31a90 + 1f31c24: e59d3000 ldr r3, [sp] + 1f31c28: e3530000 cmp r3, #0 + 1f31c2c: 1a00007b bne 1f31e20 + 1f31c30: e59d3004 ldr r3, [sp, #4] + 1f31c34: e2933000 adds r3, r3, #0 + 1f31c38: 13a03001 movne r3, #1 + 1f31c3c: e3560000 cmp r6, #0 + 1f31c40: 13a03000 movne r3, #0 + 1f31c44: e3530000 cmp r3, #0 + 1f31c48: 130a336c movwne r3, #41836 ; 0xa36c + 1f31c4c: 130110c0 movwne r1, #4288 ; 0x10c0 + 1f31c50: 1340320d movtne r3, #525 ; 0x20d + 1f31c54: 159d2000 ldrne r2, [sp] + 1f31c58: 059d3004 ldreq r3, [sp, #4] + 1f31c5c: 03a02001 moveq r2, #1 + 1f31c60: 134011f6 movtne r1, #502 ; 0x1f6 + 1f31c64: e1a00002 mov r0, r2 + 1f31c68: 15831000 strne r1, [r3] + 1f31c6c: 05843008 streq r3, [r4, #8] + 1f31c70: e28dd01c add sp, sp, #28 + 1f31c74: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f31c78: e5943020 ldr r3, [r4, #32] + 1f31c7c: e3530000 cmp r3, #0 + 1f31c80: 0afffefd beq 1f3187c + 1f31c84: e2845028 add r5, r4, #40 ; 0x28 + 1f31c88: e5943010 ldr r3, [r4, #16] + 1f31c8c: e1a01005 mov r1, r5 + 1f31c90: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f31c94: e594001c ldr r0, [r4, #28] + 1f31c98: e12fff33 blx r3 + 1f31c9c: e3500000 cmp r0, #0 + 1f31ca0: 0a000056 beq 1f31e00 + 1f31ca4: e0853000 add r3, r5, r0 + 1f31ca8: e5d40028 ldrb r0, [r4, #40] ; 0x28 + 1f31cac: e2841029 add r1, r4, #41 ; 0x29 + 1f31cb0: e58430ac str r3, [r4, #172] ; 0xac + 1f31cb4: e1a02001 mov r2, r1 + 1f31cb8: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f31cbc: eaffff46 b 1f319dc + 1f31cc0: e5943020 ldr r3, [r4, #32] + 1f31cc4: e3530000 cmp r3, #0 + 1f31cc8: 0afffeeb beq 1f3187c + 1f31ccc: e2845028 add r5, r4, #40 ; 0x28 + 1f31cd0: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f31cd4: e5943010 ldr r3, [r4, #16] + 1f31cd8: e1a01005 mov r1, r5 + 1f31cdc: e594001c ldr r0, [r4, #28] + 1f31ce0: e12fff33 blx r3 + 1f31ce4: e3500000 cmp r0, #0 + 1f31ce8: 02845029 addeq r5, r4, #41 ; 0x29 + 1f31cec: 10855000 addne r5, r5, r0 + 1f31cf0: 01a02005 moveq r2, r5 + 1f31cf4: 12842029 addne r2, r4, #41 ; 0x29 + 1f31cf8: 05840020 streq r0, [r4, #32] + 1f31cfc: 01a03000 moveq r3, r0 + 1f31d00: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f31d04: 15d43028 ldrbne r3, [r4, #40] ; 0x28 + 1f31d08: e58450ac str r5, [r4, #172] ; 0xac + 1f31d0c: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f31d10: eaffff38 b 1f319f8 + 1f31d14: e2843029 add r3, r4, #41 ; 0x29 + 1f31d18: e5840020 str r0, [r4, #32] + 1f31d1c: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f31d20: e1a01003 mov r1, r3 + 1f31d24: eafffee8 b 1f318cc + 1f31d28: e59d3000 ldr r3, [sp] + 1f31d2c: e3530000 cmp r3, #0 + 1f31d30: 0a0001d8 beq 1f32498 + 1f31d34: e355000d cmp r5, #13 + 1f31d38: 1a0001cf bne 1f3247c + 1f31d3c: e1a00004 mov r0, r4 + 1f31d40: ebffe42d bl 1f2adfc + 1f31d44: e3500401 cmp r0, #16777216 ; 0x1000000 + 1f31d48: e5840000 str r0, [r4] + 1f31d4c: 8a00012b bhi 1f32200 + 1f31d50: e1a00004 mov r0, r4 + 1f31d54: ebffe428 bl 1f2adfc + 1f31d58: e3500401 cmp r0, #16777216 ; 0x1000000 + 1f31d5c: e5840004 str r0, [r4, #4] + 1f31d60: 8a000126 bhi 1f32200 + 1f31d64: e59420a8 ldr r2, [r4, #168] ; 0xa8 + 1f31d68: e59480ac ldr r8, [r4, #172] ; 0xac + 1f31d6c: e1520008 cmp r2, r8 + 1f31d70: 3a000097 bcc 1f31fd4 + 1f31d74: e5943020 ldr r3, [r4, #32] + 1f31d78: e3530000 cmp r3, #0 + 1f31d7c: 1a000142 bne 1f3228c + 1f31d80: e5893010 str r3, [r9, #16] + 1f31d84: e30a336c movw r3, #41836 ; 0xa36c + 1f31d88: e340320d movt r3, #525 ; 0x20d + 1f31d8c: e30110c8 movw r1, #4296 ; 0x10c8 + 1f31d90: e34011f6 movt r1, #502 ; 0x1f6 + 1f31d94: e3a02000 mov r2, #0 + 1f31d98: e5831000 str r1, [r3] + 1f31d9c: eafffebc b 1f31894 + 1f31da0: e0853000 add r3, r5, r0 + 1f31da4: e2842029 add r2, r4, #41 ; 0x29 + 1f31da8: e5d40028 ldrb r0, [r4, #40] ; 0x28 + 1f31dac: eafffee0 b 1f31934 + 1f31db0: e2843029 add r3, r4, #41 ; 0x29 + 1f31db4: e5840020 str r0, [r4, #32] + 1f31db8: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f31dbc: e1a01003 mov r1, r3 + 1f31dc0: eaffff56 b 1f31b20 + 1f31dc4: e2843029 add r3, r4, #41 ; 0x29 + 1f31dc8: e5840020 str r0, [r4, #32] + 1f31dcc: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f31dd0: e1a02003 mov r2, r3 + 1f31dd4: eaffff63 b 1f31b68 + 1f31dd8: e2843029 add r3, r4, #41 ; 0x29 + 1f31ddc: e5840020 str r0, [r4, #32] + 1f31de0: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f31de4: e1a01003 mov r1, r3 + 1f31de8: eaffff70 b 1f31bb0 + 1f31dec: e2843029 add r3, r4, #41 ; 0x29 + 1f31df0: e5840020 str r0, [r4, #32] + 1f31df4: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f31df8: e1a02003 mov r2, r3 + 1f31dfc: eaffff7d b 1f31bf8 + 1f31e00: e2843029 add r3, r4, #41 ; 0x29 + 1f31e04: e5840020 str r0, [r4, #32] + 1f31e08: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f31e0c: e1a01003 mov r1, r3 + 1f31e10: eaffffa6 b 1f31cb0 + 1f31e14: e59d3000 ldr r3, [sp] + 1f31e18: e3530000 cmp r3, #0 + 1f31e1c: 0a000098 beq 1f32084 + 1f31e20: e30a336c movw r3, #41836 ; 0xa36c + 1f31e24: e340320d movt r3, #525 ; 0x20d + 1f31e28: e3a02000 mov r2, #0 + 1f31e2c: e3011070 movw r1, #4208 ; 0x1070 + 1f31e30: e34011f6 movt r1, #502 ; 0x1f6 + 1f31e34: e1a00002 mov r0, r2 + 1f31e38: e5831000 str r1, [r3] + 1f31e3c: e28dd01c add sp, sp, #28 + 1f31e40: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f31e44: e59d3000 ldr r3, [sp] + 1f31e48: e3530000 cmp r3, #0 + 1f31e4c: 1afffff3 bne 1f31e20 + 1f31e50: e5993004 ldr r3, [r9, #4] + 1f31e54: e3530000 cmp r3, #0 + 1f31e58: 1a00019c bne 1f324d0 + 1f31e5c: e59d3004 ldr r3, [sp, #4] + 1f31e60: e3530000 cmp r3, #0 + 1f31e64: 0a00008a beq 1f32094 + 1f31e68: e3a03004 mov r3, #4 + 1f31e6c: e3a02001 mov r2, #1 + 1f31e70: e5843008 str r3, [r4, #8] + 1f31e74: eafffe86 b 1f31894 + 1f31e78: e59d3000 ldr r3, [sp] + 1f31e7c: e3530000 cmp r3, #0 + 1f31e80: 1affffe6 bne 1f31e20 + 1f31e84: e3550c03 cmp r5, #768 ; 0x300 + 1f31e88: 8a000166 bhi 1f32428 + 1f31e8c: e59d3014 ldr r3, [sp, #20] + 1f31e90: e0832395 umull r2, r3, r5, r3 + 1f31e94: e1a060a3 lsr r6, r3, #1 + 1f31e98: e0863086 add r3, r6, r6, lsl #1 + 1f31e9c: e1550003 cmp r5, r3 + 1f31ea0: 1a000160 bne 1f32428 + 1f31ea4: e3560000 cmp r6, #0 + 1f31ea8: 0affff0b beq 1f31adc + 1f31eac: e59d5000 ldr r5, [sp] + 1f31eb0: e2847028 add r7, r4, #40 ; 0x28 + 1f31eb4: e2848029 add r8, r4, #41 ; 0x29 + 1f31eb8: ea000005 b 1f31ed4 + 1f31ebc: e5943020 ldr r3, [r4, #32] + 1f31ec0: e3530000 cmp r3, #0 + 1f31ec4: 1a000020 bne 1f31f4c + 1f31ec8: e2855001 add r5, r5, #1 + 1f31ecc: e1560005 cmp r6, r5 + 1f31ed0: 0affff01 beq 1f31adc + 1f31ed4: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f31ed8: e59420ac ldr r2, [r4, #172] ; 0xac + 1f31edc: e1530002 cmp r3, r2 + 1f31ee0: 32833001 addcc r3, r3, #1 + 1f31ee4: 358430a8 strcc r3, [r4, #168] ; 0xa8 + 1f31ee8: 2afffff3 bcs 1f31ebc + 1f31eec: e1530002 cmp r3, r2 + 1f31ef0: 32833001 addcc r3, r3, #1 + 1f31ef4: 358430a8 strcc r3, [r4, #168] ; 0xa8 + 1f31ef8: 2a000024 bcs 1f31f90 + 1f31efc: e1520003 cmp r2, r3 + 1f31f00: 82833001 addhi r3, r3, #1 + 1f31f04: 858430a8 strhi r3, [r4, #168] ; 0xa8 + 1f31f08: 8affffee bhi 1f31ec8 + 1f31f0c: e5943020 ldr r3, [r4, #32] + 1f31f10: e3530000 cmp r3, #0 + 1f31f14: 0affffeb beq 1f31ec8 + 1f31f18: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f31f1c: e1a01007 mov r1, r7 + 1f31f20: e5943010 ldr r3, [r4, #16] + 1f31f24: e594001c ldr r0, [r4, #28] + 1f31f28: e12fff33 blx r3 + 1f31f2c: e3500000 cmp r0, #0 + 1f31f30: 01a02008 moveq r2, r8 + 1f31f34: 10872000 addne r2, r7, r0 + 1f31f38: 05840020 streq r0, [r4, #32] + 1f31f3c: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f31f40: e58420ac str r2, [r4, #172] ; 0xac + 1f31f44: e58480a8 str r8, [r4, #168] ; 0xa8 + 1f31f48: eaffffde b 1f31ec8 + 1f31f4c: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f31f50: e1a01007 mov r1, r7 + 1f31f54: e5943010 ldr r3, [r4, #16] + 1f31f58: e594001c ldr r0, [r4, #28] + 1f31f5c: e12fff33 blx r3 + 1f31f60: e3500000 cmp r0, #0 + 1f31f64: e1a03008 mov r3, r8 + 1f31f68: 01a02008 moveq r2, r8 + 1f31f6c: 10872000 addne r2, r7, r0 + 1f31f70: 05840020 streq r0, [r4, #32] + 1f31f74: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f31f78: e1530002 cmp r3, r2 + 1f31f7c: e58480a8 str r8, [r4, #168] ; 0xa8 + 1f31f80: 32833001 addcc r3, r3, #1 + 1f31f84: e58420ac str r2, [r4, #172] ; 0xac + 1f31f88: 358430a8 strcc r3, [r4, #168] ; 0xa8 + 1f31f8c: 3affffda bcc 1f31efc + 1f31f90: e5943020 ldr r3, [r4, #32] + 1f31f94: e3530000 cmp r3, #0 + 1f31f98: 0affffca beq 1f31ec8 + 1f31f9c: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f31fa0: e1a01007 mov r1, r7 + 1f31fa4: e5943010 ldr r3, [r4, #16] + 1f31fa8: e594001c ldr r0, [r4, #28] + 1f31fac: e12fff33 blx r3 + 1f31fb0: e3500000 cmp r0, #0 + 1f31fb4: 01a02008 moveq r2, r8 + 1f31fb8: 10872000 addne r2, r7, r0 + 1f31fbc: 05840020 streq r0, [r4, #32] + 1f31fc0: e1a03008 mov r3, r8 + 1f31fc4: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f31fc8: e58420ac str r2, [r4, #172] ; 0xac + 1f31fcc: e58480a8 str r8, [r4, #168] ; 0xa8 + 1f31fd0: eaffffc9 b 1f31efc + 1f31fd4: e2823001 add r3, r2, #1 + 1f31fd8: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f31fdc: e5d22000 ldrb r2, [r2] + 1f31fe0: e2421004 sub r1, r2, #4 + 1f31fe4: e2420001 sub r0, r2, #1 + 1f31fe8: e31100fb tst r1, #251 ; 0xfb + 1f31fec: 13a01001 movne r1, #1 + 1f31ff0: 03a01000 moveq r1, #0 + 1f31ff4: e3500001 cmp r0, #1 + 1f31ff8: 93a01000 movls r1, #0 + 1f31ffc: 82011001 andhi r1, r1, #1 + 1f32000: e3510000 cmp r1, #0 + 1f32004: e5892010 str r2, [r9, #16] + 1f32008: 1a0000f7 bne 1f323ec + 1f3200c: e1580003 cmp r8, r3 + 1f32010: 8a00003a bhi 1f32100 + 1f32014: e5947020 ldr r7, [r4, #32] + 1f32018: e3570000 cmp r7, #0 + 1f3201c: 1a000085 bne 1f32238 + 1f32020: e1530008 cmp r3, r8 + 1f32024: 3a000047 bcc 1f32148 + 1f32028: e5943020 ldr r3, [r4, #32] + 1f3202c: e3530000 cmp r3, #0 + 1f32030: 1a0000a7 bne 1f322d4 + 1f32034: e5942000 ldr r2, [r4] + 1f32038: e3520000 cmp r2, #0 + 1f3203c: 0a000100 beq 1f32444 + 1f32040: e5941004 ldr r1, [r4, #4] + 1f32044: e3510000 cmp r1, #0 + 1f32048: 0a0000fd beq 1f32444 + 1f3204c: e59d3004 ldr r3, [sp, #4] + 1f32050: e3530000 cmp r3, #0 + 1f32054: 1a000020 bne 1f320dc + 1f32058: e3a03101 mov r3, #1073741824 ; 0x40000000 + 1f3205c: e3170002 tst r7, #2 + 1f32060: 03a00001 moveq r0, #1 + 1f32064: 13a00003 movne r0, #3 + 1f32068: e732f213 udiv r2, r3, r2 + 1f3206c: e7e07157 ubfx r7, r7, #2, #1 + 1f32070: e0873000 add r3, r7, r0 + 1f32074: e5843008 str r3, [r4, #8] + 1f32078: e733f312 udiv r3, r2, r3 + 1f3207c: e1510003 cmp r1, r3 + 1f32080: 8a00005e bhi 1f32200 + 1f32084: e3a02001 mov r2, #1 + 1f32088: e1a00002 mov r0, r2 + 1f3208c: e28dd01c add sp, sp, #28 + 1f32090: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f32094: e5943008 ldr r3, [r4, #8] + 1f32098: e2132001 ands r2, r3, #1 + 1f3209c: 0a000119 beq 1f32508 + 1f320a0: e1550083 cmp r5, r3, lsl #1 + 1f320a4: 1a000110 bne 1f324ec + 1f320a8: e5992010 ldr r2, [r9, #16] + 1f320ac: e3520010 cmp r2, #16 + 1f320b0: 0a0000c3 beq 1f323c4 + 1f320b4: e3530000 cmp r3, #0 + 1f320b8: c3a05000 movgt r5, #0 + 1f320bc: dafffe86 ble 1f31adc + 1f320c0: e1a00004 mov r0, r4 + 1f320c4: e2855001 add r5, r5, #1 + 1f320c8: ebffe309 bl 1f2acf4 + 1f320cc: e5943008 ldr r3, [r4, #8] + 1f320d0: e1530005 cmp r3, r5 + 1f320d4: cafffff9 bgt 1f320c0 + 1f320d8: eafffe7f b 1f31adc + 1f320dc: e3a03201 mov r3, #268435456 ; 0x10000000 + 1f320e0: e3a00001 mov r0, #1 + 1f320e4: e5840008 str r0, [r4, #8] + 1f320e8: e732f213 udiv r2, r3, r2 + 1f320ec: e1510002 cmp r1, r2 + 1f320f0: 8a000042 bhi 1f32200 + 1f320f4: e3a03000 mov r3, #0 + 1f320f8: e58d3000 str r3, [sp] + 1f320fc: eafffe76 b 1f31adc + 1f32100: e2832001 add r2, r3, #1 + 1f32104: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f32108: e5d37000 ldrb r7, [r3] + 1f3210c: e1a03002 mov r3, r2 + 1f32110: e1a02007 mov r2, r7 + 1f32114: e3520006 cmp r2, #6 + 1f32118: ca000003 bgt 1f3212c + 1f3211c: e3520003 cmp r2, #3 + 1f32120: 0a00003d beq 1f3221c + 1f32124: e3170001 tst r7, #1 + 1f32128: 0affffbc beq 1f32020 + 1f3212c: e30a336c movw r3, #41836 ; 0xa36c + 1f32130: e340320d movt r3, #525 ; 0x20d + 1f32134: e3011018 movw r1, #4120 ; 0x1018 + 1f32138: e34011f6 movt r1, #502 ; 0x1f6 + 1f3213c: e3a02000 mov r2, #0 + 1f32140: e5831000 str r1, [r3] + 1f32144: eafffdd2 b 1f31894 + 1f32148: e2832001 add r2, r3, #1 + 1f3214c: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f32150: e5d35000 ldrb r5, [r3] + 1f32154: e3550000 cmp r5, #0 + 1f32158: 1a0000c0 bne 1f32460 + 1f3215c: e1520008 cmp r2, r8 + 1f32160: 2a00006e bcs 1f32320 + 1f32164: e2823001 add r3, r2, #1 + 1f32168: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f3216c: e5d25000 ldrb r5, [r2] + 1f32170: e3550000 cmp r5, #0 + 1f32174: 1a0000ce bne 1f324b4 + 1f32178: e1530008 cmp r3, r8 + 1f3217c: 2a00007c bcs 1f32374 + 1f32180: e2832001 add r2, r3, #1 + 1f32184: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f32188: e5d35000 ldrb r5, [r3] + 1f3218c: e3550001 cmp r5, #1 + 1f32190: daffffa7 ble 1f32034 + 1f32194: e30a336c movw r3, #41836 ; 0xa36c + 1f32198: e340320d movt r3, #525 ; 0x20d + 1f3219c: e3011048 movw r1, #4168 ; 0x1048 + 1f321a0: e34011f6 movt r1, #502 ; 0x1f6 + 1f321a4: e3a02000 mov r2, #0 + 1f321a8: e5831000 str r1, [r3] + 1f321ac: eafffdb8 b 1f31894 + 1f321b0: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f321b4: e0611005 rsb r1, r1, r5 + 1f321b8: e5943014 ldr r3, [r4, #20] + 1f321bc: e594001c ldr r0, [r4, #28] + 1f321c0: e12fff33 blx r3 + 1f321c4: eafffe44 b 1f31adc + 1f321c8: e30513b0 movw r1, #21424 ; 0x53b0 + 1f321cc: e34011f6 movt r1, #502 ; 0x1f6 + 1f321d0: e30ac36c movw ip, #41836 ; 0xa36c + 1f321d4: e340c20d movt ip, #525 ; 0x20d + 1f321d8: e1a02003 mov r2, r3 + 1f321dc: e1a0e820 lsr lr, r0, #16 + 1f321e0: e1a03c20 lsr r3, r0, #24 + 1f321e4: e5c10003 strb r0, [r1, #3] + 1f321e8: e5c13000 strb r3, [r1] + 1f321ec: e1a03420 lsr r3, r0, #8 + 1f321f0: e5c1e001 strb lr, [r1, #1] + 1f321f4: e5c13002 strb r3, [r1, #2] + 1f321f8: e58c1000 str r1, [ip] + 1f321fc: eafffda4 b 1f31894 + 1f32200: e30a336c movw r3, #41836 ; 0xa36c + 1f32204: e340320d movt r3, #525 ; 0x20d + 1f32208: e301100c movw r1, #4108 ; 0x100c + 1f3220c: e34011f6 movt r1, #502 ; 0x1f6 + 1f32210: e3a02000 mov r2, #0 + 1f32214: e5831000 str r1, [r3] + 1f32218: eafffd9d b 1f31894 + 1f3221c: e5991010 ldr r1, [r9, #16] + 1f32220: e3510010 cmp r1, #16 + 1f32224: 0affffc0 beq 1f3212c + 1f32228: e58d2004 str r2, [sp, #4] + 1f3222c: eaffff7b b 1f32020 + 1f32230: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f32234: eafffe26 b 1f31ad4 + 1f32238: e2848028 add r8, r4, #40 ; 0x28 + 1f3223c: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f32240: e1a01008 mov r1, r8 + 1f32244: e5943010 ldr r3, [r4, #16] + 1f32248: e594001c ldr r0, [r4, #28] + 1f3224c: e12fff33 blx r3 + 1f32250: e3500000 cmp r0, #0 + 1f32254: 02848029 addeq r8, r4, #41 ; 0x29 + 1f32258: 12841029 addne r1, r4, #41 ; 0x29 + 1f3225c: 15d47028 ldrbne r7, [r4, #40] ; 0x28 + 1f32260: 01a01008 moveq r1, r8 + 1f32264: 01a02000 moveq r2, r0 + 1f32268: 10888000 addne r8, r8, r0 + 1f3226c: 05840020 streq r0, [r4, #32] + 1f32270: 01a07002 moveq r7, r2 + 1f32274: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f32278: 11a02007 movne r2, r7 + 1f3227c: e58480ac str r8, [r4, #172] ; 0xac + 1f32280: e1a03001 mov r3, r1 + 1f32284: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f32288: eaffffa1 b 1f32114 + 1f3228c: e2848028 add r8, r4, #40 ; 0x28 + 1f32290: e5943010 ldr r3, [r4, #16] + 1f32294: e1a01008 mov r1, r8 + 1f32298: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f3229c: e594001c ldr r0, [r4, #28] + 1f322a0: e12fff33 blx r3 + 1f322a4: e3500000 cmp r0, #0 + 1f322a8: 1a000052 bne 1f323f8 + 1f322ac: e2848029 add r8, r4, #41 ; 0x29 + 1f322b0: e5840020 str r0, [r4, #32] + 1f322b4: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f322b8: e1a02000 mov r2, r0 + 1f322bc: e3a01001 mov r1, #1 + 1f322c0: e1a00008 mov r0, r8 + 1f322c4: e58480ac str r8, [r4, #172] ; 0xac + 1f322c8: e1a03000 mov r3, r0 + 1f322cc: e58400a8 str r0, [r4, #168] ; 0xa8 + 1f322d0: eaffff4a b 1f32000 + 1f322d4: e2848028 add r8, r4, #40 ; 0x28 + 1f322d8: e5943010 ldr r3, [r4, #16] + 1f322dc: e1a01008 mov r1, r8 + 1f322e0: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f322e4: e594001c ldr r0, [r4, #28] + 1f322e8: e12fff33 blx r3 + 1f322ec: e3500000 cmp r0, #0 + 1f322f0: 02848029 addeq r8, r4, #41 ; 0x29 + 1f322f4: 12843029 addne r3, r4, #41 ; 0x29 + 1f322f8: 01a03008 moveq r3, r8 + 1f322fc: 10888000 addne r8, r8, r0 + 1f32300: 05840020 streq r0, [r4, #32] + 1f32304: 01a05000 moveq r5, r0 + 1f32308: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f3230c: e1a02003 mov r2, r3 + 1f32310: 15d45028 ldrbne r5, [r4, #40] ; 0x28 + 1f32314: e58480ac str r8, [r4, #172] ; 0xac + 1f32318: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f3231c: eaffff8c b 1f32154 + 1f32320: e5943020 ldr r3, [r4, #32] + 1f32324: e3530000 cmp r3, #0 + 1f32328: 0affff41 beq 1f32034 + 1f3232c: e2848028 add r8, r4, #40 ; 0x28 + 1f32330: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f32334: e1a01008 mov r1, r8 + 1f32338: e5943010 ldr r3, [r4, #16] + 1f3233c: e594001c ldr r0, [r4, #28] + 1f32340: e12fff33 blx r3 + 1f32344: e3500000 cmp r0, #0 + 1f32348: 02848029 addeq r8, r4, #41 ; 0x29 + 1f3234c: 12842029 addne r2, r4, #41 ; 0x29 + 1f32350: 01a02008 moveq r2, r8 + 1f32354: 10888000 addne r8, r8, r0 + 1f32358: 05845020 streq r5, [r4, #32] + 1f3235c: e1a03002 mov r3, r2 + 1f32360: 05c45028 strbeq r5, [r4, #40] ; 0x28 + 1f32364: 15d45028 ldrbne r5, [r4, #40] ; 0x28 + 1f32368: e58480ac str r8, [r4, #172] ; 0xac + 1f3236c: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f32370: eaffff7e b 1f32170 + 1f32374: e5943020 ldr r3, [r4, #32] + 1f32378: e3530000 cmp r3, #0 + 1f3237c: 0affff2c beq 1f32034 + 1f32380: e2848028 add r8, r4, #40 ; 0x28 + 1f32384: e5943010 ldr r3, [r4, #16] + 1f32388: e1a01008 mov r1, r8 + 1f3238c: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f32390: e594001c ldr r0, [r4, #28] + 1f32394: e12fff33 blx r3 + 1f32398: e3500000 cmp r0, #0 + 1f3239c: 02848029 addeq r8, r4, #41 ; 0x29 + 1f323a0: 10888000 addne r8, r8, r0 + 1f323a4: 01a03008 moveq r3, r8 + 1f323a8: 12843029 addne r3, r4, #41 ; 0x29 + 1f323ac: 05845020 streq r5, [r4, #32] + 1f323b0: 05c45028 strbeq r5, [r4, #40] ; 0x28 + 1f323b4: 15d45028 ldrbne r5, [r4, #40] ; 0x28 + 1f323b8: e58480ac str r8, [r4, #172] ; 0xac + 1f323bc: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f323c0: eaffff71 b 1f3218c + 1f323c4: e3530000 cmp r3, #0 + 1f323c8: dafffdc3 ble 1f31adc + 1f323cc: e3a05000 mov r5, #0 + 1f323d0: e1a00004 mov r0, r4 + 1f323d4: e2855001 add r5, r5, #1 + 1f323d8: ebffe245 bl 1f2acf4 + 1f323dc: e5943008 ldr r3, [r4, #8] + 1f323e0: e1530005 cmp r3, r5 + 1f323e4: cafffff9 bgt 1f323d0 + 1f323e8: eafffdbb b 1f31adc + 1f323ec: e3520010 cmp r2, #16 + 1f323f0: 0affff05 beq 1f3200c + 1f323f4: eafffe62 b 1f31d84 + 1f323f8: e5d42028 ldrb r2, [r4, #40] ; 0x28 + 1f323fc: e0888000 add r8, r8, r0 + 1f32400: e2840029 add r0, r4, #41 ; 0x29 + 1f32404: e2423004 sub r3, r2, #4 + 1f32408: e2421001 sub r1, r2, #1 + 1f3240c: e31300fb tst r3, #251 ; 0xfb + 1f32410: 13a03001 movne r3, #1 + 1f32414: 03a03000 moveq r3, #0 + 1f32418: e3510001 cmp r1, #1 + 1f3241c: 93a01000 movls r1, #0 + 1f32420: 82031001 andhi r1, r3, #1 + 1f32424: eaffffa6 b 1f322c4 + 1f32428: e30a336c movw r3, #41836 ; 0xa36c + 1f3242c: e340320d movt r3, #525 ; 0x20d + 1f32430: e3011080 movw r1, #4224 ; 0x1080 + 1f32434: e34011f6 movt r1, #502 ; 0x1f6 + 1f32438: e3a02000 mov r2, #0 + 1f3243c: e5831000 str r1, [r3] + 1f32440: eafffd13 b 1f31894 + 1f32444: e30a336c movw r3, #41836 ; 0xa36c + 1f32448: e340320d movt r3, #525 ; 0x20d + 1f3244c: e3011060 movw r1, #4192 ; 0x1060 + 1f32450: e34011f6 movt r1, #502 ; 0x1f6 + 1f32454: e3a02000 mov r2, #0 + 1f32458: e5831000 str r1, [r3] + 1f3245c: eafffd0c b 1f31894 + 1f32460: e30a336c movw r3, #41836 ; 0xa36c + 1f32464: e340320d movt r3, #525 ; 0x20d + 1f32468: e3011024 movw r1, #4132 ; 0x1024 + 1f3246c: e34011f6 movt r1, #502 ; 0x1f6 + 1f32470: e3a02000 mov r2, #0 + 1f32474: e5831000 str r1, [r3] + 1f32478: eafffd05 b 1f31894 + 1f3247c: e30a336c movw r3, #41836 ; 0xa36c + 1f32480: e340320d movt r3, #525 ; 0x20d + 1f32484: e3001ffc movw r1, #4092 ; 0xffc + 1f32488: e34011f6 movt r1, #502 ; 0x1f6 + 1f3248c: e3a02000 mov r2, #0 + 1f32490: e5831000 str r1, [r3] + 1f32494: eafffcfe b 1f31894 + 1f32498: e1a02003 mov r2, r3 + 1f3249c: e30a336c movw r3, #41836 ; 0xa36c + 1f324a0: e340320d movt r3, #525 ; 0x20d + 1f324a4: e3001fec movw r1, #4076 ; 0xfec + 1f324a8: e34011f6 movt r1, #502 ; 0x1f6 + 1f324ac: e5831000 str r1, [r3] + 1f324b0: eafffcf7 b 1f31894 + 1f324b4: e30a336c movw r3, #41836 ; 0xa36c + 1f324b8: e340320d movt r3, #525 ; 0x20d + 1f324bc: e3011034 movw r1, #4148 ; 0x1034 + 1f324c0: e34011f6 movt r1, #502 ; 0x1f6 + 1f324c4: e3a02000 mov r2, #0 + 1f324c8: e5831000 str r1, [r3] + 1f324cc: eafffcf0 b 1f31894 + 1f324d0: e30a336c movw r3, #41836 ; 0xa36c + 1f324d4: e340320d movt r3, #525 ; 0x20d + 1f324d8: e3011090 movw r1, #4240 ; 0x1090 + 1f324dc: e34011f6 movt r1, #502 ; 0x1f6 + 1f324e0: e59d2000 ldr r2, [sp] + 1f324e4: e5831000 str r1, [r3] + 1f324e8: eafffce9 b 1f31894 + 1f324ec: e30a336c movw r3, #41836 ; 0xa36c + 1f324f0: e340320d movt r3, #525 ; 0x20d + 1f324f4: e30110b0 movw r1, #4272 ; 0x10b0 + 1f324f8: e34011f6 movt r1, #502 ; 0x1f6 + 1f324fc: e59d2004 ldr r2, [sp, #4] + 1f32500: e5831000 str r1, [r3] + 1f32504: eafffce2 b 1f31894 + 1f32508: e30a336c movw r3, #41836 ; 0xa36c + 1f3250c: e340320d movt r3, #525 ; 0x20d + 1f32510: e30110a0 movw r1, #4256 ; 0x10a0 + 1f32514: e34011f6 movt r1, #502 ; 0x1f6 + 1f32518: e5831000 str r1, [r3] + 1f3251c: eafffcdc b 1f31894 + +01f32520 : + 1f32520: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f32524: e590b000 ldr fp, [r0] + 1f32528: e1a0a000 mov sl, r0 + 1f3252c: e24ddd52 sub sp, sp, #5248 ; 0x1480 + 1f32530: e24dd03c sub sp, sp, #60 ; 0x3c + 1f32534: e59b30ac ldr r3, [fp, #172] ; 0xac + 1f32538: e58d1020 str r1, [sp, #32] + 1f3253c: e59b10a8 ldr r1, [fp, #168] ; 0xa8 + 1f32540: e58d2040 str r2, [sp, #64] ; 0x40 + 1f32544: e3a02000 mov r2, #0 + 1f32548: e1510003 cmp r1, r3 + 1f3254c: e5802008 str r2, [r0, #8] + 1f32550: e5802004 str r2, [r0, #4] + 1f32554: e580200c str r2, [r0, #12] + 1f32558: 3a00001b bcc 1f325cc + 1f3255c: e59b3020 ldr r3, [fp, #32] + 1f32560: e1530002 cmp r3, r2 + 1f32564: 1a000009 bne 1f32590 + 1f32568: e30a336c movw r3, #41836 ; 0xa36c + 1f3256c: e340320d movt r3, #525 ; 0x20d + 1f32570: e3002fe0 movw r2, #4064 ; 0xfe0 + 1f32574: e34021f6 movt r2, #502 ; 0x1f6 + 1f32578: e3a05000 mov r5, #0 + 1f3257c: e5832000 str r2, [r3] + 1f32580: e1a00005 mov r0, r5 + 1f32584: e28ddd52 add sp, sp, #5248 ; 0x1480 + 1f32588: e28dd03c add sp, sp, #60 ; 0x3c + 1f3258c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f32590: e28b4028 add r4, fp, #40 ; 0x28 + 1f32594: e59b3010 ldr r3, [fp, #16] + 1f32598: e1a01004 mov r1, r4 + 1f3259c: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f325a0: e59b001c ldr r0, [fp, #28] + 1f325a4: e12fff33 blx r3 + 1f325a8: e3500000 cmp r0, #0 + 1f325ac: 0a00034c beq 1f332e4 + 1f325b0: e0843000 add r3, r4, r0 + 1f325b4: e5db0028 ldrb r0, [fp, #40] ; 0x28 + 1f325b8: e28b1029 add r1, fp, #41 ; 0x29 + 1f325bc: e58b30ac str r3, [fp, #172] ; 0xac + 1f325c0: e1a02001 mov r2, r1 + 1f325c4: e58b10a8 str r1, [fp, #168] ; 0xa8 + 1f325c8: ea000002 b 1f325d8 + 1f325cc: e2812001 add r2, r1, #1 + 1f325d0: e58b20a8 str r2, [fp, #168] ; 0xa8 + 1f325d4: e5d10000 ldrb r0, [r1] + 1f325d8: e3500089 cmp r0, #137 ; 0x89 + 1f325dc: 1affffe1 bne 1f32568 + 1f325e0: e1530002 cmp r3, r2 + 1f325e4: 8a000011 bhi 1f32630 + 1f325e8: e59b3020 ldr r3, [fp, #32] + 1f325ec: e3530000 cmp r3, #0 + 1f325f0: 0affffdc beq 1f32568 + 1f325f4: e28b4028 add r4, fp, #40 ; 0x28 + 1f325f8: e59b3010 ldr r3, [fp, #16] + 1f325fc: e1a01004 mov r1, r4 + 1f32600: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f32604: e59b001c ldr r0, [fp, #28] + 1f32608: e12fff33 blx r3 + 1f3260c: e3500000 cmp r0, #0 + 1f32610: 0a00036d beq 1f333cc + 1f32614: e0843000 add r3, r4, r0 + 1f32618: e5db0028 ldrb r0, [fp, #40] ; 0x28 + 1f3261c: e28b2029 add r2, fp, #41 ; 0x29 + 1f32620: e58b30ac str r3, [fp, #172] ; 0xac + 1f32624: e1a01002 mov r1, r2 + 1f32628: e58b20a8 str r2, [fp, #168] ; 0xa8 + 1f3262c: ea000002 b 1f3263c + 1f32630: e2821001 add r1, r2, #1 + 1f32634: e58b10a8 str r1, [fp, #168] ; 0xa8 + 1f32638: e5d20000 ldrb r0, [r2] + 1f3263c: e3500050 cmp r0, #80 ; 0x50 + 1f32640: 1affffc8 bne 1f32568 + 1f32644: e1530001 cmp r3, r1 + 1f32648: 9a0000b2 bls 1f32918 + 1f3264c: e2812001 add r2, r1, #1 + 1f32650: e58b20a8 str r2, [fp, #168] ; 0xa8 + 1f32654: e5d10000 ldrb r0, [r1] + 1f32658: e350004e cmp r0, #78 ; 0x4e + 1f3265c: 1affffc1 bne 1f32568 + 1f32660: e1530002 cmp r3, r2 + 1f32664: 9a0000be bls 1f32964 + 1f32668: e2821001 add r1, r2, #1 + 1f3266c: e58b10a8 str r1, [fp, #168] ; 0xa8 + 1f32670: e5d20000 ldrb r0, [r2] + 1f32674: e3500047 cmp r0, #71 ; 0x47 + 1f32678: 1affffba bne 1f32568 + 1f3267c: e1530001 cmp r3, r1 + 1f32680: 9a0000ca bls 1f329b0 + 1f32684: e2812001 add r2, r1, #1 + 1f32688: e58b20a8 str r2, [fp, #168] ; 0xa8 + 1f3268c: e5d10000 ldrb r0, [r1] + 1f32690: e350000d cmp r0, #13 + 1f32694: 1affffb3 bne 1f32568 + 1f32698: e1530002 cmp r3, r2 + 1f3269c: 9a0000d6 bls 1f329fc + 1f326a0: e2821001 add r1, r2, #1 + 1f326a4: e58b10a8 str r1, [fp, #168] ; 0xa8 + 1f326a8: e5d20000 ldrb r0, [r2] + 1f326ac: e350000a cmp r0, #10 + 1f326b0: 1affffac bne 1f32568 + 1f326b4: e1530001 cmp r3, r1 + 1f326b8: 9a0000e2 bls 1f32a48 + 1f326bc: e2812001 add r2, r1, #1 + 1f326c0: e58b20a8 str r2, [fp, #168] ; 0xa8 + 1f326c4: e5d10000 ldrb r0, [r1] + 1f326c8: e350001a cmp r0, #26 + 1f326cc: 1affffa5 bne 1f32568 + 1f326d0: e1530002 cmp r3, r2 + 1f326d4: 9a0000ed bls 1f32a90 + 1f326d8: e2823001 add r3, r2, #1 + 1f326dc: e58b30a8 str r3, [fp, #168] ; 0xa8 + 1f326e0: e5d23000 ldrb r3, [r2] + 1f326e4: e353000a cmp r3, #10 + 1f326e8: 1affff9e bne 1f32568 + 1f326ec: e59d3020 ldr r3, [sp, #32] + 1f326f0: e3530001 cmp r3, #1 + 1f326f4: 0a0002d0 beq 1f3323c + 1f326f8: e3a03000 mov r3, #0 + 1f326fc: e3047e44 movw r7, #20036 ; 0x4e44 + 1f32700: e3447945 movt r7, #18757 ; 0x4945 + 1f32704: e58d304c str r3, [sp, #76] ; 0x4c + 1f32708: e1a06003 mov r6, r3 + 1f3270c: e58d303c str r3, [sp, #60] ; 0x3c + 1f32710: e58d3044 str r3, [sp, #68] ; 0x44 + 1f32714: e58d302c str r3, [sp, #44] ; 0x2c + 1f32718: e58d3038 str r3, [sp, #56] ; 0x38 + 1f3271c: e58d3054 str r3, [sp, #84] ; 0x54 + 1f32720: e58d3024 str r3, [sp, #36] ; 0x24 + 1f32724: e3053445 movw r3, #21573 ; 0x5445 + 1f32728: e345304c movt r3, #20556 ; 0x504c + 1f3272c: e58d3028 str r3, [sp, #40] ; 0x28 + 1f32730: e30a3aab movw r3, #43691 ; 0xaaab + 1f32734: e34a3aaa movt r3, #43690 ; 0xaaaa + 1f32738: e58d3050 str r3, [sp, #80] ; 0x50 + 1f3273c: e3043e53 movw r3, #20051 ; 0x4e53 + 1f32740: e3473452 movt r3, #29778 ; 0x7452 + 1f32744: e58d3030 str r3, [sp, #48] ; 0x30 + 1f32748: e3043452 movw r3, #17490 ; 0x4452 + 1f3274c: e3443948 movt r3, #18760 ; 0x4948 + 1f32750: e58d3048 str r3, [sp, #72] ; 0x48 + 1f32754: e3043249 movw r3, #16969 ; 0x4249 + 1f32758: e3443367 movt r3, #17255 ; 0x4367 + 1f3275c: e58d3034 str r3, [sp, #52] ; 0x34 + 1f32760: e3a03001 mov r3, #1 + 1f32764: e58d301c str r3, [sp, #28] + 1f32768: e1a0000b mov r0, fp + 1f3276c: ebffe1a2 bl 1f2adfc + 1f32770: e1a08000 mov r8, r0 + 1f32774: e1a0000b mov r0, fp + 1f32778: ebffe19f bl 1f2adfc + 1f3277c: e1500007 cmp r0, r7 + 1f32780: 0a0000d7 beq 1f32ae4 + 1f32784: 9a00001e bls 1f32804 + 1f32788: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f3278c: e1500003 cmp r0, r3 + 1f32790: 0a0001de beq 1f32f10 + 1f32794: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f32798: e1500003 cmp r0, r3 + 1f3279c: 0a00026f beq 1f33160 + 1f327a0: e59d3048 ldr r3, [sp, #72] ; 0x48 + 1f327a4: e1500003 cmp r0, r3 + 1f327a8: 0a00024e beq 1f330e8 + 1f327ac: e59d301c ldr r3, [sp, #28] + 1f327b0: e3530000 cmp r3, #0 + 1f327b4: 1a0002a5 bne 1f33250 + 1f327b8: e3100202 tst r0, #536870912 ; 0x20000000 + 1f327bc: 0a0004e3 beq 1f33b50 + 1f327c0: e3580000 cmp r8, #0 + 1f327c4: b59b30ac ldrlt r3, [fp, #172] ; 0xac + 1f327c8: b58b30a8 strlt r3, [fp, #168] ; 0xa8 + 1f327cc: ba000009 blt 1f327f8 + 1f327d0: e59b3010 ldr r3, [fp, #16] + 1f327d4: e3530000 cmp r3, #0 + 1f327d8: 0a000413 beq 1f3382c + 1f327dc: e59b20ac ldr r2, [fp, #172] ; 0xac + 1f327e0: e59b30a8 ldr r3, [fp, #168] ; 0xa8 + 1f327e4: e0631002 rsb r1, r3, r2 + 1f327e8: e1580001 cmp r8, r1 + 1f327ec: ca0003de bgt 1f3376c + 1f327f0: e0833008 add r3, r3, r8 + 1f327f4: e58b30a8 str r3, [fp, #168] ; 0xa8 + 1f327f8: e1a0000b mov r0, fp + 1f327fc: ebffe17e bl 1f2adfc + 1f32800: eaffffd8 b 1f32768 + 1f32804: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f32808: e1500003 cmp r0, r3 + 1f3280c: 0a0001b0 beq 1f32ed4 + 1f32810: e3043154 movw r3, #16724 ; 0x4154 + 1f32814: e3443944 movt r3, #18756 ; 0x4944 + 1f32818: e1500003 cmp r0, r3 + 1f3281c: 1affffe2 bne 1f327ac + 1f32820: e59d301c ldr r3, [sp, #28] + 1f32824: e3530000 cmp r3, #0 + 1f32828: 1a000288 bne 1f33250 + 1f3282c: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f32830: e59d202c ldr r2, [sp, #44] ; 0x2c + 1f32834: e2933000 adds r3, r3, #0 + 1f32838: 13a03001 movne r3, #1 + 1f3283c: e3520000 cmp r2, #0 + 1f32840: 13a03000 movne r3, #0 + 1f32844: e3530000 cmp r3, #0 + 1f32848: 1a000489 bne 1f33a74 + 1f3284c: e59d3020 ldr r3, [sp, #32] + 1f32850: e3530002 cmp r3, #2 + 1f32854: 0a0004b2 beq 1f33b24 + 1f32858: e59d3038 ldr r3, [sp, #56] ; 0x38 + 1f3285c: e0834008 add r4, r3, r8 + 1f32860: e1540003 cmp r4, r3 + 1f32864: ba0003df blt 1f337e8 + 1f32868: e1560004 cmp r6, r4 + 1f3286c: 21a02003 movcs r2, r3 + 1f32870: 259a5004 ldrcs r5, [sl, #4] + 1f32874: 2a000011 bcs 1f328c0 + 1f32878: e3560000 cmp r6, #0 + 1f3287c: 1a000004 bne 1f32894 + 1f32880: e3580a01 cmp r8, #4096 ; 0x1000 + 1f32884: 21a06008 movcs r6, r8 + 1f32888: 33a06a01 movcc r6, #4096 ; 0x1000 + 1f3288c: e1540006 cmp r4, r6 + 1f32890: 9a000002 bls 1f328a0 + 1f32894: e1a06086 lsl r6, r6, #1 + 1f32898: e1540006 cmp r4, r6 + 1f3289c: 8afffffc bhi 1f32894 + 1f328a0: e1a01006 mov r1, r6 + 1f328a4: e59a0004 ldr r0, [sl, #4] + 1f328a8: eb003253 bl 1f3f1fc + 1f328ac: e3500000 cmp r0, #0 + 1f328b0: 0a00043c beq 1f339a8 + 1f328b4: e59d2038 ldr r2, [sp, #56] ; 0x38 + 1f328b8: e1a05000 mov r5, r0 + 1f328bc: e58a0004 str r0, [sl, #4] + 1f328c0: e59b3010 ldr r3, [fp, #16] + 1f328c4: e0855002 add r5, r5, r2 + 1f328c8: e59b10a8 ldr r1, [fp, #168] ; 0xa8 + 1f328cc: e3530000 cmp r3, #0 + 1f328d0: e59b30ac ldr r3, [fp, #172] ; 0xac + 1f328d4: 0a000002 beq 1f328e4 + 1f328d8: e0619003 rsb r9, r1, r3 + 1f328dc: e1580009 cmp r8, r9 + 1f328e0: ca0002db bgt 1f33454 + 1f328e4: e0812008 add r2, r1, r8 + 1f328e8: e1530002 cmp r3, r2 + 1f328ec: 2a0002cb bcs 1f33420 + 1f328f0: e30a336c movw r3, #41836 ; 0xa36c + 1f328f4: e340320d movt r3, #525 ; 0x20d + 1f328f8: e3a05000 mov r5, #0 + 1f328fc: e30120f0 movw r2, #4336 ; 0x10f0 + 1f32900: e34021f6 movt r2, #502 ; 0x1f6 + 1f32904: e1a00005 mov r0, r5 + 1f32908: e5832000 str r2, [r3] + 1f3290c: e28ddd52 add sp, sp, #5248 ; 0x1480 + 1f32910: e28dd03c add sp, sp, #60 ; 0x3c + 1f32914: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f32918: e59b3020 ldr r3, [fp, #32] + 1f3291c: e3530000 cmp r3, #0 + 1f32920: 0affff10 beq 1f32568 + 1f32924: e28b4028 add r4, fp, #40 ; 0x28 + 1f32928: e59b3010 ldr r3, [fp, #16] + 1f3292c: e1a01004 mov r1, r4 + 1f32930: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f32934: e59b001c ldr r0, [fp, #28] + 1f32938: e12fff33 blx r3 + 1f3293c: e3500000 cmp r0, #0 + 1f32940: 1a0002a6 bne 1f333e0 + 1f32944: e28b3029 add r3, fp, #41 ; 0x29 + 1f32948: e58b0020 str r0, [fp, #32] + 1f3294c: e5cb0028 strb r0, [fp, #40] ; 0x28 + 1f32950: e1a01003 mov r1, r3 + 1f32954: e58b30ac str r3, [fp, #172] ; 0xac + 1f32958: e1a02001 mov r2, r1 + 1f3295c: e58b10a8 str r1, [fp, #168] ; 0xa8 + 1f32960: eaffff3c b 1f32658 + 1f32964: e59b3020 ldr r3, [fp, #32] + 1f32968: e3530000 cmp r3, #0 + 1f3296c: 0afffefd beq 1f32568 + 1f32970: e28b4028 add r4, fp, #40 ; 0x28 + 1f32974: e59b3010 ldr r3, [fp, #16] + 1f32978: e1a01004 mov r1, r4 + 1f3297c: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f32980: e59b001c ldr r0, [fp, #28] + 1f32984: e12fff33 blx r3 + 1f32988: e3500000 cmp r0, #0 + 1f3298c: 1a000297 bne 1f333f0 + 1f32990: e28b3029 add r3, fp, #41 ; 0x29 + 1f32994: e58b0020 str r0, [fp, #32] + 1f32998: e5cb0028 strb r0, [fp, #40] ; 0x28 + 1f3299c: e1a02003 mov r2, r3 + 1f329a0: e58b30ac str r3, [fp, #172] ; 0xac + 1f329a4: e1a01002 mov r1, r2 + 1f329a8: e58b20a8 str r2, [fp, #168] ; 0xa8 + 1f329ac: eaffff30 b 1f32674 + 1f329b0: e59b3020 ldr r3, [fp, #32] + 1f329b4: e3530000 cmp r3, #0 + 1f329b8: 0afffeea beq 1f32568 + 1f329bc: e28b4028 add r4, fp, #40 ; 0x28 + 1f329c0: e59b3010 ldr r3, [fp, #16] + 1f329c4: e1a01004 mov r1, r4 + 1f329c8: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f329cc: e59b001c ldr r0, [fp, #28] + 1f329d0: e12fff33 blx r3 + 1f329d4: e3500000 cmp r0, #0 + 1f329d8: 1a000288 bne 1f33400 + 1f329dc: e28b3029 add r3, fp, #41 ; 0x29 + 1f329e0: e58b0020 str r0, [fp, #32] + 1f329e4: e5cb0028 strb r0, [fp, #40] ; 0x28 + 1f329e8: e1a01003 mov r1, r3 + 1f329ec: e58b30ac str r3, [fp, #172] ; 0xac + 1f329f0: e1a02001 mov r2, r1 + 1f329f4: e58b10a8 str r1, [fp, #168] ; 0xa8 + 1f329f8: eaffff24 b 1f32690 + 1f329fc: e59b3020 ldr r3, [fp, #32] + 1f32a00: e3530000 cmp r3, #0 + 1f32a04: 0afffed7 beq 1f32568 + 1f32a08: e28b4028 add r4, fp, #40 ; 0x28 + 1f32a0c: e59b3010 ldr r3, [fp, #16] + 1f32a10: e1a01004 mov r1, r4 + 1f32a14: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f32a18: e59b001c ldr r0, [fp, #28] + 1f32a1c: e12fff33 blx r3 + 1f32a20: e3500000 cmp r0, #0 + 1f32a24: 1a000279 bne 1f33410 + 1f32a28: e28b3029 add r3, fp, #41 ; 0x29 + 1f32a2c: e58b0020 str r0, [fp, #32] + 1f32a30: e5cb0028 strb r0, [fp, #40] ; 0x28 + 1f32a34: e1a02003 mov r2, r3 + 1f32a38: e58b30ac str r3, [fp, #172] ; 0xac + 1f32a3c: e1a01002 mov r1, r2 + 1f32a40: e58b20a8 str r2, [fp, #168] ; 0xa8 + 1f32a44: eaffff18 b 1f326ac + 1f32a48: e59b3020 ldr r3, [fp, #32] + 1f32a4c: e3530000 cmp r3, #0 + 1f32a50: 0afffec4 beq 1f32568 + 1f32a54: e28b4028 add r4, fp, #40 ; 0x28 + 1f32a58: e59b3010 ldr r3, [fp, #16] + 1f32a5c: e1a01004 mov r1, r4 + 1f32a60: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f32a64: e59b001c ldr r0, [fp, #28] + 1f32a68: e12fff33 blx r3 + 1f32a6c: e3500000 cmp r0, #0 + 1f32a70: 0a000272 beq 1f33440 + 1f32a74: e0843000 add r3, r4, r0 + 1f32a78: e5db0028 ldrb r0, [fp, #40] ; 0x28 + 1f32a7c: e28b1029 add r1, fp, #41 ; 0x29 + 1f32a80: e58b30ac str r3, [fp, #172] ; 0xac + 1f32a84: e1a02001 mov r2, r1 + 1f32a88: e58b10a8 str r1, [fp, #168] ; 0xa8 + 1f32a8c: eaffff0d b 1f326c8 + 1f32a90: e59b3020 ldr r3, [fp, #32] + 1f32a94: e3530000 cmp r3, #0 + 1f32a98: 0afffeb2 beq 1f32568 + 1f32a9c: e28b4028 add r4, fp, #40 ; 0x28 + 1f32aa0: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f32aa4: e59b3010 ldr r3, [fp, #16] + 1f32aa8: e1a01004 mov r1, r4 + 1f32aac: e59b001c ldr r0, [fp, #28] + 1f32ab0: e12fff33 blx r3 + 1f32ab4: e3500000 cmp r0, #0 + 1f32ab8: 028b4029 addeq r4, fp, #41 ; 0x29 + 1f32abc: 10844000 addne r4, r4, r0 + 1f32ac0: 01a02004 moveq r2, r4 + 1f32ac4: 128b2029 addne r2, fp, #41 ; 0x29 + 1f32ac8: 058b0020 streq r0, [fp, #32] + 1f32acc: 01a03000 moveq r3, r0 + 1f32ad0: 05cb0028 strbeq r0, [fp, #40] ; 0x28 + 1f32ad4: 15db3028 ldrbne r3, [fp, #40] ; 0x28 + 1f32ad8: e58b40ac str r4, [fp, #172] ; 0xac + 1f32adc: e58b20a8 str r2, [fp, #168] ; 0xa8 + 1f32ae0: eafffeff b 1f326e4 + 1f32ae4: e59d301c ldr r3, [sp, #28] + 1f32ae8: e3530000 cmp r3, #0 + 1f32aec: 1a0001d7 bne 1f33250 + 1f32af0: e59d3020 ldr r3, [sp, #32] + 1f32af4: e3530000 cmp r3, #0 + 1f32af8: 1a0001cf bne 1f3323c + 1f32afc: e59a6004 ldr r6, [sl, #4] + 1f32b00: e3560000 cmp r6, #0 + 1f32b04: 0a00034d beq 1f33840 + 1f32b08: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f32b0c: e59b1000 ldr r1, [fp] + 1f32b10: e2235001 eor r5, r3, #1 + 1f32b14: e59a3010 ldr r3, [sl, #16] + 1f32b18: e59b2004 ldr r2, [fp, #4] + 1f32b1c: e59b4008 ldr r4, [fp, #8] + 1f32b20: e0030193 mul r3, r3, r1 + 1f32b24: e2833007 add r3, r3, #7 + 1f32b28: e0040294 mul r4, r4, r2 + 1f32b2c: e1a031a3 lsr r3, r3, #3 + 1f32b30: e0242394 mla r4, r4, r3, r2 + 1f32b34: e1a00004 mov r0, r4 + 1f32b38: eb002e8a bl 1f3e568 + 1f32b3c: e2503000 subs r3, r0, #0 + 1f32b40: 0a0003db beq 1f33ab4 + 1f32b44: e59d2038 ldr r2, [sp, #56] ; 0x38 + 1f32b48: e1a01005 mov r1, r5 + 1f32b4c: e28d0e4d add r0, sp, #1232 ; 0x4d0 + 1f32b50: e0834004 add r4, r3, r4 + 1f32b54: e0865002 add r5, r6, r2 + 1f32b58: e58d44e8 str r4, [sp, #1256] ; 0x4e8 + 1f32b5c: e3a02001 mov r2, #1 + 1f32b60: e58d54d4 str r5, [sp, #1236] ; 0x4d4 + 1f32b64: e58d64d0 str r6, [sp, #1232] ; 0x4d0 + 1f32b68: e58d34e4 str r3, [sp, #1252] ; 0x4e4 + 1f32b6c: e58d34e0 str r3, [sp, #1248] ; 0x4e0 + 1f32b70: e58d24ec str r2, [sp, #1260] ; 0x4ec + 1f32b74: ebffd945 bl 1f29090 + 1f32b78: e3500000 cmp r0, #0 + 1f32b7c: 0a0003ca beq 1f33aac + 1f32b80: e59d34e4 ldr r3, [sp, #1252] ; 0x4e4 + 1f32b84: e59d24e0 ldr r2, [sp, #1248] ; 0x4e0 + 1f32b88: e3530000 cmp r3, #0 + 1f32b8c: e58a3008 str r3, [sl, #8] + 1f32b90: e0633002 rsb r3, r3, r2 + 1f32b94: e58d305c str r3, [sp, #92] ; 0x5c + 1f32b98: 0a000312 beq 1f337e8 + 1f32b9c: e59a0004 ldr r0, [sl, #4] + 1f32ba0: eb002e78 bl 1f3e588 + 1f32ba4: e59b3008 ldr r3, [fp, #8] + 1f32ba8: e59d2020 ldr r2, [sp, #32] + 1f32bac: e59d1040 ldr r1, [sp, #64] ; 0x40 + 1f32bb0: e58a2004 str r2, [sl, #4] + 1f32bb4: e2832001 add r2, r3, #1 + 1f32bb8: e1520001 cmp r2, r1 + 1f32bbc: e58d2048 str r2, [sp, #72] ; 0x48 + 1f32bc0: 0a000386 beq 1f339e0 + 1f32bc4: e59d1054 ldr r1, [sp, #84] ; 0x54 + 1f32bc8: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f32bcc: e3510000 cmp r1, #0 + 1f32bd0: 01a02003 moveq r2, r3 + 1f32bd4: e58d2048 str r2, [sp, #72] ; 0x48 + 1f32bd8: e59a3010 ldr r3, [sl, #16] + 1f32bdc: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f32be0: e58b200c str r2, [fp, #12] + 1f32be4: e3530010 cmp r3, #16 + 1f32be8: e59d2044 ldr r2, [sp, #68] ; 0x44 + 1f32bec: e58d3060 str r3, [sp, #96] ; 0x60 + 1f32bf0: e59a3008 ldr r3, [sl, #8] + 1f32bf4: e58d3058 str r3, [sp, #88] ; 0x58 + 1f32bf8: 13a03001 movne r3, #1 + 1f32bfc: 03a03002 moveq r3, #2 + 1f32c00: e3520000 cmp r2, #0 + 1f32c04: 0a0002e5 beq 1f337a0 + 1f32c08: e59a2000 ldr r2, [sl] + 1f32c0c: e59d1048 ldr r1, [sp, #72] ; 0x48 + 1f32c10: e1a0c002 mov ip, r2 + 1f32c14: e5925004 ldr r5, [r2, #4] + 1f32c18: e592e000 ldr lr, [r2] + 1f32c1c: e0090391 mul r9, r1, r3 + 1f32c20: e1a03fa5 lsr r3, r5, #31 + 1f32c24: e1933fae orrs r3, r3, lr, lsr #31 + 1f32c28: 1a00030b bne 1f3385c + 1f32c2c: e3550000 cmp r5, #0 + 1f32c30: 0a000003 beq 1f32c44 + 1f32c34: e3e02102 mvn r2, #-2147483648 ; 0x80000000 + 1f32c38: e712f512 sdiv r2, r2, r5 + 1f32c3c: e15e0002 cmp lr, r2 + 1f32c40: ca000306 bgt 1f33860 + 1f32c44: e3590000 cmp r9, #0 + 1f32c48: e0000e95 mul r0, r5, lr + 1f32c4c: ba000302 blt 1f3385c + 1f32c50: 0a000003 beq 1f32c64 + 1f32c54: e3e03102 mvn r3, #-2147483648 ; 0x80000000 + 1f32c58: e713f913 sdiv r3, r3, r9 + 1f32c5c: e1500003 cmp r0, r3 + 1f32c60: ca0002fd bgt 1f3385c + 1f32c64: e0000990 mul r0, r0, r9 + 1f32c68: eb002e3e bl 1f3e568 + 1f32c6c: e59a3000 ldr r3, [sl] + 1f32c70: e58d001c str r0, [sp, #28] + 1f32c74: e1a0c003 mov ip, r3 + 1f32c78: e593e000 ldr lr, [r3] + 1f32c7c: e5935004 ldr r5, [r3, #4] + 1f32c80: e3a03000 mov r3, #0 + 1f32c84: e58db06c str fp, [sp, #108] ; 0x6c + 1f32c88: e58d3034 str r3, [sp, #52] ; 0x34 + 1f32c8c: e28d3088 add r3, sp, #136 ; 0x88 + 1f32c90: e58d3050 str r3, [sp, #80] ; 0x50 + 1f32c94: e28a300c add r3, sl, #12 + 1f32c98: e58d3068 str r3, [sp, #104] ; 0x68 + 1f32c9c: e1a0300e mov r3, lr + 1f32ca0: e1a0e00c mov lr, ip + 1f32ca4: ea000006 b 1f32cc4 + 1f32ca8: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f32cac: e2833001 add r3, r3, #1 + 1f32cb0: e58d3034 str r3, [sp, #52] ; 0x34 + 1f32cb4: e3530007 cmp r3, #7 + 1f32cb8: 0a0002ea beq 1f33868 + 1f32cbc: e59ae000 ldr lr, [sl] + 1f32cc0: e89e0028 ldm lr, {r3, r5} + 1f32cc4: e30fcdd4 movw ip, #64980 ; 0xfdd4 + 1f32cc8: e340c1f5 movt ip, #501 ; 0x1f5 + 1f32ccc: e59d2050 ldr r2, [sp, #80] ; 0x50 + 1f32cd0: e2433001 sub r3, r3, #1 + 1f32cd4: e1a0b003 mov fp, r3 + 1f32cd8: e2453001 sub r3, r5, #1 + 1f32cdc: e242800c sub r8, r2, #12 + 1f32ce0: e58d3020 str r3, [sp, #32] + 1f32ce4: e8bc000f ldm ip!, {r0, r1, r2, r3} + 1f32ce8: e8a8000f stmia r8!, {r0, r1, r2, r3} + 1f32cec: e28c700c add r7, ip, #12 + 1f32cf0: e28d4098 add r4, sp, #152 ; 0x98 + 1f32cf4: e89c0007 ldm ip, {r0, r1, r2} + 1f32cf8: e8880007 stm r8, {r0, r1, r2} + 1f32cfc: e8b7000f ldm r7!, {r0, r1, r2, r3} + 1f32d00: e8a4000f stmia r4!, {r0, r1, r2, r3} + 1f32d04: e28c6028 add r6, ip, #40 ; 0x28 + 1f32d08: e28d50b4 add r5, sp, #180 ; 0xb4 + 1f32d0c: e8970007 ldm r7, {r0, r1, r2} + 1f32d10: e8840007 stm r4, {r0, r1, r2} + 1f32d14: e8b6000f ldm r6!, {r0, r1, r2, r3} + 1f32d18: e8a5000f stmia r5!, {r0, r1, r2, r3} + 1f32d1c: e59d8034 ldr r8, [sp, #52] ; 0x34 + 1f32d20: e28d207c add r2, sp, #124 ; 0x7c + 1f32d24: e28cc044 add ip, ip, #68 ; 0x44 + 1f32d28: e28d7e4d add r7, sp, #1232 ; 0x4d0 + 1f32d2c: e7924108 ldr r4, [r2, r8, lsl #2] + 1f32d30: e8960007 ldm r6, {r0, r1, r2} + 1f32d34: e8850007 stm r5, {r0, r1, r2} + 1f32d38: e8bc000f ldm ip!, {r0, r1, r2, r3} + 1f32d3c: e8a7000f stmia r7!, {r0, r1, r2, r3} + 1f32d40: e89c0007 ldm ip, {r0, r1, r2} + 1f32d44: e8870007 stm r7, {r0, r1, r2} + 1f32d48: e28d20b4 add r2, sp, #180 ; 0xb4 + 1f32d4c: e1a03008 mov r3, r8 + 1f32d50: e28d1098 add r1, sp, #152 ; 0x98 + 1f32d54: e7928108 ldr r8, [r2, r8, lsl #2] + 1f32d58: e28d2e4d add r2, sp, #1232 ; 0x4d0 + 1f32d5c: e7917103 ldr r7, [r1, r3, lsl #2] + 1f32d60: e08b6008 add r6, fp, r8 + 1f32d64: e7922103 ldr r2, [r2, r3, lsl #2] + 1f32d68: e0646006 rsb r6, r4, r6 + 1f32d6c: e58d2030 str r2, [sp, #48] ; 0x30 + 1f32d70: e736f816 udiv r6, r6, r8 + 1f32d74: e59d3020 ldr r3, [sp, #32] + 1f32d78: e0833002 add r3, r3, r2 + 1f32d7c: e0673003 rsb r3, r7, r3 + 1f32d80: e733f213 udiv r3, r3, r2 + 1f32d84: e58d302c str r3, [sp, #44] ; 0x2c + 1f32d88: e3560000 cmp r6, #0 + 1f32d8c: 13530000 cmpne r3, #0 + 1f32d90: 0affffc4 beq 1f32ca8 + 1f32d94: e59ec008 ldr ip, [lr, #8] + 1f32d98: e1a0000e mov r0, lr + 1f32d9c: e59d5060 ldr r5, [sp, #96] ; 0x60 + 1f32da0: e59de02c ldr lr, [sp, #44] ; 0x2c + 1f32da4: e00c069c mul ip, ip, r6 + 1f32da8: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f32dac: e58d500c str r5, [sp, #12] + 1f32db0: e00c0c95 mul ip, r5, ip + 1f32db4: e59d5048 ldr r5, [sp, #72] ; 0x48 + 1f32db8: e28cc007 add ip, ip, #7 + 1f32dbc: e58d3010 str r3, [sp, #16] + 1f32dc0: e58d5000 str r5, [sp] + 1f32dc4: e1a0500e mov r5, lr + 1f32dc8: e1a0c1cc asr ip, ip, #3 + 1f32dcc: e59d305c ldr r3, [sp, #92] ; 0x5c + 1f32dd0: e59d2058 ldr r2, [sp, #88] ; 0x58 + 1f32dd4: e02cee9c mla ip, ip, lr, lr + 1f32dd8: e58de008 str lr, [sp, #8] + 1f32ddc: e59d1068 ldr r1, [sp, #104] ; 0x68 + 1f32de0: e58d6004 str r6, [sp, #4] + 1f32de4: e58dc064 str ip, [sp, #100] ; 0x64 + 1f32de8: ebffe923 bl 1f2d27c + 1f32dec: e3500000 cmp r0, #0 + 1f32df0: 0a000368 beq 1f33b98 + 1f32df4: e3550000 cmp r5, #0 + 1f32df8: da00002b ble 1f32eac + 1f32dfc: e0080899 mul r8, r9, r8 + 1f32e00: e0030499 mul r3, r9, r4 + 1f32e04: e58d3044 str r3, [sp, #68] ; 0x44 + 1f32e08: e3a03000 mov r3, #0 + 1f32e0c: e0020699 mul r2, r9, r6 + 1f32e10: e58d3020 str r3, [sp, #32] + 1f32e14: e58d3028 str r3, [sp, #40] ; 0x28 + 1f32e18: e1a0300a mov r3, sl + 1f32e1c: e58d2038 str r2, [sp, #56] ; 0x38 + 1f32e20: e1a0a008 mov sl, r8 + 1f32e24: e1a08003 mov r8, r3 + 1f32e28: e3560000 cmp r6, #0 + 1f32e2c: da000011 ble 1f32e78 + 1f32e30: e59db020 ldr fp, [sp, #32] + 1f32e34: e3a04000 mov r4, #0 + 1f32e38: e59d5044 ldr r5, [sp, #68] ; 0x44 + 1f32e3c: e5980000 ldr r0, [r8] + 1f32e40: e2844001 add r4, r4, #1 + 1f32e44: e598100c ldr r1, [r8, #12] + 1f32e48: e1a02009 mov r2, r9 + 1f32e4c: e59d301c ldr r3, [sp, #28] + 1f32e50: e5900000 ldr r0, [r0] + 1f32e54: e081100b add r1, r1, fp + 1f32e58: e08bb009 add fp, fp, r9 + 1f32e5c: e0000990 mul r0, r0, r9 + 1f32e60: e0205097 mla r0, r7, r0, r5 + 1f32e64: e085500a add r5, r5, sl + 1f32e68: e0830000 add r0, r3, r0 + 1f32e6c: eb002fe3 bl 1f3ee00 + 1f32e70: e1560004 cmp r6, r4 + 1f32e74: 1afffff0 bne 1f32e3c + 1f32e78: e59d2020 ldr r2, [sp, #32] + 1f32e7c: e59d1038 ldr r1, [sp, #56] ; 0x38 + 1f32e80: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f32e84: e0822001 add r2, r2, r1 + 1f32e88: e58d2020 str r2, [sp, #32] + 1f32e8c: e59d202c ldr r2, [sp, #44] ; 0x2c + 1f32e90: e2833001 add r3, r3, #1 + 1f32e94: e58d3028 str r3, [sp, #40] ; 0x28 + 1f32e98: e1520003 cmp r2, r3 + 1f32e9c: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f32ea0: e0877003 add r7, r7, r3 + 1f32ea4: 1affffdf bne 1f32e28 + 1f32ea8: e1a0a008 mov sl, r8 + 1f32eac: e59d2058 ldr r2, [sp, #88] ; 0x58 + 1f32eb0: e59d3064 ldr r3, [sp, #100] ; 0x64 + 1f32eb4: e59a000c ldr r0, [sl, #12] + 1f32eb8: e0822003 add r2, r2, r3 + 1f32ebc: e58d2058 str r2, [sp, #88] ; 0x58 + 1f32ec0: e59d205c ldr r2, [sp, #92] ; 0x5c + 1f32ec4: e0633002 rsb r3, r3, r2 + 1f32ec8: e58d305c str r3, [sp, #92] ; 0x5c + 1f32ecc: eb002dad bl 1f3e588 + 1f32ed0: eaffff74 b 1f32ca8 + 1f32ed4: e3580000 cmp r8, #0 + 1f32ed8: ba000216 blt 1f33738 + 1f32edc: e59b3010 ldr r3, [fp, #16] + 1f32ee0: e3530000 cmp r3, #0 + 1f32ee4: 0a00024e beq 1f33824 + 1f32ee8: e59b20ac ldr r2, [fp, #172] ; 0xac + 1f32eec: e59b30a8 ldr r3, [fp, #168] ; 0xa8 + 1f32ef0: e0631002 rsb r1, r3, r2 + 1f32ef4: e1580001 cmp r8, r1 + 1f32ef8: ca000213 bgt 1f3374c + 1f32efc: e0833008 add r3, r3, r8 + 1f32f00: e3a02001 mov r2, #1 + 1f32f04: e58b30a8 str r3, [fp, #168] ; 0xa8 + 1f32f08: e58d204c str r2, [sp, #76] ; 0x4c + 1f32f0c: eafffe39 b 1f327f8 + 1f32f10: e59d301c ldr r3, [sp, #28] + 1f32f14: e3530000 cmp r3, #0 + 1f32f18: 1a0000cc bne 1f33250 + 1f32f1c: e3580c03 cmp r8, #768 ; 0x300 + 1f32f20: 8a0002b7 bhi 1f33a04 + 1f32f24: e59d3050 ldr r3, [sp, #80] ; 0x50 + 1f32f28: e0832398 umull r2, r3, r8, r3 + 1f32f2c: e1a030a3 lsr r3, r3, #1 + 1f32f30: e58d302c str r3, [sp, #44] ; 0x2c + 1f32f34: e1a02003 mov r2, r3 + 1f32f38: e0833083 add r3, r3, r3, lsl #1 + 1f32f3c: e1580003 cmp r8, r3 + 1f32f40: 1a0002af bne 1f33a04 + 1f32f44: e3520000 cmp r2, #0 + 1f32f48: 0afffe2a beq 1f327f8 + 1f32f4c: e28d10f8 add r1, sp, #248 ; 0xf8 + 1f32f50: e59b30a8 ldr r3, [fp, #168] ; 0xa8 + 1f32f54: e0818102 add r8, r1, r2, lsl #2 + 1f32f58: e2414026 sub r4, r1, #38 ; 0x26 + 1f32f5c: e59b20ac ldr r2, [fp, #172] ; 0xac + 1f32f60: e2488026 sub r8, r8, #38 ; 0x26 + 1f32f64: e28b5028 add r5, fp, #40 ; 0x28 + 1f32f68: e3e09000 mvn r9, #0 + 1f32f6c: ea00000e b 1f32fac + 1f32f70: e59b1020 ldr r1, [fp, #32] + 1f32f74: e3510000 cmp r1, #0 + 1f32f78: 05441002 strbeq r1, [r4, #-2] + 1f32f7c: 01a00003 moveq r0, r3 + 1f32f80: 1a000046 bne 1f330a0 + 1f32f84: e3510000 cmp r1, #0 + 1f32f88: 05441001 strbeq r1, [r4, #-1] + 1f32f8c: 01a03000 moveq r3, r0 + 1f32f90: 1a000019 bne 1f32ffc + 1f32f94: e3a01000 mov r1, #0 + 1f32f98: e5c41000 strb r1, [r4] + 1f32f9c: e2844004 add r4, r4, #4 + 1f32fa0: e5449003 strb r9, [r4, #-3] + 1f32fa4: e1580004 cmp r8, r4 + 1f32fa8: 0afffe12 beq 1f327f8 + 1f32fac: e1530002 cmp r3, r2 + 1f32fb0: 2affffee bcs 1f32f70 + 1f32fb4: e2830001 add r0, r3, #1 + 1f32fb8: e58b00a8 str r0, [fp, #168] ; 0xa8 + 1f32fbc: e5d33000 ldrb r3, [r3] + 1f32fc0: e1500002 cmp r0, r2 + 1f32fc4: e5443002 strb r3, [r4, #-2] + 1f32fc8: 259b1020 ldrcs r1, [fp, #32] + 1f32fcc: 2affffec bcs 1f32f84 + 1f32fd0: e2803001 add r3, r0, #1 + 1f32fd4: e58b30a8 str r3, [fp, #168] ; 0xa8 + 1f32fd8: e1530002 cmp r3, r2 + 1f32fdc: e5d01000 ldrb r1, [r0] + 1f32fe0: e5441001 strb r1, [r4, #-1] + 1f32fe4: 2a000018 bcs 1f3304c + 1f32fe8: e2830001 add r0, r3, #1 + 1f32fec: e58b00a8 str r0, [fp, #168] ; 0xa8 + 1f32ff0: e5d31000 ldrb r1, [r3] + 1f32ff4: e1a03000 mov r3, r0 + 1f32ff8: eaffffe6 b 1f32f98 + 1f32ffc: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f33000: e1a01005 mov r1, r5 + 1f33004: e59b3010 ldr r3, [fp, #16] + 1f33008: e59b001c ldr r0, [fp, #28] + 1f3300c: e12fff33 blx r3 + 1f33010: e3500000 cmp r0, #0 + 1f33014: 028b2029 addeq r2, fp, #41 ; 0x29 + 1f33018: 01a01000 moveq r1, r0 + 1f3301c: 10852000 addne r2, r5, r0 + 1f33020: 058b0020 streq r0, [fp, #32] + 1f33024: 128b0029 addne r0, fp, #41 ; 0x29 + 1f33028: 05cb0028 strbeq r0, [fp, #40] ; 0x28 + 1f3302c: 01a00002 moveq r0, r2 + 1f33030: 15db1028 ldrbne r1, [fp, #40] ; 0x28 + 1f33034: e1a03000 mov r3, r0 + 1f33038: e58b20ac str r2, [fp, #172] ; 0xac + 1f3303c: e1530002 cmp r3, r2 + 1f33040: e58b00a8 str r0, [fp, #168] ; 0xa8 + 1f33044: e5441001 strb r1, [r4, #-1] + 1f33048: 3affffe6 bcc 1f32fe8 + 1f3304c: e59b1020 ldr r1, [fp, #32] + 1f33050: e3510000 cmp r1, #0 + 1f33054: 0affffce beq 1f32f94 + 1f33058: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f3305c: e1a01005 mov r1, r5 + 1f33060: e59b3010 ldr r3, [fp, #16] + 1f33064: e59b001c ldr r0, [fp, #28] + 1f33068: e12fff33 blx r3 + 1f3306c: e3500000 cmp r0, #0 + 1f33070: 028b2029 addeq r2, fp, #41 ; 0x29 + 1f33074: 10852000 addne r2, r5, r0 + 1f33078: 058b0020 streq r0, [fp, #32] + 1f3307c: 128b0029 addne r0, fp, #41 ; 0x29 + 1f33080: 05cb0028 strbeq r0, [fp, #40] ; 0x28 + 1f33084: 01a01000 moveq r1, r0 + 1f33088: 01a00002 moveq r0, r2 + 1f3308c: 15db1028 ldrbne r1, [fp, #40] ; 0x28 + 1f33090: e58b20ac str r2, [fp, #172] ; 0xac + 1f33094: e1a03000 mov r3, r0 + 1f33098: e58b00a8 str r0, [fp, #168] ; 0xa8 + 1f3309c: eaffffbd b 1f32f98 + 1f330a0: e1a01005 mov r1, r5 + 1f330a4: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f330a8: e59b3010 ldr r3, [fp, #16] + 1f330ac: e59b001c ldr r0, [fp, #28] + 1f330b0: e12fff33 blx r3 + 1f330b4: e3500000 cmp r0, #0 + 1f330b8: 028b2029 addeq r2, fp, #41 ; 0x29 + 1f330bc: 128b1029 addne r1, fp, #41 ; 0x29 + 1f330c0: 01a01002 moveq r1, r2 + 1f330c4: 10852000 addne r2, r5, r0 + 1f330c8: 058b0020 streq r0, [fp, #32] + 1f330cc: 01a03000 moveq r3, r0 + 1f330d0: 05cb0028 strbeq r0, [fp, #40] ; 0x28 + 1f330d4: e1a00001 mov r0, r1 + 1f330d8: 15db3028 ldrbne r3, [fp, #40] ; 0x28 + 1f330dc: e58b20ac str r2, [fp, #172] ; 0xac + 1f330e0: e58b10a8 str r1, [fp, #168] ; 0xa8 + 1f330e4: eaffffb5 b 1f32fc0 + 1f330e8: e59d301c ldr r3, [sp, #28] + 1f330ec: e3530000 cmp r3, #0 + 1f330f0: 0a000251 beq 1f33a3c + 1f330f4: e358000d cmp r8, #13 + 1f330f8: 1a00028d bne 1f33b34 + 1f330fc: e1a0000b mov r0, fp + 1f33100: ebffdf3d bl 1f2adfc + 1f33104: e3500401 cmp r0, #16777216 ; 0x1000000 + 1f33108: e58b0000 str r0, [fp] + 1f3310c: 8a00022c bhi 1f339c4 + 1f33110: e1a0000b mov r0, fp + 1f33114: ebffdf38 bl 1f2adfc + 1f33118: e3500401 cmp r0, #16777216 ; 0x1000000 + 1f3311c: e58b0004 str r0, [fp, #4] + 1f33120: 8a000227 bhi 1f339c4 + 1f33124: e59b20a8 ldr r2, [fp, #168] ; 0xa8 + 1f33128: e59b80ac ldr r8, [fp, #172] ; 0xac + 1f3312c: e1520008 cmp r2, r8 + 1f33130: 3a000070 bcc 1f332f8 + 1f33134: e59b3020 ldr r3, [fp, #32] + 1f33138: e3530000 cmp r3, #0 + 1f3313c: 1a000113 bne 1f33590 + 1f33140: e58a3010 str r3, [sl, #16] + 1f33144: e30a336c movw r3, #41836 ; 0xa36c + 1f33148: e340320d movt r3, #525 ; 0x20d + 1f3314c: e30120c8 movw r2, #4296 ; 0x10c8 + 1f33150: e34021f6 movt r2, #502 ; 0x1f6 + 1f33154: e3a05000 mov r5, #0 + 1f33158: e5832000 str r2, [r3] + 1f3315c: eafffd07 b 1f32580 + 1f33160: e59d301c ldr r3, [sp, #28] + 1f33164: e3530000 cmp r3, #0 + 1f33168: 1a000038 bne 1f33250 + 1f3316c: e59a3004 ldr r3, [sl, #4] + 1f33170: e3530000 cmp r3, #0 + 1f33174: 1a000245 bne 1f33a90 + 1f33178: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f3317c: e3530000 cmp r3, #0 + 1f33180: 0a00003c beq 1f33278 + 1f33184: e59d3020 ldr r3, [sp, #32] + 1f33188: e3530002 cmp r3, #2 + 1f3318c: 0a00027d beq 1f33b88 + 1f33190: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f33194: e3530000 cmp r3, #0 + 1f33198: 0a0002e0 beq 1f33d20 + 1f3319c: e1530008 cmp r3, r8 + 1f331a0: 3a00022c bcc 1f33a58 + 1f331a4: e3580000 cmp r8, #0 + 1f331a8: 0a0000b8 beq 1f33490 + 1f331ac: e59b30a8 ldr r3, [fp, #168] ; 0xa8 + 1f331b0: e28d50d0 add r5, sp, #208 ; 0xd0 + 1f331b4: e59b20ac ldr r2, [fp, #172] ; 0xac + 1f331b8: e3a04000 mov r4, #0 + 1f331bc: e28b9028 add r9, fp, #40 ; 0x28 + 1f331c0: ea000016 b 1f33220 + 1f331c4: e59b0020 ldr r0, [fp, #32] + 1f331c8: e3500000 cmp r0, #0 + 1f331cc: 0a00000e beq 1f3320c + 1f331d0: e59b3010 ldr r3, [fp, #16] + 1f331d4: e1a01009 mov r1, r9 + 1f331d8: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f331dc: e59b001c ldr r0, [fp, #28] + 1f331e0: e12fff33 blx r3 + 1f331e4: e3500000 cmp r0, #0 + 1f331e8: e28b1029 add r1, fp, #41 ; 0x29 + 1f331ec: e0892000 add r2, r9, r0 + 1f331f0: 15db0028 ldrbne r0, [fp, #40] ; 0x28 + 1f331f4: 01a02001 moveq r2, r1 + 1f331f8: 058b0020 streq r0, [fp, #32] + 1f331fc: e1a03001 mov r3, r1 + 1f33200: 05cb0028 strbeq r0, [fp, #40] ; 0x28 + 1f33204: e58b20ac str r2, [fp, #172] ; 0xac + 1f33208: e58b10a8 str r1, [fp, #168] ; 0xa8 + 1f3320c: e2844001 add r4, r4, #1 + 1f33210: e5c50003 strb r0, [r5, #3] + 1f33214: e1580004 cmp r8, r4 + 1f33218: e2855004 add r5, r5, #4 + 1f3321c: 0a00009b beq 1f33490 + 1f33220: e1530002 cmp r3, r2 + 1f33224: 2affffe6 bcs 1f331c4 + 1f33228: e2831001 add r1, r3, #1 + 1f3322c: e58b10a8 str r1, [fp, #168] ; 0xa8 + 1f33230: e5d30000 ldrb r0, [r3] + 1f33234: e1a03001 mov r3, r1 + 1f33238: eafffff3 b 1f3320c + 1f3323c: e3a05001 mov r5, #1 + 1f33240: e1a00005 mov r0, r5 + 1f33244: e28ddd52 add sp, sp, #5248 ; 0x1480 + 1f33248: e28dd03c add sp, sp, #60 ; 0x3c + 1f3324c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f33250: e30a336c movw r3, #41836 ; 0xa36c + 1f33254: e340320d movt r3, #525 ; 0x20d + 1f33258: e3a05000 mov r5, #0 + 1f3325c: e3012070 movw r2, #4208 ; 0x1070 + 1f33260: e34021f6 movt r2, #502 ; 0x1f6 + 1f33264: e1a00005 mov r0, r5 + 1f33268: e5832000 str r2, [r3] + 1f3326c: e28ddd52 add sp, sp, #5248 ; 0x1480 + 1f33270: e28dd03c add sp, sp, #60 ; 0x3c + 1f33274: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f33278: e59b3008 ldr r3, [fp, #8] + 1f3327c: e2135001 ands r5, r3, #1 + 1f33280: 0a000248 beq 1f33ba8 + 1f33284: e1580083 cmp r8, r3, lsl #1 + 1f33288: 1a0001f2 bne 1f33a58 + 1f3328c: e59a2010 ldr r2, [sl, #16] + 1f33290: e3520010 cmp r2, #16 + 1f33294: 0a000155 beq 1f337f0 + 1f33298: e3530000 cmp r3, #0 + 1f3329c: da00000d ble 1f332d8 + 1f332a0: e30f4e48 movw r4, #65096 ; 0xfe48 + 1f332a4: e34041f5 movt r4, #501 ; 0x1f5 + 1f332a8: e3a08000 mov r8, #0 + 1f332ac: e28d5070 add r5, sp, #112 ; 0x70 + 1f332b0: e1a0000b mov r0, fp + 1f332b4: ebffde8e bl 1f2acf4 + 1f332b8: e59a3010 ldr r3, [sl, #16] + 1f332bc: e59b2008 ldr r2, [fp, #8] + 1f332c0: e7d43003 ldrb r3, [r4, r3] + 1f332c4: e0000390 mul r0, r0, r3 + 1f332c8: e7c50008 strb r0, [r5, r8] + 1f332cc: e2888001 add r8, r8, #1 + 1f332d0: e1520008 cmp r2, r8 + 1f332d4: cafffff5 bgt 1f332b0 + 1f332d8: e3a03001 mov r3, #1 + 1f332dc: e58d3054 str r3, [sp, #84] ; 0x54 + 1f332e0: eafffd44 b 1f327f8 + 1f332e4: e28b3029 add r3, fp, #41 ; 0x29 + 1f332e8: e58b0020 str r0, [fp, #32] + 1f332ec: e5cb0028 strb r0, [fp, #40] ; 0x28 + 1f332f0: e1a01003 mov r1, r3 + 1f332f4: eafffcb0 b 1f325bc + 1f332f8: e2823001 add r3, r2, #1 + 1f332fc: e58b30a8 str r3, [fp, #168] ; 0xa8 + 1f33300: e5d22000 ldrb r2, [r2] + 1f33304: e2421004 sub r1, r2, #4 + 1f33308: e2420001 sub r0, r2, #1 + 1f3330c: e31100fb tst r1, #251 ; 0xfb + 1f33310: 13a01001 movne r1, #1 + 1f33314: 03a01000 moveq r1, #0 + 1f33318: e3500001 cmp r0, #1 + 1f3331c: 93a01000 movls r1, #0 + 1f33320: 82011001 andhi r1, r1, #1 + 1f33324: e3510000 cmp r1, #0 + 1f33328: e58a2010 str r2, [sl, #16] + 1f3332c: 1a000140 bne 1f33834 + 1f33330: e1530008 cmp r3, r8 + 1f33334: 3a000061 bcc 1f334c0 + 1f33338: e59b2020 ldr r2, [fp, #32] + 1f3333c: e3520000 cmp r2, #0 + 1f33340: 058d203c streq r2, [sp, #60] ; 0x3c + 1f33344: 01a05002 moveq r5, r2 + 1f33348: 1a0000a7 bne 1f335ec + 1f3334c: e1530008 cmp r3, r8 + 1f33350: 3a00006d bcc 1f3350c + 1f33354: e59b3020 ldr r3, [fp, #32] + 1f33358: e3530000 cmp r3, #0 + 1f3335c: 058d3044 streq r3, [sp, #68] ; 0x44 + 1f33360: 1a0000b6 bne 1f33640 + 1f33364: e59b2000 ldr r2, [fp] + 1f33368: e3520000 cmp r2, #0 + 1f3336c: 0a0001ab beq 1f33a20 + 1f33370: e59b3004 ldr r3, [fp, #4] + 1f33374: e3530000 cmp r3, #0 + 1f33378: 0a0001a8 beq 1f33a20 + 1f3337c: e59dc024 ldr ip, [sp, #36] ; 0x24 + 1f33380: e35c0000 cmp ip, #0 + 1f33384: e1a0100c mov r1, ip + 1f33388: 1a000043 bne 1f3349c + 1f3338c: e3a00101 mov r0, #1073741824 ; 0x40000000 + 1f33390: e3150002 tst r5, #2 + 1f33394: 03a01001 moveq r1, #1 + 1f33398: 13a01003 movne r1, #3 + 1f3339c: e732f210 udiv r2, r0, r2 + 1f333a0: e7e05155 ubfx r5, r5, #2, #1 + 1f333a4: e0855001 add r5, r5, r1 + 1f333a8: e58b5008 str r5, [fp, #8] + 1f333ac: e732f512 udiv r2, r2, r5 + 1f333b0: e1530002 cmp r3, r2 + 1f333b4: 8a000182 bhi 1f339c4 + 1f333b8: e59d3020 ldr r3, [sp, #32] + 1f333bc: e3530002 cmp r3, #2 + 1f333c0: 0affff9d beq 1f3323c + 1f333c4: e58dc01c str ip, [sp, #28] + 1f333c8: eafffd0a b 1f327f8 + 1f333cc: e28b3029 add r3, fp, #41 ; 0x29 + 1f333d0: e58b0020 str r0, [fp, #32] + 1f333d4: e5cb0028 strb r0, [fp, #40] ; 0x28 + 1f333d8: e1a02003 mov r2, r3 + 1f333dc: eafffc8f b 1f32620 + 1f333e0: e0843000 add r3, r4, r0 + 1f333e4: e28b1029 add r1, fp, #41 ; 0x29 + 1f333e8: e5db0028 ldrb r0, [fp, #40] ; 0x28 + 1f333ec: eafffd58 b 1f32954 + 1f333f0: e0843000 add r3, r4, r0 + 1f333f4: e28b2029 add r2, fp, #41 ; 0x29 + 1f333f8: e5db0028 ldrb r0, [fp, #40] ; 0x28 + 1f333fc: eafffd67 b 1f329a0 + 1f33400: e0843000 add r3, r4, r0 + 1f33404: e28b1029 add r1, fp, #41 ; 0x29 + 1f33408: e5db0028 ldrb r0, [fp, #40] ; 0x28 + 1f3340c: eafffd76 b 1f329ec + 1f33410: e0843000 add r3, r4, r0 + 1f33414: e28b2029 add r2, fp, #41 ; 0x29 + 1f33418: e5db0028 ldrb r0, [fp, #40] ; 0x28 + 1f3341c: eafffd85 b 1f32a38 + 1f33420: e1a02008 mov r2, r8 + 1f33424: e1a00005 mov r0, r5 + 1f33428: e58d4038 str r4, [sp, #56] ; 0x38 + 1f3342c: eb002e73 bl 1f3ee00 + 1f33430: e59b30a8 ldr r3, [fp, #168] ; 0xa8 + 1f33434: e0838008 add r8, r3, r8 + 1f33438: e58b80a8 str r8, [fp, #168] ; 0xa8 + 1f3343c: eafffced b 1f327f8 + 1f33440: e28b3029 add r3, fp, #41 ; 0x29 + 1f33444: e58b0020 str r0, [fp, #32] + 1f33448: e5cb0028 strb r0, [fp, #40] ; 0x28 + 1f3344c: e1a01003 mov r1, r3 + 1f33450: eafffd8a b 1f32a80 + 1f33454: e0698008 rsb r8, r9, r8 + 1f33458: e1a02009 mov r2, r9 + 1f3345c: e1a00005 mov r0, r5 + 1f33460: eb002e66 bl 1f3ee00 + 1f33464: e59b3010 ldr r3, [fp, #16] + 1f33468: e0851009 add r1, r5, r9 + 1f3346c: e1a02008 mov r2, r8 + 1f33470: e59b001c ldr r0, [fp, #28] + 1f33474: e12fff33 blx r3 + 1f33478: e1580000 cmp r8, r0 + 1f3347c: e59b30ac ldr r3, [fp, #172] ; 0xac + 1f33480: e58b30a8 str r3, [fp, #168] ; 0xa8 + 1f33484: 1afffd19 bne 1f328f0 + 1f33488: e58d4038 str r4, [sp, #56] ; 0x38 + 1f3348c: eafffcd9 b 1f327f8 + 1f33490: e3a03004 mov r3, #4 + 1f33494: e58d3024 str r3, [sp, #36] ; 0x24 + 1f33498: eafffcd6 b 1f327f8 + 1f3349c: e3a01201 mov r1, #268435456 ; 0x10000000 + 1f334a0: e3a00001 mov r0, #1 + 1f334a4: e58b0008 str r0, [fp, #8] + 1f334a8: e732f211 udiv r2, r1, r2 + 1f334ac: e1530002 cmp r3, r2 + 1f334b0: 8a000143 bhi 1f339c4 + 1f334b4: e3a03000 mov r3, #0 + 1f334b8: e58d301c str r3, [sp, #28] + 1f334bc: eafffccd b 1f327f8 + 1f334c0: e2832001 add r2, r3, #1 + 1f334c4: e58b20a8 str r2, [fp, #168] ; 0xa8 + 1f334c8: e5d35000 ldrb r5, [r3] + 1f334cc: e1a03002 mov r3, r2 + 1f334d0: e58d503c str r5, [sp, #60] ; 0x3c + 1f334d4: e1a02005 mov r2, r5 + 1f334d8: e3520006 cmp r2, #6 + 1f334dc: ca000003 bgt 1f334f0 + 1f334e0: e3520003 cmp r2, #3 + 1f334e4: 0a000023 beq 1f33578 + 1f334e8: e3150001 tst r5, #1 + 1f334ec: 0affff96 beq 1f3334c + 1f334f0: e30a336c movw r3, #41836 ; 0xa36c + 1f334f4: e340320d movt r3, #525 ; 0x20d + 1f334f8: e3012018 movw r2, #4120 ; 0x1018 + 1f334fc: e34021f6 movt r2, #502 ; 0x1f6 + 1f33500: e3a05000 mov r5, #0 + 1f33504: e5832000 str r2, [r3] + 1f33508: eafffc1c b 1f32580 + 1f3350c: e2832001 add r2, r3, #1 + 1f33510: e58b20a8 str r2, [fp, #168] ; 0xa8 + 1f33514: e5d34000 ldrb r4, [r3] + 1f33518: e3540000 cmp r4, #0 + 1f3351c: 1a000167 bne 1f33ac0 + 1f33520: e1520008 cmp r2, r8 + 1f33524: 2a000058 bcs 1f3368c + 1f33528: e2823001 add r3, r2, #1 + 1f3352c: e58b30a8 str r3, [fp, #168] ; 0xa8 + 1f33530: e5d24000 ldrb r4, [r2] + 1f33534: e3540000 cmp r4, #0 + 1f33538: 1a000167 bne 1f33adc + 1f3353c: e1530008 cmp r3, r8 + 1f33540: 2a000066 bcs 1f336e0 + 1f33544: e2832001 add r2, r3, #1 + 1f33548: e58b20a8 str r2, [fp, #168] ; 0xa8 + 1f3354c: e5d33000 ldrb r3, [r3] + 1f33550: e58d3044 str r3, [sp, #68] ; 0x44 + 1f33554: e3530001 cmp r3, #1 + 1f33558: daffff81 ble 1f33364 + 1f3355c: e30a336c movw r3, #41836 ; 0xa36c + 1f33560: e340320d movt r3, #525 ; 0x20d + 1f33564: e3012048 movw r2, #4168 ; 0x1048 + 1f33568: e34021f6 movt r2, #502 ; 0x1f6 + 1f3356c: e3a05000 mov r5, #0 + 1f33570: e5832000 str r2, [r3] + 1f33574: eafffc01 b 1f32580 + 1f33578: e59a2010 ldr r2, [sl, #16] + 1f3357c: e3520010 cmp r2, #16 + 1f33580: 0affffda beq 1f334f0 + 1f33584: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f33588: e58d2024 str r2, [sp, #36] ; 0x24 + 1f3358c: eaffff6e b 1f3334c + 1f33590: e28b4028 add r4, fp, #40 ; 0x28 + 1f33594: e59b3010 ldr r3, [fp, #16] + 1f33598: e1a01004 mov r1, r4 + 1f3359c: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f335a0: e59b001c ldr r0, [fp, #28] + 1f335a4: e12fff33 blx r3 + 1f335a8: e3500000 cmp r0, #0 + 1f335ac: 0a000074 beq 1f33784 + 1f335b0: e5db2028 ldrb r2, [fp, #40] ; 0x28 + 1f335b4: e0848000 add r8, r4, r0 + 1f335b8: e28b0029 add r0, fp, #41 ; 0x29 + 1f335bc: e2423004 sub r3, r2, #4 + 1f335c0: e2421001 sub r1, r2, #1 + 1f335c4: e31300fb tst r3, #251 ; 0xfb + 1f335c8: 13a03001 movne r3, #1 + 1f335cc: 03a03000 moveq r3, #0 + 1f335d0: e3510001 cmp r1, #1 + 1f335d4: 93a01000 movls r1, #0 + 1f335d8: 82031001 andhi r1, r3, #1 + 1f335dc: e58b80ac str r8, [fp, #172] ; 0xac + 1f335e0: e1a03000 mov r3, r0 + 1f335e4: e58b00a8 str r0, [fp, #168] ; 0xa8 + 1f335e8: eaffff4d b 1f33324 + 1f335ec: e28b4028 add r4, fp, #40 ; 0x28 + 1f335f0: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f335f4: e59b3010 ldr r3, [fp, #16] + 1f335f8: e1a01004 mov r1, r4 + 1f335fc: e59b001c ldr r0, [fp, #28] + 1f33600: e12fff33 blx r3 + 1f33604: e3500000 cmp r0, #0 + 1f33608: 01a02000 moveq r2, r0 + 1f3360c: 028b8029 addeq r8, fp, #41 ; 0x29 + 1f33610: 15db5028 ldrbne r5, [fp, #40] ; 0x28 + 1f33614: 01a03008 moveq r3, r8 + 1f33618: 10848000 addne r8, r4, r0 + 1f3361c: 128b3029 addne r3, fp, #41 ; 0x29 + 1f33620: 11a02005 movne r2, r5 + 1f33624: 058b0020 streq r0, [fp, #32] + 1f33628: 01a05002 moveq r5, r2 + 1f3362c: 05cb0028 strbeq r0, [fp, #40] ; 0x28 + 1f33630: e58b80ac str r8, [fp, #172] ; 0xac + 1f33634: e58d203c str r2, [sp, #60] ; 0x3c + 1f33638: e58b30a8 str r3, [fp, #168] ; 0xa8 + 1f3363c: eaffffa5 b 1f334d8 + 1f33640: e28b8028 add r8, fp, #40 ; 0x28 + 1f33644: e59b3010 ldr r3, [fp, #16] + 1f33648: e1a01008 mov r1, r8 + 1f3364c: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f33650: e59b001c ldr r0, [fp, #28] + 1f33654: e12fff33 blx r3 + 1f33658: e3500000 cmp r0, #0 + 1f3365c: 028b8029 addeq r8, fp, #41 ; 0x29 + 1f33660: 128b3029 addne r3, fp, #41 ; 0x29 + 1f33664: 01a03008 moveq r3, r8 + 1f33668: 10888000 addne r8, r8, r0 + 1f3366c: 058b0020 streq r0, [fp, #32] + 1f33670: 01a04000 moveq r4, r0 + 1f33674: 05cb0028 strbeq r0, [fp, #40] ; 0x28 + 1f33678: e1a02003 mov r2, r3 + 1f3367c: 15db4028 ldrbne r4, [fp, #40] ; 0x28 + 1f33680: e58b80ac str r8, [fp, #172] ; 0xac + 1f33684: e58b30a8 str r3, [fp, #168] ; 0xa8 + 1f33688: eaffffa2 b 1f33518 + 1f3368c: e59b3020 ldr r3, [fp, #32] + 1f33690: e3530000 cmp r3, #0 + 1f33694: 0a0001ce beq 1f33dd4 + 1f33698: e28b8028 add r8, fp, #40 ; 0x28 + 1f3369c: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f336a0: e1a01008 mov r1, r8 + 1f336a4: e59b3010 ldr r3, [fp, #16] + 1f336a8: e59b001c ldr r0, [fp, #28] + 1f336ac: e12fff33 blx r3 + 1f336b0: e3500000 cmp r0, #0 + 1f336b4: 028b8029 addeq r8, fp, #41 ; 0x29 + 1f336b8: 128b2029 addne r2, fp, #41 ; 0x29 + 1f336bc: 01a02008 moveq r2, r8 + 1f336c0: 10888000 addne r8, r8, r0 + 1f336c4: 058b4020 streq r4, [fp, #32] + 1f336c8: e1a03002 mov r3, r2 + 1f336cc: 05cb4028 strbeq r4, [fp, #40] ; 0x28 + 1f336d0: 15db4028 ldrbne r4, [fp, #40] ; 0x28 + 1f336d4: e58b80ac str r8, [fp, #172] ; 0xac + 1f336d8: e58b20a8 str r2, [fp, #168] ; 0xa8 + 1f336dc: eaffff94 b 1f33534 + 1f336e0: e59b3020 ldr r3, [fp, #32] + 1f336e4: e3530000 cmp r3, #0 + 1f336e8: 0a0001b9 beq 1f33dd4 + 1f336ec: e28b8028 add r8, fp, #40 ; 0x28 + 1f336f0: e59b3010 ldr r3, [fp, #16] + 1f336f4: e1a01008 mov r1, r8 + 1f336f8: e59b2024 ldr r2, [fp, #36] ; 0x24 + 1f336fc: e59b001c ldr r0, [fp, #28] + 1f33700: e12fff33 blx r3 + 1f33704: e3500000 cmp r0, #0 + 1f33708: 028b8029 addeq r8, fp, #41 ; 0x29 + 1f3370c: 128b3029 addne r3, fp, #41 ; 0x29 + 1f33710: 15db4028 ldrbne r4, [fp, #40] ; 0x28 + 1f33714: 01a03008 moveq r3, r8 + 1f33718: 10888000 addne r8, r8, r0 + 1f3371c: e58b30a8 str r3, [fp, #168] ; 0xa8 + 1f33720: 058b4020 streq r4, [fp, #32] + 1f33724: e1a03004 mov r3, r4 + 1f33728: 05cb4028 strbeq r4, [fp, #40] ; 0x28 + 1f3372c: e58b80ac str r8, [fp, #172] ; 0xac + 1f33730: e58d4044 str r4, [sp, #68] ; 0x44 + 1f33734: eaffff86 b 1f33554 + 1f33738: e59b30ac ldr r3, [fp, #172] ; 0xac + 1f3373c: e3a02001 mov r2, #1 + 1f33740: e58b30a8 str r3, [fp, #168] ; 0xa8 + 1f33744: e58d204c str r2, [sp, #76] ; 0x4c + 1f33748: eafffc2a b 1f327f8 + 1f3374c: e58b20a8 str r2, [fp, #168] ; 0xa8 + 1f33750: e0611008 rsb r1, r1, r8 + 1f33754: e3a02001 mov r2, #1 + 1f33758: e59b3014 ldr r3, [fp, #20] + 1f3375c: e58d204c str r2, [sp, #76] ; 0x4c + 1f33760: e59b001c ldr r0, [fp, #28] + 1f33764: e12fff33 blx r3 + 1f33768: eafffc22 b 1f327f8 + 1f3376c: e58b20a8 str r2, [fp, #168] ; 0xa8 + 1f33770: e0611008 rsb r1, r1, r8 + 1f33774: e59b3014 ldr r3, [fp, #20] + 1f33778: e59b001c ldr r0, [fp, #28] + 1f3377c: e12fff33 blx r3 + 1f33780: eafffc1c b 1f327f8 + 1f33784: e28b8029 add r8, fp, #41 ; 0x29 + 1f33788: e58b0020 str r0, [fp, #32] + 1f3378c: e5cb0028 strb r0, [fp, #40] ; 0x28 + 1f33790: e1a02000 mov r2, r0 + 1f33794: e3a01001 mov r1, #1 + 1f33798: e1a00008 mov r0, r8 + 1f3379c: eaffff8e b 1f335dc + 1f337a0: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f337a4: e1a0100a mov r1, sl + 1f337a8: e58d3010 str r3, [sp, #16] + 1f337ac: e59d3060 ldr r3, [sp, #96] ; 0x60 + 1f337b0: e58d300c str r3, [sp, #12] + 1f337b4: e59d2058 ldr r2, [sp, #88] ; 0x58 + 1f337b8: e491c00c ldr ip, [r1], #12 + 1f337bc: e59d305c ldr r3, [sp, #92] ; 0x5c + 1f337c0: e1a0000c mov r0, ip + 1f337c4: e59ce004 ldr lr, [ip, #4] + 1f337c8: e58de008 str lr, [sp, #8] + 1f337cc: e59cc000 ldr ip, [ip] + 1f337d0: e58dc004 str ip, [sp, #4] + 1f337d4: e59dc048 ldr ip, [sp, #72] ; 0x48 + 1f337d8: e58dc000 str ip, [sp] + 1f337dc: ebffe6a6 bl 1f2d27c + 1f337e0: e3500000 cmp r0, #0 + 1f337e4: 1a000022 bne 1f33874 + 1f337e8: e3a05000 mov r5, #0 + 1f337ec: eafffb63 b 1f32580 + 1f337f0: e3530000 cmp r3, #0 + 1f337f4: dafffeb7 ble 1f332d8 + 1f337f8: e3a05000 mov r5, #0 + 1f337fc: e28d4074 add r4, sp, #116 ; 0x74 + 1f33800: e1a0000b mov r0, fp + 1f33804: ebffdd3a bl 1f2acf4 + 1f33808: e59b2008 ldr r2, [fp, #8] + 1f3380c: e1a03085 lsl r3, r5, #1 + 1f33810: e2855001 add r5, r5, #1 + 1f33814: e1520005 cmp r2, r5 + 1f33818: e18400b3 strh r0, [r4, r3] + 1f3381c: cafffff7 bgt 1f33800 + 1f33820: eafffeac b 1f332d8 + 1f33824: e59b30a8 ldr r3, [fp, #168] ; 0xa8 + 1f33828: eafffdb3 b 1f32efc + 1f3382c: e59b30a8 ldr r3, [fp, #168] ; 0xa8 + 1f33830: eafffbee b 1f327f0 + 1f33834: e3520010 cmp r2, #16 + 1f33838: 0afffebc beq 1f33330 + 1f3383c: eafffe40 b 1f33144 + 1f33840: e1a05003 mov r5, r3 + 1f33844: e30a336c movw r3, #41836 ; 0xa36c + 1f33848: e340320d movt r3, #525 ; 0x20d + 1f3384c: e30120fc movw r2, #4348 ; 0x10fc + 1f33850: e34021f6 movt r2, #502 ; 0x1f6 + 1f33854: e5832000 str r2, [r3] + 1f33858: eafffb48 b 1f32580 + 1f3385c: e3a03000 mov r3, #0 + 1f33860: e58d301c str r3, [sp, #28] + 1f33864: eafffd05 b 1f32c80 + 1f33868: e59d301c ldr r3, [sp, #28] + 1f3386c: e59db06c ldr fp, [sp, #108] ; 0x6c + 1f33870: e58a300c str r3, [sl, #12] + 1f33874: e59d3054 ldr r3, [sp, #84] ; 0x54 + 1f33878: e3530000 cmp r3, #0 + 1f3387c: 0a00002e beq 1f3393c + 1f33880: e59a3010 ldr r3, [sl, #16] + 1f33884: e59b100c ldr r1, [fp, #12] + 1f33888: e3530010 cmp r3, #16 + 1f3388c: e59a3000 ldr r3, [sl] + 1f33890: e5932000 ldr r2, [r3] + 1f33894: 0a0000c9 beq 1f33bc0 + 1f33898: e3510002 cmp r1, #2 + 1f3389c: e5931004 ldr r1, [r3, #4] + 1f338a0: e59a300c ldr r3, [sl, #12] + 1f338a4: e0020291 mul r2, r1, r2 + 1f338a8: 0a000016 beq 1f33908 + 1f338ac: e3520000 cmp r2, #0 + 1f338b0: 0a000021 beq 1f3393c + 1f338b4: e3a01000 mov r1, #0 + 1f338b8: e2833004 add r3, r3, #4 + 1f338bc: e1a04001 mov r4, r1 + 1f338c0: e5dde070 ldrb lr, [sp, #112] ; 0x70 + 1f338c4: e5ddc071 ldrb ip, [sp, #113] ; 0x71 + 1f338c8: e5dd0072 ldrb r0, [sp, #114] ; 0x72 + 1f338cc: ea000002 b 1f338dc + 1f338d0: e1520001 cmp r2, r1 + 1f338d4: e2833004 add r3, r3, #4 + 1f338d8: 0a000017 beq 1f3393c + 1f338dc: e5535004 ldrb r5, [r3, #-4] + 1f338e0: e2811001 add r1, r1, #1 + 1f338e4: e155000e cmp r5, lr + 1f338e8: 1afffff8 bne 1f338d0 + 1f338ec: e5535003 ldrb r5, [r3, #-3] + 1f338f0: e155000c cmp r5, ip + 1f338f4: 1afffff5 bne 1f338d0 + 1f338f8: e5535002 ldrb r5, [r3, #-2] + 1f338fc: e1550000 cmp r5, r0 + 1f33900: 05434001 strbeq r4, [r3, #-1] + 1f33904: eafffff1 b 1f338d0 + 1f33908: e3520000 cmp r2, #0 + 1f3390c: 0a00000a beq 1f3393c + 1f33910: e5ddc070 ldrb ip, [sp, #112] ; 0x70 + 1f33914: e2833002 add r3, r3, #2 + 1f33918: e3a01000 mov r1, #0 + 1f3391c: e5530002 ldrb r0, [r3, #-2] + 1f33920: e2811001 add r1, r1, #1 + 1f33924: e2833002 add r3, r3, #2 + 1f33928: e050000c subs r0, r0, ip + 1f3392c: 13e00000 mvnne r0, #0 + 1f33930: e1520001 cmp r2, r1 + 1f33934: e5430003 strb r0, [r3, #-3] + 1f33938: 1afffff7 bne 1f3391c + 1f3393c: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f33940: e3530000 cmp r3, #0 + 1f33944: 0a000007 beq 1f33968 + 1f33948: e30a3368 movw r3, #41832 ; 0xa368 + 1f3394c: e340320d movt r3, #525 ; 0x20d + 1f33950: e5933000 ldr r3, [r3] + 1f33954: e3530000 cmp r3, #0 + 1f33958: 0a000002 beq 1f33968 + 1f3395c: e59b300c ldr r3, [fp, #12] + 1f33960: e3530002 cmp r3, #2 + 1f33964: ca0000f4 bgt 1f33d3c + 1f33968: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f3396c: e3530000 cmp r3, #0 + 1f33970: 0a000060 beq 1f33af8 + 1f33974: e1a06003 mov r6, r3 + 1f33978: e59d3040 ldr r3, [sp, #64] ; 0x40 + 1f3397c: e58b6008 str r6, [fp, #8] + 1f33980: e3530002 cmp r3, #2 + 1f33984: c58b300c strgt r3, [fp, #12] + 1f33988: c1a06003 movgt r6, r3 + 1f3398c: e59a3000 ldr r3, [sl] + 1f33990: d58b600c strle r6, [fp, #12] + 1f33994: e59a500c ldr r5, [sl, #12] + 1f33998: e8930018 ldm r3, {r3, r4} + 1f3399c: e0040493 mul r4, r3, r4 + 1f339a0: e3540000 cmp r4, #0 + 1f339a4: aa0000a2 bge 1f33c34 + 1f339a8: e30a336c movw r3, #41836 ; 0xa36c + 1f339ac: e340320d movt r3, #525 ; 0x20d + 1f339b0: e3002f90 movw r2, #3984 ; 0xf90 + 1f339b4: e34021f6 movt r2, #502 ; 0x1f6 + 1f339b8: e3a05000 mov r5, #0 + 1f339bc: e5832000 str r2, [r3] + 1f339c0: eafffaee b 1f32580 + 1f339c4: e30a336c movw r3, #41836 ; 0xa36c + 1f339c8: e340320d movt r3, #525 ; 0x20d + 1f339cc: e301200c movw r2, #4108 ; 0x100c + 1f339d0: e34021f6 movt r2, #502 ; 0x1f6 + 1f339d4: e3a05000 mov r5, #0 + 1f339d8: e5832000 str r2, [r3] + 1f339dc: eafffae7 b 1f32580 + 1f339e0: e1a02001 mov r2, r1 + 1f339e4: e59d1024 ldr r1, [sp, #36] ; 0x24 + 1f339e8: e2522003 subs r2, r2, #3 + 1f339ec: 13a02001 movne r2, #1 + 1f339f0: e3510000 cmp r1, #0 + 1f339f4: 13a02000 movne r2, #0 + 1f339f8: e3520000 cmp r2, #0 + 1f339fc: 1afffc75 bne 1f32bd8 + 1f33a00: eafffc6f b 1f32bc4 + 1f33a04: e30a336c movw r3, #41836 ; 0xa36c + 1f33a08: e340320d movt r3, #525 ; 0x20d + 1f33a0c: e3012080 movw r2, #4224 ; 0x1080 + 1f33a10: e34021f6 movt r2, #502 ; 0x1f6 + 1f33a14: e3a05000 mov r5, #0 + 1f33a18: e5832000 str r2, [r3] + 1f33a1c: eafffad7 b 1f32580 + 1f33a20: e30a336c movw r3, #41836 ; 0xa36c + 1f33a24: e340320d movt r3, #525 ; 0x20d + 1f33a28: e3012060 movw r2, #4192 ; 0x1060 + 1f33a2c: e34021f6 movt r2, #502 ; 0x1f6 + 1f33a30: e3a05000 mov r5, #0 + 1f33a34: e5832000 str r2, [r3] + 1f33a38: eafffad0 b 1f32580 + 1f33a3c: e1a05003 mov r5, r3 + 1f33a40: e30a336c movw r3, #41836 ; 0xa36c + 1f33a44: e340320d movt r3, #525 ; 0x20d + 1f33a48: e3002fec movw r2, #4076 ; 0xfec + 1f33a4c: e34021f6 movt r2, #502 ; 0x1f6 + 1f33a50: e5832000 str r2, [r3] + 1f33a54: eafffac9 b 1f32580 + 1f33a58: e30a336c movw r3, #41836 ; 0xa36c + 1f33a5c: e340320d movt r3, #525 ; 0x20d + 1f33a60: e30120b0 movw r2, #4272 ; 0x10b0 + 1f33a64: e34021f6 movt r2, #502 ; 0x1f6 + 1f33a68: e3a05000 mov r5, #0 + 1f33a6c: e5832000 str r2, [r3] + 1f33a70: eafffac2 b 1f32580 + 1f33a74: e30a336c movw r3, #41836 ; 0xa36c + 1f33a78: e340320d movt r3, #525 ; 0x20d + 1f33a7c: e30120c0 movw r2, #4288 ; 0x10c0 + 1f33a80: e34021f6 movt r2, #502 ; 0x1f6 + 1f33a84: e59d501c ldr r5, [sp, #28] + 1f33a88: e5832000 str r2, [r3] + 1f33a8c: eafffabb b 1f32580 + 1f33a90: e30a336c movw r3, #41836 ; 0xa36c + 1f33a94: e340320d movt r3, #525 ; 0x20d + 1f33a98: e3012090 movw r2, #4240 ; 0x1090 + 1f33a9c: e34021f6 movt r2, #502 ; 0x1f6 + 1f33aa0: e59d501c ldr r5, [sp, #28] + 1f33aa4: e5832000 str r2, [r3] + 1f33aa8: eafffab4 b 1f32580 + 1f33aac: e59d04e4 ldr r0, [sp, #1252] ; 0x4e4 + 1f33ab0: eb002ab4 bl 1f3e588 + 1f33ab4: e3a05000 mov r5, #0 + 1f33ab8: e58a5008 str r5, [sl, #8] + 1f33abc: eafffaaf b 1f32580 + 1f33ac0: e30a336c movw r3, #41836 ; 0xa36c + 1f33ac4: e340320d movt r3, #525 ; 0x20d + 1f33ac8: e3012024 movw r2, #4132 ; 0x1024 + 1f33acc: e34021f6 movt r2, #502 ; 0x1f6 + 1f33ad0: e3a05000 mov r5, #0 + 1f33ad4: e5832000 str r2, [r3] + 1f33ad8: eafffaa8 b 1f32580 + 1f33adc: e30a336c movw r3, #41836 ; 0xa36c + 1f33ae0: e340320d movt r3, #525 ; 0x20d + 1f33ae4: e3012034 movw r2, #4148 ; 0x1034 + 1f33ae8: e34021f6 movt r2, #502 ; 0x1f6 + 1f33aec: e3a05000 mov r5, #0 + 1f33af0: e5832000 str r2, [r3] + 1f33af4: eafffaa1 b 1f32580 + 1f33af8: e59d3054 ldr r3, [sp, #84] ; 0x54 + 1f33afc: e3530000 cmp r3, #0 + 1f33b00: 159b3008 ldrne r3, [fp, #8] + 1f33b04: 12833001 addne r3, r3, #1 + 1f33b08: 158b3008 strne r3, [fp, #8] + 1f33b0c: e59a0008 ldr r0, [sl, #8] + 1f33b10: e3a05001 mov r5, #1 + 1f33b14: eb002a9b bl 1f3e588 + 1f33b18: e3a03000 mov r3, #0 + 1f33b1c: e58a3008 str r3, [sl, #8] + 1f33b20: eafffa96 b 1f32580 + 1f33b24: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f33b28: e3a05001 mov r5, #1 + 1f33b2c: e58b3008 str r3, [fp, #8] + 1f33b30: eafffa92 b 1f32580 + 1f33b34: e30a336c movw r3, #41836 ; 0xa36c + 1f33b38: e340320d movt r3, #525 ; 0x20d + 1f33b3c: e3002ffc movw r2, #4092 ; 0xffc + 1f33b40: e34021f6 movt r2, #502 ; 0x1f6 + 1f33b44: e3a05000 mov r5, #0 + 1f33b48: e5832000 str r2, [r3] + 1f33b4c: eafffa8b b 1f32580 + 1f33b50: e1a05003 mov r5, r3 + 1f33b54: e30a236c movw r2, #41836 ; 0xa36c + 1f33b58: e340220d movt r2, #525 ; 0x20d + 1f33b5c: e30533b0 movw r3, #21424 ; 0x53b0 + 1f33b60: e34031f6 movt r3, #502 ; 0x1f6 + 1f33b64: e1a0cc20 lsr ip, r0, #24 + 1f33b68: e1a01820 lsr r1, r0, #16 + 1f33b6c: e5823000 str r3, [r2] + 1f33b70: e5c30003 strb r0, [r3, #3] + 1f33b74: e1a00420 lsr r0, r0, #8 + 1f33b78: e5c3c000 strb ip, [r3] + 1f33b7c: e5c31001 strb r1, [r3, #1] + 1f33b80: e5c30002 strb r0, [r3, #2] + 1f33b84: eafffa7d b 1f32580 + 1f33b88: e3a03004 mov r3, #4 + 1f33b8c: e3a05001 mov r5, #1 + 1f33b90: e58b3008 str r3, [fp, #8] + 1f33b94: eafffa79 b 1f32580 + 1f33b98: e1a05000 mov r5, r0 + 1f33b9c: e59d001c ldr r0, [sp, #28] + 1f33ba0: eb002a78 bl 1f3e588 + 1f33ba4: eafffa75 b 1f32580 + 1f33ba8: e30a336c movw r3, #41836 ; 0xa36c + 1f33bac: e340320d movt r3, #525 ; 0x20d + 1f33bb0: e30120a0 movw r2, #4256 ; 0x10a0 + 1f33bb4: e34021f6 movt r2, #502 ; 0x1f6 + 1f33bb8: e5832000 str r2, [r3] + 1f33bbc: eafffa6f b 1f32580 + 1f33bc0: e3510002 cmp r1, #2 + 1f33bc4: e5931004 ldr r1, [r3, #4] + 1f33bc8: e59a300c ldr r3, [sl, #12] + 1f33bcc: e0020291 mul r2, r1, r2 + 1f33bd0: 0a000071 beq 1f33d9c + 1f33bd4: e3520000 cmp r2, #0 + 1f33bd8: 0affff57 beq 1f3393c + 1f33bdc: e28d0074 add r0, sp, #116 ; 0x74 + 1f33be0: e3a01000 mov r1, #0 + 1f33be4: e2833008 add r3, r3, #8 + 1f33be8: e1a04001 mov r4, r1 + 1f33bec: e1dde7b4 ldrh lr, [sp, #116] ; 0x74 + 1f33bf0: e1ddc7b6 ldrh ip, [sp, #118] ; 0x76 + 1f33bf4: e1d000b4 ldrh r0, [r0, #4] + 1f33bf8: ea000002 b 1f33c08 + 1f33bfc: e1520001 cmp r2, r1 + 1f33c00: e2833008 add r3, r3, #8 + 1f33c04: 0affff4c beq 1f3393c + 1f33c08: e15350b8 ldrh r5, [r3, #-8] + 1f33c0c: e2811001 add r1, r1, #1 + 1f33c10: e155000e cmp r5, lr + 1f33c14: 1afffff8 bne 1f33bfc + 1f33c18: e15350b6 ldrh r5, [r3, #-6] + 1f33c1c: e155000c cmp r5, ip + 1f33c20: 1afffff5 bne 1f33bfc + 1f33c24: e15350b4 ldrh r5, [r3, #-4] + 1f33c28: e1550000 cmp r5, r0 + 1f33c2c: 014340b2 strheq r4, [r3, #-2] + 1f33c30: eafffff1 b 1f33bfc + 1f33c34: e3e03102 mvn r3, #-2147483648 ; 0x80000000 + 1f33c38: e713f613 sdiv r3, r3, r6 + 1f33c3c: e1530004 cmp r3, r4 + 1f33c40: baffff58 blt 1f339a8 + 1f33c44: e0000694 mul r0, r4, r6 + 1f33c48: eb002a46 bl 1f3e568 + 1f33c4c: e2507000 subs r7, r0, #0 + 1f33c50: 0affff54 beq 1f339a8 + 1f33c54: e3560003 cmp r6, #3 + 1f33c58: 0a00001b beq 1f33ccc + 1f33c5c: e3540000 cmp r4, #0 + 1f33c60: 0a000015 beq 1f33cbc + 1f33c64: e2872004 add r2, r7, #4 + 1f33c68: e0854004 add r4, r5, r4 + 1f33c6c: e28d30d0 add r3, sp, #208 ; 0xd0 + 1f33c70: e3a00004 mov r0, #4 + 1f33c74: e3a06001 mov r6, #1 + 1f33c78: e3a0e002 mov lr, #2 + 1f33c7c: e3a0c003 mov ip, #3 + 1f33c80: e4d51001 ldrb r1, [r5], #1 + 1f33c84: e2822004 add r2, r2, #4 + 1f33c88: e1550004 cmp r5, r4 + 1f33c8c: e10b6180 smlabb fp, r0, r1, r6 + 1f33c90: e109e180 smlabb r9, r0, r1, lr + 1f33c94: e108c180 smlabb r8, r0, r1, ip + 1f33c98: e7d3b00b ldrb fp, [r3, fp] + 1f33c9c: e7d39009 ldrb r9, [r3, r9] + 1f33ca0: e7d38008 ldrb r8, [r3, r8] + 1f33ca4: e7d31101 ldrb r1, [r3, r1, lsl #2] + 1f33ca8: e542b007 strb fp, [r2, #-7] + 1f33cac: e5429006 strb r9, [r2, #-6] + 1f33cb0: e5428005 strb r8, [r2, #-5] + 1f33cb4: e5421008 strb r1, [r2, #-8] + 1f33cb8: 1afffff0 bne 1f33c80 + 1f33cbc: e59a000c ldr r0, [sl, #12] + 1f33cc0: eb002a30 bl 1f3e588 + 1f33cc4: e58a700c str r7, [sl, #12] + 1f33cc8: eaffff8f b 1f33b0c + 1f33ccc: e3540000 cmp r4, #0 + 1f33cd0: 0afffff9 beq 1f33cbc + 1f33cd4: e2872003 add r2, r7, #3 + 1f33cd8: e0854004 add r4, r5, r4 + 1f33cdc: e28d30d0 add r3, sp, #208 ; 0xd0 + 1f33ce0: e3a00004 mov r0, #4 + 1f33ce4: e3a0e001 mov lr, #1 + 1f33ce8: e3a0c002 mov ip, #2 + 1f33cec: e4d51001 ldrb r1, [r5], #1 + 1f33cf0: e2822003 add r2, r2, #3 + 1f33cf4: e1550004 cmp r5, r4 + 1f33cf8: e108e180 smlabb r8, r0, r1, lr + 1f33cfc: e106c180 smlabb r6, r0, r1, ip + 1f33d00: e7d31101 ldrb r1, [r3, r1, lsl #2] + 1f33d04: e7d38008 ldrb r8, [r3, r8] + 1f33d08: e7d36006 ldrb r6, [r3, r6] + 1f33d0c: e5428005 strb r8, [r2, #-5] + 1f33d10: e5426004 strb r6, [r2, #-4] + 1f33d14: e5421006 strb r1, [r2, #-6] + 1f33d18: 1afffff3 bne 1f33cec + 1f33d1c: eaffffe6 b 1f33cbc + 1f33d20: e1a05003 mov r5, r3 + 1f33d24: e30a336c movw r3, #41836 ; 0xa36c + 1f33d28: e340320d movt r3, #525 ; 0x20d + 1f33d2c: e30120dc movw r2, #4316 ; 0x10dc + 1f33d30: e34021f6 movt r2, #502 ; 0x1f6 + 1f33d34: e5832000 str r2, [r3] + 1f33d38: eafffa10 b 1f32580 + 1f33d3c: e59a2000 ldr r2, [sl] + 1f33d40: e59a300c ldr r3, [sl, #12] + 1f33d44: e592000c ldr r0, [r2, #12] + 1f33d48: e8920006 ldm r2, {r1, r2} + 1f33d4c: e3500003 cmp r0, #3 + 1f33d50: e0010192 mul r1, r2, r1 + 1f33d54: 0a00003d beq 1f33e50 + 1f33d58: e30a2364 movw r2, #41828 ; 0xa364 + 1f33d5c: e340220d movt r2, #525 ; 0x20d + 1f33d60: e5922000 ldr r2, [r2] + 1f33d64: e3520000 cmp r2, #0 + 1f33d68: 1a00001b bne 1f33ddc + 1f33d6c: e3510000 cmp r1, #0 + 1f33d70: 12833004 addne r3, r3, #4 + 1f33d74: 0afffefb beq 1f33968 + 1f33d78: e2822001 add r2, r2, #1 + 1f33d7c: e5530004 ldrb r0, [r3, #-4] + 1f33d80: e1510002 cmp r1, r2 + 1f33d84: e553c002 ldrb ip, [r3, #-2] + 1f33d88: e543c004 strb ip, [r3, #-4] + 1f33d8c: e2833004 add r3, r3, #4 + 1f33d90: e5430006 strb r0, [r3, #-6] + 1f33d94: 1afffff7 bne 1f33d78 + 1f33d98: eafffef2 b 1f33968 + 1f33d9c: e3520000 cmp r2, #0 + 1f33da0: 0afffee5 beq 1f3393c + 1f33da4: e1ddc7b4 ldrh ip, [sp, #116] ; 0x74 + 1f33da8: e2833004 add r3, r3, #4 + 1f33dac: e3a01000 mov r1, #0 + 1f33db0: e15300b4 ldrh r0, [r3, #-4] + 1f33db4: e2811001 add r1, r1, #1 + 1f33db8: e2833004 add r3, r3, #4 + 1f33dbc: e050000c subs r0, r0, ip + 1f33dc0: 13e00000 mvnne r0, #0 + 1f33dc4: e1520001 cmp r2, r1 + 1f33dc8: e14300b6 strh r0, [r3, #-6] + 1f33dcc: 1afffff7 bne 1f33db0 + 1f33dd0: eafffed9 b 1f3393c + 1f33dd4: e58d4044 str r4, [sp, #68] ; 0x44 + 1f33dd8: eafffd61 b 1f33364 + 1f33ddc: e3510000 cmp r1, #0 + 1f33de0: 0afffee0 beq 1f33968 + 1f33de4: e2833004 add r3, r3, #4 + 1f33de8: e3a05000 mov r5, #0 + 1f33dec: e3a040ff mov r4, #255 ; 0xff + 1f33df0: e553e001 ldrb lr, [r3, #-1] + 1f33df4: e5530004 ldrb r0, [r3, #-4] + 1f33df8: e35e0000 cmp lr, #0 + 1f33dfc: e5532002 ldrb r2, [r3, #-2] + 1f33e00: e1a060ae lsr r6, lr, #1 + 1f33e04: e1a07000 mov r7, r0 + 1f33e08: 0a000009 beq 1f33e34 + 1f33e0c: e1006084 smlabb r0, r4, r0, r6 + 1f33e10: e1026284 smlabb r2, r4, r2, r6 + 1f33e14: e553c003 ldrb ip, [r3, #-3] + 1f33e18: e710fe10 sdiv r0, r0, lr + 1f33e1c: e10c6c84 smlabb ip, r4, ip, r6 + 1f33e20: e712fe12 sdiv r2, r2, lr + 1f33e24: e6ef7070 uxtb r7, r0 + 1f33e28: e71cfe1c sdiv ip, ip, lr + 1f33e2c: e6ef2072 uxtb r2, r2 + 1f33e30: e543c003 strb ip, [r3, #-3] + 1f33e34: e2855001 add r5, r5, #1 + 1f33e38: e5437002 strb r7, [r3, #-2] + 1f33e3c: e1510005 cmp r1, r5 + 1f33e40: e5432004 strb r2, [r3, #-4] + 1f33e44: e2833004 add r3, r3, #4 + 1f33e48: 1affffe8 bne 1f33df0 + 1f33e4c: eafffec5 b 1f33968 + 1f33e50: e3510000 cmp r1, #0 + 1f33e54: 0afffec3 beq 1f33968 + 1f33e58: e2811001 add r1, r1, #1 + 1f33e5c: e2832003 add r2, r3, #3 + 1f33e60: e0811081 add r1, r1, r1, lsl #1 + 1f33e64: e0833001 add r3, r3, r1 + 1f33e68: e5521003 ldrb r1, [r2, #-3] + 1f33e6c: e2822003 add r2, r2, #3 + 1f33e70: e5520004 ldrb r0, [r2, #-4] + 1f33e74: e5420006 strb r0, [r2, #-6] + 1f33e78: e5421004 strb r1, [r2, #-4] + 1f33e7c: e1520003 cmp r2, r3 + 1f33e80: 1afffff8 bne 1f33e68 + 1f33e84: eafffeb7 b 1f33968 + +01f33e88 : + 1f33e88: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f33e8c: e1a06001 mov r6, r1 + 1f33e90: e1a07002 mov r7, r2 + 1f33e94: e59010ac ldr r1, [r0, #172] ; 0xac + 1f33e98: e1a04000 mov r4, r0 + 1f33e9c: e59020a8 ldr r2, [r0, #168] ; 0xa8 + 1f33ea0: e1a08003 mov r8, r3 + 1f33ea4: e1520001 cmp r2, r1 + 1f33ea8: 3a000035 bcc 1f33f84 + 1f33eac: e5903020 ldr r3, [r0, #32] + 1f33eb0: e3530000 cmp r3, #0 + 1f33eb4: 1a000006 bne 1f33ed4 + 1f33eb8: e30a336c movw r3, #41836 ; 0xa36c + 1f33ebc: e340320d movt r3, #525 ; 0x20d + 1f33ec0: e3012104 movw r2, #4356 ; 0x1104 + 1f33ec4: e34021f6 movt r2, #502 ; 0x1f6 + 1f33ec8: e3a00000 mov r0, #0 + 1f33ecc: e5832000 str r2, [r3] + 1f33ed0: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f33ed4: e2805028 add r5, r0, #40 ; 0x28 + 1f33ed8: e5902024 ldr r2, [r0, #36] ; 0x24 + 1f33edc: e5903010 ldr r3, [r0, #16] + 1f33ee0: e1a01005 mov r1, r5 + 1f33ee4: e590001c ldr r0, [r0, #28] + 1f33ee8: e12fff33 blx r3 + 1f33eec: e3500000 cmp r0, #0 + 1f33ef0: 02842029 addeq r2, r4, #41 ; 0x29 + 1f33ef4: 12842029 addne r2, r4, #41 ; 0x29 + 1f33ef8: 15d43028 ldrbne r3, [r4, #40] ; 0x28 + 1f33efc: 10851000 addne r1, r5, r0 + 1f33f00: 05840020 streq r0, [r4, #32] + 1f33f04: 01a03000 moveq r3, r0 + 1f33f08: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f33f0c: 01a01002 moveq r1, r2 + 1f33f10: e1a00002 mov r0, r2 + 1f33f14: e58410ac str r1, [r4, #172] ; 0xac + 1f33f18: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f33f1c: e3530047 cmp r3, #71 ; 0x47 + 1f33f20: 1affffe4 bne 1f33eb8 + 1f33f24: e1500001 cmp r0, r1 + 1f33f28: 3a000019 bcc 1f33f94 + 1f33f2c: e5943020 ldr r3, [r4, #32] + 1f33f30: e3530000 cmp r3, #0 + 1f33f34: 0affffdf beq 1f33eb8 + 1f33f38: e2845028 add r5, r4, #40 ; 0x28 + 1f33f3c: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f33f40: e1a01005 mov r1, r5 + 1f33f44: e5943010 ldr r3, [r4, #16] + 1f33f48: e594001c ldr r0, [r4, #28] + 1f33f4c: e12fff33 blx r3 + 1f33f50: e3500000 cmp r0, #0 + 1f33f54: 02841029 addeq r1, r4, #41 ; 0x29 + 1f33f58: 12842029 addne r2, r4, #41 ; 0x29 + 1f33f5c: 01a02001 moveq r2, r1 + 1f33f60: 10851000 addne r1, r5, r0 + 1f33f64: 05840020 streq r0, [r4, #32] + 1f33f68: 01a03000 moveq r3, r0 + 1f33f6c: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f33f70: e1a0c002 mov ip, r2 + 1f33f74: 15d43028 ldrbne r3, [r4, #40] ; 0x28 + 1f33f78: e58410ac str r1, [r4, #172] ; 0xac + 1f33f7c: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f33f80: ea000006 b 1f33fa0 + 1f33f84: e2820001 add r0, r2, #1 + 1f33f88: e58400a8 str r0, [r4, #168] ; 0xa8 + 1f33f8c: e5d23000 ldrb r3, [r2] + 1f33f90: eaffffe1 b 1f33f1c + 1f33f94: e280c001 add ip, r0, #1 + 1f33f98: e584c0a8 str ip, [r4, #168] ; 0xa8 + 1f33f9c: e5d03000 ldrb r3, [r0] + 1f33fa0: e3530049 cmp r3, #73 ; 0x49 + 1f33fa4: 1affffc3 bne 1f33eb8 + 1f33fa8: e15c0001 cmp ip, r1 + 1f33fac: 3a0000b3 bcc 1f34280 + 1f33fb0: e5943020 ldr r3, [r4, #32] + 1f33fb4: e3530000 cmp r3, #0 + 1f33fb8: 0affffbe beq 1f33eb8 + 1f33fbc: e2845028 add r5, r4, #40 ; 0x28 + 1f33fc0: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f33fc4: e1a01005 mov r1, r5 + 1f33fc8: e5943010 ldr r3, [r4, #16] + 1f33fcc: e594001c ldr r0, [r4, #28] + 1f33fd0: e12fff33 blx r3 + 1f33fd4: e3500000 cmp r0, #0 + 1f33fd8: 02841029 addeq r1, r4, #41 ; 0x29 + 1f33fdc: 12842029 addne r2, r4, #41 ; 0x29 + 1f33fe0: 01a02001 moveq r2, r1 + 1f33fe4: 15d4c028 ldrbne ip, [r4, #40] ; 0x28 + 1f33fe8: 10851000 addne r1, r5, r0 + 1f33fec: 05840020 streq r0, [r4, #32] + 1f33ff0: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f33ff4: 01a0c000 moveq ip, r0 + 1f33ff8: e58410ac str r1, [r4, #172] ; 0xac + 1f33ffc: e1a03002 mov r3, r2 + 1f34000: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f34004: e35c0046 cmp ip, #70 ; 0x46 + 1f34008: 1affffaa bne 1f33eb8 + 1f3400c: e1510003 cmp r1, r3 + 1f34010: 8a0000cd bhi 1f3434c + 1f34014: e5943020 ldr r3, [r4, #32] + 1f34018: e3530000 cmp r3, #0 + 1f3401c: 0affffa5 beq 1f33eb8 + 1f34020: e2845028 add r5, r4, #40 ; 0x28 + 1f34024: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f34028: e1a01005 mov r1, r5 + 1f3402c: e5943010 ldr r3, [r4, #16] + 1f34030: e594001c ldr r0, [r4, #28] + 1f34034: e12fff33 blx r3 + 1f34038: e3500000 cmp r0, #0 + 1f3403c: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f34040: 02842029 addeq r2, r4, #41 ; 0x29 + 1f34044: 01a05002 moveq r5, r2 + 1f34048: 10855000 addne r5, r5, r0 + 1f3404c: e5d43028 ldrb r3, [r4, #40] ; 0x28 + 1f34050: 12842029 addne r2, r4, #41 ; 0x29 + 1f34054: 05840020 streq r0, [r4, #32] + 1f34058: e58450ac str r5, [r4, #172] ; 0xac + 1f3405c: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f34060: e3530038 cmp r3, #56 ; 0x38 + 1f34064: 1affff93 bne 1f33eb8 + 1f34068: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f3406c: e59410ac ldr r1, [r4, #172] ; 0xac + 1f34070: e1530001 cmp r3, r1 + 1f34074: 3a000065 bcc 1f34210 + 1f34078: e5943020 ldr r3, [r4, #32] + 1f3407c: e3530000 cmp r3, #0 + 1f34080: 0affff8c beq 1f33eb8 + 1f34084: e2845028 add r5, r4, #40 ; 0x28 + 1f34088: e5943010 ldr r3, [r4, #16] + 1f3408c: e1a01005 mov r1, r5 + 1f34090: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f34094: e594001c ldr r0, [r4, #28] + 1f34098: e12fff33 blx r3 + 1f3409c: e3500000 cmp r0, #0 + 1f340a0: 02841029 addeq r1, r4, #41 ; 0x29 + 1f340a4: 10851000 addne r1, r5, r0 + 1f340a8: 15d43028 ldrbne r3, [r4, #40] ; 0x28 + 1f340ac: 12840029 addne r0, r4, #41 ; 0x29 + 1f340b0: 05840020 streq r0, [r4, #32] + 1f340b4: 03a050c9 moveq r5, #201 ; 0xc9 + 1f340b8: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f340bc: 12433037 subne r3, r3, #55 ; 0x37 + 1f340c0: 01a00001 moveq r0, r1 + 1f340c4: 120350fd andne r5, r3, #253 ; 0xfd + 1f340c8: e58410ac str r1, [r4, #172] ; 0xac + 1f340cc: e1a02000 mov r2, r0 + 1f340d0: e58400a8 str r0, [r4, #168] ; 0xa8 + 1f340d4: e3550000 cmp r5, #0 + 1f340d8: 1affff76 bne 1f33eb8 + 1f340dc: e1520001 cmp r2, r1 + 1f340e0: 3a000050 bcc 1f34228 + 1f340e4: e5943020 ldr r3, [r4, #32] + 1f340e8: e3530000 cmp r3, #0 + 1f340ec: 0affff71 beq 1f33eb8 + 1f340f0: e2849028 add r9, r4, #40 ; 0x28 + 1f340f4: e5943010 ldr r3, [r4, #16] + 1f340f8: e1a01009 mov r1, r9 + 1f340fc: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f34100: e594001c ldr r0, [r4, #28] + 1f34104: e12fff33 blx r3 + 1f34108: e3500000 cmp r0, #0 + 1f3410c: 02849029 addeq r9, r4, #41 ; 0x29 + 1f34110: 10899000 addne r9, r9, r0 + 1f34114: 15d45028 ldrbne r5, [r4, #40] ; 0x28 + 1f34118: 01a03009 moveq r3, r9 + 1f3411c: 12843029 addne r3, r4, #41 ; 0x29 + 1f34120: 05845020 streq r5, [r4, #32] + 1f34124: 05c45028 strbeq r5, [r4, #40] ; 0x28 + 1f34128: e58490ac str r9, [r4, #172] ; 0xac + 1f3412c: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f34130: e3550061 cmp r5, #97 ; 0x61 + 1f34134: 1affff5f bne 1f33eb8 + 1f34138: e30a336c movw r3, #41836 ; 0xa36c + 1f3413c: e340320d movt r3, #525 ; 0x20d + 1f34140: e1a00004 mov r0, r4 + 1f34144: e30f283c movw r2, #63548 ; 0xf83c + 1f34148: e34021f5 movt r2, #501 ; 0x1f5 + 1f3414c: e5832000 str r2, [r3] + 1f34150: ebffdaa6 bl 1f2abf0 + 1f34154: e5860000 str r0, [r6] + 1f34158: e1a00004 mov r0, r4 + 1f3415c: ebffdaa3 bl 1f2abf0 + 1f34160: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f34164: e59420ac ldr r2, [r4, #172] ; 0xac + 1f34168: e5860004 str r0, [r6, #4] + 1f3416c: e1530002 cmp r3, r2 + 1f34170: 3a000030 bcc 1f34238 + 1f34174: e5943020 ldr r3, [r4, #32] + 1f34178: e3530000 cmp r3, #0 + 1f3417c: 05863010 streq r3, [r6, #16] + 1f34180: 1a000042 bne 1f34290 + 1f34184: e3530000 cmp r3, #0 + 1f34188: 05863014 streq r3, [r6, #20] + 1f3418c: 1a000052 bne 1f342dc + 1f34190: e3530000 cmp r3, #0 + 1f34194: 0a000010 beq 1f341dc + 1f34198: e2845028 add r5, r4, #40 ; 0x28 + 1f3419c: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f341a0: e5943010 ldr r3, [r4, #16] + 1f341a4: e1a01005 mov r1, r5 + 1f341a8: e594001c ldr r0, [r4, #28] + 1f341ac: e12fff33 blx r3 + 1f341b0: e3500000 cmp r0, #0 + 1f341b4: 02845029 addeq r5, r4, #41 ; 0x29 + 1f341b8: 10855000 addne r5, r5, r0 + 1f341bc: 15d43028 ldrbne r3, [r4, #40] ; 0x28 + 1f341c0: 01a02005 moveq r2, r5 + 1f341c4: 12842029 addne r2, r4, #41 ; 0x29 + 1f341c8: 05840020 streq r0, [r4, #32] + 1f341cc: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f341d0: 01a03000 moveq r3, r0 + 1f341d4: e58450ac str r5, [r4, #172] ; 0xac + 1f341d8: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f341dc: e3570000 cmp r7, #0 + 1f341e0: e5863018 str r3, [r6, #24] + 1f341e4: e3e03000 mvn r3, #0 + 1f341e8: e586301c str r3, [r6, #28] + 1f341ec: 13a03004 movne r3, #4 + 1f341f0: 15873000 strne r3, [r7] + 1f341f4: e3580000 cmp r8, #0 + 1f341f8: 1a000002 bne 1f34208 + 1f341fc: e5963010 ldr r3, [r6, #16] + 1f34200: e3130080 tst r3, #128 ; 0x80 + 1f34204: 1a000047 bne 1f34328 + 1f34208: e3a00001 mov r0, #1 + 1f3420c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f34210: e2832001 add r2, r3, #1 + 1f34214: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f34218: e5d33000 ldrb r3, [r3] + 1f3421c: e2433037 sub r3, r3, #55 ; 0x37 + 1f34220: e20350fd and r5, r3, #253 ; 0xfd + 1f34224: eaffffaa b 1f340d4 + 1f34228: e2823001 add r3, r2, #1 + 1f3422c: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f34230: e5d25000 ldrb r5, [r2] + 1f34234: eaffffbd b 1f34130 + 1f34238: e2831001 add r1, r3, #1 + 1f3423c: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f34240: e5d33000 ldrb r3, [r3] + 1f34244: e1510002 cmp r1, r2 + 1f34248: e5863010 str r3, [r6, #16] + 1f3424c: 25943020 ldrcs r3, [r4, #32] + 1f34250: 2affffcb bcs 1f34184 + 1f34254: e2813001 add r3, r1, #1 + 1f34258: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f3425c: e5d11000 ldrb r1, [r1] + 1f34260: e1520003 cmp r2, r3 + 1f34264: e5861014 str r1, [r6, #20] + 1f34268: 95943020 ldrls r3, [r4, #32] + 1f3426c: 9affffc7 bls 1f34190 + 1f34270: e2832001 add r2, r3, #1 + 1f34274: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f34278: e5d33000 ldrb r3, [r3] + 1f3427c: eaffffd6 b 1f341dc + 1f34280: e28c3001 add r3, ip, #1 + 1f34284: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f34288: e5dcc000 ldrb ip, [ip] + 1f3428c: eaffff5c b 1f34004 + 1f34290: e2845028 add r5, r4, #40 ; 0x28 + 1f34294: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f34298: e5943010 ldr r3, [r4, #16] + 1f3429c: e1a01005 mov r1, r5 + 1f342a0: e594001c ldr r0, [r4, #28] + 1f342a4: e12fff33 blx r3 + 1f342a8: e3500000 cmp r0, #0 + 1f342ac: 02842029 addeq r2, r4, #41 ; 0x29 + 1f342b0: 10852000 addne r2, r5, r0 + 1f342b4: 05840020 streq r0, [r4, #32] + 1f342b8: 12840029 addne r0, r4, #41 ; 0x29 + 1f342bc: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f342c0: 01a03000 moveq r3, r0 + 1f342c4: 01a00002 moveq r0, r2 + 1f342c8: 15d43028 ldrbne r3, [r4, #40] ; 0x28 + 1f342cc: e58420ac str r2, [r4, #172] ; 0xac + 1f342d0: e1a01000 mov r1, r0 + 1f342d4: e58400a8 str r0, [r4, #168] ; 0xa8 + 1f342d8: eaffffd9 b 1f34244 + 1f342dc: e2845028 add r5, r4, #40 ; 0x28 + 1f342e0: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f342e4: e1a01005 mov r1, r5 + 1f342e8: e5943010 ldr r3, [r4, #16] + 1f342ec: e594001c ldr r0, [r4, #28] + 1f342f0: e12fff33 blx r3 + 1f342f4: e3500000 cmp r0, #0 + 1f342f8: 02842029 addeq r2, r4, #41 ; 0x29 + 1f342fc: 10852000 addne r2, r5, r0 + 1f34300: 05840020 streq r0, [r4, #32] + 1f34304: 12840029 addne r0, r4, #41 ; 0x29 + 1f34308: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f3430c: 01a01000 moveq r1, r0 + 1f34310: 01a00002 moveq r0, r2 + 1f34314: 15d41028 ldrbne r1, [r4, #40] ; 0x28 + 1f34318: e58420ac str r2, [r4, #172] ; 0xac + 1f3431c: e1a03000 mov r3, r0 + 1f34320: e58400a8 str r0, [r4, #168] ; 0xa8 + 1f34324: eaffffcd b 1f34260 + 1f34328: e2033007 and r3, r3, #7 + 1f3432c: e3a02002 mov r2, #2 + 1f34330: e1a00004 mov r0, r4 + 1f34334: e2861028 add r1, r6, #40 ; 0x28 + 1f34338: e1a02312 lsl r2, r2, r3 + 1f3433c: e3e03000 mvn r3, #0 + 1f34340: ebffce52 bl 1f27c90 + 1f34344: e3a00001 mov r0, #1 + 1f34348: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3434c: e2832001 add r2, r3, #1 + 1f34350: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f34354: e5d33000 ldrb r3, [r3] + 1f34358: eaffff40 b 1f34060 + +01f3435c : + 1f3435c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f34360: e1a04000 mov r4, r0 + 1f34364: e1a06003 mov r6, r3 + 1f34368: ed2d8b10 vpush {d8-d15} + 1f3436c: e24ddf93 sub sp, sp, #588 ; 0x24c + 1f34370: e59d52b4 ldr r5, [sp, #692] ; 0x2b4 + 1f34374: e58d1018 str r1, [sp, #24] + 1f34378: e3a01000 mov r1, #0 + 1f3437c: e58d201c str r2, [sp, #28] + 1f34380: e1a00005 mov r0, r5 + 1f34384: e3a0200c mov r2, #12 + 1f34388: eb002b23 bl 1f3f01c + 1f3438c: e59410a8 ldr r1, [r4, #168] ; 0xa8 + 1f34390: e59430ac ldr r3, [r4, #172] ; 0xac + 1f34394: e3a02000 mov r2, #0 + 1f34398: e3a00008 mov r0, #8 + 1f3439c: e5852008 str r2, [r5, #8] + 1f343a0: e1510003 cmp r1, r3 + 1f343a4: e5850000 str r0, [r5] + 1f343a8: e5852004 str r2, [r5, #4] + 1f343ac: 3a000036 bcc 1f3448c + 1f343b0: e5943020 ldr r3, [r4, #32] + 1f343b4: e1530002 cmp r3, r2 + 1f343b8: 1a000023 bne 1f3444c + 1f343bc: e30a336c movw r3, #41836 ; 0xa36c + 1f343c0: e340320d movt r3, #525 ; 0x20d + 1f343c4: e59420b0 ldr r2, [r4, #176] ; 0xb0 + 1f343c8: e1a00003 mov r0, r3 + 1f343cc: e58d3024 str r3, [sp, #36] ; 0x24 + 1f343d0: e3001fe0 movw r1, #4064 ; 0xfe0 + 1f343d4: e34011f6 movt r1, #502 ; 0x1f6 + 1f343d8: e59430b4 ldr r3, [r4, #180] ; 0xb4 + 1f343dc: e5801000 str r1, [r0] + 1f343e0: e1520003 cmp r2, r3 + 1f343e4: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f343e8: e58430ac str r3, [r4, #172] ; 0xac + 1f343ec: 3a000005 bcc 1f34408 + 1f343f0: e5941020 ldr r1, [r4, #32] + 1f343f4: e3510000 cmp r1, #0 + 1f343f8: 1a000288 bne 1f34e20 + 1f343fc: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f34400: e58430ac str r3, [r4, #172] ; 0xac + 1f34404: ea000008 b 1f3442c + 1f34408: e2821001 add r1, r2, #1 + 1f3440c: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f34410: e5d22000 ldrb r2, [r2] + 1f34414: e3520047 cmp r2, #71 ; 0x47 + 1f34418: 0a000296 beq 1f34e78 + 1f3441c: e28430b0 add r3, r4, #176 ; 0xb0 + 1f34420: e28440a8 add r4, r4, #168 ; 0xa8 + 1f34424: f463078f vld1.32 {d16}, [r3] + 1f34428: f444078f vst1.32 {d16}, [r4] + 1f3442c: e59d2024 ldr r2, [sp, #36] ; 0x24 + 1f34430: e3013190 movw r3, #4496 ; 0x1190 + 1f34434: e34031f6 movt r3, #502 ; 0x1f6 + 1f34438: e3a00000 mov r0, #0 + 1f3443c: e5823000 str r3, [r2] + 1f34440: e28ddf93 add sp, sp, #588 ; 0x24c + 1f34444: ecbd8b10 vpop {d8-d15} + 1f34448: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f3444c: e2847028 add r7, r4, #40 ; 0x28 + 1f34450: e5943010 ldr r3, [r4, #16] + 1f34454: e1a01007 mov r1, r7 + 1f34458: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f3445c: e594001c ldr r0, [r4, #28] + 1f34460: e12fff33 blx r3 + 1f34464: e3500000 cmp r0, #0 + 1f34468: 1a00023d bne 1f34d64 + 1f3446c: e2843029 add r3, r4, #41 ; 0x29 + 1f34470: e5840020 str r0, [r4, #32] + 1f34474: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f34478: e1a01003 mov r1, r3 + 1f3447c: e58430ac str r3, [r4, #172] ; 0xac + 1f34480: e1a02001 mov r2, r1 + 1f34484: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f34488: ea000002 b 1f34498 + 1f3448c: e2812001 add r2, r1, #1 + 1f34490: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f34494: e5d10000 ldrb r0, [r1] + 1f34498: e3500089 cmp r0, #137 ; 0x89 + 1f3449c: 1affffc6 bne 1f343bc + 1f344a0: e1520003 cmp r2, r3 + 1f344a4: 3a000012 bcc 1f344f4 + 1f344a8: e5943020 ldr r3, [r4, #32] + 1f344ac: e3530000 cmp r3, #0 + 1f344b0: 0affffc1 beq 1f343bc + 1f344b4: e2847028 add r7, r4, #40 ; 0x28 + 1f344b8: e5943010 ldr r3, [r4, #16] + 1f344bc: e1a01007 mov r1, r7 + 1f344c0: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f344c4: e594001c ldr r0, [r4, #28] + 1f344c8: e12fff33 blx r3 + 1f344cc: e3500000 cmp r0, #0 + 1f344d0: 1a000227 bne 1f34d74 + 1f344d4: e2843029 add r3, r4, #41 ; 0x29 + 1f344d8: e5840020 str r0, [r4, #32] + 1f344dc: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f344e0: e1a02003 mov r2, r3 + 1f344e4: e58430ac str r3, [r4, #172] ; 0xac + 1f344e8: e1a01002 mov r1, r2 + 1f344ec: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f344f0: ea000002 b 1f34500 + 1f344f4: e2821001 add r1, r2, #1 + 1f344f8: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f344fc: e5d20000 ldrb r0, [r2] + 1f34500: e3500050 cmp r0, #80 ; 0x50 + 1f34504: 1affffac bne 1f343bc + 1f34508: e1510003 cmp r1, r3 + 1f3450c: 2a0001a5 bcs 1f34ba8 + 1f34510: e2812001 add r2, r1, #1 + 1f34514: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f34518: e5d10000 ldrb r0, [r1] + 1f3451c: e350004e cmp r0, #78 ; 0x4e + 1f34520: 1affffa5 bne 1f343bc + 1f34524: e1520003 cmp r2, r3 + 1f34528: 2a0001b0 bcs 1f34bf0 + 1f3452c: e2821001 add r1, r2, #1 + 1f34530: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f34534: e5d20000 ldrb r0, [r2] + 1f34538: e3500047 cmp r0, #71 ; 0x47 + 1f3453c: 1affff9e bne 1f343bc + 1f34540: e1510003 cmp r1, r3 + 1f34544: 2a0001bb bcs 1f34c38 + 1f34548: e2812001 add r2, r1, #1 + 1f3454c: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f34550: e5d10000 ldrb r0, [r1] + 1f34554: e350000d cmp r0, #13 + 1f34558: 1affff97 bne 1f343bc + 1f3455c: e1520003 cmp r2, r3 + 1f34560: 2a0001c6 bcs 1f34c80 + 1f34564: e2821001 add r1, r2, #1 + 1f34568: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f3456c: e5d20000 ldrb r0, [r2] + 1f34570: e350000a cmp r0, #10 + 1f34574: 1affff90 bne 1f343bc + 1f34578: e1510003 cmp r1, r3 + 1f3457c: 2a0001d1 bcs 1f34cc8 + 1f34580: e2812001 add r2, r1, #1 + 1f34584: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f34588: e5d10000 ldrb r0, [r1] + 1f3458c: e350001a cmp r0, #26 + 1f34590: 1affff89 bne 1f343bc + 1f34594: e1520003 cmp r2, r3 + 1f34598: 2a0001dc bcs 1f34d10 + 1f3459c: e2823001 add r3, r2, #1 + 1f345a0: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f345a4: e5d23000 ldrb r3, [r2] + 1f345a8: e353000a cmp r3, #10 + 1f345ac: 1affff82 bne 1f343bc + 1f345b0: e28430b0 add r3, r4, #176 ; 0xb0 + 1f345b4: e59d22b0 ldr r2, [sp, #688] ; 0x2b0 + 1f345b8: e58d4234 str r4, [sp, #564] ; 0x234 + 1f345bc: e28440a8 add r4, r4, #168 ; 0xa8 + 1f345c0: f463078f vld1.32 {d16}, [r3] + 1f345c4: e3520004 cmp r2, #4 + 1f345c8: f444078f vst1.32 {d16}, [r4] + 1f345cc: 8a000231 bhi 1f34e98 + 1f345d0: e3a01000 mov r1, #0 + 1f345d4: e28d0f8d add r0, sp, #564 ; 0x234 + 1f345d8: ebfff7d0 bl 1f32520 + 1f345dc: e3500000 cmp r0, #0 + 1f345e0: 0a000221 beq 1f34e6c + 1f345e4: e59d3244 ldr r3, [sp, #580] ; 0x244 + 1f345e8: e3a09000 mov r9, #0 + 1f345ec: e59d22b0 ldr r2, [sp, #688] ; 0x2b0 + 1f345f0: e3530008 cmp r3, #8 + 1f345f4: e59d4240 ldr r4, [sp, #576] ; 0x240 + 1f345f8: b3a03008 movlt r3, #8 + 1f345fc: e1520009 cmp r2, r9 + 1f34600: e58d9240 str r9, [sp, #576] ; 0x240 + 1f34604: e5853000 str r3, [r5] + 1f34608: 059d2234 ldreq r2, [sp, #564] ; 0x234 + 1f3460c: 0a000150 beq 1f34b54 + 1f34610: e1a01002 mov r1, r2 + 1f34614: e59d2234 ldr r2, [sp, #564] ; 0x234 + 1f34618: e592500c ldr r5, [r2, #12] + 1f3461c: e1510005 cmp r1, r5 + 1f34620: 0a00014b beq 1f34b54 + 1f34624: e3530008 cmp r3, #8 + 1f34628: e5923000 ldr r3, [r2] + 1f3462c: 0a0001ed beq 1f34de8 + 1f34630: e1a01003 mov r1, r3 + 1f34634: e58d3020 str r3, [sp, #32] + 1f34638: e5923004 ldr r3, [r2, #4] + 1f3463c: e58d3060 str r3, [sp, #96] ; 0x60 + 1f34640: e1a07003 mov r7, r3 + 1f34644: e0000193 mul r0, r3, r1 + 1f34648: e59d32b0 ldr r3, [sp, #688] ; 0x2b0 + 1f3464c: e1a00080 lsl r0, r0, #1 + 1f34650: e0000093 mul r0, r3, r0 + 1f34654: eb0027c3 bl 1f3e568 + 1f34658: e250a000 subs sl, r0, #0 + 1f3465c: 0a000c9f beq 1f378e0 + 1f34660: e3570000 cmp r7, #0 + 1f34664: da000133 ble 1f34b38 + 1f34668: e59dc020 ldr ip, [sp, #32] + 1f3466c: f2c4005d vmov.i32 q8, #77 ; 0x0000004d + 1f34670: e24c3002 sub r3, ip, #2 + 1f34674: e1a0200c mov r2, ip + 1f34678: e1a07003 mov r7, r3 + 1f3467c: e58d3024 str r3, [sp, #36] ; 0x24 + 1f34680: e3770001 cmn r7, #1 + 1f34684: e1a0308c lsl r3, ip, #1 + 1f34688: b3a02001 movlt r2, #1 + 1f3468c: e58d2034 str r2, [sp, #52] ; 0x34 + 1f34690: e2420008 sub r0, r2, #8 + 1f34694: e2422009 sub r2, r2, #9 + 1f34698: e24cb001 sub fp, ip, #1 + 1f3469c: a1a0e003 movge lr, r3 + 1f346a0: e1a001a0 lsr r0, r0, #3 + 1f346a4: e1a021a2 lsr r2, r2, #3 + 1f346a8: e2800001 add r0, r0, #1 + 1f346ac: e2822001 add r2, r2, #1 + 1f346b0: b3a0e002 movlt lr, #2 + 1f346b4: e58d206c str r2, [sp, #108] ; 0x6c + 1f346b8: e58de030 str lr, [sp, #48] ; 0x30 + 1f346bc: e1a0e002 mov lr, r2 + 1f346c0: e1a0200c mov r2, ip + 1f346c4: b3a0c004 movlt ip, #4 + 1f346c8: a1a0c10c lslge ip, ip, #2 + 1f346cc: e58dc038 str ip, [sp, #56] ; 0x38 + 1f346d0: e1a0c180 lsl ip, r0, #3 + 1f346d4: e58d0050 str r0, [sp, #80] ; 0x50 + 1f346d8: e1a0800c mov r8, ip + 1f346dc: e58dc04c str ip, [sp, #76] ; 0x4c + 1f346e0: e1a0c200 lsl ip, r0, #4 + 1f346e4: e58dc044 str ip, [sp, #68] ; 0x44 + 1f346e8: e1a0c000 mov ip, r0 + 1f346ec: e1a00300 lsl r0, r0, #6 + 1f346f0: e58d0054 str r0, [sp, #84] ; 0x54 + 1f346f4: e1a0000e mov r0, lr + 1f346f8: e1a01007 mov r1, r7 + 1f346fc: b3a01001 movlt r1, #1 + 1f34700: a3a01000 movge r1, #0 + 1f34704: e1a0e18e lsl lr, lr, #3 + 1f34708: e58de040 str lr, [sp, #64] ; 0x40 + 1f3470c: e1a0e200 lsl lr, r0, #4 + 1f34710: e58de058 str lr, [sp, #88] ; 0x58 + 1f34714: e1a0e000 mov lr, r0 + 1f34718: e1a00300 lsl r0, r0, #6 + 1f3471c: e58d005c str r0, [sp, #92] ; 0x5c + 1f34720: e35b0006 cmp fp, #6 + 1f34724: 81a00001 movhi r0, r1 + 1f34728: 93810001 orrls r0, r1, #1 + 1f3472c: e3770001 cmn r7, #1 + 1f34730: e58d0048 str r0, [sp, #72] ; 0x48 + 1f34734: e0070593 mul r7, r3, r5 + 1f34738: e58d700c str r7, [sp, #12] + 1f3473c: e068800b rsb r8, r8, fp + 1f34740: e59d72b0 ldr r7, [sp, #688] ; 0x2b0 + 1f34744: e1a02182 lsl r2, r2, #3 + 1f34748: e59d02b0 ldr r0, [sp, #688] ; 0x2b0 + 1f3474c: e1a0c28c lsl ip, ip, #5 + 1f34750: e58d803c str r8, [sp, #60] ; 0x3c + 1f34754: e0070793 mul r7, r3, r7 + 1f34758: e0800185 add r0, r0, r5, lsl #3 + 1f3475c: e58d7010 str r7, [sp, #16] + 1f34760: e59d5044 ldr r5, [sp, #68] ; 0x44 + 1f34764: a0423003 subge r3, r2, r3 + 1f34768: b3a03006 movlt r3, #6 + 1f3476c: e59d7054 ldr r7, [sp, #84] ; 0x54 + 1f34770: e58d302c str r3, [sp, #44] ; 0x2c + 1f34774: a1a03002 movge r3, r2 + 1f34778: e0658007 rsb r8, r5, r7 + 1f3477c: e59d5040 ldr r5, [sp, #64] ; 0x40 + 1f34780: e59d705c ldr r7, [sp, #92] ; 0x5c + 1f34784: b3a03008 movlt r3, #8 + 1f34788: e58d8068 str r8, [sp, #104] ; 0x68 + 1f3478c: e065800b rsb r8, r5, fp + 1f34790: e59d5058 ldr r5, [sp, #88] ; 0x58 + 1f34794: e35b0007 cmp fp, #7 + 1f34798: 93811001 orrls r1, r1, #1 + 1f3479c: e58dc074 str ip, [sp, #116] ; 0x74 + 1f347a0: e1a0c28e lsl ip, lr, #5 + 1f347a4: e0655007 rsb r5, r5, r7 + 1f347a8: e58d3028 str r3, [sp, #40] ; 0x28 + 1f347ac: e58d8070 str r8, [sp, #112] ; 0x70 + 1f347b0: e240300a sub r3, r0, #10 + 1f347b4: e58d507c str r5, [sp, #124] ; 0x7c + 1f347b8: e1a0000a mov r0, sl + 1f347bc: e58dc078 str ip, [sp, #120] ; 0x78 + 1f347c0: e58d3014 str r3, [sp, #20] + 1f347c4: e58d1064 str r1, [sp, #100] ; 0x64 + 1f347c8: e1a01004 mov r1, r4 + 1f347cc: e59d7060 ldr r7, [sp, #96] ; 0x60 + 1f347d0: e58d6060 str r6, [sp, #96] ; 0x60 + 1f347d4: e59d5014 ldr r5, [sp, #20] + 1f347d8: e064e001 rsb lr, r4, r1 + 1f347dc: e1a02001 mov r2, r1 + 1f347e0: e06ac000 rsb ip, sl, r0 + 1f347e4: e1a03000 mov r3, r0 + 1f347e8: e3550019 cmp r5, #25 + 1f347ec: 979ff105 ldrls pc, [pc, r5, lsl #2] + 1f347f0: ea0000c8 b 1f34b18 + 1f347f4: 01f3612c .word 0x01f3612c + 1f347f8: 01f35d14 .word 0x01f35d14 + 1f347fc: 01f35b8c .word 0x01f35b8c + 1f34800: 01f34b18 .word 0x01f34b18 + 1f34804: 01f34b18 .word 0x01f34b18 + 1f34808: 01f34b18 .word 0x01f34b18 + 1f3480c: 01f34b18 .word 0x01f34b18 + 1f34810: 01f36670 .word 0x01f36670 + 1f34814: 01f34b18 .word 0x01f34b18 + 1f34818: 01f35964 .word 0x01f35964 + 1f3481c: 01f35508 .word 0x01f35508 + 1f34820: 01f34b18 .word 0x01f34b18 + 1f34824: 01f34b18 .word 0x01f34b18 + 1f34828: 01f34b18 .word 0x01f34b18 + 1f3482c: 01f34b18 .word 0x01f34b18 + 1f34830: 01f352a8 .word 0x01f352a8 + 1f34834: 01f356b0 .word 0x01f356b0 + 1f34838: 01f34b18 .word 0x01f34b18 + 1f3483c: 01f350c4 .word 0x01f350c4 + 1f34840: 01f34b18 .word 0x01f34b18 + 1f34844: 01f34b18 .word 0x01f34b18 + 1f34848: 01f34b18 .word 0x01f34b18 + 1f3484c: 01f34b18 .word 0x01f34b18 + 1f34850: 01f36270 .word 0x01f36270 + 1f34854: 01f35e7c .word 0x01f35e7c + 1f34858: 01f3485c .word 0x01f3485c + 1f3485c: e35b0000 cmp fp, #0 + 1f34860: ba0000ac blt 1f34b18 + 1f34864: e59d5028 ldr r5, [sp, #40] ; 0x28 + 1f34868: e085e00e add lr, r5, lr + 1f3486c: e59d502c ldr r5, [sp, #44] ; 0x2c + 1f34870: e084e00e add lr, r4, lr + 1f34874: e085c00c add ip, r5, ip + 1f34878: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f3487c: e08ac00c add ip, sl, ip + 1f34880: e151000c cmp r1, ip + 1f34884: 3150000e cmpcc r0, lr + 1f34888: e59de020 ldr lr, [sp, #32] + 1f3488c: 23a0c001 movcs ip, #1 + 1f34890: 33a0c000 movcc ip, #0 + 1f34894: e35e0007 cmp lr, #7 + 1f34898: 93a0e000 movls lr, #0 + 1f3489c: 83a0e001 movhi lr, #1 + 1f348a0: e3750001 cmn r5, #1 + 1f348a4: b3a0e000 movlt lr, #0 + 1f348a8: e11c000e tst ip, lr + 1f348ac: 0a000b2d beq 1f37568 + 1f348b0: e59dc064 ldr ip, [sp, #100] ; 0x64 + 1f348b4: e35c0000 cmp ip, #0 + 1f348b8: 1a000b17 bne 1f3751c + 1f348bc: e28d2e1f add r2, sp, #496 ; 0x1f0 + 1f348c0: e1a03000 mov r3, r0 + 1f348c4: e1a0e001 mov lr, r1 + 1f348c8: e1a0500c mov r5, ip + 1f348cc: ec828b10 vstmia r2, {d8-d15} + 1f348d0: f46e814f vld4.16 {d24,d26,d28,d30}, [lr] + 1f348d4: e28ec020 add ip, lr, #32 + 1f348d8: e59d206c ldr r2, [sp, #108] ; 0x6c + 1f348dc: e2855001 add r5, r5, #1 + 1f348e0: e28ee040 add lr, lr, #64 ; 0x40 + 1f348e4: e1520005 cmp r2, r5 + 1f348e8: e2832018 add r2, r3, #24 + 1f348ec: f46c914f vld4.16 {d25,d27,d29,d31}, [ip] + 1f348f0: f22841f8 vorr q2, q12, q12 + 1f348f4: f22a61fa vorr q3, q13, q13 + 1f348f8: f22c81fc vorr q4, q14, q14 + 1f348fc: f403454f vst3.16 {d4,d6,d8}, [r3] + 1f34900: e2833030 add r3, r3, #48 ; 0x30 + 1f34904: f402554f vst3.16 {d5,d7,d9}, [r2] + 1f34908: 8afffff0 bhi 1f348d0 + 1f3490c: e28d30a0 add r3, sp, #160 ; 0xa0 + 1f34910: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f34914: ec834b0c vstmia r3, {d4-d9} + 1f34918: e28d3e1f add r3, sp, #496 ; 0x1f0 + 1f3491c: ec938b10 vldmia r3, {d8-d15} + 1f34920: e59d3040 ldr r3, [sp, #64] ; 0x40 + 1f34924: e1530002 cmp r3, r2 + 1f34928: e59d305c ldr r3, [sp, #92] ; 0x5c + 1f3492c: e0812003 add r2, r1, r3 + 1f34930: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f34934: e0803003 add r3, r0, r3 + 1f34938: 0a000076 beq 1f34b18 + 1f3493c: e59de070 ldr lr, [sp, #112] ; 0x70 + 1f34940: e1d2c0b0 ldrh ip, [r2] + 1f34944: e35e0000 cmp lr, #0 + 1f34948: e1c3c0b0 strh ip, [r3] + 1f3494c: e1d2c0b2 ldrh ip, [r2, #2] + 1f34950: e1c3c0b2 strh ip, [r3, #2] + 1f34954: e1d2c0b4 ldrh ip, [r2, #4] + 1f34958: e1c3c0b4 strh ip, [r3, #4] + 1f3495c: 0a00006d beq 1f34b18 + 1f34960: e1d2c0b8 ldrh ip, [r2, #8] + 1f34964: e35e0001 cmp lr, #1 + 1f34968: e1c3c0b6 strh ip, [r3, #6] + 1f3496c: e1d2c0ba ldrh ip, [r2, #10] + 1f34970: e1c3c0b8 strh ip, [r3, #8] + 1f34974: e1d2c0bc ldrh ip, [r2, #12] + 1f34978: e1c3c0ba strh ip, [r3, #10] + 1f3497c: 0a000065 beq 1f34b18 + 1f34980: e1d2c1b0 ldrh ip, [r2, #16] + 1f34984: e35e0002 cmp lr, #2 + 1f34988: e1c3c0bc strh ip, [r3, #12] + 1f3498c: e1d2c1b2 ldrh ip, [r2, #18] + 1f34990: e1c3c0be strh ip, [r3, #14] + 1f34994: e1d2c1b4 ldrh ip, [r2, #20] + 1f34998: e1c3c1b0 strh ip, [r3, #16] + 1f3499c: 0a00005d beq 1f34b18 + 1f349a0: e1d2c1b8 ldrh ip, [r2, #24] + 1f349a4: e35e0003 cmp lr, #3 + 1f349a8: e1c3c1b2 strh ip, [r3, #18] + 1f349ac: e1d2c1ba ldrh ip, [r2, #26] + 1f349b0: e1c3c1b4 strh ip, [r3, #20] + 1f349b4: e1d2c1bc ldrh ip, [r2, #28] + 1f349b8: e1c3c1b6 strh ip, [r3, #22] + 1f349bc: 0a000055 beq 1f34b18 + 1f349c0: e1d2c2b0 ldrh ip, [r2, #32] + 1f349c4: e35e0004 cmp lr, #4 + 1f349c8: e1c3c1b8 strh ip, [r3, #24] + 1f349cc: e1d2c2b2 ldrh ip, [r2, #34] ; 0x22 + 1f349d0: e1c3c1ba strh ip, [r3, #26] + 1f349d4: e1d2c2b4 ldrh ip, [r2, #36] ; 0x24 + 1f349d8: e1c3c1bc strh ip, [r3, #28] + 1f349dc: 0a00004d beq 1f34b18 + 1f349e0: e1d2c2b8 ldrh ip, [r2, #40] ; 0x28 + 1f349e4: e35e0005 cmp lr, #5 + 1f349e8: e1c3c1be strh ip, [r3, #30] + 1f349ec: e1d2c2ba ldrh ip, [r2, #42] ; 0x2a + 1f349f0: e1c3c2b0 strh ip, [r3, #32] + 1f349f4: e1d2c2bc ldrh ip, [r2, #44] ; 0x2c + 1f349f8: e1c3c2b2 strh ip, [r3, #34] ; 0x22 + 1f349fc: 0a000045 beq 1f34b18 + 1f34a00: e1d2c3b0 ldrh ip, [r2, #48] ; 0x30 + 1f34a04: e35e0006 cmp lr, #6 + 1f34a08: e1c3c2b4 strh ip, [r3, #36] ; 0x24 + 1f34a0c: e1d2c3b2 ldrh ip, [r2, #50] ; 0x32 + 1f34a10: e1c3c2b6 strh ip, [r3, #38] ; 0x26 + 1f34a14: e1d2c3b4 ldrh ip, [r2, #52] ; 0x34 + 1f34a18: e1c3c2b8 strh ip, [r3, #40] ; 0x28 + 1f34a1c: 0a00003d beq 1f34b18 + 1f34a20: e1d2c3b8 ldrh ip, [r2, #56] ; 0x38 + 1f34a24: e35e0007 cmp lr, #7 + 1f34a28: e1c3c2ba strh ip, [r3, #42] ; 0x2a + 1f34a2c: e1d2c3ba ldrh ip, [r2, #58] ; 0x3a + 1f34a30: e1c3c2bc strh ip, [r3, #44] ; 0x2c + 1f34a34: e1d2c3bc ldrh ip, [r2, #60] ; 0x3c + 1f34a38: e1c3c2be strh ip, [r3, #46] ; 0x2e + 1f34a3c: 0a000035 beq 1f34b18 + 1f34a40: e1d2c4b0 ldrh ip, [r2, #64] ; 0x40 + 1f34a44: e35e0008 cmp lr, #8 + 1f34a48: e1c3c3b0 strh ip, [r3, #48] ; 0x30 + 1f34a4c: e1d2c4b2 ldrh ip, [r2, #66] ; 0x42 + 1f34a50: e1c3c3b2 strh ip, [r3, #50] ; 0x32 + 1f34a54: e1d2c4b4 ldrh ip, [r2, #68] ; 0x44 + 1f34a58: e1c3c3b4 strh ip, [r3, #52] ; 0x34 + 1f34a5c: 0a00002d beq 1f34b18 + 1f34a60: e1d2c4b8 ldrh ip, [r2, #72] ; 0x48 + 1f34a64: e35e0009 cmp lr, #9 + 1f34a68: e1c3c3b6 strh ip, [r3, #54] ; 0x36 + 1f34a6c: e1d2c4ba ldrh ip, [r2, #74] ; 0x4a + 1f34a70: e1c3c3b8 strh ip, [r3, #56] ; 0x38 + 1f34a74: e1d2c4bc ldrh ip, [r2, #76] ; 0x4c + 1f34a78: e1c3c3ba strh ip, [r3, #58] ; 0x3a + 1f34a7c: 0a000025 beq 1f34b18 + 1f34a80: e1d2c5b0 ldrh ip, [r2, #80] ; 0x50 + 1f34a84: e35e000a cmp lr, #10 + 1f34a88: e1c3c3bc strh ip, [r3, #60] ; 0x3c + 1f34a8c: e1d2c5b2 ldrh ip, [r2, #82] ; 0x52 + 1f34a90: e1c3c3be strh ip, [r3, #62] ; 0x3e + 1f34a94: e1d2c5b4 ldrh ip, [r2, #84] ; 0x54 + 1f34a98: e1c3c4b0 strh ip, [r3, #64] ; 0x40 + 1f34a9c: 0a00001d beq 1f34b18 + 1f34aa0: e1d2c5b8 ldrh ip, [r2, #88] ; 0x58 + 1f34aa4: e35e000b cmp lr, #11 + 1f34aa8: e1c3c4b2 strh ip, [r3, #66] ; 0x42 + 1f34aac: e1d2c5ba ldrh ip, [r2, #90] ; 0x5a + 1f34ab0: e1c3c4b4 strh ip, [r3, #68] ; 0x44 + 1f34ab4: e1d2c5bc ldrh ip, [r2, #92] ; 0x5c + 1f34ab8: e1c3c4b6 strh ip, [r3, #70] ; 0x46 + 1f34abc: 0a000015 beq 1f34b18 + 1f34ac0: e1d2c6b0 ldrh ip, [r2, #96] ; 0x60 + 1f34ac4: e35e000c cmp lr, #12 + 1f34ac8: e1c3c4b8 strh ip, [r3, #72] ; 0x48 + 1f34acc: e1d2c6b2 ldrh ip, [r2, #98] ; 0x62 + 1f34ad0: e1c3c4ba strh ip, [r3, #74] ; 0x4a + 1f34ad4: e1d2c6b4 ldrh ip, [r2, #100] ; 0x64 + 1f34ad8: e1c3c4bc strh ip, [r3, #76] ; 0x4c + 1f34adc: 0a00000d beq 1f34b18 + 1f34ae0: e1d2c6b8 ldrh ip, [r2, #104] ; 0x68 + 1f34ae4: e35e000d cmp lr, #13 + 1f34ae8: e1c3c4be strh ip, [r3, #78] ; 0x4e + 1f34aec: e1d2c6ba ldrh ip, [r2, #106] ; 0x6a + 1f34af0: e1c3c5b0 strh ip, [r3, #80] ; 0x50 + 1f34af4: e1d2c6bc ldrh ip, [r2, #108] ; 0x6c + 1f34af8: e1c3c5b2 strh ip, [r3, #82] ; 0x52 + 1f34afc: 0a000005 beq 1f34b18 + 1f34b00: e1d2c7b0 ldrh ip, [r2, #112] ; 0x70 + 1f34b04: e1c3c5b4 strh ip, [r3, #84] ; 0x54 + 1f34b08: e1d2c7b2 ldrh ip, [r2, #114] ; 0x72 + 1f34b0c: e1c3c5b6 strh ip, [r3, #86] ; 0x56 + 1f34b10: e1d227b4 ldrh r2, [r2, #116] ; 0x74 + 1f34b14: e1c325b8 strh r2, [r3, #88] ; 0x58 + 1f34b18: e59d300c ldr r3, [sp, #12] + 1f34b1c: e2899001 add r9, r9, #1 + 1f34b20: e1590007 cmp r9, r7 + 1f34b24: e0811003 add r1, r1, r3 + 1f34b28: e59d3010 ldr r3, [sp, #16] + 1f34b2c: e0800003 add r0, r0, r3 + 1f34b30: 1affff27 bne 1f347d4 + 1f34b34: e59d6060 ldr r6, [sp, #96] ; 0x60 + 1f34b38: e1a00004 mov r0, r4 + 1f34b3c: e1a0400a mov r4, sl + 1f34b40: eb002690 bl 1f3e588 + 1f34b44: e59d2234 ldr r2, [sp, #564] ; 0x234 + 1f34b48: e59d32b0 ldr r3, [sp, #688] ; 0x2b0 + 1f34b4c: e59d9240 ldr r9, [sp, #576] ; 0x240 + 1f34b50: e582300c str r3, [r2, #12] + 1f34b54: e59d0018 ldr r0, [sp, #24] + 1f34b58: e3560000 cmp r6, #0 + 1f34b5c: e892000a ldm r2, {r1, r3} + 1f34b60: e5801000 str r1, [r0] + 1f34b64: e59d101c ldr r1, [sp, #28] + 1f34b68: e5813000 str r3, [r1] + 1f34b6c: 15923008 ldrne r3, [r2, #8] + 1f34b70: 15863000 strne r3, [r6] + 1f34b74: e1a00009 mov r0, r9 + 1f34b78: e3a05000 mov r5, #0 + 1f34b7c: eb002681 bl 1f3e588 + 1f34b80: e59d023c ldr r0, [sp, #572] ; 0x23c + 1f34b84: e58d5240 str r5, [sp, #576] ; 0x240 + 1f34b88: eb00267e bl 1f3e588 + 1f34b8c: e59d0238 ldr r0, [sp, #568] ; 0x238 + 1f34b90: e58d523c str r5, [sp, #572] ; 0x23c + 1f34b94: eb00267b bl 1f3e588 + 1f34b98: e1a00004 mov r0, r4 + 1f34b9c: e28ddf93 add sp, sp, #588 ; 0x24c + 1f34ba0: ecbd8b10 vpop {d8-d15} + 1f34ba4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f34ba8: e5943020 ldr r3, [r4, #32] + 1f34bac: e3530000 cmp r3, #0 + 1f34bb0: 0afffe01 beq 1f343bc + 1f34bb4: e2847028 add r7, r4, #40 ; 0x28 + 1f34bb8: e5943010 ldr r3, [r4, #16] + 1f34bbc: e1a01007 mov r1, r7 + 1f34bc0: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f34bc4: e594001c ldr r0, [r4, #28] + 1f34bc8: e12fff33 blx r3 + 1f34bcc: e3500000 cmp r0, #0 + 1f34bd0: 0a00006b beq 1f34d84 + 1f34bd4: e0873000 add r3, r7, r0 + 1f34bd8: e5d40028 ldrb r0, [r4, #40] ; 0x28 + 1f34bdc: e2841029 add r1, r4, #41 ; 0x29 + 1f34be0: e58430ac str r3, [r4, #172] ; 0xac + 1f34be4: e1a02001 mov r2, r1 + 1f34be8: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f34bec: eafffe4a b 1f3451c + 1f34bf0: e5943020 ldr r3, [r4, #32] + 1f34bf4: e3530000 cmp r3, #0 + 1f34bf8: 0afffdef beq 1f343bc + 1f34bfc: e2847028 add r7, r4, #40 ; 0x28 + 1f34c00: e5943010 ldr r3, [r4, #16] + 1f34c04: e1a01007 mov r1, r7 + 1f34c08: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f34c0c: e594001c ldr r0, [r4, #28] + 1f34c10: e12fff33 blx r3 + 1f34c14: e3500000 cmp r0, #0 + 1f34c18: 0a00005e beq 1f34d98 + 1f34c1c: e0873000 add r3, r7, r0 + 1f34c20: e5d40028 ldrb r0, [r4, #40] ; 0x28 + 1f34c24: e2842029 add r2, r4, #41 ; 0x29 + 1f34c28: e58430ac str r3, [r4, #172] ; 0xac + 1f34c2c: e1a01002 mov r1, r2 + 1f34c30: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f34c34: eafffe3f b 1f34538 + 1f34c38: e5943020 ldr r3, [r4, #32] + 1f34c3c: e3530000 cmp r3, #0 + 1f34c40: 0afffddd beq 1f343bc + 1f34c44: e2847028 add r7, r4, #40 ; 0x28 + 1f34c48: e5943010 ldr r3, [r4, #16] + 1f34c4c: e1a01007 mov r1, r7 + 1f34c50: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f34c54: e594001c ldr r0, [r4, #28] + 1f34c58: e12fff33 blx r3 + 1f34c5c: e3500000 cmp r0, #0 + 1f34c60: 0a000051 beq 1f34dac + 1f34c64: e0873000 add r3, r7, r0 + 1f34c68: e5d40028 ldrb r0, [r4, #40] ; 0x28 + 1f34c6c: e2841029 add r1, r4, #41 ; 0x29 + 1f34c70: e58430ac str r3, [r4, #172] ; 0xac + 1f34c74: e1a02001 mov r2, r1 + 1f34c78: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f34c7c: eafffe34 b 1f34554 + 1f34c80: e5943020 ldr r3, [r4, #32] + 1f34c84: e3530000 cmp r3, #0 + 1f34c88: 0afffdcb beq 1f343bc + 1f34c8c: e2847028 add r7, r4, #40 ; 0x28 + 1f34c90: e5943010 ldr r3, [r4, #16] + 1f34c94: e1a01007 mov r1, r7 + 1f34c98: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f34c9c: e594001c ldr r0, [r4, #28] + 1f34ca0: e12fff33 blx r3 + 1f34ca4: e3500000 cmp r0, #0 + 1f34ca8: 0a000044 beq 1f34dc0 + 1f34cac: e0873000 add r3, r7, r0 + 1f34cb0: e5d40028 ldrb r0, [r4, #40] ; 0x28 + 1f34cb4: e2842029 add r2, r4, #41 ; 0x29 + 1f34cb8: e58430ac str r3, [r4, #172] ; 0xac + 1f34cbc: e1a01002 mov r1, r2 + 1f34cc0: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f34cc4: eafffe29 b 1f34570 + 1f34cc8: e5943020 ldr r3, [r4, #32] + 1f34ccc: e3530000 cmp r3, #0 + 1f34cd0: 0afffdb9 beq 1f343bc + 1f34cd4: e2847028 add r7, r4, #40 ; 0x28 + 1f34cd8: e5943010 ldr r3, [r4, #16] + 1f34cdc: e1a01007 mov r1, r7 + 1f34ce0: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f34ce4: e594001c ldr r0, [r4, #28] + 1f34ce8: e12fff33 blx r3 + 1f34cec: e3500000 cmp r0, #0 + 1f34cf0: 0a000037 beq 1f34dd4 + 1f34cf4: e0873000 add r3, r7, r0 + 1f34cf8: e5d40028 ldrb r0, [r4, #40] ; 0x28 + 1f34cfc: e2841029 add r1, r4, #41 ; 0x29 + 1f34d00: e58430ac str r3, [r4, #172] ; 0xac + 1f34d04: e1a02001 mov r2, r1 + 1f34d08: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f34d0c: eafffe1e b 1f3458c + 1f34d10: e5943020 ldr r3, [r4, #32] + 1f34d14: e3530000 cmp r3, #0 + 1f34d18: 0afffda7 beq 1f343bc + 1f34d1c: e2847028 add r7, r4, #40 ; 0x28 + 1f34d20: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f34d24: e1a01007 mov r1, r7 + 1f34d28: e5943010 ldr r3, [r4, #16] + 1f34d2c: e594001c ldr r0, [r4, #28] + 1f34d30: e12fff33 blx r3 + 1f34d34: e3500000 cmp r0, #0 + 1f34d38: 02842029 addeq r2, r4, #41 ; 0x29 + 1f34d3c: 10872000 addne r2, r7, r0 + 1f34d40: 01a01002 moveq r1, r2 + 1f34d44: 12841029 addne r1, r4, #41 ; 0x29 + 1f34d48: 05840020 streq r0, [r4, #32] + 1f34d4c: 01a03000 moveq r3, r0 + 1f34d50: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f34d54: 15d43028 ldrbne r3, [r4, #40] ; 0x28 + 1f34d58: e58420ac str r2, [r4, #172] ; 0xac + 1f34d5c: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f34d60: eafffe10 b 1f345a8 + 1f34d64: e0873000 add r3, r7, r0 + 1f34d68: e2841029 add r1, r4, #41 ; 0x29 + 1f34d6c: e5d40028 ldrb r0, [r4, #40] ; 0x28 + 1f34d70: eafffdc1 b 1f3447c + 1f34d74: e0873000 add r3, r7, r0 + 1f34d78: e2842029 add r2, r4, #41 ; 0x29 + 1f34d7c: e5d40028 ldrb r0, [r4, #40] ; 0x28 + 1f34d80: eafffdd7 b 1f344e4 + 1f34d84: e2843029 add r3, r4, #41 ; 0x29 + 1f34d88: e5840020 str r0, [r4, #32] + 1f34d8c: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f34d90: e1a01003 mov r1, r3 + 1f34d94: eaffff91 b 1f34be0 + 1f34d98: e2843029 add r3, r4, #41 ; 0x29 + 1f34d9c: e5840020 str r0, [r4, #32] + 1f34da0: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f34da4: e1a02003 mov r2, r3 + 1f34da8: eaffff9e b 1f34c28 + 1f34dac: e2843029 add r3, r4, #41 ; 0x29 + 1f34db0: e5840020 str r0, [r4, #32] + 1f34db4: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f34db8: e1a01003 mov r1, r3 + 1f34dbc: eaffffab b 1f34c70 + 1f34dc0: e2843029 add r3, r4, #41 ; 0x29 + 1f34dc4: e5840020 str r0, [r4, #32] + 1f34dc8: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f34dcc: e1a02003 mov r2, r3 + 1f34dd0: eaffffb8 b 1f34cb8 + 1f34dd4: e2843029 add r3, r4, #41 ; 0x29 + 1f34dd8: e5840020 str r0, [r4, #32] + 1f34ddc: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f34de0: e1a01003 mov r1, r3 + 1f34de4: eaffffc5 b 1f34d00 + 1f34de8: e5922004 ldr r2, [r2, #4] + 1f34dec: e1a00004 mov r0, r4 + 1f34df0: e58d2000 str r2, [sp] + 1f34df4: e1a01005 mov r1, r5 + 1f34df8: e59d22b0 ldr r2, [sp, #688] ; 0x2b0 + 1f34dfc: ebffd880 bl 1f2b004 + 1f34e00: e59d2234 ldr r2, [sp, #564] ; 0x234 + 1f34e04: e2504000 subs r4, r0, #0 + 1f34e08: e59d32b0 ldr r3, [sp, #688] ; 0x2b0 + 1f34e0c: 01a00004 moveq r0, r4 + 1f34e10: e582300c str r3, [r2, #12] + 1f34e14: 0afffd89 beq 1f34440 + 1f34e18: e59d9240 ldr r9, [sp, #576] ; 0x240 + 1f34e1c: eaffff4c b 1f34b54 + 1f34e20: e2845028 add r5, r4, #40 ; 0x28 + 1f34e24: e5943010 ldr r3, [r4, #16] + 1f34e28: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f34e2c: e1a01005 mov r1, r5 + 1f34e30: e594001c ldr r0, [r4, #28] + 1f34e34: e12fff33 blx r3 + 1f34e38: e3500000 cmp r0, #0 + 1f34e3c: 02843029 addeq r3, r4, #41 ; 0x29 + 1f34e40: 10853000 addne r3, r5, r0 + 1f34e44: 05840020 streq r0, [r4, #32] + 1f34e48: 12840029 addne r0, r4, #41 ; 0x29 + 1f34e4c: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f34e50: 01a02000 moveq r2, r0 + 1f34e54: 01a00003 moveq r0, r3 + 1f34e58: 15d42028 ldrbne r2, [r4, #40] ; 0x28 + 1f34e5c: e58430ac str r3, [r4, #172] ; 0xac + 1f34e60: e1a01000 mov r1, r0 + 1f34e64: e58400a8 str r0, [r4, #168] ; 0xa8 + 1f34e68: eafffd69 b 1f34414 + 1f34e6c: e59d9240 ldr r9, [sp, #576] ; 0x240 + 1f34e70: e1a04000 mov r4, r0 + 1f34e74: eaffff3e b 1f34b74 + 1f34e78: e1510003 cmp r1, r3 + 1f34e7c: 3a00087c bcc 1f37074 + 1f34e80: e5943020 ldr r3, [r4, #32] + 1f34e84: e3530000 cmp r3, #0 + 1f34e88: 1a000009 bne 1f34eb4 + 1f34e8c: e59430b4 ldr r3, [r4, #180] ; 0xb4 + 1f34e90: e59420b0 ldr r2, [r4, #176] ; 0xb0 + 1f34e94: eafffd58 b 1f343fc + 1f34e98: e30a336c movw r3, #41836 ; 0xa36c + 1f34e9c: e340320d movt r3, #525 ; 0x20d + 1f34ea0: e301210c movw r2, #4364 ; 0x110c + 1f34ea4: e34021f6 movt r2, #502 ; 0x1f6 + 1f34ea8: e3a00000 mov r0, #0 + 1f34eac: e5832000 str r2, [r3] + 1f34eb0: eafffd62 b 1f34440 + 1f34eb4: e2845028 add r5, r4, #40 ; 0x28 + 1f34eb8: e5943010 ldr r3, [r4, #16] + 1f34ebc: e1a01005 mov r1, r5 + 1f34ec0: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f34ec4: e594001c ldr r0, [r4, #28] + 1f34ec8: e12fff33 blx r3 + 1f34ecc: e3500000 cmp r0, #0 + 1f34ed0: 02843029 addeq r3, r4, #41 ; 0x29 + 1f34ed4: 10853000 addne r3, r5, r0 + 1f34ed8: 05840020 streq r0, [r4, #32] + 1f34edc: 12840029 addne r0, r4, #41 ; 0x29 + 1f34ee0: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f34ee4: 01a01000 moveq r1, r0 + 1f34ee8: 15d41028 ldrbne r1, [r4, #40] ; 0x28 + 1f34eec: 01a00003 moveq r0, r3 + 1f34ef0: e58430ac str r3, [r4, #172] ; 0xac + 1f34ef4: e1a02000 mov r2, r0 + 1f34ef8: e58400a8 str r0, [r4, #168] ; 0xa8 + 1f34efc: e3510049 cmp r1, #73 ; 0x49 + 1f34f00: 1afffd45 bne 1f3441c + 1f34f04: e1520003 cmp r2, r3 + 1f34f08: 3a000979 bcc 1f374f4 + 1f34f0c: e5943020 ldr r3, [r4, #32] + 1f34f10: e3530000 cmp r3, #0 + 1f34f14: 0affffdc beq 1f34e8c + 1f34f18: e2845028 add r5, r4, #40 ; 0x28 + 1f34f1c: e5943010 ldr r3, [r4, #16] + 1f34f20: e1a01005 mov r1, r5 + 1f34f24: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f34f28: e594001c ldr r0, [r4, #28] + 1f34f2c: e12fff33 blx r3 + 1f34f30: e3500000 cmp r0, #0 + 1f34f34: 02843029 addeq r3, r4, #41 ; 0x29 + 1f34f38: 10853000 addne r3, r5, r0 + 1f34f3c: 15d42028 ldrbne r2, [r4, #40] ; 0x28 + 1f34f40: 01a01003 moveq r1, r3 + 1f34f44: 12841029 addne r1, r4, #41 ; 0x29 + 1f34f48: 05840020 streq r0, [r4, #32] + 1f34f4c: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f34f50: 01a02000 moveq r2, r0 + 1f34f54: e58430ac str r3, [r4, #172] ; 0xac + 1f34f58: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f34f5c: e3520046 cmp r2, #70 ; 0x46 + 1f34f60: 1afffd2d bne 1f3441c + 1f34f64: e1a00004 mov r0, r4 + 1f34f68: ebffca25 bl 1f27804 + 1f34f6c: e3500038 cmp r0, #56 ; 0x38 + 1f34f70: 1afffd29 bne 1f3441c + 1f34f74: e59410a8 ldr r1, [r4, #168] ; 0xa8 + 1f34f78: e59420ac ldr r2, [r4, #172] ; 0xac + 1f34f7c: e1510002 cmp r1, r2 + 1f34f80: 3a00081d bcc 1f36ffc + 1f34f84: e5943020 ldr r3, [r4, #32] + 1f34f88: e3530000 cmp r3, #0 + 1f34f8c: 0afffd22 beq 1f3441c + 1f34f90: e2845028 add r5, r4, #40 ; 0x28 + 1f34f94: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f34f98: e1a01005 mov r1, r5 + 1f34f9c: e5943010 ldr r3, [r4, #16] + 1f34fa0: e594001c ldr r0, [r4, #28] + 1f34fa4: e12fff33 blx r3 + 1f34fa8: e3500000 cmp r0, #0 + 1f34fac: 02842029 addeq r2, r4, #41 ; 0x29 + 1f34fb0: 10852000 addne r2, r5, r0 + 1f34fb4: 15d43028 ldrbne r3, [r4, #40] ; 0x28 + 1f34fb8: 01a01002 moveq r1, r2 + 1f34fbc: 12841029 addne r1, r4, #41 ; 0x29 + 1f34fc0: 05840020 streq r0, [r4, #32] + 1f34fc4: 12435037 subne r5, r3, #55 ; 0x37 + 1f34fc8: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f34fcc: 03a050c9 moveq r5, #201 ; 0xc9 + 1f34fd0: 120550fd andne r5, r5, #253 ; 0xfd + 1f34fd4: e58420ac str r2, [r4, #172] ; 0xac + 1f34fd8: e1a03001 mov r3, r1 + 1f34fdc: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f34fe0: e3550000 cmp r5, #0 + 1f34fe4: 1affffa8 bne 1f34e8c + 1f34fe8: e1530002 cmp r3, r2 + 1f34fec: 3a00081c bcc 1f37064 + 1f34ff0: e5943020 ldr r3, [r4, #32] + 1f34ff4: e3530000 cmp r3, #0 + 1f34ff8: 0afffd07 beq 1f3441c + 1f34ffc: e2847028 add r7, r4, #40 ; 0x28 + 1f35000: e5943010 ldr r3, [r4, #16] + 1f35004: e1a01007 mov r1, r7 + 1f35008: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f3500c: e594001c ldr r0, [r4, #28] + 1f35010: e12fff33 blx r3 + 1f35014: e3500000 cmp r0, #0 + 1f35018: 02847029 addeq r7, r4, #41 ; 0x29 + 1f3501c: 10877000 addne r7, r7, r0 + 1f35020: 15d45028 ldrbne r5, [r4, #40] ; 0x28 + 1f35024: 01a03007 moveq r3, r7 + 1f35028: 12843029 addne r3, r4, #41 ; 0x29 + 1f3502c: 05845020 streq r5, [r4, #32] + 1f35030: 05c45028 strbeq r5, [r4, #40] ; 0x28 + 1f35034: e58470ac str r7, [r4, #172] ; 0xac + 1f35038: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f3503c: e3550061 cmp r5, #97 ; 0x61 + 1f35040: 1affff91 bne 1f34e8c + 1f35044: e28420b0 add r2, r4, #176 ; 0xb0 + 1f35048: e28430a8 add r3, r4, #168 ; 0xa8 + 1f3504c: e3040854 movw r0, #18516 ; 0x4854 + 1f35050: f462078f vld1.32 {d16}, [r2] + 1f35054: f443078f vst1.32 {d16}, [r3] + 1f35058: eb002542 bl 1f3e568 + 1f3505c: e1a05000 mov r5, r0 + 1f35060: e3042854 movw r2, #18516 ; 0x4854 + 1f35064: e3a01000 mov r1, #0 + 1f35068: eb0027eb bl 1f3f01c + 1f3506c: e5957008 ldr r7, [r5, #8] + 1f35070: e3570000 cmp r7, #0 + 1f35074: 0a000808 beq 1f3709c + 1f35078: e5952000 ldr r2, [r5] + 1f3507c: e5950004 ldr r0, [r5, #4] + 1f35080: e1923000 orrs r3, r2, r0 + 1f35084: 5a0005df bpl 1f36808 + 1f35088: e59d2024 ldr r2, [sp, #36] ; 0x24 + 1f3508c: e301300c movw r3, #4108 ; 0x100c + 1f35090: e34031f6 movt r3, #502 ; 0x1f6 + 1f35094: e5823000 str r3, [r2] + 1f35098: e3570000 cmp r7, #0 + 1f3509c: 0a000876 beq 1f3727c + 1f350a0: e1a00007 mov r0, r7 + 1f350a4: e3a0a000 mov sl, #0 + 1f350a8: eb002536 bl 1f3e588 + 1f350ac: e1a00005 mov r0, r5 + 1f350b0: eb002534 bl 1f3e588 + 1f350b4: e1a0000a mov r0, sl + 1f350b8: e28ddf93 add sp, sp, #588 ; 0x24c + 1f350bc: ecbd8b10 vpop {d8-d15} + 1f350c0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f350c4: e35b0000 cmp fp, #0 + 1f350c8: bafffe92 blt 1f34b18 + 1f350cc: e59d502c ldr r5, [sp, #44] ; 0x2c + 1f350d0: e085e00e add lr, r5, lr + 1f350d4: e59d5028 ldr r5, [sp, #40] ; 0x28 + 1f350d8: e084e00e add lr, r4, lr + 1f350dc: e085c00c add ip, r5, ip + 1f350e0: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f350e4: e08ac00c add ip, sl, ip + 1f350e8: e151000c cmp r1, ip + 1f350ec: 3150000e cmpcc r0, lr + 1f350f0: e59de020 ldr lr, [sp, #32] + 1f350f4: 23a0c001 movcs ip, #1 + 1f350f8: 33a0c000 movcc ip, #0 + 1f350fc: e35e0007 cmp lr, #7 + 1f35100: 93a0e000 movls lr, #0 + 1f35104: 83a0e001 movhi lr, #1 + 1f35108: e3750001 cmn r5, #1 + 1f3510c: b3a0e000 movlt lr, #0 + 1f35110: e11c000e tst ip, lr + 1f35114: 0a000902 beq 1f37524 + 1f35118: e59dc048 ldr ip, [sp, #72] ; 0x48 + 1f3511c: e35c0000 cmp ip, #0 + 1f35120: 1a0008fb bne 1f37514 + 1f35124: e28d2e1f add r2, sp, #496 ; 0x1f0 + 1f35128: e1a03000 mov r3, r0 + 1f3512c: e1a0e001 mov lr, r1 + 1f35130: e1a0500c mov r5, ip + 1f35134: ec828b10 vstmia r2, {d8-d15} + 1f35138: f42e454f vld3.16 {d4,d6,d8}, [lr] + 1f3513c: e28ec018 add ip, lr, #24 + 1f35140: e59d2050 ldr r2, [sp, #80] ; 0x50 + 1f35144: f3c7ee5f vmov.i8 q15, #255 ; 0xff + 1f35148: e2855001 add r5, r5, #1 + 1f3514c: e28ee030 add lr, lr, #48 ; 0x30 + 1f35150: e1520005 cmp r2, r5 + 1f35154: e2832020 add r2, r3, #32 + 1f35158: f42c554f vld3.16 {d5,d7,d9}, [ip] + 1f3515c: f2648154 vorr q12, q2, q2 + 1f35160: f266a156 vorr q13, q3, q3 + 1f35164: f268c158 vorr q14, q4, q4 + 1f35168: f443814f vst4.16 {d24,d26,d28,d30}, [r3] + 1f3516c: e2833040 add r3, r3, #64 ; 0x40 + 1f35170: f442914f vst4.16 {d25,d27,d29,d31}, [r2] + 1f35174: 8affffef bhi 1f35138 + 1f35178: e28d30d0 add r3, sp, #208 ; 0xd0 + 1f3517c: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f35180: ecc38b10 vstmia r3, {d24-d31} + 1f35184: e28d3e1f add r3, sp, #496 ; 0x1f0 + 1f35188: ec938b10 vldmia r3, {d8-d15} + 1f3518c: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f35190: e1530002 cmp r3, r2 + 1f35194: e59d3068 ldr r3, [sp, #104] ; 0x68 + 1f35198: e0812003 add r2, r1, r3 + 1f3519c: e59d3054 ldr r3, [sp, #84] ; 0x54 + 1f351a0: e0803003 add r3, r0, r3 + 1f351a4: 0afffe5b beq 1f34b18 + 1f351a8: e59de03c ldr lr, [sp, #60] ; 0x3c + 1f351ac: e1d2c0b0 ldrh ip, [r2] + 1f351b0: e35e0000 cmp lr, #0 + 1f351b4: e1c3c0b0 strh ip, [r3] + 1f351b8: e3e05000 mvn r5, #0 + 1f351bc: e1d2c0b2 ldrh ip, [r2, #2] + 1f351c0: e1c3c0b2 strh ip, [r3, #2] + 1f351c4: e1d2c0b4 ldrh ip, [r2, #4] + 1f351c8: e1c3c0b4 strh ip, [r3, #4] + 1f351cc: e1c350b6 strh r5, [r3, #6] + 1f351d0: 0afffe50 beq 1f34b18 + 1f351d4: e1d2c0b6 ldrh ip, [r2, #6] + 1f351d8: e35e0001 cmp lr, #1 + 1f351dc: e1c3c0b8 strh ip, [r3, #8] + 1f351e0: e1d2c0b8 ldrh ip, [r2, #8] + 1f351e4: e1c3c0ba strh ip, [r3, #10] + 1f351e8: e1d2c0ba ldrh ip, [r2, #10] + 1f351ec: e1c3c0bc strh ip, [r3, #12] + 1f351f0: e1c350be strh r5, [r3, #14] + 1f351f4: 0afffe47 beq 1f34b18 + 1f351f8: e1d2c0bc ldrh ip, [r2, #12] + 1f351fc: e35e0002 cmp lr, #2 + 1f35200: e1c3c1b0 strh ip, [r3, #16] + 1f35204: e1d2c0be ldrh ip, [r2, #14] + 1f35208: e1c3c1b2 strh ip, [r3, #18] + 1f3520c: e1d2c1b0 ldrh ip, [r2, #16] + 1f35210: e1c3c1b4 strh ip, [r3, #20] + 1f35214: e1c351b6 strh r5, [r3, #22] + 1f35218: 0afffe3e beq 1f34b18 + 1f3521c: e1d2c1b2 ldrh ip, [r2, #18] + 1f35220: e35e0003 cmp lr, #3 + 1f35224: e1c3c1b8 strh ip, [r3, #24] + 1f35228: e1d2c1b4 ldrh ip, [r2, #20] + 1f3522c: e1c3c1ba strh ip, [r3, #26] + 1f35230: e1d2c1b6 ldrh ip, [r2, #22] + 1f35234: e1c3c1bc strh ip, [r3, #28] + 1f35238: e1c351be strh r5, [r3, #30] + 1f3523c: 0afffe35 beq 1f34b18 + 1f35240: e1d2c1b8 ldrh ip, [r2, #24] + 1f35244: e35e0004 cmp lr, #4 + 1f35248: e1c3c2b0 strh ip, [r3, #32] + 1f3524c: e1d2c1ba ldrh ip, [r2, #26] + 1f35250: e1c3c2b2 strh ip, [r3, #34] ; 0x22 + 1f35254: e1d2c1bc ldrh ip, [r2, #28] + 1f35258: e1c3c2b4 strh ip, [r3, #36] ; 0x24 + 1f3525c: e1c352b6 strh r5, [r3, #38] ; 0x26 + 1f35260: 0afffe2c beq 1f34b18 + 1f35264: e1d2c1be ldrh ip, [r2, #30] + 1f35268: e35e0005 cmp lr, #5 + 1f3526c: e1c3c2b8 strh ip, [r3, #40] ; 0x28 + 1f35270: e1d2c2b0 ldrh ip, [r2, #32] + 1f35274: e1c3c2ba strh ip, [r3, #42] ; 0x2a + 1f35278: e1d2c2b2 ldrh ip, [r2, #34] ; 0x22 + 1f3527c: e1c3c2bc strh ip, [r3, #44] ; 0x2c + 1f35280: e1c352be strh r5, [r3, #46] ; 0x2e + 1f35284: 0afffe23 beq 1f34b18 + 1f35288: e1d2c2b4 ldrh ip, [r2, #36] ; 0x24 + 1f3528c: e1c3c3b0 strh ip, [r3, #48] ; 0x30 + 1f35290: e1d2c2b6 ldrh ip, [r2, #38] ; 0x26 + 1f35294: e1c3c3b2 strh ip, [r3, #50] ; 0x32 + 1f35298: e1d222b8 ldrh r2, [r2, #40] ; 0x28 + 1f3529c: e1c323b4 strh r2, [r3, #52] ; 0x34 + 1f352a0: e1c353b6 strh r5, [r3, #54] ; 0x36 + 1f352a4: eafffe1b b 1f34b18 + 1f352a8: e35b0000 cmp fp, #0 + 1f352ac: bafffe19 blt 1f34b18 + 1f352b0: e59d502c ldr r5, [sp, #44] ; 0x2c + 1f352b4: e085e00e add lr, r5, lr + 1f352b8: e59d5030 ldr r5, [sp, #48] ; 0x30 + 1f352bc: e084e00e add lr, r4, lr + 1f352c0: e085c00c add ip, r5, ip + 1f352c4: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f352c8: e08ac00c add ip, sl, ip + 1f352cc: e151000c cmp r1, ip + 1f352d0: 3150000e cmpcc r0, lr + 1f352d4: e59de020 ldr lr, [sp, #32] + 1f352d8: 23a0c001 movcs ip, #1 + 1f352dc: 33a0c000 movcc ip, #0 + 1f352e0: e35e0007 cmp lr, #7 + 1f352e4: 93a0e000 movls lr, #0 + 1f352e8: 83a0e001 movhi lr, #1 + 1f352ec: e3750001 cmn r5, #1 + 1f352f0: b3a0e000 movlt lr, #0 + 1f352f4: e11c000e tst ip, lr + 1f352f8: 0a00094c beq 1f37830 + 1f352fc: e59de048 ldr lr, [sp, #72] ; 0x48 + 1f35300: e35e0000 cmp lr, #0 + 1f35304: 1a000872 bne 1f374d4 + 1f35308: f3c1e056 vmov.i32 q15, #150 ; 0x00000096 + 1f3530c: e59d5050 ldr r5, [sp, #80] ; 0x50 + 1f35310: f2c1c05d vmov.i32 q14, #29 ; 0x0000001d + 1f35314: e1a0c000 mov ip, r0 + 1f35318: e1a02001 mov r2, r1 + 1f3531c: f462654f vld3.16 {d22,d24,d26}, [r2] + 1f35320: e2823018 add r3, r2, #24 + 1f35324: e28ee001 add lr, lr, #1 + 1f35328: e2822030 add r2, r2, #48 ; 0x30 + 1f3532c: e155000e cmp r5, lr + 1f35330: f463754f vld3.16 {d23,d25,d27}, [r3] + 1f35334: f3d04a38 vmovl.u16 q10, d24 + 1f35338: f3d02a39 vmovl.u16 q9, d25 + 1f3533c: f3906a36 vmovl.u16 q3, d22 + 1f35340: f3904a37 vmovl.u16 q2, d23 + 1f35344: f26449fe vmul.i32 q10, q10, q15 + 1f35348: f26229fe vmul.i32 q9, q9, q15 + 1f3534c: f3d06a3b vmovl.u16 q11, d27 + 1f35350: f2664960 vmla.i32 q10, q3, q8 + 1f35354: f2642960 vmla.i32 q9, q2, q8 + 1f35358: f3906a3a vmovl.u16 q3, d26 + 1f3535c: f26629ec vmla.i32 q9, q11, q14 + 1f35360: f266496c vmla.i32 q10, q3, q14 + 1f35364: f2f82072 vshr.s32 q9, q9, #8 + 1f35368: f2f84074 vshr.s32 q10, q10, #8 + 1f3536c: f3f66224 vmovn.i32 d22, q10 + 1f35370: f3f67222 vmovn.i32 d23, q9 + 1f35374: f44c6a4f vst1.16 {d22-d23}, [ip] + 1f35378: e28cc010 add ip, ip, #16 + 1f3537c: 8affffe6 bhi 1f3531c + 1f35380: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f35384: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f35388: e1530002 cmp r3, r2 + 1f3538c: e59d3068 ldr r3, [sp, #104] ; 0x68 + 1f35390: e0812003 add r2, r1, r3 + 1f35394: e59d3044 ldr r3, [sp, #68] ; 0x44 + 1f35398: e0803003 add r3, r0, r3 + 1f3539c: 0afffddd beq 1f34b18 + 1f353a0: e59d603c ldr r6, [sp, #60] ; 0x3c + 1f353a4: e1d250b2 ldrh r5, [r2, #2] + 1f353a8: e3a08096 mov r8, #150 ; 0x96 + 1f353ac: e1d2e0b0 ldrh lr, [r2] + 1f353b0: e3560000 cmp r6, #0 + 1f353b4: e1d2c0b4 ldrh ip, [r2, #4] + 1f353b8: e0050598 mul r5, r8, r5 + 1f353bc: e3a0804d mov r8, #77 ; 0x4d + 1f353c0: e02e5e98 mla lr, r8, lr, r5 + 1f353c4: e3a0501d mov r5, #29 + 1f353c8: e02cec95 mla ip, r5, ip, lr + 1f353cc: e1a0c44c asr ip, ip, #8 + 1f353d0: e1c3c0b0 strh ip, [r3] + 1f353d4: 0afffdcf beq 1f34b18 + 1f353d8: e1d250b8 ldrh r5, [r2, #8] + 1f353dc: e3a08096 mov r8, #150 ; 0x96 + 1f353e0: e1d2e0b6 ldrh lr, [r2, #6] + 1f353e4: e3560001 cmp r6, #1 + 1f353e8: e1d2c0ba ldrh ip, [r2, #10] + 1f353ec: e0050598 mul r5, r8, r5 + 1f353f0: e3a0804d mov r8, #77 ; 0x4d + 1f353f4: e02e5e98 mla lr, r8, lr, r5 + 1f353f8: e3a0501d mov r5, #29 + 1f353fc: e02cec95 mla ip, r5, ip, lr + 1f35400: e1a0c44c asr ip, ip, #8 + 1f35404: e1c3c0b2 strh ip, [r3, #2] + 1f35408: 0afffdc2 beq 1f34b18 + 1f3540c: e1d250be ldrh r5, [r2, #14] + 1f35410: e3a08096 mov r8, #150 ; 0x96 + 1f35414: e1d2e0bc ldrh lr, [r2, #12] + 1f35418: e3560002 cmp r6, #2 + 1f3541c: e1d2c1b0 ldrh ip, [r2, #16] + 1f35420: e0050598 mul r5, r8, r5 + 1f35424: e3a0804d mov r8, #77 ; 0x4d + 1f35428: e02e5e98 mla lr, r8, lr, r5 + 1f3542c: e3a0501d mov r5, #29 + 1f35430: e02cec95 mla ip, r5, ip, lr + 1f35434: e1a0c44c asr ip, ip, #8 + 1f35438: e1c3c0b4 strh ip, [r3, #4] + 1f3543c: 0afffdb5 beq 1f34b18 + 1f35440: e1d251b4 ldrh r5, [r2, #20] + 1f35444: e3a08096 mov r8, #150 ; 0x96 + 1f35448: e1d2e1b2 ldrh lr, [r2, #18] + 1f3544c: e3560003 cmp r6, #3 + 1f35450: e1d2c1b6 ldrh ip, [r2, #22] + 1f35454: e0050598 mul r5, r8, r5 + 1f35458: e3a0804d mov r8, #77 ; 0x4d + 1f3545c: e02e5e98 mla lr, r8, lr, r5 + 1f35460: e3a0501d mov r5, #29 + 1f35464: e02cec95 mla ip, r5, ip, lr + 1f35468: e1a0c44c asr ip, ip, #8 + 1f3546c: e1c3c0b6 strh ip, [r3, #6] + 1f35470: 0afffda8 beq 1f34b18 + 1f35474: e1d251ba ldrh r5, [r2, #26] + 1f35478: e3a08096 mov r8, #150 ; 0x96 + 1f3547c: e1d2e1b8 ldrh lr, [r2, #24] + 1f35480: e3560004 cmp r6, #4 + 1f35484: e1d2c1bc ldrh ip, [r2, #28] + 1f35488: e0050598 mul r5, r8, r5 + 1f3548c: e3a0804d mov r8, #77 ; 0x4d + 1f35490: e02e5e98 mla lr, r8, lr, r5 + 1f35494: e3a0501d mov r5, #29 + 1f35498: e02cec95 mla ip, r5, ip, lr + 1f3549c: e1a0c44c asr ip, ip, #8 + 1f354a0: e1c3c0b8 strh ip, [r3, #8] + 1f354a4: 0afffd9b beq 1f34b18 + 1f354a8: e1d252b0 ldrh r5, [r2, #32] + 1f354ac: e3560005 cmp r6, #5 + 1f354b0: e1d2e1be ldrh lr, [r2, #30] + 1f354b4: e3a06096 mov r6, #150 ; 0x96 + 1f354b8: e1d2c2b2 ldrh ip, [r2, #34] ; 0x22 + 1f354bc: e0050596 mul r5, r6, r5 + 1f354c0: e02e5e98 mla lr, r8, lr, r5 + 1f354c4: e3a0501d mov r5, #29 + 1f354c8: e02cec95 mla ip, r5, ip, lr + 1f354cc: e1a0c44c asr ip, ip, #8 + 1f354d0: e1c3c0ba strh ip, [r3, #10] + 1f354d4: 0afffd8f beq 1f34b18 + 1f354d8: e1d2e2b6 ldrh lr, [r2, #38] ; 0x26 + 1f354dc: e3a05096 mov r5, #150 ; 0x96 + 1f354e0: e1d2c2b4 ldrh ip, [r2, #36] ; 0x24 + 1f354e4: e1d222b8 ldrh r2, [r2, #40] ; 0x28 + 1f354e8: e00e0e95 mul lr, r5, lr + 1f354ec: e3a0504d mov r5, #77 ; 0x4d + 1f354f0: e02eec95 mla lr, r5, ip, lr + 1f354f4: e3a0c01d mov ip, #29 + 1f354f8: e022e29c mla r2, ip, r2, lr + 1f354fc: e1a02442 asr r2, r2, #8 + 1f35500: e1c320bc strh r2, [r3, #12] + 1f35504: eafffd83 b 1f34b18 + 1f35508: e35b0000 cmp fp, #0 + 1f3550c: bafffd81 blt 1f34b18 + 1f35510: e59d5038 ldr r5, [sp, #56] ; 0x38 + 1f35514: e085e00e add lr, r5, lr + 1f35518: e59d5028 ldr r5, [sp, #40] ; 0x28 + 1f3551c: e084e00e add lr, r4, lr + 1f35520: e085c00c add ip, r5, ip + 1f35524: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f35528: e08ac00c add ip, sl, ip + 1f3552c: e151000c cmp r1, ip + 1f35530: 3150000e cmpcc r0, lr + 1f35534: e59de020 ldr lr, [sp, #32] + 1f35538: 23a0c001 movcs ip, #1 + 1f3553c: 33a0c000 movcc ip, #0 + 1f35540: e35e0007 cmp lr, #7 + 1f35544: 93a0e000 movls lr, #0 + 1f35548: 83a0e001 movhi lr, #1 + 1f3554c: e3750001 cmn r5, #1 + 1f35550: b3a0e000 movlt lr, #0 + 1f35554: e11c000e tst ip, lr + 1f35558: 0a00082c beq 1f37610 + 1f3555c: e59de048 ldr lr, [sp, #72] ; 0x48 + 1f35560: e35e0000 cmp lr, #0 + 1f35564: 1a0007dc bne 1f374dc + 1f35568: e1a03000 mov r3, r0 + 1f3556c: e1a0c001 mov ip, r1 + 1f35570: f46c434f vld2.16 {d20-d23}, [ip] + 1f35574: e28ee001 add lr, lr, #1 + 1f35578: e28cc020 add ip, ip, #32 + 1f3557c: e59d2050 ldr r2, [sp, #80] ; 0x50 + 1f35580: e152000e cmp r2, lr + 1f35584: e2832020 add r2, r3, #32 + 1f35588: f26481f4 vorr q12, q10, q10 + 1f3558c: f264a1f4 vorr q13, q10, q10 + 1f35590: f264c1f4 vorr q14, q10, q10 + 1f35594: f266e1f6 vorr q15, q11, q11 + 1f35598: f443814f vst4.16 {d24,d26,d28,d30}, [r3] + 1f3559c: e2833040 add r3, r3, #64 ; 0x40 + 1f355a0: f442914f vst4.16 {d25,d27,d29,d31}, [r2] + 1f355a4: 8afffff1 bhi 1f35570 + 1f355a8: e28d3e13 add r3, sp, #304 ; 0x130 + 1f355ac: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f355b0: ecc38b10 vstmia r3, {d24-d31} + 1f355b4: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f355b8: e1530002 cmp r3, r2 + 1f355bc: e59d3074 ldr r3, [sp, #116] ; 0x74 + 1f355c0: e0812003 add r2, r1, r3 + 1f355c4: e59d3054 ldr r3, [sp, #84] ; 0x54 + 1f355c8: e0803003 add r3, r0, r3 + 1f355cc: 0afffd51 beq 1f34b18 + 1f355d0: e59de03c ldr lr, [sp, #60] ; 0x3c + 1f355d4: e1d2c0b0 ldrh ip, [r2] + 1f355d8: e35e0000 cmp lr, #0 + 1f355dc: e1c3c0b4 strh ip, [r3, #4] + 1f355e0: e1c3c0b2 strh ip, [r3, #2] + 1f355e4: e1c3c0b0 strh ip, [r3] + 1f355e8: e1d2c0b2 ldrh ip, [r2, #2] + 1f355ec: e1c3c0b6 strh ip, [r3, #6] + 1f355f0: 0afffd48 beq 1f34b18 + 1f355f4: e1d2c0b4 ldrh ip, [r2, #4] + 1f355f8: e35e0001 cmp lr, #1 + 1f355fc: e1c3c0bc strh ip, [r3, #12] + 1f35600: e1c3c0ba strh ip, [r3, #10] + 1f35604: e1c3c0b8 strh ip, [r3, #8] + 1f35608: e1d2c0b6 ldrh ip, [r2, #6] + 1f3560c: e1c3c0be strh ip, [r3, #14] + 1f35610: 0afffd40 beq 1f34b18 + 1f35614: e1d2c0b8 ldrh ip, [r2, #8] + 1f35618: e35e0002 cmp lr, #2 + 1f3561c: e1c3c1b4 strh ip, [r3, #20] + 1f35620: e1c3c1b2 strh ip, [r3, #18] + 1f35624: e1c3c1b0 strh ip, [r3, #16] + 1f35628: e1d2c0ba ldrh ip, [r2, #10] + 1f3562c: e1c3c1b6 strh ip, [r3, #22] + 1f35630: 0afffd38 beq 1f34b18 + 1f35634: e1d2c0bc ldrh ip, [r2, #12] + 1f35638: e35e0003 cmp lr, #3 + 1f3563c: e1c3c1bc strh ip, [r3, #28] + 1f35640: e1c3c1ba strh ip, [r3, #26] + 1f35644: e1c3c1b8 strh ip, [r3, #24] + 1f35648: e1d2c0be ldrh ip, [r2, #14] + 1f3564c: e1c3c1be strh ip, [r3, #30] + 1f35650: 0afffd30 beq 1f34b18 + 1f35654: e1d2c1b0 ldrh ip, [r2, #16] + 1f35658: e35e0004 cmp lr, #4 + 1f3565c: e1c3c2b4 strh ip, [r3, #36] ; 0x24 + 1f35660: e1c3c2b2 strh ip, [r3, #34] ; 0x22 + 1f35664: e1c3c2b0 strh ip, [r3, #32] + 1f35668: e1d2c1b2 ldrh ip, [r2, #18] + 1f3566c: e1c3c2b6 strh ip, [r3, #38] ; 0x26 + 1f35670: 0afffd28 beq 1f34b18 + 1f35674: e1d2c1b4 ldrh ip, [r2, #20] + 1f35678: e35e0005 cmp lr, #5 + 1f3567c: e1c3c2bc strh ip, [r3, #44] ; 0x2c + 1f35680: e1c3c2ba strh ip, [r3, #42] ; 0x2a + 1f35684: e1c3c2b8 strh ip, [r3, #40] ; 0x28 + 1f35688: e1d2c1b6 ldrh ip, [r2, #22] + 1f3568c: e1c3c2be strh ip, [r3, #46] ; 0x2e + 1f35690: 0afffd20 beq 1f34b18 + 1f35694: e1d2c1b8 ldrh ip, [r2, #24] + 1f35698: e1c3c3b4 strh ip, [r3, #52] ; 0x34 + 1f3569c: e1c3c3b2 strh ip, [r3, #50] ; 0x32 + 1f356a0: e1c3c3b0 strh ip, [r3, #48] ; 0x30 + 1f356a4: e1d221ba ldrh r2, [r2, #26] + 1f356a8: e1c323b6 strh r2, [r3, #54] ; 0x36 + 1f356ac: eafffd19 b 1f34b18 + 1f356b0: e35b0000 cmp fp, #0 + 1f356b4: bafffd17 blt 1f34b18 + 1f356b8: e59d502c ldr r5, [sp, #44] ; 0x2c + 1f356bc: e085e00e add lr, r5, lr + 1f356c0: e59d5038 ldr r5, [sp, #56] ; 0x38 + 1f356c4: e084e00e add lr, r4, lr + 1f356c8: e085c00c add ip, r5, ip + 1f356cc: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f356d0: e08ac00c add ip, sl, ip + 1f356d4: e151000c cmp r1, ip + 1f356d8: 3150000e cmpcc r0, lr + 1f356dc: e59de020 ldr lr, [sp, #32] + 1f356e0: 23a0c001 movcs ip, #1 + 1f356e4: 33a0c000 movcc ip, #0 + 1f356e8: e35e0007 cmp lr, #7 + 1f356ec: 93a0e000 movls lr, #0 + 1f356f0: 83a0e001 movhi lr, #1 + 1f356f4: e3750001 cmn r5, #1 + 1f356f8: b3a0e000 movlt lr, #0 + 1f356fc: e11c000e tst ip, lr + 1f35700: 0a0007df beq 1f37684 + 1f35704: e59de048 ldr lr, [sp, #72] ; 0x48 + 1f35708: e35e0000 cmp lr, #0 + 1f3570c: 1a00076a bne 1f374bc + 1f35710: e28d3e1f add r3, sp, #496 ; 0x1f0 + 1f35714: f3c1e056 vmov.i32 q15, #150 ; 0x00000096 + 1f35718: f2c1c05d vmov.i32 q14, #29 ; 0x0000001d + 1f3571c: e59d5050 ldr r5, [sp, #80] ; 0x50 + 1f35720: ec838b10 vstmia r3, {d8-d15} + 1f35724: e1a0c000 mov ip, r0 + 1f35728: e1a02001 mov r2, r1 + 1f3572c: f422454f vld3.16 {d4,d6,d8}, [r2] + 1f35730: e2823018 add r3, r2, #24 + 1f35734: f3c7ae5f vmov.i8 q13, #255 ; 0xff + 1f35738: e28ee001 add lr, lr, #1 + 1f3573c: e155000e cmp r5, lr + 1f35740: e2822030 add r2, r2, #48 ; 0x30 + 1f35744: f423554f vld3.16 {d5,d7,d9}, [r3] + 1f35748: f3d04a16 vmovl.u16 q10, d6 + 1f3574c: f3d02a17 vmovl.u16 q9, d7 + 1f35750: f3d06a14 vmovl.u16 q11, d4 + 1f35754: f3900a15 vmovl.u16 q0, d5 + 1f35758: f26449fe vmul.i32 q10, q10, q15 + 1f3575c: f26229fe vmul.i32 q9, q9, q15 + 1f35760: f3906a19 vmovl.u16 q3, d9 + 1f35764: f26649e0 vmla.i32 q10, q11, q8 + 1f35768: f2602960 vmla.i32 q9, q0, q8 + 1f3576c: f3d06a18 vmovl.u16 q11, d8 + 1f35770: f266296c vmla.i32 q9, q3, q14 + 1f35774: f26649ec vmla.i32 q10, q11, q14 + 1f35778: f2f82072 vshr.s32 q9, q9, #8 + 1f3577c: f2f84074 vshr.s32 q10, q10, #8 + 1f35780: f3f68224 vmovn.i32 d24, q10 + 1f35784: f3f69222 vmovn.i32 d25, q9 + 1f35788: f44c834f vst2.16 {d24-d27}, [ip] + 1f3578c: e28cc020 add ip, ip, #32 + 1f35790: 8affffe5 bhi 1f3572c + 1f35794: e28d3e11 add r3, sp, #272 ; 0x110 + 1f35798: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f3579c: f44382df vst1.64 {d24-d27}, [r3 :64] + 1f357a0: e28d3e1f add r3, sp, #496 ; 0x1f0 + 1f357a4: ec938b10 vldmia r3, {d8-d15} + 1f357a8: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f357ac: e1530002 cmp r3, r2 + 1f357b0: e59d3068 ldr r3, [sp, #104] ; 0x68 + 1f357b4: e0812003 add r2, r1, r3 + 1f357b8: e59d3074 ldr r3, [sp, #116] ; 0x74 + 1f357bc: e0803003 add r3, r0, r3 + 1f357c0: 0afffcd4 beq 1f34b18 + 1f357c4: e59d603c ldr r6, [sp, #60] ; 0x3c + 1f357c8: e1d2c0b2 ldrh ip, [r2, #2] + 1f357cc: e3a05096 mov r5, #150 ; 0x96 + 1f357d0: e1d2e0b0 ldrh lr, [r2] + 1f357d4: e3560000 cmp r6, #0 + 1f357d8: e00c0c95 mul ip, r5, ip + 1f357dc: e3a0504d mov r5, #77 ; 0x4d + 1f357e0: e02ece95 mla lr, r5, lr, ip + 1f357e4: e1d2c0b4 ldrh ip, [r2, #4] + 1f357e8: e3e05000 mvn r5, #0 + 1f357ec: e1c350b2 strh r5, [r3, #2] + 1f357f0: e3a0501d mov r5, #29 + 1f357f4: e02cec95 mla ip, r5, ip, lr + 1f357f8: e1a0c44c asr ip, ip, #8 + 1f357fc: e1c3c0b0 strh ip, [r3] + 1f35800: 0afffcc4 beq 1f34b18 + 1f35804: e1d250b8 ldrh r5, [r2, #8] + 1f35808: e3a08096 mov r8, #150 ; 0x96 + 1f3580c: e1d2e0b6 ldrh lr, [r2, #6] + 1f35810: e3560001 cmp r6, #1 + 1f35814: e1d2c0ba ldrh ip, [r2, #10] + 1f35818: e0050598 mul r5, r8, r5 + 1f3581c: e3a0804d mov r8, #77 ; 0x4d + 1f35820: e02e5e98 mla lr, r8, lr, r5 + 1f35824: e3e05000 mvn r5, #0 + 1f35828: e1c350b6 strh r5, [r3, #6] + 1f3582c: e3a0501d mov r5, #29 + 1f35830: e02cec95 mla ip, r5, ip, lr + 1f35834: e1a0c44c asr ip, ip, #8 + 1f35838: e1c3c0b4 strh ip, [r3, #4] + 1f3583c: 0afffcb5 beq 1f34b18 + 1f35840: e1d250be ldrh r5, [r2, #14] + 1f35844: e3a08096 mov r8, #150 ; 0x96 + 1f35848: e1d2e0bc ldrh lr, [r2, #12] + 1f3584c: e3560002 cmp r6, #2 + 1f35850: e1d2c1b0 ldrh ip, [r2, #16] + 1f35854: e0050598 mul r5, r8, r5 + 1f35858: e3a0804d mov r8, #77 ; 0x4d + 1f3585c: e02e5e98 mla lr, r8, lr, r5 + 1f35860: e3e05000 mvn r5, #0 + 1f35864: e1c350ba strh r5, [r3, #10] + 1f35868: e3a0501d mov r5, #29 + 1f3586c: e02cec95 mla ip, r5, ip, lr + 1f35870: e1a0c44c asr ip, ip, #8 + 1f35874: e1c3c0b8 strh ip, [r3, #8] + 1f35878: 0afffca6 beq 1f34b18 + 1f3587c: e1d251b4 ldrh r5, [r2, #20] + 1f35880: e3a08096 mov r8, #150 ; 0x96 + 1f35884: e1d2e1b2 ldrh lr, [r2, #18] + 1f35888: e3560003 cmp r6, #3 + 1f3588c: e1d2c1b6 ldrh ip, [r2, #22] + 1f35890: e0050598 mul r5, r8, r5 + 1f35894: e3a0804d mov r8, #77 ; 0x4d + 1f35898: e02e5e98 mla lr, r8, lr, r5 + 1f3589c: e3e05000 mvn r5, #0 + 1f358a0: e1c350be strh r5, [r3, #14] + 1f358a4: e3a0501d mov r5, #29 + 1f358a8: e02cec95 mla ip, r5, ip, lr + 1f358ac: e1a0c44c asr ip, ip, #8 + 1f358b0: e1c3c0bc strh ip, [r3, #12] + 1f358b4: 0afffc97 beq 1f34b18 + 1f358b8: e1d251ba ldrh r5, [r2, #26] + 1f358bc: e3a08096 mov r8, #150 ; 0x96 + 1f358c0: e1d2e1b8 ldrh lr, [r2, #24] + 1f358c4: e3560004 cmp r6, #4 + 1f358c8: e1d2c1bc ldrh ip, [r2, #28] + 1f358cc: e0050598 mul r5, r8, r5 + 1f358d0: e3a0804d mov r8, #77 ; 0x4d + 1f358d4: e02e5e98 mla lr, r8, lr, r5 + 1f358d8: e3e05000 mvn r5, #0 + 1f358dc: e1c351b2 strh r5, [r3, #18] + 1f358e0: e3a0501d mov r5, #29 + 1f358e4: e02cec95 mla ip, r5, ip, lr + 1f358e8: e1a0c44c asr ip, ip, #8 + 1f358ec: e1c3c1b0 strh ip, [r3, #16] + 1f358f0: 0afffc88 beq 1f34b18 + 1f358f4: e1d252b0 ldrh r5, [r2, #32] + 1f358f8: e3560005 cmp r6, #5 + 1f358fc: e1d2e1be ldrh lr, [r2, #30] + 1f35900: e3a06096 mov r6, #150 ; 0x96 + 1f35904: e1d2c2b2 ldrh ip, [r2, #34] ; 0x22 + 1f35908: e0050596 mul r5, r6, r5 + 1f3590c: e02e5e98 mla lr, r8, lr, r5 + 1f35910: e3e05000 mvn r5, #0 + 1f35914: e1c351b6 strh r5, [r3, #22] + 1f35918: e3a0501d mov r5, #29 + 1f3591c: e02cec95 mla ip, r5, ip, lr + 1f35920: e1a0c44c asr ip, ip, #8 + 1f35924: e1c3c1b4 strh ip, [r3, #20] + 1f35928: 0afffc7a beq 1f34b18 + 1f3592c: e1d2e2b6 ldrh lr, [r2, #38] ; 0x26 + 1f35930: e3a05096 mov r5, #150 ; 0x96 + 1f35934: e1d2c2b4 ldrh ip, [r2, #36] ; 0x24 + 1f35938: e1d222b8 ldrh r2, [r2, #40] ; 0x28 + 1f3593c: e00e0e95 mul lr, r5, lr + 1f35940: e3a0504d mov r5, #77 ; 0x4d + 1f35944: e02eec95 mla lr, r5, ip, lr + 1f35948: e3e0c000 mvn ip, #0 + 1f3594c: e1c3c1ba strh ip, [r3, #26] + 1f35950: e3a0c01d mov ip, #29 + 1f35954: e022e29c mla r2, ip, r2, lr + 1f35958: e1a02442 asr r2, r2, #8 + 1f3595c: e1c321b8 strh r2, [r3, #24] + 1f35960: eafffc6c b 1f34b18 + 1f35964: e35b0000 cmp fp, #0 + 1f35968: bafffc6a blt 1f34b18 + 1f3596c: e59d5038 ldr r5, [sp, #56] ; 0x38 + 1f35970: e085e00e add lr, r5, lr + 1f35974: e59d502c ldr r5, [sp, #44] ; 0x2c + 1f35978: e084e00e add lr, r4, lr + 1f3597c: e085c00c add ip, r5, ip + 1f35980: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f35984: e08ac00c add ip, sl, ip + 1f35988: e151000c cmp r1, ip + 1f3598c: 3150000e cmpcc r0, lr + 1f35990: e59de020 ldr lr, [sp, #32] + 1f35994: 23a0c001 movcs ip, #1 + 1f35998: 33a0c000 movcc ip, #0 + 1f3599c: e35e0007 cmp lr, #7 + 1f359a0: 93a0e000 movls lr, #0 + 1f359a4: 83a0e001 movhi lr, #1 + 1f359a8: e3750001 cmn r5, #1 + 1f359ac: b3a0e000 movlt lr, #0 + 1f359b0: e11c000e tst ip, lr + 1f359b4: 0a000790 beq 1f377fc + 1f359b8: e59de064 ldr lr, [sp, #100] ; 0x64 + 1f359bc: e35e0000 cmp lr, #0 + 1f359c0: 1a0006c1 bne 1f374cc + 1f359c4: e1a03000 mov r3, r0 + 1f359c8: e1a0c001 mov ip, r1 + 1f359cc: f46cc34f vld2.16 {d28-d31}, [ip] + 1f359d0: e28ee001 add lr, lr, #1 + 1f359d4: e28cc020 add ip, ip, #32 + 1f359d8: e59d206c ldr r2, [sp, #108] ; 0x6c + 1f359dc: e15e0002 cmp lr, r2 + 1f359e0: e2832018 add r2, r3, #24 + 1f359e4: f26c61fc vorr q11, q14, q14 + 1f359e8: f26c81fc vorr q12, q14, q14 + 1f359ec: f26ca1fc vorr q13, q14, q14 + 1f359f0: f443654f vst3.16 {d22,d24,d26}, [r3] + 1f359f4: e2833030 add r3, r3, #48 ; 0x30 + 1f359f8: f442754f vst3.16 {d23,d25,d27}, [r2] + 1f359fc: 3afffff2 bcc 1f359cc + 1f35a00: e28d3e17 add r3, sp, #368 ; 0x170 + 1f35a04: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f35a08: ecc36b0c vstmia r3, {d22-d27} + 1f35a0c: e59d3040 ldr r3, [sp, #64] ; 0x40 + 1f35a10: e1530002 cmp r3, r2 + 1f35a14: e59d3078 ldr r3, [sp, #120] ; 0x78 + 1f35a18: e0812003 add r2, r1, r3 + 1f35a1c: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f35a20: e0803003 add r3, r0, r3 + 1f35a24: 0afffc3b beq 1f34b18 + 1f35a28: e59de070 ldr lr, [sp, #112] ; 0x70 + 1f35a2c: e35e0000 cmp lr, #0 + 1f35a30: e1d2c0b0 ldrh ip, [r2] + 1f35a34: e1c3c0b4 strh ip, [r3, #4] + 1f35a38: e1c3c0b2 strh ip, [r3, #2] + 1f35a3c: e1c3c0b0 strh ip, [r3] + 1f35a40: 0afffc34 beq 1f34b18 + 1f35a44: e35e0001 cmp lr, #1 + 1f35a48: e1d2c0b4 ldrh ip, [r2, #4] + 1f35a4c: e1c3c0ba strh ip, [r3, #10] + 1f35a50: e1c3c0b8 strh ip, [r3, #8] + 1f35a54: e1c3c0b6 strh ip, [r3, #6] + 1f35a58: 0afffc2e beq 1f34b18 + 1f35a5c: e35e0002 cmp lr, #2 + 1f35a60: e1d2c0b8 ldrh ip, [r2, #8] + 1f35a64: e1c3c1b0 strh ip, [r3, #16] + 1f35a68: e1c3c0be strh ip, [r3, #14] + 1f35a6c: e1c3c0bc strh ip, [r3, #12] + 1f35a70: 0afffc28 beq 1f34b18 + 1f35a74: e35e0003 cmp lr, #3 + 1f35a78: e1d2c0bc ldrh ip, [r2, #12] + 1f35a7c: e1c3c1b6 strh ip, [r3, #22] + 1f35a80: e1c3c1b4 strh ip, [r3, #20] + 1f35a84: e1c3c1b2 strh ip, [r3, #18] + 1f35a88: 0afffc22 beq 1f34b18 + 1f35a8c: e35e0004 cmp lr, #4 + 1f35a90: e1d2c1b0 ldrh ip, [r2, #16] + 1f35a94: e1c3c1bc strh ip, [r3, #28] + 1f35a98: e1c3c1ba strh ip, [r3, #26] + 1f35a9c: e1c3c1b8 strh ip, [r3, #24] + 1f35aa0: 0afffc1c beq 1f34b18 + 1f35aa4: e35e0005 cmp lr, #5 + 1f35aa8: e1d2c1b4 ldrh ip, [r2, #20] + 1f35aac: e1c3c2b2 strh ip, [r3, #34] ; 0x22 + 1f35ab0: e1c3c2b0 strh ip, [r3, #32] + 1f35ab4: e1c3c1be strh ip, [r3, #30] + 1f35ab8: 0afffc16 beq 1f34b18 + 1f35abc: e35e0006 cmp lr, #6 + 1f35ac0: e1d2c1b8 ldrh ip, [r2, #24] + 1f35ac4: e1c3c2b8 strh ip, [r3, #40] ; 0x28 + 1f35ac8: e1c3c2b6 strh ip, [r3, #38] ; 0x26 + 1f35acc: e1c3c2b4 strh ip, [r3, #36] ; 0x24 + 1f35ad0: 0afffc10 beq 1f34b18 + 1f35ad4: e35e0007 cmp lr, #7 + 1f35ad8: e1d2c1bc ldrh ip, [r2, #28] + 1f35adc: e1c3c2be strh ip, [r3, #46] ; 0x2e + 1f35ae0: e1c3c2bc strh ip, [r3, #44] ; 0x2c + 1f35ae4: e1c3c2ba strh ip, [r3, #42] ; 0x2a + 1f35ae8: 0afffc0a beq 1f34b18 + 1f35aec: e35e0008 cmp lr, #8 + 1f35af0: e1d2c2b0 ldrh ip, [r2, #32] + 1f35af4: e1c3c3b4 strh ip, [r3, #52] ; 0x34 + 1f35af8: e1c3c3b2 strh ip, [r3, #50] ; 0x32 + 1f35afc: e1c3c3b0 strh ip, [r3, #48] ; 0x30 + 1f35b00: 0afffc04 beq 1f34b18 + 1f35b04: e35e0009 cmp lr, #9 + 1f35b08: e1d2c2b4 ldrh ip, [r2, #36] ; 0x24 + 1f35b0c: e1c3c3ba strh ip, [r3, #58] ; 0x3a + 1f35b10: e1c3c3b8 strh ip, [r3, #56] ; 0x38 + 1f35b14: e1c3c3b6 strh ip, [r3, #54] ; 0x36 + 1f35b18: 0afffbfe beq 1f34b18 + 1f35b1c: e35e000a cmp lr, #10 + 1f35b20: e1d2c2b8 ldrh ip, [r2, #40] ; 0x28 + 1f35b24: e1c3c4b0 strh ip, [r3, #64] ; 0x40 + 1f35b28: e1c3c3be strh ip, [r3, #62] ; 0x3e + 1f35b2c: e1c3c3bc strh ip, [r3, #60] ; 0x3c + 1f35b30: 0afffbf8 beq 1f34b18 + 1f35b34: e35e000b cmp lr, #11 + 1f35b38: e1d2c2bc ldrh ip, [r2, #44] ; 0x2c + 1f35b3c: e1c3c4b6 strh ip, [r3, #70] ; 0x46 + 1f35b40: e1c3c4b4 strh ip, [r3, #68] ; 0x44 + 1f35b44: e1c3c4b2 strh ip, [r3, #66] ; 0x42 + 1f35b48: 0afffbf2 beq 1f34b18 + 1f35b4c: e35e000c cmp lr, #12 + 1f35b50: e1d2c3b0 ldrh ip, [r2, #48] ; 0x30 + 1f35b54: e1c3c4bc strh ip, [r3, #76] ; 0x4c + 1f35b58: e1c3c4ba strh ip, [r3, #74] ; 0x4a + 1f35b5c: e1c3c4b8 strh ip, [r3, #72] ; 0x48 + 1f35b60: 0afffbec beq 1f34b18 + 1f35b64: e35e000d cmp lr, #13 + 1f35b68: e1d2c3b4 ldrh ip, [r2, #52] ; 0x34 + 1f35b6c: e1c3c5b2 strh ip, [r3, #82] ; 0x52 + 1f35b70: e1c3c5b0 strh ip, [r3, #80] ; 0x50 + 1f35b74: e1c3c4be strh ip, [r3, #78] ; 0x4e + 1f35b78: 11d223b8 ldrhne r2, [r2, #56] ; 0x38 + 1f35b7c: 11c325b8 strhne r2, [r3, #88] ; 0x58 + 1f35b80: 11c325b6 strhne r2, [r3, #86] ; 0x56 + 1f35b84: 11c325b4 strhne r2, [r3, #84] ; 0x54 + 1f35b88: eafffbe2 b 1f34b18 + 1f35b8c: e35b0000 cmp fp, #0 + 1f35b90: bafffbe0 blt 1f34b18 + 1f35b94: e59d5028 ldr r5, [sp, #40] ; 0x28 + 1f35b98: e085c00c add ip, r5, ip + 1f35b9c: e59d5030 ldr r5, [sp, #48] ; 0x30 + 1f35ba0: e08ac00c add ip, sl, ip + 1f35ba4: e085e00e add lr, r5, lr + 1f35ba8: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f35bac: e084e00e add lr, r4, lr + 1f35bb0: e150000e cmp r0, lr + 1f35bb4: 3151000c cmpcc r1, ip + 1f35bb8: e59de020 ldr lr, [sp, #32] + 1f35bbc: 23a0c001 movcs ip, #1 + 1f35bc0: 33a0c000 movcc ip, #0 + 1f35bc4: e35e0007 cmp lr, #7 + 1f35bc8: 93a0e000 movls lr, #0 + 1f35bcc: 83a0e001 movhi lr, #1 + 1f35bd0: e3750001 cmn r5, #1 + 1f35bd4: b3a0e000 movlt lr, #0 + 1f35bd8: e11c000e tst ip, lr + 1f35bdc: 0a00069a beq 1f3764c + 1f35be0: e59de048 ldr lr, [sp, #72] ; 0x48 + 1f35be4: e35e0000 cmp lr, #0 + 1f35be8: 1a00063d bne 1f374e4 + 1f35bec: e1a0c001 mov ip, r1 + 1f35bf0: e1a03000 mov r3, r0 + 1f35bf4: f46c2a4f vld1.16 {d18-d19}, [ip] + 1f35bf8: f387ee5f vmov.i8 q7, #255 ; 0xff + 1f35bfc: e59d2050 ldr r2, [sp, #80] ; 0x50 + 1f35c00: e28ee001 add lr, lr, #1 + 1f35c04: e28cc010 add ip, ip, #16 + 1f35c08: e15e0002 cmp lr, r2 + 1f35c0c: e2832020 add r2, r3, #32 + 1f35c10: f22281f2 vorr q4, q9, q9 + 1f35c14: f222a1f2 vorr q5, q9, q9 + 1f35c18: f222c1f2 vorr q6, q9, q9 + 1f35c1c: f403814f vst4.16 {d8,d10,d12,d14}, [r3] + 1f35c20: e2833040 add r3, r3, #64 ; 0x40 + 1f35c24: f402914f vst4.16 {d9,d11,d13,d15}, [r2] + 1f35c28: 3afffff1 bcc 1f35bf4 + 1f35c2c: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f35c30: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f35c34: e1530002 cmp r3, r2 + 1f35c38: e59d3044 ldr r3, [sp, #68] ; 0x44 + 1f35c3c: e0812003 add r2, r1, r3 + 1f35c40: e59d3054 ldr r3, [sp, #84] ; 0x54 + 1f35c44: e0803003 add r3, r0, r3 + 1f35c48: 0afffbb2 beq 1f34b18 + 1f35c4c: e59de03c ldr lr, [sp, #60] ; 0x3c + 1f35c50: e35e0000 cmp lr, #0 + 1f35c54: e1d2c0b0 ldrh ip, [r2] + 1f35c58: e3e05000 mvn r5, #0 + 1f35c5c: e1c3c0b4 strh ip, [r3, #4] + 1f35c60: e1c3c0b2 strh ip, [r3, #2] + 1f35c64: e1c3c0b0 strh ip, [r3] + 1f35c68: e1c350b6 strh r5, [r3, #6] + 1f35c6c: 0afffba9 beq 1f34b18 + 1f35c70: e35e0001 cmp lr, #1 + 1f35c74: e1d2c0b2 ldrh ip, [r2, #2] + 1f35c78: e1c3c0bc strh ip, [r3, #12] + 1f35c7c: e1c3c0ba strh ip, [r3, #10] + 1f35c80: e1c3c0b8 strh ip, [r3, #8] + 1f35c84: e1c350be strh r5, [r3, #14] + 1f35c88: 0afffba2 beq 1f34b18 + 1f35c8c: e35e0002 cmp lr, #2 + 1f35c90: e1d2c0b4 ldrh ip, [r2, #4] + 1f35c94: e1c3c1b4 strh ip, [r3, #20] + 1f35c98: e1c3c1b2 strh ip, [r3, #18] + 1f35c9c: e1c3c1b0 strh ip, [r3, #16] + 1f35ca0: e1c351b6 strh r5, [r3, #22] + 1f35ca4: 0afffb9b beq 1f34b18 + 1f35ca8: e35e0003 cmp lr, #3 + 1f35cac: e1d2c0b6 ldrh ip, [r2, #6] + 1f35cb0: e1c3c1bc strh ip, [r3, #28] + 1f35cb4: e1c3c1ba strh ip, [r3, #26] + 1f35cb8: e1c3c1b8 strh ip, [r3, #24] + 1f35cbc: e1c351be strh r5, [r3, #30] + 1f35cc0: 0afffb94 beq 1f34b18 + 1f35cc4: e35e0004 cmp lr, #4 + 1f35cc8: e1d2c0b8 ldrh ip, [r2, #8] + 1f35ccc: e1c3c2b4 strh ip, [r3, #36] ; 0x24 + 1f35cd0: e1c3c2b2 strh ip, [r3, #34] ; 0x22 + 1f35cd4: e1c3c2b0 strh ip, [r3, #32] + 1f35cd8: e1c352b6 strh r5, [r3, #38] ; 0x26 + 1f35cdc: 0afffb8d beq 1f34b18 + 1f35ce0: e35e0005 cmp lr, #5 + 1f35ce4: e1d2c0ba ldrh ip, [r2, #10] + 1f35ce8: e1c3c2bc strh ip, [r3, #44] ; 0x2c + 1f35cec: e1c3c2ba strh ip, [r3, #42] ; 0x2a + 1f35cf0: e1c3c2b8 strh ip, [r3, #40] ; 0x28 + 1f35cf4: e1c352be strh r5, [r3, #46] ; 0x2e + 1f35cf8: 0afffb86 beq 1f34b18 + 1f35cfc: e1d220bc ldrh r2, [r2, #12] + 1f35d00: e1c323b4 strh r2, [r3, #52] ; 0x34 + 1f35d04: e1c323b2 strh r2, [r3, #50] ; 0x32 + 1f35d08: e1c323b0 strh r2, [r3, #48] ; 0x30 + 1f35d0c: e1c353b6 strh r5, [r3, #54] ; 0x36 + 1f35d10: eafffb80 b 1f34b18 + 1f35d14: e35b0000 cmp fp, #0 + 1f35d18: bafffb7e blt 1f34b18 + 1f35d1c: e59d502c ldr r5, [sp, #44] ; 0x2c + 1f35d20: e085c00c add ip, r5, ip + 1f35d24: e59d5030 ldr r5, [sp, #48] ; 0x30 + 1f35d28: e08ac00c add ip, sl, ip + 1f35d2c: e085e00e add lr, r5, lr + 1f35d30: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f35d34: e084e00e add lr, r4, lr + 1f35d38: e150000e cmp r0, lr + 1f35d3c: 3151000c cmpcc r1, ip + 1f35d40: e59de020 ldr lr, [sp, #32] + 1f35d44: 23a0c001 movcs ip, #1 + 1f35d48: 33a0c000 movcc ip, #0 + 1f35d4c: e35e0007 cmp lr, #7 + 1f35d50: 93a0e000 movls lr, #0 + 1f35d54: 83a0e001 movhi lr, #1 + 1f35d58: e3750001 cmn r5, #1 + 1f35d5c: b3a0e000 movlt lr, #0 + 1f35d60: e11c000e tst ip, lr + 1f35d64: 0a000672 beq 1f37734 + 1f35d68: e59de048 ldr lr, [sp, #72] ; 0x48 + 1f35d6c: e35e0000 cmp lr, #0 + 1f35d70: 1a0005cf bne 1f374b4 + 1f35d74: e1a0c001 mov ip, r1 + 1f35d78: e1a03000 mov r3, r0 + 1f35d7c: f46c2a4f vld1.16 {d18-d19}, [ip] + 1f35d80: e28ee001 add lr, lr, #1 + 1f35d84: e59d2050 ldr r2, [sp, #80] ; 0x50 + 1f35d88: e28cc010 add ip, ip, #16 + 1f35d8c: e15e0002 cmp lr, r2 + 1f35d90: e2832018 add r2, r3, #24 + 1f35d94: f26261f2 vorr q11, q9, q9 + 1f35d98: f26281f2 vorr q12, q9, q9 + 1f35d9c: f262a1f2 vorr q13, q9, q9 + 1f35da0: f443654f vst3.16 {d22,d24,d26}, [r3] + 1f35da4: e2833030 add r3, r3, #48 ; 0x30 + 1f35da8: f442754f vst3.16 {d23,d25,d27}, [r2] + 1f35dac: 3afffff2 bcc 1f35d7c + 1f35db0: e28d3e1a add r3, sp, #416 ; 0x1a0 + 1f35db4: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f35db8: ecc36b0c vstmia r3, {d22-d27} + 1f35dbc: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f35dc0: e1530002 cmp r3, r2 + 1f35dc4: e59d3044 ldr r3, [sp, #68] ; 0x44 + 1f35dc8: e0812003 add r2, r1, r3 + 1f35dcc: e59d3068 ldr r3, [sp, #104] ; 0x68 + 1f35dd0: e0803003 add r3, r0, r3 + 1f35dd4: 0afffb4f beq 1f34b18 + 1f35dd8: e59dc03c ldr ip, [sp, #60] ; 0x3c + 1f35ddc: e35c0000 cmp ip, #0 + 1f35de0: e1d2e0b0 ldrh lr, [r2] + 1f35de4: e1c3e0b4 strh lr, [r3, #4] + 1f35de8: e1c3e0b2 strh lr, [r3, #2] + 1f35dec: e1c3e0b0 strh lr, [r3] + 1f35df0: 0afffb48 beq 1f34b18 + 1f35df4: e35c0001 cmp ip, #1 + 1f35df8: e1d2e0b2 ldrh lr, [r2, #2] + 1f35dfc: e1c3e0ba strh lr, [r3, #10] + 1f35e00: e1c3e0b8 strh lr, [r3, #8] + 1f35e04: e1c3e0b6 strh lr, [r3, #6] + 1f35e08: 0afffb42 beq 1f34b18 + 1f35e0c: e35c0002 cmp ip, #2 + 1f35e10: e1d2e0b4 ldrh lr, [r2, #4] + 1f35e14: e1c3e1b0 strh lr, [r3, #16] + 1f35e18: e1c3e0be strh lr, [r3, #14] + 1f35e1c: e1c3e0bc strh lr, [r3, #12] + 1f35e20: 0afffb3c beq 1f34b18 + 1f35e24: e35c0003 cmp ip, #3 + 1f35e28: e1d2e0b6 ldrh lr, [r2, #6] + 1f35e2c: e1c3e1b6 strh lr, [r3, #22] + 1f35e30: e1c3e1b4 strh lr, [r3, #20] + 1f35e34: e1c3e1b2 strh lr, [r3, #18] + 1f35e38: 0afffb36 beq 1f34b18 + 1f35e3c: e35c0004 cmp ip, #4 + 1f35e40: e1d2e0b8 ldrh lr, [r2, #8] + 1f35e44: e1c3e1bc strh lr, [r3, #28] + 1f35e48: e1c3e1ba strh lr, [r3, #26] + 1f35e4c: e1c3e1b8 strh lr, [r3, #24] + 1f35e50: 0afffb30 beq 1f34b18 + 1f35e54: e35c0005 cmp ip, #5 + 1f35e58: e1d2c0ba ldrh ip, [r2, #10] + 1f35e5c: e1c3c2b2 strh ip, [r3, #34] ; 0x22 + 1f35e60: e1c3c2b0 strh ip, [r3, #32] + 1f35e64: e1c3c1be strh ip, [r3, #30] + 1f35e68: 11d220bc ldrhne r2, [r2, #12] + 1f35e6c: 11c322b8 strhne r2, [r3, #40] ; 0x28 + 1f35e70: 11c322b6 strhne r2, [r3, #38] ; 0x26 + 1f35e74: 11c322b4 strhne r2, [r3, #36] ; 0x24 + 1f35e78: eafffb26 b 1f34b18 + 1f35e7c: e35b0000 cmp fp, #0 + 1f35e80: bafffb24 blt 1f34b18 + 1f35e84: e59d5028 ldr r5, [sp, #40] ; 0x28 + 1f35e88: e085e00e add lr, r5, lr + 1f35e8c: e59d5038 ldr r5, [sp, #56] ; 0x38 + 1f35e90: e084e00e add lr, r4, lr + 1f35e94: e085c00c add ip, r5, ip + 1f35e98: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f35e9c: e08ac00c add ip, sl, ip + 1f35ea0: e151000c cmp r1, ip + 1f35ea4: 3150000e cmpcc r0, lr + 1f35ea8: e59de020 ldr lr, [sp, #32] + 1f35eac: 23a0c001 movcs ip, #1 + 1f35eb0: 33a0c000 movcc ip, #0 + 1f35eb4: e35e0007 cmp lr, #7 + 1f35eb8: 93a0e000 movls lr, #0 + 1f35ebc: 83a0e001 movhi lr, #1 + 1f35ec0: e3750001 cmn r5, #1 + 1f35ec4: b3a0e000 movlt lr, #0 + 1f35ec8: e11c000e tst ip, lr + 1f35ecc: 0a000602 beq 1f376dc + 1f35ed0: e59de048 ldr lr, [sp, #72] ; 0x48 + 1f35ed4: e35e0000 cmp lr, #0 + 1f35ed8: 1a000579 bne 1f374c4 + 1f35edc: f3816056 vmov.i32 q3, #150 ; 0x00000096 + 1f35ee0: e59d5050 ldr r5, [sp, #80] ; 0x50 + 1f35ee4: f2c1605d vmov.i32 q11, #29 ; 0x0000001d + 1f35ee8: e1a0c000 mov ip, r0 + 1f35eec: e1a02001 mov r2, r1 + 1f35ef0: f462814f vld4.16 {d24,d26,d28,d30}, [r2] + 1f35ef4: e2823020 add r3, r2, #32 + 1f35ef8: e28ee001 add lr, lr, #1 + 1f35efc: e2822040 add r2, r2, #64 ; 0x40 + 1f35f00: e155000e cmp r5, lr + 1f35f04: f463914f vld4.16 {d25,d27,d29,d31}, [r3] + 1f35f08: e28d3080 add r3, sp, #128 ; 0x80 + 1f35f0c: f3d04a3a vmovl.u16 q10, d26 + 1f35f10: f3d02a3b vmovl.u16 q9, d27 + 1f35f14: f3902a38 vmovl.u16 q1, d24 + 1f35f18: f3904a39 vmovl.u16 q2, d25 + 1f35f1c: f26449d6 vmul.i32 q10, q10, q3 + 1f35f20: f26229d6 vmul.i32 q9, q9, q3 + 1f35f24: edcdeb24 vstr d30, [sp, #144] ; 0x90 + 1f35f28: edcdfb26 vstr d31, [sp, #152] ; 0x98 + 1f35f2c: f2624960 vmla.i32 q10, q1, q8 + 1f35f30: f2642960 vmla.i32 q9, q2, q8 + 1f35f34: f3902a3c vmovl.u16 q1, d28 + 1f35f38: f3904a3d vmovl.u16 q2, d29 + 1f35f3c: f2624966 vmla.i32 q10, q1, q11 + 1f35f40: f2642966 vmla.i32 q9, q2, q11 + 1f35f44: f2f84074 vshr.s32 q10, q10, #8 + 1f35f48: f2f82072 vshr.s32 q9, q9, #8 + 1f35f4c: f3b64224 vmovn.i32 d4, q10 + 1f35f50: f3b65222 vmovn.i32 d5, q9 + 1f35f54: ed8d4b20 vstr d4, [sp, #128] ; 0x80 + 1f35f58: ed8d5b22 vstr d5, [sp, #136] ; 0x88 + 1f35f5c: f46322df vld1.64 {d18-d21}, [r3 :64] + 1f35f60: f44c234f vst2.16 {d18-d21}, [ip] + 1f35f64: e28cc020 add ip, ip, #32 + 1f35f68: 8affffe0 bhi 1f35ef0 + 1f35f6c: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f35f70: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f35f74: e1530002 cmp r3, r2 + 1f35f78: e59d3054 ldr r3, [sp, #84] ; 0x54 + 1f35f7c: e0812003 add r2, r1, r3 + 1f35f80: e59d3074 ldr r3, [sp, #116] ; 0x74 + 1f35f84: e0803003 add r3, r0, r3 + 1f35f88: 0afffae2 beq 1f34b18 + 1f35f8c: e59d603c ldr r6, [sp, #60] ; 0x3c + 1f35f90: e1d250b2 ldrh r5, [r2, #2] + 1f35f94: e3a08096 mov r8, #150 ; 0x96 + 1f35f98: e1d2e0b0 ldrh lr, [r2] + 1f35f9c: e3560000 cmp r6, #0 + 1f35fa0: e1d2c0b4 ldrh ip, [r2, #4] + 1f35fa4: e0050598 mul r5, r8, r5 + 1f35fa8: e3a0804d mov r8, #77 ; 0x4d + 1f35fac: e02e5e98 mla lr, r8, lr, r5 + 1f35fb0: e3a0501d mov r5, #29 + 1f35fb4: e02cec95 mla ip, r5, ip, lr + 1f35fb8: e1a0c44c asr ip, ip, #8 + 1f35fbc: e1c3c0b0 strh ip, [r3] + 1f35fc0: e1d2c0b6 ldrh ip, [r2, #6] + 1f35fc4: e1c3c0b2 strh ip, [r3, #2] + 1f35fc8: 0afffad2 beq 1f34b18 + 1f35fcc: e1d250ba ldrh r5, [r2, #10] + 1f35fd0: e3a08096 mov r8, #150 ; 0x96 + 1f35fd4: e1d2e0b8 ldrh lr, [r2, #8] + 1f35fd8: e3560001 cmp r6, #1 + 1f35fdc: e1d2c0bc ldrh ip, [r2, #12] + 1f35fe0: e0050598 mul r5, r8, r5 + 1f35fe4: e3a0804d mov r8, #77 ; 0x4d + 1f35fe8: e02e5e98 mla lr, r8, lr, r5 + 1f35fec: e3a0501d mov r5, #29 + 1f35ff0: e02cec95 mla ip, r5, ip, lr + 1f35ff4: e1a0c44c asr ip, ip, #8 + 1f35ff8: e1c3c0b4 strh ip, [r3, #4] + 1f35ffc: e1d2c0be ldrh ip, [r2, #14] + 1f36000: e1c3c0b6 strh ip, [r3, #6] + 1f36004: 0afffac3 beq 1f34b18 + 1f36008: e1d251b2 ldrh r5, [r2, #18] + 1f3600c: e3a08096 mov r8, #150 ; 0x96 + 1f36010: e1d2e1b0 ldrh lr, [r2, #16] + 1f36014: e3560002 cmp r6, #2 + 1f36018: e1d2c1b4 ldrh ip, [r2, #20] + 1f3601c: e0050598 mul r5, r8, r5 + 1f36020: e3a0804d mov r8, #77 ; 0x4d + 1f36024: e02e5e98 mla lr, r8, lr, r5 + 1f36028: e3a0501d mov r5, #29 + 1f3602c: e02cec95 mla ip, r5, ip, lr + 1f36030: e1a0c44c asr ip, ip, #8 + 1f36034: e1c3c0b8 strh ip, [r3, #8] + 1f36038: e1d2c1b6 ldrh ip, [r2, #22] + 1f3603c: e1c3c0ba strh ip, [r3, #10] + 1f36040: 0afffab4 beq 1f34b18 + 1f36044: e1d251ba ldrh r5, [r2, #26] + 1f36048: e3a08096 mov r8, #150 ; 0x96 + 1f3604c: e1d2e1b8 ldrh lr, [r2, #24] + 1f36050: e3560003 cmp r6, #3 + 1f36054: e1d2c1bc ldrh ip, [r2, #28] + 1f36058: e0050598 mul r5, r8, r5 + 1f3605c: e3a0804d mov r8, #77 ; 0x4d + 1f36060: e02e5e98 mla lr, r8, lr, r5 + 1f36064: e3a0501d mov r5, #29 + 1f36068: e02cec95 mla ip, r5, ip, lr + 1f3606c: e1a0c44c asr ip, ip, #8 + 1f36070: e1c3c0bc strh ip, [r3, #12] + 1f36074: e1d2c1be ldrh ip, [r2, #30] + 1f36078: e1c3c0be strh ip, [r3, #14] + 1f3607c: 0afffaa5 beq 1f34b18 + 1f36080: e1d252b2 ldrh r5, [r2, #34] ; 0x22 + 1f36084: e3a08096 mov r8, #150 ; 0x96 + 1f36088: e1d2e2b0 ldrh lr, [r2, #32] + 1f3608c: e3560004 cmp r6, #4 + 1f36090: e1d2c2b4 ldrh ip, [r2, #36] ; 0x24 + 1f36094: e0050598 mul r5, r8, r5 + 1f36098: e3a0804d mov r8, #77 ; 0x4d + 1f3609c: e02e5e98 mla lr, r8, lr, r5 + 1f360a0: e3a0501d mov r5, #29 + 1f360a4: e02cec95 mla ip, r5, ip, lr + 1f360a8: e1a0c44c asr ip, ip, #8 + 1f360ac: e1c3c1b0 strh ip, [r3, #16] + 1f360b0: e1d2c2b6 ldrh ip, [r2, #38] ; 0x26 + 1f360b4: e1c3c1b2 strh ip, [r3, #18] + 1f360b8: 0afffa96 beq 1f34b18 + 1f360bc: e1d252ba ldrh r5, [r2, #42] ; 0x2a + 1f360c0: e3560005 cmp r6, #5 + 1f360c4: e1d2e2b8 ldrh lr, [r2, #40] ; 0x28 + 1f360c8: e3a06096 mov r6, #150 ; 0x96 + 1f360cc: e1d2c2bc ldrh ip, [r2, #44] ; 0x2c + 1f360d0: e0050596 mul r5, r6, r5 + 1f360d4: e02e5e98 mla lr, r8, lr, r5 + 1f360d8: e3a0501d mov r5, #29 + 1f360dc: e02cec95 mla ip, r5, ip, lr + 1f360e0: e1a0c44c asr ip, ip, #8 + 1f360e4: e1c3c1b4 strh ip, [r3, #20] + 1f360e8: e1d2c2be ldrh ip, [r2, #46] ; 0x2e + 1f360ec: e1c3c1b6 strh ip, [r3, #22] + 1f360f0: 0afffa88 beq 1f34b18 + 1f360f4: e1d253b2 ldrh r5, [r2, #50] ; 0x32 + 1f360f8: e3a06096 mov r6, #150 ; 0x96 + 1f360fc: e1d2e3b0 ldrh lr, [r2, #48] ; 0x30 + 1f36100: e1d2c3b4 ldrh ip, [r2, #52] ; 0x34 + 1f36104: e0050596 mul r5, r6, r5 + 1f36108: e3a0604d mov r6, #77 ; 0x4d + 1f3610c: e02e5e96 mla lr, r6, lr, r5 + 1f36110: e3a0501d mov r5, #29 + 1f36114: e02cec95 mla ip, r5, ip, lr + 1f36118: e1a0c44c asr ip, ip, #8 + 1f3611c: e1c3c1b8 strh ip, [r3, #24] + 1f36120: e1d223b6 ldrh r2, [r2, #54] ; 0x36 + 1f36124: e1c321ba strh r2, [r3, #26] + 1f36128: eafffa7a b 1f34b18 + 1f3612c: e35b0000 cmp fp, #0 + 1f36130: bafffa78 blt 1f34b18 + 1f36134: e59d5038 ldr r5, [sp, #56] ; 0x38 + 1f36138: e085c00c add ip, r5, ip + 1f3613c: e59d5030 ldr r5, [sp, #48] ; 0x30 + 1f36140: e08ac00c add ip, sl, ip + 1f36144: e085e00e add lr, r5, lr + 1f36148: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f3614c: e084e00e add lr, r4, lr + 1f36150: e150000e cmp r0, lr + 1f36154: 3151000c cmpcc r1, ip + 1f36158: e59de020 ldr lr, [sp, #32] + 1f3615c: 23a0c001 movcs ip, #1 + 1f36160: 33a0c000 movcc ip, #0 + 1f36164: e35e0008 cmp lr, #8 + 1f36168: 93a0e000 movls lr, #0 + 1f3616c: 83a0e001 movhi lr, #1 + 1f36170: e3750001 cmn r5, #1 + 1f36174: b3a0e000 movlt lr, #0 + 1f36178: e11c000e tst ip, lr + 1f3617c: 0a000578 beq 1f37764 + 1f36180: e59de048 ldr lr, [sp, #72] ; 0x48 + 1f36184: e35e0000 cmp lr, #0 + 1f36188: 1a0004d7 bne 1f374ec + 1f3618c: e1a0300e mov r3, lr + 1f36190: e59de050 ldr lr, [sp, #80] ; 0x50 + 1f36194: e1a0c001 mov ip, r1 + 1f36198: e1a02000 mov r2, r0 + 1f3619c: f46c4a4f vld1.16 {d20-d21}, [ip] + 1f361a0: f3c76e5f vmov.i8 q11, #255 ; 0xff + 1f361a4: e2833001 add r3, r3, #1 + 1f361a8: e28cc010 add ip, ip, #16 + 1f361ac: e15e0003 cmp lr, r3 + 1f361b0: f442434f vst2.16 {d20-d23}, [r2] + 1f361b4: e2822020 add r2, r2, #32 + 1f361b8: 8afffff7 bhi 1f3619c + 1f361bc: e28d3e1d add r3, sp, #464 ; 0x1d0 + 1f361c0: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f361c4: f44342df vst1.64 {d20-d23}, [r3 :64] + 1f361c8: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f361cc: e1530002 cmp r3, r2 + 1f361d0: e59d3044 ldr r3, [sp, #68] ; 0x44 + 1f361d4: e0812003 add r2, r1, r3 + 1f361d8: e59d3074 ldr r3, [sp, #116] ; 0x74 + 1f361dc: e0803003 add r3, r0, r3 + 1f361e0: 0afffa4c beq 1f34b18 + 1f361e4: e59de03c ldr lr, [sp, #60] ; 0x3c + 1f361e8: e35e0000 cmp lr, #0 + 1f361ec: e1d2c0b0 ldrh ip, [r2] + 1f361f0: e1c3c0b0 strh ip, [r3] + 1f361f4: e3e0c000 mvn ip, #0 + 1f361f8: e1c3c0b2 strh ip, [r3, #2] + 1f361fc: 0afffa45 beq 1f34b18 + 1f36200: e35e0001 cmp lr, #1 + 1f36204: e1d250b2 ldrh r5, [r2, #2] + 1f36208: e1c350b4 strh r5, [r3, #4] + 1f3620c: e1c3c0b6 strh ip, [r3, #6] + 1f36210: 0afffa40 beq 1f34b18 + 1f36214: e35e0002 cmp lr, #2 + 1f36218: e1d250b4 ldrh r5, [r2, #4] + 1f3621c: e1c350b8 strh r5, [r3, #8] + 1f36220: e1c3c0ba strh ip, [r3, #10] + 1f36224: 0afffa3b beq 1f34b18 + 1f36228: e35e0003 cmp lr, #3 + 1f3622c: e1d250b6 ldrh r5, [r2, #6] + 1f36230: e1c350bc strh r5, [r3, #12] + 1f36234: e1c3c0be strh ip, [r3, #14] + 1f36238: 0afffa36 beq 1f34b18 + 1f3623c: e35e0004 cmp lr, #4 + 1f36240: e1d250b8 ldrh r5, [r2, #8] + 1f36244: e1c351b0 strh r5, [r3, #16] + 1f36248: e1c3c1b2 strh ip, [r3, #18] + 1f3624c: 0afffa31 beq 1f34b18 + 1f36250: e35e0005 cmp lr, #5 + 1f36254: e1d2e0ba ldrh lr, [r2, #10] + 1f36258: e1c3e1b4 strh lr, [r3, #20] + 1f3625c: e1c3c1b6 strh ip, [r3, #22] + 1f36260: 11d220bc ldrhne r2, [r2, #12] + 1f36264: 11c321b8 strhne r2, [r3, #24] + 1f36268: 11c3c1ba strhne ip, [r3, #26] + 1f3626c: eafffa29 b 1f34b18 + 1f36270: e35b0000 cmp fp, #0 + 1f36274: bafffa27 blt 1f34b18 + 1f36278: e59d5028 ldr r5, [sp, #40] ; 0x28 + 1f3627c: e085e00e add lr, r5, lr + 1f36280: e59d5030 ldr r5, [sp, #48] ; 0x30 + 1f36284: e084e00e add lr, r4, lr + 1f36288: e085c00c add ip, r5, ip + 1f3628c: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f36290: e08ac00c add ip, sl, ip + 1f36294: e151000c cmp r1, ip + 1f36298: 3150000e cmpcc r0, lr + 1f3629c: e59de020 ldr lr, [sp, #32] + 1f362a0: 23a0c001 movcs ip, #1 + 1f362a4: 33a0c000 movcc ip, #0 + 1f362a8: e35e0007 cmp lr, #7 + 1f362ac: 93a0e000 movls lr, #0 + 1f362b0: 83a0e001 movhi lr, #1 + 1f362b4: e3750001 cmn r5, #1 + 1f362b8: b3a0e000 movlt lr, #0 + 1f362bc: e11c000e tst ip, lr + 1f362c0: 0a0004b7 beq 1f375a4 + 1f362c4: e59de064 ldr lr, [sp, #100] ; 0x64 + 1f362c8: e35e0000 cmp lr, #0 + 1f362cc: 1a00048c bne 1f37504 + 1f362d0: f3816056 vmov.i32 q3, #150 ; 0x00000096 + 1f362d4: e59d506c ldr r5, [sp, #108] ; 0x6c + 1f362d8: f2c1605d vmov.i32 q11, #29 ; 0x0000001d + 1f362dc: e1a0c000 mov ip, r0 + 1f362e0: e1a02001 mov r2, r1 + 1f362e4: f462814f vld4.16 {d24,d26,d28,d30}, [r2] + 1f362e8: e2823020 add r3, r2, #32 + 1f362ec: e28ee001 add lr, lr, #1 + 1f362f0: e2822040 add r2, r2, #64 ; 0x40 + 1f362f4: e155000e cmp r5, lr + 1f362f8: f463914f vld4.16 {d25,d27,d29,d31}, [r3] + 1f362fc: f3d04a3a vmovl.u16 q10, d26 + 1f36300: f3d02a3b vmovl.u16 q9, d27 + 1f36304: f3904a38 vmovl.u16 q2, d24 + 1f36308: f3902a39 vmovl.u16 q1, d25 + 1f3630c: f26449d6 vmul.i32 q10, q10, q3 + 1f36310: f26229d6 vmul.i32 q9, q9, q3 + 1f36314: f3d08a3d vmovl.u16 q12, d29 + 1f36318: f2644960 vmla.i32 q10, q2, q8 + 1f3631c: f2622960 vmla.i32 q9, q1, q8 + 1f36320: f3904a3c vmovl.u16 q2, d28 + 1f36324: f26829e6 vmla.i32 q9, q12, q11 + 1f36328: f2644966 vmla.i32 q10, q2, q11 + 1f3632c: f2f82072 vshr.s32 q9, q9, #8 + 1f36330: f2f84074 vshr.s32 q10, q10, #8 + 1f36334: f3f68224 vmovn.i32 d24, q10 + 1f36338: f3f69222 vmovn.i32 d25, q9 + 1f3633c: f44c8a4f vst1.16 {d24-d25}, [ip] + 1f36340: e28cc010 add ip, ip, #16 + 1f36344: 8affffe6 bhi 1f362e4 + 1f36348: e59d3040 ldr r3, [sp, #64] ; 0x40 + 1f3634c: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f36350: e1530002 cmp r3, r2 + 1f36354: e59d305c ldr r3, [sp, #92] ; 0x5c + 1f36358: e0812003 add r2, r1, r3 + 1f3635c: e59d3058 ldr r3, [sp, #88] ; 0x58 + 1f36360: e0803003 add r3, r0, r3 + 1f36364: 0afff9eb beq 1f34b18 + 1f36368: e59d6070 ldr r6, [sp, #112] ; 0x70 + 1f3636c: e1d250b2 ldrh r5, [r2, #2] + 1f36370: e3a08096 mov r8, #150 ; 0x96 + 1f36374: e1d2e0b0 ldrh lr, [r2] + 1f36378: e3560000 cmp r6, #0 + 1f3637c: e1d2c0b4 ldrh ip, [r2, #4] + 1f36380: e0050598 mul r5, r8, r5 + 1f36384: e3a0804d mov r8, #77 ; 0x4d + 1f36388: e02e5e98 mla lr, r8, lr, r5 + 1f3638c: e3a0501d mov r5, #29 + 1f36390: e02cec95 mla ip, r5, ip, lr + 1f36394: e1a0c44c asr ip, ip, #8 + 1f36398: e1c3c0b0 strh ip, [r3] + 1f3639c: 0afff9dd beq 1f34b18 + 1f363a0: e1d250ba ldrh r5, [r2, #10] + 1f363a4: e3a08096 mov r8, #150 ; 0x96 + 1f363a8: e1d2e0b8 ldrh lr, [r2, #8] + 1f363ac: e3560001 cmp r6, #1 + 1f363b0: e1d2c0bc ldrh ip, [r2, #12] + 1f363b4: e0050598 mul r5, r8, r5 + 1f363b8: e3a0804d mov r8, #77 ; 0x4d + 1f363bc: e02e5e98 mla lr, r8, lr, r5 + 1f363c0: e3a0501d mov r5, #29 + 1f363c4: e02cec95 mla ip, r5, ip, lr + 1f363c8: e1a0c44c asr ip, ip, #8 + 1f363cc: e1c3c0b2 strh ip, [r3, #2] + 1f363d0: 0afff9d0 beq 1f34b18 + 1f363d4: e1d251b2 ldrh r5, [r2, #18] + 1f363d8: e3a08096 mov r8, #150 ; 0x96 + 1f363dc: e1d2e1b0 ldrh lr, [r2, #16] + 1f363e0: e3560002 cmp r6, #2 + 1f363e4: e1d2c1b4 ldrh ip, [r2, #20] + 1f363e8: e0050598 mul r5, r8, r5 + 1f363ec: e3a0804d mov r8, #77 ; 0x4d + 1f363f0: e02e5e98 mla lr, r8, lr, r5 + 1f363f4: e3a0501d mov r5, #29 + 1f363f8: e02cec95 mla ip, r5, ip, lr + 1f363fc: e1a0c44c asr ip, ip, #8 + 1f36400: e1c3c0b4 strh ip, [r3, #4] + 1f36404: 0afff9c3 beq 1f34b18 + 1f36408: e1d251ba ldrh r5, [r2, #26] + 1f3640c: e3a08096 mov r8, #150 ; 0x96 + 1f36410: e1d2e1b8 ldrh lr, [r2, #24] + 1f36414: e3560003 cmp r6, #3 + 1f36418: e1d2c1bc ldrh ip, [r2, #28] + 1f3641c: e0050598 mul r5, r8, r5 + 1f36420: e3a0804d mov r8, #77 ; 0x4d + 1f36424: e02e5e98 mla lr, r8, lr, r5 + 1f36428: e3a0501d mov r5, #29 + 1f3642c: e02cec95 mla ip, r5, ip, lr + 1f36430: e1a0c44c asr ip, ip, #8 + 1f36434: e1c3c0b6 strh ip, [r3, #6] + 1f36438: 0afff9b6 beq 1f34b18 + 1f3643c: e1d252b2 ldrh r5, [r2, #34] ; 0x22 + 1f36440: e3a08096 mov r8, #150 ; 0x96 + 1f36444: e1d2e2b0 ldrh lr, [r2, #32] + 1f36448: e3560004 cmp r6, #4 + 1f3644c: e1d2c2b4 ldrh ip, [r2, #36] ; 0x24 + 1f36450: e0050598 mul r5, r8, r5 + 1f36454: e3a0804d mov r8, #77 ; 0x4d + 1f36458: e02e5e98 mla lr, r8, lr, r5 + 1f3645c: e3a0501d mov r5, #29 + 1f36460: e02cec95 mla ip, r5, ip, lr + 1f36464: e1a0c44c asr ip, ip, #8 + 1f36468: e1c3c0b8 strh ip, [r3, #8] + 1f3646c: 0afff9a9 beq 1f34b18 + 1f36470: e1d252ba ldrh r5, [r2, #42] ; 0x2a + 1f36474: e3a08096 mov r8, #150 ; 0x96 + 1f36478: e1d2e2b8 ldrh lr, [r2, #40] ; 0x28 + 1f3647c: e3560005 cmp r6, #5 + 1f36480: e1d2c2bc ldrh ip, [r2, #44] ; 0x2c + 1f36484: e0050598 mul r5, r8, r5 + 1f36488: e3a0804d mov r8, #77 ; 0x4d + 1f3648c: e02e5e98 mla lr, r8, lr, r5 + 1f36490: e3a0501d mov r5, #29 + 1f36494: e02cec95 mla ip, r5, ip, lr + 1f36498: e1a0c44c asr ip, ip, #8 + 1f3649c: e1c3c0ba strh ip, [r3, #10] + 1f364a0: 0afff99c beq 1f34b18 + 1f364a4: e1d253b2 ldrh r5, [r2, #50] ; 0x32 + 1f364a8: e3a08096 mov r8, #150 ; 0x96 + 1f364ac: e1d2e3b0 ldrh lr, [r2, #48] ; 0x30 + 1f364b0: e3560006 cmp r6, #6 + 1f364b4: e1d2c3b4 ldrh ip, [r2, #52] ; 0x34 + 1f364b8: e0050598 mul r5, r8, r5 + 1f364bc: e3a0804d mov r8, #77 ; 0x4d + 1f364c0: e02e5e98 mla lr, r8, lr, r5 + 1f364c4: e3a0501d mov r5, #29 + 1f364c8: e02cec95 mla ip, r5, ip, lr + 1f364cc: e1a0c44c asr ip, ip, #8 + 1f364d0: e1c3c0bc strh ip, [r3, #12] + 1f364d4: 0afff98f beq 1f34b18 + 1f364d8: e1d253ba ldrh r5, [r2, #58] ; 0x3a + 1f364dc: e3a08096 mov r8, #150 ; 0x96 + 1f364e0: e1d2e3b8 ldrh lr, [r2, #56] ; 0x38 + 1f364e4: e3560007 cmp r6, #7 + 1f364e8: e1d2c3bc ldrh ip, [r2, #60] ; 0x3c + 1f364ec: e0050598 mul r5, r8, r5 + 1f364f0: e3a0804d mov r8, #77 ; 0x4d + 1f364f4: e02e5e98 mla lr, r8, lr, r5 + 1f364f8: e3a0501d mov r5, #29 + 1f364fc: e02cec95 mla ip, r5, ip, lr + 1f36500: e1a0c44c asr ip, ip, #8 + 1f36504: e1c3c0be strh ip, [r3, #14] + 1f36508: 0afff982 beq 1f34b18 + 1f3650c: e1d254b2 ldrh r5, [r2, #66] ; 0x42 + 1f36510: e3a08096 mov r8, #150 ; 0x96 + 1f36514: e1d2e4b0 ldrh lr, [r2, #64] ; 0x40 + 1f36518: e3560008 cmp r6, #8 + 1f3651c: e1d2c4b4 ldrh ip, [r2, #68] ; 0x44 + 1f36520: e0050598 mul r5, r8, r5 + 1f36524: e3a0804d mov r8, #77 ; 0x4d + 1f36528: e02e5e98 mla lr, r8, lr, r5 + 1f3652c: e3a0501d mov r5, #29 + 1f36530: e02cec95 mla ip, r5, ip, lr + 1f36534: e1a0c44c asr ip, ip, #8 + 1f36538: e1c3c1b0 strh ip, [r3, #16] + 1f3653c: 0afff975 beq 1f34b18 + 1f36540: e1d254ba ldrh r5, [r2, #74] ; 0x4a + 1f36544: e3a08096 mov r8, #150 ; 0x96 + 1f36548: e1d2e4b8 ldrh lr, [r2, #72] ; 0x48 + 1f3654c: e3560009 cmp r6, #9 + 1f36550: e1d2c4bc ldrh ip, [r2, #76] ; 0x4c + 1f36554: e0050598 mul r5, r8, r5 + 1f36558: e3a0804d mov r8, #77 ; 0x4d + 1f3655c: e02e5e98 mla lr, r8, lr, r5 + 1f36560: e3a0501d mov r5, #29 + 1f36564: e02cec95 mla ip, r5, ip, lr + 1f36568: e1a0c44c asr ip, ip, #8 + 1f3656c: e1c3c1b2 strh ip, [r3, #18] + 1f36570: 0afff968 beq 1f34b18 + 1f36574: e1d255b2 ldrh r5, [r2, #82] ; 0x52 + 1f36578: e3a08096 mov r8, #150 ; 0x96 + 1f3657c: e1d2e5b0 ldrh lr, [r2, #80] ; 0x50 + 1f36580: e356000a cmp r6, #10 + 1f36584: e1d2c5b4 ldrh ip, [r2, #84] ; 0x54 + 1f36588: e0050598 mul r5, r8, r5 + 1f3658c: e3a0804d mov r8, #77 ; 0x4d + 1f36590: e02e5e98 mla lr, r8, lr, r5 + 1f36594: e3a0501d mov r5, #29 + 1f36598: e02cec95 mla ip, r5, ip, lr + 1f3659c: e1a0c44c asr ip, ip, #8 + 1f365a0: e1c3c1b4 strh ip, [r3, #20] + 1f365a4: 0afff95b beq 1f34b18 + 1f365a8: e1d255ba ldrh r5, [r2, #90] ; 0x5a + 1f365ac: e3a08096 mov r8, #150 ; 0x96 + 1f365b0: e1d2e5b8 ldrh lr, [r2, #88] ; 0x58 + 1f365b4: e356000b cmp r6, #11 + 1f365b8: e1d2c5bc ldrh ip, [r2, #92] ; 0x5c + 1f365bc: e0050598 mul r5, r8, r5 + 1f365c0: e3a0804d mov r8, #77 ; 0x4d + 1f365c4: e02e5e98 mla lr, r8, lr, r5 + 1f365c8: e3a0501d mov r5, #29 + 1f365cc: e02cec95 mla ip, r5, ip, lr + 1f365d0: e1a0c44c asr ip, ip, #8 + 1f365d4: e1c3c1b6 strh ip, [r3, #22] + 1f365d8: 0afff94e beq 1f34b18 + 1f365dc: e1d256b2 ldrh r5, [r2, #98] ; 0x62 + 1f365e0: e3a08096 mov r8, #150 ; 0x96 + 1f365e4: e1d2e6b0 ldrh lr, [r2, #96] ; 0x60 + 1f365e8: e356000c cmp r6, #12 + 1f365ec: e1d2c6b4 ldrh ip, [r2, #100] ; 0x64 + 1f365f0: e0050598 mul r5, r8, r5 + 1f365f4: e3a0804d mov r8, #77 ; 0x4d + 1f365f8: e02e5e98 mla lr, r8, lr, r5 + 1f365fc: e3a0501d mov r5, #29 + 1f36600: e02cec95 mla ip, r5, ip, lr + 1f36604: e1a0c44c asr ip, ip, #8 + 1f36608: e1c3c1b8 strh ip, [r3, #24] + 1f3660c: 0afff941 beq 1f34b18 + 1f36610: e1d256ba ldrh r5, [r2, #106] ; 0x6a + 1f36614: e356000d cmp r6, #13 + 1f36618: e1d2e6b8 ldrh lr, [r2, #104] ; 0x68 + 1f3661c: e3a06096 mov r6, #150 ; 0x96 + 1f36620: e1d2c6bc ldrh ip, [r2, #108] ; 0x6c + 1f36624: e0050596 mul r5, r6, r5 + 1f36628: e02e5e98 mla lr, r8, lr, r5 + 1f3662c: e3a0501d mov r5, #29 + 1f36630: e02cec95 mla ip, r5, ip, lr + 1f36634: e1a0c44c asr ip, ip, #8 + 1f36638: e1c3c1ba strh ip, [r3, #26] + 1f3663c: 0afff935 beq 1f34b18 + 1f36640: e1d2e7b2 ldrh lr, [r2, #114] ; 0x72 + 1f36644: e3a05096 mov r5, #150 ; 0x96 + 1f36648: e1d2c7b0 ldrh ip, [r2, #112] ; 0x70 + 1f3664c: e1d227b4 ldrh r2, [r2, #116] ; 0x74 + 1f36650: e00e0e95 mul lr, r5, lr + 1f36654: e3a0504d mov r5, #77 ; 0x4d + 1f36658: e02eec95 mla lr, r5, ip, lr + 1f3665c: e3a0c01d mov ip, #29 + 1f36660: e022e29c mla r2, ip, r2, lr + 1f36664: e1a02442 asr r2, r2, #8 + 1f36668: e1c321bc strh r2, [r3, #28] + 1f3666c: eafff929 b 1f34b18 + 1f36670: e35b0000 cmp fp, #0 + 1f36674: bafff927 blt 1f34b18 + 1f36678: e59d5038 ldr r5, [sp, #56] ; 0x38 + 1f3667c: e085e00e add lr, r5, lr + 1f36680: e59d5030 ldr r5, [sp, #48] ; 0x30 + 1f36684: e084e00e add lr, r4, lr + 1f36688: e085c00c add ip, r5, ip + 1f3668c: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f36690: e08ac00c add ip, sl, ip + 1f36694: e151000c cmp r1, ip + 1f36698: 3150000e cmpcc r0, lr + 1f3669c: e59de020 ldr lr, [sp, #32] + 1f366a0: 23a0c001 movcs ip, #1 + 1f366a4: 33a0c000 movcc ip, #0 + 1f366a8: e35e0009 cmp lr, #9 + 1f366ac: 93a0e000 movls lr, #0 + 1f366b0: 83a0e001 movhi lr, #1 + 1f366b4: e3750001 cmn r5, #1 + 1f366b8: b3a0e000 movlt lr, #0 + 1f366bc: e11c000e tst ip, lr + 1f366c0: 0a0003c9 beq 1f375ec + 1f366c4: e59de064 ldr lr, [sp, #100] ; 0x64 + 1f366c8: e35e0000 cmp lr, #0 + 1f366cc: 1a00038e bne 1f3750c + 1f366d0: e1a0300e mov r3, lr + 1f366d4: e59de06c ldr lr, [sp, #108] ; 0x6c + 1f366d8: e1a0c000 mov ip, r0 + 1f366dc: e1a02001 mov r2, r1 + 1f366e0: f462434f vld2.16 {d20-d23}, [r2] + 1f366e4: e2833001 add r3, r3, #1 + 1f366e8: e153000e cmp r3, lr + 1f366ec: e2822020 add r2, r2, #32 + 1f366f0: f44c4a4f vst1.16 {d20-d21}, [ip] + 1f366f4: e28cc010 add ip, ip, #16 + 1f366f8: 3afffff8 bcc 1f366e0 + 1f366fc: e59d3040 ldr r3, [sp, #64] ; 0x40 + 1f36700: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f36704: e1530002 cmp r3, r2 + 1f36708: e59d3078 ldr r3, [sp, #120] ; 0x78 + 1f3670c: e0812003 add r2, r1, r3 + 1f36710: e59d3058 ldr r3, [sp, #88] ; 0x58 + 1f36714: e0803003 add r3, r0, r3 + 1f36718: 0afff8fe beq 1f34b18 + 1f3671c: e59dc070 ldr ip, [sp, #112] ; 0x70 + 1f36720: e35c0000 cmp ip, #0 + 1f36724: e1d2e0b0 ldrh lr, [r2] + 1f36728: e1c3e0b0 strh lr, [r3] + 1f3672c: 0afff8f9 beq 1f34b18 + 1f36730: e35c0001 cmp ip, #1 + 1f36734: e1d2e0b4 ldrh lr, [r2, #4] + 1f36738: e1c3e0b2 strh lr, [r3, #2] + 1f3673c: 0afff8f5 beq 1f34b18 + 1f36740: e35c0002 cmp ip, #2 + 1f36744: e1d2e0b8 ldrh lr, [r2, #8] + 1f36748: e1c3e0b4 strh lr, [r3, #4] + 1f3674c: 0afff8f1 beq 1f34b18 + 1f36750: e35c0003 cmp ip, #3 + 1f36754: e1d2e0bc ldrh lr, [r2, #12] + 1f36758: e1c3e0b6 strh lr, [r3, #6] + 1f3675c: 0afff8ed beq 1f34b18 + 1f36760: e35c0004 cmp ip, #4 + 1f36764: e1d2e1b0 ldrh lr, [r2, #16] + 1f36768: e1c3e0b8 strh lr, [r3, #8] + 1f3676c: 0afff8e9 beq 1f34b18 + 1f36770: e35c0005 cmp ip, #5 + 1f36774: e1d2e1b4 ldrh lr, [r2, #20] + 1f36778: e1c3e0ba strh lr, [r3, #10] + 1f3677c: 0afff8e5 beq 1f34b18 + 1f36780: e35c0006 cmp ip, #6 + 1f36784: e1d2e1b8 ldrh lr, [r2, #24] + 1f36788: e1c3e0bc strh lr, [r3, #12] + 1f3678c: 0afff8e1 beq 1f34b18 + 1f36790: e35c0007 cmp ip, #7 + 1f36794: e1d2e1bc ldrh lr, [r2, #28] + 1f36798: e1c3e0be strh lr, [r3, #14] + 1f3679c: 0afff8dd beq 1f34b18 + 1f367a0: e35c0008 cmp ip, #8 + 1f367a4: e1d2e2b0 ldrh lr, [r2, #32] + 1f367a8: e1c3e1b0 strh lr, [r3, #16] + 1f367ac: 0afff8d9 beq 1f34b18 + 1f367b0: e35c0009 cmp ip, #9 + 1f367b4: e1d2e2b4 ldrh lr, [r2, #36] ; 0x24 + 1f367b8: e1c3e1b2 strh lr, [r3, #18] + 1f367bc: 0afff8d5 beq 1f34b18 + 1f367c0: e35c000a cmp ip, #10 + 1f367c4: e1d2e2b8 ldrh lr, [r2, #40] ; 0x28 + 1f367c8: e1c3e1b4 strh lr, [r3, #20] + 1f367cc: 0afff8d1 beq 1f34b18 + 1f367d0: e35c000b cmp ip, #11 + 1f367d4: e1d2e2bc ldrh lr, [r2, #44] ; 0x2c + 1f367d8: e1c3e1b6 strh lr, [r3, #22] + 1f367dc: 0afff8cd beq 1f34b18 + 1f367e0: e35c000c cmp ip, #12 + 1f367e4: e1d2e3b0 ldrh lr, [r2, #48] ; 0x30 + 1f367e8: e1c3e1b8 strh lr, [r3, #24] + 1f367ec: 0afff8c9 beq 1f34b18 + 1f367f0: e35c000d cmp ip, #13 + 1f367f4: e1d2c3b4 ldrh ip, [r2, #52] ; 0x34 + 1f367f8: e1c3c1ba strh ip, [r3, #26] + 1f367fc: 11d223b8 ldrhne r2, [r2, #56] ; 0x38 + 1f36800: 11c321bc strhne r2, [r3, #28] + 1f36804: eafff8c3 b 1f34b18 + 1f36808: e3500000 cmp r0, #0 + 1f3680c: 0a000006 beq 1f3682c + 1f36810: e3e03102 mvn r3, #-2147483648 ; 0x80000000 + 1f36814: e713f013 sdiv r3, r3, r0 + 1f36818: e1520003 cmp r2, r3 + 1f3681c: cafffa19 bgt 1f35088 + 1f36820: e0030290 mul r3, r0, r2 + 1f36824: e373021e cmn r3, #-536870911 ; 0xe0000001 + 1f36828: cafffa16 bgt 1f35088 + 1f3682c: e3520000 cmp r2, #0 + 1f36830: 0a000003 beq 1f36844 + 1f36834: e3e03102 mvn r3, #-2147483648 ; 0x80000000 + 1f36838: e713f213 sdiv r3, r3, r2 + 1f3683c: e3530003 cmp r3, #3 + 1f36840: da000287 ble 1f37264 + 1f36844: e3500000 cmp r0, #0 + 1f36848: e1a02102 lsl r2, r2, #2 + 1f3684c: 0a000003 beq 1f36860 + 1f36850: e3e03102 mvn r3, #-2147483648 ; 0x80000000 + 1f36854: e713f013 sdiv r3, r3, r0 + 1f36858: e1530002 cmp r3, r2 + 1f3685c: ba000280 blt 1f37264 + 1f36860: e0000092 mul r0, r2, r0 + 1f36864: eb001f3f bl 1f3e568 + 1f36868: e3500000 cmp r0, #0 + 1f3686c: e5850008 str r0, [r5, #8] + 1f36870: 0a00027d beq 1f3726c + 1f36874: e5953020 ldr r3, [r5, #32] + 1f36878: e7e23153 ubfx r3, r3, #2, #3 + 1f3687c: e3530003 cmp r3, #3 + 1f36880: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f36884: ea000047 b 1f369a8 + 1f36888: 01f36a04 .word 0x01f36a04 + 1f3688c: 01f369dc .word 0x01f369dc + 1f36890: 01f368f8 .word 0x01f368f8 + 1f36894: 01f36898 .word 0x01f36898 + 1f36898: e595100c ldr r1, [r5, #12] + 1f3689c: e3510000 cmp r1, #0 + 1f368a0: 0a000040 beq 1f369a8 + 1f368a4: e2856901 add r6, r5, #16384 ; 0x4000 + 1f368a8: e596783c ldr r7, [r6, #2108] ; 0x83c + 1f368ac: e5963844 ldr r3, [r6, #2116] ; 0x844 + 1f368b0: e1570003 cmp r7, r3 + 1f368b4: ba000002 blt 1f368c4 + 1f368b8: ea00003a b 1f369a8 + 1f368bc: e5950008 ldr r0, [r5, #8] + 1f368c0: e595100c ldr r1, [r5, #12] + 1f368c4: e5963838 ldr r3, [r6, #2104] ; 0x838 + 1f368c8: e5962840 ldr r2, [r6, #2112] ; 0x840 + 1f368cc: e083c007 add ip, r3, r7 + 1f368d0: e0632002 rsb r2, r3, r2 + 1f368d4: e081100c add r1, r1, ip + 1f368d8: e080000c add r0, r0, ip + 1f368dc: eb002147 bl 1f3ee00 + 1f368e0: e5952000 ldr r2, [r5] + 1f368e4: e5963844 ldr r3, [r6, #2116] ; 0x844 + 1f368e8: e0877102 add r7, r7, r2, lsl #2 + 1f368ec: e1530007 cmp r3, r7 + 1f368f0: cafffff1 bgt 1f368bc + 1f368f4: ea00002b b 1f369a8 + 1f368f8: e3570000 cmp r7, #0 + 1f368fc: 0a000005 beq 1f36918 + 1f36900: e5953000 ldr r3, [r5] + 1f36904: e1a01007 mov r1, r7 + 1f36908: e5952004 ldr r2, [r5, #4] + 1f3690c: e1a03103 lsl r3, r3, #2 + 1f36910: e0020392 mul r2, r2, r3 + 1f36914: eb002139 bl 1f3ee00 + 1f36918: e2853901 add r3, r5, #16384 ; 0x4000 + 1f3691c: e5951014 ldr r1, [r5, #20] + 1f36920: e281100a add r1, r1, #10 + 1f36924: e593783c ldr r7, [r3, #2108] ; 0x83c + 1f36928: e593b844 ldr fp, [r3, #2116] ; 0x844 + 1f3692c: e0851101 add r1, r5, r1, lsl #2 + 1f36930: e5938838 ldr r8, [r3, #2104] ; 0x838 + 1f36934: e157000b cmp r7, fp + 1f36938: e593a840 ldr sl, [r3, #2112] ; 0x840 + 1f3693c: aa000019 bge 1f369a8 + 1f36940: e24a3001 sub r3, sl, #1 + 1f36944: e2889004 add r9, r8, #4 + 1f36948: e0683003 rsb r3, r8, r3 + 1f3694c: e3a06000 mov r6, #0 + 1f36950: e3c33003 bic r3, r3, #3 + 1f36954: e0899003 add r9, r9, r3 + 1f36958: e158000a cmp r8, sl + 1f3695c: b0883007 addlt r3, r8, r7 + 1f36960: b089c007 addlt ip, r9, r7 + 1f36964: aa00000b bge 1f36998 + 1f36968: e5950008 ldr r0, [r5, #8] + 1f3696c: e5d1e002 ldrb lr, [r1, #2] + 1f36970: e0802003 add r2, r0, r3 + 1f36974: e7c0e003 strb lr, [r0, r3] + 1f36978: e2833004 add r3, r3, #4 + 1f3697c: e153000c cmp r3, ip + 1f36980: e5d10001 ldrb r0, [r1, #1] + 1f36984: e5c20001 strb r0, [r2, #1] + 1f36988: e5d10000 ldrb r0, [r1] + 1f3698c: e5c20002 strb r0, [r2, #2] + 1f36990: e5c26003 strb r6, [r2, #3] + 1f36994: 1afffff3 bne 1f36968 + 1f36998: e5953000 ldr r3, [r5] + 1f3699c: e0877103 add r7, r7, r3, lsl #2 + 1f369a0: e15b0007 cmp fp, r7 + 1f369a4: caffffeb bgt 1f36958 + 1f369a8: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f369ac: e59420ac ldr r2, [r4, #172] ; 0xac + 1f369b0: e1530002 cmp r3, r2 + 1f369b4: 3a000034 bcc 1f36a8c + 1f369b8: e5943020 ldr r3, [r4, #32] + 1f369bc: e3530000 cmp r3, #0 + 1f369c0: 1a00017a bne 1f36fb0 + 1f369c4: e59d2024 ldr r2, [sp, #36] ; 0x24 + 1f369c8: e3013180 movw r3, #4480 ; 0x1180 + 1f369cc: e34031f6 movt r3, #502 ; 0x1f6 + 1f369d0: e5957008 ldr r7, [r5, #8] + 1f369d4: e5823000 str r3, [r2] + 1f369d8: eafff9ae b 1f35098 + 1f369dc: e3570000 cmp r7, #0 + 1f369e0: 0a000005 beq 1f369fc + 1f369e4: e5953000 ldr r3, [r5] + 1f369e8: e1a01007 mov r1, r7 + 1f369ec: e5952004 ldr r2, [r5, #4] + 1f369f0: e1a03103 lsl r3, r3, #2 + 1f369f4: e0020392 mul r2, r2, r3 + 1f369f8: eb002100 bl 1f3ee00 + 1f369fc: e585700c str r7, [r5, #12] + 1f36a00: eaffffe8 b 1f369a8 + 1f36a04: e8950108 ldm r5, {r3, r8} + 1f36a08: e5951014 ldr r1, [r5, #20] + 1f36a0c: e1a03103 lsl r3, r3, #2 + 1f36a10: e281100a add r1, r1, #10 + 1f36a14: e1a09003 mov r9, r3 + 1f36a18: e0080398 mul r8, r8, r3 + 1f36a1c: e0851101 add r1, r5, r1, lsl #2 + 1f36a20: e3580000 cmp r8, #0 + 1f36a24: daffffdf ble 1f369a8 + 1f36a28: e3a07000 mov r7, #0 + 1f36a2c: e1a0a003 mov sl, r3 + 1f36a30: e1a06007 mov r6, r7 + 1f36a34: e3590000 cmp r9, #0 + 1f36a38: da00000f ble 1f36a7c + 1f36a3c: e1a03007 mov r3, r7 + 1f36a40: e08ac007 add ip, sl, r7 + 1f36a44: e5950008 ldr r0, [r5, #8] + 1f36a48: e5d1e002 ldrb lr, [r1, #2] + 1f36a4c: e0802003 add r2, r0, r3 + 1f36a50: e7c0e003 strb lr, [r0, r3] + 1f36a54: e2833004 add r3, r3, #4 + 1f36a58: e15c0003 cmp ip, r3 + 1f36a5c: e5d10001 ldrb r0, [r1, #1] + 1f36a60: e5c20001 strb r0, [r2, #1] + 1f36a64: e5d10000 ldrb r0, [r1] + 1f36a68: e5c20002 strb r0, [r2, #2] + 1f36a6c: e5c26003 strb r6, [r2, #3] + 1f36a70: 1afffff3 bne 1f36a44 + 1f36a74: e5953000 ldr r3, [r5] + 1f36a78: e1a03103 lsl r3, r3, #2 + 1f36a7c: e0877003 add r7, r7, r3 + 1f36a80: e1580007 cmp r8, r7 + 1f36a84: caffffea bgt 1f36a34 + 1f36a88: eaffffc6 b 1f369a8 + 1f36a8c: e2831001 add r1, r3, #1 + 1f36a90: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f36a94: e5d33000 ldrb r3, [r3] + 1f36a98: e353002c cmp r3, #44 ; 0x2c + 1f36a9c: 0a000043 beq 1f36bb0 + 1f36aa0: e353003b cmp r3, #59 ; 0x3b + 1f36aa4: 0a00003f beq 1f36ba8 + 1f36aa8: e3530021 cmp r3, #33 ; 0x21 + 1f36aac: 1affffc4 bne 1f369c4 + 1f36ab0: e1510002 cmp r1, r2 + 1f36ab4: 3a000156 bcc 1f37014 + 1f36ab8: e5943020 ldr r3, [r4, #32] + 1f36abc: e3530000 cmp r3, #0 + 1f36ac0: 01a03001 moveq r3, r1 + 1f36ac4: 1a0001ab bne 1f37178 + 1f36ac8: e2846028 add r6, r4, #40 ; 0x28 + 1f36acc: e1530002 cmp r3, r2 + 1f36ad0: 3a000021 bcc 1f36b5c + 1f36ad4: e5941020 ldr r1, [r4, #32] + 1f36ad8: e3510000 cmp r1, #0 + 1f36adc: 0affffb3 beq 1f369b0 + 1f36ae0: e5943010 ldr r3, [r4, #16] + 1f36ae4: e1a01006 mov r1, r6 + 1f36ae8: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f36aec: e594001c ldr r0, [r4, #28] + 1f36af0: e12fff33 blx r3 + 1f36af4: e3500000 cmp r0, #0 + 1f36af8: 02842029 addeq r2, r4, #41 ; 0x29 + 1f36afc: 01a03000 moveq r3, r0 + 1f36b00: 15d43028 ldrbne r3, [r4, #40] ; 0x28 + 1f36b04: 01a0c002 moveq ip, r2 + 1f36b08: 1284c029 addne ip, r4, #41 ; 0x29 + 1f36b0c: 10862000 addne r2, r6, r0 + 1f36b10: 05840020 streq r0, [r4, #32] + 1f36b14: 01a01003 moveq r1, r3 + 1f36b18: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f36b1c: 11a01003 movne r1, r3 + 1f36b20: e58420ac str r2, [r4, #172] ; 0xac + 1f36b24: e1a0000c mov r0, ip + 1f36b28: e584c0a8 str ip, [r4, #168] ; 0xa8 + 1f36b2c: e3510000 cmp r1, #0 + 1f36b30: 0a000376 beq 1f37910 + 1f36b34: e594c010 ldr ip, [r4, #16] + 1f36b38: e35c0000 cmp ip, #0 + 1f36b3c: 0a000002 beq 1f36b4c + 1f36b40: e060c002 rsb ip, r0, r2 + 1f36b44: e15c0001 cmp ip, r1 + 1f36b48: ba000008 blt 1f36b70 + 1f36b4c: e0803003 add r3, r0, r3 + 1f36b50: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f36b54: e1530002 cmp r3, r2 + 1f36b58: 2affffdd bcs 1f36ad4 + 1f36b5c: e2830001 add r0, r3, #1 + 1f36b60: e58400a8 str r0, [r4, #168] ; 0xa8 + 1f36b64: e5d33000 ldrb r3, [r3] + 1f36b68: e1a01003 mov r1, r3 + 1f36b6c: eaffffee b 1f36b2c + 1f36b70: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f36b74: e06c1001 rsb r1, ip, r1 + 1f36b78: e5943014 ldr r3, [r4, #20] + 1f36b7c: e594001c ldr r0, [r4, #28] + 1f36b80: e12fff33 blx r3 + 1f36b84: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f36b88: e59420ac ldr r2, [r4, #172] ; 0xac + 1f36b8c: eaffffce b 1f36acc + 1f36b90: e15b0008 cmp fp, r8 + 1f36b94: 1a0000ac bne 1f36e4c + 1f36b98: e59d2024 ldr r2, [sp, #36] ; 0x24 + 1f36b9c: e3013168 movw r3, #4456 ; 0x1168 + 1f36ba0: e34031f6 movt r3, #502 ; 0x1f6 + 1f36ba4: e5823000 str r3, [r2] + 1f36ba8: e5957008 ldr r7, [r5, #8] + 1f36bac: eafff939 b 1f35098 + 1f36bb0: e1a00004 mov r0, r4 + 1f36bb4: ebffd00d bl 1f2abf0 + 1f36bb8: e1a07000 mov r7, r0 + 1f36bbc: e1a00004 mov r0, r4 + 1f36bc0: ebffd00a bl 1f2abf0 + 1f36bc4: e1a08000 mov r8, r0 + 1f36bc8: e1a00004 mov r0, r4 + 1f36bcc: ebffd007 bl 1f2abf0 + 1f36bd0: e1a09000 mov r9, r0 + 1f36bd4: e1a00004 mov r0, r4 + 1f36bd8: ebffd004 bl 1f2abf0 + 1f36bdc: e5953000 ldr r3, [r5] + 1f36be0: e0872009 add r2, r7, r9 + 1f36be4: e1520003 cmp r2, r3 + 1f36be8: ca000125 bgt 1f37084 + 1f36bec: e5952004 ldr r2, [r5, #4] + 1f36bf0: e0881000 add r1, r8, r0 + 1f36bf4: e1510002 cmp r1, r2 + 1f36bf8: ca000121 bgt 1f37084 + 1f36bfc: e59420a8 ldr r2, [r4, #168] ; 0xa8 + 1f36c00: e1a03103 lsl r3, r3, #2 + 1f36c04: e59410ac ldr r1, [r4, #172] ; 0xac + 1f36c08: e2856901 add r6, r5, #16384 ; 0x4000 + 1f36c0c: e0080893 mul r8, r3, r8 + 1f36c10: e1520001 cmp r2, r1 + 1f36c14: e1a07107 lsl r7, r7, #2 + 1f36c18: e0208093 mla r0, r3, r0, r8 + 1f36c1c: e0879109 add r9, r7, r9, lsl #2 + 1f36c20: e5860844 str r0, [r6, #2116] ; 0x844 + 1f36c24: e586883c str r8, [r6, #2108] ; 0x83c + 1f36c28: e5869840 str r9, [r6, #2112] ; 0x840 + 1f36c2c: e586884c str r8, [r6, #2124] ; 0x84c + 1f36c30: e5863850 str r3, [r6, #2128] ; 0x850 + 1f36c34: e5867838 str r7, [r6, #2104] ; 0x838 + 1f36c38: e5867848 str r7, [r6, #2120] ; 0x848 + 1f36c3c: 3a00011f bcc 1f370c0 + 1f36c40: e5942020 ldr r2, [r4, #32] + 1f36c44: e3520000 cmp r2, #0 + 1f36c48: 1a000160 bne 1f371d0 + 1f36c4c: e5862834 str r2, [r6, #2100] ; 0x834 + 1f36c50: e586282c str r2, [r6, #2092] ; 0x82c + 1f36c54: e5863830 str r3, [r6, #2096] ; 0x830 + 1f36c58: e5953010 ldr r3, [r5, #16] + 1f36c5c: e3130080 tst r3, #128 ; 0x80 + 1f36c60: 0a0002cb beq 1f37794 + 1f36c64: e595301c ldr r3, [r5, #28] + 1f36c68: e3530000 cmp r3, #0 + 1f36c6c: ba000154 blt 1f371c4 + 1f36c70: e5952020 ldr r2, [r5, #32] + 1f36c74: e3120001 tst r2, #1 + 1f36c78: 0a000151 beq 1f371c4 + 1f36c7c: e0853103 add r3, r5, r3, lsl #2 + 1f36c80: e3a02000 mov r2, #0 + 1f36c84: e5d3102b ldrb r1, [r3, #43] ; 0x2b + 1f36c88: e58d1038 str r1, [sp, #56] ; 0x38 + 1f36c8c: e5c3202b strb r2, [r3, #43] ; 0x2b + 1f36c90: e2853028 add r3, r5, #40 ; 0x28 + 1f36c94: e5863828 str r3, [r6, #2088] ; 0x828 + 1f36c98: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f36c9c: e59420ac ldr r2, [r4, #172] ; 0xac + 1f36ca0: e1530002 cmp r3, r2 + 1f36ca4: 3a000124 bcc 1f3713c + 1f36ca8: e5943020 ldr r3, [r4, #32] + 1f36cac: e3530000 cmp r3, #0 + 1f36cb0: 1a000159 bne 1f3721c + 1f36cb4: e3a03001 mov r3, #1 + 1f36cb8: e3a02003 mov r2, #3 + 1f36cbc: e58d3030 str r3, [sp, #48] ; 0x30 + 1f36cc0: e1a06003 mov r6, r3 + 1f36cc4: e58d2034 str r2, [sp, #52] ; 0x34 + 1f36cc8: e58d302c str r3, [sp, #44] ; 0x2c + 1f36ccc: e2853e82 add r3, r5, #2080 ; 0x820 + 1f36cd0: e3a02000 mov r2, #0 + 1f36cd4: e2833008 add r3, r3, #8 + 1f36cd8: e3e00000 mvn r0, #0 + 1f36cdc: e6ef1072 uxtb r1, r2 + 1f36ce0: e2822001 add r2, r2, #1 + 1f36ce4: e1520006 cmp r2, r6 + 1f36ce8: e1c300b0 strh r0, [r3] + 1f36cec: e5c31002 strb r1, [r3, #2] + 1f36cf0: e2833004 add r3, r3, #4 + 1f36cf4: e5431001 strb r1, [r3, #-1] + 1f36cf8: 1afffff7 bne 1f36cdc + 1f36cfc: e3a07000 mov r7, #0 + 1f36d00: e3a03001 mov r3, #1 + 1f36d04: e59d8034 ldr r8, [sp, #52] ; 0x34 + 1f36d08: e1a09007 mov r9, r7 + 1f36d0c: e58d3020 str r3, [sp, #32] + 1f36d10: e59da02c ldr sl, [sp, #44] ; 0x2c + 1f36d14: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f36d18: e58d3010 str r3, [sp, #16] + 1f36d1c: e3e03000 mvn r3, #0 + 1f36d20: e58d700c str r7, [sp, #12] + 1f36d24: e58d3014 str r3, [sp, #20] + 1f36d28: e2863001 add r3, r6, #1 + 1f36d2c: e58d3028 str r3, [sp, #40] ; 0x28 + 1f36d30: e15a0007 cmp sl, r7 + 1f36d34: da000024 ble 1f36dcc + 1f36d38: e59d300c ldr r3, [sp, #12] + 1f36d3c: e3530000 cmp r3, #0 + 1f36d40: 1a000052 bne 1f36e90 + 1f36d44: e59420a8 ldr r2, [r4, #168] ; 0xa8 + 1f36d48: e594b0ac ldr fp, [r4, #172] ; 0xac + 1f36d4c: e152000b cmp r2, fp + 1f36d50: 3a00007a bcc 1f36f40 + 1f36d54: e5943020 ldr r3, [r4, #32] + 1f36d58: e3530000 cmp r3, #0 + 1f36d5c: 1a00007e bne 1f36f5c + 1f36d60: e5950008 ldr r0, [r5, #8] + 1f36d64: e250a000 subs sl, r0, #0 + 1f36d68: 0a000143 beq 1f3727c + 1f36d6c: e59d2038 ldr r2, [sp, #56] ; 0x38 + 1f36d70: e3720001 cmn r2, #1 + 1f36d74: 1595301c ldrne r3, [r5, #28] + 1f36d78: 10853103 addne r3, r5, r3, lsl #2 + 1f36d7c: 15c3202b strbne r2, [r3, #43] ; 0x2b + 1f36d80: e1540000 cmp r4, r0 + 1f36d84: 0affff87 beq 1f36ba8 + 1f36d88: e59d22b0 ldr r2, [sp, #688] ; 0x2b0 + 1f36d8c: e5953000 ldr r3, [r5] + 1f36d90: e3d22004 bics r2, r2, #4 + 1f36d94: e59d2018 ldr r2, [sp, #24] + 1f36d98: e5823000 str r3, [r2] + 1f36d9c: e59d201c ldr r2, [sp, #28] + 1f36da0: e5953004 ldr r3, [r5, #4] + 1f36da4: e5823000 str r3, [r2] + 1f36da8: 0afff8bf beq 1f350ac + 1f36dac: e5951004 ldr r1, [r5, #4] + 1f36db0: e5953000 ldr r3, [r5] + 1f36db4: e59d22b0 ldr r2, [sp, #688] ; 0x2b0 + 1f36db8: e58d1000 str r1, [sp] + 1f36dbc: e3a01004 mov r1, #4 + 1f36dc0: ebffd08f bl 1f2b004 + 1f36dc4: e1a0a000 mov sl, r0 + 1f36dc8: eafff8b7 b 1f350ac + 1f36dcc: e59d3010 ldr r3, [sp, #16] + 1f36dd0: e06a7007 rsb r7, sl, r7 + 1f36dd4: e009b003 and fp, r9, r3 + 1f36dd8: e1a09a59 asr r9, r9, sl + 1f36ddc: e15b0006 cmp fp, r6 + 1f36de0: 0a00004d beq 1f36f1c + 1f36de4: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f36de8: e15b0003 cmp fp, r3 + 1f36dec: 0a000124 beq 1f37284 + 1f36df0: e15b0008 cmp fp, r8 + 1f36df4: caffff67 bgt 1f36b98 + 1f36df8: e59d3020 ldr r3, [sp, #32] + 1f36dfc: e3530000 cmp r3, #0 + 1f36e00: 1a00015d bne 1f3737c + 1f36e04: e59d3014 ldr r3, [sp, #20] + 1f36e08: e3530000 cmp r3, #0 + 1f36e0c: baffff5f blt 1f36b90 + 1f36e10: e2883001 add r3, r8, #1 + 1f36e14: e3530a01 cmp r3, #4096 ; 0x1000 + 1f36e18: ca00015c bgt 1f37390 + 1f36e1c: e0858108 add r8, r5, r8, lsl #2 + 1f36e20: e59d0014 ldr r0, [sp, #20] + 1f36e24: e2882e82 add r2, r8, #2080 ; 0x820 + 1f36e28: e15b0003 cmp fp, r3 + 1f36e2c: e0851100 add r1, r5, r0, lsl #2 + 1f36e30: e1c200b8 strh r0, [r2, #8] + 1f36e34: e5d1282a ldrb r2, [r1, #2090] ; 0x82a + 1f36e38: e5c8282a strb r2, [r8, #2090] ; 0x82a + 1f36e3c: 1085210b addne r2, r5, fp, lsl #2 + 1f36e40: 15d2282a ldrbne r2, [r2, #2090] ; 0x82a + 1f36e44: e5c8282b strb r2, [r8, #2091] ; 0x82b + 1f36e48: e1a08003 mov r8, r3 + 1f36e4c: e6ff107b uxth r1, fp + 1f36e50: e1a00005 mov r0, r5 + 1f36e54: ebffe980 bl 1f3145c + 1f36e58: e59d3010 ldr r3, [sp, #16] + 1f36e5c: e3002fff movw r2, #4095 ; 0xfff + 1f36e60: e0033008 and r3, r3, r8 + 1f36e64: e1580002 cmp r8, r2 + 1f36e68: d3530000 cmple r3, #0 + 1f36e6c: 158db014 strne fp, [sp, #20] + 1f36e70: 1affffae bne 1f36d30 + 1f36e74: e28aa001 add sl, sl, #1 + 1f36e78: e3a03001 mov r3, #1 + 1f36e7c: e58db014 str fp, [sp, #20] + 1f36e80: e1a03a13 lsl r3, r3, sl + 1f36e84: e2433001 sub r3, r3, #1 + 1f36e88: e58d3010 str r3, [sp, #16] + 1f36e8c: eaffffa7 b 1f36d30 + 1f36e90: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f36e94: e594b0ac ldr fp, [r4, #172] ; 0xac + 1f36e98: e59d200c ldr r2, [sp, #12] + 1f36e9c: e153000b cmp r3, fp + 1f36ea0: e2422001 sub r2, r2, #1 + 1f36ea4: e58d200c str r2, [sp, #12] + 1f36ea8: 3a000016 bcc 1f36f08 + 1f36eac: e5940020 ldr r0, [r4, #32] + 1f36eb0: e3500000 cmp r0, #0 + 1f36eb4: 0a000010 beq 1f36efc + 1f36eb8: e284b028 add fp, r4, #40 ; 0x28 + 1f36ebc: e5943010 ldr r3, [r4, #16] + 1f36ec0: e1a0100b mov r1, fp + 1f36ec4: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f36ec8: e594001c ldr r0, [r4, #28] + 1f36ecc: e12fff33 blx r3 + 1f36ed0: e3500000 cmp r0, #0 + 1f36ed4: 0284b029 addeq fp, r4, #41 ; 0x29 + 1f36ed8: 108bb000 addne fp, fp, r0 + 1f36edc: 15d42028 ldrbne r2, [r4, #40] ; 0x28 + 1f36ee0: 01a0300b moveq r3, fp + 1f36ee4: 12843029 addne r3, r4, #41 ; 0x29 + 1f36ee8: 05840020 streq r0, [r4, #32] + 1f36eec: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f36ef0: 11a00712 lslne r0, r2, r7 + 1f36ef4: e584b0ac str fp, [r4, #172] ; 0xac + 1f36ef8: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f36efc: e1899000 orr r9, r9, r0 + 1f36f00: e2877008 add r7, r7, #8 + 1f36f04: eaffff89 b 1f36d30 + 1f36f08: e2832001 add r2, r3, #1 + 1f36f0c: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f36f10: e5d30000 ldrb r0, [r3] + 1f36f14: e1a00710 lsl r0, r0, r7 + 1f36f18: eafffff7 b 1f36efc + 1f36f1c: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f36f20: e58d3010 str r3, [sp, #16] + 1f36f24: e3e03000 mvn r3, #0 + 1f36f28: e59d8034 ldr r8, [sp, #52] ; 0x34 + 1f36f2c: e58d3014 str r3, [sp, #20] + 1f36f30: e3a03000 mov r3, #0 + 1f36f34: e59da02c ldr sl, [sp, #44] ; 0x2c + 1f36f38: e58d3020 str r3, [sp, #32] + 1f36f3c: eaffff7b b 1f36d30 + 1f36f40: e2823001 add r3, r2, #1 + 1f36f44: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f36f48: e5d22000 ldrb r2, [r2] + 1f36f4c: e58d200c str r2, [sp, #12] + 1f36f50: e3520000 cmp r2, #0 + 1f36f54: 1affffd0 bne 1f36e9c + 1f36f58: eaffff80 b 1f36d60 + 1f36f5c: e284b028 add fp, r4, #40 ; 0x28 + 1f36f60: e5943010 ldr r3, [r4, #16] + 1f36f64: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f36f68: e1a0100b mov r1, fp + 1f36f6c: e594001c ldr r0, [r4, #28] + 1f36f70: e12fff33 blx r3 + 1f36f74: e3500000 cmp r0, #0 + 1f36f78: 0284b029 addeq fp, r4, #41 ; 0x29 + 1f36f7c: 108bb000 addne fp, fp, r0 + 1f36f80: 059d200c ldreq r2, [sp, #12] + 1f36f84: 12843029 addne r3, r4, #41 ; 0x29 + 1f36f88: 15d42028 ldrbne r2, [r4, #40] ; 0x28 + 1f36f8c: 01a03002 moveq r3, r2 + 1f36f90: e584b0ac str fp, [r4, #172] ; 0xac + 1f36f94: 05843020 streq r3, [r4, #32] + 1f36f98: 01a03002 moveq r3, r2 + 1f36f9c: e58d200c str r2, [sp, #12] + 1f36fa0: 05c43028 strbeq r3, [r4, #40] ; 0x28 + 1f36fa4: 01a0300b moveq r3, fp + 1f36fa8: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f36fac: eaffffe7 b 1f36f50 + 1f36fb0: e2846028 add r6, r4, #40 ; 0x28 + 1f36fb4: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f36fb8: e5943010 ldr r3, [r4, #16] + 1f36fbc: e1a01006 mov r1, r6 + 1f36fc0: e594001c ldr r0, [r4, #28] + 1f36fc4: e12fff33 blx r3 + 1f36fc8: e3500000 cmp r0, #0 + 1f36fcc: 02842029 addeq r2, r4, #41 ; 0x29 + 1f36fd0: 10862000 addne r2, r6, r0 + 1f36fd4: 05840020 streq r0, [r4, #32] + 1f36fd8: 12840029 addne r0, r4, #41 ; 0x29 + 1f36fdc: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f36fe0: 01a03000 moveq r3, r0 + 1f36fe4: 01a00002 moveq r0, r2 + 1f36fe8: 15d43028 ldrbne r3, [r4, #40] ; 0x28 + 1f36fec: e58420ac str r2, [r4, #172] ; 0xac + 1f36ff0: e1a01000 mov r1, r0 + 1f36ff4: e58400a8 str r0, [r4, #168] ; 0xa8 + 1f36ff8: eafffea6 b 1f36a98 + 1f36ffc: e2813001 add r3, r1, #1 + 1f37000: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f37004: e5d15000 ldrb r5, [r1] + 1f37008: e2455037 sub r5, r5, #55 ; 0x37 + 1f3700c: e20550fd and r5, r5, #253 ; 0xfd + 1f37010: eafff7f2 b 1f34fe0 + 1f37014: e2813001 add r3, r1, #1 + 1f37018: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f3701c: e5d11000 ldrb r1, [r1] + 1f37020: e35100f9 cmp r1, #249 ; 0xf9 + 1f37024: 1afffea7 bne 1f36ac8 + 1f37028: e1530002 cmp r3, r2 + 1f3702c: 3a0000e4 bcc 1f373c4 + 1f37030: e594c020 ldr ip, [r4, #32] + 1f37034: e35c0000 cmp ip, #0 + 1f37038: 01a0100c moveq r1, ip + 1f3703c: 1a0001da bne 1f377ac + 1f37040: e5940010 ldr r0, [r4, #16] + 1f37044: e3500000 cmp r0, #0 + 1f37048: 0a000002 beq 1f37058 + 1f3704c: e0630002 rsb r0, r3, r2 + 1f37050: e1510000 cmp r1, r0 + 1f37054: ca00021b bgt 1f378c8 + 1f37058: e083300c add r3, r3, ip + 1f3705c: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f37060: eafffe52 b 1f369b0 + 1f37064: e2832001 add r2, r3, #1 + 1f37068: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f3706c: e5d35000 ldrb r5, [r3] + 1f37070: eafff7f1 b 1f3503c + 1f37074: e2812001 add r2, r1, #1 + 1f37078: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f3707c: e5d11000 ldrb r1, [r1] + 1f37080: eafff79d b 1f34efc + 1f37084: e59d2024 ldr r2, [sp, #36] ; 0x24 + 1f37088: e301311c movw r3, #4380 ; 0x111c + 1f3708c: e34031f6 movt r3, #502 ; 0x1f6 + 1f37090: e5957008 ldr r7, [r5, #8] + 1f37094: e5823000 str r3, [r2] + 1f37098: eafff7fe b 1f35098 + 1f3709c: e1a03007 mov r3, r7 + 1f370a0: e1a02006 mov r2, r6 + 1f370a4: e1a01005 mov r1, r5 + 1f370a8: e1a00004 mov r0, r4 + 1f370ac: ebfff375 bl 1f33e88 + 1f370b0: e3500000 cmp r0, #0 + 1f370b4: e5957008 ldr r7, [r5, #8] + 1f370b8: 0afff7f6 beq 1f35098 + 1f370bc: eafff7ed b 1f35078 + 1f370c0: e2821001 add r1, r2, #1 + 1f370c4: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f370c8: e5d22000 ldrb r2, [r2] + 1f370cc: e2021040 and r1, r2, #64 ; 0x40 + 1f370d0: e3c2c07f bic ip, r2, #127 ; 0x7f + 1f370d4: e6ef1071 uxtb r1, r1 + 1f370d8: e6efc07c uxtb ip, ip + 1f370dc: e3510000 cmp r1, #0 + 1f370e0: e5862834 str r2, [r6, #2100] ; 0x834 + 1f370e4: 11a03183 lslne r3, r3, #3 + 1f370e8: 13a01003 movne r1, #3 + 1f370ec: e35c0000 cmp ip, #0 + 1f370f0: e586182c str r1, [r6, #2092] ; 0x82c + 1f370f4: e5863830 str r3, [r6, #2096] ; 0x830 + 1f370f8: 0afffed6 beq 1f36c58 + 1f370fc: e5951020 ldr r1, [r5, #32] + 1f37100: e3a03002 mov r3, #2 + 1f37104: e2022007 and r2, r2, #7 + 1f37108: e2857e42 add r7, r5, #1056 ; 0x420 + 1f3710c: e3110001 tst r1, #1 + 1f37110: e2877008 add r7, r7, #8 + 1f37114: e1a02213 lsl r2, r3, r2 + 1f37118: e1a01007 mov r1, r7 + 1f3711c: 1595301c ldrne r3, [r5, #28] + 1f37120: 03e03000 mvneq r3, #0 + 1f37124: e1a00004 mov r0, r4 + 1f37128: ebffc2d8 bl 1f27c90 + 1f3712c: e3e03000 mvn r3, #0 + 1f37130: e5867828 str r7, [r6, #2088] ; 0x828 + 1f37134: e58d3038 str r3, [sp, #56] ; 0x38 + 1f37138: eafffed6 b 1f36c98 + 1f3713c: e2832001 add r2, r3, #1 + 1f37140: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f37144: e5d36000 ldrb r6, [r3] + 1f37148: e356000c cmp r6, #12 + 1f3714c: 8afffe95 bhi 1f36ba8 + 1f37150: e3a03001 mov r3, #1 + 1f37154: e0862003 add r2, r6, r3 + 1f37158: e58d202c str r2, [sp, #44] ; 0x2c + 1f3715c: e1a06613 lsl r6, r3, r6 + 1f37160: e1a03213 lsl r3, r3, r2 + 1f37164: e2433001 sub r3, r3, #1 + 1f37168: e58d3030 str r3, [sp, #48] ; 0x30 + 1f3716c: e2863002 add r3, r6, #2 + 1f37170: e58d3034 str r3, [sp, #52] ; 0x34 + 1f37174: eafffed4 b 1f36ccc + 1f37178: e2846028 add r6, r4, #40 ; 0x28 + 1f3717c: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f37180: e1a01006 mov r1, r6 + 1f37184: e5943010 ldr r3, [r4, #16] + 1f37188: e594001c ldr r0, [r4, #28] + 1f3718c: e12fff33 blx r3 + 1f37190: e3500000 cmp r0, #0 + 1f37194: 02842029 addeq r2, r4, #41 ; 0x29 + 1f37198: 10862000 addne r2, r6, r0 + 1f3719c: 05840020 streq r0, [r4, #32] + 1f371a0: 12840029 addne r0, r4, #41 ; 0x29 + 1f371a4: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f371a8: 01a01000 moveq r1, r0 + 1f371ac: 01a00002 moveq r0, r2 + 1f371b0: 15d41028 ldrbne r1, [r4, #40] ; 0x28 + 1f371b4: e58420ac str r2, [r4, #172] ; 0xac + 1f371b8: e1a03000 mov r3, r0 + 1f371bc: e58400a8 str r0, [r4, #168] ; 0xa8 + 1f371c0: eaffff96 b 1f37020 + 1f371c4: e3e03000 mvn r3, #0 + 1f371c8: e58d3038 str r3, [sp, #56] ; 0x38 + 1f371cc: eafffeaf b 1f36c90 + 1f371d0: e2847028 add r7, r4, #40 ; 0x28 + 1f371d4: e5943010 ldr r3, [r4, #16] + 1f371d8: e1a01007 mov r1, r7 + 1f371dc: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f371e0: e594001c ldr r0, [r4, #28] + 1f371e4: e12fff33 blx r3 + 1f371e8: e3500000 cmp r0, #0 + 1f371ec: 1a00006c bne 1f373a4 + 1f371f0: e2847029 add r7, r4, #41 ; 0x29 + 1f371f4: e1a01000 mov r1, r0 + 1f371f8: e5840020 str r0, [r4, #32] + 1f371fc: e1a0c000 mov ip, r0 + 1f37200: e5c40028 strb r0, [r4, #40] ; 0x28 + 1f37204: e1a02000 mov r2, r0 + 1f37208: e1a00007 mov r0, r7 + 1f3720c: e5963850 ldr r3, [r6, #2128] ; 0x850 + 1f37210: e58470ac str r7, [r4, #172] ; 0xac + 1f37214: e58400a8 str r0, [r4, #168] ; 0xa8 + 1f37218: eaffffaf b 1f370dc + 1f3721c: e2847028 add r7, r4, #40 ; 0x28 + 1f37220: e5943010 ldr r3, [r4, #16] + 1f37224: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f37228: e1a01007 mov r1, r7 + 1f3722c: e594001c ldr r0, [r4, #28] + 1f37230: e12fff33 blx r3 + 1f37234: e3500000 cmp r0, #0 + 1f37238: 02843029 addeq r3, r4, #41 ; 0x29 + 1f3723c: 10873000 addne r3, r7, r0 + 1f37240: 01a02003 moveq r2, r3 + 1f37244: 12842029 addne r2, r4, #41 ; 0x29 + 1f37248: 05840020 streq r0, [r4, #32] + 1f3724c: 01a06000 moveq r6, r0 + 1f37250: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f37254: 15d46028 ldrbne r6, [r4, #40] ; 0x28 + 1f37258: e58430ac str r3, [r4, #172] ; 0xac + 1f3725c: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f37260: eaffffb8 b 1f37148 + 1f37264: e3a03000 mov r3, #0 + 1f37268: e5853008 str r3, [r5, #8] + 1f3726c: e59d2024 ldr r2, [sp, #36] ; 0x24 + 1f37270: e3003f90 movw r3, #3984 ; 0xf90 + 1f37274: e34031f6 movt r3, #502 ; 0x1f6 + 1f37278: e5823000 str r3, [r2] + 1f3727c: e3a0a000 mov sl, #0 + 1f37280: eafff789 b 1f350ac + 1f37284: e5943010 ldr r3, [r4, #16] + 1f37288: e3530000 cmp r3, #0 + 1f3728c: 0a000181 beq 1f37898 + 1f37290: e59420ac ldr r2, [r4, #172] ; 0xac + 1f37294: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f37298: e59d000c ldr r0, [sp, #12] + 1f3729c: e0631002 rsb r1, r3, r2 + 1f372a0: e1500001 cmp r0, r1 + 1f372a4: ca000173 bgt 1f37878 + 1f372a8: e59d100c ldr r1, [sp, #12] + 1f372ac: e0833001 add r3, r3, r1 + 1f372b0: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f372b4: e2846028 add r6, r4, #40 ; 0x28 + 1f372b8: e1530002 cmp r3, r2 + 1f372bc: 3a000021 bcc 1f37348 + 1f372c0: e5943020 ldr r3, [r4, #32] + 1f372c4: e3530000 cmp r3, #0 + 1f372c8: 0afffea4 beq 1f36d60 + 1f372cc: e5943010 ldr r3, [r4, #16] + 1f372d0: e1a01006 mov r1, r6 + 1f372d4: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f372d8: e594001c ldr r0, [r4, #28] + 1f372dc: e12fff33 blx r3 + 1f372e0: e3500000 cmp r0, #0 + 1f372e4: 02842029 addeq r2, r4, #41 ; 0x29 + 1f372e8: 01a03000 moveq r3, r0 + 1f372ec: 15d43028 ldrbne r3, [r4, #40] ; 0x28 + 1f372f0: 01a0c002 moveq ip, r2 + 1f372f4: 1284c029 addne ip, r4, #41 ; 0x29 + 1f372f8: 10862000 addne r2, r6, r0 + 1f372fc: 05840020 streq r0, [r4, #32] + 1f37300: 01a01003 moveq r1, r3 + 1f37304: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f37308: 11a01003 movne r1, r3 + 1f3730c: e58420ac str r2, [r4, #172] ; 0xac + 1f37310: e1a0000c mov r0, ip + 1f37314: e584c0a8 str ip, [r4, #168] ; 0xa8 + 1f37318: e3510000 cmp r1, #0 + 1f3731c: 0afffe8f beq 1f36d60 + 1f37320: e594c010 ldr ip, [r4, #16] + 1f37324: e35c0000 cmp ip, #0 + 1f37328: 0a000002 beq 1f37338 + 1f3732c: e060c002 rsb ip, r0, r2 + 1f37330: e15c0001 cmp ip, r1 + 1f37334: ba000008 blt 1f3735c + 1f37338: e0803003 add r3, r0, r3 + 1f3733c: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f37340: e1530002 cmp r3, r2 + 1f37344: 2affffdd bcs 1f372c0 + 1f37348: e2830001 add r0, r3, #1 + 1f3734c: e58400a8 str r0, [r4, #168] ; 0xa8 + 1f37350: e5d33000 ldrb r3, [r3] + 1f37354: e1a01003 mov r1, r3 + 1f37358: eaffffee b 1f37318 + 1f3735c: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f37360: e06c1001 rsb r1, ip, r1 + 1f37364: e5943014 ldr r3, [r4, #20] + 1f37368: e594001c ldr r0, [r4, #28] + 1f3736c: e12fff33 blx r3 + 1f37370: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f37374: e59420ac ldr r2, [r4, #172] ; 0xac + 1f37378: eaffffce b 1f372b8 + 1f3737c: e59d2024 ldr r2, [sp, #36] ; 0x24 + 1f37380: e3013148 movw r3, #4424 ; 0x1148 + 1f37384: e34031f6 movt r3, #502 ; 0x1f6 + 1f37388: e5823000 str r3, [r2] + 1f3738c: eafffe05 b 1f36ba8 + 1f37390: e59d2024 ldr r2, [sp, #36] ; 0x24 + 1f37394: e3013158 movw r3, #4440 ; 0x1158 + 1f37398: e34031f6 movt r3, #502 ; 0x1f6 + 1f3739c: e5823000 str r3, [r2] + 1f373a0: eafffe00 b 1f36ba8 + 1f373a4: e5d42028 ldrb r2, [r4, #40] ; 0x28 + 1f373a8: e0877000 add r7, r7, r0 + 1f373ac: e2840029 add r0, r4, #41 ; 0x29 + 1f373b0: e2021040 and r1, r2, #64 ; 0x40 + 1f373b4: e3c2c07f bic ip, r2, #127 ; 0x7f + 1f373b8: e6ef1071 uxtb r1, r1 + 1f373bc: e6efc07c uxtb ip, ip + 1f373c0: eaffff91 b 1f3720c + 1f373c4: e2831001 add r1, r3, #1 + 1f373c8: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f373cc: e5d3c000 ldrb ip, [r3] + 1f373d0: e1a03001 mov r3, r1 + 1f373d4: e1a0100c mov r1, ip + 1f373d8: e3510004 cmp r1, #4 + 1f373dc: 1affff17 bne 1f37040 + 1f373e0: e1530002 cmp r3, r2 + 1f373e4: 3a000133 bcc 1f378b8 + 1f373e8: e5942020 ldr r2, [r4, #32] + 1f373ec: e3520000 cmp r2, #0 + 1f373f0: 0a000010 beq 1f37438 + 1f373f4: e2846028 add r6, r4, #40 ; 0x28 + 1f373f8: e5943010 ldr r3, [r4, #16] + 1f373fc: e1a01006 mov r1, r6 + 1f37400: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f37404: e594001c ldr r0, [r4, #28] + 1f37408: e12fff33 blx r3 + 1f3740c: e3500000 cmp r0, #0 + 1f37410: 02843029 addeq r3, r4, #41 ; 0x29 + 1f37414: 10863000 addne r3, r6, r0 + 1f37418: 15d42028 ldrbne r2, [r4, #40] ; 0x28 + 1f3741c: 01a01003 moveq r1, r3 + 1f37420: 12841029 addne r1, r4, #41 ; 0x29 + 1f37424: 05840020 streq r0, [r4, #32] + 1f37428: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f3742c: 01a02000 moveq r2, r0 + 1f37430: e58430ac str r3, [r4, #172] ; 0xac + 1f37434: e58410a8 str r1, [r4, #168] ; 0xa8 + 1f37438: e5852020 str r2, [r5, #32] + 1f3743c: e1a00004 mov r0, r4 + 1f37440: ebffcdea bl 1f2abf0 + 1f37444: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f37448: e59420ac ldr r2, [r4, #172] ; 0xac + 1f3744c: e5850024 str r0, [r5, #36] ; 0x24 + 1f37450: e1530002 cmp r3, r2 + 1f37454: 3a000112 bcc 1f378a4 + 1f37458: e5941020 ldr r1, [r4, #32] + 1f3745c: e3510000 cmp r1, #0 + 1f37460: 0a000011 beq 1f374ac + 1f37464: e2846028 add r6, r4, #40 ; 0x28 + 1f37468: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f3746c: e1a01006 mov r1, r6 + 1f37470: e5943010 ldr r3, [r4, #16] + 1f37474: e594001c ldr r0, [r4, #28] + 1f37478: e12fff33 blx r3 + 1f3747c: e3500000 cmp r0, #0 + 1f37480: 02842029 addeq r2, r4, #41 ; 0x29 + 1f37484: 10862000 addne r2, r6, r0 + 1f37488: 05840020 streq r0, [r4, #32] + 1f3748c: 12840029 addne r0, r4, #41 ; 0x29 + 1f37490: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f37494: 01a01000 moveq r1, r0 + 1f37498: 15d41028 ldrbne r1, [r4, #40] ; 0x28 + 1f3749c: 01a00002 moveq r0, r2 + 1f374a0: e58420ac str r2, [r4, #172] ; 0xac + 1f374a4: e1a03000 mov r3, r0 + 1f374a8: e58400a8 str r0, [r4, #168] ; 0xa8 + 1f374ac: e585101c str r1, [r5, #28] + 1f374b0: eafffd84 b 1f36ac8 + 1f374b4: e1a0c00b mov ip, fp + 1f374b8: eafffa47 b 1f35ddc + 1f374bc: e1a0600b mov r6, fp + 1f374c0: eafff8c0 b 1f357c8 + 1f374c4: e1a0600b mov r6, fp + 1f374c8: eafffab0 b 1f35f90 + 1f374cc: e1a0e00b mov lr, fp + 1f374d0: eafff955 b 1f35a2c + 1f374d4: e1a0600b mov r6, fp + 1f374d8: eafff7b1 b 1f353a4 + 1f374dc: e1a0e00b mov lr, fp + 1f374e0: eafff83b b 1f355d4 + 1f374e4: e1a0e00b mov lr, fp + 1f374e8: eafff9d8 b 1f35c50 + 1f374ec: e1a0e00b mov lr, fp + 1f374f0: eafffb3c b 1f361e8 + 1f374f4: e2823001 add r3, r2, #1 + 1f374f8: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f374fc: e5d22000 ldrb r2, [r2] + 1f37500: eafff695 b 1f34f5c + 1f37504: e1a0600b mov r6, fp + 1f37508: eafffb97 b 1f3636c + 1f3750c: e1a0c00b mov ip, fp + 1f37510: eafffc82 b 1f36720 + 1f37514: e1a0e00b mov lr, fp + 1f37518: eafff723 b 1f351ac + 1f3751c: e1a0e00b mov lr, fp + 1f37520: eafff506 b 1f34940 + 1f37524: e2812006 add r2, r1, #6 + 1f37528: e2803008 add r3, r0, #8 + 1f3752c: e1a0c00b mov ip, fp + 1f37530: e3e05000 mvn r5, #0 + 1f37534: e152e0b6 ldrh lr, [r2, #-6] + 1f37538: e24cc001 sub ip, ip, #1 + 1f3753c: e143e0b8 strh lr, [r3, #-8] + 1f37540: e37c0001 cmn ip, #1 + 1f37544: e2822006 add r2, r2, #6 + 1f37548: e2833008 add r3, r3, #8 + 1f3754c: e152e0ba ldrh lr, [r2, #-10] + 1f37550: e143e0be strh lr, [r3, #-14] + 1f37554: e152e0b8 ldrh lr, [r2, #-8] + 1f37558: e143e0bc strh lr, [r3, #-12] + 1f3755c: e14350ba strh r5, [r3, #-10] + 1f37560: 1afffff3 bne 1f37534 + 1f37564: eafff56b b 1f34b18 + 1f37568: e2812008 add r2, r1, #8 + 1f3756c: e2803006 add r3, r0, #6 + 1f37570: e1a0c00b mov ip, fp + 1f37574: e152e0b8 ldrh lr, [r2, #-8] + 1f37578: e24cc001 sub ip, ip, #1 + 1f3757c: e143e0b6 strh lr, [r3, #-6] + 1f37580: e37c0001 cmn ip, #1 + 1f37584: e2822008 add r2, r2, #8 + 1f37588: e2833006 add r3, r3, #6 + 1f3758c: e152e0be ldrh lr, [r2, #-14] + 1f37590: e143e0ba strh lr, [r3, #-10] + 1f37594: e152e0bc ldrh lr, [r2, #-12] + 1f37598: e143e0b8 strh lr, [r3, #-8] + 1f3759c: 1afffff4 bne 1f37574 + 1f375a0: eafff55c b 1f34b18 + 1f375a4: e2815008 add r5, r1, #8 + 1f375a8: e1a0600b mov r6, fp + 1f375ac: e155e0b6 ldrh lr, [r5, #-6] + 1f375b0: e3a08096 mov r8, #150 ; 0x96 + 1f375b4: e155c0b8 ldrh ip, [r5, #-8] + 1f375b8: e2466001 sub r6, r6, #1 + 1f375bc: e15520b4 ldrh r2, [r5, #-4] + 1f375c0: e3760001 cmn r6, #1 + 1f375c4: e00e0e98 mul lr, r8, lr + 1f375c8: e3a0804d mov r8, #77 ; 0x4d + 1f375cc: e2855008 add r5, r5, #8 + 1f375d0: e02cec98 mla ip, r8, ip, lr + 1f375d4: e3a0e01d mov lr, #29 + 1f375d8: e022c29e mla r2, lr, r2, ip + 1f375dc: e1a02442 asr r2, r2, #8 + 1f375e0: e0c320b2 strh r2, [r3], #2 + 1f375e4: 1afffff0 bne 1f375ac + 1f375e8: eafff54a b 1f34b18 + 1f375ec: e281c004 add ip, r1, #4 + 1f375f0: e1a0200b mov r2, fp + 1f375f4: e2422001 sub r2, r2, #1 + 1f375f8: e15ce0b4 ldrh lr, [ip, #-4] + 1f375fc: e3720001 cmn r2, #1 + 1f37600: e0c3e0b2 strh lr, [r3], #2 + 1f37604: e28cc004 add ip, ip, #4 + 1f37608: 1afffff9 bne 1f375f4 + 1f3760c: eafff541 b 1f34b18 + 1f37610: e2812004 add r2, r1, #4 + 1f37614: e2803008 add r3, r0, #8 + 1f37618: e1a0e00b mov lr, fp + 1f3761c: e152c0b4 ldrh ip, [r2, #-4] + 1f37620: e24ee001 sub lr, lr, #1 + 1f37624: e143c0b4 strh ip, [r3, #-4] + 1f37628: e37e0001 cmn lr, #1 + 1f3762c: e143c0b6 strh ip, [r3, #-6] + 1f37630: e2822004 add r2, r2, #4 + 1f37634: e143c0b8 strh ip, [r3, #-8] + 1f37638: e2833008 add r3, r3, #8 + 1f3763c: e152c0b6 ldrh ip, [r2, #-6] + 1f37640: e143c0ba strh ip, [r3, #-10] + 1f37644: 1afffff4 bne 1f3761c + 1f37648: eafff532 b 1f34b18 + 1f3764c: e2803008 add r3, r0, #8 + 1f37650: e241e002 sub lr, r1, #2 + 1f37654: e1a0c00b mov ip, fp + 1f37658: e3e05000 mvn r5, #0 + 1f3765c: e24cc001 sub ip, ip, #1 + 1f37660: e1fe20b2 ldrh r2, [lr, #2]! + 1f37664: e37c0001 cmn ip, #1 + 1f37668: e14320b4 strh r2, [r3, #-4] + 1f3766c: e14320b6 strh r2, [r3, #-6] + 1f37670: e2833008 add r3, r3, #8 + 1f37674: e14321b0 strh r2, [r3, #-16] + 1f37678: e14350ba strh r5, [r3, #-10] + 1f3767c: 1afffff6 bne 1f3765c + 1f37680: eafff524 b 1f34b18 + 1f37684: e281e006 add lr, r1, #6 + 1f37688: e2805004 add r5, r0, #4 + 1f3768c: e1a0600b mov r6, fp + 1f37690: e15ec0b4 ldrh ip, [lr, #-4] + 1f37694: e3a08096 mov r8, #150 ; 0x96 + 1f37698: e15e20b6 ldrh r2, [lr, #-6] + 1f3769c: e2466001 sub r6, r6, #1 + 1f376a0: e15e30b2 ldrh r3, [lr, #-2] + 1f376a4: e3760001 cmn r6, #1 + 1f376a8: e00c0c98 mul ip, r8, ip + 1f376ac: e3a0804d mov r8, #77 ; 0x4d + 1f376b0: e28ee006 add lr, lr, #6 + 1f376b4: e2855004 add r5, r5, #4 + 1f376b8: e022c298 mla r2, r8, r2, ip + 1f376bc: e3e0c000 mvn ip, #0 + 1f376c0: e145c0b6 strh ip, [r5, #-6] + 1f376c4: e3a0c01d mov ip, #29 + 1f376c8: e023239c mla r3, ip, r3, r2 + 1f376cc: e1a03443 asr r3, r3, #8 + 1f376d0: e14530b8 strh r3, [r5, #-8] + 1f376d4: 1affffed bne 1f37690 + 1f376d8: eafff50e b 1f34b18 + 1f376dc: e281e008 add lr, r1, #8 + 1f376e0: e2805004 add r5, r0, #4 + 1f376e4: e1a0600b mov r6, fp + 1f376e8: e15ec0b6 ldrh ip, [lr, #-6] + 1f376ec: e3a08096 mov r8, #150 ; 0x96 + 1f376f0: e15e20b8 ldrh r2, [lr, #-8] + 1f376f4: e2466001 sub r6, r6, #1 + 1f376f8: e15e30b4 ldrh r3, [lr, #-4] + 1f376fc: e3760001 cmn r6, #1 + 1f37700: e00c0c98 mul ip, r8, ip + 1f37704: e3a0804d mov r8, #77 ; 0x4d + 1f37708: e28ee008 add lr, lr, #8 + 1f3770c: e2855004 add r5, r5, #4 + 1f37710: e022c298 mla r2, r8, r2, ip + 1f37714: e3a0c01d mov ip, #29 + 1f37718: e023239c mla r3, ip, r3, r2 + 1f3771c: e1a03443 asr r3, r3, #8 + 1f37720: e14530b8 strh r3, [r5, #-8] + 1f37724: e15e30ba ldrh r3, [lr, #-10] + 1f37728: e14530b6 strh r3, [r5, #-6] + 1f3772c: 1affffed bne 1f376e8 + 1f37730: eafff4f8 b 1f34b18 + 1f37734: e2803006 add r3, r0, #6 + 1f37738: e241e002 sub lr, r1, #2 + 1f3773c: e1a0c00b mov ip, fp + 1f37740: e24cc001 sub ip, ip, #1 + 1f37744: e1fe20b2 ldrh r2, [lr, #2]! + 1f37748: e37c0001 cmn ip, #1 + 1f3774c: e14320b2 strh r2, [r3, #-2] + 1f37750: e14320b4 strh r2, [r3, #-4] + 1f37754: e2833006 add r3, r3, #6 + 1f37758: e14320bc strh r2, [r3, #-12] + 1f3775c: 1afffff7 bne 1f37740 + 1f37760: eafff4ec b 1f34b18 + 1f37764: e2803004 add r3, r0, #4 + 1f37768: e241c002 sub ip, r1, #2 + 1f3776c: e1a0200b mov r2, fp + 1f37770: e3e05000 mvn r5, #0 + 1f37774: e2422001 sub r2, r2, #1 + 1f37778: e1fce0b2 ldrh lr, [ip, #2]! + 1f3777c: e3720001 cmn r2, #1 + 1f37780: e143e0b4 strh lr, [r3, #-4] + 1f37784: e14350b2 strh r5, [r3, #-2] + 1f37788: e2833004 add r3, r3, #4 + 1f3778c: 1afffff8 bne 1f37774 + 1f37790: eafff4e0 b 1f34b18 + 1f37794: e59d2024 ldr r2, [sp, #36] ; 0x24 + 1f37798: e3013134 movw r3, #4404 ; 0x1134 + 1f3779c: e34031f6 movt r3, #502 ; 0x1f6 + 1f377a0: e5957008 ldr r7, [r5, #8] + 1f377a4: e5823000 str r3, [r2] + 1f377a8: eafff63a b 1f35098 + 1f377ac: e2846028 add r6, r4, #40 ; 0x28 + 1f377b0: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f377b4: e5943010 ldr r3, [r4, #16] + 1f377b8: e1a01006 mov r1, r6 + 1f377bc: e594001c ldr r0, [r4, #28] + 1f377c0: e12fff33 blx r3 + 1f377c4: e3500000 cmp r0, #0 + 1f377c8: 02842029 addeq r2, r4, #41 ; 0x29 + 1f377cc: 01a0c000 moveq ip, r0 + 1f377d0: 15d4c028 ldrbne ip, [r4, #40] ; 0x28 + 1f377d4: 01a03002 moveq r3, r2 + 1f377d8: 10862000 addne r2, r6, r0 + 1f377dc: 12843029 addne r3, r4, #41 ; 0x29 + 1f377e0: 05840020 streq r0, [r4, #32] + 1f377e4: 01a0100c moveq r1, ip + 1f377e8: 05c40028 strbeq r0, [r4, #40] ; 0x28 + 1f377ec: 11a0100c movne r1, ip + 1f377f0: e58420ac str r2, [r4, #172] ; 0xac + 1f377f4: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f377f8: eafffef6 b 1f373d8 + 1f377fc: e281e004 add lr, r1, #4 + 1f37800: e2803006 add r3, r0, #6 + 1f37804: e1a0c00b mov ip, fp + 1f37808: e24cc001 sub ip, ip, #1 + 1f3780c: e15e20b4 ldrh r2, [lr, #-4] + 1f37810: e37c0001 cmn ip, #1 + 1f37814: e14320b2 strh r2, [r3, #-2] + 1f37818: e14320b4 strh r2, [r3, #-4] + 1f3781c: e28ee004 add lr, lr, #4 + 1f37820: e14320b6 strh r2, [r3, #-6] + 1f37824: e2833006 add r3, r3, #6 + 1f37828: 1afffff6 bne 1f37808 + 1f3782c: eafff4b9 b 1f34b18 + 1f37830: e2815006 add r5, r1, #6 + 1f37834: e1a0600b mov r6, fp + 1f37838: e155e0b4 ldrh lr, [r5, #-4] + 1f3783c: e3a08096 mov r8, #150 ; 0x96 + 1f37840: e155c0b6 ldrh ip, [r5, #-6] + 1f37844: e2466001 sub r6, r6, #1 + 1f37848: e15520b2 ldrh r2, [r5, #-2] + 1f3784c: e3760001 cmn r6, #1 + 1f37850: e00e0e98 mul lr, r8, lr + 1f37854: e3a0804d mov r8, #77 ; 0x4d + 1f37858: e2855006 add r5, r5, #6 + 1f3785c: e02cec98 mla ip, r8, ip, lr + 1f37860: e3a0e01d mov lr, #29 + 1f37864: e022c29e mla r2, lr, r2, ip + 1f37868: e1a02442 asr r2, r2, #8 + 1f3786c: e0c320b2 strh r2, [r3], #2 + 1f37870: 1afffff0 bne 1f37838 + 1f37874: eafff4a7 b 1f34b18 + 1f37878: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f3787c: e0611000 rsb r1, r1, r0 + 1f37880: e5943014 ldr r3, [r4, #20] + 1f37884: e594001c ldr r0, [r4, #28] + 1f37888: e12fff33 blx r3 + 1f3788c: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f37890: e59420ac ldr r2, [r4, #172] ; 0xac + 1f37894: eafffe86 b 1f372b4 + 1f37898: e59430a8 ldr r3, [r4, #168] ; 0xa8 + 1f3789c: e59420ac ldr r2, [r4, #172] ; 0xac + 1f378a0: eafffe80 b 1f372a8 + 1f378a4: e2830001 add r0, r3, #1 + 1f378a8: e58400a8 str r0, [r4, #168] ; 0xa8 + 1f378ac: e5d31000 ldrb r1, [r3] + 1f378b0: e1a03000 mov r3, r0 + 1f378b4: eafffefc b 1f374ac + 1f378b8: e2832001 add r2, r3, #1 + 1f378bc: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f378c0: e5d32000 ldrb r2, [r3] + 1f378c4: eafffedb b 1f37438 + 1f378c8: e0601001 rsb r1, r0, r1 + 1f378cc: e58420a8 str r2, [r4, #168] ; 0xa8 + 1f378d0: e5943014 ldr r3, [r4, #20] + 1f378d4: e594001c ldr r0, [r4, #28] + 1f378d8: e12fff33 blx r3 + 1f378dc: eafffc31 b 1f369a8 + 1f378e0: e1a00004 mov r0, r4 + 1f378e4: eb001b27 bl 1f3e588 + 1f378e8: e30a336c movw r3, #41836 ; 0xa36c + 1f378ec: e340320d movt r3, #525 ; 0x20d + 1f378f0: e59d1234 ldr r1, [sp, #564] ; 0x234 + 1f378f4: e3002f90 movw r2, #3984 ; 0xf90 + 1f378f8: e34021f6 movt r2, #502 ; 0x1f6 + 1f378fc: e5832000 str r2, [r3] + 1f37900: e1a0000a mov r0, sl + 1f37904: e59d32b0 ldr r3, [sp, #688] ; 0x2b0 + 1f37908: e581300c str r3, [r1, #12] + 1f3790c: eafff2cb b 1f34440 + 1f37910: e1a03000 mov r3, r0 + 1f37914: eafffc25 b 1f369b0 + +01f37918 : + 1f37918: e30a336c movw r3, #41836 ; 0xa36c + 1f3791c: e340320d movt r3, #525 ; 0x20d + 1f37920: e5930000 ldr r0, [r3] + 1f37924: e12fff1e bx lr + +01f37928 : + 1f37928: ea001b16 b 1f3e588 + +01f3792c : + 1f3792c: e30a3370 movw r3, #41840 ; 0xa370 + 1f37930: e340320d movt r3, #525 ; 0x20d + 1f37934: e5830000 str r0, [r3] + 1f37938: e12fff1e bx lr + +01f3793c : + 1f3793c: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f37940: e1a08002 mov r8, r2 + 1f37944: e1a09003 mov r9, r3 + 1f37948: e24dd0d0 sub sp, sp, #208 ; 0xd0 + 1f3794c: e080e001 add lr, r0, r1 + 1f37950: e1a0c000 mov ip, r0 + 1f37954: e1a02009 mov r2, r9 + 1f37958: e28d000c add r0, sp, #12 + 1f3795c: e1a01008 mov r1, r8 + 1f37960: e59d70f4 ldr r7, [sp, #244] ; 0xf4 + 1f37964: e58d0004 str r0, [sp, #4] + 1f37968: e28d0018 add r0, sp, #24 + 1f3796c: e59d30f0 ldr r3, [sp, #240] ; 0xf0 + 1f37970: e58d7000 str r7, [sp] + 1f37974: e58de0cc str lr, [sp, #204] ; 0xcc + 1f37978: e58de0c4 str lr, [sp, #196] ; 0xc4 + 1f3797c: e3a0e000 mov lr, #0 + 1f37980: e58dc0c8 str ip, [sp, #200] ; 0xc8 + 1f37984: e58dc0c0 str ip, [sp, #192] ; 0xc0 + 1f37988: e58de028 str lr, [sp, #40] ; 0x28 + 1f3798c: e58de038 str lr, [sp, #56] ; 0x38 + 1f37990: ebfff271 bl 1f3435c + 1f37994: e2506000 subs r6, r0, #0 + 1f37998: 0a0000ea beq 1f37d48 + 1f3799c: e59d300c ldr r3, [sp, #12] + 1f379a0: e3530010 cmp r3, #16 + 1f379a4: 01a04006 moveq r4, r6 + 1f379a8: 0a0000cb beq 1f37cdc + 1f379ac: e3570000 cmp r7, #0 + 1f379b0: e5985000 ldr r5, [r8] + 1f379b4: e5993000 ldr r3, [r9] + 1f379b8: 11a02007 movne r2, r7 + 1f379bc: 059d20f0 ldreq r2, [sp, #240] ; 0xf0 + 1f379c0: e0030593 mul r3, r3, r5 + 1f379c4: 05922000 ldreq r2, [r2] + 1f379c8: e0050392 mul r5, r2, r3 + 1f379cc: e1a0a085 lsl sl, r5, #1 + 1f379d0: e1a0000a mov r0, sl + 1f379d4: eb001ae3 bl 1f3e568 + 1f379d8: e2504000 subs r4, r0, #0 + 1f379dc: 0a0000db beq 1f37d50 + 1f379e0: e3550000 cmp r5, #0 + 1f379e4: da0000b8 ble 1f37ccc + 1f379e8: e084a00a add sl, r4, sl + 1f379ec: e0860005 add r0, r6, r5 + 1f379f0: e1540000 cmp r4, r0 + 1f379f4: 3156000a cmpcc r6, sl + 1f379f8: 23a0a001 movcs sl, #1 + 1f379fc: 33a0a000 movcc sl, #0 + 1f37a00: e3550012 cmp r5, #18 + 1f37a04: 93a0a000 movls sl, #0 + 1f37a08: 820aa001 andhi sl, sl, #1 + 1f37a0c: e35a0000 cmp sl, #0 + 1f37a10: 0a0000c4 beq 1f37d28 + 1f37a14: e7e130d4 ubfx r3, r4, #1, #2 + 1f37a18: e2633000 rsb r3, r3, #0 + 1f37a1c: e2033007 and r3, r3, #7 + 1f37a20: e1530005 cmp r3, r5 + 1f37a24: 21a03005 movcs r3, r5 + 1f37a28: e3530000 cmp r3, #0 + 1f37a2c: 0a0000bb beq 1f37d20 + 1f37a30: e5d62000 ldrb r2, [r6] + 1f37a34: e3530001 cmp r3, #1 + 1f37a38: e0822402 add r2, r2, r2, lsl #8 + 1f37a3c: e1c420b0 strh r2, [r4] + 1f37a40: 0a0000b6 beq 1f37d20 + 1f37a44: e5d62001 ldrb r2, [r6, #1] + 1f37a48: e3530002 cmp r3, #2 + 1f37a4c: e0822402 add r2, r2, r2, lsl #8 + 1f37a50: e1c420b2 strh r2, [r4, #2] + 1f37a54: 0a0000b1 beq 1f37d20 + 1f37a58: e5d62002 ldrb r2, [r6, #2] + 1f37a5c: e3530003 cmp r3, #3 + 1f37a60: e0822402 add r2, r2, r2, lsl #8 + 1f37a64: e1c420b4 strh r2, [r4, #4] + 1f37a68: 0a0000ac beq 1f37d20 + 1f37a6c: e5d62003 ldrb r2, [r6, #3] + 1f37a70: e3530004 cmp r3, #4 + 1f37a74: e0822402 add r2, r2, r2, lsl #8 + 1f37a78: e1c420b6 strh r2, [r4, #6] + 1f37a7c: 0a0000a7 beq 1f37d20 + 1f37a80: e5d62004 ldrb r2, [r6, #4] + 1f37a84: e3530005 cmp r3, #5 + 1f37a88: e0822402 add r2, r2, r2, lsl #8 + 1f37a8c: e1c420b8 strh r2, [r4, #8] + 1f37a90: 0a0000a2 beq 1f37d20 + 1f37a94: e5d62005 ldrb r2, [r6, #5] + 1f37a98: e3530006 cmp r3, #6 + 1f37a9c: e0822402 add r2, r2, r2, lsl #8 + 1f37aa0: e1c420ba strh r2, [r4, #10] + 1f37aa4: 13a02007 movne r2, #7 + 1f37aa8: 03a02006 moveq r2, #6 + 1f37aac: 15d61006 ldrbne r1, [r6, #6] + 1f37ab0: 10811401 addne r1, r1, r1, lsl #8 + 1f37ab4: 11c410bc strhne r1, [r4, #12] + 1f37ab8: e063c005 rsb ip, r3, r5 + 1f37abc: e2450001 sub r0, r5, #1 + 1f37ac0: e24c1010 sub r1, ip, #16 + 1f37ac4: e0630000 rsb r0, r3, r0 + 1f37ac8: e350000e cmp r0, #14 + 1f37acc: e1a01221 lsr r1, r1, #4 + 1f37ad0: e2811001 add r1, r1, #1 + 1f37ad4: e1a0e201 lsl lr, r1, #4 + 1f37ad8: 9a000016 bls 1f37b38 + 1f37adc: e0840083 add r0, r4, r3, lsl #1 + 1f37ae0: e3a0a000 mov sl, #0 + 1f37ae4: e0863003 add r3, r6, r3 + 1f37ae8: e2800020 add r0, r0, #32 + 1f37aec: f4630a0f vld1.8 {d16-d17}, [r3] + 1f37af0: e28aa001 add sl, sl, #1 + 1f37af4: e15a0001 cmp sl, r1 + 1f37af8: e2833010 add r3, r3, #16 + 1f37afc: e2800020 add r0, r0, #32 + 1f37b00: f3c84a30 vmovl.u8 q10, d16 + 1f37b04: f3f26320 vshll.i8 q11, d16, #8 + 1f37b08: f3c82a31 vmovl.u8 q9, d17 + 1f37b0c: f3f20321 vshll.i8 q8, d17, #8 + 1f37b10: f25448e6 vadd.i16 q10, q10, q11 + 1f37b14: f25208e0 vadd.i16 q8, q9, q8 + 1f37b18: ed404b10 vstr d20, [r0, #-64] ; 0xffffffc0 + 1f37b1c: ed405b0e vstr d21, [r0, #-56] ; 0xffffffc8 + 1f37b20: ed400b0c vstr d16, [r0, #-48] ; 0xffffffd0 + 1f37b24: ed401b0a vstr d17, [r0, #-40] ; 0xffffffd8 + 1f37b28: 3affffef bcc 1f37aec + 1f37b2c: e15c000e cmp ip, lr + 1f37b30: e082200e add r2, r2, lr + 1f37b34: 0a000064 beq 1f37ccc + 1f37b38: e7d61002 ldrb r1, [r6, r2] + 1f37b3c: e1a00082 lsl r0, r2, #1 + 1f37b40: e2823001 add r3, r2, #1 + 1f37b44: e1550003 cmp r5, r3 + 1f37b48: e0811401 add r1, r1, r1, lsl #8 + 1f37b4c: e18410b0 strh r1, [r4, r0] + 1f37b50: da00005d ble 1f37ccc + 1f37b54: e7d60003 ldrb r0, [r6, r3] + 1f37b58: e1a01083 lsl r1, r3, #1 + 1f37b5c: e2823002 add r3, r2, #2 + 1f37b60: e1550003 cmp r5, r3 + 1f37b64: e0800400 add r0, r0, r0, lsl #8 + 1f37b68: e18400b1 strh r0, [r4, r1] + 1f37b6c: da000056 ble 1f37ccc + 1f37b70: e7d60003 ldrb r0, [r6, r3] + 1f37b74: e1a01083 lsl r1, r3, #1 + 1f37b78: e2823003 add r3, r2, #3 + 1f37b7c: e1550003 cmp r5, r3 + 1f37b80: e0800400 add r0, r0, r0, lsl #8 + 1f37b84: e18400b1 strh r0, [r4, r1] + 1f37b88: da00004f ble 1f37ccc + 1f37b8c: e7d60003 ldrb r0, [r6, r3] + 1f37b90: e1a01083 lsl r1, r3, #1 + 1f37b94: e2823004 add r3, r2, #4 + 1f37b98: e1550003 cmp r5, r3 + 1f37b9c: e0800400 add r0, r0, r0, lsl #8 + 1f37ba0: e18400b1 strh r0, [r4, r1] + 1f37ba4: da000048 ble 1f37ccc + 1f37ba8: e7d60003 ldrb r0, [r6, r3] + 1f37bac: e1a01083 lsl r1, r3, #1 + 1f37bb0: e2823005 add r3, r2, #5 + 1f37bb4: e1550003 cmp r5, r3 + 1f37bb8: e0800400 add r0, r0, r0, lsl #8 + 1f37bbc: e18400b1 strh r0, [r4, r1] + 1f37bc0: da000041 ble 1f37ccc + 1f37bc4: e7d60003 ldrb r0, [r6, r3] + 1f37bc8: e1a01083 lsl r1, r3, #1 + 1f37bcc: e2823006 add r3, r2, #6 + 1f37bd0: e1550003 cmp r5, r3 + 1f37bd4: e0800400 add r0, r0, r0, lsl #8 + 1f37bd8: e18400b1 strh r0, [r4, r1] + 1f37bdc: da00003a ble 1f37ccc + 1f37be0: e7d60003 ldrb r0, [r6, r3] + 1f37be4: e1a01083 lsl r1, r3, #1 + 1f37be8: e2823007 add r3, r2, #7 + 1f37bec: e1550003 cmp r5, r3 + 1f37bf0: e0800400 add r0, r0, r0, lsl #8 + 1f37bf4: e18400b1 strh r0, [r4, r1] + 1f37bf8: da000033 ble 1f37ccc + 1f37bfc: e7d60003 ldrb r0, [r6, r3] + 1f37c00: e1a01083 lsl r1, r3, #1 + 1f37c04: e2823008 add r3, r2, #8 + 1f37c08: e1550003 cmp r5, r3 + 1f37c0c: e0800400 add r0, r0, r0, lsl #8 + 1f37c10: e18400b1 strh r0, [r4, r1] + 1f37c14: da00002c ble 1f37ccc + 1f37c18: e7d60003 ldrb r0, [r6, r3] + 1f37c1c: e1a01083 lsl r1, r3, #1 + 1f37c20: e2823009 add r3, r2, #9 + 1f37c24: e1550003 cmp r5, r3 + 1f37c28: e0800400 add r0, r0, r0, lsl #8 + 1f37c2c: e18400b1 strh r0, [r4, r1] + 1f37c30: da000025 ble 1f37ccc + 1f37c34: e7d60003 ldrb r0, [r6, r3] + 1f37c38: e1a01083 lsl r1, r3, #1 + 1f37c3c: e282300a add r3, r2, #10 + 1f37c40: e1550003 cmp r5, r3 + 1f37c44: e0800400 add r0, r0, r0, lsl #8 + 1f37c48: e18400b1 strh r0, [r4, r1] + 1f37c4c: da00001e ble 1f37ccc + 1f37c50: e7d60003 ldrb r0, [r6, r3] + 1f37c54: e1a01083 lsl r1, r3, #1 + 1f37c58: e282300b add r3, r2, #11 + 1f37c5c: e1550003 cmp r5, r3 + 1f37c60: e0800400 add r0, r0, r0, lsl #8 + 1f37c64: e18400b1 strh r0, [r4, r1] + 1f37c68: da000017 ble 1f37ccc + 1f37c6c: e7d60003 ldrb r0, [r6, r3] + 1f37c70: e1a01083 lsl r1, r3, #1 + 1f37c74: e282300c add r3, r2, #12 + 1f37c78: e1550003 cmp r5, r3 + 1f37c7c: e0800400 add r0, r0, r0, lsl #8 + 1f37c80: e18400b1 strh r0, [r4, r1] + 1f37c84: da000010 ble 1f37ccc + 1f37c88: e7d60003 ldrb r0, [r6, r3] + 1f37c8c: e282100d add r1, r2, #13 + 1f37c90: e1a03083 lsl r3, r3, #1 + 1f37c94: e1550001 cmp r5, r1 + 1f37c98: e0800400 add r0, r0, r0, lsl #8 + 1f37c9c: e18400b3 strh r0, [r4, r3] + 1f37ca0: da000009 ble 1f37ccc + 1f37ca4: e282300e add r3, r2, #14 + 1f37ca8: e7d62001 ldrb r2, [r6, r1] + 1f37cac: e1a01081 lsl r1, r1, #1 + 1f37cb0: e1550003 cmp r5, r3 + 1f37cb4: e0822402 add r2, r2, r2, lsl #8 + 1f37cb8: e18420b1 strh r2, [r4, r1] + 1f37cbc: c7d62003 ldrbgt r2, [r6, r3] + 1f37cc0: c1a03083 lslgt r3, r3, #1 + 1f37cc4: c0822402 addgt r2, r2, r2, lsl #8 + 1f37cc8: c18420b3 strhgt r2, [r4, r3] + 1f37ccc: e1a00006 mov r0, r6 + 1f37cd0: eb001a2c bl 1f3e588 + 1f37cd4: e3a03010 mov r3, #16 + 1f37cd8: e58d300c str r3, [sp, #12] + 1f37cdc: e30a3370 movw r3, #41840 ; 0xa370 + 1f37ce0: e340320d movt r3, #525 ; 0x20d + 1f37ce4: e5933000 ldr r3, [r3] + 1f37ce8: e3530000 cmp r3, #0 + 1f37cec: 01a00004 moveq r0, r4 + 1f37cf0: 0a000008 beq 1f37d18 + 1f37cf4: e3570000 cmp r7, #0 + 1f37cf8: e1a00004 mov r0, r4 + 1f37cfc: e5992000 ldr r2, [r9] + 1f37d00: 059d30f0 ldreq r3, [sp, #240] ; 0xf0 + 1f37d04: e5981000 ldr r1, [r8] + 1f37d08: 05937000 ldreq r7, [r3] + 1f37d0c: e1a03087 lsl r3, r7, #1 + 1f37d10: ebffbe84 bl 1f27728 + 1f37d14: e1a00004 mov r0, r4 + 1f37d18: e28dd0d0 add sp, sp, #208 ; 0xd0 + 1f37d1c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f37d20: e1a02003 mov r2, r3 + 1f37d24: eaffff63 b 1f37ab8 + 1f37d28: e1a02006 mov r2, r6 + 1f37d2c: e2441002 sub r1, r4, #2 + 1f37d30: e4d23001 ldrb r3, [r2], #1 + 1f37d34: e1520000 cmp r2, r0 + 1f37d38: e0833403 add r3, r3, r3, lsl #8 + 1f37d3c: e1e130b2 strh r3, [r1, #2]! + 1f37d40: 1afffffa bne 1f37d30 + 1f37d44: eaffffe0 b 1f37ccc + 1f37d48: e1a00006 mov r0, r6 + 1f37d4c: eafffff1 b 1f37d18 + 1f37d50: e30a336c movw r3, #41836 ; 0xa36c + 1f37d54: e340320d movt r3, #525 ; 0x20d + 1f37d58: e3002f90 movw r2, #3984 ; 0xf90 + 1f37d5c: e34021f6 movt r2, #502 ; 0x1f6 + 1f37d60: e5832000 str r2, [r3] + 1f37d64: eaffffda b 1f37cd4 + +01f37d68 : + 1f37d68: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f37d6c: e1a05001 mov r5, r1 + 1f37d70: e1a08002 mov r8, r2 + 1f37d74: e24dd0d0 sub sp, sp, #208 ; 0xd0 + 1f37d78: e3a0e080 mov lr, #128 ; 0x80 + 1f37d7c: e28dc028 add ip, sp, #40 ; 0x28 + 1f37d80: e28d4040 add r4, sp, #64 ; 0x40 + 1f37d84: e8900007 ldm r0, {r0, r1, r2} + 1f37d88: e88c0007 stm ip, {r0, r1, r2} + 1f37d8c: e58d5034 str r5, [sp, #52] ; 0x34 + 1f37d90: e3a0c001 mov ip, #1 + 1f37d94: e1a0200e mov r2, lr + 1f37d98: e58dc038 str ip, [sp, #56] ; 0x38 + 1f37d9c: e1a00005 mov r0, r5 + 1f37da0: e58de03c str lr, [sp, #60] ; 0x3c + 1f37da4: e1a01004 mov r1, r4 + 1f37da8: e59d5028 ldr r5, [sp, #40] ; 0x28 + 1f37dac: e58d40c8 str r4, [sp, #200] ; 0xc8 + 1f37db0: e1a09003 mov r9, r3 + 1f37db4: e59d70f4 ldr r7, [sp, #244] ; 0xf4 + 1f37db8: e12fff35 blx r5 + 1f37dbc: e3500000 cmp r0, #0 + 1f37dc0: e28d200c add r2, sp, #12 + 1f37dc4: 1084c000 addne ip, r4, r0 + 1f37dc8: 058d0038 streq r0, [sp, #56] ; 0x38 + 1f37dcc: 05cd0040 strbeq r0, [sp, #64] ; 0x40 + 1f37dd0: e1a01008 mov r1, r8 + 1f37dd4: e58d2004 str r2, [sp, #4] + 1f37dd8: e28d0018 add r0, sp, #24 + 1f37ddc: e58d7000 str r7, [sp] + 1f37de0: e1a02009 mov r2, r9 + 1f37de4: e59d30f0 ldr r3, [sp, #240] ; 0xf0 + 1f37de8: 028dc041 addeq ip, sp, #65 ; 0x41 + 1f37dec: e58d40c0 str r4, [sp, #192] ; 0xc0 + 1f37df0: e58dc0c4 str ip, [sp, #196] ; 0xc4 + 1f37df4: e58dc0cc str ip, [sp, #204] ; 0xcc + 1f37df8: ebfff157 bl 1f3435c + 1f37dfc: e2506000 subs r6, r0, #0 + 1f37e00: 0a0000ea beq 1f381b0 + 1f37e04: e59d300c ldr r3, [sp, #12] + 1f37e08: e3530010 cmp r3, #16 + 1f37e0c: 01a04006 moveq r4, r6 + 1f37e10: 0a0000cb beq 1f38144 + 1f37e14: e3570000 cmp r7, #0 + 1f37e18: e5985000 ldr r5, [r8] + 1f37e1c: e5993000 ldr r3, [r9] + 1f37e20: 11a02007 movne r2, r7 + 1f37e24: 059d20f0 ldreq r2, [sp, #240] ; 0xf0 + 1f37e28: e0030593 mul r3, r3, r5 + 1f37e2c: 05922000 ldreq r2, [r2] + 1f37e30: e0050392 mul r5, r2, r3 + 1f37e34: e1a0a085 lsl sl, r5, #1 + 1f37e38: e1a0000a mov r0, sl + 1f37e3c: eb0019c9 bl 1f3e568 + 1f37e40: e2504000 subs r4, r0, #0 + 1f37e44: 0a0000db beq 1f381b8 + 1f37e48: e3550000 cmp r5, #0 + 1f37e4c: da0000b8 ble 1f38134 + 1f37e50: e084a00a add sl, r4, sl + 1f37e54: e0860005 add r0, r6, r5 + 1f37e58: e1540000 cmp r4, r0 + 1f37e5c: 3156000a cmpcc r6, sl + 1f37e60: 23a0a001 movcs sl, #1 + 1f37e64: 33a0a000 movcc sl, #0 + 1f37e68: e3550012 cmp r5, #18 + 1f37e6c: 93a0a000 movls sl, #0 + 1f37e70: 820aa001 andhi sl, sl, #1 + 1f37e74: e35a0000 cmp sl, #0 + 1f37e78: 0a0000c4 beq 1f38190 + 1f37e7c: e7e130d4 ubfx r3, r4, #1, #2 + 1f37e80: e2633000 rsb r3, r3, #0 + 1f37e84: e2033007 and r3, r3, #7 + 1f37e88: e1530005 cmp r3, r5 + 1f37e8c: 21a03005 movcs r3, r5 + 1f37e90: e3530000 cmp r3, #0 + 1f37e94: 0a0000bb beq 1f38188 + 1f37e98: e5d62000 ldrb r2, [r6] + 1f37e9c: e3530001 cmp r3, #1 + 1f37ea0: e0822402 add r2, r2, r2, lsl #8 + 1f37ea4: e1c420b0 strh r2, [r4] + 1f37ea8: 0a0000b6 beq 1f38188 + 1f37eac: e5d62001 ldrb r2, [r6, #1] + 1f37eb0: e3530002 cmp r3, #2 + 1f37eb4: e0822402 add r2, r2, r2, lsl #8 + 1f37eb8: e1c420b2 strh r2, [r4, #2] + 1f37ebc: 0a0000b1 beq 1f38188 + 1f37ec0: e5d62002 ldrb r2, [r6, #2] + 1f37ec4: e3530003 cmp r3, #3 + 1f37ec8: e0822402 add r2, r2, r2, lsl #8 + 1f37ecc: e1c420b4 strh r2, [r4, #4] + 1f37ed0: 0a0000ac beq 1f38188 + 1f37ed4: e5d62003 ldrb r2, [r6, #3] + 1f37ed8: e3530004 cmp r3, #4 + 1f37edc: e0822402 add r2, r2, r2, lsl #8 + 1f37ee0: e1c420b6 strh r2, [r4, #6] + 1f37ee4: 0a0000a7 beq 1f38188 + 1f37ee8: e5d62004 ldrb r2, [r6, #4] + 1f37eec: e3530005 cmp r3, #5 + 1f37ef0: e0822402 add r2, r2, r2, lsl #8 + 1f37ef4: e1c420b8 strh r2, [r4, #8] + 1f37ef8: 0a0000a2 beq 1f38188 + 1f37efc: e5d62005 ldrb r2, [r6, #5] + 1f37f00: e3530006 cmp r3, #6 + 1f37f04: e0822402 add r2, r2, r2, lsl #8 + 1f37f08: e1c420ba strh r2, [r4, #10] + 1f37f0c: 13a02007 movne r2, #7 + 1f37f10: 03a02006 moveq r2, #6 + 1f37f14: 15d61006 ldrbne r1, [r6, #6] + 1f37f18: 10811401 addne r1, r1, r1, lsl #8 + 1f37f1c: 11c410bc strhne r1, [r4, #12] + 1f37f20: e063c005 rsb ip, r3, r5 + 1f37f24: e2450001 sub r0, r5, #1 + 1f37f28: e24c1010 sub r1, ip, #16 + 1f37f2c: e0630000 rsb r0, r3, r0 + 1f37f30: e350000e cmp r0, #14 + 1f37f34: e1a01221 lsr r1, r1, #4 + 1f37f38: e2811001 add r1, r1, #1 + 1f37f3c: e1a0e201 lsl lr, r1, #4 + 1f37f40: 9a000016 bls 1f37fa0 + 1f37f44: e0840083 add r0, r4, r3, lsl #1 + 1f37f48: e3a0a000 mov sl, #0 + 1f37f4c: e0863003 add r3, r6, r3 + 1f37f50: e2800020 add r0, r0, #32 + 1f37f54: f4630a0f vld1.8 {d16-d17}, [r3] + 1f37f58: e28aa001 add sl, sl, #1 + 1f37f5c: e15a0001 cmp sl, r1 + 1f37f60: e2833010 add r3, r3, #16 + 1f37f64: e2800020 add r0, r0, #32 + 1f37f68: f3c84a30 vmovl.u8 q10, d16 + 1f37f6c: f3f26320 vshll.i8 q11, d16, #8 + 1f37f70: f3c82a31 vmovl.u8 q9, d17 + 1f37f74: f3f20321 vshll.i8 q8, d17, #8 + 1f37f78: f25448e6 vadd.i16 q10, q10, q11 + 1f37f7c: f25208e0 vadd.i16 q8, q9, q8 + 1f37f80: ed404b10 vstr d20, [r0, #-64] ; 0xffffffc0 + 1f37f84: ed405b0e vstr d21, [r0, #-56] ; 0xffffffc8 + 1f37f88: ed400b0c vstr d16, [r0, #-48] ; 0xffffffd0 + 1f37f8c: ed401b0a vstr d17, [r0, #-40] ; 0xffffffd8 + 1f37f90: 3affffef bcc 1f37f54 + 1f37f94: e15c000e cmp ip, lr + 1f37f98: e082200e add r2, r2, lr + 1f37f9c: 0a000064 beq 1f38134 + 1f37fa0: e7d61002 ldrb r1, [r6, r2] + 1f37fa4: e1a00082 lsl r0, r2, #1 + 1f37fa8: e2823001 add r3, r2, #1 + 1f37fac: e1550003 cmp r5, r3 + 1f37fb0: e0811401 add r1, r1, r1, lsl #8 + 1f37fb4: e18410b0 strh r1, [r4, r0] + 1f37fb8: da00005d ble 1f38134 + 1f37fbc: e7d60003 ldrb r0, [r6, r3] + 1f37fc0: e1a01083 lsl r1, r3, #1 + 1f37fc4: e2823002 add r3, r2, #2 + 1f37fc8: e1550003 cmp r5, r3 + 1f37fcc: e0800400 add r0, r0, r0, lsl #8 + 1f37fd0: e18400b1 strh r0, [r4, r1] + 1f37fd4: da000056 ble 1f38134 + 1f37fd8: e7d60003 ldrb r0, [r6, r3] + 1f37fdc: e1a01083 lsl r1, r3, #1 + 1f37fe0: e2823003 add r3, r2, #3 + 1f37fe4: e1550003 cmp r5, r3 + 1f37fe8: e0800400 add r0, r0, r0, lsl #8 + 1f37fec: e18400b1 strh r0, [r4, r1] + 1f37ff0: da00004f ble 1f38134 + 1f37ff4: e7d60003 ldrb r0, [r6, r3] + 1f37ff8: e1a01083 lsl r1, r3, #1 + 1f37ffc: e2823004 add r3, r2, #4 + 1f38000: e1550003 cmp r5, r3 + 1f38004: e0800400 add r0, r0, r0, lsl #8 + 1f38008: e18400b1 strh r0, [r4, r1] + 1f3800c: da000048 ble 1f38134 + 1f38010: e7d60003 ldrb r0, [r6, r3] + 1f38014: e1a01083 lsl r1, r3, #1 + 1f38018: e2823005 add r3, r2, #5 + 1f3801c: e1550003 cmp r5, r3 + 1f38020: e0800400 add r0, r0, r0, lsl #8 + 1f38024: e18400b1 strh r0, [r4, r1] + 1f38028: da000041 ble 1f38134 + 1f3802c: e7d60003 ldrb r0, [r6, r3] + 1f38030: e1a01083 lsl r1, r3, #1 + 1f38034: e2823006 add r3, r2, #6 + 1f38038: e1550003 cmp r5, r3 + 1f3803c: e0800400 add r0, r0, r0, lsl #8 + 1f38040: e18400b1 strh r0, [r4, r1] + 1f38044: da00003a ble 1f38134 + 1f38048: e7d60003 ldrb r0, [r6, r3] + 1f3804c: e1a01083 lsl r1, r3, #1 + 1f38050: e2823007 add r3, r2, #7 + 1f38054: e1550003 cmp r5, r3 + 1f38058: e0800400 add r0, r0, r0, lsl #8 + 1f3805c: e18400b1 strh r0, [r4, r1] + 1f38060: da000033 ble 1f38134 + 1f38064: e7d60003 ldrb r0, [r6, r3] + 1f38068: e1a01083 lsl r1, r3, #1 + 1f3806c: e2823008 add r3, r2, #8 + 1f38070: e1550003 cmp r5, r3 + 1f38074: e0800400 add r0, r0, r0, lsl #8 + 1f38078: e18400b1 strh r0, [r4, r1] + 1f3807c: da00002c ble 1f38134 + 1f38080: e7d60003 ldrb r0, [r6, r3] + 1f38084: e1a01083 lsl r1, r3, #1 + 1f38088: e2823009 add r3, r2, #9 + 1f3808c: e1550003 cmp r5, r3 + 1f38090: e0800400 add r0, r0, r0, lsl #8 + 1f38094: e18400b1 strh r0, [r4, r1] + 1f38098: da000025 ble 1f38134 + 1f3809c: e7d60003 ldrb r0, [r6, r3] + 1f380a0: e1a01083 lsl r1, r3, #1 + 1f380a4: e282300a add r3, r2, #10 + 1f380a8: e1550003 cmp r5, r3 + 1f380ac: e0800400 add r0, r0, r0, lsl #8 + 1f380b0: e18400b1 strh r0, [r4, r1] + 1f380b4: da00001e ble 1f38134 + 1f380b8: e7d60003 ldrb r0, [r6, r3] + 1f380bc: e1a01083 lsl r1, r3, #1 + 1f380c0: e282300b add r3, r2, #11 + 1f380c4: e1550003 cmp r5, r3 + 1f380c8: e0800400 add r0, r0, r0, lsl #8 + 1f380cc: e18400b1 strh r0, [r4, r1] + 1f380d0: da000017 ble 1f38134 + 1f380d4: e7d60003 ldrb r0, [r6, r3] + 1f380d8: e1a01083 lsl r1, r3, #1 + 1f380dc: e282300c add r3, r2, #12 + 1f380e0: e1550003 cmp r5, r3 + 1f380e4: e0800400 add r0, r0, r0, lsl #8 + 1f380e8: e18400b1 strh r0, [r4, r1] + 1f380ec: da000010 ble 1f38134 + 1f380f0: e7d60003 ldrb r0, [r6, r3] + 1f380f4: e282100d add r1, r2, #13 + 1f380f8: e1a03083 lsl r3, r3, #1 + 1f380fc: e1550001 cmp r5, r1 + 1f38100: e0800400 add r0, r0, r0, lsl #8 + 1f38104: e18400b3 strh r0, [r4, r3] + 1f38108: da000009 ble 1f38134 + 1f3810c: e282300e add r3, r2, #14 + 1f38110: e7d62001 ldrb r2, [r6, r1] + 1f38114: e1a01081 lsl r1, r1, #1 + 1f38118: e1550003 cmp r5, r3 + 1f3811c: e0822402 add r2, r2, r2, lsl #8 + 1f38120: e18420b1 strh r2, [r4, r1] + 1f38124: c7d62003 ldrbgt r2, [r6, r3] + 1f38128: c1a03083 lslgt r3, r3, #1 + 1f3812c: c0822402 addgt r2, r2, r2, lsl #8 + 1f38130: c18420b3 strhgt r2, [r4, r3] + 1f38134: e1a00006 mov r0, r6 + 1f38138: eb001912 bl 1f3e588 + 1f3813c: e3a03010 mov r3, #16 + 1f38140: e58d300c str r3, [sp, #12] + 1f38144: e30a3370 movw r3, #41840 ; 0xa370 + 1f38148: e340320d movt r3, #525 ; 0x20d + 1f3814c: e5933000 ldr r3, [r3] + 1f38150: e3530000 cmp r3, #0 + 1f38154: 01a00004 moveq r0, r4 + 1f38158: 0a000008 beq 1f38180 + 1f3815c: e3570000 cmp r7, #0 + 1f38160: e1a00004 mov r0, r4 + 1f38164: e5992000 ldr r2, [r9] + 1f38168: 059d30f0 ldreq r3, [sp, #240] ; 0xf0 + 1f3816c: e5981000 ldr r1, [r8] + 1f38170: 05937000 ldreq r7, [r3] + 1f38174: e1a03087 lsl r3, r7, #1 + 1f38178: ebffbd6a bl 1f27728 + 1f3817c: e1a00004 mov r0, r4 + 1f38180: e28dd0d0 add sp, sp, #208 ; 0xd0 + 1f38184: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f38188: e1a02003 mov r2, r3 + 1f3818c: eaffff63 b 1f37f20 + 1f38190: e1a02006 mov r2, r6 + 1f38194: e2441002 sub r1, r4, #2 + 1f38198: e4d23001 ldrb r3, [r2], #1 + 1f3819c: e1520000 cmp r2, r0 + 1f381a0: e0833403 add r3, r3, r3, lsl #8 + 1f381a4: e1e130b2 strh r3, [r1, #2]! + 1f381a8: 1afffffa bne 1f38198 + 1f381ac: eaffffe0 b 1f38134 + 1f381b0: e1a00006 mov r0, r6 + 1f381b4: eafffff1 b 1f38180 + 1f381b8: e30a336c movw r3, #41836 ; 0xa36c + 1f381bc: e340320d movt r3, #525 ; 0x20d + 1f381c0: e3002f90 movw r2, #3984 ; 0xf90 + 1f381c4: e34021f6 movt r2, #502 ; 0x1f6 + 1f381c8: e5832000 str r2, [r3] + 1f381cc: eaffffda b 1f3813c + +01f381d0 : + 1f381d0: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f381d4: e1a08002 mov r8, r2 + 1f381d8: e1a09003 mov r9, r3 + 1f381dc: e24dd0d0 sub sp, sp, #208 ; 0xd0 + 1f381e0: e080e001 add lr, r0, r1 + 1f381e4: e1a0c000 mov ip, r0 + 1f381e8: e1a02009 mov r2, r9 + 1f381ec: e28d000c add r0, sp, #12 + 1f381f0: e1a01008 mov r1, r8 + 1f381f4: e59d70f4 ldr r7, [sp, #244] ; 0xf4 + 1f381f8: e58d0004 str r0, [sp, #4] + 1f381fc: e28d0018 add r0, sp, #24 + 1f38200: e59d30f0 ldr r3, [sp, #240] ; 0xf0 + 1f38204: e58d7000 str r7, [sp] + 1f38208: e58de0cc str lr, [sp, #204] ; 0xcc + 1f3820c: e58de0c4 str lr, [sp, #196] ; 0xc4 + 1f38210: e3a0e000 mov lr, #0 + 1f38214: e58dc0c8 str ip, [sp, #200] ; 0xc8 + 1f38218: e58dc0c0 str ip, [sp, #192] ; 0xc0 + 1f3821c: e58de028 str lr, [sp, #40] ; 0x28 + 1f38220: e58de038 str lr, [sp, #56] ; 0x38 + 1f38224: ebfff04c bl 1f3435c + 1f38228: e2506000 subs r6, r0, #0 + 1f3822c: 0a0000e7 beq 1f385d0 + 1f38230: e59d300c ldr r3, [sp, #12] + 1f38234: e3530008 cmp r3, #8 + 1f38238: 01a04006 moveq r4, r6 + 1f3823c: 0a0000c8 beq 1f38564 + 1f38240: e3570000 cmp r7, #0 + 1f38244: e5985000 ldr r5, [r8] + 1f38248: e5993000 ldr r3, [r9] + 1f3824c: 11a02007 movne r2, r7 + 1f38250: 059d20f0 ldreq r2, [sp, #240] ; 0xf0 + 1f38254: e0030593 mul r3, r3, r5 + 1f38258: 05922000 ldreq r2, [r2] + 1f3825c: e0050392 mul r5, r2, r3 + 1f38260: e1a00005 mov r0, r5 + 1f38264: eb0018bf bl 1f3e568 + 1f38268: e2504000 subs r4, r0, #0 + 1f3826c: 0a0000d9 beq 1f385d8 + 1f38270: e3550000 cmp r5, #0 + 1f38274: da0000b6 ble 1f38554 + 1f38278: e0863085 add r3, r6, r5, lsl #1 + 1f3827c: e0840005 add r0, r4, r5 + 1f38280: e1560000 cmp r6, r0 + 1f38284: 31540003 cmpcc r4, r3 + 1f38288: 23a03001 movcs r3, #1 + 1f3828c: 33a03000 movcc r3, #0 + 1f38290: e3550013 cmp r5, #19 + 1f38294: 93a03000 movls r3, #0 + 1f38298: 82033001 andhi r3, r3, #1 + 1f3829c: e3530000 cmp r3, #0 + 1f382a0: 0a0000c2 beq 1f385b0 + 1f382a4: e7e130d6 ubfx r3, r6, #1, #2 + 1f382a8: e2633000 rsb r3, r3, #0 + 1f382ac: e2033007 and r3, r3, #7 + 1f382b0: e1530005 cmp r3, r5 + 1f382b4: 21a03005 movcs r3, r5 + 1f382b8: e3530000 cmp r3, #0 + 1f382bc: 0a0000b9 beq 1f385a8 + 1f382c0: e1d620b0 ldrh r2, [r6] + 1f382c4: e3530001 cmp r3, #1 + 1f382c8: e1a02422 lsr r2, r2, #8 + 1f382cc: e5c42000 strb r2, [r4] + 1f382d0: 0a0000b4 beq 1f385a8 + 1f382d4: e1d620b2 ldrh r2, [r6, #2] + 1f382d8: e3530002 cmp r3, #2 + 1f382dc: e1a02422 lsr r2, r2, #8 + 1f382e0: e5c42001 strb r2, [r4, #1] + 1f382e4: 0a0000af beq 1f385a8 + 1f382e8: e1d620b4 ldrh r2, [r6, #4] + 1f382ec: e3530003 cmp r3, #3 + 1f382f0: e1a02422 lsr r2, r2, #8 + 1f382f4: e5c42002 strb r2, [r4, #2] + 1f382f8: 0a0000aa beq 1f385a8 + 1f382fc: e1d620b6 ldrh r2, [r6, #6] + 1f38300: e3530004 cmp r3, #4 + 1f38304: e1a02422 lsr r2, r2, #8 + 1f38308: e5c42003 strb r2, [r4, #3] + 1f3830c: 0a0000a5 beq 1f385a8 + 1f38310: e1d620b8 ldrh r2, [r6, #8] + 1f38314: e3530005 cmp r3, #5 + 1f38318: e1a02422 lsr r2, r2, #8 + 1f3831c: e5c42004 strb r2, [r4, #4] + 1f38320: 0a0000a0 beq 1f385a8 + 1f38324: e1d620ba ldrh r2, [r6, #10] + 1f38328: e3530006 cmp r3, #6 + 1f3832c: e1a02422 lsr r2, r2, #8 + 1f38330: e5c42005 strb r2, [r4, #5] + 1f38334: 13a02007 movne r2, #7 + 1f38338: 03a02006 moveq r2, #6 + 1f3833c: 11d610bc ldrhne r1, [r6, #12] + 1f38340: 11a01421 lsrne r1, r1, #8 + 1f38344: 15c41006 strbne r1, [r4, #6] + 1f38348: e063c005 rsb ip, r3, r5 + 1f3834c: e2450001 sub r0, r5, #1 + 1f38350: e24c1010 sub r1, ip, #16 + 1f38354: e0630000 rsb r0, r3, r0 + 1f38358: e350000e cmp r0, #14 + 1f3835c: e1a01221 lsr r1, r1, #4 + 1f38360: e2811001 add r1, r1, #1 + 1f38364: e1a0e201 lsl lr, r1, #4 + 1f38368: 9a000014 bls 1f383c0 + 1f3836c: e0860083 add r0, r6, r3, lsl #1 + 1f38370: e3a0a000 mov sl, #0 + 1f38374: e0843003 add r3, r4, r3 + 1f38378: e2800020 add r0, r0, #32 + 1f3837c: ed502b08 vldr d18, [r0, #-32] ; 0xffffffe0 + 1f38380: ed503b06 vldr d19, [r0, #-24] ; 0xffffffe8 + 1f38384: e28aa001 add sl, sl, #1 + 1f38388: e15a0001 cmp sl, r1 + 1f3838c: ed500b04 vldr d16, [r0, #-16] + 1f38390: ed501b02 vldr d17, [r0, #-8] + 1f38394: e2800020 add r0, r0, #32 + 1f38398: f3d82072 vshr.u16 q9, q9, #8 + 1f3839c: f3d80070 vshr.u16 q8, q8, #8 + 1f383a0: f3f24222 vmovn.i16 d20, q9 + 1f383a4: f3f25220 vmovn.i16 d21, q8 + 1f383a8: f4434a0f vst1.8 {d20-d21}, [r3] + 1f383ac: e2833010 add r3, r3, #16 + 1f383b0: 3afffff1 bcc 1f3837c + 1f383b4: e15c000e cmp ip, lr + 1f383b8: e082200e add r2, r2, lr + 1f383bc: 0a000064 beq 1f38554 + 1f383c0: e1a03082 lsl r3, r2, #1 + 1f383c4: e2821001 add r1, r2, #1 + 1f383c8: e1550001 cmp r5, r1 + 1f383cc: e19630b3 ldrh r3, [r6, r3] + 1f383d0: e1a03423 lsr r3, r3, #8 + 1f383d4: e7c43002 strb r3, [r4, r2] + 1f383d8: da00005d ble 1f38554 + 1f383dc: e1a00081 lsl r0, r1, #1 + 1f383e0: e2823002 add r3, r2, #2 + 1f383e4: e1550003 cmp r5, r3 + 1f383e8: e19600b0 ldrh r0, [r6, r0] + 1f383ec: e1a00420 lsr r0, r0, #8 + 1f383f0: e7c40001 strb r0, [r4, r1] + 1f383f4: da000056 ble 1f38554 + 1f383f8: e1a00083 lsl r0, r3, #1 + 1f383fc: e2821003 add r1, r2, #3 + 1f38400: e1550001 cmp r5, r1 + 1f38404: e19600b0 ldrh r0, [r6, r0] + 1f38408: e1a00420 lsr r0, r0, #8 + 1f3840c: e7c40003 strb r0, [r4, r3] + 1f38410: da00004f ble 1f38554 + 1f38414: e1a00081 lsl r0, r1, #1 + 1f38418: e2823004 add r3, r2, #4 + 1f3841c: e1550003 cmp r5, r3 + 1f38420: e19600b0 ldrh r0, [r6, r0] + 1f38424: e1a00420 lsr r0, r0, #8 + 1f38428: e7c40001 strb r0, [r4, r1] + 1f3842c: da000048 ble 1f38554 + 1f38430: e1a00083 lsl r0, r3, #1 + 1f38434: e2821005 add r1, r2, #5 + 1f38438: e1550001 cmp r5, r1 + 1f3843c: e19600b0 ldrh r0, [r6, r0] + 1f38440: e1a00420 lsr r0, r0, #8 + 1f38444: e7c40003 strb r0, [r4, r3] + 1f38448: da000041 ble 1f38554 + 1f3844c: e1a00081 lsl r0, r1, #1 + 1f38450: e2823006 add r3, r2, #6 + 1f38454: e1550003 cmp r5, r3 + 1f38458: e19600b0 ldrh r0, [r6, r0] + 1f3845c: e1a00420 lsr r0, r0, #8 + 1f38460: e7c40001 strb r0, [r4, r1] + 1f38464: da00003a ble 1f38554 + 1f38468: e1a00083 lsl r0, r3, #1 + 1f3846c: e2821007 add r1, r2, #7 + 1f38470: e1550001 cmp r5, r1 + 1f38474: e19600b0 ldrh r0, [r6, r0] + 1f38478: e1a00420 lsr r0, r0, #8 + 1f3847c: e7c40003 strb r0, [r4, r3] + 1f38480: da000033 ble 1f38554 + 1f38484: e1a00081 lsl r0, r1, #1 + 1f38488: e2823008 add r3, r2, #8 + 1f3848c: e1550003 cmp r5, r3 + 1f38490: e19600b0 ldrh r0, [r6, r0] + 1f38494: e1a00420 lsr r0, r0, #8 + 1f38498: e7c40001 strb r0, [r4, r1] + 1f3849c: da00002c ble 1f38554 + 1f384a0: e1a00083 lsl r0, r3, #1 + 1f384a4: e2821009 add r1, r2, #9 + 1f384a8: e1550001 cmp r5, r1 + 1f384ac: e19600b0 ldrh r0, [r6, r0] + 1f384b0: e1a00420 lsr r0, r0, #8 + 1f384b4: e7c40003 strb r0, [r4, r3] + 1f384b8: da000025 ble 1f38554 + 1f384bc: e1a00081 lsl r0, r1, #1 + 1f384c0: e282300a add r3, r2, #10 + 1f384c4: e1550003 cmp r5, r3 + 1f384c8: e19600b0 ldrh r0, [r6, r0] + 1f384cc: e1a00420 lsr r0, r0, #8 + 1f384d0: e7c40001 strb r0, [r4, r1] + 1f384d4: da00001e ble 1f38554 + 1f384d8: e1a00083 lsl r0, r3, #1 + 1f384dc: e282100b add r1, r2, #11 + 1f384e0: e1550001 cmp r5, r1 + 1f384e4: e19600b0 ldrh r0, [r6, r0] + 1f384e8: e1a00420 lsr r0, r0, #8 + 1f384ec: e7c40003 strb r0, [r4, r3] + 1f384f0: da000017 ble 1f38554 + 1f384f4: e1a00081 lsl r0, r1, #1 + 1f384f8: e282300c add r3, r2, #12 + 1f384fc: e1550003 cmp r5, r3 + 1f38500: e19600b0 ldrh r0, [r6, r0] + 1f38504: e1a00420 lsr r0, r0, #8 + 1f38508: e7c40001 strb r0, [r4, r1] + 1f3850c: da000010 ble 1f38554 + 1f38510: e1a00083 lsl r0, r3, #1 + 1f38514: e282100d add r1, r2, #13 + 1f38518: e1550001 cmp r5, r1 + 1f3851c: e19600b0 ldrh r0, [r6, r0] + 1f38520: e1a00420 lsr r0, r0, #8 + 1f38524: e7c40003 strb r0, [r4, r3] + 1f38528: da000009 ble 1f38554 + 1f3852c: e1a00081 lsl r0, r1, #1 + 1f38530: e282300e add r3, r2, #14 + 1f38534: e1550003 cmp r5, r3 + 1f38538: e19620b0 ldrh r2, [r6, r0] + 1f3853c: e1a02422 lsr r2, r2, #8 + 1f38540: e7c42001 strb r2, [r4, r1] + 1f38544: c1a02083 lslgt r2, r3, #1 + 1f38548: c19620b2 ldrhgt r2, [r6, r2] + 1f3854c: c1a02422 lsrgt r2, r2, #8 + 1f38550: c7c42003 strbgt r2, [r4, r3] + 1f38554: e1a00006 mov r0, r6 + 1f38558: eb00180a bl 1f3e588 + 1f3855c: e3a03008 mov r3, #8 + 1f38560: e58d300c str r3, [sp, #12] + 1f38564: e30a3370 movw r3, #41840 ; 0xa370 + 1f38568: e340320d movt r3, #525 ; 0x20d + 1f3856c: e5933000 ldr r3, [r3] + 1f38570: e3530000 cmp r3, #0 + 1f38574: 01a00004 moveq r0, r4 + 1f38578: 0a000008 beq 1f385a0 + 1f3857c: e3570000 cmp r7, #0 + 1f38580: e1a00004 mov r0, r4 + 1f38584: e5992000 ldr r2, [r9] + 1f38588: 059d30f0 ldreq r3, [sp, #240] ; 0xf0 + 1f3858c: e5981000 ldr r1, [r8] + 1f38590: 05937000 ldreq r7, [r3] + 1f38594: e1a03007 mov r3, r7 + 1f38598: ebffbc62 bl 1f27728 + 1f3859c: e1a00004 mov r0, r4 + 1f385a0: e28dd0d0 add sp, sp, #208 ; 0xd0 + 1f385a4: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f385a8: e1a02003 mov r2, r3 + 1f385ac: eaffff65 b 1f38348 + 1f385b0: e2461002 sub r1, r6, #2 + 1f385b4: e1a02004 mov r2, r4 + 1f385b8: e1f130b2 ldrh r3, [r1, #2]! + 1f385bc: e1a03423 lsr r3, r3, #8 + 1f385c0: e4c23001 strb r3, [r2], #1 + 1f385c4: e1520000 cmp r2, r0 + 1f385c8: 1afffffa bne 1f385b8 + 1f385cc: eaffffe0 b 1f38554 + 1f385d0: e1a00006 mov r0, r6 + 1f385d4: eafffff1 b 1f385a0 + 1f385d8: e30a336c movw r3, #41836 ; 0xa36c + 1f385dc: e340320d movt r3, #525 ; 0x20d + 1f385e0: e3002f90 movw r2, #3984 ; 0xf90 + 1f385e4: e34021f6 movt r2, #502 ; 0x1f6 + 1f385e8: e5832000 str r2, [r3] + 1f385ec: eaffffda b 1f3855c + +01f385f0 : + 1f385f0: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f385f4: e1a05001 mov r5, r1 + 1f385f8: e1a08002 mov r8, r2 + 1f385fc: e24dd0d0 sub sp, sp, #208 ; 0xd0 + 1f38600: e3a0e080 mov lr, #128 ; 0x80 + 1f38604: e28dc028 add ip, sp, #40 ; 0x28 + 1f38608: e28d4040 add r4, sp, #64 ; 0x40 + 1f3860c: e8900007 ldm r0, {r0, r1, r2} + 1f38610: e88c0007 stm ip, {r0, r1, r2} + 1f38614: e58d5034 str r5, [sp, #52] ; 0x34 + 1f38618: e3a0c001 mov ip, #1 + 1f3861c: e1a0200e mov r2, lr + 1f38620: e58dc038 str ip, [sp, #56] ; 0x38 + 1f38624: e1a00005 mov r0, r5 + 1f38628: e58de03c str lr, [sp, #60] ; 0x3c + 1f3862c: e1a01004 mov r1, r4 + 1f38630: e59d5028 ldr r5, [sp, #40] ; 0x28 + 1f38634: e58d40c8 str r4, [sp, #200] ; 0xc8 + 1f38638: e1a09003 mov r9, r3 + 1f3863c: e59d70f4 ldr r7, [sp, #244] ; 0xf4 + 1f38640: e12fff35 blx r5 + 1f38644: e3500000 cmp r0, #0 + 1f38648: e28d200c add r2, sp, #12 + 1f3864c: 1084c000 addne ip, r4, r0 + 1f38650: 058d0038 streq r0, [sp, #56] ; 0x38 + 1f38654: 05cd0040 strbeq r0, [sp, #64] ; 0x40 + 1f38658: e1a01008 mov r1, r8 + 1f3865c: e58d2004 str r2, [sp, #4] + 1f38660: e28d0018 add r0, sp, #24 + 1f38664: e58d7000 str r7, [sp] + 1f38668: e1a02009 mov r2, r9 + 1f3866c: e59d30f0 ldr r3, [sp, #240] ; 0xf0 + 1f38670: 028dc041 addeq ip, sp, #65 ; 0x41 + 1f38674: e58d40c0 str r4, [sp, #192] ; 0xc0 + 1f38678: e58dc0c4 str ip, [sp, #196] ; 0xc4 + 1f3867c: e58dc0cc str ip, [sp, #204] ; 0xcc + 1f38680: ebffef35 bl 1f3435c + 1f38684: e2506000 subs r6, r0, #0 + 1f38688: 0a0000e7 beq 1f38a2c + 1f3868c: e59d300c ldr r3, [sp, #12] + 1f38690: e3530008 cmp r3, #8 + 1f38694: 01a04006 moveq r4, r6 + 1f38698: 0a0000c8 beq 1f389c0 + 1f3869c: e3570000 cmp r7, #0 + 1f386a0: e5985000 ldr r5, [r8] + 1f386a4: e5993000 ldr r3, [r9] + 1f386a8: 11a02007 movne r2, r7 + 1f386ac: 059d20f0 ldreq r2, [sp, #240] ; 0xf0 + 1f386b0: e0030593 mul r3, r3, r5 + 1f386b4: 05922000 ldreq r2, [r2] + 1f386b8: e0050392 mul r5, r2, r3 + 1f386bc: e1a00005 mov r0, r5 + 1f386c0: eb0017a8 bl 1f3e568 + 1f386c4: e2504000 subs r4, r0, #0 + 1f386c8: 0a0000d9 beq 1f38a34 + 1f386cc: e3550000 cmp r5, #0 + 1f386d0: da0000b6 ble 1f389b0 + 1f386d4: e0863085 add r3, r6, r5, lsl #1 + 1f386d8: e0840005 add r0, r4, r5 + 1f386dc: e1560000 cmp r6, r0 + 1f386e0: 31540003 cmpcc r4, r3 + 1f386e4: 23a03001 movcs r3, #1 + 1f386e8: 33a03000 movcc r3, #0 + 1f386ec: e3550013 cmp r5, #19 + 1f386f0: 93a03000 movls r3, #0 + 1f386f4: 82033001 andhi r3, r3, #1 + 1f386f8: e3530000 cmp r3, #0 + 1f386fc: 0a0000c2 beq 1f38a0c + 1f38700: e7e130d6 ubfx r3, r6, #1, #2 + 1f38704: e2633000 rsb r3, r3, #0 + 1f38708: e2033007 and r3, r3, #7 + 1f3870c: e1530005 cmp r3, r5 + 1f38710: 21a03005 movcs r3, r5 + 1f38714: e3530000 cmp r3, #0 + 1f38718: 0a0000b9 beq 1f38a04 + 1f3871c: e1d620b0 ldrh r2, [r6] + 1f38720: e3530001 cmp r3, #1 + 1f38724: e1a02422 lsr r2, r2, #8 + 1f38728: e5c42000 strb r2, [r4] + 1f3872c: 0a0000b4 beq 1f38a04 + 1f38730: e1d620b2 ldrh r2, [r6, #2] + 1f38734: e3530002 cmp r3, #2 + 1f38738: e1a02422 lsr r2, r2, #8 + 1f3873c: e5c42001 strb r2, [r4, #1] + 1f38740: 0a0000af beq 1f38a04 + 1f38744: e1d620b4 ldrh r2, [r6, #4] + 1f38748: e3530003 cmp r3, #3 + 1f3874c: e1a02422 lsr r2, r2, #8 + 1f38750: e5c42002 strb r2, [r4, #2] + 1f38754: 0a0000aa beq 1f38a04 + 1f38758: e1d620b6 ldrh r2, [r6, #6] + 1f3875c: e3530004 cmp r3, #4 + 1f38760: e1a02422 lsr r2, r2, #8 + 1f38764: e5c42003 strb r2, [r4, #3] + 1f38768: 0a0000a5 beq 1f38a04 + 1f3876c: e1d620b8 ldrh r2, [r6, #8] + 1f38770: e3530005 cmp r3, #5 + 1f38774: e1a02422 lsr r2, r2, #8 + 1f38778: e5c42004 strb r2, [r4, #4] + 1f3877c: 0a0000a0 beq 1f38a04 + 1f38780: e1d620ba ldrh r2, [r6, #10] + 1f38784: e3530006 cmp r3, #6 + 1f38788: e1a02422 lsr r2, r2, #8 + 1f3878c: e5c42005 strb r2, [r4, #5] + 1f38790: 13a02007 movne r2, #7 + 1f38794: 03a02006 moveq r2, #6 + 1f38798: 11d610bc ldrhne r1, [r6, #12] + 1f3879c: 11a01421 lsrne r1, r1, #8 + 1f387a0: 15c41006 strbne r1, [r4, #6] + 1f387a4: e063c005 rsb ip, r3, r5 + 1f387a8: e2450001 sub r0, r5, #1 + 1f387ac: e24c1010 sub r1, ip, #16 + 1f387b0: e0630000 rsb r0, r3, r0 + 1f387b4: e350000e cmp r0, #14 + 1f387b8: e1a01221 lsr r1, r1, #4 + 1f387bc: e2811001 add r1, r1, #1 + 1f387c0: e1a0e201 lsl lr, r1, #4 + 1f387c4: 9a000014 bls 1f3881c + 1f387c8: e0860083 add r0, r6, r3, lsl #1 + 1f387cc: e3a0a000 mov sl, #0 + 1f387d0: e0843003 add r3, r4, r3 + 1f387d4: e2800020 add r0, r0, #32 + 1f387d8: ed502b08 vldr d18, [r0, #-32] ; 0xffffffe0 + 1f387dc: ed503b06 vldr d19, [r0, #-24] ; 0xffffffe8 + 1f387e0: e28aa001 add sl, sl, #1 + 1f387e4: e15a0001 cmp sl, r1 + 1f387e8: ed500b04 vldr d16, [r0, #-16] + 1f387ec: ed501b02 vldr d17, [r0, #-8] + 1f387f0: e2800020 add r0, r0, #32 + 1f387f4: f3d82072 vshr.u16 q9, q9, #8 + 1f387f8: f3d80070 vshr.u16 q8, q8, #8 + 1f387fc: f3f24222 vmovn.i16 d20, q9 + 1f38800: f3f25220 vmovn.i16 d21, q8 + 1f38804: f4434a0f vst1.8 {d20-d21}, [r3] + 1f38808: e2833010 add r3, r3, #16 + 1f3880c: 3afffff1 bcc 1f387d8 + 1f38810: e15c000e cmp ip, lr + 1f38814: e082200e add r2, r2, lr + 1f38818: 0a000064 beq 1f389b0 + 1f3881c: e1a03082 lsl r3, r2, #1 + 1f38820: e2821001 add r1, r2, #1 + 1f38824: e1550001 cmp r5, r1 + 1f38828: e19630b3 ldrh r3, [r6, r3] + 1f3882c: e1a03423 lsr r3, r3, #8 + 1f38830: e7c43002 strb r3, [r4, r2] + 1f38834: da00005d ble 1f389b0 + 1f38838: e1a00081 lsl r0, r1, #1 + 1f3883c: e2823002 add r3, r2, #2 + 1f38840: e1550003 cmp r5, r3 + 1f38844: e19600b0 ldrh r0, [r6, r0] + 1f38848: e1a00420 lsr r0, r0, #8 + 1f3884c: e7c40001 strb r0, [r4, r1] + 1f38850: da000056 ble 1f389b0 + 1f38854: e1a00083 lsl r0, r3, #1 + 1f38858: e2821003 add r1, r2, #3 + 1f3885c: e1550001 cmp r5, r1 + 1f38860: e19600b0 ldrh r0, [r6, r0] + 1f38864: e1a00420 lsr r0, r0, #8 + 1f38868: e7c40003 strb r0, [r4, r3] + 1f3886c: da00004f ble 1f389b0 + 1f38870: e1a00081 lsl r0, r1, #1 + 1f38874: e2823004 add r3, r2, #4 + 1f38878: e1550003 cmp r5, r3 + 1f3887c: e19600b0 ldrh r0, [r6, r0] + 1f38880: e1a00420 lsr r0, r0, #8 + 1f38884: e7c40001 strb r0, [r4, r1] + 1f38888: da000048 ble 1f389b0 + 1f3888c: e1a00083 lsl r0, r3, #1 + 1f38890: e2821005 add r1, r2, #5 + 1f38894: e1550001 cmp r5, r1 + 1f38898: e19600b0 ldrh r0, [r6, r0] + 1f3889c: e1a00420 lsr r0, r0, #8 + 1f388a0: e7c40003 strb r0, [r4, r3] + 1f388a4: da000041 ble 1f389b0 + 1f388a8: e1a00081 lsl r0, r1, #1 + 1f388ac: e2823006 add r3, r2, #6 + 1f388b0: e1550003 cmp r5, r3 + 1f388b4: e19600b0 ldrh r0, [r6, r0] + 1f388b8: e1a00420 lsr r0, r0, #8 + 1f388bc: e7c40001 strb r0, [r4, r1] + 1f388c0: da00003a ble 1f389b0 + 1f388c4: e1a00083 lsl r0, r3, #1 + 1f388c8: e2821007 add r1, r2, #7 + 1f388cc: e1550001 cmp r5, r1 + 1f388d0: e19600b0 ldrh r0, [r6, r0] + 1f388d4: e1a00420 lsr r0, r0, #8 + 1f388d8: e7c40003 strb r0, [r4, r3] + 1f388dc: da000033 ble 1f389b0 + 1f388e0: e1a00081 lsl r0, r1, #1 + 1f388e4: e2823008 add r3, r2, #8 + 1f388e8: e1550003 cmp r5, r3 + 1f388ec: e19600b0 ldrh r0, [r6, r0] + 1f388f0: e1a00420 lsr r0, r0, #8 + 1f388f4: e7c40001 strb r0, [r4, r1] + 1f388f8: da00002c ble 1f389b0 + 1f388fc: e1a00083 lsl r0, r3, #1 + 1f38900: e2821009 add r1, r2, #9 + 1f38904: e1550001 cmp r5, r1 + 1f38908: e19600b0 ldrh r0, [r6, r0] + 1f3890c: e1a00420 lsr r0, r0, #8 + 1f38910: e7c40003 strb r0, [r4, r3] + 1f38914: da000025 ble 1f389b0 + 1f38918: e1a00081 lsl r0, r1, #1 + 1f3891c: e282300a add r3, r2, #10 + 1f38920: e1550003 cmp r5, r3 + 1f38924: e19600b0 ldrh r0, [r6, r0] + 1f38928: e1a00420 lsr r0, r0, #8 + 1f3892c: e7c40001 strb r0, [r4, r1] + 1f38930: da00001e ble 1f389b0 + 1f38934: e1a00083 lsl r0, r3, #1 + 1f38938: e282100b add r1, r2, #11 + 1f3893c: e1550001 cmp r5, r1 + 1f38940: e19600b0 ldrh r0, [r6, r0] + 1f38944: e1a00420 lsr r0, r0, #8 + 1f38948: e7c40003 strb r0, [r4, r3] + 1f3894c: da000017 ble 1f389b0 + 1f38950: e1a00081 lsl r0, r1, #1 + 1f38954: e282300c add r3, r2, #12 + 1f38958: e1550003 cmp r5, r3 + 1f3895c: e19600b0 ldrh r0, [r6, r0] + 1f38960: e1a00420 lsr r0, r0, #8 + 1f38964: e7c40001 strb r0, [r4, r1] + 1f38968: da000010 ble 1f389b0 + 1f3896c: e1a00083 lsl r0, r3, #1 + 1f38970: e282100d add r1, r2, #13 + 1f38974: e1550001 cmp r5, r1 + 1f38978: e19600b0 ldrh r0, [r6, r0] + 1f3897c: e1a00420 lsr r0, r0, #8 + 1f38980: e7c40003 strb r0, [r4, r3] + 1f38984: da000009 ble 1f389b0 + 1f38988: e1a00081 lsl r0, r1, #1 + 1f3898c: e282300e add r3, r2, #14 + 1f38990: e1550003 cmp r5, r3 + 1f38994: e19620b0 ldrh r2, [r6, r0] + 1f38998: e1a02422 lsr r2, r2, #8 + 1f3899c: e7c42001 strb r2, [r4, r1] + 1f389a0: c1a02083 lslgt r2, r3, #1 + 1f389a4: c19620b2 ldrhgt r2, [r6, r2] + 1f389a8: c1a02422 lsrgt r2, r2, #8 + 1f389ac: c7c42003 strbgt r2, [r4, r3] + 1f389b0: e1a00006 mov r0, r6 + 1f389b4: eb0016f3 bl 1f3e588 + 1f389b8: e3a03008 mov r3, #8 + 1f389bc: e58d300c str r3, [sp, #12] + 1f389c0: e30a3370 movw r3, #41840 ; 0xa370 + 1f389c4: e340320d movt r3, #525 ; 0x20d + 1f389c8: e5933000 ldr r3, [r3] + 1f389cc: e3530000 cmp r3, #0 + 1f389d0: 01a00004 moveq r0, r4 + 1f389d4: 0a000008 beq 1f389fc + 1f389d8: e3570000 cmp r7, #0 + 1f389dc: e1a00004 mov r0, r4 + 1f389e0: e5992000 ldr r2, [r9] + 1f389e4: 059d30f0 ldreq r3, [sp, #240] ; 0xf0 + 1f389e8: e5981000 ldr r1, [r8] + 1f389ec: 05937000 ldreq r7, [r3] + 1f389f0: e1a03007 mov r3, r7 + 1f389f4: ebffbb4b bl 1f27728 + 1f389f8: e1a00004 mov r0, r4 + 1f389fc: e28dd0d0 add sp, sp, #208 ; 0xd0 + 1f38a00: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f38a04: e1a02003 mov r2, r3 + 1f38a08: eaffff65 b 1f387a4 + 1f38a0c: e2461002 sub r1, r6, #2 + 1f38a10: e1a02004 mov r2, r4 + 1f38a14: e1f130b2 ldrh r3, [r1, #2]! + 1f38a18: e1a03423 lsr r3, r3, #8 + 1f38a1c: e4c23001 strb r3, [r2], #1 + 1f38a20: e1520000 cmp r2, r0 + 1f38a24: 1afffffa bne 1f38a14 + 1f38a28: eaffffe0 b 1f389b0 + 1f38a2c: e1a00006 mov r0, r6 + 1f38a30: eafffff1 b 1f389fc + 1f38a34: e30a336c movw r3, #41836 ; 0xa36c + 1f38a38: e340320d movt r3, #525 ; 0x20d + 1f38a3c: e3002f90 movw r2, #3984 ; 0xf90 + 1f38a40: e34021f6 movt r2, #502 ; 0x1f6 + 1f38a44: e5832000 str r2, [r3] + 1f38a48: eaffffda b 1f389b8 + +01f38a4c : + 1f38a4c: e3a00000 mov r0, #0 + 1f38a50: e12fff1e bx lr + +01f38a54 : + 1f38a54: e3a00000 mov r0, #0 + 1f38a58: e12fff1e bx lr + +01f38a5c : + 1f38a5c: e12fff1e bx lr + +01f38a60 : + 1f38a60: e12fff1e bx lr + +01f38a64 : + 1f38a64: e92d40f0 push {r4, r5, r6, r7, lr} + 1f38a68: e1a07000 mov r7, r0 + 1f38a6c: e1a00002 mov r0, r2 + 1f38a70: e24ddefe sub sp, sp, #4064 ; 0xfe0 + 1f38a74: e1a06003 mov r6, r3 + 1f38a78: e24dd00c sub sp, sp, #12 + 1f38a7c: e1a04002 mov r4, r2 + 1f38a80: e1a05001 mov r5, r1 + 1f38a84: eb0016b7 bl 1f3e568 + 1f38a88: e2503000 subs r3, r0, #0 + 1f38a8c: 0a000015 beq 1f38ae8 + 1f38a90: e3a02001 mov r2, #1 + 1f38a94: e1a0000d mov r0, sp + 1f38a98: e1a01002 mov r1, r2 + 1f38a9c: e0834004 add r4, r3, r4 + 1f38aa0: e0875005 add r5, r7, r5 + 1f38aa4: e58d4018 str r4, [sp, #24] + 1f38aa8: e58d5004 str r5, [sp, #4] + 1f38aac: e58d7000 str r7, [sp] + 1f38ab0: e58d3014 str r3, [sp, #20] + 1f38ab4: e58d3010 str r3, [sp, #16] + 1f38ab8: e58d201c str r2, [sp, #28] + 1f38abc: ebffc173 bl 1f29090 + 1f38ac0: e2504000 subs r4, r0, #0 + 1f38ac4: e59d0014 ldr r0, [sp, #20] + 1f38ac8: 0a000008 beq 1f38af0 + 1f38acc: e3560000 cmp r6, #0 + 1f38ad0: 159d3010 ldrne r3, [sp, #16] + 1f38ad4: 10603003 rsbne r3, r0, r3 + 1f38ad8: 15863000 strne r3, [r6] + 1f38adc: e28ddefe add sp, sp, #4064 ; 0xfe0 + 1f38ae0: e28dd00c add sp, sp, #12 + 1f38ae4: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f38ae8: e1a00003 mov r0, r3 + 1f38aec: eafffffa b 1f38adc + 1f38af0: eb0016a4 bl 1f3e588 + 1f38af4: e1a00004 mov r0, r4 + 1f38af8: eafffff7 b 1f38adc + +01f38afc : + 1f38afc: e1a03002 mov r3, r2 + 1f38b00: e3a02901 mov r2, #16384 ; 0x4000 + 1f38b04: eaffffd6 b 1f38a64 + +01f38b08 : + 1f38b08: e92d40f0 push {r4, r5, r6, r7, lr} + 1f38b0c: e1a07000 mov r7, r0 + 1f38b10: e1a00002 mov r0, r2 + 1f38b14: e24ddefe sub sp, sp, #4064 ; 0xfe0 + 1f38b18: e1a06003 mov r6, r3 + 1f38b1c: e24dd00c sub sp, sp, #12 + 1f38b20: e1a04002 mov r4, r2 + 1f38b24: e1a05001 mov r5, r1 + 1f38b28: eb00168e bl 1f3e568 + 1f38b2c: e2503000 subs r3, r0, #0 + 1f38b30: 0a000016 beq 1f38b90 + 1f38b34: e28d2a01 add r2, sp, #4096 ; 0x1000 + 1f38b38: e1a0000d mov r0, sp + 1f38b3c: e0834004 add r4, r3, r4 + 1f38b40: e0875005 add r5, r7, r5 + 1f38b44: e58d4018 str r4, [sp, #24] + 1f38b48: e5921000 ldr r1, [r2] + 1f38b4c: e3a02001 mov r2, #1 + 1f38b50: e58d5004 str r5, [sp, #4] + 1f38b54: e58d7000 str r7, [sp] + 1f38b58: e58d3014 str r3, [sp, #20] + 1f38b5c: e58d3010 str r3, [sp, #16] + 1f38b60: e58d201c str r2, [sp, #28] + 1f38b64: ebffc149 bl 1f29090 + 1f38b68: e2504000 subs r4, r0, #0 + 1f38b6c: e59d0014 ldr r0, [sp, #20] + 1f38b70: 0a000008 beq 1f38b98 + 1f38b74: e3560000 cmp r6, #0 + 1f38b78: 159d3010 ldrne r3, [sp, #16] + 1f38b7c: 10603003 rsbne r3, r0, r3 + 1f38b80: 15863000 strne r3, [r6] + 1f38b84: e28ddefe add sp, sp, #4064 ; 0xfe0 + 1f38b88: e28dd00c add sp, sp, #12 + 1f38b8c: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f38b90: e1a00003 mov r0, r3 + 1f38b94: eafffffa b 1f38b84 + 1f38b98: eb00167a bl 1f3e588 + 1f38b9c: e1a00004 mov r0, r4 + 1f38ba0: eafffff7 b 1f38b84 + +01f38ba4 : + 1f38ba4: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f38ba8: e1a0c000 mov ip, r0 + 1f38bac: e080e001 add lr, r0, r1 + 1f38bb0: e24ddefe sub sp, sp, #4064 ; 0xfe0 + 1f38bb4: e3a01001 mov r1, #1 + 1f38bb8: e24dd00c sub sp, sp, #12 + 1f38bbc: e0823003 add r3, r2, r3 + 1f38bc0: e1a0000d mov r0, sp + 1f38bc4: e88d000c stm sp, {r2, r3} + 1f38bc8: e58de018 str lr, [sp, #24] + 1f38bcc: e3a03000 mov r3, #0 + 1f38bd0: e58dc014 str ip, [sp, #20] + 1f38bd4: e58d301c str r3, [sp, #28] + 1f38bd8: e58dc010 str ip, [sp, #16] + 1f38bdc: ebffc12b bl 1f29090 + 1f38be0: e3500000 cmp r0, #0 + 1f38be4: 03e00000 mvneq r0, #0 + 1f38be8: 159d0014 ldrne r0, [sp, #20] + 1f38bec: 159d3010 ldrne r3, [sp, #16] + 1f38bf0: 10600003 rsbne r0, r0, r3 + 1f38bf4: e28ddefe add sp, sp, #4064 ; 0xfe0 + 1f38bf8: e28dd00c add sp, sp, #12 + 1f38bfc: e49df004 pop {pc} ; (ldr pc, [sp], #4) + +01f38c00 : + 1f38c00: e92d4070 push {r4, r5, r6, lr} + 1f38c04: e1a06000 mov r6, r0 + 1f38c08: e3a00901 mov r0, #16384 ; 0x4000 + 1f38c0c: e24ddefe sub sp, sp, #4064 ; 0xfe0 + 1f38c10: e1a04001 mov r4, r1 + 1f38c14: e24dd008 sub sp, sp, #8 + 1f38c18: e1a05002 mov r5, r2 + 1f38c1c: eb001651 bl 1f3e568 + 1f38c20: e2503000 subs r3, r0, #0 + 1f38c24: 0a000015 beq 1f38c80 + 1f38c28: e3a01000 mov r1, #0 + 1f38c2c: e1a0000d mov r0, sp + 1f38c30: e0864004 add r4, r6, r4 + 1f38c34: e283c901 add ip, r3, #16384 ; 0x4000 + 1f38c38: e58d4004 str r4, [sp, #4] + 1f38c3c: e3a02001 mov r2, #1 + 1f38c40: e58d6000 str r6, [sp] + 1f38c44: e58d3014 str r3, [sp, #20] + 1f38c48: e58d3010 str r3, [sp, #16] + 1f38c4c: e58dc018 str ip, [sp, #24] + 1f38c50: e58d201c str r2, [sp, #28] + 1f38c54: ebffc10d bl 1f29090 + 1f38c58: e2504000 subs r4, r0, #0 + 1f38c5c: e59d0014 ldr r0, [sp, #20] + 1f38c60: 0a000008 beq 1f38c88 + 1f38c64: e3550000 cmp r5, #0 + 1f38c68: 159d3010 ldrne r3, [sp, #16] + 1f38c6c: 10603003 rsbne r3, r0, r3 + 1f38c70: 15853000 strne r3, [r5] + 1f38c74: e28ddefe add sp, sp, #4064 ; 0xfe0 + 1f38c78: e28dd008 add sp, sp, #8 + 1f38c7c: e8bd8070 pop {r4, r5, r6, pc} + 1f38c80: e1a00003 mov r0, r3 + 1f38c84: eafffffa b 1f38c74 + 1f38c88: eb00163e bl 1f3e588 + 1f38c8c: e1a00004 mov r0, r4 + 1f38c90: eafffff7 b 1f38c74 + +01f38c94 : + 1f38c94: e92d4010 push {r4, lr} + 1f38c98: e3a0e000 mov lr, #0 + 1f38c9c: e1a0c000 mov ip, r0 + 1f38ca0: e24ddefe sub sp, sp, #4064 ; 0xfe0 + 1f38ca4: e0804001 add r4, r0, r1 + 1f38ca8: e24dd008 sub sp, sp, #8 + 1f38cac: e1a0100e mov r1, lr + 1f38cb0: e1a0000d mov r0, sp + 1f38cb4: e0823003 add r3, r2, r3 + 1f38cb8: e58d4018 str r4, [sp, #24] + 1f38cbc: e88d000c stm sp, {r2, r3} + 1f38cc0: e58dc014 str ip, [sp, #20] + 1f38cc4: e58dc010 str ip, [sp, #16] + 1f38cc8: e58de01c str lr, [sp, #28] + 1f38ccc: ebffc0ef bl 1f29090 + 1f38cd0: e3500000 cmp r0, #0 + 1f38cd4: 03e00000 mvneq r0, #0 + 1f38cd8: 159d0014 ldrne r0, [sp, #20] + 1f38cdc: 159d3010 ldrne r3, [sp, #16] + 1f38ce0: 10600003 rsbne r0, r0, r3 + 1f38ce4: e28ddefe add sp, sp, #4064 ; 0xfe0 + 1f38ce8: e28dd008 add sp, sp, #8 + 1f38cec: e8bd8010 pop {r4, pc} + +01f38cf0 : + 1f38cf0: e30a3364 movw r3, #41828 ; 0xa364 + 1f38cf4: e340320d movt r3, #525 ; 0x20d + 1f38cf8: e5830000 str r0, [r3] + 1f38cfc: e12fff1e bx lr + +01f38d00 : + 1f38d00: e30a3368 movw r3, #41832 ; 0xa368 + 1f38d04: e340320d movt r3, #525 ; 0x20d + 1f38d08: e5830000 str r0, [r3] + 1f38d0c: e12fff1e bx lr + +01f38d10 : + 1f38d10: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f38d14: e0801001 add r1, r0, r1 + 1f38d18: e1a0c000 mov ip, r0 + 1f38d1c: e24dd0d0 sub sp, sp, #208 ; 0xd0 + 1f38d20: e1a05002 mov r5, r2 + 1f38d24: e28de0d0 add lr, sp, #208 ; 0xd0 + 1f38d28: e28d7018 add r7, sp, #24 + 1f38d2c: e1a06003 mov r6, r3 + 1f38d30: e3a03000 mov r3, #0 + 1f38d34: e58d00c8 str r0, [sp, #200] ; 0xc8 + 1f38d38: e52e70cc str r7, [lr, #-204]! ; 0xffffff34 + 1f38d3c: e58d10cc str r1, [sp, #204] ; 0xcc + 1f38d40: e1a0000e mov r0, lr + 1f38d44: e58d10c4 str r1, [sp, #196] ; 0xc4 + 1f38d48: e58dc0c0 str ip, [sp, #192] ; 0xc0 + 1f38d4c: e58d3028 str r3, [sp, #40] ; 0x28 + 1f38d50: e58d3038 str r3, [sp, #56] ; 0x38 + 1f38d54: e59d80f0 ldr r8, [sp, #240] ; 0xf0 + 1f38d58: ebffe2b8 bl 1f31840 + 1f38d5c: e2504000 subs r4, r0, #0 + 1f38d60: 0a00000f beq 1f38da4 + 1f38d64: e3550000 cmp r5, #0 + 1f38d68: 159d3004 ldrne r3, [sp, #4] + 1f38d6c: 15933000 ldrne r3, [r3] + 1f38d70: 15853000 strne r3, [r5] + 1f38d74: e3560000 cmp r6, #0 + 1f38d78: 159d3004 ldrne r3, [sp, #4] + 1f38d7c: 15933004 ldrne r3, [r3, #4] + 1f38d80: 15863000 strne r3, [r6] + 1f38d84: e3580000 cmp r8, #0 + 1f38d88: 159d3004 ldrne r3, [sp, #4] + 1f38d8c: 15933008 ldrne r3, [r3, #8] + 1f38d90: 15883000 strne r3, [r8] + 1f38d94: e3a04001 mov r4, #1 + 1f38d98: e1a00004 mov r0, r4 + 1f38d9c: e28dd0d0 add sp, sp, #208 ; 0xd0 + 1f38da0: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f38da4: e59d3004 ldr r3, [sp, #4] + 1f38da8: e3040854 movw r0, #18516 ; 0x4854 + 1f38dac: e28330b0 add r3, r3, #176 ; 0xb0 + 1f38db0: f463078f vld1.32 {d16}, [r3] + 1f38db4: e59d3004 ldr r3, [sp, #4] + 1f38db8: e28330a8 add r3, r3, #168 ; 0xa8 + 1f38dbc: f443078f vst1.32 {d16}, [r3] + 1f38dc0: eb0015e8 bl 1f3e568 + 1f38dc4: e59d20c0 ldr r2, [sp, #192] ; 0xc0 + 1f38dc8: e59d30c4 ldr r3, [sp, #196] ; 0xc4 + 1f38dcc: e1a09000 mov r9, r0 + 1f38dd0: e1520003 cmp r2, r3 + 1f38dd4: 3a0000c1 bcc 1f390e0 + 1f38dd8: e59d3038 ldr r3, [sp, #56] ; 0x38 + 1f38ddc: e3530000 cmp r3, #0 + 1f38de0: 1a00000c bne 1f38e18 + 1f38de4: e30a536c movw r5, #41836 ; 0xa36c + 1f38de8: e340520d movt r5, #525 ; 0x20d + 1f38dec: e1a00009 mov r0, r9 + 1f38df0: e3013104 movw r3, #4356 ; 0x1104 + 1f38df4: e34031f6 movt r3, #502 ; 0x1f6 + 1f38df8: e5853000 str r3, [r5] + 1f38dfc: eb0015e1 bl 1f3e588 + 1f38e00: e1a00004 mov r0, r4 + 1f38e04: e3013190 movw r3, #4496 ; 0x1190 + 1f38e08: e34031f6 movt r3, #502 ; 0x1f6 + 1f38e0c: e5853000 str r3, [r5] + 1f38e10: e28dd0d0 add sp, sp, #208 ; 0xd0 + 1f38e14: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f38e18: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f38e1c: e28d1040 add r1, sp, #64 ; 0x40 + 1f38e20: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f38e24: e59d0034 ldr r0, [sp, #52] ; 0x34 + 1f38e28: e12fff33 blx r3 + 1f38e2c: e3500000 cmp r0, #0 + 1f38e30: 028dc041 addeq ip, sp, #65 ; 0x41 + 1f38e34: 128d3040 addne r3, sp, #64 ; 0x40 + 1f38e38: 15dd2040 ldrbne r2, [sp, #64] ; 0x40 + 1f38e3c: 01a0300c moveq r3, ip + 1f38e40: 10833000 addne r3, r3, r0 + 1f38e44: 128dc041 addne ip, sp, #65 ; 0x41 + 1f38e48: 058d4038 streq r4, [sp, #56] ; 0x38 + 1f38e4c: 01a02004 moveq r2, r4 + 1f38e50: 05cd4040 strbeq r4, [sp, #64] ; 0x40 + 1f38e54: e28d1041 add r1, sp, #65 ; 0x41 + 1f38e58: e58d30c4 str r3, [sp, #196] ; 0xc4 + 1f38e5c: e58dc0c0 str ip, [sp, #192] ; 0xc0 + 1f38e60: e3520047 cmp r2, #71 ; 0x47 + 1f38e64: 1affffde bne 1f38de4 + 1f38e68: e1510003 cmp r1, r3 + 1f38e6c: 3a00009f bcc 1f390f0 + 1f38e70: e59d3038 ldr r3, [sp, #56] ; 0x38 + 1f38e74: e3530000 cmp r3, #0 + 1f38e78: 0affffd9 beq 1f38de4 + 1f38e7c: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f38e80: e28d1040 add r1, sp, #64 ; 0x40 + 1f38e84: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f38e88: e59d0034 ldr r0, [sp, #52] ; 0x34 + 1f38e8c: e12fff33 blx r3 + 1f38e90: e3500000 cmp r0, #0 + 1f38e94: 028d3041 addeq r3, sp, #65 ; 0x41 + 1f38e98: 128d3040 addne r3, sp, #64 ; 0x40 + 1f38e9c: 15dd2040 ldrbne r2, [sp, #64] ; 0x40 + 1f38ea0: 10833000 addne r3, r3, r0 + 1f38ea4: 058d0038 streq r0, [sp, #56] ; 0x38 + 1f38ea8: 01a02000 moveq r2, r0 + 1f38eac: 05cd0040 strbeq r0, [sp, #64] ; 0x40 + 1f38eb0: 01a0c003 moveq ip, r3 + 1f38eb4: 128dc041 addne ip, sp, #65 ; 0x41 + 1f38eb8: e58d30c4 str r3, [sp, #196] ; 0xc4 + 1f38ebc: e28d0041 add r0, sp, #65 ; 0x41 + 1f38ec0: e58dc0c0 str ip, [sp, #192] ; 0xc0 + 1f38ec4: e3520049 cmp r2, #73 ; 0x49 + 1f38ec8: 1affffc5 bne 1f38de4 + 1f38ecc: e1500003 cmp r0, r3 + 1f38ed0: 3a0000ad bcc 1f3918c + 1f38ed4: e59d3038 ldr r3, [sp, #56] ; 0x38 + 1f38ed8: e3530000 cmp r3, #0 + 1f38edc: 0affffc0 beq 1f38de4 + 1f38ee0: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f38ee4: e28d1040 add r1, sp, #64 ; 0x40 + 1f38ee8: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f38eec: e59d0034 ldr r0, [sp, #52] ; 0x34 + 1f38ef0: e12fff33 blx r3 + 1f38ef4: e3500000 cmp r0, #0 + 1f38ef8: 05cd0040 strbeq r0, [sp, #64] ; 0x40 + 1f38efc: 128d3040 addne r3, sp, #64 ; 0x40 + 1f38f00: 028dc041 addeq ip, sp, #65 ; 0x41 + 1f38f04: 10832000 addne r2, r3, r0 + 1f38f08: e5dd3040 ldrb r3, [sp, #64] ; 0x40 + 1f38f0c: 01a0200c moveq r2, ip + 1f38f10: 128dc041 addne ip, sp, #65 ; 0x41 + 1f38f14: 058d0038 streq r0, [sp, #56] ; 0x38 + 1f38f18: e58d20c4 str r2, [sp, #196] ; 0xc4 + 1f38f1c: e58dc0c0 str ip, [sp, #192] ; 0xc0 + 1f38f20: e3530046 cmp r3, #70 ; 0x46 + 1f38f24: 1affffae bne 1f38de4 + 1f38f28: e1a00007 mov r0, r7 + 1f38f2c: ebffba34 bl 1f27804 + 1f38f30: e3500038 cmp r0, #56 ; 0x38 + 1f38f34: 1affffaa bne 1f38de4 + 1f38f38: e59d30c0 ldr r3, [sp, #192] ; 0xc0 + 1f38f3c: e59d00c4 ldr r0, [sp, #196] ; 0xc4 + 1f38f40: e1530000 cmp r3, r0 + 1f38f44: 3a00006d bcc 1f39100 + 1f38f48: e59d3038 ldr r3, [sp, #56] ; 0x38 + 1f38f4c: e3530000 cmp r3, #0 + 1f38f50: 0affffa3 beq 1f38de4 + 1f38f54: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f38f58: e28d1040 add r1, sp, #64 ; 0x40 + 1f38f5c: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f38f60: e59d0034 ldr r0, [sp, #52] ; 0x34 + 1f38f64: e12fff33 blx r3 + 1f38f68: e3500000 cmp r0, #0 + 1f38f6c: 1a00006d bne 1f39128 + 1f38f70: e28dc041 add ip, sp, #65 ; 0x41 + 1f38f74: e58d0038 str r0, [sp, #56] ; 0x38 + 1f38f78: e5cd0040 strb r0, [sp, #64] ; 0x40 + 1f38f7c: e3a0a0c9 mov sl, #201 ; 0xc9 + 1f38f80: e1a0000c mov r0, ip + 1f38f84: e58d00c4 str r0, [sp, #196] ; 0xc4 + 1f38f88: e28d2041 add r2, sp, #65 ; 0x41 + 1f38f8c: e58dc0c0 str ip, [sp, #192] ; 0xc0 + 1f38f90: e35a0000 cmp sl, #0 + 1f38f94: 1affff92 bne 1f38de4 + 1f38f98: e1520000 cmp r2, r0 + 1f38f9c: 3a00005d bcc 1f39118 + 1f38fa0: e59d3038 ldr r3, [sp, #56] ; 0x38 + 1f38fa4: e3530000 cmp r3, #0 + 1f38fa8: 0affff8d beq 1f38de4 + 1f38fac: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f38fb0: e28d1040 add r1, sp, #64 ; 0x40 + 1f38fb4: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f38fb8: e59d0034 ldr r0, [sp, #52] ; 0x34 + 1f38fbc: e12fff33 blx r3 + 1f38fc0: e3500000 cmp r0, #0 + 1f38fc4: 028dc041 addeq ip, sp, #65 ; 0x41 + 1f38fc8: 128d3040 addne r3, sp, #64 ; 0x40 + 1f38fcc: 15dda040 ldrbne sl, [sp, #64] ; 0x40 + 1f38fd0: 01a0300c moveq r3, ip + 1f38fd4: 10833000 addne r3, r3, r0 + 1f38fd8: 128dc041 addne ip, sp, #65 ; 0x41 + 1f38fdc: 058da038 streq sl, [sp, #56] ; 0x38 + 1f38fe0: 05cda040 strbeq sl, [sp, #64] ; 0x40 + 1f38fe4: e58d30c4 str r3, [sp, #196] ; 0xc4 + 1f38fe8: e58dc0c0 str ip, [sp, #192] ; 0xc0 + 1f38fec: e35a0061 cmp sl, #97 ; 0x61 + 1f38ff0: 1affff7b bne 1f38de4 + 1f38ff4: e30a336c movw r3, #41836 ; 0xa36c + 1f38ff8: e340320d movt r3, #525 ; 0x20d + 1f38ffc: e1a00007 mov r0, r7 + 1f39000: e30f283c movw r2, #63548 ; 0xf83c + 1f39004: e34021f5 movt r2, #501 ; 0x1f5 + 1f39008: e5832000 str r2, [r3] + 1f3900c: ebffc6f7 bl 1f2abf0 + 1f39010: e5890000 str r0, [r9] + 1f39014: e1a00007 mov r0, r7 + 1f39018: ebffc6f4 bl 1f2abf0 + 1f3901c: e59d20c0 ldr r2, [sp, #192] ; 0xc0 + 1f39020: e59d30c4 ldr r3, [sp, #196] ; 0xc4 + 1f39024: e5890004 str r0, [r9, #4] + 1f39028: e1520003 cmp r2, r3 + 1f3902c: 3a000044 bcc 1f39144 + 1f39030: e59d3038 ldr r3, [sp, #56] ; 0x38 + 1f39034: e3530000 cmp r3, #0 + 1f39038: 05893010 streq r3, [r9, #16] + 1f3903c: 1a000069 bne 1f391e8 + 1f39040: e3530000 cmp r3, #0 + 1f39044: 05893014 streq r3, [r9, #20] + 1f39048: 1a000053 bne 1f3919c + 1f3904c: e3530000 cmp r3, #0 + 1f39050: 0a000010 beq 1f39098 + 1f39054: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f39058: e28d1040 add r1, sp, #64 ; 0x40 + 1f3905c: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f39060: e59d0034 ldr r0, [sp, #52] ; 0x34 + 1f39064: e12fff33 blx r3 + 1f39068: e3500000 cmp r0, #0 + 1f3906c: 028dc041 addeq ip, sp, #65 ; 0x41 + 1f39070: 128d2040 addne r2, sp, #64 ; 0x40 + 1f39074: 15dd3040 ldrbne r3, [sp, #64] ; 0x40 + 1f39078: 01a0200c moveq r2, ip + 1f3907c: 10822000 addne r2, r2, r0 + 1f39080: 128dc041 addne ip, sp, #65 ; 0x41 + 1f39084: 058d0038 streq r0, [sp, #56] ; 0x38 + 1f39088: 01a03000 moveq r3, r0 + 1f3908c: 05cd0040 strbeq r0, [sp, #64] ; 0x40 + 1f39090: e58d20c4 str r2, [sp, #196] ; 0xc4 + 1f39094: e58dc0c0 str ip, [sp, #192] ; 0xc0 + 1f39098: e3580000 cmp r8, #0 + 1f3909c: e5893018 str r3, [r9, #24] + 1f390a0: e3e03000 mvn r3, #0 + 1f390a4: e589301c str r3, [r9, #28] + 1f390a8: 13a03004 movne r3, #4 + 1f390ac: 15883000 strne r3, [r8] + 1f390b0: e3550000 cmp r5, #0 + 1f390b4: e1a00009 mov r0, r9 + 1f390b8: e3a04001 mov r4, #1 + 1f390bc: 15993000 ldrne r3, [r9] + 1f390c0: 15853000 strne r3, [r5] + 1f390c4: e3560000 cmp r6, #0 + 1f390c8: 15993004 ldrne r3, [r9, #4] + 1f390cc: 15863000 strne r3, [r6] + 1f390d0: eb00152c bl 1f3e588 + 1f390d4: e1a00004 mov r0, r4 + 1f390d8: e28dd0d0 add sp, sp, #208 ; 0xd0 + 1f390dc: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f390e0: e2821001 add r1, r2, #1 + 1f390e4: e58d10c0 str r1, [sp, #192] ; 0xc0 + 1f390e8: e5d22000 ldrb r2, [r2] + 1f390ec: eaffff5b b 1f38e60 + 1f390f0: e2810001 add r0, r1, #1 + 1f390f4: e58d00c0 str r0, [sp, #192] ; 0xc0 + 1f390f8: e5d12000 ldrb r2, [r1] + 1f390fc: eaffff70 b 1f38ec4 + 1f39100: e2832001 add r2, r3, #1 + 1f39104: e58d20c0 str r2, [sp, #192] ; 0xc0 + 1f39108: e5d3a000 ldrb sl, [r3] + 1f3910c: e24aa037 sub sl, sl, #55 ; 0x37 + 1f39110: e20aa0fd and sl, sl, #253 ; 0xfd + 1f39114: eaffff9d b 1f38f90 + 1f39118: e2823001 add r3, r2, #1 + 1f3911c: e58d30c0 str r3, [sp, #192] ; 0xc0 + 1f39120: e5d2a000 ldrb sl, [r2] + 1f39124: eaffffb0 b 1f38fec + 1f39128: e5dda040 ldrb sl, [sp, #64] ; 0x40 + 1f3912c: e28d3040 add r3, sp, #64 ; 0x40 + 1f39130: e0830000 add r0, r3, r0 + 1f39134: e28dc041 add ip, sp, #65 ; 0x41 + 1f39138: e24aa037 sub sl, sl, #55 ; 0x37 + 1f3913c: e20aa0fd and sl, sl, #253 ; 0xfd + 1f39140: eaffff8f b 1f38f84 + 1f39144: e2821001 add r1, r2, #1 + 1f39148: e58d10c0 str r1, [sp, #192] ; 0xc0 + 1f3914c: e5d22000 ldrb r2, [r2] + 1f39150: e1510003 cmp r1, r3 + 1f39154: e5892010 str r2, [r9, #16] + 1f39158: 259d3038 ldrcs r3, [sp, #56] ; 0x38 + 1f3915c: 2affffb7 bcs 1f39040 + 1f39160: e2812001 add r2, r1, #1 + 1f39164: e58d20c0 str r2, [sp, #192] ; 0xc0 + 1f39168: e5d11000 ldrb r1, [r1] + 1f3916c: e1530002 cmp r3, r2 + 1f39170: e5891014 str r1, [r9, #20] + 1f39174: 959d3038 ldrls r3, [sp, #56] ; 0x38 + 1f39178: 9affffb3 bls 1f3904c + 1f3917c: e2823001 add r3, r2, #1 + 1f39180: e58d30c0 str r3, [sp, #192] ; 0xc0 + 1f39184: e5d23000 ldrb r3, [r2] + 1f39188: eaffffc2 b 1f39098 + 1f3918c: e2803001 add r3, r0, #1 + 1f39190: e58d30c0 str r3, [sp, #192] ; 0xc0 + 1f39194: e5d03000 ldrb r3, [r0] + 1f39198: eaffff60 b 1f38f20 + 1f3919c: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f391a0: e28d1040 add r1, sp, #64 ; 0x40 + 1f391a4: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f391a8: e59d0034 ldr r0, [sp, #52] ; 0x34 + 1f391ac: e12fff33 blx r3 + 1f391b0: e3500000 cmp r0, #0 + 1f391b4: 028dc041 addeq ip, sp, #65 ; 0x41 + 1f391b8: 128d3040 addne r3, sp, #64 ; 0x40 + 1f391bc: 01a0300c moveq r3, ip + 1f391c0: 10833000 addne r3, r3, r0 + 1f391c4: 128dc041 addne ip, sp, #65 ; 0x41 + 1f391c8: 058d0038 streq r0, [sp, #56] ; 0x38 + 1f391cc: 05cd0040 strbeq r0, [sp, #64] ; 0x40 + 1f391d0: 01a01000 moveq r1, r0 + 1f391d4: 15dd1040 ldrbne r1, [sp, #64] ; 0x40 + 1f391d8: e28d2041 add r2, sp, #65 ; 0x41 + 1f391dc: e58d30c4 str r3, [sp, #196] ; 0xc4 + 1f391e0: e58dc0c0 str ip, [sp, #192] ; 0xc0 + 1f391e4: eaffffe0 b 1f3916c + 1f391e8: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f391ec: e28d1040 add r1, sp, #64 ; 0x40 + 1f391f0: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f391f4: e59d0034 ldr r0, [sp, #52] ; 0x34 + 1f391f8: e12fff33 blx r3 + 1f391fc: e3500000 cmp r0, #0 + 1f39200: 028dc041 addeq ip, sp, #65 ; 0x41 + 1f39204: 128d3040 addne r3, sp, #64 ; 0x40 + 1f39208: 01a0300c moveq r3, ip + 1f3920c: 10833000 addne r3, r3, r0 + 1f39210: 128dc041 addne ip, sp, #65 ; 0x41 + 1f39214: 058d0038 streq r0, [sp, #56] ; 0x38 + 1f39218: 05cd0040 strbeq r0, [sp, #64] ; 0x40 + 1f3921c: 01a02000 moveq r2, r0 + 1f39220: 15dd2040 ldrbne r2, [sp, #64] ; 0x40 + 1f39224: e28d1041 add r1, sp, #65 ; 0x41 + 1f39228: e58d30c4 str r3, [sp, #196] ; 0xc4 + 1f3922c: e58dc0c0 str ip, [sp, #192] ; 0xc0 + 1f39230: eaffffc6 b 1f39150 + +01f39234 : + 1f39234: e92d43f0 push {r4, r5, r6, r7, r8, r9, lr} + 1f39238: e1a05001 mov r5, r1 + 1f3923c: e1a06002 mov r6, r2 + 1f39240: e24dd0d4 sub sp, sp, #212 ; 0xd4 + 1f39244: e3a0e080 mov lr, #128 ; 0x80 + 1f39248: e28dc028 add ip, sp, #40 ; 0x28 + 1f3924c: e28d4040 add r4, sp, #64 ; 0x40 + 1f39250: e8900007 ldm r0, {r0, r1, r2} + 1f39254: e88c0007 stm ip, {r0, r1, r2} + 1f39258: e58d5034 str r5, [sp, #52] ; 0x34 + 1f3925c: e3a0c001 mov ip, #1 + 1f39260: e1a00005 mov r0, r5 + 1f39264: e59d8028 ldr r8, [sp, #40] ; 0x28 + 1f39268: e58de03c str lr, [sp, #60] ; 0x3c + 1f3926c: e1a0200e mov r2, lr + 1f39270: e1a01004 mov r1, r4 + 1f39274: e58dc038 str ip, [sp, #56] ; 0x38 + 1f39278: e58d40c8 str r4, [sp, #200] ; 0xc8 + 1f3927c: e1a05003 mov r5, r3 + 1f39280: e59d70f0 ldr r7, [sp, #240] ; 0xf0 + 1f39284: e12fff38 blx r8 + 1f39288: e3500000 cmp r0, #0 + 1f3928c: 058d0038 streq r0, [sp, #56] ; 0x38 + 1f39290: 10843000 addne r3, r4, r0 + 1f39294: 05cd0040 strbeq r0, [sp, #64] ; 0x40 + 1f39298: e28d00d0 add r0, sp, #208 ; 0xd0 + 1f3929c: e28d8018 add r8, sp, #24 + 1f392a0: 028d3041 addeq r3, sp, #65 ; 0x41 + 1f392a4: e58d40c0 str r4, [sp, #192] ; 0xc0 + 1f392a8: e58d30c4 str r3, [sp, #196] ; 0xc4 + 1f392ac: e52080cc str r8, [r0, #-204]! ; 0xffffff34 + 1f392b0: e58d30cc str r3, [sp, #204] ; 0xcc + 1f392b4: ebffe161 bl 1f31840 + 1f392b8: e3500000 cmp r0, #0 + 1f392bc: 0a00000f beq 1f39300 + 1f392c0: e3560000 cmp r6, #0 + 1f392c4: 159d3004 ldrne r3, [sp, #4] + 1f392c8: 15933000 ldrne r3, [r3] + 1f392cc: 15863000 strne r3, [r6] + 1f392d0: e3550000 cmp r5, #0 + 1f392d4: 159d3004 ldrne r3, [sp, #4] + 1f392d8: 15933004 ldrne r3, [r3, #4] + 1f392dc: 15853000 strne r3, [r5] + 1f392e0: e3570000 cmp r7, #0 + 1f392e4: 159d3004 ldrne r3, [sp, #4] + 1f392e8: 15933008 ldrne r3, [r3, #8] + 1f392ec: 15873000 strne r3, [r7] + 1f392f0: e3a04001 mov r4, #1 + 1f392f4: e1a00004 mov r0, r4 + 1f392f8: e28dd0d4 add sp, sp, #212 ; 0xd4 + 1f392fc: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f39300: e59d3004 ldr r3, [sp, #4] + 1f39304: e3040854 movw r0, #18516 ; 0x4854 + 1f39308: e28330b0 add r3, r3, #176 ; 0xb0 + 1f3930c: f463078f vld1.32 {d16}, [r3] + 1f39310: e59d3004 ldr r3, [sp, #4] + 1f39314: e28330a8 add r3, r3, #168 ; 0xa8 + 1f39318: f443078f vst1.32 {d16}, [r3] + 1f3931c: eb001491 bl 1f3e568 + 1f39320: e1a09000 mov r9, r0 + 1f39324: e1a02007 mov r2, r7 + 1f39328: e1a00008 mov r0, r8 + 1f3932c: e1a01009 mov r1, r9 + 1f39330: e3a03001 mov r3, #1 + 1f39334: ebffead3 bl 1f33e88 + 1f39338: e2504000 subs r4, r0, #0 + 1f3933c: 0a00000b beq 1f39370 + 1f39340: e3560000 cmp r6, #0 + 1f39344: e1a00009 mov r0, r9 + 1f39348: e3a04001 mov r4, #1 + 1f3934c: 15993000 ldrne r3, [r9] + 1f39350: 15863000 strne r3, [r6] + 1f39354: e3550000 cmp r5, #0 + 1f39358: 15993004 ldrne r3, [r9, #4] + 1f3935c: 15853000 strne r3, [r5] + 1f39360: eb001488 bl 1f3e588 + 1f39364: e1a00004 mov r0, r4 + 1f39368: e28dd0d4 add sp, sp, #212 ; 0xd4 + 1f3936c: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f39370: e1a00009 mov r0, r9 + 1f39374: eb001483 bl 1f3e588 + 1f39378: e30a336c movw r3, #41836 ; 0xa36c + 1f3937c: e340320d movt r3, #525 ; 0x20d + 1f39380: e1a00004 mov r0, r4 + 1f39384: e3012190 movw r2, #4496 ; 0x1190 + 1f39388: e34021f6 movt r2, #502 ; 0x1f6 + 1f3938c: e5832000 str r2, [r3] + 1f39390: e28dd0d4 add sp, sp, #212 ; 0xd4 + 1f39394: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + +01f39398 : + 1f39398: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f3939c: e1a06001 mov r6, r1 + 1f393a0: e1a05002 mov r5, r2 + 1f393a4: e1a07003 mov r7, r3 + 1f393a8: e1a04000 mov r4, r0 + 1f393ac: ebff2963 bl 1f03940 + 1f393b0: e3a00003 mov r0, #3 + 1f393b4: e3400004 movt r0, #4 + 1f393b8: ebff296c bl 1f03970 + 1f393bc: e3a00004 mov r0, #4 + 1f393c0: e3400004 movt r0, #4 + 1f393c4: ebff2969 bl 1f03970 + 1f393c8: e3a00005 mov r0, #5 + 1f393cc: e3400004 movt r0, #4 + 1f393d0: ebff2966 bl 1f03970 + 1f393d4: ebff2afb bl 1f03fc8 + 1f393d8: ebff2958 bl 1f03940 + 1f393dc: e3a00001 mov r0, #1 + 1f393e0: e3400004 movt r0, #4 + 1f393e4: ebff2961 bl 1f03970 + 1f393e8: e1a02005 mov r2, r5 + 1f393ec: e1a01006 mov r1, r6 + 1f393f0: e3080003 movw r0, #32771 ; 0x8003 + 1f393f4: e3400004 movt r0, #4 + 1f393f8: ebff295c bl 1f03970 + 1f393fc: e1a02005 mov r2, r5 + 1f39400: e1a01006 mov r1, r6 + 1f39404: e3080004 movw r0, #32772 ; 0x8004 + 1f39408: e3400004 movt r0, #4 + 1f3940c: ebff2957 bl 1f03970 + 1f39410: e1a01007 mov r1, r7 + 1f39414: e3080005 movw r0, #32773 ; 0x8005 + 1f39418: e3400004 movt r0, #4 + 1f3941c: ebff2953 bl 1f03970 + 1f39420: e3a00008 mov r0, #8 + 1f39424: e3400004 movt r0, #4 + 1f39428: ebff2950 bl 1f03970 + 1f3942c: e3a00003 mov r0, #3 + 1f39430: e3400004 movt r0, #4 + 1f39434: ebff294d bl 1f03970 + 1f39438: e3a00005 mov r0, #5 + 1f3943c: e3400004 movt r0, #4 + 1f39440: ebff294a bl 1f03970 + 1f39444: ebff2adf bl 1f03fc8 + 1f39448: e3a00003 mov r0, #3 + 1f3944c: e3400004 movt r0, #4 + 1f39450: ebff2afa bl 1f04040 + 1f39454: e2503000 subs r3, r0, #0 + 1f39458: e3a00005 mov r0, #5 + 1f3945c: e3400004 movt r0, #4 + 1f39460: 15932008 ldrne r2, [r3, #8] + 1f39464: 1584200c strne r2, [r4, #12] + 1f39468: 1593300c ldrne r3, [r3, #12] + 1f3946c: 15843010 strne r3, [r4, #16] + 1f39470: ebff2af2 bl 1f04040 + 1f39474: e2503000 subs r3, r0, #0 + 1f39478: e3a00008 mov r0, #8 + 1f3947c: e3400004 movt r0, #4 + 1f39480: 15933008 ldrne r3, [r3, #8] + 1f39484: 15843014 strne r3, [r4, #20] + 1f39488: ebff2aec bl 1f04040 + 1f3948c: e2503000 subs r3, r0, #0 + 1f39490: e3a00001 mov r0, #1 + 1f39494: e3400004 movt r0, #4 + 1f39498: 15933008 ldrne r3, [r3, #8] + 1f3949c: 15843018 strne r3, [r4, #24] + 1f394a0: ebff2ae6 bl 1f04040 + 1f394a4: e3500000 cmp r0, #0 + 1f394a8: 0594301c ldreq r3, [r4, #28] + 1f394ac: 15903008 ldrne r3, [r0, #8] + 1f394b0: 13c33103 bicne r3, r3, #-1073741824 ; 0xc0000000 + 1f394b4: 1584301c strne r3, [r4, #28] + 1f394b8: e3530000 cmp r3, #0 + 1f394bc: 0affffc5 beq 1f393d8 + 1f394c0: e5943014 ldr r3, [r4, #20] + 1f394c4: e3530018 cmp r3, #24 + 1f394c8: 0a000017 beq 1f3952c + 1f394cc: e3530020 cmp r3, #32 + 1f394d0: 0a00000f beq 1f39514 + 1f394d4: e3530008 cmp r3, #8 + 1f394d8: 0a000007 beq 1f394fc + 1f394dc: e30736f0 movw r3, #30448 ; 0x76f0 + 1f394e0: e34031f2 movt r3, #498 ; 0x1f2 + 1f394e4: e3a02000 mov r2, #0 + 1f394e8: e5843000 str r3, [r4] + 1f394ec: e5842004 str r2, [r4, #4] + 1f394f0: e3a03001 mov r3, #1 + 1f394f4: e5c43008 strb r3, [r4, #8] + 1f394f8: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f394fc: e3073718 movw r3, #30488 ; 0x7718 + 1f39500: e34031f2 movt r3, #498 ; 0x1f2 + 1f39504: e3a02000 mov r2, #0 + 1f39508: e5843000 str r3, [r4] + 1f3950c: e5842004 str r2, [r4, #4] + 1f39510: eafffff6 b 1f394f0 + 1f39514: e30736b0 movw r3, #30384 ; 0x76b0 + 1f39518: e34031f2 movt r3, #498 ; 0x1f2 + 1f3951c: e3a02000 mov r2, #0 + 1f39520: e5843000 str r3, [r4] + 1f39524: e5842004 str r2, [r4, #4] + 1f39528: eafffff0 b 1f394f0 + 1f3952c: e30736bc movw r3, #30396 ; 0x76bc + 1f39530: e34031f2 movt r3, #498 ; 0x1f2 + 1f39534: e3a02000 mov r2, #0 + 1f39538: e5843000 str r3, [r4] + 1f3953c: e5842004 str r2, [r4, #4] + 1f39540: eaffffea b 1f394f0 + +01f39544 : + 1f39544: e92d4010 push {r4, lr} + 1f39548: e590e00c ldr lr, [r0, #12] + 1f3954c: e5914000 ldr r4, [r1] + 1f39550: e59dc008 ldr ip, [sp, #8] + 1f39554: e154000e cmp r4, lr + 1f39558: 8581e000 strhi lr, [r1] + 1f3955c: e5901010 ldr r1, [r0, #16] + 1f39560: e592e000 ldr lr, [r2] + 1f39564: e15e0001 cmp lr, r1 + 1f39568: 85821000 strhi r1, [r2] + 1f3956c: e590200c ldr r2, [r0, #12] + 1f39570: e5931000 ldr r1, [r3] + 1f39574: e1510002 cmp r1, r2 + 1f39578: 85832000 strhi r2, [r3] + 1f3957c: e5903010 ldr r3, [r0, #16] + 1f39580: e59c2000 ldr r2, [ip] + 1f39584: e1520003 cmp r2, r3 + 1f39588: 858c3000 strhi r3, [ip] + 1f3958c: e8bd8010 pop {r4, pc} + +01f39590 : + 1f39590: e92d4ff8 push {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f39594: e590700c ldr r7, [r0, #12] + 1f39598: e1a04000 mov r4, r0 + 1f3959c: e5900010 ldr r0, [r0, #16] + 1f395a0: e1570001 cmp r7, r1 + 1f395a4: e59db028 ldr fp, [sp, #40] ; 0x28 + 1f395a8: 31a0a007 movcc sl, r7 + 1f395ac: 21a0a001 movcs sl, r1 + 1f395b0: e1500002 cmp r0, r2 + 1f395b4: e59d802c ldr r8, [sp, #44] ; 0x2c + 1f395b8: 31a09000 movcc r9, r0 + 1f395bc: 21a09002 movcs r9, r2 + 1f395c0: e1570003 cmp r7, r3 + 1f395c4: 21a07003 movcs r7, r3 + 1f395c8: e150000b cmp r0, fp + 1f395cc: 31a0b000 movcc fp, r0 + 1f395d0: e159000b cmp r9, fp + 1f395d4: 28bd8ff8 popcs {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f395d8: e5946018 ldr r6, [r4, #24] + 1f395dc: e15a0007 cmp sl, r7 + 1f395e0: 31a0500a movcc r5, sl + 1f395e4: e0060996 mul r6, r6, r9 + 1f395e8: 2a00000e bcs 1f39628 + 1f395ec: e5943004 ldr r3, [r4, #4] + 1f395f0: e5941014 ldr r1, [r4, #20] + 1f395f4: e3130001 tst r3, #1 + 1f395f8: e08400c3 add r0, r4, r3, asr #1 + 1f395fc: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f39600: e1a011a1 lsr r1, r1, #3 + 1f39604: 15943000 ldrne r3, [r4] + 1f39608: e0216195 mla r1, r5, r1, r6 + 1f3960c: 05943000 ldreq r3, [r4] + 1f39610: e2855001 add r5, r5, #1 + 1f39614: 17923003 ldrne r3, [r2, r3] + 1f39618: e1a02008 mov r2, r8 + 1f3961c: e12fff33 blx r3 + 1f39620: e1550007 cmp r5, r7 + 1f39624: 3afffff0 bcc 1f395ec + 1f39628: e2899001 add r9, r9, #1 + 1f3962c: e159000b cmp r9, fp + 1f39630: 3affffe8 bcc 1f395d8 + 1f39634: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} + +01f39638 : + 1f39638: e590c00c ldr ip, [r0, #12] + 1f3963c: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f39640: e15c0001 cmp ip, r1 + 1f39644: e59d7018 ldr r7, [sp, #24] + 1f39648: 31a0100c movcc r1, ip + 1f3964c: e15c0003 cmp ip, r3 + 1f39650: 31a0300c movcc r3, ip + 1f39654: e2434001 sub r4, r3, #1 + 1f39658: e1540001 cmp r4, r1 + 1f3965c: 98bd81f0 popls {r4, r5, r6, r7, r8, pc} + 1f39660: e5903010 ldr r3, [r0, #16] + 1f39664: e1530002 cmp r3, r2 + 1f39668: 31a05003 movcc r5, r3 + 1f3966c: 21a05002 movcs r5, r2 + 1f39670: e1530007 cmp r3, r7 + 1f39674: 31a07003 movcc r7, r3 + 1f39678: e1570005 cmp r7, r5 + 1f3967c: 98bd81f0 popls {r4, r5, r6, r7, r8, pc} + 1f39680: e5903014 ldr r3, [r0, #20] + 1f39684: e5908018 ldr r8, [r0, #24] + 1f39688: e590201c ldr r2, [r0, #28] + 1f3968c: e1a001a3 lsr r0, r3, #3 + 1f39690: e0260091 mla r6, r1, r0, r0 + 1f39694: e0266598 mla r6, r8, r5, r6 + 1f39698: e0826006 add r6, r2, r6 + 1f3969c: e1a03006 mov r3, r6 + 1f396a0: e1a02001 mov r2, r1 + 1f396a4: e060c003 rsb ip, r0, r3 + 1f396a8: e2822001 add r2, r2, #1 + 1f396ac: e1540002 cmp r4, r2 + 1f396b0: e1d3e0b0 ldrh lr, [r3] + 1f396b4: e0833000 add r3, r3, r0 + 1f396b8: e1cce0b0 strh lr, [ip] + 1f396bc: 1afffff8 bne 1f396a4 + 1f396c0: e2855001 add r5, r5, #1 + 1f396c4: e0866008 add r6, r6, r8 + 1f396c8: e1550007 cmp r5, r7 + 1f396cc: 1afffff2 bne 1f3969c + 1f396d0: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f396d4 : + 1f396d4: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f396d8: e5909010 ldr r9, [r0, #16] + 1f396dc: e590600c ldr r6, [r0, #12] + 1f396e0: e3590000 cmp r9, #0 + 1f396e4: 08bd87f0 popeq {r4, r5, r6, r7, r8, r9, sl, pc} + 1f396e8: e1a07001 mov r7, r1 + 1f396ec: e1a04000 mov r4, r0 + 1f396f0: e3a08000 mov r8, #0 + 1f396f4: e5945018 ldr r5, [r4, #24] + 1f396f8: e3560000 cmp r6, #0 + 1f396fc: 13a0a000 movne sl, #0 + 1f39700: e0050895 mul r5, r5, r8 + 1f39704: 0a00000e beq 1f39744 + 1f39708: e5943004 ldr r3, [r4, #4] + 1f3970c: e5941014 ldr r1, [r4, #20] + 1f39710: e3130001 tst r3, #1 + 1f39714: e08400c3 add r0, r4, r3, asr #1 + 1f39718: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f3971c: e1a011a1 lsr r1, r1, #3 + 1f39720: 15943000 ldrne r3, [r4] + 1f39724: e021519a mla r1, sl, r1, r5 + 1f39728: 05943000 ldreq r3, [r4] + 1f3972c: e28aa001 add sl, sl, #1 + 1f39730: 17923003 ldrne r3, [r2, r3] + 1f39734: e1a02007 mov r2, r7 + 1f39738: e12fff33 blx r3 + 1f3973c: e156000a cmp r6, sl + 1f39740: 1afffff0 bne 1f39708 + 1f39744: e2888001 add r8, r8, #1 + 1f39748: e1590008 cmp r9, r8 + 1f3974c: 1affffe8 bne 1f396f4 + 1f39750: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + +01f39754 : + 1f39754: e5d0c008 ldrb ip, [r0, #8] + 1f39758: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f3975c: e35c0000 cmp ip, #0 + 1f39760: e5dde004 ldrb lr, [sp, #4] + 1f39764: 049df004 popeq {pc} ; (ldreq pc, [sp], #4) + 1f39768: e58de004 str lr, [sp, #4] + 1f3976c: e49de004 pop {lr} ; (ldr lr, [sp], #4) + 1f39770: eaffb844 b 1f27888 + +01f39774 : + 1f39774: e92d4010 push {r4, lr} + 1f39778: e590e014 ldr lr, [r0, #20] + 1f3977c: e1a0c000 mov ip, r0 + 1f39780: e5904018 ldr r4, [r0, #24] + 1f39784: e5900004 ldr r0, [r0, #4] + 1f39788: e1a0e1ae lsr lr, lr, #3 + 1f3978c: e3100001 tst r0, #1 + 1f39790: e0020294 mul r2, r4, r2 + 1f39794: e0212e91 mla r1, r1, lr, r2 + 1f39798: 179ce0c0 ldrne lr, [ip, r0, asr #1] + 1f3979c: 008c00c0 addeq r0, ip, r0, asr #1 + 1f397a0: 159c2000 ldrne r2, [ip] + 1f397a4: 108c00c0 addne r0, ip, r0, asr #1 + 1f397a8: 059ce000 ldreq lr, [ip] + 1f397ac: 179ee002 ldrne lr, [lr, r2] + 1f397b0: e1a02003 mov r2, r3 + 1f397b4: e1a0300e mov r3, lr + 1f397b8: e8bd4010 pop {r4, lr} + 1f397bc: e12fff13 bx r3 + +01f397c0 : + 1f397c0: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f397c4: e590c00c ldr ip, [r0, #12] + 1f397c8: e1a04000 mov r4, r0 + 1f397cc: e24dd00c sub sp, sp, #12 + 1f397d0: e5900010 ldr r0, [r0, #16] + 1f397d4: e15c0001 cmp ip, r1 + 1f397d8: 31a0a00c movcc sl, ip + 1f397dc: 21a0a001 movcs sl, r1 + 1f397e0: e59d9030 ldr r9, [sp, #48] ; 0x30 + 1f397e4: e1500002 cmp r0, r2 + 1f397e8: 31a0b000 movcc fp, r0 + 1f397ec: 21a0b002 movcs fp, r2 + 1f397f0: e15c0003 cmp ip, r3 + 1f397f4: 906a300c rsbls r3, sl, ip + 1f397f8: 806a3003 rsbhi r3, sl, r3 + 1f397fc: e1500009 cmp r0, r9 + 1f39800: 906b9000 rsbls r9, fp, r0 + 1f39804: 806b9009 rsbhi r9, fp, r9 + 1f39808: e1a00003 mov r0, r3 + 1f3980c: e58d3004 str r3, [sp, #4] + 1f39810: eb001314 bl 1f3e468 + 1f39814: e1a05000 mov r5, r0 + 1f39818: e1a00009 mov r0, r9 + 1f3981c: eb001311 bl 1f3e468 + 1f39820: e1550000 cmp r5, r0 + 1f39824: ba00001e blt 1f398a4 + 1f39828: e3550000 cmp r5, #0 + 1f3982c: ba00001a blt 1f3989c + 1f39830: e3a06000 mov r6, #0 + 1f39834: e1a08006 mov r8, r6 + 1f39838: e1a07006 mov r7, r6 + 1f3983c: e71cf516 sdiv ip, r6, r5 + 1f39840: e5943018 ldr r3, [r4, #24] + 1f39844: e594e014 ldr lr, [r4, #20] + 1f39848: e2877001 add r7, r7, #1 + 1f3984c: e5942004 ldr r2, [r4, #4] + 1f39850: e08cc00b add ip, ip, fp + 1f39854: e0866009 add r6, r6, r9 + 1f39858: e3120001 tst r2, #1 + 1f3985c: e1a0e1ae lsr lr, lr, #3 + 1f39860: e00c0c93 mul ip, r3, ip + 1f39864: e08400c2 add r0, r4, r2, asr #1 + 1f39868: 179420c2 ldrne r2, [r4, r2, asr #1] + 1f3986c: e711f518 sdiv r1, r8, r5 + 1f39870: e081300a add r3, r1, sl + 1f39874: e021c39e mla r1, lr, r3, ip + 1f39878: 15943000 ldrne r3, [r4] + 1f3987c: 05943000 ldreq r3, [r4] + 1f39880: 17923003 ldrne r3, [r2, r3] + 1f39884: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f39888: e12fff33 blx r3 + 1f3988c: e59d3004 ldr r3, [sp, #4] + 1f39890: e1550007 cmp r5, r7 + 1f39894: e0888003 add r8, r8, r3 + 1f39898: aaffffe7 bge 1f3983c + 1f3989c: e28dd00c add sp, sp, #12 + 1f398a0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f398a4: e1a00009 mov r0, r9 + 1f398a8: eb0012ee bl 1f3e468 + 1f398ac: e1a05000 mov r5, r0 + 1f398b0: eaffffdc b 1f39828 + +01f398b4 : + 1f398b4: e1520003 cmp r2, r3 + 1f398b8: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f398bc: e59d7018 ldr r7, [sp, #24] + 1f398c0: 88bd81f0 pophi {r4, r5, r6, r7, r8, pc} + 1f398c4: e1a05002 mov r5, r2 + 1f398c8: e1a06003 mov r6, r3 + 1f398cc: e1a04000 mov r4, r0 + 1f398d0: e1a08001 mov r8, r1 + 1f398d4: e5941014 ldr r1, [r4, #20] + 1f398d8: e5942004 ldr r2, [r4, #4] + 1f398dc: e594c018 ldr ip, [r4, #24] + 1f398e0: e3120001 tst r2, #1 + 1f398e4: e1a031a1 lsr r3, r1, #3 + 1f398e8: e08400c2 add r0, r4, r2, asr #1 + 1f398ec: e001059c mul r1, ip, r5 + 1f398f0: e0211398 mla r1, r8, r3, r1 + 1f398f4: 179420c2 ldrne r2, [r4, r2, asr #1] + 1f398f8: e2855001 add r5, r5, #1 + 1f398fc: 15943000 ldrne r3, [r4] + 1f39900: 05943000 ldreq r3, [r4] + 1f39904: 17923003 ldrne r3, [r2, r3] + 1f39908: e1a02007 mov r2, r7 + 1f3990c: e12fff33 blx r3 + 1f39910: e1560005 cmp r6, r5 + 1f39914: 2affffee bcs 1f398d4 + 1f39918: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f3991c : + 1f3991c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f39920: e3510000 cmp r1, #0 + 1f39924: e1a04000 mov r4, r0 + 1f39928: e24dd034 sub sp, sp, #52 ; 0x34 + 1f3992c: 03a0c010 moveq ip, #16 + 1f39930: 13a0c008 movne ip, #8 + 1f39934: e58d2018 str r2, [sp, #24] + 1f39938: e59d2068 ldr r2, [sp, #104] ; 0x68 + 1f3993c: e58d3010 str r3, [sp, #16] + 1f39940: e3520000 cmp r2, #0 + 1f39944: e5dd3064 ldrb r3, [sp, #100] ; 0x64 + 1f39948: e58d301c str r3, [sp, #28] + 1f3994c: 13a03000 movne r3, #0 + 1f39950: 15823000 strne r3, [r2] + 1f39954: e59d3058 ldr r3, [sp, #88] ; 0x58 + 1f39958: e58dc014 str ip, [sp, #20] + 1f3995c: e58d102c str r1, [sp, #44] ; 0x2c + 1f39960: e1d3b0d0 ldrsb fp, [r3] + 1f39964: e59da060 ldr sl, [sp, #96] ; 0x60 + 1f39968: e35b0000 cmp fp, #0 + 1f3996c: 0a00005a beq 1f39adc + 1f39970: e2839001 add r9, r3, #1 + 1f39974: e59d3018 ldr r3, [sp, #24] + 1f39978: e58d300c str r3, [sp, #12] + 1f3997c: ea000014 b 1f399d4 + 1f39980: e59d301c ldr r3, [sp, #28] + 1f39984: e3530000 cmp r3, #0 + 1f39988: 0a00001b beq 1f399fc + 1f3998c: e59d300c ldr r3, [sp, #12] + 1f39990: e2833008 add r3, r3, #8 + 1f39994: e58d300c str r3, [sp, #12] + 1f39998: e59d3068 ldr r3, [sp, #104] ; 0x68 + 1f3999c: e3530000 cmp r3, #0 + 1f399a0: 0a000006 beq 1f399c0 + 1f399a4: e59d200c ldr r2, [sp, #12] + 1f399a8: e5933000 ldr r3, [r3] + 1f399ac: e1c22fc2 bic r2, r2, r2, asr #31 + 1f399b0: e1530002 cmp r3, r2 + 1f399b4: 31a03002 movcc r3, r2 + 1f399b8: e59d2068 ldr r2, [sp, #104] ; 0x68 + 1f399bc: e5823000 str r3, [r2] + 1f399c0: e59d3058 ldr r3, [sp, #88] ; 0x58 + 1f399c4: e0630009 rsb r0, r3, r9 + 1f399c8: e0d9b0d1 ldrsb fp, [r9], #1 + 1f399cc: e35b0000 cmp fp, #0 + 1f399d0: 0a000042 beq 1f39ae0 + 1f399d4: e35b000d cmp fp, #13 + 1f399d8: 135b000a cmpne fp, #10 + 1f399dc: 1affffe7 bne 1f39980 + 1f399e0: e59d3010 ldr r3, [sp, #16] + 1f399e4: e59d2014 ldr r2, [sp, #20] + 1f399e8: e0833002 add r3, r3, r2 + 1f399ec: e58d3010 str r3, [sp, #16] + 1f399f0: e59d3018 ldr r3, [sp, #24] + 1f399f4: e58d300c str r3, [sp, #12] + 1f399f8: eafffff0 b 1f399c0 + 1f399fc: e59d000c ldr r0, [sp, #12] + 1f39a00: e594700c ldr r7, [r4, #12] + 1f39a04: e2803008 add r3, r0, #8 + 1f39a08: e59dc010 ldr ip, [sp, #16] + 1f39a0c: e1a01003 mov r1, r3 + 1f39a10: e58d3020 str r3, [sp, #32] + 1f39a14: e5943010 ldr r3, [r4, #16] + 1f39a18: e1500007 cmp r0, r7 + 1f39a1c: e59de014 ldr lr, [sp, #20] + 1f39a20: 21a00007 movcs r0, r7 + 1f39a24: e15c0003 cmp ip, r3 + 1f39a28: e08e200c add r2, lr, ip + 1f39a2c: 31a0800c movcc r8, ip + 1f39a30: 21a08003 movcs r8, r3 + 1f39a34: e1510007 cmp r1, r7 + 1f39a38: 31a07001 movcc r7, r1 + 1f39a3c: e1520003 cmp r2, r3 + 1f39a40: 31a03002 movcc r3, r2 + 1f39a44: e1a0e000 mov lr, r0 + 1f39a48: e1580003 cmp r8, r3 + 1f39a4c: 358db024 strcc fp, [sp, #36] ; 0x24 + 1f39a50: 358d9028 strcc r9, [sp, #40] ; 0x28 + 1f39a54: 31a0b003 movcc fp, r3 + 1f39a58: 31a0900e movcc r9, lr + 1f39a5c: 2a000018 bcs 1f39ac4 + 1f39a60: e5946018 ldr r6, [r4, #24] + 1f39a64: e1570009 cmp r7, r9 + 1f39a68: 81a05009 movhi r5, r9 + 1f39a6c: e0060896 mul r6, r6, r8 + 1f39a70: 9a00000e bls 1f39ab0 + 1f39a74: e5943004 ldr r3, [r4, #4] + 1f39a78: e5941014 ldr r1, [r4, #20] + 1f39a7c: e3130001 tst r3, #1 + 1f39a80: e08400c3 add r0, r4, r3, asr #1 + 1f39a84: 179420c3 ldrne r2, [r4, r3, asr #1] + 1f39a88: e1a011a1 lsr r1, r1, #3 + 1f39a8c: 15943000 ldrne r3, [r4] + 1f39a90: e0216195 mla r1, r5, r1, r6 + 1f39a94: 05943000 ldreq r3, [r4] + 1f39a98: e2855001 add r5, r5, #1 + 1f39a9c: 17923003 ldrne r3, [r2, r3] + 1f39aa0: e1a0200a mov r2, sl + 1f39aa4: e12fff33 blx r3 + 1f39aa8: e1570005 cmp r7, r5 + 1f39aac: 8afffff0 bhi 1f39a74 + 1f39ab0: e2888001 add r8, r8, #1 + 1f39ab4: e15b0008 cmp fp, r8 + 1f39ab8: 8affffe8 bhi 1f39a60 + 1f39abc: e59db024 ldr fp, [sp, #36] ; 0x24 + 1f39ac0: e59d9028 ldr r9, [sp, #40] ; 0x28 + 1f39ac4: e5d43008 ldrb r3, [r4, #8] + 1f39ac8: e3530000 cmp r3, #0 + 1f39acc: 1a000009 bne 1f39af8 + 1f39ad0: e59d3020 ldr r3, [sp, #32] + 1f39ad4: e58d300c str r3, [sp, #12] + 1f39ad8: eaffffae b 1f39998 + 1f39adc: e1a0000b mov r0, fp + 1f39ae0: e59d306c ldr r3, [sp, #108] ; 0x6c + 1f39ae4: e3530000 cmp r3, #0 + 1f39ae8: 159d2010 ldrne r2, [sp, #16] + 1f39aec: 15832000 strne r2, [r3] + 1f39af0: e28dd034 add sp, sp, #52 ; 0x34 + 1f39af4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f39af8: e59d3020 ldr r3, [sp, #32] + 1f39afc: e6efb07b uxtb fp, fp + 1f39b00: e59d200c ldr r2, [sp, #12] + 1f39b04: e1a00004 mov r0, r4 + 1f39b08: e58d300c str r3, [sp, #12] + 1f39b0c: e59d305c ldr r3, [sp, #92] ; 0x5c + 1f39b10: e58d3004 str r3, [sp, #4] + 1f39b14: e58db000 str fp, [sp] + 1f39b18: e59d3010 ldr r3, [sp, #16] + 1f39b1c: e59d102c ldr r1, [sp, #44] ; 0x2c + 1f39b20: ebffb758 bl 1f27888 + 1f39b24: eaffff9b b 1f39998 + +01f39b28 : + 1f39b28: e3510000 cmp r1, #0 + 1f39b2c: e92d4070 push {r4, r5, r6, lr} + 1f39b30: 03a05010 moveq r5, #16 + 1f39b34: 13a05008 movne r5, #8 + 1f39b38: e3530000 cmp r3, #0 + 1f39b3c: e59d6010 ldr r6, [sp, #16] + 1f39b40: 0a00001a beq 1f39bb0 + 1f39b44: e3a04000 mov r4, #0 + 1f39b48: e5834000 str r4, [r3] + 1f39b4c: e1d210d0 ldrsb r1, [r2] + 1f39b50: e1510004 cmp r1, r4 + 1f39b54: 1282e001 addne lr, r2, #1 + 1f39b58: 11a0c004 movne ip, r4 + 1f39b5c: 0a000020 beq 1f39be4 + 1f39b60: e351000d cmp r1, #13 + 1f39b64: 1351000a cmpne r1, #10 + 1f39b68: e28cc008 add ip, ip, #8 + 1f39b6c: 03a01000 moveq r1, #0 + 1f39b70: 13a01001 movne r1, #1 + 1f39b74: e1cc0fcc bic r0, ip, ip, asr #31 + 1f39b78: 00844005 addeq r4, r4, r5 + 1f39b7c: 01a0c001 moveq ip, r1 + 1f39b80: 0a000003 beq 1f39b94 + 1f39b84: e5931000 ldr r1, [r3] + 1f39b88: e1510000 cmp r1, r0 + 1f39b8c: 31a01000 movcc r1, r0 + 1f39b90: e5831000 str r1, [r3] + 1f39b94: e062000e rsb r0, r2, lr + 1f39b98: e0de10d1 ldrsb r1, [lr], #1 + 1f39b9c: e3510000 cmp r1, #0 + 1f39ba0: 1affffee bne 1f39b60 + 1f39ba4: e3560000 cmp r6, #0 + 1f39ba8: 15864000 strne r4, [r6] + 1f39bac: e8bd8070 pop {r4, r5, r6, pc} + 1f39bb0: e1d210d0 ldrsb r1, [r2] + 1f39bb4: e3510000 cmp r1, #0 + 1f39bb8: 11a04003 movne r4, r3 + 1f39bbc: 12823001 addne r3, r2, #1 + 1f39bc0: 0a000007 beq 1f39be4 + 1f39bc4: e351000a cmp r1, #10 + 1f39bc8: 1351000d cmpne r1, #13 + 1f39bcc: e0620003 rsb r0, r2, r3 + 1f39bd0: e0d310d1 ldrsb r1, [r3], #1 + 1f39bd4: 00844005 addeq r4, r4, r5 + 1f39bd8: e3510000 cmp r1, #0 + 1f39bdc: 1afffff8 bne 1f39bc4 + 1f39be0: eaffffef b 1f39ba4 + 1f39be4: e1a00001 mov r0, r1 + 1f39be8: e1a04001 mov r4, r1 + 1f39bec: eaffffec b 1f39ba4 + +01f39bf0 : + 1f39bf0: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f39bf4: e24dd00c sub sp, sp, #12 + 1f39bf8: e59db034 ldr fp, [sp, #52] ; 0x34 + 1f39bfc: e59da030 ldr sl, [sp, #48] ; 0x30 + 1f39c00: e35b0000 cmp fp, #0 + 1f39c04: da000020 ble 1f39c8c + 1f39c08: e1a07003 mov r7, r3 + 1f39c0c: e1a04000 mov r4, r0 + 1f39c10: e1a03002 mov r3, r2 + 1f39c14: e3a09000 mov r9, #0 + 1f39c18: e88d000a stm sp, {r1, r3} + 1f39c1c: e08bb007 add fp, fp, r7 + 1f39c20: e08a8002 add r8, sl, r2 + 1f39c24: e35a0000 cmp sl, #0 + 1f39c28: da000014 ble 1f39c80 + 1f39c2c: e59d3000 ldr r3, [sp] + 1f39c30: e59d5004 ldr r5, [sp, #4] + 1f39c34: e0836109 add r6, r3, r9, lsl #2 + 1f39c38: e5941014 ldr r1, [r4, #20] + 1f39c3c: e594c004 ldr ip, [r4, #4] + 1f39c40: e5943018 ldr r3, [r4, #24] + 1f39c44: e31c0001 tst ip, #1 + 1f39c48: e1a011a1 lsr r1, r1, #3 + 1f39c4c: e08400cc add r0, r4, ip, asr #1 + 1f39c50: e4962004 ldr r2, [r6], #4 + 1f39c54: e0030793 mul r3, r3, r7 + 1f39c58: e0213195 mla r1, r5, r1, r3 + 1f39c5c: 1794c0cc ldrne ip, [r4, ip, asr #1] + 1f39c60: e2855001 add r5, r5, #1 + 1f39c64: 15943000 ldrne r3, [r4] + 1f39c68: 05943000 ldreq r3, [r4] + 1f39c6c: 179c3003 ldrne r3, [ip, r3] + 1f39c70: e12fff33 blx r3 + 1f39c74: e1580005 cmp r8, r5 + 1f39c78: 1affffee bne 1f39c38 + 1f39c7c: e08a9009 add r9, sl, r9 + 1f39c80: e2877001 add r7, r7, #1 + 1f39c84: e157000b cmp r7, fp + 1f39c88: 1affffe5 bne 1f39c24 + 1f39c8c: e28dd00c add sp, sp, #12 + 1f39c90: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + +01f39c94 : + 1f39c94: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f39c98: f57ff05f dmb sy + 1f39c9c: e3a02a03 mov r2, #12288 ; 0x3000 + 1f39ca0: e3432f00 movt r2, #16128 ; 0x3f00 + 1f39ca4: e5923018 ldr r3, [r2, #24] + 1f39ca8: e2833c27 add r3, r3, #9984 ; 0x2700 + 1f39cac: e2833010 add r3, r3, #16 + 1f39cb0: e5823018 str r3, [r2, #24] + 1f39cb4: e5921004 ldr r1, [r2, #4] + 1f39cb8: e1530001 cmp r3, r1 + 1f39cbc: 35923004 ldrcc r3, [r2, #4] + 1f39cc0: 32833c27 addcc r3, r3, #9984 ; 0x2700 + 1f39cc4: 32833010 addcc r3, r3, #16 + 1f39cc8: 35823018 strcc r3, [r2, #24] + 1f39ccc: e3a03a03 mov r3, #12288 ; 0x3000 + 1f39cd0: e3433f00 movt r3, #16128 ; 0x3f00 + 1f39cd4: e3a02008 mov r2, #8 + 1f39cd8: e5832000 str r2, [r3] + 1f39cdc: f57ff05f dmb sy + 1f39ce0: e30a94b4 movw r9, #42164 ; 0xa4b4 + 1f39ce4: e340920d movt r9, #525 ; 0x20d + 1f39ce8: e30a6374 movw r6, #41844 ; 0xa374 + 1f39cec: e340620d movt r6, #525 ; 0x20d + 1f39cf0: e3a04001 mov r4, #1 + 1f39cf4: e1a07006 mov r7, r6 + 1f39cf8: e5993000 ldr r3, [r9] + 1f39cfc: e3a08000 mov r8, #0 + 1f39d00: e0833004 add r3, r3, r4 + 1f39d04: e5893000 str r3, [r9] + 1f39d08: ea000002 b 1f39d18 + 1f39d0c: e2844001 add r4, r4, #1 + 1f39d10: e3540015 cmp r4, #21 + 1f39d14: 0a000011 beq 1f39d60 + 1f39d18: e2442001 sub r2, r4, #1 + 1f39d1c: e087c202 add ip, r7, r2, lsl #4 + 1f39d20: e7965202 ldr r5, [r6, r2, lsl #4] + 1f39d24: e3550000 cmp r5, #0 + 1f39d28: 0afffff7 beq 1f39d0c + 1f39d2c: e59c3004 ldr r3, [ip, #4] + 1f39d30: e5991000 ldr r1, [r9] + 1f39d34: e0613003 rsb r3, r1, r3 + 1f39d38: e3530000 cmp r3, #0 + 1f39d3c: cafffff2 bgt 1f39d0c + 1f39d40: e7878202 str r8, [r7, r2, lsl #4] + 1f39d44: e1a00004 mov r0, r4 + 1f39d48: e2844001 add r4, r4, #1 + 1f39d4c: e59c1008 ldr r1, [ip, #8] + 1f39d50: e59c200c ldr r2, [ip, #12] + 1f39d54: e12fff35 blx r5 + 1f39d58: e3540015 cmp r4, #21 + 1f39d5c: 1affffed bne 1f39d18 + 1f39d60: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + +01f39d64 : + 1f39d64: e92d4010 push {r4, lr} + 1f39d68: e3a02000 mov r2, #0 + 1f39d6c: e3a00003 mov r0, #3 + 1f39d70: e3091c94 movw r1, #40084 ; 0x9c94 + 1f39d74: e34011f3 movt r1, #499 ; 0x1f3 + 1f39d78: ebff5fbf bl 1f11c7c + 1f39d7c: f57ff05f dmb sy + 1f39d80: e3a02a03 mov r2, #12288 ; 0x3000 + 1f39d84: e3432f00 movt r2, #16128 ; 0x3f00 + 1f39d88: e3a03df2 mov r3, #15488 ; 0x3c80 + 1f39d8c: e34f3e36 movt r3, #65078 ; 0xfe36 + 1f39d90: e5823004 str r3, [r2, #4] + 1f39d94: e5923004 ldr r3, [r2, #4] + 1f39d98: e2833c27 add r3, r3, #9984 ; 0x2700 + 1f39d9c: e2833010 add r3, r3, #16 + 1f39da0: e5823018 str r3, [r2, #24] + 1f39da4: f57ff05f dmb sy + 1f39da8: e3a03000 mov r3, #0 + 1f39dac: e30a2374 movw r2, #41844 ; 0xa374 + 1f39db0: e340220d movt r2, #525 ; 0x20d + 1f39db4: e1a01003 mov r1, r3 + 1f39db8: e7821203 str r1, [r2, r3, lsl #4] + 1f39dbc: e2833001 add r3, r3, #1 + 1f39dc0: e3530014 cmp r3, #20 + 1f39dc4: 1afffffb bne 1f39db8 + 1f39dc8: e8bd8010 pop {r4, pc} + +01f39dcc : + 1f39dcc: e92d4070 push {r4, r5, r6, lr} + 1f39dd0: e3a0c000 mov ip, #0 + 1f39dd4: e30a5374 movw r5, #41844 ; 0xa374 + 1f39dd8: e340520d movt r5, #525 ; 0x20d + 1f39ddc: e795420c ldr r4, [r5, ip, lsl #4] + 1f39de0: e30ae374 movw lr, #41844 ; 0xa374 + 1f39de4: e340e20d movt lr, #525 ; 0x20d + 1f39de8: e3540000 cmp r4, #0 + 1f39dec: 0a000008 beq 1f39e14 + 1f39df0: e28cc001 add ip, ip, #1 + 1f39df4: e35c0014 cmp ip, #20 + 1f39df8: 1afffff7 bne 1f39ddc + 1f39dfc: e3010450 movw r0, #5200 ; 0x1450 + 1f39e00: e34001f6 movt r0, #502 ; 0x1f6 + 1f39e04: eb0014d0 bl 1f3f14c + 1f39e08: e3a0c000 mov ip, #0 + 1f39e0c: e1a0000c mov r0, ip + 1f39e10: e8bd8070 pop {r4, r5, r6, pc} + 1f39e14: e30a54b4 movw r5, #42164 ; 0xa4b4 + 1f39e18: e340520d movt r5, #525 ; 0x20d + 1f39e1c: e08e420c add r4, lr, ip, lsl #4 + 1f39e20: e78e120c str r1, [lr, ip, lsl #4] + 1f39e24: e28cc001 add ip, ip, #1 + 1f39e28: e5951000 ldr r1, [r5] + 1f39e2c: e0800001 add r0, r0, r1 + 1f39e30: e5840004 str r0, [r4, #4] + 1f39e34: e5842008 str r2, [r4, #8] + 1f39e38: e1a0000c mov r0, ip + 1f39e3c: e584300c str r3, [r4, #12] + 1f39e40: e8bd8070 pop {r4, r5, r6, pc} + +01f39e44 : + 1f39e44: e2400001 sub r0, r0, #1 + 1f39e48: e30a3374 movw r3, #41844 ; 0xa374 + 1f39e4c: e340320d movt r3, #525 ; 0x20d + 1f39e50: e3a02000 mov r2, #0 + 1f39e54: e7832200 str r2, [r3, r0, lsl #4] + 1f39e58: e12fff1e bx lr + +01f39e5c : + 1f39e5c: e92d40f0 push {r4, r5, r6, r7, lr} + 1f39e60: e281101a add r1, r1, #26 + 1f39e64: e1a04000 mov r4, r0 + 1f39e68: e24ddf99 sub sp, sp, #612 ; 0x264 + 1f39e6c: e1a06002 mov r6, r2 + 1f39e70: e28d0018 add r0, sp, #24 + 1f39e74: e3a02001 mov r2, #1 + 1f39e78: e1a07003 mov r7, r3 + 1f39e7c: ebff4ba4 bl 1f0cd14 + 1f39e80: e2505000 subs r5, r0, #0 + 1f39e84: 0a000001 beq 1f39e90 + 1f39e88: e28ddf99 add sp, sp, #612 ; 0x264 + 1f39e8c: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f39e90: e2844054 add r4, r4, #84 ; 0x54 + 1f39e94: e3a00001 mov r0, #1 + 1f39e98: ebff2a9e bl 1f04918 + 1f39e9c: e1a01004 mov r1, r4 + 1f39ea0: e28d3008 add r3, sp, #8 + 1f39ea4: e3a02801 mov r2, #65536 ; 0x10000 + 1f39ea8: e28d0018 add r0, sp, #24 + 1f39eac: ebff4db5 bl 1f0d588 + 1f39eb0: e1a00005 mov r0, r5 + 1f39eb4: ebff2a97 bl 1f04918 + 1f39eb8: e28d0018 add r0, sp, #24 + 1f39ebc: ebff53b9 bl 1f0eda8 + 1f39ec0: e3a03004 mov r3, #4 + 1f39ec4: e28d2014 add r2, sp, #20 + 1f39ec8: e58d3004 str r3, [sp, #4] + 1f39ecc: e58d2000 str r2, [sp] + 1f39ed0: e1a00004 mov r0, r4 + 1f39ed4: e59d1008 ldr r1, [sp, #8] + 1f39ed8: e28d3010 add r3, sp, #16 + 1f39edc: e28d200c add r2, sp, #12 + 1f39ee0: ebfff8ba bl 1f381d0 + 1f39ee4: e3500000 cmp r0, #0 + 1f39ee8: 0affffe6 beq 1f39e88 + 1f39eec: e59d200c ldr r2, [sp, #12] + 1f39ef0: e3520d05 cmp r2, #320 ; 0x140 + 1f39ef4: 1affffe3 bne 1f39e88 + 1f39ef8: e59d3010 ldr r3, [sp, #16] + 1f39efc: e35300c8 cmp r3, #200 ; 0xc8 + 1f39f00: 1affffe0 bne 1f39e88 + 1f39f04: e58d3004 str r3, [sp, #4] + 1f39f08: e1a01000 mov r1, r0 + 1f39f0c: e58d2000 str r2, [sp] + 1f39f10: e1a03007 mov r3, r7 + 1f39f14: e1a02006 mov r2, r6 + 1f39f18: e30907a4 movw r0, #38820 ; 0x97a4 + 1f39f1c: e34001fa movt r0, #506 ; 0x1fa + 1f39f20: ebffff32 bl 1f39bf0 + 1f39f24: eaffffd7 b 1f39e88 + +01f39f28 : + 1f39f28: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f39f2c: e3a02001 mov r2, #1 + 1f39f30: e1a06000 mov r6, r0 + 1f39f34: e24ddf95 sub sp, sp, #596 ; 0x254 + 1f39f38: e28d0008 add r0, sp, #8 + 1f39f3c: ebff4b74 bl 1f0cd14 + 1f39f40: e2508000 subs r8, r0, #0 + 1f39f44: 13a08000 movne r8, #0 + 1f39f48: 0a000002 beq 1f39f58 + 1f39f4c: e1a00008 mov r0, r8 + 1f39f50: e28ddf95 add sp, sp, #596 ; 0x254 + 1f39f54: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f39f58: e3a00001 mov r0, #1 + 1f39f5c: e30a44b8 movw r4, #42168 ; 0xa4b8 + 1f39f60: e340420d movt r4, #525 ; 0x20d + 1f39f64: ebff2a6b bl 1f04918 + 1f39f68: e28d9e25 add r9, sp, #592 ; 0x250 + 1f39f6c: e1a01004 mov r1, r4 + 1f39f70: e1a0300d mov r3, sp + 1f39f74: e3a02a02 mov r2, #8192 ; 0x2000 + 1f39f78: e28d0008 add r0, sp, #8 + 1f39f7c: ebff4d81 bl 1f0d588 + 1f39f80: e1a00008 mov r0, r8 + 1f39f84: ebff2a63 bl 1f04918 + 1f39f88: e28d0008 add r0, sp, #8 + 1f39f8c: ebff5385 bl 1f0eda8 + 1f39f90: e529424c str r4, [r9, #-588]! ; 0xfffffdb4 + 1f39f94: e3a01001 mov r1, #1 + 1f39f98: e1a00009 mov r0, r9 + 1f39f9c: ebffb26c bl 1f26954 + 1f39fa0: e2507000 subs r7, r0, #0 + 1f39fa4: 0a000032 beq 1f3a074 + 1f39fa8: e308ae39 movw sl, #36409 ; 0x8e39 + 1f39fac: e343a8e3 movt sl, #14563 ; 0x38e3 + 1f39fb0: e1a00007 mov r0, r7 + 1f39fb4: ebff63a3 bl 1f12e48 + 1f39fb8: e2400001 sub r0, r0, #1 + 1f39fbc: e6ef0070 uxtb r0, r0 + 1f39fc0: e3500003 cmp r0, #3 + 1f39fc4: 8a00001f bhi 1f3a048 + 1f39fc8: e9960810 ldmib r6, {r4, fp} + 1f39fcc: e064b00b rsb fp, r4, fp + 1f39fd0: e1a0334b asr r3, fp, #6 + 1f39fd4: e003039a mul r3, sl, r3 + 1f39fd8: e3530000 cmp r3, #0 + 1f39fdc: da000013 ble 1f3a030 + 1f39fe0: e3a05000 mov r5, #0 + 1f39fe4: ea000002 b 1f39ff4 + 1f39fe8: e155000b cmp r5, fp + 1f39fec: 0a00000f beq 1f3a030 + 1f39ff0: e5964004 ldr r4, [r6, #4] + 1f39ff4: e0844005 add r4, r4, r5 + 1f39ff8: e2855d09 add r5, r5, #576 ; 0x240 + 1f39ffc: e5d4300c ldrb r3, [r4, #12] + 1f3a000: e3130010 tst r3, #16 + 1f3a004: 1afffff7 bne 1f39fe8 + 1f3a008: e284101a add r1, r4, #26 + 1f3a00c: e1a00007 mov r0, r7 + 1f3a010: eb0016e1 bl 1f3fb9c + 1f3a014: e3500000 cmp r0, #0 + 1f3a018: 1afffff2 bne 1f39fe8 + 1f3a01c: e3540000 cmp r4, #0 + 1f3a020: 0a000002 beq 1f3a030 + 1f3a024: e5d4200c ldrb r2, [r4, #12] + 1f3a028: e3120010 tst r2, #16 + 1f3a02c: 0a000009 beq 1f3a058 + 1f3a030: e3a01001 mov r1, #1 + 1f3a034: e1a00009 mov r0, r9 + 1f3a038: ebffb245 bl 1f26954 + 1f3a03c: e2507000 subs r7, r0, #0 + 1f3a040: 1affffda bne 1f39fb0 + 1f3a044: eaffffc0 b 1f39f4c + 1f3a048: e1a01007 mov r1, r7 + 1f3a04c: e5960030 ldr r0, [r6, #48] ; 0x30 + 1f3a050: eb000da6 bl 1f3d6f0 + 1f3a054: eafffff5 b 1f3a030 + 1f3a058: e2022001 and r2, r2, #1 + 1f3a05c: e1a01004 mov r1, r4 + 1f3a060: e5960024 ldr r0, [r6, #36] ; 0x24 + 1f3a064: eb000d26 bl 1f3d504 + 1f3a068: e3500000 cmp r0, #0 + 1f3a06c: 13a08001 movne r8, #1 + 1f3a070: eaffffee b 1f3a030 + 1f3a074: e1a08007 mov r8, r7 + 1f3a078: eaffffb3 b 1f39f4c + +01f3a07c : + 1f3a07c: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f3a080: e8900110 ldm r0, {r4, r8} + 1f3a084: e3083e39 movw r3, #36409 ; 0x8e39 + 1f3a088: e34338e3 movt r3, #14563 ; 0x38e3 + 1f3a08c: e0648008 rsb r8, r4, r8 + 1f3a090: e1a02348 asr r2, r8, #6 + 1f3a094: e0030293 mul r3, r3, r2 + 1f3a098: e3530000 cmp r3, #0 + 1f3a09c: da000012 ble 1f3a0ec + 1f3a0a0: e1a07001 mov r7, r1 + 1f3a0a4: e1a06000 mov r6, r0 + 1f3a0a8: e3a05000 mov r5, #0 + 1f3a0ac: ea000002 b 1f3a0bc + 1f3a0b0: e1550008 cmp r5, r8 + 1f3a0b4: 0a00000c beq 1f3a0ec + 1f3a0b8: e5964000 ldr r4, [r6] + 1f3a0bc: e0844005 add r4, r4, r5 + 1f3a0c0: e2855d09 add r5, r5, #576 ; 0x240 + 1f3a0c4: e5d4300c ldrb r3, [r4, #12] + 1f3a0c8: e3130010 tst r3, #16 + 1f3a0cc: 1afffff7 bne 1f3a0b0 + 1f3a0d0: e284101a add r1, r4, #26 + 1f3a0d4: e1a00007 mov r0, r7 + 1f3a0d8: eb0016af bl 1f3fb9c + 1f3a0dc: e3500000 cmp r0, #0 + 1f3a0e0: 1afffff2 bne 1f3a0b0 + 1f3a0e4: e1a00004 mov r0, r4 + 1f3a0e8: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f3a0ec: e3a00000 mov r0, #0 + 1f3a0f0: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f3a0f4 : + 1f3a0f4: e92d4070 push {r4, r5, r6, lr} + 1f3a0f8: f2c00050 vmov.i32 q8, #0 ; 0x00000000 + 1f3a0fc: e1a04000 mov r4, r0 + 1f3a100: e3a0e000 mov lr, #0 + 1f3a104: e280503c add r5, r0, #60 ; 0x3c + 1f3a108: e5dd6010 ldrb r6, [sp, #16] + 1f3a10c: e4c4e004 strb lr, [r4], #4 + 1f3a110: f4440a8f vst1.32 {d16-d17}, [r4] + 1f3a114: e5801024 str r1, [r0, #36] ; 0x24 + 1f3a118: e580e014 str lr, [r0, #20] + 1f3a11c: e3a01026 mov r1, #38 ; 0x26 + 1f3a120: e580e018 str lr, [r0, #24] + 1f3a124: e580e01c str lr, [r0, #28] + 1f3a128: e5c0e028 strb lr, [r0, #40] ; 0x28 + 1f3a12c: e5802030 str r2, [r0, #48] ; 0x30 + 1f3a130: e5803034 str r3, [r0, #52] ; 0x34 + 1f3a134: e5801020 str r1, [r0, #32] + 1f3a138: e5c06038 strb r6, [r0, #56] ; 0x38 + 1f3a13c: f4450a8f vst1.32 {d16-d17}, [r5] + 1f3a140: e580e04c str lr, [r0, #76] ; 0x4c + 1f3a144: e580e050 str lr, [r0, #80] ; 0x50 + 1f3a148: e8bd8070 pop {r4, r5, r6, pc} + +01f3a14c : + 1f3a14c: e200000f and r0, r0, #15 + 1f3a150: e30135f0 movw r3, #5616 ; 0x15f0 + 1f3a154: e34031f6 movt r3, #502 ; 0x1f6 + 1f3a158: e7930100 ldr r0, [r3, r0, lsl #2] + 1f3a15c: e12fff1e bx lr + +01f3a160 : + 1f3a160: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f3a164: e1a0a000 mov sl, r0 + 1f3a168: e1a08001 mov r8, r1 + 1f3a16c: e24ddf4b sub sp, sp, #300 ; 0x12c + 1f3a170: e3a01000 mov r1, #0 + 1f3a174: e28d9028 add r9, sp, #40 ; 0x28 + 1f3a178: e1a00009 mov r0, r9 + 1f3a17c: e58d201c str r2, [sp, #28] + 1f3a180: e3a02080 mov r2, #128 ; 0x80 + 1f3a184: e58d3020 str r3, [sp, #32] + 1f3a188: eb0013a3 bl 1f3f01c + 1f3a18c: e28d00a8 add r0, sp, #168 ; 0xa8 + 1f3a190: e3a02080 mov r2, #128 ; 0x80 + 1f3a194: e3a01000 mov r1, #0 + 1f3a198: eb00139f bl 1f3f01c + 1f3a19c: e59a3020 ldr r3, [sl, #32] + 1f3a1a0: e3530000 cmp r3, #0 + 1f3a1a4: 0a00005c beq 1f3a31c + 1f3a1a8: e308be39 movw fp, #36409 ; 0x8e39 + 1f3a1ac: e343b8e3 movt fp, #14563 ; 0x38e3 + 1f3a1b0: e3063978 movw r3, #27000 ; 0x6978 + 1f3a1b4: e34f3fc4 movt r3, #65476 ; 0xffc4 + 1f3a1b8: e3a07000 mov r7, #0 + 1f3a1bc: e58d3024 str r3, [sp, #36] ; 0x24 + 1f3a1c0: ea000034 b 1f3a298 + 1f3a1c4: e1a06485 lsl r6, r5, #9 + 1f3a1c8: e3a01051 mov r1, #81 ; 0x51 + 1f3a1cc: e0866305 add r6, r6, r5, lsl #6 + 1f3a1d0: e3012518 movw r2, #5400 ; 0x1518 + 1f3a1d4: e34021f6 movt r2, #502 ; 0x1f6 + 1f3a1d8: e0806006 add r6, r0, r6 + 1f3a1dc: e28d00a8 add r0, sp, #168 ; 0xa8 + 1f3a1e0: e286301a add r3, r6, #26 + 1f3a1e4: eb0015fc bl 1f3f9dc + 1f3a1e8: e3a02050 mov r2, #80 ; 0x50 + 1f3a1ec: e3a01020 mov r1, #32 + 1f3a1f0: e1a00009 mov r0, r9 + 1f3a1f4: eb001388 bl 1f3f01c + 1f3a1f8: e28d00a8 add r0, sp, #168 ; 0xa8 + 1f3a1fc: e3a03000 mov r3, #0 + 1f3a200: e5cd30a7 strb r3, [sp, #167] ; 0xa7 + 1f3a204: eb0017c1 bl 1f40110 + 1f3a208: e28d10a8 add r1, sp, #168 ; 0xa8 + 1f3a20c: e1a02000 mov r2, r0 + 1f3a210: e1a00009 mov r0, r9 + 1f3a214: eb0017fa bl 1f40204 + 1f3a218: e59d3020 ldr r3, [sp, #32] + 1f3a21c: e3530000 cmp r3, #0 + 1f3a220: 0a000002 beq 1f3a230 + 1f3a224: e5983010 ldr r3, [r8, #16] + 1f3a228: e1550003 cmp r5, r3 + 1f3a22c: 0a000047 beq 1f3a350 + 1f3a230: e5d6300c ldrb r3, [r6, #12] + 1f3a234: e2031010 and r1, r3, #16 + 1f3a238: e21110ff ands r1, r1, #255 ; 0xff + 1f3a23c: 1a000038 bne 1f3a324 + 1f3a240: e3130001 tst r3, #1 + 1f3a244: e30609b8 movw r0, #27064 ; 0x69b8 + 1f3a248: e34f0f62 movt r0, #65378 ; 0xff62 + 1f3a24c: e3092f9f movw r2, #40863 ; 0x9f9f + 1f3a250: e34f2f9f movt r2, #65439 ; 0xff9f + 1f3a254: e58d1014 str r1, [sp, #20] + 1f3a258: 11a02000 movne r2, r0 + 1f3a25c: e1a03004 mov r3, r4 + 1f3a260: e58d1010 str r1, [sp, #16] + 1f3a264: e58d100c str r1, [sp, #12] + 1f3a268: e3a0c4ff mov ip, #-16777216 ; 0xff000000 + 1f3a26c: e58d9000 str r9, [sp] + 1f3a270: e58d2004 str r2, [sp, #4] + 1f3a274: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3a278: e34001fa movt r0, #506 ; 0x1fa + 1f3a27c: e58dc008 str ip, [sp, #8] + 1f3a280: e59d201c ldr r2, [sp, #28] + 1f3a284: ebfffda4 bl 1f3991c + 1f3a288: e59a3020 ldr r3, [sl, #32] + 1f3a28c: e2877001 add r7, r7, #1 + 1f3a290: e1530007 cmp r3, r7 + 1f3a294: 9a000020 bls 1f3a31c + 1f3a298: e5980000 ldr r0, [r8] + 1f3a29c: e1a04207 lsl r4, r7, #4 + 1f3a2a0: e5983004 ldr r3, [r8, #4] + 1f3a2a4: e2844011 add r4, r4, #17 + 1f3a2a8: e5985014 ldr r5, [r8, #20] + 1f3a2ac: e0603003 rsb r3, r0, r3 + 1f3a2b0: e0875005 add r5, r7, r5 + 1f3a2b4: e1a03343 asr r3, r3, #6 + 1f3a2b8: e003039b mul r3, fp, r3 + 1f3a2bc: e1550003 cmp r5, r3 + 1f3a2c0: 3affffbf bcc 1f3a1c4 + 1f3a2c4: e3a02050 mov r2, #80 ; 0x50 + 1f3a2c8: e3a01020 mov r1, #32 + 1f3a2cc: e1a00009 mov r0, r9 + 1f3a2d0: e2877001 add r7, r7, #1 + 1f3a2d4: eb001350 bl 1f3f01c + 1f3a2d8: e3a02000 mov r2, #0 + 1f3a2dc: e3a0c4ff mov ip, #-16777216 ; 0xff000000 + 1f3a2e0: e1a03004 mov r3, r4 + 1f3a2e4: e58d2014 str r2, [sp, #20] + 1f3a2e8: e1a01002 mov r1, r2 + 1f3a2ec: e58d2010 str r2, [sp, #16] + 1f3a2f0: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3a2f4: e34001fa movt r0, #506 ; 0x1fa + 1f3a2f8: e58d200c str r2, [sp, #12] + 1f3a2fc: e58d9000 str r9, [sp] + 1f3a300: e58dc008 str ip, [sp, #8] + 1f3a304: e59d201c ldr r2, [sp, #28] + 1f3a308: e58dc004 str ip, [sp, #4] + 1f3a30c: ebfffd82 bl 1f3991c + 1f3a310: e59a3020 ldr r3, [sl, #32] + 1f3a314: e1530007 cmp r3, r7 + 1f3a318: 8affffde bhi 1f3a298 + 1f3a31c: e28ddf4b add sp, sp, #300 ; 0x12c + 1f3a320: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f3a324: e3a02000 mov r2, #0 + 1f3a328: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f3a32c: e58d3004 str r3, [sp, #4] + 1f3a330: e1a01002 mov r1, r2 + 1f3a334: e58d9000 str r9, [sp] + 1f3a338: e1a03004 mov r3, r4 + 1f3a33c: e58d2014 str r2, [sp, #20] + 1f3a340: e3a0c4ff mov ip, #-16777216 ; 0xff000000 + 1f3a344: e58d2010 str r2, [sp, #16] + 1f3a348: e58d200c str r2, [sp, #12] + 1f3a34c: eaffffc8 b 1f3a274 + 1f3a350: e5d6300c ldrb r3, [r6, #12] + 1f3a354: e2031010 and r1, r3, #16 + 1f3a358: e21110ff ands r1, r1, #255 ; 0xff + 1f3a35c: 1a00000d bne 1f3a398 + 1f3a360: e3130001 tst r3, #1 + 1f3a364: e3030988 movw r0, #14728 ; 0x3988 + 1f3a368: e34f0f32 movt r0, #65330 ; 0xff32 + 1f3a36c: e3a020ff mov r2, #255 ; 0xff + 1f3a370: e34f2f00 movt r2, #65280 ; 0xff00 + 1f3a374: e58d1014 str r1, [sp, #20] + 1f3a378: 11a02000 movne r2, r0 + 1f3a37c: e1a03004 mov r3, r4 + 1f3a380: e58d1010 str r1, [sp, #16] + 1f3a384: e58d100c str r1, [sp, #12] + 1f3a388: e3e0c000 mvn ip, #0 + 1f3a38c: e58d9000 str r9, [sp] + 1f3a390: e58d2004 str r2, [sp, #4] + 1f3a394: eaffffb6 b 1f3a274 + 1f3a398: e3a02000 mov r2, #0 + 1f3a39c: e58d2010 str r2, [sp, #16] + 1f3a3a0: e1a01002 mov r1, r2 + 1f3a3a4: e58d200c str r2, [sp, #12] + 1f3a3a8: e59d2024 ldr r2, [sp, #36] ; 0x24 + 1f3a3ac: e3a03000 mov r3, #0 + 1f3a3b0: e3e0c000 mvn ip, #0 + 1f3a3b4: e58d3014 str r3, [sp, #20] + 1f3a3b8: e58d2004 str r2, [sp, #4] + 1f3a3bc: e1a03004 mov r3, r4 + 1f3a3c0: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3a3c4: e34001fa movt r0, #506 ; 0x1fa + 1f3a3c8: e58d9000 str r9, [sp] + 1f3a3cc: e59d201c ldr r2, [sp, #28] + 1f3a3d0: e58dc008 str ip, [sp, #8] + 1f3a3d4: ebfffd50 bl 1f3991c + 1f3a3d8: eaffffaa b 1f3a288 + +01f3a3dc : + 1f3a3dc: e92d40f0 push {r4, r5, r6, r7, lr} + 1f3a3e0: e3a01b01 mov r1, #1024 ; 0x400 + 1f3a3e4: e1a04000 mov r4, r0 + 1f3a3e8: e24dde67 sub sp, sp, #1648 ; 0x670 + 1f3a3ec: e24dd004 sub sp, sp, #4 + 1f3a3f0: e28d0e27 add r0, sp, #624 ; 0x270 + 1f3a3f4: ebff53da bl 1f0f364 + 1f3a3f8: e2505000 subs r5, r0, #0 + 1f3a3fc: 0a00005f beq 1f3a580 + 1f3a400: e3a03001 mov r3, #1 + 1f3a404: e3a02000 mov r2, #0 + 1f3a408: e2841004 add r1, r4, #4 + 1f3a40c: e1a00004 mov r0, r4 + 1f3a410: ebffff52 bl 1f3a160 + 1f3a414: e3a03000 mov r3, #0 + 1f3a418: e3a02d0b mov r2, #704 ; 0x2c0 + 1f3a41c: e284103c add r1, r4, #60 ; 0x3c + 1f3a420: e1a00004 mov r0, r4 + 1f3a424: ebffff4d bl 1f3a160 + 1f3a428: e5d43038 ldrb r3, [r4, #56] ; 0x38 + 1f3a42c: e3530000 cmp r3, #0 + 1f3a430: 1a000017 bne 1f3a494 + 1f3a434: e28d5028 add r5, sp, #40 ; 0x28 + 1f3a438: e3a01c01 mov r1, #256 ; 0x100 + 1f3a43c: e1a00005 mov r0, r5 + 1f3a440: e301251c movw r2, #5404 ; 0x151c + 1f3a444: e34021f6 movt r2, #502 ; 0x1f6 + 1f3a448: eb001563 bl 1f3f9dc + 1f3a44c: e3a03000 mov r3, #0 + 1f3a450: e1a02003 mov r2, r3 + 1f3a454: e58d3014 str r3, [sp, #20] + 1f3a458: e1a01003 mov r1, r3 + 1f3a45c: e58d3010 str r3, [sp, #16] + 1f3a460: e58d300c str r3, [sp, #12] + 1f3a464: e3e00000 mvn r0, #0 + 1f3a468: e58d5000 str r5, [sp] + 1f3a46c: e3a034ff mov r3, #-16777216 ; 0xff000000 + 1f3a470: e58d0008 str r0, [sp, #8] + 1f3a474: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3a478: e34001fa movt r0, #506 ; 0x1fa + 1f3a47c: e58d3004 str r3, [sp, #4] + 1f3a480: e300328a movw r3, #650 ; 0x28a + 1f3a484: ebfffd24 bl 1f3991c + 1f3a488: e28dde67 add sp, sp, #1648 ; 0x670 + 1f3a48c: e28dd004 add sp, sp, #4 + 1f3a490: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f3a494: e5941010 ldr r1, [r4, #16] + 1f3a498: e3510000 cmp r1, #0 + 1f3a49c: 0affffe4 beq 1f3a434 + 1f3a4a0: e5d1313a ldrb r3, [r1, #314] ; 0x13a + 1f3a4a4: e3530000 cmp r3, #0 + 1f3a4a8: 0affffe1 beq 1f3a434 + 1f3a4ac: e2813e12 add r3, r1, #288 ; 0x120 + 1f3a4b0: e1c320d0 ldrd r2, [r3] + 1f3a4b4: e3a07000 mov r7, #0 + 1f3a4b8: e30f6fff movw r6, #65535 ; 0xffff + 1f3a4bc: e1530007 cmp r3, r7 + 1f3a4c0: 01520006 cmpeq r2, r6 + 1f3a4c4: 8affffda bhi 1f3a434 + 1f3a4c8: e2811f4e add r1, r1, #312 ; 0x138 + 1f3a4cc: e28d5028 add r5, sp, #40 ; 0x28 + 1f3a4d0: e2811002 add r1, r1, #2 + 1f3a4d4: e1a00005 mov r0, r5 + 1f3a4d8: e3a02001 mov r2, #1 + 1f3a4dc: ebff4a0c bl 1f0cd14 + 1f3a4e0: e2506000 subs r6, r0, #0 + 1f3a4e4: 1affffd3 bne 1f3a438 + 1f3a4e8: e2844054 add r4, r4, #84 ; 0x54 + 1f3a4ec: e3a00001 mov r0, #1 + 1f3a4f0: ebff2908 bl 1f04918 + 1f3a4f4: e1a01004 mov r1, r4 + 1f3a4f8: e28d3018 add r3, sp, #24 + 1f3a4fc: e3a02801 mov r2, #65536 ; 0x10000 + 1f3a500: e1a00005 mov r0, r5 + 1f3a504: ebff4c1f bl 1f0d588 + 1f3a508: e1a00006 mov r0, r6 + 1f3a50c: ebff2901 bl 1f04918 + 1f3a510: e1a00005 mov r0, r5 + 1f3a514: ebff5223 bl 1f0eda8 + 1f3a518: e28d3020 add r3, sp, #32 + 1f3a51c: e28d2024 add r2, sp, #36 ; 0x24 + 1f3a520: e3a0c004 mov ip, #4 + 1f3a524: e58d2000 str r2, [sp] + 1f3a528: e1a00004 mov r0, r4 + 1f3a52c: e59d1018 ldr r1, [sp, #24] + 1f3a530: e2432004 sub r2, r3, #4 + 1f3a534: e58dc004 str ip, [sp, #4] + 1f3a538: ebfff724 bl 1f381d0 + 1f3a53c: e3500000 cmp r0, #0 + 1f3a540: 0affffbc beq 1f3a438 + 1f3a544: e59d301c ldr r3, [sp, #28] + 1f3a548: e3530d05 cmp r3, #320 ; 0x140 + 1f3a54c: 1affffb9 bne 1f3a438 + 1f3a550: e59d2020 ldr r2, [sp, #32] + 1f3a554: e35200c8 cmp r2, #200 ; 0xc8 + 1f3a558: 1affffb6 bne 1f3a438 + 1f3a55c: e58d2004 str r2, [sp, #4] + 1f3a560: e1a01000 mov r1, r0 + 1f3a564: e58d3000 str r3, [sp] + 1f3a568: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3a56c: e34001fa movt r0, #506 ; 0x1fa + 1f3a570: e30031aa movw r3, #426 ; 0x1aa + 1f3a574: e3a02d0b mov r2, #704 ; 0x2c0 + 1f3a578: ebfffd9c bl 1f39bf0 + 1f3a57c: eaffffad b 1f3a438 + 1f3a580: e30967a4 movw r6, #38820 ; 0x97a4 + 1f3a584: e34061fa movt r6, #506 ; 0x1fa + 1f3a588: e3077878 movw r7, #30840 ; 0x7878 + 1f3a58c: e34f7f78 movt r7, #65400 ; 0xff78 + 1f3a590: e58d7004 str r7, [sp, #4] + 1f3a594: e1a00006 mov r0, r6 + 1f3a598: e1a02005 mov r2, r5 + 1f3a59c: e3a01011 mov r1, #17 + 1f3a5a0: e596300c ldr r3, [r6, #12] + 1f3a5a4: e58d1000 str r1, [sp] + 1f3a5a8: e1a01005 mov r1, r5 + 1f3a5ac: ebfffbf7 bl 1f39590 + 1f3a5b0: e28d2e27 add r2, sp, #624 ; 0x270 + 1f3a5b4: e58d7008 str r7, [sp, #8] + 1f3a5b8: e1a00006 mov r0, r6 + 1f3a5bc: e58d2000 str r2, [sp] + 1f3a5c0: e30e3094 movw r3, #57492 ; 0xe094 + 1f3a5c4: e34f3f89 movt r3, #65417 ; 0xff89 + 1f3a5c8: e58d3004 str r3, [sp, #4] + 1f3a5cc: e58d5014 str r5, [sp, #20] + 1f3a5d0: e1a03005 mov r3, r5 + 1f3a5d4: e58d5010 str r5, [sp, #16] + 1f3a5d8: e1a02005 mov r2, r5 + 1f3a5dc: e58d500c str r5, [sp, #12] + 1f3a5e0: e1a01005 mov r1, r5 + 1f3a5e4: ebfffccc bl 1f3991c + 1f3a5e8: eaffff84 b 1f3a400 + +01f3a5ec : + 1f3a5ec: e92d40f0 push {r4, r5, r6, r7, lr} + 1f3a5f0: e1a00001 mov r0, r1 + 1f3a5f4: e3a06000 mov r6, #0 + 1f3a5f8: e24ddf41 sub sp, sp, #260 ; 0x104 + 1f3a5fc: e5c2601a strb r6, [r2, #26] + 1f3a600: e1a05002 mov r5, r2 + 1f3a604: e1a04001 mov r4, r1 + 1f3a608: ebff6257 bl 1f12f6c + 1f3a60c: e3500000 cmp r0, #0 + 1f3a610: 1a000001 bne 1f3a61c + 1f3a614: e28ddf41 add sp, sp, #260 ; 0x104 + 1f3a618: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f3a61c: e3a0102e mov r1, #46 ; 0x2e + 1f3a620: e1a00004 mov r0, r4 + 1f3a624: eb00172f bl 1f402e8 + 1f3a628: e3500000 cmp r0, #0 + 1f3a62c: 0a000019 beq 1f3a698 + 1f3a630: e0647000 rsb r7, r4, r0 + 1f3a634: e1a01004 mov r1, r4 + 1f3a638: e1a02007 mov r2, r7 + 1f3a63c: e1a0000d mov r0, sp + 1f3a640: eb0016ef bl 1f40204 + 1f3a644: e28d3c01 add r3, sp, #256 ; 0x100 + 1f3a648: e0837007 add r7, r3, r7 + 1f3a64c: e1a0000d mov r0, sp + 1f3a650: e30f13c8 movw r1, #62408 ; 0xf3c8 + 1f3a654: e34011f5 movt r1, #501 ; 0x1f5 + 1f3a658: e5476100 strb r6, [r7, #-256] ; 0xffffff00 + 1f3a65c: eb00156b bl 1f3fc10 + 1f3a660: e1a01005 mov r1, r5 + 1f3a664: e1a0000d mov r0, sp + 1f3a668: ebff56e1 bl 1f101f4 + 1f3a66c: e3500000 cmp r0, #0 + 1f3a670: 1a000008 bne 1f3a698 + 1f3a674: e1c500d0 ldrd r0, [r5] + 1f3a678: e3a03000 mov r3, #0 + 1f3a67c: e30f2fff movw r2, #65535 ; 0xffff + 1f3a680: e1510003 cmp r1, r3 + 1f3a684: 01500002 cmpeq r0, r2 + 1f3a688: 93a00001 movls r0, #1 + 1f3a68c: 83a00000 movhi r0, #0 + 1f3a690: e28ddf41 add sp, sp, #260 ; 0x104 + 1f3a694: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f3a698: e3a00000 mov r0, #0 + 1f3a69c: e28ddf41 add sp, sp, #260 ; 0x104 + 1f3a6a0: e8bd80f0 pop {r4, r5, r6, r7, pc} + +01f3a6a4 : + 1f3a6a4: e92d40f0 push {r4, r5, r6, r7, lr} + 1f3a6a8: e1d1e1da ldrsb lr, [r1, #26] + 1f3a6ac: e35e0000 cmp lr, #0 + 1f3a6b0: 08bd80f0 popeq {r4, r5, r6, r7, pc} + 1f3a6b4: e1c160d0 ldrd r6, [r1] + 1f3a6b8: e3a05000 mov r5, #0 + 1f3a6bc: e30f4fff movw r4, #65535 ; 0xffff + 1f3a6c0: e1570005 cmp r7, r5 + 1f3a6c4: 01560004 cmpeq r6, r4 + 1f3a6c8: 88bd80f0 pophi {r4, r5, r6, r7, pc} + 1f3a6cc: e8bd40f0 pop {r4, r5, r6, r7, lr} + 1f3a6d0: eafffde1 b 1f39e5c + +01f3a6d4 : + 1f3a6d4: e5d02038 ldrb r2, [r0, #56] ; 0x38 + 1f3a6d8: e3520000 cmp r2, #0 + 1f3a6dc: 012fff1e bxeq lr + 1f3a6e0: e5901010 ldr r1, [r0, #16] + 1f3a6e4: e3510000 cmp r1, #0 + 1f3a6e8: 012fff1e bxeq lr + 1f3a6ec: e5d1313a ldrb r3, [r1, #314] ; 0x13a + 1f3a6f0: e3530000 cmp r3, #0 + 1f3a6f4: 012fff1e bxeq lr + 1f3a6f8: e2813e12 add r3, r1, #288 ; 0x120 + 1f3a6fc: e1c320d0 ldrd r2, [r3] + 1f3a700: e92d0030 push {r4, r5} + 1f3a704: e3a05000 mov r5, #0 + 1f3a708: e30f4fff movw r4, #65535 ; 0xffff + 1f3a70c: e1530005 cmp r3, r5 + 1f3a710: 01520004 cmpeq r2, r4 + 1f3a714: 9a000001 bls 1f3a720 + 1f3a718: e8bd0030 pop {r4, r5} + 1f3a71c: e12fff1e bx lr + 1f3a720: e2811e12 add r1, r1, #288 ; 0x120 + 1f3a724: e30031aa movw r3, #426 ; 0x1aa + 1f3a728: e3a02d0b mov r2, #704 ; 0x2c0 + 1f3a72c: e8bd0030 pop {r4, r5} + 1f3a730: eafffdc9 b 1f39e5c + +01f3a734 : + 1f3a734: e2800004 add r0, r0, #4 + 1f3a738: e12fff1e bx lr + +01f3a73c : + 1f3a73c: e92d4070 push {r4, r5, r6, lr} + 1f3a740: e5903040 ldr r3, [r0, #64] ; 0x40 + 1f3a744: e3086e39 movw r6, #36409 ; 0x8e39 + 1f3a748: e34368e3 movt r6, #14563 ; 0x38e3 + 1f3a74c: e590403c ldr r4, [r0, #60] ; 0x3c + 1f3a750: e0642003 rsb r2, r4, r3 + 1f3a754: e1a02342 asr r2, r2, #6 + 1f3a758: e0020296 mul r2, r6, r2 + 1f3a75c: e3520000 cmp r2, #0 + 1f3a760: 0a00001f beq 1f3a7e4 + 1f3a764: e1a05000 mov r5, r0 + 1f3a768: e1530004 cmp r3, r4 + 1f3a76c: e1a01004 mov r1, r4 + 1f3a770: 0a000015 beq 1f3a7cc + 1f3a774: e5d4200c ldrb r2, [r4, #12] + 1f3a778: e5950024 ldr r0, [r5, #36] ; 0x24 + 1f3a77c: e2022001 and r2, r2, #1 + 1f3a780: eb000b5f bl 1f3d504 + 1f3a784: e3500000 cmp r0, #0 + 1f3a788: 12844d09 addne r4, r4, #576 ; 0x240 + 1f3a78c: 15953040 ldrne r3, [r5, #64] ; 0x40 + 1f3a790: 1afffff4 bne 1f3a768 + 1f3a794: e5953040 ldr r3, [r5, #64] ; 0x40 + 1f3a798: e2841d09 add r1, r4, #576 ; 0x240 + 1f3a79c: e0612003 rsb r2, r1, r3 + 1f3a7a0: e1510003 cmp r1, r3 + 1f3a7a4: e1a00342 asr r0, r2, #6 + 1f3a7a8: 0a000002 beq 1f3a7b8 + 1f3a7ac: e0000096 mul r0, r6, r0 + 1f3a7b0: e3500000 cmp r0, #0 + 1f3a7b4: 1a000006 bne 1f3a7d4 + 1f3a7b8: e2433d09 sub r3, r3, #576 ; 0x240 + 1f3a7bc: e1a01004 mov r1, r4 + 1f3a7c0: e1530004 cmp r3, r4 + 1f3a7c4: e5853040 str r3, [r5, #64] ; 0x40 + 1f3a7c8: 1affffe9 bne 1f3a774 + 1f3a7cc: e3a00001 mov r0, #1 + 1f3a7d0: e8bd8070 pop {r4, r5, r6, pc} + 1f3a7d4: e1a00004 mov r0, r4 + 1f3a7d8: eb0011c4 bl 1f3eef0 + 1f3a7dc: e5953040 ldr r3, [r5, #64] ; 0x40 + 1f3a7e0: eafffff4 b 1f3a7b8 + 1f3a7e4: e1a00002 mov r0, r2 + 1f3a7e8: e8bd8070 pop {r4, r5, r6, pc} + +01f3a7ec : + 1f3a7ec: e92d4070 push {r4, r5, r6, lr} + 1f3a7f0: e1a05000 mov r5, r0 + 1f3a7f4: e1a00001 mov r0, r1 + 1f3a7f8: e1a04001 mov r4, r1 + 1f3a7fc: ebff621f bl 1f13080 + 1f3a800: e3500000 cmp r0, #0 + 1f3a804: 0a000005 beq 1f3a820 + 1f3a808: e3750004 cmn r5, #4 + 1f3a80c: 0a000003 beq 1f3a820 + 1f3a810: e1a01004 mov r1, r4 + 1f3a814: e1a00005 mov r0, r5 + 1f3a818: e8bd4070 pop {r4, r5, r6, lr} + 1f3a81c: eafffdc1 b 1f39f28 + 1f3a820: e3a00000 mov r0, #0 + 1f3a824: e8bd8070 pop {r4, r5, r6, pc} + +01f3a828 : + 1f3a828: e92d4070 push {r4, r5, r6, lr} + 1f3a82c: e3084010 movw r4, #32784 ; 0x8010 + 1f3a830: e34041f6 movt r4, #502 ; 0x1f6 + 1f3a834: e1a05000 mov r5, r0 + 1f3a838: e5940000 ldr r0, [r4] + 1f3a83c: e3500000 cmp r0, #0 + 1f3a840: 0a00001b beq 1f3a8b4 + 1f3a844: e1c021d0 ldrd r2, [r0, #16] + 1f3a848: e3a03000 mov r3, #0 + 1f3a84c: e2022a01 and r2, r2, #4096 ; 0x1000 + 1f3a850: e1923003 orrs r3, r2, r3 + 1f3a854: 0a000004 beq 1f3a86c + 1f3a858: e1c022d0 ldrd r2, [r0, #32] + 1f3a85c: e3a03000 mov r3, #0 + 1f3a860: e2022a01 and r2, r2, #4096 ; 0x1000 + 1f3a864: e1923003 orrs r3, r2, r3 + 1f3a868: 08bd8070 popeq {r4, r5, r6, pc} + 1f3a86c: e1c020d8 ldrd r2, [r0, #8] + 1f3a870: e3a02000 mov r2, #0 + 1f3a874: e2033b02 and r3, r3, #2048 ; 0x800 + 1f3a878: e1923003 orrs r3, r2, r3 + 1f3a87c: 0a000009 beq 1f3a8a8 + 1f3a880: e1c021d8 ldrd r2, [r0, #24] + 1f3a884: e3a02000 mov r2, #0 + 1f3a888: e2033b02 and r3, r3, #2048 ; 0x800 + 1f3a88c: e1923003 orrs r3, r2, r3 + 1f3a890: 1a000004 bne 1f3a8a8 + 1f3a894: e3a03000 mov r3, #0 + 1f3a898: e1a00005 mov r0, r5 + 1f3a89c: e5c53000 strb r3, [r5] + 1f3a8a0: e8bd4070 pop {r4, r5, r6, lr} + 1f3a8a4: eafffecc b 1f3a3dc + 1f3a8a8: e1c021d0 ldrd r2, [r0, #16] + 1f3a8ac: e1c021d0 ldrd r2, [r0, #16] + 1f3a8b0: e8bd8070 pop {r4, r5, r6, pc} + 1f3a8b4: e3a00e23 mov r0, #560 ; 0x230 + 1f3a8b8: ebff1772 bl 1f00688 + 1f3a8bc: e1a06000 mov r6, r0 + 1f3a8c0: ebff5ed6 bl 1f12420 + 1f3a8c4: e5846000 str r6, [r4] + 1f3a8c8: e1a00006 mov r0, r6 + 1f3a8cc: eaffffdc b 1f3a844 + +01f3a8d0 : + 1f3a8d0: e92d4010 push {r4, lr} + 1f3a8d4: e3a01c01 mov r1, #256 ; 0x100 + 1f3a8d8: e301251c movw r2, #5404 ; 0x151c + 1f3a8dc: e34021f6 movt r2, #502 ; 0x1f6 + 1f3a8e0: e24dd098 sub sp, sp, #152 ; 0x98 + 1f3a8e4: e28d4018 add r4, sp, #24 + 1f3a8e8: e1a00004 mov r0, r4 + 1f3a8ec: eb00143a bl 1f3f9dc + 1f3a8f0: e3a03000 mov r3, #0 + 1f3a8f4: e1a02003 mov r2, r3 + 1f3a8f8: e58d3014 str r3, [sp, #20] + 1f3a8fc: e1a01003 mov r1, r3 + 1f3a900: e58d3010 str r3, [sp, #16] + 1f3a904: e58d300c str r3, [sp, #12] + 1f3a908: e3e00000 mvn r0, #0 + 1f3a90c: e58d4000 str r4, [sp] + 1f3a910: e3a034ff mov r3, #-16777216 ; 0xff000000 + 1f3a914: e58d0008 str r0, [sp, #8] + 1f3a918: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3a91c: e34001fa movt r0, #506 ; 0x1fa + 1f3a920: e58d3004 str r3, [sp, #4] + 1f3a924: e300328a movw r3, #650 ; 0x28a + 1f3a928: ebfffbfb bl 1f3991c + 1f3a92c: e28dd098 add sp, sp, #152 ; 0x98 + 1f3a930: e8bd8010 pop {r4, pc} + +01f3a934 : + 1f3a934: e3a01dc5 mov r1, #12608 ; 0x3140 + 1f3a938: e34f1f8d movt r1, #65421 ; 0xff8d + 1f3a93c: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3a940: e34001fa movt r0, #506 ; 0x1fa + 1f3a944: eafffb62 b 1f396d4 + +01f3a948 : + 1f3a948: e1a03000 mov r3, r0 + 1f3a94c: e3a01c01 mov r1, #256 ; 0x100 + 1f3a950: e92d4010 push {r4, lr} + 1f3a954: e593c030 ldr ip, [r3, #48] ; 0x30 + 1f3a958: e3012548 movw r2, #5448 ; 0x1548 + 1f3a95c: e34021f6 movt r2, #502 ; 0x1f6 + 1f3a960: e28ce802 add lr, ip, #131072 ; 0x20000 + 1f3a964: e24ddf46 sub sp, sp, #280 ; 0x118 + 1f3a968: e28d4018 add r4, sp, #24 + 1f3a96c: e5933034 ldr r3, [r3, #52] ; 0x34 + 1f3a970: e1a00004 mov r0, r4 + 1f3a974: e59ee808 ldr lr, [lr, #2056] ; 0x808 + 1f3a978: e28eec02 add lr, lr, #512 ; 0x200 + 1f3a97c: e08cc40e add ip, ip, lr, lsl #8 + 1f3a980: e58dc000 str ip, [sp] + 1f3a984: eb001414 bl 1f3f9dc + 1f3a988: e3a03000 mov r3, #0 + 1f3a98c: e1a01003 mov r1, r3 + 1f3a990: e58d3014 str r3, [sp, #20] + 1f3a994: e3e0c000 mvn ip, #0 + 1f3a998: e58d3010 str r3, [sp, #16] + 1f3a99c: e58d300c str r3, [sp, #12] + 1f3a9a0: e3a024ff mov r2, #-16777216 ; 0xff000000 + 1f3a9a4: e58d4000 str r4, [sp] + 1f3a9a8: e300328a movw r3, #650 ; 0x28a + 1f3a9ac: e58d2004 str r2, [sp, #4] + 1f3a9b0: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3a9b4: e34001fa movt r0, #506 ; 0x1fa + 1f3a9b8: e58dc008 str ip, [sp, #8] + 1f3a9bc: e3a02f56 mov r2, #344 ; 0x158 + 1f3a9c0: ebfffbd5 bl 1f3991c + 1f3a9c4: e28ddf46 add sp, sp, #280 ; 0x118 + 1f3a9c8: e8bd8010 pop {r4, pc} + +01f3a9cc : + 1f3a9cc: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f3a9d0: f2c00050 vmov.i32 q8, #0 ; 0x00000000 + 1f3a9d4: e1a04001 mov r4, r1 + 1f3a9d8: e24dde56 sub sp, sp, #1376 ; 0x560 + 1f3a9dc: e24dd004 sub sp, sp, #4 + 1f3a9e0: e28d3069 add r3, sp, #105 ; 0x69 + 1f3a9e4: e28dc060 add ip, sp, #96 ; 0x60 + 1f3a9e8: e28d5074 add r5, sp, #116 ; 0x74 + 1f3a9ec: e58d0048 str r0, [sp, #72] ; 0x48 + 1f3a9f0: e28d00f4 add r0, sp, #244 ; 0xf4 + 1f3a9f4: e58d1034 str r1, [sp, #52] ; 0x34 + 1f3a9f8: e3a01000 mov r1, #0 + 1f3a9fc: e58d2040 str r2, [sp, #64] ; 0x40 + 1f3aa00: e3a02f41 mov r2, #260 ; 0x104 + 1f3aa04: f44c0a1f vst1.8 {d16-d17}, [ip :64] + 1f3aa08: f443070f vst1.8 {d16}, [r3] + 1f3aa0c: eb001182 bl 1f3f01c + 1f3aa10: e3a02080 mov r2, #128 ; 0x80 + 1f3aa14: e3a01000 mov r1, #0 + 1f3aa18: e1a00005 mov r0, r5 + 1f3aa1c: eb00117e bl 1f3f01c + 1f3aa20: e3a01dc5 mov r1, #12608 ; 0x3140 + 1f3aa24: e34f1f8d movt r1, #65421 ; 0xff8d + 1f3aa28: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3aa2c: e34001fa movt r0, #506 ; 0x1fa + 1f3aa30: ebfffb27 bl 1f396d4 + 1f3aa34: e28d30f4 add r3, sp, #244 ; 0xf4 + 1f3aa38: e1a00004 mov r0, r4 + 1f3aa3c: e3a02000 mov r2, #0 + 1f3aa40: e3a01012 mov r1, #18 + 1f3aa44: ebff63da bl 1f139b4 + 1f3aa48: e3500000 cmp r0, #0 + 1f3aa4c: 1a00001f bne 1f3aad0 + 1f3aa50: e28d4fc6 add r4, sp, #792 ; 0x318 + 1f3aa54: e3a05000 mov r5, #0 + 1f3aa58: e3a01c01 mov r1, #256 ; 0x100 + 1f3aa5c: e301251c movw r2, #5404 ; 0x151c + 1f3aa60: e34021f6 movt r2, #502 ; 0x1f6 + 1f3aa64: e1a00004 mov r0, r4 + 1f3aa68: eb0013db bl 1f3f9dc + 1f3aa6c: e3e00000 mvn r0, #0 + 1f3aa70: e3a034ff mov r3, #-16777216 ; 0xff000000 + 1f3aa74: e58d0008 str r0, [sp, #8] + 1f3aa78: e58d3004 str r3, [sp, #4] + 1f3aa7c: e1a02005 mov r2, r5 + 1f3aa80: e300328a movw r3, #650 ; 0x28a + 1f3aa84: e58d4000 str r4, [sp] + 1f3aa88: e58d5014 str r5, [sp, #20] + 1f3aa8c: e1a01005 mov r1, r5 + 1f3aa90: e58d5010 str r5, [sp, #16] + 1f3aa94: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3aa98: e34001fa movt r0, #506 ; 0x1fa + 1f3aa9c: e58d500c str r5, [sp, #12] + 1f3aaa0: ebfffb9d bl 1f3991c + 1f3aaa4: e59d3040 ldr r3, [sp, #64] ; 0x40 + 1f3aaa8: e1530005 cmp r3, r5 + 1f3aaac: 0a000004 beq 1f3aac4 + 1f3aab0: e1a00003 mov r0, r3 + 1f3aab4: e5cd5212 strb r5, [sp, #530] ; 0x212 + 1f3aab8: ebff612b bl 1f12f6c + 1f3aabc: e1500005 cmp r0, r5 + 1f3aac0: 1a000075 bne 1f3ac9c + 1f3aac4: e28dde56 add sp, sp, #1376 ; 0x560 + 1f3aac8: e28dd004 add sp, sp, #4 + 1f3aacc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f3aad0: e5dd30f4 ldrb r3, [sp, #244] ; 0xf4 + 1f3aad4: e3a02010 mov r2, #16 + 1f3aad8: e58d3038 str r3, [sp, #56] ; 0x38 + 1f3aadc: e28d1f61 add r1, sp, #388 ; 0x184 + 1f3aae0: e5dd30f5 ldrb r3, [sp, #245] ; 0xf5 + 1f3aae4: e28d0060 add r0, sp, #96 ; 0x60 + 1f3aae8: e58d3044 str r3, [sp, #68] ; 0x44 + 1f3aaec: e30f3050 movw r3, #61520 ; 0xf050 + 1f3aaf0: e34031f5 movt r3, #501 ; 0x1f5 + 1f3aaf4: e58d304c str r3, [sp, #76] ; 0x4c + 1f3aaf8: e1a09003 mov r9, r3 + 1f3aafc: eb0015c0 bl 1f40204 + 1f3ab00: e3a03000 mov r3, #0 + 1f3ab04: e59d0034 ldr r0, [sp, #52] ; 0x34 + 1f3ab08: e1a04003 mov r4, r3 + 1f3ab0c: e58d302c str r3, [sp, #44] ; 0x2c + 1f3ab10: ebff65bc bl 1f14208 + 1f3ab14: e58d4030 str r4, [sp, #48] ; 0x30 + 1f3ab18: e1a030c0 asr r3, r0, #1 + 1f3ab1c: e58d303c str r3, [sp, #60] ; 0x3c + 1f3ab20: e30e3094 movw r3, #57492 ; 0xe094 + 1f3ab24: e34f3f89 movt r3, #65417 ; 0xff89 + 1f3ab28: e58d3020 str r3, [sp, #32] + 1f3ab2c: e3a03dc5 mov r3, #12608 ; 0x3140 + 1f3ab30: e34f3f8d movt r3, #65421 ; 0xff8d + 1f3ab34: e58d301c str r3, [sp, #28] + 1f3ab38: e3033988 movw r3, #14728 ; 0x3988 + 1f3ab3c: e34f3f32 movt r3, #65330 ; 0xff32 + 1f3ab40: e58d3024 str r3, [sp, #36] ; 0x24 + 1f3ab44: e3a03001 mov r3, #1 + 1f3ab48: e58d3028 str r3, [sp, #40] ; 0x28 + 1f3ab4c: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f3ab50: e3530011 cmp r3, #17 + 1f3ab54: e1a0a183 lsl sl, r3, #3 + 1f3ab58: 0a0001ba beq 1f3b248 + 1f3ab5c: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f3ab60: e28d10f4 add r1, sp, #244 ; 0xf4 + 1f3ab64: e5d92000 ldrb r2, [r9] + 1f3ab68: e7d13103 ldrb r3, [r1, r3, lsl #2] + 1f3ab6c: e3520000 cmp r2, #0 + 1f3ab70: e59d2030 ldr r2, [sp, #48] ; 0x30 + 1f3ab74: e0823003 add r3, r2, r3 + 1f3ab78: e58d3030 str r3, [sp, #48] ; 0x30 + 1f3ab7c: 0a00003a beq 1f3ac6c + 1f3ab80: e59d202c ldr r2, [sp, #44] ; 0x2c + 1f3ab84: e28d3e56 add r3, sp, #1376 ; 0x560 + 1f3ab88: e3a06000 mov r6, #0 + 1f3ab8c: e3a08e19 mov r8, #400 ; 0x190 + 1f3ab90: e083b102 add fp, r3, r2, lsl #2 + 1f3ab94: ea000014 b 1f3abec + 1f3ab98: eb00138f bl 1f3f9dc + 1f3ab9c: e59d301c ldr r3, [sp, #28] + 1f3aba0: e58d3008 str r3, [sp, #8] + 1f3aba4: e3a0c000 mov ip, #0 + 1f3aba8: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f3abac: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3abb0: e34001fa movt r0, #506 ; 0x1fa + 1f3abb4: e58d3004 str r3, [sp, #4] + 1f3abb8: e1a01007 mov r1, r7 + 1f3abbc: e58d5000 str r5, [sp] + 1f3abc0: e1a0300a mov r3, sl + 1f3abc4: e58dc014 str ip, [sp, #20] + 1f3abc8: e1a02008 mov r2, r8 + 1f3abcc: e58dc010 str ip, [sp, #16] + 1f3abd0: e58dc00c str ip, [sp, #12] + 1f3abd4: ebfffb50 bl 1f3991c + 1f3abd8: e5d93000 ldrb r3, [r9] + 1f3abdc: e2866001 add r6, r6, #1 + 1f3abe0: e2888008 add r8, r8, #8 + 1f3abe4: e1530006 cmp r3, r6 + 1f3abe8: da00001f ble 1f3ac6c + 1f3abec: e08b21c6 add r2, fp, r6, asr #3 + 1f3abf0: e2064007 and r4, r6, #7 + 1f3abf4: e3a07001 mov r7, #1 + 1f3abf8: e3a030d7 mov r3, #215 ; 0xd7 + 1f3abfc: e3a01080 mov r1, #128 ; 0x80 + 1f3ac00: e1a00005 mov r0, r5 + 1f3ac04: e552c467 ldrb ip, [r2, #-1127] ; 0xfffffb99 + 1f3ac08: e3012568 movw r2, #5480 ; 0x1568 + 1f3ac0c: e34021f6 movt r2, #502 ; 0x1f6 + 1f3ac10: e01c4417 ands r4, ip, r7, lsl r4 + 1f3ac14: 1affffdf bne 1f3ab98 + 1f3ac18: e3a030d1 mov r3, #209 ; 0xd1 + 1f3ac1c: e3a01080 mov r1, #128 ; 0x80 + 1f3ac20: e1a00005 mov r0, r5 + 1f3ac24: e3012568 movw r2, #5480 ; 0x1568 + 1f3ac28: e34021f6 movt r2, #502 ; 0x1f6 + 1f3ac2c: eb00136a bl 1f3f9dc + 1f3ac30: e59d301c ldr r3, [sp, #28] + 1f3ac34: e59d2020 ldr r2, [sp, #32] + 1f3ac38: e1a01007 mov r1, r7 + 1f3ac3c: e58d3008 str r3, [sp, #8] + 1f3ac40: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3ac44: e34001fa movt r0, #506 ; 0x1fa + 1f3ac48: e58d2004 str r2, [sp, #4] + 1f3ac4c: e1a0300a mov r3, sl + 1f3ac50: e58d4014 str r4, [sp, #20] + 1f3ac54: e1a02008 mov r2, r8 + 1f3ac58: e58d4010 str r4, [sp, #16] + 1f3ac5c: e58d400c str r4, [sp, #12] + 1f3ac60: e58d5000 str r5, [sp] + 1f3ac64: ebfffb2c bl 1f3991c + 1f3ac68: eaffffda b 1f3abd8 + 1f3ac6c: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f3ac70: e3530023 cmp r3, #35 ; 0x23 + 1f3ac74: e1a04183 lsl r4, r3, #3 + 1f3ac78: 0a000058 beq 1f3ade0 + 1f3ac7c: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f3ac80: e2899001 add r9, r9, #1 + 1f3ac84: e2833001 add r3, r3, #1 + 1f3ac88: e58d302c str r3, [sp, #44] ; 0x2c + 1f3ac8c: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f3ac90: e2833001 add r3, r3, #1 + 1f3ac94: e58d3028 str r3, [sp, #40] ; 0x28 + 1f3ac98: eaffffab b 1f3ab4c + 1f3ac9c: e59d6040 ldr r6, [sp, #64] ; 0x40 + 1f3aca0: e3a0102e mov r1, #46 ; 0x2e + 1f3aca4: e1a00006 mov r0, r6 + 1f3aca8: eb00158e bl 1f402e8 + 1f3acac: e3500000 cmp r0, #0 + 1f3acb0: 0affff83 beq 1f3aac4 + 1f3acb4: e1a03006 mov r3, r6 + 1f3acb8: e0666000 rsb r6, r6, r0 + 1f3acbc: e1a02006 mov r2, r6 + 1f3acc0: e1a01003 mov r1, r3 + 1f3acc4: e1a00004 mov r0, r4 + 1f3acc8: eb00154d bl 1f40204 + 1f3accc: e28d3e56 add r3, sp, #1376 ; 0x560 + 1f3acd0: e0836006 add r6, r3, r6 + 1f3acd4: e30f13c8 movw r1, #62408 ; 0xf3c8 + 1f3acd8: e34011f5 movt r1, #501 ; 0x1f5 + 1f3acdc: e1a00004 mov r0, r4 + 1f3ace0: e5465248 strb r5, [r6, #-584] ; 0xfffffdb8 + 1f3ace4: eb0013c9 bl 1f3fc10 + 1f3ace8: e28d1f7e add r1, sp, #504 ; 0x1f8 + 1f3acec: e1a00004 mov r0, r4 + 1f3acf0: ebff553f bl 1f101f4 + 1f3acf4: e1500005 cmp r0, r5 + 1f3acf8: 1affff71 bne 1f3aac4 + 1f3acfc: e28d3f7e add r3, sp, #504 ; 0x1f8 + 1f3ad00: e1c320d0 ldrd r2, [r3] + 1f3ad04: e3a01000 mov r1, #0 + 1f3ad08: e30f0fff movw r0, #65535 ; 0xffff + 1f3ad0c: e1530001 cmp r3, r1 + 1f3ad10: 01520000 cmpeq r2, r0 + 1f3ad14: 8affff6a bhi 1f3aac4 + 1f3ad18: e5dd3212 ldrb r3, [sp, #530] ; 0x212 + 1f3ad1c: e3530000 cmp r3, #0 + 1f3ad20: 0affff67 beq 1f3aac4 + 1f3ad24: e28d3f7e add r3, sp, #504 ; 0x1f8 + 1f3ad28: e3a02001 mov r2, #1 + 1f3ad2c: e283101a add r1, r3, #26 + 1f3ad30: e1a00004 mov r0, r4 + 1f3ad34: ebff47f6 bl 1f0cd14 + 1f3ad38: e2506000 subs r6, r0, #0 + 1f3ad3c: 1affff60 bne 1f3aac4 + 1f3ad40: e59d3048 ldr r3, [sp, #72] ; 0x48 + 1f3ad44: e3a00001 mov r0, #1 + 1f3ad48: e2835054 add r5, r3, #84 ; 0x54 + 1f3ad4c: ebff26f1 bl 1f04918 + 1f3ad50: e1a01005 mov r1, r5 + 1f3ad54: e28d3050 add r3, sp, #80 ; 0x50 + 1f3ad58: e3a02801 mov r2, #65536 ; 0x10000 + 1f3ad5c: e1a00004 mov r0, r4 + 1f3ad60: ebff4a08 bl 1f0d588 + 1f3ad64: e1a00006 mov r0, r6 + 1f3ad68: ebff26ea bl 1f04918 + 1f3ad6c: e1a00004 mov r0, r4 + 1f3ad70: ebff500c bl 1f0eda8 + 1f3ad74: e3a03004 mov r3, #4 + 1f3ad78: e58d3004 str r3, [sp, #4] + 1f3ad7c: e28d3060 add r3, sp, #96 ; 0x60 + 1f3ad80: e59d1050 ldr r1, [sp, #80] ; 0x50 + 1f3ad84: e28d205c add r2, sp, #92 ; 0x5c + 1f3ad88: e1a00005 mov r0, r5 + 1f3ad8c: e58d2000 str r2, [sp] + 1f3ad90: e2433008 sub r3, r3, #8 + 1f3ad94: e28d2054 add r2, sp, #84 ; 0x54 + 1f3ad98: ebfff50c bl 1f381d0 + 1f3ad9c: e2501000 subs r1, r0, #0 + 1f3ada0: 0affff47 beq 1f3aac4 + 1f3ada4: e59d3054 ldr r3, [sp, #84] ; 0x54 + 1f3ada8: e3530d05 cmp r3, #320 ; 0x140 + 1f3adac: 1affff44 bne 1f3aac4 + 1f3adb0: e59d3058 ldr r3, [sp, #88] ; 0x58 + 1f3adb4: e35300c8 cmp r3, #200 ; 0xc8 + 1f3adb8: 1affff41 bne 1f3aac4 + 1f3adbc: e3a02d05 mov r2, #320 ; 0x140 + 1f3adc0: e3a030c8 mov r3, #200 ; 0xc8 + 1f3adc4: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3adc8: e34001fa movt r0, #506 ; 0x1fa + 1f3adcc: e88d000c stm sp, {r2, r3} + 1f3add0: e3a03000 mov r3, #0 + 1f3add4: e3a02d0b mov r2, #704 ; 0x2c0 + 1f3add8: ebfffb84 bl 1f39bf0 + 1f3addc: eaffff38 b 1f3aac4 + 1f3ade0: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f3ade4: e3530023 cmp r3, #35 ; 0x23 + 1f3ade8: da000029 ble 1f3ae94 + 1f3adec: e1a02003 mov r2, r3 + 1f3adf0: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f3adf4: e30fb073 movw fp, #61555 ; 0xf073 + 1f3adf8: e340b1f5 movt fp, #501 ; 0x1f5 + 1f3adfc: e0833002 add r3, r3, r2 + 1f3ae00: e303a988 movw sl, #14728 ; 0x3988 + 1f3ae04: e34faf32 movt sl, #65330 ; 0xff32 + 1f3ae08: e3a09dc5 mov r9, #12608 ; 0x3140 + 1f3ae0c: e34f9f8d movt r9, #65421 ; 0xff8d + 1f3ae10: e58d301c str r3, [sp, #28] + 1f3ae14: e4db8001 ldrb r8, [fp], #1 + 1f3ae18: e3580000 cmp r8, #0 + 1f3ae1c: 13a07000 movne r7, #0 + 1f3ae20: 13a06e19 movne r6, #400 ; 0x190 + 1f3ae24: 0a000016 beq 1f3ae84 + 1f3ae28: e3a030d7 mov r3, #215 ; 0xd7 + 1f3ae2c: e3a01080 mov r1, #128 ; 0x80 + 1f3ae30: e3012568 movw r2, #5480 ; 0x1568 + 1f3ae34: e34021f6 movt r2, #502 ; 0x1f6 + 1f3ae38: e1a00005 mov r0, r5 + 1f3ae3c: e2877001 add r7, r7, #1 + 1f3ae40: eb0012e5 bl 1f3f9dc + 1f3ae44: e3a01000 mov r1, #0 + 1f3ae48: e1a02006 mov r2, r6 + 1f3ae4c: e58d1014 str r1, [sp, #20] + 1f3ae50: e58d1010 str r1, [sp, #16] + 1f3ae54: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3ae58: e34001fa movt r0, #506 ; 0x1fa + 1f3ae5c: e58d100c str r1, [sp, #12] + 1f3ae60: e1a03004 mov r3, r4 + 1f3ae64: e58d9008 str r9, [sp, #8] + 1f3ae68: e3a01001 mov r1, #1 + 1f3ae6c: e58da004 str sl, [sp, #4] + 1f3ae70: e2866008 add r6, r6, #8 + 1f3ae74: e58d5000 str r5, [sp] + 1f3ae78: ebfffaa7 bl 1f3991c + 1f3ae7c: e1580007 cmp r8, r7 + 1f3ae80: 1affffe8 bne 1f3ae28 + 1f3ae84: e59d301c ldr r3, [sp, #28] + 1f3ae88: e2844008 add r4, r4, #8 + 1f3ae8c: e153000b cmp r3, fp + 1f3ae90: 1affffdf bne 1f3ae14 + 1f3ae94: e3a04000 mov r4, #0 + 1f3ae98: e3a01080 mov r1, #128 ; 0x80 + 1f3ae9c: e3032698 movw r2, #13976 ; 0x3698 + 1f3aea0: e34021f6 movt r2, #502 ; 0x1f6 + 1f3aea4: e1a00005 mov r0, r5 + 1f3aea8: e3a06dc5 mov r6, #12608 ; 0x3140 + 1f3aeac: e34f6f8d movt r6, #65421 ; 0xff8d + 1f3aeb0: eb0012c9 bl 1f3f9dc + 1f3aeb4: e3067978 movw r7, #27000 ; 0x6978 + 1f3aeb8: e34f7fc4 movt r7, #65476 ; 0xffc4 + 1f3aebc: e58d7004 str r7, [sp, #4] + 1f3aec0: e1a03004 mov r3, r4 + 1f3aec4: e1a02004 mov r2, r4 + 1f3aec8: e3a01001 mov r1, #1 + 1f3aecc: e58d5000 str r5, [sp] + 1f3aed0: e58d6008 str r6, [sp, #8] + 1f3aed4: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3aed8: e34001fa movt r0, #506 ; 0x1fa + 1f3aedc: e58d4014 str r4, [sp, #20] + 1f3aee0: e58d4010 str r4, [sp, #16] + 1f3aee4: e58d400c str r4, [sp, #12] + 1f3aee8: ebfffa8b bl 1f3991c + 1f3aeec: e5ddc199 ldrb ip, [sp, #409] ; 0x199 + 1f3aef0: e58dc00c str ip, [sp, #12] + 1f3aef4: e28d3060 add r3, sp, #96 ; 0x60 + 1f3aef8: e5ddc198 ldrb ip, [sp, #408] ; 0x198 + 1f3aefc: e301256c movw r2, #5484 ; 0x156c + 1f3af00: e34021f6 movt r2, #502 ; 0x1f6 + 1f3af04: e58dc008 str ip, [sp, #8] + 1f3af08: e5ddc197 ldrb ip, [sp, #407] ; 0x197 + 1f3af0c: e5dd119b ldrb r1, [sp, #411] ; 0x19b + 1f3af10: e5dd019a ldrb r0, [sp, #410] ; 0x19a + 1f3af14: e58dc004 str ip, [sp, #4] + 1f3af18: e5ddc196 ldrb ip, [sp, #406] ; 0x196 + 1f3af1c: e58d1014 str r1, [sp, #20] + 1f3af20: e3a01080 mov r1, #128 ; 0x80 + 1f3af24: e58d0010 str r0, [sp, #16] + 1f3af28: e1a00005 mov r0, r5 + 1f3af2c: e58dc000 str ip, [sp] + 1f3af30: eb0012a9 bl 1f3f9dc + 1f3af34: e1a03004 mov r3, r4 + 1f3af38: e58d4014 str r4, [sp, #20] + 1f3af3c: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3af40: e34001fa movt r0, #506 ; 0x1fa + 1f3af44: e58d4010 str r4, [sp, #16] + 1f3af48: e3a02010 mov r2, #16 + 1f3af4c: e58d400c str r4, [sp, #12] + 1f3af50: e3a01001 mov r1, #1 + 1f3af54: e58d7008 str r7, [sp, #8] + 1f3af58: e58d6004 str r6, [sp, #4] + 1f3af5c: e58d5000 str r5, [sp] + 1f3af60: ebfffa6d bl 1f3991c + 1f3af64: e59d3038 ldr r3, [sp, #56] ; 0x38 + 1f3af68: e1530004 cmp r3, r4 + 1f3af6c: 03a08008 moveq r8, #8 + 1f3af70: 0a00009c beq 1f3b1e8 + 1f3af74: e1a0b007 mov fp, r7 + 1f3af78: e59d4044 ldr r4, [sp, #68] ; 0x44 + 1f3af7c: e59d7038 ldr r7, [sp, #56] ; 0x38 + 1f3af80: e1a0a006 mov sl, r6 + 1f3af84: e3a08008 mov r8, #8 + 1f3af88: e28d30f4 add r3, sp, #244 ; 0xf4 + 1f3af8c: e1a02004 mov r2, r4 + 1f3af90: e1a01007 mov r1, r7 + 1f3af94: e59d0034 ldr r0, [sp, #52] ; 0x34 + 1f3af98: ebff6285 bl 1f139b4 + 1f3af9c: e3500000 cmp r0, #0 + 1f3afa0: 0a000090 beq 1f3b1e8 + 1f3afa4: e5dd20f5 ldrb r2, [sp, #245] ; 0xf5 + 1f3afa8: e28d60f5 add r6, sp, #245 ; 0xf5 + 1f3afac: e5dd30f4 ldrb r3, [sp, #244] ; 0xf4 + 1f3afb0: e1a01002 mov r1, r2 + 1f3afb4: e58d2024 str r2, [sp, #36] ; 0x24 + 1f3afb8: e35100ff cmp r1, #255 ; 0xff + 1f3afbc: 13530000 cmpne r3, #0 + 1f3afc0: e28d2c01 add r2, sp, #256 ; 0x100 + 1f3afc4: e28290f5 add r9, r2, #245 ; 0xf5 + 1f3afc8: e1a02001 mov r2, r1 + 1f3afcc: 03a02001 moveq r2, #1 + 1f3afd0: 13a02000 movne r2, #0 + 1f3afd4: e1570003 cmp r7, r3 + 1f3afd8: 01510004 cmpeq r1, r4 + 1f3afdc: e58d3020 str r3, [sp, #32] + 1f3afe0: 03a04001 moveq r4, #1 + 1f3afe4: 13a04000 movne r4, #0 + 1f3afe8: e3530012 cmp r3, #18 + 1f3afec: 03510001 cmpeq r1, #1 + 1f3aff0: 03a03001 moveq r3, #1 + 1f3aff4: 13a03000 movne r3, #0 + 1f3aff8: e1823003 orr r3, r2, r3 + 1f3affc: e1843003 orr r3, r4, r3 + 1f3b000: e58d301c str r3, [sp, #28] + 1f3b004: e286101d add r1, r6, #29 + 1f3b008: e1a03006 mov r3, r6 + 1f3b00c: e3a04001 mov r4, #1 + 1f3b010: e5f32001 ldrb r2, [r3, #1]! + 1f3b014: e3520000 cmp r2, #0 + 1f3b018: 13a04000 movne r4, #0 + 1f3b01c: e1510003 cmp r1, r3 + 1f3b020: 1afffffa bne 1f3b010 + 1f3b024: e3540000 cmp r4, #0 + 1f3b028: 1a000061 bne 1f3b1b4 + 1f3b02c: e5d6c01e ldrb ip, [r6, #30] + 1f3b030: e3a01080 mov r1, #128 ; 0x80 + 1f3b034: e5d6301d ldrb r3, [r6, #29] + 1f3b038: e308216c movw r2, #33132 ; 0x816c + 1f3b03c: e34021f5 movt r2, #501 ; 0x1f5 + 1f3b040: e5d6e004 ldrb lr, [r6, #4] + 1f3b044: e183340c orr r3, r3, ip, lsl #8 + 1f3b048: e5cde060 strb lr, [sp, #96] ; 0x60 + 1f3b04c: e1a00005 mov r0, r5 + 1f3b050: e5d6e005 ldrb lr, [r6, #5] + 1f3b054: e5d6c006 ldrb ip, [r6, #6] + 1f3b058: e5cde061 strb lr, [sp, #97] ; 0x61 + 1f3b05c: e5cdc062 strb ip, [sp, #98] ; 0x62 + 1f3b060: e5d6e007 ldrb lr, [r6, #7] + 1f3b064: e5d6c008 ldrb ip, [r6, #8] + 1f3b068: e5cde063 strb lr, [sp, #99] ; 0x63 + 1f3b06c: e5cdc064 strb ip, [sp, #100] ; 0x64 + 1f3b070: e5d6e009 ldrb lr, [r6, #9] + 1f3b074: e5d6c00a ldrb ip, [r6, #10] + 1f3b078: e5cde065 strb lr, [sp, #101] ; 0x65 + 1f3b07c: e5cdc066 strb ip, [sp, #102] ; 0x66 + 1f3b080: e5d6e00b ldrb lr, [r6, #11] + 1f3b084: e5d6c00c ldrb ip, [r6, #12] + 1f3b088: e5cde067 strb lr, [sp, #103] ; 0x67 + 1f3b08c: e5cdc068 strb ip, [sp, #104] ; 0x68 + 1f3b090: e5d6e00d ldrb lr, [r6, #13] + 1f3b094: e5d6c00e ldrb ip, [r6, #14] + 1f3b098: e5cde069 strb lr, [sp, #105] ; 0x69 + 1f3b09c: e5cdc06a strb ip, [sp, #106] ; 0x6a + 1f3b0a0: e5d6e00f ldrb lr, [r6, #15] + 1f3b0a4: e5d6c010 ldrb ip, [r6, #16] + 1f3b0a8: e5cde06b strb lr, [sp, #107] ; 0x6b + 1f3b0ac: e5cdc06c strb ip, [sp, #108] ; 0x6c + 1f3b0b0: e5d6e011 ldrb lr, [r6, #17] + 1f3b0b4: e5d6c012 ldrb ip, [r6, #18] + 1f3b0b8: e5cde06d strb lr, [sp, #109] ; 0x6d + 1f3b0bc: e5d67001 ldrb r7, [r6, #1] + 1f3b0c0: e5cdc06e strb ip, [sp, #110] ; 0x6e + 1f3b0c4: e5d6c013 ldrb ip, [r6, #19] + 1f3b0c8: e5cdc06f strb ip, [sp, #111] ; 0x6f + 1f3b0cc: e5cd4070 strb r4, [sp, #112] ; 0x70 + 1f3b0d0: eb001241 bl 1f3f9dc + 1f3b0d4: e1a03008 mov r3, r8 + 1f3b0d8: e1a02004 mov r2, r4 + 1f3b0dc: e3a01001 mov r1, #1 + 1f3b0e0: e58d4014 str r4, [sp, #20] + 1f3b0e4: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3b0e8: e34001fa movt r0, #506 ; 0x1fa + 1f3b0ec: e58d4010 str r4, [sp, #16] + 1f3b0f0: e58d400c str r4, [sp, #12] + 1f3b0f4: e58da008 str sl, [sp, #8] + 1f3b0f8: e88d0820 stm sp, {r5, fp} + 1f3b0fc: ebfffa06 bl 1f3991c + 1f3b100: e28d3060 add r3, sp, #96 ; 0x60 + 1f3b104: e3a01080 mov r1, #128 ; 0x80 + 1f3b108: e3012580 movw r2, #5504 ; 0x1580 + 1f3b10c: e34021f6 movt r2, #502 ; 0x1f6 + 1f3b110: e1a00005 mov r0, r5 + 1f3b114: eb001230 bl 1f3f9dc + 1f3b118: e3a02028 mov r2, #40 ; 0x28 + 1f3b11c: e58d4014 str r4, [sp, #20] + 1f3b120: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3b124: e34001fa movt r0, #506 ; 0x1fa + 1f3b128: e58d4010 str r4, [sp, #16] + 1f3b12c: e1a03008 mov r3, r8 + 1f3b130: e58d400c str r4, [sp, #12] + 1f3b134: e3a01001 mov r1, #1 + 1f3b138: e58da008 str sl, [sp, #8] + 1f3b13c: e58db004 str fp, [sp, #4] + 1f3b140: e58d5000 str r5, [sp] + 1f3b144: ebfff9f4 bl 1f3991c + 1f3b148: e3170080 tst r7, #128 ; 0x80 + 1f3b14c: 03a0202a moveq r2, #42 ; 0x2a + 1f3b150: 1a000020 bne 1f3b1d8 + 1f3b154: e2077007 and r7, r7, #7 + 1f3b158: e30134f8 movw r3, #5368 ; 0x14f8 + 1f3b15c: e34031f6 movt r3, #502 ; 0x1f6 + 1f3b160: e58d2000 str r2, [sp] + 1f3b164: e3a01080 mov r1, #128 ; 0x80 + 1f3b168: e3012588 movw r2, #5512 ; 0x1588 + 1f3b16c: e34021f6 movt r2, #502 ; 0x1f6 + 1f3b170: e7933107 ldr r3, [r3, r7, lsl #2] + 1f3b174: e1a00005 mov r0, r5 + 1f3b178: eb001217 bl 1f3f9dc + 1f3b17c: e3a0c000 mov ip, #0 + 1f3b180: e1a03008 mov r3, r8 + 1f3b184: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3b188: e34001fa movt r0, #506 ; 0x1fa + 1f3b18c: e58da008 str sl, [sp, #8] + 1f3b190: e3a020c0 mov r2, #192 ; 0xc0 + 1f3b194: e58db004 str fp, [sp, #4] + 1f3b198: e3a01001 mov r1, #1 + 1f3b19c: e58d5000 str r5, [sp] + 1f3b1a0: e2888008 add r8, r8, #8 + 1f3b1a4: e58dc014 str ip, [sp, #20] + 1f3b1a8: e58dc010 str ip, [sp, #16] + 1f3b1ac: e58dc00c str ip, [sp, #12] + 1f3b1b0: ebfff9d9 bl 1f3991c + 1f3b1b4: e2866020 add r6, r6, #32 + 1f3b1b8: e1590006 cmp r9, r6 + 1f3b1bc: 1affff90 bne 1f3b004 + 1f3b1c0: e59d301c ldr r3, [sp, #28] + 1f3b1c4: e3530000 cmp r3, #0 + 1f3b1c8: 1a000006 bne 1f3b1e8 + 1f3b1cc: e59d4024 ldr r4, [sp, #36] ; 0x24 + 1f3b1d0: e59d7020 ldr r7, [sp, #32] + 1f3b1d4: eaffff6b b 1f3af88 + 1f3b1d8: e3170040 tst r7, #64 ; 0x40 + 1f3b1dc: 13a0203c movne r2, #60 ; 0x3c + 1f3b1e0: 03a02020 moveq r2, #32 + 1f3b1e4: eaffffda b 1f3b154 + 1f3b1e8: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f3b1ec: e3a01080 mov r1, #128 ; 0x80 + 1f3b1f0: e1a00005 mov r0, r5 + 1f3b1f4: e3012590 movw r2, #5520 ; 0x1590 + 1f3b1f8: e34021f6 movt r2, #502 ; 0x1f6 + 1f3b1fc: eb0011f6 bl 1f3f9dc + 1f3b200: e3a0c000 mov ip, #0 + 1f3b204: e58d5000 str r5, [sp] + 1f3b208: e1a03008 mov r3, r8 + 1f3b20c: e3a02dc5 mov r2, #12608 ; 0x3140 + 1f3b210: e34f2f8d movt r2, #65421 ; 0xff8d + 1f3b214: e3061978 movw r1, #27000 ; 0x6978 + 1f3b218: e34f1fc4 movt r1, #65476 ; 0xffc4 + 1f3b21c: e58d2008 str r2, [sp, #8] + 1f3b220: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3b224: e34001fa movt r0, #506 ; 0x1fa + 1f3b228: e58d1004 str r1, [sp, #4] + 1f3b22c: e1a0200c mov r2, ip + 1f3b230: e58dc014 str ip, [sp, #20] + 1f3b234: e3a01001 mov r1, #1 + 1f3b238: e58dc010 str ip, [sp, #16] + 1f3b23c: e58dc00c str ip, [sp, #12] + 1f3b240: ebfff9b5 bl 1f3991c + 1f3b244: eafffe01 b 1f3aa50 + 1f3b248: e5d93000 ldrb r3, [r9] + 1f3b24c: e3530000 cmp r3, #0 + 1f3b250: 1afffe4a bne 1f3ab80 + 1f3b254: eafffe88 b 1f3ac7c + +01f3b258 >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&)>: + 1f3b258: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f3b25c: e8900018 ldm r0, {r3, r4} + 1f3b260: e1a05000 mov r5, r0 + 1f3b264: e3082e39 movw r2, #36409 ; 0x8e39 + 1f3b268: e34328e3 movt r2, #14563 ; 0x38e3 + 1f3b26c: e0630004 rsb r0, r3, r4 + 1f3b270: e1a08001 mov r8, r1 + 1f3b274: e1a00340 asr r0, r0, #6 + 1f3b278: e0020092 mul r2, r2, r0 + 1f3b27c: e3520000 cmp r2, #0 + 1f3b280: 0a000004 beq 1f3b298 >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&)+0x40> + 1f3b284: e1a06082 lsl r6, r2, #1 + 1f3b288: e1520006 cmp r2, r6 + 1f3b28c: 9a000024 bls 1f3b324 >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&)+0xcc> + 1f3b290: e3e060ff mvn r6, #255 ; 0xff + 1f3b294: ea000000 b 1f3b29c >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&)+0x44> + 1f3b298: e3a06d09 mov r6, #576 ; 0x240 + 1f3b29c: e1a00006 mov r0, r6 + 1f3b2a0: ebff14f8 bl 1f00688 + 1f3b2a4: e1a07000 mov r7, r0 + 1f3b2a8: e8950018 ldm r5, {r3, r4} + 1f3b2ac: e0634004 rsb r4, r3, r4 + 1f3b2b0: e0970004 adds r0, r7, r4 + 1f3b2b4: 01a00003 moveq r0, r3 + 1f3b2b8: 0a000004 beq 1f3b2d0 >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&)+0x78> + 1f3b2bc: e1a01008 mov r1, r8 + 1f3b2c0: e3a02d09 mov r2, #576 ; 0x240 + 1f3b2c4: eb000ecd bl 1f3ee00 + 1f3b2c8: e8950011 ldm r5, {r0, r4} + 1f3b2cc: e0604004 rsb r4, r0, r4 + 1f3b2d0: e3083e39 movw r3, #36409 ; 0x8e39 + 1f3b2d4: e34338e3 movt r3, #14563 ; 0x38e3 + 1f3b2d8: e1a02344 asr r2, r4, #6 + 1f3b2dc: e0030293 mul r3, r3, r2 + 1f3b2e0: e3530000 cmp r3, #0 + 1f3b2e4: 1a000008 bne 1f3b30c >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&)+0xb4> + 1f3b2e8: e3500000 cmp r0, #0 + 1f3b2ec: e2844d09 add r4, r4, #576 ; 0x240 + 1f3b2f0: e0874004 add r4, r7, r4 + 1f3b2f4: 0a000000 beq 1f3b2fc >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&)+0xa4> + 1f3b2f8: ebff14e3 bl 1f0068c + 1f3b2fc: e0876006 add r6, r7, r6 + 1f3b300: e5857000 str r7, [r5] + 1f3b304: e9850050 stmib r5, {r4, r6} + 1f3b308: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f3b30c: e1a01000 mov r1, r0 + 1f3b310: e1a02004 mov r2, r4 + 1f3b314: e1a00007 mov r0, r7 + 1f3b318: eb000ef4 bl 1f3eef0 + 1f3b31c: e5950000 ldr r0, [r5] + 1f3b320: eafffff0 b 1f3b2e8 >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&)+0x90> + 1f3b324: e30c271c movw r2, #50972 ; 0xc71c + 1f3b328: e3402071 movt r2, #113 ; 0x71 + 1f3b32c: e1560002 cmp r6, r2 + 1f3b330: 8affffd6 bhi 1f3b290 >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&)+0x38> + 1f3b334: e3560000 cmp r6, #0 + 1f3b338: 13a03d09 movne r3, #576 ; 0x240 + 1f3b33c: 10060693 mulne r6, r3, r6 + 1f3b340: 1affffd5 bne 1f3b29c >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&)+0x44> + 1f3b344: e1a07006 mov r7, r6 + 1f3b348: eaffffd7 b 1f3b2ac >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&)+0x54> + +01f3b34c : + 1f3b34c: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f3b350: e5903008 ldr r3, [r0, #8] + 1f3b354: e3087e39 movw r7, #36409 ; 0x8e39 + 1f3b358: e34378e3 movt r7, #14563 ; 0x38e3 + 1f3b35c: e5905004 ldr r5, [r0, #4] + 1f3b360: e1a06000 mov r6, r0 + 1f3b364: e3a04000 mov r4, #0 + 1f3b368: e0653003 rsb r3, r5, r3 + 1f3b36c: e1a03343 asr r3, r3, #6 + 1f3b370: e0070397 mul r7, r7, r3 + 1f3b374: e3570000 cmp r7, #0 + 1f3b378: ca000004 bgt 1f3b390 + 1f3b37c: ea000049 b 1f3b4a8 + 1f3b380: e2844001 add r4, r4, #1 + 1f3b384: e1540007 cmp r4, r7 + 1f3b388: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc} + 1f3b38c: e5965004 ldr r5, [r6, #4] + 1f3b390: e1a03484 lsl r3, r4, #9 + 1f3b394: e30115a4 movw r1, #5540 ; 0x15a4 + 1f3b398: e34011f6 movt r1, #502 ; 0x1f6 + 1f3b39c: e0833304 add r3, r3, r4, lsl #6 + 1f3b3a0: e0855003 add r5, r5, r3 + 1f3b3a4: e285001a add r0, r5, #26 + 1f3b3a8: eb001293 bl 1f3fdfc + 1f3b3ac: e3500000 cmp r0, #0 + 1f3b3b0: 1afffff2 bne 1f3b380 + 1f3b3b4: e1570004 cmp r7, r4 + 1f3b3b8: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc} + 1f3b3bc: e596003c ldr r0, [r6, #60] ; 0x3c + 1f3b3c0: e3a03000 mov r3, #0 + 1f3b3c4: e5962044 ldr r2, [r6, #68] ; 0x44 + 1f3b3c8: e5860040 str r0, [r6, #64] ; 0x40 + 1f3b3cc: e1500002 cmp r0, r2 + 1f3b3d0: e5863048 str r3, [r6, #72] ; 0x48 + 1f3b3d4: e586304c str r3, [r6, #76] ; 0x4c + 1f3b3d8: e5863050 str r3, [r6, #80] ; 0x50 + 1f3b3dc: 0a000033 beq 1f3b4b0 + 1f3b3e0: e1500003 cmp r0, r3 + 1f3b3e4: 0a00002d beq 1f3b4a0 + 1f3b3e8: e1a01005 mov r1, r5 + 1f3b3ec: e3a02d09 mov r2, #576 ; 0x240 + 1f3b3f0: eb000e82 bl 1f3ee00 + 1f3b3f4: e5960040 ldr r0, [r6, #64] ; 0x40 + 1f3b3f8: e596403c ldr r4, [r6, #60] ; 0x3c + 1f3b3fc: e2800d09 add r0, r0, #576 ; 0x240 + 1f3b400: e5860040 str r0, [r6, #64] ; 0x40 + 1f3b404: e0643000 rsb r3, r4, r0 + 1f3b408: e3085e39 movw r5, #36409 ; 0x8e39 + 1f3b40c: e34358e3 movt r5, #14563 ; 0x38e3 + 1f3b410: e1a03343 asr r3, r3, #6 + 1f3b414: e0030395 mul r3, r5, r3 + 1f3b418: e3530000 cmp r3, #0 + 1f3b41c: 0a000019 beq 1f3b488 + 1f3b420: e1540000 cmp r4, r0 + 1f3b424: e1a01004 mov r1, r4 + 1f3b428: 0a000015 beq 1f3b484 + 1f3b42c: e5d4200c ldrb r2, [r4, #12] + 1f3b430: e5960024 ldr r0, [r6, #36] ; 0x24 + 1f3b434: e2022001 and r2, r2, #1 + 1f3b438: eb000831 bl 1f3d504 + 1f3b43c: e3500000 cmp r0, #0 + 1f3b440: 12844d09 addne r4, r4, #576 ; 0x240 + 1f3b444: 15960040 ldrne r0, [r6, #64] ; 0x40 + 1f3b448: 1afffff4 bne 1f3b420 + 1f3b44c: e5960040 ldr r0, [r6, #64] ; 0x40 + 1f3b450: e2841d09 add r1, r4, #576 ; 0x240 + 1f3b454: e0612000 rsb r2, r1, r0 + 1f3b458: e1510000 cmp r1, r0 + 1f3b45c: e1a03342 asr r3, r2, #6 + 1f3b460: 0a000002 beq 1f3b470 + 1f3b464: e0030395 mul r3, r5, r3 + 1f3b468: e3530000 cmp r3, #0 + 1f3b46c: 1a000007 bne 1f3b490 + 1f3b470: e2400d09 sub r0, r0, #576 ; 0x240 + 1f3b474: e1a01004 mov r1, r4 + 1f3b478: e1540000 cmp r4, r0 + 1f3b47c: e5860040 str r0, [r6, #64] ; 0x40 + 1f3b480: 1affffe9 bne 1f3b42c + 1f3b484: e3a03001 mov r3, #1 + 1f3b488: e5c63028 strb r3, [r6, #40] ; 0x28 + 1f3b48c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f3b490: e1a00004 mov r0, r4 + 1f3b494: eb000e95 bl 1f3eef0 + 1f3b498: e5960040 ldr r0, [r6, #64] ; 0x40 + 1f3b49c: eafffff3 b 1f3b470 + 1f3b4a0: e1a04000 mov r4, r0 + 1f3b4a4: eaffffd4 b 1f3b3fc + 1f3b4a8: e1a05004 mov r5, r4 + 1f3b4ac: eaffffc0 b 1f3b3b4 + 1f3b4b0: e286003c add r0, r6, #60 ; 0x3c + 1f3b4b4: e1a01005 mov r1, r5 + 1f3b4b8: ebffff66 bl 1f3b258 >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&)> + 1f3b4bc: e5960040 ldr r0, [r6, #64] ; 0x40 + 1f3b4c0: e596403c ldr r4, [r6, #60] ; 0x3c + 1f3b4c4: eaffffce b 1f3b404 + +01f3b4c8 : + 1f3b4c8: e3510000 cmp r1, #0 + 1f3b4cc: 0a000033 beq 1f3b5a0 + 1f3b4d0: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f3b4d4: e5d1800c ldrb r8, [r1, #12] + 1f3b4d8: e2088010 and r8, r8, #16 + 1f3b4dc: e21880ff ands r8, r8, #255 ; 0xff + 1f3b4e0: 0a000001 beq 1f3b4ec + 1f3b4e4: e3a00000 mov r0, #0 + 1f3b4e8: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f3b4ec: e281501a add r5, r1, #26 + 1f3b4f0: e1a07000 mov r7, r0 + 1f3b4f4: e1a00005 mov r0, r5 + 1f3b4f8: e1a06001 mov r6, r1 + 1f3b4fc: ebff5e9a bl 1f12f6c + 1f3b500: e3500000 cmp r0, #0 + 1f3b504: 0afffff6 beq 1f3b4e4 + 1f3b508: e597103c ldr r1, [r7, #60] ; 0x3c + 1f3b50c: e3084e39 movw r4, #36409 ; 0x8e39 + 1f3b510: e34348e3 movt r4, #14563 ; 0x38e3 + 1f3b514: e5970040 ldr r0, [r7, #64] ; 0x40 + 1f3b518: e0613000 rsb r3, r1, r0 + 1f3b51c: e1a03343 asr r3, r3, #6 + 1f3b520: e0030394 mul r3, r4, r3 + 1f3b524: e3530000 cmp r3, #0 + 1f3b528: 0a00000f beq 1f3b56c + 1f3b52c: e1a03488 lsl r3, r8, #9 + 1f3b530: e1a00005 mov r0, r5 + 1f3b534: e0833308 add r3, r3, r8, lsl #6 + 1f3b538: e2888001 add r8, r8, #1 + 1f3b53c: e0811003 add r1, r1, r3 + 1f3b540: e281101a add r1, r1, #26 + 1f3b544: eb00122c bl 1f3fdfc + 1f3b548: e3500000 cmp r0, #0 + 1f3b54c: 0affffe4 beq 1f3b4e4 + 1f3b550: e597103c ldr r1, [r7, #60] ; 0x3c + 1f3b554: e5970040 ldr r0, [r7, #64] ; 0x40 + 1f3b558: e0613000 rsb r3, r1, r0 + 1f3b55c: e1a03343 asr r3, r3, #6 + 1f3b560: e0030394 mul r3, r4, r3 + 1f3b564: e1530008 cmp r3, r8 + 1f3b568: 8affffef bhi 1f3b52c + 1f3b56c: e5973044 ldr r3, [r7, #68] ; 0x44 + 1f3b570: e1500003 cmp r0, r3 + 1f3b574: 0a00000b beq 1f3b5a8 + 1f3b578: e3500000 cmp r0, #0 + 1f3b57c: 0a000003 beq 1f3b590 + 1f3b580: e1a01006 mov r1, r6 + 1f3b584: e3a02d09 mov r2, #576 ; 0x240 + 1f3b588: eb000e1c bl 1f3ee00 + 1f3b58c: e5970040 ldr r0, [r7, #64] ; 0x40 + 1f3b590: e2803d09 add r3, r0, #576 ; 0x240 + 1f3b594: e3a00001 mov r0, #1 + 1f3b598: e5873040 str r3, [r7, #64] ; 0x40 + 1f3b59c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f3b5a0: e3a00000 mov r0, #0 + 1f3b5a4: e12fff1e bx lr + 1f3b5a8: e287003c add r0, r7, #60 ; 0x3c + 1f3b5ac: e1a01006 mov r1, r6 + 1f3b5b0: ebffff28 bl 1f3b258 >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&)> + 1f3b5b4: e3a00001 mov r0, #1 + 1f3b5b8: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f3b5bc > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)>: + 1f3b5bc: e1520000 cmp r2, r0 + 1f3b5c0: 012fff1e bxeq lr + 1f3b5c4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f3b5c8: e2807d09 add r7, r0, #576 ; 0x240 + 1f3b5cc: e1570002 cmp r7, r2 + 1f3b5d0: e24ddf91 sub sp, sp, #580 ; 0x244 + 1f3b5d4: 0a000053 beq 1f3b728 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x16c> + 1f3b5d8: e2808f96 add r8, r0, #600 ; 0x258 + 1f3b5dc: e308be39 movw fp, #36409 ; 0x8e39 + 1f3b5e0: e343b8e3 movt fp, #14563 ; 0x38e3 + 1f3b5e4: e1a0a002 mov sl, r2 + 1f3b5e8: e1a09000 mov r9, r0 + 1f3b5ec: e2888002 add r8, r8, #2 + 1f3b5f0: ea000010 b 1f3b638 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x7c> + 1f3b5f4: e3a02d09 mov r2, #576 ; 0x240 + 1f3b5f8: e248101a sub r1, r8, #26 + 1f3b5fc: e1a0000d mov r0, sp + 1f3b600: eb000dfe bl 1f3ee00 + 1f3b604: e0692007 rsb r2, r9, r7 + 1f3b608: e1a03342 asr r3, r2, #6 + 1f3b60c: e003039b mul r3, fp, r3 + 1f3b610: e3530000 cmp r3, #0 + 1f3b614: 1a00004d bne 1f3b750 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x194> + 1f3b618: e3a02d09 mov r2, #576 ; 0x240 + 1f3b61c: e1a0100d mov r1, sp + 1f3b620: e1a00009 mov r0, r9 + 1f3b624: e2877d09 add r7, r7, #576 ; 0x240 + 1f3b628: eb000df4 bl 1f3ee00 + 1f3b62c: e15a0007 cmp sl, r7 + 1f3b630: e2888d09 add r8, r8, #576 ; 0x240 + 1f3b634: 0a00003b beq 1f3b728 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x16c> + 1f3b638: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3b63c: e34011f6 movt r1, #502 ; 0x1f6 + 1f3b640: e1a00008 mov r0, r8 + 1f3b644: eb001154 bl 1f3fb9c + 1f3b648: e3500000 cmp r0, #0 + 1f3b64c: 0affffe8 beq 1f3b5f4 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x38> + 1f3b650: e289401a add r4, r9, #26 + 1f3b654: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3b658: e34011f6 movt r1, #502 ; 0x1f6 + 1f3b65c: e1a00004 mov r0, r4 + 1f3b660: eb00114d bl 1f3fb9c + 1f3b664: e3500000 cmp r0, #0 + 1f3b668: 0a000005 beq 1f3b684 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0xc8> + 1f3b66c: e5d7300c ldrb r3, [r7, #12] + 1f3b670: e3130010 tst r3, #16 + 1f3b674: e5d9300c ldrb r3, [r9, #12] + 1f3b678: 1a000039 bne 1f3b764 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x1a8> + 1f3b67c: e3130010 tst r3, #16 + 1f3b680: 0a000039 beq 1f3b76c > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x1b0> + 1f3b684: e2474f89 sub r4, r7, #548 ; 0x224 + 1f3b688: e3a02d09 mov r2, #576 ; 0x240 + 1f3b68c: e248101a sub r1, r8, #26 + 1f3b690: e1a0000d mov r0, sp + 1f3b694: e28d601a add r6, sp, #26 + 1f3b698: e2444002 sub r4, r4, #2 + 1f3b69c: eb000dd7 bl 1f3ee00 + 1f3b6a0: ea000004 b 1f3b6b8 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0xfc> + 1f3b6a4: e244101a sub r1, r4, #26 + 1f3b6a8: e1a00005 mov r0, r5 + 1f3b6ac: e3a02d09 mov r2, #576 ; 0x240 + 1f3b6b0: e2444d09 sub r4, r4, #576 ; 0x240 + 1f3b6b4: eb000dd1 bl 1f3ee00 + 1f3b6b8: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3b6bc: e34011f6 movt r1, #502 ; 0x1f6 + 1f3b6c0: e1a00006 mov r0, r6 + 1f3b6c4: e2845f89 add r5, r4, #548 ; 0x224 + 1f3b6c8: eb001133 bl 1f3fb9c + 1f3b6cc: e3500000 cmp r0, #0 + 1f3b6d0: e2855002 add r5, r5, #2 + 1f3b6d4: 0afffff2 beq 1f3b6a4 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0xe8> + 1f3b6d8: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3b6dc: e34011f6 movt r1, #502 ; 0x1f6 + 1f3b6e0: e1a00004 mov r0, r4 + 1f3b6e4: eb00112c bl 1f3fb9c + 1f3b6e8: e3500000 cmp r0, #0 + 1f3b6ec: 0a000005 beq 1f3b708 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x14c> + 1f3b6f0: e5dd300c ldrb r3, [sp, #12] + 1f3b6f4: e3130010 tst r3, #16 + 1f3b6f8: e554300e ldrb r3, [r4, #-14] + 1f3b6fc: 1a00000b bne 1f3b730 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x174> + 1f3b700: e3130010 tst r3, #16 + 1f3b704: 0a00000b beq 1f3b738 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x17c> + 1f3b708: e1a00005 mov r0, r5 + 1f3b70c: e3a02d09 mov r2, #576 ; 0x240 + 1f3b710: e1a0100d mov r1, sp + 1f3b714: e2877d09 add r7, r7, #576 ; 0x240 + 1f3b718: eb000db8 bl 1f3ee00 + 1f3b71c: e15a0007 cmp sl, r7 + 1f3b720: e2888d09 add r8, r8, #576 ; 0x240 + 1f3b724: 1affffc3 bne 1f3b638 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x7c> + 1f3b728: e28ddf91 add sp, sp, #580 ; 0x244 + 1f3b72c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f3b730: e3130010 tst r3, #16 + 1f3b734: 0affffda beq 1f3b6a4 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0xe8> + 1f3b738: e1a01004 mov r1, r4 + 1f3b73c: e1a00006 mov r0, r6 + 1f3b740: eb001115 bl 1f3fb9c + 1f3b744: e3500000 cmp r0, #0 + 1f3b748: baffffd5 blt 1f3b6a4 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0xe8> + 1f3b74c: eaffffed b 1f3b708 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x14c> + 1f3b750: e2620d09 rsb r0, r2, #576 ; 0x240 + 1f3b754: e1a01009 mov r1, r9 + 1f3b758: e0870000 add r0, r7, r0 + 1f3b75c: eb000de3 bl 1f3eef0 + 1f3b760: eaffffac b 1f3b618 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x5c> + 1f3b764: e3130010 tst r3, #16 + 1f3b768: 0affffa1 beq 1f3b5f4 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x38> + 1f3b76c: e1a01004 mov r1, r4 + 1f3b770: e1a00008 mov r0, r8 + 1f3b774: eb001108 bl 1f3fb9c + 1f3b778: e3500000 cmp r0, #0 + 1f3b77c: aaffffc0 bge 1f3b684 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0xc8> + 1f3b780: eaffff9b b 1f3b5f4 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x38> + +01f3b784 > >, __gnu_cxx::__ops::_Val_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Val_comp_iter)>: + 1f3b784: e92d4070 push {r4, r5, r6, lr} + 1f3b788: e1a01000 mov r1, r0 + 1f3b78c: e2404f89 sub r4, r0, #548 ; 0x224 + 1f3b790: e24ddd09 sub sp, sp, #576 ; 0x240 + 1f3b794: e3a02d09 mov r2, #576 ; 0x240 + 1f3b798: e1a0000d mov r0, sp + 1f3b79c: e28d601a add r6, sp, #26 + 1f3b7a0: e2444002 sub r4, r4, #2 + 1f3b7a4: eb000d95 bl 1f3ee00 + 1f3b7a8: ea000004 b 1f3b7c0 > >, __gnu_cxx::__ops::_Val_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Val_comp_iter)+0x3c> + 1f3b7ac: e244101a sub r1, r4, #26 + 1f3b7b0: e1a00005 mov r0, r5 + 1f3b7b4: e3a02d09 mov r2, #576 ; 0x240 + 1f3b7b8: e2444d09 sub r4, r4, #576 ; 0x240 + 1f3b7bc: eb000d8f bl 1f3ee00 + 1f3b7c0: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3b7c4: e34011f6 movt r1, #502 ; 0x1f6 + 1f3b7c8: e1a00006 mov r0, r6 + 1f3b7cc: e2845f89 add r5, r4, #548 ; 0x224 + 1f3b7d0: eb0010f1 bl 1f3fb9c + 1f3b7d4: e3500000 cmp r0, #0 + 1f3b7d8: e2855002 add r5, r5, #2 + 1f3b7dc: 0afffff2 beq 1f3b7ac > >, __gnu_cxx::__ops::_Val_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Val_comp_iter)+0x28> + 1f3b7e0: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3b7e4: e34011f6 movt r1, #502 ; 0x1f6 + 1f3b7e8: e1a00004 mov r0, r4 + 1f3b7ec: eb0010ea bl 1f3fb9c + 1f3b7f0: e3500000 cmp r0, #0 + 1f3b7f4: 0a000005 beq 1f3b810 > >, __gnu_cxx::__ops::_Val_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Val_comp_iter)+0x8c> + 1f3b7f8: e5dd300c ldrb r3, [sp, #12] + 1f3b7fc: e3130010 tst r3, #16 + 1f3b800: e554300e ldrb r3, [r4, #-14] + 1f3b804: 1a000007 bne 1f3b828 > >, __gnu_cxx::__ops::_Val_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Val_comp_iter)+0xa4> + 1f3b808: e3130010 tst r3, #16 + 1f3b80c: 0a000007 beq 1f3b830 > >, __gnu_cxx::__ops::_Val_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Val_comp_iter)+0xac> + 1f3b810: e1a0100d mov r1, sp + 1f3b814: e1a00005 mov r0, r5 + 1f3b818: e3a02d09 mov r2, #576 ; 0x240 + 1f3b81c: eb000d77 bl 1f3ee00 + 1f3b820: e28ddd09 add sp, sp, #576 ; 0x240 + 1f3b824: e8bd8070 pop {r4, r5, r6, pc} + 1f3b828: e3130010 tst r3, #16 + 1f3b82c: 0affffde beq 1f3b7ac > >, __gnu_cxx::__ops::_Val_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Val_comp_iter)+0x28> + 1f3b830: e1a01004 mov r1, r4 + 1f3b834: e1a00006 mov r0, r6 + 1f3b838: eb0010d7 bl 1f3fb9c + 1f3b83c: e3500000 cmp r0, #0 + 1f3b840: baffffd9 blt 1f3b7ac > >, __gnu_cxx::__ops::_Val_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Val_comp_iter)+0x28> + 1f3b844: eafffff1 b 1f3b810 > >, __gnu_cxx::__ops::_Val_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Val_comp_iter)+0x8c> + +01f3b848 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)>: + 1f3b848: e2423001 sub r3, r2, #1 + 1f3b84c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f3b850: e0833fa3 add r3, r3, r3, lsr #31 + 1f3b854: e1a08000 mov r8, r0 + 1f3b858: e24ddf97 sub sp, sp, #604 ; 0x25c + 1f3b85c: e1a030c3 asr r3, r3, #1 + 1f3b860: e1510003 cmp r1, r3 + 1f3b864: e58d2010 str r2, [sp, #16] + 1f3b868: e58d1014 str r1, [sp, #20] + 1f3b86c: e58d3004 str r3, [sp, #4] + 1f3b870: aa000091 bge 1f3babc > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x274> + 1f3b874: e1a07001 mov r7, r1 + 1f3b878: ea000009 b 1f3b8a4 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x5c> + 1f3b87c: e1a00487 lsl r0, r7, #9 + 1f3b880: e1a01003 mov r1, r3 + 1f3b884: e0800307 add r0, r0, r7, lsl #6 + 1f3b888: e3a02d09 mov r2, #576 ; 0x240 + 1f3b88c: e0880000 add r0, r8, r0 + 1f3b890: eb000d5a bl 1f3ee00 + 1f3b894: e59d3004 ldr r3, [sp, #4] + 1f3b898: e1540003 cmp r4, r3 + 1f3b89c: aa000031 bge 1f3b968 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x120> + 1f3b8a0: e1a07004 mov r7, r4 + 1f3b8a4: e2875001 add r5, r7, #1 + 1f3b8a8: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3b8ac: e34011f6 movt r1, #502 ; 0x1f6 + 1f3b8b0: e1a03505 lsl r3, r5, #10 + 1f3b8b4: e1a0a085 lsl sl, r5, #1 + 1f3b8b8: e0835385 add r5, r3, r5, lsl #7 + 1f3b8bc: e24a4001 sub r4, sl, #1 + 1f3b8c0: e0889005 add r9, r8, r5 + 1f3b8c4: e289b01a add fp, r9, #26 + 1f3b8c8: e1a06484 lsl r6, r4, #9 + 1f3b8cc: e1a0000b mov r0, fp + 1f3b8d0: e0866304 add r6, r6, r4, lsl #6 + 1f3b8d4: eb0010b0 bl 1f3fb9c + 1f3b8d8: e3500000 cmp r0, #0 + 1f3b8dc: e0883006 add r3, r8, r6 + 1f3b8e0: 0affffe5 beq 1f3b87c > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x34> + 1f3b8e4: e283201a add r2, r3, #26 + 1f3b8e8: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3b8ec: e34011f6 movt r1, #502 ; 0x1f6 + 1f3b8f0: e1a00002 mov r0, r2 + 1f3b8f4: e58d300c str r3, [sp, #12] + 1f3b8f8: e58d2008 str r2, [sp, #8] + 1f3b8fc: eb0010a6 bl 1f3fb9c + 1f3b900: e3500000 cmp r0, #0 + 1f3b904: 0a000007 beq 1f3b928 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0xe0> + 1f3b908: e5d9100c ldrb r1, [r9, #12] + 1f3b90c: e59d300c ldr r3, [sp, #12] + 1f3b910: e3110010 tst r1, #16 + 1f3b914: e59d2008 ldr r2, [sp, #8] + 1f3b918: e5d3100c ldrb r1, [r3, #12] + 1f3b91c: 1a000005 bne 1f3b938 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0xf0> + 1f3b920: e3110010 tst r1, #16 + 1f3b924: 0a000005 beq 1f3b940 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0xf8> + 1f3b928: e1a03009 mov r3, r9 + 1f3b92c: e1a06005 mov r6, r5 + 1f3b930: e1a0400a mov r4, sl + 1f3b934: eaffffd0 b 1f3b87c > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x34> + 1f3b938: e3110010 tst r1, #16 + 1f3b93c: 0affffce beq 1f3b87c > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x34> + 1f3b940: e1a01002 mov r1, r2 + 1f3b944: e1a0000b mov r0, fp + 1f3b948: e58d3008 str r3, [sp, #8] + 1f3b94c: eb001092 bl 1f3fb9c + 1f3b950: e3500000 cmp r0, #0 + 1f3b954: e59d3008 ldr r3, [sp, #8] + 1f3b958: a1a06005 movge r6, r5 + 1f3b95c: a1a03009 movge r3, r9 + 1f3b960: a1a0400a movge r4, sl + 1f3b964: eaffffc4 b 1f3b87c > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x34> + 1f3b968: e59d3010 ldr r3, [sp, #16] + 1f3b96c: e3130001 tst r3, #1 + 1f3b970: 1a000003 bne 1f3b984 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x13c> + 1f3b974: e2433002 sub r3, r3, #2 + 1f3b978: e0833fa3 add r3, r3, r3, lsr #31 + 1f3b97c: e15400c3 cmp r4, r3, asr #1 + 1f3b980: 0a00000e beq 1f3b9c0 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x178> + 1f3b984: e28d5018 add r5, sp, #24 + 1f3b988: e3a02d09 mov r2, #576 ; 0x240 + 1f3b98c: e1a00005 mov r0, r5 + 1f3b990: e28d1d0a add r1, sp, #640 ; 0x280 + 1f3b994: eb000d19 bl 1f3ee00 + 1f3b998: e59d3014 ldr r3, [sp, #20] + 1f3b99c: e1540003 cmp r4, r3 + 1f3b9a0: ca00000f bgt 1f3b9e4 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x19c> + 1f3b9a4: e0886006 add r6, r8, r6 + 1f3b9a8: e1a01005 mov r1, r5 + 1f3b9ac: e1a00006 mov r0, r6 + 1f3b9b0: e3a02d09 mov r2, #576 ; 0x240 + 1f3b9b4: eb000d11 bl 1f3ee00 + 1f3b9b8: e28ddf97 add sp, sp, #604 ; 0x25c + 1f3b9bc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f3b9c0: e1a04084 lsl r4, r4, #1 + 1f3b9c4: e0880006 add r0, r8, r6 + 1f3b9c8: e2844001 add r4, r4, #1 + 1f3b9cc: e3a02d09 mov r2, #576 ; 0x240 + 1f3b9d0: e1a06484 lsl r6, r4, #9 + 1f3b9d4: e0866304 add r6, r6, r4, lsl #6 + 1f3b9d8: e0881006 add r1, r8, r6 + 1f3b9dc: eb000d07 bl 1f3ee00 + 1f3b9e0: eaffffe7 b 1f3b984 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x13c> + 1f3b9e4: e2449001 sub r9, r4, #1 + 1f3b9e8: e285701a add r7, r5, #26 + 1f3b9ec: e1a0a003 mov sl, r3 + 1f3b9f0: e0899fa9 add r9, r9, r9, lsr #31 + 1f3b9f4: e1a090c9 asr r9, r9, #1 + 1f3b9f8: ea00000c b 1f3ba30 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x1e8> + 1f3b9fc: e1a00484 lsl r0, r4, #9 + 1f3ba00: e3a02d09 mov r2, #576 ; 0x240 + 1f3ba04: e0800304 add r0, r0, r4, lsl #6 + 1f3ba08: e1a01006 mov r1, r6 + 1f3ba0c: e0880000 add r0, r8, r0 + 1f3ba10: eb000cfa bl 1f3ee00 + 1f3ba14: e2493001 sub r3, r9, #1 + 1f3ba18: e15a0009 cmp sl, r9 + 1f3ba1c: e0833fa3 add r3, r3, r3, lsr #31 + 1f3ba20: e1a030c3 asr r3, r3, #1 + 1f3ba24: aaffffdf bge 1f3b9a8 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x160> + 1f3ba28: e1a04009 mov r4, r9 + 1f3ba2c: e1a09003 mov r9, r3 + 1f3ba30: e1a06489 lsl r6, r9, #9 + 1f3ba34: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3ba38: e34011f6 movt r1, #502 ; 0x1f6 + 1f3ba3c: e0866309 add r6, r6, r9, lsl #6 + 1f3ba40: e0886006 add r6, r8, r6 + 1f3ba44: e286b01a add fp, r6, #26 + 1f3ba48: e1a0000b mov r0, fp + 1f3ba4c: eb001052 bl 1f3fb9c + 1f3ba50: e3500000 cmp r0, #0 + 1f3ba54: 0affffe8 beq 1f3b9fc > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x1b4> + 1f3ba58: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3ba5c: e34011f6 movt r1, #502 ; 0x1f6 + 1f3ba60: e1a00007 mov r0, r7 + 1f3ba64: eb00104c bl 1f3fb9c + 1f3ba68: e3500000 cmp r0, #0 + 1f3ba6c: 0a000005 beq 1f3ba88 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x240> + 1f3ba70: e5d6300c ldrb r3, [r6, #12] + 1f3ba74: e3130010 tst r3, #16 + 1f3ba78: e5dd3024 ldrb r3, [sp, #36] ; 0x24 + 1f3ba7c: 1a000004 bne 1f3ba94 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x24c> + 1f3ba80: e3130010 tst r3, #16 + 1f3ba84: 0a000004 beq 1f3ba9c > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x254> + 1f3ba88: e1a06484 lsl r6, r4, #9 + 1f3ba8c: e0866304 add r6, r6, r4, lsl #6 + 1f3ba90: eaffffc3 b 1f3b9a4 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x15c> + 1f3ba94: e3130010 tst r3, #16 + 1f3ba98: 0affffd7 beq 1f3b9fc > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x1b4> + 1f3ba9c: e1a0000b mov r0, fp + 1f3baa0: e1a01007 mov r1, r7 + 1f3baa4: eb00103c bl 1f3fb9c + 1f3baa8: e3500000 cmp r0, #0 + 1f3baac: baffffd2 blt 1f3b9fc > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x1b4> + 1f3bab0: e1a06484 lsl r6, r4, #9 + 1f3bab4: e0866304 add r6, r6, r4, lsl #6 + 1f3bab8: eaffffb9 b 1f3b9a4 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x15c> + 1f3babc: e59d3010 ldr r3, [sp, #16] + 1f3bac0: e3130001 tst r3, #1 + 1f3bac4: 1a000004 bne 1f3badc > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x294> + 1f3bac8: e1a06481 lsl r6, r1, #9 + 1f3bacc: e1a04001 mov r4, r1 + 1f3bad0: e0866301 add r6, r6, r1, lsl #6 + 1f3bad4: e59d3010 ldr r3, [sp, #16] + 1f3bad8: eaffffa5 b 1f3b974 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x12c> + 1f3badc: e28d5018 add r5, sp, #24 + 1f3bae0: e3a02d09 mov r2, #576 ; 0x240 + 1f3bae4: e1a00005 mov r0, r5 + 1f3bae8: e28d1d0a add r1, sp, #640 ; 0x280 + 1f3baec: eb000cc3 bl 1f3ee00 + 1f3baf0: e59d3014 ldr r3, [sp, #20] + 1f3baf4: e1a06483 lsl r6, r3, #9 + 1f3baf8: e0866303 add r6, r6, r3, lsl #6 + 1f3bafc: e0886006 add r6, r8, r6 + 1f3bb00: eaffffa8 b 1f3b9a8 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)+0x160> + +01f3bb04 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)>: + 1f3bb04: e0602002 rsb r2, r0, r2 + 1f3bb08: e92d43f0 push {r4, r5, r6, r7, r8, r9, lr} + 1f3bb0c: e1a02342 asr r2, r2, #6 + 1f3bb10: e3086e39 movw r6, #36409 ; 0x8e39 + 1f3bb14: e34368e3 movt r6, #14563 ; 0x38e3 + 1f3bb18: e24ddd12 sub sp, sp, #1152 ; 0x480 + 1f3bb1c: e0060296 mul r6, r6, r2 + 1f3bb20: e24dd00c sub sp, sp, #12 + 1f3bb24: e3560001 cmp r6, #1 + 1f3bb28: da000018 ble 1f3bb90 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x8c> + 1f3bb2c: e2464002 sub r4, r6, #2 + 1f3bb30: e1a09003 mov r9, r3 + 1f3bb34: e1a07000 mov r7, r0 + 1f3bb38: e3a05000 mov r5, #0 + 1f3bb3c: e1a040c4 asr r4, r4, #1 + 1f3bb40: e1a08484 lsl r8, r4, #9 + 1f3bb44: e0888304 add r8, r8, r4, lsl #6 + 1f3bb48: e0808008 add r8, r0, r8 + 1f3bb4c: e0881005 add r1, r8, r5 + 1f3bb50: e3a02d09 mov r2, #576 ; 0x240 + 1f3bb54: e28d0f92 add r0, sp, #584 ; 0x248 + 1f3bb58: e2455d09 sub r5, r5, #576 ; 0x240 + 1f3bb5c: eb000ca7 bl 1f3ee00 + 1f3bb60: e3a02d09 mov r2, #576 ; 0x240 + 1f3bb64: e28d1f92 add r1, sp, #584 ; 0x248 + 1f3bb68: e1a0000d mov r0, sp + 1f3bb6c: e5cd9240 strb r9, [sp, #576] ; 0x240 + 1f3bb70: eb000ca2 bl 1f3ee00 + 1f3bb74: e1a01004 mov r1, r4 + 1f3bb78: e1a02006 mov r2, r6 + 1f3bb7c: e1a00007 mov r0, r7 + 1f3bb80: ebffff30 bl 1f3b848 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)> + 1f3bb84: e3540000 cmp r4, #0 + 1f3bb88: e2444001 sub r4, r4, #1 + 1f3bb8c: 1affffee bne 1f3bb4c > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)+0x48> + 1f3bb90: e28ddd12 add sp, sp, #1152 ; 0x480 + 1f3bb94: e28dd00c add sp, sp, #12 + 1f3bb98: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + +01f3bb9c > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)>: + 1f3bb9c: e92d40f0 push {r4, r5, r6, r7, lr} + 1f3bba0: e1a05000 mov r5, r0 + 1f3bba4: e3a06d09 mov r6, #576 ; 0x240 + 1f3bba8: e24ddd12 sub sp, sp, #1152 ; 0x480 + 1f3bbac: e1a04002 mov r4, r2 + 1f3bbb0: e24dd00c sub sp, sp, #12 + 1f3bbb4: e1a02006 mov r2, r6 + 1f3bbb8: e28d0f92 add r0, sp, #584 ; 0x248 + 1f3bbbc: e0654004 rsb r4, r5, r4 + 1f3bbc0: e59d14a0 ldr r1, [sp, #1184] ; 0x4a0 + 1f3bbc4: e1a04344 asr r4, r4, #6 + 1f3bbc8: e5dd74a4 ldrb r7, [sp, #1188] ; 0x4a4 + 1f3bbcc: eb000c8b bl 1f3ee00 + 1f3bbd0: e1a02006 mov r2, r6 + 1f3bbd4: e1a01005 mov r1, r5 + 1f3bbd8: e59d04a0 ldr r0, [sp, #1184] ; 0x4a0 + 1f3bbdc: eb000c87 bl 1f3ee00 + 1f3bbe0: e3083e39 movw r3, #36409 ; 0x8e39 + 1f3bbe4: e34338e3 movt r3, #14563 ; 0x38e3 + 1f3bbe8: e1a02006 mov r2, r6 + 1f3bbec: e28d1f92 add r1, sp, #584 ; 0x248 + 1f3bbf0: e0040493 mul r4, r3, r4 + 1f3bbf4: e1a0000d mov r0, sp + 1f3bbf8: e5cd7240 strb r7, [sp, #576] ; 0x240 + 1f3bbfc: eb000c7f bl 1f3ee00 + 1f3bc00: e1a02004 mov r2, r4 + 1f3bc04: e1a00005 mov r0, r5 + 1f3bc08: e3a01000 mov r1, #0 + 1f3bc0c: ebffff0d bl 1f3b848 > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter)> + 1f3bc10: e28ddd12 add sp, sp, #1152 ; 0x480 + 1f3bc14: e28dd00c add sp, sp, #12 + 1f3bc18: e8bd80f0 pop {r4, r5, r6, r7, pc} + +01f3bc1c (FileBrowser::BrowsableList::Entry&, FileBrowser::BrowsableList::Entry&)>: + 1f3bc1c: e92d4070 push {r4, r5, r6, lr} + 1f3bc20: e1a06000 mov r6, r0 + 1f3bc24: e3a04d09 mov r4, #576 ; 0x240 + 1f3bc28: e24ddd09 sub sp, sp, #576 ; 0x240 + 1f3bc2c: e1a05001 mov r5, r1 + 1f3bc30: e1a02004 mov r2, r4 + 1f3bc34: e1a01006 mov r1, r6 + 1f3bc38: e1a0000d mov r0, sp + 1f3bc3c: eb000c6f bl 1f3ee00 + 1f3bc40: e1a02004 mov r2, r4 + 1f3bc44: e1a01005 mov r1, r5 + 1f3bc48: e1a00006 mov r0, r6 + 1f3bc4c: eb000c6b bl 1f3ee00 + 1f3bc50: e1a02004 mov r2, r4 + 1f3bc54: e1a0100d mov r1, sp + 1f3bc58: e1a00005 mov r0, r5 + 1f3bc5c: eb000c67 bl 1f3ee00 + 1f3bc60: e28ddd09 add sp, sp, #576 ; 0x240 + 1f3bc64: e8bd8070 pop {r4, r5, r6, pc} + +01f3bc68 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)>: + 1f3bc68: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f3bc6c: e060c002 rsb ip, r0, r2 + 1f3bc70: e1a0e002 mov lr, r2 + 1f3bc74: e24dd02c sub sp, sp, #44 ; 0x2c + 1f3bc78: e35c0d99 cmp ip, #9792 ; 0x2640 + 1f3bc7c: e5dd1050 ldrb r1, [sp, #80] ; 0x50 + 1f3bc80: e58d2010 str r2, [sp, #16] + 1f3bc84: e58d3014 str r3, [sp, #20] + 1f3bc88: e5cd1050 strb r1, [sp, #80] ; 0x50 + 1f3bc8c: ba000112 blt 1f3c0dc > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x474> + 1f3bc90: e3530000 cmp r3, #0 + 1f3bc94: e1a09000 mov r9, r0 + 1f3bc98: 0a000117 beq 1f3c0fc > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x494> + 1f3bc9c: e1a03002 mov r3, r2 + 1f3bca0: e2802d09 add r2, r0, #576 ; 0x240 + 1f3bca4: e58d2024 str r2, [sp, #36] ; 0x24 + 1f3bca8: e282201a add r2, r2, #26 + 1f3bcac: e58d2018 str r2, [sp, #24] + 1f3bcb0: e2802d12 add r2, r0, #1152 ; 0x480 + 1f3bcb4: e58d201c str r2, [sp, #28] + 1f3bcb8: e3081e39 movw r1, #36409 ; 0x8e39 + 1f3bcbc: e34318e3 movt r1, #14563 ; 0x38e3 + 1f3bcc0: e58d1020 str r1, [sp, #32] + 1f3bcc4: e59d2014 ldr r2, [sp, #20] + 1f3bcc8: e280401a add r4, r0, #26 + 1f3bccc: e2422001 sub r2, r2, #1 + 1f3bcd0: e58d2014 str r2, [sp, #20] + 1f3bcd4: e59d2010 ldr r2, [sp, #16] + 1f3bcd8: e0693003 rsb r3, r9, r3 + 1f3bcdc: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3bce0: e34011f6 movt r1, #502 ; 0x1f6 + 1f3bce4: e2427d09 sub r7, r2, #576 ; 0x240 + 1f3bce8: e59d2020 ldr r2, [sp, #32] + 1f3bcec: e1a03343 asr r3, r3, #6 + 1f3bcf0: e59d0018 ldr r0, [sp, #24] + 1f3bcf4: e0030392 mul r3, r2, r3 + 1f3bcf8: e0833fa3 add r3, r3, r3, lsr #31 + 1f3bcfc: e1a030c3 asr r3, r3, #1 + 1f3bd00: e1a05483 lsl r5, r3, #9 + 1f3bd04: e0853303 add r3, r5, r3, lsl #6 + 1f3bd08: e0895003 add r5, r9, r3 + 1f3bd0c: eb000fa2 bl 1f3fb9c + 1f3bd10: e3500000 cmp r0, #0 + 1f3bd14: e285601a add r6, r5, #26 + 1f3bd18: 1a00005f bne 1f3be9c > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x234> + 1f3bd1c: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3bd20: e34011f6 movt r1, #502 ; 0x1f6 + 1f3bd24: e1a00006 mov r0, r6 + 1f3bd28: eb000f9b bl 1f3fb9c + 1f3bd2c: e3500000 cmp r0, #0 + 1f3bd30: 1a00006f bne 1f3bef4 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x28c> + 1f3bd34: e1a01005 mov r1, r5 + 1f3bd38: e1a00009 mov r0, r9 + 1f3bd3c: ebffffb6 bl 1f3bc1c (FileBrowser::BrowsableList::Entry&, FileBrowser::BrowsableList::Entry&)> + 1f3bd40: e59d8018 ldr r8, [sp, #24] + 1f3bd44: e59d701c ldr r7, [sp, #28] + 1f3bd48: e59d5010 ldr r5, [sp, #16] + 1f3bd4c: ea000001 b 1f3bd58 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0xf0> + 1f3bd50: e2888d09 add r8, r8, #576 ; 0x240 + 1f3bd54: e2877d09 add r7, r7, #576 ; 0x240 + 1f3bd58: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3bd5c: e34011f6 movt r1, #502 ; 0x1f6 + 1f3bd60: e1a00008 mov r0, r8 + 1f3bd64: e2476d09 sub r6, r7, #576 ; 0x240 + 1f3bd68: eb000f8b bl 1f3fb9c + 1f3bd6c: e3500000 cmp r0, #0 + 1f3bd70: e58d600c str r6, [sp, #12] + 1f3bd74: 0afffff5 beq 1f3bd50 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0xe8> + 1f3bd78: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3bd7c: e34011f6 movt r1, #502 ; 0x1f6 + 1f3bd80: e1a00004 mov r0, r4 + 1f3bd84: eb000f84 bl 1f3fb9c + 1f3bd88: e3500000 cmp r0, #0 + 1f3bd8c: 0a000005 beq 1f3bda8 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x140> + 1f3bd90: e5573234 ldrb r3, [r7, #-564] ; 0xfffffdcc + 1f3bd94: e3130010 tst r3, #16 + 1f3bd98: e5d9300c ldrb r3, [r9, #12] + 1f3bd9c: 1a000036 bne 1f3be7c > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x214> + 1f3bda0: e3130010 tst r3, #16 + 1f3bda4: 0a000036 beq 1f3be84 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x21c> + 1f3bda8: e245ad09 sub sl, r5, #576 ; 0x240 + 1f3bdac: ea000000 b 1f3bdb4 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x14c> + 1f3bdb0: e24aad09 sub sl, sl, #576 ; 0x240 + 1f3bdb4: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3bdb8: e34011f6 movt r1, #502 ; 0x1f6 + 1f3bdbc: e1a00004 mov r0, r4 + 1f3bdc0: e1a0500a mov r5, sl + 1f3bdc4: eb000f74 bl 1f3fb9c + 1f3bdc8: e3500000 cmp r0, #0 + 1f3bdcc: 0afffff7 beq 1f3bdb0 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x148> + 1f3bdd0: e28ab01a add fp, sl, #26 + 1f3bdd4: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3bdd8: e34011f6 movt r1, #502 ; 0x1f6 + 1f3bddc: e1a0000b mov r0, fp + 1f3bde0: eb000f6d bl 1f3fb9c + 1f3bde4: e3500000 cmp r0, #0 + 1f3bde8: 0a000005 beq 1f3be04 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x19c> + 1f3bdec: e5d9300c ldrb r3, [r9, #12] + 1f3bdf0: e3130010 tst r3, #16 + 1f3bdf4: e5da300c ldrb r3, [sl, #12] + 1f3bdf8: 1a000007 bne 1f3be1c > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x1b4> + 1f3bdfc: e3130010 tst r3, #16 + 1f3be00: 0a000007 beq 1f3be24 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x1bc> + 1f3be04: e156000a cmp r6, sl + 1f3be08: 2a00000c bcs 1f3be40 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x1d8> + 1f3be0c: e1a0100a mov r1, sl + 1f3be10: e1a00006 mov r0, r6 + 1f3be14: ebffff80 bl 1f3bc1c (FileBrowser::BrowsableList::Entry&, FileBrowser::BrowsableList::Entry&)> + 1f3be18: eaffffcc b 1f3bd50 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0xe8> + 1f3be1c: e3130010 tst r3, #16 + 1f3be20: 0affffe2 beq 1f3bdb0 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x148> + 1f3be24: e1a0100b mov r1, fp + 1f3be28: e1a00004 mov r0, r4 + 1f3be2c: eb000f5a bl 1f3fb9c + 1f3be30: e3500000 cmp r0, #0 + 1f3be34: baffffdd blt 1f3bdb0 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x148> + 1f3be38: e156000a cmp r6, sl + 1f3be3c: 3afffff2 bcc 1f3be0c > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x1a4> + 1f3be40: e5dd3050 ldrb r3, [sp, #80] ; 0x50 + 1f3be44: e1a00006 mov r0, r6 + 1f3be48: e5cd3000 strb r3, [sp] + 1f3be4c: e59d2010 ldr r2, [sp, #16] + 1f3be50: e59d3014 ldr r3, [sp, #20] + 1f3be54: ebffff83 bl 1f3bc68 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)> + 1f3be58: e0692006 rsb r2, r9, r6 + 1f3be5c: e3520d99 cmp r2, #9792 ; 0x2640 + 1f3be60: e1a03006 mov r3, r6 + 1f3be64: ba00009c blt 1f3c0dc > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x474> + 1f3be68: e59d2014 ldr r2, [sp, #20] + 1f3be6c: e3520000 cmp r2, #0 + 1f3be70: 0a000089 beq 1f3c09c > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x434> + 1f3be74: e58d3010 str r3, [sp, #16] + 1f3be78: eaffff93 b 1f3bccc > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x64> + 1f3be7c: e3130010 tst r3, #16 + 1f3be80: 0affffb2 beq 1f3bd50 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0xe8> + 1f3be84: e1a01004 mov r1, r4 + 1f3be88: e1a00008 mov r0, r8 + 1f3be8c: eb000f42 bl 1f3fb9c + 1f3be90: e3500000 cmp r0, #0 + 1f3be94: aaffffc3 bge 1f3bda8 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x140> + 1f3be98: eaffffac b 1f3bd50 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0xe8> + 1f3be9c: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3bea0: e34011f6 movt r1, #502 ; 0x1f6 + 1f3bea4: e1a00006 mov r0, r6 + 1f3bea8: eb000f3b bl 1f3fb9c + 1f3beac: e3500000 cmp r0, #0 + 1f3beb0: 0a000005 beq 1f3becc > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x264> + 1f3beb4: e5d9324c ldrb r3, [r9, #588] ; 0x24c + 1f3beb8: e3130010 tst r3, #16 + 1f3bebc: e5d5300c ldrb r3, [r5, #12] + 1f3bec0: 1a00006d bne 1f3c07c > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x414> + 1f3bec4: e3130010 tst r3, #16 + 1f3bec8: 0a00006d beq 1f3c084 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x41c> + 1f3becc: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3bed0: e34011f6 movt r1, #502 ; 0x1f6 + 1f3bed4: e59d0018 ldr r0, [sp, #24] + 1f3bed8: eb000f2f bl 1f3fb9c + 1f3bedc: e3500000 cmp r0, #0 + 1f3bee0: 1a000023 bne 1f3bf74 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x30c> + 1f3bee4: e59d1024 ldr r1, [sp, #36] ; 0x24 + 1f3bee8: e1a00009 mov r0, r9 + 1f3beec: ebffff4a bl 1f3bc1c (FileBrowser::BrowsableList::Entry&, FileBrowser::BrowsableList::Entry&)> + 1f3bef0: eaffff92 b 1f3bd40 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0xd8> + 1f3bef4: e287801a add r8, r7, #26 + 1f3bef8: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3befc: e34011f6 movt r1, #502 ; 0x1f6 + 1f3bf00: e1a00008 mov r0, r8 + 1f3bf04: eb000f24 bl 1f3fb9c + 1f3bf08: e3500000 cmp r0, #0 + 1f3bf0c: 0a000006 beq 1f3bf2c > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x2c4> + 1f3bf10: e5d5300c ldrb r3, [r5, #12] + 1f3bf14: e3130010 tst r3, #16 + 1f3bf18: e59d3010 ldr r3, [sp, #16] + 1f3bf1c: e5533234 ldrb r3, [r3, #-564] ; 0xfffffdcc + 1f3bf20: 1a00000b bne 1f3bf54 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x2ec> + 1f3bf24: e3130010 tst r3, #16 + 1f3bf28: 0a00000b beq 1f3bf5c > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x2f4> + 1f3bf2c: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3bf30: e34011f6 movt r1, #502 ; 0x1f6 + 1f3bf34: e59d0018 ldr r0, [sp, #24] + 1f3bf38: eb000f17 bl 1f3fb9c + 1f3bf3c: e3500000 cmp r0, #0 + 1f3bf40: 1a00003a bne 1f3c030 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x3c8> + 1f3bf44: e1a01007 mov r1, r7 + 1f3bf48: e1a00009 mov r0, r9 + 1f3bf4c: ebffff32 bl 1f3bc1c (FileBrowser::BrowsableList::Entry&, FileBrowser::BrowsableList::Entry&)> + 1f3bf50: eaffff7a b 1f3bd40 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0xd8> + 1f3bf54: e3130010 tst r3, #16 + 1f3bf58: 0affff75 beq 1f3bd34 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0xcc> + 1f3bf5c: e1a00006 mov r0, r6 + 1f3bf60: e1a01008 mov r1, r8 + 1f3bf64: eb000f0c bl 1f3fb9c + 1f3bf68: e3500000 cmp r0, #0 + 1f3bf6c: aaffffee bge 1f3bf2c > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x2c4> + 1f3bf70: eaffff6f b 1f3bd34 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0xcc> + 1f3bf74: e287801a add r8, r7, #26 + 1f3bf78: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3bf7c: e34011f6 movt r1, #502 ; 0x1f6 + 1f3bf80: e1a00008 mov r0, r8 + 1f3bf84: eb000f04 bl 1f3fb9c + 1f3bf88: e3500000 cmp r0, #0 + 1f3bf8c: 0a000006 beq 1f3bfac > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x344> + 1f3bf90: e5d9324c ldrb r3, [r9, #588] ; 0x24c + 1f3bf94: e3130010 tst r3, #16 + 1f3bf98: e59d3010 ldr r3, [sp, #16] + 1f3bf9c: e5533234 ldrb r3, [r3, #-564] ; 0xfffffdcc + 1f3bfa0: 1a00001a bne 1f3c010 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x3a8> + 1f3bfa4: e3130010 tst r3, #16 + 1f3bfa8: 0a00001a beq 1f3c018 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x3b0> + 1f3bfac: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3bfb0: e34011f6 movt r1, #502 ; 0x1f6 + 1f3bfb4: e1a00006 mov r0, r6 + 1f3bfb8: eb000ef7 bl 1f3fb9c + 1f3bfbc: e3500000 cmp r0, #0 + 1f3bfc0: 0affffdf beq 1f3bf44 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x2dc> + 1f3bfc4: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3bfc8: e34011f6 movt r1, #502 ; 0x1f6 + 1f3bfcc: e1a00008 mov r0, r8 + 1f3bfd0: eb000ef1 bl 1f3fb9c + 1f3bfd4: e3500000 cmp r0, #0 + 1f3bfd8: 0affff55 beq 1f3bd34 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0xcc> + 1f3bfdc: e5d5300c ldrb r3, [r5, #12] + 1f3bfe0: e3130010 tst r3, #16 + 1f3bfe4: e59d3010 ldr r3, [sp, #16] + 1f3bfe8: e5533234 ldrb r3, [r3, #-564] ; 0xfffffdcc + 1f3bfec: 0a00003c beq 1f3c0e4 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x47c> + 1f3bff0: e3130010 tst r3, #16 + 1f3bff4: 0affffd2 beq 1f3bf44 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x2dc> + 1f3bff8: e1a01008 mov r1, r8 + 1f3bffc: e1a00006 mov r0, r6 + 1f3c000: eb000ee5 bl 1f3fb9c + 1f3c004: e3500000 cmp r0, #0 + 1f3c008: aaffff49 bge 1f3bd34 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0xcc> + 1f3c00c: eaffffcc b 1f3bf44 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x2dc> + 1f3c010: e3130010 tst r3, #16 + 1f3c014: 0affffb2 beq 1f3bee4 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x27c> + 1f3c018: e1a01008 mov r1, r8 + 1f3c01c: e59d0018 ldr r0, [sp, #24] + 1f3c020: eb000edd bl 1f3fb9c + 1f3c024: e3500000 cmp r0, #0 + 1f3c028: aaffffdf bge 1f3bfac > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x344> + 1f3c02c: eaffffac b 1f3bee4 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x27c> + 1f3c030: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3c034: e34011f6 movt r1, #502 ; 0x1f6 + 1f3c038: e1a00008 mov r0, r8 + 1f3c03c: eb000ed6 bl 1f3fb9c + 1f3c040: e3500000 cmp r0, #0 + 1f3c044: 0affffa6 beq 1f3bee4 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x27c> + 1f3c048: e5d9324c ldrb r3, [r9, #588] ; 0x24c + 1f3c04c: e3130010 tst r3, #16 + 1f3c050: e59d3010 ldr r3, [sp, #16] + 1f3c054: e5533234 ldrb r3, [r3, #-564] ; 0xfffffdcc + 1f3c058: 0a000024 beq 1f3c0f0 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x488> + 1f3c05c: e3130010 tst r3, #16 + 1f3c060: 0affffb7 beq 1f3bf44 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x2dc> + 1f3c064: e1a01008 mov r1, r8 + 1f3c068: e59d0018 ldr r0, [sp, #24] + 1f3c06c: eb000eca bl 1f3fb9c + 1f3c070: e3500000 cmp r0, #0 + 1f3c074: aaffff9a bge 1f3bee4 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x27c> + 1f3c078: eaffffb1 b 1f3bf44 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x2dc> + 1f3c07c: e3130010 tst r3, #16 + 1f3c080: 0affff25 beq 1f3bd1c > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0xb4> + 1f3c084: e1a01006 mov r1, r6 + 1f3c088: e59d0018 ldr r0, [sp, #24] + 1f3c08c: eb000ec2 bl 1f3fb9c + 1f3c090: e3500000 cmp r0, #0 + 1f3c094: aaffff8c bge 1f3becc > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x264> + 1f3c098: eaffff1f b 1f3bd1c > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0xb4> + 1f3c09c: e5dd3050 ldrb r3, [sp, #80] ; 0x50 + 1f3c0a0: e1a02006 mov r2, r6 + 1f3c0a4: e1a00009 mov r0, r9 + 1f3c0a8: e1a04003 mov r4, r3 + 1f3c0ac: ebfffe94 bl 1f3bb04 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)> + 1f3c0b0: e59d300c ldr r3, [sp, #12] + 1f3c0b4: e243ad09 sub sl, r3, #576 ; 0x240 + 1f3c0b8: e1a0200a mov r2, sl + 1f3c0bc: e58da000 str sl, [sp] + 1f3c0c0: e5cd4004 strb r4, [sp, #4] + 1f3c0c4: e1a00009 mov r0, r9 + 1f3c0c8: ebfffeb3 bl 1f3bb9c > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)> + 1f3c0cc: e069300a rsb r3, r9, sl + 1f3c0d0: e3530d12 cmp r3, #1152 ; 0x480 + 1f3c0d4: e24aad09 sub sl, sl, #576 ; 0x240 + 1f3c0d8: aafffff6 bge 1f3c0b8 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x450> + 1f3c0dc: e28dd02c add sp, sp, #44 ; 0x2c + 1f3c0e0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f3c0e4: e3130010 tst r3, #16 + 1f3c0e8: 1affff11 bne 1f3bd34 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0xcc> + 1f3c0ec: eaffffc1 b 1f3bff8 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x390> + 1f3c0f0: e3130010 tst r3, #16 + 1f3c0f4: 1affff7a bne 1f3bee4 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x27c> + 1f3c0f8: eaffffd9 b 1f3c064 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x3fc> + 1f3c0fc: e1a03001 mov r3, r1 + 1f3c100: e58d200c str r2, [sp, #12] + 1f3c104: e1a04001 mov r4, r1 + 1f3c108: ebfffe7d bl 1f3bb04 > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)> + 1f3c10c: eaffffe7 b 1f3c0b0 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)+0x448> + +01f3c110 : + 1f3c110: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f3c114: e1a04000 mov r4, r0 + 1f3c118: e3a03000 mov r3, #0 + 1f3c11c: e24ddfa6 sub sp, sp, #664 ; 0x298 + 1f3c120: e30f134c movw r1, #62284 ; 0xf34c + 1f3c124: e34011f5 movt r1, #501 ; 0x1f5 + 1f3c128: e5942004 ldr r2, [r4, #4] + 1f3c12c: e28d0008 add r0, sp, #8 + 1f3c130: e5842008 str r2, [r4, #8] + 1f3c134: e5843010 str r3, [r4, #16] + 1f3c138: e5843014 str r3, [r4, #20] + 1f3c13c: e5843018 str r3, [r4, #24] + 1f3c140: ebff4e6a bl 1f0faf0 + 1f3c144: e3500000 cmp r0, #0 + 1f3c148: 1a000066 bne 1f3c2e8 + 1f3c14c: e2848004 add r8, r4, #4 + 1f3c150: e28d6072 add r6, sp, #114 ; 0x72 + 1f3c154: e28d1058 add r1, sp, #88 ; 0x58 + 1f3c158: e28d0008 add r0, sp, #8 + 1f3c15c: ebff4eec bl 1f0fd14 + 1f3c160: e3a0102e mov r1, #46 ; 0x2e + 1f3c164: e1a05000 mov r5, r0 + 1f3c168: e1a00006 mov r0, r6 + 1f3c16c: eb00105d bl 1f402e8 + 1f3c170: e3550000 cmp r5, #0 + 1f3c174: 0a000063 beq 1f3c308 + 1f3c178: e28d0008 add r0, sp, #8 + 1f3c17c: ebff4ece bl 1f0fcbc + 1f3c180: e30f134c movw r1, #62284 ; 0xf34c + 1f3c184: e34011f5 movt r1, #501 ; 0x1f5 + 1f3c188: e28d0008 add r0, sp, #8 + 1f3c18c: ebff4e57 bl 1f0faf0 + 1f3c190: e3500000 cmp r0, #0 + 1f3c194: 1a000013 bne 1f3c1e8 + 1f3c198: e28d5e19 add r5, sp, #400 ; 0x190 + 1f3c19c: e3086e39 movw r6, #36409 ; 0x8e39 + 1f3c1a0: e34368e3 movt r6, #14563 ; 0x38e3 + 1f3c1a4: e2855002 add r5, r5, #2 + 1f3c1a8: e28d1f5e add r1, sp, #376 ; 0x178 + 1f3c1ac: e28d0008 add r0, sp, #8 + 1f3c1b0: ebff4ed7 bl 1f0fd14 + 1f3c1b4: e3a0102e mov r1, #46 ; 0x2e + 1f3c1b8: e1a09000 mov r9, r0 + 1f3c1bc: e1a00005 mov r0, r5 + 1f3c1c0: eb001048 bl 1f402e8 + 1f3c1c4: e2507000 subs r7, r0, #0 + 1f3c1c8: 0a000068 beq 1f3c370 + 1f3c1cc: e3590000 cmp r9, #0 + 1f3c1d0: 1a000004 bne 1f3c1e8 + 1f3c1d4: e28d3e19 add r3, sp, #400 ; 0x190 + 1f3c1d8: e2833002 add r3, r3, #2 + 1f3c1dc: e1d330d0 ldrsb r3, [r3] + 1f3c1e0: e3530000 cmp r3, #0 + 1f3c1e4: 1a000069 bne 1f3c390 + 1f3c1e8: e28d0008 add r0, sp, #8 + 1f3c1ec: ebff4eb2 bl 1f0fcbc + 1f3c1f0: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3c1f4: e34011f6 movt r1, #502 ; 0x1f6 + 1f3c1f8: e28d0072 add r0, sp, #114 ; 0x72 + 1f3c1fc: eb000f87 bl 1f40020 + 1f3c200: e5940008 ldr r0, [r4, #8] + 1f3c204: e594300c ldr r3, [r4, #12] + 1f3c208: e3a02000 mov r2, #0 + 1f3c20c: e5cd2192 strb r2, [sp, #402] ; 0x192 + 1f3c210: e1500003 cmp r0, r3 + 1f3c214: 0a00008a beq 1f3c444 + 1f3c218: e3500000 cmp r0, #0 + 1f3c21c: 0a000003 beq 1f3c230 + 1f3c220: e28d1058 add r1, sp, #88 ; 0x58 + 1f3c224: e3a02d09 mov r2, #576 ; 0x240 + 1f3c228: eb000af4 bl 1f3ee00 + 1f3c22c: e5940008 ldr r0, [r4, #8] + 1f3c230: e2805d09 add r5, r0, #576 ; 0x240 + 1f3c234: e5845008 str r5, [r4, #8] + 1f3c238: e5947004 ldr r7, [r4, #4] + 1f3c23c: e1570005 cmp r7, r5 + 1f3c240: 01a03005 moveq r3, r5 + 1f3c244: 0a00001d beq 1f3c2c0 + 1f3c248: e0676005 rsb r6, r7, r5 + 1f3c24c: e3083e39 movw r3, #36409 ; 0x8e39 + 1f3c250: e34338e3 movt r3, #14563 ; 0x38e3 + 1f3c254: e1a01346 asr r1, r6, #6 + 1f3c258: e3a02000 mov r2, #0 + 1f3c25c: e1a00007 mov r0, r7 + 1f3c260: e5cd2000 strb r2, [sp] + 1f3c264: e0030193 mul r3, r3, r1 + 1f3c268: e1a02005 mov r2, r5 + 1f3c26c: e16f3f13 clz r3, r3 + 1f3c270: e263301f rsb r3, r3, #31 + 1f3c274: e1a03083 lsl r3, r3, #1 + 1f3c278: ebfffe7a bl 1f3bc68 > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter)> + 1f3c27c: e3560d99 cmp r6, #9792 ; 0x2640 + 1f3c280: ba000064 blt 1f3c418 + 1f3c284: e2876b09 add r6, r7, #9216 ; 0x2400 + 1f3c288: e1a00007 mov r0, r7 + 1f3c28c: e1a02006 mov r2, r6 + 1f3c290: e3a03000 mov r3, #0 + 1f3c294: ebfffcc8 bl 1f3b5bc > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)> + 1f3c298: e1560005 cmp r6, r5 + 1f3c29c: 0a000005 beq 1f3c2b8 + 1f3c2a0: e1a00006 mov r0, r6 + 1f3c2a4: e3a01000 mov r1, #0 + 1f3c2a8: e2866d09 add r6, r6, #576 ; 0x240 + 1f3c2ac: ebfffd34 bl 1f3b784 > >, __gnu_cxx::__ops::_Val_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Val_comp_iter)> + 1f3c2b0: e1550006 cmp r5, r6 + 1f3c2b4: 1afffff9 bne 1f3c2a0 + 1f3c2b8: e5945004 ldr r5, [r4, #4] + 1f3c2bc: e5943008 ldr r3, [r4, #8] + 1f3c2c0: e0653003 rsb r3, r5, r3 + 1f3c2c4: e3082e39 movw r2, #36409 ; 0x8e39 + 1f3c2c8: e34328e3 movt r2, #14563 ; 0x38e3 + 1f3c2cc: e1a03343 asr r3, r3, #6 + 1f3c2d0: e3a01000 mov r1, #0 + 1f3c2d4: e5841014 str r1, [r4, #20] + 1f3c2d8: e0030392 mul r3, r2, r3 + 1f3c2dc: e1530001 cmp r3, r1 + 1f3c2e0: 01a05001 moveq r5, r1 + 1f3c2e4: e5845010 str r5, [r4, #16] + 1f3c2e8: e594203c ldr r2, [r4, #60] ; 0x3c + 1f3c2ec: e3a03000 mov r3, #0 + 1f3c2f0: e5842040 str r2, [r4, #64] ; 0x40 + 1f3c2f4: e5843048 str r3, [r4, #72] ; 0x48 + 1f3c2f8: e584304c str r3, [r4, #76] ; 0x4c + 1f3c2fc: e5843050 str r3, [r4, #80] ; 0x50 + 1f3c300: e28ddfa6 add sp, sp, #664 ; 0x298 + 1f3c304: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3c308: e1dd27d2 ldrsb r2, [sp, #114] ; 0x72 + 1f3c30c: e3520000 cmp r2, #0 + 1f3c310: 0affff98 beq 1f3c178 + 1f3c314: e3500000 cmp r0, #0 + 1f3c318: 0a000004 beq 1f3c330 + 1f3c31c: e30f13c8 movw r1, #62408 ; 0xf3c8 + 1f3c320: e34011f5 movt r1, #501 ; 0x1f5 + 1f3c324: eb000e1c bl 1f3fb9c + 1f3c328: e3500000 cmp r0, #0 + 1f3c32c: 0a00000b beq 1f3c360 + 1f3c330: e5940008 ldr r0, [r4, #8] + 1f3c334: e594300c ldr r3, [r4, #12] + 1f3c338: e1500003 cmp r0, r3 + 1f3c33c: 0a00003c beq 1f3c434 + 1f3c340: e3500000 cmp r0, #0 + 1f3c344: 0a000003 beq 1f3c358 + 1f3c348: e3a02d09 mov r2, #576 ; 0x240 + 1f3c34c: e28d1058 add r1, sp, #88 ; 0x58 + 1f3c350: eb000aaa bl 1f3ee00 + 1f3c354: e5940008 ldr r0, [r4, #8] + 1f3c358: e2800d09 add r0, r0, #576 ; 0x240 + 1f3c35c: e5840008 str r0, [r4, #8] + 1f3c360: e1dd37d2 ldrsb r3, [sp, #114] ; 0x72 + 1f3c364: e3530000 cmp r3, #0 + 1f3c368: 1affff79 bne 1f3c154 + 1f3c36c: eaffff81 b 1f3c178 + 1f3c370: e3590000 cmp r9, #0 + 1f3c374: 1affff9b bne 1f3c1e8 + 1f3c378: e28d3e19 add r3, sp, #400 ; 0x190 + 1f3c37c: e2833002 add r3, r3, #2 + 1f3c380: e1d330d0 ldrsb r3, [r3] + 1f3c384: e3530000 cmp r3, #0 + 1f3c388: 1affff86 bne 1f3c1a8 + 1f3c38c: eaffff95 b 1f3c1e8 + 1f3c390: e30f13c8 movw r1, #62408 ; 0xf3c8 + 1f3c394: e34011f5 movt r1, #501 ; 0x1f5 + 1f3c398: eb000dff bl 1f3fb9c + 1f3c39c: e3500000 cmp r0, #0 + 1f3c3a0: 1afffff4 bne 1f3c378 + 1f3c3a4: e994000a ldmib r4, {r1, r3} + 1f3c3a8: e0613003 rsb r3, r1, r3 + 1f3c3ac: e1a03343 asr r3, r3, #6 + 1f3c3b0: e0030396 mul r3, r6, r3 + 1f3c3b4: e3530000 cmp r3, #0 + 1f3c3b8: 0affffee beq 1f3c378 + 1f3c3bc: e0657007 rsb r7, r5, r7 + 1f3c3c0: e1a09000 mov r9, r0 + 1f3c3c4: e1a0a489 lsl sl, r9, #9 + 1f3c3c8: e1a02007 mov r2, r7 + 1f3c3cc: e08a3309 add r3, sl, r9, lsl #6 + 1f3c3d0: e1a00005 mov r0, r5 + 1f3c3d4: e081a003 add sl, r1, r3 + 1f3c3d8: e2899001 add r9, r9, #1 + 1f3c3dc: e28a101a add r1, sl, #26 + 1f3c3e0: eb000f62 bl 1f40170 + 1f3c3e4: e3500000 cmp r0, #0 + 1f3c3e8: e3a02e12 mov r2, #288 ; 0x120 + 1f3c3ec: e28d1f5e add r1, sp, #376 ; 0x178 + 1f3c3f0: e08a0002 add r0, sl, r2 + 1f3c3f4: 1a000000 bne 1f3c3fc + 1f3c3f8: eb000a80 bl 1f3ee00 + 1f3c3fc: e994000a ldmib r4, {r1, r3} + 1f3c400: e0613003 rsb r3, r1, r3 + 1f3c404: e1a03343 asr r3, r3, #6 + 1f3c408: e0030396 mul r3, r6, r3 + 1f3c40c: e1590003 cmp r9, r3 + 1f3c410: 3affffeb bcc 1f3c3c4 + 1f3c414: eaffffd7 b 1f3c378 + 1f3c418: e1a02005 mov r2, r5 + 1f3c41c: e3a03000 mov r3, #0 + 1f3c420: e1a00007 mov r0, r7 + 1f3c424: ebfffc64 bl 1f3b5bc > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter)> + 1f3c428: e5945004 ldr r5, [r4, #4] + 1f3c42c: e5943008 ldr r3, [r4, #8] + 1f3c430: eaffffa2 b 1f3c2c0 + 1f3c434: e28d1058 add r1, sp, #88 ; 0x58 + 1f3c438: e1a00008 mov r0, r8 + 1f3c43c: ebfffb85 bl 1f3b258 >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&)> + 1f3c440: eaffffc6 b 1f3c360 + 1f3c444: e28d1058 add r1, sp, #88 ; 0x58 + 1f3c448: e1a00008 mov r0, r8 + 1f3c44c: ebfffb81 bl 1f3b258 >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&)> + 1f3c450: e5945008 ldr r5, [r4, #8] + 1f3c454: eaffff77 b 1f3c238 + +01f3c458 : + 1f3c458: e92d4010 push {r4, lr} + 1f3c45c: e1a04000 mov r4, r0 + 1f3c460: ebffff2a bl 1f3c110 + 1f3c464: e1a00004 mov r0, r4 + 1f3c468: e8bd4010 pop {r4, lr} + 1f3c46c: eafff7da b 1f3a3dc + +01f3c470 : + 1f3c470: e92d4010 push {r4, lr} + 1f3c474: e1a04000 mov r4, r0 + 1f3c478: e30105b8 movw r0, #5560 ; 0x15b8 + 1f3c47c: e34001f6 movt r0, #502 ; 0x1f6 + 1f3c480: ebff4b6d bl 1f0f23c + 1f3c484: e1a00004 mov r0, r4 + 1f3c488: ebffff20 bl 1f3c110 + 1f3c48c: e1a00004 mov r0, r4 + 1f3c490: e8bd4010 pop {r4, lr} + 1f3c494: eafff7d0 b 1f3a3dc + +01f3c498 : + 1f3c498: e92d4010 push {r4, lr} + 1f3c49c: e1a04000 mov r4, r0 + 1f3c4a0: e30105b4 movw r0, #5556 ; 0x15b4 + 1f3c4a4: e34001f6 movt r0, #502 ; 0x1f6 + 1f3c4a8: ebff4b63 bl 1f0f23c + 1f3c4ac: e1a00004 mov r0, r4 + 1f3c4b0: ebffff16 bl 1f3c110 + 1f3c4b4: e594303c ldr r3, [r4, #60] ; 0x3c + 1f3c4b8: e5843040 str r3, [r4, #64] ; 0x40 + 1f3c4bc: e1a00004 mov r0, r4 + 1f3c4c0: e3a03000 mov r3, #0 + 1f3c4c4: e5843048 str r3, [r4, #72] ; 0x48 + 1f3c4c8: e584304c str r3, [r4, #76] ; 0x4c + 1f3c4cc: e5843050 str r3, [r4, #80] ; 0x50 + 1f3c4d0: e8bd4010 pop {r4, lr} + 1f3c4d4: eafff7c0 b 1f3a3dc + +01f3c4d8 : + 1f3c4d8: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f3c4dc: e3084010 movw r4, #32784 ; 0x8010 + 1f3c4e0: e34041f6 movt r4, #502 ; 0x1f6 + 1f3c4e4: ed2d8b02 vpush {d8} + 1f3c4e8: e1a05000 mov r5, r0 + 1f3c4ec: e24ddf49 sub sp, sp, #292 ; 0x124 + 1f3c4f0: e5947000 ldr r7, [r4] + 1f3c4f4: e3570000 cmp r7, #0 + 1f3c4f8: 0a00008b beq 1f3c72c + 1f3c4fc: e308400c movw r4, #32780 ; 0x800c + 1f3c500: e34041f6 movt r4, #502 ; 0x1f6 + 1f3c504: e5946000 ldr r6, [r4] + 1f3c508: e3560000 cmp r6, #0 + 1f3c50c: 0a00008d beq 1f3c748 + 1f3c510: e5953008 ldr r3, [r5, #8] + 1f3c514: e3088e39 movw r8, #36409 ; 0x8e39 + 1f3c518: e34388e3 movt r8, #14563 ; 0x38e3 + 1f3c51c: e5954004 ldr r4, [r5, #4] + 1f3c520: e0644003 rsb r4, r4, r3 + 1f3c524: e1a04344 asr r4, r4, #6 + 1f3c528: e0040498 mul r4, r8, r4 + 1f3c52c: e3540000 cmp r4, #0 + 1f3c530: 0a00001f beq 1f3c5b4 + 1f3c534: e5962004 ldr r2, [r6, #4] + 1f3c538: e5961008 ldr r1, [r6, #8] + 1f3c53c: e1823001 orr r3, r2, r1 + 1f3c540: e7e031d3 ubfx r3, r3, #3, #1 + 1f3c544: e3530000 cmp r3, #0 + 1f3c548: 0a000020 beq 1f3c5d0 + 1f3c54c: e5954010 ldr r4, [r5, #16] + 1f3c550: e3540000 cmp r4, #0 + 1f3c554: 0a00001a beq 1f3c5c4 + 1f3c558: e5d4300c ldrb r3, [r4, #12] + 1f3c55c: e3130010 tst r3, #16 + 1f3c560: 0a00003c beq 1f3c658 + 1f3c564: e284401a add r4, r4, #26 + 1f3c568: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3c56c: e34011f6 movt r1, #502 ; 0x1f6 + 1f3c570: e1a00004 mov r0, r4 + 1f3c574: eb000e20 bl 1f3fdfc + 1f3c578: e2506000 subs r6, r0, #0 + 1f3c57c: 1a000100 bne 1f3c984 + 1f3c580: e30105b4 movw r0, #5556 ; 0x15b4 + 1f3c584: e34001f6 movt r0, #502 ; 0x1f6 + 1f3c588: ebff4b2b bl 1f0f23c + 1f3c58c: e1a00005 mov r0, r5 + 1f3c590: ebfffede bl 1f3c110 + 1f3c594: e595303c ldr r3, [r5, #60] ; 0x3c + 1f3c598: e5856048 str r6, [r5, #72] ; 0x48 + 1f3c59c: e1a00005 mov r0, r5 + 1f3c5a0: e585604c str r6, [r5, #76] ; 0x4c + 1f3c5a4: e5856050 str r6, [r5, #80] ; 0x50 + 1f3c5a8: e5853040 str r3, [r5, #64] ; 0x40 + 1f3c5ac: ebfff78a bl 1f3a3dc + 1f3c5b0: ea000014 b 1f3c608 + 1f3c5b4: e996000c ldmib r6, {r2, r3} + 1f3c5b8: e1823003 orr r3, r2, r3 + 1f3c5bc: e3130c02 tst r3, #512 ; 0x200 + 1f3c5c0: 1a000015 bne 1f3c61c + 1f3c5c4: e28ddf49 add sp, sp, #292 ; 0x124 + 1f3c5c8: ecbd8b02 vpop {d8} + 1f3c5cc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f3c5d0: e2129c01 ands r9, r2, #256 ; 0x100 + 1f3c5d4: 1a000033 bne 1f3c6a8 + 1f3c5d8: e1813002 orr r3, r1, r2 + 1f3c5dc: e7e034d3 ubfx r3, r3, #9, #1 + 1f3c5e0: e3530000 cmp r3, #0 + 1f3c5e4: 1a0000f1 bne 1f3c9b0 + 1f3c5e8: e1810002 orr r0, r1, r2 + 1f3c5ec: e3100001 tst r0, #1 + 1f3c5f0: 0a00005b beq 1f3c764 + 1f3c5f4: e595203c ldr r2, [r5, #60] ; 0x3c + 1f3c5f8: e5853048 str r3, [r5, #72] ; 0x48 + 1f3c5fc: e585304c str r3, [r5, #76] ; 0x4c + 1f3c600: e5853050 str r3, [r5, #80] ; 0x50 + 1f3c604: e5852040 str r2, [r5, #64] ; 0x40 + 1f3c608: e1a00005 mov r0, r5 + 1f3c60c: ebfff772 bl 1f3a3dc + 1f3c610: e28ddf49 add sp, sp, #292 ; 0x124 + 1f3c614: ecbd8b02 vpop {d8} + 1f3c618: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f3c61c: e30105b4 movw r0, #5556 ; 0x15b4 + 1f3c620: e34001f6 movt r0, #502 ; 0x1f6 + 1f3c624: ebff4b04 bl 1f0f23c + 1f3c628: e1a00005 mov r0, r5 + 1f3c62c: ebfffeb7 bl 1f3c110 + 1f3c630: e595303c ldr r3, [r5, #60] ; 0x3c + 1f3c634: e5854048 str r4, [r5, #72] ; 0x48 + 1f3c638: e1a00005 mov r0, r5 + 1f3c63c: e585404c str r4, [r5, #76] ; 0x4c + 1f3c640: e5854050 str r4, [r5, #80] ; 0x50 + 1f3c644: e5853040 str r3, [r5, #64] ; 0x40 + 1f3c648: ebfff763 bl 1f3a3dc + 1f3c64c: e28ddf49 add sp, sp, #292 ; 0x124 + 1f3c650: ecbd8b02 vpop {d8} + 1f3c654: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f3c658: e284601a add r6, r4, #26 + 1f3c65c: e30115b4 movw r1, #5556 ; 0x15b4 + 1f3c660: e34011f6 movt r1, #502 ; 0x1f6 + 1f3c664: e1a00006 mov r0, r6 + 1f3c668: eb000de3 bl 1f3fdfc + 1f3c66c: e2507000 subs r7, r0, #0 + 1f3c670: 1a000099 bne 1f3c8dc + 1f3c674: e30105b4 movw r0, #5556 ; 0x15b4 + 1f3c678: e34001f6 movt r0, #502 ; 0x1f6 + 1f3c67c: ebff4aee bl 1f0f23c + 1f3c680: e1a00005 mov r0, r5 + 1f3c684: ebfffea1 bl 1f3c110 + 1f3c688: e595303c ldr r3, [r5, #60] ; 0x3c + 1f3c68c: e5857048 str r7, [r5, #72] ; 0x48 + 1f3c690: e1a00005 mov r0, r5 + 1f3c694: e585704c str r7, [r5, #76] ; 0x4c + 1f3c698: e5857050 str r7, [r5, #80] ; 0x50 + 1f3c69c: e5853040 str r3, [r5, #64] ; 0x40 + 1f3c6a0: ebfff74d bl 1f3a3dc + 1f3c6a4: eaffffc6 b 1f3c5c4 + 1f3c6a8: e595403c ldr r4, [r5, #60] ; 0x3c + 1f3c6ac: e5952040 ldr r2, [r5, #64] ; 0x40 + 1f3c6b0: e0641002 rsb r1, r4, r2 + 1f3c6b4: e1a01341 asr r1, r1, #6 + 1f3c6b8: e0010198 mul r1, r8, r1 + 1f3c6bc: e3510000 cmp r1, #0 + 1f3c6c0: 0a000017 beq 1f3c724 + 1f3c6c4: e1540002 cmp r4, r2 + 1f3c6c8: e1a01004 mov r1, r4 + 1f3c6cc: 0a000013 beq 1f3c720 + 1f3c6d0: e5d4200c ldrb r2, [r4, #12] + 1f3c6d4: e5950024 ldr r0, [r5, #36] ; 0x24 + 1f3c6d8: e2022001 and r2, r2, #1 + 1f3c6dc: eb000388 bl 1f3d504 + 1f3c6e0: e3500000 cmp r0, #0 + 1f3c6e4: 12844d09 addne r4, r4, #576 ; 0x240 + 1f3c6e8: 15952040 ldrne r2, [r5, #64] ; 0x40 + 1f3c6ec: 1afffff4 bne 1f3c6c4 + 1f3c6f0: e5953040 ldr r3, [r5, #64] ; 0x40 + 1f3c6f4: e2841d09 add r1, r4, #576 ; 0x240 + 1f3c6f8: e0612003 rsb r2, r1, r3 + 1f3c6fc: e1510003 cmp r1, r3 + 1f3c700: e1a00342 asr r0, r2, #6 + 1f3c704: 0a000002 beq 1f3c714 + 1f3c708: e0000098 mul r0, r8, r0 + 1f3c70c: e3500000 cmp r0, #0 + 1f3c710: 1a0000e2 bne 1f3caa0 + 1f3c714: e2432d09 sub r2, r3, #576 ; 0x240 + 1f3c718: e5852040 str r2, [r5, #64] ; 0x40 + 1f3c71c: eaffffe8 b 1f3c6c4 + 1f3c720: e3a03001 mov r3, #1 + 1f3c724: e5c53028 strb r3, [r5, #40] ; 0x28 + 1f3c728: eaffffa5 b 1f3c5c4 + 1f3c72c: e3a00e23 mov r0, #560 ; 0x230 + 1f3c730: ebff0fd4 bl 1f00688 + 1f3c734: e1a06000 mov r6, r0 + 1f3c738: e1a07000 mov r7, r0 + 1f3c73c: ebff5737 bl 1f12420 + 1f3c740: e5846000 str r6, [r4] + 1f3c744: eaffff6c b 1f3c4fc + 1f3c748: e3a0000c mov r0, #12 + 1f3c74c: ebff0fcd bl 1f00688 + 1f3c750: e1a08000 mov r8, r0 + 1f3c754: e1a06000 mov r6, r0 + 1f3c758: eb000408 bl 1f3d780 + 1f3c75c: e5848000 str r8, [r4] + 1f3c760: eaffff6a b 1f3c510 + 1f3c764: e1812002 orr r2, r1, r2 + 1f3c768: e3120b01 tst r2, #1024 ; 0x400 + 1f3c76c: 1a00009c bne 1f3c9e4 + 1f3c770: e3018488 movw r8, #5256 ; 0x1488 + 1f3c774: e34081f6 movt r8, #502 ; 0x1f6 + 1f3c778: ed9f8bcc vldr d8, [pc, #816] ; 1f3cab0 + 1f3c77c: e58d901c str r9, [sp, #28] + 1f3c780: ea000014 b 1f3c7d8 + 1f3c784: e1c321d8 ldrd r2, [r3, #24] + 1f3c788: ec510b30 vmov r0, r1, d16 + 1f3c78c: e0000002 and r0, r0, r2 + 1f3c790: e0011003 and r1, r1, r3 + 1f3c794: e1a02000 mov r2, r0 + 1f3c798: e1a03001 mov r3, r1 + 1f3c79c: e1923003 orrs r3, r2, r3 + 1f3c7a0: 1a00001c bne 1f3c818 + 1f3c7a4: e5951030 ldr r1, [r5, #48] ; 0x30 + 1f3c7a8: e59d301c ldr r3, [sp, #28] + 1f3c7ac: e0813003 add r3, r1, r3 + 1f3c7b0: e2833b82 add r3, r3, #133120 ; 0x20800 + 1f3c7b4: e5d33000 ldrb r3, [r3] + 1f3c7b8: e3530000 cmp r3, #0 + 1f3c7bc: 1a000090 bne 1f3ca04 + 1f3c7c0: e59d301c ldr r3, [sp, #28] + 1f3c7c4: e288800c add r8, r8, #12 + 1f3c7c8: e2833001 add r3, r3, #1 + 1f3c7cc: e58d301c str r3, [sp, #28] + 1f3c7d0: e3530008 cmp r3, #8 + 1f3c7d4: 0a0000b7 beq 1f3cab8 + 1f3c7d8: e5183008 ldr r3, [r8, #-8] + 1f3c7dc: e353003f cmp r3, #63 ; 0x3f + 1f3c7e0: e203303f and r3, r3, #63 ; 0x3f + 1f3c7e4: 93a02000 movls r2, #0 + 1f3c7e8: 83a02001 movhi r2, #1 + 1f3c7ec: ee013b90 vmov.32 d17[0], r3 + 1f3c7f0: e0873182 add r3, r7, r2, lsl #3 + 1f3c7f4: f3710488 vshl.u64 d16, d8, d17 + 1f3c7f8: e1c300d8 ldrd r0, [r3, #8] + 1f3c7fc: ec5bab30 vmov sl, fp, d16 + 1f3c800: e00aa000 and sl, sl, r0 + 1f3c804: e00bb001 and fp, fp, r1 + 1f3c808: e1a0000a mov r0, sl + 1f3c80c: e1a0100b mov r1, fp + 1f3c810: e1902001 orrs r2, r0, r1 + 1f3c814: 1affffda bne 1f3c784 + 1f3c818: e5183004 ldr r3, [r8, #-4] + 1f3c81c: e353003f cmp r3, #63 ; 0x3f + 1f3c820: e203303f and r3, r3, #63 ; 0x3f + 1f3c824: 93a02000 movls r2, #0 + 1f3c828: 83a02001 movhi r2, #1 + 1f3c82c: ee013b90 vmov.32 d17[0], r3 + 1f3c830: e0873182 add r3, r7, r2, lsl #3 + 1f3c834: f3710488 vshl.u64 d16, d8, d17 + 1f3c838: e1c300d8 ldrd r0, [r3, #8] + 1f3c83c: ec5bab30 vmov sl, fp, d16 + 1f3c840: e00aa000 and sl, sl, r0 + 1f3c844: e00bb001 and fp, fp, r1 + 1f3c848: e1a0000a mov r0, sl + 1f3c84c: e1a0100b mov r1, fp + 1f3c850: e1902001 orrs r2, r0, r1 + 1f3c854: 0a000007 beq 1f3c878 + 1f3c858: e1c321d8 ldrd r2, [r3, #24] + 1f3c85c: ec510b30 vmov r0, r1, d16 + 1f3c860: e0000002 and r0, r0, r2 + 1f3c864: e0011003 and r1, r1, r3 + 1f3c868: e1a02000 mov r2, r0 + 1f3c86c: e1a03001 mov r3, r1 + 1f3c870: e1923003 orrs r3, r2, r3 + 1f3c874: 0affffca beq 1f3c7a4 + 1f3c878: e5983000 ldr r3, [r8] + 1f3c87c: e353003f cmp r3, #63 ; 0x3f + 1f3c880: e203303f and r3, r3, #63 ; 0x3f + 1f3c884: 93a02000 movls r2, #0 + 1f3c888: 83a02001 movhi r2, #1 + 1f3c88c: ee013b90 vmov.32 d17[0], r3 + 1f3c890: e0873182 add r3, r7, r2, lsl #3 + 1f3c894: f3710488 vshl.u64 d16, d8, d17 + 1f3c898: e1c300d8 ldrd r0, [r3, #8] + 1f3c89c: ec5bab30 vmov sl, fp, d16 + 1f3c8a0: e00aa000 and sl, sl, r0 + 1f3c8a4: e00bb001 and fp, fp, r1 + 1f3c8a8: e1a0000a mov r0, sl + 1f3c8ac: e1a0100b mov r1, fp + 1f3c8b0: e1902001 orrs r2, r0, r1 + 1f3c8b4: 0affffc1 beq 1f3c7c0 + 1f3c8b8: e1c321d8 ldrd r2, [r3, #24] + 1f3c8bc: ec510b30 vmov r0, r1, d16 + 1f3c8c0: e0000002 and r0, r0, r2 + 1f3c8c4: e0011003 and r1, r1, r3 + 1f3c8c8: e1a02000 mov r2, r0 + 1f3c8cc: e1a03001 mov r3, r1 + 1f3c8d0: e1923003 orrs r3, r2, r3 + 1f3c8d4: 0affffb2 beq 1f3c7a4 + 1f3c8d8: eaffffb8 b 1f3c7c0 + 1f3c8dc: e1a00006 mov r0, r6 + 1f3c8e0: ebff59a1 bl 1f12f6c + 1f3c8e4: e2507000 subs r7, r0, #0 + 1f3c8e8: 0affff35 beq 1f3c5c4 + 1f3c8ec: e1a00006 mov r0, r6 + 1f3c8f0: ebff5954 bl 1f12e48 + 1f3c8f4: e3500005 cmp r0, #5 + 1f3c8f8: 0a0000e8 beq 1f3cca0 + 1f3c8fc: e1a01004 mov r1, r4 + 1f3c900: e1a00005 mov r0, r5 + 1f3c904: ebfffaef bl 1f3b4c8 + 1f3c908: e595403c ldr r4, [r5, #60] ; 0x3c + 1f3c90c: e5953040 ldr r3, [r5, #64] ; 0x40 + 1f3c910: e0642003 rsb r2, r4, r3 + 1f3c914: e1a02342 asr r2, r2, #6 + 1f3c918: e0020298 mul r2, r8, r2 + 1f3c91c: e3520000 cmp r2, #0 + 1f3c920: 01a07002 moveq r7, r2 + 1f3c924: 0a0000bf beq 1f3cc28 + 1f3c928: e1540003 cmp r4, r3 + 1f3c92c: e1a01004 mov r1, r4 + 1f3c930: 0a0000bc beq 1f3cc28 + 1f3c934: e5d4200c ldrb r2, [r4, #12] + 1f3c938: e5950024 ldr r0, [r5, #36] ; 0x24 + 1f3c93c: e2022001 and r2, r2, #1 + 1f3c940: eb0002ef bl 1f3d504 + 1f3c944: e3500000 cmp r0, #0 + 1f3c948: 12844d09 addne r4, r4, #576 ; 0x240 + 1f3c94c: 15953040 ldrne r3, [r5, #64] ; 0x40 + 1f3c950: 1afffff4 bne 1f3c928 + 1f3c954: e5953040 ldr r3, [r5, #64] ; 0x40 + 1f3c958: e2841d09 add r1, r4, #576 ; 0x240 + 1f3c95c: e0612003 rsb r2, r1, r3 + 1f3c960: e1510003 cmp r1, r3 + 1f3c964: e1a00342 asr r0, r2, #6 + 1f3c968: 0a000002 beq 1f3c978 + 1f3c96c: e0000098 mul r0, r8, r0 + 1f3c970: e3500000 cmp r0, #0 + 1f3c974: 1a0000b3 bne 1f3cc48 + 1f3c978: e2433d09 sub r3, r3, #576 ; 0x240 + 1f3c97c: e5853040 str r3, [r5, #64] ; 0x40 + 1f3c980: eaffffe8 b 1f3c928 + 1f3c984: e30f134c movw r1, #62284 ; 0xf34c + 1f3c988: e34011f5 movt r1, #501 ; 0x1f5 + 1f3c98c: e1a00004 mov r0, r4 + 1f3c990: eb000d19 bl 1f3fdfc + 1f3c994: e3500000 cmp r0, #0 + 1f3c998: 0affff1a beq 1f3c608 + 1f3c99c: e1a00004 mov r0, r4 + 1f3c9a0: ebff4a25 bl 1f0f23c + 1f3c9a4: e1a00005 mov r0, r5 + 1f3c9a8: ebfffdd8 bl 1f3c110 + 1f3c9ac: eaffff15 b 1f3c608 + 1f3c9b0: e30105b4 movw r0, #5556 ; 0x15b4 + 1f3c9b4: e34001f6 movt r0, #502 ; 0x1f6 + 1f3c9b8: ebff4a1f bl 1f0f23c + 1f3c9bc: e1a00005 mov r0, r5 + 1f3c9c0: ebfffdd2 bl 1f3c110 + 1f3c9c4: e595303c ldr r3, [r5, #60] ; 0x3c + 1f3c9c8: e5859048 str r9, [r5, #72] ; 0x48 + 1f3c9cc: e1a00005 mov r0, r5 + 1f3c9d0: e585904c str r9, [r5, #76] ; 0x4c + 1f3c9d4: e5859050 str r9, [r5, #80] ; 0x50 + 1f3c9d8: e5853040 str r3, [r5, #64] ; 0x40 + 1f3c9dc: ebfff67e bl 1f3a3dc + 1f3c9e0: eaffff08 b 1f3c608 + 1f3c9e4: e5951010 ldr r1, [r5, #16] + 1f3c9e8: e3510000 cmp r1, #0 + 1f3c9ec: 0afffef4 beq 1f3c5c4 + 1f3c9f0: e1a00005 mov r0, r5 + 1f3c9f4: ebfffab3 bl 1f3b4c8 + 1f3c9f8: e3500000 cmp r0, #0 + 1f3c9fc: 0afffef0 beq 1f3c5c4 + 1f3ca00: eaffff00 b 1f3c608 + 1f3ca04: e59dc01c ldr ip, [sp, #28] + 1f3ca08: e2813802 add r3, r1, #131072 ; 0x20000 + 1f3ca0c: e30105c0 movw r0, #5568 ; 0x15c0 + 1f3ca10: e34001f6 movt r0, #502 ; 0x1f6 + 1f3ca14: e28c2c02 add r2, ip, #512 ; 0x200 + 1f3ca18: e28db020 add fp, sp, #32 + 1f3ca1c: e583c808 str ip, [r3, #2056] ; 0x808 + 1f3ca20: e0812402 add r2, r1, r2, lsl #8 + 1f3ca24: e583c80c str ip, [r3, #2060] ; 0x80c + 1f3ca28: e1a0100c mov r1, ip + 1f3ca2c: eb0009c6 bl 1f3f14c + 1f3ca30: e595c030 ldr ip, [r5, #48] ; 0x30 + 1f3ca34: e5953034 ldr r3, [r5, #52] ; 0x34 + 1f3ca38: e1a0000b mov r0, fp + 1f3ca3c: e28c1802 add r1, ip, #131072 ; 0x20000 + 1f3ca40: e3012548 movw r2, #5448 ; 0x1548 + 1f3ca44: e34021f6 movt r2, #502 ; 0x1f6 + 1f3ca48: e591e808 ldr lr, [r1, #2056] ; 0x808 + 1f3ca4c: e3a01c01 mov r1, #256 ; 0x100 + 1f3ca50: e28eec02 add lr, lr, #512 ; 0x200 + 1f3ca54: e08cc40e add ip, ip, lr, lsl #8 + 1f3ca58: e58dc000 str ip, [sp] + 1f3ca5c: eb000bde bl 1f3f9dc + 1f3ca60: e3a03000 mov r3, #0 + 1f3ca64: e1a01003 mov r1, r3 + 1f3ca68: e58d3014 str r3, [sp, #20] + 1f3ca6c: e3e0c000 mvn ip, #0 + 1f3ca70: e58d3010 str r3, [sp, #16] + 1f3ca74: e3a024ff mov r2, #-16777216 ; 0xff000000 + 1f3ca78: e58d300c str r3, [sp, #12] + 1f3ca7c: e58d2004 str r2, [sp, #4] + 1f3ca80: e30907a4 movw r0, #38820 ; 0x97a4 + 1f3ca84: e34001fa movt r0, #506 ; 0x1fa + 1f3ca88: e58db000 str fp, [sp] + 1f3ca8c: e300328a movw r3, #650 ; 0x28a + 1f3ca90: e58dc008 str ip, [sp, #8] + 1f3ca94: e3a02f56 mov r2, #344 ; 0x158 + 1f3ca98: ebfff39f bl 1f3991c + 1f3ca9c: eaffff47 b 1f3c7c0 + 1f3caa0: e1a00004 mov r0, r4 + 1f3caa4: eb000911 bl 1f3eef0 + 1f3caa8: e5953040 ldr r3, [r5, #64] ; 0x40 + 1f3caac: eaffff18 b 1f3c714 + 1f3cab0: 00000001 .word 0x00000001 + 1f3cab4: 00000000 .word 0x00000000 + 1f3cab8: e5962004 ldr r2, [r6, #4] + 1f3cabc: e244c001 sub ip, r4, #1 + 1f3cac0: e5963008 ldr r3, [r6, #8] + 1f3cac4: e1830002 orr r0, r3, r2 + 1f3cac8: e7e00350 ubfx r0, r0, #6, #1 + 1f3cacc: e3500000 cmp r0, #0 + 1f3cad0: 0a00001b beq 1f3cb44 + 1f3cad4: e5951014 ldr r1, [r5, #20] + 1f3cad8: e15c0001 cmp ip, r1 + 1f3cadc: 93a00000 movls r0, #0 + 1f3cae0: 9a000017 bls 1f3cb44 + 1f3cae4: e2813001 add r3, r1, #1 + 1f3cae8: e5950018 ldr r0, [r5, #24] + 1f3caec: e5951020 ldr r1, [r5, #32] + 1f3caf0: e1a02483 lsl r2, r3, #9 + 1f3caf4: e5954004 ldr r4, [r5, #4] + 1f3caf8: e0801001 add r1, r0, r1 + 1f3cafc: e0822303 add r2, r2, r3, lsl #6 + 1f3cb00: e1530001 cmp r3, r1 + 1f3cb04: e0842002 add r2, r4, r2 + 1f3cb08: e5853014 str r3, [r5, #20] + 1f3cb0c: e5852010 str r2, [r5, #16] + 1f3cb10: 3a000048 bcc 1f3cc38 + 1f3cb14: e5952008 ldr r2, [r5, #8] + 1f3cb18: e3081e39 movw r1, #36409 ; 0x8e39 + 1f3cb1c: e34318e3 movt r1, #14563 ; 0x38e3 + 1f3cb20: e0644002 rsb r4, r4, r2 + 1f3cb24: e1a02344 asr r2, r4, #6 + 1f3cb28: e0020291 mul r2, r1, r2 + 1f3cb2c: e1530002 cmp r3, r2 + 1f3cb30: 2a000040 bcs 1f3cc38 + 1f3cb34: e2800001 add r0, r0, #1 + 1f3cb38: e5850018 str r0, [r5, #24] + 1f3cb3c: e3a00001 mov r0, #1 + 1f3cb40: e996000c ldmib r6, {r2, r3} + 1f3cb44: e1833002 orr r3, r3, r2 + 1f3cb48: e3130010 tst r3, #16 + 1f3cb4c: 0a000012 beq 1f3cb9c + 1f3cb50: e5953014 ldr r3, [r5, #20] + 1f3cb54: e3530000 cmp r3, #0 + 1f3cb58: 0a00000f beq 1f3cb9c + 1f3cb5c: e5951018 ldr r1, [r5, #24] + 1f3cb60: e2433001 sub r3, r3, #1 + 1f3cb64: e5954004 ldr r4, [r5, #4] + 1f3cb68: e3510000 cmp r1, #0 + 1f3cb6c: 11530001 cmpne r3, r1 + 1f3cb70: e5853014 str r3, [r5, #20] + 1f3cb74: e1a02483 lsl r2, r3, #9 + 1f3cb78: 32411001 subcc r1, r1, #1 + 1f3cb7c: 35851018 strcc r1, [r5, #24] + 1f3cb80: e0822303 add r2, r2, r3, lsl #6 + 1f3cb84: e0844002 add r4, r4, r2 + 1f3cb88: 25962004 ldrcs r2, [r6, #4] + 1f3cb8c: 35962004 ldrcc r2, [r6, #4] + 1f3cb90: 23a00001 movcs r0, #1 + 1f3cb94: e5854010 str r4, [r5, #16] + 1f3cb98: 33a00001 movcc r0, #1 + 1f3cb9c: e3120080 tst r2, #128 ; 0x80 + 1f3cba0: 0a00001a beq 1f3cc10 + 1f3cba4: e5952020 ldr r2, [r5, #32] + 1f3cba8: e5951018 ldr r1, [r5, #24] + 1f3cbac: e2422001 sub r2, r2, #1 + 1f3cbb0: e5950014 ldr r0, [r5, #20] + 1f3cbb4: e0823001 add r3, r2, r1 + 1f3cbb8: e1500003 cmp r0, r3 + 1f3cbbc: 0a00002e beq 1f3cc7c + 1f3cbc0: e15c0003 cmp ip, r3 + 1f3cbc4: 3585c014 strcc ip, [r5, #20] + 1f3cbc8: 31a0300c movcc r3, ip + 1f3cbcc: 25853014 strcs r3, [r5, #20] + 1f3cbd0: e5960004 ldr r0, [r6, #4] + 1f3cbd4: e1a02483 lsl r2, r3, #9 + 1f3cbd8: e5954004 ldr r4, [r5, #4] + 1f3cbdc: e0822303 add r2, r2, r3, lsl #6 + 1f3cbe0: e3100020 tst r0, #32 + 1f3cbe4: e0842002 add r2, r4, r2 + 1f3cbe8: e5852010 str r2, [r5, #16] + 1f3cbec: 0afffe85 beq 1f3c608 + 1f3cbf0: e1530001 cmp r3, r1 + 1f3cbf4: 0a000017 beq 1f3cc58 + 1f3cbf8: e1a03481 lsl r3, r1, #9 + 1f3cbfc: e5851014 str r1, [r5, #20] + 1f3cc00: e0831301 add r1, r3, r1, lsl #6 + 1f3cc04: e0844001 add r4, r4, r1 + 1f3cc08: e5854010 str r4, [r5, #16] + 1f3cc0c: eafffe7d b 1f3c608 + 1f3cc10: e3120020 tst r2, #32 + 1f3cc14: 0affff77 beq 1f3c9f8 + 1f3cc18: e5953014 ldr r3, [r5, #20] + 1f3cc1c: e5951018 ldr r1, [r5, #24] + 1f3cc20: e5954004 ldr r4, [r5, #4] + 1f3cc24: eafffff1 b 1f3cbf0 + 1f3cc28: e5c57028 strb r7, [r5, #40] ; 0x28 + 1f3cc2c: e3570000 cmp r7, #0 + 1f3cc30: 1585602c strne r6, [r5, #44] ; 0x2c + 1f3cc34: eafffe73 b 1f3c608 + 1f3cc38: e5962004 ldr r2, [r6, #4] + 1f3cc3c: e3a00001 mov r0, #1 + 1f3cc40: e5963008 ldr r3, [r6, #8] + 1f3cc44: eaffffbe b 1f3cb44 + 1f3cc48: e1a00004 mov r0, r4 + 1f3cc4c: eb0008a7 bl 1f3eef0 + 1f3cc50: e5953040 ldr r3, [r5, #64] ; 0x40 + 1f3cc54: eaffff47 b 1f3c978 + 1f3cc58: e5952020 ldr r2, [r5, #32] + 1f3cc5c: e0533002 subs r3, r3, r2 + 1f3cc60: 51a09003 movpl r9, r3 + 1f3cc64: 43a01000 movmi r1, #0 + 1f3cc68: e5859018 str r9, [r5, #24] + 1f3cc6c: 51a01489 lslpl r1, r9, #9 + 1f3cc70: e5859014 str r9, [r5, #20] + 1f3cc74: 50811309 addpl r1, r1, r9, lsl #6 + 1f3cc78: eaffffe1 b 1f3cc04 + 1f3cc7c: e5853018 str r3, [r5, #24] + 1f3cc80: e0823003 add r3, r2, r3 + 1f3cc84: e15c0003 cmp ip, r3 + 1f3cc88: 3585c014 strcc ip, [r5, #20] + 1f3cc8c: 31a01000 movcc r1, r0 + 1f3cc90: 31a0300c movcc r3, ip + 1f3cc94: 25853014 strcs r3, [r5, #20] + 1f3cc98: 21a01000 movcs r1, r0 + 1f3cc9c: eaffffcb b 1f3cbd0 + 1f3cca0: e1a00006 mov r0, r6 + 1f3cca4: ebff58f5 bl 1f13080 + 1f3cca8: e3500000 cmp r0, #0 + 1f3ccac: 0a000004 beq 1f3ccc4 + 1f3ccb0: e2950004 adds r0, r5, #4 + 1f3ccb4: 0a000002 beq 1f3ccc4 + 1f3ccb8: e1a01006 mov r1, r6 + 1f3ccbc: e1a00005 mov r0, r5 + 1f3ccc0: ebfff498 bl 1f39f28 + 1f3ccc4: e5c50028 strb r0, [r5, #40] ; 0x28 + 1f3ccc8: e1a07000 mov r7, r0 + 1f3cccc: eaffffd6 b 1f3cc2c + +01f3ccd0 : + 1f3ccd0: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f3ccd4: e308400c movw r4, #32780 ; 0x800c + 1f3ccd8: e34041f6 movt r4, #502 ; 0x1f6 + 1f3ccdc: e1a07000 mov r7, r0 + 1f3cce0: e5946000 ldr r6, [r4] + 1f3cce4: e3560000 cmp r6, #0 + 1f3cce8: 0a00001d beq 1f3cd64 + 1f3ccec: e3085010 movw r5, #32784 ; 0x8010 + 1f3ccf0: e34051f6 movt r5, #502 ; 0x1f6 + 1f3ccf4: e5953000 ldr r3, [r5] + 1f3ccf8: e3530000 cmp r3, #0 + 1f3ccfc: 0a000011 beq 1f3cd48 + 1f3cd00: e5932228 ldr r2, [r3, #552] ; 0x228 + 1f3cd04: e593122c ldr r1, [r3, #556] ; 0x22c + 1f3cd08: e1510002 cmp r1, r2 + 1f3cd0c: 0a000008 beq 1f3cd34 + 1f3cd10: e5932228 ldr r2, [r3, #552] ; 0x228 + 1f3cd14: e1a00006 mov r0, r6 + 1f3cd18: e583222c str r2, [r3, #556] ; 0x22c + 1f3cd1c: eb0002ff bl 1f3d920 + 1f3cd20: e3500000 cmp r0, #0 + 1f3cd24: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc} + 1f3cd28: e1a00007 mov r0, r7 + 1f3cd2c: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f3cd30: eafffde8 b 1f3c4d8 + 1f3cd34: e1a00006 mov r0, r6 + 1f3cd38: eb000294 bl 1f3d790 + 1f3cd3c: e3500000 cmp r0, #0 + 1f3cd40: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc} + 1f3cd44: eafffff7 b 1f3cd28 + 1f3cd48: e3a00e23 mov r0, #560 ; 0x230 + 1f3cd4c: ebff0e4d bl 1f00688 + 1f3cd50: e1a04000 mov r4, r0 + 1f3cd54: ebff55b1 bl 1f12420 + 1f3cd58: e5854000 str r4, [r5] + 1f3cd5c: e1a03004 mov r3, r4 + 1f3cd60: eaffffe6 b 1f3cd00 + 1f3cd64: e3a0000c mov r0, #12 + 1f3cd68: ebff0e46 bl 1f00688 + 1f3cd6c: e1a05000 mov r5, r0 + 1f3cd70: e1a06000 mov r6, r0 + 1f3cd74: eb000281 bl 1f3d780 + 1f3cd78: e5845000 str r5, [r4] + 1f3cd7c: eaffffda b 1f3ccec + +01f3cd80 : + 1f3cd80: e5903014 ldr r3, [r0, #20] + 1f3cd84: e3530000 cmp r3, #0 + 1f3cd88: 012fff1e bxeq lr + 1f3cd8c: e5902000 ldr r2, [r0] + 1f3cd90: e3a01c01 mov r1, #256 ; 0x100 + 1f3cd94: e5903004 ldr r3, [r0, #4] + 1f3cd98: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f3cd9c: e0623003 rsb r3, r2, r3 + 1f3cda0: e1a06000 mov r6, r0 + 1f3cda4: e24dd018 sub sp, sp, #24 + 1f3cda8: e3068965 movw r8, #26981 ; 0x6965 + 1f3cdac: e3408192 movt r8, #402 ; 0x192 + 1f3cdb0: e1a03143 asr r3, r3, #2 + 1f3cdb4: e30c94b8 movw r9, #50360 ; 0xc4b8 + 1f3cdb8: e340920d movt r9, #525 ; 0x20d + 1f3cdbc: e3a05000 mov r5, #0 + 1f3cdc0: e1a00009 mov r0, r9 + 1f3cdc4: e0080398 mul r8, r8, r3 + 1f3cdc8: e3012630 movw r2, #5680 ; 0x1630 + 1f3cdcc: e34021f6 movt r2, #502 ; 0x1f6 + 1f3cdd0: eb000b01 bl 1f3f9dc + 1f3cdd4: e3a0a0ff mov sl, #255 ; 0xff + 1f3cdd8: e34faf00 movt sl, #65280 ; 0xff00 + 1f3cddc: e5960014 ldr r0, [r6, #20] + 1f3cde0: e3e0c000 mvn ip, #0 + 1f3cde4: e58d9000 str r9, [sp] + 1f3cde8: e1a01005 mov r1, r5 + 1f3cdec: e58da008 str sl, [sp, #8] + 1f3cdf0: e3a03f46 mov r3, #280 ; 0x118 + 1f3cdf4: e58d5014 str r5, [sp, #20] + 1f3cdf8: e3a020f0 mov r2, #240 ; 0xf0 + 1f3cdfc: e58d5010 str r5, [sp, #16] + 1f3ce00: e58d500c str r5, [sp, #12] + 1f3ce04: e58dc004 str ip, [sp, #4] + 1f3ce08: ebfff2c3 bl 1f3991c + 1f3ce0c: e1580005 cmp r8, r5 + 1f3ce10: 13a04001 movne r4, #1 + 1f3ce14: 13a07f4a movne r7, #296 ; 0x128 + 1f3ce18: 0a00001f beq 1f3ce9c + 1f3ce1c: e596c000 ldr ip, [r6] + 1f3ce20: e3012640 movw r2, #5696 ; 0x1640 + 1f3ce24: e34021f6 movt r2, #502 ; 0x1f6 + 1f3ce28: e08cc005 add ip, ip, r5 + 1f3ce2c: e285592a add r5, r5, #688128 ; 0xa8000 + 1f3ce30: e30c04b8 movw r0, #50360 ; 0xc4b8 + 1f3ce34: e340020d movt r0, #525 ; 0x20d + 1f3ce38: e1a03004 mov r3, r4 + 1f3ce3c: e3a01c01 mov r1, #256 ; 0x100 + 1f3ce40: e59cc00c ldr ip, [ip, #12] + 1f3ce44: e2855f6d add r5, r5, #436 ; 0x1b4 + 1f3ce48: e29cc01a adds ip, ip, #26 + 1f3ce4c: 0a00000f beq 1f3ce90 + 1f3ce50: e58dc000 str ip, [sp] + 1f3ce54: eb000ae0 bl 1f3f9dc + 1f3ce58: e3a02000 mov r2, #0 + 1f3ce5c: e5960014 ldr r0, [r6, #20] + 1f3ce60: e1a03007 mov r3, r7 + 1f3ce64: e58d2014 str r2, [sp, #20] + 1f3ce68: e1a01002 mov r1, r2 + 1f3ce6c: e58d2010 str r2, [sp, #16] + 1f3ce70: e3e0c000 mvn ip, #0 + 1f3ce74: e58d200c str r2, [sp, #12] + 1f3ce78: e3a020f0 mov r2, #240 ; 0xf0 + 1f3ce7c: e58da008 str sl, [sp, #8] + 1f3ce80: e2877010 add r7, r7, #16 + 1f3ce84: e58d9000 str r9, [sp] + 1f3ce88: e58dc004 str ip, [sp, #4] + 1f3ce8c: ebfff2a2 bl 1f3991c + 1f3ce90: e1580004 cmp r8, r4 + 1f3ce94: e2844001 add r4, r4, #1 + 1f3ce98: 8affffdf bhi 1f3ce1c + 1f3ce9c: e3a01c01 mov r1, #256 ; 0x100 + 1f3cea0: e301263c movw r2, #5692 ; 0x163c + 1f3cea4: e34021f6 movt r2, #502 ; 0x1f6 + 1f3cea8: e30c04b8 movw r0, #50360 ; 0xc4b8 + 1f3ceac: e340020d movt r0, #525 ; 0x20d + 1f3ceb0: eb000ac9 bl 1f3f9dc + 1f3ceb4: e3a03000 mov r3, #0 + 1f3ceb8: e5960014 ldr r0, [r6, #20] + 1f3cebc: e1a01003 mov r1, r3 + 1f3cec0: e58d3014 str r3, [sp, #20] + 1f3cec4: e3a020ff mov r2, #255 ; 0xff + 1f3cec8: e34f2f00 movt r2, #65280 ; 0xff00 + 1f3cecc: e58d2008 str r2, [sp, #8] + 1f3ced0: e58d3010 str r3, [sp, #16] + 1f3ced4: e3e02000 mvn r2, #0 + 1f3ced8: e58d300c str r3, [sp, #12] + 1f3cedc: e3a03f4a mov r3, #296 ; 0x128 + 1f3cee0: e58d2004 str r2, [sp, #4] + 1f3cee4: e3a020e0 mov r2, #224 ; 0xe0 + 1f3cee8: e58d9000 str r9, [sp] + 1f3ceec: ebfff28a bl 1f3991c + 1f3cef0: e28dd018 add sp, sp, #24 + 1f3cef4: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + +01f3cef8 : + 1f3cef8: e92d4070 push {r4, r5, r6, lr} + 1f3cefc: e1a06000 mov r6, r0 + 1f3cf00: e1a05001 mov r5, r1 + 1f3cf04: e24dd018 sub sp, sp, #24 + 1f3cf08: e30c44b8 movw r4, #50360 ; 0xc4b8 + 1f3cf0c: e340420d movt r4, #525 ; 0x20d + 1f3cf10: e1a00004 mov r0, r4 + 1f3cf14: e3a01c01 mov r1, #256 ; 0x100 + 1f3cf18: e301263c movw r2, #5692 ; 0x163c + 1f3cf1c: e34021f6 movt r2, #502 ; 0x1f6 + 1f3cf20: eb000aad bl 1f3f9dc + 1f3cf24: e3a02000 mov r2, #0 + 1f3cf28: e1a03205 lsl r3, r5, #4 + 1f3cf2c: e5960014 ldr r0, [r6, #20] + 1f3cf30: e3e0c000 mvn ip, #0 + 1f3cf34: e58d2014 str r2, [sp, #20] + 1f3cf38: e58d2010 str r2, [sp, #16] + 1f3cf3c: e2833f4a add r3, r3, #296 ; 0x128 + 1f3cf40: e58d200c str r2, [sp, #12] + 1f3cf44: e3a010ff mov r1, #255 ; 0xff + 1f3cf48: e34f1f00 movt r1, #65280 ; 0xff00 + 1f3cf4c: e58d1008 str r1, [sp, #8] + 1f3cf50: e58d4000 str r4, [sp] + 1f3cf54: e1a01002 mov r1, r2 + 1f3cf58: e58dc004 str ip, [sp, #4] + 1f3cf5c: e3a020e0 mov r2, #224 ; 0xe0 + 1f3cf60: ebfff26d bl 1f3991c + 1f3cf64: e28dd018 add sp, sp, #24 + 1f3cf68: e8bd8070 pop {r4, r5, r6, pc} + +01f3cf6c : + 1f3cf6c: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f3cf70: e590600c ldr r6, [r0, #12] + 1f3cf74: e5908010 ldr r8, [r0, #16] + 1f3cf78: e24dd018 sub sp, sp, #24 + 1f3cf7c: e1580006 cmp r8, r6 + 1f3cf80: 03a00000 moveq r0, #0 + 1f3cf84: 0a00002e beq 1f3d044 + 1f3cf88: e5903014 ldr r3, [r0, #20] + 1f3cf8c: e3530000 cmp r3, #0 + 1f3cf90: 03a00001 moveq r0, #1 + 1f3cf94: 0a00002a beq 1f3d044 + 1f3cf98: e1a04000 mov r4, r0 + 1f3cf9c: e30c74b8 movw r7, #50360 ; 0xc4b8 + 1f3cfa0: e340720d movt r7, #525 ; 0x20d + 1f3cfa4: e3a01c01 mov r1, #256 ; 0x100 + 1f3cfa8: e1a00007 mov r0, r7 + 1f3cfac: e3012648 movw r2, #5704 ; 0x1648 + 1f3cfb0: e34021f6 movt r2, #502 ; 0x1f6 + 1f3cfb4: eb000a88 bl 1f3f9dc + 1f3cfb8: e3a05000 mov r5, #0 + 1f3cfbc: e1a03208 lsl r3, r8, #4 + 1f3cfc0: e5940014 ldr r0, [r4, #20] + 1f3cfc4: e2833f4a add r3, r3, #296 ; 0x128 + 1f3cfc8: e1a01005 mov r1, r5 + 1f3cfcc: e3a020e0 mov r2, #224 ; 0xe0 + 1f3cfd0: e58d7000 str r7, [sp] + 1f3cfd4: e3a080ff mov r8, #255 ; 0xff + 1f3cfd8: e34f8f00 movt r8, #65280 ; 0xff00 + 1f3cfdc: e58d5014 str r5, [sp, #20] + 1f3cfe0: e58d8008 str r8, [sp, #8] + 1f3cfe4: e58d8004 str r8, [sp, #4] + 1f3cfe8: e58d5010 str r5, [sp, #16] + 1f3cfec: e58d500c str r5, [sp, #12] + 1f3cff0: ebfff249 bl 1f3991c + 1f3cff4: e3a01c01 mov r1, #256 ; 0x100 + 1f3cff8: e5846010 str r6, [r4, #16] + 1f3cffc: e1a00007 mov r0, r7 + 1f3d000: e301263c movw r2, #5692 ; 0x163c + 1f3d004: e34021f6 movt r2, #502 ; 0x1f6 + 1f3d008: eb000a73 bl 1f3f9dc + 1f3d00c: e1a03206 lsl r3, r6, #4 + 1f3d010: e5940014 ldr r0, [r4, #20] + 1f3d014: e3e0c000 mvn ip, #0 + 1f3d018: e58d5014 str r5, [sp, #20] + 1f3d01c: e1a01005 mov r1, r5 + 1f3d020: e58d5010 str r5, [sp, #16] + 1f3d024: e2833f4a add r3, r3, #296 ; 0x128 + 1f3d028: e58d500c str r5, [sp, #12] + 1f3d02c: e3a020e0 mov r2, #224 ; 0xe0 + 1f3d030: e58d8008 str r8, [sp, #8] + 1f3d034: e58d7000 str r7, [sp] + 1f3d038: e58dc004 str ip, [sp, #4] + 1f3d03c: ebfff236 bl 1f3991c + 1f3d040: e3a00001 mov r0, #1 + 1f3d044: e28dd018 add sp, sp, #24 + 1f3d048: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f3d04c >::_M_emplace_back_aux(DiskImage const&)>: + 1f3d04c: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f3d050: e8900048 ldm r0, {r3, r6} + 1f3d054: e1a08000 mov r8, r0 + 1f3d058: e3062965 movw r2, #26981 ; 0x6965 + 1f3d05c: e3402192 movt r2, #402 ; 0x192 + 1f3d060: e0630006 rsb r0, r3, r6 + 1f3d064: e1a05001 mov r5, r1 + 1f3d068: e1a01140 asr r1, r0, #2 + 1f3d06c: e0020192 mul r2, r2, r1 + 1f3d070: e3520000 cmp r2, #0 + 1f3d074: 0a00003d beq 1f3d170 >::_M_emplace_back_aux(DiskImage const&)+0x124> + 1f3d078: e1a0a082 lsl sl, r2, #1 + 1f3d07c: e152000a cmp r2, sl + 1f3d080: 9a00003d bls 1f3d17c >::_M_emplace_back_aux(DiskImage const&)+0x130> + 1f3d084: e30fae64 movw sl, #65124 ; 0xfe64 + 1f3d088: e34faff9 movt sl, #65529 ; 0xfff9 + 1f3d08c: e1a0000a mov r0, sl + 1f3d090: ebff0d7c bl 1f00688 + 1f3d094: e5983000 ldr r3, [r8] + 1f3d098: e5986004 ldr r6, [r8, #4] + 1f3d09c: e280492a add r4, r0, #688128 ; 0xa8000 + 1f3d0a0: e1a09000 mov r9, r0 + 1f3d0a4: e080a00a add sl, r0, sl + 1f3d0a8: e2844f6d add r4, r4, #436 ; 0x1b4 + 1f3d0ac: e0630006 rsb r0, r3, r6 + 1f3d0b0: e0990000 adds r0, r9, r0 + 1f3d0b4: 01a07003 moveq r7, r3 + 1f3d0b8: 0a000005 beq 1f3d0d4 >::_M_emplace_back_aux(DiskImage const&)+0x88> + 1f3d0bc: e1a01005 mov r1, r5 + 1f3d0c0: e30821b4 movw r2, #33204 ; 0x81b4 + 1f3d0c4: e340200a movt r2, #10 + 1f3d0c8: eb00074c bl 1f3ee00 + 1f3d0cc: e5986004 ldr r6, [r8, #4] + 1f3d0d0: e5987000 ldr r7, [r8] + 1f3d0d4: e1570006 cmp r7, r6 + 1f3d0d8: 0a00001d beq 1f3d154 >::_M_emplace_back_aux(DiskImage const&)+0x108> + 1f3d0dc: e1a05007 mov r5, r7 + 1f3d0e0: e1a04009 mov r4, r9 + 1f3d0e4: e3540000 cmp r4, #0 + 1f3d0e8: e1a01005 mov r1, r5 + 1f3d0ec: e285592a add r5, r5, #688128 ; 0xa8000 + 1f3d0f0: e30821b4 movw r2, #33204 ; 0x81b4 + 1f3d0f4: e340200a movt r2, #10 + 1f3d0f8: e1a00004 mov r0, r4 + 1f3d0fc: e2855f6d add r5, r5, #436 ; 0x1b4 + 1f3d100: e284492a add r4, r4, #688128 ; 0xa8000 + 1f3d104: 0a000000 beq 1f3d10c >::_M_emplace_back_aux(DiskImage const&)+0xc0> + 1f3d108: eb00073c bl 1f3ee00 + 1f3d10c: e1550006 cmp r5, r6 + 1f3d110: e2844f6d add r4, r4, #436 ; 0x1b4 + 1f3d114: 1afffff2 bne 1f3d0e4 >::_M_emplace_back_aux(DiskImage const&)+0x98> + 1f3d118: e287392a add r3, r7, #688128 ; 0xa8000 + 1f3d11c: e3062965 movw r2, #26981 ; 0x6965 + 1f3d120: e3402192 movt r2, #402 ; 0x192 + 1f3d124: e2833f6d add r3, r3, #436 ; 0x1b4 + 1f3d128: e30841b4 movw r4, #33204 ; 0x81b4 + 1f3d12c: e340400a movt r4, #10 + 1f3d130: e0633006 rsb r3, r3, r6 + 1f3d134: e5986000 ldr r6, [r8] + 1f3d138: e1a03123 lsr r3, r3, #2 + 1f3d13c: e0030392 mul r3, r2, r3 + 1f3d140: e3c33103 bic r3, r3, #-1073741824 ; 0xc0000000 + 1f3d144: e0244493 mla r4, r3, r4, r4 + 1f3d148: e284492a add r4, r4, #688128 ; 0xa8000 + 1f3d14c: e2844f6d add r4, r4, #436 ; 0x1b4 + 1f3d150: e0894004 add r4, r9, r4 + 1f3d154: e3560000 cmp r6, #0 + 1f3d158: 0a000001 beq 1f3d164 >::_M_emplace_back_aux(DiskImage const&)+0x118> + 1f3d15c: e1a00006 mov r0, r6 + 1f3d160: ebff0d49 bl 1f0068c + 1f3d164: e5889000 str r9, [r8] + 1f3d168: e9880410 stmib r8, {r4, sl} + 1f3d16c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3d170: e308a1b4 movw sl, #33204 ; 0x81b4 + 1f3d174: e340a00a movt sl, #10 + 1f3d178: eaffffc3 b 1f3d08c >::_M_emplace_back_aux(DiskImage const&)+0x40> + 1f3d17c: e301285d movw r2, #6237 ; 0x185d + 1f3d180: e15a0002 cmp sl, r2 + 1f3d184: 8affffbe bhi 1f3d084 >::_M_emplace_back_aux(DiskImage const&)+0x38> + 1f3d188: e35a0000 cmp sl, #0 + 1f3d18c: 030841b4 movweq r4, #33204 ; 0x81b4 + 1f3d190: 01a0900a moveq r9, sl + 1f3d194: 0340400a movteq r4, #10 + 1f3d198: 0affffc4 beq 1f3d0b0 >::_M_emplace_back_aux(DiskImage const&)+0x64> + 1f3d19c: e30831b4 movw r3, #33204 ; 0x81b4 + 1f3d1a0: e340300a movt r3, #10 + 1f3d1a4: e00a0a93 mul sl, r3, sl + 1f3d1a8: eaffffb7 b 1f3d08c >::_M_emplace_back_aux(DiskImage const&)+0x40> + +01f3d1ac : + 1f3d1ac: e92d40f0 push {r4, r5, r6, r7, lr} + 1f3d1b0: e1a05001 mov r5, r1 + 1f3d1b4: e1a06002 mov r6, r2 + 1f3d1b8: e24dd92a sub sp, sp, #688128 ; 0xa8000 + 1f3d1bc: e1a07003 mov r7, r3 + 1f3d1c0: e24ddf6f sub sp, sp, #444 ; 0x1bc + 1f3d1c4: e1a04000 mov r4, r0 + 1f3d1c8: e28d0004 add r0, sp, #4 + 1f3d1cc: ebff56b8 bl 1f12cb4 + 1f3d1d0: e1a01005 mov r1, r5 + 1f3d1d4: e1a03007 mov r3, r7 + 1f3d1d8: e1a02006 mov r2, r6 + 1f3d1dc: e28d0004 add r0, sp, #4 + 1f3d1e0: ebff5bb0 bl 1f140a8 + 1f3d1e4: e2505000 subs r5, r0, #0 + 1f3d1e8: 1a000003 bne 1f3d1fc + 1f3d1ec: e1a00005 mov r0, r5 + 1f3d1f0: e28dd92a add sp, sp, #688128 ; 0xa8000 + 1f3d1f4: e28ddf6f add sp, sp, #444 ; 0x1bc + 1f3d1f8: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f3d1fc: e5940004 ldr r0, [r4, #4] + 1f3d200: e3a02001 mov r2, #1 + 1f3d204: e5943008 ldr r3, [r4, #8] + 1f3d208: e5cd2004 strb r2, [sp, #4] + 1f3d20c: e1500003 cmp r0, r3 + 1f3d210: 0a000015 beq 1f3d26c + 1f3d214: e3500000 cmp r0, #0 + 1f3d218: 0a000004 beq 1f3d230 + 1f3d21c: e28d1004 add r1, sp, #4 + 1f3d220: e30821b4 movw r2, #33204 ; 0x81b4 + 1f3d224: e340200a movt r2, #10 + 1f3d228: eb0006f4 bl 1f3ee00 + 1f3d22c: e5940004 ldr r0, [r4, #4] + 1f3d230: e280092a add r0, r0, #688128 ; 0xa8000 + 1f3d234: e2800f6d add r0, r0, #436 ; 0x1b4 + 1f3d238: e5840004 str r0, [r4, #4] + 1f3d23c: e5942000 ldr r2, [r4] + 1f3d240: e3063965 movw r3, #26981 ; 0x6965 + 1f3d244: e3403192 movt r3, #402 ; 0x192 + 1f3d248: e0620000 rsb r0, r2, r0 + 1f3d24c: e1a00140 asr r0, r0, #2 + 1f3d250: e0000093 mul r0, r3, r0 + 1f3d254: e2400001 sub r0, r0, #1 + 1f3d258: e584000c str r0, [r4, #12] + 1f3d25c: e1a00005 mov r0, r5 + 1f3d260: e28dd92a add sp, sp, #688128 ; 0xa8000 + 1f3d264: e28ddf6f add sp, sp, #444 ; 0x1bc + 1f3d268: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f3d26c: e1a00004 mov r0, r4 + 1f3d270: e28d1004 add r1, sp, #4 + 1f3d274: ebffff74 bl 1f3d04c >::_M_emplace_back_aux(DiskImage const&)> + 1f3d278: e5940004 ldr r0, [r4, #4] + 1f3d27c: eaffffee b 1f3d23c + +01f3d280 : + 1f3d280: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f3d284: e1a07003 mov r7, r3 + 1f3d288: e1a05001 mov r5, r1 + 1f3d28c: e24dd92a sub sp, sp, #688128 ; 0xa8000 + 1f3d290: e1a06002 mov r6, r2 + 1f3d294: e24ddf6e sub sp, sp, #440 ; 0x1b8 + 1f3d298: e1a04000 mov r4, r0 + 1f3d29c: e28d392a add r3, sp, #688128 ; 0xa8000 + 1f3d2a0: e28d0004 add r0, sp, #4 + 1f3d2a4: e2833e1d add r3, r3, #464 ; 0x1d0 + 1f3d2a8: e5d38000 ldrb r8, [r3] + 1f3d2ac: ebff5680 bl 1f12cb4 + 1f3d2b0: e1a01005 mov r1, r5 + 1f3d2b4: e1a03007 mov r3, r7 + 1f3d2b8: e1a02006 mov r2, r6 + 1f3d2bc: e28d0004 add r0, sp, #4 + 1f3d2c0: ebff5a84 bl 1f13cd8 + 1f3d2c4: e2505000 subs r5, r0, #0 + 1f3d2c8: 1a000003 bne 1f3d2dc + 1f3d2cc: e1a00005 mov r0, r5 + 1f3d2d0: e28dd92a add sp, sp, #688128 ; 0xa8000 + 1f3d2d4: e28ddf6e add sp, sp, #440 ; 0x1b8 + 1f3d2d8: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f3d2dc: e9940009 ldmib r4, {r0, r3} + 1f3d2e0: e5cd8004 strb r8, [sp, #4] + 1f3d2e4: e1500003 cmp r0, r3 + 1f3d2e8: 0a000015 beq 1f3d344 + 1f3d2ec: e3500000 cmp r0, #0 + 1f3d2f0: 0a000004 beq 1f3d308 + 1f3d2f4: e28d1004 add r1, sp, #4 + 1f3d2f8: e30821b4 movw r2, #33204 ; 0x81b4 + 1f3d2fc: e340200a movt r2, #10 + 1f3d300: eb0006be bl 1f3ee00 + 1f3d304: e5940004 ldr r0, [r4, #4] + 1f3d308: e280092a add r0, r0, #688128 ; 0xa8000 + 1f3d30c: e2800f6d add r0, r0, #436 ; 0x1b4 + 1f3d310: e5840004 str r0, [r4, #4] + 1f3d314: e5942000 ldr r2, [r4] + 1f3d318: e3063965 movw r3, #26981 ; 0x6965 + 1f3d31c: e3403192 movt r3, #402 ; 0x192 + 1f3d320: e0620000 rsb r0, r2, r0 + 1f3d324: e1a00140 asr r0, r0, #2 + 1f3d328: e0000093 mul r0, r3, r0 + 1f3d32c: e2400001 sub r0, r0, #1 + 1f3d330: e584000c str r0, [r4, #12] + 1f3d334: e1a00005 mov r0, r5 + 1f3d338: e28dd92a add sp, sp, #688128 ; 0xa8000 + 1f3d33c: e28ddf6e add sp, sp, #440 ; 0x1b8 + 1f3d340: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f3d344: e1a00004 mov r0, r4 + 1f3d348: e28d1004 add r1, sp, #4 + 1f3d34c: ebffff3e bl 1f3d04c >::_M_emplace_back_aux(DiskImage const&)> + 1f3d350: e5940004 ldr r0, [r4, #4] + 1f3d354: eaffffee b 1f3d314 + +01f3d358 : + 1f3d358: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f3d35c: e1a07003 mov r7, r3 + 1f3d360: e1a05001 mov r5, r1 + 1f3d364: e24dd92a sub sp, sp, #688128 ; 0xa8000 + 1f3d368: e1a06002 mov r6, r2 + 1f3d36c: e24ddf6e sub sp, sp, #440 ; 0x1b8 + 1f3d370: e1a04000 mov r4, r0 + 1f3d374: e28d392a add r3, sp, #688128 ; 0xa8000 + 1f3d378: e28d0004 add r0, sp, #4 + 1f3d37c: e2833e1d add r3, r3, #464 ; 0x1d0 + 1f3d380: e5d38000 ldrb r8, [r3] + 1f3d384: ebff564a bl 1f12cb4 + 1f3d388: e1a01005 mov r1, r5 + 1f3d38c: e1a03007 mov r3, r7 + 1f3d390: e1a02006 mov r2, r6 + 1f3d394: e28d0004 add r0, sp, #4 + 1f3d398: ebff5aa8 bl 1f13e40 + 1f3d39c: e2505000 subs r5, r0, #0 + 1f3d3a0: 1a000003 bne 1f3d3b4 + 1f3d3a4: e1a00005 mov r0, r5 + 1f3d3a8: e28dd92a add sp, sp, #688128 ; 0xa8000 + 1f3d3ac: e28ddf6e add sp, sp, #440 ; 0x1b8 + 1f3d3b0: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f3d3b4: e9940009 ldmib r4, {r0, r3} + 1f3d3b8: e5cd8004 strb r8, [sp, #4] + 1f3d3bc: e1500003 cmp r0, r3 + 1f3d3c0: 0a000015 beq 1f3d41c + 1f3d3c4: e3500000 cmp r0, #0 + 1f3d3c8: 0a000004 beq 1f3d3e0 + 1f3d3cc: e28d1004 add r1, sp, #4 + 1f3d3d0: e30821b4 movw r2, #33204 ; 0x81b4 + 1f3d3d4: e340200a movt r2, #10 + 1f3d3d8: eb000688 bl 1f3ee00 + 1f3d3dc: e5940004 ldr r0, [r4, #4] + 1f3d3e0: e280092a add r0, r0, #688128 ; 0xa8000 + 1f3d3e4: e2800f6d add r0, r0, #436 ; 0x1b4 + 1f3d3e8: e5840004 str r0, [r4, #4] + 1f3d3ec: e5942000 ldr r2, [r4] + 1f3d3f0: e3063965 movw r3, #26981 ; 0x6965 + 1f3d3f4: e3403192 movt r3, #402 ; 0x192 + 1f3d3f8: e0620000 rsb r0, r2, r0 + 1f3d3fc: e1a00140 asr r0, r0, #2 + 1f3d400: e0000093 mul r0, r3, r0 + 1f3d404: e2400001 sub r0, r0, #1 + 1f3d408: e584000c str r0, [r4, #12] + 1f3d40c: e1a00005 mov r0, r5 + 1f3d410: e28dd92a add sp, sp, #688128 ; 0xa8000 + 1f3d414: e28ddf6e add sp, sp, #440 ; 0x1b8 + 1f3d418: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f3d41c: e1a00004 mov r0, r4 + 1f3d420: e28d1004 add r1, sp, #4 + 1f3d424: ebffff08 bl 1f3d04c >::_M_emplace_back_aux(DiskImage const&)> + 1f3d428: e5940004 ldr r0, [r4, #4] + 1f3d42c: eaffffee b 1f3d3ec + +01f3d430 : + 1f3d430: e92d40f0 push {r4, r5, r6, r7, lr} + 1f3d434: e1a05001 mov r5, r1 + 1f3d438: e1a06002 mov r6, r2 + 1f3d43c: e24dd92a sub sp, sp, #688128 ; 0xa8000 + 1f3d440: e1a07003 mov r7, r3 + 1f3d444: e24ddf6f sub sp, sp, #444 ; 0x1bc + 1f3d448: e1a04000 mov r4, r0 + 1f3d44c: e28d0004 add r0, sp, #4 + 1f3d450: ebff5617 bl 1f12cb4 + 1f3d454: e1a01005 mov r1, r5 + 1f3d458: e1a03007 mov r3, r7 + 1f3d45c: e1a02006 mov r2, r6 + 1f3d460: e28d0004 add r0, sp, #4 + 1f3d464: ebff5ab8 bl 1f13f4c + 1f3d468: e2505000 subs r5, r0, #0 + 1f3d46c: 1a000003 bne 1f3d480 + 1f3d470: e1a00005 mov r0, r5 + 1f3d474: e28dd92a add sp, sp, #688128 ; 0xa8000 + 1f3d478: e28ddf6f add sp, sp, #444 ; 0x1bc + 1f3d47c: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f3d480: e5940004 ldr r0, [r4, #4] + 1f3d484: e3a02001 mov r2, #1 + 1f3d488: e5943008 ldr r3, [r4, #8] + 1f3d48c: e5cd2004 strb r2, [sp, #4] + 1f3d490: e1500003 cmp r0, r3 + 1f3d494: 0a000015 beq 1f3d4f0 + 1f3d498: e3500000 cmp r0, #0 + 1f3d49c: 0a000004 beq 1f3d4b4 + 1f3d4a0: e28d1004 add r1, sp, #4 + 1f3d4a4: e30821b4 movw r2, #33204 ; 0x81b4 + 1f3d4a8: e340200a movt r2, #10 + 1f3d4ac: eb000653 bl 1f3ee00 + 1f3d4b0: e5940004 ldr r0, [r4, #4] + 1f3d4b4: e280092a add r0, r0, #688128 ; 0xa8000 + 1f3d4b8: e2800f6d add r0, r0, #436 ; 0x1b4 + 1f3d4bc: e5840004 str r0, [r4, #4] + 1f3d4c0: e5942000 ldr r2, [r4] + 1f3d4c4: e3063965 movw r3, #26981 ; 0x6965 + 1f3d4c8: e3403192 movt r3, #402 ; 0x192 + 1f3d4cc: e0620000 rsb r0, r2, r0 + 1f3d4d0: e1a00140 asr r0, r0, #2 + 1f3d4d4: e0000093 mul r0, r3, r0 + 1f3d4d8: e2400001 sub r0, r0, #1 + 1f3d4dc: e584000c str r0, [r4, #12] + 1f3d4e0: e1a00005 mov r0, r5 + 1f3d4e4: e28dd92a add sp, sp, #688128 ; 0xa8000 + 1f3d4e8: e28ddf6f add sp, sp, #444 ; 0x1bc + 1f3d4ec: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f3d4f0: e1a00004 mov r0, r4 + 1f3d4f4: e28d1004 add r1, sp, #4 + 1f3d4f8: ebfffed3 bl 1f3d04c >::_M_emplace_back_aux(DiskImage const&)> + 1f3d4fc: e5940004 ldr r0, [r4, #4] + 1f3d500: eaffffee b 1f3d4c0 + +01f3d504 : + 1f3d504: e92d43f0 push {r4, r5, r6, r7, r8, r9, lr} + 1f3d508: e281501a add r5, r1, #26 + 1f3d50c: e1a07001 mov r7, r1 + 1f3d510: e24ddf9b sub sp, sp, #620 ; 0x26c + 1f3d514: e1a04000 mov r4, r0 + 1f3d518: e1a09002 mov r9, r2 + 1f3d51c: e1a01005 mov r1, r5 + 1f3d520: e28d0020 add r0, sp, #32 + 1f3d524: e3a02001 mov r2, #1 + 1f3d528: ebff3df9 bl 1f0cd14 + 1f3d52c: e2506000 subs r6, r0, #0 + 1f3d530: 1a00002e bne 1f3d5f0 + 1f3d534: e5943014 ldr r3, [r4, #20] + 1f3d538: e3530000 cmp r3, #0 + 1f3d53c: 0a000015 beq 1f3d598 + 1f3d540: e30c84b8 movw r8, #50360 ; 0xc4b8 + 1f3d544: e340820d movt r8, #525 ; 0x20d + 1f3d548: e1a03005 mov r3, r5 + 1f3d54c: e3a01c01 mov r1, #256 ; 0x100 + 1f3d550: e1a00008 mov r0, r8 + 1f3d554: e301264c movw r2, #5708 ; 0x164c + 1f3d558: e34021f6 movt r2, #502 ; 0x1f6 + 1f3d55c: eb00091e bl 1f3f9dc + 1f3d560: e5940014 ldr r0, [r4, #20] + 1f3d564: e3e02000 mvn r2, #0 + 1f3d568: e3a030ff mov r3, #255 ; 0xff + 1f3d56c: e34f3f00 movt r3, #65280 ; 0xff00 + 1f3d570: e58d3008 str r3, [sp, #8] + 1f3d574: e58d2004 str r2, [sp, #4] + 1f3d578: e1a01006 mov r1, r6 + 1f3d57c: e58d8000 str r8, [sp] + 1f3d580: e3a03f46 mov r3, #280 ; 0x118 + 1f3d584: e58d6014 str r6, [sp, #20] + 1f3d588: e3a020f0 mov r2, #240 ; 0xf0 + 1f3d58c: e58d6010 str r6, [sp, #16] + 1f3d590: e58d600c str r6, [sp, #12] + 1f3d594: ebfff0e0 bl 1f3991c + 1f3d598: e3a00001 mov r0, #1 + 1f3d59c: ebff1cdd bl 1f04918 + 1f3d5a0: e28d301c add r3, sp, #28 + 1f3d5a4: e3a02702 mov r2, #524288 ; 0x80000 + 1f3d5a8: e3021298 movw r1, #8856 ; 0x2298 + 1f3d5ac: e34011fb movt r1, #507 ; 0x1fb + 1f3d5b0: e28d0020 add r0, sp, #32 + 1f3d5b4: ebff3ff3 bl 1f0d588 + 1f3d5b8: e3a00000 mov r0, #0 + 1f3d5bc: ebff1cd5 bl 1f04918 + 1f3d5c0: e28d0020 add r0, sp, #32 + 1f3d5c4: ebff45f7 bl 1f0eda8 + 1f3d5c8: e1a00005 mov r0, r5 + 1f3d5cc: ebff561d bl 1f12e48 + 1f3d5d0: e2400001 sub r0, r0, #1 + 1f3d5d4: e3500003 cmp r0, #3 + 1f3d5d8: 979ff100 ldrls pc, [pc, r0, lsl #2] + 1f3d5dc: ea000038 b 1f3d6c4 + 1f3d5e0: 01f3d658 .word 0x01f3d658 + 1f3d5e4: 01f3d67c .word 0x01f3d67c + 1f3d5e8: 01f3d6a0 .word 0x01f3d6a0 + 1f3d5ec: 01f3d618 .word 0x01f3d618 + 1f3d5f0: e301067c movw r0, #5756 ; 0x167c + 1f3d5f4: e34001f6 movt r0, #502 ; 0x1f6 + 1f3d5f8: e1a01005 mov r1, r5 + 1f3d5fc: e3a06000 mov r6, #0 + 1f3d600: eb0006d1 bl 1f3f14c + 1f3d604: e1a00006 mov r0, r6 + 1f3d608: e3a03000 mov r3, #0 + 1f3d60c: e5843010 str r3, [r4, #16] + 1f3d610: e28ddf9b add sp, sp, #620 ; 0x26c + 1f3d614: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f3d618: e59d301c ldr r3, [sp, #28] + 1f3d61c: e1a01007 mov r1, r7 + 1f3d620: e58d9000 str r9, [sp] + 1f3d624: e3022298 movw r2, #8856 ; 0x2298 + 1f3d628: e34021fb movt r2, #507 ; 0x1fb + 1f3d62c: e1a00004 mov r0, r4 + 1f3d630: ebfffedd bl 1f3d1ac + 1f3d634: e1a06000 mov r6, r0 + 1f3d638: e3560000 cmp r6, #0 + 1f3d63c: 0afffff0 beq 1f3d604 + 1f3d640: e1a01005 mov r1, r5 + 1f3d644: e301065c movw r0, #5724 ; 0x165c + 1f3d648: e34001f6 movt r0, #502 ; 0x1f6 + 1f3d64c: e59d201c ldr r2, [sp, #28] + 1f3d650: eb0006bd bl 1f3f14c + 1f3d654: eaffffea b 1f3d604 + 1f3d658: e59d301c ldr r3, [sp, #28] + 1f3d65c: e1a01007 mov r1, r7 + 1f3d660: e58d9000 str r9, [sp] + 1f3d664: e3022298 movw r2, #8856 ; 0x2298 + 1f3d668: e34021fb movt r2, #507 ; 0x1fb + 1f3d66c: e1a00004 mov r0, r4 + 1f3d670: ebffff02 bl 1f3d280 + 1f3d674: e1a06000 mov r6, r0 + 1f3d678: eaffffee b 1f3d638 + 1f3d67c: e59d301c ldr r3, [sp, #28] + 1f3d680: e1a01007 mov r1, r7 + 1f3d684: e58d9000 str r9, [sp] + 1f3d688: e3022298 movw r2, #8856 ; 0x2298 + 1f3d68c: e34021fb movt r2, #507 ; 0x1fb + 1f3d690: e1a00004 mov r0, r4 + 1f3d694: ebffff2f bl 1f3d358 + 1f3d698: e1a06000 mov r6, r0 + 1f3d69c: eaffffe5 b 1f3d638 + 1f3d6a0: e59d301c ldr r3, [sp, #28] + 1f3d6a4: e1a01007 mov r1, r7 + 1f3d6a8: e58d9000 str r9, [sp] + 1f3d6ac: e3022298 movw r2, #8856 ; 0x2298 + 1f3d6b0: e34021fb movt r2, #507 ; 0x1fb + 1f3d6b4: e1a00004 mov r0, r4 + 1f3d6b8: ebffff5c bl 1f3d430 + 1f3d6bc: e1a06000 mov r6, r0 + 1f3d6c0: eaffffdc b 1f3d638 + 1f3d6c4: e3a06000 mov r6, #0 + 1f3d6c8: eaffffcd b 1f3d604 + +01f3d6cc : + 1f3d6cc: e1a03000 mov r3, r0 + 1f3d6d0: e3010690 movw r0, #5776 ; 0x1690 + 1f3d6d4: e34001f6 movt r0, #502 ; 0x1f6 + 1f3d6d8: e2832802 add r2, r3, #131072 ; 0x20000 + 1f3d6dc: e592180c ldr r1, [r2, #2060] ; 0x80c + 1f3d6e0: e5821808 str r1, [r2, #2056] ; 0x808 + 1f3d6e4: e2812c02 add r2, r1, #512 ; 0x200 + 1f3d6e8: e0832402 add r2, r3, r2, lsl #8 + 1f3d6ec: ea000696 b 1f3f14c + +01f3d6f0 : + 1f3d6f0: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f3d6f4: e2807802 add r7, r0, #131072 ; 0x20000 + 1f3d6f8: e1a06001 mov r6, r1 + 1f3d6fc: e1a04007 mov r4, r7 + 1f3d700: e3a05000 mov r5, #0 + 1f3d704: e3540000 cmp r4, #0 + 1f3d708: e1a00004 mov r0, r4 + 1f3d70c: e1a01006 mov r1, r6 + 1f3d710: 0a000002 beq 1f3d720 + 1f3d714: eb000920 bl 1f3fb9c + 1f3d718: e3500000 cmp r0, #0 + 1f3d71c: 0a000004 beq 1f3d734 + 1f3d720: e2855001 add r5, r5, #1 + 1f3d724: e2844c01 add r4, r4, #256 ; 0x100 + 1f3d728: e3550008 cmp r5, #8 + 1f3d72c: 1afffff4 bne 1f3d704 + 1f3d730: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f3d734: e1a02004 mov r2, r4 + 1f3d738: e30106ac movw r0, #5804 ; 0x16ac + 1f3d73c: e34001f6 movt r0, #502 ; 0x1f6 + 1f3d740: e1a01005 mov r1, r5 + 1f3d744: eb000680 bl 1f3f14c + 1f3d748: e5875808 str r5, [r7, #2056] ; 0x808 + 1f3d74c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f3d750 ::~Singleton()>: + 1f3d750: e12fff1e bx lr + +01f3d754 : + 1f3d754: e12fff1e bx lr + +01f3d758 : + 1f3d758: e92d4010 push {r4, lr} + 1f3d75c: e1a04000 mov r4, r0 + 1f3d760: ebff0bc9 bl 1f0068c + 1f3d764: e1a00004 mov r0, r4 + 1f3d768: e8bd8010 pop {r4, pc} + +01f3d76c ::~Singleton()>: + 1f3d76c: e92d4010 push {r4, lr} + 1f3d770: e1a04000 mov r4, r0 + 1f3d774: ebff0bc4 bl 1f0068c + 1f3d778: e1a00004 mov r0, r4 + 1f3d77c: e8bd8010 pop {r4, pc} + +01f3d780 : + 1f3d780: e30136d0 movw r3, #5840 ; 0x16d0 + 1f3d784: e34031f6 movt r3, #502 ; 0x1f6 + 1f3d788: e5803000 str r3, [r0] + 1f3d78c: e12fff1e bx lr + +01f3d790 : + 1f3d790: e30a32b8 movw r3, #41656 ; 0xa2b8 + 1f3d794: e340320d movt r3, #525 ; 0x20d + 1f3d798: e3a01000 mov r1, #0 + 1f3d79c: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f3d7a0: e5d32000 ldrb r2, [r3] + 1f3d7a4: e5801008 str r1, [r0, #8] + 1f3d7a8: e1520001 cmp r2, r1 + 1f3d7ac: 0a000008 beq 1f3d7d4 + 1f3d7b0: e30a1300 movw r1, #41728 ; 0xa300 + 1f3d7b4: e340120d movt r1, #525 ; 0x20d + 1f3d7b8: e5d11000 ldrb r1, [r1] + 1f3d7bc: e3510000 cmp r1, #0 + 1f3d7c0: 1a000003 bne 1f3d7d4 + 1f3d7c4: e3a03008 mov r3, #8 + 1f3d7c8: e5803008 str r3, [r0, #8] + 1f3d7cc: e1a00002 mov r0, r2 + 1f3d7d0: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f3d7d4: e30a22a0 movw r2, #41632 ; 0xa2a0 + 1f3d7d8: e340220d movt r2, #525 ; 0x20d + 1f3d7dc: e30a12c0 movw r1, #41664 ; 0xa2c0 + 1f3d7e0: e340120d movt r1, #525 ; 0x20d + 1f3d7e4: e592e004 ldr lr, [r2, #4] + 1f3d7e8: e591c004 ldr ip, [r1, #4] + 1f3d7ec: e15e000c cmp lr, ip + 1f3d7f0: 0a000004 beq 1f3d808 + 1f3d7f4: e3a03010 mov r3, #16 + 1f3d7f8: e3a02001 mov r2, #1 + 1f3d7fc: e5803008 str r3, [r0, #8] + 1f3d800: e1a00002 mov r0, r2 + 1f3d804: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f3d808: e592c008 ldr ip, [r2, #8] + 1f3d80c: e5912008 ldr r2, [r1, #8] + 1f3d810: e15c0002 cmp ip, r2 + 1f3d814: 0a000004 beq 1f3d82c + 1f3d818: e3a02001 mov r2, #1 + 1f3d81c: e3a03040 mov r3, #64 ; 0x40 + 1f3d820: e5803008 str r3, [r0, #8] + 1f3d824: e1a00002 mov r0, r2 + 1f3d828: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f3d82c: e5d32003 ldrb r2, [r3, #3] + 1f3d830: e3520000 cmp r2, #0 + 1f3d834: 0a000006 beq 1f3d854 + 1f3d838: e30a1300 movw r1, #41728 ; 0xa300 + 1f3d83c: e340120d movt r1, #525 ; 0x20d + 1f3d840: e5d11003 ldrb r1, [r1, #3] + 1f3d844: e3510000 cmp r1, #0 + 1f3d848: 03a03c02 moveq r3, #512 ; 0x200 + 1f3d84c: 05803008 streq r3, [r0, #8] + 1f3d850: 0affffea beq 1f3d800 + 1f3d854: e5d32004 ldrb r2, [r3, #4] + 1f3d858: e3520000 cmp r2, #0 + 1f3d85c: 0affffe7 beq 1f3d800 + 1f3d860: e30a3300 movw r3, #41728 ; 0xa300 + 1f3d864: e340320d movt r3, #525 ; 0x20d + 1f3d868: e5d33004 ldrb r3, [r3, #4] + 1f3d86c: e3530000 cmp r3, #0 + 1f3d870: 13a02000 movne r2, #0 + 1f3d874: 03a03b01 moveq r3, #1024 ; 0x400 + 1f3d878: 05803008 streq r3, [r0, #8] + 1f3d87c: eaffffdf b 1f3d800 + +01f3d880 : + 1f3d880: e30a32b8 movw r3, #41656 ; 0xa2b8 + 1f3d884: e340320d movt r3, #525 ; 0x20d + 1f3d888: e3a01000 mov r1, #0 + 1f3d88c: e5801008 str r1, [r0, #8] + 1f3d890: e5d32000 ldrb r2, [r3] + 1f3d894: e1520001 cmp r2, r1 + 1f3d898: 0a000007 beq 1f3d8bc + 1f3d89c: e30a2300 movw r2, #41728 ; 0xa300 + 1f3d8a0: e340220d movt r2, #525 ; 0x20d + 1f3d8a4: e5d22000 ldrb r2, [r2] + 1f3d8a8: e1520001 cmp r2, r1 + 1f3d8ac: 1a000002 bne 1f3d8bc + 1f3d8b0: e3a03001 mov r3, #1 + 1f3d8b4: e5803008 str r3, [r0, #8] + 1f3d8b8: e12fff1e bx lr + 1f3d8bc: e5d32001 ldrb r2, [r3, #1] + 1f3d8c0: e3520000 cmp r2, #0 + 1f3d8c4: 1a00000a bne 1f3d8f4 + 1f3d8c8: e5d33002 ldrb r3, [r3, #2] + 1f3d8cc: e3530000 cmp r3, #0 + 1f3d8d0: 0a00000f beq 1f3d914 + 1f3d8d4: e30a3300 movw r3, #41728 ; 0xa300 + 1f3d8d8: e340320d movt r3, #525 ; 0x20d + 1f3d8dc: e5d33002 ldrb r3, [r3, #2] + 1f3d8e0: e3530000 cmp r3, #0 + 1f3d8e4: 1a00000b bne 1f3d918 + 1f3d8e8: e3a03004 mov r3, #4 + 1f3d8ec: e5803008 str r3, [r0, #8] + 1f3d8f0: e12fff1e bx lr + 1f3d8f4: e30a2300 movw r2, #41728 ; 0xa300 + 1f3d8f8: e340220d movt r2, #525 ; 0x20d + 1f3d8fc: e5d22001 ldrb r2, [r2, #1] + 1f3d900: e3520000 cmp r2, #0 + 1f3d904: 1affffef bne 1f3d8c8 + 1f3d908: e3a03002 mov r3, #2 + 1f3d90c: e5803008 str r3, [r0, #8] + 1f3d910: e12fff1e bx lr + 1f3d914: e12fff1e bx lr + 1f3d918: e12fff1e bx lr + 1f3d91c: 00000000 andeq r0, r0, r0 + +01f3d920 : + 1f3d920: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f3d924: e3084010 movw r4, #32784 ; 0x8010 + 1f3d928: e34041f6 movt r4, #502 ; 0x1f6 + 1f3d92c: e1a05000 mov r5, r0 + 1f3d930: e5940000 ldr r0, [r4] + 1f3d934: e3500000 cmp r0, #0 + 1f3d938: 0a000239 beq 1f3e224 + 1f3d93c: e1c020d8 ldrd r2, [r0, #8] + 1f3d940: e3a02000 mov r2, #0 + 1f3d944: e3a01000 mov r1, #0 + 1f3d948: e2033c02 and r3, r3, #512 ; 0x200 + 1f3d94c: e5851004 str r1, [r5, #4] + 1f3d950: e1923003 orrs r3, r2, r3 + 1f3d954: 1a000227 bne 1f3e1f8 + 1f3d958: e1c020d8 ldrd r2, [r0, #8] + 1f3d95c: e3a02000 mov r2, #0 + 1f3d960: e2033c01 and r3, r3, #256 ; 0x100 + 1f3d964: e1923003 orrs r3, r2, r3 + 1f3d968: 1a00021e bne 1f3e1e8 + 1f3d96c: e1c020d8 ldrd r2, [r0, #8] + 1f3d970: e3a02000 mov r2, #0 + 1f3d974: e2033b01 and r3, r3, #1024 ; 0x400 + 1f3d978: e1923003 orrs r3, r2, r3 + 1f3d97c: 1a000224 bne 1f3e214 + 1f3d980: e1c020d8 ldrd r2, [r0, #8] + 1f3d984: e3a02000 mov r2, #0 + 1f3d988: e2033a01 and r3, r3, #4096 ; 0x1000 + 1f3d98c: e1923003 orrs r3, r2, r3 + 1f3d990: 1a00021b bne 1f3e204 + 1f3d994: e1c021d0 ldrd r2, [r0, #16] + 1f3d998: e3a03000 mov r3, #0 + 1f3d99c: e2022c02 and r2, r2, #512 ; 0x200 + 1f3d9a0: e1923003 orrs r3, r2, r3 + 1f3d9a4: 1a000225 bne 1f3e240 + 1f3d9a8: e1c021d0 ldrd r2, [r0, #16] + 1f3d9ac: e3a03000 mov r3, #0 + 1f3d9b0: e2022701 and r2, r2, #262144 ; 0x40000 + 1f3d9b4: e1923003 orrs r3, r2, r3 + 1f3d9b8: 1a000228 bne 1f3e260 + 1f3d9bc: e1c021d0 ldrd r2, [r0, #16] + 1f3d9c0: e3a03000 mov r3, #0 + 1f3d9c4: e2022b02 and r2, r2, #2048 ; 0x800 + 1f3d9c8: e1923003 orrs r3, r2, r3 + 1f3d9cc: 1a00021f bne 1f3e250 + 1f3d9d0: e1c021d0 ldrd r2, [r0, #16] + 1f3d9d4: e3a03000 mov r3, #0 + 1f3d9d8: e2022801 and r2, r2, #65536 ; 0x10000 + 1f3d9dc: e1923003 orrs r3, r2, r3 + 1f3d9e0: 1a00021a bne 1f3e250 + 1f3d9e4: e1c021d0 ldrd r2, [r0, #16] + 1f3d9e8: e3a03000 mov r3, #0 + 1f3d9ec: e2022802 and r2, r2, #131072 ; 0x20000 + 1f3d9f0: e1923003 orrs r3, r2, r3 + 1f3d9f4: 1a000221 bne 1f3e280 + 1f3d9f8: e1c021d0 ldrd r2, [r0, #16] + 1f3d9fc: e3a03000 mov r3, #0 + 1f3da00: e2022901 and r2, r2, #16384 ; 0x4000 + 1f3da04: e1923003 orrs r3, r2, r3 + 1f3da08: 1a000218 bne 1f3e270 + 1f3da0c: e1c021d0 ldrd r2, [r0, #16] + 1f3da10: e3a03000 mov r3, #0 + 1f3da14: e2022902 and r2, r2, #32768 ; 0x8000 + 1f3da18: e1923003 orrs r3, r2, r3 + 1f3da1c: 1a000213 bne 1f3e270 + 1f3da20: eddf0be4 vldr d16, [pc, #912] ; 1f3ddb8 + 1f3da24: e3012480 movw r2, #5248 ; 0x1480 + 1f3da28: e34021f6 movt r2, #502 ; 0x1f6 + 1f3da2c: e5923000 ldr r3, [r2] + 1f3da30: e353003f cmp r3, #63 ; 0x3f + 1f3da34: e203303f and r3, r3, #63 ; 0x3f + 1f3da38: 83a01010 movhi r1, #16 + 1f3da3c: 93a01008 movls r1, #8 + 1f3da40: ee023b90 vmov.32 d18[0], r3 + 1f3da44: e0801001 add r1, r0, r1 + 1f3da48: e1c180d0 ldrd r8, [r1] + 1f3da4c: f37214a0 vshl.u64 d17, d16, d18 + 1f3da50: ec576b31 vmov r6, r7, d17 + 1f3da54: e0066008 and r6, r6, r8 + 1f3da58: e0077009 and r7, r7, r9 + 1f3da5c: e1963007 orrs r3, r6, r7 + 1f3da60: 1a00001e bne 1f3dae0 + 1f3da64: e5923004 ldr r3, [r2, #4] + 1f3da68: e353003f cmp r3, #63 ; 0x3f + 1f3da6c: e203303f and r3, r3, #63 ; 0x3f + 1f3da70: 83a01010 movhi r1, #16 + 1f3da74: 93a01008 movls r1, #8 + 1f3da78: ee023b90 vmov.32 d18[0], r3 + 1f3da7c: e0801001 add r1, r0, r1 + 1f3da80: e1c180d0 ldrd r8, [r1] + 1f3da84: f37214a0 vshl.u64 d17, d16, d18 + 1f3da88: ec576b31 vmov r6, r7, d17 + 1f3da8c: e0066008 and r6, r6, r8 + 1f3da90: e0077009 and r7, r7, r9 + 1f3da94: e1963007 orrs r3, r6, r7 + 1f3da98: 1a000010 bne 1f3dae0 + 1f3da9c: e5923008 ldr r3, [r2, #8] + 1f3daa0: e353003f cmp r3, #63 ; 0x3f + 1f3daa4: e203303f and r3, r3, #63 ; 0x3f + 1f3daa8: 83a01010 movhi r1, #16 + 1f3daac: 93a01008 movls r1, #8 + 1f3dab0: ee013b90 vmov.32 d17[0], r3 + 1f3dab4: e0801001 add r1, r0, r1 + 1f3dab8: e1c160d0 ldrd r6, [r1] + 1f3dabc: f37104a0 vshl.u64 d16, d16, d17 + 1f3dac0: ec598b30 vmov r8, r9, d16 + 1f3dac4: e0088006 and r8, r8, r6 + 1f3dac8: e0099007 and r9, r9, r7 + 1f3dacc: e1a06008 mov r6, r8 + 1f3dad0: e1a07009 mov r7, r9 + 1f3dad4: e1963007 orrs r3, r6, r7 + 1f3dad8: 03a03000 moveq r3, #0 + 1f3dadc: 0a000001 beq 1f3dae8 + 1f3dae0: e3a03b02 mov r3, #2048 ; 0x800 + 1f3dae4: e5853004 str r3, [r5, #4] + 1f3dae8: e592100c ldr r1, [r2, #12] + 1f3daec: e301e480 movw lr, #5248 ; 0x1480 + 1f3daf0: e340e1f6 movt lr, #502 ; 0x1f6 + 1f3daf4: eddf0baf vldr d16, [pc, #700] ; 1f3ddb8 + 1f3daf8: e351003f cmp r1, #63 ; 0x3f + 1f3dafc: e201103f and r1, r1, #63 ; 0x3f + 1f3db00: 83a0c010 movhi ip, #16 + 1f3db04: 93a0c008 movls ip, #8 + 1f3db08: ee021b90 vmov.32 d18[0], r1 + 1f3db0c: e080c00c add ip, r0, ip + 1f3db10: e1cc80d0 ldrd r8, [ip] + 1f3db14: f37214a0 vshl.u64 d17, d16, d18 + 1f3db18: ec576b31 vmov r6, r7, d17 + 1f3db1c: e0066008 and r6, r6, r8 + 1f3db20: e0077009 and r7, r7, r9 + 1f3db24: e1961007 orrs r1, r6, r7 + 1f3db28: 1a00001d bne 1f3dba4 + 1f3db2c: e59e1010 ldr r1, [lr, #16] + 1f3db30: e351003f cmp r1, #63 ; 0x3f + 1f3db34: e201103f and r1, r1, #63 ; 0x3f + 1f3db38: 83a0c010 movhi ip, #16 + 1f3db3c: 93a0c008 movls ip, #8 + 1f3db40: ee021b90 vmov.32 d18[0], r1 + 1f3db44: e080c00c add ip, r0, ip + 1f3db48: e1cc80d0 ldrd r8, [ip] + 1f3db4c: f37214a0 vshl.u64 d17, d16, d18 + 1f3db50: ec576b31 vmov r6, r7, d17 + 1f3db54: e0066008 and r6, r6, r8 + 1f3db58: e0077009 and r7, r7, r9 + 1f3db5c: e1961007 orrs r1, r6, r7 + 1f3db60: 1a00000f bne 1f3dba4 + 1f3db64: e59e1014 ldr r1, [lr, #20] + 1f3db68: e351003f cmp r1, #63 ; 0x3f + 1f3db6c: e201103f and r1, r1, #63 ; 0x3f + 1f3db70: 83a0c010 movhi ip, #16 + 1f3db74: 93a0c008 movls ip, #8 + 1f3db78: ee011b90 vmov.32 d17[0], r1 + 1f3db7c: e080c00c add ip, r0, ip + 1f3db80: e1cc60d0 ldrd r6, [ip] + 1f3db84: f37104a0 vshl.u64 d16, d16, d17 + 1f3db88: ec598b30 vmov r8, r9, d16 + 1f3db8c: e0088006 and r8, r8, r6 + 1f3db90: e0099007 and r9, r9, r7 + 1f3db94: e1a06008 mov r6, r8 + 1f3db98: e1a07009 mov r7, r9 + 1f3db9c: e1961007 orrs r1, r6, r7 + 1f3dba0: 0a000001 beq 1f3dbac + 1f3dba4: e3833b02 orr r3, r3, #2048 ; 0x800 + 1f3dba8: e5853004 str r3, [r5, #4] + 1f3dbac: e5921018 ldr r1, [r2, #24] + 1f3dbb0: e301e480 movw lr, #5248 ; 0x1480 + 1f3dbb4: e340e1f6 movt lr, #502 ; 0x1f6 + 1f3dbb8: eddf0b7e vldr d16, [pc, #504] ; 1f3ddb8 + 1f3dbbc: e351003f cmp r1, #63 ; 0x3f + 1f3dbc0: e201103f and r1, r1, #63 ; 0x3f + 1f3dbc4: 83a0c010 movhi ip, #16 + 1f3dbc8: 93a0c008 movls ip, #8 + 1f3dbcc: ee021b90 vmov.32 d18[0], r1 + 1f3dbd0: e080c00c add ip, r0, ip + 1f3dbd4: e1cc80d0 ldrd r8, [ip] + 1f3dbd8: f37214a0 vshl.u64 d17, d16, d18 + 1f3dbdc: ec576b31 vmov r6, r7, d17 + 1f3dbe0: e0066008 and r6, r6, r8 + 1f3dbe4: e0077009 and r7, r7, r9 + 1f3dbe8: e1961007 orrs r1, r6, r7 + 1f3dbec: 1a00001d bne 1f3dc68 + 1f3dbf0: e59e101c ldr r1, [lr, #28] + 1f3dbf4: e351003f cmp r1, #63 ; 0x3f + 1f3dbf8: e201103f and r1, r1, #63 ; 0x3f + 1f3dbfc: 83a0c010 movhi ip, #16 + 1f3dc00: 93a0c008 movls ip, #8 + 1f3dc04: ee021b90 vmov.32 d18[0], r1 + 1f3dc08: e080c00c add ip, r0, ip + 1f3dc0c: e1cc80d0 ldrd r8, [ip] + 1f3dc10: f37214a0 vshl.u64 d17, d16, d18 + 1f3dc14: ec576b31 vmov r6, r7, d17 + 1f3dc18: e0066008 and r6, r6, r8 + 1f3dc1c: e0077009 and r7, r7, r9 + 1f3dc20: e1961007 orrs r1, r6, r7 + 1f3dc24: 1a00000f bne 1f3dc68 + 1f3dc28: e59e1020 ldr r1, [lr, #32] + 1f3dc2c: e351003f cmp r1, #63 ; 0x3f + 1f3dc30: e201103f and r1, r1, #63 ; 0x3f + 1f3dc34: 83a0c010 movhi ip, #16 + 1f3dc38: 93a0c008 movls ip, #8 + 1f3dc3c: ee011b90 vmov.32 d17[0], r1 + 1f3dc40: e080c00c add ip, r0, ip + 1f3dc44: e1cc60d0 ldrd r6, [ip] + 1f3dc48: f37104a0 vshl.u64 d16, d16, d17 + 1f3dc4c: ec598b30 vmov r8, r9, d16 + 1f3dc50: e0088006 and r8, r8, r6 + 1f3dc54: e0099007 and r9, r9, r7 + 1f3dc58: e1a06008 mov r6, r8 + 1f3dc5c: e1a07009 mov r7, r9 + 1f3dc60: e1961007 orrs r1, r6, r7 + 1f3dc64: 0a000001 beq 1f3dc70 + 1f3dc68: e3833b02 orr r3, r3, #2048 ; 0x800 + 1f3dc6c: e5853004 str r3, [r5, #4] + 1f3dc70: e5921024 ldr r1, [r2, #36] ; 0x24 + 1f3dc74: e301e480 movw lr, #5248 ; 0x1480 + 1f3dc78: e340e1f6 movt lr, #502 ; 0x1f6 + 1f3dc7c: eddf0b4d vldr d16, [pc, #308] ; 1f3ddb8 + 1f3dc80: e351003f cmp r1, #63 ; 0x3f + 1f3dc84: e201103f and r1, r1, #63 ; 0x3f + 1f3dc88: 83a0c010 movhi ip, #16 + 1f3dc8c: 93a0c008 movls ip, #8 + 1f3dc90: ee021b90 vmov.32 d18[0], r1 + 1f3dc94: e080c00c add ip, r0, ip + 1f3dc98: e1cc80d0 ldrd r8, [ip] + 1f3dc9c: f37214a0 vshl.u64 d17, d16, d18 + 1f3dca0: ec576b31 vmov r6, r7, d17 + 1f3dca4: e0066008 and r6, r6, r8 + 1f3dca8: e0077009 and r7, r7, r9 + 1f3dcac: e1961007 orrs r1, r6, r7 + 1f3dcb0: 1a00001d bne 1f3dd2c + 1f3dcb4: e59e1028 ldr r1, [lr, #40] ; 0x28 + 1f3dcb8: e351003f cmp r1, #63 ; 0x3f + 1f3dcbc: e201103f and r1, r1, #63 ; 0x3f + 1f3dcc0: 83a0c010 movhi ip, #16 + 1f3dcc4: 93a0c008 movls ip, #8 + 1f3dcc8: ee021b90 vmov.32 d18[0], r1 + 1f3dccc: e080c00c add ip, r0, ip + 1f3dcd0: e1cc80d0 ldrd r8, [ip] + 1f3dcd4: f37214a0 vshl.u64 d17, d16, d18 + 1f3dcd8: ec576b31 vmov r6, r7, d17 + 1f3dcdc: e0066008 and r6, r6, r8 + 1f3dce0: e0077009 and r7, r7, r9 + 1f3dce4: e1961007 orrs r1, r6, r7 + 1f3dce8: 1a00000f bne 1f3dd2c + 1f3dcec: e59e102c ldr r1, [lr, #44] ; 0x2c + 1f3dcf0: e351003f cmp r1, #63 ; 0x3f + 1f3dcf4: e201103f and r1, r1, #63 ; 0x3f + 1f3dcf8: 83a0c010 movhi ip, #16 + 1f3dcfc: 93a0c008 movls ip, #8 + 1f3dd00: ee011b90 vmov.32 d17[0], r1 + 1f3dd04: e080c00c add ip, r0, ip + 1f3dd08: e1cc60d0 ldrd r6, [ip] + 1f3dd0c: f37104a0 vshl.u64 d16, d16, d17 + 1f3dd10: ec598b30 vmov r8, r9, d16 + 1f3dd14: e0088006 and r8, r8, r6 + 1f3dd18: e0099007 and r9, r9, r7 + 1f3dd1c: e1a06008 mov r6, r8 + 1f3dd20: e1a07009 mov r7, r9 + 1f3dd24: e1961007 orrs r1, r6, r7 + 1f3dd28: 0a000001 beq 1f3dd34 + 1f3dd2c: e3833b02 orr r3, r3, #2048 ; 0x800 + 1f3dd30: e5853004 str r3, [r5, #4] + 1f3dd34: e5921030 ldr r1, [r2, #48] ; 0x30 + 1f3dd38: e301e480 movw lr, #5248 ; 0x1480 + 1f3dd3c: e340e1f6 movt lr, #502 ; 0x1f6 + 1f3dd40: eddf0b1c vldr d16, [pc, #112] ; 1f3ddb8 + 1f3dd44: e351003f cmp r1, #63 ; 0x3f + 1f3dd48: e201103f and r1, r1, #63 ; 0x3f + 1f3dd4c: 83a0c010 movhi ip, #16 + 1f3dd50: 93a0c008 movls ip, #8 + 1f3dd54: ee021b90 vmov.32 d18[0], r1 + 1f3dd58: e080c00c add ip, r0, ip + 1f3dd5c: e1cc80d0 ldrd r8, [ip] + 1f3dd60: f37214a0 vshl.u64 d17, d16, d18 + 1f3dd64: ec576b31 vmov r6, r7, d17 + 1f3dd68: e0066008 and r6, r6, r8 + 1f3dd6c: e0077009 and r7, r7, r9 + 1f3dd70: e1961007 orrs r1, r6, r7 + 1f3dd74: 1a000021 bne 1f3de00 + 1f3dd78: e59e1034 ldr r1, [lr, #52] ; 0x34 + 1f3dd7c: e351003f cmp r1, #63 ; 0x3f + 1f3dd80: e201103f and r1, r1, #63 ; 0x3f + 1f3dd84: 83a0c010 movhi ip, #16 + 1f3dd88: 93a0c008 movls ip, #8 + 1f3dd8c: ee021b90 vmov.32 d18[0], r1 + 1f3dd90: e080c00c add ip, r0, ip + 1f3dd94: e1cc80d0 ldrd r8, [ip] + 1f3dd98: f37214a0 vshl.u64 d17, d16, d18 + 1f3dd9c: ec576b31 vmov r6, r7, d17 + 1f3dda0: e0066008 and r6, r6, r8 + 1f3dda4: e0077009 and r7, r7, r9 + 1f3dda8: e1961007 orrs r1, r6, r7 + 1f3ddac: 1a000013 bne 1f3de00 + 1f3ddb0: ea000002 b 1f3ddc0 + 1f3ddb4: e320f000 nop {0} + 1f3ddb8: 00000001 .word 0x00000001 + 1f3ddbc: 00000000 .word 0x00000000 + 1f3ddc0: e59e1038 ldr r1, [lr, #56] ; 0x38 + 1f3ddc4: e351003f cmp r1, #63 ; 0x3f + 1f3ddc8: e201103f and r1, r1, #63 ; 0x3f + 1f3ddcc: 83a0c010 movhi ip, #16 + 1f3ddd0: 93a0c008 movls ip, #8 + 1f3ddd4: ee011b90 vmov.32 d17[0], r1 + 1f3ddd8: e080c00c add ip, r0, ip + 1f3dddc: e1cc60d0 ldrd r6, [ip] + 1f3dde0: f37104a0 vshl.u64 d16, d16, d17 + 1f3dde4: ec598b30 vmov r8, r9, d16 + 1f3dde8: e0088006 and r8, r8, r6 + 1f3ddec: e0099007 and r9, r9, r7 + 1f3ddf0: e1a06008 mov r6, r8 + 1f3ddf4: e1a07009 mov r7, r9 + 1f3ddf8: e1961007 orrs r1, r6, r7 + 1f3ddfc: 0a000001 beq 1f3de08 + 1f3de00: e3833b02 orr r3, r3, #2048 ; 0x800 + 1f3de04: e5853004 str r3, [r5, #4] + 1f3de08: e592103c ldr r1, [r2, #60] ; 0x3c + 1f3de0c: e301e480 movw lr, #5248 ; 0x1480 + 1f3de10: e340e1f6 movt lr, #502 ; 0x1f6 + 1f3de14: ed5f0b19 vldr d16, [pc, #-100] ; 1f3ddb8 + 1f3de18: e351003f cmp r1, #63 ; 0x3f + 1f3de1c: e201103f and r1, r1, #63 ; 0x3f + 1f3de20: 83a0c010 movhi ip, #16 + 1f3de24: 93a0c008 movls ip, #8 + 1f3de28: ee021b90 vmov.32 d18[0], r1 + 1f3de2c: e080c00c add ip, r0, ip + 1f3de30: e1cc80d0 ldrd r8, [ip] + 1f3de34: f37214a0 vshl.u64 d17, d16, d18 + 1f3de38: ec576b31 vmov r6, r7, d17 + 1f3de3c: e0066008 and r6, r6, r8 + 1f3de40: e0077009 and r7, r7, r9 + 1f3de44: e1961007 orrs r1, r6, r7 + 1f3de48: 1a00001d bne 1f3dec4 + 1f3de4c: e59e1040 ldr r1, [lr, #64] ; 0x40 + 1f3de50: e351003f cmp r1, #63 ; 0x3f + 1f3de54: e201103f and r1, r1, #63 ; 0x3f + 1f3de58: 83a0c010 movhi ip, #16 + 1f3de5c: 93a0c008 movls ip, #8 + 1f3de60: ee021b90 vmov.32 d18[0], r1 + 1f3de64: e080c00c add ip, r0, ip + 1f3de68: e1cc80d0 ldrd r8, [ip] + 1f3de6c: f37214a0 vshl.u64 d17, d16, d18 + 1f3de70: ec576b31 vmov r6, r7, d17 + 1f3de74: e0066008 and r6, r6, r8 + 1f3de78: e0077009 and r7, r7, r9 + 1f3de7c: e1961007 orrs r1, r6, r7 + 1f3de80: 1a00000f bne 1f3dec4 + 1f3de84: e59e1044 ldr r1, [lr, #68] ; 0x44 + 1f3de88: e351003f cmp r1, #63 ; 0x3f + 1f3de8c: e201103f and r1, r1, #63 ; 0x3f + 1f3de90: 83a0c010 movhi ip, #16 + 1f3de94: 93a0c008 movls ip, #8 + 1f3de98: ee011b90 vmov.32 d17[0], r1 + 1f3de9c: e080c00c add ip, r0, ip + 1f3dea0: e1cc60d0 ldrd r6, [ip] + 1f3dea4: f37104a0 vshl.u64 d16, d16, d17 + 1f3dea8: ec598b30 vmov r8, r9, d16 + 1f3deac: e0088006 and r8, r8, r6 + 1f3deb0: e0099007 and r9, r9, r7 + 1f3deb4: e1a06008 mov r6, r8 + 1f3deb8: e1a07009 mov r7, r9 + 1f3debc: e1961007 orrs r1, r6, r7 + 1f3dec0: 0a000001 beq 1f3decc + 1f3dec4: e3833b02 orr r3, r3, #2048 ; 0x800 + 1f3dec8: e5853004 str r3, [r5, #4] + 1f3decc: e5921048 ldr r1, [r2, #72] ; 0x48 + 1f3ded0: e301e480 movw lr, #5248 ; 0x1480 + 1f3ded4: e340e1f6 movt lr, #502 ; 0x1f6 + 1f3ded8: ed5f0b4a vldr d16, [pc, #-296] ; 1f3ddb8 + 1f3dedc: e351003f cmp r1, #63 ; 0x3f + 1f3dee0: e201103f and r1, r1, #63 ; 0x3f + 1f3dee4: 83a0c010 movhi ip, #16 + 1f3dee8: 93a0c008 movls ip, #8 + 1f3deec: ee021b90 vmov.32 d18[0], r1 + 1f3def0: e080c00c add ip, r0, ip + 1f3def4: e1cc80d0 ldrd r8, [ip] + 1f3def8: f37214a0 vshl.u64 d17, d16, d18 + 1f3defc: ec576b31 vmov r6, r7, d17 + 1f3df00: e0066008 and r6, r6, r8 + 1f3df04: e0077009 and r7, r7, r9 + 1f3df08: e1961007 orrs r1, r6, r7 + 1f3df0c: 1a00001d bne 1f3df88 + 1f3df10: e59e104c ldr r1, [lr, #76] ; 0x4c + 1f3df14: e351003f cmp r1, #63 ; 0x3f + 1f3df18: e201103f and r1, r1, #63 ; 0x3f + 1f3df1c: 83a0c010 movhi ip, #16 + 1f3df20: 93a0c008 movls ip, #8 + 1f3df24: ee021b90 vmov.32 d18[0], r1 + 1f3df28: e080c00c add ip, r0, ip + 1f3df2c: e1cc80d0 ldrd r8, [ip] + 1f3df30: f37214a0 vshl.u64 d17, d16, d18 + 1f3df34: ec576b31 vmov r6, r7, d17 + 1f3df38: e0066008 and r6, r6, r8 + 1f3df3c: e0077009 and r7, r7, r9 + 1f3df40: e1961007 orrs r1, r6, r7 + 1f3df44: 1a00000f bne 1f3df88 + 1f3df48: e59e1050 ldr r1, [lr, #80] ; 0x50 + 1f3df4c: e351003f cmp r1, #63 ; 0x3f + 1f3df50: e201103f and r1, r1, #63 ; 0x3f + 1f3df54: 83a0c010 movhi ip, #16 + 1f3df58: 93a0c008 movls ip, #8 + 1f3df5c: ee011b90 vmov.32 d17[0], r1 + 1f3df60: e080c00c add ip, r0, ip + 1f3df64: e1cc60d0 ldrd r6, [ip] + 1f3df68: f37104a0 vshl.u64 d16, d16, d17 + 1f3df6c: ec598b30 vmov r8, r9, d16 + 1f3df70: e0088006 and r8, r8, r6 + 1f3df74: e0099007 and r9, r9, r7 + 1f3df78: e1a06008 mov r6, r8 + 1f3df7c: e1a07009 mov r7, r9 + 1f3df80: e1961007 orrs r1, r6, r7 + 1f3df84: 0a000001 beq 1f3df90 + 1f3df88: e3833b02 orr r3, r3, #2048 ; 0x800 + 1f3df8c: e5853004 str r3, [r5, #4] + 1f3df90: e5921054 ldr r1, [r2, #84] ; 0x54 + 1f3df94: e301e480 movw lr, #5248 ; 0x1480 + 1f3df98: e340e1f6 movt lr, #502 ; 0x1f6 + 1f3df9c: ed5f0b7b vldr d16, [pc, #-492] ; 1f3ddb8 + 1f3dfa0: e351003f cmp r1, #63 ; 0x3f + 1f3dfa4: e201103f and r1, r1, #63 ; 0x3f + 1f3dfa8: 83a0c010 movhi ip, #16 + 1f3dfac: 93a0c008 movls ip, #8 + 1f3dfb0: ee021b90 vmov.32 d18[0], r1 + 1f3dfb4: e080c00c add ip, r0, ip + 1f3dfb8: e1cc80d0 ldrd r8, [ip] + 1f3dfbc: f37214a0 vshl.u64 d17, d16, d18 + 1f3dfc0: ec576b31 vmov r6, r7, d17 + 1f3dfc4: e0066008 and r6, r6, r8 + 1f3dfc8: e0077009 and r7, r7, r9 + 1f3dfcc: e1961007 orrs r1, r6, r7 + 1f3dfd0: 1a00001d bne 1f3e04c + 1f3dfd4: e59e1058 ldr r1, [lr, #88] ; 0x58 + 1f3dfd8: e351003f cmp r1, #63 ; 0x3f + 1f3dfdc: e201103f and r1, r1, #63 ; 0x3f + 1f3dfe0: 83a0c010 movhi ip, #16 + 1f3dfe4: 93a0c008 movls ip, #8 + 1f3dfe8: ee021b90 vmov.32 d18[0], r1 + 1f3dfec: e080c00c add ip, r0, ip + 1f3dff0: e1cc80d0 ldrd r8, [ip] + 1f3dff4: f37214a0 vshl.u64 d17, d16, d18 + 1f3dff8: ec576b31 vmov r6, r7, d17 + 1f3dffc: e0066008 and r6, r6, r8 + 1f3e000: e0077009 and r7, r7, r9 + 1f3e004: e1961007 orrs r1, r6, r7 + 1f3e008: 1a00000f bne 1f3e04c + 1f3e00c: e59e105c ldr r1, [lr, #92] ; 0x5c + 1f3e010: e351003f cmp r1, #63 ; 0x3f + 1f3e014: e201103f and r1, r1, #63 ; 0x3f + 1f3e018: 83a0c010 movhi ip, #16 + 1f3e01c: 93a0c008 movls ip, #8 + 1f3e020: ee011b90 vmov.32 d17[0], r1 + 1f3e024: e080c00c add ip, r0, ip + 1f3e028: e1cc60d0 ldrd r6, [ip] + 1f3e02c: f37104a0 vshl.u64 d16, d16, d17 + 1f3e030: ec598b30 vmov r8, r9, d16 + 1f3e034: e0088006 and r8, r8, r6 + 1f3e038: e0099007 and r9, r9, r7 + 1f3e03c: e1a06008 mov r6, r8 + 1f3e040: e1a07009 mov r7, r9 + 1f3e044: e1961007 orrs r1, r6, r7 + 1f3e048: 0a000001 beq 1f3e054 + 1f3e04c: e3833b02 orr r3, r3, #2048 ; 0x800 + 1f3e050: e5853004 str r3, [r5, #4] + 1f3e054: e5921060 ldr r1, [r2, #96] ; 0x60 + 1f3e058: e301e480 movw lr, #5248 ; 0x1480 + 1f3e05c: e340e1f6 movt lr, #502 ; 0x1f6 + 1f3e060: ed5f0bac vldr d16, [pc, #-688] ; 1f3ddb8 + 1f3e064: e351003f cmp r1, #63 ; 0x3f + 1f3e068: e201103f and r1, r1, #63 ; 0x3f + 1f3e06c: 83a0c010 movhi ip, #16 + 1f3e070: 93a0c008 movls ip, #8 + 1f3e074: ee021b90 vmov.32 d18[0], r1 + 1f3e078: e080c00c add ip, r0, ip + 1f3e07c: e1cc80d0 ldrd r8, [ip] + 1f3e080: f37214a0 vshl.u64 d17, d16, d18 + 1f3e084: ec576b31 vmov r6, r7, d17 + 1f3e088: e0066008 and r6, r6, r8 + 1f3e08c: e0077009 and r7, r7, r9 + 1f3e090: e1961007 orrs r1, r6, r7 + 1f3e094: 1a00001d bne 1f3e110 + 1f3e098: e59e1064 ldr r1, [lr, #100] ; 0x64 + 1f3e09c: e351003f cmp r1, #63 ; 0x3f + 1f3e0a0: e201103f and r1, r1, #63 ; 0x3f + 1f3e0a4: 83a0c010 movhi ip, #16 + 1f3e0a8: 93a0c008 movls ip, #8 + 1f3e0ac: ee021b90 vmov.32 d18[0], r1 + 1f3e0b0: e080c00c add ip, r0, ip + 1f3e0b4: e1cc80d0 ldrd r8, [ip] + 1f3e0b8: f37214a0 vshl.u64 d17, d16, d18 + 1f3e0bc: ec576b31 vmov r6, r7, d17 + 1f3e0c0: e0066008 and r6, r6, r8 + 1f3e0c4: e0077009 and r7, r7, r9 + 1f3e0c8: e1961007 orrs r1, r6, r7 + 1f3e0cc: 1a00000f bne 1f3e110 + 1f3e0d0: e59e1068 ldr r1, [lr, #104] ; 0x68 + 1f3e0d4: e351003f cmp r1, #63 ; 0x3f + 1f3e0d8: e201103f and r1, r1, #63 ; 0x3f + 1f3e0dc: 83a0c010 movhi ip, #16 + 1f3e0e0: 93a0c008 movls ip, #8 + 1f3e0e4: ee011b90 vmov.32 d17[0], r1 + 1f3e0e8: e080c00c add ip, r0, ip + 1f3e0ec: e1cc60d0 ldrd r6, [ip] + 1f3e0f0: f37104a0 vshl.u64 d16, d16, d17 + 1f3e0f4: ec598b30 vmov r8, r9, d16 + 1f3e0f8: e0088006 and r8, r8, r6 + 1f3e0fc: e0099007 and r9, r9, r7 + 1f3e100: e1a06008 mov r6, r8 + 1f3e104: e1a07009 mov r7, r9 + 1f3e108: e1961007 orrs r1, r6, r7 + 1f3e10c: 0a000001 beq 1f3e118 + 1f3e110: e3833b02 orr r3, r3, #2048 ; 0x800 + 1f3e114: e5853004 str r3, [r5, #4] + 1f3e118: e592206c ldr r2, [r2, #108] ; 0x6c + 1f3e11c: e301c480 movw ip, #5248 ; 0x1480 + 1f3e120: e340c1f6 movt ip, #502 ; 0x1f6 + 1f3e124: ed5f0bdd vldr d16, [pc, #-884] ; 1f3ddb8 + 1f3e128: e352003f cmp r2, #63 ; 0x3f + 1f3e12c: e202203f and r2, r2, #63 ; 0x3f + 1f3e130: 83a01010 movhi r1, #16 + 1f3e134: 93a01008 movls r1, #8 + 1f3e138: ee022b90 vmov.32 d18[0], r2 + 1f3e13c: e0801001 add r1, r0, r1 + 1f3e140: e1c180d0 ldrd r8, [r1] + 1f3e144: f37214a0 vshl.u64 d17, d16, d18 + 1f3e148: ec576b31 vmov r6, r7, d17 + 1f3e14c: e0066008 and r6, r6, r8 + 1f3e150: e0077009 and r7, r7, r9 + 1f3e154: e1962007 orrs r2, r6, r7 + 1f3e158: 1a00001d bne 1f3e1d4 + 1f3e15c: e59c2070 ldr r2, [ip, #112] ; 0x70 + 1f3e160: e352003f cmp r2, #63 ; 0x3f + 1f3e164: e202203f and r2, r2, #63 ; 0x3f + 1f3e168: 83a01010 movhi r1, #16 + 1f3e16c: 93a01008 movls r1, #8 + 1f3e170: ee022b90 vmov.32 d18[0], r2 + 1f3e174: e0801001 add r1, r0, r1 + 1f3e178: e1c180d0 ldrd r8, [r1] + 1f3e17c: f37214a0 vshl.u64 d17, d16, d18 + 1f3e180: ec576b31 vmov r6, r7, d17 + 1f3e184: e0066008 and r6, r6, r8 + 1f3e188: e0077009 and r7, r7, r9 + 1f3e18c: e1962007 orrs r2, r6, r7 + 1f3e190: 1a00000f bne 1f3e1d4 + 1f3e194: e59c2074 ldr r2, [ip, #116] ; 0x74 + 1f3e198: e352003f cmp r2, #63 ; 0x3f + 1f3e19c: e202203f and r2, r2, #63 ; 0x3f + 1f3e1a0: 83a01010 movhi r1, #16 + 1f3e1a4: 93a01008 movls r1, #8 + 1f3e1a8: ee012b90 vmov.32 d17[0], r2 + 1f3e1ac: e0800001 add r0, r0, r1 + 1f3e1b0: e1c000d0 ldrd r0, [r0] + 1f3e1b4: f37104a0 vshl.u64 d16, d16, d17 + 1f3e1b8: ec576b30 vmov r6, r7, d16 + 1f3e1bc: e0066000 and r6, r6, r0 + 1f3e1c0: e0077001 and r7, r7, r1 + 1f3e1c4: e1a00006 mov r0, r6 + 1f3e1c8: e1a01007 mov r1, r7 + 1f3e1cc: e1902001 orrs r2, r0, r1 + 1f3e1d0: 0a000001 beq 1f3e1dc + 1f3e1d4: e3833b02 orr r3, r3, #2048 ; 0x800 + 1f3e1d8: e5853004 str r3, [r5, #4] + 1f3e1dc: e2930000 adds r0, r3, #0 + 1f3e1e0: 13a00001 movne r0, #1 + 1f3e1e4: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3e1e8: e3a03008 mov r3, #8 + 1f3e1ec: e3a00001 mov r0, #1 + 1f3e1f0: e5853004 str r3, [r5, #4] + 1f3e1f4: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3e1f8: e3a00001 mov r0, #1 + 1f3e1fc: e5850004 str r0, [r5, #4] + 1f3e200: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3e204: e3a03c01 mov r3, #256 ; 0x100 + 1f3e208: e3a00001 mov r0, #1 + 1f3e20c: e5853004 str r3, [r5, #4] + 1f3e210: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3e214: e3a03c02 mov r3, #512 ; 0x200 + 1f3e218: e3a00001 mov r0, #1 + 1f3e21c: e5853004 str r3, [r5, #4] + 1f3e220: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3e224: e3a00e23 mov r0, #560 ; 0x230 + 1f3e228: ebff0916 bl 1f00688 + 1f3e22c: e1a06000 mov r6, r0 + 1f3e230: ebff507a bl 1f12420 + 1f3e234: e5846000 str r6, [r4] + 1f3e238: e1a00006 mov r0, r6 + 1f3e23c: eafffdbe b 1f3d93c + 1f3e240: e3a03b01 mov r3, #1024 ; 0x400 + 1f3e244: e3a00001 mov r0, #1 + 1f3e248: e5853004 str r3, [r5, #4] + 1f3e24c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3e250: e3a03020 mov r3, #32 + 1f3e254: e3a00001 mov r0, #1 + 1f3e258: e5853004 str r3, [r5, #4] + 1f3e25c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3e260: e3a03010 mov r3, #16 + 1f3e264: e3a00001 mov r0, #1 + 1f3e268: e5853004 str r3, [r5, #4] + 1f3e26c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3e270: e3a03080 mov r3, #128 ; 0x80 + 1f3e274: e3a00001 mov r0, #1 + 1f3e278: e5853004 str r3, [r5, #4] + 1f3e27c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f3e280: e3a03040 mov r3, #64 ; 0x40 + 1f3e284: e3a00001 mov r0, #1 + 1f3e288: e5853004 str r3, [r5, #4] + 1f3e28c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + +01f3e290 : + 1f3e290: e92d4df0 push {r4, r5, r6, r7, r8, sl, fp, lr} + 1f3e294: e3084010 movw r4, #32784 ; 0x8010 + 1f3e298: e34041f6 movt r4, #502 ; 0x1f6 + 1f3e29c: e1a05000 mov r5, r0 + 1f3e2a0: e24dd008 sub sp, sp, #8 + 1f3e2a4: e5940000 ldr r0, [r4] + 1f3e2a8: e3500000 cmp r0, #0 + 1f3e2ac: 0a000061 beq 1f3e438 + 1f3e2b0: e590c228 ldr ip, [r0, #552] ; 0x228 + 1f3e2b4: e3a03000 mov r3, #0 + 1f3e2b8: e590e22c ldr lr, [r0, #556] ; 0x22c + 1f3e2bc: e5853004 str r3, [r5, #4] + 1f3e2c0: e15e000c cmp lr, ip + 1f3e2c4: 0a00004b beq 1f3e3f8 + 1f3e2c8: e590c228 ldr ip, [r0, #552] ; 0x228 + 1f3e2cc: e1c060d8 ldrd r6, [r0, #8] + 1f3e2d0: e3a06000 mov r6, #0 + 1f3e2d4: e580c22c str ip, [r0, #556] ; 0x22c + 1f3e2d8: e2077c02 and r7, r7, #512 ; 0x200 + 1f3e2dc: e196c007 orrs ip, r6, r7 + 1f3e2e0: 1a000046 bne 1f3e400 + 1f3e2e4: e1c061d0 ldrd r6, [r0, #16] + 1f3e2e8: e3a07000 mov r7, #0 + 1f3e2ec: e2066b02 and r6, r6, #2048 ; 0x800 + 1f3e2f0: e196c007 orrs ip, r6, r7 + 1f3e2f4: 1a00004a bne 1f3e424 + 1f3e2f8: e1c061d0 ldrd r6, [r0, #16] + 1f3e2fc: e3a07000 mov r7, #0 + 1f3e300: e2066901 and r6, r6, #16384 ; 0x4000 + 1f3e304: e196c007 orrs ip, r6, r7 + 1f3e308: 1a000041 bne 1f3e414 + 1f3e30c: e3510001 cmp r1, #1 + 1f3e310: 9a000038 bls 1f3e3f8 + 1f3e314: e3520000 cmp r2, #0 + 1f3e318: 0a000036 beq 1f3e3f8 + 1f3e31c: e30c85b8 movw r8, #50616 ; 0xc5b8 + 1f3e320: e340820d movt r8, #525 ; 0x20d + 1f3e324: eddf0b4d vldr d16, [pc, #308] ; 1f3e460 + 1f3e328: e3011480 movw r1, #5248 ; 0x1480 + 1f3e32c: e34011f6 movt r1, #502 ; 0x1f6 + 1f3e330: e598c000 ldr ip, [r8] + 1f3e334: e3a0e001 mov lr, #1 + 1f3e338: e5914000 ldr r4, [r1] + 1f3e33c: e204503f and r5, r4, #63 ; 0x3f + 1f3e340: e354003f cmp r4, #63 ; 0x3f + 1f3e344: 83a06010 movhi r6, #16 + 1f3e348: 93a06008 movls r6, #8 + 1f3e34c: ee025b90 vmov.32 d18[0], r5 + 1f3e350: e0806006 add r6, r0, r6 + 1f3e354: e1c660d0 ldrd r6, [r6] + 1f3e358: f37214a0 vshl.u64 d17, d16, d18 + 1f3e35c: ec5bab31 vmov sl, fp, d17 + 1f3e360: e00a4006 and r4, sl, r6 + 1f3e364: e00b5007 and r5, fp, r7 + 1f3e368: e1944005 orrs r4, r4, r5 + 1f3e36c: 1a00001b bne 1f3e3e0 + 1f3e370: e5914004 ldr r4, [r1, #4] + 1f3e374: e204503f and r5, r4, #63 ; 0x3f + 1f3e378: e354003f cmp r4, #63 ; 0x3f + 1f3e37c: 83a06010 movhi r6, #16 + 1f3e380: 93a06008 movls r6, #8 + 1f3e384: ee025b90 vmov.32 d18[0], r5 + 1f3e388: e0806006 add r6, r0, r6 + 1f3e38c: e1c660d0 ldrd r6, [r6] + 1f3e390: f37214a0 vshl.u64 d17, d16, d18 + 1f3e394: ec5bab31 vmov sl, fp, d17 + 1f3e398: e00a4006 and r4, sl, r6 + 1f3e39c: e00b5007 and r5, fp, r7 + 1f3e3a0: e1944005 orrs r4, r4, r5 + 1f3e3a4: 1a00000d bne 1f3e3e0 + 1f3e3a8: e5914008 ldr r4, [r1, #8] + 1f3e3ac: e204503f and r5, r4, #63 ; 0x3f + 1f3e3b0: e354003f cmp r4, #63 ; 0x3f + 1f3e3b4: 83a06010 movhi r6, #16 + 1f3e3b8: 93a06008 movls r6, #8 + 1f3e3bc: ee025b90 vmov.32 d18[0], r5 + 1f3e3c0: e0806006 add r6, r0, r6 + 1f3e3c4: e1c660d0 ldrd r6, [r6] + 1f3e3c8: f37214a0 vshl.u64 d17, d16, d18 + 1f3e3cc: ec5bab31 vmov sl, fp, d17 + 1f3e3d0: e00a4006 and r4, sl, r6 + 1f3e3d4: e00b5007 and r5, fp, r7 + 1f3e3d8: e1944005 orrs r4, r4, r5 + 1f3e3dc: 0a000000 beq 1f3e3e4 + 1f3e3e0: e18cc31e orr ip, ip, lr, lsl r3 + 1f3e3e4: e2833001 add r3, r3, #1 + 1f3e3e8: e281100c add r1, r1, #12 + 1f3e3ec: e1520003 cmp r2, r3 + 1f3e3f0: 1affffd0 bne 1f3e338 + 1f3e3f4: e588c000 str ip, [r8] + 1f3e3f8: e28dd008 add sp, sp, #8 + 1f3e3fc: e8bd8df0 pop {r4, r5, r6, r7, r8, sl, fp, pc} + 1f3e400: e5953004 ldr r3, [r5, #4] + 1f3e404: e3833001 orr r3, r3, #1 + 1f3e408: e5853004 str r3, [r5, #4] + 1f3e40c: e28dd008 add sp, sp, #8 + 1f3e410: e8bd8df0 pop {r4, r5, r6, r7, r8, sl, fp, pc} + 1f3e414: e5953004 ldr r3, [r5, #4] + 1f3e418: e3833002 orr r3, r3, #2 + 1f3e41c: e5853004 str r3, [r5, #4] + 1f3e420: eafffff4 b 1f3e3f8 + 1f3e424: e5953004 ldr r3, [r5, #4] + 1f3e428: e3833004 orr r3, r3, #4 + 1f3e42c: e5853004 str r3, [r5, #4] + 1f3e430: e28dd008 add sp, sp, #8 + 1f3e434: e8bd8df0 pop {r4, r5, r6, r7, r8, sl, fp, pc} + 1f3e438: e3a00e23 mov r0, #560 ; 0x230 + 1f3e43c: e88d0006 stm sp, {r1, r2} + 1f3e440: ebff0890 bl 1f00688 + 1f3e444: e1a06000 mov r6, r0 + 1f3e448: ebff4ff4 bl 1f12420 + 1f3e44c: e5846000 str r6, [r4] + 1f3e450: e1a00006 mov r0, r6 + 1f3e454: e89d0006 ldm sp, {r1, r2} + 1f3e458: eaffff94 b 1f3e2b0 + 1f3e45c: e320f000 nop {0} + 1f3e460: 00000001 .word 0x00000001 + 1f3e464: 00000000 .word 0x00000000 + +01f3e468 : + 1f3e468: e3500000 cmp r0, #0 + 1f3e46c: b2600000 rsblt r0, r0, #0 + 1f3e470: e12fff1e bx lr + +01f3e474 <__aeabi_atexit>: + 1f3e474: e1a03001 mov r3, r1 + 1f3e478: e92d4010 push {r4, lr} + 1f3e47c: e1a01000 mov r1, r0 + 1f3e480: e1a00003 mov r0, r3 + 1f3e484: eb000001 bl 1f3e490 <__cxa_atexit> + 1f3e488: e8bd4010 pop {r4, lr} + 1f3e48c: e12fff1e bx lr + +01f3e490 <__cxa_atexit>: + 1f3e490: e92d4010 push {r4, lr} + 1f3e494: e1a03002 mov r3, r2 + 1f3e498: e1a02001 mov r2, r1 + 1f3e49c: e1a01000 mov r1, r0 + 1f3e4a0: e3a00002 mov r0, #2 + 1f3e4a4: eb001b7b bl 1f45298 <__register_exitproc> + 1f3e4a8: e8bd4010 pop {r4, lr} + 1f3e4ac: e12fff1e bx lr + +01f3e4b0 <__libc_init_array>: + 1f3e4b0: e92d4070 push {r4, r5, r6, lr} + 1f3e4b4: e59f6064 ldr r6, [pc, #100] ; 1f3e520 <__libc_init_array+0x70> + 1f3e4b8: e59f5064 ldr r5, [pc, #100] ; 1f3e524 <__libc_init_array+0x74> + 1f3e4bc: e0656006 rsb r6, r5, r6 + 1f3e4c0: e1b06146 asrs r6, r6, #2 + 1f3e4c4: 13a04000 movne r4, #0 + 1f3e4c8: 0a000005 beq 1f3e4e4 <__libc_init_array+0x34> + 1f3e4cc: e2844001 add r4, r4, #1 + 1f3e4d0: e4953004 ldr r3, [r5], #4 + 1f3e4d4: e1a0e00f mov lr, pc + 1f3e4d8: e12fff13 bx r3 + 1f3e4dc: e1560004 cmp r6, r4 + 1f3e4e0: 1afffff9 bne 1f3e4cc <__libc_init_array+0x1c> + 1f3e4e4: e59f603c ldr r6, [pc, #60] ; 1f3e528 <__libc_init_array+0x78> + 1f3e4e8: e59f503c ldr r5, [pc, #60] ; 1f3e52c <__libc_init_array+0x7c> + 1f3e4ec: e0656006 rsb r6, r5, r6 + 1f3e4f0: ebff07ac bl 1f003a8 <_init> + 1f3e4f4: e1b06146 asrs r6, r6, #2 + 1f3e4f8: 13a04000 movne r4, #0 + 1f3e4fc: 0a000005 beq 1f3e518 <__libc_init_array+0x68> + 1f3e500: e2844001 add r4, r4, #1 + 1f3e504: e4953004 ldr r3, [r5], #4 + 1f3e508: e1a0e00f mov lr, pc + 1f3e50c: e12fff13 bx r3 + 1f3e510: e1560004 cmp r6, r4 + 1f3e514: 1afffff9 bne 1f3e500 <__libc_init_array+0x50> + 1f3e518: e8bd4070 pop {r4, r5, r6, lr} + 1f3e51c: e12fff1e bx lr + 1f3e520: 01f64164 .word 0x01f64164 + 1f3e524: 01f64164 .word 0x01f64164 + 1f3e528: 01f64168 .word 0x01f64168 + 1f3e52c: 01f64164 .word 0x01f64164 + +01f3e530 : + 1f3e530: e59f3010 ldr r3, [pc, #16] ; 1f3e548 + 1f3e534: e5933000 ldr r3, [r3] + 1f3e538: e0830000 add r0, r3, r0 + 1f3e53c: e5d00001 ldrb r0, [r0, #1] + 1f3e540: e2000004 and r0, r0, #4 + 1f3e544: e12fff1e bx lr + 1f3e548: 01f657dc .word 0x01f657dc + +01f3e54c : + 1f3e54c: e59f3010 ldr r3, [pc, #16] ; 1f3e564 + 1f3e550: e5933000 ldr r3, [r3] + 1f3e554: e0830000 add r0, r3, r0 + 1f3e558: e5d00001 ldrb r0, [r0, #1] + 1f3e55c: e2000008 and r0, r0, #8 + 1f3e560: e12fff1e bx lr + 1f3e564: 01f657dc .word 0x01f657dc + +01f3e568 : + 1f3e568: e92d4010 push {r4, lr} + 1f3e56c: e59f3010 ldr r3, [pc, #16] ; 1f3e584 + 1f3e570: e1a01000 mov r1, r0 + 1f3e574: e5930000 ldr r0, [r3] + 1f3e578: eb00000a bl 1f3e5a8 <_malloc_r> + 1f3e57c: e8bd4010 pop {r4, lr} + 1f3e580: e12fff1e bx lr + 1f3e584: 01f65c08 .word 0x01f65c08 + +01f3e588 : + 1f3e588: e92d4010 push {r4, lr} + 1f3e58c: e59f3010 ldr r3, [pc, #16] ; 1f3e5a4 + 1f3e590: e1a01000 mov r1, r0 + 1f3e594: e5930000 ldr r0, [r3] + 1f3e598: eb00226d bl 1f46f54 <_free_r> + 1f3e59c: e8bd4010 pop {r4, lr} + 1f3e5a0: e12fff1e bx lr + 1f3e5a4: 01f65c08 .word 0x01f65c08 + +01f3e5a8 <_malloc_r>: + 1f3e5a8: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f3e5ac: e281500b add r5, r1, #11 + 1f3e5b0: e3550016 cmp r5, #22 + 1f3e5b4: e24dd00c sub sp, sp, #12 + 1f3e5b8: e1a06000 mov r6, r0 + 1f3e5bc: 9a000073 bls 1f3e790 <_malloc_r+0x1e8> + 1f3e5c0: e3c55007 bic r5, r5, #7 + 1f3e5c4: e1510005 cmp r1, r5 + 1f3e5c8: 93a01000 movls r1, #0 + 1f3e5cc: 83a01001 movhi r1, #1 + 1f3e5d0: e1913fa5 orrs r3, r1, r5, lsr #31 + 1f3e5d4: 1a00008a bne 1f3e804 <_malloc_r+0x25c> + 1f3e5d8: eb0002cc bl 1f3f110 <__malloc_lock> + 1f3e5dc: e3550f7e cmp r5, #504 ; 0x1f8 + 1f3e5e0: 3a0001cf bcc 1f3ed24 <_malloc_r+0x77c> + 1f3e5e4: e1b034a5 lsrs r3, r5, #9 + 1f3e5e8: 0a00008c beq 1f3e820 <_malloc_r+0x278> + 1f3e5ec: e3530004 cmp r3, #4 + 1f3e5f0: 8a0000da bhi 1f3e960 <_malloc_r+0x3b8> + 1f3e5f4: e1a00325 lsr r0, r5, #6 + 1f3e5f8: e280c039 add ip, r0, #57 ; 0x39 + 1f3e5fc: e1a0108c lsl r1, ip, #1 + 1f3e600: e2800038 add r0, r0, #56 ; 0x38 + 1f3e604: e59f7728 ldr r7, [pc, #1832] ; 1f3ed34 <_malloc_r+0x78c> + 1f3e608: e0871101 add r1, r7, r1, lsl #2 + 1f3e60c: e5914004 ldr r4, [r1, #4] + 1f3e610: e2411008 sub r1, r1, #8 + 1f3e614: e1510004 cmp r1, r4 + 1f3e618: 1a000005 bne 1f3e634 <_malloc_r+0x8c> + 1f3e61c: ea000083 b 1f3e830 <_malloc_r+0x288> + 1f3e620: e3520000 cmp r2, #0 + 1f3e624: aa000067 bge 1f3e7c8 <_malloc_r+0x220> + 1f3e628: e594400c ldr r4, [r4, #12] + 1f3e62c: e1510004 cmp r1, r4 + 1f3e630: 0a00007e beq 1f3e830 <_malloc_r+0x288> + 1f3e634: e5943004 ldr r3, [r4, #4] + 1f3e638: e3c33003 bic r3, r3, #3 + 1f3e63c: e0652003 rsb r2, r5, r3 + 1f3e640: e352000f cmp r2, #15 + 1f3e644: dafffff5 ble 1f3e620 <_malloc_r+0x78> + 1f3e648: e59f16e4 ldr r1, [pc, #1764] ; 1f3ed34 <_malloc_r+0x78c> + 1f3e64c: e5974010 ldr r4, [r7, #16] + 1f3e650: e281c008 add ip, r1, #8 + 1f3e654: e154000c cmp r4, ip + 1f3e658: 05918004 ldreq r8, [r1, #4] + 1f3e65c: 0a000019 beq 1f3e6c8 <_malloc_r+0x120> + 1f3e660: e5943004 ldr r3, [r4, #4] + 1f3e664: e3c33003 bic r3, r3, #3 + 1f3e668: e0652003 rsb r2, r5, r3 + 1f3e66c: e352000f cmp r2, #15 + 1f3e670: ca0000df bgt 1f3e9f4 <_malloc_r+0x44c> + 1f3e674: e3520000 cmp r2, #0 + 1f3e678: e581c014 str ip, [r1, #20] + 1f3e67c: e581c010 str ip, [r1, #16] + 1f3e680: aa00006c bge 1f3e838 <_malloc_r+0x290> + 1f3e684: e3530c02 cmp r3, #512 ; 0x200 + 1f3e688: 2a0000bd bcs 1f3e984 <_malloc_r+0x3dc> + 1f3e68c: e3a09001 mov r9, #1 + 1f3e690: e5912004 ldr r2, [r1, #4] + 1f3e694: e1a031a3 lsr r3, r3, #3 + 1f3e698: e083e009 add lr, r3, r9 + 1f3e69c: e1a03143 asr r3, r3, #2 + 1f3e6a0: e1823319 orr r3, r2, r9, lsl r3 + 1f3e6a4: e081818e add r8, r1, lr, lsl #3 + 1f3e6a8: e2482008 sub r2, r8, #8 + 1f3e6ac: e1a08003 mov r8, r3 + 1f3e6b0: e791918e ldr r9, [r1, lr, lsl #3] + 1f3e6b4: e584200c str r2, [r4, #12] + 1f3e6b8: e5849008 str r9, [r4, #8] + 1f3e6bc: e5813004 str r3, [r1, #4] + 1f3e6c0: e781418e str r4, [r1, lr, lsl #3] + 1f3e6c4: e589400c str r4, [r9, #12] + 1f3e6c8: e3a0e001 mov lr, #1 + 1f3e6cc: e1a03140 asr r3, r0, #2 + 1f3e6d0: e1a0e31e lsl lr, lr, r3 + 1f3e6d4: e15e0008 cmp lr, r8 + 1f3e6d8: 8a000061 bhi 1f3e864 <_malloc_r+0x2bc> + 1f3e6dc: e11e0008 tst lr, r8 + 1f3e6e0: 1a000008 bne 1f3e708 <_malloc_r+0x160> + 1f3e6e4: e1a0e08e lsl lr, lr, #1 + 1f3e6e8: e3c00003 bic r0, r0, #3 + 1f3e6ec: e11e0008 tst lr, r8 + 1f3e6f0: e2800004 add r0, r0, #4 + 1f3e6f4: 1a000003 bne 1f3e708 <_malloc_r+0x160> + 1f3e6f8: e1a0e08e lsl lr, lr, #1 + 1f3e6fc: e11e0008 tst lr, r8 + 1f3e700: e2800004 add r0, r0, #4 + 1f3e704: 0afffffb beq 1f3e6f8 <_malloc_r+0x150> + 1f3e708: e0879180 add r9, r7, r0, lsl #3 + 1f3e70c: e1a04009 mov r4, r9 + 1f3e710: e1a08000 mov r8, r0 + 1f3e714: e594300c ldr r3, [r4, #12] + 1f3e718: e1540003 cmp r4, r3 + 1f3e71c: 1a000005 bne 1f3e738 <_malloc_r+0x190> + 1f3e720: ea0000c0 b 1f3ea28 <_malloc_r+0x480> + 1f3e724: e3510000 cmp r1, #0 + 1f3e728: aa0000c8 bge 1f3ea50 <_malloc_r+0x4a8> + 1f3e72c: e593300c ldr r3, [r3, #12] + 1f3e730: e1540003 cmp r4, r3 + 1f3e734: 0a0000bb beq 1f3ea28 <_malloc_r+0x480> + 1f3e738: e5932004 ldr r2, [r3, #4] + 1f3e73c: e3c22003 bic r2, r2, #3 + 1f3e740: e0651002 rsb r1, r5, r2 + 1f3e744: e351000f cmp r1, #15 + 1f3e748: dafffff5 ble 1f3e724 <_malloc_r+0x17c> + 1f3e74c: e1a04003 mov r4, r3 + 1f3e750: e593200c ldr r2, [r3, #12] + 1f3e754: e5b4e008 ldr lr, [r4, #8]! + 1f3e758: e3858001 orr r8, r5, #1 + 1f3e75c: e5838004 str r8, [r3, #4] + 1f3e760: e0835005 add r5, r3, r5 + 1f3e764: e3813001 orr r3, r1, #1 + 1f3e768: e58e200c str r2, [lr, #12] + 1f3e76c: e1a00006 mov r0, r6 + 1f3e770: e582e008 str lr, [r2, #8] + 1f3e774: e5875014 str r5, [r7, #20] + 1f3e778: e5875010 str r5, [r7, #16] + 1f3e77c: e585c00c str ip, [r5, #12] + 1f3e780: e9851008 stmib r5, {r3, ip} + 1f3e784: e7851001 str r1, [r5, r1] + 1f3e788: eb000261 bl 1f3f114 <__malloc_unlock> + 1f3e78c: ea000018 b 1f3e7f4 <_malloc_r+0x24c> + 1f3e790: e3510010 cmp r1, #16 + 1f3e794: 8a00001a bhi 1f3e804 <_malloc_r+0x25c> + 1f3e798: eb00025c bl 1f3f110 <__malloc_lock> + 1f3e79c: e3a05010 mov r5, #16 + 1f3e7a0: e3a03006 mov r3, #6 + 1f3e7a4: e3a00002 mov r0, #2 + 1f3e7a8: e59f7584 ldr r7, [pc, #1412] ; 1f3ed34 <_malloc_r+0x78c> + 1f3e7ac: e0873103 add r3, r7, r3, lsl #2 + 1f3e7b0: e5934004 ldr r4, [r3, #4] + 1f3e7b4: e2432008 sub r2, r3, #8 + 1f3e7b8: e1540002 cmp r4, r2 + 1f3e7bc: 0a00009e beq 1f3ea3c <_malloc_r+0x494> + 1f3e7c0: e5943004 ldr r3, [r4, #4] + 1f3e7c4: e3c33003 bic r3, r3, #3 + 1f3e7c8: e0843003 add r3, r4, r3 + 1f3e7cc: e5932004 ldr r2, [r3, #4] + 1f3e7d0: e594100c ldr r1, [r4, #12] + 1f3e7d4: e594c008 ldr ip, [r4, #8] + 1f3e7d8: e3822001 orr r2, r2, #1 + 1f3e7dc: e58c100c str r1, [ip, #12] + 1f3e7e0: e1a00006 mov r0, r6 + 1f3e7e4: e581c008 str ip, [r1, #8] + 1f3e7e8: e5832004 str r2, [r3, #4] + 1f3e7ec: eb000248 bl 1f3f114 <__malloc_unlock> + 1f3e7f0: e2844008 add r4, r4, #8 + 1f3e7f4: e1a00004 mov r0, r4 + 1f3e7f8: e28dd00c add sp, sp, #12 + 1f3e7fc: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f3e800: e12fff1e bx lr + 1f3e804: e3a04000 mov r4, #0 + 1f3e808: e3a0300c mov r3, #12 + 1f3e80c: e1a00004 mov r0, r4 + 1f3e810: e5863000 str r3, [r6] + 1f3e814: e28dd00c add sp, sp, #12 + 1f3e818: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f3e81c: e12fff1e bx lr + 1f3e820: e3a01080 mov r1, #128 ; 0x80 + 1f3e824: e3a0c040 mov ip, #64 ; 0x40 + 1f3e828: e3a0003f mov r0, #63 ; 0x3f + 1f3e82c: eaffff74 b 1f3e604 <_malloc_r+0x5c> + 1f3e830: e1a0000c mov r0, ip + 1f3e834: eaffff83 b 1f3e648 <_malloc_r+0xa0> + 1f3e838: e0843003 add r3, r4, r3 + 1f3e83c: e5932004 ldr r2, [r3, #4] + 1f3e840: e3822001 orr r2, r2, #1 + 1f3e844: e1a00006 mov r0, r6 + 1f3e848: e5832004 str r2, [r3, #4] + 1f3e84c: e2844008 add r4, r4, #8 + 1f3e850: eb00022f bl 1f3f114 <__malloc_unlock> + 1f3e854: e1a00004 mov r0, r4 + 1f3e858: e28dd00c add sp, sp, #12 + 1f3e85c: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f3e860: e12fff1e bx lr + 1f3e864: e5974008 ldr r4, [r7, #8] + 1f3e868: e5948004 ldr r8, [r4, #4] + 1f3e86c: e3c88003 bic r8, r8, #3 + 1f3e870: e0653008 rsb r3, r5, r8 + 1f3e874: e353000f cmp r3, #15 + 1f3e878: c3a02000 movgt r2, #0 + 1f3e87c: d3a02001 movle r2, #1 + 1f3e880: e1580005 cmp r8, r5 + 1f3e884: 33822001 orrcc r2, r2, #1 + 1f3e888: e3520000 cmp r2, #0 + 1f3e88c: 0a000026 beq 1f3e92c <_malloc_r+0x384> + 1f3e890: e59f94a0 ldr r9, [pc, #1184] ; 1f3ed38 <_malloc_r+0x790> + 1f3e894: e59f34a0 ldr r3, [pc, #1184] ; 1f3ed3c <_malloc_r+0x794> + 1f3e898: e5992000 ldr r2, [r9] + 1f3e89c: e5933000 ldr r3, [r3] + 1f3e8a0: e3720001 cmn r2, #1 + 1f3e8a4: e0853003 add r3, r5, r3 + 1f3e8a8: 12833a01 addne r3, r3, #4096 ; 0x1000 + 1f3e8ac: 1283300f addne r3, r3, #15 + 1f3e8b0: 13c33eff bicne r3, r3, #4080 ; 0xff0 + 1f3e8b4: 02833010 addeq r3, r3, #16 + 1f3e8b8: 13c3300f bicne r3, r3, #15 + 1f3e8bc: e1a01003 mov r1, r3 + 1f3e8c0: e1a00006 mov r0, r6 + 1f3e8c4: e58d3004 str r3, [sp, #4] + 1f3e8c8: eb0003fc bl 1f3f8c0 <_sbrk_r> + 1f3e8cc: e3700001 cmn r0, #1 + 1f3e8d0: e1a0a000 mov sl, r0 + 1f3e8d4: e59d3004 ldr r3, [sp, #4] + 1f3e8d8: 0a0000eb beq 1f3ec8c <_malloc_r+0x6e4> + 1f3e8dc: e0841008 add r1, r4, r8 + 1f3e8e0: e1540007 cmp r4, r7 + 1f3e8e4: 11510000 cmpne r1, r0 + 1f3e8e8: e59f0444 ldr r0, [pc, #1092] ; 1f3ed34 <_malloc_r+0x78c> + 1f3e8ec: 9a000085 bls 1f3eb08 <_malloc_r+0x560> + 1f3e8f0: e5904008 ldr r4, [r0, #8] + 1f3e8f4: e5943004 ldr r3, [r4, #4] + 1f3e8f8: e3c33003 bic r3, r3, #3 + 1f3e8fc: e1550003 cmp r5, r3 + 1f3e900: 93a02000 movls r2, #0 + 1f3e904: 83a02001 movhi r2, #1 + 1f3e908: e0653003 rsb r3, r5, r3 + 1f3e90c: e353000f cmp r3, #15 + 1f3e910: d3822001 orrle r2, r2, #1 + 1f3e914: e3520000 cmp r2, #0 + 1f3e918: 0a000003 beq 1f3e92c <_malloc_r+0x384> + 1f3e91c: e1a00006 mov r0, r6 + 1f3e920: eb0001fb bl 1f3f114 <__malloc_unlock> + 1f3e924: e3a04000 mov r4, #0 + 1f3e928: eaffffb1 b 1f3e7f4 <_malloc_r+0x24c> + 1f3e92c: e3852001 orr r2, r5, #1 + 1f3e930: e3833001 orr r3, r3, #1 + 1f3e934: e0845005 add r5, r4, r5 + 1f3e938: e5842004 str r2, [r4, #4] + 1f3e93c: e1a00006 mov r0, r6 + 1f3e940: e5875008 str r5, [r7, #8] + 1f3e944: e2844008 add r4, r4, #8 + 1f3e948: e5853004 str r3, [r5, #4] + 1f3e94c: eb0001f0 bl 1f3f114 <__malloc_unlock> + 1f3e950: e1a00004 mov r0, r4 + 1f3e954: e28dd00c add sp, sp, #12 + 1f3e958: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f3e95c: e12fff1e bx lr + 1f3e960: e3530014 cmp r3, #20 + 1f3e964: 9a000045 bls 1f3ea80 <_malloc_r+0x4d8> + 1f3e968: e3530054 cmp r3, #84 ; 0x54 + 1f3e96c: 8a0000a8 bhi 1f3ec14 <_malloc_r+0x66c> + 1f3e970: e1a00625 lsr r0, r5, #12 + 1f3e974: e280c06f add ip, r0, #111 ; 0x6f + 1f3e978: e1a0108c lsl r1, ip, #1 + 1f3e97c: e280006e add r0, r0, #110 ; 0x6e + 1f3e980: eaffff1f b 1f3e604 <_malloc_r+0x5c> + 1f3e984: e1a014a3 lsr r1, r3, #9 + 1f3e988: e3510004 cmp r1, #4 + 1f3e98c: 9a00003f bls 1f3ea90 <_malloc_r+0x4e8> + 1f3e990: e3510014 cmp r1, #20 + 1f3e994: 8a0000b5 bhi 1f3ec70 <_malloc_r+0x6c8> + 1f3e998: e281205c add r2, r1, #92 ; 0x5c + 1f3e99c: e1a02082 lsl r2, r2, #1 + 1f3e9a0: e281105b add r1, r1, #91 ; 0x5b + 1f3e9a4: e087e102 add lr, r7, r2, lsl #2 + 1f3e9a8: e7972102 ldr r2, [r7, r2, lsl #2] + 1f3e9ac: e24ee008 sub lr, lr, #8 + 1f3e9b0: e15e0002 cmp lr, r2 + 1f3e9b4: e59f9378 ldr r9, [pc, #888] ; 1f3ed34 <_malloc_r+0x78c> + 1f3e9b8: 0a00009c beq 1f3ec30 <_malloc_r+0x688> + 1f3e9bc: e5921004 ldr r1, [r2, #4] + 1f3e9c0: e3c11003 bic r1, r1, #3 + 1f3e9c4: e1530001 cmp r3, r1 + 1f3e9c8: 2a000002 bcs 1f3e9d8 <_malloc_r+0x430> + 1f3e9cc: e5922008 ldr r2, [r2, #8] + 1f3e9d0: e15e0002 cmp lr, r2 + 1f3e9d4: 1afffff8 bne 1f3e9bc <_malloc_r+0x414> + 1f3e9d8: e592e00c ldr lr, [r2, #12] + 1f3e9dc: e5978004 ldr r8, [r7, #4] + 1f3e9e0: e584e00c str lr, [r4, #12] + 1f3e9e4: e5842008 str r2, [r4, #8] + 1f3e9e8: e58e4008 str r4, [lr, #8] + 1f3e9ec: e582400c str r4, [r2, #12] + 1f3e9f0: eaffff34 b 1f3e6c8 <_malloc_r+0x120> + 1f3e9f4: e385e001 orr lr, r5, #1 + 1f3e9f8: e3823001 orr r3, r2, #1 + 1f3e9fc: e0845005 add r5, r4, r5 + 1f3ea00: e584e004 str lr, [r4, #4] + 1f3ea04: e1a00006 mov r0, r6 + 1f3ea08: e5815014 str r5, [r1, #20] + 1f3ea0c: e5815010 str r5, [r1, #16] + 1f3ea10: e585c00c str ip, [r5, #12] + 1f3ea14: e9851008 stmib r5, {r3, ip} + 1f3ea18: e7852002 str r2, [r5, r2] + 1f3ea1c: e2844008 add r4, r4, #8 + 1f3ea20: eb0001bb bl 1f3f114 <__malloc_unlock> + 1f3ea24: eaffff72 b 1f3e7f4 <_malloc_r+0x24c> + 1f3ea28: e2888001 add r8, r8, #1 + 1f3ea2c: e3180003 tst r8, #3 + 1f3ea30: e2844008 add r4, r4, #8 + 1f3ea34: 1affff36 bne 1f3e714 <_malloc_r+0x16c> + 1f3ea38: ea00001d b 1f3eab4 <_malloc_r+0x50c> + 1f3ea3c: e593400c ldr r4, [r3, #12] + 1f3ea40: e1530004 cmp r3, r4 + 1f3ea44: 02800002 addeq r0, r0, #2 + 1f3ea48: 0afffefe beq 1f3e648 <_malloc_r+0xa0> + 1f3ea4c: eaffff5b b 1f3e7c0 <_malloc_r+0x218> + 1f3ea50: e1a04003 mov r4, r3 + 1f3ea54: e0832002 add r2, r3, r2 + 1f3ea58: e5921004 ldr r1, [r2, #4] + 1f3ea5c: e593c00c ldr ip, [r3, #12] + 1f3ea60: e5b4e008 ldr lr, [r4, #8]! + 1f3ea64: e3813001 orr r3, r1, #1 + 1f3ea68: e5823004 str r3, [r2, #4] + 1f3ea6c: e1a00006 mov r0, r6 + 1f3ea70: e58ec00c str ip, [lr, #12] + 1f3ea74: e58ce008 str lr, [ip, #8] + 1f3ea78: eb0001a5 bl 1f3f114 <__malloc_unlock> + 1f3ea7c: eaffff5c b 1f3e7f4 <_malloc_r+0x24c> + 1f3ea80: e283c05c add ip, r3, #92 ; 0x5c + 1f3ea84: e283005b add r0, r3, #91 ; 0x5b + 1f3ea88: e1a0108c lsl r1, ip, #1 + 1f3ea8c: eafffedc b 1f3e604 <_malloc_r+0x5c> + 1f3ea90: e1a01323 lsr r1, r3, #6 + 1f3ea94: e2812039 add r2, r1, #57 ; 0x39 + 1f3ea98: e1a02082 lsl r2, r2, #1 + 1f3ea9c: e2811038 add r1, r1, #56 ; 0x38 + 1f3eaa0: eaffffbf b 1f3e9a4 <_malloc_r+0x3fc> + 1f3eaa4: e4193008 ldr r3, [r9], #-8 + 1f3eaa8: e1590003 cmp r9, r3 + 1f3eaac: e2400001 sub r0, r0, #1 + 1f3eab0: 1a000099 bne 1f3ed1c <_malloc_r+0x774> + 1f3eab4: e3100003 tst r0, #3 + 1f3eab8: 1afffff9 bne 1f3eaa4 <_malloc_r+0x4fc> + 1f3eabc: e5973004 ldr r3, [r7, #4] + 1f3eac0: e1c3300e bic r3, r3, lr + 1f3eac4: e5873004 str r3, [r7, #4] + 1f3eac8: e1b0e08e lsls lr, lr, #1 + 1f3eacc: 13a02001 movne r2, #1 + 1f3ead0: 03a02000 moveq r2, #0 + 1f3ead4: e15e0003 cmp lr, r3 + 1f3ead8: 83a02000 movhi r2, #0 + 1f3eadc: 92022001 andls r2, r2, #1 + 1f3eae0: e3520000 cmp r2, #0 + 1f3eae4: 0affff5e beq 1f3e864 <_malloc_r+0x2bc> + 1f3eae8: e11e0003 tst lr, r3 + 1f3eaec: e1a00008 mov r0, r8 + 1f3eaf0: 1affff04 bne 1f3e708 <_malloc_r+0x160> + 1f3eaf4: e1a0e08e lsl lr, lr, #1 + 1f3eaf8: e11e0003 tst lr, r3 + 1f3eafc: e2800004 add r0, r0, #4 + 1f3eb00: 0afffffb beq 1f3eaf4 <_malloc_r+0x54c> + 1f3eb04: eafffeff b 1f3e708 <_malloc_r+0x160> + 1f3eb08: e59fb230 ldr fp, [pc, #560] ; 1f3ed40 <_malloc_r+0x798> + 1f3eb0c: e59b2000 ldr r2, [fp] + 1f3eb10: e151000a cmp r1, sl + 1f3eb14: e0832002 add r2, r3, r2 + 1f3eb18: e58b2000 str r2, [fp] + 1f3eb1c: 0a00005e beq 1f3ec9c <_malloc_r+0x6f4> + 1f3eb20: e5990000 ldr r0, [r9] + 1f3eb24: e3700001 cmn r0, #1 + 1f3eb28: 1061100a rsbne r1, r1, sl + 1f3eb2c: e59f0204 ldr r0, [pc, #516] ; 1f3ed38 <_malloc_r+0x790> + 1f3eb30: 10812002 addne r2, r1, r2 + 1f3eb34: 0580a000 streq sl, [r0] + 1f3eb38: 158b2000 strne r2, [fp] + 1f3eb3c: e21a2007 ands r2, sl, #7 + 1f3eb40: 03a02a01 moveq r2, #4096 ; 0x1000 + 1f3eb44: 12621008 rsbne r1, r2, #8 + 1f3eb48: 108aa001 addne sl, sl, r1 + 1f3eb4c: 12622a01 rsbne r2, r2, #4096 ; 0x1000 + 1f3eb50: e08a3003 add r3, sl, r3 + 1f3eb54: e1a03a03 lsl r3, r3, #20 + 1f3eb58: 12822008 addne r2, r2, #8 + 1f3eb5c: e0429a23 sub r9, r2, r3, lsr #20 + 1f3eb60: e1a01009 mov r1, r9 + 1f3eb64: e1a00006 mov r0, r6 + 1f3eb68: eb000354 bl 1f3f8c0 <_sbrk_r> + 1f3eb6c: e3700001 cmn r0, #1 + 1f3eb70: 03a09000 moveq r9, #0 + 1f3eb74: 03a03001 moveq r3, #1 + 1f3eb78: 106a3000 rsbne r3, sl, r0 + 1f3eb7c: e59b2000 ldr r2, [fp] + 1f3eb80: 10833009 addne r3, r3, r9 + 1f3eb84: 13833001 orrne r3, r3, #1 + 1f3eb88: e0892002 add r2, r9, r2 + 1f3eb8c: e1540007 cmp r4, r7 + 1f3eb90: e587a008 str sl, [r7, #8] + 1f3eb94: e58b2000 str r2, [fp] + 1f3eb98: e58a3004 str r3, [sl, #4] + 1f3eb9c: e59f919c ldr r9, [pc, #412] ; 1f3ed40 <_malloc_r+0x798> + 1f3eba0: 0a00000f beq 1f3ebe4 <_malloc_r+0x63c> + 1f3eba4: e358000f cmp r8, #15 + 1f3eba8: 93a03001 movls r3, #1 + 1f3ebac: 958a3004 strls r3, [sl, #4] + 1f3ebb0: 9affff59 bls 1f3e91c <_malloc_r+0x374> + 1f3ebb4: e3a00005 mov r0, #5 + 1f3ebb8: e5941004 ldr r1, [r4, #4] + 1f3ebbc: e248300c sub r3, r8, #12 + 1f3ebc0: e3c33007 bic r3, r3, #7 + 1f3ebc4: e2011001 and r1, r1, #1 + 1f3ebc8: e1811003 orr r1, r1, r3 + 1f3ebcc: e353000f cmp r3, #15 + 1f3ebd0: e0843003 add r3, r4, r3 + 1f3ebd4: e5841004 str r1, [r4, #4] + 1f3ebd8: e5830004 str r0, [r3, #4] + 1f3ebdc: e5830008 str r0, [r3, #8] + 1f3ebe0: 8a000038 bhi 1f3ecc8 <_malloc_r+0x720> + 1f3ebe4: e59f3158 ldr r3, [pc, #344] ; 1f3ed44 <_malloc_r+0x79c> + 1f3ebe8: e5931000 ldr r1, [r3] + 1f3ebec: e1520001 cmp r2, r1 + 1f3ebf0: e59f1150 ldr r1, [pc, #336] ; 1f3ed48 <_malloc_r+0x7a0> + 1f3ebf4: 85832000 strhi r2, [r3] + 1f3ebf8: e5974008 ldr r4, [r7, #8] + 1f3ebfc: e5913000 ldr r3, [r1] + 1f3ec00: e1520003 cmp r2, r3 + 1f3ec04: e5943004 ldr r3, [r4, #4] + 1f3ec08: 85812000 strhi r2, [r1] + 1f3ec0c: e3c33003 bic r3, r3, #3 + 1f3ec10: eaffff39 b 1f3e8fc <_malloc_r+0x354> + 1f3ec14: e3530f55 cmp r3, #340 ; 0x154 + 1f3ec18: 8a00000c bhi 1f3ec50 <_malloc_r+0x6a8> + 1f3ec1c: e1a007a5 lsr r0, r5, #15 + 1f3ec20: e280c078 add ip, r0, #120 ; 0x78 + 1f3ec24: e1a0108c lsl r1, ip, #1 + 1f3ec28: e2800077 add r0, r0, #119 ; 0x77 + 1f3ec2c: eafffe74 b 1f3e604 <_malloc_r+0x5c> + 1f3ec30: e3a08001 mov r8, #1 + 1f3ec34: e5993004 ldr r3, [r9, #4] + 1f3ec38: e1a01141 asr r1, r1, #2 + 1f3ec3c: e1833118 orr r3, r3, r8, lsl r1 + 1f3ec40: e5893004 str r3, [r9, #4] + 1f3ec44: e1a08003 mov r8, r3 + 1f3ec48: e1a0200e mov r2, lr + 1f3ec4c: eaffff63 b 1f3e9e0 <_malloc_r+0x438> + 1f3ec50: e59f20f4 ldr r2, [pc, #244] ; 1f3ed4c <_malloc_r+0x7a4> + 1f3ec54: e1530002 cmp r3, r2 + 1f3ec58: 8a000016 bhi 1f3ecb8 <_malloc_r+0x710> + 1f3ec5c: e1a00925 lsr r0, r5, #18 + 1f3ec60: e280c07d add ip, r0, #125 ; 0x7d + 1f3ec64: e1a0108c lsl r1, ip, #1 + 1f3ec68: e280007c add r0, r0, #124 ; 0x7c + 1f3ec6c: eafffe64 b 1f3e604 <_malloc_r+0x5c> + 1f3ec70: e3510054 cmp r1, #84 ; 0x54 + 1f3ec74: 8a000018 bhi 1f3ecdc <_malloc_r+0x734> + 1f3ec78: e1a01623 lsr r1, r3, #12 + 1f3ec7c: e281206f add r2, r1, #111 ; 0x6f + 1f3ec80: e1a02082 lsl r2, r2, #1 + 1f3ec84: e281106e add r1, r1, #110 ; 0x6e + 1f3ec88: eaffff45 b 1f3e9a4 <_malloc_r+0x3fc> + 1f3ec8c: e5974008 ldr r4, [r7, #8] + 1f3ec90: e5943004 ldr r3, [r4, #4] + 1f3ec94: e3c33003 bic r3, r3, #3 + 1f3ec98: eaffff17 b 1f3e8fc <_malloc_r+0x354> + 1f3ec9c: e1b0ca01 lsls ip, r1, #20 + 1f3eca0: 1affff9e bne 1f3eb20 <_malloc_r+0x578> + 1f3eca4: e0883003 add r3, r8, r3 + 1f3eca8: e5901008 ldr r1, [r0, #8] + 1f3ecac: e3833001 orr r3, r3, #1 + 1f3ecb0: e5813004 str r3, [r1, #4] + 1f3ecb4: eaffffca b 1f3ebe4 <_malloc_r+0x63c> + 1f3ecb8: e3a010fe mov r1, #254 ; 0xfe + 1f3ecbc: e3a0c07f mov ip, #127 ; 0x7f + 1f3ecc0: e3a0007e mov r0, #126 ; 0x7e + 1f3ecc4: eafffe4e b 1f3e604 <_malloc_r+0x5c> + 1f3ecc8: e2841008 add r1, r4, #8 + 1f3eccc: e1a00006 mov r0, r6 + 1f3ecd0: eb00209f bl 1f46f54 <_free_r> + 1f3ecd4: e5992000 ldr r2, [r9] + 1f3ecd8: eaffffc1 b 1f3ebe4 <_malloc_r+0x63c> + 1f3ecdc: e3510f55 cmp r1, #340 ; 0x154 + 1f3ece0: 8a000004 bhi 1f3ecf8 <_malloc_r+0x750> + 1f3ece4: e1a017a3 lsr r1, r3, #15 + 1f3ece8: e2812078 add r2, r1, #120 ; 0x78 + 1f3ecec: e1a02082 lsl r2, r2, #1 + 1f3ecf0: e2811077 add r1, r1, #119 ; 0x77 + 1f3ecf4: eaffff2a b 1f3e9a4 <_malloc_r+0x3fc> + 1f3ecf8: e59f204c ldr r2, [pc, #76] ; 1f3ed4c <_malloc_r+0x7a4> + 1f3ecfc: e1510002 cmp r1, r2 + 1f3ed00: 91a01923 lsrls r1, r3, #18 + 1f3ed04: 9281207d addls r2, r1, #125 ; 0x7d + 1f3ed08: 91a02082 lslls r2, r2, #1 + 1f3ed0c: 9281107c addls r1, r1, #124 ; 0x7c + 1f3ed10: 83a020fe movhi r2, #254 ; 0xfe + 1f3ed14: 83a0107e movhi r1, #126 ; 0x7e + 1f3ed18: eaffff21 b 1f3e9a4 <_malloc_r+0x3fc> + 1f3ed1c: e5973004 ldr r3, [r7, #4] + 1f3ed20: eaffff68 b 1f3eac8 <_malloc_r+0x520> + 1f3ed24: e1a001a5 lsr r0, r5, #3 + 1f3ed28: e2803001 add r3, r0, #1 + 1f3ed2c: e1a03083 lsl r3, r3, #1 + 1f3ed30: eafffe9c b 1f3e7a8 <_malloc_r+0x200> + 1f3ed34: 01f653cc .word 0x01f653cc + 1f3ed38: 01f657d8 .word 0x01f657d8 + 1f3ed3c: 020dc5c4 .word 0x020dc5c4 + 1f3ed40: 020dc5c8 .word 0x020dc5c8 + 1f3ed44: 020dc5c0 .word 0x020dc5c0 + 1f3ed48: 020dc5bc .word 0x020dc5bc + 1f3ed4c: 00000554 .word 0x00000554 + +01f3ed50 : + 1f3ed50: e3520003 cmp r2, #3 + 1f3ed54: e92d4010 push {r4, lr} + 1f3ed58: 9a000011 bls 1f3eda4 + 1f3ed5c: e1803001 orr r3, r0, r1 + 1f3ed60: e3130003 tst r3, #3 + 1f3ed64: 1a000010 bne 1f3edac + 1f3ed68: e1a0c001 mov ip, r1 + 1f3ed6c: e1a03000 mov r3, r0 + 1f3ed70: e5934000 ldr r4, [r3] + 1f3ed74: e59ce000 ldr lr, [ip] + 1f3ed78: e154000e cmp r4, lr + 1f3ed7c: e1a00003 mov r0, r3 + 1f3ed80: e1a0100c mov r1, ip + 1f3ed84: e2833004 add r3, r3, #4 + 1f3ed88: e28cc004 add ip, ip, #4 + 1f3ed8c: 1a000006 bne 1f3edac + 1f3ed90: e2422004 sub r2, r2, #4 + 1f3ed94: e3520003 cmp r2, #3 + 1f3ed98: e1a00003 mov r0, r3 + 1f3ed9c: e1a0100c mov r1, ip + 1f3eda0: 8afffff2 bhi 1f3ed70 + 1f3eda4: e3520000 cmp r2, #0 + 1f3eda8: 0a000012 beq 1f3edf8 + 1f3edac: e5d0c000 ldrb ip, [r0] + 1f3edb0: e5d1e000 ldrb lr, [r1] + 1f3edb4: e15c000e cmp ip, lr + 1f3edb8: 00802002 addeq r2, r0, r2 + 1f3edbc: 02803001 addeq r3, r0, #1 + 1f3edc0: 0a000004 beq 1f3edd8 + 1f3edc4: ea000008 b 1f3edec + 1f3edc8: e4d3c001 ldrb ip, [r3], #1 + 1f3edcc: e5f1e001 ldrb lr, [r1, #1]! + 1f3edd0: e15c000e cmp ip, lr + 1f3edd4: 1a000004 bne 1f3edec + 1f3edd8: e1530002 cmp r3, r2 + 1f3eddc: 1afffff9 bne 1f3edc8 + 1f3ede0: e3a00000 mov r0, #0 + 1f3ede4: e8bd4010 pop {r4, lr} + 1f3ede8: e12fff1e bx lr + 1f3edec: e06e000c rsb r0, lr, ip + 1f3edf0: e8bd4010 pop {r4, lr} + 1f3edf4: e12fff1e bx lr + 1f3edf8: e1a00002 mov r0, r2 + 1f3edfc: eafffff8 b 1f3ede4 + +01f3ee00 : + 1f3ee00: e352000f cmp r2, #15 + 1f3ee04: e92d40f0 push {r4, r5, r6, r7, lr} + 1f3ee08: 9a000029 bls 1f3eeb4 + 1f3ee0c: e1813000 orr r3, r1, r0 + 1f3ee10: e3130003 tst r3, #3 + 1f3ee14: 1a000031 bne 1f3eee0 + 1f3ee18: e1a0e002 mov lr, r2 + 1f3ee1c: e280c010 add ip, r0, #16 + 1f3ee20: e2813010 add r3, r1, #16 + 1f3ee24: e5137010 ldr r7, [r3, #-16] + 1f3ee28: e513600c ldr r6, [r3, #-12] + 1f3ee2c: e5135008 ldr r5, [r3, #-8] + 1f3ee30: e5134004 ldr r4, [r3, #-4] + 1f3ee34: e24ee010 sub lr, lr, #16 + 1f3ee38: e35e000f cmp lr, #15 + 1f3ee3c: e50c7010 str r7, [ip, #-16] + 1f3ee40: e50c600c str r6, [ip, #-12] + 1f3ee44: e50c5008 str r5, [ip, #-8] + 1f3ee48: e50c4004 str r4, [ip, #-4] + 1f3ee4c: e2833010 add r3, r3, #16 + 1f3ee50: e28cc010 add ip, ip, #16 + 1f3ee54: 8afffff2 bhi 1f3ee24 + 1f3ee58: e2423010 sub r3, r2, #16 + 1f3ee5c: e3c3300f bic r3, r3, #15 + 1f3ee60: e202600f and r6, r2, #15 + 1f3ee64: e2833010 add r3, r3, #16 + 1f3ee68: e3560003 cmp r6, #3 + 1f3ee6c: e0811003 add r1, r1, r3 + 1f3ee70: e0803003 add r3, r0, r3 + 1f3ee74: 9a00001b bls 1f3eee8 + 1f3ee78: e1a04001 mov r4, r1 + 1f3ee7c: e1a0c006 mov ip, r6 + 1f3ee80: e243e004 sub lr, r3, #4 + 1f3ee84: e24cc004 sub ip, ip, #4 + 1f3ee88: e4945004 ldr r5, [r4], #4 + 1f3ee8c: e35c0003 cmp ip, #3 + 1f3ee90: e5ae5004 str r5, [lr, #4]! + 1f3ee94: 8afffffa bhi 1f3ee84 + 1f3ee98: e246c004 sub ip, r6, #4 + 1f3ee9c: e3ccc003 bic ip, ip, #3 + 1f3eea0: e28cc004 add ip, ip, #4 + 1f3eea4: e083300c add r3, r3, ip + 1f3eea8: e081100c add r1, r1, ip + 1f3eeac: e2022003 and r2, r2, #3 + 1f3eeb0: ea000000 b 1f3eeb8 + 1f3eeb4: e1a03000 mov r3, r0 + 1f3eeb8: e3520000 cmp r2, #0 + 1f3eebc: 0a000005 beq 1f3eed8 + 1f3eec0: e2433001 sub r3, r3, #1 + 1f3eec4: e0812002 add r2, r1, r2 + 1f3eec8: e4d1c001 ldrb ip, [r1], #1 + 1f3eecc: e1510002 cmp r1, r2 + 1f3eed0: e5e3c001 strb ip, [r3, #1]! + 1f3eed4: 1afffffb bne 1f3eec8 + 1f3eed8: e8bd40f0 pop {r4, r5, r6, r7, lr} + 1f3eedc: e12fff1e bx lr + 1f3eee0: e1a03000 mov r3, r0 + 1f3eee4: eafffff5 b 1f3eec0 + 1f3eee8: e1a02006 mov r2, r6 + 1f3eeec: eafffff1 b 1f3eeb8 + +01f3eef0 : + 1f3eef0: e1500001 cmp r0, r1 + 1f3eef4: e92d4070 push {r4, r5, r6, lr} + 1f3eef8: 9a00000c bls 1f3ef30 + 1f3eefc: e0813002 add r3, r1, r2 + 1f3ef00: e1500003 cmp r0, r3 + 1f3ef04: 2a000009 bcs 1f3ef30 + 1f3ef08: e3520000 cmp r2, #0 + 1f3ef0c: e0801002 add r1, r0, r2 + 1f3ef10: 0a000004 beq 1f3ef28 + 1f3ef14: e0622003 rsb r2, r2, r3 + 1f3ef18: e573c001 ldrb ip, [r3, #-1]! + 1f3ef1c: e1530002 cmp r3, r2 + 1f3ef20: e561c001 strb ip, [r1, #-1]! + 1f3ef24: 1afffffb bne 1f3ef18 + 1f3ef28: e8bd4070 pop {r4, r5, r6, lr} + 1f3ef2c: e12fff1e bx lr + 1f3ef30: e352000f cmp r2, #15 + 1f3ef34: 8a00000a bhi 1f3ef64 + 1f3ef38: e1a03000 mov r3, r0 + 1f3ef3c: e3520000 cmp r2, #0 + 1f3ef40: 0afffff8 beq 1f3ef28 + 1f3ef44: e2433001 sub r3, r3, #1 + 1f3ef48: e0812002 add r2, r1, r2 + 1f3ef4c: e4d1c001 ldrb ip, [r1], #1 + 1f3ef50: e1520001 cmp r2, r1 + 1f3ef54: e5e3c001 strb ip, [r3, #1]! + 1f3ef58: 1afffffb bne 1f3ef4c + 1f3ef5c: e8bd4070 pop {r4, r5, r6, lr} + 1f3ef60: e12fff1e bx lr + 1f3ef64: e1813000 orr r3, r1, r0 + 1f3ef68: e3130003 tst r3, #3 + 1f3ef6c: 1a000026 bne 1f3f00c + 1f3ef70: e1a0e002 mov lr, r2 + 1f3ef74: e280c010 add ip, r0, #16 + 1f3ef78: e2813010 add r3, r1, #16 + 1f3ef7c: e5134010 ldr r4, [r3, #-16] + 1f3ef80: e50c4010 str r4, [ip, #-16] + 1f3ef84: e513400c ldr r4, [r3, #-12] + 1f3ef88: e50c400c str r4, [ip, #-12] + 1f3ef8c: e5134008 ldr r4, [r3, #-8] + 1f3ef90: e50c4008 str r4, [ip, #-8] + 1f3ef94: e24ee010 sub lr, lr, #16 + 1f3ef98: e5134004 ldr r4, [r3, #-4] + 1f3ef9c: e35e000f cmp lr, #15 + 1f3efa0: e50c4004 str r4, [ip, #-4] + 1f3efa4: e2833010 add r3, r3, #16 + 1f3efa8: e28cc010 add ip, ip, #16 + 1f3efac: 8afffff2 bhi 1f3ef7c + 1f3efb0: e2423010 sub r3, r2, #16 + 1f3efb4: e3c3300f bic r3, r3, #15 + 1f3efb8: e202600f and r6, r2, #15 + 1f3efbc: e2833010 add r3, r3, #16 + 1f3efc0: e3560003 cmp r6, #3 + 1f3efc4: e0811003 add r1, r1, r3 + 1f3efc8: e0803003 add r3, r0, r3 + 1f3efcc: 9a000010 bls 1f3f014 + 1f3efd0: e1a04001 mov r4, r1 + 1f3efd4: e1a0c006 mov ip, r6 + 1f3efd8: e243e004 sub lr, r3, #4 + 1f3efdc: e24cc004 sub ip, ip, #4 + 1f3efe0: e4945004 ldr r5, [r4], #4 + 1f3efe4: e35c0003 cmp ip, #3 + 1f3efe8: e5ae5004 str r5, [lr, #4]! + 1f3efec: 8afffffa bhi 1f3efdc + 1f3eff0: e246c004 sub ip, r6, #4 + 1f3eff4: e3ccc003 bic ip, ip, #3 + 1f3eff8: e28cc004 add ip, ip, #4 + 1f3effc: e083300c add r3, r3, ip + 1f3f000: e081100c add r1, r1, ip + 1f3f004: e2022003 and r2, r2, #3 + 1f3f008: eaffffcb b 1f3ef3c + 1f3f00c: e1a03000 mov r3, r0 + 1f3f010: eaffffcb b 1f3ef44 + 1f3f014: e1a02006 mov r2, r6 + 1f3f018: eaffffc7 b 1f3ef3c + +01f3f01c : + 1f3f01c: e3100003 tst r0, #3 + 1f3f020: e92d4010 push {r4, lr} + 1f3f024: 0a000037 beq 1f3f108 + 1f3f028: e3520000 cmp r2, #0 + 1f3f02c: e2422001 sub r2, r2, #1 + 1f3f030: 0a000032 beq 1f3f100 + 1f3f034: e201c0ff and ip, r1, #255 ; 0xff + 1f3f038: e1a03000 mov r3, r0 + 1f3f03c: ea000002 b 1f3f04c + 1f3f040: e3520000 cmp r2, #0 + 1f3f044: e2422001 sub r2, r2, #1 + 1f3f048: 0a00002c beq 1f3f100 + 1f3f04c: e4c3c001 strb ip, [r3], #1 + 1f3f050: e3130003 tst r3, #3 + 1f3f054: 1afffff9 bne 1f3f040 + 1f3f058: e3520003 cmp r2, #3 + 1f3f05c: 9a000020 bls 1f3f0e4 + 1f3f060: e201e0ff and lr, r1, #255 ; 0xff + 1f3f064: e18ee40e orr lr, lr, lr, lsl #8 + 1f3f068: e352000f cmp r2, #15 + 1f3f06c: e18ee80e orr lr, lr, lr, lsl #16 + 1f3f070: 9a000010 bls 1f3f0b8 + 1f3f074: e1a04002 mov r4, r2 + 1f3f078: e283c010 add ip, r3, #16 + 1f3f07c: e2444010 sub r4, r4, #16 + 1f3f080: e354000f cmp r4, #15 + 1f3f084: e50ce010 str lr, [ip, #-16] + 1f3f088: e50ce00c str lr, [ip, #-12] + 1f3f08c: e50ce008 str lr, [ip, #-8] + 1f3f090: e50ce004 str lr, [ip, #-4] + 1f3f094: e28cc010 add ip, ip, #16 + 1f3f098: 8afffff7 bhi 1f3f07c + 1f3f09c: e242c010 sub ip, r2, #16 + 1f3f0a0: e3ccc00f bic ip, ip, #15 + 1f3f0a4: e202200f and r2, r2, #15 + 1f3f0a8: e28cc010 add ip, ip, #16 + 1f3f0ac: e3520003 cmp r2, #3 + 1f3f0b0: e083300c add r3, r3, ip + 1f3f0b4: 9a00000a bls 1f3f0e4 + 1f3f0b8: e1a04003 mov r4, r3 + 1f3f0bc: e1a0c002 mov ip, r2 + 1f3f0c0: e24cc004 sub ip, ip, #4 + 1f3f0c4: e35c0003 cmp ip, #3 + 1f3f0c8: e484e004 str lr, [r4], #4 + 1f3f0cc: 8afffffb bhi 1f3f0c0 + 1f3f0d0: e242c004 sub ip, r2, #4 + 1f3f0d4: e3ccc003 bic ip, ip, #3 + 1f3f0d8: e28cc004 add ip, ip, #4 + 1f3f0dc: e083300c add r3, r3, ip + 1f3f0e0: e2022003 and r2, r2, #3 + 1f3f0e4: e3520000 cmp r2, #0 + 1f3f0e8: 120110ff andne r1, r1, #255 ; 0xff + 1f3f0ec: 10832002 addne r2, r3, r2 + 1f3f0f0: 0a000002 beq 1f3f100 + 1f3f0f4: e4c31001 strb r1, [r3], #1 + 1f3f0f8: e1530002 cmp r3, r2 + 1f3f0fc: 1afffffc bne 1f3f0f4 + 1f3f100: e8bd4010 pop {r4, lr} + 1f3f104: e12fff1e bx lr + 1f3f108: e1a03000 mov r3, r0 + 1f3f10c: eaffffd1 b 1f3f058 + +01f3f110 <__malloc_lock>: + 1f3f110: e12fff1e bx lr + +01f3f114 <__malloc_unlock>: + 1f3f114: e12fff1e bx lr + +01f3f118 <_printf_r>: + 1f3f118: e92d000e push {r1, r2, r3} + 1f3f11c: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f3f120: e24dd008 sub sp, sp, #8 + 1f3f124: e28dc010 add ip, sp, #16 + 1f3f128: e1a0300c mov r3, ip + 1f3f12c: e59d200c ldr r2, [sp, #12] + 1f3f130: e5901008 ldr r1, [r0, #8] + 1f3f134: e58dc004 str ip, [sp, #4] + 1f3f138: eb000f2e bl 1f42df8 <_vfprintf_r> + 1f3f13c: e28dd008 add sp, sp, #8 + 1f3f140: e49de004 pop {lr} ; (ldr lr, [sp], #4) + 1f3f144: e28dd00c add sp, sp, #12 + 1f3f148: e12fff1e bx lr + +01f3f14c : + 1f3f14c: e92d000f push {r0, r1, r2, r3} + 1f3f150: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f3f154: e59f302c ldr r3, [pc, #44] ; 1f3f188 + 1f3f158: e24dd00c sub sp, sp, #12 + 1f3f15c: e5930000 ldr r0, [r3] + 1f3f160: e28dc014 add ip, sp, #20 + 1f3f164: e5901008 ldr r1, [r0, #8] + 1f3f168: e1a0300c mov r3, ip + 1f3f16c: e59d2010 ldr r2, [sp, #16] + 1f3f170: e58dc004 str ip, [sp, #4] + 1f3f174: eb000f1f bl 1f42df8 <_vfprintf_r> + 1f3f178: e28dd00c add sp, sp, #12 + 1f3f17c: e49de004 pop {lr} ; (ldr lr, [sp], #4) + 1f3f180: e28dd010 add sp, sp, #16 + 1f3f184: e12fff1e bx lr + 1f3f188: 01f65c08 .word 0x01f65c08 + +01f3f18c : + 1f3f18c: e3a02000 mov r2, #0 + 1f3f190: e59f300c ldr r3, [pc, #12] ; 1f3f1a4 + 1f3f194: e5933000 ldr r3, [r3] + 1f3f198: e58300a8 str r0, [r3, #168] ; 0xa8 + 1f3f19c: e58320ac str r2, [r3, #172] ; 0xac + 1f3f1a0: e12fff1e bx lr + 1f3f1a4: 01f65c08 .word 0x01f65c08 + +01f3f1a8 : + 1f3f1a8: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f3f1ac: e59f303c ldr r3, [pc, #60] ; 1f3f1f0 + 1f3f1b0: e5931000 ldr r1, [r3] + 1f3f1b4: e59f0038 ldr r0, [pc, #56] ; 1f3f1f4 + 1f3f1b8: e591e0a8 ldr lr, [r1, #168] ; 0xa8 + 1f3f1bc: e000009e mul r0, lr, r0 + 1f3f1c0: e59130ac ldr r3, [r1, #172] ; 0xac + 1f3f1c4: e59fc02c ldr ip, [pc, #44] ; 1f3f1f8 + 1f3f1c8: e020039c mla r0, ip, r3, r0 + 1f3f1cc: e0832c9e umull r2, r3, lr, ip + 1f3f1d0: e0803003 add r3, r0, r3 + 1f3f1d4: e2922001 adds r2, r2, #1 + 1f3f1d8: e2a33000 adc r3, r3, #0 + 1f3f1dc: e58120a8 str r2, [r1, #168] ; 0xa8 + 1f3f1e0: e58130ac str r3, [r1, #172] ; 0xac + 1f3f1e4: e3c30102 bic r0, r3, #-2147483648 ; 0x80000000 + 1f3f1e8: e49de004 pop {lr} ; (ldr lr, [sp], #4) + 1f3f1ec: e12fff1e bx lr + 1f3f1f0: 01f65c08 .word 0x01f65c08 + 1f3f1f4: 5851f42d .word 0x5851f42d + 1f3f1f8: 4c957f2d .word 0x4c957f2d + +01f3f1fc : + 1f3f1fc: e92d4010 push {r4, lr} + 1f3f200: e59f3014 ldr r3, [pc, #20] ; 1f3f21c + 1f3f204: e1a02001 mov r2, r1 + 1f3f208: e1a01000 mov r1, r0 + 1f3f20c: e5930000 ldr r0, [r3] + 1f3f210: eb000002 bl 1f3f220 <_realloc_r> + 1f3f214: e8bd4010 pop {r4, lr} + 1f3f218: e12fff1e bx lr + 1f3f21c: 01f65c08 .word 0x01f65c08 + +01f3f220 <_realloc_r>: + 1f3f220: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f3f224: e2517000 subs r7, r1, #0 + 1f3f228: e24dd00c sub sp, sp, #12 + 1f3f22c: e1a0b002 mov fp, r2 + 1f3f230: 0a00009d beq 1f3f4ac <_realloc_r+0x28c> + 1f3f234: e28b400b add r4, fp, #11 + 1f3f238: e1a09000 mov r9, r0 + 1f3f23c: ebffffb3 bl 1f3f110 <__malloc_lock> + 1f3f240: e3540016 cmp r4, #22 + 1f3f244: 93a01010 movls r1, #16 + 1f3f248: 93a03000 movls r3, #0 + 1f3f24c: 91a04001 movls r4, r1 + 1f3f250: 83c44007 bichi r4, r4, #7 + 1f3f254: 81a03fa4 lsrhi r3, r4, #31 + 1f3f258: 81a01004 movhi r1, r4 + 1f3f25c: e154000b cmp r4, fp + 1f3f260: 33833001 orrcc r3, r3, #1 + 1f3f264: e3530000 cmp r3, #0 + 1f3f268: 13a0300c movne r3, #12 + 1f3f26c: e5170004 ldr r0, [r7, #-4] + 1f3f270: e2476008 sub r6, r7, #8 + 1f3f274: e3c05003 bic r5, r0, #3 + 1f3f278: 15893000 strne r3, [r9] + 1f3f27c: 13a00000 movne r0, #0 + 1f3f280: 1a00002c bne 1f3f338 <_realloc_r+0x118> + 1f3f284: e1550001 cmp r5, r1 + 1f3f288: aa00005d bge 1f3f404 <_realloc_r+0x1e4> + 1f3f28c: e59fa508 ldr sl, [pc, #1288] ; 1f3f79c <_realloc_r+0x57c> + 1f3f290: e59a3008 ldr r3, [sl, #8] + 1f3f294: e086e005 add lr, r6, r5 + 1f3f298: e15e0003 cmp lr, r3 + 1f3f29c: 0a0000be beq 1f3f59c <_realloc_r+0x37c> + 1f3f2a0: e59ec004 ldr ip, [lr, #4] + 1f3f2a4: e3cc3001 bic r3, ip, #1 + 1f3f2a8: e08e3003 add r3, lr, r3 + 1f3f2ac: e5933004 ldr r3, [r3, #4] + 1f3f2b0: e3130001 tst r3, #1 + 1f3f2b4: 0a000072 beq 1f3f484 <_realloc_r+0x264> + 1f3f2b8: e3100001 tst r0, #1 + 1f3f2bc: 0a000020 beq 1f3f344 <_realloc_r+0x124> + 1f3f2c0: e1a0100b mov r1, fp + 1f3f2c4: e1a00009 mov r0, r9 + 1f3f2c8: ebfffcb6 bl 1f3e5a8 <_malloc_r> + 1f3f2cc: e2508000 subs r8, r0, #0 + 1f3f2d0: 0a000015 beq 1f3f32c <_realloc_r+0x10c> + 1f3f2d4: e5173004 ldr r3, [r7, #-4] + 1f3f2d8: e3c33001 bic r3, r3, #1 + 1f3f2dc: e0863003 add r3, r6, r3 + 1f3f2e0: e2482008 sub r2, r8, #8 + 1f3f2e4: e1520003 cmp r2, r3 + 1f3f2e8: 0a00011c beq 1f3f760 <_realloc_r+0x540> + 1f3f2ec: e2452004 sub r2, r5, #4 + 1f3f2f0: e3520024 cmp r2, #36 ; 0x24 + 1f3f2f4: 8a000116 bhi 1f3f754 <_realloc_r+0x534> + 1f3f2f8: e3520013 cmp r2, #19 + 1f3f2fc: 91a03008 movls r3, r8 + 1f3f300: 91a02007 movls r2, r7 + 1f3f304: 8a0000e8 bhi 1f3f6ac <_realloc_r+0x48c> + 1f3f308: e5921000 ldr r1, [r2] + 1f3f30c: e5831000 str r1, [r3] + 1f3f310: e5921004 ldr r1, [r2, #4] + 1f3f314: e5831004 str r1, [r3, #4] + 1f3f318: e5922008 ldr r2, [r2, #8] + 1f3f31c: e5832008 str r2, [r3, #8] + 1f3f320: e1a01007 mov r1, r7 + 1f3f324: e1a00009 mov r0, r9 + 1f3f328: eb001f09 bl 1f46f54 <_free_r> + 1f3f32c: e1a00009 mov r0, r9 + 1f3f330: ebffff77 bl 1f3f114 <__malloc_unlock> + 1f3f334: e1a00008 mov r0, r8 + 1f3f338: e28dd00c add sp, sp, #12 + 1f3f33c: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f3f340: e12fff1e bx lr + 1f3f344: e5178008 ldr r8, [r7, #-8] + 1f3f348: e0688006 rsb r8, r8, r6 + 1f3f34c: e5983004 ldr r3, [r8, #4] + 1f3f350: e3c33003 bic r3, r3, #3 + 1f3f354: e0853003 add r3, r5, r3 + 1f3f358: e1530001 cmp r3, r1 + 1f3f35c: baffffd7 blt 1f3f2c0 <_realloc_r+0xa0> + 1f3f360: e1a0a008 mov sl, r8 + 1f3f364: e598100c ldr r1, [r8, #12] + 1f3f368: e5ba0008 ldr r0, [sl, #8]! + 1f3f36c: e2452004 sub r2, r5, #4 + 1f3f370: e3520024 cmp r2, #36 ; 0x24 + 1f3f374: e580100c str r1, [r0, #12] + 1f3f378: e5810008 str r0, [r1, #8] + 1f3f37c: 8a0000e0 bhi 1f3f704 <_realloc_r+0x4e4> + 1f3f380: e3520013 cmp r2, #19 + 1f3f384: 91a0200a movls r2, sl + 1f3f388: 9a000014 bls 1f3f3e0 <_realloc_r+0x1c0> + 1f3f38c: e5971000 ldr r1, [r7] + 1f3f390: e5881008 str r1, [r8, #8] + 1f3f394: e5971004 ldr r1, [r7, #4] + 1f3f398: e352001b cmp r2, #27 + 1f3f39c: e588100c str r1, [r8, #12] + 1f3f3a0: 92877008 addls r7, r7, #8 + 1f3f3a4: 92882010 addls r2, r8, #16 + 1f3f3a8: 9a00000c bls 1f3f3e0 <_realloc_r+0x1c0> + 1f3f3ac: e5971008 ldr r1, [r7, #8] + 1f3f3b0: e5881010 str r1, [r8, #16] + 1f3f3b4: e597100c ldr r1, [r7, #12] + 1f3f3b8: e5881014 str r1, [r8, #20] + 1f3f3bc: e3520024 cmp r2, #36 ; 0x24 + 1f3f3c0: 05972010 ldreq r2, [r7, #16] + 1f3f3c4: 05882018 streq r2, [r8, #24] + 1f3f3c8: 05972014 ldreq r2, [r7, #20] + 1f3f3cc: 12877010 addne r7, r7, #16 + 1f3f3d0: 0588201c streq r2, [r8, #28] + 1f3f3d4: 12882018 addne r2, r8, #24 + 1f3f3d8: 02877018 addeq r7, r7, #24 + 1f3f3dc: 02882020 addeq r2, r8, #32 + 1f3f3e0: e5971000 ldr r1, [r7] + 1f3f3e4: e5821000 str r1, [r2] + 1f3f3e8: e5971004 ldr r1, [r7, #4] + 1f3f3ec: e5821004 str r1, [r2, #4] + 1f3f3f0: e1a05003 mov r5, r3 + 1f3f3f4: e5971008 ldr r1, [r7, #8] + 1f3f3f8: e1a06008 mov r6, r8 + 1f3f3fc: e1a0700a mov r7, sl + 1f3f400: e5821008 str r1, [r2, #8] + 1f3f404: e0643005 rsb r3, r4, r5 + 1f3f408: e353000f cmp r3, #15 + 1f3f40c: 8a00000d bhi 1f3f448 <_realloc_r+0x228> + 1f3f410: e5963004 ldr r3, [r6, #4] + 1f3f414: e2033001 and r3, r3, #1 + 1f3f418: e1833005 orr r3, r3, r5 + 1f3f41c: e5863004 str r3, [r6, #4] + 1f3f420: e0865005 add r5, r6, r5 + 1f3f424: e5953004 ldr r3, [r5, #4] + 1f3f428: e3833001 orr r3, r3, #1 + 1f3f42c: e5853004 str r3, [r5, #4] + 1f3f430: e1a00009 mov r0, r9 + 1f3f434: ebffff36 bl 1f3f114 <__malloc_unlock> + 1f3f438: e1a00007 mov r0, r7 + 1f3f43c: e28dd00c add sp, sp, #12 + 1f3f440: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f3f444: e12fff1e bx lr + 1f3f448: e5962004 ldr r2, [r6, #4] + 1f3f44c: e2022001 and r2, r2, #1 + 1f3f450: e0861004 add r1, r6, r4 + 1f3f454: e1822004 orr r2, r2, r4 + 1f3f458: e3830001 orr r0, r3, #1 + 1f3f45c: e5862004 str r2, [r6, #4] + 1f3f460: e5810004 str r0, [r1, #4] + 1f3f464: e0813003 add r3, r1, r3 + 1f3f468: e5932004 ldr r2, [r3, #4] + 1f3f46c: e3822001 orr r2, r2, #1 + 1f3f470: e2811008 add r1, r1, #8 + 1f3f474: e5832004 str r2, [r3, #4] + 1f3f478: e1a00009 mov r0, r9 + 1f3f47c: eb001eb4 bl 1f46f54 <_free_r> + 1f3f480: eaffffea b 1f3f430 <_realloc_r+0x210> + 1f3f484: e3ccc003 bic ip, ip, #3 + 1f3f488: e08cc005 add ip, ip, r5 + 1f3f48c: e15c0001 cmp ip, r1 + 1f3f490: ba00000a blt 1f3f4c0 <_realloc_r+0x2a0> + 1f3f494: e28e2008 add r2, lr, #8 + 1f3f498: e892000c ldm r2, {r2, r3} + 1f3f49c: e1a0500c mov r5, ip + 1f3f4a0: e582300c str r3, [r2, #12] + 1f3f4a4: e5832008 str r2, [r3, #8] + 1f3f4a8: eaffffd5 b 1f3f404 <_realloc_r+0x1e4> + 1f3f4ac: e1a01002 mov r1, r2 + 1f3f4b0: ebfffc3c bl 1f3e5a8 <_malloc_r> + 1f3f4b4: e28dd00c add sp, sp, #12 + 1f3f4b8: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f3f4bc: e12fff1e bx lr + 1f3f4c0: e3100001 tst r0, #1 + 1f3f4c4: 1affff7d bne 1f3f2c0 <_realloc_r+0xa0> + 1f3f4c8: e5178008 ldr r8, [r7, #-8] + 1f3f4cc: e0688006 rsb r8, r8, r6 + 1f3f4d0: e5983004 ldr r3, [r8, #4] + 1f3f4d4: e3c33003 bic r3, r3, #3 + 1f3f4d8: e08cc003 add ip, ip, r3 + 1f3f4dc: e15c0001 cmp ip, r1 + 1f3f4e0: baffff9b blt 1f3f354 <_realloc_r+0x134> + 1f3f4e4: e1a0a008 mov sl, r8 + 1f3f4e8: e28e2008 add r2, lr, #8 + 1f3f4ec: e892000c ldm r2, {r2, r3} + 1f3f4f0: e582300c str r3, [r2, #12] + 1f3f4f4: e5832008 str r2, [r3, #8] + 1f3f4f8: e598300c ldr r3, [r8, #12] + 1f3f4fc: e5ba1008 ldr r1, [sl, #8]! + 1f3f500: e2452004 sub r2, r5, #4 + 1f3f504: e3520024 cmp r2, #36 ; 0x24 + 1f3f508: e581300c str r3, [r1, #12] + 1f3f50c: e5831008 str r1, [r3, #8] + 1f3f510: 8a000096 bhi 1f3f770 <_realloc_r+0x550> + 1f3f514: e3520013 cmp r2, #19 + 1f3f518: 91a0300a movls r3, sl + 1f3f51c: 9a000014 bls 1f3f574 <_realloc_r+0x354> + 1f3f520: e5973000 ldr r3, [r7] + 1f3f524: e5883008 str r3, [r8, #8] + 1f3f528: e5973004 ldr r3, [r7, #4] + 1f3f52c: e352001b cmp r2, #27 + 1f3f530: e588300c str r3, [r8, #12] + 1f3f534: 92877008 addls r7, r7, #8 + 1f3f538: 92883010 addls r3, r8, #16 + 1f3f53c: 9a00000c bls 1f3f574 <_realloc_r+0x354> + 1f3f540: e5973008 ldr r3, [r7, #8] + 1f3f544: e5883010 str r3, [r8, #16] + 1f3f548: e597300c ldr r3, [r7, #12] + 1f3f54c: e5883014 str r3, [r8, #20] + 1f3f550: e3520024 cmp r2, #36 ; 0x24 + 1f3f554: 05973010 ldreq r3, [r7, #16] + 1f3f558: 05883018 streq r3, [r8, #24] + 1f3f55c: 05973014 ldreq r3, [r7, #20] + 1f3f560: 12877010 addne r7, r7, #16 + 1f3f564: 0588301c streq r3, [r8, #28] + 1f3f568: 12883018 addne r3, r8, #24 + 1f3f56c: 02877018 addeq r7, r7, #24 + 1f3f570: 02883020 addeq r3, r8, #32 + 1f3f574: e5972000 ldr r2, [r7] + 1f3f578: e5832000 str r2, [r3] + 1f3f57c: e5972004 ldr r2, [r7, #4] + 1f3f580: e5832004 str r2, [r3, #4] + 1f3f584: e5972008 ldr r2, [r7, #8] + 1f3f588: e1a0500c mov r5, ip + 1f3f58c: e1a0700a mov r7, sl + 1f3f590: e1a06008 mov r6, r8 + 1f3f594: e5832008 str r2, [r3, #8] + 1f3f598: eaffff99 b 1f3f404 <_realloc_r+0x1e4> + 1f3f59c: e59e3004 ldr r3, [lr, #4] + 1f3f5a0: e3c33003 bic r3, r3, #3 + 1f3f5a4: e0832005 add r2, r3, r5 + 1f3f5a8: e284c010 add ip, r4, #16 + 1f3f5ac: e152000c cmp r2, ip + 1f3f5b0: aa00005a bge 1f3f720 <_realloc_r+0x500> + 1f3f5b4: e3100001 tst r0, #1 + 1f3f5b8: 1affff40 bne 1f3f2c0 <_realloc_r+0xa0> + 1f3f5bc: e5178008 ldr r8, [r7, #-8] + 1f3f5c0: e0688006 rsb r8, r8, r6 + 1f3f5c4: e5983004 ldr r3, [r8, #4] + 1f3f5c8: e3c33003 bic r3, r3, #3 + 1f3f5cc: e0832002 add r2, r3, r2 + 1f3f5d0: e15c0002 cmp ip, r2 + 1f3f5d4: e58d2004 str r2, [sp, #4] + 1f3f5d8: caffff5d bgt 1f3f354 <_realloc_r+0x134> + 1f3f5dc: e1a06008 mov r6, r8 + 1f3f5e0: e598300c ldr r3, [r8, #12] + 1f3f5e4: e5b61008 ldr r1, [r6, #8]! + 1f3f5e8: e2452004 sub r2, r5, #4 + 1f3f5ec: e3520024 cmp r2, #36 ; 0x24 + 1f3f5f0: e581300c str r3, [r1, #12] + 1f3f5f4: e5831008 str r1, [r3, #8] + 1f3f5f8: 8a000063 bhi 1f3f78c <_realloc_r+0x56c> + 1f3f5fc: e3520013 cmp r2, #19 + 1f3f600: 91a03006 movls r3, r6 + 1f3f604: 9a000014 bls 1f3f65c <_realloc_r+0x43c> + 1f3f608: e5973000 ldr r3, [r7] + 1f3f60c: e5883008 str r3, [r8, #8] + 1f3f610: e5973004 ldr r3, [r7, #4] + 1f3f614: e352001b cmp r2, #27 + 1f3f618: e588300c str r3, [r8, #12] + 1f3f61c: 92877008 addls r7, r7, #8 + 1f3f620: 92883010 addls r3, r8, #16 + 1f3f624: 9a00000c bls 1f3f65c <_realloc_r+0x43c> + 1f3f628: e5973008 ldr r3, [r7, #8] + 1f3f62c: e5883010 str r3, [r8, #16] + 1f3f630: e597300c ldr r3, [r7, #12] + 1f3f634: e5883014 str r3, [r8, #20] + 1f3f638: e3520024 cmp r2, #36 ; 0x24 + 1f3f63c: 05973010 ldreq r3, [r7, #16] + 1f3f640: 05883018 streq r3, [r8, #24] + 1f3f644: 05973014 ldreq r3, [r7, #20] + 1f3f648: 12877010 addne r7, r7, #16 + 1f3f64c: 0588301c streq r3, [r8, #28] + 1f3f650: 12883018 addne r3, r8, #24 + 1f3f654: 02877018 addeq r7, r7, #24 + 1f3f658: 02883020 addeq r3, r8, #32 + 1f3f65c: e5972000 ldr r2, [r7] + 1f3f660: e5832000 str r2, [r3] + 1f3f664: e5972004 ldr r2, [r7, #4] + 1f3f668: e5832004 str r2, [r3, #4] + 1f3f66c: e5972008 ldr r2, [r7, #8] + 1f3f670: e5832008 str r2, [r3, #8] + 1f3f674: e59d3004 ldr r3, [sp, #4] + 1f3f678: e0643003 rsb r3, r4, r3 + 1f3f67c: e0882004 add r2, r8, r4 + 1f3f680: e3833001 orr r3, r3, #1 + 1f3f684: e58a2008 str r2, [sl, #8] + 1f3f688: e5823004 str r3, [r2, #4] + 1f3f68c: e5983004 ldr r3, [r8, #4] + 1f3f690: e2033001 and r3, r3, #1 + 1f3f694: e1834004 orr r4, r3, r4 + 1f3f698: e1a00009 mov r0, r9 + 1f3f69c: e5884004 str r4, [r8, #4] + 1f3f6a0: ebfffe9b bl 1f3f114 <__malloc_unlock> + 1f3f6a4: e1a00006 mov r0, r6 + 1f3f6a8: eaffff22 b 1f3f338 <_realloc_r+0x118> + 1f3f6ac: e5973000 ldr r3, [r7] + 1f3f6b0: e5883000 str r3, [r8] + 1f3f6b4: e5973004 ldr r3, [r7, #4] + 1f3f6b8: e352001b cmp r2, #27 + 1f3f6bc: e5883004 str r3, [r8, #4] + 1f3f6c0: 92872008 addls r2, r7, #8 + 1f3f6c4: 92883008 addls r3, r8, #8 + 1f3f6c8: 9affff0e bls 1f3f308 <_realloc_r+0xe8> + 1f3f6cc: e5973008 ldr r3, [r7, #8] + 1f3f6d0: e5883008 str r3, [r8, #8] + 1f3f6d4: e597300c ldr r3, [r7, #12] + 1f3f6d8: e588300c str r3, [r8, #12] + 1f3f6dc: e3520024 cmp r2, #36 ; 0x24 + 1f3f6e0: 05973010 ldreq r3, [r7, #16] + 1f3f6e4: 05883010 streq r3, [r8, #16] + 1f3f6e8: 05972014 ldreq r2, [r7, #20] + 1f3f6ec: 12883010 addne r3, r8, #16 + 1f3f6f0: 05882014 streq r2, [r8, #20] + 1f3f6f4: 12872010 addne r2, r7, #16 + 1f3f6f8: 02883018 addeq r3, r8, #24 + 1f3f6fc: 02872018 addeq r2, r7, #24 + 1f3f700: eaffff00 b 1f3f308 <_realloc_r+0xe8> + 1f3f704: e1a01007 mov r1, r7 + 1f3f708: e1a0000a mov r0, sl + 1f3f70c: e1a05003 mov r5, r3 + 1f3f710: e1a06008 mov r6, r8 + 1f3f714: ebfffdf5 bl 1f3eef0 + 1f3f718: e1a0700a mov r7, sl + 1f3f71c: eaffff38 b 1f3f404 <_realloc_r+0x1e4> + 1f3f720: e064b002 rsb fp, r4, r2 + 1f3f724: e0866004 add r6, r6, r4 + 1f3f728: e38b3001 orr r3, fp, #1 + 1f3f72c: e58a6008 str r6, [sl, #8] + 1f3f730: e5863004 str r3, [r6, #4] + 1f3f734: e5173004 ldr r3, [r7, #-4] + 1f3f738: e2033001 and r3, r3, #1 + 1f3f73c: e1834004 orr r4, r3, r4 + 1f3f740: e1a00009 mov r0, r9 + 1f3f744: e5074004 str r4, [r7, #-4] + 1f3f748: ebfffe71 bl 1f3f114 <__malloc_unlock> + 1f3f74c: e1a00007 mov r0, r7 + 1f3f750: eafffef8 b 1f3f338 <_realloc_r+0x118> + 1f3f754: e1a01007 mov r1, r7 + 1f3f758: ebfffde4 bl 1f3eef0 + 1f3f75c: eafffeef b 1f3f320 <_realloc_r+0x100> + 1f3f760: e5183004 ldr r3, [r8, #-4] + 1f3f764: e3c33003 bic r3, r3, #3 + 1f3f768: e0855003 add r5, r5, r3 + 1f3f76c: eaffff24 b 1f3f404 <_realloc_r+0x1e4> + 1f3f770: e1a01007 mov r1, r7 + 1f3f774: e1a0000a mov r0, sl + 1f3f778: e1a0500c mov r5, ip + 1f3f77c: e1a06008 mov r6, r8 + 1f3f780: ebfffdda bl 1f3eef0 + 1f3f784: e1a0700a mov r7, sl + 1f3f788: eaffff1d b 1f3f404 <_realloc_r+0x1e4> + 1f3f78c: e1a01007 mov r1, r7 + 1f3f790: e1a00006 mov r0, r6 + 1f3f794: ebfffdd5 bl 1f3eef0 + 1f3f798: eaffffb5 b 1f3f674 <_realloc_r+0x454> + 1f3f79c: 01f653cc .word 0x01f653cc + +01f3f7a0 : + 1f3f7a0: e92d4070 push {r4, r5, r6, lr} + 1f3f7a4: e1a04001 mov r4, r1 + 1f3f7a8: e5911000 ldr r1, [r1] + 1f3f7ac: e3510000 cmp r1, #0 + 1f3f7b0: e1a05000 mov r5, r0 + 1f3f7b4: 1bfffff9 blne 1f3f7a0 + 1f3f7b8: e1a01004 mov r1, r4 + 1f3f7bc: e1a00005 mov r0, r5 + 1f3f7c0: eb001de3 bl 1f46f54 <_free_r> + 1f3f7c4: e8bd4070 pop {r4, r5, r6, lr} + 1f3f7c8: e12fff1e bx lr + +01f3f7cc <_reclaim_reent>: + 1f3f7cc: e59f30e8 ldr r3, [pc, #232] ; 1f3f8bc <_reclaim_reent+0xf0> + 1f3f7d0: e5933000 ldr r3, [r3] + 1f3f7d4: e1530000 cmp r3, r0 + 1f3f7d8: 012fff1e bxeq lr + 1f3f7dc: e590304c ldr r3, [r0, #76] ; 0x4c + 1f3f7e0: e3530000 cmp r3, #0 + 1f3f7e4: e92d4070 push {r4, r5, r6, lr} + 1f3f7e8: e1a05000 mov r5, r0 + 1f3f7ec: 0a00000f beq 1f3f830 <_reclaim_reent+0x64> + 1f3f7f0: e3a06000 mov r6, #0 + 1f3f7f4: e7931006 ldr r1, [r3, r6] + 1f3f7f8: e3510000 cmp r1, #0 + 1f3f7fc: 0a000005 beq 1f3f818 <_reclaim_reent+0x4c> + 1f3f800: e5914000 ldr r4, [r1] + 1f3f804: e1a00005 mov r0, r5 + 1f3f808: eb001dd1 bl 1f46f54 <_free_r> + 1f3f80c: e2541000 subs r1, r4, #0 + 1f3f810: 1afffffa bne 1f3f800 <_reclaim_reent+0x34> + 1f3f814: e595304c ldr r3, [r5, #76] ; 0x4c + 1f3f818: e2866004 add r6, r6, #4 + 1f3f81c: e3560080 cmp r6, #128 ; 0x80 + 1f3f820: 1afffff3 bne 1f3f7f4 <_reclaim_reent+0x28> + 1f3f824: e1a01003 mov r1, r3 + 1f3f828: e1a00005 mov r0, r5 + 1f3f82c: eb001dc8 bl 1f46f54 <_free_r> + 1f3f830: e5951040 ldr r1, [r5, #64] ; 0x40 + 1f3f834: e3510000 cmp r1, #0 + 1f3f838: 11a00005 movne r0, r5 + 1f3f83c: 1b001dc4 blne 1f46f54 <_free_r> + 1f3f840: e5951148 ldr r1, [r5, #328] ; 0x148 + 1f3f844: e3510000 cmp r1, #0 + 1f3f848: 0a000008 beq 1f3f870 <_reclaim_reent+0xa4> + 1f3f84c: e2856f53 add r6, r5, #332 ; 0x14c + 1f3f850: e1510006 cmp r1, r6 + 1f3f854: 0a000005 beq 1f3f870 <_reclaim_reent+0xa4> + 1f3f858: e5914000 ldr r4, [r1] + 1f3f85c: e1a00005 mov r0, r5 + 1f3f860: eb001dbb bl 1f46f54 <_free_r> + 1f3f864: e1560004 cmp r6, r4 + 1f3f868: e1a01004 mov r1, r4 + 1f3f86c: 1afffff9 bne 1f3f858 <_reclaim_reent+0x8c> + 1f3f870: e5951054 ldr r1, [r5, #84] ; 0x54 + 1f3f874: e3510000 cmp r1, #0 + 1f3f878: 11a00005 movne r0, r5 + 1f3f87c: 1b001db4 blne 1f46f54 <_free_r> + 1f3f880: e5953038 ldr r3, [r5, #56] ; 0x38 + 1f3f884: e3530000 cmp r3, #0 + 1f3f888: 1a000001 bne 1f3f894 <_reclaim_reent+0xc8> + 1f3f88c: e8bd4070 pop {r4, r5, r6, lr} + 1f3f890: e12fff1e bx lr + 1f3f894: e1a00005 mov r0, r5 + 1f3f898: e595c03c ldr ip, [r5, #60] ; 0x3c + 1f3f89c: e1a0e00f mov lr, pc + 1f3f8a0: e12fff1c bx ip + 1f3f8a4: e59512e0 ldr r1, [r5, #736] ; 0x2e0 + 1f3f8a8: e3510000 cmp r1, #0 + 1f3f8ac: 0afffff6 beq 1f3f88c <_reclaim_reent+0xc0> + 1f3f8b0: e1a00005 mov r0, r5 + 1f3f8b4: e8bd4070 pop {r4, r5, r6, lr} + 1f3f8b8: eaffffb8 b 1f3f7a0 + 1f3f8bc: 01f65c08 .word 0x01f65c08 + +01f3f8c0 <_sbrk_r>: + 1f3f8c0: e3a03000 mov r3, #0 + 1f3f8c4: e92d4070 push {r4, r5, r6, lr} + 1f3f8c8: e59f4030 ldr r4, [pc, #48] ; 1f3f900 <_sbrk_r+0x40> + 1f3f8cc: e1a05000 mov r5, r0 + 1f3f8d0: e1a00001 mov r0, r1 + 1f3f8d4: e5843000 str r3, [r4] + 1f3f8d8: ebff0341 bl 1f005e4 <_sbrk> + 1f3f8dc: e3700001 cmn r0, #1 + 1f3f8e0: 0a000001 beq 1f3f8ec <_sbrk_r+0x2c> + 1f3f8e4: e8bd4070 pop {r4, r5, r6, lr} + 1f3f8e8: e12fff1e bx lr + 1f3f8ec: e5943000 ldr r3, [r4] + 1f3f8f0: e3530000 cmp r3, #0 + 1f3f8f4: 15853000 strne r3, [r5] + 1f3f8f8: e8bd4070 pop {r4, r5, r6, lr} + 1f3f8fc: e12fff1e bx lr + 1f3f900: 020e8000 .word 0x020e8000 + +01f3f904 <_snprintf_r>: + 1f3f904: e52d3004 push {r3} ; (str r3, [sp, #-4]!) + 1f3f908: e3520000 cmp r2, #0 + 1f3f90c: e92d4030 push {r4, r5, lr} + 1f3f910: b3a0308b movlt r3, #139 ; 0x8b + 1f3f914: e1a04000 mov r4, r0 + 1f3f918: e24dd070 sub sp, sp, #112 ; 0x70 + 1f3f91c: b3e00000 mvnlt r0, #0 + 1f3f920: b5843000 strlt r3, [r4] + 1f3f924: ba000015 blt 1f3f980 <_snprintf_r+0x7c> + 1f3f928: e3a03f82 mov r3, #520 ; 0x208 + 1f3f92c: e1a0c002 mov ip, r2 + 1f3f930: e58d1008 str r1, [sp, #8] + 1f3f934: e58d1018 str r1, [sp, #24] + 1f3f938: e1cd31b4 strh r3, [sp, #20] + 1f3f93c: e3e05000 mvn r5, #0 + 1f3f940: e28de080 add lr, sp, #128 ; 0x80 + 1f3f944: 0a000011 beq 1f3f990 <_snprintf_r+0x8c> + 1f3f948: e082c005 add ip, r2, r5 + 1f3f94c: e1a0300e mov r3, lr + 1f3f950: e59d207c ldr r2, [sp, #124] ; 0x7c + 1f3f954: e28d1008 add r1, sp, #8 + 1f3f958: e58dc010 str ip, [sp, #16] + 1f3f95c: e58dc01c str ip, [sp, #28] + 1f3f960: e1cd51b6 strh r5, [sp, #22] + 1f3f964: e58de004 str lr, [sp, #4] + 1f3f968: eb00047e bl 1f40b68 <_svfprintf_r> + 1f3f96c: e1500005 cmp r0, r5 + 1f3f970: ba000016 blt 1f3f9d0 <_snprintf_r+0xcc> + 1f3f974: e3a02000 mov r2, #0 + 1f3f978: e59d3008 ldr r3, [sp, #8] + 1f3f97c: e5c32000 strb r2, [r3] + 1f3f980: e28dd070 add sp, sp, #112 ; 0x70 + 1f3f984: e8bd4030 pop {r4, r5, lr} + 1f3f988: e28dd004 add sp, sp, #4 + 1f3f98c: e12fff1e bx lr + 1f3f990: e1a0300e mov r3, lr + 1f3f994: e59d207c ldr r2, [sp, #124] ; 0x7c + 1f3f998: e28d1008 add r1, sp, #8 + 1f3f99c: e58dc010 str ip, [sp, #16] + 1f3f9a0: e58dc01c str ip, [sp, #28] + 1f3f9a4: e1cd51b6 strh r5, [sp, #22] + 1f3f9a8: e58de004 str lr, [sp, #4] + 1f3f9ac: eb00046d bl 1f40b68 <_svfprintf_r> + 1f3f9b0: e1500005 cmp r0, r5 + 1f3f9b4: aafffff1 bge 1f3f980 <_snprintf_r+0x7c> + 1f3f9b8: e3a0308b mov r3, #139 ; 0x8b + 1f3f9bc: e5843000 str r3, [r4] + 1f3f9c0: e28dd070 add sp, sp, #112 ; 0x70 + 1f3f9c4: e8bd4030 pop {r4, r5, lr} + 1f3f9c8: e28dd004 add sp, sp, #4 + 1f3f9cc: e12fff1e bx lr + 1f3f9d0: e3a0308b mov r3, #139 ; 0x8b + 1f3f9d4: e5843000 str r3, [r4] + 1f3f9d8: eaffffe5 b 1f3f974 <_snprintf_r+0x70> + +01f3f9dc : + 1f3f9dc: e92d000c push {r2, r3} + 1f3f9e0: e59f30d8 ldr r3, [pc, #216] ; 1f3fac0 + 1f3f9e4: e3510000 cmp r1, #0 + 1f3f9e8: e92d4030 push {r4, r5, lr} + 1f3f9ec: e5934000 ldr r4, [r3] + 1f3f9f0: b3a0308b movlt r3, #139 ; 0x8b + 1f3f9f4: e24dd074 sub sp, sp, #116 ; 0x74 + 1f3f9f8: b3e00000 mvnlt r0, #0 + 1f3f9fc: b5843000 strlt r3, [r4] + 1f3fa00: ba000016 blt 1f3fa60 + 1f3fa04: e3a03f82 mov r3, #520 ; 0x208 + 1f3fa08: e1a0c001 mov ip, r1 + 1f3fa0c: e58d0008 str r0, [sp, #8] + 1f3fa10: e58d0018 str r0, [sp, #24] + 1f3fa14: e1cd31b4 strh r3, [sp, #20] + 1f3fa18: e3e05000 mvn r5, #0 + 1f3fa1c: e28de084 add lr, sp, #132 ; 0x84 + 1f3fa20: 0a000012 beq 1f3fa70 + 1f3fa24: e081c005 add ip, r1, r5 + 1f3fa28: e1a0300e mov r3, lr + 1f3fa2c: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f3fa30: e28d1008 add r1, sp, #8 + 1f3fa34: e1a00004 mov r0, r4 + 1f3fa38: e58dc010 str ip, [sp, #16] + 1f3fa3c: e58dc01c str ip, [sp, #28] + 1f3fa40: e1cd51b6 strh r5, [sp, #22] + 1f3fa44: e58de004 str lr, [sp, #4] + 1f3fa48: eb000446 bl 1f40b68 <_svfprintf_r> + 1f3fa4c: e1500005 cmp r0, r5 + 1f3fa50: ba000017 blt 1f3fab4 + 1f3fa54: e3a02000 mov r2, #0 + 1f3fa58: e59d3008 ldr r3, [sp, #8] + 1f3fa5c: e5c32000 strb r2, [r3] + 1f3fa60: e28dd074 add sp, sp, #116 ; 0x74 + 1f3fa64: e8bd4030 pop {r4, r5, lr} + 1f3fa68: e28dd008 add sp, sp, #8 + 1f3fa6c: e12fff1e bx lr + 1f3fa70: e1a0300e mov r3, lr + 1f3fa74: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f3fa78: e28d1008 add r1, sp, #8 + 1f3fa7c: e1a00004 mov r0, r4 + 1f3fa80: e58dc010 str ip, [sp, #16] + 1f3fa84: e58dc01c str ip, [sp, #28] + 1f3fa88: e1cd51b6 strh r5, [sp, #22] + 1f3fa8c: e58de004 str lr, [sp, #4] + 1f3fa90: eb000434 bl 1f40b68 <_svfprintf_r> + 1f3fa94: e1500005 cmp r0, r5 + 1f3fa98: aafffff0 bge 1f3fa60 + 1f3fa9c: e3a0308b mov r3, #139 ; 0x8b + 1f3faa0: e5843000 str r3, [r4] + 1f3faa4: e28dd074 add sp, sp, #116 ; 0x74 + 1f3faa8: e8bd4030 pop {r4, r5, lr} + 1f3faac: e28dd008 add sp, sp, #8 + 1f3fab0: e12fff1e bx lr + 1f3fab4: e3a0308b mov r3, #139 ; 0x8b + 1f3fab8: e5843000 str r3, [r4] + 1f3fabc: eaffffe4 b 1f3fa54 + 1f3fac0: 01f65c08 .word 0x01f65c08 + +01f3fac4 <_sprintf_r>: + 1f3fac4: e92d000c push {r2, r3} + 1f3fac8: e92d4030 push {r4, r5, lr} + 1f3facc: e3e0e102 mvn lr, #-2147483648 ; 0x80000000 + 1f3fad0: e3a05f82 mov r5, #520 ; 0x208 + 1f3fad4: e3e04000 mvn r4, #0 + 1f3fad8: e24dd074 sub sp, sp, #116 ; 0x74 + 1f3fadc: e28dc084 add ip, sp, #132 ; 0x84 + 1f3fae0: e1a0300c mov r3, ip + 1f3fae4: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f3fae8: e58d1008 str r1, [sp, #8] + 1f3faec: e58d1018 str r1, [sp, #24] + 1f3faf0: e28d1008 add r1, sp, #8 + 1f3faf4: e1cd51b4 strh r5, [sp, #20] + 1f3faf8: e58de010 str lr, [sp, #16] + 1f3fafc: e58de01c str lr, [sp, #28] + 1f3fb00: e1cd41b6 strh r4, [sp, #22] + 1f3fb04: e58dc004 str ip, [sp, #4] + 1f3fb08: eb000416 bl 1f40b68 <_svfprintf_r> + 1f3fb0c: e3a02000 mov r2, #0 + 1f3fb10: e59d3008 ldr r3, [sp, #8] + 1f3fb14: e5c32000 strb r2, [r3] + 1f3fb18: e28dd074 add sp, sp, #116 ; 0x74 + 1f3fb1c: e8bd4030 pop {r4, r5, lr} + 1f3fb20: e28dd008 add sp, sp, #8 + 1f3fb24: e12fff1e bx lr + +01f3fb28 : + 1f3fb28: e92d000e push {r1, r2, r3} + 1f3fb2c: e1a01000 mov r1, r0 + 1f3fb30: e92d4030 push {r4, r5, lr} + 1f3fb34: e3e0e102 mvn lr, #-2147483648 ; 0x80000000 + 1f3fb38: e3a05f82 mov r5, #520 ; 0x208 + 1f3fb3c: e3e04000 mvn r4, #0 + 1f3fb40: e24dd070 sub sp, sp, #112 ; 0x70 + 1f3fb44: e59f304c ldr r3, [pc, #76] ; 1f3fb98 + 1f3fb48: e28dc080 add ip, sp, #128 ; 0x80 + 1f3fb4c: e59d207c ldr r2, [sp, #124] ; 0x7c + 1f3fb50: e58d1008 str r1, [sp, #8] + 1f3fb54: e58d1018 str r1, [sp, #24] + 1f3fb58: e5930000 ldr r0, [r3] + 1f3fb5c: e28d1008 add r1, sp, #8 + 1f3fb60: e1a0300c mov r3, ip + 1f3fb64: e1cd51b4 strh r5, [sp, #20] + 1f3fb68: e58de010 str lr, [sp, #16] + 1f3fb6c: e58de01c str lr, [sp, #28] + 1f3fb70: e1cd41b6 strh r4, [sp, #22] + 1f3fb74: e58dc004 str ip, [sp, #4] + 1f3fb78: eb0003fa bl 1f40b68 <_svfprintf_r> + 1f3fb7c: e3a02000 mov r2, #0 + 1f3fb80: e59d3008 ldr r3, [sp, #8] + 1f3fb84: e5c32000 strb r2, [r3] + 1f3fb88: e28dd070 add sp, sp, #112 ; 0x70 + 1f3fb8c: e8bd4030 pop {r4, r5, lr} + 1f3fb90: e28dd00c add sp, sp, #12 + 1f3fb94: e12fff1e bx lr + 1f3fb98: 01f65c08 .word 0x01f65c08 + +01f3fb9c : + 1f3fb9c: e59f3068 ldr r3, [pc, #104] ; 1f3fc0c + 1f3fba0: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f3fba4: e593e000 ldr lr, [r3] + 1f3fba8: e4d03001 ldrb r3, [r0], #1 + 1f3fbac: e08e2003 add r2, lr, r3 + 1f3fbb0: e5d22001 ldrb r2, [r2, #1] + 1f3fbb4: e2022003 and r2, r2, #3 + 1f3fbb8: e3520001 cmp r2, #1 + 1f3fbbc: e4d12001 ldrb r2, [r1], #1 + 1f3fbc0: e08ec002 add ip, lr, r2 + 1f3fbc4: e5dcc001 ldrb ip, [ip, #1] + 1f3fbc8: e20cc003 and ip, ip, #3 + 1f3fbcc: 02833020 addeq r3, r3, #32 + 1f3fbd0: e35c0001 cmp ip, #1 + 1f3fbd4: 0a000006 beq 1f3fbf4 + 1f3fbd8: e0533002 subs r3, r3, r2 + 1f3fbdc: 1a000001 bne 1f3fbe8 + 1f3fbe0: e3520000 cmp r2, #0 + 1f3fbe4: 1affffef bne 1f3fba8 + 1f3fbe8: e1a00003 mov r0, r3 + 1f3fbec: e49de004 pop {lr} ; (ldr lr, [sp], #4) + 1f3fbf0: e12fff1e bx lr + 1f3fbf4: e2822020 add r2, r2, #32 + 1f3fbf8: e0533002 subs r3, r3, r2 + 1f3fbfc: 0affffe9 beq 1f3fba8 + 1f3fc00: e1a00003 mov r0, r3 + 1f3fc04: e49de004 pop {lr} ; (ldr lr, [sp], #4) + 1f3fc08: e12fff1e bx lr + 1f3fc0c: 01f657dc .word 0x01f657dc + +01f3fc10 : + 1f3fc10: e3100003 tst r0, #3 + 1f3fc14: e92d4010 push {r4, lr} + 1f3fc18: e1a04000 mov r4, r0 + 1f3fc1c: 1a000010 bne 1f3fc64 + 1f3fc20: e5940000 ldr r0, [r4] + 1f3fc24: e59f3060 ldr r3, [pc, #96] ; 1f3fc8c + 1f3fc28: e59f2060 ldr r2, [pc, #96] ; 1f3fc90 + 1f3fc2c: e0803003 add r3, r0, r3 + 1f3fc30: e1c33000 bic r3, r3, r0 + 1f3fc34: e0022003 and r2, r2, r3 + 1f3fc38: e3520000 cmp r2, #0 + 1f3fc3c: e1a00004 mov r0, r4 + 1f3fc40: 1a000007 bne 1f3fc64 + 1f3fc44: e5b0c004 ldr ip, [r0, #4]! + 1f3fc48: e59f303c ldr r3, [pc, #60] ; 1f3fc8c + 1f3fc4c: e59f203c ldr r2, [pc, #60] ; 1f3fc90 + 1f3fc50: e08c3003 add r3, ip, r3 + 1f3fc54: e1c3300c bic r3, r3, ip + 1f3fc58: e0022003 and r2, r2, r3 + 1f3fc5c: e3520000 cmp r2, #0 + 1f3fc60: 0afffff7 beq 1f3fc44 + 1f3fc64: e5d03000 ldrb r3, [r0] + 1f3fc68: e3530000 cmp r3, #0 + 1f3fc6c: 0a000002 beq 1f3fc7c + 1f3fc70: e5f03001 ldrb r3, [r0, #1]! + 1f3fc74: e3530000 cmp r3, #0 + 1f3fc78: 1afffffc bne 1f3fc70 + 1f3fc7c: eb0000e7 bl 1f40020 + 1f3fc80: e1a00004 mov r0, r4 + 1f3fc84: e8bd4010 pop {r4, lr} + 1f3fc88: e12fff1e bx lr + 1f3fc8c: fefefeff .word 0xfefefeff + 1f3fc90: 80808080 .word 0x80808080 + +01f3fc94 : + 1f3fc94: e211c0ff ands ip, r1, #255 ; 0xff + 1f3fc98: e92d4010 push {r4, lr} + 1f3fc9c: 0a00002e beq 1f3fd5c + 1f3fca0: e3100003 tst r0, #3 + 1f3fca4: 0a00000e beq 1f3fce4 + 1f3fca8: e5d03000 ldrb r3, [r0] + 1f3fcac: e3530000 cmp r3, #0 + 1f3fcb0: 0a00004c beq 1f3fde8 + 1f3fcb4: e15c0003 cmp ip, r3 + 1f3fcb8: 0a000025 beq 1f3fd54 + 1f3fcbc: e2803001 add r3, r0, #1 + 1f3fcc0: ea000004 b 1f3fcd8 + 1f3fcc4: e4d32001 ldrb r2, [r3], #1 + 1f3fcc8: e3520000 cmp r2, #0 + 1f3fccc: 0a000042 beq 1f3fddc + 1f3fcd0: e15c0002 cmp ip, r2 + 1f3fcd4: 0a00001e beq 1f3fd54 + 1f3fcd8: e3130003 tst r3, #3 + 1f3fcdc: e1a00003 mov r0, r3 + 1f3fce0: 1afffff7 bne 1f3fcc4 + 1f3fce4: e1a04401 lsl r4, r1, #8 + 1f3fce8: e2044cff and r4, r4, #65280 ; 0xff00 + 1f3fcec: e184400c orr r4, r4, ip + 1f3fcf0: e5901000 ldr r1, [r0] + 1f3fcf4: e1844804 orr r4, r4, r4, lsl #16 + 1f3fcf8: ea000000 b 1f3fd00 + 1f3fcfc: e5b01004 ldr r1, [r0, #4]! + 1f3fd00: e59f30ec ldr r3, [pc, #236] ; 1f3fdf4 + 1f3fd04: e1a02003 mov r2, r3 + 1f3fd08: e024e001 eor lr, r4, r1 + 1f3fd0c: e0812002 add r2, r1, r2 + 1f3fd10: e08e3003 add r3, lr, r3 + 1f3fd14: e1c22001 bic r2, r2, r1 + 1f3fd18: e1c3300e bic r3, r3, lr + 1f3fd1c: e59f10d4 ldr r1, [pc, #212] ; 1f3fdf8 + 1f3fd20: e1823003 orr r3, r2, r3 + 1f3fd24: e0011003 and r1, r1, r3 + 1f3fd28: e3510000 cmp r1, #0 + 1f3fd2c: 0afffff2 beq 1f3fcfc + 1f3fd30: e5d03000 ldrb r3, [r0] + 1f3fd34: e3530000 cmp r3, #0 + 1f3fd38: 1a000003 bne 1f3fd4c + 1f3fd3c: ea000029 b 1f3fde8 + 1f3fd40: e5f03001 ldrb r3, [r0, #1]! + 1f3fd44: e3530000 cmp r3, #0 + 1f3fd48: 0a000026 beq 1f3fde8 + 1f3fd4c: e15c0003 cmp ip, r3 + 1f3fd50: 1afffffa bne 1f3fd40 + 1f3fd54: e8bd4010 pop {r4, lr} + 1f3fd58: e12fff1e bx lr + 1f3fd5c: e3100003 tst r0, #3 + 1f3fd60: 0a00000b beq 1f3fd94 + 1f3fd64: e5d03000 ldrb r3, [r0] + 1f3fd68: e3530000 cmp r3, #0 + 1f3fd6c: 0afffff8 beq 1f3fd54 + 1f3fd70: e2803001 add r3, r0, #1 + 1f3fd74: ea000003 b 1f3fd88 + 1f3fd78: e5d02000 ldrb r2, [r0] + 1f3fd7c: e3520000 cmp r2, #0 + 1f3fd80: e2833001 add r3, r3, #1 + 1f3fd84: 0afffff2 beq 1f3fd54 + 1f3fd88: e3130003 tst r3, #3 + 1f3fd8c: e1a00003 mov r0, r3 + 1f3fd90: 1afffff8 bne 1f3fd78 + 1f3fd94: e5901000 ldr r1, [r0] + 1f3fd98: ea000000 b 1f3fda0 + 1f3fd9c: e5b01004 ldr r1, [r0, #4]! + 1f3fda0: e59f304c ldr r3, [pc, #76] ; 1f3fdf4 + 1f3fda4: e59f204c ldr r2, [pc, #76] ; 1f3fdf8 + 1f3fda8: e0813003 add r3, r1, r3 + 1f3fdac: e1c33001 bic r3, r3, r1 + 1f3fdb0: e0022003 and r2, r2, r3 + 1f3fdb4: e3520000 cmp r2, #0 + 1f3fdb8: 0afffff7 beq 1f3fd9c + 1f3fdbc: e5d03000 ldrb r3, [r0] + 1f3fdc0: e3530000 cmp r3, #0 + 1f3fdc4: 0affffe2 beq 1f3fd54 + 1f3fdc8: e5f03001 ldrb r3, [r0, #1]! + 1f3fdcc: e3530000 cmp r3, #0 + 1f3fdd0: 1afffffc bne 1f3fdc8 + 1f3fdd4: e8bd4010 pop {r4, lr} + 1f3fdd8: e12fff1e bx lr + 1f3fddc: e1a00002 mov r0, r2 + 1f3fde0: e8bd4010 pop {r4, lr} + 1f3fde4: e12fff1e bx lr + 1f3fde8: e1a00003 mov r0, r3 + 1f3fdec: e8bd4010 pop {r4, lr} + 1f3fdf0: e12fff1e bx lr + 1f3fdf4: fefefeff .word 0xfefefeff + 1f3fdf8: 80808080 .word 0x80808080 + +01f3fdfc : + 1f3fdfc: e020c001 eor ip, r0, r1 + 1f3fe00: e31c0003 tst ip, #3 + 1f3fe04: 1a000021 bne 1f3fe90 + 1f3fe08: e210c003 ands ip, r0, #3 + 1f3fe0c: e3c00003 bic r0, r0, #3 + 1f3fe10: e3c11003 bic r1, r1, #3 + 1f3fe14: e4902004 ldr r2, [r0], #4 + 1f3fe18: 04913004 ldreq r3, [r1], #4 + 1f3fe1c: 0a000006 beq 1f3fe3c + 1f3fe20: e22cc003 eor ip, ip, #3 + 1f3fe24: e3e034ff mvn r3, #-16777216 ; 0xff000000 + 1f3fe28: e1a0c18c lsl ip, ip, #3 + 1f3fe2c: e1a0cc33 lsr ip, r3, ip + 1f3fe30: e4913004 ldr r3, [r1], #4 + 1f3fe34: e182200c orr r2, r2, ip + 1f3fe38: e183300c orr r3, r3, ip + 1f3fe3c: e52d4004 push {r4} ; (str r4, [sp, #-4]!) + 1f3fe40: e3a04001 mov r4, #1 + 1f3fe44: e1844404 orr r4, r4, r4, lsl #8 + 1f3fe48: e1844804 orr r4, r4, r4, lsl #16 + 1f3fe4c: e042c004 sub ip, r2, r4 + 1f3fe50: e1520003 cmp r2, r3 + 1f3fe54: 01ccc002 biceq ip, ip, r2 + 1f3fe58: 011c0384 tsteq ip, r4, lsl #7 + 1f3fe5c: 04902004 ldreq r2, [r0], #4 + 1f3fe60: 04913004 ldreq r3, [r1], #4 + 1f3fe64: 0afffff8 beq 1f3fe4c + 1f3fe68: e1a00c02 lsl r0, r2, #24 + 1f3fe6c: e1a02422 lsr r2, r2, #8 + 1f3fe70: e3500001 cmp r0, #1 + 1f3fe74: 21500c03 cmpcs r0, r3, lsl #24 + 1f3fe78: 01a03423 lsreq r3, r3, #8 + 1f3fe7c: 0afffff9 beq 1f3fe68 + 1f3fe80: e20330ff and r3, r3, #255 ; 0xff + 1f3fe84: e0630c20 rsb r0, r3, r0, lsr #24 + 1f3fe88: e49d4004 pop {r4} ; (ldr r4, [sp], #4) + 1f3fe8c: e12fff1e bx lr + 1f3fe90: e3100003 tst r0, #3 + 1f3fe94: 0a000006 beq 1f3feb4 + 1f3fe98: e4d02001 ldrb r2, [r0], #1 + 1f3fe9c: e4d13001 ldrb r3, [r1], #1 + 1f3fea0: e3520001 cmp r2, #1 + 1f3fea4: 21520003 cmpcs r2, r3 + 1f3fea8: 0afffff8 beq 1f3fe90 + 1f3feac: e0420003 sub r0, r2, r3 + 1f3feb0: e12fff1e bx lr + 1f3feb4: e92d0030 push {r4, r5} + 1f3feb8: e3a04001 mov r4, #1 + 1f3febc: e1844404 orr r4, r4, r4, lsl #8 + 1f3fec0: e1844804 orr r4, r4, r4, lsl #16 + 1f3fec4: e4902004 ldr r2, [r0], #4 + 1f3fec8: e2015003 and r5, r1, #3 + 1f3fecc: e3c11003 bic r1, r1, #3 + 1f3fed0: e4913004 ldr r3, [r1], #4 + 1f3fed4: e3550002 cmp r5, #2 + 1f3fed8: 0a000017 beq 1f3ff3c + 1f3fedc: 8a00002d bhi 1f3ff98 + 1f3fee0: e3c254ff bic r5, r2, #-16777216 ; 0xff000000 + 1f3fee4: e1550423 cmp r5, r3, lsr #8 + 1f3fee8: e042c004 sub ip, r2, r4 + 1f3feec: e1ccc002 bic ip, ip, r2 + 1f3fef0: 1a000007 bne 1f3ff14 + 1f3fef4: e01cc384 ands ip, ip, r4, lsl #7 + 1f3fef8: 04913004 ldreq r3, [r1], #4 + 1f3fefc: 1a000006 bne 1f3ff1c + 1f3ff00: e0255002 eor r5, r5, r2 + 1f3ff04: e1550c03 cmp r5, r3, lsl #24 + 1f3ff08: 1a000008 bne 1f3ff30 + 1f3ff0c: e4902004 ldr r2, [r0], #4 + 1f3ff10: eafffff2 b 1f3fee0 + 1f3ff14: e1a03423 lsr r3, r3, #8 + 1f3ff18: ea000036 b 1f3fff8 + 1f3ff1c: e3dcc4ff bics ip, ip, #-16777216 ; 0xff000000 + 1f3ff20: 1a000031 bne 1f3ffec + 1f3ff24: e5d13000 ldrb r3, [r1] + 1f3ff28: e1a05c22 lsr r5, r2, #24 + 1f3ff2c: ea000031 b 1f3fff8 + 1f3ff30: e1a05c22 lsr r5, r2, #24 + 1f3ff34: e20330ff and r3, r3, #255 ; 0xff + 1f3ff38: ea00002e b 1f3fff8 + 1f3ff3c: e1a05802 lsl r5, r2, #16 + 1f3ff40: e042c004 sub ip, r2, r4 + 1f3ff44: e1a05825 lsr r5, r5, #16 + 1f3ff48: e1ccc002 bic ip, ip, r2 + 1f3ff4c: e1550823 cmp r5, r3, lsr #16 + 1f3ff50: 1a00000e bne 1f3ff90 + 1f3ff54: e01cc384 ands ip, ip, r4, lsl #7 + 1f3ff58: 04913004 ldreq r3, [r1], #4 + 1f3ff5c: 1a000004 bne 1f3ff74 + 1f3ff60: e0255002 eor r5, r5, r2 + 1f3ff64: e1550803 cmp r5, r3, lsl #16 + 1f3ff68: 1a000006 bne 1f3ff88 + 1f3ff6c: e4902004 ldr r2, [r0], #4 + 1f3ff70: eafffff1 b 1f3ff3c + 1f3ff74: e1b0c80c lsls ip, ip, #16 + 1f3ff78: 1a00001b bne 1f3ffec + 1f3ff7c: e1d130b0 ldrh r3, [r1] + 1f3ff80: e1a05822 lsr r5, r2, #16 + 1f3ff84: ea00001b b 1f3fff8 + 1f3ff88: e1a03803 lsl r3, r3, #16 + 1f3ff8c: e1a05822 lsr r5, r2, #16 + 1f3ff90: e1a03823 lsr r3, r3, #16 + 1f3ff94: ea000017 b 1f3fff8 + 1f3ff98: e20250ff and r5, r2, #255 ; 0xff + 1f3ff9c: e1550c23 cmp r5, r3, lsr #24 + 1f3ffa0: e042c004 sub ip, r2, r4 + 1f3ffa4: e1ccc002 bic ip, ip, r2 + 1f3ffa8: 1a000007 bne 1f3ffcc + 1f3ffac: e01cc384 ands ip, ip, r4, lsl #7 + 1f3ffb0: 04913004 ldreq r3, [r1], #4 + 1f3ffb4: 1a000006 bne 1f3ffd4 + 1f3ffb8: e0255002 eor r5, r5, r2 + 1f3ffbc: e1550403 cmp r5, r3, lsl #8 + 1f3ffc0: 1a000006 bne 1f3ffe0 + 1f3ffc4: e4902004 ldr r2, [r0], #4 + 1f3ffc8: eafffff2 b 1f3ff98 + 1f3ffcc: e1a03c23 lsr r3, r3, #24 + 1f3ffd0: ea000008 b 1f3fff8 + 1f3ffd4: e31200ff tst r2, #255 ; 0xff + 1f3ffd8: 0a000003 beq 1f3ffec + 1f3ffdc: e4913004 ldr r3, [r1], #4 + 1f3ffe0: e1a05422 lsr r5, r2, #8 + 1f3ffe4: e3c334ff bic r3, r3, #-16777216 ; 0xff000000 + 1f3ffe8: ea000002 b 1f3fff8 + 1f3ffec: e3a00000 mov r0, #0 + 1f3fff0: e8bd0030 pop {r4, r5} + 1f3fff4: e12fff1e bx lr + 1f3fff8: e20520ff and r2, r5, #255 ; 0xff + 1f3fffc: e20300ff and r0, r3, #255 ; 0xff + 1f40000: e3500001 cmp r0, #1 + 1f40004: 21500002 cmpcs r0, r2 + 1f40008: 01a05425 lsreq r5, r5, #8 + 1f4000c: 01a03423 lsreq r3, r3, #8 + 1f40010: 0afffff8 beq 1f3fff8 + 1f40014: e0420000 sub r0, r2, r0 + 1f40018: e8bd0030 pop {r4, r5} + 1f4001c: e12fff1e bx lr + +01f40020 : + 1f40020: e0202001 eor r2, r0, r1 + 1f40024: e1a0c000 mov ip, r0 + 1f40028: e3120003 tst r2, #3 + 1f4002c: 1a000032 bne 1f400fc + 1f40030: e3110003 tst r1, #3 + 1f40034: 1a000021 bne 1f400c0 + 1f40038: e52d5004 push {r5} ; (str r5, [sp, #-4]!) + 1f4003c: e3a05001 mov r5, #1 + 1f40040: e1855405 orr r5, r5, r5, lsl #8 + 1f40044: e1855805 orr r5, r5, r5, lsl #16 + 1f40048: e52d4004 push {r4} ; (str r4, [sp, #-4]!) + 1f4004c: e3110004 tst r1, #4 + 1f40050: e4913004 ldr r3, [r1], #4 + 1f40054: 0a000005 beq 1f40070 + 1f40058: e0432005 sub r2, r3, r5 + 1f4005c: e1d22003 bics r2, r2, r3 + 1f40060: e1120385 tst r2, r5, lsl #7 + 1f40064: 048c3004 streq r3, [ip], #4 + 1f40068: 04913004 ldreq r3, [r1], #4 + 1f4006c: 1a00000c bne 1f400a4 + 1f40070: e4914004 ldr r4, [r1], #4 + 1f40074: e0432005 sub r2, r3, r5 + 1f40078: e1d22003 bics r2, r2, r3 + 1f4007c: e1120385 tst r2, r5, lsl #7 + 1f40080: e0442005 sub r2, r4, r5 + 1f40084: 1a000006 bne 1f400a4 + 1f40088: e48c3004 str r3, [ip], #4 + 1f4008c: e1d22004 bics r2, r2, r4 + 1f40090: e1120385 tst r2, r5, lsl #7 + 1f40094: 04913004 ldreq r3, [r1], #4 + 1f40098: 048c4004 streq r4, [ip], #4 + 1f4009c: 0afffff3 beq 1f40070 + 1f400a0: e1a03004 mov r3, r4 + 1f400a4: e4cc3001 strb r3, [ip], #1 + 1f400a8: e31300ff tst r3, #255 ; 0xff + 1f400ac: e1a03463 ror r3, r3, #8 + 1f400b0: 1afffffb bne 1f400a4 + 1f400b4: e49d4004 pop {r4} ; (ldr r4, [sp], #4) + 1f400b8: e49d5004 pop {r5} ; (ldr r5, [sp], #4) + 1f400bc: e12fff1e bx lr + 1f400c0: e3110001 tst r1, #1 + 1f400c4: 0a000003 beq 1f400d8 + 1f400c8: e4d12001 ldrb r2, [r1], #1 + 1f400cc: e4cc2001 strb r2, [ip], #1 + 1f400d0: e3520000 cmp r2, #0 + 1f400d4: 012fff1e bxeq lr + 1f400d8: e3110002 tst r1, #2 + 1f400dc: 0affffd5 beq 1f40038 + 1f400e0: e0d120b2 ldrh r2, [r1], #2 + 1f400e4: e31200ff tst r2, #255 ; 0xff + 1f400e8: 10cc20b2 strhne r2, [ip], #2 + 1f400ec: 05cc2000 strbeq r2, [ip] + 1f400f0: 13120cff tstne r2, #65280 ; 0xff00 + 1f400f4: 1affffcf bne 1f40038 + 1f400f8: e12fff1e bx lr + 1f400fc: e4d12001 ldrb r2, [r1], #1 + 1f40100: e4cc2001 strb r2, [ip], #1 + 1f40104: e3520000 cmp r2, #0 + 1f40108: 1afffffb bne 1f400fc + 1f4010c: e12fff1e bx lr + +01f40110 : + 1f40110: e3c01003 bic r1, r0, #3 + 1f40114: e2100003 ands r0, r0, #3 + 1f40118: e2600000 rsb r0, r0, #0 + 1f4011c: e4913004 ldr r3, [r1], #4 + 1f40120: e280c004 add ip, r0, #4 + 1f40124: e1a0c18c lsl ip, ip, #3 + 1f40128: e3e02000 mvn r2, #0 + 1f4012c: 11833c32 orrne r3, r3, r2, lsr ip + 1f40130: e3a0c001 mov ip, #1 + 1f40134: e18cc40c orr ip, ip, ip, lsl #8 + 1f40138: e18cc80c orr ip, ip, ip, lsl #16 + 1f4013c: e043200c sub r2, r3, ip + 1f40140: e1c22003 bic r2, r2, r3 + 1f40144: e012238c ands r2, r2, ip, lsl #7 + 1f40148: 04913004 ldreq r3, [r1], #4 + 1f4014c: 02800004 addeq r0, r0, #4 + 1f40150: 0afffff9 beq 1f4013c + 1f40154: e31300ff tst r3, #255 ; 0xff + 1f40158: 12800001 addne r0, r0, #1 + 1f4015c: 13130cff tstne r3, #65280 ; 0xff00 + 1f40160: 12800001 addne r0, r0, #1 + 1f40164: 131308ff tstne r3, #16711680 ; 0xff0000 + 1f40168: 12800001 addne r0, r0, #1 + 1f4016c: e12fff1e bx lr + +01f40170 : + 1f40170: e3520000 cmp r2, #0 + 1f40174: 0a00001f beq 1f401f8 + 1f40178: e59f3080 ldr r3, [pc, #128] ; 1f40200 + 1f4017c: e92d4010 push {r4, lr} + 1f40180: e5934000 ldr r4, [r3] + 1f40184: ea000005 b 1f401a0 + 1f40188: e053300c subs r3, r3, ip + 1f4018c: 1a000012 bne 1f401dc + 1f40190: e35c0000 cmp ip, #0 + 1f40194: 0a000010 beq 1f401dc + 1f40198: e2522001 subs r2, r2, #1 + 1f4019c: 0a000011 beq 1f401e8 + 1f401a0: e4d03001 ldrb r3, [r0], #1 + 1f401a4: e084c003 add ip, r4, r3 + 1f401a8: e5dcc001 ldrb ip, [ip, #1] + 1f401ac: e20cc003 and ip, ip, #3 + 1f401b0: e35c0001 cmp ip, #1 + 1f401b4: e4d1c001 ldrb ip, [r1], #1 + 1f401b8: e084e00c add lr, r4, ip + 1f401bc: e5dee001 ldrb lr, [lr, #1] + 1f401c0: e20ee003 and lr, lr, #3 + 1f401c4: 02833020 addeq r3, r3, #32 + 1f401c8: e35e0001 cmp lr, #1 + 1f401cc: 1affffed bne 1f40188 + 1f401d0: e28cc020 add ip, ip, #32 + 1f401d4: e053300c subs r3, r3, ip + 1f401d8: 0affffee beq 1f40198 + 1f401dc: e1a00003 mov r0, r3 + 1f401e0: e8bd4010 pop {r4, lr} + 1f401e4: e12fff1e bx lr + 1f401e8: e1a03002 mov r3, r2 + 1f401ec: e8bd4010 pop {r4, lr} + 1f401f0: e1a00003 mov r0, r3 + 1f401f4: e12fff1e bx lr + 1f401f8: e1a00002 mov r0, r2 + 1f401fc: e12fff1e bx lr + 1f40200: 01f657dc .word 0x01f657dc + +01f40204 : + 1f40204: e1803001 orr r3, r0, r1 + 1f40208: e3130003 tst r3, #3 + 1f4020c: 03a03001 moveq r3, #1 + 1f40210: 13a03000 movne r3, #0 + 1f40214: e3520003 cmp r2, #3 + 1f40218: 93a03000 movls r3, #0 + 1f4021c: 82033001 andhi r3, r3, #1 + 1f40220: e3530000 cmp r3, #0 + 1f40224: e92d4030 push {r4, r5, lr} + 1f40228: 01a03000 moveq r3, r0 + 1f4022c: 0a00000f beq 1f40270 + 1f40230: e1a0e001 mov lr, r1 + 1f40234: e1a03000 mov r3, r0 + 1f40238: e1a0100e mov r1, lr + 1f4023c: e59fc09c ldr ip, [pc, #156] ; 1f402e0 + 1f40240: e49e5004 ldr r5, [lr], #4 + 1f40244: e59f4098 ldr r4, [pc, #152] ; 1f402e4 + 1f40248: e085c00c add ip, r5, ip + 1f4024c: e1ccc005 bic ip, ip, r5 + 1f40250: e004400c and r4, r4, ip + 1f40254: e3540000 cmp r4, #0 + 1f40258: 1a000006 bne 1f40278 + 1f4025c: e2422004 sub r2, r2, #4 + 1f40260: e3520003 cmp r2, #3 + 1f40264: e4835004 str r5, [r3], #4 + 1f40268: e1a0100e mov r1, lr + 1f4026c: 8afffff1 bhi 1f40238 + 1f40270: e3520000 cmp r2, #0 + 1f40274: 0a00000e beq 1f402b4 + 1f40278: e5d1c000 ldrb ip, [r1] + 1f4027c: e35c0000 cmp ip, #0 + 1f40280: e5c3c000 strb ip, [r3] + 1f40284: e2422001 sub r2, r2, #1 + 1f40288: e2833001 add r3, r3, #1 + 1f4028c: e2811001 add r1, r1, #1 + 1f40290: 1a000005 bne 1f402ac + 1f40294: ea000008 b 1f402bc + 1f40298: e4d1c001 ldrb ip, [r1], #1 + 1f4029c: e35c0000 cmp ip, #0 + 1f402a0: e2422001 sub r2, r2, #1 + 1f402a4: e4c3c001 strb ip, [r3], #1 + 1f402a8: 0a000003 beq 1f402bc + 1f402ac: e3520000 cmp r2, #0 + 1f402b0: 1afffff8 bne 1f40298 + 1f402b4: e8bd4030 pop {r4, r5, lr} + 1f402b8: e12fff1e bx lr + 1f402bc: e3520000 cmp r2, #0 + 1f402c0: 13a01000 movne r1, #0 + 1f402c4: 10832002 addne r2, r3, r2 + 1f402c8: 0afffff9 beq 1f402b4 + 1f402cc: e4c31001 strb r1, [r3], #1 + 1f402d0: e1520003 cmp r2, r3 + 1f402d4: 1afffffc bne 1f402cc + 1f402d8: e8bd4030 pop {r4, r5, lr} + 1f402dc: e12fff1e bx lr + 1f402e0: fefefeff .word 0xfefefeff + 1f402e4: 80808080 .word 0x80808080 + +01f402e8 : + 1f402e8: e92d4070 push {r4, r5, r6, lr} + 1f402ec: e2515000 subs r5, r1, #0 + 1f402f0: 0a00000c beq 1f40328 + 1f402f4: e1a03000 mov r3, r0 + 1f402f8: e3a04000 mov r4, #0 + 1f402fc: ea000001 b 1f40308 + 1f40300: e1a04000 mov r4, r0 + 1f40304: e2803001 add r3, r0, #1 + 1f40308: e1a00003 mov r0, r3 + 1f4030c: e1a01005 mov r1, r5 + 1f40310: ebfffe5f bl 1f3fc94 + 1f40314: e3500000 cmp r0, #0 + 1f40318: 1afffff8 bne 1f40300 + 1f4031c: e1a00004 mov r0, r4 + 1f40320: e8bd4070 pop {r4, r5, r6, lr} + 1f40324: e12fff1e bx lr + 1f40328: ebfffe59 bl 1f3fc94 + 1f4032c: e1a04000 mov r4, r0 + 1f40330: e1a00004 mov r0, r4 + 1f40334: e8bd4070 pop {r4, r5, r6, lr} + 1f40338: e12fff1e bx lr + +01f4033c : + 1f4033c: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f40340: e3a06001 mov r6, #1 + 1f40344: e3a0e000 mov lr, #0 + 1f40348: e1a0c006 mov ip, r6 + 1f4034c: e3e04000 mvn r4, #0 + 1f40350: e08e300c add r3, lr, ip + 1f40354: e1530001 cmp r3, r1 + 1f40358: e0805004 add r5, r0, r4 + 1f4035c: 2a00000a bcs 1f4038c + 1f40360: e7d5500c ldrb r5, [r5, ip] + 1f40364: e7d07003 ldrb r7, [r0, r3] + 1f40368: e1570005 cmp r7, r5 + 1f4036c: 2a000021 bcs 1f403f8 + 1f40370: e1a0e003 mov lr, r3 + 1f40374: e3a0c001 mov ip, #1 + 1f40378: e0646003 rsb r6, r4, r3 + 1f4037c: e08e300c add r3, lr, ip + 1f40380: e1530001 cmp r3, r1 + 1f40384: e0805004 add r5, r0, r4 + 1f40388: 3afffff4 bcc 1f40360 + 1f4038c: e3a08001 mov r8, #1 + 1f40390: e3a0e000 mov lr, #0 + 1f40394: e1a0c008 mov ip, r8 + 1f40398: e3e05000 mvn r5, #0 + 1f4039c: e5826000 str r6, [r2] + 1f403a0: e08e300c add r3, lr, ip + 1f403a4: e1510003 cmp r1, r3 + 1f403a8: e0806005 add r6, r0, r5 + 1f403ac: 9a00000a bls 1f403dc + 1f403b0: e7d6600c ldrb r6, [r6, ip] + 1f403b4: e7d07003 ldrb r7, [r0, r3] + 1f403b8: e1570006 cmp r7, r6 + 1f403bc: 9a000013 bls 1f40410 + 1f403c0: e1a0e003 mov lr, r3 + 1f403c4: e3a0c001 mov ip, #1 + 1f403c8: e0658003 rsb r8, r5, r3 + 1f403cc: e08e300c add r3, lr, ip + 1f403d0: e1510003 cmp r1, r3 + 1f403d4: e0806005 add r6, r0, r5 + 1f403d8: 8afffff4 bhi 1f403b0 + 1f403dc: e2840001 add r0, r4, #1 + 1f403e0: e2855001 add r5, r5, #1 + 1f403e4: e1550000 cmp r5, r0 + 1f403e8: 21a00005 movcs r0, r5 + 1f403ec: 25828000 strcs r8, [r2] + 1f403f0: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f403f4: e12fff1e bx lr + 1f403f8: 0a00000a beq 1f40428 + 1f403fc: e3a06001 mov r6, #1 + 1f40400: e1a0400e mov r4, lr + 1f40404: e1a0c006 mov ip, r6 + 1f40408: e08ee006 add lr, lr, r6 + 1f4040c: eaffffcf b 1f40350 + 1f40410: 0a00000a beq 1f40440 + 1f40414: e3a08001 mov r8, #1 + 1f40418: e1a0500e mov r5, lr + 1f4041c: e1a0c008 mov ip, r8 + 1f40420: e08ee008 add lr, lr, r8 + 1f40424: eaffffdd b 1f403a0 + 1f40428: e15c0006 cmp ip, r6 + 1f4042c: 01a0600c moveq r6, ip + 1f40430: 128cc001 addne ip, ip, #1 + 1f40434: 01a0e003 moveq lr, r3 + 1f40438: 03a0c001 moveq ip, #1 + 1f4043c: eaffffc3 b 1f40350 + 1f40440: e15c0008 cmp ip, r8 + 1f40444: 01a0800c moveq r8, ip + 1f40448: 128cc001 addne ip, ip, #1 + 1f4044c: 01a0e003 moveq lr, r3 + 1f40450: 03a0c001 moveq ip, #1 + 1f40454: eaffffd1 b 1f403a0 + +01f40458 : + 1f40458: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f4045c: e1a09002 mov r9, r2 + 1f40460: e1a04003 mov r4, r3 + 1f40464: e24dde41 sub sp, sp, #1040 ; 0x410 + 1f40468: e24dd00c sub sp, sp, #12 + 1f4046c: e28d3014 add r3, sp, #20 + 1f40470: e1a02003 mov r2, r3 + 1f40474: e1a05000 mov r5, r0 + 1f40478: e1a0b001 mov fp, r1 + 1f4047c: e1a00009 mov r0, r9 + 1f40480: e1a01004 mov r1, r4 + 1f40484: e58d3004 str r3, [sp, #4] + 1f40488: ebffffab bl 1f4033c + 1f4048c: e28d2e41 add r2, sp, #1040 ; 0x410 + 1f40490: e58d0000 str r0, [sp] + 1f40494: e59d3004 ldr r3, [sp, #4] + 1f40498: e2822004 add r2, r2, #4 + 1f4049c: e5a34004 str r4, [r3, #4]! + 1f404a0: e1530002 cmp r3, r2 + 1f404a4: 1afffffc bne 1f4049c + 1f404a8: e3540000 cmp r4, #0 + 1f404ac: 11a01009 movne r1, r9 + 1f404b0: 12443001 subne r3, r4, #1 + 1f404b4: 0a000006 beq 1f404d4 + 1f404b8: e4d12001 ldrb r2, [r1], #1 + 1f404bc: e28d0e41 add r0, sp, #1040 ; 0x410 + 1f404c0: e2800008 add r0, r0, #8 + 1f404c4: e0802102 add r2, r0, r2, lsl #2 + 1f404c8: e5023400 str r3, [r2, #-1024] ; 0xfffffc00 + 1f404cc: e2533001 subs r3, r3, #1 + 1f404d0: 2afffff8 bcs 1f404b8 + 1f404d4: e59d1014 ldr r1, [sp, #20] + 1f404d8: e59d6000 ldr r6, [sp] + 1f404dc: e0891001 add r1, r9, r1 + 1f404e0: e1a02006 mov r2, r6 + 1f404e4: e1a00009 mov r0, r9 + 1f404e8: ebfffa18 bl 1f3ed50 + 1f404ec: e3500000 cmp r0, #0 + 1f404f0: 1a00005c bne 1f40668 + 1f404f4: e1a03006 mov r3, r6 + 1f404f8: e2462001 sub r2, r6, #1 + 1f404fc: e58d2004 str r2, [sp, #4] + 1f40500: e2633001 rsb r3, r3, #1 + 1f40504: e0892002 add r2, r9, r2 + 1f40508: e1a08000 mov r8, r0 + 1f4050c: e1a0a000 mov sl, r0 + 1f40510: e58d2008 str r2, [sp, #8] + 1f40514: e2446001 sub r6, r4, #1 + 1f40518: e58d300c str r3, [sp, #12] + 1f4051c: e1a0000b mov r0, fp + 1f40520: ea000007 b 1f40544 + 1f40524: e3580000 cmp r8, #0 + 1f40528: 0a000002 beq 1f40538 + 1f4052c: e59d2014 ldr r2, [sp, #20] + 1f40530: e1530002 cmp r3, r2 + 1f40534: 30623004 rsbcc r3, r2, r4 + 1f40538: e3a08000 mov r8, #0 + 1f4053c: e083a00a add sl, r3, sl + 1f40540: e1a00007 mov r0, r7 + 1f40544: e08a7004 add r7, sl, r4 + 1f40548: e0602007 rsb r2, r0, r7 + 1f4054c: e3a01000 mov r1, #0 + 1f40550: e0850000 add r0, r5, r0 + 1f40554: eb001c11 bl 1f475a0 + 1f40558: e2973000 adds r3, r7, #0 + 1f4055c: 13a03001 movne r3, #1 + 1f40560: e3500000 cmp r0, #0 + 1f40564: 13a03000 movne r3, #0 + 1f40568: e3530000 cmp r3, #0 + 1f4056c: 0a000097 beq 1f407d0 + 1f40570: e0853007 add r3, r5, r7 + 1f40574: e5533001 ldrb r3, [r3, #-1] + 1f40578: e28d2e41 add r2, sp, #1040 ; 0x410 + 1f4057c: e2822008 add r2, r2, #8 + 1f40580: e0823103 add r3, r2, r3, lsl #2 + 1f40584: e5133400 ldr r3, [r3, #-1024] ; 0xfffffc00 + 1f40588: e3530000 cmp r3, #0 + 1f4058c: 1affffe4 bne 1f40524 + 1f40590: e59d3000 ldr r3, [sp] + 1f40594: e1580003 cmp r8, r3 + 1f40598: 21a03008 movcs r3, r8 + 1f4059c: e1530006 cmp r3, r6 + 1f405a0: 2a00000e bcs 1f405e0 + 1f405a4: e08a2003 add r2, sl, r3 + 1f405a8: e7d51002 ldrb r1, [r5, r2] + 1f405ac: e7d90003 ldrb r0, [r9, r3] + 1f405b0: e1500001 cmp r0, r1 + 1f405b4: e0852002 add r2, r5, r2 + 1f405b8: e0891003 add r1, r9, r3 + 1f405bc: 0a000004 beq 1f405d4 + 1f405c0: ea000025 b 1f4065c + 1f405c4: e5f1c001 ldrb ip, [r1, #1]! + 1f405c8: e5f20001 ldrb r0, [r2, #1]! + 1f405cc: e15c0000 cmp ip, r0 + 1f405d0: 1a000021 bne 1f4065c + 1f405d4: e2833001 add r3, r3, #1 + 1f405d8: e1530006 cmp r3, r6 + 1f405dc: 3afffff8 bcc 1f405c4 + 1f405e0: e59d3000 ldr r3, [sp] + 1f405e4: e1580003 cmp r8, r3 + 1f405e8: e59d1004 ldr r1, [sp, #4] + 1f405ec: 21a01003 movcs r1, r3 + 1f405f0: 2a000012 bcs 1f40640 + 1f405f4: e59d3004 ldr r3, [sp, #4] + 1f405f8: e59dc008 ldr ip, [sp, #8] + 1f405fc: e08a2003 add r2, sl, r3 + 1f40600: e7d50002 ldrb r0, [r5, r2] + 1f40604: e5dc3000 ldrb r3, [ip] + 1f40608: e1500003 cmp r0, r3 + 1f4060c: e0852002 add r2, r5, r2 + 1f40610: 1a000073 bne 1f407e4 + 1f40614: e1a0300c mov r3, ip + 1f40618: e089b008 add fp, r9, r8 + 1f4061c: ea000004 b 1f40634 + 1f40620: e573c001 ldrb ip, [r3, #-1]! + 1f40624: e5720001 ldrb r0, [r2, #-1]! + 1f40628: e15c0000 cmp ip, r0 + 1f4062c: 1a000003 bne 1f40640 + 1f40630: e1a0100e mov r1, lr + 1f40634: e15b0003 cmp fp, r3 + 1f40638: e241e001 sub lr, r1, #1 + 1f4063c: 1afffff7 bne 1f40620 + 1f40640: e2888001 add r8, r8, #1 + 1f40644: e1580001 cmp r8, r1 + 1f40648: 8a000053 bhi 1f4079c + 1f4064c: e59d8014 ldr r8, [sp, #20] + 1f40650: e08aa008 add sl, sl, r8 + 1f40654: e0688004 rsb r8, r8, r4 + 1f40658: eaffffb8 b 1f40540 + 1f4065c: e59d200c ldr r2, [sp, #12] + 1f40660: e082a00a add sl, r2, sl + 1f40664: eaffffb3 b 1f40538 + 1f40668: e59d2000 ldr r2, [sp] + 1f4066c: e0623004 rsb r3, r2, r4 + 1f40670: e1530002 cmp r3, r2 + 1f40674: 31a03002 movcc r3, r2 + 1f40678: e2421001 sub r1, r2, #1 + 1f4067c: e2833001 add r3, r3, #1 + 1f40680: e0898002 add r8, r9, r2 + 1f40684: e58d3014 str r3, [sp, #20] + 1f40688: e2446001 sub r6, r4, #1 + 1f4068c: e0893001 add r3, r9, r1 + 1f40690: e1a0000b mov r0, fp + 1f40694: e3a0a000 mov sl, #0 + 1f40698: e1a0b009 mov fp, r9 + 1f4069c: e1a09008 mov r9, r8 + 1f406a0: e1a08004 mov r8, r4 + 1f406a4: e1a04002 mov r4, r2 + 1f406a8: e58d3004 str r3, [sp, #4] + 1f406ac: e2623001 rsb r3, r2, #1 + 1f406b0: e58d1000 str r1, [sp] + 1f406b4: e58d3008 str r3, [sp, #8] + 1f406b8: e08a7008 add r7, sl, r8 + 1f406bc: e0602007 rsb r2, r0, r7 + 1f406c0: e3a01000 mov r1, #0 + 1f406c4: e0850000 add r0, r5, r0 + 1f406c8: eb001bb4 bl 1f475a0 + 1f406cc: e2973000 adds r3, r7, #0 + 1f406d0: 13a03001 movne r3, #1 + 1f406d4: e3500000 cmp r0, #0 + 1f406d8: 13a03000 movne r3, #0 + 1f406dc: e3530000 cmp r3, #0 + 1f406e0: 0a00003a beq 1f407d0 + 1f406e4: e0852007 add r2, r5, r7 + 1f406e8: e5522001 ldrb r2, [r2, #-1] + 1f406ec: e28d3e41 add r3, sp, #1040 ; 0x410 + 1f406f0: e2833008 add r3, r3, #8 + 1f406f4: e0832102 add r2, r3, r2, lsl #2 + 1f406f8: e5122400 ldr r2, [r2, #-1024] ; 0xfffffc00 + 1f406fc: e3520000 cmp r2, #0 + 1f40700: 1a00002b bne 1f407b4 + 1f40704: e1540006 cmp r4, r6 + 1f40708: 2a000010 bcs 1f40750 + 1f4070c: e08a1004 add r1, sl, r4 + 1f40710: e7d50001 ldrb r0, [r5, r1] + 1f40714: e5d92000 ldrb r2, [r9] + 1f40718: e1500002 cmp r0, r2 + 1f4071c: e0851001 add r1, r5, r1 + 1f40720: 11a02004 movne r2, r4 + 1f40724: 1a000025 bne 1f407c0 + 1f40728: e1a00009 mov r0, r9 + 1f4072c: e1a02004 mov r2, r4 + 1f40730: ea000003 b 1f40744 + 1f40734: e5f0c001 ldrb ip, [r0, #1]! + 1f40738: e5f13001 ldrb r3, [r1, #1]! + 1f4073c: e15c0003 cmp ip, r3 + 1f40740: 1a00001e bne 1f407c0 + 1f40744: e2822001 add r2, r2, #1 + 1f40748: e1520006 cmp r2, r6 + 1f4074c: 3afffff8 bcc 1f40734 + 1f40750: e59d3000 ldr r3, [sp] + 1f40754: e3730001 cmn r3, #1 + 1f40758: 0a00000f beq 1f4079c + 1f4075c: e59d3000 ldr r3, [sp] + 1f40760: e08a1003 add r1, sl, r3 + 1f40764: e59d3004 ldr r3, [sp, #4] + 1f40768: e7d50001 ldrb r0, [r5, r1] + 1f4076c: e5d32000 ldrb r2, [r3] + 1f40770: e1500002 cmp r0, r2 + 1f40774: e0851001 add r1, r5, r1 + 1f40778: 1a00000c bne 1f407b0 + 1f4077c: e1a02003 mov r2, r3 + 1f40780: ea000003 b 1f40794 + 1f40784: e5720001 ldrb r0, [r2, #-1]! + 1f40788: e5713001 ldrb r3, [r1, #-1]! + 1f4078c: e1500003 cmp r0, r3 + 1f40790: 1a000006 bne 1f407b0 + 1f40794: e152000b cmp r2, fp + 1f40798: 1afffff9 bne 1f40784 + 1f4079c: e085000a add r0, r5, sl + 1f407a0: e28dde41 add sp, sp, #1040 ; 0x410 + 1f407a4: e28dd00c add sp, sp, #12 + 1f407a8: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f407ac: e12fff1e bx lr + 1f407b0: e59d2014 ldr r2, [sp, #20] + 1f407b4: e08aa002 add sl, sl, r2 + 1f407b8: e1a00007 mov r0, r7 + 1f407bc: eaffffbd b 1f406b8 + 1f407c0: e59d3008 ldr r3, [sp, #8] + 1f407c4: e083a00a add sl, r3, sl + 1f407c8: e08aa002 add sl, sl, r2 + 1f407cc: eafffff9 b 1f407b8 + 1f407d0: e3a00000 mov r0, #0 + 1f407d4: e28dde41 add sp, sp, #1040 ; 0x410 + 1f407d8: e28dd00c add sp, sp, #12 + 1f407dc: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f407e0: e12fff1e bx lr + 1f407e4: e59d1000 ldr r1, [sp] + 1f407e8: eaffff94 b 1f40640 + +01f407ec : + 1f407ec: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f407f0: e5d02000 ldrb r2, [r0] + 1f407f4: e3520000 cmp r2, #0 + 1f407f8: e24dd01c sub sp, sp, #28 + 1f407fc: 0a0000d4 beq 1f40b54 + 1f40800: e5d1c000 ldrb ip, [r1] + 1f40804: e35c0000 cmp ip, #0 + 1f40808: 0a000012 beq 1f40858 + 1f4080c: e3a09001 mov r9, #1 + 1f40810: e1a0a000 mov sl, r0 + 1f40814: e081e009 add lr, r1, r9 + 1f40818: ea000002 b 1f40828 + 1f4081c: e4dec001 ldrb ip, [lr], #1 + 1f40820: e35c0000 cmp ip, #0 + 1f40824: 0a000009 beq 1f40850 + 1f40828: e15c0002 cmp ip, r2 + 1f4082c: 13a09000 movne r9, #0 + 1f40830: 02099001 andeq r9, r9, #1 + 1f40834: e5fa2001 ldrb r2, [sl, #1]! + 1f40838: e3520000 cmp r2, #0 + 1f4083c: e1a0400e mov r4, lr + 1f40840: 1afffff5 bne 1f4081c + 1f40844: e5d43000 ldrb r3, [r4] + 1f40848: e3530000 cmp r3, #0 + 1f4084c: 1a00001c bne 1f408c4 + 1f40850: e3590000 cmp r9, #0 + 1f40854: 0a000002 beq 1f40864 + 1f40858: e28dd01c add sp, sp, #28 + 1f4085c: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f40860: e12fff1e bx lr + 1f40864: e1a06001 mov r6, r1 + 1f40868: e1a05000 mov r5, r0 + 1f4086c: e5d11000 ldrb r1, [r1] + 1f40870: e2800001 add r0, r0, #1 + 1f40874: ebfffd06 bl 1f3fc94 + 1f40878: e0664004 rsb r4, r6, r4 + 1f4087c: e3540001 cmp r4, #1 + 1f40880: 13500000 cmpne r0, #0 + 1f40884: e1a07000 mov r7, r0 + 1f40888: 0afffff2 beq 1f40858 + 1f4088c: e0850004 add r0, r5, r4 + 1f40890: e1570000 cmp r7, r0 + 1f40894: 90678000 rsbls r8, r7, r0 + 1f40898: 83a08001 movhi r8, #1 + 1f4089c: e354001f cmp r4, #31 + 1f408a0: 9a00000b bls 1f408d4 + 1f408a4: e1a03004 mov r3, r4 + 1f408a8: e1a02006 mov r2, r6 + 1f408ac: e1a01008 mov r1, r8 + 1f408b0: e1a00007 mov r0, r7 + 1f408b4: ebfffee7 bl 1f40458 + 1f408b8: e28dd01c add sp, sp, #28 + 1f408bc: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f408c0: e12fff1e bx lr + 1f408c4: e3a00000 mov r0, #0 + 1f408c8: e28dd01c add sp, sp, #28 + 1f408cc: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f408d0: e12fff1e bx lr + 1f408d4: e28d2014 add r2, sp, #20 + 1f408d8: e1a01004 mov r1, r4 + 1f408dc: e1a00006 mov r0, r6 + 1f408e0: ebfffe95 bl 1f4033c + 1f408e4: e59d1014 ldr r1, [sp, #20] + 1f408e8: e1a02000 mov r2, r0 + 1f408ec: e1a09000 mov r9, r0 + 1f408f0: e0861001 add r1, r6, r1 + 1f408f4: e1a00006 mov r0, r6 + 1f408f8: ebfff914 bl 1f3ed50 + 1f408fc: e3500000 cmp r0, #0 + 1f40900: 0a00003f beq 1f40a04 + 1f40904: e0693004 rsb r3, r9, r4 + 1f40908: e1530009 cmp r3, r9 + 1f4090c: 31a03009 movcc r3, r9 + 1f40910: e2492001 sub r2, r9, #1 + 1f40914: e1a00008 mov r0, r8 + 1f40918: e3a05000 mov r5, #0 + 1f4091c: e1a08002 mov r8, r2 + 1f40920: e2833001 add r3, r3, #1 + 1f40924: e58d3014 str r3, [sp, #20] + 1f40928: e0863002 add r3, r6, r2 + 1f4092c: e58d3008 str r3, [sp, #8] + 1f40930: e2693001 rsb r3, r9, #1 + 1f40934: e58d3004 str r3, [sp, #4] + 1f40938: e086a009 add sl, r6, r9 + 1f4093c: e084b005 add fp, r4, r5 + 1f40940: e060200b rsb r2, r0, fp + 1f40944: e3a01000 mov r1, #0 + 1f40948: e0870000 add r0, r7, r0 + 1f4094c: eb001b13 bl 1f475a0 + 1f40950: e29b3000 adds r3, fp, #0 + 1f40954: 13a03001 movne r3, #1 + 1f40958: e3500000 cmp r0, #0 + 1f4095c: 13a03000 movne r3, #0 + 1f40960: e3530000 cmp r3, #0 + 1f40964: 0affffd6 beq 1f408c4 + 1f40968: e1540009 cmp r4, r9 + 1f4096c: 9a00000f bls 1f409b0 + 1f40970: e0891005 add r1, r9, r5 + 1f40974: e7d70001 ldrb r0, [r7, r1] + 1f40978: e5da2000 ldrb r2, [sl] + 1f4097c: e1500002 cmp r0, r2 + 1f40980: e0871001 add r1, r7, r1 + 1f40984: 1a000069 bne 1f40b30 + 1f40988: e1a0000a mov r0, sl + 1f4098c: e1a02009 mov r2, r9 + 1f40990: ea000003 b 1f409a4 + 1f40994: e5f0c001 ldrb ip, [r0, #1]! + 1f40998: e5f13001 ldrb r3, [r1, #1]! + 1f4099c: e15c0003 cmp ip, r3 + 1f409a0: 1a000063 bne 1f40b34 + 1f409a4: e2822001 add r2, r2, #1 + 1f409a8: e1540002 cmp r4, r2 + 1f409ac: 8afffff8 bhi 1f40994 + 1f409b0: e3780001 cmn r8, #1 + 1f409b4: 0a00000e beq 1f409f4 + 1f409b8: e59d3008 ldr r3, [sp, #8] + 1f409bc: e0851008 add r1, r5, r8 + 1f409c0: e7d70001 ldrb r0, [r7, r1] + 1f409c4: e5d32000 ldrb r2, [r3] + 1f409c8: e1500002 cmp r0, r2 + 1f409cc: e0871001 add r1, r7, r1 + 1f409d0: 1a00005c bne 1f40b48 + 1f409d4: e1a02003 mov r2, r3 + 1f409d8: ea000003 b 1f409ec + 1f409dc: e5720001 ldrb r0, [r2, #-1]! + 1f409e0: e5713001 ldrb r3, [r1, #-1]! + 1f409e4: e1500003 cmp r0, r3 + 1f409e8: 1a000056 bne 1f40b48 + 1f409ec: e1520006 cmp r2, r6 + 1f409f0: 1afffff9 bne 1f409dc + 1f409f4: e0870005 add r0, r7, r5 + 1f409f8: e28dd01c add sp, sp, #28 + 1f409fc: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f40a00: e12fff1e bx lr + 1f40a04: e1a0a000 mov sl, r0 + 1f40a08: e1a05000 mov r5, r0 + 1f40a0c: e1a00008 mov r0, r8 + 1f40a10: e2493001 sub r3, r9, #1 + 1f40a14: e58d3004 str r3, [sp, #4] + 1f40a18: e0863003 add r3, r6, r3 + 1f40a1c: e58d300c str r3, [sp, #12] + 1f40a20: e2693001 rsb r3, r9, #1 + 1f40a24: e58d3008 str r3, [sp, #8] + 1f40a28: e084b005 add fp, r4, r5 + 1f40a2c: e060200b rsb r2, r0, fp + 1f40a30: e3a01000 mov r1, #0 + 1f40a34: e0870000 add r0, r7, r0 + 1f40a38: eb001ad8 bl 1f475a0 + 1f40a3c: e29b3000 adds r3, fp, #0 + 1f40a40: 13a03001 movne r3, #1 + 1f40a44: e3500000 cmp r0, #0 + 1f40a48: 13a03000 movne r3, #0 + 1f40a4c: e3530000 cmp r3, #0 + 1f40a50: 0affff9b beq 1f408c4 + 1f40a54: e159000a cmp r9, sl + 1f40a58: 21a03009 movcs r3, r9 + 1f40a5c: 31a0300a movcc r3, sl + 1f40a60: e1540003 cmp r4, r3 + 1f40a64: 9a00000e bls 1f40aa4 + 1f40a68: e0832005 add r2, r3, r5 + 1f40a6c: e7d71002 ldrb r1, [r7, r2] + 1f40a70: e7d60003 ldrb r0, [r6, r3] + 1f40a74: e1500001 cmp r0, r1 + 1f40a78: e0872002 add r2, r7, r2 + 1f40a7c: e0861003 add r1, r6, r3 + 1f40a80: 0a000004 beq 1f40a98 + 1f40a84: ea000024 b 1f40b1c + 1f40a88: e5f1c001 ldrb ip, [r1, #1]! + 1f40a8c: e5f20001 ldrb r0, [r2, #1]! + 1f40a90: e15c0000 cmp ip, r0 + 1f40a94: 1a000020 bne 1f40b1c + 1f40a98: e2833001 add r3, r3, #1 + 1f40a9c: e1540003 cmp r4, r3 + 1f40aa0: 8afffff8 bhi 1f40a88 + 1f40aa4: e59d3004 ldr r3, [sp, #4] + 1f40aa8: e159000a cmp r9, sl + 1f40aac: e1a01003 mov r1, r3 + 1f40ab0: 9a00002a bls 1f40b60 + 1f40ab4: e59dc00c ldr ip, [sp, #12] + 1f40ab8: e0852003 add r2, r5, r3 + 1f40abc: e7d70002 ldrb r0, [r7, r2] + 1f40ac0: e5dc3000 ldrb r3, [ip] + 1f40ac4: e1500003 cmp r0, r3 + 1f40ac8: e0872002 add r2, r7, r2 + 1f40acc: 1a000023 bne 1f40b60 + 1f40ad0: e1a0300c mov r3, ip + 1f40ad4: e086800a add r8, r6, sl + 1f40ad8: ea000004 b 1f40af0 + 1f40adc: e573e001 ldrb lr, [r3, #-1]! + 1f40ae0: e572c001 ldrb ip, [r2, #-1]! + 1f40ae4: e15e000c cmp lr, ip + 1f40ae8: 1a000003 bne 1f40afc + 1f40aec: e1a01000 mov r1, r0 + 1f40af0: e1530008 cmp r3, r8 + 1f40af4: e2410001 sub r0, r1, #1 + 1f40af8: 1afffff7 bne 1f40adc + 1f40afc: e28aa001 add sl, sl, #1 + 1f40b00: e15a0001 cmp sl, r1 + 1f40b04: 8affffba bhi 1f409f4 + 1f40b08: e59da014 ldr sl, [sp, #20] + 1f40b0c: e085500a add r5, r5, sl + 1f40b10: e06aa004 rsb sl, sl, r4 + 1f40b14: e1a0000b mov r0, fp + 1f40b18: eaffffc2 b 1f40a28 + 1f40b1c: e59d2008 ldr r2, [sp, #8] + 1f40b20: e0825005 add r5, r2, r5 + 1f40b24: e0855003 add r5, r5, r3 + 1f40b28: e3a0a000 mov sl, #0 + 1f40b2c: eafffff8 b 1f40b14 + 1f40b30: e1a02009 mov r2, r9 + 1f40b34: e59d3004 ldr r3, [sp, #4] + 1f40b38: e0835005 add r5, r3, r5 + 1f40b3c: e0855002 add r5, r5, r2 + 1f40b40: e1a0000b mov r0, fp + 1f40b44: eaffff7c b 1f4093c + 1f40b48: e59d2014 ldr r2, [sp, #20] + 1f40b4c: e0855002 add r5, r5, r2 + 1f40b50: eafffffa b 1f40b40 + 1f40b54: e1a04001 mov r4, r1 + 1f40b58: e3a09001 mov r9, #1 + 1f40b5c: eaffff38 b 1f40844 + 1f40b60: e1a01009 mov r1, r9 + 1f40b64: eaffffe4 b 1f40afc + +01f40b68 <_svfprintf_r>: + 1f40b68: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f40b6c: ed2d8b06 vpush {d8-d10} + 1f40b70: e24dd0f4 sub sp, sp, #244 ; 0xf4 + 1f40b74: e1a04001 mov r4, r1 + 1f40b78: e58d1018 str r1, [sp, #24] + 1f40b7c: e1a0a002 mov sl, r2 + 1f40b80: e58d302c str r3, [sp, #44] ; 0x2c + 1f40b84: e58d001c str r0, [sp, #28] + 1f40b88: eb001a19 bl 1f473f4 <_localeconv_r> + 1f40b8c: e5903000 ldr r3, [r0] + 1f40b90: e1a00003 mov r0, r3 + 1f40b94: e58d304c str r3, [sp, #76] ; 0x4c + 1f40b98: ebfffd5c bl 1f40110 + 1f40b9c: e1d430bc ldrh r3, [r4, #12] + 1f40ba0: e3130080 tst r3, #128 ; 0x80 + 1f40ba4: e58d0048 str r0, [sp, #72] ; 0x48 + 1f40ba8: 0a000002 beq 1f40bb8 <_svfprintf_r+0x50> + 1f40bac: e5943010 ldr r3, [r4, #16] + 1f40bb0: e3530000 cmp r3, #0 + 1f40bb4: 0a00071c beq 1f4282c <_svfprintf_r+0x1cc4> + 1f40bb8: e3a03000 mov r3, #0 + 1f40bbc: e28db0b0 add fp, sp, #176 ; 0xb0 + 1f40bc0: e1a0800b mov r8, fp + 1f40bc4: ed9f8bcb vldr d8, [pc, #812] ; 1f40ef8 <_svfprintf_r+0x390> + 1f40bc8: ed9f9bcc vldr d9, [pc, #816] ; 1f40f00 <_svfprintf_r+0x398> + 1f40bcc: e58d3040 str r3, [sp, #64] ; 0x40 + 1f40bd0: e58d3054 str r3, [sp, #84] ; 0x54 + 1f40bd4: e58d3020 str r3, [sp, #32] + 1f40bd8: e58d3084 str r3, [sp, #132] ; 0x84 + 1f40bdc: e58d3080 str r3, [sp, #128] ; 0x80 + 1f40be0: e58db07c str fp, [sp, #124] ; 0x7c + 1f40be4: e59f9334 ldr r9, [pc, #820] ; 1f40f20 <_svfprintf_r+0x3b8> + 1f40be8: e5da3000 ldrb r3, [sl] + 1f40bec: e3530000 cmp r3, #0 + 1f40bf0: 13530025 cmpne r3, #37 ; 0x25 + 1f40bf4: e1a0400a mov r4, sl + 1f40bf8: 0a000013 beq 1f40c4c <_svfprintf_r+0xe4> + 1f40bfc: e5f43001 ldrb r3, [r4, #1]! + 1f40c00: e3530000 cmp r3, #0 + 1f40c04: 13530025 cmpne r3, #37 ; 0x25 + 1f40c08: 1afffffb bne 1f40bfc <_svfprintf_r+0x94> + 1f40c0c: e054500a subs r5, r4, sl + 1f40c10: 0a00000d beq 1f40c4c <_svfprintf_r+0xe4> + 1f40c14: e59d3080 ldr r3, [sp, #128] ; 0x80 + 1f40c18: e59d2084 ldr r2, [sp, #132] ; 0x84 + 1f40c1c: e2833001 add r3, r3, #1 + 1f40c20: e3530007 cmp r3, #7 + 1f40c24: e0822005 add r2, r2, r5 + 1f40c28: e588a000 str sl, [r8] + 1f40c2c: e5885004 str r5, [r8, #4] + 1f40c30: e58d3080 str r3, [sp, #128] ; 0x80 + 1f40c34: e58d2084 str r2, [sp, #132] ; 0x84 + 1f40c38: d2888008 addle r8, r8, #8 + 1f40c3c: ca00007b bgt 1f40e30 <_svfprintf_r+0x2c8> + 1f40c40: e59d3020 ldr r3, [sp, #32] + 1f40c44: e0833005 add r3, r3, r5 + 1f40c48: e58d3020 str r3, [sp, #32] + 1f40c4c: e5d43000 ldrb r3, [r4] + 1f40c50: e3530000 cmp r3, #0 + 1f40c54: 0a00007d beq 1f40e50 <_svfprintf_r+0x2e8> + 1f40c58: e3a03000 mov r3, #0 + 1f40c5c: e1a02003 mov r2, r3 + 1f40c60: e5cd305f strb r3, [sp, #95] ; 0x5f + 1f40c64: e1a00003 mov r0, r3 + 1f40c68: e58d3024 str r3, [sp, #36] ; 0x24 + 1f40c6c: e1a05003 mov r5, r3 + 1f40c70: e5d43001 ldrb r3, [r4, #1] + 1f40c74: e284a001 add sl, r4, #1 + 1f40c78: e3e01000 mvn r1, #0 + 1f40c7c: e58d1014 str r1, [sp, #20] + 1f40c80: e1a06003 mov r6, r3 + 1f40c84: e28aa001 add sl, sl, #1 + 1f40c88: e2463020 sub r3, r6, #32 + 1f40c8c: e3530058 cmp r3, #88 ; 0x58 + 1f40c90: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f40c94: ea000286 b 1f416b4 <_svfprintf_r+0xb4c> + 1f40c98: 01f416a0 .word 0x01f416a0 + 1f40c9c: 01f416b4 .word 0x01f416b4 + 1f40ca0: 01f416b4 .word 0x01f416b4 + 1f40ca4: 01f415b8 .word 0x01f415b8 + 1f40ca8: 01f416b4 .word 0x01f416b4 + 1f40cac: 01f416b4 .word 0x01f416b4 + 1f40cb0: 01f416b4 .word 0x01f416b4 + 1f40cb4: 01f416b4 .word 0x01f416b4 + 1f40cb8: 01f416b4 .word 0x01f416b4 + 1f40cbc: 01f416b4 .word 0x01f416b4 + 1f40cc0: 01f40dfc .word 0x01f40dfc + 1f40cc4: 01f40e8c .word 0x01f40e8c + 1f40cc8: 01f416b4 .word 0x01f416b4 + 1f40ccc: 01f40e24 .word 0x01f40e24 + 1f40cd0: 01f40e9c .word 0x01f40e9c + 1f40cd4: 01f416b4 .word 0x01f416b4 + 1f40cd8: 01f40eec .word 0x01f40eec + 1f40cdc: 01f41178 .word 0x01f41178 + 1f40ce0: 01f41178 .word 0x01f41178 + 1f40ce4: 01f41178 .word 0x01f41178 + 1f40ce8: 01f41178 .word 0x01f41178 + 1f40cec: 01f41178 .word 0x01f41178 + 1f40cf0: 01f41178 .word 0x01f41178 + 1f40cf4: 01f41178 .word 0x01f41178 + 1f40cf8: 01f41178 .word 0x01f41178 + 1f40cfc: 01f41178 .word 0x01f41178 + 1f40d00: 01f416b4 .word 0x01f416b4 + 1f40d04: 01f416b4 .word 0x01f416b4 + 1f40d08: 01f416b4 .word 0x01f416b4 + 1f40d0c: 01f416b4 .word 0x01f416b4 + 1f40d10: 01f416b4 .word 0x01f416b4 + 1f40d14: 01f416b4 .word 0x01f416b4 + 1f40d18: 01f416b4 .word 0x01f416b4 + 1f40d1c: 01f416b4 .word 0x01f416b4 + 1f40d20: 01f416b4 .word 0x01f416b4 + 1f40d24: 01f416b4 .word 0x01f416b4 + 1f40d28: 01f40f24 .word 0x01f40f24 + 1f40d2c: 01f410dc .word 0x01f410dc + 1f40d30: 01f416b4 .word 0x01f416b4 + 1f40d34: 01f410dc .word 0x01f410dc + 1f40d38: 01f416b4 .word 0x01f416b4 + 1f40d3c: 01f416b4 .word 0x01f416b4 + 1f40d40: 01f416b4 .word 0x01f416b4 + 1f40d44: 01f416b4 .word 0x01f416b4 + 1f40d48: 01f4116c .word 0x01f4116c + 1f40d4c: 01f416b4 .word 0x01f416b4 + 1f40d50: 01f416b4 .word 0x01f416b4 + 1f40d54: 01f411a4 .word 0x01f411a4 + 1f40d58: 01f416b4 .word 0x01f416b4 + 1f40d5c: 01f416b4 .word 0x01f416b4 + 1f40d60: 01f416b4 .word 0x01f416b4 + 1f40d64: 01f416b4 .word 0x01f416b4 + 1f40d68: 01f416b4 .word 0x01f416b4 + 1f40d6c: 01f41258 .word 0x01f41258 + 1f40d70: 01f416b4 .word 0x01f416b4 + 1f40d74: 01f416b4 .word 0x01f416b4 + 1f40d78: 01f4151c .word 0x01f4151c + 1f40d7c: 01f416b4 .word 0x01f416b4 + 1f40d80: 01f416b4 .word 0x01f416b4 + 1f40d84: 01f416b4 .word 0x01f416b4 + 1f40d88: 01f416b4 .word 0x01f416b4 + 1f40d8c: 01f416b4 .word 0x01f416b4 + 1f40d90: 01f416b4 .word 0x01f416b4 + 1f40d94: 01f416b4 .word 0x01f416b4 + 1f40d98: 01f416b4 .word 0x01f416b4 + 1f40d9c: 01f416b4 .word 0x01f416b4 + 1f40da0: 01f416b4 .word 0x01f416b4 + 1f40da4: 01f41448 .word 0x01f41448 + 1f40da8: 01f4148c .word 0x01f4148c + 1f40dac: 01f410dc .word 0x01f410dc + 1f40db0: 01f410dc .word 0x01f410dc + 1f40db4: 01f410dc .word 0x01f410dc + 1f40db8: 01f41380 .word 0x01f41380 + 1f40dbc: 01f4148c .word 0x01f4148c + 1f40dc0: 01f416b4 .word 0x01f416b4 + 1f40dc4: 01f416b4 .word 0x01f416b4 + 1f40dc8: 01f4138c .word 0x01f4138c + 1f40dcc: 01f416b4 .word 0x01f416b4 + 1f40dd0: 01f413a8 .word 0x01f413a8 + 1f40dd4: 01f413d8 .word 0x01f413d8 + 1f40dd8: 01f412c8 .word 0x01f412c8 + 1f40ddc: 01f41374 .word 0x01f41374 + 1f40de0: 01f416b4 .word 0x01f416b4 + 1f40de4: 01f415c4 .word 0x01f415c4 + 1f40de8: 01f416b4 .word 0x01f416b4 + 1f40dec: 01f41630 .word 0x01f41630 + 1f40df0: 01f416b4 .word 0x01f416b4 + 1f40df4: 01f416b4 .word 0x01f416b4 + 1f40df8: 01f41584 .word 0x01f41584 + 1f40dfc: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f40e00: e5931000 ldr r1, [r3] + 1f40e04: e2833004 add r3, r3, #4 + 1f40e08: e3510000 cmp r1, #0 + 1f40e0c: e58d1024 str r1, [sp, #36] ; 0x24 + 1f40e10: e58d302c str r3, [sp, #44] ; 0x2c + 1f40e14: aa000003 bge 1f40e28 <_svfprintf_r+0x2c0> + 1f40e18: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f40e1c: e2633000 rsb r3, r3, #0 + 1f40e20: e58d3024 str r3, [sp, #36] ; 0x24 + 1f40e24: e3855004 orr r5, r5, #4 + 1f40e28: e5da3000 ldrb r3, [sl] + 1f40e2c: eaffff93 b 1f40c80 <_svfprintf_r+0x118> + 1f40e30: e28d207c add r2, sp, #124 ; 0x7c + 1f40e34: e59d1018 ldr r1, [sp, #24] + 1f40e38: e59d001c ldr r0, [sp, #28] + 1f40e3c: eb001db8 bl 1f48524 <__ssprint_r> + 1f40e40: e3500000 cmp r0, #0 + 1f40e44: 1a000007 bne 1f40e68 <_svfprintf_r+0x300> + 1f40e48: e1a0800b mov r8, fp + 1f40e4c: eaffff7b b 1f40c40 <_svfprintf_r+0xd8> + 1f40e50: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f40e54: e3530000 cmp r3, #0 + 1f40e58: 159d001c ldrne r0, [sp, #28] + 1f40e5c: 128d207c addne r2, sp, #124 ; 0x7c + 1f40e60: 159d1018 ldrne r1, [sp, #24] + 1f40e64: 1b001dae blne 1f48524 <__ssprint_r> + 1f40e68: e59d3018 ldr r3, [sp, #24] + 1f40e6c: e1d330bc ldrh r3, [r3, #12] + 1f40e70: e3130040 tst r3, #64 ; 0x40 + 1f40e74: e59d0020 ldr r0, [sp, #32] + 1f40e78: 13e00000 mvnne r0, #0 + 1f40e7c: e28dd0f4 add sp, sp, #244 ; 0xf4 + 1f40e80: ecbd8b06 vpop {d8-d10} + 1f40e84: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f40e88: e12fff1e bx lr + 1f40e8c: e5da3000 ldrb r3, [sl] + 1f40e90: e3a02001 mov r2, #1 + 1f40e94: e3a0002b mov r0, #43 ; 0x2b + 1f40e98: eaffff78 b 1f40c80 <_svfprintf_r+0x118> + 1f40e9c: e5da6000 ldrb r6, [sl] + 1f40ea0: e356002a cmp r6, #42 ; 0x2a + 1f40ea4: e28a1001 add r1, sl, #1 + 1f40ea8: 0a0007ad beq 1f42d64 <_svfprintf_r+0x21fc> + 1f40eac: e2463030 sub r3, r6, #48 ; 0x30 + 1f40eb0: e3530009 cmp r3, #9 + 1f40eb4: 83a03000 movhi r3, #0 + 1f40eb8: e1a0a001 mov sl, r1 + 1f40ebc: 858d3014 strhi r3, [sp, #20] + 1f40ec0: 8affff70 bhi 1f40c88 <_svfprintf_r+0x120> + 1f40ec4: e3a01000 mov r1, #0 + 1f40ec8: e4da6001 ldrb r6, [sl], #1 + 1f40ecc: e0811101 add r1, r1, r1, lsl #2 + 1f40ed0: e0831081 add r1, r3, r1, lsl #1 + 1f40ed4: e2463030 sub r3, r6, #48 ; 0x30 + 1f40ed8: e3530009 cmp r3, #9 + 1f40edc: 9afffff9 bls 1f40ec8 <_svfprintf_r+0x360> + 1f40ee0: e1813fc1 orr r3, r1, r1, asr #31 + 1f40ee4: e58d3014 str r3, [sp, #20] + 1f40ee8: eaffff66 b 1f40c88 <_svfprintf_r+0x120> + 1f40eec: e3855080 orr r5, r5, #128 ; 0x80 + 1f40ef0: e5da3000 ldrb r3, [sl] + 1f40ef4: eaffff61 b 1f40c80 <_svfprintf_r+0x118> + ... + 1f40f00: ffffffff .word 0xffffffff + 1f40f04: 7fefffff .word 0x7fefffff + 1f40f08: 01f62ee8 .word 0x01f62ee8 + 1f40f0c: 01f62eec .word 0x01f62eec + 1f40f10: 01f62ef8 .word 0x01f62ef8 + 1f40f14: 01f62f0c .word 0x01f62f0c + 1f40f18: 01f62ed8 .word 0x01f62ed8 + 1f40f1c: 01f63698 .word 0x01f63698 + 1f40f20: 01f62f28 .word 0x01f62f28 + 1f40f24: e3520000 cmp r2, #0 + 1f40f28: e3855010 orr r5, r5, #16 + 1f40f2c: 15cd005f strbne r0, [sp, #95] ; 0x5f + 1f40f30: e3150020 tst r5, #32 + 1f40f34: 0a000158 beq 1f4149c <_svfprintf_r+0x934> + 1f40f38: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f40f3c: e2834007 add r4, r3, #7 + 1f40f40: e3c44007 bic r4, r4, #7 + 1f40f44: e894000c ldm r4, {r2, r3} + 1f40f48: e3520000 cmp r2, #0 + 1f40f4c: e2841008 add r1, r4, #8 + 1f40f50: e58d2008 str r2, [sp, #8] + 1f40f54: e58d300c str r3, [sp, #12] + 1f40f58: e2d33000 sbcs r3, r3, #0 + 1f40f5c: e58d102c str r1, [sp, #44] ; 0x2c + 1f40f60: ba00015f blt 1f414e4 <_svfprintf_r+0x97c> + 1f40f64: e59d2014 ldr r2, [sp, #20] + 1f40f68: e3520000 cmp r2, #0 + 1f40f6c: ba0003c4 blt 1f41e84 <_svfprintf_r+0x131c> + 1f40f70: e28d4008 add r4, sp, #8 + 1f40f74: e8940018 ldm r4, {r3, r4} + 1f40f78: e1a01003 mov r1, r3 + 1f40f7c: e1813004 orr r3, r1, r4 + 1f40f80: e3530000 cmp r3, #0 + 1f40f84: 03520000 cmpeq r2, #0 + 1f40f88: e3c55080 bic r5, r5, #128 ; 0x80 + 1f40f8c: 1a0003bc bne 1f41e84 <_svfprintf_r+0x131c> + 1f40f90: e5dd705f ldrb r7, [sp, #95] ; 0x5f + 1f40f94: e3a03000 mov r3, #0 + 1f40f98: e58db030 str fp, [sp, #48] ; 0x30 + 1f40f9c: e58d3014 str r3, [sp, #20] + 1f40fa0: e58d3028 str r3, [sp, #40] ; 0x28 + 1f40fa4: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f40fa8: e59d2014 ldr r2, [sp, #20] + 1f40fac: e1530002 cmp r3, r2 + 1f40fb0: b1a03002 movlt r3, r2 + 1f40fb4: e58d3008 str r3, [sp, #8] + 1f40fb8: e3a03000 mov r3, #0 + 1f40fbc: e58d303c str r3, [sp, #60] ; 0x3c + 1f40fc0: e3570000 cmp r7, #0 + 1f40fc4: 0a000002 beq 1f40fd4 <_svfprintf_r+0x46c> + 1f40fc8: e59d3008 ldr r3, [sp, #8] + 1f40fcc: e2833001 add r3, r3, #1 + 1f40fd0: e58d3008 str r3, [sp, #8] + 1f40fd4: e2153002 ands r3, r5, #2 + 1f40fd8: e58d3034 str r3, [sp, #52] ; 0x34 + 1f40fdc: 159d3008 ldrne r3, [sp, #8] + 1f40fe0: 12833002 addne r3, r3, #2 + 1f40fe4: 158d3008 strne r3, [sp, #8] + 1f40fe8: e2153084 ands r3, r5, #132 ; 0x84 + 1f40fec: e58d3038 str r3, [sp, #56] ; 0x38 + 1f40ff0: 1a0001c4 bne 1f41708 <_svfprintf_r+0xba0> + 1f40ff4: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f40ff8: e59d2008 ldr r2, [sp, #8] + 1f40ffc: e0624003 rsb r4, r2, r3 + 1f41000: e3540000 cmp r4, #0 + 1f41004: da0001bf ble 1f41708 <_svfprintf_r+0xba0> + 1f41008: e3540010 cmp r4, #16 + 1f4100c: da00068a ble 1f42a3c <_svfprintf_r+0x1ed4> + 1f41010: e51f3100 ldr r3, [pc, #-256] ; 1f40f18 <_svfprintf_r+0x3b0> + 1f41014: e58d6050 str r6, [sp, #80] ; 0x50 + 1f41018: e1a00008 mov r0, r8 + 1f4101c: e1a06004 mov r6, r4 + 1f41020: e1a08005 mov r8, r5 + 1f41024: e3a07010 mov r7, #16 + 1f41028: e59d1084 ldr r1, [sp, #132] ; 0x84 + 1f4102c: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f41030: e58d3044 str r3, [sp, #68] ; 0x44 + 1f41034: e59d401c ldr r4, [sp, #28] + 1f41038: e59d5018 ldr r5, [sp, #24] + 1f4103c: ea000002 b 1f4104c <_svfprintf_r+0x4e4> + 1f41040: e2466010 sub r6, r6, #16 + 1f41044: e3560010 cmp r6, #16 + 1f41048: da000014 ble 1f410a0 <_svfprintf_r+0x538> + 1f4104c: e2822001 add r2, r2, #1 + 1f41050: e51f3140 ldr r3, [pc, #-320] ; 1f40f18 <_svfprintf_r+0x3b0> + 1f41054: e3520007 cmp r2, #7 + 1f41058: e2811010 add r1, r1, #16 + 1f4105c: e8800088 stm r0, {r3, r7} + 1f41060: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41064: e58d1084 str r1, [sp, #132] ; 0x84 + 1f41068: d2800008 addle r0, r0, #8 + 1f4106c: dafffff3 ble 1f41040 <_svfprintf_r+0x4d8> + 1f41070: e28d207c add r2, sp, #124 ; 0x7c + 1f41074: e1a01005 mov r1, r5 + 1f41078: e1a00004 mov r0, r4 + 1f4107c: eb001d28 bl 1f48524 <__ssprint_r> + 1f41080: e3500000 cmp r0, #0 + 1f41084: 1affff77 bne 1f40e68 <_svfprintf_r+0x300> + 1f41088: e2466010 sub r6, r6, #16 + 1f4108c: e3560010 cmp r6, #16 + 1f41090: e1a0000b mov r0, fp + 1f41094: e59d1084 ldr r1, [sp, #132] ; 0x84 + 1f41098: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f4109c: caffffea bgt 1f4104c <_svfprintf_r+0x4e4> + 1f410a0: e1a05008 mov r5, r8 + 1f410a4: e1a08000 mov r8, r0 + 1f410a8: e1a04006 mov r4, r6 + 1f410ac: e59d6050 ldr r6, [sp, #80] ; 0x50 + 1f410b0: e2822001 add r2, r2, #1 + 1f410b4: e3520007 cmp r2, #7 + 1f410b8: e58d2080 str r2, [sp, #128] ; 0x80 + 1f410bc: e59d2044 ldr r2, [sp, #68] ; 0x44 + 1f410c0: e0843001 add r3, r4, r1 + 1f410c4: e58d3084 str r3, [sp, #132] ; 0x84 + 1f410c8: e8880014 stm r8, {r2, r4} + 1f410cc: ca000185 bgt 1f416e8 <_svfprintf_r+0xb80> + 1f410d0: e2888008 add r8, r8, #8 + 1f410d4: e5dd705f ldrb r7, [sp, #95] ; 0x5f + 1f410d8: ea00018b b 1f4170c <_svfprintf_r+0xba4> + 1f410dc: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f410e0: e3520000 cmp r2, #0 + 1f410e4: e2834007 add r4, r3, #7 + 1f410e8: 15cd005f strbne r0, [sp, #95] ; 0x5f + 1f410ec: e3150008 tst r5, #8 + 1f410f0: 13c43007 bicne r3, r4, #7 + 1f410f4: 03c44007 biceq r4, r4, #7 + 1f410f8: 1d938b00 vldrne d8, [r3] + 1f410fc: 0d948b00 vldreq d8, [r4] + 1f41100: eeb07bc8 vabs.f64 d7, d8 + 1f41104: eeb47b49 vcmp.f64 d7, d9 + 1f41108: 12832008 addne r2, r3, #8 + 1f4110c: 02843008 addeq r3, r4, #8 + 1f41110: 158d202c strne r2, [sp, #44] ; 0x2c + 1f41114: 058d302c streq r3, [sp, #44] ; 0x2c + 1f41118: eef1fa10 vmrs APSR_nzcv, fpscr + 1f4111c: da000483 ble 1f42330 <_svfprintf_r+0x17c8> + 1f41120: eeb58bc0 vcmpe.f64 d8, #0.0 + 1f41124: eef1fa10 vmrs APSR_nzcv, fpscr + 1f41128: 4a00066c bmi 1f42ae0 <_svfprintf_r+0x1f78> + 1f4112c: e5dd705f ldrb r7, [sp, #95] ; 0x5f + 1f41130: e3a03003 mov r3, #3 + 1f41134: e1a01003 mov r1, r3 + 1f41138: e58d3008 str r3, [sp, #8] + 1f4113c: e3a03000 mov r3, #0 + 1f41140: e1a00003 mov r0, r3 + 1f41144: e58d3014 str r3, [sp, #20] + 1f41148: e51f3248 ldr r3, [pc, #-584] ; 1f40f08 <_svfprintf_r+0x3a0> + 1f4114c: e3560047 cmp r6, #71 ; 0x47 + 1f41150: e51f224c ldr r2, [pc, #-588] ; 1f40f0c <_svfprintf_r+0x3a4> + 1f41154: d1a02003 movle r2, r3 + 1f41158: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4115c: e58d1028 str r1, [sp, #40] ; 0x28 + 1f41160: e58d003c str r0, [sp, #60] ; 0x3c + 1f41164: e58d2030 str r2, [sp, #48] ; 0x30 + 1f41168: eaffff94 b 1f40fc0 <_svfprintf_r+0x458> + 1f4116c: e3855008 orr r5, r5, #8 + 1f41170: e5da3000 ldrb r3, [sl] + 1f41174: eafffec1 b 1f40c80 <_svfprintf_r+0x118> + 1f41178: e3a03000 mov r3, #0 + 1f4117c: e1a01003 mov r1, r3 + 1f41180: e2463030 sub r3, r6, #48 ; 0x30 + 1f41184: e4da6001 ldrb r6, [sl], #1 + 1f41188: e0811101 add r1, r1, r1, lsl #2 + 1f4118c: e0831081 add r1, r3, r1, lsl #1 + 1f41190: e2463030 sub r3, r6, #48 ; 0x30 + 1f41194: e3530009 cmp r3, #9 + 1f41198: 9afffff9 bls 1f41184 <_svfprintf_r+0x61c> + 1f4119c: e58d1024 str r1, [sp, #36] ; 0x24 + 1f411a0: eafffeb8 b 1f40c88 <_svfprintf_r+0x120> + 1f411a4: e3520000 cmp r2, #0 + 1f411a8: e3855010 orr r5, r5, #16 + 1f411ac: 15cd005f strbne r0, [sp, #95] ; 0x5f + 1f411b0: e2153020 ands r3, r5, #32 + 1f411b4: 0a00008b beq 1f413e8 <_svfprintf_r+0x880> + 1f411b8: e3a01000 mov r1, #0 + 1f411bc: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f411c0: e59d0014 ldr r0, [sp, #20] + 1f411c4: e2834007 add r4, r3, #7 + 1f411c8: e3c43007 bic r3, r4, #7 + 1f411cc: e2832008 add r2, r3, #8 + 1f411d0: e1500001 cmp r0, r1 + 1f411d4: e58d202c str r2, [sp, #44] ; 0x2c + 1f411d8: e5cd105f strb r1, [sp, #95] ; 0x5f + 1f411dc: e893000c ldm r3, {r2, r3} + 1f411e0: ba000004 blt 1f411f8 <_svfprintf_r+0x690> + 1f411e4: e1821003 orr r1, r2, r3 + 1f411e8: e3510000 cmp r1, #0 + 1f411ec: 03500000 cmpeq r0, #0 + 1f411f0: e3c55080 bic r5, r5, #128 ; 0x80 + 1f411f4: 0a00008d beq 1f41430 <_svfprintf_r+0x8c8> + 1f411f8: e1a0000b mov r0, fp + 1f411fc: e1a0c1a2 lsr ip, r2, #3 + 1f41200: e18cce83 orr ip, ip, r3, lsl #29 + 1f41204: e1a0e1a3 lsr lr, r3, #3 + 1f41208: e2021007 and r1, r2, #7 + 1f4120c: e1a0300e mov r3, lr + 1f41210: e1a0200c mov r2, ip + 1f41214: e2811030 add r1, r1, #48 ; 0x30 + 1f41218: e192c003 orrs ip, r2, r3 + 1f4121c: e5601001 strb r1, [r0, #-1]! + 1f41220: 1afffff5 bne 1f411fc <_svfprintf_r+0x694> + 1f41224: e3510030 cmp r1, #48 ; 0x30 + 1f41228: 03a03000 moveq r3, #0 + 1f4122c: 12053001 andne r3, r5, #1 + 1f41230: e3530000 cmp r3, #0 + 1f41234: 0a000546 beq 1f42754 <_svfprintf_r+0x1bec> + 1f41238: e3a03030 mov r3, #48 ; 0x30 + 1f4123c: e2402001 sub r2, r0, #1 + 1f41240: e5403001 strb r3, [r0, #-1] + 1f41244: e062300b rsb r3, r2, fp + 1f41248: e58d2030 str r2, [sp, #48] ; 0x30 + 1f4124c: e58d3028 str r3, [sp, #40] ; 0x28 + 1f41250: e3a07000 mov r7, #0 + 1f41254: eaffff52 b 1f40fa4 <_svfprintf_r+0x43c> + 1f41258: e3520000 cmp r2, #0 + 1f4125c: e3855010 orr r5, r5, #16 + 1f41260: 15cd005f strbne r0, [sp, #95] ; 0x5f + 1f41264: e2153020 ands r3, r5, #32 + 1f41268: 0a0000f4 beq 1f41640 <_svfprintf_r+0xad8> + 1f4126c: e3a02000 mov r2, #0 + 1f41270: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f41274: e2834007 add r4, r3, #7 + 1f41278: e3c43007 bic r3, r4, #7 + 1f4127c: e59d1014 ldr r1, [sp, #20] + 1f41280: e2830008 add r0, r3, #8 + 1f41284: e8930018 ldm r3, {r3, r4} + 1f41288: e1510002 cmp r1, r2 + 1f4128c: e58d002c str r0, [sp, #44] ; 0x2c + 1f41290: e58d3008 str r3, [sp, #8] + 1f41294: e58d400c str r4, [sp, #12] + 1f41298: e5cd205f strb r2, [sp, #95] ; 0x5f + 1f4129c: ba000364 blt 1f42034 <_svfprintf_r+0x14cc> + 1f412a0: e1a00003 mov r0, r3 + 1f412a4: e1803004 orr r3, r0, r4 + 1f412a8: e1530002 cmp r3, r2 + 1f412ac: 01510002 cmpeq r1, r2 + 1f412b0: e3c55080 bic r5, r5, #128 ; 0x80 + 1f412b4: 13a03001 movne r3, #1 + 1f412b8: 03a03000 moveq r3, #0 + 1f412bc: 1a00035c bne 1f42034 <_svfprintf_r+0x14cc> + 1f412c0: e1a07003 mov r7, r3 + 1f412c4: eaffff32 b 1f40f94 <_svfprintf_r+0x42c> + 1f412c8: e3a03000 mov r3, #0 + 1f412cc: e3a01030 mov r1, #48 ; 0x30 + 1f412d0: e3a00078 mov r0, #120 ; 0x78 + 1f412d4: e59de014 ldr lr, [sp, #20] + 1f412d8: e59dc02c ldr ip, [sp, #44] ; 0x2c + 1f412dc: e15e0003 cmp lr, r3 + 1f412e0: e5cd305f strb r3, [sp, #95] ; 0x5f + 1f412e4: e59c2000 ldr r2, [ip] + 1f412e8: e5cd1060 strb r1, [sp, #96] ; 0x60 + 1f412ec: e5cd0061 strb r0, [sp, #97] ; 0x61 + 1f412f0: e28c4004 add r4, ip, #4 + 1f412f4: e3a03000 mov r3, #0 + 1f412f8: ba00051a blt 1f42768 <_svfprintf_r+0x1c00> + 1f412fc: e59dc014 ldr ip, [sp, #20] + 1f41300: e1821003 orr r1, r2, r3 + 1f41304: e3510000 cmp r1, #0 + 1f41308: 035c0000 cmpeq ip, #0 + 1f4130c: 03a0c000 moveq ip, #0 + 1f41310: e3c51080 bic r1, r5, #128 ; 0x80 + 1f41314: e58d402c str r4, [sp, #44] ; 0x2c + 1f41318: 13a0c001 movne ip, #1 + 1f4131c: e3815002 orr r5, r1, #2 + 1f41320: 01a0700c moveq r7, ip + 1f41324: 01a06000 moveq r6, r0 + 1f41328: 0affff19 beq 1f40f94 <_svfprintf_r+0x42c> + 1f4132c: e1a06000 mov r6, r0 + 1f41330: e51fc424 ldr ip, [pc, #-1060] ; 1f40f14 <_svfprintf_r+0x3ac> + 1f41334: e1a0000b mov r0, fp + 1f41338: e1a01222 lsr r1, r2, #4 + 1f4133c: e1811e03 orr r1, r1, r3, lsl #28 + 1f41340: e1a04223 lsr r4, r3, #4 + 1f41344: e202e00f and lr, r2, #15 + 1f41348: e1a03004 mov r3, r4 + 1f4134c: e1a02001 mov r2, r1 + 1f41350: e7dc100e ldrb r1, [ip, lr] + 1f41354: e192e003 orrs lr, r2, r3 + 1f41358: e5601001 strb r1, [r0, #-1]! + 1f4135c: 1afffff5 bne 1f41338 <_svfprintf_r+0x7d0> + 1f41360: e060300b rsb r3, r0, fp + 1f41364: e58d0030 str r0, [sp, #48] ; 0x30 + 1f41368: e58d3028 str r3, [sp, #40] ; 0x28 + 1f4136c: e3a07000 mov r7, #0 + 1f41370: eaffff0b b 1f40fa4 <_svfprintf_r+0x43c> + 1f41374: e3855020 orr r5, r5, #32 + 1f41378: e5da3000 ldrb r3, [sl] + 1f4137c: eafffe3f b 1f40c80 <_svfprintf_r+0x118> + 1f41380: e3855040 orr r5, r5, #64 ; 0x40 + 1f41384: e5da3000 ldrb r3, [sl] + 1f41388: eafffe3c b 1f40c80 <_svfprintf_r+0x118> + 1f4138c: e5da3000 ldrb r3, [sl] + 1f41390: e353006c cmp r3, #108 ; 0x6c + 1f41394: 05da3001 ldrbeq r3, [sl, #1] + 1f41398: 03855020 orreq r5, r5, #32 + 1f4139c: 028aa001 addeq sl, sl, #1 + 1f413a0: 13855010 orrne r5, r5, #16 + 1f413a4: eafffe35 b 1f40c80 <_svfprintf_r+0x118> + 1f413a8: e3520000 cmp r2, #0 + 1f413ac: 15cd005f strbne r0, [sp, #95] ; 0x5f + 1f413b0: e3150020 tst r5, #32 + 1f413b4: 0a00047f beq 1f425b8 <_svfprintf_r+0x1a50> + 1f413b8: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f413bc: e59d2020 ldr r2, [sp, #32] + 1f413c0: e5931000 ldr r1, [r3] + 1f413c4: e2833004 add r3, r3, #4 + 1f413c8: e58d302c str r3, [sp, #44] ; 0x2c + 1f413cc: e1a03fc2 asr r3, r2, #31 + 1f413d0: e881000c stm r1, {r2, r3} + 1f413d4: eafffe03 b 1f40be8 <_svfprintf_r+0x80> + 1f413d8: e3520000 cmp r2, #0 + 1f413dc: 15cd005f strbne r0, [sp, #95] ; 0x5f + 1f413e0: e2153020 ands r3, r5, #32 + 1f413e4: 1affff73 bne 1f411b8 <_svfprintf_r+0x650> + 1f413e8: e2152010 ands r2, r5, #16 + 1f413ec: 0a000456 beq 1f4254c <_svfprintf_r+0x19e4> + 1f413f0: e59d0014 ldr r0, [sp, #20] + 1f413f4: e59d102c ldr r1, [sp, #44] ; 0x2c + 1f413f8: e3500000 cmp r0, #0 + 1f413fc: e5cd305f strb r3, [sp, #95] ; 0x5f + 1f41400: e5912000 ldr r2, [r1] + 1f41404: e2814004 add r4, r1, #4 + 1f41408: e3a03000 mov r3, #0 + 1f4140c: ba000467 blt 1f425b0 <_svfprintf_r+0x1a48> + 1f41410: 13a01001 movne r1, #1 + 1f41414: 03a01000 moveq r1, #0 + 1f41418: e1920003 orrs r0, r2, r3 + 1f4141c: 13811001 orrne r1, r1, #1 + 1f41420: e3510000 cmp r1, #0 + 1f41424: e58d402c str r4, [sp, #44] ; 0x2c + 1f41428: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4142c: 1affff71 bne 1f411f8 <_svfprintf_r+0x690> + 1f41430: e2153001 ands r3, r5, #1 + 1f41434: 1a00029f bne 1f41eb8 <_svfprintf_r+0x1350> + 1f41438: e1a07003 mov r7, r3 + 1f4143c: e58db030 str fp, [sp, #48] ; 0x30 + 1f41440: e58d3028 str r3, [sp, #40] ; 0x28 + 1f41444: eafffed6 b 1f40fa4 <_svfprintf_r+0x43c> + 1f41448: e3a03001 mov r3, #1 + 1f4144c: e3a02000 mov r2, #0 + 1f41450: e1a01003 mov r1, r3 + 1f41454: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f41458: e58d3008 str r3, [sp, #8] + 1f4145c: e5903000 ldr r3, [r0] + 1f41460: e5cd3088 strb r3, [sp, #136] ; 0x88 + 1f41464: e2803004 add r3, r0, #4 + 1f41468: e58d302c str r3, [sp, #44] ; 0x2c + 1f4146c: e28d3088 add r3, sp, #136 ; 0x88 + 1f41470: e5cd205f strb r2, [sp, #95] ; 0x5f + 1f41474: e58d1028 str r1, [sp, #40] ; 0x28 + 1f41478: e58d3030 str r3, [sp, #48] ; 0x30 + 1f4147c: e3a07000 mov r7, #0 + 1f41480: e58d7014 str r7, [sp, #20] + 1f41484: e58d703c str r7, [sp, #60] ; 0x3c + 1f41488: eafffed1 b 1f40fd4 <_svfprintf_r+0x46c> + 1f4148c: e3520000 cmp r2, #0 + 1f41490: 15cd005f strbne r0, [sp, #95] ; 0x5f + 1f41494: e3150020 tst r5, #32 + 1f41498: 1afffea6 bne 1f40f38 <_svfprintf_r+0x3d0> + 1f4149c: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f414a0: e3150010 tst r5, #16 + 1f414a4: e1a03000 mov r3, r0 + 1f414a8: 1a0002e3 bne 1f4203c <_svfprintf_r+0x14d4> + 1f414ac: e3150040 tst r5, #64 ; 0x40 + 1f414b0: 0a0002e1 beq 1f4203c <_svfprintf_r+0x14d4> + 1f414b4: e1d030f0 ldrsh r3, [r0] + 1f414b8: e1a01003 mov r1, r3 + 1f414bc: e1a02fc3 asr r2, r3, #31 + 1f414c0: e1a03002 mov r3, r2 + 1f414c4: e1a02001 mov r2, r1 + 1f414c8: e3520000 cmp r2, #0 + 1f414cc: e58d2008 str r2, [sp, #8] + 1f414d0: e58d300c str r3, [sp, #12] + 1f414d4: e2801004 add r1, r0, #4 + 1f414d8: e2d33000 sbcs r3, r3, #0 + 1f414dc: e58d102c str r1, [sp, #44] ; 0x2c + 1f414e0: aafffe9f bge 1f40f64 <_svfprintf_r+0x3fc> + 1f414e4: e3a0302d mov r3, #45 ; 0x2d + 1f414e8: e28d2008 add r2, sp, #8 + 1f414ec: e8920006 ldm r2, {r1, r2} + 1f414f0: e2711000 rsbs r1, r1, #0 + 1f414f4: e2e22000 rsc r2, r2, #0 + 1f414f8: e58d1008 str r1, [sp, #8] + 1f414fc: e58d200c str r2, [sp, #12] + 1f41500: e59d2014 ldr r2, [sp, #20] + 1f41504: e3520000 cmp r2, #0 + 1f41508: e5cd305f strb r3, [sp, #95] ; 0x5f + 1f4150c: ba000061 blt 1f41698 <_svfprintf_r+0xb30> + 1f41510: e3c55080 bic r5, r5, #128 ; 0x80 + 1f41514: e1a07003 mov r7, r3 + 1f41518: ea00025a b 1f41e88 <_svfprintf_r+0x1320> + 1f4151c: e3520000 cmp r2, #0 + 1f41520: 15cd005f strbne r0, [sp, #95] ; 0x5f + 1f41524: e3150020 tst r5, #32 + 1f41528: e51fc620 ldr ip, [pc, #-1568] ; 1f40f10 <_svfprintf_r+0x3a8> + 1f4152c: 0a000019 beq 1f41598 <_svfprintf_r+0xa30> + 1f41530: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f41534: e2834007 add r4, r3, #7 + 1f41538: e3c43007 bic r3, r4, #7 + 1f4153c: e2832008 add r2, r3, #8 + 1f41540: e58d202c str r2, [sp, #44] ; 0x2c + 1f41544: e893000c ldm r3, {r2, r3} + 1f41548: e2151001 ands r1, r5, #1 + 1f4154c: 0a00029d beq 1f41fc8 <_svfprintf_r+0x1460> + 1f41550: e1921003 orrs r1, r2, r3 + 1f41554: 0a00036c beq 1f4230c <_svfprintf_r+0x17a4> + 1f41558: e3a01000 mov r1, #0 + 1f4155c: e3a00030 mov r0, #48 ; 0x30 + 1f41560: e59de014 ldr lr, [sp, #20] + 1f41564: e15e0001 cmp lr, r1 + 1f41568: e5cd105f strb r1, [sp, #95] ; 0x5f + 1f4156c: a3c51080 bicge r1, r5, #128 ; 0x80 + 1f41570: e5cd6061 strb r6, [sp, #97] ; 0x61 + 1f41574: e5cd0060 strb r0, [sp, #96] ; 0x60 + 1f41578: b3855002 orrlt r5, r5, #2 + 1f4157c: a3815002 orrge r5, r1, #2 + 1f41580: eaffff6b b 1f41334 <_svfprintf_r+0x7cc> + 1f41584: e3520000 cmp r2, #0 + 1f41588: 15cd005f strbne r0, [sp, #95] ; 0x5f + 1f4158c: e3150020 tst r5, #32 + 1f41590: e51fc684 ldr ip, [pc, #-1668] ; 1f40f14 <_svfprintf_r+0x3ac> + 1f41594: 1affffe5 bne 1f41530 <_svfprintf_r+0x9c8> + 1f41598: e3150010 tst r5, #16 + 1f4159c: 0a0003e2 beq 1f4252c <_svfprintf_r+0x19c4> + 1f415a0: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f415a4: e5932000 ldr r2, [r3] + 1f415a8: e2833004 add r3, r3, #4 + 1f415ac: e58d302c str r3, [sp, #44] ; 0x2c + 1f415b0: e3a03000 mov r3, #0 + 1f415b4: eaffffe3 b 1f41548 <_svfprintf_r+0x9e0> + 1f415b8: e3855001 orr r5, r5, #1 + 1f415bc: e5da3000 ldrb r3, [sl] + 1f415c0: eafffdae b 1f40c80 <_svfprintf_r+0x118> + 1f415c4: e3a07000 mov r7, #0 + 1f415c8: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f415cc: e5932000 ldr r2, [r3] + 1f415d0: e1520007 cmp r2, r7 + 1f415d4: e2834004 add r4, r3, #4 + 1f415d8: e58d2030 str r2, [sp, #48] ; 0x30 + 1f415dc: e5cd705f strb r7, [sp, #95] ; 0x5f + 1f415e0: e59d3014 ldr r3, [sp, #20] + 1f415e4: 0a00052e beq 1f42aa4 <_svfprintf_r+0x1f3c> + 1f415e8: e3530000 cmp r3, #0 + 1f415ec: ba0004fd blt 1f429e8 <_svfprintf_r+0x1e80> + 1f415f0: e1a02003 mov r2, r3 + 1f415f4: e1a01007 mov r1, r7 + 1f415f8: e59d0030 ldr r0, [sp, #48] ; 0x30 + 1f415fc: eb0017e7 bl 1f475a0 + 1f41600: e3500000 cmp r0, #0 + 1f41604: 0a000585 beq 1f42c20 <_svfprintf_r+0x20b8> + 1f41608: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f4160c: e58d7014 str r7, [sp, #20] + 1f41610: e0633000 rsb r3, r3, r0 + 1f41614: e58d3028 str r3, [sp, #40] ; 0x28 + 1f41618: e1c33fc3 bic r3, r3, r3, asr #31 + 1f4161c: e58d703c str r7, [sp, #60] ; 0x3c + 1f41620: e58d402c str r4, [sp, #44] ; 0x2c + 1f41624: e58d3008 str r3, [sp, #8] + 1f41628: e5dd705f ldrb r7, [sp, #95] ; 0x5f + 1f4162c: eafffe63 b 1f40fc0 <_svfprintf_r+0x458> + 1f41630: e3520000 cmp r2, #0 + 1f41634: 15cd005f strbne r0, [sp, #95] ; 0x5f + 1f41638: e2153020 ands r3, r5, #32 + 1f4163c: 1affff0a bne 1f4126c <_svfprintf_r+0x704> + 1f41640: e2152010 ands r2, r5, #16 + 1f41644: 0a00026c beq 1f41ffc <_svfprintf_r+0x1494> + 1f41648: e59d102c ldr r1, [sp, #44] ; 0x2c + 1f4164c: e5912000 ldr r2, [r1] + 1f41650: e2814004 add r4, r1, #4 + 1f41654: e1a00002 mov r0, r2 + 1f41658: e3a01000 mov r1, #0 + 1f4165c: e59dc014 ldr ip, [sp, #20] + 1f41660: e35c0000 cmp ip, #0 + 1f41664: e5cd305f strb r3, [sp, #95] ; 0x5f + 1f41668: e58d0008 str r0, [sp, #8] + 1f4166c: e58d100c str r1, [sp, #12] + 1f41670: ba000518 blt 1f42ad8 <_svfprintf_r+0x1f70> + 1f41674: e1822001 orr r2, r2, r1 + 1f41678: e3520000 cmp r2, #0 + 1f4167c: 035c0000 cmpeq ip, #0 + 1f41680: 03a02000 moveq r2, #0 + 1f41684: e58d402c str r4, [sp, #44] ; 0x2c + 1f41688: 13a02001 movne r2, #1 + 1f4168c: e3c55080 bic r5, r5, #128 ; 0x80 + 1f41690: 01a07002 moveq r7, r2 + 1f41694: 0afffe3e beq 1f40f94 <_svfprintf_r+0x42c> + 1f41698: e1a07003 mov r7, r3 + 1f4169c: ea0001f9 b 1f41e88 <_svfprintf_r+0x1320> + 1f416a0: e3500000 cmp r0, #0 + 1f416a4: e5da3000 ldrb r3, [sl] + 1f416a8: 03a02001 moveq r2, #1 + 1f416ac: 03a00020 moveq r0, #32 + 1f416b0: eafffd72 b 1f40c80 <_svfprintf_r+0x118> + 1f416b4: e3520000 cmp r2, #0 + 1f416b8: 15cd005f strbne r0, [sp, #95] ; 0x5f + 1f416bc: e3560000 cmp r6, #0 + 1f416c0: 0afffde2 beq 1f40e50 <_svfprintf_r+0x2e8> + 1f416c4: e3a03000 mov r3, #0 + 1f416c8: e3a02001 mov r2, #1 + 1f416cc: e5cd305f strb r3, [sp, #95] ; 0x5f + 1f416d0: e28d3088 add r3, sp, #136 ; 0x88 + 1f416d4: e58d2008 str r2, [sp, #8] + 1f416d8: e5cd6088 strb r6, [sp, #136] ; 0x88 + 1f416dc: e58d2028 str r2, [sp, #40] ; 0x28 + 1f416e0: e58d3030 str r3, [sp, #48] ; 0x30 + 1f416e4: eaffff64 b 1f4147c <_svfprintf_r+0x914> + 1f416e8: e28d207c add r2, sp, #124 ; 0x7c + 1f416ec: e59d1018 ldr r1, [sp, #24] + 1f416f0: e59d001c ldr r0, [sp, #28] + 1f416f4: eb001b8a bl 1f48524 <__ssprint_r> + 1f416f8: e3500000 cmp r0, #0 + 1f416fc: 1afffdd9 bne 1f40e68 <_svfprintf_r+0x300> + 1f41700: e1a0800b mov r8, fp + 1f41704: e5dd705f ldrb r7, [sp, #95] ; 0x5f + 1f41708: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f4170c: e3570000 cmp r7, #0 + 1f41710: 0a00000b beq 1f41744 <_svfprintf_r+0xbdc> + 1f41714: e3a01001 mov r1, #1 + 1f41718: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f4171c: e0822001 add r2, r2, r1 + 1f41720: e3520007 cmp r2, #7 + 1f41724: e0833001 add r3, r3, r1 + 1f41728: e58d2080 str r2, [sp, #128] ; 0x80 + 1f4172c: e28d205f add r2, sp, #95 ; 0x5f + 1f41730: e5881004 str r1, [r8, #4] + 1f41734: e5882000 str r2, [r8] + 1f41738: e58d3084 str r3, [sp, #132] ; 0x84 + 1f4173c: d2888008 addle r8, r8, #8 + 1f41740: ca00016f bgt 1f41d04 <_svfprintf_r+0x119c> + 1f41744: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f41748: e3520000 cmp r2, #0 + 1f4174c: 0a00000b beq 1f41780 <_svfprintf_r+0xc18> + 1f41750: e3a01002 mov r1, #2 + 1f41754: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f41758: e2822001 add r2, r2, #1 + 1f4175c: e3520007 cmp r2, #7 + 1f41760: e0833001 add r3, r3, r1 + 1f41764: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41768: e28d2060 add r2, sp, #96 ; 0x60 + 1f4176c: e5881004 str r1, [r8, #4] + 1f41770: e5882000 str r2, [r8] + 1f41774: e58d3084 str r3, [sp, #132] ; 0x84 + 1f41778: d2888008 addle r8, r8, #8 + 1f4177c: ca000169 bgt 1f41d28 <_svfprintf_r+0x11c0> + 1f41780: e59d2038 ldr r2, [sp, #56] ; 0x38 + 1f41784: e3520080 cmp r2, #128 ; 0x80 + 1f41788: 0a0000d8 beq 1f41af0 <_svfprintf_r+0xf88> + 1f4178c: e59d2014 ldr r2, [sp, #20] + 1f41790: e59d1028 ldr r1, [sp, #40] ; 0x28 + 1f41794: e0614002 rsb r4, r1, r2 + 1f41798: e3540000 cmp r4, #0 + 1f4179c: da00003b ble 1f41890 <_svfprintf_r+0xd28> + 1f417a0: e3540010 cmp r4, #16 + 1f417a4: da00039e ble 1f42624 <_svfprintf_r+0x1abc> + 1f417a8: e51f1890 ldr r1, [pc, #-2192] ; 1f40f20 <_svfprintf_r+0x3b8> + 1f417ac: e58d6014 str r6, [sp, #20] + 1f417b0: e58d1034 str r1, [sp, #52] ; 0x34 + 1f417b4: e1a06004 mov r6, r4 + 1f417b8: e1a01008 mov r1, r8 + 1f417bc: e3a07010 mov r7, #16 + 1f417c0: e1a08005 mov r8, r5 + 1f417c4: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f417c8: e1a00003 mov r0, r3 + 1f417cc: e59d401c ldr r4, [sp, #28] + 1f417d0: e59d5018 ldr r5, [sp, #24] + 1f417d4: ea000002 b 1f417e4 <_svfprintf_r+0xc7c> + 1f417d8: e2466010 sub r6, r6, #16 + 1f417dc: e3560010 cmp r6, #16 + 1f417e0: da000014 ble 1f41838 <_svfprintf_r+0xcd0> + 1f417e4: e2822001 add r2, r2, #1 + 1f417e8: e3520007 cmp r2, #7 + 1f417ec: e2800010 add r0, r0, #16 + 1f417f0: e5819000 str r9, [r1] + 1f417f4: e5817004 str r7, [r1, #4] + 1f417f8: e58d2080 str r2, [sp, #128] ; 0x80 + 1f417fc: e58d0084 str r0, [sp, #132] ; 0x84 + 1f41800: d2811008 addle r1, r1, #8 + 1f41804: dafffff3 ble 1f417d8 <_svfprintf_r+0xc70> + 1f41808: e28d207c add r2, sp, #124 ; 0x7c + 1f4180c: e1a01005 mov r1, r5 + 1f41810: e1a00004 mov r0, r4 + 1f41814: eb001b42 bl 1f48524 <__ssprint_r> + 1f41818: e3500000 cmp r0, #0 + 1f4181c: 1afffd91 bne 1f40e68 <_svfprintf_r+0x300> + 1f41820: e2466010 sub r6, r6, #16 + 1f41824: e3560010 cmp r6, #16 + 1f41828: e1a0100b mov r1, fp + 1f4182c: e59d0084 ldr r0, [sp, #132] ; 0x84 + 1f41830: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f41834: caffffea bgt 1f417e4 <_svfprintf_r+0xc7c> + 1f41838: e1a05008 mov r5, r8 + 1f4183c: e1a03000 mov r3, r0 + 1f41840: e1a08001 mov r8, r1 + 1f41844: e1a04006 mov r4, r6 + 1f41848: e59d6014 ldr r6, [sp, #20] + 1f4184c: e2822001 add r2, r2, #1 + 1f41850: e3520007 cmp r2, #7 + 1f41854: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41858: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f4185c: e0833004 add r3, r3, r4 + 1f41860: e8880014 stm r8, {r2, r4} + 1f41864: e58d3084 str r3, [sp, #132] ; 0x84 + 1f41868: d2888008 addle r8, r8, #8 + 1f4186c: da000007 ble 1f41890 <_svfprintf_r+0xd28> + 1f41870: e28d207c add r2, sp, #124 ; 0x7c + 1f41874: e59d1018 ldr r1, [sp, #24] + 1f41878: e59d001c ldr r0, [sp, #28] + 1f4187c: eb001b28 bl 1f48524 <__ssprint_r> + 1f41880: e3500000 cmp r0, #0 + 1f41884: 1afffd77 bne 1f40e68 <_svfprintf_r+0x300> + 1f41888: e1a0800b mov r8, fp + 1f4188c: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f41890: e3150c01 tst r5, #256 ; 0x100 + 1f41894: 1a00004e bne 1f419d4 <_svfprintf_r+0xe6c> + 1f41898: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f4189c: e59d1028 ldr r1, [sp, #40] ; 0x28 + 1f418a0: e2822001 add r2, r2, #1 + 1f418a4: e59d0030 ldr r0, [sp, #48] ; 0x30 + 1f418a8: e0833001 add r3, r3, r1 + 1f418ac: e3520007 cmp r2, #7 + 1f418b0: e58d3084 str r3, [sp, #132] ; 0x84 + 1f418b4: e8880003 stm r8, {r0, r1} + 1f418b8: e58d2080 str r2, [sp, #128] ; 0x80 + 1f418bc: ca00012c bgt 1f41d74 <_svfprintf_r+0x120c> + 1f418c0: e2888008 add r8, r8, #8 + 1f418c4: e3150004 tst r5, #4 + 1f418c8: 0a000034 beq 1f419a0 <_svfprintf_r+0xe38> + 1f418cc: e59d2024 ldr r2, [sp, #36] ; 0x24 + 1f418d0: e59d1008 ldr r1, [sp, #8] + 1f418d4: e0614002 rsb r4, r1, r2 + 1f418d8: e3540000 cmp r4, #0 + 1f418dc: da00002f ble 1f419a0 <_svfprintf_r+0xe38> + 1f418e0: e3540010 cmp r4, #16 + 1f418e4: da000477 ble 1f42ac8 <_svfprintf_r+0x1f60> + 1f418e8: e51f19d8 ldr r1, [pc, #-2520] ; 1f40f18 <_svfprintf_r+0x3b0> + 1f418ec: e3a06010 mov r6, #16 + 1f418f0: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f418f4: e58d1044 str r1, [sp, #68] ; 0x44 + 1f418f8: e59d501c ldr r5, [sp, #28] + 1f418fc: e59d7018 ldr r7, [sp, #24] + 1f41900: ea000002 b 1f41910 <_svfprintf_r+0xda8> + 1f41904: e2444010 sub r4, r4, #16 + 1f41908: e3540010 cmp r4, #16 + 1f4190c: da000014 ble 1f41964 <_svfprintf_r+0xdfc> + 1f41910: e2822001 add r2, r2, #1 + 1f41914: e51f1a04 ldr r1, [pc, #-2564] ; 1f40f18 <_svfprintf_r+0x3b0> + 1f41918: e3520007 cmp r2, #7 + 1f4191c: e2833010 add r3, r3, #16 + 1f41920: e8880042 stm r8, {r1, r6} + 1f41924: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41928: e58d3084 str r3, [sp, #132] ; 0x84 + 1f4192c: d2888008 addle r8, r8, #8 + 1f41930: dafffff3 ble 1f41904 <_svfprintf_r+0xd9c> + 1f41934: e28d207c add r2, sp, #124 ; 0x7c + 1f41938: e1a01007 mov r1, r7 + 1f4193c: e1a00005 mov r0, r5 + 1f41940: eb001af7 bl 1f48524 <__ssprint_r> + 1f41944: e3500000 cmp r0, #0 + 1f41948: 1afffd46 bne 1f40e68 <_svfprintf_r+0x300> + 1f4194c: e2444010 sub r4, r4, #16 + 1f41950: e28d2080 add r2, sp, #128 ; 0x80 + 1f41954: e3540010 cmp r4, #16 + 1f41958: e1a0800b mov r8, fp + 1f4195c: e892000c ldm r2, {r2, r3} + 1f41960: caffffea bgt 1f41910 <_svfprintf_r+0xda8> + 1f41964: e2822001 add r2, r2, #1 + 1f41968: e3520007 cmp r2, #7 + 1f4196c: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41970: e59d2044 ldr r2, [sp, #68] ; 0x44 + 1f41974: e0833004 add r3, r3, r4 + 1f41978: e58d3084 str r3, [sp, #132] ; 0x84 + 1f4197c: e8880014 stm r8, {r2, r4} + 1f41980: da000006 ble 1f419a0 <_svfprintf_r+0xe38> + 1f41984: e28d207c add r2, sp, #124 ; 0x7c + 1f41988: e59d1018 ldr r1, [sp, #24] + 1f4198c: e59d001c ldr r0, [sp, #28] + 1f41990: eb001ae3 bl 1f48524 <__ssprint_r> + 1f41994: e3500000 cmp r0, #0 + 1f41998: 1afffd32 bne 1f40e68 <_svfprintf_r+0x300> + 1f4199c: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f419a0: e59d2020 ldr r2, [sp, #32] + 1f419a4: e59d1024 ldr r1, [sp, #36] ; 0x24 + 1f419a8: e59d0008 ldr r0, [sp, #8] + 1f419ac: e1510000 cmp r1, r0 + 1f419b0: a0822001 addge r2, r2, r1 + 1f419b4: b0822000 addlt r2, r2, r0 + 1f419b8: e3530000 cmp r3, #0 + 1f419bc: e58d2020 str r2, [sp, #32] + 1f419c0: 1a0000c8 bne 1f41ce8 <_svfprintf_r+0x1180> + 1f419c4: e3a03000 mov r3, #0 + 1f419c8: e1a0800b mov r8, fp + 1f419cc: e58d3080 str r3, [sp, #128] ; 0x80 + 1f419d0: eafffc84 b 1f40be8 <_svfprintf_r+0x80> + 1f419d4: e3560065 cmp r6, #101 ; 0x65 + 1f419d8: da000086 ble 1f41bf8 <_svfprintf_r+0x1090> + 1f419dc: eeb58b40 vcmp.f64 d8, #0.0 + 1f419e0: eef1fa10 vmrs APSR_nzcv, fpscr + 1f419e4: 1a0000eb bne 1f41d98 <_svfprintf_r+0x1230> + 1f419e8: e3a01001 mov r1, #1 + 1f419ec: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f419f0: e51f0adc ldr r0, [pc, #-2780] ; 1f40f1c <_svfprintf_r+0x3b4> + 1f419f4: e0822001 add r2, r2, r1 + 1f419f8: e0833001 add r3, r3, r1 + 1f419fc: e3520007 cmp r2, #7 + 1f41a00: e5880000 str r0, [r8] + 1f41a04: e5881004 str r1, [r8, #4] + 1f41a08: e58d3084 str r3, [sp, #132] ; 0x84 + 1f41a0c: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41a10: d2888008 addle r8, r8, #8 + 1f41a14: ca000306 bgt 1f42634 <_svfprintf_r+0x1acc> + 1f41a18: e59d2064 ldr r2, [sp, #100] ; 0x64 + 1f41a1c: e59d1040 ldr r1, [sp, #64] ; 0x40 + 1f41a20: e1510002 cmp r1, r2 + 1f41a24: ca000001 bgt 1f41a30 <_svfprintf_r+0xec8> + 1f41a28: e3150001 tst r5, #1 + 1f41a2c: 0affffa4 beq 1f418c4 <_svfprintf_r+0xd5c> + 1f41a30: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f41a34: e59d1048 ldr r1, [sp, #72] ; 0x48 + 1f41a38: e2822001 add r2, r2, #1 + 1f41a3c: e59d004c ldr r0, [sp, #76] ; 0x4c + 1f41a40: e0833001 add r3, r3, r1 + 1f41a44: e3520007 cmp r2, #7 + 1f41a48: e8880003 stm r8, {r0, r1} + 1f41a4c: e58d3084 str r3, [sp, #132] ; 0x84 + 1f41a50: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41a54: d2888008 addle r8, r8, #8 + 1f41a58: ca00036a bgt 1f42808 <_svfprintf_r+0x1ca0> + 1f41a5c: e59d2040 ldr r2, [sp, #64] ; 0x40 + 1f41a60: e2424001 sub r4, r2, #1 + 1f41a64: e3540000 cmp r4, #0 + 1f41a68: daffff95 ble 1f418c4 <_svfprintf_r+0xd5c> + 1f41a6c: e3540010 cmp r4, #16 + 1f41a70: da000479 ble 1f42c5c <_svfprintf_r+0x20f4> + 1f41a74: e51f1b5c ldr r1, [pc, #-2908] ; 1f40f20 <_svfprintf_r+0x3b8> + 1f41a78: e58d1034 str r1, [sp, #52] ; 0x34 + 1f41a7c: e1a01008 mov r1, r8 + 1f41a80: e1a08004 mov r8, r4 + 1f41a84: e28d4018 add r4, sp, #24 + 1f41a88: e3a06010 mov r6, #16 + 1f41a8c: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f41a90: e8940090 ldm r4, {r4, r7} + 1f41a94: ea000002 b 1f41aa4 <_svfprintf_r+0xf3c> + 1f41a98: e2488010 sub r8, r8, #16 + 1f41a9c: e3580010 cmp r8, #16 + 1f41aa0: da0000a9 ble 1f41d4c <_svfprintf_r+0x11e4> + 1f41aa4: e2822001 add r2, r2, #1 + 1f41aa8: e3520007 cmp r2, #7 + 1f41aac: e2833010 add r3, r3, #16 + 1f41ab0: e5819000 str r9, [r1] + 1f41ab4: e5816004 str r6, [r1, #4] + 1f41ab8: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41abc: e58d3084 str r3, [sp, #132] ; 0x84 + 1f41ac0: d2811008 addle r1, r1, #8 + 1f41ac4: dafffff3 ble 1f41a98 <_svfprintf_r+0xf30> + 1f41ac8: e28d207c add r2, sp, #124 ; 0x7c + 1f41acc: e1a01004 mov r1, r4 + 1f41ad0: e1a00007 mov r0, r7 + 1f41ad4: eb001a92 bl 1f48524 <__ssprint_r> + 1f41ad8: e3500000 cmp r0, #0 + 1f41adc: 1afffce1 bne 1f40e68 <_svfprintf_r+0x300> + 1f41ae0: e28d2080 add r2, sp, #128 ; 0x80 + 1f41ae4: e1a0100b mov r1, fp + 1f41ae8: e892000c ldm r2, {r2, r3} + 1f41aec: eaffffe9 b 1f41a98 <_svfprintf_r+0xf30> + 1f41af0: e59d2024 ldr r2, [sp, #36] ; 0x24 + 1f41af4: e59d1008 ldr r1, [sp, #8] + 1f41af8: e0614002 rsb r4, r1, r2 + 1f41afc: e3540000 cmp r4, #0 + 1f41b00: daffff21 ble 1f4178c <_svfprintf_r+0xc24> + 1f41b04: e3540010 cmp r4, #16 + 1f41b08: da00043e ble 1f42c08 <_svfprintf_r+0x20a0> + 1f41b0c: e51f1bf4 ldr r1, [pc, #-3060] ; 1f40f20 <_svfprintf_r+0x3b8> + 1f41b10: e58d6038 str r6, [sp, #56] ; 0x38 + 1f41b14: e58d1034 str r1, [sp, #52] ; 0x34 + 1f41b18: e1a06004 mov r6, r4 + 1f41b1c: e1a01008 mov r1, r8 + 1f41b20: e3a07010 mov r7, #16 + 1f41b24: e1a08005 mov r8, r5 + 1f41b28: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f41b2c: e1a00003 mov r0, r3 + 1f41b30: e59d401c ldr r4, [sp, #28] + 1f41b34: e59d5018 ldr r5, [sp, #24] + 1f41b38: ea000002 b 1f41b48 <_svfprintf_r+0xfe0> + 1f41b3c: e2466010 sub r6, r6, #16 + 1f41b40: e3560010 cmp r6, #16 + 1f41b44: da000014 ble 1f41b9c <_svfprintf_r+0x1034> + 1f41b48: e2822001 add r2, r2, #1 + 1f41b4c: e3520007 cmp r2, #7 + 1f41b50: e2800010 add r0, r0, #16 + 1f41b54: e5819000 str r9, [r1] + 1f41b58: e5817004 str r7, [r1, #4] + 1f41b5c: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41b60: e58d0084 str r0, [sp, #132] ; 0x84 + 1f41b64: d2811008 addle r1, r1, #8 + 1f41b68: dafffff3 ble 1f41b3c <_svfprintf_r+0xfd4> + 1f41b6c: e28d207c add r2, sp, #124 ; 0x7c + 1f41b70: e1a01005 mov r1, r5 + 1f41b74: e1a00004 mov r0, r4 + 1f41b78: eb001a69 bl 1f48524 <__ssprint_r> + 1f41b7c: e3500000 cmp r0, #0 + 1f41b80: 1afffcb8 bne 1f40e68 <_svfprintf_r+0x300> + 1f41b84: e2466010 sub r6, r6, #16 + 1f41b88: e3560010 cmp r6, #16 + 1f41b8c: e1a0100b mov r1, fp + 1f41b90: e59d0084 ldr r0, [sp, #132] ; 0x84 + 1f41b94: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f41b98: caffffea bgt 1f41b48 <_svfprintf_r+0xfe0> + 1f41b9c: e1a05008 mov r5, r8 + 1f41ba0: e1a03000 mov r3, r0 + 1f41ba4: e1a08001 mov r8, r1 + 1f41ba8: e1a04006 mov r4, r6 + 1f41bac: e59d6038 ldr r6, [sp, #56] ; 0x38 + 1f41bb0: e2822001 add r2, r2, #1 + 1f41bb4: e3520007 cmp r2, #7 + 1f41bb8: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41bbc: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f41bc0: e0833004 add r3, r3, r4 + 1f41bc4: e8880014 stm r8, {r2, r4} + 1f41bc8: e58d3084 str r3, [sp, #132] ; 0x84 + 1f41bcc: d2888008 addle r8, r8, #8 + 1f41bd0: dafffeed ble 1f4178c <_svfprintf_r+0xc24> + 1f41bd4: e28d207c add r2, sp, #124 ; 0x7c + 1f41bd8: e59d1018 ldr r1, [sp, #24] + 1f41bdc: e59d001c ldr r0, [sp, #28] + 1f41be0: eb001a4f bl 1f48524 <__ssprint_r> + 1f41be4: e3500000 cmp r0, #0 + 1f41be8: 1afffc9e bne 1f40e68 <_svfprintf_r+0x300> + 1f41bec: e1a0800b mov r8, fp + 1f41bf0: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f41bf4: eafffee4 b 1f4178c <_svfprintf_r+0xc24> + 1f41bf8: e59d2040 ldr r2, [sp, #64] ; 0x40 + 1f41bfc: e3520001 cmp r2, #1 + 1f41c00: da00017a ble 1f421f0 <_svfprintf_r+0x1688> + 1f41c04: e3a01001 mov r1, #1 + 1f41c08: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f41c0c: e59d0030 ldr r0, [sp, #48] ; 0x30 + 1f41c10: e0822001 add r2, r2, r1 + 1f41c14: e0833001 add r3, r3, r1 + 1f41c18: e3520007 cmp r2, #7 + 1f41c1c: e5880000 str r0, [r8] + 1f41c20: e5881004 str r1, [r8, #4] + 1f41c24: e58d3084 str r3, [sp, #132] ; 0x84 + 1f41c28: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41c2c: d2888008 addle r8, r8, #8 + 1f41c30: ca000185 bgt 1f4224c <_svfprintf_r+0x16e4> + 1f41c34: e59d1048 ldr r1, [sp, #72] ; 0x48 + 1f41c38: e2822001 add r2, r2, #1 + 1f41c3c: e59d004c ldr r0, [sp, #76] ; 0x4c + 1f41c40: e3520007 cmp r2, #7 + 1f41c44: e0813003 add r3, r1, r3 + 1f41c48: e8880003 stm r8, {r0, r1} + 1f41c4c: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41c50: e58d3084 str r3, [sp, #132] ; 0x84 + 1f41c54: d2888008 addle r8, r8, #8 + 1f41c58: ca000185 bgt 1f42274 <_svfprintf_r+0x170c> + 1f41c5c: eeb58b40 vcmp.f64 d8, #0.0 + 1f41c60: eef1fa10 vmrs APSR_nzcv, fpscr + 1f41c64: 0a00009b beq 1f41ed8 <_svfprintf_r+0x1370> + 1f41c68: e59d1040 ldr r1, [sp, #64] ; 0x40 + 1f41c6c: e59d0030 ldr r0, [sp, #48] ; 0x30 + 1f41c70: e2822001 add r2, r2, #1 + 1f41c74: e2411001 sub r1, r1, #1 + 1f41c78: e2800001 add r0, r0, #1 + 1f41c7c: e0833001 add r3, r3, r1 + 1f41c80: e3520007 cmp r2, #7 + 1f41c84: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41c88: e5880000 str r0, [r8] + 1f41c8c: e58d3084 str r3, [sp, #132] ; 0x84 + 1f41c90: e5881004 str r1, [r8, #4] + 1f41c94: ca0000c1 bgt 1f41fa0 <_svfprintf_r+0x1438> + 1f41c98: e2888008 add r8, r8, #8 + 1f41c9c: e59d0054 ldr r0, [sp, #84] ; 0x54 + 1f41ca0: e2822001 add r2, r2, #1 + 1f41ca4: e3520007 cmp r2, #7 + 1f41ca8: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41cac: e1a02000 mov r2, r0 + 1f41cb0: e0803003 add r3, r0, r3 + 1f41cb4: e28d106c add r1, sp, #108 ; 0x6c + 1f41cb8: e58d3084 str r3, [sp, #132] ; 0x84 + 1f41cbc: e8880006 stm r8, {r1, r2} + 1f41cc0: dafffefe ble 1f418c0 <_svfprintf_r+0xd58> + 1f41cc4: e28d207c add r2, sp, #124 ; 0x7c + 1f41cc8: e59d1018 ldr r1, [sp, #24] + 1f41ccc: e59d001c ldr r0, [sp, #28] + 1f41cd0: eb001a13 bl 1f48524 <__ssprint_r> + 1f41cd4: e3500000 cmp r0, #0 + 1f41cd8: 1afffc62 bne 1f40e68 <_svfprintf_r+0x300> + 1f41cdc: e1a0800b mov r8, fp + 1f41ce0: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f41ce4: eafffef6 b 1f418c4 <_svfprintf_r+0xd5c> + 1f41ce8: e28d207c add r2, sp, #124 ; 0x7c + 1f41cec: e59d1018 ldr r1, [sp, #24] + 1f41cf0: e59d001c ldr r0, [sp, #28] + 1f41cf4: eb001a0a bl 1f48524 <__ssprint_r> + 1f41cf8: e3500000 cmp r0, #0 + 1f41cfc: 0affff30 beq 1f419c4 <_svfprintf_r+0xe5c> + 1f41d00: eafffc58 b 1f40e68 <_svfprintf_r+0x300> + 1f41d04: e28d207c add r2, sp, #124 ; 0x7c + 1f41d08: e59d1018 ldr r1, [sp, #24] + 1f41d0c: e59d001c ldr r0, [sp, #28] + 1f41d10: eb001a03 bl 1f48524 <__ssprint_r> + 1f41d14: e3500000 cmp r0, #0 + 1f41d18: 1afffc52 bne 1f40e68 <_svfprintf_r+0x300> + 1f41d1c: e1a0800b mov r8, fp + 1f41d20: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f41d24: eafffe86 b 1f41744 <_svfprintf_r+0xbdc> + 1f41d28: e28d207c add r2, sp, #124 ; 0x7c + 1f41d2c: e59d1018 ldr r1, [sp, #24] + 1f41d30: e59d001c ldr r0, [sp, #28] + 1f41d34: eb0019fa bl 1f48524 <__ssprint_r> + 1f41d38: e3500000 cmp r0, #0 + 1f41d3c: 1afffc49 bne 1f40e68 <_svfprintf_r+0x300> + 1f41d40: e1a0800b mov r8, fp + 1f41d44: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f41d48: eafffe8c b 1f41780 <_svfprintf_r+0xc18> + 1f41d4c: e1a04008 mov r4, r8 + 1f41d50: e1a08001 mov r8, r1 + 1f41d54: e2822001 add r2, r2, #1 + 1f41d58: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41d5c: e3520007 cmp r2, #7 + 1f41d60: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f41d64: e0833004 add r3, r3, r4 + 1f41d68: e58d3084 str r3, [sp, #132] ; 0x84 + 1f41d6c: e8880014 stm r8, {r2, r4} + 1f41d70: dafffed2 ble 1f418c0 <_svfprintf_r+0xd58> + 1f41d74: e28d207c add r2, sp, #124 ; 0x7c + 1f41d78: e59d1018 ldr r1, [sp, #24] + 1f41d7c: e59d001c ldr r0, [sp, #28] + 1f41d80: eb0019e7 bl 1f48524 <__ssprint_r> + 1f41d84: e3500000 cmp r0, #0 + 1f41d88: 1afffc36 bne 1f40e68 <_svfprintf_r+0x300> + 1f41d8c: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f41d90: e1a0800b mov r8, fp + 1f41d94: eafffeca b 1f418c4 <_svfprintf_r+0xd5c> + 1f41d98: e59d4064 ldr r4, [sp, #100] ; 0x64 + 1f41d9c: e3540000 cmp r4, #0 + 1f41da0: da00022c ble 1f42658 <_svfprintf_r+0x1af0> + 1f41da4: e28d103c add r1, sp, #60 ; 0x3c + 1f41da8: e8910006 ldm r1, {r1, r2} + 1f41dac: e1520001 cmp r2, r1 + 1f41db0: b1a04002 movlt r4, r2 + 1f41db4: a1a04001 movge r4, r1 + 1f41db8: e3540000 cmp r4, #0 + 1f41dbc: da000009 ble 1f41de8 <_svfprintf_r+0x1280> + 1f41dc0: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f41dc4: e59d1030 ldr r1, [sp, #48] ; 0x30 + 1f41dc8: e2822001 add r2, r2, #1 + 1f41dcc: e0833004 add r3, r3, r4 + 1f41dd0: e3520007 cmp r2, #7 + 1f41dd4: e8880012 stm r8, {r1, r4} + 1f41dd8: e58d3084 str r3, [sp, #132] ; 0x84 + 1f41ddc: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41de0: d2888008 addle r8, r8, #8 + 1f41de4: ca000319 bgt 1f42a50 <_svfprintf_r+0x1ee8> + 1f41de8: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f41dec: e3540000 cmp r4, #0 + 1f41df0: a0642002 rsbge r2, r4, r2 + 1f41df4: e3520000 cmp r2, #0 + 1f41df8: e1a04002 mov r4, r2 + 1f41dfc: da0000a3 ble 1f42090 <_svfprintf_r+0x1528> + 1f41e00: e3520010 cmp r2, #16 + 1f41e04: da0003d2 ble 1f42d54 <_svfprintf_r+0x21ec> + 1f41e08: e51f1ef0 ldr r1, [pc, #-3824] ; 1f40f20 <_svfprintf_r+0x3b8> + 1f41e0c: e58d1034 str r1, [sp, #52] ; 0x34 + 1f41e10: e1a01008 mov r1, r8 + 1f41e14: e1a08004 mov r8, r4 + 1f41e18: e28d4018 add r4, sp, #24 + 1f41e1c: e3a06010 mov r6, #16 + 1f41e20: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f41e24: e8940090 ldm r4, {r4, r7} + 1f41e28: ea000002 b 1f41e38 <_svfprintf_r+0x12d0> + 1f41e2c: e2488010 sub r8, r8, #16 + 1f41e30: e3580010 cmp r8, #16 + 1f41e34: da000082 ble 1f42044 <_svfprintf_r+0x14dc> + 1f41e38: e2822001 add r2, r2, #1 + 1f41e3c: e3520007 cmp r2, #7 + 1f41e40: e2833010 add r3, r3, #16 + 1f41e44: e5819000 str r9, [r1] + 1f41e48: e5816004 str r6, [r1, #4] + 1f41e4c: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41e50: e58d3084 str r3, [sp, #132] ; 0x84 + 1f41e54: d2811008 addle r1, r1, #8 + 1f41e58: dafffff3 ble 1f41e2c <_svfprintf_r+0x12c4> + 1f41e5c: e28d207c add r2, sp, #124 ; 0x7c + 1f41e60: e1a01004 mov r1, r4 + 1f41e64: e1a00007 mov r0, r7 + 1f41e68: eb0019ad bl 1f48524 <__ssprint_r> + 1f41e6c: e3500000 cmp r0, #0 + 1f41e70: 1afffbfc bne 1f40e68 <_svfprintf_r+0x300> + 1f41e74: e28d2080 add r2, sp, #128 ; 0x80 + 1f41e78: e1a0100b mov r1, fp + 1f41e7c: e892000c ldm r2, {r2, r3} + 1f41e80: eaffffe9 b 1f41e2c <_svfprintf_r+0x12c4> + 1f41e84: e5dd705f ldrb r7, [sp, #95] ; 0x5f + 1f41e88: e28d2008 add r2, sp, #8 + 1f41e8c: e8920006 ldm r2, {r1, r2} + 1f41e90: e3520000 cmp r2, #0 + 1f41e94: 03510009 cmpeq r1, #9 + 1f41e98: 8a0000ff bhi 1f4229c <_svfprintf_r+0x1734> + 1f41e9c: e28d30f0 add r3, sp, #240 ; 0xf0 + 1f41ea0: e2812030 add r2, r1, #48 ; 0x30 + 1f41ea4: e5632041 strb r2, [r3, #-65]! ; 0xffffffbf + 1f41ea8: e063200b rsb r2, r3, fp + 1f41eac: e58d2028 str r2, [sp, #40] ; 0x28 + 1f41eb0: e58d3030 str r3, [sp, #48] ; 0x30 + 1f41eb4: eafffc3a b 1f40fa4 <_svfprintf_r+0x43c> + 1f41eb8: e3a03030 mov r3, #48 ; 0x30 + 1f41ebc: e28d20f0 add r2, sp, #240 ; 0xf0 + 1f41ec0: e5623041 strb r3, [r2, #-65]! ; 0xffffffbf + 1f41ec4: e062300b rsb r3, r2, fp + 1f41ec8: e3a07000 mov r7, #0 + 1f41ecc: e58d2030 str r2, [sp, #48] ; 0x30 + 1f41ed0: e58d3028 str r3, [sp, #40] ; 0x28 + 1f41ed4: eafffc32 b 1f40fa4 <_svfprintf_r+0x43c> + 1f41ed8: e59d1040 ldr r1, [sp, #64] ; 0x40 + 1f41edc: e2414001 sub r4, r1, #1 + 1f41ee0: e3540000 cmp r4, #0 + 1f41ee4: daffff6c ble 1f41c9c <_svfprintf_r+0x1134> + 1f41ee8: e3540010 cmp r4, #16 + 1f41eec: d51f1fd4 ldrle r1, [pc, #-4052] ; 1f40f20 <_svfprintf_r+0x3b8> + 1f41ef0: d58d1034 strle r1, [sp, #52] ; 0x34 + 1f41ef4: da000021 ble 1f41f80 <_svfprintf_r+0x1418> + 1f41ef8: e51f1fe0 ldr r1, [pc, #-4064] ; 1f40f20 <_svfprintf_r+0x3b8> + 1f41efc: e58d1034 str r1, [sp, #52] ; 0x34 + 1f41f00: e1a01008 mov r1, r8 + 1f41f04: e1a08004 mov r8, r4 + 1f41f08: e28d4018 add r4, sp, #24 + 1f41f0c: e3a06010 mov r6, #16 + 1f41f10: e8940090 ldm r4, {r4, r7} + 1f41f14: ea000002 b 1f41f24 <_svfprintf_r+0x13bc> + 1f41f18: e2488010 sub r8, r8, #16 + 1f41f1c: e3580010 cmp r8, #16 + 1f41f20: da000014 ble 1f41f78 <_svfprintf_r+0x1410> + 1f41f24: e2822001 add r2, r2, #1 + 1f41f28: e3520007 cmp r2, #7 + 1f41f2c: e2833010 add r3, r3, #16 + 1f41f30: e5819000 str r9, [r1] + 1f41f34: e5816004 str r6, [r1, #4] + 1f41f38: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41f3c: e58d3084 str r3, [sp, #132] ; 0x84 + 1f41f40: d2811008 addle r1, r1, #8 + 1f41f44: dafffff3 ble 1f41f18 <_svfprintf_r+0x13b0> + 1f41f48: e28d207c add r2, sp, #124 ; 0x7c + 1f41f4c: e1a01004 mov r1, r4 + 1f41f50: e1a00007 mov r0, r7 + 1f41f54: eb001972 bl 1f48524 <__ssprint_r> + 1f41f58: e3500000 cmp r0, #0 + 1f41f5c: 1afffbc1 bne 1f40e68 <_svfprintf_r+0x300> + 1f41f60: e2488010 sub r8, r8, #16 + 1f41f64: e28d2080 add r2, sp, #128 ; 0x80 + 1f41f68: e3580010 cmp r8, #16 + 1f41f6c: e1a0100b mov r1, fp + 1f41f70: e892000c ldm r2, {r2, r3} + 1f41f74: caffffea bgt 1f41f24 <_svfprintf_r+0x13bc> + 1f41f78: e1a04008 mov r4, r8 + 1f41f7c: e1a08001 mov r8, r1 + 1f41f80: e2822001 add r2, r2, #1 + 1f41f84: e59d1034 ldr r1, [sp, #52] ; 0x34 + 1f41f88: e0833004 add r3, r3, r4 + 1f41f8c: e3520007 cmp r2, #7 + 1f41f90: e58d2080 str r2, [sp, #128] ; 0x80 + 1f41f94: e58d3084 str r3, [sp, #132] ; 0x84 + 1f41f98: e8880012 stm r8, {r1, r4} + 1f41f9c: daffff3d ble 1f41c98 <_svfprintf_r+0x1130> + 1f41fa0: e28d207c add r2, sp, #124 ; 0x7c + 1f41fa4: e59d1018 ldr r1, [sp, #24] + 1f41fa8: e59d001c ldr r0, [sp, #28] + 1f41fac: eb00195c bl 1f48524 <__ssprint_r> + 1f41fb0: e3500000 cmp r0, #0 + 1f41fb4: 1afffbab bne 1f40e68 <_svfprintf_r+0x300> + 1f41fb8: e28d2080 add r2, sp, #128 ; 0x80 + 1f41fbc: e892000c ldm r2, {r2, r3} + 1f41fc0: e1a0800b mov r8, fp + 1f41fc4: eaffff34 b 1f41c9c <_svfprintf_r+0x1134> + 1f41fc8: e59d0014 ldr r0, [sp, #20] + 1f41fcc: e3500000 cmp r0, #0 + 1f41fd0: e5cd105f strb r1, [sp, #95] ; 0x5f + 1f41fd4: bafffcd6 blt 1f41334 <_svfprintf_r+0x7cc> + 1f41fd8: 13a01001 movne r1, #1 + 1f41fdc: 03a01000 moveq r1, #0 + 1f41fe0: e1920003 orrs r0, r2, r3 + 1f41fe4: 13811001 orrne r1, r1, #1 + 1f41fe8: e3510000 cmp r1, #0 + 1f41fec: e3c55080 bic r5, r5, #128 ; 0x80 + 1f41ff0: 01a07001 moveq r7, r1 + 1f41ff4: 0afffbe6 beq 1f40f94 <_svfprintf_r+0x42c> + 1f41ff8: eafffccd b 1f41334 <_svfprintf_r+0x7cc> + 1f41ffc: e2150040 ands r0, r5, #64 ; 0x40 + 1f42000: 0a0001e6 beq 1f427a0 <_svfprintf_r+0x1c38> + 1f42004: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f42008: e59d0014 ldr r0, [sp, #20] + 1f4200c: e1d310b0 ldrh r1, [r3] + 1f42010: e3500000 cmp r0, #0 + 1f42014: e3a04000 mov r4, #0 + 1f42018: e2830004 add r0, r3, #4 + 1f4201c: e1a03001 mov r3, r1 + 1f42020: e5cd205f strb r2, [sp, #95] ; 0x5f + 1f42024: e58d3008 str r3, [sp, #8] + 1f42028: e58d400c str r4, [sp, #12] + 1f4202c: aa000173 bge 1f42600 <_svfprintf_r+0x1a98> + 1f42030: e58d002c str r0, [sp, #44] ; 0x2c + 1f42034: e1a07002 mov r7, r2 + 1f42038: eaffff92 b 1f41e88 <_svfprintf_r+0x1320> + 1f4203c: e5933000 ldr r3, [r3] + 1f42040: eafffd1c b 1f414b8 <_svfprintf_r+0x950> + 1f42044: e1a04008 mov r4, r8 + 1f42048: e1a08001 mov r8, r1 + 1f4204c: e2822001 add r2, r2, #1 + 1f42050: e3520007 cmp r2, #7 + 1f42054: e58d2080 str r2, [sp, #128] ; 0x80 + 1f42058: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f4205c: e0833004 add r3, r3, r4 + 1f42060: e8880014 stm r8, {r2, r4} + 1f42064: e58d3084 str r3, [sp, #132] ; 0x84 + 1f42068: d2888008 addle r8, r8, #8 + 1f4206c: da000007 ble 1f42090 <_svfprintf_r+0x1528> + 1f42070: e28d207c add r2, sp, #124 ; 0x7c + 1f42074: e59d1018 ldr r1, [sp, #24] + 1f42078: e59d001c ldr r0, [sp, #28] + 1f4207c: eb001928 bl 1f48524 <__ssprint_r> + 1f42080: e3500000 cmp r0, #0 + 1f42084: 1afffb77 bne 1f40e68 <_svfprintf_r+0x300> + 1f42088: e1a0800b mov r8, fp + 1f4208c: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f42090: e59d1040 ldr r1, [sp, #64] ; 0x40 + 1f42094: e59d2064 ldr r2, [sp, #100] ; 0x64 + 1f42098: e59d003c ldr r0, [sp, #60] ; 0x3c + 1f4209c: e1510002 cmp r1, r2 + 1f420a0: e59d1030 ldr r1, [sp, #48] ; 0x30 + 1f420a4: e0816000 add r6, r1, r0 + 1f420a8: ca00003a bgt 1f42198 <_svfprintf_r+0x1630> + 1f420ac: e3150001 tst r5, #1 + 1f420b0: 1a000038 bne 1f42198 <_svfprintf_r+0x1630> + 1f420b4: e59d1040 ldr r1, [sp, #64] ; 0x40 + 1f420b8: e59d0030 ldr r0, [sp, #48] ; 0x30 + 1f420bc: e0804001 add r4, r0, r1 + 1f420c0: e0664004 rsb r4, r6, r4 + 1f420c4: e0622001 rsb r2, r2, r1 + 1f420c8: e1540002 cmp r4, r2 + 1f420cc: a1a04002 movge r4, r2 + 1f420d0: e3540000 cmp r4, #0 + 1f420d4: da000009 ble 1f42100 <_svfprintf_r+0x1598> + 1f420d8: e59d1080 ldr r1, [sp, #128] ; 0x80 + 1f420dc: e2811001 add r1, r1, #1 + 1f420e0: e0833004 add r3, r3, r4 + 1f420e4: e3510007 cmp r1, #7 + 1f420e8: e5886000 str r6, [r8] + 1f420ec: e5884004 str r4, [r8, #4] + 1f420f0: e58d3084 str r3, [sp, #132] ; 0x84 + 1f420f4: e58d1080 str r1, [sp, #128] ; 0x80 + 1f420f8: d2888008 addle r8, r8, #8 + 1f420fc: ca00025c bgt 1f42a74 <_svfprintf_r+0x1f0c> + 1f42100: e3540000 cmp r4, #0 + 1f42104: b1a04002 movlt r4, r2 + 1f42108: a0644002 rsbge r4, r4, r2 + 1f4210c: e3540000 cmp r4, #0 + 1f42110: dafffdeb ble 1f418c4 <_svfprintf_r+0xd5c> + 1f42114: e3540010 cmp r4, #16 + 1f42118: da0002cf ble 1f42c5c <_svfprintf_r+0x20f4> + 1f4211c: e59f1c8c ldr r1, [pc, #3212] ; 1f42db0 <_svfprintf_r+0x2248> + 1f42120: e58d1034 str r1, [sp, #52] ; 0x34 + 1f42124: e1a01008 mov r1, r8 + 1f42128: e1a08004 mov r8, r4 + 1f4212c: e28d4018 add r4, sp, #24 + 1f42130: e3a06010 mov r6, #16 + 1f42134: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f42138: e8940090 ldm r4, {r4, r7} + 1f4213c: ea000002 b 1f4214c <_svfprintf_r+0x15e4> + 1f42140: e2488010 sub r8, r8, #16 + 1f42144: e3580010 cmp r8, #16 + 1f42148: dafffeff ble 1f41d4c <_svfprintf_r+0x11e4> + 1f4214c: e2822001 add r2, r2, #1 + 1f42150: e3520007 cmp r2, #7 + 1f42154: e2833010 add r3, r3, #16 + 1f42158: e5819000 str r9, [r1] + 1f4215c: e5816004 str r6, [r1, #4] + 1f42160: e58d2080 str r2, [sp, #128] ; 0x80 + 1f42164: e58d3084 str r3, [sp, #132] ; 0x84 + 1f42168: d2811008 addle r1, r1, #8 + 1f4216c: dafffff3 ble 1f42140 <_svfprintf_r+0x15d8> + 1f42170: e28d207c add r2, sp, #124 ; 0x7c + 1f42174: e1a01004 mov r1, r4 + 1f42178: e1a00007 mov r0, r7 + 1f4217c: eb0018e8 bl 1f48524 <__ssprint_r> + 1f42180: e3500000 cmp r0, #0 + 1f42184: 1afffb37 bne 1f40e68 <_svfprintf_r+0x300> + 1f42188: e28d2080 add r2, sp, #128 ; 0x80 + 1f4218c: e1a0100b mov r1, fp + 1f42190: e892000c ldm r2, {r2, r3} + 1f42194: eaffffe9 b 1f42140 <_svfprintf_r+0x15d8> + 1f42198: e59d1080 ldr r1, [sp, #128] ; 0x80 + 1f4219c: e59d0048 ldr r0, [sp, #72] ; 0x48 + 1f421a0: e2811001 add r1, r1, #1 + 1f421a4: e59dc04c ldr ip, [sp, #76] ; 0x4c + 1f421a8: e0833000 add r3, r3, r0 + 1f421ac: e3510007 cmp r1, #7 + 1f421b0: e588c000 str ip, [r8] + 1f421b4: e5880004 str r0, [r8, #4] + 1f421b8: e58d3084 str r3, [sp, #132] ; 0x84 + 1f421bc: e58d1080 str r1, [sp, #128] ; 0x80 + 1f421c0: d2888008 addle r8, r8, #8 + 1f421c4: daffffba ble 1f420b4 <_svfprintf_r+0x154c> + 1f421c8: e28d207c add r2, sp, #124 ; 0x7c + 1f421cc: e59d1018 ldr r1, [sp, #24] + 1f421d0: e59d001c ldr r0, [sp, #28] + 1f421d4: eb0018d2 bl 1f48524 <__ssprint_r> + 1f421d8: e3500000 cmp r0, #0 + 1f421dc: 1afffb21 bne 1f40e68 <_svfprintf_r+0x300> + 1f421e0: e1a0800b mov r8, fp + 1f421e4: e59d2064 ldr r2, [sp, #100] ; 0x64 + 1f421e8: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f421ec: eaffffb0 b 1f420b4 <_svfprintf_r+0x154c> + 1f421f0: e3150001 tst r5, #1 + 1f421f4: 1afffe82 bne 1f41c04 <_svfprintf_r+0x109c> + 1f421f8: e3a01001 mov r1, #1 + 1f421fc: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f42200: e59d0030 ldr r0, [sp, #48] ; 0x30 + 1f42204: e0822001 add r2, r2, r1 + 1f42208: e0833001 add r3, r3, r1 + 1f4220c: e3520007 cmp r2, #7 + 1f42210: e58d3084 str r3, [sp, #132] ; 0x84 + 1f42214: e5880000 str r0, [r8] + 1f42218: e58d2080 str r2, [sp, #128] ; 0x80 + 1f4221c: e5881004 str r1, [r8, #4] + 1f42220: dafffe9c ble 1f41c98 <_svfprintf_r+0x1130> + 1f42224: e28d207c add r2, sp, #124 ; 0x7c + 1f42228: e59d1018 ldr r1, [sp, #24] + 1f4222c: e59d001c ldr r0, [sp, #28] + 1f42230: eb0018bb bl 1f48524 <__ssprint_r> + 1f42234: e3500000 cmp r0, #0 + 1f42238: 1afffb0a bne 1f40e68 <_svfprintf_r+0x300> + 1f4223c: e28d2080 add r2, sp, #128 ; 0x80 + 1f42240: e1a0800b mov r8, fp + 1f42244: e892000c ldm r2, {r2, r3} + 1f42248: eafffe93 b 1f41c9c <_svfprintf_r+0x1134> + 1f4224c: e28d207c add r2, sp, #124 ; 0x7c + 1f42250: e59d1018 ldr r1, [sp, #24] + 1f42254: e59d001c ldr r0, [sp, #28] + 1f42258: eb0018b1 bl 1f48524 <__ssprint_r> + 1f4225c: e3500000 cmp r0, #0 + 1f42260: 1afffb00 bne 1f40e68 <_svfprintf_r+0x300> + 1f42264: e28d2080 add r2, sp, #128 ; 0x80 + 1f42268: e1a0800b mov r8, fp + 1f4226c: e892000c ldm r2, {r2, r3} + 1f42270: eafffe6f b 1f41c34 <_svfprintf_r+0x10cc> + 1f42274: e28d207c add r2, sp, #124 ; 0x7c + 1f42278: e59d1018 ldr r1, [sp, #24] + 1f4227c: e59d001c ldr r0, [sp, #28] + 1f42280: eb0018a7 bl 1f48524 <__ssprint_r> + 1f42284: e3500000 cmp r0, #0 + 1f42288: 1afffaf6 bne 1f40e68 <_svfprintf_r+0x300> + 1f4228c: e28d2080 add r2, sp, #128 ; 0x80 + 1f42290: e1a0800b mov r8, fp + 1f42294: e892000c ldm r2, {r2, r3} + 1f42298: eafffe6f b 1f41c5c <_svfprintf_r+0x10f4> + 1f4229c: e58d6028 str r6, [sp, #40] ; 0x28 + 1f422a0: e1a0600b mov r6, fp + 1f422a4: e58d5034 str r5, [sp, #52] ; 0x34 + 1f422a8: e28d5008 add r5, sp, #8 + 1f422ac: e8950030 ldm r5, {r4, r5} + 1f422b0: e1a00004 mov r0, r4 + 1f422b4: e1a01005 mov r1, r5 + 1f422b8: e3a0200a mov r2, #10 + 1f422bc: e3a03000 mov r3, #0 + 1f422c0: eb002725 bl 1f4bf5c <__aeabi_uldivmod> + 1f422c4: e2822030 add r2, r2, #48 ; 0x30 + 1f422c8: e5662001 strb r2, [r6, #-1]! + 1f422cc: e1a00004 mov r0, r4 + 1f422d0: e1a01005 mov r1, r5 + 1f422d4: e3a03000 mov r3, #0 + 1f422d8: e3a0200a mov r2, #10 + 1f422dc: eb00271e bl 1f4bf5c <__aeabi_uldivmod> + 1f422e0: e1a04000 mov r4, r0 + 1f422e4: e1a05001 mov r5, r1 + 1f422e8: e1943005 orrs r3, r4, r5 + 1f422ec: 1affffef bne 1f422b0 <_svfprintf_r+0x1748> + 1f422f0: e1a03006 mov r3, r6 + 1f422f4: e063300b rsb r3, r3, fp + 1f422f8: e58d6030 str r6, [sp, #48] ; 0x30 + 1f422fc: e59d5034 ldr r5, [sp, #52] ; 0x34 + 1f42300: e59d6028 ldr r6, [sp, #40] ; 0x28 + 1f42304: e58d3028 str r3, [sp, #40] ; 0x28 + 1f42308: eafffb25 b 1f40fa4 <_svfprintf_r+0x43c> + 1f4230c: e3a01000 mov r1, #0 + 1f42310: e59d0014 ldr r0, [sp, #20] + 1f42314: e1500001 cmp r0, r1 + 1f42318: e5cd105f strb r1, [sp, #95] ; 0x5f + 1f4231c: bafffc04 blt 1f41334 <_svfprintf_r+0x7cc> + 1f42320: e3c55080 bic r5, r5, #128 ; 0x80 + 1f42324: 01a07000 moveq r7, r0 + 1f42328: 0afffb19 beq 1f40f94 <_svfprintf_r+0x42c> + 1f4232c: eafffc00 b 1f41334 <_svfprintf_r+0x7cc> + 1f42330: eeb48b48 vcmp.f64 d8, d8 + 1f42334: eef1fa10 vmrs APSR_nzcv, fpscr + 1f42338: 6a00024b bvs 1f42c6c <_svfprintf_r+0x2104> + 1f4233c: e59d3014 ldr r3, [sp, #20] + 1f42340: e3730001 cmn r3, #1 + 1f42344: e3c63020 bic r3, r6, #32 + 1f42348: e58d3008 str r3, [sp, #8] + 1f4234c: 03a03006 moveq r3, #6 + 1f42350: 058d3014 streq r3, [sp, #20] + 1f42354: 0a000024 beq 1f423ec <_svfprintf_r+0x1884> + 1f42358: e59d2014 ldr r2, [sp, #20] + 1f4235c: e3520000 cmp r2, #0 + 1f42360: 03530047 cmpeq r3, #71 ; 0x47 + 1f42364: 1a000020 bne 1f423ec <_svfprintf_r+0x1884> + 1f42368: ee183a90 vmov r3, s17 + 1f4236c: e3530000 cmp r3, #0 + 1f42370: e3853c01 orr r3, r5, #256 ; 0x100 + 1f42374: e58d3034 str r3, [sp, #52] ; 0x34 + 1f42378: ba000163 blt 1f4290c <_svfprintf_r+0x1da4> + 1f4237c: e3a03047 mov r3, #71 ; 0x47 + 1f42380: e58d3008 str r3, [sp, #8] + 1f42384: e3a03001 mov r3, #1 + 1f42388: eeb0ab48 vmov.f64 d10, d8 + 1f4238c: e3a07000 mov r7, #0 + 1f42390: e58d3014 str r3, [sp, #20] + 1f42394: e28d2074 add r2, sp, #116 ; 0x74 + 1f42398: e28d3068 add r3, sp, #104 ; 0x68 + 1f4239c: e58d2004 str r2, [sp, #4] + 1f423a0: e58d3000 str r3, [sp] + 1f423a4: e59d2014 ldr r2, [sp, #20] + 1f423a8: e28d3064 add r3, sp, #100 ; 0x64 + 1f423ac: e3a01002 mov r1, #2 + 1f423b0: eeb00b4a vmov.f64 d0, d10 + 1f423b4: e59d001c ldr r0, [sp, #28] + 1f423b8: eb000c64 bl 1f45550 <_dtoa_r> + 1f423bc: e59d3008 ldr r3, [sp, #8] + 1f423c0: e3530047 cmp r3, #71 ; 0x47 + 1f423c4: e58d0030 str r0, [sp, #48] ; 0x30 + 1f423c8: 159d4014 ldrne r4, [sp, #20] + 1f423cc: 1a000020 bne 1f42454 <_svfprintf_r+0x18ec> + 1f423d0: e3150001 tst r5, #1 + 1f423d4: 059d3074 ldreq r3, [sp, #116] ; 0x74 + 1f423d8: 0a00002d beq 1f42494 <_svfprintf_r+0x192c> + 1f423dc: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f423e0: e59d2014 ldr r2, [sp, #20] + 1f423e4: e0834002 add r4, r3, r2 + 1f423e8: ea00001b b 1f4245c <_svfprintf_r+0x18f4> + 1f423ec: ee183a90 vmov r3, s17 + 1f423f0: e3530000 cmp r3, #0 + 1f423f4: e3853c01 orr r3, r5, #256 ; 0x100 + 1f423f8: e58d3034 str r3, [sp, #52] ; 0x34 + 1f423fc: ba000146 blt 1f4291c <_svfprintf_r+0x1db4> + 1f42400: e59d3008 ldr r3, [sp, #8] + 1f42404: e3530046 cmp r3, #70 ; 0x46 + 1f42408: 0a00023d beq 1f42d04 <_svfprintf_r+0x219c> + 1f4240c: eeb0ab48 vmov.f64 d10, d8 + 1f42410: e3a07000 mov r7, #0 + 1f42414: e59d3008 ldr r3, [sp, #8] + 1f42418: e3530045 cmp r3, #69 ; 0x45 + 1f4241c: 1affffdc bne 1f42394 <_svfprintf_r+0x182c> + 1f42420: e59d3014 ldr r3, [sp, #20] + 1f42424: e28d1074 add r1, sp, #116 ; 0x74 + 1f42428: e2834001 add r4, r3, #1 + 1f4242c: e28d3068 add r3, sp, #104 ; 0x68 + 1f42430: e58d1004 str r1, [sp, #4] + 1f42434: e58d3000 str r3, [sp] + 1f42438: e1a02004 mov r2, r4 + 1f4243c: e28d3064 add r3, sp, #100 ; 0x64 + 1f42440: e3a01002 mov r1, #2 + 1f42444: eeb00b4a vmov.f64 d0, d10 + 1f42448: e59d001c ldr r0, [sp, #28] + 1f4244c: eb000c3f bl 1f45550 <_dtoa_r> + 1f42450: e58d0030 str r0, [sp, #48] ; 0x30 + 1f42454: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f42458: e0834004 add r4, r3, r4 + 1f4245c: eeb5ab40 vcmp.f64 d10, #0.0 + 1f42460: eef1fa10 vmrs APSR_nzcv, fpscr + 1f42464: 01a03004 moveq r3, r4 + 1f42468: 0a000009 beq 1f42494 <_svfprintf_r+0x192c> + 1f4246c: e59d3074 ldr r3, [sp, #116] ; 0x74 + 1f42470: e1540003 cmp r4, r3 + 1f42474: 9a000006 bls 1f42494 <_svfprintf_r+0x192c> + 1f42478: e3a01030 mov r1, #48 ; 0x30 + 1f4247c: e2832001 add r2, r3, #1 + 1f42480: e58d2074 str r2, [sp, #116] ; 0x74 + 1f42484: e5c31000 strb r1, [r3] + 1f42488: e59d3074 ldr r3, [sp, #116] ; 0x74 + 1f4248c: e1540003 cmp r4, r3 + 1f42490: 8afffff9 bhi 1f4247c <_svfprintf_r+0x1914> + 1f42494: e59d2008 ldr r2, [sp, #8] + 1f42498: e3520047 cmp r2, #71 ; 0x47 + 1f4249c: e59d2030 ldr r2, [sp, #48] ; 0x30 + 1f424a0: e0623003 rsb r3, r2, r3 + 1f424a4: e58d3040 str r3, [sp, #64] ; 0x40 + 1f424a8: e59d3064 ldr r3, [sp, #100] ; 0x64 + 1f424ac: 1a000152 bne 1f429fc <_svfprintf_r+0x1e94> + 1f424b0: e3730003 cmn r3, #3 + 1f424b4: a3a02000 movge r2, #0 + 1f424b8: b3a02001 movlt r2, #1 + 1f424bc: e59d1014 ldr r1, [sp, #20] + 1f424c0: e1530001 cmp r3, r1 + 1f424c4: c3822001 orrgt r2, r2, #1 + 1f424c8: e3520000 cmp r2, #0 + 1f424cc: 12466002 subne r6, r6, #2 + 1f424d0: 1a000186 bne 1f42af0 <_svfprintf_r+0x1f88> + 1f424d4: e58d303c str r3, [sp, #60] ; 0x3c + 1f424d8: e59d2040 ldr r2, [sp, #64] ; 0x40 + 1f424dc: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f424e0: e1520003 cmp r2, r3 + 1f424e4: ca0001b9 bgt 1f42bd0 <_svfprintf_r+0x2068> + 1f424e8: e3150001 tst r5, #1 + 1f424ec: 01a02003 moveq r2, r3 + 1f424f0: e3a06067 mov r6, #103 ; 0x67 + 1f424f4: 159d303c ldrne r3, [sp, #60] ; 0x3c + 1f424f8: 159d2048 ldrne r2, [sp, #72] ; 0x48 + 1f424fc: 058d2028 streq r2, [sp, #40] ; 0x28 + 1f42500: 10833002 addne r3, r3, r2 + 1f42504: 158d3028 strne r3, [sp, #40] ; 0x28 + 1f42508: 01c33fc3 biceq r3, r3, r3, asr #31 + 1f4250c: 11c33fc3 bicne r3, r3, r3, asr #31 + 1f42510: e3570000 cmp r7, #0 + 1f42514: 1a00012c bne 1f429cc <_svfprintf_r+0x1e64> + 1f42518: e58d7014 str r7, [sp, #20] + 1f4251c: e58d3008 str r3, [sp, #8] + 1f42520: e59d5034 ldr r5, [sp, #52] ; 0x34 + 1f42524: e5dd705f ldrb r7, [sp, #95] ; 0x5f + 1f42528: eafffaa4 b 1f40fc0 <_svfprintf_r+0x458> + 1f4252c: e3150040 tst r5, #64 ; 0x40 + 1f42530: 0a000094 beq 1f42788 <_svfprintf_r+0x1c20> + 1f42534: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f42538: e1d320b0 ldrh r2, [r3] + 1f4253c: e2833004 add r3, r3, #4 + 1f42540: e58d302c str r3, [sp, #44] ; 0x2c + 1f42544: e3a03000 mov r3, #0 + 1f42548: eafffbfe b 1f41548 <_svfprintf_r+0x9e0> + 1f4254c: e2153040 ands r3, r5, #64 ; 0x40 + 1f42550: 0a00000e beq 1f42590 <_svfprintf_r+0x1a28> + 1f42554: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f42558: e59d0014 ldr r0, [sp, #20] + 1f4255c: e1d310b0 ldrh r1, [r3] + 1f42560: e3500000 cmp r0, #0 + 1f42564: e5cd205f strb r2, [sp, #95] ; 0x5f + 1f42568: e2834004 add r4, r3, #4 + 1f4256c: e1a02001 mov r2, r1 + 1f42570: e3a03000 mov r3, #0 + 1f42574: ba00000d blt 1f425b0 <_svfprintf_r+0x1a48> + 1f42578: e3510000 cmp r1, #0 + 1f4257c: 03500000 cmpeq r0, #0 + 1f42580: e58d402c str r4, [sp, #44] ; 0x2c + 1f42584: e3c55080 bic r5, r5, #128 ; 0x80 + 1f42588: 0afffba8 beq 1f41430 <_svfprintf_r+0x8c8> + 1f4258c: eafffb19 b 1f411f8 <_svfprintf_r+0x690> + 1f42590: e59d0014 ldr r0, [sp, #20] + 1f42594: e59d102c ldr r1, [sp, #44] ; 0x2c + 1f42598: e3500000 cmp r0, #0 + 1f4259c: e5cd305f strb r3, [sp, #95] ; 0x5f + 1f425a0: e5912000 ldr r2, [r1] + 1f425a4: e2814004 add r4, r1, #4 + 1f425a8: e3a03000 mov r3, #0 + 1f425ac: aa000072 bge 1f4277c <_svfprintf_r+0x1c14> + 1f425b0: e58d402c str r4, [sp, #44] ; 0x2c + 1f425b4: eafffb0f b 1f411f8 <_svfprintf_r+0x690> + 1f425b8: e3150010 tst r5, #16 + 1f425bc: 1a000008 bne 1f425e4 <_svfprintf_r+0x1a7c> + 1f425c0: e3150040 tst r5, #64 ; 0x40 + 1f425c4: 0a000006 beq 1f425e4 <_svfprintf_r+0x1a7c> + 1f425c8: e59d202c ldr r2, [sp, #44] ; 0x2c + 1f425cc: e5923000 ldr r3, [r2] + 1f425d0: e2822004 add r2, r2, #4 + 1f425d4: e58d202c str r2, [sp, #44] ; 0x2c + 1f425d8: e1dd22b0 ldrh r2, [sp, #32] + 1f425dc: e1c320b0 strh r2, [r3] + 1f425e0: eafff980 b 1f40be8 <_svfprintf_r+0x80> + 1f425e4: e59d202c ldr r2, [sp, #44] ; 0x2c + 1f425e8: e5923000 ldr r3, [r2] + 1f425ec: e2822004 add r2, r2, #4 + 1f425f0: e58d202c str r2, [sp, #44] ; 0x2c + 1f425f4: e59d2020 ldr r2, [sp, #32] + 1f425f8: e5832000 str r2, [r3] + 1f425fc: eafff979 b 1f40be8 <_svfprintf_r+0x80> + 1f42600: 13a03001 movne r3, #1 + 1f42604: 03a03000 moveq r3, #0 + 1f42608: e3510000 cmp r1, #0 + 1f4260c: 13833001 orrne r3, r3, #1 + 1f42610: e3530000 cmp r3, #0 + 1f42614: e58d002c str r0, [sp, #44] ; 0x2c + 1f42618: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4261c: 1afffe84 bne 1f42034 <_svfprintf_r+0x14cc> + 1f42620: eafffb26 b 1f412c0 <_svfprintf_r+0x758> + 1f42624: e59f1784 ldr r1, [pc, #1924] ; 1f42db0 <_svfprintf_r+0x2248> + 1f42628: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f4262c: e58d1034 str r1, [sp, #52] ; 0x34 + 1f42630: eafffc85 b 1f4184c <_svfprintf_r+0xce4> + 1f42634: e28d207c add r2, sp, #124 ; 0x7c + 1f42638: e59d1018 ldr r1, [sp, #24] + 1f4263c: e59d001c ldr r0, [sp, #28] + 1f42640: eb0017b7 bl 1f48524 <__ssprint_r> + 1f42644: e3500000 cmp r0, #0 + 1f42648: 1afffa06 bne 1f40e68 <_svfprintf_r+0x300> + 1f4264c: e1a0800b mov r8, fp + 1f42650: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f42654: eafffcef b 1f41a18 <_svfprintf_r+0xeb0> + 1f42658: e3a01001 mov r1, #1 + 1f4265c: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f42660: e59f074c ldr r0, [pc, #1868] ; 1f42db4 <_svfprintf_r+0x224c> + 1f42664: e0822001 add r2, r2, r1 + 1f42668: e0833001 add r3, r3, r1 + 1f4266c: e3520007 cmp r2, #7 + 1f42670: e5880000 str r0, [r8] + 1f42674: e5881004 str r1, [r8, #4] + 1f42678: e58d3084 str r3, [sp, #132] ; 0x84 + 1f4267c: e58d2080 str r2, [sp, #128] ; 0x80 + 1f42680: d2888008 addle r8, r8, #8 + 1f42684: ca000077 bgt 1f42868 <_svfprintf_r+0x1d00> + 1f42688: e59d2040 ldr r2, [sp, #64] ; 0x40 + 1f4268c: e1922004 orrs r2, r2, r4 + 1f42690: 0a000071 beq 1f4285c <_svfprintf_r+0x1cf4> + 1f42694: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f42698: e59d1048 ldr r1, [sp, #72] ; 0x48 + 1f4269c: e2822001 add r2, r2, #1 + 1f426a0: e59d004c ldr r0, [sp, #76] ; 0x4c + 1f426a4: e0813003 add r3, r1, r3 + 1f426a8: e3520007 cmp r2, #7 + 1f426ac: e8880003 stm r8, {r0, r1} + 1f426b0: e58d3084 str r3, [sp, #132] ; 0x84 + 1f426b4: e58d2080 str r2, [sp, #128] ; 0x80 + 1f426b8: d2888008 addle r8, r8, #8 + 1f426bc: ca0000b7 bgt 1f429a0 <_svfprintf_r+0x1e38> + 1f426c0: e2644000 rsb r4, r4, #0 + 1f426c4: e3540000 cmp r4, #0 + 1f426c8: da000084 ble 1f428e0 <_svfprintf_r+0x1d78> + 1f426cc: e3540010 cmp r4, #16 + 1f426d0: d59f16d8 ldrle r1, [pc, #1752] ; 1f42db0 <_svfprintf_r+0x2248> + 1f426d4: d58d1034 strle r1, [sp, #52] ; 0x34 + 1f426d8: da00006e ble 1f42898 <_svfprintf_r+0x1d30> + 1f426dc: e59f16cc ldr r1, [pc, #1740] ; 1f42db0 <_svfprintf_r+0x2248> + 1f426e0: e58d1034 str r1, [sp, #52] ; 0x34 + 1f426e4: e1a01008 mov r1, r8 + 1f426e8: e1a08004 mov r8, r4 + 1f426ec: e28d4018 add r4, sp, #24 + 1f426f0: e3a06010 mov r6, #16 + 1f426f4: e8940090 ldm r4, {r4, r7} + 1f426f8: ea000002 b 1f42708 <_svfprintf_r+0x1ba0> + 1f426fc: e2488010 sub r8, r8, #16 + 1f42700: e3580010 cmp r8, #16 + 1f42704: da000061 ble 1f42890 <_svfprintf_r+0x1d28> + 1f42708: e2822001 add r2, r2, #1 + 1f4270c: e3520007 cmp r2, #7 + 1f42710: e2833010 add r3, r3, #16 + 1f42714: e5819000 str r9, [r1] + 1f42718: e5816004 str r6, [r1, #4] + 1f4271c: e58d2080 str r2, [sp, #128] ; 0x80 + 1f42720: e58d3084 str r3, [sp, #132] ; 0x84 + 1f42724: d2811008 addle r1, r1, #8 + 1f42728: dafffff3 ble 1f426fc <_svfprintf_r+0x1b94> + 1f4272c: e28d207c add r2, sp, #124 ; 0x7c + 1f42730: e1a01004 mov r1, r4 + 1f42734: e1a00007 mov r0, r7 + 1f42738: eb001779 bl 1f48524 <__ssprint_r> + 1f4273c: e3500000 cmp r0, #0 + 1f42740: 1afff9c8 bne 1f40e68 <_svfprintf_r+0x300> + 1f42744: e28d2080 add r2, sp, #128 ; 0x80 + 1f42748: e1a0100b mov r1, fp + 1f4274c: e892000c ldm r2, {r2, r3} + 1f42750: eaffffe9 b 1f426fc <_svfprintf_r+0x1b94> + 1f42754: e1a07003 mov r7, r3 + 1f42758: e060300b rsb r3, r0, fp + 1f4275c: e58d3028 str r3, [sp, #40] ; 0x28 + 1f42760: e58d0030 str r0, [sp, #48] ; 0x30 + 1f42764: eafffa0e b 1f40fa4 <_svfprintf_r+0x43c> + 1f42768: e3855002 orr r5, r5, #2 + 1f4276c: e58d402c str r4, [sp, #44] ; 0x2c + 1f42770: e1a06000 mov r6, r0 + 1f42774: e59fc63c ldr ip, [pc, #1596] ; 1f42db8 <_svfprintf_r+0x2250> + 1f42778: eafffaed b 1f41334 <_svfprintf_r+0x7cc> + 1f4277c: e1821003 orr r1, r2, r3 + 1f42780: e59d0014 ldr r0, [sp, #20] + 1f42784: eaffff7b b 1f42578 <_svfprintf_r+0x1a10> + 1f42788: e59d102c ldr r1, [sp, #44] ; 0x2c + 1f4278c: e5912000 ldr r2, [r1] + 1f42790: e2811004 add r1, r1, #4 + 1f42794: e3a03000 mov r3, #0 + 1f42798: e58d102c str r1, [sp, #44] ; 0x2c + 1f4279c: eafffb69 b 1f41548 <_svfprintf_r+0x9e0> + 1f427a0: e59d202c ldr r2, [sp, #44] ; 0x2c + 1f427a4: e59d1014 ldr r1, [sp, #20] + 1f427a8: e5923000 ldr r3, [r2] + 1f427ac: e3510000 cmp r1, #0 + 1f427b0: e2824004 add r4, r2, #4 + 1f427b4: e1a01003 mov r1, r3 + 1f427b8: e3a02000 mov r2, #0 + 1f427bc: e5cd005f strb r0, [sp, #95] ; 0x5f + 1f427c0: e58d1008 str r1, [sp, #8] + 1f427c4: e58d200c str r2, [sp, #12] + 1f427c8: b58d402c strlt r4, [sp, #44] ; 0x2c + 1f427cc: b1a07000 movlt r7, r0 + 1f427d0: bafffdac blt 1f41e88 <_svfprintf_r+0x1320> + 1f427d4: e28d3008 add r3, sp, #8 + 1f427d8: e893000c ldm r3, {r2, r3} + 1f427dc: e1823003 orr r3, r2, r3 + 1f427e0: e59d2014 ldr r2, [sp, #20] + 1f427e4: e3530000 cmp r3, #0 + 1f427e8: 03520000 cmpeq r2, #0 + 1f427ec: e58d402c str r4, [sp, #44] ; 0x2c + 1f427f0: 13a03001 movne r3, #1 + 1f427f4: 03a03000 moveq r3, #0 + 1f427f8: e3c55080 bic r5, r5, #128 ; 0x80 + 1f427fc: 0afffaaf beq 1f412c0 <_svfprintf_r+0x758> + 1f42800: e1a07000 mov r7, r0 + 1f42804: eafffd9f b 1f41e88 <_svfprintf_r+0x1320> + 1f42808: e28d207c add r2, sp, #124 ; 0x7c + 1f4280c: e59d1018 ldr r1, [sp, #24] + 1f42810: e59d001c ldr r0, [sp, #28] + 1f42814: eb001742 bl 1f48524 <__ssprint_r> + 1f42818: e3500000 cmp r0, #0 + 1f4281c: 1afff991 bne 1f40e68 <_svfprintf_r+0x300> + 1f42820: e1a0800b mov r8, fp + 1f42824: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f42828: eafffc8b b 1f41a5c <_svfprintf_r+0xef4> + 1f4282c: e3a01040 mov r1, #64 ; 0x40 + 1f42830: e59d001c ldr r0, [sp, #28] + 1f42834: ebffef5b bl 1f3e5a8 <_malloc_r> + 1f42838: e59d3018 ldr r3, [sp, #24] + 1f4283c: e3500000 cmp r0, #0 + 1f42840: e5830000 str r0, [r3] + 1f42844: e5830010 str r0, [r3, #16] + 1f42848: 0a000153 beq 1f42d9c <_svfprintf_r+0x2234> + 1f4284c: e3a03040 mov r3, #64 ; 0x40 + 1f42850: e59d2018 ldr r2, [sp, #24] + 1f42854: e5823014 str r3, [r2, #20] + 1f42858: eafff8d6 b 1f40bb8 <_svfprintf_r+0x50> + 1f4285c: e3150001 tst r5, #1 + 1f42860: 0afffc17 beq 1f418c4 <_svfprintf_r+0xd5c> + 1f42864: eaffff8a b 1f42694 <_svfprintf_r+0x1b2c> + 1f42868: e28d207c add r2, sp, #124 ; 0x7c + 1f4286c: e59d1018 ldr r1, [sp, #24] + 1f42870: e59d001c ldr r0, [sp, #28] + 1f42874: eb00172a bl 1f48524 <__ssprint_r> + 1f42878: e3500000 cmp r0, #0 + 1f4287c: 1afff979 bne 1f40e68 <_svfprintf_r+0x300> + 1f42880: e1a0800b mov r8, fp + 1f42884: e59d4064 ldr r4, [sp, #100] ; 0x64 + 1f42888: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f4288c: eaffff7d b 1f42688 <_svfprintf_r+0x1b20> + 1f42890: e1a04008 mov r4, r8 + 1f42894: e1a08001 mov r8, r1 + 1f42898: e2822001 add r2, r2, #1 + 1f4289c: e59d1034 ldr r1, [sp, #52] ; 0x34 + 1f428a0: e3520007 cmp r2, #7 + 1f428a4: e0833004 add r3, r3, r4 + 1f428a8: e8880012 stm r8, {r1, r4} + 1f428ac: e58d2080 str r2, [sp, #128] ; 0x80 + 1f428b0: e58d3084 str r3, [sp, #132] ; 0x84 + 1f428b4: d2888008 addle r8, r8, #8 + 1f428b8: da000008 ble 1f428e0 <_svfprintf_r+0x1d78> + 1f428bc: e28d207c add r2, sp, #124 ; 0x7c + 1f428c0: e59d1018 ldr r1, [sp, #24] + 1f428c4: e59d001c ldr r0, [sp, #28] + 1f428c8: eb001715 bl 1f48524 <__ssprint_r> + 1f428cc: e3500000 cmp r0, #0 + 1f428d0: 1afff964 bne 1f40e68 <_svfprintf_r+0x300> + 1f428d4: e1a0800b mov r8, fp + 1f428d8: e28d2080 add r2, sp, #128 ; 0x80 + 1f428dc: e892000c ldm r2, {r2, r3} + 1f428e0: e2822001 add r2, r2, #1 + 1f428e4: e59d1040 ldr r1, [sp, #64] ; 0x40 + 1f428e8: e3520007 cmp r2, #7 + 1f428ec: e58d2080 str r2, [sp, #128] ; 0x80 + 1f428f0: e59d2030 ldr r2, [sp, #48] ; 0x30 + 1f428f4: e0813003 add r3, r1, r3 + 1f428f8: e58d3084 str r3, [sp, #132] ; 0x84 + 1f428fc: e5882000 str r2, [r8] + 1f42900: e5881004 str r1, [r8, #4] + 1f42904: dafffbed ble 1f418c0 <_svfprintf_r+0xd58> + 1f42908: eafffd19 b 1f41d74 <_svfprintf_r+0x120c> + 1f4290c: e3a03047 mov r3, #71 ; 0x47 + 1f42910: e58d3008 str r3, [sp, #8] + 1f42914: e3a03001 mov r3, #1 + 1f42918: e58d3014 str r3, [sp, #20] + 1f4291c: e59d3008 ldr r3, [sp, #8] + 1f42920: e3530046 cmp r3, #70 ; 0x46 + 1f42924: eeb1ab48 vneg.f64 d10, d8 + 1f42928: 1a000119 bne 1f42d94 <_svfprintf_r+0x222c> + 1f4292c: e28d2074 add r2, sp, #116 ; 0x74 + 1f42930: e28d3068 add r3, sp, #104 ; 0x68 + 1f42934: e58d2004 str r2, [sp, #4] + 1f42938: e58d3000 str r3, [sp] + 1f4293c: e59d2014 ldr r2, [sp, #20] + 1f42940: e28d3064 add r3, sp, #100 ; 0x64 + 1f42944: e3a01003 mov r1, #3 + 1f42948: eeb00b4a vmov.f64 d0, d10 + 1f4294c: e59d001c ldr r0, [sp, #28] + 1f42950: eb000afe bl 1f45550 <_dtoa_r> + 1f42954: e3a0702d mov r7, #45 ; 0x2d + 1f42958: e58d0030 str r0, [sp, #48] ; 0x30 + 1f4295c: eeb5ab40 vcmp.f64 d10, #0.0 + 1f42960: eef1fa10 vmrs APSR_nzcv, fpscr + 1f42964: 13a03001 movne r3, #1 + 1f42968: 03a03000 moveq r3, #0 + 1f4296c: e59d2030 ldr r2, [sp, #48] ; 0x30 + 1f42970: e5d22000 ldrb r2, [r2] + 1f42974: e3520030 cmp r2, #48 ; 0x30 + 1f42978: 13a03000 movne r3, #0 + 1f4297c: 02033001 andeq r3, r3, #1 + 1f42980: e3530000 cmp r3, #0 + 1f42984: 0a0000a3 beq 1f42c18 <_svfprintf_r+0x20b0> + 1f42988: e59d3014 ldr r3, [sp, #20] + 1f4298c: e2633001 rsb r3, r3, #1 + 1f42990: e58d3064 str r3, [sp, #100] ; 0x64 + 1f42994: e59d2014 ldr r2, [sp, #20] + 1f42998: e0834002 add r4, r3, r2 + 1f4299c: eafffeac b 1f42454 <_svfprintf_r+0x18ec> + 1f429a0: e28d207c add r2, sp, #124 ; 0x7c + 1f429a4: e59d1018 ldr r1, [sp, #24] + 1f429a8: e59d001c ldr r0, [sp, #28] + 1f429ac: eb0016dc bl 1f48524 <__ssprint_r> + 1f429b0: e3500000 cmp r0, #0 + 1f429b4: 1afff92b bne 1f40e68 <_svfprintf_r+0x300> + 1f429b8: e28d2080 add r2, sp, #128 ; 0x80 + 1f429bc: e1a0800b mov r8, fp + 1f429c0: e59d4064 ldr r4, [sp, #100] ; 0x64 + 1f429c4: e892000c ldm r2, {r2, r3} + 1f429c8: eaffff3c b 1f426c0 <_svfprintf_r+0x1b58> + 1f429cc: e3a0202d mov r2, #45 ; 0x2d + 1f429d0: e5cd205f strb r2, [sp, #95] ; 0x5f + 1f429d4: e1a07002 mov r7, r2 + 1f429d8: e3a02000 mov r2, #0 + 1f429dc: e59d5034 ldr r5, [sp, #52] ; 0x34 + 1f429e0: e58d2014 str r2, [sp, #20] + 1f429e4: eafff978 b 1f40fcc <_svfprintf_r+0x464> + 1f429e8: e59d0030 ldr r0, [sp, #48] ; 0x30 + 1f429ec: e58d7014 str r7, [sp, #20] + 1f429f0: ebfff5c6 bl 1f40110 + 1f429f4: e1a03000 mov r3, r0 + 1f429f8: eafffb05 b 1f41614 <_svfprintf_r+0xaac> + 1f429fc: e3560065 cmp r6, #101 ; 0x65 + 1f42a00: da00003a ble 1f42af0 <_svfprintf_r+0x1f88> + 1f42a04: e3560066 cmp r6, #102 ; 0x66 + 1f42a08: e58d303c str r3, [sp, #60] ; 0x3c + 1f42a0c: 1afffeb1 bne 1f424d8 <_svfprintf_r+0x1970> + 1f42a10: e3530000 cmp r3, #0 + 1f42a14: da0000ac ble 1f42ccc <_svfprintf_r+0x2164> + 1f42a18: e59d2014 ldr r2, [sp, #20] + 1f42a1c: e3520000 cmp r2, #0 + 1f42a20: 1a0000a1 bne 1f42cac <_svfprintf_r+0x2144> + 1f42a24: e3150001 tst r5, #1 + 1f42a28: 1a00009f bne 1f42cac <_svfprintf_r+0x2144> + 1f42a2c: e1a02003 mov r2, r3 + 1f42a30: e1c33fc3 bic r3, r3, r3, asr #31 + 1f42a34: e58d2028 str r2, [sp, #40] ; 0x28 + 1f42a38: eafffeb4 b 1f42510 <_svfprintf_r+0x19a8> + 1f42a3c: e59f3378 ldr r3, [pc, #888] ; 1f42dbc <_svfprintf_r+0x2254> + 1f42a40: e59d1084 ldr r1, [sp, #132] ; 0x84 + 1f42a44: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f42a48: e58d3044 str r3, [sp, #68] ; 0x44 + 1f42a4c: eafff997 b 1f410b0 <_svfprintf_r+0x548> + 1f42a50: e28d207c add r2, sp, #124 ; 0x7c + 1f42a54: e59d1018 ldr r1, [sp, #24] + 1f42a58: e59d001c ldr r0, [sp, #28] + 1f42a5c: eb0016b0 bl 1f48524 <__ssprint_r> + 1f42a60: e3500000 cmp r0, #0 + 1f42a64: 1afff8ff bne 1f40e68 <_svfprintf_r+0x300> + 1f42a68: e1a0800b mov r8, fp + 1f42a6c: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f42a70: eafffcdc b 1f41de8 <_svfprintf_r+0x1280> + 1f42a74: e28d207c add r2, sp, #124 ; 0x7c + 1f42a78: e59d1018 ldr r1, [sp, #24] + 1f42a7c: e59d001c ldr r0, [sp, #28] + 1f42a80: eb0016a7 bl 1f48524 <__ssprint_r> + 1f42a84: e3500000 cmp r0, #0 + 1f42a88: 1afff8f6 bne 1f40e68 <_svfprintf_r+0x300> + 1f42a8c: e59d2064 ldr r2, [sp, #100] ; 0x64 + 1f42a90: e59d1040 ldr r1, [sp, #64] ; 0x40 + 1f42a94: e59d3084 ldr r3, [sp, #132] ; 0x84 + 1f42a98: e0622001 rsb r2, r2, r1 + 1f42a9c: e1a0800b mov r8, fp + 1f42aa0: eafffd96 b 1f42100 <_svfprintf_r+0x1598> + 1f42aa4: e3530006 cmp r3, #6 + 1f42aa8: 23a03006 movcs r3, #6 + 1f42aac: e58d3028 str r3, [sp, #40] ; 0x28 + 1f42ab0: e1c33fc3 bic r3, r3, r3, asr #31 + 1f42ab4: e58d3008 str r3, [sp, #8] + 1f42ab8: e59f3300 ldr r3, [pc, #768] ; 1f42dc0 <_svfprintf_r+0x2258> + 1f42abc: e58d402c str r4, [sp, #44] ; 0x2c + 1f42ac0: e58d3030 str r3, [sp, #48] ; 0x30 + 1f42ac4: eafffa6c b 1f4147c <_svfprintf_r+0x914> + 1f42ac8: e59f12ec ldr r1, [pc, #748] ; 1f42dbc <_svfprintf_r+0x2254> + 1f42acc: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f42ad0: e58d1044 str r1, [sp, #68] ; 0x44 + 1f42ad4: eafffba2 b 1f41964 <_svfprintf_r+0xdfc> + 1f42ad8: e58d402c str r4, [sp, #44] ; 0x2c + 1f42adc: eafffaed b 1f41698 <_svfprintf_r+0xb30> + 1f42ae0: e3a0302d mov r3, #45 ; 0x2d + 1f42ae4: e1a07003 mov r7, r3 + 1f42ae8: e5cd305f strb r3, [sp, #95] ; 0x5f + 1f42aec: eafff98f b 1f41130 <_svfprintf_r+0x5c8> + 1f42af0: e2433001 sub r3, r3, #1 + 1f42af4: e3530000 cmp r3, #0 + 1f42af8: b3a0202d movlt r2, #45 ; 0x2d + 1f42afc: a3a0202b movge r2, #43 ; 0x2b + 1f42b00: e58d3064 str r3, [sp, #100] ; 0x64 + 1f42b04: b2633000 rsblt r3, r3, #0 + 1f42b08: e3530009 cmp r3, #9 + 1f42b0c: e5cd606c strb r6, [sp, #108] ; 0x6c + 1f42b10: e5cd206d strb r2, [sp, #109] ; 0x6d + 1f42b14: da00004a ble 1f42c44 <_svfprintf_r+0x20dc> + 1f42b18: e28dc07b add ip, sp, #123 ; 0x7b + 1f42b1c: e1a0000c mov r0, ip + 1f42b20: e59f129c ldr r1, [pc, #668] ; 1f42dc4 <_svfprintf_r+0x225c> + 1f42b24: e0c12193 smull r2, r1, r3, r1 + 1f42b28: e1a02fc3 asr r2, r3, #31 + 1f42b2c: e0621141 rsb r1, r2, r1, asr #2 + 1f42b30: e0812101 add r2, r1, r1, lsl #2 + 1f42b34: e0432082 sub r2, r3, r2, lsl #1 + 1f42b38: e2822030 add r2, r2, #48 ; 0x30 + 1f42b3c: e3510009 cmp r1, #9 + 1f42b40: e1a03001 mov r3, r1 + 1f42b44: e5602001 strb r2, [r0, #-1]! + 1f42b48: cafffff4 bgt 1f42b20 <_svfprintf_r+0x1fb8> + 1f42b4c: e1a01000 mov r1, r0 + 1f42b50: e2833030 add r3, r3, #48 ; 0x30 + 1f42b54: e20320ff and r2, r3, #255 ; 0xff + 1f42b58: e5612001 strb r2, [r1, #-1]! + 1f42b5c: e15c0001 cmp ip, r1 + 1f42b60: 9a000089 bls 1f42d8c <_svfprintf_r+0x2224> + 1f42b64: e28d106e add r1, sp, #110 ; 0x6e + 1f42b68: e1a03000 mov r3, r0 + 1f42b6c: ea000000 b 1f42b74 <_svfprintf_r+0x200c> + 1f42b70: e4d32001 ldrb r2, [r3], #1 + 1f42b74: e153000c cmp r3, ip + 1f42b78: e4c12001 strb r2, [r1], #1 + 1f42b7c: 1afffffb bne 1f42b70 <_svfprintf_r+0x2008> + 1f42b80: e2833001 add r3, r3, #1 + 1f42b84: e0600003 rsb r0, r0, r3 + 1f42b88: e28d306e add r3, sp, #110 ; 0x6e + 1f42b8c: e0830000 add r0, r3, r0 + 1f42b90: e59d2040 ldr r2, [sp, #64] ; 0x40 + 1f42b94: e28d306c add r3, sp, #108 ; 0x6c + 1f42b98: e0633000 rsb r3, r3, r0 + 1f42b9c: e58d3054 str r3, [sp, #84] ; 0x54 + 1f42ba0: e3520001 cmp r2, #1 + 1f42ba4: e0823003 add r3, r2, r3 + 1f42ba8: e58d3028 str r3, [sp, #40] ; 0x28 + 1f42bac: da000062 ble 1f42d3c <_svfprintf_r+0x21d4> + 1f42bb0: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f42bb4: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f42bb8: e0833002 add r3, r3, r2 + 1f42bbc: e3a02000 mov r2, #0 + 1f42bc0: e58d3028 str r3, [sp, #40] ; 0x28 + 1f42bc4: e58d203c str r2, [sp, #60] ; 0x3c + 1f42bc8: e1c33fc3 bic r3, r3, r3, asr #31 + 1f42bcc: eafffe4f b 1f42510 <_svfprintf_r+0x19a8> + 1f42bd0: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f42bd4: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f42bd8: e3530000 cmp r3, #0 + 1f42bdc: e59d3040 ldr r3, [sp, #64] ; 0x40 + 1f42be0: e0833002 add r3, r3, r2 + 1f42be4: e58d3028 str r3, [sp, #40] ; 0x28 + 1f42be8: d59d303c ldrle r3, [sp, #60] ; 0x3c + 1f42bec: d59d2028 ldrle r2, [sp, #40] ; 0x28 + 1f42bf0: d2633001 rsble r3, r3, #1 + 1f42bf4: d0823003 addle r3, r2, r3 + 1f42bf8: d58d3028 strle r3, [sp, #40] ; 0x28 + 1f42bfc: e3a06067 mov r6, #103 ; 0x67 + 1f42c00: e1c33fc3 bic r3, r3, r3, asr #31 + 1f42c04: eafffe41 b 1f42510 <_svfprintf_r+0x19a8> + 1f42c08: e59f11a0 ldr r1, [pc, #416] ; 1f42db0 <_svfprintf_r+0x2248> + 1f42c0c: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f42c10: e58d1034 str r1, [sp, #52] ; 0x34 + 1f42c14: eafffbe5 b 1f41bb0 <_svfprintf_r+0x1048> + 1f42c18: e59d3064 ldr r3, [sp, #100] ; 0x64 + 1f42c1c: eaffff5c b 1f42994 <_svfprintf_r+0x1e2c> + 1f42c20: e59d3014 ldr r3, [sp, #20] + 1f42c24: e1c32fc3 bic r2, r3, r3, asr #31 + 1f42c28: e58d2008 str r2, [sp, #8] + 1f42c2c: e58d3028 str r3, [sp, #40] ; 0x28 + 1f42c30: e58d0014 str r0, [sp, #20] + 1f42c34: e58d402c str r4, [sp, #44] ; 0x2c + 1f42c38: e58d003c str r0, [sp, #60] ; 0x3c + 1f42c3c: e5dd705f ldrb r7, [sp, #95] ; 0x5f + 1f42c40: eafff8de b 1f40fc0 <_svfprintf_r+0x458> + 1f42c44: e3a02030 mov r2, #48 ; 0x30 + 1f42c48: e0833002 add r3, r3, r2 + 1f42c4c: e5cd306f strb r3, [sp, #111] ; 0x6f + 1f42c50: e5cd206e strb r2, [sp, #110] ; 0x6e + 1f42c54: e28d0070 add r0, sp, #112 ; 0x70 + 1f42c58: eaffffcc b 1f42b90 <_svfprintf_r+0x2028> + 1f42c5c: e59f114c ldr r1, [pc, #332] ; 1f42db0 <_svfprintf_r+0x2248> + 1f42c60: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f42c64: e58d1034 str r1, [sp, #52] ; 0x34 + 1f42c68: eafffc39 b 1f41d54 <_svfprintf_r+0x11ec> + 1f42c6c: e3a03003 mov r3, #3 + 1f42c70: e1a01003 mov r1, r3 + 1f42c74: e58d3008 str r3, [sp, #8] + 1f42c78: e3a03000 mov r3, #0 + 1f42c7c: e1a00003 mov r0, r3 + 1f42c80: e58d3014 str r3, [sp, #20] + 1f42c84: e59f313c ldr r3, [pc, #316] ; 1f42dc8 <_svfprintf_r+0x2260> + 1f42c88: e3560047 cmp r6, #71 ; 0x47 + 1f42c8c: e59f2138 ldr r2, [pc, #312] ; 1f42dcc <_svfprintf_r+0x2264> + 1f42c90: d1a02003 movle r2, r3 + 1f42c94: e3c55080 bic r5, r5, #128 ; 0x80 + 1f42c98: e58d1028 str r1, [sp, #40] ; 0x28 + 1f42c9c: e58d003c str r0, [sp, #60] ; 0x3c + 1f42ca0: e58d2030 str r2, [sp, #48] ; 0x30 + 1f42ca4: e5dd705f ldrb r7, [sp, #95] ; 0x5f + 1f42ca8: eafff8c4 b 1f40fc0 <_svfprintf_r+0x458> + 1f42cac: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f42cb0: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f42cb4: e0833002 add r3, r3, r2 + 1f42cb8: e59d2014 ldr r2, [sp, #20] + 1f42cbc: e0833002 add r3, r3, r2 + 1f42cc0: e58d3028 str r3, [sp, #40] ; 0x28 + 1f42cc4: e1c33fc3 bic r3, r3, r3, asr #31 + 1f42cc8: eafffe10 b 1f42510 <_svfprintf_r+0x19a8> + 1f42ccc: e59d3014 ldr r3, [sp, #20] + 1f42cd0: e3530000 cmp r3, #0 + 1f42cd4: 1a000003 bne 1f42ce8 <_svfprintf_r+0x2180> + 1f42cd8: e3150001 tst r5, #1 + 1f42cdc: 03a03001 moveq r3, #1 + 1f42ce0: 058d3028 streq r3, [sp, #40] ; 0x28 + 1f42ce4: 0afffe09 beq 1f42510 <_svfprintf_r+0x19a8> + 1f42ce8: e59d3048 ldr r3, [sp, #72] ; 0x48 + 1f42cec: e59d2014 ldr r2, [sp, #20] + 1f42cf0: e2833001 add r3, r3, #1 + 1f42cf4: e0833002 add r3, r3, r2 + 1f42cf8: e58d3028 str r3, [sp, #40] ; 0x28 + 1f42cfc: e1c33fc3 bic r3, r3, r3, asr #31 + 1f42d00: eafffe02 b 1f42510 <_svfprintf_r+0x19a8> + 1f42d04: e28d2074 add r2, sp, #116 ; 0x74 + 1f42d08: e28d3068 add r3, sp, #104 ; 0x68 + 1f42d0c: e58d2004 str r2, [sp, #4] + 1f42d10: e58d3000 str r3, [sp] + 1f42d14: e59d2014 ldr r2, [sp, #20] + 1f42d18: e28d3064 add r3, sp, #100 ; 0x64 + 1f42d1c: e3a01003 mov r1, #3 + 1f42d20: eeb00b48 vmov.f64 d0, d8 + 1f42d24: e59d001c ldr r0, [sp, #28] + 1f42d28: eb000a08 bl 1f45550 <_dtoa_r> + 1f42d2c: eeb0ab48 vmov.f64 d10, d8 + 1f42d30: e58d0030 str r0, [sp, #48] ; 0x30 + 1f42d34: e3a07000 mov r7, #0 + 1f42d38: eaffff07 b 1f4295c <_svfprintf_r+0x1df4> + 1f42d3c: e2153001 ands r3, r5, #1 + 1f42d40: 1affff9a bne 1f42bb0 <_svfprintf_r+0x2048> + 1f42d44: e58d303c str r3, [sp, #60] ; 0x3c + 1f42d48: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f42d4c: e1c33fc3 bic r3, r3, r3, asr #31 + 1f42d50: eafffdee b 1f42510 <_svfprintf_r+0x19a8> + 1f42d54: e59f1054 ldr r1, [pc, #84] ; 1f42db0 <_svfprintf_r+0x2248> + 1f42d58: e59d2080 ldr r2, [sp, #128] ; 0x80 + 1f42d5c: e58d1034 str r1, [sp, #52] ; 0x34 + 1f42d60: eafffcb9 b 1f4204c <_svfprintf_r+0x14e4> + 1f42d64: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f42d68: e593c000 ldr ip, [r3] + 1f42d6c: e58dc014 str ip, [sp, #20] + 1f42d70: e35c0000 cmp ip, #0 + 1f42d74: e283c004 add ip, r3, #4 + 1f42d78: e58dc02c str ip, [sp, #44] ; 0x2c + 1f42d7c: e5da3001 ldrb r3, [sl, #1] + 1f42d80: e1a0a001 mov sl, r1 + 1f42d84: aafff7bd bge 1f40c80 <_svfprintf_r+0x118> + 1f42d88: eafff7ba b 1f40c78 <_svfprintf_r+0x110> + 1f42d8c: e28d006e add r0, sp, #110 ; 0x6e + 1f42d90: eaffff7e b 1f42b90 <_svfprintf_r+0x2028> + 1f42d94: e3a0702d mov r7, #45 ; 0x2d + 1f42d98: eafffd9d b 1f42414 <_svfprintf_r+0x18ac> + 1f42d9c: e3a0300c mov r3, #12 + 1f42da0: e59d201c ldr r2, [sp, #28] + 1f42da4: e3e00000 mvn r0, #0 + 1f42da8: e5823000 str r3, [r2] + 1f42dac: eafff832 b 1f40e7c <_svfprintf_r+0x314> + 1f42db0: 01f62f28 .word 0x01f62f28 + 1f42db4: 01f63698 .word 0x01f63698 + 1f42db8: 01f62f0c .word 0x01f62f0c + 1f42dbc: 01f62ed8 .word 0x01f62ed8 + 1f42dc0: 01f62f20 .word 0x01f62f20 + 1f42dc4: 66666667 .word 0x66666667 + 1f42dc8: 01f62ef0 .word 0x01f62ef0 + 1f42dcc: 01f62ef4 .word 0x01f62ef4 + +01f42dd0 : + 1f42dd0: e59f3018 ldr r3, [pc, #24] ; 1f42df0 + 1f42dd4: e5933000 ldr r3, [r3] + 1f42dd8: e0833000 add r3, r3, r0 + 1f42ddc: e5d33001 ldrb r3, [r3, #1] + 1f42de0: e2033003 and r3, r3, #3 + 1f42de4: e3530002 cmp r3, #2 + 1f42de8: 02400020 subeq r0, r0, #32 + 1f42dec: e12fff1e bx lr + 1f42df0: 01f657dc .word 0x01f657dc + 1f42df4: 00000000 .word 0x00000000 + +01f42df8 <_vfprintf_r>: + 1f42df8: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f42dfc: ed2d8b06 vpush {d8-d10} + 1f42e00: e24dd0ec sub sp, sp, #236 ; 0xec + 1f42e04: e1a04003 mov r4, r3 + 1f42e08: e1a0a001 mov sl, r1 + 1f42e0c: e1a0b002 mov fp, r2 + 1f42e10: e1a05000 mov r5, r0 + 1f42e14: e58d0018 str r0, [sp, #24] + 1f42e18: eb001175 bl 1f473f4 <_localeconv_r> + 1f42e1c: e5903000 ldr r3, [r0] + 1f42e20: e1a00003 mov r0, r3 + 1f42e24: e58d3048 str r3, [sp, #72] ; 0x48 + 1f42e28: ebfff4b8 bl 1f40110 + 1f42e2c: e3550000 cmp r5, #0 + 1f42e30: e58d0044 str r0, [sp, #68] ; 0x44 + 1f42e34: e58d4028 str r4, [sp, #40] ; 0x28 + 1f42e38: 0a000002 beq 1f42e48 <_vfprintf_r+0x50> + 1f42e3c: e5953038 ldr r3, [r5, #56] ; 0x38 + 1f42e40: e3530000 cmp r3, #0 + 1f42e44: 0a0000da beq 1f431b4 <_vfprintf_r+0x3bc> + 1f42e48: e1da20fc ldrsh r2, [sl, #12] + 1f42e4c: e1a03802 lsl r3, r2, #16 + 1f42e50: e3130202 tst r3, #536870912 ; 0x20000000 + 1f42e54: e1a03823 lsr r3, r3, #16 + 1f42e58: 1a000006 bne 1f42e78 <_vfprintf_r+0x80> + 1f42e5c: e59a3064 ldr r3, [sl, #100] ; 0x64 + 1f42e60: e3822a02 orr r2, r2, #8192 ; 0x2000 + 1f42e64: e3c33a02 bic r3, r3, #8192 ; 0x2000 + 1f42e68: e1ca20bc strh r2, [sl, #12] + 1f42e6c: e1a02802 lsl r2, r2, #16 + 1f42e70: e58a3064 str r3, [sl, #100] ; 0x64 + 1f42e74: e1a03822 lsr r3, r2, #16 + 1f42e78: e3130008 tst r3, #8 + 1f42e7c: 0a0000a2 beq 1f4310c <_vfprintf_r+0x314> + 1f42e80: e59a2010 ldr r2, [sl, #16] + 1f42e84: e3520000 cmp r2, #0 + 1f42e88: 0a00009f beq 1f4310c <_vfprintf_r+0x314> + 1f42e8c: e203301a and r3, r3, #26 + 1f42e90: e353000a cmp r3, #10 + 1f42e94: 0a0000ba beq 1f43184 <_vfprintf_r+0x38c> + 1f42e98: e3a03000 mov r3, #0 + 1f42e9c: ed9f8be3 vldr d8, [pc, #908] ; 1f43230 <_vfprintf_r+0x438> + 1f42ea0: ed9f9be4 vldr d9, [pc, #912] ; 1f43238 <_vfprintf_r+0x440> + 1f42ea4: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f42ea8: e58d303c str r3, [sp, #60] ; 0x3c + 1f42eac: e58d304c str r3, [sp, #76] ; 0x4c + 1f42eb0: e58d301c str r3, [sp, #28] + 1f42eb4: e58d307c str r3, [sp, #124] ; 0x7c + 1f42eb8: e58d3078 str r3, [sp, #120] ; 0x78 + 1f42ebc: e58d8074 str r8, [sp, #116] ; 0x74 + 1f42ec0: e59f9390 ldr r9, [pc, #912] ; 1f43258 <_vfprintf_r+0x460> + 1f42ec4: e5db3000 ldrb r3, [fp] + 1f42ec8: e3530000 cmp r3, #0 + 1f42ecc: 13530025 cmpne r3, #37 ; 0x25 + 1f42ed0: e1a0400b mov r4, fp + 1f42ed4: 0a000013 beq 1f42f28 <_vfprintf_r+0x130> + 1f42ed8: e5f43001 ldrb r3, [r4, #1]! + 1f42edc: e3530000 cmp r3, #0 + 1f42ee0: 13530025 cmpne r3, #37 ; 0x25 + 1f42ee4: 1afffffb bne 1f42ed8 <_vfprintf_r+0xe0> + 1f42ee8: e054500b subs r5, r4, fp + 1f42eec: 0a00000d beq 1f42f28 <_vfprintf_r+0x130> + 1f42ef0: e59d3078 ldr r3, [sp, #120] ; 0x78 + 1f42ef4: e59d207c ldr r2, [sp, #124] ; 0x7c + 1f42ef8: e2833001 add r3, r3, #1 + 1f42efc: e3530007 cmp r3, #7 + 1f42f00: e0822005 add r2, r2, r5 + 1f42f04: e588b000 str fp, [r8] + 1f42f08: e5885004 str r5, [r8, #4] + 1f42f0c: e58d3078 str r3, [sp, #120] ; 0x78 + 1f42f10: e58d207c str r2, [sp, #124] ; 0x7c + 1f42f14: d2888008 addle r8, r8, #8 + 1f42f18: ca000083 bgt 1f4312c <_vfprintf_r+0x334> + 1f42f1c: e59d301c ldr r3, [sp, #28] + 1f42f20: e0833005 add r3, r3, r5 + 1f42f24: e58d301c str r3, [sp, #28] + 1f42f28: e5d43000 ldrb r3, [r4] + 1f42f2c: e3530000 cmp r3, #0 + 1f42f30: 0a000085 beq 1f4314c <_vfprintf_r+0x354> + 1f42f34: e3a03000 mov r3, #0 + 1f42f38: e1a02003 mov r2, r3 + 1f42f3c: e5cd3057 strb r3, [sp, #87] ; 0x57 + 1f42f40: e1a00003 mov r0, r3 + 1f42f44: e58d3020 str r3, [sp, #32] + 1f42f48: e1a05003 mov r5, r3 + 1f42f4c: e5d43001 ldrb r3, [r4, #1] + 1f42f50: e284b001 add fp, r4, #1 + 1f42f54: e3e01000 mvn r1, #0 + 1f42f58: e58d1014 str r1, [sp, #20] + 1f42f5c: e1a06003 mov r6, r3 + 1f42f60: e28bb001 add fp, fp, #1 + 1f42f64: e2463020 sub r3, r6, #32 + 1f42f68: e3530058 cmp r3, #88 ; 0x58 + 1f42f6c: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f42f70: ea00028d b 1f439ac <_vfprintf_r+0xbb4> + 1f42f74: 01f43998 .word 0x01f43998 + 1f42f78: 01f439ac .word 0x01f439ac + 1f42f7c: 01f439ac .word 0x01f439ac + 1f42f80: 01f438b0 .word 0x01f438b0 + 1f42f84: 01f439ac .word 0x01f439ac + 1f42f88: 01f439ac .word 0x01f439ac + 1f42f8c: 01f439ac .word 0x01f439ac + 1f42f90: 01f439ac .word 0x01f439ac + 1f42f94: 01f439ac .word 0x01f439ac + 1f42f98: 01f439ac .word 0x01f439ac + 1f42f9c: 01f430d8 .word 0x01f430d8 + 1f42fa0: 01f431c0 .word 0x01f431c0 + 1f42fa4: 01f439ac .word 0x01f439ac + 1f42fa8: 01f43100 .word 0x01f43100 + 1f42fac: 01f431d0 .word 0x01f431d0 + 1f42fb0: 01f439ac .word 0x01f439ac + 1f42fb4: 01f43220 .word 0x01f43220 + 1f42fb8: 01f434a0 .word 0x01f434a0 + 1f42fbc: 01f434a0 .word 0x01f434a0 + 1f42fc0: 01f434a0 .word 0x01f434a0 + 1f42fc4: 01f434a0 .word 0x01f434a0 + 1f42fc8: 01f434a0 .word 0x01f434a0 + 1f42fcc: 01f434a0 .word 0x01f434a0 + 1f42fd0: 01f434a0 .word 0x01f434a0 + 1f42fd4: 01f434a0 .word 0x01f434a0 + 1f42fd8: 01f434a0 .word 0x01f434a0 + 1f42fdc: 01f439ac .word 0x01f439ac + 1f42fe0: 01f439ac .word 0x01f439ac + 1f42fe4: 01f439ac .word 0x01f439ac + 1f42fe8: 01f439ac .word 0x01f439ac + 1f42fec: 01f439ac .word 0x01f439ac + 1f42ff0: 01f439ac .word 0x01f439ac + 1f42ff4: 01f439ac .word 0x01f439ac + 1f42ff8: 01f439ac .word 0x01f439ac + 1f42ffc: 01f439ac .word 0x01f439ac + 1f43000: 01f439ac .word 0x01f439ac + 1f43004: 01f4325c .word 0x01f4325c + 1f43008: 01f43404 .word 0x01f43404 + 1f4300c: 01f439ac .word 0x01f439ac + 1f43010: 01f43404 .word 0x01f43404 + 1f43014: 01f439ac .word 0x01f439ac + 1f43018: 01f439ac .word 0x01f439ac + 1f4301c: 01f439ac .word 0x01f439ac + 1f43020: 01f439ac .word 0x01f439ac + 1f43024: 01f43494 .word 0x01f43494 + 1f43028: 01f439ac .word 0x01f439ac + 1f4302c: 01f439ac .word 0x01f439ac + 1f43030: 01f434cc .word 0x01f434cc + 1f43034: 01f439ac .word 0x01f439ac + 1f43038: 01f439ac .word 0x01f439ac + 1f4303c: 01f439ac .word 0x01f439ac + 1f43040: 01f439ac .word 0x01f439ac + 1f43044: 01f439ac .word 0x01f439ac + 1f43048: 01f43584 .word 0x01f43584 + 1f4304c: 01f439ac .word 0x01f439ac + 1f43050: 01f439ac .word 0x01f439ac + 1f43054: 01f43814 .word 0x01f43814 + 1f43058: 01f439ac .word 0x01f439ac + 1f4305c: 01f439ac .word 0x01f439ac + 1f43060: 01f439ac .word 0x01f439ac + 1f43064: 01f439ac .word 0x01f439ac + 1f43068: 01f439ac .word 0x01f439ac + 1f4306c: 01f439ac .word 0x01f439ac + 1f43070: 01f439ac .word 0x01f439ac + 1f43074: 01f439ac .word 0x01f439ac + 1f43078: 01f439ac .word 0x01f439ac + 1f4307c: 01f439ac .word 0x01f439ac + 1f43080: 01f43780 .word 0x01f43780 + 1f43084: 01f437c4 .word 0x01f437c4 + 1f43088: 01f43404 .word 0x01f43404 + 1f4308c: 01f43404 .word 0x01f43404 + 1f43090: 01f43404 .word 0x01f43404 + 1f43094: 01f436b4 .word 0x01f436b4 + 1f43098: 01f437c4 .word 0x01f437c4 + 1f4309c: 01f439ac .word 0x01f439ac + 1f430a0: 01f439ac .word 0x01f439ac + 1f430a4: 01f436c0 .word 0x01f436c0 + 1f430a8: 01f439ac .word 0x01f439ac + 1f430ac: 01f436dc .word 0x01f436dc + 1f430b0: 01f4370c .word 0x01f4370c + 1f430b4: 01f435f4 .word 0x01f435f4 + 1f430b8: 01f436a8 .word 0x01f436a8 + 1f430bc: 01f439ac .word 0x01f439ac + 1f430c0: 01f438bc .word 0x01f438bc + 1f430c4: 01f439ac .word 0x01f439ac + 1f430c8: 01f43928 .word 0x01f43928 + 1f430cc: 01f439ac .word 0x01f439ac + 1f430d0: 01f439ac .word 0x01f439ac + 1f430d4: 01f4387c .word 0x01f4387c + 1f430d8: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f430dc: e5931000 ldr r1, [r3] + 1f430e0: e2833004 add r3, r3, #4 + 1f430e4: e3510000 cmp r1, #0 + 1f430e8: e58d1020 str r1, [sp, #32] + 1f430ec: e58d3028 str r3, [sp, #40] ; 0x28 + 1f430f0: aa000003 bge 1f43104 <_vfprintf_r+0x30c> + 1f430f4: e59d3020 ldr r3, [sp, #32] + 1f430f8: e2633000 rsb r3, r3, #0 + 1f430fc: e58d3020 str r3, [sp, #32] + 1f43100: e3855004 orr r5, r5, #4 + 1f43104: e5db3000 ldrb r3, [fp] + 1f43108: eaffff93 b 1f42f5c <_vfprintf_r+0x164> + 1f4310c: e1a0100a mov r1, sl + 1f43110: e59d0018 ldr r0, [sp, #24] + 1f43114: eb000806 bl 1f45134 <__swsetup_r> + 1f43118: e3500000 cmp r0, #0 + 1f4311c: 01da30bc ldrheq r3, [sl, #12] + 1f43120: 0affff59 beq 1f42e8c <_vfprintf_r+0x94> + 1f43124: e3e00000 mvn r0, #0 + 1f43128: ea000011 b 1f43174 <_vfprintf_r+0x37c> + 1f4312c: e28d2074 add r2, sp, #116 ; 0x74 + 1f43130: e1a0100a mov r1, sl + 1f43134: e59d0018 ldr r0, [sp, #24] + 1f43138: eb001a3c bl 1f49a30 <__sprint_r> + 1f4313c: e3500000 cmp r0, #0 + 1f43140: 1a000007 bne 1f43164 <_vfprintf_r+0x36c> + 1f43144: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f43148: eaffff73 b 1f42f1c <_vfprintf_r+0x124> + 1f4314c: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f43150: e3530000 cmp r3, #0 + 1f43154: 159d0018 ldrne r0, [sp, #24] + 1f43158: 128d2074 addne r2, sp, #116 ; 0x74 + 1f4315c: 11a0100a movne r1, sl + 1f43160: 1b001a32 blne 1f49a30 <__sprint_r> + 1f43164: e1da30bc ldrh r3, [sl, #12] + 1f43168: e3130040 tst r3, #64 ; 0x40 + 1f4316c: 1affffec bne 1f43124 <_vfprintf_r+0x32c> + 1f43170: e59d001c ldr r0, [sp, #28] + 1f43174: e28dd0ec add sp, sp, #236 ; 0xec + 1f43178: ecbd8b06 vpop {d8-d10} + 1f4317c: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f43180: e12fff1e bx lr + 1f43184: e1da30fe ldrsh r3, [sl, #14] + 1f43188: e3530000 cmp r3, #0 + 1f4318c: baffff41 blt 1f42e98 <_vfprintf_r+0xa0> + 1f43190: e1a03004 mov r3, r4 + 1f43194: e1a0200b mov r2, fp + 1f43198: e1a0100a mov r1, sl + 1f4319c: e59d0018 ldr r0, [sp, #24] + 1f431a0: eb0007a6 bl 1f45040 <__sbprintf> + 1f431a4: e28dd0ec add sp, sp, #236 ; 0xec + 1f431a8: ecbd8b06 vpop {d8-d10} + 1f431ac: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f431b0: e12fff1e bx lr + 1f431b4: e59d0018 ldr r0, [sp, #24] + 1f431b8: eb000f0b bl 1f46dec <__sinit> + 1f431bc: eaffff21 b 1f42e48 <_vfprintf_r+0x50> + 1f431c0: e5db3000 ldrb r3, [fp] + 1f431c4: e3a02001 mov r2, #1 + 1f431c8: e3a0002b mov r0, #43 ; 0x2b + 1f431cc: eaffff62 b 1f42f5c <_vfprintf_r+0x164> + 1f431d0: e5db6000 ldrb r6, [fp] + 1f431d4: e356002a cmp r6, #42 ; 0x2a + 1f431d8: e28b1001 add r1, fp, #1 + 1f431dc: 0a00077a beq 1f44fcc <_vfprintf_r+0x21d4> + 1f431e0: e2463030 sub r3, r6, #48 ; 0x30 + 1f431e4: e3530009 cmp r3, #9 + 1f431e8: 83a03000 movhi r3, #0 + 1f431ec: e1a0b001 mov fp, r1 + 1f431f0: 858d3014 strhi r3, [sp, #20] + 1f431f4: 8affff5a bhi 1f42f64 <_vfprintf_r+0x16c> + 1f431f8: e3a01000 mov r1, #0 + 1f431fc: e4db6001 ldrb r6, [fp], #1 + 1f43200: e0811101 add r1, r1, r1, lsl #2 + 1f43204: e0831081 add r1, r3, r1, lsl #1 + 1f43208: e2463030 sub r3, r6, #48 ; 0x30 + 1f4320c: e3530009 cmp r3, #9 + 1f43210: 9afffff9 bls 1f431fc <_vfprintf_r+0x404> + 1f43214: e1813fc1 orr r3, r1, r1, asr #31 + 1f43218: e58d3014 str r3, [sp, #20] + 1f4321c: eaffff50 b 1f42f64 <_vfprintf_r+0x16c> + 1f43220: e3855080 orr r5, r5, #128 ; 0x80 + 1f43224: e5db3000 ldrb r3, [fp] + 1f43228: eaffff4b b 1f42f5c <_vfprintf_r+0x164> + 1f4322c: e1a00000 nop ; (mov r0, r0) + ... + 1f43238: ffffffff .word 0xffffffff + 1f4323c: 7fefffff .word 0x7fefffff + 1f43240: 01f62ee8 .word 0x01f62ee8 + 1f43244: 01f62eec .word 0x01f62eec + 1f43248: 01f62ef8 .word 0x01f62ef8 + 1f4324c: 01f62f0c .word 0x01f62f0c + 1f43250: 01f62f38 .word 0x01f62f38 + 1f43254: 01f63698 .word 0x01f63698 + 1f43258: 01f62f48 .word 0x01f62f48 + 1f4325c: e3520000 cmp r2, #0 + 1f43260: e3855010 orr r5, r5, #16 + 1f43264: 15cd0057 strbne r0, [sp, #87] ; 0x57 + 1f43268: e3150020 tst r5, #32 + 1f4326c: 0a000158 beq 1f437d4 <_vfprintf_r+0x9dc> + 1f43270: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f43274: e2834007 add r4, r3, #7 + 1f43278: e3c44007 bic r4, r4, #7 + 1f4327c: e894000c ldm r4, {r2, r3} + 1f43280: e2841008 add r1, r4, #8 + 1f43284: e58d2008 str r2, [sp, #8] + 1f43288: e58d300c str r3, [sp, #12] + 1f4328c: e58d1028 str r1, [sp, #40] ; 0x28 + 1f43290: e3520000 cmp r2, #0 + 1f43294: e2d33000 sbcs r3, r3, #0 + 1f43298: ba0004b1 blt 1f44564 <_vfprintf_r+0x176c> + 1f4329c: e59d2014 ldr r2, [sp, #20] + 1f432a0: e3520000 cmp r2, #0 + 1f432a4: ba0003a9 blt 1f44150 <_vfprintf_r+0x1358> + 1f432a8: e28d4008 add r4, sp, #8 + 1f432ac: e8940018 ldm r4, {r3, r4} + 1f432b0: e1a01003 mov r1, r3 + 1f432b4: e1813004 orr r3, r1, r4 + 1f432b8: e3530000 cmp r3, #0 + 1f432bc: 03520000 cmpeq r2, #0 + 1f432c0: e3c55080 bic r5, r5, #128 ; 0x80 + 1f432c4: 1a0003a1 bne 1f44150 <_vfprintf_r+0x1358> + 1f432c8: e5dd7057 ldrb r7, [sp, #87] ; 0x57 + 1f432cc: e3a03000 mov r3, #0 + 1f432d0: e28d20a8 add r2, sp, #168 ; 0xa8 + 1f432d4: e58d3014 str r3, [sp, #20] + 1f432d8: e58d202c str r2, [sp, #44] ; 0x2c + 1f432dc: e58d3024 str r3, [sp, #36] ; 0x24 + 1f432e0: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f432e4: e59d2014 ldr r2, [sp, #20] + 1f432e8: e1530002 cmp r3, r2 + 1f432ec: b1a03002 movlt r3, r2 + 1f432f0: e58d3008 str r3, [sp, #8] + 1f432f4: e3a03000 mov r3, #0 + 1f432f8: e58d3038 str r3, [sp, #56] ; 0x38 + 1f432fc: e3570000 cmp r7, #0 + 1f43300: 0a000002 beq 1f43310 <_vfprintf_r+0x518> + 1f43304: e59d3008 ldr r3, [sp, #8] + 1f43308: e2833001 add r3, r3, #1 + 1f4330c: e58d3008 str r3, [sp, #8] + 1f43310: e2153002 ands r3, r5, #2 + 1f43314: e58d3030 str r3, [sp, #48] ; 0x30 + 1f43318: 159d3008 ldrne r3, [sp, #8] + 1f4331c: 12833002 addne r3, r3, #2 + 1f43320: 158d3008 strne r3, [sp, #8] + 1f43324: e2153084 ands r3, r5, #132 ; 0x84 + 1f43328: e58d3034 str r3, [sp, #52] ; 0x34 + 1f4332c: 1a0001b3 bne 1f43a00 <_vfprintf_r+0xc08> + 1f43330: e59d3020 ldr r3, [sp, #32] + 1f43334: e59d2008 ldr r2, [sp, #8] + 1f43338: e0624003 rsb r4, r2, r3 + 1f4333c: e3540000 cmp r4, #0 + 1f43340: da0001ae ble 1f43a00 <_vfprintf_r+0xc08> + 1f43344: e3540010 cmp r4, #16 + 1f43348: da00062d ble 1f44c04 <_vfprintf_r+0x1e0c> + 1f4334c: e51f3104 ldr r3, [pc, #-260] ; 1f43250 <_vfprintf_r+0x458> + 1f43350: e3a07010 mov r7, #16 + 1f43354: e58d3040 str r3, [sp, #64] ; 0x40 + 1f43358: e59d107c ldr r1, [sp, #124] ; 0x7c + 1f4335c: e1a03008 mov r3, r8 + 1f43360: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f43364: e1a08004 mov r8, r4 + 1f43368: e59d4018 ldr r4, [sp, #24] + 1f4336c: ea000002 b 1f4337c <_vfprintf_r+0x584> + 1f43370: e2488010 sub r8, r8, #16 + 1f43374: e3580010 cmp r8, #16 + 1f43378: da000014 ble 1f433d0 <_vfprintf_r+0x5d8> + 1f4337c: e2822001 add r2, r2, #1 + 1f43380: e51f0138 ldr r0, [pc, #-312] ; 1f43250 <_vfprintf_r+0x458> + 1f43384: e3520007 cmp r2, #7 + 1f43388: e2811010 add r1, r1, #16 + 1f4338c: e8830081 stm r3, {r0, r7} + 1f43390: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43394: e58d107c str r1, [sp, #124] ; 0x7c + 1f43398: d2833008 addle r3, r3, #8 + 1f4339c: dafffff3 ble 1f43370 <_vfprintf_r+0x578> + 1f433a0: e28d2074 add r2, sp, #116 ; 0x74 + 1f433a4: e1a0100a mov r1, sl + 1f433a8: e1a00004 mov r0, r4 + 1f433ac: eb00199f bl 1f49a30 <__sprint_r> + 1f433b0: e3500000 cmp r0, #0 + 1f433b4: 1affff6a bne 1f43164 <_vfprintf_r+0x36c> + 1f433b8: e2488010 sub r8, r8, #16 + 1f433bc: e3580010 cmp r8, #16 + 1f433c0: e28d30a8 add r3, sp, #168 ; 0xa8 + 1f433c4: e59d107c ldr r1, [sp, #124] ; 0x7c + 1f433c8: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f433cc: caffffea bgt 1f4337c <_vfprintf_r+0x584> + 1f433d0: e1a04008 mov r4, r8 + 1f433d4: e1a08003 mov r8, r3 + 1f433d8: e2822001 add r2, r2, #1 + 1f433dc: e3520007 cmp r2, #7 + 1f433e0: e58d2078 str r2, [sp, #120] ; 0x78 + 1f433e4: e59d2040 ldr r2, [sp, #64] ; 0x40 + 1f433e8: e0843001 add r3, r4, r1 + 1f433ec: e58d307c str r3, [sp, #124] ; 0x7c + 1f433f0: e8880014 stm r8, {r2, r4} + 1f433f4: ca000179 bgt 1f439e0 <_vfprintf_r+0xbe8> + 1f433f8: e2888008 add r8, r8, #8 + 1f433fc: e5dd7057 ldrb r7, [sp, #87] ; 0x57 + 1f43400: ea00017f b 1f43a04 <_vfprintf_r+0xc0c> + 1f43404: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f43408: e3520000 cmp r2, #0 + 1f4340c: e2834007 add r4, r3, #7 + 1f43410: 15cd0057 strbne r0, [sp, #87] ; 0x57 + 1f43414: e3150008 tst r5, #8 + 1f43418: 13c43007 bicne r3, r4, #7 + 1f4341c: 03c44007 biceq r4, r4, #7 + 1f43420: 1d938b00 vldrne d8, [r3] + 1f43424: 0d948b00 vldreq d8, [r4] + 1f43428: eeb07bc8 vabs.f64 d7, d8 + 1f4342c: eeb47b49 vcmp.f64 d7, d9 + 1f43430: 12832008 addne r2, r3, #8 + 1f43434: 02843008 addeq r3, r4, #8 + 1f43438: 158d2028 strne r2, [sp, #40] ; 0x28 + 1f4343c: 058d3028 streq r3, [sp, #40] ; 0x28 + 1f43440: eef1fa10 vmrs APSR_nzcv, fpscr + 1f43444: da00045d ble 1f445c0 <_vfprintf_r+0x17c8> + 1f43448: eeb58bc0 vcmpe.f64 d8, #0.0 + 1f4344c: eef1fa10 vmrs APSR_nzcv, fpscr + 1f43450: 4a00066f bmi 1f44e14 <_vfprintf_r+0x201c> + 1f43454: e5dd7057 ldrb r7, [sp, #87] ; 0x57 + 1f43458: e3a03003 mov r3, #3 + 1f4345c: e1a01003 mov r1, r3 + 1f43460: e58d3008 str r3, [sp, #8] + 1f43464: e3a03000 mov r3, #0 + 1f43468: e1a00003 mov r0, r3 + 1f4346c: e58d3014 str r3, [sp, #20] + 1f43470: e51f3238 ldr r3, [pc, #-568] ; 1f43240 <_vfprintf_r+0x448> + 1f43474: e3560047 cmp r6, #71 ; 0x47 + 1f43478: e51f223c ldr r2, [pc, #-572] ; 1f43244 <_vfprintf_r+0x44c> + 1f4347c: d1a02003 movle r2, r3 + 1f43480: e3c55080 bic r5, r5, #128 ; 0x80 + 1f43484: e58d1024 str r1, [sp, #36] ; 0x24 + 1f43488: e58d0038 str r0, [sp, #56] ; 0x38 + 1f4348c: e58d202c str r2, [sp, #44] ; 0x2c + 1f43490: eaffff99 b 1f432fc <_vfprintf_r+0x504> + 1f43494: e3855008 orr r5, r5, #8 + 1f43498: e5db3000 ldrb r3, [fp] + 1f4349c: eafffeae b 1f42f5c <_vfprintf_r+0x164> + 1f434a0: e3a03000 mov r3, #0 + 1f434a4: e1a01003 mov r1, r3 + 1f434a8: e2463030 sub r3, r6, #48 ; 0x30 + 1f434ac: e4db6001 ldrb r6, [fp], #1 + 1f434b0: e0811101 add r1, r1, r1, lsl #2 + 1f434b4: e0831081 add r1, r3, r1, lsl #1 + 1f434b8: e2463030 sub r3, r6, #48 ; 0x30 + 1f434bc: e3530009 cmp r3, #9 + 1f434c0: 9afffff9 bls 1f434ac <_vfprintf_r+0x6b4> + 1f434c4: e58d1020 str r1, [sp, #32] + 1f434c8: eafffea5 b 1f42f64 <_vfprintf_r+0x16c> + 1f434cc: e3520000 cmp r2, #0 + 1f434d0: e3855010 orr r5, r5, #16 + 1f434d4: 15cd0057 strbne r0, [sp, #87] ; 0x57 + 1f434d8: e2153020 ands r3, r5, #32 + 1f434dc: 0a00008e beq 1f4371c <_vfprintf_r+0x924> + 1f434e0: e3a01000 mov r1, #0 + 1f434e4: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f434e8: e59d0014 ldr r0, [sp, #20] + 1f434ec: e2834007 add r4, r3, #7 + 1f434f0: e3c43007 bic r3, r4, #7 + 1f434f4: e2832008 add r2, r3, #8 + 1f434f8: e1500001 cmp r0, r1 + 1f434fc: e58d2028 str r2, [sp, #40] ; 0x28 + 1f43500: e5cd1057 strb r1, [sp, #87] ; 0x57 + 1f43504: e893000c ldm r3, {r2, r3} + 1f43508: ba000004 blt 1f43520 <_vfprintf_r+0x728> + 1f4350c: e1821003 orr r1, r2, r3 + 1f43510: e3510000 cmp r1, #0 + 1f43514: 03500000 cmpeq r0, #0 + 1f43518: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4351c: 0a000090 beq 1f43764 <_vfprintf_r+0x96c> + 1f43520: e28d00a8 add r0, sp, #168 ; 0xa8 + 1f43524: e1a0c1a2 lsr ip, r2, #3 + 1f43528: e18cce83 orr ip, ip, r3, lsl #29 + 1f4352c: e1a0e1a3 lsr lr, r3, #3 + 1f43530: e2021007 and r1, r2, #7 + 1f43534: e1a0300e mov r3, lr + 1f43538: e1a0200c mov r2, ip + 1f4353c: e2811030 add r1, r1, #48 ; 0x30 + 1f43540: e192c003 orrs ip, r2, r3 + 1f43544: e5601001 strb r1, [r0, #-1]! + 1f43548: 1afffff5 bne 1f43524 <_vfprintf_r+0x72c> + 1f4354c: e3510030 cmp r1, #48 ; 0x30 + 1f43550: 03a03000 moveq r3, #0 + 1f43554: 12053001 andne r3, r5, #1 + 1f43558: e3530000 cmp r3, #0 + 1f4355c: 0a0004ca beq 1f4488c <_vfprintf_r+0x1a94> + 1f43560: e3a03030 mov r3, #48 ; 0x30 + 1f43564: e2402001 sub r2, r0, #1 + 1f43568: e5403001 strb r3, [r0, #-1] + 1f4356c: e28d30a8 add r3, sp, #168 ; 0xa8 + 1f43570: e0623003 rsb r3, r2, r3 + 1f43574: e58d202c str r2, [sp, #44] ; 0x2c + 1f43578: e58d3024 str r3, [sp, #36] ; 0x24 + 1f4357c: e3a07000 mov r7, #0 + 1f43580: eaffff56 b 1f432e0 <_vfprintf_r+0x4e8> + 1f43584: e3520000 cmp r2, #0 + 1f43588: e3855010 orr r5, r5, #16 + 1f4358c: 15cd0057 strbne r0, [sp, #87] ; 0x57 + 1f43590: e2153020 ands r3, r5, #32 + 1f43594: 0a0000e7 beq 1f43938 <_vfprintf_r+0xb40> + 1f43598: e3a02000 mov r2, #0 + 1f4359c: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f435a0: e2834007 add r4, r3, #7 + 1f435a4: e3c43007 bic r3, r4, #7 + 1f435a8: e59d1014 ldr r1, [sp, #20] + 1f435ac: e2830008 add r0, r3, #8 + 1f435b0: e8930018 ldm r3, {r3, r4} + 1f435b4: e1510002 cmp r1, r2 + 1f435b8: e58d0028 str r0, [sp, #40] ; 0x28 + 1f435bc: e58d3008 str r3, [sp, #8] + 1f435c0: e58d400c str r4, [sp, #12] + 1f435c4: e5cd2057 strb r2, [sp, #87] ; 0x57 + 1f435c8: ba00031f blt 1f4424c <_vfprintf_r+0x1454> + 1f435cc: e1a00003 mov r0, r3 + 1f435d0: e1803004 orr r3, r0, r4 + 1f435d4: e1530002 cmp r3, r2 + 1f435d8: 01510002 cmpeq r1, r2 + 1f435dc: e3c55080 bic r5, r5, #128 ; 0x80 + 1f435e0: 13a03001 movne r3, #1 + 1f435e4: 03a03000 moveq r3, #0 + 1f435e8: 1a000317 bne 1f4424c <_vfprintf_r+0x1454> + 1f435ec: e1a07003 mov r7, r3 + 1f435f0: eaffff35 b 1f432cc <_vfprintf_r+0x4d4> + 1f435f4: e3a03000 mov r3, #0 + 1f435f8: e3a01030 mov r1, #48 ; 0x30 + 1f435fc: e3a00078 mov r0, #120 ; 0x78 + 1f43600: e59de014 ldr lr, [sp, #20] + 1f43604: e59dc028 ldr ip, [sp, #40] ; 0x28 + 1f43608: e15e0003 cmp lr, r3 + 1f4360c: e5cd3057 strb r3, [sp, #87] ; 0x57 + 1f43610: e59c2000 ldr r2, [ip] + 1f43614: e5cd1058 strb r1, [sp, #88] ; 0x58 + 1f43618: e5cd0059 strb r0, [sp, #89] ; 0x59 + 1f4361c: e28c4004 add r4, ip, #4 + 1f43620: e3a03000 mov r3, #0 + 1f43624: ba00052f blt 1f44ae8 <_vfprintf_r+0x1cf0> + 1f43628: e59dc014 ldr ip, [sp, #20] + 1f4362c: e1821003 orr r1, r2, r3 + 1f43630: e3510000 cmp r1, #0 + 1f43634: 035c0000 cmpeq ip, #0 + 1f43638: 03a0c000 moveq ip, #0 + 1f4363c: e3c51080 bic r1, r5, #128 ; 0x80 + 1f43640: e58d4028 str r4, [sp, #40] ; 0x28 + 1f43644: 13a0c001 movne ip, #1 + 1f43648: e3815002 orr r5, r1, #2 + 1f4364c: 01a0700c moveq r7, ip + 1f43650: 01a06000 moveq r6, r0 + 1f43654: 0affff1c beq 1f432cc <_vfprintf_r+0x4d4> + 1f43658: e1a06000 mov r6, r0 + 1f4365c: e51fc418 ldr ip, [pc, #-1048] ; 1f4324c <_vfprintf_r+0x454> + 1f43660: e28d10a8 add r1, sp, #168 ; 0xa8 + 1f43664: e1a00001 mov r0, r1 + 1f43668: e1a01222 lsr r1, r2, #4 + 1f4366c: e1811e03 orr r1, r1, r3, lsl #28 + 1f43670: e1a04223 lsr r4, r3, #4 + 1f43674: e202e00f and lr, r2, #15 + 1f43678: e1a03004 mov r3, r4 + 1f4367c: e1a02001 mov r2, r1 + 1f43680: e7dc100e ldrb r1, [ip, lr] + 1f43684: e192e003 orrs lr, r2, r3 + 1f43688: e5601001 strb r1, [r0, #-1]! + 1f4368c: 1afffff5 bne 1f43668 <_vfprintf_r+0x870> + 1f43690: e28d20a8 add r2, sp, #168 ; 0xa8 + 1f43694: e0603002 rsb r3, r0, r2 + 1f43698: e58d002c str r0, [sp, #44] ; 0x2c + 1f4369c: e58d3024 str r3, [sp, #36] ; 0x24 + 1f436a0: e3a07000 mov r7, #0 + 1f436a4: eaffff0d b 1f432e0 <_vfprintf_r+0x4e8> + 1f436a8: e3855020 orr r5, r5, #32 + 1f436ac: e5db3000 ldrb r3, [fp] + 1f436b0: eafffe29 b 1f42f5c <_vfprintf_r+0x164> + 1f436b4: e3855040 orr r5, r5, #64 ; 0x40 + 1f436b8: e5db3000 ldrb r3, [fp] + 1f436bc: eafffe26 b 1f42f5c <_vfprintf_r+0x164> + 1f436c0: e5db3000 ldrb r3, [fp] + 1f436c4: e353006c cmp r3, #108 ; 0x6c + 1f436c8: 05db3001 ldrbeq r3, [fp, #1] + 1f436cc: 03855020 orreq r5, r5, #32 + 1f436d0: 028bb001 addeq fp, fp, #1 + 1f436d4: 13855010 orrne r5, r5, #16 + 1f436d8: eafffe1f b 1f42f5c <_vfprintf_r+0x164> + 1f436dc: e3520000 cmp r2, #0 + 1f436e0: 15cd0057 strbne r0, [sp, #87] ; 0x57 + 1f436e4: e3150020 tst r5, #32 + 1f436e8: 0a000440 beq 1f447f0 <_vfprintf_r+0x19f8> + 1f436ec: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f436f0: e59d201c ldr r2, [sp, #28] + 1f436f4: e5931000 ldr r1, [r3] + 1f436f8: e2833004 add r3, r3, #4 + 1f436fc: e58d3028 str r3, [sp, #40] ; 0x28 + 1f43700: e1a03fc2 asr r3, r2, #31 + 1f43704: e881000c stm r1, {r2, r3} + 1f43708: eafffded b 1f42ec4 <_vfprintf_r+0xcc> + 1f4370c: e3520000 cmp r2, #0 + 1f43710: 15cd0057 strbne r0, [sp, #87] ; 0x57 + 1f43714: e2153020 ands r3, r5, #32 + 1f43718: 1affff70 bne 1f434e0 <_vfprintf_r+0x6e8> + 1f4371c: e2152010 ands r2, r5, #16 + 1f43720: 0a000404 beq 1f44738 <_vfprintf_r+0x1940> + 1f43724: e59d0014 ldr r0, [sp, #20] + 1f43728: e59d1028 ldr r1, [sp, #40] ; 0x28 + 1f4372c: e3500000 cmp r0, #0 + 1f43730: e5cd3057 strb r3, [sp, #87] ; 0x57 + 1f43734: e5912000 ldr r2, [r1] + 1f43738: e2814004 add r4, r1, #4 + 1f4373c: e3a03000 mov r3, #0 + 1f43740: ba0004b6 blt 1f44a20 <_vfprintf_r+0x1c28> + 1f43744: 13a01001 movne r1, #1 + 1f43748: 03a01000 moveq r1, #0 + 1f4374c: e1920003 orrs r0, r2, r3 + 1f43750: 13811001 orrne r1, r1, #1 + 1f43754: e3510000 cmp r1, #0 + 1f43758: e58d4028 str r4, [sp, #40] ; 0x28 + 1f4375c: e3c55080 bic r5, r5, #128 ; 0x80 + 1f43760: 1affff6e bne 1f43520 <_vfprintf_r+0x728> + 1f43764: e2153001 ands r3, r5, #1 + 1f43768: 1a00026f bne 1f4412c <_vfprintf_r+0x1334> + 1f4376c: e1a07003 mov r7, r3 + 1f43770: e28d30a8 add r3, sp, #168 ; 0xa8 + 1f43774: e58d302c str r3, [sp, #44] ; 0x2c + 1f43778: e58d7024 str r7, [sp, #36] ; 0x24 + 1f4377c: eafffed7 b 1f432e0 <_vfprintf_r+0x4e8> + 1f43780: e3a03001 mov r3, #1 + 1f43784: e3a02000 mov r2, #0 + 1f43788: e1a01003 mov r1, r3 + 1f4378c: e59d0028 ldr r0, [sp, #40] ; 0x28 + 1f43790: e58d3008 str r3, [sp, #8] + 1f43794: e5903000 ldr r3, [r0] + 1f43798: e5cd3080 strb r3, [sp, #128] ; 0x80 + 1f4379c: e2803004 add r3, r0, #4 + 1f437a0: e58d3028 str r3, [sp, #40] ; 0x28 + 1f437a4: e28d3080 add r3, sp, #128 ; 0x80 + 1f437a8: e5cd2057 strb r2, [sp, #87] ; 0x57 + 1f437ac: e58d1024 str r1, [sp, #36] ; 0x24 + 1f437b0: e58d302c str r3, [sp, #44] ; 0x2c + 1f437b4: e3a07000 mov r7, #0 + 1f437b8: e58d7014 str r7, [sp, #20] + 1f437bc: e58d7038 str r7, [sp, #56] ; 0x38 + 1f437c0: eafffed2 b 1f43310 <_vfprintf_r+0x518> + 1f437c4: e3520000 cmp r2, #0 + 1f437c8: 15cd0057 strbne r0, [sp, #87] ; 0x57 + 1f437cc: e3150020 tst r5, #32 + 1f437d0: 1afffea6 bne 1f43270 <_vfprintf_r+0x478> + 1f437d4: e59d0028 ldr r0, [sp, #40] ; 0x28 + 1f437d8: e3150010 tst r5, #16 + 1f437dc: e1a03000 mov r3, r0 + 1f437e0: 1a000001 bne 1f437ec <_vfprintf_r+0x9f4> + 1f437e4: e3150040 tst r5, #64 ; 0x40 + 1f437e8: 1a00048e bne 1f44a28 <_vfprintf_r+0x1c30> + 1f437ec: e5933000 ldr r3, [r3] + 1f437f0: e1a01003 mov r1, r3 + 1f437f4: e1a02fc3 asr r2, r3, #31 + 1f437f8: e1a03002 mov r3, r2 + 1f437fc: e1a02001 mov r2, r1 + 1f43800: e2801004 add r1, r0, #4 + 1f43804: e58d2008 str r2, [sp, #8] + 1f43808: e58d300c str r3, [sp, #12] + 1f4380c: e58d1028 str r1, [sp, #40] ; 0x28 + 1f43810: eafffe9e b 1f43290 <_vfprintf_r+0x498> + 1f43814: e3520000 cmp r2, #0 + 1f43818: 15cd0057 strbne r0, [sp, #87] ; 0x57 + 1f4381c: e3150020 tst r5, #32 + 1f43820: e51fc5e0 ldr ip, [pc, #-1504] ; 1f43248 <_vfprintf_r+0x450> + 1f43824: 0a000019 beq 1f43890 <_vfprintf_r+0xa98> + 1f43828: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f4382c: e2834007 add r4, r3, #7 + 1f43830: e3c43007 bic r3, r4, #7 + 1f43834: e2832008 add r2, r3, #8 + 1f43838: e58d2028 str r2, [sp, #40] ; 0x28 + 1f4383c: e893000c ldm r3, {r2, r3} + 1f43840: e2151001 ands r1, r5, #1 + 1f43844: 0a000272 beq 1f44214 <_vfprintf_r+0x141c> + 1f43848: e1921003 orrs r1, r2, r3 + 1f4384c: 0a000352 beq 1f4459c <_vfprintf_r+0x17a4> + 1f43850: e3a01000 mov r1, #0 + 1f43854: e3a00030 mov r0, #48 ; 0x30 + 1f43858: e59de014 ldr lr, [sp, #20] + 1f4385c: e15e0001 cmp lr, r1 + 1f43860: e5cd1057 strb r1, [sp, #87] ; 0x57 + 1f43864: a3c51080 bicge r1, r5, #128 ; 0x80 + 1f43868: e5cd6059 strb r6, [sp, #89] ; 0x59 + 1f4386c: e5cd0058 strb r0, [sp, #88] ; 0x58 + 1f43870: b3855002 orrlt r5, r5, #2 + 1f43874: a3815002 orrge r5, r1, #2 + 1f43878: eaffff78 b 1f43660 <_vfprintf_r+0x868> + 1f4387c: e3520000 cmp r2, #0 + 1f43880: 15cd0057 strbne r0, [sp, #87] ; 0x57 + 1f43884: e3150020 tst r5, #32 + 1f43888: e51fc644 ldr ip, [pc, #-1604] ; 1f4324c <_vfprintf_r+0x454> + 1f4388c: 1affffe5 bne 1f43828 <_vfprintf_r+0xa30> + 1f43890: e3150010 tst r5, #16 + 1f43894: 0a0003e7 beq 1f44838 <_vfprintf_r+0x1a40> + 1f43898: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f4389c: e5932000 ldr r2, [r3] + 1f438a0: e2833004 add r3, r3, #4 + 1f438a4: e58d3028 str r3, [sp, #40] ; 0x28 + 1f438a8: e3a03000 mov r3, #0 + 1f438ac: eaffffe3 b 1f43840 <_vfprintf_r+0xa48> + 1f438b0: e3855001 orr r5, r5, #1 + 1f438b4: e5db3000 ldrb r3, [fp] + 1f438b8: eafffda7 b 1f42f5c <_vfprintf_r+0x164> + 1f438bc: e3a07000 mov r7, #0 + 1f438c0: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f438c4: e5932000 ldr r2, [r3] + 1f438c8: e1520007 cmp r2, r7 + 1f438cc: e2834004 add r4, r3, #4 + 1f438d0: e58d202c str r2, [sp, #44] ; 0x2c + 1f438d4: e5cd7057 strb r7, [sp, #87] ; 0x57 + 1f438d8: e59d3014 ldr r3, [sp, #20] + 1f438dc: 0a0004e6 beq 1f44c7c <_vfprintf_r+0x1e84> + 1f438e0: e3530000 cmp r3, #0 + 1f438e4: ba0004aa blt 1f44b94 <_vfprintf_r+0x1d9c> + 1f438e8: e1a02003 mov r2, r3 + 1f438ec: e1a01007 mov r1, r7 + 1f438f0: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f438f4: eb000f29 bl 1f475a0 + 1f438f8: e3500000 cmp r0, #0 + 1f438fc: 0a00055c beq 1f44e74 <_vfprintf_r+0x207c> + 1f43900: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f43904: e58d7014 str r7, [sp, #20] + 1f43908: e0633000 rsb r3, r3, r0 + 1f4390c: e58d3024 str r3, [sp, #36] ; 0x24 + 1f43910: e1c33fc3 bic r3, r3, r3, asr #31 + 1f43914: e58d7038 str r7, [sp, #56] ; 0x38 + 1f43918: e58d4028 str r4, [sp, #40] ; 0x28 + 1f4391c: e58d3008 str r3, [sp, #8] + 1f43920: e5dd7057 ldrb r7, [sp, #87] ; 0x57 + 1f43924: eafffe74 b 1f432fc <_vfprintf_r+0x504> + 1f43928: e3520000 cmp r2, #0 + 1f4392c: 15cd0057 strbne r0, [sp, #87] ; 0x57 + 1f43930: e2153020 ands r3, r5, #32 + 1f43934: 1affff17 bne 1f43598 <_vfprintf_r+0x7a0> + 1f43938: e2152010 ands r2, r5, #16 + 1f4393c: 0a00038f beq 1f44780 <_vfprintf_r+0x1988> + 1f43940: e59d1028 ldr r1, [sp, #40] ; 0x28 + 1f43944: e5912000 ldr r2, [r1] + 1f43948: e2814004 add r4, r1, #4 + 1f4394c: e1a00002 mov r0, r2 + 1f43950: e3a01000 mov r1, #0 + 1f43954: e59dc014 ldr ip, [sp, #20] + 1f43958: e35c0000 cmp ip, #0 + 1f4395c: e5cd3057 strb r3, [sp, #87] ; 0x57 + 1f43960: e58d0008 str r0, [sp, #8] + 1f43964: e58d100c str r1, [sp, #12] + 1f43968: ba00052d blt 1f44e24 <_vfprintf_r+0x202c> + 1f4396c: e1822001 orr r2, r2, r1 + 1f43970: e3520000 cmp r2, #0 + 1f43974: 035c0000 cmpeq ip, #0 + 1f43978: 03a02000 moveq r2, #0 + 1f4397c: e58d4028 str r4, [sp, #40] ; 0x28 + 1f43980: 13a02001 movne r2, #1 + 1f43984: e3c55080 bic r5, r5, #128 ; 0x80 + 1f43988: 01a07002 moveq r7, r2 + 1f4398c: 0afffe4e beq 1f432cc <_vfprintf_r+0x4d4> + 1f43990: e1a07003 mov r7, r3 + 1f43994: ea0001ee b 1f44154 <_vfprintf_r+0x135c> + 1f43998: e3500000 cmp r0, #0 + 1f4399c: e5db3000 ldrb r3, [fp] + 1f439a0: 03a02001 moveq r2, #1 + 1f439a4: 03a00020 moveq r0, #32 + 1f439a8: eafffd6b b 1f42f5c <_vfprintf_r+0x164> + 1f439ac: e3520000 cmp r2, #0 + 1f439b0: 15cd0057 strbne r0, [sp, #87] ; 0x57 + 1f439b4: e3560000 cmp r6, #0 + 1f439b8: 0afffde3 beq 1f4314c <_vfprintf_r+0x354> + 1f439bc: e3a03000 mov r3, #0 + 1f439c0: e3a02001 mov r2, #1 + 1f439c4: e5cd3057 strb r3, [sp, #87] ; 0x57 + 1f439c8: e28d3080 add r3, sp, #128 ; 0x80 + 1f439cc: e58d2008 str r2, [sp, #8] + 1f439d0: e5cd6080 strb r6, [sp, #128] ; 0x80 + 1f439d4: e58d2024 str r2, [sp, #36] ; 0x24 + 1f439d8: e58d302c str r3, [sp, #44] ; 0x2c + 1f439dc: eaffff74 b 1f437b4 <_vfprintf_r+0x9bc> + 1f439e0: e28d2074 add r2, sp, #116 ; 0x74 + 1f439e4: e1a0100a mov r1, sl + 1f439e8: e59d0018 ldr r0, [sp, #24] + 1f439ec: eb00180f bl 1f49a30 <__sprint_r> + 1f439f0: e3500000 cmp r0, #0 + 1f439f4: 1afffdda bne 1f43164 <_vfprintf_r+0x36c> + 1f439f8: e5dd7057 ldrb r7, [sp, #87] ; 0x57 + 1f439fc: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f43a00: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f43a04: e3570000 cmp r7, #0 + 1f43a08: 0a00000b beq 1f43a3c <_vfprintf_r+0xc44> + 1f43a0c: e3a01001 mov r1, #1 + 1f43a10: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f43a14: e0822001 add r2, r2, r1 + 1f43a18: e3520007 cmp r2, #7 + 1f43a1c: e0833001 add r3, r3, r1 + 1f43a20: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43a24: e28d2057 add r2, sp, #87 ; 0x57 + 1f43a28: e5881004 str r1, [r8, #4] + 1f43a2c: e5882000 str r2, [r8] + 1f43a30: e58d307c str r3, [sp, #124] ; 0x7c + 1f43a34: d2888008 addle r8, r8, #8 + 1f43a38: ca000166 bgt 1f43fd8 <_vfprintf_r+0x11e0> + 1f43a3c: e59d2030 ldr r2, [sp, #48] ; 0x30 + 1f43a40: e3520000 cmp r2, #0 + 1f43a44: 0a00000b beq 1f43a78 <_vfprintf_r+0xc80> + 1f43a48: e3a01002 mov r1, #2 + 1f43a4c: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f43a50: e2822001 add r2, r2, #1 + 1f43a54: e3520007 cmp r2, #7 + 1f43a58: e0833001 add r3, r3, r1 + 1f43a5c: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43a60: e28d2058 add r2, sp, #88 ; 0x58 + 1f43a64: e5881004 str r1, [r8, #4] + 1f43a68: e5882000 str r2, [r8] + 1f43a6c: e58d307c str r3, [sp, #124] ; 0x7c + 1f43a70: d2888008 addle r8, r8, #8 + 1f43a74: ca00014e bgt 1f43fb4 <_vfprintf_r+0x11bc> + 1f43a78: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f43a7c: e3520080 cmp r2, #128 ; 0x80 + 1f43a80: 0a0000cd beq 1f43dbc <_vfprintf_r+0xfc4> + 1f43a84: e59d2014 ldr r2, [sp, #20] + 1f43a88: e59d1024 ldr r1, [sp, #36] ; 0x24 + 1f43a8c: e0614002 rsb r4, r1, r2 + 1f43a90: e3540000 cmp r4, #0 + 1f43a94: da000034 ble 1f43b6c <_vfprintf_r+0xd74> + 1f43a98: e3540010 cmp r4, #16 + 1f43a9c: da00036d ble 1f44858 <_vfprintf_r+0x1a60> + 1f43aa0: e51f1850 ldr r1, [pc, #-2128] ; 1f43258 <_vfprintf_r+0x460> + 1f43aa4: e3a07010 mov r7, #16 + 1f43aa8: e58d1030 str r1, [sp, #48] ; 0x30 + 1f43aac: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f43ab0: e1a01008 mov r1, r8 + 1f43ab4: e1a08004 mov r8, r4 + 1f43ab8: e59d4018 ldr r4, [sp, #24] + 1f43abc: ea000002 b 1f43acc <_vfprintf_r+0xcd4> + 1f43ac0: e2488010 sub r8, r8, #16 + 1f43ac4: e3580010 cmp r8, #16 + 1f43ac8: da000014 ble 1f43b20 <_vfprintf_r+0xd28> + 1f43acc: e2822001 add r2, r2, #1 + 1f43ad0: e3520007 cmp r2, #7 + 1f43ad4: e2833010 add r3, r3, #16 + 1f43ad8: e5819000 str r9, [r1] + 1f43adc: e5817004 str r7, [r1, #4] + 1f43ae0: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43ae4: e58d307c str r3, [sp, #124] ; 0x7c + 1f43ae8: d2811008 addle r1, r1, #8 + 1f43aec: dafffff3 ble 1f43ac0 <_vfprintf_r+0xcc8> + 1f43af0: e28d2074 add r2, sp, #116 ; 0x74 + 1f43af4: e1a0100a mov r1, sl + 1f43af8: e1a00004 mov r0, r4 + 1f43afc: eb0017cb bl 1f49a30 <__sprint_r> + 1f43b00: e3500000 cmp r0, #0 + 1f43b04: 1afffd96 bne 1f43164 <_vfprintf_r+0x36c> + 1f43b08: e2488010 sub r8, r8, #16 + 1f43b0c: e28d2078 add r2, sp, #120 ; 0x78 + 1f43b10: e3580010 cmp r8, #16 + 1f43b14: e28d10a8 add r1, sp, #168 ; 0xa8 + 1f43b18: e892000c ldm r2, {r2, r3} + 1f43b1c: caffffea bgt 1f43acc <_vfprintf_r+0xcd4> + 1f43b20: e1a04008 mov r4, r8 + 1f43b24: e1a08001 mov r8, r1 + 1f43b28: e2822001 add r2, r2, #1 + 1f43b2c: e3520007 cmp r2, #7 + 1f43b30: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43b34: e59d2030 ldr r2, [sp, #48] ; 0x30 + 1f43b38: e0833004 add r3, r3, r4 + 1f43b3c: e8880014 stm r8, {r2, r4} + 1f43b40: e58d307c str r3, [sp, #124] ; 0x7c + 1f43b44: d2888008 addle r8, r8, #8 + 1f43b48: da000007 ble 1f43b6c <_vfprintf_r+0xd74> + 1f43b4c: e28d2074 add r2, sp, #116 ; 0x74 + 1f43b50: e1a0100a mov r1, sl + 1f43b54: e59d0018 ldr r0, [sp, #24] + 1f43b58: eb0017b4 bl 1f49a30 <__sprint_r> + 1f43b5c: e3500000 cmp r0, #0 + 1f43b60: 1afffd7f bne 1f43164 <_vfprintf_r+0x36c> + 1f43b64: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f43b68: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f43b6c: e3150c01 tst r5, #256 ; 0x100 + 1f43b70: 1a00004d bne 1f43cac <_vfprintf_r+0xeb4> + 1f43b74: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f43b78: e59d1024 ldr r1, [sp, #36] ; 0x24 + 1f43b7c: e2822001 add r2, r2, #1 + 1f43b80: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f43b84: e0833001 add r3, r3, r1 + 1f43b88: e3520007 cmp r2, #7 + 1f43b8c: e58d307c str r3, [sp, #124] ; 0x7c + 1f43b90: e8880003 stm r8, {r0, r1} + 1f43b94: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43b98: ca000122 bgt 1f44028 <_vfprintf_r+0x1230> + 1f43b9c: e2888008 add r8, r8, #8 + 1f43ba0: e3150004 tst r5, #4 + 1f43ba4: 0a000033 beq 1f43c78 <_vfprintf_r+0xe80> + 1f43ba8: e59d2020 ldr r2, [sp, #32] + 1f43bac: e59d1008 ldr r1, [sp, #8] + 1f43bb0: e0614002 rsb r4, r1, r2 + 1f43bb4: e3540000 cmp r4, #0 + 1f43bb8: da00002e ble 1f43c78 <_vfprintf_r+0xe80> + 1f43bbc: e3540010 cmp r4, #16 + 1f43bc0: da000429 ble 1f44c6c <_vfprintf_r+0x1e74> + 1f43bc4: e51f197c ldr r1, [pc, #-2428] ; 1f43250 <_vfprintf_r+0x458> + 1f43bc8: e3a06010 mov r6, #16 + 1f43bcc: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f43bd0: e58d1040 str r1, [sp, #64] ; 0x40 + 1f43bd4: e59d5018 ldr r5, [sp, #24] + 1f43bd8: ea000002 b 1f43be8 <_vfprintf_r+0xdf0> + 1f43bdc: e2444010 sub r4, r4, #16 + 1f43be0: e3540010 cmp r4, #16 + 1f43be4: da000014 ble 1f43c3c <_vfprintf_r+0xe44> + 1f43be8: e2822001 add r2, r2, #1 + 1f43bec: e51f19a4 ldr r1, [pc, #-2468] ; 1f43250 <_vfprintf_r+0x458> + 1f43bf0: e3520007 cmp r2, #7 + 1f43bf4: e2833010 add r3, r3, #16 + 1f43bf8: e8880042 stm r8, {r1, r6} + 1f43bfc: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43c00: e58d307c str r3, [sp, #124] ; 0x7c + 1f43c04: d2888008 addle r8, r8, #8 + 1f43c08: dafffff3 ble 1f43bdc <_vfprintf_r+0xde4> + 1f43c0c: e28d2074 add r2, sp, #116 ; 0x74 + 1f43c10: e1a0100a mov r1, sl + 1f43c14: e1a00005 mov r0, r5 + 1f43c18: eb001784 bl 1f49a30 <__sprint_r> + 1f43c1c: e3500000 cmp r0, #0 + 1f43c20: 1afffd4f bne 1f43164 <_vfprintf_r+0x36c> + 1f43c24: e2444010 sub r4, r4, #16 + 1f43c28: e28d2078 add r2, sp, #120 ; 0x78 + 1f43c2c: e3540010 cmp r4, #16 + 1f43c30: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f43c34: e892000c ldm r2, {r2, r3} + 1f43c38: caffffea bgt 1f43be8 <_vfprintf_r+0xdf0> + 1f43c3c: e2822001 add r2, r2, #1 + 1f43c40: e3520007 cmp r2, #7 + 1f43c44: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43c48: e59d2040 ldr r2, [sp, #64] ; 0x40 + 1f43c4c: e0833004 add r3, r3, r4 + 1f43c50: e58d307c str r3, [sp, #124] ; 0x7c + 1f43c54: e8880014 stm r8, {r2, r4} + 1f43c58: da000006 ble 1f43c78 <_vfprintf_r+0xe80> + 1f43c5c: e28d2074 add r2, sp, #116 ; 0x74 + 1f43c60: e1a0100a mov r1, sl + 1f43c64: e59d0018 ldr r0, [sp, #24] + 1f43c68: eb001770 bl 1f49a30 <__sprint_r> + 1f43c6c: e3500000 cmp r0, #0 + 1f43c70: 1afffd3b bne 1f43164 <_vfprintf_r+0x36c> + 1f43c74: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f43c78: e59d201c ldr r2, [sp, #28] + 1f43c7c: e59d1020 ldr r1, [sp, #32] + 1f43c80: e59d0008 ldr r0, [sp, #8] + 1f43c84: e1510000 cmp r1, r0 + 1f43c88: a0822001 addge r2, r2, r1 + 1f43c8c: b0822000 addlt r2, r2, r0 + 1f43c90: e3530000 cmp r3, #0 + 1f43c94: e58d201c str r2, [sp, #28] + 1f43c98: 1a0000be bne 1f43f98 <_vfprintf_r+0x11a0> + 1f43c9c: e3a03000 mov r3, #0 + 1f43ca0: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f43ca4: e58d3078 str r3, [sp, #120] ; 0x78 + 1f43ca8: eafffc85 b 1f42ec4 <_vfprintf_r+0xcc> + 1f43cac: e3560065 cmp r6, #101 ; 0x65 + 1f43cb0: da00007c ble 1f43ea8 <_vfprintf_r+0x10b0> + 1f43cb4: eeb58b40 vcmp.f64 d8, #0.0 + 1f43cb8: eef1fa10 vmrs APSR_nzcv, fpscr + 1f43cbc: 1a0000e2 bne 1f4404c <_vfprintf_r+0x1254> + 1f43cc0: e3a01001 mov r1, #1 + 1f43cc4: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f43cc8: e51f0a7c ldr r0, [pc, #-2684] ; 1f43254 <_vfprintf_r+0x45c> + 1f43ccc: e0822001 add r2, r2, r1 + 1f43cd0: e0833001 add r3, r3, r1 + 1f43cd4: e3520007 cmp r2, #7 + 1f43cd8: e5880000 str r0, [r8] + 1f43cdc: e5881004 str r1, [r8, #4] + 1f43ce0: e58d307c str r3, [sp, #124] ; 0x7c + 1f43ce4: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43ce8: d2888008 addle r8, r8, #8 + 1f43cec: ca0002dd bgt 1f44868 <_vfprintf_r+0x1a70> + 1f43cf0: e59d205c ldr r2, [sp, #92] ; 0x5c + 1f43cf4: e59d103c ldr r1, [sp, #60] ; 0x3c + 1f43cf8: e1510002 cmp r1, r2 + 1f43cfc: ca000001 bgt 1f43d08 <_vfprintf_r+0xf10> + 1f43d00: e3150001 tst r5, #1 + 1f43d04: 0affffa5 beq 1f43ba0 <_vfprintf_r+0xda8> + 1f43d08: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f43d0c: e59d1044 ldr r1, [sp, #68] ; 0x44 + 1f43d10: e2822001 add r2, r2, #1 + 1f43d14: e59d0048 ldr r0, [sp, #72] ; 0x48 + 1f43d18: e0833001 add r3, r3, r1 + 1f43d1c: e3520007 cmp r2, #7 + 1f43d20: e8880003 stm r8, {r0, r1} + 1f43d24: e58d307c str r3, [sp, #124] ; 0x7c + 1f43d28: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43d2c: d2888008 addle r8, r8, #8 + 1f43d30: ca000371 bgt 1f44afc <_vfprintf_r+0x1d04> + 1f43d34: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f43d38: e2424001 sub r4, r2, #1 + 1f43d3c: e3540000 cmp r4, #0 + 1f43d40: daffff96 ble 1f43ba0 <_vfprintf_r+0xda8> + 1f43d44: e3540010 cmp r4, #16 + 1f43d48: da0000ab ble 1f43ffc <_vfprintf_r+0x1204> + 1f43d4c: e51f1afc ldr r1, [pc, #-2812] ; 1f43258 <_vfprintf_r+0x460> + 1f43d50: e3a06010 mov r6, #16 + 1f43d54: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f43d58: e58d1030 str r1, [sp, #48] ; 0x30 + 1f43d5c: e59d7018 ldr r7, [sp, #24] + 1f43d60: ea000002 b 1f43d70 <_vfprintf_r+0xf78> + 1f43d64: e2444010 sub r4, r4, #16 + 1f43d68: e3540010 cmp r4, #16 + 1f43d6c: da0000a5 ble 1f44008 <_vfprintf_r+0x1210> + 1f43d70: e2822001 add r2, r2, #1 + 1f43d74: e3520007 cmp r2, #7 + 1f43d78: e2833010 add r3, r3, #16 + 1f43d7c: e5889000 str r9, [r8] + 1f43d80: e5886004 str r6, [r8, #4] + 1f43d84: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43d88: e58d307c str r3, [sp, #124] ; 0x7c + 1f43d8c: d2888008 addle r8, r8, #8 + 1f43d90: dafffff3 ble 1f43d64 <_vfprintf_r+0xf6c> + 1f43d94: e28d2074 add r2, sp, #116 ; 0x74 + 1f43d98: e1a0100a mov r1, sl + 1f43d9c: e1a00007 mov r0, r7 + 1f43da0: eb001722 bl 1f49a30 <__sprint_r> + 1f43da4: e3500000 cmp r0, #0 + 1f43da8: 1afffced bne 1f43164 <_vfprintf_r+0x36c> + 1f43dac: e28d2078 add r2, sp, #120 ; 0x78 + 1f43db0: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f43db4: e892000c ldm r2, {r2, r3} + 1f43db8: eaffffe9 b 1f43d64 <_vfprintf_r+0xf6c> + 1f43dbc: e59d2020 ldr r2, [sp, #32] + 1f43dc0: e59d1008 ldr r1, [sp, #8] + 1f43dc4: e0614002 rsb r4, r1, r2 + 1f43dc8: e3540000 cmp r4, #0 + 1f43dcc: daffff2c ble 1f43a84 <_vfprintf_r+0xc8c> + 1f43dd0: e3540010 cmp r4, #16 + 1f43dd4: da000414 ble 1f44e2c <_vfprintf_r+0x2034> + 1f43dd8: e51f1b88 ldr r1, [pc, #-2952] ; 1f43258 <_vfprintf_r+0x460> + 1f43ddc: e3a07010 mov r7, #16 + 1f43de0: e58d1030 str r1, [sp, #48] ; 0x30 + 1f43de4: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f43de8: e1a01008 mov r1, r8 + 1f43dec: e1a08004 mov r8, r4 + 1f43df0: e59d4018 ldr r4, [sp, #24] + 1f43df4: ea000002 b 1f43e04 <_vfprintf_r+0x100c> + 1f43df8: e2488010 sub r8, r8, #16 + 1f43dfc: e3580010 cmp r8, #16 + 1f43e00: da000014 ble 1f43e58 <_vfprintf_r+0x1060> + 1f43e04: e2822001 add r2, r2, #1 + 1f43e08: e3520007 cmp r2, #7 + 1f43e0c: e2833010 add r3, r3, #16 + 1f43e10: e5819000 str r9, [r1] + 1f43e14: e5817004 str r7, [r1, #4] + 1f43e18: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43e1c: e58d307c str r3, [sp, #124] ; 0x7c + 1f43e20: d2811008 addle r1, r1, #8 + 1f43e24: dafffff3 ble 1f43df8 <_vfprintf_r+0x1000> + 1f43e28: e28d2074 add r2, sp, #116 ; 0x74 + 1f43e2c: e1a0100a mov r1, sl + 1f43e30: e1a00004 mov r0, r4 + 1f43e34: eb0016fd bl 1f49a30 <__sprint_r> + 1f43e38: e3500000 cmp r0, #0 + 1f43e3c: 1afffcc8 bne 1f43164 <_vfprintf_r+0x36c> + 1f43e40: e2488010 sub r8, r8, #16 + 1f43e44: e28d2078 add r2, sp, #120 ; 0x78 + 1f43e48: e3580010 cmp r8, #16 + 1f43e4c: e28d10a8 add r1, sp, #168 ; 0xa8 + 1f43e50: e892000c ldm r2, {r2, r3} + 1f43e54: caffffea bgt 1f43e04 <_vfprintf_r+0x100c> + 1f43e58: e1a04008 mov r4, r8 + 1f43e5c: e1a08001 mov r8, r1 + 1f43e60: e2822001 add r2, r2, #1 + 1f43e64: e3520007 cmp r2, #7 + 1f43e68: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43e6c: e59d2030 ldr r2, [sp, #48] ; 0x30 + 1f43e70: e0833004 add r3, r3, r4 + 1f43e74: e8880014 stm r8, {r2, r4} + 1f43e78: e58d307c str r3, [sp, #124] ; 0x7c + 1f43e7c: d2888008 addle r8, r8, #8 + 1f43e80: dafffeff ble 1f43a84 <_vfprintf_r+0xc8c> + 1f43e84: e28d2074 add r2, sp, #116 ; 0x74 + 1f43e88: e1a0100a mov r1, sl + 1f43e8c: e59d0018 ldr r0, [sp, #24] + 1f43e90: eb0016e6 bl 1f49a30 <__sprint_r> + 1f43e94: e3500000 cmp r0, #0 + 1f43e98: 1afffcb1 bne 1f43164 <_vfprintf_r+0x36c> + 1f43e9c: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f43ea0: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f43ea4: eafffef6 b 1f43a84 <_vfprintf_r+0xc8c> + 1f43ea8: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f43eac: e3520001 cmp r2, #1 + 1f43eb0: da000150 ble 1f443f8 <_vfprintf_r+0x1600> + 1f43eb4: e3a01001 mov r1, #1 + 1f43eb8: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f43ebc: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f43ec0: e0822001 add r2, r2, r1 + 1f43ec4: e0833001 add r3, r3, r1 + 1f43ec8: e3520007 cmp r2, #7 + 1f43ecc: e5880000 str r0, [r8] + 1f43ed0: e5881004 str r1, [r8, #4] + 1f43ed4: e58d307c str r3, [sp, #124] ; 0x7c + 1f43ed8: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43edc: d2888008 addle r8, r8, #8 + 1f43ee0: ca00015b bgt 1f44454 <_vfprintf_r+0x165c> + 1f43ee4: e59d1044 ldr r1, [sp, #68] ; 0x44 + 1f43ee8: e2822001 add r2, r2, #1 + 1f43eec: e59d0048 ldr r0, [sp, #72] ; 0x48 + 1f43ef0: e3520007 cmp r2, #7 + 1f43ef4: e0813003 add r3, r1, r3 + 1f43ef8: e8880003 stm r8, {r0, r1} + 1f43efc: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43f00: e58d307c str r3, [sp, #124] ; 0x7c + 1f43f04: d2888008 addle r8, r8, #8 + 1f43f08: ca00016d bgt 1f444c4 <_vfprintf_r+0x16cc> + 1f43f0c: eeb58b40 vcmp.f64 d8, #0.0 + 1f43f10: eef1fa10 vmrs APSR_nzcv, fpscr + 1f43f14: 0a00009b beq 1f44188 <_vfprintf_r+0x1390> + 1f43f18: e59d103c ldr r1, [sp, #60] ; 0x3c + 1f43f1c: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f43f20: e2822001 add r2, r2, #1 + 1f43f24: e2411001 sub r1, r1, #1 + 1f43f28: e2800001 add r0, r0, #1 + 1f43f2c: e0833001 add r3, r3, r1 + 1f43f30: e3520007 cmp r2, #7 + 1f43f34: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43f38: e5880000 str r0, [r8] + 1f43f3c: e58d307c str r3, [sp, #124] ; 0x7c + 1f43f40: e5881004 str r1, [r8, #4] + 1f43f44: ca000154 bgt 1f4449c <_vfprintf_r+0x16a4> + 1f43f48: e2888008 add r8, r8, #8 + 1f43f4c: e59d004c ldr r0, [sp, #76] ; 0x4c + 1f43f50: e2822001 add r2, r2, #1 + 1f43f54: e3520007 cmp r2, #7 + 1f43f58: e58d2078 str r2, [sp, #120] ; 0x78 + 1f43f5c: e1a02000 mov r2, r0 + 1f43f60: e0803003 add r3, r0, r3 + 1f43f64: e28d1064 add r1, sp, #100 ; 0x64 + 1f43f68: e58d307c str r3, [sp, #124] ; 0x7c + 1f43f6c: e8880006 stm r8, {r1, r2} + 1f43f70: daffff09 ble 1f43b9c <_vfprintf_r+0xda4> + 1f43f74: e28d2074 add r2, sp, #116 ; 0x74 + 1f43f78: e1a0100a mov r1, sl + 1f43f7c: e59d0018 ldr r0, [sp, #24] + 1f43f80: eb0016aa bl 1f49a30 <__sprint_r> + 1f43f84: e3500000 cmp r0, #0 + 1f43f88: 1afffc75 bne 1f43164 <_vfprintf_r+0x36c> + 1f43f8c: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f43f90: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f43f94: eaffff01 b 1f43ba0 <_vfprintf_r+0xda8> + 1f43f98: e28d2074 add r2, sp, #116 ; 0x74 + 1f43f9c: e1a0100a mov r1, sl + 1f43fa0: e59d0018 ldr r0, [sp, #24] + 1f43fa4: eb0016a1 bl 1f49a30 <__sprint_r> + 1f43fa8: e3500000 cmp r0, #0 + 1f43fac: 0affff3a beq 1f43c9c <_vfprintf_r+0xea4> + 1f43fb0: eafffc6b b 1f43164 <_vfprintf_r+0x36c> + 1f43fb4: e28d2074 add r2, sp, #116 ; 0x74 + 1f43fb8: e1a0100a mov r1, sl + 1f43fbc: e59d0018 ldr r0, [sp, #24] + 1f43fc0: eb00169a bl 1f49a30 <__sprint_r> + 1f43fc4: e3500000 cmp r0, #0 + 1f43fc8: 1afffc65 bne 1f43164 <_vfprintf_r+0x36c> + 1f43fcc: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f43fd0: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f43fd4: eafffea7 b 1f43a78 <_vfprintf_r+0xc80> + 1f43fd8: e28d2074 add r2, sp, #116 ; 0x74 + 1f43fdc: e1a0100a mov r1, sl + 1f43fe0: e59d0018 ldr r0, [sp, #24] + 1f43fe4: eb001691 bl 1f49a30 <__sprint_r> + 1f43fe8: e3500000 cmp r0, #0 + 1f43fec: 1afffc5c bne 1f43164 <_vfprintf_r+0x36c> + 1f43ff0: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f43ff4: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f43ff8: eafffe8f b 1f43a3c <_vfprintf_r+0xc44> + 1f43ffc: e51f1dac ldr r1, [pc, #-3500] ; 1f43258 <_vfprintf_r+0x460> + 1f44000: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f44004: e58d1030 str r1, [sp, #48] ; 0x30 + 1f44008: e2822001 add r2, r2, #1 + 1f4400c: e58d2078 str r2, [sp, #120] ; 0x78 + 1f44010: e3520007 cmp r2, #7 + 1f44014: e59d2030 ldr r2, [sp, #48] ; 0x30 + 1f44018: e0833004 add r3, r3, r4 + 1f4401c: e58d307c str r3, [sp, #124] ; 0x7c + 1f44020: e8880014 stm r8, {r2, r4} + 1f44024: dafffedc ble 1f43b9c <_vfprintf_r+0xda4> + 1f44028: e28d2074 add r2, sp, #116 ; 0x74 + 1f4402c: e1a0100a mov r1, sl + 1f44030: e59d0018 ldr r0, [sp, #24] + 1f44034: eb00167d bl 1f49a30 <__sprint_r> + 1f44038: e3500000 cmp r0, #0 + 1f4403c: 1afffc48 bne 1f43164 <_vfprintf_r+0x36c> + 1f44040: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f44044: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f44048: eafffed4 b 1f43ba0 <_vfprintf_r+0xda8> + 1f4404c: e59d405c ldr r4, [sp, #92] ; 0x5c + 1f44050: e3540000 cmp r4, #0 + 1f44054: da000212 ble 1f448a4 <_vfprintf_r+0x1aac> + 1f44058: e28d1038 add r1, sp, #56 ; 0x38 + 1f4405c: e8910006 ldm r1, {r1, r2} + 1f44060: e1520001 cmp r2, r1 + 1f44064: b1a04002 movlt r4, r2 + 1f44068: a1a04001 movge r4, r1 + 1f4406c: e3540000 cmp r4, #0 + 1f44070: da000009 ble 1f4409c <_vfprintf_r+0x12a4> + 1f44074: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f44078: e59d102c ldr r1, [sp, #44] ; 0x2c + 1f4407c: e2822001 add r2, r2, #1 + 1f44080: e0833004 add r3, r3, r4 + 1f44084: e3520007 cmp r2, #7 + 1f44088: e8880012 stm r8, {r1, r4} + 1f4408c: e58d307c str r3, [sp, #124] ; 0x7c + 1f44090: e58d2078 str r2, [sp, #120] ; 0x78 + 1f44094: d2888008 addle r8, r8, #8 + 1f44098: ca0002de bgt 1f44c18 <_vfprintf_r+0x1e20> + 1f4409c: e59d2038 ldr r2, [sp, #56] ; 0x38 + 1f440a0: e3540000 cmp r4, #0 + 1f440a4: a0642002 rsbge r2, r4, r2 + 1f440a8: e3520000 cmp r2, #0 + 1f440ac: e1a04002 mov r4, r2 + 1f440b0: da00007b ble 1f442a4 <_vfprintf_r+0x14ac> + 1f440b4: e3520010 cmp r2, #16 + 1f440b8: da000065 ble 1f44254 <_vfprintf_r+0x145c> + 1f440bc: e51f1e6c ldr r1, [pc, #-3692] ; 1f43258 <_vfprintf_r+0x460> + 1f440c0: e3a06010 mov r6, #16 + 1f440c4: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f440c8: e58d1030 str r1, [sp, #48] ; 0x30 + 1f440cc: e59d7018 ldr r7, [sp, #24] + 1f440d0: ea000002 b 1f440e0 <_vfprintf_r+0x12e8> + 1f440d4: e2444010 sub r4, r4, #16 + 1f440d8: e3540010 cmp r4, #16 + 1f440dc: da00005f ble 1f44260 <_vfprintf_r+0x1468> + 1f440e0: e2822001 add r2, r2, #1 + 1f440e4: e3520007 cmp r2, #7 + 1f440e8: e2833010 add r3, r3, #16 + 1f440ec: e5889000 str r9, [r8] + 1f440f0: e5886004 str r6, [r8, #4] + 1f440f4: e58d2078 str r2, [sp, #120] ; 0x78 + 1f440f8: e58d307c str r3, [sp, #124] ; 0x7c + 1f440fc: d2888008 addle r8, r8, #8 + 1f44100: dafffff3 ble 1f440d4 <_vfprintf_r+0x12dc> + 1f44104: e28d2074 add r2, sp, #116 ; 0x74 + 1f44108: e1a0100a mov r1, sl + 1f4410c: e1a00007 mov r0, r7 + 1f44110: eb001646 bl 1f49a30 <__sprint_r> + 1f44114: e3500000 cmp r0, #0 + 1f44118: 1afffc11 bne 1f43164 <_vfprintf_r+0x36c> + 1f4411c: e28d2078 add r2, sp, #120 ; 0x78 + 1f44120: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f44124: e892000c ldm r2, {r2, r3} + 1f44128: eaffffe9 b 1f440d4 <_vfprintf_r+0x12dc> + 1f4412c: e3a03030 mov r3, #48 ; 0x30 + 1f44130: e28d20e8 add r2, sp, #232 ; 0xe8 + 1f44134: e5623041 strb r3, [r2, #-65]! ; 0xffffffbf + 1f44138: e28d30a8 add r3, sp, #168 ; 0xa8 + 1f4413c: e0623003 rsb r3, r2, r3 + 1f44140: e3a07000 mov r7, #0 + 1f44144: e58d202c str r2, [sp, #44] ; 0x2c + 1f44148: e58d3024 str r3, [sp, #36] ; 0x24 + 1f4414c: eafffc63 b 1f432e0 <_vfprintf_r+0x4e8> + 1f44150: e5dd7057 ldrb r7, [sp, #87] ; 0x57 + 1f44154: e28d2008 add r2, sp, #8 + 1f44158: e8920006 ldm r2, {r1, r2} + 1f4415c: e3520000 cmp r2, #0 + 1f44160: 03510009 cmpeq r1, #9 + 1f44164: 8a0000e0 bhi 1f444ec <_vfprintf_r+0x16f4> + 1f44168: e28d30e8 add r3, sp, #232 ; 0xe8 + 1f4416c: e2812030 add r2, r1, #48 ; 0x30 + 1f44170: e5632041 strb r2, [r3, #-65]! ; 0xffffffbf + 1f44174: e28d20a8 add r2, sp, #168 ; 0xa8 + 1f44178: e0632002 rsb r2, r3, r2 + 1f4417c: e58d2024 str r2, [sp, #36] ; 0x24 + 1f44180: e58d302c str r3, [sp, #44] ; 0x2c + 1f44184: eafffc55 b 1f432e0 <_vfprintf_r+0x4e8> + 1f44188: e59d103c ldr r1, [sp, #60] ; 0x3c + 1f4418c: e2414001 sub r4, r1, #1 + 1f44190: e3540000 cmp r4, #0 + 1f44194: daffff6c ble 1f43f4c <_vfprintf_r+0x1154> + 1f44198: e3540010 cmp r4, #16 + 1f4419c: d51f1f4c ldrle r1, [pc, #-3916] ; 1f43258 <_vfprintf_r+0x460> + 1f441a0: d58d1030 strle r1, [sp, #48] ; 0x30 + 1f441a4: da0000b4 ble 1f4447c <_vfprintf_r+0x1684> + 1f441a8: e51f1f58 ldr r1, [pc, #-3928] ; 1f43258 <_vfprintf_r+0x460> + 1f441ac: e3a06010 mov r6, #16 + 1f441b0: e58d1030 str r1, [sp, #48] ; 0x30 + 1f441b4: e59d7018 ldr r7, [sp, #24] + 1f441b8: ea000002 b 1f441c8 <_vfprintf_r+0x13d0> + 1f441bc: e2444010 sub r4, r4, #16 + 1f441c0: e3540010 cmp r4, #16 + 1f441c4: da0000ac ble 1f4447c <_vfprintf_r+0x1684> + 1f441c8: e2822001 add r2, r2, #1 + 1f441cc: e3520007 cmp r2, #7 + 1f441d0: e2833010 add r3, r3, #16 + 1f441d4: e5889000 str r9, [r8] + 1f441d8: e5886004 str r6, [r8, #4] + 1f441dc: e58d2078 str r2, [sp, #120] ; 0x78 + 1f441e0: e58d307c str r3, [sp, #124] ; 0x7c + 1f441e4: d2888008 addle r8, r8, #8 + 1f441e8: dafffff3 ble 1f441bc <_vfprintf_r+0x13c4> + 1f441ec: e28d2074 add r2, sp, #116 ; 0x74 + 1f441f0: e1a0100a mov r1, sl + 1f441f4: e1a00007 mov r0, r7 + 1f441f8: eb00160c bl 1f49a30 <__sprint_r> + 1f441fc: e3500000 cmp r0, #0 + 1f44200: 1afffbd7 bne 1f43164 <_vfprintf_r+0x36c> + 1f44204: e28d2078 add r2, sp, #120 ; 0x78 + 1f44208: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f4420c: e892000c ldm r2, {r2, r3} + 1f44210: eaffffe9 b 1f441bc <_vfprintf_r+0x13c4> + 1f44214: e59d0014 ldr r0, [sp, #20] + 1f44218: e3500000 cmp r0, #0 + 1f4421c: e5cd1057 strb r1, [sp, #87] ; 0x57 + 1f44220: bafffd0e blt 1f43660 <_vfprintf_r+0x868> + 1f44224: 13a01001 movne r1, #1 + 1f44228: 03a01000 moveq r1, #0 + 1f4422c: e1920003 orrs r0, r2, r3 + 1f44230: 13811001 orrne r1, r1, #1 + 1f44234: e3510000 cmp r1, #0 + 1f44238: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4423c: 01a07001 moveq r7, r1 + 1f44240: 0afffc21 beq 1f432cc <_vfprintf_r+0x4d4> + 1f44244: eafffd05 b 1f43660 <_vfprintf_r+0x868> + 1f44248: e58d0028 str r0, [sp, #40] ; 0x28 + 1f4424c: e1a07002 mov r7, r2 + 1f44250: eaffffbf b 1f44154 <_vfprintf_r+0x135c> + 1f44254: e59f1da8 ldr r1, [pc, #3496] ; 1f45004 <_vfprintf_r+0x220c> + 1f44258: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f4425c: e58d1030 str r1, [sp, #48] ; 0x30 + 1f44260: e2822001 add r2, r2, #1 + 1f44264: e3520007 cmp r2, #7 + 1f44268: e58d2078 str r2, [sp, #120] ; 0x78 + 1f4426c: e59d2030 ldr r2, [sp, #48] ; 0x30 + 1f44270: e0833004 add r3, r3, r4 + 1f44274: e8880014 stm r8, {r2, r4} + 1f44278: e58d307c str r3, [sp, #124] ; 0x7c + 1f4427c: d2888008 addle r8, r8, #8 + 1f44280: da000007 ble 1f442a4 <_vfprintf_r+0x14ac> + 1f44284: e28d2074 add r2, sp, #116 ; 0x74 + 1f44288: e1a0100a mov r1, sl + 1f4428c: e59d0018 ldr r0, [sp, #24] + 1f44290: eb0015e6 bl 1f49a30 <__sprint_r> + 1f44294: e3500000 cmp r0, #0 + 1f44298: 1afffbb1 bne 1f43164 <_vfprintf_r+0x36c> + 1f4429c: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f442a0: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f442a4: e59d103c ldr r1, [sp, #60] ; 0x3c + 1f442a8: e59d205c ldr r2, [sp, #92] ; 0x5c + 1f442ac: e59d0038 ldr r0, [sp, #56] ; 0x38 + 1f442b0: e1510002 cmp r1, r2 + 1f442b4: e59d102c ldr r1, [sp, #44] ; 0x2c + 1f442b8: e0816000 add r6, r1, r0 + 1f442bc: ca000037 bgt 1f443a0 <_vfprintf_r+0x15a8> + 1f442c0: e3150001 tst r5, #1 + 1f442c4: 1a000035 bne 1f443a0 <_vfprintf_r+0x15a8> + 1f442c8: e59d103c ldr r1, [sp, #60] ; 0x3c + 1f442cc: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f442d0: e0804001 add r4, r0, r1 + 1f442d4: e0664004 rsb r4, r6, r4 + 1f442d8: e0622001 rsb r2, r2, r1 + 1f442dc: e1540002 cmp r4, r2 + 1f442e0: a1a04002 movge r4, r2 + 1f442e4: e3540000 cmp r4, #0 + 1f442e8: da000009 ble 1f44314 <_vfprintf_r+0x151c> + 1f442ec: e59d1078 ldr r1, [sp, #120] ; 0x78 + 1f442f0: e2811001 add r1, r1, #1 + 1f442f4: e0833004 add r3, r3, r4 + 1f442f8: e3510007 cmp r1, #7 + 1f442fc: e5886000 str r6, [r8] + 1f44300: e5884004 str r4, [r8, #4] + 1f44304: e58d307c str r3, [sp, #124] ; 0x7c + 1f44308: e58d1078 str r1, [sp, #120] ; 0x78 + 1f4430c: d2888008 addle r8, r8, #8 + 1f44310: ca000249 bgt 1f44c3c <_vfprintf_r+0x1e44> + 1f44314: e3540000 cmp r4, #0 + 1f44318: b1a04002 movlt r4, r2 + 1f4431c: a0644002 rsbge r4, r4, r2 + 1f44320: e3540000 cmp r4, #0 + 1f44324: dafffe1d ble 1f43ba0 <_vfprintf_r+0xda8> + 1f44328: e3540010 cmp r4, #16 + 1f4432c: daffff32 ble 1f43ffc <_vfprintf_r+0x1204> + 1f44330: e59f1ccc ldr r1, [pc, #3276] ; 1f45004 <_vfprintf_r+0x220c> + 1f44334: e3a06010 mov r6, #16 + 1f44338: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f4433c: e58d1030 str r1, [sp, #48] ; 0x30 + 1f44340: e59d7018 ldr r7, [sp, #24] + 1f44344: ea000002 b 1f44354 <_vfprintf_r+0x155c> + 1f44348: e2444010 sub r4, r4, #16 + 1f4434c: e3540010 cmp r4, #16 + 1f44350: daffff2c ble 1f44008 <_vfprintf_r+0x1210> + 1f44354: e2822001 add r2, r2, #1 + 1f44358: e3520007 cmp r2, #7 + 1f4435c: e2833010 add r3, r3, #16 + 1f44360: e5889000 str r9, [r8] + 1f44364: e5886004 str r6, [r8, #4] + 1f44368: e58d2078 str r2, [sp, #120] ; 0x78 + 1f4436c: e58d307c str r3, [sp, #124] ; 0x7c + 1f44370: d2888008 addle r8, r8, #8 + 1f44374: dafffff3 ble 1f44348 <_vfprintf_r+0x1550> + 1f44378: e28d2074 add r2, sp, #116 ; 0x74 + 1f4437c: e1a0100a mov r1, sl + 1f44380: e1a00007 mov r0, r7 + 1f44384: eb0015a9 bl 1f49a30 <__sprint_r> + 1f44388: e3500000 cmp r0, #0 + 1f4438c: 1afffb74 bne 1f43164 <_vfprintf_r+0x36c> + 1f44390: e28d2078 add r2, sp, #120 ; 0x78 + 1f44394: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f44398: e892000c ldm r2, {r2, r3} + 1f4439c: eaffffe9 b 1f44348 <_vfprintf_r+0x1550> + 1f443a0: e59d1078 ldr r1, [sp, #120] ; 0x78 + 1f443a4: e59d0044 ldr r0, [sp, #68] ; 0x44 + 1f443a8: e2811001 add r1, r1, #1 + 1f443ac: e59dc048 ldr ip, [sp, #72] ; 0x48 + 1f443b0: e0833000 add r3, r3, r0 + 1f443b4: e3510007 cmp r1, #7 + 1f443b8: e588c000 str ip, [r8] + 1f443bc: e5880004 str r0, [r8, #4] + 1f443c0: e58d307c str r3, [sp, #124] ; 0x7c + 1f443c4: e58d1078 str r1, [sp, #120] ; 0x78 + 1f443c8: d2888008 addle r8, r8, #8 + 1f443cc: daffffbd ble 1f442c8 <_vfprintf_r+0x14d0> + 1f443d0: e28d2074 add r2, sp, #116 ; 0x74 + 1f443d4: e1a0100a mov r1, sl + 1f443d8: e59d0018 ldr r0, [sp, #24] + 1f443dc: eb001593 bl 1f49a30 <__sprint_r> + 1f443e0: e3500000 cmp r0, #0 + 1f443e4: 1afffb5e bne 1f43164 <_vfprintf_r+0x36c> + 1f443e8: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f443ec: e59d205c ldr r2, [sp, #92] ; 0x5c + 1f443f0: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f443f4: eaffffb3 b 1f442c8 <_vfprintf_r+0x14d0> + 1f443f8: e3150001 tst r5, #1 + 1f443fc: 1afffeac bne 1f43eb4 <_vfprintf_r+0x10bc> + 1f44400: e3a01001 mov r1, #1 + 1f44404: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f44408: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f4440c: e0822001 add r2, r2, r1 + 1f44410: e0833001 add r3, r3, r1 + 1f44414: e3520007 cmp r2, #7 + 1f44418: e58d307c str r3, [sp, #124] ; 0x7c + 1f4441c: e5880000 str r0, [r8] + 1f44420: e58d2078 str r2, [sp, #120] ; 0x78 + 1f44424: e5881004 str r1, [r8, #4] + 1f44428: dafffec6 ble 1f43f48 <_vfprintf_r+0x1150> + 1f4442c: e28d2074 add r2, sp, #116 ; 0x74 + 1f44430: e1a0100a mov r1, sl + 1f44434: e59d0018 ldr r0, [sp, #24] + 1f44438: eb00157c bl 1f49a30 <__sprint_r> + 1f4443c: e3500000 cmp r0, #0 + 1f44440: 1afffb47 bne 1f43164 <_vfprintf_r+0x36c> + 1f44444: e28d2078 add r2, sp, #120 ; 0x78 + 1f44448: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f4444c: e892000c ldm r2, {r2, r3} + 1f44450: eafffebd b 1f43f4c <_vfprintf_r+0x1154> + 1f44454: e28d2074 add r2, sp, #116 ; 0x74 + 1f44458: e1a0100a mov r1, sl + 1f4445c: e59d0018 ldr r0, [sp, #24] + 1f44460: eb001572 bl 1f49a30 <__sprint_r> + 1f44464: e3500000 cmp r0, #0 + 1f44468: 1afffb3d bne 1f43164 <_vfprintf_r+0x36c> + 1f4446c: e28d2078 add r2, sp, #120 ; 0x78 + 1f44470: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f44474: e892000c ldm r2, {r2, r3} + 1f44478: eafffe99 b 1f43ee4 <_vfprintf_r+0x10ec> + 1f4447c: e2822001 add r2, r2, #1 + 1f44480: e59d1030 ldr r1, [sp, #48] ; 0x30 + 1f44484: e0833004 add r3, r3, r4 + 1f44488: e3520007 cmp r2, #7 + 1f4448c: e58d2078 str r2, [sp, #120] ; 0x78 + 1f44490: e58d307c str r3, [sp, #124] ; 0x7c + 1f44494: e8880012 stm r8, {r1, r4} + 1f44498: dafffeaa ble 1f43f48 <_vfprintf_r+0x1150> + 1f4449c: e28d2074 add r2, sp, #116 ; 0x74 + 1f444a0: e1a0100a mov r1, sl + 1f444a4: e59d0018 ldr r0, [sp, #24] + 1f444a8: eb001560 bl 1f49a30 <__sprint_r> + 1f444ac: e3500000 cmp r0, #0 + 1f444b0: 1afffb2b bne 1f43164 <_vfprintf_r+0x36c> + 1f444b4: e28d2078 add r2, sp, #120 ; 0x78 + 1f444b8: e892000c ldm r2, {r2, r3} + 1f444bc: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f444c0: eafffea1 b 1f43f4c <_vfprintf_r+0x1154> + 1f444c4: e28d2074 add r2, sp, #116 ; 0x74 + 1f444c8: e1a0100a mov r1, sl + 1f444cc: e59d0018 ldr r0, [sp, #24] + 1f444d0: eb001556 bl 1f49a30 <__sprint_r> + 1f444d4: e3500000 cmp r0, #0 + 1f444d8: 1afffb21 bne 1f43164 <_vfprintf_r+0x36c> + 1f444dc: e28d2078 add r2, sp, #120 ; 0x78 + 1f444e0: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f444e4: e892000c ldm r2, {r2, r3} + 1f444e8: eafffe87 b 1f43f0c <_vfprintf_r+0x1114> + 1f444ec: e28d30a8 add r3, sp, #168 ; 0xa8 + 1f444f0: e58d6024 str r6, [sp, #36] ; 0x24 + 1f444f4: e1a06003 mov r6, r3 + 1f444f8: e58d5030 str r5, [sp, #48] ; 0x30 + 1f444fc: e28d5008 add r5, sp, #8 + 1f44500: e8950030 ldm r5, {r4, r5} + 1f44504: e1a00004 mov r0, r4 + 1f44508: e1a01005 mov r1, r5 + 1f4450c: e3a0200a mov r2, #10 + 1f44510: e3a03000 mov r3, #0 + 1f44514: eb001e90 bl 1f4bf5c <__aeabi_uldivmod> + 1f44518: e2822030 add r2, r2, #48 ; 0x30 + 1f4451c: e5662001 strb r2, [r6, #-1]! + 1f44520: e1a00004 mov r0, r4 + 1f44524: e1a01005 mov r1, r5 + 1f44528: e3a03000 mov r3, #0 + 1f4452c: e3a0200a mov r2, #10 + 1f44530: eb001e89 bl 1f4bf5c <__aeabi_uldivmod> + 1f44534: e1a04000 mov r4, r0 + 1f44538: e1a05001 mov r5, r1 + 1f4453c: e1943005 orrs r3, r4, r5 + 1f44540: 1affffef bne 1f44504 <_vfprintf_r+0x170c> + 1f44544: e1a03006 mov r3, r6 + 1f44548: e28d20a8 add r2, sp, #168 ; 0xa8 + 1f4454c: e0633002 rsb r3, r3, r2 + 1f44550: e58d602c str r6, [sp, #44] ; 0x2c + 1f44554: e59d5030 ldr r5, [sp, #48] ; 0x30 + 1f44558: e59d6024 ldr r6, [sp, #36] ; 0x24 + 1f4455c: e58d3024 str r3, [sp, #36] ; 0x24 + 1f44560: eafffb5e b 1f432e0 <_vfprintf_r+0x4e8> + 1f44564: e3a0302d mov r3, #45 ; 0x2d + 1f44568: e28d2008 add r2, sp, #8 + 1f4456c: e8920006 ldm r2, {r1, r2} + 1f44570: e2711000 rsbs r1, r1, #0 + 1f44574: e2e22000 rsc r2, r2, #0 + 1f44578: e58d1008 str r1, [sp, #8] + 1f4457c: e58d200c str r2, [sp, #12] + 1f44580: e59d2014 ldr r2, [sp, #20] + 1f44584: e3520000 cmp r2, #0 + 1f44588: e5cd3057 strb r3, [sp, #87] ; 0x57 + 1f4458c: bafffcff blt 1f43990 <_vfprintf_r+0xb98> + 1f44590: e3c55080 bic r5, r5, #128 ; 0x80 + 1f44594: e1a07003 mov r7, r3 + 1f44598: eafffeed b 1f44154 <_vfprintf_r+0x135c> + 1f4459c: e3a01000 mov r1, #0 + 1f445a0: e59d0014 ldr r0, [sp, #20] + 1f445a4: e1500001 cmp r0, r1 + 1f445a8: e5cd1057 strb r1, [sp, #87] ; 0x57 + 1f445ac: bafffc2b blt 1f43660 <_vfprintf_r+0x868> + 1f445b0: e3c55080 bic r5, r5, #128 ; 0x80 + 1f445b4: 01a07000 moveq r7, r0 + 1f445b8: 0afffb43 beq 1f432cc <_vfprintf_r+0x4d4> + 1f445bc: eafffc27 b 1f43660 <_vfprintf_r+0x868> + 1f445c0: eeb48b48 vcmp.f64 d8, d8 + 1f445c4: eef1fa10 vmrs APSR_nzcv, fpscr + 1f445c8: 6a000245 bvs 1f44ee4 <_vfprintf_r+0x20ec> + 1f445cc: e59d3014 ldr r3, [sp, #20] + 1f445d0: e3730001 cmn r3, #1 + 1f445d4: e3c63020 bic r3, r6, #32 + 1f445d8: e58d3008 str r3, [sp, #8] + 1f445dc: 03a03006 moveq r3, #6 + 1f445e0: 058d3014 streq r3, [sp, #20] + 1f445e4: 0a000003 beq 1f445f8 <_vfprintf_r+0x1800> + 1f445e8: e59d2014 ldr r2, [sp, #20] + 1f445ec: e3520000 cmp r2, #0 + 1f445f0: 03530047 cmpeq r3, #71 ; 0x47 + 1f445f4: 0a00010d beq 1f44a30 <_vfprintf_r+0x1c38> + 1f445f8: ee183a90 vmov r3, s17 + 1f445fc: e3530000 cmp r3, #0 + 1f44600: e3853c01 orr r3, r5, #256 ; 0x100 + 1f44604: e58d3030 str r3, [sp, #48] ; 0x30 + 1f44608: ba0001a8 blt 1f44cb0 <_vfprintf_r+0x1eb8> + 1f4460c: e59d3008 ldr r3, [sp, #8] + 1f44610: e3530046 cmp r3, #70 ; 0x46 + 1f44614: 0a00024a beq 1f44f44 <_vfprintf_r+0x214c> + 1f44618: eeb0ab48 vmov.f64 d10, d8 + 1f4461c: e3a07000 mov r7, #0 + 1f44620: e59d3008 ldr r3, [sp, #8] + 1f44624: e3530045 cmp r3, #69 ; 0x45 + 1f44628: 1a00010b bne 1f44a5c <_vfprintf_r+0x1c64> + 1f4462c: e59d3014 ldr r3, [sp, #20] + 1f44630: e28d106c add r1, sp, #108 ; 0x6c + 1f44634: e2834001 add r4, r3, #1 + 1f44638: e28d3060 add r3, sp, #96 ; 0x60 + 1f4463c: e58d1004 str r1, [sp, #4] + 1f44640: e58d3000 str r3, [sp] + 1f44644: e1a02004 mov r2, r4 + 1f44648: e28d305c add r3, sp, #92 ; 0x5c + 1f4464c: e3a01002 mov r1, #2 + 1f44650: eeb00b4a vmov.f64 d0, d10 + 1f44654: e59d0018 ldr r0, [sp, #24] + 1f44658: eb0003bc bl 1f45550 <_dtoa_r> + 1f4465c: e58d002c str r0, [sp, #44] ; 0x2c + 1f44660: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f44664: e0834004 add r4, r3, r4 + 1f44668: eeb5ab40 vcmp.f64 d10, #0.0 + 1f4466c: eef1fa10 vmrs APSR_nzcv, fpscr + 1f44670: 01a03004 moveq r3, r4 + 1f44674: 0a000009 beq 1f446a0 <_vfprintf_r+0x18a8> + 1f44678: e59d306c ldr r3, [sp, #108] ; 0x6c + 1f4467c: e1540003 cmp r4, r3 + 1f44680: 9a000006 bls 1f446a0 <_vfprintf_r+0x18a8> + 1f44684: e3a01030 mov r1, #48 ; 0x30 + 1f44688: e2832001 add r2, r3, #1 + 1f4468c: e58d206c str r2, [sp, #108] ; 0x6c + 1f44690: e5c31000 strb r1, [r3] + 1f44694: e59d306c ldr r3, [sp, #108] ; 0x6c + 1f44698: e1540003 cmp r4, r3 + 1f4469c: 8afffff9 bhi 1f44688 <_vfprintf_r+0x1890> + 1f446a0: e59d2008 ldr r2, [sp, #8] + 1f446a4: e3520047 cmp r2, #71 ; 0x47 + 1f446a8: e59d202c ldr r2, [sp, #44] ; 0x2c + 1f446ac: e0623003 rsb r3, r2, r3 + 1f446b0: e58d303c str r3, [sp, #60] ; 0x3c + 1f446b4: e59d305c ldr r3, [sp, #92] ; 0x5c + 1f446b8: 1a000141 bne 1f44bc4 <_vfprintf_r+0x1dcc> + 1f446bc: e3730003 cmn r3, #3 + 1f446c0: a3a02000 movge r2, #0 + 1f446c4: b3a02001 movlt r2, #1 + 1f446c8: e59d1014 ldr r1, [sp, #20] + 1f446cc: e1530001 cmp r3, r1 + 1f446d0: c3822001 orrgt r2, r2, #1 + 1f446d4: e3520000 cmp r2, #0 + 1f446d8: 12466002 subne r6, r6, #2 + 1f446dc: 1a000194 bne 1f44d34 <_vfprintf_r+0x1f3c> + 1f446e0: e58d3038 str r3, [sp, #56] ; 0x38 + 1f446e4: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f446e8: e59d3038 ldr r3, [sp, #56] ; 0x38 + 1f446ec: e1520003 cmp r2, r3 + 1f446f0: ca0001d1 bgt 1f44e3c <_vfprintf_r+0x2044> + 1f446f4: e3150001 tst r5, #1 + 1f446f8: 01a02003 moveq r2, r3 + 1f446fc: e3a06067 mov r6, #103 ; 0x67 + 1f44700: 159d3038 ldrne r3, [sp, #56] ; 0x38 + 1f44704: 159d2044 ldrne r2, [sp, #68] ; 0x44 + 1f44708: 058d2024 streq r2, [sp, #36] ; 0x24 + 1f4470c: 10833002 addne r3, r3, r2 + 1f44710: 158d3024 strne r3, [sp, #36] ; 0x24 + 1f44714: 01c33fc3 biceq r3, r3, r3, asr #31 + 1f44718: 11c33fc3 bicne r3, r3, r3, asr #31 + 1f4471c: e3570000 cmp r7, #0 + 1f44720: 1a000120 bne 1f44ba8 <_vfprintf_r+0x1db0> + 1f44724: e58d7014 str r7, [sp, #20] + 1f44728: e58d3008 str r3, [sp, #8] + 1f4472c: e59d5030 ldr r5, [sp, #48] ; 0x30 + 1f44730: e5dd7057 ldrb r7, [sp, #87] ; 0x57 + 1f44734: eafffaf0 b 1f432fc <_vfprintf_r+0x504> + 1f44738: e2153040 ands r3, r5, #64 ; 0x40 + 1f4473c: 1a0000ae bne 1f449fc <_vfprintf_r+0x1c04> + 1f44740: e59d0014 ldr r0, [sp, #20] + 1f44744: e59d1028 ldr r1, [sp, #40] ; 0x28 + 1f44748: e3500000 cmp r0, #0 + 1f4474c: e5cd3057 strb r3, [sp, #87] ; 0x57 + 1f44750: e5912000 ldr r2, [r1] + 1f44754: e2814004 add r4, r1, #4 + 1f44758: e3a03000 mov r3, #0 + 1f4475c: ba0000af blt 1f44a20 <_vfprintf_r+0x1c28> + 1f44760: e59d0014 ldr r0, [sp, #20] + 1f44764: e1821003 orr r1, r2, r3 + 1f44768: e3510000 cmp r1, #0 + 1f4476c: 03500000 cmpeq r0, #0 + 1f44770: e58d4028 str r4, [sp, #40] ; 0x28 + 1f44774: e3c55080 bic r5, r5, #128 ; 0x80 + 1f44778: 0afffbf9 beq 1f43764 <_vfprintf_r+0x96c> + 1f4477c: eafffb67 b 1f43520 <_vfprintf_r+0x728> + 1f44780: e215c040 ands ip, r5, #64 ; 0x40 + 1f44784: 1a000088 bne 1f449ac <_vfprintf_r+0x1bb4> + 1f44788: e59d2028 ldr r2, [sp, #40] ; 0x28 + 1f4478c: e59d1014 ldr r1, [sp, #20] + 1f44790: e5923000 ldr r3, [r2] + 1f44794: e3510000 cmp r1, #0 + 1f44798: e2824004 add r4, r2, #4 + 1f4479c: e1a01003 mov r1, r3 + 1f447a0: e3a02000 mov r2, #0 + 1f447a4: e5cdc057 strb ip, [sp, #87] ; 0x57 + 1f447a8: e58d1008 str r1, [sp, #8] + 1f447ac: e58d200c str r2, [sp, #12] + 1f447b0: b58d4028 strlt r4, [sp, #40] ; 0x28 + 1f447b4: b1a0700c movlt r7, ip + 1f447b8: bafffe65 blt 1f44154 <_vfprintf_r+0x135c> + 1f447bc: e28d2008 add r2, sp, #8 + 1f447c0: e8920006 ldm r2, {r1, r2} + 1f447c4: e1a00001 mov r0, r1 + 1f447c8: 13a03001 movne r3, #1 + 1f447cc: 03a03000 moveq r3, #0 + 1f447d0: e1902002 orrs r2, r0, r2 + 1f447d4: 13833001 orrne r3, r3, #1 + 1f447d8: e3530000 cmp r3, #0 + 1f447dc: e58d4028 str r4, [sp, #40] ; 0x28 + 1f447e0: e3c55080 bic r5, r5, #128 ; 0x80 + 1f447e4: 0afffb80 beq 1f435ec <_vfprintf_r+0x7f4> + 1f447e8: e1a0700c mov r7, ip + 1f447ec: eafffe58 b 1f44154 <_vfprintf_r+0x135c> + 1f447f0: e3150010 tst r5, #16 + 1f447f4: 1a000008 bne 1f4481c <_vfprintf_r+0x1a24> + 1f447f8: e3150040 tst r5, #64 ; 0x40 + 1f447fc: 0a000006 beq 1f4481c <_vfprintf_r+0x1a24> + 1f44800: e59d2028 ldr r2, [sp, #40] ; 0x28 + 1f44804: e5923000 ldr r3, [r2] + 1f44808: e2822004 add r2, r2, #4 + 1f4480c: e58d2028 str r2, [sp, #40] ; 0x28 + 1f44810: e1dd21bc ldrh r2, [sp, #28] + 1f44814: e1c320b0 strh r2, [r3] + 1f44818: eafff9a9 b 1f42ec4 <_vfprintf_r+0xcc> + 1f4481c: e59d2028 ldr r2, [sp, #40] ; 0x28 + 1f44820: e5923000 ldr r3, [r2] + 1f44824: e2822004 add r2, r2, #4 + 1f44828: e58d2028 str r2, [sp, #40] ; 0x28 + 1f4482c: e59d201c ldr r2, [sp, #28] + 1f44830: e5832000 str r2, [r3] + 1f44834: eafff9a2 b 1f42ec4 <_vfprintf_r+0xcc> + 1f44838: e3150040 tst r5, #64 ; 0x40 + 1f4483c: 0a000054 beq 1f44994 <_vfprintf_r+0x1b9c> + 1f44840: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f44844: e1d320b0 ldrh r2, [r3] + 1f44848: e2833004 add r3, r3, #4 + 1f4484c: e58d3028 str r3, [sp, #40] ; 0x28 + 1f44850: e3a03000 mov r3, #0 + 1f44854: eafffbf9 b 1f43840 <_vfprintf_r+0xa48> + 1f44858: e59f17a4 ldr r1, [pc, #1956] ; 1f45004 <_vfprintf_r+0x220c> + 1f4485c: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f44860: e58d1030 str r1, [sp, #48] ; 0x30 + 1f44864: eafffcaf b 1f43b28 <_vfprintf_r+0xd30> + 1f44868: e28d2074 add r2, sp, #116 ; 0x74 + 1f4486c: e1a0100a mov r1, sl + 1f44870: e59d0018 ldr r0, [sp, #24] + 1f44874: eb00146d bl 1f49a30 <__sprint_r> + 1f44878: e3500000 cmp r0, #0 + 1f4487c: 1afffa38 bne 1f43164 <_vfprintf_r+0x36c> + 1f44880: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f44884: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f44888: eafffd18 b 1f43cf0 <_vfprintf_r+0xef8> + 1f4488c: e1a07003 mov r7, r3 + 1f44890: e28d30a8 add r3, sp, #168 ; 0xa8 + 1f44894: e0603003 rsb r3, r0, r3 + 1f44898: e58d3024 str r3, [sp, #36] ; 0x24 + 1f4489c: e58d002c str r0, [sp, #44] ; 0x2c + 1f448a0: eafffa8e b 1f432e0 <_vfprintf_r+0x4e8> + 1f448a4: e3a01001 mov r1, #1 + 1f448a8: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f448ac: e59f0754 ldr r0, [pc, #1876] ; 1f45008 <_vfprintf_r+0x2210> + 1f448b0: e0822001 add r2, r2, r1 + 1f448b4: e0833001 add r3, r3, r1 + 1f448b8: e3520007 cmp r2, #7 + 1f448bc: e5880000 str r0, [r8] + 1f448c0: e5881004 str r1, [r8, #4] + 1f448c4: e58d307c str r3, [sp, #124] ; 0x7c + 1f448c8: e58d2078 str r2, [sp, #120] ; 0x78 + 1f448cc: d2888008 addle r8, r8, #8 + 1f448d0: ca00007a bgt 1f44ac0 <_vfprintf_r+0x1cc8> + 1f448d4: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f448d8: e1922004 orrs r2, r2, r4 + 1f448dc: 0a000074 beq 1f44ab4 <_vfprintf_r+0x1cbc> + 1f448e0: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f448e4: e59d1044 ldr r1, [sp, #68] ; 0x44 + 1f448e8: e2822001 add r2, r2, #1 + 1f448ec: e59d0048 ldr r0, [sp, #72] ; 0x48 + 1f448f0: e0813003 add r3, r1, r3 + 1f448f4: e3520007 cmp r2, #7 + 1f448f8: e8880003 stm r8, {r0, r1} + 1f448fc: e58d307c str r3, [sp, #124] ; 0x7c + 1f44900: e58d2078 str r2, [sp, #120] ; 0x78 + 1f44904: d2888008 addle r8, r8, #8 + 1f44908: ca000164 bgt 1f44ea0 <_vfprintf_r+0x20a8> + 1f4490c: e2644000 rsb r4, r4, #0 + 1f44910: e3540000 cmp r4, #0 + 1f44914: da000093 ble 1f44b68 <_vfprintf_r+0x1d70> + 1f44918: e3540010 cmp r4, #16 + 1f4491c: d59f16e0 ldrle r1, [pc, #1760] ; 1f45004 <_vfprintf_r+0x220c> + 1f44920: d58d1030 strle r1, [sp, #48] ; 0x30 + 1f44924: da00007d ble 1f44b20 <_vfprintf_r+0x1d28> + 1f44928: e59f16d4 ldr r1, [pc, #1748] ; 1f45004 <_vfprintf_r+0x220c> + 1f4492c: e3a06010 mov r6, #16 + 1f44930: e58d1030 str r1, [sp, #48] ; 0x30 + 1f44934: e59d7018 ldr r7, [sp, #24] + 1f44938: ea000002 b 1f44948 <_vfprintf_r+0x1b50> + 1f4493c: e2444010 sub r4, r4, #16 + 1f44940: e3540010 cmp r4, #16 + 1f44944: da000075 ble 1f44b20 <_vfprintf_r+0x1d28> + 1f44948: e2822001 add r2, r2, #1 + 1f4494c: e3520007 cmp r2, #7 + 1f44950: e2833010 add r3, r3, #16 + 1f44954: e5889000 str r9, [r8] + 1f44958: e5886004 str r6, [r8, #4] + 1f4495c: e58d2078 str r2, [sp, #120] ; 0x78 + 1f44960: e58d307c str r3, [sp, #124] ; 0x7c + 1f44964: d2888008 addle r8, r8, #8 + 1f44968: dafffff3 ble 1f4493c <_vfprintf_r+0x1b44> + 1f4496c: e28d2074 add r2, sp, #116 ; 0x74 + 1f44970: e1a0100a mov r1, sl + 1f44974: e1a00007 mov r0, r7 + 1f44978: eb00142c bl 1f49a30 <__sprint_r> + 1f4497c: e3500000 cmp r0, #0 + 1f44980: 1afff9f7 bne 1f43164 <_vfprintf_r+0x36c> + 1f44984: e28d2078 add r2, sp, #120 ; 0x78 + 1f44988: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f4498c: e892000c ldm r2, {r2, r3} + 1f44990: eaffffe9 b 1f4493c <_vfprintf_r+0x1b44> + 1f44994: e59d1028 ldr r1, [sp, #40] ; 0x28 + 1f44998: e5912000 ldr r2, [r1] + 1f4499c: e2811004 add r1, r1, #4 + 1f449a0: e3a03000 mov r3, #0 + 1f449a4: e58d1028 str r1, [sp, #40] ; 0x28 + 1f449a8: eafffba4 b 1f43840 <_vfprintf_r+0xa48> + 1f449ac: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f449b0: e59d0014 ldr r0, [sp, #20] + 1f449b4: e1d310b0 ldrh r1, [r3] + 1f449b8: e3500000 cmp r0, #0 + 1f449bc: e3a04000 mov r4, #0 + 1f449c0: e2830004 add r0, r3, #4 + 1f449c4: e1a03001 mov r3, r1 + 1f449c8: e5cd2057 strb r2, [sp, #87] ; 0x57 + 1f449cc: e58d3008 str r3, [sp, #8] + 1f449d0: e58d400c str r4, [sp, #12] + 1f449d4: bafffe1b blt 1f44248 <_vfprintf_r+0x1450> + 1f449d8: 13a03001 movne r3, #1 + 1f449dc: 03a03000 moveq r3, #0 + 1f449e0: e3510000 cmp r1, #0 + 1f449e4: 13833001 orrne r3, r3, #1 + 1f449e8: e3530000 cmp r3, #0 + 1f449ec: e58d0028 str r0, [sp, #40] ; 0x28 + 1f449f0: e3c55080 bic r5, r5, #128 ; 0x80 + 1f449f4: 1afffe14 bne 1f4424c <_vfprintf_r+0x1454> + 1f449f8: eafffafb b 1f435ec <_vfprintf_r+0x7f4> + 1f449fc: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f44a00: e59d0014 ldr r0, [sp, #20] + 1f44a04: e1d310b0 ldrh r1, [r3] + 1f44a08: e3500000 cmp r0, #0 + 1f44a0c: e5cd2057 strb r2, [sp, #87] ; 0x57 + 1f44a10: e2834004 add r4, r3, #4 + 1f44a14: e1a02001 mov r2, r1 + 1f44a18: e3a03000 mov r3, #0 + 1f44a1c: aaffff51 bge 1f44768 <_vfprintf_r+0x1970> + 1f44a20: e58d4028 str r4, [sp, #40] ; 0x28 + 1f44a24: eafffabd b 1f43520 <_vfprintf_r+0x728> + 1f44a28: e1d030f0 ldrsh r3, [r0] + 1f44a2c: eafffb6f b 1f437f0 <_vfprintf_r+0x9f8> + 1f44a30: ee183a90 vmov r3, s17 + 1f44a34: e3530000 cmp r3, #0 + 1f44a38: e3853c01 orr r3, r5, #256 ; 0x100 + 1f44a3c: e58d3030 str r3, [sp, #48] ; 0x30 + 1f44a40: ba000096 blt 1f44ca0 <_vfprintf_r+0x1ea8> + 1f44a44: e3a03047 mov r3, #71 ; 0x47 + 1f44a48: e58d3008 str r3, [sp, #8] + 1f44a4c: e3a03001 mov r3, #1 + 1f44a50: eeb0ab48 vmov.f64 d10, d8 + 1f44a54: e3a07000 mov r7, #0 + 1f44a58: e58d3014 str r3, [sp, #20] + 1f44a5c: e28d206c add r2, sp, #108 ; 0x6c + 1f44a60: e28d3060 add r3, sp, #96 ; 0x60 + 1f44a64: e58d2004 str r2, [sp, #4] + 1f44a68: e58d3000 str r3, [sp] + 1f44a6c: e59d2014 ldr r2, [sp, #20] + 1f44a70: e28d305c add r3, sp, #92 ; 0x5c + 1f44a74: e3a01002 mov r1, #2 + 1f44a78: eeb00b4a vmov.f64 d0, d10 + 1f44a7c: e59d0018 ldr r0, [sp, #24] + 1f44a80: eb0002b2 bl 1f45550 <_dtoa_r> + 1f44a84: e59d3008 ldr r3, [sp, #8] + 1f44a88: e3530047 cmp r3, #71 ; 0x47 + 1f44a8c: e58d002c str r0, [sp, #44] ; 0x2c + 1f44a90: 159d4014 ldrne r4, [sp, #20] + 1f44a94: 1afffef1 bne 1f44660 <_vfprintf_r+0x1868> + 1f44a98: e3150001 tst r5, #1 + 1f44a9c: 059d306c ldreq r3, [sp, #108] ; 0x6c + 1f44aa0: 0afffefe beq 1f446a0 <_vfprintf_r+0x18a8> + 1f44aa4: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f44aa8: e59d2014 ldr r2, [sp, #20] + 1f44aac: e0834002 add r4, r3, r2 + 1f44ab0: eafffeec b 1f44668 <_vfprintf_r+0x1870> + 1f44ab4: e3150001 tst r5, #1 + 1f44ab8: 0afffc38 beq 1f43ba0 <_vfprintf_r+0xda8> + 1f44abc: eaffff87 b 1f448e0 <_vfprintf_r+0x1ae8> + 1f44ac0: e28d2074 add r2, sp, #116 ; 0x74 + 1f44ac4: e1a0100a mov r1, sl + 1f44ac8: e59d0018 ldr r0, [sp, #24] + 1f44acc: eb0013d7 bl 1f49a30 <__sprint_r> + 1f44ad0: e3500000 cmp r0, #0 + 1f44ad4: 1afff9a2 bne 1f43164 <_vfprintf_r+0x36c> + 1f44ad8: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f44adc: e59d405c ldr r4, [sp, #92] ; 0x5c + 1f44ae0: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f44ae4: eaffff7a b 1f448d4 <_vfprintf_r+0x1adc> + 1f44ae8: e3855002 orr r5, r5, #2 + 1f44aec: e58d4028 str r4, [sp, #40] ; 0x28 + 1f44af0: e1a06000 mov r6, r0 + 1f44af4: e59fc510 ldr ip, [pc, #1296] ; 1f4500c <_vfprintf_r+0x2214> + 1f44af8: eafffad8 b 1f43660 <_vfprintf_r+0x868> + 1f44afc: e28d2074 add r2, sp, #116 ; 0x74 + 1f44b00: e1a0100a mov r1, sl + 1f44b04: e59d0018 ldr r0, [sp, #24] + 1f44b08: eb0013c8 bl 1f49a30 <__sprint_r> + 1f44b0c: e3500000 cmp r0, #0 + 1f44b10: 1afff993 bne 1f43164 <_vfprintf_r+0x36c> + 1f44b14: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f44b18: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f44b1c: eafffc84 b 1f43d34 <_vfprintf_r+0xf3c> + 1f44b20: e2822001 add r2, r2, #1 + 1f44b24: e59d1030 ldr r1, [sp, #48] ; 0x30 + 1f44b28: e3520007 cmp r2, #7 + 1f44b2c: e0833004 add r3, r3, r4 + 1f44b30: e8880012 stm r8, {r1, r4} + 1f44b34: e58d2078 str r2, [sp, #120] ; 0x78 + 1f44b38: e58d307c str r3, [sp, #124] ; 0x7c + 1f44b3c: d2888008 addle r8, r8, #8 + 1f44b40: da000008 ble 1f44b68 <_vfprintf_r+0x1d70> + 1f44b44: e28d2074 add r2, sp, #116 ; 0x74 + 1f44b48: e1a0100a mov r1, sl + 1f44b4c: e59d0018 ldr r0, [sp, #24] + 1f44b50: eb0013b6 bl 1f49a30 <__sprint_r> + 1f44b54: e3500000 cmp r0, #0 + 1f44b58: 1afff981 bne 1f43164 <_vfprintf_r+0x36c> + 1f44b5c: e28d2078 add r2, sp, #120 ; 0x78 + 1f44b60: e892000c ldm r2, {r2, r3} + 1f44b64: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f44b68: e2822001 add r2, r2, #1 + 1f44b6c: e59d103c ldr r1, [sp, #60] ; 0x3c + 1f44b70: e3520007 cmp r2, #7 + 1f44b74: e58d2078 str r2, [sp, #120] ; 0x78 + 1f44b78: e59d202c ldr r2, [sp, #44] ; 0x2c + 1f44b7c: e0813003 add r3, r1, r3 + 1f44b80: e58d307c str r3, [sp, #124] ; 0x7c + 1f44b84: e5882000 str r2, [r8] + 1f44b88: e5881004 str r1, [r8, #4] + 1f44b8c: dafffc02 ble 1f43b9c <_vfprintf_r+0xda4> + 1f44b90: eafffd24 b 1f44028 <_vfprintf_r+0x1230> + 1f44b94: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f44b98: e58d7014 str r7, [sp, #20] + 1f44b9c: ebffed5b bl 1f40110 + 1f44ba0: e1a03000 mov r3, r0 + 1f44ba4: eafffb58 b 1f4390c <_vfprintf_r+0xb14> + 1f44ba8: e3a0202d mov r2, #45 ; 0x2d + 1f44bac: e5cd2057 strb r2, [sp, #87] ; 0x57 + 1f44bb0: e1a07002 mov r7, r2 + 1f44bb4: e3a02000 mov r2, #0 + 1f44bb8: e59d5030 ldr r5, [sp, #48] ; 0x30 + 1f44bbc: e58d2014 str r2, [sp, #20] + 1f44bc0: eafff9d0 b 1f43308 <_vfprintf_r+0x510> + 1f44bc4: e3560065 cmp r6, #101 ; 0x65 + 1f44bc8: da000059 ble 1f44d34 <_vfprintf_r+0x1f3c> + 1f44bcc: e3560066 cmp r6, #102 ; 0x66 + 1f44bd0: e58d3038 str r3, [sp, #56] ; 0x38 + 1f44bd4: 1afffec2 bne 1f446e4 <_vfprintf_r+0x18ec> + 1f44bd8: e3530000 cmp r3, #0 + 1f44bdc: da0000e6 ble 1f44f7c <_vfprintf_r+0x2184> + 1f44be0: e59d2014 ldr r2, [sp, #20] + 1f44be4: e3520000 cmp r2, #0 + 1f44be8: 1a0000cd bne 1f44f24 <_vfprintf_r+0x212c> + 1f44bec: e3150001 tst r5, #1 + 1f44bf0: 1a0000cb bne 1f44f24 <_vfprintf_r+0x212c> + 1f44bf4: e1a02003 mov r2, r3 + 1f44bf8: e1c33fc3 bic r3, r3, r3, asr #31 + 1f44bfc: e58d2024 str r2, [sp, #36] ; 0x24 + 1f44c00: eafffec5 b 1f4471c <_vfprintf_r+0x1924> + 1f44c04: e59f3404 ldr r3, [pc, #1028] ; 1f45010 <_vfprintf_r+0x2218> + 1f44c08: e59d107c ldr r1, [sp, #124] ; 0x7c + 1f44c0c: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f44c10: e58d3040 str r3, [sp, #64] ; 0x40 + 1f44c14: eafff9ef b 1f433d8 <_vfprintf_r+0x5e0> + 1f44c18: e28d2074 add r2, sp, #116 ; 0x74 + 1f44c1c: e1a0100a mov r1, sl + 1f44c20: e59d0018 ldr r0, [sp, #24] + 1f44c24: eb001381 bl 1f49a30 <__sprint_r> + 1f44c28: e3500000 cmp r0, #0 + 1f44c2c: 1afff94c bne 1f43164 <_vfprintf_r+0x36c> + 1f44c30: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f44c34: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f44c38: eafffd17 b 1f4409c <_vfprintf_r+0x12a4> + 1f44c3c: e28d2074 add r2, sp, #116 ; 0x74 + 1f44c40: e1a0100a mov r1, sl + 1f44c44: e59d0018 ldr r0, [sp, #24] + 1f44c48: eb001378 bl 1f49a30 <__sprint_r> + 1f44c4c: e3500000 cmp r0, #0 + 1f44c50: 1afff943 bne 1f43164 <_vfprintf_r+0x36c> + 1f44c54: e59d205c ldr r2, [sp, #92] ; 0x5c + 1f44c58: e59d103c ldr r1, [sp, #60] ; 0x3c + 1f44c5c: e59d307c ldr r3, [sp, #124] ; 0x7c + 1f44c60: e0622001 rsb r2, r2, r1 + 1f44c64: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f44c68: eafffda9 b 1f44314 <_vfprintf_r+0x151c> + 1f44c6c: e59f139c ldr r1, [pc, #924] ; 1f45010 <_vfprintf_r+0x2218> + 1f44c70: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f44c74: e58d1040 str r1, [sp, #64] ; 0x40 + 1f44c78: eafffbef b 1f43c3c <_vfprintf_r+0xe44> + 1f44c7c: e3530006 cmp r3, #6 + 1f44c80: 23a03006 movcs r3, #6 + 1f44c84: e58d3024 str r3, [sp, #36] ; 0x24 + 1f44c88: e1c33fc3 bic r3, r3, r3, asr #31 + 1f44c8c: e58d3008 str r3, [sp, #8] + 1f44c90: e59f337c ldr r3, [pc, #892] ; 1f45014 <_vfprintf_r+0x221c> + 1f44c94: e58d4028 str r4, [sp, #40] ; 0x28 + 1f44c98: e58d302c str r3, [sp, #44] ; 0x2c + 1f44c9c: eafffac4 b 1f437b4 <_vfprintf_r+0x9bc> + 1f44ca0: e3a03047 mov r3, #71 ; 0x47 + 1f44ca4: e58d3008 str r3, [sp, #8] + 1f44ca8: e3a03001 mov r3, #1 + 1f44cac: e58d3014 str r3, [sp, #20] + 1f44cb0: e59d3008 ldr r3, [sp, #8] + 1f44cb4: e3530046 cmp r3, #70 ; 0x46 + 1f44cb8: eeb1ab48 vneg.f64 d10, d8 + 1f44cbc: 1a0000cc bne 1f44ff4 <_vfprintf_r+0x21fc> + 1f44cc0: e28d206c add r2, sp, #108 ; 0x6c + 1f44cc4: e28d3060 add r3, sp, #96 ; 0x60 + 1f44cc8: e58d2004 str r2, [sp, #4] + 1f44ccc: e58d3000 str r3, [sp] + 1f44cd0: e59d2014 ldr r2, [sp, #20] + 1f44cd4: e28d305c add r3, sp, #92 ; 0x5c + 1f44cd8: e3a01003 mov r1, #3 + 1f44cdc: eeb00b4a vmov.f64 d0, d10 + 1f44ce0: e59d0018 ldr r0, [sp, #24] + 1f44ce4: eb000219 bl 1f45550 <_dtoa_r> + 1f44ce8: e3a0702d mov r7, #45 ; 0x2d + 1f44cec: e58d002c str r0, [sp, #44] ; 0x2c + 1f44cf0: eeb5ab40 vcmp.f64 d10, #0.0 + 1f44cf4: eef1fa10 vmrs APSR_nzcv, fpscr + 1f44cf8: 13a03001 movne r3, #1 + 1f44cfc: 03a03000 moveq r3, #0 + 1f44d00: e59d202c ldr r2, [sp, #44] ; 0x2c + 1f44d04: e5d22000 ldrb r2, [r2] + 1f44d08: e3520030 cmp r2, #48 ; 0x30 + 1f44d0c: 13a03000 movne r3, #0 + 1f44d10: 02033001 andeq r3, r3, #1 + 1f44d14: e3530000 cmp r3, #0 + 1f44d18: 0a00005e beq 1f44e98 <_vfprintf_r+0x20a0> + 1f44d1c: e59d3014 ldr r3, [sp, #20] + 1f44d20: e2633001 rsb r3, r3, #1 + 1f44d24: e58d305c str r3, [sp, #92] ; 0x5c + 1f44d28: e59d2014 ldr r2, [sp, #20] + 1f44d2c: e0834002 add r4, r3, r2 + 1f44d30: eafffe4a b 1f44660 <_vfprintf_r+0x1868> + 1f44d34: e2433001 sub r3, r3, #1 + 1f44d38: e3530000 cmp r3, #0 + 1f44d3c: b3a0202d movlt r2, #45 ; 0x2d + 1f44d40: a3a0202b movge r2, #43 ; 0x2b + 1f44d44: e58d305c str r3, [sp, #92] ; 0x5c + 1f44d48: b2633000 rsblt r3, r3, #0 + 1f44d4c: e3530009 cmp r3, #9 + 1f44d50: e5cd6064 strb r6, [sp, #100] ; 0x64 + 1f44d54: e5cd2065 strb r2, [sp, #101] ; 0x65 + 1f44d58: da00005b ble 1f44ecc <_vfprintf_r+0x20d4> + 1f44d5c: e28dc073 add ip, sp, #115 ; 0x73 + 1f44d60: e1a0000c mov r0, ip + 1f44d64: e59f12ac ldr r1, [pc, #684] ; 1f45018 <_vfprintf_r+0x2220> + 1f44d68: e0c12193 smull r2, r1, r3, r1 + 1f44d6c: e1a02fc3 asr r2, r3, #31 + 1f44d70: e0621141 rsb r1, r2, r1, asr #2 + 1f44d74: e0812101 add r2, r1, r1, lsl #2 + 1f44d78: e0432082 sub r2, r3, r2, lsl #1 + 1f44d7c: e2822030 add r2, r2, #48 ; 0x30 + 1f44d80: e3510009 cmp r1, #9 + 1f44d84: e1a03001 mov r3, r1 + 1f44d88: e5602001 strb r2, [r0, #-1]! + 1f44d8c: cafffff4 bgt 1f44d64 <_vfprintf_r+0x1f6c> + 1f44d90: e1a01000 mov r1, r0 + 1f44d94: e2833030 add r3, r3, #48 ; 0x30 + 1f44d98: e20320ff and r2, r3, #255 ; 0xff + 1f44d9c: e5612001 strb r2, [r1, #-1]! + 1f44da0: e15c0001 cmp ip, r1 + 1f44da4: 9a000094 bls 1f44ffc <_vfprintf_r+0x2204> + 1f44da8: e28d1066 add r1, sp, #102 ; 0x66 + 1f44dac: e1a03000 mov r3, r0 + 1f44db0: ea000000 b 1f44db8 <_vfprintf_r+0x1fc0> + 1f44db4: e4d32001 ldrb r2, [r3], #1 + 1f44db8: e153000c cmp r3, ip + 1f44dbc: e4c12001 strb r2, [r1], #1 + 1f44dc0: 1afffffb bne 1f44db4 <_vfprintf_r+0x1fbc> + 1f44dc4: e2833001 add r3, r3, #1 + 1f44dc8: e0600003 rsb r0, r0, r3 + 1f44dcc: e28d3066 add r3, sp, #102 ; 0x66 + 1f44dd0: e0830000 add r0, r3, r0 + 1f44dd4: e59d203c ldr r2, [sp, #60] ; 0x3c + 1f44dd8: e28d3064 add r3, sp, #100 ; 0x64 + 1f44ddc: e0633000 rsb r3, r3, r0 + 1f44de0: e58d304c str r3, [sp, #76] ; 0x4c + 1f44de4: e3520001 cmp r2, #1 + 1f44de8: e0823003 add r3, r2, r3 + 1f44dec: e58d3024 str r3, [sp, #36] ; 0x24 + 1f44df0: da00006f ble 1f44fb4 <_vfprintf_r+0x21bc> + 1f44df4: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f44df8: e59d2044 ldr r2, [sp, #68] ; 0x44 + 1f44dfc: e0833002 add r3, r3, r2 + 1f44e00: e3a02000 mov r2, #0 + 1f44e04: e58d3024 str r3, [sp, #36] ; 0x24 + 1f44e08: e58d2038 str r2, [sp, #56] ; 0x38 + 1f44e0c: e1c33fc3 bic r3, r3, r3, asr #31 + 1f44e10: eafffe41 b 1f4471c <_vfprintf_r+0x1924> + 1f44e14: e3a0302d mov r3, #45 ; 0x2d + 1f44e18: e1a07003 mov r7, r3 + 1f44e1c: e5cd3057 strb r3, [sp, #87] ; 0x57 + 1f44e20: eafff98c b 1f43458 <_vfprintf_r+0x660> + 1f44e24: e58d4028 str r4, [sp, #40] ; 0x28 + 1f44e28: eafffad8 b 1f43990 <_vfprintf_r+0xb98> + 1f44e2c: e59f11d0 ldr r1, [pc, #464] ; 1f45004 <_vfprintf_r+0x220c> + 1f44e30: e59d2078 ldr r2, [sp, #120] ; 0x78 + 1f44e34: e58d1030 str r1, [sp, #48] ; 0x30 + 1f44e38: eafffc08 b 1f43e60 <_vfprintf_r+0x1068> + 1f44e3c: e59d3038 ldr r3, [sp, #56] ; 0x38 + 1f44e40: e59d2044 ldr r2, [sp, #68] ; 0x44 + 1f44e44: e3530000 cmp r3, #0 + 1f44e48: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f44e4c: e0833002 add r3, r3, r2 + 1f44e50: e58d3024 str r3, [sp, #36] ; 0x24 + 1f44e54: d59d3038 ldrle r3, [sp, #56] ; 0x38 + 1f44e58: d59d2024 ldrle r2, [sp, #36] ; 0x24 + 1f44e5c: d2633001 rsble r3, r3, #1 + 1f44e60: d0823003 addle r3, r2, r3 + 1f44e64: d58d3024 strle r3, [sp, #36] ; 0x24 + 1f44e68: e3a06067 mov r6, #103 ; 0x67 + 1f44e6c: e1c33fc3 bic r3, r3, r3, asr #31 + 1f44e70: eafffe29 b 1f4471c <_vfprintf_r+0x1924> + 1f44e74: e59d3014 ldr r3, [sp, #20] + 1f44e78: e1c32fc3 bic r2, r3, r3, asr #31 + 1f44e7c: e58d2008 str r2, [sp, #8] + 1f44e80: e58d3024 str r3, [sp, #36] ; 0x24 + 1f44e84: e58d0014 str r0, [sp, #20] + 1f44e88: e58d4028 str r4, [sp, #40] ; 0x28 + 1f44e8c: e58d0038 str r0, [sp, #56] ; 0x38 + 1f44e90: e5dd7057 ldrb r7, [sp, #87] ; 0x57 + 1f44e94: eafff918 b 1f432fc <_vfprintf_r+0x504> + 1f44e98: e59d305c ldr r3, [sp, #92] ; 0x5c + 1f44e9c: eaffffa1 b 1f44d28 <_vfprintf_r+0x1f30> + 1f44ea0: e28d2074 add r2, sp, #116 ; 0x74 + 1f44ea4: e1a0100a mov r1, sl + 1f44ea8: e59d0018 ldr r0, [sp, #24] + 1f44eac: eb0012df bl 1f49a30 <__sprint_r> + 1f44eb0: e3500000 cmp r0, #0 + 1f44eb4: 1afff8aa bne 1f43164 <_vfprintf_r+0x36c> + 1f44eb8: e28d2078 add r2, sp, #120 ; 0x78 + 1f44ebc: e28d80a8 add r8, sp, #168 ; 0xa8 + 1f44ec0: e59d405c ldr r4, [sp, #92] ; 0x5c + 1f44ec4: e892000c ldm r2, {r2, r3} + 1f44ec8: eafffe8f b 1f4490c <_vfprintf_r+0x1b14> + 1f44ecc: e3a02030 mov r2, #48 ; 0x30 + 1f44ed0: e0833002 add r3, r3, r2 + 1f44ed4: e5cd3067 strb r3, [sp, #103] ; 0x67 + 1f44ed8: e5cd2066 strb r2, [sp, #102] ; 0x66 + 1f44edc: e28d0068 add r0, sp, #104 ; 0x68 + 1f44ee0: eaffffbb b 1f44dd4 <_vfprintf_r+0x1fdc> + 1f44ee4: e3a03003 mov r3, #3 + 1f44ee8: e1a01003 mov r1, r3 + 1f44eec: e58d3008 str r3, [sp, #8] + 1f44ef0: e3a03000 mov r3, #0 + 1f44ef4: e1a00003 mov r0, r3 + 1f44ef8: e58d3014 str r3, [sp, #20] + 1f44efc: e59f3118 ldr r3, [pc, #280] ; 1f4501c <_vfprintf_r+0x2224> + 1f44f00: e3560047 cmp r6, #71 ; 0x47 + 1f44f04: e59f2114 ldr r2, [pc, #276] ; 1f45020 <_vfprintf_r+0x2228> + 1f44f08: d1a02003 movle r2, r3 + 1f44f0c: e3c55080 bic r5, r5, #128 ; 0x80 + 1f44f10: e58d1024 str r1, [sp, #36] ; 0x24 + 1f44f14: e58d0038 str r0, [sp, #56] ; 0x38 + 1f44f18: e58d202c str r2, [sp, #44] ; 0x2c + 1f44f1c: e5dd7057 ldrb r7, [sp, #87] ; 0x57 + 1f44f20: eafff8f5 b 1f432fc <_vfprintf_r+0x504> + 1f44f24: e59d2044 ldr r2, [sp, #68] ; 0x44 + 1f44f28: e59d3038 ldr r3, [sp, #56] ; 0x38 + 1f44f2c: e0833002 add r3, r3, r2 + 1f44f30: e59d2014 ldr r2, [sp, #20] + 1f44f34: e0833002 add r3, r3, r2 + 1f44f38: e58d3024 str r3, [sp, #36] ; 0x24 + 1f44f3c: e1c33fc3 bic r3, r3, r3, asr #31 + 1f44f40: eafffdf5 b 1f4471c <_vfprintf_r+0x1924> + 1f44f44: e28d206c add r2, sp, #108 ; 0x6c + 1f44f48: e28d3060 add r3, sp, #96 ; 0x60 + 1f44f4c: e58d2004 str r2, [sp, #4] + 1f44f50: e58d3000 str r3, [sp] + 1f44f54: e59d2014 ldr r2, [sp, #20] + 1f44f58: e28d305c add r3, sp, #92 ; 0x5c + 1f44f5c: e3a01003 mov r1, #3 + 1f44f60: eeb00b48 vmov.f64 d0, d8 + 1f44f64: e59d0018 ldr r0, [sp, #24] + 1f44f68: eb000178 bl 1f45550 <_dtoa_r> + 1f44f6c: eeb0ab48 vmov.f64 d10, d8 + 1f44f70: e58d002c str r0, [sp, #44] ; 0x2c + 1f44f74: e3a07000 mov r7, #0 + 1f44f78: eaffff5c b 1f44cf0 <_vfprintf_r+0x1ef8> + 1f44f7c: e59d3014 ldr r3, [sp, #20] + 1f44f80: e3530000 cmp r3, #0 + 1f44f84: 1a000003 bne 1f44f98 <_vfprintf_r+0x21a0> + 1f44f88: e3150001 tst r5, #1 + 1f44f8c: 03a03001 moveq r3, #1 + 1f44f90: 058d3024 streq r3, [sp, #36] ; 0x24 + 1f44f94: 0afffde0 beq 1f4471c <_vfprintf_r+0x1924> + 1f44f98: e59d3044 ldr r3, [sp, #68] ; 0x44 + 1f44f9c: e59d2014 ldr r2, [sp, #20] + 1f44fa0: e2833001 add r3, r3, #1 + 1f44fa4: e0833002 add r3, r3, r2 + 1f44fa8: e58d3024 str r3, [sp, #36] ; 0x24 + 1f44fac: e1c33fc3 bic r3, r3, r3, asr #31 + 1f44fb0: eafffdd9 b 1f4471c <_vfprintf_r+0x1924> + 1f44fb4: e2153001 ands r3, r5, #1 + 1f44fb8: 1affff8d bne 1f44df4 <_vfprintf_r+0x1ffc> + 1f44fbc: e58d3038 str r3, [sp, #56] ; 0x38 + 1f44fc0: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f44fc4: e1c33fc3 bic r3, r3, r3, asr #31 + 1f44fc8: eafffdd3 b 1f4471c <_vfprintf_r+0x1924> + 1f44fcc: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f44fd0: e593c000 ldr ip, [r3] + 1f44fd4: e58dc014 str ip, [sp, #20] + 1f44fd8: e35c0000 cmp ip, #0 + 1f44fdc: e283c004 add ip, r3, #4 + 1f44fe0: e58dc028 str ip, [sp, #40] ; 0x28 + 1f44fe4: e5db3001 ldrb r3, [fp, #1] + 1f44fe8: e1a0b001 mov fp, r1 + 1f44fec: aafff7da bge 1f42f5c <_vfprintf_r+0x164> + 1f44ff0: eafff7d7 b 1f42f54 <_vfprintf_r+0x15c> + 1f44ff4: e3a0702d mov r7, #45 ; 0x2d + 1f44ff8: eafffd88 b 1f44620 <_vfprintf_r+0x1828> + 1f44ffc: e28d0066 add r0, sp, #102 ; 0x66 + 1f45000: eaffff73 b 1f44dd4 <_vfprintf_r+0x1fdc> + 1f45004: 01f62f48 .word 0x01f62f48 + 1f45008: 01f63698 .word 0x01f63698 + 1f4500c: 01f62f0c .word 0x01f62f0c + 1f45010: 01f62f38 .word 0x01f62f38 + 1f45014: 01f62f20 .word 0x01f62f20 + 1f45018: 66666667 .word 0x66666667 + 1f4501c: 01f62ef0 .word 0x01f62ef0 + 1f45020: 01f62ef4 .word 0x01f62ef4 + +01f45024 : + 1f45024: e59fc010 ldr ip, [pc, #16] ; 1f4503c + 1f45028: e1a03002 mov r3, r2 + 1f4502c: e1a02001 mov r2, r1 + 1f45030: e1a01000 mov r1, r0 + 1f45034: e59c0000 ldr r0, [ip] + 1f45038: eafff76e b 1f42df8 <_vfprintf_r> + 1f4503c: 01f65c08 .word 0x01f65c08 + +01f45040 <__sbprintf>: + 1f45040: e92d40f0 push {r4, r5, r6, r7, lr} + 1f45044: e1a04001 mov r4, r1 + 1f45048: e3a0cb01 mov ip, #1024 ; 0x400 + 1f4504c: e3a0e000 mov lr, #0 + 1f45050: e5946064 ldr r6, [r4, #100] ; 0x64 + 1f45054: e24dde46 sub sp, sp, #1120 ; 0x460 + 1f45058: e24dd00c sub sp, sp, #12 + 1f4505c: e1d110bc ldrh r1, [r1, #12] + 1f45060: e58d6064 str r6, [sp, #100] ; 0x64 + 1f45064: e594601c ldr r6, [r4, #28] + 1f45068: e1d470be ldrh r7, [r4, #14] + 1f4506c: e3c11002 bic r1, r1, #2 + 1f45070: e58d601c str r6, [sp, #28] + 1f45074: e5946024 ldr r6, [r4, #36] ; 0x24 + 1f45078: e1cd10bc strh r1, [sp, #12] + 1f4507c: e58dc008 str ip, [sp, #8] + 1f45080: e58dc014 str ip, [sp, #20] + 1f45084: e1a0100d mov r1, sp + 1f45088: e28dc068 add ip, sp, #104 ; 0x68 + 1f4508c: e1cd70be strh r7, [sp, #14] + 1f45090: e58d6024 str r6, [sp, #36] ; 0x24 + 1f45094: e58de018 str lr, [sp, #24] + 1f45098: e58dc000 str ip, [sp] + 1f4509c: e58dc010 str ip, [sp, #16] + 1f450a0: e1a07000 mov r7, r0 + 1f450a4: ebfff753 bl 1f42df8 <_vfprintf_r> + 1f450a8: e2506000 subs r6, r0, #0 + 1f450ac: ba000004 blt 1f450c4 <__sbprintf+0x84> + 1f450b0: e1a0100d mov r1, sp + 1f450b4: e1a00007 mov r0, r7 + 1f450b8: eb00066e bl 1f46a78 <_fflush_r> + 1f450bc: e3500000 cmp r0, #0 + 1f450c0: 13e06000 mvnne r6, #0 + 1f450c4: e1a00006 mov r0, r6 + 1f450c8: e1dd30bc ldrh r3, [sp, #12] + 1f450cc: e3130040 tst r3, #64 ; 0x40 + 1f450d0: 11d430bc ldrhne r3, [r4, #12] + 1f450d4: 13833040 orrne r3, r3, #64 ; 0x40 + 1f450d8: 11c430bc strhne r3, [r4, #12] + 1f450dc: e28dde46 add sp, sp, #1120 ; 0x460 + 1f450e0: e28dd00c add sp, sp, #12 + 1f450e4: e8bd40f0 pop {r4, r5, r6, r7, lr} + 1f450e8: e12fff1e bx lr + +01f450ec : + 1f450ec: e92d4010 push {r4, lr} + 1f450f0: e59f301c ldr r3, [pc, #28] ; 1f45114 + 1f450f4: e593c000 ldr ip, [r3] + 1f450f8: e1a02000 mov r2, r0 + 1f450fc: e1a03001 mov r3, r1 + 1f45100: e1a0000c mov r0, ip + 1f45104: e59c1008 ldr r1, [ip, #8] + 1f45108: ebfff73a bl 1f42df8 <_vfprintf_r> + 1f4510c: e8bd4010 pop {r4, lr} + 1f45110: e12fff1e bx lr + 1f45114: 01f65c08 .word 0x01f65c08 + +01f45118 <_vprintf_r>: + 1f45118: e92d4010 push {r4, lr} + 1f4511c: e1a03002 mov r3, r2 + 1f45120: e1a02001 mov r2, r1 + 1f45124: e5901008 ldr r1, [r0, #8] + 1f45128: ebfff732 bl 1f42df8 <_vfprintf_r> + 1f4512c: e8bd4010 pop {r4, lr} + 1f45130: e12fff1e bx lr + +01f45134 <__swsetup_r>: + 1f45134: e59f3158 ldr r3, [pc, #344] ; 1f45294 <__swsetup_r+0x160> + 1f45138: e5933000 ldr r3, [r3] + 1f4513c: e3530000 cmp r3, #0 + 1f45140: e92d4070 push {r4, r5, r6, lr} + 1f45144: e1a05000 mov r5, r0 + 1f45148: e1a04001 mov r4, r1 + 1f4514c: 0a000002 beq 1f4515c <__swsetup_r+0x28> + 1f45150: e5932038 ldr r2, [r3, #56] ; 0x38 + 1f45154: e3520000 cmp r2, #0 + 1f45158: 0a000034 beq 1f45230 <__swsetup_r+0xfc> + 1f4515c: e1d420fc ldrsh r2, [r4, #12] + 1f45160: e1a03802 lsl r3, r2, #16 + 1f45164: e3130702 tst r3, #524288 ; 0x80000 + 1f45168: e1a03823 lsr r3, r3, #16 + 1f4516c: 0a00000c beq 1f451a4 <__swsetup_r+0x70> + 1f45170: e5940010 ldr r0, [r4, #16] + 1f45174: e3500000 cmp r0, #0 + 1f45178: 0a000014 beq 1f451d0 <__swsetup_r+0x9c> + 1f4517c: e2132001 ands r2, r3, #1 + 1f45180: 1a00001b bne 1f451f4 <__swsetup_r+0xc0> + 1f45184: e3130002 tst r3, #2 + 1f45188: 05942014 ldreq r2, [r4, #20] + 1f4518c: e3500000 cmp r0, #0 + 1f45190: e5842008 str r2, [r4, #8] + 1f45194: 13a00000 movne r0, #0 + 1f45198: 0a00001d beq 1f45214 <__swsetup_r+0xe0> + 1f4519c: e8bd4070 pop {r4, r5, r6, lr} + 1f451a0: e12fff1e bx lr + 1f451a4: e3130010 tst r3, #16 + 1f451a8: 0a000033 beq 1f4527c <__swsetup_r+0x148> + 1f451ac: e3130004 tst r3, #4 + 1f451b0: 1a000021 bne 1f4523c <__swsetup_r+0x108> + 1f451b4: e5940010 ldr r0, [r4, #16] + 1f451b8: e3822008 orr r2, r2, #8 + 1f451bc: e1c420bc strh r2, [r4, #12] + 1f451c0: e3500000 cmp r0, #0 + 1f451c4: e1a02802 lsl r2, r2, #16 + 1f451c8: e1a03822 lsr r3, r2, #16 + 1f451cc: 1affffea bne 1f4517c <__swsetup_r+0x48> + 1f451d0: e2032d0a and r2, r3, #640 ; 0x280 + 1f451d4: e3520c02 cmp r2, #512 ; 0x200 + 1f451d8: 0affffe7 beq 1f4517c <__swsetup_r+0x48> + 1f451dc: e1a00005 mov r0, r5 + 1f451e0: e1a01004 mov r1, r4 + 1f451e4: eb0008b3 bl 1f474b8 <__smakebuf_r> + 1f451e8: e1d430bc ldrh r3, [r4, #12] + 1f451ec: e5940010 ldr r0, [r4, #16] + 1f451f0: eaffffe1 b 1f4517c <__swsetup_r+0x48> + 1f451f4: e3a02000 mov r2, #0 + 1f451f8: e5943014 ldr r3, [r4, #20] + 1f451fc: e3500000 cmp r0, #0 + 1f45200: e2633000 rsb r3, r3, #0 + 1f45204: e5843018 str r3, [r4, #24] + 1f45208: e5842008 str r2, [r4, #8] + 1f4520c: 13a00000 movne r0, #0 + 1f45210: 1affffe1 bne 1f4519c <__swsetup_r+0x68> + 1f45214: e1d430fc ldrsh r3, [r4, #12] + 1f45218: e3130080 tst r3, #128 ; 0x80 + 1f4521c: 13833040 orrne r3, r3, #64 ; 0x40 + 1f45220: 11c430bc strhne r3, [r4, #12] + 1f45224: 13e00000 mvnne r0, #0 + 1f45228: e8bd4070 pop {r4, r5, r6, lr} + 1f4522c: e12fff1e bx lr + 1f45230: e1a00003 mov r0, r3 + 1f45234: eb0006ec bl 1f46dec <__sinit> + 1f45238: eaffffc7 b 1f4515c <__swsetup_r+0x28> + 1f4523c: e5941030 ldr r1, [r4, #48] ; 0x30 + 1f45240: e3510000 cmp r1, #0 + 1f45244: 0a000007 beq 1f45268 <__swsetup_r+0x134> + 1f45248: e2843040 add r3, r4, #64 ; 0x40 + 1f4524c: e1510003 cmp r1, r3 + 1f45250: 0a000002 beq 1f45260 <__swsetup_r+0x12c> + 1f45254: e1a00005 mov r0, r5 + 1f45258: eb00073d bl 1f46f54 <_free_r> + 1f4525c: e1d420fc ldrsh r2, [r4, #12] + 1f45260: e3a03000 mov r3, #0 + 1f45264: e5843030 str r3, [r4, #48] ; 0x30 + 1f45268: e3a03000 mov r3, #0 + 1f4526c: e5940010 ldr r0, [r4, #16] + 1f45270: e3c22024 bic r2, r2, #36 ; 0x24 + 1f45274: e8840009 stm r4, {r0, r3} + 1f45278: eaffffce b 1f451b8 <__swsetup_r+0x84> + 1f4527c: e3a03009 mov r3, #9 + 1f45280: e3822040 orr r2, r2, #64 ; 0x40 + 1f45284: e5853000 str r3, [r5] + 1f45288: e3e00000 mvn r0, #0 + 1f4528c: e1c420bc strh r2, [r4, #12] + 1f45290: eaffffc1 b 1f4519c <__swsetup_r+0x68> + 1f45294: 01f65c08 .word 0x01f65c08 + +01f45298 <__register_exitproc>: + 1f45298: e59fc0d0 ldr ip, [pc, #208] ; 1f45370 <__register_exitproc+0xd8> + 1f4529c: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f452a0: e59c4000 ldr r4, [ip] + 1f452a4: e594c148 ldr ip, [r4, #328] ; 0x148 + 1f452a8: e35c0000 cmp ip, #0 + 1f452ac: 0284cf53 addeq ip, r4, #332 ; 0x14c + 1f452b0: e59ce004 ldr lr, [ip, #4] + 1f452b4: 0584c148 streq ip, [r4, #328] ; 0x148 + 1f452b8: e35e001f cmp lr, #31 + 1f452bc: e1a06001 mov r6, r1 + 1f452c0: e1a05000 mov r5, r0 + 1f452c4: e1a08002 mov r8, r2 + 1f452c8: e1a07003 mov r7, r3 + 1f452cc: d28e1001 addle r1, lr, #1 + 1f452d0: da00000f ble 1f45314 <__register_exitproc+0x7c> + 1f452d4: e59f3098 ldr r3, [pc, #152] ; 1f45374 <__register_exitproc+0xdc> + 1f452d8: e3530000 cmp r3, #0 + 1f452dc: 0a000021 beq 1f45368 <__register_exitproc+0xd0> + 1f452e0: e3a00e19 mov r0, #400 ; 0x190 + 1f452e4: ebffe49f bl 1f3e568 + 1f452e8: e250c000 subs ip, r0, #0 + 1f452ec: 0a00001d beq 1f45368 <__register_exitproc+0xd0> + 1f452f0: e3a00000 mov r0, #0 + 1f452f4: e3a01001 mov r1, #1 + 1f452f8: e1a0e000 mov lr, r0 + 1f452fc: e5943148 ldr r3, [r4, #328] ; 0x148 + 1f45300: e58c0004 str r0, [ip, #4] + 1f45304: e58c3000 str r3, [ip] + 1f45308: e584c148 str ip, [r4, #328] ; 0x148 + 1f4530c: e58c0188 str r0, [ip, #392] ; 0x188 + 1f45310: e58c018c str r0, [ip, #396] ; 0x18c + 1f45314: e3550000 cmp r5, #0 + 1f45318: 1a000005 bne 1f45334 <__register_exitproc+0x9c> + 1f4531c: e3a00000 mov r0, #0 + 1f45320: e28ee002 add lr, lr, #2 + 1f45324: e58c1004 str r1, [ip, #4] + 1f45328: e78c610e str r6, [ip, lr, lsl #2] + 1f4532c: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f45330: e12fff1e bx lr + 1f45334: e3a00001 mov r0, #1 + 1f45338: e08c410e add r4, ip, lr, lsl #2 + 1f4533c: e5848088 str r8, [r4, #136] ; 0x88 + 1f45340: e59c3188 ldr r3, [ip, #392] ; 0x188 + 1f45344: e1a02e10 lsl r2, r0, lr + 1f45348: e1830002 orr r0, r3, r2 + 1f4534c: e58c0188 str r0, [ip, #392] ; 0x188 + 1f45350: e5847108 str r7, [r4, #264] ; 0x108 + 1f45354: e3550002 cmp r5, #2 + 1f45358: 059c318c ldreq r3, [ip, #396] ; 0x18c + 1f4535c: 01832002 orreq r2, r3, r2 + 1f45360: 058c218c streq r2, [ip, #396] ; 0x18c + 1f45364: eaffffec b 1f4531c <__register_exitproc+0x84> + 1f45368: e3e00000 mvn r0, #0 + 1f4536c: eaffffee b 1f4532c <__register_exitproc+0x94> + 1f45370: 01f63070 .word 0x01f63070 + 1f45374: 01f3e568 .word 0x01f3e568 + +01f45378 : + 1f45378: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f4537c: e5903010 ldr r3, [r0, #16] + 1f45380: e5915010 ldr r5, [r1, #16] + 1f45384: e1550003 cmp r5, r3 + 1f45388: e24dd00c sub sp, sp, #12 + 1f4538c: c3a00000 movgt r0, #0 + 1f45390: ca00006b bgt 1f45544 + 1f45394: e2455001 sub r5, r5, #1 + 1f45398: e2814014 add r4, r1, #20 + 1f4539c: e58d1000 str r1, [sp] + 1f453a0: e7941105 ldr r1, [r4, r5, lsl #2] + 1f453a4: e2809014 add r9, r0, #20 + 1f453a8: e1a07000 mov r7, r0 + 1f453ac: e2811001 add r1, r1, #1 + 1f453b0: e7990105 ldr r0, [r9, r5, lsl #2] + 1f453b4: eb001a50 bl 1f4bcfc <__aeabi_uidiv> + 1f453b8: e1a0a105 lsl sl, r5, #2 + 1f453bc: e089300a add r3, r9, sl + 1f453c0: e2506000 subs r6, r0, #0 + 1f453c4: e084800a add r8, r4, sl + 1f453c8: e58d3004 str r3, [sp, #4] + 1f453cc: 0a00002f beq 1f45490 + 1f453d0: e3a03000 mov r3, #0 + 1f453d4: e1a0b004 mov fp, r4 + 1f453d8: e1a0e009 mov lr, r9 + 1f453dc: e1a02003 mov r2, r3 + 1f453e0: e49b0004 ldr r0, [fp], #4 + 1f453e4: e1a01800 lsl r1, r0, #16 + 1f453e8: e1a01821 lsr r1, r1, #16 + 1f453ec: e0213196 mla r1, r6, r1, r3 + 1f453f0: e1a00820 lsr r0, r0, #16 + 1f453f4: e1a03821 lsr r3, r1, #16 + 1f453f8: e0233096 mla r3, r6, r0, r3 + 1f453fc: e59e0000 ldr r0, [lr] + 1f45400: e1a01801 lsl r1, r1, #16 + 1f45404: e0422821 sub r2, r2, r1, lsr #16 + 1f45408: e1a0c800 lsl ip, r0, #16 + 1f4540c: e1a01803 lsl r1, r3, #16 + 1f45410: e082282c add r2, r2, ip, lsr #16 + 1f45414: e1a01821 lsr r1, r1, #16 + 1f45418: e0611820 rsb r1, r1, r0, lsr #16 + 1f4541c: e1a00802 lsl r0, r2, #16 + 1f45420: e0812842 add r2, r1, r2, asr #16 + 1f45424: e1a01820 lsr r1, r0, #16 + 1f45428: e1811802 orr r1, r1, r2, lsl #16 + 1f4542c: e158000b cmp r8, fp + 1f45430: e48e1004 str r1, [lr], #4 + 1f45434: e1a02842 asr r2, r2, #16 + 1f45438: e1a03823 lsr r3, r3, #16 + 1f4543c: 2affffe7 bcs 1f453e0 + 1f45440: e799300a ldr r3, [r9, sl] + 1f45444: e3530000 cmp r3, #0 + 1f45448: 1a000010 bne 1f45490 + 1f4544c: e59d2004 ldr r2, [sp, #4] + 1f45450: e2423004 sub r3, r2, #4 + 1f45454: e1590003 cmp r9, r3 + 1f45458: 2a00000b bcs 1f4548c + 1f4545c: e5123004 ldr r3, [r2, #-4] + 1f45460: e3530000 cmp r3, #0 + 1f45464: 1a000008 bne 1f4548c + 1f45468: e2423008 sub r3, r2, #8 + 1f4546c: ea000003 b 1f45480 + 1f45470: e5932000 ldr r2, [r3] + 1f45474: e3520000 cmp r2, #0 + 1f45478: e2433004 sub r3, r3, #4 + 1f4547c: 1a000002 bne 1f4548c + 1f45480: e1590003 cmp r9, r3 + 1f45484: e2455001 sub r5, r5, #1 + 1f45488: 3afffff8 bcc 1f45470 + 1f4548c: e5875010 str r5, [r7, #16] + 1f45490: e59d1000 ldr r1, [sp] + 1f45494: e1a00007 mov r0, r7 + 1f45498: eb000a60 bl 1f47e20 <__mcmp> + 1f4549c: e3500000 cmp r0, #0 + 1f454a0: ba000026 blt 1f45540 + 1f454a4: e1a0c009 mov ip, r9 + 1f454a8: e3a03000 mov r3, #0 + 1f454ac: e2866001 add r6, r6, #1 + 1f454b0: e4942004 ldr r2, [r4], #4 + 1f454b4: e59c0000 ldr r0, [ip] + 1f454b8: e1a01802 lsl r1, r2, #16 + 1f454bc: e0433821 sub r3, r3, r1, lsr #16 + 1f454c0: e1a01800 lsl r1, r0, #16 + 1f454c4: e0831821 add r1, r3, r1, lsr #16 + 1f454c8: e1a02822 lsr r2, r2, #16 + 1f454cc: e0622820 rsb r2, r2, r0, lsr #16 + 1f454d0: e1a00801 lsl r0, r1, #16 + 1f454d4: e0823841 add r3, r2, r1, asr #16 + 1f454d8: e1a02820 lsr r2, r0, #16 + 1f454dc: e1822803 orr r2, r2, r3, lsl #16 + 1f454e0: e1580004 cmp r8, r4 + 1f454e4: e48c2004 str r2, [ip], #4 + 1f454e8: e1a03843 asr r3, r3, #16 + 1f454ec: 2affffef bcs 1f454b0 + 1f454f0: e7993105 ldr r3, [r9, r5, lsl #2] + 1f454f4: e3530000 cmp r3, #0 + 1f454f8: e0893105 add r3, r9, r5, lsl #2 + 1f454fc: 1a00000f bne 1f45540 + 1f45500: e2432004 sub r2, r3, #4 + 1f45504: e1590002 cmp r9, r2 + 1f45508: 2a00000b bcs 1f4553c + 1f4550c: e5132004 ldr r2, [r3, #-4] + 1f45510: e3520000 cmp r2, #0 + 1f45514: 1a000008 bne 1f4553c + 1f45518: e2433008 sub r3, r3, #8 + 1f4551c: ea000003 b 1f45530 + 1f45520: e5932000 ldr r2, [r3] + 1f45524: e3520000 cmp r2, #0 + 1f45528: e2433004 sub r3, r3, #4 + 1f4552c: 1a000002 bne 1f4553c + 1f45530: e1590003 cmp r9, r3 + 1f45534: e2455001 sub r5, r5, #1 + 1f45538: 3afffff8 bcc 1f45520 + 1f4553c: e5875010 str r5, [r7, #16] + 1f45540: e1a00006 mov r0, r6 + 1f45544: e28dd00c add sp, sp, #12 + 1f45548: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f4554c: e12fff1e bx lr + +01f45550 <_dtoa_r>: + 1f45550: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f45554: e590c040 ldr ip, [r0, #64] ; 0x40 + 1f45558: e24dd04c sub sp, sp, #76 ; 0x4c + 1f4555c: e35c0000 cmp ip, #0 + 1f45560: e1a04000 mov r4, r0 + 1f45564: ec5bab10 vmov sl, fp, d0 + 1f45568: e58d1004 str r1, [sp, #4] + 1f4556c: e1a06002 mov r6, r2 + 1f45570: e58d3010 str r3, [sp, #16] + 1f45574: e59d5070 ldr r5, [sp, #112] ; 0x70 + 1f45578: 0a000007 beq 1f4559c <_dtoa_r+0x4c> + 1f4557c: e3a03001 mov r3, #1 + 1f45580: e5902044 ldr r2, [r0, #68] ; 0x44 + 1f45584: e1a03213 lsl r3, r3, r2 + 1f45588: e98c000c stmib ip, {r2, r3} + 1f4558c: e1a0100c mov r1, ip + 1f45590: eb00086b bl 1f47744 <_Bfree> + 1f45594: e3a03000 mov r3, #0 + 1f45598: e5843040 str r3, [r4, #64] ; 0x40 + 1f4559c: e35b0000 cmp fp, #0 + 1f455a0: b3a03001 movlt r3, #1 + 1f455a4: a3a03000 movge r3, #0 + 1f455a8: b5853000 strlt r3, [r5] + 1f455ac: a5853000 strge r3, [r5] + 1f455b0: e59f33e0 ldr r3, [pc, #992] ; 1f45998 <_dtoa_r+0x448> + 1f455b4: e1a0700b mov r7, fp + 1f455b8: e1a02003 mov r2, r3 + 1f455bc: b3cb7102 biclt r7, fp, #-2147483648 ; 0x80000000 + 1f455c0: e0033007 and r3, r3, r7 + 1f455c4: b1a0b007 movlt fp, r7 + 1f455c8: e1530002 cmp r3, r2 + 1f455cc: 0a000012 beq 1f4561c <_dtoa_r+0xcc> + 1f455d0: ec4bab17 vmov d7, sl, fp + 1f455d4: eeb57b40 vcmp.f64 d7, #0.0 + 1f455d8: eef1fa10 vmrs APSR_nzcv, fpscr + 1f455dc: e58da008 str sl, [sp, #8] + 1f455e0: e58db00c str fp, [sp, #12] + 1f455e4: 1a00001f bne 1f45668 <_dtoa_r+0x118> + 1f455e8: e3a03001 mov r3, #1 + 1f455ec: e59d2074 ldr r2, [sp, #116] ; 0x74 + 1f455f0: e3520000 cmp r2, #0 + 1f455f4: e59d2010 ldr r2, [sp, #16] + 1f455f8: e5823000 str r3, [r2] + 1f455fc: 0a000089 beq 1f45828 <_dtoa_r+0x2d8> + 1f45600: e59f8394 ldr r8, [pc, #916] ; 1f4599c <_dtoa_r+0x44c> + 1f45604: e59d3074 ldr r3, [sp, #116] ; 0x74 + 1f45608: e5838000 str r8, [r3] + 1f4560c: e2480001 sub r0, r8, #1 + 1f45610: e28dd04c add sp, sp, #76 ; 0x4c + 1f45614: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f45618: e12fff1e bx lr + 1f4561c: e59f337c ldr r3, [pc, #892] ; 1f459a0 <_dtoa_r+0x450> + 1f45620: e59d2010 ldr r2, [sp, #16] + 1f45624: e35a0000 cmp sl, #0 + 1f45628: e5823000 str r3, [r2] + 1f4562c: 0a000069 beq 1f457d8 <_dtoa_r+0x288> + 1f45630: e59f836c ldr r8, [pc, #876] ; 1f459a4 <_dtoa_r+0x454> + 1f45634: e59d3074 ldr r3, [sp, #116] ; 0x74 + 1f45638: e3530000 cmp r3, #0 + 1f4563c: 0a0002ce beq 1f4617c <_dtoa_r+0xc2c> + 1f45640: e1a00008 mov r0, r8 + 1f45644: e5d83003 ldrb r3, [r8, #3] + 1f45648: e59d2074 ldr r2, [sp, #116] ; 0x74 + 1f4564c: e3530000 cmp r3, #0 + 1f45650: 12883008 addne r3, r8, #8 + 1f45654: 02883003 addeq r3, r8, #3 + 1f45658: e5823000 str r3, [r2] + 1f4565c: e28dd04c add sp, sp, #76 ; 0x4c + 1f45660: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f45664: e12fff1e bx lr + 1f45668: e28d2040 add r2, sp, #64 ; 0x40 + 1f4566c: e28d1044 add r1, sp, #68 ; 0x44 + 1f45670: ed9d0b02 vldr d0, [sp, #8] + 1f45674: e1a00004 mov r0, r4 + 1f45678: eb000ac2 bl 1f48188 <__d2b> + 1f4567c: e1b09a27 lsrs r9, r7, #20 + 1f45680: e1a08000 mov r8, r0 + 1f45684: 1a00005b bne 1f457f8 <_dtoa_r+0x2a8> + 1f45688: e28d1040 add r1, sp, #64 ; 0x40 + 1f4568c: e8910202 ldm r1, {r1, r9} + 1f45690: e0819009 add r9, r1, r9 + 1f45694: e2893e43 add r3, r9, #1072 ; 0x430 + 1f45698: e2833002 add r3, r3, #2 + 1f4569c: e3530020 cmp r3, #32 + 1f456a0: c2633040 rsbgt r3, r3, #64 ; 0x40 + 1f456a4: c2892e41 addgt r2, r9, #1040 ; 0x410 + 1f456a8: c1a07317 lslgt r7, r7, r3 + 1f456ac: c1a03002 movgt r3, r2 + 1f456b0: d2633020 rsble r3, r3, #32 + 1f456b4: c2833002 addgt r3, r3, #2 + 1f456b8: c187333a orrgt r3, r7, sl, lsr r3 + 1f456bc: d1a0331a lslle r3, sl, r3 + 1f456c0: ee073a90 vmov s15, r3 + 1f456c4: eeb87b67 vcvt.f64.u32 d7, s15 + 1f456c8: e3a00001 mov r0, #1 + 1f456cc: ec532b17 vmov r2, r3, d7 + 1f456d0: e58d0038 str r0, [sp, #56] ; 0x38 + 1f456d4: e2499001 sub r9, r9, #1 + 1f456d8: e243361f sub r3, r3, #32505856 ; 0x1f00000 + 1f456dc: ec432b17 vmov d7, r2, r3 + 1f456e0: ed9f6ba2 vldr d6, [pc, #648] ; 1f45970 <_dtoa_r+0x420> + 1f456e4: ed9f5ba3 vldr d5, [pc, #652] ; 1f45978 <_dtoa_r+0x428> + 1f456e8: ee376b46 vsub.f64 d6, d7, d6 + 1f456ec: ed9f7ba3 vldr d7, [pc, #652] ; 1f45980 <_dtoa_r+0x430> + 1f456f0: ee067b05 vmla.f64 d7, d6, d5 + 1f456f4: ee069a90 vmov s13, r9 + 1f456f8: ed9f5ba2 vldr d5, [pc, #648] ; 1f45988 <_dtoa_r+0x438> + 1f456fc: eeb86be6 vcvt.f64.s32 d6, s13 + 1f45700: ee067b05 vmla.f64 d7, d6, d5 + 1f45704: eeb57bc0 vcmpe.f64 d7, #0.0 + 1f45708: eefd6bc7 vcvt.s32.f64 s13, d7 + 1f4570c: eef1fa10 vmrs APSR_nzcv, fpscr + 1f45710: ee167a90 vmov r7, s13 + 1f45714: 4a000152 bmi 1f45c64 <_dtoa_r+0x714> + 1f45718: e3570016 cmp r7, #22 + 1f4571c: 83a03001 movhi r3, #1 + 1f45720: 858d302c strhi r3, [sp, #44] ; 0x2c + 1f45724: 8a000008 bhi 1f4574c <_dtoa_r+0x1fc> + 1f45728: e59f3280 ldr r3, [pc, #640] ; 1f459b0 <_dtoa_r+0x460> + 1f4572c: e0833187 add r3, r3, r7, lsl #3 + 1f45730: ed937b00 vldr d7, [r3] + 1f45734: ec4bab16 vmov d6, sl, fp + 1f45738: eeb47bc6 vcmpe.f64 d7, d6 + 1f4573c: e3a03000 mov r3, #0 + 1f45740: eef1fa10 vmrs APSR_nzcv, fpscr + 1f45744: e58d302c str r3, [sp, #44] ; 0x2c + 1f45748: c2477001 subgt r7, r7, #1 + 1f4574c: e0699001 rsb r9, r9, r1 + 1f45750: e2599001 subs r9, r9, #1 + 1f45754: 53a03000 movpl r3, #0 + 1f45758: 42693000 rsbmi r3, r9, #0 + 1f4575c: 458d3018 strmi r3, [sp, #24] + 1f45760: 558d3018 strpl r3, [sp, #24] + 1f45764: 43a09000 movmi r9, #0 + 1f45768: e3570000 cmp r7, #0 + 1f4576c: b3a03000 movlt r3, #0 + 1f45770: a3a03000 movge r3, #0 + 1f45774: b58d3030 strlt r3, [sp, #48] ; 0x30 + 1f45778: b59d3018 ldrlt r3, [sp, #24] + 1f4577c: b0673003 rsblt r3, r7, r3 + 1f45780: b58d3018 strlt r3, [sp, #24] + 1f45784: b2673000 rsblt r3, r7, #0 + 1f45788: e58d3014 str r3, [sp, #20] + 1f4578c: e59d3004 ldr r3, [sp, #4] + 1f45790: a0899007 addge r9, r9, r7 + 1f45794: a58d7030 strge r7, [sp, #48] ; 0x30 + 1f45798: e3530009 cmp r3, #9 + 1f4579c: 8a000023 bhi 1f45830 <_dtoa_r+0x2e0> + 1f457a0: e3530005 cmp r3, #5 + 1f457a4: d3a05001 movle r5, #1 + 1f457a8: c3a05000 movgt r5, #0 + 1f457ac: c2433004 subgt r3, r3, #4 + 1f457b0: c58d3004 strgt r3, [sp, #4] + 1f457b4: e59d3004 ldr r3, [sp, #4] + 1f457b8: e2433002 sub r3, r3, #2 + 1f457bc: e3530003 cmp r3, #3 + 1f457c0: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f457c4: ea00012b b 1f45c78 <_dtoa_r+0x728> + 1f457c8: 01f45f68 .word 0x01f45f68 + 1f457cc: 01f45d58 .word 0x01f45d58 + 1f457d0: 01f45f94 .word 0x01f45f94 + 1f457d4: 01f461d8 .word 0x01f461d8 + 1f457d8: e3c774ff bic r7, r7, #-16777216 ; 0xff000000 + 1f457dc: e59f31c0 ldr r3, [pc, #448] ; 1f459a4 <_dtoa_r+0x454> + 1f457e0: e59f01c0 ldr r0, [pc, #448] ; 1f459a8 <_dtoa_r+0x458> + 1f457e4: e3c7760f bic r7, r7, #15728640 ; 0xf00000 + 1f457e8: e3570000 cmp r7, #0 + 1f457ec: 11a08003 movne r8, r3 + 1f457f0: 01a08000 moveq r8, r0 + 1f457f4: eaffff8e b 1f45634 <_dtoa_r+0xe4> + 1f457f8: e3a00000 mov r0, #0 + 1f457fc: e28d3008 add r3, sp, #8 + 1f45800: e893000c ldm r3, {r2, r3} + 1f45804: e3c314ff bic r1, r3, #-16777216 ; 0xff000000 + 1f45808: e3c1160f bic r1, r1, #15728640 ; 0xf00000 + 1f4580c: e38115ff orr r1, r1, #1069547520 ; 0x3fc00000 + 1f45810: e2499fff sub r9, r9, #1020 ; 0x3fc + 1f45814: e3813603 orr r3, r1, #3145728 ; 0x300000 + 1f45818: e2499003 sub r9, r9, #3 + 1f4581c: e59d1040 ldr r1, [sp, #64] ; 0x40 + 1f45820: e58d0038 str r0, [sp, #56] ; 0x38 + 1f45824: eaffffac b 1f456dc <_dtoa_r+0x18c> + 1f45828: e59f017c ldr r0, [pc, #380] ; 1f459ac <_dtoa_r+0x45c> + 1f4582c: eaffff77 b 1f45610 <_dtoa_r+0xc0> + 1f45830: e3a01000 mov r1, #0 + 1f45834: e1a00004 mov r0, r4 + 1f45838: e5841044 str r1, [r4, #68] ; 0x44 + 1f4583c: e1a06001 mov r6, r1 + 1f45840: e58d1004 str r1, [sp, #4] + 1f45844: eb00079a bl 1f476b4 <_Balloc> + 1f45848: e3e03000 mvn r3, #0 + 1f4584c: e58d3034 str r3, [sp, #52] ; 0x34 + 1f45850: e58d3008 str r3, [sp, #8] + 1f45854: e3a03001 mov r3, #1 + 1f45858: e1a05000 mov r5, r0 + 1f4585c: e5840040 str r0, [r4, #64] ; 0x40 + 1f45860: e58d3028 str r3, [sp, #40] ; 0x28 + 1f45864: e59d3044 ldr r3, [sp, #68] ; 0x44 + 1f45868: e1e02003 mvn r2, r3 + 1f4586c: e357000e cmp r7, #14 + 1f45870: e1a02fa2 lsr r2, r2, #31 + 1f45874: c3a02000 movgt r2, #0 + 1f45878: e3520000 cmp r2, #0 + 1f4587c: 0a00004d beq 1f459b8 <_dtoa_r+0x468> + 1f45880: e59d1008 ldr r1, [sp, #8] + 1f45884: e3510000 cmp r1, #0 + 1f45888: c3a02000 movgt r2, #0 + 1f4588c: d3a02001 movle r2, #1 + 1f45890: e59f3118 ldr r3, [pc, #280] ; 1f459b0 <_dtoa_r+0x460> + 1f45894: e0122fa6 ands r2, r2, r6, lsr #31 + 1f45898: e0833187 add r3, r3, r7, lsl #3 + 1f4589c: ed935b00 vldr d5, [r3] + 1f458a0: 1a0001be bne 1f45fa0 <_dtoa_r+0xa50> + 1f458a4: ec4bab17 vmov d7, sl, fp + 1f458a8: ee876b05 vdiv.f64 d6, d7, d5 + 1f458ac: eebd6bc6 vcvt.s32.f64 s12, d6 + 1f458b0: ee163a10 vmov r3, s12 + 1f458b4: eeb84bc6 vcvt.f64.s32 d4, s12 + 1f458b8: e2833030 add r3, r3, #48 ; 0x30 + 1f458bc: e3510001 cmp r1, #1 + 1f458c0: e5c53000 strb r3, [r5] + 1f458c4: ee047b45 vmls.f64 d7, d4, d5 + 1f458c8: e2853001 add r3, r5, #1 + 1f458cc: 0a000014 beq 1f45924 <_dtoa_r+0x3d4> + 1f458d0: ed9f3b2e vldr d3, [pc, #184] ; 1f45990 <_dtoa_r+0x440> + 1f458d4: ee277b03 vmul.f64 d7, d7, d3 + 1f458d8: eeb57b40 vcmp.f64 d7, #0.0 + 1f458dc: eef1fa10 vmrs APSR_nzcv, fpscr + 1f458e0: 159d1008 ldrne r1, [sp, #8] + 1f458e4: 1a000004 bne 1f458fc <_dtoa_r+0x3ac> + 1f458e8: ea00031d b 1f46564 <_dtoa_r+0x1014> + 1f458ec: ee277b03 vmul.f64 d7, d7, d3 + 1f458f0: eeb57b40 vcmp.f64 d7, #0.0 + 1f458f4: eef1fa10 vmrs APSR_nzcv, fpscr + 1f458f8: 0a000319 beq 1f46564 <_dtoa_r+0x1014> + 1f458fc: ee876b05 vdiv.f64 d6, d7, d5 + 1f45900: eebd6bc6 vcvt.s32.f64 s12, d6 + 1f45904: ee162a10 vmov r2, s12 + 1f45908: eeb84bc6 vcvt.f64.s32 d4, s12 + 1f4590c: e2822030 add r2, r2, #48 ; 0x30 + 1f45910: e4c32001 strb r2, [r3], #1 + 1f45914: e0652003 rsb r2, r5, r3 + 1f45918: e1510002 cmp r1, r2 + 1f4591c: ee047b45 vmls.f64 d7, d4, d5 + 1f45920: 1afffff1 bne 1f458ec <_dtoa_r+0x39c> + 1f45924: ee377b07 vadd.f64 d7, d7, d7 + 1f45928: eeb45bc7 vcmpe.f64 d5, d7 + 1f4592c: eef1fa10 vmrs APSR_nzcv, fpscr + 1f45930: 5a000389 bpl 1f4675c <_dtoa_r+0x120c> + 1f45934: e58d501c str r5, [sp, #28] + 1f45938: e1a05003 mov r5, r3 + 1f4593c: e5532001 ldrb r2, [r3, #-1] + 1f45940: e2453001 sub r3, r5, #1 + 1f45944: e59d101c ldr r1, [sp, #28] + 1f45948: ea000002 b 1f45958 <_dtoa_r+0x408> + 1f4594c: e1530001 cmp r3, r1 + 1f45950: 0a000317 beq 1f465b4 <_dtoa_r+0x1064> + 1f45954: e5732001 ldrb r2, [r3, #-1]! + 1f45958: e3520039 cmp r2, #57 ; 0x39 + 1f4595c: e2835001 add r5, r3, #1 + 1f45960: 0afffff9 beq 1f4594c <_dtoa_r+0x3fc> + 1f45964: e2822001 add r2, r2, #1 + 1f45968: e5c32000 strb r2, [r3] + 1f4596c: ea0000ac b 1f45c24 <_dtoa_r+0x6d4> + 1f45970: 00000000 .word 0x00000000 + 1f45974: 3ff80000 .word 0x3ff80000 + 1f45978: 636f4361 .word 0x636f4361 + 1f4597c: 3fd287a7 .word 0x3fd287a7 + 1f45980: 8b60c8b3 .word 0x8b60c8b3 + 1f45984: 3fc68a28 .word 0x3fc68a28 + 1f45988: 509f79fb .word 0x509f79fb + 1f4598c: 3fd34413 .word 0x3fd34413 + 1f45990: 00000000 .word 0x00000000 + 1f45994: 40240000 .word 0x40240000 + 1f45998: 7ff00000 .word 0x7ff00000 + 1f4599c: 01f63699 .word 0x01f63699 + 1f459a0: 0000270f .word 0x0000270f + 1f459a4: 01f63068 .word 0x01f63068 + 1f459a8: 01f6305c .word 0x01f6305c + 1f459ac: 01f63698 .word 0x01f63698 + 1f459b0: 01f63088 .word 0x01f63088 + 1f459b4: 01f63150 .word 0x01f63150 + 1f459b8: e59d2028 ldr r2, [sp, #40] ; 0x28 + 1f459bc: e3520000 cmp r2, #0 + 1f459c0: 1a0000c1 bne 1f45ccc <_dtoa_r+0x77c> + 1f459c4: e59d3014 ldr r3, [sp, #20] + 1f459c8: e58d3038 str r3, [sp, #56] ; 0x38 + 1f459cc: e59d3018 ldr r3, [sp, #24] + 1f459d0: e58d301c str r3, [sp, #28] + 1f459d4: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f459d8: e58d3020 str r3, [sp, #32] + 1f459dc: e59d201c ldr r2, [sp, #28] + 1f459e0: e3520000 cmp r2, #0 + 1f459e4: c3590000 cmpgt r9, #0 + 1f459e8: e1a03002 mov r3, r2 + 1f459ec: da000007 ble 1f45a10 <_dtoa_r+0x4c0> + 1f459f0: e1520009 cmp r2, r9 + 1f459f4: a1a03009 movge r3, r9 + 1f459f8: e59d1018 ldr r1, [sp, #24] + 1f459fc: e0632002 rsb r2, r3, r2 + 1f45a00: e0631001 rsb r1, r3, r1 + 1f45a04: e58d1018 str r1, [sp, #24] + 1f45a08: e58d201c str r2, [sp, #28] + 1f45a0c: e0639009 rsb r9, r3, r9 + 1f45a10: e59d3014 ldr r3, [sp, #20] + 1f45a14: e3530000 cmp r3, #0 + 1f45a18: da000018 ble 1f45a80 <_dtoa_r+0x530> + 1f45a1c: e59d2028 ldr r2, [sp, #40] ; 0x28 + 1f45a20: e3520000 cmp r2, #0 + 1f45a24: 0a0001ca beq 1f46154 <_dtoa_r+0xc04> + 1f45a28: e59d2038 ldr r2, [sp, #56] ; 0x38 + 1f45a2c: e3520000 cmp r2, #0 + 1f45a30: 0a0001c7 beq 1f46154 <_dtoa_r+0xc04> + 1f45a34: e59d1020 ldr r1, [sp, #32] + 1f45a38: e1a00004 mov r0, r4 + 1f45a3c: eb000879 bl 1f47c28 <__pow5mult> + 1f45a40: e1a02008 mov r2, r8 + 1f45a44: e1a01000 mov r1, r0 + 1f45a48: e58d0020 str r0, [sp, #32] + 1f45a4c: e1a00004 mov r0, r4 + 1f45a50: eb0007f8 bl 1f47a38 <__multiply> + 1f45a54: e1a01008 mov r1, r8 + 1f45a58: e58d003c str r0, [sp, #60] ; 0x3c + 1f45a5c: e1a00004 mov r0, r4 + 1f45a60: eb000737 bl 1f47744 <_Bfree> + 1f45a64: e59d3014 ldr r3, [sp, #20] + 1f45a68: e59d2038 ldr r2, [sp, #56] ; 0x38 + 1f45a6c: e0533002 subs r3, r3, r2 + 1f45a70: e58d3014 str r3, [sp, #20] + 1f45a74: e59d303c ldr r3, [sp, #60] ; 0x3c + 1f45a78: e1a08003 mov r8, r3 + 1f45a7c: 1a0001b4 bne 1f46154 <_dtoa_r+0xc04> + 1f45a80: e3a01001 mov r1, #1 + 1f45a84: e1a00004 mov r0, r4 + 1f45a88: eb0007e1 bl 1f47a14 <__i2b> + 1f45a8c: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f45a90: e3530000 cmp r3, #0 + 1f45a94: e58d0014 str r0, [sp, #20] + 1f45a98: 0a0001a6 beq 1f46138 <_dtoa_r+0xbe8> + 1f45a9c: e1a01000 mov r1, r0 + 1f45aa0: e1a02003 mov r2, r3 + 1f45aa4: e1a00004 mov r0, r4 + 1f45aa8: eb00085e bl 1f47c28 <__pow5mult> + 1f45aac: e59d3004 ldr r3, [sp, #4] + 1f45ab0: e3530001 cmp r3, #1 + 1f45ab4: e58d0014 str r0, [sp, #20] + 1f45ab8: ca000200 bgt 1f462c0 <_dtoa_r+0xd70> + 1f45abc: e35a0000 cmp sl, #0 + 1f45ac0: 1a0001fe bne 1f462c0 <_dtoa_r+0xd70> + 1f45ac4: e3cb34ff bic r3, fp, #-16777216 ; 0xff000000 + 1f45ac8: e3c3360f bic r3, r3, #15728640 ; 0xf00000 + 1f45acc: e3530000 cmp r3, #0 + 1f45ad0: 13a03000 movne r3, #0 + 1f45ad4: 158d3038 strne r3, [sp, #56] ; 0x38 + 1f45ad8: 1a000009 bne 1f45b04 <_dtoa_r+0x5b4> + 1f45adc: e3cb3102 bic r3, fp, #-2147483648 ; 0x80000000 + 1f45ae0: e1a03a23 lsr r3, r3, #20 + 1f45ae4: e1a03a03 lsl r3, r3, #20 + 1f45ae8: e3530000 cmp r3, #0 + 1f45aec: 159d3018 ldrne r3, [sp, #24] + 1f45af0: 12833001 addne r3, r3, #1 + 1f45af4: 158d3018 strne r3, [sp, #24] + 1f45af8: 13a03001 movne r3, #1 + 1f45afc: e58d3038 str r3, [sp, #56] ; 0x38 + 1f45b00: 12899001 addne r9, r9, #1 + 1f45b04: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f45b08: e3530000 cmp r3, #0 + 1f45b0c: 03a00001 moveq r0, #1 + 1f45b10: 1a0001ec bne 1f462c8 <_dtoa_r+0xd78> + 1f45b14: e0800009 add r0, r0, r9 + 1f45b18: e210001f ands r0, r0, #31 + 1f45b1c: 0a000143 beq 1f46030 <_dtoa_r+0xae0> + 1f45b20: e2603020 rsb r3, r0, #32 + 1f45b24: e3530004 cmp r3, #4 + 1f45b28: da000337 ble 1f4680c <_dtoa_r+0x12bc> + 1f45b2c: e260001c rsb r0, r0, #28 + 1f45b30: e59d3018 ldr r3, [sp, #24] + 1f45b34: e0833000 add r3, r3, r0 + 1f45b38: e58d3018 str r3, [sp, #24] + 1f45b3c: e59d301c ldr r3, [sp, #28] + 1f45b40: e0833000 add r3, r3, r0 + 1f45b44: e58d301c str r3, [sp, #28] + 1f45b48: e0899000 add r9, r9, r0 + 1f45b4c: e59d3018 ldr r3, [sp, #24] + 1f45b50: e3530000 cmp r3, #0 + 1f45b54: da000004 ble 1f45b6c <_dtoa_r+0x61c> + 1f45b58: e1a01008 mov r1, r8 + 1f45b5c: e1a02003 mov r2, r3 + 1f45b60: e1a00004 mov r0, r4 + 1f45b64: eb000870 bl 1f47d2c <__lshift> + 1f45b68: e1a08000 mov r8, r0 + 1f45b6c: e3590000 cmp r9, #0 + 1f45b70: da000004 ble 1f45b88 <_dtoa_r+0x638> + 1f45b74: e1a02009 mov r2, r9 + 1f45b78: e59d1014 ldr r1, [sp, #20] + 1f45b7c: e1a00004 mov r0, r4 + 1f45b80: eb000869 bl 1f47d2c <__lshift> + 1f45b84: e58d0014 str r0, [sp, #20] + 1f45b88: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f45b8c: e3530000 cmp r3, #0 + 1f45b90: 1a0001d3 bne 1f462e4 <_dtoa_r+0xd94> + 1f45b94: e99d000c ldmib sp, {r2, r3} + 1f45b98: e3530000 cmp r3, #0 + 1f45b9c: d3a03001 movle r3, #1 + 1f45ba0: c3a03000 movgt r3, #0 + 1f45ba4: e3520002 cmp r2, #2 + 1f45ba8: d3a03000 movle r3, #0 + 1f45bac: e3530000 cmp r3, #0 + 1f45bb0: 0a000120 beq 1f46038 <_dtoa_r+0xae8> + 1f45bb4: e59d3008 ldr r3, [sp, #8] + 1f45bb8: e3530000 cmp r3, #0 + 1f45bbc: 1a000118 bne 1f46024 <_dtoa_r+0xad4> + 1f45bc0: e59d1014 ldr r1, [sp, #20] + 1f45bc4: e3a02005 mov r2, #5 + 1f45bc8: e1a00004 mov r0, r4 + 1f45bcc: eb0006e3 bl 1f47760 <__multadd> + 1f45bd0: e1a01000 mov r1, r0 + 1f45bd4: e58d0014 str r0, [sp, #20] + 1f45bd8: e1a00008 mov r0, r8 + 1f45bdc: eb00088f bl 1f47e20 <__mcmp> + 1f45be0: e3500000 cmp r0, #0 + 1f45be4: c58d501c strgt r5, [sp, #28] + 1f45be8: da00010d ble 1f46024 <_dtoa_r+0xad4> + 1f45bec: e3a03031 mov r3, #49 ; 0x31 + 1f45bf0: e59d201c ldr r2, [sp, #28] + 1f45bf4: e5c23000 strb r3, [r2] + 1f45bf8: e2877001 add r7, r7, #1 + 1f45bfc: e2825001 add r5, r2, #1 + 1f45c00: e59d1014 ldr r1, [sp, #20] + 1f45c04: e1a00004 mov r0, r4 + 1f45c08: eb0006cd bl 1f47744 <_Bfree> + 1f45c0c: e59d3020 ldr r3, [sp, #32] + 1f45c10: e3530000 cmp r3, #0 + 1f45c14: 0a000002 beq 1f45c24 <_dtoa_r+0x6d4> + 1f45c18: e59d1020 ldr r1, [sp, #32] + 1f45c1c: e1a00004 mov r0, r4 + 1f45c20: eb0006c7 bl 1f47744 <_Bfree> + 1f45c24: e1a01008 mov r1, r8 + 1f45c28: e1a00004 mov r0, r4 + 1f45c2c: eb0006c4 bl 1f47744 <_Bfree> + 1f45c30: e3a02000 mov r2, #0 + 1f45c34: e59d1074 ldr r1, [sp, #116] ; 0x74 + 1f45c38: e5c52000 strb r2, [r5] + 1f45c3c: e1510002 cmp r1, r2 + 1f45c40: e59d2010 ldr r2, [sp, #16] + 1f45c44: e2873001 add r3, r7, #1 + 1f45c48: e5823000 str r3, [r2] + 1f45c4c: 0a000236 beq 1f4652c <_dtoa_r+0xfdc> + 1f45c50: e59d001c ldr r0, [sp, #28] + 1f45c54: e5815000 str r5, [r1] + 1f45c58: e28dd04c add sp, sp, #76 ; 0x4c + 1f45c5c: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f45c60: e12fff1e bx lr + 1f45c64: eeb86be6 vcvt.f64.s32 d6, s13 + 1f45c68: eeb47b46 vcmp.f64 d7, d6 + 1f45c6c: eef1fa10 vmrs APSR_nzcv, fpscr + 1f45c70: 12477001 subne r7, r7, #1 + 1f45c74: eafffea7 b 1f45718 <_dtoa_r+0x1c8> + 1f45c78: e3a06000 mov r6, #0 + 1f45c7c: e1a00004 mov r0, r4 + 1f45c80: e5846044 str r6, [r4, #68] ; 0x44 + 1f45c84: e1a01006 mov r1, r6 + 1f45c88: eb000689 bl 1f476b4 <_Balloc> + 1f45c8c: e59d3044 ldr r3, [sp, #68] ; 0x44 + 1f45c90: e357000e cmp r7, #14 + 1f45c94: c3a02000 movgt r2, #0 + 1f45c98: d3a02001 movle r2, #1 + 1f45c9c: e1530006 cmp r3, r6 + 1f45ca0: b3a02000 movlt r2, #0 + 1f45ca4: e1520006 cmp r2, r6 + 1f45ca8: e1a05000 mov r5, r0 + 1f45cac: e5840040 str r0, [r4, #64] ; 0x40 + 1f45cb0: 1a0002dd bne 1f4682c <_dtoa_r+0x12dc> + 1f45cb4: e3e01000 mvn r1, #0 + 1f45cb8: e1a06002 mov r6, r2 + 1f45cbc: e3a02001 mov r2, #1 + 1f45cc0: e58d1034 str r1, [sp, #52] ; 0x34 + 1f45cc4: e58d1008 str r1, [sp, #8] + 1f45cc8: e58d2028 str r2, [sp, #40] ; 0x28 + 1f45ccc: e59d2004 ldr r2, [sp, #4] + 1f45cd0: e3520001 cmp r2, #1 + 1f45cd4: da00024d ble 1f46610 <_dtoa_r+0x10c0> + 1f45cd8: e59d3008 ldr r3, [sp, #8] + 1f45cdc: e2432001 sub r2, r3, #1 + 1f45ce0: e59d3014 ldr r3, [sp, #20] + 1f45ce4: e1530002 cmp r3, r2 + 1f45ce8: b59d3014 ldrlt r3, [sp, #20] + 1f45cec: b58d2014 strlt r2, [sp, #20] + 1f45cf0: b0633002 rsblt r3, r3, r2 + 1f45cf4: b3a02000 movlt r2, #0 + 1f45cf8: b58d2038 strlt r2, [sp, #56] ; 0x38 + 1f45cfc: b59d2030 ldrlt r2, [sp, #48] ; 0x30 + 1f45d00: a0623003 rsbge r3, r2, r3 + 1f45d04: b0823003 addlt r3, r2, r3 + 1f45d08: a58d3038 strge r3, [sp, #56] ; 0x38 + 1f45d0c: b58d3030 strlt r3, [sp, #48] ; 0x30 + 1f45d10: e59d3008 ldr r3, [sp, #8] + 1f45d14: e3530000 cmp r3, #0 + 1f45d18: b59d2008 ldrlt r2, [sp, #8] + 1f45d1c: e59d3018 ldr r3, [sp, #24] + 1f45d20: b0623003 rsblt r3, r2, r3 + 1f45d24: b58d301c strlt r3, [sp, #28] + 1f45d28: b3a03000 movlt r3, #0 + 1f45d2c: a58d301c strge r3, [sp, #28] + 1f45d30: a59d3008 ldrge r3, [sp, #8] + 1f45d34: e59d2018 ldr r2, [sp, #24] + 1f45d38: e3a01001 mov r1, #1 + 1f45d3c: e0822003 add r2, r2, r3 + 1f45d40: e1a00004 mov r0, r4 + 1f45d44: e58d2018 str r2, [sp, #24] + 1f45d48: e0899003 add r9, r9, r3 + 1f45d4c: eb000730 bl 1f47a14 <__i2b> + 1f45d50: e58d0020 str r0, [sp, #32] + 1f45d54: eaffff20 b 1f459dc <_dtoa_r+0x48c> + 1f45d58: e3a03000 mov r3, #0 + 1f45d5c: e58d3028 str r3, [sp, #40] ; 0x28 + 1f45d60: e0873006 add r3, r7, r6 + 1f45d64: e58d3034 str r3, [sp, #52] ; 0x34 + 1f45d68: e2833001 add r3, r3, #1 + 1f45d6c: e3530000 cmp r3, #0 + 1f45d70: e58d3008 str r3, [sp, #8] + 1f45d74: da0001f6 ble 1f46554 <_dtoa_r+0x1004> + 1f45d78: e59d3008 ldr r3, [sp, #8] + 1f45d7c: e353000e cmp r3, #14 + 1f45d80: 83a05000 movhi r5, #0 + 1f45d84: 92055001 andls r5, r5, #1 + 1f45d88: e1a00003 mov r0, r3 + 1f45d8c: e3a01000 mov r1, #0 + 1f45d90: e3500017 cmp r0, #23 + 1f45d94: e5841044 str r1, [r4, #68] ; 0x44 + 1f45d98: 9a000008 bls 1f45dc0 <_dtoa_r+0x870> + 1f45d9c: e3a02001 mov r2, #1 + 1f45da0: e3a03004 mov r3, #4 + 1f45da4: e1a01002 mov r1, r2 + 1f45da8: e1a03083 lsl r3, r3, #1 + 1f45dac: e2832014 add r2, r3, #20 + 1f45db0: e1520000 cmp r2, r0 + 1f45db4: e2812001 add r2, r1, #1 + 1f45db8: 9afffff9 bls 1f45da4 <_dtoa_r+0x854> + 1f45dbc: e5841044 str r1, [r4, #68] ; 0x44 + 1f45dc0: e1a00004 mov r0, r4 + 1f45dc4: eb00063a bl 1f476b4 <_Balloc> + 1f45dc8: e3550000 cmp r5, #0 + 1f45dcc: e58d001c str r0, [sp, #28] + 1f45dd0: e5840040 str r0, [r4, #64] ; 0x40 + 1f45dd4: 0a000292 beq 1f46824 <_dtoa_r+0x12d4> + 1f45dd8: e3570000 cmp r7, #0 + 1f45ddc: e58da020 str sl, [sp, #32] + 1f45de0: e58db024 str fp, [sp, #36] ; 0x24 + 1f45de4: da0000e6 ble 1f46184 <_dtoa_r+0xc34> + 1f45de8: e51f1440 ldr r1, [pc, #-1088] ; 1f459b0 <_dtoa_r+0x460> + 1f45dec: e1a03247 asr r3, r7, #4 + 1f45df0: e207200f and r2, r7, #15 + 1f45df4: e3130010 tst r3, #16 + 1f45df8: e0812182 add r2, r1, r2, lsl #3 + 1f45dfc: ed926b00 vldr d6, [r2] + 1f45e00: 151f2454 ldrne r2, [pc, #-1108] ; 1f459b4 <_dtoa_r+0x464> + 1f45e04: 1c4bab15 vmovne d5, sl, fp + 1f45e08: 1d927b08 vldrne d7, [r2, #32] + 1f45e0c: 1203300f andne r3, r3, #15 + 1f45e10: 1e854b07 vdivne.f64 d4, d5, d7 + 1f45e14: 13a01003 movne r1, #3 + 1f45e18: 0d9d4b08 vldreq d4, [sp, #32] + 1f45e1c: 03a01002 moveq r1, #2 + 1f45e20: e3530000 cmp r3, #0 + 1f45e24: 0a000007 beq 1f45e48 <_dtoa_r+0x8f8> + 1f45e28: e51f247c ldr r2, [pc, #-1148] ; 1f459b4 <_dtoa_r+0x464> + 1f45e2c: e3130001 tst r3, #1 + 1f45e30: 1d927b00 vldrne d7, [r2] + 1f45e34: 12811001 addne r1, r1, #1 + 1f45e38: 1e266b07 vmulne.f64 d6, d6, d7 + 1f45e3c: e1b030c3 asrs r3, r3, #1 + 1f45e40: e2822008 add r2, r2, #8 + 1f45e44: 1afffff8 bne 1f45e2c <_dtoa_r+0x8dc> + 1f45e48: ee845b06 vdiv.f64 d5, d4, d6 + 1f45e4c: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f45e50: e3530000 cmp r3, #0 + 1f45e54: 0a000003 beq 1f45e68 <_dtoa_r+0x918> + 1f45e58: ed9f7be2 vldr d7, [pc, #904] ; 1f461e8 <_dtoa_r+0xc98> + 1f45e5c: eeb45bc7 vcmpe.f64 d5, d7 + 1f45e60: eef1fa10 vmrs APSR_nzcv, fpscr + 1f45e64: 4a0001c1 bmi 1f46570 <_dtoa_r+0x1020> + 1f45e68: ee071a90 vmov s15, r1 + 1f45e6c: eeb86be7 vcvt.f64.s32 d6, s15 + 1f45e70: ed9f7bde vldr d7, [pc, #888] ; 1f461f0 <_dtoa_r+0xca0> + 1f45e74: ee067b05 vmla.f64 d7, d6, d5 + 1f45e78: ec5bab17 vmov sl, fp, d7 + 1f45e7c: e59d3008 ldr r3, [sp, #8] + 1f45e80: e3530000 cmp r3, #0 + 1f45e84: e24bb50d sub fp, fp, #54525952 ; 0x3400000 + 1f45e88: 0a000057 beq 1f45fec <_dtoa_r+0xa9c> + 1f45e8c: e1a0c007 mov ip, r7 + 1f45e90: e59d3008 ldr r3, [sp, #8] + 1f45e94: e59d2028 ldr r2, [sp, #40] ; 0x28 + 1f45e98: e3520000 cmp r2, #0 + 1f45e9c: 0a0000dd beq 1f46218 <_dtoa_r+0xcc8> + 1f45ea0: e59f236c ldr r2, [pc, #876] ; 1f46214 <_dtoa_r+0xcc4> + 1f45ea4: e0822183 add r2, r2, r3, lsl #3 + 1f45ea8: ed127b02 vldr d7, [r2, #-8] + 1f45eac: ed9f3bd1 vldr d3, [pc, #836] ; 1f461f8 <_dtoa_r+0xca8> + 1f45eb0: eefd6bc5 vcvt.s32.f64 s13, d5 + 1f45eb4: ee834b07 vdiv.f64 d4, d3, d7 + 1f45eb8: eeb87be6 vcvt.f64.s32 d7, s13 + 1f45ebc: ec4bab13 vmov d3, sl, fp + 1f45ec0: ee357b47 vsub.f64 d7, d5, d7 + 1f45ec4: ee344b43 vsub.f64 d4, d4, d3 + 1f45ec8: eeb44bc7 vcmpe.f64 d4, d7 + 1f45ecc: ee162a90 vmov r2, s13 + 1f45ed0: eef1fa10 vmrs APSR_nzcv, fpscr + 1f45ed4: e59d101c ldr r1, [sp, #28] + 1f45ed8: e2822030 add r2, r2, #48 ; 0x30 + 1f45edc: e20220ff and r2, r2, #255 ; 0xff + 1f45ee0: e5c12000 strb r2, [r1] + 1f45ee4: e2815001 add r5, r1, #1 + 1f45ee8: ca00001c bgt 1f45f60 <_dtoa_r+0xa10> + 1f45eec: ed9f2bbd vldr d2, [pc, #756] ; 1f461e8 <_dtoa_r+0xc98> + 1f45ef0: ee326b47 vsub.f64 d6, d2, d7 + 1f45ef4: eeb44bc6 vcmpe.f64 d4, d6 + 1f45ef8: eef1fa10 vmrs APSR_nzcv, fpscr + 1f45efc: ca0001db bgt 1f46670 <_dtoa_r+0x1120> + 1f45f00: e3530001 cmp r3, #1 + 1f45f04: da000098 ble 1f4616c <_dtoa_r+0xc1c> + 1f45f08: e59d201c ldr r2, [sp, #28] + 1f45f0c: ed9f3bbb vldr d3, [pc, #748] ; 1f46200 <_dtoa_r+0xcb0> + 1f45f10: e0823003 add r3, r2, r3 + 1f45f14: ea000005 b 1f45f30 <_dtoa_r+0x9e0> + 1f45f18: ee326b47 vsub.f64 d6, d2, d7 + 1f45f1c: eeb46bc4 vcmpe.f64 d6, d4 + 1f45f20: eef1fa10 vmrs APSR_nzcv, fpscr + 1f45f24: 4a0001d1 bmi 1f46670 <_dtoa_r+0x1120> + 1f45f28: e1550003 cmp r5, r3 + 1f45f2c: 0a00008e beq 1f4616c <_dtoa_r+0xc1c> + 1f45f30: ee277b03 vmul.f64 d7, d7, d3 + 1f45f34: eefd5bc7 vcvt.s32.f64 s11, d7 + 1f45f38: eeb86be5 vcvt.f64.s32 d6, s11 + 1f45f3c: ee244b03 vmul.f64 d4, d4, d3 + 1f45f40: ee377b46 vsub.f64 d7, d7, d6 + 1f45f44: eeb47bc4 vcmpe.f64 d7, d4 + 1f45f48: ee152a90 vmov r2, s11 + 1f45f4c: eef1fa10 vmrs APSR_nzcv, fpscr + 1f45f50: e2822030 add r2, r2, #48 ; 0x30 + 1f45f54: e20220ff and r2, r2, #255 ; 0xff + 1f45f58: e4c52001 strb r2, [r5], #1 + 1f45f5c: 5affffed bpl 1f45f18 <_dtoa_r+0x9c8> + 1f45f60: e1a0700c mov r7, ip + 1f45f64: eaffff2e b 1f45c24 <_dtoa_r+0x6d4> + 1f45f68: e3a03000 mov r3, #0 + 1f45f6c: e58d3028 str r3, [sp, #40] ; 0x28 + 1f45f70: e3560000 cmp r6, #0 + 1f45f74: da00016e ble 1f46534 <_dtoa_r+0xfe4> + 1f45f78: e356000e cmp r6, #14 + 1f45f7c: 83a05000 movhi r5, #0 + 1f45f80: 92055001 andls r5, r5, #1 + 1f45f84: e1a00006 mov r0, r6 + 1f45f88: e58d6034 str r6, [sp, #52] ; 0x34 + 1f45f8c: e58d6008 str r6, [sp, #8] + 1f45f90: eaffff7d b 1f45d8c <_dtoa_r+0x83c> + 1f45f94: e3a03001 mov r3, #1 + 1f45f98: e58d3028 str r3, [sp, #40] ; 0x28 + 1f45f9c: eafffff3 b 1f45f70 <_dtoa_r+0xa20> + 1f45fa0: e59d3008 ldr r3, [sp, #8] + 1f45fa4: e3530000 cmp r3, #0 + 1f45fa8: 1a0001d4 bne 1f46700 <_dtoa_r+0x11b0> + 1f45fac: ed9f7b95 vldr d7, [pc, #596] ; 1f46208 <_dtoa_r+0xcb8> + 1f45fb0: ee255b07 vmul.f64 d5, d5, d7 + 1f45fb4: ec4bab17 vmov d7, sl, fp + 1f45fb8: eeb45bc7 vcmpe.f64 d5, d7 + 1f45fbc: eef1fa10 vmrs APSR_nzcv, fpscr + 1f45fc0: aa0001a6 bge 1f46660 <_dtoa_r+0x1110> + 1f45fc4: e58d3014 str r3, [sp, #20] + 1f45fc8: e58d501c str r5, [sp, #28] + 1f45fcc: e58d3020 str r3, [sp, #32] + 1f45fd0: eaffff05 b 1f45bec <_dtoa_r+0x69c> + 1f45fd4: ee071a90 vmov s15, r1 + 1f45fd8: eeb86be7 vcvt.f64.s32 d6, s15 + 1f45fdc: ed9f7b83 vldr d7, [pc, #524] ; 1f461f0 <_dtoa_r+0xca0> + 1f45fe0: ee067b05 vmla.f64 d7, d6, d5 + 1f45fe4: ec5bab17 vmov sl, fp, d7 + 1f45fe8: e24bb50d sub fp, fp, #54525952 ; 0x3400000 + 1f45fec: ed9f7b85 vldr d7, [pc, #532] ; 1f46208 <_dtoa_r+0xcb8> + 1f45ff0: ec4bab16 vmov d6, sl, fp + 1f45ff4: ee357b47 vsub.f64 d7, d5, d7 + 1f45ff8: eeb47bc6 vcmpe.f64 d7, d6 + 1f45ffc: eef1fa10 vmrs APSR_nzcv, fpscr + 1f46000: ca0000aa bgt 1f462b0 <_dtoa_r+0xd60> + 1f46004: eeb16b46 vneg.f64 d6, d6 + 1f46008: eeb47bc6 vcmpe.f64 d7, d6 + 1f4600c: eef1fa10 vmrs APSR_nzcv, fpscr + 1f46010: 5a000055 bpl 1f4616c <_dtoa_r+0xc1c> + 1f46014: e3a03000 mov r3, #0 + 1f46018: e59d501c ldr r5, [sp, #28] + 1f4601c: e58d3014 str r3, [sp, #20] + 1f46020: e58d3020 str r3, [sp, #32] + 1f46024: e1e07006 mvn r7, r6 + 1f46028: e58d501c str r5, [sp, #28] + 1f4602c: eafffef3 b 1f45c00 <_dtoa_r+0x6b0> + 1f46030: e3a0001c mov r0, #28 + 1f46034: eafffebd b 1f45b30 <_dtoa_r+0x5e0> + 1f46038: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f4603c: e3530000 cmp r3, #0 + 1f46040: 1a0000d5 bne 1f4639c <_dtoa_r+0xe4c> + 1f46044: e1a06005 mov r6, r5 + 1f46048: e59d9014 ldr r9, [sp, #20] + 1f4604c: e59da008 ldr sl, [sp, #8] + 1f46050: ea000005 b 1f4606c <_dtoa_r+0xb1c> + 1f46054: e1a01008 mov r1, r8 + 1f46058: e3a03000 mov r3, #0 + 1f4605c: e3a0200a mov r2, #10 + 1f46060: e1a00004 mov r0, r4 + 1f46064: eb0005bd bl 1f47760 <__multadd> + 1f46068: e1a08000 mov r8, r0 + 1f4606c: e1a01009 mov r1, r9 + 1f46070: e1a00008 mov r0, r8 + 1f46074: ebfffcbf bl 1f45378 + 1f46078: e2800030 add r0, r0, #48 ; 0x30 + 1f4607c: e4c60001 strb r0, [r6], #1 + 1f46080: e0653006 rsb r3, r5, r6 + 1f46084: e153000a cmp r3, sl + 1f46088: bafffff1 blt 1f46054 <_dtoa_r+0xb04> + 1f4608c: e59d3008 ldr r3, [sp, #8] + 1f46090: e1a0b000 mov fp, r0 + 1f46094: e3530001 cmp r3, #1 + 1f46098: a0856003 addge r6, r5, r3 + 1f4609c: b2856001 addlt r6, r5, #1 + 1f460a0: e3a0a000 mov sl, #0 + 1f460a4: e1a01008 mov r1, r8 + 1f460a8: e3a02001 mov r2, #1 + 1f460ac: e1a00004 mov r0, r4 + 1f460b0: eb00071d bl 1f47d2c <__lshift> + 1f460b4: e59d1014 ldr r1, [sp, #20] + 1f460b8: e1a08000 mov r8, r0 + 1f460bc: eb000757 bl 1f47e20 <__mcmp> + 1f460c0: e3500000 cmp r0, #0 + 1f460c4: da000183 ble 1f466d8 <_dtoa_r+0x1188> + 1f460c8: e5562001 ldrb r2, [r6, #-1] + 1f460cc: e2463001 sub r3, r6, #1 + 1f460d0: ea000002 b 1f460e0 <_dtoa_r+0xb90> + 1f460d4: e1530005 cmp r3, r5 + 1f460d8: 0a000148 beq 1f46600 <_dtoa_r+0x10b0> + 1f460dc: e5732001 ldrb r2, [r3, #-1]! + 1f460e0: e3520039 cmp r2, #57 ; 0x39 + 1f460e4: e2836001 add r6, r3, #1 + 1f460e8: 0afffff9 beq 1f460d4 <_dtoa_r+0xb84> + 1f460ec: e2822001 add r2, r2, #1 + 1f460f0: e5c32000 strb r2, [r3] + 1f460f4: e59d1014 ldr r1, [sp, #20] + 1f460f8: e1a00004 mov r0, r4 + 1f460fc: eb000590 bl 1f47744 <_Bfree> + 1f46100: e59d3020 ldr r3, [sp, #32] + 1f46104: e3530000 cmp r3, #0 + 1f46108: 0a000190 beq 1f46750 <_dtoa_r+0x1200> + 1f4610c: e35a0000 cmp sl, #0 + 1f46110: 115a0003 cmpne sl, r3 + 1f46114: 058d501c streq r5, [sp, #28] + 1f46118: 01a05006 moveq r5, r6 + 1f4611c: 0afffebd beq 1f45c18 <_dtoa_r+0x6c8> + 1f46120: e1a0100a mov r1, sl + 1f46124: e1a00004 mov r0, r4 + 1f46128: e58d501c str r5, [sp, #28] + 1f4612c: eb000584 bl 1f47744 <_Bfree> + 1f46130: e1a05006 mov r5, r6 + 1f46134: eafffeb7 b 1f45c18 <_dtoa_r+0x6c8> + 1f46138: e59d3004 ldr r3, [sp, #4] + 1f4613c: e3530001 cmp r3, #1 + 1f46140: da0001b4 ble 1f46818 <_dtoa_r+0x12c8> + 1f46144: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f46148: e3a00001 mov r0, #1 + 1f4614c: e58d3038 str r3, [sp, #56] ; 0x38 + 1f46150: eafffe6f b 1f45b14 <_dtoa_r+0x5c4> + 1f46154: e1a01008 mov r1, r8 + 1f46158: e59d2014 ldr r2, [sp, #20] + 1f4615c: e1a00004 mov r0, r4 + 1f46160: eb0006b0 bl 1f47c28 <__pow5mult> + 1f46164: e1a08000 mov r8, r0 + 1f46168: eafffe44 b 1f45a80 <_dtoa_r+0x530> + 1f4616c: e59d501c ldr r5, [sp, #28] + 1f46170: e28db020 add fp, sp, #32 + 1f46174: e89b0c00 ldm fp, {sl, fp} + 1f46178: eafffdb9 b 1f45864 <_dtoa_r+0x314> + 1f4617c: e1a00008 mov r0, r8 + 1f46180: eafffd22 b 1f45610 <_dtoa_r+0xc0> + 1f46184: e2673000 rsb r3, r7, #0 + 1f46188: e3530000 cmp r3, #0 + 1f4618c: 0a00010d beq 1f465c8 <_dtoa_r+0x1078> + 1f46190: e59f207c ldr r2, [pc, #124] ; 1f46214 <_dtoa_r+0xcc4> + 1f46194: e203100f and r1, r3, #15 + 1f46198: e0822181 add r2, r2, r1, lsl #3 + 1f4619c: ed927b00 vldr d7, [r2] + 1f461a0: ed9d6b08 vldr d6, [sp, #32] + 1f461a4: e1b03243 asrs r3, r3, #4 + 1f461a8: e3a01002 mov r1, #2 + 1f461ac: ee265b07 vmul.f64 d5, d6, d7 + 1f461b0: 0affff25 beq 1f45e4c <_dtoa_r+0x8fc> + 1f461b4: e59f2054 ldr r2, [pc, #84] ; 1f46210 <_dtoa_r+0xcc0> + 1f461b8: e3130001 tst r3, #1 + 1f461bc: 1d927b00 vldrne d7, [r2] + 1f461c0: 12811001 addne r1, r1, #1 + 1f461c4: 1e255b07 vmulne.f64 d5, d5, d7 + 1f461c8: e1b030c3 asrs r3, r3, #1 + 1f461cc: e2822008 add r2, r2, #8 + 1f461d0: 1afffff8 bne 1f461b8 <_dtoa_r+0xc68> + 1f461d4: eaffff1c b 1f45e4c <_dtoa_r+0x8fc> + 1f461d8: e3a03001 mov r3, #1 + 1f461dc: e58d3028 str r3, [sp, #40] ; 0x28 + 1f461e0: eafffede b 1f45d60 <_dtoa_r+0x810> + 1f461e4: e1a00000 nop ; (mov r0, r0) + 1f461e8: 00000000 .word 0x00000000 + 1f461ec: 3ff00000 .word 0x3ff00000 + 1f461f0: 00000000 .word 0x00000000 + 1f461f4: 401c0000 .word 0x401c0000 + 1f461f8: 00000000 .word 0x00000000 + 1f461fc: 3fe00000 .word 0x3fe00000 + 1f46200: 00000000 .word 0x00000000 + 1f46204: 40240000 .word 0x40240000 + 1f46208: 00000000 .word 0x00000000 + 1f4620c: 40140000 .word 0x40140000 + 1f46210: 01f63150 .word 0x01f63150 + 1f46214: 01f63088 .word 0x01f63088 + 1f46218: eefd7bc5 vcvt.s32.f64 s15, d5 + 1f4621c: e51f2010 ldr r2, [pc, #-16] ; 1f46214 <_dtoa_r+0xcc4> + 1f46220: e2431001 sub r1, r3, #1 + 1f46224: e0822181 add r2, r2, r1, lsl #3 + 1f46228: ed923b00 vldr d3, [r2] + 1f4622c: ee172a90 vmov r2, s15 + 1f46230: eeb86be7 vcvt.f64.s32 d6, s15 + 1f46234: ec4bab17 vmov d7, sl, fp + 1f46238: e59d001c ldr r0, [sp, #28] + 1f4623c: e2822030 add r2, r2, #48 ; 0x30 + 1f46240: e3530001 cmp r3, #1 + 1f46244: ee233b07 vmul.f64 d3, d3, d7 + 1f46248: e5c02000 strb r2, [r0] + 1f4624c: ee357b46 vsub.f64 d7, d5, d6 + 1f46250: e2805001 add r5, r0, #1 + 1f46254: 0a00000d beq 1f46290 <_dtoa_r+0xd40> + 1f46258: e1a00005 mov r0, r5 + 1f4625c: ed9f4bf9 vldr d4, [pc, #996] ; 1f46648 <_dtoa_r+0x10f8> + 1f46260: e59d201c ldr r2, [sp, #28] + 1f46264: e0823003 add r3, r2, r3 + 1f46268: ee277b04 vmul.f64 d7, d7, d4 + 1f4626c: eefd5bc7 vcvt.s32.f64 s11, d7 + 1f46270: ee152a90 vmov r2, s11 + 1f46274: eeb86be5 vcvt.f64.s32 d6, s11 + 1f46278: e2822030 add r2, r2, #48 ; 0x30 + 1f4627c: e4c02001 strb r2, [r0], #1 + 1f46280: e1530000 cmp r3, r0 + 1f46284: ee377b46 vsub.f64 d7, d7, d6 + 1f46288: 1afffff6 bne 1f46268 <_dtoa_r+0xd18> + 1f4628c: e0855001 add r5, r5, r1 + 1f46290: ed9f6bee vldr d6, [pc, #952] ; 1f46650 <_dtoa_r+0x1100> + 1f46294: ee335b06 vadd.f64 d5, d3, d6 + 1f46298: eeb45bc7 vcmpe.f64 d5, d7 + 1f4629c: eef1fa10 vmrs APSR_nzcv, fpscr + 1f462a0: 5a0000cb bpl 1f465d4 <_dtoa_r+0x1084> + 1f462a4: e1a0700c mov r7, ip + 1f462a8: e5552001 ldrb r2, [r5, #-1] + 1f462ac: eafffda3 b 1f45940 <_dtoa_r+0x3f0> + 1f462b0: e3a03000 mov r3, #0 + 1f462b4: e58d3014 str r3, [sp, #20] + 1f462b8: e58d3020 str r3, [sp, #32] + 1f462bc: eafffe4a b 1f45bec <_dtoa_r+0x69c> + 1f462c0: e3a03000 mov r3, #0 + 1f462c4: e58d3038 str r3, [sp, #56] ; 0x38 + 1f462c8: e59d2014 ldr r2, [sp, #20] + 1f462cc: e5923010 ldr r3, [r2, #16] + 1f462d0: e0823103 add r3, r2, r3, lsl #2 + 1f462d4: e5930010 ldr r0, [r3, #16] + 1f462d8: eb000591 bl 1f47924 <__hi0bits> + 1f462dc: e2600020 rsb r0, r0, #32 + 1f462e0: eafffe0b b 1f45b14 <_dtoa_r+0x5c4> + 1f462e4: e59d1014 ldr r1, [sp, #20] + 1f462e8: e1a00008 mov r0, r8 + 1f462ec: eb0006cb bl 1f47e20 <__mcmp> + 1f462f0: e3500000 cmp r0, #0 + 1f462f4: aafffe26 bge 1f45b94 <_dtoa_r+0x644> + 1f462f8: e1a01008 mov r1, r8 + 1f462fc: e3a03000 mov r3, #0 + 1f46300: e3a0200a mov r2, #10 + 1f46304: e1a00004 mov r0, r4 + 1f46308: eb000514 bl 1f47760 <__multadd> + 1f4630c: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f46310: e3530000 cmp r3, #0 + 1f46314: e1a08000 mov r8, r0 + 1f46318: e2477001 sub r7, r7, #1 + 1f4631c: 1a00000c bne 1f46354 <_dtoa_r+0xe04> + 1f46320: e59d3004 ldr r3, [sp, #4] + 1f46324: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f46328: e3530002 cmp r3, #2 + 1f4632c: c3a03001 movgt r3, #1 + 1f46330: d3a03000 movle r3, #0 + 1f46334: e3520000 cmp r2, #0 + 1f46338: c3a03000 movgt r3, #0 + 1f4633c: e3530000 cmp r3, #0 + 1f46340: 058d2008 streq r2, [sp, #8] + 1f46344: 0affff3e beq 1f46044 <_dtoa_r+0xaf4> + 1f46348: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f4634c: e58d3008 str r3, [sp, #8] + 1f46350: eafffe17 b 1f45bb4 <_dtoa_r+0x664> + 1f46354: e59d1020 ldr r1, [sp, #32] + 1f46358: e3a03000 mov r3, #0 + 1f4635c: e3a0200a mov r2, #10 + 1f46360: e1a00004 mov r0, r4 + 1f46364: eb0004fd bl 1f47760 <__multadd> + 1f46368: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f4636c: e59d1004 ldr r1, [sp, #4] + 1f46370: e3520000 cmp r2, #0 + 1f46374: e1a03002 mov r3, r2 + 1f46378: d3a03001 movle r3, #1 + 1f4637c: c3a03000 movgt r3, #0 + 1f46380: e3510002 cmp r1, #2 + 1f46384: d3a03000 movle r3, #0 + 1f46388: e3530000 cmp r3, #0 + 1f4638c: 01a03002 moveq r3, r2 + 1f46390: e58d0020 str r0, [sp, #32] + 1f46394: 058d3008 streq r3, [sp, #8] + 1f46398: 1affffea bne 1f46348 <_dtoa_r+0xdf8> + 1f4639c: e59d301c ldr r3, [sp, #28] + 1f463a0: e3530000 cmp r3, #0 + 1f463a4: da000004 ble 1f463bc <_dtoa_r+0xe6c> + 1f463a8: e1a02003 mov r2, r3 + 1f463ac: e59d1020 ldr r1, [sp, #32] + 1f463b0: e1a00004 mov r0, r4 + 1f463b4: eb00065c bl 1f47d2c <__lshift> + 1f463b8: e58d0020 str r0, [sp, #32] + 1f463bc: e59d3038 ldr r3, [sp, #56] ; 0x38 + 1f463c0: e3530000 cmp r3, #0 + 1f463c4: e59d9020 ldr r9, [sp, #32] + 1f463c8: 1a0000d0 bne 1f46710 <_dtoa_r+0x11c0> + 1f463cc: e59d3008 ldr r3, [sp, #8] + 1f463d0: e2433001 sub r3, r3, #1 + 1f463d4: e0853003 add r3, r5, r3 + 1f463d8: e58d301c str r3, [sp, #28] + 1f463dc: e20a3001 and r3, sl, #1 + 1f463e0: e1a06005 mov r6, r5 + 1f463e4: e58d5030 str r5, [sp, #48] ; 0x30 + 1f463e8: e58d3018 str r3, [sp, #24] + 1f463ec: e58d702c str r7, [sp, #44] ; 0x2c + 1f463f0: e59d5020 ldr r5, [sp, #32] + 1f463f4: ea000008 b 1f4641c <_dtoa_r+0xecc> + 1f463f8: eb0004d8 bl 1f47760 <__multadd> + 1f463fc: e1a01009 mov r1, r9 + 1f46400: e1a05000 mov r5, r0 + 1f46404: e3a03000 mov r3, #0 + 1f46408: e3a0200a mov r2, #10 + 1f4640c: e1a00004 mov r0, r4 + 1f46410: eb0004d2 bl 1f47760 <__multadd> + 1f46414: e1a09000 mov r9, r0 + 1f46418: e1a06007 mov r6, r7 + 1f4641c: e59db014 ldr fp, [sp, #20] + 1f46420: e1a00008 mov r0, r8 + 1f46424: e1a0100b mov r1, fp + 1f46428: ebfffbd2 bl 1f45378 + 1f4642c: e1a01005 mov r1, r5 + 1f46430: e1a07000 mov r7, r0 + 1f46434: e58d0028 str r0, [sp, #40] ; 0x28 + 1f46438: e1a00008 mov r0, r8 + 1f4643c: eb000677 bl 1f47e20 <__mcmp> + 1f46440: e1a02009 mov r2, r9 + 1f46444: e1a0100b mov r1, fp + 1f46448: e1a0a000 mov sl, r0 + 1f4644c: e1a00004 mov r0, r4 + 1f46450: eb00068b bl 1f47e84 <__mdiff> + 1f46454: e590200c ldr r2, [r0, #12] + 1f46458: e3520000 cmp r2, #0 + 1f4645c: e1a03000 mov r3, r0 + 1f46460: e287b030 add fp, r7, #48 ; 0x30 + 1f46464: 1a00002e bne 1f46524 <_dtoa_r+0xfd4> + 1f46468: e1a01000 mov r1, r0 + 1f4646c: e58d0008 str r0, [sp, #8] + 1f46470: e1a00008 mov r0, r8 + 1f46474: eb000669 bl 1f47e20 <__mcmp> + 1f46478: e1a07000 mov r7, r0 + 1f4647c: e59d3008 ldr r3, [sp, #8] + 1f46480: e1a01003 mov r1, r3 + 1f46484: e1a00004 mov r0, r4 + 1f46488: eb0004ad bl 1f47744 <_Bfree> + 1f4648c: e59d3004 ldr r3, [sp, #4] + 1f46490: e1973003 orrs r3, r7, r3 + 1f46494: 1a000002 bne 1f464a4 <_dtoa_r+0xf54> + 1f46498: e59d3018 ldr r3, [sp, #24] + 1f4649c: e3530000 cmp r3, #0 + 1f464a0: 0a0000cd beq 1f467dc <_dtoa_r+0x128c> + 1f464a4: e35a0000 cmp sl, #0 + 1f464a8: ba000072 blt 1f46678 <_dtoa_r+0x1128> + 1f464ac: e59d3004 ldr r3, [sp, #4] + 1f464b0: e19a3003 orrs r3, sl, r3 + 1f464b4: 1a000002 bne 1f464c4 <_dtoa_r+0xf74> + 1f464b8: e59d3018 ldr r3, [sp, #24] + 1f464bc: e3530000 cmp r3, #0 + 1f464c0: 0a00006c beq 1f46678 <_dtoa_r+0x1128> + 1f464c4: e3570000 cmp r7, #0 + 1f464c8: ca0000ad bgt 1f46784 <_dtoa_r+0x1234> + 1f464cc: e59d301c ldr r3, [sp, #28] + 1f464d0: e2867001 add r7, r6, #1 + 1f464d4: e1530006 cmp r3, r6 + 1f464d8: e5c6b000 strb fp, [r6] + 1f464dc: e1a06007 mov r6, r7 + 1f464e0: 0a0000b2 beq 1f467b0 <_dtoa_r+0x1260> + 1f464e4: e1a01008 mov r1, r8 + 1f464e8: e3a03000 mov r3, #0 + 1f464ec: e3a0200a mov r2, #10 + 1f464f0: e1a00004 mov r0, r4 + 1f464f4: eb000499 bl 1f47760 <__multadd> + 1f464f8: e1550009 cmp r5, r9 + 1f464fc: e1a08000 mov r8, r0 + 1f46500: e1a01005 mov r1, r5 + 1f46504: e3a03000 mov r3, #0 + 1f46508: e3a0200a mov r2, #10 + 1f4650c: e1a00004 mov r0, r4 + 1f46510: 1affffb8 bne 1f463f8 <_dtoa_r+0xea8> + 1f46514: eb000491 bl 1f47760 <__multadd> + 1f46518: e1a05000 mov r5, r0 + 1f4651c: e1a09000 mov r9, r0 + 1f46520: eaffffbc b 1f46418 <_dtoa_r+0xec8> + 1f46524: e3a07001 mov r7, #1 + 1f46528: eaffffd4 b 1f46480 <_dtoa_r+0xf30> + 1f4652c: e59d001c ldr r0, [sp, #28] + 1f46530: eafffc36 b 1f45610 <_dtoa_r+0xc0> + 1f46534: e3a03001 mov r3, #1 + 1f46538: e1a06003 mov r6, r3 + 1f4653c: e58d3034 str r3, [sp, #52] ; 0x34 + 1f46540: e58d3008 str r3, [sp, #8] + 1f46544: e3a01000 mov r1, #0 + 1f46548: e0055003 and r5, r5, r3 + 1f4654c: e5841044 str r1, [r4, #68] ; 0x44 + 1f46550: eafffe1a b 1f45dc0 <_dtoa_r+0x870> + 1f46554: e353000e cmp r3, #14 + 1f46558: 83a03000 movhi r3, #0 + 1f4655c: 93a03001 movls r3, #1 + 1f46560: eafffff7 b 1f46544 <_dtoa_r+0xff4> + 1f46564: e58d501c str r5, [sp, #28] + 1f46568: e1a05003 mov r5, r3 + 1f4656c: eafffdac b 1f45c24 <_dtoa_r+0x6d4> + 1f46570: e59d3008 ldr r3, [sp, #8] + 1f46574: e3530000 cmp r3, #0 + 1f46578: 0afffe95 beq 1f45fd4 <_dtoa_r+0xa84> + 1f4657c: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f46580: e3530000 cmp r3, #0 + 1f46584: dafffef8 ble 1f4616c <_dtoa_r+0xc1c> + 1f46588: e2811001 add r1, r1, #1 + 1f4658c: ed9f6b2d vldr d6, [pc, #180] ; 1f46648 <_dtoa_r+0x10f8> + 1f46590: ee071a90 vmov s15, r1 + 1f46594: ee255b06 vmul.f64 d5, d5, d6 + 1f46598: eeb87be7 vcvt.f64.s32 d7, s15 + 1f4659c: ed9f6b2d vldr d6, [pc, #180] ; 1f46658 <_dtoa_r+0x1108> + 1f465a0: ee076b05 vmla.f64 d6, d7, d5 + 1f465a4: ec5bab16 vmov sl, fp, d6 + 1f465a8: e247c001 sub ip, r7, #1 + 1f465ac: e24bb50d sub fp, fp, #54525952 ; 0x3400000 + 1f465b0: eafffe37 b 1f45e94 <_dtoa_r+0x944> + 1f465b4: e3a02030 mov r2, #48 ; 0x30 + 1f465b8: e5c32000 strb r2, [r3] + 1f465bc: e2877001 add r7, r7, #1 + 1f465c0: e5552001 ldrb r2, [r5, #-1] + 1f465c4: eafffce6 b 1f45964 <_dtoa_r+0x414> + 1f465c8: ed9d5b08 vldr d5, [sp, #32] + 1f465cc: e3a01002 mov r1, #2 + 1f465d0: eafffe1d b 1f45e4c <_dtoa_r+0x8fc> + 1f465d4: ee366b43 vsub.f64 d6, d6, d3 + 1f465d8: eeb46bc7 vcmpe.f64 d6, d7 + 1f465dc: eef1fa10 vmrs APSR_nzcv, fpscr + 1f465e0: ca000001 bgt 1f465ec <_dtoa_r+0x109c> + 1f465e4: eafffee0 b 1f4616c <_dtoa_r+0xc1c> + 1f465e8: e1a05003 mov r5, r3 + 1f465ec: e5553001 ldrb r3, [r5, #-1] + 1f465f0: e3530030 cmp r3, #48 ; 0x30 + 1f465f4: e2453001 sub r3, r5, #1 + 1f465f8: 0afffffa beq 1f465e8 <_dtoa_r+0x1098> + 1f465fc: eafffe57 b 1f45f60 <_dtoa_r+0xa10> + 1f46600: e3a03031 mov r3, #49 ; 0x31 + 1f46604: e2877001 add r7, r7, #1 + 1f46608: e5c53000 strb r3, [r5] + 1f4660c: eafffeb8 b 1f460f4 <_dtoa_r+0xba4> + 1f46610: e59d2038 ldr r2, [sp, #56] ; 0x38 + 1f46614: e3520000 cmp r2, #0 + 1f46618: 159d2014 ldrne r2, [sp, #20] + 1f4661c: 059d2014 ldreq r2, [sp, #20] + 1f46620: 158d2038 strne r2, [sp, #56] ; 0x38 + 1f46624: 059d3040 ldreq r3, [sp, #64] ; 0x40 + 1f46628: 058d2038 streq r2, [sp, #56] ; 0x38 + 1f4662c: e59d2018 ldr r2, [sp, #24] + 1f46630: 12833e43 addne r3, r3, #1072 ; 0x430 + 1f46634: 12833003 addne r3, r3, #3 + 1f46638: 02633036 rsbeq r3, r3, #54 ; 0x36 + 1f4663c: e58d201c str r2, [sp, #28] + 1f46640: eafffdbb b 1f45d34 <_dtoa_r+0x7e4> + 1f46644: e1a00000 nop ; (mov r0, r0) + 1f46648: 00000000 .word 0x00000000 + 1f4664c: 40240000 .word 0x40240000 + 1f46650: 00000000 .word 0x00000000 + 1f46654: 3fe00000 .word 0x3fe00000 + 1f46658: 00000000 .word 0x00000000 + 1f4665c: 401c0000 .word 0x401c0000 + 1f46660: e59d3008 ldr r3, [sp, #8] + 1f46664: e58d3014 str r3, [sp, #20] + 1f46668: e58d3020 str r3, [sp, #32] + 1f4666c: eafffe6c b 1f46024 <_dtoa_r+0xad4> + 1f46670: e1a0700c mov r7, ip + 1f46674: eafffcb1 b 1f45940 <_dtoa_r+0x3f0> + 1f46678: e1a02007 mov r2, r7 + 1f4667c: e3520000 cmp r2, #0 + 1f46680: e58d5020 str r5, [sp, #32] + 1f46684: e59d702c ldr r7, [sp, #44] ; 0x2c + 1f46688: e59d5030 ldr r5, [sp, #48] ; 0x30 + 1f4668c: da00000c ble 1f466c4 <_dtoa_r+0x1174> + 1f46690: e1a01008 mov r1, r8 + 1f46694: e3a02001 mov r2, #1 + 1f46698: e1a00004 mov r0, r4 + 1f4669c: eb0005a2 bl 1f47d2c <__lshift> + 1f466a0: e59d1014 ldr r1, [sp, #20] + 1f466a4: e1a08000 mov r8, r0 + 1f466a8: eb0005dc bl 1f47e20 <__mcmp> + 1f466ac: e3500000 cmp r0, #0 + 1f466b0: da000051 ble 1f467fc <_dtoa_r+0x12ac> + 1f466b4: e35b0039 cmp fp, #57 ; 0x39 + 1f466b8: 0a000041 beq 1f467c4 <_dtoa_r+0x1274> + 1f466bc: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f466c0: e283b031 add fp, r3, #49 ; 0x31 + 1f466c4: e59da020 ldr sl, [sp, #32] + 1f466c8: e5c6b000 strb fp, [r6] + 1f466cc: e58d9020 str r9, [sp, #32] + 1f466d0: e2866001 add r6, r6, #1 + 1f466d4: eafffe86 b 1f460f4 <_dtoa_r+0xba4> + 1f466d8: 1a000003 bne 1f466ec <_dtoa_r+0x119c> + 1f466dc: e31b0001 tst fp, #1 + 1f466e0: 0a000001 beq 1f466ec <_dtoa_r+0x119c> + 1f466e4: eafffe77 b 1f460c8 <_dtoa_r+0xb78> + 1f466e8: e1a06003 mov r6, r3 + 1f466ec: e5563001 ldrb r3, [r6, #-1] + 1f466f0: e3530030 cmp r3, #48 ; 0x30 + 1f466f4: e2463001 sub r3, r6, #1 + 1f466f8: 0afffffa beq 1f466e8 <_dtoa_r+0x1198> + 1f466fc: eafffe7c b 1f460f4 <_dtoa_r+0xba4> + 1f46700: e3a03000 mov r3, #0 + 1f46704: e58d3014 str r3, [sp, #20] + 1f46708: e58d3020 str r3, [sp, #32] + 1f4670c: eafffe44 b 1f46024 <_dtoa_r+0xad4> + 1f46710: e5991004 ldr r1, [r9, #4] + 1f46714: e1a00004 mov r0, r4 + 1f46718: eb0003e5 bl 1f476b4 <_Balloc> + 1f4671c: e1a06000 mov r6, r0 + 1f46720: e5992010 ldr r2, [r9, #16] + 1f46724: e2822002 add r2, r2, #2 + 1f46728: e289100c add r1, r9, #12 + 1f4672c: e1a02102 lsl r2, r2, #2 + 1f46730: e280000c add r0, r0, #12 + 1f46734: ebffe1b1 bl 1f3ee00 + 1f46738: e1a01006 mov r1, r6 + 1f4673c: e3a02001 mov r2, #1 + 1f46740: e1a00004 mov r0, r4 + 1f46744: eb000578 bl 1f47d2c <__lshift> + 1f46748: e1a09000 mov r9, r0 + 1f4674c: eaffff1e b 1f463cc <_dtoa_r+0xe7c> + 1f46750: e58d501c str r5, [sp, #28] + 1f46754: e1a05006 mov r5, r6 + 1f46758: eafffd31 b 1f45c24 <_dtoa_r+0x6d4> + 1f4675c: eeb45b47 vcmp.f64 d5, d7 + 1f46760: eef1fa10 vmrs APSR_nzcv, fpscr + 1f46764: 1affff7e bne 1f46564 <_dtoa_r+0x1014> + 1f46768: ee162a10 vmov r2, s12 + 1f4676c: e3120001 tst r2, #1 + 1f46770: e58d501c str r5, [sp, #28] + 1f46774: 0affff7b beq 1f46568 <_dtoa_r+0x1018> + 1f46778: e5532001 ldrb r2, [r3, #-1] + 1f4677c: e1a05003 mov r5, r3 + 1f46780: eafffc6e b 1f45940 <_dtoa_r+0x3f0> + 1f46784: e35b0039 cmp fp, #57 ; 0x39 + 1f46788: e58d5020 str r5, [sp, #32] + 1f4678c: e59d702c ldr r7, [sp, #44] ; 0x2c + 1f46790: e59d5030 ldr r5, [sp, #48] ; 0x30 + 1f46794: 0a00000a beq 1f467c4 <_dtoa_r+0x1274> + 1f46798: e28b3001 add r3, fp, #1 + 1f4679c: e5c63000 strb r3, [r6] + 1f467a0: e59da020 ldr sl, [sp, #32] + 1f467a4: e2866001 add r6, r6, #1 + 1f467a8: e58d9020 str r9, [sp, #32] + 1f467ac: eafffe50 b 1f460f4 <_dtoa_r+0xba4> + 1f467b0: e1a0a005 mov sl, r5 + 1f467b4: e59d702c ldr r7, [sp, #44] ; 0x2c + 1f467b8: e59d5030 ldr r5, [sp, #48] ; 0x30 + 1f467bc: e58d9020 str r9, [sp, #32] + 1f467c0: eafffe37 b 1f460a4 <_dtoa_r+0xb54> + 1f467c4: e3a02039 mov r2, #57 ; 0x39 + 1f467c8: e59da020 ldr sl, [sp, #32] + 1f467cc: e5c62000 strb r2, [r6] + 1f467d0: e58d9020 str r9, [sp, #32] + 1f467d4: e2866001 add r6, r6, #1 + 1f467d8: eafffe3b b 1f460cc <_dtoa_r+0xb7c> + 1f467dc: e35b0039 cmp fp, #57 ; 0x39 + 1f467e0: e58d5020 str r5, [sp, #32] + 1f467e4: e59d702c ldr r7, [sp, #44] ; 0x2c + 1f467e8: e59d5030 ldr r5, [sp, #48] ; 0x30 + 1f467ec: 0afffff4 beq 1f467c4 <_dtoa_r+0x1274> + 1f467f0: e35a0000 cmp sl, #0 + 1f467f4: caffffb0 bgt 1f466bc <_dtoa_r+0x116c> + 1f467f8: eaffffb1 b 1f466c4 <_dtoa_r+0x1174> + 1f467fc: 1affffb0 bne 1f466c4 <_dtoa_r+0x1174> + 1f46800: e31b0001 tst fp, #1 + 1f46804: 0affffae beq 1f466c4 <_dtoa_r+0x1174> + 1f46808: eaffffa9 b 1f466b4 <_dtoa_r+0x1164> + 1f4680c: 1260003c rsbne r0, r0, #60 ; 0x3c + 1f46810: 0afffccd beq 1f45b4c <_dtoa_r+0x5fc> + 1f46814: eafffcc5 b 1f45b30 <_dtoa_r+0x5e0> + 1f46818: e35a0000 cmp sl, #0 + 1f4681c: 0afffca8 beq 1f45ac4 <_dtoa_r+0x574> + 1f46820: eafffe47 b 1f46144 <_dtoa_r+0xbf4> + 1f46824: e59d501c ldr r5, [sp, #28] + 1f46828: eafffc0d b 1f45864 <_dtoa_r+0x314> + 1f4682c: e3e03000 mvn r3, #0 + 1f46830: e58d3008 str r3, [sp, #8] + 1f46834: eafffc11 b 1f45880 <_dtoa_r+0x330> + +01f46838 <__sflush_r>: + 1f46838: e1d130fc ldrsh r3, [r1, #12] + 1f4683c: e1a02803 lsl r2, r3, #16 + 1f46840: e3120702 tst r2, #524288 ; 0x80000 + 1f46844: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f46848: e1a05001 mov r5, r1 + 1f4684c: e1a07000 mov r7, r0 + 1f46850: 1a000034 bne 1f46928 <__sflush_r+0xf0> + 1f46854: e5912004 ldr r2, [r1, #4] + 1f46858: e3833b02 orr r3, r3, #2048 ; 0x800 + 1f4685c: e3520000 cmp r2, #0 + 1f46860: e1c130bc strh r3, [r1, #12] + 1f46864: da000050 ble 1f469ac <__sflush_r+0x174> + 1f46868: e5954028 ldr r4, [r5, #40] ; 0x28 + 1f4686c: e3540000 cmp r4, #0 + 1f46870: 0a000050 beq 1f469b8 <__sflush_r+0x180> + 1f46874: e3a02000 mov r2, #0 + 1f46878: e1a03803 lsl r3, r3, #16 + 1f4687c: e2030201 and r0, r3, #268435456 ; 0x10000000 + 1f46880: e1b08820 lsrs r8, r0, #16 + 1f46884: e5976000 ldr r6, [r7] + 1f46888: e1a03823 lsr r3, r3, #16 + 1f4688c: e5872000 str r2, [r7] + 1f46890: 0a00005f beq 1f46a14 <__sflush_r+0x1dc> + 1f46894: e5952050 ldr r2, [r5, #80] ; 0x50 + 1f46898: e3130004 tst r3, #4 + 1f4689c: 0a000005 beq 1f468b8 <__sflush_r+0x80> + 1f468a0: e5951030 ldr r1, [r5, #48] ; 0x30 + 1f468a4: e5953004 ldr r3, [r5, #4] + 1f468a8: e3510000 cmp r1, #0 + 1f468ac: e0632002 rsb r2, r3, r2 + 1f468b0: 1595303c ldrne r3, [r5, #60] ; 0x3c + 1f468b4: 10632002 rsbne r2, r3, r2 + 1f468b8: e3a03000 mov r3, #0 + 1f468bc: e595101c ldr r1, [r5, #28] + 1f468c0: e1a00007 mov r0, r7 + 1f468c4: e1a0e00f mov lr, pc + 1f468c8: e12fff14 bx r4 + 1f468cc: e3700001 cmn r0, #1 + 1f468d0: 0a00003b beq 1f469c4 <__sflush_r+0x18c> + 1f468d4: e3a01000 mov r1, #0 + 1f468d8: e1d530fc ldrsh r3, [r5, #12] + 1f468dc: e5952010 ldr r2, [r5, #16] + 1f468e0: e3c33b02 bic r3, r3, #2048 ; 0x800 + 1f468e4: e3130a01 tst r3, #4096 ; 0x1000 + 1f468e8: e1c530bc strh r3, [r5, #12] + 1f468ec: e5851004 str r1, [r5, #4] + 1f468f0: e5852000 str r2, [r5] + 1f468f4: 1a000044 bne 1f46a0c <__sflush_r+0x1d4> + 1f468f8: e5951030 ldr r1, [r5, #48] ; 0x30 + 1f468fc: e3510000 cmp r1, #0 + 1f46900: e5876000 str r6, [r7] + 1f46904: 0a00002b beq 1f469b8 <__sflush_r+0x180> + 1f46908: e2853040 add r3, r5, #64 ; 0x40 + 1f4690c: e1510003 cmp r1, r3 + 1f46910: 11a00007 movne r0, r7 + 1f46914: 1b00018e blne 1f46f54 <_free_r> + 1f46918: e3a00000 mov r0, #0 + 1f4691c: e5850030 str r0, [r5, #48] ; 0x30 + 1f46920: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f46924: e12fff1e bx lr + 1f46928: e5916010 ldr r6, [r1, #16] + 1f4692c: e3560000 cmp r6, #0 + 1f46930: 0a000020 beq 1f469b8 <__sflush_r+0x180> + 1f46934: e1a02822 lsr r2, r2, #16 + 1f46938: e3120003 tst r2, #3 + 1f4693c: 13a03000 movne r3, #0 + 1f46940: e5914000 ldr r4, [r1] + 1f46944: 05913014 ldreq r3, [r1, #20] + 1f46948: e0664004 rsb r4, r6, r4 + 1f4694c: e3540000 cmp r4, #0 + 1f46950: e5816000 str r6, [r1] + 1f46954: e5813008 str r3, [r1, #8] + 1f46958: ca000003 bgt 1f4696c <__sflush_r+0x134> + 1f4695c: ea000015 b 1f469b8 <__sflush_r+0x180> + 1f46960: e3540000 cmp r4, #0 + 1f46964: e0866000 add r6, r6, r0 + 1f46968: da000012 ble 1f469b8 <__sflush_r+0x180> + 1f4696c: e1a03004 mov r3, r4 + 1f46970: e1a02006 mov r2, r6 + 1f46974: e595101c ldr r1, [r5, #28] + 1f46978: e1a00007 mov r0, r7 + 1f4697c: e595c024 ldr ip, [r5, #36] ; 0x24 + 1f46980: e1a0e00f mov lr, pc + 1f46984: e12fff1c bx ip + 1f46988: e3500000 cmp r0, #0 + 1f4698c: e0604004 rsb r4, r0, r4 + 1f46990: cafffff2 bgt 1f46960 <__sflush_r+0x128> + 1f46994: e3e00000 mvn r0, #0 + 1f46998: e1d530bc ldrh r3, [r5, #12] + 1f4699c: e3833040 orr r3, r3, #64 ; 0x40 + 1f469a0: e1c530bc strh r3, [r5, #12] + 1f469a4: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f469a8: e12fff1e bx lr + 1f469ac: e591203c ldr r2, [r1, #60] ; 0x3c + 1f469b0: e3520000 cmp r2, #0 + 1f469b4: caffffab bgt 1f46868 <__sflush_r+0x30> + 1f469b8: e3a00000 mov r0, #0 + 1f469bc: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f469c0: e12fff1e bx lr + 1f469c4: e5971000 ldr r1, [r7] + 1f469c8: e351001d cmp r1, #29 + 1f469cc: 8afffff0 bhi 1f46994 <__sflush_r+0x15c> + 1f469d0: e59f309c ldr r3, [pc, #156] ; 1f46a74 <__sflush_r+0x23c> + 1f469d4: e1a03133 lsr r3, r3, r1 + 1f469d8: e2033001 and r3, r3, #1 + 1f469dc: e2333001 eors r3, r3, #1 + 1f469e0: 1affffeb bne 1f46994 <__sflush_r+0x15c> + 1f469e4: e1d520fc ldrsh r2, [r5, #12] + 1f469e8: e595c010 ldr ip, [r5, #16] + 1f469ec: e3c22b02 bic r2, r2, #2048 ; 0x800 + 1f469f0: e3120a01 tst r2, #4096 ; 0x1000 + 1f469f4: e5853004 str r3, [r5, #4] + 1f469f8: e1c520bc strh r2, [r5, #12] + 1f469fc: e585c000 str ip, [r5] + 1f46a00: 0affffbc beq 1f468f8 <__sflush_r+0xc0> + 1f46a04: e3510000 cmp r1, #0 + 1f46a08: 1affffba bne 1f468f8 <__sflush_r+0xc0> + 1f46a0c: e5850050 str r0, [r5, #80] ; 0x50 + 1f46a10: eaffffb8 b 1f468f8 <__sflush_r+0xc0> + 1f46a14: e1a02008 mov r2, r8 + 1f46a18: e3a03001 mov r3, #1 + 1f46a1c: e595101c ldr r1, [r5, #28] + 1f46a20: e1a00007 mov r0, r7 + 1f46a24: e1a0e00f mov lr, pc + 1f46a28: e12fff14 bx r4 + 1f46a2c: e3700001 cmn r0, #1 + 1f46a30: e1a02000 mov r2, r0 + 1f46a34: 0a000002 beq 1f46a44 <__sflush_r+0x20c> + 1f46a38: e1d530bc ldrh r3, [r5, #12] + 1f46a3c: e5954028 ldr r4, [r5, #40] ; 0x28 + 1f46a40: eaffff94 b 1f46898 <__sflush_r+0x60> + 1f46a44: e5973000 ldr r3, [r7] + 1f46a48: e3530000 cmp r3, #0 + 1f46a4c: 0afffff9 beq 1f46a38 <__sflush_r+0x200> + 1f46a50: e3530016 cmp r3, #22 + 1f46a54: 1353001d cmpne r3, #29 + 1f46a58: 11d530bc ldrhne r3, [r5, #12] + 1f46a5c: 13833040 orrne r3, r3, #64 ; 0x40 + 1f46a60: 05876000 streq r6, [r7] + 1f46a64: 01a00008 moveq r0, r8 + 1f46a68: 11a00002 movne r0, r2 + 1f46a6c: 11c530bc strhne r3, [r5, #12] + 1f46a70: eaffffcb b 1f469a4 <__sflush_r+0x16c> + 1f46a74: 20400001 .word 0x20400001 + +01f46a78 <_fflush_r>: + 1f46a78: e92d4010 push {r4, lr} + 1f46a7c: e2504000 subs r4, r0, #0 + 1f46a80: e24dd008 sub sp, sp, #8 + 1f46a84: 0a000002 beq 1f46a94 <_fflush_r+0x1c> + 1f46a88: e5943038 ldr r3, [r4, #56] ; 0x38 + 1f46a8c: e3530000 cmp r3, #0 + 1f46a90: 0a000009 beq 1f46abc <_fflush_r+0x44> + 1f46a94: e1d100fc ldrsh r0, [r1, #12] + 1f46a98: e3500000 cmp r0, #0 + 1f46a9c: 1a000002 bne 1f46aac <_fflush_r+0x34> + 1f46aa0: e28dd008 add sp, sp, #8 + 1f46aa4: e8bd4010 pop {r4, lr} + 1f46aa8: e12fff1e bx lr + 1f46aac: e1a00004 mov r0, r4 + 1f46ab0: e28dd008 add sp, sp, #8 + 1f46ab4: e8bd4010 pop {r4, lr} + 1f46ab8: eaffff5e b 1f46838 <__sflush_r> + 1f46abc: e58d1004 str r1, [sp, #4] + 1f46ac0: eb0000c9 bl 1f46dec <__sinit> + 1f46ac4: e59d1004 ldr r1, [sp, #4] + 1f46ac8: eafffff1 b 1f46a94 <_fflush_r+0x1c> + +01f46acc : + 1f46acc: e2501000 subs r1, r0, #0 + 1f46ad0: 159f3020 ldrne r3, [pc, #32] ; 1f46af8 + 1f46ad4: 15930000 ldrne r0, [r3] + 1f46ad8: 1affffe6 bne 1f46a78 <_fflush_r> + 1f46adc: e92d4010 push {r4, lr} + 1f46ae0: e59f3014 ldr r3, [pc, #20] ; 1f46afc + 1f46ae4: e59f1014 ldr r1, [pc, #20] ; 1f46b00 + 1f46ae8: e5930000 ldr r0, [r3] + 1f46aec: eb0001f4 bl 1f472c4 <_fwalk_reent> + 1f46af0: e8bd4010 pop {r4, lr} + 1f46af4: e12fff1e bx lr + 1f46af8: 01f65c08 .word 0x01f65c08 + 1f46afc: 01f63070 .word 0x01f63070 + 1f46b00: 01f46a78 .word 0x01f46a78 + +01f46b04 <__fp_unlock>: + 1f46b04: e3a00000 mov r0, #0 + 1f46b08: e12fff1e bx lr + +01f46b0c <_cleanup_r>: + 1f46b0c: e92d4010 push {r4, lr} + 1f46b10: e59f1008 ldr r1, [pc, #8] ; 1f46b20 <_cleanup_r+0x14> + 1f46b14: eb0001ea bl 1f472c4 <_fwalk_reent> + 1f46b18: e8bd4010 pop {r4, lr} + 1f46b1c: e12fff1e bx lr + 1f46b20: 01f4b18c .word 0x01f4b18c + +01f46b24 <__sinit.part.1>: + 1f46b24: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f46b28: e1a07000 mov r7, r0 + 1f46b2c: e3a04000 mov r4, #0 + 1f46b30: e3a03004 mov r3, #4 + 1f46b34: e3a01003 mov r1, #3 + 1f46b38: e5975004 ldr r5, [r7, #4] + 1f46b3c: e59f012c ldr r0, [pc, #300] ; 1f46c70 <__sinit.part.1+0x14c> + 1f46b40: e2872fbb add r2, r7, #748 ; 0x2ec + 1f46b44: e587003c str r0, [r7, #60] ; 0x3c + 1f46b48: e58712e4 str r1, [r7, #740] ; 0x2e4 + 1f46b4c: e58722e8 str r2, [r7, #744] ; 0x2e8 + 1f46b50: e58742e0 str r4, [r7, #736] ; 0x2e0 + 1f46b54: e24dd00c sub sp, sp, #12 + 1f46b58: e5854000 str r4, [r5] + 1f46b5c: e5854004 str r4, [r5, #4] + 1f46b60: e5854008 str r4, [r5, #8] + 1f46b64: e5854064 str r4, [r5, #100] ; 0x64 + 1f46b68: e1c540be strh r4, [r5, #14] + 1f46b6c: e5854010 str r4, [r5, #16] + 1f46b70: e5854014 str r4, [r5, #20] + 1f46b74: e5854018 str r4, [r5, #24] + 1f46b78: e1c530bc strh r3, [r5, #12] + 1f46b7c: e1a01004 mov r1, r4 + 1f46b80: e285005c add r0, r5, #92 ; 0x5c + 1f46b84: e3a02008 mov r2, #8 + 1f46b88: ebffe123 bl 1f3f01c + 1f46b8c: e3a03001 mov r3, #1 + 1f46b90: e3a02009 mov r2, #9 + 1f46b94: e5976008 ldr r6, [r7, #8] + 1f46b98: e59fb0d4 ldr fp, [pc, #212] ; 1f46c74 <__sinit.part.1+0x150> + 1f46b9c: e59fa0d4 ldr sl, [pc, #212] ; 1f46c78 <__sinit.part.1+0x154> + 1f46ba0: e59f90d4 ldr r9, [pc, #212] ; 1f46c7c <__sinit.part.1+0x158> + 1f46ba4: e59f80d4 ldr r8, [pc, #212] ; 1f46c80 <__sinit.part.1+0x15c> + 1f46ba8: e585b020 str fp, [r5, #32] + 1f46bac: e585a024 str sl, [r5, #36] ; 0x24 + 1f46bb0: e5859028 str r9, [r5, #40] ; 0x28 + 1f46bb4: e585802c str r8, [r5, #44] ; 0x2c + 1f46bb8: e585501c str r5, [r5, #28] + 1f46bbc: e1a01004 mov r1, r4 + 1f46bc0: e1c630be strh r3, [r6, #14] + 1f46bc4: e1c620bc strh r2, [r6, #12] + 1f46bc8: e286005c add r0, r6, #92 ; 0x5c + 1f46bcc: e5864000 str r4, [r6] + 1f46bd0: e5864004 str r4, [r6, #4] + 1f46bd4: e5864008 str r4, [r6, #8] + 1f46bd8: e5864064 str r4, [r6, #100] ; 0x64 + 1f46bdc: e5864010 str r4, [r6, #16] + 1f46be0: e5864014 str r4, [r6, #20] + 1f46be4: e5864018 str r4, [r6, #24] + 1f46be8: e3a02008 mov r2, #8 + 1f46bec: e58d3004 str r3, [sp, #4] + 1f46bf0: ebffe109 bl 1f3f01c + 1f46bf4: e3a00012 mov r0, #18 + 1f46bf8: e3a02002 mov r2, #2 + 1f46bfc: e597500c ldr r5, [r7, #12] + 1f46c00: e1a01004 mov r1, r4 + 1f46c04: e586601c str r6, [r6, #28] + 1f46c08: e586b020 str fp, [r6, #32] + 1f46c0c: e586a024 str sl, [r6, #36] ; 0x24 + 1f46c10: e5869028 str r9, [r6, #40] ; 0x28 + 1f46c14: e586802c str r8, [r6, #44] ; 0x2c + 1f46c18: e1c500bc strh r0, [r5, #12] + 1f46c1c: e1c520be strh r2, [r5, #14] + 1f46c20: e5854000 str r4, [r5] + 1f46c24: e5854004 str r4, [r5, #4] + 1f46c28: e5854008 str r4, [r5, #8] + 1f46c2c: e5854064 str r4, [r5, #100] ; 0x64 + 1f46c30: e5854010 str r4, [r5, #16] + 1f46c34: e5854014 str r4, [r5, #20] + 1f46c38: e5854018 str r4, [r5, #24] + 1f46c3c: e285005c add r0, r5, #92 ; 0x5c + 1f46c40: e3a02008 mov r2, #8 + 1f46c44: ebffe0f4 bl 1f3f01c + 1f46c48: e59d3004 ldr r3, [sp, #4] + 1f46c4c: e585501c str r5, [r5, #28] + 1f46c50: e585b020 str fp, [r5, #32] + 1f46c54: e585a024 str sl, [r5, #36] ; 0x24 + 1f46c58: e5859028 str r9, [r5, #40] ; 0x28 + 1f46c5c: e585802c str r8, [r5, #44] ; 0x2c + 1f46c60: e5873038 str r3, [r7, #56] ; 0x38 + 1f46c64: e28dd00c add sp, sp, #12 + 1f46c68: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f46c6c: e12fff1e bx lr + 1f46c70: 01f46b0c .word 0x01f46b0c + 1f46c74: 01f4844c .word 0x01f4844c + 1f46c78: 01f48488 .word 0x01f48488 + 1f46c7c: 01f484e0 .word 0x01f484e0 + 1f46c80: 01f48510 .word 0x01f48510 + +01f46c84 <__fp_lock>: + 1f46c84: e3a00000 mov r0, #0 + 1f46c88: e12fff1e bx lr + +01f46c8c <__sfmoreglue>: + 1f46c8c: e2413001 sub r3, r1, #1 + 1f46c90: e92d4070 push {r4, r5, r6, lr} + 1f46c94: e0834083 add r4, r3, r3, lsl #1 + 1f46c98: e0833104 add r3, r3, r4, lsl #2 + 1f46c9c: e1a04183 lsl r4, r3, #3 + 1f46ca0: e1a06001 mov r6, r1 + 1f46ca4: e2841074 add r1, r4, #116 ; 0x74 + 1f46ca8: ebffde3e bl 1f3e5a8 <_malloc_r> + 1f46cac: e2505000 subs r5, r0, #0 + 1f46cb0: 0a000006 beq 1f46cd0 <__sfmoreglue+0x44> + 1f46cb4: e3a01000 mov r1, #0 + 1f46cb8: e285000c add r0, r5, #12 + 1f46cbc: e5856004 str r6, [r5, #4] + 1f46cc0: e2842068 add r2, r4, #104 ; 0x68 + 1f46cc4: e5851000 str r1, [r5] + 1f46cc8: e5850008 str r0, [r5, #8] + 1f46ccc: ebffe0d2 bl 1f3f01c + 1f46cd0: e1a00005 mov r0, r5 + 1f46cd4: e8bd4070 pop {r4, r5, r6, lr} + 1f46cd8: e12fff1e bx lr + +01f46cdc <__sfp>: + 1f46cdc: e59f30e0 ldr r3, [pc, #224] ; 1f46dc4 <__sfp+0xe8> + 1f46ce0: e92d4070 push {r4, r5, r6, lr} + 1f46ce4: e5935000 ldr r5, [r3] + 1f46ce8: e5953038 ldr r3, [r5, #56] ; 0x38 + 1f46cec: e3530000 cmp r3, #0 + 1f46cf0: e1a06000 mov r6, r0 + 1f46cf4: 01a00005 moveq r0, r5 + 1f46cf8: 0bffff89 bleq 1f46b24 <__sinit.part.1> + 1f46cfc: e2855e2e add r5, r5, #736 ; 0x2e0 + 1f46d00: e5953004 ldr r3, [r5, #4] + 1f46d04: e2533001 subs r3, r3, #1 + 1f46d08: e5954008 ldr r4, [r5, #8] + 1f46d0c: 5a000004 bpl 1f46d24 <__sfp+0x48> + 1f46d10: ea00001d b 1f46d8c <__sfp+0xb0> + 1f46d14: e2433001 sub r3, r3, #1 + 1f46d18: e3730001 cmn r3, #1 + 1f46d1c: e2844068 add r4, r4, #104 ; 0x68 + 1f46d20: 0a000019 beq 1f46d8c <__sfp+0xb0> + 1f46d24: e1d420fc ldrsh r2, [r4, #12] + 1f46d28: e3520000 cmp r2, #0 + 1f46d2c: 1afffff8 bne 1f46d14 <__sfp+0x38> + 1f46d30: e3a05000 mov r5, #0 + 1f46d34: e3e02000 mvn r2, #0 + 1f46d38: e3a03001 mov r3, #1 + 1f46d3c: e1c420be strh r2, [r4, #14] + 1f46d40: e1c430bc strh r3, [r4, #12] + 1f46d44: e5845064 str r5, [r4, #100] ; 0x64 + 1f46d48: e5845000 str r5, [r4] + 1f46d4c: e5845008 str r5, [r4, #8] + 1f46d50: e5845004 str r5, [r4, #4] + 1f46d54: e5845010 str r5, [r4, #16] + 1f46d58: e5845014 str r5, [r4, #20] + 1f46d5c: e5845018 str r5, [r4, #24] + 1f46d60: e1a01005 mov r1, r5 + 1f46d64: e3a02008 mov r2, #8 + 1f46d68: e284005c add r0, r4, #92 ; 0x5c + 1f46d6c: ebffe0aa bl 1f3f01c + 1f46d70: e1a00004 mov r0, r4 + 1f46d74: e5845030 str r5, [r4, #48] ; 0x30 + 1f46d78: e5845034 str r5, [r4, #52] ; 0x34 + 1f46d7c: e5845044 str r5, [r4, #68] ; 0x44 + 1f46d80: e5845048 str r5, [r4, #72] ; 0x48 + 1f46d84: e8bd4070 pop {r4, r5, r6, lr} + 1f46d88: e12fff1e bx lr + 1f46d8c: e5953000 ldr r3, [r5] + 1f46d90: e3530000 cmp r3, #0 + 1f46d94: 11a05003 movne r5, r3 + 1f46d98: 1affffd8 bne 1f46d00 <__sfp+0x24> + 1f46d9c: e3a01004 mov r1, #4 + 1f46da0: e1a00006 mov r0, r6 + 1f46da4: ebffffb8 bl 1f46c8c <__sfmoreglue> + 1f46da8: e3500000 cmp r0, #0 + 1f46dac: e5850000 str r0, [r5] + 1f46db0: 11a05000 movne r5, r0 + 1f46db4: 1affffd1 bne 1f46d00 <__sfp+0x24> + 1f46db8: e3a0300c mov r3, #12 + 1f46dbc: e5863000 str r3, [r6] + 1f46dc0: eaffffef b 1f46d84 <__sfp+0xa8> + 1f46dc4: 01f63070 .word 0x01f63070 + +01f46dc8 <_cleanup>: + 1f46dc8: e92d4010 push {r4, lr} + 1f46dcc: e59f3010 ldr r3, [pc, #16] ; 1f46de4 <_cleanup+0x1c> + 1f46dd0: e59f1010 ldr r1, [pc, #16] ; 1f46de8 <_cleanup+0x20> + 1f46dd4: e5930000 ldr r0, [r3] + 1f46dd8: eb000139 bl 1f472c4 <_fwalk_reent> + 1f46ddc: e8bd4010 pop {r4, lr} + 1f46de0: e12fff1e bx lr + 1f46de4: 01f63070 .word 0x01f63070 + 1f46de8: 01f4b18c .word 0x01f4b18c + +01f46dec <__sinit>: + 1f46dec: e5903038 ldr r3, [r0, #56] ; 0x38 + 1f46df0: e3530000 cmp r3, #0 + 1f46df4: 112fff1e bxne lr + 1f46df8: eaffff49 b 1f46b24 <__sinit.part.1> + +01f46dfc <__sfp_lock_acquire>: + 1f46dfc: e12fff1e bx lr + +01f46e00 <__sfp_lock_release>: + 1f46e00: e12fff1e bx lr + +01f46e04 <__sinit_lock_acquire>: + 1f46e04: e12fff1e bx lr + +01f46e08 <__sinit_lock_release>: + 1f46e08: e12fff1e bx lr + +01f46e0c <__fp_lock_all>: + 1f46e0c: e92d4010 push {r4, lr} + 1f46e10: e59f3010 ldr r3, [pc, #16] ; 1f46e28 <__fp_lock_all+0x1c> + 1f46e14: e59f1010 ldr r1, [pc, #16] ; 1f46e2c <__fp_lock_all+0x20> + 1f46e18: e5930000 ldr r0, [r3] + 1f46e1c: eb000107 bl 1f47240 <_fwalk> + 1f46e20: e8bd4010 pop {r4, lr} + 1f46e24: e12fff1e bx lr + 1f46e28: 01f65c08 .word 0x01f65c08 + 1f46e2c: 01f46c84 .word 0x01f46c84 + +01f46e30 <__fp_unlock_all>: + 1f46e30: e92d4010 push {r4, lr} + 1f46e34: e59f3010 ldr r3, [pc, #16] ; 1f46e4c <__fp_unlock_all+0x1c> + 1f46e38: e59f1010 ldr r1, [pc, #16] ; 1f46e50 <__fp_unlock_all+0x20> + 1f46e3c: e5930000 ldr r0, [r3] + 1f46e40: eb0000fe bl 1f47240 <_fwalk> + 1f46e44: e8bd4010 pop {r4, lr} + 1f46e48: e12fff1e bx lr + 1f46e4c: 01f65c08 .word 0x01f65c08 + 1f46e50: 01f46b04 .word 0x01f46b04 + +01f46e54 <_malloc_trim_r>: + 1f46e54: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f46e58: e1a04001 mov r4, r1 + 1f46e5c: e59f70e4 ldr r7, [pc, #228] ; 1f46f48 <_malloc_trim_r+0xf4> + 1f46e60: e1a05000 mov r5, r0 + 1f46e64: ebffe0a9 bl 1f3f110 <__malloc_lock> + 1f46e68: e5973008 ldr r3, [r7, #8] + 1f46e6c: e5936004 ldr r6, [r3, #4] + 1f46e70: e3c66003 bic r6, r6, #3 + 1f46e74: e0644006 rsb r4, r4, r6 + 1f46e78: e2844efe add r4, r4, #4064 ; 0xfe0 + 1f46e7c: e284400f add r4, r4, #15 + 1f46e80: e1a04624 lsr r4, r4, #12 + 1f46e84: e2444001 sub r4, r4, #1 + 1f46e88: e1a04604 lsl r4, r4, #12 + 1f46e8c: e3540a01 cmp r4, #4096 ; 0x1000 + 1f46e90: ba000006 blt 1f46eb0 <_malloc_trim_r+0x5c> + 1f46e94: e3a01000 mov r1, #0 + 1f46e98: e1a00005 mov r0, r5 + 1f46e9c: ebffe287 bl 1f3f8c0 <_sbrk_r> + 1f46ea0: e5973008 ldr r3, [r7, #8] + 1f46ea4: e0833006 add r3, r3, r6 + 1f46ea8: e1500003 cmp r0, r3 + 1f46eac: 0a000004 beq 1f46ec4 <_malloc_trim_r+0x70> + 1f46eb0: e1a00005 mov r0, r5 + 1f46eb4: ebffe096 bl 1f3f114 <__malloc_unlock> + 1f46eb8: e3a00000 mov r0, #0 + 1f46ebc: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f46ec0: e12fff1e bx lr + 1f46ec4: e2641000 rsb r1, r4, #0 + 1f46ec8: e1a00005 mov r0, r5 + 1f46ecc: ebffe27b bl 1f3f8c0 <_sbrk_r> + 1f46ed0: e3700001 cmn r0, #1 + 1f46ed4: 0a00000c beq 1f46f0c <_malloc_trim_r+0xb8> + 1f46ed8: e59f206c ldr r2, [pc, #108] ; 1f46f4c <_malloc_trim_r+0xf8> + 1f46edc: e5971008 ldr r1, [r7, #8] + 1f46ee0: e5923000 ldr r3, [r2] + 1f46ee4: e0646006 rsb r6, r4, r6 + 1f46ee8: e3866001 orr r6, r6, #1 + 1f46eec: e1a00005 mov r0, r5 + 1f46ef0: e0644003 rsb r4, r4, r3 + 1f46ef4: e5816004 str r6, [r1, #4] + 1f46ef8: e5824000 str r4, [r2] + 1f46efc: ebffe084 bl 1f3f114 <__malloc_unlock> + 1f46f00: e3a00001 mov r0, #1 + 1f46f04: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f46f08: e12fff1e bx lr + 1f46f0c: e3a01000 mov r1, #0 + 1f46f10: e1a00005 mov r0, r5 + 1f46f14: ebffe269 bl 1f3f8c0 <_sbrk_r> + 1f46f18: e5972008 ldr r2, [r7, #8] + 1f46f1c: e0623000 rsb r3, r2, r0 + 1f46f20: e353000f cmp r3, #15 + 1f46f24: daffffe1 ble 1f46eb0 <_malloc_trim_r+0x5c> + 1f46f28: e59f1020 ldr r1, [pc, #32] ; 1f46f50 <_malloc_trim_r+0xfc> + 1f46f2c: e591c000 ldr ip, [r1] + 1f46f30: e59f1014 ldr r1, [pc, #20] ; 1f46f4c <_malloc_trim_r+0xf8> + 1f46f34: e3833001 orr r3, r3, #1 + 1f46f38: e06c0000 rsb r0, ip, r0 + 1f46f3c: e5823004 str r3, [r2, #4] + 1f46f40: e5810000 str r0, [r1] + 1f46f44: eaffffd9 b 1f46eb0 <_malloc_trim_r+0x5c> + 1f46f48: 01f653cc .word 0x01f653cc + 1f46f4c: 020dc5c8 .word 0x020dc5c8 + 1f46f50: 01f657d8 .word 0x01f657d8 + +01f46f54 <_free_r>: + 1f46f54: e3510000 cmp r1, #0 + 1f46f58: 012fff1e bxeq lr + 1f46f5c: e92d4070 push {r4, r5, r6, lr} + 1f46f60: e1a04001 mov r4, r1 + 1f46f64: e1a05000 mov r5, r0 + 1f46f68: ebffe068 bl 1f3f110 <__malloc_lock> + 1f46f6c: e5141004 ldr r1, [r4, #-4] + 1f46f70: e59fe2b4 ldr lr, [pc, #692] ; 1f4722c <_free_r+0x2d8> + 1f46f74: e3c13001 bic r3, r1, #1 + 1f46f78: e244c008 sub ip, r4, #8 + 1f46f7c: e08c0003 add r0, ip, r3 + 1f46f80: e59e6008 ldr r6, [lr, #8] + 1f46f84: e5902004 ldr r2, [r0, #4] + 1f46f88: e1500006 cmp r0, r6 + 1f46f8c: e3c22003 bic r2, r2, #3 + 1f46f90: 0a000052 beq 1f470e0 <_free_r+0x18c> + 1f46f94: e3110001 tst r1, #1 + 1f46f98: e5802004 str r2, [r0, #4] + 1f46f9c: 1a000009 bne 1f46fc8 <_free_r+0x74> + 1f46fa0: e5144008 ldr r4, [r4, #-8] + 1f46fa4: e064c00c rsb ip, r4, ip + 1f46fa8: e59c1008 ldr r1, [ip, #8] + 1f46fac: e28e6008 add r6, lr, #8 + 1f46fb0: e1510006 cmp r1, r6 + 1f46fb4: e0833004 add r3, r3, r4 + 1f46fb8: 0a00005e beq 1f47138 <_free_r+0x1e4> + 1f46fbc: e59c400c ldr r4, [ip, #12] + 1f46fc0: e581400c str r4, [r1, #12] + 1f46fc4: e5841008 str r1, [r4, #8] + 1f46fc8: e0801002 add r1, r0, r2 + 1f46fcc: e5911004 ldr r1, [r1, #4] + 1f46fd0: e3110001 tst r1, #1 + 1f46fd4: 13832001 orrne r2, r3, #1 + 1f46fd8: 158c2004 strne r2, [ip, #4] + 1f46fdc: 178c3003 strne r3, [ip, r3] + 1f46fe0: 0a000030 beq 1f470a8 <_free_r+0x154> + 1f46fe4: e3530c02 cmp r3, #512 ; 0x200 + 1f46fe8: 2a000011 bcs 1f47034 <_free_r+0xe0> + 1f46fec: e3a04001 mov r4, #1 + 1f46ff0: e59e0004 ldr r0, [lr, #4] + 1f46ff4: e1a031a3 lsr r3, r3, #3 + 1f46ff8: e0832004 add r2, r3, r4 + 1f46ffc: e1a03143 asr r3, r3, #2 + 1f47000: e1803314 orr r3, r0, r4, lsl r3 + 1f47004: e08e1182 add r1, lr, r2, lsl #3 + 1f47008: e79e0182 ldr r0, [lr, r2, lsl #3] + 1f4700c: e2411008 sub r1, r1, #8 + 1f47010: e58c100c str r1, [ip, #12] + 1f47014: e58c0008 str r0, [ip, #8] + 1f47018: e58e3004 str r3, [lr, #4] + 1f4701c: e78ec182 str ip, [lr, r2, lsl #3] + 1f47020: e580c00c str ip, [r0, #12] + 1f47024: e1a00005 mov r0, r5 + 1f47028: ebffe039 bl 1f3f114 <__malloc_unlock> + 1f4702c: e8bd4070 pop {r4, r5, r6, lr} + 1f47030: e12fff1e bx lr + 1f47034: e1a024a3 lsr r2, r3, #9 + 1f47038: e3520004 cmp r2, #4 + 1f4703c: 8a00004a bhi 1f4716c <_free_r+0x218> + 1f47040: e1a02323 lsr r2, r3, #6 + 1f47044: e2824039 add r4, r2, #57 ; 0x39 + 1f47048: e1a04084 lsl r4, r4, #1 + 1f4704c: e2821038 add r1, r2, #56 ; 0x38 + 1f47050: e08e0104 add r0, lr, r4, lsl #2 + 1f47054: e79e2104 ldr r2, [lr, r4, lsl #2] + 1f47058: e2400008 sub r0, r0, #8 + 1f4705c: e1500002 cmp r0, r2 + 1f47060: e59fe1c4 ldr lr, [pc, #452] ; 1f4722c <_free_r+0x2d8> + 1f47064: 0a000046 beq 1f47184 <_free_r+0x230> + 1f47068: e5921004 ldr r1, [r2, #4] + 1f4706c: e3c11003 bic r1, r1, #3 + 1f47070: e1530001 cmp r3, r1 + 1f47074: 2a000002 bcs 1f47084 <_free_r+0x130> + 1f47078: e5922008 ldr r2, [r2, #8] + 1f4707c: e1500002 cmp r0, r2 + 1f47080: 1afffff8 bne 1f47068 <_free_r+0x114> + 1f47084: e592000c ldr r0, [r2, #12] + 1f47088: e58c000c str r0, [ip, #12] + 1f4708c: e58c2008 str r2, [ip, #8] + 1f47090: e580c008 str ip, [r0, #8] + 1f47094: e1a00005 mov r0, r5 + 1f47098: e582c00c str ip, [r2, #12] + 1f4709c: ebffe01c bl 1f3f114 <__malloc_unlock> + 1f470a0: e8bd4070 pop {r4, r5, r6, lr} + 1f470a4: e12fff1e bx lr + 1f470a8: e5901008 ldr r1, [r0, #8] + 1f470ac: e59f417c ldr r4, [pc, #380] ; 1f47230 <_free_r+0x2dc> + 1f470b0: e1510004 cmp r1, r4 + 1f470b4: e0833002 add r3, r3, r2 + 1f470b8: 0a000038 beq 1f471a0 <_free_r+0x24c> + 1f470bc: e590000c ldr r0, [r0, #12] + 1f470c0: e3832001 orr r2, r3, #1 + 1f470c4: e3530c02 cmp r3, #512 ; 0x200 + 1f470c8: e581000c str r0, [r1, #12] + 1f470cc: e5801008 str r1, [r0, #8] + 1f470d0: e58c2004 str r2, [ip, #4] + 1f470d4: e78c3003 str r3, [ip, r3] + 1f470d8: 2affffd5 bcs 1f47034 <_free_r+0xe0> + 1f470dc: eaffffc2 b 1f46fec <_free_r+0x98> + 1f470e0: e3110001 tst r1, #1 + 1f470e4: e0833002 add r3, r3, r2 + 1f470e8: 1a000006 bne 1f47108 <_free_r+0x1b4> + 1f470ec: e5142008 ldr r2, [r4, #-8] + 1f470f0: e062c00c rsb ip, r2, ip + 1f470f4: e28c0008 add r0, ip, #8 + 1f470f8: e8900003 ldm r0, {r0, r1} + 1f470fc: e580100c str r1, [r0, #12] + 1f47100: e5810008 str r0, [r1, #8] + 1f47104: e0833002 add r3, r3, r2 + 1f47108: e59f2124 ldr r2, [pc, #292] ; 1f47234 <_free_r+0x2e0> + 1f4710c: e5921000 ldr r1, [r2] + 1f47110: e3832001 orr r2, r3, #1 + 1f47114: e1530001 cmp r3, r1 + 1f47118: e58c2004 str r2, [ip, #4] + 1f4711c: e58ec008 str ip, [lr, #8] + 1f47120: 3affffbf bcc 1f47024 <_free_r+0xd0> + 1f47124: e59f310c ldr r3, [pc, #268] ; 1f47238 <_free_r+0x2e4> + 1f47128: e1a00005 mov r0, r5 + 1f4712c: e5931000 ldr r1, [r3] + 1f47130: ebffff47 bl 1f46e54 <_malloc_trim_r> + 1f47134: eaffffba b 1f47024 <_free_r+0xd0> + 1f47138: e0801002 add r1, r0, r2 + 1f4713c: e5911004 ldr r1, [r1, #4] + 1f47140: e3110001 tst r1, #1 + 1f47144: 1a000034 bne 1f4721c <_free_r+0x2c8> + 1f47148: e2801008 add r1, r0, #8 + 1f4714c: e0823003 add r3, r2, r3 + 1f47150: e8910006 ldm r1, {r1, r2} + 1f47154: e3830001 orr r0, r3, #1 + 1f47158: e581200c str r2, [r1, #12] + 1f4715c: e5821008 str r1, [r2, #8] + 1f47160: e58c0004 str r0, [ip, #4] + 1f47164: e78c3003 str r3, [ip, r3] + 1f47168: eaffffad b 1f47024 <_free_r+0xd0> + 1f4716c: e3520014 cmp r2, #20 + 1f47170: 8a000012 bhi 1f471c0 <_free_r+0x26c> + 1f47174: e282405c add r4, r2, #92 ; 0x5c + 1f47178: e1a04084 lsl r4, r4, #1 + 1f4717c: e282105b add r1, r2, #91 ; 0x5b + 1f47180: eaffffb2 b 1f47050 <_free_r+0xfc> + 1f47184: e3a04001 mov r4, #1 + 1f47188: e59e3004 ldr r3, [lr, #4] + 1f4718c: e1a02141 asr r2, r1, #2 + 1f47190: e1832214 orr r2, r3, r4, lsl r2 + 1f47194: e58e2004 str r2, [lr, #4] + 1f47198: e1a02000 mov r2, r0 + 1f4719c: eaffffb9 b 1f47088 <_free_r+0x134> + 1f471a0: e3832001 orr r2, r3, #1 + 1f471a4: e58ec014 str ip, [lr, #20] + 1f471a8: e58ec010 str ip, [lr, #16] + 1f471ac: e58c100c str r1, [ip, #12] + 1f471b0: e58c1008 str r1, [ip, #8] + 1f471b4: e58c2004 str r2, [ip, #4] + 1f471b8: e78c3003 str r3, [ip, r3] + 1f471bc: eaffff98 b 1f47024 <_free_r+0xd0> + 1f471c0: e3520054 cmp r2, #84 ; 0x54 + 1f471c4: 8a000004 bhi 1f471dc <_free_r+0x288> + 1f471c8: e1a02623 lsr r2, r3, #12 + 1f471cc: e282406f add r4, r2, #111 ; 0x6f + 1f471d0: e1a04084 lsl r4, r4, #1 + 1f471d4: e282106e add r1, r2, #110 ; 0x6e + 1f471d8: eaffff9c b 1f47050 <_free_r+0xfc> + 1f471dc: e3520f55 cmp r2, #340 ; 0x154 + 1f471e0: 8a000004 bhi 1f471f8 <_free_r+0x2a4> + 1f471e4: e1a027a3 lsr r2, r3, #15 + 1f471e8: e2824078 add r4, r2, #120 ; 0x78 + 1f471ec: e1a04084 lsl r4, r4, #1 + 1f471f0: e2821077 add r1, r2, #119 ; 0x77 + 1f471f4: eaffff95 b 1f47050 <_free_r+0xfc> + 1f471f8: e59f103c ldr r1, [pc, #60] ; 1f4723c <_free_r+0x2e8> + 1f471fc: e1520001 cmp r2, r1 + 1f47200: 91a02923 lsrls r2, r3, #18 + 1f47204: 9282407d addls r4, r2, #125 ; 0x7d + 1f47208: 91a04084 lslls r4, r4, #1 + 1f4720c: 9282107c addls r1, r2, #124 ; 0x7c + 1f47210: 83a040fe movhi r4, #254 ; 0xfe + 1f47214: 83a0107e movhi r1, #126 ; 0x7e + 1f47218: eaffff8c b 1f47050 <_free_r+0xfc> + 1f4721c: e3832001 orr r2, r3, #1 + 1f47220: e58c2004 str r2, [ip, #4] + 1f47224: e78c3003 str r3, [ip, r3] + 1f47228: eaffff7d b 1f47024 <_free_r+0xd0> + 1f4722c: 01f653cc .word 0x01f653cc + 1f47230: 01f653d4 .word 0x01f653d4 + 1f47234: 01f657d4 .word 0x01f657d4 + 1f47238: 020dc5c4 .word 0x020dc5c4 + 1f4723c: 00000554 .word 0x00000554 + +01f47240 <_fwalk>: + 1f47240: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f47244: e2907e2e adds r7, r0, #736 ; 0x2e0 + 1f47248: 0a000019 beq 1f472b4 <_fwalk+0x74> + 1f4724c: e1a08001 mov r8, r1 + 1f47250: e3a06000 mov r6, #0 + 1f47254: e5975004 ldr r5, [r7, #4] + 1f47258: e2555001 subs r5, r5, #1 + 1f4725c: e5974008 ldr r4, [r7, #8] + 1f47260: 4a00000d bmi 1f4729c <_fwalk+0x5c> + 1f47264: e1d430bc ldrh r3, [r4, #12] + 1f47268: e3530001 cmp r3, #1 + 1f4726c: e2455001 sub r5, r5, #1 + 1f47270: 9a000006 bls 1f47290 <_fwalk+0x50> + 1f47274: e1d430fe ldrsh r3, [r4, #14] + 1f47278: e3730001 cmn r3, #1 + 1f4727c: 0a000003 beq 1f47290 <_fwalk+0x50> + 1f47280: e1a00004 mov r0, r4 + 1f47284: e1a0e00f mov lr, pc + 1f47288: e12fff18 bx r8 + 1f4728c: e1866000 orr r6, r6, r0 + 1f47290: e3750001 cmn r5, #1 + 1f47294: e2844068 add r4, r4, #104 ; 0x68 + 1f47298: 1afffff1 bne 1f47264 <_fwalk+0x24> + 1f4729c: e5977000 ldr r7, [r7] + 1f472a0: e3570000 cmp r7, #0 + 1f472a4: 1affffea bne 1f47254 <_fwalk+0x14> + 1f472a8: e1a00006 mov r0, r6 + 1f472ac: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f472b0: e12fff1e bx lr + 1f472b4: e1a06007 mov r6, r7 + 1f472b8: e1a00006 mov r0, r6 + 1f472bc: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f472c0: e12fff1e bx lr + +01f472c4 <_fwalk_reent>: + 1f472c4: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f472c8: e2906e2e adds r6, r0, #736 ; 0x2e0 + 1f472cc: 0a00001b beq 1f47340 <_fwalk_reent+0x7c> + 1f472d0: e1a08001 mov r8, r1 + 1f472d4: e1a07000 mov r7, r0 + 1f472d8: e3a09000 mov r9, #0 + 1f472dc: e5965004 ldr r5, [r6, #4] + 1f472e0: e2555001 subs r5, r5, #1 + 1f472e4: e5964008 ldr r4, [r6, #8] + 1f472e8: 4a00000e bmi 1f47328 <_fwalk_reent+0x64> + 1f472ec: e1d430bc ldrh r3, [r4, #12] + 1f472f0: e3530001 cmp r3, #1 + 1f472f4: e2455001 sub r5, r5, #1 + 1f472f8: 9a000007 bls 1f4731c <_fwalk_reent+0x58> + 1f472fc: e1d430fe ldrsh r3, [r4, #14] + 1f47300: e3730001 cmn r3, #1 + 1f47304: 0a000004 beq 1f4731c <_fwalk_reent+0x58> + 1f47308: e1a01004 mov r1, r4 + 1f4730c: e1a00007 mov r0, r7 + 1f47310: e1a0e00f mov lr, pc + 1f47314: e12fff18 bx r8 + 1f47318: e1899000 orr r9, r9, r0 + 1f4731c: e3750001 cmn r5, #1 + 1f47320: e2844068 add r4, r4, #104 ; 0x68 + 1f47324: 1afffff0 bne 1f472ec <_fwalk_reent+0x28> + 1f47328: e5966000 ldr r6, [r6] + 1f4732c: e3560000 cmp r6, #0 + 1f47330: 1affffe9 bne 1f472dc <_fwalk_reent+0x18> + 1f47334: e1a00009 mov r0, r9 + 1f47338: e8bd47f0 pop {r4, r5, r6, r7, r8, r9, sl, lr} + 1f4733c: e12fff1e bx lr + 1f47340: e1a09006 mov r9, r6 + 1f47344: e1a00009 mov r0, r9 + 1f47348: e8bd47f0 pop {r4, r5, r6, r7, r8, r9, sl, lr} + 1f4734c: e12fff1e bx lr + +01f47350 <_setlocale_r>: + 1f47350: e3520000 cmp r2, #0 + 1f47354: 0a000015 beq 1f473b0 <_setlocale_r+0x60> + 1f47358: e92d4010 push {r4, lr} + 1f4735c: e59f1054 ldr r1, [pc, #84] ; 1f473b8 <_setlocale_r+0x68> + 1f47360: e1a00002 mov r0, r2 + 1f47364: e1a04002 mov r4, r2 + 1f47368: ebffe2a3 bl 1f3fdfc + 1f4736c: e3500000 cmp r0, #0 + 1f47370: 1a000002 bne 1f47380 <_setlocale_r+0x30> + 1f47374: e59f0040 ldr r0, [pc, #64] ; 1f473bc <_setlocale_r+0x6c> + 1f47378: e8bd4010 pop {r4, lr} + 1f4737c: e12fff1e bx lr + 1f47380: e59f1034 ldr r1, [pc, #52] ; 1f473bc <_setlocale_r+0x6c> + 1f47384: e1a00004 mov r0, r4 + 1f47388: ebffe29b bl 1f3fdfc + 1f4738c: e3500000 cmp r0, #0 + 1f47390: 0afffff7 beq 1f47374 <_setlocale_r+0x24> + 1f47394: e1a00004 mov r0, r4 + 1f47398: e59f1020 ldr r1, [pc, #32] ; 1f473c0 <_setlocale_r+0x70> + 1f4739c: ebffe296 bl 1f3fdfc + 1f473a0: e3500000 cmp r0, #0 + 1f473a4: 0afffff2 beq 1f47374 <_setlocale_r+0x24> + 1f473a8: e3a00000 mov r0, #0 + 1f473ac: eafffff1 b 1f47378 <_setlocale_r+0x28> + 1f473b0: e59f0004 ldr r0, [pc, #4] ; 1f473bc <_setlocale_r+0x6c> + 1f473b4: e12fff1e bx lr + 1f473b8: 01f63074 .word 0x01f63074 + 1f473bc: 01f6306c .word 0x01f6306c + 1f473c0: 01f5f83c .word 0x01f5f83c + +01f473c4 <__locale_charset>: + 1f473c4: e59f0000 ldr r0, [pc] ; 1f473cc <__locale_charset+0x8> + 1f473c8: e12fff1e bx lr + 1f473cc: 01f65c64 .word 0x01f65c64 + +01f473d0 <__locale_mb_cur_max>: + 1f473d0: e59f3004 ldr r3, [pc, #4] ; 1f473dc <__locale_mb_cur_max+0xc> + 1f473d4: e5930000 ldr r0, [r3] + 1f473d8: e12fff1e bx lr + 1f473dc: 01f65c84 .word 0x01f65c84 + +01f473e0 <__locale_msgcharset>: + 1f473e0: e59f0000 ldr r0, [pc] ; 1f473e8 <__locale_msgcharset+0x8> + 1f473e4: e12fff1e bx lr + 1f473e8: 01f65c0c .word 0x01f65c0c + +01f473ec <__locale_cjk_lang>: + 1f473ec: e3a00000 mov r0, #0 + 1f473f0: e12fff1e bx lr + +01f473f4 <_localeconv_r>: + 1f473f4: e59f0000 ldr r0, [pc] ; 1f473fc <_localeconv_r+0x8> + 1f473f8: e12fff1e bx lr + 1f473fc: 01f65c2c .word 0x01f65c2c + +01f47400 : + 1f47400: e59f300c ldr r3, [pc, #12] ; 1f47414 + 1f47404: e1a02001 mov r2, r1 + 1f47408: e1a01000 mov r1, r0 + 1f4740c: e5930000 ldr r0, [r3] + 1f47410: eaffffce b 1f47350 <_setlocale_r> + 1f47414: 01f65c08 .word 0x01f65c08 + +01f47418 : + 1f47418: e59f0000 ldr r0, [pc] ; 1f47420 + 1f4741c: e12fff1e bx lr + 1f47420: 01f65c2c .word 0x01f65c2c + +01f47424 <__swhatbuf_r>: + 1f47424: e92d4070 push {r4, r5, r6, lr} + 1f47428: e1a04001 mov r4, r1 + 1f4742c: e1d110fe ldrsh r1, [r1, #14] + 1f47430: e3510000 cmp r1, #0 + 1f47434: e24dd040 sub sp, sp, #64 ; 0x40 + 1f47438: e1a05002 mov r5, r2 + 1f4743c: e1a06003 mov r6, r3 + 1f47440: ba00000f blt 1f47484 <__swhatbuf_r+0x60> + 1f47444: e28d2004 add r2, sp, #4 + 1f47448: eb000ff9 bl 1f4b434 <_fstat_r> + 1f4744c: e3500000 cmp r0, #0 + 1f47450: ba00000b blt 1f47484 <__swhatbuf_r+0x60> + 1f47454: e59d2008 ldr r2, [sp, #8] + 1f47458: e2022a0f and r2, r2, #61440 ; 0xf000 + 1f4745c: e2423a02 sub r3, r2, #8192 ; 0x2000 + 1f47460: e2732000 rsbs r2, r3, #0 + 1f47464: e0a22003 adc r2, r2, r3 + 1f47468: e3a03b01 mov r3, #1024 ; 0x400 + 1f4746c: e3a00b02 mov r0, #2048 ; 0x800 + 1f47470: e5862000 str r2, [r6] + 1f47474: e5853000 str r3, [r5] + 1f47478: e28dd040 add sp, sp, #64 ; 0x40 + 1f4747c: e8bd4070 pop {r4, r5, r6, lr} + 1f47480: e12fff1e bx lr + 1f47484: e1d420bc ldrh r2, [r4, #12] + 1f47488: e2122080 ands r2, r2, #128 ; 0x80 + 1f4748c: e3a00000 mov r0, #0 + 1f47490: 13a03040 movne r3, #64 ; 0x40 + 1f47494: e5860000 str r0, [r6] + 1f47498: 15853000 strne r3, [r5] + 1f4749c: 1afffff5 bne 1f47478 <__swhatbuf_r+0x54> + 1f474a0: e3a03b01 mov r3, #1024 ; 0x400 + 1f474a4: e1a00002 mov r0, r2 + 1f474a8: e5853000 str r3, [r5] + 1f474ac: e28dd040 add sp, sp, #64 ; 0x40 + 1f474b0: e8bd4070 pop {r4, r5, r6, lr} + 1f474b4: e12fff1e bx lr + +01f474b8 <__smakebuf_r>: + 1f474b8: e1d120bc ldrh r2, [r1, #12] + 1f474bc: e3120002 tst r2, #2 + 1f474c0: e1a03001 mov r3, r1 + 1f474c4: 0a000005 beq 1f474e0 <__smakebuf_r+0x28> + 1f474c8: e3a01001 mov r1, #1 + 1f474cc: e2832043 add r2, r3, #67 ; 0x43 + 1f474d0: e5831014 str r1, [r3, #20] + 1f474d4: e5832000 str r2, [r3] + 1f474d8: e5832010 str r2, [r3, #16] + 1f474dc: e12fff1e bx lr + 1f474e0: e92d4070 push {r4, r5, r6, lr} + 1f474e4: e24dd008 sub sp, sp, #8 + 1f474e8: e28d3004 add r3, sp, #4 + 1f474ec: e1a0200d mov r2, sp + 1f474f0: e1a04001 mov r4, r1 + 1f474f4: e1a05000 mov r5, r0 + 1f474f8: ebffffc9 bl 1f47424 <__swhatbuf_r> + 1f474fc: e59d1000 ldr r1, [sp] + 1f47500: e1a06000 mov r6, r0 + 1f47504: e1a00005 mov r0, r5 + 1f47508: ebffdc26 bl 1f3e5a8 <_malloc_r> + 1f4750c: e3500000 cmp r0, #0 + 1f47510: e1d430fc ldrsh r3, [r4, #12] + 1f47514: 0a000016 beq 1f47574 <__smakebuf_r+0xbc> + 1f47518: e59dc004 ldr ip, [sp, #4] + 1f4751c: e59f1078 ldr r1, [pc, #120] ; 1f4759c <__smakebuf_r+0xe4> + 1f47520: e59d2000 ldr r2, [sp] + 1f47524: e3833080 orr r3, r3, #128 ; 0x80 + 1f47528: e35c0000 cmp ip, #0 + 1f4752c: e585103c str r1, [r5, #60] ; 0x3c + 1f47530: e1c430bc strh r3, [r4, #12] + 1f47534: e5840000 str r0, [r4] + 1f47538: e5840010 str r0, [r4, #16] + 1f4753c: e5842014 str r2, [r4, #20] + 1f47540: 1a000004 bne 1f47558 <__smakebuf_r+0xa0> + 1f47544: e1833006 orr r3, r3, r6 + 1f47548: e1c430bc strh r3, [r4, #12] + 1f4754c: e28dd008 add sp, sp, #8 + 1f47550: e8bd4070 pop {r4, r5, r6, lr} + 1f47554: e12fff1e bx lr + 1f47558: e1a00005 mov r0, r5 + 1f4755c: e1d410fe ldrsh r1, [r4, #14] + 1f47560: eb0010f6 bl 1f4b940 <_isatty_r> + 1f47564: e1d430fc ldrsh r3, [r4, #12] + 1f47568: e3500000 cmp r0, #0 + 1f4756c: 13833001 orrne r3, r3, #1 + 1f47570: eafffff3 b 1f47544 <__smakebuf_r+0x8c> + 1f47574: e3130c02 tst r3, #512 ; 0x200 + 1f47578: 1afffff3 bne 1f4754c <__smakebuf_r+0x94> + 1f4757c: e3a01001 mov r1, #1 + 1f47580: e2842043 add r2, r4, #67 ; 0x43 + 1f47584: e3833002 orr r3, r3, #2 + 1f47588: e1c430bc strh r3, [r4, #12] + 1f4758c: e5841014 str r1, [r4, #20] + 1f47590: e5842000 str r2, [r4] + 1f47594: e5842010 str r2, [r4, #16] + 1f47598: eaffffeb b 1f4754c <__smakebuf_r+0x94> + 1f4759c: 01f46b0c .word 0x01f46b0c + +01f475a0 : + 1f475a0: e3100003 tst r0, #3 + 1f475a4: e92d4030 push {r4, r5, lr} + 1f475a8: e201e0ff and lr, r1, #255 ; 0xff + 1f475ac: 0a00003a beq 1f4769c + 1f475b0: e3520000 cmp r2, #0 + 1f475b4: e2423001 sub r3, r2, #1 + 1f475b8: 0a00001f beq 1f4763c + 1f475bc: e5d02000 ldrb r2, [r0] + 1f475c0: e152000e cmp r2, lr + 1f475c4: 0a00001d beq 1f47640 + 1f475c8: e2802001 add r2, r0, #1 + 1f475cc: ea000006 b 1f475ec + 1f475d0: e3530000 cmp r3, #0 + 1f475d4: 0a000018 beq 1f4763c + 1f475d8: e5d0c000 ldrb ip, [r0] + 1f475dc: e15c000e cmp ip, lr + 1f475e0: e2822001 add r2, r2, #1 + 1f475e4: e2433001 sub r3, r3, #1 + 1f475e8: 0a000014 beq 1f47640 + 1f475ec: e3120003 tst r2, #3 + 1f475f0: e1a00002 mov r0, r2 + 1f475f4: 1afffff5 bne 1f475d0 + 1f475f8: e3530003 cmp r3, #3 + 1f475fc: 8a000011 bhi 1f47648 + 1f47600: e3530000 cmp r3, #0 + 1f47604: 0a000026 beq 1f476a4 + 1f47608: e5d02000 ldrb r2, [r0] + 1f4760c: e152000e cmp r2, lr + 1f47610: 0a00000a beq 1f47640 + 1f47614: e0803003 add r3, r0, r3 + 1f47618: e2802001 add r2, r0, #1 + 1f4761c: ea000003 b 1f47630 + 1f47620: e5d01000 ldrb r1, [r0] + 1f47624: e151000e cmp r1, lr + 1f47628: e2822001 add r2, r2, #1 + 1f4762c: 0a000003 beq 1f47640 + 1f47630: e1530002 cmp r3, r2 + 1f47634: e1a00002 mov r0, r2 + 1f47638: 1afffff8 bne 1f47620 + 1f4763c: e3a00000 mov r0, #0 + 1f47640: e8bd4030 pop {r4, r5, lr} + 1f47644: e12fff1e bx lr + 1f47648: e1a0c000 mov ip, r0 + 1f4764c: e1a05401 lsl r5, r1, #8 + 1f47650: e2055cff and r5, r5, #65280 ; 0xff00 + 1f47654: e185500e orr r5, r5, lr + 1f47658: e1855805 orr r5, r5, r5, lsl #16 + 1f4765c: e59c1000 ldr r1, [ip] + 1f47660: e59f2044 ldr r2, [pc, #68] ; 1f476ac + 1f47664: e0211005 eor r1, r1, r5 + 1f47668: e0812002 add r2, r1, r2 + 1f4766c: e59f403c ldr r4, [pc, #60] ; 1f476b0 + 1f47670: e1c22001 bic r2, r2, r1 + 1f47674: e0044002 and r4, r4, r2 + 1f47678: e3540000 cmp r4, #0 + 1f4767c: e1a0000c mov r0, ip + 1f47680: e28cc004 add ip, ip, #4 + 1f47684: 1affffdf bne 1f47608 + 1f47688: e2433004 sub r3, r3, #4 + 1f4768c: e3530003 cmp r3, #3 + 1f47690: e1a0000c mov r0, ip + 1f47694: 8afffff0 bhi 1f4765c + 1f47698: eaffffd8 b 1f47600 + 1f4769c: e1a03002 mov r3, r2 + 1f476a0: eaffffd4 b 1f475f8 + 1f476a4: e1a00003 mov r0, r3 + 1f476a8: eaffffe4 b 1f47640 + 1f476ac: fefefeff .word 0xfefefeff + 1f476b0: 80808080 .word 0x80808080 + +01f476b4 <_Balloc>: + 1f476b4: e590204c ldr r2, [r0, #76] ; 0x4c + 1f476b8: e3520000 cmp r2, #0 + 1f476bc: e92d4070 push {r4, r5, r6, lr} + 1f476c0: e1a05000 mov r5, r0 + 1f476c4: e1a04001 mov r4, r1 + 1f476c8: 0a00000a beq 1f476f8 <_Balloc+0x44> + 1f476cc: e7923104 ldr r3, [r2, r4, lsl #2] + 1f476d0: e3530000 cmp r3, #0 + 1f476d4: 0a000010 beq 1f4771c <_Balloc+0x68> + 1f476d8: e5931000 ldr r1, [r3] + 1f476dc: e7821104 str r1, [r2, r4, lsl #2] + 1f476e0: e3a02000 mov r2, #0 + 1f476e4: e1a00003 mov r0, r3 + 1f476e8: e5832010 str r2, [r3, #16] + 1f476ec: e583200c str r2, [r3, #12] + 1f476f0: e8bd4070 pop {r4, r5, r6, lr} + 1f476f4: e12fff1e bx lr + 1f476f8: e3a02021 mov r2, #33 ; 0x21 + 1f476fc: e3a01004 mov r1, #4 + 1f47700: eb000e6c bl 1f4b0b8 <_calloc_r> + 1f47704: e3500000 cmp r0, #0 + 1f47708: e585004c str r0, [r5, #76] ; 0x4c + 1f4770c: 11a02000 movne r2, r0 + 1f47710: 1affffed bne 1f476cc <_Balloc+0x18> + 1f47714: e3a00000 mov r0, #0 + 1f47718: eafffff4 b 1f476f0 <_Balloc+0x3c> + 1f4771c: e3a01001 mov r1, #1 + 1f47720: e1a06411 lsl r6, r1, r4 + 1f47724: e2862005 add r2, r6, #5 + 1f47728: e1a00005 mov r0, r5 + 1f4772c: e1a02102 lsl r2, r2, #2 + 1f47730: eb000e60 bl 1f4b0b8 <_calloc_r> + 1f47734: e2503000 subs r3, r0, #0 + 1f47738: 0afffff5 beq 1f47714 <_Balloc+0x60> + 1f4773c: e9830050 stmib r3, {r4, r6} + 1f47740: eaffffe6 b 1f476e0 <_Balloc+0x2c> + +01f47744 <_Bfree>: + 1f47744: e3510000 cmp r1, #0 + 1f47748: 1590304c ldrne r3, [r0, #76] ; 0x4c + 1f4774c: 15912004 ldrne r2, [r1, #4] + 1f47750: 17930102 ldrne r0, [r3, r2, lsl #2] + 1f47754: 15810000 strne r0, [r1] + 1f47758: 17831102 strne r1, [r3, r2, lsl #2] + 1f4775c: e12fff1e bx lr + +01f47760 <__multadd>: + 1f47760: e92d40f0 push {r4, r5, r6, r7, lr} + 1f47764: e1a04001 mov r4, r1 + 1f47768: e1a05000 mov r5, r0 + 1f4776c: e3a0e000 mov lr, #0 + 1f47770: e5916010 ldr r6, [r1, #16] + 1f47774: e24dd00c sub sp, sp, #12 + 1f47778: e281c014 add ip, r1, #20 + 1f4777c: e59c0000 ldr r0, [ip] + 1f47780: e1a01800 lsl r1, r0, #16 + 1f47784: e1a01821 lsr r1, r1, #16 + 1f47788: e0213192 mla r1, r2, r1, r3 + 1f4778c: e1a00820 lsr r0, r0, #16 + 1f47790: e1a03821 lsr r3, r1, #16 + 1f47794: e0233092 mla r3, r2, r0, r3 + 1f47798: e1a00801 lsl r0, r1, #16 + 1f4779c: e28ee001 add lr, lr, #1 + 1f477a0: e1a00820 lsr r0, r0, #16 + 1f477a4: e0800803 add r0, r0, r3, lsl #16 + 1f477a8: e156000e cmp r6, lr + 1f477ac: e48c0004 str r0, [ip], #4 + 1f477b0: e1a03823 lsr r3, r3, #16 + 1f477b4: cafffff0 bgt 1f4777c <__multadd+0x1c> + 1f477b8: e3530000 cmp r3, #0 + 1f477bc: 0a000006 beq 1f477dc <__multadd+0x7c> + 1f477c0: e5942008 ldr r2, [r4, #8] + 1f477c4: e1560002 cmp r6, r2 + 1f477c8: aa000007 bge 1f477ec <__multadd+0x8c> + 1f477cc: e0842106 add r2, r4, r6, lsl #2 + 1f477d0: e2866001 add r6, r6, #1 + 1f477d4: e5823014 str r3, [r2, #20] + 1f477d8: e5846010 str r6, [r4, #16] + 1f477dc: e1a00004 mov r0, r4 + 1f477e0: e28dd00c add sp, sp, #12 + 1f477e4: e8bd40f0 pop {r4, r5, r6, r7, lr} + 1f477e8: e12fff1e bx lr + 1f477ec: e5941004 ldr r1, [r4, #4] + 1f477f0: e1a00005 mov r0, r5 + 1f477f4: e2811001 add r1, r1, #1 + 1f477f8: e58d3004 str r3, [sp, #4] + 1f477fc: ebffffac bl 1f476b4 <_Balloc> + 1f47800: e1a07000 mov r7, r0 + 1f47804: e5942010 ldr r2, [r4, #16] + 1f47808: e2822002 add r2, r2, #2 + 1f4780c: e284100c add r1, r4, #12 + 1f47810: e1a02102 lsl r2, r2, #2 + 1f47814: e280000c add r0, r0, #12 + 1f47818: ebffdd78 bl 1f3ee00 + 1f4781c: e595204c ldr r2, [r5, #76] ; 0x4c + 1f47820: e5941004 ldr r1, [r4, #4] + 1f47824: e7920101 ldr r0, [r2, r1, lsl #2] + 1f47828: e59d3004 ldr r3, [sp, #4] + 1f4782c: e5840000 str r0, [r4] + 1f47830: e7824101 str r4, [r2, r1, lsl #2] + 1f47834: e1a04007 mov r4, r7 + 1f47838: eaffffe3 b 1f477cc <__multadd+0x6c> + +01f4783c <__s2b>: + 1f4783c: e59fc0dc ldr ip, [pc, #220] ; 1f47920 <__s2b+0xe4> + 1f47840: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f47844: e1a06003 mov r6, r3 + 1f47848: e2833008 add r3, r3, #8 + 1f4784c: e0ccec93 smull lr, ip, r3, ip + 1f47850: e1a03fc3 asr r3, r3, #31 + 1f47854: e063c0cc rsb ip, r3, ip, asr #1 + 1f47858: e35c0001 cmp ip, #1 + 1f4785c: e1a05000 mov r5, r0 + 1f47860: e1a04001 mov r4, r1 + 1f47864: e1a07002 mov r7, r2 + 1f47868: e59d8020 ldr r8, [sp, #32] + 1f4786c: da000029 ble 1f47918 <__s2b+0xdc> + 1f47870: e3a03001 mov r3, #1 + 1f47874: e3a01000 mov r1, #0 + 1f47878: e1a03083 lsl r3, r3, #1 + 1f4787c: e15c0003 cmp ip, r3 + 1f47880: e2811001 add r1, r1, #1 + 1f47884: cafffffb bgt 1f47878 <__s2b+0x3c> + 1f47888: e1a00005 mov r0, r5 + 1f4788c: ebffff88 bl 1f476b4 <_Balloc> + 1f47890: e3a03001 mov r3, #1 + 1f47894: e3570009 cmp r7, #9 + 1f47898: e5808014 str r8, [r0, #20] + 1f4789c: e5803010 str r3, [r0, #16] + 1f478a0: d3a07009 movle r7, #9 + 1f478a4: d284400a addle r4, r4, #10 + 1f478a8: da00000c ble 1f478e0 <__s2b+0xa4> + 1f478ac: e2849009 add r9, r4, #9 + 1f478b0: e1a08009 mov r8, r9 + 1f478b4: e0844007 add r4, r4, r7 + 1f478b8: e4d83001 ldrb r3, [r8], #1 + 1f478bc: e1a01000 mov r1, r0 + 1f478c0: e2433030 sub r3, r3, #48 ; 0x30 + 1f478c4: e3a0200a mov r2, #10 + 1f478c8: e1a00005 mov r0, r5 + 1f478cc: ebffffa3 bl 1f47760 <__multadd> + 1f478d0: e1580004 cmp r8, r4 + 1f478d4: 1afffff7 bne 1f478b8 <__s2b+0x7c> + 1f478d8: e0894007 add r4, r9, r7 + 1f478dc: e2444008 sub r4, r4, #8 + 1f478e0: e1560007 cmp r6, r7 + 1f478e4: da000009 ble 1f47910 <__s2b+0xd4> + 1f478e8: e0676006 rsb r6, r7, r6 + 1f478ec: e0846006 add r6, r4, r6 + 1f478f0: e4d43001 ldrb r3, [r4], #1 + 1f478f4: e1a01000 mov r1, r0 + 1f478f8: e2433030 sub r3, r3, #48 ; 0x30 + 1f478fc: e3a0200a mov r2, #10 + 1f47900: e1a00005 mov r0, r5 + 1f47904: ebffff95 bl 1f47760 <__multadd> + 1f47908: e1560004 cmp r6, r4 + 1f4790c: 1afffff7 bne 1f478f0 <__s2b+0xb4> + 1f47910: e8bd47f0 pop {r4, r5, r6, r7, r8, r9, sl, lr} + 1f47914: e12fff1e bx lr + 1f47918: e3a01000 mov r1, #0 + 1f4791c: eaffffd9 b 1f47888 <__s2b+0x4c> + 1f47920: 38e38e39 .word 0x38e38e39 + +01f47924 <__hi0bits>: + 1f47924: e1b03820 lsrs r3, r0, #16 + 1f47928: 03a03010 moveq r3, #16 + 1f4792c: 01a00800 lsleq r0, r0, #16 + 1f47930: 13a03000 movne r3, #0 + 1f47934: e31004ff tst r0, #-16777216 ; 0xff000000 + 1f47938: 01a00400 lsleq r0, r0, #8 + 1f4793c: 02833008 addeq r3, r3, #8 + 1f47940: e310020f tst r0, #-268435456 ; 0xf0000000 + 1f47944: 01a00200 lsleq r0, r0, #4 + 1f47948: 02833004 addeq r3, r3, #4 + 1f4794c: e3100103 tst r0, #-1073741824 ; 0xc0000000 + 1f47950: 01a00100 lsleq r0, r0, #2 + 1f47954: 02833002 addeq r3, r3, #2 + 1f47958: e3500000 cmp r0, #0 + 1f4795c: ba000005 blt 1f47978 <__hi0bits+0x54> + 1f47960: e3100101 tst r0, #1073741824 ; 0x40000000 + 1f47964: 1a000001 bne 1f47970 <__hi0bits+0x4c> + 1f47968: e3a00020 mov r0, #32 + 1f4796c: e12fff1e bx lr + 1f47970: e2830001 add r0, r3, #1 + 1f47974: e12fff1e bx lr + 1f47978: e1a00003 mov r0, r3 + 1f4797c: e12fff1e bx lr + +01f47980 <__lo0bits>: + 1f47980: e5903000 ldr r3, [r0] + 1f47984: e2132007 ands r2, r3, #7 + 1f47988: 0a000009 beq 1f479b4 <__lo0bits+0x34> + 1f4798c: e3130001 tst r3, #1 + 1f47990: 1a00001d bne 1f47a0c <__lo0bits+0x8c> + 1f47994: e3130002 tst r3, #2 + 1f47998: 11a030a3 lsrne r3, r3, #1 + 1f4799c: 01a03123 lsreq r3, r3, #2 + 1f479a0: 15803000 strne r3, [r0] + 1f479a4: 05803000 streq r3, [r0] + 1f479a8: 13a00001 movne r0, #1 + 1f479ac: 03a00002 moveq r0, #2 + 1f479b0: e12fff1e bx lr + 1f479b4: e1b01803 lsls r1, r3, #16 + 1f479b8: 03a02010 moveq r2, #16 + 1f479bc: 01a03823 lsreq r3, r3, #16 + 1f479c0: e31300ff tst r3, #255 ; 0xff + 1f479c4: 01a03423 lsreq r3, r3, #8 + 1f479c8: 02822008 addeq r2, r2, #8 + 1f479cc: e313000f tst r3, #15 + 1f479d0: 01a03223 lsreq r3, r3, #4 + 1f479d4: 02822004 addeq r2, r2, #4 + 1f479d8: e3130003 tst r3, #3 + 1f479dc: 01a03123 lsreq r3, r3, #2 + 1f479e0: 02822002 addeq r2, r2, #2 + 1f479e4: e3130001 tst r3, #1 + 1f479e8: 1a000004 bne 1f47a00 <__lo0bits+0x80> + 1f479ec: e1b030a3 lsrs r3, r3, #1 + 1f479f0: 1a000001 bne 1f479fc <__lo0bits+0x7c> + 1f479f4: e3a00020 mov r0, #32 + 1f479f8: e12fff1e bx lr + 1f479fc: e2822001 add r2, r2, #1 + 1f47a00: e5803000 str r3, [r0] + 1f47a04: e1a00002 mov r0, r2 + 1f47a08: e12fff1e bx lr + 1f47a0c: e3a00000 mov r0, #0 + 1f47a10: e12fff1e bx lr + +01f47a14 <__i2b>: + 1f47a14: e92d4010 push {r4, lr} + 1f47a18: e1a04001 mov r4, r1 + 1f47a1c: e3a01001 mov r1, #1 + 1f47a20: ebffff23 bl 1f476b4 <_Balloc> + 1f47a24: e3a02001 mov r2, #1 + 1f47a28: e5804014 str r4, [r0, #20] + 1f47a2c: e5802010 str r2, [r0, #16] + 1f47a30: e8bd4010 pop {r4, lr} + 1f47a34: e12fff1e bx lr + +01f47a38 <__multiply>: + 1f47a38: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f47a3c: e5919010 ldr r9, [r1, #16] + 1f47a40: e5926010 ldr r6, [r2, #16] + 1f47a44: e1590006 cmp r9, r6 + 1f47a48: e24dd014 sub sp, sp, #20 + 1f47a4c: e1a04001 mov r4, r1 + 1f47a50: e1a05002 mov r5, r2 + 1f47a54: aa000004 bge 1f47a6c <__multiply+0x34> + 1f47a58: e1a02009 mov r2, r9 + 1f47a5c: e1a04005 mov r4, r5 + 1f47a60: e1a09006 mov r9, r6 + 1f47a64: e1a05001 mov r5, r1 + 1f47a68: e1a06002 mov r6, r2 + 1f47a6c: e5943008 ldr r3, [r4, #8] + 1f47a70: e5941004 ldr r1, [r4, #4] + 1f47a74: e0898006 add r8, r9, r6 + 1f47a78: e1580003 cmp r8, r3 + 1f47a7c: c2811001 addgt r1, r1, #1 + 1f47a80: ebffff0b bl 1f476b4 <_Balloc> + 1f47a84: e280a014 add sl, r0, #20 + 1f47a88: e08ab108 add fp, sl, r8, lsl #2 + 1f47a8c: e15a000b cmp sl, fp + 1f47a90: e1a03000 mov r3, r0 + 1f47a94: e58d0004 str r0, [sp, #4] + 1f47a98: 31a0300a movcc r3, sl + 1f47a9c: 33a01000 movcc r1, #0 + 1f47aa0: 2a000002 bcs 1f47ab0 <__multiply+0x78> + 1f47aa4: e4831004 str r1, [r3], #4 + 1f47aa8: e15b0003 cmp fp, r3 + 1f47aac: 8afffffc bhi 1f47aa4 <__multiply+0x6c> + 1f47ab0: e2852014 add r2, r5, #20 + 1f47ab4: e0823106 add r3, r2, r6, lsl #2 + 1f47ab8: e1a01003 mov r1, r3 + 1f47abc: e1520003 cmp r2, r3 + 1f47ac0: e2843014 add r3, r4, #20 + 1f47ac4: 358db008 strcc fp, [sp, #8] + 1f47ac8: 358d800c strcc r8, [sp, #12] + 1f47acc: e0839109 add r9, r3, r9, lsl #2 + 1f47ad0: 31a0b001 movcc fp, r1 + 1f47ad4: 31a08003 movcc r8, r3 + 1f47ad8: 2a000040 bcs 1f47be0 <__multiply+0x1a8> + 1f47adc: e4926004 ldr r6, [r2], #4 + 1f47ae0: e1a07806 lsl r7, r6, #16 + 1f47ae4: e1b07827 lsrs r7, r7, #16 + 1f47ae8: 0a00001a beq 1f47b58 <__multiply+0x120> + 1f47aec: e1a06008 mov r6, r8 + 1f47af0: e1a0500a mov r5, sl + 1f47af4: e3a00000 mov r0, #0 + 1f47af8: ea000000 b 1f47b00 <__multiply+0xc8> + 1f47afc: e1a05001 mov r5, r1 + 1f47b00: e1a01005 mov r1, r5 + 1f47b04: e4963004 ldr r3, [r6], #4 + 1f47b08: e595e000 ldr lr, [r5] + 1f47b0c: e1a04803 lsl r4, r3, #16 + 1f47b10: e1a0c80e lsl ip, lr, #16 + 1f47b14: e1a04824 lsr r4, r4, #16 + 1f47b18: e1a0c82c lsr ip, ip, #16 + 1f47b1c: e02cc497 mla ip, r7, r4, ip + 1f47b20: e1a03823 lsr r3, r3, #16 + 1f47b24: e1a0e82e lsr lr, lr, #16 + 1f47b28: e023e397 mla r3, r7, r3, lr + 1f47b2c: e08c0000 add r0, ip, r0 + 1f47b30: e1a0c800 lsl ip, r0, #16 + 1f47b34: e0830820 add r0, r3, r0, lsr #16 + 1f47b38: e1a0382c lsr r3, ip, #16 + 1f47b3c: e1833800 orr r3, r3, r0, lsl #16 + 1f47b40: e1590006 cmp r9, r6 + 1f47b44: e1a00820 lsr r0, r0, #16 + 1f47b48: e4813004 str r3, [r1], #4 + 1f47b4c: 8affffea bhi 1f47afc <__multiply+0xc4> + 1f47b50: e5850004 str r0, [r5, #4] + 1f47b54: e5126004 ldr r6, [r2, #-4] + 1f47b58: e1b06826 lsrs r6, r6, #16 + 1f47b5c: 0a00001a beq 1f47bcc <__multiply+0x194> + 1f47b60: e59a3000 ldr r3, [sl] + 1f47b64: e1a0400a mov r4, sl + 1f47b68: e1a05003 mov r5, r3 + 1f47b6c: e1a0c008 mov ip, r8 + 1f47b70: e3a00000 mov r0, #0 + 1f47b74: ea000000 b 1f47b7c <__multiply+0x144> + 1f47b78: e1a0400e mov r4, lr + 1f47b7c: e1a0e004 mov lr, r4 + 1f47b80: e1dc10b0 ldrh r1, [ip] + 1f47b84: e1a05825 lsr r5, r5, #16 + 1f47b88: e0255196 mla r5, r6, r1, r5 + 1f47b8c: e1a01803 lsl r1, r3, #16 + 1f47b90: e0850000 add r0, r5, r0 + 1f47b94: e1a01821 lsr r1, r1, #16 + 1f47b98: e1813800 orr r3, r1, r0, lsl #16 + 1f47b9c: e48e3004 str r3, [lr], #4 + 1f47ba0: e5945004 ldr r5, [r4, #4] + 1f47ba4: e49c1004 ldr r1, [ip], #4 + 1f47ba8: e1a03805 lsl r3, r5, #16 + 1f47bac: e1a03823 lsr r3, r3, #16 + 1f47bb0: e1a01821 lsr r1, r1, #16 + 1f47bb4: e0213196 mla r1, r6, r1, r3 + 1f47bb8: e159000c cmp r9, ip + 1f47bbc: e0813820 add r3, r1, r0, lsr #16 + 1f47bc0: e1a00823 lsr r0, r3, #16 + 1f47bc4: 8affffeb bhi 1f47b78 <__multiply+0x140> + 1f47bc8: e5843004 str r3, [r4, #4] + 1f47bcc: e15b0002 cmp fp, r2 + 1f47bd0: e28aa004 add sl, sl, #4 + 1f47bd4: 8affffc0 bhi 1f47adc <__multiply+0xa4> + 1f47bd8: e59db008 ldr fp, [sp, #8] + 1f47bdc: e59d800c ldr r8, [sp, #12] + 1f47be0: e3580000 cmp r8, #0 + 1f47be4: da000009 ble 1f47c10 <__multiply+0x1d8> + 1f47be8: e51b3004 ldr r3, [fp, #-4] + 1f47bec: e3530000 cmp r3, #0 + 1f47bf0: e24bb004 sub fp, fp, #4 + 1f47bf4: 0a000003 beq 1f47c08 <__multiply+0x1d0> + 1f47bf8: ea000004 b 1f47c10 <__multiply+0x1d8> + 1f47bfc: e53b3004 ldr r3, [fp, #-4]! + 1f47c00: e3530000 cmp r3, #0 + 1f47c04: 1a000001 bne 1f47c10 <__multiply+0x1d8> + 1f47c08: e2588001 subs r8, r8, #1 + 1f47c0c: 1afffffa bne 1f47bfc <__multiply+0x1c4> + 1f47c10: e59d3004 ldr r3, [sp, #4] + 1f47c14: e1a00003 mov r0, r3 + 1f47c18: e5838010 str r8, [r3, #16] + 1f47c1c: e28dd014 add sp, sp, #20 + 1f47c20: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f47c24: e12fff1e bx lr + +01f47c28 <__pow5mult>: + 1f47c28: e2123003 ands r3, r2, #3 + 1f47c2c: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f47c30: e1a04002 mov r4, r2 + 1f47c34: e1a07000 mov r7, r0 + 1f47c38: 01a06001 moveq r6, r1 + 1f47c3c: 1a000025 bne 1f47cd8 <__pow5mult+0xb0> + 1f47c40: e1b04144 asrs r4, r4, #2 + 1f47c44: 0a000019 beq 1f47cb0 <__pow5mult+0x88> + 1f47c48: e5975048 ldr r5, [r7, #72] ; 0x48 + 1f47c4c: e3550000 cmp r5, #0 + 1f47c50: 0a000027 beq 1f47cf4 <__pow5mult+0xcc> + 1f47c54: e3a08000 mov r8, #0 + 1f47c58: ea000005 b 1f47c74 <__pow5mult+0x4c> + 1f47c5c: e1b040c4 asrs r4, r4, #1 + 1f47c60: 0a000012 beq 1f47cb0 <__pow5mult+0x88> + 1f47c64: e5950000 ldr r0, [r5] + 1f47c68: e3500000 cmp r0, #0 + 1f47c6c: 0a000012 beq 1f47cbc <__pow5mult+0x94> + 1f47c70: e1a05000 mov r5, r0 + 1f47c74: e3140001 tst r4, #1 + 1f47c78: 0afffff7 beq 1f47c5c <__pow5mult+0x34> + 1f47c7c: e1a02005 mov r2, r5 + 1f47c80: e1a01006 mov r1, r6 + 1f47c84: e1a00007 mov r0, r7 + 1f47c88: ebffff6a bl 1f47a38 <__multiply> + 1f47c8c: e3560000 cmp r6, #0 + 1f47c90: 15962004 ldrne r2, [r6, #4] + 1f47c94: 1597304c ldrne r3, [r7, #76] ; 0x4c + 1f47c98: 17931102 ldrne r1, [r3, r2, lsl #2] + 1f47c9c: 15861000 strne r1, [r6] + 1f47ca0: 17836102 strne r6, [r3, r2, lsl #2] + 1f47ca4: e1b040c4 asrs r4, r4, #1 + 1f47ca8: e1a06000 mov r6, r0 + 1f47cac: 1affffec bne 1f47c64 <__pow5mult+0x3c> + 1f47cb0: e1a00006 mov r0, r6 + 1f47cb4: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f47cb8: e12fff1e bx lr + 1f47cbc: e1a02005 mov r2, r5 + 1f47cc0: e1a01005 mov r1, r5 + 1f47cc4: e1a00007 mov r0, r7 + 1f47cc8: ebffff5a bl 1f47a38 <__multiply> + 1f47ccc: e5850000 str r0, [r5] + 1f47cd0: e5808000 str r8, [r0] + 1f47cd4: eaffffe5 b 1f47c70 <__pow5mult+0x48> + 1f47cd8: e59f2044 ldr r2, [pc, #68] ; 1f47d24 <__pow5mult+0xfc> + 1f47cdc: e2433001 sub r3, r3, #1 + 1f47ce0: e7922103 ldr r2, [r2, r3, lsl #2] + 1f47ce4: e3a03000 mov r3, #0 + 1f47ce8: ebfffe9c bl 1f47760 <__multadd> + 1f47cec: e1a06000 mov r6, r0 + 1f47cf0: eaffffd2 b 1f47c40 <__pow5mult+0x18> + 1f47cf4: e3a01001 mov r1, #1 + 1f47cf8: e1a00007 mov r0, r7 + 1f47cfc: ebfffe6c bl 1f476b4 <_Balloc> + 1f47d00: e3a01001 mov r1, #1 + 1f47d04: e3a03000 mov r3, #0 + 1f47d08: e59f2018 ldr r2, [pc, #24] ; 1f47d28 <__pow5mult+0x100> + 1f47d0c: e5801010 str r1, [r0, #16] + 1f47d10: e5802014 str r2, [r0, #20] + 1f47d14: e1a05000 mov r5, r0 + 1f47d18: e5870048 str r0, [r7, #72] ; 0x48 + 1f47d1c: e5803000 str r3, [r0] + 1f47d20: eaffffcb b 1f47c54 <__pow5mult+0x2c> + 1f47d24: 01f6307c .word 0x01f6307c + 1f47d28: 00000271 .word 0x00000271 + +01f47d2c <__lshift>: + 1f47d2c: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f47d30: e5918010 ldr r8, [r1, #16] + 1f47d34: e1a042c2 asr r4, r2, #5 + 1f47d38: e5913008 ldr r3, [r1, #8] + 1f47d3c: e0848008 add r8, r4, r8 + 1f47d40: e2885001 add r5, r8, #1 + 1f47d44: e1550003 cmp r5, r3 + 1f47d48: e1a06001 mov r6, r1 + 1f47d4c: e1a09002 mov r9, r2 + 1f47d50: e1a07000 mov r7, r0 + 1f47d54: e5911004 ldr r1, [r1, #4] + 1f47d58: da000003 ble 1f47d6c <__lshift+0x40> + 1f47d5c: e1a03083 lsl r3, r3, #1 + 1f47d60: e1550003 cmp r5, r3 + 1f47d64: e2811001 add r1, r1, #1 + 1f47d68: cafffffb bgt 1f47d5c <__lshift+0x30> + 1f47d6c: e1a00007 mov r0, r7 + 1f47d70: ebfffe4f bl 1f476b4 <_Balloc> + 1f47d74: e3540000 cmp r4, #0 + 1f47d78: e2801014 add r1, r0, #20 + 1f47d7c: da000025 ble 1f47e18 <__lshift+0xec> + 1f47d80: e3a02000 mov r2, #0 + 1f47d84: e0813104 add r3, r1, r4, lsl #2 + 1f47d88: e4812004 str r2, [r1], #4 + 1f47d8c: e1530001 cmp r3, r1 + 1f47d90: 1afffffc bne 1f47d88 <__lshift+0x5c> + 1f47d94: e596e010 ldr lr, [r6, #16] + 1f47d98: e2861014 add r1, r6, #20 + 1f47d9c: e219901f ands r9, r9, #31 + 1f47da0: e081e10e add lr, r1, lr, lsl #2 + 1f47da4: 0a000015 beq 1f47e00 <__lshift+0xd4> + 1f47da8: e3a0c000 mov ip, #0 + 1f47dac: e2692020 rsb r2, r9, #32 + 1f47db0: e5914000 ldr r4, [r1] + 1f47db4: e18cc914 orr ip, ip, r4, lsl r9 + 1f47db8: e1a04003 mov r4, r3 + 1f47dbc: e483c004 str ip, [r3], #4 + 1f47dc0: e491c004 ldr ip, [r1], #4 + 1f47dc4: e15e0001 cmp lr, r1 + 1f47dc8: e1a0c23c lsr ip, ip, r2 + 1f47dcc: 8afffff7 bhi 1f47db0 <__lshift+0x84> + 1f47dd0: e35c0000 cmp ip, #0 + 1f47dd4: e584c004 str ip, [r4, #4] + 1f47dd8: 12885002 addne r5, r8, #2 + 1f47ddc: e597304c ldr r3, [r7, #76] ; 0x4c + 1f47de0: e5962004 ldr r2, [r6, #4] + 1f47de4: e7931102 ldr r1, [r3, r2, lsl #2] + 1f47de8: e2455001 sub r5, r5, #1 + 1f47dec: e5805010 str r5, [r0, #16] + 1f47df0: e5861000 str r1, [r6] + 1f47df4: e7836102 str r6, [r3, r2, lsl #2] + 1f47df8: e8bd47f0 pop {r4, r5, r6, r7, r8, r9, sl, lr} + 1f47dfc: e12fff1e bx lr + 1f47e00: e2433004 sub r3, r3, #4 + 1f47e04: e4912004 ldr r2, [r1], #4 + 1f47e08: e15e0001 cmp lr, r1 + 1f47e0c: e5a32004 str r2, [r3, #4]! + 1f47e10: 8afffffb bhi 1f47e04 <__lshift+0xd8> + 1f47e14: eafffff0 b 1f47ddc <__lshift+0xb0> + 1f47e18: e1a03001 mov r3, r1 + 1f47e1c: eaffffdc b 1f47d94 <__lshift+0x68> + +01f47e20 <__mcmp>: + 1f47e20: e5902010 ldr r2, [r0, #16] + 1f47e24: e5913010 ldr r3, [r1, #16] + 1f47e28: e0522003 subs r2, r2, r3 + 1f47e2c: 1a00000e bne 1f47e6c <__mcmp+0x4c> + 1f47e30: e1a03103 lsl r3, r3, #2 + 1f47e34: e2800014 add r0, r0, #20 + 1f47e38: e2811014 add r1, r1, #20 + 1f47e3c: e0811003 add r1, r1, r3 + 1f47e40: e0803003 add r3, r0, r3 + 1f47e44: ea000001 b 1f47e50 <__mcmp+0x30> + 1f47e48: e1500003 cmp r0, r3 + 1f47e4c: 2a000008 bcs 1f47e74 <__mcmp+0x54> + 1f47e50: e533c004 ldr ip, [r3, #-4]! + 1f47e54: e5312004 ldr r2, [r1, #-4]! + 1f47e58: e15c0002 cmp ip, r2 + 1f47e5c: 0afffff9 beq 1f47e48 <__mcmp+0x28> + 1f47e60: 3a000005 bcc 1f47e7c <__mcmp+0x5c> + 1f47e64: e3a00001 mov r0, #1 + 1f47e68: e12fff1e bx lr + 1f47e6c: e1a00002 mov r0, r2 + 1f47e70: e12fff1e bx lr + 1f47e74: e3a00000 mov r0, #0 + 1f47e78: e12fff1e bx lr + 1f47e7c: e3e00000 mvn r0, #0 + 1f47e80: e12fff1e bx lr + +01f47e84 <__mdiff>: + 1f47e84: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f47e88: e5913010 ldr r3, [r1, #16] + 1f47e8c: e1a05001 mov r5, r1 + 1f47e90: e5921010 ldr r1, [r2, #16] + 1f47e94: e0613003 rsb r3, r1, r3 + 1f47e98: e3530000 cmp r3, #0 + 1f47e9c: e1a06002 mov r6, r2 + 1f47ea0: 1a000012 bne 1f47ef0 <__mdiff+0x6c> + 1f47ea4: e1a01101 lsl r1, r1, #2 + 1f47ea8: e285e014 add lr, r5, #20 + 1f47eac: e2824014 add r4, r2, #20 + 1f47eb0: e08e3001 add r3, lr, r1 + 1f47eb4: e0841001 add r1, r4, r1 + 1f47eb8: ea000001 b 1f47ec4 <__mdiff+0x40> + 1f47ebc: e15e0003 cmp lr, r3 + 1f47ec0: 2a000048 bcs 1f47fe8 <__mdiff+0x164> + 1f47ec4: e533c004 ldr ip, [r3, #-4]! + 1f47ec8: e5312004 ldr r2, [r1, #-4]! + 1f47ecc: e15c0002 cmp ip, r2 + 1f47ed0: 0afffff9 beq 1f47ebc <__mdiff+0x38> + 1f47ed4: 2a00004b bcs 1f48008 <__mdiff+0x184> + 1f47ed8: e1a03005 mov r3, r5 + 1f47edc: e1a0800e mov r8, lr + 1f47ee0: e1a05006 mov r5, r6 + 1f47ee4: e3a0a001 mov sl, #1 + 1f47ee8: e1a06003 mov r6, r3 + 1f47eec: ea000003 b 1f47f00 <__mdiff+0x7c> + 1f47ef0: ba000048 blt 1f48018 <__mdiff+0x194> + 1f47ef4: e3a0a000 mov sl, #0 + 1f47ef8: e2854014 add r4, r5, #20 + 1f47efc: e2828014 add r8, r2, #20 + 1f47f00: e5951004 ldr r1, [r5, #4] + 1f47f04: ebfffdea bl 1f476b4 <_Balloc> + 1f47f08: e3a09000 mov r9, #0 + 1f47f0c: e5955010 ldr r5, [r5, #16] + 1f47f10: e5963010 ldr r3, [r6, #16] + 1f47f14: e580a00c str sl, [r0, #12] + 1f47f18: e1a07008 mov r7, r8 + 1f47f1c: e1a0e004 mov lr, r4 + 1f47f20: e0888103 add r8, r8, r3, lsl #2 + 1f47f24: e0844105 add r4, r4, r5, lsl #2 + 1f47f28: e280c014 add ip, r0, #20 + 1f47f2c: e49ea004 ldr sl, [lr], #4 + 1f47f30: e4971004 ldr r1, [r7], #4 + 1f47f34: e1a0680a lsl r6, sl, #16 + 1f47f38: e0893826 add r3, r9, r6, lsr #16 + 1f47f3c: e1a02801 lsl r2, r1, #16 + 1f47f40: e0436822 sub r6, r3, r2, lsr #16 + 1f47f44: e1a01821 lsr r1, r1, #16 + 1f47f48: e061182a rsb r1, r1, sl, lsr #16 + 1f47f4c: e1a03806 lsl r3, r6, #16 + 1f47f50: e0812846 add r2, r1, r6, asr #16 + 1f47f54: e1a03823 lsr r3, r3, #16 + 1f47f58: e1833802 orr r3, r3, r2, lsl #16 + 1f47f5c: e1580007 cmp r8, r7 + 1f47f60: e48c3004 str r3, [ip], #4 + 1f47f64: e1a09842 asr r9, r2, #16 + 1f47f68: 8affffef bhi 1f47f2c <__mdiff+0xa8> + 1f47f6c: e154000e cmp r4, lr + 1f47f70: 9a000012 bls 1f47fc0 <__mdiff+0x13c> + 1f47f74: e1a0800c mov r8, ip + 1f47f78: e1a0700e mov r7, lr + 1f47f7c: e4976004 ldr r6, [r7], #4 + 1f47f80: e1a03806 lsl r3, r6, #16 + 1f47f84: e0892823 add r2, r9, r3, lsr #16 + 1f47f88: e1a03802 lsl r3, r2, #16 + 1f47f8c: e1a01842 asr r1, r2, #16 + 1f47f90: e0812826 add r2, r1, r6, lsr #16 + 1f47f94: e1a03823 lsr r3, r3, #16 + 1f47f98: e1833802 orr r3, r3, r2, lsl #16 + 1f47f9c: e1540007 cmp r4, r7 + 1f47fa0: e4883004 str r3, [r8], #4 + 1f47fa4: e1a09842 asr r9, r2, #16 + 1f47fa8: 8afffff3 bhi 1f47f7c <__mdiff+0xf8> + 1f47fac: e1e0e00e mvn lr, lr + 1f47fb0: e08e4004 add r4, lr, r4 + 1f47fb4: e3c44003 bic r4, r4, #3 + 1f47fb8: e2844004 add r4, r4, #4 + 1f47fbc: e08cc004 add ip, ip, r4 + 1f47fc0: e3530000 cmp r3, #0 + 1f47fc4: e24cc004 sub ip, ip, #4 + 1f47fc8: 1a000003 bne 1f47fdc <__mdiff+0x158> + 1f47fcc: e53c3004 ldr r3, [ip, #-4]! + 1f47fd0: e3530000 cmp r3, #0 + 1f47fd4: e2455001 sub r5, r5, #1 + 1f47fd8: 0afffffb beq 1f47fcc <__mdiff+0x148> + 1f47fdc: e5805010 str r5, [r0, #16] + 1f47fe0: e8bd47f0 pop {r4, r5, r6, r7, r8, r9, sl, lr} + 1f47fe4: e12fff1e bx lr + 1f47fe8: e3a01000 mov r1, #0 + 1f47fec: ebfffdb0 bl 1f476b4 <_Balloc> + 1f47ff0: e3a02001 mov r2, #1 + 1f47ff4: e3a03000 mov r3, #0 + 1f47ff8: e5802010 str r2, [r0, #16] + 1f47ffc: e5803014 str r3, [r0, #20] + 1f48000: e8bd47f0 pop {r4, r5, r6, r7, r8, r9, sl, lr} + 1f48004: e12fff1e bx lr + 1f48008: e1a08004 mov r8, r4 + 1f4800c: e3a0a000 mov sl, #0 + 1f48010: e1a0400e mov r4, lr + 1f48014: eaffffb9 b 1f47f00 <__mdiff+0x7c> + 1f48018: e1a03005 mov r3, r5 + 1f4801c: e2858014 add r8, r5, #20 + 1f48020: e2864014 add r4, r6, #20 + 1f48024: e1a05006 mov r5, r6 + 1f48028: e3a0a001 mov sl, #1 + 1f4802c: e1a06003 mov r6, r3 + 1f48030: eaffffb2 b 1f47f00 <__mdiff+0x7c> + +01f48034 <__ulp>: + 1f48034: ee102a90 vmov r2, s1 + 1f48038: e59f3068 ldr r3, [pc, #104] ; 1f480a8 <__ulp+0x74> + 1f4803c: e0022003 and r2, r2, r3 + 1f48040: e242350d sub r3, r2, #54525952 ; 0x3400000 + 1f48044: e3530000 cmp r3, #0 + 1f48048: da000003 ble 1f4805c <__ulp+0x28> + 1f4804c: e3a00000 mov r0, #0 + 1f48050: e1a01003 mov r1, r3 + 1f48054: ec410b10 vmov d0, r0, r1 + 1f48058: e12fff1e bx lr + 1f4805c: e2633000 rsb r3, r3, #0 + 1f48060: e1a03a43 asr r3, r3, #20 + 1f48064: e3530013 cmp r3, #19 + 1f48068: da000009 ble 1f48094 <__ulp+0x60> + 1f4806c: e2433014 sub r3, r3, #20 + 1f48070: e353001e cmp r3, #30 + 1f48074: d3a02001 movle r2, #1 + 1f48078: c3a03001 movgt r3, #1 + 1f4807c: d263301f rsble r3, r3, #31 + 1f48080: d1a03312 lslle r3, r2, r3 + 1f48084: e3a01000 mov r1, #0 + 1f48088: e1a00003 mov r0, r3 + 1f4808c: ec410b10 vmov d0, r0, r1 + 1f48090: e12fff1e bx lr + 1f48094: e3a02702 mov r2, #524288 ; 0x80000 + 1f48098: e3a00000 mov r0, #0 + 1f4809c: e1a01352 asr r1, r2, r3 + 1f480a0: ec410b10 vmov d0, r0, r1 + 1f480a4: e12fff1e bx lr + 1f480a8: 7ff00000 .word 0x7ff00000 + +01f480ac <__b2d>: + 1f480ac: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f480b0: e5906010 ldr r6, [r0, #16] + 1f480b4: e2802014 add r2, r0, #20 + 1f480b8: e0826106 add r6, r2, r6, lsl #2 + 1f480bc: e5167004 ldr r7, [r6, #-4] + 1f480c0: e1a00007 mov r0, r7 + 1f480c4: ebfffe16 bl 1f47924 <__hi0bits> + 1f480c8: e2603020 rsb r3, r0, #32 + 1f480cc: e350000a cmp r0, #10 + 1f480d0: e5813000 str r3, [r1] + 1f480d4: e2463004 sub r3, r6, #4 + 1f480d8: ca00000c bgt 1f48110 <__b2d+0x64> + 1f480dc: e260100b rsb r1, r0, #11 + 1f480e0: e1520003 cmp r2, r3 + 1f480e4: e1a03137 lsr r3, r7, r1 + 1f480e8: e38335ff orr r3, r3, #1069547520 ; 0x3fc00000 + 1f480ec: e3835603 orr r5, r3, #3145728 ; 0x300000 + 1f480f0: 23a03000 movcs r3, #0 + 1f480f4: 35163008 ldrcc r3, [r6, #-8] + 1f480f8: e2800015 add r0, r0, #21 + 1f480fc: 31a03133 lsrcc r3, r3, r1 + 1f48100: e1834017 orr r4, r3, r7, lsl r0 + 1f48104: ec454b10 vmov d0, r4, r5 + 1f48108: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f4810c: e12fff1e bx lr + 1f48110: e1520003 cmp r2, r3 + 1f48114: 2a00000e bcs 1f48154 <__b2d+0xa8> + 1f48118: e250300b subs r3, r0, #11 + 1f4811c: e5160008 ldr r0, [r6, #-8] + 1f48120: 0a00000d beq 1f4815c <__b2d+0xb0> + 1f48124: e1a07317 lsl r7, r7, r3 + 1f48128: e2461008 sub r1, r6, #8 + 1f4812c: e1520001 cmp r2, r1 + 1f48130: e38775ff orr r7, r7, #1069547520 ; 0x3fc00000 + 1f48134: e263c020 rsb ip, r3, #32 + 1f48138: e3877603 orr r7, r7, #3145728 ; 0x300000 + 1f4813c: 3516200c ldrcc r2, [r6, #-12] + 1f48140: e1875c30 orr r5, r7, r0, lsr ip + 1f48144: 31a00310 lslcc r0, r0, r3 + 1f48148: 21a00310 lslcs r0, r0, r3 + 1f4814c: 31800c32 orrcc r0, r0, r2, lsr ip + 1f48150: ea000003 b 1f48164 <__b2d+0xb8> + 1f48154: e250000b subs r0, r0, #11 + 1f48158: 1a000005 bne 1f48174 <__b2d+0xc8> + 1f4815c: e38775ff orr r7, r7, #1069547520 ; 0x3fc00000 + 1f48160: e3875603 orr r5, r7, #3145728 ; 0x300000 + 1f48164: e1a04000 mov r4, r0 + 1f48168: ec454b10 vmov d0, r4, r5 + 1f4816c: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f48170: e12fff1e bx lr + 1f48174: e1a00017 lsl r0, r7, r0 + 1f48178: e38005ff orr r0, r0, #1069547520 ; 0x3fc00000 + 1f4817c: e3805603 orr r5, r0, #3145728 ; 0x300000 + 1f48180: e3a00000 mov r0, #0 + 1f48184: eafffff6 b 1f48164 <__b2d+0xb8> + +01f48188 <__d2b>: + 1f48188: e92d43f0 push {r4, r5, r6, r7, r8, r9, lr} + 1f4818c: ee104a90 vmov r4, s1 + 1f48190: e24dd00c sub sp, sp, #12 + 1f48194: ee108a10 vmov r8, s0 + 1f48198: e1a06001 mov r6, r1 + 1f4819c: e3a01001 mov r1, #1 + 1f481a0: e1a05002 mov r5, r2 + 1f481a4: ebfffd42 bl 1f476b4 <_Balloc> + 1f481a8: e1a03084 lsl r3, r4, #1 + 1f481ac: e3c444ff bic r4, r4, #-16777216 ; 0xff000000 + 1f481b0: e1b09aa3 lsrs r9, r3, #21 + 1f481b4: e3c4460f bic r4, r4, #15728640 ; 0xf00000 + 1f481b8: 13844601 orrne r4, r4, #1048576 ; 0x100000 + 1f481bc: e3580000 cmp r8, #0 + 1f481c0: e1a07000 mov r7, r0 + 1f481c4: e58d4004 str r4, [sp, #4] + 1f481c8: 0a00001d beq 1f48244 <__d2b+0xbc> + 1f481cc: e28d0008 add r0, sp, #8 + 1f481d0: e5208008 str r8, [r0, #-8]! + 1f481d4: ebfffde9 bl 1f47980 <__lo0bits> + 1f481d8: e89d000c ldm sp, {r2, r3} + 1f481dc: e3500000 cmp r0, #0 + 1f481e0: 12601020 rsbne r1, r0, #32 + 1f481e4: 11822113 orrne r2, r2, r3, lsl r1 + 1f481e8: 11a03033 lsrne r3, r3, r0 + 1f481ec: 15872014 strne r2, [r7, #20] + 1f481f0: 05872014 streq r2, [r7, #20] + 1f481f4: 158d3004 strne r3, [sp, #4] + 1f481f8: e3530000 cmp r3, #0 + 1f481fc: 03a02001 moveq r2, #1 + 1f48200: 13a02002 movne r2, #2 + 1f48204: e3590000 cmp r9, #0 + 1f48208: e5873018 str r3, [r7, #24] + 1f4820c: e5872010 str r2, [r7, #16] + 1f48210: 1a000015 bne 1f4826c <__d2b+0xe4> + 1f48214: e2400e43 sub r0, r0, #1072 ; 0x430 + 1f48218: e0873102 add r3, r7, r2, lsl #2 + 1f4821c: e2400002 sub r0, r0, #2 + 1f48220: e5860000 str r0, [r6] + 1f48224: e5930010 ldr r0, [r3, #16] + 1f48228: ebfffdbd bl 1f47924 <__hi0bits> + 1f4822c: e0600282 rsb r0, r0, r2, lsl #5 + 1f48230: e5850000 str r0, [r5] + 1f48234: e1a00007 mov r0, r7 + 1f48238: e28dd00c add sp, sp, #12 + 1f4823c: e8bd43f0 pop {r4, r5, r6, r7, r8, r9, lr} + 1f48240: e12fff1e bx lr + 1f48244: e28d0004 add r0, sp, #4 + 1f48248: ebfffdcc bl 1f47980 <__lo0bits> + 1f4824c: e3a03001 mov r3, #1 + 1f48250: e59d1004 ldr r1, [sp, #4] + 1f48254: e3590000 cmp r9, #0 + 1f48258: e1a02003 mov r2, r3 + 1f4825c: e5873010 str r3, [r7, #16] + 1f48260: e5871014 str r1, [r7, #20] + 1f48264: e2800020 add r0, r0, #32 + 1f48268: 0affffe9 beq 1f48214 <__d2b+0x8c> + 1f4826c: e2493e43 sub r3, r9, #1072 ; 0x430 + 1f48270: e2433003 sub r3, r3, #3 + 1f48274: e0833000 add r3, r3, r0 + 1f48278: e2600035 rsb r0, r0, #53 ; 0x35 + 1f4827c: e5863000 str r3, [r6] + 1f48280: e5850000 str r0, [r5] + 1f48284: e1a00007 mov r0, r7 + 1f48288: e28dd00c add sp, sp, #12 + 1f4828c: e8bd43f0 pop {r4, r5, r6, r7, r8, r9, lr} + 1f48290: e12fff1e bx lr + +01f48294 <__ratio>: + 1f48294: e92d4030 push {r4, r5, lr} + 1f48298: e24dd01c sub sp, sp, #28 + 1f4829c: e1a04001 mov r4, r1 + 1f482a0: e28d1010 add r1, sp, #16 + 1f482a4: e1a05000 mov r5, r0 + 1f482a8: ebffff7f bl 1f480ac <__b2d> + 1f482ac: e1a00004 mov r0, r4 + 1f482b0: e28d1014 add r1, sp, #20 + 1f482b4: ed8d0b00 vstr d0, [sp] + 1f482b8: ebffff7b bl 1f480ac <__b2d> + 1f482bc: e28d2010 add r2, sp, #16 + 1f482c0: e5940010 ldr r0, [r4, #16] + 1f482c4: e5951010 ldr r1, [r5, #16] + 1f482c8: e892000c ldm r2, {r2, r3} + 1f482cc: ed8d0b02 vstr d0, [sp, #8] + 1f482d0: e0601001 rsb r1, r0, r1 + 1f482d4: e0633002 rsb r3, r3, r2 + 1f482d8: e0833281 add r3, r3, r1, lsl #5 + 1f482dc: e28d5008 add r5, sp, #8 + 1f482e0: e8950030 ldm r5, {r4, r5} + 1f482e4: e89d0003 ldm sp, {r0, r1} + 1f482e8: e3530000 cmp r3, #0 + 1f482ec: c0811a03 addgt r1, r1, r3, lsl #20 + 1f482f0: d0455a03 suble r5, r5, r3, lsl #20 + 1f482f4: c88d0003 stmgt sp, {r0, r1} + 1f482f8: d58d4008 strle r4, [sp, #8] + 1f482fc: d58d500c strle r5, [sp, #12] + 1f48300: ed9d7b00 vldr d7, [sp] + 1f48304: ed9d6b02 vldr d6, [sp, #8] + 1f48308: ee870b06 vdiv.f64 d0, d7, d6 + 1f4830c: e28dd01c add sp, sp, #28 + 1f48310: e8bd4030 pop {r4, r5, lr} + 1f48314: e12fff1e bx lr + +01f48318 <_mprec_log10>: + 1f48318: e3500017 cmp r0, #23 + 1f4831c: da000005 ble 1f48338 <_mprec_log10+0x20> + 1f48320: ed9f0b08 vldr d0, [pc, #32] ; 1f48348 <_mprec_log10+0x30> + 1f48324: ed9f7b09 vldr d7, [pc, #36] ; 1f48350 <_mprec_log10+0x38> + 1f48328: e2500001 subs r0, r0, #1 + 1f4832c: ee200b07 vmul.f64 d0, d0, d7 + 1f48330: 1afffffc bne 1f48328 <_mprec_log10+0x10> + 1f48334: e12fff1e bx lr + 1f48338: e59f3018 ldr r3, [pc, #24] ; 1f48358 <_mprec_log10+0x40> + 1f4833c: e0830180 add r0, r3, r0, lsl #3 + 1f48340: ed900b00 vldr d0, [r0] + 1f48344: e12fff1e bx lr + 1f48348: 00000000 .word 0x00000000 + 1f4834c: 3ff00000 .word 0x3ff00000 + 1f48350: 00000000 .word 0x00000000 + 1f48354: 40240000 .word 0x40240000 + 1f48358: 01f63088 .word 0x01f63088 + +01f4835c <__copybits>: + 1f4835c: e592c010 ldr ip, [r2, #16] + 1f48360: e2823014 add r3, r2, #20 + 1f48364: e2411001 sub r1, r1, #1 + 1f48368: e92d4010 push {r4, lr} + 1f4836c: e083c10c add ip, r3, ip, lsl #2 + 1f48370: e1a042c1 asr r4, r1, #5 + 1f48374: e2844001 add r4, r4, #1 + 1f48378: e153000c cmp r3, ip + 1f4837c: e0804104 add r4, r0, r4, lsl #2 + 1f48380: 2a000009 bcs 1f483ac <__copybits+0x50> + 1f48384: e2401004 sub r1, r0, #4 + 1f48388: e493e004 ldr lr, [r3], #4 + 1f4838c: e15c0003 cmp ip, r3 + 1f48390: e5a1e004 str lr, [r1, #4]! + 1f48394: 8afffffb bhi 1f48388 <__copybits+0x2c> + 1f48398: e062300c rsb r3, r2, ip + 1f4839c: e2433015 sub r3, r3, #21 + 1f483a0: e3c33003 bic r3, r3, #3 + 1f483a4: e2833004 add r3, r3, #4 + 1f483a8: e0800003 add r0, r0, r3 + 1f483ac: e1540000 cmp r4, r0 + 1f483b0: 9a000003 bls 1f483c4 <__copybits+0x68> + 1f483b4: e3a03000 mov r3, #0 + 1f483b8: e4803004 str r3, [r0], #4 + 1f483bc: e1540000 cmp r4, r0 + 1f483c0: 8afffffc bhi 1f483b8 <__copybits+0x5c> + 1f483c4: e8bd4010 pop {r4, lr} + 1f483c8: e12fff1e bx lr + +01f483cc <__any_on>: + 1f483cc: e5903010 ldr r3, [r0, #16] + 1f483d0: e1a022c1 asr r2, r1, #5 + 1f483d4: e1530002 cmp r3, r2 + 1f483d8: e280c014 add ip, r0, #20 + 1f483dc: b08c3103 addlt r3, ip, r3, lsl #2 + 1f483e0: ba00000a blt 1f48410 <__any_on+0x44> + 1f483e4: da000008 ble 1f4840c <__any_on+0x40> + 1f483e8: e211101f ands r1, r1, #31 + 1f483ec: 0a000006 beq 1f4840c <__any_on+0x40> + 1f483f0: e79c3102 ldr r3, [ip, r2, lsl #2] + 1f483f4: e1a00133 lsr r0, r3, r1 + 1f483f8: e1530110 cmp r3, r0, lsl r1 + 1f483fc: e08c3102 add r3, ip, r2, lsl #2 + 1f48400: 0a000002 beq 1f48410 <__any_on+0x44> + 1f48404: e3a00001 mov r0, #1 + 1f48408: e12fff1e bx lr + 1f4840c: e08c3102 add r3, ip, r2, lsl #2 + 1f48410: e15c0003 cmp ip, r3 + 1f48414: 2a00000a bcs 1f48444 <__any_on+0x78> + 1f48418: e5130004 ldr r0, [r3, #-4] + 1f4841c: e3500000 cmp r0, #0 + 1f48420: e2433004 sub r3, r3, #4 + 1f48424: 0a000003 beq 1f48438 <__any_on+0x6c> + 1f48428: eafffff5 b 1f48404 <__any_on+0x38> + 1f4842c: e5332004 ldr r2, [r3, #-4]! + 1f48430: e3520000 cmp r2, #0 + 1f48434: 1afffff2 bne 1f48404 <__any_on+0x38> + 1f48438: e15c0003 cmp ip, r3 + 1f4843c: 3afffffa bcc 1f4842c <__any_on+0x60> + 1f48440: e12fff1e bx lr + 1f48444: e3a00000 mov r0, #0 + 1f48448: e12fff1e bx lr + +01f4844c <__sread>: + 1f4844c: e92d4010 push {r4, lr} + 1f48450: e1a04001 mov r4, r1 + 1f48454: e1d110fe ldrsh r1, [r1, #14] + 1f48458: eb000d59 bl 1f4b9c4 <_read_r> + 1f4845c: e3500000 cmp r0, #0 + 1f48460: a5943050 ldrge r3, [r4, #80] ; 0x50 + 1f48464: b1d430bc ldrhlt r3, [r4, #12] + 1f48468: a0833000 addge r3, r3, r0 + 1f4846c: b3c33a01 biclt r3, r3, #4096 ; 0x1000 + 1f48470: a5843050 strge r3, [r4, #80] ; 0x50 + 1f48474: b1c430bc strhlt r3, [r4, #12] + 1f48478: e8bd4010 pop {r4, lr} + 1f4847c: e12fff1e bx lr + +01f48480 <__seofread>: + 1f48480: e3a00000 mov r0, #0 + 1f48484: e12fff1e bx lr + +01f48488 <__swrite>: + 1f48488: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f4848c: e1a04001 mov r4, r1 + 1f48490: e1d110fc ldrsh r1, [r1, #12] + 1f48494: e3110c01 tst r1, #256 ; 0x100 + 1f48498: e1a06002 mov r6, r2 + 1f4849c: e1a07003 mov r7, r3 + 1f484a0: e1a05000 mov r5, r0 + 1f484a4: 0a000004 beq 1f484bc <__swrite+0x34> + 1f484a8: e1d410fe ldrsh r1, [r4, #14] + 1f484ac: e3a03002 mov r3, #2 + 1f484b0: e3a02000 mov r2, #0 + 1f484b4: eb000d30 bl 1f4b97c <_lseek_r> + 1f484b8: e1d410fc ldrsh r1, [r4, #12] + 1f484bc: e3c11a01 bic r1, r1, #4096 ; 0x1000 + 1f484c0: e1c410bc strh r1, [r4, #12] + 1f484c4: e1a03007 mov r3, r7 + 1f484c8: e1a02006 mov r2, r6 + 1f484cc: e1d410fe ldrsh r1, [r4, #14] + 1f484d0: e1a00005 mov r0, r5 + 1f484d4: eb000ae5 bl 1f4b070 <_write_r> + 1f484d8: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f484dc: e12fff1e bx lr + +01f484e0 <__sseek>: + 1f484e0: e92d4010 push {r4, lr} + 1f484e4: e1a04001 mov r4, r1 + 1f484e8: e1d110fe ldrsh r1, [r1, #14] + 1f484ec: eb000d22 bl 1f4b97c <_lseek_r> + 1f484f0: e1d430bc ldrh r3, [r4, #12] + 1f484f4: e3700001 cmn r0, #1 + 1f484f8: 03c33a01 biceq r3, r3, #4096 ; 0x1000 + 1f484fc: 13833a01 orrne r3, r3, #4096 ; 0x1000 + 1f48500: 15840050 strne r0, [r4, #80] ; 0x50 + 1f48504: e1c430bc strh r3, [r4, #12] + 1f48508: e8bd4010 pop {r4, lr} + 1f4850c: e12fff1e bx lr + +01f48510 <__sclose>: + 1f48510: e92d4010 push {r4, lr} + 1f48514: e1d110fe ldrsh r1, [r1, #14] + 1f48518: eb000b0c bl 1f4b150 <_close_r> + 1f4851c: e8bd4010 pop {r4, lr} + 1f48520: e12fff1e bx lr + +01f48524 <__ssprint_r>: + 1f48524: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f48528: e5923008 ldr r3, [r2, #8] + 1f4852c: e3530000 cmp r3, #0 + 1f48530: e24dd00c sub sp, sp, #12 + 1f48534: e1a08002 mov r8, r2 + 1f48538: 0a000060 beq 1f486c0 <__ssprint_r+0x19c> + 1f4853c: e3a0a000 mov sl, #0 + 1f48540: e1a0400a mov r4, sl + 1f48544: e3540000 cmp r4, #0 + 1f48548: e1a09000 mov r9, r0 + 1f4854c: e1a05001 mov r5, r1 + 1f48550: e5926000 ldr r6, [r2] + 1f48554: e5910000 ldr r0, [r1] + 1f48558: e5913008 ldr r3, [r1, #8] + 1f4855c: 0a000038 beq 1f48644 <__ssprint_r+0x120> + 1f48560: e1540003 cmp r4, r3 + 1f48564: e1a0b003 mov fp, r3 + 1f48568: e1a07003 mov r7, r3 + 1f4856c: 3a00003d bcc 1f48668 <__ssprint_r+0x144> + 1f48570: e1d530bc ldrh r3, [r5, #12] + 1f48574: e3130d12 tst r3, #1152 ; 0x480 + 1f48578: 0a000023 beq 1f4860c <__ssprint_r+0xe8> + 1f4857c: e2851010 add r1, r5, #16 + 1f48580: e8910082 ldm r1, {r1, r7} + 1f48584: e0877087 add r7, r7, r7, lsl #1 + 1f48588: e061b000 rsb fp, r1, r0 + 1f4858c: e0877fa7 add r7, r7, r7, lsr #31 + 1f48590: e2840001 add r0, r4, #1 + 1f48594: e1a070c7 asr r7, r7, #1 + 1f48598: e080000b add r0, r0, fp + 1f4859c: e1500007 cmp r0, r7 + 1f485a0: e1a02007 mov r2, r7 + 1f485a4: 81a07000 movhi r7, r0 + 1f485a8: 81a02007 movhi r2, r7 + 1f485ac: e3130b01 tst r3, #1024 ; 0x400 + 1f485b0: 0a00002f beq 1f48674 <__ssprint_r+0x150> + 1f485b4: e1a01002 mov r1, r2 + 1f485b8: e1a00009 mov r0, r9 + 1f485bc: ebffd7f9 bl 1f3e5a8 <_malloc_r> + 1f485c0: e2503000 subs r3, r0, #0 + 1f485c4: 0a000031 beq 1f48690 <__ssprint_r+0x16c> + 1f485c8: e1a0200b mov r2, fp + 1f485cc: e5951010 ldr r1, [r5, #16] + 1f485d0: e58d3004 str r3, [sp, #4] + 1f485d4: ebffda09 bl 1f3ee00 + 1f485d8: e1d520bc ldrh r2, [r5, #12] + 1f485dc: e3c22d12 bic r2, r2, #1152 ; 0x480 + 1f485e0: e3822080 orr r2, r2, #128 ; 0x80 + 1f485e4: e1c520bc strh r2, [r5, #12] + 1f485e8: e59d3004 ldr r3, [sp, #4] + 1f485ec: e083000b add r0, r3, fp + 1f485f0: e06bb007 rsb fp, fp, r7 + 1f485f4: e585b008 str fp, [r5, #8] + 1f485f8: e5857014 str r7, [r5, #20] + 1f485fc: e1a0b004 mov fp, r4 + 1f48600: e1a07004 mov r7, r4 + 1f48604: e5853010 str r3, [r5, #16] + 1f48608: e5850000 str r0, [r5] + 1f4860c: e1a02007 mov r2, r7 + 1f48610: e1a0100a mov r1, sl + 1f48614: ebffda35 bl 1f3eef0 + 1f48618: e5982008 ldr r2, [r8, #8] + 1f4861c: e5953008 ldr r3, [r5, #8] + 1f48620: e5950000 ldr r0, [r5] + 1f48624: e0644002 rsb r4, r4, r2 + 1f48628: e06b3003 rsb r3, fp, r3 + 1f4862c: e0800007 add r0, r0, r7 + 1f48630: e3540000 cmp r4, #0 + 1f48634: e5853008 str r3, [r5, #8] + 1f48638: e5850000 str r0, [r5] + 1f4863c: e5884008 str r4, [r8, #8] + 1f48640: 0a00001e beq 1f486c0 <__ssprint_r+0x19c> + 1f48644: e5964004 ldr r4, [r6, #4] + 1f48648: e3540000 cmp r4, #0 + 1f4864c: e596a000 ldr sl, [r6] + 1f48650: e2866008 add r6, r6, #8 + 1f48654: 0afffffa beq 1f48644 <__ssprint_r+0x120> + 1f48658: e1540003 cmp r4, r3 + 1f4865c: e1a0b003 mov fp, r3 + 1f48660: e1a07003 mov r7, r3 + 1f48664: 2affffc1 bcs 1f48570 <__ssprint_r+0x4c> + 1f48668: e1a0b004 mov fp, r4 + 1f4866c: e1a07004 mov r7, r4 + 1f48670: eaffffe5 b 1f4860c <__ssprint_r+0xe8> + 1f48674: e1a00009 mov r0, r9 + 1f48678: ebffdae8 bl 1f3f220 <_realloc_r> + 1f4867c: e2503000 subs r3, r0, #0 + 1f48680: 1affffd9 bne 1f485ec <__ssprint_r+0xc8> + 1f48684: e5951010 ldr r1, [r5, #16] + 1f48688: e1a00009 mov r0, r9 + 1f4868c: ebfffa30 bl 1f46f54 <_free_r> + 1f48690: e3a0300c mov r3, #12 + 1f48694: e3a02000 mov r2, #0 + 1f48698: e3e00000 mvn r0, #0 + 1f4869c: e5893000 str r3, [r9] + 1f486a0: e1d530bc ldrh r3, [r5, #12] + 1f486a4: e3833040 orr r3, r3, #64 ; 0x40 + 1f486a8: e1c530bc strh r3, [r5, #12] + 1f486ac: e5882008 str r2, [r8, #8] + 1f486b0: e5882004 str r2, [r8, #4] + 1f486b4: e28dd00c add sp, sp, #12 + 1f486b8: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f486bc: e12fff1e bx lr + 1f486c0: e3a00000 mov r0, #0 + 1f486c4: e5880004 str r0, [r8, #4] + 1f486c8: e28dd00c add sp, sp, #12 + 1f486cc: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f486d0: e12fff1e bx lr + +01f486d4 <_svfiprintf_r>: + 1f486d4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f486d8: e1a0b001 mov fp, r1 + 1f486dc: e1d110bc ldrh r1, [r1, #12] + 1f486e0: e24dd0bc sub sp, sp, #188 ; 0xbc + 1f486e4: e3110080 tst r1, #128 ; 0x80 + 1f486e8: e1a0a002 mov sl, r2 + 1f486ec: e58d3020 str r3, [sp, #32] + 1f486f0: e58d0018 str r0, [sp, #24] + 1f486f4: 0a000002 beq 1f48704 <_svfiprintf_r+0x30> + 1f486f8: e59b3010 ldr r3, [fp, #16] + 1f486fc: e3530000 cmp r3, #0 + 1f48700: 0a00046a beq 1f498b0 <_svfiprintf_r+0x11dc> + 1f48704: e3a03000 mov r3, #0 + 1f48708: e28d7078 add r7, sp, #120 ; 0x78 + 1f4870c: e1a06007 mov r6, r7 + 1f48710: e58d3014 str r3, [sp, #20] + 1f48714: e58d304c str r3, [sp, #76] ; 0x4c + 1f48718: e58d3048 str r3, [sp, #72] ; 0x48 + 1f4871c: e28d3077 add r3, sp, #119 ; 0x77 + 1f48720: e0633007 rsb r3, r3, r7 + 1f48724: e58d7044 str r7, [sp, #68] ; 0x44 + 1f48728: e59f8fb4 ldr r8, [pc, #4020] ; 1f496e4 <_svfiprintf_r+0x1010> + 1f4872c: e59f9fa4 ldr r9, [pc, #4004] ; 1f496d8 <_svfiprintf_r+0x1004> + 1f48730: e58d3034 str r3, [sp, #52] ; 0x34 + 1f48734: e5da3000 ldrb r3, [sl] + 1f48738: e3530000 cmp r3, #0 + 1f4873c: 13530025 cmpne r3, #37 ; 0x25 + 1f48740: e1a0400a mov r4, sl + 1f48744: 0a000013 beq 1f48798 <_svfiprintf_r+0xc4> + 1f48748: e5f43001 ldrb r3, [r4, #1]! + 1f4874c: e3530000 cmp r3, #0 + 1f48750: 13530025 cmpne r3, #37 ; 0x25 + 1f48754: 1afffffb bne 1f48748 <_svfiprintf_r+0x74> + 1f48758: e054500a subs r5, r4, sl + 1f4875c: 0a00000d beq 1f48798 <_svfiprintf_r+0xc4> + 1f48760: e59d3048 ldr r3, [sp, #72] ; 0x48 + 1f48764: e59d204c ldr r2, [sp, #76] ; 0x4c + 1f48768: e2833001 add r3, r3, #1 + 1f4876c: e3530007 cmp r3, #7 + 1f48770: e0822005 add r2, r2, r5 + 1f48774: e586a000 str sl, [r6] + 1f48778: e5865004 str r5, [r6, #4] + 1f4877c: e58d3048 str r3, [sp, #72] ; 0x48 + 1f48780: e58d204c str r2, [sp, #76] ; 0x4c + 1f48784: d2866008 addle r6, r6, #8 + 1f48788: ca000384 bgt 1f495a0 <_svfiprintf_r+0xecc> + 1f4878c: e59d3014 ldr r3, [sp, #20] + 1f48790: e0833005 add r3, r3, r5 + 1f48794: e58d3014 str r3, [sp, #20] + 1f48798: e5d43000 ldrb r3, [r4] + 1f4879c: e3530000 cmp r3, #0 + 1f487a0: 0a000322 beq 1f49430 <_svfiprintf_r+0xd5c> + 1f487a4: e3a03000 mov r3, #0 + 1f487a8: e1a01003 mov r1, r3 + 1f487ac: e5cd303f strb r3, [sp, #63] ; 0x3f + 1f487b0: e1a00003 mov r0, r3 + 1f487b4: e1a0c003 mov ip, r3 + 1f487b8: e1a05003 mov r5, r3 + 1f487bc: e5d43001 ldrb r3, [r4, #1] + 1f487c0: e284a001 add sl, r4, #1 + 1f487c4: e3e02000 mvn r2, #0 + 1f487c8: e58d2008 str r2, [sp, #8] + 1f487cc: e28aa001 add sl, sl, #1 + 1f487d0: e2432020 sub r2, r3, #32 + 1f487d4: e3520058 cmp r2, #88 ; 0x58 + 1f487d8: 979ff102 ldrls pc, [pc, r2, lsl #2] + 1f487dc: ea000305 b 1f493f8 <_svfiprintf_r+0xd24> + 1f487e0: 01f48988 .word 0x01f48988 + 1f487e4: 01f493f8 .word 0x01f493f8 + 1f487e8: 01f493f8 .word 0x01f493f8 + 1f487ec: 01f4897c .word 0x01f4897c + 1f487f0: 01f493f8 .word 0x01f493f8 + 1f487f4: 01f493f8 .word 0x01f493f8 + 1f487f8: 01f493f8 .word 0x01f493f8 + 1f487fc: 01f493f8 .word 0x01f493f8 + 1f48800: 01f493f8 .word 0x01f493f8 + 1f48804: 01f493f8 .word 0x01f493f8 + 1f48808: 01f48944 .word 0x01f48944 + 1f4880c: 01f4896c .word 0x01f4896c + 1f48810: 01f493f8 .word 0x01f493f8 + 1f48814: 01f48960 .word 0x01f48960 + 1f48818: 01f49364 .word 0x01f49364 + 1f4881c: 01f493f8 .word 0x01f493f8 + 1f48820: 01f49358 .word 0x01f49358 + 1f48824: 01f49334 .word 0x01f49334 + 1f48828: 01f49334 .word 0x01f49334 + 1f4882c: 01f49334 .word 0x01f49334 + 1f48830: 01f49334 .word 0x01f49334 + 1f48834: 01f49334 .word 0x01f49334 + 1f48838: 01f49334 .word 0x01f49334 + 1f4883c: 01f49334 .word 0x01f49334 + 1f48840: 01f49334 .word 0x01f49334 + 1f48844: 01f49334 .word 0x01f49334 + 1f48848: 01f493f8 .word 0x01f493f8 + 1f4884c: 01f493f8 .word 0x01f493f8 + 1f48850: 01f493f8 .word 0x01f493f8 + 1f48854: 01f493f8 .word 0x01f493f8 + 1f48858: 01f493f8 .word 0x01f493f8 + 1f4885c: 01f493f8 .word 0x01f493f8 + 1f48860: 01f493f8 .word 0x01f493f8 + 1f48864: 01f493f8 .word 0x01f493f8 + 1f48868: 01f493f8 .word 0x01f493f8 + 1f4886c: 01f493f8 .word 0x01f493f8 + 1f48870: 01f492b8 .word 0x01f492b8 + 1f48874: 01f493f8 .word 0x01f493f8 + 1f48878: 01f493f8 .word 0x01f493f8 + 1f4887c: 01f493f8 .word 0x01f493f8 + 1f48880: 01f493f8 .word 0x01f493f8 + 1f48884: 01f493f8 .word 0x01f493f8 + 1f48888: 01f493f8 .word 0x01f493f8 + 1f4888c: 01f493f8 .word 0x01f493f8 + 1f48890: 01f493f8 .word 0x01f493f8 + 1f48894: 01f493f8 .word 0x01f493f8 + 1f48898: 01f493f8 .word 0x01f493f8 + 1f4889c: 01f490cc .word 0x01f490cc + 1f488a0: 01f493f8 .word 0x01f493f8 + 1f488a4: 01f493f8 .word 0x01f493f8 + 1f488a8: 01f493f8 .word 0x01f493f8 + 1f488ac: 01f493f8 .word 0x01f493f8 + 1f488b0: 01f493f8 .word 0x01f493f8 + 1f488b4: 01f49058 .word 0x01f49058 + 1f488b8: 01f493f8 .word 0x01f493f8 + 1f488bc: 01f493f8 .word 0x01f493f8 + 1f488c0: 01f493b8 .word 0x01f493b8 + 1f488c4: 01f493f8 .word 0x01f493f8 + 1f488c8: 01f493f8 .word 0x01f493f8 + 1f488cc: 01f493f8 .word 0x01f493f8 + 1f488d0: 01f493f8 .word 0x01f493f8 + 1f488d4: 01f493f8 .word 0x01f493f8 + 1f488d8: 01f493f8 .word 0x01f493f8 + 1f488dc: 01f493f8 .word 0x01f493f8 + 1f488e0: 01f493f8 .word 0x01f493f8 + 1f488e4: 01f493f8 .word 0x01f493f8 + 1f488e8: 01f493f8 .word 0x01f493f8 + 1f488ec: 01f48c64 .word 0x01f48c64 + 1f488f0: 01f491c0 .word 0x01f491c0 + 1f488f4: 01f493f8 .word 0x01f493f8 + 1f488f8: 01f493f8 .word 0x01f493f8 + 1f488fc: 01f493f8 .word 0x01f493f8 + 1f48900: 01f491b4 .word 0x01f491b4 + 1f48904: 01f491c0 .word 0x01f491c0 + 1f48908: 01f493f8 .word 0x01f493f8 + 1f4890c: 01f493f8 .word 0x01f493f8 + 1f48910: 01f49198 .word 0x01f49198 + 1f48914: 01f493f8 .word 0x01f493f8 + 1f48918: 01f4915c .word 0x01f4915c + 1f4891c: 01f48ba4 .word 0x01f48ba4 + 1f48920: 01f48b00 .word 0x01f48b00 + 1f48924: 01f492ac .word 0x01f492ac + 1f48928: 01f493f8 .word 0x01f493f8 + 1f4892c: 01f48a98 .word 0x01f48a98 + 1f48930: 01f493f8 .word 0x01f493f8 + 1f48934: 01f48a30 .word 0x01f48a30 + 1f48938: 01f493f8 .word 0x01f493f8 + 1f4893c: 01f493f8 .word 0x01f493f8 + 1f48940: 01f4899c .word 0x01f4899c + 1f48944: e59d3020 ldr r3, [sp, #32] + 1f48948: e593c000 ldr ip, [r3] + 1f4894c: e2833004 add r3, r3, #4 + 1f48950: e35c0000 cmp ip, #0 + 1f48954: e58d3020 str r3, [sp, #32] + 1f48958: aa000001 bge 1f48964 <_svfiprintf_r+0x290> + 1f4895c: e26cc000 rsb ip, ip, #0 + 1f48960: e3855004 orr r5, r5, #4 + 1f48964: e5da3000 ldrb r3, [sl] + 1f48968: eaffff97 b 1f487cc <_svfiprintf_r+0xf8> + 1f4896c: e5da3000 ldrb r3, [sl] + 1f48970: e3a01001 mov r1, #1 + 1f48974: e3a0002b mov r0, #43 ; 0x2b + 1f48978: eaffff93 b 1f487cc <_svfiprintf_r+0xf8> + 1f4897c: e3855001 orr r5, r5, #1 + 1f48980: e5da3000 ldrb r3, [sl] + 1f48984: eaffff90 b 1f487cc <_svfiprintf_r+0xf8> + 1f48988: e3500000 cmp r0, #0 + 1f4898c: e5da3000 ldrb r3, [sl] + 1f48990: 03a01001 moveq r1, #1 + 1f48994: 03a00020 moveq r0, #32 + 1f48998: eaffff8b b 1f487cc <_svfiprintf_r+0xf8> + 1f4899c: e3510000 cmp r1, #0 + 1f489a0: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f489a4: e3150020 tst r5, #32 + 1f489a8: e58dc01c str ip, [sp, #28] + 1f489ac: e59f2d2c ldr r2, [pc, #3372] ; 1f496e0 <_svfiprintf_r+0x100c> + 1f489b0: 0a000286 beq 1f493d0 <_svfiprintf_r+0xcfc> + 1f489b4: e59d1020 ldr r1, [sp, #32] + 1f489b8: e2811007 add r1, r1, #7 + 1f489bc: e3c11007 bic r1, r1, #7 + 1f489c0: e2810008 add r0, r1, #8 + 1f489c4: e58d0020 str r0, [sp, #32] + 1f489c8: e8910003 ldm r1, {r0, r1} + 1f489cc: e215c001 ands ip, r5, #1 + 1f489d0: 0a00030e beq 1f49610 <_svfiprintf_r+0xf3c> + 1f489d4: e190c001 orrs ip, r0, r1 + 1f489d8: 1a000369 bne 1f49784 <_svfiprintf_r+0x10b0> + 1f489dc: e3a03000 mov r3, #0 + 1f489e0: e59dc008 ldr ip, [sp, #8] + 1f489e4: e15c0003 cmp ip, r3 + 1f489e8: e5cd303f strb r3, [sp, #63] ; 0x3f + 1f489ec: ba00005c blt 1f48b64 <_svfiprintf_r+0x490> + 1f489f0: e3c55080 bic r5, r5, #128 ; 0x80 + 1f489f4: 01a0400c moveq r4, ip + 1f489f8: 1a000059 bne 1f48b64 <_svfiprintf_r+0x490> + 1f489fc: e3a03000 mov r3, #0 + 1f48a00: e58d702c str r7, [sp, #44] ; 0x2c + 1f48a04: e58d3008 str r3, [sp, #8] + 1f48a08: e58d3010 str r3, [sp, #16] + 1f48a0c: e59d3008 ldr r3, [sp, #8] + 1f48a10: e59d2010 ldr r2, [sp, #16] + 1f48a14: e1530002 cmp r3, r2 + 1f48a18: b1a03002 movlt r3, r2 + 1f48a1c: e3540000 cmp r4, #0 + 1f48a20: e58d3000 str r3, [sp] + 1f48a24: 12833001 addne r3, r3, #1 + 1f48a28: 158d3000 strne r3, [sp] + 1f48a2c: ea00009c b 1f48ca4 <_svfiprintf_r+0x5d0> + 1f48a30: e3510000 cmp r1, #0 + 1f48a34: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f48a38: e2153020 ands r3, r5, #32 + 1f48a3c: e58dc01c str ip, [sp, #28] + 1f48a40: 0a00018a beq 1f49070 <_svfiprintf_r+0x99c> + 1f48a44: e3a04000 mov r4, #0 + 1f48a48: e59d3020 ldr r3, [sp, #32] + 1f48a4c: e2833007 add r3, r3, #7 + 1f48a50: e3c33007 bic r3, r3, #7 + 1f48a54: e2832008 add r2, r3, #8 + 1f48a58: e59d1008 ldr r1, [sp, #8] + 1f48a5c: e58d2020 str r2, [sp, #32] + 1f48a60: e893000c ldm r3, {r2, r3} + 1f48a64: e1510004 cmp r1, r4 + 1f48a68: e88d000c stm sp, {r2, r3} + 1f48a6c: e5cd403f strb r4, [sp, #63] ; 0x3f + 1f48a70: ba0001ec blt 1f49228 <_svfiprintf_r+0xb54> + 1f48a74: e1823003 orr r3, r2, r3 + 1f48a78: e1530004 cmp r3, r4 + 1f48a7c: 01510004 cmpeq r1, r4 + 1f48a80: e3c55080 bic r5, r5, #128 ; 0x80 + 1f48a84: 13a03001 movne r3, #1 + 1f48a88: 03a03000 moveq r3, #0 + 1f48a8c: 1a0001e5 bne 1f49228 <_svfiprintf_r+0xb54> + 1f48a90: e1a04003 mov r4, r3 + 1f48a94: eaffffd8 b 1f489fc <_svfiprintf_r+0x328> + 1f48a98: e3a04000 mov r4, #0 + 1f48a9c: e59d3020 ldr r3, [sp, #32] + 1f48aa0: e5932000 ldr r2, [r3] + 1f48aa4: e1520004 cmp r2, r4 + 1f48aa8: e58d202c str r2, [sp, #44] ; 0x2c + 1f48aac: e58dc01c str ip, [sp, #28] + 1f48ab0: e5cd403f strb r4, [sp, #63] ; 0x3f + 1f48ab4: e2833004 add r3, r3, #4 + 1f48ab8: e59d2008 ldr r2, [sp, #8] + 1f48abc: 0a000395 beq 1f49918 <_svfiprintf_r+0x1244> + 1f48ac0: e3520000 cmp r2, #0 + 1f48ac4: ba00033d blt 1f497c0 <_svfiprintf_r+0x10ec> + 1f48ac8: e1a01004 mov r1, r4 + 1f48acc: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f48ad0: e58d3000 str r3, [sp] + 1f48ad4: ebfffab1 bl 1f475a0 + 1f48ad8: e3500000 cmp r0, #0 + 1f48adc: e59d3000 ldr r3, [sp] + 1f48ae0: 0a000397 beq 1f49944 <_svfiprintf_r+0x1270> + 1f48ae4: e59d202c ldr r2, [sp, #44] ; 0x2c + 1f48ae8: e0622000 rsb r2, r2, r0 + 1f48aec: e58d4008 str r4, [sp, #8] + 1f48af0: e58d2010 str r2, [sp, #16] + 1f48af4: e58d3020 str r3, [sp, #32] + 1f48af8: e5dd403f ldrb r4, [sp, #63] ; 0x3f + 1f48afc: eaffffc2 b 1f48a0c <_svfiprintf_r+0x338> + 1f48b00: e3a01030 mov r1, #48 ; 0x30 + 1f48b04: e3a03000 mov r3, #0 + 1f48b08: e3a02078 mov r2, #120 ; 0x78 + 1f48b0c: e59d0008 ldr r0, [sp, #8] + 1f48b10: e5cd1040 strb r1, [sp, #64] ; 0x40 + 1f48b14: e59d1020 ldr r1, [sp, #32] + 1f48b18: e1500003 cmp r0, r3 + 1f48b1c: e5cd2041 strb r2, [sp, #65] ; 0x41 + 1f48b20: e5910000 ldr r0, [r1] + 1f48b24: e2812004 add r2, r1, #4 + 1f48b28: e58dc01c str ip, [sp, #28] + 1f48b2c: e5cd303f strb r3, [sp, #63] ; 0x3f + 1f48b30: e3a01000 mov r1, #0 + 1f48b34: ba00031d blt 1f497b0 <_svfiprintf_r+0x10dc> + 1f48b38: e59dc008 ldr ip, [sp, #8] + 1f48b3c: e1803001 orr r3, r0, r1 + 1f48b40: e3530000 cmp r3, #0 + 1f48b44: 035c0000 cmpeq ip, #0 + 1f48b48: e3c53080 bic r3, r5, #128 ; 0x80 + 1f48b4c: e58d2020 str r2, [sp, #32] + 1f48b50: 13a04001 movne r4, #1 + 1f48b54: 03a04000 moveq r4, #0 + 1f48b58: e3835002 orr r5, r3, #2 + 1f48b5c: 0affffa6 beq 1f489fc <_svfiprintf_r+0x328> + 1f48b60: e59f2b78 ldr r2, [pc, #2936] ; 1f496e0 <_svfiprintf_r+0x100c> + 1f48b64: e1a0c007 mov ip, r7 + 1f48b68: e1a03220 lsr r3, r0, #4 + 1f48b6c: e1833e01 orr r3, r3, r1, lsl #28 + 1f48b70: e1a04221 lsr r4, r1, #4 + 1f48b74: e200e00f and lr, r0, #15 + 1f48b78: e1a01004 mov r1, r4 + 1f48b7c: e1a00003 mov r0, r3 + 1f48b80: e7d2300e ldrb r3, [r2, lr] + 1f48b84: e190e001 orrs lr, r0, r1 + 1f48b88: e56c3001 strb r3, [ip, #-1]! + 1f48b8c: 1afffff5 bne 1f48b68 <_svfiprintf_r+0x494> + 1f48b90: e06c3007 rsb r3, ip, r7 + 1f48b94: e58dc02c str ip, [sp, #44] ; 0x2c + 1f48b98: e58d3010 str r3, [sp, #16] + 1f48b9c: e3a04000 mov r4, #0 + 1f48ba0: eaffff99 b 1f48a0c <_svfiprintf_r+0x338> + 1f48ba4: e3510000 cmp r1, #0 + 1f48ba8: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f48bac: e2153020 ands r3, r5, #32 + 1f48bb0: e58dc01c str ip, [sp, #28] + 1f48bb4: 0a00014a beq 1f490e4 <_svfiprintf_r+0xa10> + 1f48bb8: e3a01000 mov r1, #0 + 1f48bbc: e59d3020 ldr r3, [sp, #32] + 1f48bc0: e59d2008 ldr r2, [sp, #8] + 1f48bc4: e2833007 add r3, r3, #7 + 1f48bc8: e3c33007 bic r3, r3, #7 + 1f48bcc: e1520001 cmp r2, r1 + 1f48bd0: e2832008 add r2, r3, #8 + 1f48bd4: e58d2020 str r2, [sp, #32] + 1f48bd8: e5cd103f strb r1, [sp, #63] ; 0x3f + 1f48bdc: e893000c ldm r3, {r2, r3} + 1f48be0: ba000005 blt 1f48bfc <_svfiprintf_r+0x528> + 1f48be4: 13a01001 movne r1, #1 + 1f48be8: e1920003 orrs r0, r2, r3 + 1f48bec: 13811001 orrne r1, r1, #1 + 1f48bf0: e3510000 cmp r1, #0 + 1f48bf4: e3c55080 bic r5, r5, #128 ; 0x80 + 1f48bf8: 0a00014b beq 1f4912c <_svfiprintf_r+0xa58> + 1f48bfc: e1a00007 mov r0, r7 + 1f48c00: e1a0c1a2 lsr ip, r2, #3 + 1f48c04: e18cce83 orr ip, ip, r3, lsl #29 + 1f48c08: e1a0e1a3 lsr lr, r3, #3 + 1f48c0c: e2021007 and r1, r2, #7 + 1f48c10: e1a0300e mov r3, lr + 1f48c14: e1a0200c mov r2, ip + 1f48c18: e2811030 add r1, r1, #48 ; 0x30 + 1f48c1c: e192c003 orrs ip, r2, r3 + 1f48c20: e5601001 strb r1, [r0, #-1]! + 1f48c24: 1afffff5 bne 1f48c00 <_svfiprintf_r+0x52c> + 1f48c28: e3510030 cmp r1, #48 ; 0x30 + 1f48c2c: 03a04000 moveq r4, #0 + 1f48c30: 12054001 andne r4, r5, #1 + 1f48c34: e3540000 cmp r4, #0 + 1f48c38: 13a03030 movne r3, #48 ; 0x30 + 1f48c3c: 12402001 subne r2, r0, #1 + 1f48c40: 00603007 rsbeq r3, r0, r7 + 1f48c44: 15403001 strbne r3, [r0, #-1] + 1f48c48: 10623007 rsbne r3, r2, r7 + 1f48c4c: 058d3010 streq r3, [sp, #16] + 1f48c50: 058d002c streq r0, [sp, #44] ; 0x2c + 1f48c54: 158d202c strne r2, [sp, #44] ; 0x2c + 1f48c58: 158d3010 strne r3, [sp, #16] + 1f48c5c: 13a04000 movne r4, #0 + 1f48c60: eaffff69 b 1f48a0c <_svfiprintf_r+0x338> + 1f48c64: e3a03001 mov r3, #1 + 1f48c68: e3a02000 mov r2, #0 + 1f48c6c: e1a01003 mov r1, r3 + 1f48c70: e59d0020 ldr r0, [sp, #32] + 1f48c74: e58d3000 str r3, [sp] + 1f48c78: e5903000 ldr r3, [r0] + 1f48c7c: e5cd3050 strb r3, [sp, #80] ; 0x50 + 1f48c80: e2803004 add r3, r0, #4 + 1f48c84: e58d3020 str r3, [sp, #32] + 1f48c88: e28d3050 add r3, sp, #80 ; 0x50 + 1f48c8c: e58dc01c str ip, [sp, #28] + 1f48c90: e5cd203f strb r2, [sp, #63] ; 0x3f + 1f48c94: e58d1010 str r1, [sp, #16] + 1f48c98: e58d302c str r3, [sp, #44] ; 0x2c + 1f48c9c: e3a03000 mov r3, #0 + 1f48ca0: e58d3008 str r3, [sp, #8] + 1f48ca4: e2153002 ands r3, r5, #2 + 1f48ca8: e58d3024 str r3, [sp, #36] ; 0x24 + 1f48cac: 159d3000 ldrne r3, [sp] + 1f48cb0: 12833002 addne r3, r3, #2 + 1f48cb4: 158d3000 strne r3, [sp] + 1f48cb8: e2153084 ands r3, r5, #132 ; 0x84 + 1f48cbc: e58d3028 str r3, [sp, #40] ; 0x28 + 1f48cc0: 1a00003b bne 1f48db4 <_svfiprintf_r+0x6e0> + 1f48cc4: e59d301c ldr r3, [sp, #28] + 1f48cc8: e59d2000 ldr r2, [sp] + 1f48ccc: e0624003 rsb r4, r2, r3 + 1f48cd0: e3540000 cmp r4, #0 + 1f48cd4: da000036 ble 1f48db4 <_svfiprintf_r+0x6e0> + 1f48cd8: e3540010 cmp r4, #16 + 1f48cdc: da000304 ble 1f498f4 <_svfiprintf_r+0x1220> + 1f48ce0: e59f09fc ldr r0, [pc, #2556] ; 1f496e4 <_svfiprintf_r+0x1010> + 1f48ce4: e3a03010 mov r3, #16 + 1f48ce8: e58d0030 str r0, [sp, #48] ; 0x30 + 1f48cec: e59d104c ldr r1, [sp, #76] ; 0x4c + 1f48cf0: e1a00006 mov r0, r6 + 1f48cf4: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f48cf8: e1a06005 mov r6, r5 + 1f48cfc: e59d5018 ldr r5, [sp, #24] + 1f48d00: ea000002 b 1f48d10 <_svfiprintf_r+0x63c> + 1f48d04: e2444010 sub r4, r4, #16 + 1f48d08: e3540010 cmp r4, #16 + 1f48d0c: da000016 ble 1f48d6c <_svfiprintf_r+0x698> + 1f48d10: e2822001 add r2, r2, #1 + 1f48d14: e3520007 cmp r2, #7 + 1f48d18: e2811010 add r1, r1, #16 + 1f48d1c: e5808000 str r8, [r0] + 1f48d20: e5803004 str r3, [r0, #4] + 1f48d24: e58d2048 str r2, [sp, #72] ; 0x48 + 1f48d28: e58d104c str r1, [sp, #76] ; 0x4c + 1f48d2c: d2800008 addle r0, r0, #8 + 1f48d30: dafffff3 ble 1f48d04 <_svfiprintf_r+0x630> + 1f48d34: e28d2044 add r2, sp, #68 ; 0x44 + 1f48d38: e1a0100b mov r1, fp + 1f48d3c: e1a00005 mov r0, r5 + 1f48d40: e58d300c str r3, [sp, #12] + 1f48d44: ebfffdf6 bl 1f48524 <__ssprint_r> + 1f48d48: e3500000 cmp r0, #0 + 1f48d4c: 1a0001bd bne 1f49448 <_svfiprintf_r+0xd74> + 1f48d50: e2444010 sub r4, r4, #16 + 1f48d54: e3540010 cmp r4, #16 + 1f48d58: e1a00007 mov r0, r7 + 1f48d5c: e59d104c ldr r1, [sp, #76] ; 0x4c + 1f48d60: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f48d64: e59d300c ldr r3, [sp, #12] + 1f48d68: caffffe8 bgt 1f48d10 <_svfiprintf_r+0x63c> + 1f48d6c: e1a05006 mov r5, r6 + 1f48d70: e1a06000 mov r6, r0 + 1f48d74: e2822001 add r2, r2, #1 + 1f48d78: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f48d7c: e3520007 cmp r2, #7 + 1f48d80: e0841001 add r1, r4, r1 + 1f48d84: e8860018 stm r6, {r3, r4} + 1f48d88: e58d2048 str r2, [sp, #72] ; 0x48 + 1f48d8c: e58d104c str r1, [sp, #76] ; 0x4c + 1f48d90: d2866008 addle r6, r6, #8 + 1f48d94: da000008 ble 1f48dbc <_svfiprintf_r+0x6e8> + 1f48d98: e28d2044 add r2, sp, #68 ; 0x44 + 1f48d9c: e1a0100b mov r1, fp + 1f48da0: e59d0018 ldr r0, [sp, #24] + 1f48da4: ebfffdde bl 1f48524 <__ssprint_r> + 1f48da8: e3500000 cmp r0, #0 + 1f48dac: 1a0001a5 bne 1f49448 <_svfiprintf_r+0xd74> + 1f48db0: e1a06007 mov r6, r7 + 1f48db4: e59d104c ldr r1, [sp, #76] ; 0x4c + 1f48db8: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f48dbc: e5dd303f ldrb r3, [sp, #63] ; 0x3f + 1f48dc0: e3530000 cmp r3, #0 + 1f48dc4: 0a00000a beq 1f48df4 <_svfiprintf_r+0x720> + 1f48dc8: e3a00001 mov r0, #1 + 1f48dcc: e0822000 add r2, r2, r0 + 1f48dd0: e3520007 cmp r2, #7 + 1f48dd4: e0811000 add r1, r1, r0 + 1f48dd8: e28d303f add r3, sp, #63 ; 0x3f + 1f48ddc: e5860004 str r0, [r6, #4] + 1f48de0: e5863000 str r3, [r6] + 1f48de4: e58d2048 str r2, [sp, #72] ; 0x48 + 1f48de8: e58d104c str r1, [sp, #76] ; 0x4c + 1f48dec: d2866008 addle r6, r6, #8 + 1f48df0: ca0001fc bgt 1f495e8 <_svfiprintf_r+0xf14> + 1f48df4: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f48df8: e3530000 cmp r3, #0 + 1f48dfc: 0a00000a beq 1f48e2c <_svfiprintf_r+0x758> + 1f48e00: e3a00002 mov r0, #2 + 1f48e04: e2822001 add r2, r2, #1 + 1f48e08: e3520007 cmp r2, #7 + 1f48e0c: e0811000 add r1, r1, r0 + 1f48e10: e28d3040 add r3, sp, #64 ; 0x40 + 1f48e14: e5860004 str r0, [r6, #4] + 1f48e18: e5863000 str r3, [r6] + 1f48e1c: e58d2048 str r2, [sp, #72] ; 0x48 + 1f48e20: e58d104c str r1, [sp, #76] ; 0x4c + 1f48e24: d2866008 addle r6, r6, #8 + 1f48e28: ca0001e4 bgt 1f495c0 <_svfiprintf_r+0xeec> + 1f48e2c: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f48e30: e3530080 cmp r3, #128 ; 0x80 + 1f48e34: 0a00018a beq 1f49464 <_svfiprintf_r+0xd90> + 1f48e38: e59d3008 ldr r3, [sp, #8] + 1f48e3c: e59d0010 ldr r0, [sp, #16] + 1f48e40: e0604003 rsb r4, r0, r3 + 1f48e44: e3540000 cmp r4, #0 + 1f48e48: da000038 ble 1f48f30 <_svfiprintf_r+0x85c> + 1f48e4c: e3540010 cmp r4, #16 + 1f48e50: d59f3880 ldrle r3, [pc, #2176] ; 1f496d8 <_svfiprintf_r+0x1004> + 1f48e54: d58d3024 strle r3, [sp, #36] ; 0x24 + 1f48e58: da000022 ble 1f48ee8 <_svfiprintf_r+0x814> + 1f48e5c: e59f0874 ldr r0, [pc, #2164] ; 1f496d8 <_svfiprintf_r+0x1004> + 1f48e60: e3a03010 mov r3, #16 + 1f48e64: e58d0024 str r0, [sp, #36] ; 0x24 + 1f48e68: e1a00006 mov r0, r6 + 1f48e6c: e1a06005 mov r6, r5 + 1f48e70: e59d5018 ldr r5, [sp, #24] + 1f48e74: ea000002 b 1f48e84 <_svfiprintf_r+0x7b0> + 1f48e78: e2444010 sub r4, r4, #16 + 1f48e7c: e3540010 cmp r4, #16 + 1f48e80: da000016 ble 1f48ee0 <_svfiprintf_r+0x80c> + 1f48e84: e2822001 add r2, r2, #1 + 1f48e88: e3520007 cmp r2, #7 + 1f48e8c: e2811010 add r1, r1, #16 + 1f48e90: e5809000 str r9, [r0] + 1f48e94: e5803004 str r3, [r0, #4] + 1f48e98: e58d2048 str r2, [sp, #72] ; 0x48 + 1f48e9c: e58d104c str r1, [sp, #76] ; 0x4c + 1f48ea0: d2800008 addle r0, r0, #8 + 1f48ea4: dafffff3 ble 1f48e78 <_svfiprintf_r+0x7a4> + 1f48ea8: e28d2044 add r2, sp, #68 ; 0x44 + 1f48eac: e1a0100b mov r1, fp + 1f48eb0: e1a00005 mov r0, r5 + 1f48eb4: e58d3008 str r3, [sp, #8] + 1f48eb8: ebfffd99 bl 1f48524 <__ssprint_r> + 1f48ebc: e3500000 cmp r0, #0 + 1f48ec0: 1a000160 bne 1f49448 <_svfiprintf_r+0xd74> + 1f48ec4: e2444010 sub r4, r4, #16 + 1f48ec8: e3540010 cmp r4, #16 + 1f48ecc: e1a00007 mov r0, r7 + 1f48ed0: e59d104c ldr r1, [sp, #76] ; 0x4c + 1f48ed4: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f48ed8: e59d3008 ldr r3, [sp, #8] + 1f48edc: caffffe8 bgt 1f48e84 <_svfiprintf_r+0x7b0> + 1f48ee0: e1a05006 mov r5, r6 + 1f48ee4: e1a06000 mov r6, r0 + 1f48ee8: e2822001 add r2, r2, #1 + 1f48eec: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f48ef0: e3520007 cmp r2, #7 + 1f48ef4: e0811004 add r1, r1, r4 + 1f48ef8: e8860018 stm r6, {r3, r4} + 1f48efc: e58d2048 str r2, [sp, #72] ; 0x48 + 1f48f00: e58d104c str r1, [sp, #76] ; 0x4c + 1f48f04: d2866008 addle r6, r6, #8 + 1f48f08: da000008 ble 1f48f30 <_svfiprintf_r+0x85c> + 1f48f0c: e28d2044 add r2, sp, #68 ; 0x44 + 1f48f10: e1a0100b mov r1, fp + 1f48f14: e59d0018 ldr r0, [sp, #24] + 1f48f18: ebfffd81 bl 1f48524 <__ssprint_r> + 1f48f1c: e3500000 cmp r0, #0 + 1f48f20: 1a000148 bne 1f49448 <_svfiprintf_r+0xd74> + 1f48f24: e1a06007 mov r6, r7 + 1f48f28: e59d104c ldr r1, [sp, #76] ; 0x4c + 1f48f2c: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f48f30: e2822001 add r2, r2, #1 + 1f48f34: e59d3010 ldr r3, [sp, #16] + 1f48f38: e3520007 cmp r2, #7 + 1f48f3c: e58d2048 str r2, [sp, #72] ; 0x48 + 1f48f40: e59d202c ldr r2, [sp, #44] ; 0x2c + 1f48f44: e0831001 add r1, r3, r1 + 1f48f48: e886000c stm r6, {r2, r3} + 1f48f4c: e58d104c str r1, [sp, #76] ; 0x4c + 1f48f50: d2866008 addle r6, r6, #8 + 1f48f54: ca000181 bgt 1f49560 <_svfiprintf_r+0xe8c> + 1f48f58: e3150004 tst r5, #4 + 1f48f5c: 0a000030 beq 1f49024 <_svfiprintf_r+0x950> + 1f48f60: e59d301c ldr r3, [sp, #28] + 1f48f64: e59d2000 ldr r2, [sp] + 1f48f68: e0624003 rsb r4, r2, r3 + 1f48f6c: e3540000 cmp r4, #0 + 1f48f70: da00002b ble 1f49024 <_svfiprintf_r+0x950> + 1f48f74: e3540010 cmp r4, #16 + 1f48f78: da000262 ble 1f49908 <_svfiprintf_r+0x1234> + 1f48f7c: e59f2760 ldr r2, [pc, #1888] ; 1f496e4 <_svfiprintf_r+0x1010> + 1f48f80: e3a05010 mov r5, #16 + 1f48f84: e58d2030 str r2, [sp, #48] ; 0x30 + 1f48f88: e59d3048 ldr r3, [sp, #72] ; 0x48 + 1f48f8c: e1a02006 mov r2, r6 + 1f48f90: e1a06004 mov r6, r4 + 1f48f94: e59d4018 ldr r4, [sp, #24] + 1f48f98: ea000002 b 1f48fa8 <_svfiprintf_r+0x8d4> + 1f48f9c: e2466010 sub r6, r6, #16 + 1f48fa0: e3560010 cmp r6, #16 + 1f48fa4: da000014 ble 1f48ffc <_svfiprintf_r+0x928> + 1f48fa8: e2833001 add r3, r3, #1 + 1f48fac: e3530007 cmp r3, #7 + 1f48fb0: e2811010 add r1, r1, #16 + 1f48fb4: e5828000 str r8, [r2] + 1f48fb8: e5825004 str r5, [r2, #4] + 1f48fbc: e58d3048 str r3, [sp, #72] ; 0x48 + 1f48fc0: e58d104c str r1, [sp, #76] ; 0x4c + 1f48fc4: d2822008 addle r2, r2, #8 + 1f48fc8: dafffff3 ble 1f48f9c <_svfiprintf_r+0x8c8> + 1f48fcc: e28d2044 add r2, sp, #68 ; 0x44 + 1f48fd0: e1a0100b mov r1, fp + 1f48fd4: e1a00004 mov r0, r4 + 1f48fd8: ebfffd51 bl 1f48524 <__ssprint_r> + 1f48fdc: e3500000 cmp r0, #0 + 1f48fe0: 1a000118 bne 1f49448 <_svfiprintf_r+0xd74> + 1f48fe4: e2466010 sub r6, r6, #16 + 1f48fe8: e3560010 cmp r6, #16 + 1f48fec: e1a02007 mov r2, r7 + 1f48ff0: e59d104c ldr r1, [sp, #76] ; 0x4c + 1f48ff4: e59d3048 ldr r3, [sp, #72] ; 0x48 + 1f48ff8: caffffea bgt 1f48fa8 <_svfiprintf_r+0x8d4> + 1f48ffc: e1a04006 mov r4, r6 + 1f49000: e1a06002 mov r6, r2 + 1f49004: e2833001 add r3, r3, #1 + 1f49008: e3530007 cmp r3, #7 + 1f4900c: e58d3048 str r3, [sp, #72] ; 0x48 + 1f49010: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f49014: e0811004 add r1, r1, r4 + 1f49018: e58d104c str r1, [sp, #76] ; 0x4c + 1f4901c: e8860018 stm r6, {r3, r4} + 1f49020: ca000188 bgt 1f49648 <_svfiprintf_r+0xf74> + 1f49024: e59d3014 ldr r3, [sp, #20] + 1f49028: e59d201c ldr r2, [sp, #28] + 1f4902c: e59d0000 ldr r0, [sp] + 1f49030: e1520000 cmp r2, r0 + 1f49034: a0833002 addge r3, r3, r2 + 1f49038: b0833000 addlt r3, r3, r0 + 1f4903c: e3510000 cmp r1, #0 + 1f49040: e58d3014 str r3, [sp, #20] + 1f49044: 1a00014e bne 1f49584 <_svfiprintf_r+0xeb0> + 1f49048: e3a03000 mov r3, #0 + 1f4904c: e1a06007 mov r6, r7 + 1f49050: e58d3048 str r3, [sp, #72] ; 0x48 + 1f49054: eafffdb6 b 1f48734 <_svfiprintf_r+0x60> + 1f49058: e3510000 cmp r1, #0 + 1f4905c: e3855010 orr r5, r5, #16 + 1f49060: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f49064: e2153020 ands r3, r5, #32 + 1f49068: e58dc01c str ip, [sp, #28] + 1f4906c: 1afffe74 bne 1f48a44 <_svfiprintf_r+0x370> + 1f49070: e2152010 ands r2, r5, #16 + 1f49074: 0a000182 beq 1f49684 <_svfiprintf_r+0xfb0> + 1f49078: e59d1020 ldr r1, [sp, #32] + 1f4907c: e5912000 ldr r2, [r1] + 1f49080: e281e004 add lr, r1, #4 + 1f49084: e1a00002 mov r0, r2 + 1f49088: e3a01000 mov r1, #0 + 1f4908c: e59dc008 ldr ip, [sp, #8] + 1f49090: e35c0000 cmp ip, #0 + 1f49094: e5cd303f strb r3, [sp, #63] ; 0x3f + 1f49098: e88d0003 stm sp, {r0, r1} + 1f4909c: ba000226 blt 1f4993c <_svfiprintf_r+0x1268> + 1f490a0: e1822001 orr r2, r2, r1 + 1f490a4: e3520000 cmp r2, #0 + 1f490a8: 035c0000 cmpeq ip, #0 + 1f490ac: 03a02000 moveq r2, #0 + 1f490b0: e58de020 str lr, [sp, #32] + 1f490b4: 13a02001 movne r2, #1 + 1f490b8: e3c55080 bic r5, r5, #128 ; 0x80 + 1f490bc: 01a04002 moveq r4, r2 + 1f490c0: 0afffe4d beq 1f489fc <_svfiprintf_r+0x328> + 1f490c4: e1a04003 mov r4, r3 + 1f490c8: ea000056 b 1f49228 <_svfiprintf_r+0xb54> + 1f490cc: e3510000 cmp r1, #0 + 1f490d0: e3855010 orr r5, r5, #16 + 1f490d4: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f490d8: e2153020 ands r3, r5, #32 + 1f490dc: e58dc01c str ip, [sp, #28] + 1f490e0: 1afffeb4 bne 1f48bb8 <_svfiprintf_r+0x4e4> + 1f490e4: e2152010 ands r2, r5, #16 + 1f490e8: 0a000185 beq 1f49704 <_svfiprintf_r+0x1030> + 1f490ec: e59d0008 ldr r0, [sp, #8] + 1f490f0: e59d1020 ldr r1, [sp, #32] + 1f490f4: e3500000 cmp r0, #0 + 1f490f8: e5cd303f strb r3, [sp, #63] ; 0x3f + 1f490fc: e5912000 ldr r2, [r1] + 1f49100: e2810004 add r0, r1, #4 + 1f49104: e3a03000 mov r3, #0 + 1f49108: ba0001d0 blt 1f49850 <_svfiprintf_r+0x117c> + 1f4910c: 13a01001 movne r1, #1 + 1f49110: 03a01000 moveq r1, #0 + 1f49114: e192c003 orrs ip, r2, r3 + 1f49118: 13811001 orrne r1, r1, #1 + 1f4911c: e3510000 cmp r1, #0 + 1f49120: e58d0020 str r0, [sp, #32] + 1f49124: e3c55080 bic r5, r5, #128 ; 0x80 + 1f49128: 1afffeb3 bne 1f48bfc <_svfiprintf_r+0x528> + 1f4912c: e2154001 ands r4, r5, #1 + 1f49130: 058d702c streq r7, [sp, #44] ; 0x2c + 1f49134: 058d4010 streq r4, [sp, #16] + 1f49138: 0afffe33 beq 1f48a0c <_svfiprintf_r+0x338> + 1f4913c: e3a03030 mov r3, #48 ; 0x30 + 1f49140: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f49144: e5cd3077 strb r3, [sp, #119] ; 0x77 + 1f49148: e28d3077 add r3, sp, #119 ; 0x77 + 1f4914c: e58d2010 str r2, [sp, #16] + 1f49150: e3a04000 mov r4, #0 + 1f49154: e58d302c str r3, [sp, #44] ; 0x2c + 1f49158: eafffe2b b 1f48a0c <_svfiprintf_r+0x338> + 1f4915c: e3510000 cmp r1, #0 + 1f49160: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f49164: e3150020 tst r5, #32 + 1f49168: 1a00017d bne 1f49764 <_svfiprintf_r+0x1090> + 1f4916c: e3150010 tst r5, #16 + 1f49170: 1a000199 bne 1f497dc <_svfiprintf_r+0x1108> + 1f49174: e3150040 tst r5, #64 ; 0x40 + 1f49178: 0a000197 beq 1f497dc <_svfiprintf_r+0x1108> + 1f4917c: e59d2020 ldr r2, [sp, #32] + 1f49180: e5923000 ldr r3, [r2] + 1f49184: e2822004 add r2, r2, #4 + 1f49188: e58d2020 str r2, [sp, #32] + 1f4918c: e1dd21b4 ldrh r2, [sp, #20] + 1f49190: e1c320b0 strh r2, [r3] + 1f49194: eafffd66 b 1f48734 <_svfiprintf_r+0x60> + 1f49198: e5da3000 ldrb r3, [sl] + 1f4919c: e353006c cmp r3, #108 ; 0x6c + 1f491a0: 05da3001 ldrbeq r3, [sl, #1] + 1f491a4: 03855020 orreq r5, r5, #32 + 1f491a8: 028aa001 addeq sl, sl, #1 + 1f491ac: 13855010 orrne r5, r5, #16 + 1f491b0: eafffd85 b 1f487cc <_svfiprintf_r+0xf8> + 1f491b4: e3855040 orr r5, r5, #64 ; 0x40 + 1f491b8: e5da3000 ldrb r3, [sl] + 1f491bc: eafffd82 b 1f487cc <_svfiprintf_r+0xf8> + 1f491c0: e3510000 cmp r1, #0 + 1f491c4: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f491c8: e3150020 tst r5, #32 + 1f491cc: e58dc01c str ip, [sp, #28] + 1f491d0: 0a00003e beq 1f492d0 <_svfiprintf_r+0xbfc> + 1f491d4: e59d3020 ldr r3, [sp, #32] + 1f491d8: e2833007 add r3, r3, #7 + 1f491dc: e3c31007 bic r1, r3, #7 + 1f491e0: e891000c ldm r1, {r2, r3} + 1f491e4: e3520000 cmp r2, #0 + 1f491e8: e2811008 add r1, r1, #8 + 1f491ec: e88d000c stm sp, {r2, r3} + 1f491f0: e2d33000 sbcs r3, r3, #0 + 1f491f4: e58d1020 str r1, [sp, #32] + 1f491f8: ba000043 blt 1f4930c <_svfiprintf_r+0xc38> + 1f491fc: e59d2008 ldr r2, [sp, #8] + 1f49200: e3520000 cmp r2, #0 + 1f49204: ba000006 blt 1f49224 <_svfiprintf_r+0xb50> + 1f49208: e89d0018 ldm sp, {r3, r4} + 1f4920c: e1a01003 mov r1, r3 + 1f49210: e1813004 orr r3, r1, r4 + 1f49214: e3530000 cmp r3, #0 + 1f49218: 03520000 cmpeq r2, #0 + 1f4921c: e3c55080 bic r5, r5, #128 ; 0x80 + 1f49220: 0a000106 beq 1f49640 <_svfiprintf_r+0xf6c> + 1f49224: e5dd403f ldrb r4, [sp, #63] ; 0x3f + 1f49228: e89d000c ldm sp, {r2, r3} + 1f4922c: e3530000 cmp r3, #0 + 1f49230: 03520009 cmpeq r2, #9 + 1f49234: 9a00010b bls 1f49668 <_svfiprintf_r+0xf94> + 1f49238: e58d6010 str r6, [sp, #16] + 1f4923c: e1a06007 mov r6, r7 + 1f49240: e58d500c str r5, [sp, #12] + 1f49244: e58d4024 str r4, [sp, #36] ; 0x24 + 1f49248: e89d0030 ldm sp, {r4, r5} + 1f4924c: e1a00004 mov r0, r4 + 1f49250: e1a01005 mov r1, r5 + 1f49254: e3a0200a mov r2, #10 + 1f49258: e3a03000 mov r3, #0 + 1f4925c: eb000b3e bl 1f4bf5c <__aeabi_uldivmod> + 1f49260: e2822030 add r2, r2, #48 ; 0x30 + 1f49264: e5662001 strb r2, [r6, #-1]! + 1f49268: e1a00004 mov r0, r4 + 1f4926c: e1a01005 mov r1, r5 + 1f49270: e3a03000 mov r3, #0 + 1f49274: e3a0200a mov r2, #10 + 1f49278: eb000b37 bl 1f4bf5c <__aeabi_uldivmod> + 1f4927c: e1a04000 mov r4, r0 + 1f49280: e1a05001 mov r5, r1 + 1f49284: e1943005 orrs r3, r4, r5 + 1f49288: 1affffef bne 1f4924c <_svfiprintf_r+0xb78> + 1f4928c: e1a03006 mov r3, r6 + 1f49290: e28d500c add r5, sp, #12 + 1f49294: e0633007 rsb r3, r3, r7 + 1f49298: e58d602c str r6, [sp, #44] ; 0x2c + 1f4929c: e59d4024 ldr r4, [sp, #36] ; 0x24 + 1f492a0: e8950060 ldm r5, {r5, r6} + 1f492a4: e58d3010 str r3, [sp, #16] + 1f492a8: eafffdd7 b 1f48a0c <_svfiprintf_r+0x338> + 1f492ac: e3855020 orr r5, r5, #32 + 1f492b0: e5da3000 ldrb r3, [sl] + 1f492b4: eafffd44 b 1f487cc <_svfiprintf_r+0xf8> + 1f492b8: e3510000 cmp r1, #0 + 1f492bc: e3855010 orr r5, r5, #16 + 1f492c0: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f492c4: e3150020 tst r5, #32 + 1f492c8: e58dc01c str ip, [sp, #28] + 1f492cc: 1affffc0 bne 1f491d4 <_svfiprintf_r+0xb00> + 1f492d0: e59d0020 ldr r0, [sp, #32] + 1f492d4: e3150010 tst r5, #16 + 1f492d8: e1a03000 mov r3, r0 + 1f492dc: 0a00011c beq 1f49754 <_svfiprintf_r+0x1080> + 1f492e0: e5933000 ldr r3, [r3] + 1f492e4: e1a01003 mov r1, r3 + 1f492e8: e1a02fc3 asr r2, r3, #31 + 1f492ec: e1a03002 mov r3, r2 + 1f492f0: e1a02001 mov r2, r1 + 1f492f4: e3520000 cmp r2, #0 + 1f492f8: e88d000c stm sp, {r2, r3} + 1f492fc: e2801004 add r1, r0, #4 + 1f49300: e2d33000 sbcs r3, r3, #0 + 1f49304: e58d1020 str r1, [sp, #32] + 1f49308: aaffffbb bge 1f491fc <_svfiprintf_r+0xb28> + 1f4930c: e3a0402d mov r4, #45 ; 0x2d + 1f49310: e89d000c ldm sp, {r2, r3} + 1f49314: e2722000 rsbs r2, r2, #0 + 1f49318: e2e33000 rsc r3, r3, #0 + 1f4931c: e88d000c stm sp, {r2, r3} + 1f49320: e59d3008 ldr r3, [sp, #8] + 1f49324: e3530000 cmp r3, #0 + 1f49328: e5cd403f strb r4, [sp, #63] ; 0x3f + 1f4932c: a3c55080 bicge r5, r5, #128 ; 0x80 + 1f49330: eaffffbc b 1f49228 <_svfiprintf_r+0xb54> + 1f49334: e3a0c000 mov ip, #0 + 1f49338: e2432030 sub r2, r3, #48 ; 0x30 + 1f4933c: e4da3001 ldrb r3, [sl], #1 + 1f49340: e08cc10c add ip, ip, ip, lsl #2 + 1f49344: e082c08c add ip, r2, ip, lsl #1 + 1f49348: e2432030 sub r2, r3, #48 ; 0x30 + 1f4934c: e3520009 cmp r2, #9 + 1f49350: 9afffff9 bls 1f4933c <_svfiprintf_r+0xc68> + 1f49354: eafffd1d b 1f487d0 <_svfiprintf_r+0xfc> + 1f49358: e3855080 orr r5, r5, #128 ; 0x80 + 1f4935c: e5da3000 ldrb r3, [sl] + 1f49360: eafffd19 b 1f487cc <_svfiprintf_r+0xf8> + 1f49364: e5da3000 ldrb r3, [sl] + 1f49368: e353002a cmp r3, #42 ; 0x2a + 1f4936c: e28ae001 add lr, sl, #1 + 1f49370: 0a000179 beq 1f4995c <_svfiprintf_r+0x1288> + 1f49374: e2432030 sub r2, r3, #48 ; 0x30 + 1f49378: e3520009 cmp r2, #9 + 1f4937c: 83a02000 movhi r2, #0 + 1f49380: 81a0a00e movhi sl, lr + 1f49384: 858d2008 strhi r2, [sp, #8] + 1f49388: 8afffd10 bhi 1f487d0 <_svfiprintf_r+0xfc> + 1f4938c: e3a04000 mov r4, #0 + 1f49390: e4de3001 ldrb r3, [lr], #1 + 1f49394: e0844104 add r4, r4, r4, lsl #2 + 1f49398: e0824084 add r4, r2, r4, lsl #1 + 1f4939c: e2432030 sub r2, r3, #48 ; 0x30 + 1f493a0: e3520009 cmp r2, #9 + 1f493a4: 9afffff9 bls 1f49390 <_svfiprintf_r+0xcbc> + 1f493a8: e1842fc4 orr r2, r4, r4, asr #31 + 1f493ac: e58d2008 str r2, [sp, #8] + 1f493b0: e1a0a00e mov sl, lr + 1f493b4: eafffd05 b 1f487d0 <_svfiprintf_r+0xfc> + 1f493b8: e3510000 cmp r1, #0 + 1f493bc: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f493c0: e3150020 tst r5, #32 + 1f493c4: e58dc01c str ip, [sp, #28] + 1f493c8: e59f230c ldr r2, [pc, #780] ; 1f496dc <_svfiprintf_r+0x1008> + 1f493cc: 1afffd78 bne 1f489b4 <_svfiprintf_r+0x2e0> + 1f493d0: e3150010 tst r5, #16 + 1f493d4: 1a0000c4 bne 1f496ec <_svfiprintf_r+0x1018> + 1f493d8: e3150040 tst r5, #64 ; 0x40 + 1f493dc: 0a000105 beq 1f497f8 <_svfiprintf_r+0x1124> + 1f493e0: e59d1020 ldr r1, [sp, #32] + 1f493e4: e1d100b0 ldrh r0, [r1] + 1f493e8: e2811004 add r1, r1, #4 + 1f493ec: e58d1020 str r1, [sp, #32] + 1f493f0: e3a01000 mov r1, #0 + 1f493f4: eafffd74 b 1f489cc <_svfiprintf_r+0x2f8> + 1f493f8: e3510000 cmp r1, #0 + 1f493fc: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f49400: e3530000 cmp r3, #0 + 1f49404: e58dc01c str ip, [sp, #28] + 1f49408: 0a000008 beq 1f49430 <_svfiprintf_r+0xd5c> + 1f4940c: e3a01001 mov r1, #1 + 1f49410: e3a02000 mov r2, #0 + 1f49414: e5cd3050 strb r3, [sp, #80] ; 0x50 + 1f49418: e28d3050 add r3, sp, #80 ; 0x50 + 1f4941c: e58d1000 str r1, [sp] + 1f49420: e5cd203f strb r2, [sp, #63] ; 0x3f + 1f49424: e58d1010 str r1, [sp, #16] + 1f49428: e58d302c str r3, [sp, #44] ; 0x2c + 1f4942c: eafffe1a b 1f48c9c <_svfiprintf_r+0x5c8> + 1f49430: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f49434: e3530000 cmp r3, #0 + 1f49438: 159d0018 ldrne r0, [sp, #24] + 1f4943c: 128d2044 addne r2, sp, #68 ; 0x44 + 1f49440: 11a0100b movne r1, fp + 1f49444: 1bfffc36 blne 1f48524 <__ssprint_r> + 1f49448: e1db30bc ldrh r3, [fp, #12] + 1f4944c: e3130040 tst r3, #64 ; 0x40 + 1f49450: e59d0014 ldr r0, [sp, #20] + 1f49454: 13e00000 mvnne r0, #0 + 1f49458: e28dd0bc add sp, sp, #188 ; 0xbc + 1f4945c: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f49460: e12fff1e bx lr + 1f49464: e59d301c ldr r3, [sp, #28] + 1f49468: e59d0000 ldr r0, [sp] + 1f4946c: e0604003 rsb r4, r0, r3 + 1f49470: e3540000 cmp r4, #0 + 1f49474: dafffe6f ble 1f48e38 <_svfiprintf_r+0x764> + 1f49478: e3540010 cmp r4, #16 + 1f4947c: d59f3254 ldrle r3, [pc, #596] ; 1f496d8 <_svfiprintf_r+0x1004> + 1f49480: d58d3024 strle r3, [sp, #36] ; 0x24 + 1f49484: da000022 ble 1f49514 <_svfiprintf_r+0xe40> + 1f49488: e59f0248 ldr r0, [pc, #584] ; 1f496d8 <_svfiprintf_r+0x1004> + 1f4948c: e3a03010 mov r3, #16 + 1f49490: e58d0024 str r0, [sp, #36] ; 0x24 + 1f49494: e1a00006 mov r0, r6 + 1f49498: e1a06005 mov r6, r5 + 1f4949c: e59d5018 ldr r5, [sp, #24] + 1f494a0: ea000002 b 1f494b0 <_svfiprintf_r+0xddc> + 1f494a4: e2444010 sub r4, r4, #16 + 1f494a8: e3540010 cmp r4, #16 + 1f494ac: da000016 ble 1f4950c <_svfiprintf_r+0xe38> + 1f494b0: e2822001 add r2, r2, #1 + 1f494b4: e3520007 cmp r2, #7 + 1f494b8: e2811010 add r1, r1, #16 + 1f494bc: e5809000 str r9, [r0] + 1f494c0: e5803004 str r3, [r0, #4] + 1f494c4: e58d2048 str r2, [sp, #72] ; 0x48 + 1f494c8: e58d104c str r1, [sp, #76] ; 0x4c + 1f494cc: d2800008 addle r0, r0, #8 + 1f494d0: dafffff3 ble 1f494a4 <_svfiprintf_r+0xdd0> + 1f494d4: e28d2044 add r2, sp, #68 ; 0x44 + 1f494d8: e1a0100b mov r1, fp + 1f494dc: e1a00005 mov r0, r5 + 1f494e0: e58d300c str r3, [sp, #12] + 1f494e4: ebfffc0e bl 1f48524 <__ssprint_r> + 1f494e8: e3500000 cmp r0, #0 + 1f494ec: 1affffd5 bne 1f49448 <_svfiprintf_r+0xd74> + 1f494f0: e2444010 sub r4, r4, #16 + 1f494f4: e3540010 cmp r4, #16 + 1f494f8: e1a00007 mov r0, r7 + 1f494fc: e59d104c ldr r1, [sp, #76] ; 0x4c + 1f49500: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f49504: e59d300c ldr r3, [sp, #12] + 1f49508: caffffe8 bgt 1f494b0 <_svfiprintf_r+0xddc> + 1f4950c: e1a05006 mov r5, r6 + 1f49510: e1a06000 mov r6, r0 + 1f49514: e2822001 add r2, r2, #1 + 1f49518: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f4951c: e3520007 cmp r2, #7 + 1f49520: e0811004 add r1, r1, r4 + 1f49524: e8860018 stm r6, {r3, r4} + 1f49528: e58d2048 str r2, [sp, #72] ; 0x48 + 1f4952c: e58d104c str r1, [sp, #76] ; 0x4c + 1f49530: d2866008 addle r6, r6, #8 + 1f49534: dafffe3f ble 1f48e38 <_svfiprintf_r+0x764> + 1f49538: e28d2044 add r2, sp, #68 ; 0x44 + 1f4953c: e1a0100b mov r1, fp + 1f49540: e59d0018 ldr r0, [sp, #24] + 1f49544: ebfffbf6 bl 1f48524 <__ssprint_r> + 1f49548: e3500000 cmp r0, #0 + 1f4954c: 1affffbd bne 1f49448 <_svfiprintf_r+0xd74> + 1f49550: e1a06007 mov r6, r7 + 1f49554: e59d104c ldr r1, [sp, #76] ; 0x4c + 1f49558: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f4955c: eafffe35 b 1f48e38 <_svfiprintf_r+0x764> + 1f49560: e28d2044 add r2, sp, #68 ; 0x44 + 1f49564: e1a0100b mov r1, fp + 1f49568: e59d0018 ldr r0, [sp, #24] + 1f4956c: ebfffbec bl 1f48524 <__ssprint_r> + 1f49570: e3500000 cmp r0, #0 + 1f49574: 1affffb3 bne 1f49448 <_svfiprintf_r+0xd74> + 1f49578: e1a06007 mov r6, r7 + 1f4957c: e59d104c ldr r1, [sp, #76] ; 0x4c + 1f49580: eafffe74 b 1f48f58 <_svfiprintf_r+0x884> + 1f49584: e28d2044 add r2, sp, #68 ; 0x44 + 1f49588: e1a0100b mov r1, fp + 1f4958c: e59d0018 ldr r0, [sp, #24] + 1f49590: ebfffbe3 bl 1f48524 <__ssprint_r> + 1f49594: e3500000 cmp r0, #0 + 1f49598: 0afffeaa beq 1f49048 <_svfiprintf_r+0x974> + 1f4959c: eaffffa9 b 1f49448 <_svfiprintf_r+0xd74> + 1f495a0: e28d2044 add r2, sp, #68 ; 0x44 + 1f495a4: e1a0100b mov r1, fp + 1f495a8: e59d0018 ldr r0, [sp, #24] + 1f495ac: ebfffbdc bl 1f48524 <__ssprint_r> + 1f495b0: e3500000 cmp r0, #0 + 1f495b4: 1affffa3 bne 1f49448 <_svfiprintf_r+0xd74> + 1f495b8: e1a06007 mov r6, r7 + 1f495bc: eafffc72 b 1f4878c <_svfiprintf_r+0xb8> + 1f495c0: e28d2044 add r2, sp, #68 ; 0x44 + 1f495c4: e1a0100b mov r1, fp + 1f495c8: e59d0018 ldr r0, [sp, #24] + 1f495cc: ebfffbd4 bl 1f48524 <__ssprint_r> + 1f495d0: e3500000 cmp r0, #0 + 1f495d4: 1affff9b bne 1f49448 <_svfiprintf_r+0xd74> + 1f495d8: e1a06007 mov r6, r7 + 1f495dc: e59d104c ldr r1, [sp, #76] ; 0x4c + 1f495e0: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f495e4: eafffe10 b 1f48e2c <_svfiprintf_r+0x758> + 1f495e8: e28d2044 add r2, sp, #68 ; 0x44 + 1f495ec: e1a0100b mov r1, fp + 1f495f0: e59d0018 ldr r0, [sp, #24] + 1f495f4: ebfffbca bl 1f48524 <__ssprint_r> + 1f495f8: e3500000 cmp r0, #0 + 1f495fc: 1affff91 bne 1f49448 <_svfiprintf_r+0xd74> + 1f49600: e1a06007 mov r6, r7 + 1f49604: e59d104c ldr r1, [sp, #76] ; 0x4c + 1f49608: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f4960c: eafffdf8 b 1f48df4 <_svfiprintf_r+0x720> + 1f49610: e59de008 ldr lr, [sp, #8] + 1f49614: e35e0000 cmp lr, #0 + 1f49618: e5cdc03f strb ip, [sp, #63] ; 0x3f + 1f4961c: bafffd50 blt 1f48b64 <_svfiprintf_r+0x490> + 1f49620: e1803001 orr r3, r0, r1 + 1f49624: e3530000 cmp r3, #0 + 1f49628: 035e0000 cmpeq lr, #0 + 1f4962c: e3c55080 bic r5, r5, #128 ; 0x80 + 1f49630: 13a04001 movne r4, #1 + 1f49634: 03a04000 moveq r4, #0 + 1f49638: 1afffd49 bne 1f48b64 <_svfiprintf_r+0x490> + 1f4963c: eafffcee b 1f489fc <_svfiprintf_r+0x328> + 1f49640: e5dd403f ldrb r4, [sp, #63] ; 0x3f + 1f49644: eafffcec b 1f489fc <_svfiprintf_r+0x328> + 1f49648: e28d2044 add r2, sp, #68 ; 0x44 + 1f4964c: e1a0100b mov r1, fp + 1f49650: e59d0018 ldr r0, [sp, #24] + 1f49654: ebfffbb2 bl 1f48524 <__ssprint_r> + 1f49658: e3500000 cmp r0, #0 + 1f4965c: 1affff79 bne 1f49448 <_svfiprintf_r+0xd74> + 1f49660: e59d104c ldr r1, [sp, #76] ; 0x4c + 1f49664: eafffe6e b 1f49024 <_svfiprintf_r+0x950> + 1f49668: e2823030 add r3, r2, #48 ; 0x30 + 1f4966c: e5cd3077 strb r3, [sp, #119] ; 0x77 + 1f49670: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f49674: e58d3010 str r3, [sp, #16] + 1f49678: e28d3077 add r3, sp, #119 ; 0x77 + 1f4967c: e58d302c str r3, [sp, #44] ; 0x2c + 1f49680: eafffce1 b 1f48a0c <_svfiprintf_r+0x338> + 1f49684: e2154040 ands r4, r5, #64 ; 0x40 + 1f49688: 0a000072 beq 1f49858 <_svfiprintf_r+0x1184> + 1f4968c: e59d1020 ldr r1, [sp, #32] + 1f49690: e1d130b0 ldrh r3, [r1] + 1f49694: e281e004 add lr, r1, #4 + 1f49698: e1a00003 mov r0, r3 + 1f4969c: e3a01000 mov r1, #0 + 1f496a0: e59dc008 ldr ip, [sp, #8] + 1f496a4: e35c0000 cmp ip, #0 + 1f496a8: e5cd203f strb r2, [sp, #63] ; 0x3f + 1f496ac: e88d0003 stm sp, {r0, r1} + 1f496b0: ba00008d blt 1f498ec <_svfiprintf_r+0x1218> + 1f496b4: e35c0000 cmp ip, #0 + 1f496b8: 03530000 cmpeq r3, #0 + 1f496bc: e58de020 str lr, [sp, #32] + 1f496c0: 13a03001 movne r3, #1 + 1f496c4: 03a03000 moveq r3, #0 + 1f496c8: e3c55080 bic r5, r5, #128 ; 0x80 + 1f496cc: 0afffcef beq 1f48a90 <_svfiprintf_r+0x3bc> + 1f496d0: e1a04002 mov r4, r2 + 1f496d4: eafffed3 b 1f49228 <_svfiprintf_r+0xb54> + 1f496d8: 01f631b0 .word 0x01f631b0 + 1f496dc: 01f62ef8 .word 0x01f62ef8 + 1f496e0: 01f62f0c .word 0x01f62f0c + 1f496e4: 01f631a0 .word 0x01f631a0 + 1f496e8: 01f62f20 .word 0x01f62f20 + 1f496ec: e59d1020 ldr r1, [sp, #32] + 1f496f0: e5910000 ldr r0, [r1] + 1f496f4: e2811004 add r1, r1, #4 + 1f496f8: e58d1020 str r1, [sp, #32] + 1f496fc: e3a01000 mov r1, #0 + 1f49700: eafffcb1 b 1f489cc <_svfiprintf_r+0x2f8> + 1f49704: e2153040 ands r3, r5, #64 ; 0x40 + 1f49708: 0a000040 beq 1f49810 <_svfiprintf_r+0x113c> + 1f4970c: e59d3020 ldr r3, [sp, #32] + 1f49710: e59d1008 ldr r1, [sp, #8] + 1f49714: e1d300b0 ldrh r0, [r3] + 1f49718: e3510000 cmp r1, #0 + 1f4971c: e5cd203f strb r2, [sp, #63] ; 0x3f + 1f49720: e283c004 add ip, r3, #4 + 1f49724: e1a02000 mov r2, r0 + 1f49728: e3a03000 mov r3, #0 + 1f4972c: ba00006c blt 1f498e4 <_svfiprintf_r+0x1210> + 1f49730: 13a01001 movne r1, #1 + 1f49734: 03a01000 moveq r1, #0 + 1f49738: e3500000 cmp r0, #0 + 1f4973c: 13811001 orrne r1, r1, #1 + 1f49740: e3510000 cmp r1, #0 + 1f49744: e58dc020 str ip, [sp, #32] + 1f49748: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4974c: 1afffd2a bne 1f48bfc <_svfiprintf_r+0x528> + 1f49750: eafffe75 b 1f4912c <_svfiprintf_r+0xa58> + 1f49754: e3150040 tst r5, #64 ; 0x40 + 1f49758: 0afffee0 beq 1f492e0 <_svfiprintf_r+0xc0c> + 1f4975c: e1d030f0 ldrsh r3, [r0] + 1f49760: eafffedf b 1f492e4 <_svfiprintf_r+0xc10> + 1f49764: e59d3020 ldr r3, [sp, #32] + 1f49768: e59d2014 ldr r2, [sp, #20] + 1f4976c: e5931000 ldr r1, [r3] + 1f49770: e2833004 add r3, r3, #4 + 1f49774: e58d3020 str r3, [sp, #32] + 1f49778: e1a03fc2 asr r3, r2, #31 + 1f4977c: e881000c stm r1, {r2, r3} + 1f49780: eafffbeb b 1f48734 <_svfiprintf_r+0x60> + 1f49784: e3a0c000 mov ip, #0 + 1f49788: e3a0e030 mov lr, #48 ; 0x30 + 1f4978c: e59d4008 ldr r4, [sp, #8] + 1f49790: e154000c cmp r4, ip + 1f49794: e5cd3041 strb r3, [sp, #65] ; 0x41 + 1f49798: a3c53080 bicge r3, r5, #128 ; 0x80 + 1f4979c: e5cde040 strb lr, [sp, #64] ; 0x40 + 1f497a0: e5cdc03f strb ip, [sp, #63] ; 0x3f + 1f497a4: b3855002 orrlt r5, r5, #2 + 1f497a8: a3835002 orrge r5, r3, #2 + 1f497ac: eafffcec b 1f48b64 <_svfiprintf_r+0x490> + 1f497b0: e58d2020 str r2, [sp, #32] + 1f497b4: e3855002 orr r5, r5, #2 + 1f497b8: e51f20e0 ldr r2, [pc, #-224] ; 1f496e0 <_svfiprintf_r+0x100c> + 1f497bc: eafffce8 b 1f48b64 <_svfiprintf_r+0x490> + 1f497c0: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f497c4: e58d4008 str r4, [sp, #8] + 1f497c8: e58d3020 str r3, [sp, #32] + 1f497cc: ebffda4f bl 1f40110 + 1f497d0: e5dd403f ldrb r4, [sp, #63] ; 0x3f + 1f497d4: e58d0010 str r0, [sp, #16] + 1f497d8: eafffc8b b 1f48a0c <_svfiprintf_r+0x338> + 1f497dc: e59d2020 ldr r2, [sp, #32] + 1f497e0: e5923000 ldr r3, [r2] + 1f497e4: e2822004 add r2, r2, #4 + 1f497e8: e58d2020 str r2, [sp, #32] + 1f497ec: e59d2014 ldr r2, [sp, #20] + 1f497f0: e5832000 str r2, [r3] + 1f497f4: eafffbce b 1f48734 <_svfiprintf_r+0x60> + 1f497f8: e59dc020 ldr ip, [sp, #32] + 1f497fc: e59c0000 ldr r0, [ip] + 1f49800: e28cc004 add ip, ip, #4 + 1f49804: e3a01000 mov r1, #0 + 1f49808: e58dc020 str ip, [sp, #32] + 1f4980c: eafffc6e b 1f489cc <_svfiprintf_r+0x2f8> + 1f49810: e59d0008 ldr r0, [sp, #8] + 1f49814: e59d1020 ldr r1, [sp, #32] + 1f49818: e3500000 cmp r0, #0 + 1f4981c: e5cd303f strb r3, [sp, #63] ; 0x3f + 1f49820: e5912000 ldr r2, [r1] + 1f49824: e2810004 add r0, r1, #4 + 1f49828: e3a03000 mov r3, #0 + 1f4982c: ba000007 blt 1f49850 <_svfiprintf_r+0x117c> + 1f49830: e59dc008 ldr ip, [sp, #8] + 1f49834: e1821003 orr r1, r2, r3 + 1f49838: e3510000 cmp r1, #0 + 1f4983c: 035c0000 cmpeq ip, #0 + 1f49840: e58d0020 str r0, [sp, #32] + 1f49844: e3c55080 bic r5, r5, #128 ; 0x80 + 1f49848: 0afffe37 beq 1f4912c <_svfiprintf_r+0xa58> + 1f4984c: eafffcea b 1f48bfc <_svfiprintf_r+0x528> + 1f49850: e58d0020 str r0, [sp, #32] + 1f49854: eafffce8 b 1f48bfc <_svfiprintf_r+0x528> + 1f49858: e59d2020 ldr r2, [sp, #32] + 1f4985c: e59d1008 ldr r1, [sp, #8] + 1f49860: e5923000 ldr r3, [r2] + 1f49864: e3510000 cmp r1, #0 + 1f49868: e1a00003 mov r0, r3 + 1f4986c: e3a01000 mov r1, #0 + 1f49870: e2822004 add r2, r2, #4 + 1f49874: e5cd403f strb r4, [sp, #63] ; 0x3f + 1f49878: e88d0003 stm sp, {r0, r1} + 1f4987c: b58d2020 strlt r2, [sp, #32] + 1f49880: bafffe68 blt 1f49228 <_svfiprintf_r+0xb54> + 1f49884: e89d0003 ldm sp, {r0, r1} + 1f49888: e1803001 orr r3, r0, r1 + 1f4988c: e59d1008 ldr r1, [sp, #8] + 1f49890: e3530000 cmp r3, #0 + 1f49894: 03510000 cmpeq r1, #0 + 1f49898: e58d2020 str r2, [sp, #32] + 1f4989c: 13a03001 movne r3, #1 + 1f498a0: 03a03000 moveq r3, #0 + 1f498a4: e3c55080 bic r5, r5, #128 ; 0x80 + 1f498a8: 1afffe5e bne 1f49228 <_svfiprintf_r+0xb54> + 1f498ac: eafffc77 b 1f48a90 <_svfiprintf_r+0x3bc> + 1f498b0: e3a01040 mov r1, #64 ; 0x40 + 1f498b4: ebffd33b bl 1f3e5a8 <_malloc_r> + 1f498b8: e3500000 cmp r0, #0 + 1f498bc: 13a03040 movne r3, #64 ; 0x40 + 1f498c0: e58b0000 str r0, [fp] + 1f498c4: e58b0010 str r0, [fp, #16] + 1f498c8: 158b3014 strne r3, [fp, #20] + 1f498cc: 1afffb8c bne 1f48704 <_svfiprintf_r+0x30> + 1f498d0: e3a0300c mov r3, #12 + 1f498d4: e59d2018 ldr r2, [sp, #24] + 1f498d8: e3e00000 mvn r0, #0 + 1f498dc: e5823000 str r3, [r2] + 1f498e0: eafffedc b 1f49458 <_svfiprintf_r+0xd84> + 1f498e4: e58dc020 str ip, [sp, #32] + 1f498e8: eafffcc3 b 1f48bfc <_svfiprintf_r+0x528> + 1f498ec: e58de020 str lr, [sp, #32] + 1f498f0: eaffff76 b 1f496d0 <_svfiprintf_r+0xffc> + 1f498f4: e51f3218 ldr r3, [pc, #-536] ; 1f496e4 <_svfiprintf_r+0x1010> + 1f498f8: e59d104c ldr r1, [sp, #76] ; 0x4c + 1f498fc: e59d2048 ldr r2, [sp, #72] ; 0x48 + 1f49900: e58d3030 str r3, [sp, #48] ; 0x30 + 1f49904: eafffd1a b 1f48d74 <_svfiprintf_r+0x6a0> + 1f49908: e51f222c ldr r2, [pc, #-556] ; 1f496e4 <_svfiprintf_r+0x1010> + 1f4990c: e59d3048 ldr r3, [sp, #72] ; 0x48 + 1f49910: e58d2030 str r2, [sp, #48] ; 0x30 + 1f49914: eafffdba b 1f49004 <_svfiprintf_r+0x930> + 1f49918: e3520006 cmp r2, #6 + 1f4991c: 23a02006 movcs r2, #6 + 1f49920: e58d3020 str r3, [sp, #32] + 1f49924: e1c23fc2 bic r3, r2, r2, asr #31 + 1f49928: e58d3000 str r3, [sp] + 1f4992c: e51f324c ldr r3, [pc, #-588] ; 1f496e8 <_svfiprintf_r+0x1014> + 1f49930: e58d2010 str r2, [sp, #16] + 1f49934: e58d302c str r3, [sp, #44] ; 0x2c + 1f49938: eafffcd7 b 1f48c9c <_svfiprintf_r+0x5c8> + 1f4993c: e58de020 str lr, [sp, #32] + 1f49940: eafffddf b 1f490c4 <_svfiprintf_r+0x9f0> + 1f49944: e59d2008 ldr r2, [sp, #8] + 1f49948: e58d3020 str r3, [sp, #32] + 1f4994c: e58d2010 str r2, [sp, #16] + 1f49950: e58d0008 str r0, [sp, #8] + 1f49954: e5dd403f ldrb r4, [sp, #63] ; 0x3f + 1f49958: eafffc2b b 1f48a0c <_svfiprintf_r+0x338> + 1f4995c: e59d3020 ldr r3, [sp, #32] + 1f49960: e5932000 ldr r2, [r3] + 1f49964: e58d2008 str r2, [sp, #8] + 1f49968: e3520000 cmp r2, #0 + 1f4996c: e2832004 add r2, r3, #4 + 1f49970: e58d2020 str r2, [sp, #32] + 1f49974: e5da3001 ldrb r3, [sl, #1] + 1f49978: e1a0a00e mov sl, lr + 1f4997c: aafffb92 bge 1f487cc <_svfiprintf_r+0xf8> + 1f49980: eafffb8f b 1f487c4 <_svfiprintf_r+0xf0> + +01f49984 <__sprint_r.part.0>: + 1f49984: e5913064 ldr r3, [r1, #100] ; 0x64 + 1f49988: e3130a02 tst r3, #8192 ; 0x2000 + 1f4998c: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f49990: e1a0a002 mov sl, r2 + 1f49994: 0a000023 beq 1f49a28 <__sprint_r.part.0+0xa4> + 1f49998: e5923008 ldr r3, [r2, #8] + 1f4999c: e5929000 ldr r9, [r2] + 1f499a0: e3530000 cmp r3, #0 + 1f499a4: 11a07001 movne r7, r1 + 1f499a8: 11a08000 movne r8, r0 + 1f499ac: 12899008 addne r9, r9, #8 + 1f499b0: 0a00001a beq 1f49a20 <__sprint_r.part.0+0x9c> + 1f499b4: e5196004 ldr r6, [r9, #-4] + 1f499b8: e5195008 ldr r5, [r9, #-8] + 1f499bc: e1b06126 lsrs r6, r6, #2 + 1f499c0: 13a04000 movne r4, #0 + 1f499c4: 12455004 subne r5, r5, #4 + 1f499c8: 1a000002 bne 1f499d8 <__sprint_r.part.0+0x54> + 1f499cc: ea00000e b 1f49a0c <__sprint_r.part.0+0x88> + 1f499d0: e1560004 cmp r6, r4 + 1f499d4: 0a00000b beq 1f49a08 <__sprint_r.part.0+0x84> + 1f499d8: e1a02007 mov r2, r7 + 1f499dc: e5b51004 ldr r1, [r5, #4]! + 1f499e0: e1a00008 mov r0, r8 + 1f499e4: eb000670 bl 1f4b3ac <_fputwc_r> + 1f499e8: e3700001 cmn r0, #1 + 1f499ec: e2844001 add r4, r4, #1 + 1f499f0: 1afffff6 bne 1f499d0 <__sprint_r.part.0+0x4c> + 1f499f4: e3a03000 mov r3, #0 + 1f499f8: e58a3008 str r3, [sl, #8] + 1f499fc: e58a3004 str r3, [sl, #4] + 1f49a00: e8bd47f0 pop {r4, r5, r6, r7, r8, r9, sl, lr} + 1f49a04: e12fff1e bx lr + 1f49a08: e59a3008 ldr r3, [sl, #8] + 1f49a0c: e0433106 sub r3, r3, r6, lsl #2 + 1f49a10: e3530000 cmp r3, #0 + 1f49a14: e58a3008 str r3, [sl, #8] + 1f49a18: e2899008 add r9, r9, #8 + 1f49a1c: 1affffe4 bne 1f499b4 <__sprint_r.part.0+0x30> + 1f49a20: e3a00000 mov r0, #0 + 1f49a24: eafffff2 b 1f499f4 <__sprint_r.part.0+0x70> + 1f49a28: eb000692 bl 1f4b478 <__sfvwrite_r> + 1f49a2c: eafffff0 b 1f499f4 <__sprint_r.part.0+0x70> + +01f49a30 <__sprint_r>: + 1f49a30: e5923008 ldr r3, [r2, #8] + 1f49a34: e3530000 cmp r3, #0 + 1f49a38: 1affffd1 bne 1f49984 <__sprint_r.part.0> + 1f49a3c: e5823004 str r3, [r2, #4] + 1f49a40: e1a00003 mov r0, r3 + 1f49a44: e12fff1e bx lr + +01f49a48 <_vfiprintf_r>: + 1f49a48: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f49a4c: e1a04003 mov r4, r3 + 1f49a50: e24dd0bc sub sp, sp, #188 ; 0xbc + 1f49a54: e2503000 subs r3, r0, #0 + 1f49a58: e58d301c str r3, [sp, #28] + 1f49a5c: e58d1004 str r1, [sp, #4] + 1f49a60: e1a06002 mov r6, r2 + 1f49a64: e58d4020 str r4, [sp, #32] + 1f49a68: 0a000002 beq 1f49a78 <_vfiprintf_r+0x30> + 1f49a6c: e5933038 ldr r3, [r3, #56] ; 0x38 + 1f49a70: e3530000 cmp r3, #0 + 1f49a74: 0a0000c0 beq 1f49d7c <_vfiprintf_r+0x334> + 1f49a78: e59d3004 ldr r3, [sp, #4] + 1f49a7c: e1d310fc ldrsh r1, [r3, #12] + 1f49a80: e1a02801 lsl r2, r1, #16 + 1f49a84: e3120202 tst r2, #536870912 ; 0x20000000 + 1f49a88: e1a02822 lsr r2, r2, #16 + 1f49a8c: 1a000007 bne 1f49ab0 <_vfiprintf_r+0x68> + 1f49a90: e1a02003 mov r2, r3 + 1f49a94: e5933064 ldr r3, [r3, #100] ; 0x64 + 1f49a98: e3811a02 orr r1, r1, #8192 ; 0x2000 + 1f49a9c: e1c210bc strh r1, [r2, #12] + 1f49aa0: e3c33a02 bic r3, r3, #8192 ; 0x2000 + 1f49aa4: e1a01801 lsl r1, r1, #16 + 1f49aa8: e5823064 str r3, [r2, #100] ; 0x64 + 1f49aac: e1a02821 lsr r2, r1, #16 + 1f49ab0: e3120008 tst r2, #8 + 1f49ab4: 0a00009b beq 1f49d28 <_vfiprintf_r+0x2e0> + 1f49ab8: e59d3004 ldr r3, [sp, #4] + 1f49abc: e5933010 ldr r3, [r3, #16] + 1f49ac0: e3530000 cmp r3, #0 + 1f49ac4: 0a000097 beq 1f49d28 <_vfiprintf_r+0x2e0> + 1f49ac8: e202201a and r2, r2, #26 + 1f49acc: e352000a cmp r2, #10 + 1f49ad0: 0a00009e beq 1f49d50 <_vfiprintf_r+0x308> + 1f49ad4: e3a03000 mov r3, #0 + 1f49ad8: e28db078 add fp, sp, #120 ; 0x78 + 1f49adc: e1a0900b mov r9, fp + 1f49ae0: e58d3014 str r3, [sp, #20] + 1f49ae4: e58d304c str r3, [sp, #76] ; 0x4c + 1f49ae8: e58d3048 str r3, [sp, #72] ; 0x48 + 1f49aec: e28d3077 add r3, sp, #119 ; 0x77 + 1f49af0: e063300b rsb r3, r3, fp + 1f49af4: e58db044 str fp, [sp, #68] ; 0x44 + 1f49af8: e59fafd8 ldr sl, [pc, #4056] ; 1f4aad8 <_vfiprintf_r+0x1090> + 1f49afc: e59f7fc8 ldr r7, [pc, #4040] ; 1f4aacc <_vfiprintf_r+0x1084> + 1f49b00: e58d3034 str r3, [sp, #52] ; 0x34 + 1f49b04: e5d63000 ldrb r3, [r6] + 1f49b08: e3530000 cmp r3, #0 + 1f49b0c: 13530025 cmpne r3, #37 ; 0x25 + 1f49b10: e1a04006 mov r4, r6 + 1f49b14: 0a000013 beq 1f49b68 <_vfiprintf_r+0x120> + 1f49b18: e5f43001 ldrb r3, [r4, #1]! + 1f49b1c: e3530000 cmp r3, #0 + 1f49b20: 13530025 cmpne r3, #37 ; 0x25 + 1f49b24: 1afffffb bne 1f49b18 <_vfiprintf_r+0xd0> + 1f49b28: e0545006 subs r5, r4, r6 + 1f49b2c: 0a00000d beq 1f49b68 <_vfiprintf_r+0x120> + 1f49b30: e59d3048 ldr r3, [sp, #72] ; 0x48 + 1f49b34: e59d204c ldr r2, [sp, #76] ; 0x4c + 1f49b38: e2833001 add r3, r3, #1 + 1f49b3c: e3530007 cmp r3, #7 + 1f49b40: e0852002 add r2, r5, r2 + 1f49b44: e5896000 str r6, [r9] + 1f49b48: e5895004 str r5, [r9, #4] + 1f49b4c: e58d3048 str r3, [sp, #72] ; 0x48 + 1f49b50: e58d204c str r2, [sp, #76] ; 0x4c + 1f49b54: d2899008 addle r9, r9, #8 + 1f49b58: ca00006d bgt 1f49d14 <_vfiprintf_r+0x2cc> + 1f49b5c: e59d3014 ldr r3, [sp, #20] + 1f49b60: e0833005 add r3, r3, r5 + 1f49b64: e58d3014 str r3, [sp, #20] + 1f49b68: e5d43000 ldrb r3, [r4] + 1f49b6c: e3530000 cmp r3, #0 + 1f49b70: 0a000333 beq 1f4a844 <_vfiprintf_r+0xdfc> + 1f49b74: e3a03000 mov r3, #0 + 1f49b78: e1a01003 mov r1, r3 + 1f49b7c: e5cd303f strb r3, [sp, #63] ; 0x3f + 1f49b80: e1a00003 mov r0, r3 + 1f49b84: e1a0c003 mov ip, r3 + 1f49b88: e1a05003 mov r5, r3 + 1f49b8c: e5d43001 ldrb r3, [r4, #1] + 1f49b90: e2846001 add r6, r4, #1 + 1f49b94: e3e02000 mvn r2, #0 + 1f49b98: e58d2010 str r2, [sp, #16] + 1f49b9c: e2866001 add r6, r6, #1 + 1f49ba0: e2432020 sub r2, r3, #32 + 1f49ba4: e3520058 cmp r2, #88 ; 0x58 + 1f49ba8: 979ff102 ldrls pc, [pc, r2, lsl #2] + 1f49bac: ea000299 b 1f4a618 <_vfiprintf_r+0xbd0> + 1f49bb0: 01f4a3b0 .word 0x01f4a3b0 + 1f49bb4: 01f4a618 .word 0x01f4a618 + 1f49bb8: 01f4a618 .word 0x01f4a618 + 1f49bbc: 01f4a3c4 .word 0x01f4a3c4 + 1f49bc0: 01f4a618 .word 0x01f4a618 + 1f49bc4: 01f4a618 .word 0x01f4a618 + 1f49bc8: 01f4a618 .word 0x01f4a618 + 1f49bcc: 01f4a618 .word 0x01f4a618 + 1f49bd0: 01f4a618 .word 0x01f4a618 + 1f49bd4: 01f4a618 .word 0x01f4a618 + 1f49bd8: 01f49d84 .word 0x01f49d84 + 1f49bdc: 01f4a2b0 .word 0x01f4a2b0 + 1f49be0: 01f4a618 .word 0x01f4a618 + 1f49be4: 01f49da0 .word 0x01f49da0 + 1f49be8: 01f4a2c0 .word 0x01f4a2c0 + 1f49bec: 01f4a618 .word 0x01f4a618 + 1f49bf0: 01f4a090 .word 0x01f4a090 + 1f49bf4: 01f4a178 .word 0x01f4a178 + 1f49bf8: 01f4a178 .word 0x01f4a178 + 1f49bfc: 01f4a178 .word 0x01f4a178 + 1f49c00: 01f4a178 .word 0x01f4a178 + 1f49c04: 01f4a178 .word 0x01f4a178 + 1f49c08: 01f4a178 .word 0x01f4a178 + 1f49c0c: 01f4a178 .word 0x01f4a178 + 1f49c10: 01f4a178 .word 0x01f4a178 + 1f49c14: 01f4a178 .word 0x01f4a178 + 1f49c18: 01f4a618 .word 0x01f4a618 + 1f49c1c: 01f4a618 .word 0x01f4a618 + 1f49c20: 01f4a618 .word 0x01f4a618 + 1f49c24: 01f4a618 .word 0x01f4a618 + 1f49c28: 01f4a618 .word 0x01f4a618 + 1f49c2c: 01f4a618 .word 0x01f4a618 + 1f49c30: 01f4a618 .word 0x01f4a618 + 1f49c34: 01f4a618 .word 0x01f4a618 + 1f49c38: 01f4a618 .word 0x01f4a618 + 1f49c3c: 01f4a618 .word 0x01f4a618 + 1f49c40: 01f4a09c .word 0x01f4a09c + 1f49c44: 01f4a618 .word 0x01f4a618 + 1f49c48: 01f4a618 .word 0x01f4a618 + 1f49c4c: 01f4a618 .word 0x01f4a618 + 1f49c50: 01f4a618 .word 0x01f4a618 + 1f49c54: 01f4a618 .word 0x01f4a618 + 1f49c58: 01f4a618 .word 0x01f4a618 + 1f49c5c: 01f4a618 .word 0x01f4a618 + 1f49c60: 01f4a618 .word 0x01f4a618 + 1f49c64: 01f4a618 .word 0x01f4a618 + 1f49c68: 01f4a618 .word 0x01f4a618 + 1f49c6c: 01f4a124 .word 0x01f4a124 + 1f49c70: 01f4a618 .word 0x01f4a618 + 1f49c74: 01f4a618 .word 0x01f4a618 + 1f49c78: 01f4a618 .word 0x01f4a618 + 1f49c7c: 01f4a618 .word 0x01f4a618 + 1f49c80: 01f4a618 .word 0x01f4a618 + 1f49c84: 01f4a19c .word 0x01f4a19c + 1f49c88: 01f4a618 .word 0x01f4a618 + 1f49c8c: 01f4a618 .word 0x01f4a618 + 1f49c90: 01f4a24c .word 0x01f4a24c + 1f49c94: 01f4a618 .word 0x01f4a618 + 1f49c98: 01f4a618 .word 0x01f4a618 + 1f49c9c: 01f4a618 .word 0x01f4a618 + 1f49ca0: 01f4a618 .word 0x01f4a618 + 1f49ca4: 01f4a618 .word 0x01f4a618 + 1f49ca8: 01f4a618 .word 0x01f4a618 + 1f49cac: 01f4a618 .word 0x01f4a618 + 1f49cb0: 01f4a618 .word 0x01f4a618 + 1f49cb4: 01f4a618 .word 0x01f4a618 + 1f49cb8: 01f4a618 .word 0x01f4a618 + 1f49cbc: 01f4a314 .word 0x01f4a314 + 1f49cc0: 01f4a35c .word 0x01f4a35c + 1f49cc4: 01f4a618 .word 0x01f4a618 + 1f49cc8: 01f4a618 .word 0x01f4a618 + 1f49ccc: 01f4a618 .word 0x01f4a618 + 1f49cd0: 01f4a408 .word 0x01f4a408 + 1f49cd4: 01f4a35c .word 0x01f4a35c + 1f49cd8: 01f4a618 .word 0x01f4a618 + 1f49cdc: 01f4a618 .word 0x01f4a618 + 1f49ce0: 01f4a414 .word 0x01f4a414 + 1f49ce4: 01f4a618 .word 0x01f4a618 + 1f49ce8: 01f4a430 .word 0x01f4a430 + 1f49cec: 01f4a460 .word 0x01f4a460 + 1f49cf0: 01f49dac .word 0x01f49dac + 1f49cf4: 01f4a5a8 .word 0x01f4a5a8 + 1f49cf8: 01f4a618 .word 0x01f4a618 + 1f49cfc: 01f4a5b4 .word 0x01f4a5b4 + 1f49d00: 01f4a618 .word 0x01f4a618 + 1f49d04: 01f4a520 .word 0x01f4a520 + 1f49d08: 01f4a618 .word 0x01f4a618 + 1f49d0c: 01f4a618 .word 0x01f4a618 + 1f49d10: 01f4a3d0 .word 0x01f4a3d0 + 1f49d14: e3520000 cmp r2, #0 + 1f49d18: 1a00037b bne 1f4ab0c <_vfiprintf_r+0x10c4> + 1f49d1c: e58d2048 str r2, [sp, #72] ; 0x48 + 1f49d20: e1a0900b mov r9, fp + 1f49d24: eaffff8c b 1f49b5c <_vfiprintf_r+0x114> + 1f49d28: e59d1004 ldr r1, [sp, #4] + 1f49d2c: e59d001c ldr r0, [sp, #28] + 1f49d30: ebffecff bl 1f45134 <__swsetup_r> + 1f49d34: e3500000 cmp r0, #0 + 1f49d38: 1a00041d bne 1f4adb4 <_vfiprintf_r+0x136c> + 1f49d3c: e59d3004 ldr r3, [sp, #4] + 1f49d40: e1d320bc ldrh r2, [r3, #12] + 1f49d44: e202201a and r2, r2, #26 + 1f49d48: e352000a cmp r2, #10 + 1f49d4c: 1affff60 bne 1f49ad4 <_vfiprintf_r+0x8c> + 1f49d50: e59d1004 ldr r1, [sp, #4] + 1f49d54: e1d130fe ldrsh r3, [r1, #14] + 1f49d58: e3530000 cmp r3, #0 + 1f49d5c: baffff5c blt 1f49ad4 <_vfiprintf_r+0x8c> + 1f49d60: e1a03004 mov r3, r4 + 1f49d64: e1a02006 mov r2, r6 + 1f49d68: e59d001c ldr r0, [sp, #28] + 1f49d6c: eb000494 bl 1f4afc4 <__sbprintf> + 1f49d70: e28dd0bc add sp, sp, #188 ; 0xbc + 1f49d74: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f49d78: e12fff1e bx lr + 1f49d7c: ebfff41a bl 1f46dec <__sinit> + 1f49d80: eaffff3c b 1f49a78 <_vfiprintf_r+0x30> + 1f49d84: e59d3020 ldr r3, [sp, #32] + 1f49d88: e593c000 ldr ip, [r3] + 1f49d8c: e2833004 add r3, r3, #4 + 1f49d90: e35c0000 cmp ip, #0 + 1f49d94: e58d3020 str r3, [sp, #32] + 1f49d98: aa000001 bge 1f49da4 <_vfiprintf_r+0x35c> + 1f49d9c: e26cc000 rsb ip, ip, #0 + 1f49da0: e3855004 orr r5, r5, #4 + 1f49da4: e5d63000 ldrb r3, [r6] + 1f49da8: eaffff7b b 1f49b9c <_vfiprintf_r+0x154> + 1f49dac: e3a01030 mov r1, #48 ; 0x30 + 1f49db0: e3a03000 mov r3, #0 + 1f49db4: e3a02078 mov r2, #120 ; 0x78 + 1f49db8: e59d0010 ldr r0, [sp, #16] + 1f49dbc: e5cd1040 strb r1, [sp, #64] ; 0x40 + 1f49dc0: e59d1020 ldr r1, [sp, #32] + 1f49dc4: e1500003 cmp r0, r3 + 1f49dc8: e2818004 add r8, r1, #4 + 1f49dcc: e5910000 ldr r0, [r1] + 1f49dd0: e58dc024 str ip, [sp, #36] ; 0x24 + 1f49dd4: e5cd2041 strb r2, [sp, #65] ; 0x41 + 1f49dd8: e5cd303f strb r3, [sp, #63] ; 0x3f + 1f49ddc: e3a01000 mov r1, #0 + 1f49de0: ba00042e blt 1f4aea0 <_vfiprintf_r+0x1458> + 1f49de4: 01a04003 moveq r4, r3 + 1f49de8: 13a04001 movne r4, #1 + 1f49dec: e1903001 orrs r3, r0, r1 + 1f49df0: 13844001 orrne r4, r4, #1 + 1f49df4: e3c53080 bic r3, r5, #128 ; 0x80 + 1f49df8: e3540000 cmp r4, #0 + 1f49dfc: e58d8020 str r8, [sp, #32] + 1f49e00: e3835002 orr r5, r3, #2 + 1f49e04: 0a0000c1 beq 1f4a110 <_vfiprintf_r+0x6c8> + 1f49e08: e59f2cc4 ldr r2, [pc, #3268] ; 1f4aad4 <_vfiprintf_r+0x108c> + 1f49e0c: e1a0c00b mov ip, fp + 1f49e10: e1a03220 lsr r3, r0, #4 + 1f49e14: e1833e01 orr r3, r3, r1, lsl #28 + 1f49e18: e1a04221 lsr r4, r1, #4 + 1f49e1c: e200e00f and lr, r0, #15 + 1f49e20: e1a01004 mov r1, r4 + 1f49e24: e1a00003 mov r0, r3 + 1f49e28: e7d2300e ldrb r3, [r2, lr] + 1f49e2c: e190e001 orrs lr, r0, r1 + 1f49e30: e56c3001 strb r3, [ip, #-1]! + 1f49e34: 1afffff5 bne 1f49e10 <_vfiprintf_r+0x3c8> + 1f49e38: e3a04000 mov r4, #0 + 1f49e3c: e06c300b rsb r3, ip, fp + 1f49e40: e58dc02c str ip, [sp, #44] ; 0x2c + 1f49e44: e58d3018 str r3, [sp, #24] + 1f49e48: e59d3010 ldr r3, [sp, #16] + 1f49e4c: e59d2018 ldr r2, [sp, #24] + 1f49e50: e1530002 cmp r3, r2 + 1f49e54: b1a03002 movlt r3, r2 + 1f49e58: e3540000 cmp r4, #0 + 1f49e5c: e58d3008 str r3, [sp, #8] + 1f49e60: 12833001 addne r3, r3, #1 + 1f49e64: 158d3008 strne r3, [sp, #8] + 1f49e68: e2153002 ands r3, r5, #2 + 1f49e6c: 159d2008 ldrne r2, [sp, #8] + 1f49e70: 12822002 addne r2, r2, #2 + 1f49e74: 158d2008 strne r2, [sp, #8] + 1f49e78: e2152084 ands r2, r5, #132 ; 0x84 + 1f49e7c: e58d2028 str r2, [sp, #40] ; 0x28 + 1f49e80: 1a0001fd bne 1f4a67c <_vfiprintf_r+0xc34> + 1f49e84: e59d2024 ldr r2, [sp, #36] ; 0x24 + 1f49e88: e59d1008 ldr r1, [sp, #8] + 1f49e8c: e0614002 rsb r4, r1, r2 + 1f49e90: e3540000 cmp r4, #0 + 1f49e94: da0001f8 ble 1f4a67c <_vfiprintf_r+0xc34> + 1f49e98: e3540010 cmp r4, #16 + 1f49e9c: da000415 ble 1f4aef8 <_vfiprintf_r+0x14b0> + 1f49ea0: e59f1c30 ldr r1, [pc, #3120] ; 1f4aad8 <_vfiprintf_r+0x1090> + 1f49ea4: e1a0e009 mov lr, r9 + 1f49ea8: e3a08010 mov r8, #16 + 1f49eac: e1a09006 mov r9, r6 + 1f49eb0: e59d204c ldr r2, [sp, #76] ; 0x4c + 1f49eb4: e59dc048 ldr ip, [sp, #72] ; 0x48 + 1f49eb8: e58d1030 str r1, [sp, #48] ; 0x30 + 1f49ebc: e1a06003 mov r6, r3 + 1f49ec0: ea000005 b 1f49edc <_vfiprintf_r+0x494> + 1f49ec4: e28c0002 add r0, ip, #2 + 1f49ec8: e1a0c001 mov ip, r1 + 1f49ecc: e28ee008 add lr, lr, #8 + 1f49ed0: e2444010 sub r4, r4, #16 + 1f49ed4: e3540010 cmp r4, #16 + 1f49ed8: da00000f ble 1f49f1c <_vfiprintf_r+0x4d4> + 1f49edc: e28c1001 add r1, ip, #1 + 1f49ee0: e2822010 add r2, r2, #16 + 1f49ee4: e3510007 cmp r1, #7 + 1f49ee8: e58d204c str r2, [sp, #76] ; 0x4c + 1f49eec: e58ea000 str sl, [lr] + 1f49ef0: e58e8004 str r8, [lr, #4] + 1f49ef4: e58d1048 str r1, [sp, #72] ; 0x48 + 1f49ef8: dafffff1 ble 1f49ec4 <_vfiprintf_r+0x47c> + 1f49efc: e3520000 cmp r2, #0 + 1f49f00: 1a0001d2 bne 1f4a650 <_vfiprintf_r+0xc08> + 1f49f04: e2444010 sub r4, r4, #16 + 1f49f08: e3540010 cmp r4, #16 + 1f49f0c: e1a0c002 mov ip, r2 + 1f49f10: e3a00001 mov r0, #1 + 1f49f14: e1a0e00b mov lr, fp + 1f49f18: caffffef bgt 1f49edc <_vfiprintf_r+0x494> + 1f49f1c: e1a03006 mov r3, r6 + 1f49f20: e1a06009 mov r6, r9 + 1f49f24: e1a0900e mov r9, lr + 1f49f28: e59d1030 ldr r1, [sp, #48] ; 0x30 + 1f49f2c: e3500007 cmp r0, #7 + 1f49f30: e0842002 add r2, r4, r2 + 1f49f34: e8890012 stm r9, {r1, r4} + 1f49f38: e58d204c str r2, [sp, #76] ; 0x4c + 1f49f3c: e58d0048 str r0, [sp, #72] ; 0x48 + 1f49f40: d2899008 addle r9, r9, #8 + 1f49f44: d280c001 addle ip, r0, #1 + 1f49f48: da0001ce ble 1f4a688 <_vfiprintf_r+0xc40> + 1f49f4c: e3520000 cmp r2, #0 + 1f49f50: 1a00038a bne 1f4ad80 <_vfiprintf_r+0x1338> + 1f49f54: e5dd103f ldrb r1, [sp, #63] ; 0x3f + 1f49f58: e3510000 cmp r1, #0 + 1f49f5c: 0a000364 beq 1f4acf4 <_vfiprintf_r+0x12ac> + 1f49f60: e3a02001 mov r2, #1 + 1f49f64: e1a0900b mov r9, fp + 1f49f68: e1a0c002 mov ip, r2 + 1f49f6c: e28d103f add r1, sp, #63 ; 0x3f + 1f49f70: e58d207c str r2, [sp, #124] ; 0x7c + 1f49f74: e58d1078 str r1, [sp, #120] ; 0x78 + 1f49f78: e1a0000c mov r0, ip + 1f49f7c: e2899008 add r9, r9, #8 + 1f49f80: e28cc001 add ip, ip, #1 + 1f49f84: e3530000 cmp r3, #0 + 1f49f88: 0a0001d0 beq 1f4a6d0 <_vfiprintf_r+0xc88> + 1f49f8c: e3a01002 mov r1, #2 + 1f49f90: e28d3040 add r3, sp, #64 ; 0x40 + 1f49f94: e0822001 add r2, r2, r1 + 1f49f98: e35c0007 cmp ip, #7 + 1f49f9c: e58d204c str r2, [sp, #76] ; 0x4c + 1f49fa0: e58dc048 str ip, [sp, #72] ; 0x48 + 1f49fa4: e5891004 str r1, [r9, #4] + 1f49fa8: e5893000 str r3, [r9] + 1f49fac: da00029a ble 1f4aa1c <_vfiprintf_r+0xfd4> + 1f49fb0: e3520000 cmp r2, #0 + 1f49fb4: 1a0002f0 bne 1f4ab7c <_vfiprintf_r+0x1134> + 1f49fb8: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f49fbc: e3530080 cmp r3, #128 ; 0x80 + 1f49fc0: e3a0c001 mov ip, #1 + 1f49fc4: e1a00002 mov r0, r2 + 1f49fc8: e1a0900b mov r9, fp + 1f49fcc: 1a0001c2 bne 1f4a6dc <_vfiprintf_r+0xc94> + 1f49fd0: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f49fd4: e59d1008 ldr r1, [sp, #8] + 1f49fd8: e0614003 rsb r4, r1, r3 + 1f49fdc: e3540000 cmp r4, #0 + 1f49fe0: da0001bd ble 1f4a6dc <_vfiprintf_r+0xc94> + 1f49fe4: e3540010 cmp r4, #16 + 1f49fe8: da0003d6 ble 1f4af48 <_vfiprintf_r+0x1500> + 1f49fec: e59f3ad8 ldr r3, [pc, #2776] ; 1f4aacc <_vfiprintf_r+0x1084> + 1f49ff0: e1a01009 mov r1, r9 + 1f49ff4: e3a08010 mov r8, #16 + 1f49ff8: e1a09004 mov r9, r4 + 1f49ffc: e58d3028 str r3, [sp, #40] ; 0x28 + 1f4a000: e59d401c ldr r4, [sp, #28] + 1f4a004: ea000005 b 1f4a020 <_vfiprintf_r+0x5d8> + 1f4a008: e280e002 add lr, r0, #2 + 1f4a00c: e1a00003 mov r0, r3 + 1f4a010: e2811008 add r1, r1, #8 + 1f4a014: e2499010 sub r9, r9, #16 + 1f4a018: e3590010 cmp r9, #16 + 1f4a01c: da00000e ble 1f4a05c <_vfiprintf_r+0x614> + 1f4a020: e2803001 add r3, r0, #1 + 1f4a024: e2822010 add r2, r2, #16 + 1f4a028: e3530007 cmp r3, #7 + 1f4a02c: e58d204c str r2, [sp, #76] ; 0x4c + 1f4a030: e8810180 stm r1, {r7, r8} + 1f4a034: e58d3048 str r3, [sp, #72] ; 0x48 + 1f4a038: dafffff2 ble 1f4a008 <_vfiprintf_r+0x5c0> + 1f4a03c: e3520000 cmp r2, #0 + 1f4a040: 1a000264 bne 1f4a9d8 <_vfiprintf_r+0xf90> + 1f4a044: e2499010 sub r9, r9, #16 + 1f4a048: e3590010 cmp r9, #16 + 1f4a04c: e3a0e001 mov lr, #1 + 1f4a050: e1a00002 mov r0, r2 + 1f4a054: e1a0100b mov r1, fp + 1f4a058: cafffff0 bgt 1f4a020 <_vfiprintf_r+0x5d8> + 1f4a05c: e1a04009 mov r4, r9 + 1f4a060: e1a09001 mov r9, r1 + 1f4a064: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f4a068: e0822004 add r2, r2, r4 + 1f4a06c: e35e0007 cmp lr, #7 + 1f4a070: e58d204c str r2, [sp, #76] ; 0x4c + 1f4a074: e8890018 stm r9, {r3, r4} + 1f4a078: e58de048 str lr, [sp, #72] ; 0x48 + 1f4a07c: ca0002c9 bgt 1f4aba8 <_vfiprintf_r+0x1160> + 1f4a080: e2899008 add r9, r9, #8 + 1f4a084: e28ec001 add ip, lr, #1 + 1f4a088: e1a0000e mov r0, lr + 1f4a08c: ea000192 b 1f4a6dc <_vfiprintf_r+0xc94> + 1f4a090: e3855080 orr r5, r5, #128 ; 0x80 + 1f4a094: e5d63000 ldrb r3, [r6] + 1f4a098: eafffebf b 1f49b9c <_vfiprintf_r+0x154> + 1f4a09c: e3510000 cmp r1, #0 + 1f4a0a0: e3855010 orr r5, r5, #16 + 1f4a0a4: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f4a0a8: e3150020 tst r5, #32 + 1f4a0ac: e58dc024 str ip, [sp, #36] ; 0x24 + 1f4a0b0: 0a0000ae beq 1f4a370 <_vfiprintf_r+0x928> + 1f4a0b4: e59d3020 ldr r3, [sp, #32] + 1f4a0b8: e2838007 add r8, r3, #7 + 1f4a0bc: e3c88007 bic r8, r8, #7 + 1f4a0c0: e898000c ldm r8, {r2, r3} + 1f4a0c4: e2881008 add r1, r8, #8 + 1f4a0c8: e58d2008 str r2, [sp, #8] + 1f4a0cc: e58d300c str r3, [sp, #12] + 1f4a0d0: e58d1020 str r1, [sp, #32] + 1f4a0d4: e3520000 cmp r2, #0 + 1f4a0d8: e2d33000 sbcs r3, r3, #0 + 1f4a0dc: ba0002f8 blt 1f4acc4 <_vfiprintf_r+0x127c> + 1f4a0e0: e59d2010 ldr r2, [sp, #16] + 1f4a0e4: e3520000 cmp r2, #0 + 1f4a0e8: ba0003ac blt 1f4afa0 <_vfiprintf_r+0x1558> + 1f4a0ec: e28d4008 add r4, sp, #8 + 1f4a0f0: e8940018 ldm r4, {r3, r4} + 1f4a0f4: e1a01003 mov r1, r3 + 1f4a0f8: e1813004 orr r3, r1, r4 + 1f4a0fc: e3530000 cmp r3, #0 + 1f4a100: 03520000 cmpeq r2, #0 + 1f4a104: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4a108: 1a0003a4 bne 1f4afa0 <_vfiprintf_r+0x1558> + 1f4a10c: e5dd403f ldrb r4, [sp, #63] ; 0x3f + 1f4a110: e3a03000 mov r3, #0 + 1f4a114: e58db02c str fp, [sp, #44] ; 0x2c + 1f4a118: e58d3010 str r3, [sp, #16] + 1f4a11c: e58d3018 str r3, [sp, #24] + 1f4a120: eaffff48 b 1f49e48 <_vfiprintf_r+0x400> + 1f4a124: e3510000 cmp r1, #0 + 1f4a128: e3855010 orr r5, r5, #16 + 1f4a12c: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f4a130: e2153020 ands r3, r5, #32 + 1f4a134: e58dc024 str ip, [sp, #36] ; 0x24 + 1f4a138: 1a0000cd bne 1f4a474 <_vfiprintf_r+0xa2c> + 1f4a13c: e2152010 ands r2, r5, #16 + 1f4a140: 1a000246 bne 1f4aa60 <_vfiprintf_r+0x1018> + 1f4a144: e2153040 ands r3, r5, #64 ; 0x40 + 1f4a148: 0a000327 beq 1f4adec <_vfiprintf_r+0x13a4> + 1f4a14c: e59d3020 ldr r3, [sp, #32] + 1f4a150: e59d0010 ldr r0, [sp, #16] + 1f4a154: e1d310b0 ldrh r1, [r3] + 1f4a158: e3500000 cmp r0, #0 + 1f4a15c: e5cd203f strb r2, [sp, #63] ; 0x3f + 1f4a160: e2838004 add r8, r3, #4 + 1f4a164: e1a02001 mov r2, r1 + 1f4a168: e3a03000 mov r3, #0 + 1f4a16c: aa000244 bge 1f4aa84 <_vfiprintf_r+0x103c> + 1f4a170: e58d8020 str r8, [sp, #32] + 1f4a174: ea0000cf b 1f4a4b8 <_vfiprintf_r+0xa70> + 1f4a178: e3a0c000 mov ip, #0 + 1f4a17c: e2432030 sub r2, r3, #48 ; 0x30 + 1f4a180: e4d63001 ldrb r3, [r6], #1 + 1f4a184: e08cc10c add ip, ip, ip, lsl #2 + 1f4a188: e082c08c add ip, r2, ip, lsl #1 + 1f4a18c: e2432030 sub r2, r3, #48 ; 0x30 + 1f4a190: e3520009 cmp r2, #9 + 1f4a194: 9afffff9 bls 1f4a180 <_vfiprintf_r+0x738> + 1f4a198: eafffe80 b 1f49ba0 <_vfiprintf_r+0x158> + 1f4a19c: e3510000 cmp r1, #0 + 1f4a1a0: e3855010 orr r5, r5, #16 + 1f4a1a4: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f4a1a8: e2153020 ands r3, r5, #32 + 1f4a1ac: e58dc024 str ip, [sp, #36] ; 0x24 + 1f4a1b0: 1a0000df bne 1f4a534 <_vfiprintf_r+0xaec> + 1f4a1b4: e2152010 ands r2, r5, #16 + 1f4a1b8: 1a00028b bne 1f4abec <_vfiprintf_r+0x11a4> + 1f4a1bc: e2154040 ands r4, r5, #64 ; 0x40 + 1f4a1c0: 0a00031a beq 1f4ae30 <_vfiprintf_r+0x13e8> + 1f4a1c4: e59d1020 ldr r1, [sp, #32] + 1f4a1c8: e59d0010 ldr r0, [sp, #16] + 1f4a1cc: e1d130b0 ldrh r3, [r1] + 1f4a1d0: e3500000 cmp r0, #0 + 1f4a1d4: e2818004 add r8, r1, #4 + 1f4a1d8: e1a00003 mov r0, r3 + 1f4a1dc: e3a01000 mov r1, #0 + 1f4a1e0: e5cd203f strb r2, [sp, #63] ; 0x3f + 1f4a1e4: e58d0008 str r0, [sp, #8] + 1f4a1e8: e58d100c str r1, [sp, #12] + 1f4a1ec: b58d8020 strlt r8, [sp, #32] + 1f4a1f0: b1a04002 movlt r4, r2 + 1f4a1f4: ba000008 blt 1f4a21c <_vfiprintf_r+0x7d4> + 1f4a1f8: e59d1010 ldr r1, [sp, #16] + 1f4a1fc: e3510000 cmp r1, #0 + 1f4a200: 03530000 cmpeq r3, #0 + 1f4a204: e58d8020 str r8, [sp, #32] + 1f4a208: 13a03001 movne r3, #1 + 1f4a20c: 03a03000 moveq r3, #0 + 1f4a210: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4a214: 0a0000dd beq 1f4a590 <_vfiprintf_r+0xb48> + 1f4a218: e1a04002 mov r4, r2 + 1f4a21c: e28d3008 add r3, sp, #8 + 1f4a220: e893000c ldm r3, {r2, r3} + 1f4a224: e3530000 cmp r3, #0 + 1f4a228: 03520009 cmpeq r2, #9 + 1f4a22c: 8a000288 bhi 1f4ac54 <_vfiprintf_r+0x120c> + 1f4a230: e2823030 add r3, r2, #48 ; 0x30 + 1f4a234: e5cd3077 strb r3, [sp, #119] ; 0x77 + 1f4a238: e59d3034 ldr r3, [sp, #52] ; 0x34 + 1f4a23c: e58d3018 str r3, [sp, #24] + 1f4a240: e28d3077 add r3, sp, #119 ; 0x77 + 1f4a244: e58d302c str r3, [sp, #44] ; 0x2c + 1f4a248: eafffefe b 1f49e48 <_vfiprintf_r+0x400> + 1f4a24c: e3510000 cmp r1, #0 + 1f4a250: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f4a254: e3150020 tst r5, #32 + 1f4a258: e58dc024 str ip, [sp, #36] ; 0x24 + 1f4a25c: e59f286c ldr r2, [pc, #2156] ; 1f4aad0 <_vfiprintf_r+0x1088> + 1f4a260: 0a000060 beq 1f4a3e8 <_vfiprintf_r+0x9a0> + 1f4a264: e59d1020 ldr r1, [sp, #32] + 1f4a268: e2818007 add r8, r1, #7 + 1f4a26c: e3c81007 bic r1, r8, #7 + 1f4a270: e2810008 add r0, r1, #8 + 1f4a274: e58d0020 str r0, [sp, #32] + 1f4a278: e8910003 ldm r1, {r0, r1} + 1f4a27c: e215c001 ands ip, r5, #1 + 1f4a280: 0a0001e9 beq 1f4aa2c <_vfiprintf_r+0xfe4> + 1f4a284: e190c001 orrs ip, r0, r1 + 1f4a288: 1a00024c bne 1f4abc0 <_vfiprintf_r+0x1178> + 1f4a28c: e3a03000 mov r3, #0 + 1f4a290: e59dc010 ldr ip, [sp, #16] + 1f4a294: e15c0003 cmp ip, r3 + 1f4a298: e5cd303f strb r3, [sp, #63] ; 0x3f + 1f4a29c: bafffeda blt 1f49e0c <_vfiprintf_r+0x3c4> + 1f4a2a0: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4a2a4: 01a0400c moveq r4, ip + 1f4a2a8: 0affff98 beq 1f4a110 <_vfiprintf_r+0x6c8> + 1f4a2ac: eafffed6 b 1f49e0c <_vfiprintf_r+0x3c4> + 1f4a2b0: e5d63000 ldrb r3, [r6] + 1f4a2b4: e3a01001 mov r1, #1 + 1f4a2b8: e3a0002b mov r0, #43 ; 0x2b + 1f4a2bc: eafffe36 b 1f49b9c <_vfiprintf_r+0x154> + 1f4a2c0: e5d63000 ldrb r3, [r6] + 1f4a2c4: e353002a cmp r3, #42 ; 0x2a + 1f4a2c8: e2864001 add r4, r6, #1 + 1f4a2cc: 0a000329 beq 1f4af78 <_vfiprintf_r+0x1530> + 1f4a2d0: e2432030 sub r2, r3, #48 ; 0x30 + 1f4a2d4: e3520009 cmp r2, #9 + 1f4a2d8: 83a02000 movhi r2, #0 + 1f4a2dc: 81a06004 movhi r6, r4 + 1f4a2e0: 858d2010 strhi r2, [sp, #16] + 1f4a2e4: 8afffe2d bhi 1f49ba0 <_vfiprintf_r+0x158> + 1f4a2e8: e3a0e000 mov lr, #0 + 1f4a2ec: e4d43001 ldrb r3, [r4], #1 + 1f4a2f0: e08ee10e add lr, lr, lr, lsl #2 + 1f4a2f4: e082e08e add lr, r2, lr, lsl #1 + 1f4a2f8: e2432030 sub r2, r3, #48 ; 0x30 + 1f4a2fc: e3520009 cmp r2, #9 + 1f4a300: 9afffff9 bls 1f4a2ec <_vfiprintf_r+0x8a4> + 1f4a304: e18e2fce orr r2, lr, lr, asr #31 + 1f4a308: e58d2010 str r2, [sp, #16] + 1f4a30c: e1a06004 mov r6, r4 + 1f4a310: eafffe22 b 1f49ba0 <_vfiprintf_r+0x158> + 1f4a314: e3a03001 mov r3, #1 + 1f4a318: e3a02000 mov r2, #0 + 1f4a31c: e1a01003 mov r1, r3 + 1f4a320: e5cd203f strb r2, [sp, #63] ; 0x3f + 1f4a324: e1a02001 mov r2, r1 + 1f4a328: e59d0020 ldr r0, [sp, #32] + 1f4a32c: e58d3008 str r3, [sp, #8] + 1f4a330: e5903000 ldr r3, [r0] + 1f4a334: e5cd3050 strb r3, [sp, #80] ; 0x50 + 1f4a338: e2803004 add r3, r0, #4 + 1f4a33c: e58d3020 str r3, [sp, #32] + 1f4a340: e28d3050 add r3, sp, #80 ; 0x50 + 1f4a344: e58dc024 str ip, [sp, #36] ; 0x24 + 1f4a348: e58d1018 str r1, [sp, #24] + 1f4a34c: e58d302c str r3, [sp, #44] ; 0x2c + 1f4a350: e3a03000 mov r3, #0 + 1f4a354: e58d3010 str r3, [sp, #16] + 1f4a358: eafffec2 b 1f49e68 <_vfiprintf_r+0x420> + 1f4a35c: e3510000 cmp r1, #0 + 1f4a360: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f4a364: e3150020 tst r5, #32 + 1f4a368: e58dc024 str ip, [sp, #36] ; 0x24 + 1f4a36c: 1affff50 bne 1f4a0b4 <_vfiprintf_r+0x66c> + 1f4a370: e59d0020 ldr r0, [sp, #32] + 1f4a374: e3150010 tst r5, #16 + 1f4a378: e1a03000 mov r3, r0 + 1f4a37c: 1a000001 bne 1f4a388 <_vfiprintf_r+0x940> + 1f4a380: e3150040 tst r5, #64 ; 0x40 + 1f4a384: 1a0002c3 bne 1f4ae98 <_vfiprintf_r+0x1450> + 1f4a388: e5933000 ldr r3, [r3] + 1f4a38c: e1a01003 mov r1, r3 + 1f4a390: e1a02fc3 asr r2, r3, #31 + 1f4a394: e1a03002 mov r3, r2 + 1f4a398: e1a02001 mov r2, r1 + 1f4a39c: e2801004 add r1, r0, #4 + 1f4a3a0: e58d2008 str r2, [sp, #8] + 1f4a3a4: e58d300c str r3, [sp, #12] + 1f4a3a8: e58d1020 str r1, [sp, #32] + 1f4a3ac: eaffff48 b 1f4a0d4 <_vfiprintf_r+0x68c> + 1f4a3b0: e3500000 cmp r0, #0 + 1f4a3b4: e5d63000 ldrb r3, [r6] + 1f4a3b8: 03a01001 moveq r1, #1 + 1f4a3bc: 03a00020 moveq r0, #32 + 1f4a3c0: eafffdf5 b 1f49b9c <_vfiprintf_r+0x154> + 1f4a3c4: e3855001 orr r5, r5, #1 + 1f4a3c8: e5d63000 ldrb r3, [r6] + 1f4a3cc: eafffdf2 b 1f49b9c <_vfiprintf_r+0x154> + 1f4a3d0: e3510000 cmp r1, #0 + 1f4a3d4: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f4a3d8: e3150020 tst r5, #32 + 1f4a3dc: e58dc024 str ip, [sp, #36] ; 0x24 + 1f4a3e0: e59f26ec ldr r2, [pc, #1772] ; 1f4aad4 <_vfiprintf_r+0x108c> + 1f4a3e4: 1affff9e bne 1f4a264 <_vfiprintf_r+0x81c> + 1f4a3e8: e3150010 tst r5, #16 + 1f4a3ec: 0a00025b beq 1f4ad60 <_vfiprintf_r+0x1318> + 1f4a3f0: e59d1020 ldr r1, [sp, #32] + 1f4a3f4: e5910000 ldr r0, [r1] + 1f4a3f8: e2811004 add r1, r1, #4 + 1f4a3fc: e58d1020 str r1, [sp, #32] + 1f4a400: e3a01000 mov r1, #0 + 1f4a404: eaffff9c b 1f4a27c <_vfiprintf_r+0x834> + 1f4a408: e3855040 orr r5, r5, #64 ; 0x40 + 1f4a40c: e5d63000 ldrb r3, [r6] + 1f4a410: eafffde1 b 1f49b9c <_vfiprintf_r+0x154> + 1f4a414: e5d63000 ldrb r3, [r6] + 1f4a418: e353006c cmp r3, #108 ; 0x6c + 1f4a41c: 05d63001 ldrbeq r3, [r6, #1] + 1f4a420: 03855020 orreq r5, r5, #32 + 1f4a424: 02866001 addeq r6, r6, #1 + 1f4a428: 13855010 orrne r5, r5, #16 + 1f4a42c: eafffdda b 1f49b9c <_vfiprintf_r+0x154> + 1f4a430: e3510000 cmp r1, #0 + 1f4a434: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f4a438: e3150020 tst r5, #32 + 1f4a43c: 0a000235 beq 1f4ad18 <_vfiprintf_r+0x12d0> + 1f4a440: e59d3020 ldr r3, [sp, #32] + 1f4a444: e59d2014 ldr r2, [sp, #20] + 1f4a448: e5931000 ldr r1, [r3] + 1f4a44c: e2833004 add r3, r3, #4 + 1f4a450: e58d3020 str r3, [sp, #32] + 1f4a454: e1a03fc2 asr r3, r2, #31 + 1f4a458: e881000c stm r1, {r2, r3} + 1f4a45c: eafffda8 b 1f49b04 <_vfiprintf_r+0xbc> + 1f4a460: e3510000 cmp r1, #0 + 1f4a464: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f4a468: e2153020 ands r3, r5, #32 + 1f4a46c: e58dc024 str ip, [sp, #36] ; 0x24 + 1f4a470: 0affff31 beq 1f4a13c <_vfiprintf_r+0x6f4> + 1f4a474: e3a01000 mov r1, #0 + 1f4a478: e59d3020 ldr r3, [sp, #32] + 1f4a47c: e59d2010 ldr r2, [sp, #16] + 1f4a480: e2838007 add r8, r3, #7 + 1f4a484: e3c83007 bic r3, r8, #7 + 1f4a488: e1520001 cmp r2, r1 + 1f4a48c: e2832008 add r2, r3, #8 + 1f4a490: e58d2020 str r2, [sp, #32] + 1f4a494: e5cd103f strb r1, [sp, #63] ; 0x3f + 1f4a498: e893000c ldm r3, {r2, r3} + 1f4a49c: ba000005 blt 1f4a4b8 <_vfiprintf_r+0xa70> + 1f4a4a0: e59d0010 ldr r0, [sp, #16] + 1f4a4a4: e1821003 orr r1, r2, r3 + 1f4a4a8: e3510000 cmp r1, #0 + 1f4a4ac: 03500000 cmpeq r0, #0 + 1f4a4b0: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4a4b4: 0a000178 beq 1f4aa9c <_vfiprintf_r+0x1054> + 1f4a4b8: e1a0000b mov r0, fp + 1f4a4bc: e1a0c1a2 lsr ip, r2, #3 + 1f4a4c0: e18cce83 orr ip, ip, r3, lsl #29 + 1f4a4c4: e1a0e1a3 lsr lr, r3, #3 + 1f4a4c8: e2021007 and r1, r2, #7 + 1f4a4cc: e1a0300e mov r3, lr + 1f4a4d0: e1a0200c mov r2, ip + 1f4a4d4: e2811030 add r1, r1, #48 ; 0x30 + 1f4a4d8: e192c003 orrs ip, r2, r3 + 1f4a4dc: e5601001 strb r1, [r0, #-1]! + 1f4a4e0: 1afffff5 bne 1f4a4bc <_vfiprintf_r+0xa74> + 1f4a4e4: e3510030 cmp r1, #48 ; 0x30 + 1f4a4e8: 03a04000 moveq r4, #0 + 1f4a4ec: 12054001 andne r4, r5, #1 + 1f4a4f0: e3540000 cmp r4, #0 + 1f4a4f4: 13a03030 movne r3, #48 ; 0x30 + 1f4a4f8: 12402001 subne r2, r0, #1 + 1f4a4fc: 0060300b rsbeq r3, r0, fp + 1f4a500: 15403001 strbne r3, [r0, #-1] + 1f4a504: 1062300b rsbne r3, r2, fp + 1f4a508: 058d3018 streq r3, [sp, #24] + 1f4a50c: 058d002c streq r0, [sp, #44] ; 0x2c + 1f4a510: 158d202c strne r2, [sp, #44] ; 0x2c + 1f4a514: 158d3018 strne r3, [sp, #24] + 1f4a518: 13a04000 movne r4, #0 + 1f4a51c: eafffe49 b 1f49e48 <_vfiprintf_r+0x400> + 1f4a520: e3510000 cmp r1, #0 + 1f4a524: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f4a528: e2153020 ands r3, r5, #32 + 1f4a52c: e58dc024 str ip, [sp, #36] ; 0x24 + 1f4a530: 0affff1f beq 1f4a1b4 <_vfiprintf_r+0x76c> + 1f4a534: e3a04000 mov r4, #0 + 1f4a538: e59d3020 ldr r3, [sp, #32] + 1f4a53c: e59d2010 ldr r2, [sp, #16] + 1f4a540: e2838007 add r8, r3, #7 + 1f4a544: e3c83007 bic r3, r8, #7 + 1f4a548: e1520004 cmp r2, r4 + 1f4a54c: e2832008 add r2, r3, #8 + 1f4a550: e58d2020 str r2, [sp, #32] + 1f4a554: e893000c ldm r3, {r2, r3} + 1f4a558: e5cd403f strb r4, [sp, #63] ; 0x3f + 1f4a55c: e58d2008 str r2, [sp, #8] + 1f4a560: e58d300c str r3, [sp, #12] + 1f4a564: baffff2c blt 1f4a21c <_vfiprintf_r+0x7d4> + 1f4a568: e28d3008 add r3, sp, #8 + 1f4a56c: e893000c ldm r3, {r2, r3} + 1f4a570: e1823003 orr r3, r2, r3 + 1f4a574: e59d2010 ldr r2, [sp, #16] + 1f4a578: e3530000 cmp r3, #0 + 1f4a57c: 03520000 cmpeq r2, #0 + 1f4a580: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4a584: 13a03001 movne r3, #1 + 1f4a588: 03a03000 moveq r3, #0 + 1f4a58c: 1affff22 bne 1f4a21c <_vfiprintf_r+0x7d4> + 1f4a590: e1a04003 mov r4, r3 + 1f4a594: e3a03000 mov r3, #0 + 1f4a598: e58db02c str fp, [sp, #44] ; 0x2c + 1f4a59c: e58d3010 str r3, [sp, #16] + 1f4a5a0: e58d3018 str r3, [sp, #24] + 1f4a5a4: eafffe27 b 1f49e48 <_vfiprintf_r+0x400> + 1f4a5a8: e3855020 orr r5, r5, #32 + 1f4a5ac: e5d63000 ldrb r3, [r6] + 1f4a5b0: eafffd79 b 1f49b9c <_vfiprintf_r+0x154> + 1f4a5b4: e3a04000 mov r4, #0 + 1f4a5b8: e59d3020 ldr r3, [sp, #32] + 1f4a5bc: e5932000 ldr r2, [r3] + 1f4a5c0: e1520004 cmp r2, r4 + 1f4a5c4: e2838004 add r8, r3, #4 + 1f4a5c8: e58dc024 str ip, [sp, #36] ; 0x24 + 1f4a5cc: e58d202c str r2, [sp, #44] ; 0x2c + 1f4a5d0: e5cd403f strb r4, [sp, #63] ; 0x3f + 1f4a5d4: e59d3010 ldr r3, [sp, #16] + 1f4a5d8: 0a00024c beq 1f4af10 <_vfiprintf_r+0x14c8> + 1f4a5dc: e3530000 cmp r3, #0 + 1f4a5e0: ba000232 blt 1f4aeb0 <_vfiprintf_r+0x1468> + 1f4a5e4: e1a02003 mov r2, r3 + 1f4a5e8: e1a01004 mov r1, r4 + 1f4a5ec: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f4a5f0: ebfff3ea bl 1f475a0 + 1f4a5f4: e3500000 cmp r0, #0 + 1f4a5f8: 0a000256 beq 1f4af58 <_vfiprintf_r+0x1510> + 1f4a5fc: e59d302c ldr r3, [sp, #44] ; 0x2c + 1f4a600: e0633000 rsb r3, r3, r0 + 1f4a604: e58d4010 str r4, [sp, #16] + 1f4a608: e58d3018 str r3, [sp, #24] + 1f4a60c: e58d8020 str r8, [sp, #32] + 1f4a610: e5dd403f ldrb r4, [sp, #63] ; 0x3f + 1f4a614: eafffe0b b 1f49e48 <_vfiprintf_r+0x400> + 1f4a618: e3510000 cmp r1, #0 + 1f4a61c: 15cd003f strbne r0, [sp, #63] ; 0x3f + 1f4a620: e3530000 cmp r3, #0 + 1f4a624: e58dc024 str ip, [sp, #36] ; 0x24 + 1f4a628: 0a000085 beq 1f4a844 <_vfiprintf_r+0xdfc> + 1f4a62c: e3a01001 mov r1, #1 + 1f4a630: e3a02000 mov r2, #0 + 1f4a634: e5cd3050 strb r3, [sp, #80] ; 0x50 + 1f4a638: e28d3050 add r3, sp, #80 ; 0x50 + 1f4a63c: e58d1008 str r1, [sp, #8] + 1f4a640: e5cd203f strb r2, [sp, #63] ; 0x3f + 1f4a644: e58d1018 str r1, [sp, #24] + 1f4a648: e58d302c str r3, [sp, #44] ; 0x2c + 1f4a64c: eaffff3f b 1f4a350 <_vfiprintf_r+0x908> + 1f4a650: e28d2044 add r2, sp, #68 ; 0x44 + 1f4a654: e59d1004 ldr r1, [sp, #4] + 1f4a658: e59d001c ldr r0, [sp, #28] + 1f4a65c: ebfffcc8 bl 1f49984 <__sprint_r.part.0> + 1f4a660: e3500000 cmp r0, #0 + 1f4a664: 1a00007c bne 1f4a85c <_vfiprintf_r+0xe14> + 1f4a668: e59dc048 ldr ip, [sp, #72] ; 0x48 + 1f4a66c: e1a0e00b mov lr, fp + 1f4a670: e59d204c ldr r2, [sp, #76] ; 0x4c + 1f4a674: e28c0001 add r0, ip, #1 + 1f4a678: eafffe14 b 1f49ed0 <_vfiprintf_r+0x488> + 1f4a67c: e28d0048 add r0, sp, #72 ; 0x48 + 1f4a680: e8900005 ldm r0, {r0, r2} + 1f4a684: e280c001 add ip, r0, #1 + 1f4a688: e5dd103f ldrb r1, [sp, #63] ; 0x3f + 1f4a68c: e3510000 cmp r1, #0 + 1f4a690: 0afffe3b beq 1f49f84 <_vfiprintf_r+0x53c> + 1f4a694: e3a01001 mov r1, #1 + 1f4a698: e28d003f add r0, sp, #63 ; 0x3f + 1f4a69c: e0822001 add r2, r2, r1 + 1f4a6a0: e35c0007 cmp ip, #7 + 1f4a6a4: e58d204c str r2, [sp, #76] ; 0x4c + 1f4a6a8: e58dc048 str ip, [sp, #72] ; 0x48 + 1f4a6ac: e8890003 stm r9, {r0, r1} + 1f4a6b0: dafffe30 ble 1f49f78 <_vfiprintf_r+0x530> + 1f4a6b4: e3520000 cmp r2, #0 + 1f4a6b8: 1a000122 bne 1f4ab48 <_vfiprintf_r+0x1100> + 1f4a6bc: e3530000 cmp r3, #0 + 1f4a6c0: 1a0000cf bne 1f4aa04 <_vfiprintf_r+0xfbc> + 1f4a6c4: e1a0c001 mov ip, r1 + 1f4a6c8: e1a00002 mov r0, r2 + 1f4a6cc: e1a0900b mov r9, fp + 1f4a6d0: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f4a6d4: e3530080 cmp r3, #128 ; 0x80 + 1f4a6d8: 0afffe3c beq 1f49fd0 <_vfiprintf_r+0x588> + 1f4a6dc: e59d3010 ldr r3, [sp, #16] + 1f4a6e0: e59d1018 ldr r1, [sp, #24] + 1f4a6e4: e0614003 rsb r4, r1, r3 + 1f4a6e8: e3540000 cmp r4, #0 + 1f4a6ec: da00006c ble 1f4a8a4 <_vfiprintf_r+0xe5c> + 1f4a6f0: e3540010 cmp r4, #16 + 1f4a6f4: d59f33d0 ldrle r3, [pc, #976] ; 1f4aacc <_vfiprintf_r+0x1084> + 1f4a6f8: d58d3028 strle r3, [sp, #40] ; 0x28 + 1f4a6fc: da00001d ble 1f4a778 <_vfiprintf_r+0xd30> + 1f4a700: e59f33c4 ldr r3, [pc, #964] ; 1f4aacc <_vfiprintf_r+0x1084> + 1f4a704: e1a01009 mov r1, r9 + 1f4a708: e3a08010 mov r8, #16 + 1f4a70c: e1a09004 mov r9, r4 + 1f4a710: e58d3028 str r3, [sp, #40] ; 0x28 + 1f4a714: e59d401c ldr r4, [sp, #28] + 1f4a718: ea000005 b 1f4a734 <_vfiprintf_r+0xcec> + 1f4a71c: e280c002 add ip, r0, #2 + 1f4a720: e1a00003 mov r0, r3 + 1f4a724: e2811008 add r1, r1, #8 + 1f4a728: e2499010 sub r9, r9, #16 + 1f4a72c: e3590010 cmp r9, #16 + 1f4a730: da00000e ble 1f4a770 <_vfiprintf_r+0xd28> + 1f4a734: e2803001 add r3, r0, #1 + 1f4a738: e2822010 add r2, r2, #16 + 1f4a73c: e3530007 cmp r3, #7 + 1f4a740: e58d204c str r2, [sp, #76] ; 0x4c + 1f4a744: e8810180 stm r1, {r7, r8} + 1f4a748: e58d3048 str r3, [sp, #72] ; 0x48 + 1f4a74c: dafffff2 ble 1f4a71c <_vfiprintf_r+0xcd4> + 1f4a750: e3520000 cmp r2, #0 + 1f4a754: 1a00002f bne 1f4a818 <_vfiprintf_r+0xdd0> + 1f4a758: e2499010 sub r9, r9, #16 + 1f4a75c: e3590010 cmp r9, #16 + 1f4a760: e3a0c001 mov ip, #1 + 1f4a764: e1a00002 mov r0, r2 + 1f4a768: e1a0100b mov r1, fp + 1f4a76c: cafffff0 bgt 1f4a734 <_vfiprintf_r+0xcec> + 1f4a770: e1a04009 mov r4, r9 + 1f4a774: e1a09001 mov r9, r1 + 1f4a778: e59d3028 ldr r3, [sp, #40] ; 0x28 + 1f4a77c: e35c0007 cmp ip, #7 + 1f4a780: e0822004 add r2, r2, r4 + 1f4a784: e8890018 stm r9, {r3, r4} + 1f4a788: e58dc048 str ip, [sp, #72] ; 0x48 + 1f4a78c: e58d204c str r2, [sp, #76] ; 0x4c + 1f4a790: d2899008 addle r9, r9, #8 + 1f4a794: d28cc001 addle ip, ip, #1 + 1f4a798: da000041 ble 1f4a8a4 <_vfiprintf_r+0xe5c> + 1f4a79c: e3520000 cmp r2, #0 + 1f4a7a0: 1a000035 bne 1f4a87c <_vfiprintf_r+0xe34> + 1f4a7a4: e3a03001 mov r3, #1 + 1f4a7a8: e1a0900b mov r9, fp + 1f4a7ac: e59d2018 ldr r2, [sp, #24] + 1f4a7b0: e59d102c ldr r1, [sp, #44] ; 0x2c + 1f4a7b4: e58d207c str r2, [sp, #124] ; 0x7c + 1f4a7b8: e58d204c str r2, [sp, #76] ; 0x4c + 1f4a7bc: e58d1078 str r1, [sp, #120] ; 0x78 + 1f4a7c0: e58d3048 str r3, [sp, #72] ; 0x48 + 1f4a7c4: e2899008 add r9, r9, #8 + 1f4a7c8: e3150004 tst r5, #4 + 1f4a7cc: 0a000004 beq 1f4a7e4 <_vfiprintf_r+0xd9c> + 1f4a7d0: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f4a7d4: e59d1008 ldr r1, [sp, #8] + 1f4a7d8: e0614003 rsb r4, r1, r3 + 1f4a7dc: e3540000 cmp r4, #0 + 1f4a7e0: ca000042 bgt 1f4a8f0 <_vfiprintf_r+0xea8> + 1f4a7e4: e59d3014 ldr r3, [sp, #20] + 1f4a7e8: e59d1024 ldr r1, [sp, #36] ; 0x24 + 1f4a7ec: e59d0008 ldr r0, [sp, #8] + 1f4a7f0: e1510000 cmp r1, r0 + 1f4a7f4: a0833001 addge r3, r3, r1 + 1f4a7f8: b0833000 addlt r3, r3, r0 + 1f4a7fc: e3520000 cmp r2, #0 + 1f4a800: e58d3014 str r3, [sp, #20] + 1f4a804: 1a0000c8 bne 1f4ab2c <_vfiprintf_r+0x10e4> + 1f4a808: e3a03000 mov r3, #0 + 1f4a80c: e1a0900b mov r9, fp + 1f4a810: e58d3048 str r3, [sp, #72] ; 0x48 + 1f4a814: eafffcba b 1f49b04 <_vfiprintf_r+0xbc> + 1f4a818: e28d2044 add r2, sp, #68 ; 0x44 + 1f4a81c: e59d1004 ldr r1, [sp, #4] + 1f4a820: e1a00004 mov r0, r4 + 1f4a824: ebfffc56 bl 1f49984 <__sprint_r.part.0> + 1f4a828: e3500000 cmp r0, #0 + 1f4a82c: 1a00000a bne 1f4a85c <_vfiprintf_r+0xe14> + 1f4a830: e28d0048 add r0, sp, #72 ; 0x48 + 1f4a834: e8900005 ldm r0, {r0, r2} + 1f4a838: e1a0100b mov r1, fp + 1f4a83c: e280c001 add ip, r0, #1 + 1f4a840: eaffffb8 b 1f4a728 <_vfiprintf_r+0xce0> + 1f4a844: e59d304c ldr r3, [sp, #76] ; 0x4c + 1f4a848: e3530000 cmp r3, #0 + 1f4a84c: 159d001c ldrne r0, [sp, #28] + 1f4a850: 128d2044 addne r2, sp, #68 ; 0x44 + 1f4a854: 159d1004 ldrne r1, [sp, #4] + 1f4a858: 1bfffc49 blne 1f49984 <__sprint_r.part.0> + 1f4a85c: e59d3004 ldr r3, [sp, #4] + 1f4a860: e1d330bc ldrh r3, [r3, #12] + 1f4a864: e3130040 tst r3, #64 ; 0x40 + 1f4a868: 1a000151 bne 1f4adb4 <_vfiprintf_r+0x136c> + 1f4a86c: e59d0014 ldr r0, [sp, #20] + 1f4a870: e28dd0bc add sp, sp, #188 ; 0xbc + 1f4a874: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f4a878: e12fff1e bx lr + 1f4a87c: e28d2044 add r2, sp, #68 ; 0x44 + 1f4a880: e59d1004 ldr r1, [sp, #4] + 1f4a884: e59d001c ldr r0, [sp, #28] + 1f4a888: ebfffc3d bl 1f49984 <__sprint_r.part.0> + 1f4a88c: e3500000 cmp r0, #0 + 1f4a890: 1afffff1 bne 1f4a85c <_vfiprintf_r+0xe14> + 1f4a894: e1a0900b mov r9, fp + 1f4a898: e59dc048 ldr ip, [sp, #72] ; 0x48 + 1f4a89c: e59d204c ldr r2, [sp, #76] ; 0x4c + 1f4a8a0: e28cc001 add ip, ip, #1 + 1f4a8a4: e59d3018 ldr r3, [sp, #24] + 1f4a8a8: e59d102c ldr r1, [sp, #44] ; 0x2c + 1f4a8ac: e0832002 add r2, r3, r2 + 1f4a8b0: e35c0007 cmp ip, #7 + 1f4a8b4: e58d204c str r2, [sp, #76] ; 0x4c + 1f4a8b8: e889000a stm r9, {r1, r3} + 1f4a8bc: e58dc048 str ip, [sp, #72] ; 0x48 + 1f4a8c0: daffffbf ble 1f4a7c4 <_vfiprintf_r+0xd7c> + 1f4a8c4: e3520000 cmp r2, #0 + 1f4a8c8: 1a000086 bne 1f4aae8 <_vfiprintf_r+0x10a0> + 1f4a8cc: e3150004 tst r5, #4 + 1f4a8d0: e58d2048 str r2, [sp, #72] ; 0x48 + 1f4a8d4: 0a00002c beq 1f4a98c <_vfiprintf_r+0xf44> + 1f4a8d8: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f4a8dc: e59d1008 ldr r1, [sp, #8] + 1f4a8e0: e0614003 rsb r4, r1, r3 + 1f4a8e4: e3540000 cmp r4, #0 + 1f4a8e8: c1a0900b movgt r9, fp + 1f4a8ec: da000026 ble 1f4a98c <_vfiprintf_r+0xf44> + 1f4a8f0: e3540010 cmp r4, #16 + 1f4a8f4: da00018e ble 1f4af34 <_vfiprintf_r+0x14ec> + 1f4a8f8: e59f31d8 ldr r3, [pc, #472] ; 1f4aad8 <_vfiprintf_r+0x1090> + 1f4a8fc: e3a05010 mov r5, #16 + 1f4a900: e59d1048 ldr r1, [sp, #72] ; 0x48 + 1f4a904: e58d3030 str r3, [sp, #48] ; 0x30 + 1f4a908: e59d801c ldr r8, [sp, #28] + 1f4a90c: ea000005 b 1f4a928 <_vfiprintf_r+0xee0> + 1f4a910: e2810002 add r0, r1, #2 + 1f4a914: e1a01003 mov r1, r3 + 1f4a918: e2899008 add r9, r9, #8 + 1f4a91c: e2444010 sub r4, r4, #16 + 1f4a920: e3540010 cmp r4, #16 + 1f4a924: da00000f ble 1f4a968 <_vfiprintf_r+0xf20> + 1f4a928: e2813001 add r3, r1, #1 + 1f4a92c: e2822010 add r2, r2, #16 + 1f4a930: e3530007 cmp r3, #7 + 1f4a934: e58d204c str r2, [sp, #76] ; 0x4c + 1f4a938: e589a000 str sl, [r9] + 1f4a93c: e5895004 str r5, [r9, #4] + 1f4a940: e58d3048 str r3, [sp, #72] ; 0x48 + 1f4a944: dafffff1 ble 1f4a910 <_vfiprintf_r+0xec8> + 1f4a948: e3520000 cmp r2, #0 + 1f4a94c: 1a000016 bne 1f4a9ac <_vfiprintf_r+0xf64> + 1f4a950: e2444010 sub r4, r4, #16 + 1f4a954: e3540010 cmp r4, #16 + 1f4a958: e3a00001 mov r0, #1 + 1f4a95c: e1a01002 mov r1, r2 + 1f4a960: e1a0900b mov r9, fp + 1f4a964: caffffef bgt 1f4a928 <_vfiprintf_r+0xee0> + 1f4a968: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f4a96c: e0822004 add r2, r2, r4 + 1f4a970: e3500007 cmp r0, #7 + 1f4a974: e58d204c str r2, [sp, #76] ; 0x4c + 1f4a978: e8890018 stm r9, {r3, r4} + 1f4a97c: e58d0048 str r0, [sp, #72] ; 0x48 + 1f4a980: daffff97 ble 1f4a7e4 <_vfiprintf_r+0xd9c> + 1f4a984: e3520000 cmp r2, #0 + 1f4a988: 1a00010b bne 1f4adbc <_vfiprintf_r+0x1374> + 1f4a98c: e59d3014 ldr r3, [sp, #20] + 1f4a990: e59d2024 ldr r2, [sp, #36] ; 0x24 + 1f4a994: e59d1008 ldr r1, [sp, #8] + 1f4a998: e1520001 cmp r2, r1 + 1f4a99c: a0833002 addge r3, r3, r2 + 1f4a9a0: b0833001 addlt r3, r3, r1 + 1f4a9a4: e58d3014 str r3, [sp, #20] + 1f4a9a8: eaffff96 b 1f4a808 <_vfiprintf_r+0xdc0> + 1f4a9ac: e28d2044 add r2, sp, #68 ; 0x44 + 1f4a9b0: e59d1004 ldr r1, [sp, #4] + 1f4a9b4: e1a00008 mov r0, r8 + 1f4a9b8: ebfffbf1 bl 1f49984 <__sprint_r.part.0> + 1f4a9bc: e3500000 cmp r0, #0 + 1f4a9c0: 1affffa5 bne 1f4a85c <_vfiprintf_r+0xe14> + 1f4a9c4: e28d1048 add r1, sp, #72 ; 0x48 + 1f4a9c8: e8910006 ldm r1, {r1, r2} + 1f4a9cc: e1a0900b mov r9, fp + 1f4a9d0: e2810001 add r0, r1, #1 + 1f4a9d4: eaffffd0 b 1f4a91c <_vfiprintf_r+0xed4> + 1f4a9d8: e28d2044 add r2, sp, #68 ; 0x44 + 1f4a9dc: e59d1004 ldr r1, [sp, #4] + 1f4a9e0: e1a00004 mov r0, r4 + 1f4a9e4: ebfffbe6 bl 1f49984 <__sprint_r.part.0> + 1f4a9e8: e3500000 cmp r0, #0 + 1f4a9ec: 1affff9a bne 1f4a85c <_vfiprintf_r+0xe14> + 1f4a9f0: e28d0048 add r0, sp, #72 ; 0x48 + 1f4a9f4: e8900005 ldm r0, {r0, r2} + 1f4a9f8: e1a0100b mov r1, fp + 1f4a9fc: e280e001 add lr, r0, #1 + 1f4aa00: eafffd83 b 1f4a014 <_vfiprintf_r+0x5cc> + 1f4aa04: e3a02002 mov r2, #2 + 1f4aa08: e1a0c001 mov ip, r1 + 1f4aa0c: e1a0900b mov r9, fp + 1f4aa10: e28d3040 add r3, sp, #64 ; 0x40 + 1f4aa14: e58d207c str r2, [sp, #124] ; 0x7c + 1f4aa18: e58d3078 str r3, [sp, #120] ; 0x78 + 1f4aa1c: e1a0000c mov r0, ip + 1f4aa20: e2899008 add r9, r9, #8 + 1f4aa24: e28cc001 add ip, ip, #1 + 1f4aa28: eaffff28 b 1f4a6d0 <_vfiprintf_r+0xc88> + 1f4aa2c: e59de010 ldr lr, [sp, #16] + 1f4aa30: e35e0000 cmp lr, #0 + 1f4aa34: e5cdc03f strb ip, [sp, #63] ; 0x3f + 1f4aa38: bafffcf3 blt 1f49e0c <_vfiprintf_r+0x3c4> + 1f4aa3c: e1803001 orr r3, r0, r1 + 1f4aa40: e3530000 cmp r3, #0 + 1f4aa44: 035e0000 cmpeq lr, #0 + 1f4aa48: e1a0c00e mov ip, lr + 1f4aa4c: 13a04001 movne r4, #1 + 1f4aa50: 03a04000 moveq r4, #0 + 1f4aa54: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4aa58: 1afffceb bne 1f49e0c <_vfiprintf_r+0x3c4> + 1f4aa5c: eafffdab b 1f4a110 <_vfiprintf_r+0x6c8> + 1f4aa60: e5cd303f strb r3, [sp, #63] ; 0x3f + 1f4aa64: e3a03000 mov r3, #0 + 1f4aa68: e59d1020 ldr r1, [sp, #32] + 1f4aa6c: e59d0010 ldr r0, [sp, #16] + 1f4aa70: e5912000 ldr r2, [r1] + 1f4aa74: e3500000 cmp r0, #0 + 1f4aa78: e2818004 add r8, r1, #4 + 1f4aa7c: a1821003 orrge r1, r2, r3 + 1f4aa80: bafffdba blt 1f4a170 <_vfiprintf_r+0x728> + 1f4aa84: e59d0010 ldr r0, [sp, #16] + 1f4aa88: e3500000 cmp r0, #0 + 1f4aa8c: 03510000 cmpeq r1, #0 + 1f4aa90: e58d8020 str r8, [sp, #32] + 1f4aa94: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4aa98: 1afffe86 bne 1f4a4b8 <_vfiprintf_r+0xa70> + 1f4aa9c: e2154001 ands r4, r5, #1 + 1f4aaa0: 058db02c streq fp, [sp, #44] ; 0x2c + 1f4aaa4: 058d4018 streq r4, [sp, #24] + 1f4aaa8: 0afffce6 beq 1f49e48 <_vfiprintf_r+0x400> + 1f4aaac: e3a03030 mov r3, #48 ; 0x30 + 1f4aab0: e59d2034 ldr r2, [sp, #52] ; 0x34 + 1f4aab4: e5cd3077 strb r3, [sp, #119] ; 0x77 + 1f4aab8: e28d3077 add r3, sp, #119 ; 0x77 + 1f4aabc: e58d2018 str r2, [sp, #24] + 1f4aac0: e3a04000 mov r4, #0 + 1f4aac4: e58d302c str r3, [sp, #44] ; 0x2c + 1f4aac8: eafffcde b 1f49e48 <_vfiprintf_r+0x400> + 1f4aacc: 01f631d0 .word 0x01f631d0 + 1f4aad0: 01f62ef8 .word 0x01f62ef8 + 1f4aad4: 01f62f0c .word 0x01f62f0c + 1f4aad8: 01f631c0 .word 0x01f631c0 + 1f4aadc: 01f62f20 .word 0x01f62f20 + 1f4aae0: 01f631c0 .word 0x01f631c0 + 1f4aae4: 01f631d0 .word 0x01f631d0 + 1f4aae8: e28d2044 add r2, sp, #68 ; 0x44 + 1f4aaec: e59d1004 ldr r1, [sp, #4] + 1f4aaf0: e59d001c ldr r0, [sp, #28] + 1f4aaf4: ebfffba2 bl 1f49984 <__sprint_r.part.0> + 1f4aaf8: e3500000 cmp r0, #0 + 1f4aafc: 1affff56 bne 1f4a85c <_vfiprintf_r+0xe14> + 1f4ab00: e1a0900b mov r9, fp + 1f4ab04: e59d204c ldr r2, [sp, #76] ; 0x4c + 1f4ab08: eaffff2e b 1f4a7c8 <_vfiprintf_r+0xd80> + 1f4ab0c: e28d2044 add r2, sp, #68 ; 0x44 + 1f4ab10: e59d1004 ldr r1, [sp, #4] + 1f4ab14: e59d001c ldr r0, [sp, #28] + 1f4ab18: ebfffb99 bl 1f49984 <__sprint_r.part.0> + 1f4ab1c: e3500000 cmp r0, #0 + 1f4ab20: 1affff4d bne 1f4a85c <_vfiprintf_r+0xe14> + 1f4ab24: e1a0900b mov r9, fp + 1f4ab28: eafffc0b b 1f49b5c <_vfiprintf_r+0x114> + 1f4ab2c: e28d2044 add r2, sp, #68 ; 0x44 + 1f4ab30: e59d1004 ldr r1, [sp, #4] + 1f4ab34: e59d001c ldr r0, [sp, #28] + 1f4ab38: ebfffb91 bl 1f49984 <__sprint_r.part.0> + 1f4ab3c: e3500000 cmp r0, #0 + 1f4ab40: 0affff30 beq 1f4a808 <_vfiprintf_r+0xdc0> + 1f4ab44: eaffff44 b 1f4a85c <_vfiprintf_r+0xe14> + 1f4ab48: e28d2044 add r2, sp, #68 ; 0x44 + 1f4ab4c: e59d1004 ldr r1, [sp, #4] + 1f4ab50: e59d001c ldr r0, [sp, #28] + 1f4ab54: e58d3030 str r3, [sp, #48] ; 0x30 + 1f4ab58: ebfffb89 bl 1f49984 <__sprint_r.part.0> + 1f4ab5c: e3500000 cmp r0, #0 + 1f4ab60: 1affff3d bne 1f4a85c <_vfiprintf_r+0xe14> + 1f4ab64: e28d0048 add r0, sp, #72 ; 0x48 + 1f4ab68: e8900005 ldm r0, {r0, r2} + 1f4ab6c: e1a0900b mov r9, fp + 1f4ab70: e280c001 add ip, r0, #1 + 1f4ab74: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f4ab78: eafffd01 b 1f49f84 <_vfiprintf_r+0x53c> + 1f4ab7c: e28d2044 add r2, sp, #68 ; 0x44 + 1f4ab80: e59d1004 ldr r1, [sp, #4] + 1f4ab84: e59d001c ldr r0, [sp, #28] + 1f4ab88: ebfffb7d bl 1f49984 <__sprint_r.part.0> + 1f4ab8c: e3500000 cmp r0, #0 + 1f4ab90: 1affff31 bne 1f4a85c <_vfiprintf_r+0xe14> + 1f4ab94: e28d0048 add r0, sp, #72 ; 0x48 + 1f4ab98: e8900005 ldm r0, {r0, r2} + 1f4ab9c: e1a0900b mov r9, fp + 1f4aba0: e280c001 add ip, r0, #1 + 1f4aba4: eafffec9 b 1f4a6d0 <_vfiprintf_r+0xc88> + 1f4aba8: e3520000 cmp r2, #0 + 1f4abac: 1a0000c6 bne 1f4aecc <_vfiprintf_r+0x1484> + 1f4abb0: e3a0c001 mov ip, #1 + 1f4abb4: e1a00002 mov r0, r2 + 1f4abb8: e1a0900b mov r9, fp + 1f4abbc: eafffec6 b 1f4a6dc <_vfiprintf_r+0xc94> + 1f4abc0: e3a0c000 mov ip, #0 + 1f4abc4: e3a0e030 mov lr, #48 ; 0x30 + 1f4abc8: e59d4010 ldr r4, [sp, #16] + 1f4abcc: e154000c cmp r4, ip + 1f4abd0: e5cd3041 strb r3, [sp, #65] ; 0x41 + 1f4abd4: a3c53080 bicge r3, r5, #128 ; 0x80 + 1f4abd8: e5cde040 strb lr, [sp, #64] ; 0x40 + 1f4abdc: e5cdc03f strb ip, [sp, #63] ; 0x3f + 1f4abe0: b3855002 orrlt r5, r5, #2 + 1f4abe4: a3835002 orrge r5, r3, #2 + 1f4abe8: eafffc87 b 1f49e0c <_vfiprintf_r+0x3c4> + 1f4abec: e59d1020 ldr r1, [sp, #32] + 1f4abf0: e59d0010 ldr r0, [sp, #16] + 1f4abf4: e5912000 ldr r2, [r1] + 1f4abf8: e3500000 cmp r0, #0 + 1f4abfc: e2818004 add r8, r1, #4 + 1f4ac00: e1a00002 mov r0, r2 + 1f4ac04: e3a01000 mov r1, #0 + 1f4ac08: e5cd303f strb r3, [sp, #63] ; 0x3f + 1f4ac0c: e58d0008 str r0, [sp, #8] + 1f4ac10: e58d100c str r1, [sp, #12] + 1f4ac14: b58d8020 strlt r8, [sp, #32] + 1f4ac18: b1a04003 movlt r4, r3 + 1f4ac1c: bafffd7e blt 1f4a21c <_vfiprintf_r+0x7d4> + 1f4ac20: e28d2008 add r2, sp, #8 + 1f4ac24: e8920006 ldm r2, {r1, r2} + 1f4ac28: e1812002 orr r2, r1, r2 + 1f4ac2c: e59d1010 ldr r1, [sp, #16] + 1f4ac30: e3520000 cmp r2, #0 + 1f4ac34: 03510000 cmpeq r1, #0 + 1f4ac38: e58d8020 str r8, [sp, #32] + 1f4ac3c: 13a04001 movne r4, #1 + 1f4ac40: 03a04000 moveq r4, #0 + 1f4ac44: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4ac48: 0afffd30 beq 1f4a110 <_vfiprintf_r+0x6c8> + 1f4ac4c: e1a04003 mov r4, r3 + 1f4ac50: eafffd71 b 1f4a21c <_vfiprintf_r+0x7d4> + 1f4ac54: e58d5018 str r5, [sp, #24] + 1f4ac58: e1a0500b mov r5, fp + 1f4ac5c: e58d9028 str r9, [sp, #40] ; 0x28 + 1f4ac60: e28d9008 add r9, sp, #8 + 1f4ac64: e8990300 ldm r9, {r8, r9} + 1f4ac68: e1a00008 mov r0, r8 + 1f4ac6c: e1a01009 mov r1, r9 + 1f4ac70: e3a0200a mov r2, #10 + 1f4ac74: e3a03000 mov r3, #0 + 1f4ac78: eb0004b7 bl 1f4bf5c <__aeabi_uldivmod> + 1f4ac7c: e2822030 add r2, r2, #48 ; 0x30 + 1f4ac80: e5652001 strb r2, [r5, #-1]! + 1f4ac84: e1a00008 mov r0, r8 + 1f4ac88: e1a01009 mov r1, r9 + 1f4ac8c: e3a03000 mov r3, #0 + 1f4ac90: e3a0200a mov r2, #10 + 1f4ac94: eb0004b0 bl 1f4bf5c <__aeabi_uldivmod> + 1f4ac98: e1a08000 mov r8, r0 + 1f4ac9c: e1a09001 mov r9, r1 + 1f4aca0: e1983009 orrs r3, r8, r9 + 1f4aca4: 1affffef bne 1f4ac68 <_vfiprintf_r+0x1220> + 1f4aca8: e1a03005 mov r3, r5 + 1f4acac: e063300b rsb r3, r3, fp + 1f4acb0: e58d502c str r5, [sp, #44] ; 0x2c + 1f4acb4: e59d9028 ldr r9, [sp, #40] ; 0x28 + 1f4acb8: e59d5018 ldr r5, [sp, #24] + 1f4acbc: e58d3018 str r3, [sp, #24] + 1f4acc0: eafffc60 b 1f49e48 <_vfiprintf_r+0x400> + 1f4acc4: e3a0402d mov r4, #45 ; 0x2d + 1f4acc8: e28d3008 add r3, sp, #8 + 1f4accc: e893000c ldm r3, {r2, r3} + 1f4acd0: e2722000 rsbs r2, r2, #0 + 1f4acd4: e2e33000 rsc r3, r3, #0 + 1f4acd8: e58d2008 str r2, [sp, #8] + 1f4acdc: e58d300c str r3, [sp, #12] + 1f4ace0: e59d3010 ldr r3, [sp, #16] + 1f4ace4: e3530000 cmp r3, #0 + 1f4ace8: e5cd403f strb r4, [sp, #63] ; 0x3f + 1f4acec: a3c55080 bicge r5, r5, #128 ; 0x80 + 1f4acf0: eafffd49 b 1f4a21c <_vfiprintf_r+0x7d4> + 1f4acf4: e3530000 cmp r3, #0 + 1f4acf8: 0a000037 beq 1f4addc <_vfiprintf_r+0x1394> + 1f4acfc: e3a02002 mov r2, #2 + 1f4ad00: e28d3040 add r3, sp, #64 ; 0x40 + 1f4ad04: e58d207c str r2, [sp, #124] ; 0x7c + 1f4ad08: e58d3078 str r3, [sp, #120] ; 0x78 + 1f4ad0c: e3a0c001 mov ip, #1 + 1f4ad10: e1a0900b mov r9, fp + 1f4ad14: eaffff40 b 1f4aa1c <_vfiprintf_r+0xfd4> + 1f4ad18: e3150010 tst r5, #16 + 1f4ad1c: 1a000008 bne 1f4ad44 <_vfiprintf_r+0x12fc> + 1f4ad20: e3150040 tst r5, #64 ; 0x40 + 1f4ad24: 0a000006 beq 1f4ad44 <_vfiprintf_r+0x12fc> + 1f4ad28: e59d2020 ldr r2, [sp, #32] + 1f4ad2c: e5923000 ldr r3, [r2] + 1f4ad30: e2822004 add r2, r2, #4 + 1f4ad34: e58d2020 str r2, [sp, #32] + 1f4ad38: e1dd21b4 ldrh r2, [sp, #20] + 1f4ad3c: e1c320b0 strh r2, [r3] + 1f4ad40: eafffb6f b 1f49b04 <_vfiprintf_r+0xbc> + 1f4ad44: e59d2020 ldr r2, [sp, #32] + 1f4ad48: e5923000 ldr r3, [r2] + 1f4ad4c: e2822004 add r2, r2, #4 + 1f4ad50: e58d2020 str r2, [sp, #32] + 1f4ad54: e59d2014 ldr r2, [sp, #20] + 1f4ad58: e5832000 str r2, [r3] + 1f4ad5c: eafffb68 b 1f49b04 <_vfiprintf_r+0xbc> + 1f4ad60: e3150040 tst r5, #64 ; 0x40 + 1f4ad64: 0a000045 beq 1f4ae80 <_vfiprintf_r+0x1438> + 1f4ad68: e59d1020 ldr r1, [sp, #32] + 1f4ad6c: e1d100b0 ldrh r0, [r1] + 1f4ad70: e2811004 add r1, r1, #4 + 1f4ad74: e58d1020 str r1, [sp, #32] + 1f4ad78: e3a01000 mov r1, #0 + 1f4ad7c: eafffd3e b 1f4a27c <_vfiprintf_r+0x834> + 1f4ad80: e28d2044 add r2, sp, #68 ; 0x44 + 1f4ad84: e59d1004 ldr r1, [sp, #4] + 1f4ad88: e59d001c ldr r0, [sp, #28] + 1f4ad8c: e58d3030 str r3, [sp, #48] ; 0x30 + 1f4ad90: ebfffafb bl 1f49984 <__sprint_r.part.0> + 1f4ad94: e3500000 cmp r0, #0 + 1f4ad98: 1afffeaf bne 1f4a85c <_vfiprintf_r+0xe14> + 1f4ad9c: e28d0048 add r0, sp, #72 ; 0x48 + 1f4ada0: e8900005 ldm r0, {r0, r2} + 1f4ada4: e1a0900b mov r9, fp + 1f4ada8: e280c001 add ip, r0, #1 + 1f4adac: e59d3030 ldr r3, [sp, #48] ; 0x30 + 1f4adb0: eafffe34 b 1f4a688 <_vfiprintf_r+0xc40> + 1f4adb4: e3e00000 mvn r0, #0 + 1f4adb8: eafffbec b 1f49d70 <_vfiprintf_r+0x328> + 1f4adbc: e28d2044 add r2, sp, #68 ; 0x44 + 1f4adc0: e59d1004 ldr r1, [sp, #4] + 1f4adc4: e59d001c ldr r0, [sp, #28] + 1f4adc8: ebfffaed bl 1f49984 <__sprint_r.part.0> + 1f4adcc: e3500000 cmp r0, #0 + 1f4add0: 1afffea1 bne 1f4a85c <_vfiprintf_r+0xe14> + 1f4add4: e59d204c ldr r2, [sp, #76] ; 0x4c + 1f4add8: eafffe81 b 1f4a7e4 <_vfiprintf_r+0xd9c> + 1f4addc: e1a00002 mov r0, r2 + 1f4ade0: e3a0c001 mov ip, #1 + 1f4ade4: e1a0900b mov r9, fp + 1f4ade8: eafffe3b b 1f4a6dc <_vfiprintf_r+0xc94> + 1f4adec: e59d0010 ldr r0, [sp, #16] + 1f4adf0: e59d1020 ldr r1, [sp, #32] + 1f4adf4: e3500000 cmp r0, #0 + 1f4adf8: e5cd303f strb r3, [sp, #63] ; 0x3f + 1f4adfc: e5912000 ldr r2, [r1] + 1f4ae00: e2818004 add r8, r1, #4 + 1f4ae04: e3a03000 mov r3, #0 + 1f4ae08: bafffcd8 blt 1f4a170 <_vfiprintf_r+0x728> + 1f4ae0c: 13a01001 movne r1, #1 + 1f4ae10: 03a01000 moveq r1, #0 + 1f4ae14: e1920003 orrs r0, r2, r3 + 1f4ae18: 13811001 orrne r1, r1, #1 + 1f4ae1c: e3510000 cmp r1, #0 + 1f4ae20: e58d8020 str r8, [sp, #32] + 1f4ae24: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4ae28: 1afffda2 bne 1f4a4b8 <_vfiprintf_r+0xa70> + 1f4ae2c: eaffff1a b 1f4aa9c <_vfiprintf_r+0x1054> + 1f4ae30: e59d2020 ldr r2, [sp, #32] + 1f4ae34: e59d1010 ldr r1, [sp, #16] + 1f4ae38: e5923000 ldr r3, [r2] + 1f4ae3c: e3510000 cmp r1, #0 + 1f4ae40: e2828004 add r8, r2, #4 + 1f4ae44: e1a01003 mov r1, r3 + 1f4ae48: e3a02000 mov r2, #0 + 1f4ae4c: e5cd403f strb r4, [sp, #63] ; 0x3f + 1f4ae50: e58d1008 str r1, [sp, #8] + 1f4ae54: e58d200c str r2, [sp, #12] + 1f4ae58: ba000044 blt 1f4af70 <_vfiprintf_r+0x1528> + 1f4ae5c: 13a03001 movne r3, #1 + 1f4ae60: 03a03000 moveq r3, #0 + 1f4ae64: e1912002 orrs r2, r1, r2 + 1f4ae68: 13833001 orrne r3, r3, #1 + 1f4ae6c: e3530000 cmp r3, #0 + 1f4ae70: e58d8020 str r8, [sp, #32] + 1f4ae74: e3c55080 bic r5, r5, #128 ; 0x80 + 1f4ae78: 1afffce7 bne 1f4a21c <_vfiprintf_r+0x7d4> + 1f4ae7c: eafffdc3 b 1f4a590 <_vfiprintf_r+0xb48> + 1f4ae80: e59dc020 ldr ip, [sp, #32] + 1f4ae84: e59c0000 ldr r0, [ip] + 1f4ae88: e28cc004 add ip, ip, #4 + 1f4ae8c: e3a01000 mov r1, #0 + 1f4ae90: e58dc020 str ip, [sp, #32] + 1f4ae94: eafffcf8 b 1f4a27c <_vfiprintf_r+0x834> + 1f4ae98: e1d030f0 ldrsh r3, [r0] + 1f4ae9c: eafffd3a b 1f4a38c <_vfiprintf_r+0x944> + 1f4aea0: e3855002 orr r5, r5, #2 + 1f4aea4: e58d8020 str r8, [sp, #32] + 1f4aea8: e51f23dc ldr r2, [pc, #-988] ; 1f4aad4 <_vfiprintf_r+0x108c> + 1f4aeac: eafffbd6 b 1f49e0c <_vfiprintf_r+0x3c4> + 1f4aeb0: e59d002c ldr r0, [sp, #44] ; 0x2c + 1f4aeb4: e58d4010 str r4, [sp, #16] + 1f4aeb8: e58d8020 str r8, [sp, #32] + 1f4aebc: ebffd493 bl 1f40110 + 1f4aec0: e5dd403f ldrb r4, [sp, #63] ; 0x3f + 1f4aec4: e58d0018 str r0, [sp, #24] + 1f4aec8: eafffbde b 1f49e48 <_vfiprintf_r+0x400> + 1f4aecc: e28d2044 add r2, sp, #68 ; 0x44 + 1f4aed0: e59d1004 ldr r1, [sp, #4] + 1f4aed4: e59d001c ldr r0, [sp, #28] + 1f4aed8: ebfffaa9 bl 1f49984 <__sprint_r.part.0> + 1f4aedc: e3500000 cmp r0, #0 + 1f4aee0: 1afffe5d bne 1f4a85c <_vfiprintf_r+0xe14> + 1f4aee4: e28d0048 add r0, sp, #72 ; 0x48 + 1f4aee8: e8900005 ldm r0, {r0, r2} + 1f4aeec: e1a0900b mov r9, fp + 1f4aef0: e280c001 add ip, r0, #1 + 1f4aef4: eafffdf8 b 1f4a6dc <_vfiprintf_r+0xc94> + 1f4aef8: e28d0048 add r0, sp, #72 ; 0x48 + 1f4aefc: e8900005 ldm r0, {r0, r2} + 1f4af00: e51f1430 ldr r1, [pc, #-1072] ; 1f4aad8 <_vfiprintf_r+0x1090> + 1f4af04: e2800001 add r0, r0, #1 + 1f4af08: e58d1030 str r1, [sp, #48] ; 0x30 + 1f4af0c: eafffc05 b 1f49f28 <_vfiprintf_r+0x4e0> + 1f4af10: e3530006 cmp r3, #6 + 1f4af14: 23a03006 movcs r3, #6 + 1f4af18: e58d3018 str r3, [sp, #24] + 1f4af1c: e1c33fc3 bic r3, r3, r3, asr #31 + 1f4af20: e58d3008 str r3, [sp, #8] + 1f4af24: e51f3450 ldr r3, [pc, #-1104] ; 1f4aadc <_vfiprintf_r+0x1094> + 1f4af28: e58d8020 str r8, [sp, #32] + 1f4af2c: e58d302c str r3, [sp, #44] ; 0x2c + 1f4af30: eafffd06 b 1f4a350 <_vfiprintf_r+0x908> + 1f4af34: e59d0048 ldr r0, [sp, #72] ; 0x48 + 1f4af38: e51f3460 ldr r3, [pc, #-1120] ; 1f4aae0 <_vfiprintf_r+0x1098> + 1f4af3c: e2800001 add r0, r0, #1 + 1f4af40: e58d3030 str r3, [sp, #48] ; 0x30 + 1f4af44: eafffe87 b 1f4a968 <_vfiprintf_r+0xf20> + 1f4af48: e51f346c ldr r3, [pc, #-1132] ; 1f4aae4 <_vfiprintf_r+0x109c> + 1f4af4c: e1a0e00c mov lr, ip + 1f4af50: e58d3028 str r3, [sp, #40] ; 0x28 + 1f4af54: eafffc42 b 1f4a064 <_vfiprintf_r+0x61c> + 1f4af58: e59d3010 ldr r3, [sp, #16] + 1f4af5c: e58d8020 str r8, [sp, #32] + 1f4af60: e58d3018 str r3, [sp, #24] + 1f4af64: e58d0010 str r0, [sp, #16] + 1f4af68: e5dd403f ldrb r4, [sp, #63] ; 0x3f + 1f4af6c: eafffbb5 b 1f49e48 <_vfiprintf_r+0x400> + 1f4af70: e58d8020 str r8, [sp, #32] + 1f4af74: eafffca8 b 1f4a21c <_vfiprintf_r+0x7d4> + 1f4af78: e59d3020 ldr r3, [sp, #32] + 1f4af7c: e5932000 ldr r2, [r3] + 1f4af80: e58d2010 str r2, [sp, #16] + 1f4af84: e3520000 cmp r2, #0 + 1f4af88: e2832004 add r2, r3, #4 + 1f4af8c: e58d2020 str r2, [sp, #32] + 1f4af90: e5d63001 ldrb r3, [r6, #1] + 1f4af94: e1a06004 mov r6, r4 + 1f4af98: aafffaff bge 1f49b9c <_vfiprintf_r+0x154> + 1f4af9c: eafffafc b 1f49b94 <_vfiprintf_r+0x14c> + 1f4afa0: e5dd403f ldrb r4, [sp, #63] ; 0x3f + 1f4afa4: eafffc9c b 1f4a21c <_vfiprintf_r+0x7d4> + +01f4afa8 : + 1f4afa8: e59fc010 ldr ip, [pc, #16] ; 1f4afc0 + 1f4afac: e1a03002 mov r3, r2 + 1f4afb0: e1a02001 mov r2, r1 + 1f4afb4: e1a01000 mov r1, r0 + 1f4afb8: e59c0000 ldr r0, [ip] + 1f4afbc: eafffaa1 b 1f49a48 <_vfiprintf_r> + 1f4afc0: 01f65c08 .word 0x01f65c08 + +01f4afc4 <__sbprintf>: + 1f4afc4: e92d40f0 push {r4, r5, r6, r7, lr} + 1f4afc8: e1a04001 mov r4, r1 + 1f4afcc: e3a0cb01 mov ip, #1024 ; 0x400 + 1f4afd0: e3a0e000 mov lr, #0 + 1f4afd4: e5946064 ldr r6, [r4, #100] ; 0x64 + 1f4afd8: e24dde46 sub sp, sp, #1120 ; 0x460 + 1f4afdc: e24dd00c sub sp, sp, #12 + 1f4afe0: e1d110bc ldrh r1, [r1, #12] + 1f4afe4: e58d6064 str r6, [sp, #100] ; 0x64 + 1f4afe8: e594601c ldr r6, [r4, #28] + 1f4afec: e1d470be ldrh r7, [r4, #14] + 1f4aff0: e3c11002 bic r1, r1, #2 + 1f4aff4: e58d601c str r6, [sp, #28] + 1f4aff8: e5946024 ldr r6, [r4, #36] ; 0x24 + 1f4affc: e1cd10bc strh r1, [sp, #12] + 1f4b000: e58dc008 str ip, [sp, #8] + 1f4b004: e58dc014 str ip, [sp, #20] + 1f4b008: e1a0100d mov r1, sp + 1f4b00c: e28dc068 add ip, sp, #104 ; 0x68 + 1f4b010: e1cd70be strh r7, [sp, #14] + 1f4b014: e58d6024 str r6, [sp, #36] ; 0x24 + 1f4b018: e58de018 str lr, [sp, #24] + 1f4b01c: e58dc000 str ip, [sp] + 1f4b020: e58dc010 str ip, [sp, #16] + 1f4b024: e1a07000 mov r7, r0 + 1f4b028: ebfffa86 bl 1f49a48 <_vfiprintf_r> + 1f4b02c: e2506000 subs r6, r0, #0 + 1f4b030: ba000004 blt 1f4b048 <__sbprintf+0x84> + 1f4b034: e1a0100d mov r1, sp + 1f4b038: e1a00007 mov r0, r7 + 1f4b03c: ebffee8d bl 1f46a78 <_fflush_r> + 1f4b040: e3500000 cmp r0, #0 + 1f4b044: 13e06000 mvnne r6, #0 + 1f4b048: e1a00006 mov r0, r6 + 1f4b04c: e1dd30bc ldrh r3, [sp, #12] + 1f4b050: e3130040 tst r3, #64 ; 0x40 + 1f4b054: 11d430bc ldrhne r3, [r4, #12] + 1f4b058: 13833040 orrne r3, r3, #64 ; 0x40 + 1f4b05c: 11c430bc strhne r3, [r4, #12] + 1f4b060: e28dde46 add sp, sp, #1120 ; 0x460 + 1f4b064: e28dd00c add sp, sp, #12 + 1f4b068: e8bd40f0 pop {r4, r5, r6, r7, lr} + 1f4b06c: e12fff1e bx lr + +01f4b070 <_write_r>: + 1f4b070: e92d4070 push {r4, r5, r6, lr} + 1f4b074: e1a0e001 mov lr, r1 + 1f4b078: e3a0c000 mov ip, #0 + 1f4b07c: e59f4030 ldr r4, [pc, #48] ; 1f4b0b4 <_write_r+0x44> + 1f4b080: e1a01002 mov r1, r2 + 1f4b084: e1a05000 mov r5, r0 + 1f4b088: e1a02003 mov r2, r3 + 1f4b08c: e1a0000e mov r0, lr + 1f4b090: e584c000 str ip, [r4] + 1f4b094: ebfed570 bl 1f0065c <_write> + 1f4b098: e3700001 cmn r0, #1 + 1f4b09c: 1a000002 bne 1f4b0ac <_write_r+0x3c> + 1f4b0a0: e5943000 ldr r3, [r4] + 1f4b0a4: e3530000 cmp r3, #0 + 1f4b0a8: 15853000 strne r3, [r5] + 1f4b0ac: e8bd4070 pop {r4, r5, r6, lr} + 1f4b0b0: e12fff1e bx lr + 1f4b0b4: 020e8000 .word 0x020e8000 + +01f4b0b8 <_calloc_r>: + 1f4b0b8: e92d4010 push {r4, lr} + 1f4b0bc: e0010192 mul r1, r2, r1 + 1f4b0c0: ebffcd38 bl 1f3e5a8 <_malloc_r> + 1f4b0c4: e2504000 subs r4, r0, #0 + 1f4b0c8: 0a000018 beq 1f4b130 <_calloc_r+0x78> + 1f4b0cc: e5142004 ldr r2, [r4, #-4] + 1f4b0d0: e3c22003 bic r2, r2, #3 + 1f4b0d4: e2422004 sub r2, r2, #4 + 1f4b0d8: e3520024 cmp r2, #36 ; 0x24 + 1f4b0dc: 8a000016 bhi 1f4b13c <_calloc_r+0x84> + 1f4b0e0: e3520013 cmp r2, #19 + 1f4b0e4: 91a02004 movls r2, r4 + 1f4b0e8: 9a00000c bls 1f4b120 <_calloc_r+0x68> + 1f4b0ec: e3a03000 mov r3, #0 + 1f4b0f0: e352001b cmp r2, #27 + 1f4b0f4: e5843000 str r3, [r4] + 1f4b0f8: e5843004 str r3, [r4, #4] + 1f4b0fc: 92842008 addls r2, r4, #8 + 1f4b100: 9a000006 bls 1f4b120 <_calloc_r+0x68> + 1f4b104: e3520024 cmp r2, #36 ; 0x24 + 1f4b108: e5843008 str r3, [r4, #8] + 1f4b10c: e584300c str r3, [r4, #12] + 1f4b110: 05843010 streq r3, [r4, #16] + 1f4b114: 05843014 streq r3, [r4, #20] + 1f4b118: 12842010 addne r2, r4, #16 + 1f4b11c: 02842018 addeq r2, r4, #24 + 1f4b120: e3a03000 mov r3, #0 + 1f4b124: e5823000 str r3, [r2] + 1f4b128: e5823004 str r3, [r2, #4] + 1f4b12c: e5823008 str r3, [r2, #8] + 1f4b130: e1a00004 mov r0, r4 + 1f4b134: e8bd4010 pop {r4, lr} + 1f4b138: e12fff1e bx lr + 1f4b13c: e3a01000 mov r1, #0 + 1f4b140: ebffcfb5 bl 1f3f01c + 1f4b144: e1a00004 mov r0, r4 + 1f4b148: e8bd4010 pop {r4, lr} + 1f4b14c: e12fff1e bx lr + +01f4b150 <_close_r>: + 1f4b150: e3a03000 mov r3, #0 + 1f4b154: e92d4070 push {r4, r5, r6, lr} + 1f4b158: e59f4028 ldr r4, [pc, #40] ; 1f4b188 <_close_r+0x38> + 1f4b15c: e1a05000 mov r5, r0 + 1f4b160: e1a00001 mov r0, r1 + 1f4b164: e5843000 str r3, [r4] + 1f4b168: ebfed4ed bl 1f00524 <_close> + 1f4b16c: e3700001 cmn r0, #1 + 1f4b170: 1a000002 bne 1f4b180 <_close_r+0x30> + 1f4b174: e5943000 ldr r3, [r4] + 1f4b178: e3530000 cmp r3, #0 + 1f4b17c: 15853000 strne r3, [r5] + 1f4b180: e8bd4070 pop {r4, r5, r6, lr} + 1f4b184: e12fff1e bx lr + 1f4b188: 020e8000 .word 0x020e8000 + +01f4b18c <_fclose_r>: + 1f4b18c: e3510000 cmp r1, #0 + 1f4b190: 0a00003a beq 1f4b280 <_fclose_r+0xf4> + 1f4b194: e3500000 cmp r0, #0 + 1f4b198: e92d4070 push {r4, r5, r6, lr} + 1f4b19c: e1a06000 mov r6, r0 + 1f4b1a0: e1a04001 mov r4, r1 + 1f4b1a4: 0a000002 beq 1f4b1b4 <_fclose_r+0x28> + 1f4b1a8: e5903038 ldr r3, [r0, #56] ; 0x38 + 1f4b1ac: e3530000 cmp r3, #0 + 1f4b1b0: 0a00002c beq 1f4b268 <_fclose_r+0xdc> + 1f4b1b4: e1d430fc ldrsh r3, [r4, #12] + 1f4b1b8: e3530000 cmp r3, #0 + 1f4b1bc: 03a00000 moveq r0, #0 + 1f4b1c0: 1a000001 bne 1f4b1cc <_fclose_r+0x40> + 1f4b1c4: e8bd4070 pop {r4, r5, r6, lr} + 1f4b1c8: e12fff1e bx lr + 1f4b1cc: e1a01004 mov r1, r4 + 1f4b1d0: e1a00006 mov r0, r6 + 1f4b1d4: ebffed97 bl 1f46838 <__sflush_r> + 1f4b1d8: e594302c ldr r3, [r4, #44] ; 0x2c + 1f4b1dc: e3530000 cmp r3, #0 + 1f4b1e0: e1a05000 mov r5, r0 + 1f4b1e4: 0a000005 beq 1f4b200 <_fclose_r+0x74> + 1f4b1e8: e594101c ldr r1, [r4, #28] + 1f4b1ec: e1a00006 mov r0, r6 + 1f4b1f0: e1a0e00f mov lr, pc + 1f4b1f4: e12fff13 bx r3 + 1f4b1f8: e3500000 cmp r0, #0 + 1f4b1fc: b3e05000 mvnlt r5, #0 + 1f4b200: e1d430bc ldrh r3, [r4, #12] + 1f4b204: e3130080 tst r3, #128 ; 0x80 + 1f4b208: 1a000018 bne 1f4b270 <_fclose_r+0xe4> + 1f4b20c: e5941030 ldr r1, [r4, #48] ; 0x30 + 1f4b210: e3510000 cmp r1, #0 + 1f4b214: 0a000005 beq 1f4b230 <_fclose_r+0xa4> + 1f4b218: e2843040 add r3, r4, #64 ; 0x40 + 1f4b21c: e1510003 cmp r1, r3 + 1f4b220: 11a00006 movne r0, r6 + 1f4b224: 1bffef4a blne 1f46f54 <_free_r> + 1f4b228: e3a03000 mov r3, #0 + 1f4b22c: e5843030 str r3, [r4, #48] ; 0x30 + 1f4b230: e5941044 ldr r1, [r4, #68] ; 0x44 + 1f4b234: e3510000 cmp r1, #0 + 1f4b238: 0a000003 beq 1f4b24c <_fclose_r+0xc0> + 1f4b23c: e1a00006 mov r0, r6 + 1f4b240: ebffef43 bl 1f46f54 <_free_r> + 1f4b244: e3a03000 mov r3, #0 + 1f4b248: e5843044 str r3, [r4, #68] ; 0x44 + 1f4b24c: ebffeeea bl 1f46dfc <__sfp_lock_acquire> + 1f4b250: e3a03000 mov r3, #0 + 1f4b254: e1c430bc strh r3, [r4, #12] + 1f4b258: ebffeee8 bl 1f46e00 <__sfp_lock_release> + 1f4b25c: e1a00005 mov r0, r5 + 1f4b260: e8bd4070 pop {r4, r5, r6, lr} + 1f4b264: e12fff1e bx lr + 1f4b268: ebffeedf bl 1f46dec <__sinit> + 1f4b26c: eaffffd0 b 1f4b1b4 <_fclose_r+0x28> + 1f4b270: e5941010 ldr r1, [r4, #16] + 1f4b274: e1a00006 mov r0, r6 + 1f4b278: ebffef35 bl 1f46f54 <_free_r> + 1f4b27c: eaffffe2 b 1f4b20c <_fclose_r+0x80> + 1f4b280: e3a00000 mov r0, #0 + 1f4b284: e12fff1e bx lr + +01f4b288 : + 1f4b288: e59f3008 ldr r3, [pc, #8] ; 1f4b298 + 1f4b28c: e1a01000 mov r1, r0 + 1f4b290: e5930000 ldr r0, [r3] + 1f4b294: eaffffbc b 1f4b18c <_fclose_r> + 1f4b298: 01f65c08 .word 0x01f65c08 + +01f4b29c <__fputwc>: + 1f4b29c: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f4b2a0: e24dd008 sub sp, sp, #8 + 1f4b2a4: e1a07000 mov r7, r0 + 1f4b2a8: e1a06001 mov r6, r1 + 1f4b2ac: e1a04002 mov r4, r2 + 1f4b2b0: ebfff046 bl 1f473d0 <__locale_mb_cur_max> + 1f4b2b4: e3500001 cmp r0, #1 + 1f4b2b8: 0a000030 beq 1f4b380 <__fputwc+0xe4> + 1f4b2bc: e284305c add r3, r4, #92 ; 0x5c + 1f4b2c0: e1a02006 mov r2, r6 + 1f4b2c4: e28d1004 add r1, sp, #4 + 1f4b2c8: e1a00007 mov r0, r7 + 1f4b2cc: eb000220 bl 1f4bb54 <_wcrtomb_r> + 1f4b2d0: e3700001 cmn r0, #1 + 1f4b2d4: e1a08000 mov r8, r0 + 1f4b2d8: 0a000022 beq 1f4b368 <__fputwc+0xcc> + 1f4b2dc: e3500000 cmp r0, #0 + 1f4b2e0: 15dd1004 ldrbne r1, [sp, #4] + 1f4b2e4: 0a00002c beq 1f4b39c <__fputwc+0x100> + 1f4b2e8: e3a05000 mov r5, #0 + 1f4b2ec: ea000008 b 1f4b314 <__fputwc+0x78> + 1f4b2f0: e5943000 ldr r3, [r4] + 1f4b2f4: e2832001 add r2, r3, #1 + 1f4b2f8: e5842000 str r2, [r4] + 1f4b2fc: e5c31000 strb r1, [r3] + 1f4b300: e2855001 add r5, r5, #1 + 1f4b304: e1550008 cmp r5, r8 + 1f4b308: 2a000023 bcs 1f4b39c <__fputwc+0x100> + 1f4b30c: e28d3004 add r3, sp, #4 + 1f4b310: e7d31005 ldrb r1, [r3, r5] + 1f4b314: e5943008 ldr r3, [r4, #8] + 1f4b318: e2433001 sub r3, r3, #1 + 1f4b31c: e3530000 cmp r3, #0 + 1f4b320: e5843008 str r3, [r4, #8] + 1f4b324: aafffff1 bge 1f4b2f0 <__fputwc+0x54> + 1f4b328: e5942018 ldr r2, [r4, #24] + 1f4b32c: e1530002 cmp r3, r2 + 1f4b330: b3a03000 movlt r3, #0 + 1f4b334: a3a03001 movge r3, #1 + 1f4b338: e351000a cmp r1, #10 + 1f4b33c: 03a03000 moveq r3, #0 + 1f4b340: e3530000 cmp r3, #0 + 1f4b344: 1affffe9 bne 1f4b2f0 <__fputwc+0x54> + 1f4b348: e1a02004 mov r2, r4 + 1f4b34c: e1a00007 mov r0, r7 + 1f4b350: eb0001ad bl 1f4ba0c <__swbuf_r> + 1f4b354: e3700001 cmn r0, #1 + 1f4b358: 1affffe8 bne 1f4b300 <__fputwc+0x64> + 1f4b35c: e28dd008 add sp, sp, #8 + 1f4b360: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f4b364: e12fff1e bx lr + 1f4b368: e1d430bc ldrh r3, [r4, #12] + 1f4b36c: e3833040 orr r3, r3, #64 ; 0x40 + 1f4b370: e1c430bc strh r3, [r4, #12] + 1f4b374: e28dd008 add sp, sp, #8 + 1f4b378: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f4b37c: e12fff1e bx lr + 1f4b380: e2463001 sub r3, r6, #1 + 1f4b384: e35300fe cmp r3, #254 ; 0xfe + 1f4b388: 8affffcb bhi 1f4b2bc <__fputwc+0x20> + 1f4b38c: e20610ff and r1, r6, #255 ; 0xff + 1f4b390: e1a08000 mov r8, r0 + 1f4b394: e5cd1004 strb r1, [sp, #4] + 1f4b398: eaffffd2 b 1f4b2e8 <__fputwc+0x4c> + 1f4b39c: e1a00006 mov r0, r6 + 1f4b3a0: e28dd008 add sp, sp, #8 + 1f4b3a4: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f4b3a8: e12fff1e bx lr + +01f4b3ac <_fputwc_r>: + 1f4b3ac: e1d230fc ldrsh r3, [r2, #12] + 1f4b3b0: e3130a02 tst r3, #8192 ; 0x2000 + 1f4b3b4: 0592c064 ldreq ip, [r2, #100] ; 0x64 + 1f4b3b8: 03833a02 orreq r3, r3, #8192 ; 0x2000 + 1f4b3bc: 038cca02 orreq ip, ip, #8192 ; 0x2000 + 1f4b3c0: 01c230bc strheq r3, [r2, #12] + 1f4b3c4: 0582c064 streq ip, [r2, #100] ; 0x64 + 1f4b3c8: eaffffb3 b 1f4b29c <__fputwc> + +01f4b3cc : + 1f4b3cc: e59f305c ldr r3, [pc, #92] ; 1f4b430 + 1f4b3d0: e92d4070 push {r4, r5, r6, lr} + 1f4b3d4: e5935000 ldr r5, [r3] + 1f4b3d8: e3550000 cmp r5, #0 + 1f4b3dc: e1a06000 mov r6, r0 + 1f4b3e0: e1a04001 mov r4, r1 + 1f4b3e4: 0a000002 beq 1f4b3f4 + 1f4b3e8: e5953038 ldr r3, [r5, #56] ; 0x38 + 1f4b3ec: e3530000 cmp r3, #0 + 1f4b3f0: 0a00000b beq 1f4b424 + 1f4b3f4: e1d430fc ldrsh r3, [r4, #12] + 1f4b3f8: e3130a02 tst r3, #8192 ; 0x2000 + 1f4b3fc: 05942064 ldreq r2, [r4, #100] ; 0x64 + 1f4b400: 03833a02 orreq r3, r3, #8192 ; 0x2000 + 1f4b404: 03822a02 orreq r2, r2, #8192 ; 0x2000 + 1f4b408: 05842064 streq r2, [r4, #100] ; 0x64 + 1f4b40c: 01c430bc strheq r3, [r4, #12] + 1f4b410: e1a02004 mov r2, r4 + 1f4b414: e1a01006 mov r1, r6 + 1f4b418: e1a00005 mov r0, r5 + 1f4b41c: e8bd4070 pop {r4, r5, r6, lr} + 1f4b420: eaffff9d b 1f4b29c <__fputwc> + 1f4b424: e1a00005 mov r0, r5 + 1f4b428: ebffee6f bl 1f46dec <__sinit> + 1f4b42c: eafffff0 b 1f4b3f4 + 1f4b430: 01f65c08 .word 0x01f65c08 + +01f4b434 <_fstat_r>: + 1f4b434: e1a0c001 mov ip, r1 + 1f4b438: e3a03000 mov r3, #0 + 1f4b43c: e92d4070 push {r4, r5, r6, lr} + 1f4b440: e59f402c ldr r4, [pc, #44] ; 1f4b474 <_fstat_r+0x40> + 1f4b444: e1a05000 mov r5, r0 + 1f4b448: e1a01002 mov r1, r2 + 1f4b44c: e1a0000c mov r0, ip + 1f4b450: e5843000 str r3, [r4] + 1f4b454: ebfed440 bl 1f0055c <_fstat> + 1f4b458: e3700001 cmn r0, #1 + 1f4b45c: 1a000002 bne 1f4b46c <_fstat_r+0x38> + 1f4b460: e5943000 ldr r3, [r4] + 1f4b464: e3530000 cmp r3, #0 + 1f4b468: 15853000 strne r3, [r5] + 1f4b46c: e8bd4070 pop {r4, r5, r6, lr} + 1f4b470: e12fff1e bx lr + 1f4b474: 020e8000 .word 0x020e8000 + +01f4b478 <__sfvwrite_r>: + 1f4b478: e5923008 ldr r3, [r2, #8] + 1f4b47c: e3530000 cmp r3, #0 + 1f4b480: 0a000083 beq 1f4b694 <__sfvwrite_r+0x21c> + 1f4b484: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f4b488: e1d130fc ldrsh r3, [r1, #12] + 1f4b48c: e1a03803 lsl r3, r3, #16 + 1f4b490: e24dd00c sub sp, sp, #12 + 1f4b494: e3130702 tst r3, #524288 ; 0x80000 + 1f4b498: e1a04001 mov r4, r1 + 1f4b49c: e58d0000 str r0, [sp] + 1f4b4a0: e1a06002 mov r6, r2 + 1f4b4a4: e1a08823 lsr r8, r3, #16 + 1f4b4a8: 0a000020 beq 1f4b530 <__sfvwrite_r+0xb8> + 1f4b4ac: e5912010 ldr r2, [r1, #16] + 1f4b4b0: e3520000 cmp r2, #0 + 1f4b4b4: 0a00001d beq 1f4b530 <__sfvwrite_r+0xb8> + 1f4b4b8: e2189002 ands r9, r8, #2 + 1f4b4bc: e5965000 ldr r5, [r6] + 1f4b4c0: 0a000025 beq 1f4b55c <__sfvwrite_r+0xe4> + 1f4b4c4: e3a08000 mov r8, #0 + 1f4b4c8: e1a07008 mov r7, r8 + 1f4b4cc: e59f9468 ldr r9, [pc, #1128] ; 1f4b93c <__sfvwrite_r+0x4c4> + 1f4b4d0: e3570000 cmp r7, #0 + 1f4b4d4: 0a00006a beq 1f4b684 <__sfvwrite_r+0x20c> + 1f4b4d8: e1570009 cmp r7, r9 + 1f4b4dc: 31a03007 movcc r3, r7 + 1f4b4e0: 21a03009 movcs r3, r9 + 1f4b4e4: e1a02008 mov r2, r8 + 1f4b4e8: e594101c ldr r1, [r4, #28] + 1f4b4ec: e59d0000 ldr r0, [sp] + 1f4b4f0: e594c024 ldr ip, [r4, #36] ; 0x24 + 1f4b4f4: e1a0e00f mov lr, pc + 1f4b4f8: e12fff1c bx ip + 1f4b4fc: e3500000 cmp r0, #0 + 1f4b500: da00006a ble 1f4b6b0 <__sfvwrite_r+0x238> + 1f4b504: e5963008 ldr r3, [r6, #8] + 1f4b508: e0603003 rsb r3, r0, r3 + 1f4b50c: e3530000 cmp r3, #0 + 1f4b510: e0888000 add r8, r8, r0 + 1f4b514: e0607007 rsb r7, r0, r7 + 1f4b518: e5863008 str r3, [r6, #8] + 1f4b51c: 1affffeb bne 1f4b4d0 <__sfvwrite_r+0x58> + 1f4b520: e3a00000 mov r0, #0 + 1f4b524: e28dd00c add sp, sp, #12 + 1f4b528: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f4b52c: e12fff1e bx lr + 1f4b530: e1a01004 mov r1, r4 + 1f4b534: e59d0000 ldr r0, [sp] + 1f4b538: ebffe6fd bl 1f45134 <__swsetup_r> + 1f4b53c: e3500000 cmp r0, #0 + 1f4b540: 1a0000f6 bne 1f4b920 <__sfvwrite_r+0x4a8> + 1f4b544: e1d430fc ldrsh r3, [r4, #12] + 1f4b548: e1a03803 lsl r3, r3, #16 + 1f4b54c: e1a08823 lsr r8, r3, #16 + 1f4b550: e2189002 ands r9, r8, #2 + 1f4b554: e5965000 ldr r5, [r6] + 1f4b558: 1affffd9 bne 1f4b4c4 <__sfvwrite_r+0x4c> + 1f4b55c: e2188001 ands r8, r8, #1 + 1f4b560: 1a000059 bne 1f4b6cc <__sfvwrite_r+0x254> + 1f4b564: e1a07008 mov r7, r8 + 1f4b568: e3570000 cmp r7, #0 + 1f4b56c: 0a000040 beq 1f4b674 <__sfvwrite_r+0x1fc> + 1f4b570: e3130402 tst r3, #33554432 ; 0x2000000 + 1f4b574: e5949008 ldr r9, [r4, #8] + 1f4b578: e1a03823 lsr r3, r3, #16 + 1f4b57c: 0a000084 beq 1f4b794 <__sfvwrite_r+0x31c> + 1f4b580: e1570009 cmp r7, r9 + 1f4b584: e1a0a009 mov sl, r9 + 1f4b588: 3a000097 bcc 1f4b7ec <__sfvwrite_r+0x374> + 1f4b58c: e3130d12 tst r3, #1152 ; 0x480 + 1f4b590: 0a000097 beq 1f4b7f4 <__sfvwrite_r+0x37c> + 1f4b594: e5941010 ldr r1, [r4, #16] + 1f4b598: e594a000 ldr sl, [r4] + 1f4b59c: e5949014 ldr r9, [r4, #20] + 1f4b5a0: e061a00a rsb sl, r1, sl + 1f4b5a4: e0899089 add r9, r9, r9, lsl #1 + 1f4b5a8: e28a0001 add r0, sl, #1 + 1f4b5ac: e0899fa9 add r9, r9, r9, lsr #31 + 1f4b5b0: e1a090c9 asr r9, r9, #1 + 1f4b5b4: e0800007 add r0, r0, r7 + 1f4b5b8: e1500009 cmp r0, r9 + 1f4b5bc: e1a02009 mov r2, r9 + 1f4b5c0: 81a09000 movhi r9, r0 + 1f4b5c4: 81a02009 movhi r2, r9 + 1f4b5c8: e3130b01 tst r3, #1024 ; 0x400 + 1f4b5cc: 0a0000c6 beq 1f4b8ec <__sfvwrite_r+0x474> + 1f4b5d0: e1a01002 mov r1, r2 + 1f4b5d4: e59d0000 ldr r0, [sp] + 1f4b5d8: ebffcbf2 bl 1f3e5a8 <_malloc_r> + 1f4b5dc: e250b000 subs fp, r0, #0 + 1f4b5e0: 0a0000d0 beq 1f4b928 <__sfvwrite_r+0x4b0> + 1f4b5e4: e1a0200a mov r2, sl + 1f4b5e8: e5941010 ldr r1, [r4, #16] + 1f4b5ec: ebffce03 bl 1f3ee00 + 1f4b5f0: e1d430bc ldrh r3, [r4, #12] + 1f4b5f4: e3c33d12 bic r3, r3, #1152 ; 0x480 + 1f4b5f8: e3833080 orr r3, r3, #128 ; 0x80 + 1f4b5fc: e1c430bc strh r3, [r4, #12] + 1f4b600: e08b000a add r0, fp, sl + 1f4b604: e06aa009 rsb sl, sl, r9 + 1f4b608: e584a008 str sl, [r4, #8] + 1f4b60c: e5849014 str r9, [r4, #20] + 1f4b610: e1a0a007 mov sl, r7 + 1f4b614: e1a09007 mov r9, r7 + 1f4b618: e584b010 str fp, [r4, #16] + 1f4b61c: e5840000 str r0, [r4] + 1f4b620: e1a0200a mov r2, sl + 1f4b624: e1a01008 mov r1, r8 + 1f4b628: ebffce30 bl 1f3eef0 + 1f4b62c: e5940008 ldr r0, [r4, #8] + 1f4b630: e0699000 rsb r9, r9, r0 + 1f4b634: e1a00007 mov r0, r7 + 1f4b638: e5942000 ldr r2, [r4] + 1f4b63c: e082200a add r2, r2, sl + 1f4b640: e5849008 str r9, [r4, #8] + 1f4b644: e5842000 str r2, [r4] + 1f4b648: e5963008 ldr r3, [r6, #8] + 1f4b64c: e0603003 rsb r3, r0, r3 + 1f4b650: e3530000 cmp r3, #0 + 1f4b654: e0888000 add r8, r8, r0 + 1f4b658: e0607007 rsb r7, r0, r7 + 1f4b65c: e5863008 str r3, [r6, #8] + 1f4b660: 0affffae beq 1f4b520 <__sfvwrite_r+0xa8> + 1f4b664: e1d430fc ldrsh r3, [r4, #12] + 1f4b668: e3570000 cmp r7, #0 + 1f4b66c: e1a03803 lsl r3, r3, #16 + 1f4b670: 1affffbe bne 1f4b570 <__sfvwrite_r+0xf8> + 1f4b674: e5958000 ldr r8, [r5] + 1f4b678: e5957004 ldr r7, [r5, #4] + 1f4b67c: e2855008 add r5, r5, #8 + 1f4b680: eaffffb8 b 1f4b568 <__sfvwrite_r+0xf0> + 1f4b684: e5958000 ldr r8, [r5] + 1f4b688: e5957004 ldr r7, [r5, #4] + 1f4b68c: e2855008 add r5, r5, #8 + 1f4b690: eaffff8e b 1f4b4d0 <__sfvwrite_r+0x58> + 1f4b694: e3a00000 mov r0, #0 + 1f4b698: e12fff1e bx lr + 1f4b69c: e1a01004 mov r1, r4 + 1f4b6a0: e59d0000 ldr r0, [sp] + 1f4b6a4: ebffecf3 bl 1f46a78 <_fflush_r> + 1f4b6a8: e3500000 cmp r0, #0 + 1f4b6ac: 0a00004c beq 1f4b7e4 <__sfvwrite_r+0x36c> + 1f4b6b0: e1d430fc ldrsh r3, [r4, #12] + 1f4b6b4: e3e00000 mvn r0, #0 + 1f4b6b8: e3833040 orr r3, r3, #64 ; 0x40 + 1f4b6bc: e1c430bc strh r3, [r4, #12] + 1f4b6c0: e28dd00c add sp, sp, #12 + 1f4b6c4: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f4b6c8: e12fff1e bx lr + 1f4b6cc: e1a0b009 mov fp, r9 + 1f4b6d0: e1a0a009 mov sl, r9 + 1f4b6d4: e1a08009 mov r8, r9 + 1f4b6d8: e3580000 cmp r8, #0 + 1f4b6dc: 0a000027 beq 1f4b780 <__sfvwrite_r+0x308> + 1f4b6e0: e35b0000 cmp fp, #0 + 1f4b6e4: 0a000056 beq 1f4b844 <__sfvwrite_r+0x3cc> + 1f4b6e8: e1590008 cmp r9, r8 + 1f4b6ec: 31a01009 movcc r1, r9 + 1f4b6f0: 21a01008 movcs r1, r8 + 1f4b6f4: e5942010 ldr r2, [r4, #16] + 1f4b6f8: e594c014 ldr ip, [r4, #20] + 1f4b6fc: e5943008 ldr r3, [r4, #8] + 1f4b700: e5940000 ldr r0, [r4] + 1f4b704: e08c3003 add r3, ip, r3 + 1f4b708: e1500002 cmp r0, r2 + 1f4b70c: 93a02000 movls r2, #0 + 1f4b710: 83a02001 movhi r2, #1 + 1f4b714: e1510003 cmp r1, r3 + 1f4b718: d3a02000 movle r2, #0 + 1f4b71c: e3520000 cmp r2, #0 + 1f4b720: e1a07001 mov r7, r1 + 1f4b724: 1a000060 bne 1f4b8ac <__sfvwrite_r+0x434> + 1f4b728: e151000c cmp r1, ip + 1f4b72c: ba000032 blt 1f4b7fc <__sfvwrite_r+0x384> + 1f4b730: e1a0300c mov r3, ip + 1f4b734: e1a0200a mov r2, sl + 1f4b738: e594101c ldr r1, [r4, #28] + 1f4b73c: e59d0000 ldr r0, [sp] + 1f4b740: e594c024 ldr ip, [r4, #36] ; 0x24 + 1f4b744: e1a0e00f mov lr, pc + 1f4b748: e12fff1c bx ip + 1f4b74c: e2507000 subs r7, r0, #0 + 1f4b750: daffffd6 ble 1f4b6b0 <__sfvwrite_r+0x238> + 1f4b754: e0599007 subs r9, r9, r7 + 1f4b758: 0a000032 beq 1f4b828 <__sfvwrite_r+0x3b0> + 1f4b75c: e5963008 ldr r3, [r6, #8] + 1f4b760: e0673003 rsb r3, r7, r3 + 1f4b764: e3530000 cmp r3, #0 + 1f4b768: e08aa007 add sl, sl, r7 + 1f4b76c: e0678008 rsb r8, r7, r8 + 1f4b770: e5863008 str r3, [r6, #8] + 1f4b774: 0affff69 beq 1f4b520 <__sfvwrite_r+0xa8> + 1f4b778: e3580000 cmp r8, #0 + 1f4b77c: 1affffd7 bne 1f4b6e0 <__sfvwrite_r+0x268> + 1f4b780: e595a000 ldr sl, [r5] + 1f4b784: e5958004 ldr r8, [r5, #4] + 1f4b788: e3a0b000 mov fp, #0 + 1f4b78c: e2855008 add r5, r5, #8 + 1f4b790: eaffffd0 b 1f4b6d8 <__sfvwrite_r+0x260> + 1f4b794: e5940000 ldr r0, [r4] + 1f4b798: e5943010 ldr r3, [r4, #16] + 1f4b79c: e1500003 cmp r0, r3 + 1f4b7a0: 8a000002 bhi 1f4b7b0 <__sfvwrite_r+0x338> + 1f4b7a4: e594a014 ldr sl, [r4, #20] + 1f4b7a8: e157000a cmp r7, sl + 1f4b7ac: 2a00002f bcs 1f4b870 <__sfvwrite_r+0x3f8> + 1f4b7b0: e1590007 cmp r9, r7 + 1f4b7b4: 21a09007 movcs r9, r7 + 1f4b7b8: e1a01008 mov r1, r8 + 1f4b7bc: e1a02009 mov r2, r9 + 1f4b7c0: ebffcdca bl 1f3eef0 + 1f4b7c4: e5943008 ldr r3, [r4, #8] + 1f4b7c8: e5942000 ldr r2, [r4] + 1f4b7cc: e0693003 rsb r3, r9, r3 + 1f4b7d0: e0822009 add r2, r2, r9 + 1f4b7d4: e3530000 cmp r3, #0 + 1f4b7d8: e5843008 str r3, [r4, #8] + 1f4b7dc: e5842000 str r2, [r4] + 1f4b7e0: 0affffad beq 1f4b69c <__sfvwrite_r+0x224> + 1f4b7e4: e1a00009 mov r0, r9 + 1f4b7e8: eaffff96 b 1f4b648 <__sfvwrite_r+0x1d0> + 1f4b7ec: e1a09007 mov r9, r7 + 1f4b7f0: e1a0a007 mov sl, r7 + 1f4b7f4: e5940000 ldr r0, [r4] + 1f4b7f8: eaffff88 b 1f4b620 <__sfvwrite_r+0x1a8> + 1f4b7fc: e1a02001 mov r2, r1 + 1f4b800: e1a0100a mov r1, sl + 1f4b804: ebffcdb9 bl 1f3eef0 + 1f4b808: e5942008 ldr r2, [r4, #8] + 1f4b80c: e5943000 ldr r3, [r4] + 1f4b810: e0672002 rsb r2, r7, r2 + 1f4b814: e0833007 add r3, r3, r7 + 1f4b818: e0599007 subs r9, r9, r7 + 1f4b81c: e5842008 str r2, [r4, #8] + 1f4b820: e5843000 str r3, [r4] + 1f4b824: 1affffcc bne 1f4b75c <__sfvwrite_r+0x2e4> + 1f4b828: e1a01004 mov r1, r4 + 1f4b82c: e59d0000 ldr r0, [sp] + 1f4b830: ebffec90 bl 1f46a78 <_fflush_r> + 1f4b834: e3500000 cmp r0, #0 + 1f4b838: 1affff9c bne 1f4b6b0 <__sfvwrite_r+0x238> + 1f4b83c: e1a0b009 mov fp, r9 + 1f4b840: eaffffc5 b 1f4b75c <__sfvwrite_r+0x2e4> + 1f4b844: e1a02008 mov r2, r8 + 1f4b848: e3a0100a mov r1, #10 + 1f4b84c: e1a0000a mov r0, sl + 1f4b850: ebffef52 bl 1f475a0 + 1f4b854: e3500000 cmp r0, #0 + 1f4b858: 03a0b001 moveq fp, #1 + 1f4b85c: 12800001 addne r0, r0, #1 + 1f4b860: 106a9000 rsbne r9, sl, r0 + 1f4b864: 13a0b001 movne fp, #1 + 1f4b868: 0088900b addeq r9, r8, fp + 1f4b86c: eaffff9d b 1f4b6e8 <__sfvwrite_r+0x270> + 1f4b870: e3770106 cmn r7, #-2147483647 ; 0x80000001 + 1f4b874: 31a00007 movcc r0, r7 + 1f4b878: 23e00102 mvncs r0, #-2147483648 ; 0x80000000 + 1f4b87c: e1a0100a mov r1, sl + 1f4b880: eb000162 bl 1f4be10 <__aeabi_idiv> + 1f4b884: e1a02008 mov r2, r8 + 1f4b888: e003009a mul r3, sl, r0 + 1f4b88c: e594101c ldr r1, [r4, #28] + 1f4b890: e59d0000 ldr r0, [sp] + 1f4b894: e594c024 ldr ip, [r4, #36] ; 0x24 + 1f4b898: e1a0e00f mov lr, pc + 1f4b89c: e12fff1c bx ip + 1f4b8a0: e3500000 cmp r0, #0 + 1f4b8a4: caffff67 bgt 1f4b648 <__sfvwrite_r+0x1d0> + 1f4b8a8: eaffff80 b 1f4b6b0 <__sfvwrite_r+0x238> + 1f4b8ac: e1a02003 mov r2, r3 + 1f4b8b0: e1a0100a mov r1, sl + 1f4b8b4: e58d3004 str r3, [sp, #4] + 1f4b8b8: ebffcd8c bl 1f3eef0 + 1f4b8bc: e5942000 ldr r2, [r4] + 1f4b8c0: e59d3004 ldr r3, [sp, #4] + 1f4b8c4: e0822003 add r2, r2, r3 + 1f4b8c8: e5842000 str r2, [r4] + 1f4b8cc: e1a01004 mov r1, r4 + 1f4b8d0: e59d0000 ldr r0, [sp] + 1f4b8d4: ebffec67 bl 1f46a78 <_fflush_r> + 1f4b8d8: e3500000 cmp r0, #0 + 1f4b8dc: e59d3004 ldr r3, [sp, #4] + 1f4b8e0: 1affff72 bne 1f4b6b0 <__sfvwrite_r+0x238> + 1f4b8e4: e1a07003 mov r7, r3 + 1f4b8e8: eaffff99 b 1f4b754 <__sfvwrite_r+0x2dc> + 1f4b8ec: e59d0000 ldr r0, [sp] + 1f4b8f0: ebffce4a bl 1f3f220 <_realloc_r> + 1f4b8f4: e250b000 subs fp, r0, #0 + 1f4b8f8: 1affff40 bne 1f4b600 <__sfvwrite_r+0x188> + 1f4b8fc: e59d5000 ldr r5, [sp] + 1f4b900: e5941010 ldr r1, [r4, #16] + 1f4b904: e1a00005 mov r0, r5 + 1f4b908: ebffed91 bl 1f46f54 <_free_r> + 1f4b90c: e3a0200c mov r2, #12 + 1f4b910: e1d430fc ldrsh r3, [r4, #12] + 1f4b914: e5852000 str r2, [r5] + 1f4b918: e3c33080 bic r3, r3, #128 ; 0x80 + 1f4b91c: eaffff64 b 1f4b6b4 <__sfvwrite_r+0x23c> + 1f4b920: e3e00000 mvn r0, #0 + 1f4b924: eafffefe b 1f4b524 <__sfvwrite_r+0xac> + 1f4b928: e3a0200c mov r2, #12 + 1f4b92c: e59d1000 ldr r1, [sp] + 1f4b930: e1d430fc ldrsh r3, [r4, #12] + 1f4b934: e5812000 str r2, [r1] + 1f4b938: eaffff5d b 1f4b6b4 <__sfvwrite_r+0x23c> + 1f4b93c: 7ffffc00 .word 0x7ffffc00 + +01f4b940 <_isatty_r>: + 1f4b940: e3a03000 mov r3, #0 + 1f4b944: e92d4070 push {r4, r5, r6, lr} + 1f4b948: e59f4028 ldr r4, [pc, #40] ; 1f4b978 <_isatty_r+0x38> + 1f4b94c: e1a05000 mov r5, r0 + 1f4b950: e1a00001 mov r0, r1 + 1f4b954: e5843000 str r3, [r4] + 1f4b958: ebfed307 bl 1f0057c <_isatty> + 1f4b95c: e3700001 cmn r0, #1 + 1f4b960: 1a000002 bne 1f4b970 <_isatty_r+0x30> + 1f4b964: e5943000 ldr r3, [r4] + 1f4b968: e3530000 cmp r3, #0 + 1f4b96c: 15853000 strne r3, [r5] + 1f4b970: e8bd4070 pop {r4, r5, r6, lr} + 1f4b974: e12fff1e bx lr + 1f4b978: 020e8000 .word 0x020e8000 + +01f4b97c <_lseek_r>: + 1f4b97c: e92d4070 push {r4, r5, r6, lr} + 1f4b980: e1a0e001 mov lr, r1 + 1f4b984: e3a0c000 mov ip, #0 + 1f4b988: e59f4030 ldr r4, [pc, #48] ; 1f4b9c0 <_lseek_r+0x44> + 1f4b98c: e1a01002 mov r1, r2 + 1f4b990: e1a05000 mov r5, r0 + 1f4b994: e1a02003 mov r2, r3 + 1f4b998: e1a0000e mov r0, lr + 1f4b99c: e584c000 str ip, [r4] + 1f4b9a0: ebfed309 bl 1f005cc <_lseek> + 1f4b9a4: e3700001 cmn r0, #1 + 1f4b9a8: 1a000002 bne 1f4b9b8 <_lseek_r+0x3c> + 1f4b9ac: e5943000 ldr r3, [r4] + 1f4b9b0: e3530000 cmp r3, #0 + 1f4b9b4: 15853000 strne r3, [r5] + 1f4b9b8: e8bd4070 pop {r4, r5, r6, lr} + 1f4b9bc: e12fff1e bx lr + 1f4b9c0: 020e8000 .word 0x020e8000 + +01f4b9c4 <_read_r>: + 1f4b9c4: e92d4070 push {r4, r5, r6, lr} + 1f4b9c8: e1a0e001 mov lr, r1 + 1f4b9cc: e3a0c000 mov ip, #0 + 1f4b9d0: e59f4030 ldr r4, [pc, #48] ; 1f4ba08 <_read_r+0x44> + 1f4b9d4: e1a01002 mov r1, r2 + 1f4b9d8: e1a05000 mov r5, r0 + 1f4b9dc: e1a02003 mov r2, r3 + 1f4b9e0: e1a0000e mov r0, lr + 1f4b9e4: e584c000 str ip, [r4] + 1f4b9e8: ebfed2fb bl 1f005dc <_read> + 1f4b9ec: e3700001 cmn r0, #1 + 1f4b9f0: 1a000002 bne 1f4ba00 <_read_r+0x3c> + 1f4b9f4: e5943000 ldr r3, [r4] + 1f4b9f8: e3530000 cmp r3, #0 + 1f4b9fc: 15853000 strne r3, [r5] + 1f4ba00: e8bd4070 pop {r4, r5, r6, lr} + 1f4ba04: e12fff1e bx lr + 1f4ba08: 020e8000 .word 0x020e8000 + +01f4ba0c <__swbuf_r>: + 1f4ba0c: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f4ba10: e2506000 subs r6, r0, #0 + 1f4ba14: e1a05001 mov r5, r1 + 1f4ba18: e1a04002 mov r4, r2 + 1f4ba1c: 0a000002 beq 1f4ba2c <__swbuf_r+0x20> + 1f4ba20: e5963038 ldr r3, [r6, #56] ; 0x38 + 1f4ba24: e3530000 cmp r3, #0 + 1f4ba28: 0a000041 beq 1f4bb34 <__swbuf_r+0x128> + 1f4ba2c: e1d410fc ldrsh r1, [r4, #12] + 1f4ba30: e5940018 ldr r0, [r4, #24] + 1f4ba34: e1a03801 lsl r3, r1, #16 + 1f4ba38: e3130702 tst r3, #524288 ; 0x80000 + 1f4ba3c: e1a02823 lsr r2, r3, #16 + 1f4ba40: e5840008 str r0, [r4, #8] + 1f4ba44: 0a000021 beq 1f4bad0 <__swbuf_r+0xc4> + 1f4ba48: e5943010 ldr r3, [r4, #16] + 1f4ba4c: e3530000 cmp r3, #0 + 1f4ba50: 0a00001e beq 1f4bad0 <__swbuf_r+0xc4> + 1f4ba54: e3120a02 tst r2, #8192 ; 0x2000 + 1f4ba58: 05942064 ldreq r2, [r4, #100] ; 0x64 + 1f4ba5c: 03c22a02 biceq r2, r2, #8192 ; 0x2000 + 1f4ba60: 03811a02 orreq r1, r1, #8192 ; 0x2000 + 1f4ba64: 05842064 streq r2, [r4, #100] ; 0x64 + 1f4ba68: e5942000 ldr r2, [r4] + 1f4ba6c: 01c410bc strheq r1, [r4, #12] + 1f4ba70: e5941014 ldr r1, [r4, #20] + 1f4ba74: e0633002 rsb r3, r3, r2 + 1f4ba78: e1530001 cmp r3, r1 + 1f4ba7c: e20570ff and r7, r5, #255 ; 0xff + 1f4ba80: b2833001 addlt r3, r3, #1 + 1f4ba84: aa000022 bge 1f4bb14 <__swbuf_r+0x108> + 1f4ba88: e5941008 ldr r1, [r4, #8] + 1f4ba8c: e2820001 add r0, r2, #1 + 1f4ba90: e2411001 sub r1, r1, #1 + 1f4ba94: e5841008 str r1, [r4, #8] + 1f4ba98: e5840000 str r0, [r4] + 1f4ba9c: e5c25000 strb r5, [r2] + 1f4baa0: e5942014 ldr r2, [r4, #20] + 1f4baa4: e1520003 cmp r2, r3 + 1f4baa8: 0a000012 beq 1f4baf8 <__swbuf_r+0xec> + 1f4baac: e1d430bc ldrh r3, [r4, #12] + 1f4bab0: e357000a cmp r7, #10 + 1f4bab4: 13a03000 movne r3, #0 + 1f4bab8: 02033001 andeq r3, r3, #1 + 1f4babc: e3530000 cmp r3, #0 + 1f4bac0: 1a00000c bne 1f4baf8 <__swbuf_r+0xec> + 1f4bac4: e1a00007 mov r0, r7 + 1f4bac8: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f4bacc: e12fff1e bx lr + 1f4bad0: e1a01004 mov r1, r4 + 1f4bad4: e1a00006 mov r0, r6 + 1f4bad8: ebffe595 bl 1f45134 <__swsetup_r> + 1f4badc: e3500000 cmp r0, #0 + 1f4bae0: 1a000009 bne 1f4bb0c <__swbuf_r+0x100> + 1f4bae4: e1d410fc ldrsh r1, [r4, #12] + 1f4bae8: e1a02801 lsl r2, r1, #16 + 1f4baec: e5943010 ldr r3, [r4, #16] + 1f4baf0: e1a02822 lsr r2, r2, #16 + 1f4baf4: eaffffd6 b 1f4ba54 <__swbuf_r+0x48> + 1f4baf8: e1a01004 mov r1, r4 + 1f4bafc: e1a00006 mov r0, r6 + 1f4bb00: ebffebdc bl 1f46a78 <_fflush_r> + 1f4bb04: e3500000 cmp r0, #0 + 1f4bb08: 0affffed beq 1f4bac4 <__swbuf_r+0xb8> + 1f4bb0c: e3e00000 mvn r0, #0 + 1f4bb10: eaffffec b 1f4bac8 <__swbuf_r+0xbc> + 1f4bb14: e1a01004 mov r1, r4 + 1f4bb18: e1a00006 mov r0, r6 + 1f4bb1c: ebffebd5 bl 1f46a78 <_fflush_r> + 1f4bb20: e3500000 cmp r0, #0 + 1f4bb24: 1afffff8 bne 1f4bb0c <__swbuf_r+0x100> + 1f4bb28: e3a03001 mov r3, #1 + 1f4bb2c: e5942000 ldr r2, [r4] + 1f4bb30: eaffffd4 b 1f4ba88 <__swbuf_r+0x7c> + 1f4bb34: ebffecac bl 1f46dec <__sinit> + 1f4bb38: eaffffbb b 1f4ba2c <__swbuf_r+0x20> + +01f4bb3c <__swbuf>: + 1f4bb3c: e59f300c ldr r3, [pc, #12] ; 1f4bb50 <__swbuf+0x14> + 1f4bb40: e1a02001 mov r2, r1 + 1f4bb44: e1a01000 mov r1, r0 + 1f4bb48: e5930000 ldr r0, [r3] + 1f4bb4c: eaffffae b 1f4ba0c <__swbuf_r> + 1f4bb50: 01f65c08 .word 0x01f65c08 + +01f4bb54 <_wcrtomb_r>: + 1f4bb54: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f4bb58: e2516000 subs r6, r1, #0 + 1f4bb5c: e24dd018 sub sp, sp, #24 + 1f4bb60: e1a04000 mov r4, r0 + 1f4bb64: e1a05003 mov r5, r3 + 1f4bb68: 0a000012 beq 1f4bbb8 <_wcrtomb_r+0x64> + 1f4bb6c: e59f3070 ldr r3, [pc, #112] ; 1f4bbe4 <_wcrtomb_r+0x90> + 1f4bb70: e1a07002 mov r7, r2 + 1f4bb74: e5938000 ldr r8, [r3] + 1f4bb78: ebffee11 bl 1f473c4 <__locale_charset> + 1f4bb7c: e58d5000 str r5, [sp] + 1f4bb80: e1a03000 mov r3, r0 + 1f4bb84: e1a02007 mov r2, r7 + 1f4bb88: e1a01006 mov r1, r6 + 1f4bb8c: e1a00004 mov r0, r4 + 1f4bb90: e1a0e00f mov lr, pc + 1f4bb94: e12fff18 bx r8 + 1f4bb98: e3700001 cmn r0, #1 + 1f4bb9c: 03a02000 moveq r2, #0 + 1f4bba0: 03a0308a moveq r3, #138 ; 0x8a + 1f4bba4: 05852000 streq r2, [r5] + 1f4bba8: 05843000 streq r3, [r4] + 1f4bbac: e28dd018 add sp, sp, #24 + 1f4bbb0: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f4bbb4: e12fff1e bx lr + 1f4bbb8: e59f3024 ldr r3, [pc, #36] ; 1f4bbe4 <_wcrtomb_r+0x90> + 1f4bbbc: e5937000 ldr r7, [r3] + 1f4bbc0: ebffedff bl 1f473c4 <__locale_charset> + 1f4bbc4: e58d5000 str r5, [sp] + 1f4bbc8: e1a03000 mov r3, r0 + 1f4bbcc: e1a02006 mov r2, r6 + 1f4bbd0: e28d100c add r1, sp, #12 + 1f4bbd4: e1a00004 mov r0, r4 + 1f4bbd8: e1a0e00f mov lr, pc + 1f4bbdc: e12fff17 bx r7 + 1f4bbe0: eaffffec b 1f4bb98 <_wcrtomb_r+0x44> + 1f4bbe4: 01f65c88 .word 0x01f65c88 + +01f4bbe8 : + 1f4bbe8: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f4bbec: e59f3088 ldr r3, [pc, #136] ; 1f4bc7c + 1f4bbf0: e2506000 subs r6, r0, #0 + 1f4bbf4: e24dd018 sub sp, sp, #24 + 1f4bbf8: e1a05002 mov r5, r2 + 1f4bbfc: e5934000 ldr r4, [r3] + 1f4bc00: 0a000012 beq 1f4bc50 + 1f4bc04: e59f3074 ldr r3, [pc, #116] ; 1f4bc80 + 1f4bc08: e1a07001 mov r7, r1 + 1f4bc0c: e5938000 ldr r8, [r3] + 1f4bc10: ebffedeb bl 1f473c4 <__locale_charset> + 1f4bc14: e58d5000 str r5, [sp] + 1f4bc18: e1a03000 mov r3, r0 + 1f4bc1c: e1a02007 mov r2, r7 + 1f4bc20: e1a01006 mov r1, r6 + 1f4bc24: e1a00004 mov r0, r4 + 1f4bc28: e1a0e00f mov lr, pc + 1f4bc2c: e12fff18 bx r8 + 1f4bc30: e3700001 cmn r0, #1 + 1f4bc34: 03a02000 moveq r2, #0 + 1f4bc38: 03a0308a moveq r3, #138 ; 0x8a + 1f4bc3c: 05852000 streq r2, [r5] + 1f4bc40: 05843000 streq r3, [r4] + 1f4bc44: e28dd018 add sp, sp, #24 + 1f4bc48: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f4bc4c: e12fff1e bx lr + 1f4bc50: e59f3028 ldr r3, [pc, #40] ; 1f4bc80 + 1f4bc54: e5937000 ldr r7, [r3] + 1f4bc58: ebffedd9 bl 1f473c4 <__locale_charset> + 1f4bc5c: e58d5000 str r5, [sp] + 1f4bc60: e1a03000 mov r3, r0 + 1f4bc64: e1a02006 mov r2, r6 + 1f4bc68: e28d100c add r1, sp, #12 + 1f4bc6c: e1a00004 mov r0, r4 + 1f4bc70: e1a0e00f mov lr, pc + 1f4bc74: e12fff17 bx r7 + 1f4bc78: eaffffec b 1f4bc30 + 1f4bc7c: 01f65c08 .word 0x01f65c08 + 1f4bc80: 01f65c88 .word 0x01f65c88 + +01f4bc84 <__ascii_wctomb>: + 1f4bc84: e3510000 cmp r1, #0 + 1f4bc88: 0a000005 beq 1f4bca4 <__ascii_wctomb+0x20> + 1f4bc8c: e35200ff cmp r2, #255 ; 0xff + 1f4bc90: 83a0308a movhi r3, #138 ; 0x8a + 1f4bc94: 95c12000 strbls r2, [r1] + 1f4bc98: 83e01000 mvnhi r1, #0 + 1f4bc9c: 93a01001 movls r1, #1 + 1f4bca0: 85803000 strhi r3, [r0] + 1f4bca4: e1a00001 mov r0, r1 + 1f4bca8: e12fff1e bx lr + +01f4bcac <_wctomb_r>: + 1f4bcac: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f4bcb0: e59fc040 ldr ip, [pc, #64] ; 1f4bcf8 <_wctomb_r+0x4c> + 1f4bcb4: e24dd008 sub sp, sp, #8 + 1f4bcb8: e1a08003 mov r8, r3 + 1f4bcbc: e1a05000 mov r5, r0 + 1f4bcc0: e1a06001 mov r6, r1 + 1f4bcc4: e1a07002 mov r7, r2 + 1f4bcc8: e59c4000 ldr r4, [ip] + 1f4bccc: ebffedbc bl 1f473c4 <__locale_charset> + 1f4bcd0: e58d8000 str r8, [sp] + 1f4bcd4: e1a03000 mov r3, r0 + 1f4bcd8: e1a02007 mov r2, r7 + 1f4bcdc: e1a01006 mov r1, r6 + 1f4bce0: e1a00005 mov r0, r5 + 1f4bce4: e1a0e00f mov lr, pc + 1f4bce8: e12fff14 bx r4 + 1f4bcec: e28dd008 add sp, sp, #8 + 1f4bcf0: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f4bcf4: e12fff1e bx lr + 1f4bcf8: 01f65c88 .word 0x01f65c88 + +01f4bcfc <__aeabi_uidiv>: + 1f4bcfc: e2512001 subs r2, r1, #1 + 1f4bd00: 012fff1e bxeq lr + 1f4bd04: 3a000036 bcc 1f4bde4 <__aeabi_uidiv+0xe8> + 1f4bd08: e1500001 cmp r0, r1 + 1f4bd0c: 9a000022 bls 1f4bd9c <__aeabi_uidiv+0xa0> + 1f4bd10: e1110002 tst r1, r2 + 1f4bd14: 0a000023 beq 1f4bda8 <__aeabi_uidiv+0xac> + 1f4bd18: e311020e tst r1, #-536870912 ; 0xe0000000 + 1f4bd1c: 01a01181 lsleq r1, r1, #3 + 1f4bd20: 03a03008 moveq r3, #8 + 1f4bd24: 13a03001 movne r3, #1 + 1f4bd28: e3510201 cmp r1, #268435456 ; 0x10000000 + 1f4bd2c: 31510000 cmpcc r1, r0 + 1f4bd30: 31a01201 lslcc r1, r1, #4 + 1f4bd34: 31a03203 lslcc r3, r3, #4 + 1f4bd38: 3afffffa bcc 1f4bd28 <__aeabi_uidiv+0x2c> + 1f4bd3c: e3510102 cmp r1, #-2147483648 ; 0x80000000 + 1f4bd40: 31510000 cmpcc r1, r0 + 1f4bd44: 31a01081 lslcc r1, r1, #1 + 1f4bd48: 31a03083 lslcc r3, r3, #1 + 1f4bd4c: 3afffffa bcc 1f4bd3c <__aeabi_uidiv+0x40> + 1f4bd50: e3a02000 mov r2, #0 + 1f4bd54: e1500001 cmp r0, r1 + 1f4bd58: 20400001 subcs r0, r0, r1 + 1f4bd5c: 21822003 orrcs r2, r2, r3 + 1f4bd60: e15000a1 cmp r0, r1, lsr #1 + 1f4bd64: 204000a1 subcs r0, r0, r1, lsr #1 + 1f4bd68: 218220a3 orrcs r2, r2, r3, lsr #1 + 1f4bd6c: e1500121 cmp r0, r1, lsr #2 + 1f4bd70: 20400121 subcs r0, r0, r1, lsr #2 + 1f4bd74: 21822123 orrcs r2, r2, r3, lsr #2 + 1f4bd78: e15001a1 cmp r0, r1, lsr #3 + 1f4bd7c: 204001a1 subcs r0, r0, r1, lsr #3 + 1f4bd80: 218221a3 orrcs r2, r2, r3, lsr #3 + 1f4bd84: e3500000 cmp r0, #0 + 1f4bd88: 11b03223 lsrsne r3, r3, #4 + 1f4bd8c: 11a01221 lsrne r1, r1, #4 + 1f4bd90: 1affffef bne 1f4bd54 <__aeabi_uidiv+0x58> + 1f4bd94: e1a00002 mov r0, r2 + 1f4bd98: e12fff1e bx lr + 1f4bd9c: 03a00001 moveq r0, #1 + 1f4bda0: 13a00000 movne r0, #0 + 1f4bda4: e12fff1e bx lr + 1f4bda8: e3510801 cmp r1, #65536 ; 0x10000 + 1f4bdac: 21a01821 lsrcs r1, r1, #16 + 1f4bdb0: 23a02010 movcs r2, #16 + 1f4bdb4: 33a02000 movcc r2, #0 + 1f4bdb8: e3510c01 cmp r1, #256 ; 0x100 + 1f4bdbc: 21a01421 lsrcs r1, r1, #8 + 1f4bdc0: 22822008 addcs r2, r2, #8 + 1f4bdc4: e3510010 cmp r1, #16 + 1f4bdc8: 21a01221 lsrcs r1, r1, #4 + 1f4bdcc: 22822004 addcs r2, r2, #4 + 1f4bdd0: e3510004 cmp r1, #4 + 1f4bdd4: 82822003 addhi r2, r2, #3 + 1f4bdd8: 908220a1 addls r2, r2, r1, lsr #1 + 1f4bddc: e1a00230 lsr r0, r0, r2 + 1f4bde0: e12fff1e bx lr + 1f4bde4: e3500000 cmp r0, #0 + 1f4bde8: 13e00000 mvnne r0, #0 + 1f4bdec: ea000059 b 1f4bf58 <__aeabi_idiv0> + +01f4bdf0 <__aeabi_uidivmod>: + 1f4bdf0: e3510000 cmp r1, #0 + 1f4bdf4: 0afffffa beq 1f4bde4 <__aeabi_uidiv+0xe8> + 1f4bdf8: e92d4003 push {r0, r1, lr} + 1f4bdfc: ebffffbe bl 1f4bcfc <__aeabi_uidiv> + 1f4be00: e8bd4006 pop {r1, r2, lr} + 1f4be04: e0030092 mul r3, r2, r0 + 1f4be08: e0411003 sub r1, r1, r3 + 1f4be0c: e12fff1e bx lr + +01f4be10 <__aeabi_idiv>: + 1f4be10: e3510000 cmp r1, #0 + 1f4be14: 0a000043 beq 1f4bf28 <.divsi3_skip_div0_test+0x110> + +01f4be18 <.divsi3_skip_div0_test>: + 1f4be18: e020c001 eor ip, r0, r1 + 1f4be1c: 42611000 rsbmi r1, r1, #0 + 1f4be20: e2512001 subs r2, r1, #1 + 1f4be24: 0a000027 beq 1f4bec8 <.divsi3_skip_div0_test+0xb0> + 1f4be28: e1b03000 movs r3, r0 + 1f4be2c: 42603000 rsbmi r3, r0, #0 + 1f4be30: e1530001 cmp r3, r1 + 1f4be34: 9a000026 bls 1f4bed4 <.divsi3_skip_div0_test+0xbc> + 1f4be38: e1110002 tst r1, r2 + 1f4be3c: 0a000028 beq 1f4bee4 <.divsi3_skip_div0_test+0xcc> + 1f4be40: e311020e tst r1, #-536870912 ; 0xe0000000 + 1f4be44: 01a01181 lsleq r1, r1, #3 + 1f4be48: 03a02008 moveq r2, #8 + 1f4be4c: 13a02001 movne r2, #1 + 1f4be50: e3510201 cmp r1, #268435456 ; 0x10000000 + 1f4be54: 31510003 cmpcc r1, r3 + 1f4be58: 31a01201 lslcc r1, r1, #4 + 1f4be5c: 31a02202 lslcc r2, r2, #4 + 1f4be60: 3afffffa bcc 1f4be50 <.divsi3_skip_div0_test+0x38> + 1f4be64: e3510102 cmp r1, #-2147483648 ; 0x80000000 + 1f4be68: 31510003 cmpcc r1, r3 + 1f4be6c: 31a01081 lslcc r1, r1, #1 + 1f4be70: 31a02082 lslcc r2, r2, #1 + 1f4be74: 3afffffa bcc 1f4be64 <.divsi3_skip_div0_test+0x4c> + 1f4be78: e3a00000 mov r0, #0 + 1f4be7c: e1530001 cmp r3, r1 + 1f4be80: 20433001 subcs r3, r3, r1 + 1f4be84: 21800002 orrcs r0, r0, r2 + 1f4be88: e15300a1 cmp r3, r1, lsr #1 + 1f4be8c: 204330a1 subcs r3, r3, r1, lsr #1 + 1f4be90: 218000a2 orrcs r0, r0, r2, lsr #1 + 1f4be94: e1530121 cmp r3, r1, lsr #2 + 1f4be98: 20433121 subcs r3, r3, r1, lsr #2 + 1f4be9c: 21800122 orrcs r0, r0, r2, lsr #2 + 1f4bea0: e15301a1 cmp r3, r1, lsr #3 + 1f4bea4: 204331a1 subcs r3, r3, r1, lsr #3 + 1f4bea8: 218001a2 orrcs r0, r0, r2, lsr #3 + 1f4beac: e3530000 cmp r3, #0 + 1f4beb0: 11b02222 lsrsne r2, r2, #4 + 1f4beb4: 11a01221 lsrne r1, r1, #4 + 1f4beb8: 1affffef bne 1f4be7c <.divsi3_skip_div0_test+0x64> + 1f4bebc: e35c0000 cmp ip, #0 + 1f4bec0: 42600000 rsbmi r0, r0, #0 + 1f4bec4: e12fff1e bx lr + 1f4bec8: e13c0000 teq ip, r0 + 1f4becc: 42600000 rsbmi r0, r0, #0 + 1f4bed0: e12fff1e bx lr + 1f4bed4: 33a00000 movcc r0, #0 + 1f4bed8: 01a00fcc asreq r0, ip, #31 + 1f4bedc: 03800001 orreq r0, r0, #1 + 1f4bee0: e12fff1e bx lr + 1f4bee4: e3510801 cmp r1, #65536 ; 0x10000 + 1f4bee8: 21a01821 lsrcs r1, r1, #16 + 1f4beec: 23a02010 movcs r2, #16 + 1f4bef0: 33a02000 movcc r2, #0 + 1f4bef4: e3510c01 cmp r1, #256 ; 0x100 + 1f4bef8: 21a01421 lsrcs r1, r1, #8 + 1f4befc: 22822008 addcs r2, r2, #8 + 1f4bf00: e3510010 cmp r1, #16 + 1f4bf04: 21a01221 lsrcs r1, r1, #4 + 1f4bf08: 22822004 addcs r2, r2, #4 + 1f4bf0c: e3510004 cmp r1, #4 + 1f4bf10: 82822003 addhi r2, r2, #3 + 1f4bf14: 908220a1 addls r2, r2, r1, lsr #1 + 1f4bf18: e35c0000 cmp ip, #0 + 1f4bf1c: e1a00233 lsr r0, r3, r2 + 1f4bf20: 42600000 rsbmi r0, r0, #0 + 1f4bf24: e12fff1e bx lr + 1f4bf28: e3500000 cmp r0, #0 + 1f4bf2c: c3e00102 mvngt r0, #-2147483648 ; 0x80000000 + 1f4bf30: b3a00102 movlt r0, #-2147483648 ; 0x80000000 + 1f4bf34: ea000007 b 1f4bf58 <__aeabi_idiv0> + +01f4bf38 <__aeabi_idivmod>: + 1f4bf38: e3510000 cmp r1, #0 + 1f4bf3c: 0afffff9 beq 1f4bf28 <.divsi3_skip_div0_test+0x110> + 1f4bf40: e92d4003 push {r0, r1, lr} + 1f4bf44: ebffffb3 bl 1f4be18 <.divsi3_skip_div0_test> + 1f4bf48: e8bd4006 pop {r1, r2, lr} + 1f4bf4c: e0030092 mul r3, r2, r0 + 1f4bf50: e0411003 sub r1, r1, r3 + 1f4bf54: e12fff1e bx lr + +01f4bf58 <__aeabi_idiv0>: + 1f4bf58: e12fff1e bx lr + +01f4bf5c <__aeabi_uldivmod>: + 1f4bf5c: e3530000 cmp r3, #0 + 1f4bf60: 03520000 cmpeq r2, #0 + 1f4bf64: 1a000004 bne 1f4bf7c <__aeabi_uldivmod+0x20> + 1f4bf68: e3510000 cmp r1, #0 + 1f4bf6c: 03500000 cmpeq r0, #0 + 1f4bf70: 13e01000 mvnne r1, #0 + 1f4bf74: 13e00000 mvnne r0, #0 + 1f4bf78: eafffff6 b 1f4bf58 <__aeabi_idiv0> + 1f4bf7c: e24dd008 sub sp, sp, #8 + 1f4bf80: e92d6000 push {sp, lr} + 1f4bf84: eb000003 bl 1f4bf98 <__udivmoddi4> + 1f4bf88: e59de004 ldr lr, [sp, #4] + 1f4bf8c: e28dd008 add sp, sp, #8 + 1f4bf90: e8bd000c pop {r2, r3} + 1f4bf94: e12fff1e bx lr + +01f4bf98 <__udivmoddi4>: + 1f4bf98: e1510003 cmp r1, r3 + 1f4bf9c: e92d4ff8 push {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f4bfa0: 01500002 cmpeq r0, r2 + 1f4bfa4: e1a04000 mov r4, r0 + 1f4bfa8: e1a05001 mov r5, r1 + 1f4bfac: e59da028 ldr sl, [sp, #40] ; 0x28 + 1f4bfb0: 33a00000 movcc r0, #0 + 1f4bfb4: 33a01000 movcc r1, #0 + 1f4bfb8: 3a00003d bcc 1f4c0b4 <__udivmoddi4+0x11c> + 1f4bfbc: e1a01003 mov r1, r3 + 1f4bfc0: e1a00002 mov r0, r2 + 1f4bfc4: e1a08002 mov r8, r2 + 1f4bfc8: e1a09003 mov r9, r3 + 1f4bfcc: eb00003c bl 1f4c0c4 <__clzdi2> + 1f4bfd0: e1a01005 mov r1, r5 + 1f4bfd4: e1a0b000 mov fp, r0 + 1f4bfd8: e1a00004 mov r0, r4 + 1f4bfdc: eb000038 bl 1f4c0c4 <__clzdi2> + 1f4bfe0: e060300b rsb r3, r0, fp + 1f4bfe4: e2432020 sub r2, r3, #32 + 1f4bfe8: e1a07319 lsl r7, r9, r3 + 1f4bfec: e1877218 orr r7, r7, r8, lsl r2 + 1f4bff0: e263c020 rsb ip, r3, #32 + 1f4bff4: e1877c38 orr r7, r7, r8, lsr ip + 1f4bff8: e1550007 cmp r5, r7 + 1f4bffc: e1a06318 lsl r6, r8, r3 + 1f4c000: 01540006 cmpeq r4, r6 + 1f4c004: 33a00000 movcc r0, #0 + 1f4c008: 33a01000 movcc r1, #0 + 1f4c00c: 3a000005 bcc 1f4c028 <__udivmoddi4+0x90> + 1f4c010: e3a0e001 mov lr, #1 + 1f4c014: e0544006 subs r4, r4, r6 + 1f4c018: e1a0121e lsl r1, lr, r2 + 1f4c01c: e1811c3e orr r1, r1, lr, lsr ip + 1f4c020: e0c55007 sbc r5, r5, r7 + 1f4c024: e1a0031e lsl r0, lr, r3 + 1f4c028: e3530000 cmp r3, #0 + 1f4c02c: 0a000020 beq 1f4c0b4 <__udivmoddi4+0x11c> + 1f4c030: e1b070a7 lsrs r7, r7, #1 + 1f4c034: e1a06066 rrx r6, r6 + 1f4c038: e1a0e003 mov lr, r3 + 1f4c03c: ea000007 b 1f4c060 <__udivmoddi4+0xc8> + 1f4c040: e0544006 subs r4, r4, r6 + 1f4c044: e0c55007 sbc r5, r5, r7 + 1f4c048: e0944004 adds r4, r4, r4 + 1f4c04c: e0a55005 adc r5, r5, r5 + 1f4c050: e2944001 adds r4, r4, #1 + 1f4c054: e2a55000 adc r5, r5, #0 + 1f4c058: e25ee001 subs lr, lr, #1 + 1f4c05c: 0a000006 beq 1f4c07c <__udivmoddi4+0xe4> + 1f4c060: e1550007 cmp r5, r7 + 1f4c064: 01540006 cmpeq r4, r6 + 1f4c068: 2afffff4 bcs 1f4c040 <__udivmoddi4+0xa8> + 1f4c06c: e0944004 adds r4, r4, r4 + 1f4c070: e0a55005 adc r5, r5, r5 + 1f4c074: e25ee001 subs lr, lr, #1 + 1f4c078: 1afffff8 bne 1f4c060 <__udivmoddi4+0xc8> + 1f4c07c: e1a0e334 lsr lr, r4, r3 + 1f4c080: e18eec15 orr lr, lr, r5, lsl ip + 1f4c084: e18ee235 orr lr, lr, r5, lsr r2 + 1f4c088: e0906004 adds r6, r0, r4 + 1f4c08c: e1a0400e mov r4, lr + 1f4c090: e0a17005 adc r7, r1, r5 + 1f4c094: e1a01335 lsr r1, r5, r3 + 1f4c098: e1a05001 mov r5, r1 + 1f4c09c: e1a01311 lsl r1, r1, r3 + 1f4c0a0: e181121e orr r1, r1, lr, lsl r2 + 1f4c0a4: e1a0031e lsl r0, lr, r3 + 1f4c0a8: e1811c3e orr r1, r1, lr, lsr ip + 1f4c0ac: e0560000 subs r0, r6, r0 + 1f4c0b0: e0c71001 sbc r1, r7, r1 + 1f4c0b4: e35a0000 cmp sl, #0 + 1f4c0b8: 188a0030 stmne sl, {r4, r5} + 1f4c0bc: e8bd4ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f4c0c0: e12fff1e bx lr + +01f4c0c4 <__clzdi2>: + 1f4c0c4: e92d4010 push {r4, lr} + 1f4c0c8: e3510000 cmp r1, #0 + 1f4c0cc: 1a000002 bne 1f4c0dc <__clzdi2+0x18> + 1f4c0d0: eb000005 bl 1f4c0ec <__clzsi2> + 1f4c0d4: e2800020 add r0, r0, #32 + 1f4c0d8: ea000001 b 1f4c0e4 <__clzdi2+0x20> + 1f4c0dc: e1a00001 mov r0, r1 + 1f4c0e0: eb000001 bl 1f4c0ec <__clzsi2> + 1f4c0e4: e8bd4010 pop {r4, lr} + 1f4c0e8: e12fff1e bx lr + +01f4c0ec <__clzsi2>: + 1f4c0ec: e3a0101c mov r1, #28 + 1f4c0f0: e3500801 cmp r0, #65536 ; 0x10000 + 1f4c0f4: 21a00820 lsrcs r0, r0, #16 + 1f4c0f8: 22411010 subcs r1, r1, #16 + 1f4c0fc: e3500c01 cmp r0, #256 ; 0x100 + 1f4c100: 21a00420 lsrcs r0, r0, #8 + 1f4c104: 22411008 subcs r1, r1, #8 + 1f4c108: e3500010 cmp r0, #16 + 1f4c10c: 21a00220 lsrcs r0, r0, #4 + 1f4c110: 22411004 subcs r1, r1, #4 + 1f4c114: e28f2008 add r2, pc, #8 + 1f4c118: e7d20000 ldrb r0, [r2, r0] + 1f4c11c: e0800001 add r0, r0, r1 + 1f4c120: e12fff1e bx lr + 1f4c124: 02020304 .word 0x02020304 + 1f4c128: 01010101 .word 0x01010101 + ... + +01f4c134 : + 1f4c134: e92d43f0 push {r4, r5, r6, r7, r8, r9, lr} + 1f4c138: e30c45fc movw r4, #50684 ; 0xc5fc + 1f4c13c: e340420d movt r4, #525 ; 0x20d + 1f4c140: e24dd014 sub sp, sp, #20 + 1f4c144: e3a0008c mov r0, #140 ; 0x8c + 1f4c148: ebffc906 bl 1f3e568 + 1f4c14c: e3a06000 mov r6, #0 + 1f4c150: e5840000 str r0, [r4] + 1f4c154: eb000df1 bl 1f4f920 + 1f4c158: e5940000 ldr r0, [r4] + 1f4c15c: e2800004 add r0, r0, #4 + 1f4c160: eb0001dd bl 1f4c8dc + 1f4c164: e5943000 ldr r3, [r4] + 1f4c168: e2830004 add r0, r3, #4 + 1f4c16c: e5836070 str r6, [r3, #112] ; 0x70 + 1f4c170: e5836074 str r6, [r3, #116] ; 0x74 + 1f4c174: eb000397 bl 1f4cfd8 + 1f4c178: e2507000 subs r7, r0, #0 + 1f4c17c: 0a000060 beq 1f4c304 + 1f4c180: e5945000 ldr r5, [r4] + 1f4c184: eb000e2b bl 1f4fa38 + 1f4c188: e1a02006 mov r2, r6 + 1f4c18c: e3031218 movw r1, #12824 ; 0x3218 + 1f4c190: e34011f6 movt r1, #502 ; 0x1f6 + 1f4c194: eb000e12 bl 1f4f9e4 + 1f4c198: e5948000 ldr r8, [r4] + 1f4c19c: e5850058 str r0, [r5, #88] ; 0x58 + 1f4c1a0: e1a05006 mov r5, r6 + 1f4c1a4: eb000e23 bl 1f4fa38 + 1f4c1a8: e1a02006 mov r2, r6 + 1f4c1ac: e3031220 movw r1, #12832 ; 0x3220 + 1f4c1b0: e34011f6 movt r1, #502 ; 0x1f6 + 1f4c1b4: eb000e0a bl 1f4f9e4 + 1f4c1b8: e5947000 ldr r7, [r4] + 1f4c1bc: e588005c str r0, [r8, #92] ; 0x5c + 1f4c1c0: eb000e1c bl 1f4fa38 + 1f4c1c4: e1a02006 mov r2, r6 + 1f4c1c8: e3031228 movw r1, #12840 ; 0x3228 + 1f4c1cc: e34011f6 movt r1, #502 ; 0x1f6 + 1f4c1d0: eb000e03 bl 1f4f9e4 + 1f4c1d4: e5870088 str r0, [r7, #136] ; 0x88 + 1f4c1d8: e2857001 add r7, r5, #1 + 1f4c1dc: e28d0004 add r0, sp, #4 + 1f4c1e0: eb00156c bl 1f51798 + 1f4c1e4: e1a02007 mov r2, r7 + 1f4c1e8: e28d0004 add r0, sp, #4 + 1f4c1ec: e3031230 movw r1, #12848 ; 0x3230 + 1f4c1f0: e34011f6 movt r1, #502 ; 0x1f6 + 1f4c1f4: eb001960 bl 1f5277c + 1f4c1f8: e5948000 ldr r8, [r4] + 1f4c1fc: eb000e0d bl 1f4fa38 + 1f4c200: e1a09000 mov r9, r0 + 1f4c204: e28d0004 add r0, sp, #4 + 1f4c208: e30c65fc movw r6, #50684 ; 0xc5fc + 1f4c20c: e340620d movt r6, #525 ; 0x20d + 1f4c210: eb00157b bl 1f51804 + 1f4c214: e3a02001 mov r2, #1 + 1f4c218: e1a01000 mov r1, r0 + 1f4c21c: e1a00009 mov r0, r9 + 1f4c220: eb000def bl 1f4f9e4 + 1f4c224: e2853018 add r3, r5, #24 + 1f4c228: e1a05007 mov r5, r7 + 1f4c22c: e7880103 str r0, [r8, r3, lsl #2] + 1f4c230: e28d0004 add r0, sp, #4 + 1f4c234: eb001568 bl 1f517dc <_String> + 1f4c238: e3570004 cmp r7, #4 + 1f4c23c: 1affffe5 bne 1f4c1d8 + 1f4c240: e5967000 ldr r7, [r6] + 1f4c244: eb000dfb bl 1f4fa38 + 1f4c248: e3a02000 mov r2, #0 + 1f4c24c: e3031238 movw r1, #12856 ; 0x3238 + 1f4c250: e34011f6 movt r1, #502 ; 0x1f6 + 1f4c254: e1a05002 mov r5, r2 + 1f4c258: eb000de1 bl 1f4f9e4 + 1f4c25c: e5966000 ldr r6, [r6] + 1f4c260: e5870070 str r0, [r7, #112] ; 0x70 + 1f4c264: eb000df3 bl 1f4fa38 + 1f4c268: e3031240 movw r1, #12864 ; 0x3240 + 1f4c26c: e34011f6 movt r1, #502 ; 0x1f6 + 1f4c270: e1a02005 mov r2, r5 + 1f4c274: eb000dda bl 1f4f9e4 + 1f4c278: e5860074 str r0, [r6, #116] ; 0x74 + 1f4c27c: e2856001 add r6, r5, #1 + 1f4c280: e28d0004 add r0, sp, #4 + 1f4c284: eb001543 bl 1f51798 + 1f4c288: e1a02006 mov r2, r6 + 1f4c28c: e28d0004 add r0, sp, #4 + 1f4c290: e3031248 movw r1, #12872 ; 0x3248 + 1f4c294: e34011f6 movt r1, #502 ; 0x1f6 + 1f4c298: eb001937 bl 1f5277c + 1f4c29c: e5947000 ldr r7, [r4] + 1f4c2a0: eb000de4 bl 1f4fa38 + 1f4c2a4: e1a08000 mov r8, r0 + 1f4c2a8: e28d0004 add r0, sp, #4 + 1f4c2ac: eb001554 bl 1f51804 + 1f4c2b0: e3a02000 mov r2, #0 + 1f4c2b4: e1a01000 mov r1, r0 + 1f4c2b8: e1a00008 mov r0, r8 + 1f4c2bc: eb000dc8 bl 1f4f9e4 + 1f4c2c0: e285301e add r3, r5, #30 + 1f4c2c4: e1a05006 mov r5, r6 + 1f4c2c8: e7870103 str r0, [r7, r3, lsl #2] + 1f4c2cc: e28d0004 add r0, sp, #4 + 1f4c2d0: eb001541 bl 1f517dc <_String> + 1f4c2d4: e3560004 cmp r6, #4 + 1f4c2d8: 1affffe7 bne 1f4c27c + 1f4c2dc: e3a07001 mov r7, #1 + 1f4c2e0: e1a01006 mov r1, r6 + 1f4c2e4: e3032250 movw r2, #12880 ; 0x3250 + 1f4c2e8: e34021f6 movt r2, #502 ; 0x1f6 + 1f4c2ec: e30301e0 movw r0, #12768 ; 0x31e0 + 1f4c2f0: e34001f6 movt r0, #502 ; 0x1f6 + 1f4c2f4: ebfed3e3 bl 1f01288 + 1f4c2f8: e1a00007 mov r0, r7 + 1f4c2fc: e28dd014 add sp, sp, #20 + 1f4c300: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f4c304: e3a01001 mov r1, #1 + 1f4c308: e30321e8 movw r2, #12776 ; 0x31e8 + 1f4c30c: e34021f6 movt r2, #502 ; 0x1f6 + 1f4c310: e30301e0 movw r0, #12768 ; 0x31e0 + 1f4c314: e34001f6 movt r0, #502 ; 0x1f6 + 1f4c318: ebfed3da bl 1f01288 + 1f4c31c: e5940000 ldr r0, [r4] + 1f4c320: e2800004 add r0, r0, #4 + 1f4c324: eb000186 bl 1f4c944 <_DWHCIDevice> + 1f4c328: e5940000 ldr r0, [r4] + 1f4c32c: eb000d81 bl 1f4f938 <_DeviceNameService> + 1f4c330: e5940000 ldr r0, [r4] + 1f4c334: ebffc893 bl 1f3e588 + 1f4c338: e1a00007 mov r0, r7 + 1f4c33c: e5847000 str r7, [r4] + 1f4c340: e28dd014 add sp, sp, #20 + 1f4c344: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + +01f4c348 : + 1f4c348: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c34c: e340320d movt r3, #525 ; 0x20d + 1f4c350: e5933000 ldr r3, [r3] + 1f4c354: e5930058 ldr r0, [r3, #88] ; 0x58 + 1f4c358: e2900000 adds r0, r0, #0 + 1f4c35c: 13a00001 movne r0, #1 + 1f4c360: e12fff1e bx lr + +01f4c364 : + 1f4c364: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c368: e340320d movt r3, #525 ; 0x20d + 1f4c36c: e1a01000 mov r1, r0 + 1f4c370: e5933000 ldr r3, [r3] + 1f4c374: e5930058 ldr r0, [r3, #88] ; 0x58 + 1f4c378: ea0021ec b 1f54b30 + +01f4c37c : + 1f4c37c: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c380: e340320d movt r3, #525 ; 0x20d + 1f4c384: e1a01000 mov r1, r0 + 1f4c388: e5933000 ldr r3, [r3] + 1f4c38c: e5930058 ldr r0, [r3, #88] ; 0x58 + 1f4c390: ea0021ea b 1f54b40 + +01f4c394 : + 1f4c394: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c398: e340320d movt r3, #525 ; 0x20d + 1f4c39c: e1a01000 mov r1, r0 + 1f4c3a0: e5933000 ldr r3, [r3] + 1f4c3a4: e5930058 ldr r0, [r3, #88] ; 0x58 + 1f4c3a8: ea0021e6 b 1f54b48 + +01f4c3ac : + 1f4c3ac: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c3b0: e340320d movt r3, #525 ; 0x20d + 1f4c3b4: e5933000 ldr r3, [r3] + 1f4c3b8: e593005c ldr r0, [r3, #92] ; 0x5c + 1f4c3bc: e2900000 adds r0, r0, #0 + 1f4c3c0: 13a00001 movne r0, #1 + 1f4c3c4: e12fff1e bx lr + +01f4c3c8 : + 1f4c3c8: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c3cc: e340320d movt r3, #525 ; 0x20d + 1f4c3d0: e1a01000 mov r1, r0 + 1f4c3d4: e5933000 ldr r3, [r3] + 1f4c3d8: e593005c ldr r0, [r3, #92] ; 0x5c + 1f4c3dc: ea002365 b 1f55178 + +01f4c3e0 : + 1f4c3e0: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c3e4: e340320d movt r3, #525 ; 0x20d + 1f4c3e8: e5933000 ldr r3, [r3] + 1f4c3ec: e5930060 ldr r0, [r3, #96] ; 0x60 + 1f4c3f0: e3500000 cmp r0, #0 + 1f4c3f4: 012fff1e bxeq lr + 1f4c3f8: e5932064 ldr r2, [r3, #100] ; 0x64 + 1f4c3fc: e3520000 cmp r2, #0 + 1f4c400: 0a000007 beq 1f4c424 + 1f4c404: e5932068 ldr r2, [r3, #104] ; 0x68 + 1f4c408: e3520000 cmp r2, #0 + 1f4c40c: 0a000006 beq 1f4c42c + 1f4c410: e593306c ldr r3, [r3, #108] ; 0x6c + 1f4c414: e3530000 cmp r3, #0 + 1f4c418: 0a000005 beq 1f4c434 + 1f4c41c: e3a00004 mov r0, #4 + 1f4c420: e12fff1e bx lr + 1f4c424: e3a00001 mov r0, #1 + 1f4c428: e12fff1e bx lr + 1f4c42c: e3a00002 mov r0, #2 + 1f4c430: e12fff1e bx lr + 1f4c434: e3a00003 mov r0, #3 + 1f4c438: e12fff1e bx lr + +01f4c43c : + 1f4c43c: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f4c440: e59dc020 ldr ip, [sp, #32] + 1f4c444: e35c0003 cmp ip, #3 + 1f4c448: 8a000016 bhi 1f4c4a8 + 1f4c44c: e30c75fc movw r7, #50684 ; 0xc5fc + 1f4c450: e340720d movt r7, #525 ; 0x20d + 1f4c454: e1a09001 mov r9, r1 + 1f4c458: e28c6018 add r6, ip, #24 + 1f4c45c: e1a08000 mov r8, r0 + 1f4c460: e5971000 ldr r1, [r7] + 1f4c464: e7910106 ldr r0, [r1, r6, lsl #2] + 1f4c468: e3500000 cmp r0, #0 + 1f4c46c: 0a00000d beq 1f4c4a8 + 1f4c470: e1a05003 mov r5, r3 + 1f4c474: e1a04002 mov r4, r2 + 1f4c478: e1a03009 mov r3, r9 + 1f4c47c: e1a02008 mov r2, r8 + 1f4c480: eb001b1e bl 1f53100 + 1f4c484: e1590001 cmp r9, r1 + 1f4c488: 01580000 cmpeq r8, r0 + 1f4c48c: 1a000005 bne 1f4c4a8 + 1f4c490: e5973000 ldr r3, [r7] + 1f4c494: e1a02005 mov r2, r5 + 1f4c498: e1a01004 mov r1, r4 + 1f4c49c: e7930106 ldr r0, [r3, r6, lsl #2] + 1f4c4a0: e8bd47f0 pop {r4, r5, r6, r7, r8, r9, sl, lr} + 1f4c4a4: ea001e0f b 1f53ce8 + 1f4c4a8: e3e00000 mvn r0, #0 + 1f4c4ac: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + +01f4c4b0 : + 1f4c4b0: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f4c4b4: e59dc020 ldr ip, [sp, #32] + 1f4c4b8: e35c0003 cmp ip, #3 + 1f4c4bc: 8a000016 bhi 1f4c51c + 1f4c4c0: e30c75fc movw r7, #50684 ; 0xc5fc + 1f4c4c4: e340720d movt r7, #525 ; 0x20d + 1f4c4c8: e1a09001 mov r9, r1 + 1f4c4cc: e28c6018 add r6, ip, #24 + 1f4c4d0: e1a08000 mov r8, r0 + 1f4c4d4: e5971000 ldr r1, [r7] + 1f4c4d8: e7910106 ldr r0, [r1, r6, lsl #2] + 1f4c4dc: e3500000 cmp r0, #0 + 1f4c4e0: 0a00000d beq 1f4c51c + 1f4c4e4: e1a05003 mov r5, r3 + 1f4c4e8: e1a04002 mov r4, r2 + 1f4c4ec: e1a03009 mov r3, r9 + 1f4c4f0: e1a02008 mov r2, r8 + 1f4c4f4: eb001b01 bl 1f53100 + 1f4c4f8: e1590001 cmp r9, r1 + 1f4c4fc: 01580000 cmpeq r8, r0 + 1f4c500: 1a000005 bne 1f4c51c + 1f4c504: e5973000 ldr r3, [r7] + 1f4c508: e1a02005 mov r2, r5 + 1f4c50c: e1a01004 mov r1, r4 + 1f4c510: e7930106 ldr r0, [r3, r6, lsl #2] + 1f4c514: e8bd47f0 pop {r4, r5, r6, r7, r8, r9, sl, lr} + 1f4c518: ea001e9b b 1f53f8c + 1f4c51c: e3e00000 mvn r0, #0 + 1f4c520: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + +01f4c524 : + 1f4c524: e3500003 cmp r0, #3 + 1f4c528: 8a000007 bhi 1f4c54c + 1f4c52c: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c530: e340320d movt r3, #525 ; 0x20d + 1f4c534: e2800018 add r0, r0, #24 + 1f4c538: e5933000 ldr r3, [r3] + 1f4c53c: e7930100 ldr r0, [r3, r0, lsl #2] + 1f4c540: e3500000 cmp r0, #0 + 1f4c544: 0a000000 beq 1f4c54c + 1f4c548: ea001af0 b 1f53110 + 1f4c54c: e3a00000 mov r0, #0 + 1f4c550: e12fff1e bx lr + +01f4c554 : + 1f4c554: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c558: e340320d movt r3, #525 ; 0x20d + 1f4c55c: e5933000 ldr r3, [r3] + 1f4c560: e5932070 ldr r2, [r3, #112] ; 0x70 + 1f4c564: e3520000 cmp r2, #0 + 1f4c568: 0a000001 beq 1f4c574 + 1f4c56c: e3a00001 mov r0, #1 + 1f4c570: e12fff1e bx lr + 1f4c574: e5930074 ldr r0, [r3, #116] ; 0x74 + 1f4c578: e2900000 adds r0, r0, #0 + 1f4c57c: 13a00001 movne r0, #1 + 1f4c580: e12fff1e bx lr + +01f4c584 : + 1f4c584: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c588: e340320d movt r3, #525 ; 0x20d + 1f4c58c: e92d4010 push {r4, lr} + 1f4c590: e5933000 ldr r3, [r3] + 1f4c594: e1a04000 mov r4, r0 + 1f4c598: e5930074 ldr r0, [r3, #116] ; 0x74 + 1f4c59c: e3500000 cmp r0, #0 + 1f4c5a0: 0a000003 beq 1f4c5b4 + 1f4c5a4: eb000f36 bl 1f50284 + 1f4c5a8: e1a01004 mov r1, r4 + 1f4c5ac: e8bd4010 pop {r4, lr} + 1f4c5b0: ea000d4d b 1f4faec + 1f4c5b4: e5930070 ldr r0, [r3, #112] ; 0x70 + 1f4c5b8: eb000da3 bl 1f4fc4c + 1f4c5bc: e1a01004 mov r1, r4 + 1f4c5c0: e8bd4010 pop {r4, lr} + 1f4c5c4: ea000d48 b 1f4faec + +01f4c5c8 : + 1f4c5c8: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c5cc: e340320d movt r3, #525 ; 0x20d + 1f4c5d0: e1a02001 mov r2, r1 + 1f4c5d4: e1a01000 mov r1, r0 + 1f4c5d8: e92d4010 push {r4, lr} + 1f4c5dc: e593c000 ldr ip, [r3] + 1f4c5e0: e59c3074 ldr r3, [ip, #116] ; 0x74 + 1f4c5e4: e3530000 cmp r3, #0 + 1f4c5e8: 0a000004 beq 1f4c600 + 1f4c5ec: e1a00003 mov r0, r3 + 1f4c5f0: eb000f25 bl 1f5028c + 1f4c5f4: e2900000 adds r0, r0, #0 + 1f4c5f8: 13a00001 movne r0, #1 + 1f4c5fc: e8bd8010 pop {r4, pc} + 1f4c600: e59c0070 ldr r0, [ip, #112] ; 0x70 + 1f4c604: eb000d92 bl 1f4fc54 + 1f4c608: e2900000 adds r0, r0, #0 + 1f4c60c: 13a00001 movne r0, #1 + 1f4c610: e8bd8010 pop {r4, pc} + +01f4c614 : + 1f4c614: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c618: e340320d movt r3, #525 ; 0x20d + 1f4c61c: e1a02001 mov r2, r1 + 1f4c620: e1a01000 mov r1, r0 + 1f4c624: e92d4010 push {r4, lr} + 1f4c628: e593c000 ldr ip, [r3] + 1f4c62c: e59c3074 ldr r3, [ip, #116] ; 0x74 + 1f4c630: e3530000 cmp r3, #0 + 1f4c634: 0a000004 beq 1f4c64c + 1f4c638: e1a00003 mov r0, r3 + 1f4c63c: eb000f2a bl 1f502ec + 1f4c640: e2900000 adds r0, r0, #0 + 1f4c644: 13a00001 movne r0, #1 + 1f4c648: e8bd8010 pop {r4, pc} + 1f4c64c: e59c0070 ldr r0, [ip, #112] ; 0x70 + 1f4c650: eb000d96 bl 1f4fcb0 + 1f4c654: e2900000 adds r0, r0, #0 + 1f4c658: 13a00001 movne r0, #1 + 1f4c65c: e8bd8010 pop {r4, pc} + +01f4c660 : + 1f4c660: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c664: e340320d movt r3, #525 ; 0x20d + 1f4c668: e5933000 ldr r3, [r3] + 1f4c66c: e5930078 ldr r0, [r3, #120] ; 0x78 + 1f4c670: e3500000 cmp r0, #0 + 1f4c674: 012fff1e bxeq lr + 1f4c678: e593207c ldr r2, [r3, #124] ; 0x7c + 1f4c67c: e3520000 cmp r2, #0 + 1f4c680: 0a000007 beq 1f4c6a4 + 1f4c684: e5932080 ldr r2, [r3, #128] ; 0x80 + 1f4c688: e3520000 cmp r2, #0 + 1f4c68c: 0a000006 beq 1f4c6ac + 1f4c690: e5933084 ldr r3, [r3, #132] ; 0x84 + 1f4c694: e3530000 cmp r3, #0 + 1f4c698: 0a000005 beq 1f4c6b4 + 1f4c69c: e3a00004 mov r0, #4 + 1f4c6a0: e12fff1e bx lr + 1f4c6a4: e3a00001 mov r0, #1 + 1f4c6a8: e12fff1e bx lr + 1f4c6ac: e3a00002 mov r0, #2 + 1f4c6b0: e12fff1e bx lr + 1f4c6b4: e3a00003 mov r0, #3 + 1f4c6b8: e12fff1e bx lr + +01f4c6bc : + 1f4c6bc: e92d4070 push {r4, r5, r6, lr} + 1f4c6c0: e30c55fc movw r5, #50684 ; 0xc5fc + 1f4c6c4: e340520d movt r5, #525 ; 0x20d + 1f4c6c8: e1a06000 mov r6, r0 + 1f4c6cc: e3a04000 mov r4, #0 + 1f4c6d0: e284301e add r3, r4, #30 + 1f4c6d4: e5952000 ldr r2, [r5] + 1f4c6d8: e1a01006 mov r1, r6 + 1f4c6dc: e2844001 add r4, r4, #1 + 1f4c6e0: e7920103 ldr r0, [r2, r3, lsl #2] + 1f4c6e4: e3500000 cmp r0, #0 + 1f4c6e8: 0a000000 beq 1f4c6f0 + 1f4c6ec: eb0026ca bl 1f5621c + 1f4c6f0: e3540004 cmp r4, #4 + 1f4c6f4: 1afffff5 bne 1f4c6d0 + 1f4c6f8: e8bd8070 pop {r4, r5, r6, pc} + +01f4c6fc : + 1f4c6fc: e3500003 cmp r0, #3 + 1f4c700: 8a00000c bhi 1f4c738 + 1f4c704: e92d4070 push {r4, r5, r6, lr} + 1f4c708: e30c55fc movw r5, #50684 ; 0xc5fc + 1f4c70c: e340520d movt r5, #525 ; 0x20d + 1f4c710: e280401e add r4, r0, #30 + 1f4c714: e5953000 ldr r3, [r5] + 1f4c718: e7930104 ldr r0, [r3, r4, lsl #2] + 1f4c71c: e3500000 cmp r0, #0 + 1f4c720: 08bd8070 popeq {r4, r5, r6, pc} + 1f4c724: eb0026be bl 1f56224 + 1f4c728: e5953000 ldr r3, [r5] + 1f4c72c: e7930104 ldr r0, [r3, r4, lsl #2] + 1f4c730: e2800048 add r0, r0, #72 ; 0x48 + 1f4c734: e8bd8070 pop {r4, r5, r6, pc} + 1f4c738: e3a00000 mov r0, #0 + 1f4c73c: e12fff1e bx lr + +01f4c740 : + 1f4c740: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c744: e340320d movt r3, #525 ; 0x20d + 1f4c748: e5933000 ldr r3, [r3] + 1f4c74c: e5930088 ldr r0, [r3, #136] ; 0x88 + 1f4c750: e2900000 adds r0, r0, #0 + 1f4c754: 13a00001 movne r0, #1 + 1f4c758: e12fff1e bx lr + +01f4c75c : + 1f4c75c: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c760: e340320d movt r3, #525 ; 0x20d + 1f4c764: e1a01000 mov r1, r0 + 1f4c768: e5933000 ldr r3, [r3] + 1f4c76c: e5930088 ldr r0, [r3, #136] ; 0x88 + 1f4c770: ea00297d b 1f56d6c + +01f4c774 : + 1f4c774: e2400001 sub r0, r0, #1 + 1f4c778: e92d4070 push {r4, r5, r6, lr} + 1f4c77c: e3500005 cmp r0, #5 + 1f4c780: 979ff100 ldrls pc, [pc, r0, lsl #2] + 1f4c784: ea000005 b 1f4c7a0 + 1f4c788: 01f4c830 .word 0x01f4c830 + 1f4c78c: 01f4c84c .word 0x01f4c84c + 1f4c790: 01f4c868 .word 0x01f4c868 + 1f4c794: 01f4c888 .word 0x01f4c888 + 1f4c798: 01f4c8b0 .word 0x01f4c8b0 + 1f4c79c: 01f4c7ac .word 0x01f4c7ac + 1f4c7a0: e3a05000 mov r5, #0 + 1f4c7a4: e1a00005 mov r0, r5 + 1f4c7a8: e8bd8070 pop {r4, r5, r6, pc} + 1f4c7ac: e3510000 cmp r1, #0 + 1f4c7b0: 1afffffa bne 1f4c7a0 + 1f4c7b4: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c7b8: e340320d movt r3, #525 ; 0x20d + 1f4c7bc: e5933000 ldr r3, [r3] + 1f4c7c0: e5935088 ldr r5, [r3, #136] ; 0x88 + 1f4c7c4: e3550000 cmp r5, #0 + 1f4c7c8: 0afffff5 beq 1f4c7a4 + 1f4c7cc: e1a00005 mov r0, r5 + 1f4c7d0: e1a04002 mov r4, r2 + 1f4c7d4: eb000b94 bl 1f4f62c + 1f4c7d8: e1a03000 mov r3, r0 + 1f4c7dc: e2850020 add r0, r5, #32 + 1f4c7e0: e5d31009 ldrb r1, [r3, #9] + 1f4c7e4: e5d32008 ldrb r2, [r3, #8] + 1f4c7e8: e1822401 orr r2, r2, r1, lsl #8 + 1f4c7ec: e1c420b0 strh r2, [r4] + 1f4c7f0: e5d3100b ldrb r1, [r3, #11] + 1f4c7f4: e5d3200a ldrb r2, [r3, #10] + 1f4c7f8: e1822401 orr r2, r2, r1, lsl #8 + 1f4c7fc: e1c420b2 strh r2, [r4, #2] + 1f4c800: e5d3200d ldrb r2, [r3, #13] + 1f4c804: e5d3300c ldrb r3, [r3, #12] + 1f4c808: e1833402 orr r3, r3, r2, lsl #8 + 1f4c80c: e1c430b4 strh r3, [r4, #4] + 1f4c810: eb00281a bl 1f56880 + 1f4c814: e5840008 str r0, [r4, #8] + 1f4c818: e285002c add r0, r5, #44 ; 0x2c + 1f4c81c: e3a05001 mov r5, #1 + 1f4c820: eb002816 bl 1f56880 + 1f4c824: e584000c str r0, [r4, #12] + 1f4c828: e1a00005 mov r0, r5 + 1f4c82c: e8bd8070 pop {r4, r5, r6, pc} + 1f4c830: e3510000 cmp r1, #0 + 1f4c834: 1affffd9 bne 1f4c7a0 + 1f4c838: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c83c: e340320d movt r3, #525 ; 0x20d + 1f4c840: e5933000 ldr r3, [r3] + 1f4c844: e5935058 ldr r5, [r3, #88] ; 0x58 + 1f4c848: eaffffdd b 1f4c7c4 + 1f4c84c: e3510000 cmp r1, #0 + 1f4c850: 1affffd2 bne 1f4c7a0 + 1f4c854: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c858: e340320d movt r3, #525 ; 0x20d + 1f4c85c: e5933000 ldr r3, [r3] + 1f4c860: e593505c ldr r5, [r3, #92] ; 0x5c + 1f4c864: eaffffd6 b 1f4c7c4 + 1f4c868: e3510003 cmp r1, #3 + 1f4c86c: 8affffcb bhi 1f4c7a0 + 1f4c870: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c874: e340320d movt r3, #525 ; 0x20d + 1f4c878: e2811018 add r1, r1, #24 + 1f4c87c: e5933000 ldr r3, [r3] + 1f4c880: e7935101 ldr r5, [r3, r1, lsl #2] + 1f4c884: eaffffce b 1f4c7c4 + 1f4c888: e3510000 cmp r1, #0 + 1f4c88c: 1affffc3 bne 1f4c7a0 + 1f4c890: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c894: e340320d movt r3, #525 ; 0x20d + 1f4c898: e5933000 ldr r3, [r3] + 1f4c89c: e5935074 ldr r5, [r3, #116] ; 0x74 + 1f4c8a0: e3550000 cmp r5, #0 + 1f4c8a4: 05935070 ldreq r5, [r3, #112] ; 0x70 + 1f4c8a8: 1affffc7 bne 1f4c7cc + 1f4c8ac: eaffffc4 b 1f4c7c4 + 1f4c8b0: e3510003 cmp r1, #3 + 1f4c8b4: 8affffb9 bhi 1f4c7a0 + 1f4c8b8: e30c35fc movw r3, #50684 ; 0xc5fc + 1f4c8bc: e340320d movt r3, #525 ; 0x20d + 1f4c8c0: e281101e add r1, r1, #30 + 1f4c8c4: e5933000 ldr r3, [r3] + 1f4c8c8: e7935101 ldr r5, [r3, r1, lsl #2] + 1f4c8cc: eaffffbc b 1f4c7c4 + +01f4c8d0 : + 1f4c8d0: e3a03000 mov r3, #0 + 1f4c8d4: e5823048 str r3, [r2, #72] ; 0x48 + 1f4c8d8: e12fff1e bx lr + +01f4c8dc : + 1f4c8dc: e92d4070 push {r4, r5, r6, lr} + 1f4c8e0: e1a04000 mov r4, r0 + 1f4c8e4: e3a05000 mov r5, #0 + 1f4c8e8: e1a01000 mov r1, r0 + 1f4c8ec: e280004c add r0, r0, #76 ; 0x4c + 1f4c8f0: e5845004 str r5, [r4, #4] + 1f4c8f4: e5845000 str r5, [r4] + 1f4c8f8: e5845048 str r5, [r4, #72] ; 0x48 + 1f4c8fc: eb002093 bl 1f54b50 + 1f4c900: e5845008 str r5, [r4, #8] + 1f4c904: e584500c str r5, [r4, #12] + 1f4c908: e5845010 str r5, [r4, #16] + 1f4c90c: e5845014 str r5, [r4, #20] + 1f4c910: e5845018 str r5, [r4, #24] + 1f4c914: e584501c str r5, [r4, #28] + 1f4c918: e5845020 str r5, [r4, #32] + 1f4c91c: e5845024 str r5, [r4, #36] ; 0x24 + 1f4c920: e5845028 str r5, [r4, #40] ; 0x28 + 1f4c924: e584502c str r5, [r4, #44] ; 0x2c + 1f4c928: e5845030 str r5, [r4, #48] ; 0x30 + 1f4c92c: e5845034 str r5, [r4, #52] ; 0x34 + 1f4c930: e5845038 str r5, [r4, #56] ; 0x38 + 1f4c934: e584503c str r5, [r4, #60] ; 0x3c + 1f4c938: e5845040 str r5, [r4, #64] ; 0x40 + 1f4c93c: e5845044 str r5, [r4, #68] ; 0x44 + 1f4c940: e8bd8070 pop {r4, r5, r6, pc} + +01f4c944 <_DWHCIDevice>: + 1f4c944: e280004c add r0, r0, #76 ; 0x4c + 1f4c948: ea002083 b 1f54b5c <_DWHCIRootPort> + +01f4c94c : + 1f4c94c: e92d4010 push {r4, lr} + 1f4c950: e3a02000 mov r2, #0 + 1f4c954: e3a01c0e mov r1, #3584 ; 0xe00 + 1f4c958: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4c95c: e24dd078 sub sp, sp, #120 ; 0x78 + 1f4c960: e1a0000d mov r0, sp + 1f4c964: eb000827 bl 1f4ea08 + 1f4c968: e1a0000d mov r0, sp + 1f4c96c: eb000833 bl 1f4ea40 + 1f4c970: e28d000c add r0, sp, #12 + 1f4c974: e3a01b01 mov r1, #1024 ; 0x400 + 1f4c978: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4c97c: eb00081d bl 1f4e9f8 + 1f4c980: e28d000c add r0, sp, #12 + 1f4c984: eb000826 bl 1f4ea24 + 1f4c988: e28d000c add r0, sp, #12 + 1f4c98c: e3e01003 mvn r1, #3 + 1f4c990: eb000839 bl 1f4ea7c + 1f4c994: e28d0018 add r0, sp, #24 + 1f4c998: e3a01048 mov r1, #72 ; 0x48 + 1f4c99c: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4c9a0: eb000814 bl 1f4e9f8 + 1f4c9a4: e28d0024 add r0, sp, #36 ; 0x24 + 1f4c9a8: e3a0100c mov r1, #12 + 1f4c9ac: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4c9b0: eb000810 bl 1f4e9f8 + 1f4c9b4: e28d0018 add r0, sp, #24 + 1f4c9b8: eb000819 bl 1f4ea24 + 1f4c9bc: e7e10350 ubfx r0, r0, #6, #2 + 1f4c9c0: e3500002 cmp r0, #2 + 1f4c9c4: 0a000098 beq 1f4cc2c + 1f4c9c8: e3a01000 mov r1, #0 + 1f4c9cc: e28d000c add r0, sp, #12 + 1f4c9d0: eb00082d bl 1f4ea8c + 1f4c9d4: e28d000c add r0, sp, #12 + 1f4c9d8: e3a0400a mov r4, #10 + 1f4c9dc: eb000817 bl 1f4ea40 + 1f4c9e0: e3a02b01 mov r2, #1024 ; 0x400 + 1f4c9e4: e28d0030 add r0, sp, #48 ; 0x30 + 1f4c9e8: e3a01024 mov r1, #36 ; 0x24 + 1f4c9ec: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4c9f0: eb000804 bl 1f4ea08 + 1f4c9f4: e28d0030 add r0, sp, #48 ; 0x30 + 1f4c9f8: eb000810 bl 1f4ea40 + 1f4c9fc: e3a02000 mov r2, #0 + 1f4ca00: e28d003c add r0, sp, #60 ; 0x3c + 1f4ca04: e3a01028 mov r1, #40 ; 0x28 + 1f4ca08: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4ca0c: eb0007fd bl 1f4ea08 + 1f4ca10: e28d003c add r0, sp, #60 ; 0x3c + 1f4ca14: e3a01b01 mov r1, #1024 ; 0x400 + 1f4ca18: eb00081b bl 1f4ea8c + 1f4ca1c: e3a01301 mov r1, #67108864 ; 0x4000000 + 1f4ca20: e28d003c add r0, sp, #60 ; 0x3c + 1f4ca24: eb000818 bl 1f4ea8c + 1f4ca28: e28d003c add r0, sp, #60 ; 0x3c + 1f4ca2c: eb000803 bl 1f4ea40 + 1f4ca30: e3a02000 mov r2, #0 + 1f4ca34: e28d0048 add r0, sp, #72 ; 0x48 + 1f4ca38: e3a01c01 mov r1, #256 ; 0x100 + 1f4ca3c: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4ca40: eb0007f0 bl 1f4ea08 + 1f4ca44: e28d0048 add r0, sp, #72 ; 0x48 + 1f4ca48: e3a01b02 mov r1, #2048 ; 0x800 + 1f4ca4c: eb00080e bl 1f4ea8c + 1f4ca50: e3a01301 mov r1, #67108864 ; 0x4000000 + 1f4ca54: e28d0048 add r0, sp, #72 ; 0x48 + 1f4ca58: eb00080b bl 1f4ea8c + 1f4ca5c: e28d0048 add r0, sp, #72 ; 0x48 + 1f4ca60: eb0007f6 bl 1f4ea40 + 1f4ca64: e3a02000 mov r2, #0 + 1f4ca68: e28d006c add r0, sp, #108 ; 0x6c + 1f4ca6c: e3a01010 mov r1, #16 + 1f4ca70: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4ca74: eb0007e3 bl 1f4ea08 + 1f4ca78: e28d006c add r0, sp, #108 ; 0x6c + 1f4ca7c: e3a01020 mov r1, #32 + 1f4ca80: eb000801 bl 1f4ea8c + 1f4ca84: e28d006c add r0, sp, #108 ; 0x6c + 1f4ca88: e3e01d1f mvn r1, #1984 ; 0x7c0 + 1f4ca8c: eb0007fa bl 1f4ea7c + 1f4ca90: e28d006c add r0, sp, #108 ; 0x6c + 1f4ca94: e3a01b01 mov r1, #1024 ; 0x400 + 1f4ca98: eb0007fb bl 1f4ea8c + 1f4ca9c: e28d006c add r0, sp, #108 ; 0x6c + 1f4caa0: eb0007e6 bl 1f4ea40 + 1f4caa4: e28d006c add r0, sp, #108 ; 0x6c + 1f4caa8: eb0007dd bl 1f4ea24 + 1f4caac: e3100020 tst r0, #32 + 1f4cab0: e3a00001 mov r0, #1 + 1f4cab4: 1a000054 bne 1f4cc0c + 1f4cab8: ebfed22f bl 1f0137c + 1f4cabc: e28d006c add r0, sp, #108 ; 0x6c + 1f4cac0: e3a0400a mov r4, #10 + 1f4cac4: eb0007d3 bl 1f4ea18 <_DWHCIRegister> + 1f4cac8: e3a02000 mov r2, #0 + 1f4cacc: e28d006c add r0, sp, #108 ; 0x6c + 1f4cad0: e3a01010 mov r1, #16 + 1f4cad4: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4cad8: eb0007ca bl 1f4ea08 + 1f4cadc: e28d006c add r0, sp, #108 ; 0x6c + 1f4cae0: e3a01010 mov r1, #16 + 1f4cae4: eb0007e8 bl 1f4ea8c + 1f4cae8: e28d006c add r0, sp, #108 ; 0x6c + 1f4caec: eb0007d3 bl 1f4ea40 + 1f4caf0: e28d006c add r0, sp, #108 ; 0x6c + 1f4caf4: eb0007ca bl 1f4ea24 + 1f4caf8: e3100010 tst r0, #16 + 1f4cafc: e3a00001 mov r0, #1 + 1f4cb00: 1a000045 bne 1f4cc1c + 1f4cb04: ebfed21c bl 1f0137c + 1f4cb08: e28d006c add r0, sp, #108 ; 0x6c + 1f4cb0c: eb0007c1 bl 1f4ea18 <_DWHCIRegister> + 1f4cb10: e28d0054 add r0, sp, #84 ; 0x54 + 1f4cb14: e3a01d11 mov r1, #1088 ; 0x440 + 1f4cb18: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4cb1c: eb0007b5 bl 1f4e9f8 + 1f4cb20: e28d0054 add r0, sp, #84 ; 0x54 + 1f4cb24: eb0007be bl 1f4ea24 + 1f4cb28: e28d0054 add r0, sp, #84 ; 0x54 + 1f4cb2c: e3e0102e mvn r1, #46 ; 0x2e + 1f4cb30: eb0007d1 bl 1f4ea7c + 1f4cb34: e28d0054 add r0, sp, #84 ; 0x54 + 1f4cb38: eb0007c4 bl 1f4ea50 + 1f4cb3c: e3100a01 tst r0, #4096 ; 0x1000 + 1f4cb40: 1a000004 bne 1f4cb58 + 1f4cb44: e28d0054 add r0, sp, #84 ; 0x54 + 1f4cb48: e3a01a01 mov r1, #4096 ; 0x1000 + 1f4cb4c: eb0007ce bl 1f4ea8c + 1f4cb50: e28d0054 add r0, sp, #84 ; 0x54 + 1f4cb54: eb0007b9 bl 1f4ea40 + 1f4cb58: e3a02000 mov r2, #0 + 1f4cb5c: e28d0060 add r0, sp, #96 ; 0x60 + 1f4cb60: e3a01018 mov r1, #24 + 1f4cb64: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4cb68: eb0007a6 bl 1f4ea08 + 1f4cb6c: e28d0060 add r0, sp, #96 ; 0x60 + 1f4cb70: eb0007b2 bl 1f4ea40 + 1f4cb74: e28d006c add r0, sp, #108 ; 0x6c + 1f4cb78: e3a01014 mov r1, #20 + 1f4cb7c: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4cb80: eb00079c bl 1f4e9f8 + 1f4cb84: e28d006c add r0, sp, #108 ; 0x6c + 1f4cb88: eb0007d2 bl 1f4ead8 + 1f4cb8c: e28d006c add r0, sp, #108 ; 0x6c + 1f4cb90: eb0007aa bl 1f4ea40 + 1f4cb94: e28d006c add r0, sp, #108 ; 0x6c + 1f4cb98: eb00079e bl 1f4ea18 <_DWHCIRegister> + 1f4cb9c: e28d0060 add r0, sp, #96 ; 0x60 + 1f4cba0: eb00079f bl 1f4ea24 + 1f4cba4: e3a01402 mov r1, #33554432 ; 0x2000000 + 1f4cba8: e28d0060 add r0, sp, #96 ; 0x60 + 1f4cbac: eb0007b6 bl 1f4ea8c + 1f4cbb0: e28d0060 add r0, sp, #96 ; 0x60 + 1f4cbb4: eb0007a1 bl 1f4ea40 + 1f4cbb8: e28d0060 add r0, sp, #96 ; 0x60 + 1f4cbbc: eb000795 bl 1f4ea18 <_DWHCIRegister> + 1f4cbc0: e28d0054 add r0, sp, #84 ; 0x54 + 1f4cbc4: eb000793 bl 1f4ea18 <_DWHCIRegister> + 1f4cbc8: e28d0048 add r0, sp, #72 ; 0x48 + 1f4cbcc: eb000791 bl 1f4ea18 <_DWHCIRegister> + 1f4cbd0: e28d003c add r0, sp, #60 ; 0x3c + 1f4cbd4: eb00078f bl 1f4ea18 <_DWHCIRegister> + 1f4cbd8: e28d0030 add r0, sp, #48 ; 0x30 + 1f4cbdc: eb00078d bl 1f4ea18 <_DWHCIRegister> + 1f4cbe0: e28d0024 add r0, sp, #36 ; 0x24 + 1f4cbe4: eb00078b bl 1f4ea18 <_DWHCIRegister> + 1f4cbe8: e28d0018 add r0, sp, #24 + 1f4cbec: eb000789 bl 1f4ea18 <_DWHCIRegister> + 1f4cbf0: e28d000c add r0, sp, #12 + 1f4cbf4: eb000787 bl 1f4ea18 <_DWHCIRegister> + 1f4cbf8: e1a0000d mov r0, sp + 1f4cbfc: eb000785 bl 1f4ea18 <_DWHCIRegister> + 1f4cc00: e3a00001 mov r0, #1 + 1f4cc04: e28dd078 add sp, sp, #120 ; 0x78 + 1f4cc08: e8bd8010 pop {r4, pc} + 1f4cc0c: ebfed1e7 bl 1f013b0 + 1f4cc10: e2544001 subs r4, r4, #1 + 1f4cc14: 1affffa2 bne 1f4caa4 + 1f4cc18: eaffffa7 b 1f4cabc + 1f4cc1c: ebfed1e3 bl 1f013b0 + 1f4cc20: e2544001 subs r4, r4, #1 + 1f4cc24: 1affffb1 bne 1f4caf0 + 1f4cc28: eaffffb6 b 1f4cb08 + 1f4cc2c: e28d0018 add r0, sp, #24 + 1f4cc30: eb000786 bl 1f4ea50 + 1f4cc34: e7e14450 ubfx r4, r0, #8, #2 + 1f4cc38: e3540001 cmp r4, #1 + 1f4cc3c: 1affff61 bne 1f4c9c8 + 1f4cc40: e28d0024 add r0, sp, #36 ; 0x24 + 1f4cc44: eb000776 bl 1f4ea24 + 1f4cc48: e3100802 tst r0, #131072 ; 0x20000 + 1f4cc4c: 0affff5d beq 1f4c9c8 + 1f4cc50: e1a01004 mov r1, r4 + 1f4cc54: e28d000c add r0, sp, #12 + 1f4cc58: eb00078b bl 1f4ea8c + 1f4cc5c: eaffff5c b 1f4c9d4 + +01f4cc60 : + 1f4cc60: e92d4010 push {r4, lr} + 1f4cc64: e3a01d11 mov r1, #1088 ; 0x440 + 1f4cc68: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4cc6c: e24dd010 sub sp, sp, #16 + 1f4cc70: e3a04014 mov r4, #20 + 1f4cc74: e28d0004 add r0, sp, #4 + 1f4cc78: eb00075e bl 1f4e9f8 + 1f4cc7c: e28d0004 add r0, sp, #4 + 1f4cc80: eb000767 bl 1f4ea24 + 1f4cc84: e3100001 tst r0, #1 + 1f4cc88: 0a00001e beq 1f4cd08 + 1f4cc8c: e3a00064 mov r0, #100 ; 0x64 + 1f4cc90: ebfed1c6 bl 1f013b0 + 1f4cc94: e28d0004 add r0, sp, #4 + 1f4cc98: eb000761 bl 1f4ea24 + 1f4cc9c: e28d0004 add r0, sp, #4 + 1f4cca0: e3e0102e mvn r1, #46 ; 0x2e + 1f4cca4: eb000774 bl 1f4ea7c + 1f4cca8: e3a01c01 mov r1, #256 ; 0x100 + 1f4ccac: e28d0004 add r0, sp, #4 + 1f4ccb0: eb000775 bl 1f4ea8c + 1f4ccb4: e28d0004 add r0, sp, #4 + 1f4ccb8: eb000760 bl 1f4ea40 + 1f4ccbc: e3a00032 mov r0, #50 ; 0x32 + 1f4ccc0: ebfed1ba bl 1f013b0 + 1f4ccc4: e28d0004 add r0, sp, #4 + 1f4ccc8: eb000755 bl 1f4ea24 + 1f4cccc: e28d0004 add r0, sp, #4 + 1f4ccd0: e3e0102e mvn r1, #46 ; 0x2e + 1f4ccd4: eb000768 bl 1f4ea7c + 1f4ccd8: e3e01c01 mvn r1, #256 ; 0x100 + 1f4ccdc: e28d0004 add r0, sp, #4 + 1f4cce0: eb000765 bl 1f4ea7c + 1f4cce4: e28d0004 add r0, sp, #4 + 1f4cce8: eb000754 bl 1f4ea40 + 1f4ccec: e3a00014 mov r0, #20 + 1f4ccf0: ebfed1ae bl 1f013b0 + 1f4ccf4: e28d0004 add r0, sp, #4 + 1f4ccf8: eb000746 bl 1f4ea18 <_DWHCIRegister> + 1f4ccfc: e3a00001 mov r0, #1 + 1f4cd00: e28dd010 add sp, sp, #16 + 1f4cd04: e8bd8010 pop {r4, pc} + 1f4cd08: e3a00001 mov r0, #1 + 1f4cd0c: ebfed1a7 bl 1f013b0 + 1f4cd10: e2544001 subs r4, r4, #1 + 1f4cd14: 1affffd8 bne 1f4cc7c + 1f4cd18: e28d0004 add r0, sp, #4 + 1f4cd1c: eb00073d bl 1f4ea18 <_DWHCIRegister> + 1f4cd20: e1a00004 mov r0, r4 + 1f4cd24: e28dd010 add sp, sp, #16 + 1f4cd28: e8bd8010 pop {r4, pc} + +01f4cd2c : + 1f4cd2c: e92d4010 push {r4, lr} + 1f4cd30: e3a01010 mov r1, #16 + 1f4cd34: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4cd38: e24dd010 sub sp, sp, #16 + 1f4cd3c: e3a02000 mov r2, #0 + 1f4cd40: e28d0004 add r0, sp, #4 + 1f4cd44: e3a04064 mov r4, #100 ; 0x64 + 1f4cd48: eb00072e bl 1f4ea08 + 1f4cd4c: e28d0004 add r0, sp, #4 + 1f4cd50: eb000733 bl 1f4ea24 + 1f4cd54: e3500000 cmp r0, #0 + 1f4cd58: aa000011 bge 1f4cda4 + 1f4cd5c: e28d0004 add r0, sp, #4 + 1f4cd60: e3a01001 mov r1, #1 + 1f4cd64: eb000748 bl 1f4ea8c + 1f4cd68: e28d0004 add r0, sp, #4 + 1f4cd6c: e3a0400a mov r4, #10 + 1f4cd70: eb000732 bl 1f4ea40 + 1f4cd74: e28d0004 add r0, sp, #4 + 1f4cd78: eb000729 bl 1f4ea24 + 1f4cd7c: e3100001 tst r0, #1 + 1f4cd80: e3a00001 mov r0, #1 + 1f4cd84: 1a00000f bne 1f4cdc8 + 1f4cd88: e3a00064 mov r0, #100 ; 0x64 + 1f4cd8c: ebfed187 bl 1f013b0 + 1f4cd90: e28d0004 add r0, sp, #4 + 1f4cd94: eb00071f bl 1f4ea18 <_DWHCIRegister> + 1f4cd98: e3a00001 mov r0, #1 + 1f4cd9c: e28dd010 add sp, sp, #16 + 1f4cda0: e8bd8010 pop {r4, pc} + 1f4cda4: e3a00001 mov r0, #1 + 1f4cda8: ebfed180 bl 1f013b0 + 1f4cdac: e2544001 subs r4, r4, #1 + 1f4cdb0: 1affffe5 bne 1f4cd4c + 1f4cdb4: e28d0004 add r0, sp, #4 + 1f4cdb8: eb000716 bl 1f4ea18 <_DWHCIRegister> + 1f4cdbc: e3a00000 mov r0, #0 + 1f4cdc0: e28dd010 add sp, sp, #16 + 1f4cdc4: e8bd8010 pop {r4, pc} + 1f4cdc8: ebfed178 bl 1f013b0 + 1f4cdcc: e2544001 subs r4, r4, #1 + 1f4cdd0: 1affffe7 bne 1f4cd74 + 1f4cdd4: e28d0004 add r0, sp, #4 + 1f4cdd8: eb00070e bl 1f4ea18 <_DWHCIRegister> + 1f4cddc: e3a00000 mov r0, #0 + 1f4cde0: eafffff6 b 1f4cdc0 + +01f4cde4 : + 1f4cde4: e92d4030 push {r4, r5, lr} + 1f4cde8: e3a0100c mov r1, #12 + 1f4cdec: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4cdf0: e24dd034 sub sp, sp, #52 ; 0x34 + 1f4cdf4: e1a05000 mov r5, r0 + 1f4cdf8: e1a0000d mov r0, sp + 1f4cdfc: eb0006fd bl 1f4e9f8 + 1f4ce00: e1a0000d mov r0, sp + 1f4ce04: eb000706 bl 1f4ea24 + 1f4ce08: e1a0000d mov r0, sp + 1f4ce0c: e3e01601 mvn r1, #1048576 ; 0x100000 + 1f4ce10: eb000719 bl 1f4ea7c + 1f4ce14: e3e01501 mvn r1, #4194304 ; 0x400000 + 1f4ce18: e1a0000d mov r0, sp + 1f4ce1c: eb000716 bl 1f4ea7c + 1f4ce20: e1a0000d mov r0, sp + 1f4ce24: eb000705 bl 1f4ea40 + 1f4ce28: e1a00005 mov r0, r5 + 1f4ce2c: ebffffbe bl 1f4cd2c + 1f4ce30: e2504000 subs r4, r0, #0 + 1f4ce34: 0a000052 beq 1f4cf84 + 1f4ce38: e1a0000d mov r0, sp + 1f4ce3c: eb0006f8 bl 1f4ea24 + 1f4ce40: e3e01010 mvn r1, #16 + 1f4ce44: e1a0000d mov r0, sp + 1f4ce48: eb00070b bl 1f4ea7c + 1f4ce4c: e3e01008 mvn r1, #8 + 1f4ce50: e1a0000d mov r0, sp + 1f4ce54: eb000708 bl 1f4ea7c + 1f4ce58: e1a0000d mov r0, sp + 1f4ce5c: eb0006f7 bl 1f4ea40 + 1f4ce60: e28d000c add r0, sp, #12 + 1f4ce64: e3a01048 mov r1, #72 ; 0x48 + 1f4ce68: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4ce6c: eb0006e1 bl 1f4e9f8 + 1f4ce70: e28d000c add r0, sp, #12 + 1f4ce74: eb0006ea bl 1f4ea24 + 1f4ce78: e1a0000d mov r0, sp + 1f4ce7c: eb0006e8 bl 1f4ea24 + 1f4ce80: e28d000c add r0, sp, #12 + 1f4ce84: eb0006f1 bl 1f4ea50 + 1f4ce88: e7e10350 ubfx r0, r0, #6, #2 + 1f4ce8c: e3500002 cmp r0, #2 + 1f4ce90: 0a000044 beq 1f4cfa8 + 1f4ce94: e3e01802 mvn r1, #131072 ; 0x20000 + 1f4ce98: e1a0000d mov r0, sp + 1f4ce9c: eb0006f6 bl 1f4ea7c + 1f4cea0: e3e01702 mvn r1, #524288 ; 0x80000 + 1f4cea4: e1a0000d mov r0, sp + 1f4cea8: eb0006f3 bl 1f4ea7c + 1f4ceac: e1a0000d mov r0, sp + 1f4ceb0: e3a04001 mov r4, #1 + 1f4ceb4: eb0006e1 bl 1f4ea40 + 1f4ceb8: e28d000c add r0, sp, #12 + 1f4cebc: eb0006e3 bl 1f4ea50 + 1f4cec0: e7e30750 ubfx r0, r0, #14, #4 + 1f4cec4: e2803001 add r3, r0, #1 + 1f4cec8: e3a01008 mov r1, #8 + 1f4cecc: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4ced0: e5853000 str r3, [r5] + 1f4ced4: e28d0018 add r0, sp, #24 + 1f4ced8: eb0006c6 bl 1f4e9f8 + 1f4cedc: e28d0018 add r0, sp, #24 + 1f4cee0: eb0006cf bl 1f4ea24 + 1f4cee4: e28d0018 add r0, sp, #24 + 1f4cee8: e3a01020 mov r1, #32 + 1f4ceec: eb0006e6 bl 1f4ea8c + 1f4cef0: e28d0018 add r0, sp, #24 + 1f4cef4: e3a01010 mov r1, #16 + 1f4cef8: eb0006e3 bl 1f4ea8c + 1f4cefc: e3e01006 mvn r1, #6 + 1f4cf00: e28d0018 add r0, sp, #24 + 1f4cf04: eb0006dc bl 1f4ea7c + 1f4cf08: e28d0018 add r0, sp, #24 + 1f4cf0c: eb0006cb bl 1f4ea40 + 1f4cf10: e1a0000d mov r0, sp + 1f4cf14: eb0006c2 bl 1f4ea24 + 1f4cf18: e1a0000d mov r0, sp + 1f4cf1c: e3e01c02 mvn r1, #512 ; 0x200 + 1f4cf20: eb0006d5 bl 1f4ea7c + 1f4cf24: e3e01c01 mvn r1, #256 ; 0x100 + 1f4cf28: e1a0000d mov r0, sp + 1f4cf2c: eb0006d2 bl 1f4ea7c + 1f4cf30: e1a0000d mov r0, sp + 1f4cf34: eb0006c1 bl 1f4ea40 + 1f4cf38: e28d0024 add r0, sp, #36 ; 0x24 + 1f4cf3c: e3a01014 mov r1, #20 + 1f4cf40: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4cf44: eb0006ab bl 1f4e9f8 + 1f4cf48: e28d0024 add r0, sp, #36 ; 0x24 + 1f4cf4c: eb0006e1 bl 1f4ead8 + 1f4cf50: e28d0024 add r0, sp, #36 ; 0x24 + 1f4cf54: eb0006b9 bl 1f4ea40 + 1f4cf58: e28d0024 add r0, sp, #36 ; 0x24 + 1f4cf5c: eb0006ad bl 1f4ea18 <_DWHCIRegister> + 1f4cf60: e28d0018 add r0, sp, #24 + 1f4cf64: eb0006ab bl 1f4ea18 <_DWHCIRegister> + 1f4cf68: e28d000c add r0, sp, #12 + 1f4cf6c: eb0006a9 bl 1f4ea18 <_DWHCIRegister> + 1f4cf70: e1a0000d mov r0, sp + 1f4cf74: eb0006a7 bl 1f4ea18 <_DWHCIRegister> + 1f4cf78: e1a00004 mov r0, r4 + 1f4cf7c: e28dd034 add sp, sp, #52 ; 0x34 + 1f4cf80: e8bd8030 pop {r4, r5, pc} + 1f4cf84: e3a01001 mov r1, #1 + 1f4cf88: e3032280 movw r2, #12928 ; 0x3280 + 1f4cf8c: e34021f6 movt r2, #502 ; 0x1f6 + 1f4cf90: e3030278 movw r0, #12920 ; 0x3278 + 1f4cf94: e34001f6 movt r0, #502 ; 0x1f6 + 1f4cf98: ebfed0ba bl 1f01288 + 1f4cf9c: e1a00004 mov r0, r4 + 1f4cfa0: e28dd034 add sp, sp, #52 ; 0x34 + 1f4cfa4: e8bd8030 pop {r4, r5, pc} + 1f4cfa8: e28d000c add r0, sp, #12 + 1f4cfac: eb0006a7 bl 1f4ea50 + 1f4cfb0: e7e10450 ubfx r0, r0, #8, #2 + 1f4cfb4: e3500001 cmp r0, #1 + 1f4cfb8: 1affffb5 bne 1f4ce94 + 1f4cfbc: e1a0000d mov r0, sp + 1f4cfc0: e3a01802 mov r1, #131072 ; 0x20000 + 1f4cfc4: eb0006b0 bl 1f4ea8c + 1f4cfc8: e3a01702 mov r1, #524288 ; 0x80000 + 1f4cfcc: e1a0000d mov r0, sp + 1f4cfd0: eb0006ad bl 1f4ea8c + 1f4cfd4: eaffffb4 b 1f4ceac + +01f4cfd8 : + 1f4cfd8: e92d4030 push {r4, r5, lr} + 1f4cfdc: e1a05000 mov r5, r0 + 1f4cfe0: e24dd02c sub sp, sp, #44 ; 0x2c + 1f4cfe4: f57ff05f dmb sy + 1f4cfe8: e3a01040 mov r1, #64 ; 0x40 + 1f4cfec: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4cff0: e28d0004 add r0, sp, #4 + 1f4cff4: eb00067f bl 1f4e9f8 + 1f4cff8: e28d0004 add r0, sp, #4 + 1f4cffc: eb000688 bl 1f4ea24 + 1f4d000: e302380a movw r3, #10250 ; 0x280a + 1f4d004: e3443f54 movt r3, #20308 ; 0x4f54 + 1f4d008: e1500003 cmp r0, r3 + 1f4d00c: 0a00000e beq 1f4d04c + 1f4d010: e28d0004 add r0, sp, #4 + 1f4d014: e3a04000 mov r4, #0 + 1f4d018: eb00068c bl 1f4ea50 + 1f4d01c: e3032290 movw r2, #12944 ; 0x3290 + 1f4d020: e34021f6 movt r2, #502 ; 0x1f6 + 1f4d024: e1a03000 mov r3, r0 + 1f4d028: e3a01001 mov r1, #1 + 1f4d02c: e3030278 movw r0, #12920 ; 0x3278 + 1f4d030: e34001f6 movt r0, #502 ; 0x1f6 + 1f4d034: ebfed093 bl 1f01288 + 1f4d038: e28d0004 add r0, sp, #4 + 1f4d03c: eb000675 bl 1f4ea18 <_DWHCIRegister> + 1f4d040: e1a00004 mov r0, r4 + 1f4d044: e28dd02c add sp, sp, #44 ; 0x2c + 1f4d048: e8bd8030 pop {r4, r5, pc} + 1f4d04c: e3a00003 mov r0, #3 + 1f4d050: ebfed0b4 bl 1f01328 + 1f4d054: e2504000 subs r4, r0, #0 + 1f4d058: 0a000042 beq 1f4d168 + 1f4d05c: e28d0010 add r0, sp, #16 + 1f4d060: e3a01008 mov r1, #8 + 1f4d064: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d068: eb000662 bl 1f4e9f8 + 1f4d06c: e28d0010 add r0, sp, #16 + 1f4d070: eb00066b bl 1f4ea24 + 1f4d074: e3e01001 mvn r1, #1 + 1f4d078: e28d0010 add r0, sp, #16 + 1f4d07c: eb00067e bl 1f4ea7c + 1f4d080: e28d0010 add r0, sp, #16 + 1f4d084: eb00066d bl 1f4ea40 + 1f4d088: e1a02005 mov r2, r5 + 1f4d08c: e3a00009 mov r0, #9 + 1f4d090: e30e172c movw r1, #59180 ; 0xe72c + 1f4d094: e34011f4 movt r1, #500 ; 0x1f4 + 1f4d098: ebfed0d5 bl 1f013f4 + 1f4d09c: e1a00005 mov r0, r5 + 1f4d0a0: ebffff4f bl 1f4cde4 + 1f4d0a4: e2504000 subs r4, r0, #0 + 1f4d0a8: 030322b8 movweq r2, #12984 ; 0x32b8 + 1f4d0ac: 034021f6 movteq r2, #502 ; 0x1f6 + 1f4d0b0: 0a000021 beq 1f4d13c + 1f4d0b4: e28d001c add r0, sp, #28 + 1f4d0b8: e3a01008 mov r1, #8 + 1f4d0bc: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d0c0: eb00064c bl 1f4e9f8 + 1f4d0c4: e28d001c add r0, sp, #28 + 1f4d0c8: eb000655 bl 1f4ea24 + 1f4d0cc: e3a01001 mov r1, #1 + 1f4d0d0: e28d001c add r0, sp, #28 + 1f4d0d4: eb00066c bl 1f4ea8c + 1f4d0d8: e28d001c add r0, sp, #28 + 1f4d0dc: eb000657 bl 1f4ea40 + 1f4d0e0: e28d001c add r0, sp, #28 + 1f4d0e4: eb00064b bl 1f4ea18 <_DWHCIRegister> + 1f4d0e8: e1a00005 mov r0, r5 + 1f4d0ec: ebfffe16 bl 1f4c94c + 1f4d0f0: e2504000 subs r4, r0, #0 + 1f4d0f4: 0a00000e beq 1f4d134 + 1f4d0f8: e1a00005 mov r0, r5 + 1f4d0fc: ebfffed7 bl 1f4cc60 + 1f4d100: e3500000 cmp r0, #0 + 1f4d104: 0a000029 beq 1f4d1b0 + 1f4d108: e285004c add r0, r5, #76 ; 0x4c + 1f4d10c: eb001e9f bl 1f54b90 + 1f4d110: e3500000 cmp r0, #0 + 1f4d114: 0a00001e beq 1f4d194 + 1f4d118: f57ff05f dmb sy + 1f4d11c: e28d0010 add r0, sp, #16 + 1f4d120: e3a04001 mov r4, #1 + 1f4d124: eb00063b bl 1f4ea18 <_DWHCIRegister> + 1f4d128: e28d0004 add r0, sp, #4 + 1f4d12c: eb000639 bl 1f4ea18 <_DWHCIRegister> + 1f4d130: eaffffc2 b 1f4d040 + 1f4d134: e30322d0 movw r2, #13008 ; 0x32d0 + 1f4d138: e34021f6 movt r2, #502 ; 0x1f6 + 1f4d13c: e3030278 movw r0, #12920 ; 0x3278 + 1f4d140: e34001f6 movt r0, #502 ; 0x1f6 + 1f4d144: e3a01001 mov r1, #1 + 1f4d148: ebfed04e bl 1f01288 + 1f4d14c: e28d0010 add r0, sp, #16 + 1f4d150: eb000630 bl 1f4ea18 <_DWHCIRegister> + 1f4d154: e28d0004 add r0, sp, #4 + 1f4d158: eb00062e bl 1f4ea18 <_DWHCIRegister> + 1f4d15c: e1a00004 mov r0, r4 + 1f4d160: e28dd02c add sp, sp, #44 ; 0x2c + 1f4d164: e8bd8030 pop {r4, r5, pc} + 1f4d168: e3a01001 mov r1, #1 + 1f4d16c: e30322a8 movw r2, #12968 ; 0x32a8 + 1f4d170: e34021f6 movt r2, #502 ; 0x1f6 + 1f4d174: e3030278 movw r0, #12920 ; 0x3278 + 1f4d178: e34001f6 movt r0, #502 ; 0x1f6 + 1f4d17c: ebfed041 bl 1f01288 + 1f4d180: e28d0004 add r0, sp, #4 + 1f4d184: eb000623 bl 1f4ea18 <_DWHCIRegister> + 1f4d188: e1a00004 mov r0, r4 + 1f4d18c: e28dd02c add sp, sp, #44 ; 0x2c + 1f4d190: e8bd8030 pop {r4, r5, pc} + 1f4d194: e303230c movw r2, #13068 ; 0x330c + 1f4d198: e34021f6 movt r2, #502 ; 0x1f6 + 1f4d19c: e3030278 movw r0, #12920 ; 0x3278 + 1f4d1a0: e34001f6 movt r0, #502 ; 0x1f6 + 1f4d1a4: e3a01002 mov r1, #2 + 1f4d1a8: e3a04001 mov r4, #1 + 1f4d1ac: eaffffe5 b 1f4d148 + 1f4d1b0: e30322e8 movw r2, #13032 ; 0x32e8 + 1f4d1b4: e34021f6 movt r2, #502 ; 0x1f6 + 1f4d1b8: e3030278 movw r0, #12920 ; 0x3278 + 1f4d1bc: e34001f6 movt r0, #502 ; 0x1f6 + 1f4d1c0: e3a01002 mov r1, #2 + 1f4d1c4: e3a04001 mov r4, #1 + 1f4d1c8: eaffffde b 1f4d148 + +01f4d1cc : + 1f4d1cc: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f4d1d0: e3a01008 mov r1, #8 + 1f4d1d4: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d1d8: e24dd014 sub sp, sp, #20 + 1f4d1dc: e28d0004 add r0, sp, #4 + 1f4d1e0: eb000604 bl 1f4e9f8 + 1f4d1e4: e28d0004 add r0, sp, #4 + 1f4d1e8: eb00060d bl 1f4ea24 + 1f4d1ec: e3a01001 mov r1, #1 + 1f4d1f0: e28d0004 add r0, sp, #4 + 1f4d1f4: eb000624 bl 1f4ea8c + 1f4d1f8: e28d0004 add r0, sp, #4 + 1f4d1fc: eb00060f bl 1f4ea40 + 1f4d200: e28d0004 add r0, sp, #4 + 1f4d204: eb000603 bl 1f4ea18 <_DWHCIRegister> + 1f4d208: e28dd014 add sp, sp, #20 + 1f4d20c: e49df004 pop {pc} ; (ldr pc, [sp], #4) + +01f4d210 : + 1f4d210: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f4d214: e3a01014 mov r1, #20 + 1f4d218: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d21c: e24dd014 sub sp, sp, #20 + 1f4d220: e28d0004 add r0, sp, #4 + 1f4d224: eb0005f3 bl 1f4e9f8 + 1f4d228: e28d0004 add r0, sp, #4 + 1f4d22c: eb000629 bl 1f4ead8 + 1f4d230: e28d0004 add r0, sp, #4 + 1f4d234: eb000601 bl 1f4ea40 + 1f4d238: e28d0004 add r0, sp, #4 + 1f4d23c: eb0005f5 bl 1f4ea18 <_DWHCIRegister> + 1f4d240: e28dd014 add sp, sp, #20 + 1f4d244: e49df004 pop {pc} ; (ldr pc, [sp], #4) + +01f4d248 : + 1f4d248: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f4d24c: e3a02000 mov r2, #0 + 1f4d250: e3a01018 mov r1, #24 + 1f4d254: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d258: e24dd01c sub sp, sp, #28 + 1f4d25c: e1a0000d mov r0, sp + 1f4d260: eb0005e8 bl 1f4ea08 + 1f4d264: e1a0000d mov r0, sp + 1f4d268: eb0005f4 bl 1f4ea40 + 1f4d26c: e28d000c add r0, sp, #12 + 1f4d270: e3a01014 mov r1, #20 + 1f4d274: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d278: eb0005de bl 1f4e9f8 + 1f4d27c: e28d000c add r0, sp, #12 + 1f4d280: eb000614 bl 1f4ead8 + 1f4d284: e28d000c add r0, sp, #12 + 1f4d288: eb0005ec bl 1f4ea40 + 1f4d28c: e28d000c add r0, sp, #12 + 1f4d290: eb0005e0 bl 1f4ea18 <_DWHCIRegister> + 1f4d294: e1a0000d mov r0, sp + 1f4d298: eb0005e1 bl 1f4ea24 + 1f4d29c: e3a01402 mov r1, #33554432 ; 0x2000000 + 1f4d2a0: e1a0000d mov r0, sp + 1f4d2a4: eb0005f8 bl 1f4ea8c + 1f4d2a8: e1a0000d mov r0, sp + 1f4d2ac: eb0005e3 bl 1f4ea40 + 1f4d2b0: e1a0000d mov r0, sp + 1f4d2b4: eb0005d7 bl 1f4ea18 <_DWHCIRegister> + 1f4d2b8: e28dd01c add sp, sp, #28 + 1f4d2bc: e49df004 pop {pc} ; (ldr pc, [sp], #4) + +01f4d2c0 : + 1f4d2c0: e92d4010 push {r4, lr} + 1f4d2c4: e1a04001 mov r4, r1 + 1f4d2c8: e3001418 movw r1, #1048 ; 0x418 + 1f4d2cc: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d2d0: e24dd010 sub sp, sp, #16 + 1f4d2d4: e28d0004 add r0, sp, #4 + 1f4d2d8: eb0005c6 bl 1f4e9f8 + 1f4d2dc: eb0023ec bl 1f56294 + 1f4d2e0: e28d0004 add r0, sp, #4 + 1f4d2e4: eb0005ce bl 1f4ea24 + 1f4d2e8: e3a01001 mov r1, #1 + 1f4d2ec: e28d0004 add r0, sp, #4 + 1f4d2f0: e1a01411 lsl r1, r1, r4 + 1f4d2f4: eb0005e4 bl 1f4ea8c + 1f4d2f8: e28d0004 add r0, sp, #4 + 1f4d2fc: eb0005cf bl 1f4ea40 + 1f4d300: eb0023f2 bl 1f562d0 + 1f4d304: e28d0004 add r0, sp, #4 + 1f4d308: eb0005c2 bl 1f4ea18 <_DWHCIRegister> + 1f4d30c: e28dd010 add sp, sp, #16 + 1f4d310: e8bd8010 pop {r4, pc} + +01f4d314 : + 1f4d314: e92d4010 push {r4, lr} + 1f4d318: e1a04001 mov r4, r1 + 1f4d31c: e3001418 movw r1, #1048 ; 0x418 + 1f4d320: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d324: e24dd010 sub sp, sp, #16 + 1f4d328: e28d0004 add r0, sp, #4 + 1f4d32c: eb0005b1 bl 1f4e9f8 + 1f4d330: eb0023d7 bl 1f56294 + 1f4d334: e28d0004 add r0, sp, #4 + 1f4d338: eb0005b9 bl 1f4ea24 + 1f4d33c: e3a01001 mov r1, #1 + 1f4d340: e28d0004 add r0, sp, #4 + 1f4d344: e1e01411 mvn r1, r1, lsl r4 + 1f4d348: eb0005cb bl 1f4ea7c + 1f4d34c: e28d0004 add r0, sp, #4 + 1f4d350: eb0005ba bl 1f4ea40 + 1f4d354: eb0023dd bl 1f562d0 + 1f4d358: e28d0004 add r0, sp, #4 + 1f4d35c: eb0005ad bl 1f4ea18 <_DWHCIRegister> + 1f4d360: e28dd010 add sp, sp, #16 + 1f4d364: e8bd8010 pop {r4, pc} + +01f4d368 : + 1f4d368: e92d4030 push {r4, r5, lr} + 1f4d36c: e3a02000 mov r2, #0 + 1f4d370: e1a05001 mov r5, r1 + 1f4d374: e24dd014 sub sp, sp, #20 + 1f4d378: e3a01010 mov r1, #16 + 1f4d37c: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d380: e28d0004 add r0, sp, #4 + 1f4d384: e3a0400a mov r4, #10 + 1f4d388: eb00059e bl 1f4ea08 + 1f4d38c: e28d0004 add r0, sp, #4 + 1f4d390: e3a01020 mov r1, #32 + 1f4d394: eb0005bc bl 1f4ea8c + 1f4d398: e28d0004 add r0, sp, #4 + 1f4d39c: e3e01d1f mvn r1, #1984 ; 0x7c0 + 1f4d3a0: eb0005b5 bl 1f4ea7c + 1f4d3a4: e28d0004 add r0, sp, #4 + 1f4d3a8: e1a01305 lsl r1, r5, #6 + 1f4d3ac: eb0005b6 bl 1f4ea8c + 1f4d3b0: e28d0004 add r0, sp, #4 + 1f4d3b4: eb0005a1 bl 1f4ea40 + 1f4d3b8: e28d0004 add r0, sp, #4 + 1f4d3bc: eb000598 bl 1f4ea24 + 1f4d3c0: e3100020 tst r0, #32 + 1f4d3c4: e3a00001 mov r0, #1 + 1f4d3c8: 1a000004 bne 1f4d3e0 + 1f4d3cc: ebfecfea bl 1f0137c + 1f4d3d0: e28d0004 add r0, sp, #4 + 1f4d3d4: eb00058f bl 1f4ea18 <_DWHCIRegister> + 1f4d3d8: e28dd014 add sp, sp, #20 + 1f4d3dc: e8bd8030 pop {r4, r5, pc} + 1f4d3e0: ebfecff2 bl 1f013b0 + 1f4d3e4: e2544001 subs r4, r4, #1 + 1f4d3e8: 1afffff2 bne 1f4d3b8 + 1f4d3ec: e28d0004 add r0, sp, #4 + 1f4d3f0: eb000588 bl 1f4ea18 <_DWHCIRegister> + 1f4d3f4: e28dd014 add sp, sp, #20 + 1f4d3f8: e8bd8030 pop {r4, r5, pc} + +01f4d3fc : + 1f4d3fc: e92d4010 push {r4, lr} + 1f4d400: e3a02000 mov r2, #0 + 1f4d404: e3a01010 mov r1, #16 + 1f4d408: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d40c: e24dd010 sub sp, sp, #16 + 1f4d410: e3a0400a mov r4, #10 + 1f4d414: e28d0004 add r0, sp, #4 + 1f4d418: eb00057a bl 1f4ea08 + 1f4d41c: e28d0004 add r0, sp, #4 + 1f4d420: e3a01010 mov r1, #16 + 1f4d424: eb000598 bl 1f4ea8c + 1f4d428: e28d0004 add r0, sp, #4 + 1f4d42c: eb000583 bl 1f4ea40 + 1f4d430: e28d0004 add r0, sp, #4 + 1f4d434: eb00057a bl 1f4ea24 + 1f4d438: e3100010 tst r0, #16 + 1f4d43c: e3a00001 mov r0, #1 + 1f4d440: 1a000004 bne 1f4d458 + 1f4d444: ebfecfcc bl 1f0137c + 1f4d448: e28d0004 add r0, sp, #4 + 1f4d44c: eb000571 bl 1f4ea18 <_DWHCIRegister> + 1f4d450: e28dd010 add sp, sp, #16 + 1f4d454: e8bd8010 pop {r4, pc} + 1f4d458: ebfecfd4 bl 1f013b0 + 1f4d45c: e2544001 subs r4, r4, #1 + 1f4d460: 1afffff2 bne 1f4d430 + 1f4d464: e28d0004 add r0, sp, #4 + 1f4d468: eb00056a bl 1f4ea18 <_DWHCIRegister> + 1f4d46c: e28dd010 add sp, sp, #16 + 1f4d470: e8bd8010 pop {r4, pc} + +01f4d474 : + 1f4d474: e92d4070 push {r4, r5, r6, lr} + 1f4d478: e1a00001 mov r0, r1 + 1f4d47c: e1a04001 mov r4, r1 + 1f4d480: e24dd048 sub sp, sp, #72 ; 0x48 + 1f4d484: eb00066b bl 1f4ee38 + 1f4d488: e1a05000 mov r5, r0 + 1f4d48c: e3a01001 mov r1, #1 + 1f4d490: e1a00004 mov r0, r4 + 1f4d494: eb000661 bl 1f4ee20 + 1f4d498: e1a05285 lsl r5, r5, #5 + 1f4d49c: e3001508 movw r1, #1288 ; 0x508 + 1f4d4a0: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d4a4: e0851001 add r1, r5, r1 + 1f4d4a8: e1a0000d mov r0, sp + 1f4d4ac: eb000551 bl 1f4e9f8 + 1f4d4b0: e1a0000d mov r0, sp + 1f4d4b4: eb000587 bl 1f4ead8 + 1f4d4b8: e1a0000d mov r0, sp + 1f4d4bc: eb00055f bl 1f4ea40 + 1f4d4c0: e3a01e51 mov r1, #1296 ; 0x510 + 1f4d4c4: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d4c8: e3a02000 mov r2, #0 + 1f4d4cc: e0851001 add r1, r5, r1 + 1f4d4d0: e28d000c add r0, sp, #12 + 1f4d4d4: eb00054b bl 1f4ea08 + 1f4d4d8: e1a00004 mov r0, r4 + 1f4d4dc: eb000685 bl 1f4eef8 + 1f4d4e0: e7f21050 ubfx r1, r0, #0, #19 + 1f4d4e4: e28d000c add r0, sp, #12 + 1f4d4e8: eb000567 bl 1f4ea8c + 1f4d4ec: e1a00004 mov r0, r4 + 1f4d4f0: eb000682 bl 1f4ef00 + 1f4d4f4: e3a01000 mov r1, #0 + 1f4d4f8: e3411ff8 movt r1, #8184 ; 0x1ff8 + 1f4d4fc: e1a03980 lsl r3, r0, #19 + 1f4d500: e28d000c add r0, sp, #12 + 1f4d504: e0011003 and r1, r1, r3 + 1f4d508: eb00055f bl 1f4ea8c + 1f4d50c: e1a00004 mov r0, r4 + 1f4d510: eb000666 bl 1f4eeb0 + 1f4d514: e1a01e80 lsl r1, r0, #29 + 1f4d518: e28d000c add r0, sp, #12 + 1f4d51c: eb00055a bl 1f4ea8c + 1f4d520: e28d000c add r0, sp, #12 + 1f4d524: eb000545 bl 1f4ea40 + 1f4d528: e1a00004 mov r0, r4 + 1f4d52c: eb00066f bl 1f4eef0 + 1f4d530: e3001514 movw r1, #1300 ; 0x514 + 1f4d534: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d538: e3802103 orr r2, r0, #-1073741824 ; 0xc0000000 + 1f4d53c: e0851001 add r1, r5, r1 + 1f4d540: e28d0018 add r0, sp, #24 + 1f4d544: eb00052f bl 1f4ea08 + 1f4d548: e28d0018 add r0, sp, #24 + 1f4d54c: eb00053b bl 1f4ea40 + 1f4d550: e1a00004 mov r0, r4 + 1f4d554: eb000665 bl 1f4eef0 + 1f4d558: e1a06000 mov r6, r0 + 1f4d55c: e1a00004 mov r0, r4 + 1f4d560: eb000664 bl 1f4eef8 + 1f4d564: e1a01000 mov r1, r0 + 1f4d568: e1a00006 mov r0, r6 + 1f4d56c: eb002366 bl 1f5630c + 1f4d570: f57ff05f dmb sy + 1f4d574: e3001504 movw r1, #1284 ; 0x504 + 1f4d578: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d57c: e0851001 add r1, r5, r1 + 1f4d580: e28d0024 add r0, sp, #36 ; 0x24 + 1f4d584: e3a02000 mov r2, #0 + 1f4d588: eb00051e bl 1f4ea08 + 1f4d58c: e1a00004 mov r0, r4 + 1f4d590: eb00065c bl 1f4ef08 + 1f4d594: e3500000 cmp r0, #0 + 1f4d598: 1a000079 bne 1f4d784 + 1f4d59c: e28d0024 add r0, sp, #36 ; 0x24 + 1f4d5a0: eb000526 bl 1f4ea40 + 1f4d5a4: e3a01c05 mov r1, #1280 ; 0x500 + 1f4d5a8: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d5ac: e0851001 add r1, r5, r1 + 1f4d5b0: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d5b4: eb00050f bl 1f4e9f8 + 1f4d5b8: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d5bc: eb000518 bl 1f4ea24 + 1f4d5c0: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d5c4: e3a01b3e mov r1, #63488 ; 0xf800 + 1f4d5c8: e34f1fff movt r1, #65535 ; 0xffff + 1f4d5cc: eb00052a bl 1f4ea7c + 1f4d5d0: e1a00004 mov r0, r4 + 1f4d5d4: eb000631 bl 1f4eea0 + 1f4d5d8: e7ea1050 ubfx r1, r0, #0, #11 + 1f4d5dc: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d5e0: eb000529 bl 1f4ea8c + 1f4d5e4: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d5e8: e3e01603 mvn r1, #3145728 ; 0x300000 + 1f4d5ec: eb000522 bl 1f4ea7c + 1f4d5f0: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d5f4: e3a01601 mov r1, #1048576 ; 0x100000 + 1f4d5f8: eb000523 bl 1f4ea8c + 1f4d5fc: e1a00004 mov r0, r4 + 1f4d600: eb000636 bl 1f4eee0 + 1f4d604: e3500000 cmp r0, #0 + 1f4d608: 0a000055 beq 1f4d764 + 1f4d60c: e3a01902 mov r1, #32768 ; 0x8000 + 1f4d610: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d614: eb00051c bl 1f4ea8c + 1f4d618: e1a00004 mov r0, r4 + 1f4d61c: eb000621 bl 1f4eea8 + 1f4d620: e3500000 cmp r0, #0 + 1f4d624: 1a00004a bne 1f4d754 + 1f4d628: e3a01802 mov r1, #131072 ; 0x20000 + 1f4d62c: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d630: eb000515 bl 1f4ea8c + 1f4d634: e3e0157f mvn r1, #532676608 ; 0x1fc00000 + 1f4d638: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d63c: eb00050e bl 1f4ea7c + 1f4d640: e1a00004 mov r0, r4 + 1f4d644: eb000606 bl 1f4ee64 + 1f4d648: e1a01b00 lsl r1, r0, #22 + 1f4d64c: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d650: eb00050d bl 1f4ea8c + 1f4d654: e3e01703 mvn r1, #786432 ; 0xc0000 + 1f4d658: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d65c: eb000506 bl 1f4ea7c + 1f4d660: e1a00004 mov r0, r4 + 1f4d664: eb000600 bl 1f4ee6c + 1f4d668: e1a01900 lsl r1, r0, #18 + 1f4d66c: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d670: eb000505 bl 1f4ea8c + 1f4d674: e3e01b1e mvn r1, #30720 ; 0x7800 + 1f4d678: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d67c: eb0004fe bl 1f4ea7c + 1f4d680: e1a00004 mov r0, r4 + 1f4d684: eb000603 bl 1f4ee98 + 1f4d688: e1a01580 lsl r1, r0, #11 + 1f4d68c: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d690: eb0004fd bl 1f4ea8c + 1f4d694: e1a00004 mov r0, r4 + 1f4d698: eb00063f bl 1f4ef9c + 1f4d69c: e2506000 subs r6, r0, #0 + 1f4d6a0: 0a000009 beq 1f4d6cc + 1f4d6a4: e5963010 ldr r3, [r6, #16] + 1f4d6a8: e12fff33 blx r3 + 1f4d6ac: e5963014 ldr r3, [r6, #20] + 1f4d6b0: e1a00006 mov r0, r6 + 1f4d6b4: e12fff33 blx r3 + 1f4d6b8: e3500000 cmp r0, #0 + 1f4d6bc: 1a00002c bne 1f4d774 + 1f4d6c0: e3e01202 mvn r1, #536870912 ; 0x20000000 + 1f4d6c4: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d6c8: eb0004eb bl 1f4ea7c + 1f4d6cc: e300150c movw r1, #1292 ; 0x50c + 1f4d6d0: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4d6d4: e0851001 add r1, r5, r1 + 1f4d6d8: e28d003c add r0, sp, #60 ; 0x3c + 1f4d6dc: eb0004c5 bl 1f4e9f8 + 1f4d6e0: e1a00004 mov r0, r4 + 1f4d6e4: eb000611 bl 1f4ef30 + 1f4d6e8: e1a01000 mov r1, r0 + 1f4d6ec: e28d003c add r0, sp, #60 ; 0x3c + 1f4d6f0: eb0004d8 bl 1f4ea58 + 1f4d6f4: e28d003c add r0, sp, #60 ; 0x3c + 1f4d6f8: eb0004d0 bl 1f4ea40 + 1f4d6fc: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d700: e3a01102 mov r1, #-2147483648 ; 0x80000000 + 1f4d704: eb0004e0 bl 1f4ea8c + 1f4d708: e3e01101 mvn r1, #1073741824 ; 0x40000000 + 1f4d70c: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d710: eb0004d9 bl 1f4ea7c + 1f4d714: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d718: eb0004c8 bl 1f4ea40 + 1f4d71c: e28d003c add r0, sp, #60 ; 0x3c + 1f4d720: eb0004bc bl 1f4ea18 <_DWHCIRegister> + 1f4d724: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d728: eb0004ba bl 1f4ea18 <_DWHCIRegister> + 1f4d72c: e28d0024 add r0, sp, #36 ; 0x24 + 1f4d730: eb0004b8 bl 1f4ea18 <_DWHCIRegister> + 1f4d734: e28d0018 add r0, sp, #24 + 1f4d738: eb0004b6 bl 1f4ea18 <_DWHCIRegister> + 1f4d73c: e28d000c add r0, sp, #12 + 1f4d740: eb0004b4 bl 1f4ea18 <_DWHCIRegister> + 1f4d744: e1a0000d mov r0, sp + 1f4d748: eb0004b2 bl 1f4ea18 <_DWHCIRegister> + 1f4d74c: e28dd048 add sp, sp, #72 ; 0x48 + 1f4d750: e8bd8070 pop {r4, r5, r6, pc} + 1f4d754: e3e01802 mvn r1, #131072 ; 0x20000 + 1f4d758: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d75c: eb0004c6 bl 1f4ea7c + 1f4d760: eaffffb3 b 1f4d634 + 1f4d764: e3e01902 mvn r1, #32768 ; 0x8000 + 1f4d768: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d76c: eb0004c2 bl 1f4ea7c + 1f4d770: eaffffa8 b 1f4d618 + 1f4d774: e3a01202 mov r1, #536870912 ; 0x20000000 + 1f4d778: e28d0030 add r0, sp, #48 ; 0x30 + 1f4d77c: eb0004c2 bl 1f4ea8c + 1f4d780: eaffffd1 b 1f4d6cc + 1f4d784: e1a00004 mov r0, r4 + 1f4d788: eb0005e4 bl 1f4ef20 + 1f4d78c: e1a01000 mov r1, r0 + 1f4d790: e28d0024 add r0, sp, #36 ; 0x24 + 1f4d794: eb0004bc bl 1f4ea8c + 1f4d798: e1a00004 mov r0, r4 + 1f4d79c: eb0005dd bl 1f4ef18 + 1f4d7a0: e1a01380 lsl r1, r0, #7 + 1f4d7a4: e28d0024 add r0, sp, #36 ; 0x24 + 1f4d7a8: eb0004b7 bl 1f4ea8c + 1f4d7ac: e1a00004 mov r0, r4 + 1f4d7b0: eb0005dc bl 1f4ef28 + 1f4d7b4: e1a01700 lsl r1, r0, #14 + 1f4d7b8: e28d0024 add r0, sp, #36 ; 0x24 + 1f4d7bc: eb0004b2 bl 1f4ea8c + 1f4d7c0: e1a00004 mov r0, r4 + 1f4d7c4: eb0005d1 bl 1f4ef10 + 1f4d7c8: e3500000 cmp r0, #0 + 1f4d7cc: 1a000003 bne 1f4d7e0 + 1f4d7d0: e3a01102 mov r1, #-2147483648 ; 0x80000000 + 1f4d7d4: e28d0024 add r0, sp, #36 ; 0x24 + 1f4d7d8: eb0004ab bl 1f4ea8c + 1f4d7dc: eaffff6e b 1f4d59c + 1f4d7e0: e3a01801 mov r1, #65536 ; 0x10000 + 1f4d7e4: e28d0024 add r0, sp, #36 ; 0x24 + 1f4d7e8: eb0004a7 bl 1f4ea8c + 1f4d7ec: eafffff7 b 1f4d7d0 + +01f4d7f0 : + 1f4d7f0: e92d4070 push {r4, r5, r6, lr} + 1f4d7f4: e1a06000 mov r6, r0 + 1f4d7f8: e1a00001 mov r0, r1 + 1f4d7fc: e24dd018 sub sp, sp, #24 + 1f4d800: e1a05001 mov r5, r1 + 1f4d804: eb00058b bl 1f4ee38 + 1f4d808: e30c1028 movw r1, #49192 ; 0xc028 + 1f4d80c: e34011fc movt r1, #508 ; 0x1fc + 1f4d810: e0801001 add r1, r0, r1 + 1f4d814: e1a0000d mov r0, sp + 1f4d818: e1a04281 lsl r4, r1, #5 + 1f4d81c: e1a01004 mov r1, r4 + 1f4d820: eb000474 bl 1f4e9f8 + 1f4d824: e1a0000d mov r0, sp + 1f4d828: eb00047d bl 1f4ea24 + 1f4d82c: e1a0000d mov r0, sp + 1f4d830: e3a01102 mov r1, #-2147483648 ; 0x80000000 + 1f4d834: eb00048b bl 1f4ea68 + 1f4d838: e3500000 cmp r0, #0 + 1f4d83c: 1a000006 bne 1f4d85c + 1f4d840: e1a01005 mov r1, r5 + 1f4d844: e1a00006 mov r0, r6 + 1f4d848: ebffff09 bl 1f4d474 + 1f4d84c: e1a0000d mov r0, sp + 1f4d850: eb000470 bl 1f4ea18 <_DWHCIRegister> + 1f4d854: e28dd018 add sp, sp, #24 + 1f4d858: e8bd8070 pop {r4, r5, r6, pc} + 1f4d85c: e1a00005 mov r0, r5 + 1f4d860: e3a01000 mov r1, #0 + 1f4d864: eb00056d bl 1f4ee20 + 1f4d868: e1a0000d mov r0, sp + 1f4d86c: e3e01102 mvn r1, #-2147483648 ; 0x80000000 + 1f4d870: eb000481 bl 1f4ea7c + 1f4d874: e3a01101 mov r1, #1073741824 ; 0x40000000 + 1f4d878: e1a0000d mov r0, sp + 1f4d87c: eb000482 bl 1f4ea8c + 1f4d880: e1a0000d mov r0, sp + 1f4d884: eb00046d bl 1f4ea40 + 1f4d888: e284100c add r1, r4, #12 + 1f4d88c: e28d000c add r0, sp, #12 + 1f4d890: eb000458 bl 1f4e9f8 + 1f4d894: e3a01002 mov r1, #2 + 1f4d898: e28d000c add r0, sp, #12 + 1f4d89c: eb00046d bl 1f4ea58 + 1f4d8a0: e28d000c add r0, sp, #12 + 1f4d8a4: eb000465 bl 1f4ea40 + 1f4d8a8: e28d000c add r0, sp, #12 + 1f4d8ac: eb000459 bl 1f4ea18 <_DWHCIRegister> + 1f4d8b0: e1a0000d mov r0, sp + 1f4d8b4: eb000457 bl 1f4ea18 <_DWHCIRegister> + 1f4d8b8: e28dd018 add sp, sp, #24 + 1f4d8bc: e8bd8070 pop {r4, r5, r6, pc} + +01f4d8c0 : + 1f4d8c0: e92d4070 push {r4, r5, r6, lr} + 1f4d8c4: e1a04001 mov r4, r1 + 1f4d8c8: e1a05002 mov r5, r2 + 1f4d8cc: f57ff05f dmb sy + 1f4d8d0: e1a00001 mov r0, r1 + 1f4d8d4: eb00058b bl 1f4ef08 + 1f4d8d8: e2501000 subs r1, r0, #0 + 1f4d8dc: 1a000006 bne 1f4d8fc + 1f4d8e0: e1a00004 mov r0, r4 + 1f4d8e4: eb000549 bl 1f4ee10 + 1f4d8e8: e1a01004 mov r1, r4 + 1f4d8ec: e1a00005 mov r0, r5 + 1f4d8f0: ebffffbe bl 1f4d7f0 + 1f4d8f4: f57ff05f dmb sy + 1f4d8f8: e8bd8070 pop {r4, r5, r6, pc} + 1f4d8fc: e1a00004 mov r0, r4 + 1f4d900: e3a01001 mov r1, #1 + 1f4d904: eb000541 bl 1f4ee10 + 1f4d908: e3a01000 mov r1, #0 + 1f4d90c: e1a00004 mov r0, r4 + 1f4d910: eb00053c bl 1f4ee08 + 1f4d914: e1a00004 mov r0, r4 + 1f4d918: eb00059f bl 1f4ef9c + 1f4d91c: e5903004 ldr r3, [r0, #4] + 1f4d920: e12fff33 blx r3 + 1f4d924: eaffffef b 1f4d8e8 + +01f4d928 : + 1f4d928: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f4d92c: e1a05000 mov r5, r0 + 1f4d930: e1a06001 mov r6, r1 + 1f4d934: e24dd018 sub sp, sp, #24 + 1f4d938: e1a07002 mov r7, r2 + 1f4d93c: e1a08003 mov r8, r3 + 1f4d940: eb002253 bl 1f56294 + 1f4d944: e5950000 ldr r0, [r5] + 1f4d948: e3500000 cmp r0, #0 + 1f4d94c: 0a00000c beq 1f4d984 + 1f4d950: e5951004 ldr r1, [r5, #4] + 1f4d954: e2111001 ands r1, r1, #1 + 1f4d958: 0a000012 beq 1f4d9a8 + 1f4d95c: e3a01000 mov r1, #0 + 1f4d960: e3a03001 mov r3, #1 + 1f4d964: ea000002 b 1f4d974 + 1f4d968: e5952004 ldr r2, [r5, #4] + 1f4d96c: e1120003 tst r2, r3 + 1f4d970: 0a00000d beq 1f4d9ac + 1f4d974: e2811001 add r1, r1, #1 + 1f4d978: e1a03083 lsl r3, r3, #1 + 1f4d97c: e1500001 cmp r0, r1 + 1f4d980: 1afffff8 bne 1f4d968 + 1f4d984: eb002251 bl 1f562d0 + 1f4d988: e5953000 ldr r3, [r5] + 1f4d98c: e3a04010 mov r4, #16 + 1f4d990: e1530004 cmp r3, r4 + 1f4d994: 93a06000 movls r6, #0 + 1f4d998: 8a00000c bhi 1f4d9d0 + 1f4d99c: e1a00006 mov r0, r6 + 1f4d9a0: e28dd018 add sp, sp, #24 + 1f4d9a4: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f4d9a8: e3a03001 mov r3, #1 + 1f4d9ac: e5952004 ldr r2, [r5, #4] + 1f4d9b0: e1a04001 mov r4, r1 + 1f4d9b4: e1823003 orr r3, r2, r3 + 1f4d9b8: e5853004 str r3, [r5, #4] + 1f4d9bc: eb002243 bl 1f562d0 + 1f4d9c0: e5953000 ldr r3, [r5] + 1f4d9c4: e1530004 cmp r3, r4 + 1f4d9c8: 93a06000 movls r6, #0 + 1f4d9cc: 9afffff2 bls 1f4d99c + 1f4d9d0: e085a104 add sl, r5, r4, lsl #2 + 1f4d9d4: e3a00054 mov r0, #84 ; 0x54 + 1f4d9d8: ebffc2e2 bl 1f3e568 + 1f4d9dc: e1a03007 mov r3, r7 + 1f4d9e0: e1a02006 mov r2, r6 + 1f4d9e4: e1a01004 mov r1, r4 + 1f4d9e8: e58d8000 str r8, [sp] + 1f4d9ec: e3a07001 mov r7, #1 + 1f4d9f0: e1a09000 mov r9, r0 + 1f4d9f4: eb00043c bl 1f4eaec + 1f4d9f8: e28d000c add r0, sp, #12 + 1f4d9fc: e58a9008 str r9, [sl, #8] + 1f4da00: e3001418 movw r1, #1048 ; 0x418 + 1f4da04: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4da08: eb0003fa bl 1f4e9f8 + 1f4da0c: e1a04417 lsl r4, r7, r4 + 1f4da10: eb00221f bl 1f56294 + 1f4da14: e28d000c add r0, sp, #12 + 1f4da18: eb000401 bl 1f4ea24 + 1f4da1c: e1a01004 mov r1, r4 + 1f4da20: e28d000c add r0, sp, #12 + 1f4da24: eb000418 bl 1f4ea8c + 1f4da28: e28d000c add r0, sp, #12 + 1f4da2c: eb000403 bl 1f4ea40 + 1f4da30: eb002226 bl 1f562d0 + 1f4da34: e28d000c add r0, sp, #12 + 1f4da38: eb0003f6 bl 1f4ea18 <_DWHCIRegister> + 1f4da3c: e1a00009 mov r0, r9 + 1f4da40: eb000530 bl 1f4ef08 + 1f4da44: e2501000 subs r1, r0, #0 + 1f4da48: e1a00009 mov r0, r9 + 1f4da4c: 0a000013 beq 1f4daa0 + 1f4da50: eb0004f6 bl 1f4ee30 + 1f4da54: e2506000 subs r6, r0, #0 + 1f4da58: 0a000012 beq 1f4daa8 + 1f4da5c: e1a01007 mov r1, r7 + 1f4da60: e1a00009 mov r0, r9 + 1f4da64: eb0004e9 bl 1f4ee10 + 1f4da68: e3a01000 mov r1, #0 + 1f4da6c: e1a00009 mov r0, r9 + 1f4da70: eb0004e4 bl 1f4ee08 + 1f4da74: e1a00009 mov r0, r9 + 1f4da78: eb000547 bl 1f4ef9c + 1f4da7c: e5903004 ldr r3, [r0, #4] + 1f4da80: e12fff33 blx r3 + 1f4da84: e1a00005 mov r0, r5 + 1f4da88: e1a01009 mov r1, r9 + 1f4da8c: e3a06001 mov r6, #1 + 1f4da90: ebffff56 bl 1f4d7f0 + 1f4da94: e1a00006 mov r0, r6 + 1f4da98: e28dd018 add sp, sp, #24 + 1f4da9c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f4daa0: eb0004da bl 1f4ee10 + 1f4daa4: eafffff6 b 1f4da84 + 1f4daa8: e28d000c add r0, sp, #12 + 1f4daac: e3001418 movw r1, #1048 ; 0x418 + 1f4dab0: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4dab4: eb0003cf bl 1f4e9f8 + 1f4dab8: e1e04004 mvn r4, r4 + 1f4dabc: eb0021f4 bl 1f56294 + 1f4dac0: e28d000c add r0, sp, #12 + 1f4dac4: eb0003d6 bl 1f4ea24 + 1f4dac8: e1a01004 mov r1, r4 + 1f4dacc: e28d000c add r0, sp, #12 + 1f4dad0: eb0003e9 bl 1f4ea7c + 1f4dad4: e28d000c add r0, sp, #12 + 1f4dad8: eb0003d8 bl 1f4ea40 + 1f4dadc: eb0021fb bl 1f562d0 + 1f4dae0: e28d000c add r0, sp, #12 + 1f4dae4: eb0003cb bl 1f4ea18 <_DWHCIRegister> + 1f4dae8: e1a00009 mov r0, r9 + 1f4daec: eb000472 bl 1f4ecbc <_DWHCITransferStageData> + 1f4daf0: e1a00009 mov r0, r9 + 1f4daf4: ebffc2a3 bl 1f3e588 + 1f4daf8: e58a6008 str r6, [sl, #8] + 1f4dafc: eb0021e4 bl 1f56294 + 1f4db00: e5953004 ldr r3, [r5, #4] + 1f4db04: e0044003 and r4, r4, r3 + 1f4db08: e5854004 str r4, [r5, #4] + 1f4db0c: eb0021ef bl 1f562d0 + 1f4db10: eaffffa1 b 1f4d99c + +01f4db14 : + 1f4db14: e92d4070 push {r4, r5, r6, lr} + 1f4db18: e1a05000 mov r5, r0 + 1f4db1c: e1a04001 mov r4, r1 + 1f4db20: f57ff05f dmb sy + 1f4db24: e3a01000 mov r1, #0 + 1f4db28: e1a00004 mov r0, r4 + 1f4db2c: eb000762 bl 1f4f8bc + 1f4db30: e1a00004 mov r0, r4 + 1f4db34: eb00075e bl 1f4f8b4 + 1f4db38: eb000726 bl 1f4f7d8 + 1f4db3c: e1a01004 mov r1, r4 + 1f4db40: e1a02000 mov r2, r0 + 1f4db44: e3a03000 mov r3, #0 + 1f4db48: e1a00005 mov r0, r5 + 1f4db4c: ebffff75 bl 1f4d928 + 1f4db50: f57ff05f dmb sy + 1f4db54: e8bd8070 pop {r4, r5, r6, pc} + +01f4db58 : + 1f4db58: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f4db5c: e1a04000 mov r4, r0 + 1f4db60: e1a05001 mov r5, r1 + 1f4db64: e1a00001 mov r0, r1 + 1f4db68: e1a06002 mov r6, r2 + 1f4db6c: e1a07003 mov r7, r3 + 1f4db70: e3a02000 mov r2, #0 + 1f4db74: e1a03004 mov r3, r4 + 1f4db78: e30c18d0 movw r1, #51408 ; 0xc8d0 + 1f4db7c: e34011f4 movt r1, #500 ; 0x1f4 + 1f4db80: eb00075b bl 1f4f8f4 + 1f4db84: e1a03007 mov r3, r7 + 1f4db88: e3a00001 mov r0, #1 + 1f4db8c: e1a02006 mov r2, r6 + 1f4db90: e5840048 str r0, [r4, #72] ; 0x48 + 1f4db94: e1a01005 mov r1, r5 + 1f4db98: e1a00004 mov r0, r4 + 1f4db9c: ebffff61 bl 1f4d928 + 1f4dba0: e2503000 subs r3, r0, #0 + 1f4dba4: 0a000005 beq 1f4dbc0 + 1f4dba8: e5943048 ldr r3, [r4, #72] ; 0x48 + 1f4dbac: e3530000 cmp r3, #0 + 1f4dbb0: 1afffffc bne 1f4dba8 + 1f4dbb4: e1a00005 mov r0, r5 + 1f4dbb8: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f4dbbc: ea000742 b 1f4f8cc + 1f4dbc0: e5843048 str r3, [r4, #72] ; 0x48 + 1f4dbc4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f4dbc8 : + 1f4dbc8: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f4dbcc: e1a04000 mov r4, r0 + 1f4dbd0: e1a05001 mov r5, r1 + 1f4dbd4: f57ff05f dmb sy + 1f4dbd8: e3a01000 mov r1, #0 + 1f4dbdc: e1a00005 mov r0, r5 + 1f4dbe0: eb000735 bl 1f4f8bc + 1f4dbe4: e1a00005 mov r0, r5 + 1f4dbe8: eb000731 bl 1f4f8b4 + 1f4dbec: eb0006f7 bl 1f4f7d0 + 1f4dbf0: e2506000 subs r6, r0, #0 + 1f4dbf4: e1a00005 mov r0, r5 + 1f4dbf8: 1a000035 bne 1f4dcd4 + 1f4dbfc: eb000736 bl 1f4f8dc + 1f4dc00: e1d030d0 ldrsb r3, [r0] + 1f4dc04: e3530000 cmp r3, #0 + 1f4dc08: ba00006e blt 1f4ddc8 + 1f4dc0c: e1a00005 mov r0, r5 + 1f4dc10: eb000735 bl 1f4f8ec + 1f4dc14: e2507000 subs r7, r0, #0 + 1f4dc18: e30c18d0 movw r1, #51408 ; 0xc8d0 + 1f4dc1c: e34011f4 movt r1, #500 ; 0x1f4 + 1f4dc20: e1a03004 mov r3, r4 + 1f4dc24: 1a000043 bne 1f4dd38 + 1f4dc28: e1a02007 mov r2, r7 + 1f4dc2c: e1a00005 mov r0, r5 + 1f4dc30: eb00072f bl 1f4f8f4 + 1f4dc34: e3a02001 mov r2, #1 + 1f4dc38: e1a03007 mov r3, r7 + 1f4dc3c: e5842048 str r2, [r4, #72] ; 0x48 + 1f4dc40: e1a01005 mov r1, r5 + 1f4dc44: e1a02007 mov r2, r7 + 1f4dc48: e1a00004 mov r0, r4 + 1f4dc4c: ebffff35 bl 1f4d928 + 1f4dc50: e3500000 cmp r0, #0 + 1f4dc54: 0a000059 beq 1f4ddc0 + 1f4dc58: e5946048 ldr r6, [r4, #72] ; 0x48 + 1f4dc5c: e3560000 cmp r6, #0 + 1f4dc60: 1afffffc bne 1f4dc58 + 1f4dc64: e1a00005 mov r0, r5 + 1f4dc68: eb000717 bl 1f4f8cc + 1f4dc6c: e3500000 cmp r0, #0 + 1f4dc70: 0a0000aa beq 1f4df20 + 1f4dc74: e1a02006 mov r2, r6 + 1f4dc78: e1a03004 mov r3, r4 + 1f4dc7c: e1a00005 mov r0, r5 + 1f4dc80: e30c18d0 movw r1, #51408 ; 0xc8d0 + 1f4dc84: e34011f4 movt r1, #500 ; 0x1f4 + 1f4dc88: eb000719 bl 1f4f8f4 + 1f4dc8c: e3a03001 mov r3, #1 + 1f4dc90: e1a02003 mov r2, r3 + 1f4dc94: e5843048 str r3, [r4, #72] ; 0x48 + 1f4dc98: e1a01005 mov r1, r5 + 1f4dc9c: e1a00004 mov r0, r4 + 1f4dca0: ebffff20 bl 1f4d928 + 1f4dca4: e3500000 cmp r0, #0 + 1f4dca8: 0a000044 beq 1f4ddc0 + 1f4dcac: e5943048 ldr r3, [r4, #72] ; 0x48 + 1f4dcb0: e3530000 cmp r3, #0 + 1f4dcb4: 1afffffc bne 1f4dcac + 1f4dcb8: e1a00005 mov r0, r5 + 1f4dcbc: eb000702 bl 1f4f8cc + 1f4dcc0: e3500000 cmp r0, #0 + 1f4dcc4: 0a000095 beq 1f4df20 + 1f4dcc8: f57ff05f dmb sy + 1f4dccc: e3a00001 mov r0, #1 + 1f4dcd0: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f4dcd4: eb0006f6 bl 1f4f8b4 + 1f4dcd8: eb0006be bl 1f4f7d8 + 1f4dcdc: e1a03004 mov r3, r4 + 1f4dce0: e1a06000 mov r6, r0 + 1f4dce4: e3a02000 mov r2, #0 + 1f4dce8: e1a00005 mov r0, r5 + 1f4dcec: e30c18d0 movw r1, #51408 ; 0xc8d0 + 1f4dcf0: e34011f4 movt r1, #500 ; 0x1f4 + 1f4dcf4: eb0006fe bl 1f4f8f4 + 1f4dcf8: e3a01001 mov r1, #1 + 1f4dcfc: e1a02006 mov r2, r6 + 1f4dd00: e5841048 str r1, [r4, #72] ; 0x48 + 1f4dd04: e3a03000 mov r3, #0 + 1f4dd08: e1a01005 mov r1, r5 + 1f4dd0c: e1a00004 mov r0, r4 + 1f4dd10: ebffff04 bl 1f4d928 + 1f4dd14: e3500000 cmp r0, #0 + 1f4dd18: 0a000028 beq 1f4ddc0 + 1f4dd1c: e5943048 ldr r3, [r4, #72] ; 0x48 + 1f4dd20: e3530000 cmp r3, #0 + 1f4dd24: 0affffe3 beq 1f4dcb8 + 1f4dd28: e5943048 ldr r3, [r4, #72] ; 0x48 + 1f4dd2c: e3530000 cmp r3, #0 + 1f4dd30: 1afffff9 bne 1f4dd1c + 1f4dd34: eaffffdf b 1f4dcb8 + 1f4dd38: e1a02006 mov r2, r6 + 1f4dd3c: e1a00005 mov r0, r5 + 1f4dd40: eb0006eb bl 1f4f8f4 + 1f4dd44: e3a02001 mov r2, #1 + 1f4dd48: e1a03006 mov r3, r6 + 1f4dd4c: e5842048 str r2, [r4, #72] ; 0x48 + 1f4dd50: e1a01005 mov r1, r5 + 1f4dd54: e1a02006 mov r2, r6 + 1f4dd58: e1a00004 mov r0, r4 + 1f4dd5c: ebfffef1 bl 1f4d928 + 1f4dd60: e3500000 cmp r0, #0 + 1f4dd64: 0a000015 beq 1f4ddc0 + 1f4dd68: e5946048 ldr r6, [r4, #72] ; 0x48 + 1f4dd6c: e3560000 cmp r6, #0 + 1f4dd70: 1afffffc bne 1f4dd68 + 1f4dd74: e1a00005 mov r0, r5 + 1f4dd78: eb0006d3 bl 1f4f8cc + 1f4dd7c: e3500000 cmp r0, #0 + 1f4dd80: 0a000066 beq 1f4df20 + 1f4dd84: e1a03004 mov r3, r4 + 1f4dd88: e1a02006 mov r2, r6 + 1f4dd8c: e1a00005 mov r0, r5 + 1f4dd90: e30c18d0 movw r1, #51408 ; 0xc8d0 + 1f4dd94: e34011f4 movt r1, #500 ; 0x1f4 + 1f4dd98: eb0006d5 bl 1f4f8f4 + 1f4dd9c: e3a02001 mov r2, #1 + 1f4dda0: e1a03006 mov r3, r6 + 1f4dda4: e5842048 str r2, [r4, #72] ; 0x48 + 1f4dda8: e1a01005 mov r1, r5 + 1f4ddac: e1a02006 mov r2, r6 + 1f4ddb0: e1a00004 mov r0, r4 + 1f4ddb4: ebfffedb bl 1f4d928 + 1f4ddb8: e3500000 cmp r0, #0 + 1f4ddbc: 1a00003e bne 1f4debc + 1f4ddc0: e5840048 str r0, [r4, #72] ; 0x48 + 1f4ddc4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f4ddc8: e1a03004 mov r3, r4 + 1f4ddcc: e1a02006 mov r2, r6 + 1f4ddd0: e1a00005 mov r0, r5 + 1f4ddd4: e30c18d0 movw r1, #51408 ; 0xc8d0 + 1f4ddd8: e34011f4 movt r1, #500 ; 0x1f4 + 1f4dddc: eb0006c4 bl 1f4f8f4 + 1f4dde0: e3a02001 mov r2, #1 + 1f4dde4: e1a03006 mov r3, r6 + 1f4dde8: e5842048 str r2, [r4, #72] ; 0x48 + 1f4ddec: e1a01005 mov r1, r5 + 1f4ddf0: e1a02006 mov r2, r6 + 1f4ddf4: e1a00004 mov r0, r4 + 1f4ddf8: ebfffeca bl 1f4d928 + 1f4ddfc: e3500000 cmp r0, #0 + 1f4de00: 0affffee beq 1f4ddc0 + 1f4de04: e5946048 ldr r6, [r4, #72] ; 0x48 + 1f4de08: e3560000 cmp r6, #0 + 1f4de0c: 1afffffc bne 1f4de04 + 1f4de10: e1a00005 mov r0, r5 + 1f4de14: eb0006ac bl 1f4f8cc + 1f4de18: e3500000 cmp r0, #0 + 1f4de1c: 0a00003f beq 1f4df20 + 1f4de20: e1a03004 mov r3, r4 + 1f4de24: e1a02006 mov r2, r6 + 1f4de28: e1a00005 mov r0, r5 + 1f4de2c: e30c18d0 movw r1, #51408 ; 0xc8d0 + 1f4de30: e34011f4 movt r1, #500 ; 0x1f4 + 1f4de34: eb0006ae bl 1f4f8f4 + 1f4de38: e3a02001 mov r2, #1 + 1f4de3c: e1a03006 mov r3, r6 + 1f4de40: e5842048 str r2, [r4, #72] ; 0x48 + 1f4de44: e1a01005 mov r1, r5 + 1f4de48: e1a00004 mov r0, r4 + 1f4de4c: ebfffeb5 bl 1f4d928 + 1f4de50: e3500000 cmp r0, #0 + 1f4de54: 0affffd9 beq 1f4ddc0 + 1f4de58: e5946048 ldr r6, [r4, #72] ; 0x48 + 1f4de5c: e3560000 cmp r6, #0 + 1f4de60: 1afffffc bne 1f4de58 + 1f4de64: e1a00005 mov r0, r5 + 1f4de68: eb000697 bl 1f4f8cc + 1f4de6c: e3500000 cmp r0, #0 + 1f4de70: 0a00002a beq 1f4df20 + 1f4de74: e1a03004 mov r3, r4 + 1f4de78: e1a02006 mov r2, r6 + 1f4de7c: e1a00005 mov r0, r5 + 1f4de80: e30c18d0 movw r1, #51408 ; 0xc8d0 + 1f4de84: e34011f4 movt r1, #500 ; 0x1f4 + 1f4de88: eb000699 bl 1f4f8f4 + 1f4de8c: e3a03001 mov r3, #1 + 1f4de90: e1a02006 mov r2, r6 + 1f4de94: e5843048 str r3, [r4, #72] ; 0x48 + 1f4de98: e1a01005 mov r1, r5 + 1f4de9c: e1a00004 mov r0, r4 + 1f4dea0: ebfffea0 bl 1f4d928 + 1f4dea4: e3500000 cmp r0, #0 + 1f4dea8: 0affffc4 beq 1f4ddc0 + 1f4deac: e5943048 ldr r3, [r4, #72] ; 0x48 + 1f4deb0: e3530000 cmp r3, #0 + 1f4deb4: 1afffffc bne 1f4deac + 1f4deb8: eaffff7e b 1f4dcb8 + 1f4debc: e5946048 ldr r6, [r4, #72] ; 0x48 + 1f4dec0: e3560000 cmp r6, #0 + 1f4dec4: 1afffffc bne 1f4debc + 1f4dec8: e1a00005 mov r0, r5 + 1f4decc: eb00067e bl 1f4f8cc + 1f4ded0: e3500000 cmp r0, #0 + 1f4ded4: 0a000011 beq 1f4df20 + 1f4ded8: e1a02006 mov r2, r6 + 1f4dedc: e1a03004 mov r3, r4 + 1f4dee0: e1a00005 mov r0, r5 + 1f4dee4: e30c18d0 movw r1, #51408 ; 0xc8d0 + 1f4dee8: e34011f4 movt r1, #500 ; 0x1f4 + 1f4deec: eb000680 bl 1f4f8f4 + 1f4def0: e3a03001 mov r3, #1 + 1f4def4: e1a02003 mov r2, r3 + 1f4def8: e5843048 str r3, [r4, #72] ; 0x48 + 1f4defc: e1a01005 mov r1, r5 + 1f4df00: e1a00004 mov r0, r4 + 1f4df04: ebfffe87 bl 1f4d928 + 1f4df08: e3500000 cmp r0, #0 + 1f4df0c: 0affffab beq 1f4ddc0 + 1f4df10: e5943048 ldr r3, [r4, #72] ; 0x48 + 1f4df14: e3530000 cmp r3, #0 + 1f4df18: 1afffffc bne 1f4df10 + 1f4df1c: eaffff65 b 1f4dcb8 + 1f4df20: e3a00000 mov r0, #0 + 1f4df24: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f4df28 : + 1f4df28: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f4df2c: e1a06000 mov r6, r0 + 1f4df30: e3a00008 mov r0, #8 + 1f4df34: e24dd034 sub sp, sp, #52 ; 0x34 + 1f4df38: e1a0a002 mov sl, r2 + 1f4df3c: e1a09003 mov r9, r3 + 1f4df40: e1a0b001 mov fp, r1 + 1f4df44: e1dd56b4 ldrh r5, [sp, #100] ; 0x64 + 1f4df48: e1dd85b8 ldrh r8, [sp, #88] ; 0x58 + 1f4df4c: e1dd75bc ldrh r7, [sp, #92] ; 0x5c + 1f4df50: ebffc184 bl 1f3e568 + 1f4df54: e1a04000 mov r4, r0 + 1f4df58: e1a0100b mov r1, fp + 1f4df5c: e28d000c add r0, sp, #12 + 1f4df60: e1a03005 mov r3, r5 + 1f4df64: e59d2060 ldr r2, [sp, #96] ; 0x60 + 1f4df68: e5c4a000 strb sl, [r4] + 1f4df6c: e5c49001 strb r9, [r4, #1] + 1f4df70: e1c480b2 strh r8, [r4, #2] + 1f4df74: e1c470b4 strh r7, [r4, #4] + 1f4df78: e1c450b6 strh r5, [r4, #6] + 1f4df7c: e58d4000 str r4, [sp] + 1f4df80: eb000638 bl 1f4f868 + 1f4df84: e28d100c add r1, sp, #12 + 1f4df88: e1a00006 mov r0, r6 + 1f4df8c: ebffff0d bl 1f4dbc8 + 1f4df90: e3500000 cmp r0, #0 + 1f4df94: 0a000009 beq 1f4dfc0 + 1f4df98: e28d000c add r0, sp, #12 + 1f4df9c: eb00064c bl 1f4f8d4 + 1f4dfa0: e1a05000 mov r5, r0 + 1f4dfa4: e1a00004 mov r0, r4 + 1f4dfa8: ebffc176 bl 1f3e588 + 1f4dfac: e28d000c add r0, sp, #12 + 1f4dfb0: eb000639 bl 1f4f89c <_USBRequest> + 1f4dfb4: e1a00005 mov r0, r5 + 1f4dfb8: e28dd034 add sp, sp, #52 ; 0x34 + 1f4dfbc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f4dfc0: e3e05000 mvn r5, #0 + 1f4dfc4: eafffff6 b 1f4dfa4 + +01f4dfc8 : + 1f4dfc8: e92d4010 push {r4, lr} + 1f4dfcc: e3a0c000 mov ip, #0 + 1f4dfd0: e1a04000 mov r4, r0 + 1f4dfd4: e24dd030 sub sp, sp, #48 ; 0x30 + 1f4dfd8: e28d000c add r0, sp, #12 + 1f4dfdc: e58dc000 str ip, [sp] + 1f4dfe0: eb000620 bl 1f4f868 + 1f4dfe4: e28d100c add r1, sp, #12 + 1f4dfe8: e1a00004 mov r0, r4 + 1f4dfec: ebfffef5 bl 1f4dbc8 + 1f4dff0: e3500000 cmp r0, #0 + 1f4dff4: 0a000007 beq 1f4e018 + 1f4dff8: e28d000c add r0, sp, #12 + 1f4dffc: eb000634 bl 1f4f8d4 + 1f4e000: e1a04000 mov r4, r0 + 1f4e004: e28d000c add r0, sp, #12 + 1f4e008: eb000623 bl 1f4f89c <_USBRequest> + 1f4e00c: e1a00004 mov r0, r4 + 1f4e010: e28dd030 add sp, sp, #48 ; 0x30 + 1f4e014: e8bd8010 pop {r4, pc} + 1f4e018: e3e04000 mvn r4, #0 + 1f4e01c: eafffff8 b 1f4e004 + +01f4e020 : + 1f4e020: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f4e024: e1a07000 mov r7, r0 + 1f4e028: e3a00008 mov r0, #8 + 1f4e02c: e24dd030 sub sp, sp, #48 ; 0x30 + 1f4e030: e1a0a002 mov sl, r2 + 1f4e034: e1a05003 mov r5, r3 + 1f4e038: e1a09001 mov r9, r1 + 1f4e03c: e185540a orr r5, r5, sl, lsl #8 + 1f4e040: e59d6054 ldr r6, [sp, #84] ; 0x54 + 1f4e044: e5dd8058 ldrb r8, [sp, #88] ; 0x58 + 1f4e048: ebffc146 bl 1f3e568 + 1f4e04c: e1a04000 mov r4, r0 + 1f4e050: e3a0c000 mov ip, #0 + 1f4e054: e28d000c add r0, sp, #12 + 1f4e058: e1a01009 mov r1, r9 + 1f4e05c: e6ff3076 uxth r3, r6 + 1f4e060: e3a02006 mov r2, #6 + 1f4e064: e5c4c004 strb ip, [r4, #4] + 1f4e068: e5c42001 strb r2, [r4, #1] + 1f4e06c: e5c4c005 strb ip, [r4, #5] + 1f4e070: e1c450b2 strh r5, [r4, #2] + 1f4e074: e5c48000 strb r8, [r4] + 1f4e078: e1c460b6 strh r6, [r4, #6] + 1f4e07c: e59d2050 ldr r2, [sp, #80] ; 0x50 + 1f4e080: e58d4000 str r4, [sp] + 1f4e084: eb0005f7 bl 1f4f868 + 1f4e088: e28d100c add r1, sp, #12 + 1f4e08c: e1a00007 mov r0, r7 + 1f4e090: ebfffecc bl 1f4dbc8 + 1f4e094: e3500000 cmp r0, #0 + 1f4e098: 0a000009 beq 1f4e0c4 + 1f4e09c: e28d000c add r0, sp, #12 + 1f4e0a0: eb00060b bl 1f4f8d4 + 1f4e0a4: e1a05000 mov r5, r0 + 1f4e0a8: e1a00004 mov r0, r4 + 1f4e0ac: ebffc135 bl 1f3e588 + 1f4e0b0: e28d000c add r0, sp, #12 + 1f4e0b4: eb0005f8 bl 1f4f89c <_USBRequest> + 1f4e0b8: e1a00005 mov r0, r5 + 1f4e0bc: e28dd030 add sp, sp, #48 ; 0x30 + 1f4e0c0: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f4e0c4: e3e05000 mvn r5, #0 + 1f4e0c8: eafffff6 b 1f4e0a8 + +01f4e0cc : + 1f4e0cc: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f4e0d0: e1a06000 mov r6, r0 + 1f4e0d4: e3a00008 mov r0, #8 + 1f4e0d8: e24dd030 sub sp, sp, #48 ; 0x30 + 1f4e0dc: e1a07002 mov r7, r2 + 1f4e0e0: e1a08001 mov r8, r1 + 1f4e0e4: ebffc11f bl 1f3e568 + 1f4e0e8: e1a04000 mov r4, r0 + 1f4e0ec: e3a05000 mov r5, #0 + 1f4e0f0: e1a01008 mov r1, r8 + 1f4e0f4: e3a00005 mov r0, #5 + 1f4e0f8: e1a03005 mov r3, r5 + 1f4e0fc: e1a02005 mov r2, r5 + 1f4e100: e5c40001 strb r0, [r4, #1] + 1f4e104: e28d000c add r0, sp, #12 + 1f4e108: e1c470b2 strh r7, [r4, #2] + 1f4e10c: e5c45000 strb r5, [r4] + 1f4e110: e5c45004 strb r5, [r4, #4] + 1f4e114: e5c45005 strb r5, [r4, #5] + 1f4e118: e5c45006 strb r5, [r4, #6] + 1f4e11c: e5c45007 strb r5, [r4, #7] + 1f4e120: e58d4000 str r4, [sp] + 1f4e124: eb0005cf bl 1f4f868 + 1f4e128: e1a00006 mov r0, r6 + 1f4e12c: e28d100c add r1, sp, #12 + 1f4e130: ebfffea4 bl 1f4dbc8 + 1f4e134: e2506000 subs r6, r0, #0 + 1f4e138: 0a00000f beq 1f4e17c + 1f4e13c: e28d000c add r0, sp, #12 + 1f4e140: eb0005e3 bl 1f4f8d4 + 1f4e144: e1a06000 mov r6, r0 + 1f4e148: e1a00004 mov r0, r4 + 1f4e14c: ebffc10d bl 1f3e588 + 1f4e150: e28d000c add r0, sp, #12 + 1f4e154: eb0005d0 bl 1f4f89c <_USBRequest> + 1f4e158: e1560005 cmp r6, r5 + 1f4e15c: b1a06005 movlt r6, r5 + 1f4e160: ba000002 blt 1f4e170 + 1f4e164: e3a00032 mov r0, #50 ; 0x32 + 1f4e168: e3a06001 mov r6, #1 + 1f4e16c: ebfecc8f bl 1f013b0 + 1f4e170: e1a00006 mov r0, r6 + 1f4e174: e28dd030 add sp, sp, #48 ; 0x30 + 1f4e178: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f4e17c: e1a00004 mov r0, r4 + 1f4e180: ebffc100 bl 1f3e588 + 1f4e184: e28d000c add r0, sp, #12 + 1f4e188: eb0005c3 bl 1f4f89c <_USBRequest> + 1f4e18c: eafffff7 b 1f4e170 + +01f4e190 : + 1f4e190: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f4e194: e1a06000 mov r6, r0 + 1f4e198: e3a00008 mov r0, #8 + 1f4e19c: e24dd030 sub sp, sp, #48 ; 0x30 + 1f4e1a0: e1a07002 mov r7, r2 + 1f4e1a4: e1a08001 mov r8, r1 + 1f4e1a8: ebffc0ee bl 1f3e568 + 1f4e1ac: e1a04000 mov r4, r0 + 1f4e1b0: e3a05000 mov r5, #0 + 1f4e1b4: e1a01008 mov r1, r8 + 1f4e1b8: e3a00009 mov r0, #9 + 1f4e1bc: e1a03005 mov r3, r5 + 1f4e1c0: e1a02005 mov r2, r5 + 1f4e1c4: e5c40001 strb r0, [r4, #1] + 1f4e1c8: e28d000c add r0, sp, #12 + 1f4e1cc: e1c470b2 strh r7, [r4, #2] + 1f4e1d0: e5c45000 strb r5, [r4] + 1f4e1d4: e5c45004 strb r5, [r4, #4] + 1f4e1d8: e5c45005 strb r5, [r4, #5] + 1f4e1dc: e5c45006 strb r5, [r4, #6] + 1f4e1e0: e5c45007 strb r5, [r4, #7] + 1f4e1e4: e58d4000 str r4, [sp] + 1f4e1e8: eb00059e bl 1f4f868 + 1f4e1ec: e1a00006 mov r0, r6 + 1f4e1f0: e28d100c add r1, sp, #12 + 1f4e1f4: ebfffe73 bl 1f4dbc8 + 1f4e1f8: e2506000 subs r6, r0, #0 + 1f4e1fc: 0a00000f beq 1f4e240 + 1f4e200: e28d000c add r0, sp, #12 + 1f4e204: eb0005b2 bl 1f4f8d4 + 1f4e208: e1a06000 mov r6, r0 + 1f4e20c: e1a00004 mov r0, r4 + 1f4e210: ebffc0dc bl 1f3e588 + 1f4e214: e28d000c add r0, sp, #12 + 1f4e218: eb00059f bl 1f4f89c <_USBRequest> + 1f4e21c: e1560005 cmp r6, r5 + 1f4e220: b1a06005 movlt r6, r5 + 1f4e224: ba000002 blt 1f4e234 + 1f4e228: e3a00032 mov r0, #50 ; 0x32 + 1f4e22c: e3a06001 mov r6, #1 + 1f4e230: ebfecc5e bl 1f013b0 + 1f4e234: e1a00006 mov r0, r6 + 1f4e238: e28dd030 add sp, sp, #48 ; 0x30 + 1f4e23c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f4e240: e1a00004 mov r0, r4 + 1f4e244: ebffc0cf bl 1f3e588 + 1f4e248: e28d000c add r0, sp, #12 + 1f4e24c: eb000592 bl 1f4f89c <_USBRequest> + 1f4e250: eafffff7 b 1f4e234 + +01f4e254 : + 1f4e254: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f4e258: e0807101 add r7, r0, r1, lsl #2 + 1f4e25c: e1a05000 mov r5, r0 + 1f4e260: e24dd01c sub sp, sp, #28 + 1f4e264: e1a06001 mov r6, r1 + 1f4e268: e5974008 ldr r4, [r7, #8] + 1f4e26c: e1a00004 mov r0, r4 + 1f4e270: eb000349 bl 1f4ef9c + 1f4e274: e1a0a000 mov sl, r0 + 1f4e278: e1a00004 mov r0, r4 + 1f4e27c: eb000344 bl 1f4ef94 + 1f4e280: e1a09000 mov r9, r0 + 1f4e284: e1a00004 mov r0, r4 + 1f4e288: eb0002e6 bl 1f4ee28 + 1f4e28c: e3500000 cmp r0, #0 + 1f4e290: 0a00005d beq 1f4e40c + 1f4e294: e3500001 cmp r0, #1 + 1f4e298: 1a00002a bne 1f4e348 + 1f4e29c: e1a00004 mov r0, r4 + 1f4e2a0: eb000312 bl 1f4eef0 + 1f4e2a4: e1a08000 mov r8, r0 + 1f4e2a8: e1a00004 mov r0, r4 + 1f4e2ac: eb000311 bl 1f4eef8 + 1f4e2b0: e1a01000 mov r1, r0 + 1f4e2b4: e1a00008 mov r0, r8 + 1f4e2b8: eb002013 bl 1f5630c + 1f4e2bc: f57ff05f dmb sy + 1f4e2c0: e3a01e51 mov r1, #1296 ; 0x510 + 1f4e2c4: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4e2c8: e1a08286 lsl r8, r6, #5 + 1f4e2cc: e1a0000d mov r0, sp + 1f4e2d0: e0881001 add r1, r8, r1 + 1f4e2d4: eb0001c7 bl 1f4e9f8 + 1f4e2d8: e1a0000d mov r0, sp + 1f4e2dc: eb0001d0 bl 1f4ea24 + 1f4e2e0: e3001508 movw r1, #1288 ; 0x508 + 1f4e2e4: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4e2e8: e0881001 add r1, r8, r1 + 1f4e2ec: e28d000c add r0, sp, #12 + 1f4e2f0: eb0001c0 bl 1f4e9f8 + 1f4e2f4: e28d000c add r0, sp, #12 + 1f4e2f8: eb0001c9 bl 1f4ea24 + 1f4e2fc: e3500002 cmp r0, #2 + 1f4e300: 0a00003c beq 1f4e3f8 + 1f4e304: e28d000c add r0, sp, #12 + 1f4e308: eb0001c5 bl 1f4ea24 + 1f4e30c: e1a08000 mov r8, r0 + 1f4e310: e1a0000d mov r0, sp + 1f4e314: eb0001cd bl 1f4ea50 + 1f4e318: e1a0b000 mov fp, r0 + 1f4e31c: e1a0000d mov r0, sp + 1f4e320: eb0001ca bl 1f4ea50 + 1f4e324: e7e929db ubfx r2, fp, #19, #10 + 1f4e328: e7f23050 ubfx r3, r0, #0, #19 + 1f4e32c: e1a01008 mov r1, r8 + 1f4e330: e1a00004 mov r0, r4 + 1f4e334: eb000277 bl 1f4ed18 + 1f4e338: e28d000c add r0, sp, #12 + 1f4e33c: eb0001b5 bl 1f4ea18 <_DWHCIRegister> + 1f4e340: e1a0000d mov r0, sp + 1f4e344: eb0001b3 bl 1f4ea18 <_DWHCIRegister> + 1f4e348: e1a00004 mov r0, r4 + 1f4e34c: eb0002b1 bl 1f4ee18 + 1f4e350: e3500001 cmp r0, #1 + 1f4e354: e1a08000 mov r8, r0 + 1f4e358: 0a000030 beq 1f4e420 + 1f4e35c: 3a000040 bcc 1f4e464 + 1f4e360: e3500002 cmp r0, #2 + 1f4e364: 1a000026 bne 1f4e404 + 1f4e368: e1a00004 mov r0, r4 + 1f4e36c: eb0002fd bl 1f4ef68 + 1f4e370: e300278c movw r2, #1932 ; 0x78c + 1f4e374: e0022000 and r2, r2, r0 + 1f4e378: e3520000 cmp r2, #0 + 1f4e37c: 1a000099 bne 1f4e5e8 + 1f4e380: e1a01000 mov r1, r0 + 1f4e384: e59a300c ldr r3, [sl, #12] + 1f4e388: e1a0000a mov r0, sl + 1f4e38c: e12fff33 blx r3 + 1f4e390: e59a3008 ldr r3, [sl, #8] + 1f4e394: e1a0000a mov r0, sl + 1f4e398: e12fff33 blx r3 + 1f4e39c: e3500000 cmp r0, #0 + 1f4e3a0: 1a000014 bne 1f4e3f8 + 1f4e3a4: e1a00004 mov r0, r4 + 1f4e3a8: eb0002f0 bl 1f4ef70 + 1f4e3ac: e3500000 cmp r0, #0 + 1f4e3b0: 1a00005e bne 1f4e530 + 1f4e3b4: e1a00004 mov r0, r4 + 1f4e3b8: eb00029c bl 1f4ee30 + 1f4e3bc: e2508000 subs r8, r0, #0 + 1f4e3c0: 0a000096 beq 1f4e620 + 1f4e3c4: e1a00004 mov r0, r4 + 1f4e3c8: eb00029c bl 1f4ee40 + 1f4e3cc: e2506000 subs r6, r0, #0 + 1f4e3d0: 1a0000ac bne 1f4e688 + 1f4e3d4: e3a01001 mov r1, #1 + 1f4e3d8: e1a00004 mov r0, r4 + 1f4e3dc: eb00028b bl 1f4ee10 + 1f4e3e0: e1a00004 mov r0, r4 + 1f4e3e4: e1a01006 mov r1, r6 + 1f4e3e8: eb000286 bl 1f4ee08 + 1f4e3ec: e59a3004 ldr r3, [sl, #4] + 1f4e3f0: e1a0000a mov r0, sl + 1f4e3f4: e12fff33 blx r3 + 1f4e3f8: e1a01004 mov r1, r4 + 1f4e3fc: e1a00005 mov r0, r5 + 1f4e400: ebfffcfa bl 1f4d7f0 + 1f4e404: e28dd01c add sp, sp, #28 + 1f4e408: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f4e40c: e1a01004 mov r1, r4 + 1f4e410: e1a00005 mov r0, r5 + 1f4e414: ebfffc16 bl 1f4d474 + 1f4e418: e28dd01c add sp, sp, #28 + 1f4e41c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f4e420: e1a00004 mov r0, r4 + 1f4e424: eb0002cf bl 1f4ef68 + 1f4e428: e30027dc movw r2, #2012 ; 0x7dc + 1f4e42c: e0022000 and r2, r2, r0 + 1f4e430: e3520000 cmp r2, #0 + 1f4e434: 1a000056 bne 1f4e594 + 1f4e438: e1a01000 mov r1, r0 + 1f4e43c: e59a300c ldr r3, [sl, #12] + 1f4e440: e1a0000a mov r0, sl + 1f4e444: e12fff33 blx r3 + 1f4e448: e1a00004 mov r0, r4 + 1f4e44c: e3a01002 mov r1, #2 + 1f4e450: eb00026e bl 1f4ee10 + 1f4e454: e1a01008 mov r1, r8 + 1f4e458: e1a00004 mov r0, r4 + 1f4e45c: eb000269 bl 1f4ee08 + 1f4e460: eaffffca b 1f4e390 + 1f4e464: e1a00004 mov r0, r4 + 1f4e468: eb0002be bl 1f4ef68 + 1f4e46c: e300278c movw r2, #1932 ; 0x78c + 1f4e470: e0022000 and r2, r2, r0 + 1f4e474: e3520000 cmp r2, #0 + 1f4e478: 1a000094 bne 1f4e6d0 + 1f4e47c: e3100050 tst r0, #80 ; 0x50 + 1f4e480: 0a000003 beq 1f4e494 + 1f4e484: e1a00004 mov r0, r4 + 1f4e488: eb00026c bl 1f4ee40 + 1f4e48c: e3500000 cmp r0, #0 + 1f4e490: 1a00007c bne 1f4e688 + 1f4e494: e1a00004 mov r0, r4 + 1f4e498: eb000292 bl 1f4eee8 + 1f4e49c: e3500000 cmp r0, #0 + 1f4e4a0: 0a000095 beq 1f4e6fc + 1f4e4a4: e3a01001 mov r1, #1 + 1f4e4a8: e1a00009 mov r0, r9 + 1f4e4ac: eb000502 bl 1f4f8bc + 1f4e4b0: e3001418 movw r1, #1048 ; 0x418 + 1f4e4b4: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4e4b8: e28d000c add r0, sp, #12 + 1f4e4bc: eb00014d bl 1f4e9f8 + 1f4e4c0: eb001f73 bl 1f56294 + 1f4e4c4: e28d000c add r0, sp, #12 + 1f4e4c8: eb000155 bl 1f4ea24 + 1f4e4cc: e3a03001 mov r3, #1 + 1f4e4d0: e28d000c add r0, sp, #12 + 1f4e4d4: e1e06613 mvn r6, r3, lsl r6 + 1f4e4d8: e1a01006 mov r1, r6 + 1f4e4dc: eb000166 bl 1f4ea7c + 1f4e4e0: e28d000c add r0, sp, #12 + 1f4e4e4: eb000155 bl 1f4ea40 + 1f4e4e8: eb001f78 bl 1f562d0 + 1f4e4ec: e28d000c add r0, sp, #12 + 1f4e4f0: eb000148 bl 1f4ea18 <_DWHCIRegister> + 1f4e4f4: e1a00004 mov r0, r4 + 1f4e4f8: eb0001ef bl 1f4ecbc <_DWHCITransferStageData> + 1f4e4fc: e1a00004 mov r0, r4 + 1f4e500: ebffc020 bl 1f3e588 + 1f4e504: e3a03000 mov r3, #0 + 1f4e508: e5873008 str r3, [r7, #8] + 1f4e50c: eb001f60 bl 1f56294 + 1f4e510: e5953004 ldr r3, [r5, #4] + 1f4e514: e0066003 and r6, r6, r3 + 1f4e518: e5856004 str r6, [r5, #4] + 1f4e51c: eb001f6b bl 1f562d0 + 1f4e520: e1a00009 mov r0, r9 + 1f4e524: eb0004f6 bl 1f4f904 + 1f4e528: e28dd01c add sp, sp, #28 + 1f4e52c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f4e530: e28d000c add r0, sp, #12 + 1f4e534: e3001418 movw r1, #1048 ; 0x418 + 1f4e538: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4e53c: eb00012d bl 1f4e9f8 + 1f4e540: eb001f53 bl 1f56294 + 1f4e544: e28d000c add r0, sp, #12 + 1f4e548: eb000135 bl 1f4ea24 + 1f4e54c: e3a03001 mov r3, #1 + 1f4e550: e28d000c add r0, sp, #12 + 1f4e554: e1e06613 mvn r6, r3, lsl r6 + 1f4e558: e1a01006 mov r1, r6 + 1f4e55c: eb000146 bl 1f4ea7c + 1f4e560: e28d000c add r0, sp, #12 + 1f4e564: eb000135 bl 1f4ea40 + 1f4e568: eb001f58 bl 1f562d0 + 1f4e56c: e28d000c add r0, sp, #12 + 1f4e570: eb000128 bl 1f4ea18 <_DWHCIRegister> + 1f4e574: e1a00004 mov r0, r4 + 1f4e578: eb00025a bl 1f4eee8 + 1f4e57c: e3500000 cmp r0, #0 + 1f4e580: 0a000063 beq 1f4e714 + 1f4e584: e3a01001 mov r1, #1 + 1f4e588: e1a00009 mov r0, r9 + 1f4e58c: eb0004ca bl 1f4f8bc + 1f4e590: eaffffd7 b 1f4e4f4 + 1f4e594: e1a03000 mov r3, r0 + 1f4e598: e1a01008 mov r1, r8 + 1f4e59c: e3032328 movw r2, #13096 ; 0x3328 + 1f4e5a0: e34021f6 movt r2, #502 ; 0x1f6 + 1f4e5a4: e3030278 movw r0, #12920 ; 0x3278 + 1f4e5a8: e34001f6 movt r0, #502 ; 0x1f6 + 1f4e5ac: ebfecb35 bl 1f01288 + 1f4e5b0: e3a01000 mov r1, #0 + 1f4e5b4: e1a00009 mov r0, r9 + 1f4e5b8: e1e06618 mvn r6, r8, lsl r6 + 1f4e5bc: eb0004be bl 1f4f8bc + 1f4e5c0: e28d000c add r0, sp, #12 + 1f4e5c4: e3001418 movw r1, #1048 ; 0x418 + 1f4e5c8: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4e5cc: eb000109 bl 1f4e9f8 + 1f4e5d0: eb001f2f bl 1f56294 + 1f4e5d4: e28d000c add r0, sp, #12 + 1f4e5d8: eb000111 bl 1f4ea24 + 1f4e5dc: e1a01006 mov r1, r6 + 1f4e5e0: e28d000c add r0, sp, #12 + 1f4e5e4: eaffffbc b 1f4e4dc + 1f4e5e8: e1a03000 mov r3, r0 + 1f4e5ec: e3a01001 mov r1, #1 + 1f4e5f0: e3032328 movw r2, #13096 ; 0x3328 + 1f4e5f4: e34021f6 movt r2, #502 ; 0x1f6 + 1f4e5f8: e3030278 movw r0, #12920 ; 0x3278 + 1f4e5fc: e34001f6 movt r0, #502 ; 0x1f6 + 1f4e600: ebfecb20 bl 1f01288 + 1f4e604: e3a01000 mov r1, #0 + 1f4e608: e1a00009 mov r0, r9 + 1f4e60c: eb0004aa bl 1f4f8bc + 1f4e610: e3001418 movw r1, #1048 ; 0x418 + 1f4e614: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4e618: e28d000c add r0, sp, #12 + 1f4e61c: eaffffa6 b 1f4e4bc + 1f4e620: e1a01008 mov r1, r8 + 1f4e624: e1a00009 mov r0, r9 + 1f4e628: eb0004a3 bl 1f4f8bc + 1f4e62c: e28d000c add r0, sp, #12 + 1f4e630: e3001418 movw r1, #1048 ; 0x418 + 1f4e634: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4e638: eb0000ee bl 1f4e9f8 + 1f4e63c: eb001f14 bl 1f56294 + 1f4e640: e28d000c add r0, sp, #12 + 1f4e644: eb0000f6 bl 1f4ea24 + 1f4e648: e3a03001 mov r3, #1 + 1f4e64c: e28d000c add r0, sp, #12 + 1f4e650: e1e06613 mvn r6, r3, lsl r6 + 1f4e654: e1a01006 mov r1, r6 + 1f4e658: eb000107 bl 1f4ea7c + 1f4e65c: e28d000c add r0, sp, #12 + 1f4e660: eb0000f6 bl 1f4ea40 + 1f4e664: eb001f19 bl 1f562d0 + 1f4e668: e28d000c add r0, sp, #12 + 1f4e66c: eb0000e9 bl 1f4ea18 <_DWHCIRegister> + 1f4e670: e1a00004 mov r0, r4 + 1f4e674: eb000190 bl 1f4ecbc <_DWHCITransferStageData> + 1f4e678: e1a00004 mov r0, r4 + 1f4e67c: ebffbfc1 bl 1f3e588 + 1f4e680: e5878008 str r8, [r7, #8] + 1f4e684: eaffffa0 b 1f4e50c + 1f4e688: e3a01003 mov r1, #3 + 1f4e68c: e1a00004 mov r0, r4 + 1f4e690: eb0001de bl 1f4ee10 + 1f4e694: e1a00009 mov r0, r9 + 1f4e698: eb000485 bl 1f4f8b4 + 1f4e69c: eb000453 bl 1f4f7f0 + 1f4e6a0: e3a03064 mov r3, #100 ; 0x64 + 1f4e6a4: e304cdd3 movw ip, #19923 ; 0x4dd3 + 1f4e6a8: e341c062 movt ip, #4194 ; 0x1062 + 1f4e6ac: e0000093 mul r0, r3, r0 + 1f4e6b0: e1a02004 mov r2, r4 + 1f4e6b4: e1a03005 mov r3, r5 + 1f4e6b8: e30d18c0 movw r1, #55488 ; 0xd8c0 + 1f4e6bc: e34011f4 movt r1, #500 ; 0x1f4 + 1f4e6c0: e0854c90 umull r4, r5, r0, ip + 1f4e6c4: e1a00325 lsr r0, r5, #6 + 1f4e6c8: ebfecb47 bl 1f013ec + 1f4e6cc: eaffff4c b 1f4e404 + 1f4e6d0: e1a03000 mov r3, r0 + 1f4e6d4: e3a01001 mov r1, #1 + 1f4e6d8: e3032328 movw r2, #13096 ; 0x3328 + 1f4e6dc: e34021f6 movt r2, #502 ; 0x1f6 + 1f4e6e0: e3030278 movw r0, #12920 ; 0x3278 + 1f4e6e4: e34001f6 movt r0, #502 ; 0x1f6 + 1f4e6e8: ebfecae6 bl 1f01288 + 1f4e6ec: e3a01000 mov r1, #0 + 1f4e6f0: e1a00009 mov r0, r9 + 1f4e6f4: eb000470 bl 1f4f8bc + 1f4e6f8: eaffff6c b 1f4e4b0 + 1f4e6fc: e1a00004 mov r0, r4 + 1f4e700: eb00021e bl 1f4ef80 + 1f4e704: e1a01000 mov r1, r0 + 1f4e708: e1a00009 mov r0, r9 + 1f4e70c: eb00046c bl 1f4f8c4 + 1f4e710: eaffff63 b 1f4e4a4 + 1f4e714: e1a00004 mov r0, r4 + 1f4e718: eb000218 bl 1f4ef80 + 1f4e71c: e1a01000 mov r1, r0 + 1f4e720: e1a00009 mov r0, r9 + 1f4e724: eb000466 bl 1f4f8c4 + 1f4e728: eaffff95 b 1f4e584 + +01f4e72c : + 1f4e72c: e92d40f0 push {r4, r5, r6, r7, lr} + 1f4e730: e1a07000 mov r7, r0 + 1f4e734: e24dd02c sub sp, sp, #44 ; 0x2c + 1f4e738: f57ff05f dmb sy + 1f4e73c: e3a01014 mov r1, #20 + 1f4e740: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4e744: e28d0004 add r0, sp, #4 + 1f4e748: eb0000aa bl 1f4e9f8 + 1f4e74c: e28d0004 add r0, sp, #4 + 1f4e750: eb0000b3 bl 1f4ea24 + 1f4e754: e28d0004 add r0, sp, #4 + 1f4e758: eb0000bc bl 1f4ea50 + 1f4e75c: e3100402 tst r0, #33554432 ; 0x2000000 + 1f4e760: 1a000006 bne 1f4e780 + 1f4e764: e28d0004 add r0, sp, #4 + 1f4e768: eb0000b4 bl 1f4ea40 + 1f4e76c: f57ff05f dmb sy + 1f4e770: e28d0004 add r0, sp, #4 + 1f4e774: eb0000a7 bl 1f4ea18 <_DWHCIRegister> + 1f4e778: e28dd02c add sp, sp, #44 ; 0x2c + 1f4e77c: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f4e780: e28d0010 add r0, sp, #16 + 1f4e784: e3001414 movw r1, #1044 ; 0x414 + 1f4e788: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4e78c: eb000099 bl 1f4e9f8 + 1f4e790: e28d0010 add r0, sp, #16 + 1f4e794: eb0000a2 bl 1f4ea24 + 1f4e798: e28d0010 add r0, sp, #16 + 1f4e79c: eb0000a7 bl 1f4ea40 + 1f4e7a0: e5973000 ldr r3, [r7] + 1f4e7a4: e3530000 cmp r3, #0 + 1f4e7a8: 1300650c movwne r6, #1292 ; 0x50c + 1f4e7ac: 13a04000 movne r4, #0 + 1f4e7b0: 13436f98 movtne r6, #16280 ; 0x3f98 + 1f4e7b4: 13a05001 movne r5, #1 + 1f4e7b8: 1a000005 bne 1f4e7d4 + 1f4e7bc: ea000015 b 1f4e818 + 1f4e7c0: e5973000 ldr r3, [r7] + 1f4e7c4: e2844001 add r4, r4, #1 + 1f4e7c8: e2866020 add r6, r6, #32 + 1f4e7cc: e1530004 cmp r3, r4 + 1f4e7d0: 9a000010 bls 1f4e818 + 1f4e7d4: e28d0010 add r0, sp, #16 + 1f4e7d8: eb00009c bl 1f4ea50 + 1f4e7dc: e1100005 tst r0, r5 + 1f4e7e0: e1a05085 lsl r5, r5, #1 + 1f4e7e4: 0afffff5 beq 1f4e7c0 + 1f4e7e8: e3a02000 mov r2, #0 + 1f4e7ec: e1a01006 mov r1, r6 + 1f4e7f0: e28d001c add r0, sp, #28 + 1f4e7f4: eb000083 bl 1f4ea08 + 1f4e7f8: e28d001c add r0, sp, #28 + 1f4e7fc: eb00008f bl 1f4ea40 + 1f4e800: e1a00007 mov r0, r7 + 1f4e804: e1a01004 mov r1, r4 + 1f4e808: ebfffe91 bl 1f4e254 + 1f4e80c: e28d001c add r0, sp, #28 + 1f4e810: eb000080 bl 1f4ea18 <_DWHCIRegister> + 1f4e814: eaffffe9 b 1f4e7c0 + 1f4e818: e28d0010 add r0, sp, #16 + 1f4e81c: eb00007d bl 1f4ea18 <_DWHCIRegister> + 1f4e820: eaffffcf b 1f4e764 + +01f4e824 : + 1f4e824: e92d4070 push {r4, r5, r6, lr} + 1f4e828: e1a05000 mov r5, r0 + 1f4e82c: eb001e98 bl 1f56294 + 1f4e830: e5951000 ldr r1, [r5] + 1f4e834: e3510000 cmp r1, #0 + 1f4e838: 0a00000c beq 1f4e870 + 1f4e83c: e5954004 ldr r4, [r5, #4] + 1f4e840: e2144001 ands r4, r4, #1 + 1f4e844: 0a00000c beq 1f4e87c + 1f4e848: e3a04000 mov r4, #0 + 1f4e84c: e3a03001 mov r3, #1 + 1f4e850: ea000002 b 1f4e860 + 1f4e854: e5952004 ldr r2, [r5, #4] + 1f4e858: e1120003 tst r2, r3 + 1f4e85c: 0a000007 beq 1f4e880 + 1f4e860: e2844001 add r4, r4, #1 + 1f4e864: e1a03083 lsl r3, r3, #1 + 1f4e868: e1540001 cmp r4, r1 + 1f4e86c: 1afffff8 bne 1f4e854 + 1f4e870: eb001e96 bl 1f562d0 + 1f4e874: e3a00010 mov r0, #16 + 1f4e878: e8bd8070 pop {r4, r5, r6, pc} + 1f4e87c: e3a03001 mov r3, #1 + 1f4e880: e5952004 ldr r2, [r5, #4] + 1f4e884: e1823003 orr r3, r2, r3 + 1f4e888: e5853004 str r3, [r5, #4] + 1f4e88c: eb001e8f bl 1f562d0 + 1f4e890: e1a00004 mov r0, r4 + 1f4e894: e8bd8070 pop {r4, r5, r6, pc} + +01f4e898 : + 1f4e898: e92d4070 push {r4, r5, r6, lr} + 1f4e89c: e1a04000 mov r4, r0 + 1f4e8a0: e1a05001 mov r5, r1 + 1f4e8a4: eb001e7a bl 1f56294 + 1f4e8a8: e3a01001 mov r1, #1 + 1f4e8ac: e5943004 ldr r3, [r4, #4] + 1f4e8b0: e1c31511 bic r1, r3, r1, lsl r5 + 1f4e8b4: e5841004 str r1, [r4, #4] + 1f4e8b8: e8bd4070 pop {r4, r5, r6, lr} + 1f4e8bc: ea001e83 b 1f562d0 + +01f4e8c0 : + 1f4e8c0: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f4e8c4: e59d4018 ldr r4, [sp, #24] + 1f4e8c8: e1a07001 mov r7, r1 + 1f4e8cc: e1a06002 mov r6, r2 + 1f4e8d0: e1a05003 mov r5, r3 + 1f4e8d4: ea000002 b 1f4e8e4 + 1f4e8d8: ebfecab4 bl 1f013b0 + 1f4e8dc: e2544001 subs r4, r4, #1 + 1f4e8e0: 0a00000b beq 1f4e914 + 1f4e8e4: e1a00007 mov r0, r7 + 1f4e8e8: eb00004d bl 1f4ea24 + 1f4e8ec: e16f3f15 clz r3, r5 + 1f4e8f0: e1100006 tst r0, r6 + 1f4e8f4: 11a032a3 lsrne r3, r3, #5 + 1f4e8f8: 1a000001 bne 1f4e904 + 1f4e8fc: e2953000 adds r3, r5, #0 + 1f4e900: 13a03001 movne r3, #1 + 1f4e904: e3530000 cmp r3, #0 + 1f4e908: e3a00001 mov r0, #1 + 1f4e90c: 1afffff1 bne 1f4e8d8 + 1f4e910: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f4e914: e1a00004 mov r0, r4 + 1f4e918: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f4e91c : + 1f4e91c: e92d4010 push {r4, lr} + 1f4e920: e3a01d11 mov r1, #1088 ; 0x440 + 1f4e924: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4e928: e24dd010 sub sp, sp, #16 + 1f4e92c: e28d0004 add r0, sp, #4 + 1f4e930: eb000030 bl 1f4e9f8 + 1f4e934: e28d0004 add r0, sp, #4 + 1f4e938: eb000039 bl 1f4ea24 + 1f4e93c: e7e108d0 ubfx r0, r0, #17, #2 + 1f4e940: e3500003 cmp r0, #3 + 1f4e944: 13033350 movwne r3, #13136 ; 0x3350 + 1f4e948: 01a04000 moveq r4, r0 + 1f4e94c: 134031f6 movtne r3, #502 ; 0x1f6 + 1f4e950: 17d34000 ldrbne r4, [r3, r0] + 1f4e954: e28d0004 add r0, sp, #4 + 1f4e958: eb00002e bl 1f4ea18 <_DWHCIRegister> + 1f4e95c: e1a00004 mov r0, r4 + 1f4e960: e28dd010 add sp, sp, #16 + 1f4e964: e8bd8010 pop {r4, pc} + +01f4e968 : + 1f4e968: e92d4010 push {r4, lr} + 1f4e96c: e3a01d11 mov r1, #1088 ; 0x440 + 1f4e970: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4e974: e24dd010 sub sp, sp, #16 + 1f4e978: e28d0004 add r0, sp, #4 + 1f4e97c: eb00001d bl 1f4e9f8 + 1f4e980: e28d0004 add r0, sp, #4 + 1f4e984: eb000026 bl 1f4ea24 + 1f4e988: e2104010 ands r4, r0, #16 + 1f4e98c: e28d0004 add r0, sp, #4 + 1f4e990: 1a000003 bne 1f4e9a4 + 1f4e994: eb00001f bl 1f4ea18 <_DWHCIRegister> + 1f4e998: e1a00004 mov r0, r4 + 1f4e99c: e28dd010 add sp, sp, #16 + 1f4e9a0: e8bd8010 pop {r4, pc} + 1f4e9a4: eb00001b bl 1f4ea18 <_DWHCIRegister> + 1f4e9a8: e3a00001 mov r0, #1 + 1f4e9ac: e28dd010 add sp, sp, #16 + 1f4e9b0: e8bd8010 pop {r4, pc} + +01f4e9b4 : + 1f4e9b4: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f4e9b8: e3a01d11 mov r1, #1088 ; 0x440 + 1f4e9bc: e3431f98 movt r1, #16280 ; 0x3f98 + 1f4e9c0: e24dd014 sub sp, sp, #20 + 1f4e9c4: e28d0004 add r0, sp, #4 + 1f4e9c8: eb00000a bl 1f4e9f8 + 1f4e9cc: e28d0004 add r0, sp, #4 + 1f4e9d0: eb000013 bl 1f4ea24 + 1f4e9d4: e3e01a01 mvn r1, #4096 ; 0x1000 + 1f4e9d8: e28d0004 add r0, sp, #4 + 1f4e9dc: eb000026 bl 1f4ea7c + 1f4e9e0: e28d0004 add r0, sp, #4 + 1f4e9e4: eb000015 bl 1f4ea40 + 1f4e9e8: e28d0004 add r0, sp, #4 + 1f4e9ec: eb000009 bl 1f4ea18 <_DWHCIRegister> + 1f4e9f0: e28dd014 add sp, sp, #20 + 1f4e9f4: e49df004 pop {pc} ; (ldr pc, [sp], #4) + +01f4e9f8 : + 1f4e9f8: e3a03000 mov r3, #0 + 1f4e9fc: e5801004 str r1, [r0, #4] + 1f4ea00: e5803000 str r3, [r0] + 1f4ea04: e12fff1e bx lr + +01f4ea08 : + 1f4ea08: e3a03001 mov r3, #1 + 1f4ea0c: e5803000 str r3, [r0] + 1f4ea10: e9800006 stmib r0, {r1, r2} + 1f4ea14: e12fff1e bx lr + +01f4ea18 <_DWHCIRegister>: + 1f4ea18: e3a03000 mov r3, #0 + 1f4ea1c: e5803000 str r3, [r0] + 1f4ea20: e12fff1e bx lr + +01f4ea24 : + 1f4ea24: e5901004 ldr r1, [r0, #4] + 1f4ea28: e1a03000 mov r3, r0 + 1f4ea2c: e3a02001 mov r2, #1 + 1f4ea30: e5910000 ldr r0, [r1] + 1f4ea34: e5830008 str r0, [r3, #8] + 1f4ea38: e5832000 str r2, [r3] + 1f4ea3c: e12fff1e bx lr + +01f4ea40 : + 1f4ea40: e5903004 ldr r3, [r0, #4] + 1f4ea44: e5902008 ldr r2, [r0, #8] + 1f4ea48: e5832000 str r2, [r3] + 1f4ea4c: e12fff1e bx lr + +01f4ea50 : + 1f4ea50: e5900008 ldr r0, [r0, #8] + 1f4ea54: e12fff1e bx lr + +01f4ea58 : + 1f4ea58: e3a03001 mov r3, #1 + 1f4ea5c: e5801008 str r1, [r0, #8] + 1f4ea60: e5803000 str r3, [r0] + 1f4ea64: e12fff1e bx lr + +01f4ea68 : + 1f4ea68: e5903008 ldr r3, [r0, #8] + 1f4ea6c: e1110003 tst r1, r3 + 1f4ea70: 13a00001 movne r0, #1 + 1f4ea74: 03a00000 moveq r0, #0 + 1f4ea78: e12fff1e bx lr + +01f4ea7c : + 1f4ea7c: e5903008 ldr r3, [r0, #8] + 1f4ea80: e0011003 and r1, r1, r3 + 1f4ea84: e5801008 str r1, [r0, #8] + 1f4ea88: e12fff1e bx lr + +01f4ea8c : + 1f4ea8c: e5903008 ldr r3, [r0, #8] + 1f4ea90: e1831001 orr r1, r3, r1 + 1f4ea94: e5801008 str r1, [r0, #8] + 1f4ea98: e12fff1e bx lr + +01f4ea9c : + 1f4ea9c: e5903008 ldr r3, [r0, #8] + 1f4eaa0: e3a02001 mov r2, #1 + 1f4eaa4: e1c31112 bic r1, r3, r2, lsl r1 + 1f4eaa8: e5801008 str r1, [r0, #8] + 1f4eaac: e12fff1e bx lr + +01f4eab0 : + 1f4eab0: e5903008 ldr r3, [r0, #8] + 1f4eab4: e3a02001 mov r2, #1 + 1f4eab8: e1831112 orr r1, r3, r2, lsl r1 + 1f4eabc: e5801008 str r1, [r0, #8] + 1f4eac0: e12fff1e bx lr + +01f4eac4 : + 1f4eac4: e3a02000 mov r2, #0 + 1f4eac8: e3a03001 mov r3, #1 + 1f4eacc: e5802008 str r2, [r0, #8] + 1f4ead0: e5803000 str r3, [r0] + 1f4ead4: e12fff1e bx lr + +01f4ead8 : + 1f4ead8: e3e02000 mvn r2, #0 + 1f4eadc: e3a03001 mov r3, #1 + 1f4eae0: e5802008 str r2, [r0, #8] + 1f4eae4: e5803000 str r3, [r0] + 1f4eae8: e12fff1e bx lr + +01f4eaec : + 1f4eaec: f2c00050 vmov.i32 q8, #0 ; 0x00000000 + 1f4eaf0: e92d4070 push {r4, r5, r6, lr} + 1f4eaf4: e1a04000 mov r4, r0 + 1f4eaf8: e280e038 add lr, r0, #56 ; 0x38 + 1f4eafc: e59d6010 ldr r6, [sp, #16] + 1f4eb00: e3a0c000 mov ip, #0 + 1f4eb04: e5801000 str r1, [r0] + 1f4eb08: e1a00002 mov r0, r2 + 1f4eb0c: e984004c stmib r4, {r2, r3, r6} + 1f4eb10: e584c014 str ip, [r4, #20] + 1f4eb14: f44e0a8f vst1.32 {d16-d17}, [lr] + 1f4eb18: e584c048 str ip, [r4, #72] ; 0x48 + 1f4eb1c: e1a05002 mov r5, r2 + 1f4eb20: e584c050 str ip, [r4, #80] ; 0x50 + 1f4eb24: eb000362 bl 1f4f8b4 + 1f4eb28: e584001c str r0, [r4, #28] + 1f4eb2c: eb000323 bl 1f4f7c0 + 1f4eb30: e5840018 str r0, [r4, #24] + 1f4eb34: eb0002b2 bl 1f4f604 + 1f4eb38: e5c40020 strb r0, [r4, #32] + 1f4eb3c: e594001c ldr r0, [r4, #28] + 1f4eb40: eb000328 bl 1f4f7e8 + 1f4eb44: e5840024 str r0, [r4, #36] ; 0x24 + 1f4eb48: e5940018 ldr r0, [r4, #24] + 1f4eb4c: eb0002ae bl 1f4f60c + 1f4eb50: e3500000 cmp r0, #0 + 1f4eb54: 0a000002 beq 1f4eb64 + 1f4eb58: e5d40020 ldrb r0, [r4, #32] + 1f4eb5c: e2500002 subs r0, r0, #2 + 1f4eb60: 13a00001 movne r0, #1 + 1f4eb64: e3560000 cmp r6, #0 + 1f4eb68: e5840010 str r0, [r4, #16] + 1f4eb6c: 1a000022 bne 1f4ebfc + 1f4eb70: e1a01006 mov r1, r6 + 1f4eb74: e594001c ldr r0, [r4, #28] + 1f4eb78: eb00031e bl 1f4f7f8 + 1f4eb7c: e3500000 cmp r0, #0 + 1f4eb80: e1a00005 mov r0, r5 + 1f4eb84: 0a00003e beq 1f4ec84 + 1f4eb88: eb000355 bl 1f4f8e4 + 1f4eb8c: e584004c str r0, [r4, #76] ; 0x4c + 1f4eb90: e1a00005 mov r0, r5 + 1f4eb94: eb000354 bl 1f4f8ec + 1f4eb98: e5840028 str r0, [r4, #40] ; 0x28 + 1f4eb9c: e5942024 ldr r2, [r4, #36] ; 0x24 + 1f4eba0: e5941010 ldr r1, [r4, #16] + 1f4eba4: e2423001 sub r3, r2, #1 + 1f4eba8: e0833000 add r3, r3, r0 + 1f4ebac: e3510000 cmp r1, #0 + 1f4ebb0: e733f213 udiv r3, r3, r2 + 1f4ebb4: e584302c str r3, [r4, #44] ; 0x2c + 1f4ebb8: 0a000037 beq 1f4ec9c + 1f4ebbc: e1520000 cmp r2, r0 + 1f4ebc0: e3a03001 mov r3, #1 + 1f4ebc4: 21a02000 movcs r2, r0 + 1f4ebc8: e5843034 str r3, [r4, #52] ; 0x34 + 1f4ebcc: e5842030 str r2, [r4, #48] ; 0x30 + 1f4ebd0: e594001c ldr r0, [r4, #28] + 1f4ebd4: eb0002fd bl 1f4f7d0 + 1f4ebd8: e2400002 sub r0, r0, #2 + 1f4ebdc: e6ef0070 uxtb r0, r0 + 1f4ebe0: e3500001 cmp r0, #1 + 1f4ebe4: 9a00002f bls 1f4eca8 + 1f4ebe8: e3a00020 mov r0, #32 + 1f4ebec: ebffbe5d bl 1f3e568 + 1f4ebf0: e5840050 str r0, [r4, #80] ; 0x50 + 1f4ebf4: e8bd4070 pop {r4, r5, r6, lr} + 1f4ebf8: ea0015d6 b 1f54358 + 1f4ebfc: e3a00004 mov r0, #4 + 1f4ec00: ebffbe58 bl 1f3e568 + 1f4ec04: e5941010 ldr r1, [r4, #16] + 1f4ec08: e3a02000 mov r2, #0 + 1f4ec0c: e3a03001 mov r3, #1 + 1f4ec10: e1510002 cmp r1, r2 + 1f4ec14: e5840048 str r0, [r4, #72] ; 0x48 + 1f4ec18: e584004c str r0, [r4, #76] ; 0x4c + 1f4ec1c: e5842028 str r2, [r4, #40] ; 0x28 + 1f4ec20: e5842030 str r2, [r4, #48] ; 0x30 + 1f4ec24: e584302c str r3, [r4, #44] ; 0x2c + 1f4ec28: e5843034 str r3, [r4, #52] ; 0x34 + 1f4ec2c: 1affffe7 bne 1f4ebd0 + 1f4ec30: e5940018 ldr r0, [r4, #24] + 1f4ec34: eb000274 bl 1f4f60c + 1f4ec38: e3500000 cmp r0, #0 + 1f4ec3c: 18bd8070 popne {r4, r5, r6, pc} + 1f4ec40: e5d43020 ldrb r3, [r4, #32] + 1f4ec44: e3530002 cmp r3, #2 + 1f4ec48: 08bd8070 popeq {r4, r5, r6, pc} + 1f4ec4c: e3a00020 mov r0, #32 + 1f4ec50: ebffbe44 bl 1f3e568 + 1f4ec54: e1a05000 mov r5, r0 + 1f4ec58: e594001c ldr r0, [r4, #28] + 1f4ec5c: e5845050 str r5, [r4, #80] ; 0x50 + 1f4ec60: eb0002da bl 1f4f7d0 + 1f4ec64: e2401002 sub r1, r0, #2 + 1f4ec68: e1a00005 mov r0, r5 + 1f4ec6c: e6ef1071 uxtb r1, r1 + 1f4ec70: e3510001 cmp r1, #1 + 1f4ec74: 83a01000 movhi r1, #0 + 1f4ec78: 93a01001 movls r1, #1 + 1f4ec7c: e8bd4070 pop {r4, r5, r6, lr} + 1f4ec80: ea00195f b 1f55204 + 1f4ec84: eb000314 bl 1f4f8dc + 1f4ec88: e3a03008 mov r3, #8 + 1f4ec8c: e584004c str r0, [r4, #76] ; 0x4c + 1f4ec90: e1a00003 mov r0, r3 + 1f4ec94: e5843028 str r3, [r4, #40] ; 0x28 + 1f4ec98: eaffffbf b 1f4eb9c + 1f4ec9c: e5840030 str r0, [r4, #48] ; 0x30 + 1f4eca0: e5843034 str r3, [r4, #52] ; 0x34 + 1f4eca4: eaffffe1 b 1f4ec30 + 1f4eca8: e3a00024 mov r0, #36 ; 0x24 + 1f4ecac: ebffbe2d bl 1f3e568 + 1f4ecb0: e5840050 str r0, [r4, #80] ; 0x50 + 1f4ecb4: e8bd4070 pop {r4, r5, r6, lr} + 1f4ecb8: ea001629 b 1f54564 + +01f4ecbc <_DWHCITransferStageData>: + 1f4ecbc: e92d4070 push {r4, r5, r6, lr} + 1f4ecc0: e1a04000 mov r4, r0 + 1f4ecc4: e5900050 ldr r0, [r0, #80] ; 0x50 + 1f4ecc8: e3500000 cmp r0, #0 + 1f4eccc: 0a000005 beq 1f4ece8 <_DWHCITransferStageData+0x2c> + 1f4ecd0: e5903000 ldr r3, [r0] + 1f4ecd4: e12fff33 blx r3 + 1f4ecd8: e5940050 ldr r0, [r4, #80] ; 0x50 + 1f4ecdc: ebffbe29 bl 1f3e588 + 1f4ece0: e3a03000 mov r3, #0 + 1f4ece4: e5843050 str r3, [r4, #80] ; 0x50 + 1f4ece8: e5940048 ldr r0, [r4, #72] ; 0x48 + 1f4ecec: e3a05000 mov r5, #0 + 1f4ecf0: e584504c str r5, [r4, #76] ; 0x4c + 1f4ecf4: e1500005 cmp r0, r5 + 1f4ecf8: 0a000001 beq 1f4ed04 <_DWHCITransferStageData+0x48> + 1f4ecfc: ebffbe21 bl 1f3e588 + 1f4ed00: e5845048 str r5, [r4, #72] ; 0x48 + 1f4ed04: e3a03000 mov r3, #0 + 1f4ed08: e584301c str r3, [r4, #28] + 1f4ed0c: e5843018 str r3, [r4, #24] + 1f4ed10: e5843004 str r3, [r4, #4] + 1f4ed14: e8bd8070 pop {r4, r5, r6, pc} + +01f4ed18 : + 1f4ed18: e300c7dc movw ip, #2012 ; 0x7dc + 1f4ed1c: e5801044 str r1, [r0, #68] ; 0x44 + 1f4ed20: e00cc001 and ip, ip, r1 + 1f4ed24: e35c0000 cmp ip, #0 + 1f4ed28: 112fff1e bxne lr + 1f4ed2c: e5901010 ldr r1, [r0, #16] + 1f4ed30: e92d4070 push {r4, r5, r6, lr} + 1f4ed34: e3510000 cmp r1, #0 + 1f4ed38: e5905034 ldr r5, [r0, #52] ; 0x34 + 1f4ed3c: e5901030 ldr r1, [r0, #48] ; 0x30 + 1f4ed40: e1a04000 mov r4, r0 + 1f4ed44: e0625005 rsb r5, r2, r5 + 1f4ed48: e0633001 rsb r3, r3, r1 + 1f4ed4c: 1a000013 bne 1f4eda0 + 1f4ed50: e5901038 ldr r1, [r0, #56] ; 0x38 + 1f4ed54: e590204c ldr r2, [r0, #76] ; 0x4c + 1f4ed58: e0811003 add r1, r1, r3 + 1f4ed5c: e5801038 str r1, [r0, #56] ; 0x38 + 1f4ed60: e0823003 add r3, r2, r3 + 1f4ed64: e580304c str r3, [r0, #76] ; 0x4c + 1f4ed68: e1a01005 mov r1, r5 + 1f4ed6c: e594001c ldr r0, [r4, #28] + 1f4ed70: e594200c ldr r2, [r4, #12] + 1f4ed74: eb0002a3 bl 1f4f808 + 1f4ed78: e5940038 ldr r0, [r4, #56] ; 0x38 + 1f4ed7c: e5941030 ldr r1, [r4, #48] ; 0x30 + 1f4ed80: e5943028 ldr r3, [r4, #40] ; 0x28 + 1f4ed84: e594202c ldr r2, [r4, #44] ; 0x2c + 1f4ed88: e0603003 rsb r3, r0, r3 + 1f4ed8c: e1530001 cmp r3, r1 + 1f4ed90: e0655002 rsb r5, r5, r2 + 1f4ed94: 35843030 strcc r3, [r4, #48] ; 0x30 + 1f4ed98: e584502c str r5, [r4, #44] ; 0x2c + 1f4ed9c: e8bd8070 pop {r4, r5, r6, pc} + 1f4eda0: e5902014 ldr r2, [r0, #20] + 1f4eda4: e2920000 adds r0, r2, #0 + 1f4eda8: 13a00001 movne r0, #1 + 1f4edac: e3530000 cmp r3, #0 + 1f4edb0: 13a00000 movne r0, #0 + 1f4edb4: e3500000 cmp r0, #0 + 1f4edb8: 0a000009 beq 1f4ede4 + 1f4edbc: e3510000 cmp r1, #0 + 1f4edc0: 15941024 ldrne r1, [r4, #36] ; 0x24 + 1f4edc4: 10010591 mulne r1, r1, r5 + 1f4edc8: e5942038 ldr r2, [r4, #56] ; 0x38 + 1f4edcc: e594304c ldr r3, [r4, #76] ; 0x4c + 1f4edd0: e0822001 add r2, r2, r1 + 1f4edd4: e5842038 str r2, [r4, #56] ; 0x38 + 1f4edd8: e0831001 add r1, r3, r1 + 1f4eddc: e584104c str r1, [r4, #76] ; 0x4c + 1f4ede0: eaffffe0 b 1f4ed68 + 1f4ede4: e5940038 ldr r0, [r4, #56] ; 0x38 + 1f4ede8: e3520000 cmp r2, #0 + 1f4edec: e594204c ldr r2, [r4, #76] ; 0x4c + 1f4edf0: e0830000 add r0, r3, r0 + 1f4edf4: e5840038 str r0, [r4, #56] ; 0x38 + 1f4edf8: e0823003 add r3, r2, r3 + 1f4edfc: e584304c str r3, [r4, #76] ; 0x4c + 1f4ee00: 0affffde beq 1f4ed80 + 1f4ee04: eaffffd7 b 1f4ed68 + +01f4ee08 : + 1f4ee08: e5801014 str r1, [r0, #20] + 1f4ee0c: e12fff1e bx lr + +01f4ee10 : + 1f4ee10: e580103c str r1, [r0, #60] ; 0x3c + 1f4ee14: e12fff1e bx lr + +01f4ee18 : + 1f4ee18: e590003c ldr r0, [r0, #60] ; 0x3c + 1f4ee1c: e12fff1e bx lr + +01f4ee20 : + 1f4ee20: e5801040 str r1, [r0, #64] ; 0x40 + 1f4ee24: e12fff1e bx lr + +01f4ee28 : + 1f4ee28: e5900040 ldr r0, [r0, #64] ; 0x40 + 1f4ee2c: e12fff1e bx lr + +01f4ee30 : + 1f4ee30: e3a00001 mov r0, #1 + 1f4ee34: e12fff1e bx lr + +01f4ee38 : + 1f4ee38: e5900000 ldr r0, [r0] + 1f4ee3c: e12fff1e bx lr + +01f4ee40 : + 1f4ee40: e92d4010 push {r4, lr} + 1f4ee44: e590001c ldr r0, [r0, #28] + 1f4ee48: eb000260 bl 1f4f7d0 + 1f4ee4c: e2400002 sub r0, r0, #2 + 1f4ee50: e6ef0070 uxtb r0, r0 + 1f4ee54: e3500001 cmp r0, #1 + 1f4ee58: 83a00000 movhi r0, #0 + 1f4ee5c: 93a00001 movls r0, #1 + 1f4ee60: e8bd8010 pop {r4, pc} + +01f4ee64 : + 1f4ee64: e5900018 ldr r0, [r0, #24] + 1f4ee68: ea0001e3 b 1f4f5fc + +01f4ee6c : + 1f4ee6c: e92d4010 push {r4, lr} + 1f4ee70: e590001c ldr r0, [r0, #28] + 1f4ee74: eb000255 bl 1f4f7d0 + 1f4ee78: e3500001 cmp r0, #1 + 1f4ee7c: 0a000003 beq 1f4ee90 + 1f4ee80: e3500002 cmp r0, #2 + 1f4ee84: 03a00003 moveq r0, #3 + 1f4ee88: 13a00000 movne r0, #0 + 1f4ee8c: e8bd8010 pop {r4, pc} + 1f4ee90: e3a00002 mov r0, #2 + 1f4ee94: e8bd8010 pop {r4, pc} + +01f4ee98 : + 1f4ee98: e590001c ldr r0, [r0, #28] + 1f4ee9c: ea000249 b 1f4f7c8 + +01f4eea0 : + 1f4eea0: e5900024 ldr r0, [r0, #36] ; 0x24 + 1f4eea4: e12fff1e bx lr + +01f4eea8 : + 1f4eea8: e5d00020 ldrb r0, [r0, #32] + 1f4eeac: e12fff1e bx lr + +01f4eeb0 : + 1f4eeb0: e590100c ldr r1, [r0, #12] + 1f4eeb4: e92d4010 push {r4, lr} + 1f4eeb8: e590001c ldr r0, [r0, #28] + 1f4eebc: eb00024d bl 1f4f7f8 + 1f4eec0: e3500000 cmp r0, #0 + 1f4eec4: 0a000003 beq 1f4eed8 + 1f4eec8: e3500002 cmp r0, #2 + 1f4eecc: 03a00002 moveq r0, #2 + 1f4eed0: 13a00000 movne r0, #0 + 1f4eed4: e8bd8010 pop {r4, pc} + 1f4eed8: e3a00003 mov r0, #3 + 1f4eedc: e8bd8010 pop {r4, pc} + +01f4eee0 : + 1f4eee0: e5900008 ldr r0, [r0, #8] + 1f4eee4: e12fff1e bx lr + +01f4eee8 : + 1f4eee8: e590000c ldr r0, [r0, #12] + 1f4eeec: e12fff1e bx lr + +01f4eef0 : + 1f4eef0: e590004c ldr r0, [r0, #76] ; 0x4c + 1f4eef4: e12fff1e bx lr + +01f4eef8 : + 1f4eef8: e5900030 ldr r0, [r0, #48] ; 0x30 + 1f4eefc: e12fff1e bx lr + +01f4ef00 : + 1f4ef00: e5900034 ldr r0, [r0, #52] ; 0x34 + 1f4ef04: e12fff1e bx lr + +01f4ef08 : + 1f4ef08: e5900010 ldr r0, [r0, #16] + 1f4ef0c: e12fff1e bx lr + +01f4ef10 : + 1f4ef10: e5900014 ldr r0, [r0, #20] + 1f4ef14: e12fff1e bx lr + +01f4ef18 : + 1f4ef18: e5900018 ldr r0, [r0, #24] + 1f4ef1c: ea0001ba b 1f4f60c + +01f4ef20 : + 1f4ef20: e5900018 ldr r0, [r0, #24] + 1f4ef24: ea0001ba b 1f4f614 + +01f4ef28 : + 1f4ef28: e3a00003 mov r0, #3 + 1f4ef2c: e12fff1e bx lr + +01f4ef30 : + 1f4ef30: e5903010 ldr r3, [r0, #16] + 1f4ef34: e3530000 cmp r3, #0 + 1f4ef38: 0a000001 beq 1f4ef44 + 1f4ef3c: e30007ff movw r0, #2047 ; 0x7ff + 1f4ef40: e12fff1e bx lr + 1f4ef44: e92d4010 push {r4, lr} + 1f4ef48: e590001c ldr r0, [r0, #28] + 1f4ef4c: eb00021f bl 1f4f7d0 + 1f4ef50: e2400002 sub r0, r0, #2 + 1f4ef54: e6ef0070 uxtb r0, r0 + 1f4ef58: e3500001 cmp r0, #1 + 1f4ef5c: 930007ff movwls r0, #2047 ; 0x7ff + 1f4ef60: 8300078f movwhi r0, #1935 ; 0x78f + 1f4ef64: e8bd8010 pop {r4, pc} + +01f4ef68 : + 1f4ef68: e5900044 ldr r0, [r0, #68] ; 0x44 + 1f4ef6c: e12fff1e bx lr + +01f4ef70 : + 1f4ef70: e590002c ldr r0, [r0, #44] ; 0x2c + 1f4ef74: e16f0f10 clz r0, r0 + 1f4ef78: e1a002a0 lsr r0, r0, #5 + 1f4ef7c: e12fff1e bx lr + +01f4ef80 : + 1f4ef80: e5902038 ldr r2, [r0, #56] ; 0x38 + 1f4ef84: e5900028 ldr r0, [r0, #40] ; 0x28 + 1f4ef88: e1520000 cmp r2, r0 + 1f4ef8c: 31a00002 movcc r0, r2 + 1f4ef90: e12fff1e bx lr + +01f4ef94 : + 1f4ef94: e5900004 ldr r0, [r0, #4] + 1f4ef98: e12fff1e bx lr + +01f4ef9c : + 1f4ef9c: e5900050 ldr r0, [r0, #80] ; 0x50 + 1f4efa0: e12fff1e bx lr + +01f4efa4 : + 1f4efa4: e5903018 ldr r3, [r0, #24] + 1f4efa8: e92d4070 push {r4, r5, r6, lr} + 1f4efac: e3530000 cmp r3, #0 + 1f4efb0: 01a04003 moveq r4, r3 + 1f4efb4: 0a000007 beq 1f4efd8 + 1f4efb8: e590100c ldr r1, [r0, #12] + 1f4efbc: e1a05000 mov r5, r0 + 1f4efc0: e5d32005 ldrb r2, [r3, #5] + 1f4efc4: e5900004 ldr r0, [r0, #4] + 1f4efc8: ebfffc70 bl 1f4e190 + 1f4efcc: e2504000 subs r4, r0, #0 + 1f4efd0: 13a04001 movne r4, #1 + 1f4efd4: 0a000001 beq 1f4efe0 + 1f4efd8: e1a00004 mov r0, r4 + 1f4efdc: e8bd8070 pop {r4, r5, r6, pc} + 1f4efe0: e5953018 ldr r3, [r5, #24] + 1f4efe4: e3a01001 mov r1, #1 + 1f4efe8: e3032360 movw r2, #13152 ; 0x3360 + 1f4efec: e34021f6 movt r2, #502 ; 0x1f6 + 1f4eff0: e3030358 movw r0, #13144 ; 0x3358 + 1f4eff4: e34001f6 movt r0, #502 ; 0x1f6 + 1f4eff8: e5d33005 ldrb r3, [r3, #5] + 1f4effc: ebfec8a1 bl 1f01288 + 1f4f000: e1a00004 mov r0, r4 + 1f4f004: e8bd8070 pop {r4, r5, r6, pc} + +01f4f008 : + 1f4f008: e92d4070 push {r4, r5, r6, lr} + 1f4f00c: e1a04000 mov r4, r0 + 1f4f010: e3a0c000 mov ip, #0 + 1f4f014: e5dd5010 ldrb r5, [sp, #16] + 1f4f018: e30eefa4 movw lr, #61348 ; 0xefa4 + 1f4f01c: e340e1f4 movt lr, #500 ; 0x1f4 + 1f4f020: e5c42009 strb r2, [r4, #9] + 1f4f024: e3a00018 mov r0, #24 + 1f4f028: e5c43010 strb r3, [r4, #16] + 1f4f02c: e584e000 str lr, [r4] + 1f4f030: e5c4c008 strb ip, [r4, #8] + 1f4f034: e584c00c str ip, [r4, #12] + 1f4f038: e584c014 str ip, [r4, #20] + 1f4f03c: e584c018 str ip, [r4, #24] + 1f4f040: e584c01c str ip, [r4, #28] + 1f4f044: e5841004 str r1, [r4, #4] + 1f4f048: e5c45011 strb r5, [r4, #17] + 1f4f04c: ebffbd45 bl 1f3e568 + 1f4f050: e1a01004 mov r1, r4 + 1f4f054: e584000c str r0, [r4, #12] + 1f4f058: eb00017d bl 1f4f654 + 1f4f05c: e1a01004 mov r1, r4 + 1f4f060: e2840020 add r0, r4, #32 + 1f4f064: eb001cb4 bl 1f5633c + 1f4f068: e1a01004 mov r1, r4 + 1f4f06c: e284002c add r0, r4, #44 ; 0x2c + 1f4f070: e8bd4070 pop {r4, r5, r6, lr} + 1f4f074: ea001cb0 b 1f5633c + +01f4f078 : + 1f4f078: e92d4070 push {r4, r5, r6, lr} + 1f4f07c: e1a05001 mov r5, r1 + 1f4f080: e1a04000 mov r4, r0 + 1f4f084: e3a03000 mov r3, #0 + 1f4f088: e2811020 add r1, r1, #32 + 1f4f08c: e2800020 add r0, r0, #32 + 1f4f090: e595c000 ldr ip, [r5] + 1f4f094: e5952004 ldr r2, [r5, #4] + 1f4f098: e5842004 str r2, [r4, #4] + 1f4f09c: e584c000 str ip, [r4] + 1f4f0a0: e584300c str r3, [r4, #12] + 1f4f0a4: e5843014 str r3, [r4, #20] + 1f4f0a8: e5843018 str r3, [r4, #24] + 1f4f0ac: e584301c str r3, [r4, #28] + 1f4f0b0: e5d53008 ldrb r3, [r5, #8] + 1f4f0b4: e5c43008 strb r3, [r4, #8] + 1f4f0b8: e5d53009 ldrb r3, [r5, #9] + 1f4f0bc: e5c43009 strb r3, [r4, #9] + 1f4f0c0: e5d53010 ldrb r3, [r5, #16] + 1f4f0c4: e5c43010 strb r3, [r4, #16] + 1f4f0c8: e5d53011 ldrb r3, [r5, #17] + 1f4f0cc: e5c43011 strb r3, [r4, #17] + 1f4f0d0: eb001ca2 bl 1f56360 + 1f4f0d4: e285102c add r1, r5, #44 ; 0x2c + 1f4f0d8: e284002c add r0, r4, #44 ; 0x2c + 1f4f0dc: eb001c9f bl 1f56360 + 1f4f0e0: e3a00018 mov r0, #24 + 1f4f0e4: ebffbd1f bl 1f3e568 + 1f4f0e8: e584000c str r0, [r4, #12] + 1f4f0ec: e1a02004 mov r2, r4 + 1f4f0f0: e595100c ldr r1, [r5, #12] + 1f4f0f4: eb00019f bl 1f4f778 + 1f4f0f8: e5953014 ldr r3, [r5, #20] + 1f4f0fc: e3530000 cmp r3, #0 + 1f4f100: 0a000005 beq 1f4f11c + 1f4f104: e3a00012 mov r0, #18 + 1f4f108: ebffbd16 bl 1f3e568 + 1f4f10c: e5840014 str r0, [r4, #20] + 1f4f110: e3a02012 mov r2, #18 + 1f4f114: e5951014 ldr r1, [r5, #20] + 1f4f118: eb000e86 bl 1f52b38 + 1f4f11c: e5953018 ldr r3, [r5, #24] + 1f4f120: e3530000 cmp r3, #0 + 1f4f124: 08bd8070 popeq {r4, r5, r6, pc} + 1f4f128: e1d360b2 ldrh r6, [r3, #2] + 1f4f12c: e1a00006 mov r0, r6 + 1f4f130: ebffbd0c bl 1f3e568 + 1f4f134: e5840018 str r0, [r4, #24] + 1f4f138: e1a02006 mov r2, r6 + 1f4f13c: e5951018 ldr r1, [r5, #24] + 1f4f140: eb000e7c bl 1f52b38 + 1f4f144: e595301c ldr r3, [r5, #28] + 1f4f148: e3530000 cmp r3, #0 + 1f4f14c: 08bd8070 popeq {r4, r5, r6, pc} + 1f4f150: e3a00018 mov r0, #24 + 1f4f154: ebffbd03 bl 1f3e568 + 1f4f158: e1a02006 mov r2, r6 + 1f4f15c: e584001c str r0, [r4, #28] + 1f4f160: e5941018 ldr r1, [r4, #24] + 1f4f164: e8bd4070 pop {r4, r5, r6, lr} + 1f4f168: ea001f01 b 1f56d74 + +01f4f16c <_USBDevice>: + 1f4f16c: e92d4010 push {r4, lr} + 1f4f170: e1a04000 mov r4, r0 + 1f4f174: e590001c ldr r0, [r0, #28] + 1f4f178: e3500000 cmp r0, #0 + 1f4f17c: 0a000004 beq 1f4f194 <_USBDevice+0x28> + 1f4f180: eb001f3f bl 1f56e84 <_USBConfigurationParser> + 1f4f184: e594001c ldr r0, [r4, #28] + 1f4f188: ebffbcfe bl 1f3e588 + 1f4f18c: e3a03000 mov r3, #0 + 1f4f190: e584301c str r3, [r4, #28] + 1f4f194: e5940018 ldr r0, [r4, #24] + 1f4f198: e3500000 cmp r0, #0 + 1f4f19c: 0a000002 beq 1f4f1ac <_USBDevice+0x40> + 1f4f1a0: ebffbcf8 bl 1f3e588 + 1f4f1a4: e3a03000 mov r3, #0 + 1f4f1a8: e5843018 str r3, [r4, #24] + 1f4f1ac: e5940014 ldr r0, [r4, #20] + 1f4f1b0: e3500000 cmp r0, #0 + 1f4f1b4: 0a000002 beq 1f4f1c4 <_USBDevice+0x58> + 1f4f1b8: ebffbcf2 bl 1f3e588 + 1f4f1bc: e3a03000 mov r3, #0 + 1f4f1c0: e5843014 str r3, [r4, #20] + 1f4f1c4: e594000c ldr r0, [r4, #12] + 1f4f1c8: e3500000 cmp r0, #0 + 1f4f1cc: 0a000004 beq 1f4f1e4 <_USBDevice+0x78> + 1f4f1d0: eb000177 bl 1f4f7b4 <_USBEndpoint> + 1f4f1d4: e594000c ldr r0, [r4, #12] + 1f4f1d8: ebffbcea bl 1f3e588 + 1f4f1dc: e3a03000 mov r3, #0 + 1f4f1e0: e584300c str r3, [r4, #12] + 1f4f1e4: e3a03000 mov r3, #0 + 1f4f1e8: e284002c add r0, r4, #44 ; 0x2c + 1f4f1ec: e5843000 str r3, [r4] + 1f4f1f0: e5843004 str r3, [r4, #4] + 1f4f1f4: eb001c74 bl 1f563cc <_USBString> + 1f4f1f8: e2840020 add r0, r4, #32 + 1f4f1fc: e8bd4010 pop {r4, lr} + 1f4f200: ea001c71 b 1f563cc <_USBString> + +01f4f204 : + 1f4f204: e92d40f0 push {r4, r5, r6, r7, lr} + 1f4f208: e1a04000 mov r4, r0 + 1f4f20c: e3a00012 mov r0, #18 + 1f4f210: e24dd014 sub sp, sp, #20 + 1f4f214: e3a05080 mov r5, #128 ; 0x80 + 1f4f218: ebffbcd2 bl 1f3e568 + 1f4f21c: e3a0c008 mov ip, #8 + 1f4f220: e1a02000 mov r2, r0 + 1f4f224: e3a03000 mov r3, #0 + 1f4f228: e58d0000 str r0, [sp] + 1f4f22c: e5842014 str r2, [r4, #20] + 1f4f230: e3a02001 mov r2, #1 + 1f4f234: e594100c ldr r1, [r4, #12] + 1f4f238: e5940004 ldr r0, [r4, #4] + 1f4f23c: e58d5008 str r5, [sp, #8] + 1f4f240: e58dc004 str ip, [sp, #4] + 1f4f244: ebfffb75 bl 1f4e020 + 1f4f248: e3500008 cmp r0, #8 + 1f4f24c: 13032380 movwne r2, #13184 ; 0x3380 + 1f4f250: 134021f6 movtne r2, #502 ; 0x1f6 + 1f4f254: 1a000008 bne 1f4f27c + 1f4f258: e5943014 ldr r3, [r4, #20] + 1f4f25c: e5d36000 ldrb r6, [r3] + 1f4f260: e3560012 cmp r6, #18 + 1f4f264: 1a000002 bne 1f4f274 + 1f4f268: e5d37001 ldrb r7, [r3, #1] + 1f4f26c: e3570001 cmp r7, #1 + 1f4f270: 0a00000d beq 1f4f2ac + 1f4f274: e30323a8 movw r2, #13224 ; 0x33a8 + 1f4f278: e34021f6 movt r2, #502 ; 0x1f6 + 1f4f27c: e3030358 movw r0, #13144 ; 0x3358 + 1f4f280: e34001f6 movt r0, #502 ; 0x1f6 + 1f4f284: e3a01001 mov r1, #1 + 1f4f288: ebfec7fe bl 1f01288 + 1f4f28c: e5940014 ldr r0, [r4, #20] + 1f4f290: ebffbcbc bl 1f3e588 + 1f4f294: e3a03000 mov r3, #0 + 1f4f298: e1a05003 mov r5, r3 + 1f4f29c: e5843014 str r3, [r4, #20] + 1f4f2a0: e1a00005 mov r0, r5 + 1f4f2a4: e28dd014 add sp, sp, #20 + 1f4f2a8: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f4f2ac: e5d31007 ldrb r1, [r3, #7] + 1f4f2b0: e594000c ldr r0, [r4, #12] + 1f4f2b4: eb000149 bl 1f4f7e0 + 1f4f2b8: e594c014 ldr ip, [r4, #20] + 1f4f2bc: e594100c ldr r1, [r4, #12] + 1f4f2c0: e3a03000 mov r3, #0 + 1f4f2c4: e5940004 ldr r0, [r4, #4] + 1f4f2c8: e1a02007 mov r2, r7 + 1f4f2cc: e58d5008 str r5, [sp, #8] + 1f4f2d0: e58d6004 str r6, [sp, #4] + 1f4f2d4: e58dc000 str ip, [sp] + 1f4f2d8: ebfffb50 bl 1f4e020 + 1f4f2dc: e3500012 cmp r0, #18 + 1f4f2e0: 1a000044 bne 1f4f3f8 + 1f4f2e4: e3052c8c movw r2, #23692 ; 0x5c8c + 1f4f2e8: e34021f6 movt r2, #502 ; 0x1f6 + 1f4f2ec: e5d26000 ldrb r6, [r2] + 1f4f2f0: e3160080 tst r6, #128 ; 0x80 + 1f4f2f4: e2863001 add r3, r6, #1 + 1f4f2f8: e5c23000 strb r3, [r2] + 1f4f2fc: 1a000043 bne 1f4f410 + 1f4f300: e1a02006 mov r2, r6 + 1f4f304: e594100c ldr r1, [r4, #12] + 1f4f308: e5940004 ldr r0, [r4, #4] + 1f4f30c: ebfffb6e bl 1f4e0cc + 1f4f310: e2505000 subs r5, r0, #0 + 1f4f314: 0a000045 beq 1f4f430 + 1f4f318: e5943014 ldr r3, [r4, #20] + 1f4f31c: e5c46008 strb r6, [r4, #8] + 1f4f320: e5d3200e ldrb r2, [r3, #14] + 1f4f324: e3520000 cmp r2, #0 + 1f4f328: 1a000002 bne 1f4f338 + 1f4f32c: e5d3300f ldrb r3, [r3, #15] + 1f4f330: e3530000 cmp r3, #0 + 1f4f334: 0a00000a beq 1f4f364 + 1f4f338: e2845020 add r5, r4, #32 + 1f4f33c: e1a00005 mov r0, r5 + 1f4f340: eb001d50 bl 1f56888 + 1f4f344: e5943014 ldr r3, [r4, #20] + 1f4f348: e1a06000 mov r6, r0 + 1f4f34c: e5d3100e ldrb r1, [r3, #14] + 1f4f350: e3510000 cmp r1, #0 + 1f4f354: 1a000041 bne 1f4f460 + 1f4f358: e5d3100f ldrb r1, [r3, #15] + 1f4f35c: e3510000 cmp r1, #0 + 1f4f360: 1a00003a bne 1f4f450 + 1f4f364: e3a00009 mov r0, #9 + 1f4f368: e3a05080 mov r5, #128 ; 0x80 + 1f4f36c: ebffbc7d bl 1f3e568 + 1f4f370: e594100c ldr r1, [r4, #12] + 1f4f374: e1a02000 mov r2, r0 + 1f4f378: e3a0c009 mov ip, #9 + 1f4f37c: e5842018 str r2, [r4, #24] + 1f4f380: e3a03000 mov r3, #0 + 1f4f384: e5940004 ldr r0, [r4, #4] + 1f4f388: e58d2000 str r2, [sp] + 1f4f38c: e3a02002 mov r2, #2 + 1f4f390: e58d5008 str r5, [sp, #8] + 1f4f394: e58dc004 str ip, [sp, #4] + 1f4f398: ebfffb20 bl 1f4e020 + 1f4f39c: e3500009 cmp r0, #9 + 1f4f3a0: 13032410 movwne r2, #13328 ; 0x3410 + 1f4f3a4: 134021f6 movtne r2, #502 ; 0x1f6 + 1f4f3a8: 1a000008 bne 1f4f3d0 + 1f4f3ac: e5940018 ldr r0, [r4, #24] + 1f4f3b0: e5d03000 ldrb r3, [r0] + 1f4f3b4: e3530009 cmp r3, #9 + 1f4f3b8: 1a000002 bne 1f4f3c8 + 1f4f3bc: e5d06001 ldrb r6, [r0, #1] + 1f4f3c0: e3560002 cmp r6, #2 + 1f4f3c4: 0a00002a beq 1f4f474 + 1f4f3c8: e303243c movw r2, #13372 ; 0x343c + 1f4f3cc: e34021f6 movt r2, #502 ; 0x1f6 + 1f4f3d0: e3a01001 mov r1, #1 + 1f4f3d4: e3030358 movw r0, #13144 ; 0x3358 + 1f4f3d8: e34001f6 movt r0, #502 ; 0x1f6 + 1f4f3dc: ebfec7a9 bl 1f01288 + 1f4f3e0: e5940018 ldr r0, [r4, #24] + 1f4f3e4: ebffbc67 bl 1f3e588 + 1f4f3e8: e3a03000 mov r3, #0 + 1f4f3ec: e1a05003 mov r5, r3 + 1f4f3f0: e5843018 str r3, [r4, #24] + 1f4f3f4: eaffffa9 b 1f4f2a0 + 1f4f3f8: e30323c4 movw r2, #13252 ; 0x33c4 + 1f4f3fc: e34021f6 movt r2, #502 ; 0x1f6 + 1f4f400: e3030358 movw r0, #13144 ; 0x3358 + 1f4f404: e34001f6 movt r0, #502 ; 0x1f6 + 1f4f408: e1a01007 mov r1, r7 + 1f4f40c: eaffff9d b 1f4f288 + 1f4f410: e1a01007 mov r1, r7 + 1f4f414: e30323e4 movw r2, #13284 ; 0x33e4 + 1f4f418: e34021f6 movt r2, #502 ; 0x1f6 + 1f4f41c: e3030358 movw r0, #13144 ; 0x3358 + 1f4f420: e34001f6 movt r0, #502 ; 0x1f6 + 1f4f424: ebfec797 bl 1f01288 + 1f4f428: e3a05000 mov r5, #0 + 1f4f42c: eaffff9b b 1f4f2a0 + 1f4f430: e1a03006 mov r3, r6 + 1f4f434: e1a01007 mov r1, r7 + 1f4f438: e30323f8 movw r2, #13304 ; 0x33f8 + 1f4f43c: e34021f6 movt r2, #502 ; 0x1f6 + 1f4f440: e3030358 movw r0, #13144 ; 0x3358 + 1f4f444: e34001f6 movt r0, #502 ; 0x1f6 + 1f4f448: ebfec78e bl 1f01288 + 1f4f44c: eaffff93 b 1f4f2a0 + 1f4f450: e1a02006 mov r2, r6 + 1f4f454: e284002c add r0, r4, #44 ; 0x2c + 1f4f458: eb001beb bl 1f5640c + 1f4f45c: eaffffc0 b 1f4f364 + 1f4f460: e1a00005 mov r0, r5 + 1f4f464: e1a02006 mov r2, r6 + 1f4f468: eb001be7 bl 1f5640c + 1f4f46c: e5943014 ldr r3, [r4, #20] + 1f4f470: eaffffb8 b 1f4f358 + 1f4f474: e1d070b2 ldrh r7, [r0, #2] + 1f4f478: e3570c02 cmp r7, #512 ; 0x200 + 1f4f47c: 8affffd1 bhi 1f4f3c8 + 1f4f480: ebffbc40 bl 1f3e588 + 1f4f484: e1a00007 mov r0, r7 + 1f4f488: ebffbc36 bl 1f3e568 + 1f4f48c: e594c004 ldr ip, [r4, #4] + 1f4f490: e5840018 str r0, [r4, #24] + 1f4f494: e1a02006 mov r2, r6 + 1f4f498: e594100c ldr r1, [r4, #12] + 1f4f49c: e3a03000 mov r3, #0 + 1f4f4a0: e58d0000 str r0, [sp] + 1f4f4a4: e1a0000c mov r0, ip + 1f4f4a8: e58d5008 str r5, [sp, #8] + 1f4f4ac: e58d7004 str r7, [sp, #4] + 1f4f4b0: ebfffada bl 1f4e020 + 1f4f4b4: e1500007 cmp r0, r7 + 1f4f4b8: e1a05000 mov r5, r0 + 1f4f4bc: 13032460 movwne r2, #13408 ; 0x3460 + 1f4f4c0: 134021f6 movtne r2, #502 ; 0x1f6 + 1f4f4c4: 1affffc1 bne 1f4f3d0 + 1f4f4c8: e3a00018 mov r0, #24 + 1f4f4cc: ebffbc25 bl 1f3e568 + 1f4f4d0: e1a02005 mov r2, r5 + 1f4f4d4: e584001c str r0, [r4, #28] + 1f4f4d8: e5941018 ldr r1, [r4, #24] + 1f4f4dc: eb001e24 bl 1f56d74 + 1f4f4e0: e594001c ldr r0, [r4, #28] + 1f4f4e4: eb001e69 bl 1f56e90 + 1f4f4e8: e2505000 subs r5, r0, #0 + 1f4f4ec: 13a05001 movne r5, #1 + 1f4f4f0: 1affff6a bne 1f4f2a0 + 1f4f4f4: e594001c ldr r0, [r4, #28] + 1f4f4f8: e3031358 movw r1, #13144 ; 0x3358 + 1f4f4fc: e34011f6 movt r1, #502 ; 0x1f6 + 1f4f500: eb001e8d bl 1f56f3c + 1f4f504: eaffff65 b 1f4f2a0 + +01f4f508 : + 1f4f508: e92d4070 push {r4, r5, r6, lr} + 1f4f50c: e1a06000 mov r6, r0 + 1f4f510: e3a0000c mov r0, #12 + 1f4f514: e24dd008 sub sp, sp, #8 + 1f4f518: e1a05001 mov r5, r1 + 1f4f51c: ebffbc11 bl 1f3e568 + 1f4f520: e1a04000 mov r4, r0 + 1f4f524: eb00089b bl 1f51798 + 1f4f528: e3550001 cmp r5, #1 + 1f4f52c: 0a000024 beq 1f4f5c4 + 1f4f530: 3a000019 bcc 1f4f59c + 1f4f534: e3550002 cmp r5, #2 + 1f4f538: 0a000006 beq 1f4f558 + 1f4f53c: e30f1aa0 movw r1, #64160 ; 0xfaa0 + 1f4f540: e34011f5 movt r1, #501 ; 0x1f5 + 1f4f544: e1a00004 mov r0, r4 + 1f4f548: eb0008b3 bl 1f5181c + 1f4f54c: e1a00004 mov r0, r4 + 1f4f550: e28dd008 add sp, sp, #8 + 1f4f554: e8bd8070 pop {r4, r5, r6, pc} + 1f4f558: e5961018 ldr r1, [r6, #24] + 1f4f55c: e1d130b2 ldrh r3, [r1, #2] + 1f4f560: e3530011 cmp r3, #17 + 1f4f564: 9afffff4 bls 1f4f53c + 1f4f568: e5d1200e ldrb r2, [r1, #14] + 1f4f56c: e2423001 sub r3, r2, #1 + 1f4f570: e6ef3073 uxtb r3, r3 + 1f4f574: e35300fd cmp r3, #253 ; 0xfd + 1f4f578: 8affffef bhi 1f4f53c + 1f4f57c: e5d10010 ldrb r0, [r1, #16] + 1f4f580: e5d1300f ldrb r3, [r1, #15] + 1f4f584: e303149c movw r1, #13468 ; 0x349c + 1f4f588: e34011f6 movt r1, #502 ; 0x1f6 + 1f4f58c: e58d0000 str r0, [sp] + 1f4f590: e1a00004 mov r0, r4 + 1f4f594: eb000c78 bl 1f5277c + 1f4f598: eaffffeb b 1f4f54c + 1f4f59c: e5962014 ldr r2, [r6, #20] + 1f4f5a0: e1a00004 mov r0, r4 + 1f4f5a4: e3031484 movw r1, #13444 ; 0x3484 + 1f4f5a8: e34011f6 movt r1, #502 ; 0x1f6 + 1f4f5ac: e1d230ba ldrh r3, [r2, #10] + 1f4f5b0: e1d220b8 ldrh r2, [r2, #8] + 1f4f5b4: eb000c70 bl 1f5277c + 1f4f5b8: e1a00004 mov r0, r4 + 1f4f5bc: e28dd008 add sp, sp, #8 + 1f4f5c0: e8bd8070 pop {r4, r5, r6, pc} + 1f4f5c4: e5961014 ldr r1, [r6, #20] + 1f4f5c8: e5d12004 ldrb r2, [r1, #4] + 1f4f5cc: e2423001 sub r3, r2, #1 + 1f4f5d0: e6ef3073 uxtb r3, r3 + 1f4f5d4: e35300fd cmp r3, #253 ; 0xfd + 1f4f5d8: 8affffd7 bhi 1f4f53c + 1f4f5dc: e5d10006 ldrb r0, [r1, #6] + 1f4f5e0: e5d13005 ldrb r3, [r1, #5] + 1f4f5e4: e3031490 movw r1, #13456 ; 0x3490 + 1f4f5e8: e34011f6 movt r1, #502 ; 0x1f6 + 1f4f5ec: e58d0000 str r0, [sp] + 1f4f5f0: e1a00004 mov r0, r4 + 1f4f5f4: eb000c60 bl 1f5277c + 1f4f5f8: eaffffd3 b 1f4f54c + +01f4f5fc : + 1f4f5fc: e5d00008 ldrb r0, [r0, #8] + 1f4f600: e12fff1e bx lr + +01f4f604 : + 1f4f604: e5d00009 ldrb r0, [r0, #9] + 1f4f608: e12fff1e bx lr + +01f4f60c : + 1f4f60c: e5d00010 ldrb r0, [r0, #16] + 1f4f610: e12fff1e bx lr + +01f4f614 : + 1f4f614: e5d00011 ldrb r0, [r0, #17] + 1f4f618: e12fff1e bx lr + +01f4f61c : + 1f4f61c: e590000c ldr r0, [r0, #12] + 1f4f620: e12fff1e bx lr + +01f4f624 : + 1f4f624: e5900004 ldr r0, [r0, #4] + 1f4f628: e12fff1e bx lr + +01f4f62c : + 1f4f62c: e5900014 ldr r0, [r0, #20] + 1f4f630: e12fff1e bx lr + +01f4f634 : + 1f4f634: e5900018 ldr r0, [r0, #24] + 1f4f638: e12fff1e bx lr + +01f4f63c : + 1f4f63c: e590001c ldr r0, [r0, #28] + 1f4f640: ea001e14 b 1f56e98 + +01f4f644 : + 1f4f644: e590001c ldr r0, [r0, #28] + 1f4f648: ea001e3b b 1f56f3c + +01f4f64c : + 1f4f64c: e5c01008 strb r1, [r0, #8] + 1f4f650: e12fff1e bx lr + +01f4f654 : + 1f4f654: e3a03000 mov r3, #0 + 1f4f658: e3a0c008 mov ip, #8 + 1f4f65c: e3a02001 mov r2, #1 + 1f4f660: e5801000 str r1, [r0] + 1f4f664: e580c00c str ip, [r0, #12] + 1f4f668: e5802010 str r2, [r0, #16] + 1f4f66c: e5c03004 strb r3, [r0, #4] + 1f4f670: e5c03005 strb r3, [r0, #5] + 1f4f674: e5803008 str r3, [r0, #8] + 1f4f678: e5c03014 strb r3, [r0, #20] + 1f4f67c: e12fff1e bx lr + +01f4f680 : + 1f4f680: e92d4070 push {r4, r5, r6, lr} + 1f4f684: e3a05001 mov r5, #1 + 1f4f688: e5801000 str r1, [r0] + 1f4f68c: e5805010 str r5, [r0, #16] + 1f4f690: e5d23003 ldrb r3, [r2, #3] + 1f4f694: e2033003 and r3, r3, #3 + 1f4f698: e3530002 cmp r3, #2 + 1f4f69c: 0a000018 beq 1f4f704 + 1f4f6a0: e3530003 cmp r3, #3 + 1f4f6a4: 1a000015 bne 1f4f700 + 1f4f6a8: e5c05014 strb r5, [r0, #20] + 1f4f6ac: e3a03002 mov r3, #2 + 1f4f6b0: e5c03005 strb r3, [r0, #5] + 1f4f6b4: e1a04000 mov r4, r0 + 1f4f6b8: e5d23002 ldrb r3, [r2, #2] + 1f4f6bc: e203300f and r3, r3, #15 + 1f4f6c0: e5c03004 strb r3, [r0, #4] + 1f4f6c4: e1d230d2 ldrsb r3, [r2, #2] + 1f4f6c8: e1a03fa3 lsr r3, r3, #31 + 1f4f6cc: e5803008 str r3, [r0, #8] + 1f4f6d0: e1d230b4 ldrh r3, [r2, #4] + 1f4f6d4: e580300c str r3, [r0, #12] + 1f4f6d8: e1a00001 mov r0, r1 + 1f4f6dc: e5d26006 ldrb r6, [r2, #6] + 1f4f6e0: e3560000 cmp r6, #0 + 1f4f6e4: 0a000011 beq 1f4f730 + 1f4f6e8: ebffffc5 bl 1f4f604 + 1f4f6ec: e3500002 cmp r0, #2 + 1f4f6f0: 0a000014 beq 1f4f748 + 1f4f6f4: e1a05006 mov r5, r6 + 1f4f6f8: e5845010 str r5, [r4, #16] + 1f4f6fc: e8bd8070 pop {r4, r5, r6, pc} + 1f4f700: e8bd8070 pop {r4, r5, r6, pc} + 1f4f704: e5c05005 strb r5, [r0, #5] + 1f4f708: e5c05014 strb r5, [r0, #20] + 1f4f70c: e5d23002 ldrb r3, [r2, #2] + 1f4f710: e203300f and r3, r3, #15 + 1f4f714: e5c03004 strb r3, [r0, #4] + 1f4f718: e1d230d2 ldrsb r3, [r2, #2] + 1f4f71c: e1a03fa3 lsr r3, r3, #31 + 1f4f720: e5803008 str r3, [r0, #8] + 1f4f724: e1d230b4 ldrh r3, [r2, #4] + 1f4f728: e580300c str r3, [r0, #12] + 1f4f72c: e8bd8070 pop {r4, r5, r6, pc} + 1f4f730: ebffffb3 bl 1f4f604 + 1f4f734: e3500002 cmp r0, #2 + 1f4f738: 1affffee bne 1f4f6f8 + 1f4f73c: e3a03001 mov r3, #1 + 1f4f740: e5843010 str r3, [r4, #16] + 1f4f744: e8bd8070 pop {r4, r5, r6, pc} + 1f4f748: e3560010 cmp r6, #16 + 1f4f74c: 9a000002 bls 1f4f75c + 1f4f750: e3a03a01 mov r3, #4096 ; 0x1000 + 1f4f754: e5843010 str r3, [r4, #16] + 1f4f758: e8bd8070 pop {r4, r5, r6, pc} + 1f4f75c: e2463001 sub r3, r6, #1 + 1f4f760: e1a03315 lsl r3, r5, r3 + 1f4f764: e1a031a3 lsr r3, r3, #3 + 1f4f768: e5843010 str r3, [r4, #16] + 1f4f76c: e3530000 cmp r3, #0 + 1f4f770: 0afffff1 beq 1f4f73c + 1f4f774: e8bd8070 pop {r4, r5, r6, pc} + +01f4f778 : + 1f4f778: e5802000 str r2, [r0] + 1f4f77c: e92d4010 push {r4, lr} + 1f4f780: e5d13004 ldrb r3, [r1, #4] + 1f4f784: e5c03004 strb r3, [r0, #4] + 1f4f788: e5d14005 ldrb r4, [r1, #5] + 1f4f78c: e591e008 ldr lr, [r1, #8] + 1f4f790: e591c00c ldr ip, [r1, #12] + 1f4f794: e5912010 ldr r2, [r1, #16] + 1f4f798: e5d13014 ldrb r3, [r1, #20] + 1f4f79c: e5c03014 strb r3, [r0, #20] + 1f4f7a0: e5c04005 strb r4, [r0, #5] + 1f4f7a4: e580e008 str lr, [r0, #8] + 1f4f7a8: e580c00c str ip, [r0, #12] + 1f4f7ac: e5802010 str r2, [r0, #16] + 1f4f7b0: e8bd8010 pop {r4, pc} + +01f4f7b4 <_USBEndpoint>: + 1f4f7b4: e3a03000 mov r3, #0 + 1f4f7b8: e5803000 str r3, [r0] + 1f4f7bc: e12fff1e bx lr + +01f4f7c0 : + 1f4f7c0: e5900000 ldr r0, [r0] + 1f4f7c4: e12fff1e bx lr + +01f4f7c8 : + 1f4f7c8: e5d00004 ldrb r0, [r0, #4] + 1f4f7cc: e12fff1e bx lr + +01f4f7d0 : + 1f4f7d0: e5d00005 ldrb r0, [r0, #5] + 1f4f7d4: e12fff1e bx lr + +01f4f7d8 : + 1f4f7d8: e5900008 ldr r0, [r0, #8] + 1f4f7dc: e12fff1e bx lr + +01f4f7e0 : + 1f4f7e0: e580100c str r1, [r0, #12] + 1f4f7e4: e12fff1e bx lr + +01f4f7e8 : + 1f4f7e8: e590000c ldr r0, [r0, #12] + 1f4f7ec: e12fff1e bx lr + +01f4f7f0 : + 1f4f7f0: e5900010 ldr r0, [r0, #16] + 1f4f7f4: e12fff1e bx lr + +01f4f7f8 : + 1f4f7f8: e3510000 cmp r1, #0 + 1f4f7fc: 05d00014 ldrbeq r0, [r0, #20] + 1f4f800: 13a00002 movne r0, #2 + 1f4f804: e12fff1e bx lr + +01f4f808 : + 1f4f808: e3520000 cmp r2, #0 + 1f4f80c: 1a000009 bne 1f4f838 + 1f4f810: e5d03014 ldrb r3, [r0, #20] + 1f4f814: e3530001 cmp r3, #1 + 1f4f818: 0a00000a beq 1f4f848 + 1f4f81c: 3a00000b bcc 1f4f850 + 1f4f820: e3530002 cmp r3, #2 + 1f4f824: 1a000006 bne 1f4f844 + 1f4f828: e3110001 tst r1, #1 + 1f4f82c: 13a03001 movne r3, #1 + 1f4f830: 15c03014 strbne r3, [r0, #20] + 1f4f834: e12fff1e bx lr + 1f4f838: e3a03000 mov r3, #0 + 1f4f83c: e5c03014 strb r3, [r0, #20] + 1f4f840: e12fff1e bx lr + 1f4f844: e12fff1e bx lr + 1f4f848: e3110001 tst r1, #1 + 1f4f84c: 012fff1e bxeq lr + 1f4f850: e3a03002 mov r3, #2 + 1f4f854: e5c03014 strb r3, [r0, #20] + 1f4f858: e12fff1e bx lr + +01f4f85c : + 1f4f85c: e3a03001 mov r3, #1 + 1f4f860: e5c03014 strb r3, [r0, #20] + 1f4f864: e12fff1e bx lr + +01f4f868 : + 1f4f868: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f4f86c: e59de004 ldr lr, [sp, #4] + 1f4f870: e3a0c000 mov ip, #0 + 1f4f874: e5801000 str r1, [r0] + 1f4f878: e5802008 str r2, [r0, #8] + 1f4f87c: e580300c str r3, [r0, #12] + 1f4f880: e580e004 str lr, [r0, #4] + 1f4f884: e580c010 str ip, [r0, #16] + 1f4f888: e580c014 str ip, [r0, #20] + 1f4f88c: e580c018 str ip, [r0, #24] + 1f4f890: e580c01c str ip, [r0, #28] + 1f4f894: e580c020 str ip, [r0, #32] + 1f4f898: e49df004 pop {pc} ; (ldr pc, [sp], #4) + +01f4f89c <_USBRequest>: + 1f4f89c: e3a03000 mov r3, #0 + 1f4f8a0: e5803000 str r3, [r0] + 1f4f8a4: e5803004 str r3, [r0, #4] + 1f4f8a8: e5803008 str r3, [r0, #8] + 1f4f8ac: e5803018 str r3, [r0, #24] + 1f4f8b0: e12fff1e bx lr + +01f4f8b4 : + 1f4f8b4: e5900000 ldr r0, [r0] + 1f4f8b8: e12fff1e bx lr + +01f4f8bc : + 1f4f8bc: e5801010 str r1, [r0, #16] + 1f4f8c0: e12fff1e bx lr + +01f4f8c4 : + 1f4f8c4: e5801014 str r1, [r0, #20] + 1f4f8c8: e12fff1e bx lr + +01f4f8cc : + 1f4f8cc: e5900010 ldr r0, [r0, #16] + 1f4f8d0: e12fff1e bx lr + +01f4f8d4 : + 1f4f8d4: e5900014 ldr r0, [r0, #20] + 1f4f8d8: e12fff1e bx lr + +01f4f8dc : + 1f4f8dc: e5900004 ldr r0, [r0, #4] + 1f4f8e0: e12fff1e bx lr + +01f4f8e4 : + 1f4f8e4: e5900008 ldr r0, [r0, #8] + 1f4f8e8: e12fff1e bx lr + +01f4f8ec : + 1f4f8ec: e590000c ldr r0, [r0, #12] + 1f4f8f0: e12fff1e bx lr + +01f4f8f4 : + 1f4f8f4: e5801018 str r1, [r0, #24] + 1f4f8f8: e580201c str r2, [r0, #28] + 1f4f8fc: e5803020 str r3, [r0, #32] + 1f4f900: e12fff1e bx lr + +01f4f904 : + 1f4f904: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f4f908: e590e018 ldr lr, [r0, #24] + 1f4f90c: e5902020 ldr r2, [r0, #32] + 1f4f910: e1a0300e mov r3, lr + 1f4f914: e590101c ldr r1, [r0, #28] + 1f4f918: e49de004 pop {lr} ; (ldr lr, [sp], #4) + 1f4f91c: e12fff13 bx r3 + +01f4f920 : + 1f4f920: e30c3600 movw r3, #50688 ; 0xc600 + 1f4f924: e340320d movt r3, #525 ; 0x20d + 1f4f928: e3a02000 mov r2, #0 + 1f4f92c: e5802000 str r2, [r0] + 1f4f930: e5830000 str r0, [r3] + 1f4f934: e12fff1e bx lr + +01f4f938 <_DeviceNameService>: + 1f4f938: e5903000 ldr r3, [r0] + 1f4f93c: e92d4070 push {r4, r5, r6, lr} + 1f4f940: e3530000 cmp r3, #0 + 1f4f944: 11a05000 movne r5, r0 + 1f4f948: 13a06000 movne r6, #0 + 1f4f94c: 0a00000a beq 1f4f97c <_DeviceNameService+0x44> + 1f4f950: e5930004 ldr r0, [r3, #4] + 1f4f954: e5934000 ldr r4, [r3] + 1f4f958: ebffbb0a bl 1f3e588 + 1f4f95c: e5953000 ldr r3, [r5] + 1f4f960: e1a00003 mov r0, r3 + 1f4f964: e5836004 str r6, [r3, #4] + 1f4f968: e5836008 str r6, [r3, #8] + 1f4f96c: ebffbb05 bl 1f3e588 + 1f4f970: e2543000 subs r3, r4, #0 + 1f4f974: e5854000 str r4, [r5] + 1f4f978: 1afffff4 bne 1f4f950 <_DeviceNameService+0x18> + 1f4f97c: e30c3600 movw r3, #50688 ; 0xc600 + 1f4f980: e340320d movt r3, #525 ; 0x20d + 1f4f984: e3a02000 mov r2, #0 + 1f4f988: e5832000 str r2, [r3] + 1f4f98c: e8bd8070 pop {r4, r5, r6, pc} + +01f4f990 : + 1f4f990: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f4f994: e1a05000 mov r5, r0 + 1f4f998: e3a00010 mov r0, #16 + 1f4f99c: e1a06001 mov r6, r1 + 1f4f9a0: e1a08002 mov r8, r2 + 1f4f9a4: e1a07003 mov r7, r3 + 1f4f9a8: ebffbaee bl 1f3e568 + 1f4f9ac: e1a04000 mov r4, r0 + 1f4f9b0: e1a00006 mov r0, r6 + 1f4f9b4: eb000d51 bl 1f52f00 + 1f4f9b8: e2800001 add r0, r0, #1 + 1f4f9bc: ebffbae9 bl 1f3e568 + 1f4f9c0: e1a01006 mov r1, r6 + 1f4f9c4: e5840004 str r0, [r4, #4] + 1f4f9c8: eb000d73 bl 1f52f9c + 1f4f9cc: e5951000 ldr r1, [r5] + 1f4f9d0: e5841000 str r1, [r4] + 1f4f9d4: e5848008 str r8, [r4, #8] + 1f4f9d8: e584700c str r7, [r4, #12] + 1f4f9dc: e5854000 str r4, [r5] + 1f4f9e0: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f4f9e4 : + 1f4f9e4: e92d4070 push {r4, r5, r6, lr} + 1f4f9e8: e5904000 ldr r4, [r0] + 1f4f9ec: e3540000 cmp r4, #0 + 1f4f9f0: 11a05001 movne r5, r1 + 1f4f9f4: 11a06002 movne r6, r2 + 1f4f9f8: 0a00000a beq 1f4fa28 + 1f4f9fc: e5941004 ldr r1, [r4, #4] + 1f4fa00: e1a00005 mov r0, r5 + 1f4fa04: eb000d47 bl 1f52f28 + 1f4fa08: e3500000 cmp r0, #0 + 1f4fa0c: 1a000002 bne 1f4fa1c + 1f4fa10: e594300c ldr r3, [r4, #12] + 1f4fa14: e1530006 cmp r3, r6 + 1f4fa18: 0a000004 beq 1f4fa30 + 1f4fa1c: e5944000 ldr r4, [r4] + 1f4fa20: e3540000 cmp r4, #0 + 1f4fa24: 1afffff4 bne 1f4f9fc + 1f4fa28: e3a00000 mov r0, #0 + 1f4fa2c: e8bd8070 pop {r4, r5, r6, pc} + 1f4fa30: e5940008 ldr r0, [r4, #8] + 1f4fa34: e8bd8070 pop {r4, r5, r6, pc} + +01f4fa38 : + 1f4fa38: e30c3600 movw r3, #50688 ; 0xc600 + 1f4fa3c: e340320d movt r3, #525 ; 0x20d + 1f4fa40: e5930000 ldr r0, [r3] + 1f4fa44: e12fff1e bx lr + +01f4fa48 : + 1f4fa48: e3a03000 mov r3, #0 + 1f4fa4c: e5803000 str r3, [r0] + 1f4fa50: e12fff1e bx lr + +01f4fa54 : + 1f4fa54: e92d4010 push {r4, lr} + 1f4fa58: e1a04000 mov r4, r0 + 1f4fa5c: e3a02006 mov r2, #6 + 1f4fa60: e2800004 add r0, r0, #4 + 1f4fa64: eb000c33 bl 1f52b38 + 1f4fa68: e3a03001 mov r3, #1 + 1f4fa6c: e5843000 str r3, [r4] + 1f4fa70: e8bd8010 pop {r4, pc} + +01f4fa74 <_MACAddress>: + 1f4fa74: e3a03000 mov r3, #0 + 1f4fa78: e5803000 str r3, [r0] + 1f4fa7c: e12fff1e bx lr + +01f4fa80 : + 1f4fa80: e92d4010 push {r4, lr} + 1f4fa84: e2811004 add r1, r1, #4 + 1f4fa88: e3a02006 mov r2, #6 + 1f4fa8c: e2800004 add r0, r0, #4 + 1f4fa90: eb000d03 bl 1f52ea4 + 1f4fa94: e16f0f10 clz r0, r0 + 1f4fa98: e1a002a0 lsr r0, r0, #5 + 1f4fa9c: e8bd8010 pop {r4, pc} + +01f4faa0 : + 1f4faa0: e92d4010 push {r4, lr} + 1f4faa4: e1a04000 mov r4, r0 + 1f4faa8: e3a02006 mov r2, #6 + 1f4faac: e2800004 add r0, r0, #4 + 1f4fab0: eb000c20 bl 1f52b38 + 1f4fab4: e3a03001 mov r3, #1 + 1f4fab8: e5843000 str r3, [r4] + 1f4fabc: e8bd8010 pop {r4, pc} + +01f4fac0 : + 1f4fac0: e92d4010 push {r4, lr} + 1f4fac4: e1a04000 mov r4, r0 + 1f4fac8: e3a02006 mov r2, #6 + 1f4facc: e2800004 add r0, r0, #4 + 1f4fad0: e3a010ff mov r1, #255 ; 0xff + 1f4fad4: eb000bba bl 1f529c4 + 1f4fad8: e3a03001 mov r3, #1 + 1f4fadc: e5843000 str r3, [r4] + 1f4fae0: e8bd8010 pop {r4, pc} + +01f4fae4 : + 1f4fae4: e2800004 add r0, r0, #4 + 1f4fae8: e12fff1e bx lr + +01f4faec : + 1f4faec: e1a03001 mov r3, r1 + 1f4faf0: e3a02006 mov r2, #6 + 1f4faf4: e2801004 add r1, r0, #4 + 1f4faf8: e1a00003 mov r0, r3 + 1f4fafc: ea000c0d b 1f52b38 + +01f4fb00 : + 1f4fb00: e5d03004 ldrb r3, [r0, #4] + 1f4fb04: e35300ff cmp r3, #255 ; 0xff + 1f4fb08: 1a000010 bne 1f4fb50 + 1f4fb0c: e5d03005 ldrb r3, [r0, #5] + 1f4fb10: e35300ff cmp r3, #255 ; 0xff + 1f4fb14: 1a00000d bne 1f4fb50 + 1f4fb18: e5d03006 ldrb r3, [r0, #6] + 1f4fb1c: e35300ff cmp r3, #255 ; 0xff + 1f4fb20: 1a00000a bne 1f4fb50 + 1f4fb24: e5d03007 ldrb r3, [r0, #7] + 1f4fb28: e35300ff cmp r3, #255 ; 0xff + 1f4fb2c: 1a000007 bne 1f4fb50 + 1f4fb30: e5d03008 ldrb r3, [r0, #8] + 1f4fb34: e35300ff cmp r3, #255 ; 0xff + 1f4fb38: 1a000004 bne 1f4fb50 + 1f4fb3c: e5d00009 ldrb r0, [r0, #9] + 1f4fb40: e24000ff sub r0, r0, #255 ; 0xff + 1f4fb44: e16f0f10 clz r0, r0 + 1f4fb48: e1a002a0 lsr r0, r0, #5 + 1f4fb4c: e12fff1e bx lr + 1f4fb50: e3a00000 mov r0, #0 + 1f4fb54: e12fff1e bx lr + +01f4fb58 : + 1f4fb58: e3a00006 mov r0, #6 + 1f4fb5c: e12fff1e bx lr + +01f4fb60 : + 1f4fb60: e92d4030 push {r4, r5, lr} + 1f4fb64: e1a0c000 mov ip, r0 + 1f4fb68: e1a00001 mov r0, r1 + 1f4fb6c: e24dd014 sub sp, sp, #20 + 1f4fb70: e30314a8 movw r1, #13480 ; 0x34a8 + 1f4fb74: e34011f6 movt r1, #502 ; 0x1f6 + 1f4fb78: e5dc3005 ldrb r3, [ip, #5] + 1f4fb7c: e5dc2004 ldrb r2, [ip, #4] + 1f4fb80: e5dc5009 ldrb r5, [ip, #9] + 1f4fb84: e5dc4008 ldrb r4, [ip, #8] + 1f4fb88: e5dce007 ldrb lr, [ip, #7] + 1f4fb8c: e5dcc006 ldrb ip, [ip, #6] + 1f4fb90: e88d5000 stm sp, {ip, lr} + 1f4fb94: e58d500c str r5, [sp, #12] + 1f4fb98: e58d4008 str r4, [sp, #8] + 1f4fb9c: eb000af6 bl 1f5277c + 1f4fba0: e28dd014 add sp, sp, #20 + 1f4fba4: e8bd8030 pop {r4, r5, pc} + +01f4fba8 : + 1f4fba8: e92d4010 push {r4, lr} + 1f4fbac: e1a04000 mov r4, r0 + 1f4fbb0: ebfffd30 bl 1f4f078 + 1f4fbb4: e3a03000 mov r3, #0 + 1f4fbb8: e30f2e00 movw r2, #65024 ; 0xfe00 + 1f4fbbc: e34021f4 movt r2, #500 ; 0x1f4 + 1f4fbc0: e3a00d19 mov r0, #1600 ; 0x640 + 1f4fbc4: e5842000 str r2, [r4] + 1f4fbc8: e5843038 str r3, [r4, #56] ; 0x38 + 1f4fbcc: e584303c str r3, [r4, #60] ; 0x3c + 1f4fbd0: e584304c str r3, [r4, #76] ; 0x4c + 1f4fbd4: ebffba63 bl 1f3e568 + 1f4fbd8: e584004c str r0, [r4, #76] ; 0x4c + 1f4fbdc: e8bd8010 pop {r4, pc} + +01f4fbe0 <_SMSC951xDevice>: + 1f4fbe0: e92d4010 push {r4, lr} + 1f4fbe4: e1a04000 mov r4, r0 + 1f4fbe8: e590004c ldr r0, [r0, #76] ; 0x4c + 1f4fbec: e3500000 cmp r0, #0 + 1f4fbf0: 0a000002 beq 1f4fc00 <_SMSC951xDevice+0x20> + 1f4fbf4: ebffba63 bl 1f3e588 + 1f4fbf8: e3a03000 mov r3, #0 + 1f4fbfc: e584304c str r3, [r4, #76] ; 0x4c + 1f4fc00: e594003c ldr r0, [r4, #60] ; 0x3c + 1f4fc04: e3500000 cmp r0, #0 + 1f4fc08: 0a000004 beq 1f4fc20 <_SMSC951xDevice+0x40> + 1f4fc0c: ebfffee8 bl 1f4f7b4 <_USBEndpoint> + 1f4fc10: e594003c ldr r0, [r4, #60] ; 0x3c + 1f4fc14: ebffba5b bl 1f3e588 + 1f4fc18: e3a03000 mov r3, #0 + 1f4fc1c: e584303c str r3, [r4, #60] ; 0x3c + 1f4fc20: e5940038 ldr r0, [r4, #56] ; 0x38 + 1f4fc24: e3500000 cmp r0, #0 + 1f4fc28: 0a000004 beq 1f4fc40 <_SMSC951xDevice+0x60> + 1f4fc2c: ebfffee0 bl 1f4f7b4 <_USBEndpoint> + 1f4fc30: e5940038 ldr r0, [r4, #56] ; 0x38 + 1f4fc34: ebffba53 bl 1f3e588 + 1f4fc38: e3a03000 mov r3, #0 + 1f4fc3c: e5843038 str r3, [r4, #56] ; 0x38 + 1f4fc40: e1a00004 mov r0, r4 + 1f4fc44: e8bd4010 pop {r4, lr} + 1f4fc48: eafffd47 b 1f4f16c <_USBDevice> + +01f4fc4c : + 1f4fc4c: e2800040 add r0, r0, #64 ; 0x40 + 1f4fc50: e12fff1e bx lr + +01f4fc54 : + 1f4fc54: e300c637 movw ip, #1591 ; 0x637 + 1f4fc58: e152000c cmp r2, ip + 1f4fc5c: 9a000001 bls 1f4fc68 + 1f4fc60: e3a00000 mov r0, #0 + 1f4fc64: e12fff1e bx lr + 1f4fc68: e92d4070 push {r4, r5, r6, lr} + 1f4fc6c: e1a05000 mov r5, r0 + 1f4fc70: e590004c ldr r0, [r0, #76] ; 0x4c + 1f4fc74: e1a04002 mov r4, r2 + 1f4fc78: e2800008 add r0, r0, #8 + 1f4fc7c: eb000bad bl 1f52b38 + 1f4fc80: e595304c ldr r3, [r5, #76] ; 0x4c + 1f4fc84: e3842a03 orr r2, r4, #12288 ; 0x3000 + 1f4fc88: e1a00005 mov r0, r5 + 1f4fc8c: e8830014 stm r3, {r2, r4} + 1f4fc90: ebfffe63 bl 1f4f624 + 1f4fc94: e2843008 add r3, r4, #8 + 1f4fc98: e595204c ldr r2, [r5, #76] ; 0x4c + 1f4fc9c: e595103c ldr r1, [r5, #60] ; 0x3c + 1f4fca0: ebfff8c8 bl 1f4dfc8 + 1f4fca4: e1e00000 mvn r0, r0 + 1f4fca8: e1a00fa0 lsr r0, r0, #31 + 1f4fcac: e8bd8070 pop {r4, r5, r6, pc} + +01f4fcb0 : + 1f4fcb0: e92d40f0 push {r4, r5, r6, r7, lr} + 1f4fcb4: e1a05000 mov r5, r0 + 1f4fcb8: e3a03d19 mov r3, #1600 ; 0x640 + 1f4fcbc: e24dd034 sub sp, sp, #52 ; 0x34 + 1f4fcc0: e3a04000 mov r4, #0 + 1f4fcc4: e28d000c add r0, sp, #12 + 1f4fcc8: e1a06001 mov r6, r1 + 1f4fccc: e1a07002 mov r7, r2 + 1f4fcd0: e1a02001 mov r2, r1 + 1f4fcd4: e5951038 ldr r1, [r5, #56] ; 0x38 + 1f4fcd8: e58d4000 str r4, [sp] + 1f4fcdc: ebfffee1 bl 1f4f868 + 1f4fce0: e1a00005 mov r0, r5 + 1f4fce4: ebfffe4e bl 1f4f624 + 1f4fce8: e28d100c add r1, sp, #12 + 1f4fcec: ebfff7b5 bl 1f4dbc8 + 1f4fcf0: e1500004 cmp r0, r4 + 1f4fcf4: 0a000017 beq 1f4fd58 + 1f4fcf8: e28d000c add r0, sp, #12 + 1f4fcfc: ebfffef4 bl 1f4f8d4 + 1f4fd00: e3500003 cmp r0, #3 + 1f4fd04: 9a000013 bls 1f4fd58 + 1f4fd08: e5963000 ldr r3, [r6] + 1f4fd0c: e30920de movw r2, #37086 ; 0x90de + 1f4fd10: e3442000 movt r2, #16384 ; 0x4000 + 1f4fd14: e0022003 and r2, r2, r3 + 1f4fd18: e3520000 cmp r2, #0 + 1f4fd1c: 1a000012 bne 1f4fd6c + 1f4fd20: e7ed3853 ubfx r3, r3, #16, #14 + 1f4fd24: e3530004 cmp r3, #4 + 1f4fd28: 9a00000a bls 1f4fd58 + 1f4fd2c: e2434004 sub r4, r3, #4 + 1f4fd30: e2861004 add r1, r6, #4 + 1f4fd34: e1a02004 mov r2, r4 + 1f4fd38: e1a00006 mov r0, r6 + 1f4fd3c: eb000b7d bl 1f52b38 + 1f4fd40: e28d000c add r0, sp, #12 + 1f4fd44: e5874000 str r4, [r7] + 1f4fd48: ebfffed3 bl 1f4f89c <_USBRequest> + 1f4fd4c: e3a00001 mov r0, #1 + 1f4fd50: e28dd034 add sp, sp, #52 ; 0x34 + 1f4fd54: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f4fd58: e28d000c add r0, sp, #12 + 1f4fd5c: ebfffece bl 1f4f89c <_USBRequest> + 1f4fd60: e3a00000 mov r0, #0 + 1f4fd64: e28dd034 add sp, sp, #52 ; 0x34 + 1f4fd68: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f4fd6c: e3a01002 mov r1, #2 + 1f4fd70: e30324c8 movw r2, #13512 ; 0x34c8 + 1f4fd74: e34021f6 movt r2, #502 ; 0x1f6 + 1f4fd78: e3030560 movw r0, #13664 ; 0x3560 + 1f4fd7c: e34001f6 movt r0, #502 ; 0x1f6 + 1f4fd80: ebfec540 bl 1f01288 + 1f4fd84: e28d000c add r0, sp, #12 + 1f4fd88: ebfffec3 bl 1f4f89c <_USBRequest> + 1f4fd8c: e1a00004 mov r0, r4 + 1f4fd90: e28dd034 add sp, sp, #52 ; 0x34 + 1f4fd94: e8bd80f0 pop {r4, r5, r6, r7, pc} + +01f4fd98 : + 1f4fd98: e92d40f0 push {r4, r5, r6, r7, lr} + 1f4fd9c: e1a04001 mov r4, r1 + 1f4fda0: e1a07000 mov r7, r0 + 1f4fda4: e24dd01c sub sp, sp, #28 + 1f4fda8: e28d5018 add r5, sp, #24 + 1f4fdac: e6ff4074 uxth r4, r4 + 1f4fdb0: e5252004 str r2, [r5, #-4]! + 1f4fdb4: ebfffe1a bl 1f4f624 + 1f4fdb8: e1a06000 mov r6, r0 + 1f4fdbc: e1a00007 mov r0, r7 + 1f4fdc0: ebfffe15 bl 1f4f61c + 1f4fdc4: e58d5008 str r5, [sp, #8] + 1f4fdc8: e1a01000 mov r1, r0 + 1f4fdcc: e58d4004 str r4, [sp, #4] + 1f4fdd0: e1a00006 mov r0, r6 + 1f4fdd4: e3a03004 mov r3, #4 + 1f4fdd8: e3a02000 mov r2, #0 + 1f4fddc: e58d300c str r3, [sp, #12] + 1f4fde0: e58d2000 str r2, [sp] + 1f4fde4: e3a030a0 mov r3, #160 ; 0xa0 + 1f4fde8: e3a02040 mov r2, #64 ; 0x40 + 1f4fdec: ebfff84d bl 1f4df28 + 1f4fdf0: e1e00000 mvn r0, r0 + 1f4fdf4: e1a00fa0 lsr r0, r0, #31 + 1f4fdf8: e28dd01c add sp, sp, #28 + 1f4fdfc: e8bd80f0 pop {r4, r5, r6, r7, pc} + +01f4fe00 : + 1f4fe00: e92d43f0 push {r4, r5, r6, r7, r8, r9, lr} + 1f4fe04: e1a04000 mov r4, r0 + 1f4fe08: e24dd044 sub sp, sp, #68 ; 0x44 + 1f4fe0c: e28d0018 add r0, sp, #24 + 1f4fe10: ebfec528 bl 1f012b8 + 1f4fe14: e2505000 subs r5, r0, #0 + 1f4fe18: 0a000023 beq 1f4feac + 1f4fe1c: e2846040 add r6, r4, #64 ; 0x40 + 1f4fe20: e28d1018 add r1, sp, #24 + 1f4fe24: e1a00006 mov r0, r6 + 1f4fe28: ebffff1c bl 1f4faa0 + 1f4fe2c: e28d0028 add r0, sp, #40 ; 0x28 + 1f4fe30: eb000658 bl 1f51798 + 1f4fe34: e28d1028 add r1, sp, #40 ; 0x28 + 1f4fe38: e1a00006 mov r0, r6 + 1f4fe3c: ebffff47 bl 1f4fb60 + 1f4fe40: e28d0028 add r0, sp, #40 ; 0x28 + 1f4fe44: eb00066e bl 1f51804 + 1f4fe48: e3a01004 mov r1, #4 + 1f4fe4c: e1a03000 mov r3, r0 + 1f4fe50: e30324e0 movw r2, #13536 ; 0x34e0 + 1f4fe54: e34021f6 movt r2, #502 ; 0x1f6 + 1f4fe58: e3030560 movw r0, #13664 ; 0x3560 + 1f4fe5c: e34001f6 movt r0, #502 ; 0x1f6 + 1f4fe60: ebfec508 bl 1f01288 + 1f4fe64: e3a01002 mov r1, #2 + 1f4fe68: e1a00004 mov r0, r4 + 1f4fe6c: ebfffdf2 bl 1f4f63c + 1f4fe70: e3500000 cmp r0, #0 + 1f4fe74: 0a000002 beq 1f4fe84 + 1f4fe78: e5d03004 ldrb r3, [r0, #4] + 1f4fe7c: e3530001 cmp r3, #1 + 1f4fe80: 0a000012 beq 1f4fed0 + 1f4fe84: e1a00004 mov r0, r4 + 1f4fe88: e3031560 movw r1, #13664 ; 0x3560 + 1f4fe8c: e34011f6 movt r1, #502 ; 0x1f6 + 1f4fe90: e3a05000 mov r5, #0 + 1f4fe94: ebfffdea bl 1f4f644 + 1f4fe98: e28d0028 add r0, sp, #40 ; 0x28 + 1f4fe9c: eb00064e bl 1f517dc <_String> + 1f4fea0: e1a00005 mov r0, r5 + 1f4fea4: e28dd044 add sp, sp, #68 ; 0x44 + 1f4fea8: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f4feac: e3a01001 mov r1, #1 + 1f4feb0: e30324f4 movw r2, #13556 ; 0x34f4 + 1f4feb4: e34021f6 movt r2, #502 ; 0x1f6 + 1f4feb8: e3030560 movw r0, #13664 ; 0x3560 + 1f4febc: e34001f6 movt r0, #502 ; 0x1f6 + 1f4fec0: ebfec4f0 bl 1f01288 + 1f4fec4: e1a00005 mov r0, r5 + 1f4fec8: e28dd044 add sp, sp, #68 ; 0x44 + 1f4fecc: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f4fed0: e3a01004 mov r1, #4 + 1f4fed4: e1a00004 mov r0, r4 + 1f4fed8: ebfffdd7 bl 1f4f63c + 1f4fedc: e3500000 cmp r0, #0 + 1f4fee0: 0affffe7 beq 1f4fe84 + 1f4fee4: e5d03002 ldrb r3, [r0, #2] + 1f4fee8: e3530000 cmp r3, #0 + 1f4feec: 1affffe4 bne 1f4fe84 + 1f4fef0: e5d03003 ldrb r3, [r0, #3] + 1f4fef4: e3530000 cmp r3, #0 + 1f4fef8: 1affffe1 bne 1f4fe84 + 1f4fefc: e5d03004 ldrb r3, [r0, #4] + 1f4ff00: e3530003 cmp r3, #3 + 1f4ff04: 1affffde bne 1f4fe84 + 1f4ff08: ea000003 b 1f4ff1c + 1f4ff0c: e5d73003 ldrb r3, [r7, #3] + 1f4ff10: e203303f and r3, r3, #63 ; 0x3f + 1f4ff14: e3530002 cmp r3, #2 + 1f4ff18: 0a000046 beq 1f50038 + 1f4ff1c: e3a01005 mov r1, #5 + 1f4ff20: e1a00004 mov r0, r4 + 1f4ff24: ebfffdc4 bl 1f4f63c + 1f4ff28: e2507000 subs r7, r0, #0 + 1f4ff2c: 1afffff6 bne 1f4ff0c + 1f4ff30: e5943038 ldr r3, [r4, #56] ; 0x38 + 1f4ff34: e1a00004 mov r0, r4 + 1f4ff38: e3530000 cmp r3, #0 + 1f4ff3c: 0affffd1 beq 1f4fe88 + 1f4ff40: e594303c ldr r3, [r4, #60] ; 0x3c + 1f4ff44: e3530000 cmp r3, #0 + 1f4ff48: 0affffce beq 1f4fe88 + 1f4ff4c: ebfffc14 bl 1f4efa4 + 1f4ff50: e2505000 subs r5, r0, #0 + 1f4ff54: 0a000044 beq 1f5006c + 1f4ff58: e28d1020 add r1, sp, #32 + 1f4ff5c: e1a00006 mov r0, r6 + 1f4ff60: ebfffee1 bl 1f4faec + 1f4ff64: e28d5040 add r5, sp, #64 ; 0x40 + 1f4ff68: e5dd2025 ldrb r2, [sp, #37] ; 0x25 + 1f4ff6c: e1a00004 mov r0, r4 + 1f4ff70: e5dd3024 ldrb r3, [sp, #36] ; 0x24 + 1f4ff74: e3a06004 mov r6, #4 + 1f4ff78: e59d8020 ldr r8, [sp, #32] + 1f4ff7c: e1833402 orr r3, r3, r2, lsl #8 + 1f4ff80: e5253030 str r3, [r5, #-48]! ; 0xffffffd0 + 1f4ff84: ebfffda6 bl 1f4f624 + 1f4ff88: e1a09000 mov r9, r0 + 1f4ff8c: e1a00004 mov r0, r4 + 1f4ff90: ebfffda1 bl 1f4f61c + 1f4ff94: e3a02f41 mov r2, #260 ; 0x104 + 1f4ff98: e1a01000 mov r1, r0 + 1f4ff9c: e58d2004 str r2, [sp, #4] + 1f4ffa0: e58d5008 str r5, [sp, #8] + 1f4ffa4: e1a00009 mov r0, r9 + 1f4ffa8: e58d7000 str r7, [sp] + 1f4ffac: e3a030a0 mov r3, #160 ; 0xa0 + 1f4ffb0: e58d600c str r6, [sp, #12] + 1f4ffb4: e3a02040 mov r2, #64 ; 0x40 + 1f4ffb8: ebfff7da bl 1f4df28 + 1f4ffbc: e3500000 cmp r0, #0 + 1f4ffc0: ba000012 blt 1f50010 + 1f4ffc4: e28d5040 add r5, sp, #64 ; 0x40 + 1f4ffc8: e1a00004 mov r0, r4 + 1f4ffcc: e525802c str r8, [r5, #-44]! ; 0xffffffd4 + 1f4ffd0: ebfffd93 bl 1f4f624 + 1f4ffd4: e1a08000 mov r8, r0 + 1f4ffd8: e1a00004 mov r0, r4 + 1f4ffdc: ebfffd8e bl 1f4f61c + 1f4ffe0: e3a02f42 mov r2, #264 ; 0x108 + 1f4ffe4: e1a01000 mov r1, r0 + 1f4ffe8: e58d2004 str r2, [sp, #4] + 1f4ffec: e58d5008 str r5, [sp, #8] + 1f4fff0: e1a00008 mov r0, r8 + 1f4fff4: e58d600c str r6, [sp, #12] + 1f4fff8: e3a030a0 mov r3, #160 ; 0xa0 + 1f4fffc: e58d7000 str r7, [sp] + 1f50000: e3a02040 mov r2, #64 ; 0x40 + 1f50004: ebfff7c7 bl 1f4df28 + 1f50008: e3500000 cmp r0, #0 + 1f5000c: aa000028 bge 1f500b4 + 1f50010: e3032528 movw r2, #13608 ; 0x3528 + 1f50014: e34021f6 movt r2, #502 ; 0x1f6 + 1f50018: e3a01001 mov r1, #1 + 1f5001c: e3030560 movw r0, #13664 ; 0x3560 + 1f50020: e34001f6 movt r0, #502 ; 0x1f6 + 1f50024: ebfec497 bl 1f01288 + 1f50028: e28d0028 add r0, sp, #40 ; 0x28 + 1f5002c: e3a05000 mov r5, #0 + 1f50030: eb0005e9 bl 1f517dc <_String> + 1f50034: eaffff99 b 1f4fea0 + 1f50038: e1d730d2 ldrsb r3, [r7, #2] + 1f5003c: e3a00018 mov r0, #24 + 1f50040: e3530000 cmp r3, #0 + 1f50044: ba000011 blt 1f50090 + 1f50048: e594303c ldr r3, [r4, #60] ; 0x3c + 1f5004c: e3530000 cmp r3, #0 + 1f50050: 1affff8b bne 1f4fe84 + 1f50054: ebffb943 bl 1f3e568 + 1f50058: e1a02007 mov r2, r7 + 1f5005c: e584003c str r0, [r4, #60] ; 0x3c + 1f50060: e1a01004 mov r1, r4 + 1f50064: ebfffd85 bl 1f4f680 + 1f50068: eaffffab b 1f4ff1c + 1f5006c: e3a01001 mov r1, #1 + 1f50070: e303250c movw r2, #13580 ; 0x350c + 1f50074: e34021f6 movt r2, #502 ; 0x1f6 + 1f50078: e3030560 movw r0, #13664 ; 0x3560 + 1f5007c: e34001f6 movt r0, #502 ; 0x1f6 + 1f50080: ebfec480 bl 1f01288 + 1f50084: e28d0028 add r0, sp, #40 ; 0x28 + 1f50088: eb0005d3 bl 1f517dc <_String> + 1f5008c: eaffff83 b 1f4fea0 + 1f50090: e5943038 ldr r3, [r4, #56] ; 0x38 + 1f50094: e3530000 cmp r3, #0 + 1f50098: 1affff79 bne 1f4fe84 + 1f5009c: ebffb931 bl 1f3e568 + 1f500a0: e1a02007 mov r2, r7 + 1f500a4: e5840038 str r0, [r4, #56] ; 0x38 + 1f500a8: e1a01004 mov r1, r4 + 1f500ac: ebfffd73 bl 1f4f680 + 1f500b0: eaffff99 b 1f4ff1c + 1f500b4: e3a02000 mov r2, #0 + 1f500b8: e3402111 movt r2, #273 ; 0x111 + 1f500bc: e3a01024 mov r1, #36 ; 0x24 + 1f500c0: e1a00004 mov r0, r4 + 1f500c4: ebffff33 bl 1f4fd98 + 1f500c8: e3500000 cmp r0, #0 + 1f500cc: 0a000006 beq 1f500ec + 1f500d0: e3a0200c mov r2, #12 + 1f500d4: e3402080 movt r2, #128 ; 0x80 + 1f500d8: e3a01c01 mov r1, #256 ; 0x100 + 1f500dc: e1a00004 mov r0, r4 + 1f500e0: ebffff2c bl 1f4fd98 + 1f500e4: e3500000 cmp r0, #0 + 1f500e8: 1a000002 bne 1f500f8 + 1f500ec: e3032540 movw r2, #13632 ; 0x3540 + 1f500f0: e34021f6 movt r2, #502 ; 0x1f6 + 1f500f4: eaffffc7 b 1f50018 + 1f500f8: e1a02006 mov r2, r6 + 1f500fc: e3a01010 mov r1, #16 + 1f50100: e1a00004 mov r0, r4 + 1f50104: ebffff23 bl 1f4fd98 + 1f50108: e3500000 cmp r0, #0 + 1f5010c: 0afffff6 beq 1f500ec + 1f50110: e28d0034 add r0, sp, #52 ; 0x34 + 1f50114: e3a05001 mov r5, #1 + 1f50118: eb00059e bl 1f51798 + 1f5011c: e30c3604 movw r3, #50692 ; 0xc604 + 1f50120: e340320d movt r3, #525 ; 0x20d + 1f50124: e28d0034 add r0, sp, #52 ; 0x34 + 1f50128: e3031554 movw r1, #13652 ; 0x3554 + 1f5012c: e34011f6 movt r1, #502 ; 0x1f6 + 1f50130: e5932000 ldr r2, [r3] + 1f50134: e082c005 add ip, r2, r5 + 1f50138: e583c000 str ip, [r3] + 1f5013c: eb00098e bl 1f5277c + 1f50140: ebfffe3c bl 1f4fa38 + 1f50144: e1a06000 mov r6, r0 + 1f50148: e28d0034 add r0, sp, #52 ; 0x34 + 1f5014c: eb0005ac bl 1f51804 + 1f50150: e1a03007 mov r3, r7 + 1f50154: e1a01000 mov r1, r0 + 1f50158: e1a02004 mov r2, r4 + 1f5015c: e1a00006 mov r0, r6 + 1f50160: ebfffe0a bl 1f4f990 + 1f50164: e28d0034 add r0, sp, #52 ; 0x34 + 1f50168: eb00059b bl 1f517dc <_String> + 1f5016c: e28d0028 add r0, sp, #40 ; 0x28 + 1f50170: eb000599 bl 1f517dc <_String> + 1f50174: eaffff49 b 1f4fea0 + +01f50178 : + 1f50178: e92d40f0 push {r4, r5, r6, r7, lr} + 1f5017c: e1a04001 mov r4, r1 + 1f50180: e1a07000 mov r7, r0 + 1f50184: e24dd014 sub sp, sp, #20 + 1f50188: e1a06002 mov r6, r2 + 1f5018c: ebfffd24 bl 1f4f624 + 1f50190: e1a05000 mov r5, r0 + 1f50194: e1a00007 mov r0, r7 + 1f50198: e6ff4074 uxth r4, r4 + 1f5019c: ebfffd1e bl 1f4f61c + 1f501a0: e58d6008 str r6, [sp, #8] + 1f501a4: e1a01000 mov r1, r0 + 1f501a8: e58d4004 str r4, [sp, #4] + 1f501ac: e1a00005 mov r0, r5 + 1f501b0: e3a03004 mov r3, #4 + 1f501b4: e3a02000 mov r2, #0 + 1f501b8: e58d300c str r3, [sp, #12] + 1f501bc: e58d2000 str r2, [sp] + 1f501c0: e3a030a1 mov r3, #161 ; 0xa1 + 1f501c4: e3a020c0 mov r2, #192 ; 0xc0 + 1f501c8: ebfff756 bl 1f4df28 + 1f501cc: e2400004 sub r0, r0, #4 + 1f501d0: e16f0f10 clz r0, r0 + 1f501d4: e1a002a0 lsr r0, r0, #5 + 1f501d8: e28dd014 add sp, sp, #20 + 1f501dc: e8bd80f0 pop {r4, r5, r6, r7, pc} + +01f501e0 : + 1f501e0: e92d4010 push {r4, lr} + 1f501e4: e1a04000 mov r4, r0 + 1f501e8: ebfffba2 bl 1f4f078 + 1f501ec: e3a03000 mov r3, #0 + 1f501f0: e3012220 movw r2, #4640 ; 0x1220 + 1f501f4: e34021f5 movt r2, #501 ; 0x1f5 + 1f501f8: e3a00d19 mov r0, #1600 ; 0x640 + 1f501fc: e5842000 str r2, [r4] + 1f50200: e5843038 str r3, [r4, #56] ; 0x38 + 1f50204: e584303c str r3, [r4, #60] ; 0x3c + 1f50208: e584304c str r3, [r4, #76] ; 0x4c + 1f5020c: ebffb8d5 bl 1f3e568 + 1f50210: e584004c str r0, [r4, #76] ; 0x4c + 1f50214: e8bd8010 pop {r4, pc} + +01f50218 <_LAN7800Device>: + 1f50218: e92d4010 push {r4, lr} + 1f5021c: e1a04000 mov r4, r0 + 1f50220: e590004c ldr r0, [r0, #76] ; 0x4c + 1f50224: e3500000 cmp r0, #0 + 1f50228: 0a000002 beq 1f50238 <_LAN7800Device+0x20> + 1f5022c: ebffb8d5 bl 1f3e588 + 1f50230: e3a03000 mov r3, #0 + 1f50234: e584304c str r3, [r4, #76] ; 0x4c + 1f50238: e594003c ldr r0, [r4, #60] ; 0x3c + 1f5023c: e3500000 cmp r0, #0 + 1f50240: 0a000004 beq 1f50258 <_LAN7800Device+0x40> + 1f50244: ebfffd5a bl 1f4f7b4 <_USBEndpoint> + 1f50248: e594003c ldr r0, [r4, #60] ; 0x3c + 1f5024c: ebffb8cd bl 1f3e588 + 1f50250: e3a03000 mov r3, #0 + 1f50254: e584303c str r3, [r4, #60] ; 0x3c + 1f50258: e5940038 ldr r0, [r4, #56] ; 0x38 + 1f5025c: e3500000 cmp r0, #0 + 1f50260: 0a000004 beq 1f50278 <_LAN7800Device+0x60> + 1f50264: ebfffd52 bl 1f4f7b4 <_USBEndpoint> + 1f50268: e5940038 ldr r0, [r4, #56] ; 0x38 + 1f5026c: ebffb8c5 bl 1f3e588 + 1f50270: e3a03000 mov r3, #0 + 1f50274: e5843038 str r3, [r4, #56] ; 0x38 + 1f50278: e1a00004 mov r0, r4 + 1f5027c: e8bd4010 pop {r4, lr} + 1f50280: eafffbb9 b 1f4f16c <_USBDevice> + +01f50284 : + 1f50284: e2800040 add r0, r0, #64 ; 0x40 + 1f50288: e12fff1e bx lr + +01f5028c : + 1f5028c: e300c638 movw ip, #1592 ; 0x638 + 1f50290: e152000c cmp r2, ip + 1f50294: 9a000001 bls 1f502a0 + 1f50298: e3a00000 mov r0, #0 + 1f5029c: e12fff1e bx lr + 1f502a0: e92d4070 push {r4, r5, r6, lr} + 1f502a4: e1a04000 mov r4, r0 + 1f502a8: e590004c ldr r0, [r0, #76] ; 0x4c + 1f502ac: e1a05002 mov r5, r2 + 1f502b0: e2800008 add r0, r0, #8 + 1f502b4: eb000a1f bl 1f52b38 + 1f502b8: e594304c ldr r3, [r4, #76] ; 0x4c + 1f502bc: e3851501 orr r1, r5, #4194304 ; 0x400000 + 1f502c0: e3a02000 mov r2, #0 + 1f502c4: e1a00004 mov r0, r4 + 1f502c8: e8830006 stm r3, {r1, r2} + 1f502cc: ebfffcd4 bl 1f4f624 + 1f502d0: e2853008 add r3, r5, #8 + 1f502d4: e594204c ldr r2, [r4, #76] ; 0x4c + 1f502d8: e594103c ldr r1, [r4, #60] ; 0x3c + 1f502dc: ebfff739 bl 1f4dfc8 + 1f502e0: e1e00000 mvn r0, r0 + 1f502e4: e1a00fa0 lsr r0, r0, #31 + 1f502e8: e8bd8070 pop {r4, r5, r6, pc} + +01f502ec : + 1f502ec: e92d40f0 push {r4, r5, r6, r7, lr} + 1f502f0: e1a05000 mov r5, r0 + 1f502f4: e3a03d19 mov r3, #1600 ; 0x640 + 1f502f8: e24dd034 sub sp, sp, #52 ; 0x34 + 1f502fc: e3a04000 mov r4, #0 + 1f50300: e28d000c add r0, sp, #12 + 1f50304: e1a06001 mov r6, r1 + 1f50308: e1a07002 mov r7, r2 + 1f5030c: e1a02001 mov r2, r1 + 1f50310: e5951038 ldr r1, [r5, #56] ; 0x38 + 1f50314: e58d4000 str r4, [sp] + 1f50318: ebfffd52 bl 1f4f868 + 1f5031c: e1a00005 mov r0, r5 + 1f50320: ebfffcbf bl 1f4f624 + 1f50324: e28d100c add r1, sp, #12 + 1f50328: ebfff626 bl 1f4dbc8 + 1f5032c: e1500004 cmp r0, r4 + 1f50330: 0a000014 beq 1f50388 + 1f50334: e28d000c add r0, sp, #12 + 1f50338: ebfffd65 bl 1f4f8d4 + 1f5033c: e3500009 cmp r0, #9 + 1f50340: 9a000010 bls 1f50388 + 1f50344: e5963000 ldr r3, [r6] + 1f50348: e3130501 tst r3, #4194304 ; 0x400000 + 1f5034c: 1a000012 bne 1f5039c + 1f50350: e7ed3053 ubfx r3, r3, #0, #14 + 1f50354: e3530004 cmp r3, #4 + 1f50358: 9a00000a bls 1f50388 + 1f5035c: e2434004 sub r4, r3, #4 + 1f50360: e286100a add r1, r6, #10 + 1f50364: e1a02004 mov r2, r4 + 1f50368: e1a00006 mov r0, r6 + 1f5036c: eb0009f1 bl 1f52b38 + 1f50370: e28d000c add r0, sp, #12 + 1f50374: e5874000 str r4, [r7] + 1f50378: ebfffd47 bl 1f4f89c <_USBRequest> + 1f5037c: e3a00001 mov r0, #1 + 1f50380: e28dd034 add sp, sp, #52 ; 0x34 + 1f50384: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f50388: e28d000c add r0, sp, #12 + 1f5038c: ebfffd42 bl 1f4f89c <_USBRequest> + 1f50390: e3a00000 mov r0, #0 + 1f50394: e28dd034 add sp, sp, #52 ; 0x34 + 1f50398: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f5039c: e3a01002 mov r1, #2 + 1f503a0: e30324c8 movw r2, #13512 ; 0x34c8 + 1f503a4: e34021f6 movt r2, #502 ; 0x1f6 + 1f503a8: e3030608 movw r0, #13832 ; 0x3608 + 1f503ac: e34001f6 movt r0, #502 ; 0x1f6 + 1f503b0: ebfec3b4 bl 1f01288 + 1f503b4: e28d000c add r0, sp, #12 + 1f503b8: ebfffd37 bl 1f4f89c <_USBRequest> + 1f503bc: e1a00004 mov r0, r4 + 1f503c0: e28dd034 add sp, sp, #52 ; 0x34 + 1f503c4: e8bd80f0 pop {r4, r5, r6, r7, pc} + +01f503c8 : + 1f503c8: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f503cc: e30043e7 movw r4, #999 ; 0x3e7 + 1f503d0: e3a0b004 mov fp, #4 + 1f503d4: e24dd024 sub sp, sp, #36 ; 0x24 + 1f503d8: e3a0ae12 mov sl, #288 ; 0x120 + 1f503dc: e28d801c add r8, sp, #28 + 1f503e0: e3a09000 mov r9, #0 + 1f503e4: e1a05000 mov r5, r0 + 1f503e8: e3a00001 mov r0, #1 + 1f503ec: ebfec3ef bl 1f013b0 + 1f503f0: e1a00005 mov r0, r5 + 1f503f4: e3a07e12 mov r7, #288 ; 0x120 + 1f503f8: ebfffc89 bl 1f4f624 + 1f503fc: e1a06000 mov r6, r0 + 1f50400: e1a00005 mov r0, r5 + 1f50404: ebfffc84 bl 1f4f61c + 1f50408: e58db00c str fp, [sp, #12] + 1f5040c: e1a01000 mov r1, r0 + 1f50410: e58d8008 str r8, [sp, #8] + 1f50414: e1a00006 mov r0, r6 + 1f50418: e3a030a1 mov r3, #161 ; 0xa1 + 1f5041c: e88d0600 stm sp, {r9, sl} + 1f50420: e3a020c0 mov r2, #192 ; 0xc0 + 1f50424: ebfff6bf bl 1f4df28 + 1f50428: e3500004 cmp r0, #4 + 1f5042c: e1a06000 mov r6, r0 + 1f50430: 0a000009 beq 1f5045c + 1f50434: e1a03007 mov r3, r7 + 1f50438: e303256c movw r2, #13676 ; 0x356c + 1f5043c: e34021f6 movt r2, #502 ; 0x1f6 + 1f50440: e3030608 movw r0, #13832 ; 0x3608 + 1f50444: e34001f6 movt r0, #502 ; 0x1f6 + 1f50448: e3a01002 mov r1, #2 + 1f5044c: ebfec38d bl 1f01288 + 1f50450: e3a00000 mov r0, #0 + 1f50454: e28dd024 add sp, sp, #36 ; 0x24 + 1f50458: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f5045c: e59d301c ldr r3, [sp, #28] + 1f50460: e3a00001 mov r0, #1 + 1f50464: e0133000 ands r3, r3, r0 + 1f50468: e58d3014 str r3, [sp, #20] + 1f5046c: 0a000003 beq 1f50480 + 1f50470: ebfec3ce bl 1f013b0 + 1f50474: e2544001 subs r4, r4, #1 + 1f50478: 1affffdc bne 1f503f0 + 1f5047c: eafffff3 b 1f50450 + 1f50480: e28d4020 add r4, sp, #32 + 1f50484: e1a00005 mov r0, r5 + 1f50488: e3003841 movw r3, #2113 ; 0x841 + 1f5048c: e5243008 str r3, [r4, #-8]! + 1f50490: ebfffc63 bl 1f4f624 + 1f50494: e1a09000 mov r9, r0 + 1f50498: e1a00005 mov r0, r5 + 1f5049c: ebfffc5e bl 1f4f61c + 1f504a0: e59d3014 ldr r3, [sp, #20] + 1f504a4: e1a01000 mov r1, r0 + 1f504a8: e58d3000 str r3, [sp] + 1f504ac: e58d4008 str r4, [sp, #8] + 1f504b0: e1a00009 mov r0, r9 + 1f504b4: e58d600c str r6, [sp, #12] + 1f504b8: e3a030a0 mov r3, #160 ; 0xa0 + 1f504bc: e58d7004 str r7, [sp, #4] + 1f504c0: e3a02040 mov r2, #64 ; 0x40 + 1f504c4: ebfff697 bl 1f4df28 + 1f504c8: e3500000 cmp r0, #0 + 1f504cc: ba000024 blt 1f50564 + 1f504d0: e30093e7 movw r9, #999 ; 0x3e7 + 1f504d4: e3a00001 mov r0, #1 + 1f504d8: e59da014 ldr sl, [sp, #20] + 1f504dc: ebfec3b3 bl 1f013b0 + 1f504e0: e1a00005 mov r0, r5 + 1f504e4: ebfffc4e bl 1f4f624 + 1f504e8: e1a04000 mov r4, r0 + 1f504ec: e1a00005 mov r0, r5 + 1f504f0: ebfffc49 bl 1f4f61c + 1f504f4: e58d600c str r6, [sp, #12] + 1f504f8: e1a01000 mov r1, r0 + 1f504fc: e58d8008 str r8, [sp, #8] + 1f50500: e1a00004 mov r0, r4 + 1f50504: e58d7004 str r7, [sp, #4] + 1f50508: e58da000 str sl, [sp] + 1f5050c: e3a030a1 mov r3, #161 ; 0xa1 + 1f50510: e3a020c0 mov r2, #192 ; 0xc0 + 1f50514: ebfff683 bl 1f4df28 + 1f50518: e3500004 cmp r0, #4 + 1f5051c: e1a0b000 mov fp, r0 + 1f50520: 0a000007 beq 1f50544 + 1f50524: e303256c movw r2, #13676 ; 0x356c + 1f50528: e34021f6 movt r2, #502 ; 0x1f6 + 1f5052c: e3030608 movw r0, #13832 ; 0x3608 + 1f50530: e34001f6 movt r0, #502 ; 0x1f6 + 1f50534: e3a03e12 mov r3, #288 ; 0x120 + 1f50538: e3a01002 mov r1, #2 + 1f5053c: ebfec351 bl 1f01288 + 1f50540: eaffffc2 b 1f50450 + 1f50544: e59d301c ldr r3, [sp, #28] + 1f50548: e3a00001 mov r0, #1 + 1f5054c: e0134000 ands r4, r3, r0 + 1f50550: 0a00000b beq 1f50584 + 1f50554: ebfec395 bl 1f013b0 + 1f50558: e2599001 subs r9, r9, #1 + 1f5055c: 1affffdf bne 1f504e0 + 1f50560: eaffffba b 1f50450 + 1f50564: e1a03007 mov r3, r7 + 1f50568: e3032588 movw r2, #13704 ; 0x3588 + 1f5056c: e34021f6 movt r2, #502 ; 0x1f6 + 1f50570: e3030608 movw r0, #13832 ; 0x3608 + 1f50574: e34001f6 movt r0, #502 ; 0x1f6 + 1f50578: e3a01002 mov r1, #2 + 1f5057c: ebfec341 bl 1f01288 + 1f50580: eaffffb2 b 1f50450 + 1f50584: e1a00005 mov r0, r5 + 1f50588: e3a06f49 mov r6, #292 ; 0x124 + 1f5058c: ebfffc24 bl 1f4f624 + 1f50590: e1a07000 mov r7, r0 + 1f50594: e1a00005 mov r0, r5 + 1f50598: ebfffc1f bl 1f4f61c + 1f5059c: e3a030a1 mov r3, #161 ; 0xa1 + 1f505a0: e1a01000 mov r1, r0 + 1f505a4: e58db00c str fp, [sp, #12] + 1f505a8: e58d8008 str r8, [sp, #8] + 1f505ac: e1a00007 mov r0, r7 + 1f505b0: e88d0050 stm sp, {r4, r6} + 1f505b4: e3a020c0 mov r2, #192 ; 0xc0 + 1f505b8: ebfff65a bl 1f4df28 + 1f505bc: e3500004 cmp r0, #4 + 1f505c0: 11a03006 movne r3, r6 + 1f505c4: 1affff9b bne 1f50438 + 1f505c8: e1dd01bc ldrh r0, [sp, #28] + 1f505cc: e7e00150 ubfx r0, r0, #2, #1 + 1f505d0: e28dd024 add sp, sp, #36 ; 0x24 + 1f505d4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + +01f505d8 : + 1f505d8: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f505dc: e1a05000 mov r5, r0 + 1f505e0: e24dd044 sub sp, sp, #68 ; 0x44 + 1f505e4: e28d002c add r0, sp, #44 ; 0x2c + 1f505e8: ebfec332 bl 1f012b8 + 1f505ec: e3500000 cmp r0, #0 + 1f505f0: 1a000001 bne 1f505fc + 1f505f4: e28dd044 add sp, sp, #68 ; 0x44 + 1f505f8: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f505fc: e28d4040 add r4, sp, #64 ; 0x40 + 1f50600: e285a040 add sl, r5, #64 ; 0x40 + 1f50604: e28d102c add r1, sp, #44 ; 0x2c + 1f50608: e1a0000a mov r0, sl + 1f5060c: ebfffd23 bl 1f4faa0 + 1f50610: e59d802c ldr r8, [sp, #44] ; 0x2c + 1f50614: e5248024 str r8, [r4, #-36]! ; 0xffffffdc + 1f50618: e1a00005 mov r0, r5 + 1f5061c: e1dd93b0 ldrh r9, [sp, #48] ; 0x30 + 1f50620: ebfffbff bl 1f4f624 + 1f50624: e1a07000 mov r7, r0 + 1f50628: e1a00005 mov r0, r5 + 1f5062c: ebfffbfa bl 1f4f61c + 1f50630: e3a06004 mov r6, #4 + 1f50634: e58d4008 str r4, [sp, #8] + 1f50638: e1a01000 mov r1, r0 + 1f5063c: e3a04000 mov r4, #0 + 1f50640: e1a00007 mov r0, r7 + 1f50644: e3a030a0 mov r3, #160 ; 0xa0 + 1f50648: e3a07f47 mov r7, #284 ; 0x11c + 1f5064c: e58d600c str r6, [sp, #12] + 1f50650: e3a02040 mov r2, #64 ; 0x40 + 1f50654: e58d7004 str r7, [sp, #4] + 1f50658: e58d4000 str r4, [sp] + 1f5065c: ebfff631 bl 1f4df28 + 1f50660: e1500004 cmp r0, r4 + 1f50664: b1a03007 movlt r3, r7 + 1f50668: ba00004a blt 1f50798 + 1f5066c: e28d7040 add r7, sp, #64 ; 0x40 + 1f50670: e1a00005 mov r0, r5 + 1f50674: e3a0bf46 mov fp, #280 ; 0x118 + 1f50678: e5279020 str r9, [r7, #-32]! ; 0xffffffe0 + 1f5067c: ebfffbe8 bl 1f4f624 + 1f50680: e58d0014 str r0, [sp, #20] + 1f50684: e1a00005 mov r0, r5 + 1f50688: ebfffbe3 bl 1f4f61c + 1f5068c: e59d3014 ldr r3, [sp, #20] + 1f50690: e1a01000 mov r1, r0 + 1f50694: e58d7008 str r7, [sp, #8] + 1f50698: e1a00003 mov r0, r3 + 1f5069c: e58d600c str r6, [sp, #12] + 1f506a0: e88d0810 stm sp, {r4, fp} + 1f506a4: e3a030a0 mov r3, #160 ; 0xa0 + 1f506a8: e3a02040 mov r2, #64 ; 0x40 + 1f506ac: ebfff61d bl 1f4df28 + 1f506b0: e3500000 cmp r0, #0 + 1f506b4: ba000040 blt 1f507bc + 1f506b8: e28d7040 add r7, sp, #64 ; 0x40 + 1f506bc: e1a00005 mov r0, r5 + 1f506c0: e300b404 movw fp, #1028 ; 0x404 + 1f506c4: e527801c str r8, [r7, #-28]! ; 0xffffffe4 + 1f506c8: ebfffbd5 bl 1f4f624 + 1f506cc: e1a08000 mov r8, r0 + 1f506d0: e1a00005 mov r0, r5 + 1f506d4: ebfffbd0 bl 1f4f61c + 1f506d8: e58d7008 str r7, [sp, #8] + 1f506dc: e1a01000 mov r1, r0 + 1f506e0: e58d600c str r6, [sp, #12] + 1f506e4: e1a00008 mov r0, r8 + 1f506e8: e3a030a0 mov r3, #160 ; 0xa0 + 1f506ec: e88d0810 stm sp, {r4, fp} + 1f506f0: e3a02040 mov r2, #64 ; 0x40 + 1f506f4: ebfff60b bl 1f4df28 + 1f506f8: e3500000 cmp r0, #0 + 1f506fc: ba00002e blt 1f507bc + 1f50700: e28d7040 add r7, sp, #64 ; 0x40 + 1f50704: e3899102 orr r9, r9, #-2147483648 ; 0x80000000 + 1f50708: e1a00005 mov r0, r5 + 1f5070c: e3a08b01 mov r8, #1024 ; 0x400 + 1f50710: e5279018 str r9, [r7, #-24]! ; 0xffffffe8 + 1f50714: ebfffbc2 bl 1f4f624 + 1f50718: e1a09000 mov r9, r0 + 1f5071c: e1a00005 mov r0, r5 + 1f50720: ebfffbbd bl 1f4f61c + 1f50724: e58d7008 str r7, [sp, #8] + 1f50728: e1a01000 mov r1, r0 + 1f5072c: e58d600c str r6, [sp, #12] + 1f50730: e1a00009 mov r0, r9 + 1f50734: e3a030a0 mov r3, #160 ; 0xa0 + 1f50738: e88d0110 stm sp, {r4, r8} + 1f5073c: e3a02040 mov r2, #64 ; 0x40 + 1f50740: ebfff5f8 bl 1f4df28 + 1f50744: e3500000 cmp r0, #0 + 1f50748: ba000011 blt 1f50794 + 1f5074c: e28d0034 add r0, sp, #52 ; 0x34 + 1f50750: eb000410 bl 1f51798 + 1f50754: e28d1034 add r1, sp, #52 ; 0x34 + 1f50758: e1a0000a mov r0, sl + 1f5075c: ebfffcff bl 1f4fb60 + 1f50760: e28d0034 add r0, sp, #52 ; 0x34 + 1f50764: eb000426 bl 1f51804 + 1f50768: e1a01006 mov r1, r6 + 1f5076c: e1a03000 mov r3, r0 + 1f50770: e30324e0 movw r2, #13536 ; 0x34e0 + 1f50774: e34021f6 movt r2, #502 ; 0x1f6 + 1f50778: e3030608 movw r0, #13832 ; 0x3608 + 1f5077c: e34001f6 movt r0, #502 ; 0x1f6 + 1f50780: ebfec2c0 bl 1f01288 + 1f50784: e28d0034 add r0, sp, #52 ; 0x34 + 1f50788: eb000413 bl 1f517dc <_String> + 1f5078c: e3a00001 mov r0, #1 + 1f50790: eaffff97 b 1f505f4 + 1f50794: e1a03008 mov r3, r8 + 1f50798: e3a01002 mov r1, #2 + 1f5079c: e3032588 movw r2, #13704 ; 0x3588 + 1f507a0: e34021f6 movt r2, #502 ; 0x1f6 + 1f507a4: e3030608 movw r0, #13832 ; 0x3608 + 1f507a8: e34001f6 movt r0, #502 ; 0x1f6 + 1f507ac: ebfec2b5 bl 1f01288 + 1f507b0: e1a00004 mov r0, r4 + 1f507b4: e28dd044 add sp, sp, #68 ; 0x44 + 1f507b8: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f507bc: e1a0300b mov r3, fp + 1f507c0: eafffff4 b 1f50798 + +01f507c4 : + 1f507c4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f507c8: e30053e7 movw r5, #999 ; 0x3e7 + 1f507cc: e3a0b004 mov fp, #4 + 1f507d0: e24dd02c sub sp, sp, #44 ; 0x2c + 1f507d4: e3a0ae12 mov sl, #288 ; 0x120 + 1f507d8: e28d8024 add r8, sp, #36 ; 0x24 + 1f507dc: e3a09000 mov r9, #0 + 1f507e0: e1a04000 mov r4, r0 + 1f507e4: e3a00001 mov r0, #1 + 1f507e8: ebfec2f0 bl 1f013b0 + 1f507ec: e1a00004 mov r0, r4 + 1f507f0: e3a07e12 mov r7, #288 ; 0x120 + 1f507f4: ebfffb8a bl 1f4f624 + 1f507f8: e1a06000 mov r6, r0 + 1f507fc: e1a00004 mov r0, r4 + 1f50800: ebfffb85 bl 1f4f61c + 1f50804: e58db00c str fp, [sp, #12] + 1f50808: e1a01000 mov r1, r0 + 1f5080c: e58d8008 str r8, [sp, #8] + 1f50810: e1a00006 mov r0, r6 + 1f50814: e3a030a1 mov r3, #161 ; 0xa1 + 1f50818: e88d0600 stm sp, {r9, sl} + 1f5081c: e3a020c0 mov r2, #192 ; 0xc0 + 1f50820: ebfff5c0 bl 1f4df28 + 1f50824: e3500004 cmp r0, #4 + 1f50828: e1a06000 mov r6, r0 + 1f5082c: 0a000009 beq 1f50858 + 1f50830: e1a03007 mov r3, r7 + 1f50834: e303256c movw r2, #13676 ; 0x356c + 1f50838: e34021f6 movt r2, #502 ; 0x1f6 + 1f5083c: e3030608 movw r0, #13832 ; 0x3608 + 1f50840: e34001f6 movt r0, #502 ; 0x1f6 + 1f50844: e3a01002 mov r1, #2 + 1f50848: ebfec28e bl 1f01288 + 1f5084c: e3a00000 mov r0, #0 + 1f50850: e28dd02c add sp, sp, #44 ; 0x2c + 1f50854: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f50858: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f5085c: e3a00001 mov r0, #1 + 1f50860: e0133000 ands r3, r3, r0 + 1f50864: e58d3010 str r3, [sp, #16] + 1f50868: 0a000003 beq 1f5087c + 1f5086c: ebfec2cf bl 1f013b0 + 1f50870: e2555001 subs r5, r5, #1 + 1f50874: 1affffdc bne 1f507ec + 1f50878: eafffff3 b 1f5084c + 1f5087c: e28d5028 add r5, sp, #40 ; 0x28 + 1f50880: e1a00004 mov r0, r4 + 1f50884: e3003f41 movw r3, #3905 ; 0xf41 + 1f50888: e5253010 str r3, [r5, #-16]! + 1f5088c: ebfffb64 bl 1f4f624 + 1f50890: e1a09000 mov r9, r0 + 1f50894: e1a00004 mov r0, r4 + 1f50898: ebfffb5f bl 1f4f61c + 1f5089c: e59d3010 ldr r3, [sp, #16] + 1f508a0: e1a01000 mov r1, r0 + 1f508a4: e58d3000 str r3, [sp] + 1f508a8: e58d5008 str r5, [sp, #8] + 1f508ac: e1a00009 mov r0, r9 + 1f508b0: e58d600c str r6, [sp, #12] + 1f508b4: e3a030a0 mov r3, #160 ; 0xa0 + 1f508b8: e58d7004 str r7, [sp, #4] + 1f508bc: e3a02040 mov r2, #64 ; 0x40 + 1f508c0: ebfff598 bl 1f4df28 + 1f508c4: e3500000 cmp r0, #0 + 1f508c8: ba000025 blt 1f50964 + 1f508cc: e1a09006 mov r9, r6 + 1f508d0: e30053e7 movw r5, #999 ; 0x3e7 + 1f508d4: e3a00001 mov r0, #1 + 1f508d8: e59da010 ldr sl, [sp, #16] + 1f508dc: ebfec2b3 bl 1f013b0 + 1f508e0: e1a00004 mov r0, r4 + 1f508e4: ebfffb4e bl 1f4f624 + 1f508e8: e1a06000 mov r6, r0 + 1f508ec: e1a00004 mov r0, r4 + 1f508f0: ebfffb49 bl 1f4f61c + 1f508f4: e58d900c str r9, [sp, #12] + 1f508f8: e1a01000 mov r1, r0 + 1f508fc: e58d8008 str r8, [sp, #8] + 1f50900: e1a00006 mov r0, r6 + 1f50904: e58d7004 str r7, [sp, #4] + 1f50908: e58da000 str sl, [sp] + 1f5090c: e3a030a1 mov r3, #161 ; 0xa1 + 1f50910: e3a020c0 mov r2, #192 ; 0xc0 + 1f50914: ebfff583 bl 1f4df28 + 1f50918: e3500004 cmp r0, #4 + 1f5091c: e1a0b000 mov fp, r0 + 1f50920: 0a000007 beq 1f50944 + 1f50924: e303256c movw r2, #13676 ; 0x356c + 1f50928: e34021f6 movt r2, #502 ; 0x1f6 + 1f5092c: e3030608 movw r0, #13832 ; 0x3608 + 1f50930: e34001f6 movt r0, #502 ; 0x1f6 + 1f50934: e3a03e12 mov r3, #288 ; 0x120 + 1f50938: e3a01002 mov r1, #2 + 1f5093c: ebfec251 bl 1f01288 + 1f50940: eaffffc1 b 1f5084c + 1f50944: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f50948: e3a00001 mov r0, #1 + 1f5094c: e0136000 ands r6, r3, r0 + 1f50950: 0a00000b beq 1f50984 + 1f50954: ebfec295 bl 1f013b0 + 1f50958: e2555001 subs r5, r5, #1 + 1f5095c: 1affffdf bne 1f508e0 + 1f50960: eaffffb9 b 1f5084c + 1f50964: e1a03007 mov r3, r7 + 1f50968: e3032588 movw r2, #13704 ; 0x3588 + 1f5096c: e34021f6 movt r2, #502 ; 0x1f6 + 1f50970: e3030608 movw r0, #13832 ; 0x3608 + 1f50974: e34001f6 movt r0, #502 ; 0x1f6 + 1f50978: e3a01002 mov r1, #2 + 1f5097c: ebfec241 bl 1f01288 + 1f50980: eaffffb1 b 1f5084c + 1f50984: e1a00004 mov r0, r4 + 1f50988: e3a05f49 mov r5, #292 ; 0x124 + 1f5098c: ebfffb24 bl 1f4f624 + 1f50990: e1a07000 mov r7, r0 + 1f50994: e1a00004 mov r0, r4 + 1f50998: ebfffb1f bl 1f4f61c + 1f5099c: e3a030a1 mov r3, #161 ; 0xa1 + 1f509a0: e1a01000 mov r1, r0 + 1f509a4: e58db00c str fp, [sp, #12] + 1f509a8: e58d8008 str r8, [sp, #8] + 1f509ac: e1a00007 mov r0, r7 + 1f509b0: e58d6000 str r6, [sp] + 1f509b4: e3a020c0 mov r2, #192 ; 0xc0 + 1f509b8: e58d5004 str r5, [sp, #4] + 1f509bc: ebfff559 bl 1f4df28 + 1f509c0: e3500004 cmp r0, #4 + 1f509c4: e1a0a000 mov sl, r0 + 1f509c8: 11a03005 movne r3, r5 + 1f509cc: 1affff98 bne 1f50834 + 1f509d0: e30053e7 movw r5, #999 ; 0x3e7 + 1f509d4: e3a0be12 mov fp, #288 ; 0x120 + 1f509d8: e1dd32b4 ldrh r3, [sp, #36] ; 0x24 + 1f509dc: e3a00001 mov r0, #1 + 1f509e0: e58d3014 str r3, [sp, #20] + 1f509e4: ebfec271 bl 1f013b0 + 1f509e8: e1a00004 mov r0, r4 + 1f509ec: e3a09e12 mov r9, #288 ; 0x120 + 1f509f0: ebfffb0b bl 1f4f624 + 1f509f4: e1a07000 mov r7, r0 + 1f509f8: e1a00004 mov r0, r4 + 1f509fc: ebfffb06 bl 1f4f61c + 1f50a00: e58da00c str sl, [sp, #12] + 1f50a04: e1a01000 mov r1, r0 + 1f50a08: e58d8008 str r8, [sp, #8] + 1f50a0c: e1a00007 mov r0, r7 + 1f50a10: e3a030a1 mov r3, #161 ; 0xa1 + 1f50a14: e88d0840 stm sp, {r6, fp} + 1f50a18: e3a020c0 mov r2, #192 ; 0xc0 + 1f50a1c: ebfff541 bl 1f4df28 + 1f50a20: e3500004 cmp r0, #4 + 1f50a24: e1a07000 mov r7, r0 + 1f50a28: 11a03009 movne r3, r9 + 1f50a2c: 1affff80 bne 1f50834 + 1f50a30: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f50a34: e3a00001 mov r0, #1 + 1f50a38: e0133000 ands r3, r3, r0 + 1f50a3c: e58d3010 str r3, [sp, #16] + 1f50a40: 0a000003 beq 1f50a54 + 1f50a44: ebfec259 bl 1f013b0 + 1f50a48: e2555001 subs r5, r5, #1 + 1f50a4c: 1affffe5 bne 1f509e8 + 1f50a50: eaffff7d b 1f5084c + 1f50a54: e28d5028 add r5, sp, #40 ; 0x28 + 1f50a58: e59d3014 ldr r3, [sp, #20] + 1f50a5c: e1a00004 mov r0, r4 + 1f50a60: e3a06f49 mov r6, #292 ; 0x124 + 1f50a64: e2033cff and r3, r3, #65280 ; 0xff00 + 1f50a68: e3833061 orr r3, r3, #97 ; 0x61 + 1f50a6c: e525300c str r3, [r5, #-12]! + 1f50a70: ebfffaeb bl 1f4f624 + 1f50a74: e1a0a000 mov sl, r0 + 1f50a78: e1a00004 mov r0, r4 + 1f50a7c: ebfffae6 bl 1f4f61c + 1f50a80: e59d3010 ldr r3, [sp, #16] + 1f50a84: e1a01000 mov r1, r0 + 1f50a88: e58d5008 str r5, [sp, #8] + 1f50a8c: e88d0048 stm sp, {r3, r6} + 1f50a90: e58d700c str r7, [sp, #12] + 1f50a94: e1a0000a mov r0, sl + 1f50a98: e3a030a0 mov r3, #160 ; 0xa0 + 1f50a9c: e3a02040 mov r2, #64 ; 0x40 + 1f50aa0: ebfff520 bl 1f4df28 + 1f50aa4: e3500000 cmp r0, #0 + 1f50aa8: ba00002e blt 1f50b68 + 1f50aac: e28d5028 add r5, sp, #40 ; 0x28 + 1f50ab0: e1a00004 mov r0, r4 + 1f50ab4: e3003f43 movw r3, #3907 ; 0xf43 + 1f50ab8: e5253008 str r3, [r5, #-8]! + 1f50abc: ebfffad8 bl 1f4f624 + 1f50ac0: e1a06000 mov r6, r0 + 1f50ac4: e1a00004 mov r0, r4 + 1f50ac8: ebfffad3 bl 1f4f61c + 1f50acc: e59d3010 ldr r3, [sp, #16] + 1f50ad0: e1a01000 mov r1, r0 + 1f50ad4: e58d3000 str r3, [sp] + 1f50ad8: e58d5008 str r5, [sp, #8] + 1f50adc: e1a00006 mov r0, r6 + 1f50ae0: e58d700c str r7, [sp, #12] + 1f50ae4: e3a030a0 mov r3, #160 ; 0xa0 + 1f50ae8: e58d9004 str r9, [sp, #4] + 1f50aec: e3a02040 mov r2, #64 ; 0x40 + 1f50af0: ebfff50c bl 1f4df28 + 1f50af4: e3500000 cmp r0, #0 + 1f50af8: ba00001e blt 1f50b78 + 1f50afc: e30063e7 movw r6, #999 ; 0x3e7 + 1f50b00: e3a00001 mov r0, #1 + 1f50b04: e59d5010 ldr r5, [sp, #16] + 1f50b08: ebfec228 bl 1f013b0 + 1f50b0c: e1a00004 mov r0, r4 + 1f50b10: ebfffac3 bl 1f4f624 + 1f50b14: e1a0a000 mov sl, r0 + 1f50b18: e1a00004 mov r0, r4 + 1f50b1c: ebfffabe bl 1f4f61c + 1f50b20: e58d700c str r7, [sp, #12] + 1f50b24: e1a01000 mov r1, r0 + 1f50b28: e58d8008 str r8, [sp, #8] + 1f50b2c: e1a0000a mov r0, sl + 1f50b30: e3a030a1 mov r3, #161 ; 0xa1 + 1f50b34: e88d0220 stm sp, {r5, r9} + 1f50b38: e3a020c0 mov r2, #192 ; 0xc0 + 1f50b3c: ebfff4f9 bl 1f4df28 + 1f50b40: e3500004 cmp r0, #4 + 1f50b44: 1affff76 bne 1f50924 + 1f50b48: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f50b4c: e3a00001 mov r0, #1 + 1f50b50: e3130001 tst r3, #1 + 1f50b54: 0affff3d beq 1f50850 + 1f50b58: ebfec214 bl 1f013b0 + 1f50b5c: e2566001 subs r6, r6, #1 + 1f50b60: 1affffe9 bne 1f50b0c + 1f50b64: eaffff38 b 1f5084c + 1f50b68: e3032588 movw r2, #13704 ; 0x3588 + 1f50b6c: e34021f6 movt r2, #502 ; 0x1f6 + 1f50b70: e1a03006 mov r3, r6 + 1f50b74: eaffff30 b 1f5083c + 1f50b78: e1a03009 mov r3, r9 + 1f50b7c: e3032588 movw r2, #13704 ; 0x3588 + 1f50b80: e34021f6 movt r2, #502 ; 0x1f6 + 1f50b84: e3030608 movw r0, #13832 ; 0x3608 + 1f50b88: e34001f6 movt r0, #502 ; 0x1f6 + 1f50b8c: e3a01002 mov r1, #2 + 1f50b90: ebfec1bc bl 1f01288 + 1f50b94: e59d0010 ldr r0, [sp, #16] + 1f50b98: eaffff2c b 1f50850 + +01f50b9c : + 1f50b9c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f50ba0: e30043e7 movw r4, #999 ; 0x3e7 + 1f50ba4: e3a0b004 mov fp, #4 + 1f50ba8: e24dd02c sub sp, sp, #44 ; 0x2c + 1f50bac: e3a0ae12 mov sl, #288 ; 0x120 + 1f50bb0: e28d9024 add r9, sp, #36 ; 0x24 + 1f50bb4: e1a06000 mov r6, r0 + 1f50bb8: e3a00001 mov r0, #1 + 1f50bbc: e58d1014 str r1, [sp, #20] + 1f50bc0: e58d2010 str r2, [sp, #16] + 1f50bc4: ebfec1f9 bl 1f013b0 + 1f50bc8: e1a00006 mov r0, r6 + 1f50bcc: e3a08e12 mov r8, #288 ; 0x120 + 1f50bd0: ebfffa93 bl 1f4f624 + 1f50bd4: e1a05000 mov r5, r0 + 1f50bd8: e1a00006 mov r0, r6 + 1f50bdc: ebfffa8e bl 1f4f61c + 1f50be0: e3a03000 mov r3, #0 + 1f50be4: e1a01000 mov r1, r0 + 1f50be8: e58d3000 str r3, [sp] + 1f50bec: e58db00c str fp, [sp, #12] + 1f50bf0: e1a00005 mov r0, r5 + 1f50bf4: e58d9008 str r9, [sp, #8] + 1f50bf8: e3a030a1 mov r3, #161 ; 0xa1 + 1f50bfc: e58da004 str sl, [sp, #4] + 1f50c00: e3a020c0 mov r2, #192 ; 0xc0 + 1f50c04: ebfff4c7 bl 1f4df28 + 1f50c08: e3500004 cmp r0, #4 + 1f50c0c: e1a07000 mov r7, r0 + 1f50c10: 0a000009 beq 1f50c3c + 1f50c14: e303256c movw r2, #13676 ; 0x356c + 1f50c18: e34021f6 movt r2, #502 ; 0x1f6 + 1f50c1c: e1a03008 mov r3, r8 + 1f50c20: e3030608 movw r0, #13832 ; 0x3608 + 1f50c24: e34001f6 movt r0, #502 ; 0x1f6 + 1f50c28: e3a01002 mov r1, #2 + 1f50c2c: ebfec195 bl 1f01288 + 1f50c30: e3a00000 mov r0, #0 + 1f50c34: e28dd02c add sp, sp, #44 ; 0x2c + 1f50c38: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f50c3c: e59d5024 ldr r5, [sp, #36] ; 0x24 + 1f50c40: e3a00001 mov r0, #1 + 1f50c44: e0155000 ands r5, r5, r0 + 1f50c48: 0a000003 beq 1f50c5c + 1f50c4c: ebfec1d7 bl 1f013b0 + 1f50c50: e2544001 subs r4, r4, #1 + 1f50c54: 1affffdb bne 1f50bc8 + 1f50c58: eafffff4 b 1f50c30 + 1f50c5c: e28da028 add sl, sp, #40 ; 0x28 + 1f50c60: e59d3010 ldr r3, [sp, #16] + 1f50c64: e1a00006 mov r0, r6 + 1f50c68: e3a04f49 mov r4, #292 ; 0x124 + 1f50c6c: e52a300c str r3, [sl, #-12]! + 1f50c70: ebfffa6b bl 1f4f624 + 1f50c74: e1a0b000 mov fp, r0 + 1f50c78: e1a00006 mov r0, r6 + 1f50c7c: ebfffa66 bl 1f4f61c + 1f50c80: e58da008 str sl, [sp, #8] + 1f50c84: e1a01000 mov r1, r0 + 1f50c88: e58d700c str r7, [sp, #12] + 1f50c8c: e1a0000b mov r0, fp + 1f50c90: e58d5000 str r5, [sp] + 1f50c94: e58d4004 str r4, [sp, #4] + 1f50c98: e3a030a0 mov r3, #160 ; 0xa0 + 1f50c9c: e3a02040 mov r2, #64 ; 0x40 + 1f50ca0: ebfff4a0 bl 1f4df28 + 1f50ca4: e3500000 cmp r0, #0 + 1f50ca8: ba000039 blt 1f50d94 + 1f50cac: e59d3014 ldr r3, [sp, #20] + 1f50cb0: e28d4028 add r4, sp, #40 ; 0x28 + 1f50cb4: e1a00006 mov r0, r6 + 1f50cb8: e1a03303 lsl r3, r3, #6 + 1f50cbc: e2033d1f and r3, r3, #1984 ; 0x7c0 + 1f50cc0: e3833b02 orr r3, r3, #2048 ; 0x800 + 1f50cc4: e3833003 orr r3, r3, #3 + 1f50cc8: e5243008 str r3, [r4, #-8]! + 1f50ccc: ebfffa54 bl 1f4f624 + 1f50cd0: e1a0a000 mov sl, r0 + 1f50cd4: e1a00006 mov r0, r6 + 1f50cd8: ebfffa4f bl 1f4f61c + 1f50cdc: e58d4008 str r4, [sp, #8] + 1f50ce0: e1a01000 mov r1, r0 + 1f50ce4: e58d700c str r7, [sp, #12] + 1f50ce8: e1a0000a mov r0, sl + 1f50cec: e3a030a0 mov r3, #160 ; 0xa0 + 1f50cf0: e88d0120 stm sp, {r5, r8} + 1f50cf4: e3a02040 mov r2, #64 ; 0x40 + 1f50cf8: ebfff48a bl 1f4df28 + 1f50cfc: e3500000 cmp r0, #0 + 1f50d00: ba000027 blt 1f50da4 + 1f50d04: e30043e7 movw r4, #999 ; 0x3e7 + 1f50d08: e3a00001 mov r0, #1 + 1f50d0c: ebfec1a7 bl 1f013b0 + 1f50d10: e1a00006 mov r0, r6 + 1f50d14: ebfffa42 bl 1f4f624 + 1f50d18: e1a0a000 mov sl, r0 + 1f50d1c: e1a00006 mov r0, r6 + 1f50d20: ebfffa3d bl 1f4f61c + 1f50d24: e58d700c str r7, [sp, #12] + 1f50d28: e1a01000 mov r1, r0 + 1f50d2c: e58d9008 str r9, [sp, #8] + 1f50d30: e1a0000a mov r0, sl + 1f50d34: e3a030a1 mov r3, #161 ; 0xa1 + 1f50d38: e88d0120 stm sp, {r5, r8} + 1f50d3c: e3a020c0 mov r2, #192 ; 0xc0 + 1f50d40: ebfff478 bl 1f4df28 + 1f50d44: e3500004 cmp r0, #4 + 1f50d48: 0a000009 beq 1f50d74 + 1f50d4c: e3a03e12 mov r3, #288 ; 0x120 + 1f50d50: e3a01002 mov r1, #2 + 1f50d54: e303256c movw r2, #13676 ; 0x356c + 1f50d58: e34021f6 movt r2, #502 ; 0x1f6 + 1f50d5c: e3030608 movw r0, #13832 ; 0x3608 + 1f50d60: e34001f6 movt r0, #502 ; 0x1f6 + 1f50d64: ebfec147 bl 1f01288 + 1f50d68: e3a00000 mov r0, #0 + 1f50d6c: e28dd02c add sp, sp, #44 ; 0x2c + 1f50d70: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f50d74: e59d3024 ldr r3, [sp, #36] ; 0x24 + 1f50d78: e3a00001 mov r0, #1 + 1f50d7c: e3130001 tst r3, #1 + 1f50d80: 0affffab beq 1f50c34 + 1f50d84: ebfec189 bl 1f013b0 + 1f50d88: e2544001 subs r4, r4, #1 + 1f50d8c: 1affffdf bne 1f50d10 + 1f50d90: eaffffa6 b 1f50c30 + 1f50d94: e3032588 movw r2, #13704 ; 0x3588 + 1f50d98: e34021f6 movt r2, #502 ; 0x1f6 + 1f50d9c: e1a03004 mov r3, r4 + 1f50da0: eaffff9e b 1f50c20 + 1f50da4: e3032588 movw r2, #13704 ; 0x3588 + 1f50da8: e34021f6 movt r2, #502 ; 0x1f6 + 1f50dac: e1a03008 mov r3, r8 + 1f50db0: eaffff9a b 1f50c20 + +01f50db4 : + 1f50db4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f50db8: e30043e7 movw r4, #999 ; 0x3e7 + 1f50dbc: e3a0b004 mov fp, #4 + 1f50dc0: e24dd024 sub sp, sp, #36 ; 0x24 + 1f50dc4: e3a0ae12 mov sl, #288 ; 0x120 + 1f50dc8: e28d901c add r9, sp, #28 + 1f50dcc: e1a06000 mov r6, r0 + 1f50dd0: e3a00001 mov r0, #1 + 1f50dd4: e58d1010 str r1, [sp, #16] + 1f50dd8: e58d2014 str r2, [sp, #20] + 1f50ddc: ebfec173 bl 1f013b0 + 1f50de0: e1a00006 mov r0, r6 + 1f50de4: e3a08e12 mov r8, #288 ; 0x120 + 1f50de8: ebfffa0d bl 1f4f624 + 1f50dec: e1a05000 mov r5, r0 + 1f50df0: e1a00006 mov r0, r6 + 1f50df4: ebfffa08 bl 1f4f61c + 1f50df8: e3a03000 mov r3, #0 + 1f50dfc: e1a01000 mov r1, r0 + 1f50e00: e58d3000 str r3, [sp] + 1f50e04: e58db00c str fp, [sp, #12] + 1f50e08: e1a00005 mov r0, r5 + 1f50e0c: e58d9008 str r9, [sp, #8] + 1f50e10: e3a030a1 mov r3, #161 ; 0xa1 + 1f50e14: e58da004 str sl, [sp, #4] + 1f50e18: e3a020c0 mov r2, #192 ; 0xc0 + 1f50e1c: ebfff441 bl 1f4df28 + 1f50e20: e3500004 cmp r0, #4 + 1f50e24: e1a07000 mov r7, r0 + 1f50e28: 0a000009 beq 1f50e54 + 1f50e2c: e1a03008 mov r3, r8 + 1f50e30: e303256c movw r2, #13676 ; 0x356c + 1f50e34: e34021f6 movt r2, #502 ; 0x1f6 + 1f50e38: e3030608 movw r0, #13832 ; 0x3608 + 1f50e3c: e34001f6 movt r0, #502 ; 0x1f6 + 1f50e40: e3a01002 mov r1, #2 + 1f50e44: ebfec10f bl 1f01288 + 1f50e48: e3a00000 mov r0, #0 + 1f50e4c: e28dd024 add sp, sp, #36 ; 0x24 + 1f50e50: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f50e54: e59d501c ldr r5, [sp, #28] + 1f50e58: e3a00001 mov r0, #1 + 1f50e5c: e0155000 ands r5, r5, r0 + 1f50e60: 0a000003 beq 1f50e74 + 1f50e64: ebfec151 bl 1f013b0 + 1f50e68: e2544001 subs r4, r4, #1 + 1f50e6c: 1affffdb bne 1f50de0 + 1f50e70: eafffff4 b 1f50e48 + 1f50e74: e59d3010 ldr r3, [sp, #16] + 1f50e78: e28d4020 add r4, sp, #32 + 1f50e7c: e1a00006 mov r0, r6 + 1f50e80: e1a03303 lsl r3, r3, #6 + 1f50e84: e2033d1f and r3, r3, #1984 ; 0x7c0 + 1f50e88: e3833b02 orr r3, r3, #2048 ; 0x800 + 1f50e8c: e3833001 orr r3, r3, #1 + 1f50e90: e5243008 str r3, [r4, #-8]! + 1f50e94: ebfff9e2 bl 1f4f624 + 1f50e98: e1a0a000 mov sl, r0 + 1f50e9c: e1a00006 mov r0, r6 + 1f50ea0: ebfff9dd bl 1f4f61c + 1f50ea4: e58d4008 str r4, [sp, #8] + 1f50ea8: e1a01000 mov r1, r0 + 1f50eac: e58d700c str r7, [sp, #12] + 1f50eb0: e1a0000a mov r0, sl + 1f50eb4: e3a030a0 mov r3, #160 ; 0xa0 + 1f50eb8: e88d0120 stm sp, {r5, r8} + 1f50ebc: e3a02040 mov r2, #64 ; 0x40 + 1f50ec0: ebfff418 bl 1f4df28 + 1f50ec4: e3500000 cmp r0, #0 + 1f50ec8: ba000024 blt 1f50f60 + 1f50ecc: e300a3e7 movw sl, #999 ; 0x3e7 + 1f50ed0: e3a00001 mov r0, #1 + 1f50ed4: ebfec135 bl 1f013b0 + 1f50ed8: e1a00006 mov r0, r6 + 1f50edc: ebfff9d0 bl 1f4f624 + 1f50ee0: e1a04000 mov r4, r0 + 1f50ee4: e1a00006 mov r0, r6 + 1f50ee8: ebfff9cb bl 1f4f61c + 1f50eec: e58d700c str r7, [sp, #12] + 1f50ef0: e1a01000 mov r1, r0 + 1f50ef4: e58d9008 str r9, [sp, #8] + 1f50ef8: e1a00004 mov r0, r4 + 1f50efc: e3a030a1 mov r3, #161 ; 0xa1 + 1f50f00: e88d0120 stm sp, {r5, r8} + 1f50f04: e3a020c0 mov r2, #192 ; 0xc0 + 1f50f08: ebfff406 bl 1f4df28 + 1f50f0c: e3500004 cmp r0, #4 + 1f50f10: e1a0b000 mov fp, r0 + 1f50f14: 0a000009 beq 1f50f40 + 1f50f18: e3a03e12 mov r3, #288 ; 0x120 + 1f50f1c: e3a01002 mov r1, #2 + 1f50f20: e303256c movw r2, #13676 ; 0x356c + 1f50f24: e34021f6 movt r2, #502 ; 0x1f6 + 1f50f28: e3030608 movw r0, #13832 ; 0x3608 + 1f50f2c: e34001f6 movt r0, #502 ; 0x1f6 + 1f50f30: ebfec0d4 bl 1f01288 + 1f50f34: e3a00000 mov r0, #0 + 1f50f38: e28dd024 add sp, sp, #36 ; 0x24 + 1f50f3c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f50f40: e59d301c ldr r3, [sp, #28] + 1f50f44: e3a00001 mov r0, #1 + 1f50f48: e0133000 ands r3, r3, r0 + 1f50f4c: 0a000007 beq 1f50f70 + 1f50f50: ebfec116 bl 1f013b0 + 1f50f54: e25aa001 subs sl, sl, #1 + 1f50f58: 1affffde bne 1f50ed8 + 1f50f5c: eaffffb9 b 1f50e48 + 1f50f60: e3032588 movw r2, #13704 ; 0x3588 + 1f50f64: e34021f6 movt r2, #502 ; 0x1f6 + 1f50f68: e1a03008 mov r3, r8 + 1f50f6c: eaffffb1 b 1f50e38 + 1f50f70: e1a00006 mov r0, r6 + 1f50f74: e1a04003 mov r4, r3 + 1f50f78: ebfff9a9 bl 1f4f624 + 1f50f7c: e1a07000 mov r7, r0 + 1f50f80: e1a00006 mov r0, r6 + 1f50f84: e3a05f49 mov r5, #292 ; 0x124 + 1f50f88: ebfff9a3 bl 1f4f61c + 1f50f8c: e3a030a1 mov r3, #161 ; 0xa1 + 1f50f90: e1a01000 mov r1, r0 + 1f50f94: e58db00c str fp, [sp, #12] + 1f50f98: e58d9008 str r9, [sp, #8] + 1f50f9c: e1a00007 mov r0, r7 + 1f50fa0: e88d0030 stm sp, {r4, r5} + 1f50fa4: e3a020c0 mov r2, #192 ; 0xc0 + 1f50fa8: ebfff3de bl 1f4df28 + 1f50fac: e3500004 cmp r0, #4 + 1f50fb0: 11a03005 movne r3, r5 + 1f50fb4: 1affff9d bne 1f50e30 + 1f50fb8: e59d2014 ldr r2, [sp, #20] + 1f50fbc: e3a00001 mov r0, #1 + 1f50fc0: e59d301c ldr r3, [sp, #28] + 1f50fc4: e1c230b0 strh r3, [r2] + 1f50fc8: eaffff9f b 1f50e4c + +01f50fcc : + 1f50fcc: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f50fd0: e30043e7 movw r4, #999 ; 0x3e7 + 1f50fd4: e3a07004 mov r7, #4 + 1f50fd8: e24dd024 sub sp, sp, #36 ; 0x24 + 1f50fdc: e3a06000 mov r6, #0 + 1f50fe0: e28d801c add r8, sp, #28 + 1f50fe4: e1a05000 mov r5, r0 + 1f50fe8: e3a00001 mov r0, #1 + 1f50fec: e1a0b002 mov fp, r2 + 1f50ff0: e58d1014 str r1, [sp, #20] + 1f50ff4: e6ff9071 uxth r9, r1 + 1f50ff8: e58d3010 str r3, [sp, #16] + 1f50ffc: ebfec0eb bl 1f013b0 + 1f51000: e1a00005 mov r0, r5 + 1f51004: ebfff986 bl 1f4f624 + 1f51008: e1a0a000 mov sl, r0 + 1f5100c: e1a00005 mov r0, r5 + 1f51010: ebfff981 bl 1f4f61c + 1f51014: e58d700c str r7, [sp, #12] + 1f51018: e1a01000 mov r1, r0 + 1f5101c: e58d8008 str r8, [sp, #8] + 1f51020: e1a0000a mov r0, sl + 1f51024: e3a030a1 mov r3, #161 ; 0xa1 + 1f51028: e88d0240 stm sp, {r6, r9} + 1f5102c: e3a020c0 mov r2, #192 ; 0xc0 + 1f51030: ebfff3bc bl 1f4df28 + 1f51034: e3500004 cmp r0, #4 + 1f51038: 0a000009 beq 1f51064 + 1f5103c: e303256c movw r2, #13676 ; 0x356c + 1f51040: e34021f6 movt r2, #502 ; 0x1f6 + 1f51044: e3030608 movw r0, #13832 ; 0x3608 + 1f51048: e34001f6 movt r0, #502 ; 0x1f6 + 1f5104c: e59d3014 ldr r3, [sp, #20] + 1f51050: e3a01002 mov r1, #2 + 1f51054: ebfec08b bl 1f01288 + 1f51058: e3a00000 mov r0, #0 + 1f5105c: e28dd024 add sp, sp, #36 ; 0x24 + 1f51060: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f51064: e59d301c ldr r3, [sp, #28] + 1f51068: e3a00001 mov r0, #1 + 1f5106c: e59d2010 ldr r2, [sp, #16] + 1f51070: e003300b and r3, r3, fp + 1f51074: e1530002 cmp r3, r2 + 1f51078: 0afffff7 beq 1f5105c + 1f5107c: ebfec0cb bl 1f013b0 + 1f51080: e2544001 subs r4, r4, #1 + 1f51084: 1affffdd bne 1f51000 + 1f51088: eafffff2 b 1f51058 + +01f5108c : + 1f5108c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f51090: e1a06001 mov r6, r1 + 1f51094: e1a05000 mov r5, r0 + 1f51098: e24dd01c sub sp, sp, #28 + 1f5109c: e1a07002 mov r7, r2 + 1f510a0: e1a0a003 mov sl, r3 + 1f510a4: ebfff95e bl 1f4f624 + 1f510a8: e1a04000 mov r4, r0 + 1f510ac: e1a00005 mov r0, r5 + 1f510b0: ebfff959 bl 1f4f61c + 1f510b4: e6ff8076 uxth r8, r6 + 1f510b8: e1a01000 mov r1, r0 + 1f510bc: e3a02004 mov r2, #4 + 1f510c0: e1a00004 mov r0, r4 + 1f510c4: e28d3010 add r3, sp, #16 + 1f510c8: e58d200c str r2, [sp, #12] + 1f510cc: e3a04000 mov r4, #0 + 1f510d0: e58d3008 str r3, [sp, #8] + 1f510d4: e3a020c0 mov r2, #192 ; 0xc0 + 1f510d8: e58d8004 str r8, [sp, #4] + 1f510dc: e3a030a1 mov r3, #161 ; 0xa1 + 1f510e0: e58d4000 str r4, [sp] + 1f510e4: ebfff38f bl 1f4df28 + 1f510e8: e3500004 cmp r0, #4 + 1f510ec: 0a000009 beq 1f51118 + 1f510f0: e303256c movw r2, #13676 ; 0x356c + 1f510f4: e34021f6 movt r2, #502 ; 0x1f6 + 1f510f8: e1a03006 mov r3, r6 + 1f510fc: e3a01002 mov r1, #2 + 1f51100: e3030608 movw r0, #13832 ; 0x3608 + 1f51104: e34001f6 movt r0, #502 ; 0x1f6 + 1f51108: ebfec05e bl 1f01288 + 1f5110c: e1a00004 mov r0, r4 + 1f51110: e28dd01c add sp, sp, #28 + 1f51114: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f51118: e59d3010 ldr r3, [sp, #16] + 1f5111c: e28db018 add fp, sp, #24 + 1f51120: e1a09000 mov r9, r0 + 1f51124: e1a00005 mov r0, r5 + 1f51128: e00aa003 and sl, sl, r3 + 1f5112c: e18a7007 orr r7, sl, r7 + 1f51130: e52b7004 str r7, [fp, #-4]! + 1f51134: e58d7010 str r7, [sp, #16] + 1f51138: ebfff939 bl 1f4f624 + 1f5113c: e1a07000 mov r7, r0 + 1f51140: e1a00005 mov r0, r5 + 1f51144: ebfff934 bl 1f4f61c + 1f51148: e58db008 str fp, [sp, #8] + 1f5114c: e1a01000 mov r1, r0 + 1f51150: e58d900c str r9, [sp, #12] + 1f51154: e1a00007 mov r0, r7 + 1f51158: e3a030a0 mov r3, #160 ; 0xa0 + 1f5115c: e88d0110 stm sp, {r4, r8} + 1f51160: e3a02040 mov r2, #64 ; 0x40 + 1f51164: ebfff36f bl 1f4df28 + 1f51168: e3500000 cmp r0, #0 + 1f5116c: ba000002 blt 1f5117c + 1f51170: e3a00001 mov r0, #1 + 1f51174: e28dd01c add sp, sp, #28 + 1f51178: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f5117c: e3032588 movw r2, #13704 ; 0x3588 + 1f51180: e34021f6 movt r2, #502 ; 0x1f6 + 1f51184: e1a03006 mov r3, r6 + 1f51188: eaffffdb b 1f510fc + +01f5118c : + 1f5118c: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f51190: e1a06001 mov r6, r1 + 1f51194: e1a08000 mov r8, r0 + 1f51198: e24dd018 sub sp, sp, #24 + 1f5119c: e3a04000 mov r4, #0 + 1f511a0: e28d5018 add r5, sp, #24 + 1f511a4: e5252004 str r2, [r5, #-4]! + 1f511a8: ebfff91d bl 1f4f624 + 1f511ac: e1a07000 mov r7, r0 + 1f511b0: e1a00008 mov r0, r8 + 1f511b4: ebfff918 bl 1f4f61c + 1f511b8: e6ff3076 uxth r3, r6 + 1f511bc: e1a01000 mov r1, r0 + 1f511c0: e58d3004 str r3, [sp, #4] + 1f511c4: e58d5008 str r5, [sp, #8] + 1f511c8: e3a03004 mov r3, #4 + 1f511cc: e1a00007 mov r0, r7 + 1f511d0: e58d300c str r3, [sp, #12] + 1f511d4: e58d4000 str r4, [sp] + 1f511d8: e3a030a0 mov r3, #160 ; 0xa0 + 1f511dc: e3a02040 mov r2, #64 ; 0x40 + 1f511e0: ebfff350 bl 1f4df28 + 1f511e4: e1500004 cmp r0, r4 + 1f511e8: a3a00001 movge r0, #1 + 1f511ec: ba000001 blt 1f511f8 + 1f511f0: e28dd018 add sp, sp, #24 + 1f511f4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f511f8: e1a03006 mov r3, r6 + 1f511fc: e3a01002 mov r1, #2 + 1f51200: e3032588 movw r2, #13704 ; 0x3588 + 1f51204: e34021f6 movt r2, #502 ; 0x1f6 + 1f51208: e3030608 movw r0, #13832 ; 0x3608 + 1f5120c: e34001f6 movt r0, #502 ; 0x1f6 + 1f51210: ebfec01c bl 1f01288 + 1f51214: e1a00004 mov r0, r4 + 1f51218: e28dd018 add sp, sp, #24 + 1f5121c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f51220 : + 1f51220: e92d4070 push {r4, r5, r6, lr} + 1f51224: e3a01002 mov r1, #2 + 1f51228: e1a04000 mov r4, r0 + 1f5122c: e24dd020 sub sp, sp, #32 + 1f51230: ebfff901 bl 1f4f63c + 1f51234: e3500000 cmp r0, #0 + 1f51238: 0a000002 beq 1f51248 + 1f5123c: e5d03004 ldrb r3, [r0, #4] + 1f51240: e3530001 cmp r3, #1 + 1f51244: 0a000007 beq 1f51268 + 1f51248: e3a05000 mov r5, #0 + 1f5124c: e1a00004 mov r0, r4 + 1f51250: e3031608 movw r1, #13832 ; 0x3608 + 1f51254: e34011f6 movt r1, #502 ; 0x1f6 + 1f51258: ebfff8f9 bl 1f4f644 + 1f5125c: e1a00005 mov r0, r5 + 1f51260: e28dd020 add sp, sp, #32 + 1f51264: e8bd8070 pop {r4, r5, r6, pc} + 1f51268: e3a01004 mov r1, #4 + 1f5126c: e1a00004 mov r0, r4 + 1f51270: ebfff8f1 bl 1f4f63c + 1f51274: e3500000 cmp r0, #0 + 1f51278: 0afffff2 beq 1f51248 + 1f5127c: e5d03002 ldrb r3, [r0, #2] + 1f51280: e3530000 cmp r3, #0 + 1f51284: 1affffef bne 1f51248 + 1f51288: e5d03003 ldrb r3, [r0, #3] + 1f5128c: e3530000 cmp r3, #0 + 1f51290: 1affffec bne 1f51248 + 1f51294: e5d03004 ldrb r3, [r0, #4] + 1f51298: e3530003 cmp r3, #3 + 1f5129c: 1affffe9 bne 1f51248 + 1f512a0: ea000003 b 1f512b4 + 1f512a4: e5d63003 ldrb r3, [r6, #3] + 1f512a8: e203303f and r3, r3, #63 ; 0x3f + 1f512ac: e3530002 cmp r3, #2 + 1f512b0: 0a000030 beq 1f51378 + 1f512b4: e3a01005 mov r1, #5 + 1f512b8: e1a00004 mov r0, r4 + 1f512bc: ebfff8de bl 1f4f63c + 1f512c0: e2506000 subs r6, r0, #0 + 1f512c4: 1afffff6 bne 1f512a4 + 1f512c8: e5943038 ldr r3, [r4, #56] ; 0x38 + 1f512cc: e1a00004 mov r0, r4 + 1f512d0: e3530000 cmp r3, #0 + 1f512d4: 0a00005d beq 1f51450 + 1f512d8: e594303c ldr r3, [r4, #60] ; 0x3c + 1f512dc: e3530000 cmp r3, #0 + 1f512e0: 0a00005a beq 1f51450 + 1f512e4: ebfff72e bl 1f4efa4 + 1f512e8: e2505000 subs r5, r0, #0 + 1f512ec: 0a000047 beq 1f51410 + 1f512f0: e1a00004 mov r0, r4 + 1f512f4: ebfff8ca bl 1f4f624 + 1f512f8: e1a05000 mov r5, r0 + 1f512fc: e1a00004 mov r0, r4 + 1f51300: ebfff8c5 bl 1f4f61c + 1f51304: e3a02004 mov r2, #4 + 1f51308: e1a01000 mov r1, r0 + 1f5130c: e28d3010 add r3, sp, #16 + 1f51310: e58d200c str r2, [sp, #12] + 1f51314: e1a00005 mov r0, r5 + 1f51318: e58d3008 str r3, [sp, #8] + 1f5131c: e3a020c0 mov r2, #192 ; 0xc0 + 1f51320: e58d6004 str r6, [sp, #4] + 1f51324: e3a030a1 mov r3, #161 ; 0xa1 + 1f51328: e58d6000 str r6, [sp] + 1f5132c: ebfff2fd bl 1f4df28 + 1f51330: e3500004 cmp r0, #4 + 1f51334: 0a00001c beq 1f513ac + 1f51338: e1a03006 mov r3, r6 + 1f5133c: e303256c movw r2, #13676 ; 0x356c + 1f51340: e34021f6 movt r2, #502 ; 0x1f6 + 1f51344: e3030608 movw r0, #13832 ; 0x3608 + 1f51348: e34001f6 movt r0, #502 ; 0x1f6 + 1f5134c: e3a01002 mov r1, #2 + 1f51350: ebfebfcc bl 1f01288 + 1f51354: e1dd31b2 ldrh r3, [sp, #18] + 1f51358: e30325a4 movw r2, #13732 ; 0x35a4 + 1f5135c: e34021f6 movt r2, #502 ; 0x1f6 + 1f51360: e3030608 movw r0, #13832 ; 0x3608 + 1f51364: e34001f6 movt r0, #502 ; 0x1f6 + 1f51368: e3a01001 mov r1, #1 + 1f5136c: e3a05000 mov r5, #0 + 1f51370: ebfebfc4 bl 1f01288 + 1f51374: eaffffb8 b 1f5125c + 1f51378: e1d630d2 ldrsb r3, [r6, #2] + 1f5137c: e3a00018 mov r0, #24 + 1f51380: e3530000 cmp r3, #0 + 1f51384: ba000028 blt 1f5142c + 1f51388: e594303c ldr r3, [r4, #60] ; 0x3c + 1f5138c: e3530000 cmp r3, #0 + 1f51390: 1affffac bne 1f51248 + 1f51394: ebffb473 bl 1f3e568 + 1f51398: e1a02006 mov r2, r6 + 1f5139c: e584003c str r0, [r4, #60] ; 0x3c + 1f513a0: e1a01004 mov r1, r4 + 1f513a4: ebfff8b5 bl 1f4f680 + 1f513a8: eaffffc1 b 1f512b4 + 1f513ac: e1dd31b2 ldrh r3, [sp, #18] + 1f513b0: e3530b1e cmp r3, #30720 ; 0x7800 + 1f513b4: 1affffe7 bne 1f51358 + 1f513b8: e3e03000 mvn r3, #0 + 1f513bc: e3a02002 mov r2, #2 + 1f513c0: e3a01010 mov r1, #16 + 1f513c4: e1a00004 mov r0, r4 + 1f513c8: ebffff2f bl 1f5108c + 1f513cc: e3500000 cmp r0, #0 + 1f513d0: 0a000006 beq 1f513f0 + 1f513d4: e1a03006 mov r3, r6 + 1f513d8: e3a02002 mov r2, #2 + 1f513dc: e3a01010 mov r1, #16 + 1f513e0: e1a00004 mov r0, r4 + 1f513e4: ebfffef8 bl 1f50fcc + 1f513e8: e3500000 cmp r0, #0 + 1f513ec: 1a00001c bne 1f51464 + 1f513f0: e30325bc movw r2, #13756 ; 0x35bc + 1f513f4: e34021f6 movt r2, #502 ; 0x1f6 + 1f513f8: e3030608 movw r0, #13832 ; 0x3608 + 1f513fc: e34001f6 movt r0, #502 ; 0x1f6 + 1f51400: e3a01001 mov r1, #1 + 1f51404: e3a05000 mov r5, #0 + 1f51408: ebfebf9e bl 1f01288 + 1f5140c: eaffff92 b 1f5125c + 1f51410: e303250c movw r2, #13580 ; 0x350c + 1f51414: e34021f6 movt r2, #502 ; 0x1f6 + 1f51418: e3030608 movw r0, #13832 ; 0x3608 + 1f5141c: e34001f6 movt r0, #502 ; 0x1f6 + 1f51420: e3a01001 mov r1, #1 + 1f51424: ebfebf97 bl 1f01288 + 1f51428: eaffff8b b 1f5125c + 1f5142c: e5943038 ldr r3, [r4, #56] ; 0x38 + 1f51430: e3530000 cmp r3, #0 + 1f51434: 1affff83 bne 1f51248 + 1f51438: ebffb44a bl 1f3e568 + 1f5143c: e1a02006 mov r2, r6 + 1f51440: e5840038 str r0, [r4, #56] ; 0x38 + 1f51444: e1a01004 mov r1, r4 + 1f51448: ebfff88c bl 1f4f680 + 1f5144c: eaffff98 b 1f512b4 + 1f51450: e3031608 movw r1, #13832 ; 0x3608 + 1f51454: e34011f6 movt r1, #502 ; 0x1f6 + 1f51458: ebfff879 bl 1f4f644 + 1f5145c: e3a05000 mov r5, #0 + 1f51460: eaffff7d b 1f5125c + 1f51464: e1a00004 mov r0, r4 + 1f51468: ebfffc5a bl 1f505d8 + 1f5146c: e2505000 subs r5, r0, #0 + 1f51470: 0a000007 beq 1f51494 + 1f51474: e3a02018 mov r2, #24 + 1f51478: e3a01090 mov r1, #144 ; 0x90 + 1f5147c: e1a00004 mov r0, r4 + 1f51480: ebffff41 bl 1f5118c + 1f51484: e3500000 cmp r0, #0 + 1f51488: 1a000008 bne 1f514b0 + 1f5148c: e3a05000 mov r5, #0 + 1f51490: eaffff71 b 1f5125c + 1f51494: e30325cc movw r2, #13772 ; 0x35cc + 1f51498: e34021f6 movt r2, #502 ; 0x1f6 + 1f5149c: e3030608 movw r0, #13832 ; 0x3608 + 1f514a0: e34001f6 movt r0, #502 ; 0x1f6 + 1f514a4: e3a01001 mov r1, #1 + 1f514a8: ebfebf76 bl 1f01288 + 1f514ac: eaffff6a b 1f5125c + 1f514b0: e3a02b02 mov r2, #2048 ; 0x800 + 1f514b4: e3a01094 mov r1, #148 ; 0x94 + 1f514b8: e1a00004 mov r0, r4 + 1f514bc: ebffff32 bl 1f5118c + 1f514c0: e3500000 cmp r0, #0 + 1f514c4: 0afffff0 beq 1f5148c + 1f514c8: e3e03010 mvn r3, #16 + 1f514cc: e3a02603 mov r2, #3145728 ; 0x300000 + 1f514d0: e3a01010 mov r1, #16 + 1f514d4: e1a00004 mov r0, r4 + 1f514d8: ebfffeeb bl 1f5108c + 1f514dc: e3500000 cmp r0, #0 + 1f514e0: 0affffe9 beq 1f5148c + 1f514e4: e3e03040 mvn r3, #64 ; 0x40 + 1f514e8: e3a02020 mov r2, #32 + 1f514ec: e3a01080 mov r1, #128 ; 0x80 + 1f514f0: e1a00004 mov r0, r4 + 1f514f4: ebfffee4 bl 1f5108c + 1f514f8: e3500000 cmp r0, #0 + 1f514fc: 0affffe2 beq 1f5148c + 1f51500: e3a02017 mov r2, #23 + 1f51504: e3a010c8 mov r1, #200 ; 0xc8 + 1f51508: e1a00004 mov r0, r4 + 1f5150c: ebffff1e bl 1f5118c + 1f51510: e3500000 cmp r0, #0 + 1f51514: 0affffdc beq 1f5148c + 1f51518: e3a02017 mov r2, #23 + 1f5151c: e3a010cc mov r1, #204 ; 0xcc + 1f51520: e1a00004 mov r0, r4 + 1f51524: ebffff18 bl 1f5118c + 1f51528: e3500000 cmp r0, #0 + 1f5152c: 0affffd6 beq 1f5148c + 1f51530: e3a02000 mov r2, #0 + 1f51534: e3a01098 mov r1, #152 ; 0x98 + 1f51538: e1a00004 mov r0, r4 + 1f5153c: ebffff12 bl 1f5118c + 1f51540: e3500000 cmp r0, #0 + 1f51544: 0affffd0 beq 1f5148c + 1f51548: e3e02000 mvn r2, #0 + 1f5154c: e3a0100c mov r1, #12 + 1f51550: e1a00004 mov r0, r4 + 1f51554: ebffff0c bl 1f5118c + 1f51558: e3500000 cmp r0, #0 + 1f5155c: 0affffca beq 1f5148c + 1f51560: e3a02000 mov r2, #0 + 1f51564: e3a01f43 mov r1, #268 ; 0x10c + 1f51568: e1a00004 mov r0, r4 + 1f5156c: ebffff06 bl 1f5118c + 1f51570: e3500000 cmp r0, #0 + 1f51574: 0affffc4 beq 1f5148c + 1f51578: e3a02000 mov r2, #0 + 1f5157c: e3a010d0 mov r1, #208 ; 0xd0 + 1f51580: e1a00004 mov r0, r4 + 1f51584: ebffff00 bl 1f5118c + 1f51588: e3500000 cmp r0, #0 + 1f5158c: 0affffbe beq 1f5148c + 1f51590: e3e03000 mvn r3, #0 + 1f51594: e3002402 movw r2, #1026 ; 0x402 + 1f51598: e3a010b0 mov r1, #176 ; 0xb0 + 1f5159c: e1a00004 mov r0, r4 + 1f515a0: ebfffeb9 bl 1f5108c + 1f515a4: e3500000 cmp r0, #0 + 1f515a8: 0affffb7 beq 1f5148c + 1f515ac: e3e03000 mvn r3, #0 + 1f515b0: e3a02010 mov r2, #16 + 1f515b4: e3a01014 mov r1, #20 + 1f515b8: e1a00004 mov r0, r4 + 1f515bc: ebfffeb2 bl 1f5108c + 1f515c0: e3500000 cmp r0, #0 + 1f515c4: 0a000006 beq 1f515e4 + 1f515c8: e3a03080 mov r3, #128 ; 0x80 + 1f515cc: e3a02090 mov r2, #144 ; 0x90 + 1f515d0: e3a01014 mov r1, #20 + 1f515d4: e1a00004 mov r0, r4 + 1f515d8: ebfffe7b bl 1f50fcc + 1f515dc: e3500000 cmp r0, #0 + 1f515e0: 1a000002 bne 1f515f0 + 1f515e4: e30325e4 movw r2, #13796 ; 0x35e4 + 1f515e8: e34021f6 movt r2, #502 ; 0x1f6 + 1f515ec: eaffff81 b 1f513f8 + 1f515f0: e3e03000 mvn r3, #0 + 1f515f4: e3a02b06 mov r2, #6144 ; 0x1800 + 1f515f8: e3a01c01 mov r1, #256 ; 0x100 + 1f515fc: e1a00004 mov r0, r4 + 1f51600: ebfffea1 bl 1f5108c + 1f51604: e3500000 cmp r0, #0 + 1f51608: 0affff9f beq 1f5148c + 1f5160c: e3e03000 mvn r3, #0 + 1f51610: e3a02001 mov r2, #1 + 1f51614: e3a01f42 mov r1, #264 ; 0x108 + 1f51618: e1a00004 mov r0, r4 + 1f5161c: ebfffe9a bl 1f5108c + 1f51620: e3500000 cmp r0, #0 + 1f51624: 0affff98 beq 1f5148c + 1f51628: e3e03000 mvn r3, #0 + 1f5162c: e3a02102 mov r2, #-2147483648 ; 0x80000000 + 1f51630: e3a010c4 mov r1, #196 ; 0xc4 + 1f51634: e1a00004 mov r0, r4 + 1f51638: ebfffe93 bl 1f5108c + 1f5163c: e3500000 cmp r0, #0 + 1f51640: 0affff91 beq 1f5148c + 1f51644: e30f3fff movw r3, #65535 ; 0xffff + 1f51648: e34c3000 movt r3, #49152 ; 0xc000 + 1f5164c: e3a02001 mov r2, #1 + 1f51650: e34025ee movt r2, #1518 ; 0x5ee + 1f51654: e3a01f41 mov r1, #260 ; 0x104 + 1f51658: e1a00004 mov r0, r4 + 1f5165c: ebfffe8a bl 1f5108c + 1f51660: e3500000 cmp r0, #0 + 1f51664: 0affff88 beq 1f5148c + 1f51668: e3e03000 mvn r3, #0 + 1f5166c: e3a02102 mov r2, #-2147483648 ; 0x80000000 + 1f51670: e3a010c0 mov r1, #192 ; 0xc0 + 1f51674: e1a00004 mov r0, r4 + 1f51678: ebfffe83 bl 1f5108c + 1f5167c: e3500000 cmp r0, #0 + 1f51680: 0affff81 beq 1f5148c + 1f51684: e1a00004 mov r0, r4 + 1f51688: ebfffc4d bl 1f507c4 + 1f5168c: e2505000 subs r5, r0, #0 + 1f51690: 0a000017 beq 1f516f4 + 1f51694: e28d0014 add r0, sp, #20 + 1f51698: e3a05001 mov r5, #1 + 1f5169c: eb00003d bl 1f51798 + 1f516a0: e3053c90 movw r3, #23696 ; 0x5c90 + 1f516a4: e34031f6 movt r3, #502 ; 0x1f6 + 1f516a8: e28d0014 add r0, sp, #20 + 1f516ac: e3031554 movw r1, #13652 ; 0x3554 + 1f516b0: e34011f6 movt r1, #502 ; 0x1f6 + 1f516b4: e5932000 ldr r2, [r3] + 1f516b8: e082c005 add ip, r2, r5 + 1f516bc: e583c000 str ip, [r3] + 1f516c0: eb00042d bl 1f5277c + 1f516c4: ebfff8db bl 1f4fa38 + 1f516c8: e1a06000 mov r6, r0 + 1f516cc: e28d0014 add r0, sp, #20 + 1f516d0: eb00004b bl 1f51804 + 1f516d4: e1a02004 mov r2, r4 + 1f516d8: e1a01000 mov r1, r0 + 1f516dc: e3a03000 mov r3, #0 + 1f516e0: e1a00006 mov r0, r6 + 1f516e4: ebfff8a9 bl 1f4f990 + 1f516e8: e28d0014 add r0, sp, #20 + 1f516ec: eb00003a bl 1f517dc <_String> + 1f516f0: eafffed9 b 1f5125c + 1f516f4: e30325f8 movw r2, #13816 ; 0x35f8 + 1f516f8: e34021f6 movt r2, #502 ; 0x1f6 + 1f516fc: e3030608 movw r0, #13832 ; 0x3608 + 1f51700: e34001f6 movt r0, #502 ; 0x1f6 + 1f51704: e3a01001 mov r1, #1 + 1f51708: ebfebede bl 1f01288 + 1f5170c: eafffed2 b 1f5125c + +01f51710 : + 1f51710: e92d40f0 push {r4, r5, r6, r7, lr} + 1f51714: e1a05001 mov r5, r1 + 1f51718: e1a04000 mov r4, r0 + 1f5171c: e24dd014 sub sp, sp, #20 + 1f51720: e1a07002 mov r7, r2 + 1f51724: ebfff7be bl 1f4f624 + 1f51728: e1a06000 mov r6, r0 + 1f5172c: e1a00004 mov r0, r4 + 1f51730: e3a04000 mov r4, #0 + 1f51734: ebfff7b8 bl 1f4f61c + 1f51738: e6ff3075 uxth r3, r5 + 1f5173c: e1a01000 mov r1, r0 + 1f51740: e58d3004 str r3, [sp, #4] + 1f51744: e3a02004 mov r2, #4 + 1f51748: e58d7008 str r7, [sp, #8] + 1f5174c: e58d200c str r2, [sp, #12] + 1f51750: e1a00006 mov r0, r6 + 1f51754: e58d4000 str r4, [sp] + 1f51758: e3a030a1 mov r3, #161 ; 0xa1 + 1f5175c: e3a020c0 mov r2, #192 ; 0xc0 + 1f51760: ebfff1f0 bl 1f4df28 + 1f51764: e3500004 cmp r0, #4 + 1f51768: 03a00001 moveq r0, #1 + 1f5176c: 0a000007 beq 1f51790 + 1f51770: e1a03005 mov r3, r5 + 1f51774: e303256c movw r2, #13676 ; 0x356c + 1f51778: e34021f6 movt r2, #502 ; 0x1f6 + 1f5177c: e3030608 movw r0, #13832 ; 0x3608 + 1f51780: e34001f6 movt r0, #502 ; 0x1f6 + 1f51784: e3a01002 mov r1, #2 + 1f51788: ebfebebe bl 1f01288 + 1f5178c: e1a00004 mov r0, r4 + 1f51790: e28dd014 add sp, sp, #20 + 1f51794: e8bd80f0 pop {r4, r5, r6, r7, pc} + +01f51798 : + 1f51798: e3a03000 mov r3, #0 + 1f5179c: e5803000 str r3, [r0] + 1f517a0: e5803004 str r3, [r0, #4] + 1f517a4: e12fff1e bx lr + +01f517a8 : + 1f517a8: e92d4070 push {r4, r5, r6, lr} + 1f517ac: e1a04000 mov r4, r0 + 1f517b0: e1a00001 mov r0, r1 + 1f517b4: e1a05001 mov r5, r1 + 1f517b8: eb0005d0 bl 1f52f00 + 1f517bc: e2803001 add r3, r0, #1 + 1f517c0: e1a00003 mov r0, r3 + 1f517c4: e5843004 str r3, [r4, #4] + 1f517c8: ebffb366 bl 1f3e568 + 1f517cc: e1a01005 mov r1, r5 + 1f517d0: e5840000 str r0, [r4] + 1f517d4: e8bd4070 pop {r4, r5, r6, lr} + 1f517d8: ea0005ef b 1f52f9c + +01f517dc <_String>: + 1f517dc: e5903000 ldr r3, [r0] + 1f517e0: e3530000 cmp r3, #0 + 1f517e4: 012fff1e bxeq lr + 1f517e8: e92d4010 push {r4, lr} + 1f517ec: e1a04000 mov r4, r0 + 1f517f0: e1a00003 mov r0, r3 + 1f517f4: ebffb363 bl 1f3e588 + 1f517f8: e3a03000 mov r3, #0 + 1f517fc: e5843000 str r3, [r4] + 1f51800: e8bd8010 pop {r4, pc} + +01f51804 : + 1f51804: e5900000 ldr r0, [r0] + 1f51808: e30f383c movw r3, #63548 ; 0xf83c + 1f5180c: e34031f5 movt r3, #501 ; 0x1f5 + 1f51810: e3500000 cmp r0, #0 + 1f51814: 01a00003 moveq r0, r3 + 1f51818: e12fff1e bx lr + +01f5181c : + 1f5181c: e92d4070 push {r4, r5, r6, lr} + 1f51820: e1a04000 mov r4, r0 + 1f51824: e5900000 ldr r0, [r0] + 1f51828: e1a05001 mov r5, r1 + 1f5182c: e3500000 cmp r0, #0 + 1f51830: 0a000000 beq 1f51838 + 1f51834: ebffb353 bl 1f3e588 + 1f51838: e1a00005 mov r0, r5 + 1f5183c: eb0005af bl 1f52f00 + 1f51840: e2803001 add r3, r0, #1 + 1f51844: e1a00003 mov r0, r3 + 1f51848: e5843004 str r3, [r4, #4] + 1f5184c: ebffb345 bl 1f3e568 + 1f51850: e1a01005 mov r1, r5 + 1f51854: e5840000 str r0, [r4] + 1f51858: eb0005cf bl 1f52f9c + 1f5185c: e5940000 ldr r0, [r4] + 1f51860: e8bd8070 pop {r4, r5, r6, pc} + +01f51864 : + 1f51864: e5900000 ldr r0, [r0] + 1f51868: e3500000 cmp r0, #0 + 1f5186c: 012fff1e bxeq lr + 1f51870: ea0005a2 b 1f52f00 + +01f51874 : + 1f51874: e92d4070 push {r4, r5, r6, lr} + 1f51878: e1a04000 mov r4, r0 + 1f5187c: e5900000 ldr r0, [r0] + 1f51880: e3a03001 mov r3, #1 + 1f51884: e1a06001 mov r6, r1 + 1f51888: e3500000 cmp r0, #0 + 1f5188c: e5843004 str r3, [r4, #4] + 1f51890: 0a000003 beq 1f518a4 + 1f51894: eb000599 bl 1f52f00 + 1f51898: e5943004 ldr r3, [r4, #4] + 1f5189c: e0830000 add r0, r3, r0 + 1f518a0: e5840004 str r0, [r4, #4] + 1f518a4: e1a00006 mov r0, r6 + 1f518a8: eb000594 bl 1f52f00 + 1f518ac: e5943004 ldr r3, [r4, #4] + 1f518b0: e0800003 add r0, r0, r3 + 1f518b4: e5840004 str r0, [r4, #4] + 1f518b8: ebffb32a bl 1f3e568 + 1f518bc: e5941000 ldr r1, [r4] + 1f518c0: e1a05000 mov r5, r0 + 1f518c4: e3510000 cmp r1, #0 + 1f518c8: 05c01000 strbeq r1, [r0] + 1f518cc: 0a000002 beq 1f518dc + 1f518d0: eb0005b1 bl 1f52f9c + 1f518d4: e5940000 ldr r0, [r4] + 1f518d8: ebffb32a bl 1f3e588 + 1f518dc: e1a01006 mov r1, r6 + 1f518e0: e1a00005 mov r0, r5 + 1f518e4: eb0005cb bl 1f53018 + 1f518e8: e5845000 str r5, [r4] + 1f518ec: e8bd8070 pop {r4, r5, r6, pc} + +01f518f0 : + 1f518f0: e5900000 ldr r0, [r0] + 1f518f4: ea00058b b 1f52f28 + +01f518f8 : + 1f518f8: e5902000 ldr r2, [r0] + 1f518fc: e1d230d0 ldrsb r3, [r2] + 1f51900: e3530000 cmp r3, #0 + 1f51904: 0a000009 beq 1f51930 + 1f51908: e1510003 cmp r1, r3 + 1f5190c: e3a00000 mov r0, #0 + 1f51910: 1a000002 bne 1f51920 + 1f51914: ea000007 b 1f51938 + 1f51918: e1530001 cmp r3, r1 + 1f5191c: 012fff1e bxeq lr + 1f51920: e1f230d1 ldrsb r3, [r2, #1]! + 1f51924: e2800001 add r0, r0, #1 + 1f51928: e3530000 cmp r3, #0 + 1f5192c: 1afffff9 bne 1f51918 + 1f51930: e3e00000 mvn r0, #0 + 1f51934: e12fff1e bx lr + 1f51938: e12fff1e bx lr + +01f5193c : + 1f5193c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f51940: e1a0b000 mov fp, r0 + 1f51944: e5900000 ldr r0, [r0] + 1f51948: e24dd024 sub sp, sp, #36 ; 0x24 + 1f5194c: e1a06001 mov r6, r1 + 1f51950: e3500000 cmp r0, #0 + 1f51954: e58d2000 str r2, [sp] + 1f51958: 0a000000 beq 1f51960 + 1f5195c: ebffb309 bl 1f3e588 + 1f51960: e3a00040 mov r0, #64 ; 0x40 + 1f51964: e58b0004 str r0, [fp, #4] + 1f51968: e30c3ccd movw r3, #52429 ; 0xcccd + 1f5196c: e34c3ccc movt r3, #52428 ; 0xcccc + 1f51970: e58d3008 str r3, [sp, #8] + 1f51974: ebffb2fb bl 1f3e568 + 1f51978: e58b0000 str r0, [fp] + 1f5197c: e58b0008 str r0, [fp, #8] + 1f51980: e1d640d0 ldrsb r4, [r6] + 1f51984: e3540000 cmp r4, #0 + 1f51988: 0a000095 beq 1f51be4 + 1f5198c: e3540025 cmp r4, #37 ; 0x25 + 1f51990: 1a000169 bne 1f51f3c + 1f51994: e1d620d1 ldrsb r2, [r6, #1] + 1f51998: e3520025 cmp r2, #37 ; 0x25 + 1f5199c: 0a00017e beq 1f51f9c + 1f519a0: e352002d cmp r2, #45 ; 0x2d + 1f519a4: e3a04000 mov r4, #0 + 1f519a8: 13a03000 movne r3, #0 + 1f519ac: 03a03001 moveq r3, #1 + 1f519b0: 01d620d2 ldrsbeq r2, [r6, #2] + 1f519b4: 02866002 addeq r6, r6, #2 + 1f519b8: 158d3004 strne r3, [sp, #4] + 1f519bc: 12866001 addne r6, r6, #1 + 1f519c0: 058d3004 streq r3, [sp, #4] + 1f519c4: e3520030 cmp r2, #48 ; 0x30 + 1f519c8: 03a08001 moveq r8, #1 + 1f519cc: 13a08000 movne r8, #0 + 1f519d0: 01d620d1 ldrsbeq r2, [r6, #1] + 1f519d4: 00866008 addeq r6, r6, r8 + 1f519d8: e2423030 sub r3, r2, #48 ; 0x30 + 1f519dc: e6ef3073 uxtb r3, r3 + 1f519e0: e3530009 cmp r3, #9 + 1f519e4: 8a000008 bhi 1f51a0c + 1f519e8: e1a03184 lsl r3, r4, #3 + 1f519ec: e0834084 add r4, r3, r4, lsl #1 + 1f519f0: e0844002 add r4, r4, r2 + 1f519f4: e1f620d1 ldrsb r2, [r6, #1]! + 1f519f8: e2444030 sub r4, r4, #48 ; 0x30 + 1f519fc: e2423030 sub r3, r2, #48 ; 0x30 + 1f51a00: e6ef3073 uxtb r3, r3 + 1f51a04: e3530009 cmp r3, #9 + 1f51a08: 9afffff6 bls 1f519e8 + 1f51a0c: e352006c cmp r2, #108 ; 0x6c + 1f51a10: 11a01002 movne r1, r2 + 1f51a14: 03a02001 moveq r2, #1 + 1f51a18: 01d610d1 ldrsbeq r1, [r6, #1] + 1f51a1c: 00866002 addeq r6, r6, r2 + 1f51a20: e2413058 sub r3, r1, #88 ; 0x58 + 1f51a24: e3530020 cmp r3, #32 + 1f51a28: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f51a2c: ea00012b b 1f51ee0 + 1f51a30: 01f51ed8 .word 0x01f51ed8 + 1f51a34: 01f51ee0 .word 0x01f51ee0 + 1f51a38: 01f51ee0 .word 0x01f51ee0 + 1f51a3c: 01f51ee0 .word 0x01f51ee0 + 1f51a40: 01f51ee0 .word 0x01f51ee0 + 1f51a44: 01f51ee0 .word 0x01f51ee0 + 1f51a48: 01f51ee0 .word 0x01f51ee0 + 1f51a4c: 01f51ee0 .word 0x01f51ee0 + 1f51a50: 01f51ee0 .word 0x01f51ee0 + 1f51a54: 01f51ee0 .word 0x01f51ee0 + 1f51a58: 01f51ee0 .word 0x01f51ee0 + 1f51a5c: 01f51e08 .word 0x01f51e08 + 1f51a60: 01f51ca4 .word 0x01f51ca4 + 1f51a64: 01f51ee0 .word 0x01f51ee0 + 1f51a68: 01f51ee0 .word 0x01f51ee0 + 1f51a6c: 01f51ee0 .word 0x01f51ee0 + 1f51a70: 01f51ee0 .word 0x01f51ee0 + 1f51a74: 01f51ee0 .word 0x01f51ee0 + 1f51a78: 01f51ee0 .word 0x01f51ee0 + 1f51a7c: 01f51ee0 .word 0x01f51ee0 + 1f51a80: 01f51ee0 .word 0x01f51ee0 + 1f51a84: 01f51ee0 .word 0x01f51ee0 + 1f51a88: 01f51ee0 .word 0x01f51ee0 + 1f51a8c: 01f51c9c .word 0x01f51c9c + 1f51a90: 01f51ee0 .word 0x01f51ee0 + 1f51a94: 01f51ee0 .word 0x01f51ee0 + 1f51a98: 01f51ee0 .word 0x01f51ee0 + 1f51a9c: 01f51bf4 .word 0x01f51bf4 + 1f51aa0: 01f51ee0 .word 0x01f51ee0 + 1f51aa4: 01f51ab4 .word 0x01f51ab4 + 1f51aa8: 01f51ee0 .word 0x01f51ee0 + 1f51aac: 01f51ee0 .word 0x01f51ee0 + 1f51ab0: 01f51ed8 .word 0x01f51ed8 + 1f51ab4: e3a0e00a mov lr, #10 + 1f51ab8: e59d3000 ldr r3, [sp] + 1f51abc: e2833004 add r3, r3, #4 + 1f51ac0: e5130004 ldr r0, [r3, #-4] + 1f51ac4: e58d3000 str r3, [sp] + 1f51ac8: e150000e cmp r0, lr + 1f51acc: 23a05001 movcs r5, #1 + 1f51ad0: 3a000285 bcc 1f524ec + 1f51ad4: e005059e mul r5, lr, r5 + 1f51ad8: e732f510 udiv r2, r0, r5 + 1f51adc: e15e0002 cmp lr, r2 + 1f51ae0: e1a03002 mov r3, r2 + 1f51ae4: 9afffffa bls 1f51ad4 + 1f51ae8: e3510058 cmp r1, #88 ; 0x58 + 1f51aec: e28d7014 add r7, sp, #20 + 1f51af0: 13a0a057 movne sl, #87 ; 0x57 + 1f51af4: 03a0a037 moveq sl, #55 ; 0x37 + 1f51af8: e1a0c007 mov ip, r7 + 1f51afc: ea000001 b 1f51b08 + 1f51b00: e732f510 udiv r2, r0, r5 + 1f51b04: e1a03002 mov r3, r2 + 1f51b08: e3530009 cmp r3, #9 + 1f51b0c: e08a1003 add r1, sl, r3 + 1f51b10: e0600295 mls r0, r5, r2, r0 + 1f51b14: e2833030 add r3, r3, #48 ; 0x30 + 1f51b18: e6af1071 sxtb r1, r1 + 1f51b1c: e1a0900c mov r9, ip + 1f51b20: 96af1073 sxtbls r1, r3 + 1f51b24: e4cc1001 strb r1, [ip], #1 + 1f51b28: e735fe15 udiv r5, r5, lr + 1f51b2c: e3550000 cmp r5, #0 + 1f51b30: 1afffff2 bne 1f51b00 + 1f51b34: e5c95001 strb r5, [r9, #1] + 1f51b38: e1a00007 mov r0, r7 + 1f51b3c: eb0004ef bl 1f52f00 + 1f51b40: e59d3004 ldr r3, [sp, #4] + 1f51b44: e1a09000 mov r9, r0 + 1f51b48: e3530000 cmp r3, #0 + 1f51b4c: 1a00011f bne 1f51fd0 + 1f51b50: e1500004 cmp r0, r4 + 1f51b54: 2a000014 bcs 1f51bac + 1f51b58: e59b2000 ldr r2, [fp] + 1f51b5c: e3580000 cmp r8, #0 + 1f51b60: e59b3008 ldr r3, [fp, #8] + 1f51b64: e0604004 rsb r4, r0, r4 + 1f51b68: e59b1004 ldr r1, [fp, #4] + 1f51b6c: 13a05030 movne r5, #48 ; 0x30 + 1f51b70: e0628003 rsb r8, r2, r3 + 1f51b74: 03a05020 moveq r5, #32 + 1f51b78: e0842008 add r2, r4, r8 + 1f51b7c: e2820001 add r0, r2, #1 + 1f51b80: e1500001 cmp r0, r1 + 1f51b84: 8a000185 bhi 1f521a0 + 1f51b88: e2444001 sub r4, r4, #1 + 1f51b8c: ea000000 b 1f51b94 + 1f51b90: e59b3008 ldr r3, [fp, #8] + 1f51b94: e2444001 sub r4, r4, #1 + 1f51b98: e2832001 add r2, r3, #1 + 1f51b9c: e3740001 cmn r4, #1 + 1f51ba0: e58b2008 str r2, [fp, #8] + 1f51ba4: e5c35000 strb r5, [r3] + 1f51ba8: 1afffff8 bne 1f51b90 + 1f51bac: e1a00007 mov r0, r7 + 1f51bb0: eb0004d2 bl 1f52f00 + 1f51bb4: e2504000 subs r4, r0, #0 + 1f51bb8: 059b0008 ldreq r0, [fp, #8] + 1f51bbc: 1a00012f bne 1f52080 + 1f51bc0: e1a01007 mov r1, r7 + 1f51bc4: eb0004f4 bl 1f52f9c + 1f51bc8: e59b3008 ldr r3, [fp, #8] + 1f51bcc: e0833004 add r3, r3, r4 + 1f51bd0: e58b3008 str r3, [fp, #8] + 1f51bd4: e2866001 add r6, r6, #1 + 1f51bd8: e1d640d0 ldrsb r4, [r6] + 1f51bdc: e3540000 cmp r4, #0 + 1f51be0: 1affff69 bne 1f5198c + 1f51be4: e59b3008 ldr r3, [fp, #8] + 1f51be8: e5c34000 strb r4, [r3] + 1f51bec: e28dd024 add sp, sp, #36 ; 0x24 + 1f51bf0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f51bf4: e59d3000 ldr r3, [sp] + 1f51bf8: e2835004 add r5, r3, #4 + 1f51bfc: e5937000 ldr r7, [r3] + 1f51c00: e1a00007 mov r0, r7 + 1f51c04: eb0004bd bl 1f52f00 + 1f51c08: e59d3004 ldr r3, [sp, #4] + 1f51c0c: e1a08000 mov r8, r0 + 1f51c10: e3530000 cmp r3, #0 + 1f51c14: 1a0001c1 bne 1f52320 + 1f51c18: e1500004 cmp r0, r4 + 1f51c1c: 2a000012 bcs 1f51c6c + 1f51c20: e59b2008 ldr r2, [fp, #8] + 1f51c24: e0604004 rsb r4, r0, r4 + 1f51c28: e59b8000 ldr r8, [fp] + 1f51c2c: e59b1004 ldr r1, [fp, #4] + 1f51c30: e0688002 rsb r8, r8, r2 + 1f51c34: e0843008 add r3, r4, r8 + 1f51c38: e2830001 add r0, r3, #1 + 1f51c3c: e1500001 cmp r0, r1 + 1f51c40: 8a00028d bhi 1f5267c + 1f51c44: e2443001 sub r3, r4, #1 + 1f51c48: e3a00020 mov r0, #32 + 1f51c4c: ea000000 b 1f51c54 + 1f51c50: e59b2008 ldr r2, [fp, #8] + 1f51c54: e2433001 sub r3, r3, #1 + 1f51c58: e2821001 add r1, r2, #1 + 1f51c5c: e3730001 cmn r3, #1 + 1f51c60: e58b1008 str r1, [fp, #8] + 1f51c64: e5c20000 strb r0, [r2] + 1f51c68: 1afffff8 bne 1f51c50 + 1f51c6c: e1a00007 mov r0, r7 + 1f51c70: eb0004a2 bl 1f52f00 + 1f51c74: e2508000 subs r8, r0, #0 + 1f51c78: 059b0008 ldreq r0, [fp, #8] + 1f51c7c: 1a000202 bne 1f5248c + 1f51c80: e1a01007 mov r1, r7 + 1f51c84: eb0004c4 bl 1f52f9c + 1f51c88: e59b3008 ldr r3, [fp, #8] + 1f51c8c: e58d5000 str r5, [sp] + 1f51c90: e0833008 add r3, r3, r8 + 1f51c94: e58b3008 str r3, [fp, #8] + 1f51c98: eaffffcd b 1f51bd4 + 1f51c9c: e3a0e008 mov lr, #8 + 1f51ca0: eaffff84 b 1f51ab8 + 1f51ca4: e59d3000 ldr r3, [sp] + 1f51ca8: e2833004 add r3, r3, #4 + 1f51cac: e5132004 ldr r2, [r3, #-4] + 1f51cb0: e58d3000 str r3, [sp] + 1f51cb4: e3520000 cmp r2, #0 + 1f51cb8: b2622000 rsblt r2, r2, #0 + 1f51cbc: b3a09001 movlt r9, #1 + 1f51cc0: a3a09000 movge r9, #0 + 1f51cc4: e3520009 cmp r2, #9 + 1f51cc8: e1a05009 mov r5, r9 + 1f51ccc: e1a0e002 mov lr, r2 + 1f51cd0: c3a08001 movgt r8, #1 + 1f51cd4: da000256 ble 1f52634 + 1f51cd8: e1a03188 lsl r3, r8, #3 + 1f51cdc: e0838088 add r8, r3, r8, lsl #1 + 1f51ce0: e733f812 udiv r3, r2, r8 + 1f51ce4: e3530009 cmp r3, #9 + 1f51ce8: 8afffffa bhi 1f51cd8 + 1f51cec: e28d7014 add r7, sp, #20 + 1f51cf0: e59da008 ldr sl, [sp, #8] + 1f51cf4: e732f812 udiv r2, r2, r8 + 1f51cf8: e1a00007 mov r0, r7 + 1f51cfc: ea000001 b 1f51d08 + 1f51d00: e732f81e udiv r2, lr, r8 + 1f51d04: e1a03002 mov r3, r2 + 1f51d08: e3530009 cmp r3, #9 + 1f51d0c: e2831057 add r1, r3, #87 ; 0x57 + 1f51d10: e2833030 add r3, r3, #48 ; 0x30 + 1f51d14: e1a0c000 mov ip, r0 + 1f51d18: e6af1071 sxtb r1, r1 + 1f51d1c: e06ee298 mls lr, r8, r2, lr + 1f51d20: 96af1073 sxtbls r1, r3 + 1f51d24: e4c01001 strb r1, [r0], #1 + 1f51d28: e0832a98 umull r2, r3, r8, sl + 1f51d2c: e1b081a3 lsrs r8, r3, #3 + 1f51d30: 1afffff2 bne 1f51d00 + 1f51d34: e1a00007 mov r0, r7 + 1f51d38: e5cc8001 strb r8, [ip, #1] + 1f51d3c: eb00046f bl 1f52f00 + 1f51d40: e59d3004 ldr r3, [sp, #4] + 1f51d44: e0809009 add r9, r0, r9 + 1f51d48: e3530000 cmp r3, #0 + 1f51d4c: 0a0000e3 beq 1f520e0 + 1f51d50: e3550000 cmp r5, #0 + 1f51d54: 1a000201 bne 1f52560 + 1f51d58: e1a00007 mov r0, r7 + 1f51d5c: eb000467 bl 1f52f00 + 1f51d60: e2508000 subs r8, r0, #0 + 1f51d64: e59b0008 ldr r0, [fp, #8] + 1f51d68: 1a0001af bne 1f5242c + 1f51d6c: e1a01007 mov r1, r7 + 1f51d70: eb000489 bl 1f52f9c + 1f51d74: e59b3008 ldr r3, [fp, #8] + 1f51d78: e1590004 cmp r9, r4 + 1f51d7c: e0833008 add r3, r3, r8 + 1f51d80: e58b3008 str r3, [fp, #8] + 1f51d84: 2affff92 bcs 1f51bd4 + 1f51d88: e59b8000 ldr r8, [fp] + 1f51d8c: e0694004 rsb r4, r9, r4 + 1f51d90: e59b2004 ldr r2, [fp, #4] + 1f51d94: e0688003 rsb r8, r8, r3 + 1f51d98: e0887004 add r7, r8, r4 + 1f51d9c: e2871001 add r1, r7, #1 + 1f51da0: e1510002 cmp r1, r2 + 1f51da4: 9a00000c bls 1f51ddc + 1f51da8: e2877041 add r7, r7, #65 ; 0x41 + 1f51dac: e1a00007 mov r0, r7 + 1f51db0: ebffb1ec bl 1f3e568 + 1f51db4: e59b3008 ldr r3, [fp, #8] + 1f51db8: e3a02000 mov r2, #0 + 1f51dbc: e1a05000 mov r5, r0 + 1f51dc0: e5c32000 strb r2, [r3] + 1f51dc4: e59b1000 ldr r1, [fp] + 1f51dc8: eb000473 bl 1f52f9c + 1f51dcc: e59b0000 ldr r0, [fp] + 1f51dd0: ebffb1ec bl 1f3e588 + 1f51dd4: e0853008 add r3, r5, r8 + 1f51dd8: e88b00a0 stm fp, {r5, r7} + 1f51ddc: e2442001 sub r2, r4, #1 + 1f51de0: e3a00020 mov r0, #32 + 1f51de4: ea000000 b 1f51dec + 1f51de8: e59b3008 ldr r3, [fp, #8] + 1f51dec: e2422001 sub r2, r2, #1 + 1f51df0: e2831001 add r1, r3, #1 + 1f51df4: e3720001 cmn r2, #1 + 1f51df8: e58b1008 str r1, [fp, #8] + 1f51dfc: e5c30000 strb r0, [r3] + 1f51e00: 1afffff8 bne 1f51de8 + 1f51e04: eaffff72 b 1f51bd4 + 1f51e08: e59d3004 ldr r3, [sp, #4] + 1f51e0c: e3530000 cmp r3, #0 + 1f51e10: e59d3000 ldr r3, [sp] + 1f51e14: e2835004 add r5, r3, #4 + 1f51e18: e1d370d0 ldrsb r7, [r3] + 1f51e1c: 1a000126 bne 1f522bc + 1f51e20: e3540001 cmp r4, #1 + 1f51e24: 9a000012 bls 1f51e74 + 1f51e28: e59b1008 ldr r1, [fp, #8] + 1f51e2c: e2443001 sub r3, r4, #1 + 1f51e30: e59b8000 ldr r8, [fp] + 1f51e34: e59b2004 ldr r2, [fp, #4] + 1f51e38: e0688001 rsb r8, r8, r1 + 1f51e3c: e0833008 add r3, r3, r8 + 1f51e40: e2830001 add r0, r3, #1 + 1f51e44: e1500002 cmp r0, r2 + 1f51e48: 8a0001fc bhi 1f52640 + 1f51e4c: e2444002 sub r4, r4, #2 + 1f51e50: e3a02020 mov r2, #32 + 1f51e54: ea000000 b 1f51e5c + 1f51e58: e59b1008 ldr r1, [fp, #8] + 1f51e5c: e2444001 sub r4, r4, #1 + 1f51e60: e2813001 add r3, r1, #1 + 1f51e64: e3740001 cmn r4, #1 + 1f51e68: e58b3008 str r3, [fp, #8] + 1f51e6c: e5c12000 strb r2, [r1] + 1f51e70: 1afffff8 bne 1f51e58 + 1f51e74: e59b2000 ldr r2, [fp] + 1f51e78: e59b3008 ldr r3, [fp, #8] + 1f51e7c: e59b1004 ldr r1, [fp, #4] + 1f51e80: e0629003 rsb r9, r2, r3 + 1f51e84: e2892002 add r2, r9, #2 + 1f51e88: e1520001 cmp r2, r1 + 1f51e8c: 9a00000c bls 1f51ec4 + 1f51e90: e2898042 add r8, r9, #66 ; 0x42 + 1f51e94: e1a00008 mov r0, r8 + 1f51e98: ebffb1b2 bl 1f3e568 + 1f51e9c: e59b3008 ldr r3, [fp, #8] + 1f51ea0: e3a02000 mov r2, #0 + 1f51ea4: e1a04000 mov r4, r0 + 1f51ea8: e5c32000 strb r2, [r3] + 1f51eac: e59b1000 ldr r1, [fp] + 1f51eb0: eb000439 bl 1f52f9c + 1f51eb4: e59b0000 ldr r0, [fp] + 1f51eb8: ebffb1b2 bl 1f3e588 + 1f51ebc: e0843009 add r3, r4, r9 + 1f51ec0: e88b0110 stm fp, {r4, r8} + 1f51ec4: e58d5000 str r5, [sp] + 1f51ec8: e2832001 add r2, r3, #1 + 1f51ecc: e58b2008 str r2, [fp, #8] + 1f51ed0: e5c37000 strb r7, [r3] + 1f51ed4: eaffff3e b 1f51bd4 + 1f51ed8: e3a0e010 mov lr, #16 + 1f51edc: eafffef5 b 1f51ab8 + 1f51ee0: e59b3008 ldr r3, [fp, #8] + 1f51ee4: e59b5000 ldr r5, [fp] + 1f51ee8: e59b2004 ldr r2, [fp, #4] + 1f51eec: e0655003 rsb r5, r5, r3 + 1f51ef0: e2851002 add r1, r5, #2 + 1f51ef4: e1510002 cmp r1, r2 + 1f51ef8: 8a0000c8 bhi 1f52220 + 1f51efc: e2831001 add r1, r3, #1 + 1f51f00: e3a02025 mov r2, #37 ; 0x25 + 1f51f04: e58b1008 str r1, [fp, #8] + 1f51f08: e5c32000 strb r2, [r3] + 1f51f0c: e59b3008 ldr r3, [fp, #8] + 1f51f10: e59b5000 ldr r5, [fp] + 1f51f14: e59b2004 ldr r2, [fp, #4] + 1f51f18: e0655003 rsb r5, r5, r3 + 1f51f1c: e1d670d0 ldrsb r7, [r6] + 1f51f20: e2851002 add r1, r5, #2 + 1f51f24: e1510002 cmp r1, r2 + 1f51f28: 8a0000ab bhi 1f521dc + 1f51f2c: e2832001 add r2, r3, #1 + 1f51f30: e58b2008 str r2, [fp, #8] + 1f51f34: e5c37000 strb r7, [r3] + 1f51f38: eaffff25 b 1f51bd4 + 1f51f3c: e59b3008 ldr r3, [fp, #8] + 1f51f40: e59b7000 ldr r7, [fp] + 1f51f44: e59b2004 ldr r2, [fp, #4] + 1f51f48: e0677003 rsb r7, r7, r3 + 1f51f4c: e2871002 add r1, r7, #2 + 1f51f50: e1510002 cmp r1, r2 + 1f51f54: 9a00000c bls 1f51f8c + 1f51f58: e2878042 add r8, r7, #66 ; 0x42 + 1f51f5c: e1a00008 mov r0, r8 + 1f51f60: ebffb180 bl 1f3e568 + 1f51f64: e59b3008 ldr r3, [fp, #8] + 1f51f68: e3a02000 mov r2, #0 + 1f51f6c: e1a05000 mov r5, r0 + 1f51f70: e5c32000 strb r2, [r3] + 1f51f74: e59b1000 ldr r1, [fp] + 1f51f78: eb000407 bl 1f52f9c + 1f51f7c: e59b0000 ldr r0, [fp] + 1f51f80: ebffb180 bl 1f3e588 + 1f51f84: e0853007 add r3, r5, r7 + 1f51f88: e88b0120 stm fp, {r5, r8} + 1f51f8c: e2832001 add r2, r3, #1 + 1f51f90: e58b2008 str r2, [fp, #8] + 1f51f94: e5c34000 strb r4, [r3] + 1f51f98: eaffff0d b 1f51bd4 + 1f51f9c: e59b3008 ldr r3, [fp, #8] + 1f51fa0: e59b5000 ldr r5, [fp] + 1f51fa4: e59b2004 ldr r2, [fp, #4] + 1f51fa8: e0655003 rsb r5, r5, r3 + 1f51fac: e2851002 add r1, r5, #2 + 1f51fb0: e1510002 cmp r1, r2 + 1f51fb4: 8a00006b bhi 1f52168 + 1f51fb8: e2832001 add r2, r3, #1 + 1f51fbc: e2866002 add r6, r6, #2 + 1f51fc0: e58b2008 str r2, [fp, #8] + 1f51fc4: e3a02025 mov r2, #37 ; 0x25 + 1f51fc8: e5c32000 strb r2, [r3] + 1f51fcc: eafffe6b b 1f51980 + 1f51fd0: e1a00007 mov r0, r7 + 1f51fd4: eb0003c9 bl 1f52f00 + 1f51fd8: e2508000 subs r8, r0, #0 + 1f51fdc: e59b0008 ldr r0, [fp, #8] + 1f51fe0: 1a00009c bne 1f52258 + 1f51fe4: e1a01007 mov r1, r7 + 1f51fe8: eb0003eb bl 1f52f9c + 1f51fec: e59b3008 ldr r3, [fp, #8] + 1f51ff0: e1590004 cmp r9, r4 + 1f51ff4: e0833008 add r3, r3, r8 + 1f51ff8: e58b3008 str r3, [fp, #8] + 1f51ffc: 2afffef4 bcs 1f51bd4 + 1f52000: e59b8000 ldr r8, [fp] + 1f52004: e0694004 rsb r4, r9, r4 + 1f52008: e59b2004 ldr r2, [fp, #4] + 1f5200c: e0688003 rsb r8, r8, r3 + 1f52010: e0847008 add r7, r4, r8 + 1f52014: e2871001 add r1, r7, #1 + 1f52018: e1510002 cmp r1, r2 + 1f5201c: 9a00000c bls 1f52054 + 1f52020: e2877041 add r7, r7, #65 ; 0x41 + 1f52024: e1a00007 mov r0, r7 + 1f52028: ebffb14e bl 1f3e568 + 1f5202c: e59b3008 ldr r3, [fp, #8] + 1f52030: e3a02000 mov r2, #0 + 1f52034: e1a05000 mov r5, r0 + 1f52038: e5c32000 strb r2, [r3] + 1f5203c: e59b1000 ldr r1, [fp] + 1f52040: eb0003d5 bl 1f52f9c + 1f52044: e59b0000 ldr r0, [fp] + 1f52048: ebffb14e bl 1f3e588 + 1f5204c: e0853008 add r3, r5, r8 + 1f52050: e88b00a0 stm fp, {r5, r7} + 1f52054: e2442001 sub r2, r4, #1 + 1f52058: e3a00020 mov r0, #32 + 1f5205c: ea000000 b 1f52064 + 1f52060: e59b3008 ldr r3, [fp, #8] + 1f52064: e2422001 sub r2, r2, #1 + 1f52068: e2831001 add r1, r3, #1 + 1f5206c: e3720001 cmn r2, #1 + 1f52070: e58b1008 str r1, [fp, #8] + 1f52074: e5c30000 strb r0, [r3] + 1f52078: 1afffff8 bne 1f52060 + 1f5207c: eafffed4 b 1f51bd4 + 1f52080: e59b0008 ldr r0, [fp, #8] + 1f52084: e59b5000 ldr r5, [fp] + 1f52088: e59b2004 ldr r2, [fp, #4] + 1f5208c: e0655000 rsb r5, r5, r0 + 1f52090: e0843005 add r3, r4, r5 + 1f52094: e2831001 add r1, r3, #1 + 1f52098: e1510002 cmp r1, r2 + 1f5209c: 9afffec7 bls 1f51bc0 + 1f520a0: e2838041 add r8, r3, #65 ; 0x41 + 1f520a4: e1a00008 mov r0, r8 + 1f520a8: ebffb12e bl 1f3e568 + 1f520ac: e59b3008 ldr r3, [fp, #8] + 1f520b0: e3a02000 mov r2, #0 + 1f520b4: e1a09000 mov r9, r0 + 1f520b8: e5c32000 strb r2, [r3] + 1f520bc: e59b1000 ldr r1, [fp] + 1f520c0: eb0003b5 bl 1f52f9c + 1f520c4: e59b0000 ldr r0, [fp] + 1f520c8: ebffb12e bl 1f3e588 + 1f520cc: e0890005 add r0, r9, r5 + 1f520d0: e58b8004 str r8, [fp, #4] + 1f520d4: e58b9000 str r9, [fp] + 1f520d8: e58b0008 str r0, [fp, #8] + 1f520dc: eafffeb7 b 1f51bc0 + 1f520e0: e1590004 cmp r9, r4 + 1f520e4: 2a000012 bcs 1f52134 + 1f520e8: e0694004 rsb r4, r9, r4 + 1f520ec: e59b2008 ldr r2, [fp, #8] + 1f520f0: e59b9000 ldr r9, [fp] + 1f520f4: e59b1004 ldr r1, [fp, #4] + 1f520f8: e0699002 rsb r9, r9, r2 + 1f520fc: e0843009 add r3, r4, r9 + 1f52100: e2830001 add r0, r3, #1 + 1f52104: e1500001 cmp r0, r1 + 1f52108: 8a00018c bhi 1f52740 + 1f5210c: e2443001 sub r3, r4, #1 + 1f52110: e3a00020 mov r0, #32 + 1f52114: ea000000 b 1f5211c + 1f52118: e59b2008 ldr r2, [fp, #8] + 1f5211c: e2433001 sub r3, r3, #1 + 1f52120: e2821001 add r1, r2, #1 + 1f52124: e3730001 cmn r3, #1 + 1f52128: e58b1008 str r1, [fp, #8] + 1f5212c: e5c20000 strb r0, [r2] + 1f52130: 1afffff8 bne 1f52118 + 1f52134: e3550000 cmp r5, #0 + 1f52138: 1a0000ef bne 1f524fc + 1f5213c: e1a00007 mov r0, r7 + 1f52140: eb00036e bl 1f52f00 + 1f52144: e2505000 subs r5, r0, #0 + 1f52148: e59b0008 ldr r0, [fp, #8] + 1f5214c: 1a0000a0 bne 1f523d4 + 1f52150: e1a01007 mov r1, r7 + 1f52154: eb000390 bl 1f52f9c + 1f52158: e59b3008 ldr r3, [fp, #8] + 1f5215c: e0833005 add r3, r3, r5 + 1f52160: e58b3008 str r3, [fp, #8] + 1f52164: eafffe9a b 1f51bd4 + 1f52168: e2857042 add r7, r5, #66 ; 0x42 + 1f5216c: e1a00007 mov r0, r7 + 1f52170: ebffb0fc bl 1f3e568 + 1f52174: e59b3008 ldr r3, [fp, #8] + 1f52178: e3a02000 mov r2, #0 + 1f5217c: e1a04000 mov r4, r0 + 1f52180: e5c32000 strb r2, [r3] + 1f52184: e59b1000 ldr r1, [fp] + 1f52188: eb000383 bl 1f52f9c + 1f5218c: e59b0000 ldr r0, [fp] + 1f52190: ebffb0fc bl 1f3e588 + 1f52194: e0843005 add r3, r4, r5 + 1f52198: e88b0090 stm fp, {r4, r7} + 1f5219c: eaffff85 b 1f51fb8 + 1f521a0: e2829041 add r9, r2, #65 ; 0x41 + 1f521a4: e1a00009 mov r0, r9 + 1f521a8: ebffb0ee bl 1f3e568 + 1f521ac: e59b3008 ldr r3, [fp, #8] + 1f521b0: e3a02000 mov r2, #0 + 1f521b4: e1a0a000 mov sl, r0 + 1f521b8: e5c32000 strb r2, [r3] + 1f521bc: e59b1000 ldr r1, [fp] + 1f521c0: eb000375 bl 1f52f9c + 1f521c4: e59b0000 ldr r0, [fp] + 1f521c8: ebffb0ee bl 1f3e588 + 1f521cc: e58b9004 str r9, [fp, #4] + 1f521d0: e58ba000 str sl, [fp] + 1f521d4: e08a3008 add r3, sl, r8 + 1f521d8: eafffe6a b 1f51b88 + 1f521dc: e2858042 add r8, r5, #66 ; 0x42 + 1f521e0: e1a00008 mov r0, r8 + 1f521e4: ebffb0df bl 1f3e568 + 1f521e8: e59b3008 ldr r3, [fp, #8] + 1f521ec: e3a02000 mov r2, #0 + 1f521f0: e1a04000 mov r4, r0 + 1f521f4: e5c32000 strb r2, [r3] + 1f521f8: e59b1000 ldr r1, [fp] + 1f521fc: eb000366 bl 1f52f9c + 1f52200: e59b0000 ldr r0, [fp] + 1f52204: ebffb0df bl 1f3e588 + 1f52208: e0843005 add r3, r4, r5 + 1f5220c: e88b0110 stm fp, {r4, r8} + 1f52210: e2832001 add r2, r3, #1 + 1f52214: e58b2008 str r2, [fp, #8] + 1f52218: e5c37000 strb r7, [r3] + 1f5221c: eafffe6c b 1f51bd4 + 1f52220: e2857042 add r7, r5, #66 ; 0x42 + 1f52224: e1a00007 mov r0, r7 + 1f52228: ebffb0ce bl 1f3e568 + 1f5222c: e59b3008 ldr r3, [fp, #8] + 1f52230: e3a02000 mov r2, #0 + 1f52234: e1a04000 mov r4, r0 + 1f52238: e5c32000 strb r2, [r3] + 1f5223c: e59b1000 ldr r1, [fp] + 1f52240: eb000355 bl 1f52f9c + 1f52244: e59b0000 ldr r0, [fp] + 1f52248: ebffb0ce bl 1f3e588 + 1f5224c: e0843005 add r3, r4, r5 + 1f52250: e88b0090 stm fp, {r4, r7} + 1f52254: eaffff28 b 1f51efc + 1f52258: e59ba000 ldr sl, [fp] + 1f5225c: e59b2004 ldr r2, [fp, #4] + 1f52260: e06aa000 rsb sl, sl, r0 + 1f52264: e088300a add r3, r8, sl + 1f52268: e2831001 add r1, r3, #1 + 1f5226c: e1510002 cmp r1, r2 + 1f52270: 9affff5b bls 1f51fe4 + 1f52274: e2833041 add r3, r3, #65 ; 0x41 + 1f52278: e58d300c str r3, [sp, #12] + 1f5227c: e1a00003 mov r0, r3 + 1f52280: ebffb0b8 bl 1f3e568 + 1f52284: e59b1008 ldr r1, [fp, #8] + 1f52288: e58d0004 str r0, [sp, #4] + 1f5228c: e5c15000 strb r5, [r1] + 1f52290: e59b1000 ldr r1, [fp] + 1f52294: eb000340 bl 1f52f9c + 1f52298: e59b0000 ldr r0, [fp] + 1f5229c: ebffb0b9 bl 1f3e588 + 1f522a0: e59d2004 ldr r2, [sp, #4] + 1f522a4: e59d300c ldr r3, [sp, #12] + 1f522a8: e082000a add r0, r2, sl + 1f522ac: e58b3004 str r3, [fp, #4] + 1f522b0: e58b2000 str r2, [fp] + 1f522b4: e58b0008 str r0, [fp, #8] + 1f522b8: eaffff49 b 1f51fe4 + 1f522bc: e89b000e ldm fp, {r1, r2, r3} + 1f522c0: e0619003 rsb r9, r1, r3 + 1f522c4: e2891002 add r1, r9, #2 + 1f522c8: e1510002 cmp r1, r2 + 1f522cc: 9a00000c bls 1f52304 + 1f522d0: e289a042 add sl, r9, #66 ; 0x42 + 1f522d4: e1a0000a mov r0, sl + 1f522d8: ebffb0a2 bl 1f3e568 + 1f522dc: e59b3008 ldr r3, [fp, #8] + 1f522e0: e3a02000 mov r2, #0 + 1f522e4: e1a08000 mov r8, r0 + 1f522e8: e5c32000 strb r2, [r3] + 1f522ec: e59b1000 ldr r1, [fp] + 1f522f0: eb000329 bl 1f52f9c + 1f522f4: e59b0000 ldr r0, [fp] + 1f522f8: ebffb0a2 bl 1f3e588 + 1f522fc: e0883009 add r3, r8, r9 + 1f52300: e88b0500 stm fp, {r8, sl} + 1f52304: e3540001 cmp r4, #1 + 1f52308: e2832001 add r2, r3, #1 + 1f5230c: e58b2008 str r2, [fp, #8] + 1f52310: e5c37000 strb r7, [r3] + 1f52314: 8a0000e7 bhi 1f526b8 + 1f52318: e58d5000 str r5, [sp] + 1f5231c: eafffe2c b 1f51bd4 + 1f52320: e1a00007 mov r0, r7 + 1f52324: eb0002f5 bl 1f52f00 + 1f52328: e2509000 subs r9, r0, #0 + 1f5232c: e59b0008 ldr r0, [fp, #8] + 1f52330: 1a0000a5 bne 1f525cc + 1f52334: e1a01007 mov r1, r7 + 1f52338: eb000317 bl 1f52f9c + 1f5233c: e59b3008 ldr r3, [fp, #8] + 1f52340: e1580004 cmp r8, r4 + 1f52344: e0839009 add r9, r3, r9 + 1f52348: e58b9008 str r9, [fp, #8] + 1f5234c: 2afffff1 bcs 1f52318 + 1f52350: e59b2000 ldr r2, [fp] + 1f52354: e0684004 rsb r4, r8, r4 + 1f52358: e59b3004 ldr r3, [fp, #4] + 1f5235c: e0628009 rsb r8, r2, r9 + 1f52360: e0887004 add r7, r8, r4 + 1f52364: e2872001 add r2, r7, #1 + 1f52368: e1520003 cmp r2, r3 + 1f5236c: 9a00000d bls 1f523a8 + 1f52370: e2877041 add r7, r7, #65 ; 0x41 + 1f52374: e1a00007 mov r0, r7 + 1f52378: ebffb07a bl 1f3e568 + 1f5237c: e59b3008 ldr r3, [fp, #8] + 1f52380: e3a02000 mov r2, #0 + 1f52384: e1a09000 mov r9, r0 + 1f52388: e5c32000 strb r2, [r3] + 1f5238c: e59b1000 ldr r1, [fp] + 1f52390: eb000301 bl 1f52f9c + 1f52394: e59b0000 ldr r0, [fp] + 1f52398: ebffb07a bl 1f3e588 + 1f5239c: e58b9000 str r9, [fp] + 1f523a0: e58b7004 str r7, [fp, #4] + 1f523a4: e0899008 add r9, r9, r8 + 1f523a8: e2443001 sub r3, r4, #1 + 1f523ac: e3a01020 mov r1, #32 + 1f523b0: ea000000 b 1f523b8 + 1f523b4: e59b9008 ldr r9, [fp, #8] + 1f523b8: e2433001 sub r3, r3, #1 + 1f523bc: e2892001 add r2, r9, #1 + 1f523c0: e3730001 cmn r3, #1 + 1f523c4: e58b2008 str r2, [fp, #8] + 1f523c8: e5c91000 strb r1, [r9] + 1f523cc: 1afffff8 bne 1f523b4 + 1f523d0: eaffffd0 b 1f52318 + 1f523d4: e89b000c ldm fp, {r2, r3} + 1f523d8: e0628000 rsb r8, r2, r0 + 1f523dc: e0852008 add r2, r5, r8 + 1f523e0: e2821001 add r1, r2, #1 + 1f523e4: e1510003 cmp r1, r3 + 1f523e8: 9affff58 bls 1f52150 + 1f523ec: e2824041 add r4, r2, #65 ; 0x41 + 1f523f0: e1a00004 mov r0, r4 + 1f523f4: ebffb05b bl 1f3e568 + 1f523f8: e59b3008 ldr r3, [fp, #8] + 1f523fc: e3a02000 mov r2, #0 + 1f52400: e1a09000 mov r9, r0 + 1f52404: e5c32000 strb r2, [r3] + 1f52408: e59b1000 ldr r1, [fp] + 1f5240c: eb0002e2 bl 1f52f9c + 1f52410: e59b0000 ldr r0, [fp] + 1f52414: ebffb05b bl 1f3e588 + 1f52418: e0890008 add r0, r9, r8 + 1f5241c: e58b4004 str r4, [fp, #4] + 1f52420: e58b9000 str r9, [fp] + 1f52424: e58b0008 str r0, [fp, #8] + 1f52428: eaffff48 b 1f52150 + 1f5242c: e59ba000 ldr sl, [fp] + 1f52430: e59b3004 ldr r3, [fp, #4] + 1f52434: e06aa000 rsb sl, sl, r0 + 1f52438: e088200a add r2, r8, sl + 1f5243c: e2821001 add r1, r2, #1 + 1f52440: e1510003 cmp r1, r3 + 1f52444: 9afffe48 bls 1f51d6c + 1f52448: e2825041 add r5, r2, #65 ; 0x41 + 1f5244c: e1a00005 mov r0, r5 + 1f52450: ebffb044 bl 1f3e568 + 1f52454: e59b2008 ldr r2, [fp, #8] + 1f52458: e3a03000 mov r3, #0 + 1f5245c: e58d0004 str r0, [sp, #4] + 1f52460: e5c23000 strb r3, [r2] + 1f52464: e59b1000 ldr r1, [fp] + 1f52468: eb0002cb bl 1f52f9c + 1f5246c: e59b0000 ldr r0, [fp] + 1f52470: ebffb044 bl 1f3e588 + 1f52474: e59d3004 ldr r3, [sp, #4] + 1f52478: e58b5004 str r5, [fp, #4] + 1f5247c: e083000a add r0, r3, sl + 1f52480: e58b3000 str r3, [fp] + 1f52484: e58b0008 str r0, [fp, #8] + 1f52488: eafffe37 b 1f51d6c + 1f5248c: e59b0008 ldr r0, [fp, #8] + 1f52490: e59b9000 ldr r9, [fp] + 1f52494: e59b3004 ldr r3, [fp, #4] + 1f52498: e0699000 rsb r9, r9, r0 + 1f5249c: e0882009 add r2, r8, r9 + 1f524a0: e2821001 add r1, r2, #1 + 1f524a4: e1510003 cmp r1, r3 + 1f524a8: 9afffdf4 bls 1f51c80 + 1f524ac: e2824041 add r4, r2, #65 ; 0x41 + 1f524b0: e1a00004 mov r0, r4 + 1f524b4: ebffb02b bl 1f3e568 + 1f524b8: e59b3008 ldr r3, [fp, #8] + 1f524bc: e3a02000 mov r2, #0 + 1f524c0: e1a0a000 mov sl, r0 + 1f524c4: e5c32000 strb r2, [r3] + 1f524c8: e59b1000 ldr r1, [fp] + 1f524cc: eb0002b2 bl 1f52f9c + 1f524d0: e59b0000 ldr r0, [fp] + 1f524d4: ebffb02b bl 1f3e588 + 1f524d8: e08a0009 add r0, sl, r9 + 1f524dc: e58b4004 str r4, [fp, #4] + 1f524e0: e58ba000 str sl, [fp] + 1f524e4: e58b0008 str r0, [fp, #8] + 1f524e8: eafffde4 b 1f51c80 + 1f524ec: e1a03000 mov r3, r0 + 1f524f0: e3a05001 mov r5, #1 + 1f524f4: e1a02000 mov r2, r0 + 1f524f8: eafffd7a b 1f51ae8 + 1f524fc: e59b3008 ldr r3, [fp, #8] + 1f52500: e59b5000 ldr r5, [fp] + 1f52504: e59b2004 ldr r2, [fp, #4] + 1f52508: e0655003 rsb r5, r5, r3 + 1f5250c: e2851002 add r1, r5, #2 + 1f52510: e1510002 cmp r1, r2 + 1f52514: 9a00000c bls 1f5254c + 1f52518: e2858042 add r8, r5, #66 ; 0x42 + 1f5251c: e1a00008 mov r0, r8 + 1f52520: ebffb010 bl 1f3e568 + 1f52524: e59b3008 ldr r3, [fp, #8] + 1f52528: e3a02000 mov r2, #0 + 1f5252c: e1a04000 mov r4, r0 + 1f52530: e5c32000 strb r2, [r3] + 1f52534: e59b1000 ldr r1, [fp] + 1f52538: eb000297 bl 1f52f9c + 1f5253c: e59b0000 ldr r0, [fp] + 1f52540: ebffb010 bl 1f3e588 + 1f52544: e0843005 add r3, r4, r5 + 1f52548: e88b0110 stm fp, {r4, r8} + 1f5254c: e2832001 add r2, r3, #1 + 1f52550: e58b2008 str r2, [fp, #8] + 1f52554: e3a0202d mov r2, #45 ; 0x2d + 1f52558: e5c32000 strb r2, [r3] + 1f5255c: eafffef6 b 1f5213c + 1f52560: e59b3008 ldr r3, [fp, #8] + 1f52564: e59ba000 ldr sl, [fp] + 1f52568: e59b2004 ldr r2, [fp, #4] + 1f5256c: e06aa003 rsb sl, sl, r3 + 1f52570: e28a1002 add r1, sl, #2 + 1f52574: e1510002 cmp r1, r2 + 1f52578: 9a00000e bls 1f525b8 + 1f5257c: e28a3042 add r3, sl, #66 ; 0x42 + 1f52580: e58d3004 str r3, [sp, #4] + 1f52584: e1a00003 mov r0, r3 + 1f52588: ebffaff6 bl 1f3e568 + 1f5258c: e59b2008 ldr r2, [fp, #8] + 1f52590: e1a05000 mov r5, r0 + 1f52594: e5c28000 strb r8, [r2] + 1f52598: e59b1000 ldr r1, [fp] + 1f5259c: eb00027e bl 1f52f9c + 1f525a0: e59b0000 ldr r0, [fp] + 1f525a4: ebffaff7 bl 1f3e588 + 1f525a8: e59d3004 ldr r3, [sp, #4] + 1f525ac: e58b3004 str r3, [fp, #4] + 1f525b0: e085300a add r3, r5, sl + 1f525b4: e58b5000 str r5, [fp] + 1f525b8: e2832001 add r2, r3, #1 + 1f525bc: e58b2008 str r2, [fp, #8] + 1f525c0: e3a0202d mov r2, #45 ; 0x2d + 1f525c4: e5c32000 strb r2, [r3] + 1f525c8: eafffde2 b 1f51d58 + 1f525cc: e59ba000 ldr sl, [fp] + 1f525d0: e59b3004 ldr r3, [fp, #4] + 1f525d4: e06aa000 rsb sl, sl, r0 + 1f525d8: e089200a add r2, r9, sl + 1f525dc: e2821001 add r1, r2, #1 + 1f525e0: e1510003 cmp r1, r3 + 1f525e4: 9affff52 bls 1f52334 + 1f525e8: e2822041 add r2, r2, #65 ; 0x41 + 1f525ec: e58d2004 str r2, [sp, #4] + 1f525f0: e1a00002 mov r0, r2 + 1f525f4: ebffafdb bl 1f3e568 + 1f525f8: e59b1008 ldr r1, [fp, #8] + 1f525fc: e3a03000 mov r3, #0 + 1f52600: e58d0000 str r0, [sp] + 1f52604: e5c13000 strb r3, [r1] + 1f52608: e59b1000 ldr r1, [fp] + 1f5260c: eb000262 bl 1f52f9c + 1f52610: e59b0000 ldr r0, [fp] + 1f52614: ebffafdb bl 1f3e588 + 1f52618: e59d3000 ldr r3, [sp] + 1f5261c: e59d2004 ldr r2, [sp, #4] + 1f52620: e083000a add r0, r3, sl + 1f52624: e58b2004 str r2, [fp, #4] + 1f52628: e58b3000 str r3, [fp] + 1f5262c: e58b0008 str r0, [fp, #8] + 1f52630: eaffff3f b 1f52334 + 1f52634: e1a03002 mov r3, r2 + 1f52638: e3a08001 mov r8, #1 + 1f5263c: eafffdaa b 1f51cec + 1f52640: e2839041 add r9, r3, #65 ; 0x41 + 1f52644: e1a00009 mov r0, r9 + 1f52648: ebffafc6 bl 1f3e568 + 1f5264c: e59b3008 ldr r3, [fp, #8] + 1f52650: e5dd2004 ldrb r2, [sp, #4] + 1f52654: e1a0a000 mov sl, r0 + 1f52658: e5c32000 strb r2, [r3] + 1f5265c: e59b1000 ldr r1, [fp] + 1f52660: eb00024d bl 1f52f9c + 1f52664: e59b0000 ldr r0, [fp] + 1f52668: ebffafc6 bl 1f3e588 + 1f5266c: e58b9004 str r9, [fp, #4] + 1f52670: e58ba000 str sl, [fp] + 1f52674: e08a1008 add r1, sl, r8 + 1f52678: eafffdf3 b 1f51e4c + 1f5267c: e2839041 add r9, r3, #65 ; 0x41 + 1f52680: e1a00009 mov r0, r9 + 1f52684: ebffafb7 bl 1f3e568 + 1f52688: e59b3008 ldr r3, [fp, #8] + 1f5268c: e5dd2004 ldrb r2, [sp, #4] + 1f52690: e1a0a000 mov sl, r0 + 1f52694: e5c32000 strb r2, [r3] + 1f52698: e59b1000 ldr r1, [fp] + 1f5269c: eb00023e bl 1f52f9c + 1f526a0: e59b0000 ldr r0, [fp] + 1f526a4: ebffafb7 bl 1f3e588 + 1f526a8: e58b9004 str r9, [fp, #4] + 1f526ac: e58ba000 str sl, [fp] + 1f526b0: e08a2008 add r2, sl, r8 + 1f526b4: eafffd62 b 1f51c44 + 1f526b8: e59b3008 ldr r3, [fp, #8] + 1f526bc: e2447001 sub r7, r4, #1 + 1f526c0: e59b8000 ldr r8, [fp] + 1f526c4: e59b2004 ldr r2, [fp, #4] + 1f526c8: e0688003 rsb r8, r8, r3 + 1f526cc: e0877008 add r7, r7, r8 + 1f526d0: e2871001 add r1, r7, #1 + 1f526d4: e1510002 cmp r1, r2 + 1f526d8: 9a00000d bls 1f52714 + 1f526dc: e2877041 add r7, r7, #65 ; 0x41 + 1f526e0: e1a00007 mov r0, r7 + 1f526e4: ebffaf9f bl 1f3e568 + 1f526e8: e59b3008 ldr r3, [fp, #8] + 1f526ec: e3a02000 mov r2, #0 + 1f526f0: e1a09000 mov r9, r0 + 1f526f4: e5c32000 strb r2, [r3] + 1f526f8: e59b1000 ldr r1, [fp] + 1f526fc: eb000226 bl 1f52f9c + 1f52700: e59b0000 ldr r0, [fp] + 1f52704: ebffaf9f bl 1f3e588 + 1f52708: e58b7004 str r7, [fp, #4] + 1f5270c: e58b9000 str r9, [fp] + 1f52710: e0893008 add r3, r9, r8 + 1f52714: e2444002 sub r4, r4, #2 + 1f52718: e3a01020 mov r1, #32 + 1f5271c: ea000000 b 1f52724 + 1f52720: e59b3008 ldr r3, [fp, #8] + 1f52724: e2444001 sub r4, r4, #1 + 1f52728: e2832001 add r2, r3, #1 + 1f5272c: e3740001 cmn r4, #1 + 1f52730: e58b2008 str r2, [fp, #8] + 1f52734: e5c31000 strb r1, [r3] + 1f52738: 1afffff8 bne 1f52720 + 1f5273c: eafffef5 b 1f52318 + 1f52740: e2838041 add r8, r3, #65 ; 0x41 + 1f52744: e1a00008 mov r0, r8 + 1f52748: ebffaf86 bl 1f3e568 + 1f5274c: e59b3008 ldr r3, [fp, #8] + 1f52750: e5dd2004 ldrb r2, [sp, #4] + 1f52754: e1a0a000 mov sl, r0 + 1f52758: e5c32000 strb r2, [r3] + 1f5275c: e59b1000 ldr r1, [fp] + 1f52760: eb00020d bl 1f52f9c + 1f52764: e59b0000 ldr r0, [fp] + 1f52768: ebffaf86 bl 1f3e588 + 1f5276c: e58b8004 str r8, [fp, #4] + 1f52770: e58ba000 str sl, [fp] + 1f52774: e08a2009 add r2, sl, r9 + 1f52778: eafffe63 b 1f5210c + +01f5277c : + 1f5277c: e92d000e push {r1, r2, r3} + 1f52780: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f52784: e24dd008 sub sp, sp, #8 + 1f52788: e28d3010 add r3, sp, #16 + 1f5278c: e1a02003 mov r2, r3 + 1f52790: e59d100c ldr r1, [sp, #12] + 1f52794: e58d3004 str r3, [sp, #4] + 1f52798: ebfffc67 bl 1f5193c + 1f5279c: e28dd008 add sp, sp, #8 + 1f527a0: e49de004 pop {lr} ; (ldr lr, [sp], #4) + 1f527a4: e28dd00c add sp, sp, #12 + 1f527a8: e12fff1e bx lr + +01f527ac : + 1f527ac: e3520000 cmp r2, #0 + 1f527b0: 012fff1e bxeq lr + 1f527b4: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f527b8: e590c008 ldr ip, [r0, #8] + 1f527bc: e1a05002 mov r5, r2 + 1f527c0: e5908000 ldr r8, [r0] + 1f527c4: e1a07001 mov r7, r1 + 1f527c8: e5902004 ldr r2, [r0, #4] + 1f527cc: e1a06000 mov r6, r0 + 1f527d0: e068800c rsb r8, r8, ip + 1f527d4: e0853008 add r3, r5, r8 + 1f527d8: e2831001 add r1, r3, #1 + 1f527dc: e1510002 cmp r1, r2 + 1f527e0: 8a000009 bhi 1f5280c + 1f527e4: e2453001 sub r3, r5, #1 + 1f527e8: ea000000 b 1f527f0 + 1f527ec: e596c008 ldr ip, [r6, #8] + 1f527f0: e2433001 sub r3, r3, #1 + 1f527f4: e28c2001 add r2, ip, #1 + 1f527f8: e3730001 cmn r3, #1 + 1f527fc: e5862008 str r2, [r6, #8] + 1f52800: e5cc7000 strb r7, [ip] + 1f52804: 1afffff8 bne 1f527ec + 1f52808: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f5280c: e2839041 add r9, r3, #65 ; 0x41 + 1f52810: e1a00009 mov r0, r9 + 1f52814: ebffaf53 bl 1f3e568 + 1f52818: e5963008 ldr r3, [r6, #8] + 1f5281c: e3a02000 mov r2, #0 + 1f52820: e1a04000 mov r4, r0 + 1f52824: e5c32000 strb r2, [r3] + 1f52828: e5961000 ldr r1, [r6] + 1f5282c: eb0001da bl 1f52f9c + 1f52830: e5960000 ldr r0, [r6] + 1f52834: ebffaf53 bl 1f3e588 + 1f52838: e084c008 add ip, r4, r8 + 1f5283c: e8860210 stm r6, {r4, r9} + 1f52840: eaffffe7 b 1f527e4 + +01f52844 : + 1f52844: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f52848: e1a04000 mov r4, r0 + 1f5284c: e1a00001 mov r0, r1 + 1f52850: e1a05001 mov r5, r1 + 1f52854: eb0001a9 bl 1f52f00 + 1f52858: e2506000 subs r6, r0, #0 + 1f5285c: e5940008 ldr r0, [r4, #8] + 1f52860: 1a000005 bne 1f5287c + 1f52864: e1a01005 mov r1, r5 + 1f52868: eb0001cb bl 1f52f9c + 1f5286c: e5940008 ldr r0, [r4, #8] + 1f52870: e0800006 add r0, r0, r6 + 1f52874: e5840008 str r0, [r4, #8] + 1f52878: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f5287c: e5947000 ldr r7, [r4] + 1f52880: e5942004 ldr r2, [r4, #4] + 1f52884: e0677000 rsb r7, r7, r0 + 1f52888: e0863007 add r3, r6, r7 + 1f5288c: e2831001 add r1, r3, #1 + 1f52890: e1510002 cmp r1, r2 + 1f52894: 9afffff2 bls 1f52864 + 1f52898: e2838041 add r8, r3, #65 ; 0x41 + 1f5289c: e1a00008 mov r0, r8 + 1f528a0: ebffaf30 bl 1f3e568 + 1f528a4: e5943008 ldr r3, [r4, #8] + 1f528a8: e3a02000 mov r2, #0 + 1f528ac: e1a09000 mov r9, r0 + 1f528b0: e5c32000 strb r2, [r3] + 1f528b4: e5941000 ldr r1, [r4] + 1f528b8: eb0001b7 bl 1f52f9c + 1f528bc: e5940000 ldr r0, [r4] + 1f528c0: ebffaf30 bl 1f3e588 + 1f528c4: e0890007 add r0, r9, r7 + 1f528c8: e5848004 str r8, [r4, #4] + 1f528cc: e5849000 str r9, [r4] + 1f528d0: e5840008 str r0, [r4, #8] + 1f528d4: eaffffe2 b 1f52864 + +01f528d8 : + 1f528d8: e3510000 cmp r1, #0 + 1f528dc: 012fff1e bxeq lr + 1f528e0: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f528e4: e890004c ldm r0, {r2, r3, r6} + 1f528e8: e0626006 rsb r6, r2, r6 + 1f528ec: e0811006 add r1, r1, r6 + 1f528f0: e2812001 add r2, r1, #1 + 1f528f4: e1520003 cmp r2, r3 + 1f528f8: 98bd81f0 popls {r4, r5, r6, r7, r8, pc} + 1f528fc: e1a04000 mov r4, r0 + 1f52900: e2815041 add r5, r1, #65 ; 0x41 + 1f52904: e1a00005 mov r0, r5 + 1f52908: ebffaf16 bl 1f3e568 + 1f5290c: e3a02000 mov r2, #0 + 1f52910: e5943008 ldr r3, [r4, #8] + 1f52914: e1a07000 mov r7, r0 + 1f52918: e0876006 add r6, r7, r6 + 1f5291c: e5c32000 strb r2, [r3] + 1f52920: e5941000 ldr r1, [r4] + 1f52924: eb00019c bl 1f52f9c + 1f52928: e5940000 ldr r0, [r4] + 1f5292c: ebffaf15 bl 1f3e588 + 1f52930: e5845004 str r5, [r4, #4] + 1f52934: e5847000 str r7, [r4] + 1f52938: e5846008 str r6, [r4, #8] + 1f5293c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + +01f52940 : + 1f52940: e1510002 cmp r1, r2 + 1f52944: e92d40f0 push {r4, r5, r6, r7, lr} + 1f52948: 23a0c001 movcs ip, #1 + 1f5294c: 3a000018 bcc 1f529b4 + 1f52950: e00c0c92 mul ip, r2, ip + 1f52954: e734fc11 udiv r4, r1, ip + 1f52958: e1540002 cmp r4, r2 + 1f5295c: e1a0e004 mov lr, r4 + 1f52960: 2afffffa bcs 1f52950 + 1f52964: e3530000 cmp r3, #0 + 1f52968: e1a05000 mov r5, r0 + 1f5296c: 13a07037 movne r7, #55 ; 0x37 + 1f52970: 03a07057 moveq r7, #87 ; 0x57 + 1f52974: ea000001 b 1f52980 + 1f52978: e734fc11 udiv r4, r1, ip + 1f5297c: e1a0e004 mov lr, r4 + 1f52980: e35e0009 cmp lr, #9 + 1f52984: e087300e add r3, r7, lr + 1f52988: e061149c mls r1, ip, r4, r1 + 1f5298c: e28ee030 add lr, lr, #48 ; 0x30 + 1f52990: e6af3073 sxtb r3, r3 + 1f52994: e1a06005 mov r6, r5 + 1f52998: 96af307e sxtbls r3, lr + 1f5299c: e4c53001 strb r3, [r5], #1 + 1f529a0: e73cf21c udiv ip, ip, r2 + 1f529a4: e35c0000 cmp ip, #0 + 1f529a8: 1afffff2 bne 1f52978 + 1f529ac: e5c6c001 strb ip, [r6, #1] + 1f529b0: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f529b4: e1a0e001 mov lr, r1 + 1f529b8: e3a0c001 mov ip, #1 + 1f529bc: e1a04001 mov r4, r1 + 1f529c0: eaffffe7 b 1f52964 + +01f529c4 : + 1f529c4: e3520000 cmp r2, #0 + 1f529c8: 012fff1e bxeq lr + 1f529cc: e92d4070 push {r4, r5, r6, lr} + 1f529d0: e2004007 and r4, r0, #7 + 1f529d4: e2425001 sub r5, r2, #1 + 1f529d8: e2644000 rsb r4, r4, #0 + 1f529dc: e6af1071 sxtb r1, r1 + 1f529e0: e204400f and r4, r4, #15 + 1f529e4: e1540002 cmp r4, r2 + 1f529e8: 21a04002 movcs r4, r2 + 1f529ec: e3520012 cmp r2, #18 + 1f529f0: 91a04002 movls r4, r2 + 1f529f4: 8a00004a bhi 1f52b24 + 1f529f8: e080e004 add lr, r0, r4 + 1f529fc: e1a03005 mov r3, r5 + 1f52a00: e1a0c000 mov ip, r0 + 1f52a04: e4cc1001 strb r1, [ip], #1 + 1f52a08: e2433001 sub r3, r3, #1 + 1f52a0c: e15e000c cmp lr, ip + 1f52a10: 1afffffb bne 1f52a04 + 1f52a14: e1520004 cmp r2, r4 + 1f52a18: 0a000040 beq 1f52b20 + 1f52a1c: e0642002 rsb r2, r4, r2 + 1f52a20: e0645005 rsb r5, r4, r5 + 1f52a24: e242c010 sub ip, r2, #16 + 1f52a28: e355000e cmp r5, #14 + 1f52a2c: e1a0c22c lsr ip, ip, #4 + 1f52a30: e28cc001 add ip, ip, #1 + 1f52a34: e1a0520c lsl r5, ip, #4 + 1f52a38: 9a00000b bls 1f52a6c + 1f52a3c: eee01b90 vdup.8 q8, r1 + 1f52a40: e0804004 add r4, r0, r4 + 1f52a44: e3a06000 mov r6, #0 + 1f52a48: e2866001 add r6, r6, #1 + 1f52a4c: f4440adf vst1.64 {d16-d17}, [r4 :64] + 1f52a50: e15c0006 cmp ip, r6 + 1f52a54: e2844010 add r4, r4, #16 + 1f52a58: 8afffffa bhi 1f52a48 + 1f52a5c: e1520005 cmp r2, r5 + 1f52a60: e08ee005 add lr, lr, r5 + 1f52a64: e0653003 rsb r3, r5, r3 + 1f52a68: 08bd8070 popeq {r4, r5, r6, pc} + 1f52a6c: e3530000 cmp r3, #0 + 1f52a70: e5ce1000 strb r1, [lr] + 1f52a74: 08bd8070 popeq {r4, r5, r6, pc} + 1f52a78: e3530001 cmp r3, #1 + 1f52a7c: e5ce1001 strb r1, [lr, #1] + 1f52a80: 08bd8070 popeq {r4, r5, r6, pc} + 1f52a84: e3530002 cmp r3, #2 + 1f52a88: e5ce1002 strb r1, [lr, #2] + 1f52a8c: 08bd8070 popeq {r4, r5, r6, pc} + 1f52a90: e3530003 cmp r3, #3 + 1f52a94: e5ce1003 strb r1, [lr, #3] + 1f52a98: 08bd8070 popeq {r4, r5, r6, pc} + 1f52a9c: e3530004 cmp r3, #4 + 1f52aa0: e5ce1004 strb r1, [lr, #4] + 1f52aa4: 08bd8070 popeq {r4, r5, r6, pc} + 1f52aa8: e3530005 cmp r3, #5 + 1f52aac: e5ce1005 strb r1, [lr, #5] + 1f52ab0: 08bd8070 popeq {r4, r5, r6, pc} + 1f52ab4: e3530006 cmp r3, #6 + 1f52ab8: e5ce1006 strb r1, [lr, #6] + 1f52abc: 08bd8070 popeq {r4, r5, r6, pc} + 1f52ac0: e3530007 cmp r3, #7 + 1f52ac4: e5ce1007 strb r1, [lr, #7] + 1f52ac8: 08bd8070 popeq {r4, r5, r6, pc} + 1f52acc: e3530008 cmp r3, #8 + 1f52ad0: e5ce1008 strb r1, [lr, #8] + 1f52ad4: 08bd8070 popeq {r4, r5, r6, pc} + 1f52ad8: e3530009 cmp r3, #9 + 1f52adc: e5ce1009 strb r1, [lr, #9] + 1f52ae0: 08bd8070 popeq {r4, r5, r6, pc} + 1f52ae4: e353000a cmp r3, #10 + 1f52ae8: e5ce100a strb r1, [lr, #10] + 1f52aec: 08bd8070 popeq {r4, r5, r6, pc} + 1f52af0: e353000b cmp r3, #11 + 1f52af4: e5ce100b strb r1, [lr, #11] + 1f52af8: 08bd8070 popeq {r4, r5, r6, pc} + 1f52afc: e353000c cmp r3, #12 + 1f52b00: e5ce100c strb r1, [lr, #12] + 1f52b04: 08bd8070 popeq {r4, r5, r6, pc} + 1f52b08: e353000d cmp r3, #13 + 1f52b0c: e5ce100d strb r1, [lr, #13] + 1f52b10: 0a000001 beq 1f52b1c + 1f52b14: e5ce100e strb r1, [lr, #14] + 1f52b18: e8bd8070 pop {r4, r5, r6, pc} + 1f52b1c: e8bd8070 pop {r4, r5, r6, pc} + 1f52b20: e8bd8070 pop {r4, r5, r6, pc} + 1f52b24: e3540000 cmp r4, #0 + 1f52b28: 01a03005 moveq r3, r5 + 1f52b2c: 01a0e000 moveq lr, r0 + 1f52b30: 0affffb9 beq 1f52a1c + 1f52b34: eaffffaf b 1f529f8 + +01f52b38 : + 1f52b38: e3520000 cmp r2, #0 + 1f52b3c: 012fff1e bxeq lr + 1f52b40: e2803010 add r3, r0, #16 + 1f52b44: e281c010 add ip, r1, #16 + 1f52b48: e150000c cmp r0, ip + 1f52b4c: 31510003 cmpcc r1, r3 + 1f52b50: 23a03001 movcs r3, #1 + 1f52b54: 33a03000 movcc r3, #0 + 1f52b58: e3520015 cmp r2, #21 + 1f52b5c: 93a03000 movls r3, #0 + 1f52b60: 82033001 andhi r3, r3, #1 + 1f52b64: e3530000 cmp r3, #0 + 1f52b68: 0a0000c5 beq 1f52e84 + 1f52b6c: e2013007 and r3, r1, #7 + 1f52b70: e2633000 rsb r3, r3, #0 + 1f52b74: e203300f and r3, r3, #15 + 1f52b78: e1530002 cmp r3, r2 + 1f52b7c: 21a03002 movcs r3, r2 + 1f52b80: e3530000 cmp r3, #0 + 1f52b84: e92d40f0 push {r4, r5, r6, r7, lr} + 1f52b88: e2424001 sub r4, r2, #1 + 1f52b8c: 0a0000b8 beq 1f52e74 + 1f52b90: e3530001 cmp r3, #1 + 1f52b94: e1d1c0d0 ldrsb ip, [r1] + 1f52b98: e5c0c000 strb ip, [r0] + 1f52b9c: e281e001 add lr, r1, #1 + 1f52ba0: e280c001 add ip, r0, #1 + 1f52ba4: e2425002 sub r5, r2, #2 + 1f52ba8: 0a00005f beq 1f52d2c + 1f52bac: e3530002 cmp r3, #2 + 1f52bb0: e1d1c0d1 ldrsb ip, [r1, #1] + 1f52bb4: e5c0c001 strb ip, [r0, #1] + 1f52bb8: e281e002 add lr, r1, #2 + 1f52bbc: e280c002 add ip, r0, #2 + 1f52bc0: e2425003 sub r5, r2, #3 + 1f52bc4: 0a000058 beq 1f52d2c + 1f52bc8: e3530003 cmp r3, #3 + 1f52bcc: e1d1c0d2 ldrsb ip, [r1, #2] + 1f52bd0: e5c0c002 strb ip, [r0, #2] + 1f52bd4: e281e003 add lr, r1, #3 + 1f52bd8: e280c003 add ip, r0, #3 + 1f52bdc: e2425004 sub r5, r2, #4 + 1f52be0: 0a000051 beq 1f52d2c + 1f52be4: e3530004 cmp r3, #4 + 1f52be8: e1d1c0d3 ldrsb ip, [r1, #3] + 1f52bec: e5c0c003 strb ip, [r0, #3] + 1f52bf0: e281e004 add lr, r1, #4 + 1f52bf4: e280c004 add ip, r0, #4 + 1f52bf8: e2425005 sub r5, r2, #5 + 1f52bfc: 0a00004a beq 1f52d2c + 1f52c00: e3530005 cmp r3, #5 + 1f52c04: e1d1c0d4 ldrsb ip, [r1, #4] + 1f52c08: e5c0c004 strb ip, [r0, #4] + 1f52c0c: e281e005 add lr, r1, #5 + 1f52c10: e280c005 add ip, r0, #5 + 1f52c14: e2425006 sub r5, r2, #6 + 1f52c18: 0a000043 beq 1f52d2c + 1f52c1c: e3530006 cmp r3, #6 + 1f52c20: e1d1c0d5 ldrsb ip, [r1, #5] + 1f52c24: e5c0c005 strb ip, [r0, #5] + 1f52c28: e281e006 add lr, r1, #6 + 1f52c2c: e280c006 add ip, r0, #6 + 1f52c30: e2425007 sub r5, r2, #7 + 1f52c34: 0a00003c beq 1f52d2c + 1f52c38: e3530007 cmp r3, #7 + 1f52c3c: e1d1c0d6 ldrsb ip, [r1, #6] + 1f52c40: e5c0c006 strb ip, [r0, #6] + 1f52c44: e281e007 add lr, r1, #7 + 1f52c48: e280c007 add ip, r0, #7 + 1f52c4c: e2425008 sub r5, r2, #8 + 1f52c50: 0a000035 beq 1f52d2c + 1f52c54: e3530008 cmp r3, #8 + 1f52c58: e1d1c0d7 ldrsb ip, [r1, #7] + 1f52c5c: e5c0c007 strb ip, [r0, #7] + 1f52c60: e281e008 add lr, r1, #8 + 1f52c64: e280c008 add ip, r0, #8 + 1f52c68: e2425009 sub r5, r2, #9 + 1f52c6c: 0a00002e beq 1f52d2c + 1f52c70: e3530009 cmp r3, #9 + 1f52c74: e1d1c0d8 ldrsb ip, [r1, #8] + 1f52c78: e5c0c008 strb ip, [r0, #8] + 1f52c7c: e281e009 add lr, r1, #9 + 1f52c80: e280c009 add ip, r0, #9 + 1f52c84: e242500a sub r5, r2, #10 + 1f52c88: 0a000027 beq 1f52d2c + 1f52c8c: e353000a cmp r3, #10 + 1f52c90: e1d1c0d9 ldrsb ip, [r1, #9] + 1f52c94: e5c0c009 strb ip, [r0, #9] + 1f52c98: e281e00a add lr, r1, #10 + 1f52c9c: e280c00a add ip, r0, #10 + 1f52ca0: e242500b sub r5, r2, #11 + 1f52ca4: 0a000020 beq 1f52d2c + 1f52ca8: e353000b cmp r3, #11 + 1f52cac: e1d1c0da ldrsb ip, [r1, #10] + 1f52cb0: e5c0c00a strb ip, [r0, #10] + 1f52cb4: e281e00b add lr, r1, #11 + 1f52cb8: e280c00b add ip, r0, #11 + 1f52cbc: e242500c sub r5, r2, #12 + 1f52cc0: 0a000019 beq 1f52d2c + 1f52cc4: e353000c cmp r3, #12 + 1f52cc8: e1d1c0db ldrsb ip, [r1, #11] + 1f52ccc: e5c0c00b strb ip, [r0, #11] + 1f52cd0: e281e00c add lr, r1, #12 + 1f52cd4: e280c00c add ip, r0, #12 + 1f52cd8: e242500d sub r5, r2, #13 + 1f52cdc: 0a000012 beq 1f52d2c + 1f52ce0: e353000d cmp r3, #13 + 1f52ce4: e1d1c0dc ldrsb ip, [r1, #12] + 1f52ce8: e5c0c00c strb ip, [r0, #12] + 1f52cec: e281e00d add lr, r1, #13 + 1f52cf0: e280c00d add ip, r0, #13 + 1f52cf4: e242500e sub r5, r2, #14 + 1f52cf8: 0a00000b beq 1f52d2c + 1f52cfc: e353000f cmp r3, #15 + 1f52d00: e1d1c0dd ldrsb ip, [r1, #13] + 1f52d04: e5c0c00d strb ip, [r0, #13] + 1f52d08: e281e00e add lr, r1, #14 + 1f52d0c: e280c00e add ip, r0, #14 + 1f52d10: e242500f sub r5, r2, #15 + 1f52d14: 1a000004 bne 1f52d2c + 1f52d18: e1d1e0de ldrsb lr, [r1, #14] + 1f52d1c: e280c00f add ip, r0, #15 + 1f52d20: e5c0e00e strb lr, [r0, #14] + 1f52d24: e2425010 sub r5, r2, #16 + 1f52d28: e281e00f add lr, r1, #15 + 1f52d2c: e0632002 rsb r2, r3, r2 + 1f52d30: e0636004 rsb r6, r3, r4 + 1f52d34: e2424010 sub r4, r2, #16 + 1f52d38: e356000e cmp r6, #14 + 1f52d3c: e1a04224 lsr r4, r4, #4 + 1f52d40: e2844001 add r4, r4, #1 + 1f52d44: e1a06204 lsl r6, r4, #4 + 1f52d48: 9a00000e bls 1f52d88 + 1f52d4c: e0811003 add r1, r1, r3 + 1f52d50: e3a07000 mov r7, #0 + 1f52d54: e0803003 add r3, r0, r3 + 1f52d58: f4610adf vld1.64 {d16-d17}, [r1 :64] + 1f52d5c: e2877001 add r7, r7, #1 + 1f52d60: e1570004 cmp r7, r4 + 1f52d64: e2811010 add r1, r1, #16 + 1f52d68: f4430a0f vst1.8 {d16-d17}, [r3] + 1f52d6c: e2833010 add r3, r3, #16 + 1f52d70: 3afffff8 bcc 1f52d58 + 1f52d74: e1520006 cmp r2, r6 + 1f52d78: e08cc006 add ip, ip, r6 + 1f52d7c: e08ee006 add lr, lr, r6 + 1f52d80: e0665005 rsb r5, r6, r5 + 1f52d84: 08bd80f0 popeq {r4, r5, r6, r7, pc} + 1f52d88: e3550000 cmp r5, #0 + 1f52d8c: e1de30d0 ldrsb r3, [lr] + 1f52d90: e5cc3000 strb r3, [ip] + 1f52d94: 08bd80f0 popeq {r4, r5, r6, r7, pc} + 1f52d98: e3550001 cmp r5, #1 + 1f52d9c: e1de30d1 ldrsb r3, [lr, #1] + 1f52da0: e5cc3001 strb r3, [ip, #1] + 1f52da4: 08bd80f0 popeq {r4, r5, r6, r7, pc} + 1f52da8: e3550002 cmp r5, #2 + 1f52dac: e1de30d2 ldrsb r3, [lr, #2] + 1f52db0: e5cc3002 strb r3, [ip, #2] + 1f52db4: 08bd80f0 popeq {r4, r5, r6, r7, pc} + 1f52db8: e3550003 cmp r5, #3 + 1f52dbc: e1de30d3 ldrsb r3, [lr, #3] + 1f52dc0: e5cc3003 strb r3, [ip, #3] + 1f52dc4: 08bd80f0 popeq {r4, r5, r6, r7, pc} + 1f52dc8: e3550004 cmp r5, #4 + 1f52dcc: e1de30d4 ldrsb r3, [lr, #4] + 1f52dd0: e5cc3004 strb r3, [ip, #4] + 1f52dd4: 08bd80f0 popeq {r4, r5, r6, r7, pc} + 1f52dd8: e3550005 cmp r5, #5 + 1f52ddc: e1de30d5 ldrsb r3, [lr, #5] + 1f52de0: e5cc3005 strb r3, [ip, #5] + 1f52de4: 08bd80f0 popeq {r4, r5, r6, r7, pc} + 1f52de8: e3550006 cmp r5, #6 + 1f52dec: e1de30d6 ldrsb r3, [lr, #6] + 1f52df0: e5cc3006 strb r3, [ip, #6] + 1f52df4: 08bd80f0 popeq {r4, r5, r6, r7, pc} + 1f52df8: e3550007 cmp r5, #7 + 1f52dfc: e1de30d7 ldrsb r3, [lr, #7] + 1f52e00: e5cc3007 strb r3, [ip, #7] + 1f52e04: 08bd80f0 popeq {r4, r5, r6, r7, pc} + 1f52e08: e3550008 cmp r5, #8 + 1f52e0c: e1de30d8 ldrsb r3, [lr, #8] + 1f52e10: e5cc3008 strb r3, [ip, #8] + 1f52e14: 08bd80f0 popeq {r4, r5, r6, r7, pc} + 1f52e18: e3550009 cmp r5, #9 + 1f52e1c: e1de30d9 ldrsb r3, [lr, #9] + 1f52e20: e5cc3009 strb r3, [ip, #9] + 1f52e24: 08bd80f0 popeq {r4, r5, r6, r7, pc} + 1f52e28: e355000a cmp r5, #10 + 1f52e2c: e1de30da ldrsb r3, [lr, #10] + 1f52e30: e5cc300a strb r3, [ip, #10] + 1f52e34: 08bd80f0 popeq {r4, r5, r6, r7, pc} + 1f52e38: e355000b cmp r5, #11 + 1f52e3c: e1de30db ldrsb r3, [lr, #11] + 1f52e40: e5cc300b strb r3, [ip, #11] + 1f52e44: 08bd80f0 popeq {r4, r5, r6, r7, pc} + 1f52e48: e355000c cmp r5, #12 + 1f52e4c: e1de30dc ldrsb r3, [lr, #12] + 1f52e50: e5cc300c strb r3, [ip, #12] + 1f52e54: 08bd80f0 popeq {r4, r5, r6, r7, pc} + 1f52e58: e355000d cmp r5, #13 + 1f52e5c: e1de30dd ldrsb r3, [lr, #13] + 1f52e60: e5cc300d strb r3, [ip, #13] + 1f52e64: 0a00000d beq 1f52ea0 + 1f52e68: e1de30de ldrsb r3, [lr, #14] + 1f52e6c: e5cc300e strb r3, [ip, #14] + 1f52e70: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f52e74: e1a05004 mov r5, r4 + 1f52e78: e1a0e001 mov lr, r1 + 1f52e7c: e1a0c000 mov ip, r0 + 1f52e80: eaffffa9 b 1f52d2c + 1f52e84: e0812002 add r2, r1, r2 + 1f52e88: e2403001 sub r3, r0, #1 + 1f52e8c: e0d1c0d1 ldrsb ip, [r1], #1 + 1f52e90: e5e3c001 strb ip, [r3, #1]! + 1f52e94: e1510002 cmp r1, r2 + 1f52e98: 1afffffb bne 1f52e8c + 1f52e9c: e12fff1e bx lr + 1f52ea0: e8bd80f0 pop {r4, r5, r6, r7, pc} + +01f52ea4 : + 1f52ea4: e3520000 cmp r2, #0 + 1f52ea8: 0a00000e beq 1f52ee8 + 1f52eac: e5d0c000 ldrb ip, [r0] + 1f52eb0: e5d13000 ldrb r3, [r1] + 1f52eb4: e15c0003 cmp ip, r3 + 1f52eb8: 8a00000c bhi 1f52ef0 + 1f52ebc: 3a00000d bcc 1f52ef8 + 1f52ec0: e0802002 add r2, r0, r2 + 1f52ec4: e2800001 add r0, r0, #1 + 1f52ec8: ea000004 b 1f52ee0 + 1f52ecc: e4d0c001 ldrb ip, [r0], #1 + 1f52ed0: e5f13001 ldrb r3, [r1, #1]! + 1f52ed4: e15c0003 cmp ip, r3 + 1f52ed8: 8a000004 bhi 1f52ef0 + 1f52edc: 3a000005 bcc 1f52ef8 + 1f52ee0: e1500002 cmp r0, r2 + 1f52ee4: 1afffff8 bne 1f52ecc + 1f52ee8: e3a00000 mov r0, #0 + 1f52eec: e12fff1e bx lr + 1f52ef0: e3a00001 mov r0, #1 + 1f52ef4: e12fff1e bx lr + 1f52ef8: e3e00000 mvn r0, #0 + 1f52efc: e12fff1e bx lr + +01f52f00 : + 1f52f00: e1d010d0 ldrsb r1, [r0] + 1f52f04: e2803001 add r3, r0, #1 + 1f52f08: e3510000 cmp r1, #0 + 1f52f0c: 0a000003 beq 1f52f20 + 1f52f10: e0601003 rsb r1, r0, r3 + 1f52f14: e0d320d1 ldrsb r2, [r3], #1 + 1f52f18: e3520000 cmp r2, #0 + 1f52f1c: 1afffffb bne 1f52f10 + 1f52f20: e1a00001 mov r0, r1 + 1f52f24: e12fff1e bx lr + +01f52f28 : + 1f52f28: e1d020d0 ldrsb r2, [r0] + 1f52f2c: e1d130d0 ldrsb r3, [r1] + 1f52f30: e3520000 cmp r2, #0 + 1f52f34: 0a00000f beq 1f52f78 + 1f52f38: e3530000 cmp r3, #0 + 1f52f3c: 0a00000d beq 1f52f78 + 1f52f40: e1530002 cmp r3, r2 + 1f52f44: ba000010 blt 1f52f8c + 1f52f48: da000006 ble 1f52f68 + 1f52f4c: ea000010 b 1f52f94 + 1f52f50: e1f130d1 ldrsb r3, [r1, #1]! + 1f52f54: e3530000 cmp r3, #0 + 1f52f58: 0a000006 beq 1f52f78 + 1f52f5c: e1520003 cmp r2, r3 + 1f52f60: ca000009 bgt 1f52f8c + 1f52f64: ba00000a blt 1f52f94 + 1f52f68: e1f020d1 ldrsb r2, [r0, #1]! + 1f52f6c: e3520000 cmp r2, #0 + 1f52f70: 1afffff6 bne 1f52f50 + 1f52f74: e1d130d1 ldrsb r3, [r1, #1] + 1f52f78: e1520003 cmp r2, r3 + 1f52f7c: ca000002 bgt 1f52f8c + 1f52f80: b3e00000 mvnlt r0, #0 + 1f52f84: a3a00000 movge r0, #0 + 1f52f88: e12fff1e bx lr + 1f52f8c: e3a00001 mov r0, #1 + 1f52f90: e12fff1e bx lr + 1f52f94: e3e00000 mvn r0, #0 + 1f52f98: e12fff1e bx lr + +01f52f9c : + 1f52f9c: e1d130d0 ldrsb r3, [r1] + 1f52fa0: e1a02000 mov r2, r0 + 1f52fa4: e3530000 cmp r3, #0 + 1f52fa8: 0a000003 beq 1f52fbc + 1f52fac: e4c23001 strb r3, [r2], #1 + 1f52fb0: e1f130d1 ldrsb r3, [r1, #1]! + 1f52fb4: e3530000 cmp r3, #0 + 1f52fb8: 1afffffb bne 1f52fac + 1f52fbc: e3a03000 mov r3, #0 + 1f52fc0: e5c23000 strb r3, [r2] + 1f52fc4: e12fff1e bx lr + +01f52fc8 : + 1f52fc8: e3520000 cmp r2, #0 + 1f52fcc: 012fff1e bxeq lr + 1f52fd0: e1d130d0 ldrsb r3, [r1] + 1f52fd4: e3530000 cmp r3, #0 + 1f52fd8: 0a00000a beq 1f53008 + 1f52fdc: e0812002 add r2, r1, r2 + 1f52fe0: e1a0c000 mov ip, r0 + 1f52fe4: e2811001 add r1, r1, #1 + 1f52fe8: ea000002 b 1f52ff8 + 1f52fec: e0d130d1 ldrsb r3, [r1], #1 + 1f52ff0: e3530000 cmp r3, #0 + 1f52ff4: 0a000004 beq 1f5300c + 1f52ff8: e1510002 cmp r1, r2 + 1f52ffc: e4cc3001 strb r3, [ip], #1 + 1f53000: 1afffff9 bne 1f52fec + 1f53004: e12fff1e bx lr + 1f53008: e1a0c000 mov ip, r0 + 1f5300c: e3a03000 mov r3, #0 + 1f53010: e5cc3000 strb r3, [ip] + 1f53014: e12fff1e bx lr + +01f53018 : + 1f53018: e1d030d0 ldrsb r3, [r0] + 1f5301c: e3530000 cmp r3, #0 + 1f53020: e1a03000 mov r3, r0 + 1f53024: 0a000002 beq 1f53034 + 1f53028: e1f320d1 ldrsb r2, [r3, #1]! + 1f5302c: e3520000 cmp r2, #0 + 1f53030: 1afffffc bne 1f53028 + 1f53034: e1d120d0 ldrsb r2, [r1] + 1f53038: e3520000 cmp r2, #0 + 1f5303c: 0a000003 beq 1f53050 + 1f53040: e4c32001 strb r2, [r3], #1 + 1f53044: e1f120d1 ldrsb r2, [r1, #1]! + 1f53048: e3520000 cmp r2, #0 + 1f5304c: 1afffffb bne 1f53040 + 1f53050: e3a02000 mov r2, #0 + 1f53054: e5c32000 strb r2, [r3] + 1f53058: e12fff1e bx lr + +01f5305c : + 1f5305c: e12fff1e bx lr + +01f53060 : + 1f53060: e6bf0fb0 rev16 r0, r0 + 1f53064: e6ff0070 uxth r0, r0 + 1f53068: e12fff1e bx lr + +01f5306c : + 1f5306c: e6bf0f30 rev r0, r0 + 1f53070: e12fff1e bx lr + +01f53074 : + 1f53074: e92d4010 push {r4, lr} + 1f53078: e1a04000 mov r4, r0 + 1f5307c: ebffeffd bl 1f4f078 + 1f53080: f2c00010 vmov.i32 d16, #0 ; 0x00000000 + 1f53084: e3a03000 mov r3, #0 + 1f53088: e3032788 movw r2, #14216 ; 0x3788 + 1f5308c: e34021f5 movt r2, #501 ; 0x1f5 + 1f53090: e5843038 str r3, [r4, #56] ; 0x38 + 1f53094: e5842000 str r2, [r4] + 1f53098: edc40b12 vstr d16, [r4, #72] ; 0x48 + 1f5309c: e584303c str r3, [r4, #60] ; 0x3c + 1f530a0: e5843040 str r3, [r4, #64] ; 0x40 + 1f530a4: e5843044 str r3, [r4, #68] ; 0x44 + 1f530a8: e8bd8010 pop {r4, pc} + +01f530ac <_USBBulkOnlyMassStorageDevice>: + 1f530ac: e92d4010 push {r4, lr} + 1f530b0: e1a04000 mov r4, r0 + 1f530b4: e590003c ldr r0, [r0, #60] ; 0x3c + 1f530b8: e3500000 cmp r0, #0 + 1f530bc: 0a000004 beq 1f530d4 <_USBBulkOnlyMassStorageDevice+0x28> + 1f530c0: ebfff1bb bl 1f4f7b4 <_USBEndpoint> + 1f530c4: e594003c ldr r0, [r4, #60] ; 0x3c + 1f530c8: ebffad2e bl 1f3e588 + 1f530cc: e3a03000 mov r3, #0 + 1f530d0: e584303c str r3, [r4, #60] ; 0x3c + 1f530d4: e5940038 ldr r0, [r4, #56] ; 0x38 + 1f530d8: e3500000 cmp r0, #0 + 1f530dc: 0a000004 beq 1f530f4 <_USBBulkOnlyMassStorageDevice+0x48> + 1f530e0: ebfff1b3 bl 1f4f7b4 <_USBEndpoint> + 1f530e4: e5940038 ldr r0, [r4, #56] ; 0x38 + 1f530e8: ebffad26 bl 1f3e588 + 1f530ec: e3a03000 mov r3, #0 + 1f530f0: e5843038 str r3, [r4, #56] ; 0x38 + 1f530f4: e1a00004 mov r0, r4 + 1f530f8: e8bd4010 pop {r4, lr} + 1f530fc: eafff01a b 1f4f16c <_USBDevice> + +01f53100 : + 1f53100: e1c024f8 strd r2, [r0, #72] ; 0x48 + 1f53104: e1a01003 mov r1, r3 + 1f53108: e1a00002 mov r0, r2 + 1f5310c: e12fff1e bx lr + +01f53110 : + 1f53110: e5900044 ldr r0, [r0, #68] ; 0x44 + 1f53114: e12fff1e bx lr + +01f53118 : + 1f53118: e92d43f0 push {r4, r5, r6, r7, r8, r9, lr} + 1f5311c: e1c084d8 ldrd r8, [r0, #72] ; 0x48 + 1f53120: e30041ff movw r4, #511 ; 0x1ff + 1f53124: e3a05000 mov r5, #0 + 1f53128: e0044008 and r4, r4, r8 + 1f5312c: e0055009 and r5, r5, r9 + 1f53130: e1943005 orrs r3, r4, r5 + 1f53134: e30071ff movw r7, #511 ; 0x1ff + 1f53138: 13a03001 movne r3, #1 + 1f5313c: 03a03000 moveq r3, #0 + 1f53140: e3e06000 mvn r6, #0 + 1f53144: e1590007 cmp r9, r7 + 1f53148: 01580006 cmpeq r8, r6 + 1f5314c: e24dd044 sub sp, sp, #68 ; 0x44 + 1f53150: 83833001 orrhi r3, r3, #1 + 1f53154: e3530000 cmp r3, #0 + 1f53158: 1a00005a bne 1f532c8 + 1f5315c: e7e86052 ubfx r6, r2, #0, #9 + 1f53160: e1a084a8 lsr r8, r8, #9 + 1f53164: e3560000 cmp r6, #0 + 1f53168: e1888b89 orr r8, r8, r9, lsl #23 + 1f5316c: 1a000055 bne 1f532c8 + 1f53170: e1a04002 mov r4, r2 + 1f53174: e1a05000 mov r5, r0 + 1f53178: e1a00008 mov r0, r8 + 1f5317c: e3a03028 mov r3, #40 ; 0x28 + 1f53180: e1a07001 mov r7, r1 + 1f53184: e5cd3004 strb r3, [sp, #4] + 1f53188: e5cd6005 strb r6, [sp, #5] + 1f5318c: ebffffb6 bl 1f5306c + 1f53190: e58d0006 str r0, [sp, #6] + 1f53194: e7ef04d4 ubfx r0, r4, #9, #16 + 1f53198: e5cd600a strb r6, [sp, #10] + 1f5319c: ebffffaf bl 1f53060 + 1f531a0: e1a01006 mov r1, r6 + 1f531a4: e3a0201f mov r2, #31 + 1f531a8: e1cd00bb strh r0, [sp, #11] + 1f531ac: e28d0020 add r0, sp, #32 + 1f531b0: e5cd600d strb r6, [sp, #13] + 1f531b4: ebfffe02 bl 1f529c4 + 1f531b8: e5953040 ldr r3, [r5, #64] ; 0x40 + 1f531bc: e3a0e00a mov lr, #10 + 1f531c0: e5dd802d ldrb r8, [sp, #45] ; 0x2d + 1f531c4: e1a0200e mov r2, lr + 1f531c8: e2833001 add r3, r3, #1 + 1f531cc: e5853040 str r3, [r5, #64] ; 0x40 + 1f531d0: e28d1004 add r1, sp, #4 + 1f531d4: e28d002f add r0, sp, #47 ; 0x2f + 1f531d8: e5ddc02e ldrb ip, [sp, #46] ; 0x2e + 1f531dc: e7c38016 bfi r8, r6, #0, #4 + 1f531e0: e58d3024 str r3, [sp, #36] ; 0x24 + 1f531e4: e3053355 movw r3, #21333 ; 0x5355 + 1f531e8: e3443342 movt r3, #17218 ; 0x4342 + 1f531ec: e58d3020 str r3, [sp, #32] + 1f531f0: e7c4c01e bfi ip, lr, #0, #5 + 1f531f4: e3e0307f mvn r3, #127 ; 0x7f + 1f531f8: e5cdc02e strb ip, [sp, #46] ; 0x2e + 1f531fc: e5cd302c strb r3, [sp, #44] ; 0x2c + 1f53200: e58d4028 str r4, [sp, #40] ; 0x28 + 1f53204: e5cd802d strb r8, [sp, #45] ; 0x2d + 1f53208: ebfffe4a bl 1f52b38 + 1f5320c: e1a00005 mov r0, r5 + 1f53210: ebfff103 bl 1f4f624 + 1f53214: e28d2020 add r2, sp, #32 + 1f53218: e3a0301f mov r3, #31 + 1f5321c: e595103c ldr r1, [r5, #60] ; 0x3c + 1f53220: e1a06000 mov r6, r0 + 1f53224: ebffeb67 bl 1f4dfc8 + 1f53228: e3500000 cmp r0, #0 + 1f5322c: ba00004b blt 1f53360 + 1f53230: e3540000 cmp r4, #0 + 1f53234: 0a000021 beq 1f532c0 + 1f53238: e1a02007 mov r2, r7 + 1f5323c: e1a03004 mov r3, r4 + 1f53240: e5951038 ldr r1, [r5, #56] ; 0x38 + 1f53244: e1a00006 mov r0, r6 + 1f53248: ebffeb5e bl 1f4dfc8 + 1f5324c: e2507000 subs r7, r0, #0 + 1f53250: ba000049 blt 1f5337c + 1f53254: e1a00006 mov r0, r6 + 1f53258: e3a0300d mov r3, #13 + 1f5325c: e28d2010 add r2, sp, #16 + 1f53260: e5951038 ldr r1, [r5, #56] ; 0x38 + 1f53264: ebffeb57 bl 1f4dfc8 + 1f53268: e350000d cmp r0, #13 + 1f5326c: 1a000026 bne 1f5330c + 1f53270: e59d2010 ldr r2, [sp, #16] + 1f53274: e3053355 movw r3, #21333 ; 0x5355 + 1f53278: e3453342 movt r3, #21314 ; 0x5342 + 1f5327c: e1520003 cmp r2, r3 + 1f53280: 1a000013 bne 1f532d4 + 1f53284: e5953040 ldr r3, [r5, #64] ; 0x40 + 1f53288: e59d2014 ldr r2, [sp, #20] + 1f5328c: e1520003 cmp r2, r3 + 1f53290: 1a000024 bne 1f53328 + 1f53294: e5dd301c ldrb r3, [sp, #28] + 1f53298: e3530000 cmp r3, #0 + 1f5329c: 1a000012 bne 1f532ec + 1f532a0: e59d3018 ldr r3, [sp, #24] + 1f532a4: e3530000 cmp r3, #0 + 1f532a8: 1a000025 bne 1f53344 + 1f532ac: e1540007 cmp r4, r7 + 1f532b0: e1a00004 mov r0, r4 + 1f532b4: 1a00000c bne 1f532ec + 1f532b8: e28dd044 add sp, sp, #68 ; 0x44 + 1f532bc: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f532c0: e1a07004 mov r7, r4 + 1f532c4: eaffffe2 b 1f53254 + 1f532c8: e3e00000 mvn r0, #0 + 1f532cc: e28dd044 add sp, sp, #68 ; 0x44 + 1f532d0: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f532d4: e3032658 movw r2, #13912 ; 0x3658 + 1f532d8: e34021f6 movt r2, #502 ; 0x1f6 + 1f532dc: e3030610 movw r0, #13840 ; 0x3610 + 1f532e0: e34001f6 movt r0, #502 ; 0x1f6 + 1f532e4: e3a01001 mov r1, #1 + 1f532e8: ebfeb7e6 bl 1f01288 + 1f532ec: e303269c movw r2, #13980 ; 0x369c + 1f532f0: e34021f6 movt r2, #502 ; 0x1f6 + 1f532f4: e3030610 movw r0, #13840 ; 0x3610 + 1f532f8: e34001f6 movt r0, #502 ; 0x1f6 + 1f532fc: e3a01001 mov r1, #1 + 1f53300: ebfeb7e0 bl 1f01288 + 1f53304: e3e00000 mvn r0, #0 + 1f53308: eaffffea b 1f532b8 + 1f5330c: e3032644 movw r2, #13892 ; 0x3644 + 1f53310: e34021f6 movt r2, #502 ; 0x1f6 + 1f53314: e3030610 movw r0, #13840 ; 0x3610 + 1f53318: e34001f6 movt r0, #502 ; 0x1f6 + 1f5331c: e3a01001 mov r1, #1 + 1f53320: ebfeb7d8 bl 1f01288 + 1f53324: eafffff0 b 1f532ec + 1f53328: e3032670 movw r2, #13936 ; 0x3670 + 1f5332c: e34021f6 movt r2, #502 ; 0x1f6 + 1f53330: e3030610 movw r0, #13840 ; 0x3610 + 1f53334: e34001f6 movt r0, #502 ; 0x1f6 + 1f53338: e3a01001 mov r1, #1 + 1f5333c: ebfeb7d1 bl 1f01288 + 1f53340: eaffffe9 b 1f532ec + 1f53344: e3032684 movw r2, #13956 ; 0x3684 + 1f53348: e34021f6 movt r2, #502 ; 0x1f6 + 1f5334c: e3030610 movw r0, #13840 ; 0x3610 + 1f53350: e34001f6 movt r0, #502 ; 0x1f6 + 1f53354: e3a01001 mov r1, #1 + 1f53358: ebfeb7ca bl 1f01288 + 1f5335c: eaffffe2 b 1f532ec + 1f53360: e3032618 movw r2, #13848 ; 0x3618 + 1f53364: e34021f6 movt r2, #502 ; 0x1f6 + 1f53368: e3030610 movw r0, #13840 ; 0x3610 + 1f5336c: e34001f6 movt r0, #502 ; 0x1f6 + 1f53370: e3a01001 mov r1, #1 + 1f53374: ebfeb7c3 bl 1f01288 + 1f53378: eaffffdb b 1f532ec + 1f5337c: e303262c movw r2, #13868 ; 0x362c + 1f53380: e34021f6 movt r2, #502 ; 0x1f6 + 1f53384: e3030610 movw r0, #13840 ; 0x3610 + 1f53388: e34001f6 movt r0, #502 ; 0x1f6 + 1f5338c: e3a01001 mov r1, #1 + 1f53390: ebfeb7bc bl 1f01288 + 1f53394: eaffffd4 b 1f532ec + +01f53398 : + 1f53398: e92d43f0 push {r4, r5, r6, r7, r8, r9, lr} + 1f5339c: e1c084d8 ldrd r8, [r0, #72] ; 0x48 + 1f533a0: e30041ff movw r4, #511 ; 0x1ff + 1f533a4: e3a05000 mov r5, #0 + 1f533a8: e0044008 and r4, r4, r8 + 1f533ac: e0055009 and r5, r5, r9 + 1f533b0: e1943005 orrs r3, r4, r5 + 1f533b4: e30071ff movw r7, #511 ; 0x1ff + 1f533b8: 13a03001 movne r3, #1 + 1f533bc: 03a03000 moveq r3, #0 + 1f533c0: e3e06000 mvn r6, #0 + 1f533c4: e1590007 cmp r9, r7 + 1f533c8: 01580006 cmpeq r8, r6 + 1f533cc: e24dd044 sub sp, sp, #68 ; 0x44 + 1f533d0: 83833001 orrhi r3, r3, #1 + 1f533d4: e3530000 cmp r3, #0 + 1f533d8: 1a000061 bne 1f53564 + 1f533dc: e7e86052 ubfx r6, r2, #0, #9 + 1f533e0: e1a084a8 lsr r8, r8, #9 + 1f533e4: e3560000 cmp r6, #0 + 1f533e8: e1888b89 orr r8, r8, r9, lsl #23 + 1f533ec: 1a00005c bne 1f53564 + 1f533f0: e1a05000 mov r5, r0 + 1f533f4: e1a04002 mov r4, r2 + 1f533f8: e1a00008 mov r0, r8 + 1f533fc: e3a03008 mov r3, #8 + 1f53400: e3a0202a mov r2, #42 ; 0x2a + 1f53404: e5cd3005 strb r3, [sp, #5] + 1f53408: e1a07001 mov r7, r1 + 1f5340c: e5cd2004 strb r2, [sp, #4] + 1f53410: ebffff15 bl 1f5306c + 1f53414: e58d0006 str r0, [sp, #6] + 1f53418: e7ef04d4 ubfx r0, r4, #9, #16 + 1f5341c: e5cd600a strb r6, [sp, #10] + 1f53420: ebffff0e bl 1f53060 + 1f53424: e1a01006 mov r1, r6 + 1f53428: e3a0201f mov r2, #31 + 1f5342c: e1cd00bb strh r0, [sp, #11] + 1f53430: e28d0020 add r0, sp, #32 + 1f53434: e5cd600d strb r6, [sp, #13] + 1f53438: ebfffd61 bl 1f529c4 + 1f5343c: e5953040 ldr r3, [r5, #64] ; 0x40 + 1f53440: e5ddc02e ldrb ip, [sp, #46] ; 0x2e + 1f53444: e3a0200a mov r2, #10 + 1f53448: e5dde02d ldrb lr, [sp, #45] ; 0x2d + 1f5344c: e2833001 add r3, r3, #1 + 1f53450: e28d1004 add r1, sp, #4 + 1f53454: e5853040 str r3, [r5, #64] ; 0x40 + 1f53458: e28d002f add r0, sp, #47 ; 0x2f + 1f5345c: e7c3e016 bfi lr, r6, #0, #4 + 1f53460: e7c4c012 bfi ip, r2, #0, #5 + 1f53464: e5cde02d strb lr, [sp, #45] ; 0x2d + 1f53468: e5cdc02e strb ip, [sp, #46] ; 0x2e + 1f5346c: e5cd602c strb r6, [sp, #44] ; 0x2c + 1f53470: e58d3024 str r3, [sp, #36] ; 0x24 + 1f53474: e3053355 movw r3, #21333 ; 0x5355 + 1f53478: e3443342 movt r3, #17218 ; 0x4342 + 1f5347c: e58d3020 str r3, [sp, #32] + 1f53480: e58d4028 str r4, [sp, #40] ; 0x28 + 1f53484: ebfffdab bl 1f52b38 + 1f53488: e1a00005 mov r0, r5 + 1f5348c: ebfff064 bl 1f4f624 + 1f53490: e28d2020 add r2, sp, #32 + 1f53494: e3a0301f mov r3, #31 + 1f53498: e595103c ldr r1, [r5, #60] ; 0x3c + 1f5349c: e1a06000 mov r6, r0 + 1f534a0: ebffeac8 bl 1f4dfc8 + 1f534a4: e3500000 cmp r0, #0 + 1f534a8: ba000045 blt 1f535c4 + 1f534ac: e3540000 cmp r4, #0 + 1f534b0: 0a000006 beq 1f534d0 + 1f534b4: e1a02007 mov r2, r7 + 1f534b8: e1a03004 mov r3, r4 + 1f534bc: e595103c ldr r1, [r5, #60] ; 0x3c + 1f534c0: e1a00006 mov r0, r6 + 1f534c4: ebffeabf bl 1f4dfc8 + 1f534c8: e3500000 cmp r0, #0 + 1f534cc: ba000043 blt 1f535e0 + 1f534d0: e1a00006 mov r0, r6 + 1f534d4: e3a0300d mov r3, #13 + 1f534d8: e28d2010 add r2, sp, #16 + 1f534dc: e5951038 ldr r1, [r5, #56] ; 0x38 + 1f534e0: ebffeab8 bl 1f4dfc8 + 1f534e4: e350000d cmp r0, #13 + 1f534e8: 1a000020 bne 1f53570 + 1f534ec: e59d2010 ldr r2, [sp, #16] + 1f534f0: e3053355 movw r3, #21333 ; 0x5355 + 1f534f4: e3453342 movt r3, #21314 ; 0x5342 + 1f534f8: e1520003 cmp r2, r3 + 1f534fc: 1a00000c bne 1f53534 + 1f53500: e5953040 ldr r3, [r5, #64] ; 0x40 + 1f53504: e59d2014 ldr r2, [sp, #20] + 1f53508: e1520003 cmp r2, r3 + 1f5350c: 1a00001e bne 1f5358c + 1f53510: e5dd301c ldrb r3, [sp, #28] + 1f53514: e3530000 cmp r3, #0 + 1f53518: 1a00000b bne 1f5354c + 1f5351c: e59d3018 ldr r3, [sp, #24] + 1f53520: e3530000 cmp r3, #0 + 1f53524: 01a00004 moveq r0, r4 + 1f53528: 1a00001e bne 1f535a8 + 1f5352c: e28dd044 add sp, sp, #68 ; 0x44 + 1f53530: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f53534: e3032658 movw r2, #13912 ; 0x3658 + 1f53538: e34021f6 movt r2, #502 ; 0x1f6 + 1f5353c: e3030610 movw r0, #13840 ; 0x3610 + 1f53540: e34001f6 movt r0, #502 ; 0x1f6 + 1f53544: e3a01001 mov r1, #1 + 1f53548: ebfeb74e bl 1f01288 + 1f5354c: e30326ac movw r2, #13996 ; 0x36ac + 1f53550: e34021f6 movt r2, #502 ; 0x1f6 + 1f53554: e3030610 movw r0, #13840 ; 0x3610 + 1f53558: e34001f6 movt r0, #502 ; 0x1f6 + 1f5355c: e3a01001 mov r1, #1 + 1f53560: ebfeb748 bl 1f01288 + 1f53564: e3e00000 mvn r0, #0 + 1f53568: e28dd044 add sp, sp, #68 ; 0x44 + 1f5356c: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f53570: e3032644 movw r2, #13892 ; 0x3644 + 1f53574: e34021f6 movt r2, #502 ; 0x1f6 + 1f53578: e3030610 movw r0, #13840 ; 0x3610 + 1f5357c: e34001f6 movt r0, #502 ; 0x1f6 + 1f53580: e3a01001 mov r1, #1 + 1f53584: ebfeb73f bl 1f01288 + 1f53588: eaffffef b 1f5354c + 1f5358c: e3032670 movw r2, #13936 ; 0x3670 + 1f53590: e34021f6 movt r2, #502 ; 0x1f6 + 1f53594: e3030610 movw r0, #13840 ; 0x3610 + 1f53598: e34001f6 movt r0, #502 ; 0x1f6 + 1f5359c: e3a01001 mov r1, #1 + 1f535a0: ebfeb738 bl 1f01288 + 1f535a4: eaffffe8 b 1f5354c + 1f535a8: e3032684 movw r2, #13956 ; 0x3684 + 1f535ac: e34021f6 movt r2, #502 ; 0x1f6 + 1f535b0: e3030610 movw r0, #13840 ; 0x3610 + 1f535b4: e34001f6 movt r0, #502 ; 0x1f6 + 1f535b8: e3a01001 mov r1, #1 + 1f535bc: ebfeb731 bl 1f01288 + 1f535c0: eaffffe1 b 1f5354c + 1f535c4: e3032618 movw r2, #13848 ; 0x3618 + 1f535c8: e34021f6 movt r2, #502 ; 0x1f6 + 1f535cc: e3030610 movw r0, #13840 ; 0x3610 + 1f535d0: e34001f6 movt r0, #502 ; 0x1f6 + 1f535d4: e3a01001 mov r1, #1 + 1f535d8: ebfeb72a bl 1f01288 + 1f535dc: eaffffda b 1f5354c + 1f535e0: e303262c movw r2, #13868 ; 0x362c + 1f535e4: e34021f6 movt r2, #502 ; 0x1f6 + 1f535e8: e3030610 movw r0, #13840 ; 0x3610 + 1f535ec: e34001f6 movt r0, #502 ; 0x1f6 + 1f535f0: e3a01001 mov r1, #1 + 1f535f4: ebfeb723 bl 1f01288 + 1f535f8: eaffffd3 b 1f5354c + +01f535fc : + 1f535fc: e92d43f0 push {r4, r5, r6, r7, r8, r9, lr} + 1f53600: e1a04000 mov r4, r0 + 1f53604: e1a08002 mov r8, r2 + 1f53608: e24dd034 sub sp, sp, #52 ; 0x34 + 1f5360c: e1a09001 mov r9, r1 + 1f53610: e3a0201f mov r2, #31 + 1f53614: e3a01000 mov r1, #0 + 1f53618: e28d0010 add r0, sp, #16 + 1f5361c: e1a07003 mov r7, r3 + 1f53620: e59d6054 ldr r6, [sp, #84] ; 0x54 + 1f53624: e59d5050 ldr r5, [sp, #80] ; 0x50 + 1f53628: ebfffce5 bl 1f529c4 + 1f5362c: e5943040 ldr r3, [r4, #64] ; 0x40 + 1f53630: e3560000 cmp r6, #0 + 1f53634: e5dde01e ldrb lr, [sp, #30] + 1f53638: 13a00080 movne r0, #128 ; 0x80 + 1f5363c: e5ddc01d ldrb ip, [sp, #29] + 1f53640: 03a00000 moveq r0, #0 + 1f53644: e1a02008 mov r2, r8 + 1f53648: e1a01009 mov r1, r9 + 1f5364c: e2833001 add r3, r3, #1 + 1f53650: e5cd001c strb r0, [sp, #28] + 1f53654: e5843040 str r3, [r4, #64] ; 0x40 + 1f53658: e28d001f add r0, sp, #31 + 1f5365c: e7c4e018 bfi lr, r8, #0, #5 + 1f53660: e7c3c01f bfc ip, #0, #4 + 1f53664: e5cde01e strb lr, [sp, #30] + 1f53668: e5cdc01d strb ip, [sp, #29] + 1f5366c: e58d3014 str r3, [sp, #20] + 1f53670: e3053355 movw r3, #21333 ; 0x5355 + 1f53674: e3443342 movt r3, #17218 ; 0x4342 + 1f53678: e58d3010 str r3, [sp, #16] + 1f5367c: e58d5018 str r5, [sp, #24] + 1f53680: ebfffd2c bl 1f52b38 + 1f53684: e1a00004 mov r0, r4 + 1f53688: ebffefe5 bl 1f4f624 + 1f5368c: e28d2010 add r2, sp, #16 + 1f53690: e594103c ldr r1, [r4, #60] ; 0x3c + 1f53694: e3a0301f mov r3, #31 + 1f53698: e1a08000 mov r8, r0 + 1f5369c: ebffea49 bl 1f4dfc8 + 1f536a0: e3500000 cmp r0, #0 + 1f536a4: b3032618 movwlt r2, #13848 ; 0x3618 + 1f536a8: b34021f6 movtlt r2, #502 ; 0x1f6 + 1f536ac: ba00002e blt 1f5376c + 1f536b0: e3550000 cmp r5, #0 + 1f536b4: 0a00000b beq 1f536e8 + 1f536b8: e594c038 ldr ip, [r4, #56] ; 0x38 + 1f536bc: e3560000 cmp r6, #0 + 1f536c0: e1a02007 mov r2, r7 + 1f536c4: e1a03005 mov r3, r5 + 1f536c8: e594103c ldr r1, [r4, #60] ; 0x3c + 1f536cc: e1a00008 mov r0, r8 + 1f536d0: 11a0100c movne r1, ip + 1f536d4: ebffea3b bl 1f4dfc8 + 1f536d8: e2505000 subs r5, r0, #0 + 1f536dc: b303262c movwlt r2, #13868 ; 0x362c + 1f536e0: b34021f6 movtlt r2, #502 ; 0x1f6 + 1f536e4: ba000020 blt 1f5376c + 1f536e8: e1a0200d mov r2, sp + 1f536ec: e1a00008 mov r0, r8 + 1f536f0: e3a0300d mov r3, #13 + 1f536f4: e5941038 ldr r1, [r4, #56] ; 0x38 + 1f536f8: ebffea32 bl 1f4dfc8 + 1f536fc: e350000d cmp r0, #13 + 1f53700: 13032644 movwne r2, #13892 ; 0x3644 + 1f53704: 134021f6 movtne r2, #502 ; 0x1f6 + 1f53708: 1a000017 bne 1f5376c + 1f5370c: e59d2000 ldr r2, [sp] + 1f53710: e3053355 movw r3, #21333 ; 0x5355 + 1f53714: e3453342 movt r3, #21314 ; 0x5342 + 1f53718: e1520003 cmp r2, r3 + 1f5371c: 13032658 movwne r2, #13912 ; 0x3658 + 1f53720: 134021f6 movtne r2, #502 ; 0x1f6 + 1f53724: 1a000010 bne 1f5376c + 1f53728: e59d2004 ldr r2, [sp, #4] + 1f5372c: e5943040 ldr r3, [r4, #64] ; 0x40 + 1f53730: e1520003 cmp r2, r3 + 1f53734: 13032670 movwne r2, #13936 ; 0x3670 + 1f53738: 134021f6 movtne r2, #502 ; 0x1f6 + 1f5373c: 1a00000a bne 1f5376c + 1f53740: e5dd300c ldrb r3, [sp, #12] + 1f53744: e3530000 cmp r3, #0 + 1f53748: 1a00000b bne 1f5377c + 1f5374c: e59d3008 ldr r3, [sp, #8] + 1f53750: e3530000 cmp r3, #0 + 1f53754: 01a00005 moveq r0, r5 + 1f53758: 1a000001 bne 1f53764 + 1f5375c: e28dd034 add sp, sp, #52 ; 0x34 + 1f53760: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f53764: e3032684 movw r2, #13956 ; 0x3684 + 1f53768: e34021f6 movt r2, #502 ; 0x1f6 + 1f5376c: e3030610 movw r0, #13840 ; 0x3610 + 1f53770: e34001f6 movt r0, #502 ; 0x1f6 + 1f53774: e3a01001 mov r1, #1 + 1f53778: ebfeb6c2 bl 1f01288 + 1f5377c: e3e00000 mvn r0, #0 + 1f53780: e28dd034 add sp, sp, #52 ; 0x34 + 1f53784: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + +01f53788 : + 1f53788: e92d43f0 push {r4, r5, r6, r7, r8, r9, lr} + 1f5378c: e3a01002 mov r1, #2 + 1f53790: e1a04000 mov r4, r0 + 1f53794: e24dd064 sub sp, sp, #100 ; 0x64 + 1f53798: ebffefa7 bl 1f4f63c + 1f5379c: e3500000 cmp r0, #0 + 1f537a0: 0a000002 beq 1f537b0 + 1f537a4: e5d03004 ldrb r3, [r0, #4] + 1f537a8: e3530000 cmp r3, #0 + 1f537ac: 1a000007 bne 1f537d0 + 1f537b0: e3a05000 mov r5, #0 + 1f537b4: e1a00004 mov r0, r4 + 1f537b8: e3031610 movw r1, #13840 ; 0x3610 + 1f537bc: e34011f6 movt r1, #502 ; 0x1f6 + 1f537c0: ebffef9f bl 1f4f644 + 1f537c4: e1a00005 mov r0, r5 + 1f537c8: e28dd064 add sp, sp, #100 ; 0x64 + 1f537cc: e8bd83f0 pop {r4, r5, r6, r7, r8, r9, pc} + 1f537d0: e3a01004 mov r1, #4 + 1f537d4: e1a00004 mov r0, r4 + 1f537d8: ebffef97 bl 1f4f63c + 1f537dc: e3500000 cmp r0, #0 + 1f537e0: 0afffff2 beq 1f537b0 + 1f537e4: e5d03002 ldrb r3, [r0, #2] + 1f537e8: e3530000 cmp r3, #0 + 1f537ec: 1affffef bne 1f537b0 + 1f537f0: e5d03003 ldrb r3, [r0, #3] + 1f537f4: e3530000 cmp r3, #0 + 1f537f8: 1affffec bne 1f537b0 + 1f537fc: e5d03004 ldrb r3, [r0, #4] + 1f53800: e3530001 cmp r3, #1 + 1f53804: 9affffe9 bls 1f537b0 + 1f53808: e5d03005 ldrb r3, [r0, #5] + 1f5380c: e3530008 cmp r3, #8 + 1f53810: 1affffe6 bne 1f537b0 + 1f53814: e5d03006 ldrb r3, [r0, #6] + 1f53818: e3530006 cmp r3, #6 + 1f5381c: 1affffe3 bne 1f537b0 + 1f53820: e5d03007 ldrb r3, [r0, #7] + 1f53824: e3530050 cmp r3, #80 ; 0x50 + 1f53828: 1affffe0 bne 1f537b0 + 1f5382c: ea000003 b 1f53840 + 1f53830: e5d63003 ldrb r3, [r6, #3] + 1f53834: e203303f and r3, r3, #63 ; 0x3f + 1f53838: e3530002 cmp r3, #2 + 1f5383c: 0a00006d beq 1f539f8 + 1f53840: e3a01005 mov r1, #5 + 1f53844: e1a00004 mov r0, r4 + 1f53848: ebffef7b bl 1f4f63c + 1f5384c: e2506000 subs r6, r0, #0 + 1f53850: 1afffff6 bne 1f53830 + 1f53854: e5943038 ldr r3, [r4, #56] ; 0x38 + 1f53858: e1a00004 mov r0, r4 + 1f5385c: e3530000 cmp r3, #0 + 1f53860: 0a000081 beq 1f53a6c + 1f53864: e594303c ldr r3, [r4, #60] ; 0x3c + 1f53868: e3530000 cmp r3, #0 + 1f5386c: 0a00007e beq 1f53a6c + 1f53870: ebffedcb bl 1f4efa4 + 1f53874: e2505000 subs r5, r0, #0 + 1f53878: 0a00006b beq 1f53a2c + 1f5387c: e3a0c024 mov ip, #36 ; 0x24 + 1f53880: e3a05001 mov r5, #1 + 1f53884: e58dc000 str ip, [sp] + 1f53888: e28d303c add r3, sp, #60 ; 0x3c + 1f5388c: e58d5004 str r5, [sp, #4] + 1f53890: e3a02006 mov r2, #6 + 1f53894: e28d100c add r1, sp, #12 + 1f53898: e1a00004 mov r0, r4 + 1f5389c: e5cdc010 strb ip, [sp, #16] + 1f538a0: e3a0c012 mov ip, #18 + 1f538a4: e5cd600d strb r6, [sp, #13] + 1f538a8: e5cd600e strb r6, [sp, #14] + 1f538ac: e5cd600f strb r6, [sp, #15] + 1f538b0: e5cd6011 strb r6, [sp, #17] + 1f538b4: e5cdc00c strb ip, [sp, #12] + 1f538b8: ebffff4f bl 1f535fc + 1f538bc: e3500024 cmp r0, #36 ; 0x24 + 1f538c0: 1a00006e bne 1f53a80 + 1f538c4: e5dd303c ldrb r3, [sp, #60] ; 0x3c + 1f538c8: e213701f ands r7, r3, #31 + 1f538cc: 03a06063 moveq r6, #99 ; 0x63 + 1f538d0: 03a09003 moveq r9, #3 + 1f538d4: 0a000011 beq 1f53920 + 1f538d8: ea00007f b 1f53adc + 1f538dc: e5ddc01d ldrb ip, [sp, #29] + 1f538e0: e58d8004 str r8, [sp, #4] + 1f538e4: e58de000 str lr, [sp] + 1f538e8: e20cc0fe and ip, ip, #254 ; 0xfe + 1f538ec: e7c7c095 bfi ip, r5, #1, #7 + 1f538f0: e5cd901c strb r9, [sp, #28] + 1f538f4: e1cd71be strh r7, [sp, #30] + 1f538f8: e5cde020 strb lr, [sp, #32] + 1f538fc: e5cd7021 strb r7, [sp, #33] ; 0x21 + 1f53900: e5cdc01d strb ip, [sp, #29] + 1f53904: ebffff3c bl 1f535fc + 1f53908: e1500005 cmp r0, r5 + 1f5390c: e3a00064 mov r0, #100 ; 0x64 + 1f53910: ba000062 blt 1f53aa0 + 1f53914: ebfeb6a5 bl 1f013b0 + 1f53918: e2566001 subs r6, r6, #1 + 1f5391c: 0a000066 beq 1f53abc + 1f53920: e3a05000 mov r5, #0 + 1f53924: e3a02006 mov r2, #6 + 1f53928: e1a03005 mov r3, r5 + 1f5392c: e28d1014 add r1, sp, #20 + 1f53930: e58d7004 str r7, [sp, #4] + 1f53934: e1a00004 mov r0, r4 + 1f53938: e58d7000 str r7, [sp] + 1f5393c: e3a08001 mov r8, #1 + 1f53940: e5cd7014 strb r7, [sp, #20] + 1f53944: e5cd7015 strb r7, [sp, #21] + 1f53948: e5cd7016 strb r7, [sp, #22] + 1f5394c: e5cd7017 strb r7, [sp, #23] + 1f53950: e5cd7018 strb r7, [sp, #24] + 1f53954: e5cd7019 strb r7, [sp, #25] + 1f53958: ebffff27 bl 1f535fc + 1f5395c: e1500005 cmp r0, r5 + 1f53960: e3a0e012 mov lr, #18 + 1f53964: e28d3028 add r3, sp, #40 ; 0x28 + 1f53968: e3a02006 mov r2, #6 + 1f5396c: e28d101c add r1, sp, #28 + 1f53970: e1a00004 mov r0, r4 + 1f53974: baffffd8 blt 1f538dc + 1f53978: e5dde01d ldrb lr, [sp, #29] + 1f5397c: e3a02008 mov r2, #8 + 1f53980: e5ddc024 ldrb ip, [sp, #36] ; 0x24 + 1f53984: e28d3014 add r3, sp, #20 + 1f53988: e58d2000 str r2, [sp] + 1f5398c: e28d101c add r1, sp, #28 + 1f53990: e20ee0fe and lr, lr, #254 ; 0xfe + 1f53994: e3a06001 mov r6, #1 + 1f53998: e20cc0fe and ip, ip, #254 ; 0xfe + 1f5399c: e58d6004 str r6, [sp, #4] + 1f539a0: e3a0200a mov r2, #10 + 1f539a4: e1a00004 mov r0, r4 + 1f539a8: e7c7e095 bfi lr, r5, #1, #7 + 1f539ac: e7c7c095 bfi ip, r5, #1, #7 + 1f539b0: e1cd51be strh r5, [sp, #30] + 1f539b4: e5cdc024 strb ip, [sp, #36] ; 0x24 + 1f539b8: e3a0c025 mov ip, #37 ; 0x25 + 1f539bc: e1cd52b0 strh r5, [sp, #32] + 1f539c0: e1cd52b2 strh r5, [sp, #34] ; 0x22 + 1f539c4: e5cd5025 strb r5, [sp, #37] ; 0x25 + 1f539c8: e5cde01d strb lr, [sp, #29] + 1f539cc: e5cdc01c strb ip, [sp, #28] + 1f539d0: ebffff09 bl 1f535fc + 1f539d4: e3500008 cmp r0, #8 + 1f539d8: 0a000048 beq 1f53b00 + 1f539dc: e1a01006 mov r1, r6 + 1f539e0: e303270c movw r2, #14092 ; 0x370c + 1f539e4: e34021f6 movt r2, #502 ; 0x1f6 + 1f539e8: e3030610 movw r0, #13840 ; 0x3610 + 1f539ec: e34001f6 movt r0, #502 ; 0x1f6 + 1f539f0: ebfeb624 bl 1f01288 + 1f539f4: eaffff72 b 1f537c4 + 1f539f8: e1d630d2 ldrsb r3, [r6, #2] + 1f539fc: e3a00018 mov r0, #24 + 1f53a00: e3530000 cmp r3, #0 + 1f53a04: ba00000f blt 1f53a48 + 1f53a08: e594303c ldr r3, [r4, #60] ; 0x3c + 1f53a0c: e3530000 cmp r3, #0 + 1f53a10: 1affff66 bne 1f537b0 + 1f53a14: ebffaad3 bl 1f3e568 + 1f53a18: e1a02006 mov r2, r6 + 1f53a1c: e584003c str r0, [r4, #60] ; 0x3c + 1f53a20: e1a01004 mov r1, r4 + 1f53a24: ebffef15 bl 1f4f680 + 1f53a28: eaffff84 b 1f53840 + 1f53a2c: e303250c movw r2, #13580 ; 0x350c + 1f53a30: e34021f6 movt r2, #502 ; 0x1f6 + 1f53a34: e3030610 movw r0, #13840 ; 0x3610 + 1f53a38: e34001f6 movt r0, #502 ; 0x1f6 + 1f53a3c: e3a01001 mov r1, #1 + 1f53a40: ebfeb610 bl 1f01288 + 1f53a44: eaffff5e b 1f537c4 + 1f53a48: e5943038 ldr r3, [r4, #56] ; 0x38 + 1f53a4c: e3530000 cmp r3, #0 + 1f53a50: 1affff56 bne 1f537b0 + 1f53a54: ebffaac3 bl 1f3e568 + 1f53a58: e1a02006 mov r2, r6 + 1f53a5c: e5840038 str r0, [r4, #56] ; 0x38 + 1f53a60: e1a01004 mov r1, r4 + 1f53a64: ebffef05 bl 1f4f680 + 1f53a68: eaffff74 b 1f53840 + 1f53a6c: e3031610 movw r1, #13840 ; 0x3610 + 1f53a70: e34011f6 movt r1, #502 ; 0x1f6 + 1f53a74: ebffeef2 bl 1f4f644 + 1f53a78: e3a05000 mov r5, #0 + 1f53a7c: eaffff50 b 1f537c4 + 1f53a80: e1a01005 mov r1, r5 + 1f53a84: e30326bc movw r2, #14012 ; 0x36bc + 1f53a88: e34021f6 movt r2, #502 ; 0x1f6 + 1f53a8c: e3030610 movw r0, #13840 ; 0x3610 + 1f53a90: e34001f6 movt r0, #502 ; 0x1f6 + 1f53a94: e1a05006 mov r5, r6 + 1f53a98: ebfeb5fa bl 1f01288 + 1f53a9c: eaffff48 b 1f537c4 + 1f53aa0: e1a01008 mov r1, r8 + 1f53aa4: e30326f4 movw r2, #14068 ; 0x36f4 + 1f53aa8: e34021f6 movt r2, #502 ; 0x1f6 + 1f53aac: e3030610 movw r0, #13840 ; 0x3610 + 1f53ab0: e34001f6 movt r0, #502 ; 0x1f6 + 1f53ab4: ebfeb5f3 bl 1f01288 + 1f53ab8: eaffff41 b 1f537c4 + 1f53abc: e1a01008 mov r1, r8 + 1f53ac0: e3032774 movw r2, #14196 ; 0x3774 + 1f53ac4: e34021f6 movt r2, #502 ; 0x1f6 + 1f53ac8: e3030610 movw r0, #13840 ; 0x3610 + 1f53acc: e34001f6 movt r0, #502 ; 0x1f6 + 1f53ad0: e1a05006 mov r5, r6 + 1f53ad4: ebfeb5eb bl 1f01288 + 1f53ad8: eaffff39 b 1f537c4 + 1f53adc: e1a01005 mov r1, r5 + 1f53ae0: e1a03007 mov r3, r7 + 1f53ae4: e30326d4 movw r2, #14036 ; 0x36d4 + 1f53ae8: e34021f6 movt r2, #502 ; 0x1f6 + 1f53aec: e3030610 movw r0, #13840 ; 0x3610 + 1f53af0: e34001f6 movt r0, #502 ; 0x1f6 + 1f53af4: e1a05006 mov r5, r6 + 1f53af8: ebfeb5e2 bl 1f01288 + 1f53afc: eaffff30 b 1f537c4 + 1f53b00: e59d0018 ldr r0, [sp, #24] + 1f53b04: ebfffd58 bl 1f5306c + 1f53b08: e3500c02 cmp r0, #512 ; 0x200 + 1f53b0c: e1a03000 mov r3, r0 + 1f53b10: 0a000006 beq 1f53b30 + 1f53b14: e1a01006 mov r1, r6 + 1f53b18: e3032724 movw r2, #14116 ; 0x3724 + 1f53b1c: e34021f6 movt r2, #502 ; 0x1f6 + 1f53b20: e3030610 movw r0, #13840 ; 0x3610 + 1f53b24: e34001f6 movt r0, #502 ; 0x1f6 + 1f53b28: ebfeb5d6 bl 1f01288 + 1f53b2c: eaffff24 b 1f537c4 + 1f53b30: e59d0014 ldr r0, [sp, #20] + 1f53b34: ebfffd4c bl 1f5306c + 1f53b38: e3700001 cmn r0, #1 + 1f53b3c: e5840044 str r0, [r4, #68] ; 0x44 + 1f53b40: 0a000020 beq 1f53bc8 + 1f53b44: e2803001 add r3, r0, #1 + 1f53b48: e3a01004 mov r1, #4 + 1f53b4c: e5843044 str r3, [r4, #68] ; 0x44 + 1f53b50: e303275c movw r2, #14172 ; 0x375c + 1f53b54: e34021f6 movt r2, #502 ; 0x1f6 + 1f53b58: e1a035a3 lsr r3, r3, #11 + 1f53b5c: e3030610 movw r0, #13840 ; 0x3610 + 1f53b60: e34001f6 movt r0, #502 ; 0x1f6 + 1f53b64: ebfeb5c7 bl 1f01288 + 1f53b68: e28d0028 add r0, sp, #40 ; 0x28 + 1f53b6c: ebfff709 bl 1f51798 + 1f53b70: e3053c94 movw r3, #23700 ; 0x5c94 + 1f53b74: e34031f6 movt r3, #502 ; 0x1f6 + 1f53b78: e28d0028 add r0, sp, #40 ; 0x28 + 1f53b7c: e3031230 movw r1, #12848 ; 0x3230 + 1f53b80: e34011f6 movt r1, #502 ; 0x1f6 + 1f53b84: e5932000 ldr r2, [r3] + 1f53b88: e1a05006 mov r5, r6 + 1f53b8c: e282c001 add ip, r2, #1 + 1f53b90: e583c000 str ip, [r3] + 1f53b94: ebfffaf8 bl 1f5277c + 1f53b98: ebffefa6 bl 1f4fa38 + 1f53b9c: e1a07000 mov r7, r0 + 1f53ba0: e28d0028 add r0, sp, #40 ; 0x28 + 1f53ba4: ebfff716 bl 1f51804 + 1f53ba8: e1a03006 mov r3, r6 + 1f53bac: e1a01000 mov r1, r0 + 1f53bb0: e1a02004 mov r2, r4 + 1f53bb4: e1a00007 mov r0, r7 + 1f53bb8: ebffef74 bl 1f4f990 + 1f53bbc: e28d0028 add r0, sp, #40 ; 0x28 + 1f53bc0: ebfff705 bl 1f517dc <_String> + 1f53bc4: eafffefe b 1f537c4 + 1f53bc8: e1a01006 mov r1, r6 + 1f53bcc: e3032740 movw r2, #14144 ; 0x3740 + 1f53bd0: e34021f6 movt r2, #502 ; 0x1f6 + 1f53bd4: e3030610 movw r0, #13840 ; 0x3610 + 1f53bd8: e34001f6 movt r0, #502 ; 0x1f6 + 1f53bdc: ebfeb5a9 bl 1f01288 + 1f53be0: eafffef7 b 1f537c4 + +01f53be4 : + 1f53be4: e92d40f0 push {r4, r5, r6, r7, lr} + 1f53be8: e1a05000 mov r5, r0 + 1f53bec: e3a04000 mov r4, #0 + 1f53bf0: e24dd014 sub sp, sp, #20 + 1f53bf4: ebffee8a bl 1f4f624 + 1f53bf8: e1a06000 mov r6, r0 + 1f53bfc: e1a00005 mov r0, r5 + 1f53c00: ebffee85 bl 1f4f61c + 1f53c04: e3a02021 mov r2, #33 ; 0x21 + 1f53c08: e1a01000 mov r1, r0 + 1f53c0c: e58d400c str r4, [sp, #12] + 1f53c10: e58d4008 str r4, [sp, #8] + 1f53c14: e1a00006 mov r0, r6 + 1f53c18: e58d4004 str r4, [sp, #4] + 1f53c1c: e3a030ff mov r3, #255 ; 0xff + 1f53c20: e58d4000 str r4, [sp] + 1f53c24: ebffe8bf bl 1f4df28 + 1f53c28: e1500004 cmp r0, r4 + 1f53c2c: b3032788 movwlt r2, #14216 ; 0x3788 + 1f53c30: b34021f6 movtlt r2, #502 ; 0x1f6 + 1f53c34: ba000025 blt 1f53cd0 + 1f53c38: e3a07001 mov r7, #1 + 1f53c3c: e1a00005 mov r0, r5 + 1f53c40: ebffee75 bl 1f4f61c + 1f53c44: e58d400c str r4, [sp, #12] + 1f53c48: e1a01000 mov r1, r0 + 1f53c4c: e58d4008 str r4, [sp, #8] + 1f53c50: e58d4000 str r4, [sp] + 1f53c54: e1a03007 mov r3, r7 + 1f53c58: e58d7004 str r7, [sp, #4] + 1f53c5c: e3a02002 mov r2, #2 + 1f53c60: e1a00006 mov r0, r6 + 1f53c64: ebffe8af bl 1f4df28 + 1f53c68: e3500000 cmp r0, #0 + 1f53c6c: ba000015 blt 1f53cc8 + 1f53c70: e1a00005 mov r0, r5 + 1f53c74: ebffee68 bl 1f4f61c + 1f53c78: e3a02002 mov r2, #2 + 1f53c7c: e1a01000 mov r1, r0 + 1f53c80: e58d2004 str r2, [sp, #4] + 1f53c84: e58d400c str r4, [sp, #12] + 1f53c88: e1a03007 mov r3, r7 + 1f53c8c: e58d4008 str r4, [sp, #8] + 1f53c90: e1a00006 mov r0, r6 + 1f53c94: e58d4000 str r4, [sp] + 1f53c98: ebffe8a2 bl 1f4df28 + 1f53c9c: e3500000 cmp r0, #0 + 1f53ca0: b30327bc movwlt r2, #14268 ; 0x37bc + 1f53ca4: b34021f6 movtlt r2, #502 ; 0x1f6 + 1f53ca8: ba000008 blt 1f53cd0 + 1f53cac: e5950038 ldr r0, [r5, #56] ; 0x38 + 1f53cb0: ebffeee9 bl 1f4f85c + 1f53cb4: e595003c ldr r0, [r5, #60] ; 0x3c + 1f53cb8: ebffeee7 bl 1f4f85c + 1f53cbc: e1a00004 mov r0, r4 + 1f53cc0: e28dd014 add sp, sp, #20 + 1f53cc4: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f53cc8: e303279c movw r2, #14236 ; 0x379c + 1f53ccc: e34021f6 movt r2, #502 ; 0x1f6 + 1f53cd0: e3030610 movw r0, #13840 ; 0x3610 + 1f53cd4: e34001f6 movt r0, #502 ; 0x1f6 + 1f53cd8: e3a01004 mov r1, #4 + 1f53cdc: ebfeb569 bl 1f01288 + 1f53ce0: e3e00000 mvn r0, #0 + 1f53ce4: eafffff5 b 1f53cc0 + +01f53ce8 : + 1f53ce8: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f53cec: e7ef34d2 ubfx r3, r2, #9, #16 + 1f53cf0: e3059355 movw r9, #21333 ; 0x5355 + 1f53cf4: e3449342 movt r9, #17218 ; 0x4342 + 1f53cf8: e24dd04c sub sp, sp, #76 ; 0x4c + 1f53cfc: e305a355 movw sl, #21333 ; 0x5355 + 1f53d00: e345a342 movt sl, #21314 ; 0x5342 + 1f53d04: e1a08002 mov r8, r2 + 1f53d08: e1a04000 mov r4, r0 + 1f53d0c: e58d1004 str r1, [sp, #4] + 1f53d10: e7e85052 ubfx r5, r2, #0, #9 + 1f53d14: e58d3000 str r3, [sp] + 1f53d18: e3a0b004 mov fp, #4 + 1f53d1c: e1c404d8 ldrd r0, [r4, #72] ; 0x48 + 1f53d20: e30021ff movw r2, #511 ; 0x1ff + 1f53d24: e3a03000 mov r3, #0 + 1f53d28: e0033001 and r3, r3, r1 + 1f53d2c: e0022000 and r2, r2, r0 + 1f53d30: e1923003 orrs r3, r2, r3 + 1f53d34: e30071ff movw r7, #511 ; 0x1ff + 1f53d38: 13a03001 movne r3, #1 + 1f53d3c: 03a03000 moveq r3, #0 + 1f53d40: e3e06000 mvn r6, #0 + 1f53d44: e1510007 cmp r1, r7 + 1f53d48: 01500006 cmpeq r0, r6 + 1f53d4c: 83833001 orrhi r3, r3, #1 + 1f53d50: e3530000 cmp r3, #0 + 1f53d54: 1a00004f bne 1f53e98 + 1f53d58: e3550000 cmp r5, #0 + 1f53d5c: e1a004a0 lsr r0, r0, #9 + 1f53d60: e1800b81 orr r0, r0, r1, lsl #23 + 1f53d64: 1a00004b bne 1f53e98 + 1f53d68: e3a03028 mov r3, #40 ; 0x28 + 1f53d6c: e5cd500d strb r5, [sp, #13] + 1f53d70: e5cd300c strb r3, [sp, #12] + 1f53d74: ebfffcbc bl 1f5306c + 1f53d78: e58d000e str r0, [sp, #14] + 1f53d7c: e59d0000 ldr r0, [sp] + 1f53d80: e5cd5012 strb r5, [sp, #18] + 1f53d84: ebfffcb5 bl 1f53060 + 1f53d88: e3a0201f mov r2, #31 + 1f53d8c: e1cd01b3 strh r0, [sp, #19] + 1f53d90: e1a01005 mov r1, r5 + 1f53d94: e28d0028 add r0, sp, #40 ; 0x28 + 1f53d98: e5cd5015 strb r5, [sp, #21] + 1f53d9c: ebfffb08 bl 1f529c4 + 1f53da0: e5943040 ldr r3, [r4, #64] ; 0x40 + 1f53da4: e3a0100a mov r1, #10 + 1f53da8: e5ddc036 ldrb ip, [sp, #54] ; 0x36 + 1f53dac: e1a02001 mov r2, r1 + 1f53db0: e5dde035 ldrb lr, [sp, #53] ; 0x35 + 1f53db4: e2833001 add r3, r3, #1 + 1f53db8: e7c4c011 bfi ip, r1, #0, #5 + 1f53dbc: e5843040 str r3, [r4, #64] ; 0x40 + 1f53dc0: e28d100c add r1, sp, #12 + 1f53dc4: e28d0037 add r0, sp, #55 ; 0x37 + 1f53dc8: e7c3e015 bfi lr, r5, #0, #4 + 1f53dcc: e5cdc036 strb ip, [sp, #54] ; 0x36 + 1f53dd0: e5cde035 strb lr, [sp, #53] ; 0x35 + 1f53dd4: e58d302c str r3, [sp, #44] ; 0x2c + 1f53dd8: e3e0307f mvn r3, #127 ; 0x7f + 1f53ddc: e58d9028 str r9, [sp, #40] ; 0x28 + 1f53de0: e5cd3034 strb r3, [sp, #52] ; 0x34 + 1f53de4: e58d8030 str r8, [sp, #48] ; 0x30 + 1f53de8: ebfffb52 bl 1f52b38 + 1f53dec: e1a00004 mov r0, r4 + 1f53df0: ebffee0b bl 1f4f624 + 1f53df4: e28d2028 add r2, sp, #40 ; 0x28 + 1f53df8: e3a0301f mov r3, #31 + 1f53dfc: e594103c ldr r1, [r4, #60] ; 0x3c + 1f53e00: e1a06000 mov r6, r0 + 1f53e04: ebffe86f bl 1f4dfc8 + 1f53e08: e3500000 cmp r0, #0 + 1f53e0c: ba000050 blt 1f53f54 + 1f53e10: e3580000 cmp r8, #0 + 1f53e14: 0a00002a beq 1f53ec4 + 1f53e18: e1a03008 mov r3, r8 + 1f53e1c: e59d2004 ldr r2, [sp, #4] + 1f53e20: e5941038 ldr r1, [r4, #56] ; 0x38 + 1f53e24: e1a00006 mov r0, r6 + 1f53e28: ebffe866 bl 1f4dfc8 + 1f53e2c: e2507000 subs r7, r0, #0 + 1f53e30: ba00004e blt 1f53f70 + 1f53e34: e1a00006 mov r0, r6 + 1f53e38: e3a0300d mov r3, #13 + 1f53e3c: e28d2018 add r2, sp, #24 + 1f53e40: e5941038 ldr r1, [r4, #56] ; 0x38 + 1f53e44: ebffe85f bl 1f4dfc8 + 1f53e48: e350000d cmp r0, #13 + 1f53e4c: 1a00002b bne 1f53f00 + 1f53e50: e59d3018 ldr r3, [sp, #24] + 1f53e54: e153000a cmp r3, sl + 1f53e58: 1a00001b bne 1f53ecc + 1f53e5c: e59d201c ldr r2, [sp, #28] + 1f53e60: e5943040 ldr r3, [r4, #64] ; 0x40 + 1f53e64: e1520003 cmp r2, r3 + 1f53e68: 1a00002b bne 1f53f1c + 1f53e6c: e5dd3024 ldrb r3, [sp, #36] ; 0x24 + 1f53e70: e3530000 cmp r3, #0 + 1f53e74: 1a00001a bne 1f53ee4 + 1f53e78: e59d3020 ldr r3, [sp, #32] + 1f53e7c: e3530000 cmp r3, #0 + 1f53e80: 1a00002c bne 1f53f38 + 1f53e84: e1580007 cmp r8, r7 + 1f53e88: e1a00008 mov r0, r8 + 1f53e8c: 1a000014 bne 1f53ee4 + 1f53e90: e28dd04c add sp, sp, #76 ; 0x4c + 1f53e94: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f53e98: e3780001 cmn r8, #1 + 1f53e9c: 0a000005 beq 1f53eb8 + 1f53ea0: e1a00004 mov r0, r4 + 1f53ea4: ebffff4e bl 1f53be4 + 1f53ea8: e3500000 cmp r0, #0 + 1f53eac: 1afffff7 bne 1f53e90 + 1f53eb0: e25bb001 subs fp, fp, #1 + 1f53eb4: 1affff98 bne 1f53d1c + 1f53eb8: e3e00000 mvn r0, #0 + 1f53ebc: e28dd04c add sp, sp, #76 ; 0x4c + 1f53ec0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f53ec4: e1a07008 mov r7, r8 + 1f53ec8: eaffffd9 b 1f53e34 + 1f53ecc: e3032658 movw r2, #13912 ; 0x3658 + 1f53ed0: e34021f6 movt r2, #502 ; 0x1f6 + 1f53ed4: e3030610 movw r0, #13840 ; 0x3610 + 1f53ed8: e34001f6 movt r0, #502 ; 0x1f6 + 1f53edc: e3a01001 mov r1, #1 + 1f53ee0: ebfeb4e8 bl 1f01288 + 1f53ee4: e303269c movw r2, #13980 ; 0x369c + 1f53ee8: e34021f6 movt r2, #502 ; 0x1f6 + 1f53eec: e3030610 movw r0, #13840 ; 0x3610 + 1f53ef0: e34001f6 movt r0, #502 ; 0x1f6 + 1f53ef4: e3a01001 mov r1, #1 + 1f53ef8: ebfeb4e2 bl 1f01288 + 1f53efc: eaffffe7 b 1f53ea0 + 1f53f00: e3032644 movw r2, #13892 ; 0x3644 + 1f53f04: e34021f6 movt r2, #502 ; 0x1f6 + 1f53f08: e3030610 movw r0, #13840 ; 0x3610 + 1f53f0c: e34001f6 movt r0, #502 ; 0x1f6 + 1f53f10: e3a01001 mov r1, #1 + 1f53f14: ebfeb4db bl 1f01288 + 1f53f18: eafffff1 b 1f53ee4 + 1f53f1c: e3032670 movw r2, #13936 ; 0x3670 + 1f53f20: e34021f6 movt r2, #502 ; 0x1f6 + 1f53f24: e3030610 movw r0, #13840 ; 0x3610 + 1f53f28: e34001f6 movt r0, #502 ; 0x1f6 + 1f53f2c: e3a01001 mov r1, #1 + 1f53f30: ebfeb4d4 bl 1f01288 + 1f53f34: eaffffea b 1f53ee4 + 1f53f38: e3032684 movw r2, #13956 ; 0x3684 + 1f53f3c: e34021f6 movt r2, #502 ; 0x1f6 + 1f53f40: e3030610 movw r0, #13840 ; 0x3610 + 1f53f44: e34001f6 movt r0, #502 ; 0x1f6 + 1f53f48: e3a01001 mov r1, #1 + 1f53f4c: ebfeb4cd bl 1f01288 + 1f53f50: eaffffe3 b 1f53ee4 + 1f53f54: e3032618 movw r2, #13848 ; 0x3618 + 1f53f58: e34021f6 movt r2, #502 ; 0x1f6 + 1f53f5c: e3030610 movw r0, #13840 ; 0x3610 + 1f53f60: e34001f6 movt r0, #502 ; 0x1f6 + 1f53f64: e3a01001 mov r1, #1 + 1f53f68: ebfeb4c6 bl 1f01288 + 1f53f6c: eaffffdc b 1f53ee4 + 1f53f70: e303262c movw r2, #13868 ; 0x362c + 1f53f74: e34021f6 movt r2, #502 ; 0x1f6 + 1f53f78: e3030610 movw r0, #13840 ; 0x3610 + 1f53f7c: e34001f6 movt r0, #502 ; 0x1f6 + 1f53f80: e3a01001 mov r1, #1 + 1f53f84: ebfeb4bf bl 1f01288 + 1f53f88: eaffffd5 b 1f53ee4 + +01f53f8c : + 1f53f8c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f53f90: e7ef34d2 ubfx r3, r2, #9, #16 + 1f53f94: e3059355 movw r9, #21333 ; 0x5355 + 1f53f98: e3449342 movt r9, #17218 ; 0x4342 + 1f53f9c: e24dd04c sub sp, sp, #76 ; 0x4c + 1f53fa0: e305a355 movw sl, #21333 ; 0x5355 + 1f53fa4: e345a342 movt sl, #21314 ; 0x5342 + 1f53fa8: e1a08002 mov r8, r2 + 1f53fac: e1a04000 mov r4, r0 + 1f53fb0: e58d1004 str r1, [sp, #4] + 1f53fb4: e7e85052 ubfx r5, r2, #0, #9 + 1f53fb8: e58d3000 str r3, [sp] + 1f53fbc: e3a0b004 mov fp, #4 + 1f53fc0: e1c404d8 ldrd r0, [r4, #72] ; 0x48 + 1f53fc4: e30021ff movw r2, #511 ; 0x1ff + 1f53fc8: e3a03000 mov r3, #0 + 1f53fcc: e0033001 and r3, r3, r1 + 1f53fd0: e0022000 and r2, r2, r0 + 1f53fd4: e1923003 orrs r3, r2, r3 + 1f53fd8: e30071ff movw r7, #511 ; 0x1ff + 1f53fdc: 13a03001 movne r3, #1 + 1f53fe0: 03a03000 moveq r3, #0 + 1f53fe4: e3e06000 mvn r6, #0 + 1f53fe8: e1510007 cmp r1, r7 + 1f53fec: 01500006 cmpeq r0, r6 + 1f53ff0: 83833001 orrhi r3, r3, #1 + 1f53ff4: e3530000 cmp r3, #0 + 1f53ff8: 1a000070 bne 1f541c0 + 1f53ffc: e3550000 cmp r5, #0 + 1f54000: e1a004a0 lsr r0, r0, #9 + 1f54004: e1800b81 orr r0, r0, r1, lsl #23 + 1f54008: 1a00006c bne 1f541c0 + 1f5400c: e3a03008 mov r3, #8 + 1f54010: e3a0202a mov r2, #42 ; 0x2a + 1f54014: e5cd300d strb r3, [sp, #13] + 1f54018: e5cd200c strb r2, [sp, #12] + 1f5401c: ebfffc12 bl 1f5306c + 1f54020: e58d000e str r0, [sp, #14] + 1f54024: e59d0000 ldr r0, [sp] + 1f54028: e5cd5012 strb r5, [sp, #18] + 1f5402c: ebfffc0b bl 1f53060 + 1f54030: e3a0201f mov r2, #31 + 1f54034: e1cd01b3 strh r0, [sp, #19] + 1f54038: e1a01005 mov r1, r5 + 1f5403c: e28d0028 add r0, sp, #40 ; 0x28 + 1f54040: e5cd5015 strb r5, [sp, #21] + 1f54044: ebfffa5e bl 1f529c4 + 1f54048: e5943040 ldr r3, [r4, #64] ; 0x40 + 1f5404c: e3a0100a mov r1, #10 + 1f54050: e5ddc036 ldrb ip, [sp, #54] ; 0x36 + 1f54054: e1a02001 mov r2, r1 + 1f54058: e5dde035 ldrb lr, [sp, #53] ; 0x35 + 1f5405c: e2833001 add r3, r3, #1 + 1f54060: e7c4c011 bfi ip, r1, #0, #5 + 1f54064: e5843040 str r3, [r4, #64] ; 0x40 + 1f54068: e28d100c add r1, sp, #12 + 1f5406c: e28d0037 add r0, sp, #55 ; 0x37 + 1f54070: e7c3e015 bfi lr, r5, #0, #4 + 1f54074: e58d302c str r3, [sp, #44] ; 0x2c + 1f54078: e5cde035 strb lr, [sp, #53] ; 0x35 + 1f5407c: e5cdc036 strb ip, [sp, #54] ; 0x36 + 1f54080: e58d9028 str r9, [sp, #40] ; 0x28 + 1f54084: e58d8030 str r8, [sp, #48] ; 0x30 + 1f54088: e5cd5034 strb r5, [sp, #52] ; 0x34 + 1f5408c: ebfffaa9 bl 1f52b38 + 1f54090: e1a00004 mov r0, r4 + 1f54094: ebffed62 bl 1f4f624 + 1f54098: e28d2028 add r2, sp, #40 ; 0x28 + 1f5409c: e3a0301f mov r3, #31 + 1f540a0: e594103c ldr r1, [r4, #60] ; 0x3c + 1f540a4: e1a06000 mov r6, r0 + 1f540a8: ebffe7c6 bl 1f4dfc8 + 1f540ac: e3500000 cmp r0, #0 + 1f540b0: ba00004c blt 1f541e8 + 1f540b4: e3580000 cmp r8, #0 + 1f540b8: 0a000006 beq 1f540d8 + 1f540bc: e1a03008 mov r3, r8 + 1f540c0: e59d2004 ldr r2, [sp, #4] + 1f540c4: e594103c ldr r1, [r4, #60] ; 0x3c + 1f540c8: e1a00006 mov r0, r6 + 1f540cc: ebffe7bd bl 1f4dfc8 + 1f540d0: e3500000 cmp r0, #0 + 1f540d4: ba00004a blt 1f54204 + 1f540d8: e1a00006 mov r0, r6 + 1f540dc: e3a0300d mov r3, #13 + 1f540e0: e28d2018 add r2, sp, #24 + 1f540e4: e5941038 ldr r1, [r4, #56] ; 0x38 + 1f540e8: ebffe7b6 bl 1f4dfc8 + 1f540ec: e350000d cmp r0, #13 + 1f540f0: 1a000024 bne 1f54188 + 1f540f4: e59d3018 ldr r3, [sp, #24] + 1f540f8: e153000a cmp r3, sl + 1f540fc: 1a00000c bne 1f54134 + 1f54100: e59d201c ldr r2, [sp, #28] + 1f54104: e5943040 ldr r3, [r4, #64] ; 0x40 + 1f54108: e1520003 cmp r2, r3 + 1f5410c: 1a000024 bne 1f541a4 + 1f54110: e5dd3024 ldrb r3, [sp, #36] ; 0x24 + 1f54114: e3530000 cmp r3, #0 + 1f54118: 1a00000b bne 1f5414c + 1f5411c: e59d3020 ldr r3, [sp, #32] + 1f54120: e3530000 cmp r3, #0 + 1f54124: 1a000028 bne 1f541cc + 1f54128: e1a00008 mov r0, r8 + 1f5412c: e28dd04c add sp, sp, #76 ; 0x4c + 1f54130: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f54134: e3032658 movw r2, #13912 ; 0x3658 + 1f54138: e34021f6 movt r2, #502 ; 0x1f6 + 1f5413c: e3030610 movw r0, #13840 ; 0x3610 + 1f54140: e34001f6 movt r0, #502 ; 0x1f6 + 1f54144: e3a01001 mov r1, #1 + 1f54148: ebfeb44e bl 1f01288 + 1f5414c: e30326ac movw r2, #13996 ; 0x36ac + 1f54150: e34021f6 movt r2, #502 ; 0x1f6 + 1f54154: e3030610 movw r0, #13840 ; 0x3610 + 1f54158: e34001f6 movt r0, #502 ; 0x1f6 + 1f5415c: e3a01001 mov r1, #1 + 1f54160: ebfeb448 bl 1f01288 + 1f54164: e1a00004 mov r0, r4 + 1f54168: ebfffe9d bl 1f53be4 + 1f5416c: e3500000 cmp r0, #0 + 1f54170: 1affffed bne 1f5412c + 1f54174: e25bb001 subs fp, fp, #1 + 1f54178: 1affff90 bne 1f53fc0 + 1f5417c: e3e00000 mvn r0, #0 + 1f54180: e28dd04c add sp, sp, #76 ; 0x4c + 1f54184: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f54188: e3032644 movw r2, #13892 ; 0x3644 + 1f5418c: e34021f6 movt r2, #502 ; 0x1f6 + 1f54190: e3030610 movw r0, #13840 ; 0x3610 + 1f54194: e34001f6 movt r0, #502 ; 0x1f6 + 1f54198: e3a01001 mov r1, #1 + 1f5419c: ebfeb439 bl 1f01288 + 1f541a0: eaffffe9 b 1f5414c + 1f541a4: e3032670 movw r2, #13936 ; 0x3670 + 1f541a8: e34021f6 movt r2, #502 ; 0x1f6 + 1f541ac: e3030610 movw r0, #13840 ; 0x3610 + 1f541b0: e34001f6 movt r0, #502 ; 0x1f6 + 1f541b4: e3a01001 mov r1, #1 + 1f541b8: ebfeb432 bl 1f01288 + 1f541bc: eaffffe2 b 1f5414c + 1f541c0: e3780001 cmn r8, #1 + 1f541c4: 1affffe6 bne 1f54164 + 1f541c8: eaffffeb b 1f5417c + 1f541cc: e3032684 movw r2, #13956 ; 0x3684 + 1f541d0: e34021f6 movt r2, #502 ; 0x1f6 + 1f541d4: e3030610 movw r0, #13840 ; 0x3610 + 1f541d8: e34001f6 movt r0, #502 ; 0x1f6 + 1f541dc: e3a01001 mov r1, #1 + 1f541e0: ebfeb428 bl 1f01288 + 1f541e4: eaffffd8 b 1f5414c + 1f541e8: e3032618 movw r2, #13848 ; 0x3618 + 1f541ec: e34021f6 movt r2, #502 ; 0x1f6 + 1f541f0: e3030610 movw r0, #13840 ; 0x3610 + 1f541f4: e34001f6 movt r0, #502 ; 0x1f6 + 1f541f8: e3a01001 mov r1, #1 + 1f541fc: ebfeb421 bl 1f01288 + 1f54200: eaffffd1 b 1f5414c + 1f54204: e303262c movw r2, #13868 ; 0x362c + 1f54208: e34021f6 movt r2, #502 ; 0x1f6 + 1f5420c: e3030610 movw r0, #13840 ; 0x3610 + 1f54210: e34001f6 movt r0, #502 ; 0x1f6 + 1f54214: e3a01001 mov r1, #1 + 1f54218: ebfeb41a bl 1f01288 + 1f5421c: eaffffca b 1f5414c + +01f54220 <_DWHCIFrameSchedulerNonPeriodic>: + 1f54220: e3a03006 mov r3, #6 + 1f54224: e5803018 str r3, [r0, #24] + 1f54228: e12fff1e bx lr + +01f5422c : + 1f5422c: e3a03000 mov r3, #0 + 1f54230: e5803018 str r3, [r0, #24] + 1f54234: e12fff1e bx lr + +01f54238 : + 1f54238: e12fff1e bx lr + +01f5423c : + 1f5423c: e3a00000 mov r0, #0 + 1f54240: e12fff1e bx lr + +01f54244 : + 1f54244: e5903018 ldr r3, [r0, #24] + 1f54248: e3530001 cmp r3, #1 + 1f5424c: 0a00000b beq 1f54280 + 1f54250: 3a000007 bcc 1f54274 + 1f54254: e3530003 cmp r3, #3 + 1f54258: 8a000005 bhi 1f54274 + 1f5425c: e92d4010 push {r4, lr} + 1f54260: e3000271 movw r0, #625 ; 0x271 + 1f54264: ebfeb444 bl 1f0137c + 1f54268: e3a03001 mov r3, #1 + 1f5426c: e1a00003 mov r0, r3 + 1f54270: e8bd8010 pop {r4, pc} + 1f54274: e3a03000 mov r3, #0 + 1f54278: e1a00003 mov r0, r3 + 1f5427c: e12fff1e bx lr + 1f54280: e3a01002 mov r1, #2 + 1f54284: e3a02003 mov r2, #3 + 1f54288: e5801018 str r1, [r0, #24] + 1f5428c: e580201c str r2, [r0, #28] + 1f54290: e1a00003 mov r0, r3 + 1f54294: e12fff1e bx lr + +01f54298 : + 1f54298: e5902018 ldr r2, [r0, #24] + 1f5429c: e3520000 cmp r2, #0 + 1f542a0: 0a000010 beq 1f542e8 + 1f542a4: e2422002 sub r2, r2, #2 + 1f542a8: e3520001 cmp r2, #1 + 1f542ac: 812fff1e bxhi lr + 1f542b0: e3110001 tst r1, #1 + 1f542b4: 1a000016 bne 1f54314 + 1f542b8: e3110060 tst r1, #96 ; 0x60 + 1f542bc: 1a00000c bne 1f542f4 + 1f542c0: e3110010 tst r1, #16 + 1f542c4: 0a000015 beq 1f54320 + 1f542c8: e590301c ldr r3, [r0, #28] + 1f542cc: e3530000 cmp r3, #0 + 1f542d0: e2433001 sub r3, r3, #1 + 1f542d4: e580301c str r3, [r0, #28] + 1f542d8: 0a000017 beq 1f5433c + 1f542dc: e3a03003 mov r3, #3 + 1f542e0: e5803018 str r3, [r0, #24] + 1f542e4: e12fff1e bx lr + 1f542e8: e3a03001 mov r3, #1 + 1f542ec: e5803018 str r3, [r0, #24] + 1f542f0: e12fff1e bx lr + 1f542f4: e590301c ldr r3, [r0, #28] + 1f542f8: e3530000 cmp r3, #0 + 1f542fc: e2433001 sub r3, r3, #1 + 1f54300: e580301c str r3, [r0, #28] + 1f54304: 1afffff4 bne 1f542dc + 1f54308: e3a03005 mov r3, #5 + 1f5430c: e5803018 str r3, [r0, #24] + 1f54310: e12fff1e bx lr + 1f54314: e3a03004 mov r3, #4 + 1f54318: e5803018 str r3, [r0, #24] + 1f5431c: e12fff1e bx lr + 1f54320: e1a03001 mov r3, r1 + 1f54324: e30327dc movw r2, #14300 ; 0x37dc + 1f54328: e34021f6 movt r2, #502 ; 0x1f6 + 1f5432c: e30307f0 movw r0, #14320 ; 0x37f0 + 1f54330: e34001f6 movt r0, #502 ; 0x1f6 + 1f54334: e3a01001 mov r1, #1 + 1f54338: eafeb3d2 b 1f01288 + 1f5433c: e92d4010 push {r4, lr} + 1f54340: e1a04000 mov r4, r0 + 1f54344: e3000271 movw r0, #625 ; 0x271 + 1f54348: ebfeb40b bl 1f0137c + 1f5434c: e3a03005 mov r3, #5 + 1f54350: e5843018 str r3, [r4, #24] + 1f54354: e8bd8010 pop {r4, pc} + +01f54358 : + 1f54358: e3042220 movw r2, #16928 ; 0x4220 + 1f5435c: e34021f5 movt r2, #501 ; 0x1f5 + 1f54360: e304322c movw r3, #16940 ; 0x422c + 1f54364: e34031f5 movt r3, #501 ; 0x1f5 + 1f54368: e5802000 str r2, [r0] + 1f5436c: e3042244 movw r2, #16964 ; 0x4244 + 1f54370: e34021f5 movt r2, #501 ; 0x1f5 + 1f54374: e5802008 str r2, [r0, #8] + 1f54378: e5803004 str r3, [r0, #4] + 1f5437c: e3042238 movw r2, #16952 ; 0x4238 + 1f54380: e34021f5 movt r2, #501 ; 0x1f5 + 1f54384: e5802010 str r2, [r0, #16] + 1f54388: e3043298 movw r3, #17048 ; 0x4298 + 1f5438c: e34031f5 movt r3, #501 ; 0x1f5 + 1f54390: e3a02006 mov r2, #6 + 1f54394: e580300c str r3, [r0, #12] + 1f54398: e5802018 str r2, [r0, #24] + 1f5439c: e304323c movw r3, #16956 ; 0x423c + 1f543a0: e34031f5 movt r3, #501 ; 0x1f5 + 1f543a4: e5803014 str r3, [r0, #20] + 1f543a8: e12fff1e bx lr + +01f543ac <_DWHCIFrameSchedulerPeriodic>: + 1f543ac: e3a03006 mov r3, #6 + 1f543b0: e5803018 str r3, [r0, #24] + 1f543b4: e12fff1e bx lr + +01f543b8 : + 1f543b8: e3a02000 mov r2, #0 + 1f543bc: e3a03008 mov r3, #8 + 1f543c0: e5802018 str r2, [r0, #24] + 1f543c4: e5803020 str r3, [r0, #32] + 1f543c8: e12fff1e bx lr + +01f543cc : + 1f543cc: e5900020 ldr r0, [r0, #32] + 1f543d0: e2000001 and r0, r0, #1 + 1f543d4: e12fff1e bx lr + +01f543d8 : + 1f543d8: e92d4010 push {r4, lr} + 1f543dc: e1a04000 mov r4, r0 + 1f543e0: e3001408 movw r1, #1032 ; 0x408 + 1f543e4: e3431f98 movt r1, #16280 ; 0x3f98 + 1f543e8: e24dd010 sub sp, sp, #16 + 1f543ec: e28d0004 add r0, sp, #4 + 1f543f0: ebffe980 bl 1f4e9f8 + 1f543f4: e5943020 ldr r3, [r4, #32] + 1f543f8: e3530008 cmp r3, #8 + 1f543fc: 0a000009 beq 1f54428 + 1f54400: e28d0004 add r0, sp, #4 + 1f54404: ebffe986 bl 1f4ea24 + 1f54408: e5943020 ldr r3, [r4, #32] + 1f5440c: e2000007 and r0, r0, #7 + 1f54410: e1500003 cmp r0, r3 + 1f54414: 1afffff9 bne 1f54400 + 1f54418: e28d0004 add r0, sp, #4 + 1f5441c: ebffe97d bl 1f4ea18 <_DWHCIRegister> + 1f54420: e28dd010 add sp, sp, #16 + 1f54424: e8bd8010 pop {r4, pc} + 1f54428: e28d0004 add r0, sp, #4 + 1f5442c: ebffe97c bl 1f4ea24 + 1f54430: e2800001 add r0, r0, #1 + 1f54434: e2003007 and r3, r0, #7 + 1f54438: e3530006 cmp r3, #6 + 1f5443c: 03a03007 moveq r3, #7 + 1f54440: e5843020 str r3, [r4, #32] + 1f54444: eaffffed b 1f54400 + +01f54448 : + 1f54448: e5903018 ldr r3, [r0, #24] + 1f5444c: e3530001 cmp r3, #1 + 1f54450: 0a00000b beq 1f54484 + 1f54454: e3530003 cmp r3, #3 + 1f54458: 0a000002 beq 1f54468 + 1f5445c: e3a03000 mov r3, #0 + 1f54460: e1a00003 mov r0, r3 + 1f54464: e12fff1e bx lr + 1f54468: e5902020 ldr r2, [r0, #32] + 1f5446c: e3a03001 mov r3, #1 + 1f54470: e0822003 add r2, r2, r3 + 1f54474: e2022007 and r2, r2, #7 + 1f54478: e5802020 str r2, [r0, #32] + 1f5447c: e1a00003 mov r0, r3 + 1f54480: e12fff1e bx lr + 1f54484: e5902020 ldr r2, [r0, #32] + 1f54488: e3a01002 mov r1, #2 + 1f5448c: e5801018 str r1, [r0, #24] + 1f54490: e3520005 cmp r2, #5 + 1f54494: e0822001 add r2, r2, r1 + 1f54498: e2022007 and r2, r2, #7 + 1f5449c: 13a01003 movne r1, #3 + 1f544a0: e5802020 str r2, [r0, #32] + 1f544a4: e580101c str r1, [r0, #28] + 1f544a8: e1a00003 mov r0, r3 + 1f544ac: e12fff1e bx lr + +01f544b0 : + 1f544b0: e5902018 ldr r2, [r0, #24] + 1f544b4: e1a0c000 mov ip, r0 + 1f544b8: e3520000 cmp r2, #0 + 1f544bc: 0a00000e beq 1f544fc + 1f544c0: e2422002 sub r2, r2, #2 + 1f544c4: e3520001 cmp r2, #1 + 1f544c8: 812fff1e bxhi lr + 1f544cc: e3110001 tst r1, #1 + 1f544d0: 1a000015 bne 1f5452c + 1f544d4: e3110060 tst r1, #96 ; 0x60 + 1f544d8: 0a00000a beq 1f54508 + 1f544dc: e590301c ldr r3, [r0, #28] + 1f544e0: e3530000 cmp r3, #0 + 1f544e4: e2433001 sub r3, r3, #1 + 1f544e8: e580301c str r3, [r0, #28] + 1f544ec: 0a000018 beq 1f54554 + 1f544f0: e3a03003 mov r3, #3 + 1f544f4: e5803018 str r3, [r0, #24] + 1f544f8: e12fff1e bx lr + 1f544fc: e3a03001 mov r3, #1 + 1f54500: e5803018 str r3, [r0, #24] + 1f54504: e12fff1e bx lr + 1f54508: e3110010 tst r1, #16 + 1f5450c: 1a000009 bne 1f54538 + 1f54510: e1a03001 mov r3, r1 + 1f54514: e30327dc movw r2, #14300 ; 0x37dc + 1f54518: e34021f6 movt r2, #502 ; 0x1f6 + 1f5451c: e30307f0 movw r0, #14320 ; 0x37f0 + 1f54520: e34001f6 movt r0, #502 ; 0x1f6 + 1f54524: e3a01001 mov r1, #1 + 1f54528: eafeb356 b 1f01288 + 1f5452c: e3a03004 mov r3, #4 + 1f54530: e5803018 str r3, [r0, #24] + 1f54534: e12fff1e bx lr + 1f54538: e92d4010 push {r4, lr} + 1f5453c: e1a04000 mov r4, r0 + 1f54540: e3000271 movw r0, #625 ; 0x271 + 1f54544: ebfeb38c bl 1f0137c + 1f54548: e3a03005 mov r3, #5 + 1f5454c: e5843018 str r3, [r4, #24] + 1f54550: e8bd8010 pop {r4, pc} + 1f54554: e3a03005 mov r3, #5 + 1f54558: e3a00ffa mov r0, #1000 ; 0x3e8 + 1f5455c: e58c3018 str r3, [ip, #24] + 1f54560: eafeb385 b 1f0137c + +01f54564 : + 1f54564: e30423ac movw r2, #17324 ; 0x43ac + 1f54568: e34021f5 movt r2, #501 ; 0x1f5 + 1f5456c: e30433b8 movw r3, #17336 ; 0x43b8 + 1f54570: e34031f5 movt r3, #501 ; 0x1f5 + 1f54574: e5802000 str r2, [r0] + 1f54578: e3042448 movw r2, #17480 ; 0x4448 + 1f5457c: e34021f5 movt r2, #501 ; 0x1f5 + 1f54580: e5802008 str r2, [r0, #8] + 1f54584: e5803004 str r3, [r0, #4] + 1f54588: e30423d8 movw r2, #17368 ; 0x43d8 + 1f5458c: e34021f5 movt r2, #501 ; 0x1f5 + 1f54590: e5802010 str r2, [r0, #16] + 1f54594: e30434b0 movw r3, #17584 ; 0x44b0 + 1f54598: e34031f5 movt r3, #501 ; 0x1f5 + 1f5459c: e3a02006 mov r2, #6 + 1f545a0: e580300c str r3, [r0, #12] + 1f545a4: e5802018 str r2, [r0, #24] + 1f545a8: e30433cc movw r3, #17356 ; 0x43cc + 1f545ac: e34031f5 movt r3, #501 ; 0x1f5 + 1f545b0: e5803014 str r3, [r0, #20] + 1f545b4: e3a03008 mov r3, #8 + 1f545b8: e5803020 str r3, [r0, #32] + 1f545bc: e12fff1e bx lr + +01f545c0 : + 1f545c0: e92d4070 push {r4, r5, r6, lr} + 1f545c4: e3a01002 mov r1, #2 + 1f545c8: e1a04000 mov r4, r0 + 1f545cc: e24dd020 sub sp, sp, #32 + 1f545d0: ebffec19 bl 1f4f63c + 1f545d4: e3500000 cmp r0, #0 + 1f545d8: 0a000084 beq 1f547f0 + 1f545dc: e5d03004 ldrb r3, [r0, #4] + 1f545e0: e3530000 cmp r3, #0 + 1f545e4: 0a000081 beq 1f547f0 + 1f545e8: e3a01004 mov r1, #4 + 1f545ec: e1a00004 mov r0, r4 + 1f545f0: ebffec11 bl 1f4f63c + 1f545f4: e2503000 subs r3, r0, #0 + 1f545f8: 0a000021 beq 1f54684 + 1f545fc: e5d32004 ldrb r2, [r3, #4] + 1f54600: e3520000 cmp r2, #0 + 1f54604: 0afffff7 beq 1f545e8 + 1f54608: e5d32005 ldrb r2, [r3, #5] + 1f5460c: e3520003 cmp r2, #3 + 1f54610: 1afffff4 bne 1f545e8 + 1f54614: e5d32006 ldrb r2, [r3, #6] + 1f54618: e3520001 cmp r2, #1 + 1f5461c: 1afffff1 bne 1f545e8 + 1f54620: e5d32007 ldrb r2, [r3, #7] + 1f54624: e3520001 cmp r2, #1 + 1f54628: 1affffee bne 1f545e8 + 1f5462c: e5d32002 ldrb r2, [r3, #2] + 1f54630: e3a01005 mov r1, #5 + 1f54634: e5c42038 strb r2, [r4, #56] ; 0x38 + 1f54638: e1a00004 mov r0, r4 + 1f5463c: e5d33003 ldrb r3, [r3, #3] + 1f54640: e5c43039 strb r3, [r4, #57] ; 0x39 + 1f54644: ebffebfc bl 1f4f63c + 1f54648: e2505000 subs r5, r0, #0 + 1f5464c: 0affffe5 beq 1f545e8 + 1f54650: e1d530d2 ldrsb r3, [r5, #2] + 1f54654: e3530000 cmp r3, #0 + 1f54658: aaffffe2 bge 1f545e8 + 1f5465c: e5d53003 ldrb r3, [r5, #3] + 1f54660: e203303f and r3, r3, #63 ; 0x3f + 1f54664: e3530003 cmp r3, #3 + 1f54668: 1affffde bne 1f545e8 + 1f5466c: e3a00018 mov r0, #24 + 1f54670: ebffa7bc bl 1f3e568 + 1f54674: e1a02005 mov r2, r5 + 1f54678: e584003c str r0, [r4, #60] ; 0x3c + 1f5467c: e1a01004 mov r1, r4 + 1f54680: ebffebfe bl 1f4f680 + 1f54684: e594503c ldr r5, [r4, #60] ; 0x3c + 1f54688: e1a00004 mov r0, r4 + 1f5468c: e3550000 cmp r5, #0 + 1f54690: 0a00006e beq 1f54850 + 1f54694: ebffea42 bl 1f4efa4 + 1f54698: e2505000 subs r5, r0, #0 + 1f5469c: 0a00005b beq 1f54810 + 1f546a0: e5d43039 ldrb r3, [r4, #57] ; 0x39 + 1f546a4: e3530000 cmp r3, #0 + 1f546a8: 0a000012 beq 1f546f8 + 1f546ac: e1a00004 mov r0, r4 + 1f546b0: e3a05000 mov r5, #0 + 1f546b4: ebffebda bl 1f4f624 + 1f546b8: e1a06000 mov r6, r0 + 1f546bc: e1a00004 mov r0, r4 + 1f546c0: ebffebd5 bl 1f4f61c + 1f546c4: e5d42038 ldrb r2, [r4, #56] ; 0x38 + 1f546c8: e5d43039 ldrb r3, [r4, #57] ; 0x39 + 1f546cc: e1a01000 mov r1, r0 + 1f546d0: e58d2004 str r2, [sp, #4] + 1f546d4: e1a00006 mov r0, r6 + 1f546d8: e58d3000 str r3, [sp] + 1f546dc: e3a02001 mov r2, #1 + 1f546e0: e3a0300b mov r3, #11 + 1f546e4: e58d500c str r5, [sp, #12] + 1f546e8: e58d5008 str r5, [sp, #8] + 1f546ec: ebffe60d bl 1f4df28 + 1f546f0: e1500005 cmp r0, r5 + 1f546f4: ba000059 blt 1f54860 + 1f546f8: e1a00004 mov r0, r4 + 1f546fc: e3a05000 mov r5, #0 + 1f54700: ebffebc7 bl 1f4f624 + 1f54704: e1a06000 mov r6, r0 + 1f54708: e1a00004 mov r0, r4 + 1f5470c: ebffebc2 bl 1f4f61c + 1f54710: e5d43038 ldrb r3, [r4, #56] ; 0x38 + 1f54714: e1a01000 mov r1, r0 + 1f54718: e58d3004 str r3, [sp, #4] + 1f5471c: e1a00006 mov r0, r6 + 1f54720: e58d500c str r5, [sp, #12] + 1f54724: e58d5008 str r5, [sp, #8] + 1f54728: e3a0300b mov r3, #11 + 1f5472c: e58d5000 str r5, [sp] + 1f54730: e3a02021 mov r2, #33 ; 0x21 + 1f54734: ebffe5fb bl 1f4df28 + 1f54738: e1500005 cmp r0, r5 + 1f5473c: ba00003c blt 1f54834 + 1f54740: e28d0014 add r0, sp, #20 + 1f54744: ebfff413 bl 1f51798 + 1f54748: e3053c98 movw r3, #23704 ; 0x5c98 + 1f5474c: e34031f6 movt r3, #502 ; 0x1f6 + 1f54750: e28d0014 add r0, sp, #20 + 1f54754: e303182c movw r1, #14380 ; 0x382c + 1f54758: e34011f6 movt r1, #502 ; 0x1f6 + 1f5475c: e5932000 ldr r2, [r3] + 1f54760: e282c001 add ip, r2, #1 + 1f54764: e583c000 str ip, [r3] + 1f54768: ebfff803 bl 1f5277c + 1f5476c: ebffecb1 bl 1f4fa38 + 1f54770: e1a06000 mov r6, r0 + 1f54774: e28d0014 add r0, sp, #20 + 1f54778: ebfff421 bl 1f51804 + 1f5477c: e1a03005 mov r3, r5 + 1f54780: e1a01000 mov r1, r0 + 1f54784: e1a02004 mov r2, r4 + 1f54788: e1a00006 mov r0, r6 + 1f5478c: ebffec7f bl 1f4f990 + 1f54790: e28d0014 add r0, sp, #20 + 1f54794: ebfff410 bl 1f517dc <_String> + 1f54798: e3a00024 mov r0, #36 ; 0x24 + 1f5479c: ebffa771 bl 1f3e568 + 1f547a0: e5942054 ldr r2, [r4, #84] ; 0x54 + 1f547a4: e594103c ldr r1, [r4, #60] ; 0x3c + 1f547a8: e3a03008 mov r3, #8 + 1f547ac: e5840050 str r0, [r4, #80] ; 0x50 + 1f547b0: e58d5000 str r5, [sp] + 1f547b4: ebffec2b bl 1f4f868 + 1f547b8: e1a02005 mov r2, r5 + 1f547bc: e1a03004 mov r3, r4 + 1f547c0: e5940050 ldr r0, [r4, #80] ; 0x50 + 1f547c4: e304187c movw r1, #18556 ; 0x487c + 1f547c8: e34011f5 movt r1, #501 ; 0x1f5 + 1f547cc: ebffec48 bl 1f4f8f4 + 1f547d0: e1a00004 mov r0, r4 + 1f547d4: ebffeb92 bl 1f4f624 + 1f547d8: e5941050 ldr r1, [r4, #80] ; 0x50 + 1f547dc: ebffe4cc bl 1f4db14 + 1f547e0: e1a05000 mov r5, r0 + 1f547e4: e1a00005 mov r0, r5 + 1f547e8: e28dd020 add sp, sp, #32 + 1f547ec: e8bd8070 pop {r4, r5, r6, pc} + 1f547f0: e1a00004 mov r0, r4 + 1f547f4: e3a05000 mov r5, #0 + 1f547f8: e3031838 movw r1, #14392 ; 0x3838 + 1f547fc: e34011f6 movt r1, #502 ; 0x1f6 + 1f54800: ebffeb8f bl 1f4f644 + 1f54804: e1a00005 mov r0, r5 + 1f54808: e28dd020 add sp, sp, #32 + 1f5480c: e8bd8070 pop {r4, r5, r6, pc} + 1f54810: e3a01001 mov r1, #1 + 1f54814: e303250c movw r2, #13580 ; 0x350c + 1f54818: e34021f6 movt r2, #502 ; 0x1f6 + 1f5481c: e3030838 movw r0, #14392 ; 0x3838 + 1f54820: e34001f6 movt r0, #502 ; 0x1f6 + 1f54824: ebfeb297 bl 1f01288 + 1f54828: e1a00005 mov r0, r5 + 1f5482c: e28dd020 add sp, sp, #32 + 1f54830: e8bd8070 pop {r4, r5, r6, pc} + 1f54834: e3032810 movw r2, #14352 ; 0x3810 + 1f54838: e34021f6 movt r2, #502 ; 0x1f6 + 1f5483c: e3030838 movw r0, #14392 ; 0x3838 + 1f54840: e34001f6 movt r0, #502 ; 0x1f6 + 1f54844: e3a01001 mov r1, #1 + 1f54848: ebfeb28e bl 1f01288 + 1f5484c: eaffffe4 b 1f547e4 + 1f54850: e3031838 movw r1, #14392 ; 0x3838 + 1f54854: e34011f6 movt r1, #502 ; 0x1f6 + 1f54858: ebffeb79 bl 1f4f644 + 1f5485c: eaffffe0 b 1f547e4 + 1f54860: e30327f8 movw r2, #14328 ; 0x37f8 + 1f54864: e34021f6 movt r2, #502 ; 0x1f6 + 1f54868: e3030838 movw r0, #14392 ; 0x3838 + 1f5486c: e34001f6 movt r0, #502 ; 0x1f6 + 1f54870: e3a01001 mov r1, #1 + 1f54874: ebfeb283 bl 1f01288 + 1f54878: eaffffd9 b 1f547e4 + +01f5487c : + 1f5487c: e92d4070 push {r4, r5, r6, lr} + 1f54880: e1a04002 mov r4, r2 + 1f54884: e1a05000 mov r5, r0 + 1f54888: e24dd010 sub sp, sp, #16 + 1f5488c: ebffec0e bl 1f4f8cc + 1f54890: e3500000 cmp r0, #0 + 1f54894: 1a000019 bne 1f54900 + 1f54898: e5940050 ldr r0, [r4, #80] ; 0x50 + 1f5489c: e3a05000 mov r5, #0 + 1f548a0: ebffebfd bl 1f4f89c <_USBRequest> + 1f548a4: e5940050 ldr r0, [r4, #80] ; 0x50 + 1f548a8: ebffa736 bl 1f3e588 + 1f548ac: e5845050 str r5, [r4, #80] ; 0x50 + 1f548b0: e3a00024 mov r0, #36 ; 0x24 + 1f548b4: ebffa72b bl 1f3e568 + 1f548b8: e5942054 ldr r2, [r4, #84] ; 0x54 + 1f548bc: e594103c ldr r1, [r4, #60] ; 0x3c + 1f548c0: e3a03008 mov r3, #8 + 1f548c4: e5840050 str r0, [r4, #80] ; 0x50 + 1f548c8: e58d5000 str r5, [sp] + 1f548cc: ebffebe5 bl 1f4f868 + 1f548d0: e1a03004 mov r3, r4 + 1f548d4: e1a02005 mov r2, r5 + 1f548d8: e5940050 ldr r0, [r4, #80] ; 0x50 + 1f548dc: e304187c movw r1, #18556 ; 0x487c + 1f548e0: e34011f5 movt r1, #501 ; 0x1f5 + 1f548e4: ebffec02 bl 1f4f8f4 + 1f548e8: e1a00004 mov r0, r4 + 1f548ec: ebffeb4c bl 1f4f624 + 1f548f0: e5941050 ldr r1, [r4, #80] ; 0x50 + 1f548f4: ebffe486 bl 1f4db14 + 1f548f8: e28dd010 add sp, sp, #16 + 1f548fc: e8bd8070 pop {r4, r5, r6, pc} + 1f54900: e1a00005 mov r0, r5 + 1f54904: ebffebf2 bl 1f4f8d4 + 1f54908: e3500008 cmp r0, #8 + 1f5490c: 1affffe1 bne 1f54898 + 1f54910: e594304c ldr r3, [r4, #76] ; 0x4c + 1f54914: e3530000 cmp r3, #0 + 1f54918: 0a000005 beq 1f54934 + 1f5491c: e5941054 ldr r1, [r4, #84] ; 0x54 + 1f54920: e1a00004 mov r0, r4 + 1f54924: e2812002 add r2, r1, #2 + 1f54928: e5d11000 ldrb r1, [r1] + 1f5492c: e12fff33 blx r3 + 1f54930: eaffffd8 b 1f54898 + 1f54934: e5943054 ldr r3, [r4, #84] ; 0x54 + 1f54938: e5d31007 ldrb r1, [r3, #7] + 1f5493c: e3510000 cmp r1, #0 + 1f54940: 1a000019 bne 1f549ac + 1f54944: e5d31006 ldrb r1, [r3, #6] + 1f54948: e3510000 cmp r1, #0 + 1f5494c: 1a000016 bne 1f549ac + 1f54950: e5d31005 ldrb r1, [r3, #5] + 1f54954: e3510000 cmp r1, #0 + 1f54958: 1a000013 bne 1f549ac + 1f5495c: e5d31004 ldrb r1, [r3, #4] + 1f54960: e3510000 cmp r1, #0 + 1f54964: 1a000010 bne 1f549ac + 1f54968: e5d31003 ldrb r1, [r3, #3] + 1f5496c: e3510000 cmp r1, #0 + 1f54970: 1a00000d bne 1f549ac + 1f54974: e5d31002 ldrb r1, [r3, #2] + 1f54978: e3510000 cmp r1, #0 + 1f5497c: 1a00000a bne 1f549ac + 1f54980: e5d43058 ldrb r3, [r4, #88] ; 0x58 + 1f54984: e3530000 cmp r3, #0 + 1f54988: 13a03000 movne r3, #0 + 1f5498c: 15c43058 strbne r3, [r4, #88] ; 0x58 + 1f54990: e594005c ldr r0, [r4, #92] ; 0x5c + 1f54994: e3500000 cmp r0, #0 + 1f54998: 0affffbe beq 1f54898 + 1f5499c: ebfeb293 bl 1f013f0 + 1f549a0: e3a03000 mov r3, #0 + 1f549a4: e584305c str r3, [r4, #92] ; 0x5c + 1f549a8: eaffffba b 1f54898 + 1f549ac: e5d42058 ldrb r2, [r4, #88] ; 0x58 + 1f549b0: e1520001 cmp r2, r1 + 1f549b4: 0afffff5 beq 1f54990 + 1f549b8: e5c41058 strb r1, [r4, #88] ; 0x58 + 1f549bc: e2846060 add r6, r4, #96 ; 0x60 + 1f549c0: e1a00006 mov r0, r6 + 1f549c4: e5d35000 ldrb r5, [r3] + 1f549c8: e1a02005 mov r2, r5 + 1f549cc: eb000d0b bl 1f57e00 + 1f549d0: e2403e13 sub r3, r0, #304 ; 0x130 + 1f549d4: e2433003 sub r3, r3, #3 + 1f549d8: e353000f cmp r3, #15 + 1f549dc: 979ff103 ldrls pc, [pc, r3, lsl #2] + 1f549e0: ea00001b b 1f54a54 + 1f549e4: 01f54898 .word 0x01f54898 + 1f549e8: 01f54898 .word 0x01f54898 + 1f549ec: 01f54898 .word 0x01f54898 + 1f549f0: 01f54a38 .word 0x01f54a38 + 1f549f4: 01f54a38 .word 0x01f54a38 + 1f549f8: 01f54a38 .word 0x01f54a38 + 1f549fc: 01f54a38 .word 0x01f54a38 + 1f54a00: 01f54a38 .word 0x01f54a38 + 1f54a04: 01f54a38 .word 0x01f54a38 + 1f54a08: 01f54a38 .word 0x01f54a38 + 1f54a0c: 01f54a38 .word 0x01f54a38 + 1f54a10: 01f54a38 .word 0x01f54a38 + 1f54a14: 01f54a38 .word 0x01f54a38 + 1f54a18: 01f54a38 .word 0x01f54a38 + 1f54a1c: 01f54a38 .word 0x01f54a38 + 1f54a20: 01f54a24 .word 0x01f54a24 + 1f54a24: e5943048 ldr r3, [r4, #72] ; 0x48 + 1f54a28: e3530000 cmp r3, #0 + 1f54a2c: 0affff99 beq 1f54898 + 1f54a30: e12fff33 blx r3 + 1f54a34: eaffff97 b 1f54898 + 1f54a38: e5943044 ldr r3, [r4, #68] ; 0x44 + 1f54a3c: e3530000 cmp r3, #0 + 1f54a40: 0affff94 beq 1f54898 + 1f54a44: e2400f4d sub r0, r0, #308 ; 0x134 + 1f54a48: e2400002 sub r0, r0, #2 + 1f54a4c: e12fff33 blx r3 + 1f54a50: eaffff90 b 1f54898 + 1f54a54: e1a01000 mov r1, r0 + 1f54a58: e1a02005 mov r2, r5 + 1f54a5c: e1a00006 mov r0, r6 + 1f54a60: e28d300c add r3, sp, #12 + 1f54a64: eb000d2b bl 1f57f18 + 1f54a68: e3500000 cmp r0, #0 + 1f54a6c: 0affff89 beq 1f54898 + 1f54a70: e5943040 ldr r3, [r4, #64] ; 0x40 + 1f54a74: e3530000 cmp r3, #0 + 1f54a78: 0affff86 beq 1f54898 + 1f54a7c: e12fff33 blx r3 + 1f54a80: eaffff84 b 1f54898 + +01f54a84 : + 1f54a84: e92d4010 push {r4, lr} + 1f54a88: e1a04000 mov r4, r0 + 1f54a8c: ebffe979 bl 1f4f078 + 1f54a90: e3a03000 mov r3, #0 + 1f54a94: e2840060 add r0, r4, #96 ; 0x60 + 1f54a98: e30425c0 movw r2, #17856 ; 0x45c0 + 1f54a9c: e34021f5 movt r2, #501 ; 0x1f5 + 1f54aa0: e584303c str r3, [r4, #60] ; 0x3c + 1f54aa4: e5842000 str r2, [r4] + 1f54aa8: e5843040 str r3, [r4, #64] ; 0x40 + 1f54aac: e5843044 str r3, [r4, #68] ; 0x44 + 1f54ab0: e5843048 str r3, [r4, #72] ; 0x48 + 1f54ab4: e584304c str r3, [r4, #76] ; 0x4c + 1f54ab8: e5843050 str r3, [r4, #80] ; 0x50 + 1f54abc: e5843054 str r3, [r4, #84] ; 0x54 + 1f54ac0: e5c43058 strb r3, [r4, #88] ; 0x58 + 1f54ac4: e584305c str r3, [r4, #92] ; 0x5c + 1f54ac8: eb000ca1 bl 1f57d54 + 1f54acc: e3a00008 mov r0, #8 + 1f54ad0: ebffa6a4 bl 1f3e568 + 1f54ad4: e5840054 str r0, [r4, #84] ; 0x54 + 1f54ad8: e8bd8010 pop {r4, pc} + +01f54adc <_CUSBKeyboardDevice>: + 1f54adc: e92d4010 push {r4, lr} + 1f54ae0: e1a04000 mov r4, r0 + 1f54ae4: e5900054 ldr r0, [r0, #84] ; 0x54 + 1f54ae8: e3500000 cmp r0, #0 + 1f54aec: 0a000002 beq 1f54afc <_CUSBKeyboardDevice+0x20> + 1f54af0: ebffa6a4 bl 1f3e588 + 1f54af4: e3a03000 mov r3, #0 + 1f54af8: e5843054 str r3, [r4, #84] ; 0x54 + 1f54afc: e594003c ldr r0, [r4, #60] ; 0x3c + 1f54b00: e3500000 cmp r0, #0 + 1f54b04: 0a000004 beq 1f54b1c <_CUSBKeyboardDevice+0x40> + 1f54b08: ebffeb29 bl 1f4f7b4 <_USBEndpoint> + 1f54b0c: e594003c ldr r0, [r4, #60] ; 0x3c + 1f54b10: ebffa69c bl 1f3e588 + 1f54b14: e3a03000 mov r3, #0 + 1f54b18: e584303c str r3, [r4, #60] ; 0x3c + 1f54b1c: e2840060 add r0, r4, #96 ; 0x60 + 1f54b20: eb000c94 bl 1f57d78 <_KeyMap> + 1f54b24: e1a00004 mov r0, r4 + 1f54b28: e8bd4010 pop {r4, lr} + 1f54b2c: eaffe98e b 1f4f16c <_USBDevice> + +01f54b30 : + 1f54b30: e5801040 str r1, [r0, #64] ; 0x40 + 1f54b34: e12fff1e bx lr + +01f54b38 : + 1f54b38: e5801044 str r1, [r0, #68] ; 0x44 + 1f54b3c: e12fff1e bx lr + +01f54b40 : + 1f54b40: e5801048 str r1, [r0, #72] ; 0x48 + 1f54b44: e12fff1e bx lr + +01f54b48 : + 1f54b48: e580104c str r1, [r0, #76] ; 0x4c + 1f54b4c: e12fff1e bx lr + +01f54b50 : + 1f54b50: e3a03000 mov r3, #0 + 1f54b54: e880000a stm r0, {r1, r3} + 1f54b58: e12fff1e bx lr + +01f54b5c <_DWHCIRootPort>: + 1f54b5c: e92d4010 push {r4, lr} + 1f54b60: e1a04000 mov r4, r0 + 1f54b64: e5900004 ldr r0, [r0, #4] + 1f54b68: e3500000 cmp r0, #0 + 1f54b6c: 0a000004 beq 1f54b84 <_DWHCIRootPort+0x28> + 1f54b70: ebffe97d bl 1f4f16c <_USBDevice> + 1f54b74: e5940004 ldr r0, [r4, #4] + 1f54b78: ebffa682 bl 1f3e588 + 1f54b7c: e3a03000 mov r3, #0 + 1f54b80: e5843004 str r3, [r4, #4] + 1f54b84: e3a03000 mov r3, #0 + 1f54b88: e5843000 str r3, [r4] + 1f54b8c: e8bd8010 pop {r4, pc} + +01f54b90 : + 1f54b90: e92d40f0 push {r4, r5, r6, r7, lr} + 1f54b94: e1a04000 mov r4, r0 + 1f54b98: e5900000 ldr r0, [r0] + 1f54b9c: e24dd00c sub sp, sp, #12 + 1f54ba0: ebffe75d bl 1f4e91c + 1f54ba4: e3500003 cmp r0, #3 + 1f54ba8: 0a000055 beq 1f54d04 + 1f54bac: e1a05000 mov r5, r0 + 1f54bb0: e3a00038 mov r0, #56 ; 0x38 + 1f54bb4: ebffa66b bl 1f3e568 + 1f54bb8: e3a06001 mov r6, #1 + 1f54bbc: e5941000 ldr r1, [r4] + 1f54bc0: e1a02005 mov r2, r5 + 1f54bc4: e5840004 str r0, [r4, #4] + 1f54bc8: e3a03000 mov r3, #0 + 1f54bcc: e58d6000 str r6, [sp] + 1f54bd0: ebffe90c bl 1f4f008 + 1f54bd4: e5940004 ldr r0, [r4, #4] + 1f54bd8: ebffe989 bl 1f4f204 + 1f54bdc: e2505000 subs r5, r0, #0 + 1f54be0: e5940004 ldr r0, [r4, #4] + 1f54be4: 0a00003f beq 1f54ce8 + 1f54be8: eb000a19 bl 1f57454 + 1f54bec: e1a05000 mov r5, r0 + 1f54bf0: ebfff303 bl 1f51804 + 1f54bf4: e3a01003 mov r1, #3 + 1f54bf8: e1a03000 mov r3, r0 + 1f54bfc: e3032864 movw r2, #14436 ; 0x3864 + 1f54c00: e34021f6 movt r2, #502 ; 0x1f6 + 1f54c04: e3030840 movw r0, #14400 ; 0x3840 + 1f54c08: e34001f6 movt r0, #502 ; 0x1f6 + 1f54c0c: ebfeb19d bl 1f01288 + 1f54c10: e1a00005 mov r0, r5 + 1f54c14: ebfff2f0 bl 1f517dc <_String> + 1f54c18: e1a00005 mov r0, r5 + 1f54c1c: ebffa659 bl 1f3e588 + 1f54c20: e5940004 ldr r0, [r4, #4] + 1f54c24: eb000943 bl 1f57138 + 1f54c28: e2507000 subs r7, r0, #0 + 1f54c2c: 0a00003e beq 1f54d2c + 1f54c30: e5940004 ldr r0, [r4, #4] + 1f54c34: ebffe94c bl 1f4f16c <_USBDevice> + 1f54c38: e5940004 ldr r0, [r4, #4] + 1f54c3c: ebffa651 bl 1f3e588 + 1f54c40: e5847004 str r7, [r4, #4] + 1f54c44: e5973000 ldr r3, [r7] + 1f54c48: e1a00007 mov r0, r7 + 1f54c4c: e12fff33 blx r3 + 1f54c50: e2505000 subs r5, r0, #0 + 1f54c54: 0a00001c beq 1f54ccc + 1f54c58: e3a01004 mov r1, #4 + 1f54c5c: e303288c movw r2, #14476 ; 0x388c + 1f54c60: e34021f6 movt r2, #502 ; 0x1f6 + 1f54c64: e3030840 movw r0, #14400 ; 0x3840 + 1f54c68: e34001f6 movt r0, #502 ; 0x1f6 + 1f54c6c: ebfeb185 bl 1f01288 + 1f54c70: e5940000 ldr r0, [r4] + 1f54c74: ebffe73b bl 1f4e968 + 1f54c78: e3500000 cmp r0, #0 + 1f54c7c: 01a05006 moveq r5, r6 + 1f54c80: 0a00001c beq 1f54cf8 + 1f54c84: e1a01006 mov r1, r6 + 1f54c88: e30328b8 movw r2, #14520 ; 0x38b8 + 1f54c8c: e34021f6 movt r2, #502 ; 0x1f6 + 1f54c90: e3030840 movw r0, #14400 ; 0x3840 + 1f54c94: e34001f6 movt r0, #502 ; 0x1f6 + 1f54c98: ebfeb17a bl 1f01288 + 1f54c9c: e5940000 ldr r0, [r4] + 1f54ca0: ebffe743 bl 1f4e9b4 + 1f54ca4: e5940004 ldr r0, [r4, #4] + 1f54ca8: ebffe92f bl 1f4f16c <_USBDevice> + 1f54cac: e5940004 ldr r0, [r4, #4] + 1f54cb0: ebffa634 bl 1f3e588 + 1f54cb4: e3a03000 mov r3, #0 + 1f54cb8: e1a05003 mov r5, r3 + 1f54cbc: e5843004 str r3, [r4, #4] + 1f54cc0: e1a00005 mov r0, r5 + 1f54cc4: e28dd00c add sp, sp, #12 + 1f54cc8: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f54ccc: e1a01006 mov r1, r6 + 1f54cd0: e3032874 movw r2, #14452 ; 0x3874 + 1f54cd4: e34021f6 movt r2, #502 ; 0x1f6 + 1f54cd8: e3030840 movw r0, #14400 ; 0x3840 + 1f54cdc: e34001f6 movt r0, #502 ; 0x1f6 + 1f54ce0: ebfeb168 bl 1f01288 + 1f54ce4: e5940004 ldr r0, [r4, #4] + 1f54ce8: ebffe91f bl 1f4f16c <_USBDevice> + 1f54cec: e5940004 ldr r0, [r4, #4] + 1f54cf0: ebffa624 bl 1f3e588 + 1f54cf4: e5845004 str r5, [r4, #4] + 1f54cf8: e1a00005 mov r0, r5 + 1f54cfc: e28dd00c add sp, sp, #12 + 1f54d00: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f54d04: e3a01001 mov r1, #1 + 1f54d08: e3a05000 mov r5, #0 + 1f54d0c: e3032848 movw r2, #14408 ; 0x3848 + 1f54d10: e34021f6 movt r2, #502 ; 0x1f6 + 1f54d14: e3030840 movw r0, #14400 ; 0x3840 + 1f54d18: e34001f6 movt r0, #502 ; 0x1f6 + 1f54d1c: ebfeb159 bl 1f01288 + 1f54d20: e1a00005 mov r0, r5 + 1f54d24: e28dd00c add sp, sp, #12 + 1f54d28: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f54d2c: e3a01003 mov r1, #3 + 1f54d30: e30328a0 movw r2, #14496 ; 0x38a0 + 1f54d34: e34021f6 movt r2, #502 ; 0x1f6 + 1f54d38: e3030840 movw r0, #14400 ; 0x3840 + 1f54d3c: e34001f6 movt r0, #502 ; 0x1f6 + 1f54d40: ebfeb150 bl 1f01288 + 1f54d44: e5940004 ldr r0, [r4, #4] + 1f54d48: ebffe907 bl 1f4f16c <_USBDevice> + 1f54d4c: e5940004 ldr r0, [r4, #4] + 1f54d50: ebffa60c bl 1f3e588 + 1f54d54: e1a05007 mov r5, r7 + 1f54d58: e5847004 str r7, [r4, #4] + 1f54d5c: eaffffe5 b 1f54cf8 + +01f54d60 : + 1f54d60: e92d4070 push {r4, r5, r6, lr} + 1f54d64: e3a01002 mov r1, #2 + 1f54d68: e1a04000 mov r4, r0 + 1f54d6c: e24dd020 sub sp, sp, #32 + 1f54d70: ebffea31 bl 1f4f63c + 1f54d74: e3500000 cmp r0, #0 + 1f54d78: 0a000084 beq 1f54f90 + 1f54d7c: e5d03004 ldrb r3, [r0, #4] + 1f54d80: e3530000 cmp r3, #0 + 1f54d84: 0a000081 beq 1f54f90 + 1f54d88: e3a01004 mov r1, #4 + 1f54d8c: e1a00004 mov r0, r4 + 1f54d90: ebffea29 bl 1f4f63c + 1f54d94: e2503000 subs r3, r0, #0 + 1f54d98: 0a000021 beq 1f54e24 + 1f54d9c: e5d32004 ldrb r2, [r3, #4] + 1f54da0: e3520000 cmp r2, #0 + 1f54da4: 0afffff7 beq 1f54d88 + 1f54da8: e5d32005 ldrb r2, [r3, #5] + 1f54dac: e3520003 cmp r2, #3 + 1f54db0: 1afffff4 bne 1f54d88 + 1f54db4: e5d32006 ldrb r2, [r3, #6] + 1f54db8: e3520001 cmp r2, #1 + 1f54dbc: 1afffff1 bne 1f54d88 + 1f54dc0: e5d32007 ldrb r2, [r3, #7] + 1f54dc4: e3520002 cmp r2, #2 + 1f54dc8: 1affffee bne 1f54d88 + 1f54dcc: e5d32002 ldrb r2, [r3, #2] + 1f54dd0: e3a01005 mov r1, #5 + 1f54dd4: e5c42038 strb r2, [r4, #56] ; 0x38 + 1f54dd8: e1a00004 mov r0, r4 + 1f54ddc: e5d33003 ldrb r3, [r3, #3] + 1f54de0: e5c43039 strb r3, [r4, #57] ; 0x39 + 1f54de4: ebffea14 bl 1f4f63c + 1f54de8: e2505000 subs r5, r0, #0 + 1f54dec: 0affffe5 beq 1f54d88 + 1f54df0: e1d530d2 ldrsb r3, [r5, #2] + 1f54df4: e3530000 cmp r3, #0 + 1f54df8: aaffffe2 bge 1f54d88 + 1f54dfc: e5d53003 ldrb r3, [r5, #3] + 1f54e00: e203303f and r3, r3, #63 ; 0x3f + 1f54e04: e3530003 cmp r3, #3 + 1f54e08: 1affffde bne 1f54d88 + 1f54e0c: e3a00018 mov r0, #24 + 1f54e10: ebffa5d4 bl 1f3e568 + 1f54e14: e1a02005 mov r2, r5 + 1f54e18: e584003c str r0, [r4, #60] ; 0x3c + 1f54e1c: e1a01004 mov r1, r4 + 1f54e20: ebffea16 bl 1f4f680 + 1f54e24: e594503c ldr r5, [r4, #60] ; 0x3c + 1f54e28: e1a00004 mov r0, r4 + 1f54e2c: e3550000 cmp r5, #0 + 1f54e30: 0a00006e beq 1f54ff0 + 1f54e34: ebffe85a bl 1f4efa4 + 1f54e38: e2505000 subs r5, r0, #0 + 1f54e3c: 0a00005b beq 1f54fb0 + 1f54e40: e5d43039 ldrb r3, [r4, #57] ; 0x39 + 1f54e44: e3530000 cmp r3, #0 + 1f54e48: 0a000012 beq 1f54e98 + 1f54e4c: e1a00004 mov r0, r4 + 1f54e50: e3a05000 mov r5, #0 + 1f54e54: ebffe9f2 bl 1f4f624 + 1f54e58: e1a06000 mov r6, r0 + 1f54e5c: e1a00004 mov r0, r4 + 1f54e60: ebffe9ed bl 1f4f61c + 1f54e64: e5d42038 ldrb r2, [r4, #56] ; 0x38 + 1f54e68: e5d43039 ldrb r3, [r4, #57] ; 0x39 + 1f54e6c: e1a01000 mov r1, r0 + 1f54e70: e58d2004 str r2, [sp, #4] + 1f54e74: e1a00006 mov r0, r6 + 1f54e78: e58d3000 str r3, [sp] + 1f54e7c: e3a02001 mov r2, #1 + 1f54e80: e3a0300b mov r3, #11 + 1f54e84: e58d500c str r5, [sp, #12] + 1f54e88: e58d5008 str r5, [sp, #8] + 1f54e8c: ebffe425 bl 1f4df28 + 1f54e90: e1500005 cmp r0, r5 + 1f54e94: ba000059 blt 1f55000 + 1f54e98: e1a00004 mov r0, r4 + 1f54e9c: e3a05000 mov r5, #0 + 1f54ea0: ebffe9df bl 1f4f624 + 1f54ea4: e1a06000 mov r6, r0 + 1f54ea8: e1a00004 mov r0, r4 + 1f54eac: ebffe9da bl 1f4f61c + 1f54eb0: e5d43038 ldrb r3, [r4, #56] ; 0x38 + 1f54eb4: e1a01000 mov r1, r0 + 1f54eb8: e58d3004 str r3, [sp, #4] + 1f54ebc: e1a00006 mov r0, r6 + 1f54ec0: e58d500c str r5, [sp, #12] + 1f54ec4: e58d5008 str r5, [sp, #8] + 1f54ec8: e3a0300b mov r3, #11 + 1f54ecc: e58d5000 str r5, [sp] + 1f54ed0: e3a02021 mov r2, #33 ; 0x21 + 1f54ed4: ebffe413 bl 1f4df28 + 1f54ed8: e1500005 cmp r0, r5 + 1f54edc: ba00003c blt 1f54fd4 + 1f54ee0: e28d0014 add r0, sp, #20 + 1f54ee4: ebfff22b bl 1f51798 + 1f54ee8: e3053c9c movw r3, #23708 ; 0x5c9c + 1f54eec: e34031f6 movt r3, #502 ; 0x1f6 + 1f54ef0: e28d0014 add r0, sp, #20 + 1f54ef4: e30318d0 movw r1, #14544 ; 0x38d0 + 1f54ef8: e34011f6 movt r1, #502 ; 0x1f6 + 1f54efc: e5932000 ldr r2, [r3] + 1f54f00: e282c001 add ip, r2, #1 + 1f54f04: e583c000 str ip, [r3] + 1f54f08: ebfff61b bl 1f5277c + 1f54f0c: ebffeac9 bl 1f4fa38 + 1f54f10: e1a06000 mov r6, r0 + 1f54f14: e28d0014 add r0, sp, #20 + 1f54f18: ebfff239 bl 1f51804 + 1f54f1c: e1a03005 mov r3, r5 + 1f54f20: e1a01000 mov r1, r0 + 1f54f24: e1a02004 mov r2, r4 + 1f54f28: e1a00006 mov r0, r6 + 1f54f2c: ebffea97 bl 1f4f990 + 1f54f30: e28d0014 add r0, sp, #20 + 1f54f34: ebfff228 bl 1f517dc <_String> + 1f54f38: e3a00024 mov r0, #36 ; 0x24 + 1f54f3c: ebffa589 bl 1f3e568 + 1f54f40: e5942048 ldr r2, [r4, #72] ; 0x48 + 1f54f44: e594103c ldr r1, [r4, #60] ; 0x3c + 1f54f48: e3a03003 mov r3, #3 + 1f54f4c: e5840044 str r0, [r4, #68] ; 0x44 + 1f54f50: e58d5000 str r5, [sp] + 1f54f54: ebffea43 bl 1f4f868 + 1f54f58: e1a02005 mov r2, r5 + 1f54f5c: e1a03004 mov r3, r4 + 1f54f60: e5940044 ldr r0, [r4, #68] ; 0x44 + 1f54f64: e305101c movw r1, #20508 ; 0x501c + 1f54f68: e34011f5 movt r1, #501 ; 0x1f5 + 1f54f6c: ebffea60 bl 1f4f8f4 + 1f54f70: e1a00004 mov r0, r4 + 1f54f74: ebffe9aa bl 1f4f624 + 1f54f78: e5941044 ldr r1, [r4, #68] ; 0x44 + 1f54f7c: ebffe2e4 bl 1f4db14 + 1f54f80: e1a05000 mov r5, r0 + 1f54f84: e1a00005 mov r0, r5 + 1f54f88: e28dd020 add sp, sp, #32 + 1f54f8c: e8bd8070 pop {r4, r5, r6, pc} + 1f54f90: e1a00004 mov r0, r4 + 1f54f94: e3a05000 mov r5, #0 + 1f54f98: e30318e0 movw r1, #14560 ; 0x38e0 + 1f54f9c: e34011f6 movt r1, #502 ; 0x1f6 + 1f54fa0: ebffe9a7 bl 1f4f644 + 1f54fa4: e1a00005 mov r0, r5 + 1f54fa8: e28dd020 add sp, sp, #32 + 1f54fac: e8bd8070 pop {r4, r5, r6, pc} + 1f54fb0: e3a01001 mov r1, #1 + 1f54fb4: e303250c movw r2, #13580 ; 0x350c + 1f54fb8: e34021f6 movt r2, #502 ; 0x1f6 + 1f54fbc: e30308e0 movw r0, #14560 ; 0x38e0 + 1f54fc0: e34001f6 movt r0, #502 ; 0x1f6 + 1f54fc4: ebfeb0af bl 1f01288 + 1f54fc8: e1a00005 mov r0, r5 + 1f54fcc: e28dd020 add sp, sp, #32 + 1f54fd0: e8bd8070 pop {r4, r5, r6, pc} + 1f54fd4: e3032810 movw r2, #14352 ; 0x3810 + 1f54fd8: e34021f6 movt r2, #502 ; 0x1f6 + 1f54fdc: e30308e0 movw r0, #14560 ; 0x38e0 + 1f54fe0: e34001f6 movt r0, #502 ; 0x1f6 + 1f54fe4: e3a01001 mov r1, #1 + 1f54fe8: ebfeb0a6 bl 1f01288 + 1f54fec: eaffffe4 b 1f54f84 + 1f54ff0: e30318e0 movw r1, #14560 ; 0x38e0 + 1f54ff4: e34011f6 movt r1, #502 ; 0x1f6 + 1f54ff8: ebffe991 bl 1f4f644 + 1f54ffc: eaffffe0 b 1f54f84 + 1f55000: e30327f8 movw r2, #14328 ; 0x37f8 + 1f55004: e34021f6 movt r2, #502 ; 0x1f6 + 1f55008: e30308e0 movw r0, #14560 ; 0x38e0 + 1f5500c: e34001f6 movt r0, #502 ; 0x1f6 + 1f55010: e3a01001 mov r1, #1 + 1f55014: ebfeb09b bl 1f01288 + 1f55018: eaffffd9 b 1f54f84 + +01f5501c : + 1f5501c: e92d40f0 push {r4, r5, r6, r7, lr} + 1f55020: e1a04002 mov r4, r2 + 1f55024: e1a05000 mov r5, r0 + 1f55028: e24dd00c sub sp, sp, #12 + 1f5502c: ebffea26 bl 1f4f8cc + 1f55030: e3500000 cmp r0, #0 + 1f55034: 1a000019 bne 1f550a0 + 1f55038: e5940044 ldr r0, [r4, #68] ; 0x44 + 1f5503c: e3a05000 mov r5, #0 + 1f55040: ebffea15 bl 1f4f89c <_USBRequest> + 1f55044: e5940044 ldr r0, [r4, #68] ; 0x44 + 1f55048: ebffa54e bl 1f3e588 + 1f5504c: e5845044 str r5, [r4, #68] ; 0x44 + 1f55050: e3a00024 mov r0, #36 ; 0x24 + 1f55054: ebffa543 bl 1f3e568 + 1f55058: e5942048 ldr r2, [r4, #72] ; 0x48 + 1f5505c: e594103c ldr r1, [r4, #60] ; 0x3c + 1f55060: e3a03003 mov r3, #3 + 1f55064: e5840044 str r0, [r4, #68] ; 0x44 + 1f55068: e58d5000 str r5, [sp] + 1f5506c: ebffe9fd bl 1f4f868 + 1f55070: e1a03004 mov r3, r4 + 1f55074: e1a02005 mov r2, r5 + 1f55078: e5940044 ldr r0, [r4, #68] ; 0x44 + 1f5507c: e305101c movw r1, #20508 ; 0x501c + 1f55080: e34011f5 movt r1, #501 ; 0x1f5 + 1f55084: ebffea1a bl 1f4f8f4 + 1f55088: e1a00004 mov r0, r4 + 1f5508c: ebffe964 bl 1f4f624 + 1f55090: e5941044 ldr r1, [r4, #68] ; 0x44 + 1f55094: e28dd00c add sp, sp, #12 + 1f55098: e8bd40f0 pop {r4, r5, r6, r7, lr} + 1f5509c: eaffe29c b 1f4db14 + 1f550a0: e1a00005 mov r0, r5 + 1f550a4: ebffea0a bl 1f4f8d4 + 1f550a8: e3500003 cmp r0, #3 + 1f550ac: 1affffe1 bne 1f55038 + 1f550b0: e5945040 ldr r5, [r4, #64] ; 0x40 + 1f550b4: e3550000 cmp r5, #0 + 1f550b8: 0affffde beq 1f55038 + 1f550bc: e5943048 ldr r3, [r4, #72] ; 0x48 + 1f550c0: e1d300d1 ldrsb r0, [r3, #1] + 1f550c4: e5d36000 ldrb r6, [r3] + 1f550c8: ebfff7e3 bl 1f5305c + 1f550cc: e5943048 ldr r3, [r4, #72] ; 0x48 + 1f550d0: e1a07000 mov r7, r0 + 1f550d4: e1d300d2 ldrsb r0, [r3, #2] + 1f550d8: ebfff7df bl 1f5305c + 1f550dc: e1a01007 mov r1, r7 + 1f550e0: e1a02000 mov r2, r0 + 1f550e4: e1a00006 mov r0, r6 + 1f550e8: e12fff35 blx r5 + 1f550ec: eaffffd1 b 1f55038 + +01f550f0 : + 1f550f0: e92d4010 push {r4, lr} + 1f550f4: e1a04000 mov r4, r0 + 1f550f8: ebffe7de bl 1f4f078 + 1f550fc: e3a03000 mov r3, #0 + 1f55100: e3042d60 movw r2, #19808 ; 0x4d60 + 1f55104: e34021f5 movt r2, #501 ; 0x1f5 + 1f55108: e3a00003 mov r0, #3 + 1f5510c: e5842000 str r2, [r4] + 1f55110: e584303c str r3, [r4, #60] ; 0x3c + 1f55114: e5843040 str r3, [r4, #64] ; 0x40 + 1f55118: e5843044 str r3, [r4, #68] ; 0x44 + 1f5511c: e5843048 str r3, [r4, #72] ; 0x48 + 1f55120: ebffa510 bl 1f3e568 + 1f55124: e5840048 str r0, [r4, #72] ; 0x48 + 1f55128: e8bd8010 pop {r4, pc} + +01f5512c <_CUSBMouseDevice>: + 1f5512c: e92d4010 push {r4, lr} + 1f55130: e1a04000 mov r4, r0 + 1f55134: e5900048 ldr r0, [r0, #72] ; 0x48 + 1f55138: e3500000 cmp r0, #0 + 1f5513c: 0a000002 beq 1f5514c <_CUSBMouseDevice+0x20> + 1f55140: ebffa510 bl 1f3e588 + 1f55144: e3a03000 mov r3, #0 + 1f55148: e5843048 str r3, [r4, #72] ; 0x48 + 1f5514c: e594003c ldr r0, [r4, #60] ; 0x3c + 1f55150: e3500000 cmp r0, #0 + 1f55154: 0a000004 beq 1f5516c <_CUSBMouseDevice+0x40> + 1f55158: ebffe995 bl 1f4f7b4 <_USBEndpoint> + 1f5515c: e594003c ldr r0, [r4, #60] ; 0x3c + 1f55160: ebffa508 bl 1f3e588 + 1f55164: e3a03000 mov r3, #0 + 1f55168: e584303c str r3, [r4, #60] ; 0x3c + 1f5516c: e1a00004 mov r0, r4 + 1f55170: e8bd4010 pop {r4, lr} + 1f55174: eaffe7fc b 1f4f16c <_USBDevice> + +01f55178 : + 1f55178: e5801040 str r1, [r0, #64] ; 0x40 + 1f5517c: e12fff1e bx lr + +01f55180 : + 1f55180: e12fff1e bx lr + +01f55184 : + 1f55184: e3a00000 mov r0, #0 + 1f55188: e12fff1e bx lr + +01f5518c : + 1f5518c: e12fff1e bx lr + +01f55190 : + 1f55190: e590001c ldr r0, [r0, #28] + 1f55194: e2000001 and r0, r0, #1 + 1f55198: e12fff1e bx lr + +01f5519c : + 1f5519c: e92d4010 push {r4, lr} + 1f551a0: e1a04000 mov r4, r0 + 1f551a4: e3001408 movw r1, #1032 ; 0x408 + 1f551a8: e3431f98 movt r1, #16280 ; 0x3f98 + 1f551ac: e24dd010 sub sp, sp, #16 + 1f551b0: e28d0004 add r0, sp, #4 + 1f551b4: ebffe60f bl 1f4e9f8 + 1f551b8: e28d0004 add r0, sp, #4 + 1f551bc: ebffe618 bl 1f4ea24 + 1f551c0: e5943018 ldr r3, [r4, #24] + 1f551c4: e2800001 add r0, r0, #1 + 1f551c8: e3530000 cmp r3, #0 + 1f551cc: e7ed0050 ubfx r0, r0, #0, #14 + 1f551d0: e584001c str r0, [r4, #28] + 1f551d4: 1a000005 bne 1f551f0 + 1f551d8: e28d0004 add r0, sp, #4 + 1f551dc: ebffe610 bl 1f4ea24 + 1f551e0: e594301c ldr r3, [r4, #28] + 1f551e4: e7ed0050 ubfx r0, r0, #0, #14 + 1f551e8: e1500003 cmp r0, r3 + 1f551ec: 1afffff9 bne 1f551d8 + 1f551f0: e28d0004 add r0, sp, #4 + 1f551f4: ebffe607 bl 1f4ea18 <_DWHCIRegister> + 1f551f8: e28dd010 add sp, sp, #16 + 1f551fc: e8bd8010 pop {r4, pc} + +01f55200 <_DWHCIFrameSchedulerNoSplit>: + 1f55200: e12fff1e bx lr + +01f55204 : + 1f55204: e3052200 movw r2, #20992 ; 0x5200 + 1f55208: e34021f5 movt r2, #501 ; 0x1f5 + 1f5520c: e3053180 movw r3, #20864 ; 0x5180 + 1f55210: e34031f5 movt r3, #501 ; 0x1f5 + 1f55214: e5801018 str r1, [r0, #24] + 1f55218: e3051184 movw r1, #20868 ; 0x5184 + 1f5521c: e34011f5 movt r1, #501 ; 0x1f5 + 1f55220: e5801008 str r1, [r0, #8] + 1f55224: e5802000 str r2, [r0] + 1f55228: e305218c movw r2, #20876 ; 0x518c + 1f5522c: e34021f5 movt r2, #501 ; 0x1f5 + 1f55230: e580200c str r2, [r0, #12] + 1f55234: e5803004 str r3, [r0, #4] + 1f55238: e3a02901 mov r2, #16384 ; 0x4000 + 1f5523c: e305319c movw r3, #20892 ; 0x519c + 1f55240: e34031f5 movt r3, #501 ; 0x1f5 + 1f55244: e580201c str r2, [r0, #28] + 1f55248: e5803010 str r3, [r0, #16] + 1f5524c: e3053190 movw r3, #20880 ; 0x5190 + 1f55250: e34031f5 movt r3, #501 ; 0x1f5 + 1f55254: e5803014 str r3, [r0, #20] + 1f55258: e12fff1e bx lr + +01f5525c : + 1f5525c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f55260: e0817002 add r7, r1, r2 + 1f55264: e1a031a1 lsr r3, r1, #3 + 1f55268: e2876007 add r6, r7, #7 + 1f5526c: e1a061a6 lsr r6, r6, #3 + 1f55270: e1530006 cmp r3, r6 + 1f55274: 2a000037 bcs 1f55358 + 1f55278: e2011007 and r1, r1, #7 + 1f5527c: e3a0e001 mov lr, #1 + 1f55280: e0824001 add r4, r2, r1 + 1f55284: e2477001 sub r7, r7, #1 + 1f55288: e1a0c11e lsl ip, lr, r1 + 1f5528c: e1a0e41e lsl lr, lr, r4 + 1f55290: e1a071a7 lsr r7, r7, #3 + 1f55294: e6efc07c uxtb ip, ip + 1f55298: e1530007 cmp r3, r7 + 1f5529c: e6efe07e uxtb lr, lr + 1f552a0: e26c8000 rsb r8, ip, #0 + 1f552a4: e06cc00e rsb ip, ip, lr + 1f552a8: e24ee001 sub lr, lr, #1 + 1f552ac: e6ef8078 uxtb r8, r8 + 1f552b0: e6efc07c uxtb ip, ip + 1f552b4: e6efe07e uxtb lr, lr + 1f552b8: 0a00001e beq 1f55338 + 1f552bc: e3a09000 mov r9, #0 + 1f552c0: e0805003 add r5, r0, r3 + 1f552c4: e1a04003 mov r4, r3 + 1f552c8: e1a00009 mov r0, r9 + 1f552cc: e261a008 rsb sl, r1, #8 + 1f552d0: ea00000b b 1f55304 + 1f552d4: e1570004 cmp r7, r4 + 1f552d8: e2844001 add r4, r4, #1 + 1f552dc: 12899008 addne r9, r9, #8 + 1f552e0: e2855001 add r5, r5, #1 + 1f552e4: 0555c001 ldrbeq ip, [r5, #-1] + 1f552e8: 1069c002 rsbne ip, r9, r2 + 1f552ec: 1555b001 ldrbne fp, [r5, #-1] + 1f552f0: 000cc00e andeq ip, ip, lr + 1f552f4: 0180000c orreq r0, r0, ip + 1f552f8: 11800c1b orrne r0, r0, fp, lsl ip + 1f552fc: e1560004 cmp r6, r4 + 1f55300: 0a00000b beq 1f55334 + 1f55304: e1530004 cmp r3, r4 + 1f55308: 1afffff1 bne 1f552d4 + 1f5530c: e5d5c000 ldrb ip, [r5] + 1f55310: e089900a add r9, r9, sl + 1f55314: e2844001 add r4, r4, #1 + 1f55318: e0690002 rsb r0, r9, r2 + 1f5531c: e00cc008 and ip, ip, r8 + 1f55320: e1560004 cmp r6, r4 + 1f55324: e2855001 add r5, r5, #1 + 1f55328: e1a0c15c asr ip, ip, r1 + 1f5532c: e1a0001c lsl r0, ip, r0 + 1f55330: 1afffff3 bne 1f55304 + 1f55334: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f55338: e0803003 add r3, r0, r3 + 1f5533c: e0805006 add r5, r0, r6 + 1f55340: e4d30001 ldrb r0, [r3], #1 + 1f55344: e000000c and r0, r0, ip + 1f55348: e1530005 cmp r3, r5 + 1f5534c: e1a00150 asr r0, r0, r1 + 1f55350: 1afffffa bne 1f55340 + 1f55354: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f55358: e3a00000 mov r0, #0 + 1f5535c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + +01f55360 : + 1f55360: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f55364: e1d04bbc ldrh r4, [r0, #188] ; 0xbc + 1f55368: e1a0b000 mov fp, r0 + 1f5536c: e24dd024 sub sp, sp, #36 ; 0x24 + 1f55370: e59080c8 ldr r8, [r0, #200] ; 0xc8 + 1f55374: e3540000 cmp r4, #0 + 1f55378: e59050c0 ldr r5, [r0, #192] ; 0xc0 + 1f5537c: 0a000060 beq 1f55504 + 1f55380: e3a0c000 mov ip, #0 + 1f55384: e303a2eb movw sl, #13035 ; 0x32eb + 1f55388: e34fa8a4 movt sl, #63652 ; 0xf8a4 + 1f5538c: e58da000 str sl, [sp] + 1f55390: e58da014 str sl, [sp, #20] + 1f55394: e1a0600c mov r6, ip + 1f55398: e58da00c str sl, [sp, #12] + 1f5539c: e1a0900c mov r9, ip + 1f553a0: e58da010 str sl, [sp, #16] + 1f553a4: e1a0700c mov r7, ip + 1f553a8: e58dc008 str ip, [sp, #8] + 1f553ac: e1a0a00c mov sl, ip + 1f553b0: e58dc004 str ip, [sp, #4] + 1f553b4: e1d520d0 ldrsb r2, [r5] + 1f553b8: e2020003 and r0, r2, #3 + 1f553bc: e3500001 cmp r0, #1 + 1f553c0: 0a000048 beq 1f554e8 + 1f553c4: e3500002 cmp r0, #2 + 1f553c8: 0a000034 beq 1f554a0 + 1f553cc: e3500000 cmp r0, #0 + 1f553d0: 0a00001b beq 1f55444 + 1f553d4: e1d510d3 ldrsb r1, [r5, #3] + 1f553d8: e2444005 sub r4, r4, #5 + 1f553dc: e1d5e0d2 ldrsb lr, [r5, #2] + 1f553e0: e2855005 add r5, r5, #5 + 1f553e4: e15530d4 ldrsb r3, [r5, #-4] + 1f553e8: e6ff4074 uxth r4, r4 + 1f553ec: e15500d1 ldrsb r0, [r5, #-1] + 1f553f0: e1a01801 lsl r1, r1, #16 + 1f553f4: e181140e orr r1, r1, lr, lsl #8 + 1f553f8: e1813003 orr r3, r1, r3 + 1f553fc: e1830c00 orr r0, r3, r0, lsl #24 + 1f55400: e20220fc and r2, r2, #252 ; 0xfc + 1f55404: e3520084 cmp r2, #132 ; 0x84 + 1f55408: 0a00002d beq 1f554c4 + 1f5540c: e3520034 cmp r2, #52 ; 0x34 + 1f55410: 0a000039 beq 1f554fc + 1f55414: ca00004e bgt 1f55554 + 1f55418: e3520008 cmp r2, #8 + 1f5541c: 0a00003c beq 1f55514 + 1f55420: da0001ee ble 1f55be0 + 1f55424: e3520014 cmp r2, #20 + 1f55428: 058d0014 streq r0, [sp, #20] + 1f5542c: 0a000010 beq 1f55474 + 1f55430: e59d300c ldr r3, [sp, #12] + 1f55434: e3520024 cmp r2, #36 ; 0x24 + 1f55438: 01a03000 moveq r3, r0 + 1f5543c: e58d300c str r3, [sp, #12] + 1f55440: ea00000b b 1f55474 + 1f55444: e20220fc and r2, r2, #252 ; 0xfc + 1f55448: e2444001 sub r4, r4, #1 + 1f5544c: e3520084 cmp r2, #132 ; 0x84 + 1f55450: e2855001 add r5, r5, #1 + 1f55454: e6ff4074 uxth r4, r4 + 1f55458: 1affffeb bne 1f5540c + 1f5545c: e3560000 cmp r6, #0 + 1f55460: 1a000005 bne 1f5547c + 1f55464: e5d83000 ldrb r3, [r8] + 1f55468: e3530000 cmp r3, #0 + 1f5546c: 1a000009 bne 1f55498 + 1f55470: e3a07008 mov r7, #8 + 1f55474: e3540000 cmp r4, #0 + 1f55478: 1affffcd bne 1f553b4 + 1f5547c: e2874007 add r4, r7, #7 + 1f55480: e59d3004 ldr r3, [sp, #4] + 1f55484: e7ef41d4 ubfx r4, r4, #3, #16 + 1f55488: e58b3048 str r3, [fp, #72] ; 0x48 + 1f5548c: e59d3008 ldr r3, [sp, #8] + 1f55490: e58b3094 str r3, [fp, #148] ; 0x94 + 1f55494: e1cb4cbc strh r4, [fp, #204] ; 0xcc + 1f55498: e28dd024 add sp, sp, #36 ; 0x24 + 1f5549c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f554a0: e1d500d2 ldrsb r0, [r5, #2] + 1f554a4: e20220fc and r2, r2, #252 ; 0xfc + 1f554a8: e5d53001 ldrb r3, [r5, #1] + 1f554ac: e2444003 sub r4, r4, #3 + 1f554b0: e3520084 cmp r2, #132 ; 0x84 + 1f554b4: e2855003 add r5, r5, #3 + 1f554b8: e6ff4074 uxth r4, r4 + 1f554bc: e1830400 orr r0, r3, r0, lsl #8 + 1f554c0: 1affffd1 bne 1f5540c + 1f554c4: e3560000 cmp r6, #0 + 1f554c8: 1affffeb bne 1f5547c + 1f554cc: e5d83000 ldrb r3, [r8] + 1f554d0: e1a06000 mov r6, r0 + 1f554d4: e3530000 cmp r3, #0 + 1f554d8: 11500003 cmpne r0, r3 + 1f554dc: 0affffe3 beq 1f55470 + 1f554e0: e28dd024 add sp, sp, #36 ; 0x24 + 1f554e4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f554e8: e2444002 sub r4, r4, #2 + 1f554ec: e1d500d1 ldrsb r0, [r5, #1] + 1f554f0: e2855002 add r5, r5, #2 + 1f554f4: e6ff4074 uxth r4, r4 + 1f554f8: eaffffc0 b 1f55400 + 1f554fc: e58d0000 str r0, [sp] + 1f55500: eaffffdb b 1f55474 + 1f55504: e58d4008 str r4, [sp, #8] + 1f55508: e1a03004 mov r3, r4 + 1f5550c: e58d4004 str r4, [sp, #4] + 1f55510: eaffffdc b 1f55488 + 1f55514: e3500036 cmp r0, #54 ; 0x36 + 1f55518: ca000005 bgt 1f55534 + 1f5551c: e3500030 cmp r0, #48 ; 0x30 + 1f55520: aa000008 bge 1f55548 + 1f55524: e2400004 sub r0, r0, #4 + 1f55528: e3500001 cmp r0, #1 + 1f5552c: 93a0c001 movls ip, #1 + 1f55530: eaffffcf b 1f55474 + 1f55534: e3500039 cmp r0, #57 ; 0x39 + 1f55538: 1affffcd bne 1f55474 + 1f5553c: e35c0001 cmp ip, #1 + 1f55540: 03a0c004 moveq ip, #4 + 1f55544: eaffffca b 1f55474 + 1f55548: e35c0001 cmp ip, #1 + 1f5554c: 03a0c003 moveq ip, #3 + 1f55550: eaffffc7 b 1f55474 + 1f55554: e3520074 cmp r2, #116 ; 0x74 + 1f55558: 01a09000 moveq r9, r0 + 1f5555c: 0affffc4 beq 1f55474 + 1f55560: da000199 ble 1f55bcc + 1f55564: e3520080 cmp r2, #128 ; 0x80 + 1f55568: 0a000002 beq 1f55578 + 1f5556c: e3520094 cmp r2, #148 ; 0x94 + 1f55570: 01a0a000 moveq sl, r0 + 1f55574: eaffffbe b 1f55474 + 1f55578: e2000003 and r0, r0, #3 + 1f5557c: e3500002 cmp r0, #2 + 1f55580: 0a000002 beq 1f55590 + 1f55584: e003099a mul r3, sl, r9 + 1f55588: e0877003 add r7, r7, r3 + 1f5558c: eaffffb8 b 1f55474 + 1f55590: e35c0003 cmp ip, #3 + 1f55594: 0a00000e beq 1f555d4 + 1f55598: e35c0004 cmp ip, #4 + 1f5559c: 0a0000e7 beq 1f55940 + 1f555a0: e35c0002 cmp ip, #2 + 1f555a4: e003099a mul r3, sl, r9 + 1f555a8: 1afffff6 bne 1f55588 + 1f555ac: e1a02003 mov r2, r3 + 1f555b0: e58ba0b0 str sl, [fp, #176] ; 0xb0 + 1f555b4: e1a01007 mov r1, r7 + 1f555b8: e1a00008 mov r0, r8 + 1f555bc: e58d3018 str r3, [sp, #24] + 1f555c0: ebffff25 bl 1f5525c + 1f555c4: e3a0c001 mov ip, #1 + 1f555c8: e58b00b4 str r0, [fp, #180] ; 0xb4 + 1f555cc: e59d3018 ldr r3, [sp, #24] + 1f555d0: eaffffec b 1f55588 + 1f555d4: e35a0000 cmp sl, #0 + 1f555d8: 0a000134 beq 1f55ab0 + 1f555dc: e59d0004 ldr r0, [sp, #4] + 1f555e0: e303c2eb movw ip, #13035 ; 0x32eb + 1f555e4: e34fc8a4 movt ip, #63652 ; 0xf8a4 + 1f555e8: e59d200c ldr r2, [sp, #12] + 1f555ec: e1a03200 lsl r3, r0, #4 + 1f555f0: e59de010 ldr lr, [sp, #16] + 1f555f4: e152000c cmp r2, ip + 1f555f8: e0433100 sub r3, r3, r0, lsl #2 + 1f555fc: e59d0014 ldr r0, [sp, #20] + 1f55600: e1a01002 mov r1, r2 + 1f55604: e303c2eb movw ip, #13035 ; 0x32eb + 1f55608: e34fc8a4 movt ip, #63652 ; 0xf8a4 + 1f5560c: 01a0100e moveq r1, lr + 1f55610: e59de000 ldr lr, [sp] + 1f55614: e150000c cmp r0, ip + 1f55618: e1a02000 mov r2, r0 + 1f5561c: e08b3003 add r3, fp, r3 + 1f55620: 01a0200e moveq r2, lr + 1f55624: e3520000 cmp r2, #0 + 1f55628: e58d3018 str r3, [sp, #24] + 1f5562c: e1a00008 mov r0, r8 + 1f55630: e5831054 str r1, [r3, #84] ; 0x54 + 1f55634: e1a01007 mov r1, r7 + 1f55638: e5832050 str r2, [r3, #80] ; 0x50 + 1f5563c: e1a02009 mov r2, r9 + 1f55640: ba00013b blt 1f55b34 + 1f55644: ebffff04 bl 1f5525c + 1f55648: e59d3018 ldr r3, [sp, #24] + 1f5564c: e35a0001 cmp sl, #1 + 1f55650: e59d2004 ldr r2, [sp, #4] + 1f55654: e583004c str r0, [r3, #76] ; 0x4c + 1f55658: 93a0c001 movls ip, #1 + 1f5565c: e2821001 add r1, r2, #1 + 1f55660: 91a03009 movls r3, r9 + 1f55664: 958d1004 strls r1, [sp, #4] + 1f55668: 9affffc6 bls 1f55588 + 1f5566c: e59dc014 ldr ip, [sp, #20] + 1f55670: e303e2eb movw lr, #13035 ; 0x32eb + 1f55674: e34fe8a4 movt lr, #63652 ; 0xf8a4 + 1f55678: e59d2000 ldr r2, [sp] + 1f5567c: e15c000e cmp ip, lr + 1f55680: e1a0000c mov r0, ip + 1f55684: e59de010 ldr lr, [sp, #16] + 1f55688: 01a00002 moveq r0, r2 + 1f5568c: e1a02201 lsl r2, r1, #4 + 1f55690: e0422101 sub r2, r2, r1, lsl #2 + 1f55694: e583005c str r0, [r3, #92] ; 0x5c + 1f55698: e08b2002 add r2, fp, r2 + 1f5569c: e59d000c ldr r0, [sp, #12] + 1f556a0: e303c2eb movw ip, #13035 ; 0x32eb + 1f556a4: e34fc8a4 movt ip, #63652 ; 0xf8a4 + 1f556a8: e150000c cmp r0, ip + 1f556ac: e1a01000 mov r1, r0 + 1f556b0: 01a0100e moveq r1, lr + 1f556b4: e5821054 str r1, [r2, #84] ; 0x54 + 1f556b8: e58d3018 str r3, [sp, #24] + 1f556bc: e0871009 add r1, r7, r9 + 1f556c0: e593205c ldr r2, [r3, #92] ; 0x5c + 1f556c4: e1a00008 mov r0, r8 + 1f556c8: e3520000 cmp r2, #0 + 1f556cc: e1a02009 mov r2, r9 + 1f556d0: ba00012b blt 1f55b84 + 1f556d4: ebfffee0 bl 1f5525c + 1f556d8: e59d3018 ldr r3, [sp, #24] + 1f556dc: e35a0002 cmp sl, #2 + 1f556e0: e59d2004 ldr r2, [sp, #4] + 1f556e4: e5830058 str r0, [r3, #88] ; 0x58 + 1f556e8: 03a0c001 moveq ip, #1 + 1f556ec: e2821002 add r1, r2, #2 + 1f556f0: 01a03089 lsleq r3, r9, #1 + 1f556f4: 058d1004 streq r1, [sp, #4] + 1f556f8: 0affffa2 beq 1f55588 + 1f556fc: e59dc014 ldr ip, [sp, #20] + 1f55700: e303e2eb movw lr, #13035 ; 0x32eb + 1f55704: e34fe8a4 movt lr, #63652 ; 0xf8a4 + 1f55708: e59d2000 ldr r2, [sp] + 1f5570c: e15c000e cmp ip, lr + 1f55710: e1a0000c mov r0, ip + 1f55714: e59de010 ldr lr, [sp, #16] + 1f55718: 01a00002 moveq r0, r2 + 1f5571c: e1a02201 lsl r2, r1, #4 + 1f55720: e0422101 sub r2, r2, r1, lsl #2 + 1f55724: e5830068 str r0, [r3, #104] ; 0x68 + 1f55728: e08b2002 add r2, fp, r2 + 1f5572c: e59d000c ldr r0, [sp, #12] + 1f55730: e303c2eb movw ip, #13035 ; 0x32eb + 1f55734: e34fc8a4 movt ip, #63652 ; 0xf8a4 + 1f55738: e150000c cmp r0, ip + 1f5573c: e1a01000 mov r1, r0 + 1f55740: 01a0100e moveq r1, lr + 1f55744: e5821054 str r1, [r2, #84] ; 0x54 + 1f55748: e58d301c str r3, [sp, #28] + 1f5574c: e1a00008 mov r0, r8 + 1f55750: e5932068 ldr r2, [r3, #104] ; 0x68 + 1f55754: e1a03089 lsl r3, r9, #1 + 1f55758: e0831007 add r1, r3, r7 + 1f5575c: e58d3018 str r3, [sp, #24] + 1f55760: e3520000 cmp r2, #0 + 1f55764: e1a02009 mov r2, r9 + 1f55768: ba0000fb blt 1f55b5c + 1f5576c: ebfffeba bl 1f5525c + 1f55770: e59d301c ldr r3, [sp, #28] + 1f55774: e59d2004 ldr r2, [sp, #4] + 1f55778: e35a0003 cmp sl, #3 + 1f5577c: e5830064 str r0, [r3, #100] ; 0x64 + 1f55780: e2821003 add r1, r2, #3 + 1f55784: 0a0000c4 beq 1f55a9c + 1f55788: e59dc014 ldr ip, [sp, #20] + 1f5578c: e303e2eb movw lr, #13035 ; 0x32eb + 1f55790: e34fe8a4 movt lr, #63652 ; 0xf8a4 + 1f55794: e59d2000 ldr r2, [sp] + 1f55798: e15c000e cmp ip, lr + 1f5579c: e1a0000c mov r0, ip + 1f557a0: e59de010 ldr lr, [sp, #16] + 1f557a4: 01a00002 moveq r0, r2 + 1f557a8: e1a02201 lsl r2, r1, #4 + 1f557ac: e0422101 sub r2, r2, r1, lsl #2 + 1f557b0: e5830074 str r0, [r3, #116] ; 0x74 + 1f557b4: e08b2002 add r2, fp, r2 + 1f557b8: e59d000c ldr r0, [sp, #12] + 1f557bc: e303c2eb movw ip, #13035 ; 0x32eb + 1f557c0: e34fc8a4 movt ip, #63652 ; 0xf8a4 + 1f557c4: e150000c cmp r0, ip + 1f557c8: e1a01000 mov r1, r0 + 1f557cc: 01a0100e moveq r1, lr + 1f557d0: e5821054 str r1, [r2, #84] ; 0x54 + 1f557d4: e58d301c str r3, [sp, #28] + 1f557d8: e1a00008 mov r0, r8 + 1f557dc: e5932074 ldr r2, [r3, #116] ; 0x74 + 1f557e0: e59d3018 ldr r3, [sp, #24] + 1f557e4: e3520000 cmp r2, #0 + 1f557e8: e1a02009 mov r2, r9 + 1f557ec: e0831009 add r1, r3, r9 + 1f557f0: e0811007 add r1, r1, r7 + 1f557f4: ba0000c4 blt 1f55b0c + 1f557f8: ebfffe97 bl 1f5525c + 1f557fc: e59d301c ldr r3, [sp, #28] + 1f55800: e35a0004 cmp sl, #4 + 1f55804: e59d2004 ldr r2, [sp, #4] + 1f55808: e5830070 str r0, [r3, #112] ; 0x70 + 1f5580c: 03a0c001 moveq ip, #1 + 1f55810: e2821004 add r1, r2, #4 + 1f55814: 01a03109 lsleq r3, r9, #2 + 1f55818: 058d1004 streq r1, [sp, #4] + 1f5581c: 0affff59 beq 1f55588 + 1f55820: e59dc014 ldr ip, [sp, #20] + 1f55824: e303e2eb movw lr, #13035 ; 0x32eb + 1f55828: e34fe8a4 movt lr, #63652 ; 0xf8a4 + 1f5582c: e59d2000 ldr r2, [sp] + 1f55830: e15c000e cmp ip, lr + 1f55834: e1a0000c mov r0, ip + 1f55838: e59de010 ldr lr, [sp, #16] + 1f5583c: 01a00002 moveq r0, r2 + 1f55840: e1a02201 lsl r2, r1, #4 + 1f55844: e0422101 sub r2, r2, r1, lsl #2 + 1f55848: e5830080 str r0, [r3, #128] ; 0x80 + 1f5584c: e08b2002 add r2, fp, r2 + 1f55850: e59d000c ldr r0, [sp, #12] + 1f55854: e303c2eb movw ip, #13035 ; 0x32eb + 1f55858: e34fc8a4 movt ip, #63652 ; 0xf8a4 + 1f5585c: e150000c cmp r0, ip + 1f55860: e1a01000 mov r1, r0 + 1f55864: 01a0100e moveq r1, lr + 1f55868: e5821054 str r1, [r2, #84] ; 0x54 + 1f5586c: e58d301c str r3, [sp, #28] + 1f55870: e1a00008 mov r0, r8 + 1f55874: e5932080 ldr r2, [r3, #128] ; 0x80 + 1f55878: e1a03109 lsl r3, r9, #2 + 1f5587c: e0831007 add r1, r3, r7 + 1f55880: e58d3018 str r3, [sp, #24] + 1f55884: e3520000 cmp r2, #0 + 1f55888: e1a02009 mov r2, r9 + 1f5588c: ba000094 blt 1f55ae4 + 1f55890: ebfffe71 bl 1f5525c + 1f55894: e59d301c ldr r3, [sp, #28] + 1f55898: e59d2004 ldr r2, [sp, #4] + 1f5589c: e35a0005 cmp sl, #5 + 1f558a0: e583007c str r0, [r3, #124] ; 0x7c + 1f558a4: e2821005 add r1, r2, #5 + 1f558a8: 0a00007b beq 1f55a9c + 1f558ac: e59dc014 ldr ip, [sp, #20] + 1f558b0: e303e2eb movw lr, #13035 ; 0x32eb + 1f558b4: e34fe8a4 movt lr, #63652 ; 0xf8a4 + 1f558b8: e59d2000 ldr r2, [sp] + 1f558bc: e15c000e cmp ip, lr + 1f558c0: e1a0000c mov r0, ip + 1f558c4: e59de010 ldr lr, [sp, #16] + 1f558c8: 01a00002 moveq r0, r2 + 1f558cc: e1a02201 lsl r2, r1, #4 + 1f558d0: e0422101 sub r2, r2, r1, lsl #2 + 1f558d4: e583008c str r0, [r3, #140] ; 0x8c + 1f558d8: e08b2002 add r2, fp, r2 + 1f558dc: e59d000c ldr r0, [sp, #12] + 1f558e0: e303c2eb movw ip, #13035 ; 0x32eb + 1f558e4: e34fc8a4 movt ip, #63652 ; 0xf8a4 + 1f558e8: e150000c cmp r0, ip + 1f558ec: e1a01000 mov r1, r0 + 1f558f0: 01a0100e moveq r1, lr + 1f558f4: e5821054 str r1, [r2, #84] ; 0x54 + 1f558f8: e58d301c str r3, [sp, #28] + 1f558fc: e1a00008 mov r0, r8 + 1f55900: e593208c ldr r2, [r3, #140] ; 0x8c + 1f55904: e59d3018 ldr r3, [sp, #24] + 1f55908: e3520000 cmp r2, #0 + 1f5590c: e1a02009 mov r2, r9 + 1f55910: e0831009 add r1, r3, r9 + 1f55914: e0811007 add r1, r1, r7 + 1f55918: ba000067 blt 1f55abc + 1f5591c: ebfffe4e bl 1f5525c + 1f55920: e59d301c ldr r3, [sp, #28] + 1f55924: e59d2004 ldr r2, [sp, #4] + 1f55928: e3a0c001 mov ip, #1 + 1f5592c: e5830088 str r0, [r3, #136] ; 0x88 + 1f55930: e2822006 add r2, r2, #6 + 1f55934: e58d2004 str r2, [sp, #4] + 1f55938: e003099a mul r3, sl, r9 + 1f5593c: eaffff11 b 1f55588 + 1f55940: e35a0000 cmp sl, #0 + 1f55944: 0a000059 beq 1f55ab0 + 1f55948: e59d3008 ldr r3, [sp, #8] + 1f5594c: e1a02009 mov r2, r9 + 1f55950: e1a01007 mov r1, r7 + 1f55954: e1a00008 mov r0, r8 + 1f55958: e08b3103 add r3, fp, r3, lsl #2 + 1f5595c: e58d3018 str r3, [sp, #24] + 1f55960: ebfffe3d bl 1f5525c + 1f55964: e59d2018 ldr r2, [sp, #24] + 1f55968: e35a0001 cmp sl, #1 + 1f5596c: e59d3008 ldr r3, [sp, #8] + 1f55970: 93a0c001 movls ip, #1 + 1f55974: e2833001 add r3, r3, #1 + 1f55978: e5820098 str r0, [r2, #152] ; 0x98 + 1f5597c: 958d3008 strls r3, [sp, #8] + 1f55980: 91a03009 movls r3, r9 + 1f55984: 9afffeff bls 1f55588 + 1f55988: e0873009 add r3, r7, r9 + 1f5598c: e1a02009 mov r2, r9 + 1f55990: e1a01003 mov r1, r3 + 1f55994: e1a00008 mov r0, r8 + 1f55998: e58d301c str r3, [sp, #28] + 1f5599c: ebfffe2e bl 1f5525c + 1f559a0: e59d3018 ldr r3, [sp, #24] + 1f559a4: e35a0002 cmp sl, #2 + 1f559a8: 03a0c001 moveq ip, #1 + 1f559ac: e583009c str r0, [r3, #156] ; 0x9c + 1f559b0: e59d3008 ldr r3, [sp, #8] + 1f559b4: e2832002 add r2, r3, #2 + 1f559b8: e59d301c ldr r3, [sp, #28] + 1f559bc: 058d2008 streq r2, [sp, #8] + 1f559c0: 01a03089 lsleq r3, r9, #1 + 1f559c4: 0afffeef beq 1f55588 + 1f559c8: e0893003 add r3, r9, r3 + 1f559cc: e1a02009 mov r2, r9 + 1f559d0: e1a01003 mov r1, r3 + 1f559d4: e1a00008 mov r0, r8 + 1f559d8: e58d301c str r3, [sp, #28] + 1f559dc: ebfffe1e bl 1f5525c + 1f559e0: e59d3018 ldr r3, [sp, #24] + 1f559e4: e35a0003 cmp sl, #3 + 1f559e8: e58300a0 str r0, [r3, #160] ; 0xa0 + 1f559ec: e59d3008 ldr r3, [sp, #8] + 1f559f0: e2832003 add r2, r3, #3 + 1f559f4: e59d301c ldr r3, [sp, #28] + 1f559f8: 0a00006f beq 1f55bbc + 1f559fc: e0893003 add r3, r9, r3 + 1f55a00: e1a02009 mov r2, r9 + 1f55a04: e1a01003 mov r1, r3 + 1f55a08: e1a00008 mov r0, r8 + 1f55a0c: e58d301c str r3, [sp, #28] + 1f55a10: ebfffe11 bl 1f5525c + 1f55a14: e59d3018 ldr r3, [sp, #24] + 1f55a18: e35a0004 cmp sl, #4 + 1f55a1c: 03a0c001 moveq ip, #1 + 1f55a20: e58300a4 str r0, [r3, #164] ; 0xa4 + 1f55a24: e59d3008 ldr r3, [sp, #8] + 1f55a28: e2832004 add r2, r3, #4 + 1f55a2c: e59d301c ldr r3, [sp, #28] + 1f55a30: 058d2008 streq r2, [sp, #8] + 1f55a34: 01a03109 lsleq r3, r9, #2 + 1f55a38: 0afffed2 beq 1f55588 + 1f55a3c: e0893003 add r3, r9, r3 + 1f55a40: e1a02009 mov r2, r9 + 1f55a44: e1a01003 mov r1, r3 + 1f55a48: e1a00008 mov r0, r8 + 1f55a4c: e58d301c str r3, [sp, #28] + 1f55a50: ebfffe01 bl 1f5525c + 1f55a54: e59d3018 ldr r3, [sp, #24] + 1f55a58: e35a0005 cmp sl, #5 + 1f55a5c: e58300a8 str r0, [r3, #168] ; 0xa8 + 1f55a60: e59d3008 ldr r3, [sp, #8] + 1f55a64: e2832005 add r2, r3, #5 + 1f55a68: e59d301c ldr r3, [sp, #28] + 1f55a6c: 0a00004e beq 1f55bac + 1f55a70: e0891003 add r1, r9, r3 + 1f55a74: e59d3008 ldr r3, [sp, #8] + 1f55a78: e1a02009 mov r2, r9 + 1f55a7c: e1a00008 mov r0, r8 + 1f55a80: e2833006 add r3, r3, #6 + 1f55a84: e58d3008 str r3, [sp, #8] + 1f55a88: ebfffdf3 bl 1f5525c + 1f55a8c: e59d3018 ldr r3, [sp, #24] + 1f55a90: e3a0c001 mov ip, #1 + 1f55a94: e58300ac str r0, [r3, #172] ; 0xac + 1f55a98: eafffeb9 b 1f55584 + 1f55a9c: e59d3018 ldr r3, [sp, #24] + 1f55aa0: e3a0c001 mov ip, #1 + 1f55aa4: e58d1004 str r1, [sp, #4] + 1f55aa8: e0833009 add r3, r3, r9 + 1f55aac: eafffeb5 b 1f55588 + 1f55ab0: e1a0300a mov r3, sl + 1f55ab4: e3a0c001 mov ip, #1 + 1f55ab8: eafffeb2 b 1f55588 + 1f55abc: ebfffde6 bl 1f5525c + 1f55ac0: e2492001 sub r2, r9, #1 + 1f55ac4: e3a03001 mov r3, #1 + 1f55ac8: e0103213 ands r3, r0, r3, lsl r2 + 1f55acc: e59d301c ldr r3, [sp, #28] + 1f55ad0: 13a02001 movne r2, #1 + 1f55ad4: 11a02912 lslne r2, r2, r9 + 1f55ad8: 12622000 rsbne r2, r2, #0 + 1f55adc: 11800002 orrne r0, r0, r2 + 1f55ae0: eaffff8f b 1f55924 + 1f55ae4: ebfffddc bl 1f5525c + 1f55ae8: e2492001 sub r2, r9, #1 + 1f55aec: e3a03001 mov r3, #1 + 1f55af0: e0103213 ands r3, r0, r3, lsl r2 + 1f55af4: e59d301c ldr r3, [sp, #28] + 1f55af8: 13a02001 movne r2, #1 + 1f55afc: 11a02912 lslne r2, r2, r9 + 1f55b00: 12622000 rsbne r2, r2, #0 + 1f55b04: 11800002 orrne r0, r0, r2 + 1f55b08: eaffff62 b 1f55898 + 1f55b0c: ebfffdd2 bl 1f5525c + 1f55b10: e2492001 sub r2, r9, #1 + 1f55b14: e3a03001 mov r3, #1 + 1f55b18: e0103213 ands r3, r0, r3, lsl r2 + 1f55b1c: e59d301c ldr r3, [sp, #28] + 1f55b20: 13a02001 movne r2, #1 + 1f55b24: 11a02912 lslne r2, r2, r9 + 1f55b28: 12622000 rsbne r2, r2, #0 + 1f55b2c: 11800002 orrne r0, r0, r2 + 1f55b30: eaffff32 b 1f55800 + 1f55b34: ebfffdc8 bl 1f5525c + 1f55b38: e2492001 sub r2, r9, #1 + 1f55b3c: e3a03001 mov r3, #1 + 1f55b40: e0103213 ands r3, r0, r3, lsl r2 + 1f55b44: e59d3018 ldr r3, [sp, #24] + 1f55b48: 13a02001 movne r2, #1 + 1f55b4c: 11a02912 lslne r2, r2, r9 + 1f55b50: 12622000 rsbne r2, r2, #0 + 1f55b54: 11800002 orrne r0, r0, r2 + 1f55b58: eafffebb b 1f5564c + 1f55b5c: ebfffdbe bl 1f5525c + 1f55b60: e2492001 sub r2, r9, #1 + 1f55b64: e3a03001 mov r3, #1 + 1f55b68: e0103213 ands r3, r0, r3, lsl r2 + 1f55b6c: e59d301c ldr r3, [sp, #28] + 1f55b70: 13a02001 movne r2, #1 + 1f55b74: 11a02912 lslne r2, r2, r9 + 1f55b78: 12622000 rsbne r2, r2, #0 + 1f55b7c: 11800002 orrne r0, r0, r2 + 1f55b80: eafffefb b 1f55774 + 1f55b84: ebfffdb4 bl 1f5525c + 1f55b88: e2492001 sub r2, r9, #1 + 1f55b8c: e3a03001 mov r3, #1 + 1f55b90: e0103213 ands r3, r0, r3, lsl r2 + 1f55b94: e59d3018 ldr r3, [sp, #24] + 1f55b98: 13a02001 movne r2, #1 + 1f55b9c: 11a02912 lslne r2, r2, r9 + 1f55ba0: 12622000 rsbne r2, r2, #0 + 1f55ba4: 11800002 orrne r0, r0, r2 + 1f55ba8: eafffecb b 1f556dc + 1f55bac: e58d2008 str r2, [sp, #8] + 1f55bb0: e0893109 add r3, r9, r9, lsl #2 + 1f55bb4: e3a0c001 mov ip, #1 + 1f55bb8: eafffe72 b 1f55588 + 1f55bbc: e58d2008 str r2, [sp, #8] + 1f55bc0: e0893089 add r3, r9, r9, lsl #1 + 1f55bc4: e3a0c001 mov ip, #1 + 1f55bc8: eafffe6e b 1f55588 + 1f55bcc: e59d3010 ldr r3, [sp, #16] + 1f55bd0: e3520044 cmp r2, #68 ; 0x44 + 1f55bd4: 01a03000 moveq r3, r0 + 1f55bd8: e58d3010 str r3, [sp, #16] + 1f55bdc: eafffe24 b 1f55474 + 1f55be0: e3520004 cmp r2, #4 + 1f55be4: 1afffe22 bne 1f55474 + 1f55be8: e3500009 cmp r0, #9 + 1f55bec: 1afffe20 bne 1f55474 + 1f55bf0: e35c0001 cmp ip, #1 + 1f55bf4: 03a0c002 moveq ip, #2 + 1f55bf8: eafffe1d b 1f55474 + +01f55bfc : + 1f55bfc: e92d40f0 push {r4, r5, r6, r7, lr} + 1f55c00: e3a01002 mov r1, #2 + 1f55c04: e1a04000 mov r4, r0 + 1f55c08: e24dd024 sub sp, sp, #36 ; 0x24 + 1f55c0c: ebffe68a bl 1f4f63c + 1f55c10: e3500000 cmp r0, #0 + 1f55c14: 0a000002 beq 1f55c24 + 1f55c18: e5d03004 ldrb r3, [r0, #4] + 1f55c1c: e3530000 cmp r3, #0 + 1f55c20: 1a000007 bne 1f55c44 + 1f55c24: e3a05000 mov r5, #0 + 1f55c28: e1a00004 mov r0, r4 + 1f55c2c: e30318f0 movw r1, #14576 ; 0x38f0 + 1f55c30: e34011f6 movt r1, #502 ; 0x1f6 + 1f55c34: ebffe682 bl 1f4f644 + 1f55c38: e1a00005 mov r0, r5 + 1f55c3c: e28dd024 add sp, sp, #36 ; 0x24 + 1f55c40: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f55c44: e3a01004 mov r1, #4 + 1f55c48: e1a00004 mov r0, r4 + 1f55c4c: ebffe67a bl 1f4f63c + 1f55c50: e2503000 subs r3, r0, #0 + 1f55c54: 0afffff2 beq 1f55c24 + 1f55c58: e5d32004 ldrb r2, [r3, #4] + 1f55c5c: e3520000 cmp r2, #0 + 1f55c60: 0affffef beq 1f55c24 + 1f55c64: e5d32005 ldrb r2, [r3, #5] + 1f55c68: e3520003 cmp r2, #3 + 1f55c6c: 1affffec bne 1f55c24 + 1f55c70: e5d32006 ldrb r2, [r3, #6] + 1f55c74: e3520000 cmp r2, #0 + 1f55c78: 1affffe9 bne 1f55c24 + 1f55c7c: e5d32007 ldrb r2, [r3, #7] + 1f55c80: e3520000 cmp r2, #0 + 1f55c84: 1affffe6 bne 1f55c24 + 1f55c88: e5d32002 ldrb r2, [r3, #2] + 1f55c8c: e3a01021 mov r1, #33 ; 0x21 + 1f55c90: e5c4203c strb r2, [r4, #60] ; 0x3c + 1f55c94: e1a00004 mov r0, r4 + 1f55c98: e5d33003 ldrb r3, [r3, #3] + 1f55c9c: e5c4303d strb r3, [r4, #61] ; 0x3d + 1f55ca0: ebffe665 bl 1f4f63c + 1f55ca4: e2507000 subs r7, r0, #0 + 1f55ca8: 0affffdd beq 1f55c24 + 1f55cac: e1d730b7 ldrh r3, [r7, #7] + 1f55cb0: e3530000 cmp r3, #0 + 1f55cb4: 1a000004 bne 1f55ccc + 1f55cb8: eaffffd9 b 1f55c24 + 1f55cbc: e5d63003 ldrb r3, [r6, #3] + 1f55cc0: e203303f and r3, r3, #63 ; 0x3f + 1f55cc4: e3530003 cmp r3, #3 + 1f55cc8: 0a000029 beq 1f55d74 + 1f55ccc: e3a01005 mov r1, #5 + 1f55cd0: e1a00004 mov r0, r4 + 1f55cd4: ebffe658 bl 1f4f63c + 1f55cd8: e2506000 subs r6, r0, #0 + 1f55cdc: 1afffff6 bne 1f55cbc + 1f55ce0: e5945040 ldr r5, [r4, #64] ; 0x40 + 1f55ce4: e3550000 cmp r5, #0 + 1f55ce8: 0a000074 beq 1f55ec0 + 1f55cec: e1d700b7 ldrh r0, [r7, #7] + 1f55cf0: e1c40bbc strh r0, [r4, #188] ; 0xbc + 1f55cf4: ebffa21b bl 1f3e568 + 1f55cf8: e58400c0 str r0, [r4, #192] ; 0xc0 + 1f55cfc: e1a00004 mov r0, r4 + 1f55d00: ebffe647 bl 1f4f624 + 1f55d04: e1a05000 mov r5, r0 + 1f55d08: e1a00004 mov r0, r4 + 1f55d0c: ebffe642 bl 1f4f61c + 1f55d10: e1d730b7 ldrh r3, [r7, #7] + 1f55d14: e59420c0 ldr r2, [r4, #192] ; 0xc0 + 1f55d18: e1a01000 mov r1, r0 + 1f55d1c: e5d4c03c ldrb ip, [r4, #60] ; 0x3c + 1f55d20: e1a00005 mov r0, r5 + 1f55d24: e58d300c str r3, [sp, #12] + 1f55d28: e3a03006 mov r3, #6 + 1f55d2c: e58d2008 str r2, [sp, #8] + 1f55d30: e3a02081 mov r2, #129 ; 0x81 + 1f55d34: e58dc004 str ip, [sp, #4] + 1f55d38: e5d7c006 ldrb ip, [r7, #6] + 1f55d3c: e1a0c40c lsl ip, ip, #8 + 1f55d40: e58dc000 str ip, [sp] + 1f55d44: ebffe077 bl 1f4df28 + 1f55d48: e1d730b7 ldrh r3, [r7, #7] + 1f55d4c: e1500003 cmp r0, r3 + 1f55d50: 130328f8 movwne r2, #14584 ; 0x38f8 + 1f55d54: 134021f6 movtne r2, #502 ; 0x1f6 + 1f55d58: 0a000012 beq 1f55da8 + 1f55d5c: e30308f0 movw r0, #14576 ; 0x38f0 + 1f55d60: e34001f6 movt r0, #502 ; 0x1f6 + 1f55d64: e3a01001 mov r1, #1 + 1f55d68: e1a05006 mov r5, r6 + 1f55d6c: ebfead45 bl 1f01288 + 1f55d70: eaffffb0 b 1f55c38 + 1f55d74: e1d630d2 ldrsb r3, [r6, #2] + 1f55d78: e3a00018 mov r0, #24 + 1f55d7c: e3530000 cmp r3, #0 + 1f55d80: ba000045 blt 1f55e9c + 1f55d84: e5943044 ldr r3, [r4, #68] ; 0x44 + 1f55d88: e3530000 cmp r3, #0 + 1f55d8c: 1affffa4 bne 1f55c24 + 1f55d90: ebffa1f4 bl 1f3e568 + 1f55d94: e1a02006 mov r2, r6 + 1f55d98: e5840044 str r0, [r4, #68] ; 0x44 + 1f55d9c: e1a01004 mov r1, r4 + 1f55da0: ebffe636 bl 1f4f680 + 1f55da4: eaffffc8 b 1f55ccc + 1f55da8: e59430c8 ldr r3, [r4, #200] ; 0xc8 + 1f55dac: e1a00004 mov r0, r4 + 1f55db0: e5c36000 strb r6, [r3] + 1f55db4: ebfffd69 bl 1f55360 + 1f55db8: e1a00004 mov r0, r4 + 1f55dbc: ebffe478 bl 1f4efa4 + 1f55dc0: e2505000 subs r5, r0, #0 + 1f55dc4: 0a000092 beq 1f56014 + 1f55dc8: e5d4303d ldrb r3, [r4, #61] ; 0x3d + 1f55dcc: e3530000 cmp r3, #0 + 1f55dd0: 1a00003f bne 1f55ed4 + 1f55dd4: e3053ca0 movw r3, #23712 ; 0x5ca0 + 1f55dd8: e34031f6 movt r3, #502 ; 0x1f6 + 1f55ddc: e5941014 ldr r1, [r4, #20] + 1f55de0: e300054c movw r0, #1356 ; 0x54c + 1f55de4: e5932000 ldr r2, [r3] + 1f55de8: e5842038 str r2, [r4, #56] ; 0x38 + 1f55dec: e2822001 add r2, r2, #1 + 1f55df0: e5832000 str r2, [r3] + 1f55df4: e1d130b8 ldrh r3, [r1, #8] + 1f55df8: e1530000 cmp r3, r0 + 1f55dfc: 0a000049 beq 1f55f28 + 1f55e00: e28d0014 add r0, sp, #20 + 1f55e04: e3a05000 mov r5, #0 + 1f55e08: ebffee62 bl 1f51798 + 1f55e0c: e5942038 ldr r2, [r4, #56] ; 0x38 + 1f55e10: e28d0014 add r0, sp, #20 + 1f55e14: e3031248 movw r1, #12872 ; 0x3248 + 1f55e18: e34011f6 movt r1, #502 ; 0x1f6 + 1f55e1c: ebfff256 bl 1f5277c + 1f55e20: ebffe704 bl 1f4fa38 + 1f55e24: e1a06000 mov r6, r0 + 1f55e28: e28d0014 add r0, sp, #20 + 1f55e2c: ebffee74 bl 1f51804 + 1f55e30: e1a03005 mov r3, r5 + 1f55e34: e1a01000 mov r1, r0 + 1f55e38: e1a02004 mov r2, r4 + 1f55e3c: e1a00006 mov r0, r6 + 1f55e40: ebffe6d2 bl 1f4f990 + 1f55e44: e28d0014 add r0, sp, #20 + 1f55e48: ebffee63 bl 1f517dc <_String> + 1f55e4c: e3a00024 mov r0, #36 ; 0x24 + 1f55e50: ebffa1c4 bl 1f3e568 + 1f55e54: e1d43cbc ldrh r3, [r4, #204] ; 0xcc + 1f55e58: e59420c8 ldr r2, [r4, #200] ; 0xc8 + 1f55e5c: e5941040 ldr r1, [r4, #64] ; 0x40 + 1f55e60: e58400c4 str r0, [r4, #196] ; 0xc4 + 1f55e64: e58d5000 str r5, [sp] + 1f55e68: ebffe67e bl 1f4f868 + 1f55e6c: e1a02005 mov r2, r5 + 1f55e70: e1a03004 mov r3, r4 + 1f55e74: e59400c4 ldr r0, [r4, #196] ; 0xc4 + 1f55e78: e3061030 movw r1, #24624 ; 0x6030 + 1f55e7c: e34011f5 movt r1, #501 ; 0x1f5 + 1f55e80: ebffe69b bl 1f4f8f4 + 1f55e84: e1a00004 mov r0, r4 + 1f55e88: ebffe5e5 bl 1f4f624 + 1f55e8c: e59410c4 ldr r1, [r4, #196] ; 0xc4 + 1f55e90: ebffdf1f bl 1f4db14 + 1f55e94: e1a05000 mov r5, r0 + 1f55e98: eaffff66 b 1f55c38 + 1f55e9c: e5943040 ldr r3, [r4, #64] ; 0x40 + 1f55ea0: e3530000 cmp r3, #0 + 1f55ea4: 1affff5e bne 1f55c24 + 1f55ea8: ebffa1ae bl 1f3e568 + 1f55eac: e1a02006 mov r2, r6 + 1f55eb0: e5840040 str r0, [r4, #64] ; 0x40 + 1f55eb4: e1a01004 mov r1, r4 + 1f55eb8: ebffe5f0 bl 1f4f680 + 1f55ebc: eaffff82 b 1f55ccc + 1f55ec0: e1a00004 mov r0, r4 + 1f55ec4: e30318f0 movw r1, #14576 ; 0x38f0 + 1f55ec8: e34011f6 movt r1, #502 ; 0x1f6 + 1f55ecc: ebffe5dc bl 1f4f644 + 1f55ed0: eaffff58 b 1f55c38 + 1f55ed4: e1a00004 mov r0, r4 + 1f55ed8: ebffe5d1 bl 1f4f624 + 1f55edc: e1a05000 mov r5, r0 + 1f55ee0: e1a00004 mov r0, r4 + 1f55ee4: ebffe5cc bl 1f4f61c + 1f55ee8: e5d4203c ldrb r2, [r4, #60] ; 0x3c + 1f55eec: e5d4c03d ldrb ip, [r4, #61] ; 0x3d + 1f55ef0: e1a01000 mov r1, r0 + 1f55ef4: e58d2004 str r2, [sp, #4] + 1f55ef8: e1a00005 mov r0, r5 + 1f55efc: e58d600c str r6, [sp, #12] + 1f55f00: e3a0300b mov r3, #11 + 1f55f04: e58d6008 str r6, [sp, #8] + 1f55f08: e3a02001 mov r2, #1 + 1f55f0c: e58dc000 str ip, [sp] + 1f55f10: ebffe004 bl 1f4df28 + 1f55f14: e3500000 cmp r0, #0 + 1f55f18: aaffffad bge 1f55dd4 + 1f55f1c: e30327f8 movw r2, #14328 ; 0x37f8 + 1f55f20: e34021f6 movt r2, #502 ; 0x1f6 + 1f55f24: eaffff8c b 1f55d5c + 1f55f28: e1d130ba ldrh r3, [r1, #10] + 1f55f2c: e3530f9a cmp r3, #616 ; 0x268 + 1f55f30: 1affffb2 bne 1f55e00 + 1f55f34: e59420c8 ldr r2, [r4, #200] ; 0xc8 + 1f55f38: e3a0c042 mov ip, #66 ; 0x42 + 1f55f3c: e3a0100c mov r1, #12 + 1f55f40: e3a03000 mov r3, #0 + 1f55f44: e1a00004 mov r0, r4 + 1f55f48: e3055ca8 movw r5, #23720 ; 0x5ca8 + 1f55f4c: e34051f6 movt r5, #502 ; 0x1f6 + 1f55f50: e5c2c000 strb ip, [r2] + 1f55f54: e59420c8 ldr r2, [r4, #200] ; 0xc8 + 1f55f58: e5c21001 strb r1, [r2, #1] + 1f55f5c: e59420c8 ldr r2, [r4, #200] ; 0xc8 + 1f55f60: e5c23002 strb r3, [r2, #2] + 1f55f64: e59420c8 ldr r2, [r4, #200] ; 0xc8 + 1f55f68: e5c23003 strb r3, [r2, #3] + 1f55f6c: ebffe5ac bl 1f4f624 + 1f55f70: e1a06000 mov r6, r0 + 1f55f74: e1a00004 mov r0, r4 + 1f55f78: ebffe5a7 bl 1f4f61c + 1f55f7c: e59420c8 ldr r2, [r4, #200] ; 0xc8 + 1f55f80: e5d4303c ldrb r3, [r4, #60] ; 0x3c + 1f55f84: e1a01000 mov r1, r0 + 1f55f88: e58d2008 str r2, [sp, #8] + 1f55f8c: e1a00006 mov r0, r6 + 1f55f90: e58d3004 str r3, [sp, #4] + 1f55f94: e3a02004 mov r2, #4 + 1f55f98: e3a03ffd mov r3, #1012 ; 0x3f4 + 1f55f9c: e58d200c str r2, [sp, #12] + 1f55fa0: e58d3000 str r3, [sp] + 1f55fa4: e3a02021 mov r2, #33 ; 0x21 + 1f55fa8: e3a03009 mov r3, #9 + 1f55fac: ebffdfdd bl 1f4df28 + 1f55fb0: e5941038 ldr r1, [r4, #56] ; 0x38 + 1f55fb4: e30328e8 movw r2, #14568 ; 0x38e8 + 1f55fb8: e34021f6 movt r2, #502 ; 0x1f6 + 1f55fbc: e5d53009 ldrb r3, [r5, #9] + 1f55fc0: e1a00004 mov r0, r4 + 1f55fc4: e7d22001 ldrb r2, [r2, r1] + 1f55fc8: e1833082 orr r3, r3, r2, lsl #1 + 1f55fcc: e5c53009 strb r3, [r5, #9] + 1f55fd0: ebffe593 bl 1f4f624 + 1f55fd4: e1a06000 mov r6, r0 + 1f55fd8: e1a00004 mov r0, r4 + 1f55fdc: ebffe58e bl 1f4f61c + 1f55fe0: e5d4303c ldrb r3, [r4, #60] ; 0x3c + 1f55fe4: e1a01000 mov r1, r0 + 1f55fe8: e58d3004 str r3, [sp, #4] + 1f55fec: e3002201 movw r2, #513 ; 0x201 + 1f55ff0: e3a03030 mov r3, #48 ; 0x30 + 1f55ff4: e58d2000 str r2, [sp] + 1f55ff8: e1a00006 mov r0, r6 + 1f55ffc: e58d300c str r3, [sp, #12] + 1f56000: e3a02021 mov r2, #33 ; 0x21 + 1f56004: e58d5008 str r5, [sp, #8] + 1f56008: e3a03009 mov r3, #9 + 1f5600c: ebffdfc5 bl 1f4df28 + 1f56010: eaffff7a b 1f55e00 + 1f56014: e303250c movw r2, #13580 ; 0x350c + 1f56018: e34021f6 movt r2, #502 ; 0x1f6 + 1f5601c: e30308f0 movw r0, #14576 ; 0x38f0 + 1f56020: e34001f6 movt r0, #502 ; 0x1f6 + 1f56024: e3a01001 mov r1, #1 + 1f56028: ebfeac96 bl 1f01288 + 1f5602c: eaffff01 b 1f55c38 + +01f56030 : + 1f56030: e92d4030 push {r4, r5, lr} + 1f56034: e1a04002 mov r4, r2 + 1f56038: e1a05000 mov r5, r0 + 1f5603c: e24dd00c sub sp, sp, #12 + 1f56040: ebffe621 bl 1f4f8cc + 1f56044: e3500000 cmp r0, #0 + 1f56048: 1a000019 bne 1f560b4 + 1f5604c: e59400c4 ldr r0, [r4, #196] ; 0xc4 + 1f56050: e3a05000 mov r5, #0 + 1f56054: ebffe610 bl 1f4f89c <_USBRequest> + 1f56058: e59400c4 ldr r0, [r4, #196] ; 0xc4 + 1f5605c: ebffa149 bl 1f3e588 + 1f56060: e58450c4 str r5, [r4, #196] ; 0xc4 + 1f56064: e3a00024 mov r0, #36 ; 0x24 + 1f56068: ebffa13e bl 1f3e568 + 1f5606c: e1d43cbc ldrh r3, [r4, #204] ; 0xcc + 1f56070: e59420c8 ldr r2, [r4, #200] ; 0xc8 + 1f56074: e5941040 ldr r1, [r4, #64] ; 0x40 + 1f56078: e58400c4 str r0, [r4, #196] ; 0xc4 + 1f5607c: e58d5000 str r5, [sp] + 1f56080: ebffe5f8 bl 1f4f868 + 1f56084: e1a03004 mov r3, r4 + 1f56088: e1a02005 mov r2, r5 + 1f5608c: e59400c4 ldr r0, [r4, #196] ; 0xc4 + 1f56090: e3061030 movw r1, #24624 ; 0x6030 + 1f56094: e34011f5 movt r1, #501 ; 0x1f5 + 1f56098: ebffe615 bl 1f4f8f4 + 1f5609c: e1a00004 mov r0, r4 + 1f560a0: ebffe55f bl 1f4f624 + 1f560a4: e59410c4 ldr r1, [r4, #196] ; 0xc4 + 1f560a8: e28dd00c add sp, sp, #12 + 1f560ac: e8bd4030 pop {r4, r5, lr} + 1f560b0: eaffde97 b 1f4db14 + 1f560b4: e1a00005 mov r0, r5 + 1f560b8: ebffe605 bl 1f4f8d4 + 1f560bc: e3500000 cmp r0, #0 + 1f560c0: 0affffe1 beq 1f5604c + 1f560c4: e59430c0 ldr r3, [r4, #192] ; 0xc0 + 1f560c8: e3530000 cmp r3, #0 + 1f560cc: 0affffde beq 1f5604c + 1f560d0: e59430b8 ldr r3, [r4, #184] ; 0xb8 + 1f560d4: e3530000 cmp r3, #0 + 1f560d8: 0affffdb beq 1f5604c + 1f560dc: e1a00004 mov r0, r4 + 1f560e0: ebfffc9e bl 1f55360 + 1f560e4: e5940038 ldr r0, [r4, #56] ; 0x38 + 1f560e8: e59430b8 ldr r3, [r4, #184] ; 0xb8 + 1f560ec: e2841048 add r1, r4, #72 ; 0x48 + 1f560f0: e2400001 sub r0, r0, #1 + 1f560f4: e12fff33 blx r3 + 1f560f8: eaffffd3 b 1f5604c + +01f560fc : + 1f560fc: e92d4010 push {r4, lr} + 1f56100: e1a04000 mov r4, r0 + 1f56104: ebffe3db bl 1f4f078 + 1f56108: f2c00050 vmov.i32 q8, #0 ; 0x00000000 + 1f5610c: e284e04c add lr, r4, #76 ; 0x4c + 1f56110: e284c05c add ip, r4, #92 ; 0x5c + 1f56114: e284106c add r1, r4, #108 ; 0x6c + 1f56118: e2842098 add r2, r4, #152 ; 0x98 + 1f5611c: e3053bfc movw r3, #23548 ; 0x5bfc + 1f56120: e34031f5 movt r3, #501 ; 0x1f5 + 1f56124: e5843000 str r3, [r4] + 1f56128: e3a00040 mov r0, #64 ; 0x40 + 1f5612c: e3a03000 mov r3, #0 + 1f56130: e5843040 str r3, [r4, #64] ; 0x40 + 1f56134: e5843044 str r3, [r4, #68] ; 0x44 + 1f56138: e58430b8 str r3, [r4, #184] ; 0xb8 + 1f5613c: e58430c4 str r3, [r4, #196] ; 0xc4 + 1f56140: e58430c0 str r3, [r4, #192] ; 0xc0 + 1f56144: e1c43bbc strh r3, [r4, #188] ; 0xbc + 1f56148: e1c43cbc strh r3, [r4, #204] ; 0xcc + 1f5614c: e5843048 str r3, [r4, #72] ; 0x48 + 1f56150: f44e0a8f vst1.32 {d16-d17}, [lr] + 1f56154: f44c0a8f vst1.32 {d16-d17}, [ip] + 1f56158: f4410a8f vst1.32 {d16-d17}, [r1] + 1f5615c: e584307c str r3, [r4, #124] ; 0x7c + 1f56160: e5843080 str r3, [r4, #128] ; 0x80 + 1f56164: e5843084 str r3, [r4, #132] ; 0x84 + 1f56168: e5843088 str r3, [r4, #136] ; 0x88 + 1f5616c: e584308c str r3, [r4, #140] ; 0x8c + 1f56170: e5843090 str r3, [r4, #144] ; 0x90 + 1f56174: e5843094 str r3, [r4, #148] ; 0x94 + 1f56178: f4420a8f vst1.32 {d16-d17}, [r2] + 1f5617c: e58430a8 str r3, [r4, #168] ; 0xa8 + 1f56180: e58430ac str r3, [r4, #172] ; 0xac + 1f56184: e58430b0 str r3, [r4, #176] ; 0xb0 + 1f56188: e58430b4 str r3, [r4, #180] ; 0xb4 + 1f5618c: ebffa0f5 bl 1f3e568 + 1f56190: e58400c8 str r0, [r4, #200] ; 0xc8 + 1f56194: e8bd8010 pop {r4, pc} + +01f56198 <_CUSBGamePadDevice>: + 1f56198: e92d4010 push {r4, lr} + 1f5619c: e1a04000 mov r4, r0 + 1f561a0: e59000c0 ldr r0, [r0, #192] ; 0xc0 + 1f561a4: e3500000 cmp r0, #0 + 1f561a8: 0a000002 beq 1f561b8 <_CUSBGamePadDevice+0x20> + 1f561ac: ebffa0f5 bl 1f3e588 + 1f561b0: e3a03000 mov r3, #0 + 1f561b4: e58430c0 str r3, [r4, #192] ; 0xc0 + 1f561b8: e59400c8 ldr r0, [r4, #200] ; 0xc8 + 1f561bc: e3500000 cmp r0, #0 + 1f561c0: 0a000002 beq 1f561d0 <_CUSBGamePadDevice+0x38> + 1f561c4: ebffa0ef bl 1f3e588 + 1f561c8: e3a03000 mov r3, #0 + 1f561cc: e58430c8 str r3, [r4, #200] ; 0xc8 + 1f561d0: e5940040 ldr r0, [r4, #64] ; 0x40 + 1f561d4: e3500000 cmp r0, #0 + 1f561d8: 0a000004 beq 1f561f0 <_CUSBGamePadDevice+0x58> + 1f561dc: ebffe574 bl 1f4f7b4 <_USBEndpoint> + 1f561e0: e5940040 ldr r0, [r4, #64] ; 0x40 + 1f561e4: ebffa0e7 bl 1f3e588 + 1f561e8: e3a03000 mov r3, #0 + 1f561ec: e5843040 str r3, [r4, #64] ; 0x40 + 1f561f0: e5940044 ldr r0, [r4, #68] ; 0x44 + 1f561f4: e3500000 cmp r0, #0 + 1f561f8: 0a000004 beq 1f56210 <_CUSBGamePadDevice+0x78> + 1f561fc: ebffe56c bl 1f4f7b4 <_USBEndpoint> + 1f56200: e5940044 ldr r0, [r4, #68] ; 0x44 + 1f56204: ebffa0df bl 1f3e588 + 1f56208: e3a03000 mov r3, #0 + 1f5620c: e5843044 str r3, [r4, #68] ; 0x44 + 1f56210: e1a00004 mov r0, r4 + 1f56214: e8bd4010 pop {r4, lr} + 1f56218: eaffe3d3 b 1f4f16c <_USBDevice> + +01f5621c : + 1f5621c: e58010b8 str r1, [r0, #184] ; 0xb8 + 1f56220: e12fff1e bx lr + +01f56224 : + 1f56224: e92d4030 push {r4, r5, lr} + 1f56228: e1a04000 mov r4, r0 + 1f5622c: e24dd014 sub sp, sp, #20 + 1f56230: ebffe4fb bl 1f4f624 + 1f56234: e1a05000 mov r5, r0 + 1f56238: e1a00004 mov r0, r4 + 1f5623c: ebffe4f6 bl 1f4f61c + 1f56240: e1d4ccbc ldrh ip, [r4, #204] ; 0xcc + 1f56244: e59430c8 ldr r3, [r4, #200] ; 0xc8 + 1f56248: e1a01000 mov r1, r0 + 1f5624c: e5d4203c ldrb r2, [r4, #60] ; 0x3c + 1f56250: e1a00005 mov r0, r5 + 1f56254: e58dc00c str ip, [sp, #12] + 1f56258: e3a0cc01 mov ip, #256 ; 0x100 + 1f5625c: e58d3008 str r3, [sp, #8] + 1f56260: e3a03001 mov r3, #1 + 1f56264: e58d2004 str r2, [sp, #4] + 1f56268: e3a020a1 mov r2, #161 ; 0xa1 + 1f5626c: e58dc000 str ip, [sp] + 1f56270: ebffdf2c bl 1f4df28 + 1f56274: e3500000 cmp r0, #0 + 1f56278: da000003 ble 1f5628c + 1f5627c: e1a00004 mov r0, r4 + 1f56280: e28dd014 add sp, sp, #20 + 1f56284: e8bd4030 pop {r4, r5, lr} + 1f56288: eafffc34 b 1f55360 + 1f5628c: e28dd014 add sp, sp, #20 + 1f56290: e8bd8030 pop {r4, r5, pc} + +01f56294 : + 1f56294: e10f1000 mrs r1, CPSR + 1f56298: f10c0080 cpsid i + 1f5629c: e30c360c movw r3, #50700 ; 0xc60c + 1f562a0: e340320d movt r3, #525 ; 0x20d + 1f562a4: e5932000 ldr r2, [r3] + 1f562a8: e3520000 cmp r2, #0 + 1f562ac: e2822001 add r2, r2, #1 + 1f562b0: e5832000 str r2, [r3] + 1f562b4: 030c3608 movweq r3, #50696 ; 0xc608 + 1f562b8: 0340320d movteq r3, #525 ; 0x20d + 1f562bc: 02211080 eoreq r1, r1, #128 ; 0x80 + 1f562c0: 07e013d1 ubfxeq r1, r1, #7, #1 + 1f562c4: 05831000 streq r1, [r3] + 1f562c8: f57ff05f dmb sy + 1f562cc: e12fff1e bx lr + +01f562d0 : + 1f562d0: f57ff05f dmb sy + 1f562d4: e30c260c movw r2, #50700 ; 0xc60c + 1f562d8: e340220d movt r2, #525 ; 0x20d + 1f562dc: e5923000 ldr r3, [r2] + 1f562e0: e2433001 sub r3, r3, #1 + 1f562e4: e5823000 str r3, [r2] + 1f562e8: e3530000 cmp r3, #0 + 1f562ec: 112fff1e bxne lr + 1f562f0: e30c3608 movw r3, #50696 ; 0xc608 + 1f562f4: e340320d movt r3, #525 ; 0x20d + 1f562f8: e5933000 ldr r3, [r3] + 1f562fc: e3530000 cmp r3, #0 + 1f56300: 012fff1e bxeq lr + 1f56304: f1080080 cpsie i + 1f56308: e12fff1e bx lr + +01f5630c : + 1f5630c: ee070f3e mcr 15, 0, r0, cr7, cr14, {1} + 1f56310: e2813040 add r3, r1, #64 ; 0x40 + 1f56314: e353003f cmp r3, #63 ; 0x3f + 1f56318: 912fff1e bxls lr + 1f5631c: e3c1103f bic r1, r1, #63 ; 0x3f + 1f56320: e2800040 add r0, r0, #64 ; 0x40 + 1f56324: e0811000 add r1, r1, r0 + 1f56328: ee070f3e mcr 15, 0, r0, cr7, cr14, {1} + 1f5632c: e1500001 cmp r0, r1 + 1f56330: e2800040 add r0, r0, #64 ; 0x40 + 1f56334: 1afffffb bne 1f56328 + 1f56338: e12fff1e bx lr + +01f5633c : + 1f5633c: e92d4010 push {r4, lr} + 1f56340: e1a04000 mov r4, r0 + 1f56344: e3a03000 mov r3, #0 + 1f56348: e3a0000c mov r0, #12 + 1f5634c: e884000a stm r4, {r1, r3} + 1f56350: ebffa084 bl 1f3e568 + 1f56354: e5840008 str r0, [r4, #8] + 1f56358: e8bd4010 pop {r4, lr} + 1f5635c: eaffed0d b 1f51798 + +01f56360 : + 1f56360: e92d4070 push {r4, r5, r6, lr} + 1f56364: e5913000 ldr r3, [r1] + 1f56368: e3a02000 mov r2, #0 + 1f5636c: e5802004 str r2, [r0, #4] + 1f56370: e1a04001 mov r4, r1 + 1f56374: e5803000 str r3, [r0] + 1f56378: e1a05000 mov r5, r0 + 1f5637c: e5913004 ldr r3, [r1, #4] + 1f56380: e1530002 cmp r3, r2 + 1f56384: 0a000006 beq 1f563a4 + 1f56388: e5d30000 ldrb r0, [r3] + 1f5638c: ebffa075 bl 1f3e568 + 1f56390: e5850004 str r0, [r5, #4] + 1f56394: e5943004 ldr r3, [r4, #4] + 1f56398: e1a01003 mov r1, r3 + 1f5639c: e5d32000 ldrb r2, [r3] + 1f563a0: ebfff1e4 bl 1f52b38 + 1f563a4: e3a0000c mov r0, #12 + 1f563a8: ebffa06e bl 1f3e568 + 1f563ac: e5850008 str r0, [r5, #8] + 1f563b0: e1a06000 mov r6, r0 + 1f563b4: e5940008 ldr r0, [r4, #8] + 1f563b8: ebffed11 bl 1f51804 + 1f563bc: e1a01000 mov r1, r0 + 1f563c0: e1a00006 mov r0, r6 + 1f563c4: e8bd4070 pop {r4, r5, r6, lr} + 1f563c8: eaffecf6 b 1f517a8 + +01f563cc <_USBString>: + 1f563cc: e92d4070 push {r4, r5, r6, lr} + 1f563d0: e1a04000 mov r4, r0 + 1f563d4: e5900008 ldr r0, [r0, #8] + 1f563d8: ebffecff bl 1f517dc <_String> + 1f563dc: e3a05000 mov r5, #0 + 1f563e0: e5940008 ldr r0, [r4, #8] + 1f563e4: ebffa067 bl 1f3e588 + 1f563e8: e5940004 ldr r0, [r4, #4] + 1f563ec: e5845008 str r5, [r4, #8] + 1f563f0: e1500005 cmp r0, r5 + 1f563f4: 0a000001 beq 1f56400 <_USBString+0x34> + 1f563f8: ebffa062 bl 1f3e588 + 1f563fc: e5845004 str r5, [r4, #4] + 1f56400: e3a03000 mov r3, #0 + 1f56404: e5843000 str r3, [r4] + 1f56408: e8bd8070 pop {r4, r5, r6, pc} + +01f5640c : + 1f5640c: e92d49f0 push {r4, r5, r6, r7, r8, fp, lr} + 1f56410: e1a04000 mov r4, r0 + 1f56414: e1a05001 mov r5, r1 + 1f56418: e28db018 add fp, sp, #24 + 1f5641c: e24dd014 sub sp, sp, #20 + 1f56420: e5900004 ldr r0, [r0, #4] + 1f56424: e1a07002 mov r7, r2 + 1f56428: e3500000 cmp r0, #0 + 1f5642c: 0a000000 beq 1f56434 + 1f56430: ebffa054 bl 1f3e588 + 1f56434: e3a00004 mov r0, #4 + 1f56438: e3855c03 orr r5, r5, #768 ; 0x300 + 1f5643c: ebffa049 bl 1f3e568 + 1f56440: e5840004 str r0, [r4, #4] + 1f56444: e5940000 ldr r0, [r4] + 1f56448: ebffe475 bl 1f4f624 + 1f5644c: e1a06000 mov r6, r0 + 1f56450: e5940000 ldr r0, [r4] + 1f56454: ebffe470 bl 1f4f61c + 1f56458: e5943004 ldr r3, [r4, #4] + 1f5645c: e1a01000 mov r1, r0 + 1f56460: e58d3008 str r3, [sp, #8] + 1f56464: e3a02004 mov r2, #4 + 1f56468: e58d5000 str r5, [sp] + 1f5646c: e58d200c str r2, [sp, #12] + 1f56470: e1a00006 mov r0, r6 + 1f56474: e58d7004 str r7, [sp, #4] + 1f56478: e3a03006 mov r3, #6 + 1f5647c: e3a02080 mov r2, #128 ; 0x80 + 1f56480: ebffdea8 bl 1f4df28 + 1f56484: e3500000 cmp r0, #0 + 1f56488: ba000008 blt 1f564b0 + 1f5648c: e5940004 ldr r0, [r4, #4] + 1f56490: e5d06000 ldrb r6, [r0] + 1f56494: e3560001 cmp r6, #1 + 1f56498: 9a000004 bls 1f564b0 + 1f5649c: e3160001 tst r6, #1 + 1f564a0: 1a000002 bne 1f564b0 + 1f564a4: e5d03001 ldrb r3, [r0, #1] + 1f564a8: e3530003 cmp r3, #3 + 1f564ac: 0a000002 beq 1f564bc + 1f564b0: e3a00000 mov r0, #0 + 1f564b4: e24bd018 sub sp, fp, #24 + 1f564b8: e8bd89f0 pop {r4, r5, r6, r7, r8, fp, pc} + 1f564bc: e3560004 cmp r6, #4 + 1f564c0: 9a00001a bls 1f56530 + 1f564c4: ebffa02f bl 1f3e588 + 1f564c8: e1a00006 mov r0, r6 + 1f564cc: ebffa025 bl 1f3e568 + 1f564d0: e5840004 str r0, [r4, #4] + 1f564d4: e5940000 ldr r0, [r4] + 1f564d8: ebffe451 bl 1f4f624 + 1f564dc: e1a08000 mov r8, r0 + 1f564e0: e5940000 ldr r0, [r4] + 1f564e4: ebffe44c bl 1f4f61c + 1f564e8: e5942004 ldr r2, [r4, #4] + 1f564ec: e1a01000 mov r1, r0 + 1f564f0: e58d2008 str r2, [sp, #8] + 1f564f4: e58d600c str r6, [sp, #12] + 1f564f8: e1a00008 mov r0, r8 + 1f564fc: e88d00a0 stm sp, {r5, r7} + 1f56500: e3a03006 mov r3, #6 + 1f56504: e3a02080 mov r2, #128 ; 0x80 + 1f56508: ebffde86 bl 1f4df28 + 1f5650c: e1500006 cmp r0, r6 + 1f56510: 1affffe6 bne 1f564b0 + 1f56514: e5940004 ldr r0, [r4, #4] + 1f56518: e5d03000 ldrb r3, [r0] + 1f5651c: e1530006 cmp r3, r6 + 1f56520: 1affffe2 bne 1f564b0 + 1f56524: e5d03001 ldrb r3, [r0, #1] + 1f56528: e3530003 cmp r3, #3 + 1f5652c: 1affffdf bne 1f564b0 + 1f56530: e2466002 sub r6, r6, #2 + 1f56534: e1a030c6 asr r3, r6, #1 + 1f56538: e2832008 add r2, r3, #8 + 1f5653c: e3530000 cmp r3, #0 + 1f56540: e3c22007 bic r2, r2, #7 + 1f56544: e283c001 add ip, r3, #1 + 1f56548: e04dd002 sub sp, sp, r2 + 1f5654c: e28d5010 add r5, sp, #16 + 1f56550: 0a0000b2 beq 1f56820 + 1f56554: e2802002 add r2, r0, #2 + 1f56558: e085e003 add lr, r5, r3 + 1f5655c: e1a01002 mov r1, r2 + 1f56560: e080c08c add ip, r0, ip, lsl #1 + 1f56564: e151000e cmp r1, lr + 1f56568: 3155000c cmpcc r5, ip + 1f5656c: e7e37052 ubfx r7, r2, #0, #4 + 1f56570: e1a0200e mov r2, lr + 1f56574: 23a02001 movcs r2, #1 + 1f56578: 33a02000 movcc r2, #0 + 1f5657c: e353000f cmp r3, #15 + 1f56580: 93a01000 movls r1, #0 + 1f56584: 83a01001 movhi r1, #1 + 1f56588: e3570000 cmp r7, #0 + 1f5658c: 13a01000 movne r1, #0 + 1f56590: e0122001 ands r2, r2, r1 + 1f56594: 0a0000ae beq 1f56854 + 1f56598: e2431010 sub r1, r3, #16 + 1f5659c: f2c1887f vmvn.i16 q12, #31 ; 0x001f + 1f565a0: f2c5685e vmov.i16 q11, #94 ; 0x005e + 1f565a4: e280c022 add ip, r0, #34 ; 0x22 + 1f565a8: e1a01221 lsr r1, r1, #4 + 1f565ac: f2c5485f vmov.i16 q10, #95 ; 0x005f + 1f565b0: e2811001 add r1, r1, #1 + 1f565b4: e1a07005 mov r7, r5 + 1f565b8: e3a0e000 mov lr, #0 + 1f565bc: e1a02201 lsl r2, r1, #4 + 1f565c0: ed5cab04 vldr d26, [ip, #-16] + 1f565c4: ed5cbb02 vldr d27, [ip, #-8] + 1f565c8: e28ee001 add lr, lr, #1 + 1f565cc: e151000e cmp r1, lr + 1f565d0: ed5ccb08 vldr d28, [ip, #-32] ; 0xffffffe0 + 1f565d4: ed5cdb06 vldr d29, [ip, #-24] ; 0xffffffe8 + 1f565d8: e28cc020 add ip, ip, #32 + 1f565dc: f25a08e8 vadd.i16 q8, q13, q12 + 1f565e0: f25c28e8 vadd.i16 q9, q14, q12 + 1f565e4: f35603f0 vcge.u16 q8, q11, q8 + 1f565e8: f35623f2 vcge.u16 q9, q11, q9 + 1f565ec: f35a01f4 vbsl q8, q13, q10 + 1f565f0: f35c21f4 vbsl q9, q14, q10 + 1f565f4: f3f2a222 vmovn.i16 d26, q9 + 1f565f8: f3f2b220 vmovn.i16 d27, q8 + 1f565fc: f447aa0f vst1.8 {d26-d27}, [r7] + 1f56600: e2877010 add r7, r7, #16 + 1f56604: 8affffed bhi 1f565c0 + 1f56608: e1530002 cmp r3, r2 + 1f5660c: 0a000083 beq 1f56820 + 1f56610: e080c082 add ip, r0, r2, lsl #1 + 1f56614: e2827001 add r7, r2, #1 + 1f56618: e1dcc0b2 ldrh ip, [ip, #2] + 1f5661c: e24ce020 sub lr, ip, #32 + 1f56620: e35e005e cmp lr, #94 ; 0x5e + 1f56624: 83a0c05f movhi ip, #95 ; 0x5f + 1f56628: e1530007 cmp r3, r7 + 1f5662c: e7c5c201 strb ip, [r5, r1, lsl #4] + 1f56630: 9a00007a bls 1f56820 + 1f56634: e0801087 add r1, r0, r7, lsl #1 + 1f56638: e282e002 add lr, r2, #2 + 1f5663c: e1d110b2 ldrh r1, [r1, #2] + 1f56640: e241c020 sub ip, r1, #32 + 1f56644: e35c005e cmp ip, #94 ; 0x5e + 1f56648: 83a0105f movhi r1, #95 ; 0x5f + 1f5664c: e153000e cmp r3, lr + 1f56650: e7c51007 strb r1, [r5, r7] + 1f56654: 9a000071 bls 1f56820 + 1f56658: e080108e add r1, r0, lr, lsl #1 + 1f5665c: e282c003 add ip, r2, #3 + 1f56660: e1d110b2 ldrh r1, [r1, #2] + 1f56664: e2417020 sub r7, r1, #32 + 1f56668: e357005e cmp r7, #94 ; 0x5e + 1f5666c: 83a0105f movhi r1, #95 ; 0x5f + 1f56670: e153000c cmp r3, ip + 1f56674: e7c5100e strb r1, [r5, lr] + 1f56678: 9a000068 bls 1f56820 + 1f5667c: e080108c add r1, r0, ip, lsl #1 + 1f56680: e282e004 add lr, r2, #4 + 1f56684: e1d110b2 ldrh r1, [r1, #2] + 1f56688: e2417020 sub r7, r1, #32 + 1f5668c: e357005e cmp r7, #94 ; 0x5e + 1f56690: 83a0105f movhi r1, #95 ; 0x5f + 1f56694: e153000e cmp r3, lr + 1f56698: e7c5100c strb r1, [r5, ip] + 1f5669c: 9a00005f bls 1f56820 + 1f566a0: e080108e add r1, r0, lr, lsl #1 + 1f566a4: e282c005 add ip, r2, #5 + 1f566a8: e1d110b2 ldrh r1, [r1, #2] + 1f566ac: e2417020 sub r7, r1, #32 + 1f566b0: e357005e cmp r7, #94 ; 0x5e + 1f566b4: 83a0105f movhi r1, #95 ; 0x5f + 1f566b8: e153000c cmp r3, ip + 1f566bc: e7c5100e strb r1, [r5, lr] + 1f566c0: 9a000056 bls 1f56820 + 1f566c4: e080108c add r1, r0, ip, lsl #1 + 1f566c8: e282e006 add lr, r2, #6 + 1f566cc: e1d110b2 ldrh r1, [r1, #2] + 1f566d0: e2417020 sub r7, r1, #32 + 1f566d4: e357005e cmp r7, #94 ; 0x5e + 1f566d8: 83a0105f movhi r1, #95 ; 0x5f + 1f566dc: e153000e cmp r3, lr + 1f566e0: e7c5100c strb r1, [r5, ip] + 1f566e4: 9a00004d bls 1f56820 + 1f566e8: e080108e add r1, r0, lr, lsl #1 + 1f566ec: e282c007 add ip, r2, #7 + 1f566f0: e1d110b2 ldrh r1, [r1, #2] + 1f566f4: e2417020 sub r7, r1, #32 + 1f566f8: e357005e cmp r7, #94 ; 0x5e + 1f566fc: 83a0105f movhi r1, #95 ; 0x5f + 1f56700: e153000c cmp r3, ip + 1f56704: e7c5100e strb r1, [r5, lr] + 1f56708: 9a000044 bls 1f56820 + 1f5670c: e080108c add r1, r0, ip, lsl #1 + 1f56710: e282e008 add lr, r2, #8 + 1f56714: e1d110b2 ldrh r1, [r1, #2] + 1f56718: e2417020 sub r7, r1, #32 + 1f5671c: e357005e cmp r7, #94 ; 0x5e + 1f56720: 83a0105f movhi r1, #95 ; 0x5f + 1f56724: e153000e cmp r3, lr + 1f56728: e7c5100c strb r1, [r5, ip] + 1f5672c: 9a00003b bls 1f56820 + 1f56730: e080108e add r1, r0, lr, lsl #1 + 1f56734: e282c009 add ip, r2, #9 + 1f56738: e1d110b2 ldrh r1, [r1, #2] + 1f5673c: e2417020 sub r7, r1, #32 + 1f56740: e357005e cmp r7, #94 ; 0x5e + 1f56744: 83a0105f movhi r1, #95 ; 0x5f + 1f56748: e153000c cmp r3, ip + 1f5674c: e7c5100e strb r1, [r5, lr] + 1f56750: 9a000032 bls 1f56820 + 1f56754: e080108c add r1, r0, ip, lsl #1 + 1f56758: e282e00a add lr, r2, #10 + 1f5675c: e1d110b2 ldrh r1, [r1, #2] + 1f56760: e2417020 sub r7, r1, #32 + 1f56764: e357005e cmp r7, #94 ; 0x5e + 1f56768: 83a0105f movhi r1, #95 ; 0x5f + 1f5676c: e153000e cmp r3, lr + 1f56770: e7c5100c strb r1, [r5, ip] + 1f56774: 9a000029 bls 1f56820 + 1f56778: e080108e add r1, r0, lr, lsl #1 + 1f5677c: e282c00b add ip, r2, #11 + 1f56780: e1d110b2 ldrh r1, [r1, #2] + 1f56784: e2417020 sub r7, r1, #32 + 1f56788: e357005e cmp r7, #94 ; 0x5e + 1f5678c: 83a0105f movhi r1, #95 ; 0x5f + 1f56790: e153000c cmp r3, ip + 1f56794: e7c5100e strb r1, [r5, lr] + 1f56798: 9a000020 bls 1f56820 + 1f5679c: e080108c add r1, r0, ip, lsl #1 + 1f567a0: e282e00c add lr, r2, #12 + 1f567a4: e1d110b2 ldrh r1, [r1, #2] + 1f567a8: e2417020 sub r7, r1, #32 + 1f567ac: e357005e cmp r7, #94 ; 0x5e + 1f567b0: 83a0105f movhi r1, #95 ; 0x5f + 1f567b4: e153000e cmp r3, lr + 1f567b8: e7c5100c strb r1, [r5, ip] + 1f567bc: 9a000017 bls 1f56820 + 1f567c0: e080108e add r1, r0, lr, lsl #1 + 1f567c4: e282c00d add ip, r2, #13 + 1f567c8: e1d110b2 ldrh r1, [r1, #2] + 1f567cc: e2417020 sub r7, r1, #32 + 1f567d0: e357005e cmp r7, #94 ; 0x5e + 1f567d4: 83a0105f movhi r1, #95 ; 0x5f + 1f567d8: e153000c cmp r3, ip + 1f567dc: e7c5100e strb r1, [r5, lr] + 1f567e0: 9a00000e bls 1f56820 + 1f567e4: e080108c add r1, r0, ip, lsl #1 + 1f567e8: e282200e add r2, r2, #14 + 1f567ec: e1d110b2 ldrh r1, [r1, #2] + 1f567f0: e241e020 sub lr, r1, #32 + 1f567f4: e35e005e cmp lr, #94 ; 0x5e + 1f567f8: 83a0105f movhi r1, #95 ; 0x5f + 1f567fc: e1530002 cmp r3, r2 + 1f56800: e7c5100c strb r1, [r5, ip] + 1f56804: 9a000005 bls 1f56820 + 1f56808: e0800082 add r0, r0, r2, lsl #1 + 1f5680c: e1d030b2 ldrh r3, [r0, #2] + 1f56810: e2431020 sub r1, r3, #32 + 1f56814: e351005e cmp r1, #94 ; 0x5e + 1f56818: 83a0305f movhi r3, #95 ; 0x5f + 1f5681c: e7c53002 strb r3, [r5, r2] + 1f56820: e3a03000 mov r3, #0 + 1f56824: e5940008 ldr r0, [r4, #8] + 1f56828: e7c530c6 strb r3, [r5, r6, asr #1] + 1f5682c: ebffebea bl 1f517dc <_String> + 1f56830: e5940008 ldr r0, [r4, #8] + 1f56834: ebff9f53 bl 1f3e588 + 1f56838: e3a0000c mov r0, #12 + 1f5683c: ebff9f49 bl 1f3e568 + 1f56840: e1a01005 mov r1, r5 + 1f56844: e5840008 str r0, [r4, #8] + 1f56848: ebffebd6 bl 1f517a8 + 1f5684c: e3a00001 mov r0, #1 + 1f56850: eaffff17 b 1f564b4 + 1f56854: e28dc00f add ip, sp, #15 + 1f56858: e0801082 add r1, r0, r2, lsl #1 + 1f5685c: e2822001 add r2, r2, #1 + 1f56860: e1d110b2 ldrh r1, [r1, #2] + 1f56864: e241e020 sub lr, r1, #32 + 1f56868: e35e005e cmp lr, #94 ; 0x5e + 1f5686c: 83a0105f movhi r1, #95 ; 0x5f + 1f56870: e1530002 cmp r3, r2 + 1f56874: e5ec1001 strb r1, [ip, #1]! + 1f56878: 1afffff6 bne 1f56858 + 1f5687c: eaffffe7 b 1f56820 + +01f56880 : + 1f56880: e5900008 ldr r0, [r0, #8] + 1f56884: eaffebde b 1f51804 + +01f56888 : + 1f56888: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} + 1f5688c: e1a05000 mov r5, r0 + 1f56890: e3a00004 mov r0, #4 + 1f56894: e24dd010 sub sp, sp, #16 + 1f56898: e3a07080 mov r7, #128 ; 0x80 + 1f5689c: ebff9f31 bl 1f3e568 + 1f568a0: e1a04000 mov r4, r0 + 1f568a4: e5950000 ldr r0, [r5] + 1f568a8: ebffe35d bl 1f4f624 + 1f568ac: e1a06000 mov r6, r0 + 1f568b0: e5950000 ldr r0, [r5] + 1f568b4: ebffe358 bl 1f4f61c + 1f568b8: e3a02004 mov r2, #4 + 1f568bc: e1a01000 mov r1, r0 + 1f568c0: e58d2004 str r2, [sp, #4] + 1f568c4: e58d4000 str r4, [sp] + 1f568c8: e1a00006 mov r0, r6 + 1f568cc: e58d7008 str r7, [sp, #8] + 1f568d0: e3a03000 mov r3, #0 + 1f568d4: e3a02003 mov r2, #3 + 1f568d8: ebffddd0 bl 1f4e020 + 1f568dc: e3500000 cmp r0, #0 + 1f568e0: ba000004 blt 1f568f8 + 1f568e4: e5d46000 ldrb r6, [r4] + 1f568e8: e3560003 cmp r6, #3 + 1f568ec: 9a000001 bls 1f568f8 + 1f568f0: e2168001 ands r8, r6, #1 + 1f568f4: 0a000005 beq 1f56910 + 1f568f8: e1a00004 mov r0, r4 + 1f568fc: e3005409 movw r5, #1033 ; 0x409 + 1f56900: ebff9f20 bl 1f3e588 + 1f56904: e1a00005 mov r0, r5 + 1f56908: e28dd010 add sp, sp, #16 + 1f5690c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} + 1f56910: e5d49001 ldrb r9, [r4, #1] + 1f56914: e3590003 cmp r9, #3 + 1f56918: 1afffff6 bne 1f568f8 + 1f5691c: e3560004 cmp r6, #4 + 1f56920: 03a00001 moveq r0, #1 + 1f56924: 1a00000f bne 1f56968 + 1f56928: e1d450b2 ldrh r5, [r4, #2] + 1f5692c: e3001409 movw r1, #1033 ; 0x409 + 1f56930: e1550001 cmp r5, r1 + 1f56934: 0affffef beq 1f568f8 + 1f56938: e3a03000 mov r3, #0 + 1f5693c: ea000002 b 1f5694c + 1f56940: e1d220b2 ldrh r2, [r2, #2] + 1f56944: e1520001 cmp r2, r1 + 1f56948: 0affffea beq 1f568f8 + 1f5694c: e2833001 add r3, r3, #1 + 1f56950: e1530000 cmp r3, r0 + 1f56954: e0842083 add r2, r4, r3, lsl #1 + 1f56958: 3afffff8 bcc 1f56940 + 1f5695c: e1a00004 mov r0, r4 + 1f56960: ebff9f08 bl 1f3e588 + 1f56964: eaffffe6 b 1f56904 + 1f56968: e1a00004 mov r0, r4 + 1f5696c: ebff9f05 bl 1f3e588 + 1f56970: e1a00006 mov r0, r6 + 1f56974: ebff9efb bl 1f3e568 + 1f56978: e1a04000 mov r4, r0 + 1f5697c: e5950000 ldr r0, [r5] + 1f56980: ebffe327 bl 1f4f624 + 1f56984: e1a0a000 mov sl, r0 + 1f56988: e5950000 ldr r0, [r5] + 1f5698c: ebffe322 bl 1f4f61c + 1f56990: e58d4000 str r4, [sp] + 1f56994: e1a01000 mov r1, r0 + 1f56998: e58d7008 str r7, [sp, #8] + 1f5699c: e1a0000a mov r0, sl + 1f569a0: e58d6004 str r6, [sp, #4] + 1f569a4: e1a03008 mov r3, r8 + 1f569a8: e1a02009 mov r2, r9 + 1f569ac: ebffdd9b bl 1f4e020 + 1f569b0: e1500006 cmp r0, r6 + 1f569b4: 1affffcf bne 1f568f8 + 1f569b8: e5d43000 ldrb r3, [r4] + 1f569bc: e1530000 cmp r3, r0 + 1f569c0: 1affffcc bne 1f568f8 + 1f569c4: e5d42001 ldrb r2, [r4, #1] + 1f569c8: e3520003 cmp r2, #3 + 1f569cc: 02433002 subeq r3, r3, #2 + 1f569d0: 01a000c3 asreq r0, r3, #1 + 1f569d4: 1affffc7 bne 1f568f8 + 1f569d8: eaffffd2 b 1f56928 + +01f569dc : + 1f569dc: e92d4070 push {r4, r5, r6, lr} + 1f569e0: e3a01002 mov r1, #2 + 1f569e4: e1a05000 mov r5, r0 + 1f569e8: e24dd018 sub sp, sp, #24 + 1f569ec: ebffe312 bl 1f4f63c + 1f569f0: e3500000 cmp r0, #0 + 1f569f4: 0a000072 beq 1f56bc4 + 1f569f8: e5d03004 ldrb r3, [r0, #4] + 1f569fc: e3530000 cmp r3, #0 + 1f56a00: 0a00006f beq 1f56bc4 + 1f56a04: e3a01004 mov r1, #4 + 1f56a08: e1a00005 mov r0, r5 + 1f56a0c: ebffe30a bl 1f4f63c + 1f56a10: e2504000 subs r4, r0, #0 + 1f56a14: 0a00002e beq 1f56ad4 + 1f56a18: e5d43004 ldrb r3, [r4, #4] + 1f56a1c: e3530000 cmp r3, #0 + 1f56a20: 0afffff7 beq 1f56a04 + 1f56a24: e5d43005 ldrb r3, [r4, #5] + 1f56a28: e3530001 cmp r3, #1 + 1f56a2c: 1afffff4 bne 1f56a04 + 1f56a30: e5d43006 ldrb r3, [r4, #6] + 1f56a34: e3530003 cmp r3, #3 + 1f56a38: 1afffff1 bne 1f56a04 + 1f56a3c: e5d43007 ldrb r3, [r4, #7] + 1f56a40: e3530000 cmp r3, #0 + 1f56a44: 1affffee bne 1f56a04 + 1f56a48: e3a01005 mov r1, #5 + 1f56a4c: e1a00005 mov r0, r5 + 1f56a50: ebffe2f9 bl 1f4f63c + 1f56a54: e2504000 subs r4, r0, #0 + 1f56a58: 0affffe9 beq 1f56a04 + 1f56a5c: e1d430d2 ldrsb r3, [r4, #2] + 1f56a60: e3530000 cmp r3, #0 + 1f56a64: aafffff7 bge 1f56a48 + 1f56a68: e5d43003 ldrb r3, [r4, #3] + 1f56a6c: e203303f and r3, r3, #63 ; 0x3f + 1f56a70: e3530002 cmp r3, #2 + 1f56a74: 1afffff3 bne 1f56a48 + 1f56a78: e3a01025 mov r1, #37 ; 0x25 + 1f56a7c: e1a00005 mov r0, r5 + 1f56a80: ebffe2ed bl 1f4f63c + 1f56a84: e3500000 cmp r0, #0 + 1f56a88: 0affffee beq 1f56a48 + 1f56a8c: e5d43000 ldrb r3, [r4] + 1f56a90: e0843003 add r3, r4, r3 + 1f56a94: e1500003 cmp r0, r3 + 1f56a98: 1affffea bne 1f56a48 + 1f56a9c: e3a00018 mov r0, #24 + 1f56aa0: ebff9eb0 bl 1f3e568 + 1f56aa4: e5850038 str r0, [r5, #56] ; 0x38 + 1f56aa8: e30f0ffc movw r0, #65532 ; 0xfffc + 1f56aac: e1d430b4 ldrh r3, [r4, #4] + 1f56ab0: e0000003 and r0, r0, r3 + 1f56ab4: e1c504b4 strh r0, [r5, #68] ; 0x44 + 1f56ab8: ebff9eaa bl 1f3e568 + 1f56abc: e1a02004 mov r2, r4 + 1f56ac0: e5850048 str r0, [r5, #72] ; 0x48 + 1f56ac4: e1a01005 mov r1, r5 + 1f56ac8: e5950038 ldr r0, [r5, #56] ; 0x38 + 1f56acc: ebffe2eb bl 1f4f680 + 1f56ad0: eaffffdc b 1f56a48 + 1f56ad4: e5956038 ldr r6, [r5, #56] ; 0x38 + 1f56ad8: e1a00005 mov r0, r5 + 1f56adc: e3560000 cmp r6, #0 + 1f56ae0: 0a00003f beq 1f56be4 + 1f56ae4: ebffe12e bl 1f4efa4 + 1f56ae8: e2506000 subs r6, r0, #0 + 1f56aec: 0a00002b beq 1f56ba0 + 1f56af0: e28d000c add r0, sp, #12 + 1f56af4: ebffeb27 bl 1f51798 + 1f56af8: e3053cd8 movw r3, #23768 ; 0x5cd8 + 1f56afc: e34031f6 movt r3, #502 ; 0x1f6 + 1f56b00: e28d000c add r0, sp, #12 + 1f56b04: e303191c movw r1, #14620 ; 0x391c + 1f56b08: e34011f6 movt r1, #502 ; 0x1f6 + 1f56b0c: e5932000 ldr r2, [r3] + 1f56b10: e282c001 add ip, r2, #1 + 1f56b14: e583c000 str ip, [r3] + 1f56b18: ebffef17 bl 1f5277c + 1f56b1c: ebffe3c5 bl 1f4fa38 + 1f56b20: e1a06000 mov r6, r0 + 1f56b24: e28d000c add r0, sp, #12 + 1f56b28: ebffeb35 bl 1f51804 + 1f56b2c: e1a03004 mov r3, r4 + 1f56b30: e1a01000 mov r1, r0 + 1f56b34: e1a02005 mov r2, r5 + 1f56b38: e1a00006 mov r0, r6 + 1f56b3c: ebffe393 bl 1f4f990 + 1f56b40: e28d000c add r0, sp, #12 + 1f56b44: ebffeb24 bl 1f517dc <_String> + 1f56b48: e3a00024 mov r0, #36 ; 0x24 + 1f56b4c: ebff9e85 bl 1f3e568 + 1f56b50: e1d534b4 ldrh r3, [r5, #68] ; 0x44 + 1f56b54: e5952048 ldr r2, [r5, #72] ; 0x48 + 1f56b58: e5951038 ldr r1, [r5, #56] ; 0x38 + 1f56b5c: e5850040 str r0, [r5, #64] ; 0x40 + 1f56b60: e58d4000 str r4, [sp] + 1f56b64: ebffe33f bl 1f4f868 + 1f56b68: e1a03005 mov r3, r5 + 1f56b6c: e1a02004 mov r2, r4 + 1f56b70: e5950040 ldr r0, [r5, #64] ; 0x40 + 1f56b74: e3061bf4 movw r1, #27636 ; 0x6bf4 + 1f56b78: e34011f5 movt r1, #501 ; 0x1f5 + 1f56b7c: ebffe35c bl 1f4f8f4 + 1f56b80: e1a00005 mov r0, r5 + 1f56b84: ebffe2a6 bl 1f4f624 + 1f56b88: e5951040 ldr r1, [r5, #64] ; 0x40 + 1f56b8c: ebffdbe0 bl 1f4db14 + 1f56b90: e1a06000 mov r6, r0 + 1f56b94: e1a00006 mov r0, r6 + 1f56b98: e28dd018 add sp, sp, #24 + 1f56b9c: e8bd8070 pop {r4, r5, r6, pc} + 1f56ba0: e3a01001 mov r1, #1 + 1f56ba4: e303250c movw r2, #13580 ; 0x350c + 1f56ba8: e34021f6 movt r2, #502 ; 0x1f6 + 1f56bac: e3030968 movw r0, #14696 ; 0x3968 + 1f56bb0: e34001f6 movt r0, #502 ; 0x1f6 + 1f56bb4: ebfea9b3 bl 1f01288 + 1f56bb8: e1a00006 mov r0, r6 + 1f56bbc: e28dd018 add sp, sp, #24 + 1f56bc0: e8bd8070 pop {r4, r5, r6, pc} + 1f56bc4: e1a00005 mov r0, r5 + 1f56bc8: e3a06000 mov r6, #0 + 1f56bcc: e3031968 movw r1, #14696 ; 0x3968 + 1f56bd0: e34011f6 movt r1, #502 ; 0x1f6 + 1f56bd4: ebffe29a bl 1f4f644 + 1f56bd8: e1a00006 mov r0, r6 + 1f56bdc: e28dd018 add sp, sp, #24 + 1f56be0: e8bd8070 pop {r4, r5, r6, pc} + 1f56be4: e3031968 movw r1, #14696 ; 0x3968 + 1f56be8: e34011f6 movt r1, #502 ; 0x1f6 + 1f56bec: ebffe294 bl 1f4f644 + 1f56bf0: eaffffe7 b 1f56b94 + +01f56bf4 : + 1f56bf4: e92d40f0 push {r4, r5, r6, r7, lr} + 1f56bf8: e1a04002 mov r4, r2 + 1f56bfc: e1a05000 mov r5, r0 + 1f56c00: e24dd00c sub sp, sp, #12 + 1f56c04: ebffe330 bl 1f4f8cc + 1f56c08: e3500000 cmp r0, #0 + 1f56c0c: 1a000019 bne 1f56c78 + 1f56c10: e5940040 ldr r0, [r4, #64] ; 0x40 + 1f56c14: e3a05000 mov r5, #0 + 1f56c18: ebffe31f bl 1f4f89c <_USBRequest> + 1f56c1c: e5940040 ldr r0, [r4, #64] ; 0x40 + 1f56c20: ebff9e58 bl 1f3e588 + 1f56c24: e5845040 str r5, [r4, #64] ; 0x40 + 1f56c28: e3a00024 mov r0, #36 ; 0x24 + 1f56c2c: ebff9e4d bl 1f3e568 + 1f56c30: e1d434b4 ldrh r3, [r4, #68] ; 0x44 + 1f56c34: e5942048 ldr r2, [r4, #72] ; 0x48 + 1f56c38: e5941038 ldr r1, [r4, #56] ; 0x38 + 1f56c3c: e5840040 str r0, [r4, #64] ; 0x40 + 1f56c40: e58d5000 str r5, [sp] + 1f56c44: ebffe307 bl 1f4f868 + 1f56c48: e1a03004 mov r3, r4 + 1f56c4c: e1a02005 mov r2, r5 + 1f56c50: e5940040 ldr r0, [r4, #64] ; 0x40 + 1f56c54: e3061bf4 movw r1, #27636 ; 0x6bf4 + 1f56c58: e34011f5 movt r1, #501 ; 0x1f5 + 1f56c5c: ebffe324 bl 1f4f8f4 + 1f56c60: e1a00004 mov r0, r4 + 1f56c64: ebffe26e bl 1f4f624 + 1f56c68: e5941040 ldr r1, [r4, #64] ; 0x40 + 1f56c6c: e28dd00c add sp, sp, #12 + 1f56c70: e8bd40f0 pop {r4, r5, r6, r7, lr} + 1f56c74: eaffdba6 b 1f4db14 + 1f56c78: e1a00005 mov r0, r5 + 1f56c7c: ebffe314 bl 1f4f8d4 + 1f56c80: e3100003 tst r0, #3 + 1f56c84: 1affffe1 bne 1f56c10 + 1f56c88: e1a00005 mov r0, r5 + 1f56c8c: e5946048 ldr r6, [r4, #72] ; 0x48 + 1f56c90: ebffe30f bl 1f4f8d4 + 1f56c94: e5945048 ldr r5, [r4, #72] ; 0x48 + 1f56c98: e0866000 add r6, r6, r0 + 1f56c9c: e1560005 cmp r6, r5 + 1f56ca0: 9affffda bls 1f56c10 + 1f56ca4: e3037928 movw r7, #14632 ; 0x3928 + 1f56ca8: e34071f6 movt r7, #502 ; 0x1f6 + 1f56cac: e2855001 add r5, r5, #1 + 1f56cb0: e5550001 ldrb r0, [r5, #-1] + 1f56cb4: e3500000 cmp r0, #0 + 1f56cb8: 0a000007 beq 1f56cdc + 1f56cbc: e594303c ldr r3, [r4, #60] ; 0x3c + 1f56cc0: e200100f and r1, r0, #15 + 1f56cc4: e1a02005 mov r2, r5 + 1f56cc8: e1a00220 lsr r0, r0, #4 + 1f56ccc: e3530000 cmp r3, #0 + 1f56cd0: 0a000001 beq 1f56cdc + 1f56cd4: e7971101 ldr r1, [r7, r1, lsl #2] + 1f56cd8: e12fff33 blx r3 + 1f56cdc: e2853003 add r3, r5, #3 + 1f56ce0: e2855004 add r5, r5, #4 + 1f56ce4: e1560003 cmp r6, r3 + 1f56ce8: 8afffff0 bhi 1f56cb0 + 1f56cec: eaffffc7 b 1f56c10 + +01f56cf0 : + 1f56cf0: e92d4010 push {r4, lr} + 1f56cf4: e1a04000 mov r4, r0 + 1f56cf8: ebffe0de bl 1f4f078 + 1f56cfc: e3a03000 mov r3, #0 + 1f56d00: e30629dc movw r2, #27100 ; 0x69dc + 1f56d04: e34021f5 movt r2, #501 ; 0x1f5 + 1f56d08: e5843038 str r3, [r4, #56] ; 0x38 + 1f56d0c: e5842000 str r2, [r4] + 1f56d10: e584303c str r3, [r4, #60] ; 0x3c + 1f56d14: e5843040 str r3, [r4, #64] ; 0x40 + 1f56d18: e5843048 str r3, [r4, #72] ; 0x48 + 1f56d1c: e8bd8010 pop {r4, pc} + +01f56d20 <_CUSBMIDIDevice>: + 1f56d20: e92d4010 push {r4, lr} + 1f56d24: e1a04000 mov r4, r0 + 1f56d28: e5900048 ldr r0, [r0, #72] ; 0x48 + 1f56d2c: e3500000 cmp r0, #0 + 1f56d30: 0a000002 beq 1f56d40 <_CUSBMIDIDevice+0x20> + 1f56d34: ebff9e13 bl 1f3e588 + 1f56d38: e3a03000 mov r3, #0 + 1f56d3c: e5843048 str r3, [r4, #72] ; 0x48 + 1f56d40: e5940038 ldr r0, [r4, #56] ; 0x38 + 1f56d44: e3500000 cmp r0, #0 + 1f56d48: 0a000004 beq 1f56d60 <_CUSBMIDIDevice+0x40> + 1f56d4c: ebffe298 bl 1f4f7b4 <_USBEndpoint> + 1f56d50: e5940038 ldr r0, [r4, #56] ; 0x38 + 1f56d54: ebff9e0b bl 1f3e588 + 1f56d58: e3a03000 mov r3, #0 + 1f56d5c: e5843038 str r3, [r4, #56] ; 0x38 + 1f56d60: e1a00004 mov r0, r4 + 1f56d64: e8bd4010 pop {r4, lr} + 1f56d68: eaffe0ff b 1f4f16c <_USBDevice> + +01f56d6c : + 1f56d6c: e580103c str r1, [r0, #60] ; 0x3c + 1f56d70: e12fff1e bx lr + +01f56d74 : + 1f56d74: e2423004 sub r3, r2, #4 + 1f56d78: e3a0c000 mov ip, #0 + 1f56d7c: e3530f7f cmp r3, #508 ; 0x1fc + 1f56d80: e5801000 str r1, [r0] + 1f56d84: e0813002 add r3, r1, r2 + 1f56d88: e5802004 str r2, [r0, #4] + 1f56d8c: e5801010 str r1, [r0, #16] + 1f56d90: e5801014 str r1, [r0, #20] + 1f56d94: e580c008 str ip, [r0, #8] + 1f56d98: e580300c str r3, [r0, #12] + 1f56d9c: 812fff1e bxhi lr + 1f56da0: e5d1c000 ldrb ip, [r1] + 1f56da4: e35c0009 cmp ip, #9 + 1f56da8: 112fff1e bxne lr + 1f56dac: e5d1c001 ldrb ip, [r1, #1] + 1f56db0: e35c0002 cmp ip, #2 + 1f56db4: 112fff1e bxne lr + 1f56db8: e1d1c0b2 ldrh ip, [r1, #2] + 1f56dbc: e152000c cmp r2, ip + 1f56dc0: 312fff1e bxcc lr + 1f56dc4: e92d4030 push {r4, r5, lr} + 1f56dc8: e3a05000 mov r5, #0 + 1f56dcc: 8081300c addhi r3, r1, ip + 1f56dd0: e1a04005 mov r4, r5 + 1f56dd4: 8580300c strhi r3, [r0, #12] + 1f56dd8: ea000005 b 1f56df4 + 1f56ddc: e3520005 cmp r2, #5 + 1f56de0: 0a00001c beq 1f56e58 + 1f56de4: e3520002 cmp r2, #2 + 1f56de8: 0a000016 beq 1f56e48 + 1f56dec: e1a04002 mov r4, r2 + 1f56df0: e1a0100c mov r1, ip + 1f56df4: e2812002 add r2, r1, #2 + 1f56df8: e1530002 cmp r3, r2 + 1f56dfc: 9a00001b bls 1f56e70 + 1f56e00: e5d1e000 ldrb lr, [r1] + 1f56e04: e5d12001 ldrb r2, [r1, #1] + 1f56e08: e081c00e add ip, r1, lr + 1f56e0c: e15c0003 cmp ip, r3 + 1f56e10: 8a00000a bhi 1f56e40 + 1f56e14: e3520004 cmp r2, #4 + 1f56e18: 1affffef bne 1f56ddc + 1f56e1c: e3540000 cmp r4, #0 + 1f56e20: 0a000006 beq 1f56e40 + 1f56e24: e5d15005 ldrb r5, [r1, #5] + 1f56e28: e3a04009 mov r4, #9 + 1f56e2c: e2455001 sub r5, r5, #1 + 1f56e30: e16f5f15 clz r5, r5 + 1f56e34: e1a052a5 lsr r5, r5, #5 + 1f56e38: e154000e cmp r4, lr + 1f56e3c: 0affffea beq 1f56dec + 1f56e40: e5801014 str r1, [r0, #20] + 1f56e44: e8bd8030 pop {r4, r5, pc} + 1f56e48: e3540000 cmp r4, #0 + 1f56e4c: 1afffffb bne 1f56e40 + 1f56e50: e3a04009 mov r4, #9 + 1f56e54: eafffff7 b 1f56e38 + 1f56e58: e31400fd tst r4, #253 ; 0xfd + 1f56e5c: 0afffff7 beq 1f56e40 + 1f56e60: e3550000 cmp r5, #0 + 1f56e64: 03a04007 moveq r4, #7 + 1f56e68: 13a04009 movne r4, #9 + 1f56e6c: eafffff1 b 1f56e38 + 1f56e70: e1510003 cmp r1, r3 + 1f56e74: 1afffff1 bne 1f56e40 + 1f56e78: e3a03001 mov r3, #1 + 1f56e7c: e5803008 str r3, [r0, #8] + 1f56e80: e8bd8030 pop {r4, r5, pc} + +01f56e84 <_USBConfigurationParser>: + 1f56e84: e3a03000 mov r3, #0 + 1f56e88: e5803000 str r3, [r0] + 1f56e8c: e12fff1e bx lr + +01f56e90 : + 1f56e90: e5900008 ldr r0, [r0, #8] + 1f56e94: e12fff1e bx lr + +01f56e98 : + 1f56e98: e92d4030 push {r4, r5, lr} + 1f56e9c: e590c010 ldr ip, [r0, #16] + 1f56ea0: e590400c ldr r4, [r0, #12] + 1f56ea4: e15c0004 cmp ip, r4 + 1f56ea8: 2a000019 bcs 1f56f14 + 1f56eac: e5dc2001 ldrb r2, [ip, #1] + 1f56eb0: e2415005 sub r5, r1, #5 + 1f56eb4: e16f5f15 clz r5, r5 + 1f56eb8: e5dc3000 ldrb r3, [ip] + 1f56ebc: e3520004 cmp r2, #4 + 1f56ec0: 03510005 cmpeq r1, #5 + 1f56ec4: e1a052a5 lsr r5, r5, #5 + 1f56ec8: e08c3003 add r3, ip, r3 + 1f56ecc: 0a000010 beq 1f56f14 + 1f56ed0: e1510002 cmp r1, r2 + 1f56ed4: 1a00000b bne 1f56f08 + 1f56ed8: ea000010 b 1f56f20 + 1f56edc: e5d3c001 ldrb ip, [r3, #1] + 1f56ee0: e5d32000 ldrb r2, [r3] + 1f56ee4: e35c0004 cmp ip, #4 + 1f56ee8: 13a0e000 movne lr, #0 + 1f56eec: 0205e001 andeq lr, r5, #1 + 1f56ef0: e35e0000 cmp lr, #0 + 1f56ef4: e0832002 add r2, r3, r2 + 1f56ef8: 1a000005 bne 1f56f14 + 1f56efc: e15c0001 cmp ip, r1 + 1f56f00: 0a000008 beq 1f56f28 + 1f56f04: e1a03002 mov r3, r2 + 1f56f08: e1540003 cmp r4, r3 + 1f56f0c: e5803010 str r3, [r0, #16] + 1f56f10: 8afffff1 bhi 1f56edc + 1f56f14: e3a03000 mov r3, #0 + 1f56f18: e1a00003 mov r0, r3 + 1f56f1c: e8bd8030 pop {r4, r5, pc} + 1f56f20: e1a02003 mov r2, r3 + 1f56f24: e1a0300c mov r3, ip + 1f56f28: e3530000 cmp r3, #0 + 1f56f2c: e5802010 str r2, [r0, #16] + 1f56f30: 15803014 strne r3, [r0, #20] + 1f56f34: e1a00003 mov r0, r3 + 1f56f38: e8bd8030 pop {r4, r5, pc} + +01f56f3c : + 1f56f3c: e1a0c000 mov ip, r0 + 1f56f40: e3032970 movw r2, #14704 ; 0x3970 + 1f56f44: e34021f6 movt r2, #502 ; 0x1f6 + 1f56f48: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f56f4c: e59c3000 ldr r3, [ip] + 1f56f50: e1a00001 mov r0, r1 + 1f56f54: e59ce014 ldr lr, [ip, #20] + 1f56f58: e3a01001 mov r1, #1 + 1f56f5c: e063300e rsb r3, r3, lr + 1f56f60: e49de004 pop {lr} ; (ldr lr, [sp], #4) + 1f56f64: eafea8c7 b 1f01288 + +01f56f68 : + 1f56f68: e92d4070 push {r4, r5, r6, lr} + 1f56f6c: e1a04001 mov r4, r1 + 1f56f70: e1a06000 mov r6, r0 + 1f56f74: e30319a0 movw r1, #14752 ; 0x39a0 + 1f56f78: e34011f6 movt r1, #502 ; 0x1f6 + 1f56f7c: e1a00004 mov r0, r4 + 1f56f80: ebffea5a bl 1f518f0 + 1f56f84: e3500000 cmp r0, #0 + 1f56f88: 1a000015 bne 1f56fe4 + 1f56f8c: e3a00080 mov r0, #128 ; 0x80 + 1f56f90: ebff9d74 bl 1f3e568 + 1f56f94: e1a01006 mov r1, r6 + 1f56f98: e1a05000 mov r5, r0 + 1f56f9c: eb0000ee bl 1f5735c + 1f56fa0: e3550000 cmp r5, #0 + 1f56fa4: 0a000008 beq 1f56fcc + 1f56fa8: e1a00004 mov r0, r4 + 1f56fac: ebffea14 bl 1f51804 + 1f56fb0: e3032a00 movw r2, #14848 ; 0x3a00 + 1f56fb4: e34021f6 movt r2, #502 ; 0x1f6 + 1f56fb8: e1a03000 mov r3, r0 + 1f56fbc: e3a01003 mov r1, #3 + 1f56fc0: e3030a10 movw r0, #14864 ; 0x3a10 + 1f56fc4: e34001f6 movt r0, #502 ; 0x1f6 + 1f56fc8: ebfea8ae bl 1f01288 + 1f56fcc: e1a00004 mov r0, r4 + 1f56fd0: ebffea01 bl 1f517dc <_String> + 1f56fd4: e1a00004 mov r0, r4 + 1f56fd8: ebff9d6a bl 1f3e588 + 1f56fdc: e1a00005 mov r0, r5 + 1f56fe0: e8bd8070 pop {r4, r5, r6, pc} + 1f56fe4: e30319ac movw r1, #14764 ; 0x39ac + 1f56fe8: e34011f6 movt r1, #502 ; 0x1f6 + 1f56fec: e1a00004 mov r0, r4 + 1f56ff0: ebffea3e bl 1f518f0 + 1f56ff4: e3500000 cmp r0, #0 + 1f56ff8: 1a000005 bne 1f57014 + 1f56ffc: e3a00050 mov r0, #80 ; 0x50 + 1f57000: ebff9d58 bl 1f3e568 + 1f57004: e1a01006 mov r1, r6 + 1f57008: e1a05000 mov r5, r0 + 1f5700c: ebfff018 bl 1f53074 + 1f57010: eaffffe2 b 1f56fa0 + 1f57014: e30319b8 movw r1, #14776 ; 0x39b8 + 1f57018: e34011f6 movt r1, #502 ; 0x1f6 + 1f5701c: e1a00004 mov r0, r4 + 1f57020: ebffea32 bl 1f518f0 + 1f57024: e3500000 cmp r0, #0 + 1f57028: 0a00000b beq 1f5705c + 1f5702c: e30319c4 movw r1, #14788 ; 0x39c4 + 1f57030: e34011f6 movt r1, #502 ; 0x1f6 + 1f57034: e1a00004 mov r0, r4 + 1f57038: ebffea2c bl 1f518f0 + 1f5703c: e3500000 cmp r0, #0 + 1f57040: 1a00000b bne 1f57074 + 1f57044: e3a0004c mov r0, #76 ; 0x4c + 1f57048: ebff9d46 bl 1f3e568 + 1f5704c: e1a01006 mov r1, r6 + 1f57050: e1a05000 mov r5, r0 + 1f57054: ebfff825 bl 1f550f0 + 1f57058: eaffffd0 b 1f56fa0 + 1f5705c: e300046c movw r0, #1132 ; 0x46c + 1f57060: ebff9d40 bl 1f3e568 + 1f57064: e1a01006 mov r1, r6 + 1f57068: e1a05000 mov r5, r0 + 1f5706c: ebfff684 bl 1f54a84 + 1f57070: eaffffca b 1f56fa0 + 1f57074: e30319d0 movw r1, #14800 ; 0x39d0 + 1f57078: e34011f6 movt r1, #502 ; 0x1f6 + 1f5707c: e1a00004 mov r0, r4 + 1f57080: ebffea1a bl 1f518f0 + 1f57084: e3500000 cmp r0, #0 + 1f57088: 0a00000b beq 1f570bc + 1f5708c: e30319dc movw r1, #14812 ; 0x39dc + 1f57090: e34011f6 movt r1, #502 ; 0x1f6 + 1f57094: e1a00004 mov r0, r4 + 1f57098: ebffea14 bl 1f518f0 + 1f5709c: e3500000 cmp r0, #0 + 1f570a0: 1a00000b bne 1f570d4 + 1f570a4: e3a00050 mov r0, #80 ; 0x50 + 1f570a8: ebff9d2e bl 1f3e568 + 1f570ac: e1a01006 mov r1, r6 + 1f570b0: e1a05000 mov r5, r0 + 1f570b4: ebffe449 bl 1f501e0 + 1f570b8: eaffffb8 b 1f56fa0 + 1f570bc: e3a00050 mov r0, #80 ; 0x50 + 1f570c0: ebff9d28 bl 1f3e568 + 1f570c4: e1a01006 mov r1, r6 + 1f570c8: e1a05000 mov r5, r0 + 1f570cc: ebffe2b5 bl 1f4fba8 + 1f570d0: eaffffb2 b 1f56fa0 + 1f570d4: e30319e8 movw r1, #14824 ; 0x39e8 + 1f570d8: e34011f6 movt r1, #502 ; 0x1f6 + 1f570dc: e1a00004 mov r0, r4 + 1f570e0: ebffea02 bl 1f518f0 + 1f570e4: e3500000 cmp r0, #0 + 1f570e8: 1a000005 bne 1f57104 + 1f570ec: e3a000d0 mov r0, #208 ; 0xd0 + 1f570f0: ebff9d1c bl 1f3e568 + 1f570f4: e1a01006 mov r1, r6 + 1f570f8: e1a05000 mov r5, r0 + 1f570fc: ebfffbfe bl 1f560fc + 1f57100: eaffffa6 b 1f56fa0 + 1f57104: e30319f4 movw r1, #14836 ; 0x39f4 + 1f57108: e34011f6 movt r1, #502 ; 0x1f6 + 1f5710c: e1a00004 mov r0, r4 + 1f57110: ebffe9f6 bl 1f518f0 + 1f57114: e3500000 cmp r0, #0 + 1f57118: 13a05000 movne r5, #0 + 1f5711c: 1affffaa bne 1f56fcc + 1f57120: e3a0004c mov r0, #76 ; 0x4c + 1f57124: ebff9d0f bl 1f3e568 + 1f57128: e1a01006 mov r1, r6 + 1f5712c: e1a05000 mov r5, r0 + 1f57130: ebfffeee bl 1f56cf0 + 1f57134: eaffff99 b 1f56fa0 + +01f57138 : + 1f57138: e92d4070 push {r4, r5, r6, lr} + 1f5713c: e3a01000 mov r1, #0 + 1f57140: e1a06000 mov r6, r0 + 1f57144: ebffe0ef bl 1f4f508 + 1f57148: e30319a0 movw r1, #14752 ; 0x39a0 + 1f5714c: e34011f6 movt r1, #502 ; 0x1f6 + 1f57150: e1a05000 mov r5, r0 + 1f57154: ebffe9e5 bl 1f518f0 + 1f57158: e3500000 cmp r0, #0 + 1f5715c: 1a000015 bne 1f571b8 + 1f57160: e3a00080 mov r0, #128 ; 0x80 + 1f57164: ebff9cff bl 1f3e568 + 1f57168: e1a01006 mov r1, r6 + 1f5716c: e1a04000 mov r4, r0 + 1f57170: eb000079 bl 1f5735c + 1f57174: e3540000 cmp r4, #0 + 1f57178: 0a00001b beq 1f571ec + 1f5717c: e1a00005 mov r0, r5 + 1f57180: ebffe99f bl 1f51804 + 1f57184: e3a01003 mov r1, #3 + 1f57188: e1a03000 mov r3, r0 + 1f5718c: e3032a00 movw r2, #14848 ; 0x3a00 + 1f57190: e34021f6 movt r2, #502 ; 0x1f6 + 1f57194: e3030a10 movw r0, #14864 ; 0x3a10 + 1f57198: e34001f6 movt r0, #502 ; 0x1f6 + 1f5719c: ebfea839 bl 1f01288 + 1f571a0: e1a00005 mov r0, r5 + 1f571a4: ebffe98c bl 1f517dc <_String> + 1f571a8: e1a00005 mov r0, r5 + 1f571ac: ebff9cf5 bl 1f3e588 + 1f571b0: e1a00004 mov r0, r4 + 1f571b4: e8bd8070 pop {r4, r5, r6, pc} + 1f571b8: e30319ac movw r1, #14764 ; 0x39ac + 1f571bc: e34011f6 movt r1, #502 ; 0x1f6 + 1f571c0: e1a00005 mov r0, r5 + 1f571c4: ebffe9c9 bl 1f518f0 + 1f571c8: e3500000 cmp r0, #0 + 1f571cc: 1a000013 bne 1f57220 + 1f571d0: e3a00050 mov r0, #80 ; 0x50 + 1f571d4: ebff9ce3 bl 1f3e568 + 1f571d8: e1a01006 mov r1, r6 + 1f571dc: e1a04000 mov r4, r0 + 1f571e0: ebffefa3 bl 1f53074 + 1f571e4: e3540000 cmp r4, #0 + 1f571e8: 1affffe3 bne 1f5717c + 1f571ec: e1a00005 mov r0, r5 + 1f571f0: ebffe979 bl 1f517dc <_String> + 1f571f4: e1a00005 mov r0, r5 + 1f571f8: ebff9ce2 bl 1f3e588 + 1f571fc: e3a01001 mov r1, #1 + 1f57200: e1a00006 mov r0, r6 + 1f57204: ebffe0bf bl 1f4f508 + 1f57208: e1a01000 mov r1, r0 + 1f5720c: e1a00006 mov r0, r6 + 1f57210: ebffff54 bl 1f56f68 + 1f57214: e3500000 cmp r0, #0 + 1f57218: 0a000030 beq 1f572e0 + 1f5721c: e8bd8070 pop {r4, r5, r6, pc} + 1f57220: e30319b8 movw r1, #14776 ; 0x39b8 + 1f57224: e34011f6 movt r1, #502 ; 0x1f6 + 1f57228: e1a00005 mov r0, r5 + 1f5722c: ebffe9af bl 1f518f0 + 1f57230: e3500000 cmp r0, #0 + 1f57234: 0a00000b beq 1f57268 + 1f57238: e30319c4 movw r1, #14788 ; 0x39c4 + 1f5723c: e34011f6 movt r1, #502 ; 0x1f6 + 1f57240: e1a00005 mov r0, r5 + 1f57244: ebffe9a9 bl 1f518f0 + 1f57248: e3500000 cmp r0, #0 + 1f5724c: 1a00000b bne 1f57280 + 1f57250: e3a0004c mov r0, #76 ; 0x4c + 1f57254: ebff9cc3 bl 1f3e568 + 1f57258: e1a01006 mov r1, r6 + 1f5725c: e1a04000 mov r4, r0 + 1f57260: ebfff7a2 bl 1f550f0 + 1f57264: eaffffc2 b 1f57174 + 1f57268: e300046c movw r0, #1132 ; 0x46c + 1f5726c: ebff9cbd bl 1f3e568 + 1f57270: e1a01006 mov r1, r6 + 1f57274: e1a04000 mov r4, r0 + 1f57278: ebfff601 bl 1f54a84 + 1f5727c: eaffffbc b 1f57174 + 1f57280: e30319d0 movw r1, #14800 ; 0x39d0 + 1f57284: e34011f6 movt r1, #502 ; 0x1f6 + 1f57288: e1a00005 mov r0, r5 + 1f5728c: ebffe997 bl 1f518f0 + 1f57290: e3500000 cmp r0, #0 + 1f57294: 0a00000b beq 1f572c8 + 1f57298: e30319dc movw r1, #14812 ; 0x39dc + 1f5729c: e34011f6 movt r1, #502 ; 0x1f6 + 1f572a0: e1a00005 mov r0, r5 + 1f572a4: ebffe991 bl 1f518f0 + 1f572a8: e3500000 cmp r0, #0 + 1f572ac: 1a000012 bne 1f572fc + 1f572b0: e3a00050 mov r0, #80 ; 0x50 + 1f572b4: ebff9cab bl 1f3e568 + 1f572b8: e1a01006 mov r1, r6 + 1f572bc: e1a04000 mov r4, r0 + 1f572c0: ebffe3c6 bl 1f501e0 + 1f572c4: eaffffaa b 1f57174 + 1f572c8: e3a00050 mov r0, #80 ; 0x50 + 1f572cc: ebff9ca5 bl 1f3e568 + 1f572d0: e1a01006 mov r1, r6 + 1f572d4: e1a04000 mov r4, r0 + 1f572d8: ebffe232 bl 1f4fba8 + 1f572dc: eaffffa4 b 1f57174 + 1f572e0: e3a01002 mov r1, #2 + 1f572e4: e1a00006 mov r0, r6 + 1f572e8: ebffe086 bl 1f4f508 + 1f572ec: e1a01000 mov r1, r0 + 1f572f0: e1a00006 mov r0, r6 + 1f572f4: e8bd4070 pop {r4, r5, r6, lr} + 1f572f8: eaffff1a b 1f56f68 + 1f572fc: e30319e8 movw r1, #14824 ; 0x39e8 + 1f57300: e34011f6 movt r1, #502 ; 0x1f6 + 1f57304: e1a00005 mov r0, r5 + 1f57308: ebffe978 bl 1f518f0 + 1f5730c: e3500000 cmp r0, #0 + 1f57310: 1a000005 bne 1f5732c + 1f57314: e3a000d0 mov r0, #208 ; 0xd0 + 1f57318: ebff9c92 bl 1f3e568 + 1f5731c: e1a01006 mov r1, r6 + 1f57320: e1a04000 mov r4, r0 + 1f57324: ebfffb74 bl 1f560fc + 1f57328: eaffff91 b 1f57174 + 1f5732c: e30319f4 movw r1, #14836 ; 0x39f4 + 1f57330: e34011f6 movt r1, #502 ; 0x1f6 + 1f57334: e1a00005 mov r0, r5 + 1f57338: ebffe96c bl 1f518f0 + 1f5733c: e3500000 cmp r0, #0 + 1f57340: 1affffa9 bne 1f571ec + 1f57344: e3a0004c mov r0, #76 ; 0x4c + 1f57348: ebff9c86 bl 1f3e568 + 1f5734c: e1a01006 mov r1, r6 + 1f57350: e1a04000 mov r4, r0 + 1f57354: ebfffe65 bl 1f56cf0 + 1f57358: eaffff85 b 1f57174 + +01f5735c : + 1f5735c: e92d4010 push {r4, lr} + 1f57360: e1a04000 mov r4, r0 + 1f57364: ebffdf43 bl 1f4f078 + 1f57368: e3a03000 mov r3, #0 + 1f5736c: e3072a98 movw r2, #31384 ; 0x7a98 + 1f57370: e34021f5 movt r2, #501 ; 0x1f5 + 1f57374: e5843038 str r3, [r4, #56] ; 0x38 + 1f57378: e5842000 str r2, [r4] + 1f5737c: e584303c str r3, [r4, #60] ; 0x3c + 1f57380: e5843040 str r3, [r4, #64] ; 0x40 + 1f57384: e5843060 str r3, [r4, #96] ; 0x60 + 1f57388: e5843044 str r3, [r4, #68] ; 0x44 + 1f5738c: e5843064 str r3, [r4, #100] ; 0x64 + 1f57390: e5843048 str r3, [r4, #72] ; 0x48 + 1f57394: e5843068 str r3, [r4, #104] ; 0x68 + 1f57398: e584304c str r3, [r4, #76] ; 0x4c + 1f5739c: e584306c str r3, [r4, #108] ; 0x6c + 1f573a0: e5843050 str r3, [r4, #80] ; 0x50 + 1f573a4: e5843070 str r3, [r4, #112] ; 0x70 + 1f573a8: e5843054 str r3, [r4, #84] ; 0x54 + 1f573ac: e5843074 str r3, [r4, #116] ; 0x74 + 1f573b0: e5843058 str r3, [r4, #88] ; 0x58 + 1f573b4: e5843078 str r3, [r4, #120] ; 0x78 + 1f573b8: e584305c str r3, [r4, #92] ; 0x5c + 1f573bc: e584307c str r3, [r4, #124] ; 0x7c + 1f573c0: e8bd8010 pop {r4, pc} + +01f573c4 <_USBStandardHub>: + 1f573c4: e590303c ldr r3, [r0, #60] ; 0x3c + 1f573c8: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f573cc: e3530000 cmp r3, #0 + 1f573d0: e1a07000 mov r7, r0 + 1f573d4: 13a05000 movne r5, #0 + 1f573d8: 1280605c addne r6, r0, #92 ; 0x5c + 1f573dc: 11a08005 movne r8, r5 + 1f573e0: 1280403c addne r4, r0, #60 ; 0x3c + 1f573e4: 0a00000f beq 1f57428 <_USBStandardHub+0x64> + 1f573e8: e5b63004 ldr r3, [r6, #4]! + 1f573ec: e2855001 add r5, r5, #1 + 1f573f0: e2530000 subs r0, r3, #0 + 1f573f4: 0a000001 beq 1f57400 <_USBStandardHub+0x3c> + 1f573f8: ebff9c62 bl 1f3e588 + 1f573fc: e5868000 str r8, [r6] + 1f57400: e5b43004 ldr r3, [r4, #4]! + 1f57404: e2530000 subs r0, r3, #0 + 1f57408: 0a000003 beq 1f5741c <_USBStandardHub+0x58> + 1f5740c: ebffdf56 bl 1f4f16c <_USBDevice> + 1f57410: e5940000 ldr r0, [r4] + 1f57414: ebff9c5b bl 1f3e588 + 1f57418: e5848000 str r8, [r4] + 1f5741c: e597303c ldr r3, [r7, #60] ; 0x3c + 1f57420: e1530005 cmp r3, r5 + 1f57424: 8affffef bhi 1f573e8 <_USBStandardHub+0x24> + 1f57428: e5970038 ldr r0, [r7, #56] ; 0x38 + 1f5742c: e3a04000 mov r4, #0 + 1f57430: e587403c str r4, [r7, #60] ; 0x3c + 1f57434: e1500004 cmp r0, r4 + 1f57438: 0a000001 beq 1f57444 <_USBStandardHub+0x80> + 1f5743c: ebff9c51 bl 1f3e588 + 1f57440: e5874038 str r4, [r7, #56] ; 0x38 + 1f57444: e1a00007 mov r0, r7 + 1f57448: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} + 1f5744c: eaffdf46 b 1f4f16c <_USBDevice> + +01f57450 : + 1f57450: eaffdf6b b 1f4f204 + +01f57454 : + 1f57454: e92d41f0 push {r4, r5, r6, r7, r8, lr} + 1f57458: e1a07000 mov r7, r0 + 1f5745c: e3a0000c mov r0, #12 + 1f57460: ebff9c40 bl 1f3e568 + 1f57464: e3a04000 mov r4, #0 + 1f57468: e1a06000 mov r6, r0 + 1f5746c: ebffe8c9 bl 1f51798 + 1f57470: e6ef1074 uxtb r1, r4 + 1f57474: e1a00007 mov r0, r7 + 1f57478: ebffe022 bl 1f4f508 + 1f5747c: e30f1aa0 movw r1, #64160 ; 0xfaa0 + 1f57480: e34011f5 movt r1, #501 ; 0x1f5 + 1f57484: e1a05000 mov r5, r0 + 1f57488: ebffe918 bl 1f518f0 + 1f5748c: e3500000 cmp r0, #0 + 1f57490: e2844001 add r4, r4, #1 + 1f57494: 1a00000f bne 1f574d8 + 1f57498: e1a00005 mov r0, r5 + 1f5749c: ebffe8ce bl 1f517dc <_String> + 1f574a0: e1a00005 mov r0, r5 + 1f574a4: ebff9c37 bl 1f3e588 + 1f574a8: e3540003 cmp r4, #3 + 1f574ac: 1affffef bne 1f57470 + 1f574b0: e1a00006 mov r0, r6 + 1f574b4: ebffe8ea bl 1f51864 + 1f574b8: e3500000 cmp r0, #0 + 1f574bc: 1a000003 bne 1f574d0 + 1f574c0: e30f1aa0 movw r1, #64160 ; 0xfaa0 + 1f574c4: e34011f5 movt r1, #501 ; 0x1f5 + 1f574c8: e1a00006 mov r0, r6 + 1f574cc: ebffe8d2 bl 1f5181c + 1f574d0: e1a00006 mov r0, r6 + 1f574d4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} + 1f574d8: e1a00006 mov r0, r6 + 1f574dc: ebffe8e0 bl 1f51864 + 1f574e0: e3500000 cmp r0, #0 + 1f574e4: 1a000005 bne 1f57500 + 1f574e8: e1a00005 mov r0, r5 + 1f574ec: ebffe8c4 bl 1f51804 + 1f574f0: e1a01000 mov r1, r0 + 1f574f4: e1a00006 mov r0, r6 + 1f574f8: ebffe8dd bl 1f51874 + 1f574fc: eaffffe5 b 1f57498 + 1f57500: e3031a20 movw r1, #14880 ; 0x3a20 + 1f57504: e34011f6 movt r1, #502 ; 0x1f6 + 1f57508: e1a00006 mov r0, r6 + 1f5750c: ebffe8d8 bl 1f51874 + 1f57510: eafffff4 b 1f574e8 + +01f57514 : + 1f57514: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 1f57518: e1a07000 mov r7, r0 + 1f5751c: e24dd01c sub sp, sp, #28 + 1f57520: ebffe03f bl 1f4f624 + 1f57524: e1a08000 mov r8, r0 + 1f57528: e1a00007 mov r0, r7 + 1f5752c: ebffe03a bl 1f4f61c + 1f57530: e597303c ldr r3, [r7, #60] ; 0x3c + 1f57534: e1a0b000 mov fp, r0 + 1f57538: e3530000 cmp r3, #0 + 1f5753c: 13a03000 movne r3, #0 + 1f57540: 13a06008 movne r6, #8 + 1f57544: 11a05003 movne r5, r3 + 1f57548: 1a000003 bne 1f5755c + 1f5754c: ea000019 b 1f575b8 + 1f57550: e597203c ldr r2, [r7, #60] ; 0x3c + 1f57554: e1520004 cmp r2, r4 + 1f57558: 9a000016 bls 1f575b8 + 1f5755c: e2834001 add r4, r3, #1 + 1f57560: e58d500c str r5, [sp, #12] + 1f57564: e3a03003 mov r3, #3 + 1f57568: e58d5008 str r5, [sp, #8] + 1f5756c: e6ff1074 uxth r1, r4 + 1f57570: e58d6000 str r6, [sp] + 1f57574: e58d1004 str r1, [sp, #4] + 1f57578: e3a02023 mov r2, #35 ; 0x23 + 1f5757c: e1a0100b mov r1, fp + 1f57580: e1a00008 mov r0, r8 + 1f57584: ebffda67 bl 1f4df28 + 1f57588: e3500000 cmp r0, #0 + 1f5758c: e1a03004 mov r3, r4 + 1f57590: aaffffee bge 1f57550 + 1f57594: e3032a24 movw r2, #14884 ; 0x3a24 + 1f57598: e34021f6 movt r2, #502 ; 0x1f6 + 1f5759c: e3030a18 movw r0, #14872 ; 0x3a18 + 1f575a0: e34001f6 movt r0, #502 ; 0x1f6 + 1f575a4: e3a01001 mov r1, #1 + 1f575a8: ebfea736 bl 1f01288 + 1f575ac: e3a00000 mov r0, #0 + 1f575b0: e28dd01c add sp, sp, #28 + 1f575b4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f575b8: e30001fe movw r0, #510 ; 0x1fe + 1f575bc: ebfea77b bl 1f013b0 + 1f575c0: e597303c ldr r3, [r7, #60] ; 0x3c + 1f575c4: e3530000 cmp r3, #0 + 1f575c8: 158d7014 strne r7, [sp, #20] + 1f575cc: 1287605c addne r6, r7, #92 ; 0x5c + 1f575d0: 12879040 addne r9, r7, #64 ; 0x40 + 1f575d4: 13a04001 movne r4, #1 + 1f575d8: 1a00003b bne 1f576cc + 1f575dc: e3a05000 mov r5, #0 + 1f575e0: e3a00004 mov r0, #4 + 1f575e4: ebff9bdf bl 1f3e568 + 1f575e8: e3a01004 mov r1, #4 + 1f575ec: e58d0008 str r0, [sp, #8] + 1f575f0: e1a09000 mov r9, r0 + 1f575f4: e58d100c str r1, [sp, #12] + 1f575f8: e1a03005 mov r3, r5 + 1f575fc: e58d5004 str r5, [sp, #4] + 1f57600: e3a020a0 mov r2, #160 ; 0xa0 + 1f57604: e58d5000 str r5, [sp] + 1f57608: e1a0100b mov r1, fp + 1f5760c: e1a00008 mov r0, r8 + 1f57610: ebffda44 bl 1f4df28 + 1f57614: e3500004 cmp r0, #4 + 1f57618: e1a06000 mov r6, r0 + 1f5761c: 1a000100 bne 1f57a24 + 1f57620: e1d930b0 ldrh r3, [r9] + 1f57624: e3130002 tst r3, #2 + 1f57628: 0a0000ca beq 1f57958 + 1f5762c: e597303c ldr r3, [r7, #60] ; 0x3c + 1f57630: e3530000 cmp r3, #0 + 1f57634: 13a04001 movne r4, #1 + 1f57638: 13a06008 movne r6, #8 + 1f5763c: 0a00000e beq 1f5767c + 1f57640: e6ff1074 uxth r1, r4 + 1f57644: e3a03001 mov r3, #1 + 1f57648: e3a02023 mov r2, #35 ; 0x23 + 1f5764c: e58d1004 str r1, [sp, #4] + 1f57650: e58d500c str r5, [sp, #12] + 1f57654: e1a0100b mov r1, fp + 1f57658: e58d5008 str r5, [sp, #8] + 1f5765c: e1a00008 mov r0, r8 + 1f57660: e58d6000 str r6, [sp] + 1f57664: ebffda2f bl 1f4df28 + 1f57668: e597203c ldr r2, [r7, #60] ; 0x3c + 1f5766c: e2843001 add r3, r4, #1 + 1f57670: e1540002 cmp r4, r2 + 1f57674: e1a04003 mov r4, r3 + 1f57678: 3afffff0 bcc 1f57640 + 1f5767c: e3a01001 mov r1, #1 + 1f57680: e3032b48 movw r2, #15176 ; 0x3b48 + 1f57684: e34021f6 movt r2, #502 ; 0x1f6 + 1f57688: e3030a18 movw r0, #14872 ; 0x3a18 + 1f5768c: e34001f6 movt r0, #502 ; 0x1f6 + 1f57690: ebfea6fc bl 1f01288 + 1f57694: e1a00009 mov r0, r9 + 1f57698: ebff9bba bl 1f3e588 + 1f5769c: eaffffc2 b 1f575ac + 1f576a0: e5963000 ldr r3, [r6] + 1f576a4: e1d330b0 ldrh r3, [r3] + 1f576a8: e3130001 tst r3, #1 + 1f576ac: 1a000020 bne 1f57734 + 1f576b0: e59d3014 ldr r3, [sp, #20] + 1f576b4: e2899004 add r9, r9, #4 + 1f576b8: e593203c ldr r2, [r3, #60] ; 0x3c + 1f576bc: e2843001 add r3, r4, #1 + 1f576c0: e1520004 cmp r2, r4 + 1f576c4: 9a00006e bls 1f57884 + 1f576c8: e1a04003 mov r4, r3 + 1f576cc: e3a05000 mov r5, #0 + 1f576d0: e3a00004 mov r0, #4 + 1f576d4: ebff9ba3 bl 1f3e568 + 1f576d8: e6ffa074 uxth sl, r4 + 1f576dc: e3a020a3 mov r2, #163 ; 0xa3 + 1f576e0: e3a03004 mov r3, #4 + 1f576e4: e1a0100b mov r1, fp + 1f576e8: e58d300c str r3, [sp, #12] + 1f576ec: e5a60004 str r0, [r6, #4]! + 1f576f0: e1a03005 mov r3, r5 + 1f576f4: e58d0008 str r0, [sp, #8] + 1f576f8: e1a00008 mov r0, r8 + 1f576fc: e58d5000 str r5, [sp] + 1f57700: e58da004 str sl, [sp, #4] + 1f57704: ebffda07 bl 1f4df28 + 1f57708: e3500004 cmp r0, #4 + 1f5770c: 13032a3c movwne r2, #14908 ; 0x3a3c + 1f57710: e1a07000 mov r7, r0 + 1f57714: 134021f6 movtne r2, #502 ; 0x1f6 + 1f57718: 0affffe0 beq 1f576a0 + 1f5771c: e3030a18 movw r0, #14872 ; 0x3a18 + 1f57720: e34001f6 movt r0, #502 ; 0x1f6 + 1f57724: e1a03004 mov r3, r4 + 1f57728: e3a01001 mov r1, #1 + 1f5772c: ebfea6d5 bl 1f01288 + 1f57730: eaffffde b 1f576b0 + 1f57734: e58d0000 str r0, [sp] + 1f57738: e3a03003 mov r3, #3 + 1f5773c: e58d500c str r5, [sp, #12] + 1f57740: e3a02023 mov r2, #35 ; 0x23 + 1f57744: e58d5008 str r5, [sp, #8] + 1f57748: e1a0100b mov r1, fp + 1f5774c: e58da004 str sl, [sp, #4] + 1f57750: e1a00008 mov r0, r8 + 1f57754: ebffd9f3 bl 1f4df28 + 1f57758: e3500000 cmp r0, #0 + 1f5775c: ba000031 blt 1f57828 + 1f57760: e3a00064 mov r0, #100 ; 0x64 + 1f57764: ebfea711 bl 1f013b0 + 1f57768: e5960000 ldr r0, [r6] + 1f5776c: e58d0008 str r0, [sp, #8] + 1f57770: e1a03005 mov r3, r5 + 1f57774: e58d700c str r7, [sp, #12] + 1f57778: e3a020a3 mov r2, #163 ; 0xa3 + 1f5777c: e58da004 str sl, [sp, #4] + 1f57780: e1a0100b mov r1, fp + 1f57784: e58d5000 str r5, [sp] + 1f57788: e1a00008 mov r0, r8 + 1f5778c: ebffd9e5 bl 1f4df28 + 1f57790: e3500004 cmp r0, #4 + 1f57794: 1affff84 bne 1f575ac + 1f57798: e5963000 ldr r3, [r6] + 1f5779c: e1d330b0 ldrh r3, [r3] + 1f577a0: e3130002 tst r3, #2 + 1f577a4: 03032a74 movweq r2, #14964 ; 0x3a74 + 1f577a8: 034021f6 movteq r2, #502 ; 0x1f6 + 1f577ac: 0affffda beq 1f5771c + 1f577b0: e2032008 and r2, r3, #8 + 1f577b4: e6ff2072 uxth r2, r2 + 1f577b8: e3520000 cmp r2, #0 + 1f577bc: 1a0000a5 bne 1f57a58 + 1f577c0: e3130c02 tst r3, #512 ; 0x200 + 1f577c4: 11a05002 movne r5, r2 + 1f577c8: 0a000029 beq 1f57874 + 1f577cc: e3a00038 mov r0, #56 ; 0x38 + 1f577d0: ebff9b64 bl 1f3e568 + 1f577d4: e1a07000 mov r7, r0 + 1f577d8: e59d0014 ldr r0, [sp, #20] + 1f577dc: e5897000 str r7, [r9] + 1f577e0: ebffdf85 bl 1f4f5fc + 1f577e4: e1a02005 mov r2, r5 + 1f577e8: e1a03000 mov r3, r0 + 1f577ec: e6ef1074 uxtb r1, r4 + 1f577f0: e1a00007 mov r0, r7 + 1f577f4: e58d1000 str r1, [sp] + 1f577f8: e1a01008 mov r1, r8 + 1f577fc: ebffde01 bl 1f4f008 + 1f57800: e5990000 ldr r0, [r9] + 1f57804: ebffde7e bl 1f4f204 + 1f57808: e2505000 subs r5, r0, #0 + 1f5780c: e5990000 ldr r0, [r9] + 1f57810: 1a000007 bne 1f57834 + 1f57814: ebffde54 bl 1f4f16c <_USBDevice> + 1f57818: e5990000 ldr r0, [r9] + 1f5781c: ebff9b59 bl 1f3e588 + 1f57820: e5895000 str r5, [r9] + 1f57824: eaffffa1 b 1f576b0 + 1f57828: e3032a5c movw r2, #14940 ; 0x3a5c + 1f5782c: e34021f6 movt r2, #502 ; 0x1f6 + 1f57830: eaffffb9 b 1f5771c + 1f57834: ebffff06 bl 1f57454 + 1f57838: e1a05000 mov r5, r0 + 1f5783c: ebffe7f0 bl 1f51804 + 1f57840: e1a03004 mov r3, r4 + 1f57844: e58d0000 str r0, [sp] + 1f57848: e3a01003 mov r1, #3 + 1f5784c: e3032ab0 movw r2, #15024 ; 0x3ab0 + 1f57850: e34021f6 movt r2, #502 ; 0x1f6 + 1f57854: e3030a18 movw r0, #14872 ; 0x3a18 + 1f57858: e34001f6 movt r0, #502 ; 0x1f6 + 1f5785c: ebfea689 bl 1f01288 + 1f57860: e1a00005 mov r0, r5 + 1f57864: ebffe7dc bl 1f517dc <_String> + 1f57868: e1a00005 mov r0, r5 + 1f5786c: ebff9b45 bl 1f3e588 + 1f57870: eaffff8e b 1f576b0 + 1f57874: e3130b01 tst r3, #1024 ; 0x400 + 1f57878: 03a05001 moveq r5, #1 + 1f5787c: 13a05002 movne r5, #2 + 1f57880: eaffffd1 b 1f577cc + 1f57884: e3520000 cmp r2, #0 + 1f57888: e59d7014 ldr r7, [sp, #20] + 1f5788c: 0affff52 beq 1f575dc + 1f57890: e287503c add r5, r7, #60 ; 0x3c + 1f57894: e3a04001 mov r4, #1 + 1f57898: e5b53004 ldr r3, [r5, #4]! + 1f5789c: e2530000 subs r0, r3, #0 + 1f578a0: 0a00001a beq 1f57910 + 1f578a4: ebfffe23 bl 1f57138 + 1f578a8: e2506000 subs r6, r0, #0 + 1f578ac: 0a00001b beq 1f57920 + 1f578b0: e5950000 ldr r0, [r5] + 1f578b4: ebffde2c bl 1f4f16c <_USBDevice> + 1f578b8: e5950000 ldr r0, [r5] + 1f578bc: ebff9b31 bl 1f3e588 + 1f578c0: e5856000 str r6, [r5] + 1f578c4: e1a00006 mov r0, r6 + 1f578c8: e5963000 ldr r3, [r6] + 1f578cc: e12fff33 blx r3 + 1f578d0: e3500000 cmp r0, #0 + 1f578d4: e3032acc movw r2, #15052 ; 0x3acc + 1f578d8: e34021f6 movt r2, #502 ; 0x1f6 + 1f578dc: e3030a18 movw r0, #14872 ; 0x3a18 + 1f578e0: e34001f6 movt r0, #502 ; 0x1f6 + 1f578e4: e1a03004 mov r3, r4 + 1f578e8: e3a01001 mov r1, #1 + 1f578ec: 0a000005 beq 1f57908 + 1f578f0: e3032af0 movw r2, #15088 ; 0x3af0 + 1f578f4: e34021f6 movt r2, #502 ; 0x1f6 + 1f578f8: e3030a18 movw r0, #14872 ; 0x3a18 + 1f578fc: e34001f6 movt r0, #502 ; 0x1f6 + 1f57900: e1a03004 mov r3, r4 + 1f57904: e3a01004 mov r1, #4 + 1f57908: ebfea65e bl 1f01288 + 1f5790c: e597203c ldr r2, [r7, #60] ; 0x3c + 1f57910: e1540002 cmp r4, r2 + 1f57914: e2844001 add r4, r4, #1 + 1f57918: 3affffde bcc 1f57898 + 1f5791c: eaffff2e b 1f575dc + 1f57920: e1a03004 mov r3, r4 + 1f57924: e3a01003 mov r1, #3 + 1f57928: e3032b0c movw r2, #15116 ; 0x3b0c + 1f5792c: e34021f6 movt r2, #502 ; 0x1f6 + 1f57930: e3030a18 movw r0, #14872 ; 0x3a18 + 1f57934: e34001f6 movt r0, #502 ; 0x1f6 + 1f57938: ebfea652 bl 1f01288 + 1f5793c: e5950000 ldr r0, [r5] + 1f57940: ebffde09 bl 1f4f16c <_USBDevice> + 1f57944: e5950000 ldr r0, [r5] + 1f57948: ebff9b0e bl 1f3e588 + 1f5794c: e597203c ldr r2, [r7, #60] ; 0x3c + 1f57950: e5856000 str r6, [r5] + 1f57954: eaffffed b 1f57910 + 1f57958: e1a00009 mov r0, r9 + 1f5795c: ebff9b09 bl 1f3e588 + 1f57960: e597303c ldr r3, [r7, #60] ; 0x3c + 1f57964: e3530000 cmp r3, #0 + 1f57968: 0a000048 beq 1f57a90 + 1f5796c: e3a04001 mov r4, #1 + 1f57970: e287905c add r9, r7, #92 ; 0x5c + 1f57974: e58d4014 str r4, [sp, #20] + 1f57978: ea000004 b 1f57990 + 1f5797c: e597203c ldr r2, [r7, #60] ; 0x3c + 1f57980: e2843001 add r3, r4, #1 + 1f57984: e1520004 cmp r2, r4 + 1f57988: e1a04003 mov r4, r3 + 1f5798c: 9a00002f bls 1f57a50 + 1f57990: e5b92004 ldr r2, [r9, #4]! + 1f57994: e3a05000 mov r5, #0 + 1f57998: e58d2008 str r2, [sp, #8] + 1f5799c: e1a03005 mov r3, r5 + 1f579a0: e58d600c str r6, [sp, #12] + 1f579a4: e6ffa074 uxth sl, r4 + 1f579a8: e58d5000 str r5, [sp] + 1f579ac: e3a020a3 mov r2, #163 ; 0xa3 + 1f579b0: e58da004 str sl, [sp, #4] + 1f579b4: e1a0100b mov r1, fp + 1f579b8: e1a00008 mov r0, r8 + 1f579bc: ebffd959 bl 1f4df28 + 1f579c0: e3500004 cmp r0, #4 + 1f579c4: 1affffec bne 1f5797c + 1f579c8: e5993000 ldr r3, [r9] + 1f579cc: e1d330b0 ldrh r3, [r3] + 1f579d0: e3130008 tst r3, #8 + 1f579d4: 0affffe8 beq 1f5797c + 1f579d8: e1a0100b mov r1, fp + 1f579dc: e58d500c str r5, [sp, #12] + 1f579e0: e58d5008 str r5, [sp, #8] + 1f579e4: e3a02008 mov r2, #8 + 1f579e8: e58da004 str sl, [sp, #4] + 1f579ec: e3a03001 mov r3, #1 + 1f579f0: e58d2000 str r2, [sp] + 1f579f4: e1a00008 mov r0, r8 + 1f579f8: e3a02023 mov r2, #35 ; 0x23 + 1f579fc: e58d5014 str r5, [sp, #20] + 1f57a00: ebffd948 bl 1f4df28 + 1f57a04: e1a03004 mov r3, r4 + 1f57a08: e3032a8c movw r2, #14988 ; 0x3a8c + 1f57a0c: e34021f6 movt r2, #502 ; 0x1f6 + 1f57a10: e3030a18 movw r0, #14872 ; 0x3a18 + 1f57a14: e34001f6 movt r0, #502 ; 0x1f6 + 1f57a18: e3a01001 mov r1, #1 + 1f57a1c: ebfea619 bl 1f01288 + 1f57a20: eaffffd5 b 1f5797c + 1f57a24: e3a01001 mov r1, #1 + 1f57a28: e3032b30 movw r2, #15152 ; 0x3b30 + 1f57a2c: e34021f6 movt r2, #502 ; 0x1f6 + 1f57a30: e3030a18 movw r0, #14872 ; 0x3a18 + 1f57a34: e34001f6 movt r0, #502 ; 0x1f6 + 1f57a38: ebfea612 bl 1f01288 + 1f57a3c: e1a00009 mov r0, r9 + 1f57a40: ebff9ad0 bl 1f3e588 + 1f57a44: e1a00005 mov r0, r5 + 1f57a48: e28dd01c add sp, sp, #28 + 1f57a4c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 1f57a50: e59d0014 ldr r0, [sp, #20] + 1f57a54: eafffed5 b 1f575b0 + 1f57a58: e3a02008 mov r2, #8 + 1f57a5c: e3a03001 mov r3, #1 + 1f57a60: e58d2000 str r2, [sp] + 1f57a64: e1a0100b mov r1, fp + 1f57a68: e3a02023 mov r2, #35 ; 0x23 + 1f57a6c: e58d500c str r5, [sp, #12] + 1f57a70: e58d5008 str r5, [sp, #8] + 1f57a74: e1a00008 mov r0, r8 + 1f57a78: e58da004 str sl, [sp, #4] + 1f57a7c: ebffd929 bl 1f4df28 + 1f57a80: e3032a8c movw r2, #14988 ; 0x3a8c + 1f57a84: e34021f6 movt r2, #502 ; 0x1f6 + 1f57a88: e1a03004 mov r3, r4 + 1f57a8c: eafffec2 b 1f5759c + 1f57a90: e3a00001 mov r0, #1 + 1f57a94: eafffec5 b 1f575b0 + +01f57a98 : + 1f57a98: e92d40f0 push {r4, r5, r6, r7, lr} + 1f57a9c: e1a05000 mov r5, r0 + 1f57aa0: e24dd014 sub sp, sp, #20 + 1f57aa4: ebffdee0 bl 1f4f62c + 1f57aa8: e5d03004 ldrb r3, [r0, #4] + 1f57aac: e3530009 cmp r3, #9 + 1f57ab0: 1a000007 bne 1f57ad4 + 1f57ab4: e5d03005 ldrb r3, [r0, #5] + 1f57ab8: e3530000 cmp r3, #0 + 1f57abc: 1a000004 bne 1f57ad4 + 1f57ac0: e5d01006 ldrb r1, [r0, #6] + 1f57ac4: e3510002 cmp r1, #2 + 1f57ac8: 0a00000c beq 1f57b00 + 1f57acc: e1a03001 mov r3, r1 + 1f57ad0: ea000000 b 1f57ad8 + 1f57ad4: e5d03006 ldrb r3, [r0, #6] + 1f57ad8: e3032b64 movw r2, #15204 ; 0x3b64 + 1f57adc: e34021f6 movt r2, #502 ; 0x1f6 + 1f57ae0: e3030a18 movw r0, #14872 ; 0x3a18 + 1f57ae4: e34001f6 movt r0, #502 ; 0x1f6 + 1f57ae8: e3a01001 mov r1, #1 + 1f57aec: e3a04000 mov r4, #0 + 1f57af0: ebfea5e4 bl 1f01288 + 1f57af4: e1a00004 mov r0, r4 + 1f57af8: e28dd014 add sp, sp, #20 + 1f57afc: e8bd80f0 pop {r4, r5, r6, r7, pc} + 1f57b00: e5d02011 ldrb r2, [r0, #17] + 1f57b04: e3520001 cmp r2, #1 + 1f57b08: 1affffef bne 1f57acc + 1f57b0c: e1a00005 mov r0, r5 + 1f57b10: ebffdec9 bl 1f4f63c + 1f57b14: e3500000 cmp r0, #0 + 1f57b18: 0a000002 beq 1f57b28 + 1f57b1c: e5d03004 ldrb r3, [r0, #4] + 1f57b20: e3530001 cmp r3, #1 + 1f57b24: 0a000005 beq 1f57b40 + 1f57b28: e1a00005 mov r0, r5 + 1f57b2c: e3031a18 movw r1, #14872 ; 0x3a18 + 1f57b30: e34011f6 movt r1, #502 ; 0x1f6 + 1f57b34: ebffdec2 bl 1f4f644 + 1f57b38: e3a04000 mov r4, #0 + 1f57b3c: eaffffec b 1f57af4 + 1f57b40: e3a01004 mov r1, #4 + 1f57b44: e1a00005 mov r0, r5 + 1f57b48: ebffdebb bl 1f4f63c + 1f57b4c: e2506000 subs r6, r0, #0 + 1f57b50: 0a000010 beq 1f57b98 + 1f57b54: e5d63005 ldrb r3, [r6, #5] + 1f57b58: e3530009 cmp r3, #9 + 1f57b5c: 1afffff7 bne 1f57b40 + 1f57b60: e5d64006 ldrb r4, [r6, #6] + 1f57b64: e3540000 cmp r4, #0 + 1f57b68: 1afffff4 bne 1f57b40 + 1f57b6c: e5d63007 ldrb r3, [r6, #7] + 1f57b70: e3530002 cmp r3, #2 + 1f57b74: 1afffff1 bne 1f57b40 + 1f57b78: e5d67004 ldrb r7, [r6, #4] + 1f57b7c: e3570001 cmp r7, #1 + 1f57b80: 0a00000a beq 1f57bb0 + 1f57b84: e1a00005 mov r0, r5 + 1f57b88: e3031a18 movw r1, #14872 ; 0x3a18 + 1f57b8c: e34011f6 movt r1, #502 ; 0x1f6 + 1f57b90: ebffdeab bl 1f4f644 + 1f57b94: eaffffd6 b 1f57af4 + 1f57b98: e1a00005 mov r0, r5 + 1f57b9c: e3031a18 movw r1, #14872 ; 0x3a18 + 1f57ba0: e34011f6 movt r1, #502 ; 0x1f6 + 1f57ba4: e1a04006 mov r4, r6 + 1f57ba8: ebffdea5 bl 1f4f644 + 1f57bac: eaffffd0 b 1f57af4 + 1f57bb0: e3a01005 mov r1, #5 + 1f57bb4: e1a00005 mov r0, r5 + 1f57bb8: ebffde9f bl 1f4f63c + 1f57bbc: e3500000 cmp r0, #0 + 1f57bc0: 0affffd8 beq 1f57b28 + 1f57bc4: e1d030d2 ldrsb r3, [r0, #2] + 1f57bc8: e3530000 cmp r3, #0 + 1f57bcc: aaffffd5 bge 1f57b28 + 1f57bd0: e5d03003 ldrb r3, [r0, #3] + 1f57bd4: e203303f and r3, r3, #63 ; 0x3f + 1f57bd8: e3530003 cmp r3, #3 + 1f57bdc: 1affffd1 bne 1f57b28 + 1f57be0: e1a00005 mov r0, r5 + 1f57be4: ebffdcee bl 1f4efa4 + 1f57be8: e2504000 subs r4, r0, #0 + 1f57bec: 0a000037 beq 1f57cd0 + 1f57bf0: e1a00005 mov r0, r5 + 1f57bf4: ebffde8a bl 1f4f624 + 1f57bf8: e5d63003 ldrb r3, [r6, #3] + 1f57bfc: e1a07000 mov r7, r0 + 1f57c00: e3530000 cmp r3, #0 + 1f57c04: 0a00000f beq 1f57c48 + 1f57c08: e1a00005 mov r0, r5 + 1f57c0c: e3a04000 mov r4, #0 + 1f57c10: ebffde81 bl 1f4f61c + 1f57c14: e58d400c str r4, [sp, #12] + 1f57c18: e58d4008 str r4, [sp, #8] + 1f57c1c: e1a01000 mov r1, r0 + 1f57c20: e3a0300b mov r3, #11 + 1f57c24: e3a02001 mov r2, #1 + 1f57c28: e5d60002 ldrb r0, [r6, #2] + 1f57c2c: e58d0004 str r0, [sp, #4] + 1f57c30: e1a00007 mov r0, r7 + 1f57c34: e5d6c003 ldrb ip, [r6, #3] + 1f57c38: e58dc000 str ip, [sp] + 1f57c3c: ebffd8b9 bl 1f4df28 + 1f57c40: e1500004 cmp r0, r4 + 1f57c44: ba00003b blt 1f57d38 + 1f57c48: e3a00009 mov r0, #9 + 1f57c4c: ebff9a45 bl 1f3e568 + 1f57c50: e5850038 str r0, [r5, #56] ; 0x38 + 1f57c54: e1a00005 mov r0, r5 + 1f57c58: ebffde6f bl 1f4f61c + 1f57c5c: e5953038 ldr r3, [r5, #56] ; 0x38 + 1f57c60: e1a01000 mov r1, r0 + 1f57c64: e58d3000 str r3, [sp] + 1f57c68: e3a02009 mov r2, #9 + 1f57c6c: e3a030a0 mov r3, #160 ; 0xa0 + 1f57c70: e1a00007 mov r0, r7 + 1f57c74: e98d000c stmib sp, {r2, r3} + 1f57c78: e3a03000 mov r3, #0 + 1f57c7c: e3a02029 mov r2, #41 ; 0x29 + 1f57c80: ebffd8e6 bl 1f4e020 + 1f57c84: e3500009 cmp r0, #9 + 1f57c88: 1a000017 bne 1f57cec + 1f57c8c: e5953038 ldr r3, [r5, #56] ; 0x38 + 1f57c90: e5d33002 ldrb r3, [r3, #2] + 1f57c94: e585303c str r3, [r5, #60] ; 0x3c + 1f57c98: e3530008 cmp r3, #8 + 1f57c9c: 8a00001e bhi 1f57d1c + 1f57ca0: e1a00005 mov r0, r5 + 1f57ca4: ebfffe1a bl 1f57514 + 1f57ca8: e2504000 subs r4, r0, #0 + 1f57cac: 13a04001 movne r4, #1 + 1f57cb0: 1affff8f bne 1f57af4 + 1f57cb4: e3032bb0 movw r2, #15280 ; 0x3bb0 + 1f57cb8: e34021f6 movt r2, #502 ; 0x1f6 + 1f57cbc: e3030a18 movw r0, #14872 ; 0x3a18 + 1f57cc0: e34001f6 movt r0, #502 ; 0x1f6 + 1f57cc4: e3a01001 mov r1, #1 + 1f57cc8: ebfea56e bl 1f01288 + 1f57ccc: eaffff88 b 1f57af4 + 1f57cd0: e1a01007 mov r1, r7 + 1f57cd4: e303250c movw r2, #13580 ; 0x350c + 1f57cd8: e34021f6 movt r2, #502 ; 0x1f6 + 1f57cdc: e3030a18 movw r0, #14872 ; 0x3a18 + 1f57ce0: e34001f6 movt r0, #502 ; 0x1f6 + 1f57ce4: ebfea567 bl 1f01288 + 1f57ce8: eaffff81 b 1f57af4 + 1f57cec: e3032b80 movw r2, #15232 ; 0x3b80 + 1f57cf0: e34021f6 movt r2, #502 ; 0x1f6 + 1f57cf4: e3030a18 movw r0, #14872 ; 0x3a18 + 1f57cf8: e34001f6 movt r0, #502 ; 0x1f6 + 1f57cfc: e3a01001 mov r1, #1 + 1f57d00: ebfea560 bl 1f01288 + 1f57d04: e5950038 ldr r0, [r5, #56] ; 0x38 + 1f57d08: ebff9a1e bl 1f3e588 + 1f57d0c: e3a03000 mov r3, #0 + 1f57d10: e1a04003 mov r4, r3 + 1f57d14: e5853038 str r3, [r5, #56] ; 0x38 + 1f57d18: eaffff75 b 1f57af4 + 1f57d1c: e3032b9c movw r2, #15260 ; 0x3b9c + 1f57d20: e34021f6 movt r2, #502 ; 0x1f6 + 1f57d24: e3030a18 movw r0, #14872 ; 0x3a18 + 1f57d28: e34001f6 movt r0, #502 ; 0x1f6 + 1f57d2c: e3a01001 mov r1, #1 + 1f57d30: ebfea554 bl 1f01288 + 1f57d34: eafffff2 b 1f57d04 + 1f57d38: e30327f8 movw r2, #14328 ; 0x37f8 + 1f57d3c: e34021f6 movt r2, #502 ; 0x1f6 + 1f57d40: e3030a18 movw r0, #14872 ; 0x3a18 + 1f57d44: e34001f6 movt r0, #502 ; 0x1f6 + 1f57d48: e3a01001 mov r1, #1 + 1f57d4c: ebfea54d bl 1f01288 + 1f57d50: eaffff67 b 1f57af4 + +01f57d54 : + 1f57d54: e3a02001 mov r2, #1 + 1f57d58: e3a0c000 mov ip, #0 + 1f57d5c: e3031bc8 movw r1, #15304 ; 0x3bc8 + 1f57d60: e34011f6 movt r1, #502 ; 0x1f6 + 1f57d64: e5802404 str r2, [r0, #1028] ; 0x404 + 1f57d68: e3a02b01 mov r2, #1024 ; 0x400 + 1f57d6c: e580c400 str ip, [r0, #1024] ; 0x400 + 1f57d70: e580c408 str ip, [r0, #1032] ; 0x408 + 1f57d74: eaffeb6f b 1f52b38 + +01f57d78 <_KeyMap>: + 1f57d78: e12fff1e bx lr + +01f57d7c : + 1f57d7c: e3510003 cmp r1, #3 + 1f57d80: 8a000008 bhi 1f57da8 + 1f57d84: e3a03000 mov r3, #0 + 1f57d88: e0802081 add r2, r0, r1, lsl #1 + 1f57d8c: e1a01003 mov r1, r3 + 1f57d90: e18210b3 strh r1, [r2, r3] + 1f57d94: e2833008 add r3, r3, #8 + 1f57d98: e3530b01 cmp r3, #1024 ; 0x400 + 1f57d9c: 1afffffb bne 1f57d90 + 1f57da0: e3a00001 mov r0, #1 + 1f57da4: e12fff1e bx lr + 1f57da8: e3a00000 mov r0, #0 + 1f57dac: e12fff1e bx lr + +01f57db0 : + 1f57db0: e6afc072 sxtb ip, r2 + 1f57db4: e35c0000 cmp ip, #0 + 1f57db8: c3a0c000 movgt ip, #0 + 1f57dbc: d3a0c001 movle ip, #1 + 1f57dc0: e3510003 cmp r1, #3 + 1f57dc4: 838cc001 orrhi ip, ip, #1 + 1f57dc8: e35c0000 cmp ip, #0 + 1f57dcc: 1a000008 bne 1f57df4 + 1f57dd0: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f57dd4: e300e132 movw lr, #306 ; 0x132 + 1f57dd8: e153000e cmp r3, lr + 1f57ddc: 90811102 addls r1, r1, r2, lsl #2 + 1f57de0: 93a0c001 movls ip, #1 + 1f57de4: 91a01c11 lslls r1, r1, ip + 1f57de8: 918030b1 strhls r3, [r0, r1] + 1f57dec: e1a0000c mov r0, ip + 1f57df0: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f57df4: e3a0c000 mov ip, #0 + 1f57df8: e1a0000c mov r0, ip + 1f57dfc: e12fff1e bx lr + +01f57e00 : + 1f57e00: e6af3071 sxtb r3, r1 + 1f57e04: e3530000 cmp r3, #0 + 1f57e08: da000025 ble 1f57ea4 + 1f57e0c: e1a03181 lsl r3, r1, #3 + 1f57e10: e19030b3 ldrh r3, [r0, r3] + 1f57e14: e3530f42 cmp r3, #264 ; 0x108 + 1f57e18: 0a000024 beq 1f57eb0 + 1f57e1c: e243cf43 sub ip, r3, #268 ; 0x10c + 1f57e20: e24cc003 sub ip, ip, #3 + 1f57e24: e35c000b cmp ip, #11 + 1f57e28: 8a000003 bhi 1f57e3c + 1f57e2c: e3120004 tst r2, #4 + 1f57e30: 12833027 addne r3, r3, #39 ; 0x27 + 1f57e34: 16ff3073 uxthne r3, r3 + 1f57e38: 1a00001a bne 1f57ea8 + 1f57e3c: e312008c tst r2, #140 ; 0x8c + 1f57e40: 1a000017 bne 1f57ea4 + 1f57e44: e2413053 sub r3, r1, #83 ; 0x53 + 1f57e48: e3530010 cmp r3, #16 + 1f57e4c: 9a00001d bls 1f57ec8 + 1f57e50: e3120040 tst r2, #64 ; 0x40 + 1f57e54: 0a00002b beq 1f57f08 + 1f57e58: e3120022 tst r2, #34 ; 0x22 + 1f57e5c: 13a03003 movne r3, #3 + 1f57e60: 03a03002 moveq r3, #2 + 1f57e64: e0831101 add r1, r3, r1, lsl #2 + 1f57e68: e300211e movw r2, #286 ; 0x11e + 1f57e6c: e1a01081 lsl r1, r1, #1 + 1f57e70: e19030b1 ldrh r3, [r0, r1] + 1f57e74: e1530002 cmp r3, r2 + 1f57e78: 0a00001c beq 1f57ef0 + 1f57e7c: e3530e12 cmp r3, #288 ; 0x120 + 1f57e80: 0a000014 beq 1f57ed8 + 1f57e84: e3530f47 cmp r3, #284 ; 0x11c + 1f57e88: 1a000006 bne 1f57ea8 + 1f57e8c: e5902400 ldr r2, [r0, #1024] ; 0x400 + 1f57e90: e3003133 movw r3, #307 ; 0x133 + 1f57e94: e16f2f12 clz r2, r2 + 1f57e98: e1a022a2 lsr r2, r2, #5 + 1f57e9c: e5802400 str r2, [r0, #1024] ; 0x400 + 1f57ea0: ea000000 b 1f57ea8 + 1f57ea4: e3a03000 mov r3, #0 + 1f57ea8: e1a00003 mov r0, r3 + 1f57eac: e12fff1e bx lr + 1f57eb0: e3120011 tst r2, #17 + 1f57eb4: 0affffe0 beq 1f57e3c + 1f57eb8: e3120004 tst r2, #4 + 1f57ebc: 13003142 movwne r3, #322 ; 0x142 + 1f57ec0: 1afffff8 bne 1f57ea8 + 1f57ec4: eaffffdc b 1f57e3c + 1f57ec8: e5903404 ldr r3, [r0, #1028] ; 0x404 + 1f57ecc: e2933000 adds r3, r3, #0 + 1f57ed0: 13a03001 movne r3, #1 + 1f57ed4: eaffffe2 b 1f57e64 + 1f57ed8: e5902404 ldr r2, [r0, #1028] ; 0x404 + 1f57edc: e3a03f4d mov r3, #308 ; 0x134 + 1f57ee0: e16f2f12 clz r2, r2 + 1f57ee4: e1a022a2 lsr r2, r2, #5 + 1f57ee8: e5802404 str r2, [r0, #1028] ; 0x404 + 1f57eec: eaffffed b 1f57ea8 + 1f57ef0: e5902408 ldr r2, [r0, #1032] ; 0x408 + 1f57ef4: e3003135 movw r3, #309 ; 0x135 + 1f57ef8: e16f2f12 clz r2, r2 + 1f57efc: e1a022a2 lsr r2, r2, #5 + 1f57f00: e5802408 str r2, [r0, #1032] ; 0x408 + 1f57f04: eaffffe7 b 1f57ea8 + 1f57f08: e3120022 tst r2, #34 ; 0x22 + 1f57f0c: 13a03001 movne r3, #1 + 1f57f10: 03a03000 moveq r3, #0 + 1f57f14: eaffffd2 b 1f57e64 + +01f57f18 : + 1f57f18: e241c021 sub ip, r1, #33 ; 0x21 + 1f57f1c: e52de004 push {lr} ; (str lr, [sp, #-4]!) + 1f57f20: e6ffc07c uxth ip, ip + 1f57f24: e300e111 movw lr, #273 ; 0x111 + 1f57f28: e15c000e cmp ip, lr + 1f57f2c: 8a000026 bhi 1f57fcc + 1f57f30: e241cc01 sub ip, r1, #256 ; 0x100 + 1f57f34: e6ffe07c uxth lr, ip + 1f57f38: e35e0032 cmp lr, #50 ; 0x32 + 1f57f3c: 9a00001e bls 1f57fbc + 1f57f40: e3120011 tst r2, #17 + 1f57f44: e6af2071 sxtb r2, r1 + 1f57f48: 0a000009 beq 1f57f74 + 1f57f4c: e6ef1071 uxtb r1, r1 + 1f57f50: e2412061 sub r2, r1, #97 ; 0x61 + 1f57f54: e3520019 cmp r2, #25 + 1f57f58: 8a00001b bhi 1f57fcc + 1f57f5c: e2411060 sub r1, r1, #96 ; 0x60 + 1f57f60: e3a02000 mov r2, #0 + 1f57f64: e5c31000 strb r1, [r3] + 1f57f68: e1a00003 mov r0, r3 + 1f57f6c: e5c32001 strb r2, [r3, #1] + 1f57f70: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f57f74: e5900400 ldr r0, [r0, #1024] ; 0x400 + 1f57f78: e3500000 cmp r0, #0 + 1f57f7c: 0a000009 beq 1f57fa8 + 1f57f80: e6ef1071 uxtb r1, r1 + 1f57f84: e2410041 sub r0, r1, #65 ; 0x41 + 1f57f88: e3500019 cmp r0, #25 + 1f57f8c: 92811020 addls r1, r1, #32 + 1f57f90: 96af2071 sxtbls r2, r1 + 1f57f94: 9a000003 bls 1f57fa8 + 1f57f98: e2410061 sub r0, r1, #97 ; 0x61 + 1f57f9c: e3500019 cmp r0, #25 + 1f57fa0: 92411020 subls r1, r1, #32 + 1f57fa4: 96af2071 sxtbls r2, r1 + 1f57fa8: e5c32000 strb r2, [r3] + 1f57fac: e1a00003 mov r0, r3 + 1f57fb0: e3a02000 mov r2, #0 + 1f57fb4: e5c32001 strb r2, [r3, #1] + 1f57fb8: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f57fbc: e3043090 movw r3, #16528 ; 0x4090 + 1f57fc0: e34031f6 movt r3, #502 ; 0x1f6 + 1f57fc4: e793010c ldr r0, [r3, ip, lsl #2] + 1f57fc8: e49df004 pop {pc} ; (ldr pc, [sp], #4) + 1f57fcc: e3a00000 mov r0, #0 + 1f57fd0: e49df004 pop {pc} ; (ldr pc, [sp], #4) + +01f57fd4 : + 1f57fd4: e5903400 ldr r3, [r0, #1024] ; 0x400 + 1f57fd8: e5901404 ldr r1, [r0, #1028] ; 0x404 + 1f57fdc: e3530000 cmp r3, #0 + 1f57fe0: e5903408 ldr r3, [r0, #1032] ; 0x408 + 1f57fe4: 03a02000 moveq r2, #0 + 1f57fe8: 13a00003 movne r0, #3 + 1f57fec: 03a00001 moveq r0, #1 + 1f57ff0: 13a02002 movne r2, #2 + 1f57ff4: e3510000 cmp r1, #0 + 1f57ff8: 01a00002 moveq r0, r2 + 1f57ffc: e3530000 cmp r3, #0 + 1f58000: 13800004 orrne r0, r0, #4 + 1f58004: e12fff1e bx lr diff --git a/kernel.map b/kernel.map new file mode 100644 index 0000000..f419f5f --- /dev/null +++ b/kernel.map @@ -0,0 +1,5519 @@ +Archive member included to satisfy reference by file (symbol) + +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-abs.o) + Screen.o (abs) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-aeabi_atexit.o) + main.o (__aeabi_atexit) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-cxa_atexit.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-aeabi_atexit.o) (__cxa_atexit) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-init.o) + armc-cstartup.o (__libc_init_array) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isdigit.o) + iec_commands.o (isdigit) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isspace.o) + iec_commands.o (isspace) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-malloc.o) + armc-cppstubs.o (malloc) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-malloc.o) (_malloc_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memcmp.o) + DiskImage.o (memcmp) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memcpy-stub.o) + rpi-mailbox-interface.o (memcpy) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memmove.o) + FileBrowser.o (memmove) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memset.o) + keyboard.o (memset) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mlock.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) (__malloc_lock) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-printf.o) + main.o (printf) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-rand.o) + drive.o (srand) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-realloc.o) + Screen.o (realloc) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reallocr.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-realloc.o) (_realloc_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reent.o) + armc-cstubs.o (errno) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-sbrkr.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) (_sbrk_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-snprintf.o) + main.o (snprintf) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-sprintf.o) + DiskImage.o (sprintf) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcasecmp.o) + iec_commands.o (strcasecmp) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcat.o) + iec_commands.o (strcat) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strchr.o) + iec_commands.o (strchr) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcmp.o) + FileBrowser.o (strcmp) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcpy.o) + DiskImage.o (strcpy) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strlen-stub.o) + iec_commands.o (strlen) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strncasecmp.o) + FileBrowser.o (strncasecmp) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strncpy.o) + main.o (strncpy) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strrchr.o) + DiskImage.o (strrchr) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strstr.o) + iec_commands.o (strstr) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfprintf.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-snprintf.o) (_svfprintf_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-toupper.o) + DiskImage.o (toupper) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-printf.o) (_vfprintf_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vprintf.o) + main.o (vprintf) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wsetup.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) (__swsetup_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-__atexit.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-cxa_atexit.o) (__register_exitproc) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-ctype_.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isdigit.o) (__ctype_ptr__) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-dtoa.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfprintf.o) (_dtoa_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fflush.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) (_fflush_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) (__sinit) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-freer.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-malloc.o) (_free_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fwalk.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) (_fwalk) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-impure.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-__atexit.o) (_global_impure_ptr) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfprintf.o) (_localeconv_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-makebuf.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wsetup.o) (__smakebuf_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memchr-stub.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strstr.o) (memchr) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-dtoa.o) (_Balloc) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-stdio.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) (__sread) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfiprintf.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfprintf.o) (__ssprint_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) (__sprint_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-writer.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-stdio.o) (_write_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-callocr.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) (_calloc_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-closer.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-stdio.o) (_close_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fclose.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) (_fclose_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fputwc.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) (_fputwc_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fstatr.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-makebuf.o) (_fstat_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fvwrite.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) (__sfvwrite_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isattyr.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-makebuf.o) (_isatty_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-lseekr.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-stdio.o) (_lseek_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-readr.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-stdio.o) (_read_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wbuf.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fputwc.o) (__swbuf_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wcrtomb.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fputwc.o) (_wcrtomb_r) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wctomb_r.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wcrtomb.o) (__wctomb) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivsi3.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-dtoa.o) (__aeabi_uidiv) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_divsi3.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fvwrite.o) (__aeabi_idiv) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_dvmd_tls.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivsi3.o) (__aeabi_idiv0) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_aeabi_uldivmod.o) + ff.o (__aeabi_uldivmod) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivmoddi4.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_aeabi_uldivmod.o) (__udivmoddi4) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_clzdi2.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivmoddi4.o) (__clzdi2) +C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_clzsi2.o) + C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_clzdi2.o) (__clzsi2) +uspi/lib/libuspi.a(uspilibrary.o) + main.o (USPiInitialize) +uspi/lib/libuspi.a(dwhcidevice.o) + uspi/lib/libuspi.a(uspilibrary.o) (DWHCIDevice) +uspi/lib/libuspi.a(dwhciregister.o) + uspi/lib/libuspi.a(dwhcidevice.o) (DWHCIRegister) +uspi/lib/libuspi.a(dwhcixferstagedata.o) + uspi/lib/libuspi.a(dwhcidevice.o) (DWHCITransferStageData) +uspi/lib/libuspi.a(usbdevice.o) + uspi/lib/libuspi.a(dwhcixferstagedata.o) (USBDeviceGetAddress) +uspi/lib/libuspi.a(usbendpoint.o) + uspi/lib/libuspi.a(usbdevice.o) (USBEndpoint) +uspi/lib/libuspi.a(usbrequest.o) + uspi/lib/libuspi.a(dwhcidevice.o) (USBRequest) +uspi/lib/libuspi.a(devicenameservice.o) + uspi/lib/libuspi.a(uspilibrary.o) (DeviceNameService) +uspi/lib/libuspi.a(macaddress.o) + uspi/lib/libuspi.a(uspilibrary.o) (MACAddressCopyTo) +uspi/lib/libuspi.a(smsc951x.o) + uspi/lib/libuspi.a(uspilibrary.o) (SMSC951xDeviceGetMACAddress) +uspi/lib/libuspi.a(lan7800.o) + uspi/lib/libuspi.a(uspilibrary.o) (LAN7800DeviceGetMACAddress) +uspi/lib/libuspi.a(string.o) uspi/lib/libuspi.a(uspilibrary.o) (String) +uspi/lib/libuspi.a(util.o) uspi/lib/libuspi.a(macaddress.o) (uspi_memset) +uspi/lib/libuspi.a(usbmassdevice.o) + uspi/lib/libuspi.a(uspilibrary.o) (USBBulkOnlyMassStorageDeviceSeek) +uspi/lib/libuspi.a(dwhciframeschednper.o) + uspi/lib/libuspi.a(dwhcixferstagedata.o) (DWHCIFrameSchedulerNonPeriodic) +uspi/lib/libuspi.a(dwhciframeschedper.o) + uspi/lib/libuspi.a(dwhcixferstagedata.o) (DWHCIFrameSchedulerPeriodic) +uspi/lib/libuspi.a(usbkeyboard.o) + uspi/lib/libuspi.a(uspilibrary.o) (USBKeyboardDeviceRegisterKeyPressedHandler) +uspi/lib/libuspi.a(dwhcirootport.o) + uspi/lib/libuspi.a(dwhcidevice.o) (DWHCIRootPort) +uspi/lib/libuspi.a(usbmouse.o) + uspi/lib/libuspi.a(uspilibrary.o) (USBMouseDeviceRegisterStatusHandler) +uspi/lib/libuspi.a(dwhciframeschednsplit.o) + uspi/lib/libuspi.a(dwhcixferstagedata.o) (DWHCIFrameSchedulerNoSplit) +uspi/lib/libuspi.a(usbgamepad.o) + uspi/lib/libuspi.a(uspilibrary.o) (USBGamePadDeviceRegisterStatusHandler) +uspi/lib/libuspi.a(synchronize.o) + uspi/lib/libuspi.a(dwhcidevice.o) (uspi_EnterCritical) +uspi/lib/libuspi.a(usbstring.o) + uspi/lib/libuspi.a(usbdevice.o) (USBString) +uspi/lib/libuspi.a(usbmidi.o) + uspi/lib/libuspi.a(uspilibrary.o) (USBMIDIDeviceRegisterPacketHandler) +uspi/lib/libuspi.a(usbconfigparser.o) + uspi/lib/libuspi.a(usbdevice.o) (USBConfigurationParser) +uspi/lib/libuspi.a(usbdevicefactory.o) + uspi/lib/libuspi.a(dwhcirootport.o) (USBDeviceFactoryGetDevice) +uspi/lib/libuspi.a(usbstandardhub.o) + uspi/lib/libuspi.a(usbdevicefactory.o) (USBStandardHub) +uspi/lib/libuspi.a(keymap.o) uspi/lib/libuspi.a(usbkeyboard.o) (KeyMap) + +Allocating common symbols +Common symbol size file + +PageTable2 0x800 cache.o +errno 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reent.o) +PageTable 0x4000 cache.o + +Discarded input sections + + .group 0x00000000 0x8 main.o + .group 0x00000000 0x8 main.o + .group 0x00000000 0x8 main.o + .group 0x00000000 0x8 main.o + .group 0x00000000 0x8 main.o + .group 0x00000000 0x8 main.o + .group 0x00000000 0x8 main.o + .group 0x00000000 0xc keyboard.o + .group 0x00000000 0xc keyboard.o + .group 0x00000000 0x8 keyboard.o + .group 0x00000000 0x8 keyboard.o + .bss._ZN9SingletonI8KeyboardE11m_pInstanceE + 0x00000000 0x4 keyboard.o + .group 0x00000000 0x8 iec_commands.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 m6502.o + .group 0x00000000 0x8 FileBrowser.o + .group 0x00000000 0x8 FileBrowser.o + .group 0x00000000 0x8 FileBrowser.o + .group 0x00000000 0x8 FileBrowser.o + .group 0x00000000 0x8 FileBrowser.o + .group 0x00000000 0x8 FileBrowser.o + .group 0x00000000 0x8 FileBrowser.o + .group 0x00000000 0x8 FileBrowser.o + .group 0x00000000 0x8 FileBrowser.o + .group 0x00000000 0x8 FileBrowser.o + .bss._ZN9SingletonI13InputMappingsE11m_pInstanceE + 0x00000000 0x4 FileBrowser.o + .bss._ZN9SingletonI8KeyboardE11m_pInstanceE + 0x00000000 0x4 FileBrowser.o + .group 0x00000000 0x8 DiskCaddy.o + .group 0x00000000 0xc InputMappings.o + .group 0x00000000 0xc InputMappings.o + .group 0x00000000 0x8 InputMappings.o + .group 0x00000000 0x8 InputMappings.o + .bss._ZN9SingletonI8KeyboardE11m_pInstanceE + 0x00000000 0x4 InputMappings.o + +Memory Configuration + +Name Origin Length Attributes +*default* 0x00000000 0xffffffff + +Linker script and memory map + + [!provide] PROVIDE (__executable_start, 0x1f00000) + 0x01f00000 . = 0x1f00000 + +.interp + *(.interp) + +.note.gnu.build-id + *(.note.gnu.build-id) + +.hash + *(.hash) + +.gnu.hash + *(.gnu.hash) + +.dynsym + *(.dynsym) + +.dynstr + *(.dynstr) + +.gnu.version + *(.gnu.version) + +.gnu.version_d + *(.gnu.version_d) + +.gnu.version_r + *(.gnu.version_r) + +.rel.init + *(.rel.init) + +.rela.init + *(.rela.init) + +.rel.text + *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) + +.rela.text + *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) + +.rel.fini + *(.rel.fini) + +.rela.fini + *(.rela.fini) + +.rel.rodata + *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) + +.rela.rodata + *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) + +.rel.data.rel.ro + *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) + +.rela.data.rel.ro + *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) + +.rel.data + *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) + +.rela.data + *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) + +.rel.tdata + *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) + +.rela.tdata + *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) + +.rel.tbss + *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) + +.rela.tbss + *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) + +.rel.ctors + *(.rel.ctors) + +.rela.ctors + *(.rela.ctors) + +.rel.dtors + *(.rel.dtors) + +.rela.dtors + *(.rela.dtors) + +.rel.got + *(.rel.got) + +.rela.got + *(.rela.got) + +.rel.bss + *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) + +.rela.bss + *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) + +.rel.iplt 0x01f00000 0x0 + [!provide] PROVIDE (__rel_iplt_start, .) + *(.rel.iplt) + .rel.iplt 0x01f00000 0x0 armc-start.o + [!provide] PROVIDE (__rel_iplt_end, .) + +.rela.iplt 0x01f00000 0x0 + [!provide] PROVIDE (__rela_iplt_start, .) + *(.rela.iplt) + [!provide] PROVIDE (__rela_iplt_end, .) + +.rel.plt + *(.rel.plt) + +.rela.plt + *(.rela.plt) + +.init + *(.init) + +.plt + *(.plt) + +.iplt 0x01f00000 0x0 + *(.iplt) + .iplt 0x01f00000 0x0 armc-start.o + +.text 0x01f00000 0x58008 + *(.text.startup .text.startup.*) + .text.startup 0x01f00000 0x40 armc-start.o + 0x01f00000 _start + .text.startup._GLOBAL__sub_I_versionMajor + 0x01f00040 0xa0 main.o + *(.text.unlikely .text.*_unlikely) + *(.text.exit .text.exit.*) + *(.text.hot .text.hot.*) + *(.text .stub .text.* .gnu.linkonce.t.*) + .text 0x01f000e0 0x0 armc-start.o + .text._reset_ 0x01f000e0 0xc0 armc-start.o + .text._get_stack_pointer + 0x01f001a0 0x8 armc-start.o + 0x01f001a0 _get_stack_pointer + .text._get_cpsr + 0x01f001a8 0x8 armc-start.o + 0x01f001a8 _get_cpsr + .text._enable_interrupts + 0x01f001b0 0x10 armc-start.o + 0x01f001b0 _enable_interrupts + .text._disable_interrupts + 0x01f001c0 0x10 armc-start.o + 0x01f001c0 _disable_interrupts + .text._undefined_instruction_handler_ + 0x01f001d0 0x14 armc-start.o + .text._prefetch_abort_handler_ + 0x01f001e4 0x14 armc-start.o + .text._data_abort_handler_ + 0x01f001f8 0x14 armc-start.o + .text._swi_handler_ + 0x01f0020c 0x14 armc-start.o + .text._enable_unaligned_access + 0x01f00220 0x14 armc-start.o + 0x01f00220 _enable_unaligned_access + .text._enable_l1_cache + 0x01f00234 0x18 armc-start.o + 0x01f00234 _enable_l1_cache + .text._invalidate_icache + 0x01f0024c 0xc armc-start.o + 0x01f0024c _invalidate_icache + .text._invalidate_dcache + 0x01f00258 0xc armc-start.o + 0x01f00258 _invalidate_dcache + .text._clean_invalidate_dcache + 0x01f00264 0xc armc-start.o + 0x01f00264 _clean_invalidate_dcache + .text._invalidate_dcache_mva + 0x01f00270 0x8 armc-start.o + 0x01f00270 _invalidate_dcache_mva + .text._clean_invalidate_dcache_mva + 0x01f00278 0x8 armc-start.o + 0x01f00278 _clean_invalidate_dcache_mva + .text._invalidate_dtlb + 0x01f00280 0xc armc-start.o + 0x01f00280 _invalidate_dtlb + .text._invalidate_dtlb_mva + 0x01f0028c 0x8 armc-start.o + 0x01f0028c _invalidate_dtlb_mva + .text._data_memory_barrier + 0x01f00294 0xec armc-start.o + 0x01f00294 _data_memory_barrier + 0x01f0029c _init_core + 0x01f0032c _spin_core + 0x01f00370 _get_core + .text._toggle_test_pin + 0x01f00380 0x28 armc-start.o + 0x01f00380 _toggle_test_pin + .text 0x01f003a8 0x0 armc-cstartup.o + .text._init 0x01f003a8 0x4 armc-cstartup.o + 0x01f003a8 _init + .text._cstartup + 0x01f003ac 0x174 armc-cstartup.o + 0x01f003ac _cstartup + .text 0x01f00520 0x0 armc-cstubs.o + .text._exit 0x01f00520 0x4 armc-cstubs.o + 0x01f00520 _exit + .text._close 0x01f00524 0x8 armc-cstubs.o + 0x01f00524 _close + .text.execve 0x01f0052c 0x18 armc-cstubs.o + 0x01f0052c execve + .text.fork 0x01f00544 0x18 armc-cstubs.o + 0x01f00544 fork + .text._fstat 0x01f0055c 0x10 armc-cstubs.o + 0x01f0055c _fstat + .text.getpid 0x01f0056c 0x8 armc-cstubs.o + 0x01f0056c getpid + .text._getpid 0x01f00574 0x8 armc-cstubs.o + 0x01f00574 _getpid + .text._isatty 0x01f0057c 0x8 armc-cstubs.o + 0x01f0057c _isatty + .text.kill 0x01f00584 0x18 armc-cstubs.o + 0x01f00584 kill + .text._kill 0x01f0059c 0x18 armc-cstubs.o + 0x01f0059c _kill + .text.link 0x01f005b4 0x18 armc-cstubs.o + 0x01f005b4 link + .text._lseek 0x01f005cc 0x8 armc-cstubs.o + 0x01f005cc _lseek + .text.open 0x01f005d4 0x8 armc-cstubs.o + 0x01f005d4 open + .text._read 0x01f005dc 0x8 armc-cstubs.o + 0x01f005dc _read + .text._sbrk 0x01f005e4 0x2c armc-cstubs.o + 0x01f005e4 _sbrk + .text.stat 0x01f00610 0x10 armc-cstubs.o + 0x01f00610 stat + .text.times 0x01f00620 0x8 armc-cstubs.o + 0x01f00620 times + .text.unlink 0x01f00628 0x18 armc-cstubs.o + 0x01f00628 unlink + .text.wait 0x01f00640 0x18 armc-cstubs.o + 0x01f00640 wait + .text.outbyte 0x01f00658 0x4 armc-cstubs.o + 0x01f00658 outbyte + .text._write 0x01f0065c 0x2c armc-cstubs.o + 0x01f0065c _write + .text 0x01f00688 0x0 armc-cppstubs.o + .text._Znwj 0x01f00688 0x4 armc-cppstubs.o + 0x01f00688 operator new(unsigned int) + .text._ZdlPv 0x01f0068c 0x4 armc-cppstubs.o + 0x01f0068c operator delete(void*) + .text._ZSt17__throw_bad_allocv + 0x01f00690 0x4 armc-cppstubs.o + 0x01f00690 std::__throw_bad_alloc() + .text._ZSt20__throw_length_errorPKc + 0x01f00694 0x4 armc-cppstubs.o + 0x01f00694 std::__throw_length_error(char const*) + .text 0x01f00698 0x0 exception.o + .text.reboot_now + 0x01f00698 0x24 exception.o + 0x01f00698 reboot_now + .text.dump_digit + 0x01f006bc 0x14 exception.o + 0x01f006bc dump_digit + .text.dump_hex + 0x01f006d0 0x30 exception.o + 0x01f006d0 dump_hex + .text.dump_binary + 0x01f00700 0x28 exception.o + 0x01f00700 dump_binary + .text.dump_string + 0x01f00728 0x28 exception.o + 0x01f00728 dump_string + .text.dump_info + 0x01f00750 0x464 exception.o + 0x01f00750 dump_info + .text.undefined_instruction_handler + 0x01f00bb4 0x10 exception.o + 0x01f00bb4 undefined_instruction_handler + .text.prefetch_abort_handler + 0x01f00bc4 0x10 exception.o + 0x01f00bc4 prefetch_abort_handler + .text.data_abort_handler + 0x01f00bd4 0x10 exception.o + 0x01f00bd4 data_abort_handler + .text.swi_handler + 0x01f00be4 0x10 exception.o + 0x01f00be4 swi_handler + .text 0x01f00bf4 0x0 main.o + .text._ZN7IEC_Bus15PortB_OnPortOutEPvh + 0x01f00bf4 0x17c main.o + 0x01f00bf4 IEC_Bus::PortB_OnPortOut(void*, unsigned char) + .text._Z9write6502th + 0x01f00d70 0x60 main.o + 0x01f00d70 write6502(unsigned short, unsigned char) + .text._ZN9DiskCaddyD2Ev + 0x01f00dd0 0x20 main.o + 0x01f00dd0 DiskCaddy::~DiskCaddy() + 0x01f00dd0 DiskCaddy::~DiskCaddy() + .text._Z17write6502ExtraRAMth + 0x01f00df0 0x54 main.o + 0x01f00df0 write6502ExtraRAM(unsigned short, unsigned char) + .text._ZL16AttemptToLoadROMPc + 0x01f00e44 0xd8 main.o + .text._Z8read6502t + 0x01f00f1c 0x80 main.o + 0x01f00f1c read6502(unsigned short) + .text._Z16read6502ExtraRAMt + 0x01f00f9c 0x64 main.o + 0x01f00f9c read6502ExtraRAM(unsigned short) + .text._ZN7IEC_Bus10InitialiseEv + 0x01f01000 0x288 main.o + 0x01f01000 IEC_Bus::Initialise() + .text.LogWrite + 0x01f01288 0x30 main.o + 0x01f01288 LogWrite + .text.GetMACAddress + 0x01f012b8 0x70 main.o + 0x01f012b8 GetMACAddress + .text.SetPowerStateOn + 0x01f01328 0x54 main.o + 0x01f01328 SetPowerStateOn + .text.usDelay 0x01f0137c 0x34 main.o + 0x01f0137c usDelay + .text.MsDelay 0x01f013b0 0x3c main.o + 0x01f013b0 MsDelay + .text.StartKernelTimer + 0x01f013ec 0x4 main.o + 0x01f013ec StartKernelTimer + .text.CancelKernelTimer + 0x01f013f0 0x4 main.o + 0x01f013f0 CancelKernelTimer + .text.ConnectInterrupt + 0x01f013f4 0x4 main.o + 0x01f013f4 ConnectInterrupt + .text.get_fattime + 0x01f013f8 0x8 main.o + 0x01f013f8 get_fattime + .text._Z8peek6502t + 0x01f01400 0x80 main.o + 0x01f01400 peek6502(unsigned short) + .text._Z18InitialiseHardwarev + 0x01f01480 0x84 main.o + 0x01f01480 InitialiseHardware() + .text._Z12UpdateScreenv + 0x01f01504 0x518 main.o + 0x01f01504 UpdateScreen() + .text._Z14BeginEmulatingP11FileBrowserPKc + 0x01f01a1c 0x80 main.o + 0x01f01a1c BeginEmulating(FileBrowser*, char const*) + .text._ZN9SingletonI8KeyboardE8InstanceEv + 0x01f01a9c 0x34 main.o + 0x01f01a9c Singleton::Instance() + .text._ZN9SingletonI13InputMappingsE8InstanceEv + 0x01f01ad0 0x34 main.o + 0x01f01ad0 Singleton::Instance() + .text.kernel_main + 0x01f01b04 0x92c main.o + 0x01f01b04 kernel_main + .text._Z8emulatorv + 0x01f02430 0x131c main.o + 0x01f02430 emulator() + .text.run_core + 0x01f0374c 0x24 main.o + 0x01f0374c run_core + .text 0x01f03770 0x0 rpi-aux.o + .text.RPI_GetAux + 0x01f03770 0xc rpi-aux.o + 0x01f03770 RPI_GetAux + .text.RPI_AuxMiniUartInit + 0x01f0377c 0x17c rpi-aux.o + 0x01f0377c RPI_AuxMiniUartInit + .text.RPI_AuxMiniUartWrite + 0x01f038f8 0x24 rpi-aux.o + 0x01f038f8 RPI_AuxMiniUartWrite + .text.RPI_EnableUart + 0x01f0391c 0x24 rpi-aux.o + 0x01f0391c RPI_EnableUart + .text 0x01f03940 0x0 rpi-mailbox-interface.o + .text.RPI_PropertyInit + 0x01f03940 0x30 rpi-mailbox-interface.o + 0x01f03940 RPI_PropertyInit + .text.RPI_PropertyAddTag + 0x01f03970 0x658 rpi-mailbox-interface.o + 0x01f03970 RPI_PropertyAddTag + .text.RPI_PropertyProcess + 0x01f03fc8 0x44 rpi-mailbox-interface.o + 0x01f03fc8 RPI_PropertyProcess + .text.RPI_PropertyProcessNoCheck + 0x01f0400c 0x34 rpi-mailbox-interface.o + 0x01f0400c RPI_PropertyProcessNoCheck + .text.RPI_PropertyGet + 0x01f04040 0x94 rpi-mailbox-interface.o + 0x01f04040 RPI_PropertyGet + .text 0x01f040d4 0x0 rpi-mailbox.o + .text.RPI_Mailbox0Write + 0x01f040d4 0x2c rpi-mailbox.o + 0x01f040d4 RPI_Mailbox0Write + .text.RPI_Mailbox0Read + 0x01f04100 0x40 rpi-mailbox.o + 0x01f04100 RPI_Mailbox0Read + .text.RPI_Mailbox0Flush + 0x01f04140 0x34 rpi-mailbox.o + 0x01f04140 RPI_Mailbox0Flush + .text 0x01f04174 0x0 rpi-gpio.o + .text.RPI_SetGpioPinFunction + 0x01f04174 0x70 rpi-gpio.o + 0x01f04174 RPI_SetGpioPinFunction + .text.RPI_SetGpioOutput + 0x01f041e4 0x74 rpi-gpio.o + 0x01f041e4 RPI_SetGpioOutput + .text.RPI_SetGpioInput + 0x01f04258 0x6c rpi-gpio.o + 0x01f04258 RPI_SetGpioInput + .text.RPI_GetGpioValue + 0x01f042c4 0x70 rpi-gpio.o + 0x01f042c4 RPI_GetGpioValue + .text.RPI_ToggleGpio + 0x01f04334 0xb8 rpi-gpio.o + 0x01f04334 RPI_ToggleGpio + .text.RPI_SetGpioHi + 0x01f043ec 0x4c rpi-gpio.o + 0x01f043ec RPI_SetGpioHi + .text.RPI_SetGpioLo + 0x01f04438 0x4c rpi-gpio.o + 0x01f04438 RPI_SetGpioLo + .text.RPI_SetGpioValue + 0x01f04484 0xb0 rpi-gpio.o + 0x01f04484 RPI_SetGpioValue + .text.EnableGpioDetect + 0x01f04534 0x1d8 rpi-gpio.o + 0x01f04534 EnableGpioDetect + .text.DisableGpioDetect + 0x01f0470c 0x1dc rpi-gpio.o + 0x01f0470c DisableGpioDetect + .text.ClearGpioEvent + 0x01f048e8 0x30 rpi-gpio.o + 0x01f048e8 ClearGpioEvent + .text.SetACTLed + 0x01f04918 0x78 rpi-gpio.o + 0x01f04918 SetACTLed + .text.RPI_TouchInit + 0x01f04990 0x44 rpi-gpio.o + 0x01f04990 RPI_TouchInit + .text.RPI_UpdateTouch + 0x01f049d4 0x18 rpi-gpio.o + 0x01f049d4 RPI_UpdateTouch + .text.RPI_GpioVirtGetAddress + 0x01f049ec 0x10 rpi-gpio.o + 0x01f049ec RPI_GpioVirtGetAddress + .text.RPI_GpioVirtInit + 0x01f049fc 0x44 rpi-gpio.o + 0x01f049fc RPI_GpioVirtInit + .text.RPI_GpioVirtSetLed + 0x01f04a40 0x78 rpi-gpio.o + 0x01f04a40 RPI_GpioVirtSetLed + .text 0x01f04ab8 0x0 rpi-interrupts.o + .text.RPI_GetIrqController + 0x01f04ab8 0xc rpi-interrupts.o + 0x01f04ab8 RPI_GetIrqController + .text 0x01f04ac4 0x0 cache.o + .text.InvalidateDataCache + 0x01f04ac4 0xc8 cache.o + 0x01f04ac4 InvalidateDataCache + .text.CleanDataCache + 0x01f04b8c 0xc8 cache.o + 0x01f04b8c CleanDataCache + .text.map_4k_page + 0x01f04c54 0x2c cache.o + 0x01f04c54 map_4k_page + .text.enable_MMU_and_IDCaches + 0x01f04c80 0x1fc cache.o + 0x01f04c80 enable_MMU_and_IDCaches + .text 0x01f04e7c 0x0 ff.o + .text._ZL16pattern_matchingPKcS0_ii + 0x01f04e7c 0x164 ff.o + .text.unlikely._ZL11sync_windowP5FATFS.part.3 + 0x01f04fe0 0x84 ff.o + .text._ZL12get_fileinfoP3DIRP7FILINFO + 0x01f05064 0x4b0 ff.o + .text._ZL8check_fsP5FATFSm + 0x01f05514 0x134 ff.o + .text.unlikely._ZL11move_windowP5FATFSm + 0x01f05648 0xc8 ff.o + .text._ZL11find_volumePPKcPP5FATFSh + 0x01f05710 0xaac ff.o + .text._ZL7sync_fsP5FATFS + 0x01f061bc 0x3e4 ff.o + .text._ZL7put_fatP5FATFSmm.part.5 + 0x01f065a0 0x458 ff.o + .text._ZL12remove_chainP5_FDIDmm + 0x01f069f8 0x864 ff.o + .text._ZL7get_fatP5_FDIDm + 0x01f0725c 0x51c ff.o + .text._ZL12create_chainP5_FDIDm + 0x01f07778 0xa04 ff.o + .text._ZL8dir_nextP3DIRi.constprop.17 + 0x01f0817c 0xfc ff.o + .text._ZL7dir_sdiP3DIRm + 0x01f08278 0x6d4 ff.o + .text._ZL9dir_allocP3DIRj + 0x01f0894c 0x608 ff.o + .text._ZL10store_xdirP3DIR + 0x01f08f54 0x5d0 ff.o + .text._ZL10dir_removeP3DIR + 0x01f09524 0x220 ff.o + .text._ZL9load_xdirP3DIR + 0x01f09744 0xd74 ff.o + .text._ZL8dir_readP3DIRi.constprop.10 + 0x01f0a4b8 0x6c0 ff.o + .text._ZL8dir_findP3DIR + 0x01f0ab78 0x554 ff.o + .text._ZL12dir_registerP3DIR + 0x01f0b0cc 0x14b0 ff.o + .text._ZL11follow_pathP3DIRPKc + 0x01f0c57c 0x6cc ff.o + .text.f_mount 0x01f0cc48 0xcc ff.o + 0x01f0cc48 f_mount + .text.f_open 0x01f0cd14 0x874 ff.o + 0x01f0cd14 f_open + .text.f_read 0x01f0d588 0x9dc ff.o + 0x01f0d588 f_read + .text.f_write 0x01f0df64 0x9f0 ff.o + 0x01f0df64 f_write + .text.f_sync 0x01f0e954 0x454 ff.o + 0x01f0e954 f_sync + .text.f_close 0x01f0eda8 0x494 ff.o + 0x01f0eda8 f_close + .text.f_chdir 0x01f0f23c 0x128 ff.o + 0x01f0f23c f_chdir + .text.f_getcwd + 0x01f0f364 0x3c8 ff.o + 0x01f0f364 f_getcwd + .text.f_lseek 0x01f0f72c 0x3c4 ff.o + 0x01f0f72c f_lseek + .text.f_opendir + 0x01f0faf0 0x1cc ff.o + 0x01f0faf0 f_opendir + .text.f_closedir + 0x01f0fcbc 0x58 ff.o + 0x01f0fcbc f_closedir + .text.f_readdir + 0x01f0fd14 0x17c ff.o + 0x01f0fd14 f_readdir + .text.f_findnext + 0x01f0fe90 0x188 ff.o + 0x01f0fe90 f_findnext + .text.f_findfirst + 0x01f10018 0x1dc ff.o + 0x01f10018 f_findfirst + .text.f_stat 0x01f101f4 0x78 ff.o + 0x01f101f4 f_stat + .text.f_getfree + 0x01f1026c 0x398 ff.o + 0x01f1026c f_getfree + .text.f_truncate + 0x01f10604 0x180 ff.o + 0x01f10604 f_truncate + .text.f_unlink + 0x01f10784 0x20c ff.o + 0x01f10784 f_unlink + .text.f_mkdir 0x01f10990 0xcbc ff.o + 0x01f10990 f_mkdir + .text.f_rename + 0x01f1164c 0x420 ff.o + 0x01f1164c f_rename + .text.f_chmod 0x01f11a6c 0xcc ff.o + 0x01f11a6c f_chmod + .text.f_utime 0x01f11b38 0xf0 ff.o + 0x01f11b38 f_utime + .text.ff_convert + 0x01f11c28 0x4 ff.o + 0x01f11c28 ff_convert + .text.ff_wtoupper + 0x01f11c2c 0x4 ff.o + 0x01f11c2c ff_wtoupper + .text 0x01f11c30 0x0 interrupt.o + .text.InterruptSystemInitialize + 0x01f11c30 0x4c interrupt.o + 0x01f11c30 InterruptSystemInitialize + .text.InterruptSystemConnectIRQ + 0x01f11c7c 0x5c interrupt.o + 0x01f11c7c InterruptSystemConnectIRQ + .text.InterruptSystemDisconnectIRQ + 0x01f11cd8 0x60 interrupt.o + 0x01f11cd8 InterruptSystemDisconnectIRQ + .text.InterruptSystemEnableIRQ + 0x01f11d38 0x44 interrupt.o + 0x01f11d38 InterruptSystemEnableIRQ + .text.InterruptSystemDisableIRQ + 0x01f11d7c 0x44 interrupt.o + 0x01f11d7c InterruptSystemDisableIRQ + .text.InterruptHandler + 0x01f11dc0 0x160 interrupt.o + 0x01f11dc0 InterruptHandler + .text 0x01f11f20 0x0 keyboard.o + .text._ZN9SingletonI8KeyboardED2Ev + 0x01f11f20 0x4 keyboard.o + 0x01f11f20 Singleton::~Singleton() + 0x01f11f20 Singleton::~Singleton() + .text._ZN8KeyboardD2Ev + 0x01f11f24 0x4 keyboard.o + 0x01f11f24 Keyboard::~Keyboard() + 0x01f11f24 Keyboard::~Keyboard() + .text._ZN8KeyboardD0Ev + 0x01f11f28 0x14 keyboard.o + 0x01f11f28 Keyboard::~Keyboard() + .text._ZN9SingletonI8KeyboardED0Ev + 0x01f11f3c 0x14 keyboard.o + 0x01f11f3c Singleton::~Singleton() + .text._ZN8Keyboard29USBKeyboardDeviceTimerHandlerEjPvS0_ + 0x01f11f50 0x160 keyboard.o + 0x01f11f50 Keyboard::USBKeyboardDeviceTimerHandler(unsigned int, void*, void*) + .text._ZN8Keyboard20KeyPressedHandlerRawEP18TUSBKeyboardDevicehPKh + 0x01f120b0 0x370 keyboard.o + 0x01f120b0 Keyboard::KeyPressedHandlerRaw(TUSBKeyboardDevice*, unsigned char, unsigned char const*) + .text._ZN8KeyboardC2Ev + 0x01f12420 0x5c keyboard.o + 0x01f12420 Keyboard::Keyboard() + 0x01f12420 Keyboard::Keyboard() + .text 0x01f1247c 0x0 Pi1541.o + .text._ZN6Pi1541C2Ev + 0x01f1247c 0x48 Pi1541.o + 0x01f1247c Pi1541::Pi1541() + 0x01f1247c Pi1541::Pi1541() + .text._ZN6Pi154110InitialiseEv + 0x01f124c4 0x10 Pi1541.o + 0x01f124c4 Pi1541::Initialise() + .text._ZN6Pi15416UpdateEv + 0x01f124d4 0x30 Pi1541.o + 0x01f124d4 Pi1541::Update() + .text._ZN6Pi15415ResetEv + 0x01f12504 0x1ac Pi1541.o + 0x01f12504 Pi1541::Reset() + .text 0x01f126b0 0x0 DiskImage.o + .text._ZN9DiskImage8WriteNIBEv.part.1 + 0x01f126b0 0x194 DiskImage.o + .text._ZN9DiskImage8WriteNBZEv.part.2 + 0x01f12844 0x134 DiskImage.o + .text._ZN9DiskImage8WriteG64Ev.part.0 + 0x01f12978 0x33c DiskImage.o + .text._ZN9DiskImageC2Ev + 0x01f12cb4 0x34 DiskImage.o + 0x01f12cb4 DiskImage::DiskImage() + 0x01f12cb4 DiskImage::DiskImage() + .text._ZN9DiskImage9DumpTrackEj + 0x01f12ce8 0x64 DiskImage.o + 0x01f12ce8 DiskImage::DumpTrack(unsigned int) + .text._ZN9DiskImage8WriteG64Ev + 0x01f12d4c 0x18 DiskImage.o + 0x01f12d4c DiskImage::WriteG64() + .text._ZN9DiskImage8CloseG64Ev + 0x01f12d64 0x3c DiskImage.o + 0x01f12d64 DiskImage::CloseG64() + .text._ZN9DiskImage8WriteNIBEv + 0x01f12da0 0x18 DiskImage.o + 0x01f12da0 DiskImage::WriteNIB() + .text._ZN9DiskImage8CloseNIBEv + 0x01f12db8 0x3c DiskImage.o + 0x01f12db8 DiskImage::CloseNIB() + .text._ZN9DiskImage8WriteNBZEv + 0x01f12df4 0x18 DiskImage.o + 0x01f12df4 DiskImage::WriteNBZ() + .text._ZN9DiskImage8CloseNBZEv + 0x01f12e0c 0x3c DiskImage.o + 0x01f12e0c DiskImage::CloseNBZ() + .text._ZN9DiskImage28GetDiskImageTypeViaExtentionEPKc + 0x01f12e48 0x124 DiskImage.o + 0x01f12e48 DiskImage::GetDiskImageTypeViaExtention(char const*) + .text._ZN9DiskImage20IsDiskImageExtentionEPKc + 0x01f12f6c 0x114 DiskImage.o + 0x01f12f6c DiskImage::IsDiskImageExtention(char const*) + .text._ZN9DiskImage14IsLSTExtentionEPKc + 0x01f13080 0x54 DiskImage.o + 0x01f13080 DiskImage::IsLSTExtention(char const*) + .text._ZN9DiskImage11DecodeBlockEjiPhi + 0x01f130d4 0x160 DiskImage.o + 0x01f130d4 DiskImage::DecodeBlock(unsigned int, int, unsigned char*, int) + .text._ZN9DiskImage8FindSyncEjiiPi + 0x01f13234 0xc0 DiskImage.o + 0x01f13234 DiskImage::FindSync(unsigned int, int, int, int*) + .text._ZN9DiskImage16FindSectorHeaderEjjPh + 0x01f132f4 0x290 DiskImage.o + 0x01f132f4 DiskImage::FindSectorHeader(unsigned int, unsigned int, unsigned char*) + .text._ZN9DiskImage13ConvertSectorEjjPh + 0x01f13584 0x430 DiskImage.o + 0x01f13584 DiskImage::ConvertSector(unsigned int, unsigned int, unsigned char*) + .text._ZN9DiskImage16GetDecodedSectorEjjPh + 0x01f139b4 0x30 DiskImage.o + 0x01f139b4 DiskImage::GetDecodedSector(unsigned int, unsigned int, unsigned char*) + .text._ZN9DiskImage8WriteD64Ev.part.3 + 0x01f139e4 0x1b0 DiskImage.o + .text._ZN9DiskImage8WriteD64Ev + 0x01f13b94 0x18 DiskImage.o + 0x01f13b94 DiskImage::WriteD64() + .text._ZN9DiskImage8CloseD64Ev + 0x01f13bac 0x3c DiskImage.o + 0x01f13bac DiskImage::CloseD64() + .text._ZN9DiskImage5CloseEv + 0x01f13be8 0xf0 DiskImage.o + 0x01f13be8 DiskImage::Close() + .text._ZN9DiskImage7OpenD64EPK7FILINFOPhj + 0x01f13cd8 0x168 DiskImage.o + 0x01f13cd8 DiskImage::OpenD64(FILINFO const*, unsigned char*, unsigned int) + .text._ZN9DiskImage7OpenG64EPK7FILINFOPhj + 0x01f13e40 0x10c DiskImage.o + 0x01f13e40 DiskImage::OpenG64(FILINFO const*, unsigned char*, unsigned int) + .text._ZN9DiskImage7OpenNIBEPK7FILINFOPhj + 0x01f13f4c 0x15c DiskImage.o + 0x01f13f4c DiskImage::OpenNIB(FILINFO const*, unsigned char*, unsigned int) + .text._ZN9DiskImage7OpenNBZEPK7FILINFOPhj + 0x01f140a8 0x144 DiskImage.o + 0x01f140a8 DiskImage::OpenNBZ(FILINFO const*, unsigned char*, unsigned int) + .text._ZN9DiskImage5GetIDEjPh + 0x01f141ec 0x1c DiskImage.o + 0x01f141ec DiskImage::GetID(unsigned int, unsigned char*) + .text._ZN9DiskImage13LastTrackUsedEv + 0x01f14208 0x34 DiskImage.o + 0x01f14208 DiskImage::LastTrackUsed() + .text 0x01f1423c 0x0 iec_bus.o + .text._ZN7IEC_Bus4ReadEv + 0x01f1423c 0x668 iec_bus.o + 0x01f1423c IEC_Bus::Read() + .text 0x01f148a4 0x0 iec_commands.o + .text._ZL9ParseNamePKcPcbb.constprop.17 + 0x01f148a4 0x18c iec_commands.o + .text._ZN12IEC_Commands18WriteIECSerialPortEhb.part.7 + 0x01f14a30 0x89c iec_commands.o + .text._ZN7IEC_Bus11RefreshOutsEv + 0x01f152cc 0x228 iec_commands.o + 0x01f152cc IEC_Bus::RefreshOuts() + .text._ZN12IEC_Commands17ReadIECSerialPortERh.part.8 + 0x01f154f4 0x71c iec_commands.o + .text._Z5Errorhhh + 0x01f15c10 0x1fc iec_commands.o + 0x01f15c10 Error(unsigned char, unsigned char, unsigned char) + .text._ZN12IEC_Commands7Channel5CloseEv + 0x01f15e0c 0x68 iec_commands.o + 0x01f15e0c IEC_Commands::Channel::Close() + .text._ZN12IEC_CommandsC2Ev + 0x01f15e74 0xe8 iec_commands.o + 0x01f15e74 IEC_Commands::IEC_Commands() + 0x01f15e74 IEC_Commands::IEC_Commands() + .text._ZN12IEC_Commands5ResetEv + 0x01f15f5c 0xd0 iec_commands.o + 0x01f15f5c IEC_Commands::Reset() + .text._ZN12IEC_Commands16CloseAllChannelsEv + 0x01f1602c 0x7c iec_commands.o + 0x01f1602c IEC_Commands::CloseAllChannels() + .text._ZN12IEC_Commands8CheckATNEv + 0x01f160a8 0x44 iec_commands.o + 0x01f160a8 IEC_Commands::CheckATN() + .text._ZN12IEC_Commands18WriteIECSerialPortEhb + 0x01f160ec 0x1a4 iec_commands.o + 0x01f160ec IEC_Commands::WriteIECSerialPort(unsigned char, bool) + .text._ZN12IEC_Commands17ReadIECSerialPortERh + 0x01f16290 0x80 iec_commands.o + 0x01f16290 IEC_Commands::ReadIECSerialPort(unsigned char&) + .text._ZN12IEC_Commands16SimulateIECBeginEv + 0x01f16310 0x1c4 iec_commands.o + 0x01f16310 IEC_Commands::SimulateIECBegin() + .text._ZN12IEC_Commands5EnterER3DIRR7FILINFO + 0x01f164d4 0xb8 iec_commands.o + 0x01f164d4 IEC_Commands::Enter(DIR&, FILINFO&) + .text._ZN12IEC_Commands2CDEiPc + 0x01f1658c 0x3d4 iec_commands.o + 0x01f1658c IEC_Commands::CD(int, char*) + .text._ZN12IEC_Commands5MKDirEiPc + 0x01f16960 0xd4 iec_commands.o + 0x01f16960 IEC_Commands::MKDir(int, char*) + .text._ZN12IEC_Commands5RMDirEv + 0x01f16a34 0x148 iec_commands.o + 0x01f16a34 IEC_Commands::RMDir() + .text._ZN12IEC_Commands13FolderCommandEv + 0x01f16b7c 0x14c iec_commands.o + 0x01f16b7c IEC_Commands::FolderCommand() + .text._ZN12IEC_Commands4CopyEv + 0x01f16cc8 0x2c8 iec_commands.o + 0x01f16cc8 IEC_Commands::Copy() + .text._ZN12IEC_Commands6MemoryEv + 0x01f16f90 0x108 iec_commands.o + 0x01f16f90 IEC_Commands::Memory() + .text._ZN12IEC_Commands3NewEv + 0x01f17098 0x458 iec_commands.o + 0x01f17098 IEC_Commands::New() + .text._ZN12IEC_Commands6RenameEv + 0x01f174f0 0x1d4 iec_commands.o + 0x01f174f0 IEC_Commands::Rename() + .text._ZN12IEC_Commands7ScratchEv + 0x01f176c4 0x144 iec_commands.o + 0x01f176c4 IEC_Commands::Scratch() + .text._ZN12IEC_Commands4UserEv + 0x01f17808 0x148 iec_commands.o + 0x01f17808 IEC_Commands::User() + .text._ZN12IEC_Commands14ProcessCommandEv + 0x01f17950 0x1fc iec_commands.o + 0x01f17950 IEC_Commands::ProcessCommand() + .text._ZN12IEC_Commands9FindFirstER3DIRPKcR7FILINFO + 0x01f17b4c 0xc0 iec_commands.o + 0x01f17b4c IEC_Commands::FindFirst(DIR&, char const*, FILINFO&) + .text._ZN12IEC_Commands10SendBufferERNS_7ChannelEb + 0x01f17c0c 0x244 iec_commands.o + 0x01f17c0c IEC_Commands::SendBuffer(IEC_Commands::Channel&, bool) + .text._ZN12IEC_Commands8LoadFileEv + 0x01f17e50 0x2b4 iec_commands.o + 0x01f17e50 IEC_Commands::LoadFile() + .text._ZN12IEC_Commands8SaveFileEv + 0x01f18104 0xfc iec_commands.o + 0x01f18104 IEC_Commands::SaveFile() + .text._ZN12IEC_Commands9SendErrorEv + 0x01f18200 0x1ec iec_commands.o + 0x01f18200 IEC_Commands::SendError() + .text._ZN12IEC_Commands17AddDirectoryEntryERNS_7ChannelEPKcti + 0x01f183ec 0x2ec iec_commands.o + 0x01f183ec IEC_Commands::AddDirectoryEntry(IEC_Commands::Channel&, char const*, unsigned short, int) + .text._ZN12IEC_Commands13LoadDirectoryEv + 0x01f186d8 0x788 iec_commands.o + 0x01f186d8 IEC_Commands::LoadDirectory() + .text._ZN12IEC_Commands8OpenFileEv + 0x01f18e60 0x3ac iec_commands.o + 0x01f18e60 IEC_Commands::OpenFile() + .text._ZN12IEC_Commands6ListenEv + 0x01f1920c 0x288 iec_commands.o + 0x01f1920c IEC_Commands::Listen() + .text._ZN12IEC_Commands4TalkEv + 0x01f19494 0x224 iec_commands.o + 0x01f19494 IEC_Commands::Talk() + .text._ZN12IEC_Commands17SimulateIECUpdateEv + 0x01f196b8 0x43c iec_commands.o + 0x01f196b8 IEC_Commands::SimulateIECUpdate() + .text._ZN12IEC_Commands9CloseFileEh + 0x01f19af4 0x98 iec_commands.o + 0x01f19af4 IEC_Commands::CloseFile(unsigned char) + .text 0x01f19b8c 0x0 m6502.o + .text._ZN5M65023ANCEv + 0x01f19b8c 0x50 m6502.o + 0x01f19b8c M6502::ANC() + .text._ZN5M65023ANDEv + 0x01f19bdc 0x44 m6502.o + 0x01f19bdc M6502::AND() + .text._ZN5M65023ASLEv + 0x01f19c20 0x7c m6502.o + 0x01f19c20 M6502::ASL() + .text._ZN5M65023BITEv + 0x01f19c9c 0x38 m6502.o + 0x01f19c9c M6502::BIT() + .text._ZN5M65023BRKEv + 0x01f19cd4 0x4 m6502.o + 0x01f19cd4 M6502::BRK() + .text._ZN5M65023CLCEv + 0x01f19cd8 0x10 m6502.o + 0x01f19cd8 M6502::CLC() + .text._ZN5M65023CLDEv + 0x01f19ce8 0x10 m6502.o + 0x01f19ce8 M6502::CLD() + .text._ZN5M65023CLIEv + 0x01f19cf8 0x1c m6502.o + 0x01f19cf8 M6502::CLI() + .text._ZN5M65023CLVEv + 0x01f19d14 0x10 m6502.o + 0x01f19d14 M6502::CLV() + .text._ZN5M65023CMPEv + 0x01f19d24 0x44 m6502.o + 0x01f19d24 M6502::CMP() + .text._ZN5M65023CPXEv + 0x01f19d68 0x44 m6502.o + 0x01f19d68 M6502::CPX() + .text._ZN5M65023CPYEv + 0x01f19dac 0x44 m6502.o + 0x01f19dac M6502::CPY() + .text._ZN5M65023DECEv + 0x01f19df0 0x70 m6502.o + 0x01f19df0 M6502::DEC() + .text._ZN5M65023DEXEv + 0x01f19e60 0x4c m6502.o + 0x01f19e60 M6502::DEX() + .text._ZN5M65023DEYEv + 0x01f19eac 0x4c m6502.o + 0x01f19eac M6502::DEY() + .text._ZN5M65023EOREv + 0x01f19ef8 0x34 m6502.o + 0x01f19ef8 M6502::EOR() + .text._ZN5M65023INCEv + 0x01f19f2c 0x70 m6502.o + 0x01f19f2c M6502::INC() + .text._ZN5M65023INXEv + 0x01f19f9c 0x4c m6502.o + 0x01f19f9c M6502::INX() + .text._ZN5M65023INYEv + 0x01f19fe8 0x4c m6502.o + 0x01f19fe8 M6502::INY() + .text._ZN5M65023JAMEv + 0x01f1a034 0x4 m6502.o + 0x01f1a034 M6502::JAM() + .text._ZN5M65023JMPEv + 0x01f1a038 0xc m6502.o + 0x01f1a038 M6502::JMP() + .text._ZN5M65023JSREv + 0x01f1a044 0x4 m6502.o + 0x01f1a044 M6502::JSR() + .text._ZN5M65023LDAEv + 0x01f1a048 0x44 m6502.o + 0x01f1a048 M6502::LDA() + .text._ZN5M65023LDXEv + 0x01f1a08c 0x44 m6502.o + 0x01f1a08c M6502::LDX() + .text._ZN5M65023LDYEv + 0x01f1a0d0 0x44 m6502.o + 0x01f1a0d0 M6502::LDY() + .text._ZN5M65023LSREv + 0x01f1a114 0x80 m6502.o + 0x01f1a114 M6502::LSR() + .text._ZN5M65023NOPEv + 0x01f1a194 0x4 m6502.o + 0x01f1a194 M6502::NOP() + .text._ZN5M65023ORAEv + 0x01f1a198 0x34 m6502.o + 0x01f1a198 M6502::ORA() + .text._ZN5M65023PHAEv + 0x01f1a1cc 0x20 m6502.o + 0x01f1a1cc M6502::PHA() + .text._ZN5M65023PHPEv + 0x01f1a1ec 0x24 m6502.o + 0x01f1a1ec M6502::PHP() + .text._ZN5M65023PLAEv + 0x01f1a210 0x64 m6502.o + 0x01f1a210 M6502::PLA() + .text._ZN5M65023PLPEv + 0x01f1a274 0x30 m6502.o + 0x01f1a274 M6502::PLP() + .text._ZN5M65023ROLEv + 0x01f1a2a4 0x88 m6502.o + 0x01f1a2a4 M6502::ROL() + .text._ZN5M65023ROREv + 0x01f1a32c 0x88 m6502.o + 0x01f1a32c M6502::ROR() + .text._ZN5M65023RTIEv + 0x01f1a3b4 0x4 m6502.o + 0x01f1a3b4 M6502::RTI() + .text._ZN5M65023RTSEv + 0x01f1a3b8 0x4 m6502.o + 0x01f1a3b8 M6502::RTS() + .text._ZN5M65023SECEv + 0x01f1a3bc 0x10 m6502.o + 0x01f1a3bc M6502::SEC() + .text._ZN5M65023SEDEv + 0x01f1a3cc 0x10 m6502.o + 0x01f1a3cc M6502::SED() + .text._ZN5M65023SEIEv + 0x01f1a3dc 0x10 m6502.o + 0x01f1a3dc M6502::SEI() + .text._ZN5M65023STAEv + 0x01f1a3ec 0x44 m6502.o + 0x01f1a3ec M6502::STA() + .text._ZN5M65023STXEv + 0x01f1a430 0x48 m6502.o + 0x01f1a430 M6502::STX() + .text._ZN5M65023STYEv + 0x01f1a478 0x48 m6502.o + 0x01f1a478 M6502::STY() + .text._ZN5M65023TAXEv + 0x01f1a4c0 0x44 m6502.o + 0x01f1a4c0 M6502::TAX() + .text._ZN5M65023TAYEv + 0x01f1a504 0x44 m6502.o + 0x01f1a504 M6502::TAY() + .text._ZN5M65023TSXEv + 0x01f1a548 0x44 m6502.o + 0x01f1a548 M6502::TSX() + .text._ZN5M65023TXAEv + 0x01f1a58c 0x44 m6502.o + 0x01f1a58c M6502::TXA() + .text._ZN5M65023TXSEv + 0x01f1a5d0 0xc m6502.o + 0x01f1a5d0 M6502::TXS() + .text._ZN5M65023TYAEv + 0x01f1a5dc 0x44 m6502.o + 0x01f1a5dc M6502::TYA() + .text._ZN5M65023ASREv + 0x01f1a620 0x38 m6502.o + 0x01f1a620 M6502::ASR() + .text._ZN5M65023LXAEv + 0x01f1a658 0x50 m6502.o + 0x01f1a658 M6502::LXA() + .text._ZN5M65023LAXEv + 0x01f1a6a8 0x4c m6502.o + 0x01f1a6a8 M6502::LAX() + .text._ZN5M65023LASEv + 0x01f1a6f4 0x54 m6502.o + 0x01f1a6f4 M6502::LAS() + .text._ZN5M65023SAXEv + 0x01f1a748 0x50 m6502.o + 0x01f1a748 M6502::SAX() + .text._ZN5M65023SBXEv + 0x01f1a798 0x64 m6502.o + 0x01f1a798 M6502::SBX() + .text._ZN5M65023SHAEv + 0x01f1a7fc 0x68 m6502.o + 0x01f1a7fc M6502::SHA() + .text._ZN5M65023SHYEv + 0x01f1a864 0x60 m6502.o + 0x01f1a864 M6502::SHY() + .text._ZN5M65023DCPEv + 0x01f1a8c4 0x88 m6502.o + 0x01f1a8c4 M6502::DCP() + .text._ZN5M65023SLOEv + 0x01f1a94c 0xa0 m6502.o + 0x01f1a94c M6502::SLO() + .text._ZN5M65023RLAEv + 0x01f1a9ec 0xa4 m6502.o + 0x01f1a9ec M6502::RLA() + .text._ZN5M65023SREEv + 0x01f1aa90 0x9c m6502.o + 0x01f1aa90 M6502::SRE() + .text._ZN5M65023SHSEv + 0x01f1ab2c 0x70 m6502.o + 0x01f1ab2c M6502::SHS() + .text._ZN5M65023SHXEv + 0x01f1ab9c 0x60 m6502.o + 0x01f1ab9c M6502::SHX() + .text._ZN5M65023XAAEv + 0x01f1abfc 0x58 m6502.o + 0x01f1abfc M6502::XAA() + .text._ZN5M650210rel_5_8_T1Ev + 0x01f1ac54 0x28 m6502.o + 0x01f1ac54 M6502::rel_5_8_T1() + .text._ZN5M650210rel_5_8_T3Ev + 0x01f1ac7c 0x2c m6502.o + 0x01f1ac7c M6502::rel_5_8_T3() + .text._ZN5M65029zp_2_1_T1Ev + 0x01f1aca8 0x38 m6502.o + 0x01f1aca8 M6502::zp_2_1_T1() + .text._ZN5M65029zp_3_1_T1Ev + 0x01f1ace0 0x38 m6502.o + 0x01f1ace0 M6502::zp_3_1_T1() + .text._ZN5M650210abs_2_3_T1Ev + 0x01f1ad18 0x38 m6502.o + 0x01f1ad18 M6502::abs_2_3_T1() + .text._ZN5M650210abs_2_3_T2Ev + 0x01f1ad50 0x40 m6502.o + 0x01f1ad50 M6502::abs_2_3_T2() + .text._ZN5M650210abs_3_2_T1Ev + 0x01f1ad90 0x38 m6502.o + 0x01f1ad90 M6502::abs_3_2_T1() + .text._ZN5M650210abs_3_2_T2Ev + 0x01f1adc8 0x40 m6502.o + 0x01f1adc8 M6502::abs_3_2_T2() + .text._ZN5M650210idx_2_4_T1Ev + 0x01f1ae08 0x38 m6502.o + 0x01f1ae08 M6502::idx_2_4_T1() + .text._ZN5M650210idx_2_4_T2Ev + 0x01f1ae40 0x2c m6502.o + 0x01f1ae40 M6502::idx_2_4_T2() + .text._ZN5M650210idx_2_4_T3Ev + 0x01f1ae6c 0x44 m6502.o + 0x01f1ae6c M6502::idx_2_4_T3() + .text._ZN5M650210idx_2_4_T4Ev + 0x01f1aeb0 0x38 m6502.o + 0x01f1aeb0 M6502::idx_2_4_T4() + .text._ZN5M650210idx_3_3_T1Ev + 0x01f1aee8 0x38 m6502.o + 0x01f1aee8 M6502::idx_3_3_T1() + .text._ZN5M650210idx_3_3_T2Ev + 0x01f1af20 0x2c m6502.o + 0x01f1af20 M6502::idx_3_3_T2() + .text._ZN5M650210idx_3_3_T3Ev + 0x01f1af4c 0x44 m6502.o + 0x01f1af4c M6502::idx_3_3_T3() + .text._ZN5M650210idx_3_3_T4Ev + 0x01f1af90 0x38 m6502.o + 0x01f1af90 M6502::idx_3_3_T4() + .text._ZN5M650212idx_Undoc_T1Ev + 0x01f1afc8 0x38 m6502.o + 0x01f1afc8 M6502::idx_Undoc_T1() + .text._ZN5M650212idx_Undoc_T2Ev + 0x01f1b000 0x2c m6502.o + 0x01f1b000 M6502::idx_Undoc_T2() + .text._ZN5M650212idx_Undoc_T3Ev + 0x01f1b02c 0x44 m6502.o + 0x01f1b02c M6502::idx_Undoc_T3() + .text._ZN5M650212idx_Undoc_T4Ev + 0x01f1b070 0x38 m6502.o + 0x01f1b070 M6502::idx_Undoc_T4() + .text._ZN5M650212idx_Undoc_T5Ev + 0x01f1b0a8 0x30 m6502.o + 0x01f1b0a8 M6502::idx_Undoc_T5() + .text._ZN5M650212idx_Undoc_T6Ev + 0x01f1b0d8 0x30 m6502.o + 0x01f1b0d8 M6502::idx_Undoc_T6() + .text._ZN5M650211absx_2_5_T1Ev + 0x01f1b108 0x38 m6502.o + 0x01f1b108 M6502::absx_2_5_T1() + .text._ZN5M650211absx_2_5_T2Ev + 0x01f1b140 0x40 m6502.o + 0x01f1b140 M6502::absx_2_5_T2() + .text._ZN5M650211absx_3_4_T1Ev + 0x01f1b180 0x38 m6502.o + 0x01f1b180 M6502::absx_3_4_T1() + .text._ZN5M650211absx_3_4_T2Ev + 0x01f1b1b8 0x40 m6502.o + 0x01f1b1b8 M6502::absx_3_4_T2() + .text._ZN5M650211absx_3_4_T3Ev + 0x01f1b1f8 0x3c m6502.o + 0x01f1b1f8 M6502::absx_3_4_T3() + .text._ZN5M650211absy_2_5_T1Ev + 0x01f1b234 0x38 m6502.o + 0x01f1b234 M6502::absy_2_5_T1() + .text._ZN5M650211absy_2_5_T2Ev + 0x01f1b26c 0x40 m6502.o + 0x01f1b26c M6502::absy_2_5_T2() + .text._ZN5M650211absy_3_4_T1Ev + 0x01f1b2ac 0x38 m6502.o + 0x01f1b2ac M6502::absy_3_4_T1() + .text._ZN5M650211absy_3_4_T2Ev + 0x01f1b2e4 0x40 m6502.o + 0x01f1b2e4 M6502::absy_3_4_T2() + .text._ZN5M650211absy_3_4_T3Ev + 0x01f1b324 0x3c m6502.o + 0x01f1b324 M6502::absy_3_4_T3() + .text._ZN5M650210zpx_2_6_T1Ev + 0x01f1b360 0x38 m6502.o + 0x01f1b360 M6502::zpx_2_6_T1() + .text._ZN5M650210zpx_2_6_T2Ev + 0x01f1b398 0x2c m6502.o + 0x01f1b398 M6502::zpx_2_6_T2() + .text._ZN5M650210zpx_3_5_T1Ev + 0x01f1b3c4 0x38 m6502.o + 0x01f1b3c4 M6502::zpx_3_5_T1() + .text._ZN5M650210zpx_3_5_T2Ev + 0x01f1b3fc 0x2c m6502.o + 0x01f1b3fc M6502::zpx_3_5_T2() + .text._ZN5M650210zpy_2_6_T1Ev + 0x01f1b428 0x38 m6502.o + 0x01f1b428 M6502::zpy_2_6_T1() + .text._ZN5M650210zpy_2_6_T2Ev + 0x01f1b460 0x2c m6502.o + 0x01f1b460 M6502::zpy_2_6_T2() + .text._ZN5M650210zpy_3_5_T1Ev + 0x01f1b48c 0x38 m6502.o + 0x01f1b48c M6502::zpy_3_5_T1() + .text._ZN5M650210zpy_3_5_T2Ev + 0x01f1b4c4 0x2c m6502.o + 0x01f1b4c4 M6502::zpy_3_5_T2() + .text._ZN5M650210idy_2_7_T1Ev + 0x01f1b4f0 0x38 m6502.o + 0x01f1b4f0 M6502::idy_2_7_T1() + .text._ZN5M650210idy_2_7_T2Ev + 0x01f1b528 0x38 m6502.o + 0x01f1b528 M6502::idy_2_7_T2() + .text._ZN5M650210idy_2_7_T3Ev + 0x01f1b560 0x38 m6502.o + 0x01f1b560 M6502::idy_2_7_T3() + .text._ZN5M650210idy_3_6_T1Ev + 0x01f1b598 0x38 m6502.o + 0x01f1b598 M6502::idy_3_6_T1() + .text._ZN5M650210idy_3_6_T2Ev + 0x01f1b5d0 0x38 m6502.o + 0x01f1b5d0 M6502::idy_3_6_T2() + .text._ZN5M650210idy_3_6_T3Ev + 0x01f1b608 0x38 m6502.o + 0x01f1b608 M6502::idy_3_6_T3() + .text._ZN5M650210idy_3_6_T4Ev + 0x01f1b640 0x3c m6502.o + 0x01f1b640 M6502::idy_3_6_T4() + .text._ZN5M650212idy_Undoc_T1Ev + 0x01f1b67c 0x38 m6502.o + 0x01f1b67c M6502::idy_Undoc_T1() + .text._ZN5M650212idy_Undoc_T2Ev + 0x01f1b6b4 0x38 m6502.o + 0x01f1b6b4 M6502::idy_Undoc_T2() + .text._ZN5M650212idy_Undoc_T3Ev + 0x01f1b6ec 0x38 m6502.o + 0x01f1b6ec M6502::idy_Undoc_T3() + .text._ZN5M650212idy_Undoc_T4Ev + 0x01f1b724 0x3c m6502.o + 0x01f1b724 M6502::idy_Undoc_T4() + .text._ZN5M650212idy_Undoc_T5Ev + 0x01f1b760 0x30 m6502.o + 0x01f1b760 M6502::idy_Undoc_T5() + .text._ZN5M650212idy_Undoc_T6Ev + 0x01f1b790 0x30 m6502.o + 0x01f1b790 M6502::idy_Undoc_T6() + .text._ZN5M65029zp_4_1_T1Ev + 0x01f1b7c0 0x38 m6502.o + 0x01f1b7c0 M6502::zp_4_1_T1() + .text._ZN5M65029zp_4_1_T2Ev + 0x01f1b7f8 0x30 m6502.o + 0x01f1b7f8 M6502::zp_4_1_T2() + .text._ZN5M65029zp_4_1_T3Ev + 0x01f1b828 0x30 m6502.o + 0x01f1b828 M6502::zp_4_1_T3() + .text._ZN5M650210abs_4_2_T1Ev + 0x01f1b858 0x38 m6502.o + 0x01f1b858 M6502::abs_4_2_T1() + .text._ZN5M650210abs_4_2_T2Ev + 0x01f1b890 0x40 m6502.o + 0x01f1b890 M6502::abs_4_2_T2() + .text._ZN5M650210abs_4_2_T3Ev + 0x01f1b8d0 0x30 m6502.o + 0x01f1b8d0 M6502::abs_4_2_T3() + .text._ZN5M650210abs_4_2_T4Ev + 0x01f1b900 0x30 m6502.o + 0x01f1b900 M6502::abs_4_2_T4() + .text._ZN5M650210zpx_4_3_T1Ev + 0x01f1b930 0x38 m6502.o + 0x01f1b930 M6502::zpx_4_3_T1() + .text._ZN5M650210zpx_4_3_T2Ev + 0x01f1b968 0x2c m6502.o + 0x01f1b968 M6502::zpx_4_3_T2() + .text._ZN5M650210zpx_4_3_T3Ev + 0x01f1b994 0x40 m6502.o + 0x01f1b994 M6502::zpx_4_3_T3() + .text._ZN5M650210zpx_4_3_T4Ev + 0x01f1b9d4 0x30 m6502.o + 0x01f1b9d4 M6502::zpx_4_3_T4() + .text._ZN5M650211absx_4_4_T1Ev + 0x01f1ba04 0x38 m6502.o + 0x01f1ba04 M6502::absx_4_4_T1() + .text._ZN5M650211absx_4_4_T2Ev + 0x01f1ba3c 0x40 m6502.o + 0x01f1ba3c M6502::absx_4_4_T2() + .text._ZN5M650211absx_4_4_T3Ev + 0x01f1ba7c 0x3c m6502.o + 0x01f1ba7c M6502::absx_4_4_T3() + .text._ZN5M650211absx_4_4_T4Ev + 0x01f1bab8 0x30 m6502.o + 0x01f1bab8 M6502::absx_4_4_T4() + .text._ZN5M650211absx_4_4_T5Ev + 0x01f1bae8 0x30 m6502.o + 0x01f1bae8 M6502::absx_4_4_T5() + .text._ZN5M650211absy_4_4_T1Ev + 0x01f1bb18 0x38 m6502.o + 0x01f1bb18 M6502::absy_4_4_T1() + .text._ZN5M650211absy_4_4_T2Ev + 0x01f1bb50 0x40 m6502.o + 0x01f1bb50 M6502::absy_4_4_T2() + .text._ZN5M650211absy_4_4_T3Ev + 0x01f1bb90 0x3c m6502.o + 0x01f1bb90 M6502::absy_4_4_T3() + .text._ZN5M650211absy_4_4_T4Ev + 0x01f1bbcc 0x30 m6502.o + 0x01f1bbcc M6502::absy_4_4_T4() + .text._ZN5M650211absy_4_4_T5Ev + 0x01f1bbfc 0x30 m6502.o + 0x01f1bbfc M6502::absy_4_4_T5() + .text._ZN5M65029ph_5_1_T1Ev + 0x01f1bc2c 0x2c m6502.o + 0x01f1bc2c M6502::ph_5_1_T1() + .text._ZN5M65029pl_5_2_T1Ev + 0x01f1bc58 0x2c m6502.o + 0x01f1bc58 M6502::pl_5_2_T1() + .text._ZN5M65029pl_5_2_T2Ev + 0x01f1bc84 0x30 m6502.o + 0x01f1bc84 M6502::pl_5_2_T2() + .text._ZN5M650210jsr_5_3_T1Ev + 0x01f1bcb4 0x38 m6502.o + 0x01f1bcb4 M6502::jsr_5_3_T1() + .text._ZN5M650210jsr_5_3_T2Ev + 0x01f1bcec 0x30 m6502.o + 0x01f1bcec M6502::jsr_5_3_T2() + .text._ZN5M650210jsr_5_3_T3Ev + 0x01f1bd1c 0x40 m6502.o + 0x01f1bd1c M6502::jsr_5_3_T3() + .text._ZN5M650210jsr_5_3_T4Ev + 0x01f1bd5c 0x3c m6502.o + 0x01f1bd5c M6502::jsr_5_3_T4() + .text._ZN5M650210rti_5_5_T1Ev + 0x01f1bd98 0x34 m6502.o + 0x01f1bd98 M6502::rti_5_5_T1() + .text._ZN5M650210rti_5_5_T2Ev + 0x01f1bdcc 0x30 m6502.o + 0x01f1bdcc M6502::rti_5_5_T2() + .text._ZN5M650210rti_5_5_T3Ev + 0x01f1bdfc 0x40 m6502.o + 0x01f1bdfc M6502::rti_5_5_T3() + .text._ZN5M650210rti_5_5_T4Ev + 0x01f1be3c 0x40 m6502.o + 0x01f1be3c M6502::rti_5_5_T4() + .text._ZN5M650211abs5_6_1_T1Ev + 0x01f1be7c 0x38 m6502.o + 0x01f1be7c M6502::abs5_6_1_T1() + .text._ZN5M650211abs5_6_2_T1Ev + 0x01f1beb4 0x38 m6502.o + 0x01f1beb4 M6502::abs5_6_2_T1() + .text._ZN5M650211abs5_6_2_T2Ev + 0x01f1beec 0x40 m6502.o + 0x01f1beec M6502::abs5_6_2_T2() + .text._ZN5M650211abs5_6_2_T3Ev + 0x01f1bf2c 0x38 m6502.o + 0x01f1bf2c M6502::abs5_6_2_T3() + .text._ZN5M650210rts_5_7_T1Ev + 0x01f1bf64 0x34 m6502.o + 0x01f1bf64 M6502::rts_5_7_T1() + .text._ZN5M650210rts_5_7_T2Ev + 0x01f1bf98 0x30 m6502.o + 0x01f1bf98 M6502::rts_5_7_T2() + .text._ZN5M650210rts_5_7_T3Ev + 0x01f1bfc8 0x40 m6502.o + 0x01f1bfc8 M6502::rts_5_7_T3() + .text._ZN5M650210rts_5_7_T4Ev + 0x01f1c008 0x48 m6502.o + 0x01f1c008 M6502::rts_5_7_T4() + .text._ZN5M650210brk_5_4_T1Ev + 0x01f1c050 0x38 m6502.o + 0x01f1c050 M6502::brk_5_4_T1() + .text._ZN5M650210brk_5_4_T2Ev + 0x01f1c088 0x40 m6502.o + 0x01f1c088 M6502::brk_5_4_T2() + .text._ZN5M650210brk_5_4_T3Ev + 0x01f1c0c8 0x3c m6502.o + 0x01f1c0c8 M6502::brk_5_4_T3() + .text._ZN5M650210brk_5_4_T5Ev + 0x01f1c104 0x30 m6502.o + 0x01f1c104 M6502::brk_5_4_T5() + .text._ZN5M65028Reset_T1Ev + 0x01f1c134 0x2c m6502.o + 0x01f1c134 M6502::Reset_T1() + .text._ZN5M65028Reset_T2Ev + 0x01f1c160 0x38 m6502.o + 0x01f1c160 M6502::Reset_T2() + .text._ZN5M65028Reset_T3Ev + 0x01f1c198 0x38 m6502.o + 0x01f1c198 M6502::Reset_T3() + .text._ZN5M65028Reset_T4Ev + 0x01f1c1d0 0x44 m6502.o + 0x01f1c1d0 M6502::Reset_T4() + .text._ZN5M65028Reset_T5Ev + 0x01f1c214 0x30 m6502.o + 0x01f1c214 M6502::Reset_T5() + .text._ZN5M65028Reset_T6Ev + 0x01f1c244 0x38 m6502.o + 0x01f1c244 M6502::Reset_T6() + .text._ZN5M65026IRQ_T1Ev + 0x01f1c27c 0x2c m6502.o + 0x01f1c27c M6502::IRQ_T1() + .text._ZN5M65026IRQ_T2Ev + 0x01f1c2a8 0x40 m6502.o + 0x01f1c2a8 M6502::IRQ_T2() + .text._ZN5M65026IRQ_T3Ev + 0x01f1c2e8 0x3c m6502.o + 0x01f1c2e8 M6502::IRQ_T3() + .text._ZN5M65026IRQ_T5Ev + 0x01f1c324 0x30 m6502.o + 0x01f1c324 M6502::IRQ_T5() + .text._ZN5M65026IRQ_T6Ev + 0x01f1c354 0x44 m6502.o + 0x01f1c354 M6502::IRQ_T6() + .text._ZN5M65023ADCEv + 0x01f1c398 0x12c m6502.o + 0x01f1c398 M6502::ADC() + .text._ZN5M65023ARREv + 0x01f1c4c4 0x10c m6502.o + 0x01f1c4c4 M6502::ARR() + .text._ZN5M65023SBCEv + 0x01f1c5d0 0x11c m6502.o + 0x01f1c5d0 M6502::SBC() + .text._ZN5M650210idy_2_7_T4Ev + 0x01f1c6ec 0x9c m6502.o + 0x01f1c6ec M6502::idy_2_7_T4() + .text._ZN5M650210rel_5_8_T2Ev + 0x01f1c788 0x5c m6502.o + 0x01f1c788 M6502::rel_5_8_T2() + .text._ZN5M65026IRQ_T4Ev + 0x01f1c7e4 0x48 m6502.o + 0x01f1c7e4 M6502::IRQ_T4() + .text._ZN5M650216InstructionFetchEv + 0x01f1c82c 0x94 m6502.o + 0x01f1c82c M6502::InstructionFetch() + .text._ZN5M650219InstructionFetchIRQEv + 0x01f1c8c0 0x58 m6502.o + 0x01f1c8c0 M6502::InstructionFetchIRQ() + .text._ZN5M65023BMIEv + 0x01f1c918 0x78 m6502.o + 0x01f1c918 M6502::BMI() + .text._ZN5M650210brk_5_4_T4Ev + 0x01f1c990 0x90 m6502.o + 0x01f1c990 M6502::brk_5_4_T4() + .text._ZN5M65023BPLEv + 0x01f1ca20 0x78 m6502.o + 0x01f1ca20 M6502::BPL() + .text._ZN5M65023BCSEv + 0x01f1ca98 0x74 m6502.o + 0x01f1ca98 M6502::BCS() + .text._ZN5M65023BEQEv + 0x01f1cb0c 0x74 m6502.o + 0x01f1cb0c M6502::BEQ() + .text._ZN5M65023BCCEv + 0x01f1cb80 0x74 m6502.o + 0x01f1cb80 M6502::BCC() + .text._ZN5M65023BVCEv + 0x01f1cbf4 0x74 m6502.o + 0x01f1cbf4 M6502::BVC() + .text._ZN5M65023BNEEv + 0x01f1cc68 0x74 m6502.o + 0x01f1cc68 M6502::BNE() + .text._ZN5M65023BVSEv + 0x01f1ccdc 0x74 m6502.o + 0x01f1ccdc M6502::BVS() + .text._ZN5M65029zp_3_1_T2Ev + 0x01f1cd50 0x44 m6502.o + 0x01f1cd50 M6502::zp_3_1_T2() + .text._ZN5M650210abs_3_2_T3Ev + 0x01f1cd94 0x44 m6502.o + 0x01f1cd94 M6502::abs_3_2_T3() + .text._ZN5M650210idx_3_3_T5Ev + 0x01f1cdd8 0x44 m6502.o + 0x01f1cdd8 M6502::idx_3_3_T5() + .text._ZN5M650212idx_Undoc_T7Ev + 0x01f1ce1c 0x44 m6502.o + 0x01f1ce1c M6502::idx_Undoc_T7() + .text._ZN5M650211absx_3_4_T4Ev + 0x01f1ce60 0x44 m6502.o + 0x01f1ce60 M6502::absx_3_4_T4() + .text._ZN5M650211absy_3_4_T4Ev + 0x01f1cea4 0x44 m6502.o + 0x01f1cea4 M6502::absy_3_4_T4() + .text._ZN5M650210idy_3_6_T5Ev + 0x01f1cee8 0x44 m6502.o + 0x01f1cee8 M6502::idy_3_6_T5() + .text._ZN5M650212idy_Undoc_T7Ev + 0x01f1cf2c 0x44 m6502.o + 0x01f1cf2c M6502::idy_Undoc_T7() + .text._ZN5M65029zp_4_1_T4Ev + 0x01f1cf70 0x44 m6502.o + 0x01f1cf70 M6502::zp_4_1_T4() + .text._ZN5M650210abs_4_2_T5Ev + 0x01f1cfb4 0x44 m6502.o + 0x01f1cfb4 M6502::abs_4_2_T5() + .text._ZN5M650210zpx_4_3_T5Ev + 0x01f1cff8 0x44 m6502.o + 0x01f1cff8 M6502::zpx_4_3_T5() + .text._ZN5M650211absx_4_4_T6Ev + 0x01f1d03c 0x44 m6502.o + 0x01f1d03c M6502::absx_4_4_T6() + .text._ZN5M650211absy_4_4_T6Ev + 0x01f1d080 0x44 m6502.o + 0x01f1d080 M6502::absy_4_4_T6() + .text._ZN5M65029ph_5_1_T2Ev + 0x01f1d0c4 0x44 m6502.o + 0x01f1d0c4 M6502::ph_5_1_T2() + .text._ZN5M65029pl_5_2_T3Ev + 0x01f1d108 0x44 m6502.o + 0x01f1d108 M6502::pl_5_2_T3() + .text._ZN5M650210zpy_3_5_T3Ev + 0x01f1d14c 0x58 m6502.o + 0x01f1d14c M6502::zpy_3_5_T3() + .text._ZN5M650210zpx_3_5_T3Ev + 0x01f1d1a4 0x58 m6502.o + 0x01f1d1a4 M6502::zpx_3_5_T3() + .text._ZN5M65029sb_jam_T1Ev + 0x01f1d1fc 0x50 m6502.o + 0x01f1d1fc M6502::sb_jam_T1() + .text._ZN5M650210idy_2_7_T5Ev + 0x01f1d24c 0x54 m6502.o + 0x01f1d24c M6502::idy_2_7_T5() + .text._ZN5M650211absx_2_5_T4Ev + 0x01f1d2a0 0x54 m6502.o + 0x01f1d2a0 M6502::absx_2_5_T4() + .text._ZN5M650211absy_2_5_T4Ev + 0x01f1d2f4 0x54 m6502.o + 0x01f1d2f4 M6502::absy_2_5_T4() + .text._ZN5M65029zp_2_1_T2Ev + 0x01f1d348 0x54 m6502.o + 0x01f1d348 M6502::zp_2_1_T2() + .text._ZN5M650210abs_2_3_T3Ev + 0x01f1d39c 0x54 m6502.o + 0x01f1d39c M6502::abs_2_3_T3() + .text._ZN5M650210idx_2_4_T5Ev + 0x01f1d3f0 0x54 m6502.o + 0x01f1d3f0 M6502::idx_2_4_T5() + .text._ZN5M65027sb_1_T1Ev + 0x01f1d444 0x58 m6502.o + 0x01f1d444 M6502::sb_1_T1() + .text._ZN5M650210rts_5_7_T5Ev + 0x01f1d49c 0x5c m6502.o + 0x01f1d49c M6502::rts_5_7_T5() + .text._ZN5M650210imm_2_1_T1Ev + 0x01f1d4f8 0x5c m6502.o + 0x01f1d4f8 M6502::imm_2_1_T1() + .text._ZN5M650211abs5_6_2_T4Ev + 0x01f1d554 0x5c m6502.o + 0x01f1d554 M6502::abs5_6_2_T4() + .text._ZN5M650210zpy_2_6_T3Ev + 0x01f1d5b0 0x64 m6502.o + 0x01f1d5b0 M6502::zpy_2_6_T3() + .text._ZN5M650210zpx_2_6_T3Ev + 0x01f1d614 0x64 m6502.o + 0x01f1d614 M6502::zpx_2_6_T3() + .text._ZN5M650211abs5_6_1_T2Ev + 0x01f1d678 0x64 m6502.o + 0x01f1d678 M6502::abs5_6_1_T2() + .text._ZN5M650210brk_5_4_T6Ev + 0x01f1d6dc 0x68 m6502.o + 0x01f1d6dc M6502::brk_5_4_T6() + .text._ZN5M650210jsr_5_3_T5Ev + 0x01f1d744 0x6c m6502.o + 0x01f1d744 M6502::jsr_5_3_T5() + .text._ZN5M650210rti_5_5_T5Ev + 0x01f1d7b0 0x6c m6502.o + 0x01f1d7b0 M6502::rti_5_5_T5() + .text._ZN5M650211absx_2_5_T3Ev + 0x01f1d81c 0x9c m6502.o + 0x01f1d81c M6502::absx_2_5_T3() + .text._ZN5M650211absy_2_5_T3Ev + 0x01f1d8b8 0x9c m6502.o + 0x01f1d8b8 M6502::absy_2_5_T3() + .text._ZN5M65023RRAEv + 0x01f1d954 0x19c m6502.o + 0x01f1d954 M6502::RRA() + .text._ZN5M65023ISBEv + 0x01f1daf0 0x17c m6502.o + 0x01f1daf0 M6502::ISB() + .text._ZN5M65024StepEv + 0x01f1dc6c 0x88 m6502.o + 0x01f1dc6c M6502::Step() + .text._ZN5M65025ResetEv + 0x01f1dcf4 0x44 m6502.o + 0x01f1dcf4 M6502::Reset() + .text 0x01f1dd38 0x0 m6522.o + .text._ZN5m6522C2Ev + 0x01f1dd38 0xe4 m6522.o + 0x01f1dd38 m6522::m6522() + 0x01f1dd38 m6522::m6522() + .text._ZN5m65225ResetEv + 0x01f1de1c 0xc4 m6522.o + 0x01f1de1c m6522::Reset() + .text._ZN5m65228InputCA1Eb + 0x01f1dee0 0xd0 m6522.o + 0x01f1dee0 m6522::InputCA1(bool) + .text._ZN5m65228InputCA2Eb + 0x01f1dfb0 0xa0 m6522.o + 0x01f1dfb0 m6522::InputCA2(bool) + .text._ZN5m65228InputCB1Eb + 0x01f1e050 0xd0 m6522.o + 0x01f1e050 m6522::InputCB1(bool) + .text._ZN5m65228InputCB2Eb + 0x01f1e120 0xa0 m6522.o + 0x01f1e120 m6522::InputCB2(bool) + .text._ZN5m65227ExecuteEv + 0x01f1e1c0 0x894 m6522.o + 0x01f1e1c0 m6522::Execute() + .text._ZN5m65224ReadEj + 0x01f1ea54 0x3d0 m6522.o + 0x01f1ea54 m6522::Read(unsigned int) + .text._ZN5m65224PeekEj + 0x01f1ee24 0x134 m6522.o + 0x01f1ee24 m6522::Peek(unsigned int) + .text._ZN5m65225WriteEjh + 0x01f1ef58 0x654 m6522.o + 0x01f1ef58 m6522::Write(unsigned int, unsigned char) + .text 0x01f1f5ac 0x0 drive.o + .text._ZN5DriveC2Ev + 0x01f1f5ac 0xec drive.o + 0x01f1f5ac Drive::Drive() + 0x01f1f5ac Drive::Drive() + .text._ZN5Drive5ResetEv + 0x01f1f698 0xd8 drive.o + 0x01f1f698 Drive::Reset() + .text._ZN5Drive6InsertEP9DiskImage + 0x01f1f770 0x10 drive.o + 0x01f1f770 Drive::Insert(DiskImage*) + .text._ZN5Drive5EjectEv + 0x01f1f780 0x14 drive.o + 0x01f1f780 Drive::Eject() + .text._ZN5Drive9DumpTrackEj + 0x01f1f794 0x10 drive.o + 0x01f1f794 Drive::DumpTrack(unsigned int) + .text._ZN5Drive9OnPortOutEPvh + 0x01f1f7a4 0xd4 drive.o + 0x01f1f7a4 Drive::OnPortOut(void*, unsigned char) + .text._ZN5Drive22AdvanceSectorPositionRERi + 0x01f1f878 0x30 drive.o + 0x01f1f878 Drive::AdvanceSectorPositionR(int&) + .text._ZN5Drive22AdvanceSectorPositionWERi + 0x01f1f8a8 0x34 drive.o + 0x01f1f8a8 Drive::AdvanceSectorPositionW(int&) + .text._ZN5Drive10GetNextBitEv + 0x01f1f8dc 0x50 drive.o + 0x01f1f8dc Drive::GetNextBit() + .text._ZN5Drive10SetNextBitEb + 0x01f1f92c 0xb8 drive.o + 0x01f1f92c Drive::SetNextBit(bool) + .text._ZN5Drive6UpdateEv + 0x01f1f9e4 0x3c8 drive.o + 0x01f1f9e4 Drive::Update() + .text 0x01f1fdac 0x0 gcr.o + .text._Z9find_syncPPhS_ + 0x01f1fdac 0xb8 gcr.o + 0x01f1fdac find_sync(unsigned char**, unsigned char*) + .text._Z21convert_4bytes_to_GCRPhS_ + 0x01f1fe64 0x100 gcr.o + 0x01f1fe64 convert_4bytes_to_GCR(unsigned char*, unsigned char*) + .text._Z23convert_4bytes_from_GCRPhS_ + 0x01f1ff64 0x13c gcr.o + 0x01f1ff64 convert_4bytes_from_GCR(unsigned char*, unsigned char*) + .text._Z18convert_GCR_sectorPhS_S_iiS_.part.1 + 0x01f200a0 0xda0 gcr.o + .text._Z10extract_idPhS_ + 0x01f20e40 0xd8 gcr.o + 0x01f20e40 extract_id(unsigned char*, unsigned char*) + .text._Z19extract_cosmetic_idPhS_ + 0x01f20f18 0x60 gcr.o + 0x01f20f18 extract_cosmetic_id(unsigned char*, unsigned char*) + .text._Z18convert_GCR_sectorPhS_S_iiS_ + 0x01f20f78 0x34 gcr.o + 0x01f20f78 convert_GCR_sector(unsigned char*, unsigned char*, unsigned char*, int, int, unsigned char*) + .text._Z21convert_sector_to_GCRPhS_iiS_i + 0x01f20fac 0x464 gcr.o + 0x01f20fac convert_sector_to_GCR(unsigned char*, unsigned char*, int, int, unsigned char*, int) + .text._Z16find_track_cyclePPhS0_ii + 0x01f21410 0x29c gcr.o + 0x01f21410 find_track_cycle(unsigned char**, unsigned char**, int, int) + .text._Z23find_nondos_track_cyclePPhS0_ii + 0x01f216ac 0x144 gcr.o + 0x01f216ac find_nondos_track_cycle(unsigned char**, unsigned char**, int, int) + .text._Z16check_valid_dataPhi + 0x01f217f0 0x7c gcr.o + 0x01f217f0 check_valid_data(unsigned char*, int) + .text._Z12find_sector0PhiPj + 0x01f2186c 0x164 gcr.o + 0x01f2186c find_sector0(unsigned char*, int, unsigned int*) + .text._Z15find_sector_gapPhiPj + 0x01f219d0 0x134 gcr.o + 0x01f219d0 find_sector_gap(unsigned char*, int, unsigned int*) + .text._Z15check_formattedPh + 0x01f21b04 0xd8 gcr.o + 0x01f21b04 check_formatted(unsigned char*) + .text._Z17extract_GCR_trackPhS_Piijj + 0x01f21bdc 0x3c8 gcr.o + 0x01f21bdc extract_GCR_track(unsigned char*, unsigned char*, int*, int, unsigned int, unsigned int) + .text._Z10strip_runsPhiih + 0x01f21fa4 0x8c gcr.o + 0x01f21fa4 strip_runs(unsigned char*, int, int, unsigned char) + .text._Z11reduce_runsPhiiih + 0x01f22030 0xc0 gcr.o + 0x01f22030 reduce_runs(unsigned char*, int, int, int, unsigned char) + .text._Z16check_sync_flagsPhii + 0x01f220f0 0x3cc gcr.o + 0x01f220f0 check_sync_flags(unsigned char*, int, int) + .text._Z14compare_tracksPhS_iiiPc + 0x01f224bc 0x2ec gcr.o + 0x01f224bc compare_tracks(unsigned char*, unsigned char*, int, int, int, char*) + .text._Z15compare_sectorsPhS_iiS_S_iPc + 0x01f227a8 0x8f4 gcr.o + 0x01f227a8 compare_sectors(unsigned char*, unsigned char*, int, int, unsigned char*, unsigned char*, int, char*) + .text._Z12check_errorsPhiiS_Pc + 0x01f2309c 0x160 gcr.o + 0x01f2309c check_errors(unsigned char*, int, int, unsigned char*, char*) + .text._Z11check_emptyPhiiS_Pc + 0x01f231fc 0x130 gcr.o + 0x01f231fc check_empty(unsigned char*, int, int, unsigned char*, char*) + .text._Z13replace_bytesPhihh + 0x01f2332c 0x3c gcr.o + 0x01f2332c replace_bytes(unsigned char*, int, unsigned char, unsigned char) + .text._Z10is_bad_gcrPhjj + 0x01f23368 0xb0 gcr.o + 0x01f23368 is_bad_gcr(unsigned char*, unsigned int, unsigned int) + .text._Z13check_bad_gcrPhii + 0x01f23418 0x38c gcr.o + 0x01f23418 check_bad_gcr(unsigned char*, int, int) + .text 0x01f237a4 0x0 prot.o + .text._Z12shift_bufferPhii + 0x01f237a4 0x74 prot.o + 0x01f237a4 shift_buffer(unsigned char*, int, int) + .text._Z10align_vmaxPhi + 0x01f23818 0x8c prot.o + 0x01f23818 align_vmax(unsigned char*, int) + .text._Z8auto_gapPhi + 0x01f238a4 0x7c prot.o + 0x01f238a4 auto_gap(unsigned char*, int) + .text._Z13find_weak_gapPhi + 0x01f23920 0x84 prot.o + 0x01f23920 find_weak_gap(unsigned char*, int) + .text._Z14find_long_syncPhi + 0x01f239a4 0x74 prot.o + 0x01f239a4 find_long_sync(unsigned char*, int) + .text 0x01f23a18 0x0 lz.o + .text.LZ_Compress + 0x01f23a18 0x3f0 lz.o + 0x01f23a18 LZ_Compress + .text.LZ_CompressFast + 0x01f23e08 0x654 lz.o + 0x01f23e08 LZ_CompressFast + .text.LZ_Uncompress + 0x01f2445c 0x4e8 lz.o + 0x01f2445c LZ_Uncompress + .text 0x01f24944 0x0 emmc.o + .text._ZN11CEMMCDeviceC2Ev + 0x01f24944 0x14 emmc.o + 0x01f24944 CEMMCDevice::CEMMCDevice() + 0x01f24944 CEMMCDevice::CEMMCDevice() + .text._ZN11CEMMCDeviceD2Ev + 0x01f24958 0x4 emmc.o + 0x01f24958 CEMMCDevice::~CEMMCDevice() + 0x01f24958 CEMMCDevice::~CEMMCDevice() + .text._ZN11CEMMCDevice4SeekEy + 0x01f2495c 0x10 emmc.o + 0x01f2495c CEMMCDevice::Seek(unsigned long long) + .text._ZN11CEMMCDevice7PowerOnEv + 0x01f2496c 0x48 emmc.o + 0x01f2496c CEMMCDevice::PowerOn() + .text._ZN11CEMMCDevice8PowerOffEv + 0x01f249b4 0x18 emmc.o + 0x01f249b4 CEMMCDevice::PowerOff() + .text._ZN11CEMMCDevice15GetClockDividerEjj + 0x01f249cc 0xb4 emmc.o + 0x01f249cc CEMMCDevice::GetClockDivider(unsigned int, unsigned int) + .text._ZN11CEMMCDevice15SwitchClockRateEjj + 0x01f24a80 0x1b8 emmc.o + 0x01f24a80 CEMMCDevice::SwitchClockRate(unsigned int, unsigned int) + .text._ZN11CEMMCDevice8ResetCmdEv + 0x01f24c38 0x84 emmc.o + 0x01f24c38 CEMMCDevice::ResetCmd() + .text._ZN11CEMMCDevice8ResetDatEv + 0x01f24cbc 0x84 emmc.o + 0x01f24cbc CEMMCDevice::ResetDat() + .text._ZN11CEMMCDevice15IssueCommandIntEjji + 0x01f24d40 0x318 emmc.o + 0x01f24d40 CEMMCDevice::IssueCommandInt(unsigned int, unsigned int, int) + .text._ZN11CEMMCDevice19HandleCardInterruptEv + 0x01f25058 0x24 emmc.o + 0x01f25058 CEMMCDevice::HandleCardInterrupt() + .text._ZN11CEMMCDevice16HandleInterruptsEv + 0x01f2507c 0x19c emmc.o + 0x01f2507c CEMMCDevice::HandleInterrupts() + .text._ZN11CEMMCDevice12IssueCommandEjji.constprop.1 + 0x01f25218 0x110 emmc.o + .text._ZN11CEMMCDevice12IssueCommandEjji + 0x01f25328 0x11c emmc.o + 0x01f25328 CEMMCDevice::IssueCommand(unsigned int, unsigned int, int) + .text._ZN11CEMMCDevice9CardResetEv + 0x01f25444 0xb14 emmc.o + 0x01f25444 CEMMCDevice::CardReset() + .text._ZN11CEMMCDevice10InitializeEv + 0x01f25f58 0x74 emmc.o + 0x01f25f58 CEMMCDevice::Initialize() + .text._ZN11CEMMCDevice14EnsureDataModeEv + 0x01f25fcc 0x2c0 emmc.o + 0x01f25fcc CEMMCDevice::EnsureDataMode() + .text._ZN11CEMMCDevice13DoDataCommandEiPhjj + 0x01f2628c 0x180 emmc.o + 0x01f2628c CEMMCDevice::DoDataCommand(int, unsigned char*, unsigned int, unsigned int) + .text._ZN11CEMMCDevice4ReadEPvj + 0x01f2640c 0x90 emmc.o + 0x01f2640c CEMMCDevice::Read(void*, unsigned int) + .text._ZN11CEMMCDevice5WriteEPKvj + 0x01f2649c 0x94 emmc.o + 0x01f2649c CEMMCDevice::Write(void const*, unsigned int) + .text._ZN11CEMMCDevice6DoReadEPhjj + 0x01f26530 0x58 emmc.o + 0x01f26530 CEMMCDevice::DoRead(unsigned char*, unsigned int, unsigned int) + .text._ZN11CEMMCDevice7DoWriteEPhjj + 0x01f26588 0x5c emmc.o + 0x01f26588 CEMMCDevice::DoWrite(unsigned char*, unsigned int, unsigned int) + .text._ZN11CEMMCDevice11TimeoutWaitEjjij + 0x01f265e4 0x8c emmc.o + 0x01f265e4 CEMMCDevice::TimeoutWait(unsigned int, unsigned int, int, unsigned int) + .text 0x01f26670 0x0 diskio.o + .text.disk_setEMM + 0x01f26670 0x10 diskio.o + 0x01f26670 disk_setEMM + .text._Z12sd_card_initPP12block_device + 0x01f26680 0x8 diskio.o + 0x01f26680 sd_card_init(block_device**) + .text._Z7sd_readPhjm + 0x01f26688 0x1c diskio.o + 0x01f26688 sd_read(unsigned char*, unsigned int, unsigned long) + .text._Z8sd_writePhjm + 0x01f266a4 0x1c diskio.o + 0x01f266a4 sd_write(unsigned char*, unsigned int, unsigned long) + .text.disk_status + 0x01f266c0 0x8 diskio.o + 0x01f266c0 disk_status + .text.disk_initialize + 0x01f266c8 0x8 diskio.o + 0x01f266c8 disk_initialize + .text.disk_read + 0x01f266d0 0x78 diskio.o + 0x01f266d0 disk_read + .text.disk_write + 0x01f26748 0x78 diskio.o + 0x01f26748 disk_write + .text.disk_ioctl + 0x01f267c0 0x8 diskio.o + 0x01f267c0 disk_ioctl + .text 0x01f267c8 0x0 options.o + .text._ZN10TextParser14SkipWhiteSpaceEv + 0x01f267c8 0x40 options.o + 0x01f267c8 TextParser::SkipWhiteSpace() + .text._ZN10TextParser12ParseCommentEv + 0x01f26808 0x14c options.o + 0x01f26808 TextParser::ParseComment() + .text._ZN10TextParser8GetTokenEb + 0x01f26954 0xd8 options.o + 0x01f26954 TextParser::GetToken(bool) + .text._ZN7OptionsC2Ev + 0x01f26a2c 0x5c options.o + 0x01f26a2c Options::Options() + 0x01f26a2c Options::Options() + .text._ZN7Options7ProcessEPc + 0x01f26a88 0xb28 options.o + 0x01f26a88 Options::Process(char*) + .text._ZN7Options10GetDecimalEPc + 0x01f275b0 0x94 options.o + 0x01f275b0 Options::GetDecimal(char*) + .text._ZNK7Options10GetRomNameEi + 0x01f27644 0x6c options.o + 0x01f27644 Options::GetRomName(int) const + .text 0x01f276b0 0x0 Screen.o + .text._ZN6Screen11PlotPixel32Ejj + 0x01f276b0 0xc Screen.o + 0x01f276b0 Screen::PlotPixel32(unsigned int, unsigned int) + .text._ZN6Screen11PlotPixel24Ejj + 0x01f276bc 0x34 Screen.o + 0x01f276bc Screen::PlotPixel24(unsigned int, unsigned int) + .text._ZN6Screen11PlotPixel16Ejj + 0x01f276f0 0x28 Screen.o + 0x01f276f0 Screen::PlotPixel16(unsigned int, unsigned int) + .text._ZN6Screen10PlotPixel8Ejj + 0x01f27718 0x10 Screen.o + 0x01f27718 Screen::PlotPixel8(unsigned int, unsigned int) + .text._ZL19stbi__vertical_flipPviii + 0x01f27728 0xdc Screen.o + .text._ZL10stbi__get8P13stbi__context + 0x01f27804 0x84 Screen.o + .text._ZN6Screen9WriteCharEbjjhj.part.18 + 0x01f27888 0x408 Screen.o + .text._ZL26stbi__gif_parse_colortableP13stbi__contextPA4_hii + 0x01f27c90 0x194 Screen.o + .text._ZL20stbi__zbuild_huffmanP14stbi__zhuffmanPKhi + 0x01f27e24 0x60c Screen.o + .text._ZL27stbi__compute_huffman_codesP10stbi__zbuf + 0x01f28430 0xc60 Screen.o + .text._ZL16stbi__parse_zlibP10stbi__zbufi + 0x01f29090 0x1b60 Screen.o + .text._ZL13stbi__get16leP13stbi__context + 0x01f2abf0 0x104 Screen.o + .text._ZL13stbi__get16beP13stbi__context + 0x01f2acf4 0x108 Screen.o + .text._ZL13stbi__get32beP13stbi__context + 0x01f2adfc 0x208 Screen.o + .text._ZL20stbi__convert_formatPhiijj.part.9 + 0x01f2b004 0x2278 Screen.o + .text._ZL26stbi__create_png_image_rawP9stbi__pngPhmimmii.isra.13 + 0x01f2d27c 0x41e0 Screen.o + .text._ZL18stbi__out_gif_codeP9stbi__gift + 0x01f3145c 0x3e4 Screen.o + .text._ZL20stbi__parse_png_fileP9stbi__pngii.constprop.20 + 0x01f31840 0xce0 Screen.o + .text._ZL20stbi__parse_png_fileP9stbi__pngii + 0x01f32520 0x1968 Screen.o + .text._ZL16stbi__gif_headerP13stbi__contextP9stbi__gifPii + 0x01f33e88 0x4d4 Screen.o + .text._ZL15stbi__load_mainP13stbi__contextPiS1_S1_iP17stbi__result_infoi.isra.15 + 0x01f3435c 0x35bc Screen.o + .text.stbi_failure_reason + 0x01f37918 0x10 Screen.o + 0x01f37918 stbi_failure_reason + .text.stbi_image_free + 0x01f37928 0x4 Screen.o + 0x01f37928 stbi_image_free + .text.stbi_set_flip_vertically_on_load + 0x01f3792c 0x10 Screen.o + 0x01f3792c stbi_set_flip_vertically_on_load + .text.stbi_load_16_from_memory + 0x01f3793c 0x42c Screen.o + 0x01f3793c stbi_load_16_from_memory + .text.stbi_load_16_from_callbacks + 0x01f37d68 0x468 Screen.o + 0x01f37d68 stbi_load_16_from_callbacks + .text.stbi_load_from_memory + 0x01f381d0 0x420 Screen.o + 0x01f381d0 stbi_load_from_memory + .text.stbi_load_from_callbacks + 0x01f385f0 0x45c Screen.o + 0x01f385f0 stbi_load_from_callbacks + .text.stbi_is_hdr_from_memory + 0x01f38a4c 0x8 Screen.o + 0x01f38a4c stbi_is_hdr_from_memory + .text.stbi_is_hdr_from_callbacks + 0x01f38a54 0x8 Screen.o + 0x01f38a54 stbi_is_hdr_from_callbacks + .text._Z21stbi_hdr_to_ldr_gammaf + 0x01f38a5c 0x4 Screen.o + 0x01f38a5c stbi_hdr_to_ldr_gamma(float) + .text._Z21stbi_hdr_to_ldr_scalef + 0x01f38a60 0x4 Screen.o + 0x01f38a60 stbi_hdr_to_ldr_scale(float) + .text.stbi_zlib_decode_malloc_guesssize + 0x01f38a64 0x98 Screen.o + 0x01f38a64 stbi_zlib_decode_malloc_guesssize + .text.stbi_zlib_decode_malloc + 0x01f38afc 0xc Screen.o + 0x01f38afc stbi_zlib_decode_malloc + .text.stbi_zlib_decode_malloc_guesssize_headerflag + 0x01f38b08 0x9c Screen.o + 0x01f38b08 stbi_zlib_decode_malloc_guesssize_headerflag + .text.stbi_zlib_decode_buffer + 0x01f38ba4 0x5c Screen.o + 0x01f38ba4 stbi_zlib_decode_buffer + .text.stbi_zlib_decode_noheader_malloc + 0x01f38c00 0x94 Screen.o + 0x01f38c00 stbi_zlib_decode_noheader_malloc + .text.stbi_zlib_decode_noheader_buffer + 0x01f38c94 0x5c Screen.o + 0x01f38c94 stbi_zlib_decode_noheader_buffer + .text.stbi_set_unpremultiply_on_load + 0x01f38cf0 0x10 Screen.o + 0x01f38cf0 stbi_set_unpremultiply_on_load + .text.stbi_convert_iphone_png_to_rgb + 0x01f38d00 0x10 Screen.o + 0x01f38d00 stbi_convert_iphone_png_to_rgb + .text.stbi_info_from_memory + 0x01f38d10 0x524 Screen.o + 0x01f38d10 stbi_info_from_memory + .text.stbi_info_from_callbacks + 0x01f39234 0x164 Screen.o + 0x01f39234 stbi_info_from_callbacks + .text._ZN6Screen4OpenEjjj + 0x01f39398 0x1ac Screen.o + 0x01f39398 Screen::Open(unsigned int, unsigned int, unsigned int) + .text._ZN6Screen8ClipRectERjS0_S0_S0_ + 0x01f39544 0x4c Screen.o + 0x01f39544 Screen::ClipRect(unsigned int&, unsigned int&, unsigned int&, unsigned int&) + .text._ZN6Screen9ClearAreaEjjjjj + 0x01f39590 0xa8 Screen.o + 0x01f39590 Screen::ClearArea(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int) + .text._ZN6Screen10ScrollAreaEjjjj + 0x01f39638 0x9c Screen.o + 0x01f39638 Screen::ScrollArea(unsigned int, unsigned int, unsigned int, unsigned int) + .text._ZN6Screen5ClearEj + 0x01f396d4 0x80 Screen.o + 0x01f396d4 Screen::Clear(unsigned int) + .text._ZN6Screen9WriteCharEbjjhj + 0x01f39754 0x20 Screen.o + 0x01f39754 Screen::WriteChar(bool, unsigned int, unsigned int, unsigned char, unsigned int) + .text._ZN6Screen9PlotPixelEjjj + 0x01f39774 0x4c Screen.o + 0x01f39774 Screen::PlotPixel(unsigned int, unsigned int, unsigned int) + .text._ZN6Screen8DrawLineEjjjjj + 0x01f397c0 0xf4 Screen.o + 0x01f397c0 Screen::DrawLine(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int) + .text._ZN6Screen9DrawLineVEjjjj + 0x01f398b4 0x68 Screen.o + 0x01f398b4 Screen::DrawLineV(unsigned int, unsigned int, unsigned int, unsigned int) + .text._ZN6Screen9PrintTextEbjjPcjjbPjS1_ + 0x01f3991c 0x20c Screen.o + 0x01f3991c Screen::PrintText(bool, unsigned int, unsigned int, char*, unsigned int, unsigned int, bool, unsigned int*, unsigned int*) + .text._ZN6Screen11MeasureTextEbPcPjS1_ + 0x01f39b28 0xc8 Screen.o + 0x01f39b28 Screen::MeasureText(bool, char*, unsigned int*, unsigned int*) + .text._ZN6Screen9PlotImageEPjiiii + 0x01f39bf0 0xa4 Screen.o + 0x01f39bf0 Screen::PlotImage(unsigned int*, int, int, int, int) + .text 0x01f39c94 0x0 Timer.o + .text.TimerInterruptHandler + 0x01f39c94 0xd0 Timer.o + .text.TimerSystemInitialize + 0x01f39d64 0x68 Timer.o + 0x01f39d64 TimerSystemInitialize + .text.TimerStartKernelTimer + 0x01f39dcc 0x78 Timer.o + 0x01f39dcc TimerStartKernelTimer + .text.TimerCancelKernelTimer + 0x01f39e44 0x18 Timer.o + 0x01f39e44 TimerCancelKernelTimer + .text 0x01f39e5c 0x0 FileBrowser.o + .text._ZN11FileBrowser10DisplayPNGER7FILINFOii.part.6 + 0x01f39e5c 0xcc FileBrowser.o + .text._ZN11FileBrowser9SelectLSTEPKc.part.10 + 0x01f39f28 0x154 FileBrowser.o + .text._ZN11FileBrowser13BrowsableList9FindEntryEPKc + 0x01f3a07c 0x78 FileBrowser.o + 0x01f3a07c FileBrowser::BrowsableList::FindEntry(char const*) + .text._ZN11FileBrowserC2EP9DiskCaddyP4ROMsjb + 0x01f3a0f4 0x58 FileBrowser.o + 0x01f3a0f4 FileBrowser::FileBrowser(DiskCaddy*, ROMs*, unsigned int, bool) + 0x01f3a0f4 FileBrowser::FileBrowser(DiskCaddy*, ROMs*, unsigned int, bool) + .text._ZN11FileBrowser6ColourEi + 0x01f3a14c 0x14 FileBrowser.o + 0x01f3a14c FileBrowser::Colour(int) + .text._ZN11FileBrowser29RefeshDisplayForBrowsableListEPNS_13BrowsableListEib + 0x01f3a160 0x27c FileBrowser.o + 0x01f3a160 FileBrowser::RefeshDisplayForBrowsableList(FileBrowser::BrowsableList*, int, bool) + .text._ZN11FileBrowser13RefeshDisplayEv + 0x01f3a3dc 0x210 FileBrowser.o + 0x01f3a3dc FileBrowser::RefeshDisplay() + .text._ZN11FileBrowser11CheckForPNGEPKcR7FILINFO + 0x01f3a5ec 0xb8 FileBrowser.o + 0x01f3a5ec FileBrowser::CheckForPNG(char const*, FILINFO&) + .text._ZN11FileBrowser10DisplayPNGER7FILINFOii + 0x01f3a6a4 0x30 FileBrowser.o + 0x01f3a6a4 FileBrowser::DisplayPNG(FILINFO&, int, int) + .text._ZN11FileBrowser10DisplayPNGEv + 0x01f3a6d4 0x60 FileBrowser.o + 0x01f3a6d4 FileBrowser::DisplayPNG() + .text._ZN11FileBrowser16GetCurrentFolderEv + 0x01f3a734 0x8 FileBrowser.o + 0x01f3a734 FileBrowser::GetCurrentFolder() + .text._ZN11FileBrowser23FillCaddyWithSelectionsEv + 0x01f3a73c 0xb0 FileBrowser.o + 0x01f3a73c FileBrowser::FillCaddyWithSelections() + .text._ZN11FileBrowser9SelectLSTEPKc + 0x01f3a7ec 0x3c FileBrowser.o + 0x01f3a7ec FileBrowser::SelectLST(char const*) + .text._ZN11FileBrowser20UpdateInputDiskCaddyEv + 0x01f3a828 0xa8 FileBrowser.o + 0x01f3a828 FileBrowser::UpdateInputDiskCaddy() + .text._ZN11FileBrowser16DisplayStatusBarEv + 0x01f3a8d0 0x64 FileBrowser.o + 0x01f3a8d0 FileBrowser::DisplayStatusBar() + .text._ZN11FileBrowser11ClearScreenEv + 0x01f3a934 0x14 FileBrowser.o + 0x01f3a934 FileBrowser::ClearScreen() + .text._ZN11FileBrowser16ShowDeviceAndROMEv + 0x01f3a948 0x84 FileBrowser.o + 0x01f3a948 FileBrowser::ShowDeviceAndROM() + .text._ZN11FileBrowser15DisplayDiskInfoEP9DiskImagePKc + 0x01f3a9cc 0x88c FileBrowser.o + 0x01f3a9cc FileBrowser::DisplayDiskInfo(DiskImage*, char const*) + .text._ZNSt6vectorIN11FileBrowser13BrowsableList5EntryESaIS2_EE19_M_emplace_back_auxIJRKS2_EEEvDpOT_ + 0x01f3b258 0xf4 FileBrowser.o + 0x01f3b258 void std::vector >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&) + 0x01f3b258 void std::vector >::_M_emplace_back_aux(FileBrowser::BrowsableList::Entry const&) + .text._ZN11FileBrowser19AutoSelectTestImageEv + 0x01f3b34c 0x17c FileBrowser.o + 0x01f3b34c FileBrowser::AutoSelectTestImage() + .text._ZN11FileBrowser10AddToCaddyEPNS_13BrowsableList5EntryE + 0x01f3b4c8 0xf4 FileBrowser.o + 0x01f3b4c8 FileBrowser::AddToCaddy(FileBrowser::BrowsableList::Entry*) + .text._ZSt16__insertion_sortIN9__gnu_cxx17__normal_iteratorIPN11FileBrowser13BrowsableList5EntryESt6vectorIS4_SaIS4_EEEENS0_5__ops15_Iter_comp_iterI7greaterEEEvT_SE_T0_ + 0x01f3b5bc 0x1c8 FileBrowser.o + 0x01f3b5bc void std::__insertion_sort<__gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter) + .text._ZSt25__unguarded_linear_insertIN9__gnu_cxx17__normal_iteratorIPN11FileBrowser13BrowsableList5EntryESt6vectorIS4_SaIS4_EEEENS0_5__ops14_Val_comp_iterI7greaterEEEvT_T0_ + 0x01f3b784 0xc4 FileBrowser.o + 0x01f3b784 void std::__unguarded_linear_insert<__gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Val_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Val_comp_iter) + .text._ZSt13__adjust_heapIN9__gnu_cxx17__normal_iteratorIPN11FileBrowser13BrowsableList5EntryESt6vectorIS4_SaIS4_EEEEiS4_NS0_5__ops15_Iter_comp_iterI7greaterEEEvT_T0_SF_T1_T2_ + 0x01f3b848 0x2bc FileBrowser.o + 0x01f3b848 void std::__adjust_heap<__gnu_cxx::__normal_iterator > >, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, int, int, FileBrowser::BrowsableList::Entry, __gnu_cxx::__ops::_Iter_comp_iter) + .text._ZSt11__make_heapIN9__gnu_cxx17__normal_iteratorIPN11FileBrowser13BrowsableList5EntryESt6vectorIS4_SaIS4_EEEENS0_5__ops15_Iter_comp_iterI7greaterEEEvT_SE_T0_ + 0x01f3bb04 0x98 FileBrowser.o + 0x01f3bb04 void std::__make_heap<__gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter) + .text._ZSt10__pop_heapIN9__gnu_cxx17__normal_iteratorIPN11FileBrowser13BrowsableList5EntryESt6vectorIS4_SaIS4_EEEENS0_5__ops15_Iter_comp_iterI7greaterEEEvT_SE_SE_T0_ + 0x01f3bb9c 0x80 FileBrowser.o + 0x01f3bb9c void std::__pop_heap<__gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __gnu_cxx::__ops::_Iter_comp_iter) + .text._ZSt4swapIN11FileBrowser13BrowsableList5EntryEEvRT_S4_ + 0x01f3bc1c 0x4c FileBrowser.o + 0x01f3bc1c void std::swap(FileBrowser::BrowsableList::Entry&, FileBrowser::BrowsableList::Entry&) + .text._ZSt16__introsort_loopIN9__gnu_cxx17__normal_iteratorIPN11FileBrowser13BrowsableList5EntryESt6vectorIS4_SaIS4_EEEEiNS0_5__ops15_Iter_comp_iterI7greaterEEEvT_SE_T0_T1_ + 0x01f3bc68 0x4a8 FileBrowser.o + 0x01f3bc68 void std::__introsort_loop<__gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, int, __gnu_cxx::__ops::_Iter_comp_iter) + .text._ZN11FileBrowser20RefreshFolderEntriesEv + 0x01f3c110 0x348 FileBrowser.o + 0x01f3c110 FileBrowser::RefreshFolderEntries() + .text._ZN11FileBrowser13FolderChangedEv + 0x01f3c458 0x18 FileBrowser.o + 0x01f3c458 FileBrowser::FolderChanged() + .text._ZN11FileBrowser11DisplayRootEv + 0x01f3c470 0x28 FileBrowser.o + 0x01f3c470 FileBrowser::DisplayRoot() + .text._ZN11FileBrowser9PopFolderEv + 0x01f3c498 0x40 FileBrowser.o + 0x01f3c498 FileBrowser::PopFolder() + .text._ZN11FileBrowser18UpdateInputFoldersEv + 0x01f3c4d8 0x7f8 FileBrowser.o + 0x01f3c4d8 FileBrowser::UpdateInputFolders() + .text._ZN11FileBrowser11UpdateInputEv + 0x01f3ccd0 0xb0 FileBrowser.o + 0x01f3ccd0 FileBrowser::UpdateInput() + .text 0x01f3cd80 0x0 DiskCaddy.o + .text._ZN9DiskCaddy7DisplayEv + 0x01f3cd80 0x178 DiskCaddy.o + 0x01f3cd80 DiskCaddy::Display() + .text._ZN9DiskCaddy17ShowSelectedImageEj + 0x01f3cef8 0x74 DiskCaddy.o + 0x01f3cef8 DiskCaddy::ShowSelectedImage(unsigned int) + .text._ZN9DiskCaddy6UpdateEv + 0x01f3cf6c 0xe0 DiskCaddy.o + 0x01f3cf6c DiskCaddy::Update() + .text._ZNSt6vectorI9DiskImageSaIS0_EE19_M_emplace_back_auxIJRKS0_EEEvDpOT_ + 0x01f3d04c 0x160 DiskCaddy.o + 0x01f3d04c void std::vector >::_M_emplace_back_aux(DiskImage const&) + 0x01f3d04c void std::vector >::_M_emplace_back_aux(DiskImage const&) + .text._ZN9DiskCaddy9InsertNBZEPK7FILINFOPhjb + 0x01f3d1ac 0xd4 DiskCaddy.o + 0x01f3d1ac DiskCaddy::InsertNBZ(FILINFO const*, unsigned char*, unsigned int, bool) + .text._ZN9DiskCaddy9InsertD64EPK7FILINFOPhjb + 0x01f3d280 0xd8 DiskCaddy.o + 0x01f3d280 DiskCaddy::InsertD64(FILINFO const*, unsigned char*, unsigned int, bool) + .text._ZN9DiskCaddy9InsertG64EPK7FILINFOPhjb + 0x01f3d358 0xd8 DiskCaddy.o + 0x01f3d358 DiskCaddy::InsertG64(FILINFO const*, unsigned char*, unsigned int, bool) + .text._ZN9DiskCaddy9InsertNIBEPK7FILINFOPhjb + 0x01f3d430 0xd4 DiskCaddy.o + 0x01f3d430 DiskCaddy::InsertNIB(FILINFO const*, unsigned char*, unsigned int, bool) + .text._ZN9DiskCaddy6InsertEPK7FILINFOb + 0x01f3d504 0x1c8 DiskCaddy.o + 0x01f3d504 DiskCaddy::Insert(FILINFO const*, bool) + .text 0x01f3d6cc 0x0 ROMs.o + .text._ZN4ROMs20ResetCurrentROMIndexEv + 0x01f3d6cc 0x24 ROMs.o + 0x01f3d6cc ROMs::ResetCurrentROMIndex() + .text._ZN4ROMs9SelectROMEPKc + 0x01f3d6f0 0x60 ROMs.o + 0x01f3d6f0 ROMs::SelectROM(char const*) + .text 0x01f3d750 0x0 InputMappings.o + .text._ZN9SingletonI13InputMappingsED2Ev + 0x01f3d750 0x4 InputMappings.o + 0x01f3d750 Singleton::~Singleton() + 0x01f3d750 Singleton::~Singleton() + .text._ZN13InputMappingsD2Ev + 0x01f3d754 0x4 InputMappings.o + 0x01f3d754 InputMappings::~InputMappings() + 0x01f3d754 InputMappings::~InputMappings() + .text._ZN13InputMappingsD0Ev + 0x01f3d758 0x14 InputMappings.o + 0x01f3d758 InputMappings::~InputMappings() + .text._ZN9SingletonI13InputMappingsED0Ev + 0x01f3d76c 0x14 InputMappings.o + 0x01f3d76c Singleton::~Singleton() + .text._ZN13InputMappingsC2Ev + 0x01f3d780 0x10 InputMappings.o + 0x01f3d780 InputMappings::InputMappings() + 0x01f3d780 InputMappings::InputMappings() + .text._ZN13InputMappings22CheckButtonsBrowseModeEv + 0x01f3d790 0xf0 InputMappings.o + 0x01f3d790 InputMappings::CheckButtonsBrowseMode() + .text._ZN13InputMappings25CheckButtonsEmulationModeEv + 0x01f3d880 0x9c InputMappings.o + 0x01f3d880 InputMappings::CheckButtonsEmulationMode() + *fill* 0x01f3d91c 0x4 00000000 + .text._ZN13InputMappings23CheckKeyboardBrowseModeEv + 0x01f3d920 0x970 InputMappings.o + 0x01f3d920 InputMappings::CheckKeyboardBrowseMode() + .text._ZN13InputMappings26CheckKeyboardEmulationModeEjj + 0x01f3e290 0x1d8 InputMappings.o + 0x01f3e290 InputMappings::CheckKeyboardEmulationMode(unsigned int, unsigned int) + .text 0x01f3e468 0x0 xga_font_data.o + .text 0x01f3e468 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-abs.o) + .text.abs 0x01f3e468 0xc C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-abs.o) + 0x01f3e468 abs + .text 0x01f3e474 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-aeabi_atexit.o) + .text.__aeabi_atexit + 0x01f3e474 0x1c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-aeabi_atexit.o) + 0x01f3e474 __aeabi_atexit + .text 0x01f3e490 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-cxa_atexit.o) + .text.__cxa_atexit + 0x01f3e490 0x20 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-cxa_atexit.o) + 0x01f3e490 __cxa_atexit + .text 0x01f3e4b0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-init.o) + .text.__libc_init_array + 0x01f3e4b0 0x80 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-init.o) + 0x01f3e4b0 __libc_init_array + .text 0x01f3e530 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isdigit.o) + .text.isdigit 0x01f3e530 0x1c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isdigit.o) + 0x01f3e530 isdigit + .text 0x01f3e54c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isspace.o) + .text.isspace 0x01f3e54c 0x1c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isspace.o) + 0x01f3e54c isspace + .text 0x01f3e568 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-malloc.o) + .text.malloc 0x01f3e568 0x20 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-malloc.o) + 0x01f3e568 malloc + .text.free 0x01f3e588 0x20 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-malloc.o) + 0x01f3e588 free + .text 0x01f3e5a8 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) + .text._malloc_r + 0x01f3e5a8 0x7a8 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) + 0x01f3e5a8 _malloc_r + .text 0x01f3ed50 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memcmp.o) + .text.memcmp 0x01f3ed50 0xb0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memcmp.o) + 0x01f3ed50 memcmp + .text 0x01f3ee00 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memcpy-stub.o) + .text.memcpy 0x01f3ee00 0xf0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memcpy-stub.o) + 0x01f3ee00 memcpy + .text 0x01f3eef0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memmove.o) + .text.memmove 0x01f3eef0 0x12c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memmove.o) + 0x01f3eef0 memmove + .text 0x01f3f01c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memset.o) + .text.memset 0x01f3f01c 0xf4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memset.o) + 0x01f3f01c memset + .text 0x01f3f110 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mlock.o) + .text.__malloc_lock + 0x01f3f110 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mlock.o) + 0x01f3f110 __malloc_lock + .text.__malloc_unlock + 0x01f3f114 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mlock.o) + 0x01f3f114 __malloc_unlock + .text 0x01f3f118 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-printf.o) + .text._printf_r + 0x01f3f118 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-printf.o) + 0x01f3f118 _printf_r + .text.printf 0x01f3f14c 0x40 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-printf.o) + 0x01f3f14c printf + .text 0x01f3f18c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-rand.o) + .text.srand 0x01f3f18c 0x1c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-rand.o) + 0x01f3f18c srand + .text.rand 0x01f3f1a8 0x54 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-rand.o) + 0x01f3f1a8 rand + .text 0x01f3f1fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-realloc.o) + .text.realloc 0x01f3f1fc 0x24 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-realloc.o) + 0x01f3f1fc realloc + .text 0x01f3f220 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reallocr.o) + .text._realloc_r + 0x01f3f220 0x580 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reallocr.o) + 0x01f3f220 _realloc_r + .text 0x01f3f7a0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reent.o) + .text.cleanup_glue + 0x01f3f7a0 0x2c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reent.o) + 0x01f3f7a0 cleanup_glue + .text._reclaim_reent + 0x01f3f7cc 0xf4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reent.o) + 0x01f3f7cc _reclaim_reent + .text 0x01f3f8c0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-sbrkr.o) + .text._sbrk_r 0x01f3f8c0 0x44 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-sbrkr.o) + 0x01f3f8c0 _sbrk_r + .text 0x01f3f904 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-snprintf.o) + .text._snprintf_r + 0x01f3f904 0xd8 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-snprintf.o) + 0x01f3f904 _snprintf_r + .text.snprintf + 0x01f3f9dc 0xe8 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-snprintf.o) + 0x01f3f9dc snprintf + .text 0x01f3fac4 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-sprintf.o) + .text._sprintf_r + 0x01f3fac4 0x64 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-sprintf.o) + 0x01f3fac4 _sprintf_r + .text.sprintf 0x01f3fb28 0x74 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-sprintf.o) + 0x01f3fb28 sprintf + .text 0x01f3fb9c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcasecmp.o) + .text.strcasecmp + 0x01f3fb9c 0x74 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcasecmp.o) + 0x01f3fb9c strcasecmp + .text 0x01f3fc10 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcat.o) + .text.strcat 0x01f3fc10 0x84 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcat.o) + 0x01f3fc10 strcat + .text 0x01f3fc94 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strchr.o) + .text.strchr 0x01f3fc94 0x168 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strchr.o) + 0x01f3fc94 strchr + .text 0x01f3fdfc 0x224 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcmp.o) + 0x01f3fdfc strcmp + .text 0x01f40020 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcpy.o) + .text.strcpy 0x01f40020 0xf0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcpy.o) + 0x01f40020 strcpy + .text 0x01f40110 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strlen-stub.o) + .text.strlen 0x01f40110 0x60 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strlen-stub.o) + 0x01f40110 strlen + .text 0x01f40170 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strncasecmp.o) + .text.strncasecmp + 0x01f40170 0x94 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strncasecmp.o) + 0x01f40170 strncasecmp + .text 0x01f40204 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strncpy.o) + .text.strncpy 0x01f40204 0xe4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strncpy.o) + 0x01f40204 strncpy + .text 0x01f402e8 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strrchr.o) + .text.strrchr 0x01f402e8 0x54 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strrchr.o) + 0x01f402e8 strrchr + .text 0x01f4033c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strstr.o) + .text.critical_factorization + 0x01f4033c 0x11c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strstr.o) + .text.two_way_long_needle + 0x01f40458 0x394 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strstr.o) + .text.strstr 0x01f407ec 0x37c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strstr.o) + 0x01f407ec strstr + .text 0x01f40b68 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfprintf.o) + .text._svfprintf_r + 0x01f40b68 0x2268 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfprintf.o) + 0x01f40b68 _svfprintf_r + .text 0x01f42dd0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-toupper.o) + .text.toupper 0x01f42dd0 0x24 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-toupper.o) + 0x01f42dd0 toupper + .text 0x01f42df4 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) + *fill* 0x01f42df4 0x4 00000000 + .text._vfprintf_r + 0x01f42df8 0x222c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) + 0x01f42df8 _vfprintf_r + .text.vfprintf + 0x01f45024 0x1c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) + 0x01f45024 vfprintf + .text.__sbprintf + 0x01f45040 0xac C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) + .text 0x01f450ec 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vprintf.o) + .text.vprintf 0x01f450ec 0x2c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vprintf.o) + 0x01f450ec vprintf + .text._vprintf_r + 0x01f45118 0x1c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vprintf.o) + 0x01f45118 _vprintf_r + .text 0x01f45134 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wsetup.o) + .text.__swsetup_r + 0x01f45134 0x164 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wsetup.o) + 0x01f45134 __swsetup_r + .text 0x01f45298 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-__atexit.o) + .text.__register_exitproc + 0x01f45298 0xe0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-__atexit.o) + 0x01f45298 __register_exitproc + .text 0x01f45378 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-ctype_.o) + .text 0x01f45378 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-dtoa.o) + .text.quorem 0x01f45378 0x1d8 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-dtoa.o) + .text._dtoa_r 0x01f45550 0x12e8 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-dtoa.o) + 0x01f45550 _dtoa_r + .text 0x01f46838 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fflush.o) + .text.__sflush_r + 0x01f46838 0x240 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fflush.o) + 0x01f46838 __sflush_r + .text._fflush_r + 0x01f46a78 0x54 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fflush.o) + 0x01f46a78 _fflush_r + .text.fflush 0x01f46acc 0x38 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fflush.o) + 0x01f46acc fflush + .text 0x01f46b04 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + .text.__fp_unlock + 0x01f46b04 0x8 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + .text._cleanup_r + 0x01f46b0c 0x18 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + 0x01f46b0c _cleanup_r + .text.__sinit.part.1 + 0x01f46b24 0x160 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + .text.__fp_lock + 0x01f46c84 0x8 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + .text.__sfmoreglue + 0x01f46c8c 0x50 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + 0x01f46c8c __sfmoreglue + .text.__sfp 0x01f46cdc 0xec C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + 0x01f46cdc __sfp + .text._cleanup + 0x01f46dc8 0x24 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + 0x01f46dc8 _cleanup + .text.__sinit 0x01f46dec 0x10 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + 0x01f46dec __sinit + .text.__sfp_lock_acquire + 0x01f46dfc 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + 0x01f46dfc __sfp_lock_acquire + .text.__sfp_lock_release + 0x01f46e00 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + 0x01f46e00 __sfp_lock_release + .text.__sinit_lock_acquire + 0x01f46e04 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + 0x01f46e04 __sinit_lock_acquire + .text.__sinit_lock_release + 0x01f46e08 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + 0x01f46e08 __sinit_lock_release + .text.__fp_lock_all + 0x01f46e0c 0x24 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + 0x01f46e0c __fp_lock_all + .text.__fp_unlock_all + 0x01f46e30 0x24 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + 0x01f46e30 __fp_unlock_all + .text 0x01f46e54 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-freer.o) + .text._malloc_trim_r + 0x01f46e54 0x100 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-freer.o) + 0x01f46e54 _malloc_trim_r + .text._free_r 0x01f46f54 0x2ec C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-freer.o) + 0x01f46f54 _free_r + .text 0x01f47240 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fwalk.o) + .text._fwalk 0x01f47240 0x84 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fwalk.o) + 0x01f47240 _fwalk + .text._fwalk_reent + 0x01f472c4 0x8c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fwalk.o) + 0x01f472c4 _fwalk_reent + .text 0x01f47350 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-impure.o) + .text 0x01f47350 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + .text._setlocale_r + 0x01f47350 0x74 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + 0x01f47350 _setlocale_r + .text.__locale_charset + 0x01f473c4 0xc C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + 0x01f473c4 __locale_charset + .text.__locale_mb_cur_max + 0x01f473d0 0x10 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + 0x01f473d0 __locale_mb_cur_max + .text.__locale_msgcharset + 0x01f473e0 0xc C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + 0x01f473e0 __locale_msgcharset + .text.__locale_cjk_lang + 0x01f473ec 0x8 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + 0x01f473ec __locale_cjk_lang + .text._localeconv_r + 0x01f473f4 0xc C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + 0x01f473f4 _localeconv_r + .text.setlocale + 0x01f47400 0x18 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + 0x01f47400 setlocale + .text.localeconv + 0x01f47418 0xc C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + 0x01f47418 localeconv + .text 0x01f47424 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-makebuf.o) + .text.__swhatbuf_r + 0x01f47424 0x94 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-makebuf.o) + 0x01f47424 __swhatbuf_r + .text.__smakebuf_r + 0x01f474b8 0xe8 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-makebuf.o) + 0x01f474b8 __smakebuf_r + .text 0x01f475a0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memchr-stub.o) + .text.memchr 0x01f475a0 0x114 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memchr-stub.o) + 0x01f475a0 memchr + .text 0x01f476b4 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + .text._Balloc 0x01f476b4 0x90 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f476b4 _Balloc + .text._Bfree 0x01f47744 0x1c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f47744 _Bfree + .text.__multadd + 0x01f47760 0xdc C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f47760 __multadd + .text.__s2b 0x01f4783c 0xe8 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f4783c __s2b + .text.__hi0bits + 0x01f47924 0x5c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f47924 __hi0bits + .text.__lo0bits + 0x01f47980 0x94 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f47980 __lo0bits + .text.__i2b 0x01f47a14 0x24 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f47a14 __i2b + .text.__multiply + 0x01f47a38 0x1f0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f47a38 __multiply + .text.__pow5mult + 0x01f47c28 0x104 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f47c28 __pow5mult + .text.__lshift + 0x01f47d2c 0xf4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f47d2c __lshift + .text.__mcmp 0x01f47e20 0x64 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f47e20 __mcmp + .text.__mdiff 0x01f47e84 0x1b0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f47e84 __mdiff + .text.__ulp 0x01f48034 0x78 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f48034 __ulp + .text.__b2d 0x01f480ac 0xdc C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f480ac __b2d + .text.__d2b 0x01f48188 0x10c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f48188 __d2b + .text.__ratio 0x01f48294 0x84 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f48294 __ratio + .text._mprec_log10 + 0x01f48318 0x44 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f48318 _mprec_log10 + .text.__copybits + 0x01f4835c 0x70 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f4835c __copybits + .text.__any_on + 0x01f483cc 0x80 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f483cc __any_on + .text 0x01f4844c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-stdio.o) + .text.__sread 0x01f4844c 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-stdio.o) + 0x01f4844c __sread + .text.__seofread + 0x01f48480 0x8 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-stdio.o) + 0x01f48480 __seofread + .text.__swrite + 0x01f48488 0x58 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-stdio.o) + 0x01f48488 __swrite + .text.__sseek 0x01f484e0 0x30 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-stdio.o) + 0x01f484e0 __sseek + .text.__sclose + 0x01f48510 0x14 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-stdio.o) + 0x01f48510 __sclose + .text 0x01f48524 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfiprintf.o) + .text.__ssprint_r + 0x01f48524 0x1b0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfiprintf.o) + 0x01f48524 __ssprint_r + .text._svfiprintf_r + 0x01f486d4 0x12b0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfiprintf.o) + 0x01f486d4 _svfiprintf_r + .text 0x01f49984 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) + .text.__sprint_r.part.0 + 0x01f49984 0xac C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) + .text.__sprint_r + 0x01f49a30 0x18 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) + 0x01f49a30 __sprint_r + .text._vfiprintf_r + 0x01f49a48 0x1560 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) + 0x01f49a48 _vfiprintf_r + .text.vfiprintf + 0x01f4afa8 0x1c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) + 0x01f4afa8 vfiprintf + .text.__sbprintf + 0x01f4afc4 0xac C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) + .text 0x01f4b070 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-writer.o) + .text._write_r + 0x01f4b070 0x48 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-writer.o) + 0x01f4b070 _write_r + .text 0x01f4b0b8 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-callocr.o) + .text._calloc_r + 0x01f4b0b8 0x98 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-callocr.o) + 0x01f4b0b8 _calloc_r + .text 0x01f4b150 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-closer.o) + .text._close_r + 0x01f4b150 0x3c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-closer.o) + 0x01f4b150 _close_r + .text 0x01f4b18c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fclose.o) + .text._fclose_r + 0x01f4b18c 0xfc C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fclose.o) + 0x01f4b18c _fclose_r + .text.fclose 0x01f4b288 0x14 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fclose.o) + 0x01f4b288 fclose + .text 0x01f4b29c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fputwc.o) + .text.__fputwc + 0x01f4b29c 0x110 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fputwc.o) + 0x01f4b29c __fputwc + .text._fputwc_r + 0x01f4b3ac 0x20 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fputwc.o) + 0x01f4b3ac _fputwc_r + .text.fputwc 0x01f4b3cc 0x68 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fputwc.o) + 0x01f4b3cc fputwc + .text 0x01f4b434 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fstatr.o) + .text._fstat_r + 0x01f4b434 0x44 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fstatr.o) + 0x01f4b434 _fstat_r + .text 0x01f4b478 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fvwrite.o) + .text.__sfvwrite_r + 0x01f4b478 0x4c8 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fvwrite.o) + 0x01f4b478 __sfvwrite_r + .text 0x01f4b940 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isattyr.o) + .text._isatty_r + 0x01f4b940 0x3c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isattyr.o) + 0x01f4b940 _isatty_r + .text 0x01f4b97c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-lseekr.o) + .text._lseek_r + 0x01f4b97c 0x48 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-lseekr.o) + 0x01f4b97c _lseek_r + .text 0x01f4b9c4 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-readr.o) + .text._read_r 0x01f4b9c4 0x48 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-readr.o) + 0x01f4b9c4 _read_r + .text 0x01f4ba0c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wbuf.o) + .text.__swbuf_r + 0x01f4ba0c 0x130 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wbuf.o) + 0x01f4ba0c __swbuf_r + .text.__swbuf 0x01f4bb3c 0x18 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wbuf.o) + 0x01f4bb3c __swbuf + .text 0x01f4bb54 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wcrtomb.o) + .text._wcrtomb_r + 0x01f4bb54 0x94 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wcrtomb.o) + 0x01f4bb54 _wcrtomb_r + .text.wcrtomb 0x01f4bbe8 0x9c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wcrtomb.o) + 0x01f4bbe8 wcrtomb + .text 0x01f4bc84 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wctomb_r.o) + .text.__ascii_wctomb + 0x01f4bc84 0x28 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wctomb_r.o) + 0x01f4bc84 __ascii_wctomb + .text._wctomb_r + 0x01f4bcac 0x50 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wctomb_r.o) + 0x01f4bcac _wctomb_r + .text 0x01f4bcfc 0x114 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivsi3.o) + 0x01f4bcfc __aeabi_uidiv + 0x01f4bcfc __udivsi3 + 0x01f4bdf0 __aeabi_uidivmod + .text 0x01f4be10 0x148 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_divsi3.o) + 0x01f4be10 __divsi3 + 0x01f4be10 __aeabi_idiv + 0x01f4bf38 __aeabi_idivmod + .text 0x01f4bf58 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_dvmd_tls.o) + 0x01f4bf58 __aeabi_idiv0 + 0x01f4bf58 __aeabi_ldiv0 + .text 0x01f4bf5c 0x3c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_aeabi_uldivmod.o) + 0x01f4bf5c __aeabi_uldivmod + .text 0x01f4bf98 0x12c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivmoddi4.o) + 0x01f4bf98 __udivmoddi4 + .text 0x01f4c0c4 0x28 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_clzdi2.o) + 0x01f4c0c4 __clzdi2 + .text 0x01f4c0ec 0x48 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_clzsi2.o) + 0x01f4c0ec __clzsi2 + .text 0x01f4c134 0x0 uspi/lib/libuspi.a(uspilibrary.o) + .text.USPiInitialize + 0x01f4c134 0x214 uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c134 USPiInitialize + .text.USPiKeyboardAvailable + 0x01f4c348 0x1c uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c348 USPiKeyboardAvailable + .text.USPiKeyboardRegisterKeyPressedHandler + 0x01f4c364 0x18 uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c364 USPiKeyboardRegisterKeyPressedHandler + .text.USPiKeyboardRegisterShutdownHandler + 0x01f4c37c 0x18 uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c37c USPiKeyboardRegisterShutdownHandler + .text.USPiKeyboardRegisterKeyStatusHandlerRaw + 0x01f4c394 0x18 uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c394 USPiKeyboardRegisterKeyStatusHandlerRaw + .text.USPiMouseAvailable + 0x01f4c3ac 0x1c uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c3ac USPiMouseAvailable + .text.USPiMouseRegisterStatusHandler + 0x01f4c3c8 0x18 uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c3c8 USPiMouseRegisterStatusHandler + .text.USPiMassStorageDeviceAvailable + 0x01f4c3e0 0x5c uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c3e0 USPiMassStorageDeviceAvailable + .text.USPiMassStorageDeviceRead + 0x01f4c43c 0x74 uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c43c USPiMassStorageDeviceRead + .text.USPiMassStorageDeviceWrite + 0x01f4c4b0 0x74 uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c4b0 USPiMassStorageDeviceWrite + .text.USPiMassStorageDeviceGetCapacity + 0x01f4c524 0x30 uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c524 USPiMassStorageDeviceGetCapacity + .text.USPiEthernetAvailable + 0x01f4c554 0x30 uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c554 USPiEthernetAvailable + .text.USPiGetMACAddress + 0x01f4c584 0x44 uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c584 USPiGetMACAddress + .text.USPiSendFrame + 0x01f4c5c8 0x4c uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c5c8 USPiSendFrame + .text.USPiReceiveFrame + 0x01f4c614 0x4c uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c614 USPiReceiveFrame + .text.USPiGamePadAvailable + 0x01f4c660 0x5c uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c660 USPiGamePadAvailable + .text.USPiGamePadRegisterStatusHandler + 0x01f4c6bc 0x40 uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c6bc USPiGamePadRegisterStatusHandler + .text.USPiGamePadGetStatus + 0x01f4c6fc 0x44 uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c6fc USPiGamePadGetStatus + .text.USPiMIDIAvailable + 0x01f4c740 0x1c uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c740 USPiMIDIAvailable + .text.USPiMIDIRegisterPacketHandler + 0x01f4c75c 0x18 uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c75c USPiMIDIRegisterPacketHandler + .text.USPiDeviceGetInformation + 0x01f4c774 0x15c uspi/lib/libuspi.a(uspilibrary.o) + 0x01f4c774 USPiDeviceGetInformation + .text 0x01f4c8d0 0x0 uspi/lib/libuspi.a(dwhcidevice.o) + .text.DWHCIDeviceCompletionRoutine + 0x01f4c8d0 0xc uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4c8d0 DWHCIDeviceCompletionRoutine + .text.DWHCIDevice + 0x01f4c8dc 0x68 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4c8dc DWHCIDevice + .text._DWHCIDevice + 0x01f4c944 0x8 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4c944 _DWHCIDevice + .text.DWHCIDeviceInitHost + 0x01f4c94c 0x314 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4c94c DWHCIDeviceInitHost + .text.DWHCIDeviceEnableRootPort + 0x01f4cc60 0xcc uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4cc60 DWHCIDeviceEnableRootPort + .text.DWHCIDeviceReset + 0x01f4cd2c 0xb8 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4cd2c DWHCIDeviceReset + .text.DWHCIDeviceInitCore + 0x01f4cde4 0x1f4 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4cde4 DWHCIDeviceInitCore + .text.DWHCIDeviceInitialize + 0x01f4cfd8 0x1f4 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4cfd8 DWHCIDeviceInitialize + .text.DWHCIDeviceEnableGlobalInterrupts + 0x01f4d1cc 0x44 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4d1cc DWHCIDeviceEnableGlobalInterrupts + .text.DWHCIDeviceEnableCommonInterrupts + 0x01f4d210 0x38 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4d210 DWHCIDeviceEnableCommonInterrupts + .text.DWHCIDeviceEnableHostInterrupts + 0x01f4d248 0x78 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4d248 DWHCIDeviceEnableHostInterrupts + .text.DWHCIDeviceEnableChannelInterrupt + 0x01f4d2c0 0x54 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4d2c0 DWHCIDeviceEnableChannelInterrupt + .text.DWHCIDeviceDisableChannelInterrupt + 0x01f4d314 0x54 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4d314 DWHCIDeviceDisableChannelInterrupt + .text.DWHCIDeviceFlushTxFIFO + 0x01f4d368 0x94 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4d368 DWHCIDeviceFlushTxFIFO + .text.DWHCIDeviceFlushRxFIFO + 0x01f4d3fc 0x78 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4d3fc DWHCIDeviceFlushRxFIFO + .text.DWHCIDeviceStartChannel + 0x01f4d474 0x37c uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4d474 DWHCIDeviceStartChannel + .text.DWHCIDeviceStartTransaction + 0x01f4d7f0 0xd0 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4d7f0 DWHCIDeviceStartTransaction + .text.DWHCIDeviceTimerHandler + 0x01f4d8c0 0x68 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4d8c0 DWHCIDeviceTimerHandler + .text.DWHCIDeviceTransferStageAsync + 0x01f4d928 0x1ec uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4d928 DWHCIDeviceTransferStageAsync + .text.DWHCIDeviceSubmitAsyncRequest + 0x01f4db14 0x44 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4db14 DWHCIDeviceSubmitAsyncRequest + .text.DWHCIDeviceTransferStage + 0x01f4db58 0x70 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4db58 DWHCIDeviceTransferStage + .text.DWHCIDeviceSubmitBlockingRequest + 0x01f4dbc8 0x360 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4dbc8 DWHCIDeviceSubmitBlockingRequest + .text.DWHCIDeviceControlMessage + 0x01f4df28 0xa0 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4df28 DWHCIDeviceControlMessage + .text.DWHCIDeviceTransfer + 0x01f4dfc8 0x58 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4dfc8 DWHCIDeviceTransfer + .text.DWHCIDeviceGetDescriptor + 0x01f4e020 0xac uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4e020 DWHCIDeviceGetDescriptor + .text.DWHCIDeviceSetAddress + 0x01f4e0cc 0xc4 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4e0cc DWHCIDeviceSetAddress + .text.DWHCIDeviceSetConfiguration + 0x01f4e190 0xc4 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4e190 DWHCIDeviceSetConfiguration + .text.DWHCIDeviceChannelInterruptHandler + 0x01f4e254 0x4d8 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4e254 DWHCIDeviceChannelInterruptHandler + .text.DWHCIDeviceInterruptHandler + 0x01f4e72c 0xf8 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4e72c DWHCIDeviceInterruptHandler + .text.DWHCIDeviceAllocateChannel + 0x01f4e824 0x74 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4e824 DWHCIDeviceAllocateChannel + .text.DWHCIDeviceFreeChannel + 0x01f4e898 0x28 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4e898 DWHCIDeviceFreeChannel + .text.DWHCIDeviceWaitForBit + 0x01f4e8c0 0x5c uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4e8c0 DWHCIDeviceWaitForBit + .text.DWHCIDeviceGetPortSpeed + 0x01f4e91c 0x4c uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4e91c DWHCIDeviceGetPortSpeed + .text.DWHCIDeviceOvercurrentDetected + 0x01f4e968 0x4c uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4e968 DWHCIDeviceOvercurrentDetected + .text.DWHCIDeviceDisableRootPort + 0x01f4e9b4 0x44 uspi/lib/libuspi.a(dwhcidevice.o) + 0x01f4e9b4 DWHCIDeviceDisableRootPort + .text 0x01f4e9f8 0x0 uspi/lib/libuspi.a(dwhciregister.o) + .text.DWHCIRegister + 0x01f4e9f8 0x10 uspi/lib/libuspi.a(dwhciregister.o) + 0x01f4e9f8 DWHCIRegister + .text.DWHCIRegister2 + 0x01f4ea08 0x10 uspi/lib/libuspi.a(dwhciregister.o) + 0x01f4ea08 DWHCIRegister2 + .text._DWHCIRegister + 0x01f4ea18 0xc uspi/lib/libuspi.a(dwhciregister.o) + 0x01f4ea18 _DWHCIRegister + .text.DWHCIRegisterRead + 0x01f4ea24 0x1c uspi/lib/libuspi.a(dwhciregister.o) + 0x01f4ea24 DWHCIRegisterRead + .text.DWHCIRegisterWrite + 0x01f4ea40 0x10 uspi/lib/libuspi.a(dwhciregister.o) + 0x01f4ea40 DWHCIRegisterWrite + .text.DWHCIRegisterGet + 0x01f4ea50 0x8 uspi/lib/libuspi.a(dwhciregister.o) + 0x01f4ea50 DWHCIRegisterGet + .text.DWHCIRegisterSet + 0x01f4ea58 0x10 uspi/lib/libuspi.a(dwhciregister.o) + 0x01f4ea58 DWHCIRegisterSet + .text.DWHCIRegisterIsSet + 0x01f4ea68 0x14 uspi/lib/libuspi.a(dwhciregister.o) + 0x01f4ea68 DWHCIRegisterIsSet + .text.DWHCIRegisterAnd + 0x01f4ea7c 0x10 uspi/lib/libuspi.a(dwhciregister.o) + 0x01f4ea7c DWHCIRegisterAnd + .text.DWHCIRegisterOr + 0x01f4ea8c 0x10 uspi/lib/libuspi.a(dwhciregister.o) + 0x01f4ea8c DWHCIRegisterOr + .text.DWHCIRegisterClearBit + 0x01f4ea9c 0x14 uspi/lib/libuspi.a(dwhciregister.o) + 0x01f4ea9c DWHCIRegisterClearBit + .text.DWHCIRegisterSetBit + 0x01f4eab0 0x14 uspi/lib/libuspi.a(dwhciregister.o) + 0x01f4eab0 DWHCIRegisterSetBit + .text.DWHCIRegisterClearAll + 0x01f4eac4 0x14 uspi/lib/libuspi.a(dwhciregister.o) + 0x01f4eac4 DWHCIRegisterClearAll + .text.DWHCIRegisterSetAll + 0x01f4ead8 0x14 uspi/lib/libuspi.a(dwhciregister.o) + 0x01f4ead8 DWHCIRegisterSetAll + .text 0x01f4eaec 0x0 uspi/lib/libuspi.a(dwhcixferstagedata.o) + .text.DWHCITransferStageData + 0x01f4eaec 0x1d0 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4eaec DWHCITransferStageData + .text._DWHCITransferStageData + 0x01f4ecbc 0x5c uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ecbc _DWHCITransferStageData + .text.DWHCITransferStageDataTransactionComplete + 0x01f4ed18 0xf0 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ed18 DWHCITransferStageDataTransactionComplete + .text.DWHCITransferStageDataSetSplitComplete + 0x01f4ee08 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ee08 DWHCITransferStageDataSetSplitComplete + .text.DWHCITransferStageDataSetState + 0x01f4ee10 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ee10 DWHCITransferStageDataSetState + .text.DWHCITransferStageDataGetState + 0x01f4ee18 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ee18 DWHCITransferStageDataGetState + .text.DWHCITransferStageDataSetSubState + 0x01f4ee20 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ee20 DWHCITransferStageDataSetSubState + .text.DWHCITransferStageDataGetSubState + 0x01f4ee28 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ee28 DWHCITransferStageDataGetSubState + .text.DWHCITransferStageDataBeginSplitCycle + 0x01f4ee30 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ee30 DWHCITransferStageDataBeginSplitCycle + .text.DWHCITransferStageDataGetChannelNumber + 0x01f4ee38 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ee38 DWHCITransferStageDataGetChannelNumber + .text.DWHCITransferStageDataIsPeriodic + 0x01f4ee40 0x24 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ee40 DWHCITransferStageDataIsPeriodic + .text.DWHCITransferStageDataGetDeviceAddress + 0x01f4ee64 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ee64 DWHCITransferStageDataGetDeviceAddress + .text.DWHCITransferStageDataGetEndpointType + 0x01f4ee6c 0x2c uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ee6c DWHCITransferStageDataGetEndpointType + .text.DWHCITransferStageDataGetEndpointNumber + 0x01f4ee98 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ee98 DWHCITransferStageDataGetEndpointNumber + .text.DWHCITransferStageDataGetMaxPacketSize + 0x01f4eea0 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4eea0 DWHCITransferStageDataGetMaxPacketSize + .text.DWHCITransferStageDataGetSpeed + 0x01f4eea8 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4eea8 DWHCITransferStageDataGetSpeed + .text.DWHCITransferStageDataGetPID + 0x01f4eeb0 0x30 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4eeb0 DWHCITransferStageDataGetPID + .text.DWHCITransferStageDataIsDirectionIn + 0x01f4eee0 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4eee0 DWHCITransferStageDataIsDirectionIn + .text.DWHCITransferStageDataIsStatusStage + 0x01f4eee8 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4eee8 DWHCITransferStageDataIsStatusStage + .text.DWHCITransferStageDataGetDMAAddress + 0x01f4eef0 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4eef0 DWHCITransferStageDataGetDMAAddress + .text.DWHCITransferStageDataGetBytesToTransfer + 0x01f4eef8 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4eef8 DWHCITransferStageDataGetBytesToTransfer + .text.DWHCITransferStageDataGetPacketsToTransfer + 0x01f4ef00 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ef00 DWHCITransferStageDataGetPacketsToTransfer + .text.DWHCITransferStageDataIsSplit + 0x01f4ef08 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ef08 DWHCITransferStageDataIsSplit + .text.DWHCITransferStageDataIsSplitComplete + 0x01f4ef10 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ef10 DWHCITransferStageDataIsSplitComplete + .text.DWHCITransferStageDataGetHubAddress + 0x01f4ef18 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ef18 DWHCITransferStageDataGetHubAddress + .text.DWHCITransferStageDataGetHubPortAddress + 0x01f4ef20 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ef20 DWHCITransferStageDataGetHubPortAddress + .text.DWHCITransferStageDataGetSplitPosition + 0x01f4ef28 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ef28 DWHCITransferStageDataGetSplitPosition + .text.DWHCITransferStageDataGetStatusMask + 0x01f4ef30 0x38 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ef30 DWHCITransferStageDataGetStatusMask + .text.DWHCITransferStageDataGetTransactionStatus + 0x01f4ef68 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ef68 DWHCITransferStageDataGetTransactionStatus + .text.DWHCITransferStageDataIsStageComplete + 0x01f4ef70 0x10 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ef70 DWHCITransferStageDataIsStageComplete + .text.DWHCITransferStageDataGetResultLen + 0x01f4ef80 0x14 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ef80 DWHCITransferStageDataGetResultLen + .text.DWHCITransferStageDataGetURB + 0x01f4ef94 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ef94 DWHCITransferStageDataGetURB + .text.DWHCITransferStageDataGetFrameScheduler + 0x01f4ef9c 0x8 uspi/lib/libuspi.a(dwhcixferstagedata.o) + 0x01f4ef9c DWHCITransferStageDataGetFrameScheduler + .text 0x01f4efa4 0x0 uspi/lib/libuspi.a(usbdevice.o) + .text.USBDeviceConfigure + 0x01f4efa4 0x64 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4efa4 USBDeviceConfigure + .text.USBDevice + 0x01f4f008 0x70 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f008 USBDevice + .text.USBDeviceCopy + 0x01f4f078 0xf4 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f078 USBDeviceCopy + .text._USBDevice + 0x01f4f16c 0x98 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f16c _USBDevice + .text.USBDeviceInitialize + 0x01f4f204 0x304 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f204 USBDeviceInitialize + .text.USBDeviceGetName + 0x01f4f508 0xf4 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f508 USBDeviceGetName + .text.USBDeviceGetAddress + 0x01f4f5fc 0x8 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f5fc USBDeviceGetAddress + .text.USBDeviceGetSpeed + 0x01f4f604 0x8 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f604 USBDeviceGetSpeed + .text.USBDeviceGetHubAddress + 0x01f4f60c 0x8 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f60c USBDeviceGetHubAddress + .text.USBDeviceGetHubPortNumber + 0x01f4f614 0x8 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f614 USBDeviceGetHubPortNumber + .text.USBDeviceGetEndpoint0 + 0x01f4f61c 0x8 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f61c USBDeviceGetEndpoint0 + .text.USBDeviceGetHost + 0x01f4f624 0x8 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f624 USBDeviceGetHost + .text.USBDeviceGetDeviceDescriptor + 0x01f4f62c 0x8 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f62c USBDeviceGetDeviceDescriptor + .text.USBDeviceGetConfigurationDescriptor + 0x01f4f634 0x8 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f634 USBDeviceGetConfigurationDescriptor + .text.USBDeviceGetDescriptor + 0x01f4f63c 0x8 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f63c USBDeviceGetDescriptor + .text.USBDeviceConfigurationError + 0x01f4f644 0x8 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f644 USBDeviceConfigurationError + .text.USBDeviceSetAddress + 0x01f4f64c 0x8 uspi/lib/libuspi.a(usbdevice.o) + 0x01f4f64c USBDeviceSetAddress + .text 0x01f4f654 0x0 uspi/lib/libuspi.a(usbendpoint.o) + .text.USBEndpoint + 0x01f4f654 0x2c uspi/lib/libuspi.a(usbendpoint.o) + 0x01f4f654 USBEndpoint + .text.USBEndpoint2 + 0x01f4f680 0xf8 uspi/lib/libuspi.a(usbendpoint.o) + 0x01f4f680 USBEndpoint2 + .text.USBEndpointCopy + 0x01f4f778 0x3c uspi/lib/libuspi.a(usbendpoint.o) + 0x01f4f778 USBEndpointCopy + .text._USBEndpoint + 0x01f4f7b4 0xc uspi/lib/libuspi.a(usbendpoint.o) + 0x01f4f7b4 _USBEndpoint + .text.USBEndpointGetDevice + 0x01f4f7c0 0x8 uspi/lib/libuspi.a(usbendpoint.o) + 0x01f4f7c0 USBEndpointGetDevice + .text.USBEndpointGetNumber + 0x01f4f7c8 0x8 uspi/lib/libuspi.a(usbendpoint.o) + 0x01f4f7c8 USBEndpointGetNumber + .text.USBEndpointGetType + 0x01f4f7d0 0x8 uspi/lib/libuspi.a(usbendpoint.o) + 0x01f4f7d0 USBEndpointGetType + .text.USBEndpointIsDirectionIn + 0x01f4f7d8 0x8 uspi/lib/libuspi.a(usbendpoint.o) + 0x01f4f7d8 USBEndpointIsDirectionIn + .text.USBEndpointSetMaxPacketSize + 0x01f4f7e0 0x8 uspi/lib/libuspi.a(usbendpoint.o) + 0x01f4f7e0 USBEndpointSetMaxPacketSize + .text.USBEndpointGetMaxPacketSize + 0x01f4f7e8 0x8 uspi/lib/libuspi.a(usbendpoint.o) + 0x01f4f7e8 USBEndpointGetMaxPacketSize + .text.USBEndpointGetInterval + 0x01f4f7f0 0x8 uspi/lib/libuspi.a(usbendpoint.o) + 0x01f4f7f0 USBEndpointGetInterval + .text.USBEndpointGetNextPID + 0x01f4f7f8 0x10 uspi/lib/libuspi.a(usbendpoint.o) + 0x01f4f7f8 USBEndpointGetNextPID + .text.USBEndpointSkipPID + 0x01f4f808 0x54 uspi/lib/libuspi.a(usbendpoint.o) + 0x01f4f808 USBEndpointSkipPID + .text.USBEndpointResetPID + 0x01f4f85c 0xc uspi/lib/libuspi.a(usbendpoint.o) + 0x01f4f85c USBEndpointResetPID + .text 0x01f4f868 0x0 uspi/lib/libuspi.a(usbrequest.o) + .text.USBRequest + 0x01f4f868 0x34 uspi/lib/libuspi.a(usbrequest.o) + 0x01f4f868 USBRequest + .text._USBRequest + 0x01f4f89c 0x18 uspi/lib/libuspi.a(usbrequest.o) + 0x01f4f89c _USBRequest + .text.USBRequestGetEndpoint + 0x01f4f8b4 0x8 uspi/lib/libuspi.a(usbrequest.o) + 0x01f4f8b4 USBRequestGetEndpoint + .text.USBRequestSetStatus + 0x01f4f8bc 0x8 uspi/lib/libuspi.a(usbrequest.o) + 0x01f4f8bc USBRequestSetStatus + .text.USBRequestSetResultLen + 0x01f4f8c4 0x8 uspi/lib/libuspi.a(usbrequest.o) + 0x01f4f8c4 USBRequestSetResultLen + .text.USBRequestGetStatus + 0x01f4f8cc 0x8 uspi/lib/libuspi.a(usbrequest.o) + 0x01f4f8cc USBRequestGetStatus + .text.USBRequestGetResultLength + 0x01f4f8d4 0x8 uspi/lib/libuspi.a(usbrequest.o) + 0x01f4f8d4 USBRequestGetResultLength + .text.USBRequestGetSetupData + 0x01f4f8dc 0x8 uspi/lib/libuspi.a(usbrequest.o) + 0x01f4f8dc USBRequestGetSetupData + .text.USBRequestGetBuffer + 0x01f4f8e4 0x8 uspi/lib/libuspi.a(usbrequest.o) + 0x01f4f8e4 USBRequestGetBuffer + .text.USBRequestGetBufLen + 0x01f4f8ec 0x8 uspi/lib/libuspi.a(usbrequest.o) + 0x01f4f8ec USBRequestGetBufLen + .text.USBRequestSetCompletionRoutine + 0x01f4f8f4 0x10 uspi/lib/libuspi.a(usbrequest.o) + 0x01f4f8f4 USBRequestSetCompletionRoutine + .text.USBRequestCallCompletionRoutine + 0x01f4f904 0x1c uspi/lib/libuspi.a(usbrequest.o) + 0x01f4f904 USBRequestCallCompletionRoutine + .text 0x01f4f920 0x0 uspi/lib/libuspi.a(devicenameservice.o) + .text.DeviceNameService + 0x01f4f920 0x18 uspi/lib/libuspi.a(devicenameservice.o) + 0x01f4f920 DeviceNameService + .text._DeviceNameService + 0x01f4f938 0x58 uspi/lib/libuspi.a(devicenameservice.o) + 0x01f4f938 _DeviceNameService + .text.DeviceNameServiceAddDevice + 0x01f4f990 0x54 uspi/lib/libuspi.a(devicenameservice.o) + 0x01f4f990 DeviceNameServiceAddDevice + .text.DeviceNameServiceGetDevice + 0x01f4f9e4 0x54 uspi/lib/libuspi.a(devicenameservice.o) + 0x01f4f9e4 DeviceNameServiceGetDevice + .text.DeviceNameServiceGet + 0x01f4fa38 0x10 uspi/lib/libuspi.a(devicenameservice.o) + 0x01f4fa38 DeviceNameServiceGet + .text 0x01f4fa48 0x0 uspi/lib/libuspi.a(macaddress.o) + .text.MACAddress + 0x01f4fa48 0xc uspi/lib/libuspi.a(macaddress.o) + 0x01f4fa48 MACAddress + .text.MACAddress2 + 0x01f4fa54 0x20 uspi/lib/libuspi.a(macaddress.o) + 0x01f4fa54 MACAddress2 + .text._MACAddress + 0x01f4fa74 0xc uspi/lib/libuspi.a(macaddress.o) + 0x01f4fa74 _MACAddress + .text.MACAddressIsEqual + 0x01f4fa80 0x20 uspi/lib/libuspi.a(macaddress.o) + 0x01f4fa80 MACAddressIsEqual + .text.MACAddressSet + 0x01f4faa0 0x20 uspi/lib/libuspi.a(macaddress.o) + 0x01f4faa0 MACAddressSet + .text.MACAddressSetBroadcast + 0x01f4fac0 0x24 uspi/lib/libuspi.a(macaddress.o) + 0x01f4fac0 MACAddressSetBroadcast + .text.MACAddressGet + 0x01f4fae4 0x8 uspi/lib/libuspi.a(macaddress.o) + 0x01f4fae4 MACAddressGet + .text.MACAddressCopyTo + 0x01f4faec 0x14 uspi/lib/libuspi.a(macaddress.o) + 0x01f4faec MACAddressCopyTo + .text.MACAddressIsBroadcast + 0x01f4fb00 0x58 uspi/lib/libuspi.a(macaddress.o) + 0x01f4fb00 MACAddressIsBroadcast + .text.MACAddressGetSize + 0x01f4fb58 0x8 uspi/lib/libuspi.a(macaddress.o) + 0x01f4fb58 MACAddressGetSize + .text.MACAddressFormat + 0x01f4fb60 0x48 uspi/lib/libuspi.a(macaddress.o) + 0x01f4fb60 MACAddressFormat + .text 0x01f4fba8 0x0 uspi/lib/libuspi.a(smsc951x.o) + .text.SMSC951xDevice + 0x01f4fba8 0x38 uspi/lib/libuspi.a(smsc951x.o) + 0x01f4fba8 SMSC951xDevice + .text._SMSC951xDevice + 0x01f4fbe0 0x6c uspi/lib/libuspi.a(smsc951x.o) + 0x01f4fbe0 _SMSC951xDevice + .text.SMSC951xDeviceGetMACAddress + 0x01f4fc4c 0x8 uspi/lib/libuspi.a(smsc951x.o) + 0x01f4fc4c SMSC951xDeviceGetMACAddress + .text.SMSC951xDeviceSendFrame + 0x01f4fc54 0x5c uspi/lib/libuspi.a(smsc951x.o) + 0x01f4fc54 SMSC951xDeviceSendFrame + .text.SMSC951xDeviceReceiveFrame + 0x01f4fcb0 0xe8 uspi/lib/libuspi.a(smsc951x.o) + 0x01f4fcb0 SMSC951xDeviceReceiveFrame + .text.SMSC951xDeviceWriteReg + 0x01f4fd98 0x68 uspi/lib/libuspi.a(smsc951x.o) + 0x01f4fd98 SMSC951xDeviceWriteReg + .text.SMSC951xDeviceConfigure + 0x01f4fe00 0x378 uspi/lib/libuspi.a(smsc951x.o) + 0x01f4fe00 SMSC951xDeviceConfigure + .text.SMSC951xDeviceReadReg + 0x01f50178 0x68 uspi/lib/libuspi.a(smsc951x.o) + 0x01f50178 SMSC951xDeviceReadReg + .text 0x01f501e0 0x0 uspi/lib/libuspi.a(lan7800.o) + .text.LAN7800Device + 0x01f501e0 0x38 uspi/lib/libuspi.a(lan7800.o) + 0x01f501e0 LAN7800Device + .text._LAN7800Device + 0x01f50218 0x6c uspi/lib/libuspi.a(lan7800.o) + 0x01f50218 _LAN7800Device + .text.LAN7800DeviceGetMACAddress + 0x01f50284 0x8 uspi/lib/libuspi.a(lan7800.o) + 0x01f50284 LAN7800DeviceGetMACAddress + .text.LAN7800DeviceSendFrame + 0x01f5028c 0x60 uspi/lib/libuspi.a(lan7800.o) + 0x01f5028c LAN7800DeviceSendFrame + .text.LAN7800DeviceReceiveFrame + 0x01f502ec 0xdc uspi/lib/libuspi.a(lan7800.o) + 0x01f502ec LAN7800DeviceReceiveFrame + .text.LAN7800DeviceIsLinkUp + 0x01f503c8 0x210 uspi/lib/libuspi.a(lan7800.o) + 0x01f503c8 LAN7800DeviceIsLinkUp + .text.LAN7800DeviceInitMACAddress + 0x01f505d8 0x1ec uspi/lib/libuspi.a(lan7800.o) + 0x01f505d8 LAN7800DeviceInitMACAddress + .text.LAN7800DeviceInitPHY + 0x01f507c4 0x3d8 uspi/lib/libuspi.a(lan7800.o) + 0x01f507c4 LAN7800DeviceInitPHY + .text.LAN7800DevicePHYWrite + 0x01f50b9c 0x218 uspi/lib/libuspi.a(lan7800.o) + 0x01f50b9c LAN7800DevicePHYWrite + .text.LAN7800DevicePHYRead + 0x01f50db4 0x218 uspi/lib/libuspi.a(lan7800.o) + 0x01f50db4 LAN7800DevicePHYRead + .text.LAN7800DeviceWaitReg + 0x01f50fcc 0xc0 uspi/lib/libuspi.a(lan7800.o) + 0x01f50fcc LAN7800DeviceWaitReg + .text.LAN7800DeviceReadWriteReg + 0x01f5108c 0x100 uspi/lib/libuspi.a(lan7800.o) + 0x01f5108c LAN7800DeviceReadWriteReg + .text.LAN7800DeviceWriteReg + 0x01f5118c 0x94 uspi/lib/libuspi.a(lan7800.o) + 0x01f5118c LAN7800DeviceWriteReg + .text.LAN7800DeviceConfigure + 0x01f51220 0x4f0 uspi/lib/libuspi.a(lan7800.o) + 0x01f51220 LAN7800DeviceConfigure + .text.LAN7800DeviceReadReg + 0x01f51710 0x88 uspi/lib/libuspi.a(lan7800.o) + 0x01f51710 LAN7800DeviceReadReg + .text 0x01f51798 0x0 uspi/lib/libuspi.a(string.o) + .text.String 0x01f51798 0x10 uspi/lib/libuspi.a(string.o) + 0x01f51798 String + .text.String2 0x01f517a8 0x34 uspi/lib/libuspi.a(string.o) + 0x01f517a8 String2 + .text._String 0x01f517dc 0x28 uspi/lib/libuspi.a(string.o) + 0x01f517dc _String + .text.StringGet + 0x01f51804 0x18 uspi/lib/libuspi.a(string.o) + 0x01f51804 StringGet + .text.StringSet + 0x01f5181c 0x48 uspi/lib/libuspi.a(string.o) + 0x01f5181c StringSet + .text.StringGetLength + 0x01f51864 0x10 uspi/lib/libuspi.a(string.o) + 0x01f51864 StringGetLength + .text.StringAppend + 0x01f51874 0x7c uspi/lib/libuspi.a(string.o) + 0x01f51874 StringAppend + .text.StringCompare + 0x01f518f0 0x8 uspi/lib/libuspi.a(string.o) + 0x01f518f0 StringCompare + .text.StringFind + 0x01f518f8 0x44 uspi/lib/libuspi.a(string.o) + 0x01f518f8 StringFind + .text.StringFormatV + 0x01f5193c 0xe40 uspi/lib/libuspi.a(string.o) + 0x01f5193c StringFormatV + .text.StringFormat + 0x01f5277c 0x30 uspi/lib/libuspi.a(string.o) + 0x01f5277c StringFormat + .text.StringPutChar + 0x01f527ac 0x98 uspi/lib/libuspi.a(string.o) + 0x01f527ac StringPutChar + .text.StringPutString + 0x01f52844 0x94 uspi/lib/libuspi.a(string.o) + 0x01f52844 StringPutString + .text.StringReserveSpace + 0x01f528d8 0x68 uspi/lib/libuspi.a(string.o) + 0x01f528d8 StringReserveSpace + .text.ntoa 0x01f52940 0x84 uspi/lib/libuspi.a(string.o) + 0x01f52940 ntoa + .text 0x01f529c4 0x0 uspi/lib/libuspi.a(util.o) + .text.uspi_memset + 0x01f529c4 0x174 uspi/lib/libuspi.a(util.o) + 0x01f529c4 uspi_memset + .text.uspi_memcpy + 0x01f52b38 0x36c uspi/lib/libuspi.a(util.o) + 0x01f52b38 uspi_memcpy + .text.uspi_memcmp + 0x01f52ea4 0x5c uspi/lib/libuspi.a(util.o) + 0x01f52ea4 uspi_memcmp + .text.uspi_strlen + 0x01f52f00 0x28 uspi/lib/libuspi.a(util.o) + 0x01f52f00 uspi_strlen + .text.uspi_strcmp + 0x01f52f28 0x74 uspi/lib/libuspi.a(util.o) + 0x01f52f28 uspi_strcmp + .text.uspi_strcpy + 0x01f52f9c 0x2c uspi/lib/libuspi.a(util.o) + 0x01f52f9c uspi_strcpy + .text.uspi_strncpy + 0x01f52fc8 0x50 uspi/lib/libuspi.a(util.o) + 0x01f52fc8 uspi_strncpy + .text.uspi_strcat + 0x01f53018 0x44 uspi/lib/libuspi.a(util.o) + 0x01f53018 uspi_strcat + .text.uspi_char2int + 0x01f5305c 0x4 uspi/lib/libuspi.a(util.o) + 0x01f5305c uspi_char2int + .text.uspi_le2be16 + 0x01f53060 0xc uspi/lib/libuspi.a(util.o) + 0x01f53060 uspi_le2be16 + .text.uspi_le2be32 + 0x01f5306c 0x8 uspi/lib/libuspi.a(util.o) + 0x01f5306c uspi_le2be32 + .text 0x01f53074 0x0 uspi/lib/libuspi.a(usbmassdevice.o) + .text.USBBulkOnlyMassStorageDevice + 0x01f53074 0x38 uspi/lib/libuspi.a(usbmassdevice.o) + 0x01f53074 USBBulkOnlyMassStorageDevice + .text._USBBulkOnlyMassStorageDevice + 0x01f530ac 0x54 uspi/lib/libuspi.a(usbmassdevice.o) + 0x01f530ac _USBBulkOnlyMassStorageDevice + .text.USBBulkOnlyMassStorageDeviceSeek + 0x01f53100 0x10 uspi/lib/libuspi.a(usbmassdevice.o) + 0x01f53100 USBBulkOnlyMassStorageDeviceSeek + .text.USBBulkOnlyMassStorageDeviceGetCapacity + 0x01f53110 0x8 uspi/lib/libuspi.a(usbmassdevice.o) + 0x01f53110 USBBulkOnlyMassStorageDeviceGetCapacity + .text.USBBulkOnlyMassStorageDeviceTryRead + 0x01f53118 0x280 uspi/lib/libuspi.a(usbmassdevice.o) + 0x01f53118 USBBulkOnlyMassStorageDeviceTryRead + .text.USBBulkOnlyMassStorageDeviceTryWrite + 0x01f53398 0x264 uspi/lib/libuspi.a(usbmassdevice.o) + 0x01f53398 USBBulkOnlyMassStorageDeviceTryWrite + .text.USBBulkOnlyMassStorageDeviceCommand + 0x01f535fc 0x18c uspi/lib/libuspi.a(usbmassdevice.o) + 0x01f535fc USBBulkOnlyMassStorageDeviceCommand + .text.USBBulkOnlyMassStorageDeviceConfigure + 0x01f53788 0x45c uspi/lib/libuspi.a(usbmassdevice.o) + 0x01f53788 USBBulkOnlyMassStorageDeviceConfigure + .text.USBBulkOnlyMassStorageDeviceReset + 0x01f53be4 0x104 uspi/lib/libuspi.a(usbmassdevice.o) + 0x01f53be4 USBBulkOnlyMassStorageDeviceReset + .text.USBBulkOnlyMassStorageDeviceRead + 0x01f53ce8 0x2a4 uspi/lib/libuspi.a(usbmassdevice.o) + 0x01f53ce8 USBBulkOnlyMassStorageDeviceRead + .text.USBBulkOnlyMassStorageDeviceWrite + 0x01f53f8c 0x294 uspi/lib/libuspi.a(usbmassdevice.o) + 0x01f53f8c USBBulkOnlyMassStorageDeviceWrite + .text 0x01f54220 0x0 uspi/lib/libuspi.a(dwhciframeschednper.o) + .text._DWHCIFrameSchedulerNonPeriodic + 0x01f54220 0xc uspi/lib/libuspi.a(dwhciframeschednper.o) + 0x01f54220 _DWHCIFrameSchedulerNonPeriodic + .text.DWHCIFrameSchedulerNonPeriodicStartSplit + 0x01f5422c 0xc uspi/lib/libuspi.a(dwhciframeschednper.o) + 0x01f5422c DWHCIFrameSchedulerNonPeriodicStartSplit + .text.DWHCIFrameSchedulerNonPeriodicWaitForFrame + 0x01f54238 0x4 uspi/lib/libuspi.a(dwhciframeschednper.o) + 0x01f54238 DWHCIFrameSchedulerNonPeriodicWaitForFrame + .text.DWHCIFrameSchedulerNonPeriodicIsOddFrame + 0x01f5423c 0x8 uspi/lib/libuspi.a(dwhciframeschednper.o) + 0x01f5423c DWHCIFrameSchedulerNonPeriodicIsOddFrame + .text.DWHCIFrameSchedulerNonPeriodicCompleteSplit + 0x01f54244 0x54 uspi/lib/libuspi.a(dwhciframeschednper.o) + 0x01f54244 DWHCIFrameSchedulerNonPeriodicCompleteSplit + .text.DWHCIFrameSchedulerNonPeriodicTransactionComplete + 0x01f54298 0xc0 uspi/lib/libuspi.a(dwhciframeschednper.o) + 0x01f54298 DWHCIFrameSchedulerNonPeriodicTransactionComplete + .text.DWHCIFrameSchedulerNonPeriodic + 0x01f54358 0x54 uspi/lib/libuspi.a(dwhciframeschednper.o) + 0x01f54358 DWHCIFrameSchedulerNonPeriodic + .text 0x01f543ac 0x0 uspi/lib/libuspi.a(dwhciframeschedper.o) + .text._DWHCIFrameSchedulerPeriodic + 0x01f543ac 0xc uspi/lib/libuspi.a(dwhciframeschedper.o) + 0x01f543ac _DWHCIFrameSchedulerPeriodic + .text.DWHCIFrameSchedulerPeriodicStartSplit + 0x01f543b8 0x14 uspi/lib/libuspi.a(dwhciframeschedper.o) + 0x01f543b8 DWHCIFrameSchedulerPeriodicStartSplit + .text.DWHCIFrameSchedulerPeriodicIsOddFrame + 0x01f543cc 0xc uspi/lib/libuspi.a(dwhciframeschedper.o) + 0x01f543cc DWHCIFrameSchedulerPeriodicIsOddFrame + .text.DWHCIFrameSchedulerPeriodicWaitForFrame + 0x01f543d8 0x70 uspi/lib/libuspi.a(dwhciframeschedper.o) + 0x01f543d8 DWHCIFrameSchedulerPeriodicWaitForFrame + .text.DWHCIFrameSchedulerPeriodicCompleteSplit + 0x01f54448 0x68 uspi/lib/libuspi.a(dwhciframeschedper.o) + 0x01f54448 DWHCIFrameSchedulerPeriodicCompleteSplit + .text.DWHCIFrameSchedulerPeriodicTransactionComplete + 0x01f544b0 0xb4 uspi/lib/libuspi.a(dwhciframeschedper.o) + 0x01f544b0 DWHCIFrameSchedulerPeriodicTransactionComplete + .text.DWHCIFrameSchedulerPeriodic + 0x01f54564 0x5c uspi/lib/libuspi.a(dwhciframeschedper.o) + 0x01f54564 DWHCIFrameSchedulerPeriodic + .text 0x01f545c0 0x0 uspi/lib/libuspi.a(usbkeyboard.o) + .text.USBKeyboardDeviceConfigure + 0x01f545c0 0x2bc uspi/lib/libuspi.a(usbkeyboard.o) + 0x01f545c0 USBKeyboardDeviceConfigure + .text.USBKeyboardDeviceCompletionRoutine + 0x01f5487c 0x208 uspi/lib/libuspi.a(usbkeyboard.o) + .text.USBKeyboardDevice + 0x01f54a84 0x58 uspi/lib/libuspi.a(usbkeyboard.o) + 0x01f54a84 USBKeyboardDevice + .text._CUSBKeyboardDevice + 0x01f54adc 0x54 uspi/lib/libuspi.a(usbkeyboard.o) + 0x01f54adc _CUSBKeyboardDevice + .text.USBKeyboardDeviceRegisterKeyPressedHandler + 0x01f54b30 0x8 uspi/lib/libuspi.a(usbkeyboard.o) + 0x01f54b30 USBKeyboardDeviceRegisterKeyPressedHandler + .text.USBKeyboardDeviceRegisterSelectConsoleHandler + 0x01f54b38 0x8 uspi/lib/libuspi.a(usbkeyboard.o) + 0x01f54b38 USBKeyboardDeviceRegisterSelectConsoleHandler + .text.USBKeyboardDeviceRegisterShutdownHandler + 0x01f54b40 0x8 uspi/lib/libuspi.a(usbkeyboard.o) + 0x01f54b40 USBKeyboardDeviceRegisterShutdownHandler + .text.USBKeyboardDeviceRegisterKeyStatusHandlerRaw + 0x01f54b48 0x8 uspi/lib/libuspi.a(usbkeyboard.o) + 0x01f54b48 USBKeyboardDeviceRegisterKeyStatusHandlerRaw + .text 0x01f54b50 0x0 uspi/lib/libuspi.a(dwhcirootport.o) + .text.DWHCIRootPort + 0x01f54b50 0xc uspi/lib/libuspi.a(dwhcirootport.o) + 0x01f54b50 DWHCIRootPort + .text._DWHCIRootPort + 0x01f54b5c 0x34 uspi/lib/libuspi.a(dwhcirootport.o) + 0x01f54b5c _DWHCIRootPort + .text.DWHCIRootPortInitialize + 0x01f54b90 0x1d0 uspi/lib/libuspi.a(dwhcirootport.o) + 0x01f54b90 DWHCIRootPortInitialize + .text 0x01f54d60 0x0 uspi/lib/libuspi.a(usbmouse.o) + .text.USBMouseDeviceConfigure + 0x01f54d60 0x2bc uspi/lib/libuspi.a(usbmouse.o) + 0x01f54d60 USBMouseDeviceConfigure + .text.USBMouseDeviceCompletionRoutine + 0x01f5501c 0xd4 uspi/lib/libuspi.a(usbmouse.o) + .text.USBMouseDevice + 0x01f550f0 0x3c uspi/lib/libuspi.a(usbmouse.o) + 0x01f550f0 USBMouseDevice + .text._CUSBMouseDevice + 0x01f5512c 0x4c uspi/lib/libuspi.a(usbmouse.o) + 0x01f5512c _CUSBMouseDevice + .text.USBMouseDeviceRegisterStatusHandler + 0x01f55178 0x8 uspi/lib/libuspi.a(usbmouse.o) + 0x01f55178 USBMouseDeviceRegisterStatusHandler + .text 0x01f55180 0x0 uspi/lib/libuspi.a(dwhciframeschednsplit.o) + .text.DWHCIFrameSchedulerNoSplitStartSplit + 0x01f55180 0x4 uspi/lib/libuspi.a(dwhciframeschednsplit.o) + 0x01f55180 DWHCIFrameSchedulerNoSplitStartSplit + .text.DWHCIFrameSchedulerNoSplitCompleteSplit + 0x01f55184 0x8 uspi/lib/libuspi.a(dwhciframeschednsplit.o) + 0x01f55184 DWHCIFrameSchedulerNoSplitCompleteSplit + .text.DWHCIFrameSchedulerNoSplitTransactionComplete + 0x01f5518c 0x4 uspi/lib/libuspi.a(dwhciframeschednsplit.o) + 0x01f5518c DWHCIFrameSchedulerNoSplitTransactionComplete + .text.DWHCIFrameSchedulerNoSplitIsOddFrame + 0x01f55190 0xc uspi/lib/libuspi.a(dwhciframeschednsplit.o) + 0x01f55190 DWHCIFrameSchedulerNoSplitIsOddFrame + .text.DWHCIFrameSchedulerNoSplitWaitForFrame + 0x01f5519c 0x64 uspi/lib/libuspi.a(dwhciframeschednsplit.o) + 0x01f5519c DWHCIFrameSchedulerNoSplitWaitForFrame + .text._DWHCIFrameSchedulerNoSplit + 0x01f55200 0x4 uspi/lib/libuspi.a(dwhciframeschednsplit.o) + 0x01f55200 _DWHCIFrameSchedulerNoSplit + .text.DWHCIFrameSchedulerNoSplit + 0x01f55204 0x58 uspi/lib/libuspi.a(dwhciframeschednsplit.o) + 0x01f55204 DWHCIFrameSchedulerNoSplit + .text 0x01f5525c 0x0 uspi/lib/libuspi.a(usbgamepad.o) + .text.BitGetUnsigned + 0x01f5525c 0x104 uspi/lib/libuspi.a(usbgamepad.o) + .text.USBGamePadDeviceDecodeReport + 0x01f55360 0x89c uspi/lib/libuspi.a(usbgamepad.o) + .text.USBGamePadDeviceConfigure + 0x01f55bfc 0x434 uspi/lib/libuspi.a(usbgamepad.o) + 0x01f55bfc USBGamePadDeviceConfigure + .text.USBGamePadDeviceCompletionRoutine + 0x01f56030 0xcc uspi/lib/libuspi.a(usbgamepad.o) + .text.USBGamePadDevice + 0x01f560fc 0x9c uspi/lib/libuspi.a(usbgamepad.o) + 0x01f560fc USBGamePadDevice + .text._CUSBGamePadDevice + 0x01f56198 0x84 uspi/lib/libuspi.a(usbgamepad.o) + 0x01f56198 _CUSBGamePadDevice + .text.USBGamePadDeviceRegisterStatusHandler + 0x01f5621c 0x8 uspi/lib/libuspi.a(usbgamepad.o) + 0x01f5621c USBGamePadDeviceRegisterStatusHandler + .text.USBGamePadDeviceGetReport + 0x01f56224 0x70 uspi/lib/libuspi.a(usbgamepad.o) + 0x01f56224 USBGamePadDeviceGetReport + .text 0x01f56294 0x0 uspi/lib/libuspi.a(synchronize.o) + .text.uspi_EnterCritical + 0x01f56294 0x3c uspi/lib/libuspi.a(synchronize.o) + 0x01f56294 uspi_EnterCritical + .text.uspi_LeaveCritical + 0x01f562d0 0x3c uspi/lib/libuspi.a(synchronize.o) + 0x01f562d0 uspi_LeaveCritical + .text.uspi_CleanAndInvalidateDataCacheRange + 0x01f5630c 0x30 uspi/lib/libuspi.a(synchronize.o) + 0x01f5630c uspi_CleanAndInvalidateDataCacheRange + .text 0x01f5633c 0x0 uspi/lib/libuspi.a(usbstring.o) + .text.USBString + 0x01f5633c 0x24 uspi/lib/libuspi.a(usbstring.o) + 0x01f5633c USBString + .text.USBStringCopy + 0x01f56360 0x6c uspi/lib/libuspi.a(usbstring.o) + 0x01f56360 USBStringCopy + .text._USBString + 0x01f563cc 0x40 uspi/lib/libuspi.a(usbstring.o) + 0x01f563cc _USBString + .text.USBStringGetFromDescriptor + 0x01f5640c 0x474 uspi/lib/libuspi.a(usbstring.o) + 0x01f5640c USBStringGetFromDescriptor + .text.USBStringGet + 0x01f56880 0x8 uspi/lib/libuspi.a(usbstring.o) + 0x01f56880 USBStringGet + .text.USBStringGetLanguageID + 0x01f56888 0x154 uspi/lib/libuspi.a(usbstring.o) + 0x01f56888 USBStringGetLanguageID + .text 0x01f569dc 0x0 uspi/lib/libuspi.a(usbmidi.o) + .text.USBMIDIDeviceConfigure + 0x01f569dc 0x218 uspi/lib/libuspi.a(usbmidi.o) + 0x01f569dc USBMIDIDeviceConfigure + .text.USBMIDIDeviceCompletionRoutine + 0x01f56bf4 0xfc uspi/lib/libuspi.a(usbmidi.o) + .text.USBMIDIDevice + 0x01f56cf0 0x30 uspi/lib/libuspi.a(usbmidi.o) + 0x01f56cf0 USBMIDIDevice + .text._CUSBMIDIDevice + 0x01f56d20 0x4c uspi/lib/libuspi.a(usbmidi.o) + 0x01f56d20 _CUSBMIDIDevice + .text.USBMIDIDeviceRegisterPacketHandler + 0x01f56d6c 0x8 uspi/lib/libuspi.a(usbmidi.o) + 0x01f56d6c USBMIDIDeviceRegisterPacketHandler + .text 0x01f56d74 0x0 uspi/lib/libuspi.a(usbconfigparser.o) + .text.USBConfigurationParser + 0x01f56d74 0x110 uspi/lib/libuspi.a(usbconfigparser.o) + 0x01f56d74 USBConfigurationParser + .text._USBConfigurationParser + 0x01f56e84 0xc uspi/lib/libuspi.a(usbconfigparser.o) + 0x01f56e84 _USBConfigurationParser + .text.USBConfigurationParserIsValid + 0x01f56e90 0x8 uspi/lib/libuspi.a(usbconfigparser.o) + 0x01f56e90 USBConfigurationParserIsValid + .text.USBConfigurationParserGetDescriptor + 0x01f56e98 0xa4 uspi/lib/libuspi.a(usbconfigparser.o) + 0x01f56e98 USBConfigurationParserGetDescriptor + .text.USBConfigurationParserError + 0x01f56f3c 0x2c uspi/lib/libuspi.a(usbconfigparser.o) + 0x01f56f3c USBConfigurationParserError + .text 0x01f56f68 0x0 uspi/lib/libuspi.a(usbdevicefactory.o) + .text.GetDevice + 0x01f56f68 0x1d0 uspi/lib/libuspi.a(usbdevicefactory.o) + 0x01f56f68 GetDevice + .text.USBDeviceFactoryGetDevice + 0x01f57138 0x224 uspi/lib/libuspi.a(usbdevicefactory.o) + 0x01f57138 USBDeviceFactoryGetDevice + .text 0x01f5735c 0x0 uspi/lib/libuspi.a(usbstandardhub.o) + .text.USBStandardHub + 0x01f5735c 0x68 uspi/lib/libuspi.a(usbstandardhub.o) + 0x01f5735c USBStandardHub + .text._USBStandardHub + 0x01f573c4 0x8c uspi/lib/libuspi.a(usbstandardhub.o) + 0x01f573c4 _USBStandardHub + .text.USBStandardHubInitialize + 0x01f57450 0x4 uspi/lib/libuspi.a(usbstandardhub.o) + 0x01f57450 USBStandardHubInitialize + .text.USBStandardHubGetDeviceNames + 0x01f57454 0xc0 uspi/lib/libuspi.a(usbstandardhub.o) + 0x01f57454 USBStandardHubGetDeviceNames + .text.USBStandardHubEnumeratePorts + 0x01f57514 0x584 uspi/lib/libuspi.a(usbstandardhub.o) + 0x01f57514 USBStandardHubEnumeratePorts + .text.USBStandardHubConfigure + 0x01f57a98 0x2bc uspi/lib/libuspi.a(usbstandardhub.o) + 0x01f57a98 USBStandardHubConfigure + .text 0x01f57d54 0x0 uspi/lib/libuspi.a(keymap.o) + .text.KeyMap 0x01f57d54 0x24 uspi/lib/libuspi.a(keymap.o) + 0x01f57d54 KeyMap + .text._KeyMap 0x01f57d78 0x4 uspi/lib/libuspi.a(keymap.o) + 0x01f57d78 _KeyMap + .text.KeyMapClearTable + 0x01f57d7c 0x34 uspi/lib/libuspi.a(keymap.o) + 0x01f57d7c KeyMapClearTable + .text.KeyMapSetEntry + 0x01f57db0 0x50 uspi/lib/libuspi.a(keymap.o) + 0x01f57db0 KeyMapSetEntry + .text.KeyMapTranslate + 0x01f57e00 0x118 uspi/lib/libuspi.a(keymap.o) + 0x01f57e00 KeyMapTranslate + .text.KeyMapGetString + 0x01f57f18 0xbc uspi/lib/libuspi.a(keymap.o) + 0x01f57f18 KeyMapGetString + .text.KeyMapGetLEDStatus + 0x01f57fd4 0x34 uspi/lib/libuspi.a(keymap.o) + 0x01f57fd4 KeyMapGetLEDStatus + *(.gnu.warning) + *(.glue_7t) + .glue_7t 0x01f58008 0x0 linker stubs + *(.glue_7) + .glue_7 0x01f58008 0x0 linker stubs + *(.vfp11_veneer) + .vfp11_veneer 0x01f58008 0x0 linker stubs + *(.v4_bx) + .v4_bx 0x01f58008 0x0 linker stubs + +.fini + *(.fini) + [!provide] PROVIDE (__etext, .) + [!provide] PROVIDE (_etext, .) + [!provide] PROVIDE (etext, .) + +.rodata 0x01f58008 0xc154 + *(.rodata .rodata.* .gnu.linkonce.r.*) + .rodata.str1.4 + 0x01f58008 0x114 exception.o + 0x118 (size before relaxing) + .rodata.str1.4 + 0x01f5811c 0x26e main.o + 0x276 (size before relaxing) + *fill* 0x01f5838a 0x6 + .rodata._ZL16snoopBackCommand + 0x01f58390 0x4 main.o + *fill* 0x01f58394 0x4 + .rodata._ZL10Sample_bin + 0x01f58398 0x337a main.o + *fill* 0x01f5b712 0x6 + .rodata._ZL11I__logo_png + 0x01f5b718 0x3876 main.o + *fill* 0x01f5ef8e 0x2 + .rodata._ZL6LfnOfs + 0x01f5ef90 0xd ff.o + *fill* 0x01f5ef9d 0x3 + .rodata._ZL5ExCvt + 0x01f5efa0 0x80 ff.o + .rodata.str1.4 + 0x01f5f020 0x1f ff.o + *fill* 0x01f5f03f 0x1 + .rodata._ZTV8Keyboard + 0x01f5f040 0x10 keyboard.o + 0x01f5f040 vtable for Keyboard + .rodata._ZN9DiskImage15SectorsPerTrackE + 0x01f5f050 0x2a DiskImage.o + 0x01f5f050 DiskImage::SectorsPerTrack + *fill* 0x01f5f07a 0x2 + .rodata.str1.4 + 0x01f5f07c 0x22c DiskImage.o + .rodata._ZL19DirectoryBlocksFree + 0x01f5f2a8 0x20 iec_commands.o + .rodata.str1.4 + 0x01f5f2c8 0x116 iec_commands.o + 0x11e (size before relaxing) + *fill* 0x01f5f3de 0x2 + .rodata._ZL9filetypes + 0x01f5f3e0 0x15 iec_commands.o + *fill* 0x01f5f3f5 0x3 + .rodata._ZL15GCR_decode_high + 0x01f5f3f8 0x20 gcr.o + .rodata._ZL13GCR_conv_data + 0x01f5f418 0x10 gcr.o + .rodata.str1.4 + 0x01f5f428 0x100 gcr.o + .rodata._ZL14GCR_decode_low + 0x01f5f528 0x20 gcr.o + .rodata.str1.4 + 0x01f5f548 0x589 emmc.o + *fill* 0x01f5fad1 0x7 + .rodata._ZN11CEMMCDevice11sd_commandsE + 0x01f5fad8 0x100 emmc.o + 0x01f5fad8 CEMMCDevice::sd_commands + .rodata._ZN11CEMMCDevice12sd_acommandsE + 0x01f5fbd8 0x100 emmc.o + 0x01f5fbd8 CEMMCDevice::sd_acommands + .rodata.str1.4 + 0x01f5fcd8 0xf9 options.o + *fill* 0x01f5fdd1 0x3 + .rodata 0x01f5fdd4 0x70 Screen.o + *fill* 0x01f5fe44 0x4 + .rodata._ZL23stbi__depth_scale_table + 0x01f5fe48 0x9 Screen.o + *fill* 0x01f5fe51 0x7 + .rodata._ZL7CMBFont + 0x01f5fe58 0x1000 Screen.o + .rodata._ZL17stbi__zdist_extra + 0x01f60e58 0x80 Screen.o + .rodata._ZL23stbi__zdefault_distance + 0x01f60ed8 0x20 Screen.o + .rodata._ZZL27stbi__compute_huffman_codesP10stbi__zbufE15length_dezigzag + 0x01f60ef8 0x13 Screen.o + *fill* 0x01f60f0b 0x1 + .rodata.str1.4 + 0x01f60f0c 0x297 Screen.o + 0x29b (size before relaxing) + *fill* 0x01f611a3 0x5 + .rodata._ZL18stbi__zlength_base + 0x01f611a8 0x7c Screen.o + *fill* 0x01f61224 0x4 + .rodata._ZL21stbi__zdefault_length + 0x01f61228 0x120 Screen.o + .rodata._ZL16first_row_filter + 0x01f61348 0x5 Screen.o + *fill* 0x01f6134d 0x3 + .rodata._ZL19stbi__zlength_extra + 0x01f61350 0x7c Screen.o + *fill* 0x01f613cc 0x4 + .rodata._ZL16stbi__zdist_base + 0x01f613d0 0x80 Screen.o + .rodata.str1.4 + 0x01f61450 0x29 Timer.o + *fill* 0x01f61479 0x7 + .rodata._ZN11FileBrowser8SwapKeysE + 0x01f61480 0x78 FileBrowser.o + 0x01f61480 FileBrowser::SwapKeys + .rodata._ZZN11FileBrowser15DisplayDiskInfoEP9DiskImagePKcE9fileTypes + 0x01f614f8 0x20 FileBrowser.o + .rodata.str1.4 + 0x01f61518 0xd4 FileBrowser.o + 0xe8 (size before relaxing) + *fill* 0x01f615ec 0x4 + .rodata._ZL7palette + 0x01f615f0 0x40 FileBrowser.o + .rodata.str1.4 + 0x01f61630 0x60 DiskCaddy.o + .rodata.str1.4 + 0x01f61690 0x36 ROMs.o + *fill* 0x01f616c6 0x2 + .rodata._ZTV13InputMappings + 0x01f616c8 0x10 InputMappings.o + 0x01f616c8 vtable for InputMappings + .rodata.avpriv_cga_font + 0x01f616d8 0x800 xga_font_data.o + 0x01f616d8 avpriv_cga_font + .rodata.avpriv_vga16_font + 0x01f61ed8 0x1000 xga_font_data.o + 0x01f61ed8 avpriv_vga16_font + .rodata.blanks.7057 + 0x01f62ed8 0x10 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfprintf.o) + .rodata.str1.4 + 0x01f62ee8 0x3f C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfprintf.o) + 0x42 (size before relaxing) + *fill* 0x01f62f27 0x1 + .rodata.zeroes.7058 + 0x01f62f28 0x10 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfprintf.o) + .rodata.blanks.7072 + 0x01f62f38 0x10 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) + .rodata.str1.4 + 0x01f62f48 0x42 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) + .rodata.zeroes.7073 + 0x01f62f48 0x10 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) + .rodata._ctype_ + 0x01f62f58 0x101 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-ctype_.o) + 0x01f62f58 _ctype_ + *fill* 0x01f63059 0x3 + .rodata.str1.4 + 0x01f6305c 0x10 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-dtoa.o) + 0x12 (size before relaxing) + .rodata.str1.4 + 0x01f6306c 0x2 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-impure.o) + *fill* 0x01f6306e 0x2 + .rodata._global_impure_ptr + 0x01f63070 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-impure.o) + 0x01f63070 _global_impure_ptr + .rodata.str1.4 + 0x01f63074 0x6 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + 0x12 (size before relaxing) + *fill* 0x01f6307a 0x2 + .rodata.p05.5398 + 0x01f6307c 0xc C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + .rodata.__mprec_tens + 0x01f63088 0xc8 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f63088 __mprec_tens + .rodata.__mprec_bigtens + 0x01f63150 0x28 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f63150 __mprec_bigtens + .rodata.__mprec_tinytens + 0x01f63178 0x28 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + 0x01f63178 __mprec_tinytens + .rodata.blanks.7001 + 0x01f631a0 0x10 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfiprintf.o) + .rodata.str1.4 + 0x01f631b0 0x2f C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfiprintf.o) + .rodata.zeroes.7002 + 0x01f631b0 0x10 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfiprintf.o) + .rodata.blanks.7015 + 0x01f631c0 0x10 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) + .rodata.str1.4 + 0x01f631d0 0x2f C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) + .rodata.zeroes.7016 + 0x01f631d0 0x10 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) + .rodata.FromUSPi + 0x01f631e0 0x5 uspi/lib/libuspi.a(uspilibrary.o) + *fill* 0x01f631e5 0x3 + .rodata.str1.4 + 0x01f631e8 0x8e uspi/lib/libuspi.a(uspilibrary.o) + *fill* 0x01f63276 0x2 + .rodata.FromDWHCI + 0x01f63278 0x6 uspi/lib/libuspi.a(dwhcidevice.o) + *fill* 0x01f6327e 0x2 + .rodata.str1.4 + 0x01f63280 0xc9 uspi/lib/libuspi.a(dwhcidevice.o) + *fill* 0x01f63349 0x7 + .rodata.CSWTCH.34 + 0x01f63350 0x3 uspi/lib/libuspi.a(dwhcidevice.o) + *fill* 0x01f63353 0x5 + .rodata.FromDevice + 0x01f63358 0x7 uspi/lib/libuspi.a(usbdevice.o) + *fill* 0x01f6335f 0x1 + .rodata.str1.4 + 0x01f63360 0x148 uspi/lib/libuspi.a(usbdevice.o) + 0x150 (size before relaxing) + .rodata.str1.4 + 0x01f634a8 0x1e uspi/lib/libuspi.a(macaddress.o) + *fill* 0x01f634c6 0x2 + .rodata.str1.4 + 0x01f634c8 0x92 uspi/lib/libuspi.a(smsc951x.o) + *fill* 0x01f6355a 0x6 + .rodata.FromSMSC951x + 0x01f63560 0x9 uspi/lib/libuspi.a(smsc951x.o) + *fill* 0x01f63569 0x3 + .rodata.str1.4 + 0x01f6356c 0x9c uspi/lib/libuspi.a(lan7800.o) + 0xea (size before relaxing) + .rodata.FromLAN7800 + 0x01f63608 0x8 uspi/lib/libuspi.a(lan7800.o) + .rodata.str1.4 + 0x01f63610 0x1 uspi/lib/libuspi.a(string.o) + .rodata.FromUmsd + 0x01f63610 0x5 uspi/lib/libuspi.a(usbmassdevice.o) + *fill* 0x01f63615 0x3 + .rodata.str1.4 + 0x01f63618 0x1c4 uspi/lib/libuspi.a(usbmassdevice.o) + 0x1e8 (size before relaxing) + .rodata.str1.4 + 0x01f637dc 0x1c uspi/lib/libuspi.a(dwhciframeschednper.o) + .rodata.str1.4 + 0x01f637f8 0x1c uspi/lib/libuspi.a(dwhciframeschedper.o) + .rodata.str1.4 + 0x01f637f8 0x3b uspi/lib/libuspi.a(usbkeyboard.o) + 0x57 (size before relaxing) + *fill* 0x01f63833 0x5 + .rodata.FromUSBKbd + 0x01f63838 0x7 uspi/lib/libuspi.a(usbkeyboard.o) + *fill* 0x01f6383f 0x1 + .rodata.FromDWHCIRoot + 0x01f63840 0x7 uspi/lib/libuspi.a(dwhcirootport.o) + *fill* 0x01f63847 0x1 + .rodata.str1.4 + 0x01f63848 0x87 uspi/lib/libuspi.a(dwhcirootport.o) + *fill* 0x01f638cf 0x1 + .rodata.str1.4 + 0x01f638d0 0x9 uspi/lib/libuspi.a(usbmouse.o) + 0x59 (size before relaxing) + *fill* 0x01f638d9 0x7 + .rodata.FromUSBKbd + 0x01f638e0 0x7 uspi/lib/libuspi.a(usbmouse.o) + *fill* 0x01f638e7 0x1 + .rodata.leds.5736 + 0x01f638e8 0x5 uspi/lib/libuspi.a(usbgamepad.o) + *fill* 0x01f638ed 0x3 + .rodata.FromUSBPad + 0x01f638f0 0x7 uspi/lib/libuspi.a(usbgamepad.o) + *fill* 0x01f638f7 0x1 + .rodata.str1.4 + 0x01f638f8 0x21 uspi/lib/libuspi.a(usbgamepad.o) + 0x5f (size before relaxing) + *fill* 0x01f63919 0x3 + .rodata.str1.4 + 0x01f6391c 0x8 uspi/lib/libuspi.a(usbmidi.o) + 0x24 (size before relaxing) + *fill* 0x01f63924 0x4 + .rodata.cin_to_length + 0x01f63928 0x40 uspi/lib/libuspi.a(usbmidi.o) + .rodata.FromMIDI + 0x01f63968 0x6 uspi/lib/libuspi.a(usbmidi.o) + *fill* 0x01f6396e 0x2 + .rodata.str1.4 + 0x01f63970 0x2f uspi/lib/libuspi.a(usbconfigparser.o) + *fill* 0x01f6399f 0x1 + .rodata.str1.4 + 0x01f639a0 0x77 uspi/lib/libuspi.a(usbdevicefactory.o) + *fill* 0x01f63a17 0x1 + .rodata.FromHub + 0x01f63a18 0x7 uspi/lib/libuspi.a(usbstandardhub.o) + *fill* 0x01f63a1f 0x1 + .rodata.str1.4 + 0x01f63a20 0x1a8 uspi/lib/libuspi.a(usbstandardhub.o) + 0x1e4 (size before relaxing) + .rodata.s_DefaultMap + 0x01f63bc8 0x400 uspi/lib/libuspi.a(keymap.o) + .rodata.str1.4 + 0x01f63fc8 0xc4 uspi/lib/libuspi.a(keymap.o) + 0xde (size before relaxing) + *fill* 0x01f6408c 0x4 + .rodata.s_KeyStrings + 0x01f64090 0xcc uspi/lib/libuspi.a(keymap.o) + +.rodata1 + *(.rodata1) + +.ARM.extab 0x01f6415c 0x0 + *(.ARM.extab* .gnu.linkonce.armextab.*) + .ARM.extab 0x01f6415c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivmoddi4.o) + [!provide] PROVIDE (__exidx_start, .) + +.ARM.exidx 0x01f6415c 0x8 + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + .ARM.exidx 0x01f6415c 0x8 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivmoddi4.o) + [!provide] PROVIDE (__exidx_end, .) + +.eh_frame_hdr + *(.eh_frame_hdr) + +.eh_frame + *(.eh_frame) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + +.exception_ranges + *(.exception_ranges .exception_ranges*) + +.eh_frame + *(.eh_frame) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + +.exception_ranges + *(.exception_ranges .exception_ranges*) + +.tdata + *(.tdata .tdata.* .gnu.linkonce.td.*) + +.tbss + *(.tbss .tbss.* .gnu.linkonce.tb.*) + *(.tcommon) + +.preinit_array 0x01f64164 0x0 + 0x01f64164 PROVIDE (__preinit_array_start, .) + *(.preinit_array) + 0x01f64164 PROVIDE (__preinit_array_end, .) + +.init_array 0x01f64164 0x4 + 0x01f64164 PROVIDE (__init_array_start, .) + *(SORT(.init_array.*)) + *(.init_array) + .init_array 0x01f64164 0x4 main.o + 0x01f64168 PROVIDE (__init_array_end, .) + +.fini_array 0x01f64168 0x0 + [!provide] PROVIDE (__fini_array_start, .) + *(SORT(.fini_array.*)) + *(.fini_array) + [!provide] PROVIDE (__fini_array_end, .) + +.ctors + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + +.dtors + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + +.jcr + *(.jcr) + +.data.rel.ro + *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) + *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) + +.dynamic + *(.dynamic) + +.got 0x01f64168 0x0 + *(.got.plt) + *(.igot.plt) + .igot.plt 0x01f64168 0x0 armc-start.o + *(.got) + *(.igot) + +.data 0x01f64180 0x1b5c + 0x01f64180 __data_start = . + *(.data .data.* .gnu.linkonce.d.*) + .data 0x01f64180 0x0 armc-start.o + .data 0x01f64180 0x0 armc-cstartup.o + .data 0x01f64180 0x0 armc-cstubs.o + .data.environ 0x01f64180 0x4 armc-cstubs.o + 0x01f64180 environ + .data 0x01f64184 0x0 armc-cppstubs.o + .data 0x01f64184 0x0 exception.o + .data 0x01f64184 0x0 main.o + .data.termainalTextNormal + 0x01f64184 0x4 main.o + 0x01f64184 termainalTextNormal + .data.termainalTextRed + 0x01f64188 0x4 main.o + 0x01f64188 termainalTextRed + *fill* 0x01f6418c 0x14 + .data.dmaSoundCB + 0x01f641a0 0x20 main.o + 0x01f641a0 dmaSoundCB + .data.versionMinor + 0x01f641c0 0x4 main.o + 0x01f641c0 versionMinor + .data.deviceID + 0x01f641c4 0x1 main.o + 0x01f641c4 deviceID + *fill* 0x01f641c5 0x3 + .data.versionMajor + 0x01f641c8 0x4 main.o + 0x01f641c8 versionMajor + .data 0x01f641cc 0x0 rpi-aux.o + .data 0x01f641cc 0x0 rpi-mailbox-interface.o + .data 0x01f641cc 0x0 rpi-mailbox.o + .data 0x01f641cc 0x0 rpi-gpio.o + .data.RPI_GpioBase + 0x01f641cc 0x4 rpi-gpio.o + 0x01f641cc RPI_GpioBase + .data 0x01f641d0 0x0 rpi-interrupts.o + .data 0x01f641d0 0x0 cache.o + .data 0x01f641d0 0x0 ff.o + .data 0x01f641d0 0x0 interrupt.o + .data 0x01f641d0 0x0 keyboard.o + .data 0x01f641d0 0x0 Pi1541.o + .data 0x01f641d0 0x0 DiskImage.o + .data.gap_match_length + 0x01f641d0 0x4 DiskImage.o + 0x01f641d0 gap_match_length + .data 0x01f641d4 0x0 iec_bus.o + .data._ZN7IEC_Bus18PIGPIO_MASK_IN_ATNE + 0x01f641d4 0x4 iec_bus.o + 0x01f641d4 IEC_Bus::PIGPIO_MASK_IN_ATN + .data._ZN7IEC_Bus19PIGPIO_MASK_IN_DATAE + 0x01f641d8 0x4 iec_bus.o + 0x01f641d8 IEC_Bus::PIGPIO_MASK_IN_DATA + .data._ZN7IEC_Bus20PIGPIO_MASK_IN_CLOCKE + 0x01f641dc 0x4 iec_bus.o + 0x01f641dc IEC_Bus::PIGPIO_MASK_IN_CLOCK + .data._ZN7IEC_Bus20PIGPIO_MASK_IN_RESETE + 0x01f641e0 0x4 iec_bus.o + 0x01f641e0 IEC_Bus::PIGPIO_MASK_IN_RESET + .data._ZN7IEC_Bus18PIGPIO_MASK_IN_SRQE + 0x01f641e4 0x4 iec_bus.o + 0x01f641e4 IEC_Bus::PIGPIO_MASK_IN_SRQ + .data 0x01f641e8 0x0 iec_commands.o + .data._ZL15DirectoryHeader + 0x01f641e8 0x20 iec_commands.o + .data._ZL14blankD64DIRBAM + 0x01f64208 0x100 iec_commands.o + .data 0x01f64308 0x0 m6502.o + .data._ZN5M650215opcodeFunctionsE + 0x01f64308 0x800 m6502.o + 0x01f64308 M6502::opcodeFunctions + .data._ZN5M650222T1AddressModeFunctionsE + 0x01f64b08 0x800 m6502.o + 0x01f64b08 M6502::T1AddressModeFunctions + .data 0x01f65308 0x0 m6522.o + .data 0x01f65308 0x0 drive.o + .data 0x01f65308 0x0 gcr.o + .data.capacity_min + 0x01f65308 0x10 gcr.o + 0x01f65308 capacity_min + .data.capacity_max + 0x01f65318 0x10 gcr.o + 0x01f65318 capacity_max + .data.capacity + 0x01f65328 0x10 gcr.o + 0x01f65328 capacity + .data.sector_map_1541 + 0x01f65338 0x2b gcr.o + 0x01f65338 sector_map_1541 + *fill* 0x01f65363 0x5 + .data.speed_map_1541 + 0x01f65368 0x2a gcr.o + 0x01f65368 speed_map_1541 + .data 0x01f65392 0x0 prot.o + .data 0x01f65392 0x0 lz.o + .data 0x01f65392 0x0 emmc.o + *fill* 0x01f65392 0x6 + .data._ZN11CEMMCDevice11sd_versionsE + 0x01f65398 0x18 emmc.o + 0x01f65398 CEMMCDevice::sd_versions + .data 0x01f653b0 0x0 diskio.o + .data 0x01f653b0 0x0 options.o + .data 0x01f653b0 0x0 Screen.o + .data._ZZL20stbi__parse_png_fileP9stbi__pngiiE13invalid_chunk + 0x01f653b0 0x19 Screen.o + .data 0x01f653c9 0x0 Timer.o + .data 0x01f653c9 0x0 FileBrowser.o + .data 0x01f653c9 0x0 DiskCaddy.o + .data 0x01f653c9 0x0 ROMs.o + .data 0x01f653c9 0x0 InputMappings.o + .data 0x01f653c9 0x0 xga_font_data.o + .data 0x01f653c9 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-abs.o) + .data 0x01f653c9 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-aeabi_atexit.o) + .data 0x01f653c9 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-cxa_atexit.o) + .data 0x01f653c9 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-init.o) + .data 0x01f653c9 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isdigit.o) + .data 0x01f653c9 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isspace.o) + .data 0x01f653c9 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-malloc.o) + .data 0x01f653c9 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) + *fill* 0x01f653c9 0x3 + .data.__malloc_av_ + 0x01f653cc 0x408 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) + 0x01f653cc __malloc_av_ + .data.__malloc_trim_threshold + 0x01f657d4 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) + 0x01f657d4 __malloc_trim_threshold + .data.__malloc_sbrk_base + 0x01f657d8 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) + 0x01f657d8 __malloc_sbrk_base + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memcmp.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memcpy-stub.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memmove.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memset.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mlock.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-printf.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-rand.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-realloc.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reallocr.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reent.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-sbrkr.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-snprintf.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-sprintf.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcasecmp.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcat.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strchr.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcmp.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcpy.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strlen-stub.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strncasecmp.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strncpy.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strrchr.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strstr.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfprintf.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-toupper.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vprintf.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wsetup.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-__atexit.o) + .data 0x01f657dc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-ctype_.o) + .data.__ctype_ptr__ + 0x01f657dc 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-ctype_.o) + 0x01f657dc __ctype_ptr__ + .data 0x01f657e0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-dtoa.o) + .data 0x01f657e0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fflush.o) + .data 0x01f657e0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + .data 0x01f657e0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-freer.o) + .data 0x01f657e0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fwalk.o) + .data 0x01f657e0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-impure.o) + .data.impure_data + 0x01f657e0 0x428 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-impure.o) + .data._impure_ptr + 0x01f65c08 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-impure.o) + 0x01f65c08 _impure_ptr + .data 0x01f65c0c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + .data.lc_message_charset + 0x01f65c0c 0x20 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + .data.lconv 0x01f65c2c 0x38 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + .data.lc_ctype_charset + 0x01f65c64 0x20 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + .data.__mb_cur_max + 0x01f65c84 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + 0x01f65c84 __mb_cur_max + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-makebuf.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memchr-stub.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-stdio.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfiprintf.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-writer.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-callocr.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-closer.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fclose.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fputwc.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fstatr.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fvwrite.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isattyr.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-lseekr.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-readr.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wbuf.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wcrtomb.o) + .data 0x01f65c88 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wctomb_r.o) + .data.__wctomb + 0x01f65c88 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wctomb_r.o) + 0x01f65c88 __wctomb + .data 0x01f65c8c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivsi3.o) + .data 0x01f65c8c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_divsi3.o) + .data 0x01f65c8c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_dvmd_tls.o) + .data 0x01f65c8c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_aeabi_uldivmod.o) + .data 0x01f65c8c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivmoddi4.o) + .data 0x01f65c8c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_clzdi2.o) + .data 0x01f65c8c 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_clzsi2.o) + .data 0x01f65c8c 0x0 uspi/lib/libuspi.a(uspilibrary.o) + .data 0x01f65c8c 0x0 uspi/lib/libuspi.a(dwhcidevice.o) + .data 0x01f65c8c 0x0 uspi/lib/libuspi.a(dwhciregister.o) + .data 0x01f65c8c 0x0 uspi/lib/libuspi.a(dwhcixferstagedata.o) + .data 0x01f65c8c 0x0 uspi/lib/libuspi.a(usbdevice.o) + .data.s_ucNextAddress + 0x01f65c8c 0x1 uspi/lib/libuspi.a(usbdevice.o) + .data 0x01f65c8d 0x0 uspi/lib/libuspi.a(usbendpoint.o) + .data 0x01f65c8d 0x0 uspi/lib/libuspi.a(usbrequest.o) + .data 0x01f65c8d 0x0 uspi/lib/libuspi.a(devicenameservice.o) + .data 0x01f65c8d 0x0 uspi/lib/libuspi.a(macaddress.o) + .data 0x01f65c8d 0x0 uspi/lib/libuspi.a(smsc951x.o) + .data 0x01f65c8d 0x0 uspi/lib/libuspi.a(lan7800.o) + *fill* 0x01f65c8d 0x3 + .data.s_nDeviceNumber + 0x01f65c90 0x4 uspi/lib/libuspi.a(lan7800.o) + .data 0x01f65c94 0x0 uspi/lib/libuspi.a(string.o) + .data 0x01f65c94 0x0 uspi/lib/libuspi.a(util.o) + .data 0x01f65c94 0x0 uspi/lib/libuspi.a(usbmassdevice.o) + .data.s_nDeviceNumber + 0x01f65c94 0x4 uspi/lib/libuspi.a(usbmassdevice.o) + .data 0x01f65c98 0x0 uspi/lib/libuspi.a(dwhciframeschednper.o) + .data 0x01f65c98 0x0 uspi/lib/libuspi.a(dwhciframeschedper.o) + .data 0x01f65c98 0x0 uspi/lib/libuspi.a(usbkeyboard.o) + .data.s_nDeviceNumber + 0x01f65c98 0x4 uspi/lib/libuspi.a(usbkeyboard.o) + .data 0x01f65c9c 0x0 uspi/lib/libuspi.a(dwhcirootport.o) + .data 0x01f65c9c 0x0 uspi/lib/libuspi.a(usbmouse.o) + .data.s_nDeviceNumber + 0x01f65c9c 0x4 uspi/lib/libuspi.a(usbmouse.o) + .data 0x01f65ca0 0x0 uspi/lib/libuspi.a(dwhciframeschednsplit.o) + .data 0x01f65ca0 0x0 uspi/lib/libuspi.a(usbgamepad.o) + .data.s_nDeviceNumber + 0x01f65ca0 0x4 uspi/lib/libuspi.a(usbgamepad.o) + *fill* 0x01f65ca4 0x4 + .data.writeBuf.5735 + 0x01f65ca8 0x30 uspi/lib/libuspi.a(usbgamepad.o) + .data 0x01f65cd8 0x0 uspi/lib/libuspi.a(synchronize.o) + .data 0x01f65cd8 0x0 uspi/lib/libuspi.a(usbstring.o) + .data 0x01f65cd8 0x0 uspi/lib/libuspi.a(usbmidi.o) + .data.s_nDeviceNumber + 0x01f65cd8 0x4 uspi/lib/libuspi.a(usbmidi.o) + .data 0x01f65cdc 0x0 uspi/lib/libuspi.a(usbconfigparser.o) + .data 0x01f65cdc 0x0 uspi/lib/libuspi.a(usbdevicefactory.o) + .data 0x01f65cdc 0x0 uspi/lib/libuspi.a(usbstandardhub.o) + .data 0x01f65cdc 0x0 uspi/lib/libuspi.a(keymap.o) + +.data1 + *(.data1) + 0x01f65cdc _edata = . + [!provide] PROVIDE (edata, .) + 0x01f65cdc __bss_start = . + 0x01f65cdc __bss_start__ = . + +.bss 0x01f68000 0x180004 + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + .bss 0x01f68000 0x0 armc-start.o + .bss 0x01f68000 0x0 armc-cstartup.o + .bss 0x01f68000 0x0 armc-cstubs.o + .bss.__env 0x01f68000 0x4 armc-cstubs.o + 0x01f68000 __env + .bss.heap_end.5349 + 0x01f68004 0x4 armc-cstubs.o + .bss 0x01f68008 0x0 armc-cppstubs.o + .bss.__dso_handle + 0x01f68008 0x4 armc-cppstubs.o + 0x01f68008 __dso_handle + .bss 0x01f6800c 0x0 exception.o + .bss 0x01f6800c 0x0 main.o + .bss._ZN9SingletonI13InputMappingsE11m_pInstanceE + 0x01f6800c 0x4 main.o + 0x01f6800c Singleton::m_pInstance + .bss._ZN9SingletonI8KeyboardE11m_pInstanceE + 0x01f68010 0x4 main.o + 0x01f68010 Singleton::m_pInstance + .bss.extraRAM 0x01f68014 0x1 main.o + 0x01f68014 extraRAM + *fill* 0x01f68015 0x3 + .bss.roms 0x01f68018 0x20810 main.o + 0x01f68018 roms + .bss.m_IEC_Commands + 0x01f88828 0x149b0 main.o + 0x01f88828 m_IEC_Commands + .bss.displayPNGIcons + 0x01f9d1d8 0x1 main.o + 0x01f9d1d8 displayPNGIcons + .bss.supportUARTInput + 0x01f9d1d9 0x1 main.o + 0x01f9d1d9 supportUARTInput + *fill* 0x01f9d1da 0x2 + .bss.diskCaddy + 0x01f9d1dc 0x18 main.o + 0x01f9d1dc diskCaddy + .bss.fileBrowserSelectedName + 0x01f9d1f4 0x4 main.o + 0x01f9d1f4 fileBrowserSelectedName + .bss.m_EMMC 0x01f9d1f8 0x78 main.o + 0x01f9d1f8 m_EMMC + .bss.s_u8Memory + 0x01f9d270 0xc000 main.o + 0x01f9d270 s_u8Memory + .bss.invertIECInputs + 0x01fa9270 0x1 main.o + 0x01fa9270 invertIECInputs + *fill* 0x01fa9271 0x3 + .bss._ZL10snoopIndex + 0x01fa9274 0x4 main.o + .bss.emulating + 0x01fa9278 0x1 main.o + 0x01fa9278 emulating + .bss.quickBoot + 0x01fa9279 0x1 main.o + 0x01fa9279 quickBoot + *fill* 0x01fa927a 0x2 + .bss.pi1541 0x01fa927c 0x11c main.o + 0x01fa927c pi1541 + .bss.tempBuffer + 0x01fa9398 0x400 main.o + 0x01fa9398 tempBuffer + .bss.soundOnGPIO + 0x01fa9798 0x1 main.o + 0x01fa9798 soundOnGPIO + .bss.splitIECLines + 0x01fa9799 0x1 main.o + 0x01fa9799 splitIECLines + .bss.graphIEC 0x01fa979a 0x1 main.o + 0x01fa979a graphIEC + .bss.onResetChangeToStartingFolder + 0x01fa979b 0x1 main.o + 0x01fa979b onResetChangeToStartingFolder + .bss._ZL7snoopPC + 0x01fa979c 0x4 main.o + .bss.disableSD2IECCommands + 0x01fa97a0 0x1 main.o + 0x01fa97a0 disableSD2IECCommands + *fill* 0x01fa97a1 0x3 + .bss.screen 0x01fa97a4 0x20 main.o + 0x01fa97a4 screen + .bss 0x01fa97c4 0x0 rpi-aux.o + .bss 0x01fa97c4 0x0 rpi-mailbox-interface.o + .bss.property.6397 + 0x01fa97c4 0x408 rpi-mailbox-interface.o + *fill* 0x01fa9bcc 0x4 + .bss.pt 0x01fa9bd0 0x8000 rpi-mailbox-interface.o + .bss.pt_index 0x01fb1bd0 0x4 rpi-mailbox-interface.o + .bss 0x01fb1bd4 0x0 rpi-mailbox.o + .bss 0x01fb1bd4 0x0 rpi-gpio.o + .bss.gpiovirtbuf + 0x01fb1bd4 0x4 rpi-gpio.o + .bss.touchbuf 0x01fb1bd8 0x4 rpi-gpio.o + *fill* 0x01fb1bdc 0x4 + .bss.enables_disables + 0x01fb1be0 0x8 rpi-gpio.o + .bss 0x01fb1be8 0x0 rpi-interrupts.o + .bss 0x01fb1be8 0x0 cache.o + .bss 0x01fb1be8 0x0 ff.o + .bss._ZL6DirBuf + 0x01fb1be8 0x260 ff.o + .bss._ZL4Fsid 0x01fb1e48 0x2 ff.o + *fill* 0x01fb1e4a 0x6 + .bss._ZL5FatFs + 0x01fb1e50 0x4 ff.o + *fill* 0x01fb1e54 0x4 + .bss._ZL6LfnBuf + 0x01fb1e58 0x200 ff.o + .bss 0x01fb2058 0x0 interrupt.o + .bss.Params 0x01fb2058 0x120 interrupt.o + .bss.IRQHandlers + 0x01fb2178 0x120 interrupt.o + .bss 0x01fb2298 0x0 keyboard.o + .bss 0x01fb2298 0x0 Pi1541.o + .bss 0x01fb2298 0x0 DiskImage.o + .bss._ZN9DiskImage10readBufferE + 0x01fb2298 0x80000 DiskImage.o + 0x01fb2298 DiskImage::readBuffer + .bss._ZL17compressionBuffer + 0x02032298 0xa8000 DiskImage.o + .bss 0x020da298 0x0 iec_bus.o + .bss._ZN7IEC_Bus12DataSetToOutE + 0x020da298 0x1 iec_bus.o + 0x020da298 IEC_Bus::DataSetToOut + *fill* 0x020da299 0x7 + .bss._ZN7IEC_Bus11inputRepeatE + 0x020da2a0 0x14 iec_bus.o + 0x020da2a0 IEC_Bus::inputRepeat + .bss._ZN7IEC_Bus8VIA_AtnaE + 0x020da2b4 0x1 iec_bus.o + 0x020da2b4 IEC_Bus::VIA_Atna + *fill* 0x020da2b5 0x3 + .bss._ZN7IEC_Bus11InputButtonE + 0x020da2b8 0x5 iec_bus.o + 0x020da2b8 IEC_Bus::InputButton + .bss._ZN7IEC_Bus9ResettingE + 0x020da2bd 0x1 iec_bus.o + 0x020da2bd IEC_Bus::Resetting + .bss._ZN7IEC_Bus13ClockSetToOutE + 0x020da2be 0x1 iec_bus.o + 0x020da2be IEC_Bus::ClockSetToOut + .bss._ZN7IEC_Bus8VIA_DataE + 0x020da2bf 0x1 iec_bus.o + 0x020da2bf IEC_Bus::VIA_Data + .bss._ZN7IEC_Bus15inputRepeatPrevE + 0x020da2c0 0x14 iec_bus.o + 0x020da2c0 IEC_Bus::inputRepeatPrev + .bss._ZN7IEC_Bus15invertIECInputsE + 0x020da2d4 0x1 iec_bus.o + 0x020da2d4 IEC_Bus::invertIECInputs + .bss._ZN7IEC_Bus8PI_ResetE + 0x020da2d5 0x1 iec_bus.o + 0x020da2d5 IEC_Bus::PI_Reset + .bss._ZN7IEC_Bus8PI_ClockE + 0x020da2d6 0x1 iec_bus.o + 0x020da2d6 IEC_Bus::PI_Clock + .bss._ZN7IEC_Bus6PI_AtnE + 0x020da2d7 0x1 iec_bus.o + 0x020da2d7 IEC_Bus::PI_Atn + .bss._ZN7IEC_Bus20inputRepeatThresholdE + 0x020da2d8 0x14 iec_bus.o + 0x020da2d8 IEC_Bus::inputRepeatThreshold + .bss._ZN7IEC_Bus3VIAE + 0x020da2ec 0x4 iec_bus.o + 0x020da2ec IEC_Bus::VIA + .bss._ZN7IEC_Bus13myOutsGPFSEL0E + 0x020da2f0 0x4 iec_bus.o + 0x020da2f0 IEC_Bus::myOutsGPFSEL0 + .bss._ZN7IEC_Bus13myOutsGPFSEL1E + 0x020da2f4 0x4 iec_bus.o + 0x020da2f4 IEC_Bus::myOutsGPFSEL1 + .bss._ZN7IEC_Bus13splitIECLinesE + 0x020da2f8 0x1 iec_bus.o + 0x020da2f8 IEC_Bus::splitIECLines + *fill* 0x020da2f9 0x7 + .bss._ZN7IEC_Bus15InputButtonPrevE + 0x020da300 0x5 iec_bus.o + 0x020da300 IEC_Bus::InputButtonPrev + .bss._ZN7IEC_Bus7PI_DataE + 0x020da305 0x1 iec_bus.o + 0x020da305 IEC_Bus::PI_Data + .bss._ZN7IEC_Bus11OutputSoundE + 0x020da306 0x1 iec_bus.o + 0x020da306 IEC_Bus::OutputSound + .bss._ZN7IEC_Bus16AtnaDataSetToOutE + 0x020da307 0x1 iec_bus.o + 0x020da307 IEC_Bus::AtnaDataSetToOut + .bss._ZN7IEC_Bus15validInputCountE + 0x020da308 0x14 iec_bus.o + 0x020da308 IEC_Bus::validInputCount + .bss._ZN7IEC_Bus9VIA_ClockE + 0x020da31c 0x1 iec_bus.o + 0x020da31c IEC_Bus::VIA_Clock + .bss._ZN7IEC_Bus9OutputLEDE + 0x020da31d 0x1 iec_bus.o + 0x020da31d IEC_Bus::OutputLED + .bss 0x020da31e 0x0 iec_commands.o + *fill* 0x020da31e 0x2 + .bss._ZL12ErrorMessage + 0x020da320 0x40 iec_commands.o + .bss 0x020da360 0x0 m6502.o + .bss 0x020da360 0x0 m6522.o + .bss 0x020da360 0x0 drive.o + .bss 0x020da360 0x0 gcr.o + .bss 0x020da360 0x0 prot.o + .bss 0x020da360 0x0 lz.o + .bss 0x020da360 0x0 emmc.o + .bss 0x020da360 0x0 diskio.o + .bss._ZL5pEMMC + 0x020da360 0x4 diskio.o + .bss 0x020da364 0x0 options.o + .bss 0x020da364 0x0 Screen.o + .bss._ZL27stbi__unpremultiply_on_load + 0x020da364 0x4 Screen.o + .bss._ZL20stbi__de_iphone_flag + 0x020da368 0x4 Screen.o + .bss._ZL22stbi__g_failure_reason + 0x020da36c 0x4 Screen.o + .bss._ZL29stbi__vertically_flip_on_load + 0x020da370 0x4 Screen.o + .bss 0x020da374 0x0 Timer.o + .bss.m_KernelTimer + 0x020da374 0x140 Timer.o + .bss.Ticks 0x020da4b4 0x4 Timer.o + .bss 0x020da4b8 0x0 FileBrowser.o + .bss._ZN11FileBrowser9LSTBufferE + 0x020da4b8 0x2000 FileBrowser.o + 0x020da4b8 FileBrowser::LSTBuffer + .bss 0x020dc4b8 0x0 DiskCaddy.o + .bss._ZL6buffer + 0x020dc4b8 0x100 DiskCaddy.o + .bss 0x020dc5b8 0x0 ROMs.o + .bss 0x020dc5b8 0x0 InputMappings.o + .bss._ZN13InputMappings21directDiskSwapRequestE + 0x020dc5b8 0x4 InputMappings.o + 0x020dc5b8 InputMappings::directDiskSwapRequest + .bss 0x020dc5bc 0x0 xga_font_data.o + .bss 0x020dc5bc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-abs.o) + .bss 0x020dc5bc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-aeabi_atexit.o) + .bss 0x020dc5bc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-cxa_atexit.o) + .bss 0x020dc5bc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-init.o) + .bss 0x020dc5bc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isdigit.o) + .bss 0x020dc5bc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isspace.o) + .bss 0x020dc5bc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-malloc.o) + .bss 0x020dc5bc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) + .bss.__malloc_max_total_mem + 0x020dc5bc 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) + 0x020dc5bc __malloc_max_total_mem + .bss.__malloc_max_sbrked_mem + 0x020dc5c0 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) + 0x020dc5c0 __malloc_max_sbrked_mem + .bss.__malloc_top_pad + 0x020dc5c4 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) + 0x020dc5c4 __malloc_top_pad + .bss.__malloc_current_mallinfo + 0x020dc5c8 0x28 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) + 0x020dc5c8 __malloc_current_mallinfo + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memcmp.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memcpy-stub.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memmove.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memset.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mlock.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-printf.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-rand.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-realloc.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reallocr.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reent.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-sbrkr.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-snprintf.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-sprintf.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcasecmp.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcat.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strchr.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcmp.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcpy.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strlen-stub.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strncasecmp.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strncpy.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strrchr.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strstr.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfprintf.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-toupper.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vprintf.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wsetup.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-__atexit.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-ctype_.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-dtoa.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fflush.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-freer.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fwalk.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-impure.o) + .bss 0x020dc5f0 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + .bss._PathLocale + 0x020dc5f0 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + 0x020dc5f0 _PathLocale + .bss.__nlocale_changed + 0x020dc5f4 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + 0x020dc5f4 __nlocale_changed + .bss.__mlocale_changed + 0x020dc5f8 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + 0x020dc5f8 __mlocale_changed + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-makebuf.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memchr-stub.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-stdio.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfiprintf.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-writer.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-callocr.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-closer.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fclose.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fputwc.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fstatr.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fvwrite.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isattyr.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-lseekr.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-readr.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wbuf.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wcrtomb.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wctomb_r.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivsi3.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_divsi3.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_dvmd_tls.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_aeabi_uldivmod.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivmoddi4.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_clzdi2.o) + .bss 0x020dc5fc 0x0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_clzsi2.o) + .bss 0x020dc5fc 0x0 uspi/lib/libuspi.a(uspilibrary.o) + .bss.s_pLibrary + 0x020dc5fc 0x4 uspi/lib/libuspi.a(uspilibrary.o) + .bss 0x020dc600 0x0 uspi/lib/libuspi.a(dwhcidevice.o) + .bss 0x020dc600 0x0 uspi/lib/libuspi.a(dwhciregister.o) + .bss 0x020dc600 0x0 uspi/lib/libuspi.a(dwhcixferstagedata.o) + .bss 0x020dc600 0x0 uspi/lib/libuspi.a(usbdevice.o) + .bss 0x020dc600 0x0 uspi/lib/libuspi.a(usbendpoint.o) + .bss 0x020dc600 0x0 uspi/lib/libuspi.a(usbrequest.o) + .bss 0x020dc600 0x0 uspi/lib/libuspi.a(devicenameservice.o) + .bss.s_pThis 0x020dc600 0x4 uspi/lib/libuspi.a(devicenameservice.o) + .bss 0x020dc604 0x0 uspi/lib/libuspi.a(macaddress.o) + .bss 0x020dc604 0x0 uspi/lib/libuspi.a(smsc951x.o) + .bss.s_nDeviceNumber + 0x020dc604 0x4 uspi/lib/libuspi.a(smsc951x.o) + .bss 0x020dc608 0x0 uspi/lib/libuspi.a(lan7800.o) + .bss 0x020dc608 0x0 uspi/lib/libuspi.a(string.o) + .bss 0x020dc608 0x0 uspi/lib/libuspi.a(util.o) + .bss 0x020dc608 0x0 uspi/lib/libuspi.a(usbmassdevice.o) + .bss 0x020dc608 0x0 uspi/lib/libuspi.a(dwhciframeschednper.o) + .bss 0x020dc608 0x0 uspi/lib/libuspi.a(dwhciframeschedper.o) + .bss 0x020dc608 0x0 uspi/lib/libuspi.a(usbkeyboard.o) + .bss 0x020dc608 0x0 uspi/lib/libuspi.a(dwhcirootport.o) + .bss 0x020dc608 0x0 uspi/lib/libuspi.a(usbmouse.o) + .bss 0x020dc608 0x0 uspi/lib/libuspi.a(dwhciframeschednsplit.o) + .bss 0x020dc608 0x0 uspi/lib/libuspi.a(usbgamepad.o) + .bss 0x020dc608 0x0 uspi/lib/libuspi.a(synchronize.o) + .bss.s_bWereEnabled + 0x020dc608 0x4 uspi/lib/libuspi.a(synchronize.o) + .bss.s_nCriticalLevel + 0x020dc60c 0x4 uspi/lib/libuspi.a(synchronize.o) + .bss 0x020dc610 0x0 uspi/lib/libuspi.a(usbstring.o) + .bss 0x020dc610 0x0 uspi/lib/libuspi.a(usbmidi.o) + .bss 0x020dc610 0x0 uspi/lib/libuspi.a(usbconfigparser.o) + .bss 0x020dc610 0x0 uspi/lib/libuspi.a(usbdevicefactory.o) + .bss 0x020dc610 0x0 uspi/lib/libuspi.a(usbstandardhub.o) + .bss 0x020dc610 0x0 uspi/lib/libuspi.a(keymap.o) + *(COMMON) + *fill* 0x020dc610 0x39f0 + COMMON 0x020e0000 0x8000 cache.o + 0x020e0000 PageTable2 + 0x020e4000 PageTable + COMMON 0x020e8000 0x4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reent.o) + 0x020e8000 errno + 0x020e8004 . = ALIGN ((. != 0x0)?0x4:0x1) + 0x020e8004 _bss_end__ = . + 0x020e8004 __bss_end__ = . + 0x020e8004 . = ALIGN (0x4) + 0x020e8004 . = ALIGN (0x4) + 0x020e8004 __end__ = . + 0x020e8004 _end = . + [!provide] PROVIDE (end, .) + +.stab + *(.stab) + +.stabstr + *(.stabstr) + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.comment 0x00000000 0x6e + *(.comment) + .comment 0x00000000 0x6e armc-cstartup.o + 0x6f (size before relaxing) + .comment 0x0000006e 0x6f armc-cstubs.o + .comment 0x0000006e 0x6f armc-cppstubs.o + .comment 0x0000006e 0x6f exception.o + .comment 0x0000006e 0x6f main.o + .comment 0x0000006e 0x6f rpi-aux.o + .comment 0x0000006e 0x6f rpi-mailbox-interface.o + .comment 0x0000006e 0x6f rpi-mailbox.o + .comment 0x0000006e 0x6f rpi-gpio.o + .comment 0x0000006e 0x6f rpi-interrupts.o + .comment 0x0000006e 0x6f cache.o + .comment 0x0000006e 0x6f ff.o + .comment 0x0000006e 0x6f interrupt.o + .comment 0x0000006e 0x6f keyboard.o + .comment 0x0000006e 0x6f Pi1541.o + .comment 0x0000006e 0x6f DiskImage.o + .comment 0x0000006e 0x6f iec_bus.o + .comment 0x0000006e 0x6f iec_commands.o + .comment 0x0000006e 0x6f m6502.o + .comment 0x0000006e 0x6f m6522.o + .comment 0x0000006e 0x6f drive.o + .comment 0x0000006e 0x6f gcr.o + .comment 0x0000006e 0x6f prot.o + .comment 0x0000006e 0x6f lz.o + .comment 0x0000006e 0x6f emmc.o + .comment 0x0000006e 0x6f diskio.o + .comment 0x0000006e 0x6f options.o + .comment 0x0000006e 0x6f Screen.o + .comment 0x0000006e 0x6f Timer.o + .comment 0x0000006e 0x6f FileBrowser.o + .comment 0x0000006e 0x6f DiskCaddy.o + .comment 0x0000006e 0x6f ROMs.o + .comment 0x0000006e 0x6f InputMappings.o + .comment 0x0000006e 0x6f xga_font_data.o + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(uspilibrary.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(dwhcidevice.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(dwhciregister.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(dwhcixferstagedata.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(usbdevice.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(usbendpoint.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(usbrequest.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(devicenameservice.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(macaddress.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(smsc951x.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(lan7800.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(string.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(util.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(usbmassdevice.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(dwhciframeschednper.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(dwhciframeschedper.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(usbkeyboard.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(dwhcirootport.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(usbmouse.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(dwhciframeschednsplit.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(usbgamepad.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(synchronize.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(usbstring.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(usbmidi.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(usbconfigparser.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(usbdevicefactory.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(usbstandardhub.o) + .comment 0x0000006e 0x6f uspi/lib/libuspi.a(keymap.o) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges + *(.debug_aranges) + +.debug_pubnames + *(.debug_pubnames) + +.debug_info + *(.debug_info .gnu.linkonce.wi.*) + +.debug_abbrev + *(.debug_abbrev) + +.debug_line + *(.debug_line) + +.debug_frame 0x00000000 0x1964 + *(.debug_frame) + .debug_frame 0x00000000 0x20 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-abs.o) + .debug_frame 0x00000020 0x2c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-aeabi_atexit.o) + .debug_frame 0x0000004c 0x2c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-cxa_atexit.o) + .debug_frame 0x00000078 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-init.o) + .debug_frame 0x000000ac 0x20 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isdigit.o) + .debug_frame 0x000000cc 0x20 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isspace.o) + .debug_frame 0x000000ec 0x48 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-malloc.o) + .debug_frame 0x00000134 0x84 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) + .debug_frame 0x000001b8 0x38 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memcmp.o) + .debug_frame 0x000001f0 0x3c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memcpy-stub.o) + .debug_frame 0x0000022c 0x40 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memmove.o) + .debug_frame 0x0000026c 0x30 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memset.o) + .debug_frame 0x0000029c 0x30 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mlock.o) + .debug_frame 0x000002cc 0x74 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-printf.o) + .debug_frame 0x00000340 0x3c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-rand.o) + .debug_frame 0x0000037c 0x2c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-realloc.o) + .debug_frame 0x000003a8 0x70 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reallocr.o) + .debug_frame 0x00000418 0x64 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reent.o) + .debug_frame 0x0000047c 0x3c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-sbrkr.o) + .debug_frame 0x000004b8 0x9c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-snprintf.o) + .debug_frame 0x00000554 0x7c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-sprintf.o) + .debug_frame 0x000005d0 0x30 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcasecmp.o) + .debug_frame 0x00000600 0x2c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcat.o) + .debug_frame 0x0000062c 0x48 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strchr.o) + .debug_frame 0x00000674 0x40 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcmp.o) + .debug_frame 0x000006b4 0x20 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcpy.o) + .debug_frame 0x000006d4 0x20 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strlen-stub.o) + .debug_frame 0x000006f4 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strncasecmp.o) + .debug_frame 0x00000728 0x3c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strncpy.o) + .debug_frame 0x00000764 0x3c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strrchr.o) + .debug_frame 0x000007a0 0x104 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strstr.o) + .debug_frame 0x000008a4 0x74 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfprintf.o) + .debug_frame 0x00000918 0x20 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-toupper.o) + .debug_frame 0x00000938 0xd8 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) + .debug_frame 0x00000a10 0x48 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vprintf.o) + .debug_frame 0x00000a58 0x40 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wsetup.o) + .debug_frame 0x00000a98 0x3c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-__atexit.o) + .debug_frame 0x00000ad4 0xac C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-dtoa.o) + .debug_frame 0x00000b80 0xa4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fflush.o) + .debug_frame 0x00000c24 0x174 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + .debug_frame 0x00000d98 0x78 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-freer.o) + .debug_frame 0x00000e10 0x80 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fwalk.o) + .debug_frame 0x00000e90 0xa4 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + .debug_frame 0x00000f34 0x74 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-makebuf.o) + .debug_frame 0x00000fa8 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memchr-stub.o) + .debug_frame 0x00000fdc 0x2c0 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + .debug_frame 0x0000129c 0x9c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-stdio.o) + .debug_frame 0x00001338 0x9c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfiprintf.o) + .debug_frame 0x000013d4 0xec C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) + .debug_frame 0x000014c0 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-writer.o) + .debug_frame 0x000014f4 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-callocr.o) + .debug_frame 0x00001528 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-closer.o) + .debug_frame 0x0000155c 0x58 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fclose.o) + .debug_frame 0x000015b4 0x98 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fputwc.o) + .debug_frame 0x0000164c 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fstatr.o) + .debug_frame 0x00001680 0x80 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fvwrite.o) + .debug_frame 0x00001700 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isattyr.o) + .debug_frame 0x00001734 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-lseekr.o) + .debug_frame 0x00001768 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-readr.o) + .debug_frame 0x0000179c 0x4c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wbuf.o) + .debug_frame 0x000017e8 0x78 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wcrtomb.o) + .debug_frame 0x00001860 0x50 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wctomb_r.o) + .debug_frame 0x000018b0 0x20 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivsi3.o) + .debug_frame 0x000018d0 0x20 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_divsi3.o) + .debug_frame 0x000018f0 0x2c C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_aeabi_uldivmod.o) + .debug_frame 0x0000191c 0x48 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivmoddi4.o) + +.debug_str + *(.debug_str) + +.debug_loc + *(.debug_loc) + +.debug_macinfo + *(.debug_macinfo) + +.debug_weaknames + *(.debug_weaknames) + +.debug_funcnames + *(.debug_funcnames) + +.debug_typenames + *(.debug_typenames) + +.debug_varnames + *(.debug_varnames) + +.debug_pubtypes + *(.debug_pubtypes) + +.debug_ranges + *(.debug_ranges) + +.stack 0x00080000 0x0 + 0x00080000 _stack = . + *(.stack) + +.ARM.attributes + 0x00000000 0x35 + *(.ARM.attributes) + .ARM.attributes + 0x00000000 0x25 armc-start.o + .ARM.attributes + 0x00000025 0x35 armc-cstartup.o + .ARM.attributes + 0x0000005a 0x35 armc-cstubs.o + .ARM.attributes + 0x0000008f 0x35 armc-cppstubs.o + .ARM.attributes + 0x000000c4 0x35 exception.o + .ARM.attributes + 0x000000f9 0x35 main.o + .ARM.attributes + 0x0000012e 0x35 rpi-aux.o + .ARM.attributes + 0x00000163 0x35 rpi-mailbox-interface.o + .ARM.attributes + 0x00000198 0x35 rpi-mailbox.o + .ARM.attributes + 0x000001cd 0x35 rpi-gpio.o + .ARM.attributes + 0x00000202 0x35 rpi-interrupts.o + .ARM.attributes + 0x00000237 0x35 cache.o + .ARM.attributes + 0x0000026c 0x35 ff.o + .ARM.attributes + 0x000002a1 0x35 interrupt.o + .ARM.attributes + 0x000002d6 0x35 keyboard.o + .ARM.attributes + 0x0000030b 0x35 Pi1541.o + .ARM.attributes + 0x00000340 0x35 DiskImage.o + .ARM.attributes + 0x00000375 0x35 iec_bus.o + .ARM.attributes + 0x000003aa 0x35 iec_commands.o + .ARM.attributes + 0x000003df 0x35 m6502.o + .ARM.attributes + 0x00000414 0x35 m6522.o + .ARM.attributes + 0x00000449 0x35 drive.o + .ARM.attributes + 0x0000047e 0x35 gcr.o + .ARM.attributes + 0x000004b3 0x35 prot.o + .ARM.attributes + 0x000004e8 0x35 lz.o + .ARM.attributes + 0x0000051d 0x35 emmc.o + .ARM.attributes + 0x00000552 0x35 diskio.o + .ARM.attributes + 0x00000587 0x35 options.o + .ARM.attributes + 0x000005bc 0x35 Screen.o + .ARM.attributes + 0x000005f1 0x35 Timer.o + .ARM.attributes + 0x00000626 0x35 FileBrowser.o + .ARM.attributes + 0x0000065b 0x35 DiskCaddy.o + .ARM.attributes + 0x00000690 0x35 ROMs.o + .ARM.attributes + 0x000006c5 0x35 InputMappings.o + .ARM.attributes + 0x000006fa 0x35 xga_font_data.o + .ARM.attributes + 0x0000072f 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-abs.o) + .ARM.attributes + 0x00000763 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-aeabi_atexit.o) + .ARM.attributes + 0x00000797 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-cxa_atexit.o) + .ARM.attributes + 0x000007cb 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-init.o) + .ARM.attributes + 0x000007ff 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isdigit.o) + .ARM.attributes + 0x00000833 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isspace.o) + .ARM.attributes + 0x00000867 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-malloc.o) + .ARM.attributes + 0x0000089b 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mallocr.o) + .ARM.attributes + 0x000008cf 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memcmp.o) + .ARM.attributes + 0x00000903 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memcpy-stub.o) + .ARM.attributes + 0x00000937 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memmove.o) + .ARM.attributes + 0x0000096b 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memset.o) + .ARM.attributes + 0x0000099f 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mlock.o) + .ARM.attributes + 0x000009d3 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-printf.o) + .ARM.attributes + 0x00000a07 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-rand.o) + .ARM.attributes + 0x00000a3b 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-realloc.o) + .ARM.attributes + 0x00000a6f 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reallocr.o) + .ARM.attributes + 0x00000aa3 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-reent.o) + .ARM.attributes + 0x00000ad7 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-sbrkr.o) + .ARM.attributes + 0x00000b0b 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-snprintf.o) + .ARM.attributes + 0x00000b3f 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-sprintf.o) + .ARM.attributes + 0x00000b73 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcasecmp.o) + .ARM.attributes + 0x00000ba7 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcat.o) + .ARM.attributes + 0x00000bdb 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strchr.o) + .ARM.attributes + 0x00000c0f 0x16 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcmp.o) + .ARM.attributes + 0x00000c25 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strcpy.o) + .ARM.attributes + 0x00000c59 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strlen-stub.o) + .ARM.attributes + 0x00000c8d 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strncasecmp.o) + .ARM.attributes + 0x00000cc1 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strncpy.o) + .ARM.attributes + 0x00000cf5 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strrchr.o) + .ARM.attributes + 0x00000d29 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-strstr.o) + .ARM.attributes + 0x00000d5d 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfprintf.o) + .ARM.attributes + 0x00000d91 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-toupper.o) + .ARM.attributes + 0x00000dc5 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfprintf.o) + .ARM.attributes + 0x00000df9 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vprintf.o) + .ARM.attributes + 0x00000e2d 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wsetup.o) + .ARM.attributes + 0x00000e61 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-__atexit.o) + .ARM.attributes + 0x00000e95 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-ctype_.o) + .ARM.attributes + 0x00000ec9 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-dtoa.o) + .ARM.attributes + 0x00000efd 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fflush.o) + .ARM.attributes + 0x00000f31 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-findfp.o) + .ARM.attributes + 0x00000f65 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-freer.o) + .ARM.attributes + 0x00000f99 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fwalk.o) + .ARM.attributes + 0x00000fcd 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-impure.o) + .ARM.attributes + 0x00001001 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-locale.o) + .ARM.attributes + 0x00001035 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-makebuf.o) + .ARM.attributes + 0x00001069 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-memchr-stub.o) + .ARM.attributes + 0x0000109d 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-mprec.o) + .ARM.attributes + 0x000010d1 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-stdio.o) + .ARM.attributes + 0x00001105 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-svfiprintf.o) + .ARM.attributes + 0x00001139 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-vfiprintf.o) + .ARM.attributes + 0x0000116d 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-writer.o) + .ARM.attributes + 0x000011a1 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-callocr.o) + .ARM.attributes + 0x000011d5 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-closer.o) + .ARM.attributes + 0x00001209 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fclose.o) + .ARM.attributes + 0x0000123d 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fputwc.o) + .ARM.attributes + 0x00001271 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fstatr.o) + .ARM.attributes + 0x000012a5 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-fvwrite.o) + .ARM.attributes + 0x000012d9 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-isattyr.o) + .ARM.attributes + 0x0000130d 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-lseekr.o) + .ARM.attributes + 0x00001341 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-readr.o) + .ARM.attributes + 0x00001375 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wbuf.o) + .ARM.attributes + 0x000013a9 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wcrtomb.o) + .ARM.attributes + 0x000013dd 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a(lib_a-wctomb_r.o) + .ARM.attributes + 0x00001411 0x18 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivsi3.o) + .ARM.attributes + 0x00001429 0x18 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_divsi3.o) + .ARM.attributes + 0x00001441 0x18 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_dvmd_tls.o) + .ARM.attributes + 0x00001459 0x18 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_aeabi_uldivmod.o) + .ARM.attributes + 0x00001471 0x34 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_udivmoddi4.o) + .ARM.attributes + 0x000014a5 0x18 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_clzdi2.o) + .ARM.attributes + 0x000014bd 0x18 C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a(_clzsi2.o) + .ARM.attributes + 0x000014d5 0x35 uspi/lib/libuspi.a(uspilibrary.o) + .ARM.attributes + 0x0000150a 0x35 uspi/lib/libuspi.a(dwhcidevice.o) + .ARM.attributes + 0x0000153f 0x35 uspi/lib/libuspi.a(dwhciregister.o) + .ARM.attributes + 0x00001574 0x35 uspi/lib/libuspi.a(dwhcixferstagedata.o) + .ARM.attributes + 0x000015a9 0x35 uspi/lib/libuspi.a(usbdevice.o) + .ARM.attributes + 0x000015de 0x35 uspi/lib/libuspi.a(usbendpoint.o) + .ARM.attributes + 0x00001613 0x35 uspi/lib/libuspi.a(usbrequest.o) + .ARM.attributes + 0x00001648 0x35 uspi/lib/libuspi.a(devicenameservice.o) + .ARM.attributes + 0x0000167d 0x35 uspi/lib/libuspi.a(macaddress.o) + .ARM.attributes + 0x000016b2 0x35 uspi/lib/libuspi.a(smsc951x.o) + .ARM.attributes + 0x000016e7 0x35 uspi/lib/libuspi.a(lan7800.o) + .ARM.attributes + 0x0000171c 0x35 uspi/lib/libuspi.a(string.o) + .ARM.attributes + 0x00001751 0x35 uspi/lib/libuspi.a(util.o) + .ARM.attributes + 0x00001786 0x35 uspi/lib/libuspi.a(usbmassdevice.o) + .ARM.attributes + 0x000017bb 0x35 uspi/lib/libuspi.a(dwhciframeschednper.o) + .ARM.attributes + 0x000017f0 0x35 uspi/lib/libuspi.a(dwhciframeschedper.o) + .ARM.attributes + 0x00001825 0x35 uspi/lib/libuspi.a(usbkeyboard.o) + .ARM.attributes + 0x0000185a 0x35 uspi/lib/libuspi.a(dwhcirootport.o) + .ARM.attributes + 0x0000188f 0x35 uspi/lib/libuspi.a(usbmouse.o) + .ARM.attributes + 0x000018c4 0x35 uspi/lib/libuspi.a(dwhciframeschednsplit.o) + .ARM.attributes + 0x000018f9 0x35 uspi/lib/libuspi.a(usbgamepad.o) + .ARM.attributes + 0x0000192e 0x35 uspi/lib/libuspi.a(synchronize.o) + .ARM.attributes + 0x00001963 0x35 uspi/lib/libuspi.a(usbstring.o) + .ARM.attributes + 0x00001998 0x35 uspi/lib/libuspi.a(usbmidi.o) + .ARM.attributes + 0x000019cd 0x35 uspi/lib/libuspi.a(usbconfigparser.o) + .ARM.attributes + 0x00001a02 0x35 uspi/lib/libuspi.a(usbdevicefactory.o) + .ARM.attributes + 0x00001a37 0x35 uspi/lib/libuspi.a(usbstandardhub.o) + .ARM.attributes + 0x00001a6c 0x35 uspi/lib/libuspi.a(keymap.o) + *(.gnu.attributes) + +.note.gnu.arm.ident + *(.note.gnu.arm.ident) + +/DISCARD/ + *(.note.GNU-stack) + *(.gnu_debuglink) + *(.gnu.lto_*) +LOAD armc-start.o +LOAD armc-cstartup.o +LOAD armc-cstubs.o +LOAD armc-cppstubs.o +LOAD exception.o +LOAD main.o +LOAD rpi-aux.o +LOAD rpi-mailbox-interface.o +LOAD rpi-mailbox.o +LOAD rpi-gpio.o +LOAD rpi-interrupts.o +LOAD cache.o +LOAD ff.o +LOAD interrupt.o +LOAD keyboard.o +LOAD Pi1541.o +LOAD DiskImage.o +LOAD iec_bus.o +LOAD iec_commands.o +LOAD m6502.o +LOAD m6522.o +LOAD drive.o +LOAD gcr.o +LOAD prot.o +LOAD lz.o +LOAD emmc.o +LOAD diskio.o +LOAD options.o +LOAD Screen.o +LOAD Timer.o +LOAD FileBrowser.o +LOAD DiskCaddy.o +LOAD ROMs.o +LOAD InputMappings.o +LOAD xga_font_data.o +LOAD C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/arm-none-eabi/lib/fpu/libc.a +LOAD C:/Program Files (x86)/GNU Tools ARM Embedded/5.4 2016q2/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a +LOAD uspi/lib/libuspi.a +LOAD c:\program files (x86)\gnu tools arm embedded\5.4 2016q2\bin\../arm-none-eabi/lib\libstdc++.a +OUTPUT(kernel.elf elf32-littlearm) diff --git a/linker.ld b/linker.ld new file mode 100644 index 0000000..1382254 --- /dev/null +++ b/linker.ld @@ -0,0 +1,235 @@ +/* Default linker script, for normal executables */ +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", + "elf32-littlearm") +OUTPUT_ARCH(arm) +ENTRY(_start) +SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib"); +SECTIONS +{ + /* Read-only sections, merged into text segment: */ + PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x01F00000)); . = SEGMENT_START("text-segment", 0x01F00000); + .interp : { *(.interp) } + .note.gnu.build-id : { *(.note.gnu.build-id) } + .hash : { *(.hash) } + .gnu.hash : { *(.gnu.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } + .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } + .rel.data.rel.ro : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) } + .rela.data.rel.ro : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) } + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } + .rel.iplt : + { + PROVIDE_HIDDEN (__rel_iplt_start = .); + *(.rel.iplt) + PROVIDE_HIDDEN (__rel_iplt_end = .); + } + .rela.iplt : + { + PROVIDE_HIDDEN (__rela_iplt_start = .); + *(.rela.iplt) + PROVIDE_HIDDEN (__rela_iplt_end = .); + } + .rel.plt : + { + *(.rel.plt) + } + .rela.plt : + { + *(.rela.plt) + } + .init : + { + KEEP (*(.init)) + } =0 + .plt : { *(.plt) } + .iplt : { *(.iplt) } + .text : + { + *(.text.startup .text.startup.*) + *(.text.unlikely .text.*_unlikely) + *(.text.exit .text.exit.*) + *(.text.hot .text.hot.*) + *(.text .stub .text.* .gnu.linkonce.t.*) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.glue_7t) *(.glue_7) *(.vfp11_veneer) *(.v4_bx) + } =0 + .fini : + { + KEEP (*(.fini)) + } =0 + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } + .rodata1 : { *(.rodata1) } + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } + PROVIDE_HIDDEN (__exidx_start = .); + .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } + PROVIDE_HIDDEN (__exidx_end = .); + .eh_frame_hdr : { *(.eh_frame_hdr) } + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table + .gcc_except_table.*) } + /* These sections are generated by the Sun/Oracle C++ compiler. */ + .exception_ranges : ONLY_IF_RO { *(.exception_ranges + .exception_ranges*) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ +/* . = ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)); */ + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } + .exception_ranges : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) } + /* Thread Local Storage sections */ + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + } + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + } + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .jcr : { KEEP (*(.jcr)) } + .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) } + .dynamic : { *(.dynamic) } + .got : { *(.got.plt) *(.igot.plt) *(.got) *(.igot) } + .data : + { + __data_start = . ; + *(.data .data.* .gnu.linkonce.d.*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + _edata = .; PROVIDE (edata = .); + __bss_start = .; + __bss_start__ = .; + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. + FIXME: Why do we need it? When there is no .bss section, we don't + pad the .data section. */ + . = ALIGN(. != 0 ? 32 / 8 : 1); + } + _bss_end__ = . ; __bss_end__ = . ; + . = ALIGN(32 / 8); + . = ALIGN(32 / 8); + __end__ = . ; + _end = .; PROVIDE (end = .); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + /* DWARF 3 */ + .debug_pubtypes 0 : { *(.debug_pubtypes) } + .debug_ranges 0 : { *(.debug_ranges) } + .stack 0x80000 : + { + _stack = .; + *(.stack) + } + .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) KEEP (*(.gnu.attributes)) } + .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) } + /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) } +} diff --git a/logo.h b/logo.h new file mode 100644 index 0000000..56c102a --- /dev/null +++ b/logo.h @@ -0,0 +1,927 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +/* Generated by bin2c, do not edit manually */ + +const long int I__logo_png_size = 14454; +const unsigned char I__logo_png[14454] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x08, 0x06, 0x00, 0x00, 0x00, 0x76, 0xE9, 0x93, + 0x49, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0E, 0xC4, 0x00, 0x00, 0x0E, + 0xC4, 0x01, 0x95, 0x2B, 0x0E, 0x1B, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9C, + 0xED, 0xDD, 0x5F, 0xA8, 0x2D, 0x57, 0x9D, 0xE0, 0xF1, 0xDF, 0x6D, 0x1A, 0x9A, 0xA6, 0x65, 0x5E, + 0x26, 0x3D, 0x86, 0x4E, 0x1E, 0x72, 0x7D, 0x90, 0x41, 0xD1, 0x16, 0x5B, 0x98, 0x41, 0x21, 0xEA, + 0xD3, 0x18, 0x93, 0xAB, 0x18, 0xD1, 0x1B, 0xD2, 0xE0, 0x9C, 0x3B, 0x0C, 0x06, 0xC5, 0xA4, 0xC1, + 0x8C, 0x83, 0xF9, 0xD3, 0x86, 0xAB, 0x26, 0x71, 0x26, 0x24, 0xD0, 0x46, 0x0C, 0x11, 0x99, 0x1C, + 0x02, 0x23, 0xB9, 0x36, 0x1A, 0xE2, 0xC9, 0x1F, 0xDF, 0x8C, 0x81, 0xA4, 0x67, 0x40, 0x9D, 0x19, + 0xC5, 0x66, 0xE8, 0x07, 0xAF, 0x0F, 0x51, 0x32, 0x43, 0x26, 0x4F, 0x69, 0x1A, 0x41, 0xC8, 0x3C, + 0x9C, 0xF3, 0xDB, 0xE7, 0xEC, 0xDF, 0xA9, 0xDF, 0x5E, 0xAB, 0xAA, 0xD6, 0x5A, 0xB5, 0x56, 0xAD, + 0xEF, 0xE7, 0xE5, 0xDE, 0xDA, 0xB5, 0x6B, 0xEF, 0x3A, 0x7B, 0xD7, 0xAE, 0xAA, 0xDF, 0x6F, 0xFD, + 0xD6, 0x5A, 0x67, 0x44, 0xE4, 0x0D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAB, 0xF6, 0x07, 0x4B, + 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1D, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x07, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xD0, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x80, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1D, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x07, 0x48, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xD0, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x80, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x07, + 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x07, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x01, 0x12, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x20, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x07, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x01, 0x12, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, + 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x07, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xD0, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1D, 0xF8, 0xC3, 0xA5, 0x77, 0x00, 0xEB, 0xF7, 0xC6, 0x1B, 0x6F, 0x44, 0x3D, 0xEF, + 0xCC, 0x99, 0x33, 0x99, 0xF7, 0x64, 0x58, 0xEC, 0xFE, 0xA1, 0x6D, 0x4B, 0x1D, 0x5F, 0xA9, 0x70, + 0x9C, 0x02, 0xA8, 0x5D, 0xEB, 0xE7, 0xD9, 0x1A, 0x71, 0xEE, 0x07, 0xDA, 0xF7, 0xF4, 0xD3, 0x4F, + 0xEF, 0x5C, 0x7F, 0xC3, 0x0D, 0x37, 0x6C, 0x3D, 0xEF, 0xDC, 0xB9, 0x73, 0x5B, 0xEB, 0xF5, 0x3C, + 0x90, 0xEA, 0x1C, 0x4B, 0x02, 0x00, 0xD9, 0xC4, 0x5E, 0xB4, 0x2E, 0x5C, 0xB8, 0x90, 0x79, 0x4F, + 0x86, 0x71, 0x51, 0xED, 0xC3, 0x52, 0xC7, 0x17, 0x00, 0xF4, 0x26, 0xF5, 0x4D, 0x2A, 0x90, 0x8B, + 0xDE, 0x1B, 0x7C, 0xFC, 0xE3, 0x1F, 0x17, 0x91, 0xE3, 0x00, 0x0C, 0x48, 0xC9, 0x3B, 0xCE, 0x34, + 0xD0, 0xD7, 0x65, 0x7D, 0xDE, 0x63, 0x8F, 0x3D, 0x26, 0x22, 0x22, 0x07, 0x07, 0x07, 0x83, 0xEB, + 0x53, 0x21, 0x01, 0x80, 0xE4, 0x6C, 0x60, 0x1D, 0xCA, 0x7A, 0x95, 0x56, 0xFB, 0xFE, 0x01, 0xBB, + 0x70, 0xBC, 0x02, 0xA8, 0x1D, 0x89, 0x80, 0xF4, 0x38, 0xF7, 0x0F, 0xB3, 0x01, 0xD2, 0xFE, 0xFE, + 0xBE, 0x88, 0x88, 0xEC, 0xED, 0xED, 0x45, 0x2D, 0x7F, 0xEF, 0x7B, 0xDF, 0xDB, 0xFA, 0x57, 0x03, + 0x35, 0x20, 0x05, 0x7B, 0x3C, 0xD9, 0x40, 0xDF, 0x5B, 0xD6, 0xED, 0xEC, 0x71, 0xAD, 0xE6, 0x9E, + 0x63, 0x49, 0x00, 0x20, 0x99, 0xDA, 0x03, 0xEB, 0xDA, 0xF7, 0x0F, 0x00, 0x80, 0x35, 0xD0, 0xEB, + 0x2B, 0x89, 0x00, 0xB4, 0x86, 0x44, 0x00, 0x72, 0xB2, 0x81, 0xBD, 0xB7, 0xAC, 0x89, 0x2D, 0xED, + 0x0A, 0x60, 0xCF, 0xA5, 0x73, 0x2B, 0x02, 0x48, 0x00, 0x60, 0xB6, 0xDA, 0x03, 0xEB, 0xDA, 0xF7, + 0x0F, 0x00, 0x80, 0x35, 0x22, 0x11, 0x80, 0x52, 0xC6, 0xB6, 0xFC, 0x87, 0x90, 0x08, 0x40, 0x4E, + 0xF6, 0xB8, 0xF2, 0x2A, 0x05, 0xBC, 0x65, 0x5B, 0x11, 0x30, 0x16, 0x09, 0x00, 0x4C, 0x56, 0x7B, + 0x60, 0x5D, 0xFB, 0xFE, 0x01, 0x00, 0xD0, 0x03, 0x12, 0x01, 0x68, 0x15, 0x89, 0x00, 0xE4, 0xE4, + 0x8D, 0x09, 0xA0, 0x34, 0xD0, 0xD7, 0x7F, 0x53, 0x9D, 0x43, 0x49, 0x00, 0x60, 0xB4, 0xDA, 0x03, + 0xEB, 0xDA, 0xF7, 0x0F, 0x00, 0x80, 0x1E, 0x91, 0x08, 0x40, 0x2E, 0xB1, 0x2D, 0xFF, 0x63, 0x2B, + 0x01, 0x14, 0x89, 0x00, 0xCC, 0x11, 0x1A, 0xFC, 0xCF, 0x76, 0x05, 0xD0, 0x31, 0x01, 0x52, 0x97, + 0xFE, 0x2B, 0x12, 0x00, 0x88, 0x56, 0x7B, 0x60, 0x5D, 0xFB, 0xFE, 0x01, 0x00, 0x00, 0x12, 0x01, + 0x68, 0x17, 0x89, 0x00, 0x4C, 0x11, 0xEA, 0xF3, 0xEF, 0x3D, 0xDF, 0x9A, 0x5B, 0xFA, 0xAF, 0x48, + 0x00, 0x20, 0xA8, 0xF6, 0xC0, 0x3A, 0xD5, 0xFE, 0xB5, 0x3E, 0x05, 0x4C, 0x2D, 0xDF, 0x4B, 0xE9, + 0xCF, 0x71, 0xEC, 0xDF, 0xAD, 0x53, 0xAB, 0x58, 0xDE, 0x7E, 0xDB, 0x1B, 0xD3, 0xB1, 0xD3, 0x47, + 0xA6, 0xDE, 0x7E, 0x8E, 0xDC, 0xDF, 0xCD, 0xDC, 0x63, 0xB0, 0xF5, 0xDF, 0x60, 0x6E, 0xB5, 0xFC, + 0xC6, 0x63, 0xD4, 0x7E, 0xAC, 0xE5, 0xD0, 0xE3, 0xDF, 0x3C, 0x17, 0x89, 0x00, 0xA4, 0x92, 0xAB, + 0xE5, 0x1F, 0x48, 0x21, 0xD4, 0xE7, 0xDF, 0x3E, 0x6E, 0x2B, 0x06, 0xB4, 0x22, 0x40, 0x97, 0x75, + 0x70, 0xC0, 0xA9, 0x48, 0x00, 0xC0, 0xD5, 0x4B, 0xE0, 0x9F, 0x9B, 0x2D, 0xE7, 0xC9, 0xF5, 0xFA, + 0xBD, 0x65, 0xA3, 0xC7, 0xFE, 0xDD, 0x36, 0xF0, 0xD7, 0x2C, 0xBE, 0x47, 0x4F, 0xBE, 0x76, 0x2E, + 0x56, 0x15, 0x3A, 0xDE, 0x52, 0x6F, 0x5F, 0xB3, 0xDA, 0x8F, 0xC1, 0x52, 0xBF, 0x41, 0x7E, 0xE3, + 0xF9, 0xF5, 0xF8, 0x59, 0xF4, 0xF0, 0x37, 0x93, 0x08, 0x00, 0x80, 0x63, 0xA1, 0xE9, 0x02, 0xF5, + 0xDE, 0xD0, 0x9B, 0x25, 0x20, 0x84, 0x04, 0x00, 0x4E, 0xA9, 0x3D, 0xB0, 0xCE, 0xBD, 0x7F, 0xA9, + 0x6F, 0x3C, 0x6C, 0xB6, 0x39, 0xF7, 0xEB, 0xD7, 0x22, 0xF7, 0x0D, 0x5C, 0xAA, 0xBF, 0xDB, 0x1B, + 0x60, 0x25, 0x96, 0xCD, 0xC2, 0x96, 0xDE, 0x7E, 0x8A, 0xDA, 0x8F, 0xC1, 0xD8, 0xFD, 0x8B, 0xBD, + 0xE0, 0x4D, 0xF9, 0x0D, 0x7E, 0xFE, 0xA9, 0xEB, 0x45, 0x44, 0xE4, 0xC1, 0x8F, 0x3C, 0x1D, 0xDC, + 0x66, 0xEA, 0x6F, 0x5C, 0xF7, 0xFF, 0xFE, 0xBB, 0x2E, 0x8B, 0x88, 0xC8, 0x9D, 0xF7, 0xBD, 0x25, + 0xEA, 0xF5, 0x5B, 0x72, 0xF2, 0xB3, 0xB0, 0x7F, 0x87, 0x57, 0xCA, 0xB8, 0xEB, 0x79, 0x2D, 0x7C, + 0x16, 0xBB, 0xBE, 0xFF, 0x5F, 0x5E, 0xBE, 0x5B, 0x44, 0x44, 0xDE, 0x7E, 0xF6, 0xAB, 0xD1, 0xAF, + 0xD7, 0xC2, 0xDF, 0x9C, 0x0A, 0x89, 0x00, 0x4C, 0x95, 0x7B, 0x0C, 0x00, 0x8B, 0xAE, 0x00, 0xC8, + 0xC1, 0x36, 0x16, 0x79, 0x89, 0x80, 0xD0, 0xAC, 0x01, 0xA1, 0x73, 0x28, 0x09, 0x00, 0x6C, 0xF4, + 0x1E, 0xF8, 0x4F, 0xC5, 0x8D, 0xCA, 0x3C, 0xB7, 0xDC, 0xB8, 0xBD, 0xFC, 0xE8, 0xF7, 0x97, 0xD9, + 0x0F, 0x9C, 0xF6, 0xA1, 0xF7, 0x7E, 0x77, 0xF0, 0xF1, 0x1F, 0xBE, 0xF4, 0xC9, 0xC2, 0x7B, 0xB2, + 0xCD, 0x9E, 0x0B, 0x52, 0xFE, 0x06, 0xF5, 0xB5, 0x6E, 0xFF, 0xC1, 0x0D, 0x5B, 0xFF, 0x6A, 0x42, + 0xE0, 0xA1, 0x8F, 0x3E, 0x93, 0xEC, 0x3D, 0xD4, 0x1D, 0xF7, 0x9E, 0x3D, 0xFA, 0xDF, 0xAF, 0x44, + 0xC4, 0x4F, 0x04, 0xB4, 0x4A, 0x6F, 0xB4, 0x2F, 0x9C, 0xBD, 0x52, 0x44, 0x44, 0x1E, 0xBB, 0xFC, + 0xCA, 0xD6, 0xE3, 0xDE, 0x0D, 0xB9, 0x3E, 0x5F, 0xCC, 0xF3, 0x5A, 0xA4, 0xBF, 0xA5, 0xDB, 0xFF, + 0x72, 0x7B, 0xD9, 0xFE, 0x96, 0xEE, 0xBB, 0x73, 0x9D, 0xC7, 0xC0, 0x58, 0xB5, 0x5C, 0xDF, 0x01, + 0x20, 0x27, 0x5B, 0xEA, 0x6F, 0x03, 0x7C, 0x6F, 0xCC, 0x00, 0xDD, 0xCE, 0xBB, 0xFF, 0x09, 0x0D, + 0x16, 0x48, 0x02, 0x00, 0xD5, 0x06, 0xD6, 0xAA, 0xD6, 0xFD, 0xD3, 0x80, 0x20, 0x47, 0x80, 0xB0, + 0x66, 0x1A, 0xF0, 0xBF, 0xFB, 0xCD, 0xEF, 0x10, 0x11, 0x91, 0x3F, 0xFB, 0xCA, 0xBF, 0xDF, 0x5A, + 0xFF, 0xEE, 0x37, 0x7F, 0x5B, 0x44, 0x44, 0x7E, 0xF6, 0x7F, 0x7E, 0x21, 0x22, 0x24, 0x04, 0x96, + 0xE0, 0x05, 0xFE, 0x6A, 0xA9, 0xA4, 0x97, 0x06, 0x47, 0x4A, 0x5B, 0xCE, 0x53, 0xB0, 0xBF, 0x67, + 0xA5, 0x15, 0x00, 0xFA, 0x38, 0x09, 0xBF, 0xF1, 0x34, 0x70, 0xBF, 0x70, 0xF1, 0x8B, 0x87, 0xFF, + 0x3A, 0x89, 0x00, 0xB5, 0x09, 0xFC, 0xCD, 0xF6, 0x2D, 0xB2, 0xC7, 0xEC, 0x0B, 0xCF, 0xFF, 0x64, + 0xF0, 0x79, 0xA1, 0xDF, 0x5C, 0xAF, 0x6C, 0x92, 0x08, 0xF0, 0x30, 0x06, 0x00, 0x5A, 0xE4, 0x05, + 0xFC, 0xD6, 0xD8, 0x16, 0xFF, 0xD0, 0x39, 0x93, 0x04, 0x40, 0xC7, 0x6A, 0x0D, 0xAC, 0x55, 0xAD, + 0xFB, 0xA7, 0x81, 0x42, 0x68, 0xFD, 0x9C, 0x44, 0xC0, 0xC3, 0x1F, 0x7B, 0x76, 0xF0, 0xF1, 0x5B, + 0x9F, 0xFC, 0xF0, 0xE4, 0xD7, 0xAC, 0x85, 0x17, 0xF8, 0xAB, 0xCD, 0xE3, 0x7F, 0xFD, 0xED, 0xA3, + 0x47, 0x7E, 0x51, 0x60, 0xAF, 0xD0, 0x12, 0x0D, 0xFC, 0x8F, 0x5B, 0xCE, 0x0F, 0xDD, 0x79, 0xDF, + 0xFC, 0xD7, 0xB6, 0x01, 0xBF, 0xFE, 0x6B, 0x1F, 0x1F, 0xC3, 0x9E, 0xCB, 0x52, 0x26, 0x2E, 0x5A, + 0xA4, 0x81, 0x7F, 0x68, 0xBD, 0x4D, 0x04, 0xAC, 0xC1, 0xB5, 0x1F, 0x78, 0x8F, 0x59, 0xFE, 0x95, + 0xF3, 0x4C, 0x00, 0xC0, 0xDA, 0xD9, 0xC0, 0xDE, 0x9B, 0x2E, 0xD0, 0x2E, 0xDB, 0xE7, 0x6B, 0x42, + 0x20, 0xB6, 0x91, 0x82, 0x04, 0x40, 0x87, 0x6A, 0x0D, 0xAC, 0x55, 0x2D, 0xFB, 0xE7, 0xF5, 0xC5, + 0x8E, 0x0D, 0x00, 0x34, 0x11, 0xF0, 0xDA, 0x93, 0xF1, 0xEF, 0xE9, 0x05, 0xFE, 0x9F, 0xFB, 0xFE, + 0x75, 0x87, 0xFF, 0xB9, 0xF1, 0x70, 0x7D, 0x8B, 0x89, 0x00, 0x6D, 0xF9, 0xD7, 0x96, 0xFD, 0x3F, + 0x0B, 0x3C, 0x5F, 0x9F, 0xA7, 0xDB, 0x51, 0x09, 0x90, 0x5F, 0xA8, 0x15, 0xF2, 0xB9, 0x17, 0x3F, + 0x51, 0x68, 0x4F, 0x76, 0xB3, 0x81, 0x7F, 0x4A, 0x5E, 0xC0, 0x3F, 0x25, 0xF0, 0xF7, 0x68, 0x79, + 0xF7, 0x8F, 0x8F, 0x5A, 0xC4, 0xDF, 0x7F, 0xCF, 0xD7, 0x92, 0xBD, 0x76, 0xCD, 0x6C, 0xE0, 0x6F, + 0x2B, 0x01, 0xEC, 0x72, 0x28, 0x51, 0xD0, 0x02, 0xFD, 0xAE, 0x43, 0xDD, 0x69, 0x74, 0xBD, 0x4D, + 0x10, 0x00, 0x88, 0x53, 0x7A, 0x0C, 0x00, 0x20, 0x25, 0x1B, 0xC8, 0x7B, 0x7D, 0xFE, 0xBD, 0xF5, + 0x63, 0xAB, 0xA4, 0x48, 0x00, 0x74, 0xA4, 0x96, 0xC0, 0xDA, 0x53, 0xDB, 0xFE, 0x69, 0xF6, 0xCC, + 0xF6, 0x09, 0xB6, 0x6C, 0xA0, 0x30, 0xA7, 0xA5, 0xD0, 0xF3, 0x8D, 0x1B, 0x9F, 0x13, 0x91, 0xE3, + 0x44, 0xC0, 0xAD, 0x0D, 0x56, 0x1F, 0x6B, 0xCB, 0xFF, 0x2D, 0x8F, 0x1C, 0x06, 0xF6, 0x37, 0x7C, + 0x6B, 0xF7, 0xF3, 0x35, 0xE0, 0x7F, 0xF4, 0x33, 0xEF, 0x38, 0x7A, 0x24, 0x6D, 0x25, 0x80, 0x9E, + 0x4C, 0xA7, 0x8E, 0xDC, 0x6E, 0xFB, 0x5F, 0x95, 0xDE, 0x3E, 0xA5, 0xB1, 0xE5, 0xC7, 0x2F, 0x7C, + 0xF9, 0x8E, 0x4C, 0x7B, 0x32, 0xCC, 0x0E, 0x96, 0x97, 0x63, 0x3F, 0xEC, 0x60, 0x7F, 0x0F, 0x1E, + 0x7D, 0x2D, 0x5A, 0xC9, 0x13, 0x3A, 0x0F, 0x0C, 0xF1, 0xBE, 0x5B, 0x2F, 0x43, 0xDF, 0x4B, 0xF7, + 0x02, 0x0D, 0xF4, 0xAF, 0xF8, 0xD4, 0xE1, 0x2D, 0xC8, 0x85, 0xC7, 0x87, 0x97, 0xD7, 0x90, 0x00, + 0x50, 0xB6, 0xAF, 0xBF, 0xFD, 0xCD, 0xE9, 0x7A, 0x2A, 0x02, 0x00, 0xA0, 0x3F, 0x5E, 0xA0, 0xEF, + 0x75, 0x09, 0xF0, 0x02, 0xFF, 0xD8, 0x44, 0x00, 0x09, 0x80, 0x0E, 0xD4, 0x16, 0x58, 0x87, 0xD4, + 0xB6, 0x7F, 0x7A, 0x33, 0x6E, 0x4B, 0xFF, 0x6D, 0xC0, 0xA0, 0xEB, 0x6D, 0xE2, 0xE0, 0xC2, 0x93, + 0xBB, 0x07, 0xE2, 0x10, 0x39, 0xDD, 0xF2, 0xFF, 0xC6, 0xEF, 0xFE, 0xF3, 0xE1, 0x6B, 0xFD, 0xD1, + 0x7F, 0xDC, 0xF9, 0xFC, 0x16, 0x2B, 0x01, 0xD4, 0xD3, 0x9F, 0xFE, 0x2B, 0x11, 0x11, 0xB9, 0xE1, + 0x5B, 0x7F, 0x33, 0xF8, 0x38, 0xF2, 0x9B, 0xDB, 0xEF, 0x78, 0x73, 0x8C, 0x07, 0x06, 0x9B, 0x99, + 0xFB, 0xFA, 0x96, 0x17, 0xF8, 0xB7, 0x3A, 0x80, 0x5A, 0xCE, 0x41, 0x0D, 0x6B, 0xA4, 0x81, 0x7E, + 0x70, 0xF9, 0x62, 0xA9, 0x3D, 0x2A, 0xC7, 0xFE, 0xE6, 0xEC, 0x60, 0x80, 0xAD, 0x1D, 0xBB, 0x40, + 0x2D, 0x68, 0xF9, 0x47, 0xCB, 0x6C, 0xA0, 0xEF, 0x4D, 0xFF, 0xA7, 0xB4, 0x11, 0x69, 0xEA, 0xF8, + 0x28, 0x24, 0x00, 0x56, 0xAC, 0xB5, 0xC0, 0xBF, 0x36, 0xF6, 0xF3, 0x4B, 0xD9, 0xA2, 0xEF, 0xBE, + 0xE7, 0x51, 0xE0, 0x7F, 0xDB, 0xB3, 0xCF, 0x8B, 0x88, 0xC8, 0xD7, 0x8F, 0xE2, 0x7B, 0x4D, 0x04, + 0x68, 0x25, 0x40, 0x4B, 0xEC, 0x28, 0xFF, 0x4A, 0x5B, 0xF8, 0x6D, 0x25, 0x80, 0x57, 0xEA, 0x3F, + 0xB7, 0x2B, 0x80, 0x4E, 0xD9, 0x33, 0xD5, 0xDC, 0xDF, 0x4F, 0x8D, 0xBF, 0xBF, 0x50, 0xAB, 0xA4, + 0x75, 0xDD, 0xFB, 0xFE, 0x56, 0x44, 0x44, 0x9E, 0x7B, 0xF1, 0xFE, 0x6C, 0xFB, 0x74, 0x92, 0xD7, + 0xD7, 0xFF, 0xDA, 0x2F, 0x1D, 0xBE, 0xBF, 0x4D, 0x04, 0xE8, 0xF3, 0xA6, 0x8C, 0x05, 0xA0, 0xBF, + 0x6F, 0x2D, 0xCB, 0xD7, 0xD7, 0xB6, 0xCB, 0x0F, 0x7E, 0xE9, 0xF0, 0x7B, 0x7C, 0x48, 0xC6, 0x07, + 0xE7, 0xDE, 0xDF, 0x63, 0x1F, 0x5F, 0xDB, 0x18, 0x01, 0xDE, 0x0D, 0xF7, 0x03, 0x17, 0x5F, 0x16, + 0x11, 0x91, 0x2F, 0xDC, 0x73, 0xF5, 0xE0, 0xB2, 0xDD, 0xBE, 0xE5, 0x81, 0xE0, 0x34, 0x39, 0xA5, + 0x83, 0x00, 0x6A, 0xA9, 0xBF, 0x2E, 0xB7, 0x9A, 0xBC, 0x02, 0x00, 0xA4, 0x17, 0x5B, 0xFA, 0xAF, + 0xC6, 0x36, 0x1C, 0x90, 0x00, 0x58, 0x21, 0x02, 0xFF, 0x34, 0x6C, 0x4B, 0x3E, 0xC6, 0xB1, 0xA3, + 0xFD, 0x2B, 0x2D, 0xE9, 0xF7, 0x06, 0x01, 0x3C, 0x78, 0xF5, 0xB0, 0x22, 0xE0, 0xB7, 0x9B, 0x41, + 0x00, 0xB7, 0x5F, 0xE7, 0x96, 0x1B, 0x0F, 0xBB, 0x02, 0xFC, 0x6E, 0xE6, 0xFE, 0xD9, 0xA9, 0x54, + 0x7A, 0xA6, 0x81, 0xBF, 0xED, 0xE3, 0xAF, 0x01, 0xBF, 0x75, 0x9C, 0x08, 0xC8, 0x33, 0x26, 0x80, + 0x06, 0x43, 0xA1, 0x80, 0xD8, 0x4B, 0x04, 0xA8, 0x31, 0x15, 0x0A, 0x5A, 0xEA, 0xFF, 0xE0, 0x1B, + 0x4F, 0xEF, 0x7C, 0xCD, 0x1C, 0xD6, 0x1A, 0xF8, 0x2B, 0xDB, 0xB7, 0x5F, 0xD9, 0x40, 0xDF, 0x2E, + 0xDB, 0xED, 0xF7, 0xD3, 0xEF, 0x5A, 0x76, 0xFA, 0xDB, 0xB2, 0xA3, 0xFF, 0x7B, 0xCB, 0xDE, 0xF4, + 0x80, 0x00, 0x76, 0x63, 0x0C, 0x00, 0xAC, 0x81, 0x37, 0xC8, 0x9F, 0xB2, 0x89, 0x81, 0xCD, 0x2C, + 0x3B, 0x23, 0x13, 0x02, 0x24, 0x00, 0x56, 0x24, 0x57, 0xE0, 0x6F, 0x0F, 0xBE, 0xDE, 0x12, 0x0A, + 0x5E, 0x17, 0x00, 0x3B, 0x2D, 0x98, 0xB7, 0x2C, 0xF2, 0xA7, 0xF1, 0xEF, 0x75, 0xD4, 0xD2, 0x6F, + 0x5B, 0xFE, 0x5B, 0x14, 0x1A, 0xED, 0x3F, 0xC4, 0xDD, 0xEE, 0x28, 0x31, 0xF0, 0x77, 0xFF, 0x34, + 0xE9, 0x65, 0x37, 0x62, 0x2B, 0x02, 0xF4, 0x79, 0x9A, 0x75, 0x1D, 0x7B, 0xFC, 0xA7, 0xDE, 0x3E, + 0x27, 0x1B, 0xF0, 0x6B, 0x80, 0xEF, 0x25, 0x02, 0x72, 0x39, 0x3D, 0xBA, 0xFF, 0x61, 0xAB, 0xA8, + 0x26, 0x06, 0x6C, 0x8B, 0xB9, 0x26, 0x02, 0xF4, 0xF1, 0x94, 0x49, 0x3B, 0x7D, 0x6D, 0xFD, 0x3D, + 0x3F, 0x95, 0xB0, 0x12, 0xC8, 0x4E, 0x11, 0xA7, 0xE6, 0x54, 0x32, 0xB4, 0xE0, 0xD5, 0xC7, 0x7F, + 0x2F, 0x22, 0xC7, 0xA5, 0xFE, 0xDE, 0xF2, 0x1A, 0xD8, 0x96, 0xFE, 0x07, 0xFF, 0xEB, 0xCF, 0x45, + 0x44, 0xE4, 0xF6, 0xBF, 0x7C, 0xE7, 0xE0, 0xB2, 0x3E, 0xFF, 0x87, 0x2F, 0x15, 0xDD, 0x4D, 0x00, + 0xC0, 0x02, 0xEC, 0x28, 0xFF, 0xA1, 0xB1, 0x00, 0xEC, 0xBD, 0xA4, 0x17, 0xE8, 0x87, 0x1A, 0x3E, + 0x48, 0x00, 0xAC, 0x40, 0xEE, 0xC0, 0xDF, 0xBE, 0x9E, 0xF7, 0xF8, 0xDA, 0x78, 0x5D, 0x00, 0xB4, + 0xA5, 0xD0, 0x9B, 0x37, 0x7C, 0x4C, 0x57, 0x01, 0x6F, 0xD4, 0xFF, 0x96, 0x03, 0x7F, 0x65, 0x03, + 0x78, 0xED, 0xDB, 0x6F, 0x2B, 0x02, 0x74, 0x50, 0x40, 0x75, 0x3C, 0xE8, 0xDF, 0x21, 0x9D, 0x0D, + 0x40, 0xC7, 0x0A, 0xD8, 0xBC, 0xEE, 0x7F, 0xF8, 0x1F, 0xC9, 0xF6, 0x15, 0xC3, 0x4A, 0x07, 0xFE, + 0x96, 0x97, 0xB9, 0x0E, 0xCD, 0x02, 0xA0, 0x89, 0x00, 0x4D, 0x1C, 0x8C, 0x69, 0xE9, 0xB1, 0x09, + 0xBF, 0x6B, 0x8F, 0x1E, 0xB7, 0xBF, 0xFB, 0x14, 0x6C, 0xCB, 0x7F, 0xCE, 0xD9, 0x0D, 0x96, 0x32, + 0xF4, 0xD9, 0x6F, 0x46, 0xFD, 0x37, 0x83, 0xFD, 0x85, 0x06, 0xFF, 0x5B, 0x43, 0x8B, 0x9D, 0x17, + 0xF8, 0x2B, 0x5B, 0x19, 0x00, 0xCC, 0x35, 0xB7, 0xFB, 0x9B, 0x67, 0x6A, 0x52, 0x3B, 0x17, 0x5A, + 0xFE, 0xD1, 0x22, 0x1B, 0xE0, 0xDB, 0xB1, 0x00, 0x6C, 0xB5, 0xAA, 0xD7, 0x15, 0xC0, 0x26, 0x02, + 0x42, 0x5D, 0xE6, 0x48, 0x00, 0x34, 0xAC, 0x74, 0xE0, 0x6F, 0xDF, 0x67, 0xED, 0x89, 0x00, 0xAF, + 0x0B, 0x80, 0x06, 0x00, 0x1A, 0x10, 0x28, 0x2F, 0x0B, 0x97, 0xF2, 0x62, 0xA3, 0x83, 0xFE, 0x79, + 0x89, 0x83, 0x16, 0xD8, 0x80, 0xDF, 0x8E, 0x11, 0x10, 0x5A, 0x9F, 0x9A, 0x77, 0x73, 0xE4, 0x8D, + 0xBC, 0x1A, 0xDA, 0xAE, 0xD4, 0xF6, 0x25, 0x95, 0xAE, 0x04, 0x98, 0x5A, 0x0A, 0xFF, 0xBE, 0x3F, + 0x3A, 0x1C, 0x50, 0x22, 0xC5, 0xB4, 0x7A, 0xFA, 0xFB, 0xD6, 0xBE, 0xFE, 0xDE, 0xEF, 0x7E, 0x8C, + 0x1E, 0x02, 0xFE, 0x5D, 0x42, 0xD3, 0xFC, 0x79, 0xD3, 0x04, 0xB6, 0xCC, 0x0B, 0xE8, 0x6D, 0xE0, + 0xAF, 0xA8, 0x00, 0x40, 0xED, 0x4A, 0x54, 0xA3, 0x01, 0xBD, 0xB0, 0xF7, 0x7A, 0x5E, 0x6C, 0x15, + 0x3B, 0x26, 0x40, 0xEC, 0x58, 0x00, 0x24, 0x00, 0x1A, 0x54, 0x4B, 0x1F, 0x7F, 0x7D, 0x5F, 0x0D, + 0x64, 0x6A, 0x0A, 0x58, 0x52, 0x7A, 0xF8, 0xFA, 0x0F, 0x8A, 0x88, 0xC8, 0x35, 0x47, 0xCB, 0xBF, + 0xBE, 0xE5, 0x4F, 0x44, 0xC4, 0xEF, 0x12, 0x60, 0x1F, 0x7F, 0xED, 0xC9, 0xF9, 0xFB, 0x60, 0x47, + 0xFB, 0x6F, 0x61, 0xF4, 0x7F, 0xED, 0xC3, 0x6F, 0x2B, 0x01, 0x6C, 0x40, 0x7F, 0xAA, 0x22, 0xE0, + 0xC6, 0xDD, 0xD3, 0xFD, 0x1D, 0x8F, 0x0D, 0xF0, 0x17, 0xB3, 0xF6, 0x4F, 0xD9, 0x2C, 0xA9, 0xFE, + 0xBE, 0x62, 0x7F, 0x57, 0x4B, 0x6F, 0x9F, 0x92, 0x17, 0xE8, 0xDB, 0x3E, 0xFF, 0xBA, 0xAC, 0x17, + 0x98, 0x5C, 0x2D, 0x2A, 0xDE, 0x85, 0xCC, 0xEB, 0x9F, 0xFF, 0xE2, 0xEF, 0x3E, 0x7D, 0xF4, 0xBF, + 0xF9, 0x09, 0x80, 0x14, 0x2D, 0xFD, 0xA1, 0xC1, 0xFD, 0xBC, 0x44, 0xC0, 0x5A, 0x47, 0xFF, 0x57, + 0xA1, 0x96, 0xB8, 0x4D, 0x9F, 0xC6, 0xA3, 0x01, 0x18, 0xD7, 0x44, 0x03, 0x7C, 0x4B, 0x13, 0x05, + 0x54, 0x00, 0xA0, 0x56, 0xB5, 0x07, 0xFE, 0xF6, 0x7C, 0x12, 0x5A, 0x06, 0x6A, 0xE2, 0xB5, 0xF0, + 0xEB, 0xBD, 0xA0, 0xAD, 0x04, 0xD0, 0xD8, 0xCB, 0x9B, 0x0E, 0x30, 0x84, 0x04, 0x40, 0x43, 0x4A, + 0x05, 0xFE, 0xB9, 0xA6, 0xF4, 0x5A, 0x2B, 0x9D, 0x0E, 0x50, 0xD9, 0xAE, 0x02, 0x73, 0x2E, 0x3A, + 0x36, 0xD0, 0xB7, 0x2D, 0xFF, 0x35, 0x27, 0x02, 0xB4, 0x74, 0x5F, 0xFB, 0xEC, 0xEB, 0xE8, 0xFD, + 0x9A, 0x00, 0xD0, 0x92, 0xFE, 0x73, 0x57, 0x6C, 0x4F, 0xFB, 0xA7, 0x83, 0x00, 0x6A, 0x97, 0x01, + 0xDD, 0xEE, 0xDD, 0x6F, 0xFE, 0xF6, 0xF6, 0xEB, 0xFE, 0xB3, 0x34, 0x09, 0x80, 0x9E, 0x8D, 0x9D, + 0x06, 0x50, 0x03, 0xFF, 0x3B, 0xFE, 0xCD, 0xCF, 0x8E, 0xFE, 0x3D, 0x0C, 0xD0, 0x52, 0xCF, 0xD7, + 0xAE, 0xA5, 0xFB, 0x77, 0xDC, 0x3B, 0xDC, 0x97, 0x5F, 0xFB, 0xE5, 0x5B, 0x2F, 0x66, 0x1C, 0x44, + 0x6F, 0x4A, 0xCB, 0xBF, 0xD7, 0xC2, 0xAF, 0x8F, 0x6B, 0xA0, 0x6F, 0xFB, 0xFA, 0xAF, 0x7D, 0x44, + 0xF8, 0xD0, 0xA8, 0xFE, 0x6B, 0xBA, 0x51, 0xB7, 0x63, 0x00, 0xC4, 0x3E, 0x9F, 0x0A, 0x00, 0xD4, + 0xA2, 0xF6, 0xC0, 0x9F, 0x7B, 0x56, 0xAC, 0x41, 0xA8, 0x85, 0xDF, 0x8E, 0x11, 0xE0, 0x5D, 0x3F, + 0x63, 0x13, 0x01, 0x24, 0x00, 0x1A, 0x50, 0xBA, 0xC5, 0x7F, 0x6C, 0x4B, 0x7E, 0xAE, 0xFE, 0x65, + 0xB5, 0xD0, 0x16, 0x7F, 0xCB, 0x06, 0xFE, 0xA7, 0x1E, 0x7F, 0xEA, 0x30, 0x11, 0x30, 0x54, 0x01, + 0xE0, 0x95, 0xF0, 0x87, 0x02, 0x7E, 0xEF, 0x79, 0x35, 0x3A, 0x0E, 0xF8, 0x77, 0xB7, 0xE8, 0xC7, + 0x96, 0xF8, 0x6B, 0xE0, 0xAF, 0xAF, 0xBB, 0xA2, 0x18, 0x01, 0x0E, 0xAF, 0x25, 0xDC, 0x6B, 0x59, + 0x4F, 0x11, 0x30, 0xDB, 0x96, 0xFF, 0x39, 0x25, 0xFF, 0x21, 0x76, 0xB6, 0x03, 0xB5, 0xD6, 0x0A, + 0x00, 0x9B, 0x28, 0x0A, 0x05, 0xFA, 0x9B, 0xB1, 0x01, 0x56, 0xD0, 0x15, 0x20, 0x16, 0x15, 0x00, + 0x28, 0x2D, 0x14, 0x30, 0xD4, 0x9E, 0x00, 0x98, 0xBB, 0x7F, 0xB9, 0x13, 0x08, 0xCC, 0x34, 0x04, + 0x91, 0x70, 0xEC, 0x66, 0x03, 0x7D, 0xFD, 0x5D, 0xEA, 0xBF, 0x1A, 0x0B, 0x9E, 0x3B, 0x77, 0x2E, + 0xC9, 0xFE, 0x90, 0x00, 0xA8, 0xD8, 0x52, 0xA5, 0xFE, 0x63, 0x4F, 0x56, 0x6B, 0x4F, 0x00, 0x58, + 0xD7, 0x3C, 0xFA, 0x8F, 0x22, 0x22, 0xF2, 0xF0, 0xA3, 0x87, 0x5D, 0x03, 0x6E, 0x7D, 0xE6, 0x47, + 0x5B, 0xEB, 0xB5, 0xCB, 0x80, 0x38, 0x89, 0x83, 0x5D, 0x5A, 0xEE, 0xDB, 0xEF, 0xD1, 0x80, 0xDD, + 0xB2, 0xD3, 0xFC, 0x85, 0x1E, 0xF7, 0x5E, 0x07, 0xE3, 0x79, 0x2D, 0xFF, 0x5E, 0xA9, 0x7F, 0x6D, + 0x6C, 0x0B, 0xBA, 0x06, 0xD2, 0x63, 0xE7, 0xC1, 0xDD, 0x25, 0x67, 0xE0, 0xEF, 0xB1, 0x7F, 0xCF, + 0x1A, 0x2A, 0x00, 0xF6, 0xF7, 0xF7, 0x4F, 0x65, 0xEB, 0xBC, 0x69, 0x01, 0xBD, 0xF5, 0xFA, 0xEF, + 0xFE, 0xFE, 0x7E, 0x73, 0xD5, 0x01, 0xA1, 0xE9, 0xFF, 0x00, 0x2C, 0x83, 0xCA, 0x01, 0x94, 0x60, + 0x5B, 0xF6, 0x6D, 0x1F, 0x7F, 0xAF, 0xF4, 0xFF, 0xE0, 0xE0, 0x60, 0x70, 0x7D, 0x2A, 0x24, 0x00, + 0x2A, 0x54, 0x5B, 0x1F, 0xFF, 0x5E, 0xD9, 0x96, 0x40, 0x0D, 0xFC, 0x63, 0xE9, 0xF3, 0x5F, 0xFB, + 0x17, 0xA7, 0xA7, 0x01, 0x1C, 0x3B, 0x98, 0x5F, 0xCB, 0x83, 0xFF, 0x69, 0x0B, 0xBF, 0x06, 0xF0, + 0xB6, 0x32, 0xC0, 0x06, 0xF6, 0xFE, 0xE3, 0x32, 0xF8, 0xF8, 0x5C, 0xF6, 0x24, 0xDB, 0xDA, 0xF6, + 0x39, 0xD8, 0x44, 0xC0, 0xE9, 0xF5, 0x87, 0xFF, 0xEA, 0x5C, 0xE5, 0xB9, 0x83, 0x32, 0x3B, 0x5D, + 0x5E, 0x6B, 0x2D, 0xE4, 0xA1, 0x41, 0x0D, 0xBD, 0xE9, 0x0B, 0xD7, 0x32, 0x0D, 0xA0, 0xB6, 0x60, + 0xFC, 0x78, 0x64, 0x9F, 0x7E, 0x4D, 0x04, 0xA4, 0x18, 0xD4, 0x71, 0x29, 0xFA, 0x1B, 0xD1, 0xA4, + 0x9B, 0xED, 0x12, 0x60, 0x97, 0xF5, 0xF9, 0x40, 0x29, 0x35, 0x5E, 0x83, 0xA6, 0xB0, 0xA5, 0xD1, + 0xB5, 0xCD, 0x06, 0xD0, 0xFB, 0x3D, 0x75, 0xAF, 0x6C, 0x55, 0xB5, 0x37, 0x78, 0x9F, 0x5D, 0xB6, + 0x5D, 0x01, 0xBC, 0xF1, 0xA2, 0xA6, 0xDE, 0x0F, 0x91, 0x00, 0xA8, 0x48, 0xEE, 0x51, 0xFD, 0x63, + 0x5F, 0xD7, 0x1E, 0x7C, 0x9E, 0xB5, 0xB6, 0xFC, 0xC7, 0x0E, 0xFE, 0xA5, 0x5D, 0x03, 0xEC, 0xB4, + 0x7F, 0xD7, 0x8C, 0x78, 0xAF, 0xB1, 0xA5, 0xFC, 0x2D, 0x94, 0xFE, 0x5B, 0x3A, 0xC8, 0x9F, 0x0D, + 0xEC, 0xBD, 0x40, 0xDE, 0x0B, 0xFC, 0x8F, 0x07, 0x0B, 0xDC, 0xDD, 0xA5, 0x60, 0x2C, 0x7B, 0x1C, + 0xCF, 0xAD, 0x80, 0x29, 0xBD, 0xFD, 0x14, 0x36, 0x28, 0xF1, 0xD4, 0x56, 0x01, 0xA0, 0x2D, 0xFF, + 0x36, 0x30, 0x3E, 0x6E, 0x29, 0x3F, 0x4C, 0x14, 0xD4, 0xD6, 0x82, 0xEE, 0x8D, 0x05, 0xA0, 0xFB, + 0xA7, 0xFB, 0xDB, 0xDB, 0xEC, 0x00, 0x36, 0xC0, 0x1F, 0x9B, 0x20, 0x68, 0x89, 0xFE, 0xE6, 0xAE, + 0xFD, 0xC0, 0xAF, 0x8E, 0xFE, 0x7D, 0xCF, 0xE0, 0x7A, 0xA0, 0xB4, 0xD0, 0xBD, 0x5C, 0xEB, 0x89, + 0x01, 0xA0, 0x26, 0x36, 0xB0, 0xF7, 0x96, 0xF5, 0x77, 0xA7, 0x25, 0xFF, 0x36, 0xE0, 0x9F, 0x5B, + 0x11, 0x40, 0x02, 0xA0, 0x02, 0xA5, 0xA7, 0xF3, 0x0B, 0x4D, 0xDF, 0xA7, 0x07, 0x9F, 0x37, 0xBA, + 0xFF, 0x5A, 0x03, 0x7F, 0x15, 0x5D, 0xFA, 0x1B, 0xD9, 0x18, 0xDF, 0x5A, 0xC9, 0x6A, 0x6A, 0x9B, + 0x59, 0x00, 0x36, 0xA5, 0xFD, 0xE3, 0x02, 0x78, 0x0D, 0xFC, 0x37, 0xAF, 0xF3, 0xC8, 0x5F, 0xED, + 0x78, 0x36, 0xC6, 0x88, 0x4D, 0x04, 0x78, 0xDB, 0xE5, 0x66, 0xFB, 0xC8, 0xC7, 0x66, 0xBA, 0xBD, + 0x44, 0x41, 0x0C, 0xFD, 0xFD, 0xA7, 0x98, 0xF6, 0xCF, 0x9B, 0x4A, 0xD4, 0xFE, 0x1D, 0x5E, 0x22, + 0x40, 0x97, 0xFF, 0xE1, 0xB7, 0x5F, 0x9E, 0xBC, 0x0F, 0x35, 0xF3, 0xA6, 0x01, 0xEC, 0xA9, 0xCF, + 0x3F, 0x80, 0x34, 0x6A, 0x6D, 0xF9, 0x07, 0x86, 0xD8, 0xD8, 0xCA, 0xAB, 0x14, 0xF0, 0x96, 0xC7, + 0x8E, 0xFA, 0x6F, 0x91, 0x00, 0x58, 0x50, 0xE9, 0xC0, 0xDF, 0xBE, 0xCF, 0xD8, 0x44, 0x80, 0x67, + 0xAD, 0xD3, 0xFF, 0x21, 0x0D, 0x3B, 0xCA, 0xFF, 0x58, 0xB7, 0x3C, 0x72, 0x94, 0x30, 0xC8, 0x1C, + 0xF8, 0xEB, 0x71, 0x3E, 0xB5, 0xB5, 0x63, 0xE9, 0xED, 0xE7, 0x98, 0x9A, 0x08, 0x28, 0x6D, 0x6C, + 0xC9, 0x9B, 0x3E, 0xBF, 0xB5, 0xBE, 0x9E, 0x9A, 0x10, 0x38, 0xDE, 0xFF, 0x25, 0xF7, 0x26, 0x1F, + 0x0D, 0xF4, 0xF7, 0xCD, 0xF2, 0x9A, 0xE9, 0x77, 0xFB, 0xCB, 0xCB, 0x77, 0x8B, 0x88, 0xC8, 0xDB, + 0xCF, 0x7E, 0x75, 0xC9, 0xDD, 0x01, 0x36, 0xBC, 0x7B, 0x3D, 0x2A, 0x00, 0x80, 0x7C, 0xBC, 0x31, + 0x01, 0x94, 0x37, 0x18, 0xE0, 0xDC, 0xAE, 0x90, 0x24, 0x00, 0x16, 0x50, 0x5B, 0x1F, 0x7F, 0xAF, + 0xA5, 0x5F, 0x79, 0x89, 0x80, 0xB5, 0x06, 0xFE, 0xB9, 0xB3, 0xC3, 0xBD, 0x64, 0x9F, 0x5B, 0xF9, + 0x3B, 0x6D, 0x16, 0x75, 0xEC, 0x88, 0xC2, 0x4B, 0x6F, 0x3F, 0x85, 0xFF, 0xDD, 0xC4, 0x95, 0xB5, + 0xEC, 0xBD, 0xD5, 0xDB, 0x3E, 0x2D, 0x0D, 0x96, 0xB4, 0x25, 0xDF, 0x9E, 0x3B, 0x43, 0xF4, 0x02, + 0x39, 0x65, 0x3E, 0x68, 0x9D, 0xBD, 0x63, 0xCA, 0x71, 0x6C, 0xB7, 0xB1, 0x09, 0x08, 0xEF, 0x35, + 0xB5, 0xA5, 0x5F, 0xD7, 0xB7, 0x96, 0xB8, 0x18, 0x72, 0xF2, 0x6F, 0xF5, 0x06, 0xFD, 0xD3, 0xE7, + 0x84, 0xD6, 0xB7, 0x22, 0x66, 0x7F, 0x1F, 0xB8, 0xF8, 0x72, 0xF4, 0x73, 0x81, 0x9C, 0x5A, 0x9F, + 0x05, 0x40, 0xC5, 0xB6, 0xFC, 0xA7, 0xAA, 0x04, 0x58, 0xEB, 0x3D, 0x30, 0xF2, 0x08, 0x0D, 0xFE, + 0xE7, 0x4D, 0xFF, 0x97, 0xBA, 0xF4, 0x5F, 0x91, 0x00, 0x28, 0xA8, 0x54, 0xE0, 0x9F, 0xEB, 0xA6, + 0x71, 0xED, 0x27, 0xBB, 0xDC, 0x37, 0xDB, 0x6B, 0xB8, 0x99, 0x8F, 0xD1, 0xCB, 0xDF, 0xD9, 0xA2, + 0xDA, 0xBF, 0x1B, 0xDD, 0x3F, 0xEF, 0xC6, 0x2C, 0xB4, 0x5E, 0x03, 0x68, 0xFD, 0x33, 0x43, 0x81, + 0x78, 0x6A, 0xB5, 0x7F, 0xBE, 0x25, 0xF5, 0xF8, 0x59, 0xF4, 0xF8, 0x37, 0x03, 0xBD, 0x59, 0xFB, + 0xBD, 0x30, 0xF2, 0x08, 0xF5, 0xF9, 0xF7, 0x9E, 0x6F, 0xCD, 0x2D, 0xFD, 0x57, 0x24, 0x00, 0x0A, + 0x28, 0xDD, 0xE2, 0x3F, 0xF6, 0xE4, 0xB4, 0xF6, 0x3E, 0xFD, 0xB1, 0x72, 0x67, 0xB9, 0x73, 0x7F, + 0xEF, 0xB9, 0xCB, 0xF4, 0x62, 0xF7, 0x9F, 0x8B, 0x63, 0xBD, 0x6A, 0x3F, 0xC6, 0x6B, 0xDF, 0xBF, + 0x5E, 0x4D, 0x39, 0xB7, 0x8C, 0xD9, 0x66, 0x2D, 0xDF, 0x4B, 0x4D, 0xC7, 0x6F, 0x68, 0xF0, 0xDF, + 0xA5, 0xD7, 0xA3, 0x1E, 0x63, 0x2B, 0xAB, 0x6A, 0x55, 0xAA, 0xE5, 0x3F, 0x54, 0x35, 0x0B, 0x88, + 0xF8, 0xD3, 0xFB, 0xE9, 0xB9, 0x50, 0x97, 0x97, 0x9A, 0xD5, 0x88, 0x04, 0x40, 0x46, 0x4B, 0x95, + 0xFA, 0xCF, 0x1D, 0x85, 0x1C, 0x69, 0xC5, 0xCE, 0xAA, 0x50, 0xAB, 0xD6, 0xF7, 0x1F, 0xF9, 0xD5, + 0x7E, 0x8C, 0xD4, 0xBE, 0x7F, 0xAD, 0x38, 0x79, 0xA3, 0x62, 0x6F, 0xAA, 0xA7, 0xD0, 0xD7, 0xE0, + 0x7B, 0xD9, 0x6D, 0xCC, 0xF1, 0xEB, 0x5D, 0xFF, 0x43, 0xF7, 0x05, 0xA5, 0xD6, 0x93, 0x08, 0xA8, + 0x47, 0x2B, 0xA5, 0xFD, 0x40, 0x8B, 0x42, 0xA5, 0xFD, 0xB6, 0x85, 0x3F, 0x55, 0xDF, 0xFE, 0x58, + 0x24, 0x00, 0x32, 0xA8, 0xAD, 0x8F, 0x3F, 0xC6, 0x49, 0xFD, 0xE3, 0x2B, 0xDD, 0xC7, 0xB3, 0xF5, + 0xFD, 0x2F, 0x45, 0x4F, 0xCA, 0x53, 0x6F, 0x82, 0x74, 0xBB, 0xA5, 0xB6, 0x9F, 0xC3, 0x3B, 0x46, + 0xBC, 0x96, 0xA0, 0xD0, 0x31, 0x95, 0xFA, 0x18, 0xE1, 0x18, 0x6E, 0x8F, 0xF7, 0x19, 0x7B, 0xAD, + 0x6E, 0xA9, 0xCA, 0x18, 0x6B, 0x14, 0x7B, 0xFC, 0xDA, 0x29, 0x67, 0xBD, 0x19, 0x27, 0xE6, 0x1C, + 0xBF, 0xB4, 0xFC, 0xC3, 0x5A, 0x6B, 0xE0, 0x5F, 0x7A, 0x0C, 0x80, 0xB5, 0x55, 0x02, 0xE8, 0xDF, + 0x13, 0x9A, 0x9F, 0xBE, 0x95, 0xE5, 0xA5, 0xCE, 0x3D, 0xF6, 0x1C, 0x68, 0x97, 0x6D, 0x62, 0x40, + 0x8F, 0xC7, 0xD2, 0x09, 0x01, 0x12, 0x00, 0x09, 0xE5, 0x1E, 0xD5, 0x3F, 0xF6, 0x75, 0x63, 0x5B, + 0x0B, 0x68, 0xF9, 0x47, 0xCF, 0xE6, 0x1E, 0xFF, 0x73, 0x7F, 0xDF, 0x35, 0xDD, 0x18, 0x87, 0x4A, + 0x40, 0x53, 0xB4, 0xF6, 0x62, 0x5D, 0xEC, 0x4D, 0xB4, 0x3B, 0x82, 0xBF, 0x73, 0xEC, 0xF4, 0x9C, + 0x94, 0xB1, 0x81, 0xBF, 0x7D, 0x7C, 0xCE, 0xD4, 0x93, 0x2A, 0x74, 0x7E, 0x59, 0x7A, 0x3D, 0xCA, + 0x5B, 0x6B, 0xE0, 0x0F, 0x2C, 0xC9, 0x56, 0x37, 0x85, 0xFA, 0xFA, 0xDB, 0x04, 0x85, 0x17, 0xE8, + 0xE7, 0x1E, 0x53, 0x86, 0x04, 0x40, 0x02, 0xA5, 0xA7, 0xF3, 0x1B, 0x3B, 0x7D, 0x9F, 0x4D, 0x04, + 0x10, 0xF8, 0xC7, 0x3B, 0x38, 0x38, 0x10, 0x11, 0x91, 0x73, 0xE7, 0xCE, 0xCD, 0x7A, 0xBC, 0x16, + 0x07, 0xAF, 0xFE, 0x8D, 0x88, 0x88, 0x5C, 0xFE, 0xD4, 0xE1, 0x10, 0xE7, 0x67, 0x1F, 0xFF, 0x98, + 0x88, 0xCC, 0x9F, 0xAA, 0x0F, 0x6D, 0x5A, 0x4B, 0xDF, 0x4F, 0x94, 0x67, 0x03, 0xFF, 0x2B, 0x3E, + 0x75, 0x78, 0x3B, 0xF1, 0xEA, 0xE3, 0xBF, 0xDF, 0x5A, 0xBE, 0xF0, 0xF8, 0x95, 0xBA, 0x81, 0x88, + 0x6C, 0x4F, 0x69, 0xD4, 0x5B, 0x12, 0xC0, 0x0B, 0xFC, 0xD5, 0x83, 0x1F, 0x39, 0xBA, 0xA6, 0x3F, + 0x75, 0x78, 0x8D, 0x9F, 0x92, 0x08, 0xF0, 0xEE, 0x0B, 0x42, 0xD7, 0xFD, 0x52, 0xEB, 0xD7, 0xD2, + 0x5A, 0xDA, 0x12, 0xFD, 0xCC, 0xD7, 0x9E, 0x94, 0x29, 0xD5, 0xF2, 0xBF, 0x56, 0xB5, 0xB4, 0xDC, + 0xA7, 0x5A, 0x2E, 0x75, 0xAE, 0xB1, 0xEF, 0x67, 0xDF, 0x57, 0x97, 0xBD, 0x31, 0x01, 0x74, 0xD9, + 0x26, 0x02, 0x72, 0x37, 0xB8, 0x90, 0x00, 0x98, 0xA1, 0x74, 0xE0, 0x6F, 0xDF, 0x67, 0x6C, 0x22, + 0xC0, 0xC3, 0x05, 0xD9, 0xA7, 0x81, 0x7C, 0x28, 0xB0, 0x6F, 0x25, 0xF0, 0x0F, 0xAD, 0xEF, 0x31, + 0x11, 0x10, 0x9B, 0x10, 0x9B, 0x9B, 0x8D, 0x6D, 0x71, 0x84, 0x70, 0x7B, 0xA1, 0xAA, 0xB1, 0x02, + 0xC0, 0x9E, 0x87, 0x97, 0x1A, 0x50, 0xA7, 0x57, 0x5E, 0xE0, 0xAF, 0xCB, 0x08, 0xD3, 0xC0, 0x5F, + 0x8F, 0xDD, 0x50, 0xA2, 0x60, 0x8C, 0x5A, 0x02, 0x7F, 0x00, 0x58, 0x23, 0x1B, 0x43, 0x79, 0xB1, + 0x59, 0xEC, 0x98, 0x00, 0xA5, 0xC6, 0x02, 0x20, 0x01, 0x30, 0x41, 0x6D, 0x7D, 0xFC, 0x43, 0x99, + 0x75, 0x2F, 0x11, 0x40, 0xE0, 0x1F, 0xCF, 0x26, 0x02, 0x54, 0xEB, 0x81, 0xBF, 0xF7, 0xFC, 0x9E, + 0x12, 0x01, 0xFC, 0x0E, 0xDA, 0x62, 0xCF, 0xBF, 0xDF, 0xFA, 0xEC, 0x3B, 0x07, 0xD7, 0x93, 0x08, + 0xC8, 0xC3, 0xB6, 0xFC, 0x6B, 0xA0, 0xFF, 0xD8, 0xE5, 0x57, 0x0E, 0x1F, 0x3F, 0x6A, 0xF1, 0xDF, + 0x2C, 0x1F, 0x3D, 0x6F, 0xD3, 0x45, 0x80, 0xEE, 0x24, 0x1B, 0x36, 0xF0, 0xB7, 0xC7, 0xF6, 0x43, + 0x32, 0xFE, 0x18, 0x5E, 0x3A, 0xA0, 0x27, 0xE0, 0xC7, 0x52, 0x4A, 0x8F, 0x01, 0xB0, 0x36, 0x5E, + 0x1F, 0x7A, 0x5B, 0x41, 0x52, 0xEB, 0xF2, 0xD2, 0x63, 0x00, 0x84, 0x46, 0xFD, 0xB7, 0x95, 0x00, + 0x7A, 0xAE, 0xD4, 0xE7, 0x97, 0xBE, 0x26, 0x92, 0x00, 0x18, 0xA1, 0x54, 0xE0, 0x9F, 0xAB, 0xA5, + 0x90, 0x40, 0x67, 0x3A, 0x1B, 0xF8, 0x7B, 0xEB, 0x6B, 0x4D, 0x04, 0xC0, 0x17, 0x7B, 0xC3, 0x1A, + 0x5B, 0x51, 0x93, 0x6B, 0xFB, 0x1C, 0xD3, 0x3C, 0x6A, 0xE0, 0xA1, 0x37, 0x42, 0xB6, 0x8F, 0xE8, + 0xD2, 0xD3, 0xD4, 0xEC, 0xA2, 0x81, 0xFF, 0xA7, 0xBF, 0xF9, 0xF3, 0xAD, 0x65, 0x94, 0xA5, 0x81, + 0xFE, 0x17, 0xEE, 0xB9, 0x5A, 0x44, 0x8E, 0x13, 0x02, 0xBA, 0xFC, 0xC0, 0xC5, 0x97, 0x45, 0x64, + 0xC7, 0x18, 0x01, 0xD8, 0xF0, 0x12, 0x01, 0x63, 0xC4, 0x26, 0xFC, 0x97, 0x5E, 0x0F, 0x00, 0x6B, + 0x12, 0x6A, 0xE1, 0xB7, 0x63, 0x04, 0x78, 0x01, 0x7F, 0xA9, 0x44, 0x00, 0x09, 0x80, 0x08, 0xA5, + 0x5B, 0xFC, 0xC7, 0x5E, 0x28, 0xC9, 0xB8, 0xE7, 0x13, 0x0A, 0xFC, 0x6B, 0xA5, 0x2D, 0xF9, 0x37, + 0xFC, 0xF3, 0xDB, 0x44, 0x44, 0xE4, 0xE9, 0xFF, 0xF7, 0xF5, 0xAD, 0xF5, 0xDA, 0xF7, 0xDF, 0xD2, + 0xE7, 0x1F, 0xBC, 0x7A, 0xB8, 0xDC, 0x53, 0x25, 0x40, 0xCF, 0x6C, 0xA0, 0xAF, 0xE7, 0xBC, 0x9A, + 0xBA, 0x2D, 0xE8, 0x3E, 0xD9, 0xC0, 0x1F, 0xE5, 0xEC, 0xED, 0xED, 0x6D, 0x02, 0x79, 0x1B, 0xF8, + 0x2B, 0xED, 0x02, 0xA0, 0xDC, 0x44, 0x00, 0xAD, 0x6F, 0x72, 0xDD, 0xFB, 0xFE, 0x56, 0x44, 0x4E, + 0x57, 0xAD, 0xDC, 0xFE, 0x83, 0xF9, 0xC9, 0x3E, 0x9B, 0xCC, 0xB3, 0xF7, 0x2D, 0xA1, 0xFB, 0x8C, + 0xB9, 0xEB, 0x43, 0xEF, 0x0F, 0xA4, 0x46, 0xCB, 0xFF, 0x3C, 0x4B, 0xF5, 0xA1, 0x4F, 0x65, 0xE9, + 0xFD, 0xB7, 0xEF, 0x67, 0x03, 0x7F, 0xDB, 0x88, 0xB3, 0x74, 0x15, 0x1C, 0x09, 0x80, 0x1D, 0x96, + 0x2A, 0xF5, 0x1F, 0xDB, 0xD2, 0x47, 0x02, 0xA0, 0x3C, 0xEF, 0x3B, 0xAA, 0xA5, 0xFC, 0x58, 0x03, + 0xF9, 0xF9, 0xDB, 0xAF, 0x3F, 0x01, 0x60, 0x4F, 0xC2, 0x9A, 0xF4, 0x89, 0xFD, 0x5D, 0x2D, 0xBD, + 0xFD, 0x1C, 0xA1, 0x96, 0xC6, 0x9A, 0xFB, 0xFE, 0x93, 0x08, 0xA8, 0x8B, 0x06, 0xF8, 0x36, 0xE0, + 0xB7, 0x09, 0x82, 0x9E, 0xE9, 0xA0, 0x7E, 0x29, 0xFB, 0xF8, 0x5B, 0xDE, 0xB5, 0xC9, 0xF6, 0x4B, + 0xCD, 0xD5, 0xC2, 0x1F, 0xFB, 0xFE, 0x00, 0xB0, 0x66, 0xA1, 0xC1, 0x0A, 0x6D, 0xE5, 0x70, 0xE9, + 0xF8, 0x81, 0x04, 0xC0, 0x80, 0xDA, 0xFA, 0xF8, 0xA3, 0x3C, 0xAF, 0xE5, 0x5F, 0x6F, 0x62, 0x6C, + 0x4B, 0xA9, 0x5D, 0xAE, 0x25, 0x11, 0x00, 0xEC, 0x62, 0x2F, 0x48, 0x2D, 0x1D, 0xB7, 0xB6, 0xF4, + 0x9F, 0xAE, 0x00, 0x68, 0xC5, 0xDF, 0xFF, 0xA7, 0x7F, 0xBB, 0xB5, 0x9C, 0xF3, 0xF7, 0x66, 0xEF, + 0x23, 0x34, 0x70, 0xB7, 0x49, 0x3D, 0x7B, 0x93, 0x3A, 0x75, 0x7D, 0xE8, 0xFD, 0x81, 0x5C, 0x18, + 0x03, 0x60, 0x9E, 0xA5, 0xFB, 0xD0, 0xCF, 0x55, 0xCB, 0xFE, 0xDB, 0x24, 0x68, 0xEC, 0x2C, 0x05, + 0xB6, 0xE2, 0x32, 0xF7, 0xFD, 0x18, 0x09, 0x80, 0x13, 0x72, 0x8F, 0xEA, 0x1F, 0xFB, 0xBA, 0xB1, + 0xE5, 0x2B, 0xB4, 0xFC, 0x2F, 0xCF, 0xFE, 0x30, 0x53, 0xF4, 0xE1, 0x4C, 0xC1, 0x96, 0xFC, 0xE7, + 0xDE, 0x0E, 0x6D, 0xF2, 0x6E, 0xDA, 0xED, 0xF1, 0x6B, 0x2F, 0x60, 0xAA, 0x44, 0xA2, 0x80, 0xD2, + 0xFF, 0x3A, 0x69, 0x29, 0x7F, 0xA8, 0xE5, 0x9F, 0x31, 0x00, 0xE2, 0x7D, 0xE8, 0xBD, 0xDF, 0x15, + 0x11, 0x91, 0x07, 0x3F, 0xF2, 0x09, 0x11, 0x99, 0x36, 0x08, 0xA0, 0x0A, 0xDD, 0x67, 0x84, 0xAE, + 0x51, 0x73, 0xD7, 0xB7, 0x16, 0x3C, 0x00, 0xC0, 0x14, 0xB6, 0xBA, 0xC9, 0x9B, 0x16, 0xD0, 0x3E, + 0xAE, 0xDB, 0x79, 0x81, 0x7E, 0xEE, 0x2E, 0x98, 0x24, 0x00, 0xA4, 0xFC, 0x74, 0x7E, 0x63, 0xA7, + 0xEF, 0x0B, 0x95, 0xDE, 0x21, 0xBD, 0xCB, 0x8F, 0x3C, 0xB8, 0xB5, 0x7C, 0xF6, 0x33, 0xB7, 0x6F, + 0x2D, 0x2F, 0x1D, 0xE0, 0x87, 0x68, 0xDF, 0x7D, 0x3B, 0x0B, 0x80, 0x7D, 0x3C, 0xF4, 0x3C, 0xAC, + 0x9B, 0x17, 0xD8, 0x8F, 0x6D, 0xE5, 0x2B, 0x29, 0x94, 0x08, 0xB8, 0xE5, 0x91, 0x5F, 0x94, 0xDC, + 0x9D, 0x6E, 0x69, 0x5F, 0x7F, 0x1D, 0xF5, 0xDF, 0x06, 0xFA, 0x5E, 0xE0, 0xAF, 0x63, 0x07, 0xF4, + 0x48, 0x03, 0x7C, 0xF5, 0xC3, 0x97, 0x3E, 0x39, 0xF8, 0xF8, 0x1C, 0xDE, 0x7D, 0x85, 0xBD, 0x6F, + 0xB0, 0x37, 0x97, 0xDE, 0x39, 0x60, 0xEC, 0xFA, 0xD0, 0xFB, 0xB7, 0xD6, 0xAF, 0x18, 0xED, 0xA0, + 0xE5, 0x7F, 0x9E, 0xA5, 0xFB, 0xD0, 0xCF, 0xB5, 0xD4, 0xFE, 0x7B, 0x01, 0xBF, 0x35, 0xB6, 0xC5, + 0x3F, 0x77, 0xD7, 0xCB, 0xAE, 0x13, 0x00, 0xA5, 0x03, 0x7F, 0xFB, 0x3E, 0x63, 0x13, 0x01, 0x9E, + 0xD6, 0x7E, 0xA4, 0x2D, 0xD2, 0x84, 0xC0, 0x19, 0xD3, 0x57, 0xC7, 0x53, 0x4B, 0x09, 0xB5, 0x0D, + 0xF0, 0x75, 0xBF, 0xB5, 0xA5, 0xDF, 0x2E, 0x13, 0xF8, 0xF7, 0x25, 0x74, 0x53, 0x6F, 0xD5, 0x72, + 0x5C, 0x8B, 0x50, 0xFA, 0xBF, 0x34, 0x1D, 0xED, 0xDF, 0x26, 0x02, 0x14, 0x2D, 0xFE, 0xD3, 0xA5, + 0x18, 0x04, 0x50, 0x79, 0xF7, 0x0F, 0xA1, 0xE4, 0xDE, 0xDC, 0xF5, 0xA1, 0xF7, 0x07, 0x80, 0x35, + 0xB0, 0x31, 0x98, 0x8D, 0xED, 0xBC, 0x65, 0xFB, 0x7C, 0xBD, 0xFF, 0x2A, 0xD5, 0x15, 0xB3, 0xCB, + 0x04, 0x40, 0x6D, 0x7D, 0xFC, 0x43, 0x99, 0xF1, 0xD8, 0x69, 0x7D, 0x90, 0x9F, 0x8E, 0x0D, 0x10, + 0xFA, 0x61, 0xD6, 0x32, 0x2D, 0xA0, 0x6D, 0xD9, 0xD7, 0xFD, 0xD6, 0xC7, 0xED, 0xB2, 0xAD, 0x0C, + 0xE8, 0x81, 0xB6, 0x06, 0x8C, 0xFD, 0x3D, 0x85, 0xB2, 0xBD, 0xB9, 0xB7, 0x4F, 0xC1, 0x56, 0x00, + 0x78, 0xD3, 0x00, 0x5A, 0x35, 0x24, 0x02, 0xE8, 0x0A, 0xB0, 0x2C, 0x0D, 0xFC, 0x43, 0x25, 0xFE, + 0xDA, 0xE2, 0x4F, 0x42, 0xE0, 0x74, 0x8B, 0xBF, 0xFE, 0xAB, 0x8F, 0xAB, 0xB7, 0xC9, 0xF4, 0x41, + 0x02, 0x63, 0x1B, 0x0C, 0xBC, 0x51, 0xFA, 0xE7, 0xAE, 0x27, 0xE0, 0xC7, 0x52, 0x6C, 0xCB, 0x7E, + 0x68, 0x19, 0xDB, 0x6A, 0xE9, 0x43, 0x3F, 0xD5, 0xD2, 0xFB, 0x6F, 0x03, 0x79, 0xAF, 0x22, 0xC1, + 0x5B, 0x5F, 0x7A, 0xB0, 0xE5, 0xAE, 0x12, 0x00, 0xA5, 0x02, 0xFF, 0x5C, 0xFD, 0x36, 0x08, 0xF8, + 0xCB, 0xD1, 0x92, 0x7F, 0xDB, 0x15, 0x40, 0xD5, 0x3E, 0x3D, 0xA0, 0x0D, 0xFC, 0xA7, 0x6E, 0xBF, + 0xA6, 0x44, 0x40, 0xA8, 0xFC, 0x2F, 0xD4, 0x52, 0x66, 0xB7, 0x1F, 0x3B, 0xCA, 0xFF, 0xDC, 0xED, + 0x73, 0x94, 0xDF, 0xDB, 0x0B, 0x90, 0xF7, 0xDE, 0x4B, 0x76, 0x79, 0xF1, 0x4A, 0xFE, 0x6D, 0x8B, + 0x3F, 0xA5, 0xFF, 0xF9, 0xED, 0xEF, 0xEF, 0x6F, 0xA6, 0xEF, 0xD3, 0x16, 0x7F, 0x3B, 0x2D, 0xA0, + 0xE5, 0xAD, 0xDF, 0xDF, 0xDF, 0xE7, 0x86, 0xFC, 0x48, 0xCA, 0x16, 0x9F, 0xD8, 0x06, 0x83, 0xD0, + 0xFD, 0xCF, 0xD4, 0xF5, 0x34, 0x58, 0xA0, 0xB4, 0x9A, 0xA6, 0xAB, 0x45, 0xBF, 0xBC, 0x40, 0xDF, + 0x3B, 0xF7, 0x79, 0x81, 0x7F, 0xA9, 0x44, 0x40, 0x57, 0x09, 0x00, 0x95, 0x3B, 0x2B, 0x34, 0xF6, + 0x42, 0x47, 0xC6, 0xBC, 0x3E, 0xDA, 0x72, 0x3F, 0x35, 0xD0, 0x5F, 0xBA, 0xE5, 0xDF, 0x4E, 0x03, + 0xA8, 0x25, 0xFE, 0x36, 0x31, 0x60, 0x97, 0x4F, 0x4F, 0x1F, 0xB8, 0x9E, 0x04, 0x80, 0x9A, 0x7B, + 0x72, 0x5D, 0x7A, 0xFB, 0x94, 0x42, 0x83, 0x56, 0xEA, 0xBE, 0x2E, 0xD9, 0xE2, 0x7F, 0x1C, 0xD8, + 0x0F, 0x97, 0xF8, 0x13, 0xF8, 0x2F, 0xCB, 0xEB, 0x02, 0x80, 0xD3, 0x6C, 0x8B, 0x7F, 0xCA, 0xBE, + 0xFF, 0x96, 0xD7, 0x42, 0xAF, 0x42, 0x83, 0x13, 0xCF, 0x5D, 0x1F, 0x7A, 0xFF, 0xB1, 0x6C, 0xB2, + 0xA8, 0x86, 0xF1, 0x48, 0x50, 0x87, 0xD8, 0xEE, 0xB2, 0xD8, 0x8D, 0x31, 0x00, 0xC6, 0xF1, 0x5A, + 0xFC, 0xF5, 0x5C, 0xA7, 0xCB, 0x35, 0x54, 0x4C, 0x0E, 0xE9, 0x32, 0x01, 0x90, 0x9B, 0x37, 0x0F, + 0xAE, 0x87, 0x93, 0x56, 0xBD, 0xC6, 0x26, 0x02, 0xC6, 0x7E, 0xF7, 0x40, 0x0D, 0xEC, 0x05, 0xAC, + 0xC6, 0x0B, 0x16, 0x81, 0x7E, 0x5D, 0x36, 0xA5, 0xFD, 0x81, 0xC0, 0xBF, 0xE7, 0x41, 0xFF, 0x3C, + 0x36, 0x11, 0x70, 0xDD, 0xFB, 0xD2, 0x25, 0x02, 0xBC, 0x6B, 0x50, 0xE8, 0xDA, 0x54, 0x6A, 0x7D, + 0xAA, 0x06, 0x18, 0x6F, 0x00, 0xD3, 0xA9, 0xCF, 0xCB, 0xB1, 0xFD, 0x92, 0xEF, 0xDD, 0x23, 0x12, + 0x01, 0x28, 0x29, 0xB6, 0xB4, 0x5F, 0xD5, 0x36, 0xCD, 0x32, 0x09, 0x80, 0x8C, 0x5A, 0xEB, 0x3F, + 0x03, 0x9F, 0xDE, 0xBC, 0xD8, 0x1F, 0x6E, 0xED, 0xB3, 0x01, 0x00, 0xBB, 0xD8, 0x0B, 0x92, 0x5E, + 0xB8, 0x6A, 0xBB, 0x50, 0xA1, 0x3E, 0xB6, 0xB4, 0x3F, 0xD4, 0x15, 0x00, 0xA7, 0xE5, 0xAC, 0x00, + 0x50, 0xA5, 0x5B, 0xFE, 0xC7, 0x4E, 0x7B, 0x3C, 0xD7, 0xD8, 0xD7, 0x9F, 0xBB, 0x3F, 0x73, 0xB6, + 0xE7, 0x9E, 0xB0, 0x0C, 0x12, 0x01, 0xD3, 0xA4, 0xEA, 0x43, 0x3F, 0xB7, 0x21, 0x6C, 0xEA, 0xFB, + 0x96, 0x1A, 0x03, 0xC0, 0x1B, 0xC4, 0xCF, 0xEE, 0x87, 0x1E, 0x87, 0x5A, 0x49, 0x59, 0x5B, 0x42, + 0x80, 0x04, 0x40, 0x84, 0xB1, 0x17, 0xB4, 0xD8, 0xF2, 0x13, 0x4E, 0x4E, 0xF5, 0xB3, 0x01, 0xBE, + 0xFD, 0xC1, 0xD6, 0x1A, 0x20, 0x79, 0xA5, 0xDD, 0x5E, 0x9F, 0x7E, 0x6F, 0xB0, 0x40, 0xF4, 0xC1, + 0x1E, 0xD7, 0x24, 0xB6, 0x10, 0x4B, 0x03, 0x7F, 0xDB, 0x15, 0xC0, 0x4B, 0x04, 0xD4, 0xD4, 0x05, + 0xA6, 0x94, 0xA9, 0x81, 0xFE, 0xE7, 0x9F, 0x3A, 0x1C, 0x0C, 0xF0, 0xB5, 0x27, 0xC7, 0x6F, 0x9B, + 0xAB, 0x8F, 0x7F, 0xAA, 0xF5, 0x48, 0x27, 0x54, 0x5D, 0xB1, 0xF6, 0xF5, 0x1E, 0x12, 0x01, 0x65, + 0xD9, 0x92, 0xF8, 0xB9, 0x6A, 0xE9, 0x82, 0x60, 0x8F, 0xBF, 0x50, 0x5F, 0x7F, 0x9B, 0x80, 0xF0, + 0x02, 0xFD, 0xA5, 0xC7, 0xAE, 0x20, 0x01, 0xB0, 0x83, 0x77, 0xD2, 0x19, 0x3B, 0x7D, 0x9F, 0x3D, + 0x88, 0x39, 0x19, 0xB5, 0xA3, 0xF5, 0x40, 0x38, 0x76, 0xFF, 0x8F, 0x13, 0x03, 0xEB, 0xEB, 0xF3, + 0x0F, 0x9F, 0x1E, 0x1F, 0x0C, 0xC6, 0x86, 0x58, 0x9B, 0x00, 0x5E, 0x07, 0x03, 0x3C, 0x4A, 0x00, + 0xE8, 0xB4, 0x80, 0x8A, 0x8A, 0x80, 0xF1, 0x81, 0xBF, 0x06, 0xFC, 0x73, 0x78, 0xF7, 0x25, 0xA1, + 0xFB, 0x8E, 0x52, 0xEB, 0x6B, 0xB9, 0xA9, 0x5F, 0x93, 0xD0, 0x8C, 0x52, 0x6B, 0x5F, 0x1F, 0x42, + 0x22, 0x20, 0xCE, 0xD4, 0x3E, 0xF4, 0x5E, 0xE0, 0x1F, 0xBB, 0xBD, 0x7E, 0x2F, 0xF6, 0xFD, 0xC7, + 0x7E, 0xDF, 0xB9, 0xC6, 0x00, 0xB0, 0xAF, 0x67, 0x5F, 0x57, 0x97, 0x43, 0xB3, 0x00, 0xD8, 0x44, + 0xC0, 0xD2, 0xC9, 0x70, 0x12, 0x00, 0x03, 0x42, 0x01, 0xBE, 0x37, 0xB7, 0xA3, 0x15, 0x7B, 0xD2, + 0xE1, 0x82, 0x08, 0x60, 0x49, 0xDE, 0x85, 0xC8, 0x56, 0x02, 0xB4, 0x9E, 0x10, 0x43, 0x3A, 0x9B, + 0xD9, 0x2D, 0x16, 0xDD, 0x8B, 0x3A, 0xA5, 0x2A, 0xED, 0x7F, 0xE8, 0xA3, 0xCF, 0x88, 0xC8, 0xBC, + 0x04, 0x5D, 0x2D, 0x81, 0x3F, 0xF2, 0xB1, 0x9F, 0xB1, 0x0D, 0x9C, 0xD6, 0xBE, 0x3E, 0x16, 0x89, + 0x80, 0x32, 0xE6, 0x06, 0xFE, 0xA1, 0xD9, 0x89, 0x4A, 0xB3, 0x7F, 0x8F, 0x17, 0xFB, 0xC5, 0x8E, + 0x09, 0xB0, 0x74, 0xE9, 0xBF, 0x22, 0x01, 0x30, 0x43, 0x6C, 0x56, 0x32, 0xF7, 0xB4, 0x38, 0xB5, + 0x9D, 0xCC, 0x5A, 0x4F, 0x68, 0xB4, 0xDE, 0x1A, 0xDA, 0xFA, 0xFE, 0x23, 0xBF, 0xD0, 0x31, 0xE2, + 0x5D, 0x78, 0x4B, 0x1D, 0x5B, 0x1C, 0xC3, 0x75, 0xE2, 0x7B, 0x89, 0x73, 0xE5, 0x5B, 0x9F, 0x9D, + 0xB4, 0xDD, 0x6B, 0x4F, 0xFE, 0xE9, 0xD6, 0xF2, 0x94, 0xCF, 0x7B, 0xE9, 0x80, 0xBE, 0xB6, 0xFB, + 0x91, 0x1E, 0xD4, 0x12, 0x88, 0x2F, 0xBD, 0x3E, 0x56, 0xAA, 0x44, 0x40, 0xEB, 0xF7, 0xBA, 0x56, + 0xA9, 0x3E, 0xF4, 0x5E, 0xE0, 0x3F, 0xF7, 0xF3, 0xCC, 0xBD, 0xFF, 0xA1, 0x51, 0xFF, 0x6D, 0x25, + 0x80, 0xFE, 0x9D, 0xDE, 0x74, 0x7F, 0x4B, 0x4B, 0x92, 0x00, 0x18, 0xDB, 0x5F, 0x74, 0xE9, 0xAC, + 0x47, 0x48, 0xAE, 0xAC, 0xD3, 0xDA, 0x4E, 0x16, 0x56, 0xEE, 0x93, 0x46, 0x6E, 0xB5, 0x64, 0x1B, + 0xA7, 0x6A, 0x7D, 0xFF, 0x91, 0x5F, 0xED, 0xC7, 0x48, 0xED, 0xFB, 0xD7, 0x2B, 0xBE, 0x97, 0x38, + 0x35, 0x7C, 0x4E, 0xB1, 0x0D, 0x0E, 0x4B, 0xAF, 0x47, 0x7A, 0xA1, 0xC0, 0x76, 0xED, 0xEB, 0xC7, + 0x9A, 0xFA, 0x7A, 0x1C, 0xCB, 0xD3, 0xE4, 0x0A, 0xFC, 0x4B, 0x09, 0xB5, 0xF0, 0xDB, 0x31, 0x02, + 0xBC, 0x80, 0xBF, 0x96, 0x44, 0xC0, 0xAC, 0x04, 0x80, 0x0D, 0xFC, 0xFF, 0xFE, 0xD7, 0x7F, 0xBD, + 0xF3, 0xF9, 0x6F, 0xBB, 0xE6, 0x2B, 0x83, 0xDB, 0x59, 0x4B, 0x27, 0x08, 0xC6, 0x1E, 0x8C, 0xB5, + 0x64, 0xBC, 0xF5, 0xA0, 0xB2, 0xAD, 0x06, 0xF6, 0x60, 0xCB, 0xB5, 0xBE, 0xF5, 0xA9, 0x6A, 0x5A, + 0xDF, 0xFF, 0x5A, 0x94, 0x9E, 0x0A, 0xB1, 0xD5, 0x84, 0xD3, 0x12, 0x72, 0x1F, 0xE3, 0x73, 0xBF, + 0x8B, 0x9C, 0x37, 0x02, 0x25, 0x8E, 0xCB, 0x16, 0x8F, 0xC5, 0x98, 0xCF, 0x65, 0xCE, 0x67, 0xD7, + 0xE2, 0x67, 0x32, 0x55, 0x4D, 0xBF, 0xAF, 0xD0, 0x6F, 0x69, 0xE9, 0xF5, 0xC8, 0x67, 0xE9, 0xEF, + 0x76, 0xE9, 0xF5, 0x63, 0x71, 0xAC, 0x1E, 0xCA, 0x15, 0x98, 0x97, 0x0A, 0xFC, 0x73, 0xBF, 0xBE, + 0xD7, 0xF7, 0xDF, 0x9E, 0x97, 0xBD, 0xC1, 0x00, 0x6D, 0xD7, 0x01, 0x9D, 0x66, 0x7C, 0x29, 0x49, + 0x2A, 0x00, 0x34, 0xF0, 0xD7, 0x00, 0x3F, 0xF6, 0x79, 0xA1, 0x84, 0xC1, 0x52, 0xC6, 0xDE, 0xEC, + 0xD4, 0x92, 0x00, 0x40, 0x9D, 0x72, 0xCF, 0xE5, 0xDB, 0x5A, 0x16, 0x35, 0x95, 0x5E, 0xFF, 0xEE, + 0x1A, 0xB5, 0xF0, 0x5D, 0x5C, 0xB8, 0x70, 0x81, 0xDF, 0x60, 0x41, 0x7C, 0x26, 0xE9, 0xF0, 0x59, + 0x02, 0x68, 0x4D, 0xEB, 0x2D, 0xFE, 0x73, 0x79, 0x63, 0x00, 0xE8, 0xF2, 0xC1, 0xC1, 0x81, 0x88, + 0x1C, 0x27, 0x02, 0x4A, 0x8F, 0x0D, 0x30, 0x29, 0x01, 0x10, 0x5B, 0xF2, 0xEF, 0x05, 0xF8, 0x36, + 0x11, 0xB0, 0x74, 0x8B, 0xBF, 0xA7, 0xB5, 0x96, 0x0B, 0x6D, 0x99, 0xF7, 0xB2, 0x54, 0x9E, 0xDA, + 0xB2, 0xB1, 0x4B, 0x4B, 0x7D, 0x3C, 0xDA, 0x8A, 0x89, 0xDC, 0xAF, 0x5F, 0x8B, 0xDC, 0xBF, 0xEB, + 0x5A, 0xFF, 0xEE, 0x16, 0x84, 0xBE, 0x9B, 0x87, 0x3F, 0x36, 0xDC, 0x87, 0xF9, 0x73, 0xDF, 0xBF, + 0x6E, 0x70, 0xFB, 0x94, 0xDF, 0x45, 0xEA, 0x84, 0xEA, 0xD0, 0xF9, 0x29, 0xF7, 0x6F, 0xB0, 0xC4, + 0xDF, 0x90, 0x5A, 0x8E, 0xDF, 0x6B, 0xAF, 0xBF, 0xD1, 0x5E, 0xCE, 0xF1, 0x00, 0xD6, 0x23, 0x55, + 0x1F, 0xFA, 0xA5, 0x02, 0xFF, 0x52, 0x63, 0x18, 0x84, 0xD8, 0x46, 0x64, 0x2F, 0x11, 0x60, 0x3F, + 0x0F, 0xDB, 0x85, 0x2C, 0x77, 0x42, 0x60, 0x56, 0x05, 0x80, 0xD7, 0xF2, 0x1F, 0x5B, 0x11, 0xA0, + 0x6A, 0x19, 0x11, 0x51, 0xC5, 0x1E, 0xAC, 0xB5, 0xB6, 0xFC, 0x2F, 0xB5, 0x5F, 0xA5, 0x4B, 0xBF, + 0x01, 0xCC, 0x63, 0xCF, 0xBD, 0x1A, 0xF8, 0x6B, 0xA0, 0xFF, 0x8D, 0x1B, 0x9F, 0xDB, 0x7A, 0xBE, + 0x5D, 0xAE, 0xD9, 0xD2, 0x37, 0x01, 0x29, 0x2C, 0xF1, 0x37, 0xCC, 0xED, 0x22, 0x06, 0x00, 0xE8, + 0xD7, 0xDC, 0xE9, 0x04, 0x5B, 0x63, 0x4B, 0xFB, 0xBD, 0x69, 0x03, 0xED, 0xE3, 0xBA, 0x9D, 0x17, + 0x03, 0xE7, 0x1E, 0x53, 0x26, 0xE9, 0x2C, 0x00, 0x5E, 0xE0, 0xEF, 0x05, 0xF6, 0x63, 0x07, 0x0F, + 0x2C, 0xC5, 0x0E, 0x0C, 0x12, 0x1A, 0xDC, 0xA6, 0x16, 0x8C, 0x01, 0x90, 0x47, 0xAE, 0x41, 0x2E, + 0xED, 0x8F, 0xDE, 0x7B, 0x9F, 0x5A, 0x12, 0x63, 0xE8, 0x8F, 0x97, 0x08, 0x28, 0x91, 0xB4, 0xF5, + 0x6E, 0x1A, 0x5A, 0x1A, 0x5C, 0xAC, 0xE6, 0x7D, 0x03, 0x00, 0x40, 0x4D, 0x0D, 0xDC, 0xBD, 0xE9, + 0xF0, 0xA6, 0xC6, 0x04, 0x53, 0x2B, 0x06, 0x96, 0xEA, 0x6A, 0xE0, 0x05, 0xFC, 0xD6, 0xD8, 0x16, + 0xFF, 0xDC, 0xC9, 0xF5, 0xAC, 0xD3, 0x00, 0x86, 0x02, 0xFF, 0x50, 0xE0, 0xB3, 0xB4, 0xD8, 0x11, + 0x42, 0x6B, 0xBB, 0xC9, 0x6B, 0x6D, 0x24, 0xD6, 0x5A, 0x4D, 0x3D, 0x2E, 0xC7, 0x06, 0x47, 0xA1, + 0xF7, 0xA9, 0xAD, 0x42, 0x06, 0xED, 0xB3, 0xC7, 0xDC, 0xA9, 0x63, 0xEC, 0xC6, 0xED, 0x4A, 0x00, + 0xE5, 0x25, 0x04, 0xD0, 0xBE, 0x50, 0x99, 0xB9, 0xB7, 0x5E, 0x1F, 0xA7, 0x12, 0xC0, 0xF7, 0xA1, + 0xF7, 0x7E, 0x57, 0x44, 0x44, 0xAE, 0xFD, 0xC0, 0x7B, 0x44, 0x44, 0xE4, 0x85, 0xE7, 0x7F, 0xB2, + 0xB5, 0xFE, 0x87, 0x2F, 0x7D, 0xB2, 0xF8, 0x3E, 0x01, 0x40, 0x4A, 0x36, 0x36, 0x98, 0xDA, 0x82, + 0x5D, 0x5B, 0x4C, 0x15, 0x62, 0xF7, 0xD7, 0x56, 0x04, 0x78, 0xCB, 0xF6, 0xF9, 0xFA, 0x79, 0x95, + 0xBA, 0xE7, 0x4F, 0x3A, 0x08, 0xA0, 0x35, 0xB6, 0x45, 0xF3, 0x97, 0x97, 0xEF, 0x16, 0x11, 0x91, + 0xB7, 0x9F, 0xFD, 0x6A, 0x8A, 0xDD, 0x4A, 0x26, 0x76, 0x5A, 0x9D, 0xA5, 0x85, 0x6E, 0xD0, 0xBC, + 0xFD, 0x4D, 0xB5, 0x7E, 0x29, 0xAD, 0x4E, 0xE1, 0x32, 0x36, 0x01, 0x46, 0x22, 0x00, 0xB9, 0xE9, + 0x31, 0xA6, 0x01, 0x7E, 0xCB, 0x5D, 0x00, 0xC6, 0xFA, 0xF1, 0xC5, 0x2F, 0x8A, 0x88, 0xC8, 0xFB, + 0xEF, 0xF9, 0xDA, 0xE0, 0x72, 0xAF, 0xF4, 0xFC, 0x7E, 0xE1, 0xEC, 0x95, 0x22, 0x22, 0x72, 0xC5, + 0xA7, 0x0E, 0x6F, 0x1B, 0x5E, 0x7D, 0xFC, 0xF7, 0x22, 0x22, 0xF2, 0xD8, 0xE5, 0x57, 0x16, 0xD9, + 0xAF, 0x16, 0xD8, 0xC0, 0xFF, 0x8E, 0x7B, 0xCF, 0x1E, 0xAE, 0xB8, 0xEB, 0xF0, 0x9F, 0x3B, 0xEF, + 0x7B, 0xCB, 0xD6, 0xF3, 0x48, 0x04, 0x00, 0x58, 0x4A, 0xAA, 0x3E, 0xF4, 0x4B, 0xDD, 0x63, 0x2F, + 0x3D, 0x06, 0x80, 0x0D, 0xE4, 0xBD, 0x8A, 0x04, 0x6F, 0x7D, 0xE9, 0x24, 0xFA, 0xAC, 0x04, 0x40, + 0xA8, 0x8F, 0xBF, 0x0D, 0x54, 0x42, 0x81, 0xCE, 0xF1, 0xEB, 0xD5, 0x95, 0x00, 0x50, 0xB5, 0x04, + 0x8E, 0x53, 0x79, 0x5D, 0x1A, 0x52, 0xAD, 0xAF, 0x5D, 0xAD, 0x7D, 0x82, 0x6B, 0xAF, 0x84, 0xC1, + 0xFA, 0x84, 0xAA, 0xB3, 0x7A, 0x6C, 0xE9, 0x0F, 0x05, 0xFA, 0xBD, 0x26, 0x04, 0x34, 0xF0, 0x57, + 0x0F, 0x5C, 0x7C, 0x79, 0x78, 0x3D, 0x95, 0x00, 0xAE, 0x4D, 0x8B, 0xBF, 0x09, 0xFC, 0x95, 0x06, + 0xFE, 0x24, 0x02, 0x00, 0xA0, 0x4D, 0x5E, 0xA0, 0xEF, 0xC5, 0x4C, 0x5E, 0xE0, 0x5F, 0xEA, 0x1A, + 0x9A, 0x64, 0x10, 0x40, 0x2B, 0x94, 0x18, 0xF0, 0x02, 0x9D, 0x5A, 0xA7, 0x05, 0x6C, 0x85, 0x1E, + 0x34, 0xF6, 0x60, 0xB3, 0x07, 0x53, 0xAE, 0xF5, 0x4B, 0x8F, 0x01, 0xF0, 0xEE, 0xFF, 0xFB, 0xEB, + 0x45, 0xDF, 0x7F, 0xAA, 0xB1, 0x95, 0x32, 0x54, 0x02, 0x20, 0x15, 0x7B, 0xEC, 0xD9, 0xC1, 0x00, + 0xDF, 0xF9, 0xAE, 0x17, 0xB6, 0xD6, 0x5F, 0xFB, 0xA5, 0xFB, 0xB7, 0x96, 0x6F, 0x5D, 0xC1, 0x21, + 0xE8, 0xB5, 0xFC, 0x5B, 0xBD, 0x05, 0xFE, 0x96, 0xB6, 0xF4, 0x7F, 0xE1, 0x9E, 0xAB, 0xB7, 0x1E, + 0xD7, 0x84, 0xC0, 0xF1, 0xE3, 0x7B, 0x22, 0xD2, 0x77, 0x22, 0xC0, 0x2B, 0xF9, 0xB7, 0xA5, 0xFF, + 0xA1, 0xED, 0x49, 0x04, 0x00, 0x28, 0xA5, 0xF5, 0xE9, 0xFA, 0x96, 0xDE, 0xFF, 0xD8, 0x19, 0xD8, + 0xEC, 0x20, 0x80, 0xCA, 0x36, 0x52, 0xEA, 0x7A, 0xDB, 0x48, 0x98, 0xEA, 0xDE, 0x3F, 0x6B, 0x05, + 0x80, 0xC7, 0xAB, 0x0C, 0xA8, 0xBD, 0x02, 0x00, 0x28, 0xE1, 0xE1, 0xEB, 0x3F, 0x28, 0x22, 0xC7, + 0xBF, 0x0B, 0x5D, 0xBE, 0xF5, 0x99, 0x1F, 0x2D, 0xB6, 0x4F, 0x58, 0x17, 0x2F, 0xE9, 0x64, 0xA7, + 0xFF, 0xFB, 0xF9, 0xFF, 0xBC, 0x76, 0x6B, 0x59, 0x97, 0x96, 0xA8, 0x0C, 0x08, 0x0D, 0xCA, 0x3A, + 0xF5, 0x62, 0x6F, 0x03, 0x7F, 0x5B, 0xE2, 0x6E, 0x13, 0x02, 0xBD, 0x26, 0x02, 0x6C, 0xE0, 0xEF, + 0x3D, 0xAE, 0xCB, 0x1D, 0xC7, 0xFF, 0xA7, 0x02, 0x7F, 0xAF, 0xEF, 0x7F, 0x68, 0x7B, 0x91, 0xEF, + 0x1E, 0xFD, 0x3B, 0x3C, 0x2D, 0x27, 0x00, 0xA0, 0x4D, 0xB1, 0x5D, 0x03, 0xF4, 0x7E, 0x2D, 0xF5, + 0xAC, 0x00, 0x59, 0x2B, 0x00, 0xC6, 0x96, 0x34, 0x53, 0x01, 0x30, 0x8F, 0xED, 0x8B, 0x1F, 0x3B, + 0x22, 0x65, 0xAE, 0xF5, 0xAD, 0xB3, 0x81, 0xB7, 0x5D, 0xF6, 0xB2, 0x72, 0xA9, 0x4A, 0xF9, 0xF5, + 0xFD, 0xBC, 0xFD, 0x01, 0x52, 0xB1, 0x2D, 0xFF, 0x1E, 0x0D, 0xFC, 0x6F, 0x7D, 0xF2, 0xC3, 0x5B, + 0xCF, 0xFF, 0xE9, 0x26, 0x50, 0x49, 0x2F, 0x14, 0xE0, 0x87, 0x66, 0x6D, 0x09, 0xF1, 0x02, 0x7F, + 0xBB, 0x3C, 0x66, 0x6C, 0x00, 0x2F, 0xC3, 0xBF, 0x26, 0xDE, 0xE7, 0xA4, 0xCB, 0x3D, 0xD3, 0xBE, + 0xFE, 0x2F, 0xBC, 0xEF, 0x27, 0x5B, 0xCB, 0xDA, 0x05, 0x40, 0x9C, 0xDF, 0x8B, 0x37, 0x56, 0xC0, + 0x3F, 0xFC, 0x96, 0x04, 0x00, 0x80, 0xBC, 0x96, 0xEE, 0x43, 0x3F, 0x57, 0x2B, 0xFB, 0xEF, 0x0D, + 0x02, 0xA8, 0xBC, 0xC4, 0x80, 0xAD, 0xAA, 0x9B, 0x5B, 0x11, 0x90, 0xE4, 0x4A, 0xAD, 0x01, 0xBF, + 0x0D, 0xE0, 0xC7, 0x96, 0x30, 0xA7, 0x1A, 0xFC, 0xCF, 0x0E, 0x5A, 0xB7, 0xE6, 0x9B, 0xB0, 0x21, + 0x4B, 0x8D, 0xCE, 0xBF, 0x96, 0xCF, 0xF9, 0xEB, 0x1F, 0xFE, 0x80, 0x88, 0x88, 0xBC, 0xFE, 0xAE, + 0xFF, 0x22, 0x22, 0xC7, 0x81, 0xB7, 0x5D, 0x4E, 0x85, 0x31, 0x00, 0xD0, 0x0A, 0xED, 0x12, 0xF0, + 0x70, 0x81, 0x16, 0xC9, 0xD8, 0x69, 0x58, 0x6D, 0x22, 0x72, 0xEE, 0xF9, 0xCF, 0x0B, 0x60, 0xA7, + 0x8C, 0x01, 0x50, 0xEB, 0x0D, 0xC8, 0x18, 0x9B, 0xD2, 0x7F, 0xB9, 0x7A, 0xE7, 0xE3, 0x76, 0x79, + 0xE9, 0xC1, 0x61, 0x6B, 0x74, 0x3A, 0x11, 0x30, 0xBC, 0xFE, 0xFE, 0xBB, 0x2E, 0x17, 0xDA, 0x23, + 0x00, 0x40, 0x4E, 0x76, 0x16, 0x80, 0xD0, 0x58, 0x01, 0x36, 0x81, 0xA1, 0x81, 0xBF, 0x8D, 0x9D, + 0xE7, 0x56, 0x04, 0x64, 0x4D, 0xD5, 0x7B, 0x81, 0x7E, 0xEE, 0x80, 0x47, 0x3F, 0x2C, 0x2F, 0x5B, + 0xB2, 0x56, 0xFA, 0xF7, 0xDA, 0x1B, 0x2F, 0xFB, 0x39, 0xE4, 0x5A, 0xBF, 0xF4, 0x18, 0x00, 0x6B, + 0x11, 0x6A, 0xE1, 0xA7, 0xEF, 0x3F, 0x72, 0xD3, 0x40, 0xDF, 0x76, 0x01, 0x38, 0x0E, 0x7E, 0xB7, + 0x83, 0xE0, 0x35, 0x06, 0x7B, 0xDA, 0xA2, 0x0D, 0x8C, 0x65, 0x03, 0x78, 0x5D, 0xD6, 0x00, 0x7F, + 0x93, 0x08, 0x30, 0xEB, 0xED, 0x76, 0xDA, 0x65, 0xE0, 0xCA, 0xB7, 0x66, 0xD9, 0x4D, 0x00, 0xD8, + 0x58, 0xBA, 0x0F, 0xFD, 0x5C, 0xB5, 0xEE, 0xBF, 0xDD, 0x1F, 0x6F, 0xAC, 0x00, 0x6F, 0x16, 0x01, + 0xFB, 0x3A, 0x6A, 0xEE, 0x38, 0x3B, 0x49, 0x13, 0x00, 0xB6, 0x12, 0x60, 0x6A, 0x57, 0x00, 0xCC, + 0x13, 0x6A, 0x09, 0xCB, 0xBD, 0xBE, 0x17, 0xDE, 0x5C, 0xEA, 0x73, 0x5F, 0xC7, 0x93, 0x6B, 0x20, + 0x10, 0xF4, 0x6B, 0xEC, 0x31, 0xA4, 0x25, 0xFF, 0xDA, 0x05, 0x20, 0x27, 0xAF, 0xB4, 0x3F, 0x76, + 0x96, 0x12, 0x9B, 0x75, 0x1F, 0xCB, 0xEB, 0x02, 0x10, 0x23, 0xD5, 0xB9, 0xB1, 0x86, 0x1B, 0x18, + 0x1D, 0xE5, 0xDF, 0x0E, 0xF6, 0xA7, 0xFF, 0xDA, 0xC7, 0xED, 0x2C, 0x01, 0x3D, 0xF2, 0xFA, 0xFA, + 0x87, 0x5A, 0xF6, 0xED, 0x76, 0x3A, 0x08, 0xE0, 0xDE, 0x5B, 0xF7, 0x92, 0xEC, 0x17, 0x00, 0xA0, + 0x2C, 0x7B, 0x1D, 0xF7, 0xEE, 0x4D, 0xBC, 0xCA, 0x00, 0xE5, 0x55, 0x02, 0x4C, 0x95, 0x64, 0x10, + 0x40, 0x1B, 0xF0, 0x7B, 0x5D, 0x02, 0xBC, 0xED, 0x09, 0x64, 0xD2, 0xF0, 0x5A, 0xE1, 0x6C, 0x97, + 0x88, 0x5C, 0xEB, 0xD7, 0xE2, 0xB6, 0x67, 0x9F, 0x17, 0x11, 0x91, 0xAF, 0xCB, 0xBF, 0x13, 0x91, + 0xD3, 0x63, 0x00, 0xE8, 0xFA, 0xDB, 0x0A, 0x1D, 0xB7, 0x5E, 0xC5, 0x4C, 0xAE, 0x81, 0x41, 0xD0, + 0x1F, 0x6F, 0xF0, 0x3F, 0xAF, 0x12, 0xA0, 0x86, 0x44, 0x80, 0x9A, 0x3B, 0x08, 0xA0, 0xCE, 0x6C, + 0xF0, 0xC2, 0x97, 0xEF, 0x10, 0x91, 0xD3, 0x81, 0xFF, 0x1C, 0x73, 0x03, 0xF8, 0xB9, 0x49, 0x8C, + 0x31, 0x6C, 0x05, 0x99, 0x9D, 0xFE, 0xCF, 0x26, 0x02, 0x42, 0x8F, 0xF7, 0xCC, 0x4E, 0xEB, 0x67, + 0x03, 0x7B, 0x3B, 0x28, 0x20, 0xA3, 0xFD, 0x03, 0x58, 0x5A, 0x2B, 0x7D, 0xE8, 0x3D, 0xB5, 0xEF, + 0xBF, 0xD7, 0xC2, 0xAF, 0xFB, 0x69, 0x1B, 0x2F, 0xF4, 0xDE, 0x26, 0x75, 0xE9, 0xBF, 0x9A, 0x94, + 0x00, 0x88, 0x2D, 0xE1, 0xB7, 0xB3, 0x04, 0xD8, 0x44, 0x81, 0xF2, 0xA6, 0xA2, 0x42, 0x5A, 0xA1, + 0x1B, 0xE5, 0xB9, 0xEB, 0xD7, 0x46, 0xFB, 0xFC, 0x6F, 0x5A, 0x6D, 0x8E, 0x96, 0xEF, 0x7B, 0x57, + 0xDC, 0xF6, 0x76, 0xAE, 0xE7, 0xB1, 0x42, 0xBF, 0x33, 0x5D, 0xDF, 0x7A, 0x02, 0xE6, 0xBE, 0x3B, + 0x7F, 0xB5, 0xB5, 0x3C, 0xF7, 0x73, 0x43, 0x3A, 0xA1, 0x44, 0x40, 0x49, 0x5E, 0xE5, 0x51, 0xAA, + 0xF3, 0x91, 0x4D, 0x04, 0xA8, 0x5E, 0x47, 0xFD, 0x57, 0xDA, 0xB7, 0x5F, 0x03, 0x7D, 0x9B, 0x18, + 0xD0, 0x84, 0xC9, 0x85, 0xC7, 0xAF, 0xDC, 0x7A, 0xFE, 0xFE, 0xFE, 0x7E, 0xF3, 0xE7, 0xA6, 0xB9, + 0x6C, 0x22, 0x80, 0xC0, 0x1F, 0x00, 0xFA, 0x14, 0x1A, 0xF5, 0xDF, 0x8E, 0x11, 0xE0, 0x95, 0xF8, + 0xA7, 0x9A, 0x62, 0x37, 0xEB, 0x20, 0x80, 0xDE, 0xF3, 0x14, 0xA3, 0xFE, 0xA7, 0xA5, 0x07, 0x85, + 0xBD, 0x21, 0xB6, 0x07, 0x4B, 0xAE, 0xF5, 0x4B, 0x8F, 0x01, 0xD0, 0xDA, 0xE8, 0xF8, 0xA1, 0x04, + 0x5A, 0x28, 0xF0, 0x6F, 0x9D, 0x0D, 0xFC, 0xED, 0xE3, 0x24, 0x02, 0xF2, 0x19, 0x7B, 0x0C, 0x69, + 0xE0, 0x5F, 0xA2, 0xC5, 0xBF, 0x14, 0x12, 0xCF, 0xF3, 0x30, 0xDA, 0x7F, 0xBC, 0xE3, 0x69, 0xFD, + 0x80, 0xF2, 0xD6, 0x32, 0x40, 0x33, 0xF2, 0xAA, 0xB5, 0x0F, 0x7D, 0xAC, 0xDA, 0xF6, 0xDF, 0x56, + 0xF0, 0x79, 0x83, 0xFB, 0xD9, 0xD2, 0xFE, 0x73, 0xE7, 0xCE, 0x6D, 0xBD, 0x4E, 0xAA, 0x80, 0xDF, + 0x9A, 0x75, 0x05, 0xB7, 0x2D, 0x94, 0x36, 0xC0, 0x0F, 0x6D, 0x07, 0xA4, 0x90, 0x2B, 0xF1, 0xA0, + 0x01, 0xA8, 0x17, 0xA8, 0x86, 0xB6, 0xF3, 0x78, 0x81, 0xFD, 0xBD, 0x2F, 0xFD, 0x54, 0x44, 0x44, + 0xEE, 0x7A, 0xEF, 0x5F, 0xEC, 0x5C, 0xFF, 0xD5, 0x17, 0x0F, 0x5B, 0x8F, 0xEE, 0x7E, 0x1F, 0x37, + 0x95, 0x98, 0x27, 0x34, 0xED, 0x5F, 0x0F, 0xB8, 0x1E, 0xED, 0xA6, 0x2D, 0xFE, 0xDA, 0xB2, 0xBF, + 0x71, 0x71, 0xF8, 0xF9, 0xB9, 0x6E, 0x56, 0x5A, 0xA4, 0x2D, 0xFF, 0xCA, 0x9B, 0x0E, 0x50, 0x2B, + 0x01, 0x48, 0x7E, 0x02, 0xC0, 0x3A, 0xD8, 0x16, 0x7E, 0xBB, 0x7C, 0x70, 0x70, 0x20, 0x22, 0xA7, + 0xBB, 0x06, 0x94, 0x92, 0x24, 0x85, 0xCF, 0x0D, 0x54, 0x1D, 0x6C, 0xB9, 0x65, 0x68, 0xD0, 0xAC, + 0xDC, 0xEB, 0x4B, 0xC9, 0xDD, 0xCF, 0x47, 0x6F, 0xC6, 0x74, 0x7A, 0xC0, 0xCD, 0x18, 0x01, 0x47, + 0xCB, 0x73, 0x69, 0x60, 0x6F, 0x97, 0x35, 0x11, 0x60, 0xD7, 0xAF, 0x81, 0xBD, 0xD1, 0x1D, 0x5A, + 0xBE, 0xEF, 0xCE, 0x5F, 0x71, 0x23, 0x9C, 0x89, 0x26, 0xA1, 0xBE, 0x71, 0xE3, 0x73, 0x22, 0x72, + 0xBA, 0x65, 0xDF, 0x4B, 0x0C, 0x94, 0xEC, 0xFB, 0x9F, 0x1B, 0xD7, 0xAD, 0x71, 0xBC, 0xD2, 0x7F, + 0xB5, 0x19, 0x33, 0xE1, 0xE8, 0x3A, 0x44, 0x22, 0xE0, 0xB8, 0xE5, 0x3F, 0x34, 0xBD, 0x9F, 0x9E, + 0xFF, 0xF4, 0x79, 0x2F, 0x3C, 0x7F, 0x98, 0x18, 0x78, 0xEE, 0xC5, 0x4F, 0x88, 0x08, 0xE3, 0xBC, + 0x20, 0x8D, 0xDA, 0xFA, 0x44, 0xA3, 0x2E, 0xA1, 0x80, 0xB5, 0xB5, 0xE5, 0xA5, 0x8E, 0x77, 0x5B, + 0x71, 0xE3, 0xED, 0xA7, 0xED, 0x0A, 0xE0, 0xCD, 0x5C, 0x97, 0xEB, 0x5E, 0x85, 0x1A, 0xBE, 0x08, + 0xF6, 0xCB, 0xAC, 0xFD, 0x24, 0xBA, 0xD4, 0xE8, 0xFC, 0x6B, 0x2D, 0x33, 0xB3, 0x81, 0xBE, 0x4D, + 0x04, 0x8C, 0x65, 0x7F, 0xCC, 0xDA, 0xA2, 0x1F, 0x6B, 0x8D, 0x2D, 0xFF, 0x04, 0xFA, 0xCB, 0xF8, + 0xDC, 0xF7, 0xAF, 0x13, 0x11, 0x91, 0x5B, 0x8F, 0x0E, 0x49, 0x1B, 0xF8, 0x6B, 0xA0, 0x49, 0x4B, + 0xE2, 0x15, 0x00, 0x00, 0x18, 0x1C, 0x49, 0x44, 0x41, 0x54, 0x4F, 0xA5, 0x00, 0x94, 0x1D, 0x24, + 0x91, 0xAE, 0x00, 0xBE, 0xCD, 0xE0, 0x7F, 0x77, 0x0D, 0x3F, 0xAE, 0x2D, 0xFF, 0x3F, 0x7C, 0xE9, + 0xF0, 0xF1, 0x3B, 0xEF, 0xDB, 0x7E, 0x9E, 0x5E, 0x2A, 0x7A, 0x1F, 0x4B, 0x01, 0x00, 0x6A, 0x65, + 0x4B, 0xFD, 0xBD, 0x69, 0xFF, 0xEC, 0xE3, 0xBA, 0x9D, 0x96, 0xFC, 0xE7, 0x1A, 0xEC, 0xCF, 0xC3, + 0x95, 0x7B, 0x07, 0x6F, 0x04, 0xE6, 0x92, 0x23, 0x33, 0x8F, 0x61, 0x47, 0x71, 0xB6, 0x8F, 0xAB, + 0x5C, 0xEB, 0x97, 0x1E, 0x03, 0x20, 0x97, 0xA9, 0x81, 0x7E, 0x2C, 0x2F, 0xA0, 0xBF, 0x3B, 0xEB, + 0xBB, 0xD6, 0x61, 0xA8, 0x95, 0x7F, 0x6C, 0x97, 0x0B, 0x8C, 0x17, 0xCA, 0x28, 0x7B, 0x81, 0x7F, + 0xC9, 0x96, 0xFF, 0xD8, 0x84, 0x62, 0xCD, 0x89, 0xC7, 0x9A, 0xF7, 0xCD, 0xB3, 0x39, 0xDF, 0x3B, + 0xB3, 0x01, 0xD8, 0xC0, 0x5F, 0x97, 0x4F, 0x0E, 0xFE, 0x87, 0x43, 0xC7, 0x83, 0xFC, 0x7D, 0xD7, + 0x2C, 0x03, 0x40, 0x5D, 0x6A, 0x69, 0xB9, 0x4F, 0xB5, 0x5C, 0xAA, 0x3A, 0xD9, 0x0B, 0xF8, 0x2D, + 0xFB, 0xB8, 0x0D, 0xF0, 0xBD, 0x69, 0xFF, 0x72, 0x21, 0x01, 0x30, 0x20, 0x14, 0xE0, 0xEB, 0xE3, + 0xB5, 0x26, 0x02, 0xBC, 0xD1, 0xB2, 0x4B, 0xAD, 0x07, 0xC6, 0x38, 0x99, 0x04, 0x20, 0xF8, 0x5F, + 0x56, 0xA8, 0xC5, 0xBF, 0x44, 0x17, 0x80, 0x35, 0x24, 0x12, 0xD7, 0xF0, 0x37, 0x84, 0xA4, 0x98, + 0x26, 0xB1, 0x17, 0x04, 0xFE, 0x00, 0xB0, 0x4E, 0x36, 0xB0, 0xB7, 0xB1, 0xA1, 0xB7, 0xAC, 0xBC, + 0xC1, 0x00, 0x73, 0x77, 0x53, 0x24, 0x01, 0x30, 0x83, 0x7E, 0x99, 0xB5, 0x4C, 0x8F, 0xE7, 0x95, + 0x09, 0xEA, 0xE3, 0xDE, 0xFE, 0xA5, 0x5A, 0xBF, 0x16, 0xB9, 0xFF, 0x9E, 0xB5, 0x7D, 0x5E, 0x68, + 0x4F, 0xE8, 0x18, 0xFC, 0xA9, 0x7C, 0x77, 0xE7, 0xFA, 0x9C, 0xC7, 0xF0, 0xD8, 0x84, 0xEA, 0x94, + 0x04, 0x6C, 0xEE, 0xDF, 0x60, 0x6D, 0x49, 0xE1, 0x29, 0x6C, 0x25, 0x40, 0xF4, 0xF3, 0xC1, 0x39, + 0x1E, 0x40, 0x73, 0xEC, 0x7C, 0xF4, 0xAD, 0x2F, 0x97, 0x66, 0x07, 0xF3, 0x0B, 0xF5, 0xF9, 0xD7, + 0xF5, 0xA5, 0x4B, 0xFF, 0x15, 0x09, 0x80, 0x01, 0x6B, 0x1D, 0x70, 0x27, 0x94, 0xA8, 0x98, 0xBB, + 0xBE, 0x75, 0xB9, 0xBF, 0xF7, 0xB5, 0x1E, 0x57, 0xBB, 0x78, 0x2D, 0xFA, 0xA1, 0x16, 0xFF, 0xD8, + 0xF5, 0x18, 0xA7, 0xC7, 0x63, 0xF0, 0xA4, 0xDE, 0xFF, 0xFE, 0x21, 0xFA, 0x99, 0xCC, 0x0D, 0x5A, + 0x09, 0x7A, 0x39, 0xBE, 0x00, 0xA0, 0x57, 0x5E, 0xA0, 0xEF, 0xC5, 0x4C, 0xDE, 0xF5, 0xA2, 0x54, + 0x32, 0x9D, 0x04, 0xC0, 0x80, 0xB1, 0x01, 0x6E, 0x2D, 0xA5, 0xF0, 0xB6, 0xEC, 0x34, 0xD4, 0xFF, + 0x34, 0xF7, 0xFA, 0xD6, 0xE4, 0x2E, 0xDB, 0x5D, 0x43, 0xAB, 0x60, 0x2A, 0x5A, 0xF6, 0x6F, 0x03, + 0xF9, 0x93, 0xCB, 0x74, 0x07, 0x48, 0xAF, 0xE7, 0x63, 0xBC, 0x44, 0xE2, 0x32, 0xF7, 0x39, 0x71, + 0xEE, 0xE7, 0x3B, 0xB4, 0x7F, 0x6B, 0x3B, 0x8F, 0xCF, 0x31, 0xF7, 0xF3, 0xAD, 0xE9, 0xF7, 0x15, + 0x1A, 0xBC, 0x78, 0xE9, 0xF5, 0x00, 0xB0, 0x26, 0xF6, 0x1E, 0xC3, 0x1B, 0xA3, 0x40, 0xE9, 0x39, + 0x72, 0xA9, 0x19, 0x89, 0x48, 0x00, 0x0C, 0x18, 0x7B, 0x43, 0xB4, 0x74, 0x02, 0xA0, 0x87, 0xFE, + 0xA6, 0x2D, 0x2B, 0x3D, 0x20, 0x49, 0x0B, 0xEE, 0xBC, 0xEF, 0x2D, 0x5B, 0x01, 0xFE, 0x50, 0x8B, + 0xBF, 0x7D, 0x0E, 0xEA, 0xC5, 0x31, 0x9E, 0x57, 0xEF, 0x9F, 0xAF, 0x77, 0x03, 0x95, 0xFA, 0xF5, + 0x6B, 0xFD, 0x7C, 0xC7, 0xEC, 0x9F, 0x77, 0xFF, 0xB2, 0x74, 0x83, 0x40, 0xAD, 0x63, 0x26, 0x01, + 0x40, 0x0E, 0xA1, 0xD2, 0x7F, 0x5B, 0x01, 0x50, 0xAA, 0xEF, 0xBF, 0x22, 0x01, 0xB0, 0x43, 0x2B, + 0x17, 0xAA, 0x56, 0xF6, 0xB3, 0x15, 0xA9, 0x7F, 0x7C, 0x94, 0xC6, 0x86, 0x11, 0xE8, 0x97, 0x15, + 0x7B, 0x8C, 0x3F, 0xFA, 0x99, 0x77, 0x0C, 0x3E, 0x7E, 0xCB, 0x23, 0xBF, 0xD8, 0x5A, 0xE6, 0x18, + 0xDF, 0xE6, 0x7D, 0xBE, 0x3F, 0xBE, 0xF8, 0xC5, 0xC1, 0xC7, 0xDF, 0x7F, 0xCF, 0xD7, 0x76, 0xBE, + 0x5E, 0xEA, 0xCF, 0x77, 0xEC, 0x39, 0x2E, 0x34, 0x33, 0x4C, 0x6E, 0xF6, 0xFD, 0x6B, 0x3F, 0x47, + 0xD7, 0xB4, 0x7F, 0xB4, 0xFC, 0x03, 0x40, 0x39, 0xF6, 0x1C, 0x68, 0x97, 0x6D, 0x62, 0x40, 0xAF, + 0xA7, 0xA5, 0x13, 0x02, 0x24, 0x00, 0x06, 0xC4, 0x66, 0xDB, 0x63, 0x5B, 0xFE, 0xB9, 0x20, 0xA2, + 0x57, 0x5E, 0xCB, 0xFE, 0x98, 0xED, 0xA7, 0x6E, 0x8B, 0xE9, 0xBC, 0xC0, 0xDF, 0xAE, 0xB7, 0x89, + 0x00, 0x0C, 0xB3, 0x81, 0xFF, 0xB5, 0x5F, 0xBA, 0x7F, 0xFB, 0x09, 0x81, 0x04, 0xC0, 0x52, 0x34, + 0xF0, 0xF4, 0x02, 0xFE, 0xA5, 0x13, 0x03, 0x63, 0xF6, 0xA1, 0x86, 0x7D, 0x2D, 0x29, 0x74, 0x9F, + 0xB1, 0xF4, 0x7A, 0x00, 0x58, 0x03, 0x5B, 0xDD, 0x14, 0x1A, 0x0B, 0x40, 0x2B, 0x00, 0xF4, 0xF9, + 0x5E, 0xA0, 0x9F, 0x7B, 0x4C, 0x19, 0x12, 0x00, 0x03, 0xEC, 0x34, 0x77, 0x36, 0x11, 0x30, 0x36, + 0xF0, 0xF7, 0x32, 0xE4, 0x5C, 0x20, 0xDB, 0xF3, 0xF9, 0xA7, 0xAE, 0xDF, 0xB9, 0xFE, 0xA1, 0x8F, + 0x3E, 0x53, 0x68, 0x4F, 0xDA, 0x71, 0x72, 0x9A, 0x3F, 0x5D, 0x8E, 0xDD, 0x4E, 0xE4, 0xF4, 0xB8, + 0x00, 0x24, 0x01, 0xF2, 0x09, 0x05, 0xFE, 0xEA, 0xD3, 0xDF, 0xFC, 0xB9, 0x88, 0x88, 0xDC, 0xF2, + 0xC8, 0x32, 0x7D, 0xD7, 0x5A, 0x75, 0x2A, 0xF0, 0xAF, 0x94, 0x0D, 0x96, 0xBD, 0x16, 0xE8, 0x1A, + 0x82, 0x68, 0xBB, 0x0F, 0x36, 0x69, 0x11, 0x4A, 0x62, 0x2C, 0xC1, 0x5E, 0x47, 0x52, 0x5E, 0x37, + 0xBC, 0xFB, 0x8A, 0xD0, 0x7D, 0x4B, 0xA9, 0xF5, 0xB5, 0x76, 0xB3, 0x00, 0x80, 0x29, 0x6C, 0x80, + 0x6F, 0xCF, 0x71, 0xBA, 0x1C, 0x9A, 0x25, 0xC0, 0x26, 0x02, 0x72, 0x5F, 0xB3, 0x48, 0x00, 0xEC, + 0x10, 0x3B, 0xDF, 0x7D, 0x68, 0x0E, 0x48, 0xCB, 0x9B, 0x1B, 0x12, 0xF5, 0x09, 0x05, 0xFC, 0xDE, + 0xF3, 0x49, 0x04, 0x1C, 0xD2, 0x20, 0x7E, 0x28, 0x98, 0x9F, 0xF2, 0x3A, 0xFA, 0x7F, 0x92, 0x00, + 0xCB, 0xFA, 0xD6, 0x67, 0xDF, 0xB9, 0xF4, 0x2E, 0x34, 0xED, 0xFE, 0xBB, 0x2E, 0x2F, 0xBD, 0x0B, + 0x83, 0x34, 0x58, 0xBE, 0x70, 0xF6, 0x4A, 0x11, 0x11, 0xB9, 0xE2, 0x53, 0x87, 0xB7, 0x08, 0xAF, + 0x3E, 0xFE, 0xFB, 0xAD, 0xE5, 0x07, 0x2E, 0xBE, 0x1C, 0xF5, 0x3A, 0xAA, 0x86, 0xCA, 0x80, 0x1A, + 0x78, 0xD7, 0x93, 0x9C, 0xD7, 0x8D, 0x5A, 0x02, 0x7F, 0x00, 0x58, 0xA3, 0xD8, 0x18, 0x30, 0x76, + 0x4C, 0x80, 0x52, 0x63, 0x01, 0x90, 0x00, 0x88, 0xE0, 0x25, 0x02, 0xE6, 0x66, 0xB2, 0xF5, 0xE0, + 0x20, 0x33, 0x5E, 0x9F, 0xB1, 0x81, 0x3F, 0x86, 0x0D, 0x0D, 0xE4, 0xE7, 0x3D, 0x26, 0x72, 0xBA, + 0x3A, 0x60, 0x28, 0xD0, 0x27, 0xF8, 0x5F, 0x8E, 0xB6, 0xFC, 0x93, 0x00, 0x98, 0xE7, 0x8E, 0x7B, + 0xCF, 0x6E, 0x2D, 0xDF, 0x79, 0xDF, 0x42, 0x3B, 0x72, 0xC4, 0x0B, 0xFC, 0x95, 0x4D, 0x04, 0xE8, + 0xF3, 0xA4, 0xA2, 0xD6, 0x76, 0xFB, 0x37, 0x0C, 0x3C, 0x41, 0x44, 0x96, 0xD9, 0xB7, 0xD8, 0xEB, + 0x49, 0x8A, 0x44, 0xC0, 0xD2, 0x01, 0x7D, 0xE9, 0x80, 0x7F, 0xEC, 0xFB, 0xCD, 0xDD, 0xBF, 0x39, + 0xDB, 0x93, 0x0C, 0x01, 0xD6, 0xCB, 0x6B, 0xE1, 0xD7, 0x58, 0xCF, 0x56, 0x02, 0xE8, 0xF9, 0x40, + 0x9F, 0x5F, 0xFA, 0xDA, 0x44, 0x02, 0x60, 0x84, 0xD8, 0x00, 0x9D, 0xB9, 0x80, 0xD7, 0xEF, 0x9A, + 0x47, 0xFF, 0x71, 0xF0, 0xF1, 0x5F, 0xDF, 0xF2, 0x27, 0x22, 0x42, 0x25, 0xC0, 0x90, 0xA1, 0x29, + 0xFF, 0x6C, 0x6B, 0xFE, 0xC9, 0xC7, 0x98, 0x11, 0xA0, 0x9C, 0xD8, 0xD2, 0x7F, 0x02, 0xFF, 0x79, + 0x34, 0xA3, 0xAF, 0x19, 0xFE, 0xDA, 0x78, 0x2D, 0xFE, 0xDE, 0xB2, 0x5A, 0xA2, 0xB5, 0xDD, 0xBE, + 0x67, 0xA8, 0x6A, 0xE1, 0xC2, 0xE3, 0xDB, 0x49, 0x0B, 0x55, 0x53, 0xD7, 0x80, 0x14, 0x62, 0x1B, + 0x2C, 0x96, 0x5E, 0x5F, 0xDA, 0xDC, 0xFB, 0xB2, 0x39, 0xDB, 0x73, 0x4F, 0x08, 0xAC, 0x5F, 0xA8, + 0x85, 0xDF, 0x8E, 0x11, 0xE0, 0x5D, 0x7B, 0x4A, 0x5D, 0x93, 0xBA, 0x4A, 0x00, 0xE8, 0xCD, 0x97, + 0xDE, 0x38, 0xE4, 0xBA, 0x20, 0x8D, 0x7D, 0x5D, 0xB2, 0xC2, 0xF5, 0xD1, 0xC0, 0xDD, 0xEB, 0xAB, + 0xF9, 0xF5, 0x0F, 0x7F, 0x60, 0x70, 0x3B, 0x4D, 0x0C, 0x68, 0x22, 0xA0, 0x77, 0x43, 0xE5, 0xFA, + 0xB6, 0x5B, 0xC0, 0x50, 0x60, 0x7F, 0x72, 0x9D, 0x6E, 0x7F, 0xB2, 0x4A, 0x60, 0x4E, 0x15, 0xC0, + 0xC1, 0xC1, 0xC1, 0xE0, 0xE3, 0xDE, 0x34, 0x56, 0xB6, 0x0C, 0x6B, 0x6C, 0xF0, 0x96, 0x7A, 0x7B, + 0xB4, 0x47, 0x47, 0xF9, 0xD7, 0xE3, 0xDA, 0x76, 0x01, 0xB0, 0xBF, 0x01, 0xAD, 0x10, 0xC8, 0xFD, + 0xDD, 0xDB, 0x20, 0x5A, 0x83, 0xE6, 0xC7, 0x2E, 0xBF, 0x22, 0x22, 0xC7, 0x41, 0x73, 0x28, 0xA8, + 0xDE, 0x3C, 0x3F, 0x50, 0x19, 0xA0, 0xE6, 0xDE, 0xE0, 0xEC, 0xED, 0xED, 0x9D, 0x6A, 0xE9, 0xF7, + 0xAA, 0x16, 0xEC, 0xF2, 0x26, 0x11, 0x70, 0xFC, 0x62, 0xB3, 0xF6, 0x65, 0x97, 0xA9, 0x95, 0x64, + 0x29, 0x12, 0xC8, 0x76, 0xCA, 0x44, 0x5B, 0x8E, 0x1A, 0xBA, 0x4F, 0x99, 0xBB, 0x3E, 0xF4, 0xFE, + 0x63, 0xAD, 0x2D, 0x51, 0x33, 0x06, 0x53, 0x3D, 0x03, 0xF5, 0xB3, 0xE7, 0x44, 0x1B, 0xF8, 0xDB, + 0x7B, 0xCC, 0xA5, 0xCF, 0x69, 0x5D, 0x25, 0x00, 0x94, 0xFD, 0xD0, 0x53, 0x27, 0x02, 0x42, 0xF3, + 0xE1, 0x5A, 0x24, 0x00, 0xDA, 0x73, 0xEB, 0x33, 0x3F, 0xDA, 0xB9, 0x9E, 0xA0, 0xED, 0x58, 0xCC, + 0x28, 0xFE, 0x5E, 0x17, 0x80, 0xA1, 0xD7, 0x98, 0xCA, 0x06, 0xFE, 0xA1, 0xDF, 0x9D, 0xFE, 0x8E, + 0x75, 0xBB, 0xB1, 0xB3, 0x79, 0xA4, 0xDE, 0x3E, 0x87, 0xD8, 0x96, 0x7F, 0x4B, 0x47, 0xFF, 0x7F, + 0xF4, 0x33, 0xEF, 0x60, 0x26, 0x80, 0x08, 0xA1, 0xE3, 0x37, 0x74, 0xFC, 0xE7, 0xF6, 0x85, 0x7B, + 0xAE, 0x16, 0x91, 0xE3, 0xBE, 0xFD, 0x76, 0xD9, 0x06, 0xCD, 0xB6, 0x02, 0x40, 0x79, 0xAD, 0xED, + 0xA9, 0x6F, 0x74, 0xDC, 0x32, 0xFF, 0x89, 0xAF, 0xA5, 0x09, 0x8C, 0x35, 0xF0, 0xEE, 0x3F, 0x6C, + 0xBF, 0xD4, 0x5C, 0x2D, 0xFC, 0xB1, 0xEF, 0x8F, 0x7A, 0x84, 0xBE, 0x1B, 0xBB, 0x9E, 0x65, 0x96, + 0x59, 0x0E, 0x9F, 0xCB, 0xBC, 0x3E, 0xFE, 0xBA, 0xAC, 0xF7, 0x76, 0xE7, 0xCE, 0x9D, 0x13, 0x91, + 0x72, 0x7D, 0xFF, 0xD5, 0x19, 0x11, 0xA9, 0xB3, 0x16, 0xB1, 0xA0, 0xD4, 0x15, 0x01, 0x63, 0x2F, + 0x74, 0xBD, 0x8F, 0x01, 0xA0, 0x7F, 0xBF, 0xCD, 0x96, 0x95, 0xA6, 0xDF, 0xDB, 0xD0, 0x8F, 0xCF, + 0xB6, 0xC8, 0xD8, 0x1F, 0xEA, 0xAE, 0x1F, 0x6E, 0xEE, 0x8A, 0x93, 0xDA, 0x9C, 0xFC, 0x1C, 0xBD, + 0xE0, 0x7F, 0xCA, 0x18, 0x00, 0xF6, 0xB5, 0x62, 0x3F, 0xD7, 0xD0, 0x6C, 0x1E, 0x36, 0x38, 0xB1, + 0x2D, 0xF4, 0x5E, 0xF6, 0x56, 0x1F, 0xD7, 0x93, 0x77, 0xA9, 0xED, 0xE7, 0xFC, 0x3E, 0xEC, 0x31, + 0x6E, 0x13, 0x00, 0xFF, 0xF2, 0xCA, 0xC3, 0xE3, 0xFC, 0x7F, 0xBF, 0x32, 0xDC, 0xF2, 0x38, 0xB4, + 0xFE, 0x96, 0x47, 0x7E, 0xD1, 0xDD, 0x31, 0xEE, 0xF1, 0xCE, 0x21, 0xB1, 0x81, 0xBD, 0x97, 0x20, + 0x4B, 0xF5, 0xF9, 0xDA, 0x3E, 0x8A, 0x1A, 0xE8, 0x87, 0x6C, 0x12, 0x01, 0x91, 0x81, 0xB7, 0x1D, + 0x2C, 0x30, 0x34, 0x52, 0xBF, 0xC7, 0x56, 0x0E, 0x9C, 0xBC, 0x91, 0xF2, 0x2A, 0x00, 0xBC, 0x24, + 0x86, 0x2E, 0xDB, 0xE4, 0xC5, 0xC9, 0xE0, 0x3F, 0xD5, 0xE7, 0xAB, 0xDF, 0x7F, 0xA8, 0x02, 0xE0, + 0xC1, 0x8F, 0x0C, 0xFF, 0x96, 0x6F, 0xFF, 0xC1, 0xE1, 0xEB, 0xE8, 0xF5, 0x66, 0xCC, 0xF7, 0x1F, + 0x4A, 0x34, 0x86, 0xCE, 0x7B, 0x5E, 0x79, 0x6A, 0xEC, 0x7A, 0x6B, 0xEE, 0xF5, 0xDC, 0xDB, 0xDF, + 0x9E, 0xE8, 0x67, 0x3B, 0xF5, 0xB3, 0x8C, 0x0D, 0xF0, 0x15, 0x49, 0x1A, 0x60, 0x3A, 0x2F, 0xD9, + 0x6A, 0x13, 0x01, 0x7A, 0x3E, 0xD7, 0x7B, 0x40, 0x7B, 0x5D, 0xCC, 0x9D, 0x10, 0xE8, 0xB2, 0x02, + 0xC0, 0x4A, 0x5D, 0x11, 0x60, 0xBF, 0x5C, 0xCF, 0xD8, 0xE9, 0x04, 0x15, 0x27, 0xE7, 0x7A, 0xD8, + 0x9B, 0x9E, 0xD2, 0x19, 0xBC, 0x56, 0x0C, 0xF5, 0xFF, 0x3F, 0x29, 0x66, 0x96, 0x00, 0xC6, 0x01, + 0x48, 0xEB, 0x64, 0xF0, 0x1F, 0x0A, 0xFC, 0x51, 0xC6, 0xDC, 0xD9, 0x32, 0xA6, 0x0A, 0x05, 0xCD, + 0x21, 0xA7, 0xBA, 0x00, 0x1C, 0xB1, 0x5D, 0x02, 0x94, 0x17, 0xCC, 0x79, 0xFD, 0xFA, 0x87, 0x5A, + 0xE8, 0xED, 0x7B, 0x6A, 0x60, 0x6F, 0x03, 0xFD, 0x98, 0xC0, 0x3F, 0x37, 0xDB, 0x35, 0x4C, 0x03, + 0x7F, 0xEF, 0x3A, 0xA1, 0xD7, 0x91, 0x87, 0x64, 0xFA, 0x75, 0x24, 0x74, 0x9F, 0x10, 0xEA, 0x8A, + 0x34, 0x77, 0x3D, 0xF7, 0x29, 0xED, 0xA2, 0x5A, 0x03, 0x88, 0x67, 0x7F, 0x2F, 0xDE, 0xB4, 0x80, + 0xF6, 0x71, 0xDD, 0xCE, 0x8B, 0x1B, 0x72, 0x8F, 0x1D, 0x42, 0x02, 0xE0, 0x84, 0x54, 0x89, 0x00, + 0x3B, 0x08, 0x4F, 0xA8, 0x74, 0xCE, 0xE3, 0x9D, 0x84, 0x39, 0x39, 0x97, 0xA3, 0x3F, 0x4C, 0x6D, + 0x91, 0xD1, 0xBE, 0xFF, 0x0F, 0x5F, 0xFF, 0x41, 0x11, 0x11, 0xB9, 0xED, 0xD9, 0xE7, 0xB7, 0x9E, + 0xA7, 0x3F, 0x60, 0x7D, 0x9E, 0xAE, 0xEF, 0x95, 0x6D, 0xD9, 0x1F, 0x5B, 0xEA, 0xEF, 0x6D, 0x8F, + 0x34, 0xC6, 0xB6, 0xF8, 0xEB, 0xBF, 0x94, 0xFD, 0xCF, 0xE3, 0x25, 0xC0, 0x54, 0x2B, 0x89, 0x44, + 0x2F, 0xF0, 0xB7, 0x63, 0x05, 0xC8, 0x45, 0xD9, 0x7E, 0x5E, 0x60, 0x8C, 0x80, 0x53, 0xB3, 0x11, + 0x5C, 0xDC, 0x7E, 0xDF, 0xFD, 0xFD, 0xFD, 0xCD, 0x36, 0x5E, 0x22, 0xC0, 0xEE, 0x8B, 0xDD, 0xE7, + 0xA1, 0xD7, 0x4A, 0xCD, 0x1B, 0x2C, 0xD6, 0xF2, 0xBE, 0x6F, 0xBD, 0x8E, 0xFC, 0x6C, 0xC4, 0x7B, + 0x7A, 0xF7, 0x05, 0xF6, 0xBE, 0xC3, 0xDE, 0x5C, 0xDA, 0x7E, 0xE6, 0x53, 0xD7, 0x87, 0xDE, 0xBF, + 0xF7, 0x2A, 0x21, 0x00, 0xEB, 0xE2, 0x05, 0xFC, 0x96, 0x7D, 0xDC, 0x9E, 0x43, 0xED, 0x75, 0x20, + 0x77, 0xD5, 0x13, 0x09, 0x80, 0x01, 0xB9, 0x12, 0x01, 0xA1, 0xE7, 0xA9, 0x50, 0x80, 0x9F, 0xB2, + 0x24, 0x18, 0xF3, 0x78, 0x15, 0x00, 0x9A, 0x20, 0xE8, 0x9D, 0x0D, 0x6C, 0x74, 0x00, 0xBF, 0x50, + 0x22, 0xC0, 0x2B, 0xFD, 0x27, 0x11, 0x50, 0x06, 0x15, 0x01, 0x79, 0x85, 0xA6, 0xBB, 0xBC, 0xE3, + 0xDE, 0xBC, 0x3D, 0xF3, 0x8E, 0xAF, 0x71, 0x7B, 0x22, 0x12, 0x31, 0x06, 0x80, 0x09, 0xF0, 0x6D, + 0xD0, 0x1D, 0x4A, 0x04, 0x28, 0x6F, 0x8C, 0x00, 0xAF, 0xA5, 0xDF, 0x1B, 0x6B, 0xE0, 0xE4, 0xDF, + 0xE0, 0x05, 0xEF, 0xDE, 0x3E, 0xD9, 0xED, 0x73, 0xF0, 0x06, 0x89, 0x55, 0x9A, 0x50, 0xF6, 0xAE, + 0x1F, 0xBA, 0xFE, 0x9A, 0x04, 0xFB, 0xE2, 0xDD, 0x7F, 0xD8, 0xBF, 0xDF, 0x06, 0xF8, 0x73, 0xD7, + 0x87, 0xDE, 0x1F, 0xF5, 0xE2, 0x9E, 0x12, 0x88, 0x17, 0x8A, 0xE1, 0xBC, 0x65, 0xFB, 0x7C, 0x4D, + 0x08, 0x94, 0x6A, 0x00, 0x20, 0x01, 0xB0, 0x43, 0xEE, 0x44, 0xC0, 0xDC, 0x4C, 0xB8, 0xED, 0x5F, + 0x42, 0x66, 0x3D, 0x3D, 0xBD, 0x11, 0x53, 0x3A, 0xF8, 0x9F, 0x0D, 0xF0, 0x6B, 0x9F, 0xDE, 0xAB, + 0x06, 0x43, 0x41, 0xFF, 0x50, 0x59, 0xFF, 0xD0, 0x14, 0x80, 0x76, 0x3B, 0xE4, 0xA1, 0x81, 0xBF, + 0x5D, 0x26, 0x11, 0x50, 0x56, 0xE9, 0x96, 0x7F, 0x1B, 0xE8, 0x87, 0xFA, 0xFC, 0x7B, 0x01, 0xBB, + 0x0D, 0xBA, 0x6D, 0xC0, 0xEF, 0x55, 0x06, 0x04, 0x67, 0x15, 0xD8, 0x61, 0x73, 0x9D, 0x36, 0xC9, + 0x04, 0x2F, 0x69, 0xB1, 0x44, 0x5F, 0x72, 0x6F, 0x56, 0x18, 0x7B, 0x7D, 0x51, 0xA1, 0xD9, 0x66, + 0x76, 0x89, 0x6D, 0x70, 0xF0, 0x46, 0xE9, 0x9F, 0xBB, 0x9E, 0x80, 0xBF, 0x5D, 0x04, 0xFE, 0xC0, + 0x74, 0x36, 0x90, 0xF7, 0xFA, 0xFC, 0x7B, 0xEB, 0x4B, 0x5F, 0x9B, 0x48, 0x00, 0x44, 0x48, 0x9D, + 0x08, 0x08, 0x61, 0xCE, 0xD8, 0xFA, 0x69, 0x22, 0x40, 0x6F, 0xE0, 0x74, 0xB0, 0xA7, 0xCD, 0xE0, + 0x4D, 0x9D, 0x97, 0xFE, 0xAB, 0x98, 0xE0, 0x7D, 0x4C, 0x6B, 0x7E, 0xCA, 0x96, 0x7F, 0xEF, 0x46, + 0x36, 0x96, 0xED, 0xBF, 0x55, 0x7A, 0xFB, 0x1C, 0xC6, 0x0C, 0xFE, 0x87, 0xE9, 0x6A, 0xAB, 0x60, + 0x89, 0xED, 0x37, 0xAF, 0xBC, 0xFE, 0xF3, 0x5E, 0x05, 0x80, 0x57, 0xA6, 0xEF, 0x25, 0x1C, 0x76, + 0xF5, 0xFD, 0x0F, 0xF1, 0xB6, 0x59, 0x22, 0xF0, 0xDF, 0x74, 0x01, 0x7B, 0x76, 0xDE, 0xF6, 0x63, + 0xBA, 0x28, 0xC4, 0x36, 0x38, 0x84, 0x82, 0xBD, 0xA9, 0xEB, 0x73, 0x35, 0x78, 0x20, 0x1F, 0x02, + 0x7F, 0x60, 0x3E, 0x2F, 0xD0, 0xF7, 0xCE, 0x7D, 0x5E, 0xE0, 0x5F, 0xEA, 0x5A, 0x45, 0x02, 0x60, + 0x84, 0xDC, 0xD3, 0x07, 0x4E, 0x7D, 0x5D, 0x32, 0xEE, 0xF9, 0xD8, 0xC1, 0x9B, 0x34, 0xC0, 0xF7, + 0x46, 0x6F, 0xC6, 0x30, 0x2F, 0xE0, 0x89, 0x1D, 0x1B, 0x60, 0xD7, 0x6B, 0x60, 0x3A, 0x0D, 0xE8, + 0x09, 0xF0, 0xCB, 0x88, 0x99, 0xED, 0x62, 0x09, 0xB6, 0x65, 0xDE, 0xEB, 0x37, 0x1F, 0x0A, 0xD0, + 0x83, 0x83, 0x01, 0x1E, 0xB1, 0xEF, 0xE3, 0xB5, 0xD6, 0xB7, 0xCA, 0x8E, 0xFD, 0x12, 0x6A, 0xC9, + 0xB7, 0x95, 0x65, 0x29, 0xC6, 0x8E, 0xF1, 0x5A, 0xE8, 0x55, 0x68, 0x70, 0xE1, 0xB9, 0xEB, 0x43, + 0xEF, 0x0F, 0x00, 0x2D, 0x88, 0xED, 0x6E, 0x6D, 0xC7, 0x41, 0xD1, 0x98, 0xB1, 0xD6, 0x19, 0x4C, + 0x48, 0x00, 0x4C, 0x90, 0x3B, 0x11, 0xE0, 0xCD, 0xA3, 0xEB, 0x21, 0x01, 0x90, 0x9F, 0x4D, 0x04, + 0x78, 0x6C, 0xE9, 0x66, 0xEF, 0x83, 0x00, 0xD6, 0x64, 0xEE, 0xEF, 0x64, 0xEE, 0x0D, 0x6C, 0x6D, + 0x37, 0xC0, 0xB7, 0x3C, 0xF2, 0x8B, 0xCD, 0x4C, 0x00, 0x36, 0x11, 0xA0, 0x48, 0x08, 0xA4, 0x51, + 0x6B, 0x37, 0x16, 0x5B, 0x3E, 0x6F, 0x07, 0xDB, 0x53, 0x73, 0x03, 0xF4, 0xD0, 0x40, 0x7D, 0xB1, + 0x09, 0x86, 0x5D, 0x42, 0x63, 0x02, 0x2C, 0x29, 0x74, 0x1D, 0xB8, 0x2D, 0x61, 0x97, 0x0F, 0xEF, + 0xFE, 0x21, 0x74, 0x5F, 0x51, 0x6A, 0x7D, 0x6D, 0xE7, 0x41, 0xCC, 0xFF, 0x6E, 0x96, 0xDE, 0x3E, + 0x37, 0xF6, 0xAF, 0x6E, 0xB9, 0xFF, 0x7E, 0x6F, 0xF4, 0x7E, 0xDB, 0xA7, 0xDF, 0x96, 0xF6, 0x1F, + 0x1C, 0x1C, 0x88, 0xC8, 0xF1, 0x34, 0x7F, 0xB5, 0x0D, 0xEE, 0x4B, 0x02, 0x60, 0x86, 0xDC, 0x89, + 0x80, 0x5E, 0x7F, 0xCC, 0x35, 0xD3, 0x44, 0xC0, 0xED, 0xB2, 0x7D, 0xB3, 0x33, 0xA7, 0xCF, 0x66, + 0xEF, 0x4E, 0xB6, 0x7E, 0x96, 0x9C, 0xEA, 0xCF, 0x9E, 0xCC, 0x71, 0x3A, 0xE0, 0xB7, 0x95, 0x01, + 0x8C, 0xFE, 0x3F, 0x4D, 0x68, 0x76, 0x8B, 0x5A, 0xD8, 0xBE, 0xFB, 0xA9, 0xA7, 0xCE, 0x0B, 0xF5, + 0xED, 0xCF, 0xD1, 0xF2, 0x5F, 0x43, 0xEB, 0xCB, 0x12, 0x15, 0x00, 0xAA, 0x74, 0xCB, 0x3F, 0xD3, + 0x16, 0xB7, 0x6B, 0xE9, 0x40, 0xBE, 0xF6, 0x40, 0x96, 0xFD, 0xAB, 0x5B, 0xAE, 0xBF, 0xDF, 0x1B, + 0xBD, 0xDF, 0xF6, 0xE1, 0xF7, 0xFA, 0xFC, 0xDB, 0xED, 0xD4, 0xD2, 0x09, 0x01, 0x12, 0x00, 0x09, + 0xA4, 0x4E, 0x04, 0x84, 0xFA, 0x8D, 0xA8, 0xB1, 0xD3, 0x09, 0xAA, 0x5E, 0x4F, 0x0E, 0x53, 0xE8, + 0x8D, 0x58, 0xE8, 0x06, 0xCE, 0xAE, 0xA7, 0xE5, 0xDF, 0x17, 0x1B, 0xFC, 0xE4, 0x2E, 0x8B, 0x8E, + 0xFD, 0xFD, 0xE8, 0xF3, 0x42, 0xD3, 0x5C, 0x95, 0xDA, 0x3E, 0x25, 0x1B, 0xD0, 0x6B, 0x45, 0x80, + 0xA2, 0x02, 0xA0, 0x4F, 0xA1, 0x16, 0xFA, 0x50, 0xA0, 0x1E, 0x1B, 0xE8, 0x87, 0x06, 0xF9, 0x1B, + 0xD3, 0xAA, 0xFF, 0xCB, 0xCB, 0x77, 0x6F, 0x2D, 0xEB, 0xB8, 0x02, 0x7B, 0x66, 0xCA, 0xC1, 0x25, + 0x94, 0xAC, 0x00, 0x50, 0xB9, 0xFA, 0xF8, 0xA7, 0x5A, 0x8F, 0x7A, 0x85, 0x46, 0x2D, 0x57, 0xDE, + 0x77, 0x5C, 0x7A, 0xFB, 0xDC, 0xEB, 0xD9, 0xBF, 0xBA, 0xD7, 0x5B, 0xA9, 0xFF, 0x7E, 0xCB, 0xEB, + 0xE3, 0xEF, 0x55, 0x0A, 0x78, 0x81, 0xFE, 0xD2, 0xE3, 0xBD, 0x91, 0x00, 0x48, 0x28, 0xD7, 0xAC, + 0x01, 0xF6, 0x75, 0xC6, 0x06, 0xFE, 0x5E, 0x86, 0x9E, 0x0B, 0x74, 0xBC, 0x53, 0x37, 0x70, 0x13, + 0x07, 0x75, 0xEA, 0xDD, 0xD0, 0xE8, 0xFE, 0x96, 0x37, 0x5B, 0x00, 0xF2, 0xD1, 0xC0, 0x5F, 0x13, + 0x02, 0x36, 0x11, 0x80, 0x69, 0x5A, 0x69, 0xF9, 0xF7, 0x46, 0xD2, 0x57, 0x53, 0x07, 0xE5, 0x8B, + 0x4D, 0x14, 0xB8, 0xFB, 0x33, 0xC1, 0xDB, 0xCF, 0x7E, 0x55, 0x44, 0x4E, 0x27, 0x04, 0x96, 0x2C, + 0x04, 0x28, 0x59, 0x01, 0xE0, 0x5D, 0xD7, 0x43, 0xF7, 0x0D, 0xA5, 0xD6, 0x33, 0x18, 0x20, 0x80, + 0x35, 0xB0, 0xE7, 0xB2, 0xB1, 0x2D, 0xFE, 0x4B, 0x57, 0xA7, 0x91, 0x00, 0xC8, 0x20, 0xF7, 0xF4, + 0x81, 0xDE, 0xF3, 0x54, 0x28, 0xC0, 0xF7, 0xE6, 0xA6, 0x04, 0x4A, 0xB2, 0x03, 0x00, 0xDA, 0xC7, + 0x4B, 0xF1, 0x7E, 0x5F, 0x73, 0x2B, 0x70, 0x72, 0x6F, 0x9F, 0x43, 0x28, 0xF0, 0xB7, 0x89, 0x02, + 0xEC, 0x76, 0xC7, 0xBD, 0x67, 0xB7, 0x96, 0xEF, 0xBC, 0x6F, 0xF7, 0xE3, 0x4B, 0x3B, 0x35, 0x26, + 0xC0, 0xD8, 0xED, 0x44, 0x37, 0xDF, 0x1B, 0x5C, 0xEF, 0xB5, 0xE4, 0xA7, 0xB8, 0x11, 0xD2, 0xC0, + 0xDF, 0x2E, 0xDB, 0x44, 0xC0, 0x12, 0x96, 0xA8, 0x00, 0x50, 0xB5, 0x04, 0xFE, 0x68, 0x87, 0xBD, + 0x27, 0x1C, 0x7B, 0x8F, 0x58, 0x7A, 0xFB, 0xD2, 0xD5, 0x2A, 0xEC, 0x5F, 0x5D, 0xEB, 0x43, 0xCF, + 0xCF, 0x5D, 0xAD, 0x14, 0xAA, 0x38, 0xB0, 0x63, 0x04, 0x2C, 0x5D, 0xFA, 0xAF, 0x48, 0x00, 0x64, + 0x94, 0x3B, 0x11, 0x30, 0x37, 0x40, 0xB0, 0xF3, 0xF6, 0x92, 0x99, 0x3F, 0x54, 0xE3, 0x20, 0x52, + 0xC8, 0xC7, 0xFE, 0x4E, 0xF5, 0xE4, 0x1C, 0x7B, 0x51, 0x58, 0x7A, 0xFB, 0x29, 0xEC, 0x31, 0xFE, + 0x77, 0xFF, 0x34, 0x76, 0xFB, 0xBF, 0x48, 0xB7, 0x33, 0x2B, 0xA4, 0x9F, 0xAF, 0x6D, 0x01, 0x08, + 0x3D, 0x5E, 0x4A, 0xEA, 0xF7, 0x0B, 0xBD, 0xDE, 0xDC, 0xF5, 0x73, 0x9E, 0x6F, 0xBB, 0x02, 0x94, + 0xB0, 0xE4, 0x35, 0x64, 0xE9, 0x80, 0x9E, 0x80, 0xBF, 0x5D, 0x4B, 0x0F, 0x74, 0x5B, 0x7B, 0x63, + 0x14, 0xFB, 0x57, 0xB7, 0xDC, 0x7F, 0x7F, 0x68, 0xF0, 0x3F, 0xDB, 0x15, 0xC0, 0x8E, 0x09, 0xB0, + 0x74, 0x8B, 0xBF, 0x45, 0x02, 0xA0, 0x80, 0xD4, 0x89, 0x80, 0x90, 0xA5, 0xFB, 0x95, 0xB4, 0x8A, + 0xCF, 0x2D, 0x3F, 0x3B, 0xC8, 0xDF, 0x50, 0x69, 0x7F, 0xCC, 0x73, 0x30, 0x0D, 0xC7, 0x78, 0x5E, + 0xB5, 0x7F, 0xBE, 0xB5, 0xEF, 0x5F, 0x48, 0xED, 0xFB, 0x5F, 0xC3, 0xFE, 0xC5, 0x36, 0x18, 0x2C, + 0xBD, 0x1E, 0xF5, 0x58, 0x3A, 0x70, 0xAF, 0x3D, 0x70, 0x65, 0xFF, 0xEA, 0x56, 0xEA, 0xEF, 0x0F, + 0xF5, 0xF9, 0xF7, 0x9E, 0x6F, 0x63, 0xC0, 0x5A, 0x12, 0x01, 0x24, 0x00, 0x0A, 0xCA, 0x3D, 0x6B, + 0xC0, 0xD4, 0xD7, 0x25, 0x63, 0x7F, 0x28, 0xC7, 0x20, 0x6B, 0x27, 0xF5, 0x7E, 0x92, 0x16, 0x39, + 0x2C, 0xEF, 0x8F, 0x09, 0xE8, 0x4F, 0x3E, 0x27, 0x76, 0x1B, 0x84, 0xD5, 0x7E, 0x8C, 0xB7, 0x3E, + 0x23, 0x43, 0xEE, 0xFD, 0x9F, 0xFB, 0xF9, 0x96, 0x08, 0xC2, 0x6A, 0xFF, 0x0C, 0x72, 0xAA, 0xE9, + 0xF7, 0x15, 0xFA, 0xAE, 0x97, 0x5E, 0x0F, 0x00, 0x35, 0x88, 0xED, 0x0E, 0x6D, 0x07, 0x72, 0xD6, + 0x98, 0x4E, 0xFF, 0xD5, 0xEA, 0x4D, 0x9D, 0xF6, 0xAF, 0x76, 0x24, 0x00, 0x16, 0x90, 0x3B, 0x11, + 0x30, 0xF6, 0x06, 0x8C, 0x04, 0x40, 0x5E, 0xB1, 0xB3, 0x3A, 0xF4, 0x22, 0xA6, 0x75, 0xBF, 0xB6, + 0x41, 0xD2, 0xB0, 0x5B, 0xED, 0xC7, 0xB8, 0x2D, 0xC9, 0x6B, 0xF5, 0xF5, 0x6B, 0xFD, 0x7C, 0x4B, + 0xE8, 0xF9, 0x33, 0xE8, 0xF9, 0x6F, 0x47, 0x7E, 0x8C, 0x07, 0x85, 0x9E, 0x79, 0xA3, 0xF7, 0x7B, + 0xA5, 0xFE, 0x7A, 0x9D, 0x3F, 0x38, 0x38, 0x18, 0x5C, 0xDF, 0x0A, 0x12, 0x00, 0x0B, 0xCA, 0x9D, + 0x08, 0xE0, 0x64, 0x3E, 0x4D, 0xEA, 0x81, 0x39, 0x18, 0x53, 0x60, 0xD8, 0xAE, 0x56, 0x7D, 0xDB, + 0x0D, 0x20, 0x27, 0x7B, 0x12, 0x6F, 0x6D, 0xFB, 0x29, 0x6A, 0x3F, 0xC6, 0x73, 0xEF, 0x5F, 0xEB, + 0xAF, 0xDF, 0x82, 0x9E, 0x3F, 0x03, 0xEF, 0x6F, 0x3F, 0x7F, 0xFE, 0xFC, 0xE6, 0xFF, 0x97, 0x2E, + 0x5D, 0x72, 0xB7, 0xD7, 0xE7, 0xE9, 0x73, 0x5A, 0xFA, 0xDB, 0xD1, 0x2E, 0x12, 0x01, 0xE8, 0x91, + 0x37, 0x7A, 0xBF, 0xED, 0xC3, 0x6F, 0x97, 0x6D, 0x57, 0x00, 0x6F, 0x3C, 0xA7, 0xA5, 0x07, 0xFB, + 0xF3, 0x90, 0x00, 0xA8, 0x40, 0xEA, 0x44, 0x40, 0x6C, 0x6B, 0xC1, 0xD8, 0xE9, 0x04, 0x15, 0x17, + 0x07, 0x4C, 0x35, 0xA6, 0x94, 0xBF, 0x54, 0xD9, 0xBF, 0xFD, 0x1D, 0xCC, 0xAD, 0xA0, 0x29, 0xBD, + 0xFD, 0x14, 0xA9, 0xE6, 0x46, 0xD7, 0x0B, 0x5C, 0x6B, 0x99, 0x6F, 0xA0, 0xB4, 0xF3, 0xE7, 0xCF, + 0xCB, 0x13, 0x4F, 0x3C, 0xB1, 0xF5, 0x98, 0x97, 0x04, 0xB8, 0x74, 0xE9, 0x92, 0x9C, 0x3F, 0x7F, + 0x5E, 0xCE, 0x9F, 0x3F, 0xBF, 0x33, 0x51, 0x00, 0xE4, 0x40, 0x22, 0x00, 0x3D, 0xF3, 0xFA, 0xF8, + 0x7B, 0x95, 0x02, 0x5A, 0xF2, 0x6F, 0x03, 0xFE, 0xDA, 0xEF, 0x8B, 0x48, 0x00, 0x54, 0x24, 0xD7, + 0xAC, 0x01, 0xA1, 0xC1, 0x79, 0x3C, 0xDE, 0x45, 0x80, 0x8B, 0x03, 0xA6, 0x1A, 0x33, 0xB8, 0x1F, + 0x03, 0x01, 0xE6, 0xA3, 0xF3, 0xBA, 0xEF, 0xCF, 0x7C, 0x9D, 0x17, 0xBE, 0x7C, 0xC7, 0xEC, 0x7D, + 0xA9, 0x89, 0x5E, 0xC0, 0xAD, 0x6F, 0x7D, 0xF6, 0x9D, 0x22, 0x32, 0x7D, 0xFA, 0x43, 0x3B, 0x0F, + 0xFC, 0x9C, 0x79, 0xDE, 0xD1, 0x9E, 0xA1, 0xE0, 0x5F, 0x97, 0x09, 0xF0, 0x01, 0xA0, 0x3E, 0x36, + 0x76, 0xF2, 0x2A, 0x05, 0xBC, 0xE5, 0x5A, 0x06, 0xFB, 0xF3, 0x90, 0x00, 0xA8, 0x50, 0xEE, 0xE9, + 0x03, 0xBD, 0xE7, 0xA9, 0x50, 0x80, 0x6F, 0xFB, 0xC5, 0xAC, 0x39, 0x11, 0xF0, 0xF9, 0xA7, 0xAE, + 0x17, 0x11, 0x91, 0x87, 0x3E, 0xFA, 0xCC, 0xD6, 0xE3, 0x5E, 0x69, 0x8F, 0xF7, 0x7C, 0xCC, 0xEB, + 0xD7, 0x5F, 0x62, 0x20, 0x40, 0xFD, 0x9D, 0x4C, 0x6D, 0x81, 0x5F, 0x7A, 0xFB, 0x29, 0x7E, 0x7C, + 0xF1, 0x8B, 0x22, 0x22, 0xF2, 0xFE, 0x7B, 0xBE, 0xB6, 0xB5, 0xEC, 0x89, 0x7D, 0x5E, 0x09, 0x7A, + 0x3C, 0xA5, 0x38, 0x2E, 0xF4, 0xF7, 0xAC, 0x81, 0xBE, 0xF5, 0xE9, 0x6F, 0xFE, 0x5C, 0x44, 0x44, + 0x6E, 0x79, 0x64, 0x5C, 0x29, 0x9F, 0x06, 0xFE, 0x1A, 0xF0, 0xEB, 0xB2, 0x7D, 0xBC, 0x37, 0xA9, + 0x2A, 0x50, 0xD6, 0xE0, 0x64, 0xB7, 0x00, 0x91, 0xE3, 0x84, 0xC0, 0xC9, 0x2A, 0x00, 0xA0, 0xA4, + 0x35, 0xDF, 0xD3, 0x01, 0x63, 0x79, 0x63, 0x02, 0x28, 0x6F, 0x30, 0xC0, 0x5A, 0x4B, 0xFF, 0x15, + 0x09, 0x80, 0x8A, 0xE5, 0x4E, 0x04, 0xCC, 0xED, 0x6A, 0xA0, 0x3F, 0x06, 0xAF, 0xD2, 0x60, 0x4D, + 0x34, 0xB0, 0x7F, 0xF0, 0x23, 0xDB, 0x17, 0x46, 0xFD, 0xA1, 0xDF, 0xFE, 0x83, 0xB6, 0x47, 0x2F, + 0xCF, 0x2D, 0x45, 0x7F, 0xFE, 0x5C, 0x49, 0x00, 0xFB, 0x3B, 0x1B, 0x3B, 0x90, 0xDB, 0xD2, 0xDB, + 0x4F, 0x71, 0xED, 0x97, 0xEE, 0x17, 0x91, 0xE3, 0x8C, 0x75, 0x6C, 0x40, 0xAF, 0xCF, 0xB3, 0xDB, + 0x97, 0xA4, 0xC7, 0xD2, 0x1D, 0xF7, 0x9E, 0x3D, 0x7A, 0x24, 0x5D, 0x22, 0x40, 0x03, 0xFD, 0xB9, + 0x6C, 0x25, 0xC1, 0x9F, 0x1F, 0x55, 0x4A, 0xFC, 0xAF, 0xFF, 0xFE, 0xDF, 0x92, 0xBC, 0xFE, 0xDA, + 0xAC, 0x39, 0x21, 0x70, 0xB2, 0xF5, 0xFF, 0xA6, 0x9B, 0x6E, 0x12, 0x91, 0xE3, 0xD6, 0xFF, 0x27, + 0x9E, 0x78, 0x42, 0x6E, 0xBA, 0xE9, 0x26, 0xB9, 0xEA, 0xE6, 0xD7, 0x8F, 0x9F, 0x2F, 0xDB, 0xE3, + 0x04, 0xA4, 0x4A, 0x00, 0x8C, 0x1D, 0xEC, 0x77, 0xCD, 0xD7, 0x73, 0x0C, 0xF3, 0x02, 0x7F, 0x2F, + 0x00, 0x62, 0x99, 0xE5, 0x35, 0x2C, 0xAB, 0xD0, 0xE0, 0x7F, 0xB6, 0x2B, 0x80, 0xDE, 0xAB, 0xB5, + 0x56, 0xFA, 0xAF, 0x48, 0x00, 0x34, 0x20, 0x75, 0x22, 0x20, 0xA4, 0x95, 0x83, 0xB7, 0x04, 0x6D, + 0xC9, 0xD7, 0x04, 0x40, 0xEC, 0xF3, 0xB1, 0x5B, 0xEC, 0x54, 0x80, 0xCC, 0x06, 0x90, 0x97, 0x5E, + 0xC0, 0xC6, 0x96, 0xF2, 0x97, 0x3C, 0x47, 0xD8, 0x2A, 0x85, 0xD4, 0xCF, 0x17, 0x39, 0x6E, 0xF9, + 0xF7, 0x12, 0x00, 0x5E, 0x65, 0x80, 0x47, 0x6F, 0x04, 0x6C, 0x62, 0xE5, 0xCF, 0xFF, 0xD5, 0xBF, + 0x16, 0x91, 0xE3, 0x44, 0xC0, 0xDA, 0x2B, 0x01, 0x6C, 0x60, 0xAF, 0xCB, 0xDA, 0x05, 0x45, 0xCC, + 0xF2, 0xBE, 0xB3, 0xDD, 0x1A, 0x9C, 0x0C, 0xFE, 0x6F, 0xBA, 0xE9, 0xA6, 0x53, 0x5D, 0x02, 0x94, + 0x4D, 0x06, 0x5C, 0xBA, 0x74, 0xA9, 0xE8, 0x20, 0x80, 0x76, 0xAA, 0x2B, 0xAC, 0x5F, 0xE8, 0xBB, + 0xB6, 0xEB, 0x59, 0x66, 0x79, 0x4D, 0xCB, 0x2A, 0xD4, 0xE7, 0xDF, 0x7B, 0xBE, 0xD5, 0xCA, 0x75, + 0x8B, 0x04, 0x40, 0x43, 0x72, 0xCF, 0x1A, 0x30, 0xF5, 0x75, 0xD7, 0x38, 0x8D, 0xA0, 0xCD, 0xE8, + 0xD9, 0x96, 0x7F, 0x4B, 0xD7, 0x3F, 0x24, 0x67, 0x06, 0xB7, 0xEF, 0xDD, 0xD4, 0xD6, 0x59, 0xFA, + 0xFE, 0xE7, 0xE1, 0x05, 0xA8, 0xB1, 0x34, 0x60, 0xD3, 0x20, 0x3B, 0x47, 0x80, 0x62, 0xF7, 0x4D, + 0x97, 0x5F, 0xFC, 0xDD, 0xE1, 0xF2, 0xFD, 0x77, 0x5D, 0x0E, 0x3E, 0x3F, 0x36, 0x09, 0xA0, 0x81, + 0x7F, 0x28, 0xD0, 0x7F, 0xF4, 0x33, 0xEF, 0x10, 0x91, 0xF8, 0xB1, 0x00, 0x6A, 0xEA, 0x32, 0xB1, + 0x24, 0xFD, 0xFB, 0x1F, 0xBB, 0xFC, 0xCA, 0xD6, 0xBF, 0x7A, 0x1C, 0xE9, 0xB2, 0x97, 0x20, 0x68, + 0xE5, 0x86, 0x2A, 0x86, 0x26, 0x02, 0x62, 0x5C, 0x75, 0xF3, 0xEB, 0x5B, 0x15, 0x01, 0x29, 0x7C, + 0xE1, 0x9E, 0xAB, 0x93, 0xBE, 0x1E, 0x00, 0xB4, 0xC8, 0xB6, 0xF8, 0xDB, 0xE4, 0xA7, 0x2D, 0xED, + 0x5F, 0x1B, 0x12, 0x00, 0x0D, 0xCA, 0x9D, 0x08, 0x98, 0x3B, 0x8A, 0x39, 0x80, 0xB6, 0x68, 0x49, + 0x7F, 0xA8, 0x12, 0xC0, 0x06, 0x6E, 0x39, 0x69, 0xF0, 0x6C, 0xCB, 0xE9, 0x5F, 0x3C, 0x0A, 0xFC, + 0xB5, 0x0B, 0x80, 0x4D, 0x04, 0x8C, 0x69, 0xF9, 0xB7, 0xAF, 0x9D, 0xAA, 0x02, 0x60, 0xAC, 0xB5, + 0x56, 0x02, 0x6C, 0xAE, 0x55, 0x26, 0xB0, 0xBF, 0xE2, 0x53, 0x87, 0xB7, 0x1E, 0xAF, 0x3E, 0xFE, + 0x7B, 0x11, 0x39, 0x0E, 0x4A, 0x75, 0x59, 0x8F, 0xB3, 0x56, 0x6F, 0xBC, 0xEC, 0x34, 0x7E, 0x1E, + 0x5B, 0xFE, 0x3F, 0xE4, 0xAA, 0x9B, 0x5F, 0x97, 0xD7, 0x9E, 0xFC, 0xE3, 0x64, 0xFB, 0x06, 0x00, + 0x08, 0x4F, 0xF7, 0xA7, 0x53, 0x34, 0x7B, 0xA3, 0xFC, 0xB7, 0x8E, 0x04, 0x40, 0xC3, 0x72, 0x27, + 0x02, 0x28, 0x01, 0xF4, 0x47, 0x05, 0x4F, 0xF5, 0x7C, 0x2C, 0x47, 0x7F, 0x2F, 0x53, 0xFB, 0xDC, + 0xEB, 0x76, 0x4B, 0x6D, 0x9F, 0x92, 0x5E, 0xD0, 0xF4, 0xF8, 0xB5, 0x89, 0x00, 0x1B, 0x90, 0x5D, + 0x28, 0xD8, 0xA2, 0x6D, 0x03, 0x7C, 0xEF, 0x71, 0x4D, 0x62, 0xC8, 0x88, 0x04, 0x40, 0xAC, 0xD8, + 0x0A, 0x01, 0x1C, 0xDB, 0xDB, 0xDB, 0x3B, 0x75, 0x8D, 0xD2, 0xC0, 0xFF, 0x81, 0x8B, 0x2F, 0x8B, + 0xC8, 0x71, 0x42, 0x40, 0x97, 0x37, 0xAD, 0xD3, 0x17, 0x4F, 0xBF, 0x56, 0x4B, 0x34, 0xA8, 0x3F, + 0x2F, 0xE7, 0xE5, 0xAA, 0x9B, 0x5F, 0xDF, 0x94, 0xFC, 0xDB, 0x31, 0x00, 0x00, 0x00, 0x65, 0xD9, + 0x46, 0x4E, 0x2F, 0x11, 0x10, 0x1A, 0xF5, 0xBF, 0xF5, 0x84, 0x00, 0x09, 0x80, 0x15, 0x48, 0x9D, + 0x08, 0x08, 0xF5, 0x7B, 0x51, 0x3D, 0xB6, 0xFC, 0xDB, 0x40, 0xC9, 0x2E, 0xA3, 0x1D, 0x73, 0x8F, + 0xDF, 0xB9, 0x09, 0xB2, 0x9A, 0x12, 0x6C, 0x1A, 0x60, 0x79, 0x5D, 0x03, 0xEC, 0xE8, 0xB6, 0x25, + 0xA7, 0xFF, 0xB3, 0xDD, 0x40, 0xEC, 0x20, 0x80, 0x9A, 0x08, 0xD0, 0x7F, 0x73, 0x5C, 0x94, 0x4B, + 0x05, 0xFE, 0x6B, 0xAB, 0x04, 0xF0, 0xBA, 0x3E, 0xD8, 0x16, 0x7F, 0x5B, 0x96, 0x3E, 0xD4, 0x05, + 0xA0, 0xB5, 0x24, 0x80, 0xC8, 0x71, 0x22, 0xE0, 0x64, 0x12, 0x40, 0xD9, 0xD6, 0xFF, 0xDF, 0x7C, + 0xE7, 0x4D, 0xC1, 0x6A, 0x00, 0x00, 0xC0, 0x38, 0xB6, 0xD4, 0xDF, 0xC6, 0x38, 0x5E, 0x9F, 0x7F, + 0xDD, 0xCE, 0xBB, 0xA7, 0x68, 0x7D, 0xBC, 0x34, 0x12, 0x00, 0x2B, 0x92, 0x6B, 0xD6, 0x00, 0xFB, + 0x3A, 0x3D, 0x06, 0xFE, 0xC0, 0x1A, 0x6D, 0x5A, 0xCD, 0x8F, 0x02, 0xFA, 0x7D, 0xF3, 0xB8, 0xBD, + 0xC0, 0x69, 0xE0, 0xAF, 0x15, 0x01, 0x35, 0x39, 0x4E, 0x14, 0xA4, 0x1B, 0x38, 0x32, 0x55, 0xE0, + 0x6F, 0xC7, 0x02, 0xB0, 0x83, 0x01, 0xAE, 0xD1, 0xFE, 0xFE, 0xFE, 0x26, 0x80, 0x57, 0x17, 0x1E, + 0x1F, 0xEE, 0x3A, 0xA2, 0x89, 0x00, 0x55, 0xE3, 0xF1, 0x35, 0xC6, 0x50, 0x30, 0xAF, 0x49, 0x80, + 0x93, 0xCB, 0xBB, 0x9E, 0x0F, 0x00, 0x98, 0xCF, 0x0B, 0xF8, 0xAD, 0xB1, 0x2D, 0xFE, 0xAD, 0x76, + 0x51, 0x53, 0x24, 0x00, 0x56, 0x28, 0xF7, 0xF4, 0x81, 0xDE, 0xF3, 0x80, 0x16, 0xC5, 0x26, 0xB4, + 0xE6, 0x66, 0x7B, 0x5B, 0xC8, 0x16, 0x6B, 0x80, 0x7A, 0xAA, 0x24, 0xAE, 0x40, 0x9F, 0xFF, 0x54, + 0x52, 0x0E, 0x1C, 0x69, 0xC7, 0x04, 0xA0, 0x0B, 0xC0, 0x34, 0x76, 0xB0, 0x3F, 0xEF, 0x78, 0x0A, + 0x0D, 0x0E, 0xD8, 0x12, 0x2F, 0x09, 0x10, 0xF3, 0x3C, 0xBB, 0xFE, 0x8F, 0x19, 0x02, 0x00, 0x00, + 0x26, 0xB1, 0x31, 0x4A, 0xEC, 0x34, 0x81, 0xF6, 0xF9, 0x7A, 0x5F, 0xD4, 0x7A, 0xE9, 0xBF, 0x22, + 0x01, 0xB0, 0x62, 0xB9, 0x13, 0x01, 0x6B, 0x0E, 0xFC, 0xF5, 0x87, 0xED, 0x4D, 0xFF, 0x77, 0xFB, + 0x0F, 0x6E, 0xD8, 0xB9, 0xCC, 0x74, 0x80, 0xED, 0x58, 0xF3, 0x71, 0x3C, 0x95, 0x1D, 0xFD, 0xB6, + 0x86, 0x51, 0xEC, 0xBD, 0xD2, 0xFF, 0x12, 0x4A, 0x07, 0xFE, 0x6B, 0xE8, 0x0A, 0xB0, 0xB7, 0xB7, + 0x77, 0x2A, 0x90, 0x57, 0xA1, 0x16, 0x7E, 0xBB, 0xBE, 0xB5, 0x2E, 0x00, 0x5E, 0x40, 0x1F, 0xD3, + 0xD2, 0x4F, 0x35, 0x00, 0x00, 0xA4, 0x67, 0x03, 0x79, 0xAF, 0xCF, 0xBF, 0xB7, 0xBE, 0xF5, 0x16, + 0x7F, 0x8B, 0x04, 0x40, 0x07, 0x52, 0x27, 0x02, 0x7A, 0x66, 0x13, 0x02, 0x5E, 0x82, 0x00, 0xED, + 0x88, 0xAD, 0x00, 0x88, 0xAD, 0x88, 0xC9, 0xB5, 0xFD, 0xD8, 0xD9, 0x39, 0x62, 0x78, 0x7D, 0xFE, + 0x43, 0x01, 0xFF, 0x12, 0x17, 0x42, 0x1B, 0xF8, 0x6B, 0x4B, 0xBF, 0x66, 0xE3, 0xEF, 0xBC, 0x6F, + 0xFC, 0x6B, 0x86, 0xC6, 0xF0, 0x48, 0x1D, 0xF8, 0xF7, 0xD4, 0x15, 0xE0, 0x64, 0x17, 0x00, 0x2F, + 0x11, 0xE0, 0x19, 0xFB, 0xFC, 0xDA, 0xFC, 0xE6, 0x3B, 0x6F, 0x12, 0x91, 0xF9, 0x65, 0xFE, 0xBF, + 0xF9, 0xCE, 0x9B, 0xE4, 0xD2, 0xA5, 0x4B, 0x4D, 0x25, 0x3F, 0x00, 0xA0, 0x46, 0x5E, 0xA0, 0xEF, + 0xC5, 0x36, 0x5E, 0xE0, 0xBF, 0x96, 0x44, 0x00, 0x09, 0x80, 0x8E, 0xE4, 0x9E, 0x35, 0x60, 0x2E, + 0xBD, 0x19, 0xD7, 0x9B, 0x9D, 0x1A, 0xF6, 0x4F, 0x5B, 0xF2, 0x6D, 0xA0, 0x1F, 0x7A, 0x1C, 0x68, + 0xC9, 0xD8, 0x69, 0x00, 0x97, 0x60, 0x03, 0xFF, 0x12, 0x6C, 0x17, 0x80, 0x54, 0x25, 0x7F, 0xF6, + 0xF3, 0x5E, 0x6B, 0x22, 0x20, 0xB6, 0xF4, 0xDF, 0x3A, 0xF5, 0xFC, 0xC6, 0x02, 0x60, 0x9D, 0xFE, + 0xEF, 0xBC, 0x9C, 0xDF, 0x7A, 0xEC, 0xE4, 0xF2, 0x55, 0x37, 0xBF, 0xBE, 0x49, 0x14, 0x9C, 0x4C, + 0x0E, 0x9C, 0x7C, 0x3C, 0x34, 0x8D, 0xE0, 0x14, 0x6F, 0xBB, 0xE6, 0x2B, 0xC9, 0x5F, 0x13, 0x00, + 0x6A, 0xE3, 0xB5, 0xF8, 0x6B, 0xA9, 0xBF, 0x2E, 0xB7, 0x5E, 0xCA, 0x3F, 0x15, 0x09, 0x80, 0x0E, + 0xD5, 0x9E, 0x08, 0xA8, 0x69, 0xFF, 0x6C, 0xCB, 0x60, 0x68, 0x16, 0x80, 0x07, 0xDF, 0xD8, 0x7E, + 0x1E, 0xEA, 0x67, 0x8F, 0x37, 0x9D, 0xFB, 0x35, 0xB6, 0xA5, 0x7E, 0xE9, 0xED, 0x53, 0xB0, 0x17, + 0x48, 0x7B, 0xFC, 0x6A, 0x52, 0x4E, 0xD7, 0x2F, 0x91, 0x01, 0xF7, 0x02, 0xFF, 0x14, 0x5D, 0x01, + 0x4A, 0x57, 0x02, 0xA8, 0xF7, 0x3B, 0x53, 0x16, 0x6A, 0x17, 0x00, 0xFD, 0xF7, 0x67, 0x59, 0xDE, + 0x3D, 0xAF, 0xBD, 0xBD, 0xBD, 0xD1, 0xA5, 0xFF, 0xD6, 0xC9, 0xE9, 0x27, 0x5B, 0x6C, 0x05, 0xB7, + 0x01, 0xFC, 0xC9, 0x65, 0x9D, 0x22, 0x50, 0xE4, 0xB8, 0x62, 0x60, 0xD7, 0xB6, 0x73, 0xD5, 0x30, + 0xDD, 0x28, 0x00, 0x94, 0x12, 0x5B, 0xDA, 0xAF, 0xD6, 0xD2, 0xB7, 0x3F, 0x16, 0x09, 0x80, 0x8E, + 0xD5, 0x14, 0x68, 0x0F, 0x59, 0x72, 0xFF, 0xBC, 0xC0, 0x3F, 0xB4, 0xAC, 0xDB, 0xF5, 0x76, 0x22, + 0x41, 0xDB, 0xB4, 0xA5, 0xD5, 0xAB, 0x00, 0x08, 0xAD, 0x5F, 0x52, 0xCA, 0x8A, 0x80, 0xDC, 0xBF, + 0x57, 0x7B, 0x5E, 0xF1, 0xCE, 0x13, 0xDA, 0xF7, 0x5F, 0x13, 0x00, 0x2D, 0x5A, 0x4B, 0x99, 0x64, + 0x09, 0xB6, 0xAB, 0x40, 0x8E, 0x96, 0xFF, 0x9A, 0xA6, 0x1D, 0x05, 0x80, 0x5C, 0xBC, 0x41, 0xFC, + 0x94, 0x4D, 0x0C, 0xE8, 0xB5, 0xAA, 0xB7, 0x84, 0x00, 0x09, 0x00, 0x90, 0x08, 0x18, 0xF0, 0xF0, + 0xF5, 0x1F, 0xDC, 0x5A, 0x0E, 0x0D, 0xCA, 0xA5, 0xEB, 0xED, 0x76, 0x40, 0x0B, 0x6C, 0x49, 0xBA, + 0x37, 0x06, 0x40, 0xAB, 0x7D, 0xB2, 0x6B, 0x31, 0xF6, 0x46, 0x42, 0xCF, 0x37, 0x2D, 0xB6, 0x7E, + 0x23, 0x6C, 0xA8, 0xE5, 0xFF, 0xAA, 0x9B, 0x5F, 0x97, 0xF3, 0x72, 0x3E, 0x4B, 0x12, 0x00, 0x00, + 0xD6, 0xC6, 0x8E, 0xE2, 0x1F, 0xEA, 0xEB, 0x6F, 0xBB, 0x02, 0x78, 0x81, 0x7E, 0x0B, 0x33, 0x37, + 0xCD, 0x41, 0x02, 0x00, 0x1B, 0x24, 0x02, 0x8E, 0x8D, 0x1D, 0x7D, 0xBB, 0xE5, 0xD1, 0xBA, 0x01, + 0x5B, 0xC1, 0x62, 0x5B, 0xFA, 0x4F, 0x96, 0x62, 0x03, 0x48, 0x83, 0xD1, 0xFE, 0x01, 0x60, 0x1E, + 0x1B, 0xE0, 0xDB, 0xD8, 0x40, 0x97, 0x43, 0xB3, 0x00, 0xD8, 0x44, 0xC0, 0xDA, 0xEF, 0x77, 0x48, + 0x00, 0xE0, 0x14, 0x12, 0x01, 0x40, 0x9F, 0xD6, 0x5A, 0xEA, 0x06, 0xD4, 0xE6, 0xD2, 0xA5, 0x4B, + 0x22, 0x34, 0xF2, 0xBB, 0x74, 0x0C, 0x94, 0xB5, 0xDF, 0x84, 0x03, 0x98, 0xC7, 0xC6, 0x00, 0xB6, + 0x22, 0x40, 0xC5, 0x8E, 0x09, 0xB0, 0xF6, 0xD2, 0x7F, 0x45, 0x02, 0x00, 0xAE, 0xDA, 0x03, 0xED, + 0x5C, 0xFB, 0x47, 0xB9, 0x6D, 0x1A, 0xAD, 0x7C, 0x8E, 0x53, 0x67, 0x9D, 0xF0, 0xB2, 0xCD, 0xA5, + 0xB6, 0x9F, 0xA3, 0xF6, 0xEF, 0x26, 0xF7, 0xFE, 0xB5, 0xFE, 0xFA, 0x2D, 0xE8, 0xF9, 0x33, 0xE8, + 0xF9, 0x6F, 0x9F, 0xAB, 0xE4, 0xE0, 0xA7, 0xBD, 0xE1, 0xB3, 0xC5, 0x1A, 0x85, 0x5A, 0xF8, 0x35, + 0x11, 0x60, 0x9F, 0xA7, 0xBF, 0x07, 0x6F, 0xBA, 0xBF, 0xB5, 0x23, 0x01, 0x80, 0xA0, 0x5E, 0x12, + 0x01, 0x6B, 0xEF, 0xEF, 0x53, 0x4A, 0xAD, 0x9F, 0xA3, 0x1E, 0x27, 0xDE, 0xCD, 0xB9, 0x77, 0x73, + 0xA4, 0xDB, 0xD9, 0xED, 0xC7, 0x8E, 0xF2, 0x3F, 0x77, 0xFB, 0x14, 0xA3, 0x78, 0xD7, 0xFA, 0xDD, + 0xA8, 0xDC, 0xFB, 0xD7, 0xFA, 0xEB, 0xB7, 0xA0, 0xE7, 0xCF, 0xA0, 0xE7, 0xBF, 0x7D, 0x2E, 0x7B, + 0x3E, 0xEC, 0xED, 0x66, 0x3C, 0x27, 0x8E, 0x4B, 0xF4, 0x20, 0xD4, 0xC2, 0x6F, 0xC7, 0x08, 0xF0, + 0xCE, 0x31, 0xBD, 0x9C, 0x7B, 0xCE, 0x88, 0xC8, 0xF0, 0xBC, 0x47, 0x80, 0x63, 0x6A, 0x8B, 0xA9, + 0x27, 0x75, 0xA9, 0x5F, 0xEA, 0xFD, 0x43, 0xDB, 0xD6, 0x52, 0x4A, 0xAA, 0x65, 0x69, 0x8C, 0xE6, + 0x0D, 0x60, 0x2D, 0x08, 0xFC, 0xC3, 0x38, 0xF7, 0x03, 0xA7, 0xD9, 0x52, 0x7F, 0xBB, 0x7C, 0xEE, + 0xDC, 0xB9, 0xAD, 0xE7, 0xF7, 0x52, 0xDA, 0x1F, 0x8B, 0x0A, 0x00, 0x8C, 0xD6, 0x4B, 0x45, 0x00, + 0x00, 0x00, 0x48, 0x8F, 0xC0, 0x1F, 0xC0, 0x1C, 0x5E, 0x1F, 0x7E, 0x5D, 0x3E, 0x38, 0x38, 0x10, + 0x91, 0xD3, 0x5D, 0x03, 0x70, 0x88, 0x04, 0x00, 0x26, 0xAB, 0x3D, 0xD0, 0xAE, 0x7D, 0xFF, 0x00, + 0x00, 0xE8, 0x09, 0x81, 0x3F, 0x80, 0x39, 0x34, 0xA0, 0x57, 0x5E, 0x22, 0xC0, 0x76, 0x05, 0xB0, + 0xE7, 0x9A, 0xDE, 0x2B, 0x02, 0x48, 0x00, 0x60, 0xB6, 0xDA, 0x03, 0xED, 0xDA, 0xF7, 0x0F, 0x00, + 0x80, 0x35, 0x23, 0xF0, 0x07, 0x30, 0x85, 0x2D, 0xED, 0xF7, 0xA6, 0xFD, 0xB3, 0x8F, 0xEB, 0x76, + 0xDA, 0x15, 0xC0, 0x06, 0xFC, 0xBD, 0x57, 0x04, 0x90, 0x00, 0x40, 0x32, 0xB5, 0x07, 0xDA, 0xB5, + 0xEF, 0x1F, 0x00, 0x00, 0x6B, 0x42, 0xE0, 0x0F, 0x60, 0x0E, 0x2F, 0xE0, 0xB7, 0xEC, 0xE3, 0x36, + 0xC0, 0xB7, 0xCB, 0xBD, 0x9F, 0x8B, 0x48, 0x00, 0x20, 0xB9, 0xDA, 0x03, 0xED, 0xDA, 0xF7, 0x0F, + 0x00, 0x80, 0x96, 0x11, 0xF8, 0x03, 0x48, 0xC1, 0xDE, 0xA3, 0x87, 0x06, 0xFF, 0xB3, 0x5D, 0x04, + 0xEC, 0x4C, 0x4C, 0xBD, 0x97, 0xFE, 0x2B, 0x12, 0x00, 0xC8, 0xA6, 0xF6, 0x0B, 0x7E, 0xED, 0xFB, + 0x07, 0x0C, 0x61, 0x2E, 0x67, 0x00, 0xAD, 0xE0, 0x3A, 0x9B, 0x0E, 0xE7, 0x7E, 0xF4, 0xC8, 0x96, + 0xF4, 0xC7, 0xF6, 0xF9, 0xD7, 0xF5, 0x94, 0xFE, 0x0F, 0x23, 0x01, 0x80, 0xEC, 0x42, 0xF3, 0xAF, + 0x2F, 0xAD, 0xF6, 0xFD, 0x03, 0x44, 0xB8, 0x68, 0x01, 0x68, 0x07, 0x81, 0x7F, 0x3A, 0x9C, 0xFB, + 0x01, 0x3F, 0xD0, 0xF7, 0xAA, 0x78, 0xBD, 0xDF, 0x0D, 0xE7, 0xA6, 0x43, 0x67, 0x44, 0xE4, 0x8D, + 0xA5, 0x77, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xF5, 0x07, 0x4B, 0xEF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xC8, 0x8F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x20, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x07, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x01, 0x12, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, + 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x07, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xD0, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1D, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x07, 0x48, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xD0, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x80, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x07, 0x48, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, + 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x07, 0xFE, 0x70, 0xE9, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x50, 0xDE, 0x1B, 0x6F, 0xBC, 0x11, + 0xF5, 0xBC, 0x33, 0x67, 0xCE, 0x64, 0xDE, 0x93, 0x79, 0x42, 0x7F, 0x47, 0xED, 0xFB, 0xDF, 0x2A, + 0xFB, 0xB9, 0x7B, 0x9F, 0x73, 0xEC, 0xF3, 0x4A, 0xED, 0x4F, 0xEF, 0xA8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA0, 0x03, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xD5, 0x62, 0xAA, 0x2D, 0xAA, + 0xFA, 0x6F, 0x6D, 0x2D, 0xAA, 0xA1, 0x16, 0xDF, 0xB1, 0xFB, 0x4F, 0x0B, 0x72, 0x59, 0xA9, 0x3F, + 0xEF, 0xB9, 0xDB, 0xF7, 0xF2, 0xFD, 0x53, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x07, 0xA8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x5A, 0x6C, 0x0B, 0xBC, 0xB7, 0x3E, 0xB7, 0xB1, 0x2D, 0xFE, + 0xA1, 0xF5, 0xB1, 0x7D, 0xDC, 0x63, 0xF7, 0x23, 0xD5, 0xE7, 0xD7, 0xFB, 0x18, 0x08, 0xDE, 0xDF, + 0x5F, 0xFB, 0xF7, 0xBF, 0x14, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x26, 0xB7, 0xA4, 0x2E, 0x45, 0xF7, 0xCB, 0xF6, 0xF5, 0xF7, 0x9E, 0x17, + 0x7A, 0x7C, 0x6C, 0xC5, 0x42, 0xEA, 0x31, 0x08, 0xC6, 0x5A, 0xFA, 0xFD, 0x43, 0xFB, 0x35, 0xF6, + 0xFD, 0xA6, 0x1E, 0x7F, 0xF6, 0x38, 0x88, 0xD5, 0xFA, 0xF7, 0x3F, 0x15, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x74, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xB4, 0x60, 0x5A, 0xA1, + 0xBE, 0xD9, 0xA5, 0xF6, 0x7F, 0x6C, 0x0B, 0xF4, 0xDA, 0xDF, 0x3F, 0x55, 0x8B, 0x7C, 0xED, 0xC7, + 0x9F, 0x5A, 0xFA, 0xF3, 0x8F, 0x45, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xA0, 0x02, + 0x00, 0x00, 0x00, 0x00, 0xC0, 0x68, 0xB1, 0x7D, 0xF0, 0x73, 0x59, 0x7A, 0x96, 0x01, 0x6B, 0xEC, + 0xFB, 0xCF, 0x1D, 0xC3, 0x60, 0xEE, 0xFB, 0xE7, 0x32, 0xB5, 0x4F, 0x7E, 0xEB, 0x6A, 0xF9, 0xFC, + 0x43, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x03, 0x67, 0x44, 0xA4, 0xAF, 0xD4, 0x0C, + 0x00, 0x00, 0x00, 0x80, 0xE8, 0x16, 0xDA, 0xB9, 0xA3, 0xB9, 0x2F, 0xDD, 0xF7, 0x3E, 0xF7, 0x68, + 0xF4, 0xA9, 0xDE, 0x7F, 0xEA, 0xE7, 0xB6, 0xD4, 0x3C, 0xF4, 0xB1, 0xFB, 0xEB, 0x3D, 0x2F, 0x76, + 0x14, 0xFD, 0xB1, 0xAF, 0x6F, 0xB5, 0xF2, 0xFD, 0x97, 0x42, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1D, 0xA0, 0x02, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x68, 0xAD, 0xB5, 0x7C, 0x02, 0xA0, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2E, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x07, + 0xFE, 0x3F, 0x46, 0xBD, 0xA4, 0x7A, 0x57, 0x3D, 0x97, 0x94, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, + 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 +}; diff --git a/lz.c b/lz.c new file mode 100644 index 0000000..f22c8f7 --- /dev/null +++ b/lz.c @@ -0,0 +1,556 @@ +/************************************************************************* +* Name: lz.c +* Author: Marcus Geelnard +* Description: LZ77 coder/decoder implementation. +* Reentrant: Yes +* +* The LZ77 compression scheme is a substitutional compression scheme +* proposed by Abraham Lempel and Jakob Ziv in 1977. It is very simple in +* its design, and uses no fancy bit level compression. +* +* This is my first attempt at an implementation of a LZ77 code/decoder. +* +* The principle of the LZ77 compression algorithm is to store repeated +* occurrences of strings as references to previous occurrences of the same +* string. The point is that the reference consumes less space than the +* string itself, provided that the string is long enough (in this +* implementation, the string has to be at least 4 bytes long, since the +* minimum coded reference is 3 bytes long). Also note that the term +* "string" refers to any kind of byte sequence (it does not have to be +* an ASCII string, for instance). +* +* The coder uses a brute force approach to finding string matches in the +* history buffer (or "sliding window", if you wish), which is very, very +* slow. I recon the complexity is somewhere between O(n^2) and O(n^3), +* depending on the input data. +* +* There is also a faster implementation that uses a large working buffer +* in which a "jump table" is stored, which is used to quickly find +* possible string matches (see the source code for LZ_CompressFast() for +* more information). The faster method is an order of magnitude faster, +* but still quite slow compared to other compression methods. +* +* The upside is that decompression is very fast, and the compression ratio +* is often very good. +* +* The reference to a string is coded as a (length,offset) pair, where the +* length indicates the length of the string, and the offset gives the +* offset from the current data position. To distinguish between string +* references and literal strings (uncompressed bytes), a string reference +* is preceded by a marker byte, which is chosen as the least common byte +* symbol in the input data stream (this marker byte is stored in the +* output stream as the first byte). +* +* Occurrences of the marker byte in the stream are encoded as the marker +* byte followed by a zero byte, which means that occurrences of the marker +* byte have to be coded with two bytes. +* +* The lengths and offsets are coded in a variable length fashion, allowing +* values of any magnitude (up to 4294967295 in this implementation). +* +* With this compression scheme, the worst case compression result is +* (257/256)*insize + 1. +* +*------------------------------------------------------------------------- +* Copyright (c) 2003-2006 Marcus Geelnard +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would +* be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not +* be misrepresented as being the original software. +* +* 3. This notice may not be removed or altered from any source +* distribution. +* +* Marcus Geelnard +* marcus.geelnard at home.se +*************************************************************************/ + + +/************************************************************************* +* Constants used for LZ77 coding +*************************************************************************/ + +/* Maximum offset (can be any size < 2^31). Lower values give faster + compression, while higher values gives better compression. The default + value of 100000 is quite high. Experiment to see what works best for + you. */ +#define LZ_MAX_OFFSET 100000 + + + +/************************************************************************* +* INTERNAL FUNCTIONS * +*************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include "lz.h" + +/************************************************************************* +* _LZ_StringCompare() - Return maximum length string match. +*************************************************************************/ + +static unsigned int _LZ_StringCompare( unsigned char * str1, + unsigned char * str2, unsigned int minlen, unsigned int maxlen ) +{ + unsigned int len; + + for( len = minlen; (len < maxlen) && (str1[len] == str2[len]); ++ len ); + + return len; +} + + +/************************************************************************* +* _LZ_WriteVarSize() - Write unsigned integer with variable number of +* bytes depending on value. +*************************************************************************/ + +static int _LZ_WriteVarSize( unsigned int x, unsigned char * buf ) +{ + unsigned int y; + int num_bytes, i, b; + + /* Determine number of bytes needed to store the number x */ + y = x >> 3; + for( num_bytes = 5; num_bytes >= 2; -- num_bytes ) + { + if( y & 0xfe000000 ) break; + y <<= 7; + } + + /* Write all bytes, seven bits in each, with 8:th bit set for all */ + /* but the last byte. */ + for( i = num_bytes-1; i >= 0; -- i ) + { + b = (x >> (i*7)) & 0x0000007f; + if( i > 0 ) + { + b |= 0x00000080; + } + *buf ++ = (unsigned char) b; + } + + /* Return number of bytes written */ + return num_bytes; +} + + +/************************************************************************* +* _LZ_ReadVarSize() - Read unsigned integer with variable number of +* bytes depending on value. +*************************************************************************/ + +static int _LZ_ReadVarSize( unsigned int * x, unsigned char * buf ) +{ + unsigned int y, b, num_bytes; + + /* Read complete value (stop when byte contains zero in 8:th bit) */ + y = 0; + num_bytes = 0; + do + { + b = (unsigned int) (*buf ++); + y = (y << 7) | (b & 0x0000007f); + ++ num_bytes; + } + while( b & 0x00000080 ); + + /* Store value in x */ + *x = y; + + /* Return number of bytes read */ + return num_bytes; +} + + + +/************************************************************************* +* PUBLIC FUNCTIONS * +*************************************************************************/ + + +/************************************************************************* +* LZ_Compress() - Compress a block of data using an LZ77 coder. +* in - Input (uncompressed) buffer. +* out - Output (compressed) buffer. This buffer must be 0.4% larger +* than the input buffer, plus one byte. +* insize - Number of input bytes. +* The function returns the size of the compressed data. +*************************************************************************/ + +int LZ_Compress( unsigned char *in, unsigned char *out, unsigned int insize ) +{ + unsigned char marker, symbol; + unsigned int inpos, outpos, bytesleft, i; + unsigned int maxoffset, offset, bestoffset; + unsigned int maxlength, length, bestlength; + unsigned int histogram[ 256 ]; + unsigned char *ptr1, *ptr2; + + /* Do we have anything to compress? */ + if( insize < 1 ) + { + return 0; + } + + /* Create histogram */ + for( i = 0; i < 256; ++ i ) + { + histogram[ i ] = 0; + } + for( i = 0; i < insize; ++ i ) + { + ++ histogram[ in[ i ] ]; + } + + /* Find the least common byte, and use it as the marker symbol */ + marker = 0; + for( i = 1; i < 256; ++ i ) + { + if( histogram[ i ] < histogram[ marker ] ) + { + marker = (unsigned char) i; + } + } + + /* Remember the marker symbol for the decoder */ + out[ 0 ] = marker; + + /* Start of compression */ + inpos = 0; + outpos = 1; + + /* Main compression loop */ + bytesleft = insize; + do + { + /* Determine most distant position */ + if( inpos > LZ_MAX_OFFSET ) maxoffset = LZ_MAX_OFFSET; + else maxoffset = inpos; + + /* Get pointer to current position */ + ptr1 = &in[ inpos ]; + + /* Search history window for maximum length string match */ + bestlength = 3; + bestoffset = 0; + for( offset = 3; offset <= maxoffset; ++ offset ) + { + /* Get pointer to candidate string */ + ptr2 = &ptr1[ -(int)offset ]; + + /* Quickly determine if this is a candidate (for speed) */ + if( (ptr1[ 0 ] == ptr2[ 0 ]) && + (ptr1[ bestlength ] == ptr2[ bestlength ]) ) + { + /* Determine maximum length for this offset */ + maxlength = (bytesleft < offset ? bytesleft : offset); + + /* Count maximum length match at this offset */ + length = _LZ_StringCompare( ptr1, ptr2, 0, maxlength ); + + /* Better match than any previous match? */ + if( length > bestlength ) + { + bestlength = length; + bestoffset = offset; + } + } + } + + /* Was there a good enough match? */ + if( (bestlength >= 8) || + ((bestlength == 4) && (bestoffset <= 0x0000007f)) || + ((bestlength == 5) && (bestoffset <= 0x00003fff)) || + ((bestlength == 6) && (bestoffset <= 0x001fffff)) || + ((bestlength == 7) && (bestoffset <= 0x0fffffff)) ) + { + out[ outpos ++ ] = (unsigned char) marker; + outpos += _LZ_WriteVarSize( bestlength, &out[ outpos ] ); + outpos += _LZ_WriteVarSize( bestoffset, &out[ outpos ] ); + inpos += bestlength; + bytesleft -= bestlength; + } + else + { + /* Output single byte (or two bytes if marker byte) */ + symbol = in[ inpos ++ ]; + out[ outpos ++ ] = symbol; + if( symbol == marker ) + { + out[ outpos ++ ] = 0; + } + -- bytesleft; + } + } + while( bytesleft > 3 ); + + /* Dump remaining bytes, if any */ + while( inpos < insize ) + { + if( in[ inpos ] == marker ) + { + out[ outpos ++ ] = marker; + out[ outpos ++ ] = 0; + } + else + { + out[ outpos ++ ] = in[ inpos ]; + } + ++ inpos; + } + + return outpos; +} + + +/************************************************************************* +* LZ_CompressFast() - Compress a block of data using an LZ77 coder. +* in - Input (uncompressed) buffer. +* out - Output (compressed) buffer. This buffer must be 0.4% larger +* than the input buffer, plus one byte. +* insize - Number of input bytes. +* work - Pointer to a temporary buffer (internal working buffer), which +* must be able to hold (insize+65536) unsigned integers. +* The function returns the size of the compressed data. +*************************************************************************/ + +int LZ_CompressFast( unsigned char *in, unsigned char *out, unsigned int insize) +{ + unsigned char marker, symbol; + unsigned int inpos, outpos, bytesleft, i, index, symbols; + unsigned int offset, bestoffset; + unsigned int maxlength, length, bestlength; + unsigned int histogram[ 256 ], *lastindex, *jumptable; + unsigned char *ptr1, *ptr2; + unsigned int *work; + + /* Do we have anything to compress? */ + if( insize < 1 ) + { + return 0; + } + + if(!(work = malloc(insize+65536 * sizeof(unsigned int)))) + { + //printf("Could not allocate compression buffer\n"); + //exit(0); + return 0; + } + + /* Assign arrays to the working area */ + lastindex = work; + jumptable = &work[ 65536 ]; + + /* Build a "jump table". Here is how the jump table works: + jumptable[i] points to the nearest previous occurrence of the same + symbol pair as in[i]:in[i+1], so in[i] == in[jumptable[i]] and + in[i+1] == in[jumptable[i]+1], and so on... Following the jump table + gives a dramatic boost for the string search'n'match loop compared + to doing a brute force search. The jump table is built in O(n) time, + so it is a cheap operation in terms of time, but it is expensice in + terms of memory consumption. */ + for( i = 0; i < 65536; ++ i ) + { + lastindex[ i ] = 0xffffffff; + } + for( i = 0; i < insize-1; ++ i ) + { + symbols = (((unsigned int)in[i]) << 8) | ((unsigned int)in[i+1]); + index = lastindex[ symbols ]; + lastindex[ symbols ] = i; + jumptable[ i ] = index; + } + jumptable[ insize-1 ] = 0xffffffff; + + /* Create histogram */ + for( i = 0; i < 256; ++ i ) + { + histogram[ i ] = 0; + } + for( i = 0; i < insize; ++ i ) + { + ++ histogram[ in[ i ] ]; + } + + /* Find the least common byte, and use it as the marker symbol */ + marker = 0; + for( i = 1; i < 256; ++ i ) + { + if( histogram[ i ] < histogram[ marker ] ) + { + marker = (unsigned char) i; + } + } + + /* Remember the marker symbol for the decoder */ + out[ 0 ] = marker; + + /* Start of compression */ + inpos = 0; + outpos = 1; + + /* Main compression loop */ + bytesleft = insize; + do + { + /* Get pointer to current position */ + ptr1 = &in[ inpos ]; + + /* Search history window for maximum length string match */ + bestlength = 3; + bestoffset = 0; + index = jumptable[ inpos ]; + while( (index != 0xffffffff) && ((inpos - index) < LZ_MAX_OFFSET) ) + { + /* Get pointer to candidate string */ + ptr2 = &in[ index ]; + + /* Quickly determine if this is a candidate (for speed) */ + if( ptr2[ bestlength ] == ptr1[ bestlength ] ) + { + /* Determine maximum length for this offset */ + offset = inpos - index; + maxlength = (bytesleft < offset ? bytesleft : offset); + + /* Count maximum length match at this offset */ + length = _LZ_StringCompare( ptr1, ptr2, 2, maxlength ); + + /* Better match than any previous match? */ + if( length > bestlength ) + { + bestlength = length; + bestoffset = offset; + } + } + + /* Get next possible index from jump table */ + index = jumptable[ index ]; + } + + /* Was there a good enough match? */ + if( (bestlength >= 8) || + ((bestlength == 4) && (bestoffset <= 0x0000007f)) || + ((bestlength == 5) && (bestoffset <= 0x00003fff)) || + ((bestlength == 6) && (bestoffset <= 0x001fffff)) || + ((bestlength == 7) && (bestoffset <= 0x0fffffff)) ) + { + out[ outpos ++ ] = (unsigned char) marker; + outpos += _LZ_WriteVarSize( bestlength, &out[ outpos ] ); + outpos += _LZ_WriteVarSize( bestoffset, &out[ outpos ] ); + inpos += bestlength; + bytesleft -= bestlength; + } + else + { + /* Output single byte (or two bytes if marker byte) */ + symbol = in[ inpos ++ ]; + out[ outpos ++ ] = symbol; + if( symbol == marker ) + { + out[ outpos ++ ] = 0; + } + -- bytesleft; + } + } + while( bytesleft > 3 ); + + /* Dump remaining bytes, if any */ + while( inpos < insize ) + { + if( in[ inpos ] == marker ) + { + out[ outpos ++ ] = marker; + out[ outpos ++ ] = 0; + } + else + { + out[ outpos ++ ] = in[ inpos ]; + } + ++ inpos; + } + + free(work); + + return outpos; +} + + +/************************************************************************* +* LZ_Uncompress() - Uncompress a block of data using an LZ77 decoder. +* in - Input (compressed) buffer. +* out - Output (uncompressed) buffer. This buffer must be large +* enough to hold the uncompressed data. +* insize - Number of input bytes. +*************************************************************************/ + +int LZ_Uncompress( unsigned char *in, unsigned char *out, unsigned int insize ) +{ + unsigned char marker, symbol; + unsigned int i, inpos, outpos, length, offset; + + /* Do we have anything to uncompress? */ + if( insize < 1 ) + { + return 0; + } + + /* Get marker symbol from input stream */ + marker = in[ 0 ]; + inpos = 1; + + /* Main decompression loop */ + outpos = 0; + do + { + symbol = in[ inpos ++ ]; + if( symbol == marker ) + { + /* We had a marker byte */ + if( in[ inpos ] == 0 ) + { + /* It was a single occurrence of the marker byte */ + out[ outpos ++ ] = marker; + ++ inpos; + } + else + { + /* Extract true length and offset */ + inpos += _LZ_ReadVarSize( &length, &in[ inpos ] ); + inpos += _LZ_ReadVarSize( &offset, &in[ inpos ] ); + + /* Copy corresponding data from history window */ + for( i = 0; i < length; ++ i ) + { + out[ outpos ] = out[ outpos - offset ]; + ++ outpos; + } + } + } + else + { + /* No marker, plain copy */ + out[ outpos ++ ] = symbol; + } + } + while( inpos < insize ); + + return outpos; +} diff --git a/lz.h b/lz.h new file mode 100644 index 0000000..7d6656a --- /dev/null +++ b/lz.h @@ -0,0 +1,53 @@ +/************************************************************************* +* Name: lz.h +* Author: Marcus Geelnard +* Description: LZ77 coder/decoder interface. +* Reentrant: Yes +*------------------------------------------------------------------------- +* Copyright (c) 2003-2006 Marcus Geelnard +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would +* be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not +* be misrepresented as being the original software. +* +* 3. This notice may not be removed or altered from any source +* distribution. +* +* Marcus Geelnard +* marcus.geelnard at home.se +*************************************************************************/ + +#ifndef _lz_h_ +#define _lz_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* +* Function prototypes +*************************************************************************/ + +int LZ_Compress( unsigned char *in, unsigned char *out, unsigned int insize ); +int LZ_CompressFast( unsigned char *in, unsigned char *out, unsigned int insize); +int LZ_Uncompress( unsigned char *in, unsigned char *out, unsigned int insize ); + + +#ifdef __cplusplus +} +#endif + +#endif /* _lz_h_ */ diff --git a/m6502.cpp b/m6502.cpp new file mode 100644 index 0000000..58aa7c8 --- /dev/null +++ b/m6502.cpp @@ -0,0 +1,376 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#include "m6502.h" + +M6502::OpcodeCycleFunction M6502::opcodeFunctions[256] = +{ +// 0 1 2 3 4 5 6 7 8 9 A B C D E F +&M6502::BRK,&M6502::ORA,&M6502::JAM,&M6502::SLO,&M6502::NOP,&M6502::ORA,&M6502::ASL,&M6502::SLO,&M6502::PHP,&M6502::ORA,&M6502::ASL,&M6502::ANC,&M6502::NOP,&M6502::ORA,&M6502::ASL,&M6502::SLO,// 0 +&M6502::BPL,&M6502::ORA,&M6502::JAM,&M6502::SLO,&M6502::NOP,&M6502::ORA,&M6502::ASL,&M6502::SLO,&M6502::CLC,&M6502::ORA,&M6502::NOP,&M6502::SLO,&M6502::NOP,&M6502::ORA,&M6502::ASL,&M6502::SLO,// 1 +&M6502::JSR,&M6502::AND,&M6502::JAM,&M6502::RLA,&M6502::BIT,&M6502::AND,&M6502::ROL,&M6502::RLA,&M6502::PLP,&M6502::AND,&M6502::ROL,&M6502::ANC,&M6502::BIT,&M6502::AND,&M6502::ROL,&M6502::RLA,// 2 +&M6502::BMI,&M6502::AND,&M6502::JAM,&M6502::RLA,&M6502::NOP,&M6502::AND,&M6502::ROL,&M6502::RLA,&M6502::SEC,&M6502::AND,&M6502::NOP,&M6502::RLA,&M6502::NOP,&M6502::AND,&M6502::ROL,&M6502::RLA,// 3 +&M6502::RTI,&M6502::EOR,&M6502::JAM,&M6502::SRE,&M6502::NOP,&M6502::EOR,&M6502::LSR,&M6502::SRE,&M6502::PHA,&M6502::EOR,&M6502::LSR,&M6502::ASR,&M6502::JMP,&M6502::EOR,&M6502::LSR,&M6502::SRE,// 4 +&M6502::BVC,&M6502::EOR,&M6502::JAM,&M6502::SRE,&M6502::NOP,&M6502::EOR,&M6502::LSR,&M6502::SRE,&M6502::CLI,&M6502::EOR,&M6502::NOP,&M6502::SRE,&M6502::NOP,&M6502::EOR,&M6502::LSR,&M6502::SRE,// 5 +&M6502::RTS,&M6502::ADC,&M6502::JAM,&M6502::RRA,&M6502::NOP,&M6502::ADC,&M6502::ROR,&M6502::RRA,&M6502::PLA,&M6502::ADC,&M6502::ROR,&M6502::ARR,&M6502::JMP,&M6502::ADC,&M6502::ROR,&M6502::RRA,// 6 +&M6502::BVS,&M6502::ADC,&M6502::JAM,&M6502::RRA,&M6502::NOP,&M6502::ADC,&M6502::ROR,&M6502::RRA,&M6502::SEI,&M6502::ADC,&M6502::NOP,&M6502::RRA,&M6502::NOP,&M6502::ADC,&M6502::ROR,&M6502::RRA,// 7 +&M6502::NOP,&M6502::STA,&M6502::NOP,&M6502::SAX,&M6502::STY,&M6502::STA,&M6502::STX,&M6502::SAX,&M6502::DEY,&M6502::NOP,&M6502::TXA,&M6502::XAA,&M6502::STY,&M6502::STA,&M6502::STX,&M6502::SAX,// 8 +&M6502::BCC,&M6502::STA,&M6502::JAM,&M6502::SHA,&M6502::STY,&M6502::STA,&M6502::STX,&M6502::SAX,&M6502::TYA,&M6502::STA,&M6502::TXS,&M6502::SHS,&M6502::SHY,&M6502::STA,&M6502::SHX,&M6502::SHA,// 9 +&M6502::LDY,&M6502::LDA,&M6502::LDX,&M6502::LAX,&M6502::LDY,&M6502::LDA,&M6502::LDX,&M6502::LAX,&M6502::TAY,&M6502::LDA,&M6502::TAX,&M6502::LXA,&M6502::LDY,&M6502::LDA,&M6502::LDX,&M6502::LAX,// A +&M6502::BCS,&M6502::LDA,&M6502::JAM,&M6502::LAX,&M6502::LDY,&M6502::LDA,&M6502::LDX,&M6502::LAX,&M6502::CLV,&M6502::LDA,&M6502::TSX,&M6502::LAS,&M6502::LDY,&M6502::LDA,&M6502::LDX,&M6502::LAX,// B +&M6502::CPY,&M6502::CMP,&M6502::NOP,&M6502::DCP,&M6502::CPY,&M6502::CMP,&M6502::DEC,&M6502::DCP,&M6502::INY,&M6502::CMP,&M6502::DEX,&M6502::SBX,&M6502::CPY,&M6502::CMP,&M6502::DEC,&M6502::DCP,// C +&M6502::BNE,&M6502::CMP,&M6502::JAM,&M6502::DCP,&M6502::NOP,&M6502::CMP,&M6502::DEC,&M6502::DCP,&M6502::CLD,&M6502::CMP,&M6502::NOP,&M6502::DCP,&M6502::NOP,&M6502::CMP,&M6502::DEC,&M6502::DCP,// D +&M6502::CPX,&M6502::SBC,&M6502::NOP,&M6502::ISB,&M6502::CPX,&M6502::SBC,&M6502::INC,&M6502::ISB,&M6502::INX,&M6502::SBC,&M6502::NOP,&M6502::SBC,&M6502::CPX,&M6502::SBC,&M6502::INC,&M6502::ISB,// E +&M6502::BEQ,&M6502::SBC,&M6502::JAM,&M6502::ISB,&M6502::NOP,&M6502::SBC,&M6502::INC,&M6502::ISB,&M6502::SED,&M6502::SBC,&M6502::NOP,&M6502::ISB,&M6502::NOP,&M6502::SBC,&M6502::INC,&M6502::ISB // F +}; + +M6502::AddressModeCycleFunction M6502::T1AddressModeFunctions[256] = +{ +// 0 1 2 3 4 5 6 7 8 9 A B C D E F +&M6502::brk_5_4_T1,&M6502::idx_2_4_T1,&M6502::sb_jam_T1, &M6502::idx_Undoc_T1,&M6502::zp_2_1_T1, &M6502::zp_2_1_T1, &M6502::zp_4_1_T1, &M6502::zp_4_1_T1, &M6502::ph_5_1_T1,&M6502::imm_2_1_T1, &M6502::sb_1_T1,&M6502::imm_2_1_T1, &M6502::abs_2_3_T1, &M6502::abs_2_3_T1, &M6502::abs_4_2_T1, &M6502::abs_4_2_T1, //0 +&M6502::rel_5_8_T1,&M6502::idy_2_7_T1,&M6502::sb_jam_T1, &M6502::idy_Undoc_T1,&M6502::zpx_2_6_T1,&M6502::zpx_2_6_T1,&M6502::zpx_4_3_T1,&M6502::zpx_4_3_T1,&M6502::sb_1_T1, &M6502::absy_2_5_T1,&M6502::sb_1_T1,&M6502::absy_4_4_T1,&M6502::absx_2_5_T1,&M6502::absx_2_5_T1,&M6502::absx_4_4_T1,&M6502::absx_4_4_T1,//1 +&M6502::jsr_5_3_T1,&M6502::idx_2_4_T1,&M6502::sb_jam_T1, &M6502::idx_Undoc_T1,&M6502::zp_2_1_T1, &M6502::zp_2_1_T1, &M6502::zp_4_1_T1, &M6502::zp_4_1_T1, &M6502::pl_5_2_T1,&M6502::imm_2_1_T1, &M6502::sb_1_T1,&M6502::imm_2_1_T1, &M6502::abs_2_3_T1, &M6502::abs_2_3_T1, &M6502::abs_4_2_T1, &M6502::abs_4_2_T1, //2 +&M6502::rel_5_8_T1,&M6502::idy_2_7_T1,&M6502::sb_jam_T1, &M6502::idy_Undoc_T1,&M6502::zpx_2_6_T1,&M6502::zpx_2_6_T1,&M6502::zpx_4_3_T1,&M6502::zpx_4_3_T1,&M6502::sb_1_T1, &M6502::absy_2_5_T1,&M6502::sb_1_T1,&M6502::absy_4_4_T1,&M6502::absx_2_5_T1,&M6502::absx_2_5_T1,&M6502::absx_4_4_T1,&M6502::absx_4_4_T1,//3 +&M6502::rti_5_5_T1,&M6502::idx_2_4_T1,&M6502::sb_jam_T1, &M6502::idx_Undoc_T1,&M6502::zp_2_1_T1, &M6502::zp_2_1_T1, &M6502::zp_4_1_T1, &M6502::zp_4_1_T1, &M6502::ph_5_1_T1,&M6502::imm_2_1_T1, &M6502::sb_1_T1,&M6502::imm_2_1_T1, &M6502::abs5_6_1_T1,&M6502::abs_2_3_T1, &M6502::abs_4_2_T1, &M6502::abs_4_2_T1, //4 +&M6502::rel_5_8_T1,&M6502::idy_2_7_T1,&M6502::sb_jam_T1, &M6502::idy_Undoc_T1,&M6502::zpx_2_6_T1,&M6502::zpx_2_6_T1,&M6502::zpx_4_3_T1,&M6502::zpx_4_3_T1,&M6502::sb_1_T1, &M6502::absy_2_5_T1,&M6502::sb_1_T1,&M6502::absy_4_4_T1,&M6502::absx_2_5_T1,&M6502::absx_2_5_T1,&M6502::absx_4_4_T1,&M6502::absx_4_4_T1,//5 +&M6502::rts_5_7_T1,&M6502::idx_2_4_T1,&M6502::sb_jam_T1, &M6502::idx_Undoc_T1,&M6502::zp_2_1_T1, &M6502::zp_2_1_T1, &M6502::zp_4_1_T1, &M6502::zp_4_1_T1, &M6502::pl_5_2_T1,&M6502::imm_2_1_T1, &M6502::sb_1_T1,&M6502::imm_2_1_T1, &M6502::abs5_6_2_T1,&M6502::abs_2_3_T1, &M6502::abs_4_2_T1, &M6502::abs_4_2_T1, //6 +&M6502::rel_5_8_T1,&M6502::idy_2_7_T1,&M6502::sb_jam_T1, &M6502::idy_Undoc_T1,&M6502::zpx_2_6_T1,&M6502::zpx_2_6_T1,&M6502::zpx_4_3_T1,&M6502::zpx_4_3_T1,&M6502::sb_1_T1, &M6502::absy_2_5_T1,&M6502::sb_1_T1,&M6502::absy_4_4_T1,&M6502::absx_2_5_T1,&M6502::absx_2_5_T1,&M6502::absx_4_4_T1,&M6502::absx_4_4_T1,//7 +&M6502::imm_2_1_T1,&M6502::idx_3_3_T1,&M6502::imm_2_1_T1,&M6502::idx_3_3_T1, &M6502::zp_3_1_T1, &M6502::zp_3_1_T1, &M6502::zp_2_1_T1, &M6502::zp_3_1_T1, &M6502::sb_1_T1, &M6502::imm_2_1_T1, &M6502::sb_1_T1,&M6502::imm_2_1_T1, &M6502::abs_3_2_T1, &M6502::abs_3_2_T1, &M6502::abs_3_2_T1, &M6502::abs_3_2_T1, //8 +&M6502::rel_5_8_T1,&M6502::idy_3_6_T1,&M6502::sb_jam_T1, &M6502::idy_3_6_T1, &M6502::zpx_3_5_T1,&M6502::zpx_3_5_T1,&M6502::zpy_3_5_T1,&M6502::zpy_3_5_T1,&M6502::sb_1_T1, &M6502::absy_3_4_T1,&M6502::sb_1_T1,&M6502::absy_3_4_T1,&M6502::absx_3_4_T1,&M6502::absx_3_4_T1,&M6502::absy_3_4_T1,&M6502::absy_3_4_T1,//9 +&M6502::imm_2_1_T1,&M6502::idx_2_4_T1,&M6502::imm_2_1_T1,&M6502::idx_2_4_T1, &M6502::zp_2_1_T1, &M6502::zp_2_1_T1, &M6502::zp_2_1_T1, &M6502::zp_2_1_T1, &M6502::sb_1_T1, &M6502::imm_2_1_T1, &M6502::sb_1_T1,&M6502::imm_2_1_T1, &M6502::abs_2_3_T1, &M6502::abs_2_3_T1, &M6502::abs_2_3_T1, &M6502::abs_2_3_T1, //A +&M6502::rel_5_8_T1,&M6502::idy_2_7_T1,&M6502::sb_jam_T1, &M6502::idy_2_7_T1, &M6502::zpx_2_6_T1,&M6502::zpx_2_6_T1,&M6502::zpy_2_6_T1,&M6502::zpy_2_6_T1,&M6502::sb_1_T1, &M6502::absy_2_5_T1,&M6502::sb_1_T1,&M6502::absy_4_4_T1,&M6502::absx_2_5_T1,&M6502::absx_2_5_T1,&M6502::absy_2_5_T1,&M6502::absy_2_5_T1,//B +&M6502::imm_2_1_T1,&M6502::idx_2_4_T1,&M6502::imm_2_1_T1,&M6502::idx_Undoc_T1,&M6502::zp_2_1_T1, &M6502::zp_2_1_T1, &M6502::zp_4_1_T1, &M6502::zp_4_1_T1, &M6502::sb_1_T1, &M6502::imm_2_1_T1, &M6502::sb_1_T1,&M6502::imm_2_1_T1, &M6502::abs_2_3_T1, &M6502::abs_2_3_T1, &M6502::abs_4_2_T1, &M6502::abs_4_2_T1, //C +&M6502::rel_5_8_T1,&M6502::idy_2_7_T1,&M6502::sb_jam_T1, &M6502::idy_Undoc_T1,&M6502::zpx_2_6_T1,&M6502::zpx_2_6_T1,&M6502::zpx_4_3_T1,&M6502::zpx_4_3_T1,&M6502::sb_1_T1, &M6502::absy_2_5_T1,&M6502::sb_1_T1,&M6502::absy_4_4_T1,&M6502::absx_2_5_T1,&M6502::absx_2_5_T1,&M6502::absx_4_4_T1,&M6502::absx_4_4_T1,//D +&M6502::imm_2_1_T1,&M6502::idx_2_4_T1,&M6502::imm_2_1_T1,&M6502::idx_Undoc_T1,&M6502::zp_2_1_T1, &M6502::zp_2_1_T1, &M6502::zp_4_1_T1, &M6502::zp_4_1_T1, &M6502::sb_1_T1, &M6502::imm_2_1_T1, &M6502::sb_1_T1,&M6502::imm_2_1_T1, &M6502::abs_2_3_T1, &M6502::abs_2_3_T1, &M6502::abs_4_2_T1, &M6502::abs_4_2_T1, //E +&M6502::rel_5_8_T1,&M6502::idy_2_7_T1,&M6502::sb_jam_T1, &M6502::idy_Undoc_T1,&M6502::zpx_2_6_T1,&M6502::zpx_2_6_T1,&M6502::zpx_4_3_T1,&M6502::zpx_4_3_T1,&M6502::sb_1_T1, &M6502::absy_2_5_T1,&M6502::sb_1_T1,&M6502::absy_4_4_T1,&M6502::absx_2_5_T1,&M6502::absx_2_5_T1,&M6502::absx_4_4_T1,&M6502::absx_4_4_T1 //F +}; + +void M6502::ADC(void) +{ + u16 result; + + result = a + value + (status & FLAG_CARRY); + EstablishZ(result); + + if (status & FLAG_DECIMAL) + { + result = (a & 0xf) + (value & 0xf) + (status & FLAG_CARRY); + if (result > 0x9) result += 0x6; + if (result <= 0x0f) result = (result & 0xf) + (a & 0xf0) + (value & 0xf0); + else result = (result & 0xf) + (a & 0xf0) + (value & 0xf0) + 0x10; + EstablishV(result, value); + EstablishN(result); + if ((result & 0x1f0) > 0x90) result += 0x60; + EstablishC(result); + } + else + { + EstablishC(result); + EstablishV(result, value); + EstablishN(result); + } + a = (u8)result; +} + +void M6502::ARR(void) +{ + u16 result = a & value; + u16 carry = status & FLAG_CARRY; + + if (status & FLAG_DECIMAL) + { + u16 resultDEC = result; + resultDEC |= carry << 8; + resultDEC >>= 1; + SetN(carry); + SetZ(resultDEC == 0); + SetV((resultDEC ^ result) & 0x40); + if (((result & 0xf) + (result & 0x1)) > 0x5) resultDEC = (resultDEC & 0xf0) | ((resultDEC + 0x6) & 0xf); + if (((result & 0xf0) + (result & 0x10)) > 0x50) + { + resultDEC = (resultDEC & 0x0f) | ((resultDEC + 0x60) & 0xf0); + SetC(); + } + else ClearC(); + a = (u8)resultDEC; + } + else + { + result |= carry << 8; + result >>= 1; + EstablishNZ(result); + + u16 and40 = result & 0x40; + SetC(and40 != 0); + SetV(and40 ^ ((result & 0x20) << 1)); + a = (u8)result; + } +} + +void M6502::SBC(void) +{ + u16 result = a - value - ((status & FLAG_CARRY) ? 0 : 1); + if (status & FLAG_DECIMAL) + { + u16 tmp_a; + tmp_a = (a & 0xf) - (value & 0xf) - ((status & FLAG_CARRY) ? 0 : 1); + if (tmp_a & 0x10) tmp_a = ((tmp_a - 6) & 0xf) | ((a & 0xf0) - (value & 0xf0) - 0x10); + else tmp_a = (tmp_a & 0xf) | ((a & 0xf0) - (value & 0xf0)); + if (tmp_a & 0x100) tmp_a -= 0x60; + SetC(result < 0x100); + EstablishV(result, value ^ 0xff); + EstablishNZ(result); + a = (u8)tmp_a; + } + else + { + EstablishNZ(result); + SetC(result < 0x100); + EstablishV(result, value ^ 0xff); + a = (u8)result; + } +} + +void M6502::absx_2_5_T3(void) +{ + u16 startpage = ea & 0xFF00; + ea += x; + if (startpage != (ea & 0xFF00)) + { + BUS_READ(startpage | (ea & 0xff)); + addressModeCycleFn = &M6502::absx_2_5_T4; + } + else + { + value = BUS_READ(ea); + ExecuteOpcode(); + } +} + +void M6502::absy_2_5_T3(void) +{ + u16 startpage = ea & 0xFF00; + ea += y; + if (startpage != (ea & 0xFF00)) + { + BUS_READ(startpage | (ea & 0xff)); + addressModeCycleFn = &M6502::absy_2_5_T4; + } + else + { + value = BUS_READ(ea); + ExecuteOpcode(); + } +} + +void M6502::idy_2_7_T4(void) +{ + u16 startpage = ea & 0xFF00; + ea += y; + if (startpage != (ea & 0xFF00)) + { + BUS_READ(startpage | (ea & 0xff)); + addressModeCycleFn = &M6502::idy_2_7_T5; + } + else + { + value = BUS_READ(ea); + ExecuteOpcode(); + } +} + +void M6502::rel_5_8_T2(void) +{ + BUS_READ(oldpc); + pc = oldpc + ra; + if ((oldpc & 0xFF00) == (pc & 0xFF00)) + { + BranchTakenMaskingInterrupt = true; + addressModeCycleFn = &M6502::InstructionFetch; // Opcode has already been executed in T1 so just move on to the next instruction. + } + else + { + addressModeCycleFn = &M6502::rel_5_8_T3; + } +} + +// When executing a BRK and an interrupt condition is triggered between T0 and T4 the BRK morphs into the interrupt instruction. +// We check here if we continue on executing the BRK or morph and take the interrupt. +void M6502::brk_5_4_T4(void) +{ +#ifdef SUPPORT_NMI + if (NMIPending) + { + NMIPending = 0; + NMI_T4(); + return; + } +#endif +#ifdef SUPPORT_IRQ + if (IRQPending && !IRQDisabled()) + { + IRQPending = 0; + IRQ_T4(); + return; + } +#endif + Push(status | FLAG_CONSTANT | FLAG_BREAK); + addressModeCycleFn = &M6502::brk_5_4_T5; +} + +// It is possible for a BRK/IRQ to mask a NMI for short burts of NMI assertions. +// If the NMI asserts and un-asserts between IRQ_T4 and IRQ_T6 this will occur. +// This occurs on real hardware and it will be emulated correctly. +// The processor has already commited to fetching the interrupt vectors and will now complete this process. +// If the NMI now un-asserts between now and the end of IRQ_T6 it will be missed/masked. +// The ability for a BRK/IRQ to turn into a NMI shows how the designers of the 6502 anticipated this masking and kept it to a minimum of only four 1/2 cycles! +// But then again, perhpas not, as a NMI that asserts after IRQ_T4 and remains asserted will not be processed until the first instruction of the IRQ routine has completed (see InstructionFetchIRQ). +void M6502::IRQ_T4(void) +{ +#ifdef SUPPORT_NMI + if (NMIPending) + { + NMIPending = 0; + NMI_T4(); + return; + } +#endif + ClearB(); + Push(status); + addressModeCycleFn = &M6502::IRQ_T5; +} + +// Interrupts are polled before starting a new instruction +// T0 of every address mode (except reset). +void M6502::InstructionFetch() +{ + opcode = BUS_READ(pc); // Technically the InstructionFetch cycle T0 is part of the previous instruction's execution and the check for interrupts occurs after this fetch. + +#ifdef SUPPORT_NMI + if (NMIPending) + addressModeCycleFn = &M6502::NMI_T1; + else +#endif // SUPPORT_NMI +#ifdef SUPPORT_IRQ + if (IRQPending && !IRQDisabled()) + { + IRQPending = 0; + addressModeCycleFn = &M6502::IRQ_T1; + } + else +#endif // SUPPORT_IRQ + { + pc++; + addressModeCycleFn = T1AddressModeFunctions[opcode]; + opcodeCycleFn = opcodeFunctions[opcode]; + } +} + +#ifdef SUPPORT_IRQ +// If a NMI asserts too late during the IRQ execution ie after IRQ_T4 then it must wait one more instruction. So no polling is performed during this fetch. +// This is an idiosyncrasy of the real hardware and will be emulated using this fuction. +void M6502::InstructionFetchIRQ() +{ + opcode = BUS_READ(pc++); // T0 + addressModeCycleFn = T1AddressModeFunctions[opcode]; + opcodeCycleFn = opcodeFunctions[opcode]; +} +#endif + +// A single step emulates both real 6502 1/2 cycles. +// On a real 6502, interrupts can be asserted between 1/2 cycles. When this occurs the hardware effectively ignores it for a further 1/2 cycle anyway. +// Here, interrupts are polled at the start of a cycle (in an instruction fetch cycle) emulating this behaviour. +// High frequency (1/2 cycle) bursts of interrupts assertions and un-assertions occuring mid full cycle will be missed by the hardware anyway. +void M6502::Step(void) +{ + bool irq; + + // If an IRQ occurs during a CLI then it will not take effect until the instruction after the CLI has been executed. + // To emulate this, CLI simply sets CLIMaskingInterrupt flag. + // Similar behaviour can be witnessed with the 3 cycle branch taken instruction. +#ifdef SUPPORT_IRQ + irq = IRQ.IsAsserted(); + if (irq && ((status & FLAG_INTERRUPT) == 0) && !CLIMaskingInterrupt && !BranchTakenMaskingInterrupt) + IRQPending = 1; + if (!irq) + IRQPending = 0; +#endif // SUPPORT_IRQ + +#ifdef SUPPORT_NMI + NMIPending = NMI.IsAsserted() && !CLIMaskingInterrupt && !BranchTakenMaskingInterrupt; +#endif // SUPPORT_NMI + + if (CLIMaskingInterrupt) // If so we have delayed the IRQ long enough for the next instruction to now start. The CLI will then take effect after that instruction completes executing. + CLIMaskingInterrupt = false; + if (BranchTakenMaskingInterrupt) // If so we have delayed the IRQ long enough for the next instruction to now start. + BranchTakenMaskingInterrupt = false; + +#ifdef SUPPORT_RDY_HALTING + if (!Halted()) + { + CheckForHalt(); + (this->*M6502::addressModeCycleFn)(); + } +#else + (this->*M6502::addressModeCycleFn)(); +#endif // SUPPORT_RDY_HALTING +} + +void M6502::Reset(void) +{ + CLIMaskingInterrupt = false; + BranchTakenMaskingInterrupt = false; +#ifdef SUPPORT_IRQ + IRQ.Reset(); + IRQPending = 0; +#endif // SUPPORT_IRQ +#ifdef SUPPORT_NMI + NMI.Reset(); + NMIPending = 0; +#endif // SUPPORT_NMI +#ifdef SUPPORT_RDY_HALTING + RDYCounter = 0; // Don't know if the real hardware does this. + RDYAsserted = 0; + RDYHalted = 0; +#endif // SUPPORT_RDY_HALTING + Reset_T0(); +} + +#ifdef SUPPORT_RDY_HALTING +void M6502::RDY(bool asserted) +{ + if (asserted && (RDYHalted == 0)) RDYCounter = 3; + RDYAsserted = asserted; + if (RDYHalted && !asserted) RDYHalted = 0; +} + +void M6502::CheckForHalt() +{ + if ((RDYHalted == 0) && RDYAsserted && RDYCounter) + { + RDYCounter--; + if (RDYCounter == 0) RDYHalted = 1; + } +} + +u8 M6502::BusRead(u16 address) +{ + if ((RDYHalted == 0) && RDYAsserted) RDYHalted = 1; + return dataBusReadFn(address); +} +#endif // SUPPORT_RDY_HALTING diff --git a/m6502.h b/m6502.h new file mode 100644 index 0000000..5005d07 --- /dev/null +++ b/m6502.h @@ -0,0 +1,537 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +///////////////////////////////////////////////////////////////////////////////// +// Emulates a NMOS 6502 +// +// To keep the hardware design simple the 6502 performs a bus read or a write on every cycle no matter what it is doing (including resetting). +// Some of these reads are discarded and not used by the CPU (even re-read later). But these bus accesses may impact other devices on the bus (eg write only memory mapped hardware registers of other devices). +// This emulator tries to emulate the CPU to a cycle accurate level including the every cycle bus accesses. +// +// The undocumented instructions and the undocumented address modes are fully emulated. +// +// Instructions in a 6502 execute over muliple cycles anywhere between 2 to 8 cycles. +// This is caused by various address modes requiring multiple cycles to process (often requiring multiple bus accesses) before the opcode can be executed. +// Typically, after all address mode functions/cycles complete the opcode function will follow. +// The branch instructions are an anomaly to this sequence in that after their opcode executes subsequent address mode cycles may follow. +// (This is more than likely the reason why the real 6502 exhibits idiosyncrasies with branch taken and IRQ/NMI assertions (Idiosyncrasies that are also emulated here)). +// +// This emulator breaks up instructions into the correct sequence of functions which are called one after another, each taking a cycle. (Just like the real hardware's state machine) +// +// To use +// You need to supply bus read and write functions. These take the form;- +// u8 read(u16 address) +// void write(u16 address, u8 value) +// Note: external code is responsible for mapping devices into the address space. +// In a 6502 system if a device is not mapped to an address range the 6502 will read back the last value placed onto the data bus (eg the high byte of the address) +// Your external bus read fuction will need to implement this for correct emulation. +// +// CPU can then be supplied with input signals;- +// CLOCK - call Step(). +// RESET - can be asserted by calling Reset(). +// RDY - assertion state can be set via RDY(bool asserted) function. +// SO - can be asserted by calling SO(). +// +// IRQ and NMI interrupts can be asserted via the "Interrupt" support class and calling its Assert()/Release() functions on the emulated CPU's child objects;- +// IRQ +// NMI +// +// Output signals emulated;- +// SYNC - can be polled by calling SYNC() +// +// You can also read the internal state of the processor via;- +// GetRegs - returns a copy of all major CPU registers +// IRQDisabled - returns the status of the I flag in the CPU's status register + +#ifndef M6502_H +#define M6502_H +#include "types.h" + +// Turn SUPPORT_RDY_HALTING on if you would like to support the RDY line and halting the CPU. (eg BA from the VIC-II in a C64) +//#define SUPPORT_RDY_HALTING + +#ifdef SUPPORT_RDY_HALTING +#define BUS_READ BusRead +#else +#define BUS_READ dataBusReadFn +#endif // SUPPORT_RDY_HALTING + +//#define SUPPORT_NMI // Some devices don't use the NMI eg Commodore 1541 +#define SUPPORT_IRQ // Some devices don't use IRQ eg Atari 7800 + +// Visual6502 explains the XAA_MAGIC value (http://visual6502.org/wiki/index.php?title=6502_Opcode_8B_(XAA,_ANE) +// From taking measurements from my 1541 drives, they all use EE. +#define XAA_MAGIC 0xee +#define LXA_MAGIC 0xee + +//2, 3 or 4 cycles +#define BRANCH_CONDITION(flag, condition) \ + ra = BUS_READ(pc++); \ + if (ra & 0x80) ra |= 0xFF00; \ + if ((status & flag) == condition) \ + { \ + oldpc = pc; \ + pc = (pc & 0xff00) | ((pc + ra) & 0xff);\ + addressModeCycleFn = &M6502::rel_5_8_T2;\ + } \ + else addressModeCycleFn = &M6502::InstructionFetch; + +typedef u8(*DataBusReadFn)(u16 address); +typedef void(*DataBusWriteFn)(u16 address, const u8 value); + +#if defined(SUPPORT_IRQ) || defined(SUPPORT_NMI) +class Interrupt +{ +public: + Interrupt() : asserted(false) { } + inline bool IsAsserted() { return asserted; } + inline void Assert() { asserted = true; } + inline void Release() { asserted = false; } + inline void Reset() { Release(); } +private: + bool asserted; +}; +#endif // SUPPORT_IRQ + +class M6502 +{ +private: + enum + { + FLAG_CARRY = 0x01, + FLAG_ZERO = 0x02, + FLAG_INTERRUPT = 0x04, + FLAG_DECIMAL = 0x08, + FLAG_BREAK = 0x10, + FLAG_CONSTANT = 0x20, + FLAG_OVERFLOW = 0x40, + FLAG_SIGN = 0x80 + }; + + typedef void (M6502::*AddressModeCycleFunction)(void); // Member function pointers for the starting cycle of the address mode functions. + static AddressModeCycleFunction T1AddressModeFunctions[256]; + typedef void (M6502::*OpcodeCycleFunction)(void); // Member function pointers for the opcodes. + static OpcodeCycleFunction opcodeFunctions[256]; + + union + { + u16 ea; // Effective address + u16 ra; // Realitive address + }; + union + { + u16 ia; // Intermediate address + u16 oldpc; // A branch's old PC + }; + + u16 value; // Intermediate data value + u16 pc; // Program Counter + u8 opcode; // The current Opcode + u8 a, x, y, status, sp; // Registers + + // Idiosyncrasies of CLI and the 3 cycle Branch Taken instructions can delay interrupts if an interrupt asserts during the execution of those instructions. + // These flags allow this behaviour to be emulated correctly. + u8 CLIMaskingInterrupt : 1; + u8 BranchTakenMaskingInterrupt : 1; + + // Flags for tracking interrupts +#ifdef SUPPORT_IRQ + u8 IRQPending : 1; +#endif // SUPPORT_IRQ +#ifdef SUPPORT_NMI + u8 NMIPending : 1; +#endif // SUPPORT_NMI + + // Flags for tracking the state of RDY +#ifdef SUPPORT_RDY_HALTING + u8 RDYCounter : 4; + u8 RDYAsserted : 1; + u8 RDYHalted : 1; +#endif // SUPPORT_RDY_HALTING + + DataBusReadFn dataBusReadFn; // A pointer to the externally supplied Data Bus read function. + DataBusWriteFn dataBusWriteFn; // A pointer to the externally supplied Data Bus write function. + + AddressModeCycleFunction addressModeCycleFn; // Our pointer to the function that will process the current address mode functionality for the current cycle. + OpcodeCycleFunction opcodeCycleFn; // Our pointer to the function that will be called after (or during) the address mode cycle(s) that execute the actual opcode. + + inline void ExecuteOpcode(void) { (this->*M6502::opcodeCycleFn)(); addressModeCycleFn = &M6502::InstructionFetch; } // Helper function to call opcodeCycleFn and set up for the next instruction fetch. + + // Stack manipulation helpers. + inline void Push(u8 val) { dataBusWriteFn(0x100 + sp--, val); } + inline u8 Pull(void) { return (dataBusReadFn(0x100 + ++sp)); } + + // Helper function to write back the results of an instruction (to memory or the A register). + inline void WriteValue(u8 byte) + { + if (addressModeCycleFn == &M6502::sb_1_T1) a = byte; + else dataBusWriteFn(ea, byte); + } + + void InstructionFetch(); // T0 of every address mode (except reset). + +#ifdef SUPPORT_IRQ + void InstructionFetchIRQ(); // Special case to correctly emulate an IRQ masking a NMI. +#endif + + // Opcode functions for documented instructions. + void ADC(void); + void ANC(void) { u16 result = a & value; EstablishNZ(result); SetC(result & 0x0080); a = (u8)result; } + void AND(void) { u16 result = a & value; EstablishNZ(result); a = (u8)result; } + void ASL(void) { u16 result = value << 1; EstablishC(result); EstablishNZ(result); WriteValue(result); } + void BCC(void) { BRANCH_CONDITION(FLAG_CARRY, 0); } + void BCS(void) { BRANCH_CONDITION(FLAG_CARRY, FLAG_CARRY); } + void BEQ(void) { BRANCH_CONDITION(FLAG_ZERO, FLAG_ZERO); } + void BIT(void) { u16 result = a & value; EstablishZ(result); SetV(value & 0x40); EstablishN(value); } + void BMI(void) { BRANCH_CONDITION(FLAG_SIGN, FLAG_SIGN); } + void BNE(void) { BRANCH_CONDITION(FLAG_ZERO, 0); } + void BPL(void) { BRANCH_CONDITION(FLAG_SIGN, 0); } + void BVC(void) { BRANCH_CONDITION(FLAG_OVERFLOW, 0); } + void BVS(void) { BRANCH_CONDITION(FLAG_OVERFLOW, FLAG_OVERFLOW); } + void BRK(void) {} + void CLC(void) { ClearC(); } + void CLD(void) { ClearD(); } + void CLI(void) { ClearI(); CLIMaskingInterrupt = true; } // Like the real hardware the flag will be cleared here (incase it is read by the next instruction) but needs to dely one more cycle (and let another instruction execute) before the IRQ handling will possibly trigger (CLIMaskingInterrupt is used to track and emulate this). + void CLV(void) { ClearV(); } + void CMP(void) { u16 result = a - value; SetC(a >= (u8)value); SetZ(a == (u8)value); EstablishN(result); } + void CPX(void) { u16 result = x - value; SetC(x >= (u8)value); SetZ(x == (u8)value); EstablishN(result); } + void CPY(void) { u16 result = y - value; SetC(y >= (u8)value); SetZ(y == (u8)value); EstablishN(result); } + void DEC(void) { u16 result = value - 1; EstablishNZ(result); WriteValue(result); } + void DEX(void) { x--; EstablishNZ(x); } + void DEY(void) { y--; EstablishNZ(y); } + void EOR(void) { u16 result = a ^ value; EstablishNZ(result); a = (u8)result; } + void INC(void) { u16 result = value + 1; EstablishNZ(result); WriteValue(result); } + void INX(void) { x++; EstablishNZ(x); } + void INY(void) { y++; EstablishNZ(y); } + void JAM(void) {} + void JMP(void) { pc = ea; } + void JSR(void) {} + void LDA(void) { a = (u8)value; EstablishNZ(a); } + void LDX(void) { x = (u8)value; EstablishNZ(x); } + void LDY(void) { y = (u8)value; EstablishNZ(y); } + void LSR(void) { u16 result = value >> 1; SetC(value & 1); EstablishNZ(result); WriteValue(result); } + void NOP(void) {} + void ORA(void) { u16 result = a | value; EstablishNZ(result); a = (u8)result; } + void PHA(void) { Push(a);} + void PHP(void) { Push(status | FLAG_CONSTANT | FLAG_BREAK); } // PHP always pushes the Break (B) flag as a `1' to the stack. Needs to push SO status into V also? (ie what cycle of PHP can SO assertions take effect?) + void PLA(void) { a = Pull(); EstablishNZ(a); } + void PLP(void) { status = Pull() | FLAG_CONSTANT; } + void ROL(void) { u16 result = (value << 1) | (status & FLAG_CARRY); EstablishC(result); EstablishNZ(result); WriteValue(result); } + void ROR(void) { u16 result = (value >> 1) | ((status & FLAG_CARRY) << 7); SetC(value & 1); EstablishNZ(result); WriteValue(result); } // Post June, 1976 version. + void RTI(void) {} + void RTS(void) {} + void SBC(void); + void SEC(void) { SetC(); } + void SED(void) { SetD(); } + void SEI(void) { SetI(); } + void STA(void) { WriteValue(a); } + void STX(void) { WriteValue(x); } + void STY(void) { WriteValue(y); } + void TAX(void) { x = a; EstablishNZ(a); } + void TAY(void) { y = a; EstablishNZ(y); } + void TSX(void) { x = sp; EstablishNZ(x); } + void TXA(void) { a = x; EstablishNZ(a); } + void TXS(void) { sp = x; } + void TYA(void) { a = y; EstablishNZ(a); } + + // Opcode functions for undocumented instructions. + void ASR(void) { u16 result = a & value; SetC(result & 1); result >>= 1; EstablishNZ(result); a = (u8)result; } + void LXA(void) { u16 result = (a | LXA_MAGIC) & value; EstablishNZ(result); x = (u8)result; a = x; } + void ARR(void); + void LAX(void) { LDA(); LDX(); } + void LAS(void) { sp = sp & (u8)value; x = sp; a = sp; EstablishNZ(x); } + void SAX(void) { WriteValue(a & x); } + void SBX(void) { u16 result = (a & x) - value; x = result & 0xff; EstablishNZ(x); SetC(result < 0x100); } + void SHA(void) { WriteValue(a & x & ((ea >> 8) + 1)); } + void SHY(void) { u16 result = ((ea >> 8) + 1) & y; WriteValue(result); } + void DCP(void) { u16 result = (value - 1) & 0xff; SetC(a >= (u8)result); EstablishNZ(a - (u8)result); WriteValue(result); } + void ISB(void) { value = (value + 1) & 0xff; WriteValue(value); SBC(); } + void SLO(void) { u16 result = value << 1; EstablishC(result); a |= (u8)result; EstablishNZ(a); WriteValue(result); } + void RLA(void) { u16 result = (value << 1) | (status & FLAG_CARRY); EstablishC(result); a &= (u8)result; EstablishNZ(a); WriteValue(result); } + void SRE(void) { u16 result = value >> 1; SetC(value & 1); a ^= (u8)result; EstablishNZ(a); WriteValue(result); } + void RRA(void) { u16 result = (value >> 1) | ((status & FLAG_CARRY) << 7); SetC(value & 1); WriteValue(result); value = result & 0xff; ADC(); } // The ADC will use the carry we set here + void SHS(void) { u16 result = (a & x); WriteValue(result & ((ea >> 8) + 1)); sp = (u8)result; } + void SHX(void) { u16 result = ((ea >> 8) + 1) & x; WriteValue(result); } + void XAA(void) { u16 result = ((a | XAA_MAGIC) & x & ((u8)(value))); EstablishNZ(result); a = (u8)result; } + + // For address modes, timings and stages were taken from the "MCS6500 Family Hardware Manual" + // Numbers in the fuction name are from apendix A section on the manual. + // eg idy_3_6_T3 is Indirect Y Addressing Mode detailed in section 3.6 of the manual's appendix A. + // T3 means the T3 stage explained in the manual. + + // Single byte instructions + void sb_1_T1(void) { BUS_READ(pc); value = a; ExecuteOpcode(); } //2 cycles + void sb_jam_T1(void) { BUS_READ(pc); ExecuteOpcode(); } //2 cycles + + void imm_2_1_T1(void) { value = BUS_READ(pc++); ExecuteOpcode(); } //2 cycles + + void rel_5_8_T1(void) { (this->*M6502::opcodeCycleFn)(); } // Branch instructions are the anomaly and execute their opcode in T1. + void rel_5_8_T2(void); + void rel_5_8_T3(void) { BUS_READ(pc); addressModeCycleFn = &M6502::InstructionFetch; } // Opcode has already been executed in T1 so just move on to the next instruction. + + void zp_2_1_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::zp_2_1_T2; } //3 cycles + void zp_2_1_T2(void) { value = BUS_READ(ea); ExecuteOpcode(); } + + void zp_3_1_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::zp_3_1_T2; } //3 cycles + void zp_3_1_T2(void) { ExecuteOpcode(); } + + void abs_2_3_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::abs_2_3_T2; } //4 cycles + void abs_2_3_T2(void) { ea |= (BUS_READ(pc++) << 8); addressModeCycleFn = &M6502::abs_2_3_T3; } + void abs_2_3_T3(void) { value = BUS_READ(ea); ExecuteOpcode(); } + + void abs_3_2_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::abs_3_2_T2; } //4 cycles + void abs_3_2_T2(void) { ea |= (BUS_READ(pc++) << 8); addressModeCycleFn = &M6502::abs_3_2_T3; } + void abs_3_2_T3(void) { ExecuteOpcode(); } + + void idx_2_4_T1(void) { ia = BUS_READ(pc++); addressModeCycleFn = &M6502::idx_2_4_T2; } //6 cycles + void idx_2_4_T2(void) { BUS_READ(ia); addressModeCycleFn = &M6502::idx_2_4_T3; } + void idx_2_4_T3(void) { ia = (ia + x) & 0xff; ea = BUS_READ(ia++); addressModeCycleFn = &M6502::idx_2_4_T4; } + void idx_2_4_T4(void) { ea |= (BUS_READ(ia & 0xff) << 8); addressModeCycleFn = &M6502::idx_2_4_T5; } + void idx_2_4_T5(void) { value = BUS_READ(ea); ExecuteOpcode(); } + + void idx_3_3_T1(void) { ia = BUS_READ(pc++); addressModeCycleFn = &M6502::idx_3_3_T2; } //6 cycles + void idx_3_3_T2(void) { BUS_READ(ia); addressModeCycleFn = &M6502::idx_3_3_T3; } + void idx_3_3_T3(void) { ia = (ia + x) & 0xff; ea = BUS_READ(ia++); addressModeCycleFn = &M6502::idx_3_3_T4; } + void idx_3_3_T4(void) { ea |= (BUS_READ(ia & 0xff) << 8); addressModeCycleFn = &M6502::idx_3_3_T5; } + void idx_3_3_T5(void) { ExecuteOpcode(); } + + // idx_Undoc behaviour was determined by capturing bus activity on a real 6502 in a 1541 and confirmed by observing Visual6502. + void idx_Undoc_T1(void) { ia = BUS_READ(pc++); addressModeCycleFn = &M6502::idx_Undoc_T2; } //8 cycles + void idx_Undoc_T2(void) { BUS_READ(ia); addressModeCycleFn = &M6502::idx_Undoc_T3; } + void idx_Undoc_T3(void) { ia = (ia + x) & 0xff; ea = BUS_READ(ia++); addressModeCycleFn = &M6502::idx_Undoc_T4; } + void idx_Undoc_T4(void) { ea |= (BUS_READ(ia & 0xff) << 8); addressModeCycleFn = &M6502::idx_Undoc_T5; } + void idx_Undoc_T5(void) { value = BUS_READ(ea); addressModeCycleFn = &M6502::idx_Undoc_T6; } + void idx_Undoc_T6(void) { dataBusWriteFn(ea, (u8)value); addressModeCycleFn = &M6502::idx_Undoc_T7; } + void idx_Undoc_T7(void) { ExecuteOpcode(); } + + void absx_2_5_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::absx_2_5_T2; } //4/5 cycles + void absx_2_5_T2(void) { ea |= (BUS_READ(pc++) << 8); addressModeCycleFn = &M6502::absx_2_5_T3; } + void absx_2_5_T3(void); + void absx_2_5_T4(void) { value = BUS_READ(ea); ExecuteOpcode(); } + + void absx_3_4_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::absx_3_4_T2; } //5 cycles + void absx_3_4_T2(void) { ea |= (BUS_READ(pc++) << 8); addressModeCycleFn = &M6502::absx_3_4_T3; } + void absx_3_4_T3(void) { BUS_READ(ea); ea += x; addressModeCycleFn = &M6502::absx_3_4_T4; } + void absx_3_4_T4(void) { ExecuteOpcode(); } + + void absy_2_5_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::absy_2_5_T2; } //4/5 cycles + void absy_2_5_T2(void) { ea |= (BUS_READ(pc++) << 8); addressModeCycleFn = &M6502::absy_2_5_T3; } + void absy_2_5_T3(void); + void absy_2_5_T4(void) { value = BUS_READ(ea); ExecuteOpcode(); } + + void absy_3_4_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::absy_3_4_T2; } //5 cycles + void absy_3_4_T2(void) { ea |= (BUS_READ(pc++) << 8); addressModeCycleFn = &M6502::absy_3_4_T3; } + void absy_3_4_T3(void) { BUS_READ(ea); ea += y; addressModeCycleFn = &M6502::absy_3_4_T4; } + void absy_3_4_T4(void) { ExecuteOpcode(); } + + void zpx_2_6_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::zpx_2_6_T2; } //4 cycles + void zpx_2_6_T2(void) { BUS_READ(ea); addressModeCycleFn = &M6502::zpx_2_6_T3; } + void zpx_2_6_T3(void) { ea = (ea + x) & 0xFF; value = BUS_READ(ea); ExecuteOpcode(); } + + void zpx_3_5_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::zpx_3_5_T2; } //4 cycles + void zpx_3_5_T2(void) { BUS_READ(ea); addressModeCycleFn = &M6502::zpx_3_5_T3; } + void zpx_3_5_T3(void) { ea = (ea + x) & 0xFF; ExecuteOpcode(); } + + void zpy_2_6_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::zpy_2_6_T2; } //4 cycles + void zpy_2_6_T2(void) { BUS_READ(ea); addressModeCycleFn = &M6502::zpy_2_6_T3; } + void zpy_2_6_T3(void) { ea = (ea + y) & 0xFF; value = BUS_READ(ea); ExecuteOpcode(); } + + void zpy_3_5_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::zpy_3_5_T2; } //4 cycles + void zpy_3_5_T2(void) { BUS_READ(ea); addressModeCycleFn = &M6502::zpy_3_5_T3; } + void zpy_3_5_T3(void) { ea = (ea + y) & 0xFF; ExecuteOpcode(); } + + void idy_2_7_T1(void) { ia = BUS_READ(pc++); addressModeCycleFn = &M6502::idy_2_7_T2; } //5/6 cycles + void idy_2_7_T2(void) { ea = BUS_READ(ia++); addressModeCycleFn = &M6502::idy_2_7_T3; } + void idy_2_7_T3(void) { ea |= (BUS_READ(ia & 0xff) << 8); addressModeCycleFn = &M6502::idy_2_7_T4; } + void idy_2_7_T4(void); + void idy_2_7_T5(void) { value = BUS_READ(ea); ExecuteOpcode(); } + + void idy_3_6_T1(void) { ia = BUS_READ(pc++); addressModeCycleFn = &M6502::idy_3_6_T2; } //6 cycles + void idy_3_6_T2(void) { ea = BUS_READ(ia++); addressModeCycleFn = &M6502::idy_3_6_T3; } + void idy_3_6_T3(void) { ea |= (BUS_READ(ia & 0xff) << 8); addressModeCycleFn = &M6502::idy_3_6_T4; } + void idy_3_6_T4(void) { ea += y; BUS_READ(ea); addressModeCycleFn = &M6502::idy_3_6_T5; } + void idy_3_6_T5(void) { ExecuteOpcode(); } + + // idy_Undoc behaviour was determined by capturing bus activity on a real 6502 in a 1541 and confirmed by Visual6502. + void idy_Undoc_T1(void) { ia = BUS_READ(pc++); addressModeCycleFn = &M6502::idy_Undoc_T2; } //8 cycles + void idy_Undoc_T2(void) { ea = BUS_READ(ia++); addressModeCycleFn = &M6502::idy_Undoc_T3; } + void idy_Undoc_T3(void) { ea |= (BUS_READ(ia & 0xff) << 8); addressModeCycleFn = &M6502::idy_Undoc_T4; } + void idy_Undoc_T4(void) { ea += y; BUS_READ(ea); addressModeCycleFn = &M6502::idy_Undoc_T5; } + void idy_Undoc_T5(void) { value = BUS_READ(ea); addressModeCycleFn = &M6502::idy_Undoc_T6; } + void idy_Undoc_T6(void) { dataBusWriteFn(ea, (u8)value); addressModeCycleFn = &M6502::idy_Undoc_T7; } + void idy_Undoc_T7(void) { ExecuteOpcode(); } + + void zp_4_1_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::zp_4_1_T2; } //5 cycles + void zp_4_1_T2(void) { value = BUS_READ(ea); addressModeCycleFn = &M6502::zp_4_1_T3; } + void zp_4_1_T3(void) { dataBusWriteFn(ea, (u8)value); addressModeCycleFn = &M6502::zp_4_1_T4; } + void zp_4_1_T4(void) { ExecuteOpcode(); } + + void abs_4_2_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::abs_4_2_T2; } //6 cycles + void abs_4_2_T2(void) { ea |= (BUS_READ(pc++) << 8); addressModeCycleFn = &M6502::abs_4_2_T3; } + void abs_4_2_T3(void) { value = BUS_READ(ea); addressModeCycleFn = &M6502::abs_4_2_T4; } + void abs_4_2_T4(void) { dataBusWriteFn(ea, (u8)value); addressModeCycleFn = &M6502::abs_4_2_T5; } + void abs_4_2_T5(void) { ExecuteOpcode(); } + + void zpx_4_3_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::zpx_4_3_T2; } //6 cycles + void zpx_4_3_T2(void) { BUS_READ(ea); addressModeCycleFn = &M6502::zpx_4_3_T3; } + void zpx_4_3_T3(void) { ea = (ea + x) & 0xFF; value = BUS_READ(ea); addressModeCycleFn = &M6502::zpx_4_3_T4; } + void zpx_4_3_T4(void) { dataBusWriteFn(ea, (u8)value); addressModeCycleFn = &M6502::zpx_4_3_T5; } + void zpx_4_3_T5(void) { ExecuteOpcode(); } + + void absx_4_4_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::absx_4_4_T2; } //7 cycles + void absx_4_4_T2(void) { ea |= (BUS_READ(pc++) << 8); addressModeCycleFn = &M6502::absx_4_4_T3; } + void absx_4_4_T3(void) { ea += x; BUS_READ(ea); addressModeCycleFn = &M6502::absx_4_4_T4; } + void absx_4_4_T4(void) { value = BUS_READ(ea); addressModeCycleFn = &M6502::absx_4_4_T5; } + void absx_4_4_T5(void) { dataBusWriteFn(ea, (u8)value); addressModeCycleFn = &M6502::absx_4_4_T6; } + void absx_4_4_T6(void) { ExecuteOpcode(); } + + void absy_4_4_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::absy_4_4_T2; } //7 cycles + void absy_4_4_T2(void) { ea |= (BUS_READ(pc++) << 8); addressModeCycleFn = &M6502::absy_4_4_T3; } + void absy_4_4_T3(void) { ea += y; BUS_READ(ea); addressModeCycleFn = &M6502::absy_4_4_T4; } + void absy_4_4_T4(void) { value = BUS_READ(ea); addressModeCycleFn = &M6502::absy_4_4_T5; } + void absy_4_4_T5(void) { dataBusWriteFn(ea, (u8)value); addressModeCycleFn = &M6502::absy_4_4_T6; } + void absy_4_4_T6(void) { ExecuteOpcode(); } + + void ph_5_1_T1(void) { BUS_READ(pc); addressModeCycleFn = &M6502::ph_5_1_T2; } //3 cycles + void ph_5_1_T2(void) { ExecuteOpcode(); } + + void pl_5_2_T1(void) { BUS_READ(pc); addressModeCycleFn = &M6502::pl_5_2_T2; } //4 cycles + void pl_5_2_T2(void) { BUS_READ(0x100 + sp); addressModeCycleFn = &M6502::pl_5_2_T3; } + void pl_5_2_T3(void) { ExecuteOpcode(); } + + void jsr_5_3_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::jsr_5_3_T2; } //6 cycles + void jsr_5_3_T2(void) { BUS_READ(0x100 + sp); addressModeCycleFn = &M6502::jsr_5_3_T3; } + void jsr_5_3_T3(void) { Push((u8)((pc) >> 8)); addressModeCycleFn = &M6502::jsr_5_3_T4; } + void jsr_5_3_T4(void) { Push(pc & 0xff); addressModeCycleFn = &M6502::jsr_5_3_T5; } + void jsr_5_3_T5(void) { ea |= (BUS_READ(pc++) << 8); pc = ea; ExecuteOpcode(); } + + void rti_5_5_T1(void) { BUS_READ(pc++); addressModeCycleFn = &M6502::rti_5_5_T2; } //6 cycles + void rti_5_5_T2(void) { BUS_READ(0x100 + sp); addressModeCycleFn = &M6502::rti_5_5_T3; } + void rti_5_5_T3(void) { status = Pull(); addressModeCycleFn = &M6502::rti_5_5_T4; } + void rti_5_5_T4(void) { pc = Pull(); addressModeCycleFn = &M6502::rti_5_5_T5; } + void rti_5_5_T5(void) { pc |= (Pull() << 8); ExecuteOpcode(); } + + void abs5_6_1_T1(void) { ea = BUS_READ(pc++); addressModeCycleFn = &M6502::abs5_6_1_T2; } //3 cycles + void abs5_6_1_T2(void) { ea |= (BUS_READ(pc++) << 8); ExecuteOpcode(); } + + void abs5_6_2_T1(void) { ia = BUS_READ(pc++); addressModeCycleFn = &M6502::abs5_6_2_T2; } //5 cycles + void abs5_6_2_T2(void) { ia |= (BUS_READ(pc++) << 8); addressModeCycleFn = &M6502::abs5_6_2_T3; } + void abs5_6_2_T3(void) { ea = BUS_READ(ia++); addressModeCycleFn = &M6502::abs5_6_2_T4; } + void abs5_6_2_T4(void) { ea |= (BUS_READ(ia) << 8); ExecuteOpcode(); } + + void rts_5_7_T1(void) { BUS_READ(pc++); addressModeCycleFn = &M6502::rts_5_7_T2; } //6 cycles + void rts_5_7_T2(void) { BUS_READ(0x100 + sp); addressModeCycleFn = &M6502::rts_5_7_T3; } + void rts_5_7_T3(void) { pc = Pull(); addressModeCycleFn = &M6502::rts_5_7_T4; } + void rts_5_7_T4(void) { pc |= (Pull() << 8); addressModeCycleFn = &M6502::rts_5_7_T5; } + void rts_5_7_T5(void) { BUS_READ(pc); pc++; ExecuteOpcode(); } + + // The BRK, RESET, NMI and IRQ instructions are closely related. + // At T4 BRK can morph into one of the interrupts if that interrupt condition has subsequently occurred since the instruction started. + void brk_5_4_T1(void) { BUS_READ(pc); pc++; addressModeCycleFn = &M6502::brk_5_4_T2; } //7 cycles + void brk_5_4_T2(void) { Push((u8)(pc >> 8)); addressModeCycleFn = &M6502::brk_5_4_T3; } + void brk_5_4_T3(void) { Push(pc & 0xff); addressModeCycleFn = &M6502::brk_5_4_T4; } + void brk_5_4_T4(void); // We check here if we continue on executing the BRK or take the interrupt. + void brk_5_4_T5(void) { ea = BUS_READ(0xFFFE); addressModeCycleFn = &M6502::brk_5_4_T6; } // Short burts of interrupt assertions will be correctly masked by the BRK in these 2 cycles. + void brk_5_4_T6(void) { SetI(); pc = ea | (BUS_READ(0xFFFF) << 8); ExecuteOpcode(); } + + void Reset_T0(void) { sp = 0; BUS_READ(pc); addressModeCycleFn = &M6502::Reset_T1; } //7 cycles + void Reset_T1(void) { BUS_READ(pc); addressModeCycleFn = &M6502::Reset_T2; } + void Reset_T2(void) { BUS_READ(0x100 + sp--); addressModeCycleFn = &M6502::Reset_T3; } + void Reset_T3(void) { BUS_READ(0x100 + sp--); addressModeCycleFn = &M6502::Reset_T4; } + void Reset_T4(void) { ClearB(); BUS_READ(0x100 + sp--); addressModeCycleFn = &M6502::Reset_T5; } + void Reset_T5(void) { ea = BUS_READ(0xFFFC); addressModeCycleFn = &M6502::Reset_T6; } + void Reset_T6(void) { pc = ea | (BUS_READ(0xFFFD) << 8); addressModeCycleFn = &M6502::InstructionFetch; } + +#ifdef SUPPORT_NMI + void NMI_T1(void) { BUS_READ(pc); addressModeCycleFn = &M6502::NMI_T2; } //7 cycles + void NMI_T2(void) { Push((u8)(pc >> 8)); addressModeCycleFn = &M6502::NMI_T3; } + void NMI_T3(void) { Push(pc & 0xff); addressModeCycleFn = &M6502::NMI_T4; } + void NMI_T4(void) { ClearB(); Push(status); status |= FLAG_INTERRUPT; addressModeCycleFn = &M6502::NMI_T5; } + void NMI_T5(void) { ea = BUS_READ(0xFFFA); addressModeCycleFn = &M6502::NMI_T6; } + void NMI_T6(void) { SetI(); pc = ea | (BUS_READ(0xFFFB) << 8); NMIPending = false; addressModeCycleFn = &M6502::InstructionFetch; } +#endif // SUPPORT_NMI + +#ifdef SUPPORT_IRQ + void IRQ_T1(void) { BUS_READ(pc); addressModeCycleFn = &M6502::IRQ_T2; } //7 cycles + void IRQ_T2(void) { Push((u8)(pc >> 8)); addressModeCycleFn = &M6502::IRQ_T3; } + void IRQ_T3(void) { Push(pc & 0xff); addressModeCycleFn = &M6502::IRQ_T4; } + void IRQ_T4(void); // We check here if we continue on executing as IRQ or morph into NMI + void IRQ_T5(void) { ea = BUS_READ(0xFFFE); addressModeCycleFn = &M6502::IRQ_T6; } // Short burts of NMI assertions will be correctly masked by the IRQ in these 2 cycles + void IRQ_T6(void) { SetI(); pc = ea | (BUS_READ(0xFFFF) << 8); addressModeCycleFn = &M6502::InstructionFetchIRQ; } +#endif // SUPPORT_IRQ + + inline void ClearB() { status &= (~FLAG_BREAK); } + inline void SetB() { status |= FLAG_BREAK; } + inline void ClearC() { status &= (~FLAG_CARRY); } + inline void SetC() { status |= FLAG_CARRY; } + inline void SetC(u16 test) { test != 0 ? SetC() : ClearC(); } + inline void ClearZ() { status &= (~FLAG_ZERO); } + inline void SetZ() { status |= FLAG_ZERO; } + inline void SetZ(u16 test) { test != 0 ? SetZ() : ClearZ(); } + inline void ClearI() {status &= (~FLAG_INTERRUPT); } + inline void SetI() { status |= FLAG_INTERRUPT; } + inline void ClearD() {status &= (~FLAG_DECIMAL); } + inline void SetD() { status |= FLAG_DECIMAL; } + inline void ClearV() {status &= (~FLAG_OVERFLOW); } + inline void SetV() { status |= FLAG_OVERFLOW; } + inline void SetV(u16 test) { test != 0 ? SetV() : ClearV(); } + inline void ClearN() {status &= (~FLAG_SIGN); } + inline void SetN() { status |= FLAG_SIGN; } + inline void SetN(u16 test) { test != 0 ? SetN() : ClearN(); } + + inline void EstablishZ(u16 val) { SetZ((val & 0x00FF) == 0); } + inline void EstablishN(u16 val) { SetN(val & 0x0080); } + inline void EstablishC(u16 val) { SetC(val & 0xFF00); } + inline void EstablishV(u16 result, u8 val) { SetV((result ^ a) & (result ^ val) & 0x0080); } + inline void EstablishNZ(u16 val) { EstablishZ(val); EstablishN(val); } + +#ifdef SUPPORT_RDY_HALTING + void CheckForHalt(); +#endif // SUPPORT_RDY_HALTING + +public: + M6502() : status(FLAG_CONSTANT), dataBusReadFn(0), dataBusWriteFn(0) {} + M6502(void* data, DataBusReadFn dataBusReadFn, DataBusWriteFn dataBusWriteFn) { SetBusFunctions(dataBusReadFn, dataBusWriteFn); } + void SetBusFunctions(DataBusReadFn dataBusReadFn, DataBusWriteFn dataBusWriteFn) {this->dataBusReadFn = dataBusReadFn; this->dataBusWriteFn = dataBusWriteFn; status = FLAG_CONSTANT; Reset(); } + void Reset(void); + void Step(void); +#ifdef SUPPORT_RDY_HALTING + void RDY(bool asserted); + bool Halted() { return RDYHalted != 0; } + u8 BusRead(u16 address); +#endif // SUPPORT_RDY_HALTING + inline void SO(void) { SetV(); } + inline bool IRQDisabled(void) const { return (status & FLAG_INTERRUPT) != 0; } + + void GetRegs(u16& PC, u8& SP, u8& A, u8& X, u8& Y, u8& Status) { PC = pc; SP = sp; A = a; X = x; Y = y; Status = status; } + u16 GetPC() const { return pc; } + u8 GetA() const { return a; } + u8 GetX() const { return x; } + u8 GetY() const { return y; } + u8 GetStatus() const { return status; } + // Emulate the 6502's SYNC signal and pin + bool SYNC(void) const { return addressModeCycleFn == &M6502::InstructionFetch; } + +#ifdef SUPPORT_IRQ + Interrupt IRQ; +#endif // SUPPORT_IRQ +#ifdef SUPPORT_NMI + Interrupt NMI; +#endif // SUPPORT_NMI +}; +#endif diff --git a/m6522.cpp b/m6522.cpp new file mode 100644 index 0000000..58ceeac --- /dev/null +++ b/m6522.cpp @@ -0,0 +1,719 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#include "m6522.h" + +// There are a number of inherent undocumented edge cases with regards to Timer 2. +// A lot of empirical measurements, in the form of bus captures of a real Commodore 1541 VIA were taken to discover the exact behavior of the timers (especially timer 2 and all its idiosyncrasies). +// Many comments in this file are taken from statements found in the 6522 data sheets. + +m6522::m6522() +{ + Reset(); +} + +void m6522::Reset() +{ + functionControlRegister = 0; + auxiliaryControlRegister = 0; + + latchPortA = false; + latchedValueA = 0; + ca1 = false; + ca2 = false; + pulseCA2 = false; + + latchedValueB = 0; + cb1 = false; + cb1Old = false; + cb2 = false; + pulseCB2 = false; + + t1c.bytes.l = 0xff; + t1c.bytes.h = 0xff; + t1l.bytes.l = 0xff; + t1l.bytes.h = 0xff; + t1Ticking = false; + t1Reload = false; + t1OutPB7 = false; + t1FreeRun = false; + t1_pb7 = true; + t1TimedOut = false; + t1OneShotTriggeredIRQ = false; + + t2c.bytes.l = 0xc9; // logic analyser detects that these are some what random + t2c.bytes.h = 0xfb; // logic analyser detects that these are some what random + t2Latch = 0; + t2Reload = false; + t2CountingDown = false; + t2TimedOutCount = 0; + t2LowTimedOut = false; + t2CountingPB6Mode = false; + t2CountingPB6ModeOld = false; + pb6Old = 0; + t2TimedOut = false; + t2OneShotTriggeredIRQ = false; + + interruptFlagRegister = 0; + interruptEnabledRegister = 0; + + shiftRegister = 0; + + // External devices should be doing this + // - what about CA1 and CB1? + InputCA2(true); + InputCB2(true); + + bitsShiftedSoFar = 0; + cb1OutputShiftClock = 0; + cb1OutputShiftClockPositiveEdge = false; + cb2Shift = 0; + OutputIRQ(); +} + +void m6522::InputCA1(bool value) +{ + if (ca1 != value && ((functionControlRegister & FCR_CA1) != 0) == value) // CA1 is an input? + { + unsigned char ddr = portA.GetDirection(); + latchedValueA = ((portA.GetInput() & ~ddr) | (portA.GetOutput() & ddr)); + // test HANDSHAKE OUTPUT mode and if so auto clear + if ((functionControlRegister & (FCR_CA2_IO | FCR_CA2_OUTPUT_MODE1 | FCR_CB2_OUTPUT_MODE0)) == FCR_CA2_IO) + ca2 = false; + SetInterrupt(IR_CA1); + } + ca1 = value; +} + +void m6522::InputCA2(bool value) +{ + if ((functionControlRegister & FCR_CA2_IO) == 0) // CA2 is an input? + { + if (ca2 != value && ((functionControlRegister & FCR_CA2_EDGE_TRIGGER_MODE) != 0) == value) + SetInterrupt(IR_CA2); // interrupt if we are tracking edges + ca2 = value; + } +} + +void m6522::InputCB1(bool value) +{ + if (cb1 != value && ((functionControlRegister & FCR_CB1) != 0) == value) // CB1 is an input? + { + unsigned char ddr = portB.GetDirection(); + latchedValueB = ((portB.GetInput() & ~ddr) | (portB.GetOutput() & ddr)); + // test HANDSHAKE OUTPUT mode and if so auto clear + if ((functionControlRegister & (FCR_CB2_IO | FCR_CB2_OUTPUT_MODE1 | FCR_CB2_OUTPUT_MODE0)) == FCR_CB2_IO) + cb2 = false; + SetInterrupt(IR_CB1); + } + cb1 = value; +} + +// If CB2 is not set to an output then reads the CB2 line and stores the value in cb2 +void m6522::InputCB2(bool value) +{ + if ((functionControlRegister & FCR_CB2_IO) == 0) // CB2 is an input? + { + if (cb2 != value && ((functionControlRegister & FCR_CB2_EDGE_TRIGGER_MODE) != 0) == value) + SetInterrupt(IR_CB2); // interrupt if we are tracking edges + cb2 = value; + } +} + +// Update for a single cycle +void m6522::Execute() +{ + if (ca2 && pulseCA2) ca2 = false; + if (cb2 && pulseCB2) cb2 = false; + + // The t1 counter decrements on each succeeding phi2 from N to 0 and then one half phi2 cycle later IRQ goes active. + // (where N is the combined count value of T1CL and T1CH) + if (t1TimedOut) + { + t1c.value = t1l.value; + t1TimedOut = false; + + if (t1FreeRun) + { + if (t1FreeRunIRQsOn) + SetInterrupt(IR_T1); + } + else + { + if (!t1OneShotTriggeredIRQ) + { + t1OneShotTriggeredIRQ = true; + SetInterrupt(IR_T1); + } + // At this time the counter will continue to decrement at system clock rate. + // This allows the system processor to read the contents of the counter to determine the time since interrupt. + } + } + else if (t1Ticking && !t1Reload && !t1c.value--) + { + t1TimedOut = true; + + if (t1FreeRun) + { + if (t1l.value > 1) // A real VIA will not flip PB7 if the frequency is above a certain (ie 1 cycle) threshold + { + t1_pb7 = !t1_pb7; + if (t1OutPB7) + { + unsigned char ddr = portB.GetDirection(); + if (ddr & 0x80) + { + // the signal on PB7 is inverted each time the counter reaches zero + if (!t1_pb7) portB.SetOutput(portB.GetOutput() & (~0x80)); + else portB.SetOutput(portB.GetOutput() | 0x80); + } + } + } + } + else + { + if (!t1OneShotTriggeredIRQ) + { + if (t1OutPB7) + { + // PB7 was set low on the write to T1CH now the signal on PB7 will go high + // The duration of the pulse is equal to N + one and one half (where N equals the count value) to guarantee a valid output level on PB7. + unsigned char ddr = portB.GetDirection(); + if (ddr & 0x80) portB.SetOutput(portB.GetOutput() | 0x80); + t1_pb7 = false; + } + } + } + } + t1Reload = false; + + // Timer 2 can also be used to count negative pulses on the PB6 line. + unsigned char pb6 = portB.GetInput() & ~portB.GetDirection() & 0x40; + unsigned char shiftMode = (auxiliaryControlRegister & ACR_SHIFTREG_CTRL) >> 2; + + // The data is shifted into the shift register during the phi2 clock cycle following the positive going edge of the CB1 clock pulse. + // - So we test the edge of the clock last cycle and if positive shift this cycle. + bool shiftClockPositiveEdge = cb1OutputShiftClockPositiveEdge; + cb1OutputShiftClockPositiveEdge = false; + + if (t2TimedOut) + { + t2TimedOut = false; + + // In both modes the interrupt is only set once + if (!t2OneShotTriggeredIRQ) + { + t2OneShotTriggeredIRQ = true; + SetInterrupt(IR_T2); + } + else + { + // At this time the counter will continue to decrement at system clock rate or PB6 negative edge counts (depending upon mode) + // This allows the system processor to read the contents of the counter to determine the time since interrupt. + } + + if ((auxiliaryControlRegister & 0xc) == 4) // shift by timer 2? + { + cb1OutputShiftClockPositiveEdge = cb1OutputShiftClock; // If positive edge we need to shift next phi2 so cache for one cycle + cb1OutputShiftClock = !cb1OutputShiftClock; + } + + if (t2Latch == 0xff) + t2c.value--; + + if ((t2TimedOutCount > 1) && t2c.bytes.h == 0) + { + t2c.bytes.h = 0xff; + t2c.bytes.l = t2Latch + 2; + } + else + { + t2c.bytes.l = t2Latch; + } + t2LowTimedOut = false; + } + + if (t2CountingDown) + { + if (t2CountingPB6Mode ^ t2CountingPB6ModeOld) + { + // If T2 has changed modes then the IRQ is back on the table + t2OneShotTriggeredIRQ = false; + if (!t2CountingPB6Mode) + { + if (t2c.value == 0) // PB6 mode turned off just as it timed out we still need to interrupt. + SetInterrupt(IR_T2); + } + else + { + // When switching PB6Mode back on it will still count down one more time + t2c.value--; + t2TimedOut = t2c.value == 0; + } + } + else if (!t2Reload) // Only do this if it was not just reloaded by writing to T2CH + { + // Bit 5 of the ACR determines whether the counter is decremented by the 6502 system clock or input pulses arriving on PB6. + if (t2CountingPB6Mode && t2CountingPB6ModeOld) + { + if (pb6 == 0 && pb6Old == 1) // Was it the negative edge? + { + t2c.value--; + t2TimedOut = t2c.value == 0; + } + } + else + { + t2c.value--; + t2TimedOut = t2c.value == 0; + + if (t2c.bytes.l == 0xfe) + { + t2TimedOutCount++; + if ((auxiliaryControlRegister & 0xc) == 4) // shift by timer 2? + { + if (t2TimedOutCount > 1) + { + cb1OutputShiftClockPositiveEdge = cb1OutputShiftClock; // If positive edge we need to shift next phi2 so cache for one cycle + cb1OutputShiftClock = !cb1OutputShiftClock; + t2c.bytes.l = t2Latch; + t2TimedOut = false; + } + } + } + } + } + else + { + t2Reload = false; + } + } + pb6Old = pb6; + t2CountingPB6ModeOld = t2CountingPB6Mode; + + switch (shiftMode) + { + default: // 000 = shift reg disabled + // The CPU can read and write the SR but shifting is disabled. + // Both CB1 and CB2 are controlled by peripheral control register. + break; + case 1: // 001 = shift in by timer 2 + if ((t2TimedOutCount > 2) && shiftClockPositiveEdge && !(bitsShiftedSoFar & 8)) + { + // should output cb1OutputShiftClock onto cb1 + shiftRegister <<= 1; + shiftRegister |= cb2; // Should get from current cb2 (in a 1541 these pins on the VIAs are NC, measure at 5v and read as 1s) + if (++bitsShiftedSoFar == 8) + SetInterrupt(IR_SR); + } + break; + case 2: // 010 = shift in by phi2 + // SHIFT REGISTER BUG not implemented + // In both the shift in and shift out modes a liming condition may occur when the 6522 does not detect the shift pulse. + // This no shift condition occurs when CB1 and phi2 are asynchronous and their edges coincide. + if (!(bitsShiftedSoFar & 8)) // Shift register bug not implmented (would shift 9 bits?) + { + // should output cb1OutputShiftClock onto cb1 + cb1OutputShiftClock = !cb1OutputShiftClock; + shiftRegister <<= 1; + shiftRegister |= cb2; // Should get from current cb2 (in a 1541 these pins on the VIAs are NC, measure at 5v and read as 1s) + if (++bitsShiftedSoFar == 8) + SetInterrupt(IR_SR); + } + break; + case 3: // 011 = shift in by external clock + // SHIFT REGISTER BUG not implemented + // In both the shift in and shift out modes a liming condition may occur when the 6522 does not detect the shift pulse. + // This no shift condition occurs when CB1 and phi2 are asynchronous and their edges coincide. + if (cb1Old && !cb1) // Negitive edge + { + if (!(bitsShiftedSoFar & 8)) // Shift register bug not implmented (would shift 9 bits?) + { + shiftRegister <<= 1; + shiftRegister |= cb2; // Should get from current cb2 (in a 1541 these pins on the VIAs are NC, measure at 5v and read as 1s) + if (++bitsShiftedSoFar == 8) + SetInterrupt(IR_SR); + } + } + break; + case 4: // 100 = free run shift out by timer 2 (keep shifting the same byte out over and over) + if (shiftClockPositiveEdge) // in this mode the shift register counter is disabled. + { + cb2Shift = (shiftRegister & 0x80) != 0; + shiftRegister = (shiftRegister << 1) | cb2Shift; + // should output cb1OutputShiftClock onto cb1 + // cb2Shift should output to cb2 + // - R/!W (on the 2nd VIA could be dangerous) + } + break; + case 5: // 101 = shift out by timer 2 + if ((t2TimedOutCount > 2) && shiftClockPositiveEdge && !(bitsShiftedSoFar & 8)) + { + cb2Shift = (shiftRegister & 0x80) != 0; + shiftRegister = (shiftRegister << 1) | cb2Shift; + if (++bitsShiftedSoFar == 8) + SetInterrupt(IR_SR); + // should output cb1OutputShiftClock onto cb1 + // cb2Shift should output to cb2 + // - R/!W (on the 2nd VIA could be dangerous) + } + break; + case 6: // 110 = shift out by phi2 + if (!(bitsShiftedSoFar & 8)) + { + // should output cb1OutputShiftClock onto cb1 + cb1OutputShiftClock = !cb1OutputShiftClock; + cb2Shift = (shiftRegister & 0x80) != 0; + shiftRegister = (shiftRegister << 1) | cb2Shift; + if (++bitsShiftedSoFar == 8) + SetInterrupt(IR_SR); + // cb2Shift should output to cb2 + // - R/!W (on the 2nd VIA could be dangerous) + } + break; + case 7: // 111 = shift out by external clock + // SHIFT REGISTER BUG not implemented + // In both the shift in and shift out modes a liming condition may occur when the 6522 does not detect the shift pulse. + // This no shift condition occurs when CB1 and phi2 are asynchronous and their edges coincide. + if (cb1Old && !cb1) // Negitive edge + { + if (!(bitsShiftedSoFar & 8)) + { + // should output cb1OutputShiftClock onto cb1 + cb1OutputShiftClock = !cb1OutputShiftClock; + cb2Shift = (shiftRegister & 0x80) != 0; + shiftRegister = (shiftRegister << 1) | cb2Shift; + if (++bitsShiftedSoFar == 8) + SetInterrupt(IR_SR); + // cb2Shift should output to cb2 + // - R/!W (on the 2nd VIA could be dangerous) + } + } + break; + } + cb1Old = cb1; +} + +unsigned char m6522::Read(unsigned int address) +{ + unsigned char value = 0; + + switch (address & 0xf) + { + case ORB: + value = ReadPortB(); + if (t1OutPB7) // We need to see what we are setting eventhough we may not be outputting it (because off DDR) + { + if (!t1_pb7) value &= (~0x80); + else value |= 0x80; + } + break; + case ORA: + value = ReadPortA(true); + break; + case DDRB: + value = portB.GetDirection(); + break; + case DDRA: + value = portA.GetDirection(); + break; + case T1CL: + // A read T1CL transters the counter’s contents to the data bus and if a T1 interrupt has occurred the read operation will clear the IFR flag and reset !IRQ + ClearInterrupt(IR_T1); + value = t1c.bytes.l; + break; + case T1CH: + // A read T1CH transfers the counter's contents to the data bus. + value = t1c.bytes.h; + break; + case T1LL: + // A read of T1LL transfers the latch’s contents to the data bus; it has no effect on the T1 interrupt flag. + value = t1l.bytes.l; + break; + case T1LH: + // A read of T1LH transfers the contents of the latch to the data bus. + value = t1l.bytes.h; + break; + case T2CL: + // A read of T2CL transfers the contents of the low order counter to the data bus, and if a T2 interrupt has occurred, + // the read operation will clear the T2 interrupt flag and reset !IRQ. + ClearInterrupt(IR_T2); + value = t2c.bytes.l; + break; + case T2CH: + // A read of T2CH transfers the contents of the high order counter to the data bus. + value = t2c.bytes.h; + break; + case SR: + value = shiftRegister; + if (interruptFlagRegister & IR_SR) bitsShiftedSoFar = 0; + ClearInterrupt(IR_SR); + break; + case ACR: + value = auxiliaryControlRegister; + break; + case FCR: + value = functionControlRegister; + break; + case IFR: + value = interruptFlagRegister; + break; + case IER: + value = interruptEnabledRegister | IR_IRQ; + break; + case ORA_NH: + value = ReadPortA(false); + break; + } + return value; +} + +unsigned char m6522::Peek(unsigned int address) +{ + unsigned char value = 0; + + switch (address & 0xf) + { + case ORB: + value = PeekPortB(); + break; + case ORA: + value = PeekPortA(); + break; + case DDRB: + value = portB.GetDirection(); + break; + case DDRA: + value = portA.GetDirection(); + break; + case T1CL: + value = t1c.bytes.l; + break; + case T1CH: + value = t1c.bytes.h; + break; + case T1LL: + value = t1l.bytes.l; + break; + case T1LH: + value = t1l.bytes.h; + break; + case T2CL: + value = t2c.bytes.l; + break; + case T2CH: + value = t2c.bytes.h; + break; + case SR: + value = shiftRegister; + break; + case ACR: + value = auxiliaryControlRegister; + break; + case FCR: + value = functionControlRegister; + break; + case IFR: + value = interruptFlagRegister; + break; + case IER: + value = interruptEnabledRegister | IR_IRQ; + break; + case ORA_NH: + value = PeekPortA(); + break; + } + return value; +} + +void m6522::Write(unsigned int address, unsigned char value) +{ + unsigned char ddr; + + switch (address & 0xf) + { + case ORB: + WritePortB(value); + break; + case ORA: + WritePortA(value, true); + break; + case DDRB: + portB.SetDirection(value); + break; + case DDRA: + portA.SetDirection(value); + break; + case T1CL: + case T1LL: + // Writing to the T1CL is effectively a write to the low order latch. + // Writing T1LL stores an 8 bit count value into the latch. Effectively the same as a write to T1CL. + // The data is held in the latch until the high order counter is written : at this time the data is transferred to the counter. + t1l.bytes.l = value; + break; + case T1CH: + // A write to TICH loads both the high order counter and high order latch with the same value. + // Simultaneously the T1LL contents are transferred to the low order counter and the count begins. + // If PB7 has been programmed as a TIMER 1 output it will go low on the phi2 following the write operation. + // Additionally, if the T1 interrupt flag has already been set, the write operation will clear it. + // The write to TICH initiates the countdown on the next ph2. + t1l.bytes.h = value; + t1c.value = t1l.value; + t1Ticking = true; // BruceLee needs this else it will not load. + t1Reload = true; + ClearInterrupt(IR_T1); + t1FreeRunIRQsOn = true; + t1TimedOut = t1c.value == 0; + // By setting bit 7 in the ACH to a one, PB7 will be enabled as a one shot output. PB7 will go low immediately alter writing T1CH. + t1_pb7 = true; + if (t1OutPB7) + { + // With the output enabled(ACR7 = 1) a "write T1CH" operation will cause PB7 to go low. PB7 will return high when Timer 1 times out. The result is a single programmable width pulse. + // To guarantee a valid output level on PB7. Bit 7 of DDRB must also be set to a one. ORB bit 7 will NOT affect the level on PB7. + // TO CHECK - need to cache the old value of ORB bit 7? + ddr = portB.GetDirection(); + if (ddr & 0x80) + portB.SetOutput(portB.GetOutput() & (~0x80)); + } + if (!t1FreeRun) // If one shot mode then IRQ is back in play + t1OneShotTriggeredIRQ = false; + break; + case T1LH: + // A write to T1LH loads an 8 bit count value into the latch. + t1l.bytes.h = value; + // To clear or not to clear the IRQ flag? + // There are a few documents that say a write to T1LH does not clear the IRQ. + // Even Synertek's official FAQ doc (a document that was supposed to clear up the vagueness of the official datasheet) says that the flag is not cleared. + // I have now discovered that it is indeed cleared and this clear is very important. + // My take on it;- + // Allowing the IRQ to be cleared here allows a programmer to keep T1 running in free run mode but NOT generate IRQs (this is an undocumented feature). + // It can be useful to have T1 run in free run mode and utilise the benefits (ie timed pulses on PB7) but not incur the overhead of IRQs triggering. + // The designers of the 6522 allow this mode by clearing the T1 interrupt triggering when T1LH is written to. + if (!(interruptEnabledRegister & IR_T1)) // It appears that this only occurs if T1 IRQs are already disabled (else EOD refuses to load) + t1FreeRunIRQsOn = false; + ClearInterrupt(IR_T1); + break; + case T2LL: + // Writing T2CL/T2LL effectively stores an 8 bit byte in a write only latch where it will be held until the count is initiated. + t2Latch = value; + break; + case T2CH: + // Writing T2CH loads an 8 bit byte into the high order counter and latch (!!!there is no t2lh!!!) and simultaneously loads the low order latch into the low order counter, and the count down is initiated. + // If a T2 interrupt has occurred, the write operation will clear the T2 interrupt flag and reset !IRQ. + t2c.bytes.h = value; + t2c.bytes.l = t2Latch; + t2Reload = true; + t2TimedOutCount = 0; + t2LowTimedOut = false; + t2TimedOut = false; + t2CountingDown = true; + ClearInterrupt(IR_T2); + t2OneShotTriggeredIRQ = false; + break; + case SR: + shiftRegister = value; + if (interruptFlagRegister & IR_SR) bitsShiftedSoFar = 0; + ClearInterrupt(IR_SR); + cb1OutputShiftClock = 1; + cb1OutputShiftClockPositiveEdge = false; + break; + case ACR: + //bool t1OutPB7Prev = (auxiliaryControlRegister & ACR_T1_OUT_PB7) != 0; + auxiliaryControlRegister = value; + latchPortA = (value & ACR_PA_LATCH_ENABLE) != 0; + latchPortB = (value & ACR_PB_LATCH_ENABLE) != 0; + // T1 will generate continuous interrupts when bit 6 of the ACR is a one. + // In effect, this bit provides a link between the latches and counter; automatically loading the counters from the latches when time out occurs. + // Note: when in this mode and !IRQ is enabled. !IRQ will go low after the first (and each succeeding) time out and stay low until either TICL is read or T1CH is written. + t1FreeRun = (value & ACR_T1_MODE) != 0; + t1OutPB7 = (value & ACR_T1_OUT_PB7) != 0; + t2CountingPB6Mode = (value & ACR_T2_MODE) != 0; + // A precaution to take in the use of PB7 as the timer output concerns the Data Direction Register contents for PB7. + // Both DDRB bit 7 and ACR bit 7 must be 1 for PB7 to function as the timer output. + // If one is 1 and the other is 0, then PB7 functions as a normal output pin, controlled by ORB bit 7. + // TODO when in this mode cache and track what is occuring in ORB7? + if (t1OutPB7) + { + ddr = portB.GetDirection(); + //if (ddr & 0x80) + //{ + // // TO CHECK IN HW + // // If t1OutPB7 gets turned on before a time out what happens? + // // PB7 could become the cached value of the previously tracked PB7 + // // PB7 could go low + // // PB7 could remain the value of ORB7 until the next time out + // if (!t1_pb7) + // portB.SetOutput(portB.GetOutput() & (~0x80)); + // else + // portB.SetOutput(portB.GetOutput() | 0x80); + //} + if (!t1_pb7) + { + if (ddr & 0x80) portB.SetOutput(portB.GetOutput() & (~0x80)); + } + else + { + if (ddr & 0x80) portB.SetOutput(portB.GetOutput() | 0x80); + } + } + //else if (t1OutPB7Prev) + //{ + // // TODO: what if it was turned off before the timer times out? + // // What happens to PB7 in this case? It was low in one shot mode and can vary in free running mode, now what? + // // Should go back to the cached version of ORB7? + //} + break; + case FCR: // Peripheral Control Register + functionControlRegister = value; + if ((value & FCR_CA2_IO) == FCR_CA2_IO) + { + // ca2 is an output + pulseCA2 = (value & (FCR_CA2_OUTPUT_MODE1 | FCR_CA2_OUTPUT_MODE0)) == FCR_CA2_OUTPUT_MODE0; + ca2 = !pulseCA2 && (value & (FCR_CA2_OUTPUT_MODE1 | FCR_CA2_OUTPUT_MODE0)) == (FCR_CA2_OUTPUT_MODE1 | FCR_CA2_OUTPUT_MODE0); + } + else + { + // ca2 is an input + } + if ((value & FCR_CB2_IO) == FCR_CB2_IO) + { + // cb2 is an output + pulseCB2 = (value & (FCR_CB2_OUTPUT_MODE1 | FCR_CB2_OUTPUT_MODE0)) == FCR_CB2_OUTPUT_MODE0; + cb2 = !pulseCB2 && (value & (FCR_CB2_OUTPUT_MODE1 | FCR_CB2_OUTPUT_MODE0)) == (FCR_CB2_OUTPUT_MODE1 | FCR_CB2_OUTPUT_MODE0); + } + else + { + // cb2 is an input + } + break; + case IFR: + ClearInterrupt(value); + break; + case IER: + // If bit 7 is a 0, each 1 in bits 6 through 0 clears the corresponding bit in the IER. + // For each zero in bits 6 through 0, the corresponding bit is unaffected. + if (value & IR_IRQ) interruptEnabledRegister |= value; + else interruptEnabledRegister &= (~value); + interruptEnabledRegister &= (~IR_IRQ); + OutputIRQ(); + break; + case ORA_NH: + WritePortA(value, false); + break; + } +} diff --git a/m6522.h b/m6522.h new file mode 100644 index 0000000..7d1f767 --- /dev/null +++ b/m6522.h @@ -0,0 +1,385 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef M6522_H +#define M6522_H + +#include "IOPort.h" +#include "m6502.h" + +class m6522 +{ + // $1800 + // PB 0 data in + // PB 1 data out + // PB 2 clock in + // PB 3 clock out + // PB 4 ATNA + // PB 5,6 device address + // PB 7,CA1 ATN IN + + // $1C00 + // PB 0,1 step motor + // PB 2 MTR dirve motor + // PB 3 ACT drive LED + // PB 4 WPS write protect switch + // PB 5,6 bit rate + // PB 7 Sync + // CA 1 Byte ready + // CA 2 SOE set overflow enable 6502 + // CB 2 read/write + + // IFR + //REG 13 -- INTERRUPT FLAG REGISTER + //+-+-+-+-+-+-+-+-+ + //|7|6|5|4|3|2|1|0| SET BY CLEARED BY + //+-+-+-+-+-+-+-+-+ +-----------------------+------------------------------+ + // | | | | | | | +--CA2| CA2 ACTIVE EDGE | READ OR WRITE REG 1 (ORA)* | + // | | | | | | | +-----------------------+------------------------------+ + // | | | | | | +--CA1--| CA1 ACTIVE EDGE | READ OR WRITE REG 1 (ORA) | + // | | | | | | +-----------------------+------------------------------+ + // | | | | | +SHIFT REG| COMPLETE 8 SHIFTS | READ OR WRITE SHIFT REG | + // | | | | | +-----------------------+------------------------------+ + // | | | | +-CB2-------| CB2 ACTIVE EDGE | READ OR WRITE ORB* | + // | | | | +-----------------------+------------------------------+ + // | | | +-CB1---------| CB1 ACTIVE EDGE | READ OR WRITE ORB | + // | | | +-----------------------+------------------------------+ + // | | +-TIMER 2-------| TIME-OUT OF T2 | READ T2 LOW OR WRITE T2 HIGH | + // | | +-----------------------+------------------------------+ + // | +-TIMER 1---------| TIME-OUT OF T1 | READ T1 LOW OR WRITE T1 HIGH | + // | +-----------------------+------------------------------+ + // +-IRQ---------------| ANY ENABLED INTERRUPT | CLEAR ALL INTERRUPTS | + // +-----------------------+------------------------------+ + + enum Registers + { + ORB, // 0 Port B + ORA, // 1 Port A + DDRB, // 2 Data direction register for port B + DDRA, // 3 Data direction register for port A + + T1CL, // 4 Timer 1 count low + T1CH, // 5 Timer 1 count high + T1LL, // 6 Timer 1 latch low + T1LH, // 7 Timer 1 latch high + T2CL, // 8 Timer 2 count low read-only + T2LL = T2CL, // 8 Timer 2 latch low write-only + T2CH, // 9 Timer 2 count high read/write + + SR, // 10 Serial port shift register + + ACR, // 11 Auxiliary control register + FCR, // 12 Peripheral control register + + IFR, // 13 Interrupt flag register + IER, // 14 Interrupt Enable Register + ORA_NH // 15 Port A with no handshake + }; + + + enum ACR + { + ACR_PA_LATCH_ENABLE = 0x01, // Port A latch + // 0 = disabled + // 1 = enabled on CA1 transition (in) + ACR_PB_LATCH_ENABLE = 0x02, // Port B latch + // 0 = disabled + // 1 = enabled on CB1 transition (in/out) + ACR_SHIFTREG_CTRL = 0x1c, // Shift register control + // 000 = shift reg disabled + // 001 = shift in by timer 2 + // 010 = shift in by phi2 + // 011 = shift in by external clock (PB6?) + // 100 = free run shift out by timer 2 (keep shifting the same byte out over and over) + // 101 = shift out by timer 2 + // 110 = shift out by phi2 + // 111 = shift out by external clock(PB6 ? ) + ACR_T2_MODE = 0x20, // Timer 2 control + // 0 = one shot (timed interrrupt) + // 1 = count down with pulses on PB6 + ACR_T1_MODE = 0x40, // Timer 1 control + // 0 = one shot + // 1 = continuous, i.e. on underflow timer restarts at latch value. + ACR_T1_OUT_PB7 = 0x80 // Output on PB7 + }; + + enum IR + { + IR_CA2 = 0x01, // CA2 flag + // Cleared by a read or write of ORA + IR_CA1 = 0x02, // CA1 flag + // Cleared by a read or write of ORA + IR_SR = 0x04, // Shift Register completion + // 1 at end of 8 shifts + // Cleared by read or write of SR + IR_CB2 = 0x08, // CB2 flag + // Cleared by a read or write of ORB + IR_CB1 = 0x10, // CB1 flag + // Cleared by a read or write of ORB + IR_T2 = 0x20, // Timer 2 + // 1 when time out + // 0 after reading T2 low-byte counter or writing T2 high-byte counter + IR_T1 = 0x40, // Timer 1 + // 1 when time out + // 0 after reading T1 low-byte counter or writing T1 high-byte latch + IR_IRQ = 0x80 // General interrupt status bit + // 1 if any interrupt active and enabled + // 0 when interrupt condition cleared + }; + +public: +/* +FCR/PCR + +---+---+---+---+---+---+---+---+ + | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | + +---+---+---+---+---+---+---+---+ + | | | | | | + +----+----+ | +----+----+ | + | | | | + CB2 CONTROL -----+ | | +- CA1 INTERRUPT CONTROL + +-+-+-+------------------------+ | | +--------------------------+ + |7|6|5| OPERATION | | | | 0 = NEGATIVE ACTIVE EDGE | + +-+-+-+------------------------+ | | | 1 = POSITIVE ACTIVE EDGE | + |0|0|0| INPUT NEG. ACTIVE EDGE | | | +--------------------------+ + +-+-+-+------------------------+ | +---- CA2 INTERRUPT CONTROL + |0|0|1| INDEPENDENT INTERRUPT | | +-+-+-+------------------------+ + | | | | INPUT NEGATIVE EDGE | | |3|2|1| OPERATION | + +-+-+-+------------------------+ | +-+-+-+------------------------+ + |0|1|0| INPUT POS. ACTIVE EDGE | | |0|0|0| INPUT NEG. ACTIVE EDGE | + +-+-+-+------------------------+ | +-+-+-+------------------------+ + |0|1|1| INDEPENDENT INTERRUPT | | |0|0|1| INDEPENDENT INTERRUPT | + | | | | INPUT POSITIVE EDGE | | | | | | INPUT NEGATIVE EDGE | + +-+-+-+------------------------+ | +-+-+-+------------------------+ + |1|0|0| HANDSHAKE OUTPUT | | |0|1|0| INPUT POS. ACTIVE EDGE | + +-+-+-+------------------------+ | +-+-+-+------------------------+ + |1|0|1| PULSE OUTPUT | | |0|1|1| INDEPENDENT INTERRUPT | + +-+-+-+------------------------+ | | | | | INPUT POSITIVE EDGE | + |1|1|0| LOW OUTPUT | | +-+-+-+------------------------+ + +-+-+-+------------------------+ | |1|0|0| HANDSHAKE OUTPUT | + |1|1|1| HIGH OUTPUT | | +-+-+-+------------------------+ + +-+-+-+------------------------+ | |1|0|1| PULSE OUTPUT | + CB1 INTERRUPT CONTROL --------+ +-+-+-+------------------------+ + +--------------------------+ |1|1|0| LOW OUTPUT | + | 0 = NEGATIVE ACTIVE EDGE | +-+-+-+------------------------+ + | 1 = POSITIVE ACTIVE EDGE | |1|1|1| HIGH OUTPUT | + +--------------------------+ +-+-+-+------------------------+ +*/ + enum FCR + { + FCR_CA1 = 0x01, + FCR_CA2_OUTPUT_MODE0 = 0x02, // 1c00 byte ready active 1541 rom $FAC1 + FCR_CA2_OUTPUT_MODE1 = 0x04, + FCR_CA2_EDGE_TRIGGER_MODE = 0x04, + FCR_CA2_IO = 0x08, + FCR_CA2 = 0x0e, + + FCR_CB1 = 0x01, + FCR_CB2_OUTPUT_MODE0 = 0x20, // 1c00 writing + FCR_CB2_OUTPUT_MODE1 = 0x40, + FCR_CB2_EDGE_TRIGGER_MODE = 0x40, + FCR_CB2_IO = 0x80, + FCR_CB2 = 0xe0, + }; + + m6522(); + + void Reset(); + void ConnectIRQ(Interrupt* irq) { this->irq = irq; } + + inline IOPort* GetPortA() { return &portA; } + inline bool GetLatchPortA() const { return latchPortA; } + inline unsigned char GetLatchedValueA() { return latchedValueA; } + inline bool GetCA1() { return ca1; } + void InputCA1(bool value); + inline bool GetCA2() { return ca2; } + void InputCA2(bool value); + + inline IOPort* GetPortB() { return &portB; } + bool GetLatchPortB() const { return latchPortB; } + unsigned char GetLatchedValueB() { return latchedValueB; } + inline bool GetCB1() { return cb1; } + void InputCB1(bool value); + inline bool GetCB2() { return cb2; } + void InputCB2(bool value); + + void Execute(); + + unsigned char Read(unsigned int address); + unsigned char Peek(unsigned int address); + void Write(unsigned int address, unsigned char value); + + inline unsigned char GetFCR() + { + return functionControlRegister; + } +private: + inline unsigned char ReadPortB() + { + unsigned char ddr = portB.GetDirection(); + unsigned char value = (latchPortB && (interruptFlagRegister & (unsigned char)IR_CB1) != 0) ? latchedValueB : (unsigned char)((portB.GetInput() & ~ddr) | (portB.GetOutput() & ddr)); + ClearInterrupt(IR_CB1 | IR_CB2); + return value; + } + + inline void WritePortB(unsigned char value) + { + ClearInterrupt(IR_CB1 | IR_CB2); + if ((functionControlRegister & (unsigned char)(FCR_CB2_IO | FCR_CB2_OUTPUT_MODE1)) == (unsigned char)(FCR_CB2_IO | FCR_CB2_OUTPUT_MODE1)) + cb2 = false; + portB.SetOutput(value); + } + + inline unsigned char ReadPortA(bool handshake) + { + unsigned char ddr = portA.GetDirection(); + unsigned char value = (latchPortA && (interruptFlagRegister & (unsigned char)IR_CA1) != 0) ? latchedValueA : (unsigned char)((portA.GetInput() & ~ddr) | (portA.GetOutput() & ddr)); + if (handshake) + ClearInterrupt(IR_CA1 | IR_CA2); + return value; + } + + inline unsigned char PeekPortA() + { + unsigned char ddr = portA.GetDirection(); + unsigned char value = (latchPortA && (interruptFlagRegister & (unsigned char)IR_CA1) != 0) ? latchedValueA : (unsigned char)((portA.GetInput() & ~ddr) | (portA.GetOutput() & ddr)); + return value; + } + + inline void WritePortA(unsigned char value, bool handshake) + { + if (handshake) + { + ClearInterrupt(IR_CA1 | IR_CA2); + if ((functionControlRegister & (unsigned char)(FCR_CA2_IO | FCR_CA2_OUTPUT_MODE1)) == (unsigned char)(FCR_CA2_IO | FCR_CA2_OUTPUT_MODE1)) + ca2 = false; + } + portA.SetOutput(value); + } + + inline unsigned char PeekPortB() + { + unsigned char ddr = portB.GetDirection(); + unsigned char value = (latchPortB && (interruptFlagRegister & (unsigned char)IR_CB1) != 0) ? latchedValueB : (unsigned char)((portB.GetInput() & ~ddr) | (portB.GetOutput() & ddr)); + return value; + } + + inline void SetInterrupt(unsigned char flag) + { + if (!(interruptFlagRegister & flag)) + { + interruptFlagRegister |= flag; + OutputIRQ(); + } + } + + inline void ClearInterrupt(unsigned char flag) + { + if (interruptFlagRegister & flag) + { + interruptFlagRegister &= ~flag; + OutputIRQ(); + } + } + inline void OutputIRQ() + { + if (interruptEnabledRegister & interruptFlagRegister & 0x7f) + { + if ((interruptFlagRegister & IR_IRQ) == 0) + { + interruptFlagRegister |= IR_IRQ; + if (irq) irq->Assert(); + } + } + else + { + if (interruptFlagRegister & IR_IRQ) + { + interruptFlagRegister &= ~IR_IRQ; + if (irq) irq->Release(); + } + } + } + + struct Counter + { + union + { + unsigned short value; + struct + { + // if porting to big endian, swap these. + unsigned char l; + unsigned char h; + } bytes; + }; + }; + + Interrupt* irq; + + unsigned char functionControlRegister; + unsigned char auxiliaryControlRegister; + + IOPort portA; + bool latchPortA; + unsigned char latchedValueA; + bool ca1; + bool ca2; + bool pulseCA2; + + IOPort portB; + bool latchPortB; + unsigned char latchedValueB; + bool cb1; + bool cb1Old; + bool cb2; + bool pulseCB2; + + Counter t1c; + Counter t1l; + bool t1Ticking; + bool t1Reload; + bool t1OutPB7; + bool t1FreeRun; + bool t1FreeRunIRQsOn; + bool t1TimedOut; + bool t1_pb7; + bool t1OneShotTriggeredIRQ; + + Counter t2c; + unsigned char t2Latch; + bool t2Reload; + bool t2CountingDown; + bool t2CountingPB6ModeOld; + bool t2CountingPB6Mode; + bool t2TimedOut; + bool t2LowTimedOut; + bool t2OneShotTriggeredIRQ; + unsigned t2TimedOutCount; + unsigned char pb6Old; + + unsigned char interruptFlagRegister; + unsigned char interruptEnabledRegister; + + unsigned char shiftRegister; + unsigned bitsShiftedSoFar; + unsigned cb1OutputShiftClock; + unsigned char cb2Shift; // version of cb2 controlled by the shift register + bool cb1OutputShiftClockPositiveEdge; +}; + +#endif \ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..2393352 --- /dev/null +++ b/main.cpp @@ -0,0 +1,1123 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#include "defs.h" +#include +#include "timer.h" +#include "ROMs.h" +#include "stb_image.h" +extern "C" +{ +#include "rpi-aux.h" +#include "rpi-gpio.h" +#include "startup.h" +#include "cache.h" +#include "rpi-mailbox-interface.h" +#include "interrupt.h" +#include +} +#include "InputMappings.h" +#include "options.h" +#include "iec_commands.h" +#include "diskio.h" +#include "Pi1541.h" +#include "FileBrowser.h" + +#include "logo.h" +#include "sample.h" + +unsigned versionMajor = 1; +unsigned versionMinor = 1; + +// When the emulated CPU starts we execute the first million odd cycles in non-real-time (ie as fast as possible so the emulated 1541 becomes responsive to CBM-Browser asap) +// During these cycles the CPU is executing the ROM self test routines (these do not need to be cycle accurate) +#define FAST_BOOT_CYCLES 1003061 + +#define COLOUR_BLACK RGBA(0, 0, 0, 0xff) +#define COLOUR_WHITE RGBA(0xff, 0xff, 0xff, 0xff) +#define COLOUR_RED RGBA(0xff, 0, 0, 0xff) +#define COLOUR_GREEN RGBA(0, 0xff, 0, 0xff) +#define COLOUR_CYAN RGBA(0, 0xff, 0xff, 0xff) +#define COLOUR_YELLOW RGBA(0xff, 0xff, 0x00, 0xff) + +// To exit a mounted disk image we need to watch(snoop) what the emulated CPU is doing when it executes code at some critical ROM addresses. +#define SNOOP_CD_CBM 0xEA2D +#define SNOOP_CD_JIFFY_BOTH 0xFC07 +#define SNOOP_CD_JIFFY_DRIVEONLY 0xEA16 +static const u8 snoopBackCommand[] = { + 'C', 'D', ':', '_' //0x43, 0x44, 0x3a, 0x5f +}; +static int snoopIndex = 0; +static int snoopPC = 0; + +bool emulating; // When false we are in IEC command mode level simulation. When true we are in full cycle exact emulation mode. + +typedef void(*func_ptr)(); + +const long int tempBufferSize = 1024; +char tempBuffer[tempBufferSize]; +ROMs roms; + +//u8 s_u8Memory[0x800]; +u8 s_u8Memory[0xc000]; + +DiskCaddy diskCaddy; +Pi1541 pi1541; +CEMMCDevice m_EMMC; +Screen screen; +const char* fileBrowserSelectedName; +u8 deviceID = 8; +IEC_Commands m_IEC_Commands; +bool onResetChangeToStartingFolder = false; +bool extraRAM = false; +bool disableSD2IECCommands = false; +bool supportUARTInput = false; +bool graphIEC = false; +bool quickBoot = false; +bool displayPNGIcons = false; +bool soundOnGPIO = false; +bool invertIECInputs = false; +bool splitIECLines = false; + +const char* termainalTextRed = "\E[31m"; +const char* termainalTextNormal = "\E[0m"; + +// Hooks required for USPi library +extern "C" +{ + void LogWrite(const char *pSource, unsigned Severity, const char *pMessage, ...) + { + va_list args; + va_start(args, pMessage); + vprintf(pMessage, args); + va_end(args); + } + + int GetMACAddress(unsigned char Buffer[6]) + { + rpi_mailbox_property_t* mp; + + RPI_PropertyInit(); + RPI_PropertyAddTag(TAG_GET_BOARD_MAC_ADDRESS); + RPI_PropertyProcess(); + + if ((mp = RPI_PropertyGet(TAG_GET_BOARD_MAC_ADDRESS))) + { + for (int i = 0; i < 6; ++i) + { + Buffer[i] = mp->data.buffer_8[i]; + } + return 1; + } + + return 0; + } + + int SetPowerStateOn(unsigned id) + { + volatile u32* mailbox; + u32 result; + + mailbox = (u32*)(PERIPHERAL_BASE | 0xB880); + while (mailbox[6] & 0x80000000); + mailbox[8] = 0x80; + do { + while (mailbox[6] & 0x40000000); + } while (((result = mailbox[0]) & 0xf) != 0); + return result == 0x80; + } + + void usDelay(unsigned nMicroSeconds) + { + unsigned before; + unsigned after; + for (u32 count = 0; count < nMicroSeconds; ++count) + { + before = read32(ARM_SYSTIMER_CLO); + do + { + after = read32(ARM_SYSTIMER_CLO); + } while (after == before); + } + } + + void MsDelay(unsigned nMilliSeconds) + { + usDelay(nMilliSeconds * 1000); + } + + unsigned StartKernelTimer(unsigned nHzDelay, TKernelTimerHandler* pHandler, void* pParam, void* pContext) + { + return TimerStartKernelTimer(nHzDelay, pHandler, pParam, pContext); + } + + void CancelKernelTimer(unsigned hTimer) + { + TimerCancelKernelTimer(hTimer); + } + + typedef void TInterruptHandler(void* pParam); + + // USPi uses USB IRQ 9 + void ConnectInterrupt(unsigned nIRQ, TInterruptHandler* pHandler, void *pParam) + { + InterruptSystemConnectIRQ(nIRQ, pHandler, pParam); + } +} + +// Hooks for FatFs +DWORD get_fattime() { return 0; } // If you have hardware RTC return a correct value here. THis can then be reflected in file modification times/dates. + +/////////////////////////////////////////////////////////////////////////////////////// +// 6502 Address bus functions. +// Move here out of Pi1541 to increase performance. +/////////////////////////////////////////////////////////////////////////////////////// +// In a 1541 address decoding and chip selects are performed by a 74LS42 ONE-OF-TEN DECODER +// 74LS42 Ouputs a low to the !CS based on the four inputs provided by address bits 10-13 +// 1800 !cs2 on pin 9 +// 1c00 !cs2 on pin 7 +u8 read6502(u16 address) +{ + u8 value; + if (address & 0x8000) // address line 15 selects the ROM + { + value = roms.Read(address); + } + else + { + // Address lines 15, 12, 11 and 10 are fed into a 74LS42 for decoding + u16 addressLines15_12_11_10 = (address & 0x1c00) >> 10; + addressLines15_12_11_10 |= (address & 0x8000) >> (15 - 3); + if (addressLines15_12_11_10 == 0 || addressLines15_12_11_10 == 1) value = s_u8Memory[address & 0x7ff]; // 74LS42 outputs low on pin 1 or pin 2 + else if (addressLines15_12_11_10 == 6) value = pi1541.VIA[0].Read(address); // 74LS42 outputs low on pin 7 + else if (addressLines15_12_11_10 == 7) value = pi1541.VIA[1].Read(address); // 74LS42 outputs low on pin 9 + else value = address >> 8; // Empty address bus + } + return value; +} + +// Allows a mode where we have RAM at all addresses other than the ROM and the VIAs. (Maybe useful to someone?) +u8 read6502ExtraRAM(u16 address) +{ + if (address & 0x8000) + { + return roms.Read(address); + } + else + { + u16 addressLines11And12 = address & 0x1800; + if (addressLines11And12 == 0x1800) return pi1541.VIA[(address & 0x400) != 0].Read(address); // address line 10 indicates what VIA to index + return s_u8Memory[address & 0x7fff]; + } +} + +// Use for debugging (Reads VIA registers without the regular VIA read side effects) +u8 peek6502(u16 address) +{ + u8 value; + if (address & 0x8000) // address line 15 selects the ROM + { + value = roms.Read(address); + } + else + { + // Address lines 15, 12, 11 and 10 are fed into a 74LS42 for decoding + u16 addressLines15_12_11_10 = (address & 0x1c00) >> 10; + addressLines15_12_11_10 |= (address & 0x8000) >> (15 - 3); + if (addressLines15_12_11_10 == 0 || addressLines15_12_11_10 == 1) value = s_u8Memory[address & 0x7ff]; // 74LS42 outputs low on pin 1 or pin 2 + else if (addressLines15_12_11_10 == 6) value = pi1541.VIA[0].Peek(address); // 74LS42 outputs low on pin 7 + else if (addressLines15_12_11_10 == 7) value = pi1541.VIA[1].Peek(address); // 74LS42 outputs low on pin 9 + else value = address >> 8; // Empty address bus + } + return value; +} + +void write6502(u16 address, const u8 value) +{ + if (address & 0x8000) return; // address line 15 selects the ROM + u16 addressLines15_12_11_10 = (address & 0x1c00) >> 10; + addressLines15_12_11_10 |= (address & 0x8000) >> (15 - 3); + if (addressLines15_12_11_10 == 0 || addressLines15_12_11_10 == 1) s_u8Memory[address & 0x7ff] = value; // 74LS42 outputs low on pin 1 or pin 2 + else if (addressLines15_12_11_10 == 6) pi1541.VIA[0].Write(address, value); // 74LS42 outputs low on pin 7 + else if (addressLines15_12_11_10 == 7) pi1541.VIA[1].Write(address, value); // 74LS42 outputs low on pin 9 +} + +void write6502ExtraRAM(u16 address, const u8 value) +{ + if (address & 0x8000) return; // address line 15 selects the ROM + u16 addressLines11And12 = address & 0x1800; + if (addressLines11And12 == 0) s_u8Memory[address & 0x7fff] = value; + else if (addressLines11And12 == 0x1800) pi1541.VIA[(address & 0x400) != 0].Write(address, value); // address line 10 indicates what VIA to index +} + +void InitialiseHardware() +{ +#if defined(RPI3) + RPI_GpioVirtInit(); + RPI_TouchInit(); +#endif + RPI_AuxMiniUartInit(115200, 8); + + screen.Open(1024, 768, 16); + + RPI_PropertyInit(); + RPI_PropertyAddTag(TAG_GET_MAX_CLOCK_RATE, ARM_CLK_ID); + RPI_PropertyProcess(); + + rpi_mailbox_property_t* mp; + u32 MaxClk = 0; + if ((mp = RPI_PropertyGet(TAG_GET_MAX_CLOCK_RATE))) + { + MaxClk = mp->data.buffer_32[1]; + } + RPI_PropertyInit(); + RPI_PropertyAddTag(TAG_SET_CLOCK_RATE, ARM_CLK_ID, MaxClk); + RPI_PropertyProcess(); +} + +//void UpdateUartControls(bool refreshStatusDisplay, bool LED, bool Motor, bool ATN, bool DATA, bool CLOCK, u32 Track, u32 romIndex) +//{ +// //InputMappings* inputMappings = InputMappings::Instance(); +// +// //if (emulating) +// // inputMappings->CheckUart(); +// +// if (refreshStatusDisplay && emulating) +// printf("\E[1ALED %s%d\E[0m Motor %d Track %0d.%d ATN %d DAT %d CLK %d %s\r\n", LED ? termainalTextRed : termainalTextNormal, LED, Motor, Track >> 1, Track & 1 ? 5 : 0, ATN, DATA, CLOCK, roms.ROMNames[romIndex]); +//} + +// This runs on core0 and frees up core1 to just run the emulator. +// Care must be taken not to crowd out the shared cache with core1 as this could slow down core1 so that it no longer can perform its duties in the 1us timings it requires. +void UpdateScreen() +{ + bool oldLED = false; + bool oldMotor = false; + bool oldATN = false; + bool oldDATA = false; + bool oldCLOCK = false; + + u32 oldTrack = 0; + u32 textColour = COLOUR_BLACK; + u32 bgColour = COLOUR_WHITE; + + RGBA dataColour = COLOUR_GREEN; + RGBA clockColour = COLOUR_CYAN; + RGBA atnColour = COLOUR_YELLOW; + RGBA BkColour = FileBrowser::Colour(VIC2_COLOUR_INDEX_BLUE); + + int height = 60; + int screenHeight = 768; + int screenWidthM1 = 1023; + int top, top2, top3; + int bottom; + int graphX = 0; + //bool refreshUartStatusDisplay; + + top = screenHeight - height / 2; + bottom = screenHeight - 1; + + top2 = top - (bottom - top); + top3 = top2 - (bottom - top); + + while (1) + { + bool value; + u32 y = STATUS_BAR_POSITION_Y; + + //RPI_UpdateTouch(); + //refreshUartStatusDisplay = false; + + value = pi1541.drive.IsLEDOn(); + if (value != oldLED) + { +// SetACTLed(value); + oldLED = value; + snprintf(tempBuffer, tempBufferSize, "%d", value); + screen.PrintText(false, 4 * 8, y, tempBuffer, value ? COLOUR_RED : textColour, bgColour); + //refreshUartStatusDisplay = true; + } + + value = pi1541.drive.IsMotorOn(); + if (value != oldMotor) + { + oldMotor = value; + snprintf(tempBuffer, tempBufferSize, "%d", value); + screen.PrintText(false, 12 * 8, y, tempBuffer, textColour, bgColour); + //refreshUartStatusDisplay = true; + } + + value = IEC_Bus::GetPI_Atn(); + if (graphIEC) + { + bottom = top2 - 2; + if (value ^ oldATN) + { + screen.DrawLineV(graphX, top3, bottom, atnColour); + } + else + { + screen.DrawLineV(graphX, top3, bottom, BkColour); + if (value) screen.PlotPixel(graphX, top3, atnColour); + else screen.PlotPixel(graphX, bottom, atnColour); + } + } + if (value != oldATN) + { + oldATN = value; + snprintf(tempBuffer, tempBufferSize, "%d", value); + screen.PrintText(false, 29 * 8, y, tempBuffer, textColour, bgColour); + //refreshUartStatusDisplay = true; + } + + value = IEC_Bus::GetPI_Data(); + if (graphIEC) + { + bottom = top - 2; + if (value ^ oldDATA) + { + screen.DrawLineV(graphX, top2, bottom, dataColour); + } + else + { + screen.DrawLineV(graphX, top2, bottom, BkColour); + if (value) screen.PlotPixel(graphX, top2, dataColour); + else screen.PlotPixel(graphX, bottom, dataColour); + } + } + if (value != oldDATA) + { + oldDATA = value; + snprintf(tempBuffer, tempBufferSize, "%d", value); + screen.PrintText(false, 35 * 8, y, tempBuffer, textColour, bgColour); + //refreshUartStatusDisplay = true; + } + + value = IEC_Bus::GetPI_Clock(); + if (graphIEC) + { + bottom = screenHeight - 1; + if (value ^ oldCLOCK) + { + screen.DrawLineV(graphX, top, bottom, clockColour); + } + else + { + screen.DrawLineV(graphX, top, bottom, BkColour); + if (value) screen.PlotPixel(graphX, top, clockColour); + else screen.PlotPixel(graphX, bottom, clockColour); + } + } + if (value != oldCLOCK) + { + oldCLOCK = value; + snprintf(tempBuffer, tempBufferSize, "%d", value); + screen.PrintText(false, 41 * 8, y, tempBuffer, textColour, bgColour); + //refreshUartStatusDisplay = true; + } + + if (graphX++ > screenWidthM1) graphX = 0; + + u32 track = pi1541.drive.Track(); + if (track != oldTrack) + { + oldTrack = track; + snprintf(tempBuffer, tempBufferSize, "%02d.%d", (oldTrack >> 1) + 1, oldTrack & 1 ? 5 : 0); + screen.PrintText(false, 20 * 8, y, tempBuffer, textColour, bgColour); + //refreshUartStatusDisplay = true; + } + + if (emulating) + { + //refreshUartStatusDisplay = + diskCaddy.Update(); + } + + //if (options.GetSupportUARTInput()) + // UpdateUartControls(refreshUartStatusDisplay, oldLED, oldMotor, oldATN, oldDATA, oldCLOCK, oldTrack, romIndex); + + // Go back to sleep. The USB irq will wake us up again. + __asm ("WFE"); + } +} + +bool BeginEmulating(FileBrowser* fileBrowser, const char* filenameForIcon) +{ + DiskImage* diskImage = diskCaddy.SelectFirstImage(); + if (diskImage) + { + pi1541.drive.Insert(diskImage); + fileBrowser->DisplayDiskInfo(diskImage, filenameForIcon); + fileBrowser->ShowDeviceAndROM(); + return true; + } + return false; +} + +static u32* dmaSound; + +struct DMA_ControlBlock +{ + u32 transferInformation; + u32* sourceAddress; + u32 destinationAddress; + u32 transferLength; + u32 stride; + DMA_ControlBlock* nextControlBlock; + u32 res0, res1; +} __attribute__((aligned(32))); + +DMA_ControlBlock dmaSoundCB = +{ + DMA_DEST_DREQ + DMA_PERMAP_5 + DMA_SRC_INC, + 0, + //0x7E000000 + PWM_BASE + PWM_FIF1 + 0x7E000000 + 0x20C000 + 0x18, + (u32)(Sample_bin_size * 4), + 0, + 0,//&dmaSoundCB, + 0, 0 +}; + +static void PlaySoundDMA() +{ + write32(PWM_DMAC, PWM_ENAB + 0x0001); + write32(DMA_ENABLE, 1); // DMA_EN0 + write32(DMA0_BASE + DMA_CONBLK_AD, (u32)&dmaSoundCB); + write32(DMA0_BASE + DMA_CS, DMA_ACTIVE); +} + +static void SetVIAsDeviceID(u8 id) +{ + if (id & 1) pi1541.VIA[0].GetPortB()->SetInput(VIAPORTPINS_DEVSEL0, true); + if (id & 2) pi1541.VIA[0].GetPortB()->SetInput(VIAPORTPINS_DEVSEL1, true); +} + +void emulator() +{ + bool oldLED = false; + unsigned ctBefore = 0; + unsigned ctAfter = 0; + Keyboard* keyboard = Keyboard::Instance(); + bool resetWhileEmulating = false; + bool selectedViaIECCommands = false; + InputMappings* inputMappings = InputMappings::Instance(); + FileBrowser* fileBrowser; + + roms.lastManualSelectedROMIndex = 0; + + diskCaddy.SetScreen(&screen); + fileBrowser = new FileBrowser(&diskCaddy, &roms, deviceID, displayPNGIcons); + fileBrowser->DisplayRoot(); + pi1541.Initialise(); + + emulating = false; + + while (1) + { + if (!emulating) + { + IEC_Bus::VIA = 0; + + roms.ResetCurrentROMIndex(); + fileBrowser->ClearScreen(); + IEC_Bus::Reset(); + + // Clearing the caddy now + // - will write back all changed/dirty/written to disk images now + // - TDOO: need to display the image names as they write back + // - pass in a call back function? + diskCaddy.Empty(); + + fileBrowserSelectedName = 0; + fileBrowser->ClearSelections(); + + // Go back to the root folder so you can load fb* again? + if ((resetWhileEmulating && onResetChangeToStartingFolder) || selectedViaIECCommands) fileBrowser->DisplayRoot(); // Go back to the root folder and display it. + else fileBrowser->RefeshDisplay(); // Just redisplay the current folder. + + resetWhileEmulating = false; + selectedViaIECCommands = false; + + inputMappings->Reset(); + + fileBrowser->ShowDeviceAndROM(); + + if (!disableSD2IECCommands) + { + m_IEC_Commands.SimulateIECBegin(); + + while (!emulating) + { + IEC_Commands::UpdateAction updateAction = m_IEC_Commands.SimulateIECUpdate(); + + switch (updateAction) + { + case IEC_Commands::RESET: + if (onResetChangeToStartingFolder) + fileBrowser->DisplayRoot(); + IEC_Bus::Reset(); + m_IEC_Commands.SimulateIECBegin(); + break; + case IEC_Commands::NONE: + { + //fileBrowser->AutoSelectTestImage(); + fileBrowser->UpdateInput(); + + // Check selections made via FileBrowser + if (fileBrowser->SelectionsMade()) + emulating = BeginEmulating(fileBrowser, fileBrowser->LastSelectionName()); + } + break; + case IEC_Commands::IMAGE_SELECTED: + { + // Check selections made via FileBrowser + + fileBrowserSelectedName = m_IEC_Commands.GetNameOfImageSelected(); + + if (DiskImage::IsLSTExtention(fileBrowserSelectedName)) + { + if (fileBrowser->SelectLST(fileBrowserSelectedName)) + { + emulating = BeginEmulating(fileBrowser, fileBrowserSelectedName); + } + else + { + m_IEC_Commands.Reset(); + fileBrowserSelectedName = 0; + } + } + else if (DiskImage::IsDiskImageExtention(fileBrowserSelectedName)) + { + const FILINFO* filInfoSelected = m_IEC_Commands.GetImageSelected(); + DEBUG_LOG("IEC mounting %s\r\n", filInfoSelected->fname); + bool readOnly = (filInfoSelected->fattrib & AM_RDO) != 0; + + if (diskCaddy.Insert(filInfoSelected, readOnly)) emulating = BeginEmulating(fileBrowser, filInfoSelected->fname); + else fileBrowserSelectedName = 0; + } + else + { + fileBrowserSelectedName = 0; + } + + if (fileBrowserSelectedName == 0) + m_IEC_Commands.Reset(); + + selectedViaIECCommands = true; + } + break; + case IEC_Commands::DIR_PUSHED: + fileBrowser->FolderChanged(); + break; + case IEC_Commands::POP_DIR: + fileBrowser->PopFolder(); + fileBrowser->RefeshDisplay(); + break; + case IEC_Commands::POP_TO_ROOT: + fileBrowser->DisplayRoot(); + break; + case IEC_Commands::REFRESH: + fileBrowser->FolderChanged(); + break; + case IEC_Commands::DEVICEID_CHANGED: + deviceID = m_IEC_Commands.GetDeviceId(); + fileBrowser->SetDeviceID(deviceID); + fileBrowser->ShowDeviceAndROM(); + SetVIAsDeviceID(deviceID); // Let the emilated VIA know + break; + default: + break; + } + } + } + else + { + while (!emulating) + { + if (keyboard->CheckChanged()) + { + fileBrowser->UpdateInput(); + if (fileBrowser->SelectionsMade()) + emulating = BeginEmulating(fileBrowser, fileBrowser->LastSelectionName()); + } + } + } + } + else + { + int cycleCount = 0; + unsigned caddyIndex; + int headSoundCounter = 0; + int headSoundFreqCounter = 0; + //const int headSoundFreq = 3333; // 300Hz = 1/300 * 10^6; + //const int headSoundFreq = 1666; // 600Hz = 1/600 * 10^6; + const int headSoundFreq = 833; // 1200Hz = 1/1200 * 10^6; + unsigned char oldHeadDir; + + unsigned numberOfImages = diskCaddy.GetNumberOfImages(); + unsigned numberOfImagesMax = numberOfImages; + if (numberOfImagesMax > 10) + numberOfImagesMax = 10; + + diskCaddy.Display(); + + inputMappings->directDiskSwapRequest = 0; + + DataBusReadFn dataBusRead = extraRAM ? read6502ExtraRAM : read6502; + DataBusWriteFn dataBusWrite = extraRAM ? write6502ExtraRAM : write6502; + pi1541.m6502.SetBusFunctions(dataBusRead, dataBusWrite); + + IEC_Bus::VIA = &pi1541.VIA[0]; + pi1541.Reset(); // will call IEC_Bus::Reset(); + + ctBefore = read32(ARM_SYSTIMER_CLO); + + while (1) + { + IEC_Bus::Read(); + + if (pi1541.m6502.SYNC()) // About to start a new instruction. + { + u16 pc = pi1541.m6502.GetPC(); + // See if the emulated cpu is executing CD:_ (ie back out of emulated image) + if (snoopIndex == 0 && (pc == SNOOP_CD_CBM || pc == SNOOP_CD_JIFFY_BOTH || pc == SNOOP_CD_JIFFY_DRIVEONLY)) snoopPC = pc; + + if (pc == snoopPC) + { + u8 a = pi1541.m6502.GetA(); + if (a == snoopBackCommand[snoopIndex]) + { + snoopIndex++; + if (snoopIndex == sizeof(snoopBackCommand)) + { + // Exit full emulation back to IEC commands level simulation. + snoopIndex = 0; + emulating = false; + IEC_Bus::Reset(); // TO CHECK - remove this + break; + } + } + else + { + snoopIndex = 0; + snoopPC = 0; + } + } + } + + pi1541.m6502.Step(); // If the CPU reads or writes to the VIA then clk and data can change + + if (cycleCount >= FAST_BOOT_CYCLES) // cycleCount is used so we can quickly get through 1541's self test code. This will make the emulated 1541 responsive to commands asap. During this time we don't need to set outputs. + { + //To artificialy delay the outputs later into the phi2's cycle (do this on future Pis that will be faster and perhaps too fast) + //read32(ARM_SYSTIMER_CLO); //Each one of these is > 100ns + //read32(ARM_SYSTIMER_CLO); + //read32(ARM_SYSTIMER_CLO); + + IEC_Bus::OutputLED = pi1541.drive.IsLEDOn(); + if (IEC_Bus::OutputLED ^ oldLED) + { + SetACTLed(IEC_Bus::OutputLED); + oldLED = IEC_Bus::OutputLED; + } + + // Do head moving sound + unsigned char headDir = pi1541.drive.GetLastHeadDirection(); + if (headDir ^ oldHeadDir) // Need to start a new sound? + { + oldHeadDir = headDir; + if (soundOnGPIO) + { + headSoundCounter = 1000000; + headSoundFreqCounter = headSoundFreq; + } + else + { + PlaySoundDMA(); + } + } + + if (soundOnGPIO && headSoundCounter > 0) + { + headSoundFreqCounter--; // Continue updating a GPIO non DMA sound. + if (headSoundFreqCounter <= 0) + { + headSoundFreqCounter = headSoundFreq; + headSoundCounter -= headSoundFreq * 8; + IEC_Bus::OutputSound = !IEC_Bus::OutputSound; + } + } + + IEC_Bus::RefreshOuts(); // Now output all outputs. + } + + // We have now output so HERE is where the next phi2 cycle starts. + pi1541.Update(); + + // Other core will check the uart (as it is slow) (could enable uart irqs - will they execute on this core?) + inputMappings->CheckKeyboardEmulationMode(numberOfImages, numberOfImagesMax); + inputMappings->CheckButtonsEmulationMode(); + + bool exitEmulation = inputMappings->Exit(); + bool nextDisk = inputMappings->NextDisk(); + bool prevDisk = inputMappings->PrevDisk(); + + if (exitEmulation) + { + emulating = false; + break; + } + else if (nextDisk) + { + pi1541.drive.Insert(diskCaddy.PrevDisk()); + } + else if (prevDisk) + { + pi1541.drive.Insert(diskCaddy.NextDisk()); + } + else if (numberOfImages > 1 && inputMappings->directDiskSwapRequest != 0) + { + for (caddyIndex = 0; caddyIndex < numberOfImagesMax; ++caddyIndex) + { + if (inputMappings->directDiskSwapRequest & (1 << caddyIndex)) + { + DiskImage* diskImage = diskCaddy.SelectImage(caddyIndex); + if (diskImage && diskImage != pi1541.drive.GetDiskImage()) + { + pi1541.drive.Insert(diskImage); + break; + } + } + } + inputMappings->directDiskSwapRequest = 0; + } + + bool reset = IEC_Bus::IsReset(); + if (reset) + { + IEC_Bus::WaitUntilReset(); + //DEBUG_LOG("6502 resetting\r\n"); + if (onResetChangeToStartingFolder || selectedViaIECCommands) + fileBrowser->DisplayRoot();//m_IEC_Commands.ChangeToRoot(); // TO CHECK + emulating = false; + resetWhileEmulating = true; + break; + + } + + if (cycleCount < FAST_BOOT_CYCLES) // cycleCount is used so we can quickly get through 1541's self test code. This will make the emulated 1541 responsive to commands asap. + { + cycleCount++; + ctAfter = read32(ARM_SYSTIMER_CLO); + } + else + { + do // Sync to the 1MHz clock + { + ctAfter = read32(ARM_SYSTIMER_CLO); + unsigned ct = ctAfter - ctBefore; + if (ct > 1) + { + // If this ever occurs then we have taken too long (ie >1us) and lost a cycle. + // Cycle accuracy is now in jeopardy. If this occurs during critical communication loops then emulation can fail! + //DEBUG_LOG("!"); + } + } + while (ctAfter == ctBefore); + } + ctBefore = ctAfter; + } + } + } + delete fileBrowser; +} + +//static void MouseHandler(unsigned nButtons, +// int nDisplacementX, // -127..127 +// int nDisplacementY) // -127..127 +//{ +// DEBUG_LOG("Mouse: %x %d %d\r\n", nButtons, nDisplacementX, nDisplacementY); +//} + +#ifdef HAS_MULTICORE +extern "C" +{ + void run_core() + { + enable_MMU_and_IDCaches(); + _enable_unaligned_access(); + + DEBUG_LOG("emulator running on core %d\r\n", _get_core()); + emulator(); + } +} +static void start_core(int core, func_ptr func) +{ + write32(0x4000008C + 0x10 * core, (unsigned int)func); + __asm ("SEV"); // and wake it up. +} +#endif + +static bool AttemptToLoadROM(char* ROMName) +{ + FIL fp; + FRESULT res; + + res = f_open(&fp, ROMName, FA_READ); + if (res == FR_OK) + { + u32 bytesRead; + SetACTLed(true); + f_read(&fp, roms.ROMImages[0], ROMs::ROM_SIZE, &bytesRead); + strncpy(roms.ROMNames[0], ROMName, 255); + roms.ROMValid[0] = true; + SetACTLed(false); + f_close(&fp); + DEBUG_LOG("Opened ROM %s %d %d %d\r\n", ROMName, ROMs::ROM_SIZE, bytesRead, bytesRead == ROMs::ROM_SIZE); + return true; + } + else + { + roms.ROMValid[0] = false; + DEBUG_LOG("COULD NOT OPEN ROM FILE;- %s!\r\n", ROMName); + return false; + } +} + +static void DisplayLogo() +{ + int w; + int h; + int channels_in_file; + stbi_uc* image = stbi_load_from_memory((stbi_uc const*)I__logo_png, I__logo_png_size, &w, &h, &channels_in_file, 0); + + screen.PlotImage((u32*)image, 0, 0, w, h); + + if (versionMinor < 10) snprintf(tempBuffer, tempBufferSize, "V%d.0%d", versionMajor, versionMinor); + else snprintf(tempBuffer, tempBufferSize, "V%d.%d", versionMajor, versionMinor); + screen.PrintText(false, 700, 120, tempBuffer, FileBrowser::Colour(VIC2_COLOUR_INDEX_BLUE)); +} + +static void LoadOptions() +{ + FIL fp; + FRESULT res; + u32 widthText, heightText; + u32 widthScreen = screen.Width(); + u32 heightScreen = screen.Height(); + u32 xpos, ypos; + + res = f_open(&fp, "options.txt", FA_READ); + if (res == FR_OK) + { + u32 bytesRead; + SetACTLed(true); + f_read(&fp, tempBuffer, tempBufferSize, &bytesRead); + SetACTLed(false); + f_close(&fp); + + Options options; + + options.Process((char*)tempBuffer); + + deviceID = (u8)options.GetDeviceID(); + DEBUG_LOG("DeviceID = %d\r\n", deviceID); + + onResetChangeToStartingFolder = options.GetOnResetChangeToStartingFolder() != 0; + DEBUG_LOG("onResetChangeToStartingFolder = %d\r\n", onResetChangeToStartingFolder); + + extraRAM = options.GetExtraRAM() != 0; + DEBUG_LOG("extraRAM = %d\r\n", extraRAM); + + disableSD2IECCommands = options.GetDisableSD2IECCommands(); + //supportUARTInput = options.GetSupportUARTInput() != 0; + graphIEC = options.GraphIEC(); + + quickBoot = options.QuickBoot(); + + displayPNGIcons = options.DisplayPNGIcons(); + soundOnGPIO = options.SoundOnGPIO(); + invertIECInputs = options.InvertIECInputs(); + splitIECLines = options.SplitIECLines(); + if (!splitIECLines) + invertIECInputs = false; + + int ROMIndex; + + for (ROMIndex = ROMs::MAX_ROMS - 1; ROMIndex >= 0; --ROMIndex) + { + roms.ROMValid[ROMIndex] = false; + const char* ROMName = options.GetRomName(ROMIndex); + if (ROMName[ROMIndex]) + { + //DEBUG_LOG("%d Rom Name = %s\r\n", ROMIndex, ROMName); + res = f_open(&fp, ROMName, FA_READ); + if (res == FR_OK) + { + u32 bytesRead; + + screen.Clear(COLOUR_BLACK); + snprintf(tempBuffer, tempBufferSize, "Loading ROM %s\r\n", ROMName); + screen.MeasureText(false, tempBuffer, &widthText, &heightText); + xpos = (widthScreen - widthText) >> 1; + ypos = (heightScreen - heightText) >> 1; + screen.PrintText(false, xpos, ypos, tempBuffer, COLOUR_WHITE, COLOUR_RED); + + SetACTLed(true); + res = f_read(&fp, roms.ROMImages[ROMIndex], ROMs::ROM_SIZE, &bytesRead); + SetACTLed(false); + if (res == FR_OK && bytesRead == ROMs::ROM_SIZE) + { + strncpy(roms.ROMNames[ROMIndex], ROMName, 255); + roms.ROMValid[ROMIndex] = true; + } + f_close(&fp); + //DEBUG_LOG("Read ROM %s from options\r\n", ROMName); + } + } + } + + if (roms.ROMValid[0] == false && !(AttemptToLoadROM("d1541.rom") || AttemptToLoadROM("dos1541") || AttemptToLoadROM("d1541II") || AttemptToLoadROM("Jiffy.bin"))) + { + snprintf(tempBuffer, tempBufferSize, "No ROM file found!\r\nPlease copy a valid 1541 ROM file in the root folder of the SD card.\r\nThe file needs to be called 'dos1541'."); + screen.MeasureText(false, tempBuffer, &widthText, &heightText); + xpos = (widthScreen - widthText) >> 1; + ypos = (heightScreen - heightText) >> 1; + do + { + screen.Clear(COLOUR_RED); + IEC_Bus::WaitMicroSeconds(20000); + screen.PrintText(false, xpos, ypos, tempBuffer, COLOUR_WHITE, COLOUR_RED); + IEC_Bus::WaitMicroSeconds(100000); + } + while (1); + } + } +} + +extern "C" +{ + void kernel_main(unsigned int r0, unsigned int r1, unsigned int atags) + { + FATFS fileSystem; + + InitialiseHardware(); + enable_MMU_and_IDCaches(); + _enable_unaligned_access(); + disk_setEMM(&m_EMMC); + m_EMMC.Initialize(); + + write32(ARM_GPIO_GPCLR0, 0xFFFFFFFF); + + f_mount(&fileSystem, "", 1); + + DisplayLogo(); + snprintf(tempBuffer, tempBufferSize, "Copyright(C) 2018 Stephen White"); + screen.PrintText(false, 0, 200, tempBuffer, COLOUR_WHITE, COLOUR_BLACK); + snprintf(tempBuffer, tempBufferSize, "This program comes with ABSOLUTELY NO WARRANTY."); + screen.PrintText(false, 0, 216, tempBuffer, COLOUR_WHITE, COLOUR_BLACK); + snprintf(tempBuffer, tempBufferSize, "This is free software, and you are welcome to redistribute it."); + screen.PrintText(false, 0, 232, tempBuffer, COLOUR_WHITE, COLOUR_BLACK); + + if (!quickBoot) + IEC_Bus::WaitMicroSeconds(3 * 1000000); + + InterruptSystemInitialize(); + TimerSystemInitialize(); + + USPiInitialize(); + + if (!USPiKeyboardAvailable()) + DEBUG_LOG("Keyboard not found\r\n"); + else + DEBUG_LOG("Keyboard found\r\n"); + + //if (!USPiMouseAvailable()) + // DEBUG_LOG("Mouse not found\r\n"); + //else + // DEBUG_LOG("Mouse found\r\n"); + + Keyboard::Instance(); + InputMappings::Instance(); + //USPiMouseRegisterStatusHandler(MouseHandler); + + onResetChangeToStartingFolder = false; + + LoadOptions(); + + IEC_Bus::SetSplitIECLines(splitIECLines); + IEC_Bus::SetInvertIECInputs(invertIECInputs); + + if (!soundOnGPIO) + { + dmaSound = (u32*)malloc(Sample_bin_size * 4); + for (int i = 0; i < Sample_bin_size; ++i) + { + dmaSound[i] = Sample_bin[i]; + } + dmaSoundCB.sourceAddress = dmaSound; + //PlaySoundDMA(); + } + + f_chdir("/1541"); + + m_IEC_Commands.SetDeviceId(deviceID); + SetVIAsDeviceID(deviceID); + + pi1541.drive.SetVIA(&pi1541.VIA[1]); + pi1541.VIA[0].GetPortB()->SetPortOut(0, IEC_Bus::PortB_OnPortOut); + + IEC_Bus::Initialise(); + +#ifdef HAS_MULTICORE + start_core(3, _spin_core); + start_core(2, _spin_core); +#ifdef USE_MULTICORE + start_core(1, _init_core); + UpdateScreen(); // core0 now loops here where it will handle interrupts and passively update the screen. + while (1); +#else + start_core(1, _spin_core); +#endif +#endif +#ifndef USE_MULTICORE + emulator(); // If only one core the emulator runs on it now. +#endif + } +} + + +// Del everything in the Z:\MonCog\Builds folder +// Build a WegGL build into Z:\MonCog\Builds +// open cmd +// cd Z:\MonCog\firebase +// firebase init +// Y +// Hosting etc +// type "public" +// N +// overwrite 404 - N +// overwrite index - N +// Copy over new files +// firebase deploy + +// Eject delays +// Remove asm commeted code from IEC_Bus +// TO CHECKs +// types +// TDOO: need to display the image names as they write back \ No newline at end of file diff --git a/options.cpp b/options.cpp new file mode 100644 index 0000000..3e91583 --- /dev/null +++ b/options.cpp @@ -0,0 +1,300 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#include "options.h" +#include +#include +#include + +#define INVALID_VALUE ((unsigned) -1) + +char* TextParser::GetToken(bool includeSpace) +{ + bool isSpace; + + do + { + } while (ParseComment()); + + while (*data != '\0') + { + isSpace = isspace(*data); + + if (!isSpace || (includeSpace && isSpace)) + break; + + data++; + } + + if (*data == '\0') + return 0; + + char* pToken = data; + + while (*data != '\0') + { + isSpace = isspace(*data); + + if ((!includeSpace && isSpace) || (*data == '\n') || (*data == '\r')) + { + *data++ = '\0'; + break; + } + data++; + } + + return pToken; +} + +void TextParser::SkipWhiteSpace() +{ + while (*data != '\0') + { + if (!isspace(*data)) + break; + + data++; + } +} + +bool TextParser::ParseComment() +{ + SkipWhiteSpace(); + + if (*data == '\0') + return 0; + + if (data[0] != '/') + return false; + + if (data[1] == '/') + { + // One line comment + data += 2; + + while (*data) + { + if (*data == '\n') + break; + + data++; + } + SkipWhiteSpace(); + return true; + } + else if (data[1] == '*') + { + // Multiline comment + data += 2; + + while (*data) + { + if (*data++ == '*' && *data && *data == '/') + { + data++; + break; + } + } + SkipWhiteSpace(); + return true; + } + return false; +} + + +Options::Options(void) + : TextParser() + , deviceID(8) + , onResetChangeToStartingFolder(0) + , extraRAM(0) + , disableSD2IECCommands(0) + , supportUARTInput(0) + , graphIEC(0) + , quickBoot(0) + , displayPNGIcons(0) + , soundOnGPIO(0) + , invertIECInputs(0) + , splitIECLines(0) +{ + ROMName[0] = 0; + ROMNameSlot2[0] = 0; + ROMNameSlot3[0] = 0; + ROMNameSlot4[0] = 0; + ROMNameSlot5[0] = 0; + ROMNameSlot6[0] = 0; + ROMNameSlot7[0] = 0; + ROMNameSlot8[0] = 0; +} + +void Options::Process(char* buffer) +{ + SetData(buffer); + + char* pOption; + while ((pOption = GetToken()) != 0) + { + /*char* equals = */GetToken(); + char* pValue = GetToken(); + + if (strcasecmp(pOption, "deviceID") == 0) + { + unsigned nValue = 0; + if ((nValue = GetDecimal(pValue)) != INVALID_VALUE) + deviceID = nValue; + } + else if (strcasecmp(pOption, "OnResetChangeToStartingFolder") == 0) + { + unsigned nValue = 0; + if ((nValue = GetDecimal(pValue)) != INVALID_VALUE) + onResetChangeToStartingFolder = nValue; + } + else if (strcasecmp(pOption, "ExtraRAM") == 0) + { + unsigned nValue = 0; + if ((nValue = GetDecimal(pValue)) != INVALID_VALUE) + extraRAM = nValue; + } + else if (strcasecmp(pOption, "DisableSD2IECCommands") == 0) + { + unsigned nValue = 0; + if ((nValue = GetDecimal(pValue)) != INVALID_VALUE) + disableSD2IECCommands = nValue; + } + else if (strcasecmp(pOption, "SupportUARTInput") == 0) + { + unsigned nValue = 0; + if ((nValue = GetDecimal(pValue)) != INVALID_VALUE) + supportUARTInput = nValue; + } + else if (strcasecmp(pOption, "GraphIEC") == 0) + { + unsigned nValue = 0; + if ((nValue = GetDecimal(pValue)) != INVALID_VALUE) + graphIEC = nValue; + } + else if (strcasecmp(pOption, "QuickBoot") == 0) + { + unsigned nValue = 0; + if ((nValue = GetDecimal(pValue)) != INVALID_VALUE) + quickBoot = nValue; + } + else if (strcasecmp(pOption, "DisplayPNGIcons") == 0) + { + unsigned nValue = 0; + if ((nValue = GetDecimal(pValue)) != INVALID_VALUE) + displayPNGIcons = nValue; + } + else if (strcasecmp(pOption, "soundOnGPIO") == 0) + { + unsigned nValue = 0; + if ((nValue = GetDecimal(pValue)) != INVALID_VALUE) + soundOnGPIO = nValue; + } + else if (strcasecmp(pOption, "invertIECInputs") == 0) + { + unsigned nValue = 0; + if ((nValue = GetDecimal(pValue)) != INVALID_VALUE) + invertIECInputs = nValue; + } + else if (strcasecmp(pOption, "splitIECLines") == 0) + { + unsigned nValue = 0; + if ((nValue = GetDecimal(pValue)) != INVALID_VALUE) + splitIECLines = nValue; + } + else if ((strcasecmp(pOption, "ROM") == 0) || (strcasecmp(pOption, "ROM1") == 0)) + { + strncpy(ROMName, pValue, 255); + } + else if (strcasecmp(pOption, "ROM2") == 0) + { + strncpy(ROMNameSlot2, pValue, 255); + } + else if (strcasecmp(pOption, "ROM3") == 0) + { + strncpy(ROMNameSlot3, pValue, 255); + } + else if (strcasecmp(pOption, "ROM4") == 0) + { + strncpy(ROMNameSlot4, pValue, 255); + } + else if (strcasecmp(pOption, "ROM5") == 0) + { + strncpy(ROMNameSlot5, pValue, 255); + } + else if (strcasecmp(pOption, "ROM6") == 0) + { + strncpy(ROMNameSlot6, pValue, 255); + } + else if (strcasecmp(pOption, "ROM7") == 0) + { + strncpy(ROMNameSlot7, pValue, 255); + } + else if (strcasecmp(pOption, "ROM8") == 0) + { + strncpy(ROMNameSlot8, pValue, 255); + } + } +} + +unsigned Options::GetDecimal(char* pString) +{ + if (pString == 0 || *pString == '\0') + return INVALID_VALUE; + + unsigned nResult = 0; + + char chChar = *pString++; + while (chChar != '\0' && chChar != 13) + { + if (!('0' <= chChar && chChar <= '9')) + return INVALID_VALUE; + + unsigned nPrevResult = nResult; + + nResult = nResult * 10 + (chChar - '0'); + if (nResult < nPrevResult || nResult == INVALID_VALUE) + return INVALID_VALUE; + + chChar = *pString++; + } + + return nResult; +} + +const char* Options::GetRomName(int index) const +{ + switch (index) + { + case 1: + return ROMNameSlot2; + case 2: + return ROMNameSlot3; + case 3: + return ROMNameSlot4; + case 4: + return ROMNameSlot5; + case 5: + return ROMNameSlot6; + case 6: + return ROMNameSlot7; + case 7: + return ROMNameSlot8; + } + return ROMName; +} diff --git a/options.h b/options.h new file mode 100644 index 0000000..6234c2d --- /dev/null +++ b/options.h @@ -0,0 +1,85 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef OPTIONS_H +#define OPTIONS_H + +class TextParser +{ +public: + TextParser(void) + : data(0) + { + } + + void SetData(char* buffer) { data = buffer; } + + char* GetToken(bool includeSpace = false); + +protected: + char* data; + bool ParseComment(); + void SkipWhiteSpace(); +}; + +class Options : public TextParser +{ +public: + Options(void); + + void Process(char* buffer); + + unsigned int GetDeviceID() const { return deviceID; } + unsigned int GetOnResetChangeToStartingFolder() const { return onResetChangeToStartingFolder; } + const char* GetRomName(int index) const; + unsigned int GetExtraRAM() const { return extraRAM; } + unsigned int GetDisableSD2IECCommands() const { return disableSD2IECCommands; } + unsigned int GetSupportUARTInput() const { return supportUARTInput; } + + unsigned int GraphIEC() const { return graphIEC; } + unsigned int QuickBoot() const { return quickBoot; } + unsigned int DisplayPNGIcons() const { return displayPNGIcons; } + unsigned int SoundOnGPIO() const { return soundOnGPIO; } + unsigned int SplitIECLines() const { return splitIECLines; } + unsigned int InvertIECInputs() const { return invertIECInputs; } + + static unsigned GetDecimal(char* pString); + +private: + unsigned int deviceID; + unsigned int onResetChangeToStartingFolder; + unsigned int extraRAM; + unsigned int disableSD2IECCommands; + unsigned int supportUARTInput; + unsigned int graphIEC; + unsigned int quickBoot; + unsigned int displayPNGIcons; + unsigned int soundOnGPIO; + unsigned int invertIECInputs; + unsigned int splitIECLines; + + char ROMName[256]; + char ROMNameSlot2[256]; + char ROMNameSlot3[256]; + char ROMNameSlot4[256]; + char ROMNameSlot5[256]; + char ROMNameSlot6[256]; + char ROMNameSlot7[256]; + char ROMNameSlot8[256]; +}; +#endif diff --git a/prot.cpp b/prot.cpp new file mode 100644 index 0000000..9e59265 --- /dev/null +++ b/prot.cpp @@ -0,0 +1,190 @@ +/* + * Protection handlers for MNIB + * Copyright 2004-2005 Pete Rittwage + */ + +#include +#include +#include +#include "gcr.h" +#include "prot.h" + +void +shift_buffer(BYTE * buffer, int length, int n) +{ + int i; + BYTE tempbuf[NIB_TRACK_LENGTH]; + BYTE carry; + int carryshift; + + carryshift = 8 - n; + memcpy(tempbuf, buffer, length); + + // shift buffer right by n bits + carry = tempbuf[length - 1]; + for (i = 0; i < length; i++) + { + buffer[i] = (tempbuf[i] >> n) | (carry << carryshift); + carry = tempbuf[i]; + } +} + +BYTE * +align_vmax(BYTE * work_buffer, int tracklen) +{ + BYTE *pos, *buffer_end, *start_pos; + int run; + + run = 0; + pos = work_buffer; + start_pos = work_buffer; + buffer_end = work_buffer + tracklen; + + /* Try to find V-MAX track marker bytes + 0x4b (cinemaware track 20) + 0xa5 (cinemaware other tracks) + 0x5a (misc) + 0x49 (misc) + */ + + while (pos < buffer_end) + { + // duplicator's markers + if ((*pos == 0x4b) || (*pos == 0x5a) || (*pos == 0x49) || (*pos == 0xa5)) + { + if(!run) start_pos = pos; // mark first byte + if (run > 5) return (start_pos); // assume this is it + run++; + } + else + run = 0; + + pos++; + } + + return (0); +} + +// Line up the track cycle to the start of the longest gap mark +// this helps some custom protection tracks master properly +BYTE * +auto_gap(BYTE * work_buffer, int tracklen) +{ + BYTE *pos, *buffer_end, *key_temp, *key; + int run, longest; + + run = 0; + longest = 0; + pos = work_buffer; + buffer_end = work_buffer + tracklen; + key = key_temp = NULL; + + /* try to find longest good gcr run */ + while (pos < buffer_end - 2) + { + if (*pos == *(pos + 1)) // && (*pos != 0x00 )) + { + key_temp = pos + 2; + run++; + } + else + { + if (run > longest) + { + key = key_temp; + longest = run; + //gapbyte = *pos; + } + run = 0; + } + pos++; + } + + /* last 5 bytes of gap */ + // printf("gapbyte: %x, len: %d\n",gapbyte,longest); + if(key >= work_buffer + 5) + return(key - 5); + else + return(key); +} + +// The idea behind this is that weak bits commonly occur +// at the ends of tracks when they were mastered. +// we can line up the track cycle to this +// in lieu of no other hints +BYTE * +find_weak_gap(BYTE * work_buffer, int tracklen) +{ + BYTE *pos, *buffer_end, *key_temp, *key; + int run, longest; + + run = 0; + longest = 0; + pos = work_buffer; + buffer_end = work_buffer + tracklen; + key = key_temp = NULL; + + /* try to find longest bad gcr run */ + while (pos < buffer_end) + { + if (is_bad_gcr(work_buffer, buffer_end - work_buffer, + pos - work_buffer)) + { + // mark next GCR byte + key_temp = pos + 1; + run++; + } + else + { + if (run > longest) + { + key = key_temp; + longest = run; + } + run = 0; + } + pos++; + } + + /* first byte after bad run */ + return (key); +} + +// Line up the track cycle to the start of the longest sync mark +// this helps some custom protection tracks master properly +BYTE * +find_long_sync(BYTE * work_buffer, int tracklen) +{ + BYTE *pos, *buffer_end, *key_temp, *key; + int run, longest; + + run = 0; + longest = 0; + pos = work_buffer; + buffer_end = work_buffer + tracklen; + key = key_temp = NULL; + + /* try to find longest sync run */ + while (pos < buffer_end) + { + if (*pos == 0xff) + { + if (run == 0) + key_temp = pos; + run++; + } + else + { + if (run > longest) + { + key = key_temp; + longest = run; + } + run = 0; + } + pos++; + } + + /* first byte of longest sync run */ + return (key); +} diff --git a/prot.h b/prot.h new file mode 100644 index 0000000..a81c91f --- /dev/null +++ b/prot.h @@ -0,0 +1,8 @@ +/* prot.h */ +void shift_buffer(BYTE * buffer, int length, int n); +BYTE *align_vmax(BYTE * work_buffer, int track_len); +BYTE *auto_gap(BYTE * work_buffer, int track_len); +BYTE *find_weak_gap(BYTE * work_buffer, int tracklen); +BYTE *find_long_sync(BYTE * work_buffer, int tracklen); +BYTE *auto_gap(BYTE * work_buffer, int tracklen); + diff --git a/rpi-aux.c b/rpi-aux.c new file mode 100644 index 0000000..95ef0be --- /dev/null +++ b/rpi-aux.c @@ -0,0 +1,213 @@ +#include +#include "rpi-aux.h" +#include "rpi-base.h" +#include "rpi-gpio.h" +#include "startup.h" +#include "stdlib.h" + +#include "rpiHardware.h" + +#ifdef INCLUDE_DEBUGGER +#include "debugger/debugger.h" +#endif + +/* Define the system clock frequency in MHz for the baud rate calculation. + This is clearly defined on the BCM2835 datasheet errata page: + http://elinux.org/BCM2835_datasheet_errata */ +#define FALLBACK_SYS_FREQ 250000000 + +//#define USE_IRQ + +#define TX_BUFFER_SIZE 65536 // Must be a power of 2 + +static aux_t* auxillary = (aux_t*) AUX_BASE; + +aux_t* RPI_GetAux(void) +{ + return auxillary; +} + +#if defined(USE_IRQ) + +#include "rpi-interrupts.h" + +// Note, at the point the MiniUART is initialized, low vectors are in use +#define IRQ_VECTOR 0x38 + +static char *tx_buffer; +static volatile int tx_head; +static volatile int tx_tail; + +static void __attribute__((interrupt("IRQ"))) RPI_AuxMiniUartIRQHandler() { + + _data_memory_barrier(); + + while (1) { + + int iir = auxillary->MU_IIR; + + if (iir & AUX_MUIIR_INT_NOT_PENDING) { + /* No more interrupts */ + break; + } + + /* Handle RxReady interrupt */ + if (iir & AUX_MUIIR_INT_IS_RX) { +#ifdef INCLUDE_DEBUGGER + /* Forward all received characters to the debugger */ + debugger_rx_char(auxillary->MU_IO & 0xFF); +#else + /* Else just exho characters */ + RPI_AuxMiniUartWrite(auxillary->MU_IO & 0xFF); +#endif + } + + /* Handle TxEmpty interrupt */ + if (iir & AUX_MUIIR_INT_IS_TX) { + if (tx_tail != tx_head) { + /* Transmit the character */ + tx_tail = (tx_tail + 1) & (TX_BUFFER_SIZE - 1); + auxillary->MU_IO = tx_buffer[tx_tail]; + } else { + /* Disable TxEmpty interrupt */ + auxillary->MU_IER &= ~AUX_MUIER_TX_INT; + } + } + } + + _data_memory_barrier(); +} +#endif + +void RPI_AuxMiniUartInit(int baud, int bits) +{ + volatile int i; + + // Data memory barrier need to be places between accesses to different peripherals + // + // See page 7 of the BCM2853 manual + + _data_memory_barrier(); + + int sys_freq = get_clock_rate(CORE_CLK_ID); + + if (!sys_freq) { + sys_freq = FALLBACK_SYS_FREQ; + } + + _data_memory_barrier(); + + /* Setup GPIO 14 and 15 as alternative function 5 which is + UART 1 TXD/RXD. These need to be set before enabling the UART */ + RPI_SetGpioPinFunction(RPI_GPIO14, FS_ALT5); + RPI_SetGpioPinFunction(RPI_GPIO15, FS_ALT5); + + _data_memory_barrier(); + + // Enable weak pullups + RPI_GpioBase->GPPUD = 2; + // Note: the delay values are important, with 150 the receiver did not work! + for (i = 0; i < 1000; i++) + { + } + RPI_GpioBase->GPPUDCLK0 = (1 << 14) | (1 << 15); + // Note: the delay values are important, with 150 the receiver did not work! + for (i = 0; i < 1000; i++) + { + } + RPI_GpioBase->GPPUD = 2; + RPI_GpioBase->GPPUDCLK0 = 0; + + _data_memory_barrier(); + + /* As this is a mini uart the configuration is complete! Now just + enable the uart. Note from the documentation in section 2.1.1 of + the ARM peripherals manual: + + If the enable bits are clear you will have no access to a + peripheral. You can not even read or write the registers */ + auxillary->ENABLES = AUX_ENA_MINIUART; + + _data_memory_barrier(); + + /* Disable flow control,enable transmitter and receiver! */ + auxillary->MU_CNTL = 0; + + /* Decide between seven or eight-bit mode */ + if (bits == 8) + auxillary->MU_LCR = AUX_MULCR_8BIT_MODE; + else + auxillary->MU_LCR = 0; + + auxillary->MU_MCR = 0; + + /* Disable all interrupts from MU and clear the fifos */ + auxillary->MU_IER = 0; + auxillary->MU_IIR = 0xC6; + + /* Transposed calculation from Section 2.2.1 of the ARM peripherals manual */ + auxillary->MU_BAUD = ( sys_freq / (8 * baud)) - 1; + +#ifdef USE_IRQ + tx_buffer = malloc(TX_BUFFER_SIZE); + tx_head = tx_tail = 0; + *((uint32_t *) IRQ_VECTOR) = (uint32_t) RPI_AuxMiniUartIRQHandler; + _data_memory_barrier(); + RPI_GetIrqController()->Enable_IRQs_1 = (1 << 29); + _data_memory_barrier(); + auxillary->MU_IER |= AUX_MUIER_RX_INT; +#endif + + _data_memory_barrier(); + + /* Disable flow control,enable transmitter and receiver! */ + auxillary->MU_CNTL = AUX_MUCNTL_TX_ENABLE | AUX_MUCNTL_RX_ENABLE; + + _data_memory_barrier(); + +} + +void RPI_AuxMiniUartWrite(char c) +{ +#ifdef USE_IRQ + int tmp_head = (tx_head + 1) & (TX_BUFFER_SIZE - 1); + + /* Test if the buffer is full */ + if (tmp_head == tx_tail) { + int cpsr = _get_cpsr(); + if (cpsr & 0x80) { + /* IRQ disabled: drop the character to avoid deadlock */ + return; + } else { + /* IRQ enabled: wait for space in buffer */ + while (tmp_head == tx_tail) { + } + } + } + /* Buffer the character */ + tx_buffer[tmp_head] = c; + tx_head = tmp_head; + + _data_memory_barrier(); + + /* Enable TxEmpty interrupt */ + auxillary->MU_IER |= AUX_MUIER_TX_INT; + + _data_memory_barrier(); + +#else + /* Wait until the UART has an empty space in the FIFO */ + while ((auxillary->MU_LSR & AUX_MULSR_TX_EMPTY) == 0) + { + } + /* Write the character to the FIFO for transmission */ + auxillary->MU_IO = c; +#endif +} + +extern void RPI_EnableUart(char* pMessage) +{ + RPI_AuxMiniUartInit(115200, 8); // Initialise the UART + + printf(pMessage); +} diff --git a/rpi-aux.h b/rpi-aux.h new file mode 100644 index 0000000..dd80fc9 --- /dev/null +++ b/rpi-aux.h @@ -0,0 +1,200 @@ +/* + + Part of the Raspberry-Pi Bare Metal Tutorials + Copyright (c) 2013-2015, Brian Sidebotham + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + */ + +#ifndef RPI_AUX_H +#define RPI_AUX_H + +#include "rpi-base.h" + +/* Although these values were originally from the BCM2835 Arm peripherals PDF + it's clear that was rushed and has some glaring errors - so these values + may appear to be different. These values have been changed due to data on + the elinux BCM2835 datasheet errata: + http://elinux.org/BCM2835_datasheet_errata */ + +#define AUX_BASE ( PERIPHERAL_BASE + 0x215000 ) + +#define AUX_ENA_MINIUART ( 1 << 0 ) +#define AUX_ENA_SPI1 ( 1 << 1 ) +#define AUX_ENA_SPI2 ( 1 << 2 ) + +#define AUX_IRQ_SPI2 ( 1 << 2 ) +#define AUX_IRQ_SPI1 ( 1 << 1 ) +#define AUX_IRQ_MU ( 1 << 0 ) + +#define AUX_MULCR_8BIT_MODE ( 3 << 0 ) /* See errata for this value */ +#define AUX_MULCR_BREAK ( 1 << 6 ) +#define AUX_MULCR_DLAB_ACCESS ( 1 << 7 ) + +#define AUX_MUMCR_RTS ( 1 << 1 ) + +#define AUX_MULSR_DATA_READY ( 1 << 0 ) +#define AUX_MULSR_RX_OVERRUN ( 1 << 1 ) +#define AUX_MULSR_TX_EMPTY ( 1 << 5 ) +#define AUX_MULSR_TX_IDLE ( 1 << 6 ) + +#define AUX_MUMSR_CTS ( 1 << 5 ) + +#define AUX_MUCNTL_RX_ENABLE ( 1 << 0 ) +#define AUX_MUCNTL_TX_ENABLE ( 1 << 1 ) +#define AUX_MUCNTL_RTS_FLOW ( 1 << 2 ) +#define AUX_MUCNTL_CTS_FLOW ( 1 << 3 ) +#define AUX_MUCNTL_RTS_FIFO ( 3 << 4 ) +#define AUX_MUCNTL_RTS_ASSERT ( 1 << 6 ) +#define AUX_MUCNTL_CTS_ASSERT ( 1 << 7 ) + +#define AUX_MUSTAT_SYMBOL_AV ( 1 << 0 ) +#define AUX_MUSTAT_SPACE_AV ( 1 << 1 ) +#define AUX_MUSTAT_RX_IDLE ( 1 << 2 ) +#define AUX_MUSTAT_TX_IDLE ( 1 << 3 ) +#define AUX_MUSTAT_RX_OVERRUN ( 1 << 4 ) +#define AUX_MUSTAT_TX_FIFO_FULL ( 1 << 5 ) +#define AUX_MUSTAT_RTS ( 1 << 6 ) +#define AUX_MUSTAT_CTS ( 1 << 7 ) +#define AUX_MUSTAT_TX_EMPTY ( 1 << 8 ) +#define AUX_MUSTAT_TX_DONE ( 1 << 9 ) +#define AUX_MUSTAT_RX_FIFO_LEVEL ( 7 << 16 ) +#define AUX_MUSTAT_TX_FIFO_LEVEL ( 7 << 24 ) + +// Interrupt enables are incorrect on page 12 of: +// https://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf +// See errata: +// http://elinux.org/BCM2835_datasheet_errata#p12 +#define AUX_MUIER_TX_INT ( (1 << 1) ) +#define AUX_MUIER_RX_INT ( (1 << 0 )| (1 << 2) ) + +#define AUX_MUIIR_INT_NOT_PENDING ( 1 << 0 ) +#define AUX_MUIIR_INT_IS_TX ( 1 << 1 ) +#define AUX_MUIIR_INT_IS_RX ( 1 << 2 ) + + + +#define FSEL0(x) ( x ) +#define FSEL1(x) ( x << 3 ) +#define FSEL2(x) ( x << 6 ) +#define FSEL3(x) ( x << 9 ) +#define FSEL4(x) ( x << 12 ) +#define FSEL5(x) ( x << 15 ) +#define FSEL6(x) ( x << 18 ) +#define FSEL7(x) ( x << 21 ) +#define FSEL8(x) ( x << 24 ) +#define FSEL9(x) ( x << 27 ) + +#define FSEL10(x) ( x ) +#define FSEL11(x) ( x << 3 ) +#define FSEL12(x) ( x << 6 ) +#define FSEL13(x) ( x << 9 ) +#define FSEL14(x) ( x << 12 ) +#define FSEL15(x) ( x << 15 ) +#define FSEL16(x) ( x << 18 ) +#define FSEL17(x) ( x << 21 ) +#define FSEL18(x) ( x << 24 ) +#define FSEL19(x) ( x << 27 ) + +#define FSEL20(x) ( x ) +#define FSEL21(x) ( x << 3 ) +#define FSEL22(x) ( x << 6 ) +#define FSEL23(x) ( x << 9 ) +#define FSEL24(x) ( x << 12 ) +#define FSEL25(x) ( x << 15 ) +#define FSEL26(x) ( x << 18 ) +#define FSEL27(x) ( x << 21 ) +#define FSEL28(x) ( x << 24 ) +#define FSEL29(x) ( x << 27 ) + +#define FSEL30(x) ( x ) +#define FSEL31(x) ( x << 3 ) +#define FSEL32(x) ( x << 6 ) +#define FSEL33(x) ( x << 9 ) +#define FSEL34(x) ( x << 12 ) +#define FSEL35(x) ( x << 15 ) +#define FSEL36(x) ( x << 18 ) +#define FSEL37(x) ( x << 21 ) +#define FSEL38(x) ( x << 24 ) +#define FSEL39(x) ( x << 27 ) + +#define FSEL40(x) ( x ) +#define FSEL41(x) ( x << 3 ) +#define FSEL42(x) ( x << 6 ) +#define FSEL43(x) ( x << 9 ) +#define FSEL44(x) ( x << 12 ) +#define FSEL45(x) ( x << 15 ) +#define FSEL46(x) ( x << 18 ) +#define FSEL47(x) ( x << 21 ) +#define FSEL48(x) ( x << 24 ) +#define FSEL49(x) ( x << 27 ) + +#define FSEL50(x) ( x ) +#define FSEL51(x) ( x << 3 ) +#define FSEL52(x) ( x << 6 ) +#define FSEL53(x) ( x << 9 ) + +typedef struct +{ + volatile unsigned int IRQ; + volatile unsigned int ENABLES; + + volatile unsigned int reserved1[((0x40 - 0x04) / 4) - 1]; + + volatile unsigned int MU_IO; + volatile unsigned int MU_IER; + volatile unsigned int MU_IIR; + volatile unsigned int MU_LCR; + volatile unsigned int MU_MCR; + volatile unsigned int MU_LSR; + volatile unsigned int MU_MSR; + volatile unsigned int MU_SCRATCH; + volatile unsigned int MU_CNTL; + volatile unsigned int MU_STAT; + volatile unsigned int MU_BAUD; + + volatile unsigned int reserved2[(0x80 - 0x68) / 4]; + + volatile unsigned int SPI0_CNTL0; + volatile unsigned int SPI0_CNTL1; + volatile unsigned int SPI0_STAT; + volatile unsigned int SPI0_IO; + volatile unsigned int SPI0_PEEK; + + volatile unsigned int reserved3[(0xC0 - 0x94) / 4]; + + volatile unsigned int SPI1_CNTL0; + volatile unsigned int SPI1_CNTL1; + volatile unsigned int SPI1_STAT; + volatile unsigned int SPI1_IO; + volatile unsigned int SPI1_PEEK; +} aux_t; + +extern aux_t* RPI_GetAux(void); +extern void RPI_AuxMiniUartInit(int baud, int bits); +extern void RPI_AuxMiniUartWrite(char c); +extern void RPI_EnableUart(char* pMessage); + +#endif diff --git a/rpi-base.h b/rpi-base.h new file mode 100644 index 0000000..908ae92 --- /dev/null +++ b/rpi-base.h @@ -0,0 +1,73 @@ +/* + + Part of the Raspberry-Pi Bare Metal Tutorials + Copyright (c) 2013-2015, Brian Sidebotham + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef RPI_BASE_H +#define RPI_BASE_H + +#ifdef __ASSEMBLER__ + +#if defined(RPI2) || defined(RPI3) + #define PERIPHERAL_BASE 0x3F000000 +#else + #define PERIPHERAL_BASE 0x20000000 +#endif + +#else + +#if defined(RPI2) || defined(RPI3) + #define PERIPHERAL_BASE 0x3F000000UL +#else + #define PERIPHERAL_BASE 0x20000000UL +#endif + +//#define GPU_IO_BASE 0x7E000000 +//#define GPU_CACHED_BASE 0x40000000 +//#define GPU_UNCACHED_BASE 0xC0000000 +// +//#if defined ( RPI2 ) || defined (RPI3) +//#define GPU_MEM_BASE GPU_UNCACHED_BASE +//#else +//#define GPU_MEM_BASE GPU_CACHED_BASE +//#endif + +//#define MEM_COHERENT_REGION 0x400000 + +#include + +typedef volatile uint32_t rpi_reg_rw_t; +typedef volatile const uint32_t rpi_reg_ro_t; +typedef volatile uint32_t rpi_reg_wo_t; + +typedef volatile uint64_t rpi_wreg_rw_t; +typedef volatile const uint64_t rpi_wreg_ro_t; + +#endif + +#endif diff --git a/rpi-gpio.c b/rpi-gpio.c new file mode 100644 index 0000000..17c5cb9 --- /dev/null +++ b/rpi-gpio.c @@ -0,0 +1,336 @@ +#include +#include "rpi-gpio.h" +#include "rpiHardware.h" +//#include "rpi-mailbox-interface.h" +#include "rpi-mailbox.h" + +rpi_gpio_t* RPI_GpioBase = (rpi_gpio_t*) RPI_GPIO_BASE; + +void RPI_SetGpioPinFunction(rpi_gpio_pin_t gpio, rpi_gpio_alt_function_t func) +{ + rpi_reg_rw_t* fsel_reg = &RPI_GpioBase->GPFSEL[gpio / 10]; + + rpi_reg_rw_t fsel_copy = *fsel_reg; + fsel_copy &= ~(FS_MASK << ((gpio % 10) * 3)); + fsel_copy |= (func << ((gpio % 10) * 3)); + *fsel_reg = fsel_copy; +} + +void RPI_SetGpioOutput(rpi_gpio_pin_t gpio) +{ + RPI_SetGpioPinFunction(gpio, FS_OUTPUT); +} + +void RPI_SetGpioInput(rpi_gpio_pin_t gpio) +{ + RPI_SetGpioPinFunction(gpio, FS_INPUT); +} + +rpi_gpio_value_t RPI_GetGpioValue(rpi_gpio_pin_t gpio) +{ + rpi_gpio_value_t result = RPI_IO_UNKNOWN; + + switch (gpio / 32) + { + case 0: + result = RPI_GpioBase->GPLEV0[0] & (1 << gpio); + break; + + case 1: + //result = RPI_GpioBase->GPLEV1 & (1 << (gpio - 32)); + result = RPI_GpioBase->GPLEV0[1] & (1 << (gpio - 32)); + break; + + default: + break; + } + + if (result != RPI_IO_UNKNOWN) + { + if (result) + result = RPI_IO_HI; + } + + return result; +} + +void RPI_ToggleGpio(rpi_gpio_pin_t gpio) +{ + if (RPI_GetGpioValue(gpio)) + RPI_SetGpioLo(gpio); + else + RPI_SetGpioHi(gpio); +} + +void RPI_SetGpioHi(rpi_gpio_pin_t gpio) +{ + switch (gpio / 32) + { + case 0: + RPI_GpioBase->GPSET0[0] = (1 << gpio); + break; + + case 1: + //RPI_GpioBase->GPSET1 = (1 << (gpio - 32)); + RPI_GpioBase->GPSET0[1] = (1 << (gpio - 32)); + break; + + default: + break; + } + +} + +void RPI_SetGpioLo(rpi_gpio_pin_t gpio) +{ + switch (gpio / 32) + { + case 0: + RPI_GpioBase->GPCLR0[0] = (1 << gpio); + break; + + case 1: + //RPI_GpioBase->GPCLR1 = (1 << (gpio - 32)); + RPI_GpioBase->GPCLR0[1] = (1 << (gpio - 32)); + break; + + default: + break; + } +} + +void RPI_SetGpioValue(rpi_gpio_pin_t gpio, rpi_gpio_value_t value) +{ + if ((value == RPI_IO_LO) || (value == RPI_IO_OFF)) + RPI_SetGpioLo(gpio); + else if ((value == RPI_IO_HI) || (value == RPI_IO_ON)) + RPI_SetGpioHi(gpio); +} + +void EnableGpioDetect(rpi_gpio_pin_t gpio, unsigned type) +{ + unsigned mask = (1 << gpio); + unsigned offset = gpio / 32; + + switch (type) { + case ARM_GPIO_GPREN0: + RPI_GpioBase->GPREN0[offset] |= mask; + break; + case ARM_GPIO_GPFEN0: + RPI_GpioBase->GPFEN0[offset] |= mask; + break; + case ARM_GPIO_GPHEN0: + RPI_GpioBase->GPHEN0[offset] |= mask; + break; + case ARM_GPIO_GPLEN0: + RPI_GpioBase->GPLEN0[offset] |= mask; + break; + case ARM_GPIO_GPAREN0: + RPI_GpioBase->GPAREN0[offset] |= mask; + break; + case ARM_GPIO_GPAFEN0: + RPI_GpioBase->GPAFEN0[offset] |= mask; + break; + } +} + +void DisableGpioDetect(rpi_gpio_pin_t gpio, unsigned type) +{ + unsigned mask = ~(1 << (gpio % 32)); + unsigned offset = gpio / 32; + + switch (type) { + case ARM_GPIO_GPREN0: + RPI_GpioBase->GPREN0[offset] &= mask; + break; + case ARM_GPIO_GPFEN0: + RPI_GpioBase->GPFEN0[offset] &= mask; + break; + case ARM_GPIO_GPHEN0: + RPI_GpioBase->GPHEN0[offset] &= mask; + break; + case ARM_GPIO_GPLEN0: + RPI_GpioBase->GPLEN0[offset] &= mask; + break; + case ARM_GPIO_GPAREN0: + RPI_GpioBase->GPAREN0[offset] &= mask; + break; + case ARM_GPIO_GPAFEN0: + RPI_GpioBase->GPAFEN0[offset] &= mask; + break; + } +} + +void ClearGpioEvent(rpi_gpio_pin_t gpio) +{ + unsigned mask = ~(1 << (gpio % 32)); + unsigned offset = gpio / 32; + + RPI_GpioBase->GPEDS0[offset] |= mask; +} + +void SetACTLed(int value) +{ +#if defined(RPI3) + RPI_GpioVirtSetLed(value); +#endif +} + +#if defined(RPI3) + +#define MAXIMUM_SUPPORTED_POINTS 10 + +struct touch_regs +{ + uint8_t device_mode; + uint8_t gesture_id; + uint8_t num_points; + struct touch { + uint8_t xh; + uint8_t xl; + uint8_t yh; + uint8_t yl; + uint8_t res1; + uint8_t res2; + } point[MAXIMUM_SUPPORTED_POINTS]; +}; + +static volatile uint32_t touchbuf; +//static uint32_t enables_disables[NUM_GPIO]; + +void RPI_TouchInit(void) +{ + rpi_mailbox_property_t* mp; + + RPI_PropertyInit(); + RPI_PropertyAddTag(TAG_GET_TOUCHBUF); + RPI_PropertyProcess(); + + if ((mp = RPI_PropertyGet(TAG_GET_TOUCHBUF))) + touchbuf = mp->data.buffer_32[0] & ~0xC0000000; // Bus to physical + else + touchbuf = 0; +} + +void RPI_UpdateTouch(void) +{ + struct touch_regs* regs = (struct touch_regs*)touchbuf; + int known_ids = 0; + + regs->num_points = MAXIMUM_SUPPORTED_POINTS + 1; + + if (!(regs->num_points == (MAXIMUM_SUPPORTED_POINTS + 1) || (regs->num_points == 0 && known_ids == 0))) + { + int i; + int modified_ids = 0, released_ids; + for (i = 0; i < regs->num_points; i++) + { + int x = (((int)regs->point[i].xh & 0xf) << 8) + regs->point[i].xl; + int y = (((int)regs->point[i].yh & 0xf) << 8) + regs->point[i].yl; + int touchid = (regs->point[i].yh >> 4) & 0xf; + + modified_ids |= 1 << touchid; + + if (!((1 << touchid) & known_ids)) + DEBUG_LOG("x = %d, y = %d, touchid = %d\n", x, y, touchid); + + } + + released_ids = known_ids & ~modified_ids; + + for (i = 0; released_ids && i < MAXIMUM_SUPPORTED_POINTS; i++) + { + if (released_ids & (1 << i)) + { + DEBUG_LOG("Released %d, known = %x modified = %x\n", i, known_ids, modified_ids); + modified_ids &= ~(1 << i); + } + } + known_ids = modified_ids; + + } +} + +#define NUM_GPIO 2 + +static volatile uint32_t gpiovirtbuf; +static uint32_t enables_disables[NUM_GPIO]; + +uint32_t RPI_GpioVirtGetAddress(void) +{ + return gpiovirtbuf; +} + +void RPI_GpioVirtInit(void) +{ + //int i; + + //for (i = 0; i < NUM_GPIO; i++) + //{ + // enables_disables[i] = 0; + //} + + rpi_mailbox_property_t* mp; + + RPI_PropertyInit(); + RPI_PropertyAddTag(TAG_GET_GPIOVIRTBUF); + RPI_PropertyProcess(); + + if ((mp = RPI_PropertyGet(TAG_GET_GPIOVIRTBUF))) + gpiovirtbuf = mp->data.buffer_32[0] & ~0xC0000000; // Bus to physical + else + gpiovirtbuf = 0; +} + +// https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=139753 + +// https://github.com/raspberrypi/firmware/blob/master/extra/dt-blob.dts ln 998 +//128 - Bluetooth ON +//129 - WLan power +//130 - LEDS_DISK_ACTIVITY +//131 - LAN_RUN +//132 - HDMI_CONTROL_ATTACHED +//133 - camera power +//134 - camera LED +//135 - POWER_LOW +void RPI_GpioVirtSetLed(int val) +{ + //unsigned pin = 0; + //if (gpiovirtbuf == 0) + // return; + //DataMemBarrier(); + //if (val) + // write32(gpiovirtbuf + pin * 4, 1 <<16); + //else + // write32(gpiovirtbuf + pin * 4, 1); + + uint16_t enables, disables; + int16_t diff; + int lit; + unsigned pin = 0; + + //printf("gpiovirtbuf = %08x\r\n", (int)gpiovirtbuf); + if (gpiovirtbuf == 0) + return; + + enables = enables_disables[pin] >> 16; + disables = enables_disables[pin] >> 0; + + diff = (int16_t)(enables - disables); + lit = diff > 0; + + if (!(val ^ lit)) + return; + + if (val) enables++; + else disables++; + + //printf("e = %d d = %d\r\n", enables, disables); + + enables_disables[pin] = (enables << 16) | (disables << 0); + + DataMemBarrier(); + + write32(gpiovirtbuf + pin * 4, enables_disables[pin]); +} +#endif diff --git a/rpi-gpio.h b/rpi-gpio.h new file mode 100644 index 0000000..2808363 --- /dev/null +++ b/rpi-gpio.h @@ -0,0 +1,215 @@ +/* + Part of the Raspberry-Pi Bare Metal Tutorials + Copyright (c) 2013-2015, Brian Sidebotham + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef RPI_GPIO_H +#define RPI_GPIO_H + +#include "rpi-base.h" + +/** The base address of the GPIO peripheral (ARM Physical Address) */ +#define RPI_GPIO_BASE (PERIPHERAL_BASE + 0x200000UL) + +//#define GPSET1 (RPI_GPIO_BASE + 0x20) +//#define GPCLR1 (RPI_GPIO_BASE + 0x2c) + +#if defined(RPIZERO) || defined(RPIBPLUS) || defined(RPI2) || defined(RPI3) + #define LED_GPIO_BIT 15 + #define LED_ON() do { RPI_GpioBase->GPCLR0[1] = (1 << LED_GPIO_BIT); } while(0) + #define LED_OFF() do { RPI_GpioBase->GPSET0[1] = (1 << LED_GPIO_BIT); } while(0) +#elif defined(RPI3) +#else + #define LED_GPIO_BIT 16 + #define LED_ON() do { RPI_GpioBase->GPSET0[1] = (1 << LED_GPIO_BIT); } while(0) + #define LED_OFF() do { RPI_GpioBase->GPCLR0[0] = (1 << LED_GPIO_BIT); } while(0) +#endif + +typedef enum +{ + FS_INPUT = 0, + FS_OUTPUT, + FS_ALT5, + FS_ALT4, + FS_ALT0, + FS_ALT1, + FS_ALT2, + FS_ALT3, +} rpi_gpio_alt_function_t; + +/* A mask to be able to clear the bits in the register before setting the value we require */ +#define FS_MASK (7) + +typedef enum +{ + RPI_GPIO0 = 0, + RPI_GPIO1, + RPI_GPIO2, + RPI_GPIO3, + RPI_GPIO4, + RPI_GPIO5, + RPI_GPIO6, + RPI_GPIO7, + RPI_GPIO8, + RPI_GPIO9, + RPI_GPIO10 = 10, + RPI_GPIO11, + RPI_GPIO12, + RPI_GPIO13, + RPI_GPIO14, + RPI_GPIO15, + RPI_GPIO16, + RPI_GPIO17, + RPI_GPIO18, + RPI_GPIO19, + RPI_GPIO20 = 20, + RPI_GPIO21, + RPI_GPIO22, + RPI_GPIO23, + RPI_GPIO24, + RPI_GPIO25, + RPI_GPIO26, + RPI_GPIO27, + RPI_GPIO28, + RPI_GPIO29, + RPI_GPIO30 = 30, + RPI_GPIO31, + RPI_GPIO32, + RPI_GPIO33, + RPI_GPIO34, + RPI_GPIO35, + RPI_GPIO36, + RPI_GPIO37, + RPI_GPIO38, + RPI_GPIO39, + RPI_GPIO40 = 40, + RPI_GPIO41, + RPI_GPIO42, + RPI_GPIO43, + RPI_GPIO44, + RPI_GPIO45, + RPI_GPIO46, + RPI_GPIO47, + RPI_GPIO48, + RPI_GPIO49, + RPI_GPIO50 = 50, + RPI_GPIO51, + RPI_GPIO52, + RPI_GPIO53, +} rpi_gpio_pin_t; + + +/** The GPIO Peripheral is described in section 6 of the BCM2835 Peripherals + documentation. + + There are 54 general-purpose I/O (GPIO) lines split into two banks. All + GPIO pins have at least two alternative functions within BCM. The + alternate functions are usually peripheral IO and a single peripheral + may appear in each bank to allow flexibility on the choice of IO voltage. + Details of alternative functions are given in section 6.2. Alternative + Function Assignments. + + The GPIO peripheral has three dedicated interrupt lines. These lines are + triggered by the setting of bits in the event detect status register. Each + bank has its’ own interrupt line with the third line shared between all + bits. + + The Alternate function table also has the pull state (pull-up/pull-down) + which is applied after a power down. */ +typedef struct +{ + rpi_reg_rw_t GPFSEL[6]; + rpi_reg_ro_t Reserved0; + rpi_reg_wo_t GPSET0[2]; + //rpi_reg_wo_t GPSET1; + rpi_reg_ro_t Reserved1; + rpi_reg_wo_t GPCLR0[2]; + //rpi_reg_wo_t GPCLR1; + rpi_reg_ro_t Reserved2; + rpi_reg_wo_t GPLEV0[2]; + //rpi_reg_wo_t GPLEV1; + rpi_reg_ro_t Reserved3; + rpi_reg_wo_t GPEDS0[2]; + //rpi_reg_wo_t GPEDS1; + rpi_reg_ro_t Reserved4; + rpi_reg_wo_t GPREN0[2]; + //rpi_reg_wo_t GPREN1; + rpi_reg_ro_t Reserved5; + rpi_reg_wo_t GPFEN0[2]; + //rpi_reg_wo_t GPFEN1; + rpi_reg_ro_t Reserved6; + rpi_reg_wo_t GPHEN0[2]; + //rpi_reg_wo_t GPHEN1; + rpi_reg_ro_t Reserved7; + rpi_reg_wo_t GPLEN0[2]; + //rpi_reg_wo_t GPLEN1; + rpi_reg_ro_t Reserved8; + rpi_reg_wo_t GPAREN0[2]; + //rpi_reg_wo_t GPAREN1; + rpi_reg_ro_t Reserved9; + rpi_reg_wo_t GPAFEN0[2]; + //rpi_reg_wo_t GPAFEN1; + rpi_reg_ro_t Reserved10; + rpi_reg_wo_t GPPUD; + rpi_reg_wo_t GPPUDCLK0; + rpi_reg_wo_t GPPUDCLK1; + rpi_reg_ro_t Reserved11; +} rpi_gpio_t; + +typedef enum +{ + RPI_IO_LO = 0, + RPI_IO_HI, + RPI_IO_ON, + RPI_IO_OFF, + RPI_IO_UNKNOWN, +} rpi_gpio_value_t; + +extern rpi_gpio_t* RPI_GpioBase; +extern void RPI_SetGpioPinFunction(rpi_gpio_pin_t gpio, rpi_gpio_alt_function_t func); +extern void RPI_SetGpioOutput(rpi_gpio_pin_t gpio); +extern void RPI_SetGpioInput(rpi_gpio_pin_t gpio); +extern rpi_gpio_value_t RPI_GetGpioValue(rpi_gpio_pin_t gpio); +extern void RPI_SetGpioHi(rpi_gpio_pin_t gpio); +extern void RPI_SetGpioLo(rpi_gpio_pin_t gpio); +extern void RPI_SetGpioValue(rpi_gpio_pin_t gpio, rpi_gpio_value_t value); +extern void RPI_ToggleGpio(rpi_gpio_pin_t gpio); +extern void EnableGpioDetect(rpi_gpio_pin_t gpio, unsigned type); +extern void DisableGpioDetect(rpi_gpio_pin_t gpio, unsigned type); +extern void ClearGpioEvent(rpi_gpio_pin_t gpio); + +extern void SetACTLed(int value); + +#if defined(RPI3) +extern void RPI_TouchInit(void); +extern void RPI_UpdateTouch(void); + +extern uint32_t RPI_GpioVirtGetAddress(void); +extern void RPI_GpioVirtInit(void); +extern void RPI_GpioVirtSetLed(int value); +#endif + +#endif diff --git a/rpi-interrupts.c b/rpi-interrupts.c new file mode 100644 index 0000000..d76c03b --- /dev/null +++ b/rpi-interrupts.c @@ -0,0 +1,22 @@ +#include +#include +#include + +#include "startup.h" + +#include "rpi-base.h" +#include "rpi-gpio.h" +#include "rpi-interrupts.h" + +/** @brief The BCM2835/6 Interupt controller peripheral at it's base address */ +static rpi_irq_controller_t* rpiIRQController = + (rpi_irq_controller_t*)RPI_INTERRUPT_CONTROLLER_BASE; + +/** + @brief Return the IRQ Controller register set +*/ +rpi_irq_controller_t* RPI_GetIrqController( void ) +{ + return rpiIRQController; +} + diff --git a/rpi-interrupts.h b/rpi-interrupts.h new file mode 100644 index 0000000..86bfe80 --- /dev/null +++ b/rpi-interrupts.h @@ -0,0 +1,74 @@ +/* + + Part of the Raspberry-Pi Bare Metal Tutorials + Copyright (c) 2013, Brian Sidebotham + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef RPI_INTERRUPTS_H +#define RPI_INTERRUPTS_H + +#include + +#include "rpi-base.h" + +/** @brief See Section 7.5 of the BCM2836 ARM Peripherals documentation, the base + address of the controller is actually xxxxB000, but there is a 0x200 offset + to the first addressable register for the interrupt controller, so offset the + base to the first register */ +#define RPI_INTERRUPT_CONTROLLER_BASE ( PERIPHERAL_BASE + 0xB200 ) + +/** @brief Bits in the Enable_Basic_IRQs register to enable various interrupts. + See the BCM2835 ARM Peripherals manual, section 7.5 */ +#define RPI_BASIC_ARM_TIMER_IRQ (1 << 0) +#define RPI_BASIC_ARM_MAILBOX_IRQ (1 << 1) +#define RPI_BASIC_ARM_DOORBELL_0_IRQ (1 << 2) +#define RPI_BASIC_ARM_DOORBELL_1_IRQ (1 << 3) +#define RPI_BASIC_GPU_0_HALTED_IRQ (1 << 4) +#define RPI_BASIC_GPU_1_HALTED_IRQ (1 << 5) +#define RPI_BASIC_ACCESS_ERROR_1_IRQ (1 << 6) +#define RPI_BASIC_ACCESS_ERROR_0_IRQ (1 << 7) + + +/** @brief The interrupt controller memory mapped register set */ +typedef struct { + volatile uint32_t IRQ_basic_pending; + volatile uint32_t IRQ_pending_1; + volatile uint32_t IRQ_pending_2; + volatile uint32_t FIQ_control; + volatile uint32_t Enable_IRQs_1; + volatile uint32_t Enable_IRQs_2; + volatile uint32_t Enable_Basic_IRQs; + volatile uint32_t Disable_IRQs_1; + volatile uint32_t Disable_IRQs_2; + volatile uint32_t Disable_Basic_IRQs; + } rpi_irq_controller_t; + +extern rpi_irq_controller_t* RPI_GetIrqController( void ); + +extern void reboot_now(void); + +#endif diff --git a/rpi-mailbox-interface.c b/rpi-mailbox-interface.c new file mode 100644 index 0000000..ed2272f --- /dev/null +++ b/rpi-mailbox-interface.c @@ -0,0 +1,311 @@ +#include +#include +#include + +#include "rpiHardware.h" +#include "rpi-mailbox.h" +#include "rpi-mailbox-interface.h" + +/* Make sure the property tag buffer is aligned to a 16-byte boundary because + we only have 28-bits available in the property interface protocol to pass + the address of the buffer to the VC. */ +static int pt[PROP_BUFFER_SIZE] __attribute__((aligned(16))); +static int pt_index = 0; + +//#define PRINT_PROP_DEBUG 1 + +void RPI_PropertyInit( void ) +{ + //memset(pt, 0, sizeof(pt)); + + /* Fill in the size on-the-fly */ + pt[PT_OSIZE] = 12; + + /* Process request (All other values are reserved!) */ + pt[PT_OREQUEST_OR_RESPONSE] = 0; + + /* First available data slot */ + pt_index = 2; + + /* NULL tag to terminate tag list */ + pt[pt_index] = 0; +} + +/** + @brief Add a property tag to the current tag list. Data can be included. All data is uint32_t + @param tag +*/ +void RPI_PropertyAddTag( rpi_mailbox_tag_t tag, ... ) +{ + int* ptr; + int value; + va_list vl; + va_start( vl, tag ); + + pt[pt_index++] = tag; + + switch( tag ) + { + case TAG_GET_FIRMWARE_VERSION: + case TAG_GET_BOARD_MODEL: + case TAG_GET_BOARD_REVISION: + case TAG_GET_BOARD_MAC_ADDRESS: + case TAG_GET_BOARD_SERIAL: + case TAG_GET_ARM_MEMORY: + case TAG_GET_VC_MEMORY: + case TAG_GET_DMA_CHANNELS: + /* Provide an 8-byte buffer for the response */ + pt[pt_index++] = 8; + pt[pt_index++] = 0; /* Request */ + pt_index += 2; + break; + + case TAG_GET_CLOCKS: + case TAG_GET_COMMAND_LINE: + /* Provide a 1024-byte buffer */ + pt[pt_index++] = PROP_SIZE; + pt[pt_index++] = 0; /* Request */ + pt_index += PROP_SIZE >> 2; + break; + + case TAG_GET_CLOCK_RATE: + case TAG_GET_MAX_CLOCK_RATE: + case TAG_GET_MIN_CLOCK_RATE: + case TAG_GET_TURBO: + case TAG_GET_TEMPERATURE: + case TAG_GET_MAX_TEMPERATURE: + case TAG_GET_VOLTAGE: + case TAG_GET_MIN_VOLTAGE: + case TAG_GET_MAX_VOLTAGE: + pt[pt_index++] = 8; + pt[pt_index++] = 0; /* Request */ + pt[pt_index++] = va_arg( vl, int ); /* ClockID */ + pt_index += 1; + break; + + case TAG_EXECUTE_CODE: + pt[pt_index++] = 28; + pt[pt_index++] = 0; /* Request */ + pt[pt_index++] = va_arg( vl, int ); // Function pointer + pt[pt_index++] = va_arg( vl, int ); // R0 + pt[pt_index++] = va_arg( vl, int ); // R1 + pt[pt_index++] = va_arg( vl, int ); // R2 + pt[pt_index++] = va_arg( vl, int ); // R3 + pt[pt_index++] = va_arg( vl, int ); // R4 + pt[pt_index++] = va_arg( vl, int ); // R5 + break; + + case TAG_ALLOCATE_BUFFER: + pt[pt_index++] = 8; + pt[pt_index++] = 0; /* Request */ + pt[pt_index++] = va_arg( vl, int ); + pt_index += 1; + break; + + case TAG_GET_PHYSICAL_SIZE: + case TAG_SET_PHYSICAL_SIZE: + case TAG_TEST_PHYSICAL_SIZE: + case TAG_GET_VIRTUAL_SIZE: + case TAG_SET_VIRTUAL_SIZE: + case TAG_TEST_VIRTUAL_SIZE: + case TAG_GET_VIRTUAL_OFFSET: + case TAG_SET_VIRTUAL_OFFSET: + pt[pt_index++] = 8; + pt[pt_index++] = 0; /* Request */ + + if( ( tag == TAG_SET_PHYSICAL_SIZE ) || + ( tag == TAG_SET_VIRTUAL_SIZE ) || + ( tag == TAG_SET_VIRTUAL_OFFSET ) || + ( tag == TAG_TEST_PHYSICAL_SIZE ) || + ( tag == TAG_TEST_VIRTUAL_SIZE ) ) + { + pt[pt_index++] = va_arg( vl, int ); /* Width */ + pt[pt_index++] = va_arg( vl, int ); /* Height */ + } + else + { + pt_index += 2; + } + break; + + + case TAG_GET_ALPHA_MODE: + case TAG_SET_ALPHA_MODE: + case TAG_GET_DEPTH: + case TAG_SET_DEPTH: + case TAG_GET_PIXEL_ORDER: + case TAG_SET_PIXEL_ORDER: + case TAG_GET_PITCH: + pt[pt_index++] = 4; + pt[pt_index++] = 0; /* Request */ + + if( ( tag == TAG_SET_DEPTH ) || + ( tag == TAG_SET_PIXEL_ORDER ) || + ( tag == TAG_SET_ALPHA_MODE ) ) + { + /* Colour Depth, bits-per-pixel \ Pixel Order State */ + pt[pt_index++] = va_arg( vl, int ); + } + else + { + pt_index += 1; + } + break; + + case TAG_GET_OVERSCAN: + case TAG_SET_OVERSCAN: + pt[pt_index++] = 16; + pt[pt_index++] = 0; /* Request */ + + if( ( tag == TAG_SET_OVERSCAN ) ) + { + pt[pt_index++] = va_arg( vl, int ); /* Top pixels */ + pt[pt_index++] = va_arg( vl, int ); /* Bottom pixels */ + pt[pt_index++] = va_arg( vl, int ); /* Left pixels */ + pt[pt_index++] = va_arg( vl, int ); /* Right pixels */ + } + else + { + pt_index += 4; + } + break; + + case TAG_SET_POWER_STATE: + case TAG_GET_POWER_STATE: + pt[pt_index++] = 8; + pt[pt_index++] = 0; /* Request */ + if ((tag == TAG_SET_POWER_STATE)) + { + pt[pt_index++] = va_arg(vl, int); // deviceID + pt[pt_index++] = va_arg(vl, int); // state + } + else + { + pt_index += 2; + } + pt_index += 1; + + break; + + case TAG_SET_PALETTE: + ptr = va_arg(vl, int*); + value = ptr[1]; // number of palette entries + pt[pt_index++] = 8 + value * 4; + pt[pt_index++] = 0; /* Request */ + pt[pt_index++] = *ptr++; // first palette index +// value = *ptr++; // number of palette entries + ptr++; + pt[pt_index++] = value; + { + for (int index = 0; index < value; ++index) + { + pt[pt_index++] = *ptr++; + } + } + break; + + + //Set the PWR led signal to output mode, allowing to control it : rpi3 - gpiovirtbuf c 135 1 0 0 0 0 + //Set the PWR led off : rpi3 - gpiovirtbuf s 135 0 + + //GPIO 134 is the camera LED GPIO + //GPIO 133 is the camera power GPIO + + case TAG_GET_GPIOVIRTBUF: + case TAG_GET_TOUCHBUF: + pt[pt_index++] = 4; + pt[pt_index++] = 0; /* Request */ + pt_index += 1; + break; + + default: + /* Unsupported tags, just remove the tag from the list */ + pt_index--; + break; + } + + /* Make sure the tags are 0 terminated to end the list and update the buffer size */ + pt[pt_index] = 0; + + va_end( vl ); +} + + + +int RPI_PropertyProcess( void ) +{ + int result; + +#if( PRINT_PROP_DEBUG == 1 ) + int i; + LOG_INFO( "%s Length: %d\r\n", __func__, pt[PT_OSIZE] ); +#endif + /* Fill in the size of the buffer */ + pt[PT_OSIZE] = ( pt_index + 1 ) << 2; + pt[PT_OREQUEST_OR_RESPONSE] = 0; + +#if( PRINT_PROP_DEBUG == 1 ) + for( i = 0; i < (pt[PT_OSIZE] >> 2); i++ ) + LOG_INFO( "Request: %3d %8.8X\r\n", i, pt[i] ); +#endif + RPI_Mailbox0Write(MB0_TAGS_ARM_TO_VC, (unsigned int)pt); + + result = RPI_Mailbox0Read( MB0_TAGS_ARM_TO_VC ); + +#if( PRINT_PROP_DEBUG == 1 ) + for( i = 0; i < (pt[PT_OSIZE] >> 2); i++ ) + LOG_INFO( "Response: %3d %8.8X\r\n", i, pt[i] ); +#endif + return result; +} + +void RPI_PropertyProcessNoCheck( void ) +{ +#if( PRINT_PROP_DEBUG == 1 ) + int i; + LOG_INFO( "%s Length: %d\r\n", __func__, pt[PT_OSIZE] ); +#endif + /* Fill in the size of the buffer */ + pt[PT_OSIZE] = ( pt_index + 1 ) << 2; + pt[PT_OREQUEST_OR_RESPONSE] = 0; + +#if( PRINT_PROP_DEBUG == 1 ) + for( i = 0; i < (pt[PT_OSIZE] >> 2); i++ ) + LOG_INFO( "Request: %3d %8.8X\r\n", i, pt[i] ); +#endif + RPI_Mailbox0Write( MB0_TAGS_ARM_TO_VC, (unsigned int)pt ); +} + +rpi_mailbox_property_t* RPI_PropertyGet( rpi_mailbox_tag_t tag) +{ + static rpi_mailbox_property_t property; + int* tag_buffer = NULL; + + property.tag = tag; + + /* Get the tag from the buffer. Start at the first tag position */ + int index = 2; + + while( index < ( pt[PT_OSIZE] >> 2 ) ) + { + /* DEBUG_LOG( "Test Tag: [%d] %8.8X\r\n", index, pt[index] ); */ + if( pt[index] == tag ) + { + tag_buffer = &pt[index]; + break; + } + + /* Progress to the next tag if we haven't yet discovered the tag */ + index += ( pt[index + 1] >> 2 ) + 3; + } + + /* Return NULL of the property tag cannot be found in the buffer */ + if( tag_buffer == NULL ) + return NULL; + + /* Return the required data */ + property.byte_length = tag_buffer[T_ORESPONSE] & 0xFFFF; + memcpy( property.data.buffer_8, &tag_buffer[T_OVALUE], property.byte_length ); + + return &property; +} diff --git a/rpi-mailbox-interface.h b/rpi-mailbox-interface.h new file mode 100644 index 0000000..aeb1894 --- /dev/null +++ b/rpi-mailbox-interface.h @@ -0,0 +1,196 @@ +#ifndef RPI_MAILBOX_INTERFACE_H +#define RPI_MAILBOX_INTERFACE_H + +#define PROP_BUFFER_SIZE 8192 +#define PROP_SIZE 1024 + +typedef enum +{ + POWER_MANAGEMENT = 0, + FRAMEBUFFER, + VIRTUAL_UART, + VCHIQ, + LEDS, + BUTTONS, + TOUCH_SCREEN, + UNDEFINED, + PTAG_ARM_TO_VC, + PTAG_VC_TO_ARM + +} Channel; + +/** + @brief An enum of the RPI->Videocore firmware mailbox property interface + properties. Further details are available from + https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface + Getting out of date now see;- + https://github.com/raspberrypi/firmware/issues/719 +*/ +typedef enum { + /* Videocore */ + TAG_GET_FIRMWARE_VERSION = 0x1, + + GET_GPIO_STATE = 0x00030041, + SET_GPIO_STATE = 0x00038041, + + /* Hardware */ + TAG_GET_BOARD_MODEL = 0x10001, + TAG_GET_BOARD_REVISION, + TAG_GET_BOARD_MAC_ADDRESS, + TAG_GET_BOARD_SERIAL, + TAG_GET_ARM_MEMORY, + TAG_GET_VC_MEMORY, + TAG_GET_CLOCKS, + + /* Config */ + TAG_GET_COMMAND_LINE = 0x50001, + + /* Shared resource management */ + TAG_GET_DMA_CHANNELS = 0x60001, + + /* Power */ + TAG_GET_POWER_STATE = 0x20001, + TAG_GET_TIMING, + TAG_SET_POWER_STATE = 0x28001, + + /* Clocks */ + TAG_GET_CLOCK_STATE = 0x30001, + TAG_SET_CLOCK_STATE = 0x38001, + TAG_GET_CLOCK_RATE = 0x30002, + TAG_SET_CLOCK_RATE = 0x38002, + TAG_GET_MAX_CLOCK_RATE = 0x30004, + TAG_GET_MIN_CLOCK_RATE = 0x30007, + TAG_GET_TURBO = 0x30009, + TAG_SET_TURBO = 0x38009, + + /* Voltage */ + TAG_GET_VOLTAGE = 0x30003, + TAG_SET_VOLTAGE = 0x38003, + TAG_GET_MAX_VOLTAGE = 0x30005, + TAG_GET_MIN_VOLTAGE = 0x30008, + TAG_GET_TEMPERATURE = 0x30006, + TAG_GET_MAX_TEMPERATURE = 0x3000A, + TAG_GET_STC = 0x3000B, + TAG_ALLOCATE_MEMORY = 0x3000C, + TAG_LOCK_MEMORY = 0x3000D, + TAG_UNLOCK_MEMORY = 0x3000E, + TAG_RELEASE_MEMORY = 0x3000F, + TAG_EXECUTE_CODE = 0x30010, + TAG_EXECUTE_QPU = 0x30011, + TAG_SET_ENABLE_QPU = 0x30012, + TAG_GET_DISPMANX_MEM_HANDLE = 0x30014, + TAG_GET_EDID_BLOCK = 0x30020, + TAG_GET_CUSTOMER_OTP = 0x30021, + + TAG_GET_DOMAIN_STATE = 0x30030, + TAG_GET_GPIO_STATE = 0x30041, + TAG_SET_GPIO_STATE = 0x38041, + + TAG_GET_GPIO_CONFIG = 0x30043, + TAG_SET_GPIO_CONFIG = 0x38043, + + TAG_SET_CUSTOMER_OTP = 0x38021, + TAG_SET_DOMAIN_STATE = 0x38030, + TAG_SET_SDHOST_CLOCK = 0x38042, + + /* Framebuffer */ + TAG_ALLOCATE_BUFFER = 0x40001, + TAG_RELEASE_BUFFER = 0x48001, + TAG_BLANK_SCREEN = 0x40002, + TAG_GET_PHYSICAL_SIZE = 0x40003, + TAG_TEST_PHYSICAL_SIZE = 0x44003, + TAG_SET_PHYSICAL_SIZE = 0x48003, + TAG_GET_VIRTUAL_SIZE = 0x40004, + TAG_TEST_VIRTUAL_SIZE = 0x44004, + TAG_SET_VIRTUAL_SIZE = 0x48004, + TAG_GET_DEPTH = 0x40005, + TAG_TEST_DEPTH = 0x44005, + TAG_SET_DEPTH = 0x48005, + TAG_GET_PIXEL_ORDER = 0x40006, + TAG_TEST_PIXEL_ORDER = 0x44006, + TAG_SET_PIXEL_ORDER = 0x48006, + TAG_GET_ALPHA_MODE = 0x40007, + TAG_TEST_ALPHA_MODE = 0x44007, + TAG_SET_ALPHA_MODE = 0x48007, + TAG_GET_PITCH = 0x40008, + TAG_GET_VIRTUAL_OFFSET = 0x40009, + TAG_TEST_VIRTUAL_OFFSET = 0x44009, + TAG_SET_VIRTUAL_OFFSET = 0x48009, + TAG_GET_OVERSCAN = 0x4000A, + TAG_TEST_OVERSCAN = 0x4400A, + TAG_SET_OVERSCAN = 0x4800A, + TAG_GET_PALETTE = 0x4000B, + TAG_TEST_PALETTE = 0x4400B, + TAG_SET_PALETTE = 0x4800B, + + TAG_TEST_VSYNC = 0x4400e, + TAG_SET_VSYNC = 0x4800e, + + TAG_SET_BACKLIGHT = 0x4800f, + + TAG_GET_TOUCHBUF = 0x4000F, + + TAG_GET_GPIOVIRTBUF = 0x40010, + + + TAG_SET_CURSOR_INFO = 0x8011, + TAG_SET_CURSOR_STATE = 0x8010, + + TAG_USB = 0xB880 + + } rpi_mailbox_tag_t; + + +typedef enum { + TAG_STATE_REQUEST = 0, + TAG_STATE_RESPONSE = 1, + } rpi_tag_state_t; + + +typedef enum { + PT_OSIZE = 0, + PT_OREQUEST_OR_RESPONSE = 1, + } rpi_tag_buffer_offset_t; + +typedef enum { + T_OIDENT = 0, + T_OVALUE_SIZE = 1, + T_ORESPONSE = 2, + T_OVALUE = 3, + } rpi_tag_offset_t; + +typedef struct { + int tag; + int byte_length; + union { + int value_32; + unsigned char buffer_8[PROP_SIZE]; + int buffer_32[PROP_SIZE >> 2]; + } data; + } rpi_mailbox_property_t; + + +/* Clock ID values */ +#define RES_CLK_ID 0x000000000 +#define EMMC_CLK_ID 0x000000001 +#define UART_CLK_ID 0x000000002 +#define ARM_CLK_ID 0x000000003 +#define CORE_CLK_ID 0x000000004 +#define V3D_CLK_ID 0x000000005 +#define H264_CLK_ID 0x000000006 +#define ISP_CLK_ID 0x000000007 +#define SDRAM_CLK_ID 0x000000008 +#define PIXEL_CLK_ID 0x000000009 +#define PWM_CLK_ID 0x00000000a + +#define MIN_CLK_ID 0x000000001 +#define MAX_CLK_ID 0x00000000a + +extern void RPI_PropertyInit( void ); +extern void RPI_PropertyAddTag( rpi_mailbox_tag_t tag, ... ); +extern int RPI_PropertyProcess( void ); +extern void RPI_PropertyProcessNoCheck( void ); +extern rpi_mailbox_property_t* RPI_PropertyGet( rpi_mailbox_tag_t tag ); +//extern void SetACTLED(int value); + +#endif diff --git a/rpi-mailbox.c b/rpi-mailbox.c new file mode 100644 index 0000000..3ff1aac --- /dev/null +++ b/rpi-mailbox.c @@ -0,0 +1,58 @@ +#include + +#include "rpi-gpio.h" +#include "rpi-mailbox.h" + +extern void usDelay(unsigned nMicroSeconds); + +/* Mailbox 0 mapped to it's base address */ +static mailbox_t* rpiMailbox0 = (mailbox_t*)RPI_MAILBOX0_BASE; + +void RPI_Mailbox0Write( mailbox0_channel_t channel, int value ) +{ + /* For information about accessing mailboxes, see: + https://github.com/raspberrypi/firmware/wiki/Accessing-mailboxes */ + + /* Add the channel number into the lower 4 bits */ + value &= ~(0xF); + value |= channel; + + /* Wait until the mailbox becomes available and then write to the mailbox + channel */ + while( ( rpiMailbox0->Status & ARM_MS_FULL ) != 0 ) { } + + /* Write the modified value + channel number into the write register */ + rpiMailbox0->Write = value; +} + + +int RPI_Mailbox0Read( mailbox0_channel_t channel ) +{ + /* For information about accessing mailboxes, see: + https://github.com/raspberrypi/firmware/wiki/Accessing-mailboxes */ + int value = -1; + + /* Keep reading the register until the desired channel gives us a value */ + while( ( value & 0xF ) != channel ) + { + /* Wait while the mailbox is empty because otherwise there's no value + to read! */ + while( rpiMailbox0->Status & ARM_MS_EMPTY ) { } + + /* Extract the value from the Read register of the mailbox. The value + is actually in the upper 28 bits */ + value = rpiMailbox0->Read; + } + + /* Return just the value (the upper 28-bits) */ + return value >> 4; +} + +void RPI_Mailbox0Flush(void) +{ + while (!(rpiMailbox0->Status & ARM_MS_EMPTY)) + { + (void)rpiMailbox0->Read; + usDelay(20); + } +} diff --git a/rpi-mailbox.h b/rpi-mailbox.h new file mode 100644 index 0000000..4fedf77 --- /dev/null +++ b/rpi-mailbox.h @@ -0,0 +1,48 @@ +#ifndef RPI_MAILBOX_H +#define RPI_MAILBOX_H + +#include "rpi-base.h" + +#define RPI_MAILBOX0_BASE ( PERIPHERAL_BASE + 0xB880 ) + +/* The available mailbox channels in the BCM2835 Mailbox interface. + See https://github.com/raspberrypi/firmware/wiki/Mailboxes for + information */ +typedef enum { + MB0_POWER_MANAGEMENT = 0, + MB0_FRAMEBUFFER, + MB0_VIRTUAL_UART, + MB0_VCHIQ, + MB0_LEDS, + MB0_BUTTONS, + MB0_TOUCHSCREEN, + MB0_UNUSED, + MB0_TAGS_ARM_TO_VC, + MB0_TAGS_VC_TO_ARM, +} mailbox0_channel_t; + +/* These defines come from the Broadcom Videocode driver source code, see: + brcm_usrlib/dag/vmcsx/vcinclude/bcm2708_chip/arm_control.h */ +enum mailbox_status_reg_bits { + ARM_MS_FULL = 0x80000000, + ARM_MS_EMPTY = 0x40000000, + ARM_MS_LEVEL = 0x400000FF, +}; + +/* Define a structure which defines the register access to a mailbox. + Not all mailboxes support the full register set! */ +typedef struct { + volatile unsigned int Read; + volatile unsigned int reserved1[((0x90 - 0x80) / 4) - 1]; + volatile unsigned int Poll; + volatile unsigned int Sender; + volatile unsigned int Status; + volatile unsigned int Configuration; + volatile unsigned int Write; + } mailbox_t; + +extern void RPI_Mailbox0Write( mailbox0_channel_t channel, int value ); +extern int RPI_Mailbox0Read( mailbox0_channel_t channel ); +extern void RPI_Mailbox0Flush(void); + +#endif diff --git a/rpiHardware.h b/rpiHardware.h new file mode 100644 index 0000000..c8e9b49 --- /dev/null +++ b/rpiHardware.h @@ -0,0 +1,206 @@ +// Pi1541 - A Commodore 1541 disk drive emulator +// Copyright(C) 2018 Stephen White +// +// This file is part of Pi1541. +// +// Pi1541 is free software : you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Pi1541 is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Pi1541. If not, see . + +#ifndef RPIHARDWARE_H +#define RPIHARDWARE_H + +#include +#include "types.h" +#include "rpi-gpio.h" +#include "debug.h" + +#define DMA_ENABLE (PERIPHERAL_BASE + 0x7FF0) // Global Enable bits for each DMA Channel +#define DMA0_BASE (PERIPHERAL_BASE + 0x7000) // DMA Channel 0 Register Set +#define DMA_CONBLK_AD 4 // DMA Channel 0..14 Control Block Address +#define DMA_CS 0 // DMA Channel 0..14 Control & Status +#define DMA_ACTIVE 1 +#define DMA_END 2 + +#define DMA_DEST_DREQ 0x40 +#define DMA_SRC_INC 0x100 +#define DMA_PERMAP_5 0x50000 + +#define ARM_GPIO_GPFSEL0 (RPI_GPIO_BASE + 0x00) +#define ARM_GPIO_GPFSEL1 (RPI_GPIO_BASE + 0x04) +#define ARM_GPIO_GPFSEL4 (RPI_GPIO_BASE + 0x10) +#define ARM_GPIO_GPSET0 (RPI_GPIO_BASE + 0x1C) +#define ARM_GPIO_GPCLR0 (RPI_GPIO_BASE + 0x28) +#define ARM_GPIO_GPLEV0 (RPI_GPIO_BASE + 0x34) +#define ARM_GPIO_GPEDS0 (RPI_GPIO_BASE + 0x40) +#define ARM_GPIO_GPREN0 (RPI_GPIO_BASE + 0x4C) +#define ARM_GPIO_GPFEN0 (RPI_GPIO_BASE + 0x58) +#define ARM_GPIO_GPHEN0 (RPI_GPIO_BASE + 0x64) +#define ARM_GPIO_GPLEN0 (RPI_GPIO_BASE + 0x70) +#define ARM_GPIO_GPAREN0 (RPI_GPIO_BASE + 0x7C) +#define ARM_GPIO_GPAFEN0 (RPI_GPIO_BASE + 0x88) +#define ARM_GPIO_GPPUD (RPI_GPIO_BASE + 0x94) +#define ARM_GPIO_GPPUDCLK0 (RPI_GPIO_BASE + 0x98) + + +#define ARM_SYSTIMER_BASE (PERIPHERAL_BASE + 0x3000) + +#define ARM_SYSTIMER_CS (ARM_SYSTIMER_BASE + 0x00) +#define ARM_SYSTIMER_CLO (ARM_SYSTIMER_BASE + 0x04) +#define ARM_SYSTIMER_CHI (ARM_SYSTIMER_BASE + 0x08) +#define ARM_SYSTIMER_C0 (ARM_SYSTIMER_BASE + 0x0C) +#define ARM_SYSTIMER_C1 (ARM_SYSTIMER_BASE + 0x10) +#define ARM_SYSTIMER_C2 (ARM_SYSTIMER_BASE + 0x14) +#define ARM_SYSTIMER_C3 (ARM_SYSTIMER_BASE + 0x18) + +// External Mass Media Controller (SD Card) +#define ARM_EMMC_BASE (PERIPHERAL_BASE + 0x300000) + +#define DEVICE_ID_SD_CARD 0 +#define DEVICE_ID_USB_HCD 3 + +#define POWER_STATE_OFF (0 << 0) +#define POWER_STATE_ON (1 << 0) +#define POWER_STATE_WAIT (1 << 1) +#define POWER_STATE_DEVICE_DOESNT_EXIST (1 << 1) // in response + +#define CLOCK_ID_EMMC 1 +#define CLOCK_ID_UART 2 +#define CLOCK_ID_CORE 4 + +#define CM_BASE (PERIPHERAL_BASE + 0x101000) +#define CM_PWMCTL (CM_BASE + 0xA0) // Clock Manager PWM Clock Control +#define CM_PWMDIV (CM_BASE + 0xA4) // Clock Manager PWM Clock Divisor +#define CM_PASSWORD 0x5A000000 // Clock Control Password "5A" + +#define CM_SRC_OSCILLATOR 0x01 +#define CM_ENAB 0x10 // Enable The Clock Generator + +#define PWM_BASE (PERIPHERAL_BASE + 0x20C000) +#define PWM_CTL (PWM_BASE + 0x0) +#define PWM_STATUS (PWM_BASE + 0x4) +#define PWM_DMAC (PWM_BASE + 0x8) +#define PWM_RNG1 (PWM_BASE + 0x10) +#define PWM_FIF1 (PWM_BASE + 0x18) // PWM FIFO Input +#define PWM_RNG2 (PWM_BASE + 0x20) + +#define PWM_ENAB 0x80000000 // PWM DMA Configuration DMA Enable + +#define PWM_PWEN1 0x1 // Channel 1 Enable +#define PWM_MODE1 0x2 // Channel 1 Mode +#define PWM_RPTL1 0x4 // Channel 1 Repeat Last Data +#define PWM_SBIT1 0x8 // Channel 1 Silence Bit +#define PWM_POLA1 0x10 // Channel 1 Polarity +#define PWM_USEF1 0x20 // Channel 1 Use Fifo +#define PWM_CLRF1 0x40 // Clear Fifo +#define PWM_MSEN1 0x80 // Channel 1 M / S Enable +#define PWM_PWEN2 0x100 // Channel 2 Enable +#define PWM_MODE2 0x200 // Channel 2 Mode +#define PWM_RPTL2 0x400 // Channel 2 Repeat Last Data +#define PWM_SBIT2 0x800 // Channel 2 Silence Bit +#define PWM_POLA2 0x1000 // Channel 2 Polarity +#define PWM_USEF2 0x2000 // Channel 2 Use Fifo +#define PWM_MSEN2 0x8000 // Channel 2 M / S Enable + +// PWM Status flags +#define PWM_FULL1 0x1 +#define PWM_EMPT1 0x2 + +// +// Interrupt Controller +// +#define ARM_IC_BASE (PERIPHERAL_BASE + 0xB000) + +#define ARM_IC_IRQ_BASIC_PENDING (ARM_IC_BASE + 0x200) +#define ARM_IC_IRQ_PENDING_1 (ARM_IC_BASE + 0x204) +#define ARM_IC_IRQ_PENDING_2 (ARM_IC_BASE + 0x208) +#define ARM_IC_FIQ_CONTROL (ARM_IC_BASE + 0x20C) +#define ARM_IC_ENABLE_IRQS_1 (ARM_IC_BASE + 0x210) +#define ARM_IC_ENABLE_IRQS_2 (ARM_IC_BASE + 0x214) +#define ARM_IC_ENABLE_BASIC_IRQS (ARM_IC_BASE + 0x218) +#define ARM_IC_DISABLE_IRQS_1 (ARM_IC_BASE + 0x21C) +#define ARM_IC_DISABLE_IRQS_2 (ARM_IC_BASE + 0x220) +#define ARM_IC_DISABLE_BASIC_IRQS (ARM_IC_BASE + 0x224) + +#ifdef __cplusplus +extern "C" { +#endif +#include "rpi-mailbox-interface.h" + + static inline u32 read32(unsigned int nAddress) + { + return *(u32 volatile *)nAddress; + } + + static inline void write32(unsigned int nAddress, u32 nValue) + { + *(u32 volatile *)nAddress = nValue; + } + + static inline void delay_us(u32 amount) + { + u32 count; + + for (count = 0; count < amount; ++count) + { + unsigned before; + unsigned after; + // We try to update every micro second and use as a rough timer to count micro seconds + before = read32(ARM_SYSTIMER_CLO); + do + { + after = read32(ARM_SYSTIMER_CLO); + } while (after == before); + } + } + + static inline int get_clock_rate(int clk_id) + { + rpi_mailbox_property_t *buf; + RPI_PropertyInit(); + RPI_PropertyAddTag(TAG_GET_CLOCK_RATE, clk_id); + RPI_PropertyProcess(); + buf = RPI_PropertyGet(TAG_GET_CLOCK_RATE); + if (buf) + return buf->data.buffer_32[1]; + else + return 0; + } + +#ifdef __cplusplus +} +#endif + +//DMB - whenever a memory access requires ordering with regards to another memory access. +//DSB - whenever a memory access needs to have completed before program execution progresses. +//ISB - whenever instruction fetches need to explicitly take place after a certain point in the program, for example after memory map updates or after writing code to be executed. (In practice, this means "throw away any prefetched instructions at this point".) + +//DMB - It prevents reordering of data accesses instructions across itself. All data accesses by this processor / core before the DMB will be visible to all other masters within the specified shareability domain before any of the data accesses after it. +// It also ensures that any explicit preceding data(or unified) cache maintenance operations have completed before any subsequent data accesses are executed. + +#if defined(RPI2) || defined(RPI3) + #define DataSyncBarrier() asm volatile ("dsb" ::: "memory") + #define DataMemBarrier() asm volatile ("dmb" ::: "memory") + + #define InstructionSyncBarrier() __asm volatile ("isb" ::: "memory") + #define InstructionMemBarrier() __asm volatile ("isb" ::: "memory") +#else + #define DataSyncBarrier() asm volatile ("mcr p15, 0, %0, c7, c10, 4" : : "r" (0) : "memory") + #define DataMemBarrier() asm volatile ("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory") + + #define FlushPrefetchBuffer() __asm volatile ("mcr p15, 0, %0, c7, c5, 4" : : "r" (0) : "memory") + + #define InstructionSyncBarrier() FlushPrefetchBuffer() + #define InstructionMemBarrier() FlushPrefetchBuffer() +#endif + +#endif diff --git a/sample.h b/sample.h new file mode 100644 index 0000000..ad81ad4 --- /dev/null +++ b/sample.h @@ -0,0 +1,830 @@ +/* Generated by bin2c, do not edit manually */ + +/* Contents of file Sample.bin */ +const long int Sample_bin_size = 13226-48; +const unsigned char Sample_bin[13226-48] = { + 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x82, 0x82, 0x82, 0x81, + 0x81, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x7F, 0x7F, 0x7E, 0x7E, 0x7D, 0x7E, + 0x7E, 0x7D, 0x7C, 0x7B, 0x7C, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x7F, 0x7F, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7E, 0x7E, 0x7D, 0x7E, 0x7F, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, + 0x7C, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7F, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, 0x84, 0x83, + 0x82, 0x81, 0x81, 0x81, 0x80, 0x7F, 0x80, 0x81, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x80, + 0x7F, 0x7E, 0x7E, 0x7F, 0x7F, 0x7D, 0x7C, 0x7B, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7E, 0x7F, 0x80, + 0x80, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7F, 0x7E, 0x7D, 0x7E, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7F, + 0x80, 0x81, 0x81, 0x81, 0x83, 0x84, 0x84, 0x84, 0x84, 0x83, 0x82, 0x82, 0x81, 0x81, 0x7F, 0x7E, + 0x7E, 0x80, 0x80, 0x7F, 0x7C, 0x7B, 0x7B, 0x7C, 0x7E, 0x80, 0x83, 0x84, 0x82, 0x82, 0x82, 0x83, + 0x83, 0x81, 0x80, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7E, 0x7F, 0x82, 0x84, 0x84, 0x84, + 0x84, 0x83, 0x81, 0x7D, 0x7A, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x7E, 0x7E, 0x7D, 0x7B, 0x7B, + 0x7C, 0x7E, 0x81, 0x84, 0x84, 0x81, 0x7E, 0x7C, 0x7D, 0x7E, 0x7F, 0x7E, 0x7F, 0x7F, 0x7F, 0x7B, + 0x78, 0x76, 0x75, 0x74, 0x73, 0x74, 0x77, 0x7A, 0x7C, 0x7E, 0x80, 0x84, 0x86, 0x87, 0x88, 0x89, + 0x89, 0x89, 0x8A, 0x8B, 0x89, 0x86, 0x82, 0x81, 0x82, 0x83, 0x84, 0x84, 0x83, 0x81, 0x7F, 0x81, + 0x85, 0x89, 0x8A, 0x89, 0x88, 0x89, 0x8B, 0x8B, 0x89, 0x84, 0x7F, 0x7B, 0x78, 0x74, 0x6F, 0x6A, + 0x66, 0x65, 0x65, 0x66, 0x68, 0x6A, 0x6E, 0x73, 0x7B, 0x83, 0x8A, 0x8F, 0x94, 0x97, 0x98, 0x94, + 0x90, 0x8D, 0x8C, 0x8A, 0x85, 0x7F, 0x7C, 0x7E, 0x81, 0x82, 0x7F, 0x7C, 0x7D, 0x80, 0x85, 0x89, + 0x8D, 0x8D, 0x87, 0x7F, 0x78, 0x76, 0x74, 0x6F, 0x68, 0x62, 0x5F, 0x5E, 0x5C, 0x5B, 0x5F, 0x6A, + 0x77, 0x7F, 0x86, 0x8F, 0x99, 0xA2, 0xA6, 0xA8, 0xAA, 0xAA, 0xA7, 0xA2, 0x9C, 0x96, 0x90, 0x8C, + 0x8A, 0x88, 0x83, 0x7C, 0x74, 0x6F, 0x6E, 0x71, 0x78, 0x7F, 0x83, 0x80, 0x77, 0x6E, 0x6A, 0x69, + 0x69, 0x68, 0x66, 0x64, 0x64, 0x69, 0x71, 0x78, 0x7C, 0x7E, 0x7F, 0x80, 0x81, 0x83, 0x87, 0x88, + 0x88, 0x8A, 0x8C, 0x8D, 0x8B, 0x88, 0x89, 0x8E, 0x90, 0x90, 0x8F, 0x8F, 0x8C, 0x82, 0x78, 0x72, + 0x71, 0x6F, 0x6A, 0x64, 0x63, 0x65, 0x6A, 0x71, 0x78, 0x7C, 0x7D, 0x7D, 0x7F, 0x7F, 0x7D, 0x7B, + 0x7A, 0x7A, 0x7A, 0x7C, 0x7F, 0x81, 0x83, 0x87, 0x8F, 0x97, 0x9D, 0xA3, 0xA8, 0xA9, 0xA5, 0x9D, + 0x97, 0x91, 0x89, 0x7C, 0x70, 0x69, 0x65, 0x63, 0x67, 0x72, 0x7C, 0x7D, 0x76, 0x71, 0x72, 0x72, + 0x70, 0x71, 0x79, 0x86, 0x90, 0x96, 0x99, 0x99, 0x8E, 0x79, 0x64, 0x58, 0x58, 0x5B, 0x5D, 0x62, + 0x69, 0x74, 0x7F, 0x8C, 0x9D, 0xAE, 0xBB, 0xC2, 0xC4, 0xC0, 0xB4, 0xA2, 0x92, 0x81, 0x6C, 0x57, + 0x4A, 0x44, 0x3E, 0x36, 0x30, 0x30, 0x3C, 0x59, 0x7F, 0x9D, 0xAC, 0xB2, 0xB8, 0xB9, 0xB1, 0xA1, + 0x94, 0x8A, 0x80, 0x75, 0x70, 0x70, 0x6D, 0x64, 0x60, 0x65, 0x6B, 0x72, 0x80, 0x9A, 0xB5, 0xC4, + 0xC8, 0xCC, 0xD5, 0xD8, 0xCC, 0xB2, 0x98, 0x82, 0x6B, 0x51, 0x3D, 0x33, 0x2C, 0x22, 0x17, 0x17, + 0x25, 0x3B, 0x50, 0x61, 0x79, 0x9B, 0xBD, 0xCF, 0xD0, 0xCA, 0xC2, 0xB4, 0x99, 0x76, 0x5B, 0x4F, + 0x4B, 0x49, 0x48, 0x4D, 0x5A, 0x68, 0x70, 0x71, 0x72, 0x7F, 0x96, 0xAD, 0xBF, 0xCE, 0xDB, 0xDF, + 0xD7, 0xC7, 0xB2, 0x97, 0x79, 0x62, 0x57, 0x54, 0x55, 0x5A, 0x65, 0x6E, 0x71, 0x6E, 0x6C, 0x6A, + 0x67, 0x66, 0x6A, 0x70, 0x71, 0x6B, 0x67, 0x69, 0x6A, 0x65, 0x5D, 0x58, 0x59, 0x5F, 0x69, 0x79, + 0x8C, 0xA0, 0xB1, 0xBB, 0xBE, 0xB9, 0xB2, 0xB0, 0xB4, 0xBB, 0xBF, 0xC2, 0xC2, 0xBC, 0xAB, 0x91, + 0x77, 0x62, 0x57, 0x52, 0x52, 0x55, 0x5C, 0x64, 0x69, 0x63, 0x56, 0x4A, 0x48, 0x4F, 0x58, 0x61, + 0x69, 0x71, 0x78, 0x7A, 0x75, 0x6A, 0x5D, 0x55, 0x54, 0x5A, 0x66, 0x76, 0x85, 0x8A, 0x88, 0x87, + 0x8D, 0x98, 0x9F, 0xA1, 0xA1, 0xA1, 0xA2, 0xA7, 0xB2, 0xBF, 0xC1, 0xB5, 0xA3, 0x93, 0x88, 0x81, + 0x83, 0x8E, 0x99, 0x9E, 0x9C, 0x9B, 0x9B, 0x9A, 0x95, 0x8F, 0x87, 0x7C, 0x70, 0x68, 0x62, 0x5C, + 0x59, 0x5B, 0x60, 0x5E, 0x56, 0x52, 0x55, 0x5B, 0x61, 0x6F, 0x8B, 0xAB, 0xBA, 0xB2, 0x9E, 0x8C, + 0x7F, 0x78, 0x76, 0x7D, 0x8C, 0x9D, 0xA4, 0x9F, 0x90, 0x7D, 0x68, 0x56, 0x4A, 0x49, 0x50, 0x60, + 0x73, 0x86, 0x8F, 0x89, 0x7B, 0x6B, 0x5E, 0x58, 0x5B, 0x63, 0x68, 0x69, 0x6B, 0x71, 0x77, 0x7F, + 0x8F, 0xA7, 0xB8, 0xBA, 0xB8, 0xBB, 0xC2, 0xC3, 0xBC, 0xB1, 0xA9, 0xA3, 0x9B, 0x8E, 0x7A, 0x63, + 0x4D, 0x40, 0x3D, 0x47, 0x5A, 0x70, 0x80, 0x8A, 0x95, 0xA1, 0xA9, 0xAB, 0xA8, 0xA4, 0x9E, 0x9A, + 0x97, 0x92, 0x83, 0x68, 0x45, 0x24, 0x10, 0x0F, 0x22, 0x40, 0x5C, 0x71, 0x83, 0x92, 0x98, 0x95, + 0x93, 0x9B, 0xA8, 0xB1, 0xAD, 0xA0, 0x92, 0x84, 0x76, 0x65, 0x55, 0x50, 0x58, 0x68, 0x7A, 0x8B, + 0x9A, 0xA4, 0xA7, 0xA5, 0xA0, 0x96, 0x84, 0x6E, 0x5C, 0x53, 0x4E, 0x47, 0x3B, 0x31, 0x2E, 0x32, + 0x38, 0x3F, 0x4D, 0x61, 0x77, 0x8C, 0xA2, 0xBC, 0xD6, 0xEA, 0xF5, 0xFC, 0xFF, 0xF9, 0xE3, 0xC3, + 0xA4, 0x8C, 0x79, 0x6A, 0x62, 0x62, 0x62, 0x5A, 0x4C, 0x3F, 0x3C, 0x44, 0x53, 0x64, 0x74, 0x7E, + 0x80, 0x7C, 0x76, 0x6F, 0x66, 0x5D, 0x59, 0x5D, 0x68, 0x73, 0x7B, 0x80, 0x81, 0x7F, 0x7A, 0x76, + 0x77, 0x7D, 0x82, 0x87, 0x8C, 0x92, 0x98, 0x9D, 0x9E, 0x9B, 0x97, 0x94, 0x92, 0x91, 0x93, 0x97, + 0x9C, 0x9D, 0x9B, 0x98, 0x97, 0x97, 0x96, 0x94, 0x90, 0x8D, 0x8A, 0x86, 0x7F, 0x75, 0x6B, 0x62, + 0x5B, 0x53, 0x4B, 0x44, 0x40, 0x40, 0x44, 0x4C, 0x56, 0x62, 0x6D, 0x77, 0x7B, 0x7D, 0x7F, 0x83, + 0x89, 0x90, 0x96, 0x9C, 0xA3, 0xAA, 0xAD, 0xAE, 0xAF, 0xB4, 0xBD, 0xC5, 0xC9, 0xC6, 0xBF, 0xB5, + 0xAB, 0xA2, 0x98, 0x8C, 0x7E, 0x70, 0x63, 0x59, 0x53, 0x50, 0x50, 0x54, 0x5B, 0x65, 0x6D, 0x74, + 0x77, 0x7A, 0x7D, 0x81, 0x87, 0x8D, 0x8F, 0x8D, 0x87, 0x7F, 0x73, 0x67, 0x5C, 0x57, 0x54, 0x51, + 0x4E, 0x4F, 0x53, 0x5A, 0x62, 0x69, 0x6E, 0x75, 0x83, 0x95, 0xA7, 0xB3, 0xB8, 0xBB, 0xB9, 0xB3, + 0xA5, 0x95, 0x86, 0x78, 0x6C, 0x62, 0x5B, 0x59, 0x5D, 0x66, 0x73, 0x83, 0x94, 0xA2, 0xAC, 0xB5, + 0xBC, 0xC1, 0xC1, 0xBC, 0xB3, 0xA9, 0x9E, 0x93, 0x88, 0x7C, 0x70, 0x65, 0x5B, 0x54, 0x52, 0x56, + 0x5E, 0x67, 0x6E, 0x71, 0x72, 0x72, 0x73, 0x77, 0x7B, 0x7D, 0x7C, 0x79, 0x77, 0x76, 0x73, 0x6E, + 0x65, 0x5C, 0x55, 0x51, 0x51, 0x55, 0x5C, 0x62, 0x67, 0x6A, 0x70, 0x7A, 0x89, 0x97, 0xA1, 0xA5, + 0xA5, 0xA5, 0xA4, 0xA1, 0x9B, 0x93, 0x8A, 0x83, 0x7F, 0x7F, 0x80, 0x80, 0x7D, 0x79, 0x76, 0x76, + 0x75, 0x71, 0x6B, 0x66, 0x66, 0x6C, 0x75, 0x7F, 0x88, 0x90, 0x96, 0x98, 0x97, 0x95, 0x95, 0x98, + 0x9A, 0x98, 0x90, 0x84, 0x7A, 0x74, 0x73, 0x73, 0x72, 0x70, 0x6E, 0x6E, 0x71, 0x75, 0x7B, 0x80, + 0x85, 0x88, 0x8B, 0x8C, 0x8D, 0x8D, 0x8E, 0x8F, 0x90, 0x90, 0x8E, 0x8B, 0x87, 0x82, 0x7D, 0x78, + 0x73, 0x6C, 0x64, 0x5B, 0x52, 0x4A, 0x46, 0x48, 0x51, 0x5C, 0x66, 0x6D, 0x74, 0x7B, 0x84, 0x8D, + 0x92, 0x94, 0x93, 0x92, 0x92, 0x91, 0x8E, 0x8C, 0x8C, 0x8F, 0x91, 0x92, 0x92, 0x94, 0x98, 0x9B, + 0x99, 0x94, 0x8F, 0x8D, 0x8C, 0x8B, 0x8A, 0x8A, 0x8B, 0x8A, 0x85, 0x7F, 0x7B, 0x7A, 0x7A, 0x7B, + 0x7B, 0x7E, 0x81, 0x85, 0x86, 0x86, 0x85, 0x84, 0x83, 0x80, 0x7E, 0x7A, 0x76, 0x71, 0x6D, 0x6A, + 0x69, 0x6B, 0x70, 0x74, 0x76, 0x76, 0x7A, 0x80, 0x88, 0x8D, 0x91, 0x97, 0x9E, 0xA1, 0xA1, 0x9E, + 0x99, 0x93, 0x8C, 0x84, 0x7B, 0x70, 0x65, 0x5C, 0x56, 0x53, 0x52, 0x54, 0x57, 0x5C, 0x60, 0x64, + 0x68, 0x6C, 0x72, 0x7B, 0x86, 0x91, 0x98, 0x9B, 0x9C, 0x9D, 0x9E, 0x9C, 0x99, 0x96, 0x95, 0x97, + 0x99, 0x9A, 0x99, 0x98, 0x97, 0x97, 0x95, 0x91, 0x8D, 0x8A, 0x87, 0x82, 0x7B, 0x74, 0x6E, 0x6A, + 0x68, 0x67, 0x6A, 0x6E, 0x74, 0x79, 0x7B, 0x7B, 0x7A, 0x79, 0x79, 0x7C, 0x80, 0x82, 0x80, 0x7D, + 0x7A, 0x77, 0x74, 0x70, 0x6D, 0x6C, 0x6E, 0x72, 0x75, 0x78, 0x7B, 0x7F, 0x82, 0x84, 0x86, 0x88, + 0x8C, 0x8F, 0x91, 0x8F, 0x8B, 0x86, 0x81, 0x7A, 0x72, 0x6A, 0x66, 0x63, 0x62, 0x60, 0x5D, 0x5C, + 0x5C, 0x5D, 0x60, 0x64, 0x6B, 0x75, 0x7F, 0x87, 0x8D, 0x91, 0x93, 0x92, 0x90, 0x8C, 0x89, 0x88, + 0x89, 0x8A, 0x8B, 0x8E, 0x93, 0x98, 0x9A, 0x9D, 0xA0, 0xA5, 0xA7, 0xA7, 0xA5, 0xA2, 0x9F, 0x9B, + 0x94, 0x8D, 0x85, 0x7D, 0x76, 0x70, 0x6D, 0x6B, 0x6A, 0x6A, 0x6B, 0x6D, 0x70, 0x73, 0x73, 0x71, + 0x6D, 0x6B, 0x6C, 0x6B, 0x69, 0x66, 0x67, 0x6C, 0x72, 0x77, 0x7A, 0x7C, 0x80, 0x83, 0x84, 0x85, + 0x88, 0x8D, 0x91, 0x90, 0x8D, 0x89, 0x86, 0x83, 0x7F, 0x7B, 0x78, 0x77, 0x77, 0x77, 0x79, 0x7D, + 0x81, 0x84, 0x86, 0x87, 0x89, 0x8B, 0x8D, 0x8F, 0x8F, 0x8E, 0x8C, 0x8A, 0x88, 0x86, 0x85, 0x83, + 0x82, 0x81, 0x80, 0x7F, 0x7F, 0x7E, 0x7D, 0x7A, 0x78, 0x76, 0x76, 0x77, 0x7A, 0x7E, 0x83, 0x87, + 0x8A, 0x8E, 0x90, 0x91, 0x90, 0x8D, 0x8A, 0x87, 0x85, 0x85, 0x84, 0x84, 0x84, 0x81, 0x7E, 0x7A, + 0x77, 0x75, 0x73, 0x71, 0x6F, 0x6F, 0x70, 0x73, 0x74, 0x75, 0x75, 0x75, 0x76, 0x77, 0x7A, 0x7E, + 0x82, 0x85, 0x87, 0x88, 0x8A, 0x8C, 0x8D, 0x8B, 0x87, 0x81, 0x7D, 0x7A, 0x79, 0x78, 0x79, 0x79, + 0x7A, 0x7C, 0x7F, 0x82, 0x85, 0x86, 0x87, 0x88, 0x8A, 0x8B, 0x8C, 0x8C, 0x8C, 0x8B, 0x89, 0x88, + 0x87, 0x87, 0x88, 0x88, 0x86, 0x84, 0x82, 0x80, 0x7D, 0x7A, 0x76, 0x72, 0x70, 0x6E, 0x6E, 0x70, + 0x73, 0x75, 0x76, 0x75, 0x76, 0x77, 0x7A, 0x7C, 0x7C, 0x7B, 0x7B, 0x7B, 0x7C, 0x7D, 0x7D, 0x7D, + 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x81, 0x81, 0x81, 0x80, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7E, + 0x7F, 0x80, 0x80, 0x81, 0x82, 0x84, 0x85, 0x85, 0x86, 0x85, 0x86, 0x86, 0x85, 0x84, 0x83, 0x83, + 0x81, 0x7E, 0x7B, 0x7A, 0x79, 0x78, 0x78, 0x79, 0x7B, 0x7E, 0x82, 0x85, 0x88, 0x8A, 0x8D, 0x8F, + 0x92, 0x95, 0x95, 0x93, 0x8F, 0x8A, 0x86, 0x83, 0x81, 0x7E, 0x79, 0x75, 0x71, 0x6F, 0x6E, 0x6D, + 0x6D, 0x6E, 0x70, 0x72, 0x75, 0x77, 0x79, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x79, 0x78, 0x76, 0x75, + 0x73, 0x73, 0x74, 0x76, 0x78, 0x7A, 0x7B, 0x7B, 0x7C, 0x7E, 0x80, 0x84, 0x88, 0x8B, 0x8F, 0x92, + 0x93, 0x93, 0x91, 0x8F, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7B, 0x79, 0x78, 0x76, 0x74, 0x74, + 0x75, 0x77, 0x79, 0x79, 0x79, 0x7A, 0x7B, 0x7E, 0x80, 0x82, 0x83, 0x84, 0x86, 0x88, 0x89, 0x8A, + 0x8A, 0x8A, 0x8A, 0x8B, 0x8B, 0x8B, 0x8B, 0x8A, 0x88, 0x86, 0x83, 0x82, 0x81, 0x82, 0x82, 0x81, + 0x80, 0x7F, 0x7E, 0x7D, 0x7C, 0x7B, 0x7B, 0x7C, 0x7C, 0x7C, 0x7B, 0x7B, 0x7A, 0x78, 0x76, 0x74, + 0x73, 0x72, 0x72, 0x72, 0x72, 0x72, 0x73, 0x74, 0x76, 0x79, 0x7B, 0x7D, 0x7F, 0x81, 0x82, 0x85, + 0x87, 0x89, 0x8A, 0x8B, 0x8D, 0x8F, 0x91, 0x91, 0x91, 0x90, 0x8E, 0x8C, 0x8A, 0x88, 0x86, 0x84, + 0x83, 0x81, 0x80, 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, 0x7C, 0x7B, 0x7B, 0x7B, 0x7B, 0x7A, 0x7A, 0x7A, + 0x7B, 0x7E, 0x81, 0x83, 0x84, 0x84, 0x83, 0x82, 0x80, 0x7D, 0x7B, 0x7A, 0x79, 0x79, 0x79, 0x7A, + 0x7A, 0x7B, 0x7C, 0x7E, 0x81, 0x83, 0x85, 0x86, 0x87, 0x87, 0x87, 0x85, 0x83, 0x81, 0x7F, 0x7C, + 0x7A, 0x77, 0x75, 0x74, 0x74, 0x74, 0x76, 0x78, 0x7B, 0x7E, 0x81, 0x83, 0x85, 0x86, 0x88, 0x89, + 0x89, 0x88, 0x87, 0x87, 0x86, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x85, 0x84, 0x82, 0x80, 0x7E, + 0x7C, 0x7B, 0x79, 0x78, 0x76, 0x76, 0x76, 0x76, 0x74, 0x73, 0x73, 0x74, 0x75, 0x76, 0x77, 0x77, + 0x78, 0x7A, 0x7C, 0x7E, 0x7F, 0x81, 0x83, 0x84, 0x85, 0x86, 0x87, 0x87, 0x88, 0x89, 0x8A, 0x8A, + 0x8A, 0x89, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x85, 0x83, 0x81, 0x7F, 0x7C, 0x7A, + 0x77, 0x75, 0x73, 0x72, 0x72, 0x73, 0x73, 0x73, 0x73, 0x72, 0x72, 0x73, 0x75, 0x77, 0x7B, 0x7E, + 0x81, 0x83, 0x85, 0x87, 0x8A, 0x8B, 0x8D, 0x8D, 0x8D, 0x8C, 0x8A, 0x89, 0x87, 0x85, 0x84, 0x83, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, + 0x7C, 0x7C, 0x7B, 0x7A, 0x79, 0x79, 0x79, 0x7A, 0x7C, 0x7E, 0x80, 0x81, 0x82, 0x82, 0x81, 0x80, + 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x80, + 0x7F, 0x7E, 0x7D, 0x7C, 0x7B, 0x7A, 0x79, 0x78, 0x78, 0x78, 0x79, 0x7A, 0x7B, 0x7D, 0x7F, 0x81, + 0x84, 0x87, 0x8A, 0x8B, 0x8C, 0x8D, 0x8D, 0x8C, 0x8B, 0x8A, 0x8A, 0x89, 0x87, 0x85, 0x83, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7D, 0x7B, 0x79, 0x77, 0x76, 0x75, 0x75, 0x76, + 0x77, 0x77, 0x78, 0x79, 0x7B, 0x7D, 0x80, 0x82, 0x83, 0x84, 0x83, 0x82, 0x81, 0x80, 0x80, 0x80, + 0x81, 0x81, 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x83, 0x82, 0x81, + 0x81, 0x80, 0x80, 0x7F, 0x7D, 0x7C, 0x79, 0x77, 0x76, 0x75, 0x75, 0x75, 0x76, 0x76, 0x77, 0x79, + 0x7B, 0x7D, 0x80, 0x83, 0x86, 0x88, 0x8A, 0x8B, 0x8B, 0x8B, 0x8A, 0x89, 0x88, 0x87, 0x86, 0x85, + 0x84, 0x82, 0x80, 0x7E, 0x7D, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7C, 0x7B, 0x7B, 0x7A, 0x79, 0x78, + 0x78, 0x77, 0x77, 0x78, 0x78, 0x79, 0x7A, 0x7A, 0x7A, 0x7B, 0x7B, 0x7C, 0x7E, 0x80, 0x82, 0x82, + 0x82, 0x82, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, + 0x88, 0x88, 0x87, 0x84, 0x82, 0x7F, 0x7D, 0x7B, 0x7A, 0x7A, 0x7A, 0x7B, 0x7C, 0x7C, 0x7D, 0x7E, + 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x88, 0x87, 0x87, 0x86, 0x85, 0x84, + 0x83, 0x81, 0x80, 0x7E, 0x7D, 0x7B, 0x79, 0x78, 0x76, 0x76, 0x76, 0x77, 0x78, 0x78, 0x79, 0x79, + 0x7A, 0x7A, 0x79, 0x79, 0x78, 0x78, 0x77, 0x77, 0x77, 0x77, 0x78, 0x78, 0x79, 0x7B, 0x7D, 0x7F, + 0x81, 0x82, 0x84, 0x84, 0x85, 0x85, 0x85, 0x85, 0x86, 0x87, 0x87, 0x88, 0x87, 0x87, 0x86, 0x86, + 0x85, 0x84, 0x83, 0x82, 0x81, 0x7F, 0x7D, 0x7C, 0x7B, 0x7A, 0x7A, 0x7A, 0x7A, 0x7B, 0x7B, 0x7B, + 0x7B, 0x7C, 0x7D, 0x7F, 0x81, 0x83, 0x85, 0x86, 0x86, 0x87, 0x88, 0x8A, 0x8C, 0x8E, 0x8F, 0x8F, + 0x8F, 0x8D, 0x8C, 0x8A, 0x88, 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x80, 0x7E, 0x7C, 0x7A, 0x79, + 0x78, 0x77, 0x76, 0x75, 0x73, 0x72, 0x71, 0x70, 0x6F, 0x70, 0x71, 0x73, 0x75, 0x77, 0x79, 0x7B, + 0x7C, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x80, 0x82, 0x83, 0x85, 0x86, 0x86, 0x86, 0x87, 0x87, 0x87, + 0x88, 0x88, 0x88, 0x87, 0x87, 0x87, 0x87, 0x86, 0x85, 0x83, 0x82, 0x80, 0x7F, 0x7D, 0x7C, 0x7B, + 0x7A, 0x7A, 0x7A, 0x7B, 0x7C, 0x7E, 0x7F, 0x80, 0x81, 0x83, 0x84, 0x86, 0x88, 0x89, 0x8B, 0x8B, + 0x8C, 0x8C, 0x8C, 0x8B, 0x8A, 0x88, 0x86, 0x83, 0x81, 0x7E, 0x7D, 0x7B, 0x7A, 0x78, 0x77, 0x76, + 0x75, 0x74, 0x73, 0x72, 0x72, 0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x74, 0x75, 0x75, 0x77, 0x78, + 0x79, 0x7B, 0x7D, 0x7E, 0x80, 0x82, 0x83, 0x84, 0x85, 0x85, 0x86, 0x87, 0x88, 0x89, 0x89, 0x88, + 0x88, 0x87, 0x86, 0x85, 0x85, 0x85, 0x84, 0x84, 0x83, 0x83, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7C, + 0x7B, 0x79, 0x78, 0x77, 0x77, 0x78, 0x78, 0x79, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, + 0x81, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7E, 0x7C, 0x7B, 0x7A, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x7A, 0x7B, 0x7C, + 0x7C, 0x7D, 0x7D, 0x7E, 0x7E, 0x7F, 0x80, 0x80, 0x82, 0x83, 0x84, 0x86, 0x87, 0x89, 0x8A, 0x8B, + 0x8B, 0x8A, 0x8A, 0x89, 0x88, 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x82, 0x81, 0x80, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x81, 0x80, 0x80, 0x7F, 0x7D, 0x7C, 0x7C, 0x7B, 0x7B, 0x7C, 0x7C, + 0x7D, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7E, 0x7D, 0x7C, + 0x7B, 0x7B, 0x7A, 0x7A, 0x79, 0x78, 0x77, 0x76, 0x76, 0x76, 0x77, 0x79, 0x7A, 0x7C, 0x7C, 0x7D, + 0x7D, 0x7E, 0x7E, 0x7F, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x87, 0x88, 0x88, 0x89, 0x8A, + 0x8B, 0x8C, 0x8D, 0x8D, 0x8D, 0x8D, 0x8C, 0x8B, 0x89, 0x87, 0x85, 0x83, 0x82, 0x80, 0x7F, 0x7D, + 0x7C, 0x7A, 0x79, 0x78, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x79, 0x79, 0x7A, 0x7B, 0x7B, + 0x7C, 0x7C, 0x7D, 0x7D, 0x7D, 0x7C, 0x7C, 0x7D, 0x7D, 0x7E, 0x7E, 0x7F, 0x81, 0x81, 0x82, 0x82, + 0x82, 0x81, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x7F, 0x7E, 0x7E, 0x7D, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, + 0x83, 0x84, 0x84, 0x85, 0x86, 0x87, 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x86, 0x85, 0x84, 0x83, + 0x81, 0x80, 0x7F, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7B, + 0x7B, 0x7B, 0x7B, 0x7A, 0x7A, 0x7B, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7E, 0x7D, + 0x7D, 0x7D, 0x7D, 0x7D, 0x7C, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7E, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x82, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x85, 0x85, + 0x86, 0x86, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x85, 0x83, 0x82, 0x80, 0x7F, 0x7E, + 0x7C, 0x7B, 0x7A, 0x79, 0x79, 0x79, 0x79, 0x7A, 0x7A, 0x7B, 0x7C, 0x7C, 0x7B, 0x7A, 0x79, 0x79, + 0x78, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7C, 0x7D, 0x7D, 0x7D, 0x7E, 0x7F, 0x80, 0x80, 0x81, 0x82, + 0x82, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x83, 0x83, 0x81, 0x80, 0x7F, 0x7F, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x84, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x84, 0x83, 0x83, 0x82, 0x80, 0x80, 0x7F, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, 0x7D, 0x7C, 0x7B, 0x7A, 0x79, 0x78, 0x77, 0x77, 0x77, + 0x78, 0x79, 0x79, 0x79, 0x79, 0x7A, 0x7A, 0x7B, 0x7C, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, + 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, 0x85, 0x85, 0x86, 0x87, 0x87, + 0x87, 0x86, 0x86, 0x85, 0x84, 0x83, 0x83, 0x82, 0x83, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, + 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7E, 0x7D, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, + 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7E, 0x7E, 0x7D, + 0x7D, 0x7C, 0x7C, 0x7B, 0x7C, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, + 0x82, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7F, + 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x7F, 0x7F, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, 0x7D, 0x7E, 0x7E, 0x7F, 0x7E, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, + 0x7D, 0x7E, 0x7E, 0x7F, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x82, 0x82, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, + 0x7D, 0x7C, 0x7C, 0x7D, 0x7D, 0x7E, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, + 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x80, 0x7E, 0x7D, 0x7C, 0x7C, 0x7B, 0x7B, 0x7B, 0x7B, 0x7C, + 0x7C, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, + 0x7D, 0x7D, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, + 0x83, 0x82, 0x81, 0x81, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, + 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x81, 0x81, 0x80, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x83, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, + 0x80, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7B, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7D, + 0x7D, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7C, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7E, 0x7F, 0x7F, 0x80, + 0x80, 0x80, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x86, 0x86, 0x85, 0x84, 0x84, 0x83, 0x82, + 0x82, 0x82, 0x81, 0x81, 0x80, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, + 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x7F, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x7F, 0x7F, 0x7E, 0x7D, 0x7D, + 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7F, 0x80, 0x80, 0x80, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, + 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, 0x7E, 0x7E, + 0x7E, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7F, + 0x7F, 0x80, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, 0x85, 0x84, 0x84, 0x84, 0x83, + 0x82, 0x81, 0x80, 0x80, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7E, 0x7F, + 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7E, 0x7D, 0x7D, 0x7D, 0x7E, + 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x7F, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7C, 0x7B, 0x7B, 0x7B, 0x7C, 0x7D, 0x7D, 0x7E, 0x7F, 0x7F, + 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, + 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x7F, 0x7F, + 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x85, 0x85, 0x86, 0x85, 0x85, 0x85, + 0x84, 0x84, 0x83, 0x83, 0x82, 0x83, 0x82, 0x82, 0x82, 0x81, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x80, 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7B, 0x7C, + 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7B, 0x7B, 0x7B, 0x7C, 0x7C, 0x7D, 0x7E, 0x7F, 0x7F, + 0x7F, 0x7F, 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x81, 0x81, + 0x82, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, + 0x80, 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, 0x82, 0x83, 0x83, 0x84, 0x83, 0x83, 0x82, 0x82, 0x82, + 0x81, 0x80, 0x80, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, 0x7D, + 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x7F, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, + 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7F, 0x7F, 0x7E, + 0x7D, 0x7D, 0x7C, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, + 0x81, 0x81, 0x81, 0x80, 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, + 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80 +}; diff --git a/startup.h b/startup.h new file mode 100644 index 0000000..41b93a3 --- /dev/null +++ b/startup.h @@ -0,0 +1,49 @@ +// startup.h + +#ifndef STARTUP_H +#define STARTUP_H + + +/* Found in the *start.S file, implemented in assembler */ + +extern void _start( void ); + +extern void _enable_interrupts( void ); + +extern int _disable_interrupts( void ); + +extern unsigned int _get_cpsr(); + +extern unsigned int _get_stack_pointer(); + +extern void _enable_unaligned_access(); + +extern void _enable_l1_cache(); + +extern void _invalidate_icache(); + +extern void _invalidate_dcache(); + +extern void _clean_invalidate_dcache(); + +extern void _invalidate_dcache_mva(void *address); + +extern void _clean_invalidate_dcache_mva(void *address); + +extern void _invalidate_dtlb(); + +extern void _invalidate_dtlb_mva(void *address); + +extern void _data_memory_barrier(); + +extern unsigned int _get_core(); + +extern void _init_core(); + +extern void _spin_core(); + +#ifdef HAS_40PINS +extern void _toggle_test_pin(int count); +#endif + +#endif diff --git a/stb_image.h b/stb_image.h new file mode 100644 index 0000000..a056138 --- /dev/null +++ b/stb_image.h @@ -0,0 +1,7187 @@ +/* stb_image - v2.16 - public domain image loader - http://nothings.org/stb_image.h + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8/16-bit-per-channel + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels, 8/16 bit-per-channel) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes + Fabian "ryg" Giesen + Arseny Kapoulkine + John-Mark Allen + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan + Dave Moore Roy Eltham Hayaki Saito Nathan Reed + Won Chun Luke Graham Johan Duparc Nick Verigakis + the Horde3D community Thomas Ruf Ronny Chevalier Baldur Karlsson + Janez Zemva John Bartholomew Michal Cichon github:rlyeh + Jonathan Blow Ken Hamada Tero Hanninen github:romigrou + Laurent Gomila Cort Stratton Sergio Gonzalez github:svdijk + Aruelien Pocheville Thibault Reuille Cass Everitt github:snagar + Ryamond Barbiero Paul Du Bois Engin Manap github:Zelex + Michaelangel007@github Philipp Wiesemann Dale Weiler github:grim210 + Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:sammyhw + Blazej Dariusz Roszkowski Gregory Mullen github:phprus + Christian Floisand Kevin Schmidt github:poppolopoppo +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 16-bit-per-channel PNG +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - no 1-bit BMP +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below for HDR usage): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data) +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy to use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// make more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small source code footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image now supports loading HDR images in general, and currently +// the Radiance .HDR file format, although the support is provided +// generically. You can still load any file through the existing interface; +// if you attempt to load an HDR file, it will be automatically remapped to +// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// iPhone PNG support: +// +// By default we convert iphone-formatted PNGs back to RGB, even though +// they are internally encoded differently. You can disable this conversion +// by by calling stbi_convert_iphone_png_to_rgb(0), in which case +// you will always just get the native iphone "format" through (which +// is BGR stored in RGB). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// + + +#ifndef STBI_NO_STDIO +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +typedef struct +{ + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof) (void *user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); + #endif +#endif + +#ifndef STBI_NO_HDR + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); + STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif // STBI_NO_HDR + +#ifndef STBI_NO_LINEAR + STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); + STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_LINEAR + +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename); +STBIDEF int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// NOT THREADSAFE +STBIDEF const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); + +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); +STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) + #ifndef STBI_ONLY_JPEG + #define STBI_NO_JPEG + #endif + #ifndef STBI_ONLY_PNG + #define STBI_NO_PNG + #endif + #ifndef STBI_ONLY_BMP + #define STBI_NO_BMP + #endif + #ifndef STBI_ONLY_PSD + #define STBI_NO_PSD + #endif + #ifndef STBI_ONLY_TGA + #define STBI_NO_TGA + #endif + #ifndef STBI_ONLY_GIF + #define STBI_NO_GIF + #endif + #ifndef STBI_ONLY_HDR + #define STBI_NO_HDR + #endif + #ifndef STBI_ONLY_PIC + #define STBI_NO_PIC + #endif + #ifndef STBI_ONLY_PNM + #define STBI_NO_PNM + #endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + + +#ifdef _MSC_VER +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +static int stbi__sse2_available(void) +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +static int stbi__sse2_available(void) +{ + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +// assume GCC or Clang on ARM targets +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original, *img_buffer_original_end; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context *s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stbi__stdio_skip(void *user, int n) +{ + fseek((FILE*) user, n, SEEK_CUR); +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context *s, FILE *f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test(stbi__context *s); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNG +static int stbi__png_test(stbi__context *s); +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test(stbi__context *s); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_TGA +static int stbi__tga_test(stbi__context *s); +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s); +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_HDR +static int stbi__hdr_test(stbi__context *s); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_test(stbi__context *s); +static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test(stbi__context *s); +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context *s); +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +// this is not threadsafe +static const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} + +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} + +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define stbi__err(x,y) stbi__err(y) +#else + #define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void *retval_from_stbi_load) +{ + STBI_FREE(retval_from_stbi_load); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static int stbi__vertically_flip_on_load = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load = flag_true_if_should_flip; +} + +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + + #ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNG + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_BMP + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_GIF + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PSD + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); + #endif + #ifndef STBI_NO_PIC + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + #ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + return stbi__tga_load(s,x,y,comp,req_comp, ri); + #endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi_uc *reduced; + + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc *bytes = (stbi_uc *)image; + + for (row = 0; row < (h>>1); row++) { + stbi_uc *row0 = bytes + row*bytes_per_row; + stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + if (ri.bits_per_channel != 8) { + STBI_ASSERT(ri.bits_per_channel == 16); + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; +} + +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + if (ri.bits_per_channel != 16) { + STBI_ASSERT(ri.bits_per_channel == 8); + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#ifndef STBI_NO_HDR +static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__vertically_flip_on_load && result != NULL) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); + } +} +#endif + +#ifndef STBI_NO_STDIO + +static FILE *stbi__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + unsigned char *result; + if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + +#endif //!STBI_NO_STDIO + +STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } + #endif + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + float *result; + FILE *f = stbi__fopen(filename, "rb"); + if (!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s,f); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_file(&s,f); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(f); + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); + return 0; + #endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; + +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#endif + +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; + +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer(stbi__context *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start+1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +stbi_inline static int stbi__at_eof(stbi__context *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} + +static void stbi__skip(stbi__context *s, int n) +{ + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} + +static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} + +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} + +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le(stbi__context *s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le(stbi__context *s) +{ + stbi__uint32 z = stbi__get16le(s); + return z + (stbi__get16le(s) << 16); +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + + +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); + if (good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; + default: STBI_ASSERT(0); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} + +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; + default: STBI_ASSERT(0); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + stbi__context *s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi__uint16 dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + +// sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + +// definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + stbi_uc *data; + void *raw_data, *raw_coeff; + stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + +// kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman *h, int *count) +{ + int i,j,k=0,code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) + for (j=0; j < count[i]; ++j) + h->size[k++] = (stbi_uc) (i+1); + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16) (code++); + if (code-1 >= (1 << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (stbi_uc) i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (~0U << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); + + sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB + k = stbi_lrot(j->code_buffer, n); + STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask))); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & ~sgn); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static stbi_uc stbi__jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) +{ + int diff,dc,k; + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + diff = t ? stbi__extend_receive(j, t) : 0; + + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc << j->succ_low); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) << shift); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) << shift); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k++]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } else { + if (r == 0) { + *p = (short) s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) << 12) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) +{ + int i,val[64],*v=val; + stbi_uc *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0] << 2; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0+t3) >> 17); + o[7] = stbi__clamp((x0-t3) >> 17); + o[1] = stbi__clamp((x1+t2) >> 17); + o[6] = stbi__clamp((x1-t2) >> 17); + o[2] = stbi__clamp((x2+t1) >> 17); + o[5] = stbi__clamp((x2-t1) >> 17); + o[3] = stbi__clamp((x3+t0) >> 17); + o[4] = stbi__clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg *j) +{ + stbi_uc x; + if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8(j->s); + if (x != 0xff) return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); // consume repeated 0xff fill bytes + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg *z) +{ + stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg *z, int m) +{ + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker","Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s)-2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4, sixteen = (p != 0); + int t = q & 15,i; + if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); + if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + + for (i=0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s)-2; + while (L > 0) { + stbi_uc *v; + int sizes[16],i,n=0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < n; ++i) + v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L==0; + } + + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); + return 1; + } + + return stbi__err("unknown marker","Corrupt JPEG"); +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg *z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; // no match + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +static int stbi__process_frame_header(stbi__jpeg *z, int scan) +{ + stbi__context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires + c = stbi__get8(s); + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + + z->rgb = 0; + for (i=0; i < s->img_n; ++i) { + static unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8(s); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); + } + + if (scan != STBI__SCAN_load) return 1; + + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + if (z->progressive) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) +{ + int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z,m)) return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if (!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) +{ + int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) return 0; + if (!stbi__parse_entropy_coded_data(j)) return 0; + if (j->marker == STBI__MARKER_none ) { + // handle 0s at the end of image data from IP Kamera 9060 + while (!stbi__at_eof(j->s)) { + int x = stbi__get8(j->s); + if (x == 255) { + j->marker = stbi__get8(j->s); + break; + } + } + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) stbi__err("bad DNL height", "Corrupt JPEG"); + } else { + if (!stbi__process_marker(j, m)) return 0; + } + m = stbi__get_marker(j); + } + if (j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = stbi__div4(n+input[i-1]); + out[i*2+1] = stbi__div4(n+input[i+1]); + } + out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = stbi__div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + STBI_NOTUSED(in_far); + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg *j) +{ + stbi__free_jpeg_components(j, j->s->img_n, 0); +} + +typedef struct +{ + resample_row_func resample; + stbi_uc *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n, is_rgb; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if (z->s->img_n == 3 && n < 3 && !is_rgb) + decode_n = 1; + else + decode_n = z->s->img_n; + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4]; + + stbi__resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); + if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + stbi_uc *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc *y = coutput[0]; + if (z->s->img_n == 3) { + if (is_rgb) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; + } + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x,y,comp,req_comp); + STBI_FREE(j); + return result; +} + +static int stbi__jpeg_test(stbi__context *s) +{ + int r; + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); + stbi__rewind(s); + STBI_FREE(j); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) +{ + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; + return 1; +} + +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) +{ + int result; + stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[288]; + stbi__uint16 value[288]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); + z->size [c] = (stbi_uc ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + if (z->zbuffer >= z->zbuffer_end) return 0; + return *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + STBI_ASSERT(z->code_buffer < (1U << z->num_bits)); + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s == 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + STBI_ASSERT(z->size[b] == s); + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) stbi__fill_bits(a); + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes +{ + char *q; + int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (int) (z->zout - z->zout_start); + limit = old_limit = (int) (z->zout_end - z->zout_start); + while (cur + n > limit) + limit *= 2; + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static int stbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + stbi_uc *p; + int len,dist; + if (z == 256) { + a->zout = zout; + return 1; + } + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (zout + len > a->zout_end) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286+32+137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < ntot) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (stbi_uc) c; + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) + c = stbi__zreceive(a,3)+3; + else { + STBI_ASSERT(c == 18); + c = stbi__zreceive(a,7)+11; + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); + n += c; + } + } + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncompressed_block(stbi__zbuf *a) +{ + stbi_uc header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + STBI_ASSERT(a->num_bits == 0); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static const stbi_uc stbi__zdefault_length[288] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} +*/ + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer+len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context *s) +{ + static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + stbi_uc *idata, *expanded, *out; + int depth; +} stbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filters used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static int stbi__paeth(int a, int b, int c) +{ + int p = a + b - c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); + if (pa <= pb && pa <= pc) return a; + if (pb <= pc) return b; + return c; +} + +static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16? 2 : 1); + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n*bytes; + stbi__uint32 img_len, img_width_bytes; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + img_len = (img_width_bytes + 1) * y; + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *prior; + int filter = *raw++; + + if (filter > 4) + return stbi__err("invalid filter","Corrupt PNG"); + + if (depth < 8) { + STBI_ASSERT(img_width_bytes <= x); + cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place + filter_bytes = 1; + width = img_width_bytes; + } + prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // handle first byte explicitly + for (k=0; k < filter_bytes; ++k) { + switch (filter) { + case STBI__F_none : cur[k] = raw[k]; break; + case STBI__F_sub : cur[k] = raw[k]; break; + case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; + case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; + case STBI__F_avg_first : cur[k] = raw[k]; break; + case STBI__F_paeth_first: cur[k] = raw[k]; break; + } + } + + if (depth == 8) { + if (img_n != out_n) + cur[img_n] = 255; // first pixel + raw += img_n; + cur += out_n; + prior += out_n; + } else if (depth == 16) { + if (img_n != out_n) { + cur[filter_bytes] = 255; // first pixel top byte + cur[filter_bytes+1] = 255; // first pixel bottom byte + } + raw += filter_bytes; + cur += output_bytes; + prior += output_bytes; + } else { + raw += 1; + cur += 1; + prior += 1; + } + + // this is a little gross, so that we don't switch per-pixel or per-component + if (depth < 8 || img_n == out_n) { + int nk = (width - 1)*filter_bytes; + #define STBI__CASE(f) \ + case f: \ + for (k=0; k < nk; ++k) + switch (filter) { + // "none" filter turns into a memcpy here; make that explicit. + case STBI__F_none: memcpy(cur, raw, nk); break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; + } + #undef STBI__CASE + raw += nk; + } else { + STBI_ASSERT(img_n+1 == out_n); + #define STBI__CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ + for (k=0; k < filter_bytes; ++k) + switch (filter) { + STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; + } + #undef STBI__CASE + + // the loop above sets the high byte of the pixels' alpha, but for + // 16 bit png files we also need the low byte set. we'll do that here. + if (depth == 16) { + cur = a->out + stride*j; // start at the beginning of the row again + for (i=0; i < x; ++i,cur+=output_bytes) { + cur[filter_bytes+1] = 255; + } + } + } + } + + // we make a separate pass to expand bits to pixels; for performance, + // this could run two scanlines behind the above code, so it won't + // intefere with filtering but will still be in the cache. + if (depth < 8) { + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; + // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit + // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + + // note that the final byte might overshoot and write more data than desired. + // we can allocate enough data that this never writes out of memory, but it + // could also overwrite the next scanline. can it overwrite non-empty data + // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. + // so we need to explicitly clamp the final ones + + if (depth == 4) { + for (k=x*img_n; k >= 2; k-=2, ++in) { + *cur++ = scale * ((*in >> 4) ); + *cur++ = scale * ((*in ) & 0x0f); + } + if (k > 0) *cur++ = scale * ((*in >> 4) ); + } else if (depth == 2) { + for (k=x*img_n; k >= 4; k-=4, ++in) { + *cur++ = scale * ((*in >> 6) ); + *cur++ = scale * ((*in >> 4) & 0x03); + *cur++ = scale * ((*in >> 2) & 0x03); + *cur++ = scale * ((*in ) & 0x03); + } + if (k > 0) *cur++ = scale * ((*in >> 6) ); + if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); + if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); + } else if (depth == 1) { + for (k=x*img_n; k >= 8; k-=8, ++in) { + *cur++ = scale * ((*in >> 7) ); + *cur++ = scale * ((*in >> 6) & 0x01); + *cur++ = scale * ((*in >> 5) & 0x01); + *cur++ = scale * ((*in >> 4) & 0x01); + *cur++ = scale * ((*in >> 3) & 0x01); + *cur++ = scale * ((*in >> 2) & 0x01); + *cur++ = scale * ((*in >> 1) & 0x01); + *cur++ = scale * ((*in ) & 0x01); + } + if (k > 0) *cur++ = scale * ((*in >> 7) ); + if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); + if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); + if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); + if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); + if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); + if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); + } + if (img_n != out_n) { + int q; + // insert alpha = 255 + cur = a->out + stride*j; + if (img_n == 1) { + for (q=x-1; q >= 0; --q) { + cur[q*2+1] = 255; + cur[q*2+0] = cur[q]; + } + } else { + STBI_ASSERT(img_n == 3); + for (q=x-1; q >= 0; --q) { + cur[q*4+3] = 255; + cur[q*4+2] = cur[q*3+2]; + cur[q*4+1] = cur[q*3+1]; + cur[q*4+0] = cur[q*3+0]; + } + } + } + } + } else if (depth == 16) { + // force the image data from big-endian to platform-native. + // this is done in a separate pass due to the decoding relying + // on the data being untouched, but could probably be done + // per-line during decode if care is taken. + stbi_uc *cur = a->out; + stbi__uint16 *cur16 = (stbi__uint16*)cur; + + for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { + *cur16 = (cur[0] << 8) | cur[1]; + } + } + + return 1; +} + +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + stbi_uc *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load = 0; +static int stbi__de_iphone_flag = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag = flag_true_if_should_convert; +} + +static void stbi__de_iphone(stbi__png *z) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + STBI_ASSERT(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = ( t * 255 + half) / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n=0; + stbi_uc has_trans=0, tc[3]; + stbi__uint16 tc16[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0, is_iphone=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + if (scan == STBI__SCAN_header) return 1; + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + // if SCAN_header, have to scan to see if we have a tRNS + } + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); + if (z->expanded == NULL) return 0; // zlib should set error + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE(z->expanded); z->expanded = NULL; + return 1; + } + + default: + // if critical, fail + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); + #endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) +{ + void *result=NULL; + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth < 8) + ri->bits_per_channel = 8; + else + ri->bits_per_channel = p->depth; + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp, ri); +} + +static int stbi__png_test(stbi__context *s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +{ + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context *s) +{ + int r; + int sz; + if (stbi__get8(s) != 'B') return 0; + if (stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context *s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) n += 16, z >>= 16; + if (z >= 0x00100) n += 8, z >>= 8; + if (z >= 0x00010) n += 4, z >>= 4; + if (z >= 0x00004) n += 2, z >>= 2; + if (z >= 0x00002) n += 1, z >>= 1; + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +static int stbi__shiftsigned(int v, int shift, int bits) +{ + int result; + int z=0; + + if (shift < 0) v <<= -shift; + else v >>= shift; + result = v; + + z = bits; + while (z < 8) { + result += v >> z; + z += bits; + } + return result; +} + +typedef struct +{ + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; +} stbi__bmp_data; + +static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) +{ + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + info->bpp = stbi__get16le(s); + if (info->bpp == 1) return stbi__errpuc("monochrome", "BMP type not supported: 1-bit"); + if (hsz != 12) { + int compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (info->bpp == 16 || info->bpp == 32) { + if (compress == 0) { + if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } else { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } + } else if (compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + // not documented, but generated by photoshop and handled by mspaint + if (info->mr == info->mg && info->mg == info->mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); + stbi__get32le(s); // discard color space + for (i=0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + } + return (void *) 1; +} + + +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, all_a; + stbi_uc pal[256][4]; + int psize=0,i,j,width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - 14 - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - 14 - info.hsz) >> 2; + } + + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (info.bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (info.hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 4) width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) width = s->img_x; + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + stbi__skip(s, info.offset - 14 - info.hsz); + if (info.bpp == 24) width = 3 * s->img_x; + else if (info.bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (info.bpp == 24) { + easy = 1; + } else if (info.bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z+2] = stbi__get8(s); + out[z+1] = stbi__get8(s); + out[z+0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; + if (target == 4) out[z++] = a; + } + } else { + int bpp = info.bpp; + for (i=0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); + int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; + if (target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) + out[i] = 255; + + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i], p1[i] = p2[i], p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if(is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: return STBI_grey; + case 16: if(is_grey) return STBI_grey_alpha; + // else: fall-through + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fall-through + case 32: return bits_per_pixel/8; + default: return 0; + } +} + +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8(s); // discard Offset + tga_colormap_type = stbi__get8(s); // colormap type + if( tga_colormap_type > 1 ) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8(s); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s,9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le(s); + if( tga_w < 1 ) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if( tga_h < 1 ) { + stbi__rewind(s); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; + } + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context *s) +{ + int res = 0; + int sz, tga_color_type; + stbi__get8(s); // discard Offset + tga_color_type = stbi__get8(s); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + stbi__skip(s,4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s,9); // skip colormap specification and image x/y origin + } + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height + sz = stbi__get8(s); // bits per pixel + if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: + stbi__rewind(s); + return res; +} + +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((b * 255)/31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp, tga_rgb16=0; + int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4] = {0}; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED(ri); + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) *comp = tga_comp; + + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); + if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { + for (i=0; i < tga_height; ++i) { + int row = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if ( tga_indexed) + { + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); + if (!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (tga_rgb16) { + stbi_uc *pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i=0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if ( pal_idx >= tga_palette_len ) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { + // read in the data raw + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + STBI_FREE( tga_palette ); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) + { + unsigned char* tga_pixel = tga_data; + for (i=0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) +{ + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w,h; + stbi_uc *out; + STBI_NOTUSED(ri); + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s,stbi__get32be(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s) ); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + + // Create the destination image. + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *) stbi__malloc(4 * w*h); + + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++, p += 4) + *p = (channel == 3 ? 255 : 0); + } else { + // Read the RLE data. + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + if (channel >= channelCount) { + // Fill this channel with default data. + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } + } else { + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } + } + } + } + + // convert to desired output format + if (req_comp && req_comp != 4) { + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + if (comp) *comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4(stbi__context *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context *s) +{ + int i; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + stbi__get8(s); + + if (!stbi__pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} stbi__pic_packet; + +static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); + dest[i]=stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return stbi__errpuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return stbi__errpuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=stbi__get8(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (stbi_uc) left; + + if (!stbi__readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + + if (count==128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file","scanline overrun"); + + if (!stbi__readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return stbi__errpuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) +{ + stbi_uc *result; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); + memset(result, 0xff, x*y*4); + + if (!stbi__pic_load_core(s,x,y,comp, result)) { + STBI_FREE(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=stbi__convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi__pic_test(stbi__context *s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out, *old_out; // output buffer (always 4 components) + int flags, bgindex, ratio, transparent, eflags, delay; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[4096]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context *s) +{ + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') return 0; + if (stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context *s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) +{ + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); + stbi__rewind( s ); + return 0; + } + if (x) *x = g->w; + if (y) *y = g->h; + STBI_FREE(g); + return 1; +} + +static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) +{ + stbi_uc *p, *c; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + p = &g->out[g->cur_x + g->cur_y]; + c = &g->color_table[g->codes[code].suffix * 4]; + + if (c[3] >= 128) { + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) +{ + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = stbi__get8(s); + if (lzw_cs > 12) return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) return stbi__errpuc("no clear code", "Corrupt GIF"); + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 4096) return stbi__errpuc("too many codes", "Corrupt GIF"); + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +static void stbi__fill_gif_background(stbi__gif *g, int x0, int y0, int x1, int y1) +{ + int x, y; + stbi_uc *c = g->pal[g->bgindex]; + for (y = y0; y < y1; y += 4 * g->w) { + for (x = x0; x < x1; x += 4) { + stbi_uc *p = &g->out[y + x]; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = 0; + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp) +{ + int i; + stbi_uc *prev_out = 0; + + if (g->out == 0 && !stbi__gif_header(s, g, comp,0)) + return 0; // stbi__g_failure_reason set by stbi__gif_header + + if (!stbi__mad3sizes_valid(g->w, g->h, 4, 0)) + return stbi__errpuc("too large", "GIF too large"); + + prev_out = g->out; + g->out = (stbi_uc *) stbi__malloc_mad3(4, g->w, g->h, 0); + if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); + + switch ((g->eflags & 0x1C) >> 2) { + case 0: // unspecified (also always used on 1st frame) + stbi__fill_gif_background(g, 0, 0, 4 * g->w, 4 * g->w * g->h); + break; + case 1: // do not dispose + if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h); + g->old_out = prev_out; + break; + case 2: // dispose to background + if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h); + stbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y); + break; + case 3: // dispose to previous + if (g->old_out) { + for (i = g->start_y; i < g->max_y; i += 4 * g->w) + memcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x); + } + break; + } + + for (;;) { + switch (stbi__get8(s)) { + case 0x2C: /* Image Descriptor */ + { + int prev_trans = -1; + stbi__int32 x, y, w, h; + stbi_uc *o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + if (g->transparent >= 0 && (g->eflags & 0x01)) { + prev_trans = g->pal[g->transparent][3]; + g->pal[g->transparent][3] = 0; + } + g->color_table = (stbi_uc *) g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (o == NULL) return NULL; + + if (prev_trans != -1) + g->pal[g->transparent][3] = (stbi_uc) prev_trans; + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + if (stbi__get8(s) == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + g->delay = stbi__get16le(s); + g->transparent = stbi__get8(s); + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) + stbi__skip(s, len); + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } + + STBI_NOTUSED(req_comp); +} + +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *u = 0; + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + memset(g, 0, sizeof(*g)); + STBI_NOTUSED(ri); + + u = stbi__gif_load_next(s, g, comp, req_comp); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + if (u) { + *x = g->w; + *y = g->h; + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g->w, g->h); + } + else if (g->out) + STBI_FREE(g->out); + STBI_FREE(g); + return u; +} + +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) +{ + return stbi__gif_info_raw(s,x,y,comp); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context *s, const char *signature) +{ + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + stbi__rewind(s); + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); + stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN-1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + const char *headerToken; + STBI_NOTUSED(ri); + + // Check identifier + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + + // Read data + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } + + for (k = 0; k < 4; ++k) { + int nleft; + i = 0; + while ((nleft = width - i) > 0) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i=0; i < width; ++i) + stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + if (scanline) + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (stbi__hdr_test(s) == 0) { + stbi__rewind( s ); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) +{ + void *p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + stbi__rewind( s ); + if (p == NULL) + return 0; + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) *comp = info.ma ? 4 : 3; + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) +{ + int channelCount, dummy; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + if (stbi__get16be(s) != 8) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained,dummy; + stbi__pic_packet packets[10]; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) { + stbi__rewind( s); + return 0; + } + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind( s ); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi__rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) +// Does not support 16-bit-per-channel + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + STBI_NOTUSED(ri); + + if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) + return 0; + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + + if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + stbi__getn(s, out, s->img_n * s->img_x * s->img_y); + + if (req_comp && req_comp != s->img_n) { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) + *c = (char) stbi__get8(s); + } +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv, dummy; + char c, p, t; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + stbi__rewind(s); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + + if (maxv > 255) + return stbi__err("max value > 255", "PPM image not 8-bit"); + else + return 1; +} +#endif + +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +{ + #ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) return 1; + #endif + + // test tga last because it's a crappy test! + #ifndef STBI_NO_TGA + if (stbi__tga_info(s, x, y, comp)) + return 1; + #endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s,x,y,comp); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/stb_image_config.h b/stb_image_config.h new file mode 100644 index 0000000..b1405f8 --- /dev/null +++ b/stb_image_config.h @@ -0,0 +1,21 @@ +#ifndef STB_IMAGE_CONFIG_H +#define STB_IMAGE_CONFIG_H + +#define STBI_NO_JPEG +#define STBI_NO_BMP +#define STBI_NO_PSD +#define STBI_NO_TGA +#define STBI_NO_HDR +#define STBI_NO_PIC +#define STBI_NO_PNM + +#define STBI_NO_LINEAR +#define STBI_NO_HDR + +#define STBI_NO_STDIO + +#define STB_IMAGE_IMPLEMENTATION + +#include "stb_image.h" + +#endif diff --git a/types.h b/types.h new file mode 100644 index 0000000..b308ae8 --- /dev/null +++ b/types.h @@ -0,0 +1,13 @@ +#ifndef types_h +#define types_h + +#include +#include +#include "integer.h" + +typedef unsigned long long u64; + +typedef signed long long s64; + + +#endif diff --git a/uspi/include/uspi.h b/uspi/include/uspi.h new file mode 100644 index 0000000..78f4001 --- /dev/null +++ b/uspi/include/uspi.h @@ -0,0 +1,216 @@ +// +// uspi.h +// +// Services provided by the USPi library +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_h +#define _uspi_h + +#ifdef __cplusplus +extern "C" { +#endif + +// +// USPi initialization +// + +// returns 0 on failure +int USPiInitialize (void); + +// +// Keyboard device +// +struct TUSBKeyboardDevice; + +// returns != 0 if available +int USPiKeyboardAvailable (void); + +// "cooked mode" +typedef void TUSPiKeyPressedHandler (const char *pString); +void USPiKeyboardRegisterKeyPressedHandler (TUSPiKeyPressedHandler *pKeyPressedHandler); + +// This handler is called when Ctrl-Alt-Del is pressed. +typedef void TUSPiShutdownHandler (void); +void USPiKeyboardRegisterShutdownHandler (TUSPiShutdownHandler *pShutdownHandler); + +// "raw mode" (if this handler is registered the others are ignored) +// The raw handler is called when the keyboard sends a status report (on status change and/or continously). +typedef void TUSPiKeyStatusHandlerRaw (struct TUSBKeyboardDevice* device, unsigned char ucModifiers, + const unsigned char RawKeys[6]); // key code or 0 in each byte +void USPiKeyboardRegisterKeyStatusHandlerRaw (TUSPiKeyStatusHandlerRaw *pKeyStatusHandlerRaw); + +// ucModifiers (bit is set if modifier key is pressed) +#define LCTRL (1 << 0) +#define LSHIFT (1 << 1) +#define ALT (1 << 2) +#define LWIN (1 << 3) +#define RCTRL (1 << 4) +#define RSHIFT (1 << 5) +#define ALTGR (1 << 6) +#define RWIN (1 << 7) + +// +// Mouse device +// + +// returns != 0 if available +int USPiMouseAvailable (void); + +// The status handler is called when the mouse sends a status report. +typedef void TUSPiMouseStatusHandler (unsigned nButtons, + int nDisplacementX, // -127..127 + int nDisplacementY); // -127..127 +void USPiMouseRegisterStatusHandler (TUSPiMouseStatusHandler *pStatusHandler); + +// nButtons (bit is set if button is pressed) +#define MOUSE_BUTTON1 (1 << 0) +#define MOUSE_BUTTON2 (1 << 1) +#define MOUSE_BUTTON3 (1 << 2) + +// ucModifiers (bit is set if modifier key is pressed) +#define LCTRL (1 << 0) +#define LSHIFT (1 << 1) +#define ALT (1 << 2) +#define LWIN (1 << 3) +#define RCTRL (1 << 4) +#define RSHIFT (1 << 5) +#define ALTGR (1 << 6) +#define RWIN (1 << 7) + +// +// Mass storage device +// + +// returns number of available devices +int USPiMassStorageDeviceAvailable (void); + +#define USPI_BLOCK_SIZE 512 // other block sizes are not supported + +// ullOffset and nCount must be multiple of USPI_BLOCK_SIZE +// returns number of read bytes or < 0 on failure +// nDeviceIndex is 0-based +int USPiMassStorageDeviceRead (unsigned long long ullOffset, void *pBuffer, unsigned nCount, unsigned nDeviceIndex); + +// ullOffset and nCount must be multiple of USPI_BLOCK_SIZE +// returns number of written bytes or < 0 on failure +// nDeviceIndex is 0-based +int USPiMassStorageDeviceWrite (unsigned long long ullOffset, const void *pBuffer, unsigned nCount, unsigned nDeviceIndex); + +// returns the number of available blocks of USPI_BLOCK_SIZE or 0 on failure +unsigned USPiMassStorageDeviceGetCapacity (unsigned nDeviceIndex); + +// +// Ethernet services +// +// (You should delay 2 seconds after USPiInitialize before accessing the Ethernet.) +// + +// checks the controller only, not if Ethernet link is up +// returns != 0 if available +int USPiEthernetAvailable (void); + +void USPiGetMACAddress (unsigned char Buffer[6]); + +// returns 0 on failure +int USPiSendFrame (const void *pBuffer, unsigned nLength); + +// pBuffer must have size USPI_FRAME_BUFFER_SIZE +// returns 0 if no frame is available or on failure +#define USPI_FRAME_BUFFER_SIZE 1600 +int USPiReceiveFrame (void *pBuffer, unsigned *pResultLength); + +// +// GamePad device +// + +// returns number of available devices +int USPiGamePadAvailable (void); + +#define MAX_AXIS 6 +#define MAX_HATS 6 + +typedef struct USPiGamePadState +{ + int naxes; + struct + { + int value; + int minimum; + int maximum; + } axes[MAX_AXIS]; + + int nhats; + int hats[MAX_HATS]; + + int nbuttons; + unsigned int buttons; +} +USPiGamePadState; + +// returns 0 on failure +const USPiGamePadState *USPiGamePadGetStatus (unsigned nDeviceIndex); // nDeviceIndex is 0-based + +typedef void TGamePadStatusHandler (unsigned nDeviceIndex, const USPiGamePadState *pGamePadState); +void USPiGamePadRegisterStatusHandler (TGamePadStatusHandler *pStatusHandler); + +// +// MIDI device +// + +// returns != 0 if a MIDI device is available +int USPiMIDIAvailable (void); + +// The packet handler is called once for each MIDI event packet received from the device. +typedef void TUSPiMIDIPacketHandler (unsigned nCable, unsigned nLength, u8 *pPacket); +void USPiMIDIRegisterPacketHandler (TUSPiMIDIPacketHandler *pPacketHandler); + +// +// USB device information +// + +#define KEYBOARD_CLASS 1 +#define MOUSE_CLASS 2 +#define STORAGE_CLASS 3 +#define ETHERNET_CLASS 4 +#define GAMEPAD_CLASS 5 +#define MIDI_CLASS 6 + +typedef struct TUSPiDeviceInformation +{ + // from USB device descriptor + unsigned short idVendor; + unsigned short idProduct; + unsigned short bcdDevice; + + // points to a buffer in the USPi library, empty string if not available + const char *pManufacturer; + const char *pProduct; +} +TUSPiDeviceInformation; + +// returns 0 on failure +int USPiDeviceGetInformation (unsigned nClass, // see above + unsigned nDeviceIndex, // 0-based index + TUSPiDeviceInformation *pInfo); // provided buffer is filled + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/assert.h b/uspi/include/uspi/assert.h new file mode 100644 index 0000000..358b69b --- /dev/null +++ b/uspi/include/uspi/assert.h @@ -0,0 +1,39 @@ +// +// assert.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_assert_h +#define _uspi_assert_h + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef NDEBUG + #define assert(expr) ((void) 0) +#else + void uspi_assertion_failed (const char *pExpr, const char *pFile, unsigned nLine); + + #define assert(expr) ((expr) ? ((void) 0) : uspi_assertion_failed (#expr, __FILE__, __LINE__)) +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/bcm2835.h b/uspi/include/uspi/bcm2835.h new file mode 100644 index 0000000..16e81f1 --- /dev/null +++ b/uspi/include/uspi/bcm2835.h @@ -0,0 +1,59 @@ +// +// bcm2835.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014-2017 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_bcm2835_h +#define _uspi_bcm2835_h + +#include + +#if RASPPI == 1 +#define ARM_IO_BASE 0x20000000 +#else +#define ARM_IO_BASE 0x3F000000 +#endif + +#define GPU_IO_BASE 0x7E000000 + +#define GPU_CACHED_BASE 0x40000000 +#define GPU_UNCACHED_BASE 0xC0000000 + +#if RASPPI == 1 + #ifdef GPU_L2_CACHE_ENABLED + #define GPU_MEM_BASE GPU_CACHED_BASE + #else + #define GPU_MEM_BASE GPU_UNCACHED_BASE + #endif +#else + #define GPU_MEM_BASE GPU_UNCACHED_BASE +#endif + +// Convert physical ARM address into bus address +// (does even work, if a bus address is provided already) +#define BUS_ADDRESS(phys) (((phys) & ~0xC0000000) | GPU_MEM_BASE) + +// +// USB Host Controller +// +#define ARM_USB_BASE (ARM_IO_BASE + 0x980000) + +#define ARM_USB_CORE_BASE ARM_USB_BASE +#define ARM_USB_HOST_BASE (ARM_USB_BASE + 0x400) +#define ARM_USB_POWER (ARM_USB_BASE + 0xE00) + +#endif diff --git a/uspi/include/uspi/devicenameservice.h b/uspi/include/uspi/devicenameservice.h new file mode 100644 index 0000000..000c871 --- /dev/null +++ b/uspi/include/uspi/devicenameservice.h @@ -0,0 +1,49 @@ +// +// devicenameservice.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_devicenameservice_h +#define _uspi_devicenameservice_h + +#include + +typedef struct TDeviceInfo +{ + struct TDeviceInfo *pNext; + char *pName; + void *pDevice; + boolean bBlockDevice; +} +TDeviceInfo; + +typedef struct TDeviceNameService +{ + TDeviceInfo *m_pList; +} +TDeviceNameService; + +void DeviceNameService (TDeviceNameService *pThis); +void _DeviceNameService (TDeviceNameService *pThis); + +void DeviceNameServiceAddDevice (TDeviceNameService *pThis, const char *pName, void *pDevice, boolean bBlockDevice); + +void *DeviceNameServiceGetDevice (TDeviceNameService *pThis, const char *pName, boolean bBlockDevice); + +TDeviceNameService *DeviceNameServiceGet (void); + +#endif diff --git a/uspi/include/uspi/dwhci.h b/uspi/include/uspi/dwhci.h new file mode 100644 index 0000000..337ca5e --- /dev/null +++ b/uspi/include/uspi/dwhci.h @@ -0,0 +1,239 @@ +// +// dwhci.h +// +// The information in this file is from the Linux HS OTG driver +// which is Copyright by Synopsys Inc. +// See the file lib/README! +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_dwhci_h +#define _uspi_dwhci_h + +#include + +#define DWHCI_MAX_CHANNELS 16 + +#define DWHCI_DATA_FIFO_SIZE 0x1000 + +// +// Core Registers +// +#define DWHCI_CORE_OTG_CTRL (ARM_USB_CORE_BASE + 0x000) + #define DWHCI_CORE_OTG_CTRL_HST_SET_HNP_EN (1 << 10) +#define DWHCI_CORE_OTG_INT (ARM_USB_CORE_BASE + 0x004) +#define DWHCI_CORE_AHB_CFG (ARM_USB_CORE_BASE + 0x008) + #define DWHCI_CORE_AHB_CFG_GLOBALINT_MASK (1 << 0) + #define DWHCI_CORE_AHB_CFG_MAX_AXI_BURST__SHIFT 1 // BCM2835 only + #define DWHCI_CORE_AHB_CFG_MAX_AXI_BURST__MASK (3 << 1) // BCM2835 only + #define DWHCI_CORE_AHB_CFG_WAIT_AXI_WRITES (1 << 4) // BCM2835 only + #define DWHCI_CORE_AHB_CFG_DMAENABLE (1 << 5) + #define DWHCI_CORE_AHB_CFG_AHB_SINGLE (1 << 23) +#define DWHCI_CORE_USB_CFG (ARM_USB_CORE_BASE + 0x00C) + #define DWHCI_CORE_USB_CFG_PHYIF (1 << 3) + #define DWHCI_CORE_USB_CFG_ULPI_UTMI_SEL (1 << 4) + #define DWHCI_CORE_USB_CFG_SRP_CAPABLE (1 << 8) + #define DWHCI_CORE_USB_CFG_HNP_CAPABLE (1 << 9) + #define DWHCI_CORE_USB_CFG_ULPI_FSLS (1 << 17) + #define DWHCI_CORE_USB_CFG_ULPI_CLK_SUS_M (1 << 19) + #define DWHCI_CORE_USB_CFG_ULPI_EXT_VBUS_DRV (1 << 20) + #define DWHCI_CORE_USB_CFG_TERM_SEL_DL_PULSE (1 << 22) +#define DWHCI_CORE_RESET (ARM_USB_CORE_BASE + 0x010) + #define DWHCI_CORE_RESET_SOFT_RESET (1 << 0) + #define DWHCI_CORE_RESET_RX_FIFO_FLUSH (1 << 4) + #define DWHCI_CORE_RESET_TX_FIFO_FLUSH (1 << 5) + #define DWHCI_CORE_RESET_TX_FIFO_NUM__SHIFT 6 + #define DWHCI_CORE_RESET_TX_FIFO_NUM__MASK (0x1F << 6) + #define DWHCI_CORE_RESET_AHB_IDLE (1 << 31) +#define DWHCI_CORE_INT_STAT (ARM_USB_CORE_BASE + 0x014) + #define DWHCI_CORE_INT_STAT_SOF_INTR (1 << 3) + #define DWHCI_CORE_INT_STAT_PORT_INTR (1 << 24) + #define DWHCI_CORE_INT_STAT_HC_INTR (1 << 25) +#define DWHCI_CORE_INT_MASK (ARM_USB_CORE_BASE + 0x018) + #define DWHCI_CORE_INT_MASK_MODE_MISMATCH (1 << 1) + #define DWHCI_CORE_INT_MASK_SOF_INTR (1 << 3) + #define DWHCI_CORE_INT_MASK_RX_STS_Q_LVL (1 << 4) + #define DWHCI_CORE_INT_MASK_USB_SUSPEND (1 << 11) + #define DWHCI_CORE_INT_MASK_PORT_INTR (1 << 24) + #define DWHCI_CORE_INT_MASK_HC_INTR (1 << 25) + #define DWHCI_CORE_INT_MASK_CON_ID_STS_CHNG (1 << 28) + #define DWHCI_CORE_INT_MASK_DISCONNECT (1 << 29) + #define DWHCI_CORE_INT_MASK_SESS_REQ_INTR (1 << 30) + #define DWHCI_CORE_INT_MASK_WKUP_INTR (1 << 31) +#define DWHCI_CORE_RX_STAT_RD (ARM_USB_CORE_BASE + 0x01C) // RO, slave mode only +#define DWHCI_CORE_RX_STAT_POP (ARM_USB_CORE_BASE + 0x020) // RO, slave mode only + // for read and pop register in host mode + #define DWHCI_CORE_RX_STAT_CHAN_NUMBER__MASK 0xF + #define DWHCI_CORE_RX_STAT_BYTE_COUNT__SHIFT 4 + #define DWHCI_CORE_RX_STAT_BYTE_COUNT__MASK (0x7FF << 4) + #define DWHCI_CORE_RX_STAT_PACKET_STATUS__SHIFT 17 + #define DWHCI_CORE_RX_STAT_PACKET_STATUS__MASK (0xF << 17) + #define DWHCI_CORE_RX_STAT_PACKET_STATUS_IN 2 + #define DWHCI_CORE_RX_STAT_PACKET_STATUS_IN_XFER_COMP 3 + #define DWHCI_CORE_RX_STAT_PACKET_STATUS_DATA_TOGGLE_ERR 5 + #define DWHCI_CORE_RX_STAT_PACKET_STATUS_CHAN_HALTED 7 +#define DWHCI_CORE_RX_FIFO_SIZ (ARM_USB_CORE_BASE + 0x024) +#define DWHCI_CORE_NPER_TX_FIFO_SIZ (ARM_USB_CORE_BASE + 0x028) +#define DWHCI_CORE_NPER_TX_STAT (ARM_USB_CORE_BASE + 0x02C) // RO + #define DWHCI_CORE_NPER_TX_STAT_QUEUE_SPACE_AVL(reg) (((reg) >> 16) & 0xFF) +#define DWHCI_CORE_I2C_CTRL (ARM_USB_CORE_BASE + 0x030) +#define DWHCI_CORE_PHY_VENDOR_CTRL (ARM_USB_CORE_BASE + 0x034) +#define DWHCI_CORE_GPIO (ARM_USB_CORE_BASE + 0x038) +#define DWHCI_CORE_USER_ID (ARM_USB_CORE_BASE + 0x03C) +#define DWHCI_CORE_VENDOR_ID (ARM_USB_CORE_BASE + 0x040) +#define DWHCI_CORE_HW_CFG1 (ARM_USB_CORE_BASE + 0x044) // RO +#define DWHCI_CORE_HW_CFG2 (ARM_USB_CORE_BASE + 0x048) // RO + #define DWHCI_CORE_HW_CFG2_OP_MODE(reg) (((reg) >> 0) & 7) + #define DWHCI_CORE_HW_CFG2_ARCHITECTURE(reg) (((reg) >> 3) & 3) + #define DWHCI_CORE_HW_CFG2_HS_PHY_TYPE(reg) (((reg) >> 6) & 3) + #define DWHCI_CORE_HW_CFG2_HS_PHY_TYPE_NOT_SUPPORTED 0 + #define DWHCI_CORE_HW_CFG2_HS_PHY_TYPE_UTMI 1 + #define DWHCI_CORE_HW_CFG2_HS_PHY_TYPE_ULPI 2 + #define DWHCI_CORE_HW_CFG2_HS_PHY_TYPE_UTMI_ULPI 3 + #define DWHCI_CORE_HW_CFG2_FS_PHY_TYPE(reg) (((reg) >> 8) & 3) + #define DWHCI_CORE_HW_CFG2_FS_PHY_TYPE_DEDICATED 1 + #define DWHCI_CORE_HW_CFG2_NUM_HOST_CHANNELS(reg) ((((reg) >> 14) & 0xF) + 1) +#define DWHCI_CORE_HW_CFG3 (ARM_USB_CORE_BASE + 0x04C) // RO + #define DWHCI_CORE_HW_CFG3_DFIFO_DEPTH(reg) (((reg) >> 16) & 0xFFFF) +#define DWHCI_CORE_HW_CFG4 (ARM_USB_CORE_BASE + 0x050) // RO + #define DWHCI_CORE_HW_CFG4_DED_FIFO_EN (1 << 25) + #define DWHCI_CORE_HW_CFG4_NUM_IN_EPS(reg) (((reg) >> 26) & 0xF) +#define DWHCI_CORE_LPM_CFG (ARM_USB_CORE_BASE + 0x054) +#define DWHCI_CORE_POWER_DOWN (ARM_USB_CORE_BASE + 0x058) +#define DWHCI_CORE_DFIFO_CFG (ARM_USB_CORE_BASE + 0x05C) + #define DWHCI_CORE_DFIFO_CFG_EPINFO_BASE__SHIFT 16 + #define DWHCI_CORE_DFIFO_CFG_EPINFO_BASE__MASK (0xFFFF << 16) +#define DWHCI_CORE_ADP_CTRL (ARM_USB_CORE_BASE + 0x060) +// gap +#define DWHCI_VENDOR_MDIO_CTRL (ARM_USB_CORE_BASE + 0x080) // BCM2835 only +#define DWHCI_VENDOR_MDIO_DATA (ARM_USB_CORE_BASE + 0x084) // BCM2835 only +#define DWHCI_VENDOR_VBUS_DRV (ARM_USB_CORE_BASE + 0x088) // BCM2835 only +// gap +#define DWHCI_CORE_HOST_PER_TX_FIFO_SIZ (ARM_USB_CORE_BASE + 0x100) +// fifo := 0..14 : +#define DWHCI_CORE_DEV_PER_TX_FIFO(fifo) (ARM_USB_CORE_BASE + 0x104 + (fifo)*4) // dedicated FIFOs on +#define DWHCI_CORE_DEV_TX_FIFO(fifo) (ARM_USB_CORE_BASE + 0x104 + (fifo)*4) // dedicated FIFOs off + +// +// Host Registers +// +#define DWHCI_HOST_CFG (ARM_USB_HOST_BASE + 0x000) + #define DWHCI_HOST_CFG_FSLS_PCLK_SEL__SHIFT 0 + #define DWHCI_HOST_CFG_FSLS_PCLK_SEL__MASK (3 << 0) + #define DWHCI_HOST_CFG_FSLS_PCLK_SEL_30_60_MHZ 0 + #define DWHCI_HOST_CFG_FSLS_PCLK_SEL_48_MHZ 1 + #define DWHCI_HOST_CFG_FSLS_PCLK_SEL_6_MHZ 2 +#define DWHCI_HOST_FRM_INTERVAL (ARM_USB_HOST_BASE + 0x004) +#define DWHCI_HOST_FRM_NUM (ARM_USB_HOST_BASE + 0x008) + #define DWHCI_HOST_FRM_NUM_NUMBER(reg) ((reg) & 0xFFFF) + #define DWHCI_MAX_FRAME_NUMBER 0x3FFF + #define DWHCI_HOST_FRM_NUM_REMAINING(reg) (((reg) >> 16) & 0xFFFF) +// gap +#define DWHCI_HOST_PER_TX_FIFO_STAT (ARM_USB_HOST_BASE + 0x010) +#define DWHCI_HOST_ALLCHAN_INT (ARM_USB_HOST_BASE + 0x014) +#define DWHCI_HOST_ALLCHAN_INT_MASK (ARM_USB_HOST_BASE + 0x018) +#define DWHCI_HOST_FRMLST_BASE (ARM_USB_HOST_BASE + 0x01C) +// gap +#define DWHCI_HOST_PORT (ARM_USB_HOST_BASE + 0x040) + #define DWHCI_HOST_PORT_CONNECT (1 << 0) + #define DWHCI_HOST_PORT_CONNECT_CHANGED (1 << 1) + #define DWHCI_HOST_PORT_ENABLE (1 << 2) + #define DWHCI_HOST_PORT_ENABLE_CHANGED (1 << 3) + #define DWHCI_HOST_PORT_OVERCURRENT (1 << 4) + #define DWHCI_HOST_PORT_OVERCURRENT_CHANGED (1 << 5) + #define DWHCI_HOST_PORT_RESET (1 << 8) + #define DWHCI_HOST_PORT_POWER (1 << 12) + #define DWHCI_HOST_PORT_SPEED(reg) (((reg) >> 17) & 3) + #define DWHCI_HOST_PORT_SPEED_HIGH 0 + #define DWHCI_HOST_PORT_SPEED_FULL 1 + #define DWHCI_HOST_PORT_SPEED_LOW 2 + #define DWHCI_HOST_PORT_DEFAULT_MASK ( DWHCI_HOST_PORT_CONNECT_CHANGED \ + | DWHCI_HOST_PORT_ENABLE \ + | DWHCI_HOST_PORT_ENABLE_CHANGED \ + | DWHCI_HOST_PORT_OVERCURRENT_CHANGED) +// gap +// chan := 0..15 : +#define DWHCI_HOST_CHAN_CHARACTER(chan) (ARM_USB_HOST_BASE + 0x100 + (chan)*0x20) + #define DWHCI_HOST_CHAN_CHARACTER_MAX_PKT_SIZ__MASK 0x7FF + #define DWHCI_HOST_CHAN_CHARACTER_EP_NUMBER__SHIFT 11 + #define DWHCI_HOST_CHAN_CHARACTER_EP_NUMBER__MASK (0xF << 11) + #define DWHCI_HOST_CHAN_CHARACTER_EP_DIRECTION_IN (1 << 15) + #define DWHCI_HOST_CHAN_CHARACTER_LOW_SPEED_DEVICE (1 << 17) + #define DWHCI_HOST_CHAN_CHARACTER_EP_TYPE__SHIFT 18 + #define DWHCI_HOST_CHAN_CHARACTER_EP_TYPE__MASK (3 << 18) + #define DWHCI_HOST_CHAN_CHARACTER_EP_TYPE_CONTROL 0 + #define DWHCI_HOST_CHAN_CHARACTER_EP_TYPE_ISO 1 + #define DWHCI_HOST_CHAN_CHARACTER_EP_TYPE_BULK 2 + #define DWHCI_HOST_CHAN_CHARACTER_EP_TYPE_INTERRUPT 3 + #define DWHCI_HOST_CHAN_CHARACTER_MULTI_CNT__SHIFT 20 + #define DWHCI_HOST_CHAN_CHARACTER_MULTI_CNT__MASK (3 << 20) + #define DWHCI_HOST_CHAN_CHARACTER_DEVICE_ADDRESS__SHIFT 22 + #define DWHCI_HOST_CHAN_CHARACTER_DEVICE_ADDRESS__MASK (0x7F << 22) + #define DWHCI_HOST_CHAN_CHARACTER_PER_ODD_FRAME (1 << 29) + #define DWHCI_HOST_CHAN_CHARACTER_DISABLE (1 << 30) + #define DWHCI_HOST_CHAN_CHARACTER_ENABLE (1 << 31) +#define DWHCI_HOST_CHAN_SPLIT_CTRL(chan) (ARM_USB_HOST_BASE + 0x104 + (chan)*0x20) + #define DWHCI_HOST_CHAN_SPLIT_CTRL_PORT_ADDRESS__MASK 0x7F + #define DWHCI_HOST_CHAN_SPLIT_CTRL_HUB_ADDRESS__SHIFT 7 + #define DWHCI_HOST_CHAN_SPLIT_CTRL_HUB_ADDRESS__MASK (0x7F << 7) + #define DWHCI_HOST_CHAN_SPLIT_CTRL_XACT_POS__SHIFT 14 + #define DWHCI_HOST_CHAN_SPLIT_CTRL_XACT_POS__MASK (3 << 14) + #define DWHCI_HOST_CHAN_SPLIT_CTRL_ALL 3 + #define DWHCI_HOST_CHAN_SPLIT_CTRL_COMPLETE_SPLIT (1 << 16) + #define DWHCI_HOST_CHAN_SPLIT_CTRL_SPLIT_ENABLE (1 << 31) +#define DWHCI_HOST_CHAN_INT(chan) (ARM_USB_HOST_BASE + 0x108 + (chan)*0x20) + #define DWHCI_HOST_CHAN_INT_XFER_COMPLETE (1 << 0) + #define DWHCI_HOST_CHAN_INT_HALTED (1 << 1) + #define DWHCI_HOST_CHAN_INT_AHB_ERROR (1 << 2) + #define DWHCI_HOST_CHAN_INT_STALL (1 << 3) + #define DWHCI_HOST_CHAN_INT_NAK (1 << 4) + #define DWHCI_HOST_CHAN_INT_ACK (1 << 5) + #define DWHCI_HOST_CHAN_INT_NYET (1 << 6) + #define DWHCI_HOST_CHAN_INT_XACT_ERROR (1 << 7) + #define DWHCI_HOST_CHAN_INT_BABBLE_ERROR (1 << 8) + #define DWHCI_HOST_CHAN_INT_FRAME_OVERRUN (1 << 9) + #define DWHCI_HOST_CHAN_INT_DATA_TOGGLE_ERROR (1 << 10) + #define DWHCI_HOST_CHAN_INT_ERROR_MASK ( DWHCI_HOST_CHAN_INT_AHB_ERROR \ + | DWHCI_HOST_CHAN_INT_STALL \ + | DWHCI_HOST_CHAN_INT_XACT_ERROR \ + | DWHCI_HOST_CHAN_INT_BABBLE_ERROR \ + | DWHCI_HOST_CHAN_INT_FRAME_OVERRUN \ + | DWHCI_HOST_CHAN_INT_DATA_TOGGLE_ERROR) +#define DWHCI_HOST_CHAN_INT_MASK(chan) (ARM_USB_HOST_BASE + 0x10C + (chan)*0x20) +#define DWHCI_HOST_CHAN_XFER_SIZ(chan) (ARM_USB_HOST_BASE + 0x110 + (chan)*0x20) + #define DWHCI_HOST_CHAN_XFER_SIZ_BYTES__MASK 0x7FFFF + #define DWHCI_HOST_CHAN_XFER_SIZ_PACKETS__SHIFT 19 + #define DWHCI_HOST_CHAN_XFER_SIZ_PACKETS__MASK (0x3FF << 19) + #define DWHCI_HOST_CHAN_XFER_SIZ_PACKETS(reg) (((reg) >> 19) & 0x3FF) + #define DWHCI_HOST_CHAN_XFER_SIZ_PID__SHIFT 29 + #define DWHCI_HOST_CHAN_XFER_SIZ_PID__MASK (3 << 29) + #define DWHCI_HOST_CHAN_XFER_SIZ_PID(reg) (((reg) >> 29) & 3) + #define DWHCI_HOST_CHAN_XFER_SIZ_PID_DATA0 0 + #define DWHCI_HOST_CHAN_XFER_SIZ_PID_DATA1 2 + #define DWHCI_HOST_CHAN_XFER_SIZ_PID_DATA2 1 + #define DWHCI_HOST_CHAN_XFER_SIZ_PID_MDATA 3 // non-control transfer + #define DWHCI_HOST_CHAN_XFER_SIZ_PID_SETUP 3 +#define DWHCI_HOST_CHAN_DMA_ADDR(chan) (ARM_USB_HOST_BASE + 0x114 + (chan)*0x20) +// gap +#define DWHCI_HOST_CHAN_DMA_BUF(chan) (ARM_USB_HOST_BASE + 0x11C + (chan)*0x20) // DDMA only + +// +// Data FIFOs (non-DMA mode only) +// +#define DWHCI_DATA_FIFO(chan) (ARM_USB_HOST_BASE + 0x1000 + (chan)*DWHCI_DATA_FIFO_SIZE) + +#endif diff --git a/uspi/include/uspi/dwhcidevice.h b/uspi/include/uspi/dwhcidevice.h new file mode 100644 index 0000000..97d5cf8 --- /dev/null +++ b/uspi/include/uspi/dwhcidevice.h @@ -0,0 +1,85 @@ +// +// dwhcidevice.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _dwhcidevice_h +#define _dwhcidevice_h + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct TDWHCIDevice +{ + unsigned m_nChannels; + volatile unsigned m_nChannelAllocated; // one bit per channel, set if allocated + + TDWHCITransferStageData *m_pStageData[DWHCI_MAX_CHANNELS]; + + volatile boolean m_bWaiting; + + TDWHCIRootPort m_RootPort; +} +TDWHCIDevice; + +void DWHCIDevice (TDWHCIDevice *pThis); +void _DWHCIDevice (TDWHCIDevice *pThis); + +boolean DWHCIDeviceInitialize (TDWHCIDevice *pThis); + +// returns resulting length or < 0 on failure +int DWHCIDeviceGetDescriptor (TDWHCIDevice *pThis, TUSBEndpoint *pEndpoint, + unsigned char ucType, unsigned char ucIndex, + void *pBuffer, unsigned nBufSize, + unsigned char ucRequestType /* = REQUEST_IN */); + +boolean DWHCIDeviceSetAddress (TDWHCIDevice *pThis, TUSBEndpoint *pEndpoint, u8 ucDeviceAddress); + +boolean DWHCIDeviceSetConfiguration (TDWHCIDevice *pThis, TUSBEndpoint *pEndpoint, u8 ucConfigurationValue); + +// returns resulting length or < 0 on failure +int DWHCIDeviceControlMessage (TDWHCIDevice *pThis, TUSBEndpoint *pEndpoint, + u8 ucRequestType, u8 ucRequest, u16 usValue, u16 usIndex, + void *pData, u16 usDataSize); + +// returns resulting length or < 0 on failure +int DWHCIDeviceTransfer (TDWHCIDevice *pThis, TUSBEndpoint *pEndpoint, void *pBuffer, unsigned nBufSize); + +boolean DWHCIDeviceSubmitBlockingRequest (TDWHCIDevice *pThis, TUSBRequest *pURB); +boolean DWHCIDeviceSubmitAsyncRequest (TDWHCIDevice *pThis, TUSBRequest *pURB); + +TUSBSpeed DWHCIDeviceGetPortSpeed (TDWHCIDevice *pThis); +boolean DWHCIDeviceOvercurrentDetected (TDWHCIDevice *pThis); +void DWHCIDeviceDisableRootPort (TDWHCIDevice *pThis); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/dwhciframeschednper.h b/uspi/include/uspi/dwhciframeschednper.h new file mode 100644 index 0000000..b8f055b --- /dev/null +++ b/uspi/include/uspi/dwhciframeschednper.h @@ -0,0 +1,46 @@ +// +// dwhciframeschednper.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_dwhciframeschednper_h +#define _uspi_dwhciframeschednper_h + +#include +#include + +typedef struct TDWHCIFrameSchedulerNonPeriodic +{ + TDWHCIFrameScheduler m_DWHCIFrameScheduler; + + unsigned m_nState; + unsigned m_nTries; +} +TDWHCIFrameSchedulerNonPeriodic; + +void DWHCIFrameSchedulerNonPeriodic (TDWHCIFrameSchedulerNonPeriodic *pThis); +void _DWHCIFrameSchedulerNonPeriodic (TDWHCIFrameScheduler *pBase); + +void DWHCIFrameSchedulerNonPeriodicStartSplit (TDWHCIFrameScheduler *pBase); +boolean DWHCIFrameSchedulerNonPeriodicCompleteSplit (TDWHCIFrameScheduler *pBase); +void DWHCIFrameSchedulerNonPeriodicTransactionComplete (TDWHCIFrameScheduler *pBase, u32 nStatus); + +void DWHCIFrameSchedulerNonPeriodicWaitForFrame (TDWHCIFrameScheduler *pBase); + +boolean DWHCIFrameSchedulerNonPeriodicIsOddFrame (TDWHCIFrameScheduler *pBase); + +#endif diff --git a/uspi/include/uspi/dwhciframeschednsplit.h b/uspi/include/uspi/dwhciframeschednsplit.h new file mode 100644 index 0000000..beb53e2 --- /dev/null +++ b/uspi/include/uspi/dwhciframeschednsplit.h @@ -0,0 +1,46 @@ +// +// dwhciframeschednsplit.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_dwhciframeschednsplit_h +#define _uspi_dwhciframeschednsplit_h + +#include +#include + +typedef struct TDWHCIFrameSchedulerNoSplit +{ + TDWHCIFrameScheduler m_DWHCIFrameScheduler; + + boolean m_bIsPeriodic; + unsigned m_nNextFrame; +} +TDWHCIFrameSchedulerNoSplit; + +void DWHCIFrameSchedulerNoSplit (TDWHCIFrameSchedulerNoSplit *pThis, boolean bIsPeriodic); +void _DWHCIFrameSchedulerNoSplit (TDWHCIFrameScheduler *pBase); + +void DWHCIFrameSchedulerNoSplitStartSplit (TDWHCIFrameScheduler *pBase); +boolean DWHCIFrameSchedulerNoSplitCompleteSplit (TDWHCIFrameScheduler *pBase); +void DWHCIFrameSchedulerNoSplitTransactionComplete (TDWHCIFrameScheduler *pBase, u32 nStatus); + +void DWHCIFrameSchedulerNoSplitWaitForFrame (TDWHCIFrameScheduler *pBase); + +boolean DWHCIFrameSchedulerNoSplitIsOddFrame (TDWHCIFrameScheduler *pBase); + +#endif diff --git a/uspi/include/uspi/dwhciframeschedper.h b/uspi/include/uspi/dwhciframeschedper.h new file mode 100644 index 0000000..c9088db --- /dev/null +++ b/uspi/include/uspi/dwhciframeschedper.h @@ -0,0 +1,48 @@ +// +// dwhciframeschedper.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_dwhciframeschedper_h +#define _uspi_dwhciframeschedper_h + +#include +#include + +typedef struct TDWHCIFrameSchedulerPeriodic +{ + TDWHCIFrameScheduler m_DWHCIFrameScheduler; + + unsigned m_nState; + unsigned m_nTries; + + unsigned m_nNextFrame; +} +TDWHCIFrameSchedulerPeriodic; + +void DWHCIFrameSchedulerPeriodic (TDWHCIFrameSchedulerPeriodic *pThis); +void _DWHCIFrameSchedulerPeriodic (TDWHCIFrameScheduler *pBase); + +void DWHCIFrameSchedulerPeriodicStartSplit (TDWHCIFrameScheduler *pBase); +boolean DWHCIFrameSchedulerPeriodicCompleteSplit (TDWHCIFrameScheduler *pBase); +void DWHCIFrameSchedulerPeriodicTransactionComplete (TDWHCIFrameScheduler *pBase, u32 nStatus); + +void DWHCIFrameSchedulerPeriodicWaitForFrame (TDWHCIFrameScheduler *pBase); + +boolean DWHCIFrameSchedulerPeriodicIsOddFrame (TDWHCIFrameScheduler *pBase); + +#endif diff --git a/uspi/include/uspi/dwhciframescheduler.h b/uspi/include/uspi/dwhciframescheduler.h new file mode 100644 index 0000000..508e39f --- /dev/null +++ b/uspi/include/uspi/dwhciframescheduler.h @@ -0,0 +1,47 @@ +// +// dwhciframescheduler.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_dwhciframescheduler_h +#define _uspi_dwhciframescheduler_h + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct TDWHCIFrameScheduler +{ + void (*_DWHCIFrameScheduler) (struct TDWHCIFrameScheduler *pThis); + + void (*StartSplit) (struct TDWHCIFrameScheduler *pThis); + boolean (*CompleteSplit) (struct TDWHCIFrameScheduler *pThis); + void (*TransactionComplete) (struct TDWHCIFrameScheduler *pThis, u32 nStatus); + + void (*WaitForFrame) (struct TDWHCIFrameScheduler *pThis); + + boolean (*IsOddFrame) (struct TDWHCIFrameScheduler *pThis); +} +TDWHCIFrameScheduler; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/dwhciregister.h b/uspi/include/uspi/dwhciregister.h new file mode 100644 index 0000000..d786dfa --- /dev/null +++ b/uspi/include/uspi/dwhciregister.h @@ -0,0 +1,68 @@ +// +// dwhciregister.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_dwhciregister_h +#define _uspi_dwhciregister_h + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct TDWHCIRegister +{ + boolean m_bValid; + u32 m_nAddress; + u32 m_nBuffer; +} +TDWHCIRegister; + +void DWHCIRegister (TDWHCIRegister *pThis, u32 nAddress); +void DWHCIRegister2 (TDWHCIRegister *pThis, u32 nAddress, u32 nValue); +void _DWHCIRegister (TDWHCIRegister *pThis); + +u32 DWHCIRegisterRead (TDWHCIRegister *pThis); +void DWHCIRegisterWrite (TDWHCIRegister *pThis); + +u32 DWHCIRegisterGet (TDWHCIRegister *pThis); +void DWHCIRegisterSet (TDWHCIRegister *pThis, u32 nValue); + +boolean DWHCIRegisterIsSet (TDWHCIRegister *pThis, u32 nMask); + +void DWHCIRegisterAnd (TDWHCIRegister *pThis, u32 nMask); +void DWHCIRegisterOr (TDWHCIRegister *pThis, u32 nMask); + +void DWHCIRegisterClearBit (TDWHCIRegister *pThis, unsigned nBit); +void DWHCIRegisterSetBit (TDWHCIRegister *pThis, unsigned nBit); +void DWHCIRegisterClearAll (TDWHCIRegister *pThis); +void DWHCIRegisterSetAll (TDWHCIRegister *pThis); + +#ifndef NDEBUG + +void DWHCIRegisterDump (TDWHCIRegister *pThis); + +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/dwhcirootport.h b/uspi/include/uspi/dwhcirootport.h new file mode 100644 index 0000000..3b26f7a --- /dev/null +++ b/uspi/include/uspi/dwhcirootport.h @@ -0,0 +1,49 @@ +// +// dwhcirootport.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_dwhcirootport_h +#define _uspi_dwhcirootport_h + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct TDWHCIDevice; + +typedef struct TDWHCIRootPort +{ + struct TDWHCIDevice *m_pHost; + + TUSBDevice *m_pDevice; +} +TDWHCIRootPort; + +void DWHCIRootPort (TDWHCIRootPort *pThis, struct TDWHCIDevice *pHost); +void _DWHCIRootPort (TDWHCIRootPort *pThis); + +boolean DWHCIRootPortInitialize (TDWHCIRootPort *pThis); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/dwhcixferstagedata.h b/uspi/include/uspi/dwhcixferstagedata.h new file mode 100644 index 0000000..663ea10 --- /dev/null +++ b/uspi/include/uspi/dwhcixferstagedata.h @@ -0,0 +1,117 @@ +// +// dwhcixferstagedata.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi__dwhcixferstagedata_h +#define _uspi_dwhcixferstagedata_h + +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct TDWHCITransferStageData +{ + unsigned m_nChannel; // parameters + TUSBRequest *m_pURB; + boolean m_bIn; + boolean m_bStatusStage; + + boolean m_bSplitTransaction; + boolean m_bSplitComplete; + + TUSBDevice *m_pDevice; // cached from *pURB + TUSBEndpoint *m_pEndpoint; + TUSBSpeed m_Speed; + u32 m_nMaxPacketSize; + + u32 m_nTransferSize; + unsigned m_nPackets; + u32 m_nBytesPerTransaction; + unsigned m_nPacketsPerTransaction; + u32 m_nTotalBytesTransfered; + + unsigned m_nState; + unsigned m_nSubState; + u32 m_nTransactionStatus; + + u32 *m_pTempBuffer; + void *m_pBufferPointer; + + TDWHCIFrameScheduler *m_pFrameScheduler; +} +TDWHCITransferStageData; + +void DWHCITransferStageData (TDWHCITransferStageData *pThis, unsigned nChannel, TUSBRequest *pURB, boolean bIn, boolean bStatusStage); +void _DWHCITransferStageData (TDWHCITransferStageData *pThis); + +// change status +void DWHCITransferStageDataTransactionComplete (TDWHCITransferStageData *pThis, u32 nStatus, u32 nPacketsLeft, u32 nBytesLeft); +void DWHCITransferStageDataSetSplitComplete (TDWHCITransferStageData *pThis, boolean bComplete); + +void DWHCITransferStageDataSetState (TDWHCITransferStageData *pThis, unsigned nState); +unsigned DWHCITransferStageDataGetState (TDWHCITransferStageData *pThis); +void DWHCITransferStageDataSetSubState (TDWHCITransferStageData *pThis, unsigned nSubState); +unsigned DWHCITransferStageDataGetSubState (TDWHCITransferStageData *pThis); + +boolean DWHCITransferStageDataBeginSplitCycle (TDWHCITransferStageData *pThis); + +// get transaction parameters +unsigned DWHCITransferStageDataGetChannelNumber (TDWHCITransferStageData *pThis); +u8 DWHCITransferStageDataGetDeviceAddress (TDWHCITransferStageData *pThis); +boolean DWHCITransferStageDataIsPeriodic (TDWHCITransferStageData *pThis); +u8 DWHCITransferStageDataGetEndpointType (TDWHCITransferStageData *pThis); +u8 DWHCITransferStageDataGetEndpointNumber (TDWHCITransferStageData *pThis); +u32 DWHCITransferStageDataGetMaxPacketSize (TDWHCITransferStageData *pThis); +TUSBSpeed DWHCITransferStageDataGetSpeed (TDWHCITransferStageData *pThis); + +u8 DWHCITransferStageDataGetPID (TDWHCITransferStageData *pThis); +boolean DWHCITransferStageDataIsDirectionIn (TDWHCITransferStageData *pThis); +boolean DWHCITransferStageDataIsStatusStage (TDWHCITransferStageData *pThis); + +u32 DWHCITransferStageDataGetDMAAddress (TDWHCITransferStageData *pThis); +u32 DWHCITransferStageDataGetBytesToTransfer (TDWHCITransferStageData *pThis); +u32 DWHCITransferStageDataGetPacketsToTransfer (TDWHCITransferStageData *pThis); + +boolean DWHCITransferStageDataIsSplit (TDWHCITransferStageData *pThis); +boolean DWHCITransferStageDataIsSplitComplete (TDWHCITransferStageData *pThis); +u8 DWHCITransferStageDataGetHubAddress (TDWHCITransferStageData *pThis); +u8 DWHCITransferStageDataGetHubPortAddress (TDWHCITransferStageData *pThis); +u8 DWHCITransferStageDataGetSplitPosition (TDWHCITransferStageData *pThis); + +u32 DWHCITransferStageDataGetStatusMask (TDWHCITransferStageData *pThis); + +// check status after transaction +u32 DWHCITransferStageDataGetTransactionStatus (TDWHCITransferStageData *pThis); +boolean DWHCITransferStageDataIsStageComplete (TDWHCITransferStageData *pThis); +u32 DWHCITransferStageDataGetResultLen (TDWHCITransferStageData *pThis); + +TUSBRequest *DWHCITransferStageDataGetURB (TDWHCITransferStageData *pThis); +TDWHCIFrameScheduler *DWHCITransferStageDataGetFrameScheduler (TDWHCITransferStageData *pThis); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/keymap.h b/uspi/include/uspi/keymap.h new file mode 100644 index 0000000..8951c01 --- /dev/null +++ b/uspi/include/uspi/keymap.h @@ -0,0 +1,133 @@ +// +// keymap.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014-2016 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_keymap_h +#define _uspi_keymap_h + +#include + +#define PHY_MAX_CODE 127 + +#define K_NORMTAB 0 +#define K_SHIFTTAB 1 +#define K_ALTTAB 2 +#define K_ALTSHIFTTAB 3 + +typedef enum +{ + KeyNone = 0x00, + KeySpace = 0x100, + KeyEscape, + KeyBackspace, + KeyTabulator, + KeyReturn, + KeyInsert, + KeyHome, + KeyPageUp, + KeyDelete, + KeyEnd, + KeyPageDown, + KeyUp, + KeyDown, + KeyLeft, + KeyRight, + KeyF1, + KeyF2, + KeyF3, + KeyF4, + KeyF5, + KeyF6, + KeyF7, + KeyF8, + KeyF9, + KeyF10, + KeyF11, + KeyF12, + KeyApplication, + KeyCapsLock, + KeyPrintScreen, + KeyScrollLock, + KeyPause, + KeyNumLock, + KeyKP_Divide, + KeyKP_Multiply, + KeyKP_Subtract, + KeyKP_Add, + KeyKP_Enter, + KeyKP_1, + KeyKP_2, + KeyKP_3, + KeyKP_4, + KeyKP_5, + KeyKP_6, + KeyKP_7, + KeyKP_8, + KeyKP_9, + KeyKP_0, + KeyKP_Center, + KeyKP_Comma, + KeyKP_Period, + KeyMaxCode +} +TSpecialKey; + +typedef enum +{ + ActionSwitchCapsLock = KeyMaxCode, + ActionSwitchNumLock, + ActionSwitchScrollLock, + ActionSelectConsole1, + ActionSelectConsole2, + ActionSelectConsole3, + ActionSelectConsole4, + ActionSelectConsole5, + ActionSelectConsole6, + ActionSelectConsole7, + ActionSelectConsole8, + ActionSelectConsole9, + ActionSelectConsole10, + ActionSelectConsole11, + ActionSelectConsole12, + ActionShutdown, + ActionNone +} +TSpecialAction; + +typedef struct TKeyMap +{ + u16 m_KeyMap[PHY_MAX_CODE+1][K_ALTSHIFTTAB+1]; + + boolean m_bCapsLock; + boolean m_bNumLock; + boolean m_bScrollLock; +} +TKeyMap; + +void KeyMap (TKeyMap *pThis); +void _KeyMap (TKeyMap *pThis); + +boolean KeyMapClearTable (TKeyMap *pThis, u8 nTable); +boolean KeyMapSetEntry (TKeyMap *pThis, u8 nTable, u8 nPhyCode, u16 nValue); + +u16 KeyMapTranslate (TKeyMap *pThis, u8 nPhyCode, u8 nModifiers); +const char *KeyMapGetString (TKeyMap *pThis, u16 nKeyCode, u8 nModifiers, char Buffer[2]); + +u8 KeyMapGetLEDStatus (TKeyMap *pThis); + +#endif diff --git a/uspi/include/uspi/lan7800.h b/uspi/include/uspi/lan7800.h new file mode 100644 index 0000000..3965064 --- /dev/null +++ b/uspi/include/uspi/lan7800.h @@ -0,0 +1,58 @@ +// +// lan7800.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2018 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_lan7800_h +#define _uspi_lan7800_h + +#include +#include +#include +#include + +#define FRAME_BUFFER_SIZE 1600 + +typedef struct TLAN7800Device +{ + TUSBDevice m_USBDevice; + + TUSBEndpoint *m_pEndpointBulkIn; + TUSBEndpoint *m_pEndpointBulkOut; + + TMACAddress m_MACAddress; + + u8 *m_pTxBuffer; +} +TLAN7800Device; + +void LAN7800Device (TLAN7800Device *pThis, TUSBDevice *pDevice); +void _LAN7800Device (TLAN7800Device *pThis); + +boolean LAN7800DeviceConfigure (TUSBDevice *pUSBDevice); + +TMACAddress *LAN7800DeviceGetMACAddress (TLAN7800Device *pThis); + +boolean LAN7800DeviceSendFrame (TLAN7800Device *pThis, const void *pBuffer, unsigned nLength); + +// pBuffer must have size FRAME_BUFFER_SIZE +boolean LAN7800DeviceReceiveFrame (TLAN7800Device *pThis, void *pBuffer, unsigned *pResultLength); + +// returns TRUE if PHY link is up +boolean LAN7800DeviceIsLinkUp (TLAN7800Device *pThis); + +#endif diff --git a/uspi/include/uspi/macaddress.h b/uspi/include/uspi/macaddress.h new file mode 100644 index 0000000..f1fdbcd --- /dev/null +++ b/uspi/include/uspi/macaddress.h @@ -0,0 +1,52 @@ +// +// macaddress.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_macaddress_h +#define _uspi_macaddress_h + +#include +#include + +#define MAC_ADDRESS_SIZE 6 + +typedef struct TMACAddress +{ + boolean m_bValid; + + u8 m_Address[MAC_ADDRESS_SIZE]; +} +TMACAddress; + +void MACAddress (TMACAddress *pThis); +void MACAddress2 (TMACAddress *pThis, const u8 *pAddress); +void _MACAddress (TMACAddress *pThis); + +boolean MACAddressIsEqual (TMACAddress *pThis, TMACAddress *pAddress2); + +void MACAddressSet (TMACAddress *pThis, const u8 *pAddress); +void MACAddressSetBroadcast (TMACAddress *pThis); +const u8 *MACAddressGet (TMACAddress *pThis); +void MACAddressCopyTo (TMACAddress *pThis, u8 *pBuffer); + +boolean MACAddressIsBroadcast (TMACAddress *pThis); +unsigned MACAddressGetSize (TMACAddress *pThis); + +void MACAddressFormat (TMACAddress *pThis, TString *pString); + +#endif diff --git a/uspi/include/uspi/macros.h b/uspi/include/uspi/macros.h new file mode 100644 index 0000000..e716786 --- /dev/null +++ b/uspi/include/uspi/macros.h @@ -0,0 +1,31 @@ +// +// macros.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_macros_h +#define _uspi_macros_h + +#define PACKED __attribute__ ((packed)) +#define ALIGN(n) __attribute__ ((aligned (n))) +#define NOOPT __attribute__ ((optimize (0))) +#define MAXOPT __attribute__ ((optimize (3))) + +// big endian (to be used for constants only) +#define BE(value) ((((value) & 0xFF00) >> 8) | (((value) & 0x00FF) << 8)) + +#endif diff --git a/uspi/include/uspi/oldstdarg.h b/uspi/include/uspi/oldstdarg.h new file mode 100644 index 0000000..d8430f6 --- /dev/null +++ b/uspi/include/uspi/oldstdarg.h @@ -0,0 +1,29 @@ +// +// stdarg.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_stdarg_h +#define _uspi_stdarg_h + +typedef __builtin_va_list va_list; + +#define va_start(arg, last) __builtin_va_start (arg, last) +#define va_end(arg) __builtin_va_end (arg) +#define va_arg(arg, type) __builtin_va_arg (arg, type) + +#endif diff --git a/uspi/include/uspi/smsc951x.h b/uspi/include/uspi/smsc951x.h new file mode 100644 index 0000000..2fa4fb2 --- /dev/null +++ b/uspi/include/uspi/smsc951x.h @@ -0,0 +1,65 @@ +// +// smsc951x.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_smsc951x_h +#define _uspi_smsc951x_h + +#include +#include +#include +#include +#include + +#define FRAME_BUFFER_SIZE 1600 + +typedef struct TSMSC951xDevice +{ + TUSBDevice m_USBDevice; + + TUSBEndpoint *m_pEndpointBulkIn; + TUSBEndpoint *m_pEndpointBulkOut; + + TMACAddress m_MACAddress; + + u8 *m_pTxBuffer; +} +TSMSC951xDevice; + +void SMSC951xDevice (TSMSC951xDevice *pThis, TUSBDevice *pDevice); +void _SMSC951xDevice (TSMSC951xDevice *pThis); + +boolean SMSC951xDeviceConfigure (TUSBDevice *pUSBDevice); + +TMACAddress *SMSC951xDeviceGetMACAddress (TSMSC951xDevice *pThis); + +boolean SMSC951xDeviceSendFrame (TSMSC951xDevice *pThis, const void *pBuffer, unsigned nLength); + +// pBuffer must have size FRAME_BUFFER_SIZE +boolean SMSC951xDeviceReceiveFrame (TSMSC951xDevice *pThis, void *pBuffer, unsigned *pResultLength); + +// private: +boolean SMSC951xDeviceWriteReg (TSMSC951xDevice *pThis, u32 nIndex, u32 nValue); +boolean SMSC951xDeviceReadReg (TSMSC951xDevice *pThis, u32 nIndex, u32 *pValue); + +#ifndef NDEBUG +void SMSC951xDeviceDumpReg (TSMSC951xDevice *pThis, const char *pName, u32 nIndex); +void SMSC951xDeviceDumpRegs (TSMSC951xDevice *pThis); +#endif + +#endif diff --git a/uspi/include/uspi/string.h b/uspi/include/uspi/string.h new file mode 100644 index 0000000..d462452 --- /dev/null +++ b/uspi/include/uspi/string.h @@ -0,0 +1,60 @@ +// +// string.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_string_h +#define _uspi_string_h + +//#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct TString +{ + char *m_pBuffer; + unsigned m_nSize; + char *m_pInPtr; +} +TString; + +void String (TString *pThis); +void String2 (TString *pThis, const char *pString); +void _String (TString *pThis); + +const char *StringGet (TString *pThis); +const char *StringSet (TString *pThis, const char *pString); + +size_t StringGetLength (TString *pThis); + +void StringAppend (TString *pThis, const char *pString); +int StringCompare (TString *pThis, const char *pString); +int StringFind (TString *pThis, char chChar); // returns index or -1 if not found + +void StringFormat (TString *pThis, const char *pFormat, ...); // supports only a small subset of printf(3) +void StringFormatV (TString *pThis, const char *pFormat, va_list Args); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/synchronize.h b/uspi/include/uspi/synchronize.h new file mode 100644 index 0000000..cff1267 --- /dev/null +++ b/uspi/include/uspi/synchronize.h @@ -0,0 +1,90 @@ +// +// synchronize.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014-2015 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_synchronize_h +#define _uspi_synchronize_h + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// +// Interrupt synchronization +// +void uspi_EnterCritical (void); // disable interrupts (nested calls possible) +void uspi_LeaveCritical (void); // enable interrupts (nested calls possible) + +#if RASPPI == 1 + +// +// Cache control +// +#define InvalidateInstructionCache() \ + __asm volatile ("mcr p15, 0, %0, c7, c5, 0" : : "r" (0) : "memory") +#define FlushPrefetchBuffer() __asm volatile ("mcr p15, 0, %0, c7, c5, 4" : : "r" (0) : "memory") +#define FlushBranchTargetCache() \ + __asm volatile ("mcr p15, 0, %0, c7, c5, 6" : : "r" (0) : "memory") +#define InvalidateDataCache() __asm volatile ("mcr p15, 0, %0, c7, c6, 0" : : "r" (0) : "memory") +#define CleanDataCache() __asm volatile ("mcr p15, 0, %0, c7, c10, 0" : : "r" (0) : "memory") + +void uspi_CleanAndInvalidateDataCacheRange (u32 nAddress, u32 nLength) MAXOPT; + +// +// Barriers +// +#define DataSyncBarrier() __asm volatile ("mcr p15, 0, %0, c7, c10, 4" : : "r" (0) : "memory") +#define DataMemBarrier() __asm volatile ("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory") + +#define InstructionSyncBarrier() FlushPrefetchBuffer() +#define InstructionMemBarrier() FlushPrefetchBuffer() + +#else + +// +// Cache control +// +#define InvalidateInstructionCache() \ + __asm volatile ("mcr p15, 0, %0, c7, c5, 0" : : "r" (0) : "memory") +#define FlushPrefetchBuffer() __asm volatile ("isb" ::: "memory") +#define FlushBranchTargetCache() \ + __asm volatile ("mcr p15, 0, %0, c7, c5, 6" : : "r" (0) : "memory") + +void uspi_CleanAndInvalidateDataCacheRange (u32 nAddress, u32 nLength) MAXOPT; + +// +// Barriers +// +#define DataSyncBarrier() __asm volatile ("dsb" ::: "memory") +#define DataMemBarrier() __asm volatile ("dmb" ::: "memory") + +#define InstructionSyncBarrier() __asm volatile ("isb" ::: "memory") +#define InstructionMemBarrier() __asm volatile ("isb" ::: "memory") + +#endif + +#define CompilerBarrier() __asm volatile ("" ::: "memory") + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/types.h b/uspi/include/uspi/types.h new file mode 100644 index 0000000..503e1db --- /dev/null +++ b/uspi/include/uspi/types.h @@ -0,0 +1,41 @@ +// +// types.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_types_h +#define _uspi_types_h + +#include + +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; +typedef unsigned long long u64; + +typedef char s8; +typedef short s16; +typedef int s32; + +typedef int boolean; +#define FALSE 0 +#define TRUE 1 + +//typedef unsigned long size_t; +//typedef long ssize_t; + +#endif diff --git a/uspi/include/uspi/usb.h b/uspi/include/uspi/usb.h new file mode 100644 index 0000000..1ec25c5 --- /dev/null +++ b/uspi/include/uspi/usb.h @@ -0,0 +1,206 @@ +// +// usb.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_usb_h +#define _uspi_usb_h + +#include + +// PID +typedef enum +{ + USBPIDSetup, + USBPIDData0, + USBPIDData1, + //USBPIDData2, + //USBPIDMData +} +TUSBPID; + +// Device Addresses +#define USB_DEFAULT_ADDRESS 0 +#define USB_FIRST_DEDICATED_ADDRESS 1 +#define USB_MAX_ADDRESS 127 + +// Speed +typedef enum +{ + USBSpeedLow, + USBSpeedFull, + USBSpeedHigh, + USBSpeedUnknown +} +TUSBSpeed; + +// Setup Data +typedef struct +{ + unsigned char bmRequestType; + unsigned char bRequest; + unsigned short wValue; + unsigned short wIndex; + unsigned short wLength; + // Data follows +} +PACKED TSetupData; + +// Request Types +#define REQUEST_OUT 0 +#define REQUEST_IN 0x80 + +#define REQUEST_CLASS 0x20 +#define REQUEST_VENDOR 0x40 + +#define REQUEST_TO_INTERFACE 1 +#define REQUEST_TO_OTHER 3 + +// Standard Request Codes +#define GET_STATUS 0 +#define CLEAR_FEATURE 1 +#define SET_FEATURE 3 +#define SET_ADDRESS 5 +#define GET_DESCRIPTOR 6 +#define SET_CONFIGURATION 9 +#define SET_INTERFACE 11 + +// Descriptor Types +#define DESCRIPTOR_DEVICE 1 +#define DESCRIPTOR_CONFIGURATION 2 +#define DESCRIPTOR_STRING 3 +#define DESCRIPTOR_INTERFACE 4 +#define DESCRIPTOR_ENDPOINT 5 +#define DESCRIPTOR_CS_INTERFACE 36 +#define DESCRIPTOR_CS_ENDPOINT 37 + +#define DESCRIPTOR_INDEX_DEFAULT 0 + +// Device Descriptor +typedef struct +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned short bcdUSB; + unsigned char bDeviceClass; + unsigned char bDeviceSubClass; + unsigned char bDeviceProtocol; + unsigned char bMaxPacketSize0; + #define USB_DEFAULT_MAX_PACKET_SIZE 8 + unsigned short idVendor; + unsigned short idProduct; + unsigned short bcdDevice; + unsigned char iManufacturer; + unsigned char iProduct; + unsigned char iSerialNumber; + unsigned char bNumConfigurations; +} +PACKED TUSBDeviceDescriptor; + +// Configuration Descriptor +typedef struct +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned short wTotalLength; + unsigned char bNumInterfaces; + unsigned char bConfigurationValue; + unsigned char iConfiguration; + unsigned char bmAttributes; + unsigned char bMaxPower; +} +PACKED TUSBConfigurationDescriptor; + +// Interface Descriptor +typedef struct +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned char bInterfaceNumber; + unsigned char bAlternateSetting; + unsigned char bNumEndpoints; + unsigned char bInterfaceClass; + unsigned char bInterfaceSubClass; + unsigned char bInterfaceProtocol; + unsigned char iInterface; +} +PACKED TUSBInterfaceDescriptor; + +// Endpoint Descriptor +typedef struct +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned char bEndpointAddress; + unsigned char bmAttributes; + unsigned short wMaxPacketSize; + unsigned char bInterval; +} +PACKED TUSBEndpointDescriptor; + +// Audio class Endpoint Descriptor +typedef struct +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned char bEndpointAddress; + unsigned char bmAttributes; + unsigned short wMaxPacketSize; + unsigned char bInterval; + unsigned char bRefresh; + unsigned char bSynchAddress; +} +PACKED TUSBAudioEndpointDescriptor; + +// MIDI-streaming class-specific Endpoint Descriptor +typedef struct +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned char bDescriptorSubType; + unsigned char bNumEmbMIDIJack; + unsigned char bAssocJackIDs[]; +} +PACKED TUSBMIDIStreamingEndpointDescriptor; + +// Descriptor union +typedef union +{ + struct + { + unsigned char bLength; + unsigned char bDescriptorType; + } + Header; + + TUSBConfigurationDescriptor Configuration; + TUSBInterfaceDescriptor Interface; + TUSBEndpointDescriptor Endpoint; + TUSBAudioEndpointDescriptor AudioEndpoint; + TUSBMIDIStreamingEndpointDescriptor MIDIStreamingEndpoint; +} +PACKED TUSBDescriptor; + +typedef struct TUSBStringDescriptor +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned short bString[0]; +} +PACKED TUSBStringDescriptor; + +#endif diff --git a/uspi/include/uspi/usbconfigparser.h b/uspi/include/uspi/usbconfigparser.h new file mode 100644 index 0000000..798b4b9 --- /dev/null +++ b/uspi/include/uspi/usbconfigparser.h @@ -0,0 +1,54 @@ +// +// usbconfigparser.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_usbconfigparser_h +#define _uspi_usbconfigparser_h + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct TUSBConfigurationParser +{ + const TUSBDescriptor *m_pBuffer; + unsigned m_nBufLen; + boolean m_bValid; + const TUSBDescriptor *m_pEndPosition; + const TUSBDescriptor *m_pCurrentPosition; + const TUSBDescriptor *m_pErrorPosition; +} +TUSBConfigurationParser; + +void USBConfigurationParser (TUSBConfigurationParser *pThis, const void *pBuffer, unsigned nBufLen); +void _USBConfigurationParser (TUSBConfigurationParser *pThis); + +boolean USBConfigurationParserIsValid (TUSBConfigurationParser *pThis); + +const TUSBDescriptor *USBConfigurationParserGetDescriptor (TUSBConfigurationParser *pThis, u8 ucType); // returns 0 if not found + +void USBConfigurationParserError (TUSBConfigurationParser *pThis, const char *pSource); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/usbdevice.h b/uspi/include/uspi/usbdevice.h new file mode 100644 index 0000000..8b56ed9 --- /dev/null +++ b/uspi/include/uspi/usbdevice.h @@ -0,0 +1,97 @@ +// +// usbdevice.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_usbdevice_h +#define _uspi_usbdevice_h + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum // do not change this order +{ + DeviceNameVendor, + DeviceNameDevice, + DeviceNameInterface, + DeviceNameUnknown +} +TDeviceNameSelector; + +struct TDWHCIDevice; +struct TUSBEndpoint; + +typedef struct TUSBDevice +{ + boolean (*Configure) (struct TUSBDevice *pThis); + + struct TDWHCIDevice *m_pHost; + + u8 m_ucAddress; + TUSBSpeed m_Speed; + struct TUSBEndpoint *m_pEndpoint0; + + u8 m_ucHubAddress; + u8 m_ucHubPortNumber; + + TUSBDeviceDescriptor *m_pDeviceDesc; + TUSBConfigurationDescriptor *m_pConfigDesc; + + TUSBConfigurationParser *m_pConfigParser; + + TUSBString m_ManufacturerString; + TUSBString m_ProductString; +} +TUSBDevice; + +void USBDevice (TUSBDevice *pThis, struct TDWHCIDevice *pHost, TUSBSpeed Speed, u8 ucHubAddress, u8 ucHubPortNumber); +void USBDeviceCopy (TUSBDevice *pThis, TUSBDevice *pDevice); +void _USBDevice (TUSBDevice *pThis); + +boolean USBDeviceInitialize (TUSBDevice *pThis); // onto address state (phase 1) +boolean USBDeviceConfigure (TUSBDevice *pThis); // onto configured state (phase 2) + +TString *USBDeviceGetName (TUSBDevice *pThis, TDeviceNameSelector Selector); // string deleted by caller + +u8 USBDeviceGetAddress (TUSBDevice *pThis); +TUSBSpeed USBDeviceGetSpeed (TUSBDevice *pThis); + +u8 USBDeviceGetHubAddress (TUSBDevice *pThis); +u8 USBDeviceGetHubPortNumber (TUSBDevice *pThis); + +struct TUSBEndpoint *USBDeviceGetEndpoint0 (TUSBDevice *pThis); +struct TDWHCIDevice *USBDeviceGetHost (TUSBDevice *pThis); + +const TUSBDeviceDescriptor *USBDeviceGetDeviceDescriptor (TUSBDevice *pThis); +const TUSBConfigurationDescriptor *USBDeviceGetConfigurationDescriptor (TUSBDevice *pThis); // default config + +// get next sub descriptor of ucType from configuration descriptor +const TUSBDescriptor *USBDeviceGetDescriptor (TUSBDevice *pThis, u8 ucType); // returns 0 if not found +void USBDeviceConfigurationError (TUSBDevice *pThis, const char *pSource); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/usbdevicefactory.h b/uspi/include/uspi/usbdevicefactory.h new file mode 100644 index 0000000..6127021 --- /dev/null +++ b/uspi/include/uspi/usbdevicefactory.h @@ -0,0 +1,28 @@ +// +// usbdevicefactory.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_usbdevicefactory_h +#define _uspi_usbdevicefactory_h + +#include +#include + +TUSBDevice *USBDeviceFactoryGetDevice (TUSBDevice *pParent); + +#endif diff --git a/uspi/include/uspi/usbendpoint.h b/uspi/include/uspi/usbendpoint.h new file mode 100644 index 0000000..1964473 --- /dev/null +++ b/uspi/include/uspi/usbendpoint.h @@ -0,0 +1,76 @@ +// +// usbendpoint.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_usbendpoint_h +#define _uspi_usbendpoint_h + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum +{ + EndpointTypeControl, + EndpointTypeBulk, + EndpointTypeInterrupt, + EndpointTypeIsochronous +} +TEndpointType; + +typedef struct TUSBEndpoint +{ + TUSBDevice *m_pDevice; + u8 m_ucNumber; + TEndpointType m_Type; + boolean m_bDirectionIn; + u32 m_nMaxPacketSize; + unsigned m_nInterval; // Milliseconds + TUSBPID m_NextPID; +} +TUSBEndpoint; + +void USBEndpoint (TUSBEndpoint *pThis, TUSBDevice *pDevice); // control endpoint 0 +void USBEndpoint2 (TUSBEndpoint *pThis, TUSBDevice *pDevice, const TUSBEndpointDescriptor *pDesc); +void USBEndpointCopy (TUSBEndpoint *pThis, TUSBEndpoint *pEndpoint, TUSBDevice *pDevice); +void _USBEndpoint (TUSBEndpoint *pThis); + +TUSBDevice *USBEndpointGetDevice (TUSBEndpoint *pThis); + +u8 USBEndpointGetNumber (TUSBEndpoint *pThis); +TEndpointType USBEndpointGetType (TUSBEndpoint *pThis); +boolean USBEndpointIsDirectionIn (TUSBEndpoint *pThis); + +void USBEndpointSetMaxPacketSize (TUSBEndpoint *pThis, u32 nMaxPacketSize); +u32 USBEndpointGetMaxPacketSize (TUSBEndpoint *pThis); + +unsigned USBEndpointGetInterval (TUSBEndpoint *pThis); // Milliseconds + +TUSBPID USBEndpointGetNextPID (TUSBEndpoint *pThis, boolean bStatusStage); +void USBEndpointSkipPID (TUSBEndpoint *pThis, unsigned nPackets, boolean bStatusStage); +void USBEndpointResetPID (TUSBEndpoint *pThis); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/usbgamepad.h b/uspi/include/uspi/usbgamepad.h new file mode 100644 index 0000000..57ebcf9 --- /dev/null +++ b/uspi/include/uspi/usbgamepad.h @@ -0,0 +1,62 @@ +// +// usbgamepad.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// Copyright (C) 2014 M. Maccaferri +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _usbgamepad_h +#define _usbgamepad_h + +#include +#include +#include +#include +#include +#include + +typedef struct TUSBGamePadDevice +{ + TUSBDevice m_USBDevice; + unsigned m_nDeviceIndex; + + u8 m_ucInterfaceNumber; + u8 m_ucAlternateSetting; + + TUSBEndpoint *m_pEndpointIn; + TUSBEndpoint *m_pEndpointOut; + + USPiGamePadState m_State; + TGamePadStatusHandler *m_pStatusHandler; + + u16 m_usReportDescriptorLength; + u8 *m_pHIDReportDescriptor; + + TUSBRequest *m_pURB; + u8 *m_pReportBuffer; + u16 m_nReportSize; +} +TUSBGamePadDevice; + +void USBGamePadDevice (TUSBGamePadDevice *pThis, TUSBDevice *pDevice); +void _CUSBGamePadDevice (TUSBGamePadDevice *pThis); + +boolean USBGamePadDeviceConfigure (TUSBDevice *pUSBDevice); + +void USBGamePadDeviceGetReport (TUSBGamePadDevice *pThis); +void USBGamePadDeviceRegisterStatusHandler (TUSBGamePadDevice *pThis, TGamePadStatusHandler *pStatusHandler); + +#endif diff --git a/uspi/include/uspi/usbhid.h b/uspi/include/uspi/usbhid.h new file mode 100644 index 0000000..7bd25bd --- /dev/null +++ b/uspi/include/uspi/usbhid.h @@ -0,0 +1,78 @@ +// +// usbhid.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_usbhid_h +#define _uspi_usbhid_h + +#include + +// Class-specific requests +#define GET_REPORT 0x01 +#define GET_IDLE 0x02 +#define GET_PROTOCOL 0x03 +#define SET_REPORT 0x09 +#define SET_IDLE 0x0A +#define SET_PROTOCOL 0x0B + +// Class-specific descriptors +#define DESCRIPTOR_HID 0x21 +#define DESCRIPTOR_REPORT 0x22 + +// Protocol IDs +#define BOOT_PROTOCOL 0x00 +#define REPORT_PROTOCOL 0x01 + +// Report types +#define REPORT_TYPE_INPUT 0x01 +#define REPORT_TYPE_OUTPUT 0x02 +#define REPORT_TYPE_FEATURE 0x03 + +typedef struct TUSBHIDDescriptor +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned short bcdHID; + unsigned char bCountryCode; + unsigned char bNumDescriptors; + unsigned char bReportDescriptorType; + unsigned short wReportDescriptorLength; +} +PACKED TUSBHIDDescriptor; + +// Modifiers (boot protocol) +#define LCTRL (1 << 0) +#define LSHIFT (1 << 1) +#define ALT (1 << 2) +#define LWIN (1 << 3) +#define RCTRL (1 << 4) +#define RSHIFT (1 << 5) +#define ALTGR (1 << 6) +#define RWIN (1 << 7) + +// LEDs (boot protocol) +#define LED_NUM_LOCK (1 << 0) +#define LED_CAPS_LOCK (1 << 1) +#define LED_SCROLL_LOCK (1 << 2) + +// Mouse buttons (boot protocol) +#define USBHID_BUTTON1 (1 << 0) +#define USBHID_BUTTON2 (1 << 1) +#define USBHID_BUTTON3 (1 << 2) + +#endif diff --git a/uspi/include/uspi/usbhostcontroller.h b/uspi/include/uspi/usbhostcontroller.h new file mode 100644 index 0000000..b93701a --- /dev/null +++ b/uspi/include/uspi/usbhostcontroller.h @@ -0,0 +1,27 @@ +// +// usbhostcontroller.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_usbhostcontroller_h +#define _uspi_usbhostcontroller_h + +#include + +#define TUSBHostController TDWHCIDevice // alias + +#endif diff --git a/uspi/include/uspi/usbhub.h b/uspi/include/uspi/usbhub.h new file mode 100644 index 0000000..14c93d6 --- /dev/null +++ b/uspi/include/uspi/usbhub.h @@ -0,0 +1,86 @@ +// +// usbhub.h +// +// Definitions for USB hubs +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_usbhub_h +#define _uspi_usbhub_h + +#include + +// Configuration +#define USB_HUB_MAX_PORTS 8 // TODO + +// Device Class +#define USB_DEVICE_CLASS_HUB 9 + +// Class-specific Requests +#define RESET_TT 9 + +// Descriptor Type +#define DESCRIPTOR_HUB 0x29 + +// Feature Selectors +#define PORT_RESET 4 +#define PORT_POWER 8 + +// Hub Descriptor +typedef struct TUSBHubDescriptor +{ + unsigned char bDescLength; + unsigned char bDescriptorType; + unsigned char bNbrPorts; + unsigned short wHubCharacteristics; + #define HUB_POWER_MODE(reg) ((reg) & 3) + #define HUB_POWER_MODE_GANGED 0 + #define HUB_POWER_MODE_INDIVIDUAL 1 + #define HUB_TT_THINK_TIME(reg) (((reg) >> 5) & 3) + unsigned char bPwrOn2PwrGood; + unsigned char bHubContrCurrent; + unsigned char DeviceRemoveable[1]; // max. 8 ports + unsigned char PortPwrCtrlMask[1]; // max. 8 ports +} +PACKED TUSBHubDescriptor; + +typedef struct TUSBHubStatus +{ + unsigned short wHubStatus; + #define HUB_LOCAL_POWER_LOST__MASK (1 << 0) + #define HUB_OVER_CURRENT__MASK (1 << 1) + unsigned short wHubChange; + #define C_HUB_LOCAL_POWER_LOST__MASK (1 << 0) + #define C_HUB_OVER_CURRENT__MASK (1 << 1) +} +PACKED TUSBHubStatus; + +typedef struct TUSBPortStatus +{ + unsigned short wPortStatus; + #define PORT_CONNECTION__MASK (1 << 0) + #define PORT_ENABLE__MASK (1 << 1) + #define PORT_OVER_CURRENT__MASK (1 << 3) + #define PORT_RESET__MASK (1 << 4) + #define PORT_POWER__MASK (1 << 8) + #define PORT_LOW_SPEED__MASK (1 << 9) + #define PORT_HIGH_SPEED__MASK (1 << 10) + unsigned short wChangeStatus; +} +PACKED TUSBPortStatus; + +#endif diff --git a/uspi/include/uspi/usbkeyboard.h b/uspi/include/uspi/usbkeyboard.h new file mode 100644 index 0000000..6f6990c --- /dev/null +++ b/uspi/include/uspi/usbkeyboard.h @@ -0,0 +1,78 @@ +// +// usbkeyboard.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _usbkeyboard_h +#define _usbkeyboard_h + +#include +#include +#include +#include +#include + +#define BOOT_REPORT_SIZE 8 + +typedef void TKeyPressedHandler (const char *pString); +typedef void TSelectConsoleHandler (unsigned nConsole); +typedef void TShutdownHandler (void); + +struct TUSBKeyboardDevice; + +// The raw handler is called when the keyboard sends a status report (on status change and/or continously). +typedef void TKeyStatusHandlerRaw (struct TUSBKeyboardDevice* device, unsigned char ucModifiers, // see usbhid.h + const unsigned char RawKeys[6]); // key code or 0 in each byte + +typedef struct TUSBKeyboardDevice +{ + TUSBDevice m_USBDevice; + + u8 m_ucInterfaceNumber; + u8 m_ucAlternateSetting; + + TUSBEndpoint *m_pReportEndpoint; + + TKeyPressedHandler *m_pKeyPressedHandler; + TSelectConsoleHandler *m_pSelectConsoleHandler; + TShutdownHandler *m_pShutdownHandler; + TKeyStatusHandlerRaw *m_pKeyStatusHandlerRaw; + + TUSBRequest *m_pURB; + u8 *m_pReportBuffer; + + u8 m_ucLastPhyCode; + unsigned m_hTimer; + + TKeyMap m_KeyMap; +} +TUSBKeyboardDevice; + +void USBKeyboardDevice (TUSBKeyboardDevice *pThis, TUSBDevice *pDevice); +void _CUSBKeyboardDevice (TUSBKeyboardDevice *pThis); + +boolean USBKeyboardDeviceConfigure (TUSBDevice *pUSBDevice); + +// cooked mode +void USBKeyboardDeviceRegisterKeyPressedHandler (TUSBKeyboardDevice *pThis, TKeyPressedHandler *pKeyPressedHandler); +void USBKeyboardDeviceRegisterSelectConsoleHandler (TUSBKeyboardDevice *pThis, TSelectConsoleHandler *pSelectConsoleHandler); +void USBKeyboardDeviceRegisterShutdownHandler (TUSBKeyboardDevice *pThis, TShutdownHandler *pShutdownHandler); + +// raw mode (if this handler is registered the others are ignored) +void USBKeyboardDeviceRegisterKeyStatusHandlerRaw (TUSBKeyboardDevice *pThis, TKeyStatusHandlerRaw *pKeyStatusHandlerRaw); + +#endif diff --git a/uspi/include/uspi/usbmassdevice.h b/uspi/include/uspi/usbmassdevice.h new file mode 100644 index 0000000..847587b --- /dev/null +++ b/uspi/include/uspi/usbmassdevice.h @@ -0,0 +1,66 @@ +// +// usbmassdevice.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_usbmassdevice_h +#define _uspi_usbmassdevice_h + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define UMSD_BLOCK_SIZE 512 +#define UMSD_BLOCK_MASK (UMSD_BLOCK_SIZE-1) +#define UMSD_BLOCK_SHIFT 9 + +#define UMSD_MAX_OFFSET 0x1FFFFFFFFFFULL // 2TB + +typedef struct TUSBBulkOnlyMassStorageDevice +{ + TUSBDevice m_USBDevice; + + TUSBEndpoint *m_pEndpointIn; + TUSBEndpoint *m_pEndpointOut; + + unsigned m_nCWBTag; + unsigned m_nBlockCount; + unsigned long long m_ullOffset; +} +TUSBBulkOnlyMassStorageDevice; + +void USBBulkOnlyMassStorageDevice (TUSBBulkOnlyMassStorageDevice *pThis, TUSBDevice *pDevice); +void _USBBulkOnlyMassStorageDevice (TUSBBulkOnlyMassStorageDevice *pThis); + +boolean USBBulkOnlyMassStorageDeviceConfigure (TUSBDevice *pUSBDevice); + +int USBBulkOnlyMassStorageDeviceRead (TUSBBulkOnlyMassStorageDevice *pThis, void *pBuffer, unsigned nCount); +int USBBulkOnlyMassStorageDeviceWrite (TUSBBulkOnlyMassStorageDevice *pThis, const void *pBuffer, unsigned nCount); + +unsigned long long USBBulkOnlyMassStorageDeviceSeek (TUSBBulkOnlyMassStorageDevice *pThis, unsigned long long ullOffset); + +unsigned USBBulkOnlyMassStorageDeviceGetCapacity (TUSBBulkOnlyMassStorageDevice *pThis); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/usbmidi.h b/uspi/include/uspi/usbmidi.h new file mode 100644 index 0000000..d1520f8 --- /dev/null +++ b/uspi/include/uspi/usbmidi.h @@ -0,0 +1,52 @@ +// +// usbmidi.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2016 R. Stange +// Copyright (C) 2016 J. Otto +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _usbmidi_h +#define _usbmidi_h + +#include +#include +#include +#include + +typedef void TMIDIPacketHandler(unsigned nCable, unsigned nLength, u8 *pPacket); + +typedef struct TUSBMIDIDevice +{ + TUSBDevice m_USBDevice; + + TUSBEndpoint *m_pEndpointIn; + + TMIDIPacketHandler *m_pPacketHandler; + + TUSBRequest *m_pURB; + u16 m_usBufferSize; + u8 *m_pPacketBuffer; +} +TUSBMIDIDevice; + +void USBMIDIDevice (TUSBMIDIDevice *pThis, TUSBDevice *pDevice); +void _CUSBMIDIDevice (TUSBMIDIDevice *pThis); + +boolean USBMIDIDeviceConfigure (TUSBDevice *pUSBDevice); + +void USBMIDIDeviceRegisterPacketHandler (TUSBMIDIDevice *pThis, TMIDIPacketHandler *pPacketHandler); + +#endif diff --git a/uspi/include/uspi/usbmouse.h b/uspi/include/uspi/usbmouse.h new file mode 100644 index 0000000..a9353f4 --- /dev/null +++ b/uspi/include/uspi/usbmouse.h @@ -0,0 +1,55 @@ +// +// usbmouse.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _usbmouse_h +#define _usbmouse_h + +#include +#include +#include +#include + +#define MOUSE_BOOT_REPORT_SIZE 3 + +typedef void TMouseStatusHandler (unsigned nButtons, int nDisplacementX, int nDisplacementY); + +typedef struct TUSBMouseDevice +{ + TUSBDevice m_USBDevice; + + u8 m_ucInterfaceNumber; + u8 m_ucAlternateSetting; + + TUSBEndpoint *m_pReportEndpoint; + + TMouseStatusHandler *m_pStatusHandler; + + TUSBRequest *m_pURB; + u8 *m_pReportBuffer; +} +TUSBMouseDevice; + +void USBMouseDevice (TUSBMouseDevice *pThis, TUSBDevice *pDevice); +void _CUSBMouseDevice (TUSBMouseDevice *pThis); + +boolean USBMouseDeviceConfigure (TUSBDevice *pUSBDevice); + +void USBMouseDeviceRegisterStatusHandler (TUSBMouseDevice *pThis, TMouseStatusHandler *pStatusHandler); + +#endif diff --git a/uspi/include/uspi/usbrequest.h b/uspi/include/uspi/usbrequest.h new file mode 100644 index 0000000..2f7e102 --- /dev/null +++ b/uspi/include/uspi/usbrequest.h @@ -0,0 +1,74 @@ +// +// usbrequest.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_usbrequest_h +#define _uspi_usbrequest_h + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct TUSBRequest; + +typedef void TURBCompletionRoutine (struct TUSBRequest *pURB, void *pParam, void *pContext); + +typedef struct TUSBRequest // URB +{ + TUSBEndpoint *m_pEndpoint; + + TSetupData *m_pSetupData; + void *m_pBuffer; + u32 m_nBufLen; + + int m_bStatus; + u32 m_nResultLen; + + TURBCompletionRoutine *m_pCompletionRoutine; + void *m_pCompletionParam; + void *m_pCompletionContext; +} +TUSBRequest; + +void USBRequest (TUSBRequest *pThis, TUSBEndpoint *pEndpoint, void *pBuffer, u32 nBufLen, TSetupData *pSetupData /* = 0 */); +void _USBRequest (TUSBRequest *pThis); + +TUSBEndpoint *USBRequestGetEndpoint (TUSBRequest *pThis); + +void USBRequestSetStatus (TUSBRequest *pThis, int bStatus); +void USBRequestSetResultLen (TUSBRequest *pThis, u32 nLength); + +int USBRequestGetStatus (TUSBRequest *pThis); +u32 USBRequestGetResultLength (TUSBRequest *pThis); + +TSetupData *USBRequestGetSetupData (TUSBRequest *pThis); +void *USBRequestGetBuffer (TUSBRequest *pThis); +u32 USBRequestGetBufLen (TUSBRequest *pThis); + +void USBRequestSetCompletionRoutine (TUSBRequest *pThis, TURBCompletionRoutine *pRoutine, void *pParam, void *pContext); +void USBRequestCallCompletionRoutine (TUSBRequest *pThis); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/usbstandardhub.h b/uspi/include/uspi/usbstandardhub.h new file mode 100644 index 0000000..54813c6 --- /dev/null +++ b/uspi/include/uspi/usbstandardhub.h @@ -0,0 +1,58 @@ +// +// usbstandardhub.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _usbstandardhub_h +#define _usbstandardhub_h + +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct TUSBStandardHub +{ + TUSBDevice m_USBDevice; + + TUSBHubDescriptor *m_pHubDesc; + + unsigned m_nPorts; + TUSBDevice *m_pDevice[USB_HUB_MAX_PORTS]; + TUSBPortStatus *m_pStatus[USB_HUB_MAX_PORTS]; +} +TUSBStandardHub; + +void USBStandardHub (TUSBStandardHub *pThis, TUSBDevice *pDevice); +void _USBStandardHub (TUSBStandardHub *pThis); + +boolean USBStandardHubInitialize (TUSBStandardHub *pThis); +boolean USBStandardHubConfigure (TUSBDevice *pUSBDevice); + +TString *USBStandardHubGetDeviceNames (TUSBDevice *pDevice); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/usbstring.h b/uspi/include/uspi/usbstring.h new file mode 100644 index 0000000..a0758d8 --- /dev/null +++ b/uspi/include/uspi/usbstring.h @@ -0,0 +1,57 @@ +// +// usbstring.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_usbstring_h +#define _uspi_usbstring_h + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct TUSBDevice; + +typedef struct TUSBString +{ + struct TUSBDevice *m_pDevice; + + TUSBStringDescriptor *m_pUSBString; + + TString *m_pString; +} +TUSBString; + +void USBString (TUSBString *pThis, struct TUSBDevice *pDevice); +void USBStringCopy (TUSBString *pThis, TUSBString *pParent); +void _USBString (TUSBString *pThis); + +boolean USBStringGetFromDescriptor (TUSBString *pThis, u8 ucID, u16 usLanguageID); + +const char *USBStringGet (TUSBString *pThis); + +u16 USBStringGetLanguageID (TUSBString *pThis); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/uspilibrary.h b/uspi/include/uspi/uspilibrary.h new file mode 100644 index 0000000..f3c8c22 --- /dev/null +++ b/uspi/include/uspi/uspilibrary.h @@ -0,0 +1,57 @@ +// +// uspilibrary.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014-2018 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_uspilibrary_h +#define _uspi_uspilibrary_h + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAX_DEVICES 4 + +typedef struct TUSPiLibrary +{ + TDeviceNameService NameService; + TDWHCIDevice DWHCI; + TUSBKeyboardDevice *pUKBD1; + TUSBMouseDevice *pUMouse1; + TUSBBulkOnlyMassStorageDevice *pUMSD[MAX_DEVICES]; + TSMSC951xDevice *pEth0; + TLAN7800Device *pEth10; + TUSBGamePadDevice *pUPAD[MAX_DEVICES]; + TUSBMIDIDevice *pMIDI1; +} +TUSPiLibrary; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspi/util.h b/uspi/include/uspi/util.h new file mode 100644 index 0000000..71bf88c --- /dev/null +++ b/uspi/include/uspi/util.h @@ -0,0 +1,70 @@ +// +// util.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspi_util_h +#define _uspi_util_h + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef USPI_PROVIDE_MEM_FUNCTIONS + #define memset uspi_memset + #define memcpy uspi_memcpy + #define memcmp uspi_memcmp +#endif + +#ifdef USPI_PROVIDE_STR_FUNCTIONS + #define strlen uspi_strlen + #define strcmp uspi_strcmp + #define strcpy uspi_strcpy + #define strncpy uspi_strncpy + #define strcat uspi_strcat +#endif + +void *memset (void *pBuffer, int nValue, size_t nLength); + +void *memcpy (void *pDest, const void *pSrc, size_t nLength); + +int memcmp (const void *pBuffer1, const void *pBuffer2, size_t nLength); + +size_t strlen (const char *pString); + +int strcmp (const char *pString1, const char *pString2); + +char *strcpy (char *pDest, const char *pSrc); + +char *strncpy (char *pDest, const char *pSrc, size_t nMaxLen); + +char *strcat (char *pDest, const char *pSrc); + +int uspi_char2int (char chValue); // with sign extension + +u16 uspi_le2be16 (u16 usValue); + +u32 uspi_le2be32 (u32 ulValue); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/include/uspios.h b/uspi/include/uspios.h new file mode 100644 index 0000000..4961ac8 --- /dev/null +++ b/uspi/include/uspios.h @@ -0,0 +1,124 @@ +// +// uspios.h +// +// External functions used by the USPi library +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014-2016 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#ifndef _uspios_h +#define _uspios_h + +#ifdef __cplusplus +extern "C" { +#endif + +// +// System configuration +// +// (Change this before you build the USPi library!) +// +#define GPU_L2_CACHE_ENABLED // normally enabled (can be disabled in config.txt) + +#define HZ 100 // timer ticks / second (set this to your timer interrupt frequency) + +// Default keyboard map (enable only one) +//#define USPI_DEFAULT_KEYMAP_DE +//#define USPI_DEFAULT_KEYMAP_ES +//#define USPI_DEFAULT_KEYMAP_FR +//#define USPI_DEFAULT_KEYMAP_IT +#define USPI_DEFAULT_KEYMAP_UK +//#define USPI_DEFAULT_KEYMAP_US + +// Undefine this if you want to use your own implementation of the functions in uspi/util.h +#define USPI_PROVIDE_MEM_FUNCTIONS // mem*() +#define USPI_PROVIDE_STR_FUNCTIONS // str*() + +// +// Memory allocation +// +// (Must work from interrupt context) +// +void *malloc (unsigned nSize); // result must be 4-byte aligned +void free (void *pBlock); + +// +// Timer +// +void MsDelay (unsigned nMilliSeconds); +void usDelay (unsigned nMicroSeconds); + +typedef void TKernelTimerHandler (unsigned hTimer, void *pParam, void *pContext); + +// returns the timer handle (hTimer) +unsigned StartKernelTimer (unsigned nHzDelay, // in HZ units (see "system configuration" above) + TKernelTimerHandler *pHandler, + void *pParam, void *pContext); // handed over to the timer handler + +void CancelKernelTimer (unsigned hTimer); + +// +// Interrupt handling +// +typedef void TInterruptHandler (void *pParam); + +// USPi uses USB IRQ 9 +void ConnectInterrupt (unsigned nIRQ, TInterruptHandler *pHandler, void *pParam); + +// +// Property tags (ARM -> VC) +// +// See: https://github.com/raspberrypi/firmware/wiki/Mailboxes +// + +// returns 0 on failure +int SetPowerStateOn (unsigned nDeviceId); // "set power state" to "on", wait until completed + +// returns 0 on failure +int GetMACAddress (unsigned char Buffer[6]); // "get board MAC address" + +// +// Logging +// + +// Severity (change this before building if you want different values) +#define LOG_ERROR 1 +#define LOG_WARNING 2 +#define LOG_NOTICE 3 +#define LOG_DEBUG 4 + +void LogWrite (const char *pSource, // short name of module + unsigned Severity, // see above + const char *pMessage, ...); // uses printf format options + +// +// Debug support +// +#ifndef NDEBUG + +// display "assertion failed" message and halt +void uspi_assertion_failed (const char *pExpr, const char *pFile, unsigned nLine); + +// display hex dump (pSource can be 0) +void DebugHexdump (const void *pBuffer, unsigned nBufLen, const char *pSource /* = 0 */); + +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/uspi/lib/Makefile b/uspi/lib/Makefile new file mode 100644 index 0000000..01ec14d --- /dev/null +++ b/uspi/lib/Makefile @@ -0,0 +1,102 @@ +# +# Makefile +# +# USPi - An USB driver for Raspberry Pi written in C +# Copyright (C) 2014-2018 R. Stange +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +OBJS = uspilibrary.o \ + dwhcidevice.o dwhciregister.o dwhcixferstagedata.o \ + usbconfigparser.o usbdevice.o usbdevicefactory.o usbendpoint.o usbrequest.o usbstandardhub.o \ + devicenameservice.o macaddress.o smsc951x.o lan7800.o string.o util.o \ + usbmassdevice.o \ + dwhciframeschednper.o dwhciframeschedper.o keymap.o usbkeyboard.o \ + dwhcirootport.o usbmouse.o \ + dwhciframeschednsplit.o usbgamepad.o synchronize.o usbstring.o usbmidi.o + +all: libuspi.a + +libuspi.a: $(OBJS) +# rm -f libuspi.a + $(AR) cr libuspi.a $(OBJS) + +USPIHOME = .. + +GCC_BASE = "C:/Program Files (x86)/GNU Tools ARM Embedded/7 2017-q4-major" + +RASPPI ?= 3 +PREFIX ?= arm-none-eabi- + +CC = $(PREFIX)gcc +CPP = $(PREFIX)g++ +AS = $(CC) +LD = $(PREFIX)ld +AR = $(PREFIX)ar + +ifeq ($(strip $(RASPPI)),0) +ARCH ?= -march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -DRPIZERO=1 +CFLAGS += -DRPIZERO=1 +CFLAGS += -DRASPPI=1 +endif +ifeq ($(strip $(RASPPI)),1) +ARCH ?= -march=armv6zk -mtune=arm1176jzf-s -mfloat-abi=hard -DRPIZERO=1 +CFLAGS += -DRPIBPLUS=1 +CFLAGS += -DRASPPI=1 +endif +ifeq ($(strip $(RASPPI)),2) +ARCH ?= -march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -marm -DRPI2=1 +CFLAGS += -DRPI2=1 +endif +ifeq ($(strip $(RASPPI)),3) +ARCH ?= -march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -marm -DRPI3=1 -DDEBUG -DNDEBUG +#ARCH ?= -march=armv8-a -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard -marm -DRPI3=1 +CFLAGS += -DRPI3=1 +endif + +LIBS = $(GCC_BASE)/arm-none-eabi/lib/fpu/libc.a $(GCC_BASE)/lib/gcc/arm-none-eabi/5.4.1/fpu/libgcc.a + +INCLUDE += -I $(GCC_BASE)/arm-none-eabi/include -I $(GCC_BASE)/lib/gcc/arm-none-eabi/5.4.1/include -I include +INCLUDE += -I $(USPIHOME)/include + +AFLAGS += $(ARCH) $(INCLUDE) +CFLAGS += $(ARCH) -Wall -Wno-psabi -fsigned-char -fno-builtin $(INCLUDE) +# -Wno-packed-bitfield-compat +#CFLAGS += -O3 +#CFLAGS += -O4 +CFLAGS += -Ofast + +CPPFLAGS+= $(CFLAGS) -fno-exceptions -fno-rtti -std=c++0x -Wno-write-strings -llibusb + +CFLAGS += -fno-delete-null-pointer-checks -fdata-sections -ffunction-sections -u _printf_float + +%.o: %.S + $(AS) $(AFLAGS) -c -o $@ $< + +%.o: %.c + $(CC) $(CFLAGS) -c -o $@ $< + +#assm add -S +%.o: %.cpp + $(CPP) $(CPPFLAGS) -c -o $@ $< + +clean: +# rm -f *.o *.a *.elf *.lst *.img *.cir *.map *~ $(EXTRACLEAN) + del *.o + del *.a + del *.elf + del *.img + + diff --git a/uspi/lib/README b/uspi/lib/README new file mode 100644 index 0000000..ffc3f12 --- /dev/null +++ b/uspi/lib/README @@ -0,0 +1,135 @@ +The USPi library was inspired by and information was get from: + +* the Linux HS OTG driver by Synopsys Inc. +* the CSUD driver by Alex Chadwick + (https://github.com/Chadderz121/csud) +* the Linux smsc95xx driver by SMSC +* the Embedded Xinu SMSC LAN9512 USB driver by Douglas Comer and Dennis Brylow + (http://embedded-xinu.readthedocs.org/en/latest/arm/rpi/SMSC-LAN9512.html) +* the Linux lan78xx driver by Microchip Technology Inc. + + + +Copyright notice from the Linux HS OTG driver source: + +Synopsys HS OTG Linux Software Driver and documentation (hereinafter, +"Software") is an Unsupported proprietary work of Synopsys, Inc. unless +otherwise expressly agreed to in writing between Synopsys and you. + +The Software IS NOT an item of Licensed Software or Licensed Product under +any End User Software License Agreement or Agreement for Licensed Product +with Synopsys or any supplement thereto. You are permitted to use and +redistribute this Software in source and binary forms, with or without +modification, provided that redistributions of source code must retain this +notice. You may not view, use, disclose, copy or distribute this file or +any information contained herein except pursuant to this license grant from +Synopsys. If you do not agree with this notice, including the disclaimer +below, then you are not authorized to use the Software. + +THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + + + +Copyright notice from CSUD: + +Copyright (c) 2012 Alex Chadwick + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + + +Copyright notice from the Linux smsc95xx driver: + +Copyright (C) 2007-2008 SMSC + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + + +Copyright notice from the Embedded Xinu SMSC LAN9512 USB driver: + +Copyright (c) 2008, Douglas Comer and Dennis Brylow +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted for use in any lawful way, provided that +the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the authors nor their contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHORS AND CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +Copyright notice from the Linux lan78xx driver: + +Copyright (C) 2015 Microchip Technology + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, see . diff --git a/uspi/lib/devicenameservice.c b/uspi/lib/devicenameservice.c new file mode 100644 index 0000000..c2b1818 --- /dev/null +++ b/uspi/lib/devicenameservice.c @@ -0,0 +1,106 @@ +// +// devicenameservice.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include + +static TDeviceNameService *s_pThis = 0; + +void DeviceNameService (TDeviceNameService *pThis) +{ + assert (pThis != 0); + + pThis->m_pList = 0; + + assert (s_pThis == 0); + s_pThis = pThis; +} + +void _DeviceNameService (TDeviceNameService *pThis) +{ + assert (pThis != 0); + + while (pThis->m_pList != 0) + { + TDeviceInfo *pNext = pThis->m_pList->pNext; + + assert (pThis->m_pList->pName != 0); + free (pThis->m_pList->pName); + pThis->m_pList->pName = 0; + + pThis->m_pList->pDevice = 0; + + free (pThis->m_pList); + + pThis->m_pList = pNext; + } + + s_pThis = 0; +} + +void DeviceNameServiceAddDevice (TDeviceNameService *pThis, const char *pName, void *pDevice, boolean bBlockDevice) +{ + assert (pThis != 0); + + TDeviceInfo *pInfo = (TDeviceInfo *) malloc (sizeof (TDeviceInfo)); + assert (pInfo != 0); + + assert (pName != 0); + pInfo->pName = (char *) malloc (strlen (pName)+1); + assert (pInfo->pName != 0); + strcpy (pInfo->pName, pName); + + assert (pDevice != 0); + pInfo->pDevice = pDevice; + + pInfo->bBlockDevice = bBlockDevice; + + pInfo->pNext = pThis->m_pList; + pThis->m_pList = pInfo; +} + +void *DeviceNameServiceGetDevice (TDeviceNameService *pThis, const char *pName, boolean bBlockDevice) +{ + assert (pThis != 0); + assert (pName != 0); + + TDeviceInfo *pInfo = pThis->m_pList; + while (pInfo != 0) + { + assert (pInfo->pName != 0); + if ( strcmp (pName, pInfo->pName) == 0 + && pInfo->bBlockDevice == bBlockDevice) + { + assert (pInfo->pDevice != 0); + return pInfo->pDevice; + } + + pInfo = pInfo->pNext; + } + + return 0; +} + +TDeviceNameService *DeviceNameServiceGet (void) +{ + assert (s_pThis != 0); + return s_pThis; +} diff --git a/uspi/lib/dwhcidevice.c b/uspi/lib/dwhcidevice.c new file mode 100644 index 0000000..6bba49d --- /dev/null +++ b/uspi/lib/dwhcidevice.c @@ -0,0 +1,1445 @@ +// +// dwhcidevice.c +// +// Supports: +// internal DMA only, +// no ISO transfers +// no dynamic attachments +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014-2017 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include +#include + +#define ARM_IRQ_USB 9 // for ConnectInterrupt() + +#define DEVICE_ID_USB_HCD 3 // for SetPowerStateOn() + +// +// Configuration +// +#define DWC_CFG_DYNAMIC_FIFO // re-program FIFOs with these sizes: + #define DWC_CFG_HOST_RX_FIFO_SIZE 1024 // number of 32 bit words + #define DWC_CFG_HOST_NPER_TX_FIFO_SIZE 1024 // number of 32 bit words + #define DWC_CFG_HOST_PER_TX_FIFO_SIZE 1024 // number of 32 bit words + +#define MSEC2HZ(msec) ((msec) * HZ / 1000) + +typedef enum +{ + StageStateNoSplitTransfer, + StageStateStartSplit, + StageStateCompleteSplit, + StageStatePeriodicDelay, + StageStateUnknown +} +TStageState; + +typedef enum +{ + StageSubStateWaitForChannelDisable, + StageSubStateWaitForTransactionComplete, + StageSubStateUnknown +} +TStageSubState; + +static const char FromDWHCI[] = "dwhci"; + +boolean DWHCIDeviceInitCore (TDWHCIDevice *pThis); +boolean DWHCIDeviceInitHost (TDWHCIDevice *pThis); +boolean DWHCIDeviceEnableRootPort (TDWHCIDevice *pThis); +boolean DWHCIDeviceReset (TDWHCIDevice *pThis); +void DWHCIDeviceEnableGlobalInterrupts (TDWHCIDevice *pThis); +void DWHCIDeviceEnableCommonInterrupts (TDWHCIDevice *pThis); +void DWHCIDeviceEnableHostInterrupts (TDWHCIDevice *pThis); +void DWHCIDeviceEnableChannelInterrupt (TDWHCIDevice *pThis, unsigned nChannel); +void DWHCIDeviceDisableChannelInterrupt (TDWHCIDevice *pThis, unsigned nChannel); +void DWHCIDeviceFlushTxFIFO (TDWHCIDevice *pThis, unsigned nFIFO); +void DWHCIDeviceFlushRxFIFO (TDWHCIDevice *pThis); +boolean DWHCIDeviceTransferStage (TDWHCIDevice *pThis, TUSBRequest *pURB, boolean bIn, boolean bStatusStage); +void DWHCIDeviceCompletionRoutine (TUSBRequest *pURB, void *pParam, void *pContext); +boolean DWHCIDeviceTransferStageAsync (TDWHCIDevice *pThis, TUSBRequest *pURB, boolean bIn, boolean bStatusStage); +void DWHCIDeviceStartTransaction (TDWHCIDevice *pThis, TDWHCITransferStageData *pStageData); +void DWHCIDeviceStartChannel (TDWHCIDevice *pThis, TDWHCITransferStageData *pStageData); +void DWHCIDeviceChannelInterruptHandler (TDWHCIDevice *pThis, unsigned nChannel); +void DWHCIDeviceInterruptHandler (void *pParam); +void DWHCIDeviceTimerHandler (unsigned hTimer, void *pParam, void *pContext); +unsigned DWHCIDeviceAllocateChannel (TDWHCIDevice *pThis); +void DWHCIDeviceFreeChannel (TDWHCIDevice *pThis, unsigned nChannel); +boolean DWHCIDeviceWaitForBit (TDWHCIDevice *pThis, TDWHCIRegister *pRegister, u32 nMask,boolean bWaitUntilSet, unsigned nMsTimeout); +#ifndef NDEBUG +void DWHCIDeviceDumpRegister (TDWHCIDevice *pThis, const char *pName, u32 nAddress); +void DWHCIDeviceDumpStatus (TDWHCIDevice *pThis, unsigned nChannel /* = 0 */); +#endif + +void DWHCIDevice (TDWHCIDevice *pThis) +{ + assert (pThis != 0); + + pThis->m_nChannels = 0; + pThis->m_nChannelAllocated = 0; + pThis->m_bWaiting = FALSE; + DWHCIRootPort (&pThis->m_RootPort, pThis); + + for (unsigned nChannel = 0; nChannel < DWHCI_MAX_CHANNELS; nChannel++) + { + pThis->m_pStageData[nChannel] = 0; + } +} + +void _DWHCIDevice (TDWHCIDevice *pThis) +{ + _DWHCIRootPort (&pThis->m_RootPort); +} + +boolean DWHCIDeviceInitialize (TDWHCIDevice *pThis) +{ + assert (pThis != 0); + + DataMemBarrier (); + + TDWHCIRegister VendorId; + DWHCIRegister (&VendorId, DWHCI_CORE_VENDOR_ID); + if (DWHCIRegisterRead (&VendorId) != 0x4F54280A) + { + LogWrite (FromDWHCI, LOG_ERROR, "Unknown vendor 0x%0X", DWHCIRegisterGet (&VendorId)); + _DWHCIRegister (&VendorId); + return FALSE; + } + + if (!SetPowerStateOn (DEVICE_ID_USB_HCD)) + { + LogWrite (FromDWHCI, LOG_ERROR, "Cannot power on"); + _DWHCIRegister (&VendorId); + return FALSE; + } + + // Disable all interrupts + TDWHCIRegister AHBConfig; + DWHCIRegister (&AHBConfig, DWHCI_CORE_AHB_CFG); + DWHCIRegisterRead (&AHBConfig); + DWHCIRegisterAnd (&AHBConfig, ~DWHCI_CORE_AHB_CFG_GLOBALINT_MASK); + DWHCIRegisterWrite (&AHBConfig); + + ConnectInterrupt (ARM_IRQ_USB, DWHCIDeviceInterruptHandler, pThis); + + if (!DWHCIDeviceInitCore (pThis)) + { + LogWrite (FromDWHCI, LOG_ERROR, "Cannot initialize core"); + _DWHCIRegister (&AHBConfig); + _DWHCIRegister (&VendorId); + return FALSE; + } + + DWHCIDeviceEnableGlobalInterrupts (pThis); + + if (!DWHCIDeviceInitHost (pThis)) + { + LogWrite (FromDWHCI, LOG_ERROR, "Cannot initialize host"); + _DWHCIRegister (&AHBConfig); + _DWHCIRegister (&VendorId); + return FALSE; + } + + // The following calls will fail if there is no device or no supported device connected + // to root port. This is not an error because the system may run without an USB device. + + if (!DWHCIDeviceEnableRootPort (pThis)) + { + LogWrite (FromDWHCI, LOG_WARNING, "No device connected to root port"); + _DWHCIRegister (&AHBConfig); + _DWHCIRegister (&VendorId); + return TRUE; + } + + if (!DWHCIRootPortInitialize (&pThis->m_RootPort)) + { + LogWrite (FromDWHCI, LOG_WARNING, "Cannot initialize root port"); + _DWHCIRegister (&AHBConfig); + _DWHCIRegister (&VendorId); + return TRUE; + } + + DataMemBarrier (); + + _DWHCIRegister (&AHBConfig); + _DWHCIRegister (&VendorId); + + return TRUE; +} + +int DWHCIDeviceGetDescriptor (TDWHCIDevice *pThis, TUSBEndpoint *pEndpoint, + unsigned char ucType, unsigned char ucIndex, + void *pBuffer, unsigned nBufSize, + unsigned char ucRequestType) +{ + assert (pThis != 0); + + return DWHCIDeviceControlMessage (pThis, pEndpoint, + ucRequestType, GET_DESCRIPTOR, + (ucType << 8) | ucIndex, 0, + pBuffer, nBufSize); +} + +boolean DWHCIDeviceSetAddress (TDWHCIDevice *pThis, TUSBEndpoint *pEndpoint, u8 ucDeviceAddress) +{ + assert (pThis != 0); + + if (DWHCIDeviceControlMessage (pThis, pEndpoint, REQUEST_OUT, SET_ADDRESS, ucDeviceAddress, 0, 0, 0) < 0) + { + return FALSE; + } + + MsDelay (50); // see USB 2.0 spec (tDSETADDR) + + return TRUE; +} + +boolean DWHCIDeviceSetConfiguration (TDWHCIDevice *pThis, TUSBEndpoint *pEndpoint, u8 ucConfigurationValue) +{ + assert (pThis != 0); + + if (DWHCIDeviceControlMessage (pThis, pEndpoint, REQUEST_OUT, SET_CONFIGURATION, ucConfigurationValue, 0, 0, 0) < 0) + { + return FALSE; + } + + MsDelay (50); + + return TRUE; +} + +int DWHCIDeviceControlMessage (TDWHCIDevice *pThis, TUSBEndpoint *pEndpoint, + u8 ucRequestType, u8 ucRequest, u16 usValue, u16 usIndex, + void *pData, u16 usDataSize) +{ + assert (pThis != 0); + + TSetupData *pSetup = (TSetupData *) malloc (sizeof (TSetupData)); + assert (pSetup != 0); + + pSetup->bmRequestType = ucRequestType; + pSetup->bRequest = ucRequest; + pSetup->wValue = usValue; + pSetup->wIndex = usIndex; + pSetup->wLength = usDataSize; + + TUSBRequest URB; + USBRequest (&URB, pEndpoint, pData, usDataSize, pSetup); + + int nResult = -1; + + if (DWHCIDeviceSubmitBlockingRequest (pThis, &URB)) + { + nResult = USBRequestGetResultLength (&URB); + } + + free (pSetup); + + _USBRequest (&URB); + + return nResult; +} + +int DWHCIDeviceTransfer (TDWHCIDevice *pThis, TUSBEndpoint *pEndpoint, void *pBuffer, unsigned nBufSize) +{ + assert (pThis != 0); + + TUSBRequest URB; + USBRequest (&URB, pEndpoint, pBuffer, nBufSize, 0); + + int nResult = -1; + + if (DWHCIDeviceSubmitBlockingRequest (pThis, &URB)) + { + nResult = USBRequestGetResultLength (&URB); + } + + _USBRequest (&URB); + + return nResult; +} + +boolean DWHCIDeviceSubmitBlockingRequest (TDWHCIDevice *pThis, TUSBRequest *pURB) +{ + assert (pThis != 0); + + DataMemBarrier (); + + assert (pURB != 0); + USBRequestSetStatus (pURB, 0); + + if (USBEndpointGetType (USBRequestGetEndpoint (pURB)) == EndpointTypeControl) + { + TSetupData *pSetup = USBRequestGetSetupData (pURB); + assert (pSetup != 0); + + if (pSetup->bmRequestType & REQUEST_IN) + { + assert (USBRequestGetBufLen (pURB) > 0); + + if ( !DWHCIDeviceTransferStage (pThis, pURB, FALSE, FALSE) + || !DWHCIDeviceTransferStage (pThis, pURB, TRUE, FALSE) + || !DWHCIDeviceTransferStage (pThis, pURB, FALSE, TRUE)) + { + return FALSE; + } + } + else + { + if (USBRequestGetBufLen (pURB) == 0) + { + if ( !DWHCIDeviceTransferStage (pThis, pURB, FALSE, FALSE) + || !DWHCIDeviceTransferStage (pThis, pURB, TRUE, TRUE)) + { + return FALSE; + } + } + else + { + if ( !DWHCIDeviceTransferStage (pThis, pURB, FALSE, FALSE) + || !DWHCIDeviceTransferStage (pThis, pURB, FALSE, FALSE) + || !DWHCIDeviceTransferStage (pThis, pURB, TRUE, TRUE)) + { + return FALSE; + } + } + } + } + else + { + assert ( USBEndpointGetType (USBRequestGetEndpoint (pURB)) == EndpointTypeBulk + || USBEndpointGetType (USBRequestGetEndpoint (pURB)) == EndpointTypeInterrupt); + assert (USBRequestGetBufLen (pURB) > 0); + + if (!DWHCIDeviceTransferStage (pThis, pURB, USBEndpointIsDirectionIn (USBRequestGetEndpoint (pURB)), FALSE)) + { + return FALSE; + } + } + + DataMemBarrier (); + + return TRUE; +} + +boolean DWHCIDeviceSubmitAsyncRequest (TDWHCIDevice *pThis, TUSBRequest *pURB) +{ + assert (pThis != 0); + + DataMemBarrier (); + + assert (pURB != 0); + assert ( USBEndpointGetType (USBRequestGetEndpoint (pURB)) == EndpointTypeBulk + || USBEndpointGetType (USBRequestGetEndpoint (pURB)) == EndpointTypeInterrupt); + assert (USBRequestGetBufLen (pURB) > 0); + + USBRequestSetStatus (pURB, 0); + + boolean bOK = DWHCIDeviceTransferStageAsync (pThis, pURB, USBEndpointIsDirectionIn (USBRequestGetEndpoint (pURB)), FALSE); + + DataMemBarrier (); + + return bOK; +} + +boolean DWHCIDeviceInitCore (TDWHCIDevice *pThis) +{ + assert (pThis != 0); + + TDWHCIRegister USBConfig; + DWHCIRegister (&USBConfig, DWHCI_CORE_USB_CFG); + DWHCIRegisterRead (&USBConfig); + DWHCIRegisterAnd (&USBConfig, ~DWHCI_CORE_USB_CFG_ULPI_EXT_VBUS_DRV); + DWHCIRegisterAnd (&USBConfig, ~DWHCI_CORE_USB_CFG_TERM_SEL_DL_PULSE); + DWHCIRegisterWrite (&USBConfig); + + if (!DWHCIDeviceReset (pThis)) + { + LogWrite (FromDWHCI, LOG_ERROR, "Reset failed"); + return FALSE; + } + + DWHCIRegisterRead (&USBConfig); + DWHCIRegisterAnd (&USBConfig, ~DWHCI_CORE_USB_CFG_ULPI_UTMI_SEL); // select UTMI+ + DWHCIRegisterAnd (&USBConfig, ~DWHCI_CORE_USB_CFG_PHYIF); // UTMI width is 8 + DWHCIRegisterWrite (&USBConfig); + + // Internal DMA mode only + TDWHCIRegister HWConfig2; + DWHCIRegister (&HWConfig2, DWHCI_CORE_HW_CFG2); + DWHCIRegisterRead (&HWConfig2); + assert (DWHCI_CORE_HW_CFG2_ARCHITECTURE (DWHCIRegisterGet (&HWConfig2)) == 2); + + DWHCIRegisterRead (&USBConfig); + if ( DWHCI_CORE_HW_CFG2_HS_PHY_TYPE (DWHCIRegisterGet (&HWConfig2)) == DWHCI_CORE_HW_CFG2_HS_PHY_TYPE_ULPI + && DWHCI_CORE_HW_CFG2_FS_PHY_TYPE (DWHCIRegisterGet (&HWConfig2)) == DWHCI_CORE_HW_CFG2_FS_PHY_TYPE_DEDICATED) + { + DWHCIRegisterOr (&USBConfig, DWHCI_CORE_USB_CFG_ULPI_FSLS); + DWHCIRegisterOr (&USBConfig, DWHCI_CORE_USB_CFG_ULPI_CLK_SUS_M); + } + else + { + DWHCIRegisterAnd (&USBConfig, ~DWHCI_CORE_USB_CFG_ULPI_FSLS); + DWHCIRegisterAnd (&USBConfig, ~DWHCI_CORE_USB_CFG_ULPI_CLK_SUS_M); + } + DWHCIRegisterWrite (&USBConfig); + + assert (pThis->m_nChannels == 0); + pThis->m_nChannels = DWHCI_CORE_HW_CFG2_NUM_HOST_CHANNELS (DWHCIRegisterGet (&HWConfig2)); + assert (4 <= pThis->m_nChannels && pThis->m_nChannels <= DWHCI_MAX_CHANNELS); + + TDWHCIRegister AHBConfig; + DWHCIRegister (&AHBConfig, DWHCI_CORE_AHB_CFG); + DWHCIRegisterRead (&AHBConfig); + DWHCIRegisterOr (&AHBConfig, DWHCI_CORE_AHB_CFG_DMAENABLE); + //DWHCIRegisterOr (&AHBConfig, DWHCI_CORE_AHB_CFG_AHB_SINGLE); // if DMA single mode should be used + DWHCIRegisterOr (&AHBConfig, DWHCI_CORE_AHB_CFG_WAIT_AXI_WRITES); + DWHCIRegisterAnd (&AHBConfig, ~DWHCI_CORE_AHB_CFG_MAX_AXI_BURST__MASK); + //DWHCIRegisterOr (&AHBConfig, 0 << DWHCI_CORE_AHB_CFG_MAX_AXI_BURST__SHIFT); // max. AXI burst length 4 + DWHCIRegisterWrite (&AHBConfig); + + // HNP and SRP are not used + DWHCIRegisterRead (&USBConfig); + DWHCIRegisterAnd (&USBConfig, ~DWHCI_CORE_USB_CFG_HNP_CAPABLE); + DWHCIRegisterAnd (&USBConfig, ~DWHCI_CORE_USB_CFG_SRP_CAPABLE); + DWHCIRegisterWrite (&USBConfig); + + DWHCIDeviceEnableCommonInterrupts (pThis); + + _DWHCIRegister (&AHBConfig); + _DWHCIRegister (&HWConfig2); + _DWHCIRegister (&USBConfig); + + return TRUE; +} + +boolean DWHCIDeviceInitHost (TDWHCIDevice *pThis) +{ + assert (pThis != 0); + + // Restart the PHY clock + TDWHCIRegister Power; + DWHCIRegister2 (&Power, ARM_USB_POWER, 0); + DWHCIRegisterWrite (&Power); + + TDWHCIRegister HostConfig; + DWHCIRegister (&HostConfig, DWHCI_HOST_CFG); + DWHCIRegisterRead (&HostConfig); + DWHCIRegisterAnd (&HostConfig, ~DWHCI_HOST_CFG_FSLS_PCLK_SEL__MASK); + + TDWHCIRegister HWConfig2; + DWHCIRegister (&HWConfig2, DWHCI_CORE_HW_CFG2); + TDWHCIRegister USBConfig; + DWHCIRegister (&USBConfig, DWHCI_CORE_USB_CFG); + if ( DWHCI_CORE_HW_CFG2_HS_PHY_TYPE (DWHCIRegisterRead (&HWConfig2)) == DWHCI_CORE_HW_CFG2_HS_PHY_TYPE_ULPI + && DWHCI_CORE_HW_CFG2_FS_PHY_TYPE (DWHCIRegisterGet (&HWConfig2)) == DWHCI_CORE_HW_CFG2_FS_PHY_TYPE_DEDICATED + && (DWHCIRegisterRead (&USBConfig) & DWHCI_CORE_USB_CFG_ULPI_FSLS)) + { + DWHCIRegisterOr (&HostConfig, DWHCI_HOST_CFG_FSLS_PCLK_SEL_48_MHZ); + } + else + { + DWHCIRegisterOr (&HostConfig, DWHCI_HOST_CFG_FSLS_PCLK_SEL_30_60_MHZ); + } + + DWHCIRegisterWrite (&HostConfig); + +#ifdef DWC_CFG_DYNAMIC_FIFO + TDWHCIRegister RxFIFOSize; + DWHCIRegister2 (&RxFIFOSize, DWHCI_CORE_RX_FIFO_SIZ, DWC_CFG_HOST_RX_FIFO_SIZE); + DWHCIRegisterWrite (&RxFIFOSize); + + TDWHCIRegister NonPeriodicTxFIFOSize; + DWHCIRegister2 (&NonPeriodicTxFIFOSize, DWHCI_CORE_NPER_TX_FIFO_SIZ, 0); + DWHCIRegisterOr (&NonPeriodicTxFIFOSize, DWC_CFG_HOST_RX_FIFO_SIZE); + DWHCIRegisterOr (&NonPeriodicTxFIFOSize, DWC_CFG_HOST_NPER_TX_FIFO_SIZE << 16); + DWHCIRegisterWrite (&NonPeriodicTxFIFOSize); + + TDWHCIRegister HostPeriodicTxFIFOSize; + DWHCIRegister2 (&HostPeriodicTxFIFOSize, DWHCI_CORE_HOST_PER_TX_FIFO_SIZ, 0); + DWHCIRegisterOr (&HostPeriodicTxFIFOSize, DWC_CFG_HOST_RX_FIFO_SIZE + DWC_CFG_HOST_NPER_TX_FIFO_SIZE); + DWHCIRegisterOr (&HostPeriodicTxFIFOSize, DWC_CFG_HOST_PER_TX_FIFO_SIZE << 16); + DWHCIRegisterWrite (&HostPeriodicTxFIFOSize); +#endif + + DWHCIDeviceFlushTxFIFO (pThis, 0x10); // Flush all TX FIFOs + DWHCIDeviceFlushRxFIFO (pThis); + + TDWHCIRegister HostPort; + DWHCIRegister (&HostPort, DWHCI_HOST_PORT); + DWHCIRegisterRead (&HostPort); + DWHCIRegisterAnd (&HostPort, ~DWHCI_HOST_PORT_DEFAULT_MASK); + if (!(DWHCIRegisterGet (&HostPort) & DWHCI_HOST_PORT_POWER)) + { + DWHCIRegisterOr (&HostPort, DWHCI_HOST_PORT_POWER); + DWHCIRegisterWrite (&HostPort); + } + + DWHCIDeviceEnableHostInterrupts (pThis); + + _DWHCIRegister (&HostPort); +#ifdef DWC_CFG_DYNAMIC_FIFO + _DWHCIRegister (&HostPeriodicTxFIFOSize); + _DWHCIRegister (&NonPeriodicTxFIFOSize); + _DWHCIRegister (&RxFIFOSize); +#endif + _DWHCIRegister (&USBConfig); + _DWHCIRegister (&HWConfig2); + _DWHCIRegister (&HostConfig); + _DWHCIRegister (&Power); + + return TRUE; +} + +boolean DWHCIDeviceEnableRootPort (TDWHCIDevice *pThis) +{ + assert (pThis != 0); + + TDWHCIRegister HostPort; + DWHCIRegister (&HostPort, DWHCI_HOST_PORT); + if (!DWHCIDeviceWaitForBit (pThis, &HostPort, DWHCI_HOST_PORT_CONNECT, TRUE, 20)) + { + _DWHCIRegister (&HostPort); + + return FALSE; + } + + MsDelay (100); // see USB 2.0 spec + + DWHCIRegisterRead (&HostPort); + DWHCIRegisterAnd (&HostPort, ~DWHCI_HOST_PORT_DEFAULT_MASK); + DWHCIRegisterOr (&HostPort, DWHCI_HOST_PORT_RESET); + DWHCIRegisterWrite (&HostPort); + + MsDelay (50); // see USB 2.0 spec (tDRSTR) + + DWHCIRegisterRead (&HostPort); + DWHCIRegisterAnd (&HostPort, ~DWHCI_HOST_PORT_DEFAULT_MASK); + DWHCIRegisterAnd (&HostPort, ~DWHCI_HOST_PORT_RESET); + DWHCIRegisterWrite (&HostPort); + + // normally 10ms, seems to be too short for some devices + MsDelay (20); // see USB 2.0 spec (tRSTRCY) + + _DWHCIRegister (&HostPort); + + return TRUE; +} + +boolean DWHCIDeviceReset (TDWHCIDevice *pThis) +{ + assert (pThis != 0); + + TDWHCIRegister Reset; + DWHCIRegister2 (&Reset, DWHCI_CORE_RESET, 0); + + // wait for AHB master IDLE state + if (!DWHCIDeviceWaitForBit (pThis, &Reset, DWHCI_CORE_RESET_AHB_IDLE, TRUE, 100)) + { + _DWHCIRegister (&Reset); + + return FALSE; + } + + // core soft reset + DWHCIRegisterOr (&Reset, DWHCI_CORE_RESET_SOFT_RESET); + DWHCIRegisterWrite (&Reset); + + if (!DWHCIDeviceWaitForBit (pThis, &Reset, DWHCI_CORE_RESET_SOFT_RESET, FALSE, 10)) + { + _DWHCIRegister (&Reset); + + return FALSE; + } + + MsDelay (100); + + _DWHCIRegister (&Reset); + + return TRUE; +} + +void DWHCIDeviceEnableGlobalInterrupts (TDWHCIDevice *pThis) +{ + assert (pThis != 0); + + TDWHCIRegister AHBConfig; + DWHCIRegister (&AHBConfig, DWHCI_CORE_AHB_CFG); + DWHCIRegisterRead (&AHBConfig); + DWHCIRegisterOr (&AHBConfig, DWHCI_CORE_AHB_CFG_GLOBALINT_MASK); + DWHCIRegisterWrite (&AHBConfig); + + _DWHCIRegister (&AHBConfig); +} + +void DWHCIDeviceEnableCommonInterrupts (TDWHCIDevice *pThis) +{ + assert (pThis != 0); + + TDWHCIRegister IntStatus; + DWHCIRegister (&IntStatus, DWHCI_CORE_INT_STAT); // Clear any pending interrupts + DWHCIRegisterSetAll (&IntStatus); + DWHCIRegisterWrite (&IntStatus); + +#if 0 // not used + TDWHCIRegister IntMask; + DWHCIRegister2 (&IntMask, DWHCI_CORE_INT_MASK, DWHCI_CORE_INT_MASK_MODE_MISMATCH + | DWHCI_CORE_INT_MASK_USB_SUSPEND + | DWHCI_CORE_INT_MASK_CON_ID_STS_CHNG + | DWHCI_CORE_INT_MASK_SESS_REQ_INTR + | DWHCI_CORE_INT_MASK_WKUP_INTR); + DWHCIRegisterWrite (&IntMask); + + _DWHCIRegister (&IntMask); +#endif + + _DWHCIRegister (&IntStatus); +} + +void DWHCIDeviceEnableHostInterrupts (TDWHCIDevice *pThis) +{ + assert (pThis != 0); + + TDWHCIRegister IntMask; + DWHCIRegister2 (&IntMask, DWHCI_CORE_INT_MASK, 0); + DWHCIRegisterWrite (&IntMask); // Disable all interrupts + + DWHCIDeviceEnableCommonInterrupts (pThis); + + DWHCIRegisterRead (&IntMask); + DWHCIRegisterOr (&IntMask, DWHCI_CORE_INT_MASK_HC_INTR + //| DWHCI_CORE_INT_MASK_PORT_INTR + //| DWHCI_CORE_INT_MASK_DISCONNECT + ); + DWHCIRegisterWrite (&IntMask); + + _DWHCIRegister (&IntMask); +} + +void DWHCIDeviceEnableChannelInterrupt (TDWHCIDevice *pThis, unsigned nChannel) +{ + assert (pThis != 0); + + TDWHCIRegister AllChanInterruptMask; + DWHCIRegister (&AllChanInterruptMask, DWHCI_HOST_ALLCHAN_INT_MASK); + + uspi_EnterCritical (); + + DWHCIRegisterRead (&AllChanInterruptMask); + DWHCIRegisterOr (&AllChanInterruptMask, 1 << nChannel); + DWHCIRegisterWrite (&AllChanInterruptMask); + + uspi_LeaveCritical (); + + _DWHCIRegister (&AllChanInterruptMask); +} + +void DWHCIDeviceDisableChannelInterrupt (TDWHCIDevice *pThis, unsigned nChannel) +{ + assert (pThis != 0); + + TDWHCIRegister AllChanInterruptMask; + DWHCIRegister (&AllChanInterruptMask, DWHCI_HOST_ALLCHAN_INT_MASK); + + uspi_EnterCritical (); + + DWHCIRegisterRead (&AllChanInterruptMask); + DWHCIRegisterAnd (&AllChanInterruptMask, ~(1 << nChannel)); + DWHCIRegisterWrite (&AllChanInterruptMask); + + uspi_LeaveCritical (); + + _DWHCIRegister (&AllChanInterruptMask); +} + +void DWHCIDeviceFlushTxFIFO (TDWHCIDevice *pThis, unsigned nFIFO) +{ + assert (pThis != 0); + + TDWHCIRegister Reset; + DWHCIRegister2 (&Reset, DWHCI_CORE_RESET, 0); + DWHCIRegisterOr (&Reset, DWHCI_CORE_RESET_TX_FIFO_FLUSH); + DWHCIRegisterAnd (&Reset, ~DWHCI_CORE_RESET_TX_FIFO_NUM__MASK); + DWHCIRegisterOr (&Reset, nFIFO << DWHCI_CORE_RESET_TX_FIFO_NUM__SHIFT); + DWHCIRegisterWrite (&Reset); + + if (DWHCIDeviceWaitForBit (pThis, &Reset, DWHCI_CORE_RESET_TX_FIFO_FLUSH, FALSE, 10)) + { + usDelay (1); // Wait for 3 PHY clocks + } + + _DWHCIRegister (&Reset); +} + +void DWHCIDeviceFlushRxFIFO (TDWHCIDevice *pThis) +{ + assert (pThis != 0); + + TDWHCIRegister Reset; + DWHCIRegister2 (&Reset, DWHCI_CORE_RESET, 0); + DWHCIRegisterOr (&Reset, DWHCI_CORE_RESET_RX_FIFO_FLUSH); + DWHCIRegisterWrite (&Reset); + + if (DWHCIDeviceWaitForBit (pThis, &Reset, DWHCI_CORE_RESET_RX_FIFO_FLUSH, FALSE, 10)) + { + usDelay (1); // Wait for 3 PHY clocks + } + + _DWHCIRegister (&Reset); +} + +boolean DWHCIDeviceTransferStage (TDWHCIDevice *pThis, TUSBRequest *pURB, boolean bIn, boolean bStatusStage) +{ + assert (pThis != 0); + + assert (pURB != 0); + USBRequestSetCompletionRoutine (pURB, DWHCIDeviceCompletionRoutine, 0, pThis); + + assert (!pThis->m_bWaiting); + pThis->m_bWaiting = TRUE; + + if (!DWHCIDeviceTransferStageAsync (pThis, pURB, bIn, bStatusStage)) + { + pThis->m_bWaiting = FALSE; + + return FALSE; + } + + while (pThis->m_bWaiting) + { + // do nothing + } + + return USBRequestGetStatus (pURB); +} + +void DWHCIDeviceCompletionRoutine (TUSBRequest *pURB, void *pParam, void *pContext) +{ + TDWHCIDevice *pThis = (TDWHCIDevice *) pContext; + assert (pThis != 0); + + pThis->m_bWaiting = FALSE; +} + +boolean DWHCIDeviceTransferStageAsync (TDWHCIDevice *pThis, TUSBRequest *pURB, boolean bIn, boolean bStatusStage) +{ + assert (pThis != 0); + assert (pURB != 0); + + unsigned nChannel = DWHCIDeviceAllocateChannel (pThis); + if (nChannel >= pThis->m_nChannels) + { + return FALSE; + } + + TDWHCITransferStageData *pStageData = + (TDWHCITransferStageData *) malloc (sizeof (TDWHCITransferStageData)); + assert (pStageData != 0); + DWHCITransferStageData (pStageData, nChannel, pURB, bIn, bStatusStage); + + assert (pThis->m_pStageData[nChannel] == 0); + pThis->m_pStageData[nChannel] = pStageData; + + DWHCIDeviceEnableChannelInterrupt (pThis, nChannel); + + if (!DWHCITransferStageDataIsSplit (pStageData)) + { + DWHCITransferStageDataSetState (pStageData, StageStateNoSplitTransfer); + } + else + { + if (!DWHCITransferStageDataBeginSplitCycle (pStageData)) + { + DWHCIDeviceDisableChannelInterrupt (pThis, nChannel); + + _DWHCITransferStageData (pStageData); + free (pStageData); + + pThis->m_pStageData[nChannel] = 0; + + DWHCIDeviceFreeChannel (pThis, nChannel); + + return FALSE; + } + + DWHCITransferStageDataSetState (pStageData, StageStateStartSplit); + DWHCITransferStageDataSetSplitComplete (pStageData, FALSE); + + TDWHCIFrameScheduler *pFrameScheduler = + DWHCITransferStageDataGetFrameScheduler (pStageData); + assert (pFrameScheduler != 0); + pFrameScheduler->StartSplit (pFrameScheduler); + } + + DWHCIDeviceStartTransaction (pThis, pStageData); + + return TRUE; +} + +void DWHCIDeviceStartTransaction (TDWHCIDevice *pThis, TDWHCITransferStageData *pStageData) +{ + assert (pThis != 0); + + assert (pStageData != 0); + unsigned nChannel = DWHCITransferStageDataGetChannelNumber (pStageData); + assert (nChannel < pThis->m_nChannels); + + // channel must be disabled, if not already done but controller + TDWHCIRegister Character; + DWHCIRegister (&Character, DWHCI_HOST_CHAN_CHARACTER (nChannel)); + DWHCIRegisterRead (&Character); + if (DWHCIRegisterIsSet (&Character, DWHCI_HOST_CHAN_CHARACTER_ENABLE)) + { + DWHCITransferStageDataSetSubState (pStageData, StageSubStateWaitForChannelDisable); + + DWHCIRegisterAnd (&Character, ~DWHCI_HOST_CHAN_CHARACTER_ENABLE); + DWHCIRegisterOr (&Character, DWHCI_HOST_CHAN_CHARACTER_DISABLE); + DWHCIRegisterWrite (&Character); + + TDWHCIRegister ChanInterruptMask; + DWHCIRegister (&ChanInterruptMask, DWHCI_HOST_CHAN_INT_MASK (nChannel)); + DWHCIRegisterSet (&ChanInterruptMask, DWHCI_HOST_CHAN_INT_HALTED); + DWHCIRegisterWrite (&ChanInterruptMask); + + _DWHCIRegister (&ChanInterruptMask); + } + else + { + DWHCIDeviceStartChannel (pThis, pStageData); + } + + _DWHCIRegister (&Character); +} + +void DWHCIDeviceStartChannel (TDWHCIDevice *pThis, TDWHCITransferStageData *pStageData) +{ + assert (pThis != 0); + + assert (pStageData != 0); + unsigned nChannel = DWHCITransferStageDataGetChannelNumber (pStageData); + assert (nChannel < pThis->m_nChannels); + + DWHCITransferStageDataSetSubState (pStageData, StageSubStateWaitForTransactionComplete); + + // reset all pending channel interrupts + TDWHCIRegister ChanInterrupt; + DWHCIRegister (&ChanInterrupt, DWHCI_HOST_CHAN_INT (nChannel)); + DWHCIRegisterSetAll (&ChanInterrupt); + DWHCIRegisterWrite (&ChanInterrupt); + + // set transfer size, packet count and pid + TDWHCIRegister TransferSize; + DWHCIRegister2 (&TransferSize, DWHCI_HOST_CHAN_XFER_SIZ (nChannel), 0); + DWHCIRegisterOr (&TransferSize, DWHCITransferStageDataGetBytesToTransfer (pStageData) & DWHCI_HOST_CHAN_XFER_SIZ_BYTES__MASK); + DWHCIRegisterOr (&TransferSize, (DWHCITransferStageDataGetPacketsToTransfer (pStageData) << DWHCI_HOST_CHAN_XFER_SIZ_PACKETS__SHIFT) + & DWHCI_HOST_CHAN_XFER_SIZ_PACKETS__MASK); + DWHCIRegisterOr (&TransferSize, DWHCITransferStageDataGetPID (pStageData) << DWHCI_HOST_CHAN_XFER_SIZ_PID__SHIFT); + DWHCIRegisterWrite (&TransferSize); + + // set DMA address + TDWHCIRegister DMAAddress; + DWHCIRegister2 (&DMAAddress, DWHCI_HOST_CHAN_DMA_ADDR (nChannel), + BUS_ADDRESS (DWHCITransferStageDataGetDMAAddress (pStageData))); + DWHCIRegisterWrite (&DMAAddress); + + uspi_CleanAndInvalidateDataCacheRange (DWHCITransferStageDataGetDMAAddress (pStageData), + DWHCITransferStageDataGetBytesToTransfer (pStageData)); + DataMemBarrier (); + + // set split control + TDWHCIRegister SplitControl; + DWHCIRegister2 (&SplitControl, DWHCI_HOST_CHAN_SPLIT_CTRL (nChannel), 0); + if (DWHCITransferStageDataIsSplit (pStageData)) + { + DWHCIRegisterOr (&SplitControl, DWHCITransferStageDataGetHubPortAddress (pStageData)); + DWHCIRegisterOr (&SplitControl, DWHCITransferStageDataGetHubAddress (pStageData) + << DWHCI_HOST_CHAN_SPLIT_CTRL_HUB_ADDRESS__SHIFT); + DWHCIRegisterOr (&SplitControl, DWHCITransferStageDataGetSplitPosition (pStageData) + << DWHCI_HOST_CHAN_SPLIT_CTRL_XACT_POS__SHIFT); + if (DWHCITransferStageDataIsSplitComplete (pStageData)) + { + DWHCIRegisterOr (&SplitControl, DWHCI_HOST_CHAN_SPLIT_CTRL_COMPLETE_SPLIT); + } + DWHCIRegisterOr (&SplitControl, DWHCI_HOST_CHAN_SPLIT_CTRL_SPLIT_ENABLE); + } + DWHCIRegisterWrite (&SplitControl); + + // set channel parameters + TDWHCIRegister Character; + DWHCIRegister (&Character, DWHCI_HOST_CHAN_CHARACTER (nChannel)); + DWHCIRegisterRead (&Character); + DWHCIRegisterAnd (&Character, ~DWHCI_HOST_CHAN_CHARACTER_MAX_PKT_SIZ__MASK); + DWHCIRegisterOr (&Character, DWHCITransferStageDataGetMaxPacketSize (pStageData) & DWHCI_HOST_CHAN_CHARACTER_MAX_PKT_SIZ__MASK); + + DWHCIRegisterAnd (&Character, ~DWHCI_HOST_CHAN_CHARACTER_MULTI_CNT__MASK); + DWHCIRegisterOr (&Character, 1 << DWHCI_HOST_CHAN_CHARACTER_MULTI_CNT__SHIFT); // TODO: optimize + + if (DWHCITransferStageDataIsDirectionIn (pStageData)) + { + DWHCIRegisterOr (&Character, DWHCI_HOST_CHAN_CHARACTER_EP_DIRECTION_IN); + } + else + { + DWHCIRegisterAnd (&Character, ~DWHCI_HOST_CHAN_CHARACTER_EP_DIRECTION_IN); + } + + if (DWHCITransferStageDataGetSpeed (pStageData) == USBSpeedLow) + { + DWHCIRegisterOr (&Character, DWHCI_HOST_CHAN_CHARACTER_LOW_SPEED_DEVICE); + } + else + { + DWHCIRegisterAnd (&Character, ~DWHCI_HOST_CHAN_CHARACTER_LOW_SPEED_DEVICE); + } + + DWHCIRegisterAnd (&Character, ~DWHCI_HOST_CHAN_CHARACTER_DEVICE_ADDRESS__MASK); + DWHCIRegisterOr (&Character, DWHCITransferStageDataGetDeviceAddress (pStageData) << DWHCI_HOST_CHAN_CHARACTER_DEVICE_ADDRESS__SHIFT); + + DWHCIRegisterAnd (&Character, ~DWHCI_HOST_CHAN_CHARACTER_EP_TYPE__MASK); + DWHCIRegisterOr (&Character, DWHCITransferStageDataGetEndpointType (pStageData) << DWHCI_HOST_CHAN_CHARACTER_EP_TYPE__SHIFT); + + DWHCIRegisterAnd (&Character, ~DWHCI_HOST_CHAN_CHARACTER_EP_NUMBER__MASK); + DWHCIRegisterOr (&Character, DWHCITransferStageDataGetEndpointNumber (pStageData) << DWHCI_HOST_CHAN_CHARACTER_EP_NUMBER__SHIFT); + + TDWHCIFrameScheduler *pFrameScheduler = DWHCITransferStageDataGetFrameScheduler (pStageData); + if (pFrameScheduler != 0) + { + pFrameScheduler->WaitForFrame (pFrameScheduler); + + if (pFrameScheduler->IsOddFrame (pFrameScheduler)) + { + DWHCIRegisterOr (&Character, DWHCI_HOST_CHAN_CHARACTER_PER_ODD_FRAME); + } + else + { + DWHCIRegisterAnd (&Character, ~DWHCI_HOST_CHAN_CHARACTER_PER_ODD_FRAME); + } + } + + TDWHCIRegister ChanInterruptMask; + DWHCIRegister (&ChanInterruptMask, DWHCI_HOST_CHAN_INT_MASK (nChannel)); + DWHCIRegisterSet (&ChanInterruptMask, DWHCITransferStageDataGetStatusMask (pStageData)); + DWHCIRegisterWrite (&ChanInterruptMask); + + DWHCIRegisterOr (&Character, DWHCI_HOST_CHAN_CHARACTER_ENABLE); + DWHCIRegisterAnd (&Character, ~DWHCI_HOST_CHAN_CHARACTER_DISABLE); + DWHCIRegisterWrite (&Character); + + _DWHCIRegister (&ChanInterruptMask); + _DWHCIRegister (&Character); + _DWHCIRegister (&SplitControl); + _DWHCIRegister (&DMAAddress); + _DWHCIRegister (&TransferSize); + _DWHCIRegister (&ChanInterrupt); +} + +void DWHCIDeviceChannelInterruptHandler (TDWHCIDevice *pThis, unsigned nChannel) +{ + assert (pThis != 0); + + TDWHCITransferStageData *pStageData = pThis->m_pStageData[nChannel]; + assert (pStageData != 0); + TDWHCIFrameScheduler *pFrameScheduler = DWHCITransferStageDataGetFrameScheduler (pStageData); + TUSBRequest *pURB = DWHCITransferStageDataGetURB (pStageData); + assert (pURB != 0); + + switch (DWHCITransferStageDataGetSubState (pStageData)) + { + case StageSubStateWaitForChannelDisable: + DWHCIDeviceStartChannel (pThis, pStageData); + return; + + case StageSubStateWaitForTransactionComplete: { + uspi_CleanAndInvalidateDataCacheRange (DWHCITransferStageDataGetDMAAddress (pStageData), + DWHCITransferStageDataGetBytesToTransfer (pStageData)); + DataMemBarrier (); + + TDWHCIRegister TransferSize; + DWHCIRegister (&TransferSize, DWHCI_HOST_CHAN_XFER_SIZ (nChannel)); + DWHCIRegisterRead (&TransferSize); + + TDWHCIRegister ChanInterrupt; + DWHCIRegister (&ChanInterrupt, DWHCI_HOST_CHAN_INT (nChannel)); + + // restart halted transaction + if (DWHCIRegisterRead (&ChanInterrupt) == DWHCI_HOST_CHAN_INT_HALTED) + { + DWHCIDeviceStartTransaction (pThis, pStageData); + return; + } + + assert ( !DWHCITransferStageDataIsPeriodic (pStageData) + || DWHCI_HOST_CHAN_XFER_SIZ_PID (DWHCIRegisterGet (&TransferSize)) + != DWHCI_HOST_CHAN_XFER_SIZ_PID_MDATA); + + DWHCITransferStageDataTransactionComplete (pStageData, DWHCIRegisterRead (&ChanInterrupt), + DWHCI_HOST_CHAN_XFER_SIZ_PACKETS (DWHCIRegisterGet (&TransferSize)), + DWHCIRegisterGet (&TransferSize) & DWHCI_HOST_CHAN_XFER_SIZ_BYTES__MASK); + + _DWHCIRegister (&ChanInterrupt); + _DWHCIRegister (&TransferSize); + } break; + + default: + assert (0); + break; + } + + unsigned nStatus; + + switch (DWHCITransferStageDataGetState (pStageData)) + { + case StageStateNoSplitTransfer: + nStatus = DWHCITransferStageDataGetTransactionStatus (pStageData); + if (nStatus & DWHCI_HOST_CHAN_INT_ERROR_MASK) + { + LogWrite (FromDWHCI, LOG_ERROR, "Transaction failed (status 0x%X)", nStatus); + + USBRequestSetStatus (pURB, 0); + } + else if ( (nStatus & (DWHCI_HOST_CHAN_INT_NAK | DWHCI_HOST_CHAN_INT_NYET)) + && DWHCITransferStageDataIsPeriodic (pStageData)) + { + DWHCITransferStageDataSetState (pStageData, StageStatePeriodicDelay); + + unsigned nInterval = USBEndpointGetInterval (USBRequestGetEndpoint (pURB)); + + StartKernelTimer (MSEC2HZ (nInterval), DWHCIDeviceTimerHandler, pStageData, pThis); + + break; + } + else + { + if (!DWHCITransferStageDataIsStatusStage (pStageData)) + { + USBRequestSetResultLen (pURB, DWHCITransferStageDataGetResultLen (pStageData)); + } + + USBRequestSetStatus (pURB, 1); + } + + DWHCIDeviceDisableChannelInterrupt (pThis, nChannel); + + _DWHCITransferStageData (pStageData); + free (pStageData); + pThis->m_pStageData[nChannel] = 0; + + DWHCIDeviceFreeChannel (pThis, nChannel); + + USBRequestCallCompletionRoutine (pURB); + break; + + case StageStateStartSplit: + nStatus = DWHCITransferStageDataGetTransactionStatus (pStageData); + if ( (nStatus & DWHCI_HOST_CHAN_INT_ERROR_MASK) + || (nStatus & DWHCI_HOST_CHAN_INT_NAK) + || (nStatus & DWHCI_HOST_CHAN_INT_NYET)) + { + LogWrite (FromDWHCI, LOG_ERROR, "Transaction failed (status 0x%X)", nStatus); + + USBRequestSetStatus (pURB, 0); + + DWHCIDeviceDisableChannelInterrupt (pThis, nChannel); + + _DWHCITransferStageData (pStageData); + free (pStageData); + pThis->m_pStageData[nChannel] = 0; + + DWHCIDeviceFreeChannel (pThis, nChannel); + + USBRequestCallCompletionRoutine (pURB); + break; + } + + pFrameScheduler->TransactionComplete (pFrameScheduler, nStatus); + + DWHCITransferStageDataSetState (pStageData, StageStateCompleteSplit); + DWHCITransferStageDataSetSplitComplete (pStageData, TRUE); + + if (!pFrameScheduler->CompleteSplit (pFrameScheduler)) + { + goto LeaveCompleteSplit; + } + + DWHCIDeviceStartTransaction (pThis, pStageData); + break; + + case StageStateCompleteSplit: + nStatus = DWHCITransferStageDataGetTransactionStatus (pStageData); + if (nStatus & DWHCI_HOST_CHAN_INT_ERROR_MASK) + { + LogWrite (FromDWHCI, LOG_ERROR, "Transaction failed (status 0x%X)", nStatus); + + USBRequestSetStatus (pURB, 0); + + DWHCIDeviceDisableChannelInterrupt (pThis, nChannel); + + _DWHCITransferStageData (pStageData); + free (pStageData); + pThis->m_pStageData[nChannel] = 0; + + DWHCIDeviceFreeChannel (pThis, nChannel); + + USBRequestCallCompletionRoutine (pURB); + break; + } + + pFrameScheduler->TransactionComplete (pFrameScheduler, nStatus); + + if (pFrameScheduler->CompleteSplit (pFrameScheduler)) + { + DWHCIDeviceStartTransaction (pThis, pStageData); + break; + } + + LeaveCompleteSplit: + if (!DWHCITransferStageDataIsStageComplete (pStageData)) + { + if (!DWHCITransferStageDataBeginSplitCycle (pStageData)) + { + USBRequestSetStatus (pURB, 0); + + DWHCIDeviceDisableChannelInterrupt (pThis, nChannel); + + _DWHCITransferStageData (pStageData); + free (pStageData); + pThis->m_pStageData[nChannel] = 0; + + DWHCIDeviceFreeChannel (pThis, nChannel); + + USBRequestCallCompletionRoutine (pURB); + break; + } + + if (!DWHCITransferStageDataIsPeriodic (pStageData)) + { + DWHCITransferStageDataSetState (pStageData, StageStateStartSplit); + DWHCITransferStageDataSetSplitComplete (pStageData, FALSE); + + pFrameScheduler->StartSplit (pFrameScheduler); + + DWHCIDeviceStartTransaction (pThis, pStageData); + } + else + { + DWHCITransferStageDataSetState (pStageData, StageStatePeriodicDelay); + + unsigned nInterval = USBEndpointGetInterval (USBRequestGetEndpoint (pURB)); + + StartKernelTimer (MSEC2HZ (nInterval), DWHCIDeviceTimerHandler, pStageData, pThis); + } + break; + } + + DWHCIDeviceDisableChannelInterrupt (pThis, nChannel); + + if (!DWHCITransferStageDataIsStatusStage (pStageData)) + { + USBRequestSetResultLen (pURB, DWHCITransferStageDataGetResultLen (pStageData)); + } + USBRequestSetStatus (pURB, 1); + + _DWHCITransferStageData (pStageData); + free (pStageData); + pThis->m_pStageData[nChannel] = 0; + + DWHCIDeviceFreeChannel (pThis, nChannel); + + USBRequestCallCompletionRoutine (pURB); + break; + + default: + assert (0); + break; + } +} + +void DWHCIDeviceInterruptHandler (void *pParam) +{ + TDWHCIDevice *pThis = (TDWHCIDevice *) pParam; + assert (pThis != 0); + + DataMemBarrier (); + + TDWHCIRegister IntStatus; + DWHCIRegister (&IntStatus, DWHCI_CORE_INT_STAT); + DWHCIRegisterRead (&IntStatus); + + if (DWHCIRegisterGet (&IntStatus) & DWHCI_CORE_INT_STAT_HC_INTR) + { + TDWHCIRegister AllChanInterrupt; + DWHCIRegister (&AllChanInterrupt, DWHCI_HOST_ALLCHAN_INT); + DWHCIRegisterRead (&AllChanInterrupt); + DWHCIRegisterWrite (&AllChanInterrupt); + + unsigned nChannelMask = 1; + for (unsigned nChannel = 0; nChannel < pThis->m_nChannels; nChannel++) + { + if (DWHCIRegisterGet (&AllChanInterrupt) & nChannelMask) + { + TDWHCIRegister ChanInterruptMask; + DWHCIRegister2 (&ChanInterruptMask, DWHCI_HOST_CHAN_INT_MASK(nChannel), 0); + DWHCIRegisterWrite (&ChanInterruptMask); + + DWHCIDeviceChannelInterruptHandler (pThis, nChannel); + + _DWHCIRegister (&ChanInterruptMask); + } + + nChannelMask <<= 1; + } + + _DWHCIRegister (&AllChanInterrupt); + } +#if 0 + if (IntStatus.Get () & DWHCI_CORE_INT_STAT_PORT_INTR) + { + CDWHCIRegister HostPort (DWHCI_HOST_PORT); + HostPort.Read (); + + CLogger::Get ()->Write (FromDWHCI, LOG_DEBUG, "Port interrupt (status 0x%08X)", HostPort.Get ()); + + HostPort.And (~DWHCI_HOST_PORT_ENABLE); + HostPort.Or ( DWHCI_HOST_PORT_CONNECT_CHANGED + | DWHCI_HOST_PORT_ENABLE_CHANGED + | DWHCI_HOST_PORT_OVERCURRENT_CHANGED); + HostPort.Write (); + + IntStatus.Or (DWHCI_CORE_INT_STAT_PORT_INTR); + } +#endif + DWHCIRegisterWrite (&IntStatus); + + DataMemBarrier (); + + _DWHCIRegister (&IntStatus); +} + +void DWHCIDeviceTimerHandler (unsigned hTimer, void *pParam, void *pContext) +{ + TDWHCIDevice *pThis = (TDWHCIDevice *) pContext; + assert (pThis != 0); + + TDWHCITransferStageData *pStageData = (TDWHCITransferStageData *) pParam; + assert (pStageData != 0); + + DataMemBarrier (); + + assert (pStageData != 0); + assert (DWHCITransferStageDataGetState (pStageData) == StageStatePeriodicDelay); + + if (DWHCITransferStageDataIsSplit (pStageData)) + { + DWHCITransferStageDataSetState (pStageData, StageStateStartSplit); + + DWHCITransferStageDataSetSplitComplete (pStageData, FALSE); + TDWHCIFrameScheduler *pFrameScheduler = + DWHCITransferStageDataGetFrameScheduler (pStageData); + assert (pFrameScheduler != 0); + pFrameScheduler->StartSplit (pFrameScheduler); + } + else + { + DWHCITransferStageDataSetState (pStageData, StageStateNoSplitTransfer); + } + + DWHCIDeviceStartTransaction (pThis, pStageData); + + DataMemBarrier (); +} + +unsigned DWHCIDeviceAllocateChannel (TDWHCIDevice *pThis) +{ + assert (pThis != 0); + + uspi_EnterCritical (); + + unsigned nChannelMask = 1; + for (unsigned nChannel = 0; nChannel < pThis->m_nChannels; nChannel++) + { + if (!(pThis->m_nChannelAllocated & nChannelMask)) + { + pThis->m_nChannelAllocated |= nChannelMask; + + uspi_LeaveCritical (); + + return nChannel; + } + + nChannelMask <<= 1; + } + + uspi_LeaveCritical (); + + return DWHCI_MAX_CHANNELS; +} + +void DWHCIDeviceFreeChannel (TDWHCIDevice *pThis, unsigned nChannel) +{ + assert (pThis != 0); + + assert (nChannel < pThis->m_nChannels); + unsigned nChannelMask = 1 << nChannel; + + uspi_EnterCritical (); + + assert (pThis->m_nChannelAllocated & nChannelMask); + pThis->m_nChannelAllocated &= ~nChannelMask; + + uspi_LeaveCritical (); +} + +boolean DWHCIDeviceWaitForBit (TDWHCIDevice *pThis, TDWHCIRegister *pRegister, u32 nMask, boolean bWaitUntilSet, unsigned nMsTimeout) +{ + assert (pThis != 0); + + assert (pRegister != 0); + assert (nMask != 0); + assert (nMsTimeout > 0); + + while ((DWHCIRegisterRead (pRegister) & nMask) ? !bWaitUntilSet : bWaitUntilSet) + { + MsDelay (1); + + if (--nMsTimeout == 0) + { + //LogWrite (FromDWHCI, LOG_WARNING, "Timeout"); +#ifndef NDEBUG + //DWHCIRegisterDump (pRegister); +#endif + return FALSE; + } + } + + return TRUE; +} + +TUSBSpeed DWHCIDeviceGetPortSpeed (TDWHCIDevice *pThis) +{ + assert (pThis != 0); + + TUSBSpeed Result = USBSpeedUnknown; + + TDWHCIRegister HostPort; + DWHCIRegister (&HostPort, DWHCI_HOST_PORT); + + switch (DWHCI_HOST_PORT_SPEED (DWHCIRegisterRead (&HostPort))) + { + case DWHCI_HOST_PORT_SPEED_HIGH: + Result = USBSpeedHigh; + break; + + case DWHCI_HOST_PORT_SPEED_FULL: + Result = USBSpeedFull; + break; + + case DWHCI_HOST_PORT_SPEED_LOW: + Result = USBSpeedLow; + break; + + default: + break; + } + + _DWHCIRegister (&HostPort); + + return Result; +} + +boolean DWHCIDeviceOvercurrentDetected (TDWHCIDevice *pThis) +{ + assert (pThis != 0); + + TDWHCIRegister HostPort; + DWHCIRegister (&HostPort, DWHCI_HOST_PORT); + + if (DWHCIRegisterRead (&HostPort) & DWHCI_HOST_PORT_OVERCURRENT) + { + _DWHCIRegister (&HostPort); + + return TRUE; + } + + _DWHCIRegister (&HostPort); + + return FALSE; +} + +void DWHCIDeviceDisableRootPort (TDWHCIDevice *pThis) +{ + assert (pThis != 0); + + TDWHCIRegister HostPort; + DWHCIRegister (&HostPort, DWHCI_HOST_PORT); + + DWHCIRegisterRead (&HostPort); + DWHCIRegisterAnd (&HostPort, ~DWHCI_HOST_PORT_POWER); + DWHCIRegisterWrite (&HostPort); + + _DWHCIRegister (&HostPort); +} + +#ifndef NDEBUG + +void DWHCIDeviceDumpRegister (TDWHCIDevice *pThis, const char *pName, u32 nAddress) +{ + assert (pThis != 0); + + TDWHCIRegister Register; + DWHCIRegister (&Register, nAddress); + + DataMemBarrier (); + + LogWrite (FromDWHCI, LOG_DEBUG, "0x%08X %s", DWHCIRegisterRead (&Register), pName); + + _DWHCIRegister (&Register); +} + +void DWHCIDeviceDumpStatus (TDWHCIDevice *pThis, unsigned nChannel) +{ + assert (pThis != 0); + + DWHCIDeviceDumpRegister (pThis, "OTG_CTRL", DWHCI_CORE_OTG_CTRL); + DWHCIDeviceDumpRegister (pThis, "AHB_CFG", DWHCI_CORE_AHB_CFG); + DWHCIDeviceDumpRegister (pThis, "USB_CFG", DWHCI_CORE_USB_CFG); + DWHCIDeviceDumpRegister (pThis, "RESET", DWHCI_CORE_RESET); + DWHCIDeviceDumpRegister (pThis, "INT_STAT", DWHCI_CORE_INT_STAT); + DWHCIDeviceDumpRegister (pThis, "INT_MASK", DWHCI_CORE_INT_MASK); + DWHCIDeviceDumpRegister (pThis, "RX_FIFO_SIZ", DWHCI_CORE_RX_FIFO_SIZ); + DWHCIDeviceDumpRegister (pThis, "NPER_TX_FIFO_SIZ", DWHCI_CORE_NPER_TX_FIFO_SIZ); + DWHCIDeviceDumpRegister (pThis, "NPER_TX_STAT", DWHCI_CORE_NPER_TX_STAT); + DWHCIDeviceDumpRegister (pThis, "HOST_PER_TX_FIFO_SIZ", DWHCI_CORE_HOST_PER_TX_FIFO_SIZ); + + DWHCIDeviceDumpRegister (pThis, "HOST_CFG", DWHCI_HOST_CFG); + DWHCIDeviceDumpRegister (pThis, "HOST_PER_TX_FIFO_STAT", DWHCI_HOST_PER_TX_FIFO_STAT); + DWHCIDeviceDumpRegister (pThis, "HOST_ALLCHAN_INT", DWHCI_HOST_ALLCHAN_INT); + DWHCIDeviceDumpRegister (pThis, "HOST_ALLCHAN_INT_MASK", DWHCI_HOST_ALLCHAN_INT_MASK); + DWHCIDeviceDumpRegister (pThis, "HOST_PORT", DWHCI_HOST_PORT); + + DWHCIDeviceDumpRegister (pThis, "HOST_CHAN_CHARACTER(n)", DWHCI_HOST_CHAN_CHARACTER (nChannel)); + DWHCIDeviceDumpRegister (pThis, "HOST_CHAN_SPLIT_CTRL(n)", DWHCI_HOST_CHAN_SPLIT_CTRL (nChannel)); + DWHCIDeviceDumpRegister (pThis, "HOST_CHAN_INT(n)", DWHCI_HOST_CHAN_INT (nChannel)); + DWHCIDeviceDumpRegister (pThis, "HOST_CHAN_INT_MASK(n)", DWHCI_HOST_CHAN_INT_MASK (nChannel)); + DWHCIDeviceDumpRegister (pThis, "HOST_CHAN_XFER_SIZ(n)", DWHCI_HOST_CHAN_XFER_SIZ (nChannel)); + DWHCIDeviceDumpRegister (pThis, "HOST_CHAN_DMA_ADDR(n)", DWHCI_HOST_CHAN_DMA_ADDR (nChannel)); +} + +#endif diff --git a/uspi/lib/dwhciframeschednper.c b/uspi/lib/dwhciframeschednper.c new file mode 100644 index 0000000..3f7889c --- /dev/null +++ b/uspi/lib/dwhciframeschednper.c @@ -0,0 +1,165 @@ +// +// dwhciframeschednper.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include + +#define uFRAME 125 // micro seconds + +typedef enum +{ + StateStartSplit, + StateStartSplitComplete, + StateCompleteSplit, + StateCompleteRetry, + StateCompleteSplitComplete, + StateCompleteSplitFailed, + StateUnknown +} +TFrameSchedulerState; + +void DWHCIFrameSchedulerNonPeriodic (TDWHCIFrameSchedulerNonPeriodic *pThis) +{ + assert (pThis != 0); + + TDWHCIFrameScheduler *pBase = (TDWHCIFrameScheduler *) pThis; + + pBase->_DWHCIFrameScheduler = _DWHCIFrameSchedulerNonPeriodic; + pBase->StartSplit = DWHCIFrameSchedulerNonPeriodicStartSplit; + pBase->CompleteSplit = DWHCIFrameSchedulerNonPeriodicCompleteSplit; + pBase->TransactionComplete = DWHCIFrameSchedulerNonPeriodicTransactionComplete; + pBase->WaitForFrame = DWHCIFrameSchedulerNonPeriodicWaitForFrame; + pBase->IsOddFrame = DWHCIFrameSchedulerNonPeriodicIsOddFrame; + + pThis->m_nState = StateUnknown; +} + +void _DWHCIFrameSchedulerNonPeriodic (TDWHCIFrameScheduler *pBase) +{ + TDWHCIFrameSchedulerNonPeriodic *pThis = (TDWHCIFrameSchedulerNonPeriodic *) pBase; + assert (pThis != 0); + + pThis->m_nState = StateUnknown; +} + +void DWHCIFrameSchedulerNonPeriodicStartSplit (TDWHCIFrameScheduler *pBase) +{ + TDWHCIFrameSchedulerNonPeriodic *pThis = (TDWHCIFrameSchedulerNonPeriodic *) pBase; + assert (pThis != 0); + + pThis->m_nState = StateStartSplit; +} + +boolean DWHCIFrameSchedulerNonPeriodicCompleteSplit (TDWHCIFrameScheduler *pBase) +{ + TDWHCIFrameSchedulerNonPeriodic *pThis = (TDWHCIFrameSchedulerNonPeriodic *) pBase; + assert (pThis != 0); + + boolean bResult = FALSE; + + switch (pThis->m_nState) + { + case StateStartSplitComplete: + pThis->m_nState = StateCompleteSplit; + pThis->m_nTries = 3; + bResult = TRUE; + break; + + case StateCompleteSplit: + case StateCompleteRetry: + usDelay (5 * uFRAME); + bResult = TRUE; + break; + + case StateCompleteSplitComplete: + case StateCompleteSplitFailed: + break; + + default: + assert (0); + break; + } + + return bResult; +} + +void DWHCIFrameSchedulerNonPeriodicTransactionComplete (TDWHCIFrameScheduler *pBase, u32 nStatus) +{ + TDWHCIFrameSchedulerNonPeriodic *pThis = (TDWHCIFrameSchedulerNonPeriodic *) pBase; + assert (pThis != 0); + + switch (pThis->m_nState) + { + case StateStartSplit: + assert (nStatus & DWHCI_HOST_CHAN_INT_ACK); + pThis->m_nState = StateStartSplitComplete; + break; + + case StateCompleteSplit: + case StateCompleteRetry: + if (nStatus & DWHCI_HOST_CHAN_INT_XFER_COMPLETE) + { + pThis->m_nState = StateCompleteSplitComplete; + } + else if (nStatus & (DWHCI_HOST_CHAN_INT_NYET | DWHCI_HOST_CHAN_INT_ACK)) + { + if (pThis->m_nTries-- == 0) + { + pThis->m_nState = StateCompleteSplitFailed; + } + else + { + pThis->m_nState = StateCompleteRetry; + } + } + else if (nStatus & DWHCI_HOST_CHAN_INT_NAK) + { + if (pThis->m_nTries-- == 0) + { + usDelay (5 * uFRAME); + pThis->m_nState = StateCompleteSplitFailed; + } + else + { + pThis->m_nState = StateCompleteRetry; + } + } + else + { + LogWrite ("dwsched", LOG_ERROR, "Invalid status 0x%X", nStatus); + assert (0); + } + break; + + default: + assert (0); + break; + } +} + +void DWHCIFrameSchedulerNonPeriodicWaitForFrame (TDWHCIFrameScheduler *pBase) +{ +} + +boolean DWHCIFrameSchedulerNonPeriodicIsOddFrame (TDWHCIFrameScheduler *pBase) +{ + return FALSE; +} diff --git a/uspi/lib/dwhciframeschednsplit.c b/uspi/lib/dwhciframeschednsplit.c new file mode 100644 index 0000000..61e7cc8 --- /dev/null +++ b/uspi/lib/dwhciframeschednsplit.c @@ -0,0 +1,91 @@ +// +// dwhciframeschednsplit.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include + +#define FRAME_UNSET (DWHCI_MAX_FRAME_NUMBER+1) + +void DWHCIFrameSchedulerNoSplit (TDWHCIFrameSchedulerNoSplit *pThis, boolean bIsPeriodic) +{ + assert (pThis != 0); + + TDWHCIFrameScheduler *pBase = (TDWHCIFrameScheduler *) pThis; + + pBase->_DWHCIFrameScheduler = _DWHCIFrameSchedulerNoSplit; + pBase->StartSplit = DWHCIFrameSchedulerNoSplitStartSplit; + pBase->CompleteSplit = DWHCIFrameSchedulerNoSplitCompleteSplit; + pBase->TransactionComplete = DWHCIFrameSchedulerNoSplitTransactionComplete; + pBase->WaitForFrame = DWHCIFrameSchedulerNoSplitWaitForFrame; + pBase->IsOddFrame = DWHCIFrameSchedulerNoSplitIsOddFrame; + + pThis->m_bIsPeriodic = bIsPeriodic; + pThis->m_nNextFrame = FRAME_UNSET; + +} + +void _DWHCIFrameSchedulerNoSplit (TDWHCIFrameScheduler *pBase) +{ +} + +void DWHCIFrameSchedulerNoSplitStartSplit (TDWHCIFrameScheduler *pBase) +{ + assert (0); +} + +boolean DWHCIFrameSchedulerNoSplitCompleteSplit (TDWHCIFrameScheduler *pBase) +{ + assert (0); + return FALSE; +} + +void DWHCIFrameSchedulerNoSplitTransactionComplete (TDWHCIFrameScheduler *pBase, u32 nStatus) +{ + assert (0); +} + +void DWHCIFrameSchedulerNoSplitWaitForFrame (TDWHCIFrameScheduler *pBase) +{ + TDWHCIFrameSchedulerNoSplit *pThis = (TDWHCIFrameSchedulerNoSplit *) pBase; + assert (pThis != 0); + + TDWHCIRegister FrameNumber; + DWHCIRegister (&FrameNumber, DWHCI_HOST_FRM_NUM); + + pThis->m_nNextFrame = (DWHCI_HOST_FRM_NUM_NUMBER (DWHCIRegisterRead (&FrameNumber))+1) & DWHCI_MAX_FRAME_NUMBER; + + if (!pThis->m_bIsPeriodic) + { + while ((DWHCI_HOST_FRM_NUM_NUMBER (DWHCIRegisterRead (&FrameNumber)) & DWHCI_MAX_FRAME_NUMBER) != pThis->m_nNextFrame) + { + // do nothing + } + } + + _DWHCIRegister (&FrameNumber); +} + +boolean DWHCIFrameSchedulerNoSplitIsOddFrame (TDWHCIFrameScheduler *pBase) +{ + TDWHCIFrameSchedulerNoSplit *pThis = (TDWHCIFrameSchedulerNoSplit *) pBase; + assert (pThis != 0); + + return pThis->m_nNextFrame & 1 ? TRUE : FALSE; +} diff --git a/uspi/lib/dwhciframeschedper.c b/uspi/lib/dwhciframeschedper.c new file mode 100644 index 0000000..e2e3064 --- /dev/null +++ b/uspi/lib/dwhciframeschedper.c @@ -0,0 +1,189 @@ +// +// dwhciframeschedper.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include +#include + +#define uFRAME 125 // micro seconds + +#define FRAME_UNSET 8 + +typedef enum +{ + StateStartSplit, + StateStartSplitComplete, + StateCompleteSplit, + StateCompleteRetry, + StateCompleteSplitComplete, + StateCompleteSplitFailed, + StateUnknown +} +TFrameSchedulerState; + +void DWHCIFrameSchedulerPeriodic (TDWHCIFrameSchedulerPeriodic *pThis) +{ + assert (pThis != 0); + + TDWHCIFrameScheduler *pBase = (TDWHCIFrameScheduler *) pThis; + + pBase->_DWHCIFrameScheduler = _DWHCIFrameSchedulerPeriodic; + pBase->StartSplit = DWHCIFrameSchedulerPeriodicStartSplit; + pBase->CompleteSplit = DWHCIFrameSchedulerPeriodicCompleteSplit; + pBase->TransactionComplete = DWHCIFrameSchedulerPeriodicTransactionComplete; + pBase->WaitForFrame = DWHCIFrameSchedulerPeriodicWaitForFrame; + pBase->IsOddFrame = DWHCIFrameSchedulerPeriodicIsOddFrame; + + pThis->m_nState = StateUnknown; + pThis->m_nNextFrame = FRAME_UNSET; +} + +void _DWHCIFrameSchedulerPeriodic (TDWHCIFrameScheduler *pBase) +{ + TDWHCIFrameSchedulerPeriodic *pThis = (TDWHCIFrameSchedulerPeriodic *) pBase; + assert (pThis != 0); + + pThis->m_nState = StateUnknown; +} + +void DWHCIFrameSchedulerPeriodicStartSplit (TDWHCIFrameScheduler *pBase) +{ + TDWHCIFrameSchedulerPeriodic *pThis = (TDWHCIFrameSchedulerPeriodic *) pBase; + assert (pThis != 0); + + pThis->m_nState = StateStartSplit; + pThis->m_nNextFrame = FRAME_UNSET; +} + +boolean DWHCIFrameSchedulerPeriodicCompleteSplit (TDWHCIFrameScheduler *pBase) +{ + TDWHCIFrameSchedulerPeriodic *pThis = (TDWHCIFrameSchedulerPeriodic *) pBase; + assert (pThis != 0); + + boolean bResult = FALSE; + + switch (pThis->m_nState) + { + case StateStartSplitComplete: + pThis->m_nState = StateCompleteSplit; + pThis->m_nTries = pThis->m_nNextFrame != 5 ? 3 : 2; + pThis->m_nNextFrame = (pThis->m_nNextFrame + 2) & 7; + bResult = TRUE; + break; + + case StateCompleteRetry: + bResult = TRUE; + pThis->m_nNextFrame = (pThis->m_nNextFrame + 1) & 7; + break; + + case StateCompleteSplitComplete: + case StateCompleteSplitFailed: + break; + + default: + assert (0); + break; + } + + return bResult; +} + +void DWHCIFrameSchedulerPeriodicTransactionComplete (TDWHCIFrameScheduler *pBase, u32 nStatus) +{ + TDWHCIFrameSchedulerPeriodic *pThis = (TDWHCIFrameSchedulerPeriodic *) pBase; + assert (pThis != 0); + + switch (pThis->m_nState) + { + case StateStartSplit: + assert (nStatus & DWHCI_HOST_CHAN_INT_ACK); + pThis->m_nState = StateStartSplitComplete; + break; + + case StateCompleteSplit: + case StateCompleteRetry: + if (nStatus & DWHCI_HOST_CHAN_INT_XFER_COMPLETE) + { + pThis->m_nState = StateCompleteSplitComplete; + } + else if (nStatus & (DWHCI_HOST_CHAN_INT_NYET | DWHCI_HOST_CHAN_INT_ACK)) + { + if (pThis->m_nTries-- == 0) + { + pThis->m_nState = StateCompleteSplitFailed; + + usDelay (8 * uFRAME); + } + else + { + pThis->m_nState = StateCompleteRetry; + } + } + else if (nStatus & DWHCI_HOST_CHAN_INT_NAK) + { + usDelay (5 * uFRAME); + pThis->m_nState = StateCompleteSplitFailed; + } + else + { + LogWrite ("dwsched", LOG_ERROR, "Invalid status 0x%X", nStatus); + assert (0); + } + break; + + default: + assert (0); + break; + } +} + +void DWHCIFrameSchedulerPeriodicWaitForFrame (TDWHCIFrameScheduler *pBase) +{ + TDWHCIFrameSchedulerPeriodic *pThis = (TDWHCIFrameSchedulerPeriodic *) pBase; + assert (pThis != 0); + + TDWHCIRegister FrameNumber; + DWHCIRegister (&FrameNumber, DWHCI_HOST_FRM_NUM); + + if (pThis->m_nNextFrame == FRAME_UNSET) + { + pThis->m_nNextFrame = (DWHCI_HOST_FRM_NUM_NUMBER (DWHCIRegisterRead (&FrameNumber)) + 1) & 7; + if (pThis->m_nNextFrame == 6) + { + pThis->m_nNextFrame++; + } + } + + while ((DWHCI_HOST_FRM_NUM_NUMBER (DWHCIRegisterRead (&FrameNumber)) & 7) != pThis->m_nNextFrame) + { + // do nothing + } + + _DWHCIRegister (&FrameNumber); +} + +boolean DWHCIFrameSchedulerPeriodicIsOddFrame (TDWHCIFrameScheduler *pBase) +{ + TDWHCIFrameSchedulerPeriodic *pThis = (TDWHCIFrameSchedulerPeriodic *) pBase; + assert (pThis != 0); + + return pThis->m_nNextFrame & 1 ? TRUE : FALSE; +} diff --git a/uspi/lib/dwhciregister.c b/uspi/lib/dwhciregister.c new file mode 100644 index 0000000..a8ed7e2 --- /dev/null +++ b/uspi/lib/dwhciregister.c @@ -0,0 +1,145 @@ +// +// dwhciregister.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include + +void DWHCIRegister (TDWHCIRegister *pThis, u32 nAddress) +{ + assert (pThis != 0); + pThis->m_bValid = FALSE; + pThis->m_nAddress = nAddress; +} + +void DWHCIRegister2 (TDWHCIRegister *pThis, u32 nAddress, u32 nValue) +{ + assert (pThis != 0); + pThis->m_bValid = TRUE; + pThis->m_nAddress = nAddress; + pThis->m_nBuffer = nValue; +} + +void _DWHCIRegister (TDWHCIRegister *pThis) +{ + assert (pThis != 0); + pThis->m_bValid = FALSE; +} + +u32 DWHCIRegisterRead (TDWHCIRegister *pThis) +{ + assert (pThis != 0); + pThis->m_nBuffer = *(u32 *) pThis->m_nAddress; + pThis->m_bValid = TRUE; + + return pThis->m_nBuffer; +} + +void DWHCIRegisterWrite (TDWHCIRegister *pThis) +{ + assert (pThis != 0); + assert (pThis->m_bValid); + *(u32 *) pThis->m_nAddress = pThis->m_nBuffer; +} + +u32 DWHCIRegisterGet (TDWHCIRegister *pThis) +{ + assert (pThis != 0); + assert (pThis->m_bValid); + return pThis->m_nBuffer; +} + +void DWHCIRegisterSet (TDWHCIRegister *pThis, u32 nValue) +{ + assert (pThis != 0); + pThis->m_nBuffer = nValue; + pThis->m_bValid = TRUE; +} + +boolean DWHCIRegisterIsSet (TDWHCIRegister *pThis, u32 nMask) +{ + assert (pThis != 0); + assert (pThis->m_bValid); + return pThis->m_nBuffer & nMask ? TRUE : FALSE; +} + +void DWHCIRegisterAnd (TDWHCIRegister *pThis, u32 nMask) +{ + assert (pThis != 0); + assert (pThis->m_bValid); + pThis->m_nBuffer &= nMask; +} + +void DWHCIRegisterOr (TDWHCIRegister *pThis, u32 nMask) +{ + assert (pThis != 0); + assert (pThis->m_bValid); + pThis->m_nBuffer |= nMask; +} + +void DWHCIRegisterClearBit (TDWHCIRegister *pThis, unsigned nBit) +{ + assert (pThis != 0); + assert (pThis->m_bValid); + assert (nBit < sizeof pThis->m_nBuffer * 8); + pThis->m_nBuffer &= ~(1 << nBit); +} + +void DWHCIRegisterSetBit (TDWHCIRegister *pThis, unsigned nBit) +{ + assert (pThis != 0); + assert (pThis->m_bValid); + assert (nBit < sizeof pThis->m_nBuffer * 8); + pThis->m_nBuffer |= 1 << nBit; +} + +void DWHCIRegisterClearAll (TDWHCIRegister *pThis) +{ + assert (pThis != 0); + pThis->m_nBuffer = 0; + pThis->m_bValid = TRUE; +} + +void DWHCIRegisterSetAll (TDWHCIRegister *pThis) +{ + assert (pThis != 0); + pThis->m_nBuffer = (u32) -1; + pThis->m_bValid = TRUE; +} + +#ifndef NDEBUG + +void DWHCIRegisterDump (TDWHCIRegister *pThis) +{ + assert (pThis != 0); + if (pThis->m_bValid) + { + LogWrite ("dwhci", LOG_DEBUG, + "Register at 0x%X is 0x%X", + pThis->m_nAddress & 0xFFF, pThis->m_nBuffer); + } + else + { + LogWrite ("dwhci", LOG_DEBUG, + "Register at 0x%X was not set", + pThis->m_nAddress & 0xFFF); + } +} + +#endif diff --git a/uspi/lib/dwhcirootport.c b/uspi/lib/dwhcirootport.c new file mode 100644 index 0000000..257151a --- /dev/null +++ b/uspi/lib/dwhcirootport.c @@ -0,0 +1,136 @@ +// +// dwhcirootport.cpp +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include +#include +#include + +static const char FromDWHCIRoot[] = "dwroot"; + +void DWHCIRootPort (TDWHCIRootPort *pThis, struct TDWHCIDevice *pHost) +{ + assert (pThis != 0); + + pThis->m_pHost = pHost; + pThis->m_pDevice = 0; + + assert (pThis->m_pHost != 0); +} + +void _DWHCIRootPort (TDWHCIRootPort *pThis) +{ + assert (pThis != 0); + + if (pThis->m_pDevice != 0) + { + _USBDevice (pThis->m_pDevice); + free (pThis->m_pDevice); + pThis->m_pDevice = 0; + } + + pThis->m_pHost = 0; +} + +boolean DWHCIRootPortInitialize (TDWHCIRootPort *pThis) +{ + assert (pThis != 0); + + assert (pThis->m_pHost != 0); + TUSBSpeed Speed = DWHCIDeviceGetPortSpeed (pThis->m_pHost); + if (Speed == USBSpeedUnknown) + { + LogWrite (FromDWHCIRoot, LOG_ERROR, "Cannot detect port speed"); + + return FALSE; + } + + // first create default device + assert (pThis->m_pDevice == 0); + pThis->m_pDevice = (TUSBDevice *) malloc (sizeof (TUSBDevice)); + assert (pThis->m_pDevice != 0); + USBDevice (pThis->m_pDevice, pThis->m_pHost, Speed, 0, 1); + + if (!USBDeviceInitialize (pThis->m_pDevice)) + { + _USBDevice (pThis->m_pDevice); + free (pThis->m_pDevice); + pThis->m_pDevice = 0; + + return FALSE; + } + + TString *pNames = USBStandardHubGetDeviceNames (pThis->m_pDevice); + assert (pNames != 0); + + LogWrite (FromDWHCIRoot, LOG_NOTICE, "Device %s found", StringGet (pNames)); + + _String (pNames); + free (pNames); + + // now create specific device from default device + TUSBDevice *pChild = USBDeviceFactoryGetDevice (pThis->m_pDevice); + if (pChild != 0) + { + _USBDevice (pThis->m_pDevice); // delete default device + free (pThis->m_pDevice); + pThis->m_pDevice = pChild; // assign specific device + + if (!(*pThis->m_pDevice->Configure) (pThis->m_pDevice)) + { + LogWrite (FromDWHCIRoot, LOG_ERROR, "Cannot configure device"); + + _USBDevice (pThis->m_pDevice); + free (pThis->m_pDevice); + pThis->m_pDevice = 0; + + return FALSE; + } + + LogWrite (FromDWHCIRoot, LOG_DEBUG, "Device configured"); + } + else + { + LogWrite (FromDWHCIRoot, LOG_NOTICE, "Device is not supported"); + + _USBDevice (pThis->m_pDevice); + free (pThis->m_pDevice); + pThis->m_pDevice = 0; + + return FALSE; + } + + // check for over-current + if (DWHCIDeviceOvercurrentDetected (pThis->m_pHost)) + { + LogWrite (FromDWHCIRoot, LOG_ERROR, "Over-current condition"); + + DWHCIDeviceDisableRootPort (pThis->m_pHost); + + _USBDevice (pThis->m_pDevice); + free (pThis->m_pDevice); + pThis->m_pDevice = 0; + + return FALSE; + } + + return TRUE; +} diff --git a/uspi/lib/dwhcixferstagedata.c b/uspi/lib/dwhcixferstagedata.c new file mode 100644 index 0000000..dee768c --- /dev/null +++ b/uspi/lib/dwhcixferstagedata.c @@ -0,0 +1,473 @@ +// +// dwhcixferstagedata.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include +#include +#include +#include + +void DWHCITransferStageData (TDWHCITransferStageData *pThis, unsigned nChannel, TUSBRequest *pURB, boolean bIn, boolean bStatusStage) +{ + assert (pThis != 0); + + pThis->m_nChannel = nChannel; + pThis->m_pURB = pURB; + pThis->m_bIn = bIn; + pThis->m_bStatusStage = bStatusStage; + pThis->m_bSplitComplete = FALSE; + pThis->m_nTotalBytesTransfered = 0; + pThis->m_nState = 0; + pThis->m_nSubState = 0; + pThis->m_nTransactionStatus = 0; + pThis->m_pTempBuffer = 0; + pThis->m_pFrameScheduler = 0; + + assert (pThis->m_pURB != 0); + + pThis->m_pEndpoint = USBRequestGetEndpoint (pURB); + assert (pThis->m_pEndpoint != 0); + pThis->m_pDevice = USBEndpointGetDevice (pThis->m_pEndpoint); + assert (pThis->m_pDevice != 0); + + pThis->m_Speed = USBDeviceGetSpeed (pThis->m_pDevice); + pThis->m_nMaxPacketSize = USBEndpointGetMaxPacketSize (pThis->m_pEndpoint); + + pThis->m_bSplitTransaction = USBDeviceGetHubAddress (pThis->m_pDevice) != 0 + && pThis->m_Speed != USBSpeedHigh; + + if (!bStatusStage) + { + if (USBEndpointGetNextPID (pThis->m_pEndpoint, bStatusStage) == USBPIDSetup) + { + pThis->m_pBufferPointer = USBRequestGetSetupData (pURB); + pThis->m_nTransferSize = sizeof (TSetupData); + } + else + { + pThis->m_pBufferPointer = USBRequestGetBuffer (pURB); + pThis->m_nTransferSize = USBRequestGetBufLen (pURB); + } + + pThis->m_nPackets = (pThis->m_nTransferSize + pThis->m_nMaxPacketSize - 1) / pThis->m_nMaxPacketSize; + + if (pThis->m_bSplitTransaction) + { + if (pThis->m_nTransferSize > pThis->m_nMaxPacketSize) + { + pThis->m_nBytesPerTransaction = pThis->m_nMaxPacketSize; + } + else + { + pThis->m_nBytesPerTransaction = pThis->m_nTransferSize; + } + + pThis->m_nPacketsPerTransaction = 1; + } + else + { + pThis->m_nBytesPerTransaction = pThis->m_nTransferSize; + pThis->m_nPacketsPerTransaction = pThis->m_nPackets; + } + } + else + { + assert (pThis->m_pTempBuffer == 0); + pThis->m_pTempBuffer = (u32 *) malloc (sizeof (u32)); + assert (pThis->m_pTempBuffer != 0); + pThis->m_pBufferPointer = pThis->m_pTempBuffer; + + pThis->m_nTransferSize = 0; + pThis->m_nBytesPerTransaction = 0; + pThis->m_nPackets = 1; + pThis->m_nPacketsPerTransaction = 1; + } + + assert (pThis->m_pBufferPointer != 0); + assert (((u32) pThis->m_pBufferPointer & 3) == 0); + + if (pThis->m_bSplitTransaction) + { + if (DWHCITransferStageDataIsPeriodic (pThis)) + { + pThis->m_pFrameScheduler = (TDWHCIFrameScheduler *) malloc (sizeof (TDWHCIFrameSchedulerPeriodic)); + DWHCIFrameSchedulerPeriodic ((TDWHCIFrameSchedulerPeriodic *) pThis->m_pFrameScheduler); + } + else + { + pThis->m_pFrameScheduler = (TDWHCIFrameScheduler *) malloc (sizeof (TDWHCIFrameSchedulerNonPeriodic)); + DWHCIFrameSchedulerNonPeriodic ((TDWHCIFrameSchedulerNonPeriodic *) pThis->m_pFrameScheduler); + } + + assert (pThis->m_pFrameScheduler != 0); + } + else + { + if ( USBDeviceGetHubAddress (pThis->m_pDevice) == 0 + && pThis->m_Speed != USBSpeedHigh) + { + pThis->m_pFrameScheduler = (TDWHCIFrameScheduler *) malloc (sizeof (TDWHCIFrameSchedulerNoSplit)); + DWHCIFrameSchedulerNoSplit ((TDWHCIFrameSchedulerNoSplit *) pThis->m_pFrameScheduler, DWHCITransferStageDataIsPeriodic (pThis)); + assert (pThis->m_pFrameScheduler != 0); + } + } +} + +void _DWHCITransferStageData (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + + if (pThis->m_pFrameScheduler != 0) + { + pThis->m_pFrameScheduler->_DWHCIFrameScheduler (pThis->m_pFrameScheduler); + free (pThis->m_pFrameScheduler); + pThis->m_pFrameScheduler = 0; + } + + pThis->m_pBufferPointer = 0; + + if (pThis->m_pTempBuffer != 0) + { + free (pThis->m_pTempBuffer); + pThis->m_pTempBuffer = 0; + } + + pThis->m_pEndpoint = 0; + pThis->m_pDevice = 0; + pThis->m_pURB = 0; +} + +void DWHCITransferStageDataTransactionComplete (TDWHCITransferStageData *pThis, u32 nStatus, u32 nPacketsLeft, u32 nBytesLeft) +{ + assert (pThis != 0); + +#if 0 + if (pThis->m_bSplitTransaction) + { + Logger->Write ("udata", LOG_DEBUG, + "Transaction complete (status 0x%X, packets 0x%X, bytes 0x%X)", + nStatus, nPacketsLeft, nBytesLeft); + } +#endif + + pThis->m_nTransactionStatus = nStatus; + + if ( nStatus + & ( DWHCI_HOST_CHAN_INT_ERROR_MASK + | DWHCI_HOST_CHAN_INT_NAK + | DWHCI_HOST_CHAN_INT_NYET)) + { + return; + } + + u32 nPacketsTransfered = pThis->m_nPacketsPerTransaction - nPacketsLeft; + u32 nBytesTransfered = pThis->m_nBytesPerTransaction - nBytesLeft; + + if ( pThis->m_bSplitTransaction + && pThis->m_bSplitComplete + && nBytesTransfered == 0 + && pThis->m_nBytesPerTransaction > 0) + { + nBytesTransfered = pThis->m_nMaxPacketSize * nPacketsTransfered; + } + + pThis->m_nTotalBytesTransfered += nBytesTransfered; + pThis->m_pBufferPointer = (u8 *) pThis->m_pBufferPointer + nBytesTransfered; + + if ( !pThis->m_bSplitTransaction + || pThis->m_bSplitComplete) + { + USBEndpointSkipPID (pThis->m_pEndpoint, nPacketsTransfered, pThis->m_bStatusStage); + } + + assert (nPacketsTransfered <= pThis->m_nPackets); + pThis->m_nPackets -= nPacketsTransfered; + + // if (pThis->m_nTotalBytesTransfered > pThis->m_nTransferSize) this will be false: + if (pThis->m_nTransferSize - pThis->m_nTotalBytesTransfered < pThis->m_nBytesPerTransaction) + { + assert (pThis->m_nTotalBytesTransfered <= pThis->m_nTransferSize); + pThis->m_nBytesPerTransaction = pThis->m_nTransferSize - pThis->m_nTotalBytesTransfered; + } +} + +void DWHCITransferStageDataSetSplitComplete (TDWHCITransferStageData *pThis, boolean bComplete) +{ + assert (pThis != 0); + assert (pThis->m_bSplitTransaction); + + pThis->m_bSplitComplete = bComplete; +} + +void DWHCITransferStageDataSetState (TDWHCITransferStageData *pThis, unsigned nState) +{ + assert (pThis != 0); + pThis->m_nState = nState; +} + +unsigned DWHCITransferStageDataGetState (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + return pThis->m_nState; +} + +void DWHCITransferStageDataSetSubState (TDWHCITransferStageData *pThis, unsigned nSubState) +{ + assert (pThis != 0); + pThis->m_nSubState = nSubState; +} + +unsigned DWHCITransferStageDataGetSubState (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + return pThis->m_nSubState; +} + +boolean DWHCITransferStageDataBeginSplitCycle (TDWHCITransferStageData *pThis) +{ + return TRUE; +} + +unsigned DWHCITransferStageDataGetChannelNumber (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + return pThis->m_nChannel; +} + +boolean DWHCITransferStageDataIsPeriodic (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + assert (pThis->m_pEndpoint != 0); + TEndpointType Type = USBEndpointGetType (pThis->m_pEndpoint); + + return Type == EndpointTypeInterrupt + || Type == EndpointTypeIsochronous; +} + +u8 DWHCITransferStageDataGetDeviceAddress (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + assert (pThis->m_pDevice != 0); + return USBDeviceGetAddress (pThis->m_pDevice); +} + +u8 DWHCITransferStageDataGetEndpointType (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + assert (pThis->m_pEndpoint != 0); + + unsigned nEndpointType = 0; + + switch (USBEndpointGetType (pThis->m_pEndpoint)) + { + case EndpointTypeControl: + nEndpointType = DWHCI_HOST_CHAN_CHARACTER_EP_TYPE_CONTROL; + break; + + case EndpointTypeBulk: + nEndpointType = DWHCI_HOST_CHAN_CHARACTER_EP_TYPE_BULK; + break; + + case EndpointTypeInterrupt: + nEndpointType = DWHCI_HOST_CHAN_CHARACTER_EP_TYPE_INTERRUPT; + break; + + default: + assert (0); + break; + } + + return nEndpointType; +} + +u8 DWHCITransferStageDataGetEndpointNumber (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + assert (pThis->m_pEndpoint != 0); + return USBEndpointGetNumber (pThis->m_pEndpoint); +} + +u32 DWHCITransferStageDataGetMaxPacketSize (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + return pThis->m_nMaxPacketSize; +} + +TUSBSpeed DWHCITransferStageDataGetSpeed (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + return pThis->m_Speed; +} + +u8 DWHCITransferStageDataGetPID (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + assert (pThis->m_pEndpoint != 0); + + u8 ucPID = 0; + + switch (USBEndpointGetNextPID (pThis->m_pEndpoint, pThis->m_bStatusStage)) + { + case USBPIDSetup: + ucPID = DWHCI_HOST_CHAN_XFER_SIZ_PID_SETUP; + break; + + case USBPIDData0: + ucPID = DWHCI_HOST_CHAN_XFER_SIZ_PID_DATA0; + break; + + case USBPIDData1: + ucPID = DWHCI_HOST_CHAN_XFER_SIZ_PID_DATA1; + break; + + default: + assert (0); + break; + } + + return ucPID; +} + +boolean DWHCITransferStageDataIsDirectionIn (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + return pThis->m_bIn; +} + +boolean DWHCITransferStageDataIsStatusStage (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + return pThis->m_bStatusStage; +} + +u32 DWHCITransferStageDataGetDMAAddress (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + assert (pThis->m_pBufferPointer != 0); + + return (u32) pThis->m_pBufferPointer; +} + +u32 DWHCITransferStageDataGetBytesToTransfer (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + return pThis->m_nBytesPerTransaction; +} + +u32 DWHCITransferStageDataGetPacketsToTransfer (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + return pThis->m_nPacketsPerTransaction; +} + +boolean DWHCITransferStageDataIsSplit (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + return pThis->m_bSplitTransaction; +} + +boolean DWHCITransferStageDataIsSplitComplete (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + assert (pThis->m_bSplitTransaction); + + return pThis->m_bSplitComplete; +} + +u8 DWHCITransferStageDataGetHubAddress (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + assert (pThis->m_bSplitTransaction); + + assert (pThis->m_pDevice != 0); + return USBDeviceGetHubAddress (pThis->m_pDevice); +} + +u8 DWHCITransferStageDataGetHubPortAddress (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + assert (pThis->m_bSplitTransaction); + + assert (pThis->m_pDevice != 0); + return USBDeviceGetHubPortNumber (pThis->m_pDevice); +} + +u8 DWHCITransferStageDataGetSplitPosition (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + assert (pThis->m_nTransferSize <= 188); // TODO + return DWHCI_HOST_CHAN_SPLIT_CTRL_ALL; +} + +u32 DWHCITransferStageDataGetStatusMask (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + u32 nMask = DWHCI_HOST_CHAN_INT_XFER_COMPLETE + | DWHCI_HOST_CHAN_INT_HALTED + | DWHCI_HOST_CHAN_INT_ERROR_MASK; + + if ( pThis->m_bSplitTransaction + || DWHCITransferStageDataIsPeriodic (pThis)) + { + nMask |= DWHCI_HOST_CHAN_INT_ACK + | DWHCI_HOST_CHAN_INT_NAK + | DWHCI_HOST_CHAN_INT_NYET; + } + + return nMask; +} + +u32 DWHCITransferStageDataGetTransactionStatus (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + assert (pThis->m_nTransactionStatus != 0); + return pThis->m_nTransactionStatus; +} + +boolean DWHCITransferStageDataIsStageComplete (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + return pThis->m_nPackets == 0; +} + +u32 DWHCITransferStageDataGetResultLen (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + if (pThis->m_nTotalBytesTransfered > pThis->m_nTransferSize) + { + return pThis->m_nTransferSize; + } + + return pThis->m_nTotalBytesTransfered; +} + +TUSBRequest *DWHCITransferStageDataGetURB (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + assert (pThis->m_pURB != 0); + return pThis->m_pURB; +} + +TDWHCIFrameScheduler *DWHCITransferStageDataGetFrameScheduler (TDWHCITransferStageData *pThis) +{ + assert (pThis != 0); + return pThis->m_pFrameScheduler; +} diff --git a/uspi/lib/keymap.c b/uspi/lib/keymap.c new file mode 100644 index 0000000..acedcef --- /dev/null +++ b/uspi/lib/keymap.c @@ -0,0 +1,303 @@ +// +// keymap.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014-2016 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include +#include + +#define KEYPAD_FIRST 0x53 +#define KEYPAD_LAST 0x63 + +// order must match TSpecialKey beginning at KeySpace +static const char *s_KeyStrings[KeyMaxCode-KeySpace] = +{ + " ", // KeySpace + "\x1b", // KeyEscape + "\x7f", // KeyBackspace + "\t", // KeyTabulator + "\n", // KeyReturn + "\x1b[2~", // KeyInsert + "\x1b[1~", // KeyHome + "\x1b[5~", // KeyPageUp + "\x1b[3~", // KeyDelete + "\x1b[4~", // KeyEnd + "\x1b[6~", // KeyPageDown + "\x1b[A", // KeyUp + "\x1b[B", // KeyDown + "\x1b[D", // KeyLeft + "\x1b[C", // KeyRight + "\x1b[[A", // KeyF1 + "\x1b[[B", // KeyF2 + "\x1b[[C", // KeyF3 + "\x1b[[D", // KeyF4 + "\x1b[[E", // KeyF5 + "\x1b[17~", // KeyF6 + "\x1b[18~", // KeyF7 + "\x1b[19~", // KeyF8 + "\x1b[20~", // KeyF9 + 0, // KeyF10 + 0, // KeyF11 + 0, // KeyF12 + 0, // KeyApplication + 0, // KeyCapsLock + 0, // KeyPrintScreen + 0, // KeyScrollLock + 0, // KeyPause + 0, // KeyNumLock + "/", // KeyKP_Divide + "*", // KeyKP_Multiply + "-", // KeyKP_Subtract + "+", // KeyKP_Add + "\n", // KeyKP_Enter + "1", // KeyKP_1 + "2", // KeyKP_2 + "3", // KeyKP_3 + "4", // KeyKP_4 + "5", // KeyKP_5 + "6", // KeyKP_6 + "7", // KeyKP_7 + "8", // KeyKP_8 + "9", // KeyKP_9 + "0", // KeyKP_0 + "\x1b[G", // KeyKP_Center + ",", // KeyKP_Comma + "." // KeyKP_Period +}; + +#define C(chr) ((u16) (u8) (chr)) + +static const u16 s_DefaultMap[PHY_MAX_CODE+1][K_ALTSHIFTTAB+1] = +{ +#if defined (USPI_DEFAULT_KEYMAP_DE) + #include "keymap_de.h" +#elif defined (USPI_DEFAULT_KEYMAP_ES) + #include "keymap_es.h" +#elif defined (USPI_DEFAULT_KEYMAP_FR) + #include "keymap_fr.h" +#elif defined (USPI_DEFAULT_KEYMAP_IT) + #include "keymap_it.h" +#elif defined (USPI_DEFAULT_KEYMAP_UK) + #include "keymap_uk.h" +#elif defined (USPI_DEFAULT_KEYMAP_US) + #include "keymap_us.h" +#else + {KeyNone} +#endif +}; + +void KeyMap (TKeyMap *pThis) +{ + assert (pThis != 0); + + pThis->m_bCapsLock = FALSE; + pThis->m_bNumLock = TRUE; + pThis->m_bScrollLock = FALSE; + + assert (sizeof pThis->m_KeyMap == sizeof s_DefaultMap); + memcpy (pThis->m_KeyMap, s_DefaultMap, sizeof pThis->m_KeyMap); +} + +void _KeyMap (TKeyMap *pThis) +{ +} + +boolean KeyMapClearTable (TKeyMap *pThis, u8 nTable) +{ + assert (pThis != 0); + + if (nTable > K_ALTSHIFTTAB) + { + return FALSE; + } + + for (unsigned nPhyCode = 0; nPhyCode <= PHY_MAX_CODE; nPhyCode++) + { + pThis->m_KeyMap[nPhyCode][nTable] = KeyNone; + } + + return TRUE; +} + +boolean KeyMapSetEntry (TKeyMap *pThis, u8 nTable, u8 nPhyCode, u16 nValue) +{ + assert (pThis != 0); + + if ( nTable > K_ALTSHIFTTAB + || nPhyCode == 0 + || nPhyCode > PHY_MAX_CODE + || nValue >= KeyMaxCode) + { + return FALSE; + } + + pThis->m_KeyMap[nPhyCode][nTable] = nValue; + + return TRUE; +} + +u16 KeyMapTranslate (TKeyMap *pThis, u8 nPhyCode, u8 nModifiers) +{ + assert (pThis != 0); + + if ( nPhyCode == 0 + || nPhyCode > PHY_MAX_CODE) + { + return KeyNone; + } + + u16 nLogCodeNorm = pThis->m_KeyMap[nPhyCode][K_NORMTAB]; + + if ( nLogCodeNorm == KeyDelete + && (nModifiers & (LCTRL | RCTRL)) + && (nModifiers & ALT)) + { + return ActionShutdown; + } + + if ( (KeyF1 <= nLogCodeNorm && nLogCodeNorm <= KeyF12) + && (nModifiers & ALT)) + { + return ActionSelectConsole1 + (nLogCodeNorm - KeyF1); + } + + if (nModifiers & (ALT | LWIN | RWIN)) + { + return KeyNone; + } + + unsigned nTable = K_NORMTAB; + + // TODO: hard-wired to keypad + if (KEYPAD_FIRST <= nPhyCode && nPhyCode <= KEYPAD_LAST) + { + if (pThis->m_bNumLock) + { + nTable = K_SHIFTTAB; + } + } + else if (nModifiers & ALTGR) + { + if (nModifiers & (LSHIFT | RSHIFT)) + { + nTable = K_ALTSHIFTTAB; + } + else + { + nTable = K_ALTTAB; + } + } + else if (nModifiers & (LSHIFT | RSHIFT)) + { + nTable = K_SHIFTTAB; + } + + u16 nLogCode = pThis->m_KeyMap[nPhyCode][nTable]; + + switch (nLogCode) + { + case KeyCapsLock: + pThis->m_bCapsLock = !pThis->m_bCapsLock; + return ActionSwitchCapsLock; + + case KeyNumLock: + pThis->m_bNumLock = !pThis->m_bNumLock; + return ActionSwitchNumLock; + + case KeyScrollLock: + pThis->m_bScrollLock = !pThis->m_bScrollLock; + return ActionSwitchScrollLock; + } + + return nLogCode; +} + +const char *KeyMapGetString (TKeyMap *pThis, u16 nKeyCode, u8 nModifiers, char Buffer[2]) +{ + assert (pThis != 0); + + if ( nKeyCode <= ' ' + || nKeyCode >= KeyMaxCode) + { + return 0; + } + + if (KeySpace <= nKeyCode && nKeyCode < KeyMaxCode) + { + return s_KeyStrings[nKeyCode-KeySpace]; + } + + char chChar = (char) nKeyCode; + + if (nModifiers & (LCTRL | RCTRL)) + { + chChar -= 'a'; + if ('\0' <= chChar && chChar <= 'z'-'a') + { + Buffer[0] = chChar + 1; + Buffer[1] = '\0'; + + return Buffer; + } + + return 0; + } + + if (pThis->m_bCapsLock) + { + if ('A' <= chChar && chChar <= 'Z') + { + chChar += 'a'-'A'; + } + else if ('a' <= chChar && chChar <= 'z') + { + chChar -= 'a'-'A'; + } + } + + Buffer[0] = chChar; + Buffer[1] = '\0'; + + return Buffer; +} + +u8 KeyMapGetLEDStatus (TKeyMap *pThis) +{ + assert (pThis != 0); + + u8 nResult = 0; + + if (pThis->m_bCapsLock) + { + nResult |= LED_CAPS_LOCK; + } + + if (pThis->m_bNumLock) + { + nResult |= LED_NUM_LOCK; + } + + if (pThis->m_bScrollLock) + { + nResult |= LED_SCROLL_LOCK; + } + + return nResult; +} diff --git a/uspi/lib/keymap_de.h b/uspi/lib/keymap_de.h new file mode 100644 index 0000000..3e66b58 --- /dev/null +++ b/uspi/lib/keymap_de.h @@ -0,0 +1,131 @@ +// Use ISO-8859-1 when editing this file! + +// Normal Shift AltGr AltGr+Shift +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x00 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x01 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x02 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x03 +{'a', 'A', KeyNone, KeyNone}, // 0x04 +{'b', 'B', KeyNone, KeyNone}, // 0x05 +{'c', 'C', KeyNone, KeyNone}, // 0x06 +{'d', 'D', KeyNone, KeyNone}, // 0x07 +{'e', 'E', KeyNone, KeyNone}, // 0x08 +{'f', 'F', KeyNone, KeyNone}, // 0x09 +{'g', 'G', KeyNone, KeyNone}, // 0x0A +{'h', 'H', KeyNone, KeyNone}, // 0x0B +{'i', 'I', KeyNone, KeyNone}, // 0x0C +{'j', 'J', KeyNone, KeyNone}, // 0x0D +{'k', 'K', KeyNone, KeyNone}, // 0x0E +{'l', 'L', KeyNone, KeyNone}, // 0x0F +{'m', 'M', C('µ'), KeyNone}, // 0x10 +{'n', 'N', KeyNone, KeyNone}, // 0x11 +{'o', 'O', KeyNone, KeyNone}, // 0x12 +{'p', 'P', KeyNone, KeyNone}, // 0x13 +{'q', 'Q', '@', KeyNone}, // 0x14 +{'r', 'R', KeyNone, KeyNone}, // 0x15 +{'s', 'S', KeyNone, KeyNone}, // 0x16 +{'t', 'T', KeyNone, KeyNone}, // 0x17 +{'u', 'U', KeyNone, KeyNone}, // 0x18 +{'v', 'V', KeyNone, KeyNone}, // 0x19 +{'w', 'W', KeyNone, KeyNone}, // 0x1A +{'x', 'X', KeyNone, KeyNone}, // 0x1B +{'z', 'Z', KeyNone, KeyNone}, // 0x1C +{'y', 'Y', KeyNone, KeyNone}, // 0x1D +{'1', '!', KeyNone, KeyNone}, // 0x1E +{'2', '\"', C('˛'), KeyNone}, // 0x1F +{'3', C('§'), C('ł'), KeyNone}, // 0x20 +{'4', '$', KeyNone, KeyNone}, // 0x21 +{'5', '%', KeyNone, KeyNone}, // 0x22 +{'6', '&', KeyNone, KeyNone}, // 0x23 +{'7', '/', '{', KeyNone}, // 0x24 +{'8', '(', '[', KeyNone}, // 0x25 +{'9', ')', ']', KeyNone}, // 0x26 +{'0', '=', '}', KeyNone}, // 0x27 +{KeyReturn, KeyReturn, KeyNone, KeyNone}, // 0x28 +{KeyEscape, KeyEscape, KeyNone, KeyNone}, // 0x29 +{KeyBackspace, KeyBackspace, KeyNone, KeyNone}, // 0x2A +{KeyTabulator, KeyTabulator, KeyNone, KeyNone}, // 0x2B +{KeySpace, KeySpace, KeyNone, KeyNone}, // 0x2C +{C('ß'), '?', '\\', KeyNone}, // 0x2D +{'\'', '`', KeyNone, KeyNone}, // 0x2E +{C('ü'), C('Ü'), KeyNone, KeyNone}, // 0x2F +{'+', '*', '~', KeyNone}, // 0x30 +{'#', '\'', KeyNone, KeyNone}, // 0x31 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x32 +{C('ö'), C('Ö'), KeyNone, KeyNone}, // 0x33 +{C('ä'), C('Ä'), KeyNone, KeyNone}, // 0x34 +{'^', C('°'), KeyNone, KeyNone}, // 0x35 +{',', ';', KeyNone, KeyNone}, // 0x36 +{'.', ':', KeyNone, KeyNone}, // 0x37 +{'-', '_', KeyNone, KeyNone}, // 0x38 +{KeyCapsLock, KeyCapsLock, KeyNone, KeyNone}, // 0x39 +{KeyF1, KeyNone, KeyNone, KeyNone}, // 0x3A +{KeyF2, KeyNone, KeyNone, KeyNone}, // 0x3B +{KeyF3, KeyNone, KeyNone, KeyNone}, // 0x3C +{KeyF4, KeyNone, KeyNone, KeyNone}, // 0x3D +{KeyF5, KeyNone, KeyNone, KeyNone}, // 0x3E +{KeyF6, KeyNone, KeyNone, KeyNone}, // 0x3F +{KeyF7, KeyNone, KeyNone, KeyNone}, // 0x40 +{KeyF8, KeyNone, KeyNone, KeyNone}, // 0x41 +{KeyF9, KeyNone, KeyNone, KeyNone}, // 0x42 +{KeyF10, KeyNone, KeyNone, KeyNone}, // 0x43 +{KeyF11, KeyNone, KeyNone, KeyNone}, // 0x44 +{KeyF12, KeyNone, KeyNone, KeyNone}, // 0x45 +{KeyPrintScreen,KeyNone, KeyNone, KeyNone}, // 0x46 +{KeyScrollLock, KeyNone, KeyNone, KeyNone}, // 0x47 +{KeyPause, KeyNone, KeyNone, KeyNone}, // 0x48 +{KeyInsert, KeyNone, KeyNone, KeyNone}, // 0x49 +{KeyHome, KeyNone, KeyNone, KeyNone}, // 0x4A +{KeyPageUp, KeyNone, KeyNone, KeyNone}, // 0x4B +{KeyDelete, KeyNone, KeyNone, KeyNone}, // 0x4C +{KeyEnd, KeyNone, KeyNone, KeyNone}, // 0x4D +{KeyPageDown, KeyNone, KeyNone, KeyNone}, // 0x4E +{KeyRight, KeyNone, KeyNone, KeyNone}, // 0x4F +{KeyLeft, KeyNone, KeyNone, KeyNone}, // 0x50 +{KeyDown, KeyNone, KeyNone, KeyNone}, // 0x51 +{KeyUp, KeyNone, KeyNone, KeyNone}, // 0x52 +{KeyNumLock, KeyNumLock, KeyNone, KeyNone}, // 0x53 +{KeyKP_Divide, KeyKP_Divide, KeyNone, KeyNone}, // 0x54 +{KeyKP_Multiply,KeyKP_Multiply, KeyNone, KeyNone}, // 0x55 +{KeyKP_Subtract,KeyKP_Subtract, KeyNone, KeyNone}, // 0x56 +{KeyKP_Add, KeyKP_Add, KeyNone, KeyNone}, // 0x57 +{KeyKP_Enter, KeyKP_Enter, KeyNone, KeyNone}, // 0x58 +{KeyEnd, KeyKP_1, KeyNone, KeyNone}, // 0x59 +{KeyDown, KeyKP_2, KeyNone, KeyNone}, // 0x5A +{KeyPageDown, KeyKP_3, KeyNone, KeyNone}, // 0x5B +{KeyLeft, KeyKP_4, KeyNone, KeyNone}, // 0x5C +{KeyKP_Center, KeyKP_5, KeyNone, KeyNone}, // 0x5D +{KeyRight, KeyKP_6, KeyNone, KeyNone}, // 0x5E +{KeyHome, KeyKP_7, KeyNone, KeyNone}, // 0x5F +{KeyUp, KeyKP_8, KeyNone, KeyNone}, // 0x60 +{KeyPageUp, KeyKP_9, KeyNone, KeyNone}, // 0x61 +{KeyInsert, KeyKP_0, KeyNone, KeyNone}, // 0x62 +{KeyDelete, KeyKP_Comma, KeyNone, KeyNone}, // 0x63 +{'<', '>', '|', KeyNone}, // 0x64 +{KeyApplication,KeyApplication, KeyNone, KeyNone}, // 0x65 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x66 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x67 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x68 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x69 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6A +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6B +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6C +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6D +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6E +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6F +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x70 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x71 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x72 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x73 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x74 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x75 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x76 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x77 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x78 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x79 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7A +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7B +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7C +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7D +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7E +{KeyNone, KeyNone, KeyNone, KeyNone} // 0x7F diff --git a/uspi/lib/keymap_es.h b/uspi/lib/keymap_es.h new file mode 100644 index 0000000..b88e67a --- /dev/null +++ b/uspi/lib/keymap_es.h @@ -0,0 +1,133 @@ +// Use ISO-8859-1 when editing this file! + +// by Jose Luis Sanchez + +// Normal Shift AltGr AltGr+Shift +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x00 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x01 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x02 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x03 +{'a', 'A', KeyNone, KeyNone}, // 0x04 +{'b', 'B', KeyNone, KeyNone}, // 0x05 +{'c', 'C', KeyNone, KeyNone}, // 0x06 +{'d', 'D', KeyNone, KeyNone}, // 0x07 +{'e', 'E', KeyNone, KeyNone}, // 0x08 +{'f', 'F', KeyNone, KeyNone}, // 0x09 +{'g', 'G', KeyNone, KeyNone}, // 0x0A +{'h', 'H', KeyNone, KeyNone}, // 0x0B +{'i', 'I', KeyNone, KeyNone}, // 0x0C +{'j', 'J', KeyNone, KeyNone}, // 0x0D +{'k', 'K', KeyNone, KeyNone}, // 0x0E +{'l', 'L', KeyNone, KeyNone}, // 0x0F +{'m', 'M', KeyNone, KeyNone}, // 0x10 +{'n', 'N', KeyNone, KeyNone}, // 0x11 +{'o', 'O', KeyNone, KeyNone}, // 0x12 +{'p', 'P', KeyNone, KeyNone}, // 0x13 +{'q', 'Q', KeyNone, KeyNone}, // 0x14 +{'r', 'R', KeyNone, KeyNone}, // 0x15 +{'s', 'S', KeyNone, KeyNone}, // 0x16 +{'t', 'T', KeyNone, KeyNone}, // 0x17 +{'u', 'U', KeyNone, KeyNone}, // 0x18 +{'v', 'V', KeyNone, KeyNone}, // 0x19 +{'w', 'W', KeyNone, KeyNone}, // 0x1A +{'x', 'X', KeyNone, KeyNone}, // 0x1B +{'y', 'Y', KeyNone, KeyNone}, // 0x1C +{'z', 'Z', KeyNone, KeyNone}, // 0x1D +{'1', '!', '|' , KeyNone}, // 0x1E +{'2', '\"', '@' , KeyNone}, // 0x1F +{'3', C('·'), '#' , KeyNone}, // 0x20 +{'4', '$', '~' , KeyNone}, // 0x21 +{'5', '%', C('˝') , KeyNone}, // 0x22 +{'6', '&', C('¬') , KeyNone}, // 0x23 +{'7', '/', '{' , KeyNone}, // 0x24 +{'8', '(', '[' , KeyNone}, // 0x25 +{'9', ')', ']' , KeyNone}, // 0x26 +{'0', '=', '}' , KeyNone}, // 0x27 +{KeyReturn, KeyReturn, KeyNone, KeyNone}, // 0x28 +{KeyEscape, KeyEscape, KeyNone, KeyNone}, // 0x29 +{KeyBackspace, KeyBackspace, KeyNone, KeyNone}, // 0x2A +{KeyTabulator, KeyTabulator, KeyNone, KeyNone}, // 0x2B +{KeySpace, KeySpace, KeyNone, KeyNone}, // 0x2C +{'\'', '?', '\\' , KeyNone}, // 0x2D +{C('ˇ'), C('ż'), KeyNone, KeyNone}, // 0x2E +{'`', '^', '[' , KeyNone}, // 0x2F +{'+', '*', ']' , KeyNone}, // 0x30 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x31 +{C('ç'), C('Ç'), '}' , KeyNone}, // 0x32 +{C('ń'), C('Ń'), '~' , KeyNone}, // 0x33 +{C('´'), C('¨'), '{' , KeyNone}, // 0x34 +{C('ş'), C('Ş'), '\\' , KeyNone}, // 0x35 +{',', ';', KeyNone, KeyNone}, // 0x36 +{'.', ':', C('·') , KeyNone}, // 0x37 +{'-', '_', KeyNone, KeyNone}, // 0x38 +{KeyCapsLock, KeyCapsLock, KeyNone, KeyNone}, // 0x39 +{KeyF1, KeyNone, KeyNone, KeyNone}, // 0x3A +{KeyF2, KeyNone, KeyNone, KeyNone}, // 0x3B +{KeyF3, KeyNone, KeyNone, KeyNone}, // 0x3C +{KeyF4, KeyNone, KeyNone, KeyNone}, // 0x3D +{KeyF5, KeyNone, KeyNone, KeyNone}, // 0x3E +{KeyF6, KeyNone, KeyNone, KeyNone}, // 0x3F +{KeyF7, KeyNone, KeyNone, KeyNone}, // 0x40 +{KeyF8, KeyNone, KeyNone, KeyNone}, // 0x41 +{KeyF9, KeyNone, KeyNone, KeyNone}, // 0x42 +{KeyF10, KeyNone, KeyNone, KeyNone}, // 0x43 +{KeyF11, KeyNone, KeyNone, KeyNone}, // 0x44 +{KeyF12, KeyNone, KeyNone, KeyNone}, // 0x45 +{KeyPrintScreen,KeyNone, KeyNone, KeyNone}, // 0x46 +{KeyScrollLock, KeyNone, KeyNone, KeyNone}, // 0x47 +{KeyPause, KeyNone, KeyNone, KeyNone}, // 0x48 +{KeyInsert, KeyNone, KeyNone, KeyNone}, // 0x49 +{KeyHome, KeyNone, KeyNone, KeyNone}, // 0x4A +{KeyPageUp, KeyNone, KeyNone, KeyNone}, // 0x4B +{KeyDelete, KeyNone, KeyNone, KeyNone}, // 0x4C +{KeyEnd, KeyNone, KeyNone, KeyNone}, // 0x4D +{KeyPageDown, KeyNone, KeyNone, KeyNone}, // 0x4E +{KeyRight, KeyNone, KeyNone, KeyNone}, // 0x4F +{KeyLeft, KeyNone, KeyNone, KeyNone}, // 0x50 +{KeyDown, KeyNone, KeyNone, KeyNone}, // 0x51 +{KeyUp, KeyNone, KeyNone, KeyNone}, // 0x52 +{KeyNumLock, KeyNumLock, KeyNone, KeyNone}, // 0x53 +{KeyKP_Divide, KeyKP_Divide, KeyNone, KeyNone}, // 0x54 +{KeyKP_Multiply,KeyKP_Multiply, KeyNone, KeyNone}, // 0x55 +{KeyKP_Subtract,KeyKP_Subtract, KeyNone, KeyNone}, // 0x56 +{KeyKP_Add, KeyKP_Add, KeyNone, KeyNone}, // 0x57 +{KeyKP_Enter, KeyKP_Enter, KeyNone, KeyNone}, // 0x58 +{KeyEnd, KeyKP_1, KeyNone, KeyNone}, // 0x59 +{KeyDown, KeyKP_2, KeyNone, KeyNone}, // 0x5A +{KeyPageDown, KeyKP_3, KeyNone, KeyNone}, // 0x5B +{KeyLeft, KeyKP_4, KeyNone, KeyNone}, // 0x5C +{KeyKP_Center, KeyKP_5, KeyNone, KeyNone}, // 0x5D +{KeyRight, KeyKP_6, KeyNone, KeyNone}, // 0x5E +{KeyHome, KeyKP_7, KeyNone, KeyNone}, // 0x5F +{KeyUp, KeyKP_8, KeyNone, KeyNone}, // 0x60 +{KeyPageUp, KeyKP_9, KeyNone, KeyNone}, // 0x61 +{KeyInsert, KeyKP_0, KeyNone, KeyNone}, // 0x62 +{KeyDelete, KeyKP_Period, KeyNone, KeyNone}, // 0x63 +{'<', '>', '|' , KeyNone}, // 0x64 +{KeyApplication,KeyApplication, KeyNone, KeyNone}, // 0x65 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x66 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x67 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x68 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x69 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6A +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6B +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6C +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6D +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6E +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6F +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x70 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x71 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x72 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x73 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x74 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x75 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x76 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x77 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x78 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x79 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7A +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7B +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7C +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7D +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7E +{KeyNone, KeyNone, KeyNone, KeyNone} // 0x7F diff --git a/uspi/lib/keymap_fr.h b/uspi/lib/keymap_fr.h new file mode 100644 index 0000000..c79e594 --- /dev/null +++ b/uspi/lib/keymap_fr.h @@ -0,0 +1,131 @@ +// Use ISO-8859-1 when editing this file! + +// Normal Shift AltGr AltGr+Shift +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x00 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x01 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x02 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x03 +{'q', 'Q', KeyNone, KeyNone}, // 0x04 +{'b', 'B', KeyNone, KeyNone}, // 0x05 +{'c', 'C', KeyNone, KeyNone}, // 0x06 +{'d', 'D', KeyNone, KeyNone}, // 0x07 +{'e', 'E', KeyNone, KeyNone}, // 0x08 +{'f', 'F', KeyNone, KeyNone}, // 0x09 +{'g', 'G', KeyNone, KeyNone}, // 0x0A +{'h', 'H', KeyNone, KeyNone}, // 0x0B +{'i', 'I', KeyNone, KeyNone}, // 0x0C +{'j', 'J', KeyNone, KeyNone}, // 0x0D +{'k', 'K', KeyNone, KeyNone}, // 0x0E +{'l', 'L', KeyNone, KeyNone}, // 0x0F +{',', '?', KeyNone, KeyNone}, // 0x10 +{'n', 'N', KeyNone, KeyNone}, // 0x11 +{'o', 'O', KeyNone, KeyNone}, // 0x12 +{'p', 'P', KeyNone, KeyNone}, // 0x13 +{'a', 'A', KeyNone, KeyNone}, // 0x14 +{'r', 'R', KeyNone, KeyNone}, // 0x15 +{'s', 'S', KeyNone, KeyNone}, // 0x16 +{'t', 'T', KeyNone, KeyNone}, // 0x17 +{'u', 'U', KeyNone, KeyNone}, // 0x18 +{'v', 'V', KeyNone, KeyNone}, // 0x19 +{'z', 'Z', KeyNone, KeyNone}, // 0x1A +{'x', 'X', KeyNone, KeyNone}, // 0x1B +{'y', 'Y', KeyNone, KeyNone}, // 0x1C +{'w', 'W', KeyNone, KeyNone}, // 0x1D +{'&', '1', KeyNone, KeyNone}, // 0x1E +{C('é'), '2', '~', KeyNone}, // 0x1F +{'\"', '3', '#', KeyNone}, // 0x20 +{'\'', '4', '{', KeyNone}, // 0x21 +{'(', '5', '[', KeyNone}, // 0x22 +{'-', '6', '|', KeyNone}, // 0x23 +{C('č'), '7', '`', KeyNone}, // 0x24 +{'_', '8', '\\', KeyNone}, // 0x25 +{C('ç'), '9', '^', KeyNone}, // 0x26 +{C('ŕ'), '0', '@', KeyNone}, // 0x27 +{KeyReturn, KeyReturn, KeyNone, KeyNone}, // 0x28 +{KeyEscape, KeyEscape, KeyNone, KeyNone}, // 0x29 +{KeyBackspace, KeyBackspace, KeyNone, KeyNone}, // 0x2A +{KeyTabulator, KeyTabulator, KeyNone, KeyNone}, // 0x2B +{KeySpace, KeySpace, KeyNone, KeyNone}, // 0x2C +{')', C('°'), ']', KeyNone}, // 0x2D +{'=', '+', '}', KeyNone}, // 0x2E +{'^', C('¨'), KeyNone, KeyNone}, // 0x2F +{'$', C('Ł'), C('¤'), KeyNone}, // 0x30 +{'*', C('µ'), KeyNone, KeyNone}, // 0x31 +{'*', C('µ'), KeyNone, KeyNone}, // 0x32 +{'m', 'M', KeyNone, KeyNone}, // 0x33 +{C('ů'), '%', KeyNone, KeyNone}, // 0x34 +{C('˛'), KeyNone, KeyNone, KeyNone}, // 0x35 +{';', '.', KeyNone, KeyNone}, // 0x36 +{':', '/', KeyNone, KeyNone}, // 0x37 +{'!', C('§'), KeyNone, KeyNone}, // 0x38 +{KeyCapsLock, KeyCapsLock, KeyNone, KeyNone}, // 0x39 +{KeyF1, KeyNone, KeyNone, KeyNone}, // 0x3A +{KeyF2, KeyNone, KeyNone, KeyNone}, // 0x3B +{KeyF3, KeyNone, KeyNone, KeyNone}, // 0x3C +{KeyF4, KeyNone, KeyNone, KeyNone}, // 0x3D +{KeyF5, KeyNone, KeyNone, KeyNone}, // 0x3E +{KeyF6, KeyNone, KeyNone, KeyNone}, // 0x3F +{KeyF7, KeyNone, KeyNone, KeyNone}, // 0x40 +{KeyF8, KeyNone, KeyNone, KeyNone}, // 0x41 +{KeyF9, KeyNone, KeyNone, KeyNone}, // 0x42 +{KeyF10, KeyNone, KeyNone, KeyNone}, // 0x43 +{KeyF11, KeyNone, KeyNone, KeyNone}, // 0x44 +{KeyF12, KeyNone, KeyNone, KeyNone}, // 0x45 +{KeyPrintScreen,KeyNone, KeyNone, KeyNone}, // 0x46 +{KeyScrollLock, KeyNone, KeyNone, KeyNone}, // 0x47 +{KeyPause, KeyNone, KeyNone, KeyNone}, // 0x48 +{KeyInsert, KeyNone, KeyNone, KeyNone}, // 0x49 +{KeyHome, KeyNone, KeyNone, KeyNone}, // 0x4A +{KeyPageUp, KeyNone, KeyNone, KeyNone}, // 0x4B +{KeyDelete, KeyNone, KeyNone, KeyNone}, // 0x4C +{KeyEnd, KeyNone, KeyNone, KeyNone}, // 0x4D +{KeyPageDown, KeyNone, KeyNone, KeyNone}, // 0x4E +{KeyRight, KeyNone, KeyNone, KeyNone}, // 0x4F +{KeyLeft, KeyNone, KeyNone, KeyNone}, // 0x50 +{KeyDown, KeyNone, KeyNone, KeyNone}, // 0x51 +{KeyUp, KeyNone, KeyNone, KeyNone}, // 0x52 +{KeyNumLock, KeyNumLock, KeyNone, KeyNone}, // 0x53 +{KeyKP_Divide, KeyKP_Divide, KeyNone, KeyNone}, // 0x54 +{KeyKP_Multiply,KeyKP_Multiply, KeyNone, KeyNone}, // 0x55 +{KeyKP_Subtract,KeyKP_Subtract, KeyNone, KeyNone}, // 0x56 +{KeyKP_Add, KeyKP_Add, KeyNone, KeyNone}, // 0x57 +{KeyKP_Enter, KeyKP_Enter, KeyNone, KeyNone}, // 0x58 +{KeyEnd, KeyKP_1, KeyNone, KeyNone}, // 0x59 +{KeyDown, KeyKP_2, KeyNone, KeyNone}, // 0x5A +{KeyPageDown, KeyKP_3, KeyNone, KeyNone}, // 0x5B +{KeyLeft, KeyKP_4, KeyNone, KeyNone}, // 0x5C +{KeyKP_Center, KeyKP_5, KeyNone, KeyNone}, // 0x5D +{KeyRight, KeyKP_6, KeyNone, KeyNone}, // 0x5E +{KeyHome, KeyKP_7, KeyNone, KeyNone}, // 0x5F +{KeyUp, KeyKP_8, KeyNone, KeyNone}, // 0x60 +{KeyPageUp, KeyKP_9, KeyNone, KeyNone}, // 0x61 +{KeyInsert, KeyKP_0, KeyNone, KeyNone}, // 0x62 +{KeyDelete, KeyKP_Period, KeyNone, KeyNone}, // 0x63 +{'<', '>', KeyNone, KeyNone}, // 0x64 +{KeyApplication,KeyApplication, KeyNone, KeyNone}, // 0x65 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x66 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x67 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x68 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x69 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6A +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6B +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6C +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6D +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6E +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6F +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x70 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x71 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x72 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x73 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x74 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x75 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x76 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x77 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x78 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x79 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7A +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7B +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7C +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7D +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7E +{KeyNone, KeyNone, KeyNone, KeyNone} // 0x7F diff --git a/uspi/lib/keymap_it.h b/uspi/lib/keymap_it.h new file mode 100644 index 0000000..e579dcc --- /dev/null +++ b/uspi/lib/keymap_it.h @@ -0,0 +1,131 @@ +// Use ISO-8859-1 when editing this file! + +// Normal Shift AltGr AltGr+Shift +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x00 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x01 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x02 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x03 +{'a', 'A', KeyNone, KeyNone}, // 0x04 +{'b', 'B', KeyNone, KeyNone}, // 0x05 +{'c', 'C', KeyNone, KeyNone}, // 0x06 +{'d', 'D', KeyNone, KeyNone}, // 0x07 +{'e', 'E', C('€'), C('€')}, // 0x08 +{'f', 'F', KeyNone, KeyNone}, // 0x09 +{'g', 'G', KeyNone, KeyNone}, // 0x0A +{'h', 'H', KeyNone, KeyNone}, // 0x0B +{'i', 'I', KeyNone, KeyNone}, // 0x0C +{'j', 'J', KeyNone, KeyNone}, // 0x0D +{'k', 'K', KeyNone, KeyNone}, // 0x0E +{'l', 'L', KeyNone, KeyNone}, // 0x0F +{'m', 'M', KeyNone, KeyNone}, // 0x10 +{'n', 'N', KeyNone, KeyNone}, // 0x11 +{'o', 'O', KeyNone, KeyNone}, // 0x12 +{'p', 'P', KeyNone, KeyNone}, // 0x13 +{'q', 'Q', KeyNone, KeyNone}, // 0x14 +{'r', 'R', KeyNone, KeyNone}, // 0x15 +{'s', 'S', KeyNone, KeyNone}, // 0x16 +{'t', 'T', KeyNone, KeyNone}, // 0x17 +{'u', 'U', KeyNone, KeyNone}, // 0x18 +{'v', 'V', KeyNone, KeyNone}, // 0x19 +{'w', 'W', KeyNone, KeyNone}, // 0x1A +{'x', 'X', KeyNone, KeyNone}, // 0x1B +{'y', 'Y', KeyNone, KeyNone}, // 0x1C +{'z', 'Z', KeyNone, KeyNone}, // 0x1D +{'1', '!', KeyNone, KeyNone}, // 0x1E +{'2', '\"', KeyNone, KeyNone}, // 0x1F +{'3', C('Ł'), KeyNone, KeyNone}, // 0x20 +{'4', '$', KeyNone, KeyNone}, // 0x21 +{'5', '%', C('€'), C('€')}, // 0x22 +{'6', '&', KeyNone, KeyNone}, // 0x23 +{'7', '/', KeyNone, KeyNone}, // 0x24 +{'8', '(', KeyNone, KeyNone}, // 0x25 +{'9', ')', KeyNone, KeyNone}, // 0x26 +{'0', '=', KeyNone, KeyNone}, // 0x27 +{KeyReturn, KeyReturn, KeyNone, KeyNone}, // 0x28 +{KeyEscape, KeyEscape, KeyNone, KeyNone}, // 0x29 +{KeyBackspace, KeyBackspace, KeyNone, KeyNone}, // 0x2A +{KeyTabulator, KeyTabulator, KeyNone, KeyNone}, // 0x2B +{KeySpace, KeySpace, KeyNone, KeyNone}, // 0x2C +{'\'', '?', KeyNone, KeyNone}, // 0x2D +{C('ě'), '^', KeyNone, KeyNone}, // 0x2E +{C('č'), C('é'), '[', '{'}, // 0x2F +{'+', '*', ']', '}'}, // 0x30 +{C('ů'), C('§'), KeyNone, KeyNone}, // 0x31 +{C('ů'), C('§'), KeyNone, KeyNone}, // 0x32 +{C('ň'), C('ç'), '@', KeyNone}, // 0x33 +{C('ŕ'), C('°'), '#', KeyNone}, // 0x34 +{'\\', '|', KeyNone, KeyNone}, // 0x35 +{',', ';', KeyNone, KeyNone}, // 0x36 +{'.', ':', KeyNone, KeyNone}, // 0x37 +{'-', '_', KeyNone, KeyNone}, // 0x38 +{KeyCapsLock, KeyCapsLock, KeyNone, KeyNone}, // 0x39 +{KeyF1, KeyNone, KeyNone, KeyNone}, // 0x3A +{KeyF2, KeyNone, KeyNone, KeyNone}, // 0x3B +{KeyF3, KeyNone, KeyNone, KeyNone}, // 0x3C +{KeyF4, KeyNone, KeyNone, KeyNone}, // 0x3D +{KeyF5, KeyNone, KeyNone, KeyNone}, // 0x3E +{KeyF6, KeyNone, KeyNone, KeyNone}, // 0x3F +{KeyF7, KeyNone, KeyNone, KeyNone}, // 0x40 +{KeyF8, KeyNone, KeyNone, KeyNone}, // 0x41 +{KeyF9, KeyNone, KeyNone, KeyNone}, // 0x42 +{KeyF10, KeyNone, KeyNone, KeyNone}, // 0x43 +{KeyF11, KeyNone, KeyNone, KeyNone}, // 0x44 +{KeyF12, KeyNone, KeyNone, KeyNone}, // 0x45 +{KeyPrintScreen,KeyNone, KeyNone, KeyNone}, // 0x46 +{KeyScrollLock, KeyNone, KeyNone, KeyNone}, // 0x47 +{KeyPause, KeyNone, KeyNone, KeyNone}, // 0x48 +{KeyInsert, KeyNone, KeyNone, KeyNone}, // 0x49 +{KeyHome, KeyNone, KeyNone, KeyNone}, // 0x4A +{KeyPageUp, KeyNone, KeyNone, KeyNone}, // 0x4B +{KeyDelete, KeyNone, KeyNone, KeyNone}, // 0x4C +{KeyEnd, KeyNone, KeyNone, KeyNone}, // 0x4D +{KeyPageDown, KeyNone, KeyNone, KeyNone}, // 0x4E +{KeyRight, KeyNone, KeyNone, KeyNone}, // 0x4F +{KeyLeft, KeyNone, KeyNone, KeyNone}, // 0x50 +{KeyDown, KeyNone, KeyNone, KeyNone}, // 0x51 +{KeyUp, KeyNone, KeyNone, KeyNone}, // 0x52 +{KeyNumLock, KeyNumLock, KeyNone, KeyNone}, // 0x53 +{KeyKP_Divide, KeyKP_Divide, KeyNone, KeyNone}, // 0x54 +{KeyKP_Multiply,KeyKP_Multiply, KeyNone, KeyNone}, // 0x55 +{KeyKP_Subtract,KeyKP_Subtract, KeyNone, KeyNone}, // 0x56 +{KeyKP_Add, KeyKP_Add, KeyNone, KeyNone}, // 0x57 +{KeyKP_Enter, KeyKP_Enter, KeyNone, KeyNone}, // 0x58 +{KeyEnd, KeyKP_1, KeyNone, KeyNone}, // 0x59 +{KeyDown, KeyKP_2, KeyNone, KeyNone}, // 0x5A +{KeyPageDown, KeyKP_3, KeyNone, KeyNone}, // 0x5B +{KeyLeft, KeyKP_4, KeyNone, KeyNone}, // 0x5C +{KeyKP_Center, KeyKP_5, KeyNone, KeyNone}, // 0x5D +{KeyRight, KeyKP_6, KeyNone, KeyNone}, // 0x5E +{KeyHome, KeyKP_7, KeyNone, KeyNone}, // 0x5F +{KeyUp, KeyKP_8, KeyNone, KeyNone}, // 0x60 +{KeyPageUp, KeyKP_9, KeyNone, KeyNone}, // 0x61 +{KeyInsert, KeyKP_0, KeyNone, KeyNone}, // 0x62 +{KeyDelete, KeyKP_Period, KeyNone, KeyNone}, // 0x63 +{'<', '>', KeyNone, KeyNone}, // 0x64 +{KeyApplication,KeyApplication, KeyNone, KeyNone}, // 0x65 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x66 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x67 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x68 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x69 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6A +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6B +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6C +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6D +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6E +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6F +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x70 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x71 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x72 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x73 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x74 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x75 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x76 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x77 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x78 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x79 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7A +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7B +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7C +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7D +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7E +{KeyNone, KeyNone, KeyNone, KeyNone} // 0x7F diff --git a/uspi/lib/keymap_uk.h b/uspi/lib/keymap_uk.h new file mode 100644 index 0000000..66bcbed --- /dev/null +++ b/uspi/lib/keymap_uk.h @@ -0,0 +1,131 @@ +// Use ISO-8859-1 when editing this file! + +// Normal Shift AltGr AltGr+Shift +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x00 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x01 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x02 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x03 +{'a', 'A', KeyNone, KeyNone}, // 0x04 +{'b', 'B', KeyNone, KeyNone}, // 0x05 +{'c', 'C', KeyNone, KeyNone}, // 0x06 +{'d', 'D', KeyNone, KeyNone}, // 0x07 +{'e', 'E', KeyNone, KeyNone}, // 0x08 +{'f', 'F', KeyNone, KeyNone}, // 0x09 +{'g', 'G', KeyNone, KeyNone}, // 0x0A +{'h', 'H', KeyNone, KeyNone}, // 0x0B +{'i', 'I', KeyNone, KeyNone}, // 0x0C +{'j', 'J', KeyNone, KeyNone}, // 0x0D +{'k', 'K', KeyNone, KeyNone}, // 0x0E +{'l', 'L', KeyNone, KeyNone}, // 0x0F +{'m', 'M', KeyNone, KeyNone}, // 0x10 +{'n', 'N', KeyNone, KeyNone}, // 0x11 +{'o', 'O', KeyNone, KeyNone}, // 0x12 +{'p', 'P', KeyNone, KeyNone}, // 0x13 +{'q', 'Q', KeyNone, KeyNone}, // 0x14 +{'r', 'R', KeyNone, KeyNone}, // 0x15 +{'s', 'S', KeyNone, KeyNone}, // 0x16 +{'t', 'T', KeyNone, KeyNone}, // 0x17 +{'u', 'U', KeyNone, KeyNone}, // 0x18 +{'v', 'V', KeyNone, KeyNone}, // 0x19 +{'w', 'W', KeyNone, KeyNone}, // 0x1A +{'x', 'X', KeyNone, KeyNone}, // 0x1B +{'y', 'Y', KeyNone, KeyNone}, // 0x1C +{'z', 'Z', KeyNone, KeyNone}, // 0x1D +{'1', '!', KeyNone, KeyNone}, // 0x1E +{'2', '\"', KeyNone, KeyNone}, // 0x1F +{'3', C('Ł'), KeyNone, KeyNone}, // 0x20 +{'4', '$', KeyNone, KeyNone}, // 0x21 +{'5', '%', KeyNone, KeyNone}, // 0x22 +{'6', '^', KeyNone, KeyNone}, // 0x23 +{'7', '&', KeyNone, KeyNone}, // 0x24 +{'8', '*', KeyNone, KeyNone}, // 0x25 +{'9', '(', KeyNone, KeyNone}, // 0x26 +{'0', ')', KeyNone, KeyNone}, // 0x27 +{KeyReturn, KeyReturn, KeyNone, KeyNone}, // 0x28 +{KeyEscape, KeyEscape, KeyNone, KeyNone}, // 0x29 +{KeyBackspace, KeyBackspace, KeyNone, KeyNone}, // 0x2A +{KeyTabulator, KeyTabulator, KeyNone, KeyNone}, // 0x2B +{KeySpace, KeySpace, KeyNone, KeyNone}, // 0x2C +{'-', '_', KeyNone, KeyNone}, // 0x2D +{'=', '+', KeyNone, KeyNone}, // 0x2E +{'[', '{', KeyNone, KeyNone}, // 0x2F +{']', '}', KeyNone, KeyNone}, // 0x30 +{'#', '~', KeyNone, KeyNone}, // 0x31 +{'#', '~', KeyNone, KeyNone}, // 0x32 +{';', ':', KeyNone, KeyNone}, // 0x33 +{'\'', '@', KeyNone, KeyNone}, // 0x34 +{'`', C('¬'), '|', KeyNone}, // 0x35 +{',', '<', KeyNone, KeyNone}, // 0x36 +{'.', '>', KeyNone, KeyNone}, // 0x37 +{'/', '?', KeyNone, KeyNone}, // 0x38 +{KeyCapsLock, KeyCapsLock, KeyNone, KeyNone}, // 0x39 +{KeyF1, KeyNone, KeyNone, KeyNone}, // 0x3A +{KeyF2, KeyNone, KeyNone, KeyNone}, // 0x3B +{KeyF3, KeyNone, KeyNone, KeyNone}, // 0x3C +{KeyF4, KeyNone, KeyNone, KeyNone}, // 0x3D +{KeyF5, KeyNone, KeyNone, KeyNone}, // 0x3E +{KeyF6, KeyNone, KeyNone, KeyNone}, // 0x3F +{KeyF7, KeyNone, KeyNone, KeyNone}, // 0x40 +{KeyF8, KeyNone, KeyNone, KeyNone}, // 0x41 +{KeyF9, KeyNone, KeyNone, KeyNone}, // 0x42 +{KeyF10, KeyNone, KeyNone, KeyNone}, // 0x43 +{KeyF11, KeyNone, KeyNone, KeyNone}, // 0x44 +{KeyF12, KeyNone, KeyNone, KeyNone}, // 0x45 +{KeyPrintScreen,KeyNone, KeyNone, KeyNone}, // 0x46 +{KeyScrollLock, KeyNone, KeyNone, KeyNone}, // 0x47 +{KeyPause, KeyNone, KeyNone, KeyNone}, // 0x48 +{KeyInsert, KeyNone, KeyNone, KeyNone}, // 0x49 +{KeyHome, KeyNone, KeyNone, KeyNone}, // 0x4A +{KeyPageUp, KeyNone, KeyNone, KeyNone}, // 0x4B +{KeyDelete, KeyNone, KeyNone, KeyNone}, // 0x4C +{KeyEnd, KeyNone, KeyNone, KeyNone}, // 0x4D +{KeyPageDown, KeyNone, KeyNone, KeyNone}, // 0x4E +{KeyRight, KeyNone, KeyNone, KeyNone}, // 0x4F +{KeyLeft, KeyNone, KeyNone, KeyNone}, // 0x50 +{KeyDown, KeyNone, KeyNone, KeyNone}, // 0x51 +{KeyUp, KeyNone, KeyNone, KeyNone}, // 0x52 +{KeyNumLock, KeyNumLock, KeyNone, KeyNone}, // 0x53 +{KeyKP_Divide, KeyKP_Divide, KeyNone, KeyNone}, // 0x54 +{KeyKP_Multiply,KeyKP_Multiply, KeyNone, KeyNone}, // 0x55 +{KeyKP_Subtract,KeyKP_Subtract, KeyNone, KeyNone}, // 0x56 +{KeyKP_Add, KeyKP_Add, KeyNone, KeyNone}, // 0x57 +{KeyKP_Enter, KeyKP_Enter, KeyNone, KeyNone}, // 0x58 +{KeyEnd, KeyKP_1, KeyNone, KeyNone}, // 0x59 +{KeyDown, KeyKP_2, KeyNone, KeyNone}, // 0x5A +{KeyPageDown, KeyKP_3, KeyNone, KeyNone}, // 0x5B +{KeyLeft, KeyKP_4, KeyNone, KeyNone}, // 0x5C +{KeyKP_Center, KeyKP_5, KeyNone, KeyNone}, // 0x5D +{KeyRight, KeyKP_6, KeyNone, KeyNone}, // 0x5E +{KeyHome, KeyKP_7, KeyNone, KeyNone}, // 0x5F +{KeyUp, KeyKP_8, KeyNone, KeyNone}, // 0x60 +{KeyPageUp, KeyKP_9, KeyNone, KeyNone}, // 0x61 +{KeyInsert, KeyKP_0, KeyNone, KeyNone}, // 0x62 +{KeyDelete, KeyKP_Period, KeyNone, KeyNone}, // 0x63 +{'\\', '|', KeyNone, KeyNone}, // 0x64 +{KeyApplication,KeyApplication, KeyNone, KeyNone}, // 0x65 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x66 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x67 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x68 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x69 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6A +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6B +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6C +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6D +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6E +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6F +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x70 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x71 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x72 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x73 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x74 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x75 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x76 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x77 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x78 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x79 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7A +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7B +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7C +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7D +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7E +{KeyNone, KeyNone, KeyNone, KeyNone} // 0x7F diff --git a/uspi/lib/keymap_us.h b/uspi/lib/keymap_us.h new file mode 100644 index 0000000..83f0144 --- /dev/null +++ b/uspi/lib/keymap_us.h @@ -0,0 +1,131 @@ +// Use ISO-8859-1 when editing this file! + +// Normal Shift AltGr AltGr+Shift +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x00 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x01 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x02 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x03 +{'a', 'A', C('á'), C('Á')}, // 0x04 +{'b', 'B', KeyNone, KeyNone}, // 0x05 +{'c', 'C', C('©'), C('˘')}, // 0x06 +{'d', 'D', C('đ'), C('Đ')}, // 0x07 +{'e', 'E', C('é'), C('É')}, // 0x08 +{'f', 'F', KeyNone, KeyNone}, // 0x09 +{'g', 'G', KeyNone, KeyNone}, // 0x0A +{'h', 'H', KeyNone, KeyNone}, // 0x0B +{'i', 'I', C('í'), C('Í')}, // 0x0C +{'j', 'J', KeyNone, KeyNone}, // 0x0D +{'k', 'K', KeyNone, KeyNone}, // 0x0E +{'l', 'L', C('ř'), C('Ř')}, // 0x0F +{'m', 'M', C('µ'), KeyNone}, // 0x10 +{'n', 'N', C('ń'), C('Ń')}, // 0x11 +{'o', 'O', C('ó'), C('Ó')}, // 0x12 +{'p', 'P', C('ö'), C('Ö')}, // 0x13 +{'q', 'Q', C('ä'), C('Ä')}, // 0x14 +{'r', 'R', C('®'), KeyNone}, // 0x15 +{'s', 'S', C('ß'), C('§')}, // 0x16 +{'t', 'T', C('ţ'), C('Ţ')}, // 0x17 +{'u', 'U', C('ú'), C('Ú')}, // 0x18 +{'v', 'V', KeyNone, KeyNone}, // 0x19 +{'w', 'W', C('ĺ'), C('Ĺ')}, // 0x1A +{'x', 'X', KeyNone, KeyNone}, // 0x1B +{'y', 'Y', C('ü'), C('Ü')}, // 0x1C +{'z', 'Z', C('ć'), C('Ć')}, // 0x1D +{'1', '!', C('ˇ'), C('ą')}, // 0x1E +{'2', '@', C('˛'), KeyNone}, // 0x1F +{'3', '#', C('ł'), KeyNone}, // 0x20 +{'4', '$', C('¤'), C('Ł')}, // 0x21 +{'5', '%', C('€'), KeyNone}, // 0x22 +{'6', '^', C('Ľ'), KeyNone}, // 0x23 +{'7', '&', C('˝'), KeyNone}, // 0x24 +{'8', '*', C('ľ'), KeyNone}, // 0x25 +{'9', '(', KeyNone, KeyNone}, // 0x26 +{'0', ')', KeyNone, KeyNone}, // 0x27 +{KeyReturn, KeyReturn, KeyNone, KeyNone}, // 0x28 +{KeyEscape, KeyEscape, KeyNone, KeyNone}, // 0x29 +{KeyBackspace, KeyBackspace, KeyNone, KeyNone}, // 0x2A +{KeyTabulator, KeyTabulator, KeyNone, KeyNone}, // 0x2B +{KeySpace, KeySpace, KeyNone, KeyNone}, // 0x2C +{'-', '_', C('Ą'), KeyNone}, // 0x2D +{'=', '+', C('×'), C('÷')}, // 0x2E +{'[', '{', C('«'), KeyNone}, // 0x2F +{']', '}', C('»'), KeyNone}, // 0x30 +{'\\', '|', C('¬'), C('¦')}, // 0x31 +{'#', '~', KeyNone, KeyNone}, // 0x32 +{';', ':', C('¶'), C('°')}, // 0x33 +{'\'', '\"', C('´'), C('¨')}, // 0x34 +{'`', '~', KeyNone, KeyNone}, // 0x35 +{',', '<', C('ç'), C('Ç')}, // 0x36 +{'.', '>', KeyNone, KeyNone}, // 0x37 +{'/', '?', C('ż'), KeyNone}, // 0x38 +{KeyCapsLock, KeyCapsLock, KeyNone, KeyNone}, // 0x39 +{KeyF1, KeyNone, KeyNone, KeyNone}, // 0x3A +{KeyF2, KeyNone, KeyNone, KeyNone}, // 0x3B +{KeyF3, KeyNone, KeyNone, KeyNone}, // 0x3C +{KeyF4, KeyNone, KeyNone, KeyNone}, // 0x3D +{KeyF5, KeyNone, KeyNone, KeyNone}, // 0x3E +{KeyF6, KeyNone, KeyNone, KeyNone}, // 0x3F +{KeyF7, KeyNone, KeyNone, KeyNone}, // 0x40 +{KeyF8, KeyNone, KeyNone, KeyNone}, // 0x41 +{KeyF9, KeyNone, KeyNone, KeyNone}, // 0x42 +{KeyF10, KeyNone, KeyNone, KeyNone}, // 0x43 +{KeyF11, KeyNone, KeyNone, KeyNone}, // 0x44 +{KeyF12, KeyNone, KeyNone, KeyNone}, // 0x45 +{KeyPrintScreen,KeyNone, KeyNone, KeyNone}, // 0x46 +{KeyScrollLock, KeyNone, KeyNone, KeyNone}, // 0x47 +{KeyPause, KeyNone, KeyNone, KeyNone}, // 0x48 +{KeyInsert, KeyNone, KeyNone, KeyNone}, // 0x49 +{KeyHome, KeyNone, KeyNone, KeyNone}, // 0x4A +{KeyPageUp, KeyNone, KeyNone, KeyNone}, // 0x4B +{KeyDelete, KeyNone, KeyNone, KeyNone}, // 0x4C +{KeyEnd, KeyNone, KeyNone, KeyNone}, // 0x4D +{KeyPageDown, KeyNone, KeyNone, KeyNone}, // 0x4E +{KeyRight, KeyNone, KeyNone, KeyNone}, // 0x4F +{KeyLeft, KeyNone, KeyNone, KeyNone}, // 0x50 +{KeyDown, KeyNone, KeyNone, KeyNone}, // 0x51 +{KeyUp, KeyNone, KeyNone, KeyNone}, // 0x52 +{KeyNumLock, KeyNumLock, KeyNone, KeyNone}, // 0x53 +{KeyKP_Divide, KeyKP_Divide, KeyNone, KeyNone}, // 0x54 +{KeyKP_Multiply,KeyKP_Multiply, KeyNone, KeyNone}, // 0x55 +{KeyKP_Subtract,KeyKP_Subtract, KeyNone, KeyNone}, // 0x56 +{KeyKP_Add, KeyKP_Add, KeyNone, KeyNone}, // 0x57 +{KeyKP_Enter, KeyKP_Enter, KeyNone, KeyNone}, // 0x58 +{KeyEnd, KeyKP_1, KeyNone, KeyNone}, // 0x59 +{KeyDown, KeyKP_2, KeyNone, KeyNone}, // 0x5A +{KeyPageDown, KeyKP_3, KeyNone, KeyNone}, // 0x5B +{KeyLeft, KeyKP_4, KeyNone, KeyNone}, // 0x5C +{KeyKP_Center, KeyKP_5, KeyNone, KeyNone}, // 0x5D +{KeyRight, KeyKP_6, KeyNone, KeyNone}, // 0x5E +{KeyHome, KeyKP_7, KeyNone, KeyNone}, // 0x5F +{KeyUp, KeyKP_8, KeyNone, KeyNone}, // 0x60 +{KeyPageUp, KeyKP_9, KeyNone, KeyNone}, // 0x61 +{KeyInsert, KeyKP_0, KeyNone, KeyNone}, // 0x62 +{KeyDelete, KeyKP_Period, KeyNone, KeyNone}, // 0x63 +{'\\', '|', KeyNone, KeyNone}, // 0x64 +{KeyApplication,KeyApplication, KeyNone, KeyNone}, // 0x65 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x66 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x67 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x68 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x69 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6A +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6B +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6C +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6D +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6E +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x6F +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x70 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x71 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x72 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x73 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x74 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x75 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x76 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x77 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x78 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x79 +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7A +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7B +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7C +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7D +{KeyNone, KeyNone, KeyNone, KeyNone}, // 0x7E +{KeyNone, KeyNone, KeyNone, KeyNone} // 0x7F diff --git a/uspi/lib/lan7800.c b/uspi/lib/lan7800.c new file mode 100644 index 0000000..7752043 --- /dev/null +++ b/uspi/lib/lan7800.c @@ -0,0 +1,783 @@ +// +// lan7800.c +// +// This driver has been written based on the Linux lan78xx driver which is: +// Copyright (C) 2015 Microchip Technology +// Driver author: WOOJUNG HUH +// Licensed under GPLv2 +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2018 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include +#include +#include + +// Sizes +#define HS_USB_PKT_SIZE 512 + +#define MAX_RX_FIFO_SIZE (12 * 1024) +#define MAX_TX_FIFO_SIZE (12 * 1024) +#define DEFAULT_BURST_CAP_SIZE MAX_TX_FIFO_SIZE +#define DEFAULT_BULK_IN_DELAY 0x800 + +#define RX_HEADER_SIZE (4 + 4 + 2) +#define TX_HEADER_SIZE (4 + 4) + +#define MAX_RX_FRAME_SIZE (2*6 + 2 + 1500 + 4) + +// USB vendor requests +#define WRITE_REGISTER 0xA0 +#define READ_REGISTER 0xA1 + +// Device registers +#define ID_REV 0x000 + #define ID_REV_CHIP_ID_MASK 0xFFFF0000 + #define ID_REV_CHIP_ID_7800 0x7800 +#define INT_STS 0x00C + #define INT_STS_CLEAR_ALL 0xFFFFFFFF +#define HW_CFG 0x010 + #define HW_CFG_CLK125_EN 0x02000000 + #define HW_CFG_REFCLK25_EN 0x01000000 + #define HW_CFG_LED3_EN 0x00800000 + #define HW_CFG_LED2_EN 0x00400000 + #define HW_CFG_LED1_EN 0x00200000 + #define HW_CFG_LED0_EN 0x00100000 + #define HW_CFG_EEE_PHY_LUSU 0x00020000 + #define HW_CFG_EEE_TSU 0x00010000 + #define HW_CFG_NETDET_STS 0x00008000 + #define HW_CFG_NETDET_EN 0x00004000 + #define HW_CFG_EEM 0x00002000 + #define HW_CFG_RST_PROTECT 0x00001000 + #define HW_CFG_CONNECT_BUF 0x00000400 + #define HW_CFG_CONNECT_EN 0x00000200 + #define HW_CFG_CONNECT_POL 0x00000100 + #define HW_CFG_SUSPEND_N_SEL_MASK 0x000000C0 + #define HW_CFG_SUSPEND_N_SEL_2 0x00000000 + #define HW_CFG_SUSPEND_N_SEL_12N 0x00000040 + #define HW_CFG_SUSPEND_N_SEL_012N 0x00000080 + #define HW_CFG_SUSPEND_N_SEL_0123N 0x000000C0 + #define HW_CFG_SUSPEND_N_POL 0x00000020 + #define HW_CFG_MEF 0x00000010 + #define HW_CFG_ETC 0x00000008 + #define HW_CFG_LRST 0x00000002 + #define HW_CFG_SRST 0x00000001 +#define PMT_CTL 0x014 + #define PMT_CTL_EEE_WAKEUP_EN 0x00002000 + #define PMT_CTL_EEE_WUPS 0x00001000 + #define PMT_CTL_MAC_SRST 0x00000800 + #define PMT_CTL_PHY_PWRUP 0x00000400 + #define PMT_CTL_RES_CLR_WKP_MASK 0x00000300 + #define PMT_CTL_RES_CLR_WKP_STS 0x00000200 + #define PMT_CTL_RES_CLR_WKP_EN 0x00000100 + #define PMT_CTL_READY 0x00000080 + #define PMT_CTL_SUS_MODE_MASK 0x00000060 + #define PMT_CTL_SUS_MODE_0 0x00000000 + #define PMT_CTL_SUS_MODE_1 0x00000020 + #define PMT_CTL_SUS_MODE_2 0x00000040 + #define PMT_CTL_SUS_MODE_3 0x00000060 + #define PMT_CTL_PHY_RST 0x00000010 + #define PMT_CTL_WOL_EN 0x00000008 + #define PMT_CTL_PHY_WAKE_EN 0x00000004 + #define PMT_CTL_WUPS_MASK 0x00000003 + #define PMT_CTL_WUPS_MLT 0x00000003 + #define PMT_CTL_WUPS_MAC 0x00000002 + #define PMT_CTL_WUPS_PHY 0x00000001 +#define USB_CFG0 0x080 + #define USB_CFG_BIR 0x00000040 + #define USB_CFG_BCE 0x00000020 +#define BURST_CAP 0x090 + #define BURST_CAP_SIZE_MASK_ 0x000000FF +#define BULK_IN_DLY 0x094 + #define BULK_IN_DLY_MASK_ 0x0000FFFF +#define INT_EP_CTL 0x098 + #define INT_EP_INTEP_ON 0x80000000 + #define INT_STS_EEE_TX_LPI_STRT_EN 0x04000000 + #define INT_STS_EEE_TX_LPI_STOP_EN 0x02000000 + #define INT_STS_EEE_RX_LPI_EN 0x01000000 + #define INT_EP_RDFO_EN 0x00400000 + #define INT_EP_TXE_EN 0x00200000 + #define INT_EP_TX_DIS_EN 0x00080000 + #define INT_EP_RX_DIS_EN 0x00040000 + #define INT_EP_PHY_INT_EN 0x00020000 + #define INT_EP_DP_INT_EN 0x00010000 + #define INT_EP_MAC_ERR_EN 0x00008000 + #define INT_EP_TDFU_EN 0x00004000 + #define INT_EP_TDFO_EN 0x00002000 + #define INT_EP_UTX_FP_EN 0x00001000 + #define INT_EP_GPIO_EN_MASK 0x00000FFF +#define RFE_CTL 0x0B0 + #define RFE_CTL_IGMP_COE 0x00004000 + #define RFE_CTL_ICMP_COE 0x00002000 + #define RFE_CTL_TCPUDP_COE 0x00001000 + #define RFE_CTL_IP_COE 0x00000800 + #define RFE_CTL_BCAST_EN 0x00000400 + #define RFE_CTL_MCAST_EN 0x00000200 + #define RFE_CTL_UCAST_EN 0x00000100 + #define RFE_CTL_VLAN_STRIP 0x00000080 + #define RFE_CTL_DISCARD_UNTAGGED 0x00000040 + #define RFE_CTL_VLAN_FILTER 0x00000020 + #define RFE_CTL_SA_FILTER 0x00000010 + #define RFE_CTL_MCAST_HASH 0x00000008 + #define RFE_CTL_DA_HASH 0x00000004 + #define RFE_CTL_DA_PERFECT 0x00000002 + #define RFE_CTL_RST 0x00000001 +#define FCT_RX_CTL 0x0C0 + #define FCT_RX_CTL_EN 0x80000000 + #define FCT_RX_CTL_RST 0x40000000 + #define FCT_RX_CTL_SBF 0x02000000 + #define FCT_RX_CTL_OVFL 0x01000000 + #define FCT_RX_CTL_DROP 0x00800000 + #define FCT_RX_CTL_NOT_EMPTY 0x00400000 + #define FCT_RX_CTL_EMPTY 0x00200000 + #define FCT_RX_CTL_DIS 0x00100000 + #define FCT_RX_CTL_USED_MASK 0x0000FFFF +#define FCT_TX_CTL 0x0C4 + #define FCT_TX_CTL_EN 0x80000000 + #define FCT_TX_CTL_RST 0x40000000 + #define FCT_TX_CTL_NOT_EMPTY 0x00400000 + #define FCT_TX_CTL_EMPTY 0x00200000 + #define FCT_TX_CTL_DIS 0x00100000 + #define FCT_TX_CTL_USED_MASK 0x0000FFFF +#define FCT_RX_FIFO_END 0x0C8 + #define FCT_RX_FIFO_END_MASK 0x0000007F +#define FCT_TX_FIFO_END 0x0CC + #define FCT_TX_FIFO_END_MASK 0x0000003F +#define FCT_FLOW 0x0D0 +#define MAC_CR 0x100 + #define MAC_CR_GMII_EN 0x00080000 + #define MAC_CR_EEE_TX_CLK_STOP_EN 0x00040000 + #define MAC_CR_EEE_EN 0x00020000 + #define MAC_CR_EEE_TLAR_EN 0x00010000 + #define MAC_CR_ADP 0x00002000 + #define MAC_CR_AUTO_DUPLEX 0x00001000 + #define MAC_CR_AUTO_SPEED 0x00000800 + #define MAC_CR_LOOPBACK 0x00000400 + #define MAC_CR_BOLMT_MASK 0x000000C0 + #define MAC_CR_FULL_DUPLEX 0x00000008 + #define MAC_CR_SPEED_MASK 0x00000006 + #define MAC_CR_SPEED_1000 0x00000004 + #define MAC_CR_SPEED_100 0x00000002 + #define MAC_CR_SPEED_10 0x00000000 + #define MAC_CR_RST 0x00000001 +#define MAC_RX 0x104 + #define MAC_RX_MAX_SIZE_SHIFT 16 + #define MAC_RX_MAX_SIZE_MASK 0x3FFF0000 + #define MAC_RX_FCS_STRIP 0x00000010 + #define MAC_RX_VLAN_FSE 0x00000004 + #define MAC_RX_RXD 0x00000002 + #define MAC_RX_RXEN 0x00000001 +#define MAC_TX 0x108 + #define MAC_TX_BAD_FCS 0x00000004 + #define MAC_TX_TXD 0x00000002 + #define MAC_TX_TXEN 0x00000001 +#define FLOW 0x10C +#define RX_ADDRH 0x118 + #define RX_ADDRH_MASK_ 0x0000FFFF +#define RX_ADDRL 0x11C + #define RX_ADDRL_MASK_ 0xFFFFFFFF +#define MII_ACC 0x120 + #define MII_ACC_PHY_ADDR_SHIFT 11 + #define MII_ACC_PHY_ADDR_MASK 0x0000F800 + #define PHY_ADDRESS 1 + #define MII_ACC_MIIRINDA_SHIFT 6 + #define MII_ACC_MIIRINDA_MASK 0x000007C0 + #define MII_ACC_MII_READ 0x00000000 + #define MII_ACC_MII_WRITE 0x00000002 + #define MII_ACC_MII_BUSY 0x00000001 +#define MII_DATA 0x124 + #define MII_DATA_MASK 0x0000FFFF +#define MAF_BASE 0x400 + #define MAF_HIX 0x00 + #define MAF_LOX 0x04 + #define NUM_OF_MAF 33 + #define MAF_HI_BEGIN (MAF_BASE + MAF_HIX) + #define MAF_LO_BEGIN (MAF_BASE + MAF_LOX) + #define MAF_HI(index) (MAF_BASE + (8 * (index)) + (MAF_HIX)) + #define MAF_LO(index) (MAF_BASE + (8 * (index)) + (MAF_LOX)) + #define MAF_HI_VALID 0x80000000 + #define MAF_HI_TYPE_MASK 0x40000000 + #define MAF_HI_TYPE_SRC 0x40000000 + #define MAF_HI_TYPE_DST 0x00000000 + #define MAF_HI_ADDR_MASK 0x0000FFFF + #define MAF_LO_ADDR_MASK 0xFFFFFFFF + +// TX command A +#define TX_CMD_A_FCS 0x00400000 +#define TX_CMD_A_LEN_MASK 0x000FFFFF + +// RX command A +#define RX_CMD_A_RED 0x00400000 +#define RX_CMD_A_LEN_MASK 0x00003FFF + +boolean LAN7800DeviceInitMACAddress (TLAN7800Device *pThis); +boolean LAN7800DeviceInitPHY (TLAN7800Device *pThis); + +boolean LAN7800DevicePHYWrite (TLAN7800Device *pThis, u8 uchIndex, u16 usValue); +boolean LAN7800DevicePHYRead (TLAN7800Device *pThis, u8 uchIndex, u16 *pValue); + +boolean LAN7800DeviceWaitReg (TLAN7800Device *pThis, u32 nIndex, u32 nMask, u32 nCompare); + +boolean LAN7800DeviceReadWriteReg (TLAN7800Device *pThis, u32 nIndex, u32 nOrMask, u32 nAndMask); +boolean LAN7800DeviceWriteReg (TLAN7800Device *pThis, u32 nIndex, u32 nValue); +boolean LAN7800DeviceReadReg (TLAN7800Device *pThis, u32 nIndex, u32 *pValue); + +static const char FromLAN7800[] = "lan7800"; + +// starting at 10, to be sure to not collide with smsc951x driver +static unsigned s_nDeviceNumber = 10; + +void LAN7800Device (TLAN7800Device *pThis, TUSBDevice *pDevice) +{ + assert (pThis != 0); + + USBDeviceCopy (&pThis->m_USBDevice, pDevice); + pThis->m_USBDevice.Configure = LAN7800DeviceConfigure; + + pThis->m_pEndpointBulkIn = 0; + pThis->m_pEndpointBulkOut = 0; + pThis->m_pTxBuffer = 0; + + pThis->m_pTxBuffer = malloc (FRAME_BUFFER_SIZE); + assert (pThis->m_pTxBuffer != 0); +} + +void _LAN7800Device (TLAN7800Device *pThis) +{ + assert (pThis != 0); + + if (pThis->m_pTxBuffer != 0) + { + free (pThis->m_pTxBuffer); + pThis->m_pTxBuffer = 0; + } + + if (pThis->m_pEndpointBulkOut != 0) + { + _USBEndpoint (pThis->m_pEndpointBulkOut); + free (pThis->m_pEndpointBulkOut); + pThis->m_pEndpointBulkOut = 0; + } + + if (pThis->m_pEndpointBulkIn != 0) + { + _USBEndpoint (pThis->m_pEndpointBulkIn); + free (pThis->m_pEndpointBulkIn); + pThis->m_pEndpointBulkIn = 0; + } + + _USBDevice (&pThis->m_USBDevice); +} + +boolean LAN7800DeviceConfigure (TUSBDevice *pUSBDevice) +{ + TLAN7800Device *pThis = (TLAN7800Device *) pUSBDevice; + assert (pThis != 0); + + // check USB configuration + + const TUSBConfigurationDescriptor *pConfigDesc = + (TUSBConfigurationDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_CONFIGURATION); + if ( pConfigDesc == 0 + || pConfigDesc->bNumInterfaces != 1) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromLAN7800); + + return FALSE; + } + + const TUSBInterfaceDescriptor *pInterfaceDesc = + (TUSBInterfaceDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_INTERFACE); + if ( pInterfaceDesc == 0 + || pInterfaceDesc->bInterfaceNumber != 0x00 + || pInterfaceDesc->bAlternateSetting != 0x00 + || pInterfaceDesc->bNumEndpoints != 3) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromLAN7800); + + return FALSE; + } + + const TUSBEndpointDescriptor *pEndpointDesc; + while ((pEndpointDesc = (TUSBEndpointDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_ENDPOINT)) != 0) + { + if ((pEndpointDesc->bmAttributes & 0x3F) == 0x02) // Bulk + { + if ((pEndpointDesc->bEndpointAddress & 0x80) == 0x80) // Input + { + if (pThis->m_pEndpointBulkIn != 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromLAN7800); + + return FALSE; + } + + pThis->m_pEndpointBulkIn = (TUSBEndpoint *) malloc (sizeof (TUSBEndpoint)); + assert (pThis->m_pEndpointBulkIn); + USBEndpoint2 (pThis->m_pEndpointBulkIn, &pThis->m_USBDevice, pEndpointDesc); + } + else // Output + { + if (pThis->m_pEndpointBulkOut != 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromLAN7800); + + return FALSE; + } + + pThis->m_pEndpointBulkOut = (TUSBEndpoint *) malloc (sizeof (TUSBEndpoint)); + assert (pThis->m_pEndpointBulkOut); + USBEndpoint2 (pThis->m_pEndpointBulkOut, &pThis->m_USBDevice, pEndpointDesc); + } + } + } + + if ( pThis->m_pEndpointBulkIn == 0 + || pThis->m_pEndpointBulkOut == 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromLAN7800); + + return FALSE; + } + + if (!USBDeviceConfigure (&pThis->m_USBDevice)) + { + LogWrite (FromLAN7800, LOG_ERROR, "Cannot set configuration"); + + return FALSE; + } + + // check chip ID + + u32 nValue; + if ( !LAN7800DeviceReadReg (pThis, ID_REV, &nValue) + || (nValue & ID_REV_CHIP_ID_MASK) >> 16 != ID_REV_CHIP_ID_7800) + { + LogWrite (FromLAN7800, LOG_ERROR, "Invalid chip ID (0x%X)", + (nValue & ID_REV_CHIP_ID_MASK) >> 16); + + return FALSE; + } + + // init hardware + + // HW reset + if ( !LAN7800DeviceReadWriteReg (pThis, HW_CFG, HW_CFG_LRST, ~0U) + || !LAN7800DeviceWaitReg (pThis, HW_CFG, HW_CFG_LRST, 0)) + { + LogWrite (FromLAN7800, LOG_ERROR, "HW reset failed"); + + return FALSE; + } + + if (!LAN7800DeviceInitMACAddress (pThis)) + { + LogWrite (FromLAN7800, LOG_ERROR, "Cannot init MAC address"); + + return FALSE; + } + + // for USB high speed + if ( !LAN7800DeviceWriteReg (pThis, BURST_CAP, DEFAULT_BURST_CAP_SIZE / HS_USB_PKT_SIZE) + || !LAN7800DeviceWriteReg (pThis, BULK_IN_DLY, DEFAULT_BULK_IN_DELAY)) + { + return FALSE; + } + + // enable the LEDs and SEF mode + if (!LAN7800DeviceReadWriteReg (pThis, HW_CFG, HW_CFG_LED0_EN | HW_CFG_LED1_EN, ~HW_CFG_MEF)) + { + return FALSE; + } + + // enable burst CAP, disable NAK on RX FIFO empty + if (!LAN7800DeviceReadWriteReg (pThis, USB_CFG0, USB_CFG_BCE, ~USB_CFG_BIR)) + { + return FALSE; + } + + // set FIFO sizes + if ( !LAN7800DeviceWriteReg (pThis, FCT_RX_FIFO_END, (MAX_RX_FIFO_SIZE - 512) / 512) + || !LAN7800DeviceWriteReg (pThis, FCT_TX_FIFO_END, (MAX_TX_FIFO_SIZE - 512) / 512)) + { + return FALSE; + } + + // interrupt EP is not used + if ( !LAN7800DeviceWriteReg (pThis, INT_EP_CTL, 0) + || !LAN7800DeviceWriteReg (pThis, INT_STS, INT_STS_CLEAR_ALL)) + { + return FALSE; + } + + // disable flow control + if ( !LAN7800DeviceWriteReg (pThis, FLOW, 0) + || !LAN7800DeviceWriteReg (pThis, FCT_FLOW, 0)) + { + return FALSE; + } + + // init receive filtering engine + if (!LAN7800DeviceReadWriteReg (pThis, RFE_CTL, RFE_CTL_BCAST_EN | RFE_CTL_DA_PERFECT, ~0U)) + { + return FALSE; + } + + // PHY reset + if ( !LAN7800DeviceReadWriteReg (pThis, PMT_CTL, PMT_CTL_PHY_RST, ~0U) + || !LAN7800DeviceWaitReg (pThis, PMT_CTL, PMT_CTL_PHY_RST | PMT_CTL_READY, PMT_CTL_READY)) + { + LogWrite (FromLAN7800, LOG_ERROR, "PHY reset failed"); + + return FALSE; + } + + // enable AUTO negotiation + if (!LAN7800DeviceReadWriteReg (pThis, MAC_CR, MAC_CR_AUTO_DUPLEX | MAC_CR_AUTO_SPEED, ~0U)) + { + return FALSE; + } + + // enable TX + if ( !LAN7800DeviceReadWriteReg (pThis, MAC_TX, MAC_TX_TXEN, ~0U) + || !LAN7800DeviceReadWriteReg (pThis, FCT_TX_CTL, FCT_TX_CTL_EN, ~0U)) + { + return FALSE; + } + + // enable RX + if ( !LAN7800DeviceReadWriteReg (pThis, MAC_RX, + (MAX_RX_FRAME_SIZE << MAC_RX_MAX_SIZE_SHIFT) | MAC_RX_RXEN, + ~MAC_RX_MAX_SIZE_MASK) + || !LAN7800DeviceReadWriteReg (pThis, FCT_RX_CTL, FCT_RX_CTL_EN, ~0U)) + + { + return FALSE; + } + + if (!LAN7800DeviceInitPHY (pThis)) + { + LogWrite (FromLAN7800, LOG_ERROR, "Cannot init PHY"); + + return FALSE; + } + + TString DeviceName; + String (&DeviceName); + StringFormat (&DeviceName, "eth%u", s_nDeviceNumber++); + DeviceNameServiceAddDevice (DeviceNameServiceGet (), StringGet (&DeviceName), pThis, FALSE); + + _String (&DeviceName); + + return TRUE; +} + +TMACAddress *LAN7800DeviceGetMACAddress (TLAN7800Device *pThis) +{ + assert (pThis != 0); + + return &pThis->m_MACAddress; +} + +boolean LAN7800DeviceSendFrame (TLAN7800Device *pThis, const void *pBuffer, unsigned nLength) +{ + assert (pThis != 0); + + if (nLength > FRAME_BUFFER_SIZE-TX_HEADER_SIZE) + { + return FALSE; + } + + assert (pThis->m_pTxBuffer != 0); + assert (pBuffer != 0); + memcpy (pThis->m_pTxBuffer+TX_HEADER_SIZE, pBuffer, nLength); + + *(u32 *) &pThis->m_pTxBuffer[0] = (nLength & TX_CMD_A_LEN_MASK) | TX_CMD_A_FCS; + *(u32 *) &pThis->m_pTxBuffer[4] = 0; + + assert (pThis->m_pEndpointBulkOut != 0); + return DWHCIDeviceTransfer (USBDeviceGetHost (&pThis->m_USBDevice), pThis->m_pEndpointBulkOut, + pThis->m_pTxBuffer, nLength+TX_HEADER_SIZE) >= 0; +} + +boolean LAN7800DeviceReceiveFrame (TLAN7800Device *pThis, void *pBuffer, unsigned *pResultLength) +{ + assert (pThis != 0); + + assert (pThis->m_pEndpointBulkIn != 0); + assert (pBuffer != 0); + TUSBRequest URB; + USBRequest (&URB, pThis->m_pEndpointBulkIn, pBuffer, FRAME_BUFFER_SIZE, 0); + + if (!DWHCIDeviceSubmitBlockingRequest (USBDeviceGetHost (&pThis->m_USBDevice), &URB)) + { + _USBRequest (&URB); + + return FALSE; + } + + u32 nResultLength = USBRequestGetResultLength (&URB); + if (nResultLength < RX_HEADER_SIZE) + { + _USBRequest (&URB); + + return FALSE; + } + + u32 nRxStatus = *(u32 *) pBuffer; // RX command A + if (nRxStatus & RX_CMD_A_RED) + { + LogWrite (FromLAN7800, LOG_WARNING, "RX error (status 0x%X)", nRxStatus); + + _USBRequest (&URB); + + return FALSE; + } + + u32 nFrameLength = nRxStatus & RX_CMD_A_LEN_MASK; + assert (nFrameLength == nResultLength-RX_HEADER_SIZE); + assert (nFrameLength > 4); + if (nFrameLength <= 4) + { + _USBRequest (&URB); + + return FALSE; + } + nFrameLength -= 4; // ignore FCS + + //LogWrite (FromLAN7800, LOG_DEBUG, "Frame received (status 0x%X)", nRxStatus); + + memcpy (pBuffer, (u8 *) pBuffer + RX_HEADER_SIZE, nFrameLength); // overwrite RX command A..C + + assert (pResultLength != 0); + *pResultLength = nFrameLength; + + _USBRequest (&URB); + + return TRUE; +} + +boolean LAN7800DeviceIsLinkUp (TLAN7800Device *pThis) +{ + assert (pThis != 0); + + u16 usPHYModeStatus; + if (!LAN7800DevicePHYRead (pThis, 0x01, &usPHYModeStatus)) + { + return FALSE; + } + + return usPHYModeStatus & (1 << 2) ? TRUE : FALSE; +} + +boolean LAN7800DeviceInitMACAddress (TLAN7800Device *pThis) +{ + assert (pThis != 0); + + u8 MACAddress[MAC_ADDRESS_SIZE]; + if (!GetMACAddress (MACAddress)) + { + return FALSE; + } + + MACAddressSet (&pThis->m_MACAddress, MACAddress); + + u32 nMACAddressLow = (u32) MACAddress[0] + | ((u32) MACAddress[1] << 8) + | ((u32) MACAddress[2] << 16) + | ((u32) MACAddress[3] << 24); + u32 nMACAddressHigh = (u32) MACAddress[4] + | ((u32) MACAddress[5] << 8); + + if ( !LAN7800DeviceWriteReg (pThis, RX_ADDRL, nMACAddressLow) + || !LAN7800DeviceWriteReg (pThis, RX_ADDRH, nMACAddressHigh)) + { + return FALSE; + } + + // set perfect filter entry for own MAC address + if ( !LAN7800DeviceWriteReg (pThis, MAF_LO (0), nMACAddressLow) + || !LAN7800DeviceWriteReg (pThis, MAF_HI (0), nMACAddressHigh | MAF_HI_VALID)) + { + return FALSE; + } + + TString MACString; + String (&MACString); + MACAddressFormat (&pThis->m_MACAddress, &MACString); + LogWrite (FromLAN7800, LOG_DEBUG, "MAC address is %s", StringGet (&MACString)); + + _String (&MACString); + + return TRUE; +} + +boolean LAN7800DeviceInitPHY (TLAN7800Device *pThis) +{ + assert (pThis != 0); + + // Change LED defaults: + // orange = link1000/activity + // green = link10/link100/activity + // led: 0=link/activity 1=link1000/activity + // 2=link100/activity 3=link10/activity + // 4=link100/1000/activity 5=link10/1000/activity + // 6=link10/100/activity 14=off 15=on + u16 usLEDModeSel; + if (!LAN7800DevicePHYRead (pThis, 0x1D, &usLEDModeSel)) + { + return FALSE; + } + + usLEDModeSel &= ~0xFF; + usLEDModeSel |= 1 << 0; + usLEDModeSel |= 6 << 4; + + return LAN7800DevicePHYWrite (pThis, 0x1D, usLEDModeSel); +} + +boolean LAN7800DevicePHYWrite (TLAN7800Device *pThis, u8 uchIndex, u16 usValue) +{ + assert (pThis != 0); + assert (uchIndex <= 30); + + if ( !LAN7800DeviceWaitReg (pThis, MII_ACC, MII_ACC_MII_BUSY, 0) + || !LAN7800DeviceWriteReg (pThis, MII_DATA, usValue)) + { + return FALSE; + } + + // set the address, index & direction (write to PHY) + u32 nMIIAccess = (PHY_ADDRESS << MII_ACC_PHY_ADDR_SHIFT) & MII_ACC_PHY_ADDR_MASK; + nMIIAccess |= ((u32) uchIndex << MII_ACC_MIIRINDA_SHIFT) & MII_ACC_MIIRINDA_MASK; + nMIIAccess |= MII_ACC_MII_WRITE | MII_ACC_MII_BUSY; + + if (!LAN7800DeviceWriteReg (pThis, MII_ACC, nMIIAccess)) + { + return FALSE; + } + + return LAN7800DeviceWaitReg (pThis, MII_ACC, MII_ACC_MII_BUSY, 0); +} + +boolean LAN7800DevicePHYRead (TLAN7800Device *pThis, u8 uchIndex, u16 *pValue) +{ + assert (pThis != 0); + assert (uchIndex <= 30); + + if (!LAN7800DeviceWaitReg (pThis, MII_ACC, MII_ACC_MII_BUSY, 0)) + { + return FALSE; + } + + // set the address, index & direction (read from PHY) + u32 nMIIAccess = (PHY_ADDRESS << MII_ACC_PHY_ADDR_SHIFT) & MII_ACC_PHY_ADDR_MASK; + nMIIAccess |= ((u32) uchIndex << MII_ACC_MIIRINDA_SHIFT) & MII_ACC_MIIRINDA_MASK; + nMIIAccess |= MII_ACC_MII_READ | MII_ACC_MII_BUSY; + + u32 nValue; + if ( !LAN7800DeviceWriteReg (pThis, MII_ACC, nMIIAccess) + || !LAN7800DeviceWaitReg (pThis, MII_ACC, MII_ACC_MII_BUSY, 0) + || !LAN7800DeviceReadReg (pThis, MII_DATA, &nValue)) + { + return FALSE; + } + + assert (pValue != 0); + *pValue = nValue & MII_DATA_MASK; + + return TRUE; +} + +// wait until register 'nIndex' has value 'nCompare' with mask 'nMask' applied, +// check the register each millisecond, timeout after one second +boolean LAN7800DeviceWaitReg (TLAN7800Device *pThis, u32 nIndex, u32 nMask, u32 nCompare) +{ + assert (pThis != 0); + + unsigned nTries = 1000; + u32 nValue; + do + { + MsDelay (1); + + if (--nTries == 0) + { + return FALSE; + } + + if (!LAN7800DeviceReadReg (pThis, nIndex, &nValue)) + { + return FALSE; + } + } + while ((nValue & nMask) != nCompare); + + return TRUE; +} + +boolean LAN7800DeviceReadWriteReg (TLAN7800Device *pThis, u32 nIndex, u32 nOrMask, u32 nAndMask) +{ + assert (pThis != 0); + + u32 nValue; + if (!LAN7800DeviceReadReg (pThis, nIndex, &nValue)) + { + return FALSE; + } + + nValue &= nAndMask; + nValue |= nOrMask; + + return LAN7800DeviceWriteReg (pThis, nIndex, nValue); +} + +boolean LAN7800DeviceWriteReg (TLAN7800Device *pThis, u32 nIndex, u32 nValue) +{ + assert (pThis != 0); + + if (DWHCIDeviceControlMessage (USBDeviceGetHost (&pThis->m_USBDevice), + USBDeviceGetEndpoint0 (&pThis->m_USBDevice), + REQUEST_OUT | REQUEST_VENDOR, WRITE_REGISTER, + 0, nIndex, &nValue, sizeof nValue) < 0) + { + LogWrite (FromLAN7800, LOG_WARNING, "Cannot write register 0x%X", nIndex); + + return FALSE; + } + + return TRUE; +} + +boolean LAN7800DeviceReadReg (TLAN7800Device *pThis, u32 nIndex, u32 *pValue) +{ + assert (pThis != 0); + + if (DWHCIDeviceControlMessage (USBDeviceGetHost (&pThis->m_USBDevice), + USBDeviceGetEndpoint0 (&pThis->m_USBDevice), + REQUEST_IN | REQUEST_VENDOR, READ_REGISTER, + 0, nIndex, pValue, sizeof *pValue) != (int) sizeof *pValue) + { + LogWrite (FromLAN7800, LOG_WARNING, "Cannot read register 0x%X", nIndex); + + return FALSE; + } + + return TRUE; +} diff --git a/uspi/lib/macaddress.c b/uspi/lib/macaddress.c new file mode 100644 index 0000000..4d98ada --- /dev/null +++ b/uspi/lib/macaddress.c @@ -0,0 +1,118 @@ +// +// macaddress.h +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include + +void MACAddress (TMACAddress *pThis) +{ + assert (pThis != 0); + + pThis->m_bValid = FALSE; +} + +void MACAddress2 (TMACAddress *pThis, const u8 *pAddress) +{ + assert (pThis != 0); + + MACAddressSet (pThis, pAddress); +} + +void _MACAddress (TMACAddress *pThis) +{ + assert (pThis != 0); + + pThis->m_bValid = FALSE; +} + +boolean MACAddressIsEqual (TMACAddress *pThis, TMACAddress *pAddress2) +{ + assert (pThis != 0); + assert (pThis->m_bValid); + + return memcmp (pThis->m_Address, MACAddressGet (pAddress2), MAC_ADDRESS_SIZE) == 0 ? TRUE : FALSE; +} + +void MACAddressSet (TMACAddress *pThis, const u8 *pAddress) +{ + assert (pThis != 0); + assert (pAddress != 0); + + memcpy (pThis->m_Address, pAddress, MAC_ADDRESS_SIZE); + pThis->m_bValid = TRUE; +} + +void MACAddressSetBroadcast (TMACAddress *pThis) +{ + assert (pThis != 0); + + memset (pThis->m_Address, 0xFF, MAC_ADDRESS_SIZE); + pThis->m_bValid = TRUE; +} + +const u8 *MACAddressGet (TMACAddress *pThis) +{ + assert (pThis != 0); + assert (pThis->m_bValid); + + return pThis->m_Address; +} + +void MACAddressCopyTo (TMACAddress *pThis, u8 *pBuffer) +{ + assert (pThis != 0); + assert (pThis->m_bValid); + assert (pBuffer != 0); + + memcpy (pBuffer, pThis->m_Address, MAC_ADDRESS_SIZE); +} + +boolean MACAddressIsBroadcast (TMACAddress *pThis) +{ + assert (pThis != 0); + assert (pThis->m_bValid); + + for (unsigned i = 0; i < MAC_ADDRESS_SIZE; i++) + { + if (pThis->m_Address[i] != 0xFF) + { + return FALSE; + } + } + + return TRUE; +} + +unsigned MACAddressGetSize (TMACAddress *pThis) +{ + return MAC_ADDRESS_SIZE; +} + +void MACAddressFormat (TMACAddress *pThis, TString *pString) +{ + assert (pThis != 0); + assert (pThis->m_bValid); + + assert (pString != 0); + StringFormat (pString, "%02X:%02X:%02X:%02X:%02X:%02X", + (unsigned) pThis->m_Address[0], (unsigned) pThis->m_Address[1], + (unsigned) pThis->m_Address[2], (unsigned) pThis->m_Address[3], + (unsigned) pThis->m_Address[4], (unsigned) pThis->m_Address[5]); +} diff --git a/uspi/lib/smsc951x.c b/uspi/lib/smsc951x.c new file mode 100644 index 0000000..22543b0 --- /dev/null +++ b/uspi/lib/smsc951x.c @@ -0,0 +1,474 @@ +// +// smsc951x.c +// +// Information to implement this driver was taken +// from the Linux smsc95xx driver which is: +// Copyright (C) 2007-2008 SMSC +// and the Embedded Xinu SMSC LAN9512 USB driver which is: +// Copyright (c) 2008, Douglas Comer and Dennis Brylow +// See the file lib/README for details! +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014-2016 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include +#include +#include + +// USB vendor requests +#define WRITE_REGISTER 0xA0 +#define READ_REGISTER 0xA1 + +// Registers +#define ID_REV 0x00 +#define INT_STS 0x08 +#define RX_CFG 0x0C +#define TX_CFG 0x10 + #define TX_CFG_ON 0x00000004 +#define HW_CFG 0x14 + #define HW_CFG_BIR 0x00001000 +#define RX_FIFO_INF 0x18 +#define PM_CTRL 0x20 +#define LED_GPIO_CFG 0x24 + #define LED_GPIO_CFG_SPD_LED 0x01000000 + #define LED_GPIO_CFG_LNK_LED 0x00100000 + #define LED_GPIO_CFG_FDX_LED 0x00010000 +#define GPIO_CFG 0x28 +#define AFC_CFG 0x2C +#define E2P_CMD 0x30 +#define E2P_DATA 0x34 +#define BURST_CAP 0x38 +#define GPIO_WAKE 0x64 +#define INT_EP_CTL 0x68 +#define BULK_IN_DLY 0x6C +#define MAC_CR 0x100 + #define MAC_CR_RCVOWN 0x00800000 + #define MAC_CR_MCPAS 0x00080000 + #define MAC_CR_PRMS 0x00040000 + #define MAC_CR_BCAST 0x00000800 + #define MAC_CR_TXEN 0x00000008 + #define MAC_CR_RXEN 0x00000004 +#define ADDRH 0x104 +#define ADDRL 0x108 +#define HASHH 0x10C +#define HASHL 0x110 +#define MII_ADDR 0x114 + #define MII_BUSY 0x01 + #define MII_WRITE 0x02 + #define PHY_ID_MASK 0x1F + #define PHY_ID_INTERNAL 0x01 + #define REG_NUM_MASK 0x1F +#define MII_DATA 0x118 +#define FLOW 0x11C +#define VLAN1 0x120 +#define VLAN2 0x124 +#define WUFF 0x128 +#define WUCSR 0x12C +#define COE_CR 0x130 + +// TX commands (first two 32-bit words in buffer) +#define TX_CMD_A_DATA_OFFSET 0x001F0000 +#define TX_CMD_A_FIRST_SEG 0x00002000 +#define TX_CMD_A_LAST_SEG 0x00001000 +#define TX_CMD_A_BUF_SIZE 0x000007FF + +#define TX_CMD_B_CSUM_ENABLE 0x00004000 +#define TX_CMD_B_ADD_CRC_DISABLE 0x00002000 +#define TX_CMD_B_DISABLE_PADDING 0x00001000 +#define TX_CMD_B_PKT_BYTE_LENGTH 0x000007FF + +// RX status (first 32-bit word in buffer) +#define RX_STS_FF 0x40000000 // Filter Fail +#define RX_STS_FL 0x3FFF0000 // Frame Length + #define RX_STS_FRAMELEN(reg) (((reg) & RX_STS_FL) >> 16) +#define RX_STS_ES 0x00008000 // Error Summary +#define RX_STS_BF 0x00002000 // Broadcast Frame +#define RX_STS_LE 0x00001000 // Length Error +#define RX_STS_RF 0x00000800 // Runt Frame +#define RX_STS_MF 0x00000400 // Multicast Frame +#define RX_STS_TL 0x00000080 // Frame too long +#define RX_STS_CS 0x00000040 // Collision Seen +#define RX_STS_FT 0x00000020 // Frame Type +#define RX_STS_RW 0x00000010 // Receive Watchdog +#define RX_STS_ME 0x00000008 // Mii Error +#define RX_STS_DB 0x00000004 // Dribbling +#define RX_STS_CRC 0x00000002 // CRC Error + +#define RX_STS_ERROR ( RX_STS_FF \ + | RX_STS_ES \ + | RX_STS_LE \ + | RX_STS_TL \ + | RX_STS_CS \ + | RX_STS_RW \ + | RX_STS_ME \ + | RX_STS_DB \ + | RX_STS_CRC) + +static const char FromSMSC951x[] = "smsc951x"; + +static unsigned s_nDeviceNumber = 0; + +boolean SMSC951xDeviceWriteReg (TSMSC951xDevice *pThis, u32 nIndex, u32 nValue); +boolean SMSC951xDeviceReadReg (TSMSC951xDevice *pThis, u32 nIndex, u32 *pValue); +#ifndef NDEBUG +void SMSC951xDeviceDumpReg (TSMSC951xDevice *pThis, const char *pName, u32 nIndex); +void SMSC951xDeviceDumpRegs (TSMSC951xDevice *pThis); +#endif + +void SMSC951xDevice (TSMSC951xDevice *pThis, TUSBDevice *pDevice) +{ + assert (pThis != 0); + + USBDeviceCopy (&pThis->m_USBDevice, pDevice); + pThis->m_USBDevice.Configure = SMSC951xDeviceConfigure; + + pThis->m_pEndpointBulkIn = 0; + pThis->m_pEndpointBulkOut = 0; + pThis->m_pTxBuffer = 0; + + pThis->m_pTxBuffer = malloc (FRAME_BUFFER_SIZE); + assert (pThis->m_pTxBuffer != 0); +} + +void _SMSC951xDevice (TSMSC951xDevice *pThis) +{ + assert (pThis != 0); + + if (pThis->m_pTxBuffer != 0) + { + free (pThis->m_pTxBuffer); + pThis->m_pTxBuffer = 0; + } + + if (pThis->m_pEndpointBulkOut != 0) + { + _USBEndpoint (pThis->m_pEndpointBulkOut); + free (pThis->m_pEndpointBulkOut); + pThis->m_pEndpointBulkOut = 0; + } + + if (pThis->m_pEndpointBulkIn != 0) + { + _USBEndpoint (pThis->m_pEndpointBulkIn); + free (pThis->m_pEndpointBulkIn); + pThis->m_pEndpointBulkIn = 0; + } + + _USBDevice (&pThis->m_USBDevice); +} + +boolean SMSC951xDeviceConfigure (TUSBDevice *pUSBDevice) +{ + TSMSC951xDevice *pThis = (TSMSC951xDevice *) pUSBDevice; + assert (pThis != 0); + + u8 MACAddress[MAC_ADDRESS_SIZE]; + if (GetMACAddress (MACAddress)) + { + MACAddressSet (&pThis->m_MACAddress, MACAddress); + } + else + { + LogWrite (FromSMSC951x, LOG_ERROR, "Cannot get MAC address"); + + return FALSE; + } + TString MACString; + String (&MACString); + MACAddressFormat (&pThis->m_MACAddress, &MACString); + LogWrite (FromSMSC951x, LOG_DEBUG, "MAC address is %s", StringGet (&MACString)); + + const TUSBConfigurationDescriptor *pConfigDesc = + (TUSBConfigurationDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_CONFIGURATION); + if ( pConfigDesc == 0 + || pConfigDesc->bNumInterfaces != 1) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromSMSC951x); + + _String (&MACString); + + return FALSE; + } + + const TUSBInterfaceDescriptor *pInterfaceDesc = + (TUSBInterfaceDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_INTERFACE); + if ( pInterfaceDesc == 0 + || pInterfaceDesc->bInterfaceNumber != 0x00 + || pInterfaceDesc->bAlternateSetting != 0x00 + || pInterfaceDesc->bNumEndpoints != 3) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromSMSC951x); + + _String (&MACString); + + return FALSE; + } + + const TUSBEndpointDescriptor *pEndpointDesc; + while ((pEndpointDesc = (TUSBEndpointDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_ENDPOINT)) != 0) + { + if ((pEndpointDesc->bmAttributes & 0x3F) == 0x02) // Bulk + { + if ((pEndpointDesc->bEndpointAddress & 0x80) == 0x80) // Input + { + if (pThis->m_pEndpointBulkIn != 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromSMSC951x); + + _String (&MACString); + + return FALSE; + } + + pThis->m_pEndpointBulkIn = (TUSBEndpoint *) malloc (sizeof (TUSBEndpoint)); + assert (pThis->m_pEndpointBulkIn); + USBEndpoint2 (pThis->m_pEndpointBulkIn, &pThis->m_USBDevice, pEndpointDesc); + } + else // Output + { + if (pThis->m_pEndpointBulkOut != 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromSMSC951x); + + _String (&MACString); + + return FALSE; + } + + pThis->m_pEndpointBulkOut = (TUSBEndpoint *) malloc (sizeof (TUSBEndpoint)); + assert (pThis->m_pEndpointBulkOut); + USBEndpoint2 (pThis->m_pEndpointBulkOut, &pThis->m_USBDevice, pEndpointDesc); + } + } + } + + if ( pThis->m_pEndpointBulkIn == 0 + || pThis->m_pEndpointBulkOut == 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromSMSC951x); + + _String (&MACString); + + return FALSE; + } + + if (!USBDeviceConfigure (&pThis->m_USBDevice)) + { + LogWrite (FromSMSC951x, LOG_ERROR, "Cannot set configuration"); + + _String (&MACString); + + return FALSE; + } + + u8 MACAddressBuffer[MAC_ADDRESS_SIZE]; + MACAddressCopyTo (&pThis->m_MACAddress, MACAddressBuffer); + u16 usMACAddressHigh = (u16) MACAddressBuffer[4] + | (u16) MACAddressBuffer[5] << 8; + u32 nMACAddressLow = (u32) MACAddressBuffer[0] + | (u32) MACAddressBuffer[1] << 8 + | (u32) MACAddressBuffer[2] << 16 + | (u32) MACAddressBuffer[3] << 24; + if ( !SMSC951xDeviceWriteReg (pThis, ADDRH, usMACAddressHigh) + || !SMSC951xDeviceWriteReg (pThis, ADDRL, nMACAddressLow)) + { + LogWrite (FromSMSC951x, LOG_ERROR, "Cannot set MAC address"); + + _String (&MACString); + + return FALSE; + } + + if ( !SMSC951xDeviceWriteReg (pThis, LED_GPIO_CFG, LED_GPIO_CFG_SPD_LED + | LED_GPIO_CFG_LNK_LED + | LED_GPIO_CFG_FDX_LED) + || !SMSC951xDeviceWriteReg (pThis, MAC_CR, MAC_CR_RCVOWN + //| MAC_CR_PRMS // promiscous mode + | MAC_CR_TXEN + | MAC_CR_RXEN) + || !SMSC951xDeviceWriteReg (pThis, TX_CFG, TX_CFG_ON)) + { + LogWrite (FromSMSC951x, LOG_ERROR, "Cannot start device"); + + _String (&MACString); + + return FALSE; + } + + // TODO: check if PHY is up (wait for it) + + TString DeviceName; + String (&DeviceName); + StringFormat (&DeviceName, "eth%u", s_nDeviceNumber++); + DeviceNameServiceAddDevice (DeviceNameServiceGet (), StringGet (&DeviceName), pThis, FALSE); + + _String (&DeviceName); + _String (&MACString); + + return TRUE; +} + +TMACAddress *SMSC951xDeviceGetMACAddress (TSMSC951xDevice *pThis) +{ + assert (pThis != 0); + + return &pThis->m_MACAddress; +} + +boolean SMSC951xDeviceSendFrame (TSMSC951xDevice *pThis, const void *pBuffer, unsigned nLength) +{ + assert (pThis != 0); + + if (nLength >= FRAME_BUFFER_SIZE-8) + { + return FALSE; + } + + assert (pThis->m_pTxBuffer != 0); + assert (pBuffer != 0); + memcpy (pThis->m_pTxBuffer+8, pBuffer, nLength); + + *(u32 *) &pThis->m_pTxBuffer[0] = TX_CMD_A_FIRST_SEG | TX_CMD_A_LAST_SEG | nLength; + *(u32 *) &pThis->m_pTxBuffer[4] = nLength; + + assert (pThis->m_pEndpointBulkOut != 0); + return DWHCIDeviceTransfer (USBDeviceGetHost (&pThis->m_USBDevice), pThis->m_pEndpointBulkOut, pThis->m_pTxBuffer, nLength+8) >= 0; +} + +boolean SMSC951xDeviceReceiveFrame (TSMSC951xDevice *pThis, void *pBuffer, unsigned *pResultLength) +{ + assert (pThis != 0); + + assert (pThis->m_pEndpointBulkIn != 0); + assert (pBuffer != 0); + TUSBRequest URB; + USBRequest (&URB, pThis->m_pEndpointBulkIn, pBuffer, FRAME_BUFFER_SIZE, 0); + + if (!DWHCIDeviceSubmitBlockingRequest (USBDeviceGetHost (&pThis->m_USBDevice), &URB)) + { + _USBRequest (&URB); + + return FALSE; + } + + u32 nResultLength = USBRequestGetResultLength (&URB); + if (nResultLength < 4) // should not happen with HW_CFG_BIR set + { + _USBRequest (&URB); + + return FALSE; + } + + u32 nRxStatus = *(u32 *) pBuffer; + if (nRxStatus & RX_STS_ERROR) + { + LogWrite (FromSMSC951x, LOG_WARNING, "RX error (status 0x%X)", nRxStatus); + + _USBRequest (&URB); + + return FALSE; + } + + u32 nFrameLength = RX_STS_FRAMELEN (nRxStatus); + assert (nFrameLength == nResultLength-4); + assert (nFrameLength > 4); + if (nFrameLength <= 4) + { + _USBRequest (&URB); + + return FALSE; + } + nFrameLength -= 4; // ignore CRC + + //LogWrite (FromSMSC951x, LOG_DEBUG, "Frame received (status 0x%X)", nRxStatus); + + memcpy (pBuffer, (u8 *) pBuffer + 4, nFrameLength); // overwrite RX status + + assert (pResultLength != 0); + *pResultLength = nFrameLength; + + _USBRequest (&URB); + + return TRUE; +} + +boolean SMSC951xDeviceWriteReg (TSMSC951xDevice *pThis, u32 nIndex, u32 nValue) +{ + assert (pThis != 0); + + return DWHCIDeviceControlMessage (USBDeviceGetHost (&pThis->m_USBDevice), + USBDeviceGetEndpoint0 (&pThis->m_USBDevice), + REQUEST_OUT | REQUEST_VENDOR, WRITE_REGISTER, + 0, nIndex, &nValue, sizeof nValue) >= 0; +} + +boolean SMSC951xDeviceReadReg (TSMSC951xDevice *pThis, u32 nIndex, u32 *pValue) +{ + assert (pThis != 0); + + return DWHCIDeviceControlMessage (USBDeviceGetHost (&pThis->m_USBDevice), + USBDeviceGetEndpoint0 (&pThis->m_USBDevice), + REQUEST_IN | REQUEST_VENDOR, READ_REGISTER, + 0, nIndex, pValue, sizeof *pValue) == (int) sizeof *pValue; +} + +#ifndef NDEBUG + +void SMSC951xDeviceDumpReg (TSMSC951xDevice *pThis, const char *pName, u32 nIndex) +{ + assert (pThis != 0); + + u32 nValue; + if (!SMSC951xDeviceReadReg (pThis, nIndex, &nValue)) + { + LogWrite (FromSMSC951x, LOG_ERROR, "Cannot read register 0x%X", nIndex); + + return; + } + + LogWrite (FromSMSC951x, LOG_DEBUG, "%08X %s", nValue, pName); +} + +void SMSC951xDeviceDumpRegs (TSMSC951xDevice *pThis) +{ + assert (pThis != 0); + + SMSC951xDeviceDumpReg (pThis, "ID_REV", ID_REV); + SMSC951xDeviceDumpReg (pThis, "INT_STS", INT_STS); + SMSC951xDeviceDumpReg (pThis, "RX_CFG", RX_CFG); + SMSC951xDeviceDumpReg (pThis, "TX_CFG", TX_CFG); + SMSC951xDeviceDumpReg (pThis, "HW_CFG", HW_CFG); + SMSC951xDeviceDumpReg (pThis, "RX_FIFO_INF", RX_FIFO_INF); + SMSC951xDeviceDumpReg (pThis, "PM_CTRL", PM_CTRL); + SMSC951xDeviceDumpReg (pThis, "LED_GPIO_CFG", LED_GPIO_CFG); + SMSC951xDeviceDumpReg (pThis, "GPIO_CFG", GPIO_CFG); + SMSC951xDeviceDumpReg (pThis, "AFC_CFG", AFC_CFG); + SMSC951xDeviceDumpReg (pThis, "BURST_CAP", BURST_CAP); + SMSC951xDeviceDumpReg (pThis, "INT_EP_CTL", INT_EP_CTL); + SMSC951xDeviceDumpReg (pThis, "BULK_IN_DLY", BULK_IN_DLY); + SMSC951xDeviceDumpReg (pThis, "MAC_CR", MAC_CR); + SMSC951xDeviceDumpReg (pThis, "ADDRH", ADDRH); + SMSC951xDeviceDumpReg (pThis, "ADDRL", ADDRL); + SMSC951xDeviceDumpReg (pThis, "HASHH", HASHH); + SMSC951xDeviceDumpReg (pThis, "HASHL", HASHL); + SMSC951xDeviceDumpReg (pThis, "FLOW", FLOW); + SMSC951xDeviceDumpReg (pThis, "WUCSR", WUCSR); +} + +#endif diff --git a/uspi/lib/string.c b/uspi/lib/string.c new file mode 100644 index 0000000..efa3937 --- /dev/null +++ b/uspi/lib/string.c @@ -0,0 +1,472 @@ +// +// string.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include + +#define FORMAT_RESERVE 64 // additional bytes to allocate +#define MAX_NUMBER_LEN 11 // 32 bit octal number + +void StringPutChar (TString *pThis, char chChar, size_t nCount /* = 1 */); +void StringPutString (TString *pThis, const char *pString); +void StringReserveSpace (TString *pThis, size_t nSpace); +char *ntoa (char *pDest, unsigned long ulNumber, unsigned nBase, boolean bUpcase); + +void String (TString *pThis) +{ + assert (pThis != 0); + pThis->m_pBuffer = 0; + pThis->m_nSize = 0; +} + +void String2 (TString *pThis, const char *pString) +{ + assert (pThis != 0); + + pThis->m_nSize = strlen (pString)+1; + + pThis->m_pBuffer = (char *) malloc (pThis->m_nSize); + + strcpy (pThis->m_pBuffer, pString); +} + +void _String (TString *pThis) +{ + assert (pThis != 0); + + if (pThis->m_pBuffer != 0) + { + free (pThis->m_pBuffer); + pThis->m_pBuffer = 0; + } +} + +const char *StringGet (TString *pThis) +{ + assert (pThis != 0); + + if (pThis->m_pBuffer != 0) + { + return pThis->m_pBuffer; + } + + return ""; +} + +const char *StringSet (TString *pThis, const char *pString) +{ + assert (pThis != 0); + + if (pThis->m_pBuffer != 0) + { + free (pThis->m_pBuffer); + } + + pThis->m_nSize = strlen (pString)+1; + + pThis->m_pBuffer = (char *) malloc (pThis->m_nSize); + + strcpy (pThis->m_pBuffer, pString); + + return pThis->m_pBuffer; +} + +size_t StringGetLength (TString *pThis) +{ + assert (pThis != 0); + + if (pThis->m_pBuffer == 0) + { + return 0; + } + + return strlen (pThis->m_pBuffer); +} + +void StringAppend (TString *pThis, const char *pString) +{ + assert (pThis != 0); + + pThis->m_nSize = 1; // for terminating '\0' + if (pThis->m_pBuffer != 0) + { + pThis->m_nSize += strlen (pThis->m_pBuffer); + } + pThis->m_nSize += strlen (pString); + + char *pBuffer = (char *) malloc (pThis->m_nSize); + + if (pThis->m_pBuffer != 0) + { + strcpy (pBuffer, pThis->m_pBuffer); + free (pThis->m_pBuffer); + } + else + { + *pBuffer = '\0'; + } + + strcat (pBuffer, pString); + + pThis->m_pBuffer = pBuffer; +} + +int StringCompare (TString *pThis, const char *pString) +{ + assert (pThis != 0); + + return strcmp (pThis->m_pBuffer, pString); +} + +int StringFind (TString *pThis, char chChar) +{ + assert (pThis != 0); + + int nPos = 0; + + char *p; + for (p = pThis->m_pBuffer; *p; p++) + { + if (*p == chChar) + { + return nPos; + } + + nPos++; + } + + return -1; +} + +void StringFormat (TString *pThis, const char *pFormat, ...) +{ + assert (pThis != 0); + + va_list var; + va_start (var, pFormat); + + StringFormatV (pThis, pFormat, var); + + va_end (var); +} + +void StringFormatV (TString *pThis, const char *pFormat, va_list Args) +{ + assert (pThis != 0); + + if (pThis->m_pBuffer != 0) + { + free (pThis->m_pBuffer); + } + + pThis->m_nSize = FORMAT_RESERVE; + pThis->m_pBuffer = (char *) malloc (pThis->m_nSize); + pThis->m_pInPtr = pThis->m_pBuffer; + + while (*pFormat != '\0') + { + if (*pFormat == '%') + { + if (*++pFormat == '%') + { + StringPutChar (pThis, '%', 1); + + pFormat++; + + continue; + } + + boolean bLeft = FALSE; + if (*pFormat == '-') + { + bLeft = TRUE; + + pFormat++; + } + + boolean bNull = FALSE; + if (*pFormat == '0') + { + bNull = TRUE; + + pFormat++; + } + + size_t nWidth = 0; + while ('0' <= *pFormat && *pFormat <= '9') + { + nWidth = nWidth * 10 + (*pFormat - '0'); + + pFormat++; + } + + boolean bLong = FALSE; + if (*pFormat == 'l') + { + bLong = TRUE; + + pFormat++; + } + + char chArg; + const char *pArg; + unsigned long ulArg; + size_t nLen; + unsigned nBase; + char NumBuf[MAX_NUMBER_LEN+1]; + boolean bMinus = FALSE; + long lArg; + + switch (*pFormat) + { + case 'c': + chArg = (char) va_arg (Args, int); + if (bLeft) + { + StringPutChar (pThis, chArg, 1); + if (nWidth > 1) + { + StringPutChar (pThis, ' ', nWidth-1); + } + } + else + { + if (nWidth > 1) + { + StringPutChar (pThis, ' ', nWidth-1); + } + StringPutChar (pThis, chArg, 1); + } + break; + + case 'd': + if (bLong) + { + lArg = va_arg (Args, long); + } + else + { + lArg = va_arg (Args, int); + } + if (lArg < 0) + { + bMinus = TRUE; + lArg = -lArg; + } + ntoa (NumBuf, (unsigned long) lArg, 10, FALSE); + nLen = strlen (NumBuf) + (bMinus ? 1 : 0); + if (bLeft) + { + if (bMinus) + { + StringPutChar (pThis, '-', 1); + } + StringPutString (pThis, NumBuf); + if (nWidth > nLen) + { + StringPutChar (pThis, ' ', nWidth-nLen); + } + } + else + { + if (nWidth > nLen) + { + StringPutChar (pThis, ' ', nWidth-nLen); + } + if (bMinus) + { + StringPutChar (pThis, '-', 1); + } + StringPutString (pThis, NumBuf); + } + break; + + case 'o': + nBase = 8; + goto FormatNumber; + + case 's': + pArg = va_arg (Args, const char *); + nLen = strlen (pArg); + if (bLeft) + { + StringPutString (pThis, pArg); + if (nWidth > nLen) + { + StringPutChar (pThis, ' ', nWidth-nLen); + } + } + else + { + if (nWidth > nLen) + { + StringPutChar (pThis, ' ', nWidth-nLen); + } + StringPutString (pThis, pArg); + } + break; + + case 'u': + nBase = 10; + goto FormatNumber; + + case 'x': + case 'X': + nBase = 16; + goto FormatNumber; + + FormatNumber: + if (bLong) + { + ulArg = va_arg (Args, unsigned long); + } + else + { + ulArg = va_arg (Args, unsigned); + } + ntoa (NumBuf, ulArg, nBase, *pFormat == 'X'); + nLen = strlen (NumBuf); + if (bLeft) + { + StringPutString (pThis, NumBuf); + if (nWidth > nLen) + { + StringPutChar (pThis, ' ', nWidth-nLen); + } + } + else + { + if (nWidth > nLen) + { + StringPutChar (pThis, bNull ? '0' : ' ', nWidth-nLen); + } + StringPutString (pThis, NumBuf); + } + break; + + default: + StringPutChar (pThis, '%', 1); + StringPutChar (pThis, *pFormat, 1); + break; + } + } + else + { + StringPutChar (pThis, *pFormat, 1); + } + + pFormat++; + } + + *pThis->m_pInPtr = '\0'; +} + +void StringPutChar (TString *pThis, char chChar, size_t nCount) +{ + assert (pThis != 0); + + StringReserveSpace (pThis, nCount); + + while (nCount--) + { + *pThis->m_pInPtr++ = chChar; + } +} + +void StringPutString (TString *pThis, const char *pString) +{ + assert (pThis != 0); + + size_t nLen = strlen (pString); + + StringReserveSpace (pThis, nLen); + + strcpy (pThis->m_pInPtr, pString); + + pThis->m_pInPtr += nLen; +} + +void StringReserveSpace (TString *pThis, size_t nSpace) +{ + assert (pThis != 0); + + if (nSpace == 0) + { + return; + } + + size_t nOffset = pThis->m_pInPtr - pThis->m_pBuffer; + size_t nNewSize = nOffset + nSpace + 1; + if (pThis->m_nSize >= nNewSize) + { + return; + } + + nNewSize += FORMAT_RESERVE; + char *pNewBuffer = (char *) malloc (nNewSize); + + *pThis->m_pInPtr = '\0'; + strcpy (pNewBuffer, pThis->m_pBuffer); + + free (pThis->m_pBuffer); + + pThis->m_pBuffer = pNewBuffer; + pThis->m_nSize = nNewSize; + + pThis->m_pInPtr = pThis->m_pBuffer + nOffset; +} + +char *ntoa (char *pDest, unsigned long ulNumber, unsigned nBase, boolean bUpcase) +{ + unsigned long ulDigit; + + unsigned long ulDivisor = 1UL; + while (1) + { + ulDigit = ulNumber / ulDivisor; + if (ulDigit < nBase) + { + break; + } + + ulDivisor *= nBase; + } + + char *p = pDest; + while (1) + { + ulNumber %= ulDivisor; + + *p++ = ulDigit < 10 ? '0' + ulDigit : '0' + ulDigit + 7 + (bUpcase ? 0 : 0x20); + + ulDivisor /= nBase; + if (ulDivisor == 0) + { + break; + } + + ulDigit = ulNumber / ulDivisor; + } + + *p = '\0'; + + return pDest; +} diff --git a/uspi/lib/synchronize.c b/uspi/lib/synchronize.c new file mode 100644 index 0000000..52cad9a --- /dev/null +++ b/uspi/lib/synchronize.c @@ -0,0 +1,128 @@ +// +// synchronize.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014-2015 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include + +#define EnableInterrupts() __asm volatile ("cpsie i") +#define DisableInterrupts() __asm volatile ("cpsid i") + +static volatile unsigned s_nCriticalLevel = 0; +static volatile boolean s_bWereEnabled; + +void uspi_EnterCritical (void) +{ + u32 nFlags; + asm volatile ("mrs %0, cpsr" : "=r" (nFlags)); + + DisableInterrupts (); + + if (s_nCriticalLevel++ == 0) + { + s_bWereEnabled = nFlags & 0x80 ? FALSE : TRUE; + } + + DataMemBarrier (); +} + +void uspi_LeaveCritical (void) +{ + DataMemBarrier (); + + assert (s_nCriticalLevel > 0); + if (--s_nCriticalLevel == 0) + { + if (s_bWereEnabled) + { + EnableInterrupts (); + } + } +} + +#if RASPPI == 1 + +// +// Cache maintenance operations for ARMv6 +// +// NOTE: The following functions should hold all variables in CPU registers. Currently this will be +// ensured using maximum optimation (see circle/synchronize.h). +// +// The following numbers can be determined (dynamically) using CTR. +// As long we use the ARM1176JZF-S implementation in the BCM2835 these static values will work: +// + +#define DATA_CACHE_LINE_LENGTH 32 + +void uspi_CleanAndInvalidateDataCacheRange (u32 nAddress, u32 nLength) +{ + nLength += DATA_CACHE_LINE_LENGTH; + + while (1) + { + asm volatile ("mcr p15, 0, %0, c7, c14, 1" : : "r" (nAddress) : "memory"); + + if (nLength < DATA_CACHE_LINE_LENGTH) + { + break; + } + + nAddress += DATA_CACHE_LINE_LENGTH; + nLength -= DATA_CACHE_LINE_LENGTH; + } +} + +#else + +// +// Cache maintenance operations for ARMv7-A +// +// See: ARMv7-A Architecture Reference Manual, Section B4.2.1 +// +// NOTE: The following functions should hold all variables in CPU registers. Currently this will be +// ensured using the register keyword and maximum optimation (see uspi/synchronize.h). +// +// The following numbers can be determined (dynamically) using CTR, CSSELR, CCSIDR and CLIDR. +// As long we use the Cortex-A7 implementation in the BCM2836 or the Cortex-A53 implementation +// in the BCM2837 these static values will work: +// + +#define L1_DATA_CACHE_LINE_LENGTH 64 +#define L2_CACHE_LINE_LENGTH 64 +#define DATA_CACHE_LINE_LENGTH_MIN 64 // min(L1_DATA_CACHE_LINE_LENGTH, L2_CACHE_LINE_LENGTH) + +void uspi_CleanAndInvalidateDataCacheRange (u32 nAddress, u32 nLength) +{ + nLength += DATA_CACHE_LINE_LENGTH_MIN; + + while (1) + { + __asm volatile ("mcr p15, 0, %0, c7, c14, 1" : : "r" (nAddress) : "memory"); // DCCIMVAC + + if (nLength < DATA_CACHE_LINE_LENGTH_MIN) + { + break; + } + + nAddress += DATA_CACHE_LINE_LENGTH_MIN; + nLength -= DATA_CACHE_LINE_LENGTH_MIN; + } +} + +#endif diff --git a/uspi/lib/usbconfigparser.c b/uspi/lib/usbconfigparser.c new file mode 100644 index 0000000..d5d57e4 --- /dev/null +++ b/uspi/lib/usbconfigparser.c @@ -0,0 +1,189 @@ +// +// usbconfigparser.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include + +#define SKIP_BYTES(pDesc, nBytes) ((TUSBDescriptor *) ((u8 *) (pDesc) + (nBytes))) + +void USBConfigurationParser (TUSBConfigurationParser *pThis, const void *pBuffer, unsigned nBufLen) +{ + assert (pThis != 0); + pThis->m_pBuffer = (TUSBDescriptor *) pBuffer; + pThis->m_nBufLen = nBufLen; + pThis->m_bValid = FALSE; + pThis->m_pEndPosition = SKIP_BYTES (pThis->m_pBuffer, nBufLen); + pThis->m_pCurrentPosition = pThis->m_pBuffer; + pThis->m_pErrorPosition = pThis->m_pBuffer; + + assert (pThis->m_pBuffer != 0); + + if ( pThis->m_nBufLen < 4 // wTotalLength must exist + || pThis->m_nBufLen > 512) // best guess + { + return; + } + + if ( pThis->m_pBuffer->Configuration.bLength != sizeof (TUSBConfigurationDescriptor) + || pThis->m_pBuffer->Configuration.bDescriptorType != DESCRIPTOR_CONFIGURATION + || pThis->m_pBuffer->Configuration.wTotalLength > nBufLen) + { + return; + } + + if (pThis->m_pBuffer->Configuration.wTotalLength < nBufLen) + { + pThis->m_pEndPosition = SKIP_BYTES (pThis->m_pBuffer, pThis->m_pBuffer->Configuration.wTotalLength); + } + + const TUSBDescriptor *pCurrentPosition = pThis->m_pBuffer; + u8 ucLastDescType = 0; + boolean bInAudioInterface = FALSE; + while (SKIP_BYTES (pCurrentPosition, 2) < pThis->m_pEndPosition) + { + u8 ucDescLen = pCurrentPosition->Header.bLength; + u8 ucDescType = pCurrentPosition->Header.bDescriptorType; + + TUSBDescriptor *pDescEnd = SKIP_BYTES (pCurrentPosition, ucDescLen); + if (pDescEnd > pThis->m_pEndPosition) + { + pThis->m_pErrorPosition = pCurrentPosition; + return; + } + + u8 ucExpectedLen = 0; + switch (ucDescType) + { + case DESCRIPTOR_CONFIGURATION: + if (ucLastDescType != 0) + { + pThis->m_pErrorPosition = pCurrentPosition; + return; + } + ucExpectedLen = sizeof (TUSBConfigurationDescriptor); + break; + + case DESCRIPTOR_INTERFACE: + if (ucLastDescType == 0) + { + pThis->m_pErrorPosition = pCurrentPosition; + return; + } + ucExpectedLen = sizeof (TUSBInterfaceDescriptor); + bInAudioInterface = pCurrentPosition->Interface.bInterfaceClass == 0x01; // Audio class + break; + + case DESCRIPTOR_ENDPOINT: + if ( ucLastDescType == 0 + || ucLastDescType == DESCRIPTOR_CONFIGURATION) + { + pThis->m_pErrorPosition = pCurrentPosition; + return; + } + ucExpectedLen = bInAudioInterface ? sizeof (TUSBAudioEndpointDescriptor) : sizeof (TUSBEndpointDescriptor); + break; + + default: + break; + } + + if ( ucExpectedLen != 0 + && ucDescLen != ucExpectedLen) + { + pThis->m_pErrorPosition = pCurrentPosition; + return; + } + + ucLastDescType = ucDescType; + pCurrentPosition = pDescEnd; + } + + if (pCurrentPosition != pThis->m_pEndPosition) + { + pThis->m_pErrorPosition = pCurrentPosition; + return; + } + + pThis->m_bValid = TRUE; +} + +void _USBConfigurationParser (TUSBConfigurationParser *pThis) +{ + assert (pThis != 0); + pThis->m_pBuffer = 0; +} + +boolean USBConfigurationParserIsValid (TUSBConfigurationParser *pThis) +{ + assert (pThis != 0); + return pThis->m_bValid; +} + +const TUSBDescriptor *USBConfigurationParserGetDescriptor (TUSBConfigurationParser *pThis, u8 ucType) +{ + assert (pThis != 0); + assert (pThis->m_bValid); + + const TUSBDescriptor *pResult = 0; + + while (pThis->m_pCurrentPosition < pThis->m_pEndPosition) + { + u8 ucDescLen = pThis->m_pCurrentPosition->Header.bLength; + u8 ucDescType = pThis->m_pCurrentPosition->Header.bDescriptorType; + + TUSBDescriptor *pDescEnd = SKIP_BYTES (pThis->m_pCurrentPosition, ucDescLen); + assert (pDescEnd <= pThis->m_pEndPosition); + + if ( ucType == DESCRIPTOR_ENDPOINT + && ucDescType == DESCRIPTOR_INTERFACE) + { + break; + } + + if (ucDescType == ucType) + { + pResult = pThis->m_pCurrentPosition; + pThis->m_pCurrentPosition = pDescEnd; + break; + } + + pThis->m_pCurrentPosition = pDescEnd; + } + + if (pResult != 0) + { + pThis->m_pErrorPosition = pResult; + } + + return pResult; +} + + +void USBConfigurationParserError (TUSBConfigurationParser *pThis, const char *pSource) +{ + assert (pThis != 0); + assert (pSource != 0); + LogWrite (pSource, LOG_ERROR, + "Invalid configuration descriptor (offset 0x%X)", + (unsigned) pThis->m_pErrorPosition - (unsigned) pThis->m_pBuffer); +#ifndef NDEBUG + DebugHexdump (pThis->m_pBuffer, pThis->m_nBufLen, pSource); +#endif +} diff --git a/uspi/lib/usbdevice.c b/uspi/lib/usbdevice.c new file mode 100644 index 0000000..17ed3f7 --- /dev/null +++ b/uspi/lib/usbdevice.c @@ -0,0 +1,473 @@ +// +// usbdevice.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include +#include +#include + +#define MAX_CONFIG_DESC_SIZE 512 // best guess + +typedef struct TConfigurationHeader +{ + TUSBConfigurationDescriptor Configuration; + TUSBInterfaceDescriptor Interface; +} +TConfigurationHeader; + +void USBDeviceSetAddress (TUSBDevice *pThis, u8 ucAddress); + +static const char FromDevice[] = "usbdev"; + +static u8 s_ucNextAddress = USB_FIRST_DEDICATED_ADDRESS; + +void USBDevice (TUSBDevice *pThis, struct TDWHCIDevice *pHost, TUSBSpeed Speed, u8 ucHubAddress, u8 ucHubPortNumber) +{ + assert (pThis != 0); + + pThis->Configure = USBDeviceConfigure; + + pThis->m_pHost = pHost; + pThis->m_ucAddress = USB_DEFAULT_ADDRESS; + pThis->m_Speed = Speed; + pThis->m_pEndpoint0 = 0; + pThis->m_ucHubAddress = ucHubAddress; + pThis->m_ucHubPortNumber = ucHubPortNumber; + pThis->m_pDeviceDesc = 0; + pThis->m_pConfigDesc = 0; + pThis->m_pConfigParser = 0; + + assert (pThis->m_pHost != 0); + + assert (pThis->m_pEndpoint0 == 0); + pThis->m_pEndpoint0 = (TUSBEndpoint *) malloc (sizeof (TUSBEndpoint)); + assert (pThis->m_pEndpoint0 != 0); + USBEndpoint (pThis->m_pEndpoint0, pThis); + + assert (ucHubPortNumber >= 1); + + USBString (&pThis->m_ManufacturerString, pThis); + USBString (&pThis->m_ProductString, pThis); +} + +void USBDeviceCopy (TUSBDevice *pThis, TUSBDevice *pDevice) +{ + assert (pThis != 0); + + assert (pDevice != 0); + + pThis->Configure = pDevice->Configure; + + pThis->m_pEndpoint0 = 0; + pThis->m_pDeviceDesc = 0; + pThis->m_pConfigDesc = 0; + pThis->m_pConfigParser = 0; + + pThis->m_pHost = pDevice->m_pHost; + pThis->m_ucAddress = pDevice->m_ucAddress; + pThis->m_Speed = pDevice->m_Speed; + pThis->m_ucHubAddress = pDevice->m_ucHubAddress; + pThis->m_ucHubPortNumber = pDevice->m_ucHubPortNumber; + + USBStringCopy (&pThis->m_ManufacturerString, &pDevice->m_ManufacturerString); + USBStringCopy (&pThis->m_ProductString, &pDevice->m_ProductString); + + pThis->m_pEndpoint0 = (TUSBEndpoint *) malloc (sizeof (TUSBEndpoint)); + assert (pThis->m_pEndpoint0 != 0); + USBEndpointCopy (pThis->m_pEndpoint0, pDevice->m_pEndpoint0, pThis); + + if (pDevice->m_pDeviceDesc != 0) + { + pThis->m_pDeviceDesc = (TUSBDeviceDescriptor *) malloc (sizeof (TUSBDeviceDescriptor)); + assert (pThis->m_pDeviceDesc != 0); + + memcpy (pThis->m_pDeviceDesc, pDevice->m_pDeviceDesc, sizeof (TUSBDeviceDescriptor)); + } + + if (pDevice->m_pConfigDesc != 0) + { + unsigned nTotalLength = pDevice->m_pConfigDesc->wTotalLength; + assert (nTotalLength <= MAX_CONFIG_DESC_SIZE); + + pThis->m_pConfigDesc = (TUSBConfigurationDescriptor *) malloc (nTotalLength); + assert (pThis->m_pConfigDesc != 0); + + memcpy (pThis->m_pConfigDesc, pDevice->m_pConfigDesc, nTotalLength); + + if (pDevice->m_pConfigParser != 0) + { + pThis->m_pConfigParser = (TUSBConfigurationParser *) malloc (sizeof (TUSBConfigurationParser)); + assert (pThis->m_pConfigParser != 0); + USBConfigurationParser (pThis->m_pConfigParser, pThis->m_pConfigDesc, nTotalLength); + } + } +} + +void _USBDevice (TUSBDevice *pThis) +{ + assert (pThis != 0); + + if (pThis->m_pConfigParser != 0) + { + _USBConfigurationParser (pThis->m_pConfigParser); + free (pThis->m_pConfigParser); + pThis->m_pConfigParser = 0; + } + + if (pThis->m_pConfigDesc != 0) + { + free (pThis->m_pConfigDesc); + pThis->m_pConfigDesc = 0; + } + + if (pThis->m_pDeviceDesc != 0) + { + free (pThis->m_pDeviceDesc); + pThis->m_pDeviceDesc = 0; + } + + if (pThis->m_pEndpoint0 != 0) + { + _USBEndpoint (pThis->m_pEndpoint0); + free (pThis->m_pEndpoint0); + pThis->m_pEndpoint0 = 0; + } + + pThis->Configure = 0; + + pThis->m_pHost = 0; + + _USBString (&pThis->m_ProductString); + _USBString (&pThis->m_ManufacturerString); +} + +boolean USBDeviceInitialize (TUSBDevice *pThis) +{ + assert (pThis != 0); + + assert (pThis->m_pDeviceDesc == 0); + pThis->m_pDeviceDesc = (TUSBDeviceDescriptor *) malloc (sizeof (TUSBDeviceDescriptor)); + assert (pThis->m_pDeviceDesc != 0); + + assert (pThis->m_pHost != 0); + assert (pThis->m_pEndpoint0 != 0); + + assert (sizeof *pThis->m_pDeviceDesc >= USB_DEFAULT_MAX_PACKET_SIZE); + if (DWHCIDeviceGetDescriptor (pThis->m_pHost, pThis->m_pEndpoint0, + DESCRIPTOR_DEVICE, DESCRIPTOR_INDEX_DEFAULT, + pThis->m_pDeviceDesc, USB_DEFAULT_MAX_PACKET_SIZE, REQUEST_IN) + != USB_DEFAULT_MAX_PACKET_SIZE) + { + LogWrite (FromDevice, LOG_ERROR, "Cannot get device descriptor (short)"); + + free (pThis->m_pDeviceDesc); + pThis->m_pDeviceDesc = 0; + + return FALSE; + } + + if ( pThis->m_pDeviceDesc->bLength != sizeof *pThis->m_pDeviceDesc + || pThis->m_pDeviceDesc->bDescriptorType != DESCRIPTOR_DEVICE) + { + LogWrite (FromDevice, LOG_ERROR, "Invalid device descriptor"); + + free (pThis->m_pDeviceDesc); + pThis->m_pDeviceDesc = 0; + + return FALSE; + } + + USBEndpointSetMaxPacketSize (pThis->m_pEndpoint0, pThis->m_pDeviceDesc->bMaxPacketSize0); + + if (DWHCIDeviceGetDescriptor (pThis->m_pHost, pThis->m_pEndpoint0, + DESCRIPTOR_DEVICE, DESCRIPTOR_INDEX_DEFAULT, + pThis->m_pDeviceDesc, sizeof *pThis->m_pDeviceDesc, REQUEST_IN) + != (int) sizeof *pThis->m_pDeviceDesc) + { + LogWrite (FromDevice, LOG_ERROR, "Cannot get device descriptor"); + + free (pThis->m_pDeviceDesc); + pThis->m_pDeviceDesc = 0; + + return FALSE; + } + +#ifndef NDEBUG + //DebugHexdump (pThis->m_pDeviceDesc, sizeof *pThis->m_pDeviceDesc, FromDevice); +#endif + + u8 ucAddress = s_ucNextAddress++; + if (ucAddress > USB_MAX_ADDRESS) + { + LogWrite (FromDevice, LOG_ERROR, "Too many devices"); + + return FALSE; + } + + if (!DWHCIDeviceSetAddress (pThis->m_pHost, pThis->m_pEndpoint0, ucAddress)) + { + LogWrite (FromDevice, LOG_ERROR, + "Cannot set address %u", (unsigned) ucAddress); + + return FALSE; + } + + USBDeviceSetAddress (pThis, ucAddress); + + if ( pThis->m_pDeviceDesc->iManufacturer != 0 + || pThis->m_pDeviceDesc->iProduct != 0) + { + u16 usLanguageID = USBStringGetLanguageID (&pThis->m_ManufacturerString); + + if (pThis->m_pDeviceDesc->iManufacturer != 0) + { + USBStringGetFromDescriptor (&pThis->m_ManufacturerString, + pThis->m_pDeviceDesc->iManufacturer, usLanguageID); + } + + if (pThis->m_pDeviceDesc->iProduct != 0) + { + USBStringGetFromDescriptor (&pThis->m_ProductString, + pThis->m_pDeviceDesc->iProduct, usLanguageID); + } + } + + assert (pThis->m_pConfigDesc == 0); + pThis->m_pConfigDesc = (TUSBConfigurationDescriptor *) malloc (sizeof (TUSBConfigurationDescriptor)); + assert (pThis->m_pConfigDesc != 0); + + if (DWHCIDeviceGetDescriptor (pThis->m_pHost, pThis->m_pEndpoint0, + DESCRIPTOR_CONFIGURATION, DESCRIPTOR_INDEX_DEFAULT, + pThis->m_pConfigDesc, sizeof *pThis->m_pConfigDesc, REQUEST_IN) + != (int) sizeof *pThis->m_pConfigDesc) + { + LogWrite (FromDevice, LOG_ERROR, "Cannot get configuration descriptor (short)"); + + free (pThis->m_pConfigDesc); + pThis->m_pConfigDesc = 0; + + return FALSE; + } + + if ( pThis->m_pConfigDesc->bLength != sizeof *pThis->m_pConfigDesc + || pThis->m_pConfigDesc->bDescriptorType != DESCRIPTOR_CONFIGURATION + || pThis->m_pConfigDesc->wTotalLength > MAX_CONFIG_DESC_SIZE) + { + LogWrite (FromDevice, LOG_ERROR, "Invalid configuration descriptor"); + + free (pThis->m_pConfigDesc); + pThis->m_pConfigDesc = 0; + + return FALSE; + } + + unsigned nTotalLength = pThis->m_pConfigDesc->wTotalLength; + + free (pThis->m_pConfigDesc); + + pThis->m_pConfigDesc = (TUSBConfigurationDescriptor *) malloc (nTotalLength); + assert (pThis->m_pConfigDesc != 0); + + if (DWHCIDeviceGetDescriptor (pThis->m_pHost, pThis->m_pEndpoint0, + DESCRIPTOR_CONFIGURATION, DESCRIPTOR_INDEX_DEFAULT, + pThis->m_pConfigDesc, nTotalLength, REQUEST_IN) + != (int) nTotalLength) + { + LogWrite (FromDevice, LOG_ERROR, "Cannot get configuration descriptor"); + + free (pThis->m_pConfigDesc); + pThis->m_pConfigDesc = 0; + + return FALSE; + } + +#ifndef NDEBUG + //DebugHexdump (pThis->m_pConfigDesc, nTotalLength, FromDevice); +#endif + + assert (pThis->m_pConfigParser == 0); + pThis->m_pConfigParser = malloc (sizeof (TUSBConfigurationParser)); + assert (pThis->m_pConfigParser != 0); + USBConfigurationParser (pThis->m_pConfigParser, pThis->m_pConfigDesc, nTotalLength); + + if (!USBConfigurationParserIsValid (pThis->m_pConfigParser)) + { + USBDeviceConfigurationError (pThis, FromDevice); + + return FALSE; + } + + return TRUE; +} + +boolean USBDeviceConfigure (TUSBDevice *pThis) +{ + assert (pThis != 0); + + assert (pThis->m_pHost != 0); + assert (pThis->m_pEndpoint0 != 0); + + if (pThis->m_pConfigDesc == 0) // not initialized + { + return FALSE; + } + + if (!DWHCIDeviceSetConfiguration (pThis->m_pHost, pThis->m_pEndpoint0, pThis->m_pConfigDesc->bConfigurationValue)) + { + LogWrite (FromDevice, LOG_ERROR, "Cannot set configuration (%u)", + (unsigned) pThis->m_pConfigDesc->bConfigurationValue); + + return FALSE; + } + + return TRUE; +} + +TString *USBDeviceGetName (TUSBDevice *pThis, TDeviceNameSelector Selector) +{ + assert (pThis != 0); + + TString *pString = malloc (sizeof (TString)); + assert (pString != 0); + String (pString); + + switch (Selector) + { + case DeviceNameVendor: + assert (pThis->m_pDeviceDesc != 0); + StringFormat (pString, "ven%x-%x", + (unsigned) pThis->m_pDeviceDesc->idVendor, + (unsigned) pThis->m_pDeviceDesc->idProduct); + break; + + case DeviceNameDevice: + assert (pThis->m_pDeviceDesc != 0); + if ( pThis->m_pDeviceDesc->bDeviceClass == 0 + || pThis->m_pDeviceDesc->bDeviceClass == 0xFF) + { + goto unknown; + } + StringFormat (pString, "dev%x-%x-%x", + (unsigned) pThis->m_pDeviceDesc->bDeviceClass, + (unsigned) pThis->m_pDeviceDesc->bDeviceSubClass, + (unsigned) pThis->m_pDeviceDesc->bDeviceProtocol); + break; + + case DeviceNameInterface: { + TConfigurationHeader *pConfig = (TConfigurationHeader *) pThis->m_pConfigDesc; + assert (pConfig != 0); + if ( pConfig->Configuration.wTotalLength < sizeof *pConfig + || pConfig->Interface.bInterfaceClass == 0 + || pConfig->Interface.bInterfaceClass == 0xFF) + { + goto unknown; + } + StringFormat (pString, "int%x-%x-%x", + (unsigned) pConfig->Interface.bInterfaceClass, + (unsigned) pConfig->Interface.bInterfaceSubClass, + (unsigned) pConfig->Interface.bInterfaceProtocol); + } break; + + default: + assert (0); + unknown: + StringSet (pString, "unknown"); + break; + } + + return pString; +} + +u8 USBDeviceGetAddress (TUSBDevice *pThis) +{ + assert (pThis != 0); + return pThis->m_ucAddress; +} + +TUSBSpeed USBDeviceGetSpeed (TUSBDevice *pThis) +{ + assert (pThis != 0); + return pThis->m_Speed; +} + +u8 USBDeviceGetHubAddress (TUSBDevice *pThis) +{ + assert (pThis != 0); + return pThis->m_ucHubAddress; +} + +u8 USBDeviceGetHubPortNumber (TUSBDevice *pThis) +{ + assert (pThis != 0); + return pThis->m_ucHubPortNumber; +} + +struct TUSBEndpoint *USBDeviceGetEndpoint0 (TUSBDevice *pThis) +{ + assert (pThis != 0); + assert (pThis->m_pEndpoint0 != 0); + return pThis->m_pEndpoint0; +} + +struct TDWHCIDevice *USBDeviceGetHost (TUSBDevice *pThis) +{ + assert (pThis != 0); + assert (pThis->m_pHost != 0); + return pThis->m_pHost; +} + +const TUSBDeviceDescriptor *USBDeviceGetDeviceDescriptor (TUSBDevice *pThis) +{ + assert (pThis != 0); + assert (pThis->m_pDeviceDesc != 0); + return pThis->m_pDeviceDesc; +} + +const TUSBConfigurationDescriptor *USBDeviceGetConfigurationDescriptor (TUSBDevice *pThis) +{ + assert (pThis != 0); + assert (pThis->m_pConfigDesc != 0); + return pThis->m_pConfigDesc; +} + +const TUSBDescriptor *USBDeviceGetDescriptor (TUSBDevice *pThis, u8 ucType) +{ + assert (pThis != 0); + assert (pThis->m_pConfigParser != 0); + return USBConfigurationParserGetDescriptor (pThis->m_pConfigParser, ucType); +} + +void USBDeviceConfigurationError (TUSBDevice *pThis, const char *pSource) +{ + assert (pThis != 0); + assert (pThis->m_pConfigParser != 0); + USBConfigurationParserError (pThis->m_pConfigParser, pSource); +} + +void USBDeviceSetAddress (TUSBDevice *pThis, u8 ucAddress) +{ + assert (pThis != 0); + + assert (ucAddress <= USB_MAX_ADDRESS); + pThis->m_ucAddress = ucAddress; + + //LogWrite (FromDevice, LOG_DEBUG, "Device address set to %u", (unsigned) pThis->m_ucAddress); +} diff --git a/uspi/lib/usbdevicefactory.c b/uspi/lib/usbdevicefactory.c new file mode 100644 index 0000000..1f0d13c --- /dev/null +++ b/uspi/lib/usbdevicefactory.c @@ -0,0 +1,127 @@ +// +// usbdevicefactory.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014-2018 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include + +// for factory +#include +#include +#include +#include +#include +#include +#include +#include + +TUSBDevice *GetDevice (TUSBDevice *pParent, TString *pName); + +TUSBDevice *USBDeviceFactoryGetDevice (TUSBDevice *pParent) +{ + assert (pParent != 0); + + TUSBDevice *pResult; + if ( (pResult = GetDevice (pParent, USBDeviceGetName (pParent, DeviceNameVendor))) == 0 + && (pResult = GetDevice (pParent, USBDeviceGetName (pParent, DeviceNameDevice))) == 0 + && (pResult = GetDevice (pParent, USBDeviceGetName (pParent, DeviceNameInterface))) == 0) + { + return 0; + } + + assert (pResult != 0); + + return pResult; +} + +TUSBDevice *GetDevice (TUSBDevice *pParent, TString *pName) +{ + assert (pParent != 0); + assert (pName != 0); + + TUSBDevice *pResult = 0; + + if (StringCompare (pName, "dev9-0-2") == 0) + { + TUSBStandardHub *pDevice = (TUSBStandardHub *) malloc (sizeof (TUSBStandardHub)); + assert (pDevice != 0); + USBStandardHub (pDevice, pParent); + pResult = (TUSBDevice *) pDevice; + } + else if (StringCompare (pName, "int8-6-50") == 0) + { + TUSBBulkOnlyMassStorageDevice *pDevice = (TUSBBulkOnlyMassStorageDevice *) malloc (sizeof (TUSBBulkOnlyMassStorageDevice)); + assert (pDevice != 0); + USBBulkOnlyMassStorageDevice (pDevice, pParent); + pResult = (TUSBDevice *) pDevice; + } + else if (StringCompare (pName, "int3-1-1") == 0) + { + TUSBKeyboardDevice *pDevice = (TUSBKeyboardDevice *) malloc (sizeof (TUSBKeyboardDevice)); + assert (pDevice != 0); + USBKeyboardDevice (pDevice, pParent); + pResult = (TUSBDevice *) pDevice; + } + else if (StringCompare (pName, "int3-1-2") == 0) + { + TUSBMouseDevice *pDevice = (TUSBMouseDevice *) malloc (sizeof (TUSBMouseDevice)); + assert (pDevice != 0); + USBMouseDevice (pDevice, pParent); + pResult = (TUSBDevice *) pDevice; + } + else if (StringCompare (pName, "ven424-ec00") == 0) + { + TSMSC951xDevice *pDevice = (TSMSC951xDevice *) malloc (sizeof (TSMSC951xDevice)); + assert (pDevice != 0); + SMSC951xDevice (pDevice, pParent); + pResult = (TUSBDevice *) pDevice; + } + else if (StringCompare (pName, "ven424-7800") == 0) + { + TLAN7800Device *pDevice = (TLAN7800Device *) malloc (sizeof (TLAN7800Device)); + assert (pDevice != 0); + LAN7800Device (pDevice, pParent); + pResult = (TUSBDevice *) pDevice; + } + else if (StringCompare (pName, "int3-0-0") == 0) + { + TUSBGamePadDevice *pDevice = (TUSBGamePadDevice *) malloc (sizeof (TUSBGamePadDevice)); + assert (pDevice != 0); + USBGamePadDevice (pDevice, pParent); + pResult = (TUSBDevice *) pDevice; + } + else if (StringCompare (pName, "int1-3-0") == 0) + { + TUSBMIDIDevice *pDevice = (TUSBMIDIDevice *) malloc (sizeof (TUSBMIDIDevice)); + assert (pDevice != 0); + USBMIDIDevice (pDevice, pParent); + pResult = (TUSBDevice *)pDevice; + } + // new devices follow + + if (pResult != 0) + { + LogWrite ("usbdev", LOG_NOTICE, "Using device %s", StringGet (pName)); + } + + _String (pName); + free (pName); + + return pResult; +} diff --git a/uspi/lib/usbendpoint.c b/uspi/lib/usbendpoint.c new file mode 100644 index 0000000..827455f --- /dev/null +++ b/uspi/lib/usbendpoint.c @@ -0,0 +1,231 @@ +// +// usbendpoint.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include + +void USBEndpoint (TUSBEndpoint *pThis, TUSBDevice *pDevice) +{ + assert (pThis != 0); + pThis->m_pDevice = pDevice; + pThis->m_ucNumber = 0; + pThis->m_Type = EndpointTypeControl; + pThis->m_bDirectionIn = FALSE; + pThis->m_nMaxPacketSize = USB_DEFAULT_MAX_PACKET_SIZE; + pThis->m_nInterval = 1; + pThis->m_NextPID = USBPIDSetup; + + assert (pThis->m_pDevice != 0); +} + +void USBEndpoint2 (TUSBEndpoint *pThis, TUSBDevice *pDevice, const TUSBEndpointDescriptor *pDesc) +{ + assert (pThis != 0); + pThis->m_pDevice = pDevice; + pThis->m_nInterval = 1; + + assert (pThis->m_pDevice != 0); + + assert (pDesc != 0); + assert (pDesc->bLength == sizeof *pDesc || pDesc->bLength == sizeof (TUSBAudioEndpointDescriptor)); + assert (pDesc->bDescriptorType == DESCRIPTOR_ENDPOINT); + + switch (pDesc->bmAttributes & 0x03) + { + case 2: + pThis->m_Type = EndpointTypeBulk; + pThis->m_NextPID = USBPIDData0; + break; + + case 3: + pThis->m_Type = EndpointTypeInterrupt; + pThis->m_NextPID = USBPIDData0; + break; + + default: + assert (0); // endpoint configuration should be checked by function driver + return; + } + + pThis->m_ucNumber = pDesc->bEndpointAddress & 0x0F; + pThis->m_bDirectionIn = pDesc->bEndpointAddress & 0x80 ? TRUE : FALSE; + pThis->m_nMaxPacketSize = pDesc->wMaxPacketSize; + + if (pThis->m_Type == EndpointTypeInterrupt) + { + u8 ucInterval = pDesc->bInterval; + if (ucInterval < 1) + { + ucInterval = 1; + } + + // see USB 2.0 spec chapter 9.6.6 + if (USBDeviceGetSpeed (pThis->m_pDevice) != USBSpeedHigh) + { + pThis->m_nInterval = ucInterval; + } + else + { + if (ucInterval > 16) + { + ucInterval = 16; + } + + unsigned nValue = 1 << (ucInterval - 1); + + pThis->m_nInterval = nValue / 8; + + if (pThis->m_nInterval < 1) + { + pThis->m_nInterval = 1; + } + } + } +} + +void USBEndpointCopy (TUSBEndpoint *pThis, TUSBEndpoint *pEndpoint, TUSBDevice *pDevice) +{ + assert (pThis != 0); + + assert (pEndpoint != 0); + + pThis->m_pDevice = pDevice; + assert (pThis->m_pDevice != 0); + + pThis->m_ucNumber = pEndpoint->m_ucNumber; + pThis->m_Type = pEndpoint->m_Type; + pThis->m_bDirectionIn = pEndpoint->m_bDirectionIn; + pThis->m_nMaxPacketSize = pEndpoint->m_nMaxPacketSize; + pThis->m_nInterval = pEndpoint->m_nInterval; + pThis->m_NextPID = pEndpoint->m_NextPID; +} + +void _USBEndpoint (TUSBEndpoint *pThis) +{ + assert (pThis != 0); + pThis->m_pDevice = 0; +} + +TUSBDevice *USBEndpointGetDevice (TUSBEndpoint *pThis) +{ + assert (pThis != 0); + assert (pThis->m_pDevice != 0); + return pThis->m_pDevice; +} + +u8 USBEndpointGetNumber (TUSBEndpoint *pThis) +{ + assert (pThis != 0); + return pThis->m_ucNumber; +} + +TEndpointType USBEndpointGetType (TUSBEndpoint *pThis) +{ + assert (pThis != 0); + return pThis->m_Type; +} + +boolean USBEndpointIsDirectionIn (TUSBEndpoint *pThis) +{ + assert (pThis != 0); + return pThis->m_bDirectionIn; +} + +void USBEndpointSetMaxPacketSize (TUSBEndpoint *pThis, u32 nMaxPacketSize) +{ + assert (pThis != 0); + pThis->m_nMaxPacketSize = nMaxPacketSize; +} + +u32 USBEndpointGetMaxPacketSize (TUSBEndpoint *pThis) +{ + assert (pThis != 0); + return pThis->m_nMaxPacketSize; +} + +unsigned USBEndpointGetInterval (TUSBEndpoint *pThis) +{ + assert (pThis != 0); + assert (pThis->m_Type == EndpointTypeInterrupt); + + return pThis->m_nInterval; +} + +TUSBPID USBEndpointGetNextPID (TUSBEndpoint *pThis, boolean bStatusStage) +{ + assert (pThis != 0); + if (bStatusStage) + { + assert (pThis->m_Type == EndpointTypeControl); + + return USBPIDData1; + } + + return pThis->m_NextPID; +} + +void USBEndpointSkipPID (TUSBEndpoint *pThis, unsigned nPackets, boolean bStatusStage) +{ + assert (pThis != 0); + assert ( pThis->m_Type == EndpointTypeControl + || pThis->m_Type == EndpointTypeBulk + || pThis->m_Type == EndpointTypeInterrupt); + + if (!bStatusStage) + { + switch (pThis->m_NextPID) + { + case USBPIDSetup: + pThis->m_NextPID = USBPIDData1; + break; + + case USBPIDData0: + if (nPackets & 1) + { + pThis->m_NextPID = USBPIDData1; + } + break; + + case USBPIDData1: + if (nPackets & 1) + { + pThis->m_NextPID = USBPIDData0; + } + break; + + default: + assert (0); + break; + } + } + else + { + assert (pThis->m_Type == EndpointTypeControl); + + pThis->m_NextPID = USBPIDSetup; + } +} + +void USBEndpointResetPID (TUSBEndpoint *pThis) +{ + assert (pThis != 0); + assert (pThis->m_Type == EndpointTypeBulk); + + pThis->m_NextPID = USBPIDData0; +} diff --git a/uspi/lib/usbgamepad.c b/uspi/lib/usbgamepad.c new file mode 100644 index 0000000..b8e4200 --- /dev/null +++ b/uspi/lib/usbgamepad.c @@ -0,0 +1,585 @@ +// +// usbgamepad.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// Copyright (C) 2014 M. Maccaferri +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include +#include +#include + +// HID Report Items from HID 1.11 Section 6.2.2 +#define HID_USAGE_PAGE 0x04 +#define HID_USAGE 0x08 +#define HID_COLLECTION 0xA0 +#define HID_END_COLLECTION 0xC0 +#define HID_REPORT_COUNT 0x94 +#define HID_REPORT_SIZE 0x74 +#define HID_USAGE_MIN 0x18 +#define HID_USAGE_MAX 0x28 +#define HID_LOGICAL_MIN 0x14 +#define HID_LOGICAL_MAX 0x24 +#define HID_PHYSICAL_MIN 0x34 +#define HID_PHYSICAL_MAX 0x44 +#define HID_INPUT 0x80 +#define HID_REPORT_ID 0x84 +#define HID_OUTPUT 0x90 + +// HID Report Usage Pages from HID Usage Tables 1.12 Section 3, Table 1 +#define HID_USAGE_PAGE_GENERIC_DESKTOP 0x01 +#define HID_USAGE_PAGE_KEY_CODES 0x07 +#define HID_USAGE_PAGE_LEDS 0x08 +#define HID_USAGE_PAGE_BUTTONS 0x09 + +// HID Report Usages from HID Usage Tables 1.12 Section 4, Table 6 +#define HID_USAGE_POINTER 0x01 +#define HID_USAGE_MOUSE 0x02 +#define HID_USAGE_JOYSTICK 0x04 +#define HID_USAGE_GAMEPAD 0x05 +#define HID_USAGE_KEYBOARD 0x06 +#define HID_USAGE_X 0x30 +#define HID_USAGE_Y 0x31 +#define HID_USAGE_Z 0x32 +#define HID_USAGE_RX 0x33 +#define HID_USAGE_RY 0x34 +#define HID_USAGE_RZ 0x35 +#define HID_USAGE_SLIDER 0x36 +#define HID_USAGE_WHEEL 0x38 +#define HID_USAGE_HATSWITCH 0x39 + +// HID Report Collection Types from HID 1.12 6.2.2.6 +#define HID_COLLECTION_PHYSICAL 0 +#define HID_COLLECTION_APPLICATION 1 + +// HID Input/Output/Feature Item Data (attributes) from HID 1.11 6.2.2.5 +#define HID_ITEM_CONSTANT 0x1 +#define HID_ITEM_VARIABLE 0x2 +#define HID_ITEM_RELATIVE 0x4 + +static unsigned s_nDeviceNumber = 1; + +static const char FromUSBPad[] = "usbpad"; + +static boolean USBGamePadDeviceStartRequest (TUSBGamePadDevice *pThis); +static void USBGamePadDeviceCompletionRoutine (TUSBRequest *pURB, void *pParam, void *pContext); +static void USBGamePadDevicePS3Configure (TUSBGamePadDevice *pThis); + +void USBGamePadDevice (TUSBGamePadDevice *pThis, TUSBDevice *pDevice) +{ + assert (pThis != 0); + + USBDeviceCopy (&pThis->m_USBDevice, pDevice); + pThis->m_USBDevice.Configure = USBGamePadDeviceConfigure; + + pThis->m_pEndpointIn = 0; + pThis->m_pEndpointOut = 0; + pThis->m_pStatusHandler = 0; + pThis->m_pURB = 0; + pThis->m_pHIDReportDescriptor = 0; + pThis->m_usReportDescriptorLength = 0; + pThis->m_nReportSize = 0; + + pThis->m_State.naxes = 0; + for (int i = 0; i < MAX_AXIS; i++) { + pThis->m_State.axes[i].value = 0; + pThis->m_State.axes[i].minimum = 0; + pThis->m_State.axes[i].maximum = 0; + } + + pThis->m_State.nhats = 0; + for (int i = 0; i < MAX_HATS; i++) + pThis->m_State.hats[i] = 0; + + pThis->m_State.nbuttons = 0; + pThis->m_State.buttons = 0; + + pThis->m_pReportBuffer = malloc (64); + assert (pThis->m_pReportBuffer != 0); +} + +void _CUSBGamePadDevice (TUSBGamePadDevice *pThis) +{ + assert (pThis != 0); + + if (pThis->m_pHIDReportDescriptor != 0) + { + free (pThis->m_pHIDReportDescriptor); + pThis->m_pHIDReportDescriptor = 0; + } + + if (pThis->m_pReportBuffer != 0) + { + free (pThis->m_pReportBuffer); + pThis->m_pReportBuffer = 0; + } + + if (pThis->m_pEndpointIn != 0) + { + _USBEndpoint (pThis->m_pEndpointIn); + free (pThis->m_pEndpointIn); + pThis->m_pEndpointIn = 0; + } + + if (pThis->m_pEndpointOut != 0) + { + _USBEndpoint (pThis->m_pEndpointOut); + free (pThis->m_pEndpointOut); + pThis->m_pEndpointOut = 0; + } + + _USBDevice (&pThis->m_USBDevice); +} + +static u32 BitGetUnsigned(void *buffer, u32 offset, u32 length) +{ + u8* bitBuffer; + u8 mask; + u32 result; + + bitBuffer = buffer; + result = 0; + for (u32 i = offset / 8, j = 0; i < (offset + length + 7) / 8; i++) { + if (offset / 8 == (offset + length - 1) / 8) { + mask = (1 << ((offset % 8) + length)) - (1 << (offset % 8)); + result = (bitBuffer[i] & mask) >> (offset % 8); + } else if (i == offset / 8) { + mask = 0x100 - (1 << (offset % 8)); + j += 8 - (offset % 8); + result = ((bitBuffer[i] & mask) >> (offset % 8)) << (length - j); + } else if (i == (offset + length - 1) / 8) { + mask = (1 << ((offset % 8) + length)) - 1; + result |= bitBuffer[i] & mask; + } else { + j += 8; + result |= bitBuffer[i] << (length - j); + } + } + + return result; +} + +static s32 BitGetSigned(void* buffer, u32 offset, u32 length) { + u32 result = BitGetUnsigned(buffer, offset, length); + + if (result & (1 << (length - 1))) + result |= 0xffffffff - ((1 << length) - 1); + + return result; +} + +enum { + None = 0, + GamePad, + GamePadButton, + GamePadAxis, + GamePadHat, +}; + +#define UNDEFINED -123456789 + +static void USBGamePadDeviceDecodeReport(TUSBGamePadDevice *pThis) +{ + s32 item, arg; + u32 offset = 0, size = 0, count = 0; + s32 lmax = UNDEFINED, lmin = UNDEFINED, pmin = UNDEFINED, pmax = UNDEFINED; + s32 naxes = 0, nhats = 0; + u32 id = 0, state = None; + + u8 *pReportBuffer = pThis->m_pReportBuffer; + s8 *pHIDReportDescriptor = (s8 *)pThis->m_pHIDReportDescriptor; + u16 wReportDescriptorLength = pThis->m_usReportDescriptorLength; + USPiGamePadState *pState = &pThis->m_State; + + while (wReportDescriptorLength > 0) { + item = *pHIDReportDescriptor++; + wReportDescriptorLength--; + + switch(item & 0x03) { + case 0: + arg = 0; + break; + case 1: + arg = *pHIDReportDescriptor++; + wReportDescriptorLength--; + break; + case 2: + arg = *pHIDReportDescriptor++ & 0xFF; + arg = arg | (*pHIDReportDescriptor++ << 8); + wReportDescriptorLength -= 2; + break; + default: + arg = *pHIDReportDescriptor++; + arg = arg | (*pHIDReportDescriptor++ << 8); + arg = arg | (*pHIDReportDescriptor++ << 16); + arg = arg | (*pHIDReportDescriptor++ << 24); + wReportDescriptorLength -= 4; + break; + } + + if ((item & 0xFC) == HID_REPORT_ID) { + if (id != 0) + break; + id = BitGetUnsigned(pReportBuffer, 0, 8); + if (id != 0 && id != arg) + return; + id = arg; + offset = 8; + } + + switch(item & 0xFC) { + case HID_USAGE_PAGE: + switch(arg) { + case HID_USAGE_PAGE_BUTTONS: + if (state == GamePad) + state = GamePadButton; + break; + } + break; + case HID_USAGE: + switch(arg) { + case HID_USAGE_JOYSTICK: + case HID_USAGE_GAMEPAD: + state = GamePad; + break; + case HID_USAGE_X: + case HID_USAGE_Y: + case HID_USAGE_Z: + case HID_USAGE_RX: + case HID_USAGE_RY: + case HID_USAGE_RZ: + case HID_USAGE_SLIDER: + if (state == GamePad) + state = GamePadAxis; + break; + case HID_USAGE_HATSWITCH: + if (state == GamePad) + state = GamePadHat; + break; + } + break; + case HID_LOGICAL_MIN: + lmin = arg; + break; + case HID_PHYSICAL_MIN: + pmin = arg; + break; + case HID_LOGICAL_MAX: + lmax = arg; + break; + case HID_PHYSICAL_MAX: + pmax = arg; + break; + case HID_REPORT_SIZE: // REPORT_SIZE + size = arg; + break; + case HID_REPORT_COUNT: // REPORT_COUNT + count = arg; + break; + case HID_INPUT: + if ((arg & 0x03) == 0x02) { // INPUT(Data,Var) + if (state == GamePadAxis) { + for (int i = 0; i < count && i < MAX_AXIS; i++) { + pState->axes[naxes].minimum = lmin != UNDEFINED ? lmin : pmin; + pState->axes[naxes].maximum = lmax != UNDEFINED ? lmax : pmax; + + int value = (pState->axes[naxes].minimum < 0) ? + BitGetSigned(pReportBuffer, offset + i * size, size) : + BitGetUnsigned(pReportBuffer, offset + i * size, size); + + pState->axes[naxes++].value = value; + } + + state = GamePad; + } + else if (state == GamePadHat) { + for (int i = 0; i < count && i < MAX_HATS; i++) { + int value = BitGetUnsigned(pReportBuffer, offset + i * size, size); + pState->hats[nhats++] = value; + } + state = GamePad; + } + else if (state == GamePadButton) { + pState->nbuttons = count; + pState->buttons = BitGetUnsigned(pReportBuffer, offset, size * count); + state = GamePad; + } + } + offset += count * size; + break; + case HID_OUTPUT: + break; + } + } + + pState->naxes = naxes; + pState->nhats = nhats; + + pThis->m_nReportSize = (offset + 7) / 8; +} + +boolean USBGamePadDeviceConfigure (TUSBDevice *pUSBDevice) +{ + TUSBGamePadDevice *pThis = (TUSBGamePadDevice *) pUSBDevice; + assert (pThis != 0); + + TUSBConfigurationDescriptor *pConfDesc = + (TUSBConfigurationDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_CONFIGURATION); + if ( pConfDesc == 0 + || pConfDesc->bNumInterfaces < 1) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromUSBPad); + + return FALSE; + } + + TUSBInterfaceDescriptor *pInterfaceDesc = + (TUSBInterfaceDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_INTERFACE); + if ( pInterfaceDesc == 0 + || pInterfaceDesc->bNumEndpoints < 1 + || pInterfaceDesc->bInterfaceClass != 0x03 // HID Class + || pInterfaceDesc->bInterfaceSubClass != 0x00 // Boot Interface Subclass + || pInterfaceDesc->bInterfaceProtocol != 0x00) // GamePad + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromUSBPad); + + return FALSE; + } + + pThis->m_ucInterfaceNumber = pInterfaceDesc->bInterfaceNumber; + pThis->m_ucAlternateSetting = pInterfaceDesc->bAlternateSetting; + + TUSBHIDDescriptor *pHIDDesc = (TUSBHIDDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_HID); + if ( pHIDDesc == 0 + || pHIDDesc->wReportDescriptorLength == 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromUSBPad); + + return FALSE; + } + + const TUSBEndpointDescriptor *pEndpointDesc; + while ((pEndpointDesc = (TUSBEndpointDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_ENDPOINT)) != 0) + { + if ((pEndpointDesc->bmAttributes & 0x3F) == 0x03) // Interrupt + { + if ((pEndpointDesc->bEndpointAddress & 0x80) == 0x80) // Input + { + if (pThis->m_pEndpointIn != 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromUSBPad); + + return FALSE; + } + + pThis->m_pEndpointIn = (TUSBEndpoint *) malloc (sizeof (TUSBEndpoint)); + assert (pThis->m_pEndpointIn != 0); + USBEndpoint2 (pThis->m_pEndpointIn, &pThis->m_USBDevice, pEndpointDesc); + } + else // Output + { + if (pThis->m_pEndpointOut != 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromUSBPad); + + return FALSE; + } + + pThis->m_pEndpointOut = (TUSBEndpoint *) malloc (sizeof (TUSBEndpoint)); + assert (pThis->m_pEndpointOut != 0); + USBEndpoint2 (pThis->m_pEndpointOut, &pThis->m_USBDevice, pEndpointDesc); + } + } + } + + if (pThis->m_pEndpointIn == 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromUSBPad); + + return FALSE; + } + + pThis->m_usReportDescriptorLength = pHIDDesc->wReportDescriptorLength; + pThis->m_pHIDReportDescriptor = (unsigned char *) malloc(pHIDDesc->wReportDescriptorLength); + assert (pThis->m_pHIDReportDescriptor != 0); + + if (DWHCIDeviceControlMessage (USBDeviceGetHost (&pThis->m_USBDevice), + USBDeviceGetEndpoint0 (&pThis->m_USBDevice), + REQUEST_IN | REQUEST_TO_INTERFACE, GET_DESCRIPTOR, + (pHIDDesc->bReportDescriptorType << 8) | DESCRIPTOR_INDEX_DEFAULT, + pThis->m_ucInterfaceNumber, + pThis->m_pHIDReportDescriptor, pHIDDesc->wReportDescriptorLength) + != pHIDDesc->wReportDescriptorLength) + { + LogWrite (FromUSBPad, LOG_ERROR, "Cannot get HID report descriptor"); + + return FALSE; + } + //DebugHexdump (pThis->m_pHIDReportDescriptor, pHIDDesc->wReportDescriptorLength, "hid"); + + pThis->m_pReportBuffer[0] = 0; + USBGamePadDeviceDecodeReport (pThis); + + if (!USBDeviceConfigure (&pThis->m_USBDevice)) + { + LogWrite (FromUSBPad, LOG_ERROR, "Cannot set configuration"); + + return FALSE; + } + + if (pThis->m_ucAlternateSetting != 0) + { + if (DWHCIDeviceControlMessage (USBDeviceGetHost (&pThis->m_USBDevice), + USBDeviceGetEndpoint0 (&pThis->m_USBDevice), + REQUEST_OUT | REQUEST_TO_INTERFACE, SET_INTERFACE, + pThis->m_ucAlternateSetting, + pThis->m_ucInterfaceNumber, 0, 0) < 0) + { + LogWrite (FromUSBPad, LOG_ERROR, "Cannot set interface"); + + return FALSE; + } + } + + pThis->m_nDeviceIndex = s_nDeviceNumber++; + + if ( pUSBDevice->m_pDeviceDesc->idVendor == 0x054c + && pUSBDevice->m_pDeviceDesc->idProduct == 0x0268) + { + USBGamePadDevicePS3Configure (pThis); + } + + TString DeviceName; + String (&DeviceName); + StringFormat (&DeviceName, "upad%u", pThis->m_nDeviceIndex); + DeviceNameServiceAddDevice (DeviceNameServiceGet (), StringGet (&DeviceName), pThis, FALSE); + + _String (&DeviceName); + + return USBGamePadDeviceStartRequest (pThis); +} + +void USBGamePadDeviceRegisterStatusHandler (TUSBGamePadDevice *pThis, TGamePadStatusHandler *pStatusHandler) +{ + assert (pThis != 0); + assert (pStatusHandler != 0); + pThis->m_pStatusHandler = pStatusHandler; +} + +boolean USBGamePadDeviceStartRequest (TUSBGamePadDevice *pThis) +{ + assert (pThis != 0); + + assert (pThis->m_pEndpointIn != 0); + assert (pThis->m_pReportBuffer != 0); + + assert (pThis->m_pURB == 0); + pThis->m_pURB = malloc (sizeof (TUSBRequest)); + assert (pThis->m_pURB != 0); + USBRequest (pThis->m_pURB, pThis->m_pEndpointIn, pThis->m_pReportBuffer, pThis->m_nReportSize, 0); + USBRequestSetCompletionRoutine (pThis->m_pURB, USBGamePadDeviceCompletionRoutine, 0, pThis); + + return DWHCIDeviceSubmitAsyncRequest (USBDeviceGetHost (&pThis->m_USBDevice), pThis->m_pURB); +} + +void USBGamePadDeviceCompletionRoutine (TUSBRequest *pURB, void *pParam, void *pContext) +{ + TUSBGamePadDevice *pThis = (TUSBGamePadDevice *) pContext; + assert (pThis != 0); + + assert (pURB != 0); + assert (pThis->m_pURB == pURB); + + if ( USBRequestGetStatus (pURB) != 0 + && USBRequestGetResultLength (pURB) > 0) + { + //DebugHexdump (pThis->m_pReportBuffer, 16, "report"); + if (pThis->m_pHIDReportDescriptor != 0 && pThis->m_pStatusHandler != 0) + { + USBGamePadDeviceDecodeReport (pThis); + (*pThis->m_pStatusHandler) (pThis->m_nDeviceIndex - 1, &pThis->m_State); + } + } + + _USBRequest (pThis->m_pURB); + free (pThis->m_pURB); + pThis->m_pURB = 0; + + USBGamePadDeviceStartRequest (pThis); +} + +void USBGamePadDeviceGetReport (TUSBGamePadDevice *pThis) +{ + if (DWHCIDeviceControlMessage (USBDeviceGetHost (&pThis->m_USBDevice), + USBDeviceGetEndpoint0 (&pThis->m_USBDevice), + REQUEST_IN | REQUEST_CLASS | REQUEST_TO_INTERFACE, + GET_REPORT, (REPORT_TYPE_INPUT << 8) | 0x00, + pThis->m_ucInterfaceNumber, + pThis->m_pReportBuffer, pThis->m_nReportSize) > 0) + { + USBGamePadDeviceDecodeReport (pThis); + } +} + +void USBGamePadDevicePS3Configure (TUSBGamePadDevice *pThis) +{ + static u8 writeBuf[] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0xff, 0x27, 0x10, 0x00, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00 + }; + + static u8 leds[] = + { + 0x00, // OFF + 0x01, // LED1 + 0x02, // LED2 + 0x04, // LED3 + 0x08, // LED4 + }; + + /* Special PS3 Controller enable commands */ + pThis->m_pReportBuffer[0] = 0x42; + pThis->m_pReportBuffer[1] = 0x0c; + pThis->m_pReportBuffer[2] = 0x00; + pThis->m_pReportBuffer[3] = 0x00; + DWHCIDeviceControlMessage (USBDeviceGetHost (&pThis->m_USBDevice), + USBDeviceGetEndpoint0 (&pThis->m_USBDevice), + REQUEST_OUT | REQUEST_CLASS | REQUEST_TO_INTERFACE, + SET_REPORT, (REPORT_TYPE_FEATURE << 8) | 0xf4, + pThis->m_ucInterfaceNumber, + pThis->m_pReportBuffer, 4); + + /* Turn on LED */ + writeBuf[9] |= (u8)(leds[pThis->m_nDeviceIndex] << 1); + DWHCIDeviceControlMessage (USBDeviceGetHost (&pThis->m_USBDevice), + USBDeviceGetEndpoint0 (&pThis->m_USBDevice), + REQUEST_OUT | REQUEST_CLASS | REQUEST_TO_INTERFACE, + SET_REPORT, (REPORT_TYPE_OUTPUT << 8) | 0x01, + pThis->m_ucInterfaceNumber, + writeBuf, 48); +} diff --git a/uspi/lib/usbkeyboard.c b/uspi/lib/usbkeyboard.c new file mode 100644 index 0000000..896dd7e --- /dev/null +++ b/uspi/lib/usbkeyboard.c @@ -0,0 +1,386 @@ +// +// usbkeyboard.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014-2016 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include +#include +#include + +//#define REPEAT_ENABLE // does not work well with any Keyboard + +#define MSEC2HZ(msec) ((msec) * HZ / 1000) + +#define REPEAT_DELAY MSEC2HZ (400) +#define REPEAT_RATE MSEC2HZ (80) + +static unsigned s_nDeviceNumber = 1; + +static const char FromUSBKbd[] = "usbkbd"; + +static void USBKeyboardDeviceGenerateKeyEvent (TUSBKeyboardDevice *pThis, u8 ucPhyCode); +static boolean USBKeyboardDeviceStartRequest (TUSBKeyboardDevice *pThis); +static void USBKeyboardDeviceCompletionRoutine (TUSBRequest *pURB, void *pParam, void *pContext); +static u8 USBKeyboardDeviceGetModifiers (TUSBKeyboardDevice *pThis); +static u8 USBKeyboardDeviceGetKeyCode (TUSBKeyboardDevice *pThis); +#ifdef REPEAT_ENABLE +static void USBKeyboardDeviceTimerHandler (unsigned hTimer, void *pParam, void *pContext); +#endif + +void USBKeyboardDevice (TUSBKeyboardDevice *pThis, TUSBDevice *pDevice) +{ + assert (pThis != 0); + + USBDeviceCopy (&pThis->m_USBDevice, pDevice); + pThis->m_USBDevice.Configure = USBKeyboardDeviceConfigure; + + pThis->m_pReportEndpoint = 0; + pThis->m_pKeyPressedHandler = 0; + pThis->m_pSelectConsoleHandler = 0; + pThis->m_pShutdownHandler = 0; + pThis->m_pKeyStatusHandlerRaw = 0; + pThis->m_pURB = 0; + pThis->m_pReportBuffer = 0; + pThis->m_ucLastPhyCode = 0; + pThis->m_hTimer = 0; + + KeyMap (&pThis->m_KeyMap); + + pThis->m_pReportBuffer = malloc (BOOT_REPORT_SIZE); + assert (pThis->m_pReportBuffer != 0); +} + +void _CUSBKeyboardDevice (TUSBKeyboardDevice *pThis) +{ + assert (pThis != 0); + + if (pThis->m_pReportBuffer != 0) + { + free (pThis->m_pReportBuffer); + pThis->m_pReportBuffer = 0; + } + + if (pThis->m_pReportEndpoint != 0) + { + _USBEndpoint (pThis->m_pReportEndpoint); + free (pThis->m_pReportEndpoint); + pThis->m_pReportEndpoint = 0; + } + + _KeyMap (&pThis->m_KeyMap); + _USBDevice (&pThis->m_USBDevice); +} + +boolean USBKeyboardDeviceConfigure (TUSBDevice *pUSBDevice) +{ + TUSBKeyboardDevice *pThis = (TUSBKeyboardDevice *) pUSBDevice; + assert (pThis != 0); + + TUSBConfigurationDescriptor *pConfDesc = + (TUSBConfigurationDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_CONFIGURATION); + if ( pConfDesc == 0 + || pConfDesc->bNumInterfaces < 1) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromUSBKbd); + + return FALSE; + } + + TUSBInterfaceDescriptor *pInterfaceDesc; + while ((pInterfaceDesc = (TUSBInterfaceDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_INTERFACE)) != 0) + { + if ( pInterfaceDesc->bNumEndpoints < 1 + || pInterfaceDesc->bInterfaceClass != 0x03 // HID Class + || pInterfaceDesc->bInterfaceSubClass != 0x01 // Boot Interface Subclass + || pInterfaceDesc->bInterfaceProtocol != 0x01) // Keyboard + { + continue; + } + + pThis->m_ucInterfaceNumber = pInterfaceDesc->bInterfaceNumber; + pThis->m_ucAlternateSetting = pInterfaceDesc->bAlternateSetting; + + TUSBEndpointDescriptor *pEndpointDesc = + (TUSBEndpointDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_ENDPOINT); + if ( pEndpointDesc == 0 + || (pEndpointDesc->bEndpointAddress & 0x80) != 0x80 // Input EP + || (pEndpointDesc->bmAttributes & 0x3F) != 0x03) // Interrupt EP + { + continue; + } + + assert (pThis->m_pReportEndpoint == 0); + pThis->m_pReportEndpoint = malloc (sizeof (TUSBEndpoint)); + assert (pThis->m_pReportEndpoint != 0); + USBEndpoint2 (pThis->m_pReportEndpoint, &pThis->m_USBDevice, pEndpointDesc); + + break; + } + + if (pThis->m_pReportEndpoint == 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromUSBKbd); + + return FALSE; + } + + if (!USBDeviceConfigure (&pThis->m_USBDevice)) + { + LogWrite (FromUSBKbd, LOG_ERROR, "Cannot set configuration"); + + return FALSE; + } + + if (pThis->m_ucAlternateSetting != 0) + { + if (DWHCIDeviceControlMessage (USBDeviceGetHost (&pThis->m_USBDevice), + USBDeviceGetEndpoint0 (&pThis->m_USBDevice), + REQUEST_OUT | REQUEST_TO_INTERFACE, SET_INTERFACE, + pThis->m_ucAlternateSetting, + pThis->m_ucInterfaceNumber, 0, 0) < 0) + { + LogWrite (FromUSBKbd, LOG_ERROR, "Cannot set interface"); + + return FALSE; + } + } + + if (DWHCIDeviceControlMessage (USBDeviceGetHost (&pThis->m_USBDevice), + USBDeviceGetEndpoint0 (&pThis->m_USBDevice), + REQUEST_OUT | REQUEST_CLASS | REQUEST_TO_INTERFACE, + SET_PROTOCOL, BOOT_PROTOCOL, + pThis->m_ucInterfaceNumber, 0, 0) < 0) + { + LogWrite (FromUSBKbd, LOG_ERROR, "Cannot set boot protocol"); + + return FALSE; + } + + TString DeviceName; + String (&DeviceName); + StringFormat (&DeviceName, "ukbd%u", s_nDeviceNumber++); + DeviceNameServiceAddDevice (DeviceNameServiceGet (), StringGet (&DeviceName), pThis, FALSE); + + _String (&DeviceName); + + return USBKeyboardDeviceStartRequest (pThis); +} + +void USBKeyboardDeviceRegisterKeyPressedHandler (TUSBKeyboardDevice *pThis, TKeyPressedHandler *pKeyPressedHandler) +{ + assert (pThis != 0); + assert (pKeyPressedHandler != 0); + pThis->m_pKeyPressedHandler = pKeyPressedHandler; +} + +void USBKeyboardDeviceRegisterSelectConsoleHandler (TUSBKeyboardDevice *pThis, TSelectConsoleHandler *pSelectConsoleHandler) +{ + assert (pThis != 0); + assert (pSelectConsoleHandler != 0); + pThis->m_pSelectConsoleHandler = pSelectConsoleHandler; +} + +void USBKeyboardDeviceRegisterShutdownHandler (TUSBKeyboardDevice *pThis, TShutdownHandler *pShutdownHandler) +{ + assert (pThis != 0); + assert (pShutdownHandler != 0); + pThis->m_pShutdownHandler = pShutdownHandler; +} + +void USBKeyboardDeviceRegisterKeyStatusHandlerRaw (TUSBKeyboardDevice *pThis, TKeyStatusHandlerRaw *pKeyStatusHandlerRaw) +{ + assert (pThis != 0); + assert (pKeyStatusHandlerRaw != 0); + pThis->m_pKeyStatusHandlerRaw = pKeyStatusHandlerRaw; +} + +void USBKeyboardDeviceGenerateKeyEvent (TUSBKeyboardDevice *pThis, u8 ucPhyCode) +{ + assert (pThis != 0); + + const char *pKeyString; + char Buffer[2]; + + u8 ucModifiers = USBKeyboardDeviceGetModifiers (pThis); + u16 usLogCode = KeyMapTranslate (&pThis->m_KeyMap, ucPhyCode, ucModifiers); + + switch (usLogCode) + { + case ActionSwitchCapsLock: + case ActionSwitchNumLock: + case ActionSwitchScrollLock: + break; + + case ActionSelectConsole1: + case ActionSelectConsole2: + case ActionSelectConsole3: + case ActionSelectConsole4: + case ActionSelectConsole5: + case ActionSelectConsole6: + case ActionSelectConsole7: + case ActionSelectConsole8: + case ActionSelectConsole9: + case ActionSelectConsole10: + case ActionSelectConsole11: + case ActionSelectConsole12: + if (pThis->m_pSelectConsoleHandler != 0) + { + unsigned nConsole = usLogCode - ActionSelectConsole1; + assert (nConsole < 12); + + (*pThis->m_pSelectConsoleHandler) (nConsole); + } + break; + + case ActionShutdown: + if (pThis->m_pShutdownHandler != 0) + { + (*pThis->m_pShutdownHandler) (); + } + break; + + default: + pKeyString = KeyMapGetString (&pThis->m_KeyMap, usLogCode, ucModifiers, Buffer); + if (pKeyString != 0) + { + if (pThis->m_pKeyPressedHandler != 0) + { + (*pThis->m_pKeyPressedHandler) (pKeyString); + } + } + break; + } +} + +boolean USBKeyboardDeviceStartRequest (TUSBKeyboardDevice *pThis) +{ + assert (pThis != 0); + + assert (pThis->m_pReportEndpoint != 0); + assert (pThis->m_pReportBuffer != 0); + + assert (pThis->m_pURB == 0); + pThis->m_pURB = malloc (sizeof (TUSBRequest)); + assert (pThis->m_pURB != 0); + USBRequest (pThis->m_pURB, pThis->m_pReportEndpoint, pThis->m_pReportBuffer, BOOT_REPORT_SIZE, 0); + USBRequestSetCompletionRoutine (pThis->m_pURB, USBKeyboardDeviceCompletionRoutine, 0, pThis); + + return DWHCIDeviceSubmitAsyncRequest (USBDeviceGetHost (&pThis->m_USBDevice), pThis->m_pURB); +} + +void USBKeyboardDeviceCompletionRoutine (TUSBRequest *pURB, void *pParam, void *pContext) +{ + TUSBKeyboardDevice *pThis = (TUSBKeyboardDevice *) pContext; + assert (pThis != 0); + + assert (pURB != 0); + assert (pThis->m_pURB == pURB); + + if ( USBRequestGetStatus (pURB) != 0 + && USBRequestGetResultLength (pURB) == BOOT_REPORT_SIZE) + { + if (pThis->m_pKeyStatusHandlerRaw != 0) + { + //LogWrite(FromUSBKbd, LOG_ERROR, "USBKeyboardDeviceCompletionRoutine\\r\n"); + + (*pThis->m_pKeyStatusHandlerRaw) (pThis, USBKeyboardDeviceGetModifiers (pThis), pThis->m_pReportBuffer+2); + } + else + { + u8 ucPhyCode = USBKeyboardDeviceGetKeyCode (pThis); + + if (ucPhyCode == pThis->m_ucLastPhyCode) + { + ucPhyCode = 0; + } + else + { + pThis->m_ucLastPhyCode = ucPhyCode; + } + + if (ucPhyCode != 0) + { + USBKeyboardDeviceGenerateKeyEvent (pThis, ucPhyCode); +#ifdef REPEAT_ENABLE + if (pThis->m_hTimer != 0) + { + CancelKernelTimer (pThis->m_hTimer); + } + + pThis->m_hTimer = StartKernelTimer (REPEAT_DELAY, USBKeyboardDeviceTimerHandler, 0, pThis); + assert (pThis->m_hTimer != 0); +#endif + } + else if (pThis->m_hTimer != 0) + { + CancelKernelTimer (pThis->m_hTimer); + pThis->m_hTimer = 0; + } + } + } + + _USBRequest (pThis->m_pURB); + free (pThis->m_pURB); + pThis->m_pURB = 0; + + USBKeyboardDeviceStartRequest (pThis); +} + +u8 USBKeyboardDeviceGetModifiers (TUSBKeyboardDevice *pThis) +{ + assert (pThis != 0); + return pThis->m_pReportBuffer[0]; +} + +u8 USBKeyboardDeviceGetKeyCode (TUSBKeyboardDevice *pThis) +{ + assert (pThis != 0); + + for (unsigned i = 7; i >= 2; i--) + { + u8 ucKeyCode = pThis->m_pReportBuffer[i]; + if (ucKeyCode != 0) + { + return ucKeyCode; + } + } + + return 0; +} + +#ifdef REPEAT_ENABLE + +void USBKeyboardDeviceTimerHandler (unsigned hTimer, void *pParam, void *pContext) +{ + TUSBKeyboardDevice *pThis = (TUSBKeyboardDevice *) pContext; + assert (pThis != 0); + + assert (hTimer == pThis->m_hTimer); + + if (pThis->m_ucLastPhyCode != 0) + { + USBKeyboardDeviceGenerateKeyEvent (pThis, pThis->m_ucLastPhyCode); + + pThis->m_hTimer = StartKernelTimer (REPEAT_RATE, USBKeyboardDeviceTimerHandler, 0, pThis); + assert (pThis->m_hTimer != 0); + } +} + +#endif diff --git a/uspi/lib/usbmassdevice.c b/uspi/lib/usbmassdevice.c new file mode 100644 index 0000000..705720b --- /dev/null +++ b/uspi/lib/usbmassdevice.c @@ -0,0 +1,696 @@ +// +// usbmassdevice.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include +#include +#include +#include + +// USB Mass Storage Bulk-Only Transport + +// Command Block Wrapper +typedef struct TCBW +{ + unsigned int dCWBSignature, +#define CBWSIGNATURE 0x43425355 + dCWBTag, + dCBWDataTransferLength; // number of bytes + unsigned char bmCBWFlags, +#define CBWFLAGS_DATA_IN 0x80 + bCBWLUN : 4, +#define CBWLUN 0 + Reserved1 : 4, + bCBWCBLength : 5, // valid length of the CBWCB in bytes + Reserved2 : 3; + unsigned char CBWCB[16]; +} +PACKED TCBW; + +// Command Status Wrapper +typedef struct TCSW +{ + unsigned int dCSWSignature, +#define CSWSIGNATURE 0x53425355 + dCSWTag, + dCSWDataResidue; // difference in amount of data processed + unsigned char bCSWStatus; +#define CSWSTATUS_PASSED 0x00 +#define CSWSTATUS_FAILED 0x01 +#define CSWSTATUS_PHASE_ERROR 0x02 +} +PACKED TCSW; + +// SCSI Transparent Command Set + +#define SCSI_CONTROL 0x00 + +typedef struct TSCSIInquiry +{ + unsigned char OperationCode, +#define SCSI_OP_INQUIRY 0x12 + LogicalUnitNumberEVPD, + PageCode, + Reserved, + AllocationLength, + Control; +} +PACKED TSCSIInquiry; + +typedef struct TSCSIInquiryResponse +{ + unsigned char PeripheralDeviceType : 5, +#define SCSI_PDT_DIRECT_ACCESS_BLOCK 0x00 // SBC-2 command set (or above) +#define SCSI_PDT_DIRECT_ACCESS_RBC 0x0E // RBC command set + PeripheralQualifier : 3, // 0: device is connected to this LUN + DeviceTypeModifier : 7, + RMB : 1, // 1: removable media + ANSIApprovedVersion : 3, + ECMAVersion : 3, + ISOVersion : 2, + Reserved1, + AdditionalLength, + Reserved2[3], + VendorIdentification[8], + ProductIdentification[16], + ProductRevisionLevel[4]; +} +PACKED TSCSIInquiryResponse; + +typedef struct TSCSITestUnitReady +{ + unsigned char OperationCode; +#define SCSI_OP_TEST_UNIT_READY 0x00 + unsigned int Reserved; + unsigned char Control; +} +PACKED TSCSITestUnitReady; + +typedef struct TSCSIRequestSense +{ + unsigned char OperationCode; +#define SCSI_REQUEST_SENSE 0x03 + unsigned char DescriptorFormat : 1, // set to 0 + Reserved1 : 7; + unsigned short Reserved2; + unsigned char AllocationLength; + unsigned char Control; +} +PACKED TSCSIRequestSense; + +typedef struct TSCSIRequestSenseResponse7x +{ + unsigned char ResponseCode : 7, + Valid : 1; + unsigned char Obsolete; + unsigned char SenseKey : 4, + Reserved : 1, + ILI : 1, + EOM : 1, + FileMark : 1; + unsigned int Information; // big endian + unsigned char AdditionalSenseLength; + unsigned int CommandSpecificInformation; // big endian + unsigned char AdditionalSenseCode; + unsigned char AdditionalSenseCodeQualifier; + unsigned char FieldReplaceableUnitCode; + unsigned char SenseKeySpecificHigh : 7, + SKSV : 1; + unsigned short SenseKeySpecificLow; +} +PACKED TSCSIRequestSenseResponse7x; + +typedef struct TSCSIReadCapacity10 +{ + unsigned char OperationCode; +#define SCSI_OP_READ_CAPACITY10 0x25 + unsigned char Obsolete : 1, + Reserved1 : 7; + unsigned int LogicalBlockAddress; // set to 0 + unsigned short Reserved2; + unsigned char PartialMediumIndicator : 1, // set to 0 + Reserved3 : 7; + unsigned char Control; +} +PACKED TSCSIReadCapacity10; + +typedef struct TSCSIReadCapacityResponse +{ + unsigned int ReturnedLogicalBlockAddress; // big endian + unsigned int BlockLengthInBytes; // big endian +} +PACKED TSCSIReadCapacityResponse; + +typedef struct TSCSIRead10 +{ + unsigned char OperationCode, +#define SCSI_OP_READ 0x28 + Reserved1; + unsigned int LogicalBlockAddress; // big endian + unsigned char Reserved2; + unsigned short TransferLength; // block count, big endian + unsigned char Control; +} +PACKED TSCSIRead10; + +typedef struct TSCSIWrite10 +{ + unsigned char OperationCode, +#define SCSI_OP_WRITE 0x2A + Flags; +#define SCSI_WRITE_FUA 0x08 + unsigned int LogicalBlockAddress; // big endian + unsigned char Reserved; + unsigned short TransferLength; // block count, big endian + unsigned char Control; +} +PACKED TSCSIWrite10; + +static unsigned s_nDeviceNumber = 1; + +static const char FromUmsd[] = "umsd"; + +int USBBulkOnlyMassStorageDeviceTryRead (TUSBBulkOnlyMassStorageDevice *pThis, void *pBuffer, unsigned nCount); +int USBBulkOnlyMassStorageDeviceTryWrite (TUSBBulkOnlyMassStorageDevice *pThis, const void *pBuffer, unsigned nCount); +int USBBulkOnlyMassStorageDeviceCommand (TUSBBulkOnlyMassStorageDevice *pThis, + void *pCmdBlk, unsigned nCmdBlkLen, + void *pBuffer, unsigned nBufLen, boolean bIn); +int USBBulkOnlyMassStorageDeviceReset (TUSBBulkOnlyMassStorageDevice *pThis); + +void USBBulkOnlyMassStorageDevice (TUSBBulkOnlyMassStorageDevice *pThis, TUSBDevice *pDevice) +{ + assert (pThis != 0); + + USBDeviceCopy (&pThis->m_USBDevice, pDevice); + pThis->m_USBDevice.Configure = USBBulkOnlyMassStorageDeviceConfigure; + + pThis->m_pEndpointIn = 0; + pThis->m_pEndpointOut = 0; + pThis->m_nCWBTag = 0; + pThis->m_nBlockCount = 0; + pThis->m_ullOffset = 0; +} + +void _USBBulkOnlyMassStorageDevice (TUSBBulkOnlyMassStorageDevice *pThis) +{ + assert (pThis != 0); + + if (pThis->m_pEndpointOut != 0) + { + _USBEndpoint (pThis->m_pEndpointOut); + free (pThis->m_pEndpointOut); + pThis->m_pEndpointOut = 0; + } + + if (pThis->m_pEndpointIn != 0) + { + _USBEndpoint (pThis->m_pEndpointIn); + free (pThis->m_pEndpointIn); + pThis->m_pEndpointIn = 0; + } + + _USBDevice (&pThis->m_USBDevice); +} + +boolean USBBulkOnlyMassStorageDeviceConfigure (TUSBDevice *pUSBDevice) +{ + TUSBBulkOnlyMassStorageDevice *pThis = (TUSBBulkOnlyMassStorageDevice *) pUSBDevice; + assert (pThis != 0); + + TUSBConfigurationDescriptor *pConfDesc = + (TUSBConfigurationDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_CONFIGURATION); + if ( pConfDesc == 0 + || pConfDesc->bNumInterfaces < 1) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromUmsd); + + return FALSE; + } + + TUSBInterfaceDescriptor *pInterfaceDesc = + (TUSBInterfaceDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_INTERFACE); + if ( pInterfaceDesc == 0 + || pInterfaceDesc->bInterfaceNumber != 0x00 + || pInterfaceDesc->bAlternateSetting != 0x00 + || pInterfaceDesc->bNumEndpoints < 2 + || pInterfaceDesc->bInterfaceClass != 0x08 // Mass Storage Class + || pInterfaceDesc->bInterfaceSubClass != 0x06 // SCSI Transparent Command Set + || pInterfaceDesc->bInterfaceProtocol != 0x50) // Bulk-Only Transport + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromUmsd); + + return FALSE; + } + + const TUSBEndpointDescriptor *pEndpointDesc; + while ((pEndpointDesc = (TUSBEndpointDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_ENDPOINT)) != 0) + { + if ((pEndpointDesc->bmAttributes & 0x3F) == 0x02) // Bulk + { + if ((pEndpointDesc->bEndpointAddress & 0x80) == 0x80) // Input + { + if (pThis->m_pEndpointIn != 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromUmsd); + + return FALSE; + } + + pThis->m_pEndpointIn = (TUSBEndpoint *) malloc (sizeof (TUSBEndpoint)); + assert (pThis->m_pEndpointIn != 0); + USBEndpoint2 (pThis->m_pEndpointIn, &pThis->m_USBDevice, pEndpointDesc); + } + else // Output + { + if (pThis->m_pEndpointOut != 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromUmsd); + + return FALSE; + } + + pThis->m_pEndpointOut = (TUSBEndpoint *) malloc (sizeof (TUSBEndpoint)); + assert (pThis->m_pEndpointOut != 0); + USBEndpoint2 (pThis->m_pEndpointOut, &pThis->m_USBDevice, pEndpointDesc); + } + } + } + + if ( pThis->m_pEndpointIn == 0 + || pThis->m_pEndpointOut == 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromUmsd); + + return FALSE; + } + + if (!USBDeviceConfigure (&pThis->m_USBDevice)) + { + LogWrite (FromUmsd, LOG_ERROR, "Cannot set configuration"); + + return FALSE; + } + + TSCSIInquiry SCSIInquiry; + SCSIInquiry.OperationCode = SCSI_OP_INQUIRY; + SCSIInquiry.LogicalUnitNumberEVPD = 0; + SCSIInquiry.PageCode = 0; + SCSIInquiry.Reserved = 0; + SCSIInquiry.AllocationLength = sizeof (TSCSIInquiryResponse); + SCSIInquiry.Control = SCSI_CONTROL; + + TSCSIInquiryResponse SCSIInquiryResponse; + if (USBBulkOnlyMassStorageDeviceCommand (pThis, &SCSIInquiry, sizeof SCSIInquiry, + &SCSIInquiryResponse, sizeof SCSIInquiryResponse, + TRUE) != (int) sizeof SCSIInquiryResponse) + { + LogWrite (FromUmsd, LOG_ERROR, "Device does not respond"); + + return FALSE; + } + + if (SCSIInquiryResponse.PeripheralDeviceType != SCSI_PDT_DIRECT_ACCESS_BLOCK) + { + LogWrite (FromUmsd, LOG_ERROR, "Unsupported device type: 0x%02X", (unsigned) SCSIInquiryResponse.PeripheralDeviceType); + + return FALSE; + } + + unsigned nTries = 100; + while (--nTries) + { + TSCSITestUnitReady SCSITestUnitReady; + SCSITestUnitReady.OperationCode = SCSI_OP_TEST_UNIT_READY; + SCSITestUnitReady.Reserved = 0; + SCSITestUnitReady.Control = SCSI_CONTROL; + + if (USBBulkOnlyMassStorageDeviceCommand (pThis, &SCSITestUnitReady, + sizeof SCSITestUnitReady, 0, 0, FALSE) >= 0) + { + break; + } + + TSCSIRequestSense SCSIRequestSense; + SCSIRequestSense.OperationCode = SCSI_REQUEST_SENSE; + SCSIRequestSense.DescriptorFormat = 0; + SCSIRequestSense.Reserved1 = 0; + SCSIRequestSense.Reserved2 = 0; + SCSIRequestSense.AllocationLength = sizeof (TSCSIRequestSenseResponse7x); + SCSIRequestSense.Control = SCSI_CONTROL; + + TSCSIRequestSenseResponse7x SCSIRequestSenseResponse7x; + if (USBBulkOnlyMassStorageDeviceCommand (pThis, &SCSIRequestSense, sizeof SCSIRequestSense, + &SCSIRequestSenseResponse7x, sizeof SCSIRequestSenseResponse7x, + TRUE) < 0) + { + LogWrite (FromUmsd, LOG_ERROR, "Request sense failed"); + + return FALSE; + } + + MsDelay (100); + } + + if (nTries == 0) + { + LogWrite (FromUmsd, LOG_ERROR, "Unit is not ready"); + + return FALSE; + } + + TSCSIReadCapacity10 SCSIReadCapacity; + SCSIReadCapacity.OperationCode = SCSI_OP_READ_CAPACITY10; + SCSIReadCapacity.Obsolete = 0; + SCSIReadCapacity.Reserved1 = 0; + SCSIReadCapacity.LogicalBlockAddress = 0; + SCSIReadCapacity.Reserved2 = 0; + SCSIReadCapacity.PartialMediumIndicator = 0; + SCSIReadCapacity.Reserved3 = 0; + SCSIReadCapacity.Control = SCSI_CONTROL; + + TSCSIReadCapacityResponse SCSIReadCapacityResponse; + if (USBBulkOnlyMassStorageDeviceCommand (pThis, &SCSIReadCapacity, sizeof SCSIReadCapacity, + &SCSIReadCapacityResponse, sizeof SCSIReadCapacityResponse, + TRUE) != (int) sizeof SCSIReadCapacityResponse) + { + LogWrite (FromUmsd, LOG_ERROR, "Read capacity failed"); + + return FALSE; + } + + unsigned nBlockSize = uspi_le2be32 (SCSIReadCapacityResponse.BlockLengthInBytes); + if (nBlockSize != UMSD_BLOCK_SIZE) + { + LogWrite (FromUmsd, LOG_ERROR, "Unsupported block size: %u", nBlockSize); + + return FALSE; + } + + pThis->m_nBlockCount = uspi_le2be32 (SCSIReadCapacityResponse.ReturnedLogicalBlockAddress); + if (pThis->m_nBlockCount == (u32) -1) + { + LogWrite (FromUmsd, LOG_ERROR, "Unsupported disk size > 2TB"); + + return FALSE; + } + + pThis->m_nBlockCount++; + + LogWrite (FromUmsd, LOG_DEBUG, "Capacity is %u MByte", pThis->m_nBlockCount / (0x100000 / UMSD_BLOCK_SIZE)); + + TString DeviceName; + String (&DeviceName); + StringFormat (&DeviceName, "umsd%u", s_nDeviceNumber++); + DeviceNameServiceAddDevice (DeviceNameServiceGet (), StringGet (&DeviceName), pThis, TRUE); + + _String (&DeviceName); + + return TRUE; +} + +int USBBulkOnlyMassStorageDeviceRead (TUSBBulkOnlyMassStorageDevice *pThis, void *pBuffer, unsigned nCount) +{ + assert (pThis != 0); + + unsigned nTries = 4; + + int nResult; + + do + { + nResult = USBBulkOnlyMassStorageDeviceTryRead (pThis, pBuffer, nCount); + + if (nResult != (int) nCount) + { + int nStatus = USBBulkOnlyMassStorageDeviceReset (pThis); + if (nStatus != 0) + { + return nStatus; + } + } + } + while ( nResult != (int) nCount + && --nTries > 0); + + return nResult; +} + +int USBBulkOnlyMassStorageDeviceWrite (TUSBBulkOnlyMassStorageDevice *pThis, const void *pBuffer, unsigned nCount) +{ + assert (pThis != 0); + + unsigned nTries = 4; + + int nResult; + + do + { + nResult = USBBulkOnlyMassStorageDeviceTryWrite (pThis, pBuffer, nCount); + + if (nResult != (int) nCount) + { + int nStatus = USBBulkOnlyMassStorageDeviceReset (pThis); + if (nStatus != 0) + { + return nStatus; + } + } + } + while ( nResult != (int) nCount + && --nTries > 0); + + return nResult; +} + +unsigned long long USBBulkOnlyMassStorageDeviceSeek (TUSBBulkOnlyMassStorageDevice *pThis, unsigned long long ullOffset) +{ + assert (pThis != 0); + + pThis->m_ullOffset = ullOffset; + + return pThis->m_ullOffset; +} + +unsigned USBBulkOnlyMassStorageDeviceGetCapacity (TUSBBulkOnlyMassStorageDevice *pThis) +{ + assert (pThis != 0); + + return pThis->m_nBlockCount; +} + +int USBBulkOnlyMassStorageDeviceTryRead (TUSBBulkOnlyMassStorageDevice *pThis, void *pBuffer, unsigned nCount) +{ + assert (pThis != 0); + + assert (pBuffer != 0); + + if ( (pThis->m_ullOffset & UMSD_BLOCK_MASK) != 0 + || pThis->m_ullOffset > UMSD_MAX_OFFSET) + { + return -1; + } + unsigned nBlockAddress = (unsigned) (pThis->m_ullOffset >> UMSD_BLOCK_SHIFT); + + if ((nCount & UMSD_BLOCK_MASK) != 0) + { + return -1; + } + unsigned short usTransferLength = (unsigned short) (nCount >> UMSD_BLOCK_SHIFT); + + //LogWrite (FromUmsd, LOG_DEBUG, "TryRead %u/0x%X/%u", nBlockAddress, (unsigned) pBuffer, (unsigned) usTransferLength); + + TSCSIRead10 SCSIRead; + SCSIRead.OperationCode = SCSI_OP_READ; + SCSIRead.Reserved1 = 0; + SCSIRead.LogicalBlockAddress = uspi_le2be32 (nBlockAddress); + SCSIRead.Reserved2 = 0; + SCSIRead.TransferLength = uspi_le2be16 (usTransferLength); + SCSIRead.Control = SCSI_CONTROL; + + if (USBBulkOnlyMassStorageDeviceCommand (pThis, &SCSIRead, sizeof SCSIRead, + pBuffer, nCount, + TRUE) != (int) nCount) + { + LogWrite (FromUmsd, LOG_ERROR, "TryRead failed"); + + return -1; + } + + return nCount; +} + +int USBBulkOnlyMassStorageDeviceTryWrite (TUSBBulkOnlyMassStorageDevice *pThis, const void *pBuffer, unsigned nCount) +{ + assert (pThis != 0); + + assert (pBuffer != 0); + + if ( (pThis->m_ullOffset & UMSD_BLOCK_MASK) != 0 + || pThis->m_ullOffset > UMSD_MAX_OFFSET) + { + return -1; + } + unsigned nBlockAddress = (unsigned) (pThis->m_ullOffset >> UMSD_BLOCK_SHIFT); + + if ((nCount & UMSD_BLOCK_MASK) != 0) + { + return -1; + } + unsigned short usTransferLength = (unsigned short) (nCount >> UMSD_BLOCK_SHIFT); + + //LogWrite (FromUmsd, LOG_DEBUG, "TryWrite %u/0x%X/%u", nBlockAddress, (unsigned) pBuffer, (unsigned) usTransferLength); + + TSCSIWrite10 SCSIWrite; + SCSIWrite.OperationCode = SCSI_OP_WRITE; + SCSIWrite.Flags = SCSI_WRITE_FUA; + SCSIWrite.LogicalBlockAddress = uspi_le2be32 (nBlockAddress); + SCSIWrite.Reserved = 0; + SCSIWrite.TransferLength = uspi_le2be16 (usTransferLength); + SCSIWrite.Control = SCSI_CONTROL; + + if (USBBulkOnlyMassStorageDeviceCommand (pThis, &SCSIWrite, sizeof SCSIWrite, + (void *) pBuffer, nCount, + FALSE) < 0) + { + LogWrite (FromUmsd, LOG_ERROR, "TryWrite failed"); + + return -1; + } + + return nCount; +} + +int USBBulkOnlyMassStorageDeviceCommand (TUSBBulkOnlyMassStorageDevice *pThis, + void *pCmdBlk, unsigned nCmdBlkLen, + void *pBuffer, unsigned nBufLen, boolean bIn) +{ + assert (pThis != 0); + + assert (pCmdBlk != 0); + assert (6 <= nCmdBlkLen && nCmdBlkLen <= 16); + assert (nBufLen == 0 || pBuffer != 0); + + TCBW CBW; + memset (&CBW, 0, sizeof CBW); + + CBW.dCWBSignature = CBWSIGNATURE; + CBW.dCWBTag = ++pThis->m_nCWBTag; + CBW.dCBWDataTransferLength = nBufLen; + CBW.bmCBWFlags = bIn ? CBWFLAGS_DATA_IN : 0; + CBW.bCBWLUN = CBWLUN; + CBW.bCBWCBLength = (u8) nCmdBlkLen; + + memcpy (CBW.CBWCB, pCmdBlk, nCmdBlkLen); + + TUSBHostController *pHost = USBDeviceGetHost (&pThis->m_USBDevice); + assert (pHost != 0); + + if (DWHCIDeviceTransfer (pHost, pThis->m_pEndpointOut, &CBW, sizeof CBW) < 0) + { + LogWrite (FromUmsd, LOG_ERROR, "CBW transfer failed"); + + return -1; + } + + int nResult = 0; + + if (nBufLen > 0) + { + nResult = DWHCIDeviceTransfer (pHost, bIn ? pThis->m_pEndpointIn : pThis->m_pEndpointOut, pBuffer, nBufLen); + if (nResult < 0) + { + LogWrite (FromUmsd, LOG_ERROR, "Data transfer failed"); + + return -1; + } + } + + TCSW CSW; + + if (DWHCIDeviceTransfer (pHost, pThis->m_pEndpointIn, &CSW, sizeof CSW) != (int) sizeof CSW) + { + LogWrite (FromUmsd, LOG_ERROR, "CSW transfer failed"); + + return -1; + } + + if (CSW.dCSWSignature != CSWSIGNATURE) + { + LogWrite (FromUmsd, LOG_ERROR, "CSW signature is wrong"); + + return -1; + } + + if (CSW.dCSWTag != pThis->m_nCWBTag) + { + LogWrite (FromUmsd, LOG_ERROR, "CSW tag is wrong"); + + return -1; + } + + if (CSW.bCSWStatus != CSWSTATUS_PASSED) + { + return -1; + } + + if (CSW.dCSWDataResidue != 0) + { + LogWrite (FromUmsd, LOG_ERROR, "Data residue is not 0"); + + return -1; + } + + return nResult; +} + +int USBBulkOnlyMassStorageDeviceReset (TUSBBulkOnlyMassStorageDevice *pThis) +{ + assert (pThis != 0); + + TUSBHostController *pHost = USBDeviceGetHost (&pThis->m_USBDevice); + assert (pHost != 0); + + if (DWHCIDeviceControlMessage (pHost, USBDeviceGetEndpoint0 (&pThis->m_USBDevice), 0x21, 0xFF, 0, 0x00, 0, 0) < 0) + { + LogWrite (FromUmsd, LOG_DEBUG, "Cannot reset device"); + + return -1; + } + + if (DWHCIDeviceControlMessage (pHost, USBDeviceGetEndpoint0 (&pThis->m_USBDevice), 0x02, 1, 0, 1, 0, 0) < 0) + { + LogWrite (FromUmsd, LOG_DEBUG, "Cannot clear halt on endpoint 1"); + + return -1; + } + + if (DWHCIDeviceControlMessage (pHost, USBDeviceGetEndpoint0 (&pThis->m_USBDevice), 0x02, 1, 0, 2, 0, 0) < 0) + { + LogWrite (FromUmsd, LOG_DEBUG, "Cannot clear halt on endpoint 2"); + + return -1; + } + + USBEndpointResetPID (pThis->m_pEndpointIn); + USBEndpointResetPID (pThis->m_pEndpointOut); + + return 0; +} diff --git a/uspi/lib/usbmidi.c b/uspi/lib/usbmidi.c new file mode 100644 index 0000000..cde6873 --- /dev/null +++ b/uspi/lib/usbmidi.c @@ -0,0 +1,224 @@ +// +// usbmidi.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2016 R. Stange +// Copyright (C) 2016 J. Otto +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +// Refer to "Universal Serial Bus Device Class Specification for MIDI Devices" + +#include +#include +#include +#include +#include + +static const char FromMIDI[] = "umidi"; + +static unsigned s_nDeviceNumber = 1; + +static boolean USBMIDIDeviceStartRequest (TUSBMIDIDevice *pThis); +static void USBMIDIDeviceCompletionRoutine (TUSBRequest *pURB, void *pParam, void *pContext); + +// This handy table from the Linux driver encodes the mapping between MIDI +// packet Code Index Number values and encapsulated packet lengths. +static const unsigned cin_to_length[] = { + 0, 0, 2, 3, 3, 1, 2, 3, 3, 3, 3, 3, 2, 2, 3, 1 +}; + +#define EVENT_PACKET_SIZE 4 + +void USBMIDIDevice (TUSBMIDIDevice *pThis, TUSBDevice *pDevice) +{ + assert (pThis != 0); + + USBDeviceCopy (&pThis->m_USBDevice, pDevice); + pThis->m_USBDevice.Configure = USBMIDIDeviceConfigure; + + pThis->m_pEndpointIn = 0; + pThis->m_pPacketHandler = 0; + pThis->m_pURB = 0; + pThis->m_pPacketBuffer = 0; +} + +void _CUSBMIDIDevice (TUSBMIDIDevice *pThis) +{ + assert (pThis != 0); + + if (pThis->m_pPacketBuffer != 0) + { + free (pThis->m_pPacketBuffer); + pThis->m_pPacketBuffer = 0; + } + + if (pThis->m_pEndpointIn != 0) + { + _USBEndpoint (pThis->m_pEndpointIn); + free (pThis->m_pEndpointIn); + pThis->m_pEndpointIn = 0; + } + + _USBDevice (&pThis->m_USBDevice); +} + +boolean USBMIDIDeviceConfigure (TUSBDevice *pUSBDevice) +{ + TUSBMIDIDevice *pThis = (TUSBMIDIDevice *)pUSBDevice; + assert (pThis != 0); + + TUSBConfigurationDescriptor *pConfDesc = + (TUSBConfigurationDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_CONFIGURATION); + if ( pConfDesc == 0 + || pConfDesc->bNumInterfaces < 1) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromMIDI); + + return FALSE; + } + + TUSBInterfaceDescriptor *pInterfaceDesc; + while ((pInterfaceDesc = (TUSBInterfaceDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_INTERFACE)) != 0) + { + if ( pInterfaceDesc->bNumEndpoints == 0 + || pInterfaceDesc->bInterfaceClass != 0x01 // Audio class + || pInterfaceDesc->bInterfaceSubClass != 0x03 // MIDI streaming + || pInterfaceDesc->bInterfaceProtocol != 0x00) // unused, must be 0 + { + continue; + } + + // Our strategy for now is simple: we'll take the first MIDI streaming + // bulk-in endpoint on this interface we can find. To distinguish + // between the MIDI streaming bulk-in endpoints we want (which carry + // actual MIDI data streams) and 'transfer bulk data' endpoints (which + // are used to implement features like Downloadable Samples that we + // don't care about), we'll look for an immediately-accompanying + // class-specific endpoint descriptor. + TUSBAudioEndpointDescriptor *pEndpointDesc; + while ((pEndpointDesc = (TUSBAudioEndpointDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_ENDPOINT)) != 0) + { + if ( (pEndpointDesc->bEndpointAddress & 0x80) != 0x80 // Input EP + || (pEndpointDesc->bmAttributes & 0x3F) != 0x02) // Bulk EP + { + continue; + } + + TUSBMIDIStreamingEndpointDescriptor *pMIDIDesc = + (TUSBMIDIStreamingEndpointDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_CS_ENDPOINT); + if ( pMIDIDesc == 0 + || (u8 *)pEndpointDesc + pEndpointDesc->bLength != (u8 *)pMIDIDesc) + { + continue; + } + + assert (pThis->m_pEndpointIn == 0); + pThis->m_pEndpointIn = malloc (sizeof (TUSBEndpoint)); + assert (pThis->m_pEndpointIn != 0); + + pThis->m_usBufferSize = pEndpointDesc->wMaxPacketSize; + pThis->m_usBufferSize -= pEndpointDesc->wMaxPacketSize % EVENT_PACKET_SIZE; + assert (pThis->m_pPacketBuffer == 0); + pThis->m_pPacketBuffer = malloc (pThis->m_usBufferSize); + assert (pThis->m_pPacketBuffer != 0); + + USBEndpoint2 (pThis->m_pEndpointIn, &pThis->m_USBDevice, (TUSBEndpointDescriptor *) pEndpointDesc); + } + } + + if (pThis->m_pEndpointIn == 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromMIDI); + + return FALSE; + } + + if (!USBDeviceConfigure (&pThis->m_USBDevice)) + { + LogWrite (FromMIDI, LOG_ERROR, "Cannot set configuration"); + + return FALSE; + } + + TString DeviceName; + String (&DeviceName); + StringFormat (&DeviceName, "umidi%u", s_nDeviceNumber++); + DeviceNameServiceAddDevice (DeviceNameServiceGet (), StringGet (&DeviceName), pThis, FALSE); + + _String(&DeviceName); + + return USBMIDIDeviceStartRequest (pThis); +} + +void USBMIDIDeviceRegisterPacketHandler (TUSBMIDIDevice *pThis, TMIDIPacketHandler *pPacketHandler) +{ + assert (pThis != 0); + assert (pPacketHandler != 0); + pThis->m_pPacketHandler = pPacketHandler; +} + +boolean USBMIDIDeviceStartRequest (TUSBMIDIDevice *pThis) +{ + assert (pThis != 0); + + assert (pThis->m_pEndpointIn != 0); + assert (pThis->m_pPacketBuffer != 0); + + assert (pThis->m_pURB == 0); + pThis->m_pURB = malloc (sizeof (TUSBRequest)); + assert (pThis->m_pURB != 0); + USBRequest (pThis->m_pURB, pThis->m_pEndpointIn, pThis->m_pPacketBuffer, pThis->m_usBufferSize, 0); + USBRequestSetCompletionRoutine (pThis->m_pURB, USBMIDIDeviceCompletionRoutine, 0, pThis); + + return DWHCIDeviceSubmitAsyncRequest (USBDeviceGetHost (&pThis->m_USBDevice), pThis->m_pURB); +} + +void USBMIDIDeviceCompletionRoutine (TUSBRequest *pURB, void *pParam, void *pContext) +{ + TUSBMIDIDevice *pThis = (TUSBMIDIDevice *) pContext; + assert (pThis != 0); + + assert (pURB != 0); + assert (pThis->m_pURB == pURB); + + if ( USBRequestGetStatus (pURB) != 0 + && USBRequestGetResultLength (pURB) % EVENT_PACKET_SIZE == 0) + { + assert (pThis->m_pPacketBuffer != 0); + + u8 *pEnd = pThis->m_pPacketBuffer + USBRequestGetResultLength(pURB); + for (u8 *pPacket = pThis->m_pPacketBuffer; pPacket < pEnd; pPacket += EVENT_PACKET_SIZE) + { + // Follow the Linux driver's example and ignore packets with Cable + // Number == Code Index Number == 0, which some devices seem to + // generate as padding in spite of their status as reserved. + if (pPacket[0] != 0) + { + if (pThis->m_pPacketHandler != 0) + { + unsigned nCable = pPacket[0] >> 4; + unsigned nLength = cin_to_length[pPacket[0] & 0xf]; + pThis->m_pPacketHandler(nCable, nLength, &pPacket[1]); + } + } + } + } + + _USBRequest (pThis->m_pURB); + free (pThis->m_pURB); + pThis->m_pURB = 0; + + USBMIDIDeviceStartRequest (pThis); +} diff --git a/uspi/lib/usbmouse.c b/uspi/lib/usbmouse.c new file mode 100644 index 0000000..43f53fe --- /dev/null +++ b/uspi/lib/usbmouse.c @@ -0,0 +1,212 @@ +// +// usbmouse.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include +#include +#include +#include + +static unsigned s_nDeviceNumber = 1; + +static const char FromUSBKbd[] = "umouse"; + +static boolean USBMouseDeviceStartRequest (TUSBMouseDevice *pThis); +static void USBMouseDeviceCompletionRoutine (TUSBRequest *pURB, void *pParam, void *pContext); + +void USBMouseDevice (TUSBMouseDevice *pThis, TUSBDevice *pDevice) +{ + assert (pThis != 0); + + USBDeviceCopy (&pThis->m_USBDevice, pDevice); + pThis->m_USBDevice.Configure = USBMouseDeviceConfigure; + + pThis->m_pReportEndpoint = 0; + pThis->m_pStatusHandler = 0; + pThis->m_pURB = 0; + pThis->m_pReportBuffer = 0; + + pThis->m_pReportBuffer = malloc (MOUSE_BOOT_REPORT_SIZE); + assert (pThis->m_pReportBuffer != 0); +} + +void _CUSBMouseDevice (TUSBMouseDevice *pThis) +{ + assert (pThis != 0); + + if (pThis->m_pReportBuffer != 0) + { + free (pThis->m_pReportBuffer); + pThis->m_pReportBuffer = 0; + } + + if (pThis->m_pReportEndpoint != 0) + { + _USBEndpoint (pThis->m_pReportEndpoint); + free (pThis->m_pReportEndpoint); + pThis->m_pReportEndpoint = 0; + } + + _USBDevice (&pThis->m_USBDevice); +} + +boolean USBMouseDeviceConfigure (TUSBDevice *pUSBDevice) +{ + TUSBMouseDevice *pThis = (TUSBMouseDevice *) pUSBDevice; + assert (pThis != 0); + + TUSBConfigurationDescriptor *pConfDesc = + (TUSBConfigurationDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_CONFIGURATION); + if ( pConfDesc == 0 + || pConfDesc->bNumInterfaces < 1) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromUSBKbd); + + return FALSE; + } + + TUSBInterfaceDescriptor *pInterfaceDesc; + while ((pInterfaceDesc = (TUSBInterfaceDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_INTERFACE)) != 0) + { + if ( pInterfaceDesc->bNumEndpoints < 1 + || pInterfaceDesc->bInterfaceClass != 0x03 // HID Class + || pInterfaceDesc->bInterfaceSubClass != 0x01 // Boot Interface Subclass + || pInterfaceDesc->bInterfaceProtocol != 0x02) // Mouse + { + continue; + } + + pThis->m_ucInterfaceNumber = pInterfaceDesc->bInterfaceNumber; + pThis->m_ucAlternateSetting = pInterfaceDesc->bAlternateSetting; + + TUSBEndpointDescriptor *pEndpointDesc = + (TUSBEndpointDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_ENDPOINT); + if ( pEndpointDesc == 0 + || (pEndpointDesc->bEndpointAddress & 0x80) != 0x80 // Input EP + || (pEndpointDesc->bmAttributes & 0x3F) != 0x03) // Interrupt EP + { + continue; + } + + assert (pThis->m_pReportEndpoint == 0); + pThis->m_pReportEndpoint = malloc (sizeof (TUSBEndpoint)); + assert (pThis->m_pReportEndpoint != 0); + USBEndpoint2 (pThis->m_pReportEndpoint, &pThis->m_USBDevice, pEndpointDesc); + + break; + } + + if (pThis->m_pReportEndpoint == 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromUSBKbd); + + return FALSE; + } + + if (!USBDeviceConfigure (&pThis->m_USBDevice)) + { + LogWrite (FromUSBKbd, LOG_ERROR, "Cannot set configuration"); + + return FALSE; + } + + if (pThis->m_ucAlternateSetting != 0) + { + if (DWHCIDeviceControlMessage (USBDeviceGetHost (&pThis->m_USBDevice), + USBDeviceGetEndpoint0 (&pThis->m_USBDevice), + REQUEST_OUT | REQUEST_TO_INTERFACE, SET_INTERFACE, + pThis->m_ucAlternateSetting, + pThis->m_ucInterfaceNumber, 0, 0) < 0) + { + LogWrite (FromUSBKbd, LOG_ERROR, "Cannot set interface"); + + return FALSE; + } + } + + if (DWHCIDeviceControlMessage (USBDeviceGetHost (&pThis->m_USBDevice), + USBDeviceGetEndpoint0 (&pThis->m_USBDevice), + REQUEST_OUT | REQUEST_CLASS | REQUEST_TO_INTERFACE, + SET_PROTOCOL, BOOT_PROTOCOL, + pThis->m_ucInterfaceNumber, 0, 0) < 0) + { + LogWrite (FromUSBKbd, LOG_ERROR, "Cannot set boot protocol"); + + return FALSE; + } + + TString DeviceName; + String (&DeviceName); + StringFormat (&DeviceName, "umouse%u", s_nDeviceNumber++); + DeviceNameServiceAddDevice (DeviceNameServiceGet (), StringGet (&DeviceName), pThis, FALSE); + + _String (&DeviceName); + + return USBMouseDeviceStartRequest (pThis); +} + +void USBMouseDeviceRegisterStatusHandler (TUSBMouseDevice *pThis, TMouseStatusHandler *pStatusHandler) +{ + assert (pThis != 0); + assert (pStatusHandler != 0); + pThis->m_pStatusHandler = pStatusHandler; +} + +boolean USBMouseDeviceStartRequest (TUSBMouseDevice *pThis) +{ + assert (pThis != 0); + + assert (pThis->m_pReportEndpoint != 0); + assert (pThis->m_pReportBuffer != 0); + + assert (pThis->m_pURB == 0); + pThis->m_pURB = malloc (sizeof (TUSBRequest)); + assert (pThis->m_pURB != 0); + USBRequest (pThis->m_pURB, pThis->m_pReportEndpoint, pThis->m_pReportBuffer, MOUSE_BOOT_REPORT_SIZE, 0); + USBRequestSetCompletionRoutine (pThis->m_pURB, USBMouseDeviceCompletionRoutine, 0, pThis); + + return DWHCIDeviceSubmitAsyncRequest (USBDeviceGetHost (&pThis->m_USBDevice), pThis->m_pURB); +} + +void USBMouseDeviceCompletionRoutine (TUSBRequest *pURB, void *pParam, void *pContext) +{ + TUSBMouseDevice *pThis = (TUSBMouseDevice *) pContext; + assert (pThis != 0); + + assert (pURB != 0); + assert (pThis->m_pURB == pURB); + + if ( USBRequestGetStatus (pURB) != 0 + && USBRequestGetResultLength (pURB) == MOUSE_BOOT_REPORT_SIZE + && pThis->m_pStatusHandler != 0) + { + assert (pThis->m_pReportBuffer != 0); + (*pThis->m_pStatusHandler) (pThis->m_pReportBuffer[0], + uspi_char2int ((char) pThis->m_pReportBuffer[1]), + uspi_char2int ((char) pThis->m_pReportBuffer[2])); + } + + _USBRequest (pThis->m_pURB); + free (pThis->m_pURB); + pThis->m_pURB = 0; + + USBMouseDeviceStartRequest (pThis); +} diff --git a/uspi/lib/usbrequest.c b/uspi/lib/usbrequest.c new file mode 100644 index 0000000..2f075f7 --- /dev/null +++ b/uspi/lib/usbrequest.c @@ -0,0 +1,123 @@ +// +// usbrequest.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include + +void USBRequest (TUSBRequest *pThis, TUSBEndpoint *pEndpoint, void *pBuffer, u32 nBufLen, TSetupData *pSetupData) +{ + assert (pThis != 0); + + pThis->m_pEndpoint = pEndpoint; + pThis->m_pSetupData = pSetupData; + pThis->m_pBuffer = pBuffer; + pThis->m_nBufLen = nBufLen; + pThis->m_bStatus = 0; + pThis->m_nResultLen = 0; + pThis->m_pCompletionRoutine = 0; + pThis->m_pCompletionParam = 0; + pThis->m_pCompletionContext = 0; + + assert (pThis->m_pEndpoint != 0); + assert (pThis->m_pBuffer != 0 || pThis->m_nBufLen == 0); +} + +void _USBRequest (TUSBRequest *pThis) +{ + assert (pThis != 0); + pThis->m_pEndpoint = 0; + pThis->m_pSetupData = 0; + pThis->m_pBuffer = 0; + pThis->m_pCompletionRoutine = 0; +} + +TUSBEndpoint *USBRequestGetEndpoint (TUSBRequest *pThis) +{ + assert (pThis != 0); + assert (pThis->m_pEndpoint != 0); + return pThis->m_pEndpoint; +} + +void USBRequestSetStatus (TUSBRequest *pThis, int bStatus) +{ + assert (pThis != 0); + pThis->m_bStatus = bStatus; +} + +void USBRequestSetResultLen (TUSBRequest *pThis, u32 nLength) +{ + assert (pThis != 0); + pThis->m_nResultLen = nLength; +} + +int USBRequestGetStatus (TUSBRequest *pThis) +{ + assert (pThis != 0); + return pThis->m_bStatus; +} + +u32 USBRequestGetResultLength (TUSBRequest *pThis) +{ + assert (pThis != 0); + assert (pThis->m_bStatus); + + return pThis->m_nResultLen; +} + +TSetupData *USBRequestGetSetupData (TUSBRequest *pThis) +{ + assert (pThis != 0); + assert (USBEndpointGetType (pThis->m_pEndpoint) == EndpointTypeControl); + assert (pThis->m_pSetupData != 0); + + return pThis->m_pSetupData; +} + +void *USBRequestGetBuffer (TUSBRequest *pThis) +{ + assert (pThis != 0); + assert ( pThis->m_pBuffer != 0 + || pThis->m_nBufLen == 0); + + return pThis->m_pBuffer; +} + +u32 USBRequestGetBufLen (TUSBRequest *pThis) +{ + assert (pThis != 0); + return pThis->m_nBufLen; +} + +void USBRequestSetCompletionRoutine (TUSBRequest *pThis, TURBCompletionRoutine *pRoutine, void *pParam, void *pContext) +{ + assert (pThis != 0); + pThis->m_pCompletionRoutine = pRoutine; + pThis->m_pCompletionParam = pParam; + pThis->m_pCompletionContext = pContext; + + assert (pThis->m_pCompletionRoutine != 0); +} + +void USBRequestCallCompletionRoutine (TUSBRequest *pThis) +{ + assert (pThis != 0); + assert (pThis->m_pCompletionRoutine != 0); + + (*pThis->m_pCompletionRoutine) (pThis, pThis->m_pCompletionParam, pThis->m_pCompletionContext); +} diff --git a/uspi/lib/usbstandardhub.c b/uspi/lib/usbstandardhub.c new file mode 100644 index 0000000..719fdde --- /dev/null +++ b/uspi/lib/usbstandardhub.c @@ -0,0 +1,473 @@ +// +// usbstandardhub.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include +#include + +boolean USBStandardHubEnumeratePorts (TUSBStandardHub *pThis); + +static const char FromHub[] = "usbhub"; + +void USBStandardHub (TUSBStandardHub *pThis, TUSBDevice *pDevice) +{ + assert (pThis != 0); + + USBDeviceCopy (&pThis->m_USBDevice, pDevice); + pThis->m_USBDevice.Configure = USBStandardHubConfigure; + + pThis->m_pHubDesc = 0; + pThis->m_nPorts = 0; + + for (unsigned nPort = 0; nPort < USB_HUB_MAX_PORTS; nPort++) + { + pThis->m_pDevice[nPort] = 0; + pThis->m_pStatus[nPort] = 0; + } +} + +void _USBStandardHub (TUSBStandardHub *pThis) +{ + assert (pThis != 0); + + for (unsigned nPort = 0; nPort < pThis->m_nPorts; nPort++) + { + if (pThis->m_pStatus[nPort] != 0) + { + free (pThis->m_pStatus[nPort]); + pThis->m_pStatus[nPort] = 0; + } + + if (pThis->m_pDevice[nPort] != 0) + { + _USBDevice (pThis->m_pDevice[nPort]); + free (pThis->m_pDevice[nPort]); + pThis->m_pDevice[nPort] = 0; + } + } + + pThis->m_nPorts = 0; + + if (pThis->m_pHubDesc != 0) + { + free (pThis->m_pHubDesc); + pThis->m_pHubDesc = 0; + } + + _USBDevice (&pThis->m_USBDevice); +} + +boolean USBStandardHubInitialize (TUSBStandardHub *pThis) +{ + assert (pThis != 0); + return USBDeviceInitialize (&pThis->m_USBDevice); +} + +boolean USBStandardHubConfigure (TUSBDevice *pUSBDevice) +{ + TUSBStandardHub *pThis = (TUSBStandardHub *) pUSBDevice; + assert (pThis != 0); + + const TUSBDeviceDescriptor *pDeviceDesc = USBDeviceGetDeviceDescriptor (&pThis->m_USBDevice); + assert (pDeviceDesc != 0); + + if ( pDeviceDesc->bDeviceClass != USB_DEVICE_CLASS_HUB + || pDeviceDesc->bDeviceSubClass != 0 + || pDeviceDesc->bDeviceProtocol != 2 // hub with multiple TTs + || pDeviceDesc->bNumConfigurations != 1) + { + LogWrite (FromHub, LOG_ERROR, "Unsupported hub (proto %u)", + (unsigned) pDeviceDesc->bDeviceProtocol); + + return FALSE; + } + + const TUSBConfigurationDescriptor *pConfigDesc = + (TUSBConfigurationDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_CONFIGURATION); + if ( pConfigDesc == 0 + || pConfigDesc->bNumInterfaces != 1) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromHub); + + return FALSE; + } + + const TUSBInterfaceDescriptor *pInterfaceDesc; + while ((pInterfaceDesc = (TUSBInterfaceDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_INTERFACE)) != 0) + { + if ( pInterfaceDesc->bInterfaceClass != USB_DEVICE_CLASS_HUB + || pInterfaceDesc->bInterfaceSubClass != 0 + || pInterfaceDesc->bInterfaceProtocol != 2) + { + continue; + } + + if (pInterfaceDesc->bNumEndpoints != 1) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromHub); + + return FALSE; + } + + const TUSBEndpointDescriptor *pEndpointDesc = + (TUSBEndpointDescriptor *) USBDeviceGetDescriptor (&pThis->m_USBDevice, DESCRIPTOR_ENDPOINT); + if ( pEndpointDesc == 0 + || (pEndpointDesc->bEndpointAddress & 0x80) != 0x80 // input EP + || (pEndpointDesc->bmAttributes & 0x3F) != 0x03) // interrupt EP + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromHub); + + return FALSE; + } + + break; + } + + if (pInterfaceDesc == 0) + { + USBDeviceConfigurationError (&pThis->m_USBDevice, FromHub); + + return FALSE; + } + + if (!USBDeviceConfigure (&pThis->m_USBDevice)) + { + LogWrite (FromHub, LOG_ERROR, "Cannot set configuration"); + + return FALSE; + } + + TUSBHostController *pHost = USBDeviceGetHost (&pThis->m_USBDevice); + assert (pHost != 0); + + if (pInterfaceDesc->bAlternateSetting != 0) + { + if (DWHCIDeviceControlMessage (pHost, USBDeviceGetEndpoint0 (&pThis->m_USBDevice), + REQUEST_OUT | REQUEST_TO_INTERFACE, SET_INTERFACE, + pInterfaceDesc->bAlternateSetting, + pInterfaceDesc->bInterfaceNumber, 0, 0) < 0) + { + LogWrite (FromHub, LOG_ERROR, "Cannot set interface"); + + return FALSE; + } + } + + assert (pThis->m_pHubDesc == 0); + pThis->m_pHubDesc = (TUSBHubDescriptor *) malloc (sizeof (TUSBHubDescriptor)); + assert (pThis->m_pHubDesc != 0); + + if (DWHCIDeviceGetDescriptor (pHost, USBDeviceGetEndpoint0 (&pThis->m_USBDevice), + DESCRIPTOR_HUB, DESCRIPTOR_INDEX_DEFAULT, + pThis->m_pHubDesc, sizeof *pThis->m_pHubDesc, + REQUEST_IN | REQUEST_CLASS) + != (int) sizeof *pThis->m_pHubDesc) + { + LogWrite (FromHub, LOG_ERROR, "Cannot get hub descriptor"); + + free (pThis->m_pHubDesc); + pThis->m_pHubDesc = 0; + + return FALSE; + } + +#ifndef NDEBUG + //DebugHexdump (pThis->m_pHubDesc, sizeof *pThis->m_pHubDesc, FromHub); +#endif + + pThis->m_nPorts = pThis->m_pHubDesc->bNbrPorts; + if (pThis->m_nPorts > USB_HUB_MAX_PORTS) + { + LogWrite (FromHub, LOG_ERROR, "Too many ports (%u)", pThis->m_nPorts); + + free (pThis->m_pHubDesc); + pThis->m_pHubDesc = 0; + + return FALSE; + } + + if (!USBStandardHubEnumeratePorts (pThis)) + { + LogWrite (FromHub, LOG_ERROR, "Port enumeration failed"); + + return FALSE; + } + + return TRUE; +} + +boolean USBStandardHubEnumeratePorts (TUSBStandardHub *pThis) +{ + assert (pThis != 0); + + TUSBHostController *pHost = USBDeviceGetHost (&pThis->m_USBDevice); + assert (pHost != 0); + + TUSBEndpoint *pEndpoint0 = USBDeviceGetEndpoint0 (&pThis->m_USBDevice); + assert (pEndpoint0 != 0); + + assert (pThis->m_nPorts > 0); + + // first power on all ports + for (unsigned nPort = 0; nPort < pThis->m_nPorts; nPort++) + { + if (DWHCIDeviceControlMessage (pHost, pEndpoint0, + REQUEST_OUT | REQUEST_CLASS | REQUEST_TO_OTHER, + SET_FEATURE, PORT_POWER, nPort+1, 0, 0) < 0) + { + LogWrite (FromHub, LOG_ERROR, "Cannot power port %u", nPort+1); + + return FALSE; + } + } + + // pThis->m_pHubDesc->bPwrOn2PwrGood delay seems to be not enough + // for some low speed devices, so we use the maximum here + MsDelay (510); + + // now detect devices, reset and initialize them + for (unsigned nPort = 0; nPort < pThis->m_nPorts; nPort++) + { + assert (pThis->m_pStatus[nPort] == 0); + pThis->m_pStatus[nPort] = malloc (sizeof (TUSBPortStatus)); + assert (pThis->m_pStatus[nPort] != 0); + + if (DWHCIDeviceControlMessage (pHost, pEndpoint0, + REQUEST_IN | REQUEST_CLASS | REQUEST_TO_OTHER, + GET_STATUS, 0, nPort+1, pThis->m_pStatus[nPort], 4) != 4) + { + LogWrite (FromHub, LOG_ERROR, "Cannot get status of port %u", nPort+1); + + continue; + } + + assert (pThis->m_pStatus[nPort]->wPortStatus & PORT_POWER__MASK); + if (!(pThis->m_pStatus[nPort]->wPortStatus & PORT_CONNECTION__MASK)) + { + continue; + } + + if (DWHCIDeviceControlMessage (pHost, pEndpoint0, + REQUEST_OUT | REQUEST_CLASS | REQUEST_TO_OTHER, + SET_FEATURE, PORT_RESET, nPort+1, 0, 0) < 0) + { + LogWrite (FromHub, LOG_ERROR, "Cannot reset port %u", nPort+1); + + continue; + } + + MsDelay (100); + + if (DWHCIDeviceControlMessage (pHost, pEndpoint0, + REQUEST_IN | REQUEST_CLASS | REQUEST_TO_OTHER, + GET_STATUS, 0, nPort+1, pThis->m_pStatus[nPort], 4) != 4) + { + return FALSE; + } + + //LogWrite (FromHub, LOG_DEBUG, "Port %u status is 0x%04X", nPort+1, (unsigned) pThis->m_pStatus[nPort]->wPortStatus); + + if (!(pThis->m_pStatus[nPort]->wPortStatus & PORT_ENABLE__MASK)) + { + LogWrite (FromHub, LOG_ERROR, "Port %u is not enabled", nPort+1); + + continue; + } + + // check for over-current + if (pThis->m_pStatus[nPort]->wPortStatus & PORT_OVER_CURRENT__MASK) + { + DWHCIDeviceControlMessage (pHost, pEndpoint0, + REQUEST_OUT | REQUEST_CLASS | REQUEST_TO_OTHER, + CLEAR_FEATURE, PORT_POWER, nPort+1, 0, 0); + + LogWrite (FromHub, LOG_ERROR, "Over-current condition on port %u", nPort+1); + + return FALSE; + } + + TUSBSpeed Speed = USBSpeedUnknown; + if (pThis->m_pStatus[nPort]->wPortStatus & PORT_LOW_SPEED__MASK) + { + Speed = USBSpeedLow; + } + else if (pThis->m_pStatus[nPort]->wPortStatus & PORT_HIGH_SPEED__MASK) + { + Speed = USBSpeedHigh; + } + else + { + Speed = USBSpeedFull; + } + + // first create default device + assert (pThis->m_pDevice[nPort] == 0); + pThis->m_pDevice[nPort] = malloc (sizeof (TUSBDevice)); + assert (pThis->m_pDevice[nPort] != 0); + USBDevice (pThis->m_pDevice[nPort], pHost, Speed, USBDeviceGetAddress (&pThis->m_USBDevice), nPort+1); + + if (!USBDeviceInitialize (pThis->m_pDevice[nPort])) + { + _USBDevice (pThis->m_pDevice[nPort]); + free (pThis->m_pDevice[nPort]); + pThis->m_pDevice[nPort] = 0; + + continue; + } + + TString *pNames = USBStandardHubGetDeviceNames (pThis->m_pDevice[nPort]); + assert (pNames != 0); + + LogWrite (FromHub, LOG_NOTICE, "Port %u: Device %s found", nPort+1, StringGet (pNames)); + + _String (pNames); + free (pNames); + } + + // now configure devices + for (unsigned nPort = 0; nPort < pThis->m_nPorts; nPort++) + { + if (pThis->m_pDevice[nPort] == 0) + { + continue; + } + + // now create specific device from default device + TUSBDevice *pChild = USBDeviceFactoryGetDevice (pThis->m_pDevice[nPort]); + if (pChild != 0) + { + _USBDevice (pThis->m_pDevice[nPort]); // delete default device + free (pThis->m_pDevice[nPort]); + pThis->m_pDevice[nPort] = pChild; // assign specific device + + if (!(*pThis->m_pDevice[nPort]->Configure) (pThis->m_pDevice[nPort])) + { + LogWrite (FromHub, LOG_ERROR, "Port %u: Cannot configure device", nPort+1); + + continue; + } + + LogWrite (FromHub, LOG_DEBUG, "Port %u: Device configured", nPort+1); + } + else + { + LogWrite (FromHub, LOG_NOTICE, "Port %u: Device is not supported", nPort+1); + + _USBDevice (pThis->m_pDevice[nPort]); + free (pThis->m_pDevice[nPort]); + pThis->m_pDevice[nPort] = 0; + } + } + + // again check for over-current + TUSBHubStatus *pHubStatus = malloc (sizeof (TUSBHubStatus)); + assert (pHubStatus != 0); + + if (DWHCIDeviceControlMessage (pHost, pEndpoint0, + REQUEST_IN | REQUEST_CLASS, + GET_STATUS, 0, 0, pHubStatus, sizeof *pHubStatus) != (int) sizeof *pHubStatus) + { + LogWrite (FromHub, LOG_ERROR, "Cannot get hub status"); + + free (pHubStatus); + + return FALSE; + } + + if (pHubStatus->wHubStatus & HUB_OVER_CURRENT__MASK) + { + for (unsigned nPort = 0; nPort < pThis->m_nPorts; nPort++) + { + DWHCIDeviceControlMessage (pHost, pEndpoint0, + REQUEST_OUT | REQUEST_CLASS | REQUEST_TO_OTHER, + CLEAR_FEATURE, PORT_POWER, nPort+1, 0, 0); + } + + LogWrite (FromHub, LOG_ERROR, "Hub over-current condition"); + + free (pHubStatus); + + return FALSE; + } + + free (pHubStatus); + pHubStatus = 0; + + boolean bResult = TRUE; + + for (unsigned nPort = 0; nPort < pThis->m_nPorts; nPort++) + { + if (DWHCIDeviceControlMessage (pHost, pEndpoint0, + REQUEST_IN | REQUEST_CLASS | REQUEST_TO_OTHER, + GET_STATUS, 0, nPort+1, pThis->m_pStatus[nPort], 4) != 4) + { + continue; + } + + if (pThis->m_pStatus[nPort]->wPortStatus & PORT_OVER_CURRENT__MASK) + { + DWHCIDeviceControlMessage (pHost, pEndpoint0, + REQUEST_OUT | REQUEST_CLASS | REQUEST_TO_OTHER, + CLEAR_FEATURE, PORT_POWER, nPort+1, 0, 0); + + LogWrite (FromHub, LOG_ERROR, "Over-current condition on port %u", nPort+1); + + bResult = FALSE; + } + } + + return bResult; +} + +TString *USBStandardHubGetDeviceNames (TUSBDevice *pDevice) +{ + assert (pDevice != 0); + + TString *pResult = (TString *) malloc (sizeof (TString)); + assert (pResult != 0); + String (pResult); + + for (unsigned nSelector = DeviceNameVendor; nSelector < DeviceNameUnknown; nSelector++) + { + TString *pName = USBDeviceGetName (pDevice, (TDeviceNameSelector) nSelector); + assert (pName != 0); + + if (StringCompare (pName, "unknown") != 0) + { + if (StringGetLength (pResult) > 0) + { + StringAppend (pResult, ", "); + } + + StringAppend (pResult, StringGet (pName)); + } + + _String (pName); + free (pName); + } + + if (StringGetLength (pResult) == 0) + { + StringSet (pResult, "unknown"); + } + + return pResult; +} diff --git a/uspi/lib/usbstring.c b/uspi/lib/usbstring.c new file mode 100644 index 0000000..e32ceeb --- /dev/null +++ b/uspi/lib/usbstring.c @@ -0,0 +1,249 @@ +// +// usbstring.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include +#include +#include + +#define USBSTR_MIN_LENGTH 4 + +#define USBSTR_DEFAULT_LANGID 0x409 + +void USBString (TUSBString *pThis, struct TUSBDevice *pDevice) +{ + assert (pThis != 0); + + pThis->m_pDevice = pDevice; + assert (pThis->m_pDevice != 0); + + pThis->m_pUSBString = 0; + + pThis->m_pString = malloc (sizeof (TString)); + assert (pThis->m_pString != 0); + String (pThis->m_pString); +} + +void USBStringCopy (TUSBString *pThis, TUSBString *pParent) +{ + assert (pThis != 0); + assert (pParent != 0); + pThis->m_pDevice = pParent->m_pDevice; + + pThis->m_pUSBString = 0; + if (pParent->m_pUSBString != 0) + { + pThis->m_pUSBString = (TUSBStringDescriptor *) malloc (pParent->m_pUSBString->bLength); + assert (pThis->m_pUSBString != 0); + memcpy (pThis->m_pUSBString, pParent->m_pUSBString, pParent->m_pUSBString->bLength); + } + + assert (pParent->m_pString != 0); + pThis->m_pString = (TString *) malloc (sizeof (TString)); + assert (pThis->m_pString != 0); + String2 (pThis->m_pString, StringGet (pParent->m_pString)); +} + +void _USBString (TUSBString *pThis) +{ + assert (pThis != 0); + + assert (pThis->m_pString != 0); + _String (pThis->m_pString); + free (pThis->m_pString); + pThis->m_pString = 0; + + if (pThis->m_pUSBString != 0) + { + free (pThis->m_pUSBString); + pThis->m_pUSBString = 0; + } + + pThis->m_pDevice = 0; +} + +boolean USBStringGetFromDescriptor (TUSBString *pThis, u8 ucID, u16 usLanguageID) +{ + assert (pThis != 0); + assert (ucID > 0); + + if (pThis->m_pUSBString != 0) + { + free (pThis->m_pUSBString); + } + pThis->m_pUSBString = (TUSBStringDescriptor *) malloc (USBSTR_MIN_LENGTH); + assert (pThis->m_pUSBString != 0); + + assert (pThis->m_pDevice != 0); + if (DWHCIDeviceControlMessage (USBDeviceGetHost (pThis->m_pDevice), + USBDeviceGetEndpoint0 (pThis->m_pDevice), + REQUEST_IN, GET_DESCRIPTOR, + (DESCRIPTOR_STRING << 8) | ucID, usLanguageID, + pThis->m_pUSBString, USBSTR_MIN_LENGTH) < 0) + { + return FALSE; + } + + u8 ucLength = pThis->m_pUSBString->bLength; + if ( ucLength < 2 + || (ucLength & 1) != 0 + || pThis->m_pUSBString->bDescriptorType != DESCRIPTOR_STRING) + { + return FALSE; + } + + if (ucLength > USBSTR_MIN_LENGTH) + { + free (pThis->m_pUSBString); + pThis->m_pUSBString = (TUSBStringDescriptor *) malloc (ucLength); + assert (pThis->m_pUSBString != 0); + + if (DWHCIDeviceControlMessage (USBDeviceGetHost (pThis->m_pDevice), + USBDeviceGetEndpoint0 (pThis->m_pDevice), + REQUEST_IN, GET_DESCRIPTOR, + (DESCRIPTOR_STRING << 8) | ucID, usLanguageID, + pThis->m_pUSBString, ucLength) != (int) ucLength) + { + return FALSE; + } + + if ( pThis->m_pUSBString->bLength != ucLength + || (pThis->m_pUSBString->bLength & 1) != 0 + || pThis->m_pUSBString->bDescriptorType != DESCRIPTOR_STRING) + { + return FALSE; + } + } + + // convert to ASCII string + assert (pThis->m_pUSBString->bLength >= 2); + assert ((pThis->m_pUSBString->bLength & 1) == 0); + size_t nLength = (pThis->m_pUSBString->bLength-2) / 2; + + assert (nLength <= (255-2) / 2); + char Buffer[nLength+1]; + + for (unsigned i = 0; i < nLength; i++) + { + u16 usChar = pThis->m_pUSBString->bString[i]; + if ( usChar < ' ' + || usChar > '~') + { + usChar = '_'; + } + + Buffer[i] = (char) usChar; + } + Buffer[nLength] = '\0'; + + assert (pThis->m_pString != 0); + _String (pThis->m_pString); + free (pThis->m_pString); + + pThis->m_pString = malloc (sizeof (TString)); + assert (pThis->m_pString != 0); + String2 (pThis->m_pString, Buffer); + + return TRUE; +} + +const char *USBStringGet (TUSBString *pThis) +{ + assert (pThis != 0); + return StringGet (pThis->m_pString); +} + +u16 USBStringGetLanguageID (TUSBString *pThis) +{ + assert (pThis != 0); + + TUSBStringDescriptor *pLanguageIDs = (TUSBStringDescriptor *) malloc (USBSTR_MIN_LENGTH); + assert (pLanguageIDs != 0); + + assert (pThis->m_pDevice != 0); + if (DWHCIDeviceGetDescriptor (USBDeviceGetHost (pThis->m_pDevice), + USBDeviceGetEndpoint0 (pThis->m_pDevice), + DESCRIPTOR_STRING, 0, + pLanguageIDs, USBSTR_MIN_LENGTH, REQUEST_IN) < 0) + { + free (pLanguageIDs); + + return USBSTR_DEFAULT_LANGID; + } + + u8 ucLength = pLanguageIDs->bLength; + if ( ucLength < 4 + || (ucLength & 1) != 0 + || pLanguageIDs->bDescriptorType != DESCRIPTOR_STRING) + { + free (pLanguageIDs); + + return USBSTR_DEFAULT_LANGID; + } + + if (ucLength > USBSTR_MIN_LENGTH) + { + free (pLanguageIDs); + pLanguageIDs = (TUSBStringDescriptor *) malloc (ucLength); + assert (pLanguageIDs != 0); + + if (DWHCIDeviceGetDescriptor (USBDeviceGetHost (pThis->m_pDevice), + USBDeviceGetEndpoint0 (pThis->m_pDevice), + DESCRIPTOR_STRING, 0, + pLanguageIDs, ucLength, REQUEST_IN) != (int) ucLength) + { + free (pLanguageIDs); + + return USBSTR_DEFAULT_LANGID; + } + + if ( pLanguageIDs->bLength != ucLength + || (pLanguageIDs->bLength & 1) != 0 + || pLanguageIDs->bDescriptorType != DESCRIPTOR_STRING) + { + free (pLanguageIDs); + + return USBSTR_DEFAULT_LANGID; + } + } + + assert (pLanguageIDs->bLength >= 4); + assert ((pLanguageIDs->bLength & 1) == 0); + size_t nLength = (pLanguageIDs->bLength-2) / 2; + + // search for default language ID + for (unsigned i = 0; i < nLength; i++) + { + if (pLanguageIDs->bString[i] == USBSTR_DEFAULT_LANGID) + { + free (pLanguageIDs); + + return USBSTR_DEFAULT_LANGID; + } + } + + // default language ID not found, use first ID + u16 usResult = pLanguageIDs->bString[0]; + + free (pLanguageIDs); + + return usResult; +} diff --git a/uspi/lib/uspilibrary.c b/uspi/lib/uspilibrary.c new file mode 100644 index 0000000..605beb8 --- /dev/null +++ b/uspi/lib/uspilibrary.c @@ -0,0 +1,386 @@ +// +// uspilibrary.c +// +// USPi - An USB driver for Raspberry Pi written in C +// Copyright (C) 2014-2018 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include +#include +#include +#include +#include +#include +#include + +static const char FromUSPi[] = "uspi"; + +static TUSPiLibrary *s_pLibrary = 0; + +int USPiInitialize (void) +{ + assert (s_pLibrary == 0); + s_pLibrary = (TUSPiLibrary *) malloc (sizeof (TUSPiLibrary)); + assert (s_pLibrary != 0); + + DeviceNameService (&s_pLibrary->NameService); + DWHCIDevice (&s_pLibrary->DWHCI); + s_pLibrary->pEth0 = 0; + s_pLibrary->pEth10 = 0; + + if (!DWHCIDeviceInitialize (&s_pLibrary->DWHCI)) + { + LogWrite (FromUSPi, LOG_ERROR, "Cannot initialize USB host controller interface"); + + _DWHCIDevice (&s_pLibrary->DWHCI); + _DeviceNameService (&s_pLibrary->NameService); + free (s_pLibrary); + s_pLibrary = 0; + + return 0; + } + + s_pLibrary->pUKBD1 = (TUSBKeyboardDevice *) DeviceNameServiceGetDevice (DeviceNameServiceGet (), "ukbd1", FALSE); + + s_pLibrary->pUMouse1 = (TUSBMouseDevice *) DeviceNameServiceGetDevice (DeviceNameServiceGet (), "umouse1", FALSE); + + s_pLibrary->pMIDI1 = (TUSBMIDIDevice *) DeviceNameServiceGetDevice (DeviceNameServiceGet (), "umidi1", FALSE); + + for (unsigned i = 0; i < MAX_DEVICES; i++) + { + TString DeviceName; + String (&DeviceName); + StringFormat (&DeviceName, "umsd%u", i+1); + + s_pLibrary->pUMSD[i] = (TUSBBulkOnlyMassStorageDevice *) + DeviceNameServiceGetDevice (DeviceNameServiceGet (), StringGet (&DeviceName), TRUE); + + _String (&DeviceName); + } + + s_pLibrary->pEth0 = (TSMSC951xDevice *) DeviceNameServiceGetDevice (DeviceNameServiceGet (), "eth0", FALSE); + + s_pLibrary->pEth10 = (TLAN7800Device *) DeviceNameServiceGetDevice (DeviceNameServiceGet (), "eth10", FALSE); + + for (unsigned i = 0; i < MAX_DEVICES; i++) + { + TString DeviceName; + String (&DeviceName); + StringFormat (&DeviceName, "upad%u", i+1); + + s_pLibrary->pUPAD[i] = (TUSBGamePadDevice *) + DeviceNameServiceGetDevice (DeviceNameServiceGet (), StringGet (&DeviceName), FALSE); + + _String (&DeviceName); + } + + LogWrite (FromUSPi, LOG_DEBUG, "USPi library successfully initialized"); + + return 1; +} + +int USPiKeyboardAvailable (void) +{ + assert (s_pLibrary != 0); + return s_pLibrary->pUKBD1 != 0; +} + +void USPiKeyboardRegisterKeyPressedHandler (TUSPiKeyPressedHandler *pKeyPressedHandler) +{ + assert (s_pLibrary != 0); + assert (s_pLibrary->pUKBD1 != 0); + USBKeyboardDeviceRegisterKeyPressedHandler (s_pLibrary->pUKBD1, pKeyPressedHandler); +} + +void USPiKeyboardRegisterShutdownHandler (TUSPiShutdownHandler *pShutdownHandler) +{ + assert (s_pLibrary != 0); + assert (s_pLibrary->pUKBD1 != 0); + USBKeyboardDeviceRegisterShutdownHandler (s_pLibrary->pUKBD1, pShutdownHandler); +} + +void USPiKeyboardRegisterKeyStatusHandlerRaw (TKeyStatusHandlerRaw *pKeyStatusHandlerRaw) +{ + assert (s_pLibrary != 0); + assert (s_pLibrary->pUKBD1 != 0); + USBKeyboardDeviceRegisterKeyStatusHandlerRaw (s_pLibrary->pUKBD1, pKeyStatusHandlerRaw); +} + +int USPiMouseAvailable (void) +{ + assert (s_pLibrary != 0); + return s_pLibrary->pUMouse1 != 0; +} + +void USPiMouseRegisterStatusHandler (TUSPiMouseStatusHandler *pStatusHandler) +{ + assert (s_pLibrary != 0); + assert (s_pLibrary->pUMouse1 != 0); + USBMouseDeviceRegisterStatusHandler (s_pLibrary->pUMouse1, pStatusHandler); +} + +int USPiMassStorageDeviceAvailable (void) +{ + assert (s_pLibrary != 0); + + unsigned i; + for (i = 0; i < MAX_DEVICES; i++) + { + if (s_pLibrary->pUMSD[i] == 0) + { + break; + } + } + + return (int) i; +} + +int USPiMassStorageDeviceRead (unsigned long long ullOffset, void *pBuffer, unsigned nCount, unsigned nDeviceIndex) +{ + assert (s_pLibrary != 0); + + if ( nDeviceIndex >= MAX_DEVICES + || s_pLibrary->pUMSD[nDeviceIndex] == 0) + { + return -1; + } + + if (USBBulkOnlyMassStorageDeviceSeek (s_pLibrary->pUMSD[nDeviceIndex], ullOffset) != ullOffset) + { + return -1; + } + + return USBBulkOnlyMassStorageDeviceRead (s_pLibrary->pUMSD[nDeviceIndex], pBuffer, nCount); +} + +int USPiMassStorageDeviceWrite (unsigned long long ullOffset, const void *pBuffer, unsigned nCount, unsigned nDeviceIndex) +{ + assert (s_pLibrary != 0); + + if ( nDeviceIndex >= MAX_DEVICES + || s_pLibrary->pUMSD[nDeviceIndex] == 0) + { + return -1; + } + + if (USBBulkOnlyMassStorageDeviceSeek (s_pLibrary->pUMSD[nDeviceIndex], ullOffset) != ullOffset) + { + return -1; + } + + return USBBulkOnlyMassStorageDeviceWrite (s_pLibrary->pUMSD[nDeviceIndex], pBuffer, nCount); +} + +unsigned USPiMassStorageDeviceGetCapacity (unsigned nDeviceIndex) +{ + assert (s_pLibrary != 0); + + if ( nDeviceIndex >= MAX_DEVICES + || s_pLibrary->pUMSD[nDeviceIndex] == 0) + { + return 0; + } + + return USBBulkOnlyMassStorageDeviceGetCapacity (s_pLibrary->pUMSD[nDeviceIndex]); +} + +int USPiEthernetAvailable (void) +{ + assert (s_pLibrary != 0); + return s_pLibrary->pEth0 != 0 || s_pLibrary->pEth10 != 0; +} + +void USPiGetMACAddress (unsigned char Buffer[6]) +{ + assert (s_pLibrary != 0); + + TMACAddress *pMACAddress; + if (s_pLibrary->pEth10 != 0) + { + pMACAddress = LAN7800DeviceGetMACAddress (s_pLibrary->pEth10); + } + else + { + assert (s_pLibrary->pEth0 != 0); + pMACAddress = SMSC951xDeviceGetMACAddress (s_pLibrary->pEth0); + } + + assert (Buffer != 0); + MACAddressCopyTo (pMACAddress, Buffer); +} + +int USPiSendFrame (const void *pBuffer, unsigned nLength) +{ + assert (s_pLibrary != 0); + + if (s_pLibrary->pEth10 != 0) + { + return LAN7800DeviceSendFrame (s_pLibrary->pEth10, pBuffer, nLength) ? 1 : 0; + } + + assert (s_pLibrary->pEth0 != 0); + return SMSC951xDeviceSendFrame (s_pLibrary->pEth0, pBuffer, nLength) ? 1 : 0; +} + +int USPiReceiveFrame (void *pBuffer, unsigned *pResultLength) +{ + assert (s_pLibrary != 0); + + if (s_pLibrary->pEth10 != 0) + { + return LAN7800DeviceReceiveFrame (s_pLibrary->pEth10, pBuffer, pResultLength) ? 1 : 0; + } + + assert (s_pLibrary->pEth0 != 0); + return SMSC951xDeviceReceiveFrame (s_pLibrary->pEth0, pBuffer, pResultLength) ? 1 : 0; +} + +int USPiGamePadAvailable (void) +{ + assert (s_pLibrary != 0); + + unsigned i; + for (i = 0; i < MAX_DEVICES; i++) + { + if (s_pLibrary->pUPAD[i] == 0) + { + break; + } + } + + return (int) i; +} + +void USPiGamePadRegisterStatusHandler (TGamePadStatusHandler *pStatusHandler) +{ + assert (s_pLibrary != 0); + + unsigned i; + for (i = 0; i < MAX_DEVICES; i++) + { + if (s_pLibrary->pUPAD[i] != 0) + { + USBGamePadDeviceRegisterStatusHandler (s_pLibrary->pUPAD[i], pStatusHandler); + } + } +} + +const USPiGamePadState *USPiGamePadGetStatus (unsigned nDeviceIndex) +{ + assert (s_pLibrary != 0); + + if ( nDeviceIndex >= MAX_DEVICES + || s_pLibrary->pUPAD[nDeviceIndex] == 0) + { + return 0; + } + + USBGamePadDeviceGetReport (s_pLibrary->pUPAD[nDeviceIndex]); + + return &s_pLibrary->pUPAD[nDeviceIndex]->m_State; +} + +int USPiMIDIAvailable (void) +{ + assert (s_pLibrary != 0); + return s_pLibrary->pMIDI1 != 0; +} + +void USPiMIDIRegisterPacketHandler (TUSPiMIDIPacketHandler *pPacketHandler) +{ + assert (s_pLibrary != 0); + assert (s_pLibrary->pMIDI1 != 0); + USBMIDIDeviceRegisterPacketHandler (s_pLibrary->pMIDI1, pPacketHandler); +} + +int USPiDeviceGetInformation (unsigned nClass, unsigned nDeviceIndex, TUSPiDeviceInformation *pInfo) +{ + assert (s_pLibrary != 0); + + TUSBDevice *pUSBDevice = 0; + + switch (nClass) + { + case KEYBOARD_CLASS: + if (nDeviceIndex == 0) + { + pUSBDevice = (TUSBDevice *) s_pLibrary->pUKBD1; + } + break; + + case MOUSE_CLASS: + if (nDeviceIndex == 0) + { + pUSBDevice = (TUSBDevice *) s_pLibrary->pUMouse1; + } + break; + + case STORAGE_CLASS: + if (nDeviceIndex < MAX_DEVICES) + { + pUSBDevice = (TUSBDevice *) s_pLibrary->pUMSD[nDeviceIndex]; + } + break; + + case ETHERNET_CLASS: + if (nDeviceIndex == 0) + { + if (s_pLibrary->pEth10 != 0) + { + pUSBDevice = (TUSBDevice *) s_pLibrary->pEth10; + } + else + { + pUSBDevice = (TUSBDevice *) s_pLibrary->pEth0; + } + } + break; + + case GAMEPAD_CLASS: + if (nDeviceIndex < MAX_DEVICES) + { + pUSBDevice = (TUSBDevice *) s_pLibrary->pUPAD[nDeviceIndex]; + } + break; + + case MIDI_CLASS: + if (nDeviceIndex == 0) + { + pUSBDevice = (TUSBDevice *) s_pLibrary->pMIDI1; + } + break; + + default: + break; + } + + if (pUSBDevice == 0) + { + return 0; + } + + const TUSBDeviceDescriptor *pDesc = USBDeviceGetDeviceDescriptor (pUSBDevice); + assert (pDesc != 0); + + assert (pInfo != 0); + pInfo->idVendor = pDesc->idVendor; + pInfo->idProduct = pDesc->idProduct; + pInfo->bcdDevice = pDesc->bcdDevice; + + pInfo->pManufacturer = USBStringGet (&pUSBDevice->m_ManufacturerString); + pInfo->pProduct = USBStringGet (&pUSBDevice->m_ProductString); + + return 1; +} diff --git a/uspi/lib/util.c b/uspi/lib/util.c new file mode 100644 index 0000000..ebab277 --- /dev/null +++ b/uspi/lib/util.c @@ -0,0 +1,200 @@ +// +// util.c +// +// Circle - A C++ bare metal environment for Raspberry Pi +// Copyright (C) 2014 R. Stange +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +#include + +#ifdef USPI_PROVIDE_MEM_FUNCTIONS + +void *uspi_memset (void *pBuffer, int nValue, size_t nLength) +{ + char *p = (char *) pBuffer; + + while (nLength--) + { + *p++ = (char) nValue; + } + + return pBuffer; +} + +void *uspi_memcpy (void *pDest, const void *pSrc, size_t nLength) +{ + char *pd = (char *) pDest; + char *ps = (char *) pSrc; + + while (nLength--) + { + *pd++ = *ps++; + } + + return pDest; +} + +int uspi_memcmp (const void *pBuffer1, const void *pBuffer2, size_t nLength) +{ + const unsigned char *p1 = (const unsigned char *) pBuffer1; + const unsigned char *p2 = (const unsigned char *) pBuffer2; + + while (nLength-- > 0) + { + if (*p1 > *p2) + { + return 1; + } + else if (*p1 < *p2) + { + return -1; + } + + p1++; + p2++; + } + + return 0; +} + +#endif + +#ifdef USPI_PROVIDE_STR_FUNCTIONS + +size_t uspi_strlen (const char *pString) +{ + size_t nResult = 0; + + while (*pString++) + { + nResult++; + } + + return nResult; +} + +int uspi_strcmp (const char *pString1, const char *pString2) +{ + while ( *pString1 != '\0' + && *pString2 != '\0') + { + if (*pString1 > *pString2) + { + return 1; + } + else if (*pString1 < *pString2) + { + return -1; + } + + pString1++; + pString2++; + } + + if (*pString1 > *pString2) + { + return 1; + } + else if (*pString1 < *pString2) + { + return -1; + } + + return 0; +} + +char *uspi_strcpy (char *pDest, const char *pSrc) +{ + char *p = pDest; + + while (*pSrc) + { + *p++ = *pSrc++; + } + + *p = '\0'; + + return pDest; +} + +char *uspi_strncpy (char *pDest, const char *pSrc, size_t nMaxLen) +{ + char *pResult = pDest; + + while (nMaxLen > 0) + { + if (*pSrc == '\0') + { + break; + } + + *pDest++ = *pSrc++; + nMaxLen--; + } + + if (nMaxLen > 0) + { + *pDest = '\0'; + } + + return pResult; +} + +char *uspi_strcat (char *pDest, const char *pSrc) +{ + char *p = pDest; + + while (*p) + { + p++; + } + + while (*pSrc) + { + *p++ = *pSrc++; + } + + *p = '\0'; + + return pDest; +} + +#endif + +int uspi_char2int (char chValue) +{ + int nResult = chValue; + + if (nResult > 0x7F) + { + nResult |= -0x100; + } + + return nResult; +} + +u16 uspi_le2be16 (u16 usValue) +{ + return ((usValue & 0x00FF) << 8) + | ((usValue & 0xFF00) >> 8); +} + +u32 uspi_le2be32 (u32 ulValue) +{ + return ((ulValue & 0x000000FF) << 24) + | ((ulValue & 0x0000FF00) << 8) + | ((ulValue & 0x00FF0000) >> 8) + | ((ulValue & 0xFF000000) >> 24); +} diff --git a/xga_font_data.c b/xga_font_data.c new file mode 100644 index 0000000..3aed314 --- /dev/null +++ b/xga_font_data.c @@ -0,0 +1,417 @@ +/* + * CGA/EGA/VGA ROM font data + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * CGA/EGA/VGA ROM font data + */ + +#include +#include "xga_font_data.h" + +const uint8_t avpriv_cga_font[2048] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e, + 0x7e, 0xff, 0xdb, 0xff, 0xc3, 0xe7, 0xff, 0x7e, 0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, + 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x38, 0x7c, 0x38, 0xfe, 0xfe, 0x7c, 0x38, 0x7c, + 0x10, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x7c, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00, + 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, + 0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff, 0x0f, 0x07, 0x0f, 0x7d, 0xcc, 0xcc, 0xcc, 0x78, + 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x70, 0xf0, 0xe0, + 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x67, 0xe6, 0xc0, 0x99, 0x5a, 0x3c, 0xe7, 0xe7, 0x3c, 0x5a, 0x99, + 0x80, 0xe0, 0xf8, 0xfe, 0xf8, 0xe0, 0x80, 0x00, 0x02, 0x0e, 0x3e, 0xfe, 0x3e, 0x0e, 0x02, 0x00, + 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00, + 0x7f, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x00, 0x3e, 0x63, 0x38, 0x6c, 0x6c, 0x38, 0xcc, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x7e, 0x3c, 0x18, 0xff, + 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, + 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, + 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7e, 0x3c, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, 0x78, 0x30, 0x30, 0x00, 0x30, 0x00, + 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, + 0x30, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x30, 0x00, 0x00, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xc6, 0x00, + 0x38, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0x76, 0x00, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00, 0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00, + 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, + 0x7c, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0x7c, 0x00, 0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x00, + 0x78, 0xcc, 0x0c, 0x38, 0x60, 0xcc, 0xfc, 0x00, 0x78, 0xcc, 0x0c, 0x38, 0x0c, 0xcc, 0x78, 0x00, + 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x1e, 0x00, 0xfc, 0xc0, 0xf8, 0x0c, 0x0c, 0xcc, 0x78, 0x00, + 0x38, 0x60, 0xc0, 0xf8, 0xcc, 0xcc, 0x78, 0x00, 0xfc, 0xcc, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x00, + 0x78, 0xcc, 0xcc, 0x78, 0xcc, 0xcc, 0x78, 0x00, 0x78, 0xcc, 0xcc, 0x7c, 0x0c, 0x18, 0x70, 0x00, + 0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x60, + 0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00, + 0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x78, 0xcc, 0x0c, 0x18, 0x30, 0x00, 0x30, 0x00, + 0x7c, 0xc6, 0xde, 0xde, 0xde, 0xc0, 0x78, 0x00, 0x30, 0x78, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0x00, + 0xfc, 0x66, 0x66, 0x7c, 0x66, 0x66, 0xfc, 0x00, 0x3c, 0x66, 0xc0, 0xc0, 0xc0, 0x66, 0x3c, 0x00, + 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0xfe, 0x62, 0x68, 0x78, 0x68, 0x62, 0xfe, 0x00, + 0xfe, 0x62, 0x68, 0x78, 0x68, 0x60, 0xf0, 0x00, 0x3c, 0x66, 0xc0, 0xc0, 0xce, 0x66, 0x3e, 0x00, + 0xcc, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0xcc, 0x00, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00, + 0x1e, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00, 0xe6, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x00, + 0xf0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00, 0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0x00, + 0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00, + 0xfc, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xdc, 0x78, 0x1c, 0x00, + 0xfc, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0xe6, 0x00, 0x78, 0xcc, 0xe0, 0x70, 0x1c, 0xcc, 0x78, 0x00, + 0xfc, 0xb4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xfc, 0x00, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00, 0xc6, 0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x00, + 0xc6, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6, 0x00, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x30, 0x78, 0x00, + 0xfe, 0xc6, 0x8c, 0x18, 0x32, 0x66, 0xfe, 0x00, 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00, + 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x02, 0x00, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00, + 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00, + 0xe0, 0x60, 0x60, 0x7c, 0x66, 0x66, 0xdc, 0x00, 0x00, 0x00, 0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x00, + 0x1c, 0x0c, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00, + 0x38, 0x6c, 0x60, 0xf0, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8, + 0xe0, 0x60, 0x6c, 0x76, 0x66, 0x66, 0xe6, 0x00, 0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00, + 0x0c, 0x00, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0xe0, 0x60, 0x66, 0x6c, 0x78, 0x6c, 0xe6, 0x00, + 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0xcc, 0xfe, 0xfe, 0xd6, 0xc6, 0x00, + 0x00, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0x78, 0x00, + 0x00, 0x00, 0xdc, 0x66, 0x66, 0x7c, 0x60, 0xf0, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0x1e, + 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x00, + 0x10, 0x30, 0x7c, 0x30, 0x30, 0x34, 0x18, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, + 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00, 0x00, 0x00, 0xc6, 0xd6, 0xfe, 0xfe, 0x6c, 0x00, + 0x00, 0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8, + 0x00, 0x00, 0xfc, 0x98, 0x30, 0x64, 0xfc, 0x00, 0x1c, 0x30, 0x30, 0xe0, 0x30, 0x30, 0x1c, 0x00, + 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00, 0xe0, 0x30, 0x30, 0x1c, 0x30, 0x30, 0xe0, 0x00, + 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0x00, + 0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x18, 0x0c, 0x78, 0x00, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00, + 0x1c, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00, 0x7e, 0xc3, 0x3c, 0x06, 0x3e, 0x66, 0x3f, 0x00, + 0xcc, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00, 0xe0, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00, + 0x30, 0x30, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00, 0x00, 0x00, 0x78, 0xc0, 0xc0, 0x78, 0x0c, 0x38, + 0x7e, 0xc3, 0x3c, 0x66, 0x7e, 0x60, 0x3c, 0x00, 0xcc, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00, + 0xe0, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00, 0xcc, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00, + 0x7c, 0xc6, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00, 0xe0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00, + 0xc6, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00, 0x30, 0x30, 0x00, 0x78, 0xcc, 0xfc, 0xcc, 0x00, + 0x1c, 0x00, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00, 0x00, 0x00, 0x7f, 0x0c, 0x7f, 0xcc, 0x7f, 0x00, + 0x3e, 0x6c, 0xcc, 0xfe, 0xcc, 0xcc, 0xce, 0x00, 0x78, 0xcc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00, + 0x00, 0xcc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0xe0, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00, + 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00, 0x00, 0xe0, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00, + 0x00, 0xcc, 0x00, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8, 0xc3, 0x18, 0x3c, 0x66, 0x66, 0x3c, 0x18, 0x00, + 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x18, 0x18, 0x7e, 0xc0, 0xc0, 0x7e, 0x18, 0x18, + 0x38, 0x6c, 0x64, 0xf0, 0x60, 0xe6, 0xfc, 0x00, 0xcc, 0xcc, 0x78, 0xfc, 0x30, 0xfc, 0x30, 0x30, + 0xf8, 0xcc, 0xcc, 0xfa, 0xc6, 0xcf, 0xc6, 0xc7, 0x0e, 0x1b, 0x18, 0x3c, 0x18, 0x18, 0xd8, 0x70, + 0x1c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00, 0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00, + 0x00, 0x1c, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x1c, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00, + 0x00, 0xf8, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0x00, 0xfc, 0x00, 0xcc, 0xec, 0xfc, 0xdc, 0xcc, 0x00, + 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00, + 0x30, 0x00, 0x30, 0x60, 0xc0, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc0, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0x0c, 0x0c, 0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xde, 0x33, 0x66, 0xcc, 0x0f, + 0xc3, 0xc6, 0xcc, 0xdb, 0x37, 0x6f, 0xcf, 0x03, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, + 0x00, 0x33, 0x66, 0xcc, 0x66, 0x33, 0x00, 0x00, 0x00, 0xcc, 0x66, 0x33, 0x66, 0xcc, 0x00, 0x00, + 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, + 0xdb, 0x77, 0xdb, 0xee, 0xdb, 0x77, 0xdb, 0xee, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, + 0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, + 0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36, + 0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, + 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, + 0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x36, 0x36, 0x36, 0x36, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, + 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x76, 0xdc, 0xc8, 0xdc, 0x76, 0x00, 0x00, 0x78, 0xcc, 0xf8, 0xcc, 0xf8, 0xc0, 0xc0, + 0x00, 0xfc, 0xcc, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, + 0xfc, 0xcc, 0x60, 0x30, 0x60, 0xcc, 0xfc, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0x70, 0x00, + 0x00, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0xc0, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x00, + 0xfc, 0x30, 0x78, 0xcc, 0xcc, 0x78, 0x30, 0xfc, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0x6c, 0x38, 0x00, + 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x6c, 0xee, 0x00, 0x1c, 0x30, 0x18, 0x7c, 0xcc, 0xcc, 0x78, 0x00, + 0x00, 0x00, 0x7e, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x06, 0x0c, 0x7e, 0xdb, 0xdb, 0x7e, 0x60, 0xc0, + 0x38, 0x60, 0xc0, 0xf8, 0xc0, 0x60, 0x38, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x00, + 0x00, 0xfc, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x00, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0xfc, 0x00, + 0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0xfc, 0x00, 0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0xfc, 0x00, + 0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0x70, + 0x30, 0x30, 0x00, 0xfc, 0x00, 0x30, 0x30, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00, + 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x3c, 0x1c, + 0x78, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x70, 0x18, 0x30, 0x60, 0x78, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const uint8_t avpriv_vga16_font[4096] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0xc3, 0xc3, 0xdb, 0xdb, 0xc3, 0xc3, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xde, 0xde, 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, 0x0c, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xc3, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x38, 0x6c, 0xc6, 0x00, 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, 0x00, 0x00, + 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, + 0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, + 0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x6c, 0x38, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b, 0x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, + 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x18, 0x7e, 0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0x66, 0x66, 0x7c, 0x62, 0x66, 0x6f, 0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0x70, 0x00, 0x00, + 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x9b, 0x06, 0x0c, 0x1f, 0x00, 0x00, + 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, + 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, + 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; diff --git a/xga_font_data.h b/xga_font_data.h new file mode 100644 index 0000000..ca5ee79 --- /dev/null +++ b/xga_font_data.h @@ -0,0 +1,34 @@ +/* + * CGA/EGA/VGA ROM font data + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * CGA/EGA/VGA ROM font data + */ + +#ifndef AVUTIL_XGA_FONT_DATA_H +#define AVUTIL_XGA_FONT_DATA_H + +#include + +extern const uint8_t avpriv_cga_font[2048]; +extern const uint8_t avpriv_vga16_font[4096]; + +#endif /* AVUTIL_XGA_FONT_DATA_H */