mirror of
				https://github.com/davidgiven/fluxengine.git
				synced 2025-10-24 11:11:02 -07:00 
			
		
		
		
	Compare commits
	
		
			30 Commits
		
	
	
		
			FluxEngine
			...
			FluxEngine
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | dce0a26820 | ||
|  | 14e0a67e7d | ||
|  | 1656947764 | ||
|  | 647862cdbd | ||
|  | 4a8d83838c | ||
|  | 8acf8e181d | ||
|  | 2df9920209 | ||
|  | 1a6c6b5420 | ||
|  | edc56d44d6 | ||
|  | ef4eff0195 | ||
|  | df8d45bf66 | ||
|  | 89a27619ff | ||
|  | 387a86969a | ||
|  | acb5059d17 | ||
|  | a4002d2617 | ||
|  | a63a90bbd0 | ||
|  | d25f96dd24 | ||
|  | e8febe6508 | ||
|  | ad3a930c6a | ||
|  | be41c1de76 | ||
|  | d528978667 | ||
|  | 827fcf69d2 | ||
|  | 711ff545e0 | ||
|  | 5befa31050 | ||
|  | 8e5c2d0ebb | ||
|  | f95fceeb3d | ||
|  | 003b20dbf0 | ||
|  | cd9bbaa4b6 | ||
|  | 71e622bf72 | ||
|  | 2a065a08df | 
| @@ -15,7 +15,7 @@ install: | ||||
|  | ||||
| build_script: | ||||
|   - make | ||||
|   - zip -9 fluxengine.zip fluxengine.exe brother120tool.exe FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex | ||||
|   - zip -9 fluxengine.zip fluxengine.exe brother120tool.exe brother240tool.exe FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex | ||||
|  | ||||
| artifacts: | ||||
|   - path: fluxengine.zip | ||||
|   | ||||
| @@ -1,252 +1,252 @@ | ||||
| :4000000000800020110000007910000079100000064A08B5136843F020031360044B1A6803F53F5302331A6001F044F8E8460040FA46004010B5054C237833B9044B13B1D7 | ||||
| :400040000448AFF300800123237010BD6081FF1F0000000028360000084B10B51BB108490848AFF300800848036803B910BD074B002BFBD0BDE81040184700BF00000000EB | ||||
| :400080006481FF1F28360000C880FF1F000000000A4A0B4B116801310B40002BBEBF03F1FF3363F00F030133136011685368994202BF024B01221A72704700BF8081FF1F9E | ||||
| :4000C0000F0000800A4A0B4B516801310B40002BBEBF03F1FF3363F00F030133536051681368994202BF024B01221A72704700BF8081FF1F0F000080024B012200205A722B | ||||
| :4001000002F086B88081FF1F10B5C4B2204601F077F90128FAD110BD08B572B60F4B0F49DA680132DA601A690132C82A08BF00221A615A6918690132A72A08BF00224A617F | ||||
| :400140005B69002B0CBF02230023002814BF184643F0010002F054FD62B608BD8081FF1F10B504460D4B8278997E91421CBF00225A7702689A610279094B1A718378002BB3 | ||||
| :4001800014BF0220012002F0FFFCE07802F0F6FC2079BDE8104002F02DBD00BF8081FF1F9881FF1F70B5C4B220460E4601F030F9314605460246204601F090F9204601F0D1 | ||||
| :4001C0001FF90128FAD0284670BD000038B50B4CA57F5DB904F11800FFF7C2FF012001F0ADFF4FF47A7002F04FF96577E36823620123A377BDE8384002F084B98081FF1F9D | ||||
| :4002000038B50446C5B2284601F0A4FF062002F051F944F00200C0B201F09CFF062002F049F9284601F096FFBDE83840062002F02BB910B5642401F087FF20B10120BDE8B6 | ||||
| :400240001040FFF7DDBF0120FFF7DAFF013CF2D1F4E7000038B5044D0024285D013402F0D9F8102CF9D138BDA481FF1F08B502F0F3FA002002F0FCFA02F00EFB02F018FB10 | ||||
| :4002800080B208BD10B50446012001F07BFF642002F0FAF8FFF7EAFF2080002001F072FF642002F0F1F8FFF7E1FF608010BD08B502F0FEFB002002F007FC02F019FC02F0AB | ||||
| :4002C00023FC80B208BD10B50446FFF7B2FF322002F0DAF8FFF7EBFF20800020FFF790FF322002F0D1F8FFF7E2FF608010BD0FB400B593B014AB53F8042B402102A80193D3 | ||||
| :4003000002F07AFD02A801F08AFF01F094FF13B05DF804EB04B0704710B5044601780648FFF7E5FF0420FFF7EFFE62782146BDE81040042001F080B83A36000007B50023B1 | ||||
| :40034000ADF804308DF80600032301A88DF80530FFF7E2FF03B05DF804FB0000F8B51D4C0646FFF733FF637F03B156B91A48FFF7BEFFFFF75EFF012000236077636302F048 | ||||
| :4003800099F83246616B1548FFF7B1FF114D0027636B9E4216D001F0D7FE00B16F63636B9E4205DD0020FFF72BFF6B6B013305E005DA0120FFF724FF6B6B013B6B6302F059 | ||||
| :4003C000A1F8E5E7322002F05FF8BDE8F8400448FFF78DBF8081FF1F473600004E3600006B3600002DE9F04F9BB062B602F0F4F8B749042002F018F9B64801F0B1FEB64878 | ||||
| :4004000002F0E4FBB54801F0E5FE02F0C5FA02F097F9002002F0B8FB01F000FF0221002000F0A4FFAE4D0321084602F04BF82E462C46DFF8D4B202F065F8AB7F73B12A6A46 | ||||
| :40044000EB689B1A41F28832934207D9002001F075FE002002F098FB0023AB7700F0BEFF18B9A048FFF743FF04E000F0BDFF0028F7D109E000F0B2FF0028FBD09A48FFF7F1 | ||||
| :4004800036FF032001F016F8032000F0B9FF0128D1D19648FFF764FE95490320FFF782FE94F838109348FFF722FF94F83830023B122B00F2F583DFE813F01300F3031C0015 | ||||
| :4004C000F3032200F3034400F3036800F303A001F3033503F3035403F3035A03F303650303238DF828308DF829300B238DF82A3044E394F83A00FFF731FF7F4B3BE3FFF7AA | ||||
| :4005000065FE00236372E068627A02F0FF0132B9EB681B1AB3F57A7FF6DD0B4608E03BB100227272F168627A12B9EB685B1AFAE707228DF8282004228DF82920ADF82A30A6 | ||||
| :400540001CE30220FFF7E0FD4FF000090DF1280A4FF480780027C8EB0903DA1907F80A200137402FF9D10220FFF7CEFD3A465146022000F061FFB8F10108EBD109F1010983 | ||||
| :40058000B9F1400FE4D15D4BC7E294F83A0001F0F9FD606BFFF7E2FE02F09AFB584BDFF86C811A78002742F004021A701A7842F001021A701A7802F0FE021A701A7802F0A2 | ||||
| :4005C000FE021A7002F088FB0220FFF79DFD41F6FF734FF480420121022002F0DBFA84F8780001F0FDFE08F807000137102FF8D1DFF81CA100270AF15D081FFA88F901377D | ||||
| :40060000102F14BF3A4600221AF8010F2244062392F82420402101F017FF4A4646F242419AF8000001F022FF09F14009102F1FFA89F9E4D196F83B3033B100237372637A9C | ||||
| :40064000002BFCD000237372142200210AA802F09FFB40234FF0FF320D9300232360626023722368274F234493F8241094F878000C9701F06DFE94F8780001F02BFE01210C | ||||
| :4006800094F8780001F0FEFD04972368002BFCD000277760D6F80CA0237A7BB901F032FFA98F04E0EB68CAEB03038B4206D2626823689A422ED12B7A002BF3D094F808801C | ||||
| :4006C000042194F878005FFA88F801F04DFE54E019010000F900000091000000C50000008081FF1F793600008C3600009881FF1FB881FF1F963600002C3600002E3600006F | ||||
| :40070000926400400086FF1F9C640040A481FF1FA381FF1F4FF0000962680AA808EB82124A440A92C9F140020B9200F0DBFA0B9A0137C2F1400209EB02030D9A5FFA83F900 | ||||
| :400740005AB90220FFF7E0FC4022BD49022000F073FE049B0C9340230D93B9F13F0FDBD96268B84B01321340002BBEBF03F1FF3363F00F03013363608EE794F8780001F0B3 | ||||
| :4007800003FE0028F9D10AA800F0E0FA0220FFF7BBFC0D9B402B07D002204022A84900F04BFE0220FFF7B0FC0D9B022033F040021DBFC3F1400292B2A149114600F03CFEEF | ||||
| :4007C0000220FFF7A1FCFFF745FDB8F1000F06D09D48FFF78CFD0220FFF7B0FD06E09B4B09A81B88ADF82430FFF796FD627A3946237A9748FFF77BFD55E29648FFF777FDEF | ||||
| :40080000E76B17F03F0701D003204AE2012001F0BFFC95F83A0001F0B5FC02F059FA9BF80030DFF8348203F0FB038BF800309BF8003043F001038BF800309BF8003003F027 | ||||
| :40084000FE038BF800309BF8003003F0FE038BF8003002F041FA686BFFF780FD01214FF4804341F6FF72084601F098FC85F8780001F0B6FD08F807000137102FF8D1DFF88D | ||||
| :40088000DC91002709F15D031FFA83F807930137102F14BF3A46002219F8010F2244052392F82420402101F0CFFD414646F24C4299F8000001F0DAFD08F14008102F1FFA56 | ||||
| :4008C00088F8E4D10027B946BA46F36B4FF0FF389B09142239460AA837600493C6F80480377202F055FA402301200D9300F0E2FDCDF81880059701F005FE2268514B01322B | ||||
| :400900001340002BBCBF03F1FF3363F00F036168B8BF01338B4200F0A380BAF1000F07D0237A002B40F0B0806B7A002B40F0AC800B9B002B34D1B9F1000F0BD07F22404926 | ||||
| :400940005A540133402BFAD10A910B9328E0BAF1000F06D1012000F053FD01288046F6D107E0237A002B40F08F806B7A002BF1D08AE03349FFF716FC8146314B0B90404665 | ||||
| :400980000A9300F097FDB9F13F0F07F1010706DD049BDB1BD3F1000949EB030900E0C1460B9BDBB12368079A0AA802EB83120D9BC3F1400313440C9300F0D7F90D9B6BB9FF | ||||
| :4009C0002A68204B01321340002BBEBF03F1FF3363F00F030133236040230D93636801333ED12B680F2B3BD14FF00008C5F8048001F002FC85F808806B6895F878002B44DD | ||||
| :400A000093F8241001F0A4FC95F8780001F062FC012195F8780001F035FC85F80980637A002BFCD04FF00008012086F8098001F0EFFB404601F0ACFBCDF8188013E000BF78 | ||||
| :400A40000086FF1F0F000080A536000030360000BF360000D2360000A481FF1FA381FF1FBAF1000F05D0237A73B96B7A63B94FF0010A6368069A93423FF43DAF059B0133AA | ||||
| :400A800005936B68069336E701F0BCFB012001F07FFB002001F0BCFB042194F8780001F063FC94F8780001F06FFC0028F9D196F8780001F0FDFB737A327A02930123039278 | ||||
| :400AC0000193CDF80090059B3A4604997A48FFF70EFCB9F1000F16D1049BBB420ADD012000F08EFC01288046F6D17449FFF75AFB3F2803DC012000F017FD04E0404600F04D | ||||
| :400B0000D9FC0137E8E7FFF7A5FB6D48FFF7EFFB237A0BB10220C4E06A4B1B8809A8ADF824302CE094F83A0001F02CFB606BFFF715FC6548FFF7DBFB00236372637A002B58 | ||||
| :400B4000FCD0012001F064FB00237372637A002BFCD0002001F05CFB5C48FFF7C8FB5C4B09E000206077FFF7F9FB5A4B03E05A48FFF7F6FA594B1B88ADF828300AA8FFF72A | ||||
| :400B8000CBFB90E0A37F3BB1002001F0D7FA002001F0FAFF0023AB7701F07CFF002001F01FFF2A2701F04AFE002001F0EDFD3A4600210AA802F0ECF815238DF828308DF8DD | ||||
| :400BC000297001F09FFC002001F0B8FA002001F0DBFFC82001F058FC0DEB0700FFF752FB0DF13E00FFF76FFB01F08CFC012001F0CBFF322001F048FC0DF12E00FFF742FBDC | ||||
| :400C00000DF14200FFF75FFB012001F097FA4FF4967001F039FC01F075FC0DF13600FFF731FB0DF14A00FFF74EFB002001F086FA4FF4967001F028FC01F064FC022001F080 | ||||
| :400C4000A3FF322001F020FC0DF13200FFF71AFB0DF14600FFF737FB012001F06FFA4FF4967001F011FC01F04DFC0DF13A00FFF709FB0DF14E00FFF726FB002001F05EFAD2 | ||||
| :400C80004FF4967001F000FC01F03CFC002001F07BFF0023637701F07FFE01F051FD6DE70120FFF74BFB032000F004FC0C48FFF71EFBFFF7C0BB00BFDC3600000086FF1F93 | ||||
| :400CC0000C370000323600001B370000293700003436000036360000B881FF1F383600003637000010B54268002A2ED0C368002B2BD00368048A591C01601B78013A13F007 | ||||
| :400D0000800F817C42601DBF03F0010242EA84030231083114BF43F0020343EA0423817414BF03820382837C072BDCD9028A083B42FA03F38268511C81601370C368013B5A | ||||
| :400D4000C360837C083B8374CDE710BD07B5827C42B102AA002102F8011D026001224260FFF7C0FF03B05DF804FB30B543686BB3C2685AB3827C072A0CD8046890F91050D4 | ||||
| :400D8000611C01602178013B41EA05210832018243608274827C018AA2F108042141CBB2090608D5C3F3801363F07F03023A03F08103827402E08474002BD7D08268511C1C | ||||
| :400DC00081601370C368013BC360CFE730BD00002DE9F04172B6854B61221A70A3F5F06301221A801924824A9C7092E803008033062283F8002283E80300522203F5807397 | ||||
| :400E00001A707C4B7C4A1B787C4EDBB2137040F618027B4B00251A8041F2512223F8022C33784FF4F07003F0010343EA450501F047FF013C05F003052ED0032DF0D1714B92 | ||||
| :400E40004FF480721A8007221A706F4A002548211570917002221D705D7103F8032C0422DA716A4A6A4C13786A4E43F00103137012F8013C062743F0030302F8013C237823 | ||||
| :400E8000012243F080032370584B1A70624A137843F02003137000E0FEE707FB056300219A881868013501F073FF072DF5D15B485B4E002550F8041F05F1105303F1520287 | ||||
| :400EC00021F0FF075333C9B20B4452005B0002329A4206D012F802EC12F801CC0EF807C0F5E7B0420D44E5D14E4B00221A604E4B4E4F1A684E4BDFF87C811A604D4A137891 | ||||
| :400F000043F002031370137C43F0020313742378A2F5863243F040032370413A137843F010031370444A454B07CA03C31A80444A2833106843F8250C127903F8212C414A6C | ||||
| :400F400007CA03C31A80404AE83B07CA03C31A803E4A083307CA03C31A803D4A3D4BA2F5616203CBC2F8100EC2F8141E1378042043F008031370384B02F5AA521B783D7845 | ||||
| :400F8000DBB298F80060EDB203F007010C321B091170F6B2537045F003033B7046F0030388F800302D4B48221A702D4A402313702C49937013729372082382F81F322022F7 | ||||
| :400FC0000A7048710A72284A0A20137001F072FA264B88F8006044223D70254D1A7094E80F0007C52B80BDE8F08100BF00480040840F00480F010049A14600402542004005 | ||||
| :40100000224200400440004006400040A2430040A04300403B370000E8460040FCFFFF47A0000048007600408C0F0048F84600400876004003500140440F0048C05100405C | ||||
| :40104000500F0048580F0048640F0048700F0048325100407C0F0048CF0100491D51004001590040235B0040585B004076580040B0430040F946004008B501F05DFE0368BC | ||||
| :401080000C2B00D1FEE7FEE7084908B50B68084A1844821A802A01DC086005E001F04CFE0C2303604FF0FF33184608BDCC80FF1F4087FF1F80B51148114B0025C0B1A3F1FB | ||||
| :4010C000100192C922460439161BB74204D051F8046F42F8046BF7E7114653F8046C8C1AA64202D041F8045BF9E701381033E5E701F028FEFFF776F9FEE700BF010000004B | ||||
| :401100000C390000124A134B10B51A60124A134C1368134843F4007313600023032B98BF54F823204FEA830188BF0E4A0133302B4250F3D10C4B1A780C4B1A700C4B084AD8 | ||||
| :401140001A60FFF745FEBDE8104001F085B800BF0004FA050CED00E014ED00E0000000000080FF1F79100000BC760040C080FF1F08ED00E0F8B501F0ABFD444A01271378CA | ||||
| :40118000022643F001031370137C414C43F001031374404B02F5E3521F700B3203F8946C1378054603F07F031370002001F082F92378394A03F0F90323701378384603F0FF | ||||
| :4011C000DF03137023783B43237001F073F9282001F070F9314B30461A7802F07F021A701A7802F0BF021A7023783343237001F061F923782A4A43F004032370002313701E | ||||
| :401200002846537001F068FD0721172001F09AF92449172001F088F90721182001F092F92149182001F080F90721152001F08AF91E49152001F078F90721052001F082F9BE | ||||
| :401240001B49052001F070F90721062001F07AF91849062001F068F90721084601F072F91549072001F060F90721082001F06AF91249082001F058F907210C2001F062F956 | ||||
| :40128000BDE8F8400E490C2001F04EB9A5430040944300409D60004012600040F851004084600040CF19000009180000CD190000011900002D1900005D1900009519000088 | ||||
| :4012C000D319000008B51D4B1D4A1870002313701C4A13701C4A13701C4A13701C4A13701C4A13701C4A13701C4B4FF400021A604FF080721A604FF400121A6020221A6076 | ||||
| :4013000040221A6080221A604FF480721A60144B19B91A7802F0FE0202E01A7842F001021A70104B03221A70802203F8202C012001F0C6FC0C4B04221A7008BD7C86FF1F6B | ||||
| :401340008286FF1F8086FF1F8186FF1F7D86FF1F6C86FF1F7F86FF1FF486FF1F00E100E009600040286000401260004070B5074C054623780E461BB9FFF7FCFE0123237001 | ||||
| :4013800031462846BDE87040FFF79CBF4086FF1F0A4A002313700A4A13700A4A13700A4A13700A4A13700A4A13700A4A13700A4B03221A70802203F8202C70478286FF1FF0 | ||||
| :4013C0008086FF1F8186FF1F7D86FF1F6C86FF1F7F86FF1FF486FF1F28600040014B1878704700BF8186FF1F044B1A7802F0FF001AB118780022C0B21A7070478086FF1F53 | ||||
| :40140000024A0C2303FB0020407870478886FF1F431E072B0CD8074A064B00010344805C5B7800F00F0043EA0020023880B2704700207047FC5F0040431E072BF0B531D846 | ||||
| :40144000194B0C2505FB0035EC88184FA4B2C4F50074A2424FF00C0404FB003488BFEA88E67884BFC2F5007292B2104C46EA12260501EE552C44D6B2667041B90C2202FB17 | ||||
| :401480000030002343704379DBB2A370F0BD0E46074F2F44751AADB2AA42EFD916F8015B3D72F7E7F0BD00BF8886FF1FFC5F004070600040431E072B0AD8064A0C2303FB32 | ||||
| :4014C000002300225A705A79034BD2B200011A54704700BF8886FF1FFE5F004038B505461446D1B1431E072B19D8FFF791FFA04203D22846FFF78CFF04460A4609482B01AF | ||||
| :401500001844531A9BB29C4203D9037A02F8013BF7E72846FFF7CEFF02E00C4600E00024204638BD70600040431E072B9FBF024B000108221A547047FE5F004030B51A4A02 | ||||
| :401540001A491B4D0878138803449BB21380194A00231488D8B2A4B27CB1082B0CD050680078C0B2E85450680133013050601088013880B21080ECE718460B780E4C082BA1 | ||||
| :401580000E4A00D040B10E4D2B7883F080032B700F232370022301E0022323701370094B1870087030BD00BFF886FF1FF486FF1F006000407086FF1F6D86FF1F8286FF1F5E | ||||
| :4015C0007E86FF1FF586FF1F074B02221A70074B80221A70064B0F221A70064A00231370054A0120137070478286FF1F7E86FF1F6D86FF1FF486FF1FF586FF1F30B5164B36 | ||||
| :4016000016491B780A8803F00F03023BDBB21A4492B20A80124C134A0020118889B279B173B15568215C013BC9B229705168DBB20131516011880130013989B21180ECE7D8 | ||||
| :40164000094A1370094A137883F080031370084B0B221A7030BD00BF29600040F886FF1F006000407086FF1FF586FF1F7E86FF1F6D86FF1F064A06231370064A01201370B2 | ||||
| :40168000054B80221A70054B00221A70704700BF8286FF1F6D86FF1F7E86FF1FF586FF1F054B9A683AB19A68044910709A680988518000229A6070477086FF1FF886FF1F57 | ||||
| :4016C00008B5124B1A78D2B21A701B78DBB21A0602D50F4A137008BD0220FFF7E1FF0D4B1B7803F06003202B05D0402B06D043B900F0D4FB04E001F0F3FA01E000F008FD8B | ||||
| :4017000010B9034B03221A7008BD00BF286000406D86FF1F0060004008B5084A084B0120197813880B449BB21380064B00221A70FFF7B6FF044B03221A7008BDF886FF1F01 | ||||
| :40174000F486FF1F8286FF1F6D86FF1F08B50C4B1B78DBB2042B07D0062B09D0022B0DD1BDE80840FFF7D8BFBDE80840FFF746BF0320FFF795FF034B03221A7008BD00BFBB | ||||
| :401780008286FF1F6D86FF1F08B5054B002201201A70FFF785FF034B03221A7008BD00BF8286FF1F6D86FF1F08B50A4B1A7832B11A78094942F080020A7000221A70074B4F | ||||
| :4017C000002201201A70FFF76BFF054B03221A7008BD00BF6C86FF1F086000408286FF1F6D86FF1F074B1B78DBB2042B05D0062B05D0022B05D1FFF7A1BEFFF7C5BFFFF706 | ||||
| :40180000D3BF70478286FF1F38B51D4C2378DBB2DD0634D518060AD503F00F03012B2ED1FFF74EFF174B1B78190609D538BD5A0602D5FFF7D7FF03E09D0620D5FFF786FF7F | ||||
| :4018400023781B061BD4104B1A78104B1B7813430F4A13701278934211D10A4A0849154613782078DBB2000605D41378DBB20B700B7803F00F0328788342F1D138BD38BDB4 | ||||
| :40188000286000406D86FF1F7E86FF1FF586FF1F29600040054A00231380054A916819B191680B7092685380704700BFF886FF1F7086FF1F0E4808B503889BB213B9FFF7A0 | ||||
| :4018C00083FE13E00B4B02221A700B4B00221A70FFF7E0FF094AD1799379028843EA012392B2934238BF0380FFF728FE012008BD7086FF1F8286FF1F7E86FF1F0060004084 | ||||
| :40190000084B01221A700F3B9B7C074B1A7B02F00302012A1EBFDA7B82F08002DA7301225A7370470B6000408886FF1F094B02221A700F3B93F82230074B1A7E02F0030242 | ||||
| :40194000012A1EBFDA7E82F08002DA7601225A76704700BF0B6000408886FF1F0B4B04221A700F3B93F83230094B93F8242002F00302012A1EBF93F8272082F0800283F8E3 | ||||
| :401980002720012283F82520704700BF0B6000408886FF1F0B4B08221A700F3B93F84230094B93F8302002F00302012A1EBF93F8332082F0800283F83320012283F83120A2 | ||||
| :4019C000704700BF0B6000408886FF1F7047FFF7DFBC00F039BC000070B50446184B88B003AA03F11006154618685968083303C5B3422A46F7D11B782B70FCB1222323702D | ||||
| :401A000001AD03232846637000F016FE002220461146AB5C08AC04EB131414F8144C03F00F03847008AC234413F8143C0132082AC1700371417100F10400EAD108B070BDB1 | ||||
| :401A4000653700002DE9F0411A4D01222E460C2080274FF0080E184B00FB025C14012344187016499CF805802144B8F1000F07D09CF8044024064CBF887081F802E000E0F1 | ||||
| :401A80008F7000FB0261CC880132E4B29C71CC88092AC4F30724DC71CC88E4B21C71C988C1F307215971D6D1054BFF221A70BDE8F08100BF8886FF1F70600040FC5F00402D | ||||
| :401AC0000A600040064B074A1B7802EBC30253681A7C824286BF03EBC0035869002070477C86FF1FC83700002DE9F84F424B1A78002A7ED01878414D0138C0B2FFF7E2FFFF | ||||
| :401B0000A8463F4AC3681478007ADFF800C1E4B203EBC0000C2600274FF0010E834268D01A78A24263D11CF80420597891425ED19A7893F8039002F07F0206FB02FA05EB38 | ||||
| :401B40000A01CF7093F802B009F0030981F804B093F803B005F80AB0B3F804A0A1F808A093F902A0BAF1000F0BDAB9F1010F0CBF4FF007094FF00D0981F8059081F801E0C9 | ||||
| :401B800009E0B9F1010F0CBF4FF005094FF0090981F805904F704FEA02191A4906FB0282494481F802E0B2F808A0CAF3072A81F800A0B2F808A05FFA8AFA81F801A0B2F8DC | ||||
| :401BC00006A011495FFA8AFA494481F806A0B2F80690C9F3072981F80790B2F806905FFA89F981F80490D288C2F307224A71083394E7BDE8F88F00BF8186FF1F8886FF1F13 | ||||
| :401C00007D86FF1FFC5F0040706000406E86FF1F08B5064B18780138C0B2FFF753FF20B143681B7900EBC300406908BD8186FF1F00212DE9F84F0B464E4E0C2707FB01F44F | ||||
| :401C400001313219092933554FF000059370494CD3701381937253705371EFD118B1464B1D70464B1D70464B1A78002A7FD0187801250138C0B2FFF725FFA8464368DFF8A2 | ||||
| :401C8000F8E0DB790C2713F0400F3E4B4FF0000C1A7814BF42F0010202F0FE021A70027AD20007FB0541C36803EB02094B4531D093F802A00AF07F06AE4229D10E89B3F866 | ||||
| :401CC00004B0B6B25E4538BFA1F808B01E7893F801B01EF80660B3451AD181F804A0DE780E7093F902A0DE78BAF1000F06F0030607DA012E0CBF07260D264E7181F801808A | ||||
| :401D000006E0012E0CBF052609264E7181F801C00833CBE70135092DC3D1C1680A328B1C0A440C200833934209D013F8081C13F80A5C01F07F0100FB01418D72F2E7FFF7F8 | ||||
| :401D400067FF114B0121186000230C2000FB0142D3801289013113449BB203F00102134409299BB2F2D1BDE8F84FFFF76BBEBDE8F88F00BF8886FF1F6E86FF1FF686FF1F59 | ||||
| :401D80008186FF1F7F86FF1F8486FF1F114B1B7903F07F035A1E072A19D80F490C2202FB031291781B0141F0010191700021D170517841F002015170127912F0800F074A36 | ||||
| :401DC0001A4414BF8D2389239370FFF753BC0020704700BF006000408886FF1FFC5F004030B4194B1A7902F07F02531E072B27D8164B0C2404FB02339978154D01F0FE0139 | ||||
| :401E000099700021D97029461201505D114400F07F0050555A7802F0FD025A701A795B78120605D5012B01D18C7006E00D2303E0012B0CBF082309238B7030BCFFF71ABCBE | ||||
| :401E4000002030BC704700BF006000408886FF1FFC5F004010B50D4B0D4C21791878C9B20138C0B2FFF72EFE43681B798B4201D2012909D8074A0848535CDBB24354A37818 | ||||
| :401E80000120DBB2535410BD002010BD8186FF1F006000406E86FF1FF686FF1F38B58A4A8A4C13780021DBB221801806517840F18D800A2900F20581DFE811F05D00030138 | ||||
| :401EC00003010301030103010B0003017E0003018200D3787C49012B09D17D4B1A787D4B03EBC2035B685B686360122310E0CB78022B12D18878FFF7E5FD002800F0E180C2 | ||||
| :401F0000436863606368DA7863689B7843EA02232380BDE83840FFF7CDBCCB78032B26D16D4B00228878D5B2854209D3664A91786A4AEE2908BF1346634A917881B106E0C9 | ||||
| :401F4000187801320028F1D018780344EAE764499278097C914203D16248FFF73DFD614B1A78002A00F0AD801A78228018E0BDE8384000F0B5BE13F0030313D0022B40F0D6 | ||||
| :401F8000A0802380504B0C211B7903F07F02564B01FB02339A78554BD2B21A7000225A706360B6E702222280514A11784F4AC9B2117053706260ACE7012323804D4BEFE7E4 | ||||
| :401FC0000123238013794C4A1344E9E701390A2977D8DFE801F037764F76067676760A7620009378454ADBB25AE0937803F0FF0153B9404B1A7891425FD01970404B012024 | ||||
| :402000001870FFF715FE58E0481EC0B2FFF75AFD0028EED155E0FFF71DFF002851D02A4A384913791279DBB2D2B20A70364A3249D25CCB5C9A4240D0314B01221A70FFF749 | ||||
| :4020400053FD3AE003F00303012B2BD009D3022B37D11D4B9B78002B33D1BDE83840FFF7BFBE194B9B78012B2BD1214A137803F0FD0315E003F00303012B13D008D3022BFE | ||||
| :402080001FD1114B9B78E3B9BDE83840FFF77EBE0D4B9B78012B14D1154A137843F0020313700AE0084B1A795AB998781B791749DBB2CA5C22EA0002CA54BDE83840FFF7DC | ||||
| :4020C000D9BA002038BD00BF006000407086FF1F7C86FF1FC83700002C380000B43700009F3800001487FF1F8886FF1F4186FF1F7F86FF1F8186FF1F6E86FF1F6C86FF1F4C | ||||
| :402100008086FF1F7D86FF1FF686FF1F8386FF1F074B1A78120609D55B78012B06D1054B054A5A6012781A80FFF7C4BB00207047006000407086FF1F8C370000014B1870D5 | ||||
| :40214000704700BF76650040014B1878704700BF6B650040014B1870704700BF78650040064A0123136002F688321268E0211064034A1170A2F540721360704780E100E0FB | ||||
| :4021800000E400E0014B1870704700BF7E640040014B1870704700BF7864004073B515461E460B4C01230022019200920A4601461846237000F0F4F832462946207800F00D | ||||
| :4021C000AFF80221207800F099F8207802B070BDD080FF1F064A0423136002F688321268E0219064034A1170A2F202321360704780E100E002E400E0014B04221A607047A2 | ||||
| :4022000000E100E0014B04221A60704780E100E0014B1870704700BF77640040704738B505460078012428B100F0F2FC285D0134E4B2F8E738BD08B50D2000F0E9FCBDE8C9 | ||||
| :4022400008400A2000F0E4BC024B1878C0F38010704700BF8F450040074A7F23802113705170064A013BDBB202F80839002BF9D1034A1370704700BFE080FF1FF87B00401A | ||||
| :402280000078004017280FD8084B0001C25C11B142F0200201E002F0DF02C254C25C42F00102C25400207047012070471070004017280BD8064B0001C25C02F0FE02C2547C | ||||
| :4022C000C25C02F0DF02C25400207047012070471070004017280DD8074900010B4603441A7942F004021A71435C43F00103435400207047012070471070004017280BD807 | ||||
| :40230000064A0001835C490003F0F10301F00E011943815400207047012070471070004041F6FF73994208BF4FF400519A4208BF4FF4005217289FBFC00000F1804000F583 | ||||
| :40234000EC4081809ABFC280002001207047000017289FBF034B00011954002088BF0120704700BF1970004017289FBF054B00011A5C01F007019DBF1143195400200120C2 | ||||
| :40238000704700BF1470004017289FBF034B0001185C00F0070088BFFF20704714700040172810B51AD8C00001F07F0100F1804441EAC21204F5EC44D2B222709DF80820D4 | ||||
| :4023C00003F00F0343EA0213DBB263709DF80C30002003F00F03A370E07010BD012010BD10B500F075FC0A4A5378182B0AD91478013B5370E30003F1804303F5F0431B78D4 | ||||
| :40240000137000E0FF2400F067FC204610BD00BFE080FF1F030610B5044611D400F058FC084AE300117803F1804303F5F04319705378147001335370BDE8104000F04CBCB6 | ||||
| :4024400010BD00BFE080FF1F30B504060CD411F4704509D1C40004F1804404F5F0442180A270E370284630BD012030BD03065FBFC00000F1804000F5F04081805ABFC280BD | ||||
| :40248000002001207047000038B50446084DB4F5004F05D9286800F013FCA4F50044F6E7034B58686043BDE8384000F009BC00BFE880FF1F024B1B7A584300F001BC00BFC8 | ||||
| :4024C000E880FF1F0E4B00F003001A78490102F0FC02104318701A7801F0600142F080021A701A7802F07F021A701A7802F09F020A431A701A7842F010021A70704700BFE0 | ||||
| :4025000083430040014B01221A70704784430040044B00F00F021B6853F8220043F82210704700BF08ED00E0054A00F01F00126800F1100352F8230042F82310704700BFBA | ||||
| :4025400008ED00E000F01F0000F16040490100F56440C9B2017070470F4B10B50F4900240F205C609C60DC601C615C61FFF7D0FF0B4A136843F0040313600A4B4FF47A72A2 | ||||
| :40258000DB68B3FBF2F3084A1360084B4FF400421C60C3F8E82010BD4486FF1F0526000010E000E0E880FF1F14E000E018E000E0024A136843F002031360704710E000E08E | ||||
| :4025C00008B5FFF7F5FF034A136843F00103136008BD00BF10E000E010B5054CA3691BB9FFF7BAFF0123A361BDE81040FFF7E8BF4486FF1F024B1868C0F30040704700BFF1 | ||||
| :4026000010E000E038B5FFF7F5FF012808D1054D002455F8243003B198470134052CF8D138BD00BF4886FF1F024B03EB80035868596070474486FF1F134B144A1B78DBB2C6 | ||||
| :402640000360127843EA0223114A0360127843EA0243104A0360127843EA026303600E4B0E4A1B78DBB24360127843EA02230C4A4360127843EA02430A4A4360127843EA32 | ||||
| :4026800002634360704700BF0301004904010049EC460040020100490101004900010049050100490601004910B500F011FB204A044613780A2043F002031370137C43F068 | ||||
| :4026C0000203137412F80A3C43F0010302F80A3C937943F00103937102F5AB52137843F003031370134B18221A7013F8012C42F0400203F8012C13F8012C02F0FC0203F8EC | ||||
| :40270000012CCE2203F8062CA3F597530222183B1A70094A137843F008031370FFF7CAFE064B10222046BDE810401A6000F0D4BAAB4300400E5900402F5B004080E200E0B8 | ||||
| :4027400008B500F0C5FA0F4A137803F0FE031370A2F5AA521D3A137803F0FD031370137C03F0FD03137412F80A3C03F0FE0302F80A3C937903F0FE039371BDE8084000F039 | ||||
| :40278000ABBA00BF08590040044A137803F03F0343EA8010C0B21070704700BF08590040082804D00A280CBF8223C22300E0422308380E4AC0B20428137098BF0C4B4FF00A | ||||
| :4027C000000298BF33F910100A4B88BF11461A8042F210734B4341F2883103F6C41393FBF1F305490B60054B1A8070470A59004076370000FE86FF1F0087FF1F0487FF1F9A | ||||
| :4028000008B5102000F0A6F907210420FFF79AFE07490420FFF788FE064A0C20137843F006031370FFF7BCFF034B00221A8008BDF928000009590040FC86FF1F10B5054C93 | ||||
| :4028400023781BB9FFF7DCFF01232370BDE81040FFF72ABF6086FF1F044B1A7802F0FB021A701A7842F001021A7070470859004010B5084B1C7814F0010403D10028F9D00C | ||||
| :40288000002404E02046FFF715FE024B1B78204610BD00BF09590040034A044B1B881088181A00B2704700BF0487FF1FA25B00400E4A13881BB223B111880A2309B2594365 | ||||
| :4028C00001E00B4B19680B4B1B88C01A42F2107300B203FB00F2022391FBF3F30028D8BF5B42134493FBF1F000B27047FE86FF1F0087FF1FFC86FF1F7047000010B500F07F | ||||
| :40290000E7F9214A044613780A2043F001031370137C43F00103137412F80A3C43F0020302F80A3C937943F00203937102F5AA521832137843F003031370144B18221A708F | ||||
| :4029400013F8012C42F0400203F8012C13F8012C02F0FC0203F8012CCE2203F8062CA3F597530222123B1A70094A137843F008031370FFF79FFD074B08222046BDE8104091 | ||||
| :402980001A6000F0A9B900BFAB43004006590040275B004080E200E008B500F099F90F4A137803F0FE031370A2F5AA52153A137803F0FE031370137C03F0FE03137412F829 | ||||
| :4029C0000A3C03F0FD0302F80A3C937903F0FD039371BDE8084000F07FB900BF00590040044A137803F03F0343EA8010C0B21070704700BF00590040082804D00A280CBF21 | ||||
| :402A00008223C22300E0422308380E4AC0B20428137098BF0C4B4FF0000298BF33F910100A4B88BF11461A8042F210734B4341F2883103F6C41393FBF1F305490B60054B73 | ||||
| :402A40001A80704702590040803700000A87FF1F1087FF1F0887FF1F08B5102000F084F807210320FFF76EFD07490320FFF75CFD064A0C20137843F006031370FFF7BCFF64 | ||||
| :402A8000034B00221A8008BD512B0000015900400C87FF1F10B5054C23781BB9FFF7DCFF01232370BDE81040FFF728BF6186FF1F044B1A7802F0FB021A701A7842F001027B | ||||
| :402AC0001A7070470059004010B5084B1C7814F0010403D10028F9D0002404E02046FFF7E9FC024B1B78204610BD00BF01590040034A044B1B881088181A00B2704700BF9C | ||||
| :402B00000887FF1FA05B00400E4A13881BB223B111880A2309B2594301E00B4B19680B4B1B88C01A42F2107300B203FB00F2022391FBF3F30028D8BF5B42134493FBF1F05F | ||||
| :402B400000B270470A87FF1F1087FF1F0C87FF1F70470000034A00F0F800137803431370704700BF02410040034A00F0F800137803431370704700BF06410040014B187044 | ||||
| :402B8000704700BF73640040014B1870704700BF7664004073B515461E460B4C0023019300930A46014618462370FFF7F9FB324629462078FFF7B4FB02212078FFF79EFBBC | ||||
| :402BC000207802B070BD00BFF880FF1F074A0223136002F688321268E0215064044A11706FF440710A441360704700BF80E100E001E400E0014B1870704700BF7B650040B5 | ||||
| :402C0000014B1870704700BF7465004000000000FEB5494652465B460EB40746244909688A46244A12682448022100F071F8030020480068C018204900F06AF814388346AE | ||||
| :402C40000121C9430C460125002600F041F8814651460B7823400B705846013000F030F83800F04028400B78234003430B70584600F026F80136072EF2D9002001300138D5 | ||||
| :402C8000013001200B78234003430B705846043000F016F8484600F01FF800BF00BF00BF0EBC894692469B46FEBD00BFAFF30080D480FF1FF480FF1F00C2010000000000C4 | ||||
| :402CC0000230800803D000BF01380046FCD17047EFF3108072B6704780F31088704700BF094A137803F00303012B0AD0022B09D113790C2103F07F02044B01FB02339B7A0D | ||||
| :402D000000E0137900207047006000408886FF1F002902D0B0FBF1F0704708B14FF0FF3000F008B80029F8D00246B0FBF1F000FB11217047704700BF014B1868704700BF0E | ||||
| :402D40005C81FF1F0E4B70B51E460E4C0025E41AA410A54204D056F8253098470135F8E700F0BAFD084B094C1E46E41AA4100025A54204D056F8253098470135F8E770BDEA | ||||
| :402D8000E4380000E4380000E4380000EC38000003460244934202D003F8011BFAE7704730B5141E05469BB0184604DA8B232B604FF0FF301DE04FF40273ADF80C300CBFC5 | ||||
| :402DC000234604F1FF33029305934FF6FF7300910491ADF80E3002461E9B6946284600F073F8431CBCBF8B232B6014B1009B00221A701BB030BD000007B5009313460A460E | ||||
| :402E0000014603480068FFF7CBFF03B05DF804FB5C81FF1F2DE9F0478E6882469E420C46914698463ED88A8912F4906F3AD02568096902236F1A656905EB450595FBF3F57F | ||||
| :402E40007B1C43449D4238BF1D4653050FD5294600F04AFB064698B13A46216900F0D2FAA38923F4906343F08003A38113E02A4600F098FB064670B92169504600F0E8FA63 | ||||
| :402E80000C23CAF80030A3894FF0FF3043F04003A381BDE8F08726613E44266046466561ED1BA560464528BF464649463246206800F0B3FAA36800209B1BA36023681E44B8 | ||||
| :402EC0002660BDE8F08700002DE9F04F9DB003938B8980461C060D4616460DD50B695BB9402100F001FB2860286118B90C23C8F80030CDE040236B610023099320238DF832 | ||||
| :402F00002930DFF89CB130238DF82A3037463C4614F8013B1BB9B7EB060910D003E0252BF9D02746F3E74B46324629464046FFF771FF013000F0A780099B4B4409933B78C5 | ||||
| :402F4000002B00F0A08000234FF0FF3204930793059206938DF853301A930126052221784E4800F041FA671C049B38B14B4A3C46801A06FA00F018430490EFE7D90644BF72 | ||||
| :402F800020228DF853201A0744BF2B228DF8532022782A2A03D0079A00210A200BE0039A111D12680391002A10DA524243F00200079204900BE027463B780134303B092B14 | ||||
| :402FC00003D800FB02320121F5E701B107923B782E2B1ED17B782A2B0AD1039B02371A1D1B680392002BB8BF4FF0FF33059310E0002319460593781C0A2407463A78013093 | ||||
| :40300000303A092A03D804FB01210123F5E703B1059103223978224800F0E6F940B14023CBEB000003FA00F0049B013718430490397806221B487E1C8DF8281000F0D4F991 | ||||
| :4030400088B1194B33B9039B073323F007030833039314E003AB00932A46144B04A94046AFF3008007E003AB00932A460F4B04A9404600F093F8B0F1FF3F824603D0099BEA | ||||
| :403080005344099342E7AB895B0601D4099801E04FF0FF301DB0BDE8F08F00BFB3380000B9380000BD38000000000000152E00002DE9F04791461F460A698B680646934286 | ||||
| :4030C000B8BF1346C9F8003091F843200C46DDF8208012B10133C9F800302368990642BFD9F800300233C9F80030256815F0060510D104F1190A07E00123524639463046F4 | ||||
| :40310000C04701301AD00135E368D9F800209B1A9D42F1DB94F843302268003318BF012392060FD5E118302081F843005A1C94F845102244023382F8431003E04FF0FF3053 | ||||
| :40314000BDE8F08704F1430239463046C0470130F4D02268D9F80050E36802F00602042A08BF5D1B2269A3680CBF25EAE57500259342C4BF9B1AED184FF000091A344D4582 | ||||
| :4031800009D00123224639463046C0470130D5D009F10109F3E70020BDE8F0872DE9F04317460A7E85B06E2A984606460C460C9B01F1430E00F0AE8011D8632A22D009D8F6 | ||||
| :4031C000002A00F0BB80582A40F0CA8081F84520834955E0642A1ED0692A1CD0C0E0732A00F0B08009D86F2A2ED0702A40F0B8800A6842F020020A603EE0752A24D0782A4A | ||||
| :403200003AD0ADE01A6801F14205111D1960136884F84230A8E021681A6811F0800F02D0111D196008E011F0400F02F10401196002D0B2F9003000E01368002B3CDA2D224F | ||||
| :403240005B4284F8432037E021681A6811F0800F02D0111D196007E011F0400F02F10401196001D0138800E01368227E5C496F2A14BF0A2208221BE078225A4984F8452018 | ||||
| :403280002268186812F0800F00F104051D6003D1550601D5038800E00368D00744BF42F0200222601BB9226822F0200222601022002084F8430001E049490A226568002DB3 | ||||
| :4032C000A56008DB206820F0040020602BB9002D7DD175460CE0002B79D07546B3FBF2F002FB1033CB5C05F8013D03460028F5D1082A0BD12368DA0708D5236962689A42A3 | ||||
| :40330000DEBF302305F8013C05F1FF35C5EB0E0323612EE008681A6810F0800F496903D0101D1860136808E010F0400F02F104001860136801D0198000E019600023236135 | ||||
| :40334000754616E01A68111D1960156800216268284600F049F808B1401B6060636804E004F1420584F8422001232361002384F84330CDF800803B4603AA21463046FFF7CF | ||||
| :4033800097FE013002D14FF0FF3026E023692A4639463046C0470130F5D023689B0710D5002504F1190907E001234A4639463046C0470130E7D00135E368039A9B1A9D4293 | ||||
| :4033C000F2DBE068039B9842B8BF184605E00B7804F1420584F842308AE705B0BDE8F08365370000C438000010B5C9B202449042034605D01C7801308C42F8D1184610BD06 | ||||
| :40340000002010BD10B5431E0A44914204D011F8014B03F8014FF8E710BD884210B501EB020301D8421E0BE09842FBD28118D21AD34204D013F8014D01F8014DF8E710BD33 | ||||
| :40344000994204D011F8014B02F8014FF8E710BD38B50546002944D051F8043C0C1F002BB8BFE41800F0D4F81E4A1368114613B96360146030E0A3420DD92268A0188342B0 | ||||
| :4034800001BF18685B681218226063600C6023E0A24203D813465A68002AF9D118681918A1420BD12168014458188242196013D110685268014419605A600DE002D90C23ED | ||||
| :4034C0002B6009E021686018824201BF106852680918216062605C602846BDE8384000F098B838BD6886FF1F70B5CD1C25F0030508350C2D38BF0C25002D064601DBA942AC | ||||
| :4035000002D90C23336046E000F082F8234B1C681A462146A1B10B685B1B0ED40B2B03D90B60CC18CD501EE08C420BBF63684B681360636018BF0C4615E00C464968E9E7CF | ||||
| :40354000174C23681BB9304600F052F820602946304600F04DF8431C18D0C41C24F00304A0420DD12560304600F053F804F10B00231D20F00700C31A0ED05A42E25070BDFA | ||||
| :40358000211A304600F034F80130EBD10C233360304600F03EF8002070BD00BF6886FF1F6486FF1FF8B5074615460E4621B91146BDE8F840FFF798BF1AB9FFF749FF284650 | ||||
| :4035C000F8BD00F027F885420ED929463846FFF78BFF044650B131462A46FFF713FF31463846FFF735FF01E03046F8BD2046F8BD38B5064C0023054608462360FDF744FDB9 | ||||
| :40360000431C02D1236803B12B6038BD3887FF1F7047704751F8040C0028BEBF091851F8043CC0180438704700000000050209020B020D020F02110213027265706C792028 | ||||
| :4036400030782530327800686F6D696E6700626567696E6E696E67207365656B2066726F6D20256420746F2025640066696E6973686564207365656B0057616974696E679A | ||||
| :4036800020666F72205553422E2E2E0055534220726561647900636F6D6D616E642030782530327800756E64657272756E206166746572202564207061636B65747300638E | ||||
| :4036C0006F756E743D256420693D256420643D256400636D645F777269746500703D25642063723D25642063773D256420663D256420773D256420696E6465783D2564206F | ||||
| :40370000756E64657272756E3D25640077726974652066696E69736865640073746172742065726173696E670073746F702065726173696E670069646C6500005100401076 | ||||
| :403740000040510040300000000140001000140140000800400140000A004C0140000200500140200030313233343536373839414243444546000001000000040000001018 | ||||
| :4037800000010000000400000010000028000000000104000100000000000000000157494E5553420000303030303100000000000000000012034D0053004600540031007C | ||||
| :4037C000300030000100000001000000D0370000010000009F380000000000000000000001000000E83700000100000071380000040000000A380000000000000000000078 | ||||
| :403800000000000008380000FF00000001024000FF00000082024000FF00000003034000FF00000084034000FF00020304030904160346006C007500780045006E0067004E | ||||
| :4038400069006E0065002A0343006F0077006C00610072006B00200054006500630068006E006F006C006F0067006900650073000009022E0001010080320904000004FF0B | ||||
| :4038800000000107050102400000070582024000000705030340000A0705840340000A12010002FF0001080912006E0100020180014300232D302B2000686C4C0065666724 | ||||
| :4038C000454647003031323334353637383961626364656600000000F8B500BFF8BC08BC9E4670475900000005110000F8B500BFF8BC08BC9E4670473500000010390000A9 | ||||
| :40390000C880FF1F98000000E005000000000000000000004087FF1FFF000000675000400C000000070000007F800000030000000000007D00FA0000400000000090D0039A | ||||
| :40394000FF0000000000000000000000000000000000000000000000000000000000000000000000B13800000000000000000000000000000000000000000000000000005F | ||||
| :40398000000000000000000000000000000000000000000000000000000000000000000000000000FC80FF1F0000000000000000000000000000000000000000000000006D | ||||
| :4039C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C7 | ||||
| :403A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086 | ||||
| :403A40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046 | ||||
| :403A80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006 | ||||
| :403AC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C6 | ||||
| :403B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085 | ||||
| :403B40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045 | ||||
| :403B80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005 | ||||
| :403BC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C5 | ||||
| :403C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084 | ||||
| :403C40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044 | ||||
| :403C80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004 | ||||
| :403CC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C4 | ||||
| :403D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083 | ||||
| :403D40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043 | ||||
| :403D80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003 | ||||
| :403DC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C3 | ||||
| :403E00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082 | ||||
| :400000000080002011000000D5110000D5110000064A08B5136843F020031360044B1A6803F53F5302331A6001F0F2F8E8460040FA46004010B5054C237833B9044B13B16F | ||||
| :400040000448AFF300800123237010BD6881FF1F00000000503A0000084B10B51BB108490848AFF300800848036803B910BD074B002BFBD0BDE81040184700BF00000000B7 | ||||
| :400080006C81FF1F503A0000C880FF1F000000000A4A0B4B116801310B40002BBEBF03F1FF3363F03F030133136011685368994202BF024B01221A72704700BF8881FF1F32 | ||||
| :4000C0003F0000800A4A0B4B516801310B40002BBEBF03F1FF3363F03F030133536051681368994202BF024B01221A72704700BF8881FF1F3F000080024B012200205A7293 | ||||
| :4001000002F02CBA8881FF1F10B5C4B2204601F041FA0128FAD110BD08B572B60F4B0F49DA680132DA601A690132C82A08BF00221A615A6918690132A72A08BF00224A6104 | ||||
| :400140005B69002B0CBF02230023002814BF184643F0010002F06AFF62B608BD8881FF1F10B504460D4B8278997E91421CBF00225A7702689A610279094B1A718378002B93 | ||||
| :4001800014BF0220012002F015FFE07802F00CFF2079BDE8104002F043BF00BF8881FF1FA081FF1F70B5C4B220460E4601F0FAF9314605460246204601F0B6FA204601F086 | ||||
| :4001C000E9F90128FAD0284670BD000038B50B4CA57F5DB904F11800FFF7C2FF012002F053F94FF47A7002F065FB6577E36823620123A377BDE8384002F09ABB8881FF1FFA | ||||
| :4002000038B50446C5B2284602F04AF9062002F067FB44F00200C0B202F042F9062002F05FFB284602F03CF9BDE83840062002F041BB10B5642402F02DF920B10120BDE8EA | ||||
| :400240001040FFF7DDBF0120FFF7DAFF013CF2D1F4E7000038B5044D0024285D013402F0EFFA402CF9D138BDAC81FF1F08B502F009FD002002F012FD02F024FD02F02EFD5E | ||||
| :4002800080B208BD10B50446012002F021F9642002F010FBFFF7EAFF2080002002F018F9642002F007FBFFF7E1FF608010BD08B502F014FE002002F01DFE02F02FFE02F0EE | ||||
| :4002C00039FE80B208BD10B50446FFF7B2FF322002F0F0FAFFF7EBFF20800020FFF790FF322002F0E7FAFFF7E2FF608010BD0FB400B593B014AB53F8042B402102A801938B | ||||
| :4003000002F08EFF02A802F030F902F03AF913B05DF804EB04B0704710B5044601780648FFF7E5FF0420FFF7EFFE62782146BDE81040042001F086B9643A000007B5002324 | ||||
| :40034000ADF804308DF80600032301A88DF80530FFF7E2FF03B05DF804FB0000F8B51D4C0646FFF733FF637F03B156B91A48FFF7BEFFFFF75EFF012000236077636602F045 | ||||
| :40038000AFFA3246616E1548FFF7B1FF114D0027636E9E4216D002F07DF800B16F66636E9E4205DD0020FFF72BFF6B6E013305E005DA0120FFF724FF6B6E013B6B6602F08B | ||||
| :4003C000B7FAE5E7322002F075FABDE8F8400448FFF78DBF8881FF1F713A0000783A0000953A00002DE9F04F9BB062B602F00AFB8A49042002F02EFB894802F057F889486B | ||||
| :4004000002F0FAFD884802F08BF802F0DBFC02F0ADFB002002F0CEFD02F0A6F80221002001F06EF8814D0321084602F061FAAA462C4602F07DFAAB7F73B12A6AEB689B1AE2 | ||||
| :4004400041F28832934207D9002002F01DF8002002F0B0FD0023AB7701F08AF818B97448FFF745FF04E001F089F80028F7D109E001F07EF80028FBD06E48FFF738FF0320E6 | ||||
| :4004800001F0A6F9032001F085F80128D1D16A48FFF766FE69490320FFF784FE94F868106748FFF724FF94F86830023B142B00F26A84DFE813F0150068041E0068042400B2 | ||||
| :4004C0006804480068046B006804D1006804F9016804A9036804C9036804CF036804DA0303238DF828308DF829300C238DF82A30B7E394F86A00FFF731FF524BAEE3FFF72E | ||||
| :4005000065FE00236372E068627A02F0FF0132B9EB681B1AB3F57A7FF6DD0B460AE04BB100228AF80920DAF80C10627A12B9EB685B1AFAE707228DF8282004228DF8292037 | ||||
| :40054000ADF82A308DE30220FFF7DEFD00270DF1280902F0EDF94FF480780026C8EB07039A1906F809200136402EF9D10220FFF7CBFD32464946022001F064F8B8F101087C | ||||
| :40058000EBD10137402FE4D12F4B42E04FF00109002702F0CDF94FF00008012001F018F9012000F0F7FF0128FAD10DF1280B4022594601F0B9F8012000F0ECFF0028FAD137 | ||||
| :4005C000064608EB07030593059B1BF806203344DBB2934209D08DE80C003946334642461A48FFF784FE4FF000090136402EEBD108F10108B8F5807FCFD10137402FC8D17D | ||||
| :4006000049461348FFF773FEB9F1000F00F05381104B1B8809A8ADF8243023E319010000F900000091000000C50000008881FF1FA33A0000B63A0000A081FF1FF081FF1F13 | ||||
| :40064000C03A0000543A0000563A0000CF3A0000EB3A0000583A000094F86A0001F038FF606EFFF77BFE02F047FD944B944F1A78002602F0FB021A701A7842F001021A70CD | ||||
| :400680001A7802F0FE021A701A7802F0FE021A7002F036FD0220FFF737FD41F6FF734FF480420121022002F08BFC84F8A80002F0ADF8B8550136402EF9D1DFF82482002668 | ||||
| :4006C00008F18D0B1FFA8BF70136402E14BF3246002218F8010F2244062392F82420402102F0C8F83A4646F2434198F8000002F0D3F84037402EBFB2E6D19AF86B3043B175 | ||||
| :4007000000238AF80930637A002BFCD000238AF80930182200210AA802F04EFD694B4FF0FF320C9340230D930023236062602372236894F8A800234493F8241002F01EF82F | ||||
| :4007400094F8A80001F0DCFF012194F8A80001F0AFFF2368002BFCD000239946CAF80430DAF80C200127059202F0E2F8059AE3689B1AB4F86C2093420ED36FB1042195F822 | ||||
| :40078000A80002F007F894F8A80002F013F80028F9D107468AF80800237A03F0FF08002B48D16A682B689A4202D1002FDCD141E063680AA80BEB831343440A93C8F1400391 | ||||
| :4007C0000B9300F0F9FA0B9B09F10109C3F1400398440D9B5FFA88F8E3B93B4E0220FFF793FCA6F1400EBEE80F000FC6BEE80F000FC6BEE80F000FC69EE80F0086E80F0019 | ||||
| :40080000A6F130014022022000F01CFF703E40230C960D93B8F13F0FCAD962682B4B01321340002BBEBF03F1FF3363F03F030133636099E70AA8267A00F014FB0220FFF76B | ||||
| :4008400063FC0D9BF6B2402B07D0022040221E4900F0F8FE0220FFF757FC0D9B022033F040021DBFC3F1400292B21749114600F0E9FE0220FFF748FCFFF7ECFC36B11448FB | ||||
| :40088000FFF735FD0220FFF759FD06E0114B09A81B88ADF82430FFF73FFD627A4946237A0D48FFF724FD71E20C48FFF720FDE66E16F03F0616D0032066E200BF93640040CD | ||||
| :4008C000AC81FF1F3892FF1F7892FF1F3F000080F53A00005A3A00000F3B0000223B0000AB81FF1F012001F0F9FD95F86A0001F0EFFD02F001FCBA4BB94A1B78B94F43F089 | ||||
| :4009000004031370137843F001031370137803F0FE031370137803F0FE03137002F0F0FB686EFFF71BFD01214FF4804341F6FF72084601F0D9FD85F8A80001F067FFB855B5 | ||||
| :400940000136402EF9D1DFF8BC82002708F18D039EB207930137402F14BF3A46002218F8010F2244052392F82420402101F082FF314646F2475298F8000001F08DFF403623 | ||||
| :40098000402FB6B2E6D1DAF86C3000269B09182231464FF0FF3B0AA8CAF800600593CAF804B0B1468AF80860B04602F005FC0D973746012000F00CFF069601F0B9FFB8F170 | ||||
| :4009C000000F0AD14EB9012000F0E4FD012804D14022854900F0A8FE06462268834B01321340002BBCBF03F1FF3363F03F036168B8BF01338B4200F09180069B3BB1237A59 | ||||
| :400A0000002B40F09C806B7A002B40F098800B9BBBBBB8F1000F09D0754A7F2199540133402BFBD1724A0B930A922AE04EB3012000F0B0FD28BBDFF8B8E13F2E0EF1400CB9 | ||||
| :400A4000BCE80F00AEE80F00BCE80F00AEE80F00BCE80F00AEE80F009CE80F008EE80F00AEF130030A9307F101070B9607DD059BBB4204D0012000F0ABFE464601E04FF08B | ||||
| :400A800001080B9BDBB12368079A0AA802EB83120D9BC3F1400313440C9300F0F2F90D9B6BB92A68514B01321340002BBEBF03F1FF3363F03F030133236040230D936368C3 | ||||
| :400AC00001332BD12B683F2B28D14FF0000BC5F804B001F037FD85F808B06B6895F8A8002B4493F8241001F049FE95F8A80001F007FE012195F8A80001F0DAFD85F809B0CD | ||||
| :400B0000637A002BFCD04FF0000B01208AF809B001F024FD584601F0E1FC01E0069B2BB1237A63B96B7A53B90123069363685B453FF443AF09F10109D5F804B03DE76168F6 | ||||
| :400B40002C482268FFF7D3FB01F002FD012001F0C5FC002001F002FD042194F8A80001F019FE94F8A80001F025FE0028F9D19AF8A80001F0B3FD9AF809309AF80820029350 | ||||
| :400B8000012303920193CDF800804B463A4605991948FFF7ACFBB8F1000F16D1059BBB420AD0012000F0F6FC01280646F6D10E49FFF7F8FA3F2803DC012000F01DFE04E00C | ||||
| :400BC000304600F005FE0137E8E7FFF743FB0B48FFF78DFB237A0BB10220D5E0084B18E597650040AC81FF1F7892FF1F3F0000803892FF1F2C3B0000373B0000673B00002F | ||||
| :400C00005C3A0000AB81FF1F94F86A0001F060FC606EFFF7A3FB6148FFF769FB00236372637A002BFCD0012001F098FC00238AF80930637A002BFCD0002001F08FFC5848CC | ||||
| :400C4000FFF755FB574B09E000206077FFF786FB554B03E05548FFF783FA554B1B88ADF828300AA8FFF758FB90E0A37F3BB1002001F00AFC002002F09DF90023AB7702F0F3 | ||||
| :400C80001FF9002002F0C2F82A2601F0EDFF002001F090FF324600210AA802F08DFA17238DF828308DF8296001F042FE002001F0EBFB002002F07EF9C82001F0FBFD0DEB20 | ||||
| :400CC0000600FFF7DFFA0DF13E00FFF7FCFA01F02FFE012002F06EF9322001F0EBFD0DF12E00FFF7CFFA0DF14200FFF7ECFA012001F0CAFB4FF4967001F0DCFD01F018FE3C | ||||
| :400D00000DF13600FFF7BEFA0DF14A00FFF7DBFA002001F0B9FB4FF4967001F0CBFD01F007FE022002F046F9322001F0C3FD0DF13200FFF7A7FA0DF14600FFF7C4FA0120CB | ||||
| :400D400001F0A2FB4FF4967001F0B4FD01F0F0FD0DF13A00FFF796FA0DF14E00FFF7B3FA002001F091FB4FF4967001F0A3FD01F0DFFD002002F01EF90023637702F022F8F9 | ||||
| :400D800001F0F4FE6DE70120FFF7D8FA032000F01FFD0848FFF7ABFAFFF74BBB763B0000843B00005E3A0000603A0000F081FF1F623A0000913B000070B50024012542684B | ||||
| :400DC000002A4ED0C368002B4BD00368013A591C01601B784260802B01D145752FE013F0800F467D0269017D12D036B1D20042F004020331026101754475026903F001030A | ||||
| :400E0000D20042F004021A43037D0261033315E046B13F2B06D9D20042F004020331026101754475026943EA0223427D036112B143F0C0030361037D447508330375037DC4 | ||||
| :400E4000072BBCD90269083B22FA03F38268511C81601370C368013BC360037D083B0375ADE770BD07B5027D42B102AA002102F8011D026001224260FFF79EFF03B05DF8D5 | ||||
| :400E800004FBF0B5012100244368002B43D0C268002A40D0427D4AB183685A1C8260827D1A70C3684475013BC360EDE7027D072A0BD806680769751C05603578013B45EADF | ||||
| :400EC00007250832056143600275027D0369A2F10805EB40DBB203F0C006802E07D0C02E0ED103F03F0383754175802308E0C3F3401363F07F03033A03F08103027502E065 | ||||
| :400F00000575002BC0D08268551C85601370C368013BC360B8E7F0BD2DE9F04172B6884B61221A70A3F5F06301221A801924854A9C7092E803008033062283F8002283E874 | ||||
| :400F40000300522203F580731A707F4B7F4A1B787F4EDBB2137040F618027E4B00251A8041F2512223F8022C33784FF4F07003F0010343EA450502F0B7F8013C05F0030524 | ||||
| :400F80002ED0032DF0D1744B4FF480721A8007221A70724A002548211570917002221D705D7103F8032C0422DA716D4A6D4C13786D4E43F00103137012F8013C062743F000 | ||||
| :400FC000030302F8013C2378012243F0800323705B4B1A70654A137843F02003137000E0FEE707FB056300219A881868013502F0E3F8072DF5D15E485E4E002550F8041F99 | ||||
| :4010000005F1105303F1520221F0FF075333C9B20B4452005B0002329A4206D012F802EC12F801CC0EF807C0F5E7B0420D44E5D1514A002313609360136193614F4B504FDF | ||||
| :401040001A68504BDFF888811A604F4B1A684F4B1A604F4A137843F002031370137C43F0020313742378A2F5863243F040032370413A137843F010031370464A464B07CAE8 | ||||
| :4010800003C31A80454A2833106843F8250C127903F8212C424A07CA03C31A80414AE83B07CA03C31A80404A083307CA03C31A803E4A3F4BA2F5616203CBC2F8100EC2F8D1 | ||||
| :4010C000141E1378042043F008031370394B02F5AA521B783D78DBB298F80060EDB203F007010C321B091170F6B2537045F003033B7046F0030388F800302F4B48221A70EA | ||||
| :401100002E4A402313702E49937013729372082382F81F3220220A7048710A72294A0A20137001F0DDFB284B88F8006044223D70264D1A7094E80F0007C52B80BDE8F08102 | ||||
| :40114000004800404C0F00480F010049A146004025420040224200400440004006400040A2430040A0430040963B0000E8460040FCFFFF47A000004800760040540F00485E | ||||
| :40118000F846004020760040580F004828760040035001400C0F0048C0510040180F0048200F00482C0F0048380F004832510040440F0048CF0100491D510040015900404F | ||||
| :4011C000235B0040585B004076580040B0430040F946004008B501F0C3FF03680C2B00D1FEE7FEE7084908B50B68084A1844821A802A01DC086005E001F0B2FF0C230360FE | ||||
| :401200004FF0FF33184608BDCC80FF1FC893FF1F80B51148114B0025C0B1A3F1100192C922460439161BB74204D051F8046F42F8046BF7E7114653F8046C8C1AA64202D05F | ||||
| :4012400041F8045BF9E701381033E5E701F08EFFFFF7C8F8FEE700BF01000000683D0000124A134B10B51A60124A134C1368134843F4007313600023032B98BF54F8232052 | ||||
| :401280004FEA830188BF0E4A0133302B4250F3D10C4B1A780C4B1A700C4B084A1A60FFF73BFEBDE8104001F0EDB900BF0004FA050CED00E014ED00E0000000000080FF1F2B | ||||
| :4012C000D5110000BC760040C080FF1F08ED00E0F8B501F011FF4B4A01271378022643F001031370137C484C43F001031374474B02F5E3521F700B3203F8946C137805464F | ||||
| :4013000003F07F031370002001F0EAFA2378404A03F0F90323701378384603F0DF03137023783B43237001F0DBFA282001F0D8FA384B30461A7802F07F021A701A7802F02F | ||||
| :40134000BF021A7023783343237001F0C9FA2378314A43F0040323700023137053702F4AFF2199540133092BFBD1284601F0C8FE0721172001F0FCFA2949172001F0EAFADB | ||||
| :401380000721182001F0F4FA2649182001F0E2FA0721152001F0ECFA2349152001F0DAFA0721052001F0E4FA2049052001F0D2FA0721062001F0DCFA1D49062001F0CAFA23 | ||||
| :4013C0000721084601F0D4FA1A49072001F0C2FA0721082001F0CCFA1749082001F0BAFA0021162001F0C4FA1449162001F0B2FA07210C2001F0BCFABDE8F84010490C20BA | ||||
| :4014000001F0A8BAA5430040944300409D60004012600040F851004084600040ED92FF1F9F1C0000D91A00009D1C0000D11B0000FD1B00002D1C0000651C0000A51C0000EB | ||||
| :40144000191D0000214B224A10B5187000231370204A40201370204A0F2413701F4A13701F4A13701F4A13701F4A13701F4B4FF400021A604FF080721A604FF400121A60AB | ||||
| :4014800020221A601860802018604FF480701860174804704FF480001860164B1A70933B19B91A7802F0FE0202E01A7842F001021A70114B03221A70802203F8202C0120D0 | ||||
| :4014C00001F012FE0D4B04221A7010BD0893FF1F0E93FF1F0C93FF1F0D93FF1F0993FF1FF892FF1F0B93FF1F8093FF1F00E100E09E6000409C60004028600040126000401F | ||||
| :4015000070B5074C054623780E461BB9FFF7E0FE0123237031462846BDE87040FFF792BFB892FF1F0A4A002313700A4A13700A4A13700A4A13700A4A13700A4A13700A4A30 | ||||
| :4015400013700A4B03221A70802203F8202C70470E93FF1F0C93FF1F0D93FF1F0993FF1FF892FF1F0B93FF1F8093FF1F28600040014B1878704700BF0D93FF1F044B1A7802 | ||||
| :4015800002F0FF001AB118780022C0B21A7070470C93FF1F024A0C2303FB0020407870471493FF1F431E072B0CD8074A064B00010344805C5B7800F00F0043EA00200238EA | ||||
| :4015C00080B2704700207047FC5F00401A4A38B50C2303FB00231B79090C13F0800F00F1FF35044619BF8AB24FF480438BB24FF48042032D18D8DFE805F002070C110021C6 | ||||
| :40160000084601F01BF80DE00021084600F0FAFF08E00021084600F0D9FF03E00021084600F0B8FF054B1855EDB2072D03D801F0EDF8034B185538BD1493FF1FE492FF1FB1 | ||||
| :40164000ED92FF1F431E072B2DE9F0470446894615465CD82F4F0C2202FB0072D388DFF8B8A09BB2C3F500739D424FF00C0303FB007388BFD588DB7884BFC5F50075ADB2C2 | ||||
| :40168000254A43EA15230601B354B244EBB28AF80130224B1A5C9846FF2A01D1FFF796FF0C2303FB047200215170B9F1000F28D03DB31B4F385D01F011F811232946FE22D9 | ||||
| :4016C00018F8040001F0D6F806F5C04278321FFA89F118F8040001F0DFF8124D18F80410385D01F04BF80121385D00F0E1FF735D43F002037355735D03F0FD037355BDE82E | ||||
| :40170000F08703FB04746379DBB28AF80230BDE8F08700BF1493FF1FFC5F0040ED92FF1FE492FF1F706000402DE9F047044615468846002940D0431E072B3FD8FFF732FF59 | ||||
| :40174000A84203D22046FFF72DFF05461D4E335DFF2B03D141462046FFF738FFDFF868A027011AF8040000F0B9FF1223FE222946305D01F07FF807F5C0411FFA88F278310D | ||||
| :40178000305D01F089F8DFF84490315D1AF8040000F0F4FF01211AF8040000F089FF17F8093043F0020307F8093017F8093003F0FD0307F8093002E00D4600E00025284675 | ||||
| :4017C000BDE8F087ED92FF1FE492FF1F70600040431E072B0AD8064A0C2303FB002300225A705A79034BD2B200011A54704700BF1493FF1FFE5F0040431E072B9FBF024B61 | ||||
| :40180000000108221A547047FE5F004030B51A4A1A491B4D0878138803449BB21380194A00231488D8B2A4B27CB1082B0CD050680078C0B2E85450680133013050601088E4 | ||||
| :40184000013880B21080ECE718460B780E4C082B0E4A00D040B10E4D2B7883F080032B700F232370022301E0022323701370094B1870087030BD00BF8493FF1F8093FF1F18 | ||||
| :4018800000600040FC92FF1FF992FF1F0E93FF1F0A93FF1F8193FF1F074B02221A70074B80221A70064B0F221A70064A00231370054A0120137070470E93FF1F0A93FF1FE3 | ||||
| :4018C000F992FF1F8093FF1F8193FF1F30B5164B16491B780A8803F00F03023BDBB21A4492B20A80124C134A0020118889B279B173B15568215C013BC9B229705168DBB24A | ||||
| :401900000131516011880130013989B21180ECE7094A1370094A137883F080031370084B0B221A7030BD00BF296000408493FF1F00600040FC92FF1F8193FF1F0A93FF1F07 | ||||
| :40194000F992FF1F064A06231370064A01201370054B80221A70054B00221A70704700BF0E93FF1FF992FF1F0A93FF1F8193FF1F054B9A683AB19A68044910709A680988EC | ||||
| :40198000518000229A607047FC92FF1F8493FF1F08B5124B1A78D2B21A701B78DBB21A0602D50F4A137008BD0220FFF7E1FF0D4B1B7803F06003202B05D0402B06D043B99A | ||||
| :4019C00000F012FC04E001F09FFB01E000F046FD10B9034B03221A7008BD00BF28600040F992FF1F0060004008B5084A084B0120197813880B449BB21380064B00221A7030 | ||||
| :401A0000FFF7B6FF044B03221A7008BD8493FF1F8093FF1F0E93FF1FF992FF1F08B50C4B1B78DBB2042B07D0062B09D0022B0DD1BDE80840FFF7D8BFBDE80840FFF746BFB9 | ||||
| :401A40000320FFF795FF034B03221A7008BD00BF0E93FF1FF992FF1F08B5054B002201201A70FFF785FF034B03221A7008BD00BF0E93FF1FF992FF1F08B50A4B1A7832B10C | ||||
| :401A80001A78094942F080020A7000221A70074B002201201A70FFF76BFF054B03221A7008BD00BFF892FF1F086000400E93FF1FF992FF1F074B1B78DBB2042B05D0062B07 | ||||
| :401AC00005D0022B05D1FFF7A1BEFFF7C5BFFFF7D3BF70470E93FF1F38B51D4C2378DBB2DD0634D518060AD503F00F03012B2ED1FFF74EFF174B1B78190609D538BD5A0620 | ||||
| :401B000002D5FFF7D7FF03E09D0620D5FFF786FF23781B061BD4104B1A78104B1B7813430F4A13701278934211D10A4A0849154613782078DBB2000605D41378DBB20B70F1 | ||||
| :401B40000B7803F00F0328788342F1D138BD38BD28600040F992FF1F0A93FF1F8193FF1F29600040054A00231380054A916819B191680B7092685380704700BF8493FF1FA2 | ||||
| :401B8000FC92FF1F0E4808B503889BB213B9FFF783FE13E00B4B02221A700B4B00221A70FFF7E0FF094AD1799379028843EA012392B2934238BF0380FFF728FE012008BD64 | ||||
| :401BC000FC92FF1F0E93FF1F0A93FF1F00600040084B01221A700F3B9B7C074B1A7B02F00302012A1EBFDA7B82F08002DA7301225A7370470B6000401493FF1F094B0222B3 | ||||
| :401C00001A700F3B93F82230074B1A7E02F00302012A1EBFDA7E82F08002DA7601225A76704700BF0B6000401493FF1F0B4B04221A700F3B93F83230094B93F8242002F043 | ||||
| :401C40000302012A1EBF93F8272082F0800283F82720012283F82520704700BF0B6000401493FF1F0B4B08221A700F3B93F84230094B93F8302002F00302012A1EBF93F8FC | ||||
| :401C8000332082F0800283F83320012283F83120704700BF0B6000401493FF1F7047FFF741BC0000F0B5184B184E19780C27C9B201234FF0000C31B3CA0720D5144A4FEA33 | ||||
| :401CC000031E7244947850782040C5070DD507FB03652C79240608D5147804F0FE0414706D790C4CEDB204F80E50840706D507FB036425792D0658BF84F801C090700133B0 | ||||
| :401D0000DBB24908D7E7F0BD9F6000401493FF1F70600040FE5F004000F0ACBC70B50446184B88B003AA03F11006154618685968083303C5B3422A46F7D11B782B70FCB1E9 | ||||
| :401D40002223237001AD03232846637000F08AFE002220461146AB5C08AC04EB131414F8144C03F00F03847008AC234413F8143C0132082AC1700371417100F10400EAD107 | ||||
| :401D800008B070BDC03B00002DE9F0431C4D01222E460C201F274FF0800E4FF0080C194B00FB02581401234418705F70164998F805902144B9F1000F07D098F80440240665 | ||||
| :401DC0004CBF887081F802C001E081F802E000FB0261CC880132E4B29C71CC88092AC4F30724DC71CC88E4B21C71C988C1F307215971D4D1054BFF221A70BDE8F08300BF46 | ||||
| :401E00001493FF1F70600040FC5F00400A600040064B074A1B7802EBC30253681A7C824286BF03EBC0035869002070470893FF1F243C00002DE9F84F424B1A78002A7ED0F1 | ||||
| :401E40001878414D0138C0B2FFF7E2FFA8463F4AC3681478007ADFF800C1E4B203EBC0000C2600274FF0010E834268D01A78A24263D11CF80420597891425ED19A7893F848 | ||||
| :401E8000039002F07F0206FB02FA05EB0A01CF7093F802B009F0030981F804B093F803B005F80AB0B3F804A0A1F808A093F902A0BAF1000F0BDAB9F1010F0CBF4FF0070950 | ||||
| :401EC0004FF00D0981F8059081F801E009E0B9F1010F0CBF4FF005094FF0090981F805904F704FEA02191A4906FB0282494481F802E0B2F808A0CAF3072A81F800A0B2F825 | ||||
| :401F000008A05FFA8AFA81F801A0B2F806A011495FFA8AFA494481F806A0B2F80690C9F3072981F80790B2F806905FFA89F981F80490D288C2F307224A71083394E7BDE81D | ||||
| :401F4000F88F00BF0D93FF1F1493FF1F0993FF1FFC5F004070600040FA92FF1F08B5064B18780138C0B2FFF753FF20B143681B7900EBC300406908BD0D93FF1F00212DE9D7 | ||||
| :401F8000F84F0B464E4E0C2707FB01F401313219092933554FF000059370494CD3701381937253705371EFD118B1464B1D70464B1D70464B1A78002A7FD0187801250138FD | ||||
| :401FC000C0B2FFF725FFA8464368DFF8F8E0DB790C2713F0400F3E4B4FF0000C1A7814BF42F0010202F0FE021A70027AD20007FB0541C36803EB02094B4531D093F802A0D2 | ||||
| :402000000AF07F06AE4229D10E89B3F804B0B6B25E4538BFA1F808B01E7893F801B01EF80660B3451AD181F804A0DE780E7093F902A0DE78BAF1000F06F0030607DA012E7F | ||||
| :402040000CBF07260D264E7181F8018006E0012E0CBF052609264E7181F801C00833CBE70135092DC3D1C1680A328B1C0A440C200833934209D013F8081C13F80A5C01F05C | ||||
| :402080007F0100FB01418D72F2E7FFF767FF114B0121186000230C2000FB0142D3801289013113449BB203F00102134409299BB2F2D1BDE8F84FFFF767BEBDE8F88F00BF67 | ||||
| :4020C0001493FF1FFA92FF1F8293FF1F0D93FF1F0B93FF1F1093FF1F114B1B7903F07F035A1E072A19D80F490C2202FB031291781B0141F0010191700021D170517841F0B7 | ||||
| :4021000002015170127912F0800F074A1A4414BF8D2389239370FFF715BC0020704700BF006000401493FF1FFC5F004030B4194B1A7902F07F02531E072B27D8164B0C2400 | ||||
| :4021400004FB02339978154D01F0FE0199700021D97029461201505D114400F07F0050555A7802F0FD025A701A795B78120605D5012B01D18C7006E00D2303E0012B0CBFEE | ||||
| :40218000082309238B7030BCFFF7DCBB002030BC704700BF006000401493FF1FFC5F004010B50D4B0D4C21791878C9B20138C0B2FFF72EFE43681B798B4201D2012909D800 | ||||
| :4021C000074A0848535CDBB24354A3780120DBB2535410BD002010BD0D93FF1F00600040FA92FF1F8293FF1F38B58A4A8A4C13780021DBB221801806517840F18D800A293D | ||||
| :4022000000F20581DFE811F05D00030103010301030103010B0003017E0003018200D3787C49012B09D17D4B1A787D4B03EBC2035B685B686360122310E0CB78022B12D12E | ||||
| :402240008878FFF7E5FD002800F0E180436863606368DA7863689B7843EA02232380BDE83840FFF78FBCCB78032B26D16D4B00228878D5B2854209D3664A91786A4AEE2961 | ||||
| :4022800008BF1346634A917881B106E0187801320028F1D018780344EAE764499278097C914203D16248FFF739FD614B1A78002A00F0AD801A78228018E0BDE8384000F065 | ||||
| :4022C00023BF13F0030313D0022B40F0A0802380504B0C211B7903F07F02564B01FB02339A78554BD2B21A7000225A706360B6E702222280514A11784F4AC9B21170537000 | ||||
| :402300006260ACE7012323804D4BEFE70123238013794C4A1344E9E701390A2977D8DFE801F037764F76067676760A7620009378454ADBB25AE0937803F0FF0153B9404B1F | ||||
| :402340001A7891425FD01970404B01201870FFF715FE58E0481EC0B2FFF75AFD0028EED155E0FFF71DFF002851D02A4A384913791279DBB2D2B20A70364A3249D25CCB5C48 | ||||
| :402380009A4240D0314B01221A70FFF753FD3AE003F00303012B2BD009D3022B37D11D4B9B78002B33D1BDE83840FFF7BFBE194B9B78012B2BD1214A137803F0FD0315E0C0 | ||||
| :4023C00003F00303012B13D008D3022B1FD1114B9B78E3B9BDE83840FFF77EBE0D4B9B78012B14D1154A137843F0020313700AE0084B1A795AB998781B791749DBB2CA5CC8 | ||||
| :4024000022EA0002CA54BDE83840FFF79BBA002038BD00BF00600040FC92FF1F0893FF1F243C0000883C0000103C0000FB3C0000A093FF1F1493FF1FB992FF1F0B93FF1F4D | ||||
| :402440000D93FF1FFA92FF1FF892FF1F0C93FF1F0993FF1F8293FF1F0F93FF1F074B1A78120609D55B78012B06D1054B054A5A6012781A80FFF786BB002070470060004007 | ||||
| :40248000FC92FF1FE83B0000014B1870704700BF7F640040014B1878704700BF69640040014B1870704700BF78650040064A0123136002F688321268E0211064034A1170C4 | ||||
| :4024C000A2F540721360704780E100E000E400E0014B1870704700BF72640040014B1870704700BF7665004073B515461E460B4C05230022019200920A460146184623706A | ||||
| :4025000000F064F932462946207800F01FF90221207800F009F9207802B070BDD080FF1F064A0423136002F688321268E0219064034A1170A2F202321360704780E100E029 | ||||
| :4025400002E400E0014B04221A60704700E100E0014B04221A60704780E100E0014B1870704700BF78640040704738B505460078012428B100F060FD285D0134E4B2F8E706 | ||||
| :4025800038BD08B50D2000F057FDBDE808400A2000F052BDF7B516461F460B4C00230325019300930A4601462846257000F00EF93A463146207800F0C9F80221207800F030 | ||||
| :4025C000B3F8207803B0F0BDE080FF1FF7B516461F460B4C00230225019300930A4601462846257000F0F2F83A463146207800F0ADF82946207800F097F8207803B0F0BD6F | ||||
| :40260000E180FF1FF7B516461F460B4C00230125019300930A4601462846257000F0D6F83A463146207800F091F80221207800F07BF8207803B0F0BDE280FF1F73B515466E | ||||
| :402640001E460B4C0023019300930A4601461846237000F0BBF832462946207800F076F80221207800F060F8207802B070BD00BFE380FF1F024B1878C0F38010704700BFFD | ||||
| :402680008F450040074A7F23802113705170064A013BDBB202F80839002BF9D1034A1370704700BFE480FF1FF87B00400078004017280FD8084B0001C25C11B142F0200204 | ||||
| :4026C00001E002F0DF02C254C25C42F00102C25400207047012070471070004017280BD8064B0001C25C02F0FE02C254C25C02F0DF02C25400207047012070471070004028 | ||||
| :4027000017280DD8074900010B4603441A7942F004021A71435C43F00103435400207047012070471070004017280BD8064A0001835C490003F0F10301F00E0119438154A7 | ||||
| :4027400000207047012070471070004041F6FF73994208BF4FF400519A4208BF4FF4005217289FBFC00000F1804000F5EC4081809ABFC280002001207047000017289FBF73 | ||||
| :40278000034B00011954002088BF0120704700BF1970004017289FBF054B00011A5C01F007019DBF1143195400200120704700BF1470004017289FBF034B0001185C00F051 | ||||
| :4027C000070088BFFF20704714700040172810B51AD8C00001F07F0100F1804441EAC21204F5EC44D2B222709DF8082003F00F0343EA0213DBB263709DF80C30002003F08F | ||||
| :402800000F03A370E07010BD012010BD10B500F073FC0A4A5378182B0AD91478013B5370E30003F1804303F5F0431B78137000E0FF2400F065FC204610BD00BFE480FF1FD1 | ||||
| :40284000030610B5044611D400F056FC084AE300117803F1804303F5F04319705378147001335370BDE8104000F04ABC10BD00BFE480FF1F30B504060CD411F4704509D14E | ||||
| :40288000C40004F1804404F5F0442180A270E370284630BD012030BD03065FBFC00000F1804000F5F04081805ABFC280002001207047000038B50446084DB4F5004F05D98C | ||||
| :4028C000286800F011FCA4F50044F6E7034B58686043BDE8384000F007BC00BFEC80FF1F024B1B7A584300F0FFBB00BFEC80FF1F0E4B00F003001A78490102F0FC021043EC | ||||
| :4029000018701A7801F0600142F080021A701A7802F07F021A701A7802F09F020A431A701A7842F010021A70704700BF83430040014B01221A70704784430040044B00F090 | ||||
| :402940000F021B6853F8220043F82210704700BF08ED00E0054A00F01F00126800F1100352F8230042F82310704700BF08ED00E000F01F0000F16040490100F56440C9B29F | ||||
| :40298000017070470F4B10B50F4900240F205C609C60DC601C615C61FFF7D0FF0B4A136843F0040313600A4B4FF47A72DB68B3FBF2F3084A1360084B4FF400421C60C3F887 | ||||
| :4029C000E82010BDBC92FF1F312A000010E000E0EC80FF1F14E000E018E000E0024A136843F002031360704710E000E008B5FFF7F5FF034A136843F00103136008BD00BF9F | ||||
| :402A000010E000E010B5054CA3691BB9FFF7BAFF0123A361BDE81040FFF7E8BFBC92FF1F024B1868C0F30040704700BF10E000E038B5FFF7F5FF012808D1054D002455F859 | ||||
| :402A4000243003B198470134052CF8D138BD00BFC092FF1F024B03EB8003586859607047BC92FF1F134B144A1B78DBB20360127843EA0223114A0360127843EA0243104A93 | ||||
| :402A80000360127843EA026303600E4B0E4A1B78DBB24360127843EA02230C4A4360127843EA02430A4A4360127843EA02634360704700BF0301004904010049EC460040B6 | ||||
| :402AC000020100490101004900010049050100490601004910B500F00FFB204A044613780A2043F002031370137C43F00203137412F80A3C43F0010302F80A3C937943F01F | ||||
| :402B00000103937102F5AB52137843F003031370134B18221A7013F8012C42F0400203F8012C13F8012C02F0FC0203F8012CCE2203F8062CA3F597530222183B1A70094A19 | ||||
| :402B4000137843F008031370FFF7CAFE064B10222046BDE810401A6000F0D2BAAB4300400E5900402F5B004080E200E008B500F0C3FA0F4A137803F0FE031370A2F5AA523E | ||||
| :402B80001D3A137803F0FD031370137C03F0FD03137412F80A3C03F0FE0302F80A3C937903F0FE039371BDE8084000F0A9BA00BF08590040044A137803F03F0343EA8010C1 | ||||
| :402BC000C0B21070704700BF08590040082804D00A280CBF8223C22300E0422308380E4AC0B20428137098BF0C4B4FF0000298BF33F910100A4B88BF11461A8042F210736D | ||||
| :402C00004B4341F2883103F6C41393FBF1F305490B60054B1A8070470A590040D23B00008A93FF1F8C93FF1F9093FF1F08B5102000F0A6F907210420FFF79AFE074904204B | ||||
| :402C4000FFF788FE064A0C20137843F006031370FFF7BCFF034B00221A8008BD252D0000095900408893FF1F10B5054C23781BB9FFF7DCFF01232370BDE81040FFF72ABF84 | ||||
| :402C8000D892FF1F044B1A7802F0FB021A701A7842F001021A7070470859004010B5084B1C7814F0010403D10028F9D0002404E02046FFF715FE024B1B78204610BD00BFC6 | ||||
| :402CC00009590040034A044B1B881088181A00B2704700BF9093FF1FA25B00400E4A13881BB223B111880A2309B2594301E00B4B19680B4B1B88C01A42F2107300B203FBE0 | ||||
| :402D000000F2022391FBF3F30028D8BF5B42134493FBF1F000B270478A93FF1F8C93FF1F8893FF1F7047000010B500F0E5F9214A044613780A2043F001031370137C43F09E | ||||
| :402D40000103137412F80A3C43F0020302F80A3C937943F00203937102F5AA521832137843F003031370144B18221A7013F8012C42F0400203F8012C13F8012C02F0FC0215 | ||||
| :402D800003F8012CCE2203F8062CA3F597530222123B1A70094A137843F008031370FFF79FFD074B08222046BDE810401A6000F0A7B900BFAB43004006590040275B004031 | ||||
| :402DC00080E200E008B500F097F90F4A137803F0FE031370A2F5AA52153A137803F0FE031370137C03F0FE03137412F80A3C03F0FD0302F80A3C937903F0FD039371BDE8E0 | ||||
| :402E0000084000F07DB900BF00590040044A137803F03F0343EA8010C0B21070704700BF00590040082804D00A280CBF8223C22300E0422308380E4AC0B20428137098BF20 | ||||
| :402E40000C4B4FF0000298BF33F910100A4B88BF11461A8042F210734B4341F2883103F6C41393FBF1F305490B60054B1A80704702590040DC3B00009693FF1F9C93FF1F77 | ||||
| :402E80009493FF1F08B5102000F084F807210320FFF76EFD07490320FFF75CFD064A0C20137843F006031370FFF7BCFF034B00221A8008BD7D2F0000015900409893FF1F31 | ||||
| :402EC00010B5054C23781BB9FFF7DCFF01232370BDE81040FFF728BFD992FF1F044B1A7802F0FB021A701A7842F001021A7070470059004010B5084B1C7814F0010403D1E6 | ||||
| :402F00000028F9D0002404E02046FFF7E9FC024B1B78204610BD00BF01590040034A044B1B881088181A00B2704700BF9493FF1FA05B00400E4A13881BB223B111880A23E0 | ||||
| :402F400009B2594301E00B4B19680B4B1B88C01A42F2107300B203FB00F2022391FBF3F30028D8BF5B42134493FBF1F000B270479693FF1F9C93FF1F9893FF1F7047000060 | ||||
| :402F8000034A00F0F800137803431370704700BF02410040034A00F0F800137803431370704700BF06410040014B1870704700BF76640040014B1870704700BF7C6400403B | ||||
| :402FC00073B515461E460B4C04230022019200920A46014618462370FFF7F8FB324629462078FFF7B3FB02212078FFF79DFB207802B070BDFC80FF1F074A0223136002F656 | ||||
| :4030000088321268E0215064044A11706FF440710A441360704700BF80E100E001E400E0014B1870704700BF74650040014B1870704700BF77640040FEB5494652465B4644 | ||||
| :403040000EB40746244909688A46244A12682448022100F071F8030020480068C018204900F06AF8143883460121C9430C460125002600F041F8814651460B7823400B7094 | ||||
| :403080005846013000F030F83800F04028400B78234003430B70584600F026F80136072EF2D9002001300138013001200B78234003430B705846043000F016F8484600F0FE | ||||
| :4030C0001FF800BF00BF00BF0EBC894692469B46FEBD00BFAFF30080D480FF1FF880FF1F00C20100000000000230800803D000BF01380046FCD17047EFF3108072B6704723 | ||||
| :4031000080F31088704700BF094A137803F00303012B0AD0022B09D113790C2103F07F02044B01FB02339B7A00E0137900207047006000401493FF1F002902D0B0FBF1F039 | ||||
| :40314000704708B14FF0FF3000F008B80029F8D00246B0FBF1F000FB11217047704700BF014B1868704700BF6081FF1F0E4B70B51E460E4C0025E41AA410A54204D056F845 | ||||
| :40318000253098470135F8E700F0D4FD084B094C1E46E41AA4100025A54204D056F8253098470135F8E770BD403D0000403D0000403D0000483D000003460244934202D071 | ||||
| :4031C00003F8011BFAE7704730B5141E05469BB0184604DA8B232B604FF0FF301DE04FF40273ADF80C300CBF234604F1FF33029305934FF6FF7300910491ADF80E3002466A | ||||
| :403200001E9B6946284600F073F8431CBCBF8B232B6014B1009B00221A701BB030BD000007B5009313460A46014603480068FFF7CBFF03B05DF804FB6081FF1F2DE9F04781 | ||||
| :403240008E6882469E420C46914698463ED88A8912F4906F3AD02568096902236F1A656905EB450595FBF3F57B1C43449D4238BF1D4653050FD5294600F04AFB064698B178 | ||||
| :403280003A46216900F0D2FAA38923F4906343F08003A38113E02A4600F098FB064670B92169504600F0E8FA0C23CAF80030A3894FF0FF3043F04003A381BDE8F0872661F3 | ||||
| :4032C0003E44266046466561ED1BA560464528BF464649463246206800F0B3FAA36800209B1BA36023681E442660BDE8F08700002DE9F04F9DB003938B8980461C060D4643 | ||||
| :4033000016460DD50B695BB9402100F001FB2860286118B90C23C8F80030CDE040236B610023099320238DF82930DFF89CB130238DF82A3037463C4614F8013B1BB9B7EBAA | ||||
| :40334000060910D003E0252BF9D02746F3E74B46324629464046FFF771FF013000F0A780099B4B4409933B78002B00F0A08000234FF0FF3204930793059206938DF85330B6 | ||||
| :403380001A930126052221784E4800F041FA671C049B38B14B4A3C46801A06FA00F018430490EFE7D90644BF20228DF853201A0744BF2B228DF8532022782A2A03D0079A60 | ||||
| :4033C00000210A200BE0039A111D12680391002A10DA524243F00200079204900BE027463B780134303B092B03D800FB02320121F5E701B107923B782E2B1ED17B782A2B3F | ||||
| :403400000AD1039B02371A1D1B680392002BB8BF4FF0FF33059310E0002319460593781C0A2407463A780130303A092A03D804FB01210123F5E703B10591032239782248C1 | ||||
| :4034400000F0E6F940B14023CBEB000003FA00F0049B013718430490397806221B487E1C8DF8281000F0D4F988B1194B33B9039B073323F007030833039314E003AB0093EC | ||||
| :403480002A46144B04A94046AFF3008007E003AB00932A460F4B04A9404600F093F8B0F1FF3F824603D0099B5344099342E7AB895B0601D4099801E04FF0FF301DB0BDE802 | ||||
| :4034C000F08F00BF0F3D0000153D0000193D0000000000003D3200002DE9F04791461F460A698B6806469342B8BF1346C9F8003091F843200C46DDF8208012B10133C9F8EF | ||||
| :4035000000302368990642BFD9F800300233C9F80030256815F0060510D104F1190A07E00123524639463046C04701301AD00135E368D9F800209B1A9D42F1DB94F84330E8 | ||||
| :403540002268003318BF012392060FD5E118302081F843005A1C94F845102244023382F8431003E04FF0FF30BDE8F08704F1430239463046C0470130F4D02268D9F8005010 | ||||
| :40358000E36802F00602042A08BF5D1B2269A3680CBF25EAE57500259342C4BF9B1AED184FF000091A344D4509D00123224639463046C0470130D5D009F10109F3E70020FB | ||||
| :4035C000BDE8F0872DE9F04317460A7E85B06E2A984606460C460C9B01F1430E00F0AE8011D8632A22D009D8002A00F0BB80582A40F0CA8081F84520834955E0642A1ED03B | ||||
| :40360000692A1CD0C0E0732A00F0B08009D86F2A2ED0702A40F0B8800A6842F020020A603EE0752A24D0782A3AD0ADE01A6801F14205111D1960136884F84230A8E021683E | ||||
| :403640001A6811F0800F02D0111D196008E011F0400F02F10401196002D0B2F9003000E01368002B3CDA2D225B4284F8432037E021681A6811F0800F02D0111D196007E0F0 | ||||
| :4036800011F0400F02F10401196001D0138800E01368227E5C496F2A14BF0A2208221BE078225A4984F845202268186812F0800F00F104051D6003D1550601D5038800E0E0 | ||||
| :4036C0000368D00744BF42F0200222601BB9226822F0200222601022002084F8430001E049490A226568002DA56008DB206820F0040020602BB9002D7DD175460CE0002BBC | ||||
| :4037000079D07546B3FBF2F002FB1033CB5C05F8013D03460028F5D1082A0BD12368DA0708D5236962689A42DEBF302305F8013C05F1FF35C5EB0E0323612EE008681A68FA | ||||
| :4037400010F0800F496903D0101D1860136808E010F0400F02F104001860136801D0198000E0196000232361754616E01A68111D1960156800216268284600F049F808B1F0 | ||||
| :40378000401B6060636804E004F1420584F8422001232361002384F84330CDF800803B4603AA21463046FFF797FE013002D14FF0FF3026E023692A4639463046C0470130EF | ||||
| :4037C000F5D023689B0710D5002504F1190907E001234A4639463046C0470130E7D00135E368039A9B1A9D42F2DBE068039B9842B8BF184605E00B7804F1420584F8423091 | ||||
| :403800008AE705B0BDE8F083C03B0000203D000010B5C9B202449042034605D01C7801308C42F8D1184610BD002010BD10B5431E0A44914204D011F8014B03F8014FF8E76E | ||||
| :4038400010BD884210B501EB020301D8421E0BE09842FBD28118D21AD34204D013F8014D01F8014DF8E710BD994204D011F8014B02F8014FF8E710BD38B50546002944D007 | ||||
| :4038800051F8043C0C1F002BB8BFE41800F0D4F81E4A1368114613B96360146030E0A3420DD92268A018834201BF18685B681218226063600C6023E0A24203D813465A6820 | ||||
| :4038C000002AF9D118681918A1420BD12168014458188242196013D110685268014419605A600DE002D90C232B6009E021686018824201BF106852680918216062605C6019 | ||||
| :403900002846BDE8384000F098B838BDE092FF1F70B5CD1C25F0030508350C2D38BF0C25002D064601DBA94202D90C23336046E000F082F8234B1C681A462146A1B10B6883 | ||||
| :403940005B1B0ED40B2B03D90B60CC18CD501EE08C420BBF63684B681360636018BF0C4615E00C464968E9E7174C23681BB9304600F052F820602946304600F04DF8431CCB | ||||
| :4039800018D0C41C24F00304A0420DD12560304600F053F804F10B00231D20F00700C31A0ED05A42E25070BD211A304600F034F80130EBD10C233360304600F03EF80020E9 | ||||
| :4039C00070BD00BFE092FF1FDC92FF1FF8B5074615460E4621B91146BDE8F840FFF798BF1AB9FFF749FF2846F8BD00F027F885420ED929463846FFF78BFF044650B131469B | ||||
| :403A00002A46FFF713FF31463846FFF735FF01E03046F8BD2046F8BD38B5064C0023054608462360FDF7DEFB431C02D1236803B12B6038BDC493FF1F7047704751F8040C50 | ||||
| :403A40000028BEBF091851F8043CC0180438704700000000050209020B020D020F021102130215027265706C792030782530327800686F6D696E6700626567696E6E696EEF | ||||
| :403A800067207365656B2066726F6D20256420746F2025640066696E6973686564207365656B0057616974696E6720666F72205553422E2E2E0055534220726561647900AF | ||||
| :403AC000636F6D6D616E6420307825303278006661696C2025642B25642B2564203D3D2025642C206E6F74202564007061737365643D256400756E64657272756E2061664A | ||||
| :403B0000746572202564207061636B65747300636F756E743D256420693D256420643D256400636D645F777269746500646F6E6520256420256400703D25642063723D25BB | ||||
| :403B4000642063773D256420663D256420773D256420696E6465783D256420756E64657272756E3D25640077726974652066696E6973686564007374617274206572617393 | ||||
| :403B8000696E670073746F702065726173696E670069646C650000510040100040510040300000000140001000140140000800400140000A004C014000020050014020003F | ||||
| :403BC0003031323334353637383941424344454600000001000000040000001000010000000400000010000028000000000104000100000000000000000157494E555342F2 | ||||
| :403C00000000303030303100000000000000000012034D0053004600540031003000300001000000010000002C3C000001000000FB3C000000000000000000000100000010 | ||||
| :403C4000443C000001000000CD3C000004000000663C0000000000000000000000000000643C0000FF00000001024000FF00000082024000FF00000003034000FF0000002B | ||||
| :403C800084034000FF00020304030904160346006C007500780045006E00670069006E0065002A0343006F0077006C00610072006B00200054006500630068006E006F0096 | ||||
| :403CC0006C006F0067006900650073000009022E0001010080320904000004FF00000107050102400000070582024000000705030340000A0705840340000A12010002FFD7 | ||||
| :403D00000001080912006E0100020180014300232D302B2000686C4C00656667454647003031323334353637383961626364656600000000F8B500BFF8BC08BC9E46704759 | ||||
| :403D40005900000061120000F8B500BFF8BC08BC9E46704735000000683D0000C880FF1FA00000006012000000000000C893FF1FFF000000675000400C0000000700000024 | ||||
| :403D8000FFFFFFFF7F8000003F0000000000007D00FA0000400000000090D003FF0000000000000000000000000000000000000000000000000000000000000000000000B0 | ||||
| :403DC0000D3D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000079 | ||||
| :403E00000081FF1F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E3 | ||||
| :403E40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042 | ||||
| :403E80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 | ||||
| :403EC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C2 | ||||
| @@ -4098,69 +4098,69 @@ | ||||
| :40FF80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041 | ||||
| :40FFC0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 | ||||
| :0200000480007A | ||||
| :400000000145004007520040015B00400264004001010140490201404103014059040140540501404C0601404707014047080140470901404C0A0140500B0140590C0140B7 | ||||
| :40004000520D0140460E0140380F01404E1401405F1501405516014058170140491801404C1901404B1A0140581B01400D400140094101400C4201400A43014003440140AF | ||||
| :4000800004450140064601400E4701400B480140104901401D4C01400A4D014008500140045101407E020841090210801801600361157C4027212D0A3501E60103400410EF | ||||
| :4000C0000620070E09300A1C0B020C100D3E0E4011011461150816061710186219301A01200B210822602320266027302A802B012C7C2D042F3032FC337E360337013980D2 | ||||
| :400100003E403F404201470E481049FF4AFF4BFF4F83580459045A045B045C995D095F01823F843F8A028C019208963F9A3F9C3F9D01A210A604AA20AC3FAD02B502B63F2A | ||||
| :40014000B701BE40BF50D804D904DB04DF010085020A04100504060108A90D040E040F2010201120134215401680171418021C101D801E20200222102680272028022D08FD | ||||
| :400180002E802F4832403410350437013D423E083F20458046084720550858405A205C405E2A6501660867066A8080A08404870288408A028C20A508B108C0EFC26FC4FF5D | ||||
| :4001C000CAF8CCE8CEF0D010D6FCD8F0E607EE20020703D3040805130610072009010B080DF20E280F04111212401380151217401804190A1A301B051C021E381F12203F7E | ||||
| :40020000251327E028382A012C342E08307F33F0350737083B203F405608580459045B045C995D905F018002821883018404860887018B018E188F0191019207950198180E | ||||
| :400240009B019C049E109F01A01FA301A418A501A601AB01AE20AF01B03FB101B301BF05C036C9FFCAFFCBFFD004D601D804D904DA04DB04DC09DD09DF01E080E240E44082 | ||||
| :40028000E5640102032204020504060209410B080E840F02120B130215081742184019021E801F0121442298250127502B202C102D202E052F22310432923698370238028F | ||||
| :4002C00039483A103D843EA247084A024B804F1059806002680269406B026D046E216F0675287622861094449548960497C698819B809C1A9D0D9E819F15A0E4A110A501E4 | ||||
| :40030000A605A708A801AB80AC81AE88B001B401B510C0BDC2DBC4BBCAF2CCFFCEFFD040D220D608D808E202EA0B02010301040107010A010B010D040E010F0312011302F6 | ||||
| :400340001503160117041A011B011E011F012201230125012601270428012B012E012F01330734013E103F04580459045B045F0180038140821C844C860387078B408C8032 | ||||
| :400380008D1F9104931095189620970199189A059E4F9F20A003A102A210A318A504A708A80FAA40AB18AD80AE0AB03FB280B3C0B440B53FBA02BE04D804D904DB04DC9907 | ||||
| :4003C000DF010142032004020528060209400B280E65124A13021404158016A019131A601F10201023042504280229242B402D282E812F62320A33603404369A3810390293 | ||||
| :400400003A403B043D843E2E3F8059405B8069406E806F0D7A027B018580918C92019486975C988199209A229BD29C089D859F09A0E6A110A298A302A540A607A729A8400D | ||||
| :40044000C0FDC2F7C4FBCAFFCCFFCEFFE208EE0C0156020103210403070108030B020C030D061003110713081602170119061A031C031F042106220423782540260827069F | ||||
| :4004800029112A032B262C032D7F320F3403357F3E103F10580459045B045C095F0180018103830C843F870F89088A028E048F01910F923F95049620983F99089D089E3F1D | ||||
| :4004C000A108A208A508A610AA3FAB02AC3FAF08B23FB70FBE04BF40D804D904DF01008801020244044005150AB10B040E450F111105120813801401153017861B081C2078 | ||||
| :400500001D041E081F042302270429102A452D102E022F223218334234013510368838403A203B093C503D043E016D806E406F028A028B0490509145929095209645975408 | ||||
| :40054000980299139AA59B409C809D049E02A044A288A411A54FA604A72AB404C0FFC2FFC4FFCAFFCCFFCEFFE208EE0C0105050F0601071009050A040C010D080F021105AF | ||||
| :40058000120115051602180119101C081D052001230524012505292C2A012B022C082D132F2030073408373F3A223F40580459045C095F018001820C8303853D860187C0FF | ||||
| :4005C000880689808C068D809003918092089407958099309A069C069D809E01A10CA201A340A5A9A602A801A980AA06AC06AD56B1FFB40FBE10BF01D608D804D904DB0439 | ||||
| :40060000DD90DF010008030A044205100608072009800A200B840D080E451108120A130214201521160219111A881C042180260229122A042B022E092F4632013364350557 | ||||
| :400640003680372239403A213B043C403D023F145F40600861106680868088028904905A914592329308940496C99714982099029A259B649C88A044A288A411A54EA60479 | ||||
| :40068000A720AB20AD80AE20AF01B412B610B701C0F7C2FFC4FFCAFFCCFFCEFFD610D810E8C0EE1002490502060108400A300C480E20100115021602184919011E04204807 | ||||
| :4006C00021052210244928012D022E013207330134383504364037023A083BC03F04400145C047E0482249FF4AFF4BFF50045609580459045A045B045C995D995F0162C025 | ||||
| :40070000825D8501861D881D8C1D9207941D98019A309C1D9E40A01DA45DA801AA08AC0CAE22B040B203B301B43CBE15BF04C043C702C810C9FFCAFFCBFFCD20CEF0D11014 | ||||
| :40074000D804D904DA04DD09DF01E108E240E340E480E640E7400062032004800511072008090A810B080E420F2410101188128013101450151016011A201B121C101D9077 | ||||
| :400780001F8421042402269827202C442E202F81361438083C044104430245804C405004550159015A015CB05D1065406D456E106F547444750276A57709828083408504AB | ||||
| :4007C000860189408A808E04904094109505965997149C0F9D829E859F38A201A410A50FA680A720C0FFC2FFC4FFCA90CC60CE42D013D610D810E280E63001030208040194 | ||||
| :40080000070808080B020D030E0F100F1110140815031A021B031C031D031E0C2008230424082703280429032C082F01300F310F35103E013F10580459045B045C905F0131 | ||||
| :400840008001812E8341850F861087108A3F8B088D0E8E028F70903F930295219620974E983F9B019E3F9F04A10EA208A604A70EAA3FAB01AC3FAD7FB57FB63FBE40BF103B | ||||
| :40088000D804D904DF010040010202040320041005800680071008040AC90C100D420E190F0411051201132015011601172819011E022040210122102404281929012C40C4 | ||||
| :4008C0002E502F203002310832403320340236843720380439823B103C603D083E0168028101821088408A04C0FFC2FFC4FFCAFFCCFFCEFFE40400AA0101024405080644A9 | ||||
| :4009000009010CF10D0112221401170218CC1A221B011C881F01221123042B012D01300E3108330734F0360F3B083E013F015608580859045B045C995D905F0180028210E0 | ||||
| :4009400083078540860A89188B018D028F18907A9104920493109401968098199A629B209C829E059F40A040A21BA318A41BA518A620A904AB08AD1FB13FB280B478B540A1 | ||||
| :40098000B607B920BA80BE04BF10D804D904DC99DF01000A01800504074009880A400B040C020D080E090F20110114401620188019801B501D041E091F2420202101231042 | ||||
| :4009C000250126012708280829012B022C022F64302431403642371038043A413B503D863E2058805A1060066180680469106A4079808080830884118501880489108B44A1 | ||||
| :400A00008C0A8D408E40910592109380948095809748984099419A219B509C089D049E40A022A140A242A302A410A601A760AA01B508C03DC2FFC438CAFDCCBECEFFD60C07 | ||||
| :400A4000D80CDE08E008E280E402E649EA06EE02001F0101034006200720090B0A180C180F0B1080124013021418160119421A071B051C021E1822C02440250126802702E3 | ||||
| :400A800028042A082B082C042D022E102F1431403280343F350736403738388839803B203E443F01580459045B045C995F01803F8501861087868A3F8B288C01916892048B | ||||
| :400AC000963F983F99869B019D039E089F80A108A202A43FA984AA20AD50AE3FB03FB118B307B580B760B908BE01BF14D608D804D908DB04DC90DD90DF0100A802400440A7 | ||||
| :400B000006880710088909200C400D040E8810A0112013801514174519011C021D081E082101220123192402254026A22740280229102A022C022D102E802F24304032818E | ||||
| :400B400033203622381039083D883E223F01410442205A8060026F0179808044812082108322850188018E408F40901091089380948695029758988199509A089B949C0AE3 | ||||
| :400B80009D049F08A0E6A114A240A540A607A720B610C0FFC2FFC4FFCA7DCCADCEF6D608D808DE08E28DE820EE0B03220401050709800A020C0C0E020F111107140A160473 | ||||
| :400BC00017071B081C102107223025442601280829552B222D662E042F11310F320F330F34103580362037703B0A3E103F10580459045B045C995F01810182068402850160 | ||||
| :400C0000880289018C028F0190039101930294029501970299019E039F01A002A101A402A701A801A901AA04AC02AD01B003B204B503BE05BF10D804D904DF010088010262 | ||||
| :400C40000215031804240580070108040A510C080E0211451208168A170819081B011C201E061F302220252F26042782280629082A012C082D802E082F80310833923624D6 | ||||
| :400C8000370239613A043D103E023F846D9081048410870889208C049050914592509308952096059714980299139A849B409C809F80A044A288A302A401A50FA720B34087 | ||||
| :400CC000C0EFC2ADC4FFCAFFCCEFCEFFE211E440E860EE0B0002010104020501080209010C020F01100215011602180219011C081D011E0120022301240326042704281059 | ||||
| :400D000029012C1C2E032F02321F3507370739A03E04580459045C905F018006810282018360850186088738880489328C078D3290079102931095339602970498079932E7 | ||||
| :400D40009D329E10A007A133A30CA601A732A805A932AA02AD1FAF40B30FB570B61FBF14D804D904DB04DC09DF01005002A0040205400608071008020A010B280E600F0644 | ||||
| :400D800010021109120815101620170219081D401E011F80200A2110221023042718290A2B0A2FA63004321033403402351136A439443A113C503D013F0448035F406C099A | ||||
| :400DC0006D106F018511875088048A128B098C108EA88FC090509144924093289420952096019714980499139A919B429E0A9F01A104A28CA32BA409A7C0AB02AD40B480B4 | ||||
| :400E0000C0FFC2FFC47FCAFFCCFECEFFD610E090E260E440E6B1EC10EE021280170430203304368438083B403C808004C430CCF0CE70E68032043380364037029740A420E0 | ||||
| :400E4000A604B040CCF0530456109308960897409F02A420A644A780AF04D460EE1097409E109F02A640A780A820AA04AE04EA80EE3014808301C4045D0893029880D60148 | ||||
| :400E80001B0493029880B108C608E80108080B080D800F4086019302970898809B40AB04AF04B740C20FE8082580890297409E10A580AB02AE40AF80B180C820EED053045D | ||||
| :400EC00056207240750282408B048E209902AE10AF40D460DC80DE20E220EA40EE40070408020E010F201F10538056205B40670283048A208F109302960198809B40A38043 | ||||
| :400F0000A980AC08AF40B780C001C20DC601D407D601E208E401E8027210808092109880AF10B402B610DC01EA08EC08010109010B010D010F0111011B011D0100FF01AB85 | ||||
| :400F400002021005BF0000A09F001F000000000000000000100000004000000000000000C0000000FF0000B84700470000010000800000008000800000000000000303005F | ||||
| :400F800003000000270018012700180100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AD | ||||
| :400000000145004008520040015B004001650040010101404D0201403D0301404C0401404D0501404D060140500701404B0801404B0901404B0A0140500B0140470C0140CB | ||||
| :40004000500D0140520E0140350F014046140140541501404B160140561701404718014044190140591A0140571B01400A400140104101400E4201400943014004440140BE | ||||
| :400080000D4501400A4601400F470140094801400F4901401B4C0140084D014008500140045101407E0208440905108011821801600C610A7C4027212A0A8C8000010109B1 | ||||
| :4000C0000202040805090808090F0B100C080D010F02100F1120140416011709180819101B0E1D011E01210422082301240829092A0E2C0D320F331F35203B083E043F1020 | ||||
| :400100005608580459045B045C905D905F01850287018C01900F9401960898249A089E07A008A101A222A302AA08AE10B01FB101B302B420B90ABE10BF05C202C70EC810AC | ||||
| :40014000C9FFCAFFCBFFCF83D804D904DA04DB04DC09DD09DF01030204A10620074008010A060B200C800D100E400F2010421110150416821720180419011E10202021010F | ||||
| :40018000262027202A012C042E023508376138083E583F0240045208588859215A025D4060026108621265806F0180068140874088408A088E209880C0F1C2FFC4FBCAA1EC | ||||
| :4001C000CCF0CEF2D004D61FD81FE20CE6C5EE82010D04020601070109080C010D080E0E100F130E150F161019081C201D082101220F2302240125042604270128012908CA | ||||
| :400200002A082C012F08301F3220330F3E043F045608580459045B045C095D905F01810182088302840885028A108B018C088D038F049102920194049701982099029A1FB5 | ||||
| :400240009C089D02A202A302A408A501A704A808A902AC1FAD03AE20B107B43FBF01D804D904DB04DC09DF0100400108048006A0070809880A400C810E080F20100511082C | ||||
| :40028000130115251740185019011B011E081F20210827402AA02B902C052D022F20308031213208350136803728388039243B013D083E4A3F2158405C105D806180851076 | ||||
| :4002C00087029102938094A195349644972099809B209C0C9D089EBAA480A602A713A908AC03B010B520B601C0F5C2FDC4FFCAFFCCFFCEFFD638D808E20AE648E880EA03A0 | ||||
| :40030000EE820003010D050506010801090C0B020C010D0D1001111012021602170D1801190D1C011D0D2201230D2401250D280129092C012D012E022F02310C3510360355 | ||||
| :4003400037033E403F51580459045B045F0180208102820F8404860A882F89028D028EA09204948095039640970C98049A099E10A020A102A20FA480A802AC01AD0AAF0550 | ||||
| :40038000B060B108B21FB306B480B501B61FBE10BF01D804D904DB04DC99DF01000902080302048A0708082209880C800D100F9011501305158016A01710180919041A08AD | ||||
| :4003C0001BD21D80210923042440254026102B422C042D012E402F20310836843721380239803A103D203E083F825D015F0169506AA06F0178017B807D027F8080048604BE | ||||
| :4004000089108A028F01938094A19525964497219B209C0D9D0A9EA89F08A321A480A520A68AA790AD01B040B210C0FFC2FFC4FFCAF9CCF2CEFDE242E401EA01000103027E | ||||
| :4004400004E0050108010A080B020CE00F02100F1280130814481602170218201B021E071F02200422482302261027022A082B042F10311F34E0361F382039023F015804DF | ||||
| :4004800059045B045C095F0180038109840387318A018B098C038F06900391129309940395099712980399409E02A003A309A603A709A803A909AC03AD49AF24B338B40349 | ||||
| :4004C000B540B707BB88BE10D804D904DB04DC90DF010080012002800320048A052008180A010B400C020D080E0610021325172918081E061F802002215423252480284155 | ||||
| :4005000029202B202C872D202F203108321233013448350137A0380239883B103C803E043F115A806E408340860287048A0690029289935094019704981A99019B889C84CD | ||||
| :400540009D209F20A0C2A108A280A328A401AB10B204C0FFC2FFC47FCAFFCCF7CEFFD608E080E620EA85EE2002800404050D064808200A400C0111011210144816021A07E2 | ||||
| :400580001B051C401E202608280129102A082C0F2D0A3020310C32C03303341F362037103A083E413F4056085804590B5B045C995D905F01822083018607870F88218A0825 | ||||
| :4005C0008B018C218F019210930E9428964297059AC89B039F01A02FA280A301A444A628A709A90FAA20AD0FB105B21FB4E0B503B709BA20BF51D804D904DC09DF010001EA | ||||
| :400600000184030805A4078009090A060D080E881006121015141701180219811A051B481D041E081F20210422412501264027082B052C822F2432113408350137A03908B7 | ||||
| :400640003C823D043F144410450858805B10630A64086610780284018601911092289358950896019704980A9B819D249F20A0C2A108A280A401A761A840AF11B040B504F1 | ||||
| :40068000B702C0FFC27FC477CAFCCCF5CEF2D60CD80CDE01E202E640E880EA10EE4002080349077F08010A280B090C2F0F091001117F1408160217091A071B091E401F2962 | ||||
| :4006C000221023722709280429782A282B042F19310732603348341F352837183F55580459045B045C095F01802081048440850186A088418A088C4F8E808F04920794041B | ||||
| :40070000966898689A029B019C41A208A610AA40AD02B01FB304B503B6E0BA80BF04D608D804D904DB04DC99DD90DF010128024003010521070109040A810B080D080E0633 | ||||
| :400740000F80128013181608170218821A801D081E041F14221423102601271A2B012D042E012F253210341036843721380239083A403C023D1A3E0A3F54584060026240FE | ||||
| :4007800068026B016F0A831886408B048C018D089342951496019714980899019B809C109D209E0A9F21A0C0A284A402A509A74AB308B504C0DFC2FFC45ECAF8CCF4CEFBE6 | ||||
| :4007C000D608D808E010E280E644EE820002012F020103800402060107070A060B200C020E010FC81002120114071528174218021A011B101C021E012121220523082544DD | ||||
| :400800002607272829212A012C0731E03207331F3B023E04580459045C905F0182698502861988198E198F119019924493049419962298229A199B089C19A20EA306A61923 | ||||
| :40084000A702A910AA19AB01AD01AE19AF10B070B208B301B407B510B607B70EB928BAA2BB80BE04BF14D804D904DB04DC99DF010082012402400521060207200810094941 | ||||
| :400880000B200C020D090E010F04104213141514164017801A201C821D011E281F012010210423C025442680270829202A082B402C802F1A30803108329034483614378162 | ||||
| :4008C000390A3B503D403F046D408C10C0FFC2FFC4FFCAF7CCA6CE5FE210010E04080508060409080C0D0E020F08110812091504180819081A021D081E04200423012702A7 | ||||
| :4009000029082D08300C320C330F34033A0A3F045608580459045B045C095D905F01801382048402871088028B1F8C088E018F1F901991019202951F96099A089B049C0273 | ||||
| :400940009D1FA001A20CA308A602A720A802AB02AC1BAD1FB210B40FB73FBB80BE14D804D904DC90DF010108021104020540060807200A040B810D110F2211021405161004 | ||||
| :400980001702190A1A041E201F20210425402680270229442A212C802E202F2130803120320433113545371039163A803B033D843F2058806002680D6A508101821084A1C0 | ||||
| :4009C000880289028B048E5090029134922893859508980599459AA99B219C229D0AA080A121A311A40CA690AA88AD80AF10B111B504B648C0F5C2FBC4F8CAFFCCFFCE7FAE | ||||
| :400A0000D608D808E248E401E602E809EE030001062008010A7E0D010E08107F167F1A041E1020022101247E26012A402C7F3501367F3B303E40580459045B045C905F0179 | ||||
| :400A4000804484118708881189078C078E088F109211941195A5974298119B429C119F21A011A307A433A5C6A644A721A878AA02AC20AD84AE02B3E0B51FB67FB71FB9A0BC | ||||
| :400A8000BE40C004C5E0C6C0C80AC9FFCAFFCBFFD004D601D804D904DA04DB04DC90DD09DF01E2C001160201030204020540071409A80B400C810D200F2010041141130440 | ||||
| :400AC00015A016A019801F80214023152510270428222B402F8030083250384039083B103D8041014B025210688069756B116C016E406F02705071E972A07348810A8204C4 | ||||
| :400B00008404850487048A108C509040910292A8938094A295A496409733980199049B209C269D0A9EB89F18A141A351A484A530A68CA808B210B540C0FFC2FFC4FFCA8B79 | ||||
| :400B4000CC0ECE1ED001E003E208E402EA40EE060601083109100D0C0E080F021040130116021702180319011A101E0420382304240325082608290A2B042C022E2130400E | ||||
| :400B8000310F3207351036383A803E013F10580459045B045C995F018001830C8401870188018A028B078C018F019001930194019701980199079E019F01A001A108A302BA | ||||
| :400BC000A601A701A801AB01AC01AE02AF01B507B603B708BE40BF50D804D904DF0100820201032A05480608081909800B400D080E461002128013241501174818011D4E2B | ||||
| :400C00001E01218022102408260228082BA22C082E022F103011328436063710380239A83D103F806D5080048280850186058C208D01900291A89248934494019620981A26 | ||||
| :400C40009A029B609C809D20A043A284A328AB80B604C0EFC2FFC4BFCAEFCCEFCE3FE080E451E8C0EE02000801010201050108040B010C010D010E081101130217011901F5 | ||||
| :400C80001A011D01210123022401250129012A022D01300332043303340836083A023E543F0440434502480149FF4AFF4BFF4D204EF05110580459045A045C095D095F017F | ||||
| :400CC0006108624063406480664067408004840885CC86018722881F8C048D01900493119401961E9722980499F19C019E10A004A344A588A604A824A9AAAA19AB44AC0134 | ||||
| :400D0000AE22B020B30FB50EB61FB7F0BE41BF10D804D90BDC90DF01002001020301058907080B040C200D090E011010120816801764181019221A0A1B801D021E0222083E | ||||
| :400D400025602711280929022B202C082E022F10301232843606371039A83A013D884010410248107C0283408520881089088B308C088D448F4091EA920193049602972033 | ||||
| :400D8000981B99819A839B0C9D209F10A022A108A286A320A408A601A7C0A904AB04AD01AE01B080B18AB608B708C0FBC2F2C4F6CAEFCCEFCE5FD003DE80E0A0E240E47094 | ||||
| :400DC000E602E890ECC01B011F0231203302368037083B40C630CCF0CE103088364037043A023C2088108F0893809F08A520AE80AF41B340CCF0CE60EE4053405640840897 | ||||
| :400E00008C8093809A409E029F04A488A520A6C0B2C0D460E2408E0292029E02A520A6C0AB04AE01EA80EE4015027B02C404DC015940670882108E4191029720AF10B7020E | ||||
| :400E4000D401D801E008E602EC021A4085408D049102966097289D40A201C608E60209440F4191029420962097299C409D40A201A544A810AB01B040C20FEA0126809202EF | ||||
| :400E8000A320A520A680AE40B720C820EE405280572079407E01828085208D409202A320A520D460DC80DE20E210E62004200A200C400F401F1050805B405E025F8083408D | ||||
| :400EC000894091029420962097209C409D40A201AF40B304C001C20DC601D405D605E001E801850188809102A480B3C0E401EA04EC04010109010B010D010F0111011B01BF | ||||
| :400F00001D0100FF01AB020211050000BF0000A09F001F000000000000000000100000004000000000000000C0000000FF0000B847004700000100008000000282008200D5 | ||||
| :400F400000000000000303000300000027001801270018010004000000050000000000000000000000000000000000000000000000000000000000000000000000000000DF | ||||
| :400F80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031 | ||||
| :400FC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F1 | ||||
| :4010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0 | ||||
| :401040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070 | ||||
| @@ -4615,12 +4615,12 @@ | ||||
| :0200000490105A | ||||
| :04000000BC90ACAF55 | ||||
| :0200000490303A | ||||
| :0200000001A954 | ||||
| :02000000A35308 | ||||
| :0200000490402A | ||||
| :4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C0 | ||||
| :400040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080 | ||||
| :400080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040 | ||||
| :4000C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | ||||
| :0200000490501A | ||||
| :0C00000000012E16106900002E301212B4 | ||||
| :0C00000000012E16106900002E31B3BC68 | ||||
| :00000001FF | ||||
| @@ -20,33 +20,34 @@ module FIFOout ( | ||||
| wire [7:0] po; | ||||
| assign d = po; | ||||
|  | ||||
| localparam STATE_WAIT = 1'b0; | ||||
| localparam STATE_READ = 1'b1; | ||||
| localparam STATE_WAITFORREQ = 0; | ||||
| localparam STATE_READFROMFIFO = 1; | ||||
| localparam STATE_WAITFORNREQ = 2; | ||||
|  | ||||
| reg state; | ||||
| reg oldreq; | ||||
| reg [1:0] state; | ||||
| wire readfromfifo; | ||||
|  | ||||
| assign ack = (state != STATE_READ); | ||||
| assign ack = (state == STATE_WAITFORNREQ); | ||||
| assign readfromfifo = (state == STATE_READFROMFIFO); | ||||
|  | ||||
| always @(posedge clk) | ||||
| begin | ||||
|     case (state) | ||||
|         STATE_WAIT: | ||||
|         /* opcode is not valid; req is low; wait for req to go high. */ | ||||
|         STATE_WAITFORREQ: | ||||
|         begin | ||||
|             if (!empty) | ||||
|             begin | ||||
|                 if (req && !oldreq) | ||||
|                 begin | ||||
|                     state <= STATE_READ; | ||||
|                 end | ||||
|                 oldreq <= req; | ||||
|             end | ||||
|             if (!empty && req) | ||||
|                 state <= STATE_READFROMFIFO; | ||||
|         end | ||||
|          | ||||
|         STATE_READ: | ||||
|         begin | ||||
|             state <= STATE_WAIT; | ||||
|         end | ||||
|         /* Fetch a single value from the FIFO. */ | ||||
|         STATE_READFROMFIFO: | ||||
|             state <= STATE_WAITFORNREQ; | ||||
|              | ||||
|         /* opcode is valid; ack is high. Wait for req to go low. */ | ||||
|         STATE_WAITFORNREQ: | ||||
|             if (!req) | ||||
|                 state <= STATE_WAITFORREQ; | ||||
|     endcase | ||||
| end | ||||
|              | ||||
| @@ -55,11 +56,11 @@ cy_psoc3_dp #(.cy_dpconfig( | ||||
|     `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, | ||||
|     `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, | ||||
|     `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, | ||||
|     `CS_CMP_SEL_CFGA, /*CFGRAM0: STATE_WAITFORREQ*/ | ||||
|     `CS_CMP_SEL_CFGA, /*CFGRAM0: idle */ | ||||
|     `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, | ||||
|     `CS_SHFT_OP_PASS, `CS_A0_SRC___F0, `CS_A1_SRC_NONE, | ||||
|     `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, | ||||
|     `CS_CMP_SEL_CFGA, /*CFGRAM1: STATE_LOAD*/ | ||||
|     `CS_CMP_SEL_CFGA, /*CFGRAM1: read from fifo */ | ||||
|     `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, | ||||
|     `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, | ||||
|     `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, | ||||
| @@ -102,7 +103,7 @@ cy_psoc3_dp #(.cy_dpconfig( | ||||
| )) dp( | ||||
|         /*  input                   */  .reset(1'b0), | ||||
|         /*  input                   */  .clk(clk), | ||||
|         /*  input   [02:00]         */  .cs_addr({2'b0, state}), | ||||
|         /*  input   [02:00]         */  .cs_addr({2'b0, readfromfifo}), | ||||
|         /*  input                   */  .route_si(1'b0), | ||||
|         /*  input                   */  .route_ci(1'b0), | ||||
|         /*  input                   */  .f0_load(1'b0), | ||||
|   | ||||
| @@ -851,6 +851,7 @@ | ||||
|       <Data key="4a398466-709f-4228-9500-96178658e13e" value="RDATA" /> | ||||
|       <Data key="5a3407c1-b434-4438-a7b4-b9dfd2280495" value="MOTEA" /> | ||||
|       <Data key="8d318d8b-cf7b-4b6b-b02c-ab1c5c49d0ba" value="SW1" /> | ||||
|       <Data key="8fc20a4f-e4d1-44b3-a5d4-546e8628d61e" value="LED" /> | ||||
|       <Data key="12e00eac-69b5-4717-85c8-25ef6b224d4c" value="DEBUG_PINS" /> | ||||
|       <Data key="41e2d8ed-5494-4d8c-8ff7-f4f789cece51" value="REDWC" /> | ||||
|       <Data key="264be2d3-9481-494b-8d9c-c1905a45e9cc" value="FDD" /> | ||||
| @@ -3977,6 +3978,11 @@ | ||||
|         <Data key="Port Format" value="2,2" /> | ||||
|       </Group> | ||||
|     </Group> | ||||
|     <Group key="8fc20a4f-e4d1-44b3-a5d4-546e8628d61e"> | ||||
|       <Group key="0"> | ||||
|         <Data key="Port Format" value="2,1" /> | ||||
|       </Group> | ||||
|     </Group> | ||||
|     <Group key="12e00eac-69b5-4717-85c8-25ef6b224d4c"> | ||||
|       <Group key="0"> | ||||
|         <Data key="Port Format" value="2,2" /> | ||||
|   | ||||
| @@ -1533,20 +1533,20 @@ | ||||
| <CyGuid_ebc4f06d-207f-49c2-a540-72acf4adabc0 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFolderSerialize" version="3"> | ||||
| <CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtBaseContainerSerialize" version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="USBFS_ep4" persistent=""> | ||||
| <Hidden v="True" /> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <CyGuid_0820c2e7-528d-4137-9a08-97257b946089 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemListSerialize" version="2"> | ||||
| <dependencies> | ||||
| <CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="USBFS_ep4_dma.c" persistent="Generated_Source\PSoC5\USBFS_ep4_dma.c"> | ||||
| <Hidden v="True" /> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <build_action v="SOURCE_C;CortexM3;;;" /> | ||||
| <PropertyDeltas /> | ||||
| </CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b> | ||||
| <CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="USBFS_ep4_dma.h" persistent="Generated_Source\PSoC5\USBFS_ep4_dma.h"> | ||||
| <Hidden v="True" /> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <build_action v="HEADER;;;;" /> | ||||
| <PropertyDeltas /> | ||||
| @@ -1559,20 +1559,20 @@ | ||||
| <CyGuid_ebc4f06d-207f-49c2-a540-72acf4adabc0 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFolderSerialize" version="3"> | ||||
| <CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtBaseContainerSerialize" version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="USBFS_ep3" persistent=""> | ||||
| <Hidden v="True" /> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <CyGuid_0820c2e7-528d-4137-9a08-97257b946089 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemListSerialize" version="2"> | ||||
| <dependencies> | ||||
| <CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="USBFS_ep3_dma.c" persistent="Generated_Source\PSoC5\USBFS_ep3_dma.c"> | ||||
| <Hidden v="True" /> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <build_action v="SOURCE_C;CortexM3;;;" /> | ||||
| <PropertyDeltas /> | ||||
| </CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b> | ||||
| <CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="USBFS_ep3_dma.h" persistent="Generated_Source\PSoC5\USBFS_ep3_dma.h"> | ||||
| <Hidden v="True" /> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <build_action v="HEADER;;;;" /> | ||||
| <PropertyDeltas /> | ||||
| @@ -1585,20 +1585,20 @@ | ||||
| <CyGuid_ebc4f06d-207f-49c2-a540-72acf4adabc0 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFolderSerialize" version="3"> | ||||
| <CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtBaseContainerSerialize" version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="USBFS_ep2" persistent=""> | ||||
| <Hidden v="True" /> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <CyGuid_0820c2e7-528d-4137-9a08-97257b946089 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemListSerialize" version="2"> | ||||
| <dependencies> | ||||
| <CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="USBFS_ep2_dma.c" persistent="Generated_Source\PSoC5\USBFS_ep2_dma.c"> | ||||
| <Hidden v="True" /> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <build_action v="SOURCE_C;CortexM3;;;" /> | ||||
| <PropertyDeltas /> | ||||
| </CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b> | ||||
| <CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="USBFS_ep2_dma.h" persistent="Generated_Source\PSoC5\USBFS_ep2_dma.h"> | ||||
| <Hidden v="True" /> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <build_action v="HEADER;;;;" /> | ||||
| <PropertyDeltas /> | ||||
| @@ -1611,20 +1611,20 @@ | ||||
| <CyGuid_ebc4f06d-207f-49c2-a540-72acf4adabc0 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFolderSerialize" version="3"> | ||||
| <CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtBaseContainerSerialize" version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="USBFS_ep1" persistent=""> | ||||
| <Hidden v="True" /> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <CyGuid_0820c2e7-528d-4137-9a08-97257b946089 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemListSerialize" version="2"> | ||||
| <dependencies> | ||||
| <CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="USBFS_ep1_dma.c" persistent="Generated_Source\PSoC5\USBFS_ep1_dma.c"> | ||||
| <Hidden v="True" /> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <build_action v="SOURCE_C;CortexM3;;;" /> | ||||
| <PropertyDeltas /> | ||||
| </CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b> | ||||
| <CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="USBFS_ep1_dma.h" persistent="Generated_Source\PSoC5\USBFS_ep1_dma.h"> | ||||
| <Hidden v="True" /> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <build_action v="HEADER;;;;" /> | ||||
| <PropertyDeltas /> | ||||
| @@ -2762,6 +2762,39 @@ | ||||
| </CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8> | ||||
| <filters /> | ||||
| </CyGuid_ebc4f06d-207f-49c2-a540-72acf4adabc0> | ||||
| <CyGuid_ebc4f06d-207f-49c2-a540-72acf4adabc0 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFolderSerialize" version="3"> | ||||
| <CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtBaseContainerSerialize" version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="LED" persistent=""> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <CyGuid_0820c2e7-528d-4137-9a08-97257b946089 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemListSerialize" version="2"> | ||||
| <dependencies> | ||||
| <CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="LED_aliases.h" persistent="Generated_Source\PSoC5\LED_aliases.h"> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <build_action v="HEADER;;;;" /> | ||||
| <PropertyDeltas /> | ||||
| </CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b> | ||||
| <CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="LED.c" persistent="Generated_Source\PSoC5\LED.c"> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <build_action v="SOURCE_C;CortexM3;;;" /> | ||||
| <PropertyDeltas /> | ||||
| </CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b> | ||||
| <CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1"> | ||||
| <CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="LED.h" persistent="Generated_Source\PSoC5\LED.h"> | ||||
| <Hidden v="False" /> | ||||
| </CyGuid_31768f72-0253-412b-af77-e7dba74d1330> | ||||
| <build_action v="HEADER;;;;" /> | ||||
| <PropertyDeltas /> | ||||
| </CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b> | ||||
| </dependencies> | ||||
| </CyGuid_0820c2e7-528d-4137-9a08-97257b946089> | ||||
| </CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8> | ||||
| <filters /> | ||||
| </CyGuid_ebc4f06d-207f-49c2-a540-72acf4adabc0> | ||||
| </dependencies> | ||||
| </CyGuid_0820c2e7-528d-4137-9a08-97257b946089> | ||||
| </CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8> | ||||
| @@ -3347,6 +3380,6 @@ | ||||
| </ignored_deps> | ||||
| </CyGuid_495451fe-d201-4d01-b22d-5d3f5609ac37> | ||||
| <boot_component v="" /> | ||||
| <current_generation v="114" /> | ||||
| <current_generation v="138" /> | ||||
| </CyGuid_fec8f9e8-2365-4bdb-96d3-a4380222e01b> | ||||
| </CyXmlSerializer> | ||||
| @@ -21,27 +21,10 @@ module Sampler ( | ||||
|  | ||||
| localparam STATE_RESET = 0; | ||||
| localparam STATE_WAITING = 1; | ||||
| localparam STATE_INTERVAL = 2; | ||||
| localparam STATE_DISPATCH = 3; | ||||
| localparam STATE_OPCODE = 4; | ||||
| localparam STATE_COUNTING = 5; | ||||
| localparam STATE_OPCODE = 2; | ||||
|  | ||||
| reg [2:0] state; | ||||
| wire [6:0] counter; | ||||
|  | ||||
| wire countnow; | ||||
| assign countnow = (state == STATE_COUNTING); | ||||
|  | ||||
| wire counterreset; | ||||
| assign counterreset = (state == STATE_INTERVAL) || (state == STATE_OPCODE); | ||||
|  | ||||
| SuperCounter #(.Delta(1), .ResetValue(0)) Counter | ||||
| ( | ||||
|     /* input */ .clk(clock), | ||||
|     /* input */ .reset(counterreset), | ||||
|     /* input */ .count(countnow), | ||||
|     /* output */ .d(counter) | ||||
| ); | ||||
| reg [1:0] state; | ||||
| reg [6:0] counter; | ||||
|  | ||||
| reg oldsampleclock; | ||||
| wire sampleclocked; | ||||
| @@ -55,7 +38,7 @@ wire rdataed; | ||||
| reg oldrdata; | ||||
| assign rdataed = !oldrdata && rdata; | ||||
|  | ||||
| assign req = (state == STATE_INTERVAL) || (state == STATE_OPCODE); | ||||
| assign req = (state == STATE_OPCODE); | ||||
|  | ||||
| always @(posedge clock) | ||||
| begin | ||||
| @@ -66,6 +49,7 @@ begin | ||||
|         oldsampleclock <= 0; | ||||
|         oldindex <= 0; | ||||
|         oldrdata <= 0; | ||||
|         counter <= 0; | ||||
|     end | ||||
|     else | ||||
|         case (state) | ||||
| @@ -74,10 +58,23 @@ begin | ||||
|              | ||||
|             STATE_WAITING: | ||||
|             begin | ||||
|                 if (rdataed || indexed) | ||||
|                 /* If something has happened, emit any necessary interval byte. */ | ||||
|                 if ((rdataed || indexed) && (counter != 0)) | ||||
|                 begin | ||||
|                     opcode <= {0, counter}; | ||||
|                     state <= STATE_INTERVAL; | ||||
|                     state <= STATE_OPCODE; | ||||
|                 end | ||||
|                 else if (indexed) | ||||
|                 begin | ||||
|                     oldindex <= 1; | ||||
|                     opcode <= 8'h81; | ||||
|                     state <= STATE_OPCODE; | ||||
|                 end | ||||
|                 else if (rdataed) | ||||
|                 begin | ||||
|                     oldrdata <= 1; | ||||
|                     opcode <= 8'h80; | ||||
|                     state <= STATE_OPCODE; | ||||
|                 end | ||||
|                 else if (sampleclocked) | ||||
|                 begin | ||||
| @@ -87,10 +84,11 @@ begin | ||||
|                         opcode <= {0, counter}; | ||||
|                         state <= STATE_OPCODE; | ||||
|                     end | ||||
|                     else | ||||
|                         state <= STATE_COUNTING; | ||||
|                     counter <= counter + 1; | ||||
|                 end | ||||
|                  | ||||
|                 /* Reset state once we've done the thing. */ | ||||
|                  | ||||
|                 if (oldrdata && !rdata) | ||||
|                     oldrdata <= 0; | ||||
|                 if (oldindex && !index) | ||||
| @@ -99,32 +97,11 @@ begin | ||||
|                     oldsampleclock <= 0; | ||||
|             end | ||||
|              | ||||
|             STATE_INTERVAL: /* interval byte sent here; counter reset */ | ||||
|                 state <= STATE_DISPATCH; | ||||
|                  | ||||
|             STATE_DISPATCH: /* relax after interval byte, dispatch for opcode */ | ||||
|             STATE_OPCODE: /* opcode or interval byte sent here */ | ||||
|             begin | ||||
|                 if (rdataed) | ||||
|                 begin | ||||
|                     oldrdata <= 1; | ||||
|                     opcode <= 8'h80; | ||||
|                     state <= STATE_OPCODE; | ||||
|                 end | ||||
|                 else if (indexed) | ||||
|                 begin | ||||
|                     oldindex <= 1; | ||||
|                     opcode <= 8'h81; | ||||
|                     state <= STATE_OPCODE; | ||||
|                 end | ||||
|                 else | ||||
|                     state <= STATE_WAITING; | ||||
|                 state <= STATE_WAITING; | ||||
|                 counter <= 0; | ||||
|             end | ||||
|              | ||||
|             STATE_OPCODE: /* opcode byte sent here */ | ||||
|                 state <= STATE_WAITING; | ||||
|                              | ||||
|             STATE_COUNTING: /* counter changes here */ | ||||
|                 state <= STATE_WAITING; | ||||
|         endcase | ||||
| end | ||||
|  | ||||
|   | ||||
| @@ -18,19 +18,18 @@ module Sequencer ( | ||||
|  | ||||
| //`#start body` -- edit after this line, do not edit this line | ||||
|  | ||||
| localparam STATE_IDLE = 0; | ||||
| localparam STATE_LOAD = 1; | ||||
| localparam STATE_WAITING = 2; | ||||
| localparam STATE_PULSING = 3; | ||||
| localparam STATE_INDEXING = 4; | ||||
| localparam STATE_LOAD = 0; | ||||
| localparam STATE_WAITING = 1; | ||||
| localparam STATE_PULSING = 2; | ||||
| localparam STATE_INDEXING = 3; | ||||
|  | ||||
| localparam OPCODE_PULSE = 8'h80; | ||||
| localparam OPCODE_INDEX = 8'h81; | ||||
|  | ||||
| reg [2:0] state; | ||||
| reg [1:0] state; | ||||
| reg [6:0] countdown; | ||||
|  | ||||
| assign req = (state == STATE_LOAD); | ||||
| assign req = (!reset && (state == STATE_LOAD)); | ||||
| assign wdata = (state == STATE_PULSING); | ||||
| assign debug_state = state; | ||||
|  | ||||
| @@ -40,9 +39,7 @@ always @(posedge clock) olddataclock <= dataclock; | ||||
| assign dataclocked = !olddataclock && dataclock; | ||||
|  | ||||
| reg oldsampleclock; | ||||
| wire sampleclocked; | ||||
| always @(posedge clock) oldsampleclock <= sampleclock; | ||||
| assign sampleclocked = !oldsampleclock && sampleclock; | ||||
| reg sampleclocked; | ||||
|  | ||||
| reg oldindex; | ||||
| wire indexed; | ||||
| @@ -53,15 +50,19 @@ always @(posedge clock) | ||||
| begin | ||||
|     if (reset) | ||||
|     begin | ||||
|         state <= STATE_IDLE; | ||||
|         state <= STATE_LOAD; | ||||
|         countdown <= 0; | ||||
|     end | ||||
|     else | ||||
|     begin | ||||
|         if (!oldsampleclock && sampleclock) | ||||
|             sampleclocked <= 1; | ||||
|         oldsampleclock <= sampleclock; | ||||
|          | ||||
|         case (state) | ||||
|             STATE_IDLE: | ||||
|                 state <= STATE_LOAD; | ||||
|              | ||||
|             STATE_LOAD: | ||||
|                 /* Wait for a posedge on dataclocked, indicating an opcode has | ||||
|                  * arrived. */ | ||||
|                 if (dataclocked) | ||||
|                     case (opcode) | ||||
|                         OPCODE_PULSE: | ||||
| @@ -80,10 +81,12 @@ begin | ||||
|             STATE_WAITING: | ||||
|                 if (sampleclocked) | ||||
|                 begin | ||||
|                     if (countdown == 0) | ||||
|                     sampleclocked <= 0; | ||||
|                     countdown <= countdown - 1; | ||||
|                     /* Nasty fudge factor here to account for one to two | ||||
|                      * sample ticks lost per pulse. */ | ||||
|                     if (countdown <= 2) | ||||
|                         state <= STATE_LOAD; | ||||
|                     else | ||||
|                         countdown <= countdown - 1; | ||||
|                 end | ||||
|              | ||||
|             STATE_PULSING: | ||||
| @@ -92,9 +95,8 @@ begin | ||||
|             STATE_INDEXING: | ||||
|                 if (indexed) | ||||
|                     state <= STATE_LOAD; | ||||
|                 else | ||||
|                     state <= STATE_INDEXING; | ||||
|         endcase | ||||
|     end | ||||
| end | ||||
|  | ||||
| //`#end` -- edit above this line, do not edit this line | ||||
|   | ||||
										
											Binary file not shown.
										
									
								
							| @@ -26,11 +26,12 @@ static bool homed = false; | ||||
| static int current_track = 0; | ||||
| static struct set_drive_frame current_drive_flags; | ||||
|  | ||||
| #define BUFFER_COUNT 16 | ||||
| #define BUFFER_COUNT 64 /* the maximum */ | ||||
| #define BUFFER_SIZE 64 | ||||
| static uint8_t td[BUFFER_COUNT]; | ||||
| static uint8_t dma_buffer[BUFFER_COUNT][BUFFER_SIZE] __attribute__((aligned())); | ||||
| static uint8_t usb_buffer[BUFFER_SIZE] __attribute__((aligned())); | ||||
| static uint8_t xfer_buffer[BUFFER_SIZE] __attribute__((aligned())); | ||||
| static uint8_t dma_channel; | ||||
| #define NEXT_BUFFER(b) (((b)+1) % BUFFER_COUNT) | ||||
|  | ||||
| @@ -278,12 +279,14 @@ static void cmd_measure_speed(struct any_frame* f) | ||||
|     send_reply((struct any_frame*) &r);     | ||||
| } | ||||
|  | ||||
| static void cmd_bulk_test(struct any_frame* f) | ||||
| static void cmd_bulk_write_test(struct any_frame* f) | ||||
| { | ||||
|     uint8_t buffer[64]; | ||||
|      | ||||
|     wait_until_writeable(FLUXENGINE_DATA_IN_EP_NUM); | ||||
|     for (int x=0; x<64; x++) | ||||
|     { | ||||
|         CyWdtClear(); | ||||
|         for (int y=0; y<256; y++) | ||||
|         { | ||||
|             for (unsigned z=0; z<sizeof(buffer); z++) | ||||
| @@ -292,11 +295,50 @@ static void cmd_bulk_test(struct any_frame* f) | ||||
|             wait_until_writeable(FLUXENGINE_DATA_IN_EP_NUM); | ||||
|             USBFS_LoadInEP(FLUXENGINE_DATA_IN_EP_NUM, buffer, sizeof(buffer)); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     DECLARE_REPLY_FRAME(struct any_frame, F_FRAME_BULK_TEST_REPLY); | ||||
|     DECLARE_REPLY_FRAME(struct any_frame, F_FRAME_BULK_WRITE_TEST_REPLY); | ||||
|     send_reply(&r); | ||||
| } | ||||
|  | ||||
| static void cmd_bulk_read_test(struct any_frame* f) | ||||
| { | ||||
|     uint8_t buffer[64]; | ||||
|      | ||||
|     bool passed = true; | ||||
|     for (int x=0; x<64; x++) | ||||
|     { | ||||
|         CyWdtClear(); | ||||
|         for (int y=0; y<256; y++) | ||||
|         { | ||||
|             USBFS_EnableOutEP(FLUXENGINE_DATA_OUT_EP_NUM); | ||||
|             while (USBFS_GetEPState(FLUXENGINE_DATA_OUT_EP_NUM) != USBFS_OUT_BUFFER_FULL) | ||||
|                 ; | ||||
|             USBFS_ReadOutEP(FLUXENGINE_DATA_OUT_EP_NUM, buffer, sizeof(buffer)); | ||||
|             while (USBFS_GetEPState(FLUXENGINE_DATA_OUT_EP_NUM) != USBFS_OUT_BUFFER_EMPTY) | ||||
|                 ; | ||||
|              | ||||
|             for (unsigned z=0; z<sizeof(buffer); z++) | ||||
|             { | ||||
|                 if (buffer[z] != (uint8)(x+y+z)) | ||||
|                 { | ||||
|                     print("fail %d+%d+%d == %d, not %d", x, y, z, buffer[z], (uint8)(x+y+z)); | ||||
|                     passed = false; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     print("passed=%d", passed); | ||||
|     if (passed) | ||||
|     { | ||||
|         DECLARE_REPLY_FRAME(struct any_frame, F_FRAME_BULK_READ_TEST_REPLY); | ||||
|         send_reply(&r); | ||||
|     } | ||||
|     else | ||||
|         send_error(F_ERROR_INVALID_VALUE); | ||||
| } | ||||
|  | ||||
| static void deinit_dma(void) | ||||
| { | ||||
|     for (int i=0; i<BUFFER_COUNT; i++) | ||||
| @@ -334,7 +376,7 @@ static void cmd_read(struct read_frame* f) | ||||
|      | ||||
|     { | ||||
|         uint8_t i = CyEnterCriticalSection(); | ||||
|         SAMPLER_FIFO_SET_LEVEL_MID; | ||||
|         SAMPLER_FIFO_SET_LEVEL_NORMAL; | ||||
|         SAMPLER_FIFO_CLEAR; | ||||
|         SAMPLER_FIFO_SINGLE_BUFFER_UNSET; | ||||
|         CyExitCriticalSection(i); | ||||
| @@ -354,7 +396,7 @@ static void cmd_read(struct read_frame* f) | ||||
|     } | ||||
|      | ||||
|     crunch_state_t cs = {}; | ||||
|     cs.outputptr = usb_buffer; | ||||
|     cs.outputptr = xfer_buffer; | ||||
|     cs.outputlen = BUFFER_SIZE; | ||||
|      | ||||
|     dma_writing_to_td = 0; | ||||
| @@ -371,53 +413,74 @@ static void cmd_read(struct read_frame* f) | ||||
|     while (dma_writing_to_td == 0) | ||||
|         ; | ||||
|     dma_reading_from_td = 0; | ||||
|     bool dma_running = true; | ||||
|      | ||||
|     /* Start transferring. */ | ||||
|  | ||||
|     uint32_t start_time = clock; | ||||
|     while (!dma_underrun) | ||||
|     for (;;) | ||||
|     { | ||||
|         CyWdtClear(); | ||||
|  | ||||
|         /* Wait for the next block to be read. */ | ||||
|         while (dma_reading_from_td == dma_writing_to_td) | ||||
|         /* If the sample session is over, stop reading but continue processing until | ||||
|          * the DMA chain is empty. */ | ||||
|          | ||||
|         if ((clock - start_time) >= f->milliseconds) | ||||
|         { | ||||
|             /* On an underrun, give up immediately. */ | ||||
|             if (dma_underrun) | ||||
|                 goto abort; | ||||
|              | ||||
|             /* Also finish if the sample session is over. */ | ||||
|             if ((clock - start_time) >= f->milliseconds) | ||||
|                 goto abort; | ||||
|         } | ||||
|  | ||||
|         uint8_t dma_buffer_usage = 0; | ||||
|         while (dma_buffer_usage < BUFFER_SIZE) | ||||
|         { | ||||
|             cs.inputptr = dma_buffer[dma_reading_from_td] + dma_buffer_usage; | ||||
|             cs.inputlen = BUFFER_SIZE - dma_buffer_usage; | ||||
|             crunch(&cs); | ||||
|             dma_buffer_usage += BUFFER_SIZE - cs.inputlen; | ||||
|             count++; | ||||
|              | ||||
|             /* If there is no available space in the output buffer, flush the buffer via | ||||
|              * USB and go again. */ | ||||
|             if (cs.outputlen == 0) | ||||
|             if (dma_running) | ||||
|             { | ||||
|                 wait_until_writeable(FLUXENGINE_DATA_IN_EP_NUM); | ||||
|                 USBFS_LoadInEP(FLUXENGINE_DATA_IN_EP_NUM, usb_buffer, BUFFER_SIZE); | ||||
|                  | ||||
|                 cs.outputptr = usb_buffer; | ||||
|                 cs.outputlen = BUFFER_SIZE; | ||||
|                 CyDmaChSetRequest(dma_channel, CY_DMA_CPU_TERM_CHAIN); | ||||
|                 while (CyDmaChGetRequest(dma_channel)) | ||||
|                     ; | ||||
|                 dma_running = false; | ||||
|                 dma_underrun = false; | ||||
|             } | ||||
|         } | ||||
|         dma_reading_from_td = NEXT_BUFFER(dma_reading_from_td); | ||||
|          | ||||
|         /* If there's an underrun event, stop immediately. */ | ||||
|          | ||||
|         if (dma_underrun) | ||||
|             goto abort; | ||||
|          | ||||
|         /* If there are no more blocks to be read, check to see if we've finished. */ | ||||
|          | ||||
|         if (dma_reading_from_td == dma_writing_to_td) | ||||
|         { | ||||
|             /* Also if we've run out of blocks to send. */ | ||||
|              | ||||
|             if (!dma_running) | ||||
|                 goto abort; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             /* Otherwise, there's a block waiting, so attempt to send it. */ | ||||
|              | ||||
|             uint8_t dma_buffer_usage = 0; | ||||
|             while (dma_buffer_usage < BUFFER_SIZE) | ||||
|             { | ||||
|                 cs.inputptr = dma_buffer[dma_reading_from_td] + dma_buffer_usage; | ||||
|                 cs.inputlen = BUFFER_SIZE - dma_buffer_usage; | ||||
|                 crunch(&cs); | ||||
|                 dma_buffer_usage += BUFFER_SIZE - cs.inputlen; | ||||
|                 count++; | ||||
|                  | ||||
|                 /* If there is no available space in the output buffer, flush the buffer via | ||||
|                  * USB and go again. */ | ||||
|                 if (cs.outputlen == 0) | ||||
|                 { | ||||
|                     wait_until_writeable(FLUXENGINE_DATA_IN_EP_NUM); | ||||
|                     memcpy(usb_buffer, xfer_buffer, FRAME_SIZE); | ||||
|                     USBFS_LoadInEP(FLUXENGINE_DATA_IN_EP_NUM, usb_buffer, BUFFER_SIZE); | ||||
|                      | ||||
|                     cs.outputptr = xfer_buffer; | ||||
|                     cs.outputlen = BUFFER_SIZE; | ||||
|                 } | ||||
|             } | ||||
|             dma_reading_from_td = NEXT_BUFFER(dma_reading_from_td); | ||||
|         } | ||||
|     } | ||||
| abort:; | ||||
|     bool saved_dma_underrun = dma_underrun; | ||||
|     CyDmaChSetRequest(dma_channel, CY_DMA_CPU_TERM_CHAIN); | ||||
|     while (CyDmaChGetRequest(dma_channel)) | ||||
|         ; | ||||
|  | ||||
|     donecrunch(&cs); | ||||
|     wait_until_writeable(FLUXENGINE_DATA_IN_EP_NUM); | ||||
| @@ -490,7 +553,7 @@ static void cmd_write(struct write_frame* f) | ||||
|     SIDE_REG_Write(f->side); | ||||
|     { | ||||
|         uint8_t i = CyEnterCriticalSection();         | ||||
|         REPLAY_FIFO_SET_LEVEL_NORMAL; | ||||
|         REPLAY_FIFO_SET_LEVEL_MID; | ||||
|         REPLAY_FIFO_CLEAR; | ||||
|         REPLAY_FIFO_SINGLE_BUFFER_UNSET; | ||||
|         CyExitCriticalSection(i); | ||||
| @@ -503,6 +566,7 @@ static void cmd_write(struct write_frame* f) | ||||
|     int packets = f->bytes_to_write / FRAME_SIZE; | ||||
|     int count_written = 0; | ||||
|     int count_read = 0; | ||||
|     int packetwaiting = 0; | ||||
|     dma_writing_to_td = 0; | ||||
|     dma_reading_from_td = -1; | ||||
|     dma_underrun = false; | ||||
| @@ -516,6 +580,20 @@ static void cmd_write(struct write_frame* f) | ||||
|     { | ||||
|         CyWdtClear(); | ||||
|  | ||||
|         /* Make sure that we always have a USB read in progress whenever possible. */ | ||||
|          | ||||
|         if (!finished && !packetwaiting) | ||||
|         { | ||||
|             /* There is no read in progress; has data arrived in the external USB buffer? */ | ||||
|              | ||||
|             if (USBFS_GetEPState(FLUXENGINE_DATA_OUT_EP_NUM) == USBFS_OUT_BUFFER_FULL) | ||||
|             { | ||||
|                 /* Yes, data has arrived, so initiate the copy. */ | ||||
|                  | ||||
|                 packetwaiting = USBFS_ReadOutEP(FLUXENGINE_DATA_OUT_EP_NUM, usb_buffer, FRAME_SIZE); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         /* Read data from USB into the buffers. */ | ||||
|          | ||||
|         if (NEXT_BUFFER(dma_writing_to_td) != dma_reading_from_td) | ||||
| @@ -532,26 +610,33 @@ static void cmd_write(struct write_frame* f) | ||||
|                     /* There's no more data to read, so fake some. */ | ||||
|                      | ||||
|                     for (int i=0; i<BUFFER_SIZE; i++) | ||||
|                         usb_buffer[i+0] = 0x7f; | ||||
|                     cs.inputptr = usb_buffer; | ||||
|                         xfer_buffer[i+0] = 0x7f; | ||||
|                     cs.inputptr = xfer_buffer; | ||||
|                     cs.inputlen = BUFFER_SIZE; | ||||
|                 } | ||||
|                 else | ||||
|                 else if (packetwaiting) | ||||
|                 { | ||||
|                     while (USBFS_GetEPState(FLUXENGINE_DATA_OUT_EP_NUM) != USBFS_OUT_BUFFER_FULL) | ||||
|                     /* There's a USB read into usb_buffer in progress, so check if it's finished. */ | ||||
|                      | ||||
|                     if (USBFS_GetEPState(FLUXENGINE_DATA_OUT_EP_NUM) == USBFS_OUT_BUFFER_EMPTY) | ||||
|                     { | ||||
|                         if (writing && (dma_underrun || index_irq)) | ||||
|                             goto abort; | ||||
|                         /* It's done, so copy out the data. */ | ||||
|                          | ||||
|                         memcpy(xfer_buffer, usb_buffer, FRAME_SIZE); | ||||
|                         cs.inputptr = xfer_buffer; | ||||
|                         cs.inputlen = packetwaiting; | ||||
|  | ||||
|                         count_read++; | ||||
|                         if ((packetwaiting < FRAME_SIZE) || (count_read == packets)) | ||||
|                             finished = true; | ||||
|                         else | ||||
|                         { | ||||
|                             /* Wait for more USB data to show up. */ | ||||
|                              | ||||
|                             packetwaiting = 0; | ||||
|                             USBFS_EnableOutEP(FLUXENGINE_DATA_OUT_EP_NUM); | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     int length = usb_read(FLUXENGINE_DATA_OUT_EP_NUM, usb_buffer); | ||||
|                     cs.inputptr = usb_buffer; | ||||
|                     cs.inputlen = length; | ||||
|                     USBFS_EnableOutEP(FLUXENGINE_DATA_OUT_EP_NUM); | ||||
|  | ||||
|                     count_read++; | ||||
|                     if ((length < FRAME_SIZE) || (count_read == packets)) | ||||
|                         finished = true; | ||||
|                 } | ||||
|             } | ||||
|              | ||||
| @@ -570,7 +655,8 @@ static void cmd_write(struct write_frame* f) | ||||
|                 } | ||||
|             } | ||||
|              | ||||
|             /* If we have a full buffer, start writing. */ | ||||
|             /* Once all the buffers are full, start writing. */ | ||||
|              | ||||
|             if ((dma_reading_from_td == -1) && (dma_writing_to_td == BUFFER_COUNT-1)) | ||||
|             { | ||||
|                 dma_reading_from_td = old_reading_from_td = 0; | ||||
| @@ -585,7 +671,7 @@ static void cmd_write(struct write_frame* f) | ||||
|  | ||||
|                 /* Wait for the index marker. While this happens, the DMA engine | ||||
|                  * will prime the FIFO. */ | ||||
|                  | ||||
|  | ||||
|                 index_irq = false; | ||||
|                 while (!index_irq) | ||||
|                     ; | ||||
| @@ -596,7 +682,7 @@ static void cmd_write(struct write_frame* f) | ||||
|                 SEQUENCER_CONTROL_Write(0); /* start writing! */ | ||||
|             } | ||||
|         } | ||||
|          | ||||
|  | ||||
|         if (writing && (dma_underrun || index_irq)) | ||||
|             goto abort; | ||||
|  | ||||
| @@ -607,6 +693,7 @@ static void cmd_write(struct write_frame* f) | ||||
|         } | ||||
|     } | ||||
| abort: | ||||
|     print("done %d %d", dma_reading_from_td, dma_writing_to_td); | ||||
|     SEQUENCER_DMA_FINISHED_IRQ_Disable(); | ||||
|  | ||||
|     SEQUENCER_CONTROL_Write(1); /* reset */ | ||||
| @@ -622,7 +709,9 @@ abort: | ||||
|     print("p=%d cr=%d cw=%d f=%d w=%d index=%d underrun=%d", packets, count_read, count_written, finished, writing, index_irq, dma_underrun); | ||||
|     if (!finished) | ||||
|     { | ||||
|         while (count_read < packets) | ||||
|         /* There's still some data to read, so just read and blackhole it --- | ||||
|          * easier than trying to terminate the connection. */ | ||||
|         while (count_read != packets) | ||||
|         { | ||||
|             if (USBFS_GetEPState(FLUXENGINE_DATA_OUT_EP_NUM) == USBFS_OUT_BUFFER_FULL) | ||||
|             { | ||||
| @@ -788,8 +877,12 @@ static void handle_command(void) | ||||
|             cmd_measure_speed(f); | ||||
|             break; | ||||
|              | ||||
|         case F_FRAME_BULK_TEST_CMD: | ||||
|             cmd_bulk_test(f); | ||||
|         case F_FRAME_BULK_WRITE_TEST_CMD: | ||||
|             cmd_bulk_write_test(f); | ||||
|             break; | ||||
|              | ||||
|         case F_FRAME_BULK_READ_TEST_CMD: | ||||
|             cmd_bulk_read_test(f); | ||||
|             break; | ||||
|              | ||||
|         case F_FRAME_READ_CMD: | ||||
|   | ||||
							
								
								
									
										14
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								README.md
									
									
									
									
									
								
							| @@ -79,10 +79,10 @@ people who've had it work). | ||||
|  | ||||
| | Format                                   | Read? | Write? | Notes | | ||||
| |:-----------------------------------------|:-----:|:------:|-------| | ||||
| | IBM PC compatible                        |  🦄   |        | and compatibles (like the Atari ST) | | ||||
| | [Acorn ADFS](doc/disk-acornadfs.md)      |  🦄   |        | single- and double- sided           | | ||||
| | [Acorn DFS](doc/disk-acorndfs.md)        |  🦄   |        |                                     | | ||||
| | [Ampro Little Board](doc/disk-ampro.md)  |  🦖   |        |                                     | | ||||
| | [IBM PC compatible](doc/disk-ibm.md)     |  🦄   |   🦄   | and compatibles (like the Atari ST) | | ||||
| | [Acorn ADFS](doc/disk-acornadfs.md)      |  🦄   |   🦖*  | single- and double- sided           | | ||||
| | [Acorn DFS](doc/disk-acorndfs.md)        |  🦄   |   🦖*  |                                     | | ||||
| | [Ampro Little Board](doc/disk-ampro.md)  |  🦖   |   🦖*   |                                     | | ||||
| | [Apple II DOS 3.3](doc/disk-apple2.md)   |  🦄   |        | doesn't do logical sector remapping | | ||||
| | [Amiga](doc/disk-amiga.md)               |  🦄   |        |                                     | | ||||
| | [Commodore 64 1541](doc/disk-c64.md)     |  🦖   |        | and probably the other GCR formats  | | ||||
| @@ -90,9 +90,13 @@ people who've had it work). | ||||
| | [Brother 240kB](doc/disk-brother.md)     |  🦄   |   🦄   |                                     | | ||||
| | [Brother FB-100](doc/disk-fb100.md)      |  🦖   |        | Tandy Model 100, Husky Hunter, knitting machines | | ||||
| | [Macintosh 800kB](doc/disk-macintosh.md) |  🦖   |        | and probably the 400kB too          | | ||||
| | [TRS-80](doc/disk-trs80.md)              |  🦖   |        | a minor variation of the IBM scheme | | ||||
| | [TRS-80](doc/disk-trs80.md)              |  🦖   |   🦖*  | a minor variation of the IBM scheme | | ||||
| {: .datatable } | ||||
|  | ||||
| `*`: these formats are variations of the generic IBM format, and since the | ||||
| IBM writer is completely generic, it should be configurable for these | ||||
| formats... theoretically. I don't have the hardware to try it. | ||||
|  | ||||
| ### Even older disk formats | ||||
|  | ||||
| These formats are for particularly old, weird architectures, even by the | ||||
|   | ||||
| @@ -19,6 +19,8 @@ static DoubleFlag postIndexGapMs( | ||||
| 	"Post-index gap before first sector header (milliseconds).", | ||||
| 	0.5); | ||||
|  | ||||
| static bool lastBit; | ||||
|  | ||||
| static int charToInt(char c) | ||||
| { | ||||
| 	if (isdigit(c)) | ||||
| @@ -51,7 +53,7 @@ static void write_interleaved_bytes(std::vector<bool>& bits, unsigned& cursor, c | ||||
| { | ||||
| 	assert(!(bytes.size() & 3)); | ||||
| 	Bytes interleaved = amigaInterleave(bytes); | ||||
| 	encodeMfm(bits, cursor, interleaved); | ||||
| 	encodeMfm(bits, cursor, interleaved, lastBit); | ||||
| } | ||||
|  | ||||
| static void write_interleaved_bytes(std::vector<bool>& bits, unsigned& cursor, uint32_t data) | ||||
| @@ -108,6 +110,7 @@ std::unique_ptr<Fluxmap> AmigaEncoder::encode( | ||||
| 	unsigned cursor = 0; | ||||
|  | ||||
|     fillBitmapTo(bits, cursor, postIndexGapMs * 1000 / clockRateUs, { true, false }); | ||||
| 	lastBit = false; | ||||
|  | ||||
| 	for (int sectorId=0; sectorId<AMIGA_SECTORS_PER_TRACK; sectorId++) | ||||
| 	{ | ||||
|   | ||||
							
								
								
									
										235
									
								
								arch/ibm/encoder.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										235
									
								
								arch/ibm/encoder.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,235 @@ | ||||
| #include "globals.h" | ||||
| #include "record.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "ibm.h" | ||||
| #include "crc.h" | ||||
| #include "sectorset.h" | ||||
| #include "writer.h" | ||||
| #include "fmt/format.h" | ||||
| #include <ctype.h> | ||||
|  | ||||
| /* IAM record separator: | ||||
|  * 0xC2 is: | ||||
|  * data:    1  1  0  0  0  0  1  0  = 0xc2 | ||||
|  * mfm:     01 01 00 10 10 10 01 00 = 0x5254 | ||||
|  * special: 01 01 00 10 00 10 01 00 = 0x5224 | ||||
|  */ | ||||
| #define MFM_IAM_SEPARATOR 0x5224 | ||||
|  | ||||
| /* FM IAM record: | ||||
|  * flux:   XXXX-XXX-XXXX-X- = 0xf77a | ||||
|  * clock:  X X - X - X X X  = 0xd7 | ||||
|  * data:    X X X X X X - - = 0xfc | ||||
|  */ | ||||
| #define FM_IAM_RECORD 0xf77a | ||||
|  | ||||
| /* MFM IAM record: | ||||
|  * data:   1  1  1  1  1  1  0  0  = 0xfc | ||||
|  * flux:   01 01 01 01 01 01 00 10 = 0x5552 | ||||
|  */ | ||||
| #define MFM_IAM_RECORD 0x5552 | ||||
|  | ||||
| /* MFM record separator: | ||||
|  * 0xA1 is: | ||||
|  * data:    1  0  1  0  0  0  0  1  = 0xa1 | ||||
|  * mfm:     01 00 01 00 10 10 10 01 = 0x44a9 | ||||
|  * special: 01 00 01 00 10 00 10 01 = 0x4489 | ||||
|  *                       ^^^^^ | ||||
|  * When shifted out of phase, the special 0xa1 byte becomes an illegal | ||||
|  * encoding (you can't do 10 00). So this can't be spoofed by user data. | ||||
|  *  | ||||
|  * shifted: 10 00 10 01 00 01 00 1 | ||||
|  *  | ||||
|  * It's repeated three times. | ||||
|  */ | ||||
| #define MFM_RECORD_SEPARATOR 0x4489 | ||||
| #define MFM_RECORD_SEPARATOR_BYTE 0xa1 | ||||
|  | ||||
| /* MFM IDAM byte: | ||||
|  * data:    1  1  1  1  1  1  1  0  = 0xfe | ||||
|  * mfm:     01 01 01 01 01 01 01 00 = 0x5554 | ||||
|  */ | ||||
|  | ||||
| /* MFM DAM byte: | ||||
|  * data:    1  1  1  1  1  0  1  1  = 0xfb | ||||
|  * mfm:     01 01 01 01 01 00 01 01 = 0x5545 | ||||
|  */ | ||||
|  | ||||
| static int charToInt(char c) | ||||
| { | ||||
| 	if (isdigit(c)) | ||||
| 		return c - '0'; | ||||
| 	return 10 + tolower(c) - 'a'; | ||||
| } | ||||
|  | ||||
| void IbmEncoder::writeRawBits(uint32_t data, int width) | ||||
| { | ||||
| 	_cursor += width; | ||||
| 	_lastBit = data & 1; | ||||
| 	for (int i=0; i<width; i++) | ||||
| 	{ | ||||
| 		unsigned pos = _cursor - i - 1; | ||||
| 		if (pos < _bits.size()) | ||||
| 			_bits[pos] = data & 1; | ||||
| 		data >>= 1; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void IbmEncoder::writeBytes(const Bytes& bytes) | ||||
| { | ||||
| 	if (_parameters.useFm) | ||||
| 		encodeFm(_bits, _cursor, bytes); | ||||
| 	else | ||||
| 		encodeMfm(_bits, _cursor, bytes, _lastBit); | ||||
| } | ||||
|  | ||||
| void IbmEncoder::writeBytes(int count, uint8_t byte) | ||||
| { | ||||
| 	Bytes bytes = { byte }; | ||||
| 	for (int i=0; i<count; i++) | ||||
| 		writeBytes(bytes); | ||||
| } | ||||
|  | ||||
| static uint8_t decodeUint16(uint16_t raw) | ||||
| { | ||||
| 	Bytes b; | ||||
| 	ByteWriter bw(b); | ||||
| 	bw.write_be16(raw); | ||||
| 	return decodeFmMfm(b.toBits())[0]; | ||||
| } | ||||
|  | ||||
| std::unique_ptr<Fluxmap> IbmEncoder::encode( | ||||
| 	int physicalTrack, int physicalSide, const SectorSet& allSectors) | ||||
| { | ||||
| 	double clockRateUs = 1e3 / _parameters.clockRateKhz; | ||||
| 	if (!_parameters.useFm) | ||||
| 		clockRateUs /= 2.0; | ||||
| 	int bitsPerRevolution = (_parameters.trackLengthMs * 1000.0) / clockRateUs; | ||||
| 	_bits.resize(bitsPerRevolution); | ||||
| 	_cursor = 0; | ||||
|  | ||||
| 	uint8_t idamUnencoded = decodeUint16(_parameters.idamByte); | ||||
| 	uint8_t damUnencoded = decodeUint16(_parameters.damByte); | ||||
|  | ||||
| 	uint8_t sectorSize = 0; | ||||
| 	{ | ||||
| 		int s = _parameters.sectorSize >> 7; | ||||
| 		while (s > 1) | ||||
| 		{ | ||||
| 			s >>= 1; | ||||
| 			sectorSize += 1; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	uint8_t gapFill = _parameters.useFm ? 0x00 : 0x4e; | ||||
|  | ||||
| 	writeBytes(_parameters.gap0, gapFill); | ||||
| 	if (_parameters.emitIam) | ||||
| 	{ | ||||
| 		writeBytes(_parameters.useFm ? 6 : 12, 0x00); | ||||
| 		if (!_parameters.useFm) | ||||
| 		{ | ||||
| 			for (int i=0; i<3; i++) | ||||
| 				writeRawBits(MFM_IAM_SEPARATOR, 16); | ||||
| 		} | ||||
| 		writeRawBits(_parameters.useFm ? FM_IAM_RECORD : MFM_IAM_RECORD, 16); | ||||
| 		writeBytes(_parameters.gap1, gapFill); | ||||
| 	} | ||||
|  | ||||
| 	bool first = true; | ||||
| 	for (char sectorChar : _parameters.sectorSkew) | ||||
| 	{ | ||||
| 		int sectorId = charToInt(sectorChar); | ||||
| 		if (!first) | ||||
| 			writeBytes(_parameters.gap3, gapFill); | ||||
| 		first = false; | ||||
|  | ||||
| 		const auto& sectorData = allSectors.get(physicalTrack, physicalSide, sectorId); | ||||
| 		if (!sectorData) | ||||
| 			Error() << fmt::format("format tried to find sector {} which wasn't in the input file", sectorId); | ||||
|  | ||||
| 		/* Writing the sector and data records are fantastically annoying. | ||||
| 		 * The CRC is calculated from the *very start* of the record, and | ||||
| 		 * include the malformed marker bytes. Our encoder doesn't know | ||||
| 		 * about this, of course, with the result that we have to construct | ||||
| 		 * the unencoded header, calculate the checksum, and then use the | ||||
| 		 * same logic to emit the bytes which require special encoding | ||||
| 		 * before encoding the rest of the header normally. */ | ||||
|  | ||||
| 		{ | ||||
| 			Bytes header; | ||||
| 			ByteWriter bw(header); | ||||
|  | ||||
| 			writeBytes(_parameters.useFm ? 6 : 12, 0x00); | ||||
| 			if (!_parameters.useFm) | ||||
| 			{ | ||||
| 				for (int i=0; i<3; i++) | ||||
| 					bw.write_8(MFM_RECORD_SEPARATOR_BYTE); | ||||
| 			} | ||||
| 			bw.write_8(idamUnencoded); | ||||
| 			bw.write_8(sectorData->logicalTrack); | ||||
| 			bw.write_8(sectorData->logicalSide); | ||||
| 			bw.write_8(sectorData->logicalSector + _parameters.startSectorId); | ||||
| 			bw.write_8(sectorSize); | ||||
| 			uint16_t crc = crc16(CCITT_POLY, header); | ||||
| 			bw.write_be16(crc); | ||||
|  | ||||
| 			int conventionalHeaderStart = 0; | ||||
| 			if (!_parameters.useFm) | ||||
| 			{ | ||||
| 				for (int i=0; i<3; i++) | ||||
| 					writeRawBits(MFM_RECORD_SEPARATOR, 16); | ||||
| 				conventionalHeaderStart += 3; | ||||
|  | ||||
| 			} | ||||
| 			writeRawBits(_parameters.idamByte, 16); | ||||
| 			conventionalHeaderStart += 1; | ||||
|  | ||||
| 			writeBytes(header.slice(conventionalHeaderStart)); | ||||
| 		} | ||||
|  | ||||
| 		writeBytes(_parameters.gap2, gapFill); | ||||
|  | ||||
| 		{ | ||||
| 			Bytes data; | ||||
| 			ByteWriter bw(data); | ||||
|  | ||||
| 			writeBytes(_parameters.useFm ? 6 : 12, 0x00); | ||||
| 			if (!_parameters.useFm) | ||||
| 			{ | ||||
| 				for (int i=0; i<3; i++) | ||||
| 					bw.write_8(MFM_RECORD_SEPARATOR_BYTE); | ||||
| 			} | ||||
| 			bw.write_8(damUnencoded); | ||||
|  | ||||
| 			Bytes truncatedData = sectorData->data.slice(0, _parameters.sectorSize); | ||||
| 			bw += truncatedData; | ||||
| 			uint16_t crc = crc16(CCITT_POLY, data); | ||||
| 			bw.write_be16(crc); | ||||
|  | ||||
| 			int conventionalHeaderStart = 0; | ||||
| 			if (!_parameters.useFm) | ||||
| 			{ | ||||
| 				for (int i=0; i<3; i++) | ||||
| 					writeRawBits(MFM_RECORD_SEPARATOR, 16); | ||||
| 				conventionalHeaderStart += 3; | ||||
|  | ||||
| 			} | ||||
| 			writeRawBits(_parameters.damByte, 16); | ||||
| 			conventionalHeaderStart += 1; | ||||
|  | ||||
| 			writeBytes(data.slice(conventionalHeaderStart)); | ||||
| 		} | ||||
|     } | ||||
|  | ||||
| 	if (_cursor >= _bits.size()) | ||||
| 		Error() << "track data overrun"; | ||||
| 	while (_cursor < _bits.size()) | ||||
| 		writeBytes(1, gapFill); | ||||
|  | ||||
| 	std::unique_ptr<Fluxmap> fluxmap(new Fluxmap); | ||||
| 	fluxmap->appendBits(_bits, clockRateUs*1e3); | ||||
| 	return fluxmap; | ||||
| } | ||||
|  | ||||
| @@ -2,6 +2,7 @@ | ||||
| #define IBM_H | ||||
|  | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
|  | ||||
| /* IBM format (i.e. ordinary PC floppies). */ | ||||
|  | ||||
| @@ -47,52 +48,46 @@ private: | ||||
|     unsigned _currentHeaderLength; | ||||
| }; | ||||
|  | ||||
| #if 0 | ||||
| class AbstractIbmDecoder : public AbstractSoftSectorDecoder | ||||
| struct IbmParameters | ||||
| { | ||||
| 	int trackLengthMs; | ||||
| 	int sectorSize; | ||||
| 	bool emitIam; | ||||
| 	int startSectorId; | ||||
| 	int clockRateKhz; | ||||
| 	bool useFm; | ||||
| 	uint16_t idamByte; | ||||
| 	uint16_t damByte; | ||||
| 	int gap0; | ||||
| 	int gap1; | ||||
| 	int gap2; | ||||
| 	int gap3; | ||||
| 	std::string sectorSkew; | ||||
| }; | ||||
|  | ||||
| class IbmEncoder : public AbstractEncoder | ||||
| { | ||||
| public: | ||||
|     AbstractIbmDecoder(unsigned sectorIdBase): | ||||
|         _sectorIdBase(sectorIdBase) | ||||
|     {} | ||||
|     virtual ~AbstractIbmDecoder() {} | ||||
| 	IbmEncoder(const IbmParameters& parameters): | ||||
| 		_parameters(parameters) | ||||
| 	{} | ||||
|  | ||||
|     SectorVector decodeToSectors(const RawRecordVector& rawRecords, unsigned physicalTrack, unsigned physicalSide); | ||||
| 	virtual ~IbmEncoder() {} | ||||
|  | ||||
| protected: | ||||
|     virtual int skipHeaderBytes() const = 0; | ||||
| public: | ||||
|     std::unique_ptr<Fluxmap> encode(int physicalTrack, int physicalSide, const SectorSet& allSectors); | ||||
|  | ||||
| private: | ||||
|     unsigned _sectorIdBase; | ||||
| 	void writeRawBits(uint32_t data, int width); | ||||
| 	void writeBytes(const Bytes& bytes); | ||||
| 	void writeBytes(int count, uint8_t value); | ||||
| 	void writeSync(); | ||||
| 	 | ||||
| private: | ||||
| 	IbmParameters _parameters; | ||||
| 	std::vector<bool> _bits; | ||||
| 	unsigned _cursor; | ||||
| 	bool _lastBit; | ||||
| }; | ||||
|  | ||||
| class IbmFmDecoder : public AbstractIbmDecoder | ||||
| { | ||||
| public: | ||||
|     IbmFmDecoder(unsigned sectorIdBase): | ||||
|         AbstractIbmDecoder(sectorIdBase) | ||||
|     {} | ||||
|  | ||||
|     int recordMatcher(uint64_t fifo) const; | ||||
|  | ||||
| protected: | ||||
|     int skipHeaderBytes() const | ||||
|     { return 0; } | ||||
| }; | ||||
|  | ||||
| class IbmMfmDecoder : public AbstractIbmDecoder | ||||
| { | ||||
| public: | ||||
|     IbmMfmDecoder(unsigned sectorIdBase): | ||||
|         AbstractIbmDecoder(sectorIdBase) | ||||
|     {} | ||||
|  | ||||
|     nanoseconds_t guessClock(Fluxmap& fluxmap) const; | ||||
|     int recordMatcher(uint64_t fifo) const; | ||||
|  | ||||
| protected: | ||||
|     int skipHeaderBytes() const | ||||
|     { return 3; } | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|   | ||||
							
								
								
									
										143
									
								
								doc/disk-ibm.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								doc/disk-ibm.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,143 @@ | ||||
| Disk: Generic IBM | ||||
| ================= | ||||
|  | ||||
| IBM scheme disks are _the_ most common disk format, ever. They're used by a | ||||
| huge variety of different systems, and they come in a huge variety of different | ||||
| forms, but they're all fundamentally the same: either FM or MFM, either single | ||||
| or double sided, with distinct sector header and data records and no sector | ||||
| metadata. Systems which use IBM scheme disks include but are not limited to: | ||||
|  | ||||
|   - IBM PCs (naturally) | ||||
|   - Atari ST | ||||
|   - late era Apple machines | ||||
|   - Acorn machines | ||||
|   - the TRS-80 | ||||
|   - late era Commodore machines (the 1571 and so on) | ||||
|   - most CP/M machines | ||||
|   - etc | ||||
|  | ||||
| FluxEngine supports reading these. However, some variants are more peculiar | ||||
| than others, and as a result there are specific decoders which set the defaults | ||||
| correctly for certain formats (for example: on PC disks the sector numbers | ||||
| start from 1, but on [Acorn](disk-acorndfs.md) disks they start from 0). The | ||||
| IBM decoder described here is the generic one, and is suited for 'conventional' | ||||
| PC disks. While you can read all the variant formats with it if you use the | ||||
| right set of arguments, it's easier to use the specific decoder. | ||||
|  | ||||
| The generic decoder is mostly self-configuring, and will detect the format of | ||||
| your disk for you. | ||||
|  | ||||
|  | ||||
| Reading disks | ||||
| ------------- | ||||
|  | ||||
| Just do: | ||||
|  | ||||
|     fluxengine read ibm | ||||
|  | ||||
| ...and you'll end up with an `ibm.img` file. This should work on most PC disks | ||||
| (including FM 360kB disks, 3.5" 1440kB disks, 5.25" 1200kB disks, etc.) The size | ||||
| of the disk image will vary depending on the format. | ||||
|  | ||||
| Configuration options you'll want include: | ||||
|  | ||||
|   - `--sector-id-base`: specifies the ID of the first sector; this defaults | ||||
|     to 1. Some formats (like the Acorn ones) start at 0. This can't be | ||||
| 	autodetected because FluxEngine can't distinguish between a disk which | ||||
| 	starts at sector 1 and a disk which starts at sector 0 but all the sector | ||||
| 	0s are missing. | ||||
|  | ||||
|   - `--ignore-side-byte`: each sector header describes the location of the | ||||
| 	sector: sector ID, track and side. Some formats use the wrong side ID, so | ||||
| 	the sectors on side 1 are labelled as belonging to side 0. This causes | ||||
| 	FluxEngine to see duplicate sectors (as it can't distinguish between the | ||||
| 	two sides). This option tells FluxEngine to ignore the side byte completely | ||||
| 	and use the physical side instead. | ||||
|  | ||||
|  | ||||
| Writing disks | ||||
| ------------- | ||||
|  | ||||
| FluxEngine can also write IBM scheme disks. Unfortunately the format is | ||||
| incredibly flexible and you need to specify every single parameter, which | ||||
| makes things slightly awkward. | ||||
|  | ||||
| The syntax is: | ||||
|  | ||||
|     fluxengine write ibm -i input.img <options> | ||||
|  | ||||
| The format of `input.img` will vary depending on the kind of disk you're | ||||
| writing, which is configured by the options. There are some presets, which | ||||
| you will almost certainly want to use if possible: | ||||
|  | ||||
|   - `--ibm-preset-720`: a standard 720kB DS DD 3.5" disk, with 80 cylinders, | ||||
|   2 sides, and 9 sectors per track. | ||||
|   - `--ibm-preset-1440`: a standard 1440kB DS HD 3.5" disk, with 80 | ||||
|   cylinders, 2 sides, and 18 sectors per track. | ||||
|  | ||||
| These options simply preset the following, lower-level options. Note that | ||||
| options are processed left to right, so it's possible to use a preset and | ||||
| then change some settings. To see the values for a preset, simply append | ||||
| `--help`. | ||||
|  | ||||
|   - `--ibm-track-length-ms=N`: one disk rotation, in milliseconds. This is used | ||||
|   to determine whether all the data will fit on a track or not. `fluxengine | ||||
|   rpm` will tell you this; it'll be 200 for a normal 3.5" drive and 166 for a | ||||
|   normal 5.25" drive. | ||||
|   - `--ibm-sector-size=N`: the size of a sector, in bytes. Must be a power of | ||||
|   two. | ||||
|   - `--ibm-emit-iam=true|false`: whether to emit the IAM record at the top of | ||||
|   the track. The standard format requires it, but it's ignored by absolutely | ||||
|   everyone and you can fit a bit more data on the disk without it. | ||||
|   - `--ibm-start-sector-id=N`: the sector ID of the first sector. Normally 1, | ||||
|   except for non-standard formats like Acorn's, which use 0. | ||||
|   - `--ibm-use-fm=true|false`: uses FM rather than MFM. | ||||
|   - `--ibm-idam-byte=N`: the sixteen-bit raw bit pattern used for the IDAM ID | ||||
|   byte. Big-endian, clock bit first. | ||||
|   - `--ibm-dam-byte-N`: the sixteen-bit raw bit pattern used for the DAM ID | ||||
|   byte. Big-endian, clock bit first. | ||||
|   - `--ibm-gap0-bytes=N`: the size of gap 0 in bytes (between the start of | ||||
|   the track and the IAM record). | ||||
|   - `--ibm-gap1-bytes=N`: the size of gap 1 in bytes (between the IAM record | ||||
|   and the first sector record). | ||||
|   - `--ibm-gap2-bytes=N`: the size of gap 2 in bytes (between each sector | ||||
|   record and the data record). | ||||
|   - `--ibm-gap3-bytes=N`: the size of gap 3 in bytes (between the data record | ||||
|   and the next sector record). | ||||
|   - `--ibm-sector-skew=0123...`: a string representing the order in which to | ||||
|   write sectors: each character represents on sector, with `0` being the | ||||
|   first (always, regardless of `--ibm-start-sector-id` above). Sectors 10 and | ||||
|   above are represented as latters from `A` up. | ||||
|  | ||||
| Mixed-format disks | ||||
| ------------------ | ||||
|  | ||||
| Some disks, usually those belonging to early CP/M machines, have more than one | ||||
| format on the disk at once. Typically, the first few tracks will be low-density | ||||
| FM encoded and will be read by the machine's ROM; those tracks contain new | ||||
| floppy drive handling code capable of coping with MFM data, and so the rest of | ||||
| the disk will use that, allowing them to store more data. | ||||
|  | ||||
| FluxEngine copes with these fine, but the disk images are a bit weird. If track | ||||
| 0 is FM and contains five sectors, but track 1 is MFM with nine sectors (MFM is | ||||
| more efficient and the sectors are physically smaller, allowing you to get more | ||||
| on), then the resulting image will have nine sectors per track... but track 0 | ||||
| will only contain data in the first five. | ||||
|  | ||||
| This is typically what you want as it makes locating the sectors in the image | ||||
| easier, but emulators will typically require a different format. Please [get | ||||
| in touch](https://github.com/davidgiven/fluxengine/issues/new) if you have | ||||
| specific requirements (nothing's come up yet). Alternatively, you can tell | ||||
| FluxEngine to write a [`.ldbs` | ||||
| file](http://www.seasip.info/Unix/LibDsk/ldbs.html) and then use | ||||
| [libdsk](http://www.seasip.info/Unix/LibDsk/) to convert it to something | ||||
| useful. | ||||
|  | ||||
| One easy option when reading these is to simply read the two sections of the | ||||
| disk into two different image files. | ||||
|  | ||||
| FluxEngine can write these too, but in two different passes with different | ||||
| options. It's possible to assemble a flux file by judicious use of `-D | ||||
| something.flux --merge`, which can then be written in a single pass with | ||||
| `fluxengine writeflux`, but it's usually not worth the bother: just write the | ||||
| boot tracks, then write the data tracks, possibly with a script for automation. | ||||
| @@ -59,53 +59,42 @@ Some useful and/or interesting numbers: | ||||
|  | ||||
| ## Why don't I use an Arduino / STM32 / ESP32 / Raspberry Pi / etc? | ||||
|  | ||||
| I've got a _lot_ of questions on this, and multiple Github issues of people | ||||
| -I've got a _lot_ of questions on this, and multiple Github issues of people | ||||
| debating it. It's complicated, but it's essentially a tradeoff between speed | ||||
| and complexity. | ||||
| and complexity.- | ||||
|  | ||||
| FluxEngine's read process involves generating a lot of data using a fairly | ||||
| brute force sampling approach --- about 150kB per disk revolution, and | ||||
| sometimes it needs to record multiple revolutions. Most microcontrollers | ||||
| don't have enough RAM to buffer this, so instead I have to stream it over USB | ||||
| back to the host PC in real time. The disk won't wait, so I need to stream data faster | ||||
| than the disk is producing it: the total is about 800kB/s. | ||||
| **Update as of 2020-01-08:** | ||||
|  | ||||
| Handling USB is pretty CPU-hungry, so my candidate microntroller has to be | ||||
| able to cope with the ruinously strict real-time requirements of the | ||||
| sampler's 12MHz clock as well as keeping up with 13,000 USB interrupts a | ||||
| second (one for each 64-byte frame) in order to transfer the data. | ||||
| Right. Well. | ||||
|  | ||||
| The Atmels and STM32s I found were perfectly capable of doing the real-time | ||||
| sampling, using hand-tool assembly, but I very much doubt whether they could | ||||
| do the USB streaming as well (although I want to move away from the Cypress | ||||
| onto something less proprietary and easier to source, so I'd like to be | ||||
| proven wrong here). | ||||
| This section used to have a long explanation as to why these other platforms | ||||
| were unsuitable --- essentially, they're generally missing out on either the | ||||
| realtimeness to sample the data correctly (Raspberry Pi) or enough CPU to | ||||
| stream the data over USB while also sampling it (Arduino). | ||||
|  | ||||
| The Raspberry Pi easily has enough processing power and memory, but it's also | ||||
| got terrible GPIO pin read performance --- [about | ||||
| 1kHz](https://raspberrypi.stackexchange.com/questions/9646/how-fast-is-gpiodma-multi-i2s-input/10197#10197). | ||||
| That's a long way from the 12MHz I need. | ||||
| This is correct, but it turns out that the STM32 has some built-in features | ||||
| which support the FluxEngine's use case almost exactly: you can configure the | ||||
| DMA engine to sample the interval between pulses and write them directly into | ||||
| memory, and you can configure the PWM engine the read samples from memory and | ||||
| use them to time pulses to the output. There's a bit less functionality, so you | ||||
| can't do things like measure the signal voltages, and they're less convenient | ||||
| as you need an adapter cable or board, but this will allow you to replicate the | ||||
| FluxEngine hardware on a $2 Blue Pill. | ||||
|  | ||||
| The PSoC5LP part I'm using has enough CPU to handle the USB side of things, | ||||
| and it _also_ has a whole set of FPGA-like soft programmable features, | ||||
| including 24 mini-ALU systems that are ideally suited to exactly this kind of | ||||
| sampling. I can read the disk and generate the byte stream describing the | ||||
| flux pattern entirely in 'hardware', without involving the main CPU at all. | ||||
| This is then DMAed directly into a set of ring buffers read for the USB | ||||
| system to pick up and relay back to the PC. It's incredibly simple and works | ||||
| well. (The same applies to writing flux back onto the disk.) | ||||
| I am _not_ planning on replacing the PSoC5 with a Blue Pill, because someone | ||||
| already has: [the GreaseWeazle](https://github.com/keirf/Greaseweazle/wiki) is | ||||
| a completely open source firmware package which will read and write Supercard | ||||
| Pro files via a standard Blue Pill. The GreaseWeazle's USB protocol is | ||||
| different from the FluxEngine's so they're not directly interchangeable. You | ||||
| can, however, read a Supercard Pro file with a GreaseWeazle and then use the | ||||
| FluxEngine client to decode it. It should work the other way around, too, but | ||||
| FluxEngine's SCP export [is curently | ||||
| broken](https://github.com/davidgiven/fluxengine/issues/134). | ||||
|  | ||||
| The development board I'm using, the | ||||
| [CY8CKIT-059](https://www.cypress.com/documentation/development-kitsboards/cy8ckit-059-psoc-5lp-prototyping-kit-onboard-programmer-and), | ||||
| also has another big advantage: it's the right shape. It's got 17 holes in a | ||||
| row connected to GPIO pins, and it's a native 5V part, which means I can just | ||||
| connect a floppy drive connector directly to the board without needing to | ||||
| build any hardware. No adapter board, no level shifting, no special cable, | ||||
| nothing. This makes the FluxEngine hardware incredibly easy to assemble, | ||||
| which therefore means cheap. | ||||
| I _am_ considering adding direct support for the GreaseWeazle to the FluxEngine | ||||
| client, which will let you just plug one in and make it go as a direct | ||||
| replacement to the FluxEngine hardware. | ||||
|  | ||||
| Speaking of which, the CY8CKIT-059 is $10. (Before shipping, which is | ||||
| admittedly expensive.) | ||||
|  | ||||
| ### Some useful links | ||||
|  | ||||
|   | ||||
							
								
								
									
										18
									
								
								doc/using.md
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								doc/using.md
									
									
									
									
									
								
							| @@ -51,7 +51,7 @@ In order to do anything useful, you have to plug it in to a floppy disk drive (o | ||||
|      rpm for a 3.5" disk, or 360 rpm for a 5.25" disk. If it doesn't, please | ||||
|      [get in touch](https://github.com/davidgiven/fluxengine/issues/new). | ||||
|  | ||||
|   7. Do `fluxengine test bulktransport` from the shell. It'll measure your USB | ||||
|   7. Do `fluxengine test bandwidth` from the shell. It'll measure your USB | ||||
|      bandwidth. Ideally you should be getting above 900kB/s. FluxEngine needs | ||||
|      about 850kB/s, so if you're getting less than this, try a different USB | ||||
|      port. | ||||
| @@ -241,9 +241,9 @@ directory. | ||||
|   - `fluxengine seek`: moves the head. Mainly useful for finding out whether | ||||
|   your drive can seek to track 82. (Mine can't.) | ||||
|  | ||||
|   - `fluxengine test bulktransport`: measures your USB throughput. You need | ||||
|   about 600kB/s for FluxEngine to work. You don't need a disk in the drive | ||||
|   for this one. | ||||
|   - `fluxengine test bandwidth`: measures your USB throughput. You need about | ||||
|   600kB/s for FluxEngine to work for DD disks, and 900 to 950kB/s for HD | ||||
|   disks. You don't need a disk in the drive for this one. | ||||
|  | ||||
|   - `fluxengine test voltages`: measures your FDD bus signal voltages, which | ||||
|   is useful for testing for termination issues. | ||||
| @@ -300,13 +300,13 @@ containing valuable historical data, and you want to read them. | ||||
| Typically I do this: | ||||
|  | ||||
| ``` | ||||
| $ fluxengine read brother -s :d=0 -o brother.img --write-flux=brother.flux --write-svg=brother.svg | ||||
| $ fluxengine read brother -s :d=0 -o brother.img --write-flux=brother.flux --overwrite --write-svg=brother.svg | ||||
| ``` | ||||
|  | ||||
| This will read the disk in drive 0 and write out a filesystem image. It'll | ||||
| also copy the flux to brother.flux and write out an SVG visualisation. If I | ||||
| then need to tweak the settings, I can rerun the decode without having to | ||||
| physically touch the disk like this: | ||||
| This will read the disk in drive 0 and write out a filesystem image. It'll also | ||||
| copy the flux to `brother.flux` (replacing any old one) and write out an SVG | ||||
| visualisation. If I then need to tweak the settings, I can rerun the decode | ||||
| without having to physically touch the disk like this: | ||||
|  | ||||
| ``` | ||||
| $ fluxengine read brother -s brother.flux -o brother.img --write-svg=brother.svg | ||||
|   | ||||
							
								
								
									
										22
									
								
								lib/bytes.cc
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								lib/bytes.cc
									
									
									
									
									
								
							| @@ -147,6 +147,28 @@ Bytes Bytes::slice(unsigned start, unsigned len) const | ||||
|     } | ||||
| } | ||||
|  | ||||
| Bytes Bytes::slice(unsigned start) const | ||||
| { | ||||
| 	int len = 0; | ||||
| 	if (start < size()) | ||||
| 		len = size() - start; | ||||
| 	return slice(start, len); | ||||
| } | ||||
|  | ||||
| std::vector<bool> Bytes::toBits() const | ||||
| { | ||||
| 	std::vector<bool> bits; | ||||
| 	for (uint8_t byte : *this) | ||||
| 	{ | ||||
| 		for (int i=0; i<8; i++) | ||||
| 		{ | ||||
| 			bits.push_back(byte & 0x80); | ||||
| 			byte <<= 1; | ||||
| 		} | ||||
| 	} | ||||
| 	return bits; | ||||
| } | ||||
|  | ||||
| uint8_t toByte( | ||||
|     std::vector<bool>::const_iterator start, | ||||
|     std::vector<bool>::const_iterator end) | ||||
|   | ||||
| @@ -47,11 +47,13 @@ public: | ||||
|     { resize(0); return *this; } | ||||
|  | ||||
|     Bytes slice(unsigned start, unsigned len) const; | ||||
|     Bytes slice(unsigned start) const; | ||||
|     Bytes swab() const; | ||||
|     Bytes compress() const; | ||||
|     Bytes decompress() const; | ||||
|     Bytes crunch() const; | ||||
|     Bytes uncrunch() const; | ||||
| 	std::vector<bool> toBits() const; | ||||
|  | ||||
|     ByteReader reader() const; | ||||
|     ByteWriter writer(); | ||||
|   | ||||
| @@ -9,14 +9,37 @@ void crunch(crunch_state_t* state) | ||||
|         uint8_t data = *state->inputptr++; | ||||
|         state->inputlen--; | ||||
|  | ||||
|         if (data & 0x80) | ||||
| 		if (data == 0x80) | ||||
| 		{ | ||||
| 			/* Multiple 0x80s in a row get swallowed as they're | ||||
| 			 * meaningless. */ | ||||
| 			state->haspending = true; | ||||
| 		} | ||||
|         else if (data & 0x80) | ||||
|         { | ||||
|             state->fifo = (state->fifo << 2) | 2 | (data & 1); | ||||
|             state->fifolen += 2; | ||||
| 			if (state->haspending) | ||||
| 			{ | ||||
| 				state->fifo = (state->fifo << 3) | 4; | ||||
| 				state->fifolen += 3; | ||||
| 				state->haspending = false; | ||||
| 			} | ||||
|  | ||||
|             state->fifo = (state->fifo << 3) | 4 | (data & 1); | ||||
|             state->fifolen += 3; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             state->fifo = (state->fifo << 8) | data; | ||||
| 			if (state->haspending && (data >= 0x40)) | ||||
| 			{ | ||||
| 				state->fifo = (state->fifo << 3) | 4; | ||||
| 				state->fifolen += 3; | ||||
| 				state->haspending = false; | ||||
| 			} | ||||
| 				 | ||||
| 			state->fifo = (state->fifo << 8) | data; | ||||
| 			if (state->haspending) | ||||
| 				state->fifo |= 0xc0; | ||||
| 			state->haspending = false; | ||||
|             state->fifolen += 8; | ||||
|         } | ||||
|  | ||||
| @@ -45,6 +68,14 @@ void uncrunch(crunch_state_t* state) | ||||
| { | ||||
|     while (state->inputlen && state->outputlen) | ||||
|     { | ||||
| 		if (state->haspending) | ||||
| 		{ | ||||
| 			*state->outputptr++ = state->pendingbyte; | ||||
| 			state->outputlen--; | ||||
| 			state->haspending = false; | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
|         if (state->fifolen < 8) | ||||
|         { | ||||
|             if (state->inputlen) | ||||
| @@ -58,13 +89,21 @@ void uncrunch(crunch_state_t* state) | ||||
|         } | ||||
|  | ||||
|         uint8_t data = state->fifo >> (state->fifolen - 8); | ||||
|         if (data & 0x80) | ||||
|         { | ||||
|             data = ((data >> 6) & 0x01) | 0x80; | ||||
|             state->fifolen -= 2; | ||||
|         } | ||||
|         else | ||||
|             state->fifolen -= 8; | ||||
| 		switch (data & 0xc0) | ||||
| 		{ | ||||
| 			case 0x80: | ||||
| 				data = ((data >> 5) & 0x01) | 0x80; | ||||
| 				state->fifolen -= 3; | ||||
| 				break; | ||||
|  | ||||
| 			case 0xc0: | ||||
| 				state->haspending = true; | ||||
| 				state->pendingbyte = data & 0x3f; | ||||
| 				data = 0x80; | ||||
| 				/* fall through */ | ||||
| 			default: | ||||
| 				state->fifolen -= 8; | ||||
| 		} | ||||
|  | ||||
|         if (data) | ||||
|         { | ||||
|   | ||||
| @@ -11,7 +11,8 @@ extern "C" { | ||||
|  * sending it over USB. The encoding used is: | ||||
|  *  | ||||
|  * 0nnn.nnnn: value 0x00..0x7f | ||||
|  * 1n       : value 0x80|n | ||||
|  * 11nn.nnnn: value 0x80 then 0x00..0x3f | ||||
|  * 10n      : value 0x80|n | ||||
|  * | ||||
|  * The end of the buffer is terminated with zeroes, which are ignored | ||||
|  * (not written to the output). | ||||
| @@ -25,8 +26,10 @@ typedef struct crunch_state_t | ||||
|     uint32_t inputlen; | ||||
|     uint8_t* outputptr; | ||||
|     uint32_t outputlen; | ||||
|     uint16_t fifo; | ||||
|     uint32_t fifo; | ||||
|     uint8_t fifolen; | ||||
| 	bool haspending; | ||||
| 	uint8_t pendingbyte; | ||||
| } | ||||
| crunch_state_t; | ||||
|  | ||||
|   | ||||
| @@ -20,7 +20,8 @@ extern void setDecoderManualClockRate(double clockrate_us); | ||||
|  | ||||
| extern Bytes decodeFmMfm(std::vector<bool>::const_iterator start, | ||||
|     std::vector<bool>::const_iterator end); | ||||
| extern void encodeMfm(std::vector<bool>& bits, unsigned& cursor, const Bytes& input); | ||||
| extern void encodeMfm(std::vector<bool>& bits, unsigned& cursor, const Bytes& input, bool& lastBit); | ||||
| extern void encodeFm(std::vector<bool>& bits, unsigned& cursor, const Bytes& input); | ||||
|  | ||||
| static inline Bytes decodeFmMfm(const std::vector<bool> bits) | ||||
| { return decodeFmMfm(bits.begin(), bits.end()); } | ||||
|   | ||||
| @@ -52,9 +52,32 @@ Bytes decodeFmMfm( | ||||
|     return bytes; | ||||
| } | ||||
|  | ||||
| void encodeMfm(std::vector<bool>& bits, unsigned& cursor, const Bytes& input) | ||||
| void encodeFm(std::vector<bool>& bits, unsigned& cursor, const Bytes& input) | ||||
| { | ||||
|     bool lastBit = false; | ||||
| 	if (bits.size() == 0) | ||||
| 		return; | ||||
|     unsigned len = bits.size()-1; | ||||
|  | ||||
|     for (uint8_t b : input) | ||||
|     { | ||||
|         for (int i=0; i<8; i++) | ||||
|         { | ||||
|             bool bit = b & 0x80; | ||||
|             b <<= 1; | ||||
|  | ||||
|             if (cursor >= len) | ||||
|                 return; | ||||
|              | ||||
|             bits[cursor++] = true; | ||||
|             bits[cursor++] = bit; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| void encodeMfm(std::vector<bool>& bits, unsigned& cursor, const Bytes& input, bool& lastBit) | ||||
| { | ||||
| 	if (bits.size() == 0) | ||||
| 		return; | ||||
|     unsigned len = bits.size()-1; | ||||
|  | ||||
|     for (uint8_t b : input) | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| #include "globals.h" | ||||
| #include "flags.h" | ||||
| #include "fmt/format.h" | ||||
|  | ||||
| static FlagGroup* currentFlagGroup; | ||||
| static std::vector<Flag*> all_flags; | ||||
| @@ -172,6 +173,11 @@ void BoolFlag::set(const std::string& value) | ||||
| 		Error() << "can't parse '" << value << "'; try 'true' or 'false'"; | ||||
| } | ||||
|  | ||||
| const std::string HexIntFlag::defaultValueAsString() const | ||||
| { | ||||
| 	return fmt::format("0x{:x}", _defaultValue); | ||||
| } | ||||
|  | ||||
| static void doHelp() | ||||
| { | ||||
|     std::cout << "FluxEngine options:" << std::endl; | ||||
|   | ||||
							
								
								
									
										13
									
								
								lib/flags.h
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								lib/flags.h
									
									
									
									
									
								
							| @@ -135,6 +135,17 @@ public: | ||||
|     void set(const std::string& value) { _value = std::stoi(value); } | ||||
| }; | ||||
|  | ||||
| class HexIntFlag : public IntFlag | ||||
| { | ||||
| public: | ||||
|     HexIntFlag(const std::vector<std::string>& names, const std::string helptext, | ||||
|             int defaultValue = 0): | ||||
|         IntFlag(names, helptext, defaultValue) | ||||
|     {} | ||||
|  | ||||
|     const std::string defaultValueAsString() const; | ||||
| }; | ||||
|  | ||||
| class DoubleFlag : public ValueFlag<double> | ||||
| { | ||||
| public: | ||||
| @@ -147,7 +158,7 @@ public: | ||||
|     void set(const std::string& value) { _value = std::stod(value); } | ||||
| }; | ||||
|  | ||||
| class BoolFlag : public ValueFlag<double> | ||||
| class BoolFlag : public ValueFlag<bool> | ||||
| { | ||||
| public: | ||||
|     BoolFlag(const std::vector<std::string>& names, const std::string helptext, | ||||
|   | ||||
| @@ -4,6 +4,7 @@ | ||||
| #include "flags.h" | ||||
|  | ||||
| extern FlagGroup hardwareFluxSinkFlags; | ||||
| extern FlagGroup sqliteFluxSinkFlags; | ||||
|  | ||||
| class Fluxmap; | ||||
| class FluxSpec; | ||||
| @@ -13,11 +14,9 @@ class FluxSink | ||||
| public: | ||||
|     virtual ~FluxSink() {} | ||||
|  | ||||
| private: | ||||
|     static std::unique_ptr<FluxSink> createSqliteFluxSink(const std::string& filename); | ||||
|     static std::unique_ptr<FluxSink> createHardwareFluxSink(unsigned drive); | ||||
|  | ||||
| public: | ||||
|     static std::unique_ptr<FluxSink> create(const FluxSpec& spec); | ||||
|  | ||||
| public: | ||||
|   | ||||
| @@ -2,14 +2,37 @@ | ||||
| #include "fluxmap.h" | ||||
| #include "sql.h" | ||||
| #include "fluxsink/fluxsink.h" | ||||
| #include "flags.h" | ||||
| #include "fmt/format.h" | ||||
| #include <unistd.h> | ||||
|  | ||||
| FlagGroup sqliteFluxSinkFlags; | ||||
|  | ||||
| static SettableFlag mergeFlag( | ||||
| 	{ "--merge" }, | ||||
| 	"merge new data into existing flux file"); | ||||
|  | ||||
| static SettableFlag overwriteFlag( | ||||
| 	{ "--overwrite" }, | ||||
| 	"overwrite existing flux file"); | ||||
|  | ||||
| class SqliteFluxSink : public FluxSink | ||||
| { | ||||
| public: | ||||
|     SqliteFluxSink(const std::string& filename) | ||||
|     { | ||||
| 		if (mergeFlag && overwriteFlag) | ||||
| 			Error() << "you can't specify --merge and --overwrite"; | ||||
|  | ||||
| 		if (!mergeFlag) | ||||
| 		{ | ||||
| 			if (!overwriteFlag && (access(filename.c_str(), F_OK) == 0)) | ||||
| 				Error() << "cowardly refusing to overwrite flux file without --merge or --overwrite specified"; | ||||
| 			if ((access(filename.c_str(), F_OK) == 0) && (remove(filename.c_str()) != 0)) | ||||
| 				Error() << fmt::format("failed to overwrite flux file"); | ||||
| 		} | ||||
| 		_outdb = sqlOpen(filename, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE); | ||||
|  | ||||
| 		int oldVersion = sqlReadIntProperty(_outdb, "version"); | ||||
| 		if ((oldVersion != 0) && (oldVersion != FLUX_VERSION_CURRENT)) | ||||
|             Error() << fmt::format("that flux file is version {}, but this client is for version {}", | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
| #include "flags.h" | ||||
| #include "usb.h" | ||||
| #include "fluxsource/fluxsource.h" | ||||
| #include "fluxsink/fluxsink.h" | ||||
| #include "reader.h" | ||||
| #include "fluxmap.h" | ||||
| #include "sql.h" | ||||
| @@ -18,7 +19,13 @@ | ||||
| #include "imagewriter/imagewriter.h" | ||||
| #include "fmt/format.h" | ||||
|  | ||||
| FlagGroup readerFlags { &hardwareFluxSourceFlags, &fluxmapReaderFlags, &visualiserFlags }; | ||||
| FlagGroup readerFlags | ||||
| { | ||||
| 	&hardwareFluxSourceFlags, | ||||
| 	&sqliteFluxSinkFlags, | ||||
| 	&fluxmapReaderFlags, | ||||
| 	&visualiserFlags | ||||
| }; | ||||
|  | ||||
| static DataSpecFlag source( | ||||
|     { "--source", "-s" }, | ||||
| @@ -61,7 +68,7 @@ static SettableFlag highDensityFlag( | ||||
| 	{ "--high-density", "--hd" }, | ||||
| 	"set the drive to high density mode"); | ||||
|  | ||||
| static sqlite3* outdb; | ||||
| static std::unique_ptr<FluxSink> outputFluxSink; | ||||
|  | ||||
| void setReaderDefaultSource(const std::string& source) | ||||
| { | ||||
| @@ -86,8 +93,8 @@ void Track::readFluxmap() | ||||
| 		"{0} ms in {1} bytes\n", | ||||
|             int(fluxmap->duration()/1e6), | ||||
|             fluxmap->bytes()); | ||||
| 	if (outdb) | ||||
| 		sqlWriteFlux(outdb, physicalTrack, physicalSide, *fluxmap); | ||||
| 	if (outputFluxSink) | ||||
| 		outputFluxSink->writeFlux(physicalTrack, physicalSide, *fluxmap); | ||||
| } | ||||
|  | ||||
| std::vector<std::unique_ptr<Track>> readTracks() | ||||
| @@ -100,17 +107,8 @@ std::vector<std::unique_ptr<Track>> readTracks() | ||||
|  | ||||
| 	if (!destination.get().empty()) | ||||
| 	{ | ||||
| 		outdb = sqlOpen(destination, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE); | ||||
| 		std::cout << "Writing a copy of the flux to " << destination.get() << std::endl; | ||||
| 		sqlPrepareFlux(outdb); | ||||
| 		sqlStmt(outdb, "BEGIN;"); | ||||
|         sqlWriteIntProperty(outdb, "version", FLUX_VERSION_CURRENT); | ||||
| 		atexit([]() | ||||
| 			{ | ||||
| 				sqlStmt(outdb, "COMMIT;"); | ||||
| 				sqlClose(outdb); | ||||
| 			} | ||||
| 		); | ||||
| 		outputFluxSink = FluxSink::createSqliteFluxSink(destination.get()); | ||||
| 	} | ||||
|  | ||||
| 	std::shared_ptr<FluxSource> fluxSource = FluxSource::create(spec); | ||||
|   | ||||
							
								
								
									
										47
									
								
								lib/usb.cc
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								lib/usb.cc
									
									
									
									
									
								
							| @@ -161,11 +161,11 @@ static int large_bulk_transfer(int ep, Bytes& bytes) | ||||
|     return len; | ||||
| } | ||||
|  | ||||
| void usbTestBulkTransport() | ||||
| void usbTestBulkWrite() | ||||
| { | ||||
|     usb_init(); | ||||
|  | ||||
|     struct any_frame f = { .f = {.type = F_FRAME_BULK_TEST_CMD, .size = sizeof(f)} }; | ||||
|     struct any_frame f = { .f = {.type = F_FRAME_BULK_WRITE_TEST_CMD, .size = sizeof(f)} }; | ||||
|     usb_cmd_send(&f, f.f.size); | ||||
|  | ||||
|     /* These must match the device. */ | ||||
| @@ -180,9 +180,9 @@ void usbTestBulkTransport() | ||||
|  | ||||
|     std::cout << "Transferred " | ||||
|               << bulk_buffer.size() | ||||
|               << " bytes in " | ||||
|               << " bytes from FluxEngine -> PC in " | ||||
|               << int(elapsed_time * 1000.0) | ||||
|               << " (" | ||||
|               << " ms (" | ||||
|               << int((bulk_buffer.size() / 1024.0) / elapsed_time) | ||||
|               << " kB/s)" | ||||
|               << std::endl; | ||||
| @@ -199,7 +199,44 @@ void usbTestBulkTransport() | ||||
|                             << x << '.' << y << '.' << z << '.'; | ||||
|             } | ||||
|  | ||||
|     await_reply<struct any_frame>(F_FRAME_BULK_TEST_REPLY); | ||||
|     await_reply<struct any_frame>(F_FRAME_BULK_WRITE_TEST_REPLY); | ||||
| } | ||||
|  | ||||
| void usbTestBulkRead() | ||||
| { | ||||
|     usb_init(); | ||||
|  | ||||
|     struct any_frame f = { .f = {.type = F_FRAME_BULK_READ_TEST_CMD, .size = sizeof(f)} }; | ||||
|     usb_cmd_send(&f, f.f.size); | ||||
|  | ||||
|     /* These must match the device. */ | ||||
|     const int XSIZE = 64; | ||||
|     const int YSIZE = 256; | ||||
|     const int ZSIZE = 64; | ||||
|  | ||||
|     Bytes bulk_buffer(XSIZE*YSIZE*ZSIZE); | ||||
|     for (int x=0; x<XSIZE; x++) | ||||
|         for (int y=0; y<YSIZE; y++) | ||||
|             for (int z=0; z<ZSIZE; z++) | ||||
|             { | ||||
|                 int offset = x*XSIZE*YSIZE + y*ZSIZE + z; | ||||
|                 bulk_buffer[offset] = uint8_t(x+y+z); | ||||
|             } | ||||
|  | ||||
|     double start_time = getCurrentTime(); | ||||
|     large_bulk_transfer(FLUXENGINE_DATA_OUT_EP, bulk_buffer); | ||||
|     double elapsed_time = getCurrentTime() - start_time; | ||||
|  | ||||
|     std::cout << "Transferred " | ||||
|               << bulk_buffer.size() | ||||
|               << " bytes from PC -> FluxEngine in " | ||||
|               << int(elapsed_time * 1000.0) | ||||
|               << " ms (" | ||||
|               << int((bulk_buffer.size() / 1024.0) / elapsed_time) | ||||
|               << " kB/s)" | ||||
|               << std::endl; | ||||
|  | ||||
|     await_reply<struct any_frame>(F_FRAME_BULK_READ_TEST_REPLY); | ||||
| } | ||||
|  | ||||
| Bytes usbRead(int side, bool synced, nanoseconds_t readTime) | ||||
|   | ||||
| @@ -8,7 +8,8 @@ extern int usbGetVersion(); | ||||
| extern void usbRecalibrate(); | ||||
| extern void usbSeek(int track); | ||||
| extern nanoseconds_t usbGetRotationalPeriod(); | ||||
| extern void usbTestBulkTransport(); | ||||
| extern void usbTestBulkWrite(); | ||||
| extern void usbTestBulkRead(); | ||||
| extern Bytes usbRead(int side, bool synced, nanoseconds_t readTime); | ||||
| extern void usbWrite(int side, const Bytes& bytes); | ||||
| extern void usbErase(int side); | ||||
|   | ||||
| @@ -84,7 +84,9 @@ void writeTracks( | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             fluxmap->precompensate(PRECOMPENSATION_THRESHOLD_TICKS, 2); | ||||
|             /* Precompensation actually seems to make things worse, so let's leave | ||||
|              * it disabled for now. */ | ||||
|             //fluxmap->precompensate(PRECOMPENSATION_THRESHOLD_TICKS, 2); | ||||
|             if (outdb) | ||||
|                 sqlWriteFlux(outdb, location.track, location.side, *fluxmap); | ||||
|             else | ||||
|   | ||||
| @@ -168,6 +168,7 @@ buildlibrary libbackend.a \ | ||||
|     arch/f85/decoder.cc \ | ||||
|     arch/fb100/decoder.cc \ | ||||
|     arch/ibm/decoder.cc \ | ||||
|     arch/ibm/encoder.cc \ | ||||
|     arch/macintosh/decoder.cc \ | ||||
|     arch/mx/decoder.cc \ | ||||
|     arch/victor9k/decoder.cc \ | ||||
| @@ -227,11 +228,12 @@ buildlibrary libfrontend.a \ | ||||
|     src/fe-rpm.cc \ | ||||
|     src/fe-scptoflux.cc \ | ||||
|     src/fe-seek.cc \ | ||||
|     src/fe-testbulktransport.cc \ | ||||
|     src/fe-testbandwidth.cc \ | ||||
|     src/fe-testvoltages.cc \ | ||||
|     src/fe-upgradefluxfile.cc \ | ||||
|     src/fe-writeamiga.cc \ | ||||
|     src/fe-writebrother.cc \ | ||||
|     src/fe-writeibm.cc \ | ||||
|     src/fe-writeflux.cc \ | ||||
|     src/fe-writetestpattern.cc \ | ||||
|     src/fluxengine.cc \ | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|  | ||||
| enum  | ||||
| { | ||||
|     FLUXENGINE_VERSION = 11, | ||||
|     FLUXENGINE_VERSION = 12, | ||||
|  | ||||
|     FLUXENGINE_VID = 0x1209, | ||||
|     FLUXENGINE_PID = 0x6e00, | ||||
| @@ -50,8 +50,10 @@ enum | ||||
|     F_FRAME_SEEK_REPLY,           /* any_frame */ | ||||
|     F_FRAME_MEASURE_SPEED_CMD,    /* any_frame */ | ||||
|     F_FRAME_MEASURE_SPEED_REPLY,  /* speed_frame */ | ||||
|     F_FRAME_BULK_TEST_CMD,        /* any_frame */ | ||||
|     F_FRAME_BULK_TEST_REPLY,      /* any_frame */ | ||||
|     F_FRAME_BULK_WRITE_TEST_CMD,   /* any_frame */ | ||||
|     F_FRAME_BULK_WRITE_TEST_REPLY, /* any_frame */ | ||||
|     F_FRAME_BULK_READ_TEST_CMD,   /* any_frame */ | ||||
|     F_FRAME_BULK_READ_TEST_REPLY, /* any_frame */ | ||||
|     F_FRAME_READ_CMD,             /* read_frame */ | ||||
|     F_FRAME_READ_REPLY,           /* any_frame */ | ||||
|     F_FRAME_WRITE_CMD,            /* write_frame */ | ||||
|   | ||||
| @@ -19,7 +19,7 @@ int mainRpm(int argc, const char* argv[]) | ||||
|     usbSetDrive(spec.drive, false, F_INDEX_REAL); | ||||
|     nanoseconds_t period = usbGetRotationalPeriod(); | ||||
|     if (period != 0) | ||||
|         std::cout << "Rotational period is " << period/1000000 << " ms (" << 60e3/period << " rpm)" << std::endl; | ||||
|         std::cout << "Rotational period is " << period/1000000 << " ms (" << 60e9/period << " rpm)" << std::endl; | ||||
|     else | ||||
|     { | ||||
|         std::cout << "No index pulses detected from the disk. Common causes of this are:\n" | ||||
|   | ||||
| @@ -4,9 +4,10 @@ | ||||
| 
 | ||||
| static FlagGroup flags; | ||||
| 
 | ||||
| int mainTestBulkTransport(int argc, const char* argv[]) | ||||
| int mainTestBandwidth(int argc, const char* argv[]) | ||||
| { | ||||
|     flags.parseFlags(argc, argv); | ||||
|     usbTestBulkTransport(); | ||||
|     usbTestBulkWrite(); | ||||
|     usbTestBulkRead(); | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										139
									
								
								src/fe-writeibm.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								src/fe-writeibm.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,139 @@ | ||||
| #include "globals.h" | ||||
| #include "flags.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "ibm/ibm.h" | ||||
| #include "writer.h" | ||||
| #include "fmt/format.h" | ||||
| #include "image.h" | ||||
| #include <fstream> | ||||
|  | ||||
| static FlagGroup flags { &writerFlags }; | ||||
|  | ||||
| static IntFlag trackLengthMs( | ||||
| 	{ "--ibm-track-length-ms" }, | ||||
| 	"Length of a track in milliseconds.", | ||||
| 	0); | ||||
|  | ||||
| static IntFlag sectorSize( | ||||
| 	{ "--ibm-sector-size" }, | ||||
| 	"Size of the sectors to write (bytes).", | ||||
| 	0); | ||||
|  | ||||
| static BoolFlag emitIam( | ||||
| 	{ "--ibm-emit-iam" }, | ||||
| 	"Whether to emit an IAM record at the start of the track.", | ||||
| 	false); | ||||
|  | ||||
| static IntFlag startSectorId( | ||||
| 	{ "--ibm-start-sector-id" }, | ||||
| 	"Sector ID of first sector.", | ||||
| 	1); | ||||
|  | ||||
| static IntFlag clockRateKhz( | ||||
| 	{ "--ibm-clock-rate-khz" }, | ||||
| 	"Clock rate of data to write.", | ||||
| 	0); | ||||
|  | ||||
| static BoolFlag useFm( | ||||
| 	{ "--ibm-use-fm" }, | ||||
| 	"Write in FM mode, rather than MFM.", | ||||
| 	false); | ||||
|  | ||||
| static HexIntFlag idamByte( | ||||
| 	{ "--ibm-idam-byte" }, | ||||
| 	"16-bit RAW bit pattern to use for the IDAM ID byte", | ||||
| 	0); | ||||
|  | ||||
| static HexIntFlag damByte( | ||||
| 	{ "--ibm-dam-byte" }, | ||||
| 	"16-bit RAW bit pattern to use for the DAM ID byte", | ||||
| 	0); | ||||
|  | ||||
| static IntFlag gap0( | ||||
| 	{ "--ibm-gap0-bytes" }, | ||||
| 	"Size of gap 0 (the pre-index gap)", | ||||
| 	0); | ||||
|  | ||||
| static IntFlag gap1( | ||||
| 	{ "--ibm-gap1-bytes" }, | ||||
| 	"Size of gap 1 (the post-index gap).", | ||||
| 	0); | ||||
|  | ||||
| static IntFlag gap2( | ||||
| 	{ "--ibm-gap2-bytes" }, | ||||
| 	"Size of gap 2 (the post-ID gap).", | ||||
| 	0); | ||||
|  | ||||
| static IntFlag gap3( | ||||
| 	{ "--ibm-gap3-bytes" }, | ||||
| 	"Size of gap 3 (the post-data or format gap).", | ||||
| 	0); | ||||
|  | ||||
| static StringFlag sectorSkew( | ||||
| 	{ "--ibm-sector-skew" }, | ||||
| 	"Order to emit sectors.", | ||||
| 	""); | ||||
|  | ||||
| static ActionFlag preset1440( | ||||
| 	{ "--ibm-preset-1440" }, | ||||
| 	"Preset parameters to a 3.5\" 1440kB disk.", | ||||
| 	[] { | ||||
| 		setWriterDefaultInput(":c=80:h=2:s=18:b=512"); | ||||
| 		trackLengthMs.setDefaultValue(200); | ||||
| 		sectorSize.setDefaultValue(512); | ||||
| 		emitIam.setDefaultValue(true); | ||||
| 		clockRateKhz.setDefaultValue(500); | ||||
| 		idamByte.setDefaultValue(0x5554); | ||||
| 		damByte.setDefaultValue(0x5545); | ||||
| 		gap0.setDefaultValue(80); | ||||
| 		gap1.setDefaultValue(50); | ||||
| 		gap2.setDefaultValue(22); | ||||
| 		gap3.setDefaultValue(108); | ||||
| 		sectorSkew.setDefaultValue("0123456789abcdefgh"); | ||||
| 	}); | ||||
|  | ||||
| static ActionFlag preset720( | ||||
| 	{ "--ibm-preset-720" }, | ||||
| 	"Preset parameters to a 3.5\" 720kB disk.", | ||||
| 	[] { | ||||
| 		setWriterDefaultInput(":c=80:h=2:s=9:b=512"); | ||||
| 		trackLengthMs.setDefaultValue(200); | ||||
| 		sectorSize.setDefaultValue(512); | ||||
| 		emitIam.setDefaultValue(true); | ||||
| 		clockRateKhz.setDefaultValue(250); | ||||
| 		idamByte.setDefaultValue(0x5554); | ||||
| 		damByte.setDefaultValue(0x5545); | ||||
| 		gap0.setDefaultValue(80); | ||||
| 		gap1.setDefaultValue(50); | ||||
| 		gap2.setDefaultValue(22); | ||||
| 		gap3.setDefaultValue(80); | ||||
| 		sectorSkew.setDefaultValue("012345678"); | ||||
| 	}); | ||||
|  | ||||
| int mainWriteIbm(int argc, const char* argv[]) | ||||
| { | ||||
| 	setWriterDefaultDest(":d=0:t=0-79:s=0-1"); | ||||
|     flags.parseFlags(argc, argv); | ||||
|  | ||||
| 	IbmParameters parameters; | ||||
| 	parameters.trackLengthMs = trackLengthMs; | ||||
| 	parameters.sectorSize = sectorSize; | ||||
| 	parameters.emitIam = emitIam; | ||||
| 	parameters.startSectorId = startSectorId; | ||||
| 	parameters.clockRateKhz = clockRateKhz; | ||||
| 	parameters.useFm = useFm; | ||||
| 	parameters.idamByte = idamByte; | ||||
| 	parameters.damByte = damByte; | ||||
| 	parameters.gap0 = gap0; | ||||
| 	parameters.gap1 = gap1; | ||||
| 	parameters.gap2 = gap2; | ||||
| 	parameters.gap3 = gap3; | ||||
| 	parameters.sectorSkew = sectorSkew; | ||||
|  | ||||
| 	IbmEncoder encoder(parameters); | ||||
| 	writeDiskCommand(encoder); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| @@ -26,11 +26,12 @@ extern command_cb mainReadVictor9K; | ||||
| extern command_cb mainReadZilogMCZ; | ||||
| extern command_cb mainRpm; | ||||
| extern command_cb mainSeek; | ||||
| extern command_cb mainTestBulkTransport; | ||||
| extern command_cb mainTestBandwidth; | ||||
| extern command_cb mainTestVoltages; | ||||
| extern command_cb mainUpgradeFluxFile; | ||||
| extern command_cb mainWriteAmiga; | ||||
| extern command_cb mainWriteBrother; | ||||
| extern command_cb mainWriteIbm; | ||||
| extern command_cb mainWriteFlux; | ||||
| extern command_cb mainWriteTestPattern; | ||||
|  | ||||
| @@ -84,6 +85,7 @@ static std::vector<Command> writeables = | ||||
| { | ||||
|     { "amiga",         mainWriteAmiga,    "Writes Amiga disks.", }, | ||||
|     { "brother",       mainWriteBrother,  "Writes 120kB and 240kB Brother word processor disks.", }, | ||||
|     { "ibm",           mainWriteIbm,      "Writes the ubiquitous IBM format disks.", }, | ||||
| }; | ||||
|  | ||||
| static std::vector<Command> convertables = | ||||
| @@ -97,8 +99,8 @@ static std::vector<Command> convertables = | ||||
|  | ||||
| static std::vector<Command> testables = | ||||
| { | ||||
|     { "bulktransport", mainTestBulkTransport, "Measures your USB bandwidth.", }, | ||||
|     { "voltages",      mainTestVoltages,      "Measures the FDD bus voltages.", }, | ||||
|     { "bandwidth",     mainTestBandwidth, "Measures your USB bandwidth.", }, | ||||
|     { "voltages",      mainTestVoltages,  "Measures the FDD bus voltages.", }, | ||||
| }; | ||||
|  | ||||
| static void extendedHelp(std::vector<Command>& subcommands, const std::string& command) | ||||
|   | ||||
| @@ -115,6 +115,15 @@ static void test_slice() | ||||
|     assert((bs == Bytes{ 0, 0 })); | ||||
| } | ||||
|  | ||||
| static void test_tobits() | ||||
| { | ||||
| 	Bytes b = {1, 2}; | ||||
| 	assert(b.toBits() == (std::vector<bool>{ | ||||
| 		false, false, false, false, false, false, false, true, | ||||
| 		false, false, false, false, false, false, true, false | ||||
| 	})); | ||||
| } | ||||
|  | ||||
| int main(int argc, const char* argv[]) | ||||
| { | ||||
|     test_bounds(); | ||||
| @@ -123,5 +132,6 @@ int main(int argc, const char* argv[]) | ||||
|     test_reads(); | ||||
|     test_writes(); | ||||
|     test_slice(); | ||||
| 	test_tobits(); | ||||
|     return 0; | ||||
| } | ||||
|   | ||||
| @@ -7,7 +7,7 @@ static uint8_t outputbuffer[64]; | ||||
| static void test_crunch() | ||||
| { | ||||
|     crunch_state_t cs = {}; | ||||
|     Bytes inputdata = { 0x01, 0x7f, 0x80, 0x81, 0x01 }; | ||||
|     Bytes inputdata = { 0x01, 0x7f, 0x80, 0x05, 0x80, 0x81, 0x01 }; | ||||
|     cs.inputptr = inputdata.begin(); | ||||
|     cs.inputlen = inputdata.size(); | ||||
|     cs.outputptr = outputbuffer; | ||||
| @@ -16,13 +16,13 @@ static void test_crunch() | ||||
|     donecrunch(&cs); | ||||
|     Bytes outputdata(outputbuffer, cs.outputptr - outputbuffer); | ||||
|  | ||||
|     assert((outputdata == Bytes{ 0x01, 0x7f, 0xb0, 0x10 })); | ||||
|     assert((outputdata == Bytes{ 0x01, 0x7f, 0xc5, 0x94, 0x04 })); | ||||
| } | ||||
|  | ||||
| static void test_uncrunch() | ||||
| { | ||||
|     crunch_state_t cs = {}; | ||||
|     Bytes inputdata = { 0x01, 0x7f, 0xb0, 0x10 }; | ||||
|     Bytes inputdata = { 0x01, 0x7f, 0xc5, 0x94, 0x04 }; | ||||
|     cs.inputptr = inputdata.begin(); | ||||
|     cs.inputlen = inputdata.size(); | ||||
|     cs.outputptr = outputbuffer; | ||||
| @@ -31,7 +31,7 @@ static void test_uncrunch() | ||||
|     doneuncrunch(&cs); | ||||
|     Bytes outputdata(outputbuffer, cs.outputptr - outputbuffer); | ||||
|  | ||||
|     assert((outputdata == Bytes { 0x01, 0x7f, 0x80, 0x81, 0x01 })); | ||||
|     assert((outputdata == Bytes { 0x01, 0x7f, 0x80, 0x05, 0x80, 0x81, 0x01 })); | ||||
| } | ||||
|  | ||||
| int main(int argc, const char* argv[]) | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| #include "decoders/decoders.h" | ||||
| #include <assert.h> | ||||
|  | ||||
| int main(int argc, const char* argv[]) | ||||
| static void testDecode(void) | ||||
| { | ||||
|     assert(decodeFmMfm( | ||||
|         std::vector<bool>{ | ||||
| @@ -36,6 +36,100 @@ int main(int argc, const char* argv[]) | ||||
|             true, false, | ||||
|         } | ||||
|     ) == Bytes{ 0x80 }); | ||||
| } | ||||
|  | ||||
| static std::vector<bool> wrappedEncodeMfm(const Bytes& bytes) | ||||
| { | ||||
| 	std::vector<bool> bits(16); | ||||
| 	unsigned cursor = 0; | ||||
| 	bool lastBit = false; | ||||
| 	encodeMfm(bits, cursor, bytes, lastBit); | ||||
| 	return bits; | ||||
| } | ||||
|  | ||||
| static std::vector<bool> wrappedEncodeFm(const Bytes& bytes) | ||||
| { | ||||
| 	std::vector<bool> bits(16); | ||||
| 	unsigned cursor = 0; | ||||
| 	encodeFm(bits, cursor, bytes); | ||||
| 	return bits; | ||||
| } | ||||
|  | ||||
| static void testEncodeMfm(void) | ||||
| { | ||||
| 	assert(wrappedEncodeMfm(Bytes{ 0xa1 }) | ||||
| 		== (std::vector<bool>{ | ||||
| 			false, true, | ||||
| 			false, false, | ||||
| 			false, true, | ||||
| 			false, false, | ||||
| 			true, false, | ||||
| 			true, false, | ||||
| 			true, false, | ||||
| 			false, true | ||||
| 		}) | ||||
| 	); | ||||
|  | ||||
| 	assert(wrappedEncodeMfm(Bytes{ 0xc2 }) | ||||
| 		== (std::vector<bool>{ | ||||
| 			false, true, | ||||
| 			false, true, | ||||
| 			false, false, | ||||
| 			true, false, | ||||
| 			true, false, | ||||
| 			true, false, | ||||
| 			false, true, | ||||
| 			false, false | ||||
| 		}) | ||||
| 	); | ||||
|  | ||||
| 	assert(wrappedEncodeMfm(Bytes{ 0xb0 }) | ||||
| 		== (std::vector<bool>{ | ||||
| 			false, true, | ||||
| 			false, false, | ||||
| 			false, true, | ||||
| 			false, true, | ||||
| 			false, false, | ||||
| 			true, false, | ||||
| 			true, false, | ||||
| 			true, false, | ||||
| 		}) | ||||
| 	); | ||||
| } | ||||
|  | ||||
| static void testEncodeFm(void) | ||||
| { | ||||
| 	assert(wrappedEncodeFm(Bytes{ 0x00 }) | ||||
| 		== (std::vector<bool>{ | ||||
|             true, false, | ||||
|             true, false, | ||||
|             true, false, | ||||
|             true, false, | ||||
|             true, false, | ||||
|             true, false, | ||||
|             true, false, | ||||
|             true, false | ||||
| 		}) | ||||
| 	); | ||||
|  | ||||
| 	assert(wrappedEncodeFm(Bytes{ 0x81 }) | ||||
| 		== (std::vector<bool>{ | ||||
|             true, true, | ||||
|             true, false, | ||||
|             true, false, | ||||
|             true, false, | ||||
|             true, false, | ||||
|             true, false, | ||||
|             true, false, | ||||
|             true, true | ||||
| 		}) | ||||
| 	); | ||||
| } | ||||
|  | ||||
| int main(int argc, const char* argv[]) | ||||
| { | ||||
| 	testDecode(); | ||||
| 	testEncodeMfm(); | ||||
| 	testEncodeFm(); | ||||
|     return 0; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user