generated from soypat/go-module-template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpicobin_test.go
65 lines (58 loc) · 12.2 KB
/
picobin_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package picobin
import (
"encoding/hex"
"testing"
)
func TestBlinkyParse(t *testing.T) {
blinky := blinkyFlash()
start0, end, err := NextBlockIdx(blinky)
if err != nil {
t.Fatal(err)
}
blk0, n, err := DecodeBlock(blinky[start0:end])
if err != nil {
t.Error(err)
} else if n != end-start0 {
t.Errorf("expected %d bytes read, got %d", end-start0, n)
}
if len(blk0.Items) != 1 {
t.Errorf("expected 1 item in block, got %d", len(blk0.Items))
}
if blk0.Items[0].ItemType() != ItemTypeImageDef {
t.Errorf("expected image type, got %s", blk0.Items[0].String())
}
start1 := start0 + blk0.Link
blk1, _, err := DecodeBlock(blinky[start1:])
if err != nil {
t.Error(err)
}
start2 := start1 + blk1.Link
if start2 != start0 {
t.Errorf("expected 2 blocks only, second linking to first, got start2=%d", start2)
}
err = blk0.Validate()
if err != nil {
t.Error(err)
}
err = blk1.Validate()
if err != nil {
t.Error(err)
}
t.Logf("BLOCK0:%s BLOCK1:%s", blk0, blk1)
}
// At addr 10000000
const blinkyTextHex = "002008205d010010130100101501001011010010110100101101001011010010110100101101001011010010170100101101001011010010190100101b0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d0100101d01001000be00be00be00be00be00beeff30580103800bef2eb88714815001064150010a801001090a31ae7d3deffff42012110ff01000070150000793512ab4ff000002049086006c881f3088810474ff05040006810b14ff00000f2e70fa40ecc002902d000f015f8f9e71749184a002000e001c19142fcd1002080f30a8814498847144988471449884700befde701c901c29a42fbd3704700bf641500101001002054020020a81600100000082000000820a81600100010082000100820000000007047000008ed00e0540200206c040020391000103d02001031100010f8b500bf064b0749c91a891048bf0131491003d0044b0bb101481847704700bf54020020540200200000000008b5054b1bb105490548aff30080bde80840fff7e1bf00bf00000000300400206414001008b500f0dfff044c204601f01ff84ff47a7000f001fcf7e7641400100fb400b583b0049c074801f011f83cb105a92046019100f0c5fe044801f008f8012000f0d7fe00bf741400108414001070b58646eff3108572b6124cd4e8cf6f0120002efad1c4e8460f002ef6d1bff35f8f4ff0010cc80801f007030cfa03f31ef800c01cea030608d14cea030c0ef800c0c4e88f6f85f3108870bd1046fff7bfff00bfe3030020044a1078431cdbb2182b28bf10231370704700bf300200204ff0e022936843f000539360704700bf0021044b03f12002c3e88f1f01339342fad17047d80300204ff0e0234ff08032c3f80024c3f80424c3f80824c3f80c24c3f81024c3f81424c3f81824c3f81c24c3f82024c3f82424c3f82824c3f82c24c3f83024704700bf012300f01f029340400941b1800000f1604000f56140c0f8803103607047024a203042f82030704700e100e0f8b50d46eff3108772b6124ed6e8cf2f0123002afad1c6e8423f002af6d1bff35f8f0d4b00f110049b680c4a53f82430934203d0994201d000f0fefc064b9b6843f82450bff35f8f0023c6e88f3f87f31088f8bde103002000ed00e01d010010014b0b4403607047d803002070b5104c104dac420ed2ff26236863b1fff76aff01462046fff7ecffa680bff35f8f0834ac42f1d370bdfff75dff01462046fff7dfff2671bff35f8f0834ac42e4d370bd4c020020540200200d4b1a68eff3108172b6d2e8cfcf0120bcf1000ff9d1c2e84c0fbcf1000ff4d1bff35f8f00221b68c3e88f2f81f3108840bf002000217047680400202de9f04f85b0eff30583dbb2103b9a081abf0122aa4dab4d03f00304aa4904eb8202284651f82260009400f08ffb0123a34005f541546360b6f908400193002ceb6380f23581b3881b0440f18480b379002b40f0cd80284600f078fbb6f908400246002c0b46c0f21081d6f8148004eb440708ebc707d7e902ec009f704507f1040971eb0c0c4fea440a45f829e0c0f2fc800199e9630aeb040708ebc709d9e902ba5a4573eb0a034feac707cbdbbaf1000fc0f2cd80d9f81030844ad9f81410934200f0bf80b9f8020080b240ea0440984702460b4652ea030100f0b980002b80f2d680bbeb020b6aeb030a38f90730c9e902ba002ba6db706903eb430200ebc202d2e902c1e3457aeb010e4fea430299db8e46b146614629f8083ff4460be030f93230f146002b0ddb03eb430200ebc202d2e9021c5a008b451a447aeb0c0c00ebc20eecda28f80730a9f80040b3881b043ff57caf3369eff3108272b6d3e8cf0f01210028fad1c3e8401f0028f6d1bff35f8f4ff6ff74b0880023316900b2b480c1e88f3f82f310889842fff65faf0746a946746906f10808b6f9083007eb470e04ebce02002bc446d2e90250a8bfb34605da0fe034f93a309446002b09db03eb430a04ebca02d2e90261b54270eb0101f0da5e46acf8007034f93e7024f83e30002fd9dab3794d46002b3ff433af0023b371b6f9083006f1080c5f1c3ff42aaf4ff0ff384ff0ff39706903e08c465a1c3ff420af03eb430200ebc2014c881f46240430f93230f1d5b6f90840c1e90289bc42ecd0acf80030318920f832103781e5e708460b690291984700282bd138f8072033693281eff3108272b6d3e8cf0f01210028fad1c3e8401f0028f6d1bff35f8f7188002328f8071031697480c1e88f3f82f31088dde605b0bde8f08f2846cde9022300f059fa029a039b10eb020b43eb010a21e70299d1e9002312e702460b46d6f814804fea440aebe600bf00800b4000000b4048040020810400102de9f84f364c25692db1bde8f84f0a213448fff743bedff8e4800321404600f01bfa0326c4f80c80fff7b2fd4ff0504c2d4b267003442361dcf800300f216370636961801d834ff00405a3f878504ff00505a3f890504ff00605a3f8a8504ff007050e214ff6ff7208274ff00a0ea3f8c0504ff001094ff00c0c4ff0020b4ff0090a0d204ff00b05a3f868111749a280a3f808e1a160a3f848b0a3f8f0a0a3f82051a3f838c1a3f85001a3f83090a3f86060a3f8d8701a800d4b3046c8f820700c49dc60fff7bafd49463046fff7a0fd094b0a211f640348bde8f84ffff7debd3402002068040020d8030020ffff1000480400208104001000200b4000000b400146f0b50069eff3108772b6d0e8cf5f0124002dfad1c0e8454f002df6d1bff35f8fb1f902e04c690eeb4e0cbef1000f4feacc0504ebcc0c3ddb605b002648800869c0e88f6f87f31088bcf80200cce902230130c0f30e00012838bf0120059bacf80200ccf81030069b40ea0e40ccf814300b69eff3108272b6d3e8cfcf0127bcf1000ff9d1c3e84c7fbcf1000ff4d1bff35f8f8b886353a1f804e00b69c3e88f6f82f310880122cb68097803f501538a405a60f0bd00230a69c2e88f3f87f310884ff0ff30f0bd03464089b0eb214f37dd58690a1402eb420210b500ebc2001c69eff3108c72b6d4e8cfef0122bef1000ff9d1c4e84e2fbef1000ff4d1bff35f8f428889b292b28a4207d000221b69c3e88f2f8cf31088002010bd42f4004242800121002218699971c0e88f2f8cf310881c78da68084602f50153a140596010bd0020704700bf2de9f041861f41f1ff35b04271eb050338bf002682b038bf354604460f4600f011f9301a65eb0103012873f1000306da2046394602b0bde8f04100f00db900f001f9864265eb010100290adb0021174b3246009316482b460191fff72dff0028e6db4ff0000c1348134a436a9d4204d8816ab142dcd29d42dad11368eff3108172b6d3e8cf8f5ff0010eb8f1000ff8d1c3e848efb8f1000ff3d1bff35f8f1368c3e88fcf81f3108820bfdee7450400103402002000000b406804002010b5044600f0c0f84ff47a734ff0ff3c6ff00042e4fb0301bde81040844572eb01033cbf60461146fff78cbf2de9f84305460c46eff30586f6b28eb1424b586aa04205d39b6aab4205d30120bde8f8830020bde8f883001b18bf0120bde8f88300f092f8854264eb01010029e6db374b1a69eff3108e72b6d2e8cf0f01210028fad1c2e8401f0028f6d1bff35f8fb3f902005f6900eb400200284feac20c07ebc2024adb37f80c1059801969c1e88f6f8ef310885188dff898e00131c1f30e01012938bf0121c2e9025451805661c2f810e041ea00411a69eff3108e72b6d2e8cf9f5ff00108b9f1000ff8d1c2e8498fb9f1000ff3d1bff35f8f9a8827f80c201a699880c2e88f6f8ef3108801221878db68824003f501535a6040bf20bf0a4b5a6aa24204d39b6aab4202d2a24200d120bf0648fff7c6fe80e71b69c3e88f6f8ef310887ae700bf00000b40340200204504001010b4054b054c064aa04214bf1846581c5df8044bfff764bbf803002000800b40881400100346416a0a46986a596a8a42fad17047034b596a0a46986a596a9142fad1704700000b40074a536a9942fcd8994207d1044b02e05a6a914202d19a6a8242f9d3704700bf00000b4000eb400c4fea8c0c0cf1804c0cf5803cf0b51646dcf80420051fb2f5803f38bf4ff48032edb238bfccf80420012d2ad94ff40067254c0cf54052176054f82020b2b9dcf80020012d82ea461202f0e0020cf5805632602ad94ff4006144f820304ff480330cf500521160ccf80430f0bd6769b7fbf2fe0ef1010e0eeb4e0ebef1030efcd2dde70129d2d103240cf540521460dcf80820d207fbd5dcf800200b4c82ea461202f0e0020cf5805632600122dcf800504d4005f00305356002fa01f1dcf808200a42fbd0c6e700bffc030020014b53f820007047fc03002070b4039d04682d0345ea03451b4b002cb3fbf1f3b2fbf3f61fdb194a194b904214bf4ff480424ff40042174c1a6003f580531a60a36832ea0303fbd1212200f540530433016086601a600268002afcda0822c5601a6070bc7047036803f03f038b42dad18368c3f30b03b342d5d1c36803f4ee23ab42d0d1ede700bf001bb700008005400020024000000240012300eb4000800000f1804000f5841041600360704700bf10b42f204ff42a64054a064b06491460d06019605368002bfcda5df8044b70470080044000a0044000b0fa00704700bf08b50148fff746faac14001038b5054c054dac4204d254f8043b9847ac42fad338bd00bf201400106014001010b40748074c084b084a094904601a608b6832ea0303fbd15df8044b704700bf002002407f3befef00300240f6fff30300000240044bdb6cb3f5004f03d14ff48022024bda64704700001150002011504ff0e022044bd2f8881d0b43c2f8883d10ee3004704700bf030330006ff06041044b054a19609368db4333f06043fad1704700bf003002400000024010b545f2532000f08ff8bde8104003460420184710b545f2532000f085f8bde81040034601201847fff730ba10b5054b054c4ff488721846a16800f005faa06010bd00bf0000002000ed00e0002370b52b4c82b0c4f88430fff75eff0122294bda63636c012bfcd10321264a244b11639c6b012cfcd10226052521460523224a22480096fff7f6fe21462b46204a21480095fff7effe0022042031461e4bfff77bfe2146284600221c4bfff775fe0022082011461a4bfff76ffe002209201146174bfff769fe002206201146134bfff763fe0022114b07201146fff75dfe0420fff7c2fe00240f4ba3fb0035ad0ce0b229460134fff704ff062cf8d102b070bd0000014000300140002f685900000540008c864700800540001bb70080d1f008006cdc0283de1b430023db7c022b14bf182316231b88002242e800f2520201d41021184704211847034ad2f82838002bfbd0bff35f8f704700000e400021044b044abff35f8f43f8041b9342f9d170470c080e402c080e4000b9704700f004b910b5094b84b01c684cb1034600914ff0ff3203a90548a047012004b010bd00f035f9204604b010bd2c040020f50f001000befde708b5fff7fbff00bf38b5064c064dfff7c7feac4204d254f8043b9847ac42fad338bd00bf60140010641400100368084611461847437d2de9f04781460f461646002b43d0002a3bdd037d00204d1e014615f8012fdff884800a2a01f101040ed0a6421cd02b782146a3f10d03b3fa83f315f8012f5b090a2a01f10104f0d1002beed18142a1eb000138441bdc02214046d9f800309847a64208d02046e2e7864204dd311ad9f8003038449847374417f8013ca3f10d03b3fa83f35b0989f81430bde8f087d9f800309847dfe73846d9f800301146bde8f047184700bf3c1500102de9f04782b00d46924699460746fff75dfd4ff0ff366ff000442f4a821841f10003964274eb03013cbf324623462b4800f06af96b1c804603d1384600f030f90546274b274e1c68274bb9f1000f18bf1e46b4b1baf1000f1ad1dff8909001e0246974b12368002bfad0d9f800300bb19c42f5d120462a463946b0472469002cf0d1b8f1000f1fd1284602b0bde8f0874ff00a0adff8549002e02469002cf0d02368002bf9d0d9f800300bb1a342f4d12a4639462046b047012220460df107018df807a0b047e8e7044800f019f9284602b0bde8f08700bf40420f004c020020240400205d100010651000102804002000207047f0b583b006468df80700fff7e5fc4ff0ff356ff00044174a821841f10003954274eb03013cbf23462a46134800f0f2f8124b07461c689cb1114d01e024697cb12368002bfad02b680bb19c42f6d1204601220df10701fff703ff2469002cefd117b9304603b0f0bd034800f0cff8304603b0f0bd40420f004c020020240400202804002038b5044600f090f8012305461a4620462946fff739ff084b1c682cb163682bb198472469002cf9d1284638bd2469002cf4d1284638bd00bf24040020844641ea000313f0030349d1403a23d30b6803604b6843608b688360cb68c3600b6903614b6943618b698361cb69c3610b6a03624b6a43628b6a8362cb6ac3620b6b03634b6b43638b6b8363cb6bc36340304031403adbd230320bd30b6803604b6843608b688360cb68c36010301031103af3d20c3205d351f8043b40f8043b043af9d2043208d0d2071cbf11f8013b00f8013b01d30b8803806046704700bf082a13d38b07b1d010f00303aed0c3f10403d21adb071cbf11f8013b00f8013ba4d331f8023b20f8023b9fe7043ad9d3013a11f8013b00f8013bf9d20b7803704b7843708b7883706046704720f0030110f00300c0f1000051f8043b00f1040c4feacc0c6ff000021cbf22fa0cf213434ff0010c4cea0c2c4cea0c4ca3eb0c0222ea030212eacc1204bf51f8043b0430f4d0c2f1000102ea0102b2fa82f2c2f11f0200ebd2007047f8b500bf5ff800f0ed0100205ff800f0810100207d0e0010f10d0010250e0010c90e00105d0e0010a50e0010d90f0010c50f0010f9030010a90e001051070010c10d0010910e0010410e0010f90200102103001019020010"
// At addr 10001464 = 10000000+len(blinkyTextHex), so these are contiguous, unlike FlashEnd.
const blinkyRODataHex = "48656c6c6f2c20776f726c64210000000a2a2a2a2050414e4943202a2a2a0a000a000000486172647761726520616c61726d20256420616c726561647920636c61696d656400000048617264206173736572740052656c6561736500302e3100322e302e300000007069636f32000000626c696e6b00000053657020313520323032340006005250d3f07542b8140010060052503abca911c014001006005250abb36053c414001006005250bbff3cb6cc14001006005250861c0302d4140010060052505422a29ddc14001005005250de65f468bc1600100d0a0000"
// At addr 100016a8 is not contiguous.
const blinkyFlashEndHex = "d3defffffe010000ff01000090eaffff793512ab"
func blinkyFlash() []byte {
const flashAddr = 0x10000000
const flashEndAddr = 0x100016a8
const blinkyHex = blinkyTextHex + blinkyRODataHex
flashEnd, _ := hex.DecodeString(blinkyFlashEndHex)
blinky, _ := hex.DecodeString(blinkyHex)
blinky = append(blinky, make([]byte, flashEndAddr-flashAddr-len(blinky))...)
blinky = append(blinky, flashEnd...)
return blinky
}