Commited final gameplay of the textadventure

Signed-off-by: Tyrolyean <tyrolyean@tyrolyean.net>
This commit is contained in:
Tyrolyean 2020-03-26 23:53:14 +01:00
parent 8a28b339ab
commit d2fd6f9991
No known key found for this signature in database
GPG key ID: 81EC9BAC5E9667C6
32 changed files with 938 additions and 468 deletions

View file

@ -128,3 +128,22 @@
volume = {1969},
url = {https://tools.ietf.org/pdf/rfc20.pdf}
}
@techreport{elf,
type = {Standard},
key = {ELF},
month = May,
year = {1995},
institution = {TIS Committee},
title = {Tool Interface Standard (TIS)Executable and Linking Format (ELF) Specification},
volume = {1995},
url = {https://refspecs.linuxbase.org/elf/elf.pdf}
}
@Manual{progmem,
year = {2016},
title = {Data in Program Space},
organization = {avr-libc 2.0.0 Standard C library for AVR-GCC},
author = {Unknown Author},
url = {https://www.nongnu.org/avr-libc/user-manual/pgmspace.html}
}

Binary file not shown.

View file

@ -3,7 +3,7 @@
:100020000C94B2040C94B2040C94B2040C94B20478
:100030000C94B2040C94B2040C94B2040C94B20468
:100040000C94B2040C94B2040C94B2040C94B20458
:100050000C94B2040C941C090C94B2040C94B204D9
:100050000C94B2040C94670A0C94B2040C94B2048D
:100060000C94B2040C94B2040C94B2040C94B20438
:100070000C94B2040C94B2040C94B2040C94B20428
:100080000C94B2040C94B2040C94B2040C94B20418
@ -143,351 +143,500 @@
:1008E00020222527292B2E303335383B3D404345E8
:1008F000484B4E5154575A5D606366696C6F72760F
:10090000797C7F0011241FBECFEFD1E2DEBFCDBFC7
:1009100000E00CBF84B78093460714BE0FB6F8946E
:1009100000E00CBF84B78093E80D14BE0FB6F894C6
:10092000A8958091600088618093600010926000BB
:100930000FBE16E0A0E0B2E0EEEFF9E100E00BBF81
:1009400002C007900D92A63BB107D9F727E0A6EBAE
:10095000B6E001C01D92A634B207E1F70E94DC099F
:100960000C94FD0C0C940000CF93C62F0E944409F8
:100930000FBE1DE0A0E0B2E0E4EAFCE100E00BBF86
:1009400002C007900D92A235B107D9F72DE0A2E5BC
:10095000BDE001C01D92A83EB207E1F70E942D0B39
:100960000C94500E0C940000CF93C62F0E948F0A57
:100970008FEF80BBC1BBEBE0F1E08081857F80839E
:1009800085E08A95F1F7000080818A608083CF91AD
:1009900008950E94440910BA11BAEBE0F1E0808199
:1009900008950E948F0A10BA11BAEBE0F1E080814D
:1009A000837F808385E08A95F1F700008FB1908185
:1009B0009C609083089563E883E00E94B40463E040
:1009C00080E00E94B40460E081E00E94B40463E02F
:1009D00083E00E94B40480E092E090934307809308
:1009E00042078BEB92E00C94320ACF93DF93CDB7A2
:1009F000DEB7FE01369681919191BF010E945E0A99
:100A00008AE090E00E942C0A90E080E0DF91CF9194
:1009D00083E00E94B40480E092E09093E50D809360
:1009E000E40D87EC92E00C94850BCF93DF93CDB7A9
:1009F000DEB7FE01369681919191BF010E94B10B45
:100A00008AE090E00E947F0B90E080E0DF91CF9140
:100A10000895CF92DF92EF92FF92CF93C82F80E498
:100A2000C82E82E4D82E8FE0E82EF12C85E00E94BB
:100A3000C90485FD06C081E0C81AD108E108F108A3
:100A4000A9F76C2F80E0CF91FF90EF90DF90CF90CF
:100A50000C94B404CF93C82F8A3019F48DE00E940F
:100A600009058C2F0E94090590E080E0CF91089540
:100A7000CF9385E00E94C90480FF0FC080E00E94F0
:100A8000C904C82F0E94B806CD3019F48AE00E942C
:100A900009058C2FCF910C940905CF910895CF9320
:100AA000C62F0E9444098FEF80BBC1BBEBE0F1E091
:100AB00080818D7E808385E08A95F1F700008081BA
:100AC00080618083808182608083CF9108950E94BD
:100AD000440910BA11BAEBE0F1E080818B7E80838B
:100AE00085E08A95F1F700008FB190819461908341
:100AF00008950F931F93CF93DF9380910F0283305C
:100B000009F4B3C0A8F4813009F444C0CFE78230BF
:100B100009F476C0C0E060E08C2F81700E944F0520
:100B2000CF5FCF3FC1F7DF91CF911F910F91089514
:100B3000843009F4C8C01FE7CFEFD0E00FEF853055
:100B400049F76091BC068FEF860F8E3F28F08091A9
:100B50000E02819580930E0280E00E944F05609105
:100B6000BC0681E00E944F054091B6065091B70641
:100B700057FDDFC08091BA069091BB06019684179D
:100B800095070CF0CAC09093BB068093BA0611502B
:100B9000C1F6C9CFCFE7E091BC06F0E0ED5FF74FBB
:100BA000649181E00E944F05E091BC06F0E0ED5FAA
:100BB000F74F649180E00E944F052091B606309176
:100BC000B70637FD19C08091BA069091BB06019611
:100BD000821793073CF49093BB068093BA06C150EA
:100BE000D1F6A1CF1092BB061092BA068091BC0636
:100BF0008F5F8093BC06F3CF8091BC06821BF9CF38
:100C00008091BC0687FF1DC06FEF80E00E944F05FA
:100C10006FEF81E00E944F052091B6063091B70634
:100C200037FD1FC08091BA069091BB0601968217CE
:100C300093076CF49093BB068093BA06C15001F7FA
:100C400072CF60E080E00E944F0560E0E2CF10923A
:100C5000BB061092BA068091BC068F5F8093BC06DB
:100C6000EDCF8091BC06821BF9CFCFE76091BC0627
:100C700080E00E944F056091BC0681E00E944F0514
:100C80002091B6063091B70637FD19C08091BA069B
:100C90009091BB060196821793073CF49093BB0694
:100CA0008093BA06C15011F73ECF1092BB06109246
:100CB000BA068091BC068F5F8093BC06F3CF80910B
:100CC000BC06821BF9CFCFE7E091B806F091B906D8
:100CD000ED5FFB4F649181E00E944F05E091B80603
:100CE000F091B906ED5FFB4F649180E00E944F05E3
:100CF0008091B8069091B9060196811524E092077B
:100D000038F49093B9068093B806C150E9F60BCF3A
:100D10001092B9061092B806F8CF1092BB06109246
:100D2000BA068091BC0690910E02890F8093BC0692
:100D30002ECF20910E022403B001259F700D1124A7
:100D40008091BC06FE01E81BF109E617F7071CF4C9
:100D50000093BC061CCF249F202D11242093BC0699
:100D600016CF80E00E94670580FF0C9479050895F6
:100D70009091BD06E92FF0E0E553F94F8F3729F444
:100D800091509093BD06108208959F5F9093BD0689
:100D900080830895FF920F931F93CF93DF93F62ED6
:100DA000C82FD0E08E01000F111FF801E758FD4F4A
:100DB00081818F9380818F930E94F504C15DD84F0C
:100DC0000F900F908881882311F0F11012C081E0FC
:100DD000888370E060E08AE00E942A05F801EB5900
:100DE000FD4F81818F9380818F930E94F5040F9036
:100DF0000F90DF91CF911F910F91FF900895CF93A6
:100E0000DF93C82FD0E0E091100284E0E89FF0016A
:100E10001124E35CFD4FEC0FFD1F808181110DC09B
:100E20008091AA028F938091A9028F930E94F5046A
:100E30000F900F90DF91CF910895FE01EE0FFF1FED
:100E4000E157FD4F81818F9380818F9381EC92E0F8
:100E50009F938F930E94F504E091100284E0E89F35
:100E6000F0011124E35CFD4FEC0FFD1F80818093A6
:100E7000100261E00E94CA06E0911002F0E0EE0F5D
:100E8000FF1FEF5EFD4F808191819093BF0680939D
:100E9000BE060F900F900F900F90CCCFEF92FF9265
:100EA0000F931F93CF93DF9309E317E0F80181912C
:100EB00081110DC087E0E034F807C9F784EE92E0B5
:100EC0009F938F930E94F5040F900F9028C08AED96
:100ED00092E09F938F930E94F5040F900F90D0E0C3
:100EE000C0E083EDE82E82E0F82EF80181918F01B9
:100EF000882389F0FE01EE0FFF1FE15DFD4F818128
:100F00008F9380818F93FF92EF920E94F5040F9050
:100F10000F900F900F902196C730D10531F7DF91D8
:100F2000CF911F910F91FF90EF900895E0911002E3
:100F3000F0E0EB5DFD4FE081E7FF0BC08091AE027A
:100F40008F938091AD028F930E94F5040F900F90C4
:100F50000895EE0FFF0BE15DFD4F81818F9380813E
:100F60008F938CEF92E09F938F930E94F5040F90E4
:100F70000F900F900F900895E0911002F0E0EB5D5C
:100F8000FD4FE081E7FF0BC08091AE028F9380910F
:100F9000AD028F930E94F5040F900F900895EE0F0D
:100FA000FF0BE15DFD4F81818F9380818F938BE0FB
:100FB00093E09F938F930E94F504E0911002F0E07C
:100FC000EB5DFD4FA0810A2E000CBB0BA75CB84F58
:100FD00081E08C938FEF80830F900F900F900F9094
:100FE0000895E82FF0E0E75CF84F9081911106C07A
:100FF0008091A6028F938091A5020FC08330C1F724
:10100000909110029230A1F710923C078093450214
:101010008091B6028F938091B5028F930E94F50460
:101020000F900F900895EF92FF920F931F93CF931D
:10103000DF93182F092F8FE2E82E82E0F82ED0E000
:10104000C0E0F701819191917F01FC0101900020A6
:10105000E9F73197AF01481B590B612F702F0E94A0
:10106000140A892B49F48C2FDF91CF911F910F9196
:10107000FF90EF900C94F1072196C730D10509F746
:101080008091A6028F938091A5028F930E94F50410
:101090000F900F90DF91CF911F910F91FF90EF90E4
:1010A00008950F931F93CF93DF93C82F70E060E0F4
:1010B0008AE00E942A05C73009F446C0A8F5C53069
:1010C000D1F1C63009F446C08FEF8C0F8430C8F1DF
:1010D0008BE193E09F938F930E94F504CDE8D2E0DB
:1010E0000F900F9003ED12E08881998122969F93D3
:1010F0008F931F930F930E94F5040F900F900F9002
:101100000F9082E0C13AD80779F78091A8028F93B7
:101110008091A7028F930E94F5040F900F90DF91AA
:10112000CF911F910F910895C83089F0C93081F691
:101130000E94BC07EACF60E0809110020E94CA06BC
:10114000E4CF0E94FF06E1CF0E944E07DECF0E944F
:101150009607DBCFE0919902F0919A02DF010D90A2
:101160000020E9F7CD018E1B9F0B8553994F0E94FC
:101170001308CBCF0F931F93CF93DF93E091BD065E
:10118000E436B0F01092BD06EBECF6E084E6DF0149
:101190001D928A95E9F784E293E09F938F930E94D2
:1011A000F5040F900F90DF91CF911F910F9108954B
:1011B000F0E0E653F94F80818A3011F08D3099F7D5
:1011C0000DE812E0D0E0C0E0F801819191918F012B
:1011D000FC0101900020E9F73197AF01481B590B42
:1011E0006BEC76E00E94140A892B69F48C2F0E9424
:1011F00051081092BD06EBECF6E084E6DF011D928B
:101200008A95E9F7D0CF2196CA30D105E9F68091C9
:10121000A4028F938091A3028F930E94F5040F90F4
:101220000F90E7CF82E884BD84E085BD80E487BD70
:1012300082E080936E0008951F920F920FB60F9276
:1012400011240BB60F922F933F934F935F936F939D
:101250007F938F939F93AF93BF93EF93FF930E94DE
:101260006909FF91EF91BF91AF919F918F917F910C
:101270006F915F914F913F912F910F900BBE0F9007
:101280000FBE0F901F9018958093080108958FEF5F
:1012900080BB8093070180930A011092080111BA64
:1012A000EBE0F1E0108280818F6180838FE891E034
:1012B0000197F1F700C0000080818E7F8083089540
:1012C0000E94B1060E9438050E94BA0890E080E0B2
:1012D00008956091BE067091BF066115710529F4ED
:1012E0001092CA061092C90608958091C90690917D
:1012F000CA0601969093CA068093C9062091C20639
:101300003091C3064091C7065091C80684179507CF
:1013100020F46217730721F408956217730761F0D0
:101320001092C1061092C0061092CA061092C90609
:101330007093C3066093C2062091C0063091C10627
:1013400045E0429FC001439F900D1124680F791F13
:1013500045E050E084EC96E00E940B0A8091C706BD
:101360009091C806892B71F41092C1061092C006A4
:101370006091BE067091BF0645E050E084EC96E0B7
:101380000E940B0A8091C40680930F028091C506CB
:101390009091C6069093B7068093B6061092CA063F
:1013A0001092C9068091C0069091C1060196909353
:1013B000C1068093C0060895F8940E9447090E94D0
:1013C000DB040E94120988EE90E09093BF068093A0
:1013D000BE06EFE2F7E08AE0DF011D928A95E9F7A9
:1013E000E9E3F7E087E0DF011D928A95E9F760E025
:1013F000809110020E94CA06789488E19EE00FB6A0
:10140000F894A895809360000FBE90936000A89513
:101410000E946009FCCFFB01DC0102C005900D9227
:1014200041505040D8F70895FB01DC014150504035
:1014300088F08D9181341CF08B350CF4805E6191C5
:1014400061341CF06B350CF4605E861B611171F326
:10145000990B0895881BFCCF609142077091430758
:101460000C946F0C0F931F93CF93DF93E09142077F
:10147000F0914307238110E000E021FD0EC00FEF43
:101480001FEFC801DF91CF911F910F91089519951A
:10149000892B11F00FEF1FEFCE01EC0189916091C4
:1014A000420770914307DB011896ED91FC91811181
:1014B000EECF8AE01995892B21F3E1CFAB01BC0176
:1014C00080914207909143070C94660A2F923F92B5
:1014D0004F925F926F927F928F929F92AF92BF9244
:1014E000CF92DF92EF92FF920F931F93CF93DF93F0
:1014F00000D000D000D00F920F92CDB7DEB77C01A4
:101500003B018A01FC0117821682838181FFCEC1D3
:101510009AE0292ECE0101965C01F7019381F30137
:1015200093FD859193FF81913F01882309F446C182
:10153000853239F493FD859193FF81913F01853286
:1015400029F4B70190E00E946F0CE7CF912C412C59
:10155000512CFFE1F51538F08B3209F188F4803217
:1015600001F1833221F157FC3AC020ED280F2A30D7
:1015700040F556FE1FC0929C200D1124922E06C0ED
:101580008D3291F0803379F7689450F8F30193FD30
:10159000859193FF81913F018111DBCF20C0689439
:1015A00051F8689452F8F2CF689453F8EFCF6894EA
:1015B00054F8ECCF429C200D1124422E689455F82B
:1015C000E5CF8E3229F456FCF9C0689456F8DECF88
:1015D0008C3619F4689457F8D9CF8836B9F2982F19
:1015E0009F7D95549330C0F08336A1F18337C1F1CC
:1015F000833509F05BC0F801C190D1908F01692D4E
:1016000070E056FC02C06FEF7FEFC6010E94590CDC
:101610004C01689457F80AC00C5F1F4F2FE32983D1
:1016200088248394912C6501E89457F853FC04C0F6
:101630004814190409F018F5342C8114910431F57B
:10164000332009F46ACFB70180E290E00E946F0C6A
:101650003A94F6CFF801808189830E5F1F4FE0CF67
:10166000F801C190D1908F01692D70E056FC02C045
:101670006FEF7FEFC6010E94640C4C01D5CFB7011C
:1016800080E290E00E946F0C4A94D2CFF60157FCA2
:10169000859157FE81916F01B70190E00E946F0C18
:1016A00031103A94F1E08F1A9108C7CF843619F0BF
:1016B000893609F074C0F80157FE6AC061917191D2
:1016C000819191918F01252D2F76D22E97FF09C000
:1016D00090958095709561957F4F8F4F9F4F68943F
:1016E000D7F82AE030E0A5010E949F0CC82ECA1846
:1016F0008C2C5D2CD6FE0CC0E89450F8C91440F434
:10170000D4FE05C0D2FC03C0FD2DFE7E5F2E892CC9
:1017100054FEA4C0FE01EC0DF11D8081803309F060
:1017200096C0252D297E522E852D8870382E53FC8B
:10173000A4C050FE9EC09C2C841418F44C0C942C15
:10174000981854FEA0C0B70180E390E00E946F0C8F
:1017500052FE09C088E790E051FE02C088E590E0A3
:10176000B7010E946F0CC91408F499C0CA94D12C17
:101770009FEFC91AD90ACA0CDB1CF60182916F01CE
:10178000B70190E00E946F0CAC14BD04B1F758CFC4
:1017900061917191072E000C880B990B93CFD52C7A
:1017A000E894D4F82AE030E08537E1F1952D997F6F
:1017B000D92E8F36A9F1F0F4883551F1F7018681E1
:1017C00097812B960FB6F894DEBF0FBECDBFDF9189
:1017D000CF911F910F91FF90EF90DF90CF90BF902E
:1017E000AF909F908F907F906F905F904F903F90C1
:1017F0002F900895803749F0883701F7D4FE02C052
:101800006894D2F820E130E00DC06894D4F8F6CFA7
:1018100054FE03C0E92FE660DE2E20E132E002C074
:1018200028E030E0F801D7FE0DC0619171918191FF
:1018300091918F01A5010E949F0CC82ECA18E894AF
:10184000D7F856CF6191719190E080E0F2CF52FCD1
:1018500002C0839469CF8394839466CF852D867864
:1018600009F462CFF6CFB70180E290E00E946F0CDE
:1018700083948414C0F3312C64CF342C381884142E
:1018800008F45FCFF8CF852D867809F46CCF8BE212
:1018900051FE80E257FC8DE2B70190E062CFB701C4
:1018A00080E390E00E946F0C9A945DCF8FEF9FEFE2
:1018B00088CFFC010590615070400110D8F78095E9
:1018C00090958E0F9F1F0895FC016150704001900C
:1018D0000110D8F7809590958E0F9F1F08950F9354
:1018E0001F93CF93DF93182F092FEB018B8181FD7D
:1018F00009C01FEF0FEF812F902FDF91CF911F9124
:101900000F91089582FF14C02E813F818C819D81AB
:10191000281739073CF4E881F981CF0101969983B2
:10192000888310838E819F8101969F838E83E3CF6E
:10193000E885F985812F1995892BA1F3DACFFA0172
:10194000AA27283051F1203181F1E8946F936E7FFE
:101950006E5F7F4F8F4F9F4FAF4FB1E03ED0B4E0EF
:101960003CD0670F781F891F9A1FA11D680F791F30
:101970008A1F911DA11D6A0F711D811D911DA11D41
:1019800020D009F468943F912AE0269F1124301951
:10199000305D3193DEF6CF010895462F4770405DEC
:1019A0004193B3E00FD0C9F7F6CF462F4F70405D9B
:1019B0004A3318F0495D31FD4052419302D0A9F7F6
:1019C000EACFB4E0A6959795879577956795BA95F0
:1019D000C9F700976105710508959B01AC010A2EB6
:1019E00006945795479537952795BA95C9F7620F8D
:0E19F000731F841F951FA01D0895F894FFCF4C
:1019FE0000000002000000002A05000000000101A6
:101A0E0001E8009701A002000000000000000000A5
:101A1E000000000000FF0603FFFFFFFFFFFFFF3582
:101A2E000341034E0352035A03600369030000008F
:101A3E00000200000000010000000004020000008F
:101A4E000000000000000000000000000000000088
:101A5E000000000000700313049B04260530053BB4
:101A6E000545055105570560056E05760582052667
:101A7E000590053B0545055105570560059B05A0DD
:101A8E0005A605AC05B105B605BF05C305CD05D444
:101A9E0005D905DF05F00504061E06350646065E69
:101AAE00066606720688069706A606494E49540D26
:101ABE00004D6F76696E6720746F77617264732064
:101ACE0025730020202020257300596F7520686132
:101ADE0076653A00596F757220696E76656E746F11
:101AEE00727920697320656D70747900596F752055
:101AFE00666F756E64206120257300596F752074B2
:101B0E006F6F6B2074686520257300596F752063A5
:101B1E00616E3A000A546F6F206D75636820696EAE
:101B2E007075742100464C4F505059204449534B08
:101B3E0000534352455720445249564552004B4597
:101B4E0059005341555341474500464C45534800B3
:101B5E004B4559424F41524400504953544F4C004B
:101B6E00596F7520737461726520696E746F206190
:101B7E0020766F6964206F66206E6F7468696E6779
:101B8E006E6573732E20596F7520736565206E6FA9
:101B9E006F6E652C20796F752068656172206E6F8F
:101BAE006F6E652C796F75206665656C20736F6D31
:101BBE00656F6E652E0A596F75206C6F6F6B2061A5
:101BCE00726F756E642C20616E6420736565206E75
:101BDE006F7468696E672C2079657420796F752033
:101BEE00617265206E6F206C657373207363617212
:101BFE0065642E20596F75206861766520776F6E4B
:101C0E002E2E00596F7520617265206F6E207468DC
:101C1E0065206465616420656E64206F66206120B6
:101C2E006C6F6E656C7920726F61642E20596F75C2
:101C3E00206C6F6F6B20726967687420616E642010
:101C4E006C656674206F66796F752C206275740AE8
:101C5E00796F752063616E6E6F742072656D656D40
:101C6E006265722077687920796F752061726520C0
:101C7E00686572652E2E2E20596F75206172652053
:101C8E007465727269666965642E00596F75207489
:101C9E00726176656C20612062697420746F776161
:101CAE0072647320746865206D6F6F6E2C20796F6F
:101CBE0075207468696E6B20746861742773207464
:101CCE0068652077617920746F20676F2E20596FB9
:101CDE00752066696E642061200A626561722069F2
:101CEE006E20746865206D6964646C65206F662073
:101CFE0074686520726F616420736C656570696EBF
:101D0E0067207365656D696E676C7920696E2070EA
:101D1E00656163652E0046495245504C414345006E
:101D2E00572F5720535452454554004F4C4420488A
:101D3E004F555345004C4956494E4720524F4F4D33
:101D4E0000415454494300424153454D454E5400C1
:101D5E00434F4D505554455220524F4F4D004E4F0C
:101D6E005448494E47004C4F4E454C5920524F4116
:101D7E004400532F4E204449525420524F414400A8
:101D8E00452F57205374726565740068656C70003A
:101D9E006E6F72746800736F757468007765737414
:101DAE0000656173740064657363726962650075C2
:101DBE00736500696E76656E746F72790073656116
:101DCE007263680074616B65004552524F52004950
:101DDE006E76616C696420636F6D6D616E64210057
:101DEE00596F752063616E27742075736520746852
:101DFE0061742100576861742061726520796F7576
:101E0E0020676F696E6720746F20646F3F00596F93
:101E1E00752063616E277420676F2074686174206B
:101E2E007761792100594F55204D41592041435436
:101E3E00204E4F5721005468657265206973206EDD
:101E4E006F7468696E6720686572652E2E006974FE
:101E5E0020646965640069742073757276697665AD
:101E6E00640061206265617220626C6F636B732027
:101E7E00746865207761790069742072616E2061E3
:101E8E007761792E2E2E00697420776F6E2774205D
:101E9E00737461727400796F752063616E2774209C
:061EAE007479706500006C
:100A50000C94B404CF93C82F8091520D8F5F809374
:100A6000520DC03259F4873480F070E060E08AE0C3
:100A70000E942A0590E080E0CF910895CA3029F4C1
:100A80001092520D8DE00E9409058C2F0E940905DD
:100A9000F1CFCF9385E00E94C90480FF0FC080E0B2
:100AA0000E94C904C82F0E94C906CD3019F48AE0FB
:100AB0000E9409058C2FCF910C940905CF910895C0
:100AC000CF93C62F0E948F0A8FEF80BBC1BBEBE094
:100AD000F1E080818D7E808385E08A95F1F70000CA
:100AE000808180618083808182608083CF9108953E
:100AF0000E948F0A10BA11BAEBE0F1E080818B7E80
:100B0000808385E08A95F1F700008FB19081946130
:100B1000908308950F931F93CF93DF9380910F02DB
:100B2000833009F4B3C0A8F4813009F444C0CFE79E
:100B3000823009F476C0C0E060E08C2F81700E94A2
:100B40006005CF5FCF3FC1F7DF91CF911F910F912C
:100B50000895843009F4C8C01FE7CFEFD0E00FEF4D
:100B6000853049F76091590D8FEF860F8E3F28F041
:100B700080910E02819580930E0280E00E946005B4
:100B80006091590D81E00E9460054091530D509194
:100B9000540D57FDDFC08091570D9091580D01966F
:100BA000841795070CF0CAC09093580D8093570D89
:100BB0001150C1F6C9CFCFE7E091590DF0E0ED5FDC
:100BC000F74F649181E00E946005E091590DF0E0DB
:100BD000ED5FF74F649180E00E9460052091530D16
:100BE0003091540D37FD19C08091570D9091580DDB
:100BF0000196821793073CF49093580D8093570DFC
:100C0000C150D1F6A1CF1092580D1092570D80917E
:100C1000590D8F5F8093590DF3CF8091590D821B31
:100C2000F9CF8091590D87FF1DC06FEF80E00E94C2
:100C300060056FEF81E00E9460052091530D3091B7
:100C4000540D37FD1FC08091570D9091580D01969E
:100C5000821793076CF49093580D8093570DC150F1
:100C600001F772CF60E080E00E94600560E0E2CFB3
:100C70001092580D1092570D8091590D8F5F8093EF
:100C8000590DEDCF8091590D821BF9CFCFE76091BF
:100C9000590D80E00E9460056091590D81E00E942D
:100CA00060052091530D3091540D37FD19C080918E
:100CB000570D9091580D0196821793073CF490932D
:100CC000580D8093570DC15011F73ECF1092580D1B
:100CD0001092570D8091590D8F5F8093590DF3CF6E
:100CE0008091590D821BF9CFCFE7E091550DF0911E
:100CF000560DED5FFB4F649181E00E946005E0912D
:100D0000550DF091560DED5FFB4F649180E00E9410
:100D100060058091550D9091560D0196811524E046
:100D2000920738F49093560D8093550DC150E9F613
:100D30000BCF1092560D1092550DF8CF1092580D02
:100D40001092570D8091590D90910E02890F80934A
:100D5000590D2ECF20910E022403B001259F700D56
:100D600011248091590DFE01E81BF109E617F707E0
:100D70001CF40093590D1CCF249F202D1124209387
:100D8000590D16CF80E00E94780580FF0C948A05EB
:100D9000089590915C0DE92FF0E0E359F24F8F3701
:100DA00029F4915090935C0D108208959F5F909369
:100DB0005C0D80830895FF920F931F93CF93DF9371
:100DC000F62EC82FD0E08E01000F111FF801E75852
:100DD000FD4F81818F9380818F930E94F504CF52C4
:100DE000D24F0F900F908881882311F0F11012C01C
:100DF00081E0888370E060E08AE00E942A05F801C3
:100E0000EB59FD4F81818F9380818F930E94F50470
:100E10000F900F90DF91CF911F910F91FF90089548
:100E2000CF93DF93C82FD0E0E091100284E0E89FD9
:100E3000F0011124E35CFD4FEC0FFD1F8081811157
:100E40000DC08091AA028F938091A9028F930E9476
:100E5000F5040F900F90DF91CF910895FE01EE0FF2
:100E6000FF1FE157FD4F81818F9380818F938DEC20
:100E700092E09F938F930E94F504E091100284E02A
:100E8000E89FF0011124E35CFD4FEC0FFD1F808112
:100E90008093100261E00E94DB06E0911002F0E016
:100EA000EE0FFF1FEF5EFD4F808191819093610DEA
:100EB0008093600D0F900F900F900F90CCCFEF921A
:100EC000FF920F931F93CF93DF930BED1DE0F8017B
:100ED000819181110DC08DE0E23EF807C9F780EFE6
:100EE00092E09F938F930E94F5040F900F9028C07B
:100EF00086EE92E09F938F930E94F5040F900F90DF
:100F0000D0E0C0E08FEDE82E82E0F82EF80181916C
:100F10008F01882389F0FE01EE0FFF1FE15DFD4F79
:100F200081818F9380818F93FF92EF920E94F504CD
:100F30000F900F900F900F902196C730D10531F789
:100F4000DF91CF911F910F91FF90EF900895E09165
:100F50001002F0E0EB5DFD4FE081E7FF0BC08091F8
:100F6000AE028F938091AD028F930E94F5040F9093
:100F70000F900895EE0FFF0BE15DFD4F81818F9380
:100F800080818F9388E093E09F938F930E94F50474
:100F90000F900F900F900F900895CF92DF92EF92E5
:100FA000FF920F931F93CF93DF93D82FF92EE091E9
:100FB0001002F0E0EB5DFD4FC0800FE212E0C0E0F8
:100FC000C7FE0BC08091AE028F938091AD028F93CC
:100FD0000E94F5040F900F9034C0F801E080D1809A
:100FE0000E5F1F4FAE2DBD2DFD0101900020E9F7D2
:100FF0003197AF014A1B5B0B6D2F7F2D8E2D9D2DE1
:101000000E94670B892B31F5CC1228C0DF92EF923A
:1010100087E193E09F938F930E94F504E091100283
:10102000F0E0EB5DFD4FA0810A2E000CBB0BA5523A
:10103000B24F81E08C938FEF80830F900F900F90D1
:101040000F90DF91CF911F910F91FF90EF90DF9064
:10105000CF900895CF5FC73009F0BFCF87E293E00C
:101060009F93B5CF97E0EBEDFDE0DF01292F1D92B7
:101070002A95E9F7E1EDFDE0DF011D929A95E9F788
:10108000E5E2F2E09FEF9193B2E0EF32FB07D9F790
:10109000882319F11092100281E08093E10D85E020
:1010A0008093290281E080932A0282E080932C02BF
:1010B00010925B0D10924D0280911002E82FF0E02B
:1010C000EE0FFF1FEF5EFD4F208131813093610DE8
:1010D0002093600D60E00C94DB0680915A0D88230C
:1010E00079F081E0809310028091C5029091C60250
:1010F00090936A028093690284E080932702CFCFA5
:1011000081E0809310021092450283E080932702D1
:1011100086E08093260210922D02C1CFCF938230B9
:10112000A1F480915B0D811145C081E080935B0D3E
:101130001092DD0D8AE393E09F938F930E94F50454
:101140000F900F9081E0CF91089581110CC0809194
:101150005B0D813079F582E080935B0D1092DB0DA1
:1011600085E593E0E9CF843091F4C0915B0DC13007
:1011700009F582E080935B0D1092DF0D81E793E02B
:101180009F938F930E94F504C0935D0DD9CF81305A
:1011900089F480915B0D823069F41092DC0D8EE948
:1011A00093E09F938F930E94F50480915D0D0E94C0
:1011B0003208C6CF80E0C7CFE82FF0E0E552F24F0B
:1011C0009081911106C08091A6028F938091A50213
:1011D00037C0853009F443C078F4833021F184307E
:1011E00011F0833081F390911002993061F70E94E1
:1011F0008E08882341F30895863029F780911002E4
:10120000823011F583E0809345028091B0028F9384
:101210008091AF028F930E94F50481E080935A0D74
:101220000F900F90E8CF90911002923061F61092DB
:10123000DE0D809345028091B6028F938091B502B6
:101240008F930E94F504ECCF8111BDCF8CEF93E01A
:101250009F938F930E94F5041092E10DE1CF90913E
:101260001002943009F0AFCF1092E00D80934D0240
:101270008091BC028F938091BB02E2CFEF92FF92EC
:101280000F931F93CF93DF93182F092F8FE2E82E30
:1012900082E0F82ED0E0C0E0F701819191917F01CA
:1012A000FC0101900020E9F73197AF01481B590B71
:1012B000612F702F0E94670B892B49F48C2FDF91CF
:1012C000CF911F910F91FF90EF900C94DC08219625
:1012D000C730D10509F78091A6028F938091A502AE
:1012E0008F930E94F5040F900F90DF91CF911F9183
:1012F0000F91FF90EF9008950F931F93CF93DF937B
:10130000C82F70E060E08AE00E942A05C73009F427
:1013100055C0B8F5C53009F448C0C63009F454C00A
:101320008FEF8C0F843008F446C080E694E09F93E2
:101330008F930E94F504CDE8D2E00F900F900FED4F
:1013400012E08881998122969F938F931F930F9328
:101350000E94F5040F900F900F900F9082E0C13A19
:10136000D80779F78091A8028F938091A7028F9375
:101370000E94F5040F900F90DF91CF911F910F9174
:101380000895C830F1F0C93081F6E0919F02F091E4
:10139000A002DF010D900020E9F7CD018E1B9F0B0D
:1013A0008359924F0E94CD07DDCF60E080911002FB
:1013B0000E94DB06D7CF0E941007D4CF0E945F07A0
:1013C000D1CF0E94A707CECFE0919902F0919A0267
:1013D000DF010D900020E9F7CD018E1B9F0B835993
:1013E000924F0E943E09BECF0F931F93CF93DF937E
:1013F000E0915C0DE436B0F010925C0DEDE6FDE09E
:1014000084E6DF011D928A95E9F789E694E09F93CF
:101410008F930E94F5040F900F90DF91CF911F9151
:101420000F910895F0E0E459F24F80818A3011F075
:101430008D3099F70DE812E0D0E0C0E0F80181911D
:1014400091918F01FC0101900020E9F73197AF01E4
:10145000481B590B6DE67DE00E94670B892B69F4F0
:101460008C2F0E947C0910925C0DEDE6FDE084E675
:10147000DF011D928A95E9F7D0CF2196CA30D105B8
:10148000E9F68091A4028F938091A3028F930E942A
:10149000F5040F900F90E7CF8091C3029091C402A2
:1014A00090936A02809369028091BD029091BE027E
:1014B0009093A8028093A702089582E884BD84E0F7
:1014C00085BD80E487BD82E080936E0008951F9201
:1014D0000F920FB60F9211240BB60F922F933F93DA
:1014E0004F935F936F937F938F939F93AF93BF932C
:1014F000EF93FF930E94B40AFF91EF91BF91AF91D8
:101500009F918F917F916F915F914F913F912F911B
:101510000F900BBE0F900FBE0F901F9018958093E9
:10152000080108958FEF80BB8093070180930A0123
:101530001092080111BAEBE0F1E0108280818F6116
:1015400080838FE891E00197F1F700C0000080816F
:101550008E7F808308950E94C2060E9449050E94E2
:10156000F40990E080E008956091600D7091610D44
:101570006115710529F410926C0D10926B0D089590
:1015800080916B0D90916C0D019690936C0D8093F2
:101590006B0D2091640D3091650D4091690D509156
:1015A0006A0D8417950720F46217730721F40895D4
:1015B0006217730761F01092630D1092620D109222
:1015C0006C0D10926B0D7093650D6093640D2091FE
:1015D000620D3091630D45E0429FC001439F900D25
:1015E0001124680F791F45E050E086E69DE00E94D7
:1015F0005E0B8091690D90916A0D892B71F41092A8
:10160000630D1092620D6091600D7091610D45E067
:1016100050E086E69DE00E945E0B8091660D80930F
:101620000F028091670D9091680D20915E0D3091B1
:101630005F0D820F931F9093540D8093530D109262
:101640006C0D10926B0D8091620D9091630D01965F
:101650009093630D8093620D0895F8940E94920A0E
:101660000E94DB040E945D0A0E944C0A88EE90E012
:101670009093610D8093600DE1EDFDE08AE0DF0164
:101680001D928A95E9F7EBEDFDE087E0DF011D9201
:101690008A95E9F760E0809110020E94DB06789459
:1016A00088E199E20FB6F894A895809360000FBE88
:1016B00090936000A8950E94AB0AFCCFFB01DC016F
:1016C00002C005900D9241505040D8F70895FB019B
:1016D000DC014150504088F08D9181341CF08B35F5
:1016E0000CF4805E619161341CF06B350CF4605E2B
:1016F000861B611171F3990B0895881BFCCF6091D3
:10170000E40D7091E50D0C94C20D0F931F93CF93D0
:10171000DF93E091E40DF091E50D238110E000E00E
:1017200021FD0EC00FEF1FEFC801DF91CF911F9178
:101730000F9108951995892B11F00FEF1FEFCE012E
:10174000EC0189916091E40D7091E50DDB01189633
:10175000ED91FC918111EECF8AE01995892B21F34F
:10176000E1CFAB01BC018091E40D9091E50D0C94AB
:10177000B90B2F923F924F925F926F927F928F920E
:101780009F92AF92BF92CF92DF92EF92FF920F9310
:101790001F93CF93DF9300D000D000D00F920F9211
:1017A000CDB7DEB77C013B018A01FC0117821682AE
:1017B000838181FFCEC19AE0292ECE0101965C0182
:1017C000F7019381F30193FD859193FF81913F018F
:1017D000882309F446C1853239F493FD859193FF3E
:1017E00081913F01853229F4B70190E00E94C20D3A
:1017F000E7CF912C412C512CFFE1F51538F08B32BD
:1018000009F188F4803201F1833221F157FC3AC0AA
:1018100020ED280F2A3040F556FE1FC0929C200D67
:101820001124922E06C08D3291F0803379F768949E
:1018300050F8F30193FD859193FF81913F01811150
:10184000DBCF20C0689451F8689452F8F2CF6894C6
:1018500053F8EFCF689454F8ECCF429C200D11243C
:10186000422E689455F8E5CF8E3229F456FCF9C023
:10187000689456F8DECF8C3619F4689457F8D9CFAF
:101880008836B9F2982F9F7D95549330C0F08336F7
:10189000A1F18337C1F1833509F05BC0F801C19034
:1018A000D1908F01692D70E056FC02C06FEF7FEF81
:1018B000C6010E94AC0D4C01689457F80AC00C5F39
:1018C0001F4F2FE3298388248394912C6501E8948A
:1018D00057F853FC04C04814190409F018F5342CC7
:1018E0008114910431F5332009F46ACFB70180E205
:1018F00090E00E94C20D3A94F6CFF801808189836E
:101900000E5F1F4FE0CFF801C190D1908F01692D7C
:1019100070E056FC02C06FEF7FEFC6010E94B70D6A
:101920004C01D5CFB70180E290E00E94C20D4A94ED
:10193000D2CFF60157FC859157FE81916F01B70117
:1019400090E00E94C20D31103A94F1E08F1A910894
:10195000C7CF843619F0893609F074C0F80157FEF4
:101960006AC061917191819191918F01252D2F769E
:10197000D22E97FF09C090958095709561957F4F05
:101980008F4F9F4F6894D7F82AE030E0A5010E945E
:10199000F20DC82ECA188C2C5D2CD6FE0CC0E89413
:1019A00050F8C91440F4D4FE05C0D2FC03C0FD2D8C
:1019B000FE7E5F2E892C54FEA4C0FE01EC0DF11DAD
:1019C0008081803309F096C0252D297E522E852DE9
:1019D0008870382E53FCA4C050FE9EC09C2C8414EA
:1019E00018F44C0C942C981854FEA0C0B70180E356
:1019F00090E00E94C20D52FE09C088E790E051FEBF
:101A000002C088E590E0B7010E94C20DC91408F435
:101A100099C0CA94D12C9FEFC91AD90ACA0CDB1CF1
:101A2000F60182916F01B70190E00E94C20DAC14E3
:101A3000BD04B1F758CF61917191072E000C880B4E
:101A4000990B93CFD52CE894D4F82AE030E0853771
:101A5000E1F1952D997FD92E8F36A9F1F0F48835D3
:101A600051F1F701868197812B960FB6F894DEBF6E
:101A70000FBECDBFDF91CF911F910F91FF90EF90DF
:101A8000DF90CF90BF90AF909F908F907F906F909E
:101A90005F904F903F902F900895803749F088379E
:101AA00001F7D4FE02C06894D2F820E130E00DC006
:101AB0006894D4F8F6CF54FE03C0E92FE660DE2E1A
:101AC00020E132E002C028E030E0F801D7FE0DC08E
:101AD00061917191819191918F01A5010E94F20D07
:101AE000C82ECA18E894D7F856CF6191719190E04A
:101AF00080E0F2CF52FC02C0839469CF8394839438
:101B000066CF852D867809F462CFF6CFB70180E2E3
:101B100090E00E94C20D83948414C0F3312C64CFF2
:101B2000342C3818841408F45FCFF8CF852D8678CC
:101B300009F46CCF8BE251FE80E257FC8DE2B701D5
:101B400090E062CFB70180E390E00E94C20D9A94CA
:101B50005DCF8FEF9FEF88CFFC0105906150704003
:101B60000110D8F7809590958E0F9F1F0895FC0166
:101B70006150704001900110D8F7809590958E0FBC
:101B80009F1F08950F931F93CF93DF93182F092F53
:101B9000EB018B8181FD09C01FEF0FEF812F902F8B
:101BA000DF91CF911F910F91089582FF14C02E8174
:101BB0003F818C819D81281739073CF4E881F981A8
:101BC000CF0101969983888310838E819F8101962E
:101BD0009F838E83E3CFE885F985812F1995892B23
:101BE000A1F3DACFFA01AA27283051F1203181F18F
:101BF000E8946F936E7F6E5F7F4F8F4F9F4FAF4F15
:101C0000B1E03ED0B4E03CD0670F781F891F9A1F27
:101C1000A11D680F791F8A1F911DA11D6A0F711DDB
:101C2000811D911DA11D20D009F468943F912AE0E7
:101C3000269F11243019305D3193DEF6CF010895CF
:101C4000462F4770405D4193B3E00FD0C9F7F6CF00
:101C5000462F4F70405D4A3318F0495D31FD4052C8
:101C6000419302D0A9F7EACFB4E0A695979587955E
:101C700077956795BA95C9F700976105710508953D
:101C80009B01AC010A2E06945795479537952795E9
:101C9000BA95C9F7620F731F841F951FA01D089581
:041CA000F894FFCFE6
:101CA40000000002000000002A05000000000101FD
:101CB40001E8009701A0029701A0020000000000C3
:101CC4000000000000FF0603FF0501FF0200FF7A89
:101CD40004860492049B04A304A904AD0400000038
:101CE40000020000000001000000020400000000E7
:101CF40003070409060800050000050000000600AB
:101D04000000000005B40448050000D10580062940
:101D140007C707660810096409460A4E0A5A0A6882
:101D24000A720A7D0A870A930A990AA20AB00AB5B6
:101D34000ABB0AC10AC60ACB0AD40AD80AE20AE9CB
:101D44000AEE0AF40A050B0000190B300B410B597B
:101D54000B610B6D0B830B920BA10BB00BC60B002D
:101D6400000000E00B970C494E49540D004D6F766E
:101D7400696E6720746F7761726473202573002025
:101D8400202020257300596F7520686176653A001C
:101D9400596F757220696E76656E746F72792069F9
:101DA4007320656D70747900596F7520666F756E58
:101DB40064206120257300596F7520746F6F6B2048
:101DC40074686520257300546861742773206E6FEE
:101DD4007420686572652E2E2E00596F7520636F0E
:101DE4006E6E656374656420746865206B657962E2
:101DF4006F61726400596F7520696E7365746564F0
:101E04002074686520666C6F707079206469736BE8
:101E140000596F7520696E73657274656420746807
:101E24006520666C65736820696E746F20746865DC
:101E340020666C6F70707920647269766500596FE2
:101E4400752073746172742074686520636F6D709B
:101E5400757465722077697468207468652073638B
:101E64007265776472697665722C20736974206474
:101E74006F776E20616E6420776174636820697483
:101E840020626F6F7420696E746F206120746578AE
:101E940074616476656E747572653A00596F752065
:101EA40063727920666F722068656C702E204974A5
:101EB4002773206E6F207573652E20596F7520610E
:101EC4007474656D707420746F2073686F6F742000
:101ED400796F757273656C662E2049742773206E52
:101EE4006F207573652E2E2E20596F752072756EB6
:101EF400206F7574206F662062756C6C6574730056
:101F0400596F752063616E3A000A546F6F206D75C6
:101F1400636820696E7075742100464C4F505059A7
:101F2400204449534B005343524557445249564564
:101F340052004B4559424F4152440053415553417D
:101F4400474500464C455348004B455900504953BA
:101F5400544F4C00596F7520737461726520696E1B
:101F6400746F206120766F6964206F66206E6F74D1
:101F740068696E676E6573732E20596F752073657B
:101F840065206E6F6F6E652C20796F7520686561B2
:101F940072206E6F6F6E652C796F75206665656C47
:101FA40020736F6D656F6E652E20596F75206C6F91
:101FB4006F6B2061726F756E642C20616E64207388
:101FC4006565206E6F7468696E672C20796574206E
:101FD400796F7520617265206E6F206C6573732054
:101FE4007363617265642E00596F75206172652098
:101FF4006F6E20746865206465616420656E64207A
:102004006F662061206C6F6E656C7920726F6164FD
:102014002E20596F75206C6F6F6B2072696768741E
:1020240020616E64206C656674206F6620796F751C
:102034002C2062757420796F752063616E6E6F74E5
:102044002072656D656D6265722077687920796F9D
:10205400752061726520686572652E2E2E20596F79
:102064007520617265207465727269666965642E93
:1020740000596F752066696E642061206669726517
:10208400706C61636520696E20746865206D696495
:10209400646C65206F662074686520776F6F647365
:1020A4002E204120737472656574206C65616473BD
:1020B40020746F2069742066726F6D2074686520C7
:1020C400776573742E20546865206669726520698B
:1020D4006E20746865206D6964646C65206F662089
:1020E40074686520706C616365206973207374691A
:1020F4006C6C206275726E696E672061732069660C
:1021040020736F6D656F6E6520686164206C656611
:102114007420696E20612068757272792E2E2E00EB
:10212400596F752074726176656C20646F776E20C8
:1021340074686520726F61642E204974206861732D
:10214400206E6F206C69676874732C20627574202C
:10215400746865206D6F6F6E207368696E65732097
:102164006272696768742E2054686520726F6164B6
:1021740020656E64732077697468206120686F75C8
:10218400736520746F20796F7572206C6566742E88
:102194002054686520686F7573657320646F6F726F
:1021A400206D617420697320696E207468652072E3
:1021B4006F61642E2049747320646F6F7220697399
:1021C400206C6F636B65642E00596F7520656E74A7
:1021D400657220746865206C6F6E672068616C6C32
:1021E400776179206F6620746865206F6C6420685D
:1021F4006F7573652E2049742068617320646F6F56
:102204007273206F6E20616C6C2077616C6C732E1E
:102214002054686520646F6F7273206C6F6F6B203D
:1022240061206C6974746C652077656972656420DB
:102234006265636175736520746865792061726590
:1022440020666C617420616E6420646F6E27742054
:102254006861766520612068616E646C6520746FC6
:102264002070756C6C2E00596F7520656E746572E4
:102274002061206C6172676520726F6F6D207769D1
:1022840074682061206665772063686169727320D1
:10229400616E642061207475626520545620696EF5
:1022A400736964652069742E20496E207468652002
:1022B40063656E7465722074686572652069732045
:1022C400612074696C65207461626C65207769743F
:1022D400682061207661736520616E6420666C6F8E
:1022E40077657273206F6E2069742E2054686520A0
:1022F400666C6F776572732061726520626C6F6FB4
:102304006D696E672E00596F7520656E7465722055
:10231400746865206174746963206F6620746865ED
:1023240020686F7573652E2049742068617320617D
:102334002066657720626F6F6B7320616E64207313
:102344006F6D652066696C657273207769746820A7
:10235400646F63756D656E747320696E736964650B
:102364002069742E205468652066696C6572732038
:1023740061726520676C75656420746F6765746845
:1023840065722E2054686520626F6F6B7320746FC2
:102394006F2E20596F752063616E277420737461EA
:1023A4006E642075702073747261696768742E009E
:1023B400596F7520656E746572207468652062615A
:1023C40073656D656E742E20596F752066696E6431
:1023D40020736F6D6520706F7461746F657320690D
:1023E4006E206120636F726E657220616E6420617D
:1023F40020736B656C65746F6E2061746F702069F7
:10240400742E2000596F7520656E746572206120EA
:10241400726F6F6D207768696368206C6F6F6B7380
:10242400206C696B6520796F7527766520747261FD
:1024340076656C65642066726F6D20616E206F6CCA
:102444006420686F75736520746F207468652063F9
:10245400616D707573206F66206120756E69766595
:1024640072736974792E20546865726520697320CB
:1024740061206C61726765206D616368696E6520B7
:102484007769746861207369676E202044494749FD
:1024940054414C206F6E2069742E204974206C6F57
:1024A4006F6B73206C696B65206120636F6D707551
:1024B4007465722C2074686F75676820796F75274E
:1024C4007665206E65766572207365656E206F6E25
:1024D4006520696E20706572736F6E206265666F29
:1024E40072652E2E2E004E4F5448494E47004C4FD5
:1024F4004E454C5920524F414400532F4E204449DD
:10250400525420524F41440046495245504C414395
:102514004500452F5720537472656574004F4C4431
:1025240020484F555345004C4956494E4720524F79
:102534004F4D00415454494300424153454D454E8B
:102544005400434F4D505554455220524F4F4D0067
:1025540068656C70006E6F72746800736F75746870
:1025640000776573740065617374006465736372E6
:102574006962650075736500696E76656E746F7265
:1025840079007365617263680074616B650045521C
:10259400524F5200496E76616C696420636F6D6DB1
:1025A400616E642100596F752063616E2774207514
:1025B400736520746861742100596F752063616EBE
:1025C400277420676F207468617420776179210013
:1025D400594F55204D415920414354204E4F5721C6
:1025E400005468657265206973206E6F7468696E43
:1025F4006720686572652E2E0069742064696564BD
:10260400006974207375727669766564006120626E
:1026140065617220626C6F636B73207468652077E8
:1026240061790069742072616E20617761792E2E60
:102634002E00697420776F6E27742073746172742E
:1026440000796F752063616E27742074797065005A
:10265400796F7520756E6C6F636B65642074686543
:1026640020646F6F7200576861742061726520790D
:102674006F7520676F696E6720746F20646F3F0009
:10268400596F752074726176656C2061206269747B
:1026940020746F776172647320746865206D6F6F46
:1026A4006E2C20796F75207468696E6B2074686174
:1026B400742773207468652077617920746F2067AC
:1026C4006F2E20596F752066696E642061206265E3
:1026D400617220696E20746865206D6964646C653C
:1026E400206F662074686520726F616420736C6566
:1026F4006570696E67207365656D696E676C7920B6
:10270400696E2070656163652E2054686520776169
:102714007920746F20746865206E6F727468206904
:102724007320626C6F636B656420627920746865E2
:1027340020626561722E00596F7520617472617632
:10274400656C20612062697420746F7761726473B0
:1027540020746865206D6F6F6E2C20796F75204B27
:102764004E4F57207468617427732074686520770E
:10277400617920746F20676F2E20596F7520736DF7
:10278400656C6C20736F6D657468696E672077651E
:102794006972656420616C6F6E6720746865207768
:1027A40061792C2062757420796F7520646F6E27AF
:1027B40074206B6E6F77207768657265206974206A
:1027C400697320636F6D696E672066726F6D2E206A
:1027D400536D656C6C73206C696B6520666C6573F6
:1027E4006820726F7474696E6720617761792E2E28
:0227F4002E00B5
:00000001FF

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -33,6 +33,12 @@
#define UART_REG_MSR 6
#define UART_REG_SCR 7
/* The printf function in the background performs automatic column wrapping by
* finding the first space character within 10 characters ofthe display columns
* and replacingit with a newline character
*/
#define DISPLAY_COLUMNS 80
void init_16550();
void write_to_uart(uint8_t addr, uint8_t data);
uint8_t read_from_uart(uint8_t addr);

View file

@ -23,6 +23,13 @@
extern char command_buffer[100];
extern uint8_t command_buffer_pointer;
#define COMPUTER_STATE_NOTHING 0
#define COMPUTER_STATE_KEYBOARD 1
#define COMPUTER_STATE_FLOPPY 2
extern uint8_t computer_state; /* FSM for the computer */
extern bool bear_shot;
extern uint8_t current_room;
void routine_game();
@ -33,8 +40,12 @@ void move_direction(uint8_t direction);
void describe_room(uint8_t room, bool auto_desc);
void print_inventory();
void print_room_item();
void consume_room_item();
void consume_room_item(const char* item_name);
void use_item(const char* item_name);
void use_item_id(uint8_t item_id);
bool perform_computer_action(uint8_t action_id);
void reset_game(bool fleshed);
void init_game();
#endif

View file

@ -38,8 +38,10 @@ extern const struct tone_t lonely_road_track[] PROGMEM;
extern const struct tone_t intro_track[] PROGMEM;
extern const struct tone_t * current_track;
extern int16_t global_frequency_offset; /* Added to every playing song */
void update_sound();
void init_sound();
#endif

View file

@ -51,25 +51,27 @@
#define ROOM_LIVINGROOM 0x06
#define ROOM_ATTIC 0x07
#define ROOM_BASEMENT 0x08
#define ROOM_COMPUTERROM 0x09
#define ROOM_COMPUTER 0x09
#define NUM_ITEMS 0x07
#define ITEM_FLOPPY 0x00
#define ITEM_SCREWDRIVER 0x01
#define ITEM_KEY 0x02
#define ITEM_KEYBOARD 0x02
#define ITEM_SAUSAGE 0x03
#define ITEM_FLESH 0x04
#define ITEM_KEYBOARD 0x05
#define ITEM_KEY 0x05
#define ITEM_PISTOL 0x06
extern const uint8_t sine_table[256] PROGMEM;
extern const uint8_t noise_table[1024] PROGMEM;
extern const char* text_table[];
extern char* sndirtroad_msg[2];
extern char* user_action_req_msgs[3];
extern const char* info_table[];
extern const char* action_table[NUM_ACTIONS];
extern const char* room_table[NUM_ROOMS];
extern const char* room_description_table[NUM_ROOMS];
extern char* room_description_table[NUM_ROOMS];
extern uint8_t room_map_table[NUM_ROOMS][4];
extern bool room_visited_table[NUM_ROOMS];
extern const char* item_table[NUM_ITEMS];

View file

@ -81,7 +81,14 @@ int println(const char* output, ...){
/* Writes a character to the 16550 uart for transmission with cr lf magic */
int putchar_16550(char var, FILE *stream __attribute__((unused))){
static uint8_t column_cnt = 0;
column_cnt++;
if(var == ' ' && column_cnt > (DISPLAY_COLUMNS - 10)){
putchar_16550('\n',NULL);
return 0;
}
if(var == '\n'){
column_cnt = 0x00;
writechar_16550('\r');
}

View file

@ -27,6 +27,8 @@ uint8_t command_buffer_pointer = 0x00;
uint8_t current_room = ROOM_LONELYROAD;
uint8_t computer_state = 0;
bool bear_shot = false;
void routine_game(){
@ -106,7 +108,8 @@ void perform_action(uint8_t action_id){
print_room_item();
break;
case ACTION_TAKE:
consume_room_item();
consume_room_item(command_buffer+
strlen(action_table[ACTION_TAKE])+1);
break;
case ACTION_USE:
use_item(command_buffer+
@ -178,15 +181,30 @@ void print_room_item(){
return;
}
void consume_room_item(){
void consume_room_item(const char* item_name){
if(item_room_map[current_room] < 0){
println(info_table[6]);
}else{
println("You took the %s",
item_table[item_room_map[current_room]]);
for(int8_t i = 0; i < NUM_ITEMS; i++){
if(strncasecmp(item_table[i], item_name,
strlen(item_table[i])) == 0){
if(item_room_map[current_room] != i){
break;
}
println("You took the %s",
item_table[item_room_map[
current_room]]);
inventory[item_room_map[current_room]] = true;
item_room_map[current_room] = -1;
return;
}
}
println("That's not here...");
inventory[item_room_map[current_room]] = true;
item_room_map[current_room] = -1;
}
return;
}
@ -222,9 +240,139 @@ void use_item_id(uint8_t item_id){
return;
}
break;
case ITEM_PISTOL:
if(current_room == ROOM_SNDIRTROAD){
room_map_table[current_room][DIRECTION_NORTH] =
ROOM_FIREPLACE;
println(info_table[7]);
bear_shot = true;
return;
} else if(current_room == ROOM_NOTHING){
/* The real end i guess. I won't put this in the
* info table as it *SHOULD* only be displayed
* once.
*/
println("You cry for help. It's no use. You "
"attempt to shoot yourself. It's no "
"use... You run out of bullets");
inventory[ITEM_PISTOL] = false;
return;
}
break;
case ITEM_KEY:
if(current_room == ROOM_EWSTREET){
inventory[ITEM_KEY] = false;
room_map_table[current_room][DIRECTION_NORTH] =
ROOM_OLDHOUSE;
println(info_table[13]);
return;
}
break;
case ITEM_FLOPPY:
case ITEM_FLESH:
case ITEM_SCREWDRIVER:
case ITEM_KEYBOARD:
if(current_room == ROOM_COMPUTER){
if(perform_computer_action(item_id)){
return;
}
}
break;
};
println(info_table[2]);
return;
}
bool perform_computer_action(uint8_t item_id){
static bool fleshed = false;
if(item_id == ITEM_KEYBOARD &&
computer_state == COMPUTER_STATE_NOTHING){
computer_state = COMPUTER_STATE_KEYBOARD;
inventory[item_id] = false;
println("You connected the keyboard");
return true;
}
if(item_id == ITEM_FLOPPY &&
computer_state == COMPUTER_STATE_KEYBOARD){
computer_state = COMPUTER_STATE_FLOPPY;
inventory[item_id] = false;
println("You inseted the floppy disk");
return true;
}
if(item_id == ITEM_FLESH &&
computer_state == COMPUTER_STATE_KEYBOARD){
computer_state = COMPUTER_STATE_FLOPPY;
inventory[item_id] = false;
println("You inserted the flesh into the floppy drive");
fleshed = true;
return true;
}
if(item_id == ITEM_SCREWDRIVER &&
computer_state == COMPUTER_STATE_FLOPPY){
computer_state = COMPUTER_STATE_FLOPPY;
inventory[item_id] = false;
/* Perform a reset of the game */
println("You start the computer with the screwdriver, sit down"
" and watch it boot into a textadventure:");
reset_game(fleshed);
return true;
}
return false;
}
/* Resets the game into "original" state or the bear dead state or the FLESH
* game state. FLESH is basically the end. You need to reset your computer
* afterwards.
*/
void reset_game(bool fleshed){
/* clear inventory */
memset(inventory, 0, sizeof(inventory));
/* Reset rooms visited */
memset(room_visited_table, 0, sizeof(inventory));
/* Reset items in rooms */
for(size_t i = 0; i < NUM_ROOMS; i++){
item_room_map[i] = -1;
}
if(fleshed){
current_room = ROOM_NOTHING;
inventory[ITEM_PISTOL] = true;
}else if(bear_shot){
current_room = ROOM_LONELYROAD;
room_description_table[ROOM_SNDIRTROAD] = sndirtroad_msg[1];
item_room_map[ROOM_SNDIRTROAD] = ITEM_FLESH;
}else{
current_room = ROOM_LONELYROAD;
room_map_table[ROOM_SNDIRTROAD][DIRECTION_NORTH] = 0x00;
item_room_map[ROOM_SNDIRTROAD] = ITEM_SAUSAGE;
item_room_map[ROOM_LONELYROAD] = ITEM_PISTOL;
item_room_map[ROOM_BASEMENT] = ITEM_FLOPPY;
}
item_room_map[ROOM_EWSTREET] = ITEM_KEY;
item_room_map[ROOM_OLDHOUSE] = ITEM_SCREWDRIVER;
item_room_map[ROOM_ATTIC] = ITEM_KEYBOARD;
computer_state = COMPUTER_STATE_NOTHING;
room_map_table[ROOM_EWSTREET][DIRECTION_NORTH] = 0x00;
current_track = room_track_map[current_room];
describe_room(current_room, false);
return;
}
void init_game(){
room_description_table[ROOM_SNDIRTROAD] = sndirtroad_msg[0];
info_table[3] = user_action_req_msgs[0];
return;
}

View file

@ -83,6 +83,7 @@ int main(){
reset_modules();
init_uart();
init_interrupts();
init_game();
current_track = intro_track;
memset(room_visited_table, 0, NUM_ROOMS);
memset(inventory, 0, NUM_ITEMS);
@ -92,7 +93,7 @@ int main(){
* finish it's task within the specified time, the watchdog will reset
* the atmel cookie.
*/
wdt_enable(WDTO_1S);
wdt_enable(WDTO_8S);
while(1){
wdt_reset();

View file

@ -214,6 +214,7 @@ const struct tone_t intro_track[] PROGMEM =
};
const struct tone_t *current_track = NULL;
int16_t global_frequency_offset = 0x00;
/* Loops a track indefinitely and changes voices according to predefined tables.
* A new track resets the internal state. A voice with a length of 0ms is used
@ -251,12 +252,10 @@ void update_sound(){
}
dac_mode = current_tone.waveform;
dac_frequency_deviation = current_tone.frequency_deviation;
dac_frequency_deviation = current_tone.frequency_deviation +
global_frequency_offset;
audio_time = 0x00;
tone_pointer++;
}
return;
}

View file

@ -15,6 +15,7 @@
*/
#include "structures.h"
#include <stddef.h>
const uint8_t sine_table[256] PROGMEM = {
0x7f,0x82,0x85,0x88,
@ -342,11 +343,24 @@ const uint8_t noise_table[1024] PROGMEM = {
0x24, 0x32, 0x3a, 0xb8
};
char* sndirtroad_msg[2] = {
"You travel a bit towards the moon, you think that's the way to go. You"
" find a bear in the middle of the road sleeping seemingly in peace. "
"The way to the north is blocked by the bear.",
"You atravel a bit towards the moon, you KNOW that's the way to go. You"
" smell something weired along the way, but you don't know where it is "
"coming from. Smells like flesh rotting away..."
};
char* user_action_req_msgs[3] = {
"What are you going to do?"
};
const char* info_table[] = {
"ERROR", // 0
"Invalid command!", // 1
"You can't use that!", // 2
"What are you going to do?", // 3
NULL, // 3
"You can't go that way!", // 4
"YOU MAY ACT NOW!", // 5
"There is nothing here..", // 6
@ -355,7 +369,8 @@ const char* info_table[] = {
"a bear blocks the way", // 9
"it ran away...", // 10
"it won't start", // 11
"you can't type" // 12
"you can't type", // 12
"you unlocked the door" // 13
};
const char* action_table[NUM_ACTIONS] = {
@ -384,60 +399,82 @@ const char* room_table[] = {
"COMPUTER ROOM"
};
const char* room_description_table[sizeof(room_table)/sizeof(const char*)] = {
char* room_description_table[sizeof(room_table)/sizeof(const char*)] = {
"You stare into a void of nothingness. You see noone, you hear noone,"
"you feel someone.\nYou look around, and see nothing, yet "
"you are no less scared. You have won..",
"You are on the dead end of a lonely road. You look right and left of"
"you, but\nyou cannot remember why you are here... You are terrified.",
"You travel a bit towards the moon, you think that's the way to go. You"
" find a \nbear in the middle of the road sleeping seemingly in peace.",
"FIREPLACE",
"W/W STREET",
"OLD HOUSE",
"LIVING ROOM",
"ATTIC",
"BASEMENT",
"COMPUTER ROOM"
"you feel someone. You look around, and see nothing, yet "
"you are no less scared.",
"You are on the dead end of a lonely road. You look right and left of "
"you, but you cannot remember why you are here... You are terrified.",
NULL,
"You find a fireplace in the middle of the woods. A street leads to it "
"from the west. The fire in the middle of the place is still burning as"
" if someone had left in a hurry...",
"You travel down the road. It has no lights, but the moon shines bright"
". The road ends with a house to your left. The houses door mat is in "
"the road. Its door is locked.",
"You enter the long hallway of the old house. It has doors on all walls"
". The doors look a little weired because they are flat and don't have "
"a handle to pull.",
"You enter a large room with a few chairs and a tube TV inside it. In "
"the center there is a tile table with a vase and flowers on it. The "
"flowers are blooming.",
"You enter the attic of the house. It has a few books and some filers "
"with documents inside it. The filers are glued together. The books too"
". You can't stand up straight.",
"You enter the basement. You find some potatoes in a corner and a "
"skeleton atop it. ",
"You enter a room which looks like you've traveled from an old house "
"to the campus of a university. There is a large machine witha sign "
"DIGITAL on it. It looks like a computer, though you've never seen one "
"in person before..."
};
bool room_visited_table[sizeof(room_table)/sizeof(const char*)];
uint8_t room_map_table[sizeof(room_table)/sizeof(const char*)]
[4] = {
{0,0,0,0},
{2,0,0,0}, /* S/N DIRT ROAD */
{/*3*/0,1,0,0}, /* FIREPLACE, Progress locked until bear tamed */
{0,0,4,2}, /* E/W STREET */
/* NORTH, SOUTH, WEST, EAST */
{0,0,0,0}, /* 0 nothing */
{2,0,0,0}, /* 1 LONELY ROAD */
{0,1,0,0}, /* 2 S/N DIRT ROAD */
{0,2,4,0}, /* 3 FIREPLACE */
{0,0,0,3}, /* 4 E/W STREET */
{7,4,9,6}, /* 5 OLD HOUSE */
{8,0,5,0}, /* 6 LIVING ROOM */
{0,5,0,0}, /* 7 ATTIC */
{0,6,0,0}, /* 8 BASEMENT */
{0,0,0,5} /* 9 COMPUTERROOM */
};
const char* item_table[NUM_ITEMS] = {
"FLOPPY DISK",
"SCREW DRIVER",
"KEY",
"SAUSAGE",
"FLESH",
"KEYBOARD",
"PISTOL"
"FLOPPY DISK", /* 0 */
"SCREWDRIVER", /* 1 */
"KEYBOARD", /* 2 */
"SAUSAGE", /* 3 */
"FLESH", /* 4 */
"KEY", /* 5 */
"PISTOL" /* 6 */
};
bool inventory[sizeof(item_table)/sizeof(const char*)];
int8_t item_room_map[NUM_ROOMS] = {
-1,
6,
3,
-1,
-1,
-1,
-1,
-1,
-1,
-1
-1, /* 0 NOTHING */
ITEM_PISTOL, /* 1 LONELY ROAD */
ITEM_SAUSAGE, /* 2 S/N DIRT ROAD */
-1, /* 3 FIREPLACE */
ITEM_KEY, /* 4 E/W STREET*/
ITEM_SCREWDRIVER, /* 5 OLD HOUSE */
-1, /* 6 LIVING ROOM */
ITEM_KEYBOARD, /* 7 ATTIC */
ITEM_FLOPPY, /* 8 BASEMENT */
-1 /* 9 COMPUTERROOM */
};
const struct tone_t * room_track_map[NUM_ROOMS] = {
intro_track,
lonely_road_track,
computer_room_track,
lonely_road_track,
computer_room_track
};

BIN
documents/mst1/elf.pdf Normal file

Binary file not shown.

View file

@ -233,25 +233,33 @@
\abx@aux@segm{0}{0}{ascii}
\abx@aux@cite{vt100}
\abx@aux@segm{0}{0}{vt100}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.2.3}Track switching}{42}{subsubsection.4.2.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}User command interpretation}{42}{subsection.4.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.3.1}Command structure and pasring}{42}{subsubsection.4.3.1}\protected@file@percent }
\newlabel{lst:textadv-uart-recv}{{XV}{42}{The UART char receive code}{lstlisting.15}{}}
\@writefile{lol}{\contentsline {lstlisting}{\numberline {XV}The UART char receive code}{42}{lstlisting.15}\protected@file@percent }
\newlabel{lst:textadv-ingest}{{XVI}{42}{The character ingest function}{lstlisting.16}{}}
\@writefile{lol}{\contentsline {lstlisting}{\numberline {XVI}The character ingest function}{42}{lstlisting.16}\protected@file@percent }
\abx@aux@cite{ascii}
\abx@aux@segm{0}{0}{ascii}
\abx@aux@cite{vt100}
\abx@aux@segm{0}{0}{vt100}
\newlabel{lst:textadv-parsecmd}{{XVII}{43}{The command parsing function}{lstlisting.17}{}}
\@writefile{lol}{\contentsline {lstlisting}{\numberline {XVII}The command parsing function}{43}{lstlisting.17}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.3.2}Command parameters}{44}{subsubsection.4.3.2}\protected@file@percent }
\newlabel{lst:textadv-perfact}{{XVIII}{44}{The command execution routine}{lstlisting.18}{}}
\@writefile{lol}{\contentsline {lstlisting}{\numberline {XVIII}The command execution routine}{44}{lstlisting.18}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.2.3}Track switching}{42}{subsubsection.4.2.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}User command interpretation}{42}{subsection.4.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.3.1}Command structure and parsing}{42}{subsubsection.4.3.1}\protected@file@percent }
\newlabel{lst:textadv-ingest}{{XV}{42}{The character ingest function}{lstlisting.15}{}}
\@writefile{lol}{\contentsline {lstlisting}{\numberline {XV}The character ingest function}{42}{lstlisting.15}\protected@file@percent }
\newlabel{lst:textadv-parsecmd}{{XVI}{43}{The command parsing function}{lstlisting.16}{}}
\@writefile{lol}{\contentsline {lstlisting}{\numberline {XVI}The command parsing function}{43}{lstlisting.16}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.3.2}Command parameters}{43}{subsubsection.4.3.2}\protected@file@percent }
\newlabel{lst:textadv-perfact}{{XVII}{44}{The command execution routine}{lstlisting.17}{}}
\@writefile{lol}{\contentsline {lstlisting}{\numberline {XVII}The command execution routine}{44}{lstlisting.17}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.4}Gameplay}{45}{subsection.4.4}\protected@file@percent }
\abx@aux@cite{atmega2560}
\abx@aux@segm{0}{0}{atmega2560}
\abx@aux@cite{elf}
\abx@aux@segm{0}{0}{elf}
\abx@aux@cite{progmem}
\abx@aux@segm{0}{0}{progmem}
\@writefile{lof}{\contentsline {figure}{\numberline {xxix}{\ignorespaces A regular beginning of the game\relax }}{46}{figure.caption.29}\protected@file@percent }
\newlabel{fig:tetadv_gameplay}{{xxix}{46}{A regular beginning of the game\relax }{figure.caption.29}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.5}Memory constraints}{46}{subsection.4.5}\protected@file@percent }
\babel@aux{ngerman}{}
\@writefile{toc}{\contentsline {section}{\numberline {5}Erkl"arung der Eigenst"andigkeit der Arbeit}{46}{section.5}\protected@file@percent }
\HyPL@Entry{52<</S/R>>}
\@writefile{toc}{\contentsline {section}{\numberline {5}Erkl"arung der Eigenst"andigkeit der Arbeit}{48}{section.5}\protected@file@percent }
\HyPL@Entry{54<</S/R>>}
\babel@aux{english}{}
\@writefile{toc}{\contentsline {section}{\numberline {I\tmspace +\thickmuskip {.2777em}}List of Figures}{I}{section.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {II\tmspace +\thickmuskip {.2777em}}List of Tables}{I}{section.2}\protected@file@percent }
@ -273,3 +281,5 @@
\abx@aux@defaultrefcontext{0}{dunnet}{none/global//global/global}
\abx@aux@defaultrefcontext{0}{ascii}{none/global//global/global}
\abx@aux@defaultrefcontext{0}{vt100}{none/global//global/global}
\abx@aux@defaultrefcontext{0}{elf}{none/global//global/global}
\abx@aux@defaultrefcontext{0}{progmem}{none/global//global/global}

View file

@ -320,6 +320,55 @@
\verb https://vt100.net/docs/vt100-tm/ek-vt100-tm-002.pdf
\endverb
\endentry
\entry{elf}{report}{}
\list{institution}{1}{%
{TIS Committee}%
}
\field{sortinit}{3}
\field{sortinithash}{a37a8ef248a93c322189792c34fc68c9}
\field{labeltitlesource}{title}
\field{month}{5}
\field{title}{Tool Interface Standard (TIS)Executable and Linking Format (ELF) Specification}
\field{type}{Standard}
\field{volume}{1995}
\field{year}{1995}
\verb{urlraw}
\verb https://refspecs.linuxbase.org/elf/elf.pdf
\endverb
\verb{url}
\verb https://refspecs.linuxbase.org/elf/elf.pdf
\endverb
\endentry
\entry{progmem}{manual}{}
\name{author}{1}{}{%
{{hash=12972a04b7b7cffffa3969738ed7102a}{%
family={Author},
familyi={A\bibinitperiod},
given={Unknown},
giveni={U\bibinitperiod}}}%
}
\list{organization}{1}{%
{avr-libc 2.0.0 Standard C library for AVR-GCC}%
}
\strng{namehash}{12972a04b7b7cffffa3969738ed7102a}
\strng{fullhash}{12972a04b7b7cffffa3969738ed7102a}
\strng{bibnamehash}{12972a04b7b7cffffa3969738ed7102a}
\strng{authorbibnamehash}{12972a04b7b7cffffa3969738ed7102a}
\strng{authornamehash}{12972a04b7b7cffffa3969738ed7102a}
\strng{authorfullhash}{12972a04b7b7cffffa3969738ed7102a}
\field{sortinit}{3}
\field{sortinithash}{a37a8ef248a93c322189792c34fc68c9}
\field{labelnamesource}{author}
\field{labeltitlesource}{title}
\field{title}{Data in Program Space}
\field{year}{2016}
\verb{urlraw}
\verb https://www.nongnu.org/avr-libc/user-manual/pgmspace.html
\endverb
\verb{url}
\verb https://www.nongnu.org/avr-libc/user-manual/pgmspace.html
\endverb
\endentry
\enddatalist
\endrefsection
\endinput

View file

@ -2165,6 +2165,9 @@
<bcf:citekey order="34">vt100</bcf:citekey>
<bcf:citekey order="35">ascii</bcf:citekey>
<bcf:citekey order="36">vt100</bcf:citekey>
<bcf:citekey order="37">atmega2560</bcf:citekey>
<bcf:citekey order="38">elf</bcf:citekey>
<bcf:citekey order="39">progmem</bcf:citekey>
</bcf:section>
<!-- SORTING TEMPLATES -->
<bcf:sortingtemplate name="none">

View file

@ -1,17 +1,17 @@
[0] Config.pm:304> INFO - This is Biber 2.13
[0] Config.pm:307> INFO - Logfile is 'main.blg'
[19] biber:315> INFO - === Mon Mar 23, 2020, 02:06:00
[30] Biber.pm:375> INFO - Reading 'main.bcf'
[85] Biber.pm:905> INFO - Found 15 citekeys in bib section 0
[96] Biber.pm:4196> INFO - Processing section 0
[97] Utils.pm:75> INFO - Globbing data source './bibliographies/DP.bib'
[97] Utils.pm:91> INFO - Globbed data source './bibliographies/DP.bib' to ./bibliographies/DP.bib
[106] Biber.pm:4373> INFO - Looking for bibtex format file './bibliographies/DP.bib' for section 0
[107] bibtex.pm:1462> INFO - LaTeX decoding ...
[120] bibtex.pm:1281> INFO - Found BibTeX data source './bibliographies/DP.bib'
[147] UCollate.pm:68> INFO - Overriding locale 'de-DE' defaults 'variable = shifted' with 'variable = non-ignorable'
[147] UCollate.pm:68> INFO - Overriding locale 'de-DE' defaults 'normalization = NFD' with 'normalization = prenormalized'
[147] Biber.pm:4024> INFO - Sorting list 'none/global//global/global' of type 'entry' with template 'none' and locale 'de-DE'
[147] Biber.pm:4030> INFO - No sort tailoring available for locale 'de-DE'
[157] bbl.pm:648> INFO - Writing 'main.bbl' with encoding 'UTF-8'
[160] bbl.pm:751> INFO - Output to main.bbl
[21] biber:315> INFO - === Thu Mar 26, 2020, 17:07:44
[34] Biber.pm:375> INFO - Reading 'main.bcf'
[95] Biber.pm:905> INFO - Found 17 citekeys in bib section 0
[107] Biber.pm:4196> INFO - Processing section 0
[107] Utils.pm:75> INFO - Globbing data source './bibliographies/DP.bib'
[107] Utils.pm:91> INFO - Globbed data source './bibliographies/DP.bib' to ./bibliographies/DP.bib
[117] Biber.pm:4373> INFO - Looking for bibtex format file './bibliographies/DP.bib' for section 0
[119] bibtex.pm:1462> INFO - LaTeX decoding ...
[134] bibtex.pm:1281> INFO - Found BibTeX data source './bibliographies/DP.bib'
[170] UCollate.pm:68> INFO - Overriding locale 'de-DE' defaults 'variable = shifted' with 'variable = non-ignorable'
[170] UCollate.pm:68> INFO - Overriding locale 'de-DE' defaults 'normalization = NFD' with 'normalization = prenormalized'
[170] Biber.pm:4024> INFO - Sorting list 'none/global//global/global' of type 'entry' with template 'none' and locale 'de-DE'
[170] Biber.pm:4030> INFO - No sort tailoring available for locale 'de-DE'
[183] bbl.pm:648> INFO - Writing 'main.bbl' with encoding 'UTF-8'
[187] bbl.pm:751> INFO - Output to main.bbl

View file

@ -33,5 +33,6 @@
\contentsline {figure}{\numberline {xxvi}{\ignorespaces The internal clamping diodes of the Analog Discovery 2\cite {ad2}\relax }}{30}{figure.caption.26}%
\contentsline {figure}{\numberline {xxvii}{\ignorespaces The output of an example track part 1\relax }}{40}{figure.caption.27}%
\contentsline {figure}{\numberline {xxviii}{\ignorespaces The output of an example track part 2\relax }}{41}{figure.caption.28}%
\contentsline {figure}{\numberline {xxix}{\ignorespaces A regular beginning of the game\relax }}{46}{figure.caption.29}%
\babel@toc {ngerman}{}
\babel@toc {english}{}

View file

@ -1,4 +1,4 @@
This is XeTeX, Version 3.14159265-2.6-0.999991 (TeX Live 2019/Arch Linux) (preloaded format=xelatex 2020.3.10) 23 MAR 2020 02:07
This is XeTeX, Version 3.14159265-2.6-0.999991 (TeX Live 2019/Arch Linux) (preloaded format=xelatex 2020.3.10) 26 MAR 2020 23:49
entering extended mode
\write18 enabled.
%&-line parsing enabled.
@ -2894,8 +2894,11 @@ Overfull \hbox (18.29266pt too wide) in paragraph at lines 200--201
Overfull \vbox (2.2876pt too high) has occurred while \output is active []
[41] (./code/textadv/src/16550.c) (./code/textadv/src/game.c [42])
(./code/textadv/src/game.c [43]) (./code/textadv/src/game.c [44])) [45]
[41] (./code/textadv/src/game.c) [42] (./code/textadv/src/game.c) [43]
(./code/textadv/src/game.c [44])
File: pics/gameplay.png Graphic file (type bmp)
<pics/gameplay.png>
[45]) [46] [47]
Overfull \hbox (2.54398pt too wide) in paragraph at lines 148--173
[]$ $[]$
[]
@ -2905,7 +2908,7 @@ Overfull \hbox (2.54398pt too wide) in paragraph at lines 148--173
[]$ $[]$
[]
[46
[48
] (./main.lof)
@ -3230,21 +3233,18 @@ code/textadv/include/dac.h
code/textadv/src/dac.c
code/textadv/src/interrupt.c
code/textadv/src/sound.c
code/textadv/src/16550.c
code/textadv/src/game.c
code/textadv/src/game.c
code/textadv/src/game.c
pics/gameplay.png
***********
Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 217.
Package rerunfilecheck Info: File `main.out' has not changed.
(rerunfilecheck) Checksum: EF751B3F7A69F84698797A4DD5318A21.
(rerunfilecheck) Checksum: 9BB691A9D13EB7A78116791B27DAA866.
LaTeX Font Warning: Some font shapes were not available, defaults substituted.
LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
Package logreq Info: Writing requests to 'main.run.xml'.
\openout1 = `main.run.xml'.
@ -3254,12 +3254,12 @@ Package logreq Info: Writing requests to 'main.run.xml'.
### semi simple group (level 1) entered at line 75 (\begingroup)
### bottom level
Here is how much of TeX's memory you used:
82303 strings out of 492483
1830483 string characters out of 6134979
4963517 words of memory out of 5000000
85459 multiletter control sequences out of 15000+600000
82315 strings out of 492483
1830785 string characters out of 6134979
4964598 words of memory out of 5000000
85472 multiletter control sequences out of 15000+600000
615741 words of font info for 133 fonts, out of 8000000 for 9000
1350 hyphenation exceptions out of 8191
67i,19n,108p,1149b,8528s stack positions out of 5000i,500n,10000p,200000b,80000s
67i,19n,108p,1149b,8536s stack positions out of 5000i,500n,10000p,200000b,80000s
Output written on main.pdf (56 pages).
Output written on main.pdf (58 pages).

View file

@ -18,9 +18,8 @@
\contentsline {lstlisting}{\numberline {XII}The DAC waveform generation code}{34}{lstlisting.12}%
\contentsline {lstlisting}{\numberline {XIII}The ISR which fires every millisecond}{37}{lstlisting.13}%
\contentsline {lstlisting}{\numberline {XIV}The sound update function}{38}{lstlisting.14}%
\contentsline {lstlisting}{\numberline {XV}The UART char receive code}{42}{lstlisting.15}%
\contentsline {lstlisting}{\numberline {XVI}The character ingest function}{42}{lstlisting.16}%
\contentsline {lstlisting}{\numberline {XVII}The command parsing function}{43}{lstlisting.17}%
\contentsline {lstlisting}{\numberline {XVIII}The command execution routine}{44}{lstlisting.18}%
\contentsline {lstlisting}{\numberline {XV}The character ingest function}{42}{lstlisting.15}%
\contentsline {lstlisting}{\numberline {XVI}The command parsing function}{43}{lstlisting.16}%
\contentsline {lstlisting}{\numberline {XVII}The command execution routine}{44}{lstlisting.17}%
\babel@toc {ngerman}{}
\babel@toc {english}{}

View file

@ -42,10 +42,12 @@
\BOOKMARK [3][-]{subsubsection.4.2.2}{\376\377\000T\000o\000n\000e\000s\000\040\000a\000n\000d\000\040\000T\000r\000a\000c\000k\000s}{subsection.4.2}% 42
\BOOKMARK [3][-]{subsubsection.4.2.3}{\376\377\000T\000r\000a\000c\000k\000\040\000s\000w\000i\000t\000c\000h\000i\000n\000g}{subsection.4.2}% 43
\BOOKMARK [2][-]{subsection.4.3}{\376\377\000U\000s\000e\000r\000\040\000c\000o\000m\000m\000a\000n\000d\000\040\000i\000n\000t\000e\000r\000p\000r\000e\000t\000a\000t\000i\000o\000n}{section.4}% 44
\BOOKMARK [3][-]{subsubsection.4.3.1}{\376\377\000C\000o\000m\000m\000a\000n\000d\000\040\000s\000t\000r\000u\000c\000t\000u\000r\000e\000\040\000a\000n\000d\000\040\000p\000a\000s\000r\000i\000n\000g}{subsection.4.3}% 45
\BOOKMARK [3][-]{subsubsection.4.3.1}{\376\377\000C\000o\000m\000m\000a\000n\000d\000\040\000s\000t\000r\000u\000c\000t\000u\000r\000e\000\040\000a\000n\000d\000\040\000p\000a\000r\000s\000i\000n\000g}{subsection.4.3}% 45
\BOOKMARK [3][-]{subsubsection.4.3.2}{\376\377\000C\000o\000m\000m\000a\000n\000d\000\040\000p\000a\000r\000a\000m\000e\000t\000e\000r\000s}{subsection.4.3}% 46
\BOOKMARK [1][-]{section.5}{\376\377\000E\000r\000k\000l\000\344\000r\000u\000n\000g\000\040\000d\000e\000r\000\040\000E\000i\000g\000e\000n\000s\000t\000\344\000n\000d\000i\000g\000k\000e\000i\000t\000\040\000d\000e\000r\000\040\000A\000r\000b\000e\000i\000t}{}% 47
\BOOKMARK [1][-]{section.1}{\376\377\000L\000i\000s\000t\000\040\000o\000f\000\040\000F\000i\000g\000u\000r\000e\000s}{}% 48
\BOOKMARK [1][-]{section.2}{\376\377\000L\000i\000s\000t\000\040\000o\000f\000\040\000T\000a\000b\000l\000e\000s}{}% 49
\BOOKMARK [1][-]{section.3}{\376\377\000L\000i\000s\000t\000i\000n\000g\000s}{}% 50
\BOOKMARK [1][-]{section.3}{\376\377\000A\000n\000h\000a\000n\000g}{}% 51
\BOOKMARK [2][-]{subsection.4.4}{\376\377\000G\000a\000m\000e\000p\000l\000a\000y}{section.4}% 47
\BOOKMARK [2][-]{subsection.4.5}{\376\377\000M\000e\000m\000o\000r\000y\000\040\000c\000o\000n\000s\000t\000r\000a\000i\000n\000t\000s}{section.4}% 48
\BOOKMARK [1][-]{section.5}{\376\377\000E\000r\000k\000l\000\344\000r\000u\000n\000g\000\040\000d\000e\000r\000\040\000E\000i\000g\000e\000n\000s\000t\000\344\000n\000d\000i\000g\000k\000e\000i\000t\000\040\000d\000e\000r\000\040\000A\000r\000b\000e\000i\000t}{}% 49
\BOOKMARK [1][-]{section.1}{\376\377\000L\000i\000s\000t\000\040\000o\000f\000\040\000F\000i\000g\000u\000r\000e\000s}{}% 50
\BOOKMARK [1][-]{section.2}{\376\377\000L\000i\000s\000t\000\040\000o\000f\000\040\000T\000a\000b\000l\000e\000s}{}% 51
\BOOKMARK [1][-]{section.3}{\376\377\000L\000i\000s\000t\000i\000n\000g\000s}{}% 52
\BOOKMARK [1][-]{section.3}{\376\377\000A\000n\000h\000a\000n\000g}{}% 53

BIN
main.pdf (Stored with Git LFS)

Binary file not shown.

View file

@ -56,10 +56,12 @@
\contentsline {subsubsection}{\numberline {4.2.2}Tones and Tracks}{37}{subsubsection.4.2.2}%
\contentsline {subsubsection}{\numberline {4.2.3}Track switching}{42}{subsubsection.4.2.3}%
\contentsline {subsection}{\numberline {4.3}User command interpretation}{42}{subsection.4.3}%
\contentsline {subsubsection}{\numberline {4.3.1}Command structure and pasring}{42}{subsubsection.4.3.1}%
\contentsline {subsubsection}{\numberline {4.3.2}Command parameters}{44}{subsubsection.4.3.2}%
\contentsline {subsubsection}{\numberline {4.3.1}Command structure and parsing}{42}{subsubsection.4.3.1}%
\contentsline {subsubsection}{\numberline {4.3.2}Command parameters}{43}{subsubsection.4.3.2}%
\contentsline {subsection}{\numberline {4.4}Gameplay}{45}{subsection.4.4}%
\contentsline {subsection}{\numberline {4.5}Memory constraints}{46}{subsection.4.5}%
\babel@toc {ngerman}{}
\contentsline {section}{\numberline {5}Erkl"arung der Eigenst"andigkeit der Arbeit}{46}{section.5}%
\contentsline {section}{\numberline {5}Erkl"arung der Eigenst"andigkeit der Arbeit}{48}{section.5}%
\babel@toc {english}{}
\contentsline {section}{\numberline {I\tmspace +\thickmuskip {.2777em}}List of Figures}{I}{section.1}%
\contentsline {section}{\numberline {II\tmspace +\thickmuskip {.2777em}}List of Tables}{I}{section.2}%

BIN
pics/gameplay.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View file

@ -60,20 +60,20 @@ operation continues.
\lstinputlisting[language=C,frame=trBL,
breaklines=true, breakautoindent=true, formfeed=\newpage,
label={lst:textadv-routine-uart}, caption={The routine function for the UART},
columns=flexible, style=cstyle, firstline=105, lastline=118]
columns=flexible, style=cstyle, firstline=112, lastline=125]
{code/textadv/src/16550.c}
\lstinputlisting[language=C,frame=trBL,
breaklines=true, breakautoindent=true, formfeed=\newpage,
label={lst:textadv-routine-dac}, caption={The routine function for the DAC},
columns=flexible, style=cstyle, firstline=197, lastline=203]
columns=flexible, style=cstyle, firstline=200, lastline=207]
{code/textadv/src/dac.c}
\subsection{DAC sound generation}
\subsubsection{DAC modes}
The DAC can produced any waveform described by 8 bit unsigned PCM code. Though
The DAC can produce any waveform described by 8 bit unsigned PCM code. Though
possible to feed predefined waveforms into the DAC, the AVR doesn't have enough
onboard memory to store more than a few seconds of these waveforms.
@ -155,7 +155,7 @@ figures \ref{fig:textadv_track_ex1} and \ref{fig:textadv_track_ex2}.
\lstinputlisting[language=C,frame=trBL,
breaklines=true, breakautoindent=true, formfeed=\newpage,
label={lst:textadv-upsnd}, caption={The sound update function},
columns=flexible, style=cstyle, firstline=218, lastline=262]
columns=flexible, style=cstyle, firstline=219, lastline=261]
{code/textadv/src/sound.c}
\newpage
@ -214,12 +214,12 @@ during a track change.
\subsection{User command interpretation}
\subsubsection{Command structure and pasring}
\subsubsection{Command structure and parsing}
As in other text adventures \cite{dunnet} a command consits of one line of
input terminated by a newline or line feed character \textbackslash n.
The carriage return character which is sometimes transmitted with a line
feed character is not parsed in this text adventure. Incoming character
parsing can be seen in listings \ref{lst:textadv-uart-recv} and
parsing can be seen in listings \ref{lst:textadv-routine-uart} and
\ref{lst:textadv-ingest}.
As one command is parsed each part is required to be separated by an empty
@ -227,13 +227,7 @@ space character which is ascii code 32 \cite{ascii}. The first part of the given
input is then compared to an array of actions a user can perform, for example
use or search, as can be seen in listing \ref{lst:textadv-parsecmd}
\lstinputlisting[language=C,frame=trBL,
breaklines=true, breakautoindent=true, formfeed=\newpage,
label={lst:textadv-uart-recv}, caption={The UART char receive code},
columns=flexible, style=cstyle, firstline=105, lastline=118]
{code/textadv/src/16550.c}
In listing \ref{lst:textadv-uart-recv} the comment echo back can be seen. The
In listing \ref{lst:textadv-routine-uart} the comment echo back can be seen. The
write\_char function before it writes the last received character back to the
terminal which sent it. This is done to write what the user typed out to the
terminal as otherwise it would not be seen what has been typed on any VT100
@ -242,7 +236,7 @@ compatiable terminal\cite{vt100} or terminal emulator.
\lstinputlisting[language=C,frame=trBL,
breaklines=true, breakautoindent=true, formfeed=\newpage,
label={lst:textadv-ingest}, caption={The character ingest function},
columns=flexible, style=cstyle, firstline=71, lastline=79]
columns=flexible, style=cstyle, firstline=73, lastline=81]
{code/textadv/src/game.c}
The in listing \ref{lst:textadv-ingest} shown branch overrides the last received
@ -255,7 +249,7 @@ emulator sends when the backspace or delete key is pressed \cite{vt100}.
\lstinputlisting[language=C,frame=trBL,
breaklines=true, breakautoindent=true, formfeed=\newpage,
label={lst:textadv-parsecmd}, caption={The command parsing function},
columns=flexible, style=cstyle, firstline=31, lastline=69]
columns=flexible, style=cstyle, firstline=33, lastline=71]
{code/textadv/src/game.c}
\subsubsection{Command parameters}
@ -273,5 +267,34 @@ with zeros as seen in listing \ref{lst:textadv-parsecmd}.
\lstinputlisting[language=C,frame=trBL,
breaklines=true, breakautoindent=true, formfeed=\newpage,
label={lst:textadv-perfact}, caption={The command execution routine},
columns=flexible, style=cstyle, firstline=81, lastline=120]
columns=flexible, style=cstyle, firstline=83, lastline=123]
{code/textadv/src/game.c}
\subsection{Gameplay}
The game itself plays like a regular game with limtations set in direction.
Playeras can search for items in each room and grab the found items as can be
seen in figure \ref{fig:tetadv_gameplay}. The general gamplay is perfomred via
altering the map data and the strings output to the user.
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth, angle=0]{pics/gameplay.png}
\caption{A regular beginning of the game}
\label{fig:tetadv_gameplay}
\end{figure}
\subsection{Memory constraints}
The AVR has 8kB of internal SRAM which are used for stack and heap
\cite{atmega2560}. During the build of the program an ELF file can be obtained
which contains infromation on the programs structure and memory usage on boot.
Strings and variables are contained within the .data section of the elf file,
but loaded into the .bss section during boot\cite{elf}. This is done for
integer
variables, as well as for strings, which makes the use of strings limited not
to the flash size but to the RAM size of the AVR. To save memory, sound tracks
as well as the sine and noise table have been put into program space with the
PROGMEM attribute as described by the avr-libc documentation\cite{progmem}.
In listing \ref{lst:textadv-dac-gen} a read from program memory can be seen in
the noise and sine modes.

View file

@ -1,4 +1,4 @@
This is XeTeX, Version 3.14159265-2.6-0.999991 (TeX Live 2019/Arch Linux) (preloaded format=xelatex 2020.3.10) 22 MAR 2020 23:57
This is XeTeX, Version 3.14159265-2.6-0.999991 (TeX Live 2019/Arch Linux) (preloaded format=xelatex 2020.3.10) 26 MAR 2020 23:49
entering extended mode
\write18 enabled.
%&-line parsing enabled.