Skip to content

Instantly share code, notes, and snippets.

@felipemanga
Created December 5, 2017 11:36
Show Gist options
  • Save felipemanga/fe38feda23e09d660bab99411295b68e to your computer and use it in GitHub Desktop.
Save felipemanga/fe38feda23e09d660bab99411295b68e to your computer and use it in GitHub Desktop.
:100000000C94D5060C94FD060C94FD060C94FD068C
:100010000C94FD060C94FD060C94FD060C94FD0654
:100020000C94FD060C94FD060C94200D0C94920D7E
:100030000C94FD060C94FD060C94FD060C94FD0634
:100040000C94FD060C94FD060C94FD060C94FD0624
:100050000C94FD060C94FD060C94FD060C945E07B2
:100060000C94FD060C94FD060C94FD060C94FD0604
:100070000C94FD060C94FD060C94FD060C94FD06F4
:100080000C94FD060C94FD060C94FD060C94FD06E4
:100090000C94FD060C94FD060C94FD060C94FD06D4
:1000A0000C94FD060C94FD060C94FD06F6111C1232
:1000B00038125A12861290129D12B112C012D21228
:1000C000DC12F312F9120713141342135A136613B6
:1000D0008F134719B213C513DA1321146F149F1429
:1000E000DC14F21401151015421545155415781538
:1000F0009C15A515AC15B115E415E615E815EA151E
:10010000F215F615FA152F1632163E166B169116C5
:10011000A816AD16B416F016411764179E17A91746
:10012000B117B917D5F08D14A1C881CFD9F1AF207F
: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
:1003300000536E616B65202020202020202020208B
:1003400020207772697474656E20627920532E6C58
:100350006F636F636B406274696E7465726E65740F
:100360002E636F6D20000000000000000000000000
:100370000001000A00000000000000000000000072
:10038000000000000000000000000000000000006D
:100390000000F000FFF0F00FF0F0FFFFFA1FFFFF8A
:1003A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D
:1003B000FF44444444444444444444444444444442
:1003C00044444444444444444444444444444444ED
:1003D00044444444444444444444444444444444DD
:1003E00044444444444444444444444444444444CD
:1003F00044444444444444444444444444444444BD
:1004000044444444444444444444444444444444AC
:10041000444444444444444444444444444444449C
:10042000444444444444444444444444444444448C
:10043000444444444444444444444444444444447C
:10044000444444444444444444444444444444446C
:10045000444444444444444444444444444444445C
:10046000444444444444444444444444444444444C
:10047000444444444444444444444444444444443C
:10048000444444444444444444444444444444442C
:10049000444444444444444444444444444444441C
:1004A000444444444444444444444444444444440C
:1004B00044444444444444444444444444444444FC
:1004C00044444444444444444444444444444444EC
:1004D00044444444444444444444444444444444DC
:1004E00044444444444444444444444444444444CC
:1004F00044444444444444444444444444444444BC
:1005000044444444444444444444444444444444AB
:10051000444444444444444444444444444444449B
:10052000444444444444444444444444444444448B
:10053000444444444444444444444444444444447B
:10054000444444444444444444444444444444446B
:10055000444444444444444444444444444444445B
:10056000444444444444444444444444444444444B
:10057000444444444444444444444444444444443B
:10058000444444444444444444444444444444442B
:10059000444444444444444444444444444444441B
:1005A000444444444444444444444444444444440B
:1005B00044230EA1232009232780D84EDF44234C57
:1005C000FFD901021CF21DF90112C4230471230595
:1005D0000A18B40D67188022300522811E22C0053A
:1005E00022C10422C20522C3C82230002302180EF1
:1005F0008B23020F0E9D2302172230010E8B230244
:100600000F0E9D2302162230020E8B23020F0E9D29
:100610002302152230030E8B23020F0E9D2302149A
:100620002230040E8B23020F0E9D22CE0422CF0017
:100630000DE40D800E090E1202CE12300E9512C876
:1006400002CE12300EA712C962CE02CE4132032270
:10065000CE0002C9130202CE12300E9D02C8130250
:1006600002CE12300E8B0E2102CE12300E951302E6
:1006700012C802CE12300EA712C90ED962CF02CF15
:1006800041320322CF0002CF12300E95130202CF67
:1006900012300EA70F2A2D031B317C00FBA01B314B
:1006A0007D00FBA0A02304B123050918B40D672C1D
:1006B0008022C71F02C72302000EAF23022F02C7EA
:1006C0000EAF72C702C790EC22C72F02C7130223D6
:1006D00000010EAF02C7130223001F0EAF72C70244
:1006E000C790E8A0030232C501A002C932C601A02A
:1006F00072CF0DE4A06102610302C4130223004E15
:1007000023036D3013020303813912C403029130B5
:1007100071037102A00DC4130323000023021C40C7
:1007200003026300630012C60DC4130323000023F9
:10073000022D400302630012C5A002C5130202C6C7
:100740000EAFA01B319A001A9900299B001D98003A
:100750002CA002C131013C31025331032931044044
:10076000A0A002C131040322C103A002C1310303CE
:1007700022C104A002C131010322C102A002C13181
:10078000020322C101A002C87300130202CE12307C
:100790000E8BA002C97300130202CE12300E9DA070
:1007A00002C86300130202CE12300E8BA002C9638E
:1007B00000130202CE12300E9DA02D740230813142
:1007C0001200030214A002308131120004A0023092
:1007D00081811200030214A002308181120004A062
:1007E0002325009C0003232501230400230508C1C1
:1007F00012030302C0C0C0E11F82031203230420BE
:100800000302C1DD0ED717FD0EA02325009C0003B7
:10081000232501230400230508C112030302C0C0DD
:10082000C0E11F820312032304200302C1DD0E6115
:10083000000713027100D71707330204FD0E07A04B
:1008400002C532C8020D7402C632C9020D740DE42D
:1008500072CF02CF41FF0322CF31A02325009C009D
:1008600003232501230400230508C112030302C04A
:10087000C0C0E11F820312032304502305080302B2
:10088000C1DD0EE717FD0EA0000000000000000013
:100890000000000000000000000000000000000058
:1008A0000000000000000000000000000000000048
:1008B0000000000000000000000000000000000038
:1008C0000000000000000000000000000000000028
:1008D0000000000000000000000000000000000018
:1008E0000000000000000000000000000000000008
:1008F00000000000000000000000000000000000F8
:1009000000000000000000000000000000000000E7
:1009100000000000000000000000000000000000D7
:1009200000000000000000000000000000000000C7
:100930000080869096A0A6B0B6C0C6D0D6E0E6F0FD
:10094000F680869096A0A6B0B6C0C6D0D6E0E6F0F7
:10095000F6804020100804020180402010080402A4
:100960000180402010080402018040201008040289
:100970000180402010080402018040201008040279
:10098000017FBFDFEFF7FBFDFE7FBFDFEFF7FBFD72
:10099000FE7FBFDFEFF7FBFDFE7FBFDFEFF7FBFD65
:1009A000FE7FBFDFEFF7FBFDFE7FBFDFEFF7FBFD55
:1009B000FEDD0E61006125600223250022028026F3
:1009C0000062020202E10F410C06020281041202DF
:1009D000020290EB78250523250101E070027125C4
:1009E0007100FD0EA0DD0E61006125610360022231
:1009F0000280F30013251303C11662020202E10F05
:100A0000410C0D020281041202900563252202802E
:100A10006303030341C0E17002710371257100FD9E
:100A20000EA0000000000000000000000000000018
:100A3000000000001E7C4200000010104200000078
:100A40001E10420000000210420000001E107E0036
:100A50000000000000000000000000000000000096
:100A60000000000000000000000000000000000086
:100A70000000000000000000000000000000000076
:100A80000000000000000000000000000000000066
:100A90000000000000000000000000000000000056
:100AA0000000000000000000000000000000000046
:100AB0000000000000000000000000000000000036
:100AC0000000000000000000000000000000000026
:100AD0000000000000000000000000000000000016
:100AE0000000000000000000000000000000000006
:100AF0000000000001F830C67C00010848AA400050
:100B0000010084924000010084827000011CFC827C
:100B1000400001088482400001F884827C000000CB
:100B200000000000000000000000000000000000C5
:100B300001F884FC7E000108848042000108848062
:100B400042000108CCE07E0001084880480001080E
:100B50007880440001F830FC4200000000000000F2
:100B60000000000000000000000000000000000085
:100B70000000000000000000000000000000000075
:100B80000000000000000000000000000000000065
:100B90000000000000000000000000000000000055
:100BA00000000001800000000003C00000000005FC
:100BB000C0000000000680000000003F8000000030
:100BC000007E0000000000C00001000000C0847131
:100BD00037C00078C4D16400000EE499C40000025C
:100BE000B489470000029CF9640000068D0D3400B2
:100BF000000C850517C00030000000000041FFFF19
:100C0000FFC00040000000000080000800000080DD
:100C1000000EA6EA0000000A444A0000000E424A04
:100C200000000000864E00000000000000000000F0
:100C30000000000000000000AEED15D559DCE44CCA
:100C40002895D894A449519D529C000000000000B2
:100C500000000AA80000000012B8000000002128CF
:100C60000000785C09034C9E00049F0003A029F05B
:100C7000F8079F4CFB232700F807785CF17F4CF8BE
:100C8000232780F8079F4CFB01D8000000000000DC
:100C90000000000000000000000000000000000054
:100CA0000000000000000000000000000000000044
:100CB0000000000000000000000000000000000034
:100CC0000000000000000000000000000000000024
:100CD0000000000000000000000000000000000014
:100CE0000000000000000000000000000000000004
:100CF00000000000000000000000000000000000F4
:100D000000000000000000000000000000000000E3
:100D100000000000000000000000000000000000D3
:100D200000000000000000000000000000000000C3
:100D30000000080B00020202010009040000010289
:100D40000200000524001001052401010104240211
:100D5000060524060001070581031000400904016F
:100D600000020A0000000705020240000007058398
:100D7000024000000403090412010002EF020140D6
:100D80004123368000010102030141726475696EDE
:100D90006F204C4C430041726475696E6F204C6546
:100DA0006F6E6172646F0000571D11241FBECFEF7C
:100DB000DAE0DEBFCDBF11E0A0E0B1E0E6E8FBE3A2
:100DC00002C005900D92A632B107D9F728E0A6E23D
:100DD000B1E001C01D92A433B207E1F716E0C5ED02
:100DE000D6E004C02197FE010E94B61DC43DD10784
:100DF000C9F70E94FD0F0C94C11D0C9400003FB771
:100E0000F8948091CA079091CB07A091CC07B0913C
:100E1000CD0726B5A89B05C02F3F19F00196A11D4F
:100E2000B11D3FBFBA2FA92F982F8827820F911D80
:100E3000A11DB11DBC01CD0142E0660F771F881FC7
:100E4000991F4A95D1F708958F929F92AF92BF92C2
:100E5000CF92DF92EF92FF926B017C010E94FF061E
:100E60004B015C01C114D104E104F104F1F00E94D2
:100E7000FF06DC01CB0188199909AA09BB09883E44
:100E80009340A105B10570F321E0C21AD108E10831
:100E9000F10888EE880E83E0981EA11CB11CC114D5
:100EA000D104E104F10419F7DDCFFF90EF90DF905A
:100EB000CF90BF90AF909F908F9008951F920F9208
:100EC0000FB60F9211242F933F938F939F93AF935D
:100ED000BF938091260190912701A0912801B091A4
:100EE00029013091C90723E0230F2D3720F4019603
:100EF000A11DB11D05C026E8230F0296A11DB11D3D
:100F00002093C9078093260190932701A09328017D
:100F1000B09329018091CA079091CB07A091CC078B
:100F2000B091CD070196A11DB11D8093CA07909382
:100F3000CB07A093CC07B093CD07BF91AF919F9102
:100F40008F913F912F910F900FBE0F901F9018958A
:100F50008EBD00000DB407FEFDCF08952F923F9285
:100F60004F925F926F927F928F929F92AF92BF92B9
:100F7000CF92DF92EF92FF920F931F93CF93DF9365
:100F8000CDB7DEB7EC970FB6F894DEBF0FBECDBF7E
:100F9000CE0101964C0180E3D4011D928A95E9F7B8
:100FA0001091D906133808F01358012F02950695B1
:100FB000069503701F73110F90E0792F7370872FC0
:100FC000880FB0902A016401FE013896612F56E027
:100FD0001F5F20E8029FD0011124A60FB11DA55D5F
:100FE000BC4F4C91B11001C040E0342F331F332768
:100FF000331F082E01C0330F0A94EAF7D6012C9153
:10100000232B2C93DF01169746FBFF24F0F8F9AA57
:101010001AAAE9A8FAA8082E01C0EE0C0A94EAF769
:101020003C91E32AEC92119645FBFF24F0F8FBAAD1
:101030001CAAEBA8FCA8082E01C0EE0C0A94EAF743
:101040003C91E32AEC92119644FBFF24F0F8FDAAB0
:101050001EAAEDA8FEA8082E01C0EE0C0A94EAF71D
:101060003C91E32AEC92119643FBFF24F0F8FFAA8F
:1010700018AEEFA8F8AC082E01C0EE0C0A94EAF7FF
:101080003C91E32AEC92119642FBFF24F0F8F9AE72
:101090001AAEE9ACFAAC082E01C0EE0C0A94EAF7DD
:1010A0003C91E32AEC92DF0141FB222420F8312C11
:1010B0009101082E01C0220F0A94EAF73E91232BDA
:1010C0002C9340FB662460F8712C9301082E01C01C
:1010D000220F0A94EAF73081232B2083212F2F70CF
:1010E0002C3010F015E0160F17FF02C00F5F1058DC
:1010F000023021F4163010F0165000E0515028E074
:10110000C20ED11C3896552311F0612F61CF733078
:1011100079F5412C512C620183E0CC0CDD1C8A95C1
:10112000E1F7A12CB12C7501EC28FD28E80CF91C85
:10113000D7012C91822F880F282B2095822F2BAF3F
:101140009CAF0E94A8072BAD822F0E94A807F70131
:101150001082FFEFAF1ABF0A9CAD28E0A216B104BF
:1011600011F78FEF481A580AA6E04A16510499F66B
:101170009F5F903209F021CF1092B707EC960FB61F
:10118000F894DEBF0FBECDBFDF91CF911F910F91BD
:10119000FF90EF90DF90CF90BF90AF909F908F9097
:1011A0007F906F905F904F903F902F9008950F9396
:1011B0001F93CF93DF931F92CDB7DEB78C0180389A
:1011C0009140F0F08091DC06833008F040C182301D
:1011D00029F4063891E0190708F039C1F80120E830
:1011E000829FE00DF11D1124E555FE4F6083809133
:1011F0002A01882309F426C181E08093B70722C120
:10120000053181E0180709F4B0C000F50E3021E087
:10121000120709F468C050F4011591E01907B9F1FB
:101220000D3021E0120709F444C00CC1013181E006
:10123000180709F482C0033191E0190709F48AC044
:10124000003121E0120709F0FDC069C00D3181E0D5
:10125000180709F4AEC058F4083121E0120709F468
:101260008FC00B3181E0180709F498C0EBC007323A
:1012700091E0190709F4A8C0063621E0120709F425
:10128000B6C0023281E0180709F0DCC0B0CF862F6B
:1012900082958F708627982F969596958927982FF7
:1012A000969589279091B80680FB90F99093B8069F
:1012B000C9C08091C406862780FFC4C08091BA0748
:1012C0009091BB078E3F2FEF920708F0BBC0409173
:1012D000BC075091BD07FA01E80FF91FE491E13214
:1012E00009F0B0C09DC0862F807A803271F028F45A
:1012F0008111A8C088EB9BE00AC0803869F0803A71
:1013000009F0A0C088E491E002C084EA90E09093E4
:10131000B9078093B80796C080E797E1F8CF66FDDC
:1013200007C08091CA0690E09093B2068093B10600
:1013300067FD88C08091CC061DC080E091E0861BCF
:1013400091099093B4068093B3061092B60610925A
:10135000B50678C08091C70686FD74C0862F90E0E0
:101360009093B2068093B1066DC08091C70687FD49
:1013700069C0862F90E09093B0068093AF0662C05C
:1013800066FD07C08091D20690E09093AE068093F0
:10139000AD0667FD57C08091D40610C08091CF067E
:1013A00086FD50C0862F90E09093AE068093AD06E8
:1013B00049C08091CF0687FD45C0862F90E090936D
:1013C000AC068093AB063EC0262F221F2227221F89
:1013D000422F50E080912A0190E04817590791F17F
:1013E00020932A0169830E94AE0769812BC09091E6
:1013F0001C0780911B07E82FF0E0F92BF170E55DE9
:10140000FE4F608320911A0724FF21C08F5F8093D5
:101410001B0781111CC081E0892780931C0717C01E
:101420009C012F5F3F4FFA01E20FF31F24910296B8
:10143000FA01E80FF91FE491F0E0F22BF093BB07FB
:10144000E093BA071127F801E954F94F60830F9030
:10145000DF91CF911F910F910895A7EBB6E01696FB
:101460009C911697E92FF0E0E555FB4F8081915054
:1014700016969C9308958F3F910509F068F420918A
:10148000B80626952170F22FE0E08E0F9F1FFC0119
:10149000E555FB4F608308950C94D7088F3F910565
:1014A00009F060F42091B80626952170F22FE0E053
:1014B0008E0F9F1FFC01E555FB4F11C0803821E0C6
:1014C000920778F02091DC06233008F056C030E80F
:1014D000239F800D911D1124FC01E555FE4F808155
:1014E00008958D3121E0920719F178F4843121E0DB
:1014F0009207C1F08B3131E09307B9F0823121E0DE
:101500009207B1F58091B1060895853631E09307D1
:1015100091F0863621E0920791F08C3531E0930707
:1015200039F52DC08091AF0608958091AD060895DC
:101530008091AB06089580911C078E6F08952091CD
:101540001C0790911B07E92FF0E0F22BF170E55D8D
:10155000FE4F808130911A0734FF12C09F5F909335
:101560001B0791110DC091E0922790931C070895DD
:101570009927FC01E954F94FB2CF8FEF089582E02B
:101580000895A7EBB6E01696EC911697EF5F1696C6
:10159000EC93F0E0E555FB4F808308958B3121E01B
:1015A000920741F08D3121E0920721F00E944E0A0E
:1015B00090E008958FEF90E0089521E030E001C0C1
:1015C000220F8A95EAF780910307282B20930307BF
:1015D0008091050782FF03C082608093050708950C
:1015E00021E030E001C0220F8A95EAF72095809132
:1015F00003072823209303078091050782FF03C078
:101600008260809305070895FC018091D6078111BF
:1016100003C08FEF9FEF08959FB7F89482E0809307
:10162000E9002091F20030E01216130614F421E0D4
:1016300030E02115310559F0289884E68093D507CC
:101640008091F10080838091F200882319F09FBF80
:10165000C90108958BE68093E800F9CF2FB7F8947D
:1016600083E08093E9009091E800892F807295FFD4
:1016700004C09091F20080E4891B2FBF0895CF929F
:10168000DF92EF92FF920F931F93CF93DF936C0142
:101690007A018B01C0E0D0E0CE15DF0589F0D801DA
:1016A0006D918D01D601ED91FC910190F081E02DBD
:1016B000C6010995892B11F47E0102C02196ECCF59
:1016C000C701DF91CF911F910F91FF90EF90DF90B5
:1016D000CF90089580912C0881110DC082E08093F5
:1016E000280884E08093290810922B0810922A0879
:1016F00081E080932C0888E298E00895CF93DF93EF
:101700001F92CDB7DEB76983DC01ED91FC910280B9
:10171000F381E02D41E050E0BE016F5F7F4F0995FE
:101720000F90DF91CF91089583E08093E90080913D
:10173000F200882319F08AE38093E80008950E945C
:101740002E0B90E00895CF93DF931F92CDB7DEB7B5
:10175000FC018485958597FD05C02FEF3FEF358708
:1017600024870BC0CE0101960E94040B019719F447
:10177000898190E002C08FEF9FEF0F90DF91CF91B2
:1017800008950F931F93CF93DF931F92CDB7DEB7CA
:101790008C01FC018485958597FF0EC0CE010196D2
:1017A0000E94040B019719F4298130E002C02FEF49
:1017B0003FEFF80135872487F801848595850F90E0
:1017C000DF91CF911F910F910895FC01848595853C
:1017D00097FD0BC09FB7F89482E08093E900809159
:1017E000F2009FBF90E0019608959FB7F89482E0C1
:1017F0008093E9008091F2009FBF90E008950895E2
:1018000080E090E008950E94BC1D8F929F92AF925D
:10181000BF92CF92DF92EF92FF920F931F93CF93DD
:10182000DF935C016B017A0180910B01882309F43D
:101830005BC08091D607882309F456C08091D407F5
:1018400080FF05C08091E00082608093E000E701A6
:1018500010E00AEF83E0882E9AE3992E2097D9F1C1
:101860000E942E0B81110AC0015009F43DC061E0B5
:1018700070E080E090E00E942407F0CF282F30E055
:10188000C217D3070CF48C2F4FB7F8948092E9005D
:101890009091E80095FF1DC0282F30E0C21BD30BAC
:1018A000F601982F915020F081918093F100FACFAA
:1018B000C20ED31E112319F09092E80009C0809146
:1018C000E80085FD06C09092E80011E0209709F03D
:1018D00010E04FBFC3CF1111C3CF5D9884E6809352
:1018E000D7071E141F0444F081E090E0F5019383B4
:1018F000828380E090E001C0C701DF91CF911F910A
:101900000F91FF90EF90DF90CF90BF90AF909F909E
:101910008F900895CF92DF92EF92FF920F931F93D3
:10192000CF93DF931F92CDB7DEB7182F062FE42E8B
:10193000862F880F8E5F99830E94C20F83E00E94DA
:10194000C20FF12EC12E9981D92E8C2D8F1980179F
:1019500098F4F601E7FE02C0849101C080810E94E4
:10196000C20F182F80E00E94C20F8123FFEFCF1A11
:10197000DF0A8111EACF01C081E00F90DF91CF91A2
:101980001F910F91FF90EF90DF90CF900895DF921D
:10199000EF92FF920F931F93CF93DF93D82E8A017C
:1019A0007B01E40EF51EEB01CE15DF0571F0D7FECD
:1019B00003C0FE01849101C088810E94C20F21965C
:1019C0008111F2CF8FEF9FEF01C0C801DF91CF915E
:1019D0001F910F91FF90EF90DF9008950F931F9349
:1019E000CF93DF931F92CDB7DEB782E0898342E4C5
:1019F00050E062E37DE080E80E94C70C0E946A0B21
:101A0000DC0112960D911C9113970115110569F0D7
:101A1000D801ED91FC910280F381E02DBE016F5F52
:101A20007F4FC801099597FF07C089810F90DF910B
:101A3000CF911F910F910895F80100851185E5CF91
:101A40001F920F920FB60F9211248F939F93809144
:101A5000E1009091E100937F9093E10083FF0FC03C
:101A60001092E90091E09093EB001092EC0092E369
:101A70009093ED001092D60798E09093F00082FFCB
:101A800020C093E09093E9009091F200992319F01F
:101A90009AE39093E8009091D707992339F09091B9
:101AA000D70791509093D707992389F19091D50743
:101AB000992339F09091D50791509093D5079923A8
:101AC00041F184FF10C08091E2008E7E816080939E
:101AD000E2008091E1008F7E8093E1008091D40745
:101AE0008E7E806111C080FF16C08091E2008E7EE4
:101AF00080618093E2008091E1008E7E8093E1001E
:101B00008091D4078E7E81608093D40704C05D9A53
:101B1000CDCF289AD6CF9F918F910F900FBE0F9067
:101B20001F9018951F920F920FB60F921124CF920B
:101B3000DF92EF92FF920F931F932F933F934F9358
:101B40005F936F937F938F939F93AF93BF93EF9325
:101B5000FF93CF93DF93CDB7DEB76C97DEBFCDBFDA
:101B60001092E9008091E80083FFEDC168E0CE01AA
:101B700045960E94F00F82EF8093E8008D8987FFE1
:101B800005C09091E80090FFFCCF03C09EEF9093BA
:101B9000E800982F907609F0C6C09E892F89188D8D
:101BA00091110CC0803829F48091D3078093F10003
:101BB00002C01092F1001092F10048C1422F50E093
:101BC000512B913051F4811141C14130510509F03F
:101BD0003DC18091D3078D7F0BC0933061F481119B
:101BE00035C14130510509F031C18091D307826080
:101BF0008093D3072BC1953041F48091E80080FF9A
:101C0000FCCF20682093E30021C1963009F05FC02B
:101C1000EB8CFC8C1092E9001092D1071092D00747
:101C2000123091F51092CF071092CE070E94EE0C61
:101C300099E0BE016F5F7F4FDB01E92F1D92EA95AE
:101C4000E9F799831A8391E09E8390EA98879AEF47
:101C500099872091D0073091D107275F3F4F3C8370
:101C60002B838D831092E9001092D1071092D00738
:101C7000F092CF07E092CE0749E050E080E00E946A
:101C8000C70C0E94EE0CE2C0F092CF07E092CE07A4
:101C90000E946A0BDC011296ED90FC901397E11400
:101CA000F10409F4C0C0D701ED91FC910480F581E5
:101CB000E02DBE016B5E7F4FC7010995009719F0BB
:101CC0000CF0C4C0C7C0F701E084F184E8CF9730BE
:101CD00009F4C0C0983021F481E08093F100B6C0CF
:101CE000993009F0B3C0837009F0B4C0EDE0F1E0C1
:101CF00081E021E036E39081992361F08093E9004F
:101D00002093EB0091919093EC003093ED008F5F66
:101D1000873089F78EE78093EA001092EA008F8976
:101D20008093D60793C08B8D9C8D1092E900109202
:101D3000D1071092D0079093CF078093CE07898D5B
:101D4000811156C08E899D89913A59F4813209F0EA
:101D500081C047E050E064E071E080E00E94C70C81
:101D600075C0913209F076C0833289F4888D90E095
:101D7000982F88272F89822BA0E0B0E08093000164
:101D800090930101A0930201B09303015FC08032E0
:101D900069F48091E80082FFFCCF67E084E091E085
:101DA0000E94F00F8BEF8093E80006C0823209F0AA
:101DB0004DC08F8980930B018091D207882319F041
:101DC000EEEFFAE002C0E0E0F8E0809104019091CB
:101DD0000501A0910601B0910701803B9440A10547
:101DE000B10509F07BC080910B0180FF93C076C0E4
:101DF0000E946A0BDC0112960D911C91139701153C
:101E0000110541F1D801ED91FC910190F081E02D97
:101E1000BE016B5E7F4FC8010995811117C0F801A3
:101E200000851185ECCF113009F44EC0133091F4C8
:101E30008F89882309F445C0823081F440E860E14D
:101E400086E99DE00E948A0C882321F08EEF809322
:101E5000E80079C081E28093EB0075C0813029F4FD
:101E600040E86BE08AE89DE0EDCF833099F70E946F
:101E70006A0BDC011296ED90FC9013978E010F5FB8
:101E80001F4F6801E114F10479F0D701ED91FC9145
:101E90000680F781E02DB801C7010995080F111DD3
:101EA000F701E084F184EECFD8011C92F601019095
:101EB0000020E9F73197BF016C197D0940E0C601A8
:101EC000C1CF64E77DE002C068E77DE06115710580
:101ED00009F2FB01449150E080E840CF0FB6F8943E
:101EE000A8958091600088618093600010926000E6
:101EF0000FBEA895EE3F2AE0F20739F08091FE0A66
:101F00009091FF0A91838083A1CF1092FF0A1092D3
:101F1000FE0A9CCFEE3F8AE0F80731F08081918184
:101F20009093FF0A8093FE0A87E797E79183808367
:101F30009BE088E10FB6F894A895809360000FBEEF
:101F40009093600083CF6C960FB6F894DEBF0FBEFF
:101F5000CDBFDF91CF91FF91EF91BF91AF919F9155
:101F60008F917F916F915F914F913F912F911F9131
:101F70000F91FF90EF90DF90CF900F900FBE0F90DA
:101F80001F9018954091D0075091D1072091CE070E
:101F90003091CF0742175307B4F49091E800957041
:101FA000E1F39091E80092FD19C08093F1008091D7
:101FB000D0079091D10701968F739927892B19F437
:101FC0008EEF8093E8008091D0079091D107019621
:101FD0009093D1078093D00781E0089580E0089521
:101FE000615030F02091F100FC0120830196F8CF80
:101FF000289884E68093D5070895CF93DF9300D087
:1020000000D01F92CDB7DEB7789484B5826084BDCE
:1020100084B5816084BD85B5826085BD85B58160EC
:1020200085BD80916E00816080936E00109281006A
:102030008091810082608093810080918100816025
:1020400080938100809180008160809380008091E6
:1020500091008260809391008091910081608093D3
:102060009100809190008160809390008091C100E8
:1020700084608093C1008091C10082608093C10020
:102080008091C10081608093C1008091C300816014
:102090008093C3008091C00082608093C0008091D3
:1020A000C20081608093C20080917A008460809336
:1020B0007A0080917A00826080937A0080917A0021
:1020C000816080937A0080917A00806880937A00A2
:1020D0001092D6071092D3071092D4078091D700A0
:1020E00081608093D70080EA8093D80089B58061B1
:1020F00089BD89B5826089BD09B400FEFDCF61E06C
:1021000070E080E090E00E9424078091D8008F7CEE
:1021100080618093D8008091E000807F8093E00010
:102120008091E1008E7E8093E1008DE08093E2005B
:10213000559A209AEEEFFFE7859194918B3F9C4D45
:1021400019F481E08093D20785B1806F85B9249816
:1021500084B1866E84B95E9A5F988AB1806D8AB9BF
:10216000769A6E9881B3806F81BB899880B38D70A9
:1021700080BB80E58CBD81E08DBD65E070E080E0D6
:1021800090E00E9424075F9A65E070E080E090E0B4
:102190000E9424075E985C9874E2E72E71E0F72EA7
:1021A0001DE01E0DF70184910E94A807FFEFEF1AB2
:1021B000FF0A1E11F7CF5C9A01E014E001501109EB
:1021C00021F08FEF0E94A807F9CF5C9881E20E946E
:1021D000A80780E10E94A8078FE60E94A80782E274
:1021E0000E94A80780E00E94A80787E00E94A80735
:1021F0005C9A2FB7F8946091260170912701809125
:102200002801909129012FBF40E052E0EBEAF4E071
:10221000DF018A011D9201501040E1F720E831E012
:10222000EBE2F3E0DF0189011D9201501040E1F77C
:10223000EBE2F1E0DF018A011D9201501040E1F76D
:1022400040E051E0E7EBF6E0DF018A011D9201502A
:102250001040E1F72FE72093BD061FEF109303070F
:1022600002E00093B8061092B2061092B1061092E6
:10227000B0061092AF061092AE061092AD06109204
:10228000AC061092AB061092B6061092B5065093AB
:10229000B4064093B30620E22093BB0427E12093C9
:1022A000BC04FF24F394F092BD04F092BE04F092BB
:1022B000BF0427E02093C20421EE2093C304F092D0
:1022C000C404F092C504F092C60428EE33E040E066
:1022D00050E00E94941D2093C8041093DC0480E811
:1022E0008093BF0661E88EE091E00E94D7081092CB
:1022F000B70710922A011092C6071092C5071092D4
:10230000C0071092BF07F092C40681E391E090935A
:10231000BD078093BC071092BB071092BA070093C9
:10232000DC0660E182E891E00E94D7081092DC06AA
:1023300060E887E291E00E94D708CC24C394D12CB6
:1023400056E0452E512C66246394712C8091C7076A
:102350009091C8079C01215031093093C807209300
:10236000C707892B71F483B7817F83BF83B78160EF
:1023700083BF889583B78E7F83BF5092C8074092F2
:10238000C7070091BC071091BD07E090BA07F09015
:10239000BB07F801EE0DFF1D2491B7016F5F7F4F62
:1023A0007093BB076093BA07822F8F70843048F414
:1023B000823008F044C3882341F0813009F441C1E0
:1023C000E4C5883008F41AC4E0C5E22FF0E034E038
:1023D000F595E7953A95E1F73197EF30F10510F073
:1023E0000C944919EA5AFF4F0C94B61D82E0860FEF
:1023F0000E94C10A8091BA079091BB070296892F6B
:102400000E94C10A8091BA079091BB07F801E80FBA
:10241000F91F34910196F801E80FF91F2491830FF9
:10242000911DE22FF0E0FE2FEE27E80FF91FF09349
:10243000BB07E093BA073CC182E0860F0E94C10A45
:102440008091BA079091BB070296892F0E94C10A1A
:102450008091BA079091BB07F801E80FF91F24910A
:10246000FC013196E00FF11FE491F0E0F22B56C62B
:102470002091B9068091B70690E0982F8827309177
:10248000BA06832B289F7001299FF00C112480919C
:10249000B8068B778093B806E092BA066F2D80E07D
:1024A00091E00E94D708C701FF0CAA0BBB0BB093A9
:1024B000B9062AC06091B90670E08091BA0661152C
:1024C000710541F02091B70690E0922B0E94801D8B
:1024D0007C0105C0682F70E07F6FE12CF12C8091AA
:1024E000B8068B77E114F10411F494E001C090E098
:1024F000892B8093B8066093BA06672F80E091E03D
:102500000E94D708E092B90687E0C4C6E091BC06F5
:10251000F0E0FE2FEE278091BB06E80FF11D5AC2B6
:1025200022E0E20EF11CF092BB07E092BA07F8013C
:10253000E60FF71F849190E023C10E942D0AE091DD
:10254000BA07F091BB079F012F5F3F4F3093BB0746
:102550002093BA07E00FF11FE491682F8E2F90E0CF
:10256000A0C22091B706C70102962111ECC3F80161
:10257000E60FF71F249127FF09C6E491EE2ED9C27A
:102580002091B706C7010296222309F4DCC3F801A3
:10259000E60FF71F249127FFF9C5E491EE2EF12CE9
:1025A000FA94F7C50E942D0AE82EF12CFE2CEE2499
:1025B0000E942D0AE82AEFC50E942D0AE82EF12C70
:1025C000FE2CEE240E942D0AE82AF092BB07E0922E
:1025D000BA078091C5079091C60701979093C607E7
:1025E0008093C50754C66091B70660FB679567F98D
:1025F000C7C48091B70690E06091B806262F80FB93
:1026000027F92093B8069595879560780BC060915F
:10261000B706962F9078892F90E0880F892F881F12
:10262000990B660F682BACC46091B7068091B80611
:10263000262F2078982F9F77922B9093B80680783A
:10264000EBCFE22FF0E044E0F595E7954A95E1F70E
:102650003197EF30F10520F4EB59FF4F0C94B61D84
:10266000F801E60FF71F849187FF04C0E491F0E0C2
:10267000FA9502C0E491F0E052E0E50EF11CEE0D97
:10268000FF1D4CC5F801E60FF71F949162E0E60EBE
:10269000F11CF801EE0DFF1DE491E90EF11CF0E0D4
:1026A000FE2FEE27EE0EFF1EF092BB07E092BA0758
:1026B00084E0F0C5F801E60FF71F8491F701329628
:1026C000E00FF11FE491F0E0F82B28C52091B70648
:1026D00030E04091B8064F77F801E60FF71F84917C
:1026E00090E02817390714F080E001C080E8482BFB
:1026F0004093B806A7014E5F5F4FE491F0E0C70139
:1027000003962E173F0709F01EC3F801E40FF51FCB
:10271000249127FF3BC5E490F12CFA943AC520910F
:10272000B70630E04091B8064F77F801E60FF71F83
:10273000849190E02817390714F080E001C080E808
:10274000482B4093B806A7014E5F5F4FE491F0E03D
:10275000C70103962E173F0709F4F5C2F801E40FED
:10276000F51FB2C2B2E0EB0EF11CF092BB07E09293
:10277000BA07F801E60FF71FE4918E2F90E0916001
:102780000E944E0A0E94C10A82C50E942D0AE09151
:10279000BA07F091BB079F012F5F3F4F3093BB07F4
:1027A0002093BA07E00FF11FE491F0E0682FCF010A
:1027B000916077C13090B706A32CB12CE2E0EE0E09
:1027C000F11CF092BB07E092BA07F801E60FF71F81
:1027D0002490E22CF12C622D630D80E091E00E94A8
:1027E000D7082091B8062B73C5018E0D9F1D8F3F12
:1027F000910509F014F430E001C030E8232B332DAB
:102800003F70422D4F7050E0430F511D4031510534
:1028100014F430E001C030E4232BA094B094AE2433
:10282000BF24F0E8AF22BB24E826F926AE20BF2063
:10283000AB2811F480E001C084E0282B2093B80677
:1028400028C53090B706A32CB12C22E0E20EF11C73
:10285000F092BB07E092BA07F801E60FF71F249049
:10286000E22CF12C2091B806221F2227221F622F72
:10287000630D620D80E091E02D830E94D708809166
:10288000B8068B732D8130E0A5014E0D5F1D420F00
:10289000531F4F3F510509F014F490E001C090E838
:1028A000892B932D9F70E22DEF70F0E0E90FF11D61
:1028B000E20FF31F709714F490E001C090E4892BAD
:1028C000A094B094AE24BF2430E8A322BB24E42615
:1028D000F526AE20BF20AB2809F080C27DC2B090A3
:1028E000B70642E0E40EF11CF092BB07E092BA0793
:1028F000F801E60FF71FF4906B2D6F1980E091E05F
:102900000E94D7088091B8068B732B2D30E02F19C9
:10291000310937FD02C020E001C020E8282B8B2DB3
:102920008F7090E03F2D3F70831B9109991F99276D
:10293000991F9295990F990F907C822FFBC2B090AE
:10294000B70652E0E50EF11CF092BB07E092BA0721
:10295000F801E60FF71FF4904091B806E42EEE1C44
:10296000EE24EE1C6B2D6F196E1980E091E00E9431
:10297000D7088091B8068B734E2D50E02B2D30E098
:102980002F193109241B350B37FD02C090E001C01F
:1029900090E8892B2B2D2F7030E09F2D9F70291BE5
:1029A0003109241B350B932F991F9927991F929555
:1029B000990F990F907CBEC28091B706E091BB063B
:1029C000F0E0E80FF11D8091BC0690E0982F882779
:1029D000E80FF91FE00FF11F649180E091E00E9481
:1029E000D70855C49091B70682E0E80EF11CF0922A
:1029F000BB07E092BA07F801E60FF71F6491692B55
:102A0000BFC29091B706A2E0EA0EF11CF092BB079C
:102A1000E092BA07F801E60FF71F64916923B0C28C
:102A20009091B706B2E0EB0EF11CF092BB07E0927A
:102A3000BA07F801E60FF71F64916927A1C2570191
:102A4000E2E0AE0EB11CB092BB07A092BA07F8014B
:102A5000E60FF71FE491822F8170982E812C1401CC
:102A60002E2AE22FF0E084E0F595E7958A95E1F7CC
:102A70003197EF30F10520F4EC58FF4F0C94B61D60
:102A8000C101E9C06091B70665C0F3E0EF0EF11C2B
:102A9000F092BB07E092BA07F801EA0DFB1D6491C2
:102AA000C1010E943B0AF3C3C1010E944E0A282FB4
:102AB00030E04091B70650E08091B8068F7742171A
:102AC000530714F090E001C090E8892B8093B8067A
:102AD000C70103964217530709F035C1F801EA0D03
:102AE000FB1D249127FF52C3E490F12CFA9451C3AB
:102AF000C1010E944E0A282F30E04091B70650E0F5
:102B00008091B8068F774217530714F090E001C008
:102B100090E8892B8093B806C701039642175307A4
:102B200009F411C1F801EA0DFB1D249127FF2EC302
:102B3000E490F12CFA942DC3C1010E94CE0A0197B2
:102B40007C01FF246E2DC101F4C0C1010E94CE0A98
:102B500061E0680FC10198C3C1010E94CE0A6FEF06
:102B6000F8CFC1010E944E0AB82EE82EF12CA09099
:102B7000B7062A2C312C682F6A0D80E091E00E9464
:102B8000D7088091B8068B7391012E0D3F1D2F3F02
:102B9000310509F014F450E001C050E8582B4A2DDB
:102BA0004F708B2D8F7090E0840F911D409714F41F
:102BB00080E001C080E4852B209430942E243F24B3
:102BC00040E82422332402C1C1010BC1C1015AC112
:102BD000C1017BC1C1010E944E0AF82E6091B70667
:102BE000C101B3C1F090B706C101B6C1F090B706FC
:102BF000C101BAC1F090B706C101BEC18091B8064B
:102C000090E0959587958C709927322F3370832BA0
:102C10002D8369837C830E944E0A90E02D81698117
:102C20007C8121FD03C040E050E002C040E051E063
:102C30005A01A82AB92AE22FF0E0A4E0F595E79519
:102C4000AA95E1F73197EF30F10520F4ED57FF4FEA
:102C50000C94B61DC5010E944E0A682F91C1609167
:102C6000B70680C082E0E80EF11CF092BB07E0924C
:102C7000BA07F801E60FF71F649174C0C5016983B4
:102C80007C830E944E0A482F50E097012E5F3F4FF1
:102C900069817C81F801E60FF71FE491F0E08091F3
:102CA000B8068F774E175F0714F090E001C090E8E8
:102CB000892B8093B806C7010396E417F50709F03E
:102CC00042C0F801E20FF31F249127FF5FC2E49096
:102CD000F12CFA945EC2C50169837C830E944E0A7E
:102CE000482F50E097012E5F3F4F69817C81F801AA
:102CF000E60FF71FE491F0E08091B8068F774E174A
:102D00005F0714F090E001C090E8892B8093B8062B
:102D1000C7010396E417F507B1F0F801E20FF31FBE
:102D200067C2C5010E94CE0A01977C01FF246E2D67
:102D3000C5010E943B0A8091BA079091BB07EF281A
:102D400009F0DDC101969093BB078093BA079FC23B
:102D5000C5010E94CE0A61E004C0C5010E94CE0AEE
:102D60006FEF680FC50190C2C5010E944E0AB82ED0
:102D7000E82EF12CA090B7062A2C312C682F6A0D72
:102D800080E091E00E94D7088091B8068B73910192
:102D90002E0D3F1D2F3F310509F014F450E001C006
:102DA00050E8582B4A2D4F708B2D8F7090E0840F78
:102DB000911D409714F480E001C080E4852B20949D
:102DC00030942E243F24E0E82E223324E226F326FA
:102DD000E220F320EF2811F490E0ACC094E0AAC008
:102DE000C5010E944E0AA82EE82EF12CB090B7061D
:102DF0002B2D30E03B832A832091B806322E331CE2
:102E00003324331C632D6B0D680F80E091E00E942A
:102E1000D7086091B8066B73232D30E04A815B813F
:102E20004E0D5F1D420F531F4F3F510509F014F423
:102E300080E001C080E8682B7B2D7F708A2D8F7029
:102E400090E0870F911D280F391F2031310514F4B0
:102E500080E001C080E4682B8A819B8180959095F9
:102E60008E259F2580789927E426F5268E219F219F
:102E7000892B11F480E001C084E0682B6093B806D0
:102E800008C2C5010E944E0AF82EE090B7066E2DCA
:102E9000681B80E091E00E94D7088091B8068B7390
:102EA0002E2D30E02F19310937FD02C040E001C05E
:102EB00040E8482B2E2D2F7030E08F2D8F70B901F8
:102EC000681B7109CB012EC0C5010E944E0AE82E75
:102ED000B090B7066091B806F62EFF1CFF24FF1CC9
:102EE0006B2D681B6F1980E091E00E94D7088091DC
:102EF000B8068B736F2D70E02B2D30E02E19310941
:102F0000261B370B37FD02C040E001C040E8482BCC
:102F10002B2D2F7030E08E2D8F70281B3109261B32
:102F2000370B932F991F9927991F9295990F990FF6
:102F3000907C842F892B8093B806ABC1C5010E9479
:102F40004E0AF82E6091B706C5010E943B0A6F2D0C
:102F500017C0F090B706C5010E944E0A682F6F296E
:102F60000FC0F090B706C5010E944E0A682F6F216E
:102F700007C0F090B706C5010E944E0A682F6F2562
:102F800080E091E00E94D70884C1822F807E803645
:102F900009F4CDC088F5803209F45EC0803409F4AC
:102FA00079C0811176C1C70102969093BB078093C7
:102FB000BA07F801E60FF71FE491922F9071A92E3E
:102FC000B12CB694BA2CAA24B794A7942770B22A2D
:102FD000AE2A0E94C10A8091BB070E94C10A80915B
:102FE000BA079091BB078827907FA82AB92AB09288
:102FF000BB07A092BA074BC1803A09F400C120F484
:10300000803809F4CDC045C1803C09F41AC1803E26
:1030100009F03FC132E0E30EF11CF092BB07E092F1
:10302000BA07F801E60FF71FE491822F807190E054
:1030300074E0880F991F7A95E1F77C01EE2AC701A9
:103040002D830E94CE0A2D812770B60101C0660F24
:103050002A95EAF7682B17C1F801E60FF71FE491EC
:10306000422F407150E05695542F4427579547956D
:103070002770CA01922B9C012E2B92E0E90EF11CC5
:10308000EE24A0EFFA222E293F293093BB0720938C
:10309000BA07FDC0C70102969093BB078093BA0799
:1030A000F801E60FF71FE491822F807190E044E071
:1030B000880F991F4A95E1F75C01AE2AC5012D835F
:1030C0000E944E0A2D812770482F50E0022E02C028
:1030D000559547950A94E2F740FF25C0F60102C0D6
:1030E000EE0FFF1F2A95E2F79F012095682F6223BC
:1030F000C5010E943B0A8091BA079091BB07F80175
:10310000E80FF91F249127FF04C0E491F0E0FA953D
:1031100002C0E491F0E00196E80FF91FF093BB07BD
:10312000E093BA07B4C0F3E0EF0EF11C34C05701CE
:1031300032E0A30EB11CB092BB07A092BA07F8010F
:10314000E60FF71FE491822F807190E034E0880F42
:10315000991F3A95E1F78E2B2D830E944E0A90E03D
:103160002D812770AC0102C0559547952A95E2F74D
:10317000C701039640FFE7CDF801EA0DFB1D24913E
:1031800027FF04C0E490F12CFA9403C0E491EE2EE2
:10319000F12CE80EF91EF092BB07E092BA0777C057
:1031A000570182E0A80EB11CB092BB07A092BA07EB
:1031B000F801E60FF71FE491822F807190E0B4E0F0
:1031C000880F991FBA95E1F78E2B2D830E944E0A26
:1031D00090E02D812770DC0102C0B595A7952A9556
:1031E000E2F7C7010396A0FDAECDF801EA0DFB1D85
:1031F000249127FFCBCFE490F12CFA94CACFE2E0E0
:10320000EE0EF11CF092BB07E092BA07F801E60F50
:10321000F71FE491822F807190E0A4E0880F991F3E
:10322000AA95E1F77C01EE2AC7012D830E94CE0A00
:103230002D812770B60101C0660F2A95EAF768272D
:1032400022C0F2E0EF0EF11CF092BB07E092BA0749
:10325000F801E60FF71FE491822F807190E0F4E00F
:10326000880F991FFA95E1F77C01EE2AC7012D839B
:103270000E94CE0A2D812770B60101C0660F2A95E3
:10328000EAF760956823C7010E943B0A02C082E00A
:1032900001C081E0482F50E05B834A83E090C30780
:1032A000F090C407E40EF51EF092C407E092C30745
:1032B000A090B807B090B907EA14FB0408F4CDC099
:1032C0008091B70781110E94AE074FB12CB193B125
:1032D00030E0209530952074332753E035952795BD
:1032E0005A95E1F7892F90E0809590958071992704
:1032F0009595879595958795822B4095407F382E9B
:10330000342A8091BE0737FE0AC080FD11C081605B
:103310008093BE0780E090E00E94F00A09C080FF21
:1033200007C08E7F8093BE0780E090E00E94DD0A98
:103330008091BE0734FE0AC081FD11C08260809377
:10334000BE0781E090E00E94F00A09C081FF07C03B
:103350008D7F8093BE0781E090E00E94DD0A80911E
:10336000BE0735FE0AC082FD11C084608093BE078F
:1033700082E090E00E94F00A09C082FF07C08B7FC4
:103380008093BE0782E090E00E94DD0A8091BE0734
:1033900036FE0AC083FD11C088608093BE0783E0BB
:1033A00090E00E94F00A09C083FF07C0877F8093E6
:1033B000BE0783E090E00E94DD0A8091BE0733FEE5
:1033C0000AC084FD11C080618093BE0784E090E054
:1033D0000E94F00A09C084FF07C08F7E8093BE0759
:1033E00084E090E00E94DD0A8091BE0732FE0AC0B0
:1033F00085FD11C080628093BE0785E090E00E9449
:10340000F00A09C085FF07C08F7D8093BE0785E065
:1034100090E00E94DD0AEA18FB08F092C407E092EF
:10342000C3078091C1079091C2079C012F5F3F4F56
:103430003093C2072093C1072233310570F02091E9
:10344000BF073091C00728603093C0072093BF07A3
:10345000C1979093C2078093C107E091C7068E2F52
:10346000807CA1F18091B5069091B6066A817B813E
:10347000860F971F9093B6068093B5062091B306EA
:103480003091B4068217930708F140E050E04F5F97
:103490005F4F821B930B82179307C8F79093B60672
:1034A0008093B5068E2F807E803E09F096C2809173
:1034B000B1069091B206480F591F4F3F510511F0C8
:1034C00008F040C25093B2064093B1066091CF0617
:1034D000862F807C09F4CDC0862F807E803E09F047
:1034E0005CC08091AD069091AE062A813B81820F2F
:1034F000931F8F3F910509F028F49093AE068093B7
:10350000AD06B7C0AC015A955093AE064093AD06D8
:103510008091AB069091AC069C012F5F3F4F2F3FEF
:10352000310509F028F43093AC062093AB06A1C016
:103530008F5F91099093AC068093AB062091D206E1
:1035400030E0420F531F4F3F510509F028F45093CC
:10355000AE064093AD061AC05A955093AE064093FE
:10356000AD064091D40650E0840F951F9093AC06B1
:103570008093AB068F3F910549F040F03093AE0643
:103580002093AD065093AC064093AB06862F8A601D
:103590008093CF0662FF6DC063C066FF33C0809129
:1035A000AD069091AE064A815B81840F951F909382
:1035B000AE068093AD068F3F910521F118F1209161
:1035C000D20630E0A9015A95840F951F8F3F9105CF
:1035D00009F028F49093AE068093AD0604C03093B2
:1035E000AE062093AD06862F82608093CF0660FFE3
:1035F00009C08091BF079091C00780629093C00777
:103600008093BF074091CF0647FF33C08091AB0640
:103610009091AC066A817B81680F791F7093AC062C
:103620006093AB066F3F710521F118F18091D406CC
:1036300090E09C013A95260F371F2F3F310509F086
:1036400028F43093AC062093AB0604C09093AC06EC
:103650008093AB06842F88608093CF0642FF09C019
:103660008091BF079091C00780629093C0078093BC
:10367000BF078091C40680FD0EC18091BA0790916A
:10368000BB07803151E0950739F124F48115914051
:1036900059F0F3C08032A1E09A0709F445C08033A5
:1036A000914009F461C0E9C08091290690E0982F0B
:1036B000882720912A06822B81309C402CF460E0E0
:1036C00080E091E00E94D7086FEF80E091E00E94D7
:1036D000D70885E091E0D3C08091290690E0982F2B
:1036E000882720912A06822B20E030E0AC01442775
:1036F000B901680F791FFA01E62BE00FF11F649101
:10370000D901A55DB94F7C91672739F42F5F3F4FF1
:103710002038310569F760E070E080E091E00E94B8
:10372000D70885E191E0ABC08091290690E0982F01
:10373000882720912A06822B20E030E0AC01442724
:10374000B901680F791FFA01E62BE00FF11FE49130
:10375000D901A55DB94FEC932F5F3F4F203831055C
:1037600079F785E291E08BC09091C90481E08927C7
:103770008093C90480FD7EC08091C8048F5F8C3324
:1037800018F48093C80476C01092C8048091C704CE
:103790008F5F8C3318F48093C7046CC01092C704F9
:1037A0008091C6048F5F883118F48093C60462C08C
:1037B0001092C604E091C504EF5FE093C504409108
:1037C000C404423051F52091C20430E0322F222748
:1037D0008091C304282BC90183709927892B49F54F
:1037E000C90160EA7FE00E946C1D892B01F1C901CB
:1037F00068EE73E00E946C1D892BD9F0C90160E965
:1038000071E00E946C1D892B91F0C90164E670E0A3
:103810000E946C1D892B69F00AC0842F817048308A
:1038200018F0811108C009C0811107C004C08DE1E2
:1038300005C08CE103C08EE101C08FE18E17D0F48A
:1038400091E09093C50481E0840F8093C4048D308F
:1038500088F09093C4048091C3048F3F41F4109288
:10386000C3048091C2048F5F8093C20403C08F5F42
:103870008093C30489E391E002C080E090E09093DC
:10388000BB078093BA07892B09F452C08091C40604
:1038900081608093C406809105078370833079F43A
:1038A0008091C5079091C607892B49F48091BF0785
:1038B0009091C00792609093C0078093BF0780915A
:1038C000BF079091C007009799F12091C5073091EB
:1038D000C607232B69F52091BF0627FF29C020E0EA
:1038E00030E0A601022E02C0440F551F0A94E2F7F1
:1038F00048235923452BE1F42F5F3F4F2A303105F0
:1039000081F79B7F9093C0078093BF078091BA0790
:103910000E94C10A8091BB070E94C10A7092C6072B
:103920006092C50703E510E01093BB070093BA0748
:1039300080E090E0892B11F40C94A6110E94000005
:103940000C94A611CA019A959093B2068093B10681
:103950002091AF063091B006A9014F5F5F4F4F3FF6
:10396000510509F028F45093B0064093AF06AECD50
:103970002F5F31093093B0062093AF066091CA06DD
:1039800070E0860F971F8F3F910509F028F4909300
:10399000B2068093B1061AC09A959093B2068093AE
:1039A000B1068091CC0690E0280F391F3093B00605
:1039B0002093AF062F3F310549F040F07093B206D7
:1039C0006093B1069093B0068093AF068E2F8A6005
:1039D0008093C706E2FF7ACD60C0E6FF31C0209138
:1039E000B1063091B206240F351F3093B2062093F2
:1039F000B1062F3F310521F118F18091CA0690E000
:103A0000BC017A95260F371F2F3F310509F028F4A6
:103A10003093B2062093B10604C09093B20680930F
:103A2000B1068E2F82608093C706E0FF09C08091A7
:103A3000BF079091C00784609093C0078093BF0731
:103A40006091C70667FF42CD8091AF069091B006A6
:103A5000480F591F5093B0064093AF064F3F510592
:103A600009F008F433CD2091CC0630E0C9019A95D5
:103A7000480F591F4F3F510509F028F45093B006E5
:103A80004093AF0604C03093B0062093AF06862F54
:103A900088608093C70662FF19CD8091BF0790911F
:103AA000C00780619093C0078093BF070FCDE8EDFA
:103AB000F7E01382128288EE93E0A0E0B0E0848306
:103AC0009583A683B78387E191E0918380838FEF0D
:103AD0009FEF958784870895AA1BBB1B51E107C000
:103AE000AA1FBB1FA617B70710F0A61BB70B881F8E
:103AF000991F5A95A9F780959095BC01CD0108951D
:103B000097FB072E16F4009407D077FD09D00E948A
:103B10006C1D07FC05D03EF4909581959F4F08954C
:103B2000709561957F4F0895A1E21A2EAA1BBB1BC9
:103B3000FD010DC0AA1FBB1FEE1FFF1FA217B30779
:103B4000E407F50720F0A21BB30BE40BF50B661F8F
:103B5000771F881F991F1A9469F760957095809553
:103B600090959B01AC01BD01CF010895EE0FFF1FA1
:103B70000590F491E02D099481E090E0F8940C9484
:063B8000C11DF894FFCF07
:103B8600FFFFFFFF00E100000000000000C1808190
:103B9600000000000000007E0B050C9F0B940BE557
:063BA6000BA30BC10B0094
:00000001FF
// Snake - game by Stu
// SoftVMS - emulator by Marcus Comstedt
// Port to Arduboy - Felipe Manga
#include <avr/sleep.h>
#define WIDTH 128
#define HEIGHT 64
#define BUFFER_SIZE (WIDTH*HEIGHT/8)
#define SSD1306_COLUMNADDR 0x21
#define SSD1306_PAGEADDR 0x22
// ----- Arduboy pins -----
#define PIN_CS 12 // Display CS Arduino pin number
#define CS_PORT PORTD // Display CS port
#define CS_BIT PORTD6 // Display CS physical bit number
#define PIN_DC 4 // Display D/C Arduino pin number
#define DC_PORT PORTD // Display D/C port
#define DC_BIT PORTD4 // Display D/C physical bit number
#define PIN_RST 6 // Display reset Arduino pin number
#define RST_PORT PORTD // Display reset port
#define RST_BIT PORTD7 // Display reset physical bit number
#define SPI_MOSI_PORT PORTB
#define SPI_MOSI_BIT PORTB2
#define SPI_SCK_PORT PORTB
#define SPI_SCK_BIT PORTB1
#define RED_LED 10 /**< The pin number for the red color in the RGB LED. */
#define GREEN_LED 11 /**< The pin number for the greem color in the RGB LED. */
#define BLUE_LED 9 /**< The pin number for the blue color in the RGB LED. */
#define RED_LED_PORT PORTB
#define RED_LED_BIT PORTB6
#define GREEN_LED_PORT PORTB
#define GREEN_LED_BIT PORTB7
#define BLUE_LED_PORT PORTB
#define BLUE_LED_BIT PORTB5
// bit values for button states
// these are determined by the buttonsState() function
#define LEFT_BUTTON _BV(5) /**< The Left button value for functions requiring a bitmask */
#define RIGHT_BUTTON _BV(6) /**< The Right button value for functions requiring a bitmask */
#define UP_BUTTON _BV(7) /**< The Up button value for functions requiring a bitmask */
#define DOWN_BUTTON _BV(4) /**< The Down button value for functions requiring a bitmask */
#define A_BUTTON _BV(3) /**< The A button value for functions requiring a bitmask */
#define B_BUTTON _BV(2) /**< The B button value for functions requiring a bitmask */
#define PIN_LEFT_BUTTON A2
#define LEFT_BUTTON_PORT PORTF
#define LEFT_BUTTON_BIT PORTF5
#define PIN_RIGHT_BUTTON A1
#define RIGHT_BUTTON_PORT PORTF
#define RIGHT_BUTTON_BIT PORTF6
#define PIN_UP_BUTTON A0
#define UP_BUTTON_PORT PORTF
#define UP_BUTTON_BIT PORTF7
#define PIN_DOWN_BUTTON A3
#define DOWN_BUTTON_PORT PORTF
#define DOWN_BUTTON_BIT PORTF4
#define PIN_A_BUTTON 7
#define A_BUTTON_PORT PORTE
#define A_BUTTON_BIT PORTE6
#define PIN_B_BUTTON 8
#define B_BUTTON_PORT PORTB
#define B_BUTTON_BIT PORTB4
#define PIN_SPEAKER_1 5 /**< The pin number of the first lead of the speaker */
#define PIN_SPEAKER_2 13 /**< The pin number of the second lead of the speaker */
#define SPEAKER_1_PORT PORTC
#define SPEAKER_1_DDR DDRC
#define SPEAKER_1_BIT PORTC6
#define SPEAKER_2_PORT PORTC
#define SPEAKER_2_DDR DDRC
#define SPEAKER_2_BIT PORTC7
#define RAND_SEED_IN A4 // Open analog input used for noise by initRandomSeed()
#define RAND_SEED_IN_PORTF
#define RAND_SEED_IN_BIT PORTF1
// Value for ADMUX to read the random seed pin: 2.56V reference, ADC1
#define RAND_SEED_IN_ADMUX (_BV(REFS0) | _BV(REFS1) | _BV(MUX0))
// -----------------------
// #include "vmu.hpp"
// VMU.HPP ////////////////////////////////////////////////////////////////////
#define SGNEXT(n) ((n)&0x80? (n)-0x100:(n))
#ifndef BIG
#define BIG
#endif
#ifndef O_BINARY
#define O_BINARY 0
#endif
unsigned char ram[2][0x100]; // 512 bytes
unsigned char sfr[0x100]; // 256 bytes
#ifdef TRACE
unsigned char xram[2][0x80]; // third page is for BIOS only
#else
unsigned char xram[3][0x80]; // 384 bytes
#endif
unsigned char wram[0x200]; // 512 bytes
// BIG unsigned char flash[0x20000];
// BIG unsigned char bios[0x10000];
extern const unsigned char flash[];
extern const unsigned char bios[];
// this is a LUT. If the number of bits in ACC is odd, this returns 1. Zero otherwise.
//unsigned char parity[0x100]; // 256 bytes
// total: 1920 bytes
inline uint8_t parity( uint8_t v ){
v ^= v>>4;
v ^= v>>2;
v ^= v>>1;
return v & 1;
}
const unsigned char * rom;
#define ROM(x) (pgm_read_byte(rom + (x)))
#define sound(x)
inline void keypress(int i)
{
sfr[0x4c]&=~(1<<i);
if(sfr[0x4e]&4)
sfr[0x4e]|=2;
}
inline void keyrelease(int i)
{
sfr[0x4c]|=(1<<i);
if(sfr[0x4e]&4)
sfr[0x4e]|=2;
}
uint16_t pc, intreq, imask;
uint8_t lcd_updated, lcdon;
const uint8_t hasbios=0;
uint16_t spd;
uint16_t t0h, t0l, t0base, t0scale;
uint16_t t1h, t1l;
extern const int gamesize;
struct tm {
uint16_t tm_year,
tm_mon,
tm_mday,
tm_hour,
tm_min,
tm_sec;
};
inline struct tm localtime(){
uint32_t t = millis();
tm tt;
tt.tm_year = 117;
tt.tm_mon = 0;
tt.tm_mday = 1;
tt.tm_hour = 1;
tt.tm_min = 0;
tt.tm_sec = t / 1000;
return tt;
}
inline int tobcd(int n)
{
return ((n/10)<<4)|(n%10);
}
void writemem(uint16_t addr, uint8_t value)
{
value &= 0xff;
if(addr<0x100) {
ram[(sfr[0x01]&2)>>1][addr] = value;
return;
}
if(addr>=0x180) {
uint8_t b = sfr[0x25];
if(b>2 || (b==2 && addr>=0x186))
return;
xram[b][addr-0x180]=value;
if(lcdon)
lcd_updated = 1;
} else switch(addr) {
case 0x100:
sfr[0x01] = (sfr[0x01]&0xfe)|parity(value);
break;
case 0x10d:
if((value&1) != (sfr[0x0d]&1)) {
if(pc>0xfffd || ROM(pc)!=0x21){
// error_msg("EXT 0 changed without following JMPF. pc = %04x", pc&0xffff);
}else
pc = (ROM(pc+1)<<8)|ROM(pc+2);
if(hasbios)
rom = ((value&1)? flash : bios);
}
break;
case 0x10e:
switch(value&0xa0) {
case 0x00: spd = 3000; break;
case 0x20: spd = 164; break;
case 0x80: spd = 6000; break;
case 0xa0: spd = 328; break;
}
break;
case 0x110:
if(!(value&0x40))
t0l = sfr[0x13];
if(!(value&0x80))
t0h = sfr[0x15];
break;
case 0x111:
t0scale = 256-value;
t0base = 0;
break;
case 0x113:
if(!(sfr[0x10]&0x40))
t0l = value;
break;
case 0x115:
if(!(sfr[0x10]&0x80))
t0h = value;
break;
case 0x118:
if(!(value&0x40))
t1l = sfr[0x1b];
if(!(value&0x80))
t1h = sfr[0x1d];
break;
case 0x11b:
if(!(sfr[0x18]&0x40))
t1l = value;
break;
case 0x11d:
if(!(sfr[0x18]&0x80))
t1h = value;
break;
case 0x122:
if(lcdon)
lcd_updated = 1;
break;
case 0x127:
if((!!(value&0x80)) != lcdon) {
lcdon = !!(value&0x80);
lcdrefresh();
}
break;
case 0x166:
wram[0x1ff&((sfr[0x65]<<8)|sfr[0x64])] = value;
if(sfr[0x63]&0x10)
if(!++sfr[0x64])
sfr[0x65]^=1;
return;
}
/*
if(addr>0x10e && addr<0x120 && addr != 0x118)
fprintf(stderr, "%04x: Write to %03x: %02x\n", pc, addr, value);
*/
sfr[addr&0xff] = value;
if(addr == 0x118 || addr == 0x11b) {
/* Check for sound... */
if(sfr[0x18]&0x40)
sound(32768/((256-sfr[0x1b])*6));
else
sound(-1);
}
}
uint8_t readmem(uint16_t addr)
{
uint8_t r;
if(addr<0x100)
return ram[(sfr[0x01]&2)>>1][addr];
if(addr>=0x180) {
uint8_t b = sfr[0x25];
if(b>2)
return 0xff;
return xram[b][addr-0x180];
} else switch(addr) {
case 0x112:
return t0l;
case 0x114:
return t0h;
case 0x11b:
return t1l;
case 0x11d:
return t1h;
case 0x15c:
return 2;
case 0x165:
return 0xfe|(sfr[0x65]&1);
case 0x166:
r = wram[0x1ff&((sfr[0x65]<<8)|sfr[0x64])];
if(sfr[0x63]&0x10)
if(!++sfr[0x64])
sfr[0x65]^=1;
return r;
}
/*
if(addr>0x106 && addr<0x180)
fprintf(stderr, "%04x: Read from %03x: %02x\n", pc, addr, sfr[addr&0xff]);
*/
return sfr[addr&0xff];
}
uint16_t readlatch( uint16_t addr)
{
switch(addr) {
case 0x11b:
case 0x11d:
return 0xff;
default:
return readmem(addr);
}
}
void push(uint8_t n)
{
writemem(0x106, readmem(0x106)+1);
ram[0][readmem(0x106)]=n;
}
uint8_t pop()
{
uint8_t r = ram[0][readmem(0x106)];
writemem(0x106, readmem(0x106)-1);
return r;
}
void resetcpu()
{
int i;
struct tm tm_ = localtime();
tm *tm = &tm_;
memset(ram, 0, sizeof(ram));
memset(xram, 0, sizeof(xram));
memset(wram, 0, sizeof(wram));
memset(sfr, 0, sizeof(sfr));
sfr[0x06] = 0x7f;
sfr[0x4c] = 0xff;
sfr[0x01] = 0x02;
t0h = t0l = 0;
t1h = t1l = 0;
t0base = 0;
t0scale = 256;
ram[0][0x10] = tobcd(tm->tm_year/100+19);
ram[0][0x11] = tobcd(tm->tm_year%100);
ram[0][0x12] = tobcd(tm->tm_mon+1);
ram[0][0x13] = tobcd(tm->tm_mday);
ram[0][0x14] = tobcd(tm->tm_hour);
ram[0][0x15] = tobcd(tm->tm_min);
ram[0][0x17] = (tm->tm_year+1900)>>8;
ram[0][0x18] = (tm->tm_year+1900)&0xff;
ram[0][0x19] = tm->tm_mon+1;
ram[0][0x1a] = tm->tm_mday;
ram[0][0x1b] = tm->tm_hour;
ram[0][0x1c] = tm->tm_min;
ram[0][0x1d] = tm->tm_sec;
ram[0][0x31] = 0xff;
sfr[0x08] = 0x80;
writemem(0x10e, 0x81);
lcd_updated = 0;
lcdon = 0;
imask = 0;
intreq = 0;
if(hasbios) {
sfr[0x0d] = 0;
rom = bios;
pc = 0x1f0;
} else {
sfr[0x0d] = 1;
rom = flash;
pc = 0;
writemem(0x125, 2);
writemem(0x182, 0x10);
writemem(0x125, 0);
writemem(0x127, 0x80);
}
sound(-1);
}
uint8_t month_days()
{
uint8_t m = ram[0][0x19];
if(m==2) {
uint16_t y = ram[0][0x18] | (ram[0][0x17] << 8);
if(y&3)
return 28;
if(!(y%4000))
return 29;
if(!(y%1000))
return 28;
if(!(y%400))
return 29;
if(!(y%100))
return 28;
return 29;
} else return (m>7? ((m&1)? 30:31) : ((m&1)? 31:30));
}
int handle_fwcall(int pc)
{
switch(pc) {
case 0x100:
{
int i, a = ((ram[1][0x7d]<<16)|(ram[1][0x7e]<<8)|ram[1][0x7f])&0x1ffff;
if(a>=gamesize)
writemem(0x100, 0xff);
else {
writemem(0x100, 0x00);
// for(i=0; i<0x80; i++)
// flash[(a&~0xff)|((a+i)&0xff)] = ram[1][i+0x80];
//#ifdef __DC__
// if(!flash_written(a))
writemem(0x100, 0xff);
//#endif
}
/*
fprintf(stderr, "ROM write @ %05x:\n", a);
for(i=0; i<0x80; i++)
fprintf(stderr, " %02x", ram[1][i+0x80]);
fprintf(stderr, "\n");
*/
}
return 0x105;
case 0x110:
{
int i, a = ((ram[1][0x7d]<<16)|(ram[1][0x7e]<<8)|ram[1][0x7f])&0x1ffff;
int r = 0;
for(i=0; i<0x80; i++)
if((r = (ROM((a&~0xff)|((a+i)&0xff)) ^ ram[1][i+0x80])) != 0)
break;
writemem(0x100, r);
}
return 0x115;
case 0x120:
{
int i, a = ((ram[1][0x7d]<<16)|(ram[1][0x7e]<<8)|ram[1][0x7f])&0x1ffff;
for(i=0; i<0x80; i++)
ram[1][i+0x80] = ROM( (a&~0xff)|((a+i)&0xff) );
/*
fprintf(stderr, "ROM read @ %05x\n", a);
*/
}
return 0x125;
case 0x130:
if(!((ram[0][0x1e]^=1)&1))
if(++ram[0][0x1d]>=60) {
ram[0][0x1d] = 0;
if(++ram[0][0x1c]>=60) {
ram[0][0x1c] = 0;
if(++ram[0][0x1b]>=24) {
ram[0][0x1b] = 0;
if(++ram[0][0x1a]>month_days()) {
ram[0][0x1a] = 1;
if(++ram[0][0x19]>=13) {
ram[0][0x19] = 1;
if(ram[0][0x18]==0xff) {
ram[0][0x18]=0;
ram[0][0x17]++;
} else
ram[0][0x18]++;
}
}
}
}
}
return 0x139;
case 0x1f0:
return 0;
default:
// error_msg("Firmware entered at unknown vector %04x!", pc);
return 0;
}
}
uint16_t mcy, tick, sleepCount = 0;
void run_cpu()
{
if( sleepCount-- <= 0 ){
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_mode();
sleepCount = 6;
}
// struct timeval epoch;
// GETTIMEOFDAY(&epoch);
// for(;;) {
int r, s;
uint8_t c;
uint8_t cy = 1;
uint8_t i = ROM(pc);
/* * /
#ifdef TRACE
{
char tmp[20];
snprintf(tmp, 20, "%04x: %02x", pc, i );
Serial.println( tmp );
delay(50);
}
#endif
/* */
pc++;
pc &= 0xffff;
switch(i&0xf) {
case 0:
switch(i>>4) {
case 0:
break;
case 1:
cy = 4;
push((pc+2)&0xff);
push(((pc+2)&0xff00)>>8);
pc = 0xffff&(pc+1+ROM(pc)+((ROM((pc+1)&0xffff))<<8));
break;
case 2:
cy = 2;
push((pc+2)&0xff);
push(((pc+2)&0xff00)>>8);
pc = (ROM(pc)<<8)|ROM((pc+1)&0xffff);
break;
case 3:
cy = 7;
{
int r32 = readmem(0x102)*((readmem(0x100)<<8)|readmem(0x103));
writemem(0x101, (readmem(0x101)&0x7b)|(r>65535? 4:0));
writemem(0x103, r32&0xff);
writemem(0x100, (r32&0xff00)>>8);
writemem(0x102, (r32&0xff0000)>>16);
}
break;
case 4:
cy = 7;
r = readmem(0x102);
if(r) {
int v = (readmem(0x100)<<8)|readmem(0x103);
s = v%r;
r = v/r;
} else {
r = 0xff00|readmem(0x103);
s = 0;
}
writemem(0x101, (readmem(0x101)&0x7b)|(s? 0:4));
writemem(0x103, r&0xff);
writemem(0x100, (r&0xff00)>>8);
writemem(0x102, s);
break;
case 5:
cy = 2; /* ? */
writemem(0x100, ROM( 0x1ffff&(uint16_t(readmem(0x104))+(uint16_t(readmem(0x105))<<8)+
uint16_t((readmem(0x154))<<16)) ));
break;
case 6:
cy = 2;
push(readmem(ROM(pc++)));
pc &= 0xffff;
break;
case 7:
cy = 2;
writemem(ROM(pc++), pop());
pc &= 0xffff;
break;
case 8:
cy = 2;
if(readmem(0x100)==0)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 9:
cy = 2;
if(readmem(0x100)!=0)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 0xa:
cy = 2;
r = pop()<<8;
r |= pop();
pc = r;
break;
case 0xb:
cy = 2;
r = pop()<<8;
r |= pop();
pc = r;
--imask;
break;
case 0xc:
r = readmem(0x100);
writemem(0x100, (r>>1)|((r&1)<<7));
break;
case 0xd:
r = readmem(0x100);
s = readmem(0x101);
writemem(0x101, (s&0x7f)|((r&1)<<7));
writemem(0x100, (r>>1)|(s&0x80));
break;
case 0xe:
r = readmem(0x100);
writemem(0x100, (r<<1)|((r&0x80)>>7));
break;
case 0xf:
r = readmem(0x100);
s = readmem(0x101);
writemem(0x101, (s&0x7f)|(r&0x80));
writemem(0x100, (r<<1)|((s&0x80)>>7));
break;
}
break;
case 1:
switch(i>>4) {
case 0:
cy = 2;
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
break;
case 1:
cy = 4;
pc = 0xffff&(pc+1+ROM(pc)+((ROM((pc+1)&0xffff))<<8));
break;
case 2:
cy = 2;
pc = (ROM(pc)<<8)|ROM((pc+1)&0xffff);
break;
case 3:
cy = 2;
r = readmem(0x100);
writemem(0x101, (readmem(0x101)&0x7f)|(r<ROM(pc)? 0x80:0));
s = (r == ROM(pc++));
pc &= 0xffff;
if(s)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 4:
cy = 2;
r = readmem(0x100);
writemem(0x101, (readmem(0x101)&0x7f)|(r<ROM(pc)? 0x80:0));
s = (r != ROM(pc++));
pc &= 0xffff;
if(s)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 5:
cy = 2; /* ? */
/*
if(!(readmem(0x154)&2))
flash[0x1ffff&(readmem(0x104)+(readmem(0x105)<<8)+
(readmem(0x154)<<16))] = readmem(0x100);
*/
break;
case 6:
cy = 2;
push(readmem(0x100|ROM(pc++)));
pc &= 0xffff;
break;
case 7:
cy = 2;
writemem(0x100|ROM(pc++), pop());
pc &= 0xffff;
break;
case 8:
r = readmem(0x100);
s = ROM(pc++);
pc &= 0xffff;
writemem(0x100, r+s);
writemem(0x101, (readmem(0x101)&0x3b)|(r+s>255? 0x80:0)|
((r&15)+(s&15)>15? 0x40:0)|((0x80&(~r^s)&(s^(r+s)))? 4:0));
break;
case 9:
r = readmem(0x100);
s = ROM(pc++);
pc &= 0xffff;
c = (readmem(0x101)&0x80)>>7;
writemem(0x100, r+s+c);
writemem(0x101, (readmem(0x101)&0x3b)|(r+s+c>255? 0x80:0)|
((r&15)+(s&15)+c>15? 0x40:0)|
((0x80&(~r^s)&(s^(r+s+c)))? 4:0));
break;
case 0xa:
/* FIXME: OV */
r = readmem(0x100);
s = ROM(pc++);
pc &= 0xffff;
writemem(0x100, r-s);
writemem(0x101, (readmem(0x101)&0x3b)|(r-s<0? 0x80:0)|
((r&15)-(s&15)<0? 0x40:0)|(0? 4:0));
break;
case 0xb:
/* FIXME: OV */
r = readmem(0x100);
s = ROM(pc++);
pc &= 0xffff;
c = (readmem(0x101)&0x80)>>7;
writemem(0x100, r-s-c);
writemem(0x101, (readmem(0x101)&0x3b)|(r-s-c<0? 0x80:0)|
((r&15)-(s&15)-c<0? 0x40:0)|(0? 4:0));
break;
case 0xc:
cy = 2;
writemem(0x100, ROM(0xffff&(readmem(0x100)+readmem(0x104)+
(readmem(0x105)<<8))));
break;
case 0xd:
writemem(0x100, readmem(0x100)|ROM(pc++));
pc &= 0xffff;
break;
case 0xe:
writemem(0x100, readmem(0x100)&ROM(pc++));
pc &= 0xffff;
break;
case 0xf:
writemem(0x100, readmem(0x100)^ROM(pc++));
pc &= 0xffff;
break;
}
break;
case 2:
case 3:
r = ((i&1)<<8)|ROM(pc++);
pc &= 0xffff;
switch(i>>4) {
case 0:
writemem(0x100, readmem(r));
break;
case 1:
writemem(r, readmem(0x100));
break;
case 2:
cy = 2;
writemem(r, ROM(pc++));
pc &= 0xffff;
break;
case 3:
cy = 2;
s = readmem(r);
r = readmem(0x100);
writemem(0x101, (readmem(0x101)&0x7f)|(r<s? 0x80:0));
if(r == s)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 4:
cy = 2;
s = readmem(r);
r = readmem(0x100);
writemem(0x101, (readmem(0x101)&0x7f)|(r<s? 0x80:0));
if(r != s)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 5:
cy = 2;
s = (readlatch(r)-1)&0xff;
writemem(r, s);
if(s != 0)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 6:
writemem(r, readlatch(r)+1);
break;
case 7:
writemem(r, readlatch(r)-1);
break;
case 8:
s = readmem(r);
r = readmem(0x100);
writemem(0x100, r+s);
writemem(0x101, (readmem(0x101)&0x3b)|(r+s>255? 0x80:0)|
((r&15)+(s&15)>15? 0x40:0)|((0x80&(~r^s)&(s^(r+s)))? 4:0));
break;
case 9:
s = readmem(r);
r = readmem(0x100);
c = (readmem(0x101)&0x80)>>7;
writemem(0x100, r+s+c);
writemem(0x101, (readmem(0x101)&0x3b)|(r+s+c>255? 0x80:0)|
((r&15)+(s&15)+c>15? 0x40:0)|
((0x80&(~r^s)&(s^(r+s+c)))? 4:0));
break;
case 0xa:
/* FIXME: OV */
s = readmem(r);
r = readmem(0x100);
writemem(0x100, r-s);
writemem(0x101, (readmem(0x101)&0x3b)|(r-s<0? 0x80:0)|
((r&15)-(s&15)<0? 0x40:0)|(0? 4:0));
break;
case 0xb:
/* FIXME: OV */
s = readmem(r);
r = readmem(0x100);
c = (readmem(0x101)&0x80)>>7;
writemem(0x100, r-s-c);
writemem(0x101, (readmem(0x101)&0x3b)|(r-s-c<0? 0x80:0)|
((r&15)-(s&15)-c<0? 0x40:0)|(0? 4:0));
break;
case 0xc:
s = readmem(r);
writemem(r, readmem(0x100));
writemem(0x100, s);
break;
case 0xd:
writemem(0x100, readmem(0x100)|readmem(r));
break;
case 0xe:
writemem(0x100, readmem(0x100)&readmem(r));
break;
case 0xf:
writemem(0x100, readmem(0x100)^readmem(r));
break;
}
break;
case 4:
case 5:
case 6:
case 7:
r = readmem((i&3)|((readmem(0x101)>>1)&0xc))|((i&2)? 0x100 : 0);
switch(i>>4) {
case 0:
writemem(0x100, readmem(r));
break;
case 1:
writemem(r, readmem(0x100));
break;
case 2:
writemem(r, ROM(pc++));
pc &= 0xffff;
break;
case 3:
cy = 2;
s = readmem(r);
r = ROM(pc++);
pc &= 0xffff;
writemem(0x101, (readmem(0x101)&0x7f)|(s<r? 0x80:0));
if(r == s)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 4:
cy = 2;
s = readmem(r);
r = ROM(pc++);
pc &= 0xffff;
writemem(0x101, (readmem(0x101)&0x7f)|(s<r? 0x80:0));
if(r != s)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 5:
cy = 2;
s = (readlatch(r)-1)&0xff;
writemem(r, s);
if(s != 0)
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 6:
writemem(r, readlatch(r)+1);
break;
case 7:
writemem(r, readlatch(r)-1);
break;
case 8:
s = readmem(r);
r = readmem(0x100);
writemem(0x100, r+s);
writemem(0x101, (readmem(0x101)&0x3b)|(r+s>255? 0x80:0)|
((r&15)+(s&15)>15? 0x40:0)|((0x80&(~r^s)&(s^(r+s)))? 4:0));
break;
case 9:
s = readmem(r);
r = readmem(0x100);
c = (readmem(0x101)&0x80)>>7;
writemem(0x100, r+s+c);
writemem(0x101, (readmem(0x101)&0x3b)|(r+s+c>255? 0x80:0)|
((r&15)+(s&15)+c>15? 0x40:0)|
((0x80&(~r^s)&(s^(r+s+c)))? 4:0));
break;
case 0xa:
/* FIXME: OV */
s = readmem(r);
r = readmem(0x100);
writemem(0x100, r-s);
writemem(0x101, (readmem(0x101)&0x3b)|(r-s<0? 0x80:0)|
((r&15)-(s&15)<0? 0x40:0)|(0? 4:0));
break;
case 0xb:
/* FIXME: OV */
s = readmem(r);
r = readmem(0x100);
c = (readmem(0x101)&0x80)>>7;
writemem(0x100, r-s-c);
writemem(0x101, (readmem(0x101)&0x3b)|(r-s-c<0? 0x80:0)|
((r&15)-(s&15)-c<0? 0x40:0)|(0? 4:0));
break;
case 0xc:
s = readmem(r);
writemem(r, readmem(0x100));
writemem(0x100, s);
break;
case 0xd:
writemem(0x100, readmem(0x100)|readmem(r));
break;
case 0xe:
writemem(0x100, readmem(0x100)&readmem(r));
break;
case 0xf:
writemem(0x100, readmem(0x100)^readmem(r));
break;
}
break;
default:
switch(i&0xe0) {
case 0x00:
cy = 2;
r = ((i&7)<<8)|((i&0x10)<<7)|ROM(pc++);
push(pc&0xff);
push((pc&0xff00)>>8);
pc = (pc&0xf000)|r;
break;
case 0x20:
cy = 2;
r = ((i&7)<<8)|((i&0x10)<<7)|ROM(pc++);
pc = (pc&0xf000)|r;
break;
case 0x40:
cy = 2;
r = ((i&0x10)<<4)|ROM(pc++);
pc &= 0xffff;
if((s=readmem(r))&(1<<(i&7))) {
writemem(r, s & ~(1<<(i&7)));
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
} else {
pc++;
pc &= 0xffff;
}
break;
case 0x60:
cy = 2;
r = ((i&0x10)<<4)|ROM(pc++);
pc &= 0xffff;
if(readmem(r)&(1<<(i&7)))
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 0x80:
cy = 2;
r = ((i&0x10)<<4)|ROM(pc++);
pc &= 0xffff;
if(!(readmem(r)&(1<<(i&7))))
pc = 0xffff&(pc+1+SGNEXT(ROM(pc)));
else {
pc++;
pc &= 0xffff;
}
break;
case 0xa0:
r = ((i&0x10)<<4)|ROM(pc++);
pc &= 0xffff;
writemem(r, readlatch(r) ^ (1<<(i&7)));
break;
case 0xc0:
r = ((i&0x10)<<4)|ROM(pc++);
pc &= 0xffff;
writemem(r, readlatch(r) & ~(1<<(i&7)));
break;
case 0xe0:
r = ((i&0x10)<<4)|ROM(pc++);
pc &= 0xffff;
writemem(r, readlatch(r) | (1<<(i&7)));
break;
}
break;
}
mcy += cy;
if(mcy>=spd) {
// struct timeval now, t;
if(lcd_updated)
lcdrefresh();
/*
GETTIMEOFDAY(&now);
if((epoch.tv_usec += 10000)>=1000000) {
epoch.tv_usec -= 1000000;
epoch.tv_sec++;
}
if(now.tv_sec>epoch.tv_sec ||
(now.tv_sec == epoch.tv_sec && now.tv_usec >= epoch.tv_usec)) {
t.tv_usec = 0;
t.tv_sec = 0;
} else if(epoch.tv_usec<now.tv_usec) {
t.tv_usec = 1000000 + epoch.tv_usec - now.tv_usec;
t.tv_sec = epoch.tv_sec - now.tv_sec - 1;
} else {
t.tv_usec = epoch.tv_usec - now.tv_usec;
t.tv_sec = epoch.tv_sec - now.tv_sec;
}
waitforevents(&t);
*/
checkevents();
mcy -= spd;
++tick;
if(tick>=50) {
intreq |= 1<<3;
tick -= 50;
}
}
/* Timer 0 */
if(sfr[0x10] & 0xc0) {
int c0=0;
if((t0base+=cy) >= t0scale)
do
c0++;
while((t0base-=t0scale) >= t0scale);
if(c0)
if((sfr[0x10] & 0xe0) == 0xe0) {
t0l += c0;
if(t0l>=256) {
t0l -= 256;
if(++t0h >= 256) {
t0h -= 256;
if((t0l += sfr[0x13])>=256) {
t0l -= 256;
if((t0h += sfr[0x15])>=256) {
t0l = sfr[0x13];
t0h = sfr[0x15];
}
}
sfr[0x10] |= 10;
if(sfr[0x10]&4)
intreq |= 1<<4;
}
}
} else {
if(sfr[0x10] & 0x40) {
t0l += c0;
if(t0l>=256) {
t0l -= 256;
if((t0l += sfr[0x13])>=256)
t0l = sfr[0x13];
sfr[0x10] |= 2;
if(sfr[0x10]&1)
intreq |= 1<<2;
}
}
if(sfr[0x10] & 0x80) {
t0h += c0;
if(t0h>=256) {
t0h -= 256;
if((t0h += sfr[0x15])>=256)
t0h = sfr[0x15];
sfr[0x10] |= 8;
if(sfr[0x10]&4)
intreq |= 1<<4;
}
}
}
}
/* Timer 1 */
if(sfr[0x18] & 0xc0) {
if((sfr[0x18] & 0xe0) == 0xe0) {
t1l += cy;
if(t1l>=256) {
t1l -= 256;
if(++t1h >= 256) {
t1h -= 256;
if((t1l += sfr[0x1b])>=256) {
t1l -= 256;
if((t1h += sfr[0x1d])>=256) {
t1l = sfr[0x1b];
t1h = sfr[0x1d];
}
}
sfr[0x18] |= 10;
if(sfr[0x18]&4)
intreq |= 1<<5;
}
}
} else {
if(sfr[0x18] & 0x40) {
t1l += cy;
if(t1l>=256) {
t1l -= 256;
if((t1l += sfr[0x1b])>=256)
t1l = sfr[0x1b];
sfr[0x18] |= 2;
if(sfr[0x18]&1)
intreq |= 1<<5;
}
}
if(sfr[0x18] & 0x80) {
t1h += cy;
if(t1h>=256) {
t1h -= 256;
if((t1h += sfr[0x1d])>=256)
t1h = sfr[0x1d];
sfr[0x18] |= 8;
if(sfr[0x18]&4)
intreq |= 1<<5;
}
}
}
}
if(!(sfr[0x0d]&1) && !hasbios)
if(!(pc=handle_fwcall(pc)))
return;
else
sfr[0x0d]|=1;
if((sfr[0x4e]&3)==3 && !imask)
intreq |= 1<<9;
if(!intreq || imask || !(sfr[0x08]&0x80))
return;
for(r=0; r<10; r++)
if(intreq & (1<<r))
return;
intreq &= ~(1<<r);
push(pc&0xff);
push((pc&0xff00)>>8);
imask++;
pc = ((r&~1)<<3)+((r&1)?0xb:0x3);
// }
}
// SRC.INO ////////////////////////////////////////////////////////////////////
const uint8_t PROGMEM lcdBootProgram[] = {
// boot defaults are commented out but left here in case they
// might prove useful for reference
//
// Further reading: https://www.adafruit.com/datasheets/SSD1306.pdf
//
// Display Off
// 0xAE,
// Set Display Clock Divisor v = 0xF0
// default is 0x80
0xD5, 0xF0,
// Set Multiplex Ratio v = 0x3F
// 0xA8, 0x3F,
// Set Display Offset v = 0
// 0xD3, 0x00,
// Set Start Line (0)
// 0x40,
// Charge Pump Setting v = enable (0x14)
// default is disabled
0x8D, 0x14,
// Set Segment Re-map (A0) | (b0001)
// default is (b0000)
0xA1,
// Set COM Output Scan Direction
0xC8,
// Set COM Pins v
// 0xDA, 0x12,
// Set Contrast v = 0xCF
0x81, 0xCF,
// Set Precharge = 0xF1
0xD9, 0xF1,
// Set VCom Detect
// 0xDB, 0x40,
// Entire Display ON
// 0xA4,
// Set normal/inverse display
// 0xA6,
// Display On
0xAF,
// set display mode = horizontal addressing mode (0x00)
0x20, 0x00,
// set col address range
// 0x21, 0x00, COLUMN_ADDRESS_END,
// set page address range
// 0x22, 0x00, PAGE_ADDRESS_END
};
class Arduboy {
public:
void delayShort(uint16_t ms)
{
delay((unsigned long) ms);
}
void bootOLED(){
// reset the display
delayShort(5); // reset pin should be low here. let it stay low a while
bitSet(RST_PORT, RST_BIT); // set high to come out of reset
delayShort(5); // wait a while
// select the display (permanently, since nothing else is using SPI)
bitClear(CS_PORT, CS_BIT);
// run our customized boot-up command sequence against the
// OLED to initialize it properly for Arduboy
LCDCommandMode();
for (uint8_t i = 0; i < sizeof(lcdBootProgram); i++) {
SPItransfer(pgm_read_byte(lcdBootProgram + i));
}
LCDDataMode();
for (uint16_t i = WIDTH * HEIGHT / 8; i--; )
SPItransfer(0xFF);
}
// 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){}
// 0x00: Black background, white pixels (inverted).
// 0xFF: White BG, black pixels (like the original)
const uint8_t TOG = 0xFF;
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, 0x6e, 0x61, 0x6b, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
/*[210]*/ 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x62, 0x79, 0x20, 0x53, 0x2e, 0x6c, 0x6f,
/*[220]*/ 0x63, 0x6f, 0x63, 0x6b, 0x40, 0x62, 0x74, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e,
/*[230]*/ 0x63, 0x6f, 0x6d, 0x20, 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]*/ 0x0, 0xf0, 0x0, 0xff, 0xf0, 0xf0, 0xf, 0xf0, 0xf0, 0xff, 0xff, 0xfa, 0x1f, 0xff, 0xff, 0xff,
/*[270]*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
/*[280]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[290]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[2a0]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[2b0]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[2c0]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[2d0]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[2e0]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[2f0]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[300]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[310]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[320]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[330]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[340]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[350]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[360]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[370]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[380]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[390]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[3a0]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[3b0]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[3c0]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[3d0]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[3e0]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[3f0]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[400]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[410]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[420]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[430]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[440]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[450]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[460]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[470]*/ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
/*[480]*/ 0x23, 0xe, 0xa1, 0x23, 0x20, 0x9, 0x23, 0x27, 0x80, 0xd8, 0x4e, 0xdf, 0x44, 0x23, 0x4c, 0xff,
/*[490]*/ 0xd9, 0x1, 0x2, 0x1c, 0xf2, 0x1d, 0xf9, 0x1, 0x12, 0xc4, 0x23, 0x4, 0x71, 0x23, 0x5, 0xa,
/*[4a0]*/ 0x18, 0xb4, 0xd, 0x67, 0x18, 0x80, 0x22, 0x30, 0x5, 0x22, 0x81, 0x1e, 0x22, 0xc0, 0x5, 0x22,
/*[4b0]*/ 0xc1, 0x4, 0x22, 0xc2, 0x5, 0x22, 0xc3, 0xc8, 0x22, 0x30, 0x0, 0x23, 0x2, 0x18, 0xe, 0x8b,
/*[4c0]*/ 0x23, 0x2, 0xf, 0xe, 0x9d, 0x23, 0x2, 0x17, 0x22, 0x30, 0x1, 0xe, 0x8b, 0x23, 0x2, 0xf,
/*[4d0]*/ 0xe, 0x9d, 0x23, 0x2, 0x16, 0x22, 0x30, 0x2, 0xe, 0x8b, 0x23, 0x2, 0xf, 0xe, 0x9d, 0x23,
/*[4e0]*/ 0x2, 0x15, 0x22, 0x30, 0x3, 0xe, 0x8b, 0x23, 0x2, 0xf, 0xe, 0x9d, 0x23, 0x2, 0x14, 0x22,
/*[4f0]*/ 0x30, 0x4, 0xe, 0x8b, 0x23, 0x2, 0xf, 0xe, 0x9d, 0x22, 0xce, 0x4, 0x22, 0xcf, 0x0, 0xd,
/*[500]*/ 0xe4, 0xd, 0x80, 0xe, 0x9, 0xe, 0x12, 0x2, 0xce, 0x12, 0x30, 0xe, 0x95, 0x12, 0xc8, 0x2,
/*[510]*/ 0xce, 0x12, 0x30, 0xe, 0xa7, 0x12, 0xc9, 0x62, 0xce, 0x2, 0xce, 0x41, 0x32, 0x3, 0x22, 0xce,
/*[520]*/ 0x0, 0x2, 0xc9, 0x13, 0x2, 0x2, 0xce, 0x12, 0x30, 0xe, 0x9d, 0x2, 0xc8, 0x13, 0x2, 0x2,
/*[530]*/ 0xce, 0x12, 0x30, 0xe, 0x8b, 0xe, 0x21, 0x2, 0xce, 0x12, 0x30, 0xe, 0x95, 0x13, 0x2, 0x12,
/*[540]*/ 0xc8, 0x2, 0xce, 0x12, 0x30, 0xe, 0xa7, 0x12, 0xc9, 0xe, 0xd9, 0x62, 0xcf, 0x2, 0xcf, 0x41,
/*[550]*/ 0x32, 0x3, 0x22, 0xcf, 0x0, 0x2, 0xcf, 0x12, 0x30, 0xe, 0x95, 0x13, 0x2, 0x2, 0xcf, 0x12,
/*[560]*/ 0x30, 0xe, 0xa7, 0xf, 0x2a, 0x2d, 0x3, 0x1b, 0x31, 0x7c, 0x0, 0xfb, 0xa0, 0x1b, 0x31, 0x7d,
/*[570]*/ 0x0, 0xfb, 0xa0, 0xa0, 0x23, 0x4, 0xb1, 0x23, 0x5, 0x9, 0x18, 0xb4, 0xd, 0x67, 0x2c, 0x80,
/*[580]*/ 0x22, 0xc7, 0x1f, 0x2, 0xc7, 0x23, 0x2, 0x0, 0xe, 0xaf, 0x23, 0x2, 0x2f, 0x2, 0xc7, 0xe,
/*[590]*/ 0xaf, 0x72, 0xc7, 0x2, 0xc7, 0x90, 0xec, 0x22, 0xc7, 0x2f, 0x2, 0xc7, 0x13, 0x2, 0x23, 0x0,
/*[5a0]*/ 0x1, 0xe, 0xaf, 0x2, 0xc7, 0x13, 0x2, 0x23, 0x0, 0x1f, 0xe, 0xaf, 0x72, 0xc7, 0x2, 0xc7,
/*[5b0]*/ 0x90, 0xe8, 0xa0, 0x3, 0x2, 0x32, 0xc5, 0x1, 0xa0, 0x2, 0xc9, 0x32, 0xc6, 0x1, 0xa0, 0x72,
/*[5c0]*/ 0xcf, 0xd, 0xe4, 0xa0, 0x61, 0x2, 0x61, 0x3, 0x2, 0xc4, 0x13, 0x2, 0x23, 0x0, 0x4e, 0x23,
/*[5d0]*/ 0x3, 0x6d, 0x30, 0x13, 0x2, 0x3, 0x3, 0x81, 0x39, 0x12, 0xc4, 0x3, 0x2, 0x91, 0x30, 0x71,
/*[5e0]*/ 0x3, 0x71, 0x2, 0xa0, 0xd, 0xc4, 0x13, 0x3, 0x23, 0x0, 0x0, 0x23, 0x2, 0x1c, 0x40, 0x3,
/*[5f0]*/ 0x2, 0x63, 0x0, 0x63, 0x0, 0x12, 0xc6, 0xd, 0xc4, 0x13, 0x3, 0x23, 0x0, 0x0, 0x23, 0x2,
/*[600]*/ 0x2d, 0x40, 0x3, 0x2, 0x63, 0x0, 0x12, 0xc5, 0xa0, 0x2, 0xc5, 0x13, 0x2, 0x2, 0xc6, 0xe,
/*[610]*/ 0xaf, 0xa0, 0x1b, 0x31, 0x9a, 0x0, 0x1a, 0x99, 0x0, 0x29, 0x9b, 0x0, 0x1d, 0x98, 0x0, 0x2c,
/*[620]*/ 0xa0, 0x2, 0xc1, 0x31, 0x1, 0x3c, 0x31, 0x2, 0x53, 0x31, 0x3, 0x29, 0x31, 0x4, 0x40, 0xa0,
/*[630]*/ 0xa0, 0x2, 0xc1, 0x31, 0x4, 0x3, 0x22, 0xc1, 0x3, 0xa0, 0x2, 0xc1, 0x31, 0x3, 0x3, 0x22,
/*[640]*/ 0xc1, 0x4, 0xa0, 0x2, 0xc1, 0x31, 0x1, 0x3, 0x22, 0xc1, 0x2, 0xa0, 0x2, 0xc1, 0x31, 0x2,
/*[650]*/ 0x3, 0x22, 0xc1, 0x1, 0xa0, 0x2, 0xc8, 0x73, 0x0, 0x13, 0x2, 0x2, 0xce, 0x12, 0x30, 0xe,
/*[660]*/ 0x8b, 0xa0, 0x2, 0xc9, 0x73, 0x0, 0x13, 0x2, 0x2, 0xce, 0x12, 0x30, 0xe, 0x9d, 0xa0, 0x2,
/*[670]*/ 0xc8, 0x63, 0x0, 0x13, 0x2, 0x2, 0xce, 0x12, 0x30, 0xe, 0x8b, 0xa0, 0x2, 0xc9, 0x63, 0x0,
/*[680]*/ 0x13, 0x2, 0x2, 0xce, 0x12, 0x30, 0xe, 0x9d, 0xa0, 0x2d, 0x74, 0x2, 0x30, 0x81, 0x31, 0x12,
/*[690]*/ 0x0, 0x3, 0x2, 0x14, 0xa0, 0x2, 0x30, 0x81, 0x31, 0x12, 0x0, 0x4, 0xa0, 0x2, 0x30, 0x81,
/*[6a0]*/ 0x81, 0x12, 0x0, 0x3, 0x2, 0x14, 0xa0, 0x2, 0x30, 0x81, 0x81, 0x12, 0x0, 0x4, 0xa0, 0x23,
/*[6b0]*/ 0x25, 0x0, 0x9c, 0x0, 0x3, 0x23, 0x25, 0x1, 0x23, 0x4, 0x0, 0x23, 0x5, 0x8, 0xc1, 0x12,
/*[6c0]*/ 0x3, 0x3, 0x2, 0xc0, 0xc0, 0xc0, 0xe1, 0x1f, 0x82, 0x3, 0x12, 0x3, 0x23, 0x4, 0x20, 0x3,
/*[6d0]*/ 0x2, 0xc1, 0xdd, 0xe, 0xd7, 0x17, 0xfd, 0xe, 0xa0, 0x23, 0x25, 0x0, 0x9c, 0x0, 0x3, 0x23,
/*[6e0]*/ 0x25, 0x1, 0x23, 0x4, 0x0, 0x23, 0x5, 0x8, 0xc1, 0x12, 0x3, 0x3, 0x2, 0xc0, 0xc0, 0xc0,
/*[6f0]*/ 0xe1, 0x1f, 0x82, 0x3, 0x12, 0x3, 0x23, 0x4, 0x20, 0x3, 0x2, 0xc1, 0xdd, 0xe, 0x61, 0x0,
/*[700]*/ 0x7, 0x13, 0x2, 0x71, 0x0, 0xd7, 0x17, 0x7, 0x33, 0x2, 0x4, 0xfd, 0xe, 0x7, 0xa0, 0x2,
/*[710]*/ 0xc5, 0x32, 0xc8, 0x2, 0xd, 0x74, 0x2, 0xc6, 0x32, 0xc9, 0x2, 0xd, 0x74, 0xd, 0xe4, 0x72,
/*[720]*/ 0xcf, 0x2, 0xcf, 0x41, 0xff, 0x3, 0x22, 0xcf, 0x31, 0xa0, 0x23, 0x25, 0x0, 0x9c, 0x0, 0x3,
/*[730]*/ 0x23, 0x25, 0x1, 0x23, 0x4, 0x0, 0x23, 0x5, 0x8, 0xc1, 0x12, 0x3, 0x3, 0x2, 0xc0, 0xc0,
/*[740]*/ 0xc0, 0xe1, 0x1f, 0x82, 0x3, 0x12, 0x3, 0x23, 0x4, 0x50, 0x23, 0x5, 0x8, 0x3, 0x2, 0xc1,
/*[750]*/ 0xdd, 0xe, 0xe7, 0x17, 0xfd, 0xe, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[760]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[770]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[780]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[790]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[7a0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[7b0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[7c0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[7d0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[7e0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[7f0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[800]*/ 0x80, 0x86, 0x90, 0x96, 0xa0, 0xa6, 0xb0, 0xb6, 0xc0, 0xc6, 0xd0, 0xd6, 0xe0, 0xe6, 0xf0, 0xf6,
/*[810]*/ 0x80, 0x86, 0x90, 0x96, 0xa0, 0xa6, 0xb0, 0xb6, 0xc0, 0xc6, 0xd0, 0xd6, 0xe0, 0xe6, 0xf0, 0xf6,
/*[820]*/ 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1, 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1,
/*[830]*/ 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1, 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1,
/*[840]*/ 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1, 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1,
/*[850]*/ 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe, 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe,
/*[860]*/ 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe, 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe,
/*[870]*/ 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe, 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe,
/*[880]*/ 0xdd, 0xe, 0x61, 0x0, 0x61, 0x25, 0x60, 0x2, 0x23, 0x25, 0x0, 0x22, 0x2, 0x80, 0x26, 0x0,
/*[890]*/ 0x62, 0x2, 0x2, 0x2, 0xe1, 0xf, 0x41, 0xc, 0x6, 0x2, 0x2, 0x81, 0x4, 0x12, 0x2, 0x2,
/*[8a0]*/ 0x2, 0x90, 0xeb, 0x78, 0x25, 0x5, 0x23, 0x25, 0x1, 0x1, 0xe0, 0x70, 0x2, 0x71, 0x25, 0x71,
/*[8b0]*/ 0x0, 0xfd, 0xe, 0xa0, 0xdd, 0xe, 0x61, 0x0, 0x61, 0x25, 0x61, 0x3, 0x60, 0x2, 0x22, 0x2,
/*[8c0]*/ 0x80, 0xf3, 0x0, 0x13, 0x25, 0x13, 0x3, 0xc1, 0x16, 0x62, 0x2, 0x2, 0x2, 0xe1, 0xf, 0x41,
/*[8d0]*/ 0xc, 0xd, 0x2, 0x2, 0x81, 0x4, 0x12, 0x2, 0x90, 0x5, 0x63, 0x25, 0x22, 0x2, 0x80, 0x63,
/*[8e0]*/ 0x3, 0x3, 0x3, 0x41, 0xc0, 0xe1, 0x70, 0x2, 0x71, 0x3, 0x71, 0x25, 0x71, 0x0, 0xfd, 0xe,
/*[8f0]*/ 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[900]*/ 0x0, 0x0, 0x0, 0x1e, 0x7c, 0x42, 0x0, 0x0, 0x0, 0x10, 0x10, 0x42, 0x0, 0x0, 0x0, 0x1e,
/*[910]*/ 0x10, 0x42, 0x0, 0x0, 0x0, 0x2, 0x10, 0x42, 0x0, 0x0, 0x0, 0x1e, 0x10, 0x7e, 0x0, 0x0,
/*[920]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[930]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[940]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[950]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[960]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[970]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[980]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[990]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[9a0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[9b0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[9c0]*/ 0x0, 0x0, 0x0, 0x1, 0xf8, 0x30, 0xc6, 0x7c, 0x0, 0x1, 0x8, 0x48, 0xaa, 0x40, 0x0, 0x1,
/*[9d0]*/ 0x0, 0x84, 0x92, 0x40, 0x0, 0x1, 0x0, 0x84, 0x82, 0x70, 0x0, 0x1, 0x1c, 0xfc, 0x82, 0x40,
/*[9e0]*/ 0x0, 0x1, 0x8, 0x84, 0x82, 0x40, 0x0, 0x1, 0xf8, 0x84, 0x82, 0x7c, 0x0, 0x0, 0x0, 0x0,
/*[9f0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1,
/*[a00]*/ 0xf8, 0x84, 0xfc, 0x7e, 0x0, 0x1, 0x8, 0x84, 0x80, 0x42, 0x0, 0x1, 0x8, 0x84, 0x80, 0x42,
/*[a10]*/ 0x0, 0x1, 0x8, 0xcc, 0xe0, 0x7e, 0x0, 0x1, 0x8, 0x48, 0x80, 0x48, 0x0, 0x1, 0x8, 0x78,
/*[a20]*/ 0x80, 0x44, 0x0, 0x1, 0xf8, 0x30, 0xfc, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[a30]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[a40]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[a50]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[a60]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[a70]*/ 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xc0,
/*[a80]*/ 0x0, 0x0, 0x0, 0x0, 0x6, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x80, 0x0, 0x0, 0x0, 0x0,
/*[a90]*/ 0x7e, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xc0, 0x84, 0x71, 0x37,
/*[aa0]*/ 0xc0, 0x0, 0x78, 0xc4, 0xd1, 0x64, 0x0, 0x0, 0xe, 0xe4, 0x99, 0xc4, 0x0, 0x0, 0x2, 0xb4,
/*[ab0]*/ 0x89, 0x47, 0x0, 0x0, 0x2, 0x9c, 0xf9, 0x64, 0x0, 0x0, 0x6, 0x8d, 0xd, 0x34, 0x0, 0x0,
/*[ac0]*/ 0xc, 0x85, 0x5, 0x17, 0xc0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x41, 0xff, 0xff, 0xff,
/*[ad0]*/ 0xc0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x8, 0x0, 0x0, 0x0, 0x80, 0x0,
/*[ae0]*/ 0xe, 0xa6, 0xea, 0x0, 0x0, 0x0, 0xa, 0x44, 0x4a, 0x0, 0x0, 0x0, 0xe, 0x42, 0x4a, 0x0,
/*[af0]*/ 0x0, 0x0, 0x0, 0x86, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[b00]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xae, 0xed, 0x15, 0xd5, 0x59, 0xdc, 0xe4, 0x4c, 0x28,
/*[b10]*/ 0x95, 0xd8, 0x94, 0xa4, 0x49, 0x51, 0x9d, 0x52, 0x9c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[b20]*/ 0x0, 0xa, 0xa8, 0x0, 0x0, 0x0, 0x0, 0x12, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x21, 0x28, 0x0,
/*[b30]*/ 0x0, 0x78, 0x5c, 0x9, 0x3, 0x4c, 0x9e, 0x0, 0x4, 0x9f, 0x0, 0x3, 0xa0, 0x29, 0xf0, 0xf8,
/*[b40]*/ 0x7, 0x9f, 0x4c, 0xfb, 0x23, 0x27, 0x0, 0xf8, 0x7, 0x78, 0x5c, 0xf1, 0x7f, 0x4c, 0xf8, 0x23,
/*[b50]*/ 0x27, 0x80, 0xf8, 0x7, 0x9f, 0x4c, 0xfb, 0x1, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[b60]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[b70]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[b80]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[b90]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[ba0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[bb0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[bc0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[bd0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[be0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[bf0]*/ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
/*[c00]*/ 0x0};
const int gamesize = sizeof(flash);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment