Skip to content

Instantly share code, notes, and snippets.

@felipemanga
Created December 5, 2017 12:08
Show Gist options
  • Save felipemanga/9d5232e219d5adcddae5f18bdb0cb3f3 to your computer and use it in GitHub Desktop.
Save felipemanga/9d5232e219d5adcddae5f18bdb0cb3f3 to your computer and use it in GitHub Desktop.
:100000000C94D5070C94FD070C94FD070C94FD0788
:100010000C94FD070C94FD070C94FD070C94FD0750
:100020000C94FD070C94FD070C94200E0C94920E7A
:100030000C94FD070C94FD070C94FD070C94FD0730
:100040000C94FD070C94FD070C94FD070C94FD0720
:100050000C94FD070C94FD070C94FD070C945E08AE
:100060000C94FD070C94FD070C94FD070C94FD0700
:100070000C94FD070C94FD070C94FD070C94FD07F0
:100080000C94FD070C94FD070C94FD070C94FD07E0
:100090000C94FD070C94FD070C94FD070C94FD07D0
:1000A0000C94FD070C94FD070C94FD07F6121C132D
:1000B00038135A13861390139D13B113C013D21320
:1000C000DC13F313F9130714141442145A146614AE
:1000D0008F14471AB214C514DA1421156F159F1521
:1000E000DC15F21501161016421645165416781630
:1000F0009C16A516AC16B116E416E616E816EA1616
:10010000F216F616FA162F1732173E176B179117BD
:10011000A817AD17B417F017411864189E18A9183E
:10012000B118B918D5F08D14A1C881CFD9F1AF207D
:1001300000210680284F000000000000284F00002A
:1001400000000000284F00000000000029300000DF
:1001500000000000284F000000000000284F0000B1
:1001600000000000284F000000000000284F0000A1
:1001700000000000284F000000000000D84ED94EBB
:10018000B0000000000000000000000000000000BF
:10019000000000000000000000000000000000005F
:1001A000000000000000000000000000000000004F
:1001B000000000000000000000000000000000003F
:1001C000000000000000000000000000000000002F
:1001D000000000000000000000000000000000001F
:1001E000000000000000000000000000000000000F
:1001F00000000000000000000000000000000000FF
:1002000000000000000000000000000000000000EE
:1002100000000000000000000000000000000000DE
:1002200000000000000000000000000000000000CE
:1002300000000000000000000000000000000000BE
:1002400000000000000000000000000000000000AE
:10025000000000000000000000000000000000009E
:10026000006108DF08B80D2101307108B0000000FE
:10027000000000000000000000000000000000007E
:10028000000000000000000000000000000000006E
:10029000000000000000000000000000000000005E
:1002A000000000000000000000000000000000004E
:1002B000000000000000000000000000000000003E
:1002C000000000000000000000000000000000002E
:1002D000000000000000000000000000000000001E
:1002E000000000000000000000000000000000000E
:1002F00000000000000000000000000000000000FE
:1003000000000000000000000000000000000000ED
:1003100000000000000000000000000000000000DD
:1003200000B80D2101F000000000000000000000F6
:100330000054696E792054657472697320202020FE
:10034000204D696E6920564D55205465747269734D
:10035000206279206D617263757320202020202037
:10036000200000000000000000000000000000006D
:100370000002000A00000000000000000000000071
:10038000000000000000000000000000000000006D
:10039000000000FCFCA0F0F0F0CFFC0AF00FF0FF32
:1003A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D
:1003B000FF0000000000000000000000000000003E
:1003C000000000000000000000000000000000002D
:1003D000000000000000000000000000000000001D
:1003E000000000000000000000000000000000000D
:1003F0000000000001111111111110000000000097
:100400000000000001222231222230000000000002
:1004100000000000012222312222300000000000F2
:1004200000000000012222312222300000000000E2
:1004300000000000012222312222300000000000D2
:10044000000000000133333133333000000000007E
:100450000000000000000001111111111110000036
:1004600000000000000000012222312222300000A2
:100470000000000000000001222231222230000092
:100480000000000000000001222231222230000082
:100490000000000000000001222231222230000072
:1004A000000000000000000133333133333000001E
:1004B0000000000004444440000000000000000070
:1004C000000000000455556000000000000000001E
:1004D000000000000455556000000000000000000E
:1004E00000000000045555600000000000000000FE
:1004F00000000000045555600000000000000000EE
:1005000000000000046666600000000000000000BB
:100510000000000004444444444444444440000077
:1005200000000000045555645555645555600000A1
:100530000000000004555564555564555560000091
:100540000000000004555564555564555560000081
:100550000000000004555564555564555560000071
:1005600000000000046666646666646666600000FB
:10057000000000000000000000000000000000007B
:10058000000000000000000000000000000000006B
:10059000000000000000000000000000000000005B
:1005A000000000000000000000000000000000004B
:1005B000000000000000000000000000000000003B
:1005C000000000000000000000000000000000002B
:1005D000000000000000000000000000000000001B
:1005E000000000000000000000000000000000000B
:1005F00000000000000000000000000000000000FB
:1006000000000000000000000000000000000000EA
:1006100000000000000000000000000000000000DA
:1006200000000000000000000000000000000000CA
:1006300000000000000000000000000000000000BA
:1006400000000000000000000000000000000000AA
:100650000000000001111111111110000000000034
:1006600000000000012222312222300000000000A0
:100670000000000001222231222230000000000090
:100680000000000001222231222230000000000080
:100690000000000001222231222230000000000070
:1006A000000000000133333133333000000000001C
:1006B0000000000004444441111111111110000008
:1006C0000000000004555561222231222230000032
:1006D0000000000004555561222231222230000022
:1006E0000000000004555561222231222230000012
:1006F0000000000004555561222231222230000002
:10070000000000000466666133333133333000008B
:100710000000000004444444444444444440000075
:10072000000000000455556455556455556000009F
:10073000000000000455556455556455556000008F
:10074000000000000455556455556455556000007F
:10075000000000000455556455556455556000006F
:1007600000000000046666646666646666600000F9
:100770000000000000000000000000000000000079
:100780000000000000000000000000000000000069
:100790000000000000000000000000000000000059
:1007A0000000000000000000000000000000000049
:1007B00000230EA1232009232780D84EDF44234C99
:1007C000FF0312123C1B0A2304D723050B1B3E0F09
:1007D00081E13090FA23049723050C1B3E2300008F
:1007E0001239123A0FA51AEF223864223B00223048
:1007F000052231001BB71303230000230207400327
:1008000002123222330002381237182A190F902DA3
:10081000184C0F1690035237F90238123702313153
:1008200012106231190F72319008184C6231184C55
:1008300001E02300040FA519901A0901B123045700
:1008400023050D1B7B01880F816100D23B1236719D
:1008500000F1FFE130123B6A36120230800E723036
:10086000190F62309006184C7230184C6B36130218
:1008700030310A0E6230190F72309006184C623017
:10088000184C6C362460336034603502336300E109
:10089000031233182A190F70357034900A7100183A
:1008A0004C182A184C6033703323000069360263F9
:1008B00000A0785C09034C9E00049F0003A029F06F
:1008C0009F4CFD232700F807785CF37F4CF8232723
:1008D000809F4CFD01DC61006102610360026125C3
:1008E000823912391303023A9100123A2325010F7B
:1008F000D02325000FD071257002710371027100A1
:10090000A02202C523020A400FE022028523020A28
:1009100040DD0E610061026105610460022304A9EB
:1009200023050D0302DF01F0DF01F0DF01F0130208
:100930000302C11663020202810612020302C116FB
:1009400063020202810A12020302E10790E27002CE
:100950007104710571027100FD0EA061056104232F
:10096000047123050D0232E0E0D233E06100C112D0
:100970003471006300C1123571047105A0DD0E6190
:100980000061026103612560026003610461050288
:1009900034130402351305023081111302DF01D034
:1009A000DF01D0DF01D088310281061202023181DD
:1009B000082325009C00026325E10EDF01F0DF0122
:1009C000F0DF01F08202D18012020302E10713027C
:1009D0006302230001C05302FC1302220304230319
:1009E00004600261250305D013050304D013049F9E
:1009F00001040302F6160202E10F3105117F010E18
:100A00000202810A9F010B232501D1800104020209
:100A1000810612025303CE712570020302DF01D05A
:100A200013029F010523028062025203B171057116
:100A300004700370027125710371027100FD0EA034
:100A40006102610360016003610461050234130403
:100A5000023513050231DF01F08B30026300813E65
:100A600012010230E10713026302230001C05302A6
:100A7000FC130222030423030460010305D01305C1
:100A80000304D013049F01050302E5902D020181A8
:100A90000212015303E570010302DF01D013029F2C
:100AA000010523028062015203CC2300007105710D
:100AB000047003700171037102A070012300010131
:100AC000EC6102610360016003610461050234139B
:100AD00004023513050231DF01F08B30026300811F
:100AE0003E12010230E10713026302230001C053EA
:100AF00002FC130222030423030460010305D01344
:100B0000050304D013049F01040302D515020181DB
:100B10000212015303E670010302DF01D013029FAA
:100B2000010523028062015203CD2300007105718B
:100B3000047003700171037102A061006000600124
:100B4000220064220164041562006201E441FF0B8B
:100B5000720123000A0FA51A5B010D041502013270
:100B600000021A69A10312010200A1031200413C14
:100B7000D532011125C06201250F02011AA6A10379
:100B80001201413CEF700170007100A06100023859
:100B9000310204730012387100A0DD0E600261257D
:100BA00061056104610002001AC306E11F130462BB
:100BB0000206E1F81305710061001AC306E1E0D3F3
:100BC0000416620206E107D305167100710471056F
:100BD00071257002FD0EA0DD0E6100600261251A14
:100BE000C306E1E016620206E10716712570027184
:100BF00000FD0EA06100220282A13EDF01D098001C
:100C00000322028881082325009C00026325E10E4F
:100C1000DF01F0DF01F0DF01F0820212027100A0BB
:100C2000600122013E25C06201250F6201020141DF
:100C30006AF32266FF2267FF7001A0DD0E6100618A
:100C4000256002232500220280260062020202E1C2
:100C50000F410C06020281041202020290EB782579
:100C60000523250101E0700271257100FD0EA0DD54
:100C70000E6100612561036002220280F3001325EA
:100C80001303C11662020202E10F410C0D02028140
:100C9000041202900563252202806303030341C00E
:100CA000E17002710371257100FD0EA0DD0E61255A
:100CB00060022325002202E22303000303C116631E
:100CC0000362020303C11663030202810579030A6A
:100CD00081049F0105818023250112020303411A2B
:100CE000DC70027125FD0EA061026103023C13025B
:100CF00023004E23036D30130203038139123C039A
:100D000002913071037102A0DB6DB6C36C36DB6DEE
:100D1000B6C36C36000000000000186006186D8035
:100D2000186006186D80000000000000186C0603B3
:100D30006C30186C06036C30000000000000186076
:100D400006186C06186006186C060000000000000B
:100D5000186D86186DB0186D86186DB00000000013
:100D600000000000000000000194299494C0015488
:100D700054595500018854D11480014855515440AC
:100D8000018854D08D8000000000000000000000A9
:100D900000000FFFFFFFFFF00800000000100B3302
:100DA000998303900AAA220492500B331107BB9037
:100DB0000A2A088492500A2BB3048390080000008A
:100DC00000100FFFFFFFFFF00000000000002600F2
:100DD0000000000049000000000049000000000081
:100DE0004900000000003200000000000000000088
:100DF00000007F00000000000001E00780007F018C
:100E0000200480004801200480004C012004800060
:100E10004A012004800031012004800000012004E8
:100E200080004001200480004001200480007F01F8
:100E30002004800040012004800040012004800044
:100E400000012004800041012004800041012004B1
:100E500080004901200480004901200480007F01B6
:100E60002004800000012004800040012004800054
:100E700040013FFC80007F01000080004001000035
:100E800080004001FFFF8000000044AE8AE8EEAC25
:100E9000AAA84AAE00004AECAA8AAACCAA8A44EAC6
:100EA0000000640230064026600C620460032046A5
:100EB000C006640470022026400E600660066006CC
:100EC0006006460470012062800E440670046022B1
:100ED000200E2222000F4444F0003E63676B7363D0
:100EE0003E001838181818183C003E63033E606036
:100EF0007F003E63030E03633E006363637F03036F
:100F000003007F60607E03633E003E63607E636338
:100F10003E007F0303060C0C0C003E63633E6363DC
:100F20003E003E63633F03633E000000000000009C
:100F30000000080B00020202010009040000010287
:100F4000020000052400100105240101010424020F
:100F5000060524060001070581031000400904016D
:100F600000020A0000000705020240000007058396
:100F7000024000000403090412010002EF020140D4
:100F80004123368000010102030141726475696EDC
:100F90006F204C4C430041726475696E6F204C6544
:100FA0006F6E6172646F0000571E11241FBECFEF79
:100FB000DAE0DEBFCDBF11E0A0E0B1E0E6E8FDE39E
:100FC00002C005900D92A632B107D9F728E0A6E23B
:100FD000B1E001C01D92A433B207E1F717E0C5EDFF
:100FE000D7E004C02197FE010E94B61EC43DD10780
:100FF000C9F70E94FD100C94C11E0C9400003FB76D
:10100000F8948091CA079091CB07A091CC07B0913A
:10101000CD0726B5A89B05C02F3F19F00196A11D4D
:10102000B11D3FBFBA2FA92F982F8827820F911D7E
:10103000A11DB11DBC01CD0142E0660F771F881FC5
:10104000991F4A95D1F708958F929F92AF92BF92C0
:10105000CF92DF92EF92FF926B017C010E94FF071B
:101060004B015C01C114D104E104F104F1F00E94D0
:10107000FF07DC01CB0188199909AA09BB09883E41
:101080009340A105B10570F321E0C21AD108E1082F
:10109000F10888EE880E83E0981EA11CB11CC114D3
:1010A000D104E104F10419F7DDCFFF90EF90DF9058
:1010B000CF90BF90AF909F908F9008951F920F9206
:1010C0000FB60F9211242F933F938F939F93AF935B
:1010D000BF938091260190912701A0912801B091A2
:1010E00029013091C90723E0230F2D3720F4019601
:1010F000A11DB11D05C026E8230F0296A11DB11D3B
:101100002093C9078093260190932701A09328017B
:10111000B09329018091CA079091CB07A091CC0789
:10112000B091CD070196A11DB11D8093CA07909380
:10113000CB07A093CC07B093CD07BF91AF919F9100
:101140008F913F912F910F900FBE0F901F90189588
:101150008EBD00000DB407FEFDCF08952F923F9283
:101160004F925F926F927F928F929F92AF92BF92B7
:10117000CF92DF92EF92FF920F931F93CF93DF9363
:10118000CDB7DEB7EC970FB6F894DEBF0FBECDBF7C
:10119000CE0101964C0180E3D4011D928A95E9F7B6
:1011A0001091D906133808F01358012F02950695AF
:1011B000069503701F73110F90E0792F7370872FBE
:1011C000880FB0902A016401FE013896612F56E025
:1011D0001F5F20E8029FD0011124A60FB11DA55D5D
:1011E000BC4F4C91B11001C040E0342F331F332766
:1011F000331F082E01C0330F0A94EAF7D6012C9151
:10120000232B2C93DF01169746FBFF24F0F8F9AA55
:101210001AAAE9A8FAA8082E01C0EE0C0A94EAF767
:101220003C91E32AEC92119645FBFF24F0F8FBAACF
:101230001CAAEBA8FCA8082E01C0EE0C0A94EAF741
:101240003C91E32AEC92119644FBFF24F0F8FDAAAE
:101250001EAAEDA8FEA8082E01C0EE0C0A94EAF71B
:101260003C91E32AEC92119643FBFF24F0F8FFAA8D
:1012700018AEEFA8F8AC082E01C0EE0C0A94EAF7FD
:101280003C91E32AEC92119642FBFF24F0F8F9AE70
:101290001AAEE9ACFAAC082E01C0EE0C0A94EAF7DB
:1012A0003C91E32AEC92DF0141FB222420F8312C0F
:1012B0009101082E01C0220F0A94EAF73E91232BD8
:1012C0002C9340FB662460F8712C9301082E01C01A
:1012D000220F0A94EAF73081232B2083212F2F70CD
:1012E0002C3010F015E0160F17FF02C00F5F1058DA
:1012F000023021F4163010F0165000E0515028E072
:10130000C20ED11C3896552311F0612F61CF733076
:1013100079F5412C512C620183E0CC0CDD1C8A95BF
:10132000E1F7A12CB12C7501EC28FD28E80CF91C83
:10133000D7012C91822F880F282B2095822F2BAF3D
:101340009CAF0E94A8082BAD822F0E94A808F7012D
:101350001082FFEFAF1ABF0A9CAD28E0A216B104BD
:1013600011F78FEF481A580AA6E04A16510499F669
:101370009F5F903209F021CF1092B707EC960FB61D
:10138000F894DEBF0FBECDBFDF91CF911F910F91BB
:10139000FF90EF90DF90CF90BF90AF909F908F9095
:1013A0007F906F905F904F903F902F9008950F9394
:1013B0001F93CF93DF931F92CDB7DEB78C01803898
:1013C0009140F0F08091DC06833008F040C182301B
:1013D00029F4063891E0190708F039C1F80120E82E
:1013E000829FE00DF11D1124E555FE4F6083809131
:1013F0002A01882309F426C181E08093B70722C11E
:10140000053181E0180709F4B0C000F50E3021E085
:10141000120709F468C050F4011591E01907B9F1F9
:101420000D3021E0120709F444C00CC1013181E004
:10143000180709F482C0033191E0190709F48AC042
:10144000003121E0120709F0FDC069C00D3181E0D3
:10145000180709F4AEC058F4083121E0120709F466
:101460008FC00B3181E0180709F498C0EBC0073238
:1014700091E0190709F4A8C0063621E0120709F423
:10148000B6C0023281E0180709F0DCC0B0CF862F69
:1014900082958F708627982F969596958927982FF5
:1014A000969589279091B80680FB90F99093B8069D
:1014B000C9C08091C406862780FFC4C08091BA0746
:1014C0009091BB078E3F2FEF920708F0BBC0409171
:1014D000BC075091BD07FA01E80FF91FE491E13212
:1014E00009F0B0C09DC0862F807A803271F028F458
:1014F0008111A8C088EB9BE00AC0803869F0803A6F
:1015000009F0A0C088E491E002C084EA90E09093E2
:10151000B9078093B80796C080E797E1F8CF66FDDA
:1015200007C08091CA0690E09093B2068093B106FE
:1015300067FD88C08091CC061DC080E091E0861BCD
:1015400091099093B4068093B3061092B606109258
:10155000B50678C08091C70686FD74C0862F90E0DE
:101560009093B2068093B1066DC08091C70687FD47
:1015700069C0862F90E09093B0068093AF0662C05A
:1015800066FD07C08091D20690E09093AE068093EE
:10159000AD0667FD57C08091D40610C08091CF067C
:1015A00086FD50C0862F90E09093AE068093AD06E6
:1015B00049C08091CF0687FD45C0862F90E090936B
:1015C000AC068093AB063EC0262F221F2227221F87
:1015D000422F50E080912A0190E04817590791F17D
:1015E00020932A0169830E94AE0869812BC09091E3
:1015F0001C0780911B07E82FF0E0F92BF170E55DE7
:10160000FE4F608320911A0724FF21C08F5F8093D3
:101610001B0781111CC081E0892780931C0717C01C
:101620009C012F5F3F4FFA01E20FF31F24910296B6
:10163000FA01E80FF91FE491F0E0F22BF093BB07F9
:10164000E093BA071127F801E954F94F60830F902E
:10165000DF91CF911F910F910895A7EBB6E01696F9
:101660009C911697E92FF0E0E555FB4F8081915052
:1016700016969C9308958F3F910509F068F4209188
:10168000B80626952170F22FE0E08E0F9F1FFC0117
:10169000E555FB4F608308950C94D7098F3F910562
:1016A00009F060F42091B80626952170F22FE0E051
:1016B0008E0F9F1FFC01E555FB4F11C0803821E0C4
:1016C000920778F02091DC06233008F056C030E80D
:1016D000239F800D911D1124FC01E555FE4F808153
:1016E00008958D3121E0920719F178F4843121E0D9
:1016F0009207C1F08B3131E09307B9F0823121E0DC
:101700009207B1F58091B1060895853631E09307CF
:1017100091F0863621E0920791F08C3531E0930705
:1017200039F52DC08091AF0608958091AD060895DA
:101730008091AB06089580911C078E6F08952091CB
:101740001C0790911B07E92FF0E0F22BF170E55D8B
:10175000FE4F808130911A0734FF12C09F5F909333
:101760001B0791110DC091E0922790931C070895DB
:101770009927FC01E954F94FB2CF8FEF089582E029
:101780000895A7EBB6E01696EC911697EF5F1696C4
:10179000EC93F0E0E555FB4F808308958B3121E019
:1017A000920741F08D3121E0920721F00E944E0B0B
:1017B00090E008958FEF90E0089521E030E001C0BF
:1017C000220F8A95EAF780910307282B20930307BD
:1017D0008091050782FF03C082608093050708950A
:1017E00021E030E001C0220F8A95EAF72095809130
:1017F00003072823209303078091050782FF03C076
:101800008260809305070895FC018091D6078111BD
:1018100003C08FEF9FEF08959FB7F89482E0809305
:10182000E9002091F20030E01216130614F421E0D2
:1018300030E02115310559F0289884E68093D507CA
:101840008091F10080838091F200882319F09FBF7E
:10185000C90108958BE68093E800F9CF2FB7F8947B
:1018600083E08093E9009091E800892F807295FFD2
:1018700004C09091F20080E4891B2FBF0895CF929D
:10188000DF92EF92FF920F931F93CF93DF936C0140
:101890007A018B01C0E0D0E0CE15DF0589F0D801D8
:1018A0006D918D01D601ED91FC910190F081E02DBB
:1018B000C6010995892B11F47E0102C02196ECCF57
:1018C000C701DF91CF911F910F91FF90EF90DF90B3
:1018D000CF90089580912C0881110DC082E08093F3
:1018E000280884E08093290810922B0810922A0877
:1018F00081E080932C0888E298E00895CF93DF93ED
:101900001F92CDB7DEB76983DC01ED91FC910280B7
:10191000F381E02D41E050E0BE016F5F7F4F0995FC
:101920000F90DF91CF91089583E08093E90080913B
:10193000F200882319F08AE38093E80008950E945A
:101940002E0C90E00895CF93DF931F92CDB7DEB7B2
:10195000FC018485958597FD05C02FEF3FEF358706
:1019600024870BC0CE0101960E94040C019719F444
:10197000898190E002C08FEF9FEF0F90DF91CF91B0
:1019800008950F931F93CF93DF931F92CDB7DEB7C8
:101990008C01FC018485958597FF0EC0CE010196D0
:1019A0000E94040C019719F4298130E002C02FEF46
:1019B0003FEFF80135872487F801848595850F90DE
:1019C000DF91CF911F910F910895FC01848595853A
:1019D00097FD0BC09FB7F89482E08093E900809157
:1019E000F2009FBF90E0019608959FB7F89482E0BF
:1019F0008093E9008091F2009FBF90E008950895E0
:101A000080E090E008950E94BC1E8F929F92AF925A
:101A1000BF92CF92DF92EF92FF920F931F93CF93DB
:101A2000DF935C016B017A0180910B01882309F43B
:101A30005BC08091D607882309F456C08091D407F3
:101A400080FF05C08091E00082608093E000E701A4
:101A500010E00AEF83E0882E9AE3992E2097D9F1BF
:101A60000E942E0C81110AC0015009F43DC061E0B2
:101A700070E080E090E00E942408F0CF282F30E052
:101A8000C217D3070CF48C2F4FB7F8948092E9005B
:101A90009091E80095FF1DC0282F30E0C21BD30BAA
:101AA000F601982F915020F081918093F100FACFA8
:101AB000C20ED31E112319F09092E80009C0809144
:101AC000E80085FD06C09092E80011E0209709F03B
:101AD00010E04FBFC3CF1111C3CF5D9884E6809350
:101AE000D7071E141F0444F081E090E0F5019383B2
:101AF000828380E090E001C0C701DF91CF911F9108
:101B00000F91FF90EF90DF90CF90BF90AF909F909C
:101B10008F900895CF92DF92EF92FF920F931F93D1
:101B2000CF93DF931F92CDB7DEB7182F062FE42E89
:101B3000862F880F8E5F99830E94C21083E00E94D7
:101B4000C210F12EC12E9981D92E8C2D8F1980179C
:101B500098F4F601E7FE02C0849101C080810E94E2
:101B6000C210182F80E00E94C2108123FFEFCF1A0D
:101B7000DF0A8111EACF01C081E00F90DF91CF91A0
:101B80001F910F91FF90EF90DF90CF900895DF921B
:101B9000EF92FF920F931F93CF93DF93D82E8A017A
:101BA0007B01E40EF51EEB01CE15DF0571F0D7FECB
:101BB00003C0FE01849101C088810E94C210219659
:101BC0008111F2CF8FEF9FEF01C0C801DF91CF915C
:101BD0001F910F91FF90EF90DF9008950F931F9347
:101BE000CF93DF931F92CDB7DEB782E0898342E4C3
:101BF00050E062E37FE080E80E94C70D0E946A0C1B
:101C0000DC0112960D911C9113970115110569F0D5
:101C1000D801ED91FC910280F381E02DBE016F5F50
:101C20007F4FC801099597FF07C089810F90DF9109
:101C3000CF911F910F910895F80100851185E5CF8F
:101C40001F920F920FB60F9211248F939F93809142
:101C5000E1009091E100937F9093E10083FF0FC03A
:101C60001092E90091E09093EB001092EC0092E367
:101C70009093ED001092D60798E09093F00082FFC9
:101C800020C093E09093E9009091F200992319F01D
:101C90009AE39093E8009091D707992339F09091B7
:101CA000D70791509093D707992389F19091D50741
:101CB000992339F09091D50791509093D5079923A6
:101CC00041F184FF10C08091E2008E7E816080939C
:101CD000E2008091E1008F7E8093E1008091D40743
:101CE0008E7E806111C080FF16C08091E2008E7EE2
:101CF00080618093E2008091E1008E7E8093E1001C
:101D00008091D4078E7E81608093D40704C05D9A51
:101D1000CDCF289AD6CF9F918F910F900FBE0F9065
:101D20001F9018951F920F920FB60F921124CF9209
:101D3000DF92EF92FF920F931F932F933F934F9356
:101D40005F936F937F938F939F93AF93BF93EF9323
:101D5000FF93CF93DF93CDB7DEB76C97DEBFCDBFD8
:101D60001092E9008091E80083FFEDC168E0CE01A8
:101D700045960E94F01082EF8093E8008D8987FFDE
:101D800005C09091E80090FFFCCF03C09EEF9093B8
:101D9000E800982F907609F0C6C09E892F89188D8B
:101DA00091110CC0803829F48091D3078093F10001
:101DB00002C01092F1001092F10048C1422F50E091
:101DC000512B913051F4811141C14130510509F03D
:101DD0003DC18091D3078D7F0BC0933061F4811199
:101DE00035C14130510509F031C18091D30782607E
:101DF0008093D3072BC1953041F48091E80080FF98
:101E0000FCCF20682093E30021C1963009F05FC029
:101E1000EB8CFC8C1092E9001092D1071092D00745
:101E2000123091F51092CF071092CE070E94EE0D5E
:101E300099E0BE016F5F7F4FDB01E92F1D92EA95AC
:101E4000E9F799831A8391E09E8390EA98879AEF45
:101E500099872091D0073091D107275F3F4F3C836E
:101E60002B838D831092E9001092D1071092D00736
:101E7000F092CF07E092CE0749E050E080E00E9468
:101E8000C70D0E94EE0DE2C0F092CF07E092CE07A0
:101E90000E946A0CDC011296ED90FC901397E114FD
:101EA000F10409F4C0C0D701ED91FC910480F581E3
:101EB000E02DBE016B5E7F4FC7010995009719F0B9
:101EC0000CF0C4C0C7C0F701E084F184E8CF9730BC
:101ED00009F4C0C0983021F481E08093F100B6C0CD
:101EE000993009F0B3C0837009F0B4C0EDE0F1E0BF
:101EF00081E021E036E39081992361F08093E9004D
:101F00002093EB0091919093EC003093ED008F5F64
:101F1000873089F78EE78093EA001092EA008F8974
:101F20008093D60793C08B8D9C8D1092E900109200
:101F3000D1071092D0079093CF078093CE07898D59
:101F4000811156C08E899D89913A59F4813209F0E8
:101F500081C047E050E064E071E080E00E94C70D7E
:101F600075C0913209F076C0833289F4888D90E093
:101F7000982F88272F89822BA0E0B0E08093000162
:101F800090930101A0930201B09303015FC08032DE
:101F900069F48091E80082FFFCCF67E084E091E083
:101FA0000E94F0108BEF8093E80006C0823209F0A7
:101FB0004DC08F8980930B018091D207882319F03F
:101FC000EEEFFAE002C0E0E0F8E0809104019091C9
:101FD0000501A0910601B0910701803B9440A10545
:101FE000B10509F07BC080910B0180FF93C076C0E2
:101FF0000E946A0CDC0112960D911C911397011539
:10200000110541F1D801ED91FC910190F081E02D95
:10201000BE016B5E7F4FC8010995811117C0F801A1
:1020200000851185ECCF113009F44EC0133091F4C6
:102030008F89882309F445C0823081F440E860E14B
:1020400086E99FE00E948A0D882321F08EEF80931D
:10205000E80079C081E28093EB0075C0813029F4FB
:1020600040E86BE08AE89FE0EDCF833099F70E946B
:102070006A0CDC011296ED90FC9013978E010F5FB5
:102080001F4F6801E114F10479F0D701ED91FC9143
:102090000680F781E02DB801C7010995080F111DD1
:1020A000F701E084F184EECFD8011C92F601019093
:1020B0000020E9F73197BF016C197D0940E0C601A6
:1020C000C1CF64E77FE002C068E77FE0611571057A
:1020D00009F2FB01449150E080E840CF0FB6F8943C
:1020E000A8958091600088618093600010926000E4
:1020F0000FBEA895EE3F2AE0F20739F08091FE0A64
:102100009091FF0A91838083A1CF1092FF0A1092D1
:10211000FE0A9CCFEE3F8AE0F80731F08081918182
:102120009093FF0A8093FE0A87E797E79183808365
:102130009BE088E10FB6F894A895809360000FBEED
:102140009093600083CF6C960FB6F894DEBF0FBEFD
:10215000CDBFDF91CF91FF91EF91BF91AF919F9153
:102160008F917F916F915F914F913F912F911F912F
:102170000F91FF90EF90DF90CF900F900FBE0F90D8
:102180001F9018954091D0075091D1072091CE070C
:102190003091CF0742175307B4F49091E80095703F
:1021A000E1F39091E80092FD19C08093F1008091D5
:1021B000D0079091D10701968F739927892B19F435
:1021C0008EEF8093E8008091D0079091D10701961F
:1021D0009093D1078093D00781E0089580E008951F
:1021E000615030F02091F100FC0120830196F8CF7E
:1021F000289884E68093D5070895CF93DF9300D085
:1022000000D01F92CDB7DEB7789484B5826084BDCC
:1022100084B5816084BD85B5826085BD85B58160EA
:1022200085BD80916E00816080936E001092810068
:102230008091810082608093810080918100816023
:1022400080938100809180008160809380008091E4
:1022500091008260809391008091910081608093D1
:102260009100809190008160809390008091C100E6
:1022700084608093C1008091C10082608093C1001E
:102280008091C10081608093C1008091C300816012
:102290008093C3008091C00082608093C0008091D1
:1022A000C20081608093C20080917A008460809334
:1022B0007A0080917A00826080937A0080917A001F
:1022C000816080937A0080917A00806880937A00A0
:1022D0001092D6071092D3071092D4078091D7009E
:1022E00081608093D70080EA8093D80089B58061AF
:1022F00089BD89B5826089BD09B400FEFDCF61E06A
:1023000070E080E090E00E9424088091D8008F7CEB
:1023100080618093D8008091E000807F8093E0000E
:102320008091E1008E7E8093E1008DE08093E20059
:10233000559A209AEEEFFFE7859194918B3F9C4D43
:1023400019F481E08093D20785B1806F85B9249814
:1023500084B1866E84B95E9A5F988AB1806D8AB9BD
:10236000769A6E9881B3806F81BB899880B38D70A7
:1023700080BB80E58CBD81E08DBD65E070E080E0D4
:1023800090E00E9424085F9A65E070E080E090E0B1
:102390000E9424085E985C9874E2E72E71E0F72EA4
:1023A0001DE01E0DF70184910E94A808FFEFEF1AAF
:1023B000FF0A1E11F7CF5C9A01E014E001501109E9
:1023C00021F08AEA0E94A808F9CF5C9881E20E9475
:1023D000A80880E10E94A8088FE60E94A80882E26F
:1023E0000E94A80880E00E94A80887E00E94A80830
:1023F0005C9A2FB7F8946091260170912701809123
:102400002801909129012FBF40E052E0EBEAF4E06F
:10241000DF018A011D9201501040E1F720E831E010
:10242000EBE2F3E0DF0189011D9201501040E1F77A
:10243000EBE2F1E0DF018A011D9201501040E1F76B
:1024400040E051E0E7EBF6E0DF018A011D92015028
:102450001040E1F72FE72093BD061FEF109303070D
:1024600002E00093B8061092B2061092B1061092E4
:10247000B0061092AF061092AE061092AD06109202
:10248000AC061092AB061092B6061092B5065093A9
:10249000B4064093B30620E22093BB0427E12093C7
:1024A000BC04FF24F394F092BD04F092BE04F092B9
:1024B000BF0427E02093C20421EE2093C304F092CE
:1024C000C404F092C504F092C60428EE33E040E064
:1024D00050E00E94941E2093C8041093DC0480E80E
:1024E0008093BF0661E88EE091E00E94D7091092C8
:1024F000B70710922A011092C6071092C5071092D2
:10250000C0071092BF07F092C40681E391E0909358
:10251000BD078093BC071092BB071092BA070093C7
:10252000DC0660E182E891E00E94D7091092DC06A7
:1025300060E887E291E00E94D709CC24C394D12CB3
:1025400056E0452E512C66246394712C8091C70768
:102550009091C8079C01215031093093C8072093FE
:10256000C707892B71F483B7817F83BF83B78160ED
:1025700083BF889583B78E7F83BF5092C8074092F0
:10258000C7070091BC071091BD07E090BA07F09013
:10259000BB07F801EE0DFF1D2491B7016F5F7F4F60
:1025A0007093BB076093BA07822F8F70843048F412
:1025B000823008F044C3882341F0813009F441C1DE
:1025C000E4C5883008F41AC4E0C5E22FF0E034E036
:1025D000F595E7953A95E1F73197EF30F10510F071
:1025E0000C94491AEA5AFF4F0C94B61E82E0860FEB
:1025F0000E94C10B8091BA079091BB070296892F68
:102600000E94C10B8091BA079091BB07F801E80FB7
:10261000F91F34910196F801E80FF91F2491830FF7
:10262000911DE22FF0E0FE2FEE27E80FF91FF09347
:10263000BB07E093BA073CC182E0860F0E94C10B42
:102640008091BA079091BB070296892F0E94C10B17
:102650008091BA079091BB07F801E80FF91F249108
:10266000FC013196E00FF11FE491F0E0F22B56C629
:102670002091B9068091B70690E0982F8827309175
:10268000BA06832B289F7001299FF00C112480919A
:10269000B8068B778093B806E092BA066F2D80E07B
:1026A00091E00E94D709C701FF0CAA0BBB0BB093A6
:1026B000B9062AC06091B90670E08091BA0661152A
:1026C000710541F02091B70690E0922B0E94801E88
:1026D0007C0105C0682F70E07F6FE12CF12C8091A8
:1026E000B8068B77E114F10411F494E001C090E096
:1026F000892B8093B8066093BA06672F80E091E03B
:102700000E94D709E092B90687E0C4C6E091BC06F2
:10271000F0E0FE2FEE278091BB06E80FF11D5AC2B4
:1027200022E0E20EF11CF092BB07E092BA07F8013A
:10273000E60FF71F849190E023C10E942D0BE091DA
:10274000BA07F091BB079F012F5F3F4F3093BB0744
:102750002093BA07E00FF11FE491682F8E2F90E0CD
:10276000A0C22091B706C70102962111ECC3F8015F
:10277000E60FF71F249127FF09C6E491EE2ED9C278
:102780002091B706C7010296222309F4DCC3F801A1
:10279000E60FF71F249127FFF9C5E491EE2EF12CE7
:1027A000FA94F7C50E942D0BE82EF12CFE2CEE2496
:1027B0000E942D0BE82AEFC50E942D0BE82EF12C6C
:1027C000FE2CEE240E942D0BE82AF092BB07E0922B
:1027D000BA078091C5079091C60701979093C607E5
:1027E0008093C50754C66091B70660FB679567F98B
:1027F000C7C48091B70690E06091B806262F80FB91
:1028000027F92093B8069595879560780BC060915D
:10281000B706962F9078892F90E0880F892F881F10
:10282000990B660F682BACC46091B7068091B8060F
:10283000262F2078982F9F77922B9093B806807838
:10284000EBCFE22FF0E044E0F595E7954A95E1F70C
:102850003197EF30F10520F4EB59FF4F0C94B61E81
:10286000F801E60FF71F849187FF04C0E491F0E0C0
:10287000FA9502C0E491F0E052E0E50EF11CEE0D95
:10288000FF1D4CC5F801E60FF71F949162E0E60EBC
:10289000F11CF801EE0DFF1DE491E90EF11CF0E0D2
:1028A000FE2FEE27EE0EFF1EF092BB07E092BA0756
:1028B00084E0F0C5F801E60FF71F8491F701329626
:1028C000E00FF11FE491F0E0F82B28C52091B70646
:1028D00030E04091B8064F77F801E60FF71F84917A
:1028E00090E02817390714F080E001C080E8482BF9
:1028F0004093B806A7014E5F5F4FE491F0E0C70137
:1029000003962E173F0709F01EC3F801E40FF51FC9
:10291000249127FF3BC5E490F12CFA943AC520910D
:10292000B70630E04091B8064F77F801E60FF71F81
:10293000849190E02817390714F080E001C080E806
:10294000482B4093B806A7014E5F5F4FE491F0E03B
:10295000C70103962E173F0709F4F5C2F801E40FEB
:10296000F51FB2C2B2E0EB0EF11CF092BB07E09291
:10297000BA07F801E60FF71FE4918E2F90E09160FF
:102980000E944E0B0E94C10B82C50E942D0BE0914C
:10299000BA07F091BB079F012F5F3F4F3093BB07F2
:1029A0002093BA07E00FF11FE491F0E0682FCF0108
:1029B000916077C13090B706A32CB12CE2E0EE0E07
:1029C000F11CF092BB07E092BA07F801E60FF71F7F
:1029D0002490E22CF12C622D630D80E091E00E94A6
:1029E000D7092091B8062B73C5018E0D9F1D8F3F0F
:1029F000910509F014F430E001C030E8232B332DA9
:102A00003F70422D4F7050E0430F511D4031510532
:102A100014F430E001C030E4232BA094B094AE2431
:102A2000BF24F0E8AF22BB24E826F926AE20BF2061
:102A3000AB2811F480E001C084E0282B2093B80675
:102A400028C53090B706A32CB12C22E0E20EF11C71
:102A5000F092BB07E092BA07F801E60FF71F249047
:102A6000E22CF12C2091B806221F2227221F622F70
:102A7000630D620D80E091E02D830E94D709809163
:102A8000B8068B732D8130E0A5014E0D5F1D420FFE
:102A9000531F4F3F510509F014F490E001C090E836
:102AA000892B932D9F70E22DEF70F0E0E90FF11D5F
:102AB000E20FF31F709714F490E001C090E4892BAB
:102AC000A094B094AE24BF2430E8A322BB24E42613
:102AD000F526AE20BF20AB2809F080C27DC2B090A1
:102AE000B70642E0E40EF11CF092BB07E092BA0791
:102AF000F801E60FF71FF4906B2D6F1980E091E05D
:102B00000E94D7098091B8068B732B2D30E02F19C6
:102B1000310937FD02C020E001C020E8282B8B2DB1
:102B20008F7090E03F2D3F70831B9109991F99276B
:102B3000991F9295990F990F907C822FFBC2B090AC
:102B4000B70652E0E50EF11CF092BB07E092BA071F
:102B5000F801E60FF71FF4904091B806E42EEE1C42
:102B6000EE24EE1C6B2D6F196E1980E091E00E942F
:102B7000D7098091B8068B734E2D50E02B2D30E095
:102B80002F193109241B350B37FD02C090E001C01D
:102B900090E8892B2B2D2F7030E09F2D9F70291BE3
:102BA0003109241B350B932F991F9927991F929553
:102BB000990F990F907CBEC28091B706E091BB0639
:102BC000F0E0E80FF11D8091BC0690E0982F882777
:102BD000E80FF91FE00FF11F649180E091E00E947F
:102BE000D70955C49091B70682E0E80EF11CF09227
:102BF000BB07E092BA07F801E60FF71F6491692B53
:102C0000BFC29091B706A2E0EA0EF11CF092BB079A
:102C1000E092BA07F801E60FF71F64916923B0C28A
:102C20009091B706B2E0EB0EF11CF092BB07E09278
:102C3000BA07F801E60FF71F64916927A1C257018F
:102C4000E2E0AE0EB11CB092BB07A092BA07F80149
:102C5000E60FF71FE491822F8170982E812C1401CA
:102C60002E2AE22FF0E084E0F595E7958A95E1F7CA
:102C70003197EF30F10520F4EC58FF4F0C94B61E5D
:102C8000C101E9C06091B70665C0F3E0EF0EF11C29
:102C9000F092BB07E092BA07F801EA0DFB1D6491C0
:102CA000C1010E943B0BF3C3C1010E944E0B282FB0
:102CB00030E04091B70650E08091B8068F77421718
:102CC000530714F090E001C090E8892B8093B80678
:102CD000C70103964217530709F035C1F801EA0D01
:102CE000FB1D249127FF52C3E490F12CFA9451C3A9
:102CF000C1010E944E0B282F30E04091B70650E0F2
:102D00008091B8068F774217530714F090E001C006
:102D100090E8892B8093B806C701039642175307A2
:102D200009F411C1F801EA0DFB1D249127FF2EC300
:102D3000E490F12CFA942DC3C1010E94CE0B0197AF
:102D40007C01FF246E2DC101F4C0C1010E94CE0B95
:102D500061E0680FC10198C3C1010E94CE0B6FEF03
:102D6000F8CFC1010E944E0BB82EE82EF12CA09096
:102D7000B7062A2C312C682F6A0D80E091E00E9462
:102D8000D7098091B8068B7391012E0D3F1D2F3FFF
:102D9000310509F014F450E001C050E8582B4A2DD9
:102DA0004F708B2D8F7090E0840F911D409714F41D
:102DB00080E001C080E4852B209430942E243F24B1
:102DC00040E82422332402C1C1010BC1C1015AC110
:102DD000C1017BC1C1010E944E0BF82E6091B70664
:102DE000C101B3C1F090B706C101B6C1F090B706FA
:102DF000C101BAC1F090B706C101BEC18091B80649
:102E000090E0959587958C709927322F3370832B9E
:102E10002D8369837C830E944E0B90E02D81698114
:102E20007C8121FD03C040E050E002C040E051E061
:102E30005A01A82AB92AE22FF0E0A4E0F595E79517
:102E4000AA95E1F73197EF30F10520F4ED57FF4FE8
:102E50000C94B61EC5010E944E0B682F91C1609163
:102E6000B70680C082E0E80EF11CF092BB07E0924A
:102E7000BA07F801E60FF71F649174C0C5016983B2
:102E80007C830E944E0B482F50E097012E5F3F4FEE
:102E900069817C81F801E60FF71FE491F0E08091F1
:102EA000B8068F774E175F0714F090E001C090E8E6
:102EB000892B8093B806C7010396E417F50709F03C
:102EC00042C0F801E20FF31F249127FF5FC2E49094
:102ED000F12CFA945EC2C50169837C830E944E0B7B
:102EE000482F50E097012E5F3F4F69817C81F801A8
:102EF000E60FF71FE491F0E08091B8068F774E1748
:102F00005F0714F090E001C090E8892B8093B80629
:102F1000C7010396E417F507B1F0F801E20FF31FBC
:102F200067C2C5010E94CE0B01977C01FF246E2D64
:102F3000C5010E943B0B8091BA079091BB07EF2817
:102F400009F0DDC101969093BB078093BA079FC239
:102F5000C5010E94CE0B61E004C0C5010E94CE0BEA
:102F60006FEF680FC50190C2C5010E944E0BB82ECD
:102F7000E82EF12CA090B7062A2C312C682F6A0D70
:102F800080E091E00E94D7098091B8068B7391018F
:102F90002E0D3F1D2F3F310509F014F450E001C004
:102FA00050E8582B4A2D4F708B2D8F7090E0840F76
:102FB000911D409714F480E001C080E4852B20949B
:102FC00030942E243F24E0E82E223324E226F326F8
:102FD000E220F320EF2811F490E0ACC094E0AAC006
:102FE000C5010E944E0BA82EE82EF12CB090B7061A
:102FF0002B2D30E03B832A832091B806322E331CE0
:103000003324331C632D6B0D680F80E091E00E9428
:10301000D7096091B8066B73232D30E04A815B813C
:103020004E0D5F1D420F531F4F3F510509F014F421
:1030300080E001C080E8682B7B2D7F708A2D8F7027
:1030400090E0870F911D280F391F2031310514F4AE
:1030500080E001C080E4682B8A819B8180959095F7
:103060008E259F2580789927E426F5268E219F219D
:10307000892B11F480E001C084E0682B6093B806CE
:1030800008C2C5010E944E0BF82EE090B7066E2DC7
:10309000681B80E091E00E94D7098091B8068B738D
:1030A0002E2D30E02F19310937FD02C040E001C05C
:1030B00040E8482B2E2D2F7030E08F2D8F70B901F6
:1030C000681B7109CB012EC0C5010E944E0BE82E72
:1030D000B090B7066091B806F62EFF1CFF24FF1CC7
:1030E0006B2D681B6F1980E091E00E94D7098091D9
:1030F000B8068B736F2D70E02B2D30E02E1931093F
:10310000261B370B37FD02C040E001C040E8482BCA
:103110002B2D2F7030E08E2D8F70281B3109261B30
:10312000370B932F991F9927991F9295990F990FF4
:10313000907C842F892B8093B806ABC1C5010E9477
:103140004E0BF82E6091B706C5010E943B0B6F2D08
:1031500017C0F090B706C5010E944E0B682F6F296B
:103160000FC0F090B706C5010E944E0B682F6F216B
:1031700007C0F090B706C5010E944E0B682F6F255F
:1031800080E091E00E94D70984C1822F807E803642
:1031900009F4CDC088F5803209F45EC0803409F4AA
:1031A00079C0811176C1C70102969093BB078093C5
:1031B000BA07F801E60FF71FE491922F9071A92E3C
:1031C000B12CB694BA2CAA24B794A7942770B22A2B
:1031D000AE2A0E94C10B8091BB070E94C10B809157
:1031E000BA079091BB078827907FA82AB92AB09286
:1031F000BB07A092BA074BC1803A09F400C120F482
:10320000803809F4CDC045C1803C09F41AC1803E24
:1032100009F03FC132E0E30EF11CF092BB07E092EF
:10322000BA07F801E60FF71FE491822F807190E052
:1032300074E0880F991F7A95E1F77C01EE2AC701A7
:103240002D830E94CE0B2D812770B60101C0660F21
:103250002A95EAF7682B17C1F801E60FF71FE491EA
:10326000422F407150E05695542F4427579547956B
:103270002770CA01922B9C012E2B92E0E90EF11CC3
:10328000EE24A0EFFA222E293F293093BB0720938A
:10329000BA07FDC0C70102969093BB078093BA0797
:1032A000F801E60FF71FE491822F807190E044E06F
:1032B000880F991F4A95E1F75C01AE2AC5012D835D
:1032C0000E944E0B2D812770482F50E0022E02C025
:1032D000559547950A94E2F740FF25C0F60102C0D4
:1032E000EE0FFF1F2A95E2F79F012095682F6223BA
:1032F000C5010E943B0B8091BA079091BB07F80172
:10330000E80FF91F249127FF04C0E491F0E0FA953B
:1033100002C0E491F0E00196E80FF91FF093BB07BB
:10332000E093BA07B4C0F3E0EF0EF11C34C05701CC
:1033300032E0A30EB11CB092BB07A092BA07F8010D
:10334000E60FF71FE491822F807190E034E0880F40
:10335000991F3A95E1F78E2B2D830E944E0B90E03A
:103360002D812770AC0102C0559547952A95E2F74B
:10337000C701039640FFE7CDF801EA0DFB1D24913C
:1033800027FF04C0E490F12CFA9403C0E491EE2EE0
:10339000F12CE80EF91EF092BB07E092BA0777C055
:1033A000570182E0A80EB11CB092BB07A092BA07E9
:1033B000F801E60FF71FE491822F807190E0B4E0EE
:1033C000880F991FBA95E1F78E2B2D830E944E0B23
:1033D00090E02D812770DC0102C0B595A7952A9554
:1033E000E2F7C7010396A0FDAECDF801EA0DFB1D83
:1033F000249127FFCBCFE490F12CFA94CACFE2E0DE
:10340000EE0EF11CF092BB07E092BA07F801E60F4E
:10341000F71FE491822F807190E0A4E0880F991F3C
:10342000AA95E1F77C01EE2AC7012D830E94CE0BFD
:103430002D812770B60101C0660F2A95EAF768272B
:1034400022C0F2E0EF0EF11CF092BB07E092BA0747
:10345000F801E60FF71FE491822F807190E0F4E00D
:10346000880F991FFA95E1F77C01EE2AC7012D8399
:103470000E94CE0B2D812770B60101C0660F2A95E0
:10348000EAF760956823C7010E943B0B02C082E007
:1034900001C081E0482F50E05B834A83E090C3077E
:1034A000F090C407E40EF51EF092C407E092C30743
:1034B000A090B807B090B907EA14FB0408F4CDC097
:1034C0008091B70781110E94AE084FB12CB193B122
:1034D00030E0209530952074332753E035952795BB
:1034E0005A95E1F7892F90E0809590958071992702
:1034F0009595879595958795822B4095407F382E99
:10350000342A8091BE0737FE0AC080FD11C0816059
:103510008093BE0780E090E00E94F00B09C080FF1E
:1035200007C08E7F8093BE0780E090E00E94DD0B95
:103530008091BE0734FE0AC081FD11C08260809375
:10354000BE0781E090E00E94F00B09C081FF07C038
:103550008D7F8093BE0781E090E00E94DD0B80911B
:10356000BE0735FE0AC082FD11C084608093BE078D
:1035700082E090E00E94F00B09C082FF07C08B7FC1
:103580008093BE0782E090E00E94DD0B8091BE0731
:1035900036FE0AC083FD11C088608093BE0783E0B9
:1035A00090E00E94F00B09C083FF07C0877F8093E3
:1035B000BE0783E090E00E94DD0B8091BE0733FEE2
:1035C0000AC084FD11C080618093BE0784E090E052
:1035D0000E94F00B09C084FF07C08F7E8093BE0756
:1035E00084E090E00E94DD0B8091BE0732FE0AC0AD
:1035F00085FD11C080628093BE0785E090E00E9447
:10360000F00B09C085FF07C08F7D8093BE0785E062
:1036100090E00E94DD0BEA18FB08F092C407E092EC
:10362000C3078091C1079091C2079C012F5F3F4F54
:103630003093C2072093C1072233310570F02091E7
:10364000BF073091C00728603093C0072093BF07A1
:10365000C1979093C2078093C107E091C7068E2F50
:10366000807CA1F18091B5069091B6066A817B813C
:10367000860F971F9093B6068093B5062091B306E8
:103680003091B4068217930708F140E050E04F5F95
:103690005F4F821B930B82179307C8F79093B60670
:1036A0008093B5068E2F807E803E09F096C2809171
:1036B000B1069091B206480F591F4F3F510511F0C6
:1036C00008F040C25093B2064093B1066091CF0615
:1036D000862F807C09F4CDC0862F807E803E09F045
:1036E0005CC08091AD069091AE062A813B81820F2D
:1036F000931F8F3F910509F028F49093AE068093B5
:10370000AD06B7C0AC015A955093AE064093AD06D6
:103710008091AB069091AC069C012F5F3F4F2F3FED
:10372000310509F028F43093AC062093AB06A1C014
:103730008F5F91099093AC068093AB062091D206DF
:1037400030E0420F531F4F3F510509F028F45093CA
:10375000AE064093AD061AC05A955093AE064093FC
:10376000AD064091D40650E0840F951F9093AC06AF
:103770008093AB068F3F910549F040F03093AE0641
:103780002093AD065093AC064093AB06862F8A601B
:103790008093CF0662FF6DC063C066FF33C0809127
:1037A000AD069091AE064A815B81840F951F909380
:1037B000AE068093AD068F3F910521F118F120915F
:1037C000D20630E0A9015A95840F951F8F3F9105CD
:1037D00009F028F49093AE068093AD0604C03093B0
:1037E000AE062093AD06862F82608093CF0660FFE1
:1037F00009C08091BF079091C00780629093C00775
:103800008093BF074091CF0647FF33C08091AB063E
:103810009091AC066A817B81680F791F7093AC062A
:103820006093AB066F3F710521F118F18091D406CA
:1038300090E09C013A95260F371F2F3F310509F084
:1038400028F43093AC062093AB0604C09093AC06EA
:103850008093AB06842F88608093CF0642FF09C017
:103860008091BF079091C00780629093C0078093BA
:10387000BF078091C40680FD0EC18091BA07909168
:10388000BB07803151E0950739F124F4811591404F
:1038900059F0F3C08032A1E09A0709F445C08033A3
:1038A000914009F461C0E9C08091290690E0982F09
:1038B000882720912A06822B81309E402CF460E0DC
:1038C00080E091E00E94D7096FEF80E091E00E94D4
:1038D000D70985E091E0D3C08091290690E0982F28
:1038E000882720912A06822B20E030E0AC01442773
:1038F000B901680F791FFA01E62BE00FF11F6491FF
:10390000D901A55DB94F7C91672739F42F5F3F4FEF
:103910002038310569F760E070E080E091E00E94B6
:10392000D70985E191E0ABC08091290690E0982FFE
:10393000882720912A06822B20E030E0AC01442722
:10394000B901680F791FFA01E62BE00FF11FE4912E
:10395000D901A55DB94FEC932F5F3F4F203831055A
:1039600079F785E291E08BC09091C90481E08927C5
:103970008093C90480FD7EC08091C8048F5F8C3322
:1039800018F48093C80476C01092C8048091C704CC
:103990008F5F8C3318F48093C7046CC01092C704F7
:1039A0008091C6048F5F883118F48093C60462C08A
:1039B0001092C604E091C504EF5FE093C504409106
:1039C000C404423051F52091C20430E0322F222746
:1039D0008091C304282BC90183709927892B49F54D
:1039E000C90160EA7FE00E946C1E892B01F1C901C8
:1039F00068EE73E00E946C1E892BD9F0C90160E962
:103A000071E00E946C1E892B91F0C90164E670E0A0
:103A10000E946C1E892B69F00AC0842F8170483087
:103A200018F0811108C009C0811107C004C08DE1E0
:103A300005C08CE103C08EE101C08FE18E17D0F488
:103A400091E09093C50481E0840F8093C4048D308D
:103A500088F09093C4048091C3048F3F41F4109286
:103A6000C3048091C2048F5F8093C20403C08F5F40
:103A70008093C30489E391E002C080E090E09093DA
:103A8000BB078093BA07892B09F452C08091C40602
:103A900081608093C406809105078370833079F438
:103AA0008091C5079091C607892B49F48091BF0783
:103AB0009091C00792609093C0078093BF07809158
:103AC000BF079091C007009799F12091C5073091E9
:103AD000C607232B69F52091BF0627FF29C020E0E8
:103AE00030E0A601022E02C0440F551F0A94E2F7EF
:103AF00048235923452BE1F42F5F3F4F2A303105EE
:103B000081F79B7F9093C0078093BF078091BA078E
:103B10000E94C10B8091BB070E94C10B7092C60727
:103B20006092C50703E510E01093BB070093BA0746
:103B300080E090E0892B11F40C94A6120E94000002
:103B40000C94A612CA019A959093B2068093B1067E
:103B50002091AF063091B006A9014F5F5F4F4F3FF4
:103B6000510509F028F45093B0064093AF06AECD4E
:103B70002F5F31093093B0062093AF066091CA06DB
:103B800070E0860F971F8F3F910509F028F49093FE
:103B9000B2068093B1061AC09A959093B2068093AC
:103BA000B1068091CC0690E0280F391F3093B00603
:103BB0002093AF062F3F310549F040F07093B206D5
:103BC0006093B1069093B0068093AF068E2F8A6003
:103BD0008093C706E2FF7ACD60C0E6FF31C0209136
:103BE000B1063091B206240F351F3093B2062093F0
:103BF000B1062F3F310521F118F18091CA0690E0FE
:103C0000BC017A95260F371F2F3F310509F028F4A4
:103C10003093B2062093B10604C09093B20680930D
:103C2000B1068E2F82608093C706E0FF09C08091A5
:103C3000BF079091C00784609093C0078093BF072F
:103C40006091C70667FF42CD8091AF069091B006A4
:103C5000480F591F5093B0064093AF064F3F510590
:103C600009F008F433CD2091CC0630E0C9019A95D3
:103C7000480F591F4F3F510509F028F45093B006E3
:103C80004093AF0604C03093B0062093AF06862F52
:103C900088608093C70662FF19CD8091BF0790911D
:103CA000C00780619093C0078093BF070FCDE8EDF8
:103CB000F7E01382128288EE93E0A0E0B0E0848304
:103CC0009583A683B78387E191E0918380838FEF0B
:103CD0009FEF958784870895AA1BBB1B51E107C0FE
:103CE000AA1FBB1FA617B70710F0A61BB70B881F8C
:103CF000991F5A95A9F780959095BC01CD0108951B
:103D000097FB072E16F4009407D077FD09D00E9488
:103D10006C1E07FC05D03EF4909581959F4F089549
:103D2000709561957F4F0895A1E21A2EAA1BBB1BC7
:103D3000FD010DC0AA1FBB1FEE1FFF1FA217B30777
:103D4000E407F50720F0A21BB30BE40BF50B661F8D
:103D5000771F881F991F1A9469F760957095809551
:103D600090959B01AC01BD01CF010895EE0FFF1F9F
:103D70000590F491E02D099481E090E0F8940C9482
:063D8000C11EF894FFCF04
:103D8600FFFFFFFF00E100000000000000C180818E
:103D9600000000000000007E0C050D9F0C940CE551
:063DA6000CA30CC10C008F
:00000001FF
// Tetris - game by Marcust Comstedt
// SoftVMS - emulator by Marcus Comstedt
// Port to Arduboy - Felipe Manga
#include <avr/sleep.h>
// 0x00: Black background, white pixels (inverted).
// 0xFF: White BG, black pixels (like the original)
const uint8_t TOG = 0xFF;
const uint8_t BGC = 0xAA;
#define WIDTH 128
#define HEIGHT 64
#define BUFFER_SIZE (WIDTH*HEIGHT/8)
#define SSD1306_COLUMNADDR 0x21
#define SSD1306_PAGEADDR 0x22
// ----- Arduboy pins -----
#define PIN_CS 12 // Display CS Arduino pin number
#define CS_PORT PORTD // Display CS port
#define CS_BIT PORTD6 // Display CS physical bit number
#define PIN_DC 4 // Display D/C Arduino pin number
#define DC_PORT PORTD // Display D/C port
#define DC_BIT PORTD4 // Display D/C physical bit number
#define PIN_RST 6 // Display reset Arduino pin number
#define RST_PORT PORTD // Display reset port
#define RST_BIT PORTD7 // Display reset physical bit number
#define SPI_MOSI_PORT PORTB
#define SPI_MOSI_BIT PORTB2
#define SPI_SCK_PORT PORTB
#define SPI_SCK_BIT PORTB1
#define RED_LED 10 /**< The pin number for the red color in the RGB LED. */
#define GREEN_LED 11 /**< The pin number for the greem color in the RGB LED. */
#define BLUE_LED 9 /**< The pin number for the blue color in the RGB LED. */
#define RED_LED_PORT PORTB
#define RED_LED_BIT PORTB6
#define GREEN_LED_PORT PORTB
#define GREEN_LED_BIT PORTB7
#define BLUE_LED_PORT PORTB
#define BLUE_LED_BIT PORTB5
// bit values for button states
// these are determined by the buttonsState() function
#define LEFT_BUTTON _BV(5) /**< The Left button value for functions requiring a bitmask */
#define RIGHT_BUTTON _BV(6) /**< The Right button value for functions requiring a bitmask */
#define UP_BUTTON _BV(7) /**< The Up button value for functions requiring a bitmask */
#define DOWN_BUTTON _BV(4) /**< The Down button value for functions requiring a bitmask */
#define A_BUTTON _BV(3) /**< The A button value for functions requiring a bitmask */
#define B_BUTTON _BV(2) /**< The B button value for functions requiring a bitmask */
#define PIN_LEFT_BUTTON A2
#define LEFT_BUTTON_PORT PORTF
#define LEFT_BUTTON_BIT PORTF5
#define PIN_RIGHT_BUTTON A1
#define RIGHT_BUTTON_PORT PORTF
#define RIGHT_BUTTON_BIT PORTF6
#define PIN_UP_BUTTON A0
#define UP_BUTTON_PORT PORTF
#define UP_BUTTON_BIT PORTF7
#define PIN_DOWN_BUTTON A3
#define DOWN_BUTTON_PORT PORTF
#define DOWN_BUTTON_BIT PORTF4
#define PIN_A_BUTTON 7
#define A_BUTTON_PORT PORTE
#define A_BUTTON_BIT PORTE6
#define PIN_B_BUTTON 8
#define B_BUTTON_PORT PORTB
#define B_BUTTON_BIT PORTB4
#define PIN_SPEAKER_1 5 /**< The pin number of the first lead of the speaker */
#define PIN_SPEAKER_2 13 /**< The pin number of the second lead of the speaker */
#define SPEAKER_1_PORT PORTC
#define SPEAKER_1_DDR DDRC
#define SPEAKER_1_BIT PORTC6
#define SPEAKER_2_PORT PORTC
#define SPEAKER_2_DDR DDRC
#define SPEAKER_2_BIT PORTC7
#define RAND_SEED_IN A4 // Open analog input used for noise by initRandomSeed()
#define RAND_SEED_IN_PORTF
#define RAND_SEED_IN_BIT PORTF1
// Value for ADMUX to read the random seed pin: 2.56V reference, ADC1
#define RAND_SEED_IN_ADMUX (_BV(REFS0) | _BV(REFS1) | _BV(MUX0))
// -----------------------
// #include "vmu.hpp"
// VMU.HPP ////////////////////////////////////////////////////////////////////
#define SGNEXT(n) ((n)&0x80? (n)-0x100:(n))
#ifndef BIG
#define BIG
#endif
#ifndef O_BINARY
#define O_BINARY 0
#endif
unsigned char ram[2][0x100]; // 512 bytes
unsigned char sfr[0x100]; // 256 bytes
#ifdef TRACE
unsigned char xram[2][0x80]; // third page is for BIOS only
#else
unsigned char xram[3][0x80]; // 384 bytes
#endif
unsigned char wram[0x200]; // 512 bytes
// BIG unsigned char flash[0x20000];
// BIG unsigned char bios[0x10000];
extern const unsigned char flash[];
extern const unsigned char bios[];
// this is a LUT. If the number of bits in ACC is odd, this returns 1. Zero otherwise.
//unsigned char parity[0x100]; // 256 bytes
// total: 1920 bytes
inline uint8_t parity( uint8_t v ){
v ^= v>>4;
v ^= v>>2;
v ^= v>>1;
return v & 1;
}
const unsigned char * rom;
#define ROM(x) (pgm_read_byte(rom + (x)))
#define sound(x)
inline void keypress(int i)
{
sfr[0x4c]&=~(1<<i);
if(sfr[0x4e]&4)
sfr[0x4e]|=2;
}
inline void keyrelease(int i)
{
sfr[0x4c]|=(1<<i);
if(sfr[0x4e]&4)
sfr[0x4e]|=2;
}
uint16_t pc, intreq, imask;
uint8_t lcd_updated, lcdon;
const uint8_t hasbios=0;
uint16_t spd;
uint16_t t0h, t0l, t0base, t0scale;
uint16_t t1h, t1l;
extern const int gamesize;
struct tm {
uint16_t tm_year,
tm_mon,
tm_mday,
tm_hour,
tm_min,
tm_sec;
};
inline struct tm localtime(){
uint32_t t = millis();
tm tt;
tt.tm_year = 117;
tt.tm_mon = 0;
tt.tm_mday = 1;
tt.tm_hour = 1;
tt.tm_min = 0;
tt.tm_sec = t / 1000;
return tt;
}
inline int tobcd(int n)
{
return ((n/10)<<4)|(n%10);
}
void writemem(uint16_t addr, uint8_t value)
{
value &= 0xff;
if(addr<0x100) {
ram[(sfr[0x01]&2)>>1][addr] = value;
return;
}
if(addr>=0x180) {
uint8_t b = sfr[0x25];
if(b>2 || (b==2 && addr>=0x186))
return;
xram[b][addr-0x180]=value;
if(lcdon)
lcd_updated = 1;
} else switch(addr) {
case 0x100:
sfr[0x01] = (sfr[0x01]&0xfe)|parity(value);
break;
case 0x10d:
if((value&1) != (sfr[0x0d]&1)) {
if(pc>0xfffd || ROM(pc)!=0x21){
// error_msg("EXT 0 changed without following JMPF. pc = %04x", pc&0xffff);
}else
pc = (ROM(pc+1)<<8)|ROM(pc+2);
if(hasbios)
rom = ((value&1)? flash : bios);
}
break;
case 0x10e:
switch(value&0xa0) {
case 0x00: spd = 3000; break;
case 0x20: spd = 164; break;
case 0x80: spd = 6000; break;
case 0xa0: spd = 328; break;
}
break;
case 0x110:
if(!(value&0x40))
t0l = sfr[0x13];
if(!(value&0x80))
t0h = sfr[0x15];
break;
case 0x111:
t0scale = 256-value;
t0base = 0;
break;
case 0x113:
if(!(sfr[0x10]&0x40))
t0l = value;
break;
case 0x115:
if(!(sfr[0x10]&0x80))
t0h = value;
break;
case 0x118:
if(!(value&0x40))
t1l = sfr[0x1b];
if(!(value&0x80))
t1h = sfr[0x1d];
break;
case 0x11b:
if(!(sfr[0x18]&0x40))
t1l = value;
break;
case 0x11d:
if(!(sfr[0x18]&0x80))
t1h = value;
break;
case 0x122:
if(lcdon)
lcd_updated = 1;
break;
case 0x127:
if((!!(value&0x80)) != lcdon) {
lcdon = !!(value&0x80);
lcdrefresh();
}
break;
case 0x166:
wram[0x1ff&((sfr[0x65]<<8)|sfr[0x64])] = value;
if(sfr[0x63]&0x10)
if(!++sfr[0x64])
sfr[0x65]^=1;
return;
}
/*
if(addr>0x10e && addr<0x120 && addr != 0x118)
fprintf(stderr, "%04x: Write to %03x: %02x\n", pc, addr, value);
*/
sfr[addr&0xff] = value;
if(addr == 0x118 || addr == 0x11b) {
/* Check for sound... */
if(sfr[0x18]&0x40)
sound(32768/((256-sfr[0x1b])*6));
else
sound(-1);
}
}
uint8_t readmem(uint16_t addr)
{
uint8_t r;
if(addr<0x100)
return ram[(sfr[0x01]&2)>>1][addr];
if(addr>=0x180) {
uint8_t b = sfr[0x25];
if(b>2)
return 0xff;
return xram[b][addr-0x180];
} else switch(addr) {
case 0x112:
return t0l;
case 0x114:
return t0h;
case 0x11b:
return t1l;
case 0x11d:
return t1h;
case 0x15c:
return 2;
case 0x165:
return 0xfe|(sfr[0x65]&1);
case 0x166:
r = wram[0x1ff&((sfr[0x65]<<8)|sfr[0x64])];
if(sfr[0x63]&0x10)
if(!++sfr[0x64])
sfr[0x65]^=1;
return r;
}
/*
if(addr>0x106 && addr<0x180)
fprintf(stderr, "%04x: Read from %03x: %02x\n", pc, addr, sfr[addr&0xff]);
*/
return sfr[addr&0xff];
}
uint16_t readlatch( uint16_t addr)
{
switch(addr) {
case 0x11b:
case 0x11d:
return 0xff;
default:
return readmem(addr);
}
}
void push(uint8_t n)
{
writemem(0x106, readmem(0x106)+1);
ram[0][readmem(0x106)]=n;
}
uint8_t pop()
{
uint8_t r = ram[0][readmem(0x106)];
writemem(0x106, readmem(0x106)-1);
return r;
}
void resetcpu()
{
int i;
struct tm tm_ = localtime();
tm *tm = &tm_;
memset(ram, 0, sizeof(ram));
memset(xram, 0, sizeof(xram));
memset(wram, 0, sizeof(wram));
memset(sfr, 0, sizeof(sfr));
sfr[0x06] = 0x7f;
sfr[0x4c] = 0xff;
sfr[0x01] = 0x02;
t0h = t0l = 0;
t1h = t1l = 0;
t0base = 0;
t0scale = 256;
ram[0][0x10] = tobcd(tm->tm_year/100+19);
ram[0][0x11] = tobcd(tm->tm_year%100);
ram[0][0x12] = tobcd(tm->tm_mon+1);
ram[0][0x13] = tobcd(tm->tm_mday);
ram[0][0x14] = tobcd(tm->tm_hour);
ram[0][0x15] = tobcd(tm->tm_min);
ram[0][0x17] = (tm->tm_year+1900)>>8;
ram[0][0x18] = (tm->tm_year+1900)&0xff;
ram[0][0x19] = tm->tm_mon+1;
ram[0][0x1a] = tm->tm_mday;
ram[0][0x1b] = tm->tm_hour;
ram[0][0x1c] = tm->tm_min;
ram[0][0x1d] = tm->tm_sec;
ram[0][0x31] = 0xff;
sfr[0x08] = 0x80;
writemem(0x10e, 0x81);
lcd_updated = 0;
lcdon = 0;
imask = 0;
intreq = 0;
if(hasbios) {
sfr[0x0d] = 0;
rom = bios;
pc = 0x1f0;
} else {
sfr[0x0d] = 1;
rom = flash;
pc = 0;
writemem(0x125, 2);
writemem(0x182, 0x10);
writemem(0x125, 0);
writemem(0x127, 0x80);
}
sound(-1);
}
uint8_t month_days()
{
uint8_t m = ram[0][0x19];
if(m==2) {
uint16_t y = ram[0][0x18] | (ram[0][0x17] << 8);
if(y&3)
return 28;
if(!(y%4000))
return 29;
if(!(y%1000))
return 28;
if(!(y%400))
return 29;
if(!(y%100))
return 28;
return 29;
} else return (m>7? ((m&1)? 30:31) : ((m&1)? 31:30));
}
int handle_fwcall(int pc)
{
switch(pc) {
case 0x100:
{
int i, a = ((ram[1][0x7d]<<16)|(ram[1][0x7e]<<8)|ram[1][0x7f])&0x1ffff;
if(a>=gamesize)
writemem(0x100, 0xff);
else {
writemem(0x100, 0x00);
// for(i=0; i<0x80; i++)
// flash[(a&~0xff)|((a+i)&0xff)] = ram[1][i+0x80];
//#ifdef __DC__
// if(!flash_written(a))
writemem(0x100, 0xff);
//#endif
}
/*
fprintf(stderr, "ROM write @ %05x:\n", a);
for(i=0; i<0x80; i++)
fprintf(stderr, " %02x", ram[1][i+0x80]);
fprintf(stderr, "\n");
*/
}
return 0x105;
case 0x110:
{
int i, a = ((ram[1][0x7d]<<16)|(ram[1][0x7e]<<8)|ram[1][0x7f])&0x1ffff;
int r = 0;
for(i=0; i<0x80; i++)
if((r = (ROM((a&~0xff)|((a+i)&0xff)) ^ ram[1][i+0x80])) != 0)
break;
writemem(0x100, r);
}
return 0x115;
case 0x120:
{
int i, a = ((ram[1][0x7d]<<16)|(ram[1][0x7e]<<8)|ram[1][0x7f])&0x1ffff;
for(i=0; i<0x80; i++)
ram[1][i+0x80] = ROM( (a&~0xff)|((a+i)&0xff) );
/*
fprintf(stderr, "ROM read @ %05x\n", a);
*/
}
return 0x125;
case 0x130:
if(!((ram[0][0x1e]^=1)&1))
if(++ram[0][0x1d]>=60) {
ram[0][0x1d] = 0;
if(++ram[0][0x1c]>=60) {
ram[0][0x1c] = 0;
if(++ram[0][0x1b]>=24) {
ram[0][0x1b] = 0;
if(++ram[0][0x1a]>month_days()) {
ram[0][0x1a] = 1;
if(++ram[0][0x19]>=13) {
ram[0][0x19] = 1;
if(ram[0][0x18]==0xff) {
ram[0][0x18]=0;
ram[0][0x17]++;
} else
ram[0][0x18]++;
}
}
}
}
}
return 0x139;
case 0x1f0:
return 0;
default:
// error_msg("Firmware entered at unknown vector %04x!", pc);
return 0;
}
}
uint16_t mcy, tick, sleepCount = 0;
void run_cpu()
{
if( sleepCount-- <= 0 ){
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_mode();
sleepCount = 6;
}
// struct timeval epoch;
// GETTIMEOFDAY(&epoch);
// for(;;) {
int r, s;
uint8_t c;
uint8_t cy = 1;
uint8_t i = ROM(pc);
/* * /
#ifdef TRACE
{
char tmp[20];
snprintf(tmp, 20, "%04x: %02x", pc, i );
Serial.println( tmp );
delay(50);
}
#endif
/* */
pc++;
pc &= 0xffff;
switch(i&0xf) {
case 0:
switch(i>>4) {
case 0:
break;
case 1:
cy = 4;
push((pc+2)&0xff);
push(((pc+2)&0xff00)>>8);
pc = 0xffff&(pc+1+ROM(pc)+((ROM((pc+1)&0xffff))<<8));
break;
case 2:
cy = 2;
push((pc+2)&0xff);
push(((pc+2)&0xff00)>>8);
pc = (ROM(pc)<<8)|ROM((pc+1)&0xffff);
break;
case 3:
cy = 7;
{
int r32 = readmem(0x102)*((readmem(0x100)<<8)|readmem(0x103));
writemem(0x101, (readmem(0x101)&0x7b)|(r>65535? 4:0));
writemem(0x103, r32&0xff);
writemem(0x100, (r32&0xff00)>>8);
writemem(0x102, (r32&0xff0000)>>16);
}
break;
case 4:
cy = 7;
r = readmem(0x102);
if(r) {
int v = (readmem(0x100)<<8)|readmem(0x103);
s = v%r;
r = v/r;
} else {
r = 0xff00|readmem(0x103);
s = 0;
}
writemem(0x101, (readmem(0x101)&0x7b)|(s? 0:4));
writemem(0x103, r&0xff);
writemem(0x100, (r&0xff00)>>8);
writemem(0x102, s);
break;
case 5:
cy = 2; /* ? */
writemem(0x100, ROM( 0x1ffff&(uint16_t(readmem(0x104))+(uint16_t(readmem(0x105))<<8)+
uint16_t((readmem(0x154))<<16)) ));
break;
case 6:
cy = 2;
push(readmem(ROM(pc++)));
pc &= 0xffff;
break;
case 7:
cy = 2;
writemem(ROM(pc++), pop());
pc &= 0xffff;
break;
case 8:
cy = 2;
if(readmem(0x100)==0)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 9:
cy = 2;
if(readmem(0x100)!=0)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 0xa:
cy = 2;
r = pop()<<8;
r |= pop();
pc = r;
break;
case 0xb:
cy = 2;
r = pop()<<8;
r |= pop();
pc = r;
--imask;
break;
case 0xc:
r = readmem(0x100);
writemem(0x100, (r>>1)|((r&1)<<7));
break;
case 0xd:
r = readmem(0x100);
s = readmem(0x101);
writemem(0x101, (s&0x7f)|((r&1)<<7));
writemem(0x100, (r>>1)|(s&0x80));
break;
case 0xe:
r = readmem(0x100);
writemem(0x100, (r<<1)|((r&0x80)>>7));
break;
case 0xf:
r = readmem(0x100);
s = readmem(0x101);
writemem(0x101, (s&0x7f)|(r&0x80));
writemem(0x100, (r<<1)|((s&0x80)>>7));
break;
}
break;
case 1:
switch(i>>4) {
case 0:
cy = 2;
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
break;
case 1:
cy = 4;
pc = 0xffff&(pc+1+ROM(pc)+((ROM((pc+1)&0xffff))<<8));
break;
case 2:
cy = 2;
pc = (ROM(pc)<<8)|ROM((pc+1)&0xffff);
break;
case 3:
cy = 2;
r = readmem(0x100);
writemem(0x101, (readmem(0x101)&0x7f)|(r<ROM(pc)? 0x80:0));
s = (r == ROM(pc++));
pc &= 0xffff;
if(s)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 4:
cy = 2;
r = readmem(0x100);
writemem(0x101, (readmem(0x101)&0x7f)|(r<ROM(pc)? 0x80:0));
s = (r != ROM(pc++));
pc &= 0xffff;
if(s)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 5:
cy = 2; /* ? */
/*
if(!(readmem(0x154)&2))
flash[0x1ffff&(readmem(0x104)+(readmem(0x105)<<8)+
(readmem(0x154)<<16))] = readmem(0x100);
*/
break;
case 6:
cy = 2;
push(readmem(0x100|ROM(pc++)));
pc &= 0xffff;
break;
case 7:
cy = 2;
writemem(0x100|ROM(pc++), pop());
pc &= 0xffff;
break;
case 8:
r = readmem(0x100);
s = ROM(pc++);
pc &= 0xffff;
writemem(0x100, r+s);
writemem(0x101, (readmem(0x101)&0x3b)|(r+s>255? 0x80:0)|
((r&15)+(s&15)>15? 0x40:0)|((0x80&(~r^s)&(s^(r+s)))? 4:0));
break;
case 9:
r = readmem(0x100);
s = ROM(pc++);
pc &= 0xffff;
c = (readmem(0x101)&0x80)>>7;
writemem(0x100, r+s+c);
writemem(0x101, (readmem(0x101)&0x3b)|(r+s+c>255? 0x80:0)|
((r&15)+(s&15)+c>15? 0x40:0)|
((0x80&(~r^s)&(s^(r+s+c)))? 4:0));
break;
case 0xa:
/* FIXME: OV */
r = readmem(0x100);
s = ROM(pc++);
pc &= 0xffff;
writemem(0x100, r-s);
writemem(0x101, (readmem(0x101)&0x3b)|(r-s<0? 0x80:0)|
((r&15)-(s&15)<0? 0x40:0)|(0? 4:0));
break;
case 0xb:
/* FIXME: OV */
r = readmem(0x100);
s = ROM(pc++);
pc &= 0xffff;
c = (readmem(0x101)&0x80)>>7;
writemem(0x100, r-s-c);
writemem(0x101, (readmem(0x101)&0x3b)|(r-s-c<0? 0x80:0)|
((r&15)-(s&15)-c<0? 0x40:0)|(0? 4:0));
break;
case 0xc:
cy = 2;
writemem(0x100, ROM(0xffff&(readmem(0x100)+readmem(0x104)+
(readmem(0x105)<<8))));
break;
case 0xd:
writemem(0x100, readmem(0x100)|ROM(pc++));
pc &= 0xffff;
break;
case 0xe:
writemem(0x100, readmem(0x100)&ROM(pc++));
pc &= 0xffff;
break;
case 0xf:
writemem(0x100, readmem(0x100)^ROM(pc++));
pc &= 0xffff;
break;
}
break;
case 2:
case 3:
r = ((i&1)<<8)|ROM(pc++);
pc &= 0xffff;
switch(i>>4) {
case 0:
writemem(0x100, readmem(r));
break;
case 1:
writemem(r, readmem(0x100));
break;
case 2:
cy = 2;
writemem(r, ROM(pc++));
pc &= 0xffff;
break;
case 3:
cy = 2;
s = readmem(r);
r = readmem(0x100);
writemem(0x101, (readmem(0x101)&0x7f)|(r<s? 0x80:0));
if(r == s)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 4:
cy = 2;
s = readmem(r);
r = readmem(0x100);
writemem(0x101, (readmem(0x101)&0x7f)|(r<s? 0x80:0));
if(r != s)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 5:
cy = 2;
s = (readlatch(r)-1)&0xff;
writemem(r, s);
if(s != 0)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 6:
writemem(r, readlatch(r)+1);
break;
case 7:
writemem(r, readlatch(r)-1);
break;
case 8:
s = readmem(r);
r = readmem(0x100);
writemem(0x100, r+s);
writemem(0x101, (readmem(0x101)&0x3b)|(r+s>255? 0x80:0)|
((r&15)+(s&15)>15? 0x40:0)|((0x80&(~r^s)&(s^(r+s)))? 4:0));
break;
case 9:
s = readmem(r);
r = readmem(0x100);
c = (readmem(0x101)&0x80)>>7;
writemem(0x100, r+s+c);
writemem(0x101, (readmem(0x101)&0x3b)|(r+s+c>255? 0x80:0)|
((r&15)+(s&15)+c>15? 0x40:0)|
((0x80&(~r^s)&(s^(r+s+c)))? 4:0));
break;
case 0xa:
/* FIXME: OV */
s = readmem(r);
r = readmem(0x100);
writemem(0x100, r-s);
writemem(0x101, (readmem(0x101)&0x3b)|(r-s<0? 0x80:0)|
((r&15)-(s&15)<0? 0x40:0)|(0? 4:0));
break;
case 0xb:
/* FIXME: OV */
s = readmem(r);
r = readmem(0x100);
c = (readmem(0x101)&0x80)>>7;
writemem(0x100, r-s-c);
writemem(0x101, (readmem(0x101)&0x3b)|(r-s-c<0? 0x80:0)|
((r&15)-(s&15)-c<0? 0x40:0)|(0? 4:0));
break;
case 0xc:
s = readmem(r);
writemem(r, readmem(0x100));
writemem(0x100, s);
break;
case 0xd:
writemem(0x100, readmem(0x100)|readmem(r));
break;
case 0xe:
writemem(0x100, readmem(0x100)&readmem(r));
break;
case 0xf:
writemem(0x100, readmem(0x100)^readmem(r));
break;
}
break;
case 4:
case 5:
case 6:
case 7:
r = readmem((i&3)|((readmem(0x101)>>1)&0xc))|((i&2)? 0x100 : 0);
switch(i>>4) {
case 0:
writemem(0x100, readmem(r));
break;
case 1:
writemem(r, readmem(0x100));
break;
case 2:
writemem(r, ROM(pc++));
pc &= 0xffff;
break;
case 3:
cy = 2;
s = readmem(r);
r = ROM(pc++);
pc &= 0xffff;
writemem(0x101, (readmem(0x101)&0x7f)|(s<r? 0x80:0));
if(r == s)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 4:
cy = 2;
s = readmem(r);
r = ROM(pc++);
pc &= 0xffff;
writemem(0x101, (readmem(0x101)&0x7f)|(s<r? 0x80:0));
if(r != s)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 5:
cy = 2;
s = (readlatch(r)-1)&0xff;
writemem(r, s);
if(s != 0)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 6:
writemem(r, readlatch(r)+1);
break;
case 7:
writemem(r, readlatch(r)-1);
break;
case 8:
s = readmem(r);
r = readmem(0x100);
writemem(0x100, r+s);
writemem(0x101, (readmem(0x101)&0x3b)|(r+s>255? 0x80:0)|
((r&15)+(s&15)>15? 0x40:0)|((0x80&(~r^s)&(s^(r+s)))? 4:0));
break;
case 9:
s = readmem(r);
r = readmem(0x100);
c = (readmem(0x101)&0x80)>>7;
writemem(0x100, r+s+c);
writemem(0x101, (readmem(0x101)&0x3b)|(r+s+c>255? 0x80:0)|
((r&15)+(s&15)+c>15? 0x40:0)|
((0x80&(~r^s)&(s^(r+s+c)))? 4:0));
break;
case 0xa:
/* FIXME: OV */
s = readmem(r);
r = readmem(0x100);
writemem(0x100, r-s);
writemem(0x101, (readmem(0x101)&0x3b)|(r-s<0? 0x80:0)|
((r&15)-(s&15)<0? 0x40:0)|(0? 4:0));
break;
case 0xb:
/* FIXME: OV */
s = readmem(r);
r = readmem(0x100);
c = (readmem(0x101)&0x80)>>7;
writemem(0x100, r-s-c);
writemem(0x101, (readmem(0x101)&0x3b)|(r-s-c<0? 0x80:0)|
((r&15)-(s&15)-c<0? 0x40:0)|(0? 4:0));
break;
case 0xc:
s = readmem(r);
writemem(r, readmem(0x100));
writemem(0x100, s);
break;
case 0xd:
writemem(0x100, readmem(0x100)|readmem(r));
break;
case 0xe:
writemem(0x100, readmem(0x100)&readmem(r));
break;
case 0xf:
writemem(0x100, readmem(0x100)^readmem(r));
break;
}
break;
default:
switch(i&0xe0) {
case 0x00:
cy = 2;
r = ((i&7)<<8)|((i&0x10)<<7)|ROM(pc++);
push(pc&0xff);
push((pc&0xff00)>>8);
pc = (pc&0xf000)|r;
break;
case 0x20:
cy = 2;
r = ((i&7)<<8)|((i&0x10)<<7)|ROM(pc++);
pc = (pc&0xf000)|r;
break;
case 0x40:
cy = 2;
r = ((i&0x10)<<4)|ROM(pc++);
pc &= 0xffff;
if((s=readmem(r))&(1<<(i&7))) {
writemem(r, s & ~(1<<(i&7)));
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
} else {
pc++;
pc &= 0xffff;
}
break;
case 0x60:
cy = 2;
r = ((i&0x10)<<4)|ROM(pc++);
pc &= 0xffff;
if(readmem(r)&(1<<(i&7)))
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 0x80:
cy = 2;
r = ((i&0x10)<<4)|ROM(pc++);
pc &= 0xffff;
if(!(readmem(r)&(1<<(i&7))))
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 0xa0:
r = ((i&0x10)<<4)|ROM(pc++);
pc &= 0xffff;
writemem(r, readlatch(r) ^ (1<<(i&7)));
break;
case 0xc0:
r = ((i&0x10)<<4)|ROM(pc++);
pc &= 0xffff;
writemem(r, readlatch(r) & ~(1<<(i&7)));
break;
case 0xe0:
r = ((i&0x10)<<4)|ROM(pc++);
pc &= 0xffff;
writemem(r, readlatch(r) | (1<<(i&7)));
break;
}
break;
}
mcy += cy;
if(mcy>=spd) {
// struct timeval now, t;
if(lcd_updated)
lcdrefresh();
/*
GETTIMEOFDAY(&now);
if((epoch.tv_usec += 10000)>=1000000) {
epoch.tv_usec -= 1000000;
epoch.tv_sec++;
}
if(now.tv_sec>epoch.tv_sec ||
(now.tv_sec == epoch.tv_sec && now.tv_usec >= epoch.tv_usec)) {
t.tv_usec = 0;
t.tv_sec = 0;
} else if(epoch.tv_usec<now.tv_usec) {
t.tv_usec = 1000000 + epoch.tv_usec - now.tv_usec;
t.tv_sec = epoch.tv_sec - now.tv_sec - 1;
} else {
t.tv_usec = epoch.tv_usec - now.tv_usec;
t.tv_sec = epoch.tv_sec - now.tv_sec;
}
waitforevents(&t);
*/
checkevents();
mcy -= spd;
++tick;
if(tick>=50) {
intreq |= 1<<3;
tick -= 50;
}
}
/* Timer 0 */
if(sfr[0x10] & 0xc0) {
int c0=0;
if((t0base+=cy) >= t0scale)
do
c0++;
while((t0base-=t0scale) >= t0scale);
if(c0)
if((sfr[0x10] & 0xe0) == 0xe0) {
t0l += c0;
if(t0l>=256) {
t0l -= 256;
if(++t0h >= 256) {
t0h -= 256;
if((t0l += sfr[0x13])>=256) {
t0l -= 256;
if((t0h += sfr[0x15])>=256) {
t0l = sfr[0x13];
t0h = sfr[0x15];
}
}
sfr[0x10] |= 10;
if(sfr[0x10]&4)
intreq |= 1<<4;
}
}
} else {
if(sfr[0x10] & 0x40) {
t0l += c0;
if(t0l>=256) {
t0l -= 256;
if((t0l += sfr[0x13])>=256)
t0l = sfr[0x13];
sfr[0x10] |= 2;
if(sfr[0x10]&1)
intreq |= 1<<2;
}
}
if(sfr[0x10] & 0x80) {
t0h += c0;
if(t0h>=256) {
t0h -= 256;
if((t0h += sfr[0x15])>=256)
t0h = sfr[0x15];
sfr[0x10] |= 8;
if(sfr[0x10]&4)
intreq |= 1<<4;
}
}
}
}
/* Timer 1 */
if(sfr[0x18] & 0xc0) {
if((sfr[0x18] & 0xe0) == 0xe0) {
t1l += cy;
if(t1l>=256) {
t1l -= 256;
if(++t1h >= 256) {
t1h -= 256;
if((t1l += sfr[0x1b])>=256) {
t1l -= 256;
if((t1h += sfr[0x1d])>=256) {
t1l = sfr[0x1b];
t1h = sfr[0x1d];
}
}
sfr[0x18] |= 10;
if(sfr[0x18]&4)
intreq |= 1<<5;
}
}
} else {
if(sfr[0x18] & 0x40) {
t1l += cy;
if(t1l>=256) {
t1l -= 256;
if((t1l += sfr[0x1b])>=256)
t1l = sfr[0x1b];
sfr[0x18] |= 2;
if(sfr[0x18]&1)
intreq |= 1<<5;
}
}
if(sfr[0x18] & 0x80) {
t1h += cy;
if(t1h>=256) {
t1h -= 256;
if((t1h += sfr[0x1d])>=256)
t1h = sfr[0x1d];
sfr[0x18] |= 8;
if(sfr[0x18]&4)
intreq |= 1<<5;
}
}
}
}
if(!(sfr[0x0d]&1) && !hasbios)
if(!(pc=handle_fwcall(pc)))
return;
else
sfr[0x0d]|=1;
if((sfr[0x4e]&3)==3 && !imask)
intreq |= 1<<9;
if(!intreq || imask || !(sfr[0x08]&0x80))
return;
for(r=0; r<10; r++)
if(intreq & (1<<r))
return;
intreq &= ~(1<<r);
push(pc&0xff);
push((pc&0xff00)>>8);
imask++;
pc = ((r&~1)<<3)+((r&1)?0xb:0x3);
// }
}
// SRC.INO ////////////////////////////////////////////////////////////////////
const uint8_t PROGMEM lcdBootProgram[] = {
// boot defaults are commented out but left here in case they
// might prove useful for reference
//
// Further reading: https://www.adafruit.com/datasheets/SSD1306.pdf
//
// Display Off
// 0xAE,
// Set Display Clock Divisor v = 0xF0
// default is 0x80
0xD5, 0xF0,
// Set Multiplex Ratio v = 0x3F
// 0xA8, 0x3F,
// Set Display Offset v = 0
// 0xD3, 0x00,
// Set Start Line (0)
// 0x40,
// Charge Pump Setting v = enable (0x14)
// default is disabled
0x8D, 0x14,
// Set Segment Re-map (A0) | (b0001)
// default is (b0000)
0xA1,
// Set COM Output Scan Direction
0xC8,
// Set COM Pins v
// 0xDA, 0x12,
// Set Contrast v = 0xCF
0x81, 0xCF,
// Set Precharge = 0xF1
0xD9, 0xF1,
// Set VCom Detect
// 0xDB, 0x40,
// Entire Display ON
// 0xA4,
// Set normal/inverse display
// 0xA6,
// Display On
0xAF,
// set display mode = horizontal addressing mode (0x00)
0x20, 0x00,
// set col address range
// 0x21, 0x00, COLUMN_ADDRESS_END,
// set page address range
// 0x22, 0x00, PAGE_ADDRESS_END
};
class Arduboy {
public:
void delayShort(uint16_t ms)
{
delay((unsigned long) ms);
}
void bootOLED(){
// reset the display
delayShort(5); // reset pin should be low here. let it stay low a while
bitSet(RST_PORT, RST_BIT); // set high to come out of reset
delayShort(5); // wait a while
// select the display (permanently, since nothing else is using SPI)
bitClear(CS_PORT, CS_BIT);
// run our customized boot-up command sequence against the
// OLED to initialize it properly for Arduboy
LCDCommandMode();
for (uint8_t i = 0; i < sizeof(lcdBootProgram); i++) {
SPItransfer(pgm_read_byte(lcdBootProgram + i));
}
LCDDataMode();
for (uint16_t i = WIDTH * HEIGHT / 8; i--; )
SPItransfer(BGC);
}
// Write to the SPI bus (MOSI pin)
void SPItransfer(uint8_t data)
{
SPDR = data;
/*
* The following NOP introduces a small delay that can prevent the wait
* loop form iterating when running at the maximum speed. This gives
* about 10% more speed, even if it seems counter-intuitive. At lower
* speeds it is unnoticed.
*/
asm volatile("nop");
while (!(SPSR & _BV(SPIF))) { } // wait
}
void LCDDataMode()
{
bitSet(DC_PORT, DC_BIT);
}
void LCDCommandMode()
{
bitClear(DC_PORT, DC_BIT);
}
void begin(){
// Port B INPUT_PULLUP or HIGH
PORTB |= _BV(RED_LED_BIT) | _BV(GREEN_LED_BIT) | _BV(BLUE_LED_BIT) |
_BV(B_BUTTON_BIT);
// Port B INPUT or LOW (none)
// Port B inputs
DDRB &= ~(_BV(B_BUTTON_BIT));
// Port B outputs
DDRB |= _BV(RED_LED_BIT) | _BV(GREEN_LED_BIT) | _BV(BLUE_LED_BIT) |
_BV(SPI_MOSI_BIT) | _BV(SPI_SCK_BIT);
// Port C
// Speaker: Not set here. Controlled by audio class
// Port D INPUT_PULLUP or HIGH
PORTD |= _BV(CS_BIT);
// Port D INPUT or LOW
PORTD &= ~(_BV(RST_BIT));
// Port D inputs (none)
// Port D outputs
DDRD |= _BV(RST_BIT) | _BV(CS_BIT) | _BV(DC_BIT);
// Port E INPUT_PULLUP or HIGH
PORTE |= _BV(A_BUTTON_BIT);
// Port E INPUT or LOW (none)
// Port E inputs
DDRE &= ~(_BV(A_BUTTON_BIT));
// Port E outputs (none)
// Port F INPUT_PULLUP or HIGH
PORTF |= _BV(LEFT_BUTTON_BIT) | _BV(RIGHT_BUTTON_BIT) |
_BV(UP_BUTTON_BIT) | _BV(DOWN_BUTTON_BIT);
// Port F INPUT or LOW
PORTF &= ~(_BV(RAND_SEED_IN_BIT));
// Port F inputs
DDRF &= ~(_BV(LEFT_BUTTON_BIT) | _BV(RIGHT_BUTTON_BIT) |
_BV(UP_BUTTON_BIT) | _BV(DOWN_BUTTON_BIT) |
_BV(RAND_SEED_IN_BIT));
// Port F outputs (none)
// master, mode 0, MSB first, CPU clock / 2 (8MHz)
SPCR = _BV(SPE) | _BV(MSTR);
SPSR = _BV(SPI2X);
bootOLED();
}
uint8_t buttonsState()
{
uint8_t buttons;
// down, up, left right
buttons = ((~PINF) & B11110000);
// A (left)
buttons = buttons | (((~PINE) & B01000000) >> 3);
// B (right)
buttons = buttons | (((~PINB) & B00010000) >> 2);
return buttons;
}
} arduboy;
void setup() {
arduboy.begin();
arduboy.LCDCommandMode();
arduboy.SPItransfer(SSD1306_COLUMNADDR);
arduboy.SPItransfer(16); // Column start address (0 = reset)
arduboy.SPItransfer(16+96-1); // Column end address (127 = reset)
arduboy.SPItransfer(SSD1306_PAGEADDR);
arduboy.SPItransfer(0); // Page start address (0 = reset)
arduboy.SPItransfer(7); // Page end address
arduboy.LCDDataMode();
resetcpu();
}
void loop() {
run_cpu();
}
// void digitalWrite(uint8_t pin, uint8_t val){}
uint8_t keyState;
void checkevents()
{
uint8_t bit = 1;
uint8_t nks = arduboy.buttonsState();
if( nks & UP_BUTTON ){ // UP
if( !(keyState&bit) ) {
keyState |= bit;
keypress(0);
}
}else if( keyState & bit ){
keyState &= ~bit;
keyrelease(0);
}
bit <<= 1;
if( nks & DOWN_BUTTON ){ // UP
if( !(keyState&bit) ) {
keyState |= bit;
keypress(1);
}
}else if( keyState & bit ){
keyState &= ~bit;
keyrelease(1);
}
bit <<= 1;
if( nks & LEFT_BUTTON ){ // UP
if( !(keyState&bit) ) {
keyState |= bit;
keypress(2);
}
}else if( keyState & bit ){
keyState &= ~bit;
keyrelease(2);
}
bit <<= 1;
if( nks & RIGHT_BUTTON ){ // UP
if( !(keyState&bit) ) {
keyState |= bit;
keypress(3);
}
}else if( keyState & bit ){
keyState &= ~bit;
keyrelease(3);
}
bit <<= 1;
if( nks & A_BUTTON ){ // UP
if( !(keyState&bit) ) {
keyState |= bit;
keypress(4);
}
}else if( keyState & bit ){
keyState &= ~bit;
keyrelease(4);
}
bit <<= 1;
if( nks & B_BUTTON ){ // UP
if( !(keyState&bit) ) {
keyState |= bit;
keypress(5);
}
}else if( keyState & bit ){
keyState &= ~bit;
keyrelease(5);
}
bit <<= 1;
}
void lcdrefresh(){
uint8_t buf[] = {
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0
}, ty;
uint8_t y, x, b=0, p=0;
p = sfr[0x22];
if(p>=0x83)
p -= 0x83;
b = (p>>6);
p = (p&0x3f)*2;
for(y=0; y<32; y++) {
ty = y & 3;
uint8_t ty2 = ty << 1;
for(x=0; x<48; ) {
uint8_t value = xram[b][p++];
if(!lcdon)
value = 0;
buf[x++] |= ((value>>7)&1) << ty2;
buf[x++] |= ((value>>6)&1) << ty2;
buf[x++] |= ((value>>5)&1) << ty2;
buf[x++] |= ((value>>4)&1) << ty2;
buf[x++] |= ((value>>3)&1) << ty2;
buf[x++] |= ((value>>2)&1) << ty2;
buf[x++] |= ((value>>1)&1) << ty2;
buf[x++] |= ((value )&1) << ty2;
if((p&0xf)>=12)
p+=4;
if(p>=128) {
b++;
p-=128;
}
if(b==2 && p>=6) {
b = 0;
p -= 6;
}
}
if( ty == 3 ){
for( uint8_t j=0; j<6; j++ ) {
// Wire.beginTransmission( I2C_ADDR );
// WIRE_WRITE(0x40);
for (uint8_t t=0; t<8; t++) {
uint8_t &col = buf[(j<<3)|t];
col |= col << 1;
col ^= TOG;
arduboy.SPItransfer( col );
arduboy.SPItransfer( col );
col = 0;
}
// Wire.endTransmission();
}
}
}
lcd_updated = 0;
}
const unsigned char bios[] = {0};
const unsigned char flash[] PROGMEM = {
/*[0]*/ 0x21, 0x6, 0x80, 0x28, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0x4f, 0x0, 0x0, 0x0,
/*[10]*/ 0x0, 0x0, 0x0, 0x28, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0x30, 0x0, 0x0, 0x0,
/*[20]*/ 0x0, 0x0, 0x0, 0x28, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0x4f, 0x0, 0x0, 0x0,
/*[30]*/ 0x0, 0x0, 0x0, 0x28, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0x4f, 0x0, 0x0, 0x0,
/*[40]*/ 0x0, 0x0, 0x0, 0x28, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x4e, 0xd9, 0x4e, 0xb0,
/*[50]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[60]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[70]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[80]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[90]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[a0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[b0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[c0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[d0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[e0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[f0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[100]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[110]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[120]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[130]*/ 0x61, 0x8, 0xdf, 0x8, 0xb8, 0xd, 0x21, 0x1, 0x30, 0x71, 0x8, 0xb0, 0x0, 0x0, 0x0, 0x0,
/*[140]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[150]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[160]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[170]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[180]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[190]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[1a0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[1b0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[1c0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[1d0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[1e0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[1f0]*/ 0xb8, 0xd, 0x21, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[200]*/ 0x54, 0x69, 0x6e, 0x79, 0x20, 0x54, 0x65, 0x74, 0x72, 0x69, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20,
/*[210]*/ 0x4d, 0x69, 0x6e, 0x69, 0x20, 0x56, 0x4d, 0x55, 0x20, 0x54, 0x65, 0x74, 0x72, 0x69, 0x73, 0x20,
/*[220]*/ 0x62, 0x79, 0x20, 0x6d, 0x61, 0x72, 0x63, 0x75, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
/*[230]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[240]*/ 0x2, 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[250]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[260]*/ 0x0, 0x0, 0xfc, 0xfc, 0xa0, 0xf0, 0xf0, 0xf0, 0xcf, 0xfc, 0xa, 0xf0, 0xf, 0xf0, 0xff, 0xff,
/*[270]*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
/*[280]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[290]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[2a0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[2b0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[2c0]*/ 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[2d0]*/ 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[2e0]*/ 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[2f0]*/ 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[300]*/ 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[310]*/ 0x0, 0x0, 0x0, 0x1, 0x33, 0x33, 0x31, 0x33, 0x33, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[320]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0,
/*[330]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0,
/*[340]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0,
/*[350]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0,
/*[360]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0,
/*[370]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x33, 0x31, 0x33, 0x33, 0x30, 0x0, 0x0, 0x0,
/*[380]*/ 0x0, 0x0, 0x0, 0x4, 0x44, 0x44, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[390]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[3a0]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[3b0]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[3c0]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[3d0]*/ 0x0, 0x0, 0x0, 0x4, 0x66, 0x66, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[3e0]*/ 0x0, 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x0, 0x0, 0x0,
/*[3f0]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x64, 0x55, 0x55, 0x64, 0x55, 0x55, 0x60, 0x0, 0x0, 0x0,
/*[400]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x64, 0x55, 0x55, 0x64, 0x55, 0x55, 0x60, 0x0, 0x0, 0x0,
/*[410]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x64, 0x55, 0x55, 0x64, 0x55, 0x55, 0x60, 0x0, 0x0, 0x0,
/*[420]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x64, 0x55, 0x55, 0x64, 0x55, 0x55, 0x60, 0x0, 0x0, 0x0,
/*[430]*/ 0x0, 0x0, 0x0, 0x4, 0x66, 0x66, 0x64, 0x66, 0x66, 0x64, 0x66, 0x66, 0x60, 0x0, 0x0, 0x0,
/*[440]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[450]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[460]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[470]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[480]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[490]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[4a0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[4b0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[4c0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[4d0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[4e0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[4f0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[500]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[510]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[520]*/ 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[530]*/ 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[540]*/ 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[550]*/ 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[560]*/ 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[570]*/ 0x0, 0x0, 0x0, 0x1, 0x33, 0x33, 0x31, 0x33, 0x33, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[580]*/ 0x0, 0x0, 0x0, 0x4, 0x44, 0x44, 0x41, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0,
/*[590]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x61, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0,
/*[5a0]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x61, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0,
/*[5b0]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x61, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0,
/*[5c0]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x61, 0x22, 0x22, 0x31, 0x22, 0x22, 0x30, 0x0, 0x0, 0x0,
/*[5d0]*/ 0x0, 0x0, 0x0, 0x4, 0x66, 0x66, 0x61, 0x33, 0x33, 0x31, 0x33, 0x33, 0x30, 0x0, 0x0, 0x0,
/*[5e0]*/ 0x0, 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x0, 0x0, 0x0,
/*[5f0]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x64, 0x55, 0x55, 0x64, 0x55, 0x55, 0x60, 0x0, 0x0, 0x0,
/*[600]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x64, 0x55, 0x55, 0x64, 0x55, 0x55, 0x60, 0x0, 0x0, 0x0,
/*[610]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x64, 0x55, 0x55, 0x64, 0x55, 0x55, 0x60, 0x0, 0x0, 0x0,
/*[620]*/ 0x0, 0x0, 0x0, 0x4, 0x55, 0x55, 0x64, 0x55, 0x55, 0x64, 0x55, 0x55, 0x60, 0x0, 0x0, 0x0,
/*[630]*/ 0x0, 0x0, 0x0, 0x4, 0x66, 0x66, 0x64, 0x66, 0x66, 0x64, 0x66, 0x66, 0x60, 0x0, 0x0, 0x0,
/*[640]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[650]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[660]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[670]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[680]*/ 0x23, 0xe, 0xa1, 0x23, 0x20, 0x9, 0x23, 0x27, 0x80, 0xd8, 0x4e, 0xdf, 0x44, 0x23, 0x4c, 0xff,
/*[690]*/ 0x3, 0x12, 0x12, 0x3c, 0x1b, 0xa, 0x23, 0x4, 0xd7, 0x23, 0x5, 0xb, 0x1b, 0x3e, 0xf, 0x81,
/*[6a0]*/ 0xe1, 0x30, 0x90, 0xfa, 0x23, 0x4, 0x97, 0x23, 0x5, 0xc, 0x1b, 0x3e, 0x23, 0x0, 0x0, 0x12,
/*[6b0]*/ 0x39, 0x12, 0x3a, 0xf, 0xa5, 0x1a, 0xef, 0x22, 0x38, 0x64, 0x22, 0x3b, 0x0, 0x22, 0x30, 0x5,
/*[6c0]*/ 0x22, 0x31, 0x0, 0x1b, 0xb7, 0x13, 0x3, 0x23, 0x0, 0x0, 0x23, 0x2, 0x7, 0x40, 0x3, 0x2,
/*[6d0]*/ 0x12, 0x32, 0x22, 0x33, 0x0, 0x2, 0x38, 0x12, 0x37, 0x18, 0x2a, 0x19, 0xf, 0x90, 0x2d, 0x18,
/*[6e0]*/ 0x4c, 0xf, 0x16, 0x90, 0x3, 0x52, 0x37, 0xf9, 0x2, 0x38, 0x12, 0x37, 0x2, 0x31, 0x31, 0x12,
/*[6f0]*/ 0x10, 0x62, 0x31, 0x19, 0xf, 0x72, 0x31, 0x90, 0x8, 0x18, 0x4c, 0x62, 0x31, 0x18, 0x4c, 0x1,
/*[700]*/ 0xe0, 0x23, 0x0, 0x4, 0xf, 0xa5, 0x19, 0x90, 0x1a, 0x9, 0x1, 0xb1, 0x23, 0x4, 0x57, 0x23,
/*[710]*/ 0x5, 0xd, 0x1b, 0x7b, 0x1, 0x88, 0xf, 0x81, 0x61, 0x0, 0xd2, 0x3b, 0x12, 0x36, 0x71, 0x0,
/*[720]*/ 0xf1, 0xff, 0xe1, 0x30, 0x12, 0x3b, 0x6a, 0x36, 0x12, 0x2, 0x30, 0x80, 0xe, 0x72, 0x30, 0x19,
/*[730]*/ 0xf, 0x62, 0x30, 0x90, 0x6, 0x18, 0x4c, 0x72, 0x30, 0x18, 0x4c, 0x6b, 0x36, 0x13, 0x2, 0x30,
/*[740]*/ 0x31, 0xa, 0xe, 0x62, 0x30, 0x19, 0xf, 0x72, 0x30, 0x90, 0x6, 0x18, 0x4c, 0x62, 0x30, 0x18,
/*[750]*/ 0x4c, 0x6c, 0x36, 0x24, 0x60, 0x33, 0x60, 0x34, 0x60, 0x35, 0x2, 0x33, 0x63, 0x0, 0xe1, 0x3,
/*[760]*/ 0x12, 0x33, 0x18, 0x2a, 0x19, 0xf, 0x70, 0x35, 0x70, 0x34, 0x90, 0xa, 0x71, 0x0, 0x18, 0x4c,
/*[770]*/ 0x18, 0x2a, 0x18, 0x4c, 0x60, 0x33, 0x70, 0x33, 0x23, 0x0, 0x0, 0x69, 0x36, 0x2, 0x63, 0x0,
/*[780]*/ 0xa0, 0x78, 0x5c, 0x9, 0x3, 0x4c, 0x9e, 0x0, 0x4, 0x9f, 0x0, 0x3, 0xa0, 0x29, 0xf0, 0x9f,
/*[790]*/ 0x4c, 0xfd, 0x23, 0x27, 0x0, 0xf8, 0x7, 0x78, 0x5c, 0xf3, 0x7f, 0x4c, 0xf8, 0x23, 0x27, 0x80,
/*[7a0]*/ 0x9f, 0x4c, 0xfd, 0x1, 0xdc, 0x61, 0x0, 0x61, 0x2, 0x61, 0x3, 0x60, 0x2, 0x61, 0x25, 0x82,
/*[7b0]*/ 0x39, 0x12, 0x39, 0x13, 0x3, 0x2, 0x3a, 0x91, 0x0, 0x12, 0x3a, 0x23, 0x25, 0x1, 0xf, 0xd0,
/*[7c0]*/ 0x23, 0x25, 0x0, 0xf, 0xd0, 0x71, 0x25, 0x70, 0x2, 0x71, 0x3, 0x71, 0x2, 0x71, 0x0, 0xa0,
/*[7d0]*/ 0x22, 0x2, 0xc5, 0x23, 0x2, 0xa, 0x40, 0xf, 0xe0, 0x22, 0x2, 0x85, 0x23, 0x2, 0xa, 0x40,
/*[7e0]*/ 0xdd, 0xe, 0x61, 0x0, 0x61, 0x2, 0x61, 0x5, 0x61, 0x4, 0x60, 0x2, 0x23, 0x4, 0xa9, 0x23,
/*[7f0]*/ 0x5, 0xd, 0x3, 0x2, 0xdf, 0x1, 0xf0, 0xdf, 0x1, 0xf0, 0xdf, 0x1, 0xf0, 0x13, 0x2, 0x3,
/*[800]*/ 0x2, 0xc1, 0x16, 0x63, 0x2, 0x2, 0x2, 0x81, 0x6, 0x12, 0x2, 0x3, 0x2, 0xc1, 0x16, 0x63,
/*[810]*/ 0x2, 0x2, 0x2, 0x81, 0xa, 0x12, 0x2, 0x3, 0x2, 0xe1, 0x7, 0x90, 0xe2, 0x70, 0x2, 0x71,
/*[820]*/ 0x4, 0x71, 0x5, 0x71, 0x2, 0x71, 0x0, 0xfd, 0xe, 0xa0, 0x61, 0x5, 0x61, 0x4, 0x23, 0x4,
/*[830]*/ 0x71, 0x23, 0x5, 0xd, 0x2, 0x32, 0xe0, 0xe0, 0xd2, 0x33, 0xe0, 0x61, 0x0, 0xc1, 0x12, 0x34,
/*[840]*/ 0x71, 0x0, 0x63, 0x0, 0xc1, 0x12, 0x35, 0x71, 0x4, 0x71, 0x5, 0xa0, 0xdd, 0xe, 0x61, 0x0,
/*[850]*/ 0x61, 0x2, 0x61, 0x3, 0x61, 0x25, 0x60, 0x2, 0x60, 0x3, 0x61, 0x4, 0x61, 0x5, 0x2, 0x34,
/*[860]*/ 0x13, 0x4, 0x2, 0x35, 0x13, 0x5, 0x2, 0x30, 0x81, 0x11, 0x13, 0x2, 0xdf, 0x1, 0xd0, 0xdf,
/*[870]*/ 0x1, 0xd0, 0xdf, 0x1, 0xd0, 0x88, 0x31, 0x2, 0x81, 0x6, 0x12, 0x2, 0x2, 0x31, 0x81, 0x8,
/*[880]*/ 0x23, 0x25, 0x0, 0x9c, 0x0, 0x2, 0x63, 0x25, 0xe1, 0xe, 0xdf, 0x1, 0xf0, 0xdf, 0x1, 0xf0,
/*[890]*/ 0xdf, 0x1, 0xf0, 0x82, 0x2, 0xd1, 0x80, 0x12, 0x2, 0x3, 0x2, 0xe1, 0x7, 0x13, 0x2, 0x63,
/*[8a0]*/ 0x2, 0x23, 0x0, 0x1, 0xc0, 0x53, 0x2, 0xfc, 0x13, 0x2, 0x22, 0x3, 0x4, 0x23, 0x3, 0x4,
/*[8b0]*/ 0x60, 0x2, 0x61, 0x25, 0x3, 0x5, 0xd0, 0x13, 0x5, 0x3, 0x4, 0xd0, 0x13, 0x4, 0x9f, 0x1,
/*[8c0]*/ 0x4, 0x3, 0x2, 0xf6, 0x16, 0x2, 0x2, 0xe1, 0xf, 0x31, 0x5, 0x11, 0x7f, 0x1, 0xe, 0x2,
/*[8d0]*/ 0x2, 0x81, 0xa, 0x9f, 0x1, 0xb, 0x23, 0x25, 0x1, 0xd1, 0x80, 0x1, 0x4, 0x2, 0x2, 0x81,
/*[8e0]*/ 0x6, 0x12, 0x2, 0x53, 0x3, 0xce, 0x71, 0x25, 0x70, 0x2, 0x3, 0x2, 0xdf, 0x1, 0xd0, 0x13,
/*[8f0]*/ 0x2, 0x9f, 0x1, 0x5, 0x23, 0x2, 0x80, 0x62, 0x2, 0x52, 0x3, 0xb1, 0x71, 0x5, 0x71, 0x4,
/*[900]*/ 0x70, 0x3, 0x70, 0x2, 0x71, 0x25, 0x71, 0x3, 0x71, 0x2, 0x71, 0x0, 0xfd, 0xe, 0xa0, 0x61,
/*[910]*/ 0x2, 0x61, 0x3, 0x60, 0x1, 0x60, 0x3, 0x61, 0x4, 0x61, 0x5, 0x2, 0x34, 0x13, 0x4, 0x2,
/*[920]*/ 0x35, 0x13, 0x5, 0x2, 0x31, 0xdf, 0x1, 0xf0, 0x8b, 0x30, 0x2, 0x63, 0x0, 0x81, 0x3e, 0x12,
/*[930]*/ 0x1, 0x2, 0x30, 0xe1, 0x7, 0x13, 0x2, 0x63, 0x2, 0x23, 0x0, 0x1, 0xc0, 0x53, 0x2, 0xfc,
/*[940]*/ 0x13, 0x2, 0x22, 0x3, 0x4, 0x23, 0x3, 0x4, 0x60, 0x1, 0x3, 0x5, 0xd0, 0x13, 0x5, 0x3,
/*[950]*/ 0x4, 0xd0, 0x13, 0x4, 0x9f, 0x1, 0x5, 0x3, 0x2, 0xe5, 0x90, 0x2d, 0x2, 0x1, 0x81, 0x2,
/*[960]*/ 0x12, 0x1, 0x53, 0x3, 0xe5, 0x70, 0x1, 0x3, 0x2, 0xdf, 0x1, 0xd0, 0x13, 0x2, 0x9f, 0x1,
/*[970]*/ 0x5, 0x23, 0x2, 0x80, 0x62, 0x1, 0x52, 0x3, 0xcc, 0x23, 0x0, 0x0, 0x71, 0x5, 0x71, 0x4,
/*[980]*/ 0x70, 0x3, 0x70, 0x1, 0x71, 0x3, 0x71, 0x2, 0xa0, 0x70, 0x1, 0x23, 0x0, 0x1, 0x1, 0xec,
/*[990]*/ 0x61, 0x2, 0x61, 0x3, 0x60, 0x1, 0x60, 0x3, 0x61, 0x4, 0x61, 0x5, 0x2, 0x34, 0x13, 0x4,
/*[9a0]*/ 0x2, 0x35, 0x13, 0x5, 0x2, 0x31, 0xdf, 0x1, 0xf0, 0x8b, 0x30, 0x2, 0x63, 0x0, 0x81, 0x3e,
/*[9b0]*/ 0x12, 0x1, 0x2, 0x30, 0xe1, 0x7, 0x13, 0x2, 0x63, 0x2, 0x23, 0x0, 0x1, 0xc0, 0x53, 0x2,
/*[9c0]*/ 0xfc, 0x13, 0x2, 0x22, 0x3, 0x4, 0x23, 0x3, 0x4, 0x60, 0x1, 0x3, 0x5, 0xd0, 0x13, 0x5,
/*[9d0]*/ 0x3, 0x4, 0xd0, 0x13, 0x4, 0x9f, 0x1, 0x4, 0x3, 0x2, 0xd5, 0x15, 0x2, 0x1, 0x81, 0x2,
/*[9e0]*/ 0x12, 0x1, 0x53, 0x3, 0xe6, 0x70, 0x1, 0x3, 0x2, 0xdf, 0x1, 0xd0, 0x13, 0x2, 0x9f, 0x1,
/*[9f0]*/ 0x5, 0x23, 0x2, 0x80, 0x62, 0x1, 0x52, 0x3, 0xcd, 0x23, 0x0, 0x0, 0x71, 0x5, 0x71, 0x4,
/*[a00]*/ 0x70, 0x3, 0x70, 0x1, 0x71, 0x3, 0x71, 0x2, 0xa0, 0x61, 0x0, 0x60, 0x0, 0x60, 0x1, 0x22,
/*[a10]*/ 0x0, 0x64, 0x22, 0x1, 0x64, 0x4, 0x15, 0x62, 0x0, 0x62, 0x1, 0xe4, 0x41, 0xff, 0xb, 0x72,
/*[a20]*/ 0x1, 0x23, 0x0, 0xa, 0xf, 0xa5, 0x1a, 0x5b, 0x1, 0xd, 0x4, 0x15, 0x2, 0x1, 0x32, 0x0,
/*[a30]*/ 0x2, 0x1a, 0x69, 0xa1, 0x3, 0x12, 0x1, 0x2, 0x0, 0xa1, 0x3, 0x12, 0x0, 0x41, 0x3c, 0xd5,
/*[a40]*/ 0x32, 0x1, 0x11, 0x25, 0xc0, 0x62, 0x1, 0x25, 0xf, 0x2, 0x1, 0x1a, 0xa6, 0xa1, 0x3, 0x12,
/*[a50]*/ 0x1, 0x41, 0x3c, 0xef, 0x70, 0x1, 0x70, 0x0, 0x71, 0x0, 0xa0, 0x61, 0x0, 0x2, 0x38, 0x31,
/*[a60]*/ 0x2, 0x4, 0x73, 0x0, 0x12, 0x38, 0x71, 0x0, 0xa0, 0xdd, 0xe, 0x60, 0x2, 0x61, 0x25, 0x61,
/*[a70]*/ 0x5, 0x61, 0x4, 0x61, 0x0, 0x2, 0x0, 0x1a, 0xc3, 0x6, 0xe1, 0x1f, 0x13, 0x4, 0x62, 0x2,
/*[a80]*/ 0x6, 0xe1, 0xf8, 0x13, 0x5, 0x71, 0x0, 0x61, 0x0, 0x1a, 0xc3, 0x6, 0xe1, 0xe0, 0xd3, 0x4,
/*[a90]*/ 0x16, 0x62, 0x2, 0x6, 0xe1, 0x7, 0xd3, 0x5, 0x16, 0x71, 0x0, 0x71, 0x4, 0x71, 0x5, 0x71,
/*[aa0]*/ 0x25, 0x70, 0x2, 0xfd, 0xe, 0xa0, 0xdd, 0xe, 0x61, 0x0, 0x60, 0x2, 0x61, 0x25, 0x1a, 0xc3,
/*[ab0]*/ 0x6, 0xe1, 0xe0, 0x16, 0x62, 0x2, 0x6, 0xe1, 0x7, 0x16, 0x71, 0x25, 0x70, 0x2, 0x71, 0x0,
/*[ac0]*/ 0xfd, 0xe, 0xa0, 0x61, 0x0, 0x22, 0x2, 0x82, 0xa1, 0x3e, 0xdf, 0x1, 0xd0, 0x98, 0x0, 0x3,
/*[ad0]*/ 0x22, 0x2, 0x88, 0x81, 0x8, 0x23, 0x25, 0x0, 0x9c, 0x0, 0x2, 0x63, 0x25, 0xe1, 0xe, 0xdf,
/*[ae0]*/ 0x1, 0xf0, 0xdf, 0x1, 0xf0, 0xdf, 0x1, 0xf0, 0x82, 0x2, 0x12, 0x2, 0x71, 0x0, 0xa0, 0x60,
/*[af0]*/ 0x1, 0x22, 0x1, 0x3e, 0x25, 0xc0, 0x62, 0x1, 0x25, 0xf, 0x62, 0x1, 0x2, 0x1, 0x41, 0x6a,
/*[b00]*/ 0xf3, 0x22, 0x66, 0xff, 0x22, 0x67, 0xff, 0x70, 0x1, 0xa0, 0xdd, 0xe, 0x61, 0x0, 0x61, 0x25,
/*[b10]*/ 0x60, 0x2, 0x23, 0x25, 0x0, 0x22, 0x2, 0x80, 0x26, 0x0, 0x62, 0x2, 0x2, 0x2, 0xe1, 0xf,
/*[b20]*/ 0x41, 0xc, 0x6, 0x2, 0x2, 0x81, 0x4, 0x12, 0x2, 0x2, 0x2, 0x90, 0xeb, 0x78, 0x25, 0x5,
/*[b30]*/ 0x23, 0x25, 0x1, 0x1, 0xe0, 0x70, 0x2, 0x71, 0x25, 0x71, 0x0, 0xfd, 0xe, 0xa0, 0xdd, 0xe,
/*[b40]*/ 0x61, 0x0, 0x61, 0x25, 0x61, 0x3, 0x60, 0x2, 0x22, 0x2, 0x80, 0xf3, 0x0, 0x13, 0x25, 0x13,
/*[b50]*/ 0x3, 0xc1, 0x16, 0x62, 0x2, 0x2, 0x2, 0xe1, 0xf, 0x41, 0xc, 0xd, 0x2, 0x2, 0x81, 0x4,
/*[b60]*/ 0x12, 0x2, 0x90, 0x5, 0x63, 0x25, 0x22, 0x2, 0x80, 0x63, 0x3, 0x3, 0x3, 0x41, 0xc0, 0xe1,
/*[b70]*/ 0x70, 0x2, 0x71, 0x3, 0x71, 0x25, 0x71, 0x0, 0xfd, 0xe, 0xa0, 0xdd, 0xe, 0x61, 0x25, 0x60,
/*[b80]*/ 0x2, 0x23, 0x25, 0x0, 0x22, 0x2, 0xe2, 0x23, 0x3, 0x0, 0x3, 0x3, 0xc1, 0x16, 0x63, 0x3,
/*[b90]*/ 0x62, 0x2, 0x3, 0x3, 0xc1, 0x16, 0x63, 0x3, 0x2, 0x2, 0x81, 0x5, 0x79, 0x3, 0xa, 0x81,
/*[ba0]*/ 0x4, 0x9f, 0x1, 0x5, 0x81, 0x80, 0x23, 0x25, 0x1, 0x12, 0x2, 0x3, 0x3, 0x41, 0x1a, 0xdc,
/*[bb0]*/ 0x70, 0x2, 0x71, 0x25, 0xfd, 0xe, 0xa0, 0x61, 0x2, 0x61, 0x3, 0x2, 0x3c, 0x13, 0x2, 0x23,
/*[bc0]*/ 0x0, 0x4e, 0x23, 0x3, 0x6d, 0x30, 0x13, 0x2, 0x3, 0x3, 0x81, 0x39, 0x12, 0x3c, 0x3, 0x2,
/*[bd0]*/ 0x91, 0x30, 0x71, 0x3, 0x71, 0x2, 0xa0, 0xdb, 0x6d, 0xb6, 0xc3, 0x6c, 0x36, 0xdb, 0x6d, 0xb6,
/*[be0]*/ 0xc3, 0x6c, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x60, 0x6, 0x18, 0x6d, 0x80, 0x18,
/*[bf0]*/ 0x60, 0x6, 0x18, 0x6d, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x6c, 0x6, 0x3, 0x6c,
/*[c00]*/ 0x30, 0x18, 0x6c, 0x6, 0x3, 0x6c, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x60, 0x6,
/*[c10]*/ 0x18, 0x6c, 0x6, 0x18, 0x60, 0x6, 0x18, 0x6c, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18,
/*[c20]*/ 0x6d, 0x86, 0x18, 0x6d, 0xb0, 0x18, 0x6d, 0x86, 0x18, 0x6d, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[c30]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x94, 0x29, 0x94, 0x94, 0xc0, 0x1, 0x54, 0x54,
/*[c40]*/ 0x59, 0x55, 0x0, 0x1, 0x88, 0x54, 0xd1, 0x14, 0x80, 0x1, 0x48, 0x55, 0x51, 0x54, 0x40, 0x1,
/*[c50]*/ 0x88, 0x54, 0xd0, 0x8d, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[c60]*/ 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x10, 0xb, 0x33, 0x99,
/*[c70]*/ 0x83, 0x3, 0x90, 0xa, 0xaa, 0x22, 0x4, 0x92, 0x50, 0xb, 0x33, 0x11, 0x7, 0xbb, 0x90, 0xa,
/*[c80]*/ 0x2a, 0x8, 0x84, 0x92, 0x50, 0xa, 0x2b, 0xb3, 0x4, 0x83, 0x90, 0x8, 0x0, 0x0, 0x0, 0x0,
/*[c90]*/ 0x10, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x0, 0x0,
/*[ca0]*/ 0x0, 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49,
/*[cb0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[cc0]*/ 0x0, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0, 0x7, 0x80, 0x0, 0x7f, 0x1, 0x20,
/*[cd0]*/ 0x4, 0x80, 0x0, 0x48, 0x1, 0x20, 0x4, 0x80, 0x0, 0x4c, 0x1, 0x20, 0x4, 0x80, 0x0, 0x4a,
/*[ce0]*/ 0x1, 0x20, 0x4, 0x80, 0x0, 0x31, 0x1, 0x20, 0x4, 0x80, 0x0, 0x0, 0x1, 0x20, 0x4, 0x80,
/*[cf0]*/ 0x0, 0x40, 0x1, 0x20, 0x4, 0x80, 0x0, 0x40, 0x1, 0x20, 0x4, 0x80, 0x0, 0x7f, 0x1, 0x20,
/*[d00]*/ 0x4, 0x80, 0x0, 0x40, 0x1, 0x20, 0x4, 0x80, 0x0, 0x40, 0x1, 0x20, 0x4, 0x80, 0x0, 0x0,
/*[d10]*/ 0x1, 0x20, 0x4, 0x80, 0x0, 0x41, 0x1, 0x20, 0x4, 0x80, 0x0, 0x41, 0x1, 0x20, 0x4, 0x80,
/*[d20]*/ 0x0, 0x49, 0x1, 0x20, 0x4, 0x80, 0x0, 0x49, 0x1, 0x20, 0x4, 0x80, 0x0, 0x7f, 0x1, 0x20,
/*[d30]*/ 0x4, 0x80, 0x0, 0x0, 0x1, 0x20, 0x4, 0x80, 0x0, 0x40, 0x1, 0x20, 0x4, 0x80, 0x0, 0x40,
/*[d40]*/ 0x1, 0x3f, 0xfc, 0x80, 0x0, 0x7f, 0x1, 0x0, 0x0, 0x80, 0x0, 0x40, 0x1, 0x0, 0x0, 0x80,
/*[d50]*/ 0x0, 0x40, 0x1, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x44, 0xae, 0x8a, 0xe8, 0xee, 0xac, 0xaa,
/*[d60]*/ 0xa8, 0x4a, 0xae, 0x0, 0x0, 0x4a, 0xec, 0xaa, 0x8a, 0xaa, 0xcc, 0xaa, 0x8a, 0x44, 0xea, 0x0,
/*[d70]*/ 0x0, 0x64, 0x2, 0x30, 0x6, 0x40, 0x26, 0x60, 0xc, 0x62, 0x4, 0x60, 0x3, 0x20, 0x46, 0xc0,
/*[d80]*/ 0x6, 0x64, 0x4, 0x70, 0x2, 0x20, 0x26, 0x40, 0xe, 0x60, 0x6, 0x60, 0x6, 0x60, 0x6, 0x60,
/*[d90]*/ 0x6, 0x46, 0x4, 0x70, 0x1, 0x20, 0x62, 0x80, 0xe, 0x44, 0x6, 0x70, 0x4, 0x60, 0x22, 0x20,
/*[da0]*/ 0xe, 0x22, 0x22, 0x0, 0xf, 0x44, 0x44, 0xf0, 0x0, 0x3e, 0x63, 0x67, 0x6b, 0x73, 0x63, 0x3e,
/*[db0]*/ 0x0, 0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x0, 0x3e, 0x63, 0x3, 0x3e, 0x60, 0x60, 0x7f,
/*[dc0]*/ 0x0, 0x3e, 0x63, 0x3, 0xe, 0x3, 0x63, 0x3e, 0x0, 0x63, 0x63, 0x63, 0x7f, 0x3, 0x3, 0x3,
/*[dd0]*/ 0x0, 0x7f, 0x60, 0x60, 0x7e, 0x3, 0x63, 0x3e, 0x0, 0x3e, 0x63, 0x60, 0x7e, 0x63, 0x63, 0x3e,
/*[de0]*/ 0x0, 0x7f, 0x3, 0x3, 0x6, 0xc, 0xc, 0xc, 0x0, 0x3e, 0x63, 0x63, 0x3e, 0x63, 0x63, 0x3e,
/*[df0]*/ 0x0, 0x3e, 0x63, 0x63, 0x3f, 0x3, 0x63, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[e00]*/ 0x0};
const int gamesize = sizeof(flash);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment