Detecting some flash carts including NROM and UNROM.

Using CHR-RAM sensing, and flash manf/prod ID based on PRG-ROM banking

fixing bug in firmware for ppu writes was ANDing in /A13 instead of ORing..

adding datasheets to hardware folder for 5v PLCC and 3v TSOP flash used on all flash boards
This commit is contained in:
paul eeepc 2016-12-08 21:52:47 -06:00
parent d97c31db62
commit a89caf2454
13 changed files with 597 additions and 287 deletions

View File

@ -1,258 +1,310 @@
:100000000C9476000C94C1060C9493000C9493000D :100000000C94E8000C945A080C9405010C9405011A
:100010000C9493000C9493000C9493000C94930014 :100010000C9405010C9405010C9405010C94050148
:100020000C9493000C9493000C9493000C94930004 :100020000C9405010C9405010C9405010C94050138
:100030000C9493000C9493000C9493000C949300F4 :100030000C9405010C9405010C9405010C94050128
:100040000C9493000C9493000C9493000C949300E4 :100040000C9405010C9405010C9405010C94050118
:100050000C9493000C9493000C9493000C949300D4 :100050000C9405010C9405010C9405010C94050108
:100060000C9493000C9493000C9493000C949300C4 :100060000C9405010C9405010C9405010C940501F8
:100070000C9493000C9493000C94930009021200CA :100070000C9405010C9405010C940501AE04B00428
:100080000101008096090400000000000000120138 :10008000B304B504B804BA04BD04BF04C204C40474
:100090001001FF000008C016DC050002010200018B :10009000C604C904CB04CD04CF04D104D304D504D1
:1000A0001E0349004E004C00200052006500740001 :1000A000D7044A054A054A054A05D904DB04DD049C
:1000B00072006F002D00500072006F0067002A036D :1000B000DF044A054A054A054A05E104E304E5046C
:1000C00049006E00660069006E00690074006500FA :1000C000E704E904EB04ED04EF04F104F304F504A0
:1000D0004E00650073004C006900760065007300F7 :1000D000F704F904FB04FD04FF044A054A054A0538
:1000E0002E0063006F006D000403090411241FBE7D :1000E0004A05010503054805050507050B050E052D
:1000F000CFEFD4E0DEBFCDBF11E0A0E0B1E0EAEF8A :1000F000120515051B051805140517051A051D051C
:10010000FFE002C005900D92A230B107D9F722E0BE :100100001F05210523052505270529052B052D0597
:10011000A2E0B1E001C01D92AD3BB207E1F70E9441 :100110002F05310533053505370539053B053D0507
:10012000D5070C94FB070C940000EF92FF928034EB :100120003F054A054A054A054A0544054105430578
:1001300059F4E22FF0E0EE57FE4F8081F701808303 :10013000470557055B0559055D0563056A056C05AF
:1001400080E0FF90EF90089584EBFBCFE2E8F1E0D0 :100140006E0570057A057D05D105D305D505D70562
:100150008FEF819391E0EA38F907D9F78093750121 :10015000D905DB05DD05DF05E105E305E505E90575
:1001600080936501809378018093680180935501A5 :10016000090212000101008096090400000000004D
:100170008093450180935801809348018093350115 :10017000000012011001FF000008C016DC0500029B
:1001800080932501809315018093050180933801A8 :10018000010200011E0349004E004C0020005200F5
:100190008093280180931801809308010895CF93DC :100190006500740072006F002D00500072006F0047
:1001A000DF931F92CDB7DEB7811108C089830E940B :1001A00067002A0349006E00660069006E0069005E
:1001B000A60089810F90DF91CF91089584EBFACF4B :1001B000740065004E00650073004C006900760015
:1001C000CF93DF93FC0150E0CA01820F911D099784 :1001C000650073002E0063006F006D0004030904D6
:1001D0003CF5222329F183818F3F21F586818F3FD2 :1001D00011241FBECFEFD4E0DEBFCDBF11E0A0E001
:1001E00019F5DA01AE57BE4FED0180E099919F3FBE :1001E000B1E0E2E3F3E102C005900D92A230B10765
:1001F000E9F48F5F2813FACF6683138295E0440FEA :1001F000D9F713E0A2E0B1E001C01D92A938B10720
:10020000551F9A95E1F746575E4F5183408390E022 :10020000E1F70E946E090C9497090C940000CF92BC
:100210006D939F5F8913FCCF80E0DF91CF910895AC :10021000DF92EF92FF92CF93DF93DB01F701E601CC
:100220008EEBFBCF8FEBF9CF80ECF7CF81ECF5CFE6 :10022000813549F18036F1F0803509F044C01296ED
:100230000F93FB01642F422F202F8058883020F429 :100230008C911297808313968C91139781831496D7
:10024000CF010F910C94E00086EB0F9108950F936E :100240008C911497828315968C91159783831696BB
:100250001F93CF93DF93DC01EB018A0112968C91FF :100250008C911697848317968C911797858318969F
:100260001297803828F5803498F481110FC00E94CD :100260008C9123C0A22FB0E0AE5FBE4F8C918083F3
:10027000A60080E0888381E090E0F801918380838C :1002700088818F5F1DC019968C91199780831A967B
:10028000CE01DF91CF911F910F91089584EBF2CFB2 :100280008C911A9781831B968C911B9782831C9665
:10029000803461F41496EC91F0E0EE57FE4F8081CB :100290008C911C9783831D968C911D9784831E9649
:1002A000898380E0888382E090E0E7CF84EBFACF17 :1002A0008C911E9785831F968C9186838881895FA8
:1002B000482F477050E0FA013197E730F10558F4C4 :1002B000888380E001C084EBDF91CF91FF90EF90C5
:1002C000EC59FE4F0C94F5078D017B017E018101F5 :1002C000DF90CF900895FC01809142039091430309
:1002D000840187018A0162E771E0803C08F513968A :1002D00040814078403851F48681D9018C938091D7
:1002E0000C91139714962C91149715964C910E948B :1002E000420390914303409345030FC04FEFD90160
:1002F00018018883C5CF62E571E0EFCF62E471E059 :1002F0004C93268120935C0322E433E030935E0329
:10030000ECCF62E371E0E9CF62E271E0E6CF62E157 :1003000020935D0320E92093450310924603228148
:1003100071E0E3CF62E071E0E0CF62E671E0DDCF53 :10031000213711F02034D1F4A0915D03B0915E0338
:10032000FB01C081D181ACCF11B88FEF82B914B875 :100320000D90BC91A02D25812C93A0915D03B091DF
:1003300085B917B888B98AB184718AB98BB18B6EC7 :100330005E030D90BC91A02D248111962C93E09129
:100340008BB9509858985198599A08950E949401E1 :100340005D03F0915E0324812E5F24830895E2E033
:10035000399A419A389A40983A9A429A3C9A449AE1 :10035000F1E09FEF8FEF919321E0E231F207D1F7C7
:100360003D9A459A3F9A479A47988FEF84B915B8B6 :10036000809345038093350380934803809338033B
:10037000479A479814B812B881B914B885B95998F2 :1003700080932503809315038093280380931803AB
:10038000519A08950E949401399A419A3C9A449A4C :100380000895FB01813389F038F4882359F08033D4
:100390003D9A459A509A589A3F9A479A4798579A41 :1003900099F4418722870EC0823351F0833361F490
:1003A0005F9A5F988FEF84B915B8479A479814B849 :1003A000278708C00E94A70105C04387248702C091
:1003B00084B915B85F9A5F9814B812B881B914B8A7 :1003B0004587268780E0089584EB0895CF93DF93E7
:1003C00085B95998519A0895CF93DF931F92CDB76D :1003C000FC0150E0CA01820F911D41970CF046C01C
:1003D000DEB7813069F020F0823071F086E904C028 :1003D000222309F445C083818F3F09F043C0868101
:1003E00089830E94940189810F90DF91CF910895B4 :1003E0008F3F09F041C080E090E0EA01CE5FDE4F30
:1003F0000E94A60180E0F8CF0E94C201FBCFFC0161 :1003F000821750F40196DE01A80FB91F11973C91A6
:1004000081E080835898509A000089B18183509888 :100400003F3FB1F381EC31C066831382822F829526
:100410005898908181818923981308C08AEA86833D :10041000880F807E81508283148215821086178215
:100420008483828385E58583838308955098589AD1 :10042000118612861386148615861786CA0135E052
:1004300089B1818389B1828389B1838389B18483BE :10043000880F991F3A95E1F78E5E9E4F91838083D6
:1004400089B1858389B186835098589808958038FA :1004400080E090E04E5F5E4F821730F4FA01E80FD3
:1004500029F4CB010E94FF0180E0089587E9089507 :10045000F91F60830196F8CF80E007C08EEB05C0DE
:100460009FEF94B985B9479A479862B945B95898AA :1004600082EC03C08FEB01C080ECDF91CF91089547
:10047000509A5098589A14B808955098589840989F :100470000F93FB01642F422F202F803888F088389B
:10048000419A429A62B99FEF94B985B9479A4798C1 :1004800058F08059883060F40583242F30E0362BF3
:1004900014B800000000409A87FD41980000000059 :100490003087278380E005C0CF010F910C94DE01E7
:1004A000000000000000000083B14098419A0895C8 :1004A00086EB0F910895CF92DF92EF92FF920F9318
:1004B00062B99FEF94B985B9479A479814B8409AA2 :1004B000CF93DF93FC01EB016A0182819FEC980FDF
:1004C00087FD4198000000000000000083B14098C3 :1004C0009E3270F49381913071F050F0923029F0A7
:1004D000419A08955898509A9FEF94B962B985B996 :1004D0009330C1F562E173E008C062E273E005C0E9
:1004E000479A4798429845B9409A87FD419800003D :1004E00062E473E002C062E373E0803768F4803551
:1004F00000004098419A429A14B8089562B9803237 :1004F00080F4803408F047C00381248145810E9444
:1005000070F48FEF84B915B8479A479814B8449897 :10050000C101888381E03CC0803868F4960140E0F6
:10051000000000000000000083B1449A08959FEF9E :100510003CC07E019FEFE91AF90A038124814581DD
:1005200094B985B9F1CFCF93DF93982F862F642F9D :100520000E9407013DC0982F97709130A1F080F094
:10053000E901913859F0923861F0903869F40E94DD :10053000923029F0933031F462E173E00EC062E250
:100540003D02888380E0DF91CF9108950E94580298 :1005400073E00BC086E8888381E0D6018C9329C0D4
:10055000F8CF0E947E02F5CF81EAF5CF9FEF94B9E4 :1005500062E473E002C062E373E0803F50F4803CE9
:1005600062B9803248F415B8479A479845B945981A :1005600058F48038E0F00381248145810E943802EC
:100570000000459A14B8089585B9F6CFCF93C82FD7 :1005700017C0883F40F013C0DB01CD91DC9186812C
:10058000862F642F422FCC2321F0C13039F0C0EAEE :10058000F60180830EC096014FEFCF01DF91CF912E
:1005900002C00E9430028C2FCF9108950E94AE02BB :100590000F91FF90EF90DF90CF900C94630185E86E
:1005A000C0E0F9CF482F50E04B35510508F0FCC0B2 :1005A0008883CE01DF91CF910F91FF90EF90DF9084
:1005B000FA01E352FD4F0C94F50738033A033E036A :1005B000CF90089580915103803D59F410924603E5
:1005C00040034303450348034A034D034F035103CC :1005C00082E493E00E940303811103C088ED8093CD
:1005D0005403560358035A035C035E03600362032B :1005D0004503E0915D03F0915E039281848198135D
:1005E000D403D403D403D4036403660368036A0307 :1005E00002C088E9838380915103803F59F41092BF
:1005F000D403D403D403D4036C036E0370037203D7 :1005F000460382E493E00E942F03811103C088ED3B
:100600007403760378037A037C037E0380038203FA :10060000809345030895EF92FF920F931F93CF932A
:100610008403860388038A03D403D403D403D40356 :10061000DF931F92CDB7DEB77C01FC019781906814
:100620008C038E03D2039003920396039A039D03D7 :10062000F70164818281681788F4F70100811181E4
:10063000A003A603A3039F03A203A503A803AA0381 :10063000060F111D892F99830E942C04F8018083D5
:10064000AC03AE03B003B203B403B603B803BA03FA :10064000F70184818F5F84839981EACF80E00F90E6
:10065000BC03BE03C003C203C403C603C803CA036A :10065000DF91CF911F910F91FF90EF9008950F932D
:10066000D403D403D403D403CF03CC03CE03D103E8 :100660001F93CF93DF93EC011F8110689C818A81D7
:1006700011B808958FEF81B980E0089512B8FCCFCA :10067000981790F54AEA65E585E50E94040445E58A
:100680008FEF82B9F9CF14B8F7CF8FEF84B9F4CFD9 :100680006AEA8AE20E94040440EA65E585E50E9480
:1006900015B8F2CF8FEF85B9EFCF17B8EDCF18B8F7 :1006900004046C81E881F981E60FF11D4081812F0E
:1006A000EBCF8FEF88B9E8CF3898E6CF389AE4CF10 :1006A0000E9404046C81812F0E942C04082F6C810D
:1006B0004098E2CF409AE0CF3998DECF399ADCCF2C :1006B000812F0E942C040813F5CF8C81E881F981E9
:1006C0004198DACF419AD8CF3A98D6CF3A9AD4CF38 :1006C000E80FF11D9081091304C08F5F8C83599846
:1006D0004298D2CF429AD0CF3B98CECF3B9ACCCF44 :1006D000CDCF519A599ACACF80E0DF91CF911F9127
:1006E0004398CACF439AC8CF3C98C6CF3C9AC4CF50 :1006E0000F91089511B88FEF82B914B885B917B872
:1006F0004498C2CF449AC0CF3D98BECF3D9ABCCF5C :1006F00088B98AB184718AB98BB18B6E8BB95098E5
:100700004598BACF459AB8CF3E98B6CF3E9AB4CF67 :1007000058985198599A08950E947203399A419ABB
:100710004698B2CF469AB0CF3F98AECF3F9AACCF73 :10071000389A40983A9A429A3C9A449A3D9A459A15
:10072000479AAACF8AB184718AB9A6CF8BB1847156 :100720003F9A479A47988FEF84B915B8479A4798E8
:100730008BB9A2CF8BB18B6EFBCF50989DCF5898C1 :1007300014B812B881B914B885B95998519A089566
:10074000509A9ACF5098589A97CF5098589894CFDB :100740000E947203399A419A3C9A449A3D9A459A7A
:10075000519892CF519A90CF59988ECF599A8CCF69 :10075000509A589A3F9A479A4798579A5F9A5F9843
:1007600053988ACF539A88CF5B9886CF5B9A84CF71 :100760008FEF84B915B8479A479814B884B915B86B
:10077000559882CF559A80CF5D987ECF5D9A7CCF79 :100770005F9A5F9814B812B881B914B885B95998BE
:1007800056987ACF569A78CF5E9876CF5E9A74CF85 :10078000519A0895813049F028F0823051F40E9446
:10079000579872CF579A70CF5F9A6ECF5F9A5F98D3 :10079000A00305C00E94720302C00E94840380E08F
:1007A0006BCF479A479868CF8CE8089590E0FC019A :1007A000089586E90895FC0181E080835898509A65
:1007B000E058F109EB30F10508F03FC0EE51FC4F75 :1007B000000089B181835098589890818181892364
:1007C0000C94F507ED03F203F003F403FB030104BB :1007C000891308C08AEA86838483828385E58583CA
:1007D0000304050407041104130462B980E00895BA :1007D000838308955098589A89B1818389B182831F
:1007E0008FEF84B965B9FACF8FEF84B965B9479AAD :1007E00089B1838389B1848389B1858389B1868303
:1007F000479814B8F3CF8FEF84B965B95F9A5F98C3 :1007F000509858980895803829F4CB010E94D3036B
:10080000F8CF61B9EBCF64B9E9CF67B9E7CF9AB157 :1008000080E0089587E908959FEF94B985B9479AE4
:10081000862F846189238AB98AB16B7E682B6AB975 :10081000479862B945B95898509A5098589A14B860
:10082000DDCF68B9DBCF9BB1862F846189238BB97B :100820000895509858984098419A429A62B99FEF1B
:100830008BB16B7E682B6BB9D1CF8DE80895813A6F :1008300094B985B9479A479814B800000000409AC7
:1008400069F0823AC1F0803A11F58FEF84B965B949 :1008400087FD41980000000000000000000000004B
:10085000479A479814B842B980E008958FEF84B959 :1008500083B14098419A089562B99FEF94B985B9E0
:1008600065B9479A479814B842B967FF02C04198E2 :10086000479A479814B8409A87FD419800000000C5
:10087000F3CF419AF1CF42B98FEF84B9603228F4B7 :100870000000000083B14098419A0895509858981C
:1008800015B8479A479814B8E7CF65B9FACF8EE8FC :100880009FEF94B962B985B9479A4798429845B99C
:100890000895803B61F422B98FEF84B945B9479A36 :10089000409A87FD4198000000004098419A429A92
:1008A000479865B95F9A5F9814B880E008958FE81B :1008A00014B808959FEF94B9803208F4806885B930
:1008B0000895DB01482F50E0FA01E05CF109EC30CB :1008B000479A479814B862B94498000000000000B5
:1008C000F10550F5EA59FB4F0C94F50772047604D4 :1008C000000083B1449A0895CF93DF93982F862F29
:1008D00078047A047C047E04800482048404860400 :1008D000642FE901913839F0923851F0903859F489
:1008E00088048A0480B18C9380E0089583B1FBCFA3 :1008E0000E94110402C00E942C04888380E004C08E
:1008F00086B1F9CF89B1F7CF82B1F5CF85B1F3CF0A :1008F0000E945204FACF81EADF91CF9108959FEFD1
:1009000088B1F1CF8BB1EFCF81B1EDCF84B1EBCF17 :1009000094B9803208F4806885B9479A479862B9EB
:1009100087B1E9CF8AB1E7CF80E908950F938111BC :1009100045B9000045980000459A14B80895982FED
:1009200014C0589A8FEF84B922B945B9479A4798AD :10092000862F642F422F913049F028F0923051F4F5
:1009300005B9611101C04198459800000000459A31 :100930000E943E0405C00E94040402C00E947F047D
:10094000419A14B858980F9108955898EBCF0F9387 :1009400080E0089580EA089590E08B35910508F0E5
:10095000CF93C82F022F813079F020F08230A1F0A0 :10095000A1C0FC01E25CFF4F0C94910911B895C055
:10096000CAEA06C0242F462F60E081E00E948E0470 :100960008FEF81B992C012B890C08FEF82B98DC05D
:100970008C2FCF910F910895242F462F60E080E0B7 :1009700014B88BC08FEF84B988C015B886C08FEFCC
:100980000E948E04C0E0F4CF242F462F6FEFF7CFE4 :1009800085B983C017B881C018B87FC08FEF88B908
:100990000F93811119C0589A8FEF84B902B925B904 :100990007CC038987AC0389A78C0409876C0409A1F
:1009A000479A479845B95F9A5F9814B8611101C09A :1009A00074C0399872C0399A70C041986EC0419A2B
:1009B00041984498000000000000000083B1449A70 :1009B0006CC03A986AC03A9A68C0429866C0429A37
:1009C000419A58980F9108955898E6CF0F931F9326 :1009C00064C03B9862C03B9A60C043985EC0439A43
:1009D000CF93DF93E801813891F08238B1F080380D :1009D0005CC03C985AC03C9A58C0449856C0449A4F
:1009E000C9F4022F242F462F60E081E00E94C80442 :1009E00054C03D9852C03D9A50C045984EC0459A5B
:1009F000888380E0DF91CF911F910F910895022F9E :1009F0004CC03E984AC03E9A48C0469846C0469A67
:100A0000242F462F60E080E0F1CF022F242F462FC5 :100A000044C03F9842C03F9A40C0479A3EC08AB116
:100A10006FEFF9CF8BEAEECF0F931F93CF93DF9356 :100A100084718AB93AC08BB1847102C08BB18B6E7C
:100A200000D0CDB7DEB7FC018AE892E09093A20235 :100A20008BB933C0509831C05898509A2EC0509806
:100A30008093A1021A821982808187FF04C081E01D :100A3000589A2BC05098589828C0519826C0519A5F
:100A400090E09A8389838181833009F458C030F41F :100A400024C0599822C0599A20C053981EC0539A66
:100A50008130B1F08230D9F180E81BC0843009F4D4 :100A50001CC05B981AC05B9A18C0559816C0559A6E
:100A60005EC08530C9F7AE014F5F5F4F6AE872E044 :100A600014C05D9812C05D9A10C056980EC0569A78
:100A7000CF010E9427019093A2028093A10237C068 :100A70000CC05E980AC05E9A08C0579806C0579A84
:100A80008281803B48F4803A98F4803868F40E9470 :100A800004C05F9A02C05F9A5F9880E00895479A19
:100A9000D20280938A022BC0803C78F42481458165 :100A90004798FBCF8CE8089590E0FC01E058F109FD
:100AA00063810E944904F5CF64810E94D603F1CF8F :100AA000EB30F105A0F5E756FF4F0C94910962B9C0
:100AB000448165810E941F04ECCF6BE872E00E94C4 :100AB00022C08FEF84B965B91EC08FEF84B965B9C4
:100AC000590480938A0289819A8101960EC082819D :100AC000479A479805C08FEF84B965B95F9A5F98D8
:100AD000803818F40E94E401DCCF6BE872E00E94D9 :100AD00014B811C061B90FC064B90DC067B90BC0BB
:100AE000270280938A0288E090E09A838983898133 :100AE0009AB1862F846189238AB98AB16B7E682B7B
:100AF0000F900F90DF91CF911F910F9108958281F8 :100AF0006AB901C068B980E008959BB1862F84610E
:100B0000803830F42381448165810E94BE02C1CFC8 :100B000089238BB98BB16B7E682B6BB9F4CF8DE8E1
:100B10002BE832E0448165810E949302D2CF82812A :100B10000895813A61F0823AB9F0803A11F58FEF89
:100B2000803830F42381448165810E94A704B1CFCD :100B200084B965B9479A479814B842B916C08FEF8F
:100B30000BE812E02481458163810E94E604C1CF65 :100B300084B965B9479A479814B842B967FF02C0AB
:100B400081E00895CF93DF936091A302635067FD26 :100B400041980BC0419A09C042B98FEF84B9603215
:100B500091C08091A002CCE0D0E0C81BD109C9555A :100B500030F415B8479A479814B880E0089565B9FD
:100B6000DD4F80919F028D3209F0CFC0683009F0CF :100B6000F9CF8EE80895803B61F422B98FEF84B904
:100B70007FC083EC809393028AE5809301011092F9 :100B700045B9479A479865B95F9A5F9814B880E07D
:100B800092028881807679F0CE010E940C058F3F19 :100B800008958FE80895CF93DF93EB0190E0805CA8
:100B900009F466C09F81911169C09E81981708F081 :100B900091098C309105F8F48C559F4FFC010C9411
:100BA00065C0892F63C02A8110929C02998191119E :100BA000910980B113C083B111C086B10FC089B162
:100BB0000AC010929D022CE932E082E03093A2023A :100BB0000DC082B10BC085B109C088B107C08BB12F
:100BC0002093A102E7CF953029F42093A4022CE9C9 :100BC00005C081B103C084B101C087B1888380E0D2
:100BD00032E0F4CF963099F59B81913059F48EE84C :100BD00003C08AB1FBCF80E9DF91CF9108950F93D5
:100BE00090E09093A2028093A10282E190E490931E :100BE000811102C0589A01C058988FEF84B922B978
:100BF0009202D0CF923019F48CE790E0F2CF93308C :100BF00045B9479A479805B9459800000000459ABD
:100C0000A9F7211108C088EE90E09093A20280938A :100C0000419A14B858980F9108950F93022F81308C
:100C1000A10284E0EBCF213041F48EEB90E0909381 :100C100061F030F0823089F4242F462F60E008C064
:100C2000A2028093A1028AE2E1CF2230F9F680EAA3 :100C2000242F462F6FEF81E004C0242F462F6FEF53
:100C300090E09093A2028093A1028EE1D7CF9830EA :100C300080E00E94EF0580E001C08AEA0F910895EC
:100C400059F0993019F42093A602C1CF81E09A306F :100C40000F93811102C0589A01C058988FEF84B950
:100C500009F4BDCF80E0BBCF26EA32E081E0AECF21 :100C500002B925B9479A479845B95F9A5F9814B881
:100C6000988197FD8E8190E8909392028093000185 :100C60004498000000000000000083B1449A419ABB
:100C70001092A3028091010184FF3AC0809100018B :100C700058980F9108950F931F93CF93DF93E80136
:100C80008F3FB1F1C82F893008F0C8E08C1B8093EA :100C8000813851F0823891F08038A9F4022F242F56
:100C900000018091930298E8892780939302CC23E6 :100C9000462F6FEF81E005C0022F242F462F6FEF04
:100CA000D1F08091A1029091A2022091920226FFA0 :100CA00080E00E942006888380E006C0022F242F67
:100CB0003FC0A4E9B2E0FC012C2F34913D93319662 :100CB000462F60E0F5CF8BEADF91CF911F910F9126
:100CC0002150D9F701962FEF2C0F820F911D909391 :100CC00008950F931F93CF93DF931F92CDB7DEB795
:100CD000A2028093A1026C2F84E992E00E94BD06DB :100CD000FC0182E593E090936E0380936D0319828B
:100CE000CC5FCC3019F08FEF80930001C0930101ED :100CE000808187FF02C081E089838181833009F49C
:100CF00084E199B1947131F48150D9F71092A40232 :100CF0004BC028F48130D1F08230C1F179C0853009
:100D000010929E02DF91CF9108958091920287FF09 :100D000009F467C008F454C0863009F071C010922D
:100D1000AFCFCE010E94A0058F3F21F48EE18093DA :100D1000520380915A0380935303E0915D03F09155
:100D20000101A6CF882309F4A3CF10920001A0CF20 :100D20005E0382818093540383E060C08281803BB4
:100D3000E4E9F2E0DC012C2F3D9131932150E1F701 :100D300038F4803A88F4803858F40E94A40459C0EA
:100D4000C1CFE9E6F0E0808182608083E89A08956F :100D4000803C78F42481458163810E94B30551C0C1
:100D5000A82FB92F80E090E041E050EA609530E0A4 :100D500064810E944C054DC0448165810E948905D3
:100D600009C02D9182279795879510F084279527A4 :100D600048C063E573E00E94C3051DC082818038DE
:100D7000305EC8F36F5FA8F30895EADF8D939D930B :100D700018F40E94C2033DC063E573E00E94FB03C8
:100D80000895CF93CFB7CF93DF93C3954C9BE9F7EB :100D80008093520388E032C08281803830F423811E
:100D90004C9B0BC04C9B09C04C9B07C04C9B05C097 :100D9000448165810E948F042CC023E533E04481A7
:100DA0004C9B03C04C9B01C089C06F93C091A002B3 :100DA00065810E9464048093520389818F5F1EC015
:100DB000DD27C955DD4F2F9365E54C9B03C02F916F :100DB0008281803830F42381448165810E94050658
:100DC0006F91E6CF0F931F934F9320E040E15F9325 :100DC00018C003E513E02481458163810E943B063E
:100DD00009B1047104FB27F93F9350E03BE039C0AF :100DD000EACFAE014F5F5F4F62E573E0CF010E9443
:100DE000147140642F77012F5F5F1EC0406819B1F6 :100DE000530290936E0380936D0305C0898303C003
:100DF00014712F7752501FC0406409B12F770471CE :100DF00080E88093520389810F90DF91CF911F91FA
:100E0000D1F15F5F00C023C0406219B12F77147128 :100E00000F910895E0915D03F0915E03448120818C
:100E100091F15F5F00C025C004711027515012F49A :100E10003181582FFC01742F781B972F9E0F8E2F36
:100E20005D5F0000115027952C3F19B1C8F6147171 :100E2000851B861730F48191D901A90FB11D8C93D0
:100E30000127015027952C3FC8F64227499309B155 :100E3000F4CFE0915D03F0915E038481860F84839B
:100E4000047110274F73115027952C3FA8F6469533 :100E400090915C03961B90935C0310925A03640F7D
:100E5000469519B1147179F00127015027952C3F5F :100E50008281861302C088E9838381E0911180E05A
:100E600098F66B5A60F3315009B1B0F600C011E04A :100E60000895CF93DF9360916F03635067FDA4C033
:100E70001CBB002717C03B503195C31BD04011E06D :100E700080916C03CCE0D0E0C81BD109CD58DC4F89
:100E80001CBB0881033CF9F00B34E9F020919E0271 :100E800080916B038D3209F085C0683009F092C003
:100E90001981110F1213EDCF093651F10D3211F0F6 :100E900083EC80935F038AE58093010110925B03EA
:100EA000013E39F70093A5023F915F914F911F9149 :100EA0008881807621F0CE010E94610660C08A812F
:100EB0000F912F916F91CCB3C0FD67CFDF91CF9190 :100EB000109268039981911106C01092690328E687
:100EC000CFBFCF9118952091A502222369F31091ED :100EC00033E082E050C0953019F4809370033DC048
:100ED000A302112339F534303AF13093A302209361 :100ED0009630A9F59B81913019F482E791E004C026
:100EE0009F021091A0023BE0311B3093A0021CC076 :100EE000923041F480E691E090936E0380936D031D
:100EF0000091A3020130B4F40AE53091010134FD00 :100EF00082E121C09330F1F4811108C08CEC91E0C3
:100F000014C000930101C3E9D2E013C0052710E02B :100F000090936E0380936D0384E015C0813041F4AB
:100F100000C000000BB91AC0052710E0221F1DC039 :100F100082EA91E090936E0380936D038AE20BC0A6
:100F200010E021C04AE502C032ED432FC4E1D0E019 :100F2000823041F484E891E090936E0380936D03E6
:100F300032E01AB114615C9A0BB11AB954E120E89D :100F30008EE101C080E090E490935B0318C098308C
:100F400065E320FF05270BB9279517951C3FF0F6A1 :100F400079F0993031F48093720328E633E080E041
:100F50006695B8F7B1F720FF05270BB927951795C8 :100F50000AC081E09A3009F080E028E633E003C05F
:100F60001C3FD0F62795179517FF052700001C3F5B :100F600022E733E081E030936E0320936D038F3FDF
:100F70000BB9B0F629913A9519F70B7E1091A4029E :100F700039F4988197FD8E8190E890935B0307C0C8
:100F8000110FC651D0400BB911F010939E0211E021 :100F80009F81911104C09E81981708F4892F809346
:100F90001CBB00611AB11B7E402F4B7E54E05A955A :100F9000000110C080915B0387FF0CC0CE010E944E
:100FA000F1F70BB91AB94BB97FCF9EE088E10FB6C4 :100FA00002078F3F21F48EE18093010103C081117C
:100FB000F894A895809360000FBE909360000E9403 :100FB0001092000110926F038091010184FF4DC0D7
:100FC000A106549A80E0815041F454980E94940103 :100FC000809100018F3F09F448C0C82F893008F094
:100FD0007894A8950E94A205FCCFA895EFE9FFE0C0 :100FD000C8E08C1B8093000180915F0398E889270B
:100FE0003197F1F700C00000EECFEE0FFF1F059024 :100FE00080935F03CC2361F180916D0390916E0338
:0A0FF000F491E02D0994F894FFCF6E :100FF00020915B0326FF12C0A0E6B3E02FE533E0AB
:020FFA00FF5A9C :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 :00000001FF

BIN
firmware/source/.nes.c.swp Normal file

Binary file not shown.

View File

@ -26,6 +26,9 @@ uint8_t nes_opcode_24b_operand( uint8_t opcode, uint8_t addrH, uint8_t addrL, ui
case NES_PPU_WR: case NES_PPU_WR:
nes_ppu_wr( addrH, addrL, data ); nes_ppu_wr( addrH, addrL, data );
break; break;
case NES_CPU_WR:
nes_cpu_wr( addrH, addrL, data );
break;
default: default:
//macro doesn't exist //macro doesn't exist
return ERR_UNKN_NES_OPCODE_24BOP; 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_LO(); //Tas = 0ns, Tah = 30ns
_EXP0_PU(); //Twp = 40ns, Tds = 40ns, Tdh = 0ns _EXP0_PU(); //Twp = 40ns, Tds = 40ns, Tdh = 0ns
//16Mhz avr clk = 62.5ns period guarantees timing reqts //16Mhz avr clk = 62.5ns period guarantees timing reqts
//Need to check with scope to make sure EXP0 P/U effective
_DATA_IP(); _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 ) void nes_cpu_wr( uint8_t addrH, uint8_t addrL, uint8_t data )
{ {
//Float EXP0 as it should be in NES //Float EXP0 as it should be in NES
_EXP0_LO(); _EXP0_FLT();
//need for whole function //need for whole function
_DATA_OP(); _DATA_OP();
@ -265,13 +267,14 @@ uint8_t nes_ppu_rd( uint8_t addrH, uint8_t addrL )
{ {
uint8_t read; //return value uint8_t read; //return value
//set address bus
ADDR_OUT = addrL;
if (addrH < 0x20) { //below $2000 A13 clear, /A13 set 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 } else { //above PPU $1FFF, A13 set, /A13 clear
_ADDRH_SET(addrH); _ADDRH_SET(addrH);
} }
//set address bus
ADDR_OUT = addrL;
//set CHR /RD and /WR //set CHR /RD and /WR
_CSRD_LO(); _CSRD_LO();
@ -296,6 +299,7 @@ uint8_t nes_ppu_rd( uint8_t addrH, uint8_t addrL )
/* Desc:NES PPU Write /* Desc:NES PPU Write
* decode A13 from addrH to set /A13 as expected * 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 * Pre: nes_init() setup of io pins
* Post:data written to addrHL * Post:data written to addrHL
* address left on bus * 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 //will need output whole function
_DATA_OP(); _DATA_OP();
//set address bus
ADDR_OUT = addrL;
//addrH with PPU /A13 //addrH with PPU /A13
if (addrH < 0x20) { //below $2000 A13 clear, /A13 set 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 } else { //above PPU $1FFF, A13 set, /A13 clear
DATA_OUT = addrH; DATA_OUT = addrH;
} }
//latch addrH //latch addrH
_AHL_CLK(); _AHL_CLK();
//set address bus
ADDR_OUT = addrL;
//put data on bus //put data on bus
DATA_OUT = data; DATA_OUT = data;
NOP();
//set CHR /RD and /WR //set CHR /RD and /WR
//_CSRD_HI(); already done //_CSRD_HI(); already done

Binary file not shown.

Binary file not shown.

View File

@ -138,7 +138,7 @@ int detect_mirroring( cartridge *cart, USBtransfer *transfer )
//always start with resetting i/o //always start with resetting i/o
io_reset( transfer ); 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 //For now just assume mirroring is fixed until start adding support for other mappers
cart->mirroring = MIR_FIXED; 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 //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 //always start with resetting i/o
io_reset( transfer ); 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 { //Most ASIC mappers can be determined by their mirroring alone
//Potentially some other discrete board without EXP0->WE flash control
//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) {
} case FC_CART:
//for NROM flashing first verify EXP0 pull up will clock /WE properly 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 //always end with resetting i/o
@ -181,8 +252,8 @@ int detect_map_mem( cartridge *cart, USBtransfer *transfer )
return SUCCESS; return SUCCESS;
//error: error:
//always end with resetting i/o //always end with resetting i/o
//io_reset( transfer ); io_reset( transfer );
// return -1; return -1;
} }

View File

@ -46,6 +46,7 @@ typedef struct cartridge{
int init_cart_elements( cartridge *cart ); int init_cart_elements( cartridge *cart );
int detect_console( cartridge *cart, USBtransfer *transfer ); int detect_console( cartridge *cart, USBtransfer *transfer );
int detect_mirroring( cartridge *cart, USBtransfer *transfer ); int detect_mirroring( cartridge *cart, USBtransfer *transfer );
int detect_map_mem( cartridge *cart, USBtransfer *transfer, int oper );
#endif #endif

View File

@ -4,6 +4,8 @@ int erase_nes( USBtransfer *transfer )
{ {
//uint8_t rv[8]; //uint8_t rv[8];
//int i = 0; //int i = 0;
return 0;
debug("erasing_nrom"); debug("erasing_nrom");
@ -92,6 +94,6 @@ int erase_nes( USBtransfer *transfer )
return 0; return 0;
error: //error:
return -1; // return -1;
} }

View File

@ -147,7 +147,7 @@ int main(int argc, char *argv[])
//Also don't want to continue if conflicting args are being used //Also don't want to continue if conflicting args are being used
//flags about input files only used for writes //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."); check( d_value == NULL, "input args conflict can't program and dump in same operation.");
operation = WRITE; 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 //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 //mappers we'll have to play around with the memory to determine exact mapper
//detect board manufacturer/flash memories as much as possible //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 //detect rom sizes as much as possible

View File

@ -6,7 +6,7 @@ void init_memory_elements( memory *mem )
mem->part = UNKNOWN; mem->part = UNKNOWN;
mem->volatility = UNKNOWN; mem->volatility = UNKNOWN;
mem->size = UNKNOWN; mem->size = UNKNOWN;
mem->addr_size = UNKNOWN; mem->bank_size = UNKNOWN;
mem->width = UNKNOWN; mem->width = UNKNOWN;
mem->protocol = UNKNOWN; mem->protocol = UNKNOWN;
mem->sector_size = UNKNOWN; mem->sector_size = UNKNOWN;

View File

@ -20,14 +20,25 @@
#include "dictionary.h" #include "dictionary.h"
#include "enums.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 //memory object/struct
typedef struct memory{ typedef struct memory{
int manf; int manf;
int part; int part;
int volatility; //sram no batt vs batt, mask rom, erasability, etc int volatility; //sram no batt vs batt, mask rom, erasability, etc
int size; //size of the actual memory excluding grounded address pins etc int size; //size of the max addressable memory grounding addr pins lowers this value
int addr_size; //addressable size of the memory including grounded address pins etc int bank_size; //size of banks/pages of memory created by mapper banking
int width; //width of data bus as configured int width; //width of data bus as configured
int protocol; //parallel, SPI, I2C, JTAG, custom etc. int protocol; //parallel, SPI, I2C, JTAG, custom etc.
int sector_size; //minimum eraseable size in bytes int sector_size; //minimum eraseable size in bytes

View File

@ -168,3 +168,165 @@ int famicom_sound( USBtransfer *transfer )
return ~FALSE; 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;
}

View File

@ -9,18 +9,22 @@
//include prior to other file includes //include prior to other file includes
//that way DEBUG can be turned on/off for this file alone //that way DEBUG can be turned on/off for this file alone
//uncomment to DEBUG this file alone //uncomment to DEBUG this file alone
//#define DEBUG #define DEBUG
//"make debug" to get DEBUG msgs on entire program //"make debug" to get DEBUG msgs on entire program
#include "dbg.h" #include "dbg.h"
#include "shared_errors.h" #include "shared_errors.h"
#include "shared_dictionaries.h" #include "shared_dictionaries.h"
#include "dictionary.h" #include "dictionary.h"
#include "memory.h"
#include "pindef.h" #include "pindef.h"
int jumper_ciramce_ppuA13n( USBtransfer *transfer ); int jumper_ciramce_ppuA13n( USBtransfer *transfer );
int ciramce_inv_ppuA13( USBtransfer *transfer ); int ciramce_inv_ppuA13( USBtransfer *transfer );
int famicom_sound( 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 #endif