From ebanmail@yahoo.com Tue Oct 01 13:12:21 2002 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 17wQZJ-0001wg-00 for simulavr-devel@mail.freesoftware.fsf.org; Tue, 01 Oct 2002 13:12:21 -0400 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 17wQZG-0001vM-00 for simulavr-devel@mail.freesoftware.fsf.org; Tue, 01 Oct 2002 13:12:20 -0400 Received: from web10002.mail.yahoo.com ([216.136.130.38]) by monty-python.gnu.org with smtp (Exim 4.10) id 17wQZG-0001vA-00 for Simulavr-devel@mail.freesoftware.fsf.org; Tue, 01 Oct 2002 13:12:18 -0400 Message-ID: <20021001171217.16415.qmail@web10002.mail.yahoo.com> Received: from [132.248.52.238] by web10002.mail.yahoo.com via HTTP; Tue, 01 Oct 2002 10:12:17 PDT From: eban Subject: Re: [Simulavr-devel] eeprom support To: Simulavr-devel@mail.freesoftware.fsf.org In-Reply-To: <5.1.0.14.0.20021001124906.023a0880@odin.he.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="0-74666807-1033492337=:15730" Sender: simulavr-devel-admin@mail.freesoftware.fsf.org Errors-To: simulavr-devel-admin@mail.freesoftware.fsf.org X-BeenThere: simulavr-devel@mail.freesoftware.fsf.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Discussion of simulavr development. List-Unsubscribe: , List-Archive: Date: Tue Oct 1 13:13:01 2002 X-Original-Date: Tue, 1 Oct 2002 10:12:17 -0700 (PDT) --0-74666807-1033492337=:15730 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Wow, that was fast and everything seems to be working fine!!! I saw that you had already programmed the same things that were missing for the flash memory, but thought that there were still many "obscure and difficult" things to do. The type of external eeprom that I would like to simulate is an i2c 24LC*. I attach an image of how it's connected. I hope nobody gets upset because of this attachment. I know it's a little bit difficult to do, but it's ok. I don't really need it for now. Thanks a lot, Alberto Escalante --- Jason Kyle wrote: > At 12:17 1/10/2002, Theodore A. Roth wrote: > >Hi Alberto, > > > >On Mon, 30 Sep 2002, eban wrote: > > > >:) Hello everybody!, > >:) > >:) I'm trying to simulate a program that uses the > >:) internal eeprom and a external eeprom. > >:) At least I really need to use the internal > eeprom. > >:) > >:) Simulavr has most of the work done to allow > this, but > >:) i don't think there's a way to load my binary > eeprom > >:) images yet. > >:) > >:) Is there a way to do this? > > > >Yes. > > > >:) How much work is needed? > > > >Oh, about 45 minutes worth. ;-) > > Far too quick, must be riddled with bugs! Only > hello world can be written > in 45min :) > > > >:) Is anybody working on this? > > > >Not any more. I just checked it in to cvs. > > > >The -e option now works for binary files. > You can generate the > >eeprom binary image as such: > > > > $ avr-objdump -j .eeprom -O bin foo.elf > > foo.bin > > > >and then use "-e foo.bin" to get the file into > eeprom. > > > >:) What about the external eeprom? > > This really falls into the category of external > periperals, much like a > dataflash memory would. Can't see any really good > reason for hooking up an > EEPROM to an AVR's external SRAM interface, perhaps > you are meaning an SPI > or IIC bus EEPROM? > > > >Well, that's a bit more difficult. > > > >I'm assuming you are talking about memory mapping > and eeprom device into > >the external sram space of the device. As far as I > know, the AVR's don't > >have built-in support for external eeprom. > > > >Simulavr needs some serious work before could have > this. :-\ It's on the > >TODO list, but I'm a bit busy with some other stuff > right now. Feel free > >to dig into if you like. I'll help however I can. > > Would be cool to have an external periperal > simulation interface, although > i'm sure it's been on your mind for simulavr's > entire life it does > represent lots of work.... At your leisure :) > > Cheers, > > Jason Kyle > > > > _______________________________________________ > Simulavr-devel mailing list > Simulavr-devel@mail.freesoftware.fsf.org > http://mail.freesoftware.fsf.org/mailman/listinfo/simulavr-devel __________________________________________________ Do you Yahoo!? New DSL Internet Access from SBC & Yahoo! http://sbc.yahoo.com --0-74666807-1033492337=:15730 Content-Type: image/gif; name="at90s8515_24LC64.gif" Content-Transfer-Encoding: base64 Content-Description: at90s8515_24LC64.gif Content-Disposition: inline; filename="at90s8515_24LC64.gif" R0lGODdhFwE4AecAAP///wgICBAQEBgYGCEhISkpKTExMTk5OUJCQkpKSlJS UlpaWmNjY2tra3Nzc3t7e4SEhIyMjJSUlJycnKWlpa2trbW1tb29vcbGxs7O ztbW1t7e3ufn5+/v7/f393NjYykhIRgICGNKQntzazkxKWtjWkpCOSkhGGNa SlpSQoyEc0pCMTEpGIR7YyEYAHNrUlJKMTkxGGNaOUI5GHNrSmNaMUpCISkh AHtzSkpCGIx7KXNrOb2tUlpSIZyUWoR7ObWtY5SMSqWcUpSMQoyEOaWcQnNr GGNaEK2cAL21Ws7GWq2lQr21QoyEIYyEEHtzCHNrAHtzAM7GSs7GOe/nQvfv Qs7GKe/nKc7GGL21AP/3EP/3AP//93t7c///797ezpSUhEpKOZSUa3NzUmtr SlpaOUJCKVJSMSkpGIyMUjk5IWNjOXNzQufnhGtrOZycUr29Y62tWs7Oa5SU StbWazExGCEhEO/vc5ycSr29WoyMQtbWY1paKf//c6WlSq2tSpycQv//a2Nj Ke/vY7W1St7eWqWlQnt7Mc7OUmtrKYSEMcbGSv//WoyMMdbWSu/vUhgYCMbG Qt7eSkpKGM7OQufnSrW1Oe/vStbWQr29Od7eQlJSGP//Sq2tMTk5EJSUKZyc Kb29MaWlKefnOWNjGPf3OWtrGJSUIf//OXt7GK2tIbW1IYyMGMbGIff3KZSU GJycGNbWIefnIe/vIbW1GP//IcbGGN7eGJycEO/vGKWlEK2tEL29EGNjCGtr CO/vEPf3EP//EIyMCJSUCK2tCM7OCNbWCN7eCOfnCCEhACkpADExADk5AEJC AEpKAFJSAFpaAHNzAISEAJycAKWlALW1AL29AMbGAM7OANbWAN7eAOfnAO/v APf3AP//APf/Qvf/Ic7WGPf/GPf/EN7nAISMAO//AHuEGFpjAHuEOXN7MZSl OTE5Mc7O1sbG1rW1xqWltYyMnMbG3iEhMRAQGAAAEAAAGIyEpXtzjN7W53Nr e5yUnBAIEAAAAP///////ywAAAAAFwE4AQAI/gABCBxIsKDBgwgBaNiQsKHD hxAjSpxIsaLFixgzatz4kEK/fg0YchxJsqTJkyhTqnSoIcDHfhlWypxJs6ZN mhkYLNjJs2dPBghe9kOg06fRo0iTKl3KtKnTp1CjSp2q1IGHmxkn9EugoKvX r1+DvkQAtqzZs2jTql3Ltq3bt3Djyl3b7wFWjBMKXIWoYcBLDHcDCx5cEUED whMl6JX4oF+AkIgjS45sePLDvB0kOjCgwbLnzzUrgz6Ydy/EBghGq15N8sBh 1gMVZ47Y4ADs27glir5dWiLq3MCDG9wNG7Nv28KTA0fgILdi0w9rC5dg4ID1 69iza9/Ovbv37+DD/osfzz3AAPLouSM4YKGicdqpgzcAuYCB/fv48+vfz7+/ //8ABijggPoNUACBCPJHgAAXuLcYbcgBB5RyuDGHFQQJWCTbccIxECGFqxFH 0wPxUdQbhMJJByJrIs5EokUnnlZibh6uyOJrNr1Y0YYoyvehjZ+1KJOOJj54 2o+3qQgkaEKuRORE7x3ZIZJLSuYaVk9K9JxvM+I2YZVB4lhTlhFFGR2VrNUI pmdNqkQmRFv2KCGaawrWZkpvXmbkQw50eduXdUp2J0p5DoTBBIgmSsECAyTq 6KMTUDBBBQkUICmkmGaq6aacZnppBQgUUAGil3Zq6qmopqrqqqlWUAAC/hWU yqqj7TlUKAAZuCTUrrz26uuvwAYr7LDEFmvsscgmq+yyzAoVAAIcNHRrBf2Q tqdDSuaWbaCEDUpRBv2IhNCtFlRr0AQEQIetn7CpyS1i3k6kQbjSsjsQtdaq 29C2f9L5rk3xSgSuuAeRa25BPErp47/wirnRvAQbZHC+HC7M8GABRzRwvQ3h e24Bsyk858WDXUkSxBwnVO5BccrYob0kz5QxRBsnNPHHIZ85ZcyBzfwQyjbD DMDKBrWss8U83+SzQzWPK7THBcV49MhJ32TySEA73RDRUYPM5ctVK+2wRk0X LDTXBEltq9CjuRu2zM2dTG/QAFwQ6d2SVjAf/t6RUtDAABJIKjjfg4NqKQWD J0744oo3zvjjjiMOKgGxRg755ZZnjvnmmnfOOeQUEKBArJ9LGvFAZUuc2gH9 CCBAAK6/7tLrscMeAOyx0+467ro7tnvtwP8uvO7E82588MUjb/ztLtme/PDH Q6/89NJX//z10WNPvfbWf8R98f1MgFDWZgNwNUFoD6R2Q32C/TZNSwcg/kGp F/Ti+QOlL9D6CfHbrr/vI0n85mcQ8qnOfGMb2sHS5jU5aQuAAeTIABFSP4Lc L4FQI4jRsAXBz7gtgiiZ4EEMaL/VJVB/ADDTutwHwpSI0CAVHMgFD4JC/iHE f2nqYAsv8sKCkNCC/iak4QJj00CRPXCHLkygQ+RHwblpDX8CyaD6rrUvHVrm g0gcCRQfwsQROrF8W6whFfvHNtAAKosCVGJDugjDLx4wjEMUSMKmRiMrojEi PSTID2UYRIOIUV/9s6NkcHhHHqoxIWwsSAwFMkODSHF/RaSjlwRZyIZscYkE 9KEbS4hAIbJsjDcsowdFWUmI5BF1mwRiJ/0YxxRGkoM7K2VBOsCBWtrylris pQcM0AAP5JIDOStIIvWYSj6usiAo3GAVU0TJ9yWgWbsKQEwOMkxUnk6VW3yk KwF5w2YSBoulRMACNqCBcprznOjcwAEUQM5zboACA5imQaopkD0yso/I/myl CvdFyiv2E4QHsMtEhJSBeCKEnrgq5j2Pib5WKjOQsZTlQCw00ARiwKDUzCQx r2lMOFormMsMDjgrSVHdJLCg8hSmRq3JsWzqE5QHIaRqzijRkkZkixdNKUEQ ak8ANDKfnwQpGSMqUfPFzaT0w+g8VyqQRfoUnw2lWETaxxENJKoCW0sUYAAw KkTVSmWhosBWOVAq03BAUUL14VW5OZANoFV9WoXXUfFoUaWqdHwKfSpD8/fS tBaEUgQYgAJmgxoEIECgGlAAAhJwgM5w9QAJIEtmGuO6AewFKIaFAAB22bp+ MEAgA3BdPyI0AcMSZSADIEAB+rEAgXhEtI7l/mrrbrdVri52saahrHnEBQHI kmUgrxVAPxzrAdzVpa2KXY88+2TYCBDkAgcw7AE4+hCbmvKkdt0pUxNKXb26 9JNstWA/CmAAAUTLfAY6j0AuEADV9gOrAIhAewkQAIY8QADreVABCLCgDHXA AAU4AAE+C4AAh6pEDRCAAVS7lwAfYAAErsCzDiAAeVYAvwKWZ2NUGwDTQGAA 6yHAeQGwAAHwdwDADUB0B+DYDghgxc4VCAYUXIAAwBcABjBQABRAEAkXYLU6 1c1cIYLT7A6Ep3n9aVRxBhEIvPjB5z1AdQqQIQDMuDoCqFUEzpPjaN1Xyg+q DoB5vMsAD1ggBJhy/msF0gACrMcAeyGAdc4MAAqomMKxvfCca/sALg8gZB+W MgHExQDV8he4TxaASFwMZs021c0PvrGUASymCnA5ALWlyAGGXF3sBlkgCHWq kvkqVYN4oAOo9oCTEbBgYOLYOgZAgAc8cIHzPNgCV3mAm3PcGQe8uNWZIa+U W8sBAOf4MB5Is4Bb2wEPFDqyBki1sgfQWg9MQMXlxcCpPXBhA+T4AqcGgAMG 4O36pvrLP95AuBUg5y43mwJPHoC2O7ABWxNAs82+gJsVMIAKhPsAZlbAqTOD ruoEANyoRrWQKSKknB50uz0dtUCS+crYmDi1AhiAgVzH3/m+jr8cX5CJ/heU Wr90/CMuKXl7Q7tylH8ktY5xzMrpm+Yaa5y+L/F4zFsX2MDKnOcYzzjJ+Yvz 2/Xj5vQN7QBmLlzRCp0ArWt6z5e+YJqnNgBVn/nNgz51BPi1INbtdFI/DYBQ Jxmq93opNyHgGKVr/O2VfXtoMy73udc97nLHu8b1vve7Vzawfac73AU/eL5n nO6Ij93d7Z53vu+d8Er/O9yVDvjIWz7w/SDA1wkSdocUmexI7q7EFVjqgrBd swPfdrNXn2rWJ9z1rVd96gce+9Wn3vbNpn3rca961su+97cPPu557/pZ7z7h vX898H2P/NoDfwMm3vxANs1wTz+8iaJH+8Qd/lpxgbA9xkVVTQc0Ln2BdL4h DTcyqCF+9r1uv/QE+X74VzP+P+OR0w4hqPrLvl1Ra1+2H4UQ8gcAEHABHbAA CdBdFtEBQBETzYURGJAADHAVC3BeqgYrHoAamYYSEYAA4rMZVrERGaAAFQgA DHBN46d596dpdQV67Jd97kd6RQNK8kcBCJABDXABHMBjJWEB0aIAFgB+F0EB dQMBEWAAIrEBDeIACkCE/1QRHYBVDBABEBBeE4FrF9AAEzBdB5GC5WdU1Td2 10c/7edRTHYQ39cBECABGPAABkhgJcEBCHAoXLGBFEEBCcABGRhbGSgBDyA+ PLgSHfAAFKAACUCE/iMhAZrFAJ9Wf194fgmhf7F1V140YmB0Qty3dv0gARaQ AAYAATm4gyYxG1XWAU9IEJlhAXbBAMR1FQ3QhABwihThAQ+wVR4wWBxRATG2 AI1Ifis4EQZQbQRBa1lmEKgWAEI4EB2AAf1gh9iEQWongP3gXBzAABRQAUaY jBuhihEQAXojARKAEWv4AO2xAI6VE4pIAeMoE+JUARfwABHwAFYIEaEzAYDB i12YWo+IfwjBAQWQcQEQjgLBAYF1OxqVY7CzZm21ILeDiJfoSWdoEAO4EFwl kCahi1cBjvOYEB4QAfOTAaahARAQLUG4kRjRAYgiAR6AAVXIEXYTATEB/pL5 qIJExo8HwQG2NgDgN36xJgAWiWZTVmUL+SoCsF3ehYngJY3aOH+T4Yi/CBEE SV4FsJOqRWE/CQByJmCBKBAbUJWNQjdm2DVpNYBM+RlOaUo2mQEYsJYYkAEW cB6hwogXgAGWNmcNoJZrmQFZSWUZMJdzGTrWMQAO0JcYcAEXoGH/p002RJZl aRle+JQGsVrRxDy88jq+IjuXGVq8UgAdhZQzOJbT2JhmqY83ZZNLxxVzkZrP ZACdCZFdo4lLKZqDcZbVZZP09YUl0QH9wJoLFZYMBJqxKZuBQZv5Z5sBEDIW 4ADaSAEOAI+WGH8OcGMDoQEPQIioiHWt6UiZ/qiUwtmUpImWCXGbE+eGE5CM btmBgAQBE3ABEbCBDeAAh4mKu7kXoydGwNmdkvGYNZkQoTUb4GhlcEgQ3ogQ rNiFD3A6usmbR+maDASb+BkZxIl+xjkbHEAiChBkG8AAadUAEIAAjoY6BWCI k5ig2QlUn8mdD0oYERqJxnle/4mDEmOUDKBZFPCTHTBNM9IB2Nmb0Ah/A8GY KXoX+lmb4XmccuRcGBCgALABCnkQBVqewxgtHiCUAECiPMqgU+SgQSoYQ+p5 pikAs7EBDrATDaJHSloQGLATDmCJHdAA9SGdVrqgrBRU0sgADlCgW3oTK4oQ kCieAnGj12SF5fSc/ptVTrO0myW6ZK8pjUcXWJOYpzKxpwfRpwFAqDMRp6On mN1HgOPlbfcGqTXRpRLKn2AqpFhHn/9HcZoIaz+Gm6B6kt/5ENSHEBpXAeRo khzBAYh6pXMakaY3Wt4WYLhqEBHQAJlxAQzwng7AoT41owKhagzwVRNgH7Wi AckKGBvwAA3AADdGATHmN+/porWirU31ofazrAwgkBsAAR0ArgyQSYMYLRrw ngqYm74InggBdYdnrhZAFtNkAQdAawk4nUHBGXXjGntBKc+Jqam6nWh4dN5W lBhBkANAhBVgHe11AAsAAbEWPgCgACpmY/H1KgbQDxawAbFmHeX0ZALp/hG8 CbKL1RkVMGgKsSANQpDmemRuxmqpYQECkFggxjofygDNqAEnVgD1OhKSOhy2 ORSTloRYh53J1g8oqWjPSmFOhrT81Q/4tiARo6MKmqnR+LAmJgAJ4Kqmd2+c ORAGEI4bQC/UwYzliIQ+KRAI+ABrS4JOlgGzcbEApxACgIvex5tAoSIkSE2I SJAUcAE/mwACxXbr5RcZ4ADpwgECkLMqIaosyp9yRl6Aw5UOQJ0oJgEfYW1W a2XvxVUR4BEU8AAxwXYDsLDzyasmKpbSWIv+lhHMYQEGYIEHID5v61wRYLKV CgDUYYr9oAASEBMz660IIAFB0V4xMQEb0GZ1/uM9n4WTRLhL3ihiVmZkAeCQ RDFjGxBZ4AhiArGJLPaKAmEAAnWpseqlnLseCCAAcBq40BcUHiABp0u6I8Z2 joEBlttqhxq2DZuUDxucEqGrF1BvBGQA8+MAu0lf7OVlrMltJKduJVcA1voA GlC/IlFouHIAdhMADjB+WMWMGaCrRKgBFbZU09cAM6YBC7ByCeCKGhoA81pl BfC+kXqvRJqvGOZtfFiyGfBhEpwBE3C6WiGlnBoBokO5DCAAG8iwMWifKJoR w/sSCtm2A1Gsclu8EQAyEsAQHrAeuiYQrnGyAMABB8dmnLkBAtknHUAARCjB XAy4QRa+EyXDjYts/tsHitMIATwYUKEKxMUZno1KABcQW/OBVWIxWvAmEsz4 gQfgER1QKQrwEltZpTsqp381thIZmhpBAAtASxJQvDgmPpargwXQAPMiw4JV xwWglgKwABIwaBpwABFAtBYwH1slwszYAOXSADjZIAEwkmfVDx4AfXYYAAcq ksfps+U7V/q2X6zlEeXpsTShuXz6pRgwmASBAS5hAHnYkf2wzOTVuwgQAM+E APVWYwL1ADpcwIlKaieawBoxY2M1lZvlxQDwTI7RGRbgEje8pFA3FGz2Ecj2 TG8sECJcZx8hcCQGnyw2kAWgiAddEH7xEQaAVT6rAQmAfzoaE/PBtTbh/s0H MasHgchN1QDbKo9W1lpJuq0TyAGoYcxDYxizcQEnbM+0q6gNmsUXoXAD4UvP ala0pIw5c2p6OBCuxtTDGDJGbbwgAx2ndiVsWZh6iGpP/adVyk1UjbYasbRg Z5ulihVW7JtTdJ+BsgEFsFIXYAB9uSuYextmzXlfStYbsdY9OoNaGijhNkuz 8XrNlhwqzbThmdZ6eqpBjc+2q8+vmtLxa0l7PYyAtAHqlhDklFbBpKsGfMWi /KsKPNmj6NKbK8Q5gwAOCVw78QBCdQFqSqi7RDB+jaVytKlAatqZi9rfTKoh UwGjA0NX4QCtjTqZIQHaWC62/cli66PeR8q8/v3DNBnEB7EgOQMBx00QxIwQ YurBBuEAoSufcPbY7/cxgT3dvV3d8kurjE2A26WLCdEBFgABXyUQMHmC5H3P 540wui3d6p0SeT1RaJ3d2103wfnUyj2MGjsAPnzbvbqokh3gAu7bk1rgBOEA KxU6RihUrRsB4nzUG2CKZfqnzp2YfUXUFH7a7D2q7p0zmm0QdoM4aSUpZKcB 0AHhtatBNAjgK26vLZ4QLG0QFi6IuwrKQt3WKv7jSlvkZ63IqvVjUi6VACbl hvZjVf5jVz7lWr5fXL5aoc3WuZ3eTN7k9oev110sh9fRu0J3vVJZvRLmfy3h o1zaZQ6FlZ3aXbh6/nWmYOWFawnXFyuGb0u9lzyGfAowZbahe7l1wL4afz5+ 52Wd5wgx5B2TZuVV4m2M6XVLEDVXAE1KYlIpNPXpsHUu6SQx4OZnk9DRbRSW aThpHQKQjMpmygWhAAFWHS3lmZF96l8cMaUlnYmRAGKSgfr9rA6QAAP7xQkA 6/XhYSQJKysBAQyBAWTxqBchxwLBhCKRWM1h7Vep6rFokwVhZwD20AOZYxl3 3AuWcUr6NxnXyZz0XeidxRRQywTBAeG4AJoeETitATnzABXgVqiYhc91wuw0 EOOkinIkYiPobPddEqETEwLP1waxAYf7h5m8WROg7xAwgW6IipR+4RoD/rIJ YI4FccY+fNRld5UDQQClXep0KtnN7ADOCMsVcQFccd8PEIzP6bqoyAAJkEnk OAGOpgFrmqbi1u8kIaYx4RotqREakKTGa49bSYWfZd8iH+SVTu4FYbnOOO4J IQAHXmAx7+h0TtrcHWQSwPQQ8W8hwwAYUL7jHIL3YhfjBNUR4LgDERIYwGPd nRJ3WaVVzxEZit+AEoSiqPXK6OR6vcDNiBDEPvZl78+7jtuu5NZrmQDJ2Jwy +S1t78OREoTxd9zU2YbImQHXOBCsOIgsie0kMfgw2Z40YwGGCfuHfwEVcMRR pAANDJ8QMInJdubW/RAMLPlqhFCWD5ZzzuOa/nhYNWweQwHTbhpzCkD9+EH9 Nm0f2r9aCvAA+HE7ytqc0SXe5t/zW/EA5r8AR3f+IZrsuwn+RbET+vET9uET +PEToiP0maet9XH/ALFAIAOCDQYEEBBggAOGDBs4YFDggYMB/RY4aCCgX78E CfoVaMCgwUgGAQh0AJBS5cqVCBywhLmSQz8MMQEgaGATgAAKNgtE0JnyAQIA B3LCtNAv5oQCKGNC2LhRAAIEBaJuNFDAQICoCgdojCpgwMGrBQ5UvIrwar8B BdBG1fq2nwADW6+Odbt2rNyNe6+KHUCAa1cCX/9mBRt1rIDEGw88Hqx47N/C ZDcGyGr46smgKw+8/uyscuYFmwmOxuTpE2jQoUVPr0y6tIAHmxsoVLAgoa2B hRRuaz1g9vYDuggGPLitADiBCBQm1D1AAIEFCxGmHhDggDoCAmYLWMA9IDiB BNQdEDhgfEKFCwnMGiCgALwF6FovVMCvFT4C3BCmGjjrNgv8o0oACcCjQIAD skLgvgqyWnCABsC7AEIA8auAAgLqMqDBCqx7LCvcKGgLgQMCgMA35ywITSWX WkxppppiMk2nAHqK6afOWjMqpthgkqCp0Dg4KKEKVFowugRSykA87GaMQDz4 NgDAA/fOAm0DBXk7EoAGpKtLJbO4A42CMQeg0ssN3YLARa0KIEol94w7/gqD LYOjDQAMShQgA5UUjI4BlRZAjzccAUigO/JU8qAu7gQFgMgCTDqANg8K0G8A P2Fk6UUYR7MJJ50EmEC1HYnqEaYKlIKJqTyD2gABhQyYsaiE+jEgJQy86oc0 AKIcj0oPuIsONA3+Sw0ABj5qSyUCurMopQnm0kiDlBpQiKsHVNrqqzhTkvWg BVK6gK2vAsjzAl5r5VWBQc3t59AGADxg3JQ8+KoiSDeYK4AAhPQAoQIIoInT TkFrUcbSXmMpWZh0ZA1VhlP6kSVXYTRg25UqIJDFSCWIIGQOUorAJLeEja6A 7FLSgNobKY6guy4BMJOAA1Pa4IEAGJAgTwwg/ogAZF9pDhmCmWl+AIIHPOYA 6JAlUKmDkIN2CgCQQx76w6LTDGqCon31QAIGBEjRUgmgaiCCqg0uCuEhew3V 7YZLzXE1nXicGICKVwpy7aAOaBMm5jqrID0EFEDJgwYQSOAAugGwLQAMXm2b pQWWlCmATdnmvHPPkeJspQ762bxzTxMumMa8U3KYJYjvltjHfiiXdjYYD9CY JQIC/5ylckf2zN5BMVdpA8l7Rz75Fi0IPerUPT/97aE7XX2nx1232ya8Y1qV dgCY8lsnwGMaXHlyAwAeSUgH/Rbn482HP37m/R69dM6j70xh1W08FPtTXeNe PzowQAJ6IGYb8AAB/hW4wA5kjHzZS165/HaA9aXkciwxnv3it0HPVaB5MSJd 7z7DKVDFBH8rad1KXqe92MFES2uBYQxjyLuV7C5+v2NJvViiAOK5r1YcBCLn 5seS0f3wfnILiv5gUiObkMpUEQNgTDRAnQtQ8QLnYQ8VtWiBKnKROlyrIQSR p670pYSClush5N4XRDZyinllBED9endCnZQQJqKyycvq9r9UwehivRuAGHuH Q89UEAALaJ8ajdhGRtrEg/QL4efoaBMlsoSJqOmfCgW5ku1x6o+fK5/5yJhD Q15wJRlsZCp1MkSZRNJzuOMUv6bXEiT+6Xqa5GP1YtI35NkQfhLMofBS/sJD DK5Rlcek2Afj+DzT6ZIlHDDmShJgSBRmUkybVEkn/Wi73oVSeRjoBxzPuBJT Fk9zyESn3ggARzl2zgMWcIvaWgTOWVJsKxGAY0oCsLoVxkSbLZoAAbzHtkBy qgMMsMAGNLBQhi50A6vCgEIdioAFcIChHVjAASzqUDvVM51tfCQRXcm2XUUF m9nUSAGOpsao0BByCuCKAqzlPyj2EaDcBOVJMaiRfInFp1/RCGN+6q+f3qqn CSmABj/KRlaKZqQGa0BZOnOBxByAJcuKyjpXEoGr5O6afJRpBsQ6VrKWNWYX KGta1TpWDGjAm53ZwAAggIEL1NWudcWABPrB/h67YsAACaBrXTOQAFrd1QL5 XCpTlekBAWyIQ4+FbGQN0JiPSJZDkenLYynr2LrAUD8c6odOW4OAfvjLtKdF rb8uk1rWtla1LoXVADxmk1EWEo2JTewbYZKBpEHAt78FbnB/GwEHRGYBwhXu Ww4QgeHqLCoKYK5viXsVBkQXuErlJFE6wAEObKC73/VueL/LgYBmALznFW96 x+vd8OkkrrONCSGRJEwAEBO3Hw1p/DjgAAQsEiYeKG4/CGBNrk4HJho4wEYQ gN3/ca4COE3le4NSW/Xd9r7pbOpSMTCB9k5gAAOVljU51RohQriRcV2p7wRI Sssl8sKpzPCL+SbQ/iCSmG0Pbi8bJawT+ZqxlGmUMSN1G2SW6AbEybOxweB5 ZCByQADwhQmFzUhf+xK5kfm1srQ+XGMXt+jBTObgjmm7YtuSE8hZ5mCMiRxQ MH8uyZz6MjJRPOFwspicBppanvW8Zz732c9/BnSgBR2BsT1g0IdGdKBh6rRE i5glb4YRPHMcRDHHF312VgkEBvYsTnfa058GdahFPWpSl5rUeVGUqVW96lKr zCSs7s6/QgNpL5uYkU6GsorFSV80p/ICylwzjdkWgQLMusuhifMxKx3lAEyQ mr0WMrCDLAFhGyxmxu7ckim9AW53mwNNmkB3uz1u8tJE3N41gALOPW52/rfb 3e+Gd7zlPW96u5u8A0CsjI3MOWJj28FC4mAHKrMXvwCG4ATn6cH9dXCGN9zh D4d4xCU+cYqPJQAIaHNiPZxxlvS7MxA4dme0HXAUzQc/4DnOfUw+n+r0YwIm v0B6qHNymuOm5uCxec5xvvOb91znPuf5z4UedKL7/AL51veWh13szjDgzMi2 tfKKCBOB53olUi7Ks6G9dUZSm+NbJUBQNBBVm/376wbrQADqSSSrq6THN9E6 1+XOwX0vPShRlUqJJ927tK99ACm++qU9kxMPFN7wh0d84hW/eMY33vGPh3zk JT95yhf+e5yZPAAgQOPFr8XsQOw7TNhOZzh6/qS0MkR96lW/eta33vWvh33s V2/a08Mes6n/PMn93nZykVklGfDiXYU/fOIX3/jHR37ylb985jff+cU3CH4o wEXlY4ABA7gABYrvgKjkim2SBr3aRS9b0s/d/OhkM7+ZXscCPJ1wUU9e6In4 9wkL/vz377rSrb1+2HUu2RuUP5kgPx6rM/zbOi84Jq9TP3/7PvhDngAUjQEc M6QzwArsnfSzuwa7MYADQPGbP8BzO/uzwBFMnrrbPwZUMgfkOw8UQN4DgLcj wRdDQFVSwAyEotzrwHrqAPrjMRGMwR9kGxPkFI+7wQ08O4NiwQh0QRgEwsSa wVSqwRPUwBQ8QhiB/sAYkcD4KsAm5EKAqrYh5D8W8j8OjJ8rjCMepC0f7MI1 BBL9A0MUdCMV/BwzHD0CpEA2bKQnbKQofMMphDM59Bwz3EEQPJ87xMMmFEIY IcL+w8EyTEIsXMItPER00sOu+0JFDEN/CrmgGLkcHL9INMRJjEEMlMIiNBgc Cz8dRENLC0VRHMFEbJFFFMMSq8IWocMsjDJJdMVUqsQ24kNMhEMY+T9HVEVC fEE13EVEdENg9ENhBMTOuUVQTMZj6kU2+sVYzESYoLXQ6ERi/MTym8Y1JMU+ NMU/3Ls5fMQzNEasC8cfhMXQkEVNHMNaDI1oBMd2bKNqDKJrhMdsfLRN/lyl Z+Qce7RDfOTCcWTGcnTGcwzEdBzE+mtFg5S7d+yMeNRGgLSJboQfgpxAiWQj fQQifqxIf8yueUxFqltFZotIj4Q2igwKi/xHk9S9byxIluQgkKS7S8TGYFwe gWQbjtTClbTJLEPInWzGWmNIaHTIlPQdZBxK83NJnYDJkqTFk3wmXNS1p4wf nNwgkXxJkswmjOQen0S7pVxHp9RKrotKm5jKsJRJT7xKaUxL5eHK+PFKqQRL oRBLpCBLJNy9e5xL8yvKfuRJqEvKgTRLiAzM+1vLmGhLvcy2vrTCdKzDjlzM 3qlL+LlLtsxLANjG96PHzhBEpgw8obzMxGpM/ph4TM/cS5YYxo2kTKy8Ol08 TYPJTPPZTMfszM/kRMm0xdiUy9rcusEcycJ8v8P8ycTsQdMUTnRKzY7bzdaE Dd+sR+AEzOaEkdtUntxUzeh8S2+MS8UMonzAAHcoz/M0z/REz/VMT7Fiz/dU z/iEz/mUz/qcT+TUTJ2Ex7A7SqgLzaAAylzETyukgAY4BChA0ARV0AVlUCiI hmfohzp4ggal0Aq10AvF0AR1Awf4ggHtnefcKu/UO6sUHdJ0O9rsnXZQAT4g Al7gBm+A0RiV0RmlURglhn4Iglqo0R3l0R710R+N0VtYgkOoAQ5LpY1bwP4E TRJVQvFMHg6oAHXg/gUgBdJgwIV+0AMdpdIt5VIq1dJuAIQXkIf/bBEQVYnV 5E2deE3zCVAV89CVmEEOWIAmEIdg6NIdDQYr7Qd1QIU79dM/jVEt9YZaiIUe UAFLrMJrU9LeJFObaNPZZE6V4AIugAA3uAVBBVQ71dQrVQdMBdRP9QY77VFR jVFxoIUScEHkMVOSEdENfNPqLEYn9ZwRWIVZAFVvcIVSKIUqQIUq+AZQ6Ac2 CARf9dVLEIdbvVNS5VFP9YZR+IF3CCIktUFGbMBGjYlHPdFITQl8wIVg2AJQ PQY1QAM0qINxrQM76AdIUINyLdcT0AVkhdcZrdMZrYVNmKmuXEajVMha/rNW qrPO5fycDfiAbvCGcQjVbdAGgoVRhfWGbmBYhrVTY3CBfqAHfigtzDqtfsCF eJXRbtiGbQAGb+CGj41Rh11Yhp1RZY1RW/Cq/ExU/txX/2RSSKSzVwWAFPgF Gf0BEkABNSgGYGCGXohRdHAGGB0FSMgDGd2Cj90GZPhYbhiGPQUHpv1YlIXX XGgGETABEyiEADiDQ3jRUmABIdBRJIAEH53XGKWGe6C7fCXMRQ3IfiWiaIoj AnDBXYlUePiEUv2EZaiCWrAFK9iEfhBaGMWEAAiFYEiFZZgFTtAEKtDRR9AE TJ2GPWVWjoVRT4gGVHCFaugBGLgDRhDVYYiB/l9AhWXAAXHABCrghCrQhCuQ VxnlBnXIhw0ikURtVSULpAmQgN713d8F3uAV3t7lqgbg3eM9GwFgAN4V3gIN LeYd3uCdgAm4gCMg1Vo4AzPoU5FVhRUoXG/ghACIg1qAhmfwhh54hmVYhV1Q gxxohpCFUV2wXMyl0W7oB1qI0WVgBmjwhW/1hiwIgF8YhH6ghCM4Ak84hE04 A0+oBhk9VhmVhTGY3uilYOGdAAVw2+KE24yUvQ724NfDDCmQ0VooA+2VUWdA h0AFBTSwBQHYA2xwAWyohD0wg3RAhVWoghit3E6lXxkFBvvdhRhFBFmwhmTY Bhh1BTM4h0R4Bm4I/oAjkAQ96IdUQARJiF0Z9YMPjiE9GjaYpVaDyQDYYlO6 3cElbDbO0YDUHWEZsIHthVFo+F5vuIZ+EAJ++AZsCABs2IJvsIEd8NQdvlyO td8phdFvJQYXOGJvQAU+SIEVSOFYOIN+8AFCmAEByAR6nVFbONQLQ1PpTCVs 7T3TvIdpoFFkiAFQ2AMYEIVgcAZoGOEw4AdhCAZjCIEiMIIiOIIUAAJmgF0Y BeQenlFcqAM4WII68ARF0INkeFEYPYYboIdCAIYZgAMbgAQbIIQTMAIZzVMa 3YTava9OtjJQPkbTnABqCIZjeIJbENVRiIIoMGdvIAZicOBViIJsCFUr/ogG J3CFbpAGdGgFN/5lYI7RYNiFdg6FUmhnTBDUbhgGYXAFcYiEaBAGRqCFaIAF V4BRURXVXIDdbiCFL+Dk3H0xcQYmg+EAGpiFW9ABJhCEY4hRcigGlQXUgBbo UNXogS5VUX3gUB1ondZpcXgCU0AGb8iEEeBkL57FICNpFE2iMagFafADcTCE cojRZugHQpBpP6Vpgd5mm85ojQZrGE3brPYGGrACYHCDX5gCZ0olcCay0TxL oeSAF3joUxgCRdhpq05aZN1qYN7pru7qnf5rn/4FQFAFQd0BK+CGF/gFSmDr RnJrpf5Xy+SUfKDrYBCHYdhpb3CGfkgCsu7S/r7uYcDW6Z7+arEuVW+ohn5o 4xgFhycwAnVe65A2zqUiabSkpDHA6BqdhH7IA9DmUtGmX9I+ba82btJe7TBw Y2/IBSqA0Uh4bEZS1JhNrKUe0LnebRrt7M/m6/mt6eMOa/Au7jxdbRNYbhl1 bNreYHSC6+scErre0c7+7e7m4e8W7NRG7fz2hvte7RU47xid7W8W6Qu7baHM B92O736IBHgVbswlbvGGcPLuB+Xe0fQW8Nr+KOtmGw4gAzp4hEq4BBCvhEe4 hN4Ggkf48BBP8REX8RV38RYH1vqu6QdP2xrH7/32BmuY8P+GUSmI7jaa7i8e 6ckOShjhgpToABAI/oAQ4IcQYHInvxUnd/Imn3Ipp/Inr/Is1wgZp99rGIYv H4ZpAPNpEPMwL3Myx4Uvn4Y0D3NcmIYn6AcWOAUxP/MwN4JaQqfIlrH2BtgW 8YIj7wASuIFBJ3RCd4EQsINlKPRFZ/RGH/RlCAHv7uFUqActhr2W/Sg9H/K/ rMnKRvAahdBIAO4tvVEux9wo6Ac1SAd1YHVW34FXd3VY34FWn/VWV4d0iGQ7 IAN1cINEcANe5/UeMOoLX29kKvAN/3Tt7odFYHBJp184J9taqAVxkPZpr3Zq l3Zst/Zsl3ZbmHBO0HZqp3ZHGHbcCvKk3nMiF9ANh+8a7ewFp+9ARlZU/scD G9dvUr1v1J5jCq/RSCj3xNJ0AldOyv6Udld2UbdpTe3qLW3wee8HQBjs4s72 UJ1X0p5j/97RKfj3pQr4+zp2g7Hs7J5RZ6iHBbeFGkiHVCAHX9eB0Hb2U++H eg/vbXYFNmADFOCFWjiFGojp0p5j895R6FZv6rZtdXdTZBf5E1bwW0CDVziG HeCDHpCEfuiEUZfRhr9VOAeEB7dTcDgDaDgGXSCFRBACWCCF+754HvcGCzd3 pJbHtzZ6SGX3pI/RI0CDKUiEMOCE/Z72RxCAP7B6HX55jqX3iN/vYMgEAUAE GL0ESR6FaU/tfVd7oSd2os/wgWfFud9RV3AF/lTI+2+IUVdYhhhQ+x3FelBF dYgv7a+eAn6gBBilAgGoATOIAjeu059Xe7YH+AH3+LjPVrYJ+R5FhR0wA9AX B3HAgwBY/OAe/Hild64PhikQABH2hgHegyIIANuX42VIhNz/cTbqeNz6eBJK 9hoNhlUoAFr4BSeogQFYBW6wWh89/U/VesPPU1fYhESQhWuQgX6AA0UAiGW1 vBEUR7BbN4IKF1ppAOAhxIgSJ1KsaBFiBAIXHz5AsPEjyJAQOwS4MJHDAAsX L/TrIPIhhxeuFtIsuArGmhSfztCoca0mUIXT+qkbGPQoUppR+uERF4xgsKfe onq70iMRn1271pxp/mUw6tenYqdGfdrwJVqREQp87Jj27UuSJiV2GFBhZT8O aPONmanF0Zaj4FwNHDzTm9OCUhMjfjq0aNLISJfioYpYIdVa4mp9c4pK80KD kc/CLT1xbVuPpldTlHsy5cUMAfS+5NC3FrUjsIwGtWxZdNmCUB0T5S35uMKl gBj7lor8KCpvpFmbRr3RLfXsAFxL5CBAwAED4seT71eAPPr04gmsqIXrjbcg 1JCKE81Yi2j8BPUjFket+HMBPsFUc8MFCFQw10xyDCUOaQdXRqk9SB13EXnw gAMZarihAwr000ADHIrIIQMp1LKKHt4QsQpSwQBnH3CLvfiYcQcmpZxo/mQZ aONCqwzRjSJCtAAAFxOiZd1F2BlZWoUvYRCAS7X15Q0WNliDmCLL9GBDEsA4 U4cNpnhDyDI2sFAMFctMskkjgNjgSTM27AKVODTyKBlljOWY453ePEFIMEOw oQKRS6rF1nWqGfpWkyKxRJtIts0UzDcE1SKCGX18csM2ysDyTXT96NGHKtNU wk8enHxTSx8IkMGIUS7+B1mfk/UDSIE61lqLE+jsgoiDi4KEpEVKChtXSW9d MNteUy5Uiww2oFIOp8pEc81PmwSgyi/BSMJPI9Vk4803B7hRn2J21nrUgE1h JpVltYqzRzBWjHDssBolii9ajYbEUpSRykQT/rR20EBCENwoY8YYjXjjyiT9 1BGMJvzUwIYo3nCCgBu1yDhrjesuhCO8JYusBUHT8VsRsRUZu/JG/oL0KFox HaZQLTWo4cgyPgBzAzHoPhUOPZPcEcAi0ZHLMWhT1QmgyEDluZhCfPYplcow S9QyRS9rXZHMHy0LaUg2EyyDGd/gEkIxyqRiRSx+ftJGAj0MEoAYUtyiMdMz Qh21UrfmmGutWAf7dURcT+Q14nQlmxbAzd4MFSxO1OLKOdYIc4QRT3QTSS9G +OIKFb74Qoow3tSiAy5TDQcy4DW1m2u8V6d8eOMARLhv7mA/jhbNtQ0ce1Dq Ek8QyTvWfqfhvWOE/miSijofUdgbjV3z8PSta/zxeVb9vcjNT6+4RIw7Xz1e ZIMk6fFAcU/8Un4wt5hztkvXxfS6Q1+s9Plv9/tLrveSfQwAGgY8IAITqMAF JrAXB3yCKP52vAHVARoOVOAFGahBDU6iAPkYn76i5z/qAdBRLQmJF4rEgH6w sIUufCEMYyhDFkKiCBIk3hPsMcMd8nCH9XjH+Pbnsv7lD30WCZ5IMBAGQliC EJlgwhMzkQlCMIGKVmQCD7CoRR5M0YlZ1CIh4MAEJkjhEzeM3VLYkAdCsJEH bCSEG98oxznSsY5sDEUaEuABiXjha+SLiPl6Z8SKCDBSzmrfQt4Xu9lh/qaR 4SOIFO4VRAmN8CGDpEjkXsKXySHSG4oEXPJ0tTweiUUKuGvc7kRYyf/NBXh5 wR4nEfnJqFEmV1ZjHkEWcUrE/REigczdJSdSyLJlr5OePCMombKnqtUPl94w Zf56yREiTi+YEkEiMWPZvlmKrJYm01XhpgLNSfKuktaMyDBBskljCgWZURvQ cr45SqCEjCZS0WU0Q8i/VbJSWScUnjaPx811eVN5zexNUqQyTudJEwC/bNw5 IYLN9RWzkwOtFY7eJRx7eiMhzxHLIvBHTlWas4T/YhZAgTILa1jDGLUwRjWQ IQ5kYCMY3SjGMaqBLZ16gxvXQAZBjMENgly0/k+UQYU1qmEMWegUG7mYxTW4 EYxjXCMX2yiGN7RgjWJcIyEvrcYtmqlQB0RTiF2j5vlMOrN/imSdNUlBD8ag BjeoAQXMoIIe0PANa9iDEokwAz12gKth9CMd5AoAKIhDq/YN6A1u2MQPSMCG ydpBCELoRyrEkYh+XGMY/PDGD9QwBDWcQhyWMIAM6hC3hWxhG8FYBFlHahEI oFWQahUbSg05E2AIISHBcAIaOFGLnCJjEJD4AzAmwQZPJDYYuLADfi4Rgx+A wBjfCAAgiOrObvZDAGZABSqycYxaiGIZwQhCP+yQCUjUo7MB8EYyeoCKX2RD E3YoAiqCgIZSLIQY/nwohhQUcAELELjABj4wghOs4AVbAAMMIMCAF3yBBTCA nx3ohwU8wIENc7jDHt5wBzDQjwx04MMmBnE7UHCFWrzCCU2oTw2+qxBtbEkS 3lBCP5ohlWm4IDCOIIAokmGL6+LqmIvtHgvP4DGCXGEZnwjUCfgQBEEEwBrT qIc3YJHjVgQDEwOghDjiQA9NKIQaQyiFDgCBhgEQgM1ubjOc3yznONN5znaO 8wAE0I8B3JnPbNYAPwFwgD1/J88CMDSiC/2d73R30YdW9KMjzWheOMEP3hDC MHIm44MwAQ2hCIYc+uEM0fA4Ib7oASPGMANGuGAI2j0y/FhYhiV7Yw/9/tBE MIhggyIMwQ9osDKWawGLZdhjFUoYQCTEkQQBUEEhuBgCKhQxhBFwIB8c2MCG sX3tbHN7297WNri7He5vc+BCBMC2tr3N7UADgAMVeDe84y3veFsgAv2YwLzz He99hOEKxzhHNtgQC3Goow7CRcY1gDEIO4hCHJtwgydY5I1hJIMgz6hDImYQ g0AEwBAeK+qdBhSA76ICGdsQxBE8pgcbpEMAgCCANajxXm1sgRMrgEEhBGAJ VODBDleoGiB60ApHPKCs7BZWJnXrDVnI4BgE2UIYzjAGEKDAAAxgQSV+cAJU ZKEfs5i4ALwhZkRwoxsCCIILVvCDT4BiuwTt/sc6EHCEIBBgCczIbC2IUAcg 8CMUArDGMN6LgxgEAQRBOFEBamAALNBkHNvwxiIk6TwImPXo2pnoR8wWnKfU AlvYAAc2rOHaYxijoz/pKTayWgyPYgMZxsCWMUDOI+W4AlvFeKksNnOMWwwX HMUARy5u74pibNUg4sCCKOLAJ+dIIbYMrbzlqZPOj+RjYGN5SmCu7zrtc3/7 rpO9jZRTi1p85jPjP//4CUOY85uf/ORPRT+qsRB4LaLoso3+5dlatilx/xi2 AEb3BaD3jQX4HciArIP7oZ/7lR/6tV8CcoYbxF9QSIH9MZQ+4V92YN5GaN4A boI9EMJXDKAICmAB/gbIUgyBAjpgA66gAn6DOkigI72WSD0fBk7I9G2g9Q3g M9TDIoSgAP6gkdUTLcGd+bWfCipgCo6fC8IgVCgEJVRg7zRUDQbQK2lSDl7f DvbgCG5h95Xgc5wgErLfAo4fAz4gZ7wgMcyfQtSf0U1hBubW/t0MFtqDFjYh EHah29XKAZIhH4ahH6LfEs6JGgYDBeaTG2ag/lHUpLgOVDwDHfqgIzEiFwZh JymHCpZhEfYhA37GN+wAE0piId7fIcKFBl7EOoWF8WVhCDYhK0riQXkD7CDS UoQBDqSDLd4iLuaiLuKiHqhBP/CBIvwAERDBD6QDEazDDjhfFELfKAYQ/hyu TwpYQiYsAiFQ4yJcoyfUQxBMQSaEghR9IziGYzeKYyQYQR4aVQ+lozrWw4e0 YTOWRtKFRAcQQDqyowvZIwvhoz3u4wvB2iL1Qw9MAy4Mw0AO5DQQ5DAcpEEi pEImZELCghn0AxQMA0VWJEU+gTLmTiq9oz+pz0d0ADtMAgO5QD2owQadZAIx wzneyVKswyWKYR8+IANywgteCVCEQ0aiEjNyJG55JA4GVBZqRn0MJVEWpVES pS6s5OzdCh8aIUzKZAu+oCC2Yivskh/tJE+mj+QEhSqChYt45VeGpVOIpYt4 IXK05BH+oVoGohoSRFW6Y1Y6o09eBPsAhSMu/oLHgIVTDCV+1EcwaIFeguXT +CPg7OEKOqBTJiADsuVCAEMeUAkUauQFxuVaBUw2cSUP1ocrsMIwVMUT6EJ9 EIMvCEN9XAIrmM4soMIwTEF9mOVxoGUCwgLnIAJ4ZYIRHAEgcEIqjEItsAIx RGU/TKU3oIITQIEuIILkLSNlutJcWoTNBANO0URQBsMl2IEAHEMn5FgwiMIN yEEOQEEwmIINDAIO9AIn9IMPaIZr4gncsR8o2MEdAIIz5EIo1IEQIAIzJEE/ 5AEreEIpAKcuLMSfeIMesEFyaiRWLuc1PSP1vUAt8AIbuAFQKYQzZGYwUAEL 9MMPZCgzeENwBoMx/ghAMfiCCxiDi1zX4Q2mEHKXS5KhHvSDJRhEN6iBmJiD N1xCPxBCP8RCMIBDAjImQYTCD3CDIvzBgeqkgpqQZa6POiyCLxAEDDCCQjTD B3pMJQzAISjCISSCMwRDAARNMQiAMeSCJ/RDCmgBKrjAHHycUtrIAa6fZvRA joHDODRDNHSDOZhDJQRACIAALLQfMKTfFYDD/NmCDPzCFFil1mxkkmqlSHAB X5TCE0yBKuwCbxwBP1jBZlzCAChCOhzCITSDh+4CiIqoOACDMATAETBCAKTo ekZGS/JhMLjCMEBCDsyCneJpN+DoG4iBCwgX+YnDYJzf8nGCN7RCTvJS/oI2 KgDcIF06aC0YwSfQxCXwl4tUAggAQgDMwA4wQzA0gy9wAi4owzZkAS9wwhjY ASMIAAqqaCUS4flZATFwgt/dQjRMgiyAAzU4Qj/QQR5AAiYQ62YkIFC8pSgy qzBVocAEFLXGQB68AC2kQg5ojCckQAxogzgIAQm4ATvoAicsAwIGw6veSD+g 4PlpAgvIQA78wDiIwxOYAR+owR64gBSIwzM8wWcQxjg4YFsaLA0i7EowqEVw gRe4VWR41NM93TZ4lE0t7UG0E2G+U3uWXzBswy8cgznUQp7KAjnkgjhsAziY AzeIgzkAwzhwAzhwgzmk7Tj8wtqqrTh0A7LC/iXQCpPQ0uUhGdPI2orJjh/Z jsM4vK05/G2eioPapm0thK1m+K2MegPguuUCZAAGTC7lVq7lXi7mZq7mYoAG MMCyNipLMACIjC7plu7oLgAB2AI7vdqKvl2Lfobhku3YmgPgboPskq3ZZq1Q +uhmxG1HIUZCSEIB0IOfFa/xHi/yJq/yGi941K1FZIACRK/0Ti/1Tu8CzMM0 BIU4gBdBoMItPcfeHkWsEuvguu3Xtuz2joNmuAI41AedAgM4BCq6JATg2tQ4 HMI7aID+7i//9q///i8ABzD/boDzTggFDEMzmZYNJIIgANUnTOudhO9UIGFj gZcFo0LYkq05zAIp/giCGRCDLtTAGViD+9WHAgLFLyRCcxYwT3oAA/xc1UTC ALTCMSSCLchCMqBDn8TiuliBHgzBOgzBEBhCxKxBEQACEAtxKwSuObhCD9QA MuyCDOQoDiiD9xJrzqILTQBCBLAw0OpDKIRGDcwAbxiCPYiJZIiDI0iBI7Sx I0iCIvRDDRQCJbixEsDwgaSDOvZDNNQCN4yDFdADImxGFUCCGLiBM5gfYQzs +dGEOLTABHgxwraDKeRIzkgLkynCGvRCb9SPNuiZOpYDj7RCFEiDKUtDOTRD P6zAKZ9yNWhtNwSyI4jDzm5CjD2BAooDYcAuTSBDGEgy0O5DJ1QNH6xA/qXU Ahscwgwww1DVhIsshDY0AzN4AjNUMzMoQz9AwjR7wjJcs/zZiHNIxVIAAVKE wgAoAUHcQT8owRxAwhWP3y804EJ0ww+0AzADLTs0czBYgh0w3iHQAB6ggTI4 HY8QQ2G1Lkb1wxwghStsghGIQyycQT/IQRq482Z8hvqin3MQAz7cM9BqwAh4 VC0QwiTUACl0QzCcQhP0iQRLDVMgxeWQAh+wQzXQwhmcwe0R6xguBCZ8gEfX rT7wgn24n6UoDY88hlEj2UJDx0VzQlSgglM/9VNsRlkYBSo8gzz8dN02ABZ8 7zwhR0vLzksfBW+UNc4ohFF7DItRgFbXrQfo+UMitOX2EEVSxxoeIIVR5zVa n7WlGEMYsHVbJykXFAlEaMAL8ALxhHXgQDA9iUbTPLZji8YvDEEX7FFgF7AG gEEjrJbIDIUb1HXsQEHJHkUwxIppQ8Vpt4I6wMOSXnbdTsAYQFAuoHSf0EI9 fML3Ro0T8MMwO3NjTDVVjOVvI0MsnEIqjIA9uzYwe8A7RIACNAE1TEN0T7d0 Vzd1X7d044IeDAM1YLd3Wzd4f/d0g0I64IJ4dzd6T3d3Szd6swEDwENyK7dW v0M83EN937d95zd+73d+78M+xAN/B7h+D7iA1/c97MME7AOB3wODG3h+NziD 6/cHAW1AAAA7 --0-74666807-1033492337=:15730-- From roth@amplepower.com Tue Oct 01 13:25:18 2002 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 17wQlq-0005Ku-00 for simulavr-devel@mail.freesoftware.fsf.org; Tue, 01 Oct 2002 13:25:18 -0400 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 17wQlo-0005Ke-00 for simulavr-devel@mail.freesoftware.fsf.org; Tue, 01 Oct 2002 13:25:17 -0400 Received: from sense-smead-139.oz.net ([216.39.162.139] helo=thevenin.amplepower.com) by monty-python.gnu.org with esmtp (Exim 4.10) id 17wQlo-0005Ka-00 for Simulavr-devel@mail.freesoftware.fsf.org; Tue, 01 Oct 2002 13:25:16 -0400 Received: from [192.168.8.30] (helo=knuth.amplepower.com ident=mail) by thevenin.amplepower.com with esmtp (Exim 3.35 #1 (Debian)) id 17wQj2-0001AO-00; Tue, 01 Oct 2002 10:22:24 -0700 Received: from roth (helo=localhost) by knuth.amplepower.com with local-esmtp (Exim 3.35 #1 (Debian)) id 17wQlb-0001sc-00; Tue, 01 Oct 2002 10:25:03 -0700 From: "Theodore A. Roth" X-X-Sender: roth@knuth.amplepower.com To: eban cc: Simulavr-devel@mail.freesoftware.fsf.org Subject: Re: [Simulavr-devel] eeprom support In-Reply-To: <20021001171217.16415.qmail@web10002.mail.yahoo.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: simulavr-devel-admin@mail.freesoftware.fsf.org Errors-To: simulavr-devel-admin@mail.freesoftware.fsf.org X-BeenThere: simulavr-devel@mail.freesoftware.fsf.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Discussion of simulavr development. List-Unsubscribe: , List-Archive: Date: Tue Oct 1 13:27:04 2002 X-Original-Date: Tue, 1 Oct 2002 10:25:03 -0700 (PDT) On Tue, 1 Oct 2002, eban wrote: :) Wow, that was fast and everything seems to be working :) fine!!! :) :) I saw that you had already programmed the same things :) that were missing for the flash memory, but thought :) that there were still many "obscure and difficult" :) things to do. :) :) The type of external eeprom that I would like to :) simulate is an i2c 24LC*. I attach an image of how :) it's connected. I hope nobody gets upset because of :) this attachment. :) :) I know it's a little bit difficult to do, but it's ok. :) I don't really need it for now. This looks like what I had assumed. It's going to be connected via some peripheral interface which simulavr doesn't yet have. I really want to do this but it's kinda low priority for me right now. The battle of too many projects and not enough time continues... Ted Roth From ken@restivo.org Wed Oct 02 00:30:35 2002 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 17wb9f-0000Uq-00 for simulavr-devel@mail.freesoftware.fsf.org; Wed, 02 Oct 2002 00:30:35 -0400 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 17wb9d-0000UV-00 for simulavr-devel@mail.freesoftware.fsf.org; Wed, 02 Oct 2002 00:30:34 -0400 Received: from 64-121-1-69.c3-0.sfo-ubr1.sfrn-sfo.ca.cable.rcn.com ([64.121.1.69] helo=fred.home.restivo.org) by monty-python.gnu.org with esmtp (Exim 4.10) id 17wb9c-0000UO-00 for Simulavr-devel@mail.freesoftware.fsf.org; Wed, 02 Oct 2002 00:30:33 -0400 Received: (from ken@localhost) by fred.home.restivo.org (8.11.6/8.11.6) id g924UUH17487 for Simulavr-devel@mail.freesoftware.fsf.org; Tue, 1 Oct 2002 21:30:30 -0700 X-Authentication-Warning: fred.home.restivo.org: ken set sender to ken@restivo.org using -f From: ken restivo To: Simulavr-devel@mail.freesoftware.fsf.org Subject: Re: [Simulavr-devel] cleaned up uart patch Message-ID: <20021002043029.GA17482@fred.246gt.com> References: <20020919161043.GE5033@fred.246gt.com> Mime-Version: 1.0 Content-Type: text/plain Content-Disposition: inline; filename="msg.pgp" In-Reply-To: User-Agent: Mutt/1.3.25i Sender: simulavr-devel-admin@mail.freesoftware.fsf.org Errors-To: simulavr-devel-admin@mail.freesoftware.fsf.org X-BeenThere: simulavr-devel@mail.freesoftware.fsf.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Discussion of simulavr development. List-Unsubscribe: , List-Archive: Date: Wed Oct 2 00:31:01 2002 X-Original-Date: Tue, 1 Oct 2002 21:30:29 -0700 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 My apologies. I'm now 100% on daddy-duty, and when I'm not chasing a toddler around, I'm too burnt to code, and I just sit staring at the wall, shell-shocked. So, it might be a while before I get back to this, if at all, but I really hope I can. Sorry about that. - -ken - ------- On Thu, Sep 19, 2002 at 09:22:17AM -0700, Theodore A. Roth wrote: > :) > :) This weekend I'll (hopefully) have time to get back to this and other > :) AVR hacking. > > Keep on it. I doubt I'll have much time for simulavr this weekend as I've > been making progress on another related (yet to be announced) project that > I want to focus on. ;-) - -- - --------------- The world's most affordable web hosting. http://www.nearlyfreespeech.net -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE9mnZle8HF+6xeOIcRAvtZAKDcpbkMKFj/porDo3BXONOtHYcKsACgxO7M 66wf7WTLp1ADJDWpsm+hWq4= =y8X9 -----END PGP SIGNATURE----- From thibaud.gaillard@free.fr Tue Oct 08 11:17:17 2002 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 17yw6m-0006DJ-00 for simulavr-devel@mail.freesoftware.fsf.org; Tue, 08 Oct 2002 11:17:16 -0400 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 17yw6l-0006Cv-00 for simulavr-devel@mail.freesoftware.fsf.org; Tue, 08 Oct 2002 11:17:16 -0400 Received: from postfix3-1.free.fr ([213.228.0.44]) by monty-python.gnu.org with esmtp (Exim 4.10) id 17yw6k-0006BH-00 for simulavr-devel@mail.freesoftware.fsf.org; Tue, 08 Oct 2002 11:17:14 -0400 Received: from imp2-2.free.fr (imp2-2.free.fr [213.228.0.152]) by postfix3-1.free.fr (Postfix) with ESMTP id 95BC4D9E04; Tue, 8 Oct 2002 17:17:12 +0200 (MEST) Received: by imp2-2.free.fr (Postfix, from userid 33) id 75C888C01C; Tue, 8 Oct 2002 17:17:12 +0200 (MEST) To: simulavr-devel@mail.freesoftware.fsf.org Message-ID: <1034090232.3da2f6f848a03@imp.free.fr> From: Thibaud Gaillard MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="-MOQ10340902329b698c2e73c32ab5417a3a8940ef1ee8" User-Agent: IMP/PHP IMAP webmail program 2.2.6 X-Originating-IP: 195.6.168.50 Subject: [Simulavr-devel] RJMP/RCALL/BRBC/BRBS bug & configure error in simulavr-0.1.1, test-case and fix provided Sender: simulavr-devel-admin@mail.freesoftware.fsf.org Errors-To: simulavr-devel-admin@mail.freesoftware.fsf.org X-BeenThere: simulavr-devel@mail.freesoftware.fsf.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Discussion of simulavr development. List-Unsubscribe: , List-Archive: Date: Tue Oct 8 11:18:01 2002 X-Original-Date: Tue, 08 Oct 2002 17:17:12 +0200 (MEST) This message is in MIME format. ---MOQ10340902329b698c2e73c32ab5417a3a8940ef1ee8 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Hi, Playing a bit with GCC-generated AVR code, I found simulavr-0.1.1 to fail when it comes to handle negative relative jumps that cross the memory low boundary (still works fine crossing the high boundary). This bug impacts RJMP/RCALL/BRBC/BRBS opcodes (jump instructions with relative signed offsets). There is also a "configure" script problem, at least on a sparc-sun-solaris2.x host (/bin/sh does not handle "==" in "test" constructs, only "="). Test-case (rjump_bug.s) and fix (simulavr-0.1.1.patch) both for "configure" and "src/avrcore.c" provided. Thibaud PS: Theodore, I chose to resend this mail to the official mailing list, please forgive me for the double posting inconvenience :-) ---MOQ10340902329b698c2e73c32ab5417a3a8940ef1ee8 Content-Type: application/octet-stream; name="rjmp_bug.s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="rjmp_bug.s" LyoNCiAqIFRoaXMgc2hvcnQgY29kZSB0byBzaG93IGFuIFJKTVAgaW1wbGVtZW50YXRpb24NC iAqIGJ1ZyBpbiBzaW11bGF2ci0wLjEuMSwgYXQgbGVhc3Qgb24gdGhlIGF0OTBzODUxNQ0KIC oNCiAqIFRvIGFzc2VtYmxlLCBydW46DQogKiAgIGF2ci1hcyAtbW1jdT1hdDkwczg1MTUgLWd zdGFicyAtbyByam1wX2J1ZyByam1wX2J1Zy5zDQogKi8NCg0KLyoNCiAqIERvIGEgc21hbGwg cG9zaXRpdmUgUkpNUCwgdGhpcyB3b3JrcyBPSw0KICovDQoJLm9yZyAwDQoJcmptcAlzaG9yd F9wb3NpdGl2ZV9yam1wDQoNCi8qDQogKiBEbyBhIGxvbmcgbmVnYXRpdmUgUkpNUCwgdGhpcy BraWxscyBzaW11bGF2cg0KICovDQoJLm9yZyAweDEwMA0Kc2hvcnRfcG9zaXRpdmVfcmptcDo NCglyam1wCWxvbmdfbmVnYXRpdmVfcmptcA0KDQovKg0KICogTmV2ZXIgcmVhY2hlZCB3aXRo IHNpbXVsYXZyLTAuMS4xIDotKQ0KICovDQoJLm9yZyAweDE4MDANCmxvbmdfbmVnYXRpdmVfc mptcDoNCglyam1wCS4NCg== ---MOQ10340902329b698c2e73c32ab5417a3a8940ef1ee8 Content-Type: application/octet-stream; name="simulavr-0.1.1.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="simulavr-0.1.1.patch" KioqIGNvbmZpZ3VyZS5vcmlnCVR1ZSBTZXAgMTAgMDM6MzY6MjAgMjAwMg0KLS0tIGNvbmZpZ3Vy ZQlGcmkgT2N0ICA0IDEyOjQ0OjM4IDIwMDINCioqKioqKioqKioqKioqKg0KKioqIDE4MjgsMTgz MiAqKioqDQogIGlmIHRlc3QgIiR7ZW5hYmxlX2N1cnNlcytzZXR9IiA9IHNldDsgdGhlbg0KICAg IGVuYWJsZXZhbD0iJGVuYWJsZV9jdXJzZXMiDQohICAgaWYgdGVzdCAiJGVuYWJsZV9jdXJzZXMi ID09ICIiIC1vICIkZW5hYmxlX2N1cnNlcyIgPT0gInllcyI7IHRoZW4NCiAgCWFjX2N1cnNlc19k aXNwX2RpcnM9ImRpc3AiDQogIAllY2hvICIkYWNfdCIieWVzIiAxPiY2DQotLS0gMTgyOCwxODMy IC0tLS0NCiAgaWYgdGVzdCAiJHtlbmFibGVfY3Vyc2VzK3NldH0iID0gc2V0OyB0aGVuDQogICAg ZW5hYmxldmFsPSIkZW5hYmxlX2N1cnNlcyINCiEgICBpZiB0ZXN0ICIkZW5hYmxlX2N1cnNlcyIg PSAiIiAtbyAiJGVuYWJsZV9jdXJzZXMiID0gInllcyI7IHRoZW4NCiAgCWFjX2N1cnNlc19kaXNw X2RpcnM9ImRpc3AiDQogIAllY2hvICIkYWNfdCIieWVzIiAxPiY2DQoqKioqKioqKioqKioqKioN CioqKiAyNDcwLDI0NzQgKioqKg0KICBpZiB0ZXN0ICIke2VuYWJsZV9wZGYrc2V0fSIgPSBzZXQ7 IHRoZW4NCiAgICBlbmFibGV2YWw9IiRlbmFibGVfcGRmIg0KISAgIGlmIHRlc3QgIiRlbmFibGVf cGRmIiA9PSAieWVzIjsgdGhlbg0KICAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2DQogICAgIFRB UkdFVF9QREY9cGRmDQotLS0gMjQ3MCwyNDc0IC0tLS0NCiAgaWYgdGVzdCAiJHtlbmFibGVfcGRm K3NldH0iID0gc2V0OyB0aGVuDQogICAgZW5hYmxldmFsPSIkZW5hYmxlX3BkZiINCiEgICBpZiB0 ZXN0ICIkZW5hYmxlX3BkZiIgPSAieWVzIjsgdGhlbg0KICAgICBlY2hvICIkYWNfdCIieWVzIiAx PiY2DQogICAgIFRBUkdFVF9QREY9cGRmDQoqKioqKioqKioqKioqKioNCioqKiAyNDkxLDI0OTUg KioqKg0KICBpZiB0ZXN0ICIke2VuYWJsZV9wcytzZXR9IiA9IHNldDsgdGhlbg0KICAgIGVuYWJs ZXZhbD0iJGVuYWJsZV9wcyINCiEgICBpZiB0ZXN0ICIkZW5hYmxlX3BzIiA9PSAieWVzIjsgdGhl bg0KICAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2DQogICAgIFRBUkdFVF9QUz1wcw0KLS0tIDI0 OTEsMjQ5NSAtLS0tDQogIGlmIHRlc3QgIiR7ZW5hYmxlX3BzK3NldH0iID0gc2V0OyB0aGVuDQog ICAgZW5hYmxldmFsPSIkZW5hYmxlX3BzIg0KISAgIGlmIHRlc3QgIiRlbmFibGVfcHMiID0gInll cyI7IHRoZW4NCiAgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNg0KICAgICBUQVJHRVRfUFM9cHMN CioqKiBzcmMvYXZyY29yZS5jLm9yaWcJVGh1IFNlcCAgNSAwNjo0MTowOCAyMDAyDQotLS0gc3Jj L2F2cmNvcmUuYwlGcmkgT2N0ICA0IDEyOjQ3OjUyIDIwMDINCioqKioqKioqKioqKioqKg0KKioq IDYyMSw2MjkgKioqKg0KICBzdGF0aWMgdm9pZCBhZGp1c3RfUENfdG9fbWF4KCBBdnJDb3JlICpj b3JlICkNCiAgew0KISAgICAgaWYgKGNvcmUtPlBDIDwgMCkNCiEgICAgICAgICBjb3JlLT5QQyA9 IGNvcmUtPlBDX21heCArIGNvcmUtPlBDOw0KICANCiEgICAgIGlmIChjb3JlLT5QQyA+PSBjb3Jl LT5QQ19tYXgpDQohICAgICAgICAgY29yZS0+UEMgLT0gY29yZS0+UENfbWF4Ow0KICB9DQogIA0K LS0tIDYyMSw2MjkgLS0tLQ0KICBzdGF0aWMgdm9pZCBhZGp1c3RfUENfdG9fbWF4KCBBdnJDb3Jl ICpjb3JlICkNCiAgew0KISAgICAgaWYgKChjb3JlLT5QQyA8IDApIHx8IChjb3JlLT5QQyA+PSBj b3JlLT5QQ19tYXgpKQ0KISAgICAgICAgIGNvcmUtPlBDICU9IGNvcmUtPlBDX21heDsNCiAgDQoh ICAgICBpZiAoY29yZS0+UEMgPCAwKQ0KISAgICAgICAgIGNvcmUtPlBDICs9IGNvcmUtPlBDX21h eDsNCiAgfQ0KICANCg== ---MOQ10340902329b698c2e73c32ab5417a3a8940ef1ee8-- From troth@verinet.com Tue Oct 08 12:45:32 2002 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 17yxUC-0000KP-00 for simulavr-devel@mail.freesoftware.fsf.org; Tue, 08 Oct 2002 12:45:32 -0400 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 17yxSN-0007Q9-00 for simulavr-devel@mail.freesoftware.fsf.org; Tue, 08 Oct 2002 12:43:43 -0400 Received: from sense-smead-139.oz.net ([216.39.162.139] helo=thevenin.amplepower.com) by monty-python.gnu.org with esmtp (Exim 4.10) id 17yxSN-0007Lv-00 for simulavr-devel@mail.freesoftware.fsf.org; Tue, 08 Oct 2002 12:43:39 -0400 Received: from [192.168.8.29] (helo=bozoland.mynet) by thevenin.amplepower.com with esmtp (Exim 3.35 #1 (Debian)) id 17yxPZ-0003Ua-00; Tue, 08 Oct 2002 09:40:45 -0700 From: "Theodore A. Roth" X-X-Sender: troth@bozoland.mynet To: Thibaud Gaillard cc: simulavr-devel@mail.freesoftware.fsf.org Subject: Re: [Simulavr-devel] RJMP/RCALL/BRBC/BRBS bug & configure error in simulavr-0.1.1, test-case and fix provided In-Reply-To: <1034090232.3da2f6f848a03@imp.free.fr> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII Content-ID: Sender: simulavr-devel-admin@mail.freesoftware.fsf.org Errors-To: simulavr-devel-admin@mail.freesoftware.fsf.org X-BeenThere: simulavr-devel@mail.freesoftware.fsf.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Discussion of simulavr development. List-Unsubscribe: , List-Archive: Date: Tue Oct 8 12:46:06 2002 X-Original-Date: Tue, 8 Oct 2002 09:41:02 -0700 (PDT) This has already been fixed in cvs. I just ran you test case in the latest cvs version and got to the third rjmp insn no problem. Here's a reference to the fix: http://savannah.nongnu.org/cgi-bin/viewcvs/simulavr/simulavr/src/avrcore.h.diff?r1=1.6&r2=1.7 For your configure fixes, I just committed these: http://savannah.nongnu.org/cgi-bin/viewcvs/simulavr/simulavr/config/avr_doc_pdf.m4.diff?r1=1.2&r2=1.3 http://savannah.nongnu.org/cgi-bin/viewcvs/simulavr/simulavr/config/avr_doc_ps.m4.diff?r1=1.1&r2=1.2 http://savannah.nongnu.org/cgi-bin/viewcvs/simulavr/simulavr/config/enable_curses.m4.diff?r1=1.2&r2=1.3 Thanks for the bug report. Ted Roth On Tue, 8 Oct 2002, Thibaud Gaillard wrote: :)Hi, :) :)Playing a bit with GCC-generated AVR code, I found simulavr-0.1.1 :)to fail when it comes to handle negative relative jumps that cross :)the memory low boundary (still works fine crossing the high boundary). :)This bug impacts RJMP/RCALL/BRBC/BRBS opcodes (jump instructions with :)relative signed offsets). :) :)There is also a "configure" script problem, at least on a sparc-sun-solaris2.x :)host (/bin/sh does not handle "==" in "test" constructs, only "="). :) :)Test-case (rjump_bug.s) and fix (simulavr-0.1.1.patch) both for "configure" :)and "src/avrcore.c" provided. :) :)Thibaud :) :)PS: Theodore, I chose to resend this mail to the official mailing list, :) please forgive me for the double posting inconvenience :-) :) :) From troth@openavr.org Sat Oct 12 20:26:38 2002 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 180Wab-0003Tg-00 for simulavr-devel@mail.freesoftware.fsf.org; Sat, 12 Oct 2002 20:26:37 -0400 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 180WaX-0003In-00 for simulavr-devel@mail.freesoftware.fsf.org; Sat, 12 Oct 2002 20:26:35 -0400 Received: from sense-smead-139.oz.net ([216.39.162.139] helo=thevenin.amplepower.com) by monty-python.gnu.org with esmtp (Exim 4.10) id 180WaW-0003EK-00 for Simulavr-devel@mail.freesoftware.fsf.org; Sat, 12 Oct 2002 20:26:32 -0400 Received: from [192.168.8.29] (helo=bozoland.mynet) by thevenin.amplepower.com with esmtp (Exim 3.35 #1 (Debian)) id 180WWx-0004GZ-00; Sat, 12 Oct 2002 17:22:52 -0700 From: "Theodore A. Roth" X-X-Sender: troth@bozoland.mynet To: Joerg Wunsch cc: Simulavr-devel@mail.freesoftware.fsf.org In-Reply-To: <20021012001128.A70635@uriah.heep.sax.de> Message-ID: MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463809535-1942988450-1034468590=:445" Subject: [Simulavr-devel] Re: simulavr, again Sender: simulavr-devel-admin@mail.freesoftware.fsf.org Errors-To: simulavr-devel-admin@mail.freesoftware.fsf.org X-BeenThere: simulavr-devel@mail.freesoftware.fsf.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Discussion of simulavr development. List-Unsubscribe: , List-Archive: Date: Sat Oct 12 20:27:01 2002 X-Original-Date: Sat, 12 Oct 2002 17:23:10 -0700 (PDT) This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---1463809535-1942988450-1034468590=:445 Content-Type: TEXT/PLAIN; charset=US-ASCII On Sat, 12 Oct 2002, Joerg Wunsch wrote: :)Hi Ted, :) :)writing up all that stdio stuff based on Alexander's sample :)implementation makes quite some progress. Find the output from one of :)my first tests below... :) :)In the course of testing all this, of course i started using the :)simulator again. Well, i would start hacking some more virtual :)devices for it, but still most of the innards are somewhat puzzling to :)me... One of the first things that would be needed for the ATmega128 :)emulation is a working RAMPZ, i. e. updating IO port 0x3b (or memory :)location 0x5b) should set the RAMPZ in the device core. Currently, :)while RAMPZ is evaluated during the elpm instructions, except for the :)Z+ case, it's never set at all. This also leaves random garbage in :)RAMPZ which will cause the simulator to abort with an invalid address :)complaint during startup since the startup code copies the .data :)variables from the end of the flash into the SRAM using elpm. The attached patch implements rampz simulation. Bang on it and if it works, I'll commit it. The patch stops me from getting this from the simulator (from the startup code for mega128): WARNING: file ../../src/memory.c: line 168: **** Attempt to write invalid addr: 0x005b 0x000052 (0x0000a4) : 0xbf0b : OUT :) :)Then, i might perhaps try to find some simple emulation for a UART :)that uses a pty to provide some communications channel to the :)environment. If you are interested, I've got another patch someone submitted that implements some UART stuff, but I've never tried it since I didn't take the time (have the time?? ;-) to write a test app to exercise it. :) :)While the uninitialized RAMPZ caused one surprise, there was another :)one waiting... When all worked in the simulator, moving the test to :)the real device made it reset immediately. It took me quite some time :)until i found out that it was just the garbage in RAM after turning :)the device on that had caused this. The simulator neatly initializes :)the RAM to 0 which is obviously somewhat unreal. ;-) It's perhaps :)better to use random() to fill it. That makes some sense. I'd be more inclined to preload the sram with some known background data though which still raises some errors so you can track things down. I guess the best solution would be to make it a command line option. Maybe "-R, --random-fill-sram". Wouldn't be that much work to implement. The default would be zero, but for stress testing, users can randomize. :) :)Here's some result so far. (Note that snprintf() doesn't seem to work :)as expected, but i'll debug that later.) :) :)First 512 bytes of SRAM: :) 100: 46 69 72 73 74 20 25 64 20 62 79 74 65 73 20 6f :) 110: 66 20 53 52 41 4d 3a a 0 25 30 34 78 3a 20 0 :) 120: 25 30 32 78 0 77 6f 72 6c 64 0 68 65 6c 6c 6f :) 130: 0 54 68 69 73 20 77 69 6c 6c 20 62 65 63 6f 6d :) 140: 65 20 76 65 72 79 20 6c 65 6e 67 74 68 79 2e 0 :) 150: 54 68 61 74 27 73 20 61 6c 6c 20 62 79 20 6e 6f :) 160: 77 2e a 0 20 0 85 1 0 0 3 ab 1 0 0 0 :) 170: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 :) 180: 0 0 0 87 1 24 0 0 0 0 0 0 0 0 0 0 :) 190: 0 0 0 0 0 8 0 0 0 19 0 cf 0 0 0 0 :) 1a0: 0 8 0 0 0 0 0 cf 0 0 0 32 28 3e 3f ba :) 1b0: d4 56 5a d1 fe a0 d 18 ca b6 a2 aa 3e 2b 8f 31 :) 1c0: 46 85 e7 1e 2c 3b 8f 65 16 37 73 4b a9 fb 37 84 :) 1d0: f8 bd 45 b9 16 4b b0 c0 de d8 20 48 24 45 a2 62 :) 1e0: d1 cf 32 a8 15 85 9e 28 d8 24 c1 5d ba 3b 1c 3a :) 1f0: 43 7d eb 15 2c b 9e e1 44 d5 2a 3b cf fa b5 40 :) 200: 4 ac b3 30 f5 99 78 5f d9 6a 5a f0 1b 72 7b a2 :) 210: f5 e2 51 b4 9 b9 7 e3 97 db 42 99 21 e2 cf db :) 220: 17 5a d0 81 5f 24 a2 de fa 55 c0 12 af 61 ad 41 :) 230: fb 7a 98 6a 50 b3 b3 a0 59 f7 3d 50 bb f2 1b 1b :) 240: 5d 90 cf 5 9c 91 6f bd 5f d2 6b d1 b2 bf 4f ca :) 250: aa 67 c4 b1 62 58 3 24 8d 1d e9 d7 92 92 f5 ce :) 260: f0 e8 f0 e0 99 13 7f 3d 5a ae d6 f5 4b 83 52 95 :) 270: ad 25 11 80 53 76 84 e1 b5 f6 8b da fe 3e 46 9c :) 280: 3c ee 23 48 fa 7e bf ad 5e d3 9a 9a 97 db 73 96 :) 290: 8d 5f fe 10 9d b1 e0 e9 a1 48 a9 bf 37 97 e1 a4 :) 2a0: 4e e2 29 41 13 2 2f 17 3d 17 c3 82 c 73 6a ed :) 2b0: 15 82 71 95 3b b2 6 92 f 23 13 47 be 70 56 b7 :) 2c0: 35 91 86 ac 9b 2 6e 24 29 a ad 26 83 53 41 7b :) 2d0: d9 45 5 8d 57 e6 9f cb 20 c7 e5 be e2 53 14 4d :) 2e0: 68 fd 5 81 b8 97 2f c6 73 6f 7 41 75 df 67 0 :) 2f0: e3 ea 55 74 9e 3f 79 bb 75 bc 13 a8 3 91 7d 64 :) :)String alignment tests: :)hello :) world :)Number formatting: :)%+15d: +243 :)overflowing snprintf(), len 30, result This will become ver`$ :)My clock frequency (long int): 14745600 :)That's all by now. You lost me there. It just looks like a bunch of random numbers to me. ;-) Ted Roth ---1463809535-1942988450-1034468590=:445 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="sim-rampz.diff" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="sim-rampz.diff" MjAwMi0xMC0xMiAgVGhlb2RvcmUgQS4gUm90aCAgPHRyb3RoQHZlcmluZXQu Y29tPg0KDQoJKiBzcmMvYXZyY29yZS5jOiBBZGQgcmVhbCBzaW11bGF0aW9u IG9mIHJhbXB6IHJlZ2lzdGVyLg0KCSogc3JjL2F2cmNvcmUuaDogRGl0dG8u DQoJKiBzcmMvZGVjb2Rlci5jOiBEaXR0by4NCgkqIHNyYy9yZWdpc3Rlci5j OiBEaXR0by4NCgkqIHNyYy9yZWdpc3Rlci5oOiBEaXR0by4NCg0KSW5kZXg6 IHNyYy9hdnJjb3JlLmMNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBm aWxlOiAvY3Zzcm9vdC9zaW11bGF2ci9zaW11bGF2ci9zcmMvYXZyY29yZS5j LHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS41Nw0KZGlmZiAtdSAtcjEuNTcg YXZyY29yZS5jDQotLS0gc3JjL2F2cmNvcmUuYwk4IE9jdCAyMDAyIDE2OjQ2 OjQwIC0wMDAwCTEuNTcNCisrKyBzcmMvYXZyY29yZS5jCTEzIE9jdCAyMDAy IDAwOjA3OjI2IC0wMDAwDQpAQCAtMzQzLDYgKzM0Myw3IEBADQogICAgIGNv cmUtPnNyZWcgICAgID0gc3JlZ19uZXcoKTsNCiAgICAgY29yZS0+Zmxhc2gg ICAgPSBmbGFzaF9uZXcoIGZsYXNoX3N6ICk7DQogICAgIGNvcmUtPmdwd3Ig ICAgID0gZ3B3cl9uZXcoKTsNCisgICAgY29yZS0+cmFtcHogICAgPSByYW1w el9uZXcoKTsNCiAgICAgY29yZS0+bWVtICAgICAgPSBtZW1fbmV3KCk7DQog DQogICAgIGNvcmUtPm9wY29kZV9icmVha19wdCA9IDB4ZmZmZjsNCkBAIC0z NzQsNiArMzc1LDkgQEANCiAgICAgYXZyX2NvcmVfYXR0YWNoX3ZkZXYoIGNv cmUsIChWRGV2aWNlICopY29yZS0+c3JlZyApOw0KICAgICBjbGFzc19yZWYo IChBdnJDbGFzcyAqKWNvcmUtPnNyZWcgKTsNCiANCisgICAgYXZyX2NvcmVf YXR0YWNoX3ZkZXYoIGNvcmUsIChWRGV2aWNlICopY29yZS0+cmFtcHogKTsN CisgICAgY2xhc3NfcmVmKCAoQXZyQ2xhc3MgKiljb3JlLT5yYW1weiApOw0K Kw0KICAgICBhdnJfY29yZV9hdHRhY2hfdmRldiggY29yZSwgKFZEZXZpY2Ug Kiljb3JlLT5ncHdyICk7DQogICAgIGNsYXNzX3JlZiggKEF2ckNsYXNzICop Y29yZS0+Z3B3ciApOw0KIA0KQEAgLTUxOCwzMiArNTIyLDU5IEBADQogICAg IG1lbV93cml0ZSggY29yZS0+bWVtLCBhZGRyLCB2YWwgKTsNCiB9DQogDQot LyoqDQotICogXGJyaWVmIFN0YXR1cyBSZWdpc3RlciBBY2Nlc3MgTWV0aG9k cw0KLSAqLw0KKy8qKiBcbmFtZSBTdGF0dXMgUmVnaXN0ZXIgQWNjZXNzIE1l dGhvZHMgKi8NCisNCisvKkB7Ki8NCisNCisvKiogXGJyaWVmIEdldCB0aGUg dmFsdWUgb2YgdGhlIHN0YXR1cyByZWdpc3Rlci4gKi8NCisNCiBieXRlIGF2 cl9jb3JlX3NyZWdfZ2V0KCBBdnJDb3JlICpjb3JlICkNCiB7DQogICAgIHJl dHVybiBzcmVnX2dldCggY29yZS0+c3JlZyApOw0KIH0NCiANCi0vKiogXGJy aWVmIEZJWE1FOiB3cml0ZSBtZS4gKi8NCisvKiogXGJyaWVmIFNldCB0aGUg dmFsdWUgb2YgdGhlIHN0YXR1cyByZWdpc3Rlci4gKi8NCisNCiB2b2lkIGF2 cl9jb3JlX3NyZWdfc2V0KCBBdnJDb3JlICpjb3JlLCBieXRlIHYgKQ0KIHsN CiAgICAgc3JlZ19zZXQoIGNvcmUtPnNyZWcsIHYgKTsNCiB9DQogDQotLyoq IFxicmllZiBGSVhNRTogd3JpdGUgbWUuICovDQorLyoqIFxicmllZiBHZXQg dGhlIHZhbHVlIG9mIGJpdCBcYyBiIG9mIHRoZSBzdGF0dXMgcmVnaXN0ZXIu ICovDQorDQogaW50ICBhdnJfY29yZV9zcmVnX2dldF9iaXQoIEF2ckNvcmUg KmNvcmUsIGludCBiICkNCiB7DQogICAgIHJldHVybiBzcmVnX2dldF9iaXQo IGNvcmUtPnNyZWcsIGIgKTsNCiB9DQogDQotLyoqIFxicmllZiBGSVhNRTog d3JpdGUgbWUuICovDQorLyoqIFxicmllZiBTZXQgdGhlIHZhbHVlIG9mIGJp dCBcYyBiIG9mIHRoZSBzdGF0dXMgcmVnaXN0ZXIuICovDQorDQogdm9pZCBh dnJfY29yZV9zcmVnX3NldF9iaXQoIEF2ckNvcmUgKmNvcmUsIGludCBiLCBp bnQgdiApDQogew0KICAgICBzcmVnX3NldF9iaXQoIGNvcmUtPnNyZWcsIGIs IHYgKTsNCiB9DQogDQorLypAfSovDQorDQorLyoqIFxuYW1lIFJBTVBaIGFj Y2VzcyBtZXRob2RzICovDQorDQorLypAeyovDQorDQorLyoqIFxicmllZiBH ZXQgdGhlIHZhbHVlIG9mIHRoZSByYW1weiByZWdpc3Rlci4gKi8NCisNCiti eXRlIGF2cl9jb3JlX3JhbXB6X2dldCggQXZyQ29yZSAqY29yZSApDQorew0K KyAgICByZXR1cm4gcmFtcHpfZ2V0KGNvcmUtPnJhbXB6KTsNCit9DQorDQor LyoqIFxicmllZiBTZXQgdGhlIHZhbHVlIG9mIHRoZSByYW1weiByZWdpc3Rl ci4gKi8NCisNCit2b2lkIGF2cl9jb3JlX3JhbXB6X3NldCggQXZyQ29yZSAq Y29yZSwgYnl0ZSB2ICkNCit7DQorICAgIHJhbXB6X3NldChjb3JlLT5yYW1w eiwgdik7DQorfQ0KKw0KKy8qQH0qLw0KIA0KIC8qKg0KICAqIFxicmllZiBH ZW5lcmFsIFB1cnBvc2UgV29ya2luZyBSZWdpc3RlciBBY2Nlc3MgTWV0aG9k cw0KSW5kZXg6IHNyYy9hdnJjb3JlLmgNCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NClJDUyBmaWxlOiAvY3Zzcm9vdC9zaW11bGF2ci9zaW11bGF2ci9zcmMv YXZyY29yZS5oLHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS44DQpkaWZmIC11 IC1yMS44IGF2cmNvcmUuaA0KLS0tIHNyYy9hdnJjb3JlLmgJOCBPY3QgMjAw MiAxNjo0Njo0MCAtMDAwMAkxLjgNCisrKyBzcmMvYXZyY29yZS5oCTEzIE9j dCAyMDAyIDAwOjA3OjI2IC0wMDAwDQpAQCAtODMsNyArODMsNyBAQA0KICAg ICAgKi8NCiAgICAgYnl0ZSAgICAgUkFNUFg7ICAgICAgICAgICAgIC8qIFJl Z2lzdGVycyBjb25jYXRlbmF0ZWQgd2l0aCB0aGUgWCwgWSBhbmQgWiByZWdp c3RlcnMgKi8NCiAgICAgYnl0ZSAgICAgUkFNUFk7ICAgICAgICAgICAgIC8q IGVuYWJsaW5nIGluZGlyZWN0IGFkZHJlc3Npbmcgb2YgdGhlIHdob2x3IGRh dGEgc3BhY2UgKi8NCi0gICAgYnl0ZSAgICAgUkFNUFo7ICAgICAgICAgICAg IC8qIG9uIE1DVXMgd2l0aCBtb3JlIHRoYW4gNjRLIGJ5dGVzIGRhdGUgc3Bh Y2UsIGFuZCBjb25zdGFudCAqLw0KKyAgICBSQU1QWiAgICpyYW1wejsgICAg ICAgICAgICAgLyogb24gTUNVcyB3aXRoIG1vcmUgdGhhbiA2NEsgYnl0ZXMg ZGF0ZSBzcGFjZSwgYW5kIGNvbnN0YW50ICovDQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAvKiBkYXRhIGZldGNoIG9uIE1DVXMgd2l0aCBt b3JlIHRoYW4gNjRLIGJ5dGVzIHByb2ZyYW0gc3BhY2UuICovDQogDQogICAg IGJ5dGUgICAgIFJBTVBEOyAgICAgICAgICAgICAvKiBSZWdpc3RlciBjb25j YXRlbmF0ZWQgd2l0aCB0aGUgWiByZWdpc3RlciBlbmFibGluZyBkaXJlY3Qg Ki8NCkBAIC0xNDEsNiArMTQxLDEwIEBADQogZXh0ZXJuIHZvaWQgICAgIGF2 cl9jb3JlX3NyZWdfc2V0ICAgICggQXZyQ29yZSAqY29yZSwgYnl0ZSB2ICk7 DQogZXh0ZXJuIGludCAgICAgIGF2cl9jb3JlX3NyZWdfZ2V0X2JpdCggQXZy Q29yZSAqY29yZSwgaW50IGIgKTsNCiBleHRlcm4gdm9pZCAgICAgYXZyX2Nv cmVfc3JlZ19zZXRfYml0KCBBdnJDb3JlICpjb3JlLCBpbnQgYiwgaW50IHZh bCApOw0KKw0KKy8qIFJBTVBaIEFjY2VzcyBNZXRob2RzICovDQorZXh0ZXJu IGJ5dGUgICAgIGF2cl9jb3JlX3JhbXB6X2dldCAgICggQXZyQ29yZSAqY29y ZSApOw0KK2V4dGVybiB2b2lkICAgICBhdnJfY29yZV9yYW1wel9zZXQgICAo IEF2ckNvcmUgKmNvcmUsIGJ5dGUgdiApOw0KIA0KIC8qIEdlbmVyYWwgUHVy cG9zZSBXb3JraW5nIFJlZ2lzdGVyIEFjY2VzcyBNZXRob2RzICovDQogZXh0 ZXJuIGJ5dGUgICAgIGF2cl9jb3JlX2dwd3JfZ2V0ICAgICggQXZyQ29yZSAq Y29yZSwgaW50IHJlZyApOw0KSW5kZXg6IHNyYy9kZWNvZGVyLmMNCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0NClJDUyBmaWxlOiAvY3Zzcm9vdC9zaW11bGF2 ci9zaW11bGF2ci9zcmMvZGVjb2Rlci5jLHYNCnJldHJpZXZpbmcgcmV2aXNp b24gMS4yNw0KZGlmZiAtdSAtcjEuMjcgZGVjb2Rlci5jDQotLS0gc3JjL2Rl Y29kZXIuYwkxNiBTZXAgMjAwMiAwMDoyNTo0NCAtMDAwMAkxLjI3DQorKysg c3JjL2RlY29kZXIuYwkxMyBPY3QgMjAwMiAwMDowNzoyOSAtMDAwMA0KQEAg LTEwNTMsNyArMTA1Myw3IEBADQogDQogICAgIC8qIEZJWE1FOiBJcyB0aGlz IGNvcnJlY3Q/ICovDQogICAgIC8qIFogaXMgUjMxOlIzMCAqLw0KLSAgICBa ID0gKCgoY29yZS0+UkFNUFopICYgMHgzZikgPDwgMTYpICsNCisgICAgWiA9 ICgoYXZyX2NvcmVfcmFtcHpfZ2V0KGNvcmUpICYgMHgzZikgPDwgMTYpICsN CiAgICAgICAgICAoYXZyX2NvcmVfZ3B3cl9nZXQoY29yZSwgMzEpIDw8IDgp ICsNCiAgICAgICAgICBhdnJfY29yZV9ncHdyX2dldChjb3JlLCAzMCk7DQog DQpAQCAtMTA5OCw3ICsxMDk4LDcgQEANCiANCiAgICAgLyogRklYTUU6IElz IHRoaXMgY29ycmVjdD8gKi8NCiAgICAgLyogWiBpcyBSMzE6UjMwICovDQot ICAgIFogPSAoKChjb3JlLT5SQU1QWikgJiAweDNmKSA8PCAxNikgKw0KKyAg ICBaID0gKChhdnJfY29yZV9yYW1wel9nZXQoY29yZSkgJiAweDNmKSA8PCAx NikgKw0KICAgICAgICAgIChhdnJfY29yZV9ncHdyX2dldChjb3JlLCAzMSkg PDwgOCkgKw0KICAgICAgICAgIGF2cl9jb3JlX2dwd3JfZ2V0KGNvcmUsIDMw KTsNCiANCkBAIC0xMTE3LDcgKzExMTcsNyBAQA0KICAgICBaICs9IDE7DQog ICAgIGF2cl9jb3JlX2dwd3Jfc2V0KCBjb3JlLCAzMCwgWiAmIDB4ZmYgKTsN CiAgICAgYXZyX2NvcmVfZ3B3cl9zZXQoIGNvcmUsIDMxLCBaID4+IDggKTsN Ci0gICAgY29yZS0+UkFNUFogPSAoWiA+PiAxNikgJiAweDNmOw0KKyAgICBh dnJfY29yZV9yYW1wel9zZXQoY29yZSwgKFogPj4gMTYpICYgMHgzZik7DQog DQogICAgIGF2cl9jb3JlX1BDX2luY3IoIGNvcmUsIDEgKTsNCiAgICAgYXZy X2NvcmVfaW5zdF9DS1Nfc2V0KCBjb3JlLCAzICk7DQpJbmRleDogc3JjL3Jl Z2lzdGVyLmMNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxlOiAv Y3Zzcm9vdC9zaW11bGF2ci9zaW11bGF2ci9zcmMvcmVnaXN0ZXIuYyx2DQpy ZXRyaWV2aW5nIHJldmlzaW9uIDEuMjgNCmRpZmYgLXUgLXIxLjI4IHJlZ2lz dGVyLmMNCi0tLSBzcmMvcmVnaXN0ZXIuYwkyNyBNYXkgMjAwMiAxODowMTo0 MCAtMDAwMAkxLjI4DQorKysgc3JjL3JlZ2lzdGVyLmMJMTMgT2N0IDIwMDIg MDA6MDc6MjkgLTAwMDANCkBAIC01NzIsMyArNTcyLDgxIEBADQogICAgIHJl dHVybiBDQl9SRVRfUkVUQUlOOw0KIH0NCiANCisvKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKlwNCisgKg0KKyAqIFJBTVBaKFZEZXZpY2UpIDog VGhlIFJBTVBaIHJlZ2lzdGVyIHVzZWQgYnkgRUxQTSBhbmQgRVNQTSBpbnN0 cnVjdGlvbnMuDQorICoNCisgKiBFdmVuIHRob3VnaCB0aGUgcmFtcHogcmVn aXN0ZXIgaXMgbm90IGF2YWlsYWJsZSB0byBhbGwgZGV2aWNlcywgd2Ugd2ls bA0KKyAqIGluc3RhbGwgaXQgZm9yIGFsbCBpbiB0aGUgc2ltdWxhdG9yLiBJ dCBqdXN0IHNvIG11Y2ggZWFzaWVyIHRoYXQgd2F5IGFuZA0KKyAqIHdlJ3Jl IGFscmVhZHkgYXNzdW1pbmcgdGhhdCB0aGUgY29tcGlsZXIgZ2VuZXJhdGVk IHRoZSBjb3JyZWN0IGNvZGUgaW4NCisgKiBtYW55IHBsYWNlcyBhbnl3YXlz LiBMZXQncyBzZWUgaWYgd2UgZ2V0IGJpdC4NCisgKg0KK1wqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3N0YXRpYyBieXRlIHJhbXB6 X3JlYWQoIFZEZXZpY2UgKmRldiwgaW50IGFkZHIgKTsNCitzdGF0aWMgdm9p ZCByYW1wel93cml0ZSggVkRldmljZSAqZGV2LCBpbnQgYWRkciwgYnl0ZSB2 YWwgKTsNCitzdGF0aWMgdm9pZCByYW1wel9yZXNldCggVkRldmljZSAqZGV2 ICk7DQorc3RhdGljIGNoYXIgKnJhbXB6X3JlZ19uYW1lKCBWRGV2aWNlICpk ZXYsIGludCBhZGRyICk7DQorDQorUkFNUFogKnJhbXB6X25ldyggdm9pZCAp DQorew0KKyAgICBSQU1QWiAqcmFtcHo7DQorDQorICAgIHJhbXB6ID0gYXZy X25ldyggUkFNUFosIDEgKTsNCisgICAgcmFtcHpfY29uc3RydWN0KCByYW1w eiApOw0KKyAgICBjbGFzc19vdmVybG9hZF9kZXN0cm95KCAoQXZyQ2xhc3Mg KilyYW1weiwgcmFtcHpfZGVzdHJveSApOw0KKw0KKyAgICByZXR1cm4gcmFt cHo7DQorfQ0KKw0KK3ZvaWQgcmFtcHpfY29uc3RydWN0KCBSQU1QWiAqcmFt cHogKQ0KK3sNCisgICAgY2hhciAqbmFtZSA9ICJSQU1QWiI7DQorDQorICAg IGlmIChyYW1weiA9PSBOVUxMKQ0KKyAgICAgICAgYXZyX2Vycm9yKCAicGFz c2VkIG51bGwgcHRyIiApOw0KKw0KKyAgICB2ZGV2X2NvbnN0cnVjdCggKFZE ZXZpY2UgKilyYW1weiwgbmFtZSwgUkFNUFpfQkFTRSwgUkFNUFpfU0laRSwg DQorICAgICAgICAgICAgICAgICAgICByYW1wel9yZWFkLCByYW1wel93cml0 ZSwgcmFtcHpfcmVzZXQsIHJhbXB6X3JlZ19uYW1lICk7DQorDQorICAgIHJh bXB6LT5yZWcgPSAwOw0KK30NCisNCit2b2lkIHJhbXB6X2Rlc3Ryb3koIHZv aWQgKnJhbXB6ICkNCit7DQorICAgIGlmIChyYW1weiA9PSBOVUxMKQ0KKyAg ICAgICAgcmV0dXJuOw0KKw0KKyAgICB2ZGV2X2Rlc3Ryb3koIHJhbXB6ICk7 DQorfQ0KKw0KK2J5dGUgcmFtcHpfZ2V0KCBSQU1QWiAqcmFtcHogKQ0KK3sN CisgICAgcmV0dXJuIHJhbXB6LT5yZWc7DQorfQ0KKw0KK3ZvaWQgcmFtcHpf c2V0KCBSQU1QWiAqcmFtcHosIGJ5dGUgdmFsICkNCit7DQorICAgIHJhbXB6 LT5yZWcgPSB2YWw7DQorfQ0KKw0KK3N0YXRpYyBieXRlIHJhbXB6X3JlYWQo IFZEZXZpY2UgKmRldiwgaW50IGFkZHIgKQ0KK3sNCisgICAgcmV0dXJuIHJh bXB6X2dldCggKFJBTVBaICopZGV2ICk7DQorfQ0KKw0KK3N0YXRpYyB2b2lk IHJhbXB6X3dyaXRlKCBWRGV2aWNlICpkZXYsIGludCBhZGRyLCBieXRlIHZh bCApDQorew0KKyAgICByYW1wel9zZXQoIChSQU1QWiAqKWRldiwgdmFsICk7 DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHJhbXB6X3Jlc2V0KCBWRGV2aWNlICpk ZXYgKQ0KK3sNCisgICAgZGlzcGxheV9pb19yZWcoIFJBTVBaX0lPX1JFRywg MCApOw0KKyAgICAoKFJBTVBaICopZGV2KS0+cmVnID0gMDsNCit9DQorDQor c3RhdGljIGNoYXIgKnJhbXB6X3JlZ19uYW1lKCBWRGV2aWNlICpkZXYsIGlu dCBhZGRyICkNCit7DQorICAgIHJldHVybiB2ZGV2X2dldF9uYW1lKCBkZXYg KTsNCit9DQpJbmRleDogc3JjL3JlZ2lzdGVyLmgNCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0NClJDUyBmaWxlOiAvY3Zzcm9vdC9zaW11bGF2ci9zaW11bGF2 ci9zcmMvcmVnaXN0ZXIuaCx2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMg0K ZGlmZiAtdSAtcjEuMiByZWdpc3Rlci5oDQotLS0gc3JjL3JlZ2lzdGVyLmgJ MTggTWFyIDIwMDIgMjM6NDg6MjMgLTAwMDAJMS4yDQorKysgc3JjL3JlZ2lz dGVyLmgJMTMgT2N0IDIwMDIgMDA6MDc6MjkgLTAwMDANCkBAIC0yNTMsNCAr MjUzLDMwIEBADQogDQogZXh0ZXJuIHZvaWQgICB3ZHRjcl91cGRhdGUgICAg KCBXRFRDUiAqd2R0Y3IgKTsNCiANCisvKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKlwNCisgKg0KKyAqIFJBTVBaKFZEZXZpY2UpIDogVGhlIFJB TVBaIHJlZ2lzdGVyIHVzZWQgYnkgRUxQTSBhbmQgRVNQTSBpbnN0cnVjdGlv bnMuDQorICoNCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8N CisNCitlbnVtIF9yYW1wel9hZGRyX2luZm8gew0KKyAgICBSQU1QWl9CQVNF ID0gMHg1YiwgICAgICAgICAgLyogYmFzZSByYW1weiBtZW0gYWRkciAqLw0K KyAgICBSQU1QWl9TSVpFID0gMHgwMSwNCisgICAgUkFNUFpfSU9fUkVHID0g UkFNUFpfQkFTRSAtIElPX1JFR19BRERSX0JFR0lOLA0KK307DQorDQordHlw ZWRlZiBzdHJ1Y3QgX1JBTVBaIFJBTVBaOw0KKw0KK3N0cnVjdCBfUkFNUFog ew0KKyAgICBWRGV2aWNlIHBhcmVudDsNCisgICAgYnl0ZSAgICByZWc7DQor fTsNCisNCitleHRlcm4gUkFNUFogKnJhbXB6X25ldyAgICAgICAgICggdm9p ZCApOw0KK2V4dGVybiB2b2lkICAgcmFtcHpfY29uc3RydWN0ICAgKCBSQU1Q WiAqcmFtcHogKTsNCitleHRlcm4gdm9pZCAgIHJhbXB6X2Rlc3Ryb3kgICAg ICggdm9pZCAqcmFtcHogKTsNCisNCitleHRlcm4gYnl0ZSAgIHJhbXB6X2dl dCAgICAgICAgICggUkFNUFogKnJhbXB6ICk7DQorZXh0ZXJuIHZvaWQgICBy YW1wel9zZXQgICAgICAgICAoIFJBTVBaICpyYW1weiwgYnl0ZSB2YWwgKTsN CisNCiAjZW5kaWYgLyogU0lNX1JFR0lTVEVSX0ggKi8NCg== ---1463809535-1942988450-1034468590=:445-- From ken@restivo.org Sat Oct 12 23:21:57 2002 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 180ZKH-00011p-00 for simulavr-devel@mail.freesoftware.fsf.org; Sat, 12 Oct 2002 23:21:57 -0400 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 180ZKD-000114-00 for simulavr-devel@mail.freesoftware.fsf.org; Sat, 12 Oct 2002 23:21:56 -0400 Received: from 64-121-1-69.c3-0.sfo-ubr1.sfrn-sfo.ca.cable.rcn.com ([64.121.1.69] helo=fred.home.restivo.org) by monty-python.gnu.org with esmtp (Exim 4.10) id 180ZKC-0000z8-00 for Simulavr-devel@mail.freesoftware.fsf.org; Sat, 12 Oct 2002 23:21:52 -0400 Received: (from ken@localhost) by fred.home.restivo.org (8.11.6/8.11.6) id g9D3Lm710359 for Simulavr-devel@mail.freesoftware.fsf.org; Sat, 12 Oct 2002 20:21:48 -0700 X-Authentication-Warning: fred.home.restivo.org: ken set sender to ken@restivo.org using -f From: ken restivo To: Simulavr-devel@mail.freesoftware.fsf.org Subject: Re: [Simulavr-devel] Re: simulavr, again, and UART Message-ID: <20021013032148.GA10353@fred.246gt.com> References: <20021012001128.A70635@uriah.heep.sax.de> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="NDin8bjvE/0mNLFQ" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.3.25i Sender: simulavr-devel-admin@mail.freesoftware.fsf.org Errors-To: simulavr-devel-admin@mail.freesoftware.fsf.org X-BeenThere: simulavr-devel@mail.freesoftware.fsf.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Discussion of simulavr development. List-Unsubscribe: , List-Archive: Date: Sat Oct 12 23:22:02 2002 X-Original-Date: Sat, 12 Oct 2002 20:21:48 -0700 --NDin8bjvE/0mNLFQ Content-Type: multipart/mixed; boundary="4Ckj6UjgE2iN1+kY" Content-Disposition: inline --4Ckj6UjgE2iN1+kY Content-Type: text/plain; charset=us-ascii Content-Disposition: inline OK, you shamed me into it. ;-) Test program is attached. This works with my simulated UART on my simulated Mega163, which includes a mix of Ted's version of my UART patch, plus my original Mega163 patch, plus a bunch of changes I had made that I haven't had time to sort out properly. "It works for me (tm)". -ken --------- On Sat, Oct 12, 2002 at 05:23:10PM -0700, Theodore A. Roth wrote: > On Sat, 12 Oct 2002, Joerg Wunsch wrote: > > :)Hi Ted, > :) > :)writing up all that stdio stuff based on Alexander's sample > :)implementation makes quite some progress. Find the output from one of > :)my first tests below... > :) > :)In the course of testing all this, of course i started using the > :)simulator again. Well, i would start hacking some more virtual > :)devices for it, but still most of the innards are somewhat puzzling to > :)me... One of the first things that would be needed for the ATmega128 > :)emulation is a working RAMPZ, i. e. updating IO port 0x3b (or memory > :)location 0x5b) should set the RAMPZ in the device core. Currently, > :)while RAMPZ is evaluated during the elpm instructions, except for the > :)Z+ case, it's never set at all. This also leaves random garbage in > :)RAMPZ which will cause the simulator to abort with an invalid address > :)complaint during startup since the startup code copies the .data > :)variables from the end of the flash into the SRAM using elpm. > > The attached patch implements rampz simulation. Bang on it and if it works, > I'll commit it. The patch stops me from getting this from the simulator > (from the startup code for mega128): > > WARNING: file ../../src/memory.c: line 168: **** Attempt to write invalid addr: 0x005b > 0x000052 (0x0000a4) : 0xbf0b : OUT > > :) > :)Then, i might perhaps try to find some simple emulation for a UART > :)that uses a pty to provide some communications channel to the > :)environment. > > If you are interested, I've got another patch someone submitted that > implements some UART stuff, but I've never tried it since I didn't take the > time (have the time?? ;-) to write a test app to exercise it. > > :) > :)While the uninitialized RAMPZ caused one surprise, there was another > :)one waiting... When all worked in the simulator, moving the test to > :)the real device made it reset immediately. It took me quite some time > :)until i found out that it was just the garbage in RAM after turning > :)the device on that had caused this. The simulator neatly initializes > :)the RAM to 0 which is obviously somewhat unreal. ;-) It's perhaps > :)better to use random() to fill it. > > That makes some sense. I'd be more inclined to preload the sram with some > known background data though which still raises some errors so you can track > things down. > > I guess the best solution would be to make it a command line option. Maybe > "-R, --random-fill-sram". Wouldn't be that much work to implement. The > default would be zero, but for stress testing, users can randomize. > > :) > :)Here's some result so far. (Note that snprintf() doesn't seem to work > :)as expected, but i'll debug that later.) > :) > :)First 512 bytes of SRAM: > :) 100: 46 69 72 73 74 20 25 64 20 62 79 74 65 73 20 6f > :) 110: 66 20 53 52 41 4d 3a a 0 25 30 34 78 3a 20 0 > :) 120: 25 30 32 78 0 77 6f 72 6c 64 0 68 65 6c 6c 6f > :) 130: 0 54 68 69 73 20 77 69 6c 6c 20 62 65 63 6f 6d > :) 140: 65 20 76 65 72 79 20 6c 65 6e 67 74 68 79 2e 0 > :) 150: 54 68 61 74 27 73 20 61 6c 6c 20 62 79 20 6e 6f > :) 160: 77 2e a 0 20 0 85 1 0 0 3 ab 1 0 0 0 > :) 170: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 > :) 180: 0 0 0 87 1 24 0 0 0 0 0 0 0 0 0 0 > :) 190: 0 0 0 0 0 8 0 0 0 19 0 cf 0 0 0 0 > :) 1a0: 0 8 0 0 0 0 0 cf 0 0 0 32 28 3e 3f ba > :) 1b0: d4 56 5a d1 fe a0 d 18 ca b6 a2 aa 3e 2b 8f 31 > :) 1c0: 46 85 e7 1e 2c 3b 8f 65 16 37 73 4b a9 fb 37 84 > :) 1d0: f8 bd 45 b9 16 4b b0 c0 de d8 20 48 24 45 a2 62 > :) 1e0: d1 cf 32 a8 15 85 9e 28 d8 24 c1 5d ba 3b 1c 3a > :) 1f0: 43 7d eb 15 2c b 9e e1 44 d5 2a 3b cf fa b5 40 > :) 200: 4 ac b3 30 f5 99 78 5f d9 6a 5a f0 1b 72 7b a2 > :) 210: f5 e2 51 b4 9 b9 7 e3 97 db 42 99 21 e2 cf db > :) 220: 17 5a d0 81 5f 24 a2 de fa 55 c0 12 af 61 ad 41 > :) 230: fb 7a 98 6a 50 b3 b3 a0 59 f7 3d 50 bb f2 1b 1b > :) 240: 5d 90 cf 5 9c 91 6f bd 5f d2 6b d1 b2 bf 4f ca > :) 250: aa 67 c4 b1 62 58 3 24 8d 1d e9 d7 92 92 f5 ce > :) 260: f0 e8 f0 e0 99 13 7f 3d 5a ae d6 f5 4b 83 52 95 > :) 270: ad 25 11 80 53 76 84 e1 b5 f6 8b da fe 3e 46 9c > :) 280: 3c ee 23 48 fa 7e bf ad 5e d3 9a 9a 97 db 73 96 > :) 290: 8d 5f fe 10 9d b1 e0 e9 a1 48 a9 bf 37 97 e1 a4 > :) 2a0: 4e e2 29 41 13 2 2f 17 3d 17 c3 82 c 73 6a ed > :) 2b0: 15 82 71 95 3b b2 6 92 f 23 13 47 be 70 56 b7 > :) 2c0: 35 91 86 ac 9b 2 6e 24 29 a ad 26 83 53 41 7b > :) 2d0: d9 45 5 8d 57 e6 9f cb 20 c7 e5 be e2 53 14 4d > :) 2e0: 68 fd 5 81 b8 97 2f c6 73 6f 7 41 75 df 67 0 > :) 2f0: e3 ea 55 74 9e 3f 79 bb 75 bc 13 a8 3 91 7d 64 > :) > :)String alignment tests: > :)hello > :) world > :)Number formatting: > :)%+15d: +243 > :)overflowing snprintf(), len 30, result This will become ver`$ > :)My clock frequency (long int): 14745600 > :)That's all by now. > > You lost me there. It just looks like a bunch of random numbers to me. ;-) > > Ted Roth > 2002-10-12 Theodore A. Roth > > * src/avrcore.c: Add real simulation of rampz register. > * src/avrcore.h: Ditto. > * src/decoder.c: Ditto. > * src/register.c: Ditto. > * src/register.h: Ditto. > > Index: src/avrcore.c > =================================================================== > RCS file: /cvsroot/simulavr/simulavr/src/avrcore.c,v > retrieving revision 1.57 > diff -u -r1.57 avrcore.c > --- src/avrcore.c 8 Oct 2002 16:46:40 -0000 1.57 > +++ src/avrcore.c 13 Oct 2002 00:07:26 -0000 > @@ -343,6 +343,7 @@ > core->sreg = sreg_new(); > core->flash = flash_new( flash_sz ); > core->gpwr = gpwr_new(); > + core->rampz = rampz_new(); > core->mem = mem_new(); > > core->opcode_break_pt = 0xffff; > @@ -374,6 +375,9 @@ > avr_core_attach_vdev( core, (VDevice *)core->sreg ); > class_ref( (AvrClass *)core->sreg ); > > + avr_core_attach_vdev( core, (VDevice *)core->rampz ); > + class_ref( (AvrClass *)core->rampz ); > + > avr_core_attach_vdev( core, (VDevice *)core->gpwr ); > class_ref( (AvrClass *)core->gpwr ); > > @@ -518,32 +522,59 @@ > mem_write( core->mem, addr, val ); > } > > -/** > - * \brief Status Register Access Methods > - */ > +/** \name Status Register Access Methods */ > + > +/*@{*/ > + > +/** \brief Get the value of the status register. */ > + > byte avr_core_sreg_get( AvrCore *core ) > { > return sreg_get( core->sreg ); > } > > -/** \brief FIXME: write me. */ > +/** \brief Set the value of the status register. */ > + > void avr_core_sreg_set( AvrCore *core, byte v ) > { > sreg_set( core->sreg, v ); > } > > -/** \brief FIXME: write me. */ > +/** \brief Get the value of bit \c b of the status register. */ > + > int avr_core_sreg_get_bit( AvrCore *core, int b ) > { > return sreg_get_bit( core->sreg, b ); > } > > -/** \brief FIXME: write me. */ > +/** \brief Set the value of bit \c b of the status register. */ > + > void avr_core_sreg_set_bit( AvrCore *core, int b, int v ) > { > sreg_set_bit( core->sreg, b, v ); > } > > +/*@}*/ > + > +/** \name RAMPZ access methods */ > + > +/*@{*/ > + > +/** \brief Get the value of the rampz register. */ > + > +byte avr_core_rampz_get( AvrCore *core ) > +{ > + return rampz_get(core->rampz); > +} > + > +/** \brief Set the value of the rampz register. */ > + > +void avr_core_rampz_set( AvrCore *core, byte v ) > +{ > + rampz_set(core->rampz, v); > +} > + > +/*@}*/ > > /** > * \brief General Purpose Working Register Access Methods > Index: src/avrcore.h > =================================================================== > RCS file: /cvsroot/simulavr/simulavr/src/avrcore.h,v > retrieving revision 1.8 > diff -u -r1.8 avrcore.h > --- src/avrcore.h 8 Oct 2002 16:46:40 -0000 1.8 > +++ src/avrcore.h 13 Oct 2002 00:07:26 -0000 > @@ -83,7 +83,7 @@ > */ > byte RAMPX; /* Registers concatenated with the X, Y and Z registers */ > byte RAMPY; /* enabling indirect addressing of the wholw data space */ > - byte RAMPZ; /* on MCUs with more than 64K bytes date space, and constant */ > + RAMPZ *rampz; /* on MCUs with more than 64K bytes date space, and constant */ > /* data fetch on MCUs with more than 64K bytes profram space. */ > > byte RAMPD; /* Register concatenated with the Z register enabling direct */ > @@ -141,6 +141,10 @@ > extern void avr_core_sreg_set ( AvrCore *core, byte v ); > extern int avr_core_sreg_get_bit( AvrCore *core, int b ); > extern void avr_core_sreg_set_bit( AvrCore *core, int b, int val ); > + > +/* RAMPZ Access Methods */ > +extern byte avr_core_rampz_get ( AvrCore *core ); > +extern void avr_core_rampz_set ( AvrCore *core, byte v ); > > /* General Purpose Working Register Access Methods */ > extern byte avr_core_gpwr_get ( AvrCore *core, int reg ); > Index: src/decoder.c > =================================================================== > RCS file: /cvsroot/simulavr/simulavr/src/decoder.c,v > retrieving revision 1.27 > diff -u -r1.27 decoder.c > --- src/decoder.c 16 Sep 2002 00:25:44 -0000 1.27 > +++ src/decoder.c 13 Oct 2002 00:07:29 -0000 > @@ -1053,7 +1053,7 @@ > > /* FIXME: Is this correct? */ > /* Z is R31:R30 */ > - Z = (((core->RAMPZ) & 0x3f) << 16) + > + Z = ((avr_core_rampz_get(core) & 0x3f) << 16) + > (avr_core_gpwr_get(core, 31) << 8) + > avr_core_gpwr_get(core, 30); > > @@ -1098,7 +1098,7 @@ > > /* FIXME: Is this correct? */ > /* Z is R31:R30 */ > - Z = (((core->RAMPZ) & 0x3f) << 16) + > + Z = ((avr_core_rampz_get(core) & 0x3f) << 16) + > (avr_core_gpwr_get(core, 31) << 8) + > avr_core_gpwr_get(core, 30); > > @@ -1117,7 +1117,7 @@ > Z += 1; > avr_core_gpwr_set( core, 30, Z & 0xff ); > avr_core_gpwr_set( core, 31, Z >> 8 ); > - core->RAMPZ = (Z >> 16) & 0x3f; > + avr_core_rampz_set(core, (Z >> 16) & 0x3f); > > avr_core_PC_incr( core, 1 ); > avr_core_inst_CKS_set( core, 3 ); > Index: src/register.c > =================================================================== > RCS file: /cvsroot/simulavr/simulavr/src/register.c,v > retrieving revision 1.28 > diff -u -r1.28 register.c > --- src/register.c 27 May 2002 18:01:40 -0000 1.28 > +++ src/register.c 13 Oct 2002 00:07:29 -0000 > @@ -572,3 +572,81 @@ > return CB_RET_RETAIN; > } > > +/****************************************************************************\ > + * > + * RAMPZ(VDevice) : The RAMPZ register used by ELPM and ESPM instructions. > + * > + * Even though the rampz register is not available to all devices, we will > + * install it for all in the simulator. It just so much easier that way and > + * we're already assuming that the compiler generated the correct code in > + * many places anyways. Let's see if we get bit. > + * > +\****************************************************************************/ > + > +static byte rampz_read( VDevice *dev, int addr ); > +static void rampz_write( VDevice *dev, int addr, byte val ); > +static void rampz_reset( VDevice *dev ); > +static char *rampz_reg_name( VDevice *dev, int addr ); > + > +RAMPZ *rampz_new( void ) > +{ > + RAMPZ *rampz; > + > + rampz = avr_new( RAMPZ, 1 ); > + rampz_construct( rampz ); > + class_overload_destroy( (AvrClass *)rampz, rampz_destroy ); > + > + return rampz; > +} > + > +void rampz_construct( RAMPZ *rampz ) > +{ > + char *name = "RAMPZ"; > + > + if (rampz == NULL) > + avr_error( "passed null ptr" ); > + > + vdev_construct( (VDevice *)rampz, name, RAMPZ_BASE, RAMPZ_SIZE, > + rampz_read, rampz_write, rampz_reset, rampz_reg_name ); > + > + rampz->reg = 0; > +} > + > +void rampz_destroy( void *rampz ) > +{ > + if (rampz == NULL) > + return; > + > + vdev_destroy( rampz ); > +} > + > +byte rampz_get( RAMPZ *rampz ) > +{ > + return rampz->reg; > +} > + > +void rampz_set( RAMPZ *rampz, byte val ) > +{ > + rampz->reg = val; > +} > + > +static byte rampz_read( VDevice *dev, int addr ) > +{ > + return rampz_get( (RAMPZ *)dev ); > +} > + > +static void rampz_write( VDevice *dev, int addr, byte val ) > +{ > + rampz_set( (RAMPZ *)dev, val ); > +} > + > +static void rampz_reset( VDevice *dev ) > +{ > + display_io_reg( RAMPZ_IO_REG, 0 ); > + ((RAMPZ *)dev)->reg = 0; > +} > + > +static char *rampz_reg_name( VDevice *dev, int addr ) > +{ > + return vdev_get_name( dev ); > +} > Index: src/register.h > =================================================================== > RCS file: /cvsroot/simulavr/simulavr/src/register.h,v > retrieving revision 1.2 > diff -u -r1.2 register.h > --- src/register.h 18 Mar 2002 23:48:23 -0000 1.2 > +++ src/register.h 13 Oct 2002 00:07:29 -0000 > @@ -253,4 +253,30 @@ > > extern void wdtcr_update ( WDTCR *wdtcr ); > > +/****************************************************************************\ > + * > + * RAMPZ(VDevice) : The RAMPZ register used by ELPM and ESPM instructions. > + * > +\****************************************************************************/ > + > +enum _rampz_addr_info { > + RAMPZ_BASE = 0x5b, /* base rampz mem addr */ > + RAMPZ_SIZE = 0x01, > + RAMPZ_IO_REG = RAMPZ_BASE - IO_REG_ADDR_BEGIN, > +}; > + > +typedef struct _RAMPZ RAMPZ; > + > +struct _RAMPZ { > + VDevice parent; > + byte reg; > +}; > + > +extern RAMPZ *rampz_new ( void ); > +extern void rampz_construct ( RAMPZ *rampz ); > +extern void rampz_destroy ( void *rampz ); > + > +extern byte rampz_get ( RAMPZ *rampz ); > +extern void rampz_set ( RAMPZ *rampz, byte val ); > + > #endif /* SIM_REGISTER_H */ -- --------------- The world's most affordable web hosting. http://www.nearlyfreespeech.net --4Ckj6UjgE2iN1+kY Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="simpleuart.c" /* * $Id: simpleuart.c,v 1.1 2002/10/13 03:02:28 ken Exp $ * very simple test program to assure that uart works * this just echoes characters back out the uart interface * */ #include #include char recchar(void) { while (! (UCSRA & _BV(RXC))); return UDR; } void sendchar(char c) { while (! (UCSRA & _BV(TXC))); UDR = c; } int main(int argc, char ** argv) { volatile int c; /* setup serial */ UBRR = 51; /* 9600 at 8 mhz */ UCSRB |= (_BV(RXEN) | _BV(TXEN)); sendchar('F'); sendchar('\n'); while(1){ c = recchar(); /* right back at 'cha */ sendchar(c); }; return(0); } /* END MAIN */ /* EOF */ --4Ckj6UjgE2iN1+kY-- --NDin8bjvE/0mNLFQ Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE9qObLe8HF+6xeOIcRAsrTAKCruSFDE8YUb38SXlBYj9EFDE/yZQCeMOUW JQGlLcdvm2uZvBikoadXDLQ= =Dh9c -----END PGP SIGNATURE----- --NDin8bjvE/0mNLFQ-- From troth@openavr.org Sun Oct 13 02:25:25 2002 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 180cBp-0002XL-00 for simulavr-devel@mail.freesoftware.fsf.org; Sun, 13 Oct 2002 02:25:25 -0400 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 180cBn-0002Vk-00 for simulavr-devel@mail.freesoftware.fsf.org; Sun, 13 Oct 2002 02:25:24 -0400 Received: from sense-smead-139.oz.net ([216.39.162.139] helo=thevenin.amplepower.com) by monty-python.gnu.org with esmtp (Exim 4.10) id 180cBm-0002Um-00 for Simulavr-devel@mail.freesoftware.fsf.org; Sun, 13 Oct 2002 02:25:23 -0400 Received: from [192.168.8.29] (helo=bozoland.mynet) by thevenin.amplepower.com with esmtp (Exim 3.35 #1 (Debian)) id 180c8i-0004oY-00; Sat, 12 Oct 2002 23:22:12 -0700 From: "Theodore A. Roth" X-X-Sender: troth@bozoland.mynet To: ken restivo cc: Simulavr-devel@mail.freesoftware.fsf.org Subject: Re: [Simulavr-devel] Re: simulavr, again, and UART In-Reply-To: <20021013032148.GA10353@fred.246gt.com> Message-ID: MIME-Version: 1.0 Content-Type: MULTIPART/Mixed; BOUNDARY=4Ckj6UjgE2iN1+kY Content-ID: Content-Disposition: INLINE Sender: simulavr-devel-admin@mail.freesoftware.fsf.org Errors-To: simulavr-devel-admin@mail.freesoftware.fsf.org X-BeenThere: simulavr-devel@mail.freesoftware.fsf.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Discussion of simulavr development. List-Unsubscribe: , List-Archive: Date: Sun Oct 13 02:26:02 2002 X-Original-Date: Sat, 12 Oct 2002 23:22:30 -0700 (PDT) This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. --4Ckj6UjgE2iN1+kY Content-Type: TEXT/PLAIN; CHARSET=US-ASCII Content-ID: Content-Disposition: INLINE On Sat, 12 Oct 2002, ken restivo wrote: :)OK, you shamed me into it. ;-) :) :)Test program is attached. This works with my simulated UART on my simulated :)Mega163, which includes a mix of Ted's version of my UART patch, plus my :)original Mega163 patch, plus a bunch of changes I had made that I haven't :)had time to sort out properly. "It works for me (tm)". :) :)-ken Thanks Ken. >From your discription, it sounds like it may be less than trivial to use your patch then. I'll have to dig the 163 patch out of the archives... Ted Roth --4Ckj6UjgE2iN1+kY Content-Type: TEXT/PLAIN; CHARSET=us-ascii Content-ID: Content-Description: Content-Disposition: ATTACHMENT; FILENAME="simpleuart.c" /* * $Id: simpleuart.c,v 1.1 2002/10/13 03:02:28 ken Exp $ * very simple test program to assure that uart works * this just echoes characters back out the uart interface * */ #include #include char recchar(void) { while (! (UCSRA & _BV(RXC))); return UDR; } void sendchar(char c) { while (! (UCSRA & _BV(TXC))); UDR = c; } int main(int argc, char ** argv) { volatile int c; /* setup serial */ UBRR = 51; /* 9600 at 8 mhz */ UCSRB |= (_BV(RXEN) | _BV(TXEN)); sendchar('F'); sendchar('\n'); while(1){ c = recchar(); /* right back at 'cha */ sendchar(c); }; return(0); } /* END MAIN */ /* EOF */ --4Ckj6UjgE2iN1+kY-- From ken@restivo.org Sun Oct 13 12:08:16 2002 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 180lHs-0005P7-00 for simulavr-devel@mail.freesoftware.fsf.org; Sun, 13 Oct 2002 12:08:16 -0400 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 180lHq-0005Nk-00 for simulavr-devel@mail.freesoftware.fsf.org; Sun, 13 Oct 2002 12:08:16 -0400 Received: from 64-121-1-69.c3-0.sfo-ubr1.sfrn-sfo.ca.cable.rcn.com ([64.121.1.69] helo=vaio.home.restivo.org) by monty-python.gnu.org with esmtp (Exim 4.10) id 180lHp-0005HF-00 for Simulavr-devel@mail.freesoftware.fsf.org; Sun, 13 Oct 2002 12:08:14 -0400 Received: (from localken@localhost) by vaio.home.restivo.org (8.11.3/8.11.3) id g9DG5P203820 for Simulavr-devel@mail.freesoftware.fsf.org; Sun, 13 Oct 2002 09:05:25 -0700 (PDT) X-Authentication-Warning: vaio.home.restivo.org: localken set sender to ken@restivo.org using -f From: ken@restivo.org To: Simulavr-devel@mail.freesoftware.fsf.org Subject: Re: [Simulavr-devel] Re: simulavr, again, and UART Message-ID: <20021013090521.B23094@vaio.home.restivo.org> References: <20021013032148.GA10353@fred.246gt.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: ; from troth@openavr.org on Sat, Oct 12, 2002 at 11:22:30PM -0700 Sender: simulavr-devel-admin@mail.freesoftware.fsf.org Errors-To: simulavr-devel-admin@mail.freesoftware.fsf.org X-BeenThere: simulavr-devel@mail.freesoftware.fsf.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Discussion of simulavr development. List-Unsubscribe: , List-Archive: Date: Sun Oct 13 12:09:02 2002 X-Original-Date: Sun, 13 Oct 2002 09:05:21 -0700 Ted- The sad thing is that "I don't know". The UART patch *may* stand alone, or it may require the 163 patch, but, I don't remember if I tested that or not, and, I simply don't get enough uninterrupted time these days to try it and find out (and fix it if it doesn't). All I know is that it works with what I had sitting here before I got pulled off the project. -ken ------- On Sat, Oct 12, 2002 at 11:22:30PM -0700, Theodore A. Roth wrote: > On Sat, 12 Oct 2002, ken restivo wrote: > > :)OK, you shamed me into it. ;-) > :) > :)Test program is attached. This works with my simulated UART on my simulated > :)Mega163, which includes a mix of Ted's version of my UART patch, plus my > :)original Mega163 patch, plus a bunch of changes I had made that I haven't > :)had time to sort out properly. "It works for me (tm)". > :) > :)-ken > > Thanks Ken. > > >From your discription, it sounds like it may be less than trivial to use > your patch then. I'll have to dig the 163 patch out of the archives... > > Ted Roth > /* > * $Id: simpleuart.c,v 1.1 2002/10/13 03:02:28 ken Exp $ > * very simple test program to assure that uart works > * this just echoes characters back out the uart interface > * > */ > > #include > #include > > > char recchar(void) > { > while (! (UCSRA & _BV(RXC))); > return UDR; > } > > void sendchar(char c) > { > while (! (UCSRA & _BV(TXC))); > UDR = c; > } > > int > main(int argc, char ** argv) > { > volatile int c; > > /* setup serial */ > UBRR = 51; /* 9600 at 8 mhz */ > UCSRB |= (_BV(RXEN) | _BV(TXEN)); > > > sendchar('F'); > sendchar('\n'); > > while(1){ > c = recchar(); > /* right back at 'cha */ > sendchar(c); > }; > > return(0); > } /* END MAIN */ > > /* EOF */ > > From harald@hekta.org Tue Oct 22 13:34:45 2002 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 1842vV-0002Cs-00 for simulavr-devel@nongnu.org; Tue, 22 Oct 2002 13:34:45 -0400 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 1842vS-0002CW-00 for simulavr-devel@nongnu.org; Tue, 22 Oct 2002 13:34:44 -0400 Received: from hekta.stud.iet.hist.no ([158.38.53.131] helo=hekta.org) by monty-python.gnu.org with esmtp (Exim 4.10) id 1842vS-0002CO-00 for simulavr-devel@nongnu.org; Tue, 22 Oct 2002 13:34:42 -0400 Received: by hekta.org (Postfix, from userid 505) id 1940C1B94F; Tue, 22 Oct 2002 19:34:43 +0200 (CEST) From: Harald Skoglund To: simulavr-devel@nongnu.org Message-ID: <20021022173443.GI14468@hekta.org> Reply-To: harald@hekta.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="wac7ysb48OaltWcw" Content-Disposition: inline User-Agent: Mutt/1.3.28i Subject: [Simulavr-devel] Build Error: demo.c Sender: simulavr-devel-admin@nongnu.org Errors-To: simulavr-devel-admin@nongnu.org X-BeenThere: simulavr-devel@nongnu.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Discussion of simulavr development. List-Unsubscribe: , List-Archive: Date: Tue Oct 22 13:35:05 2002 X-Original-Date: Tue, 22 Oct 2002 19:34:43 +0200 --wac7ysb48OaltWcw Content-Type: text/plain; charset=us-ascii Content-Disposition: inline avr-gcc -I. -I/usr/avr/ -g -Wall -v -save-temps -mmcu=at90s8515 -c demo.c Reading specs from /usr/lib/gcc-lib/avr/3.2/specs Configured with: ../src/configure -v --enable-languages=c --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --enable-shared --with-gnu-as --with-gnu-ld --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-checking --build=i386-linux --host=i386-linux --target=avr Thread model: single gcc version 3.2 (Debian) /usr/lib/gcc-lib/avr/3.2/cpp0 -lang-c -v -I. -I/usr/avr/ -D__GNUC__=3 -D__GNUC_MINOR__=2 -D__GNUC_PATCHLEVEL__=0 -D__GXX_ABI_VERSION=102 -DAVR -D__AVR__ -D__AVR -D__NO_INLINE__ -D__STDC_HOSTED__=1 -D__AVR_ARCH__=2 -D__AVR_AT90S8515__ -D__SIZE_TYPE__=unsigned int -D__PTRDIFF_TYPE__=int -D__INT_MAX__=32767 demo.c -Wall demo.i GNU CPP version 3.2 (Debian) (cpplib) (GNU assembler syntax) ignoring nonexistent directory "/usr/avr/sys-include" #include "..." search starts here: #include <...> search starts here: . /usr/avr /usr/lib/gcc-lib/avr/3.2/include /usr/avr/include End of search list. /usr/lib/gcc-lib/avr/3.2/cc1 -fpreprocessed demo.i -quiet -dumpbase demo.c -mmcu=at90s8515 -g -Wall -version -o demo.s GNU CPP version 3.2 (Debian) (cpplib) (GNU assembler syntax) GNU C version 3.2 (Debian) (avr) compiled by GNU C version 2.95.4 20011002 (Debian prerelease). demo.c: In function `main': demo.c:18: warning: asm operand 0 probably doesn't match constraints demo.c:18: warning: asm operand 1 probably doesn't match constraints demo.c:21: warning: asm operand 0 probably doesn't match constraints demo.c:21: warning: asm operand 1 probably doesn't match constraints demo.c:27: Internal compiler error in instantiate_virtual_regs_1, at function.c:4126 Please submit a full bug report, with preprocessed source if appropriate. See for instructions. make: *** [demo.o] Error 1 This might be a GCC-bug, but I'm submitting it here first, just incase it's me who's doing something stupid :) -- Harald --wac7ysb48OaltWcw Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="demo.i" # 1 "demo.c" # 1 "" # 1 "" # 1 "demo.c" # 1 "/usr/avr/avr/io.h" 1 # 20 "/usr/avr/avr/io.h" # 1 "/usr/avr/include/io-avr.h" 1 3 # 46 "/usr/avr/include/io-avr.h" 3 # 1 "/usr/avr/include/io8515.h" 1 3 # 47 "/usr/avr/include/io-avr.h" 2 3 # 21 "/usr/avr/avr/io.h" 2 # 1 "/usr/avr/include/iomacros.h" 1 3 # 21 "/usr/avr/include/iomacros.h" 3 # 1 "/usr/avr/include/inttypes.h" 1 3 # 24 "/usr/avr/include/inttypes.h" 3 typedef signed char int8_t; typedef unsigned char uint8_t; typedef int int16_t; typedef unsigned int uint16_t; typedef long int32_t; typedef unsigned long uint32_t; typedef long long int64_t; typedef unsigned long long uint64_t; typedef int16_t intptr_t; typedef uint16_t uintptr_t; # 22 "/usr/avr/include/iomacros.h" 2 3 # 22 "/usr/avr/avr/io.h" 2 # 8 "demo.c" 2 # 1 "/usr/avr/avr/pgmspace.h" 1 # 29 "/usr/avr/avr/pgmspace.h" # 1 "/usr/lib/gcc-lib/avr/3.2/include/stddef.h" 1 3 4 # 201 "/usr/lib/gcc-lib/avr/3.2/include/stddef.h" 3 4 typedef unsigned int size_t; # 30 "/usr/avr/avr/pgmspace.h" 2 # 51 "/usr/avr/avr/pgmspace.h" typedef void prog_void __attribute__((__progmem__)); typedef char prog_char __attribute__((__progmem__)); typedef unsigned char prog_uchar __attribute__((__progmem__)); typedef int prog_int __attribute__((__progmem__)); typedef long prog_long __attribute__((__progmem__)); typedef long long prog_long_long __attribute__((__progmem__)); # 1 "/usr/avr/include/ina90.h" 1 3 # 100 "/usr/avr/include/ina90.h" 3 # 1 "/usr/avr/include/eeprom.h" 1 3 # 22 "/usr/avr/include/eeprom.h" 3 # 1 "/usr/lib/gcc-lib/avr/3.2/include/stddef.h" 1 3 4 # 23 "/usr/avr/include/eeprom.h" 2 3 # 1 "/usr/avr/include/io.h" 1 3 # 25 "/usr/avr/include/eeprom.h" 2 3 # 34 "/usr/avr/include/eeprom.h" 3 extern unsigned char eeprom_rb(unsigned int addr); extern unsigned int eeprom_rw(unsigned int addr); extern void eeprom_wb(unsigned int addr, unsigned char val); extern void eeprom_read_block(void *buf, unsigned int addr, size_t n); # 101 "/usr/avr/include/ina90.h" 2 3 # 62 "/usr/avr/avr/pgmspace.h" 2 static inline unsigned char __lpm_inline(unsigned short __addr) __attribute__((__const__)); static inline unsigned char __lpm_inline(unsigned short __addr) { return ({ unsigned short __addr16 = (unsigned short)(__addr); unsigned char __result; __asm__ ( "lpm" "\n\t" "mov %0, r0" : "=r" (__result) : "z" (__addr16) : "r0" ); __result; }); } # 98 "/usr/avr/avr/pgmspace.h" extern void *memcpy_P(void *, const prog_void *, size_t); extern char *strcat_P(char *, const prog_char *); extern int strcmp_P(const char *, const prog_char *) __attribute__((__pure__)); extern char *strcpy_P(char *, const prog_char *); extern int strcasecmp_P(const char *, const prog_char *) __attribute__((__pure__)); extern size_t strlen_P(const prog_char *) __attribute__((__const__)); extern int strncmp_P(const char *, const prog_char *, size_t) __attribute__((__pure__)); extern int strncasecmp_P(const char *, const prog_char *) __attribute__((__pure__)); extern char *strncpy_P(char *, const prog_char *, size_t); # 9 "demo.c" 2 int main(void) { unsigned char cnt; do { if ((__builtin_constant_p((0xff)) && ((0xff)) <= 0x40 + 0 - (1))) { if (__builtin_constant_p((0x17)) && ((0x17) == 0)) __asm__ __volatile__ ( "out %0,__zero_reg__" : : "M" ((uint8_t)(((0xff))-0)) ); else __asm__ __volatile__ ( "out %1,%0" : : "r" ((uint8_t)((0x17))), "M" ((uint8_t)(((0xff))-0)) ); } else (*((volatile uint8_t *)(((0xff)) - 0 + 0x20))) = (0x17); } while (0); for ( cnt=0xff; cnt > 0; cnt-- ) do { if ((__builtin_constant_p((cnt)) && ((cnt)) <= 0x40 + 0 - (1))) { if (__builtin_constant_p((0x18)) && ((0x18) == 0)) __asm__ __volatile__ ( "out %0,__zero_reg__" : : "M" ((uint8_t)(((cnt))-0)) ); else __asm__ __volatile__ ( "out %1,%0" : : "r" ((uint8_t)((0x18))), "M" ((uint8_t)(((cnt))-0)) ); } else (*((volatile uint8_t *)(((cnt)) - 0 + 0x20))) = (0x18); } while (0); for (;;) ; return 0; } --wac7ysb48OaltWcw-- From troth@verinet.com Tue Oct 22 15:34:52 2002 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 1844nk-0005np-00 for simulavr-devel@nongnu.org; Tue, 22 Oct 2002 15:34:52 -0400 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 1844ne-0005PU-00 for simulavr-devel@nongnu.org; Tue, 22 Oct 2002 15:34:49 -0400 Received: from sense-smead-139.oz.net ([216.39.162.139] helo=thevenin.amplepower.com) by monty-python.gnu.org with esmtp (Exim 4.10) id 1844nd-0005L9-00 for simulavr-devel@nongnu.org; Tue, 22 Oct 2002 15:34:45 -0400 Received: from [192.168.8.30] (helo=knuth.amplepower.com ident=roth) by thevenin.amplepower.com with esmtp (Exim 3.35 #1 (Debian)) id 1844kd-00021I-00; Tue, 22 Oct 2002 12:31:39 -0700 From: "Theodore A. Roth" X-X-Sender: roth@knuth.amplepower.com To: Harald Skoglund cc: simulavr-devel@nongnu.org Subject: Re: [Simulavr-devel] Build Error: demo.c In-Reply-To: <20021022173443.GI14468@hekta.org> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: simulavr-devel-admin@nongnu.org Errors-To: simulavr-devel-admin@nongnu.org X-BeenThere: simulavr-devel@nongnu.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Discussion of simulavr development. List-Unsubscribe: , List-Archive: Date: Tue Oct 22 15:35:02 2002 X-Original-Date: Tue, 22 Oct 2002 12:35:10 -0700 (PDT) Which version of simulavr are you using? I would suspect that the problem goes away if you use the current cvs version of gcc. Try switching the order of the outb() arguments and see if that helps. If you don't need the test programs, configure with the --without-tests option. Hope that helps. Ted Roth On Tue, 22 Oct 2002, Harald Skoglund wrote: :) avr-gcc -I. -I/usr/avr/ -g -Wall -v -save-temps -mmcu=at90s8515 -c demo.c :) Reading specs from /usr/lib/gcc-lib/avr/3.2/specs :) Configured with: ../src/configure -v --enable-languages=c --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --enable-shared --with-gnu-as --with-gnu-ld --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-checking --build=i386-linux --host=i386-linux --target=avr :) Thread model: single :) gcc version 3.2 (Debian) :) /usr/lib/gcc-lib/avr/3.2/cpp0 -lang-c -v -I. -I/usr/avr/ -D__GNUC__=3 -D__GNUC_MINOR__=2 -D__GNUC_PATCHLEVEL__=0 -D__GXX_ABI_VERSION=102 -DAVR -D__AVR__ -D__AVR -D__NO_INLINE__ -D__STDC_HOSTED__=1 -D__AVR_ARCH__=2 -D__AVR_AT90S8515__ -D__SIZE_TYPE__=unsigned int -D__PTRDIFF_TYPE__=int -D__INT_MAX__=32767 demo.c -Wall demo.i :) GNU CPP version 3.2 (Debian) (cpplib) (GNU assembler syntax) :) ignoring nonexistent directory "/usr/avr/sys-include" :) #include "..." search starts here: :) #include <...> search starts here: :) . :) /usr/avr :) /usr/lib/gcc-lib/avr/3.2/include :) /usr/avr/include :) End of search list. :) /usr/lib/gcc-lib/avr/3.2/cc1 -fpreprocessed demo.i -quiet -dumpbase demo.c -mmcu=at90s8515 -g -Wall -version -o demo.s :) GNU CPP version 3.2 (Debian) (cpplib) (GNU assembler syntax) :) GNU C version 3.2 (Debian) (avr) :) compiled by GNU C version 2.95.4 20011002 (Debian prerelease). :) demo.c: In function `main': :) demo.c:18: warning: asm operand 0 probably doesn't match constraints :) demo.c:18: warning: asm operand 1 probably doesn't match constraints :) demo.c:21: warning: asm operand 0 probably doesn't match constraints :) demo.c:21: warning: asm operand 1 probably doesn't match constraints :) demo.c:27: Internal compiler error in instantiate_virtual_regs_1, at function.c:4126 :) Please submit a full bug report, :) with preprocessed source if appropriate. :) See for instructions. :) make: *** [demo.o] Error 1 :) :) This might be a GCC-bug, but I'm submitting it here first, just incase :) it's me who's doing something stupid :) :) :) -- :) Harald :) From harald@hekta.org Tue Oct 22 15:46:27 2002 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 1844yw-0001sH-00 for simulavr-devel@nongnu.org; Tue, 22 Oct 2002 15:46:26 -0400 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 1844yv-0001rO-00 for simulavr-devel@nongnu.org; Tue, 22 Oct 2002 15:46:26 -0400 Received: from hekta.stud.iet.hist.no ([158.38.53.131] helo=hekta.org) by monty-python.gnu.org with esmtp (Exim 4.10) id 1844yu-0001rK-00 for simulavr-devel@nongnu.org; Tue, 22 Oct 2002 15:46:25 -0400 Received: by hekta.org (Postfix, from userid 505) id B24B31B94F; Tue, 22 Oct 2002 21:46:25 +0200 (CEST) From: Harald Skoglund To: "Theodore A. Roth" Cc: simulavr-devel@nongnu.org Subject: Re: [Simulavr-devel] Build Error: demo.c Message-ID: <20021022194625.GA24767@hekta.org> Reply-To: harald@hekta.org References: <20021022173443.GI14468@hekta.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.3.28i Sender: simulavr-devel-admin@nongnu.org Errors-To: simulavr-devel-admin@nongnu.org X-BeenThere: simulavr-devel@nongnu.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Discussion of simulavr development. List-Unsubscribe: , List-Archive: Date: Tue Oct 22 15:47:01 2002 X-Original-Date: Tue, 22 Oct 2002 21:46:25 +0200 Theodore A. Roth: > Which version of simulavr are you using? I would suspect that the problem > goes away if you use the current cvs version of gcc. This was the newest (0.1.1) version of simulavr. cvs of gcc? did you mean cvs of simulavr? > Try switching the order of the outb() arguments and see if that helps. That worked. Was this simply a type-o ? -- Harald From troth@verinet.com Tue Oct 22 15:54:50 2002 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 184574-0004cG-00 for simulavr-devel@nongnu.org; Tue, 22 Oct 2002 15:54:50 -0400 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 184572-0004c0-00 for simulavr-devel@nongnu.org; Tue, 22 Oct 2002 15:54:49 -0400 Received: from sense-smead-139.oz.net ([216.39.162.139] helo=thevenin.amplepower.com) by monty-python.gnu.org with esmtp (Exim 4.10) id 184572-0004bw-00 for simulavr-devel@nongnu.org; Tue, 22 Oct 2002 15:54:48 -0400 Received: from [192.168.8.30] (helo=knuth.amplepower.com ident=roth) by thevenin.amplepower.com with esmtp (Exim 3.35 #1 (Debian)) id 184543-00023t-00; Tue, 22 Oct 2002 12:51:43 -0700 From: "Theodore A. Roth" X-X-Sender: roth@knuth.amplepower.com To: Harald Skoglund cc: simulavr-devel@nongnu.org Subject: Re: [Simulavr-devel] Build Error: demo.c In-Reply-To: <20021022194625.GA24767@hekta.org> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: simulavr-devel-admin@nongnu.org Errors-To: simulavr-devel-admin@nongnu.org X-BeenThere: simulavr-devel@nongnu.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Discussion of simulavr development. List-Unsubscribe: , List-Archive: Date: Tue Oct 22 15:55:02 2002 X-Original-Date: Tue, 22 Oct 2002 12:55:15 -0700 (PDT) On Tue, 22 Oct 2002, Harald Skoglund wrote: :) Theodore A. Roth: :) > Which version of simulavr are you using? I would suspect that the problem :) > goes away if you use the current cvs version of gcc. :) This was the newest (0.1.1) version of simulavr. cvs of gcc? did you :) mean cvs of simulavr? :) :) > Try switching the order of the outb() arguments and see if that helps. :) That worked. Was this simply a type-o ? No. The order of the args was changed in avr-libc which requires the latest cvs gcc. It's a bit painful in the avr-libc/gcc realm right now as there have been incompatible changes made which haven't seen the light of day via a stable releases yet. It's going to be a month or two before that happens. Sorry for the confusion. Ted Roth From Carsten.Beth@Informatik.Uni-Oldenburg.DE Wed Oct 23 15:06:28 2002 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 184Qpn-0006fk-00 for simulavr-devel@mail.freesoftware.fsf.org; Wed, 23 Oct 2002 15:06:27 -0400 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 184Qpi-0006ej-00 for simulavr-devel@mail.freesoftware.fsf.org; Wed, 23 Oct 2002 15:06:27 -0400 Received: from arbi.informatik.uni-oldenburg.de ([134.106.1.7]) by monty-python.gnu.org with esmtp (Exim 4.10) id 184Qpg-0006eP-00 for simulavr-devel@mail.freesoftware.fsf.org; Wed, 23 Oct 2002 15:06:20 -0400 Received: from troja.Informatik.Uni-Oldenburg.DE ([134.106.1.36]) by arbi.Informatik.Uni-Oldenburg.DE (Exim 3.16) id 184Qpe-00041K-00; Wed, 23 Oct 2002 21:06:18 +0200 Received: from ofen.Informatik.Uni-Oldenburg.DE ([134.106.12.38]) by troja.Informatik.Uni-Oldenburg.DE (Exim 3.16) id 184Qpd-00067i-00; Wed, 23 Oct 2002 21:06:17 +0200 Received: from Informatik.Uni-Oldenburg.DE ([127.0.0.1]) by ofen.Informatik.Uni-Oldenburg.DE (Exim 3.16) id 184Qpd-0002hZ-00; Wed, 23 Oct 2002 21:06:17 +0200 Message-ID: <3DB6F328.ADF97A02@Informatik.Uni-Oldenburg.DE> From: "Carsten Beth" X-Mailer: Mozilla 4.78 [en] (X11; U; OSF1 V4.0 alpha) X-Accept-Language: en MIME-Version: 1.0 To: simulavr-devel@mail.freesoftware.fsf.org Content-Type: multipart/mixed; boundary="------------DDA84D47774BAA3BFA7F09FD" Subject: [Simulavr-devel] vcd file dumper for simulavr Sender: simulavr-devel-admin@nongnu.org Errors-To: simulavr-devel-admin@nongnu.org X-BeenThere: simulavr-devel@nongnu.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Discussion of simulavr development. List-Unsubscribe: , List-Archive: Date: Wed Oct 23 15:07:01 2002 X-Original-Date: Wed, 23 Oct 2002 21:06:17 +0200 This is a multi-part message in MIME format. --------------DDA84D47774BAA3BFA7F09FD Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Hello everybody! I have written a display program which writes simulavr output to a value change dump (vcd) file. vcd files are defined in the language reference manual of the hardware description language verilog. They are mainly used to store signal traces and processing them in additional application, e.g. waveform viewer. In the attachment there is the tar file disp-vcd.tgz. For installation you have to save it in your simulavr build directory and untar it. Then change to the disp-vcd directory and call make. Make sure the executable simulavr-vcd is in your PATH. Unfortunately simulavr-vcd needs time-information from simulavr, which normally isn't transfer. So you have to patch simulavr and recompile it. I am not familiar with the patch mechanism, so I send the files, which has to be changed, in the attachment. Sorry for that procedure. They work with simulavr release 0.1.1. Before starting a simulation you have to create a configuration file vcd.cfg (or copy/modify the example file). In that file you have to define the signals which shall be traced. Traceable signals are at the moment registers, io-registers, sram content, the program counter and the stack pointer. See the example vcd.cfg for syntax. To start simulavr with the simulavr-vcd as a co-process you have to execute e.g.: simulavr -d at90s2313 --gdbserver --disp-prog=simulavr-vcd While simulation the vcd file is written. You can use (hopefully) any waveform viewer which can handle vcd files. At the moment I have just test it with the free viewer GTKWave. Please try the tool, I think it's a good aid for debugging your software. Carsten --------------DDA84D47774BAA3BFA7F09FD Content-Type: application/octet-stream; name="disp-vcd.tgz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="disp-vcd.tgz" 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 /0r5/aTIHT+ORX/2GTBxV7ziF+4DMDkJ/+6T+i7QvRxaM4FPKfFfANz/Cl+UL9pHYNpl8RmJ bwGOP6DpT/lk/QCep+TvRt3LybUd+JdK/d8NPITyeLvU92PdHV+H4P6nuPpYCc9Lujt+Ksf4 vF/3cny9pXs5vn4DvPtRTX9c6v8Dzct/oOlrZXoEi70cYJOA1x0WXILl/lJ2SbGXE6wOeN9e hFfGd3mxlyMsRvNvtNfv2P1FsZczjObxKmfYnmIvZ9j+Yi9n2EvFXs6w48Xe/H2Hwq+k9y+L 3fnEWMwnPin2coz5MQUaUtwTf9Gu+zX9DRnei4Ji/HmXxJcC1yG+GYkbgl6OsmVBL0fZLUEv R1kyKMZT72vC/Sbg1Sj/s6S+O4Efvcetfz8k/1DeTYkfD3o5zp4FPqno7w96Oc/eDno5z/4z 6OU8O0XhR/1qlfpLS7wcaBeVuOWP3j1OK/Fyos0F3o/29vvS/TLgOUr6/zXwB2h/n5PmEeCn H3bbD6vEy6l2F/n/kKYXyPJ0T4mXY+0h4BcV/fvI/z67PStlh4DrFfNjwPMe0/T/kOb/pszZ Q5ATJTkcbctM/jixLRqdYdD6W3q5FuZkagphGIumM1Ym29oajrJU+JvMMBpXX7vSWLZk1WrD YOSsHWpi4ToiXEsabe3Jlki7wZ85GpFsF+42LTauWTl/eZOxoGnRkhVwRI8vjVi2o6ObJVvW m9FMuLaWCQYzcZeedcrL1mQ6ahqZpMGfchrGQsVz1cOo4iG307SikVtpVIEIh0BEJ4s4tSbS VsaItiejtxrJaDSbRlxq6xnx0hnJVMZibZ1ZQ5DVwbYLaoH40l9G7G4ZE8mVCl9Z76Bo+63h +nrWGqGQhetnMZUIOA1n3d2ZdKTTao9kTFyna+nfDPyLmeRGXLQlM0lcpcSNlISZSEs7ueGL qZmXoZgrNhCNtNmZkW8k+R26NlJ0yZ8k01tFnr24iESjZopfmdx1h4mkxrklYpE3BgJCp84u bicav5VO8WR7zCDuawLtEaShUEMM4dDMI5V7P5pKWoyW/3F13LVFl8R8nUqbGxLJrOU6zqS7 jRVrlhk8mWxrnSixSrRiiZhEhrUxkYnGDZRbM8nDy983C5ZuDtvNLsPm9uvuztIbZvGe2TG1 zQSSRHoxK2nEI50xJDnym0KDAmmlWGckxW9YCBWsfidrdka77dwQr2wtzsrObXWaGw3JLyjY BufNcxn3pCPiR8zhAmeuZtJC66wNWrbOjMYbVsxfvmQhL8aiUOF/9FbTUWFwbkQ7rdJmG9Wo lCEKD18/LQNkcdWco5CWW+enFVSDy72EW5ksacleqFoRrIieO+LLCOGh0Zoy4huZyt3N8jBt 24yOHj0pNR5CoWouKCHVO04mOYknPhHIkwO8PbQpKvOY24UM7ZFMV5ULntEXHpZInix9LKIk bEsiU++FtTM9LI2ub8TGiPRBJlhOpitFj7LIVcQbrhHUkmrQRUqKpfR5cpwvp3e1p6KSfTM3 BYWxUCOoMD3pI+kwPR7nJ+D0ZiZpQ1OpBIiTdwqaT9WqGnrBJeotb7Ec+zLCSllxvZCxcEnY BSmo6pxC4YmMaC153lLk+XIMUahzvKBmQwkp8XV6QkpspnmKFq8LzMkNTg0qjdKm7IllIYyZ 1OXaJdAu3qIkcMbRPOrbN0SIMLTFsmRMOJ2ordGz/GUk7Wg+fWZnm7ex4+tTeGg46ajSLkU7 YqIx66ZUl02wqjMVzU1E2cpSalDHb3gSgPc6Bn8Jyr87UlUJBtncwiuLuswUNxNliylIW5Ua yCRzajS3GJCylkRnzLDrUzyZzkTRbit0tnnbDXd9kMN2q9rztgA1nBTWo2dEmglSWk8RNfkY aRNvwxctu3bB/GXGtddcs6pptbF6/oJlTQanhvW6QNHnqcGHEkY2Rd8wGalEymRxs2tGZ6Il p2Lyj48kMW9OsqMM5tTIMxScLq5T8OSKrgSll9cklNGsqTZOaI04Sa6aNVIP+ggMHgQrsCdO Xgpda2Ra23nCR5kyTwRFb07r5RY8mwr4DOUqxbrsVpkXK9mjuTbs1/yCdThXC2+gR7SoIpRK JW1PRtzBDh8kWdxCRvEoDi28BnsYfwUFs6r9/+JBZaUaUb0iZ8Tb/SX6UVNbUzOzro79TztX 29smEoTzmV/xiLaSnfgF7Li5xuoHwuEUKX45jFv5clZEbFwjEWMZ7ByX63+/mcU4OOnLl16r 0+0jI2Nm5mFmd2FnEGtN0/Szllb8ZjRb+tmRdtZqtZqN06ZOx/XTU007wg9p0Q33J3B06yeL r+l9S/4fRf1YwTFe2rNzPB0BlS30WoNfU2rUda3eaED/5bz1+rzZAjcGrD9X2c5LoqDPd0RG uF+6yQMUVRhiCadYVCkuzDW8GDyAQy/Fah1N/TgG1bZ7uxqTmNEqXQcfFwlKZllEA5g0hVI9 iQtyf3cudxHETPKR7pmgXb6tI47myT3lYG2k0QbUMKBKNuAK5HaT+AgSULJepzPeRbNgnjIP HaPch3yjYgDk413M76fyj8veCJc+Na0XYrC5DYMproKpv4x9jmPFR+KFP8Ot4GGLDvsw3PkA kVSJTLQNP+BaY7+OtZGfY0dYQbRmkpKXsOdr8D0yWpbJ3RRcHO9Na18I/zHKGb8vy9wLXkOa LIiSYrwPwpB6HzQfzDdhhSlIGR9s911/5MLojfHBcByj547bpJws+EVdf+tnVMHdKgyImeKi OjRJyX1m6FqO+Y5MjAv7ynbHFAQ6ttuzhkN0+g71/8BwXNscXRkOBiNn0B9aNWDos1s+E3yl ieeil6gZZ1SIB2GcBz6mjqWEYxPOsPC2vAh36gdb8s2jC2KVfrvzmMTjFEWEScqPDdlGMMcy SirZeEUSPe9WNn/s2Qrs5bRWQesNXJ+fAmEQUtJWwXDDBM2mVsFFFCes2TUAraHrelVvamfA aGj8GxdiXVGUVw+K8iJYTsPNzId6+NBloSoKz5zUIjRtgnPSNll8oi0bddQCaXq/9lZ05BWR qfvyW+X/B9islyWYg5uOY/02snrmGOW2ouY1moqiznvz15uOfWUJFZHOqmLZc0HFdQxTyBWV 059MXlTg9dvCPvsHAfWJ2LIGTj9T4F6kHEw9VCDxZdfKNChB2Z2gqOFYl0I6fxQfxpmJxYrq Z/7b/Vwer3LuA/cHmW/TzwkHpoj82qv+ZVR/v5lca9U3+f5xUbFndEUjscLkBE9R1Bx1LyxH 6GZMZHFTK9gUQ6OuyZnVa/VvdULbOW1vnzlbeDZwrU0E/R/LyTNHgAcxok5O2l82xSelpuwG 1zYKZvjMU48SxLg5pmKZ54+y8qAAh6VgCbmQmhDitHgLva3QUH7yBKmU2eceCdUyK/7s6VxC QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQuJ/hn8Ae2rCFQBoAQA= --------------DDA84D47774BAA3BFA7F09FD Content-Type: text/plain; charset=us-ascii; name="display.c" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="display.c" /* * $Id: display.c,v 1.11 2002/09/08 20:35:11 troth Exp $ * **************************************************************************** * * simulavr - A simulator for the Atmel AVR family of microcontrollers. * Copyright (C) 2001, 2002 Theodore A. Roth * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * **************************************************************************** */ /** * \file display.c * \brief Interface for using display coprocesses. * * Simulavr has the ability to use a coprocess to display register and memory * values in near real time. */ #include #include #include #include #include #include #include #include #include #include #include #include "avrerror.h" #include "avrmalloc.h" #include "display.h" enum { MAX_BUF = 1024, }; /* I really don't want to use a global here, but I also don't want to have to track the pipe's fd in the core. */ static int global_pipe_fd = -1; /* Need to store the child's pid so that we can kill and waitpid it when you close the display. Otherwise we have problems with zombies. */ static pid_t global_child_pid = -1; /** \brief Open a display as a coprocess. \param prog The program to use as a display coprocess. \param no_xterm If non-zero, don't run the disply in an xterm. \param flash_sz The size of the flash memory space in bytes. \param sram_sz The size of the sram memory space in bytes. \param sram_start The addr of the first byte of sram (usually 0x60 or 0x100). \param eeprom_sz The size of the eeprom memory space in bytes. Try to start up a helper program as a child process for displaying registers and memory. If the prog argument is NULL, don't start up a display. Returns an open file descriptor of a pipe used to send data to the helper program. Returns -1 if something failed. */ int display_open( char *prog, int no_xterm, int flash_sz, int sram_sz, int sram_start, int eeprom_sz ) { pid_t pid; int pfd[2]; /* pipe file desc: pfd[0] is read, pfd[1] is write */ int res; if (prog == NULL) { prog = getenv( "SIM_DISP_PROG" ); if (prog == NULL) return -1; } /* Open a pipe for writing from the simulator to the display program. We don't want to use popen() since the display program might need to use stdin/stdout for it's own uses. */ res = pipe( pfd ); if (res < 0) { avr_warning( "pipe failed: %s\n", strerror(errno) ); return -1; } /* Fork off a new process. */ pid = fork(); if (pid < 0) { avr_warning( "fork failed: %s\n", strerror(errno) ); return -1; } else if (pid > 0) /* parent process */ { /* close the read side of the pipe */ close( pfd[0] ); /* remember the child's pid */ global_child_pid = pid; global_pipe_fd = pfd[1]; return global_pipe_fd; } else /* child process */ { char pfd_env[20]; char fl_sz[20], sr_sz[20], sr_start[20], eep_sz[20]; char spfd[10]; /* close the write side of the pipe */ close( pfd[1] ); /* setup the args for display program */ snprintf( fl_sz, sizeof(fl_sz)-1, "%d", flash_sz ); snprintf( sr_sz, sizeof(sr_sz)-1, "%d", sram_sz ); snprintf( sr_start, sizeof(sr_start)-1, "%d", sram_start ); snprintf( eep_sz, sizeof(eep_sz)-1, "%d", eeprom_sz ); snprintf( spfd, sizeof(spfd)-1, "%d", pfd[0] ); /* set the SIM_PIPE_FD env variable */ snprintf( pfd_env, sizeof(pfd_env), "SIM_PIPE_FD=%d", pfd[0] ); putenv( pfd_env ); /* The user can specify not to use an xterm since some display programs might not need (or want) to be run in an xterm. For example, a gtk+ program would be able to handle it's own windowing. Of course, starting 'prog' up with it's own xterm, will not hurt and 'prog' will put stdout/stderr there instead of mixing with simulavr's output. The default is to start prog in an xterm. */ if (no_xterm) { execlp( prog, prog, "--pfd", spfd, fl_sz, sr_sz, sr_start, eep_sz, NULL ); } else { /* try to start up the display program in it's own xterm */ execlp( "xterm", "xterm", "-geom", "100x50", "-e", prog, "--pfd", spfd, fl_sz, sr_sz, sr_start, eep_sz, NULL ); } /* if the exec returns, an error occurred */ avr_warning( "exec failed: %s\n", strerror(errno) ); _exit (1); } return -1; /* should never get here */ } /** \brief Close a display and send coprocess a quit message. */ void display_close( void ) { if (global_pipe_fd < 0) return; display_send_msg( "q" ); close( global_pipe_fd ); global_pipe_fd = -1; kill( global_child_pid, SIGINT ); waitpid( 0, NULL, 0 ); } static unsigned char checksum( char *s ) { unsigned char CC = 0; while (*s) { CC += *s; s++; } return CC; } /** \brief Encode the message and send to display. \param msg The message string to be sent to the display process. Encoding is the same as that used by the gdb remote protocol: '\$...\#CC' where '...' is msg, CC is checksum. There is no newline termination for encoded messages. FIXME: TRoth: This should be a private function. It is only public so that dtest.c can be kept simple. dtest.c should be changed to avoid direct use of this function. [dtest.c has served it's purpose and will be retired soon.] */ void display_send_msg( char *msg ) { int len = strlen(msg)+4+1; int res; char *enc_msg; /* the encoded msg */ enc_msg = avr_new0( char, len+1 ); snprintf(enc_msg, len, "$%s#%02x", msg, checksum(msg)); #if defined(DISP_DEBUG_OUTPUT_ON) fprintf(stderr, "DISP: %s\n", enc_msg); #endif res = write( global_pipe_fd, enc_msg, len ); if ( (res < 0) && (errno == EINTR) ) { /* write() was interrupted, try again and if it still fails, let it be fatal. */ avr_warning("Interrupted write()\n"); res = write( global_pipe_fd, enc_msg, len ); } if (res < 0) avr_error( "write failed: %s\n", strerror(errno) ); if (res < len) avr_error( "incomplete write\n" ); avr_free( enc_msg ); } static char global_buf[MAX_BUF+1]; /** \brief Update the time in the display. \param clock The new time in number of clocks. */ void display_clock( int clock ) /* NEW */ { if (global_pipe_fd < 0) return; snprintf(global_buf, MAX_BUF, "n%x", clock); global_buf[MAX_BUF] = '\0'; display_send_msg( global_buf ); } /** \brief Update the Program Counter in the display. \param val The new value of the program counter. */ void display_pc( int val ) { if (global_pipe_fd < 0) return; snprintf(global_buf, MAX_BUF, "p%x", val); global_buf[MAX_BUF] = '\0'; display_send_msg( global_buf ); } /** \brief Update a register in the display. \param reg The register number. \param val The new value of the register. */ void display_reg( int reg, byte val ) { if (global_pipe_fd < 0) return; snprintf(global_buf, MAX_BUF, "r%x:%02x", reg, val); global_buf[MAX_BUF] = '\0'; display_send_msg( global_buf ); } /** \brief Update an IO register in the display. \param reg The IO register number. \param val The new value of the register. */ void display_io_reg( int reg, byte val ) { if (global_pipe_fd < 0) return; snprintf(global_buf, MAX_BUF, "i%x:%02x", reg, val); global_buf[MAX_BUF] = '\0'; display_send_msg( global_buf ); } /** \brief Specify a name for an IO register. \param reg The IO register number. \param name The symbolic name of the register. Names of IO registers may be different from device to device. */ void display_io_reg_name( int reg, char *name ) { if (global_pipe_fd < 0) return; snprintf(global_buf, MAX_BUF, "I%x:%s", reg, name); global_buf[MAX_BUF] = '\0'; display_send_msg( global_buf ); } /** \brief Update a block of flash addresses in the display. \param addr Address of beginning of the block. \param len Length of the block (number of words). \param vals Pointer to an array of \a len words. The display will update each addr of the block to the coresponding value in the \a vals array. Each address in the flash references a single 16-bit wide word (or opcode or instruction). Therefore, flash addresses are aligned to 16-bit boundaries. It is simplest to consider the flash an array of 16-bit values indexed by the address. */ void display_flash( int addr, int len, word *vals ) { int bytes; int i; if (global_pipe_fd < 0) return; bytes = snprintf( global_buf, MAX_BUF, "f%x,%x:", addr, len ); for ( i=0; i #include #include #include #include "avrerror.h" #include "avrmalloc.h" #include "avrclass.h" #include "utils.h" #include "callback.h" #include "op_names.h" #include "storage.h" #include "flash.h" #include "vdevs.h" #include "memory.h" #include "stack.h" #include "register.h" #include "sram.h" #include "eeprom.h" #include "ports.h" #include "avrcore.h" #include "display.h" #include "decoder.h" #include "sig.h" /** \brief Flag for enabling output of instruction debug messages. */ int global_debug_inst_output = 0; /*************************************************************************** * * BreakPt(AvrClass) Methods * ***************************************************************************/ #ifndef DOXYGEN /* don't expose to doxygen */ typedef struct _BreakPt BreakPt; struct _BreakPt { AvrClass parent; int pc; }; #endif static BreakPt *brk_pt_new( int pc ); static void brk_pt_construct( BreakPt *bp, int pc ); static void brk_pt_destroy( void *bp ); static BreakPt *brk_pt_new( int pc ) { BreakPt *bp; bp = avr_new( BreakPt, 1 ); brk_pt_construct( bp, pc ); class_overload_destroy( (AvrClass *)bp, brk_pt_destroy ); return bp; } static void brk_pt_construct( BreakPt *bp, int pc ) { if (bp == NULL) avr_error( "passed null ptr" ); class_construct( (AvrClass *)bp ); bp->pc = pc; } static void brk_pt_destroy( void *bp ) { BreakPt *_bp = (BreakPt *)bp; if (_bp == NULL) return; class_destroy( bp ); } static DList *brk_pt_list_add ( DList *head, int pc ); static DList *brk_pt_list_delete( DList *head, int pc ); static BreakPt *brk_pt_list_lookup( DList *head, int pc ); static int brk_pt_cmp ( AvrClass *d1, AvrClass *d2 ); /* Compare function for break points. */ static int brk_pt_cmp( AvrClass *d1, AvrClass *d2 ) { return ((BreakPt *)d1)->pc - ((BreakPt *)d2)->pc; } static DList *brk_pt_list_add( DList *head, int pc ) { BreakPt *bp = brk_pt_new( pc ); return dlist_add( head, (AvrClass *)bp, brk_pt_cmp ); } static DList *brk_pt_list_delete( DList *head, int pc ) { BreakPt *bp = brk_pt_new( pc ); head = dlist_delete( head, (AvrClass *)bp, brk_pt_cmp ); class_unref( (AvrClass *)bp ); return head; } static BreakPt *brk_pt_list_lookup( DList *head, int pc ) { BreakPt *found; BreakPt *bp = brk_pt_new( pc ); found = (BreakPt *)dlist_lookup( head, (AvrClass *)bp, brk_pt_cmp ); class_unref( (AvrClass *)bp ); return found; } /*************************************************************************** * * Irq(AvrClass) Methods: For managing the irq_pending list. * ***************************************************************************/ #ifndef DOXYGEN /* don't expose to doxygen */ typedef struct _Irq Irq; struct _Irq { AvrClass parent; IntVect *vector; /* These are only used for storing lookup information. Copies of core->{state,sleep_mode}. */ int state; unsigned int sleep_mode; }; #endif static Irq *irq_new( IntVect *vector, int state, unsigned int sleep_mode ); static void irq_construct( Irq *irq, IntVect *vector, int state, unsigned int sleep_mode ); static void irq_destroy( void *irq ); static Irq *irq_new( IntVect *vector, int state, unsigned int sleep_mode ) { Irq *irq; irq = avr_new( Irq, 1 ); irq_construct( irq, vector, state, sleep_mode ); class_overload_destroy( (AvrClass *)irq, irq_destroy ); return irq; } static void irq_construct( Irq *irq, IntVect *vector, int state, unsigned int sleep_mode ) { if (irq == NULL) avr_error( "passed null ptr" ); class_construct( (AvrClass *)irq ); irq->vector = vector; irq->state = state; irq->sleep_mode = sleep_mode; } static void irq_destroy( void *irq ) { Irq *_irq = (Irq *)irq; if (_irq == NULL) return; class_destroy( irq ); } static DList *irq_list_add ( DList *head, IntVect *vector ); static DList *irq_list_delete ( DList *head, IntVect *vector ); static Irq *irq_list_lookup_addr( DList *head, IntVect *vector ); static int irq_cmp_addr ( AvrClass *d1, AvrClass *d2 ); static int irq_cmp_pending ( AvrClass *d1, AvrClass *d2 ); /* Compare function for break points. */ static int irq_cmp_addr( AvrClass *d1, AvrClass *d2 ) { return ((Irq *)d1)->vector->addr - ((Irq *)d2)->vector->addr; } static DList *irq_list_add( DList *head, IntVect *vector ) { Irq *irq = irq_new( vector, 0, 0 ); return dlist_add( head, (AvrClass *)irq, irq_cmp_addr ); } static DList *irq_list_delete( DList *head, IntVect *vector ) { Irq *irq = irq_new( vector, 0, 0 ); head = dlist_delete( head, (AvrClass *)irq, irq_cmp_addr ); class_unref( (AvrClass *)irq ); return head; } static Irq *irq_list_lookup_addr( DList *head, IntVect *vector ) { Irq *found; Irq *irq = irq_new( vector, 0, 0 ); found = (Irq *)dlist_lookup( head, (AvrClass *)irq, irq_cmp_addr ); class_unref( (AvrClass *)irq ); return found; } static int irq_cmp_pending( AvrClass *d1, AvrClass *d2 ) { Irq *i1 = (Irq *)d1; /* This is the irq which might be ready to be vectored into. */ int state = ((Irq *)d2)->state; /* The state the device is currently in. */ unsigned int sleep_mode = ((Irq *)d2)->sleep_mode; /* This is the sleep mode the device in currently in. Only one bit should be set.*/ if (state == STATE_SLEEP) { /* If device is in the sleep state, the irq will only pending if it can wake up the device. */ if (sleep_mode & i1->vector->can_wake) return 0; /* vector into the irq */ else return -1; /* try the next irq */ } /* If the state is not STATE_SLEEP, any irq we see is automatically pending, so vector it. */ return 0; } /* Walk the list looking for a pending irq which can be handled. If the device is in a sleep state, the can_wake mask could force the head of the list to not be the irq which gets vectored. */ static IntVect *irq_get_pending_vector( DList *head, int state, unsigned int sleep_mode ) { Irq *found; Irq *irq = irq_new( NULL, state, sleep_mode ); found = (Irq *)dlist_lookup( head, (AvrClass *)irq, irq_cmp_pending ); class_unref( (AvrClass *)irq ); return found->vector; } static IntVect *irq_get_head_vector( DList *head ) { return ((Irq *)dlist_get_head_data( head ))->vector; } /*************************************************************************** * * AvrCore(AvrClass) Methods * ***************************************************************************/ /** \brief Allocate a new AvrCore object. */ AvrCore *avr_core_new( int flash_sz, int PC_sz, StackType stack_type, int stack_sz, int vtab_idx ) { AvrCore *core; core = avr_new( AvrCore, 1 ); avr_core_construct( core, flash_sz, PC_sz, stack_type, stack_sz, vtab_idx ); class_overload_destroy( (AvrClass *)core, avr_core_destroy ); return core; } /** \brief Constructor for the AvrCore class. */ void avr_core_construct( AvrCore *core, int flash_sz, int PC_sz, StackType stack_type, int stack_sz, int vtab_idx) { if (core == NULL) avr_error( "passed null ptr" ); class_construct( (AvrClass *)core ); core->state = STATE_STOPPED; core->sleep_mode = 0; /* each bit represents a sleep mode */ core->PC = 0; core->PC_size = PC_sz; core->PC_max = flash_sz / 2; /* flash_sz is in bytes, need number of words here */ core->sreg = sreg_new(); core->flash = flash_new( flash_sz ); core->gpwr = gpwr_new(); core->mem = mem_new(); core->opcode_break_pt = 0xffff; core->breakpoint = NULL; core->irq_pending = NULL; core->irq_vtable = global_vtable_list[ vtab_idx ]; core->irq_offset = 0; core->CK = 0; core->inst_CKS = 0; core->clk_cb = NULL; core->async_cb = NULL; switch (stack_type) { case STACK_HARDWARE: core->stack = (Stack *)hwstack_new( stack_sz ); break; case STACK_MEMORY: core->stack = (Stack *)memstack_new( core->mem ); break; default: avr_error( "Bad stack type.\n" ); } /* Since these are being stored in two places, we need to ref em */ avr_core_attach_vdev( core, (VDevice *)core->sreg ); class_ref( (AvrClass *)core->sreg ); avr_core_attach_vdev( core, (VDevice *)core->gpwr ); class_ref( (AvrClass *)core->gpwr ); /* Initialize the decoder lookup table */ decode_init_lookup_table(); /* Send initial clock cycles to display */ display_clock( 0 ); } /** * \brief Destructor for the AvrCore class. * * Not to be called directly, except by a derived class. * Called via class_unref. */ void avr_core_destroy( void *core ) { AvrCore *_core = (AvrCore *)core; if (_core == NULL) return; class_unref( (AvrClass *)_core->sreg ); class_unref( (AvrClass *)_core->flash ); class_unref( (AvrClass *)_core->gpwr ); class_unref( (AvrClass *)_core->mem ); class_unref( (AvrClass *)_core->stack ); dlist_delete_all( _core->breakpoint ); dlist_delete_all( _core->clk_cb ); dlist_delete_all( _core->async_cb ); dlist_delete_all( _core->irq_pending ); class_destroy( core ); } /** \brief Query the sizes of the 3 memory spaces: flash, sram, and eeprom. */ void avr_core_get_sizes( AvrCore *core, int *flash, int *sram, int *sram_start, int *eeprom ) { VDevice *dev; *flash = flash_get_size( core->flash ); dev = mem_get_vdevice_by_name( core->mem, "SRAM" ); if (dev) { *sram = sram_get_size( (SRAM *)dev ); *sram_start = sram_get_base( (SRAM *)dev ); } else { *sram = 0; *sram_start = 0; } dev = mem_get_vdevice_by_name( core->mem, "EEProm" ); if (dev) *eeprom = eeprom_get_size( (EEProm *)dev ); else *eeprom = 0; } /** \brief Attach a virtual device into the Memory. */ void avr_core_attach_vdev( AvrCore *core, VDevice *dev ) { vdev_set_core( dev, (AvrClass *)core ); mem_attach( core->mem, dev ); } /** \brief FIXME: write me. */ VDevice *avr_core_get_vdev_by_name( AvrCore *core, char *name ) { return mem_get_vdevice_by_name( core->mem, name ); } /** \brief FIXME: write me. */ VDevice *avr_core_get_vdev_by_addr( AvrCore *core, int addr ) { return mem_get_vdevice_by_addr( core->mem, addr ); } /** \brief FIXME: write me. */ void avr_core_set_state( AvrCore *core, StateType state ) { core->state = state; } /** \brief FIXME: write me. */ int avr_core_get_state( AvrCore *core ) { return core->state; } /** \brief FIXME: write me. */ void avr_core_set_sleep_mode( AvrCore *core, int sleep_mode ) { core->state = STATE_SLEEP; core->sleep_mode = ((unsigned int)1 << sleep_mode); } /** \brief FIXME: write me. */ int avr_core_get_sleep_mode( AvrCore *core ) { return core->sleep_mode; } /** * \brief Program Memory Space Access Methods */ word avr_core_flash_read( AvrCore *core, int addr ) { return flash_read( core->flash, addr ); } /** \brief FIXME: write me. */ void avr_core_flash_write( AvrCore *core, int addr, word val ) { flash_write( core->flash, addr, val ); } /** \brief FIXME: write me. */ void avr_core_flash_write_lo8( AvrCore *core, int addr, byte val ) { flash_write_lo8( core->flash, addr, val ); } /** \brief FIXME: write me. */ void avr_core_flash_write_hi8( AvrCore *core, int addr, byte val ) { flash_write_hi8( core->flash, addr, val ); } /** * \brief Data Memory Space Access Methods */ byte avr_core_mem_read( AvrCore *core, int addr ) { return mem_read( core->mem, addr ); } /** \brief FIXME: write me. */ void avr_core_mem_write( AvrCore *core, int addr, byte val ) { mem_write( core->mem, addr, val ); } /** * \brief Status Register Access Methods */ byte avr_core_sreg_get( AvrCore *core ) { return sreg_get( core->sreg ); } /** \brief FIXME: write me. */ void avr_core_sreg_set( AvrCore *core, byte v ) { sreg_set( core->sreg, v ); } /** \brief FIXME: write me. */ int avr_core_sreg_get_bit( AvrCore *core, int b ) { return sreg_get_bit( core->sreg, b ); } /** \brief FIXME: write me. */ void avr_core_sreg_set_bit( AvrCore *core, int b, int v ) { sreg_set_bit( core->sreg, b, v ); } /** * \brief General Purpose Working Register Access Methods */ byte avr_core_gpwr_get ( AvrCore *core, int reg ) { return gpwr_get( core->gpwr, reg ); } /** \brief FIXME: write me. */ void avr_core_gpwr_set ( AvrCore *core, int reg, byte val ) { gpwr_set( core->gpwr, reg, val ); } /** * \brief Direct I/O Register Access Methods * * IO Registers are mapped in memory directly after the 32 (0x20) * general registers. */ void avr_core_io_display_names( AvrCore *core ) { int i; byte val; char name[80]; for ( i=IO_REG_ADDR_BEGIN; imem, i, &val, name, sizeof(name)-1 ); display_io_reg_name( i-IO_REG_ADDR_BEGIN, name ); } } /** \brief FIXME: write me. */ byte avr_core_io_read( AvrCore *core, int reg ) { return avr_core_mem_read( core, reg + IO_REG_ADDR_BEGIN ); } /** \brief FIXME: write me. */ void avr_core_io_write( AvrCore *core, int reg, byte val ) { avr_core_mem_write( core, reg + IO_REG_ADDR_BEGIN, val ); } /** \brief Read an io register into val and put the name of the register into buf. */ void avr_core_io_fetch( AvrCore *core, int reg, byte *val, char *buf, int bufsiz ) { mem_io_fetch( core->mem, reg, val, buf, bufsiz ); } /** \brief Pop 1-4 bytes off of the stack. * * See stack_pop() for more details. */ dword avr_core_stack_pop( AvrCore *core, int bytes ) { return stack_pop( core->stack, bytes ); } /** \brief Push 1-4 bytes onto the stack. * * See stack_push() for more details. */ void avr_core_stack_push( AvrCore *core, int bytes, dword val ) { stack_push( core->stack, bytes, val ); } /* Private Deal with PC reach-arounds. It's possible to set/incrment the program counter with large negative values which go past zero. These should be interpreted as wrapping back around the last address in the flash. */ static void adjust_PC_to_max( AvrCore *core ) { if (core->PC < 0) core->PC = core->PC_max + core->PC; if (core->PC >= core->PC_max) core->PC -= core->PC_max; } /** \brief Returns the size of the Program Counter in bytes. * * Most devices have a 16-bit PC (2 bytes), but some larger ones * (e.g. mega128), have a 22-bit PC (3 bytes). */ dword avr_core_PC_size( AvrCore *core ) { return core->PC_size; } /** \brief Returns the maximum value of the Program Counter. * * This is flash_size / 2. */ dword avr_core_PC_max ( AvrCore *core ) { return core->PC_max; } /** \brief Return the current of the Program Counter. */ dword avr_core_PC_get( AvrCore *core ) { return core->PC; } /** \brief Set the Program Counter to val. * * If val is not in the valid range of PC values, it is adjusted to fall in * the valid range. */ void avr_core_PC_set( AvrCore *core, dword val ) { core->PC = val; adjust_PC_to_max( core ); display_pc( core->PC ); } /** \brief Increment the Program Counter by val. * * val can be either positive or negative. * * If the result of the incrememt is outside the valid range for PC, it is * adjusted to fall in the valid range. This allows addresses to wrap around * the end of the insn space. */ void avr_core_PC_incr( AvrCore *core, int val ) { core->PC += val; adjust_PC_to_max( core ); display_pc( core->PC ); } /** * \brief Methods for accessing CK and instruction Clocks. */ qword avr_core_CK_get ( AvrCore *core ) { return core->CK; } /** \brief FIXME: write me. */ void avr_core_CK_incr( AvrCore *core ) { core->CK++; /* Send clock cycles to display */ display_clock( core->CK ); } /** \brief FIXME: write me. */ int avr_core_inst_CKS_get( AvrCore *core ) { return core->inst_CKS; } /** \brief FIXME: write me. */ void avr_core_inst_CKS_set( AvrCore *core, int val ) { core->inst_CKS = val; } /** * \brief Interrupt Access Methods. */ IntVect *avr_core_irq_get_pending( AvrCore *core ) { return irq_get_pending_vector( core->irq_pending, core->state, core->sleep_mode ); } /** \brief FIXME: write me. */ void avr_core_irq_raise( AvrCore *core, int irq ) { core->irq_pending = irq_list_add( core->irq_pending, &core->irq_vtable[irq] ); } /** \brief FIXME: write me. */ void avr_core_irq_clear( AvrCore *core, IntVect *irq ) { core->irq_pending = irq_list_delete( core->irq_pending, irq ); } /** \brief FIXME: write me. */ void avr_core_irq_clear_all( AvrCore *core ) { dlist_delete_all( core->irq_pending ); core->irq_pending = NULL; } /** * \brief Break point access methods. */ void avr_core_set_breakpoint_opcode( AvrCore *core, word opcode ) { core->opcode_break_pt = opcode; } /** \brief FIXME: write me. */ void avr_core_insert_breakpoint( AvrCore *core, int pc ) { core->breakpoint = brk_pt_list_add( core->breakpoint, pc ); } /** \brief FIXME: write me. */ void avr_core_remove_breakpoint( AvrCore *core, int pc ) { core->breakpoint = brk_pt_list_delete( core->breakpoint, pc ); } /** \brief FIXME: write me. */ int avr_core_is_breakpoint( AvrCore *core, int pc ) { return (int)brk_pt_list_lookup(core->breakpoint, pc); } /* Private Execute an instruction. Presets the number of instruction clocks to zero so that break points and invalid opcodes don't add extraneous clock counts. Also checks for software breakpoints. Any opcode except 0xffff can be a breakpoint. Returns INVALID_OPCODE, BREAK_POINT, or >= 0. */ static int exec_next_instruction( AvrCore *core ) { int result, pc; word opcode; Opcode_FP op_handler; pc = avr_core_PC_get( core ); opcode = flash_read( core->flash, pc ); /* Preset the number of instruction clocks to zero so that break points and invalid opcodes don't add extraneous clock counts. */ avr_core_inst_CKS_set( core, 0 ); /* Any opcode except 0xffff can be a break point. */ if ( (opcode == core->opcode_break_pt) && (opcode != 0xffff) ) return BREAK_POINT; /* Check if a software breakpoint has been hit */ if ( avr_core_is_breakpoint(core, pc) ) return BREAK_POINT; op_handler = decode_opcode( opcode ); if (op_handler == NULL) return INVALID_OPCODE; result = op_handler( core, opcode ); if (global_debug_inst_output) fprintf( stderr, "0x%06x (0x%06x) : 0x%04x : %s\n", pc, pc*2, opcode, global_opcode_name[result] ); return result; } /* * Private * * Checks to see if an interrupt is pending. If any are pending, and * if SREG(I) is set, the following will occur: * - push current PC onto stack * - PC <- interrupt vector * - I flag of SREG is cleared * * Reset vector is not controlled by the SREG(I) flag, thus if reset * interrupt has occurred, the device will be reset irregardless of state * of SREG(I). */ static void avr_core_check_interrupts( AvrCore *core ) { IntVect *irq; if (core->irq_pending) { irq = avr_core_irq_get_pending( core ); if (irq) { if (irq->name == NULL) { avr_error( "Raised and invalid irq for device"); } if (irq->addr == IRQ_RESET) { /* The global interrupt (SREG.I) never blocks a reset. We don't need to clear the irq since a reset clears all pending irq's. */ avr_core_reset( core ); } if (avr_core_sreg_get_bit(core, SREG_I)) { int pc = avr_core_PC_get( core ); int pc_bytes = avr_core_PC_size( core ); avr_core_stack_push( core, pc_bytes, pc ); avr_core_sreg_set_bit( core, SREG_I, 0 ); avr_core_PC_set( core, irq->addr+core->irq_offset ); avr_core_irq_clear( core, irq ); } } } } /** * \brief Process a single program instruction, all side effects and * peripheral stimulii. * * Executes instructions, calls callbacks, and checks for interrupts. */ int avr_core_step( AvrCore *core ) { int res = 0; int state; /* The MCU is stopped when in one of the many sleep modes */ state = avr_core_get_state(core); if (state != STATE_SLEEP) { /* execute an instruction; may change state */ res = exec_next_instruction( core ); } /* Execute the clock callbacks */ while ( core->inst_CKS > 0 ) { /* propagate clocks here */ avr_core_clk_cb_exec( core ); avr_core_CK_incr( core ); core->inst_CKS--; } /* * FIXME: async cb's and interrupt checking might need to be put somewhere else. */ /* Execute the asynchronous callbacks */ avr_core_async_cb_exec( core ); /* check interrupts here */ avr_core_check_interrupts( core ); return res; } /** \brief Start the processing of instructions by the simulator. * * The simulated device will run until one of the following occurs: * - The state of the core is no longer STATE_RUNNING. * - The simulator receives a SIGINT signal. * - A breakpoint is reached (currently causes core to stop running). * - An invalid opcode is encountered. * - A fatal internal error occurs. */ void avr_core_run( AvrCore *core ) { int cnt = 0; int res; avr_core_reset( core ); /* make sure the device is in a sane state. */ core->state = STATE_RUNNING; signal_watch_start(SIGINT); /* FIXME: [TRoth 2002/03/19] This loop isn't going to handle sleep or idle modes properly. */ while ( core->state == STATE_RUNNING ) { if ( signal_has_occurred(SIGINT) ) break; res = avr_core_step(core); switch (res) { case INVALID_OPCODE: break; case BREAK_POINT: /* FIXME: do something here? */ break; default: cnt++; /* might want to store this in core itself */ } } signal_watch_stop(SIGINT); avr_message( "Executed %d instructions.\n", cnt ); avr_message( "Executed %d clock cycles.\n", avr_core_CK_get(core) ); } /** \brief Sets the simulated CPU back to its initial state. * * Zeroes out PC, IRQ's, clock, and memory. */ void avr_core_reset( AvrCore *core ) { avr_core_PC_set( core, 0 ); avr_core_irq_clear_all( core ); core->CK = 0; avr_core_inst_CKS_set( core, 0 ); /* Send clock cycles to display */ /* Normaly the clockcycles must not be reset here! */ /* This leads to an error in the vcd file */ display_clock( core->CK ); mem_reset( core->mem ); } /** * \brief For adding external read and write callback functions. * * rd and wr should come in pairs, but it is safe to add * empty function via passing a NULL pointer for either function. * * \param core A pointer to an AvrCore object. * * \param port_id The ID for handling the simulavr inheritance model. * * \param ext_rd Function for the device core to call when it needs to * communicate with the external world via I/O Ports. * * \param ext_wr Function for the device core to call when it needs to * communicate with the external world via I/O Ports. * */ void avr_core_add_ext_rd_wr( AvrCore *core, int port_id, PortFP_ExtRd ext_rd, PortFP_ExtWr ext_wr ) { Port *p = (Port *)mem_get_vdevice_by_name( core->mem, name_PORT[port_id] ); if (p == NULL) { avr_warning( "Device does not have %s.\n", name_PORT[port_id] ); return; } port_add_ext_rd_wr( p, ext_rd, ext_wr ); } /** * \brief Add a new clock callback to list. */ void avr_core_clk_cb_add( AvrCore *core, CallBack *new ) { core->clk_cb = callback_list_add( core->clk_cb, new ); } /** * \brief Add a new asynchronous callback to list. */ void avr_core_async_cb_add( AvrCore *core, CallBack *new ) { core->async_cb = callback_list_add( core->async_cb, new ); } /** \brief Run all the callbacks in the list. If a callback returns non-zero (true), then it is done with it's job and wishes to be removed from the list. The time argument has dual meaning. If the callback list is for the clock callbacks, time is the value of the CK clock counter. If the callback list is for the asynchronous callback, time is the number of milliseconds from some unknown, arbitrary time on the host system. */ void avr_core_clk_cb_exec( AvrCore *core ) { core->clk_cb = callback_list_execute_all( core->clk_cb, avr_core_CK_get(core) ); } /** * \brief Run all the asynchronous callbacks. */ void avr_core_async_cb_exec( AvrCore *core ) { core->async_cb = callback_list_execute_all( core->async_cb, get_program_time() ); } /** * \brief Dump the contents of the entire CPU core. * * \param core A pointer to an AvrCore object. * \param An open file descriptor. */ void avr_core_dump_core( AvrCore *core, FILE *f_core ) { unsigned int pc = avr_core_PC_get(core); fprintf( f_core, "PC = 0x%06x (PC*2 = 0x%06x)\n\n", pc, pc*2 ); mem_dump_core( core->mem, f_core ); flash_dump_core( core->flash, f_core ); } /** * \brief Load a program from an input file. */ int avr_core_load_program( AvrCore *core, char *file, int format ) { return flash_load_from_file( core->flash, file, format ); } #if 0 /* * Load a program from an input file. */ int avr_core_load_eeprom( AvrCore *core, char *file, int format ) { return eeprom_load_from_file( core, file, format ); } #endif --------------DDA84D47774BAA3BFA7F09FD-- From troth@openavr.org Thu Oct 24 23:33:59 2002 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 184vEU-0004D0-00 for simulavr-devel@mail.freesoftware.fsf.org; Thu, 24 Oct 2002 23:33:58 -0400 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 184vES-00047f-00 for simulavr-devel@mail.freesoftware.fsf.org; Thu, 24 Oct 2002 23:33:58 -0400 Received: from sense-smead-139.oz.net ([216.39.162.139] helo=thevenin.amplepower.com) by monty-python.gnu.org with esmtp (Exim 4.10) id 184vES-00044a-00 for simulavr-devel@mail.freesoftware.fsf.org; Thu, 24 Oct 2002 23:33:56 -0400 Received: from [192.168.8.29] (helo=bozoland.mynet) by thevenin.amplepower.com with esmtp (Exim 3.35 #1 (Debian)) id 184vBN-0002Sv-00; Thu, 24 Oct 2002 20:30:45 -0700 From: "Thedore A. Roth" X-X-Sender: troth@bozoland.mynet To: Carsten Beth cc: simulavr-devel@mail.freesoftware.fsf.org Subject: Re: [Simulavr-devel] vcd file dumper for simulavr In-Reply-To: <3DB6F328.ADF97A02@Informatik.Uni-Oldenburg.DE> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII Content-ID: Sender: simulavr-devel-admin@nongnu.org Errors-To: simulavr-devel-admin@nongnu.org X-BeenThere: simulavr-devel@nongnu.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Discussion of simulavr development. List-Unsubscribe: , List-Archive: Date: Thu Oct 24 23:34:18 2002 X-Original-Date: Thu, 24 Oct 2002 20:31:40 -0700 (PDT) Thanks Carsten. I havn't had time to give this a good review yet, but it sounds interesting. I'll try to get to it over the weekend. If you don't hear back from me by middle of next week, pester me to get this merged in. Ted Roth (busy in gdb land for now) On Wed, 23 Oct 2002, Carsten Beth wrote: :)Hello everybody! :) :)I have written a display program which writes simulavr output to a value :) :)change dump (vcd) file. vcd files are defined in the language reference :)manual of the hardware description language verilog. They are mainly :)used to :)store signal traces and processing them in additional application, e.g. :)waveform viewer. :) :)In the attachment there is the tar file disp-vcd.tgz. For installation :)you :)have to save it in your simulavr build directory and untar it. Then :)change to :)the disp-vcd directory and call make. Make sure the executable :)simulavr-vcd :)is in your PATH. :) :)Unfortunately simulavr-vcd needs time-information from simulavr, which :)normally isn't transfer. So you have to patch simulavr and recompile it. :)I am :)not familiar with the patch mechanism, so I send the files, which has to :)be :)changed, in the attachment. Sorry for that procedure. They work with :)simulavr :)release 0.1.1. :) :)Before starting a simulation you have to create a configuration file :)vcd.cfg :)(or copy/modify the example file). In that file you have to define the :)signals which shall be traced. Traceable signals are at the moment :)registers, :)io-registers, sram content, the program counter and the stack pointer. :)See :)the example vcd.cfg for syntax. :) :)To start simulavr with the simulavr-vcd as a co-process you have to :)execute :)e.g.: simulavr -d at90s2313 --gdbserver --disp-prog=simulavr-vcd :) :)While simulation the vcd file is written. You can use (hopefully) any :)waveform viewer which can handle vcd files. At the moment I have just :)test it :)with the free viewer GTKWave. :) :)Please try the tool, I think it's a good aid for debugging your :)software. :) :)Carsten :) :)