diff --git a/firmware/main_v1_2b-v1_4.hex b/firmware/main_v1_2b-v1_4.hex index 8a6de62..e9de92c 100644 --- a/firmware/main_v1_2b-v1_4.hex +++ b/firmware/main_v1_2b-v1_4.hex @@ -1,258 +1,310 @@ -:100000000C9476000C94C1060C9493000C9493000D -:100010000C9493000C9493000C9493000C94930014 -:100020000C9493000C9493000C9493000C94930004 -:100030000C9493000C9493000C9493000C949300F4 -:100040000C9493000C9493000C9493000C949300E4 -:100050000C9493000C9493000C9493000C949300D4 -:100060000C9493000C9493000C9493000C949300C4 -:100070000C9493000C9493000C94930009021200CA -:100080000101008096090400000000000000120138 -:100090001001FF000008C016DC050002010200018B -:1000A0001E0349004E004C00200052006500740001 -:1000B00072006F002D00500072006F0067002A036D -:1000C00049006E00660069006E00690074006500FA -:1000D0004E00650073004C006900760065007300F7 -:1000E0002E0063006F006D000403090411241FBE7D -:1000F000CFEFD4E0DEBFCDBF11E0A0E0B1E0EAEF8A -:10010000FFE002C005900D92A230B107D9F722E0BE -:10011000A2E0B1E001C01D92AD3BB207E1F70E9441 -:10012000D5070C94FB070C940000EF92FF928034EB -:1001300059F4E22FF0E0EE57FE4F8081F701808303 -:1001400080E0FF90EF90089584EBFBCFE2E8F1E0D0 -:100150008FEF819391E0EA38F907D9F78093750121 -:1001600080936501809378018093680180935501A5 -:100170008093450180935801809348018093350115 -:1001800080932501809315018093050180933801A8 -:100190008093280180931801809308010895CF93DC -:1001A000DF931F92CDB7DEB7811108C089830E940B -:1001B000A60089810F90DF91CF91089584EBFACF4B -:1001C000CF93DF93FC0150E0CA01820F911D099784 -:1001D0003CF5222329F183818F3F21F586818F3FD2 -:1001E00019F5DA01AE57BE4FED0180E099919F3FBE -:1001F000E9F48F5F2813FACF6683138295E0440FEA -:10020000551F9A95E1F746575E4F5183408390E022 -:100210006D939F5F8913FCCF80E0DF91CF910895AC -:100220008EEBFBCF8FEBF9CF80ECF7CF81ECF5CFE6 -:100230000F93FB01642F422F202F8058883020F429 -:10024000CF010F910C94E00086EB0F9108950F936E -:100250001F93CF93DF93DC01EB018A0112968C91FF -:100260001297803828F5803498F481110FC00E94CD -:10027000A60080E0888381E090E0F801918380838C -:10028000CE01DF91CF911F910F91089584EBF2CFB2 -:10029000803461F41496EC91F0E0EE57FE4F8081CB -:1002A000898380E0888382E090E0E7CF84EBFACF17 -:1002B000482F477050E0FA013197E730F10558F4C4 -:1002C000EC59FE4F0C94F5078D017B017E018101F5 -:1002D000840187018A0162E771E0803C08F513968A -:1002E0000C91139714962C91149715964C910E948B -:1002F00018018883C5CF62E571E0EFCF62E471E059 -:10030000ECCF62E371E0E9CF62E271E0E6CF62E157 -:1003100071E0E3CF62E071E0E0CF62E671E0DDCF53 -:10032000FB01C081D181ACCF11B88FEF82B914B875 -:1003300085B917B888B98AB184718AB98BB18B6EC7 -:100340008BB9509858985198599A08950E949401E1 -:10035000399A419A389A40983A9A429A3C9A449AE1 -:100360003D9A459A3F9A479A47988FEF84B915B8B6 -:10037000479A479814B812B881B914B885B95998F2 -:10038000519A08950E949401399A419A3C9A449A4C -:100390003D9A459A509A589A3F9A479A4798579A41 -:1003A0005F9A5F988FEF84B915B8479A479814B849 -:1003B00084B915B85F9A5F9814B812B881B914B8A7 -:1003C00085B95998519A0895CF93DF931F92CDB76D -:1003D000DEB7813069F020F0823071F086E904C028 -:1003E00089830E94940189810F90DF91CF910895B4 -:1003F0000E94A60180E0F8CF0E94C201FBCFFC0161 -:1004000081E080835898509A000089B18183509888 -:100410005898908181818923981308C08AEA86833D -:100420008483828385E58583838308955098589AD1 -:1004300089B1818389B1828389B1838389B18483BE -:1004400089B1858389B186835098589808958038FA -:1004500029F4CB010E94FF0180E0089587E9089507 -:100460009FEF94B985B9479A479862B945B95898AA -:10047000509A5098589A14B808955098589840989F -:10048000419A429A62B99FEF94B985B9479A4798C1 -:1004900014B800000000409A87FD41980000000059 -:1004A000000000000000000083B14098419A0895C8 -:1004B00062B99FEF94B985B9479A479814B8409AA2 -:1004C00087FD4198000000000000000083B14098C3 -:1004D000419A08955898509A9FEF94B962B985B996 -:1004E000479A4798429845B9409A87FD419800003D -:1004F00000004098419A429A14B8089562B9803237 -:1005000070F48FEF84B915B8479A479814B8449897 -:10051000000000000000000083B1449A08959FEF9E -:1005200094B985B9F1CFCF93DF93982F862F642F9D -:10053000E901913859F0923861F0903869F40E94DD -:100540003D02888380E0DF91CF9108950E94580298 -:10055000F8CF0E947E02F5CF81EAF5CF9FEF94B9E4 -:1005600062B9803248F415B8479A479845B945981A -:100570000000459A14B8089585B9F6CFCF93C82FD7 -:10058000862F642F422FCC2321F0C13039F0C0EAEE -:1005900002C00E9430028C2FCF9108950E94AE02BB -:1005A000C0E0F9CF482F50E04B35510508F0FCC0B2 -:1005B000FA01E352FD4F0C94F50738033A033E036A -:1005C00040034303450348034A034D034F035103CC -:1005D0005403560358035A035C035E03600362032B -:1005E000D403D403D403D4036403660368036A0307 -:1005F000D403D403D403D4036C036E0370037203D7 -:100600007403760378037A037C037E0380038203FA -:100610008403860388038A03D403D403D403D40356 -:100620008C038E03D2039003920396039A039D03D7 -:10063000A003A603A3039F03A203A503A803AA0381 -:10064000AC03AE03B003B203B403B603B803BA03FA -:10065000BC03BE03C003C203C403C603C803CA036A -:10066000D403D403D403D403CF03CC03CE03D103E8 -:1006700011B808958FEF81B980E0089512B8FCCFCA -:100680008FEF82B9F9CF14B8F7CF8FEF84B9F4CFD9 -:1006900015B8F2CF8FEF85B9EFCF17B8EDCF18B8F7 -:1006A000EBCF8FEF88B9E8CF3898E6CF389AE4CF10 -:1006B0004098E2CF409AE0CF3998DECF399ADCCF2C -:1006C0004198DACF419AD8CF3A98D6CF3A9AD4CF38 -:1006D0004298D2CF429AD0CF3B98CECF3B9ACCCF44 -:1006E0004398CACF439AC8CF3C98C6CF3C9AC4CF50 -:1006F0004498C2CF449AC0CF3D98BECF3D9ABCCF5C -:100700004598BACF459AB8CF3E98B6CF3E9AB4CF67 -:100710004698B2CF469AB0CF3F98AECF3F9AACCF73 -:10072000479AAACF8AB184718AB9A6CF8BB1847156 -:100730008BB9A2CF8BB18B6EFBCF50989DCF5898C1 -:10074000509A9ACF5098589A97CF5098589894CFDB -:10075000519892CF519A90CF59988ECF599A8CCF69 -:1007600053988ACF539A88CF5B9886CF5B9A84CF71 -:10077000559882CF559A80CF5D987ECF5D9A7CCF79 -:1007800056987ACF569A78CF5E9876CF5E9A74CF85 -:10079000579872CF579A70CF5F9A6ECF5F9A5F98D3 -:1007A0006BCF479A479868CF8CE8089590E0FC019A -:1007B000E058F109EB30F10508F03FC0EE51FC4F75 -:1007C0000C94F507ED03F203F003F403FB030104BB -:1007D0000304050407041104130462B980E00895BA -:1007E0008FEF84B965B9FACF8FEF84B965B9479AAD -:1007F000479814B8F3CF8FEF84B965B95F9A5F98C3 -:10080000F8CF61B9EBCF64B9E9CF67B9E7CF9AB157 -:10081000862F846189238AB98AB16B7E682B6AB975 -:10082000DDCF68B9DBCF9BB1862F846189238BB97B -:100830008BB16B7E682B6BB9D1CF8DE80895813A6F -:1008400069F0823AC1F0803A11F58FEF84B965B949 -:10085000479A479814B842B980E008958FEF84B959 -:1008600065B9479A479814B842B967FF02C04198E2 -:10087000F3CF419AF1CF42B98FEF84B9603228F4B7 -:1008800015B8479A479814B8E7CF65B9FACF8EE8FC -:100890000895803B61F422B98FEF84B945B9479A36 -:1008A000479865B95F9A5F9814B880E008958FE81B -:1008B0000895DB01482F50E0FA01E05CF109EC30CB -:1008C000F10550F5EA59FB4F0C94F50772047604D4 -:1008D00078047A047C047E04800482048404860400 -:1008E00088048A0480B18C9380E0089583B1FBCFA3 -:1008F00086B1F9CF89B1F7CF82B1F5CF85B1F3CF0A -:1009000088B1F1CF8BB1EFCF81B1EDCF84B1EBCF17 -:1009100087B1E9CF8AB1E7CF80E908950F938111BC -:1009200014C0589A8FEF84B922B945B9479A4798AD -:1009300005B9611101C04198459800000000459A31 -:10094000419A14B858980F9108955898EBCF0F9387 -:10095000CF93C82F022F813079F020F08230A1F0A0 -:10096000CAEA06C0242F462F60E081E00E948E0470 -:100970008C2FCF910F910895242F462F60E080E0B7 -:100980000E948E04C0E0F4CF242F462F6FEFF7CFE4 -:100990000F93811119C0589A8FEF84B902B925B904 -:1009A000479A479845B95F9A5F9814B8611101C09A -:1009B00041984498000000000000000083B1449A70 -:1009C000419A58980F9108955898E6CF0F931F9326 -:1009D000CF93DF93E801813891F08238B1F080380D -:1009E000C9F4022F242F462F60E081E00E94C80442 -:1009F000888380E0DF91CF911F910F910895022F9E -:100A0000242F462F60E080E0F1CF022F242F462FC5 -:100A10006FEFF9CF8BEAEECF0F931F93CF93DF9356 -:100A200000D0CDB7DEB7FC018AE892E09093A20235 -:100A30008093A1021A821982808187FF04C081E01D -:100A400090E09A8389838181833009F458C030F41F -:100A50008130B1F08230D9F180E81BC0843009F4D4 -:100A60005EC08530C9F7AE014F5F5F4F6AE872E044 -:100A7000CF010E9427019093A2028093A10237C068 -:100A80008281803B48F4803A98F4803868F40E9470 -:100A9000D20280938A022BC0803C78F42481458165 -:100AA00063810E944904F5CF64810E94D603F1CF8F -:100AB000448165810E941F04ECCF6BE872E00E94C4 -:100AC000590480938A0289819A8101960EC082819D -:100AD000803818F40E94E401DCCF6BE872E00E94D9 -:100AE000270280938A0288E090E09A838983898133 -:100AF0000F900F90DF91CF911F910F9108958281F8 -:100B0000803830F42381448165810E94BE02C1CFC8 -:100B10002BE832E0448165810E949302D2CF82812A -:100B2000803830F42381448165810E94A704B1CFCD -:100B30000BE812E02481458163810E94E604C1CF65 -:100B400081E00895CF93DF936091A302635067FD26 -:100B500091C08091A002CCE0D0E0C81BD109C9555A -:100B6000DD4F80919F028D3209F0CFC0683009F0CF -:100B70007FC083EC809393028AE5809301011092F9 -:100B800092028881807679F0CE010E940C058F3F19 -:100B900009F466C09F81911169C09E81981708F081 -:100BA00065C0892F63C02A8110929C02998191119E -:100BB0000AC010929D022CE932E082E03093A2023A -:100BC0002093A102E7CF953029F42093A4022CE9C9 -:100BD00032E0F4CF963099F59B81913059F48EE84C -:100BE00090E09093A2028093A10282E190E490931E -:100BF0009202D0CF923019F48CE790E0F2CF93308C -:100C0000A9F7211108C088EE90E09093A20280938A -:100C1000A10284E0EBCF213041F48EEB90E0909381 -:100C2000A2028093A1028AE2E1CF2230F9F680EAA3 -:100C300090E09093A2028093A1028EE1D7CF9830EA -:100C400059F0993019F42093A602C1CF81E09A306F -:100C500009F4BDCF80E0BBCF26EA32E081E0AECF21 -:100C6000988197FD8E8190E8909392028093000185 -:100C70001092A3028091010184FF3AC0809100018B -:100C80008F3FB1F1C82F893008F0C8E08C1B8093EA -:100C900000018091930298E8892780939302CC23E6 -:100CA000D1F08091A1029091A2022091920226FFA0 -:100CB0003FC0A4E9B2E0FC012C2F34913D93319662 -:100CC0002150D9F701962FEF2C0F820F911D909391 -:100CD000A2028093A1026C2F84E992E00E94BD06DB -:100CE000CC5FCC3019F08FEF80930001C0930101ED -:100CF00084E199B1947131F48150D9F71092A40232 -:100D000010929E02DF91CF9108958091920287FF09 -:100D1000AFCFCE010E94A0058F3F21F48EE18093DA -:100D20000101A6CF882309F4A3CF10920001A0CF20 -:100D3000E4E9F2E0DC012C2F3D9131932150E1F701 -:100D4000C1CFE9E6F0E0808182608083E89A08956F -:100D5000A82FB92F80E090E041E050EA609530E0A4 -:100D600009C02D9182279795879510F084279527A4 -:100D7000305EC8F36F5FA8F30895EADF8D939D930B -:100D80000895CF93CFB7CF93DF93C3954C9BE9F7EB -:100D90004C9B0BC04C9B09C04C9B07C04C9B05C097 -:100DA0004C9B03C04C9B01C089C06F93C091A002B3 -:100DB000DD27C955DD4F2F9365E54C9B03C02F916F -:100DC0006F91E6CF0F931F934F9320E040E15F9325 -:100DD00009B1047104FB27F93F9350E03BE039C0AF -:100DE000147140642F77012F5F5F1EC0406819B1F6 -:100DF00014712F7752501FC0406409B12F770471CE -:100E0000D1F15F5F00C023C0406219B12F77147128 -:100E100091F15F5F00C025C004711027515012F49A -:100E20005D5F0000115027952C3F19B1C8F6147171 -:100E30000127015027952C3FC8F64227499309B155 -:100E4000047110274F73115027952C3FA8F6469533 -:100E5000469519B1147179F00127015027952C3F5F -:100E600098F66B5A60F3315009B1B0F600C011E04A -:100E70001CBB002717C03B503195C31BD04011E06D -:100E80001CBB0881033CF9F00B34E9F020919E0271 -:100E90001981110F1213EDCF093651F10D3211F0F6 -:100EA000013E39F70093A5023F915F914F911F9149 -:100EB0000F912F916F91CCB3C0FD67CFDF91CF9190 -:100EC000CFBFCF9118952091A502222369F31091ED -:100ED000A302112339F534303AF13093A302209361 -:100EE0009F021091A0023BE0311B3093A0021CC076 -:100EF0000091A3020130B4F40AE53091010134FD00 -:100F000014C000930101C3E9D2E013C0052710E02B -:100F100000C000000BB91AC0052710E0221F1DC039 -:100F200010E021C04AE502C032ED432FC4E1D0E019 -:100F300032E01AB114615C9A0BB11AB954E120E89D -:100F400065E320FF05270BB9279517951C3FF0F6A1 -:100F50006695B8F7B1F720FF05270BB927951795C8 -:100F60001C3FD0F62795179517FF052700001C3F5B -:100F70000BB9B0F629913A9519F70B7E1091A4029E -:100F8000110FC651D0400BB911F010939E0211E021 -:100F90001CBB00611AB11B7E402F4B7E54E05A955A -:100FA000F1F70BB91AB94BB97FCF9EE088E10FB6C4 -:100FB000F894A895809360000FBE909360000E9403 -:100FC000A106549A80E0815041F454980E94940103 -:100FD0007894A8950E94A205FCCFA895EFE9FFE0C0 -:100FE0003197F1F700C00000EECFEE0FFF1F059024 -:0A0FF000F491E02D0994F894FFCF6E -:020FFA00FF5A9C +:100000000C94E8000C945A080C9405010C9405011A +:100010000C9405010C9405010C9405010C94050148 +:100020000C9405010C9405010C9405010C94050138 +:100030000C9405010C9405010C9405010C94050128 +:100040000C9405010C9405010C9405010C94050118 +:100050000C9405010C9405010C9405010C94050108 +:100060000C9405010C9405010C9405010C940501F8 +:100070000C9405010C9405010C940501AE04B00428 +:10008000B304B504B804BA04BD04BF04C204C40474 +:10009000C604C904CB04CD04CF04D104D304D504D1 +:1000A000D7044A054A054A054A05D904DB04DD049C +:1000B000DF044A054A054A054A05E104E304E5046C +:1000C000E704E904EB04ED04EF04F104F304F504A0 +:1000D000F704F904FB04FD04FF044A054A054A0538 +:1000E0004A05010503054805050507050B050E052D +:1000F000120515051B051805140517051A051D051C +:100100001F05210523052505270529052B052D0597 +:100110002F05310533053505370539053B053D0507 +:100120003F054A054A054A054A0544054105430578 +:10013000470557055B0559055D0563056A056C05AF +:100140006E0570057A057D05D105D305D505D70562 +:10015000D905DB05DD05DF05E105E305E505E90575 +:10016000090212000101008096090400000000004D +:10017000000012011001FF000008C016DC0500029B +:10018000010200011E0349004E004C0020005200F5 +:100190006500740072006F002D00500072006F0047 +:1001A00067002A0349006E00660069006E0069005E +:1001B000740065004E00650073004C006900760015 +:1001C000650073002E0063006F006D0004030904D6 +:1001D00011241FBECFEFD4E0DEBFCDBF11E0A0E001 +:1001E000B1E0E2E3F3E102C005900D92A230B10765 +:1001F000D9F713E0A2E0B1E001C01D92A938B10720 +:10020000E1F70E946E090C9497090C940000CF92BC +:10021000DF92EF92FF92CF93DF93DB01F701E601CC +:10022000813549F18036F1F0803509F044C01296ED +:100230008C911297808313968C91139781831496D7 +:100240008C911497828315968C91159783831696BB +:100250008C911697848317968C911797858318969F +:100260008C9123C0A22FB0E0AE5FBE4F8C918083F3 +:1002700088818F5F1DC019968C91199780831A967B +:100280008C911A9781831B968C911B9782831C9665 +:100290008C911C9783831D968C911D9784831E9649 +:1002A0008C911E9785831F968C9186838881895FA8 +:1002B000888380E001C084EBDF91CF91FF90EF90C5 +:1002C000DF90CF900895FC01809142039091430309 +:1002D00040814078403851F48681D9018C938091D7 +:1002E000420390914303409345030FC04FEFD90160 +:1002F0004C93268120935C0322E433E030935E0329 +:1003000020935D0320E92093450310924603228148 +:10031000213711F02034D1F4A0915D03B0915E0338 +:100320000D90BC91A02D25812C93A0915D03B091DF +:100330005E030D90BC91A02D248111962C93E09129 +:100340005D03F0915E0324812E5F24830895E2E033 +:10035000F1E09FEF8FEF919321E0E231F207D1F7C7 +:10036000809345038093350380934803809338033B +:1003700080932503809315038093280380931803AB +:100380000895FB01813389F038F4882359F08033D4 +:1003900099F4418722870EC0823351F0833361F490 +:1003A000278708C00E94A70105C04387248702C091 +:1003B0004587268780E0089584EB0895CF93DF93E7 +:1003C000FC0150E0CA01820F911D41970CF046C01C +:1003D000222309F445C083818F3F09F043C0868101 +:1003E0008F3F09F041C080E090E0EA01CE5FDE4F30 +:1003F000821750F40196DE01A80FB91F11973C91A6 +:100400003F3FB1F381EC31C066831382822F829526 +:10041000880F807E81508283148215821086178215 +:10042000118612861386148615861786CA0135E052 +:10043000880F991F3A95E1F78E5E9E4F91838083D6 +:1004400080E090E04E5F5E4F821730F4FA01E80FD3 +:10045000F91F60830196F8CF80E007C08EEB05C0DE +:1004600082EC03C08FEB01C080ECDF91CF91089547 +:100470000F93FB01642F422F202F803888F088389B +:1004800058F08059883060F40583242F30E0362BF3 +:100490003087278380E005C0CF010F910C94DE01E7 +:1004A00086EB0F910895CF92DF92EF92FF920F9318 +:1004B000CF93DF93FC01EB016A0182819FEC980FDF +:1004C0009E3270F49381913071F050F0923029F0A7 +:1004D0009330C1F562E173E008C062E273E005C0E9 +:1004E00062E473E002C062E373E0803768F4803551 +:1004F00080F4803408F047C00381248145810E9444 +:10050000C101888381E03CC0803868F4960140E0F6 +:100510003CC07E019FEFE91AF90A038124814581DD +:100520000E9407013DC0982F97709130A1F080F094 +:10053000923029F0933031F462E173E00EC062E250 +:1005400073E00BC086E8888381E0D6018C9329C0D4 +:1005500062E473E002C062E373E0803F50F4803CE9 +:1005600058F48038E0F00381248145810E943802EC +:1005700017C0883F40F013C0DB01CD91DC9186812C +:10058000F60180830EC096014FEFCF01DF91CF912E +:100590000F91FF90EF90DF90CF900C94630185E86E +:1005A0008883CE01DF91CF910F91FF90EF90DF9084 +:1005B000CF90089580915103803D59F410924603E5 +:1005C00082E493E00E940303811103C088ED8093CD +:1005D0004503E0915D03F0915E039281848198135D +:1005E00002C088E9838380915103803F59F41092BF +:1005F000460382E493E00E942F03811103C088ED3B +:10060000809345030895EF92FF920F931F93CF932A +:10061000DF931F92CDB7DEB77C01FC019781906814 +:10062000F70164818281681788F4F70100811181E4 +:10063000060F111D892F99830E942C04F8018083D5 +:10064000F70184818F5F84839981EACF80E00F90E6 +:10065000DF91CF911F910F91FF90EF9008950F932D +:100660001F93CF93DF93EC011F8110689C818A81D7 +:10067000981790F54AEA65E585E50E94040445E58A +:100680006AEA8AE20E94040440EA65E585E50E9480 +:1006900004046C81E881F981E60FF11D4081812F0E +:1006A0000E9404046C81812F0E942C04082F6C810D +:1006B000812F0E942C040813F5CF8C81E881F981E9 +:1006C000E80FF11D9081091304C08F5F8C83599846 +:1006D000CDCF519A599ACACF80E0DF91CF911F9127 +:1006E0000F91089511B88FEF82B914B885B917B872 +:1006F00088B98AB184718AB98BB18B6E8BB95098E5 +:1007000058985198599A08950E947203399A419ABB +:10071000389A40983A9A429A3C9A449A3D9A459A15 +:100720003F9A479A47988FEF84B915B8479A4798E8 +:1007300014B812B881B914B885B95998519A089566 +:100740000E947203399A419A3C9A449A3D9A459A7A +:10075000509A589A3F9A479A4798579A5F9A5F9843 +:100760008FEF84B915B8479A479814B884B915B86B +:100770005F9A5F9814B812B881B914B885B95998BE +:10078000519A0895813049F028F0823051F40E9446 +:10079000A00305C00E94720302C00E94840380E08F +:1007A000089586E90895FC0181E080835898509A65 +:1007B000000089B181835098589890818181892364 +:1007C000891308C08AEA86838483828385E58583CA +:1007D000838308955098589A89B1818389B182831F +:1007E00089B1838389B1848389B1858389B1868303 +:1007F000509858980895803829F4CB010E94D3036B +:1008000080E0089587E908959FEF94B985B9479AE4 +:10081000479862B945B95898509A5098589A14B860 +:100820000895509858984098419A429A62B99FEF1B +:1008300094B985B9479A479814B800000000409AC7 +:1008400087FD41980000000000000000000000004B +:1008500083B14098419A089562B99FEF94B985B9E0 +:10086000479A479814B8409A87FD419800000000C5 +:100870000000000083B14098419A0895509858981C +:100880009FEF94B962B985B9479A4798429845B99C +:10089000409A87FD4198000000004098419A429A92 +:1008A00014B808959FEF94B9803208F4806885B930 +:1008B000479A479814B862B94498000000000000B5 +:1008C000000083B1449A0895CF93DF93982F862F29 +:1008D000642FE901913839F0923851F0903859F489 +:1008E0000E94110402C00E942C04888380E004C08E +:1008F0000E945204FACF81EADF91CF9108959FEFD1 +:1009000094B9803208F4806885B9479A479862B9EB +:1009100045B9000045980000459A14B80895982FED +:10092000862F642F422F913049F028F0923051F4F5 +:100930000E943E0405C00E94040402C00E947F047D +:1009400080E0089580EA089590E08B35910508F0E5 +:10095000A1C0FC01E25CFF4F0C94910911B895C055 +:100960008FEF81B992C012B890C08FEF82B98DC05D +:1009700014B88BC08FEF84B988C015B886C08FEFCC +:1009800085B983C017B881C018B87FC08FEF88B908 +:100990007CC038987AC0389A78C0409876C0409A1F +:1009A00074C0399872C0399A70C041986EC0419A2B +:1009B0006CC03A986AC03A9A68C0429866C0429A37 +:1009C00064C03B9862C03B9A60C043985EC0439A43 +:1009D0005CC03C985AC03C9A58C0449856C0449A4F +:1009E00054C03D9852C03D9A50C045984EC0459A5B +:1009F0004CC03E984AC03E9A48C0469846C0469A67 +:100A000044C03F9842C03F9A40C0479A3EC08AB116 +:100A100084718AB93AC08BB1847102C08BB18B6E7C +:100A20008BB933C0509831C05898509A2EC0509806 +:100A3000589A2BC05098589828C0519826C0519A5F +:100A400024C0599822C0599A20C053981EC0539A66 +:100A50001CC05B981AC05B9A18C0559816C0559A6E +:100A600014C05D9812C05D9A10C056980EC0569A78 +:100A70000CC05E980AC05E9A08C0579806C0579A84 +:100A800004C05F9A02C05F9A5F9880E00895479A19 +:100A90004798FBCF8CE8089590E0FC01E058F109FD +:100AA000EB30F105A0F5E756FF4F0C94910962B9C0 +:100AB00022C08FEF84B965B91EC08FEF84B965B9C4 +:100AC000479A479805C08FEF84B965B95F9A5F98D8 +:100AD00014B811C061B90FC064B90DC067B90BC0BB +:100AE0009AB1862F846189238AB98AB16B7E682B7B +:100AF0006AB901C068B980E008959BB1862F84610E +:100B000089238BB98BB16B7E682B6BB9F4CF8DE8E1 +:100B10000895813A61F0823AB9F0803A11F58FEF89 +:100B200084B965B9479A479814B842B916C08FEF8F +:100B300084B965B9479A479814B842B967FF02C0AB +:100B400041980BC0419A09C042B98FEF84B9603215 +:100B500030F415B8479A479814B880E0089565B9FD +:100B6000F9CF8EE80895803B61F422B98FEF84B904 +:100B700045B9479A479865B95F9A5F9814B880E07D +:100B800008958FE80895CF93DF93EB0190E0805CA8 +:100B900091098C309105F8F48C559F4FFC010C9411 +:100BA000910980B113C083B111C086B10FC089B162 +:100BB0000DC082B10BC085B109C088B107C08BB12F +:100BC00005C081B103C084B101C087B1888380E0D2 +:100BD00003C08AB1FBCF80E9DF91CF9108950F93D5 +:100BE000811102C0589A01C058988FEF84B922B978 +:100BF00045B9479A479805B9459800000000459ABD +:100C0000419A14B858980F9108950F93022F81308C +:100C100061F030F0823089F4242F462F60E008C064 +:100C2000242F462F6FEF81E004C0242F462F6FEF53 +:100C300080E00E94EF0580E001C08AEA0F910895EC +:100C40000F93811102C0589A01C058988FEF84B950 +:100C500002B925B9479A479845B95F9A5F9814B881 +:100C60004498000000000000000083B1449A419ABB +:100C700058980F9108950F931F93CF93DF93E80136 +:100C8000813851F0823891F08038A9F4022F242F56 +:100C9000462F6FEF81E005C0022F242F462F6FEF04 +:100CA00080E00E942006888380E006C0022F242F67 +:100CB000462F60E0F5CF8BEADF91CF911F910F9126 +:100CC00008950F931F93CF93DF931F92CDB7DEB795 +:100CD000FC0182E593E090936E0380936D0319828B +:100CE000808187FF02C081E089838181833009F49C +:100CF0004BC028F48130D1F08230C1F179C0853009 +:100D000009F467C008F454C0863009F071C010922D +:100D1000520380915A0380935303E0915D03F09155 +:100D20005E0382818093540383E060C08281803BB4 +:100D300038F4803A88F4803858F40E94A40459C0EA +:100D4000803C78F42481458163810E94B30551C0C1 +:100D500064810E944C054DC0448165810E948905D3 +:100D600048C063E573E00E94C3051DC082818038DE +:100D700018F40E94C2033DC063E573E00E94FB03C8 +:100D80008093520388E032C08281803830F423811E +:100D9000448165810E948F042CC023E533E04481A7 +:100DA00065810E9464048093520389818F5F1EC015 +:100DB0008281803830F42381448165810E94050658 +:100DC00018C003E513E02481458163810E943B063E +:100DD000EACFAE014F5F5F4F62E573E0CF010E9443 +:100DE000530290936E0380936D0305C0898303C003 +:100DF00080E88093520389810F90DF91CF911F91FA +:100E00000F910895E0915D03F0915E03448120818C +:100E10003181582FFC01742F781B972F9E0F8E2F36 +:100E2000851B861730F48191D901A90FB11D8C93D0 +:100E3000F4CFE0915D03F0915E038481860F84839B +:100E400090915C03961B90935C0310925A03640F7D +:100E50008281861302C088E9838381E0911180E05A +:100E60000895CF93DF9360916F03635067FDA4C033 +:100E700080916C03CCE0D0E0C81BD109CD58DC4F89 +:100E800080916B038D3209F085C0683009F092C003 +:100E900083EC80935F038AE58093010110925B03EA +:100EA0008881807621F0CE010E94610660C08A812F +:100EB000109268039981911106C01092690328E687 +:100EC00033E082E050C0953019F4809370033DC048 +:100ED0009630A9F59B81913019F482E791E004C026 +:100EE000923041F480E691E090936E0380936D031D +:100EF00082E121C09330F1F4811108C08CEC91E0C3 +:100F000090936E0380936D0384E015C0813041F4AB +:100F100082EA91E090936E0380936D038AE20BC0A6 +:100F2000823041F484E891E090936E0380936D03E6 +:100F30008EE101C080E090E490935B0318C098308C +:100F400079F0993031F48093720328E633E080E041 +:100F50000AC081E09A3009F080E028E633E003C05F +:100F600022E733E081E030936E0320936D038F3FDF +:100F700039F4988197FD8E8190E890935B0307C0C8 +:100F80009F81911104C09E81981708F4892F809346 +:100F9000000110C080915B0387FF0CC0CE010E944E +:100FA00002078F3F21F48EE18093010103C081117C +:100FB0001092000110926F038091010184FF4DC0D7 +:100FC000809100018F3F09F448C0C82F893008F094 +:100FD000C8E08C1B8093000180915F0398E889270B +:100FE00080935F03CC2361F180916D0390916E0338 +:100FF00020915B0326FF12C0A0E6B3E02FE533E0AB +:1010000020953095280F391F4C2F4A0FF901EA0F10 +:10101000FB1FE491ED934A13F9CF09C0E0E6F3E03A +:10102000DC012C2F2E0F3D9131932E13FCCF019616 +:101030002FEF2C0F820F911D90936E0380936D0301 +:101040006C2F80E693E00E945608CC5FCC3019F0FC +:101050008FEF80930001C093010184E199B19471F5 +:1010600031F48150D9F71092700310926A03DF9126 +:10107000CF910895E9E6F0E0808182608083E89A6C +:101080000895A82FB92F80E090E041E050EA6095E4 +:1010900030E009C02D9182279795879510F084271D +:1010A0009527305EC8F36F5FA8F30895EADF8D934C +:1010B0009D930895CF93CFB7CF93DF93C3954C9B68 +:1010C000E9F74C9B0BC04C9B09C04C9B07C04C9B49 +:1010D00005C04C9B03C04C9B01C089C06F93C0915D +:1010E0006C03DD27CD58DC4F2F9365E54C9B03C087 +:1010F0002F916F91E6CF0F931F934F9320E040E124 +:101100005F9309B1047104FB27F93F9350E03BE082 +:1011100039C0147140642F77012F5F5F1EC0406893 +:1011200019B114712F7752501FC0406409B12F7745 +:101130000471D1F15F5F00C023C0406219B12F7705 +:10114000147191F15F5F00C025C0047110275150E8 +:1011500012F45D5F0000115027952C3F19B1C8F6BD +:1011600014710127015027952C3FC8F64227499357 +:1011700009B1047110274F73115027952C3FA8F621 +:101180004695469519B1147179F0012701502795BC +:101190002C3F98F66B5A60F3315009B1B0F600C09D +:1011A00011E01CBB002717C03B503195C31BD0403A +:1011B00011E01CBB0881033CF9F00B34E9F02091ED +:1011C0006A031981110F1213EDCF093651F10D3257 +:1011D00011F0013E39F7009371033F915F914F91F8 +:1011E0001F910F912F916F91CCB3C0FD67CFDF910D +:1011F000CF91CFBFCF91189520917103222369F32E +:1012000010916F03112339F534303AF130936F03A5 +:1012100020936B0310916C033BE0311B30936C0304 +:101220001CC000916F030130B4F40AE53091010154 +:1012300034FD14C000930101CFE5D3E013C00527AE +:1012400010E000C000000BB91AC0052710E0221FF3 +:101250001DC010E021C04AE502C032ED432FC4E1B9 +:10126000D0E032E01AB114615C9A0BB11AB954E1C2 +:1012700020E865E320FF05270BB9279517951C3F4C +:10128000F0F66695B8F7B1F720FF05270BB927955B +:1012900017951C3FD0F62795179517FF05270000D7 +:1012A0001C3F0BB9B0F629913A9519F70B7E1091B6 +:1012B0007003110FC651D0400BB911F010936A039F +:1012C00011E01CBB00611AB11B7E402F4B7E54E025 +:1012D0005A95F1F70BB91AB94BB97FCF2EE088E1D7 +:1012E00090E00FB6F894A895809360000FBE20930D +:1012F00060000E943A08549A80E0815041F0A8951D +:10130000EFE9FFE03197F1F700C00000F6CF549805 +:101310000E9472037894A8950E9431070E94DA0215 +:10132000FACFEE0FFF1F0590F491E02D0994F89489 +:02133000FFCFED +:02133200FF5A60 :00000001FF diff --git a/firmware/source/.nes.c.swp b/firmware/source/.nes.c.swp new file mode 100644 index 0000000..c1af4da Binary files /dev/null and b/firmware/source/.nes.c.swp differ diff --git a/firmware/source/nes.c b/firmware/source/nes.c index 5397859..7c7e5c4 100644 --- a/firmware/source/nes.c +++ b/firmware/source/nes.c @@ -26,6 +26,9 @@ uint8_t nes_opcode_24b_operand( uint8_t opcode, uint8_t addrH, uint8_t addrL, ui case NES_PPU_WR: nes_ppu_wr( addrH, addrL, data ); break; + case NES_CPU_WR: + nes_cpu_wr( addrH, addrL, data ); + break; default: //macro doesn't exist return ERR_UNKN_NES_OPCODE_24BOP; @@ -94,7 +97,6 @@ void discrete_exp0_prgrom_wr( uint8_t addrH, uint8_t addrL, uint8_t data ) _EXP0_LO(); //Tas = 0ns, Tah = 30ns _EXP0_PU(); //Twp = 40ns, Tds = 40ns, Tdh = 0ns //16Mhz avr clk = 62.5ns period guarantees timing reqts - //Need to check with scope to make sure EXP0 P/U effective _DATA_IP(); } @@ -216,7 +218,7 @@ uint8_t nes_cpu_rd( uint8_t addrH, uint8_t addrL ) void nes_cpu_wr( uint8_t addrH, uint8_t addrL, uint8_t data ) { //Float EXP0 as it should be in NES - _EXP0_LO(); + _EXP0_FLT(); //need for whole function _DATA_OP(); @@ -265,13 +267,14 @@ uint8_t nes_ppu_rd( uint8_t addrH, uint8_t addrL ) { uint8_t read; //return value - //set address bus - ADDR_OUT = addrL; if (addrH < 0x20) { //below $2000 A13 clear, /A13 set - _ADDRH_SET(addrH & PPU_A13N); + _ADDRH_SET(addrH | PPU_A13N); } else { //above PPU $1FFF, A13 set, /A13 clear _ADDRH_SET(addrH); } + + //set address bus + ADDR_OUT = addrL; //set CHR /RD and /WR _CSRD_LO(); @@ -296,6 +299,7 @@ uint8_t nes_ppu_rd( uint8_t addrH, uint8_t addrL ) /* Desc:NES PPU Write * decode A13 from addrH to set /A13 as expected + * flash: address clocked falling edge, data rising edge of /WE * Pre: nes_init() setup of io pins * Post:data written to addrHL * address left on bus @@ -307,19 +311,22 @@ void nes_ppu_wr( uint8_t addrH, uint8_t addrL, uint8_t data ) //will need output whole function _DATA_OP(); - //set address bus - ADDR_OUT = addrL; //addrH with PPU /A13 if (addrH < 0x20) { //below $2000 A13 clear, /A13 set - DATA_OUT = (addrH & PPU_A13N); + DATA_OUT = (addrH | PPU_A13N); } else { //above PPU $1FFF, A13 set, /A13 clear DATA_OUT = addrH; } //latch addrH _AHL_CLK(); + //set address bus + ADDR_OUT = addrL; + //put data on bus DATA_OUT = data; + + NOP(); //set CHR /RD and /WR //_CSRD_HI(); already done diff --git a/hardware/cartridges/128-512KB_SST_SF040_020_010.pdf b/hardware/cartridges/128-512KB_SST_SF040_020_010.pdf new file mode 100644 index 0000000..53ae3bb Binary files /dev/null and b/hardware/cartridges/128-512KB_SST_SF040_020_010.pdf differ diff --git a/hardware/cartridges/4-8MB_spansion_S29GL-N01.pdf b/hardware/cartridges/4-8MB_spansion_S29GL-N01.pdf new file mode 100755 index 0000000..4611afc Binary files /dev/null and b/hardware/cartridges/4-8MB_spansion_S29GL-N01.pdf differ diff --git a/host/source/cartridge.c b/host/source/cartridge.c index fb3d436..73ae234 100644 --- a/host/source/cartridge.c +++ b/host/source/cartridge.c @@ -138,7 +138,7 @@ int detect_mirroring( cartridge *cart, USBtransfer *transfer ) //always start with resetting i/o io_reset( transfer ); - if ( cart->console == NES_CART ) { + if ( (cart->console == NES_CART) || (cart->console == FC_CART) ) { //For now just assume mirroring is fixed until start adding support for other mappers cart->mirroring = MIR_FIXED; } @@ -156,24 +156,95 @@ int detect_mirroring( cartridge *cart, USBtransfer *transfer ) //detecting mapper and memories ends up being one big operation -int detect_map_mem( cartridge *cart, USBtransfer *transfer ) +int detect_map_mem( cartridge *cart, USBtransfer *transfer, int oper ) { + debug("detecting mapping"); //always start with resetting i/o io_reset( transfer ); - if ( cart->console == NES_CART && cart->mirroring = MIR_FIXED ) { - //if INL-ROM discrete board with EXP0->PRG-ROM /WE - //EXP0 pullup test should pass - if( exp0_pullup_test(transfer) == SUCCESS ){ - } else { - //Potentially some other discrete board without EXP0->WE flash control + //Most ASIC mappers can be determined by their mirroring alone - //Some ASIC mappers have fixed mirroring as well + //Discrete mappers are tricky as memory operations are needed + //If flashing can attempt to determine by reading flash manf/part + //If dumping have to rely on rom page checksums and register writes +//================ +// NES & Famicom +//================ + switch(cart->console) { - } - //for NROM flashing first verify EXP0 pull up will clock /WE properly + case FC_CART: + case NES_CART: + nes_init(transfer); + debug("NES cart mapping"); + //gather other helpful info + //result of chr-ram test + if ( ppu_ram_sense( transfer, 0x0000 ) == SUCCESS ) { + debug("CHR-RAM detected @ PPU $0000"); + cart->sec_rom->manf = SRAM; + cart->sec_rom->part = SRAM; + } else + //check for CHR-ROM flash + if ( read_flashID_chrrom_8K( transfer, cart->sec_rom ) == SUCCESS ) { + //8KB bank with no banking operations + debug("8K CHR-ROM flash detected"); + cart->sec_rom->size = 8 * KBYTE; + } + + //perform WRAM test without corrupting results + //TODO store result in save_mem + + //exp0 pullup test passes on many INL boards + if ( exp0_pullup_test(transfer) == SUCCESS) { + debug("EXP0 pullup cart mapping"); + //if passed exp0 test try 16/32KB bank flash check + + //if 16KB banks writing 0xFF to mapper reg should set A14 bit + //That will cause flash detection to fail. + //TODO handle bus conflicts...? + dictionary_call( transfer, DICT_NES, NES_CPU_WR, 0x8000, 0xFF, + USB_IN, NULL, 1); + //if ID check passes, the should be 32KB PRG-ROM banking + if ( read_flashID_prgrom_exp0( transfer, cart->pri_rom ) == SUCCESS ) { + //32KB bank with EXP0->WE PRG-ROM sensed + debug("32KB banking NES EXP0 enabled flash"); + cart->pri_rom->bank_size = 32 * KBYTE; + } else { + //set mapper reg to 0 if present which sets A14 low when needed if 16KB banks + dictionary_call( transfer, DICT_NES, NES_CPU_WR, 0x8000, 0x00, + USB_IN, NULL, 1); + if ( read_flashID_prgrom_exp0( transfer, cart->pri_rom ) == SUCCESS ){ + //16KB bank with EXP0->WE PRG-ROM sensed + debug("16KB banking NES EXP0 enabled flash"); + cart->pri_rom->bank_size = 16 * KBYTE; + } + } + //TODO determine how many banks are present + //best to do this by writing last bank, then see if + //blank banks can be found + } + + switch (cart->mirroring) { + case MIR_MMC1: + break; + case MIR_MMC3: + break; + case MIR_FIXED: + break; + default: + sentinel("Problem with mapper detect mirroring switch statement."); + } + break; +//================ +// SNES +//================ + case SNES_CART: + snes_init(transfer); + break; + + default: + sentinel("This console not supported by detect_map_mem function."); } //always end with resetting i/o @@ -181,8 +252,8 @@ int detect_map_mem( cartridge *cart, USBtransfer *transfer ) return SUCCESS; -//error: +error: //always end with resetting i/o - //io_reset( transfer ); -// return -1; + io_reset( transfer ); + return -1; } diff --git a/host/source/cartridge.h b/host/source/cartridge.h index f60a51e..453084b 100644 --- a/host/source/cartridge.h +++ b/host/source/cartridge.h @@ -46,6 +46,7 @@ typedef struct cartridge{ int init_cart_elements( cartridge *cart ); int detect_console( cartridge *cart, USBtransfer *transfer ); int detect_mirroring( cartridge *cart, USBtransfer *transfer ); +int detect_map_mem( cartridge *cart, USBtransfer *transfer, int oper ); #endif diff --git a/host/source/erase.c b/host/source/erase.c index 5454bc5..6bb6d0d 100644 --- a/host/source/erase.c +++ b/host/source/erase.c @@ -4,6 +4,8 @@ int erase_nes( USBtransfer *transfer ) { //uint8_t rv[8]; //int i = 0; + +return 0; debug("erasing_nrom"); @@ -92,6 +94,6 @@ int erase_nes( USBtransfer *transfer ) return 0; -error: - return -1; +//error: +// return -1; } diff --git a/host/source/inlprog.c b/host/source/inlprog.c index 9823673..17239d8 100644 --- a/host/source/inlprog.c +++ b/host/source/inlprog.c @@ -147,7 +147,7 @@ int main(int argc, char *argv[]) //Also don't want to continue if conflicting args are being used //flags about input files only used for writes - if ( p_flag || i_value || C_value || P_value || S_value || W_value ) { + if ( p_value || i_flag || C_value || P_value || S_value || W_value ) { check( d_value == NULL, "input args conflict can't program and dump in same operation."); operation = WRITE; } @@ -222,7 +222,7 @@ int main(int argc, char *argv[]) //By this point we know a lot about the cartridge but for things like NES discrete //mappers we'll have to play around with the memory to determine exact mapper //detect board manufacturer/flash memories as much as possible - check(!detect_map_mem( cart, transfer ), "Problem detecting cart map & memory."); + check(!detect_map_mem( cart, transfer, operation ), "Problem detecting cart map & memory."); //detect rom sizes as much as possible diff --git a/host/source/memory.c b/host/source/memory.c index cdb48ee..14df669 100644 --- a/host/source/memory.c +++ b/host/source/memory.c @@ -6,7 +6,7 @@ void init_memory_elements( memory *mem ) mem->part = UNKNOWN; mem->volatility = UNKNOWN; mem->size = UNKNOWN; - mem->addr_size = UNKNOWN; + mem->bank_size = UNKNOWN; mem->width = UNKNOWN; mem->protocol = UNKNOWN; mem->sector_size = UNKNOWN; diff --git a/host/source/memory.h b/host/source/memory.h index 55db6f0..121b758 100644 --- a/host/source/memory.h +++ b/host/source/memory.h @@ -20,14 +20,25 @@ #include "dictionary.h" #include "enums.h" +//SST 39SF0x0 manf/prod IDs +#define SST_MANF_ID 0xBF +#define SST_PROD_128 0xB5 +#define SST_PROD_256 0xB6 +#define SST_PROD_512 0xB7 + +//SRAM manf/prod ID +#define SRAM 0xAA + +//KByte for easy math +#define KBYTE 1024 //memory object/struct typedef struct memory{ int manf; int part; int volatility; //sram no batt vs batt, mask rom, erasability, etc - int size; //size of the actual memory excluding grounded address pins etc - int addr_size; //addressable size of the memory including grounded address pins etc + int size; //size of the max addressable memory grounding addr pins lowers this value + int bank_size; //size of banks/pages of memory created by mapper banking int width; //width of data bus as configured int protocol; //parallel, SPI, I2C, JTAG, custom etc. int sector_size; //minimum eraseable size in bytes diff --git a/host/source/nes.c b/host/source/nes.c index 6bd2123..1f75835 100644 --- a/host/source/nes.c +++ b/host/source/nes.c @@ -168,3 +168,165 @@ int famicom_sound( USBtransfer *transfer ) return ~FALSE; } + +/* Desc:PRG-ROM flash manf/prod ID sense test + * Using EXP0 /WE writes + * Only senses SST flash ID's + * Assumes that isn't getting tricked by having manf/prodID at $8000/8001 + * could add check and increment read address to ensure doesn't get tricked.. + * Pre: nes_init() been called to setup i/o + * exp0 pullup test must pass + * if ROM A14 is mapper controlled it must be low when CPU A14 is low + * controlling A14 outside of this function acts as a means of bank size detection + * Post:memory manf/prod ID set to read values if passed + * Software mode exited if entered successfully + * Rtn: SUCCESS if flash sensed, GEN_FAIL if not, neg if error + */ +int read_flashID_prgrom_exp0( USBtransfer *transfer, memory *flash ) { + + uint8_t rv[RV_DATA0_IDX]; + + //enter software mode + //ROMSEL controls PRG-ROM /OE which needs to be low for flash writes + //So unlock commands need to be addressed below $8000 + //DISCRETE_EXP0_PRGROM_WR doesn't toggle /ROMSEL by definition though, so A15 is unused + // 15 14 13 12 + // 0x5 = 0b 0 1 0 1 -> $5555 + // 0x2 = 0b 0 0 1 0 -> $2AAA + dictionary_call( transfer, DICT_NES, DISCRETE_EXP0_PRGROM_WR, 0x5555, 0xAA, + USB_IN, NULL, 1); + dictionary_call( transfer, DICT_NES, DISCRETE_EXP0_PRGROM_WR, 0x2AAA, 0x55, + USB_IN, NULL, 1); + dictionary_call( transfer, DICT_NES, DISCRETE_EXP0_PRGROM_WR, 0x5555, 0x90, + USB_IN, NULL, 1); + //read manf ID + dictionary_call( transfer, DICT_NES, NES_CPU_RD, 0x8000, NILL, + USB_IN, rv, RV_DATA0_IDX+1); + debug("manf id: %x", rv[RV_DATA0_IDX]); + if ( rv[RV_DATA0_IDX] != SST_MANF_ID ) { + return GEN_FAIL; + //no need for software exit since failed to enter + } + + //read prod ID + dictionary_call( transfer, DICT_NES, NES_CPU_RD, 0x8001, NILL, + USB_IN, rv, RV_DATA0_IDX+1); + debug("prod id: %x", rv[RV_DATA0_IDX]); + if ( (rv[RV_DATA0_IDX] == SST_PROD_128) + || (rv[RV_DATA0_IDX] == SST_PROD_256) + || (rv[RV_DATA0_IDX] == SST_PROD_512) ) { + //found expected manf and prod ID + flash->manf = SST_MANF_ID; + flash->part = rv[RV_DATA0_IDX]; + } + + //exit software + dictionary_call( transfer, DICT_NES, DISCRETE_EXP0_PRGROM_WR, 0x8000, 0xF0, + USB_IN, NULL, 1); + + //verify exited + //dictionary_call( transfer, DICT_NES, NES_CPU_RD, 0x8000, NILL, + // USB_IN, rv, RV_DATA0_IDX+1); + //debug("prod id: %x", rv[RV_DATA0_IDX]); + + return SUCCESS; +} + + +/* Desc:CHR-ROM flash manf/prod ID sense test + * Only senses SST flash ID's + * Does not make CHR bank writes so A14-A13 must be made valid outside of this funciton + * An NROM board does this by tieing A14:13 to A12:11 + * Other mappers will pass this function if PT0 has A14:13=01, PT1 has A14:13=10 + * Assumes that isn't getting tricked by having manf/prodID at $0000/0001 + * could add check and increment read address to ensure doesn't get tricked.. + * Pre: nes_init() been called to setup i/o + * Post:memory manf/prod ID set to read values if passed + * Software mode exited if entered successfully + * Rtn: SUCCESS if flash sensed, GEN_FAIL if not, neg if error + */ +int read_flashID_chrrom_8K( USBtransfer *transfer, memory *flash ) { + + uint8_t rv[RV_DATA0_IDX]; + + //enter software mode + //NROM has A13 tied to A11, and A14 tied to A12. + //So only A0-12 needs to be valid + //A13 needs to be low to address CHR-ROM + // 15 14 13 12 + // 0x5 = 0b 0 1 0 1 -> $1555 + // 0x2 = 0b 0 0 1 0 -> $0AAA + dictionary_call( transfer, DICT_NES, NES_PPU_WR, 0x1555, 0xAA, + USB_IN, NULL, 1); + dictionary_call( transfer, DICT_NES, NES_PPU_WR, 0x0AAA, 0x55, + USB_IN, NULL, 1); + dictionary_call( transfer, DICT_NES, NES_PPU_WR, 0x1555, 0x90, + USB_IN, NULL, 1); + //read manf ID + dictionary_call( transfer, DICT_NES, NES_PPU_RD, 0x0000, NILL, + USB_IN, rv, RV_DATA0_IDX+1); + debug("manf id: %x", rv[RV_DATA0_IDX]); + if ( rv[RV_DATA0_IDX] != SST_MANF_ID ) { + return GEN_FAIL; + //no need for software exit since failed to enter + } + + //read prod ID + dictionary_call( transfer, DICT_NES, NES_PPU_RD, 0x0001, NILL, + USB_IN, rv, RV_DATA0_IDX+1); + debug("prod id: %x", rv[RV_DATA0_IDX]); + if ( (rv[RV_DATA0_IDX] == SST_PROD_128) + || (rv[RV_DATA0_IDX] == SST_PROD_256) + || (rv[RV_DATA0_IDX] == SST_PROD_512) ) { + //found expected manf and prod ID + flash->manf = SST_MANF_ID; + flash->part = rv[RV_DATA0_IDX]; + } + + //exit software + dictionary_call( transfer, DICT_NES, NES_PPU_WR, 0x0000, 0xF0, + USB_IN, NULL, 1); + + //verify exited + //dictionary_call( transfer, DICT_NES, NES_PPU_RD, 0x0000, NILL, + // USB_IN, rv, RV_DATA0_IDX+1); + //debug("prod id: %x", rv[RV_DATA0_IDX]); + + return SUCCESS; +} + +/* Desc:Simple CHR-RAM sense test + * A more thourough test should be implemented in firmware + * This one simply tests one address in PPU address space + * Pre: nes_init() been called to setup i/o + * Post: + * Rtn: SUCCESS if ram sensed, GEN_FAIL if not, neg if error + */ +int ppu_ram_sense( USBtransfer *transfer, uint16_t addr ) { + + uint8_t rv[RV_DATA0_IDX]; + + //write 0xAA to addr + dictionary_call( transfer, DICT_NES, NES_PPU_WR, addr, 0xAA, + USB_IN, NULL, 1); + //try to read it back + dictionary_call( transfer, DICT_NES, NES_PPU_RD, addr, NILL, + USB_IN, rv, RV_DATA0_IDX+1); + debug("reading back 0xAA: %x", rv[RV_DATA0_IDX]); + if ( rv[RV_DATA0_IDX] != 0xAA ) { + return GEN_FAIL; + } + + //write 0x55 to addr + dictionary_call( transfer, DICT_NES, NES_PPU_WR, addr, 0x55, + USB_IN, NULL, 1); + //try to read it back + dictionary_call( transfer, DICT_NES, NES_PPU_RD, addr, NILL, + USB_IN, rv, RV_DATA0_IDX+1); + debug("reading back 0x55: %x", rv[RV_DATA0_IDX]); + if ( rv[RV_DATA0_IDX] != 0x55 ) { + return GEN_FAIL; + } + + return SUCCESS; +} diff --git a/host/source/nes.h b/host/source/nes.h index 6691c79..52f461b 100644 --- a/host/source/nes.h +++ b/host/source/nes.h @@ -9,18 +9,22 @@ //include prior to other file includes //that way DEBUG can be turned on/off for this file alone //uncomment to DEBUG this file alone -//#define DEBUG +#define DEBUG //"make debug" to get DEBUG msgs on entire program #include "dbg.h" #include "shared_errors.h" #include "shared_dictionaries.h" #include "dictionary.h" +#include "memory.h" #include "pindef.h" int jumper_ciramce_ppuA13n( USBtransfer *transfer ); int ciramce_inv_ppuA13( USBtransfer *transfer ); int famicom_sound( USBtransfer *transfer ); +int read_flashID_prgrom_exp0( USBtransfer *transfer, memory *flash ); +int read_flashID_chrrom_8K( USBtransfer *transfer, memory *flash ); +int ppu_ram_sense( USBtransfer *transfer, uint16_t addr ); #endif