Skip to content

Instantly share code, notes, and snippets.

@felipemanga
Created December 6, 2017 03:05
Show Gist options
  • Save felipemanga/3be01b70f802e404806732cfcb2a9a88 to your computer and use it in GitHub Desktop.
Save felipemanga/3be01b70f802e404806732cfcb2a9a88 to your computer and use it in GitHub Desktop.
:100000000C94D50A0C94FD0A0C94FD0A0C94FD0A7C
:100010000C94FD0A0C94FD0A0C94FD0A0C94FD0A44
:100020000C94FD0A0C94FD0A0C9420110C9492116E
:100030000C94FD0A0C94FD0A0C94FD0A0C94FD0A24
:100040000C94FD0A0C94FD0A0C94FD0A0C94FD0A14
:100050000C94FD0A0C94FD0A0C94FD0A0C945E0BA2
:100060000C94FD0A0C94FD0A0C94FD0A0C94FD0AF4
:100070000C94FD0A0C94FD0A0C94FD0A0C94FD0AE4
:100080000C94FD0A0C94FD0A0C94FD0A0C94FD0AD4
:100090000C94FD0A0C94FD0A0C94FD0A0C94FD0AC4
:1000A0000C94FD0A0C94FD0A0C94FD0ADC15021652
:1000B0001E1640166C16761683169716A616B816D8
:1000C000C216D916DF16ED16FA16281740174C1768
:1000D00075173A1D9817AB17C017071855188518CC
:1000E000C218D818E718F61828192B193A195E19EA
:1000F000821994199B19A019D319D519D719D9198F
:10010000E119E519E9191E1A211A2D1A5A1A801A2D
:100110009B1AA01AA71AE31A341B571B911B9C1B8E
:10012000A41BAC1BD5F08D14A1C881CFD9F1AF2091
:1001300000210480284F000000000000284F00002C
: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
:1003300000535041434520494E56414445525320B5
:1003400020687474703A2F2F7777772E6A756D70E6
:1003500073746174696F6E2E636F2E756B2020202D
:10036000200000000000000000000000000000006D
:100370000001000A00000000000000000000000072
:10038000000000000000000000000000000000006D
:1003900000E8FFDAFFABFE18F919F419F119F05C67
:1003A000F9CBFF9CFF7DFBDCFF5EF5FFFFFFFFFF4E
:1003B000FF0000000000000000000000000000003E
:1003C000000000000000001200000000000000001B
:1003D0000000000000223334320000000000000062
:1003E00000000000233455664300000000000000B8
:1003F000000000023666666653012000000000001F
:1004000000000001366666666533430000000000A8
:100410000000000036666654565663200000000057
:10042000000000234654433334666420000000007B
:10043000000003445643200024666530000000009D
:100440000000246664300001746544200000000050
:10045000000013666532233346633200000000005B
:1004600000000366666445666642000000089AB0B4
:100470000000034434666666664212200A7CCCA003
:100480000000002227466666664334438CCCCCC904
:100490009900000002366665446666630CCCC7CCE2
:1004A000C700000233664333323566632CA9B09C23
:1004B000CC00000345653200003466642C900BAC20
:1004C0007A0000346664200000245443CC7A7CCC4B
:1004D000B00000246664300000023322AACCCCCCE9
:1004E000990000236664200000000000007CCCCC52
:1004F000CC00000343330000000000009AC799B904
:10050000CC00007CCCA2B0000000000BCCC90000E5
:10051000CC0002C7AACCA000000000007CC20000F2
:1005200009002CC8087C200000000000A77B000008
:1005300000008CC77CC80000000000000000000024
:1005400000000B2CCCCAAB00000000000000000033
:10055000000008ACA29CC2000000000000000000E7
:1005600000000AC7000AAB00A270000000ACCAA0DD
:100570000000027A00000000AAC00000087A27707C
:100580000000000000000000A8B000000ACAAC2073
:10059000000000000000000000000000002CC772F6
:1005A00000000000000000000000000000AA8BAA6C
:1005B00000230EA1232009232780D84EDF44234C9B
:1005C000FFD901021DF901980005226FFF010322E6
:1005D0006F00223102222328223800226E00193FA8
:1005E0000F190CFD0F870E252013259C003A2013B0
:1005F000259D00302013259A00192013259B000209
:1006000001E0022F312ADB2009ED6300122F2009BF
:10061000ED0119022F3100CA2009ED7300122F20BD
:1006200009ED01080E2801CC0E7B01C201B4DD0EDC
:10063000610061026103600261256163616461655B
:10064000FC63236480220280F3001325D8650366CF
:100650001603649011220280236480F865982502B5
:100660000108F82501E8620201E4716571647163B3
:1006700071257002710371027100FD0EA0DD0E6123
:100680000061026103FC63236480F30013651302BD
:10069000230381026F136673030303900F23038107
:1006A000236480F8656302030231020201E57103ED
:1006B00071027100DC63FD0EA022004C1302025F88
:1006C000A104126B0302800A020081061200730269
:1006D00001F2222D06047F00429E0005226D0401D6
:1006E00003226D00E13F126C7300325E1163003231
:1006F0005E0C6300325E076300325E02011D04D1AE
:1007000080E180140E916232226000726E026E905F
:10071000022F1902218009722101056200522DB5B4
:10072000A0DD0E0260802C0ED622013B222902059C
:100730008104425F0802290D8802608016722972C6
:100740000102014138E9025F8006725F0ED60103A3
:10075000226000FD0EA00DF0A02304332305121B20
:10076000FCDD0E1ADAFD0E0CFD2013259C00FA208C
:1007700013259D00FA2013259D00059C001801F506
:1007800023046323050C1B910CFD2225FF1A88020C
:10079000259D00F601C3022F31FF100D4C19EDDD30
:1007A0000E18AEFD0E026080020ED6A002609011FF
:1007B000226001022F8101125E022E8101125F0E62
:1007C000D6A0610061026103222D00026B822D1A06
:1007D00074136423044C23050C022D826DC1130293
:1007E000026C1A3C836413640302F366136603030A
:1007F00080066364F3661366230004622D422DCBEA
:10080000710371027100A0610061026103222D0079
:10081000025F822D1A74136423046023050C022DD9
:10082000C11302025E1A3C836413640302F366136D
:1008300066030380066364F3661366230003622D78
:10084000422DCD710371027100A0026E90026238D8
:100850000238310106026E900A0E2802238006A19A
:10086000081223022312211224222F1722300422DD
:100870002E1C226000220139250462012509620133
:10088000250E222700026E902422014C226E122394
:10089000020B230300F300187623020B230340F31B
:1008A00000187623020B230300F3001876DD0E0DEB
:1008B0004C19ED18AEFD0EA0022480047224011A1A
:1008C00002211224DD0E18AE188B022790040FFBB4
:1008D0000102183818AE0FAAFD0EA0610061026176
:1008E0000322015E23020373022303067201059FA4
:1008F000000F73030303900201ED0201414CED016F
:100900002422013903028201120105411917023123
:10091000900F222FFF19B00E287103710271002C65
:10092000A172310F19710371027100A0222CFF22F4
:10093000014C05E1BF7F0008322C009F0102122C00
:1009400062010201415EEB022C900E2201396562C8
:1009500001656201656227010F22014C057F0001DC
:100960007562010201415EF4A0222C0022014C05B7
:10097000E1BF7F0008322C007F0102122C620102CD
:1009800001415EEB022C412C0E22013965620165AA
:100990006201657227010F22014C057F000165622B
:1009A000010201415EF4A0310611C302F30315F305
:1009B000038106C3026201630001ECA060016100D3
:1009C000610222014CF30031120E130205F14015B1
:1009D00003026201630001EF710271007001A06106
:1009E00000600161026103222C00222600022C31EA
:1009F00003752201398201120105122A222D0002FB
:100A00002D310459022A1A741229222B00022B318B
:100A1000064522014C820182261201057F00345EC8
:100A2000000522280001032228041303F3002304F5
:100A30004C23050C8228822DC1130203031A3C8229
:100A40002913640302F3661366030380066364F3E9
:100A5000661366622B01B6622A622D01A20226810C
:100A6000061226622C01867103710270017100A0CA
:100A70002013259C00FA2304E723050C1BFC0CFD26
:100A80001A881A881A881A88230205230463230502
:100A90000C1B910CFD2225FF1A8802259C00412386
:100AA00004E723050C1BFC0CFD2225FF1A880225F8
:100AB0009C002D73020302800201D02304E723056A
:100AC0000C1AAA2013259C00171BFC0CFD030481A3
:100AD0000613040305910013054110E51A880190DF
:100AE000A02304732305111BFC0CFD1A881A881A15
:100AF000881A8823046323050C1B910CFD2225FF13
:100B00001A8802259C00162304732305111BFC0C74
:100B1000FD2225FF1A8802259C000201D6A0610053
:100B200061026103DD0E222D000231E08300122CF0
:100B3000022E822D1A74136423044023050C022D07
:100B4000822CC11302022F1A3C836413640302F344
:100B5000661366030380066364F3661366023062FD
:100B60002D422DC5FD0E710371027100A0610213AB
:100B700002DF01D0DF01D0DF01D01303DF01F0DF9E
:100B800001F0DF01F0C302A302710261032303003D
:100B90008010C302DF01D0C303D0C303C3027300BC
:100BA00001EE7100A0E0E0E09B0002A102236500DD
:100BB0009F00032365FFD180A061002300041A92E7
:100BC0007100A061021AAA1302022541FF05201339
:100BD00025122503025300ED7102A061002300FFDE
:100BE0005300FD7100A0230300A3027F01046303EF
:100BF00001F78302A06102230200800AC30281057B
:100C0000C302730001F4C3027102A0023823020A76
:100C10001AB5C3031AC4121EC303222023221F04C1
:100C20001B482302011AB5C3031AC4121EC30322B0
:100C30002029221F041B4802322302641AB5C30371
:100C40001AC4121EC30322200E221F181B4823029F
:100C50000A1AB5C3031AC4121EC303222014221F8A
:100C6000181B482302011AB5C3031AC4121EC3037A
:100C700022201A221F181B48A06100610261036034
:100C80002D222D00021F822D1A7413642304F323D6
:100C90000512022D821EC1130202201A3C83641326
:100CA000640302F3661366030380066364F366134A
:100CB00066230005622D422DCB702D7103710271E8
:100CC00000A06163DC63DD0E610061032364D0F387
:100CD0000013651303C1E366136663640364E10FE5
:100CE000410C0E03648104136490062365FF2364A2
:100CF00080630303034142DD2364D0F300136503E3
:100D000003C1D366136663640364E10F410C0E03F1
:100D1000648104136490062365FF236480630303E6
:100D2000034184DD71037100FD0E7163A06163DC1A
:100D300063DD0E6100616561036164236480F3001B
:100D4000D8651303C1136663640364E10F410C0D9E
:100D50000364810413649005F865236480630303CE
:100D60000341C0E07164710371657100FD0E716330
:100D7000A0205088502050D8882070F8A860B0601B
:100D80009060D060607CE27C7CB27C7C9A7C7C8EC3
:100D90007C4040A0FE000000007FFC000000003FFF
:100DA000F8000000001FF0000000000FF00000003D
:100DB000000FF0000000000FF0000000000FF00036
:100DC0000000000FF0000000000FF0000000000F16
:100DD000F0000000000F00000000000001FFFFFF16
:100DE000FF8002000000004004F73CE70320049469
:100DF000A10804A004F738C607A00485202104A098
:100E00000484BDCE04A004000000002007FFFFFF03
:100E1000FFE0000000000000FFFDFFFFFFFFFFFFFD
:100E2000FFFFFFFFFDFFF3FFFFFBBFFFE7FBFFFF40
:100E3000FFDFCDEFFCFFFFFFE1FFFDFFFFFE727F55
:100E4000CC3FFFFCF8FF9FBFEFFDFCFF877FFFFE5D
:100E5000EFFFE1FFFFE60FF9F3FFFC29FFE25FFF81
:100E6000F9A0FFF36BFFED37FCF97FFFDC77FD3C6A
:100E70007FFF9E77CD1EDDF79FBFEC5F87C7C79EC4
:100E8000EEFD9787F7FE365F3F07F3F3977BAC07DE
:100E9000E7F9E3FEDC07FF0CFFFFF827FF307FFFD9
:100EA000E027F79F3FFFC027F3CFFFFF4027FBE777
:100EB000FBFF83C7FDE7FFFF0007FCFFFFFE000706
:100EC000FE7FFF7FFFFFFF7FFFFFFFFFFFFF7FFF33
:100ED000FFFFFFFFFFFFFFFF00000000000000001A
:100EE0000000000000000000000000000000000002
:100EF00000000000000000000000000000002F4083
:100F000000000000000000000000000000000000E1
:100F100000000000000000000000000000000000D1
:100F200000000000000000000000000000000000C1
:100F30000000000000000000000000000000073377
:100F40009EE0E50008495050550008495C50620099
:100F500008495050520007339EE0E20000000000B4
:100F60000000000000000000000000000000000081
:100F70000000000000000000000000000000000071
:100F80000000000000000E7791452F80094259456E
:100F900022000942594522000E625545E2000A42EC
:100FA0005345220009425345220009779139220016
:100FB0000000000000000000000000000000000031
:100FC0000000000000000000000000000000000021
:100FD0000000000000000000000000000000000011
:100FE0000FFFFFFFFF800000000000000000000076
:100FF00000000000000000000000000000000000F1
:1010000000000000000000000000000000000000E0
:1010100000000000000000000000000000000000D0
:101020000000000F7191000000084A5B0000000EF4
:10103000725500000008525100000008499100005C
:1010400000000000000000000000000000000000A0
:101050000000000000000000000000000000000090
:101060000000000000000000000000000000000080
:101070000000000000000000000000000000000070
:101080000000000000000000000000000000000060
:101090000000000004489100000004489100000096
:1010A000044891000000054A9530000002850A308E
:1010B0000000000000000000000000000000003DF3
:1010C0002970000000092F48000000092970000065
:1010D0000029294000000010C94000000000000065
:1010E000000000000000000000EF33DE6480010219
:1010F0004884968000C2788496800022488495981F
:1011000001C2489E6498000000000000000000003A
:101110000000000000000000000003981290000092
:10112000042412A00000042412C00000042592A090
:10113000000003998C9000000000000000000000F7
:10114000000000000000000000000000000000009F
:10115000000000000000000000000000000000008F
:10116000000000000000800000000000800000007F
:101170000000C00000000001E00000000003E000EB
:1011800000000003B00000000007F8000000000F9E
:10119000FC000000001FFF000000007FFF80000037
:1011A00000FBDFC0000001FFFFF0000007FFFFF8B9
:1011B00000000FDFFFFF00007FBFFDFFF007FFFF14
:1011C000FFFFFFFF8889FFF7FFF7BAABF3FFFBFFD5
:1011D0009AA9FFFFFFFFBAADFFFFFFFF88A9FF0736
:1011E000FE1FFFFFFEDB00FFFFFFFF07FB8FFFFF80
:1011F000FFFFFFFDF7FFEFFFFFFFFFFFFFFFFFFF19
:10120000FFFFFFFEFEFFFFFBFFFFFFFFFFFFFFBF34
:10121000FFFFFFFFFFFFFFFFFFFFDFFBFDFEFFFF05
:10122000FFFFFFFFFEFFFFFFFFFFFFFFFFFDFFFFD1
:10123000FFFBFFFFF7FFFFFFFFFFFFFFFFFFF9FFD0
:10124000FFFF7FFFD0BFFFDFFFBFB0DFBFFFFFFFAC
:10125000C93FFF6FFFFFF0FFFFFFFFFFFFFFFEDF54
:10126000FFFFFFFF7FFFFFF7FFFE3FFFF3FFEF777B
:101270007FFFE5FFFFFFFFFFF3FFFFFFFFFFEDFF36
:10128000FFFFFF7EFFFFFBFFFFFFFFFFEFFFFFFF03
:10129000FFFFFFF7BFFFFFFBFFFFFFFFFFFFFFFFAA
:1012A000FFFEFFFFFFFFFFFFFFFFDFFFFDFFFFFF71
:1012B000FF5FF97FFFFBFFFFF8BFFEFFFFFF1C3F53
:1012C0007FFFFBFC0E7FFFFFFFFC27FFFFFFFFFC04
:1012D000F3FFFFFFFFFEFFFFFFFFFF1E7FE1FEBFEB
:1012E000CF633FCDFFFBDF21EFCC1FFF9F9DFFC8EA
:1012F000FFFFB99FFFF3FFFFB19FF9F1F03FBDDFA3
:10130000F378C00F9DFFB87F0103C9FF9CDE630126
:10131000E3FFDE1CC300FFFDEF388230FFFC2739FE
:101320008218FF8F07F10008FF27E7F00008FE771B
:10133000FFE002207E77FFE01000FF77FFE0780CEF
:10134000FF8FFEEC3804FFFDFFE03A02FBFFFFE0F9
:101350001802FFFFFFF04600FFFFFFF07340FFFFA2
:10136000FFF83FC07FFFFFFFFFFEC000000000034B
:1013700080000000000180000000000190F4BD0129
:1013800080019084A102400190E4B9024001908361
:10139000210240019EF33DE1800180000000000138
:1013A0008000000000018000000000018F8000002C
:1013B00001F1F07FFFFFFE0F8F80000001F1800040
:1013C000000004018000000000018E7339E0040178
:1013D0009084A5000E018C84B9C3BFB98284A90092
:1013E0000E019C7325E004018000000004018000D0
:1013F00000000001803000003001804800004801FA
:10140000804800004801804800004801803000000A
:101410003001800000000001C000000000037FFFD9
:10142000FFFFFFFE30484848301030101038304879
:1014300010207870083808701020507810784070AC
:10144000087030407048307808102020304830480C
:10145000303048380830785C09034C9E00049F0007
:1014600004A02101F0F8079F4CFB232700F8077820
:101470005CF07F4CF8232780F8079F4CFB01D700D6
:10148000000000000000000000000000000000005C
:10149000000000000000000000000000000000004C
:1014A000000000000000000000000000000000003C
:1014B000000000000000000000000000000000002C
:1014C000000000000000000000000000000000001C
:1014D000000000000000000000000000000000000C
:1014E00000000000000000000000000000000000FC
:1014F00000000000000000000000000000000000EC
:1015000000000000000000000000000000000000DB
:1015100000000000000000000000000000000000CB
:1015200000000000000000000000000000000000BB
:101530000000080B00020202010009040000010281
:101540000200000524001001052401010104240209
:101550000605240600010705810310004009040167
:1015600000020A0000000705020240000007058390
:10157000024000000403090412010002EF020140CE
:101580004123368000010102030141726475696ED6
:101590006F204C4C430041726475696E6F204C653E
:1015A0006F6E6172646F0000492111241FBECFEF7E
:1015B000DAE0DEBFCDBF11E0A0E0B1E0EAE6F3E49F
:1015C00002C005900D92A632B107D9F728E0A6E235
:1015D000B1E001C01D92A233B207E1F71AE0C5EDF8
:1015E000DAE004C02197FE010E94A821C43DD10782
:1015F000C9F70E94FD130C94B3210C9400003FB76F
:10160000F8948091C8079091C907A091CA07B0913A
:10161000CB0726B5A89B05C02F3F19F00196A11D49
:10162000B11D3FBFBA2FA92F982F8827820F911D78
:10163000A11DB11DBC01CD0142E0660F771F881FBF
:10164000991F4A95D1F708958F929F92AF92BF92BA
:10165000CF92DF92EF92FF926B017C010E94FF0A12
:101660004B015C01C114D104E104F104F1F00E94CA
:10167000FF0ADC01CB0188199909AA09BB09883E38
:101680009340A105B10570F321E0C21AD108E10829
:10169000F10888EE880E83E0981EA11CB11CC114CD
:1016A000D104E104F10419F7DDCFFF90EF90DF9052
:1016B000CF90BF90AF909F908F9008951F920F9200
:1016C0000FB60F9211242F933F938F939F93AF9355
:1016D000BF938091260190912701A0912801B0919C
:1016E00029013091C70723E0230F2D3720F40196FD
:1016F000A11DB11D05C026E8230F0296A11DB11D35
:101700002093C7078093260190932701A093280177
:10171000B09329018091C8079091C907A091CA0789
:10172000B091CB070196A11DB11D8093C80790937E
:10173000C907A093CA07B093CB07BF91AF919F9100
:101740008F913F912F910F900FBE0F901F90189582
:101750008EBD00000DB407FEFDCF08952F923F927D
:101760004F925F926F927F928F929F92AF92BF92B1
:10177000CF92DF92EF92FF920F931F93CF93DF935D
:10178000CDB7DEB7EC970FB6F894DEBF0FBECDBF76
:10179000CE0101964C0180E3D4011D928A95E9F7B0
:1017A0001091D906133808F01358012F02950695A9
:1017B000069503701F73110F90E0792F7370872FB8
:1017C000880FB0902A016401FE013896612F56E01F
:1017D0001F5F20E8029FD0011124A60FB11DA55D57
:1017E000BC4F4C91B11001C040E0342F331F332760
:1017F000331F082E01C0330F0A94EAF7D6012C914B
:10180000232B2C93DF01169746FBFF24F0F8F9AA4F
:101810001AAAE9A8FAA8082E01C0EE0C0A94EAF761
:101820003C91E32AEC92119645FBFF24F0F8FBAAC9
:101830001CAAEBA8FCA8082E01C0EE0C0A94EAF73B
:101840003C91E32AEC92119644FBFF24F0F8FDAAA8
:101850001EAAEDA8FEA8082E01C0EE0C0A94EAF715
:101860003C91E32AEC92119643FBFF24F0F8FFAA87
:1018700018AEEFA8F8AC082E01C0EE0C0A94EAF7F7
:101880003C91E32AEC92119642FBFF24F0F8F9AE6A
:101890001AAEE9ACFAAC082E01C0EE0C0A94EAF7D5
:1018A0003C91E32AEC92DF0141FB222420F8312C09
:1018B0009101082E01C0220F0A94EAF73E91232BD2
:1018C0002C9340FB662460F8712C9301082E01C014
:1018D000220F0A94EAF73081232B2083212F2F70C7
:1018E0002C3010F015E0160F17FF02C00F5F1058D4
:1018F000023021F4163010F0165000E0515028E06C
:10190000C20ED11C3896552311F0612F61CF733070
:1019100079F5412C512C620183E0CC0CDD1C8A95B9
:10192000E1F7A12CB12C7501EC28FD28E80CF91C7D
:10193000D7012C91822F880F282B2095822F2BAF37
:101940009CAF0E94A80B2BAD822F0E94A80BF70121
:101950001082FFEFAF1ABF0A9CAD28E0A216B104B7
:1019600011F78FEF481A580AA6E04A16510499F663
:101970009F5F903209F021CF1092B707EC960FB617
:10198000F894DEBF0FBECDBFDF91CF911F910F91B5
:10199000FF90EF90DF90CF90BF90AF909F908F908F
:1019A0007F906F905F904F903F902F9008950F938E
:1019B0001F93CF93DF931F92CDB7DEB78C01803892
:1019C0009140F0F08091DC06833008F040C1823015
:1019D00029F4063891E0190708F039C1F80120E828
:1019E000829FE00DF11D1124E555FE4F608380912B
:1019F0002A01882309F426C181E08093B70722C118
:101A0000053181E0180709F4B0C000F50E3021E07F
:101A1000120709F468C050F4011591E01907B9F1F3
:101A20000D3021E0120709F444C00CC1013181E0FE
:101A3000180709F482C0033191E0190709F48AC03C
:101A4000003121E0120709F0FDC069C00D3181E0CD
:101A5000180709F4AEC058F4083121E0120709F460
:101A60008FC00B3181E0180709F498C0EBC0073232
:101A700091E0190709F4A8C0063621E0120709F41D
:101A8000B6C0023281E0180709F0DCC0B0CF862F63
:101A900082958F708627982F969596958927982FEF
:101AA000969589279091B80680FB90F99093B80697
:101AB000C9C08091C406862780FFC4C08091BA0740
:101AC0009091BB078E3F2FEF920708F0BBC040916B
:101AD000BC075091BD07FA01E80FF91FE491E1320C
:101AE00009F0B0C09DC0862F807A803271F028F452
:101AF0008111A8C088EB9BE00AC0803869F0803A69
:101B000009F0A0C088E491E002C084EA90E09093DC
:101B1000B9078093B80796C080E797E1F8CF66FDD4
:101B200007C08091CA0690E09093B2068093B106F8
:101B300067FD88C08091CC061DC080E091E0861BC7
:101B400091099093B4068093B3061092B606109252
:101B5000B50678C08091C70686FD74C0862F90E0D8
:101B60009093B2068093B1066DC08091C70687FD41
:101B700069C0862F90E09093B0068093AF0662C054
:101B800066FD07C08091D20690E09093AE068093E8
:101B9000AD0667FD57C08091D40610C08091CF0676
:101BA00086FD50C0862F90E09093AE068093AD06E0
:101BB00049C08091CF0687FD45C0862F90E0909365
:101BC000AC068093AB063EC0262F221F2227221F81
:101BD000422F50E080912A0190E04817590791F177
:101BE00020932A0169830E94AE0B69812BC09091DA
:101BF0001C0780911B07E82FF0E0F92BF170E55DE1
:101C0000FE4F608320911A0724FF21C08F5F8093CD
:101C10001B0781111CC081E0892780931C0717C016
:101C20009C012F5F3F4FFA01E20FF31F24910296B0
:101C3000FA01E80FF91FE491F0E0F22BF093BB07F3
:101C4000E093BA071127F801E954F94F60830F9028
:101C5000DF91CF911F910F910895A7EBB6E01696F3
:101C60009C911697E92FF0E0E555FB4F808191504C
:101C700016969C9308958F3F910509F068F4209182
:101C8000B80626952170F22FE0E08E0F9F1FFC0111
:101C9000E555FB4F608308950C94D70C8F3F910559
:101CA00009F060F42091B80626952170F22FE0E04B
:101CB0008E0F9F1FFC01E555FB4F11C0803821E0BE
:101CC000920778F02091DC06233008F056C030E807
:101CD000239F800D911D1124FC01E555FE4F80814D
:101CE00008958D3121E0920719F178F4843121E0D3
:101CF0009207C1F08B3131E09307B9F0823121E0D6
:101D00009207B1F58091B1060895853631E09307C9
:101D100091F0863621E0920791F08C3531E09307FF
:101D200039F52DC08091AF0608958091AD060895D4
:101D30008091AB06089580911C078E6F08952091C5
:101D40001C0790911B07E92FF0E0F22BF170E55D85
:101D5000FE4F808130911A0734FF12C09F5F90932D
:101D60001B0791110DC091E0922790931C070895D5
:101D70009927FC01E954F94FB2CF8FEF089582E023
:101D80000895A7EBB6E01696EC911697EF5F1696BE
:101D9000EC93F0E0E555FB4F808308958B3121E013
:101DA000920741F08D3121E0920721F00E944E0E02
:101DB00090E008958FEF90E0089521E030E001C0B9
:101DC000220F8A95EAF780910307282B20930307B7
:101DD0008091050782FF03C0826080930507089504
:101DE00021E030E001C0220F8A95EAF7209580912A
:101DF00003072823209303078091050782FF03C070
:101E00008260809305070895FC018091D4078111B9
:101E100003C08FEF9FEF08959FB7F89482E08093FF
:101E2000E9002091F20030E01216130614F421E0CC
:101E300030E02115310559F0289884E68093D307C6
:101E40008091F10080838091F200882319F09FBF78
:101E5000C90108958BE68093E800F9CF2FB7F89475
:101E600083E08093E9009091E800892F807295FFCC
:101E700004C09091F20080E4891B2FBF0895CF9297
:101E8000DF92EF92FF920F931F93CF93DF936C013A
:101E90007A018B01C0E0D0E0CE15DF0589F0D801D2
:101EA0006D918D01D601ED91FC910190F081E02DB5
:101EB000C6010995892B11F47E0102C02196ECCF51
:101EC000C701DF91CF911F910F91FF90EF90DF90AD
:101ED000CF90089580912A0881110DC082E08093EF
:101EE000260884E080932708109229081092280879
:101EF00081E080932A0886E298E00895CF93DF93EB
:101F00001F92CDB7DEB76983DC01ED91FC910280B1
:101F1000F381E02D41E050E0BE016F5F7F4F0995F6
:101F20000F90DF91CF91089583E08093E900809135
:101F3000F200882319F08AE38093E80008950E9454
:101F40002E0F90E00895CF93DF931F92CDB7DEB7A9
:101F5000FC018485958597FD05C02FEF3FEF358700
:101F600024870BC0CE0101960E94040F019719F43B
:101F7000898190E002C08FEF9FEF0F90DF91CF91AA
:101F800008950F931F93CF93DF931F92CDB7DEB7C2
:101F90008C01FC018485958597FF0EC0CE010196CA
:101FA0000E94040F019719F4298130E002C02FEF3D
:101FB0003FEFF80135872487F801848595850F90D8
:101FC000DF91CF911F910F910895FC018485958534
:101FD00097FD0BC09FB7F89482E08093E900809151
:101FE000F2009FBF90E0019608959FB7F89482E0B9
:101FF0008093E9008091F2009FBF90E008950895DA
:1020000080E090E008950E94AE218F929F92AF925F
:10201000BF92CF92DF92EF92FF920F931F93CF93D5
:10202000DF935C016B017A0180910B01882309F435
:102030005BC08091D407882309F456C08091D207F1
:1020400080FF05C08091E00082608093E000E7019E
:1020500010E00AEF83E0882E9AE3992E2097D9F1B9
:102060000E942E0F81110AC0015009F43DC061E0A9
:1020700070E080E090E00E94240BF0CF282F30E049
:10208000C217D3070CF48C2F4FB7F8948092E90055
:102090009091E80095FF1DC0282F30E0C21BD30BA4
:1020A000F601982F915020F081918093F100FACFA2
:1020B000C20ED31E112319F09092E80009C080913E
:1020C000E80085FD06C09092E80011E0209709F035
:1020D00010E04FBFC3CF1111C3CF5D9884E680934A
:1020E000D5071E141F0444F081E090E0F5019383AE
:1020F000828380E090E001C0C701DF91CF911F9102
:102100000F91FF90EF90DF90CF90BF90AF909F9096
:102110008F900895CF92DF92EF92FF920F931F93CB
:10212000CF93DF931F92CDB7DEB7182F062FE42E83
:10213000862F880F8E5F99830E94C21383E00E94CE
:10214000C213F12EC12E9981D92E8C2D8F19801793
:1021500098F4F601E7FE02C0849101C080810E94DC
:10216000C213182F80E00E94C2138123FFEFCF1A01
:10217000DF0A8111EACF01C081E00F90DF91CF919A
:102180001F910F91FF90EF90DF90CF900895DF9215
:10219000EF92FF920F931F93CF93DF93D82E8A0174
:1021A0007B01E40EF51EEB01CE15DF0571F0D7FEC5
:1021B00003C0FE01849101C088810E94C213219650
:1021C0008111F2CF8FEF9FEF01C0C801DF91CF9156
:1021D0001F910F91FF90EF90DF9008950F931F9341
:1021E000CF93DF931F92CDB7DEB782E0898342E4BD
:1021F00050E062E375E180E80E94C7100E946A0F18
:10220000DC0112960D911C9113970115110569F0CF
:10221000D801ED91FC910280F381E02DBE016F5F4A
:102220007F4FC801099597FF07C089810F90DF9103
:10223000CF911F910F910895F80100851185E5CF89
:102240001F920F920FB60F9211248F939F9380913C
:10225000E1009091E100937F9093E10083FF0FC034
:102260001092E90091E09093EB001092EC0092E361
:102270009093ED001092D40798E09093F00082FFC5
:1022800020C093E09093E9009091F200992319F017
:102290009AE39093E8009091D507992339F09091B3
:1022A000D50791509093D507992389F19091D30741
:1022B000992339F09091D30791509093D3079923A4
:1022C00041F184FF10C08091E2008E7E8160809396
:1022D000E2008091E1008F7E8093E1008091D2073F
:1022E0008E7E806111C080FF16C08091E2008E7EDC
:1022F00080618093E2008091E1008E7E8093E10016
:102300008091D2078E7E81608093D20704C05D9A4F
:10231000CDCF289AD6CF9F918F910F900FBE0F905F
:102320001F9018951F920F920FB60F921124CF9203
:10233000DF92EF92FF920F931F932F933F934F9350
:102340005F936F937F938F939F93AF93BF93EF931D
:10235000FF93CF93DF93CDB7DEB76C97DEBFCDBFD2
:102360001092E9008091E80083FFEDC168E0CE01A2
:1023700045960E94F01382EF8093E8008D8987FFD5
:1023800005C09091E80090FFFCCF03C09EEF9093B2
:10239000E800982F907609F0C6C09E892F89188D85
:1023A00091110CC0803829F48091D1078093F100FD
:1023B00002C01092F1001092F10048C1422F50E08B
:1023C000512B913051F4811141C14130510509F037
:1023D0003DC18091D1078D7F0BC0933061F4811195
:1023E00035C14130510509F031C18091D10782607A
:1023F0008093D1072BC1953041F48091E80080FF94
:10240000FCCF20682093E30021C1963009F05FC023
:10241000EB8CFC8C1092E9001092CF071092CE0743
:10242000123091F51092CD071092CC070E94EE1059
:1024300099E0BE016F5F7F4FDB01E92F1D92EA95A6
:10244000E9F799831A8391E09E8390EA98879AEF3F
:1024500099872091CE073091CF07275F3F4F3C836C
:102460002B838D831092E9001092CF071092CE0734
:10247000F092CD07E092CC0749E050E080E00E9466
:10248000C7100E94EE10E2C0F092CD07E092CC0798
:102490000E946A0FDC011296ED90FC901397E114F4
:1024A000F10409F4C0C0D701ED91FC910480F581DD
:1024B000E02DBE016B5E7F4FC7010995009719F0B3
:1024C0000CF0C4C0C7C0F701E084F184E8CF9730B6
:1024D00009F4C0C0983021F481E08093F100B6C0C7
:1024E000993009F0B3C0837009F0B4C0EDE0F1E0B9
:1024F00081E021E036E39081992361F08093E90047
:102500002093EB0091919093EC003093ED008F5F5E
:10251000873089F78EE78093EA001092EA008F896E
:102520008093D40793C08B8D9C8D1092E9001092FC
:10253000CF071092CE079093CD078093CC07898D5B
:10254000811156C08E899D89913A59F4813209F0E2
:1025500081C047E050E064E071E080E00E94C71075
:1025600075C0913209F076C0833289F4888D90E08D
:10257000982F88272F89822BA0E0B0E0809300015C
:1025800090930101A0930201B09303015FC08032D8
:1025900069F48091E80082FFFCCF67E084E091E07D
:1025A0000E94F0138BEF8093E80006C0823209F09E
:1025B0004DC08F8980930B018091D007882319F03B
:1025C000EEEFFAE002C0E0E0F8E0809104019091C3
:1025D0000501A0910601B0910701803B9440A1053F
:1025E000B10509F07BC080910B0180FF93C076C0DC
:1025F0000E946A0FDC0112960D911C911397011530
:10260000110541F1D801ED91FC910190F081E02D8F
:10261000BE016B5E7F4FC8010995811117C0F8019B
:1026200000851185ECCF113009F44EC0133091F4C0
:102630008F89882309F445C0823081F440E860E145
:1026400086E995E10E948A10882321F08EEF80931D
:10265000E80079C081E28093EB0075C0813029F4F5
:1026600040E86BE08AE895E1EDCF833099F70E946E
:102670006A0FDC011296ED90FC9013978E010F5FAC
:102680001F4F6801E114F10479F0D701ED91FC913D
:102690000680F781E02DB801C7010995080F111DCB
:1026A000F701E084F184EECFD8011C92F60101908D
:1026B0000020E9F73197BF016C197D0940E0C601A0
:1026C000C1CF64E775E102C068E775E16115710586
:1026D00009F2FB01449150E080E840CF0FB6F89436
:1026E000A8958091600088618093600010926000DE
:1026F0000FBEA895EE3F2AE0F20739F08091FE0A5E
:102700009091FF0A91838083A1CF1092FF0A1092CB
:10271000FE0A9CCFEE3F8AE0F80731F0808191817C
:102720009093FF0A8093FE0A87E797E7918380835F
:102730009BE088E10FB6F894A895809360000FBEE7
:102740009093600083CF6C960FB6F894DEBF0FBEF7
:10275000CDBFDF91CF91FF91EF91BF91AF919F914D
:102760008F917F916F915F914F913F912F911F9129
:102770000F91FF90EF90DF90CF900F900FBE0F90D2
:102780001F9018954091CE075091CF072091CC070C
:102790003091CD0742175307B4F49091E80095703B
:1027A000E1F39091E80092FD19C08093F1008091CF
:1027B000CE079091CF0701968F739927892B19F433
:1027C0008EEF8093E8008091CE079091CF0701961D
:1027D0009093CF078093CE0781E0089580E008951D
:1027E000615030F02091F100FC0120830196F8CF78
:1027F000289884E68093D3070895CF93DF9300D081
:1028000000D01F92CDB7DEB7789484B5826084BDC6
:1028100084B5816084BD85B5826085BD85B58160E4
:1028200085BD80916E00816080936E001092810062
:10283000809181008260809381008091810081601D
:1028400080938100809180008160809380008091DE
:1028500091008260809391008091910081608093CB
:102860009100809190008160809390008091C100E0
:1028700084608093C1008091C10082608093C10018
:102880008091C10081608093C1008091C30081600C
:102890008093C3008091C00082608093C0008091CB
:1028A000C20081608093C20080917A00846080932E
:1028B0007A0080917A00826080937A0080917A0019
:1028C000816080937A0080917A00806880937A009A
:1028D0001092D4071092D1071092D2078091D7009E
:1028E00081608093D70080EA8093D80089B58061A9
:1028F00089BD89B5826089BD09B400FEFDCF61E064
:1029000070E080E090E00E94240B8091D8008F7CE2
:1029100080618093D8008091E000807F8093E00008
:102920008091E1008E7E8093E1008DE08093E20053
:10293000559A209AEEEFFFE7859194918B3F9C4D3D
:1029400019F481E08093D00785B1806F85B9249810
:1029500084B1866E84B95E9A5F988AB1806D8AB9B7
:10296000769A6E9881B3806F81BB899880B38D70A1
:1029700080BB80E58CBD81E08DBD65E070E080E0CE
:1029800090E00E94240B5F9A65E070E080E090E0A8
:102990000E94240B5E985C9874E2E72E71E0F72E9B
:1029A0001DE01E0DF70184910E94A80BFFEFEF1AA6
:1029B000FF0A1E11F7CF5C9A01E014E001501109E3
:1029C00021F08AEA0E94A80BF9CF5C9881E20E946C
:1029D000A80B80E10E94A80B8FE60E94A80B82E260
:1029E0000E94A80B80E00E94A80B87E00E94A80B21
:1029F0005C9A2FB7F894609126017091270180911D
:102A00002801909129012FBF40E052E0EBEAF4E069
:102A1000DF018A011D9201501040E1F720E831E00A
:102A2000EBE2F3E0DF0189011D9201501040E1F774
:102A3000EBE2F1E0DF018A011D9201501040E1F765
:102A400040E051E0E7EBF6E0DF018A011D92015022
:102A50001040E1F72FE72093BD061FEF1093030707
:102A600002E00093B8061092B2061092B1061092DE
:102A7000B0061092AF061092AE061092AD061092FC
:102A8000AC061092AB061092B6061092B5065093A3
:102A9000B4064093B30620E22093BB0427E12093C1
:102AA000BC04FF24F394F092BD04F092BE04F092B3
:102AB000BF0427E02093C20421EE2093C304F092C8
:102AC000C404F092C504F092C60428EE33E040E05E
:102AD00050E00E9486212093C8041093DC0480E813
:102AE0008093BF0661E88EE091E00E94D70C1092BF
:102AF000B70710922A011092C6071092C5071092CC
:102B0000C0071092BF07F092C40681E391E0909352
:102B1000BD078093BC071092BB071092BA070093C1
:102B2000DC0660E182E891E00E94D70C1092DC069E
:102B300060E887E291E00E94D70CCC24C394D12CAA
:102B400050EA452E5FE0552E66246394712C009167
:102B5000BC071091BD07E090BA07F090BB07F801E1
:102B6000EE0DFF1D2491B7016F5F7F4F7093BB0780
:102B70006093BA07822F8F70843048F4823008F057
:102B800044C3882341F0813009F441C1F1C5883044
:102B900008F423C4EDC5E22FF0E034E0F595E795A5
:102BA0003A95E1F73197EF30F10510F00C943C1DA8
:102BB000EA5AFF4F0C94A82182E0860F0E94C10EB2
:102BC0008091BA079091BB070296892F0E94C10E8F
:102BD0008091BA079091BB07F801E80FF91F349173
:102BE0000196F801E80FF91F2491830F911DE22F40
:102BF000F0E0FE2FEE27E80FF91FF093BB07E093FC
:102C0000BA073CC182E0860F0E94C10E8091BA07CC
:102C10009091BB070296892F0E94C10E8091BA073E
:102C20009091BB07F801E80FF91F2491FC01319640
:102C3000E00FF11FE491F0E0F22B63C62091B9069A
:102C40008091B70690E0982F88273091BA06832BA1
:102C5000289F7001299FF00C11248091B8068B7772
:102C60008093B806E092BA066F2D80E091E00E9452
:102C7000D70CC701FF0CAA0BBB0BB093B9062AC037
:102C80006091B90670E08091BA066115710541F056
:102C90002091B70690E0922B0E9472217C0105C022
:102CA000682F70E07F6FE12CF12C8091B8068B7754
:102CB000E114F10411F494E001C090E0892B8093B9
:102CC000B8066093BA06672F80E091E00E94D70CA7
:102CD000E092B90687E0D1C6E091BC06F0E0FE2F95
:102CE000EE278091BB06E80FF11D5AC222E0E20EEA
:102CF000F11CF092BB07E092BA07F801E60FF71F4C
:102D0000849190E023C10E942D0EE091BA07F091CA
:102D1000BB079F012F5F3F4F3093BB072093BA073C
:102D2000E00FF11FE491682F8E2F90E0A0C2209158
:102D3000B706C70102962111F9C3F801E60FF71F84
:102D4000249127FF16C6E491EE2ED9C22091B70632
:102D5000C7010296222309F4E9C3F801E60FF71F21
:102D6000249127FF06C6E491EE2EF12CFA9404C6B6
:102D70000E942D0EE82EF12CFE2CEE240E942D0E2A
:102D8000E82AFCC50E942D0EE82EF12CFE2CEE2424
:102D90000E942D0EE82AF092BB07E092BA078091BC
:102DA000C5079091C60701979093C6078093C50702
:102DB00061C66091B70660FB679567F9D4C48091DE
:102DC000B70690E06091B806262F80FB27F9209384
:102DD000B8069595879560780BC06091B706962FD9
:102DE0009078892F90E0880F892F881F990B660FA4
:102DF000682BB9C46091B7068091B806262F207859
:102E0000982F9F77922B9093B8068078EBCFE22F84
:102E1000F0E044E0F595E7954A95E1F73197EF301A
:102E2000F10520F4EB59FF4F0C94A821F801E60FAF
:102E3000F71F849187FF04C0E491F0E0FA9502C087
:102E4000E491F0E052E0E50EF11CEE0DFF1D59C5D6
:102E5000F801E60FF71F949162E0E60EF11CF8010D
:102E6000EE0DFF1DE491E90EF11CF0E0FE2FEE27C0
:102E7000EE0EFF1EF092BB07E092BA0784E0FDC59C
:102E8000F801E60FF71F8491F7013296E00FF11F6A
:102E9000E491F0E0F82B35C52091B70630E0409181
:102EA000B8064F77F801E60FF71F849190E02817D6
:102EB000390714F080E001C080E8482B4093B80641
:102EC000A7014E5F5F4FE491F0E0C70103962E1714
:102ED0003F0709F02BC3F801E40FF51F249127FFEA
:102EE00048C5E490F12CFA9447C52091B70630E02C
:102EF0004091B8064F77F801E60FF71F849190E0F4
:102F00002817390714F080E001C080E8482B40936F
:102F1000B806A7014E5F5F4FE491F0E0C70103964A
:102F20002E173F0709F402C3F801E40FF51FBBC2D7
:102F3000B2E0EB0EF11CF092BB07E092BA07F80189
:102F4000E60FF71FE4918E2F90E091600E944E0EE5
:102F50000E94C10E8FC50E942D0EE091BA07F0911C
:102F6000BB079F012F5F3F4F3093BB072093BA07EA
:102F7000E00FF11FE491F0E0682FCF01916077C17D
:102F80003090B706A32CB12CE2E0EE0EF11CF092CB
:102F9000BB07E092BA07F801E60FF71F2490E22C76
:102FA000F12C622D630D80E091E00E94D70C2091FE
:102FB000B8062B73C5018E0D9F1D8F3F910509F03B
:102FC00014F430E001C030E8232B332D3F70422D44
:102FD0004F7050E0430F511D4031510514F430E063
:102FE00001C030E4232BA094B094AE24BF24F0E8B9
:102FF000AF22BB24E826F926AE20BF20AB2811F46F
:1030000080E001C084E0282B2093B80635C53090BD
:10301000B706A32CB12C22E0E20EF11CF092BB0704
:10302000E092BA07F801E60FF71F2490E22CF12C8A
:103030002091B806221F2227221F622F630D620DE6
:1030400080E091E02D830E94D70C8091B8068B73AD
:103050002D8130E0A5014E0D5F1D420F531F4F3FE4
:10306000510509F014F490E001C090E8892B932DEC
:103070009F70E22DEF70F0E0E90FF11DE20FF31FFA
:10308000709714F490E001C090E4892BA094B09460
:10309000AE24BF2430E8A322BB24E426F526AE20CC
:1030A000BF20AB2809F08DC28AC2B090B70642E0BB
:1030B000E40EF11CF092BB07E092BA07F801E60FAC
:1030C000F71FF4906B2D6F1980E091E00E94D70CF0
:1030D0008091B8068B732B2D30E02F19310937FD05
:1030E00002C020E001C020E8282B8B2D8F7090E0DB
:1030F0003F2D3F70831B9109991F9927991F929526
:10310000990F990F907C822F08C3B090B70652E0B8
:10311000E50EF11CF092BB07E092BA07F801E60F4A
:10312000F71FF4904091B806E42EEE1CEE24EE1C3E
:103130006B2D6F196E1980E091E00E94D70C809181
:10314000B8068B734E2D50E02B2D30E02F1931092E
:10315000241B350B37FD02C090E001C090E8892B9D
:103160002B2D2F7030E09F2D9F70291B3109241BC0
:10317000350B932F991F9927991F9295990F990FA6
:10318000907CCBC28091B706E091BB06F0E0E80FDF
:10319000F11D8091BC0690E0982F8827E80FF91F59
:1031A000E00FF11F649180E091E00E94D70C62C4AF
:1031B0009091B70682E0E80EF11CF092BB07E09216
:1031C000BA07F801E60FF71F6491692BCCC2909102
:1031D000B706A2E0EA0EF11CF092BB07E092BA0734
:1031E000F801E60FF71F64916923BDC29091B706FD
:1031F000B2E0EB0EF11CF092BB07E092BA07F801C7
:10320000E60FF71F64916927AEC25701E2E0AE0EE8
:10321000B11CB092BB07A092BA07F801E60FF71FE6
:10322000E491822F8170982E812C14012E2AE22F96
:10323000F0E084E0F595E7958A95E1F73197EF3076
:10324000F10520F4EC58FF4F0C94A821C101F2C005
:103250006091B7066EC0F3E0EF0EF11CF092BB0771
:10326000E092BA07F801EA0DFB1D6491C1010E94CA
:103270003B0E00C4C1010E944E0E282F30E0409149
:10328000B70650E08091B8068F774217530714F0C5
:1032900090E001C090E8892B8093B806C70103969F
:1032A0004217530709F042C1F801EA0DFB1D2491B2
:1032B00027FF5FC3E490F12CFA945EC3C1010E9422
:1032C0004E0E282F30E04091B70650E08091B806AE
:1032D0008F774217530714F090E001C090E8892BD4
:1032E0008093B806C70103964217530709F41EC11D
:1032F000F801EA0DFB1D249127FF3BC3E490F12C5C
:10330000FA943AC3C1010E94CE0E01977C01FF24BA
:103310006E2DC1010E943B0E8091BA079091BB07B0
:10332000EF2809F402C1DEC2C1010E94CE0E61E0A5
:10333000680FC1019CC3C1010E94CE0E6FEFF8CF90
:10334000C1010E944E0EB82EE82EF12CA090B706B7
:103350002A2C312C682F6A0D80E091E00E94D70C56
:103360008091B8068B7391012E0D3F1D2F3F3105C3
:1033700009F014F450E001C050E8582B4A2D4F706A
:103380008B2D8F7090E0840F911D409714F480E096
:1033900001C080E4852B209430942E243F2440E803
:1033A0002422332406C1C1010FC1C1015EC1C10184
:1033B0007FC1C1010E944E0EF82E6091B706C10177
:1033C000B7C1F090B706C101BAC1F090B706C1010C
:1033D000BEC1F090B706C101C2C18091B80690E0AD
:1033E000959587958C709927322F3370832B2D8379
:1033F00069837C830E944E0E90E02D8169817C81DF
:1034000021FD03C040E050E002C040E051E05A011D
:10341000A82AB92AE22FF0E0A4E0F595E795AA954D
:10342000E1F73197EF30F10520F4ED57FF4F0C94A1
:10343000A821C5010E944E0E682F95C16091B70664
:1034400084C082E0E80EF11CF092BB07E092BA075C
:10345000F801E60FF71F649178C0C50169837C838A
:103460000E944E0E482F50E097012E5F3F4F69811A
:103470007C81F801E60FF71FE491F0E08091B80637
:103480008F774E175F0714F090E001C090E8892B0A
:103490008093B806C7010396E417F50709F046C004
:1034A000F801E20FF31F249127FF63C2E490F12C8F
:1034B000FA9462C2C50169837C830E944E0E482F34
:1034C00050E097012E5F3F4F69817C81F801E60F44
:1034D000F71FE491F0E08091B8068F774E175F07F1
:1034E00014F090E001C090E8892B8093B806C701E2
:1034F0000396E417F507D1F0F801E20FF31F6BC252
:10350000C5010E94CE0E01977C01FF246E2DC501DE
:103510000E943B0E8091BA079091BB07EF2829F0DB
:10352000E091BC07F091BD07DEC101969093BB0707
:103530008093BA079FC2C5010E94CE0E61E004C00D
:10354000C5010E94CE0E6FEF680FC50190C2C50184
:103550000E944E0EB82EE82EF12CA090B7062A2C11
:10356000312C682F6A0D80E091E00E94D70C809189
:10357000B8068B7391012E0D3F1D2F3F310509F0C9
:1035800014F450E001C050E8582B4A2D4F708B2D99
:103590008F7090E0840F911D409714F480E001C07B
:1035A00080E4852B209430942E243F24E0E82E22C2
:1035B0003324E226F326E220F320EF2811F490E0F2
:1035C000ACC094E0AAC0C5010E944E0EA82EE82E01
:1035D000F12CB090B7062B2D30E03B832A8320914D
:1035E000B806322E331C3324331C632D6B0D680F49
:1035F00080E091E00E94D70C6091B8066B73232D98
:1036000030E04A815B814E0D5F1D420F531F4F3FDB
:10361000510509F014F480E001C080E8682B7B2D8F
:103620007F708A2D8F7090E0870F911D280F391FB2
:103630002031310514F480E001C080E4682B8A81D8
:103640009B81809590958E259F2580789927E426EB
:10365000F5268E219F21892B11F480E001C084E0A2
:10366000682B6093B80608C2C5010E944E0EF82E62
:10367000E090B7066E2D681B80E091E00E94D70CA9
:103680008091B8068B732E2D30E02F19310937FD4C
:1036900002C040E001C040E8482B2E2D2F7030E0E2
:1036A0008F2D8F70B901681B7109CB012EC0C50128
:1036B0000E944E0EE82EB090B7066091B806F62E26
:1036C000FF1CFF24FF1C6B2D681B6F1980E091E02D
:1036D0000E94D70C8091B8068B736F2D70E02B2D54
:1036E00030E02E193109261B370B37FD02C040E0B0
:1036F00001C040E8482B2B2D2F7030E08E2D8F70AD
:10370000281B3109261B370B932F991F9927991FC7
:103710009295990F990F907C842F892B8093B806EE
:10372000ABC1C5010E944E0EF82E6091B706C501CF
:103730000E943B0E6F2D17C0F090B706C5010E9486
:103740004E0E682F6F290FC0F090B706C5010E947A
:103750004E0E682F6F2107C0F090B706C5010E947A
:103760004E0E682F6F2580E091E00E94D70C84C137
:10377000822F807E803609F4CDC088F5803209F42E
:103780005EC0803409F479C0811176C1C701029608
:103790009093BB078093BA07F801E60FF71FE491F7
:1037A000922F9071A92EB12CB694BA2CAA24B7945A
:1037B000A7942770B22AAE2A0E94C10E8091BB073F
:1037C0000E94C10E8091BA079091BB078827907F15
:1037D000A82AB92AB092BB07A092BA074BC1803A77
:1037E00009F400C120F4803809F4CDC045C1803C03
:1037F00009F41AC1803E09F03FC132E0E30EF11C2A
:10380000F092BB07E092BA07F801E60FF71FE491C8
:10381000822F807190E074E0880F991F7A95E1F70C
:103820007C01EE2AC7012D830E94CE0E2D812770C8
:10383000B60101C0660F2A95EAF7682B17C1F80197
:10384000E60FF71FE491422F407150E05695542F38
:103850004427579547952770CA01922B9C012E2B20
:1038600092E0E90EF11CEE24A0EFFA222E293F2966
:103870003093BB072093BA07FDC0C701029690930F
:10388000BB078093BA07F801E60FF71FE491822F78
:10389000807190E044E0880F991F4A95E1F75C0140
:1038A000AE2AC5012D830E944E0E2D812770482F10
:1038B00050E0022E02C0559547950A94E2F740FF6A
:1038C00025C0F60102C0EE0FFF1F2A95E2F79F0107
:1038D0002095682F6223C5010E943B0E8091BA0794
:1038E0009091BB07F801E80FF91F249127FF04C04E
:1038F000E491F0E0FA9502C0E491F0E00196E80F5F
:10390000F91FF093BB07E093BA07B4C0F3E0EF0EE2
:10391000F11C34C0570132E0A30EB11CB092BB07BA
:10392000A092BA07F801E60FF71FE491822F807189
:1039300090E034E0880F991F3A95E1F78E2B2D83A4
:103940000E944E0E90E02D812770AC0102C055956B
:1039500047952A95E2F7C701039640FFE7CDF801A6
:10396000EA0DFB1D249127FF04C0E490F12CFA948A
:1039700003C0E491EE2EF12CE80EF91EF092BB0785
:10398000E092BA0777C0570182E0A80EB11CB0924E
:10399000BB07A092BA07F801E60FF71FE491822F48
:1039A000807190E0B4E0880F991FBA95E1F78E2BF3
:1039B0002D830E944E0E90E02D812770DC0102C005
:1039C000B595A7952A95E2F7C7010396A0FDAECD60
:1039D000F801EA0DFB1D249127FFCBCFE490F12CD9
:1039E000FA94CACFE2E0EE0EF11CF092BB07E0922F
:1039F000BA07F801E60FF71FE491822F807190E07B
:103A0000A4E0880F991FAA95E1F77C01EE2AC7016F
:103A10002D830E94CE0E2D812770B60101C0660F46
:103A20002A95EAF7682722C0F2E0EF0EF11CF09227
:103A3000BB07E092BA07F801E60FF71FE491822F67
:103A4000807190E0F4E0880F991FFA95E1F77C010E
:103A5000EE2AC7012D830E94CE0E2D812770B6015C
:103A600001C0660F2A95EAF760956823C7010E9496
:103A70003B0E02C082E001C081E0482F50E05B8332
:103A80004A83E090C307F090C407E40EF51EF0925D
:103A9000C407E092C307A090B807B090B907EA1432
:103AA000FB0408F4CDC08091B70781110E94AE0BD2
:103AB0004FB12CB193B130E020953095207433276D
:103AC00053E0359527955A95E1F7892F90E0809539
:103AD0009095807199279595879595958795822BD7
:103AE0004095407F382E342A8091BE0737FE0AC0A9
:103AF00080FD11C081608093BE0780E090E00E944D
:103B0000F00E09C080FF07C08E7F8093BE0780E063
:103B100090E00E94DD0E8091BE0734FE0AC081FD58
:103B200011C082608093BE0781E090E00E94F00E99
:103B300009C081FF07C08D7F8093BE0781E090E0C0
:103B40000E94DD0E8091BE0735FE0AC082FD11C0C5
:103B500084608093BE0782E090E00E94F00E09C06E
:103B600082FF07C08B7F8093BE0782E090E00E94B7
:103B7000DD0E8091BE0736FE0AC083FD11C088604D
:103B80008093BE0783E090E00E94F00E09C083FF9F
:103B900007C0877F8093BE0783E090E00E94DD0E20
:103BA0008091BE0733FE0AC084FD11C080618093FE
:103BB000BE0784E090E00E94F00E09C084FF07C0B9
:103BC0008F7E8093BE0784E090E00E94DD0E80919E
:103BD000BE0732FE0AC085FD11C080628093BE0719
:103BE00085E090E00E94F00E09C085FF07C08F7D40
:103BF0008093BE0785E090E00E94DD0EEA18FB0886
:103C0000F092C407E092C3078091C1079091C20768
:103C10009C012F5F3F4F3093C2072093C10722338F
:103C2000310570F02091BF073091C00728603093B4
:103C3000C0072093BF07C1979093C2078093C10725
:103C4000E091C7068E2F807CA1F18091B5069091FE
:103C5000B6066A817B81860F971F9093B606809384
:103C6000B5062091B3063091B4068217930708F188
:103C700040E050E04F5F5F4F821B930B821793072A
:103C8000C8F79093B6068093B5068E2F807E803E4F
:103C900009F095C28091B1069091B206480F591F64
:103CA0004F3F510511F008F03FC25093B2064093C8
:103CB000B1066091CF06862F807C09F4CDC0862F97
:103CC000807E803E09F05CC08091AD069091AE068A
:103CD0002A813B81820F931F8F3F910509F028F4C1
:103CE0009093AE068093AD06B7C0AC015A95509341
:103CF000AE064093AD068091AB069091AC069C0158
:103D00002F5F3F4F2F3F310509F028F43093AC0669
:103D10002093AB06A1C08F5F91099093AC0680936E
:103D2000AB062091D20630E0420F531F4F3F5105A2
:103D300009F028F45093AE064093AD061AC05A9588
:103D40005093AE064093AD064091D40650E0840FE8
:103D5000951F9093AC068093AB068F3F910549F079
:103D600040F03093AE062093AD065093AC064093DE
:103D7000AB06862F8A608093CF0662FF6DC063C05A
:103D800066FF33C08091AD069091AE064A815B819B
:103D9000840F951F9093AE068093AD068F3F9105DB
:103DA00021F118F12091D20630E0A9015A95840F33
:103DB000951F8F3F910509F028F49093AE068093EC
:103DC000AD0604C03093AE062093AD06862F826008
:103DD0008093CF0660FF09C08091BF079091C00714
:103DE00080629093C0078093BF074091CF0647FF42
:103DF00033C08091AB069091AC066A817B81680FDD
:103E0000791F7093AC066093AB066F3F710521F18B
:103E100018F18091D40690E09C013A95260F371F47
:103E20002F3F310509F028F43093AC062093AB0600
:103E300004C09093AC068093AB06842F8860809377
:103E4000CF0642FF09C08091BF079091C0078062F2
:103E50009093C0078093BF078091C40680FD0DC179
:103E60008091BA079091BB07803151E0950739F1F5
:103E700024F48115914059F0F2C08032A1E09A07F4
:103E800009F445C08033914009F461C0E8C08091D5
:103E9000290690E0982F882720912A06822B8130CE
:103EA00094412CF460E080E091E00E94D70C6FEF29
:103EB00080E091E00E94D70C85E091E0D2C0809133
:103EC000290690E0982F882720912A06822B20E04F
:103ED00030E0AC014427B901680F791FFA01E62BE5
:103EE000E00FF11F6491D901A55DB94F7C9167275F
:103EF00039F42F5F3F4F2038310569F760E070E0FB
:103F000080E091E00E94D70C85E191E0AAC0809109
:103F1000290690E0982F882720912A06822B20E0FE
:103F200030E0AC014427B901680F791FFA01E62B94
:103F3000E00FF11FE491D901A55DB94FEC932F5F1C
:103F40003F4F2038310579F785E291E08AC09091A2
:103F5000C90481E089278093C90480FD7DC08091D8
:103F6000C8048F5F8C3318F48093C80475C0109216
:103F7000C8048091C7048F5F8C3318F48093C70402
:103F80006BC01092C7048091C6048F5F883118F40B
:103F90008093C60461C01092C604E091C504EF5F2F
:103FA000E093C5044091C404423049F52091C20415
:103FB00030E0322F22278091C304282BC90183705F
:103FC0009927892B41F5C901B2010E945E21892BF5
:103FD00001F1C90168EE73E00E945E21892BD9F0DE
:103FE000C90160E971E00E945E21892B91F0C9014D
:103FF00064E670E00E945E21892B69F00AC0842F7C
:104000008170483018F0811108C009C0811107C0C3
:1040100004C08DE105C08CE103C08EE101C08FE1D9
:104020008E17D0F491E09093C50481E0840F8093C3
:10403000C4048D3088F09093C4048091C3048F3FF2
:1040400041F41092C3048091C2048F5F8093C20434
:1040500003C08F5F8093C30489E391E002C080E0D6
:1040600090E09093BB078093BA07892B09F452C064
:104070008091C40681608093C40680910507837097
:10408000833079F48091C5079091C607892B49F454
:104090008091BF079091C00792609093C007809372
:1040A000BF078091BF079091C007009799F12091B9
:1040B000C5073091C607232B69F52091BF0627FF5E
:1040C00029C020E030E0A601022E02C0440F551F97
:1040D0000A94E2F748235923452BE1F42F5F3F4F21
:1040E0002A30310581F79B7F9093C0078093BF07EB
:1040F0008091BA070E94C10E8091BB070E94C10E39
:104100007092C6076092C50703E510E01093BB07E5
:104110000093BA0720E030E0232B11F40C94A7158C
:104120000E9400000C94A715CA019A959093B206BC
:104130008093B1062091AF063091B006A9014F5F80
:104140005F4F4F3F510509F028F45093B00640935C
:10415000AF06AFCD2F5F31093093B0062093AF0685
:104160006091CA0670E0860F971F8F3F910509F096
:1041700028F49093B2068093B1061AC09A95909352
:10418000B2068093B1068091CC0690E0280F391FCB
:104190003093B0062093AF062F3F310549F040F031
:1041A0007093B2066093B1069093B0068093AF0609
:1041B0008E2F8A608093C706E2FF7BCD60C0E6FF4A
:1041C00031C02091B1063091B206240F351F3093D3
:1041D000B2062093B1062F3F310521F118F18091ED
:1041E000CA0690E0BC017A95260F371F2F3F310594
:1041F00009F028F43093B2062093B10604C09093DE
:10420000B2068093B1068E2F82608093C706E0FFCE
:1042100009C08091BF079091C00784609093C00748
:104220008093BF076091C70667FF43CD8091AF06BB
:104230009091B006480F591F5093B0064093AF06B7
:104240004F3F510509F008F434CD2091CC0630E001
:10425000C9019A95480F591F4F3F510509F028F49D
:104260005093B0064093AF0604C03093B00620933D
:10427000AF06862F88608093C70662FF1ACD8091B3
:10428000BF079091C00780619093C0078093BF07DC
:1042900010CDE6EDF7E01382128288EE93E0A0E005
:1042A000B0E084839583A683B78387E191E091830F
:1042B00080838FEF9FEF958784870895AA1BBB1B90
:1042C00051E107C0AA1FBB1FA617B70710F0A61B16
:1042D000B70B881F991F5A95A9F780959095BC0137
:1042E000CD01089597FB072E16F4009407D077FDB3
:1042F00009D00E945E2107FC05D03EF4909581957F
:104300009F4F0895709561957F4F0895A1E21A2EF1
:10431000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F69
:10432000A217B307E407F50720F0A21BB30BE40BB9
:10433000F50B661F771F881F991F1A9469F7609500
:104340007095809590959B01AC01BD01CF010895BA
:10435000EE0FFF1F0590F491E02D099481E090E0AD
:0A436000F8940C94B321F894FFCFF9
:10436A00FFFFFFFF00E100000000000000C18081A4
:10437A00000000000000007E0F05109F0F940FE55B
:06438A000FA30FC10F009C
:00000001FF
// SpaceInvaders - game by Rednuht
// 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;
void run_cpu()
{
// 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, 0x4, 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]*/ 0x53, 0x50, 0x41, 0x43, 0x45, 0x20, 0x49, 0x4e, 0x56, 0x41, 0x44, 0x45, 0x52, 0x53, 0x20, 0x20,
/*[210]*/ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6a, 0x75, 0x6d, 0x70, 0x73,
/*[220]*/ 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x63, 0x6f, 0x2e, 0x75, 0x6b, 0x20, 0x20, 0x20, 0x20,
/*[230]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[240]*/ 0x1, 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]*/ 0xe8, 0xff, 0xda, 0xff, 0xab, 0xfe, 0x18, 0xf9, 0x19, 0xf4, 0x19, 0xf1, 0x19, 0xf0, 0x5c, 0xf9,
/*[270]*/ 0xcb, 0xff, 0x9c, 0xff, 0x7d, 0xfb, 0xdc, 0xff, 0x5e, 0xf5, 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, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[2a0]*/ 0x0, 0x0, 0x0, 0x0, 0x22, 0x33, 0x34, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[2b0]*/ 0x0, 0x0, 0x0, 0x23, 0x34, 0x55, 0x66, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[2c0]*/ 0x0, 0x0, 0x2, 0x36, 0x66, 0x66, 0x66, 0x53, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[2d0]*/ 0x0, 0x0, 0x1, 0x36, 0x66, 0x66, 0x66, 0x65, 0x33, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[2e0]*/ 0x0, 0x0, 0x0, 0x36, 0x66, 0x66, 0x54, 0x56, 0x56, 0x63, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[2f0]*/ 0x0, 0x0, 0x23, 0x46, 0x54, 0x43, 0x33, 0x34, 0x66, 0x64, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[300]*/ 0x0, 0x3, 0x44, 0x56, 0x43, 0x20, 0x0, 0x24, 0x66, 0x65, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[310]*/ 0x0, 0x24, 0x66, 0x64, 0x30, 0x0, 0x1, 0x74, 0x65, 0x44, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[320]*/ 0x0, 0x13, 0x66, 0x65, 0x32, 0x23, 0x33, 0x46, 0x63, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[330]*/ 0x0, 0x3, 0x66, 0x66, 0x64, 0x45, 0x66, 0x66, 0x42, 0x0, 0x0, 0x0, 0x8, 0x9a, 0xb0, 0x0,
/*[340]*/ 0x0, 0x3, 0x44, 0x34, 0x66, 0x66, 0x66, 0x66, 0x42, 0x12, 0x20, 0xa, 0x7c, 0xcc, 0xa0, 0x0,
/*[350]*/ 0x0, 0x0, 0x22, 0x27, 0x46, 0x66, 0x66, 0x66, 0x43, 0x34, 0x43, 0x8c, 0xcc, 0xcc, 0xc9, 0x99,
/*[360]*/ 0x0, 0x0, 0x0, 0x2, 0x36, 0x66, 0x65, 0x44, 0x66, 0x66, 0x63, 0xc, 0xcc, 0xc7, 0xcc, 0xc7,
/*[370]*/ 0x0, 0x0, 0x2, 0x33, 0x66, 0x43, 0x33, 0x32, 0x35, 0x66, 0x63, 0x2c, 0xa9, 0xb0, 0x9c, 0xcc,
/*[380]*/ 0x0, 0x0, 0x3, 0x45, 0x65, 0x32, 0x0, 0x0, 0x34, 0x66, 0x64, 0x2c, 0x90, 0xb, 0xac, 0x7a,
/*[390]*/ 0x0, 0x0, 0x34, 0x66, 0x64, 0x20, 0x0, 0x0, 0x24, 0x54, 0x43, 0xcc, 0x7a, 0x7c, 0xcc, 0xb0,
/*[3a0]*/ 0x0, 0x0, 0x24, 0x66, 0x64, 0x30, 0x0, 0x0, 0x2, 0x33, 0x22, 0xaa, 0xcc, 0xcc, 0xcc, 0x99,
/*[3b0]*/ 0x0, 0x0, 0x23, 0x66, 0x64, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xcc, 0xcc, 0xcc,
/*[3c0]*/ 0x0, 0x0, 0x3, 0x43, 0x33, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9a, 0xc7, 0x99, 0xb9, 0xcc,
/*[3d0]*/ 0x0, 0x0, 0x7c, 0xcc, 0xa2, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xcc, 0xc9, 0x0, 0x0, 0xcc,
/*[3e0]*/ 0x0, 0x2, 0xc7, 0xaa, 0xcc, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xc2, 0x0, 0x0, 0x9,
/*[3f0]*/ 0x0, 0x2c, 0xc8, 0x8, 0x7c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa7, 0x7b, 0x0, 0x0, 0x0,
/*[400]*/ 0x0, 0x8c, 0xc7, 0x7c, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[410]*/ 0x0, 0xb, 0x2c, 0xcc, 0xca, 0xab, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[420]*/ 0x0, 0x8, 0xac, 0xa2, 0x9c, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[430]*/ 0x0, 0xa, 0xc7, 0x0, 0xa, 0xab, 0x0, 0xa2, 0x70, 0x0, 0x0, 0x0, 0xac, 0xca, 0xa0, 0x0,
/*[440]*/ 0x0, 0x2, 0x7a, 0x0, 0x0, 0x0, 0x0, 0xaa, 0xc0, 0x0, 0x0, 0x8, 0x7a, 0x27, 0x70, 0x0,
/*[450]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0xb0, 0x0, 0x0, 0xa, 0xca, 0xac, 0x20, 0x0,
/*[460]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xc7, 0x72, 0x0,
/*[470]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaa, 0x8b, 0xaa, 0x0,
/*[480]*/ 0x23, 0xe, 0xa1, 0x23, 0x20, 0x9, 0x23, 0x27, 0x80, 0xd8, 0x4e, 0xdf, 0x44, 0x23, 0x4c, 0xff,
/*[490]*/ 0xd9, 0x1, 0x2, 0x1d, 0xf9, 0x1, 0x98, 0x0, 0x5, 0x22, 0x6f, 0xff, 0x1, 0x3, 0x22, 0x6f,
/*[4a0]*/ 0x0, 0x22, 0x31, 0x2, 0x22, 0x23, 0x28, 0x22, 0x38, 0x0, 0x22, 0x6e, 0x0, 0x19, 0x3f, 0xf,
/*[4b0]*/ 0x19, 0xc, 0xfd, 0xf, 0x87, 0xe, 0x25, 0x20, 0x13, 0x25, 0x9c, 0x0, 0x3a, 0x20, 0x13, 0x25,
/*[4c0]*/ 0x9d, 0x0, 0x30, 0x20, 0x13, 0x25, 0x9a, 0x0, 0x19, 0x20, 0x13, 0x25, 0x9b, 0x0, 0x2, 0x1,
/*[4d0]*/ 0xe0, 0x2, 0x2f, 0x31, 0x2a, 0xdb, 0x20, 0x9, 0xed, 0x63, 0x0, 0x12, 0x2f, 0x20, 0x9, 0xed,
/*[4e0]*/ 0x1, 0x19, 0x2, 0x2f, 0x31, 0x0, 0xca, 0x20, 0x9, 0xed, 0x73, 0x0, 0x12, 0x2f, 0x20, 0x9,
/*[4f0]*/ 0xed, 0x1, 0x8, 0xe, 0x28, 0x1, 0xcc, 0xe, 0x7b, 0x1, 0xc2, 0x1, 0xb4, 0xdd, 0xe, 0x61,
/*[500]*/ 0x0, 0x61, 0x2, 0x61, 0x3, 0x60, 0x2, 0x61, 0x25, 0x61, 0x63, 0x61, 0x64, 0x61, 0x65, 0xfc,
/*[510]*/ 0x63, 0x23, 0x64, 0x80, 0x22, 0x2, 0x80, 0xf3, 0x0, 0x13, 0x25, 0xd8, 0x65, 0x3, 0x66, 0x16,
/*[520]*/ 0x3, 0x64, 0x90, 0x11, 0x22, 0x2, 0x80, 0x23, 0x64, 0x80, 0xf8, 0x65, 0x98, 0x25, 0x2, 0x1,
/*[530]*/ 0x8, 0xf8, 0x25, 0x1, 0xe8, 0x62, 0x2, 0x1, 0xe4, 0x71, 0x65, 0x71, 0x64, 0x71, 0x63, 0x71,
/*[540]*/ 0x25, 0x70, 0x2, 0x71, 0x3, 0x71, 0x2, 0x71, 0x0, 0xfd, 0xe, 0xa0, 0xdd, 0xe, 0x61, 0x0,
/*[550]*/ 0x61, 0x2, 0x61, 0x3, 0xfc, 0x63, 0x23, 0x64, 0x80, 0xf3, 0x0, 0x13, 0x65, 0x13, 0x2, 0x23,
/*[560]*/ 0x3, 0x81, 0x2, 0x6f, 0x13, 0x66, 0x73, 0x3, 0x3, 0x3, 0x90, 0xf, 0x23, 0x3, 0x81, 0x23,
/*[570]*/ 0x64, 0x80, 0xf8, 0x65, 0x63, 0x2, 0x3, 0x2, 0x31, 0x2, 0x2, 0x1, 0xe5, 0x71, 0x3, 0x71,
/*[580]*/ 0x2, 0x71, 0x0, 0xdc, 0x63, 0xfd, 0xe, 0xa0, 0x22, 0x0, 0x4c, 0x13, 0x2, 0x2, 0x5f, 0xa1,
/*[590]*/ 0x4, 0x12, 0x6b, 0x3, 0x2, 0x80, 0xa, 0x2, 0x0, 0x81, 0x6, 0x12, 0x0, 0x73, 0x2, 0x1,
/*[5a0]*/ 0xf2, 0x22, 0x2d, 0x6, 0x4, 0x7f, 0x0, 0x42, 0x9e, 0x0, 0x5, 0x22, 0x6d, 0x4, 0x1, 0x3,
/*[5b0]*/ 0x22, 0x6d, 0x0, 0xe1, 0x3f, 0x12, 0x6c, 0x73, 0x0, 0x32, 0x5e, 0x11, 0x63, 0x0, 0x32, 0x5e,
/*[5c0]*/ 0xc, 0x63, 0x0, 0x32, 0x5e, 0x7, 0x63, 0x0, 0x32, 0x5e, 0x2, 0x1, 0x1d, 0x4, 0xd1, 0x80,
/*[5d0]*/ 0xe1, 0x80, 0x14, 0xe, 0x91, 0x62, 0x32, 0x22, 0x60, 0x0, 0x72, 0x6e, 0x2, 0x6e, 0x90, 0x2,
/*[5e0]*/ 0x2f, 0x19, 0x2, 0x21, 0x80, 0x9, 0x72, 0x21, 0x1, 0x5, 0x62, 0x0, 0x52, 0x2d, 0xb5, 0xa0,
/*[5f0]*/ 0xdd, 0xe, 0x2, 0x60, 0x80, 0x2c, 0xe, 0xd6, 0x22, 0x1, 0x3b, 0x22, 0x29, 0x2, 0x5, 0x81,
/*[600]*/ 0x4, 0x42, 0x5f, 0x8, 0x2, 0x29, 0xd, 0x88, 0x2, 0x60, 0x80, 0x16, 0x72, 0x29, 0x72, 0x1,
/*[610]*/ 0x2, 0x1, 0x41, 0x38, 0xe9, 0x2, 0x5f, 0x80, 0x6, 0x72, 0x5f, 0xe, 0xd6, 0x1, 0x3, 0x22,
/*[620]*/ 0x60, 0x0, 0xfd, 0xe, 0xa0, 0xd, 0xf0, 0xa0, 0x23, 0x4, 0x33, 0x23, 0x5, 0x12, 0x1b, 0xfc,
/*[630]*/ 0xdd, 0xe, 0x1a, 0xda, 0xfd, 0xe, 0xc, 0xfd, 0x20, 0x13, 0x25, 0x9c, 0x0, 0xfa, 0x20, 0x13,
/*[640]*/ 0x25, 0x9d, 0x0, 0xfa, 0x20, 0x13, 0x25, 0x9d, 0x0, 0x5, 0x9c, 0x0, 0x18, 0x1, 0xf5, 0x23,
/*[650]*/ 0x4, 0x63, 0x23, 0x5, 0xc, 0x1b, 0x91, 0xc, 0xfd, 0x22, 0x25, 0xff, 0x1a, 0x88, 0x2, 0x25,
/*[660]*/ 0x9d, 0x0, 0xf6, 0x1, 0xc3, 0x2, 0x2f, 0x31, 0xff, 0x10, 0xd, 0x4c, 0x19, 0xed, 0xdd, 0xe,
/*[670]*/ 0x18, 0xae, 0xfd, 0xe, 0x2, 0x60, 0x80, 0x2, 0xe, 0xd6, 0xa0, 0x2, 0x60, 0x90, 0x11, 0x22,
/*[680]*/ 0x60, 0x1, 0x2, 0x2f, 0x81, 0x1, 0x12, 0x5e, 0x2, 0x2e, 0x81, 0x1, 0x12, 0x5f, 0xe, 0xd6,
/*[690]*/ 0xa0, 0x61, 0x0, 0x61, 0x2, 0x61, 0x3, 0x22, 0x2d, 0x0, 0x2, 0x6b, 0x82, 0x2d, 0x1a, 0x74,
/*[6a0]*/ 0x13, 0x64, 0x23, 0x4, 0x4c, 0x23, 0x5, 0xc, 0x2, 0x2d, 0x82, 0x6d, 0xc1, 0x13, 0x2, 0x2,
/*[6b0]*/ 0x6c, 0x1a, 0x3c, 0x83, 0x64, 0x13, 0x64, 0x3, 0x2, 0xf3, 0x66, 0x13, 0x66, 0x3, 0x3, 0x80,
/*[6c0]*/ 0x6, 0x63, 0x64, 0xf3, 0x66, 0x13, 0x66, 0x23, 0x0, 0x4, 0x62, 0x2d, 0x42, 0x2d, 0xcb, 0x71,
/*[6d0]*/ 0x3, 0x71, 0x2, 0x71, 0x0, 0xa0, 0x61, 0x0, 0x61, 0x2, 0x61, 0x3, 0x22, 0x2d, 0x0, 0x2,
/*[6e0]*/ 0x5f, 0x82, 0x2d, 0x1a, 0x74, 0x13, 0x64, 0x23, 0x4, 0x60, 0x23, 0x5, 0xc, 0x2, 0x2d, 0xc1,
/*[6f0]*/ 0x13, 0x2, 0x2, 0x5e, 0x1a, 0x3c, 0x83, 0x64, 0x13, 0x64, 0x3, 0x2, 0xf3, 0x66, 0x13, 0x66,
/*[700]*/ 0x3, 0x3, 0x80, 0x6, 0x63, 0x64, 0xf3, 0x66, 0x13, 0x66, 0x23, 0x0, 0x3, 0x62, 0x2d, 0x42,
/*[710]*/ 0x2d, 0xcd, 0x71, 0x3, 0x71, 0x2, 0x71, 0x0, 0xa0, 0x2, 0x6e, 0x90, 0x2, 0x62, 0x38, 0x2,
/*[720]*/ 0x38, 0x31, 0x1, 0x6, 0x2, 0x6e, 0x90, 0xa, 0xe, 0x28, 0x2, 0x23, 0x80, 0x6, 0xa1, 0x8,
/*[730]*/ 0x12, 0x23, 0x2, 0x23, 0x12, 0x21, 0x12, 0x24, 0x22, 0x2f, 0x17, 0x22, 0x30, 0x4, 0x22, 0x2e,
/*[740]*/ 0x1c, 0x22, 0x60, 0x0, 0x22, 0x1, 0x39, 0x25, 0x4, 0x62, 0x1, 0x25, 0x9, 0x62, 0x1, 0x25,
/*[750]*/ 0xe, 0x22, 0x27, 0x0, 0x2, 0x6e, 0x90, 0x24, 0x22, 0x1, 0x4c, 0x22, 0x6e, 0x12, 0x23, 0x2,
/*[760]*/ 0xb, 0x23, 0x3, 0x0, 0xf3, 0x0, 0x18, 0x76, 0x23, 0x2, 0xb, 0x23, 0x3, 0x40, 0xf3, 0x0,
/*[770]*/ 0x18, 0x76, 0x23, 0x2, 0xb, 0x23, 0x3, 0x0, 0xf3, 0x0, 0x18, 0x76, 0xdd, 0xe, 0xd, 0x4c,
/*[780]*/ 0x19, 0xed, 0x18, 0xae, 0xfd, 0xe, 0xa0, 0x2, 0x24, 0x80, 0x4, 0x72, 0x24, 0x1, 0x1a, 0x2,
/*[790]*/ 0x21, 0x12, 0x24, 0xdd, 0xe, 0x18, 0xae, 0x18, 0x8b, 0x2, 0x27, 0x90, 0x4, 0xf, 0xfb, 0x1,
/*[7a0]*/ 0x2, 0x18, 0x38, 0x18, 0xae, 0xf, 0xaa, 0xfd, 0xe, 0xa0, 0x61, 0x0, 0x61, 0x2, 0x61, 0x3,
/*[7b0]*/ 0x22, 0x1, 0x5e, 0x23, 0x2, 0x3, 0x73, 0x2, 0x23, 0x3, 0x6, 0x72, 0x1, 0x5, 0x9f, 0x0,
/*[7c0]*/ 0xf, 0x73, 0x3, 0x3, 0x3, 0x90, 0x2, 0x1, 0xed, 0x2, 0x1, 0x41, 0x4c, 0xed, 0x1, 0x24,
/*[7d0]*/ 0x22, 0x1, 0x39, 0x3, 0x2, 0x82, 0x1, 0x12, 0x1, 0x5, 0x41, 0x19, 0x17, 0x2, 0x31, 0x90,
/*[7e0]*/ 0xf, 0x22, 0x2f, 0xff, 0x19, 0xb0, 0xe, 0x28, 0x71, 0x3, 0x71, 0x2, 0x71, 0x0, 0x2c, 0xa1,
/*[7f0]*/ 0x72, 0x31, 0xf, 0x19, 0x71, 0x3, 0x71, 0x2, 0x71, 0x0, 0xa0, 0x22, 0x2c, 0xff, 0x22, 0x1,
/*[800]*/ 0x4c, 0x5, 0xe1, 0xbf, 0x7f, 0x0, 0x8, 0x32, 0x2c, 0x0, 0x9f, 0x1, 0x2, 0x12, 0x2c, 0x62,
/*[810]*/ 0x1, 0x2, 0x1, 0x41, 0x5e, 0xeb, 0x2, 0x2c, 0x90, 0xe, 0x22, 0x1, 0x39, 0x65, 0x62, 0x1,
/*[820]*/ 0x65, 0x62, 0x1, 0x65, 0x62, 0x27, 0x1, 0xf, 0x22, 0x1, 0x4c, 0x5, 0x7f, 0x0, 0x1, 0x75,
/*[830]*/ 0x62, 0x1, 0x2, 0x1, 0x41, 0x5e, 0xf4, 0xa0, 0x22, 0x2c, 0x0, 0x22, 0x1, 0x4c, 0x5, 0xe1,
/*[840]*/ 0xbf, 0x7f, 0x0, 0x8, 0x32, 0x2c, 0x0, 0x7f, 0x1, 0x2, 0x12, 0x2c, 0x62, 0x1, 0x2, 0x1,
/*[850]*/ 0x41, 0x5e, 0xeb, 0x2, 0x2c, 0x41, 0x2c, 0xe, 0x22, 0x1, 0x39, 0x65, 0x62, 0x1, 0x65, 0x62,
/*[860]*/ 0x1, 0x65, 0x72, 0x27, 0x1, 0xf, 0x22, 0x1, 0x4c, 0x5, 0x7f, 0x0, 0x1, 0x65, 0x62, 0x1,
/*[870]*/ 0x2, 0x1, 0x41, 0x5e, 0xf4, 0xa0, 0x31, 0x6, 0x11, 0xc3, 0x2, 0xf3, 0x3, 0x15, 0xf3, 0x3,
/*[880]*/ 0x81, 0x6, 0xc3, 0x2, 0x62, 0x1, 0x63, 0x0, 0x1, 0xec, 0xa0, 0x60, 0x1, 0x61, 0x0, 0x61,
/*[890]*/ 0x2, 0x22, 0x1, 0x4c, 0xf3, 0x0, 0x31, 0x12, 0xe, 0x13, 0x2, 0x5, 0xf1, 0x40, 0x15, 0x3,
/*[8a0]*/ 0x2, 0x62, 0x1, 0x63, 0x0, 0x1, 0xef, 0x71, 0x2, 0x71, 0x0, 0x70, 0x1, 0xa0, 0x61, 0x0,
/*[8b0]*/ 0x60, 0x1, 0x61, 0x2, 0x61, 0x3, 0x22, 0x2c, 0x0, 0x22, 0x26, 0x0, 0x2, 0x2c, 0x31, 0x3,
/*[8c0]*/ 0x75, 0x22, 0x1, 0x39, 0x82, 0x1, 0x12, 0x1, 0x5, 0x12, 0x2a, 0x22, 0x2d, 0x0, 0x2, 0x2d,
/*[8d0]*/ 0x31, 0x4, 0x59, 0x2, 0x2a, 0x1a, 0x74, 0x12, 0x29, 0x22, 0x2b, 0x0, 0x2, 0x2b, 0x31, 0x6,
/*[8e0]*/ 0x45, 0x22, 0x1, 0x4c, 0x82, 0x1, 0x82, 0x26, 0x12, 0x1, 0x5, 0x7f, 0x0, 0x34, 0x5e, 0x0,
/*[8f0]*/ 0x5, 0x22, 0x28, 0x0, 0x1, 0x3, 0x22, 0x28, 0x4, 0x13, 0x3, 0xf3, 0x0, 0x23, 0x4, 0x4c,
/*[900]*/ 0x23, 0x5, 0xc, 0x82, 0x28, 0x82, 0x2d, 0xc1, 0x13, 0x2, 0x3, 0x3, 0x1a, 0x3c, 0x82, 0x29,
/*[910]*/ 0x13, 0x64, 0x3, 0x2, 0xf3, 0x66, 0x13, 0x66, 0x3, 0x3, 0x80, 0x6, 0x63, 0x64, 0xf3, 0x66,
/*[920]*/ 0x13, 0x66, 0x62, 0x2b, 0x1, 0xb6, 0x62, 0x2a, 0x62, 0x2d, 0x1, 0xa2, 0x2, 0x26, 0x81, 0x6,
/*[930]*/ 0x12, 0x26, 0x62, 0x2c, 0x1, 0x86, 0x71, 0x3, 0x71, 0x2, 0x70, 0x1, 0x71, 0x0, 0xa0, 0x20,
/*[940]*/ 0x13, 0x25, 0x9c, 0x0, 0xfa, 0x23, 0x4, 0xe7, 0x23, 0x5, 0xc, 0x1b, 0xfc, 0xc, 0xfd, 0x1a,
/*[950]*/ 0x88, 0x1a, 0x88, 0x1a, 0x88, 0x1a, 0x88, 0x23, 0x2, 0x5, 0x23, 0x4, 0x63, 0x23, 0x5, 0xc,
/*[960]*/ 0x1b, 0x91, 0xc, 0xfd, 0x22, 0x25, 0xff, 0x1a, 0x88, 0x2, 0x25, 0x9c, 0x0, 0x41, 0x23, 0x4,
/*[970]*/ 0xe7, 0x23, 0x5, 0xc, 0x1b, 0xfc, 0xc, 0xfd, 0x22, 0x25, 0xff, 0x1a, 0x88, 0x2, 0x25, 0x9c,
/*[980]*/ 0x0, 0x2d, 0x73, 0x2, 0x3, 0x2, 0x80, 0x2, 0x1, 0xd0, 0x23, 0x4, 0xe7, 0x23, 0x5, 0xc,
/*[990]*/ 0x1a, 0xaa, 0x20, 0x13, 0x25, 0x9c, 0x0, 0x17, 0x1b, 0xfc, 0xc, 0xfd, 0x3, 0x4, 0x81, 0x6,
/*[9a0]*/ 0x13, 0x4, 0x3, 0x5, 0x91, 0x0, 0x13, 0x5, 0x41, 0x10, 0xe5, 0x1a, 0x88, 0x1, 0x90, 0xa0,
/*[9b0]*/ 0x23, 0x4, 0x73, 0x23, 0x5, 0x11, 0x1b, 0xfc, 0xc, 0xfd, 0x1a, 0x88, 0x1a, 0x88, 0x1a, 0x88,
/*[9c0]*/ 0x1a, 0x88, 0x23, 0x4, 0x63, 0x23, 0x5, 0xc, 0x1b, 0x91, 0xc, 0xfd, 0x22, 0x25, 0xff, 0x1a,
/*[9d0]*/ 0x88, 0x2, 0x25, 0x9c, 0x0, 0x16, 0x23, 0x4, 0x73, 0x23, 0x5, 0x11, 0x1b, 0xfc, 0xc, 0xfd,
/*[9e0]*/ 0x22, 0x25, 0xff, 0x1a, 0x88, 0x2, 0x25, 0x9c, 0x0, 0x2, 0x1, 0xd6, 0xa0, 0x61, 0x0, 0x61,
/*[9f0]*/ 0x2, 0x61, 0x3, 0xdd, 0xe, 0x22, 0x2d, 0x0, 0x2, 0x31, 0xe0, 0x83, 0x0, 0x12, 0x2c, 0x2,
/*[a00]*/ 0x2e, 0x82, 0x2d, 0x1a, 0x74, 0x13, 0x64, 0x23, 0x4, 0x40, 0x23, 0x5, 0xc, 0x2, 0x2d, 0x82,
/*[a10]*/ 0x2c, 0xc1, 0x13, 0x2, 0x2, 0x2f, 0x1a, 0x3c, 0x83, 0x64, 0x13, 0x64, 0x3, 0x2, 0xf3, 0x66,
/*[a20]*/ 0x13, 0x66, 0x3, 0x3, 0x80, 0x6, 0x63, 0x64, 0xf3, 0x66, 0x13, 0x66, 0x2, 0x30, 0x62, 0x2d,
/*[a30]*/ 0x42, 0x2d, 0xc5, 0xfd, 0xe, 0x71, 0x3, 0x71, 0x2, 0x71, 0x0, 0xa0, 0x61, 0x2, 0x13, 0x2,
/*[a40]*/ 0xdf, 0x1, 0xd0, 0xdf, 0x1, 0xd0, 0xdf, 0x1, 0xd0, 0x13, 0x3, 0xdf, 0x1, 0xf0, 0xdf, 0x1,
/*[a50]*/ 0xf0, 0xdf, 0x1, 0xf0, 0xc3, 0x2, 0xa3, 0x2, 0x71, 0x2, 0x61, 0x3, 0x23, 0x3, 0x0, 0x80,
/*[a60]*/ 0x10, 0xc3, 0x2, 0xdf, 0x1, 0xd0, 0xc3, 0x3, 0xd0, 0xc3, 0x3, 0xc3, 0x2, 0x73, 0x0, 0x1,
/*[a70]*/ 0xee, 0x71, 0x0, 0xa0, 0xe0, 0xe0, 0xe0, 0x9b, 0x0, 0x2, 0xa1, 0x2, 0x23, 0x65, 0x0, 0x9f,
/*[a80]*/ 0x0, 0x3, 0x23, 0x65, 0xff, 0xd1, 0x80, 0xa0, 0x61, 0x0, 0x23, 0x0, 0x4, 0x1a, 0x92, 0x71,
/*[a90]*/ 0x0, 0xa0, 0x61, 0x2, 0x1a, 0xaa, 0x13, 0x2, 0x2, 0x25, 0x41, 0xff, 0x5, 0x20, 0x13, 0x25,
/*[aa0]*/ 0x12, 0x25, 0x3, 0x2, 0x53, 0x0, 0xed, 0x71, 0x2, 0xa0, 0x61, 0x0, 0x23, 0x0, 0xff, 0x53,
/*[ab0]*/ 0x0, 0xfd, 0x71, 0x0, 0xa0, 0x23, 0x3, 0x0, 0xa3, 0x2, 0x7f, 0x1, 0x4, 0x63, 0x3, 0x1,
/*[ac0]*/ 0xf7, 0x83, 0x2, 0xa0, 0x61, 0x2, 0x23, 0x2, 0x0, 0x80, 0xa, 0xc3, 0x2, 0x81, 0x5, 0xc3,
/*[ad0]*/ 0x2, 0x73, 0x0, 0x1, 0xf4, 0xc3, 0x2, 0x71, 0x2, 0xa0, 0x2, 0x38, 0x23, 0x2, 0xa, 0x1a,
/*[ae0]*/ 0xb5, 0xc3, 0x3, 0x1a, 0xc4, 0x12, 0x1e, 0xc3, 0x3, 0x22, 0x20, 0x23, 0x22, 0x1f, 0x4, 0x1b,
/*[af0]*/ 0x48, 0x23, 0x2, 0x1, 0x1a, 0xb5, 0xc3, 0x3, 0x1a, 0xc4, 0x12, 0x1e, 0xc3, 0x3, 0x22, 0x20,
/*[b00]*/ 0x29, 0x22, 0x1f, 0x4, 0x1b, 0x48, 0x2, 0x32, 0x23, 0x2, 0x64, 0x1a, 0xb5, 0xc3, 0x3, 0x1a,
/*[b10]*/ 0xc4, 0x12, 0x1e, 0xc3, 0x3, 0x22, 0x20, 0xe, 0x22, 0x1f, 0x18, 0x1b, 0x48, 0x23, 0x2, 0xa,
/*[b20]*/ 0x1a, 0xb5, 0xc3, 0x3, 0x1a, 0xc4, 0x12, 0x1e, 0xc3, 0x3, 0x22, 0x20, 0x14, 0x22, 0x1f, 0x18,
/*[b30]*/ 0x1b, 0x48, 0x23, 0x2, 0x1, 0x1a, 0xb5, 0xc3, 0x3, 0x1a, 0xc4, 0x12, 0x1e, 0xc3, 0x3, 0x22,
/*[b40]*/ 0x20, 0x1a, 0x22, 0x1f, 0x18, 0x1b, 0x48, 0xa0, 0x61, 0x0, 0x61, 0x2, 0x61, 0x3, 0x60, 0x2d,
/*[b50]*/ 0x22, 0x2d, 0x0, 0x2, 0x1f, 0x82, 0x2d, 0x1a, 0x74, 0x13, 0x64, 0x23, 0x4, 0xf3, 0x23, 0x5,
/*[b60]*/ 0x12, 0x2, 0x2d, 0x82, 0x1e, 0xc1, 0x13, 0x2, 0x2, 0x20, 0x1a, 0x3c, 0x83, 0x64, 0x13, 0x64,
/*[b70]*/ 0x3, 0x2, 0xf3, 0x66, 0x13, 0x66, 0x3, 0x3, 0x80, 0x6, 0x63, 0x64, 0xf3, 0x66, 0x13, 0x66,
/*[b80]*/ 0x23, 0x0, 0x5, 0x62, 0x2d, 0x42, 0x2d, 0xcb, 0x70, 0x2d, 0x71, 0x3, 0x71, 0x2, 0x71, 0x0,
/*[b90]*/ 0xa0, 0x61, 0x63, 0xdc, 0x63, 0xdd, 0xe, 0x61, 0x0, 0x61, 0x3, 0x23, 0x64, 0xd0, 0xf3, 0x0,
/*[ba0]*/ 0x13, 0x65, 0x13, 0x3, 0xc1, 0xe3, 0x66, 0x13, 0x66, 0x63, 0x64, 0x3, 0x64, 0xe1, 0xf, 0x41,
/*[bb0]*/ 0xc, 0xe, 0x3, 0x64, 0x81, 0x4, 0x13, 0x64, 0x90, 0x6, 0x23, 0x65, 0xff, 0x23, 0x64, 0x80,
/*[bc0]*/ 0x63, 0x3, 0x3, 0x3, 0x41, 0x42, 0xdd, 0x23, 0x64, 0xd0, 0xf3, 0x0, 0x13, 0x65, 0x3, 0x3,
/*[bd0]*/ 0xc1, 0xd3, 0x66, 0x13, 0x66, 0x63, 0x64, 0x3, 0x64, 0xe1, 0xf, 0x41, 0xc, 0xe, 0x3, 0x64,
/*[be0]*/ 0x81, 0x4, 0x13, 0x64, 0x90, 0x6, 0x23, 0x65, 0xff, 0x23, 0x64, 0x80, 0x63, 0x3, 0x3, 0x3,
/*[bf0]*/ 0x41, 0x84, 0xdd, 0x71, 0x3, 0x71, 0x0, 0xfd, 0xe, 0x71, 0x63, 0xa0, 0x61, 0x63, 0xdc, 0x63,
/*[c00]*/ 0xdd, 0xe, 0x61, 0x0, 0x61, 0x65, 0x61, 0x3, 0x61, 0x64, 0x23, 0x64, 0x80, 0xf3, 0x0, 0xd8,
/*[c10]*/ 0x65, 0x13, 0x3, 0xc1, 0x13, 0x66, 0x63, 0x64, 0x3, 0x64, 0xe1, 0xf, 0x41, 0xc, 0xd, 0x3,
/*[c20]*/ 0x64, 0x81, 0x4, 0x13, 0x64, 0x90, 0x5, 0xf8, 0x65, 0x23, 0x64, 0x80, 0x63, 0x3, 0x3, 0x3,
/*[c30]*/ 0x41, 0xc0, 0xe0, 0x71, 0x64, 0x71, 0x3, 0x71, 0x65, 0x71, 0x0, 0xfd, 0xe, 0x71, 0x63, 0xa0,
/*[c40]*/ 0x20, 0x50, 0x88, 0x50, 0x20, 0x50, 0xd8, 0x88, 0x20, 0x70, 0xf8, 0xa8, 0x60, 0xb0, 0x60, 0x90,
/*[c50]*/ 0x60, 0xd0, 0x60, 0x60, 0x7c, 0xe2, 0x7c, 0x7c, 0xb2, 0x7c, 0x7c, 0x9a, 0x7c, 0x7c, 0x8e, 0x7c,
/*[c60]*/ 0x40, 0x40, 0xa0, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8,
/*[c70]*/ 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0,
/*[c80]*/ 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0,
/*[c90]*/ 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0,
/*[ca0]*/ 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff,
/*[cb0]*/ 0x80, 0x2, 0x0, 0x0, 0x0, 0x0, 0x40, 0x4, 0xf7, 0x3c, 0xe7, 0x3, 0x20, 0x4, 0x94, 0xa1,
/*[cc0]*/ 0x8, 0x4, 0xa0, 0x4, 0xf7, 0x38, 0xc6, 0x7, 0xa0, 0x4, 0x85, 0x20, 0x21, 0x4, 0xa0, 0x4,
/*[cd0]*/ 0x84, 0xbd, 0xce, 0x4, 0xa0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x20, 0x7, 0xff, 0xff, 0xff, 0xff,
/*[ce0]*/ 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
/*[cf0]*/ 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xff, 0xfb, 0xbf, 0xff, 0xe7, 0xfb, 0xff, 0xff, 0xff,
/*[d00]*/ 0xdf, 0xcd, 0xef, 0xfc, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xfd, 0xff, 0xff, 0xfe, 0x72, 0x7f, 0xcc,
/*[d10]*/ 0x3f, 0xff, 0xfc, 0xf8, 0xff, 0x9f, 0xbf, 0xef, 0xfd, 0xfc, 0xff, 0x87, 0x7f, 0xff, 0xfe, 0xef,
/*[d20]*/ 0xff, 0xe1, 0xff, 0xff, 0xe6, 0xf, 0xf9, 0xf3, 0xff, 0xfc, 0x29, 0xff, 0xe2, 0x5f, 0xff, 0xf9,
/*[d30]*/ 0xa0, 0xff, 0xf3, 0x6b, 0xff, 0xed, 0x37, 0xfc, 0xf9, 0x7f, 0xff, 0xdc, 0x77, 0xfd, 0x3c, 0x7f,
/*[d40]*/ 0xff, 0x9e, 0x77, 0xcd, 0x1e, 0xdd, 0xf7, 0x9f, 0xbf, 0xec, 0x5f, 0x87, 0xc7, 0xc7, 0x9e, 0xee,
/*[d50]*/ 0xfd, 0x97, 0x87, 0xf7, 0xfe, 0x36, 0x5f, 0x3f, 0x7, 0xf3, 0xf3, 0x97, 0x7b, 0xac, 0x7, 0xe7,
/*[d60]*/ 0xf9, 0xe3, 0xfe, 0xdc, 0x7, 0xff, 0xc, 0xff, 0xff, 0xf8, 0x27, 0xff, 0x30, 0x7f, 0xff, 0xe0,
/*[d70]*/ 0x27, 0xf7, 0x9f, 0x3f, 0xff, 0xc0, 0x27, 0xf3, 0xcf, 0xff, 0xff, 0x40, 0x27, 0xfb, 0xe7, 0xfb,
/*[d80]*/ 0xff, 0x83, 0xc7, 0xfd, 0xe7, 0xff, 0xff, 0x0, 0x7, 0xfc, 0xff, 0xff, 0xfe, 0x0, 0x7, 0xfe,
/*[d90]*/ 0x7f, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
/*[da0]*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[db0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[dc0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x40, 0x0,
/*[dd0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[de0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[df0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[e00]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x33, 0x9e,
/*[e10]*/ 0xe0, 0xe5, 0x0, 0x8, 0x49, 0x50, 0x50, 0x55, 0x0, 0x8, 0x49, 0x5c, 0x50, 0x62, 0x0, 0x8,
/*[e20]*/ 0x49, 0x50, 0x50, 0x52, 0x0, 0x7, 0x33, 0x9e, 0xe0, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[e30]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[e40]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[e50]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x77, 0x91, 0x45, 0x2f, 0x80, 0x9, 0x42, 0x59, 0x45, 0x22,
/*[e60]*/ 0x0, 0x9, 0x42, 0x59, 0x45, 0x22, 0x0, 0xe, 0x62, 0x55, 0x45, 0xe2, 0x0, 0xa, 0x42, 0x53,
/*[e70]*/ 0x45, 0x22, 0x0, 0x9, 0x42, 0x53, 0x45, 0x22, 0x0, 0x9, 0x77, 0x91, 0x39, 0x22, 0x0, 0x0,
/*[e80]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[e90]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[ea0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf,
/*[eb0]*/ 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[ec0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[ed0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[ee0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[ef0]*/ 0x0, 0x0, 0xf, 0x71, 0x91, 0x0, 0x0, 0x0, 0x8, 0x4a, 0x5b, 0x0, 0x0, 0x0, 0xe, 0x72,
/*[f00]*/ 0x55, 0x0, 0x0, 0x0, 0x8, 0x52, 0x51, 0x0, 0x0, 0x0, 0x8, 0x49, 0x91, 0x0, 0x0, 0x0,
/*[f10]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[f20]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[f30]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[f40]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[f50]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[f60]*/ 0x0, 0x0, 0x0, 0x4, 0x48, 0x91, 0x0, 0x0, 0x0, 0x4, 0x48, 0x91, 0x0, 0x0, 0x0, 0x4,
/*[f70]*/ 0x48, 0x91, 0x0, 0x0, 0x0, 0x5, 0x4a, 0x95, 0x30, 0x0, 0x0, 0x2, 0x85, 0xa, 0x30, 0x0,
/*[f80]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x29,
/*[f90]*/ 0x70, 0x0, 0x0, 0x0, 0x9, 0x2f, 0x48, 0x0, 0x0, 0x0, 0x9, 0x29, 0x70, 0x0, 0x0, 0x0,
/*[fa0]*/ 0x29, 0x29, 0x40, 0x0, 0x0, 0x0, 0x10, 0xc9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[fb0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x33, 0xde, 0x64, 0x80, 0x1, 0x2, 0x48,
/*[fc0]*/ 0x84, 0x96, 0x80, 0x0, 0xc2, 0x78, 0x84, 0x96, 0x80, 0x0, 0x22, 0x48, 0x84, 0x95, 0x98, 0x1,
/*[fd0]*/ 0xc2, 0x48, 0x9e, 0x64, 0x98, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[fe0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x98, 0x12, 0x90, 0x0, 0x0, 0x4,
/*[ff0]*/ 0x24, 0x12, 0xa0, 0x0, 0x0, 0x4, 0x24, 0x12, 0xc0, 0x0, 0x0, 0x4, 0x25, 0x92, 0xa0, 0x0,
/*[1000]*/ 0x0, 0x3, 0x99, 0x8c, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[1010]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[1020]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[1030]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0,
/*[1040]*/ 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0,
/*[1050]*/ 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc,
/*[1060]*/ 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0x0,
/*[1070]*/ 0xfb, 0xdf, 0xc0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf8, 0x0,
/*[1080]*/ 0x0, 0xf, 0xdf, 0xff, 0xff, 0x0, 0x0, 0x7f, 0xbf, 0xfd, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff,
/*[1090]*/ 0xff, 0xff, 0xff, 0x88, 0x89, 0xff, 0xf7, 0xff, 0xf7, 0xba, 0xab, 0xf3, 0xff, 0xfb, 0xff, 0x9a,
/*[10a0]*/ 0xa9, 0xff, 0xff, 0xff, 0xff, 0xba, 0xad, 0xff, 0xff, 0xff, 0xff, 0x88, 0xa9, 0xff, 0x7, 0xfe,
/*[10b0]*/ 0x1f, 0xff, 0xff, 0xfe, 0xdb, 0x0, 0xff, 0xff, 0xff, 0xff, 0x7, 0xfb, 0x8f, 0xff, 0xff, 0xff,
/*[10c0]*/ 0xff, 0xff, 0xfd, 0xf7, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
/*[10d0]*/ 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
/*[10e0]*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfb, 0xfd, 0xfe, 0xff, 0xff, 0xff,
/*[10f0]*/ 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
/*[1100]*/ 0xfb, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff,
/*[1110]*/ 0xff, 0x7f, 0xff, 0xd0, 0xbf, 0xff, 0xdf, 0xff, 0xbf, 0xb0, 0xdf, 0xbf, 0xff, 0xff, 0xff, 0xc9,
/*[1120]*/ 0x3f, 0xff, 0x6f, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdf, 0xff,
/*[1130]*/ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0x3f, 0xff, 0xf3, 0xff, 0xef, 0x77, 0x7f,
/*[1140]*/ 0xff, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff,
/*[1150]*/ 0xff, 0xff, 0x7e, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff,
/*[1160]*/ 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
/*[1170]*/ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
/*[1180]*/ 0x5f, 0xf9, 0x7f, 0xff, 0xfb, 0xff, 0xff, 0xf8, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0x1c, 0x3f, 0x7f,
/*[1190]*/ 0xff, 0xfb, 0xfc, 0xe, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x27, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf3,
/*[11a0]*/ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x7f, 0xe1, 0xfe, 0xbf, 0xcf,
/*[11b0]*/ 0x63, 0x3f, 0xcd, 0xff, 0xfb, 0xdf, 0x21, 0xef, 0xcc, 0x1f, 0xff, 0x9f, 0x9d, 0xff, 0xc8, 0xff,
/*[11c0]*/ 0xff, 0xb9, 0x9f, 0xff, 0xf3, 0xff, 0xff, 0xb1, 0x9f, 0xf9, 0xf1, 0xf0, 0x3f, 0xbd, 0xdf, 0xf3,
/*[11d0]*/ 0x78, 0xc0, 0xf, 0x9d, 0xff, 0xb8, 0x7f, 0x1, 0x3, 0xc9, 0xff, 0x9c, 0xde, 0x63, 0x1, 0xe3,
/*[11e0]*/ 0xff, 0xde, 0x1c, 0xc3, 0x0, 0xff, 0xfd, 0xef, 0x38, 0x82, 0x30, 0xff, 0xfc, 0x27, 0x39, 0x82,
/*[11f0]*/ 0x18, 0xff, 0x8f, 0x7, 0xf1, 0x0, 0x8, 0xff, 0x27, 0xe7, 0xf0, 0x0, 0x8, 0xfe, 0x77, 0xff,
/*[1200]*/ 0xe0, 0x2, 0x20, 0x7e, 0x77, 0xff, 0xe0, 0x10, 0x0, 0xff, 0x77, 0xff, 0xe0, 0x78, 0xc, 0xff,
/*[1210]*/ 0x8f, 0xfe, 0xec, 0x38, 0x4, 0xff, 0xfd, 0xff, 0xe0, 0x3a, 0x2, 0xfb, 0xff, 0xff, 0xe0, 0x18,
/*[1220]*/ 0x2, 0xff, 0xff, 0xff, 0xf0, 0x46, 0x0, 0xff, 0xff, 0xff, 0xf0, 0x73, 0x40, 0xff, 0xff, 0xff,
/*[1230]*/ 0xf8, 0x3f, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x80,
/*[1240]*/ 0x0, 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, 0x90, 0xf4, 0xbd, 0x1, 0x80,
/*[1250]*/ 0x1, 0x90, 0x84, 0xa1, 0x2, 0x40, 0x1, 0x90, 0xe4, 0xb9, 0x2, 0x40, 0x1, 0x90, 0x83, 0x21,
/*[1260]*/ 0x2, 0x40, 0x1, 0x9e, 0xf3, 0x3d, 0xe1, 0x80, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, 0x80,
/*[1270]*/ 0x0, 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0x80, 0x0, 0x0, 0x1,
/*[1280]*/ 0xf1, 0xf0, 0x7f, 0xff, 0xff, 0xfe, 0xf, 0x8f, 0x80, 0x0, 0x0, 0x1, 0xf1, 0x80, 0x0, 0x0,
/*[1290]*/ 0x0, 0x4, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0x73, 0x39, 0xe0, 0x4, 0x1, 0x90,
/*[12a0]*/ 0x84, 0xa5, 0x0, 0xe, 0x1, 0x8c, 0x84, 0xb9, 0xc3, 0xbf, 0xb9, 0x82, 0x84, 0xa9, 0x0, 0xe,
/*[12b0]*/ 0x1, 0x9c, 0x73, 0x25, 0xe0, 0x4, 0x1, 0x80, 0x0, 0x0, 0x0, 0x4, 0x1, 0x80, 0x0, 0x0,
/*[12c0]*/ 0x0, 0x0, 0x1, 0x80, 0x30, 0x0, 0x0, 0x30, 0x1, 0x80, 0x48, 0x0, 0x0, 0x48, 0x1, 0x80,
/*[12d0]*/ 0x48, 0x0, 0x0, 0x48, 0x1, 0x80, 0x48, 0x0, 0x0, 0x48, 0x1, 0x80, 0x30, 0x0, 0x0, 0x30,
/*[12e0]*/ 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7f, 0xff, 0xff,
/*[12f0]*/ 0xff, 0xff, 0xfe, 0x30, 0x48, 0x48, 0x48, 0x30, 0x10, 0x30, 0x10, 0x10, 0x38, 0x30, 0x48, 0x10,
/*[1300]*/ 0x20, 0x78, 0x70, 0x8, 0x38, 0x8, 0x70, 0x10, 0x20, 0x50, 0x78, 0x10, 0x78, 0x40, 0x70, 0x8,
/*[1310]*/ 0x70, 0x30, 0x40, 0x70, 0x48, 0x30, 0x78, 0x8, 0x10, 0x20, 0x20, 0x30, 0x48, 0x30, 0x48, 0x30,
/*[1320]*/ 0x30, 0x48, 0x38, 0x8, 0x30, 0x78, 0x5c, 0x9, 0x3, 0x4c, 0x9e, 0x0, 0x4, 0x9f, 0x0, 0x4,
/*[1330]*/ 0xa0, 0x21, 0x1, 0xf0, 0xf8, 0x7, 0x9f, 0x4c, 0xfb, 0x23, 0x27, 0x0, 0xf8, 0x7, 0x78, 0x5c,
/*[1340]*/ 0xf0, 0x7f, 0x4c, 0xf8, 0x23, 0x27, 0x80, 0xf8, 0x7, 0x9f, 0x4c, 0xfb, 0x1, 0xd7, 0x0, 0x0,
/*[1350]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[1360]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[1370]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[1380]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[1390]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[13a0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[13b0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[13c0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[13d0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[13e0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[13f0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[1400]*/ 0x0};
const int gamesize = sizeof(flash);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment