From cc931b1d4364dd7a3e8c290fd79331585857e834 Mon Sep 17 00:00:00 2001 From: Pablo2048 Date: Wed, 1 Aug 2018 16:51:35 +0200 Subject: [PATCH] Nejnovejsi zdrojaky. Nutno zkusit ve WinAVR --- ActualOptiboot/README.md | 54 + ActualOptiboot/docs/arduino-gcc-versions.md | 42 + ActualOptiboot/docs/optiboot.png | Bin 0 -> 43218 bytes .../optiboot/AtmelStudio/xplained168pb.atsln | 20 + .../optiboot/AtmelStudio/xplained168pb.atsuo | Bin 0 -> 12800 bytes .../optiboot/AtmelStudio/xplained168pb.cproj | 168 + .../optiboot/AtmelStudio/xplained328p.atsln | 20 + .../optiboot/AtmelStudio/xplained328p.atsuo | Bin 0 -> 12288 bytes .../optiboot/AtmelStudio/xplained328p.cproj | 179 + .../optiboot/AtmelStudio/xplained328pb.atsln | 20 + .../optiboot/AtmelStudio/xplained328pb.atsuo | Bin 0 -> 10752 bytes .../optiboot/AtmelStudio/xplained328pb.cproj | 179 + ActualOptiboot/optiboot/boards-1.6.txt | 461 ++ ActualOptiboot/optiboot/boards.txt | 351 ++ .../optiboot/bootloaders/optiboot/Makefile | 616 +++ .../bootloaders/optiboot/Makefile.1284 | 146 + .../bootloaders/optiboot/Makefile.2560 | 56 + .../bootloaders/optiboot/Makefile.atmel | 37 + .../bootloaders/optiboot/Makefile.custom | 16 + .../bootloaders/optiboot/Makefile.extras | 135 + .../bootloaders/optiboot/Makefile.isp | 90 + .../optiboot/bootloaders/optiboot/README.TXT | 99 + .../optiboot/bootloaders/optiboot/baudcheck.c | 56 + .../optiboot/bootloaders/optiboot/boot_opt.h | 99 + .../bootloaders/optiboot/make-ccversions | 34 + .../optiboot/bootloaders/optiboot/makeall | 32 + .../optiboot/bootloaders/optiboot/makeoptions | 37 + .../optiboot/bootloaders/optiboot/omake | 9 + .../optiboot/bootloaders/optiboot/omake.bat | 221 + .../optiboot/bootloaders/optiboot/optiboot.c | 1060 +++++ .../optiboot/optiboot_atmega1280.hex | 44 + .../optiboot/optiboot_atmega1280.lst | 726 ++++ .../optiboot/optiboot_atmega328.hex | 31 + .../optiboot/optiboot_atmega328.lst | 584 +++ .../optiboot/optiboot_atmega644p.hex | 40 + .../optiboot/optiboot_atmega644p.lst | 683 +++ .../optiboot/optiboot_diecimila.lst | 584 +++ .../bootloaders/optiboot/optiboot_lilypad.hex | 31 + .../bootloaders/optiboot/optiboot_lilypad.lst | 584 +++ .../bootloaders/optiboot/optiboot_luminet.hex | 38 + .../bootloaders/optiboot/optiboot_luminet.lst | 634 +++ .../optiboot/bootloaders/optiboot/pin_defs.h | 891 ++++ .../optiboot/bootloaders/optiboot/stk500.h | 49 + .../examples/chaucer112k/chaucer112k.ino | 2355 ++++++++++ .../examples/chaucer16k/chaucer16k.ino | 306 ++ .../examples/chaucer256k/chaucer256k.ino | 3778 +++++++++++++++++ .../examples/chaucer32k/chaucer32k.ino | 679 +++ .../examples/chaucer64k/chaucer64k.ino | 1335 ++++++ .../optiboot/examples/eeprom_data.c | 26 + .../optiboot/examples/hex-with-FFs.hex | 173 + .../examples/test_eeprom/test_eeprom.ino | 107 + .../examples/test_reset/test_reset.ino | 137 + ...ot_optiboot-additional_index.json.TEMPLATE | 56 + ActualOptiboot/optiboot/release.sh | 75 + ActualOptiboot/scripts/travis-build.sh | 113 + 55 files changed, 18296 insertions(+) create mode 100644 ActualOptiboot/README.md create mode 100644 ActualOptiboot/docs/arduino-gcc-versions.md create mode 100644 ActualOptiboot/docs/optiboot.png create mode 100644 ActualOptiboot/optiboot/AtmelStudio/xplained168pb.atsln create mode 100644 ActualOptiboot/optiboot/AtmelStudio/xplained168pb.atsuo create mode 100644 ActualOptiboot/optiboot/AtmelStudio/xplained168pb.cproj create mode 100644 ActualOptiboot/optiboot/AtmelStudio/xplained328p.atsln create mode 100644 ActualOptiboot/optiboot/AtmelStudio/xplained328p.atsuo create mode 100644 ActualOptiboot/optiboot/AtmelStudio/xplained328p.cproj create mode 100644 ActualOptiboot/optiboot/AtmelStudio/xplained328pb.atsln create mode 100644 ActualOptiboot/optiboot/AtmelStudio/xplained328pb.atsuo create mode 100644 ActualOptiboot/optiboot/AtmelStudio/xplained328pb.cproj create mode 100644 ActualOptiboot/optiboot/boards-1.6.txt create mode 100644 ActualOptiboot/optiboot/boards.txt create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/Makefile create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.1284 create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.2560 create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.atmel create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.custom create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.extras create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.isp create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/README.TXT create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/baudcheck.c create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/boot_opt.h create mode 100755 ActualOptiboot/optiboot/bootloaders/optiboot/make-ccversions create mode 100755 ActualOptiboot/optiboot/bootloaders/optiboot/makeall create mode 100755 ActualOptiboot/optiboot/bootloaders/optiboot/makeoptions create mode 100755 ActualOptiboot/optiboot/bootloaders/optiboot/omake create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/omake.bat create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/optiboot.c create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega1280.hex create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega1280.lst create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega328.hex create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega328.lst create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega644p.hex create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega644p.lst create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_diecimila.lst create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_lilypad.hex create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_lilypad.lst create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_luminet.hex create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_luminet.lst create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/pin_defs.h create mode 100644 ActualOptiboot/optiboot/bootloaders/optiboot/stk500.h create mode 100644 ActualOptiboot/optiboot/examples/chaucer112k/chaucer112k.ino create mode 100644 ActualOptiboot/optiboot/examples/chaucer16k/chaucer16k.ino create mode 100644 ActualOptiboot/optiboot/examples/chaucer256k/chaucer256k.ino create mode 100644 ActualOptiboot/optiboot/examples/chaucer32k/chaucer32k.ino create mode 100644 ActualOptiboot/optiboot/examples/chaucer64k/chaucer64k.ino create mode 100644 ActualOptiboot/optiboot/examples/eeprom_data.c create mode 100644 ActualOptiboot/optiboot/examples/hex-with-FFs.hex create mode 100644 ActualOptiboot/optiboot/examples/test_eeprom/test_eeprom.ino create mode 100644 ActualOptiboot/optiboot/examples/test_reset/test_reset.ino create mode 100644 ActualOptiboot/optiboot/package_optiboot_optiboot-additional_index.json.TEMPLATE create mode 100644 ActualOptiboot/optiboot/release.sh create mode 100755 ActualOptiboot/scripts/travis-build.sh diff --git a/ActualOptiboot/README.md b/ActualOptiboot/README.md new file mode 100644 index 0000000..3ef7aa9 --- /dev/null +++ b/ActualOptiboot/README.md @@ -0,0 +1,54 @@ +## Optiboot Bootloader for Arduino and Atmel AVR ## + +![docs/optiboot.png](docs/optiboot.png) + +Optiboot is an easy to install upgrade to the Arduino bootloader within Arduino boards. It provides the following features: + + * Allows larger sketches. Optiboot is a quarter of the size of the default bootloader, freeing 1.5k of extra space. + * Makes your sketches upload faster. Optiboot operates at higher baud rates and has streamlined programming. + * Adaboot performance improvements. Optiboot runs your sketches sooner, with no watchdog issues. + * Compatible with 168 and 328 Arduinos including Lilypad, Pro, Nano + * Believed to work with ATmega1280 ("Mega"), ATmega644 ("Sanguino"), and ATmega1284 ("Mighty") + * Supports several additional AVR chips (ATmega88, ATmega32) + +Optiboot is now installed by default on the Arduino Uno. It can be installed on all older mega8, 168 or 328 based Arduinos. + +## Additional Documentation +More detailed documentation is being added (slowly) to the [repository wiki](https://github.com/Optiboot/optiboot/wiki). + +## Notes on IDE Version compatability +Optiboot is "compatible", in a loose sense, with all versions of the Arduino IDE. It was originally written at about the same time as v1.0, and has some "quirks" that date back to that timeframe. Most significantly, install procedures and locations change between releases, and the ability to compile Optiboot using only the tools installed with the IDE broke in the v1.5 timeframe. + +## To install into the Arduino software ## +You do NOT need to "install" Optiboot if you are trying to update an installed platform that already uses some form of Optiboot. In that case, you should probably just find and replace the existing .hex files from the platform support directories. Using the Optiboot "install" procedure does not install any cores or variants, so it is only useful for CPUs that are already supported by the standard Arduino core (or, if all you want to do is install bootloaders.) + +The following instructions are based on using the Arduino "Board Manager", present in IDE versions 1.6.5 and later. + + 1. Find the desired Optiboot release on the [Optiboot Release page] (https://github.com/Optiboot/optiboot/releases). + 2. Use the "Copy link address" feature of your browser to copy the URL of the associated **.json** file. + 3. Paste this url into the "Additional Boards Manager URLs" field in the Arduino IDE "Preferences" pane. (Separate it from other URLs that might be present with a comma or click the icon to the right of the field to insert it on a new line.) + 4. After closing the Preferences window, the **Tools/Boards/Boards Manager** menu should include an entry for that version of Optiboot. Select that entry and click the **Install** button. + +For additional installation information, see the [Optiboot AddingOptibootChipsToIde Wiki page] (https://github.com/Optiboot/optiboot/wiki/AddingOptibootChipsToIde) + + + + +## To burn Optiboot onto an Arduino board ## + 1. Select the appropriate Optiboot board type (or non-Optiboot if you want to change back) + 1. Connect your Arduino to an ISP programmer [[Installing]] + 1. Use the 'Burn Bootloader' item in Arduino. + 1. You can then upload sketches as normal, using the Optiboot board type. + +---- + +> Although it has evolved considerably, Optiboot builds on the original work of Jason P. Kyle (stk500boot.c), [Arduino group (bootloader)](http://arduino.cc), [Spiff (1K bootloader)](http://spiffie.org/know/arduino_1k_bootloader/bootloader.shtml), [AVR-Libc group](http://nongnu.org/avr-libc) and [Ladyada (Adaboot)](http://www.ladyada.net/library/arduino/bootloader.html). + +> _Optiboot is the work of Peter Knight (aka Cathedrow). Despite some misattributions, it is not sponsored or supported by any organisation or company including Tinker London, Tinker.it! and Arduino._ +> Maintenance of optiboot was taken over by Bill Westfield (aka WestfW) in 2011. diff --git a/ActualOptiboot/docs/arduino-gcc-versions.md b/ActualOptiboot/docs/arduino-gcc-versions.md new file mode 100644 index 0000000..2ba6ca7 --- /dev/null +++ b/ActualOptiboot/docs/arduino-gcc-versions.md @@ -0,0 +1,42 @@ +Arduino ships also avr-gcc. This is matrix of versions and changes +based on Linux versions. + + +| Arduino | avr-gcc | differences | test? | +|---------|---------|-------------|-------| +|<=1.0 |none? | | | +|1.0.1 |4.3.2 |new| | +|1.0.2 |4.3.2 |same as 1.0.1| | +|1.0.3 |4.3.2 |same as 1.0.1| | +|1.0.4 |4.3.2 |same as 1.0.1| | +|1.0.5 |4.3.2 |same as 1.0.1| | +|1.0.6 |4.3.2 |same as 1.0.1| yes | +|1.5 |4.3.2 |same as 1.0.1| | +|1.5.1 |4.3.2 |same as 1.0.1| | +|1.5.2 |4.3.2 |same as 1.0.1| | +|1.5.3 |4.3.2 |same as 1.0.1| | +|1.5.4 |4.3.2 |same as 1.0.1| | +|1.5.5 |4.3.2 |same as 1.0.1| | +|1.5.6-r2 |4.3.2 |same as 1.0.1| | +|1.5.7 |4.8.1 |toolchains upgrade, avrdude 6.0.1avrdude| | +|1.5.8 |4.8.1 |same as 1.5.7| | +|1.6.0 |4.8.1 |same as 1.5.7| | +|1.6.1 |4.8.1 |toolchains upgrade, added ATmega48/88/168PB, ATA5702M322, ATA5782; added RAMSTART to io*.h| | +|1.6.2 |packed | | | +|1.6.3 |4.8.1 |toolchains upgrade, cleaned| | +|1.6.4 |4.8.1 |almost the same as 1.6.1| | +|1.6.5-r5 |4.8.1 |same as 1.6.4| | +|1.6.6 |4.8.1 |same as 1.6.4| | +|1.6.7 |4.8.1 |same as 1.6.4| | +|1.6.8 |4.8.1 |same as 1.6.4| | +|1.6.9 |4.8.1 |same as 1.6.4| yes | +|1.6.10 |4.9.2 |toolchains upgrade, , avrdude 6.3 | | +|1.6.11 |4.9.2 |same as 1.6.10, back to avrdude 6.0.1| | +|1.6.12 |4.9.2 |same as 1.6.10, patched avrdude 6.3| | +|1.6.13 |4.9.2 |same as 1.6.12| yes | +|1.8.0 |4.9.2 |same as 1.6.12, another patch for avrdude 6.3 | | +|1.8.1 |4.9.2 |same as 1.8.0| | +|1.8.2 |4.9.2 |recompiled, new toolchains, lot of changes| | +|1.8.3 |4.9.2 |same as 1.8.2| | +|1.8.4 |4.9.2 |same as 1.8.2| | +|1.8.5 |4.9.2 |same as 1.8.2| yes | diff --git a/ActualOptiboot/docs/optiboot.png b/ActualOptiboot/docs/optiboot.png new file mode 100644 index 0000000000000000000000000000000000000000..e91daa0b31598b4cc62a84307b395b4942a04ac0 GIT binary patch literal 43218 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 WqYpbVP&)ho0000R^CLZsY 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 U|DIe=B9)CUZ5G*|ZH$Hf8wMj4xBvhE literal 0 HcmV?d00001 diff --git a/ActualOptiboot/optiboot/AtmelStudio/xplained168pb.cproj b/ActualOptiboot/optiboot/AtmelStudio/xplained168pb.cproj new file mode 100644 index 0000000..d8968bc --- /dev/null +++ b/ActualOptiboot/optiboot/AtmelStudio/xplained168pb.cproj @@ -0,0 +1,168 @@ + + + + 2.0 + 6.2 + com.Atmel.AVRGCC8.C + {02f0bc88-77bd-42cc-a94c-4cc452f0f909} + ATmega168PB + none + Executable + C + $(MSBuildProjectName) + .elf + $(MSBuildProjectDirectory)\$(Configuration) + optitest + xplained168pb + optitest + Native + true + false + true + true + 0x20000000 + + true + exception_table + 2 + 0 + + + + + + + + + + + + + com.atmel.avrdbg.tool.medbg + + + + + ISP + + com.atmel.avrdbg.tool.medbg + ATML2222050200008424 + mEDBG + + + + + + + + True + True + True + True + False + True + True + + + NDEBUG + + + Optimize for size (-Os) + True + True + True + + + True + xplained168pb + clean + ..\bootloaders\optiboot\makefile + copy optiboot_xplained168pb.* ..\..\AtmelStudio + + ..\bootloaders\optiboot + + + + + True + True + True + True + False + True + True + + + DEBUG + + + Optimize (-O1) + True + True + Default (-g2) + True + Default (-Wa,-g) + + + True + xplained168pb + clean + ..\bootloaders\optiboot\makefile + optiboot_xplained168pb + .hex + copy optiboot_xplained168pb.* ..\..\AtmelStudio + + ..\bootloaders\optiboot + + + + compile + Makefile + + + compile + Makefile.1284 + + + compile + Makefile.atmel + + + compile + Makefile.custom + + + compile + Makefile.extras + + + compile + Makefile.isp + + + compile + + + compile + + + + + compile + baudcheck.c + + + compile + optiboot.c + + + compile + pin_defs.h + + + compile + stk500.h + + + + \ No newline at end of file diff --git a/ActualOptiboot/optiboot/AtmelStudio/xplained328p.atsln b/ActualOptiboot/optiboot/AtmelStudio/xplained328p.atsln new file mode 100644 index 0000000..86449e7 --- /dev/null +++ b/ActualOptiboot/optiboot/AtmelStudio/xplained328p.atsln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Atmel Studio Solution File, Format Version 11.00 +Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "xplained328p", "xplained328p.cproj", "{02F0BC88-77BD-42CC-A94C-4CC452F0F909}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|AVR = Debug|AVR + Release|AVR = Release|AVR + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Debug|AVR.ActiveCfg = Debug|AVR + {02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Debug|AVR.Build.0 = Debug|AVR + {02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Release|AVR.ActiveCfg = Release|AVR + {02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Release|AVR.Build.0 = Release|AVR + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/ActualOptiboot/optiboot/AtmelStudio/xplained328p.atsuo b/ActualOptiboot/optiboot/AtmelStudio/xplained328p.atsuo new file mode 100644 index 0000000000000000000000000000000000000000..f77e2ca9babe8c088a5cbac644d707c4c48f8e6a GIT binary patch literal 12288 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 q?;W`J()Ewty-6P%rW4Gy(MZhKV# literal 0 HcmV?d00001 diff --git a/ActualOptiboot/optiboot/AtmelStudio/xplained328p.cproj b/ActualOptiboot/optiboot/AtmelStudio/xplained328p.cproj new file mode 100644 index 0000000..eb99088 --- /dev/null +++ b/ActualOptiboot/optiboot/AtmelStudio/xplained328p.cproj @@ -0,0 +1,179 @@ + + + + 2.0 + 6.2 + com.Atmel.AVRGCC8.C + {02f0bc88-77bd-42cc-a94c-4cc452f0f909} + ATmega328P + none + Executable + C + $(MSBuildProjectName) + .elf + $(MSBuildProjectDirectory)\$(Configuration) + optitest + optitest + optitest + Native + true + false + true + true + 0x20000000 + + true + exception_table + 2 + 0 + + + + + + + + + + + + + + + + + + + ISP + + com.atmel.avrdbg.tool.medbg + ATML2222050200008424 + mEDBG + + ISP + + + + + True + True + True + True + False + True + True + + + NDEBUG + + + Optimize for size (-Os) + True + True + True + + + libm + + + + + True + ..\bootloaders\optiboot + xplained328p + clean + ..\bootloaders\optiboot\Makefile + copy optiboot_xplained328p.* ..\..\AtmelStudio + + + + + + True + True + True + True + False + True + True + + + DEBUG + + + Optimize (-O1) + True + True + Default (-g2) + True + + + libm + + + Default (-Wa,-g) + + + True + xplained328p + clean + ..\bootloaders\optiboot\Makefile + optiboot_xplained328p + .hex + ..\bootloaders\optiboot + copy optiboot_xplained328p.* ..\..\AtmelStudio + + + + + + + + compile + Makefile + + + compile + Makefile.1284 + + + compile + Makefile.atmel + + + compile + Makefile.custom + + + compile + Makefile.extras + + + compile + Makefile.isp + + + + + compile + baudcheck.c + + + compile + boot.h + + + compile + optiboot.c + + + compile + pin_defs.h + + + compile + stk500.h + + + + \ No newline at end of file diff --git a/ActualOptiboot/optiboot/AtmelStudio/xplained328pb.atsln b/ActualOptiboot/optiboot/AtmelStudio/xplained328pb.atsln new file mode 100644 index 0000000..f19eaa4 --- /dev/null +++ b/ActualOptiboot/optiboot/AtmelStudio/xplained328pb.atsln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Atmel Studio Solution File, Format Version 11.00 +Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "xplained328pb", "xplained328pb.cproj", "{02F0BC88-77BD-42CC-A94C-4CC452F0F909}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|AVR = Debug|AVR + Release|AVR = Release|AVR + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Debug|AVR.ActiveCfg = Release|AVR + {02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Debug|AVR.Build.0 = Release|AVR + {02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Release|AVR.ActiveCfg = Release|AVR + {02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Release|AVR.Build.0 = Release|AVR + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/ActualOptiboot/optiboot/AtmelStudio/xplained328pb.atsuo b/ActualOptiboot/optiboot/AtmelStudio/xplained328pb.atsuo new file mode 100644 index 0000000000000000000000000000000000000000..3ef452ba9e6440fcfbd64d30fccf786131872b60 GIT binary patch literal 10752 zcmeHM-ESOM6~F7)i4zK>e1uX;SV~Hh#-Y=g0r)Z<=;*|LK@mX;?Ql3DbEa|)ueaP_n4mv*2^!r@)^9e-`{X@aMspe(?qH(_qg37lZT@ zH1toq3JpvP7nd)RVqDaa*2N}fGCo}p13NxXo9ISU?+*Qb>V>~1PNC8b8VqO(5?%2? z+=TQ+;(VLQxPrtnYjw_$IO}{14ccaX<=>NolCU%wi`9SKc;{CmFMnVre~2L-h#u)&B@RzN`0b;<->v_t^s~vyKTJRR z_gVVJi4p~JHbcQr(L2mBf5mcAGk&9LyQvwgzGj=2m%3T=t@@&Y>`-#fs(ZFu8_lOO zDK(`ICH02mH|o}C&1(2{!x>6WH7bs6zHV*Ky31B=w3^9h)9FkxU(9FordjN##9t<6 zHa*{3N$IZRSf-B_z0|8#&8pjGYSQ-n@1^hE>)e^L;Txs8Wh}3{cFot_+M>NQlc= z^um^FQL{$(`$fnnz7VtG%BSqV1oJ%$S*t){qAih^Yk&pmamLP`Q9k7oFXPJRS}{O{ zfr$7O(E#Ev$v)hb`Y^@YcdIJld z{e5e2VXf&7Q0-7>6YONJ_wG{*gM(+;U`S`=L+FnEFU4<;jd7hi5K#~n7YdaA|JIyW zwknOKsk-G^HQ%6LP8sI1v1ILfej08c&-E+n@M3PUu$WF)bE+|HoRPvpiT#aRwpn*Q zchOJH*J&B_GB&e5>Z!72C1> z&D0bp1@KZct*ZnR;tIc;@!h)B)Yg+2{s4v6j&IPBVTMBv6tat|6xmM|Nyn20cRsYb z1KUi*z`{w46dfqb?^nUP7!mV3(Wi%e1!&~pT1UPNOf-QKD-xT0Aj3RLR)JNvL~Ta! zol3?~&Tkx`x{vRxsPCfYF16!NCmimELzjVni~#6Dq}`VH&oNfr3SPI%XZ%m>ZH~NkXj z82t+DaMwPg`DBZ=CQ&zq7=K=@VKxd#88J9$cM;D*>gOb+ni!4WQ9T@cI~}F0y{&G~ zN5!9Z`@4l%T7lK^9N=!?3obBdKQA1D{nMAY4~%PnUq{{9U{LMyJL6BZC&7n7l7)Pp zNAX-LuKaJHZs`BS8%BI}c)bBz+O^cyow*L3@O*@^A@Mh)kt6zFJF-VdIt7`GNs03N zA)y-J4>2w7_>-us2abPEj3ReR{3cNzQE@#~GZSh_*EFS2D3z6LM%R_GVpdnOx}MG9 z-9%9>Zf|X@I)+`ds>2y=wURPd>+XXsePsTQhlpby(TB4>Uv|yL3W6tZ-d*+WitGBj z85z?xqnw?>h1NFTwl=o59%`jwErUzRXVi?6PM6b)rWI601x;v$T%lObY}dlBvlJxX zw%wXmB9R;MR*^)L^(lW|eu8>i(6XO#~F{h6!xlAUL&1OsaQa-!A z^|vRcs#Xm(wZ8SRlqsm1TF{lUrstJxalE8x8**|%3P-s2waF5YfIKXZE`%P9VYXQAO99i7=j zDc}#Ggy({B@h2L8FwSx?{~^XTadr`iwQaQ&g&kUH0DEqw`(Zv_kV zZNyj)V1bNP+A)3(meq@R{=t0&_tfk|uljs{4IIV?I!4bEXb*E?V|7{I(~Isc^8A@{ zxu1_KKdS#}c)%h&hkE9zLkaz5ZfiKSEn4x%=7xzHrvL)3BiJVW5(RvI^$HL>i)A zh{fFofI8>e&rtWP->F`RV~m5?D@J~dhMH){c&9tT{si|kJl~INf5h>9@Gpf?i|k=Pra2==0*%BSa< zIQ1m{aL38L=VYLdZnzuv>oEJj0zT%yjN>5U*!xHDpG!a-{()S^u7fN8GIX8<9;mp| z@CV+z(VHI<7oHr^N6Bv-d-TgOoxWCUI1c|;?MGo~eb|V))!$|@0}af8zwfW%xD`&k>7bo z-6zT?v;8|Ne0A=AR5{E)BNAb}-S(<{!e<9<;*b8w6XJuO{ + + + 2.0 + 6.2 + com.Atmel.AVRGCC8.C + {02f0bc88-77bd-42cc-a94c-4cc452f0f909} + ATmega328PB + none + Executable + C + $(MSBuildProjectName) + .elf + $(MSBuildProjectDirectory)\$(Configuration) + optitest + optitest + optitest + Native + true + false + true + true + 0x20000000 + + true + exception_table + 2 + 0 + + + + + + + + + + + + + com.atmel.avrdbg.tool.medbg + + + + + ISP + + com.atmel.avrdbg.tool.medbg + ATML2222050200008424 + mEDBG + + ISP + + + + + True + True + True + True + False + True + True + + + NDEBUG + + + Optimize for size (-Os) + True + True + True + + + libm + + + + + True + ..\bootloaders\optiboot + xplained328pb + clean + ..\bootloaders\optiboot\Makefile + copy optiboot_xplained328pb.* ..\..\AtmelStudio + + + + + True + True + True + True + False + True + True + + + DEBUG + + + Optimize (-O1) + True + True + Default (-g2) + True + + + libm + + + Default (-Wa,-g) + + + True + xplained328pb + clean + ..\bootloaders\optiboot\Makefile + optiboot_xplained328pb + .hex + ..\bootloaders\optiboot + copy optiboot_xplained328pb.* ..\..\AtmelStudio + + + + compile + Makefile + + + compile + Makefile.1284 + + + compile + Makefile.atmel + + + compile + Makefile.custom + + + compile + Makefile.extras + + + compile + Makefile.isp + + + compile + + + compile + + + + + compile + baudcheck.c + + + compile + boot.h + + + compile + optiboot.c + + + compile + pin_defs.h + + + compile + stk500.h + + + + \ No newline at end of file diff --git a/ActualOptiboot/optiboot/boards-1.6.txt b/ActualOptiboot/optiboot/boards-1.6.txt new file mode 100644 index 0000000..cd9b293 --- /dev/null +++ b/ActualOptiboot/optiboot/boards-1.6.txt @@ -0,0 +1,461 @@ +# +# Boards.txt file for Optiboot platforms, in format for Arduino 1.5.x and later. +# +# See: http://github.com/Arduino/arduino/ + +name=[Optiboot] +version=6.2 + +############################################################## +## Optiboot on 28-pin processors (atmega8/88/168/328/etc) + +menu.cpu=Processor +menu.mhz=CPU Speed + +optiboot28.name=Optiboot on 28-pin cpus + +optiboot28.upload.tool=arduino:avrdude +optiboot28.upload.protocol=arduino +optiboot28.upload.speed=115200 + +optiboot28.bootloader.tool=arduino:avrdude +optiboot28.bootloader.low_fuses=0xF7 +optiboot28.bootloader.unlock_bits=0x3F +optiboot28.bootloader.lock_bits=0x2F +optiboot28.build.f_cpu=16000000L + + +# +# Other Clock speeds. +# For 8MHz using the internal RC Oscillator, we adjust fuses, use the same +# bootloader binary, and halve the upload rate. +# +optiboot28.menu.mhz.16MHz=16MHz +optiboot28.menu.mhz.16MHz.upload.speed=115200 +optiboot28.menu.mhz.8MHz=8MHz (int) +optiboot28.menu.mhz.8MHz.build.f_cpu=8000000L +optiboot28.menu.mhz.8MHz.bootloader.low_fuses=0xE2 +optiboot28.menu.mhz.8MHz.upload.speed=57600 +optiboot28.menu.mhz.1MHz=1MHz (int) +optiboot28.menu.mhz.1MHz.build.f_cpu=1000000L +optiboot28.menu.mhz.1MHz.bootloader.low_fuses=0x62 +optiboot28.menu.mhz.1MHz.upload.speed=9600 + +# optiboot platforms should be UNO-like more than anything else. +optiboot28.build.board=AVR_UNO +optiboot28.build.core=arduino:arduino +optiboot28.build.variant=arduino:standard + + +## Optiboot for ATmega328p +## --------------------------------------------- +optiboot28.menu.cpu.atmega328p=ATmega328p +optiboot28.menu.cpu.atmega328p.upload.maximum_size=32256 +optiboot28.menu.cpu.atmega328p.upload.maximum_data_size=2048 + +optiboot28.menu.cpu.atmega328p.bootloader.high_fuses=0xDE +optiboot28.menu.cpu.atmega328p.bootloader.extended_fuses=0x05 +optiboot28.menu.cpu.atmega328p.bootloader.file=optiboot/optiboot_atmega328.hex + +optiboot28.menu.cpu.atmega328p.build.mcu=atmega328p + +## Optiboot for ATmega328 +## --------------------------------------------- +optiboot28.menu.cpu.atmega328=ATmega328 +optiboot28.menu.cpu.atmega328.upload.maximum_size=32256 +optiboot28.menu.cpu.atmega328.upload.maximum_data_size=2048 + +optiboot28.menu.cpu.atmega328.bootloader.high_fuses=0xDE +optiboot28.menu.cpu.atmega328.bootloader.extended_fuses=0x05 +optiboot28.menu.cpu.atmega328.bootloader.file=optiboot/optiboot_atmega328.hex +# lie! Arduino wise, these are compatible +optiboot28.menu.cpu.atmega328.build.mcu=atmega328p + + +## Optiboot ATmega168 +## --------------------------------------------- +optiboot28.menu.cpu.atmega168=ATmega168 + +optiboot28.menu.cpu.atmega168.upload.maximum_size=15872 +optiboot28.menu.cpu.atmega168.upload.maximum_data_size=1024 + +optiboot28.menu.cpu.atmega168.bootloader.high_fuses=0xDD +optiboot28.menu.cpu.atmega168.bootloader.extended_fuses=0xFC +optiboot28.menu.cpu.atmega168.bootloader.file=optiboot/optiboot_atmega168.hex + +optiboot28.menu.cpu.atmega168.build.mcu=atmega168 + +## --------------------------------------------- +optiboot28.menu.cpu.atmega168p=ATmega168p + +optiboot28.menu.cpu.atmega168p.upload.maximum_size=15872 +optiboot28.menu.cpu.atmega168p.upload.maximum_data_size=1024 + +optiboot28.menu.cpu.atmega168p.bootloader.high_fuses=0xDD +optiboot28.menu.cpu.atmega168p.bootloader.extended_fuses=0xFC +optiboot28.menu.cpu.atmega168p.bootloader.file=optiboot/optiboot_atmega168.hex + +optiboot28.menu.cpu.atmega168p.build.mcu=atmega168p + + +## optiboot for ATmega8 +## --------------------------------------------- +optiboot28.menu.cpu.atmega8=ATmega8 + +optiboot28.menu.cpu.atmega8.upload.maximum_size=7680 +optiboot28.menu.cpu.atmega8.upload.maximum_data_size=1024 + +optiboot28.menu.cpu.atmega8.bootloader.high_fuses=0xCC +optiboot28.menu.cpu.atmega8.bootloader.low_fuses=0xBF +# optiboot28.menu.cpu.atmega8.bootloader.extended_fuses=0x00 +optiboot28.menu.cpu.atmega8.bootloader.file=optiboot/optiboot_atmega8.hex + +optiboot28.menu.cpu.atmega8.build.mcu=atmega8 + +## Atmega88 +## --------------------------------------------- +optiboot28.menu.cpu.atmega88=ATmega88 + +optiboot28.menu.cpu.atmega88.upload.maximum_size=7680 +optiboot28.menu.cpu.atmega88.upload.maximum_data_size=1024 + +optiboot28.menu.cpu.atmega88.bootloader.high_fuses=0xDD +optiboot28.menu.cpu.atmega88.bootloader.extended_fuses=0xFC +optiboot28.menu.cpu.atmega88.bootloader.file=optiboot/optiboot_atmega88.hex + +optiboot28.menu.cpu.atmega88.build.mcu=atmega88p + + +############################################################## +## Optiboot on 32pin (SMT) CPUs (Nano, Pro Micro, etc.) +############################################################## + +optiboot32.name=Optiboot on 32-pin cpus + +optiboot32.upload.tool=arduino:avrdude +optiboot32.upload.protocol=arduino +optiboot32.upload.speed=115200 + +optiboot32.bootloader.tool=arduino:avrdude +optiboot32.bootloader.low_fuses=0xF7 +optiboot32.bootloader.unlock_bits=0x3F +optiboot32.bootloader.lock_bits=0x2F +optiboot32.build.f_cpu=16000000L + +# +# Other Clock speeds. +# For 8MHz using the internal RC Oscillator, we adjust fuses, use the same +# bootloader binary, and halve the upload rate. +# +optiboot32.menu.mhz.16MHz=16MHz +optiboot32.menu.mhz.16MHz.upload.speed=115200 +optiboot32.menu.mhz.8MHz=8MHz (int) +optiboot32.menu.mhz.8MHz.build.f_cpu=8000000L +optiboot32.menu.mhz.8MHz.bootloader.low_fuses=0xE2 +optiboot32.menu.mhz.8MHz.upload.speed=57600 +optiboot32.menu.mhz.1MHz=1MHz (int) +optiboot32.menu.mhz.1MHz.build.f_cpu=1000000L +optiboot32.menu.mhz.1MHz.bootloader.low_fuses=0x62 +optiboot32.menu.mhz.1MHz.upload.speed=9600 + +# optiboot platforms should be UNO-like more than anything else. +optiboot32.build.board=AVR_UNO +optiboot32.build.core=arduino:arduino +optiboot32.build.variant=arduino:eightanaloginputs + + +## Optiboot for ATmega328p +## --------------------------------------------- +optiboot32.menu.cpu.atmega328p=ATmega328p +optiboot32.menu.cpu.atmega328p.upload.maximum_size=32256 +optiboot32.menu.cpu.atmega328p.upload.maximum_data_size=2048 + +optiboot32.menu.cpu.atmega328p.bootloader.high_fuses=0xDE +optiboot32.menu.cpu.atmega328p.bootloader.extended_fuses=0x05 +optiboot32.menu.cpu.atmega328p.bootloader.file=optiboot/optiboot_atmega328.hex + +optiboot32.menu.cpu.atmega328p.build.mcu=atmega328p + +## Optiboot for ATmega328 +## --------------------------------------------- +optiboot32.menu.cpu.atmega328=ATmega328 +optiboot32.menu.cpu.atmega328.upload.maximum_size=32256 +optiboot32.menu.cpu.atmega328.upload.maximum_data_size=2048 + +optiboot32.menu.cpu.atmega328.bootloader.high_fuses=0xDE +optiboot32.menu.cpu.atmega328.bootloader.extended_fuses=0x05 +optiboot32.menu.cpu.atmega328.bootloader.file=optiboot/optiboot_atmega328.hex +# lie! Arduino wise, these are compatible +optiboot32.menu.cpu.atmega328.build.mcu=atmega328p + + +## Optiboot ATmega168 +## --------------------------------------------- +optiboot32.menu.cpu.atmega168=ATmega168 + +optiboot32.menu.cpu.atmega168.upload.maximum_size=15872 +optiboot32.menu.cpu.atmega168.upload.maximum_data_size=1024 + +optiboot32.menu.cpu.atmega168.bootloader.high_fuses=0xDD +optiboot32.menu.cpu.atmega168.bootloader.extended_fuses=0xFC +optiboot32.menu.cpu.atmega168.bootloader.file=optiboot/optiboot_atmega168.hex + +optiboot32.menu.cpu.atmega168.build.mcu=atmega168 + +## --------------------------------------------- +optiboot32.menu.cpu.atmega168p=ATmega168p + +optiboot32.menu.cpu.atmega168p.upload.maximum_size=15872 +optiboot32.menu.cpu.atmega168p.upload.maximum_data_size=1024 + +optiboot32.menu.cpu.atmega168p.bootloader.high_fuses=0xDD +optiboot32.menu.cpu.atmega168p.bootloader.extended_fuses=0xFC +optiboot32.menu.cpu.atmega168p.bootloader.file=optiboot/optiboot_atmega168.hex + +optiboot32.menu.cpu.atmega168p.build.mcu=atmega168p + + + +############################################################## +## Other optiboot platforms +############################################################## + +optiboot1280.name=Optiboot on Mega1280 + +optiboot1280.upload.tool=arduino:avrdude +optiboot1280.upload.protocol=arduino +optiboot1280.upload.speed=115200 + +optiboot1280.bootloader.tool=arduino:avrdude +optiboot1280.bootloader.unlock_bits=0x3F +optiboot1280.bootloader.lock_bits=0x2F + +optiboot1280.build.f_cpu=16000000L + +optiboot1280.build.board=AVR_MEGA +optiboot1280.build.core=arduino:arduino +optiboot1280.build.variant=arduino:mega + +optiboot1280.upload.maximum_size=130048 +optiboot1280.upload.maximum_data_size=8192 + +optiboot1280.bootloader.low_fuses=0xFF +optiboot1280.bootloader.high_fuses=0xDE +optiboot1280.bootloader.extended_fuses=0x05 +optiboot1280.bootloader.file=optiboot/optiboot_atmega1280.hex + +optiboot1280.build.mcu=atmega1280 + +############################################################## + + +optiboot1284.name=Optiboot on (generic) Mega1284 + +optiboot1284.upload.tool=arduino:avrdude +optiboot1284.upload.protocol=arduino +optiboot1284.upload.speed=115200 + +optiboot1284.bootloader.tool=arduino:avrdude +optiboot1284.bootloader.unlock_bits=0x3F +optiboot1284.bootloader.lock_bits=0x2F + +optiboot1284.build.f_cpu=16000000L + +optiboot1284.build.board=AVR_M1284 +optiboot1284.build.core=arduino:arduino +optiboot1284.build.variant=arduino:standard + +optiboot1284.upload.maximum_size=130048 +optiboot1284.upload.maximum_data_size=16384 + +# Select full swing crystal oscillator (F7 rather than FF) +optiboot1284.bootloader.low_fuses=0xF7 +optiboot1284.bootloader.high_fuses=0xDE +optiboot1284.bootloader.extended_fuses=0x05 +optiboot1284.bootloader.file=optiboot/optiboot_atmega1284p.hex + +optiboot1284.build.mcu=atmega1284p + +############################################################## + + +optibootm32.name=Optiboot on Mega32 + +optibootm32.upload.tool=arduino:avrdude +optibootm32.upload.protocol=arduino +optibootm32.upload.speed=115200 + +optibootm32.bootloader.tool=arduino:avrdude +optibootm32.bootloader.unlock_bits=0x3F +optibootm32.bootloader.lock_bits=0x2F + +optibootm32.build.f_cpu=16000000L + +optibootm32.build.board=AVR_M32 +optibootm32.build.core=arduino:arduino +optibootm32.build.variant=arduino:standard + +optibootm32.upload.maximum_size=130048 +optibootm32.upload.maximum_data_size=8192 + +optibootm32.bootloader.low_fuses=0xBF +optibootm32.bootloader.high_fuses=0xCE +optibootm32.bootloader.extended_fuses=0xFF +optibootm32.bootloader.file=optiboot/optiboot_atmega32.hex + +optibootm32.build.mcu=atmega32 + + +############################################################## + +optiboott84.name=Optiboot on Tiny84 + +optiboott84.menu.mhz.8MHz=8MHz (int) +optiboott84.menu.mhz.8MHz.build.f_cpu=8000000L +optiboott84.menu.mhz.8MHz.upload.speed=57600 +optiboott84.menu.mhz.8MHz.bootloader.file=optiboot/optiboot_attiny84_8mhz.hex +optiboott84.menu.mhz.8MHz.bootloader.low_fuses=0xE2 +optiboott84.menu.mhz.8MHz.bootloader.high_fuses=0xDE +optiboott84.menu.mhz.8MHz.bootloader.extended_fuses=0xFE + +optiboott84.menu.mhz.1MHz=1MHz (int) +optiboott84.menu.mhz.1MHz.build.f_cpu=1000000L +optiboott84.menu.mhz.1MHz.upload.speed=9600 +optiboott84.menu.mhz.1MHz.bootloader.file=optiboot/optiboot_attiny84.hex +optiboott84.menu.mhz.1MHz.bootloader.low_fuses=0x62 +optiboott84.menu.mhz.1MHz.bootloader.high_fuses=0xDE +optiboott84.menu.mhz.1MHz.bootloader.extended_fuses=0xFE + +optiboott84.upload.tool=arduino:avrdude +optiboott84.upload.protocol=arduino +optiboott84.upload.speed=9600 + +optiboott84.bootloader.tool=arduino:avrdude +optiboott84.bootloader.unlock_bits=0x3F +optiboott84.bootloader.lock_bits=0x2F + +optiboott84.build.f_cpu=1000000L + +optiboott84.build.board=AVR_TINY +optiboott84.build.core=tiny:tiny +optiboott84.build.variant=tiny:tiny + +optiboott84.upload.maximum_size=7600 +optiboott84.upload.maximum_data_size=512 + +optiboott84.build.mcu=attiny84 + +############################################################## + +optiboot2560.name=Optiboot on Mega2560 + +optiboot2560.upload.tool=arduino:avrdude +optiboot2560.upload.protocol=arduino +optiboot2560.upload.speed=115200 + +optiboot2560.bootloader.tool=arduino:avrdude +optiboot2560.bootloader.unlock_bits=0x3F +optiboot2560.bootloader.lock_bits=0x2F + +optiboot2560.build.f_cpu=16000000L + +optiboot2560.build.board=AVR_MEGA +optiboot2560.build.core=arduino:arduino +optiboot2560.build.variant=arduino:mega + +optiboot2560.upload.maximum_size=261120 +optiboot2560.upload.maximum_data_size=8192 + +optiboot2560.bootloader.low_fuses=0xF7 +optiboot2560.bootloader.high_fuses=0xDE +optiboot2560.bootloader.extended_fuses=0xFD +optiboot2560.bootloader.file=optiboot/optiboot_atmega2560.hex + +optiboot2560.build.mcu=atmega2560 + +############################################################## + + +optibootxmini168b.name=Optiboot Xplained Mini 168pb + +optibootxmini168b.upload.tool=arduino:avrdude +optibootxmini168b.upload.protocol=arduino +optibootxmini168b.upload.speed=57600 + +optibootxmini168b.bootloader.tool=arduino:avrdude +optibootxmini168b.bootloader.unlock_bits=0x3F +optibootxmini168b.bootloader.lock_bits=0x2F + +optibootxmini168b.build.f_cpu=16000000L + +optibootxmini168b.build.board=AVR_UNO +optibootxmini168b.build.core=arduino:arduino +optibootxmini168b.build.variant=arduino:standard + +optibootxmini168b.upload.maximum_size=15872 +optibootxmini168b.upload.maximum_data_size=1024 + +optibootxmini168b.bootloader.low_fuses=0xBF +optibootxmini168b.bootloader.high_fuses=0xCE +optibootxmini168b.bootloader.extended_fuses=0xFF +optibootxmini168b.bootloader.file=optiboot/optiboot_xplained168b.hex + +optibootxmini168b.build.mcu=atmega168 + +############################# + + +optibootxmini328pb.name=Optiboot Xplained Mini 328pb + +optibootxmini328pb.upload.tool=arduino:avrdude +optibootxmini328pb.upload.protocol=arduino +optibootxmini328pb.upload.speed=57600 + +optibootxmini328pb.bootloader.tool=arduino:avrdude +optibootxmini328pb.bootloader.unlock_bits=0x3F +optibootxmini328pb.bootloader.lock_bits=0x2F + +optibootxmini328pb.build.f_cpu=16000000L + +optibootxmini328pb.build.board=AVR_UNO +optibootxmini328pb.build.core=arduino:arduino +optibootxmini328pb.build.variant=arduino:standard + +optibootxmini328pb.upload.maximum_size=32128 +optibootxmini328pb.upload.maximum_data_size=1024 + +optibootxmini328pb.bootloader.low_fuses=0xBF +optibootxmini328pb.bootloader.high_fuses=0xCE +optibootxmini328pb.bootloader.extended_fuses=0xFF +optibootxmini328pb.bootloader.file=optiboot/optiboot_xplained328pb.hex + +optibootxmini328pb.build.mcu=atmega328p + +############################# + + +optibootxmini328p.name=Optiboot Xplained Mini 328p + +optibootxmini328p.upload.tool=arduino:avrdude +optibootxmini328p.upload.protocol=arduino +optibootxmini328p.upload.speed=57600 + +optibootxmini328p.bootloader.tool=arduino:avrdude +optibootxmini328p.bootloader.unlock_bits=0x3F +optibootxmini328p.bootloader.lock_bits=0x2F + +optibootxmini328p.build.f_cpu=16000000L + +optibootxmini328p.build.board=AVR_UNO +optibootxmini328p.build.core=arduino:arduino +optibootxmini328p.build.variant=arduino:standard + +optibootxmini328p.upload.maximum_size=32128 +optibootxmini328p.upload.maximum_data_size=1024 + +optibootxmini328p.bootloader.low_fuses=0xBF +optibootxmini328p.bootloader.high_fuses=0xCE +optibootxmini328p.bootloader.extended_fuses=0xFF +optibootxmini328p.bootloader.file=optiboot/optiboot_xplained328p.hex + +optibootxmini328p.build.mcu=atmega328p diff --git a/ActualOptiboot/optiboot/boards.txt b/ActualOptiboot/optiboot/boards.txt new file mode 100644 index 0000000..5b4f2f6 --- /dev/null +++ b/ActualOptiboot/optiboot/boards.txt @@ -0,0 +1,351 @@ +# Optiboot Arduino support +# http://optiboot.googlecode.com +# Peter Knight, 2010 +# Bill Westfield, 2013 - now includes build.variant for 1.0.2 and later + +############################################################## + +atmega328o.name=[Optiboot] Arduino Duemilanove or Nano w/ ATmega328 +atmega328o.upload.protocol=arduino +atmega328o.upload.maximum_size=32256 +atmega328o.upload.speed=115200 +atmega328o.bootloader.low_fuses=0xff +atmega328o.bootloader.high_fuses=0xde +atmega328o.bootloader.extended_fuses=0x05 +atmega328o.bootloader.path=optiboot +atmega328o.bootloader.file=optiboot_atmega328.hex +atmega328o.bootloader.unlock_bits=0x3F +atmega328o.bootloader.lock_bits=0x0F +atmega328o.build.mcu=atmega328p +atmega328o.build.f_cpu=16000000L +atmega328o.build.core=arduino:arduino +atmega328o.build.variant=arduino:standard + +############################################################## + +diecimilao.name=[Optiboot] Arduino Diecimila, Duemilanove, Nano, NG w/ ATmega168 +diecimilao.upload.protocol=arduino +diecimilao.upload.maximum_size=15872 +diecimilao.upload.speed=115200 +diecimilao.bootloader.low_fuses=0xff +diecimilao.bootloader.high_fuses=0xdd +diecimilao.bootloader.extended_fuses=0x04 +diecimilao.bootloader.path=optiboot +diecimilao.bootloader.file=optiboot_diecimila.hex +diecimilao.bootloader.unlock_bits=0x3F +diecimilao.bootloader.lock_bits=0x0F +diecimilao.build.mcu=atmega168 +diecimilao.build.f_cpu=16000000L +diecimilao.build.core=arduino:arduino +diecimilao.build.variant=arduino:standard + +############################################################## + +minio.name=[Optiboot] Arduino Mini +minio.upload.protocol=arduino +minio.upload.maximum_size=15872 +minio.upload.speed=115200 +minio.bootloader.low_fuses=0xff +minio.bootloader.high_fuses=0xdd +minio.bootloader.extended_fuses=0x02 +minio.bootloader.path=optiboot +minio.bootloader.file=optiboot_ng.hex +minio.bootloader.unlock_bits=0x3F +minio.bootloader.lock_bits=0x0F +minio.build.mcu=atmega168 +minio.build.f_cpu=16000000L +minio.build.core=arduino:arduino +minio.build.variant=arduino:eightanaloginputs + +############################################################## + +lilypad328o.name=[Optiboot] LilyPad Arduino w/ ATmega328 +lilypad328o.upload.protocol=arduino +lilypad328o.upload.maximum_size=32256 +lilypad328o.upload.speed=115200 +lilypad328o.bootloader.low_fuses=0xff +lilypad328o.bootloader.high_fuses=0xdc +lilypad328o.bootloader.extended_fuses=0x05 +lilypad328o.bootloader.path=optiboot +lilypad328o.bootloader.file=optiboot_atmega328_pro_8MHz.hex +lilypad328o.bootloader.unlock_bits=0x3F +lilypad328o.bootloader.lock_bits=0x0F +lilypad328o.build.mcu=atmega328p +lilypad328o.build.f_cpu=8000000L +lilypad328o.build.core=arduino:arduino +lilypad328o.build.variant=arduino:standard + +############################################################## + +lilypado.name=[Optiboot] LilyPad Arduino w/ ATmega168 +lilypado.upload.protocol=arduino +lilypado.upload.maximum_size=15872 +lilypado.upload.speed=115200 +lilypado.bootloader.low_fuses=0xe2 +lilypado.bootloader.high_fuses=0xdd +lilypado.bootloader.extended_fuses=0x02 +lilypado.bootloader.path=lilypad +lilypado.bootloader.file=optiboot_lilypad.hex +lilypado.bootloader.unlock_bits=0x3F +lilypado.bootloader.lock_bits=0x0F +lilypado.build.mcu=atmega168 +lilypado.build.f_cpu=8000000L +lilypado.build.core=arduino:arduino +lilypado.build.variant=arduino:standard + +############################################################## + +pro328o.name=[Optiboot] Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328 +pro328o.upload.protocol=arduino +pro328o.upload.maximum_size=32256 +pro328o.upload.speed=115200 +pro328o.bootloader.low_fuses=0xff +pro328o.bootloader.high_fuses=0xdc +pro328o.bootloader.extended_fuses=0x05 +pro328o.bootloader.path=optiboot +pro328o.bootloader.file=optiboot_atmega328_pro_8MHz.hex +pro328o.bootloader.unlock_bits=0x3F +pro328o.bootloader.lock_bits=0x0F +pro328o.build.mcu=atmega328p +pro328o.build.f_cpu=8000000L +pro328o.build.core=arduino:arduino +pro328o.build.variant=arduino:standard + +############################################################## + +proo.name=[Optiboot] Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168 +proo.upload.protocol=arduino +proo.upload.maximum_size=15872 +proo.upload.speed=115200 +proo.bootloader.low_fuses=0xc6 +proo.bootloader.high_fuses=0xdd +proo.bootloader.extended_fuses=0x02 +proo.bootloader.path=optiboot +proo.bootloader.file=optiboot_pro_8MHz.hex +proo.bootloader.unlock_bits=0x3F +proo.bootloader.lock_bits=0x0F +proo.build.mcu=atmega168 +proo.build.f_cpu=8000000L +proo.build.core=arduino:arduino +proo.build.variant=arduino:standard + +############################################################## + +megao.name=[Optiboot] Arduino Mega1280 +megao.upload.protocol=arduino +megao.upload.maximum_size=130048 +megao.upload.speed=115200 +megao.bootloader.low_fuses=0xff +megao.bootloader.high_fuses=0xde +megao.bootloader.extended_fuses=0xf5 +megao.bootloader.path=optiboot +megao.bootloader.file=optiboot_atmega1280.hex +megao.bootloader.unlock_bits=0x3F +megao.bootloader.lock_bits=0x0F +megao.build.mcu=atmega1280 +megao.build.f_cpu=16000000L +megao.build.core=arduino:arduino +megao.build.variant=arduino:mega + +atmega8o.name=[Optiboot] Arduino NG or older w/ ATmega8 +atmega8o.upload.protocol=arduino +atmega8o.upload.maximum_size=7680 +atmega8o.upload.speed=115200 +atmega8o.bootloader.low_fuses=0xbf +atmega8o.bootloader.high_fuses=0xdc +atmega8o.bootloader.path=optiboot +atmega8o.bootloader.file=optiboot_atmega8.hex +atmega8o.bootloader.unlock_bits=0x3F +atmega8o.bootloader.lock_bits=0x0F +atmega8o.build.mcu=atmega8 +atmega8o.build.f_cpu=16000000L +atmega8o.build.core=arduino:arduino +atmega8o.build.variant=arduino:standard + +atmega88o.name=[Optiboot] Arduino NG or older w/ ATmega88 +atmega88o.upload.protocol=arduino +atmega88o.upload.maximum_size=7680 +atmega88o.upload.speed=115200 +atmega88o.bootloader.low_fuses=0xff +atmega88o.bootloader.high_fuses=0xdd +atmega88o.bootloader.extended_fuses=0x04 +atmega88o.bootloader.path=optiboot +atmega88o.bootloader.file=optiboot_atmega88.hex +atmega88o.bootloader.unlock_bits=0x3F +atmega88o.bootloader.lock_bits=0x0F +atmega88o.build.mcu=atmega88 +atmega88o.build.f_cpu=16000000L +atmega88o.build.core=arduino:arduino +atmega88o.build.variant=arduino:standard + +############################################################## +# +# sanguinoo.name=[Optiboot] Sanguino (work in progress) +# sanguinoo.upload.protocol=arduino +# sanguinoo.upload.maximum_size=63488 +# sanguinoo.upload.speed=115200 +# sanguinoo.bootloader.low_fuses=0xff +# sanguinoo.bootloader.high_fuses=0xdc +# sanguinoo.bootloader.extended_fuses=0xfd +# sanguinoo.bootloader.path=optiboot +# sanguinoo.bootloader.file=optiboot_atmega644p.hex +# sanguinoo.bootloader.unlock_bits=0x3F +# sanguinoo.bootloader.lock_bits=0x0F +# sanguinoo.build.mcu=atmega644p +# sanguinoo.build.f_cpu=16000000L +# sanguinoo.build.core=sanguino:sanguino +# sanguinoo.build.variant=sanguino:sanguino + +############################################################## +# +# lumineto.name=[Optiboot] Luminet (work in progress) +# lumineto.upload.protocol=arduino +# lumineto.upload.maximum_size=7424 +# lumineto.upload.speed=9600 +# lumineto.bootloader.low_fuses=0x62 +# lumineto.bootloader.high_fuses=0xdf +# lumineto.bootloader.extended_fuses=0xfe +# lumineto.bootloader.path=optiboot +# lumineto.bootloader.file=optiboot_luminet.hex +# lumineto.build.mcu=attiny84 +# lumineto.build.f_cpu=1000000L +# lumineto.build.core=luminet:luminet + +############################################################## + +atmega32o.name=[Optiboot] ATmega32 based board +atmega32o.upload.protocol=arduino +atmega32o.upload.maximum_size=32256 +atmega32o.upload.speed=115200 +atmega32o.bootloader.low_fuses=0xff +atmega32o.bootloader.high_fuses=0xde +atmega32o.bootloader.path=optiboot +atmega32o.bootloader.file=optiboot_atmega32.hex +atmega32o.bootloader.unlock_bits=0x3F +atmega32o.bootloader.lock_bits=0x0F +atmega32o.build.mcu=atmega32 +atmega32o.build.f_cpu=16000000L +atmega32o.build.core=arduino:arduino +atmega32o.build.variant=arduino:standard + +############################################################## + +atmega1284o.name=[Optiboot] ATmega1284p +atmega1284o.upload.protocol=arduino +atmega1284o.upload.maximum_size=130048 +atmega1284o.upload.speed=115200 +atmega1284o.bootloader.low_fuses=0xf7 +atmega1284o.bootloader.high_fuses=0xde +atmega1284o.bootloader.extended_fuses=0x05 +atmega1284o.bootloader.path=optiboot +atmega1284o.bootloader.file=optiboot_atmega1284p.hex +atmega1284o.bootloader.unlock_bits=0x3F +atmega1284o.bootloader.lock_bits=0x0F +atmega1284o.build.mcu=atmega1284p +atmega1284o.build.f_cpu=16000000L +atmega1284o.build.core=arduino:arduino +atmega1284o.build.variant=arduino:standard + +############################################################## + +mega2560o.name=[Optiboot] Arduino Mega2560 +mega2560o.upload.protocol=arduino +mega2560o.upload.maximum_size=261120 +mega2560o.upload.speed=115200 +mega2560o.bootloader.low_fuses=0xf7 +mega2560o.bootloader.high_fuses=0xde +mega2560o.bootloader.extended_fuses=0xfd +mega2560o.bootloader.path=optiboot +mega2560o.bootloader.file=optiboot_atmega2560.hex +mega2560o.bootloader.unlock_bits=0x3F +mega2560o.bootloader.lock_bits=0x0F +mega2560o.build.mcu=atmega2560 +mega2560o.build.f_cpu=16000000L +mega2560o.build.core=arduino:arduino +mega2560o.build.variant=arduino:mega + +############################################################## + +optibootxmini168b.name=Optiboot Xplained Mini 168pb + +optibootxmini168b.upload.tool=arduino:avrdude +optibootxmini168b.upload.protocol=arduino +optibootxmini168b.upload.speed=57600 + +optibootxmini168b.bootloader.tool=arduino:avrdude +optibootxmini168b.bootloader.unlock_bits=0x3F +optibootxmini168b.bootloader.lock_bits=0x2F + +optibootxmini168b.build.f_cpu=16000000L + +optibootxmini168b.build.board=AVR_UNO +optibootxmini168b.build.core=arduino:arduino +optibootxmini168b.build.variant=arduino:standard + +optibootxmini168b.upload.maximum_size=15872 +optibootxmini168b.upload.maximum_data_size=1024 + +optibootxmini168b.bootloader.low_fuses=0xBF +optibootxmini168b.bootloader.high_fuses=0xCE +optibootxmini168b.bootloader.extended_fuses=0xFF +optibootxmini168b.bootloader.file=optiboot/optiboot_xplained168b.hex + +optibootxmini168b.build.mcu=atmega168 + +############################# + + +optibootxmini328pb.name=Optiboot Xplained Mini 328pb + +optibootxmini328pb.upload.tool=arduino:avrdude +optibootxmini328pb.upload.protocol=arduino +optibootxmini328pb.upload.speed=57600 + +optibootxmini328pb.bootloader.tool=arduino:avrdude +optibootxmini328pb.bootloader.unlock_bits=0x3F +optibootxmini328pb.bootloader.lock_bits=0x2F + +optibootxmini328pb.build.f_cpu=16000000L + +optibootxmini328pb.build.board=AVR_UNO +optibootxmini328pb.build.core=arduino:arduino +optibootxmini328pb.build.variant=arduino:standard + +optibootxmini328pb.upload.maximum_size=32128 +optibootxmini328pb.upload.maximum_data_size=1024 + +optibootxmini328pb.bootloader.low_fuses=0xBF +optibootxmini328pb.bootloader.high_fuses=0xCE +optibootxmini328pb.bootloader.extended_fuses=0xFF +optibootxmini328pb.bootloader.file=optiboot/optiboot_xplained328pb.hex + +optibootxmini328pb.build.mcu=atmega328p + +############################# + + +optibootxmini328p.name=Optiboot Xplained Mini 328p + +optibootxmini328p.upload.tool=arduino:avrdude +optibootxmini328p.upload.protocol=arduino +optibootxmini328p.upload.speed=57600 + +optibootxmini328p.bootloader.tool=arduino:avrdude +optibootxmini328p.bootloader.unlock_bits=0x3F +optibootxmini328p.bootloader.lock_bits=0x2F + +optibootxmini328p.build.f_cpu=16000000L + +optibootxmini328p.build.board=AVR_UNO +optibootxmini328p.build.core=arduino:arduino +optibootxmini328p.build.variant=arduino:standard + +optibootxmini328p.upload.maximum_size=32128 +optibootxmini328p.upload.maximum_data_size=1024 + +optibootxmini328p.bootloader.low_fuses=0xBF +optibootxmini328p.bootloader.high_fuses=0xCE +optibootxmini328p.bootloader.extended_fuses=0xFF +optibootxmini328p.bootloader.file=optiboot/optiboot_xplained328p.hex + +optibootxmini328p.build.mcu=atmega328p diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile b/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile new file mode 100644 index 0000000..5b0341f --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile @@ -0,0 +1,616 @@ +# Makefile for ATmegaBOOT +# E.Lins, 18.7.2005 +# $Id$ +# +# Instructions +# +# To make bootloader .hex file: +# make diecimila +# make lilypad +# make ng +# etc... +# +# To burn bootloader .hex file: +# make diecimila_isp +# make lilypad_isp +# make ng_isp +# etc... +# +# Edit History +# 201406xx: WestfW: More Makefile restructuring. +# Split off Makefile.1284, Makefile.extras, Makefile.custom +# So that in theory, the main Makefile contains only the +# official platforms, and does not need to be modified to +# add "less supported" chips and boards. +# 201303xx: WestfW: Major Makefile restructuring. +# Allows options on Make command line "make xx LED=B3" +# (see also pin_defs.h) +# Divide into "chip" targets and "board" targets. +# Most boards are (recursive) board targets with options. +# Move isp target to separate makefile (fixes m8 EFUSE) +# Some (many) targets will now be rebuilt when not +# strictly necessary, so that options will be included. +# (any "make" with options will always compile.) +# Set many variables with ?= so they can be overridden +# Use arduinoISP settings as default for ISP targets +# +# +# * Copyright 2013-2015 by Bill Westfield. Part of Optiboot. +# * This software is licensed under version 2 of the Gnu Public Licence. +# * See optiboot.c for details. + +HELPTEXT = "" +#---------------------------------------------------------------------- +# +# program name should not be changed... +PROGRAM = optiboot + +# The default behavior is to build using tools that are in the users +# current path variables, but we can also build using an installed +# Arduino user IDE setup, or the Arduino source tree. +# Uncomment this next lines to build within the arduino environment, +# using the arduino-included avrgcc toolset (mac and pc) +# ENV ?= arduino +# ENV ?= arduinodev +# OS ?= macosx +# OS ?= windows + +# export symbols to recursive makes (for ISP) +export + +# defaults +MCU_TARGET = atmega168 +LDSECTIONS = -Wl,--section-start=.text=0x3e00 -Wl,--section-start=.version=0x3ffe + +# Build environments +# Start of some ugly makefile-isms to allow optiboot to be built +# in several different environments. See the README.TXT file for +# details. + +# default +fixpath = $(1) +SH := bash + +ifeq ($(ENV), arduino) +# For Arduino, we assume that we're connected to the optiboot directory +# included with the arduino distribution, which means that the full set +# of avr-tools are "right up there" in standard places. +# (except that in 1.5.x, there's an additional level of "up") +TESTDIR := $(firstword $(wildcard ../../../tools/*)) +ifeq (,$(TESTDIR)) +# Arduino 1.5.x tool location compared to optiboot dir + TOOLROOT = ../../../../tools +else +# Arduino 1.0 (and earlier) tool location + TOOLROOT = ../../../tools +endif +GCCROOT = $(TOOLROOT)/avr/bin/ + +ifeq ($(OS), windows) +# On windows, SOME of the tool paths will need to have backslashes instead +# of forward slashes (because they use windows cmd.exe for execution instead +# of a unix/mingw shell?) We also have to ensure that a consistent shell +# is used even if a unix shell is installed (ie as part of WINAVR) +fixpath = $(subst /,\,$1) +SHELL = cmd.exe +SH = sh +endif + +else ifeq ($(ENV), arduinodev) +# Arduino IDE source code environment. Use the unpacked compilers created +# by the build (you'll need to do "ant build" first.) +ifeq ($(OS), macosx) +TOOLROOT = ../../../../build/macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools +endif +ifeq ($(OS), windows) +TOOLROOT = ../../../../build/windows/work/hardware/tools +endif + +GCCROOT = $(TOOLROOT)/avr/bin/ +AVRDUDE_CONF = -C$(TOOLROOT)/avr/etc/avrdude.conf + +else +GCCROOT = +AVRDUDE_CONF = +endif + +STK500 = "C:\Program Files\Atmel\AVR Tools\STK500\Stk500.exe" +STK500-1 = $(STK500) -e -d$(MCU_TARGET) -pf -vf -if$(PROGRAM)_$(TARGET).hex \ + -lFF -LFF -f$(HFUSE)$(LFUSE) -EF8 -ms -q -cUSB -I200kHz -s -wt +STK500-2 = $(STK500) -d$(MCU_TARGET) -ms -q -lCF -LCF -cUSB -I200kHz -s -wt +# +# End of build environment code. + + +OBJ = $(PROGRAM).o +OPTIMIZE = -Os -fno-split-wide-types -mrelax + +DEFS = + +CC = $(GCCROOT)avr-gcc + +# Override is only needed by avr-lib build system. + +override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(AVR_FREQ) $(DEFS) +override LDFLAGS = $(LDSECTIONS) -Wl,--relax -nostartfiles + +OBJCOPY = $(GCCROOT)avr-objcopy +OBJDUMP = $(call fixpath,$(GCCROOT)avr-objdump) + +SIZE = $(GCCROOT)avr-size + +# +# Make command-line Options. +# Permit commands like "make atmega328 LED_START_FLASHES=10" to pass the +# appropriate parameters ("-DLED_START_FLASHES=10") to gcc +# + +HELPTEXT += "Option BAUD_RATE=nnnn - set the bit rate for communications\n" +ifdef BAUD_RATE +BAUD_RATE_CMD = -DBAUD_RATE=$(BAUD_RATE) +dummy = FORCE +else +BAUD_RATE_CMD = -DBAUD_RATE=115200 +endif + +HELPTEXT += "Option LED=B3 - set LED pin to particular port/bit\n" +ifdef LED +LED_CMD = -DLED=$(LED) +dummy = FORCE +endif + +HELPTEXT += "Option LED_START_FLASHES=n - set number of LED flashes when bootloader starts\n" +ifdef LED_START_FLASHES +LED_START_FLASHES_CMD = -DLED_START_FLASHES=$(LED_START_FLASHES) +dummy = FORCE +else +LED_START_FLASHES_CMD = -DLED_START_FLASHES=3 +endif + +HELPTEXT += "Option LED_DATA_FLASH=1 - flash the LED each time data is received.\n" +ifdef LED_DATA_FLASH +ifneq ($(LED_DATA_FLASH), 0) +LED_DATA_FLASH_CMD = -DLED_DATA_FLASH=1 +dummy = FORCE +endif +endif + +HELPTEXT += "Option LED_START_ON=1 - Turn the LED on at bootload start\n" +ifdef LED_START_ON +ifneq ($(LED_START_ON), 0) +LED_START_ON_CMD = -DLED_START_ON=1 +endif +dummy = FORCE +endif + +HELPTEXT += "Option BIGBOOT=1 - enable extra features up to 1kbytes\n" +# BIGBOOT: Include extra features, up to 1K. +ifdef BIGBOOT +ifneq ($(BIGBOOT), 0) +BIGBOOT_CMD = -DBIGBOOT=1 +dummy = FORCE +endif +endif + +HELPTEXT += "Option SUPPORT_EEPROM=1 - Include code to read/write EEPROM\n" +ifdef SUPPORT_EEPROM +ifneq ($(SUPPORT_EEPROM), 0) +SUPPORT_EEPROM_CMD = -DSUPPORT_EEPROM +dummy = FORCE +endif +endif + + +HELPTEXT += "Option SOFT_UART=1 - use a software (bit-banged) UART\n" +ifdef SOFT_UART +ifneq ($(SOFT_UART), 0) +SOFT_UART_CMD = -DSOFT_UART=1 +dummy = FORCE +endif +endif + +ifdef SINGLESPEED +ifneq ($(SINGLESPEED), 0) +SS_CMD = -DSINGLESPEED=1 +endif +endif + +COMMON_OPTIONS = $(BAUD_RATE_CMD) $(LED_START_FLASHES_CMD) $(BIGBOOT_CMD) +COMMON_OPTIONS += $(SOFT_UART_CMD) $(LED_DATA_FLASH_CMD) $(LED_CMD) $(SS_CMD) +COMMON_OPTIONS += $(SUPPORT_EEPROM_CMD) $(LED_START_ON_CMD) + +#UART is handled separately and only passed for devices with more than one. +HELPTEXT += "Option UART=n - use UARTn for communications\n" +ifdef UART +UART_CMD = -DUART=$(UART) +endif + + +# Not supported yet +# ifdef TIMEOUT_MS +# TIMEOUT_MS_CMD = -DTIMEOUT_MS=$(TIMEOUT_MS) +# dummy = FORCE +# endif +# + +#.PRECIOUS: %.elf + +#--------------------------------------------------------------------------- +# "Chip-level Platform" targets. +# A "Chip-level Platform" compiles for a particular chip, but probably does +# not have "standard" values for things like clock speed, LED pin, etc. +# Makes for chip-level platforms should usually explicitly define their +# options like: "make atmega1285 AVR_FREQ=16000000L LED=D0" +#--------------------------------------------------------------------------- +# +# Note about fuses: +# the efuse should really be 0xf8; since, however, only the lower +# three bits of that byte are used on the atmega168, avrdude gets +# confused if you specify 1's for the higher bits, see: +# http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/ +# +# similarly, the lock bits should be 0xff instead of 0x3f (to +# unlock the bootloader section) and 0xcf instead of 0x2f (to +# lock it), but since the high two bits of the lock byte are +# unused, avrdude would get confused. +#--------------------------------------------------------------------------- +# + +HELPTEXT += "\n-------------\n\n" + +# Test platforms +# Virtual boot block test +HELPTEXT += "target virboot8 - ATmega8 with virtual boot partition\n" +virboot8: TARGET = atmega8 +virboot8: MCU_TARGET = atmega8 +virboot8: CFLAGS += $(COMMON_OPTIONS) '-DVIRTUAL_BOOT_PARTITION' '-Dsave_vect_num=EE_RDY_vect_num' +virboot8: AVR_FREQ ?= 16000000L +# Start address of 1D80 allows for size up to 640 bytes, app up to 7552 +virboot8: LDSECTIONS = -Wl,--section-start=.text=0x1d80 -Wl,--section-start=.version=0x1ffe +virboot8: $(PROGRAM)_virboot8.hex +virboot8: $(PROGRAM)_virboot8.lst + + +HELPTEXT += "target virboot328p - ATmega328 with virtual boot partition\n" +virboot328: TARGET = atmega328 +virboot328: MCU_TARGET = atmega328p +virboot328: CFLAGS += $(COMMON_OPTIONS) '-DVIRTUAL_BOOT_PARTITION' +virboot328: AVR_FREQ ?= 16000000L +virboot328: LDSECTIONS = -Wl,--section-start=.text=0x7d80 -Wl,--section-start=.version=0x7ffe +virboot328: $(PROGRAM)_virboot328.hex +virboot328: $(PROGRAM)_virboot328.lst + +virboot328_isp: virboot328 +virboot328_isp: TARGET = virboot328 +virboot328_isp: MCU_TARGET = atmega328p +# no boot section, SPIEN +virboot328_isp: HFUSE ?= DF +# Low power xtal (16MHz) 16KCK/14CK+65ms +virboot328_isp: LFUSE ?= FF +# 2.7V brownout +virboot328_isp: EFUSE ?= FD +virboot328_isp: isp + +virboot8_isp: virboot8 +virboot8_isp: TARGET = virboot8 +virboot8_isp: MCU_TARGET = atmega8 +# SPIEN, CKOPT (for full swing xtal), boot section 1k +# Note that we need boot section to include our SPM instructions, +# even though we do not enable BOOTRST +virboot8_isp: HFUSE ?= CB +# 2.7V brownout, 16MHz Xtal, 16KCK/14CK+65ms +virboot8_isp: LFUSE ?= BF +virboot8_isp: isp + + + +# Diecimila, Duemilanove with m168, and NG use identical bootloaders +# Call it "atmega168" for generality and clarity, keep "diecimila" for +# backward compatibility of makefile + +# ATmega8 +# +HELPTEXT += "target atmega8 - ATmega8, ATmega8A, ATmega8L\n" +atmega8: TARGET = atmega8 +atmega8: MCU_TARGET = atmega8 +atmega8: CFLAGS += $(COMMON_OPTIONS) +atmega8: AVR_FREQ ?= 16000000L +ifndef BIGBOOT +atmega8: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe -Wl,--gc-sections -Wl,--undefined=optiboot_version +else +atmega8: LDSECTIONS = -Wl,--section-start=.text=0x1c00 -Wl,--section-start=.version=0x1ffe -Wl,--gc-sections -Wl,--undefined=optiboot_version +endif +atmega8: $(PROGRAM)_atmega8.hex +atmega8: $(PROGRAM)_atmega8.lst + +atmega8_isp: atmega8 +atmega8_isp: TARGET = atmega8 +atmega8_isp: MCU_TARGET = atmega8 +ifndef BIGBOOT +# SPIEN, CKOPT (for full swing xtal), Bootsize=512B +atmega8_isp: HFUSE ?= CC +else +# SPIEN, CKOPT (for full swing xtal), Bootsize=1024B +atmega8_isp: HFUSE ?= CA +endif +# 2.7V brownout, 16MHz Xtal, 16KCK/14CK+65ms +atmega8_isp: LFUSE ?= BF +atmega8_isp: isp + +HELPTEXT += "target atmega168 - ATmega168, ATmega168A\n" +atmega168: TARGET = atmega168 +atmega168: MCU_TARGET = atmega168 +atmega168: CFLAGS += $(COMMON_OPTIONS) +atmega168: AVR_FREQ ?= 16000000L +ifndef BIGBOOT +atmega168: LDSECTIONS = -Wl,--section-start=.text=0x3e00 -Wl,--section-start=.version=0x3ffe +else +atmeg168: LDSECTIONS = -Wl,--section-start=.text=0x3c00 -Wl,--section-start=.version=0x3ffe +endif +atmega168: $(PROGRAM)_atmega168.hex +atmega168: $(PROGRAM)_atmega168.lst + +atmega168_isp: atmega168 +atmega168_isp: TARGET = atmega168 +# 2.7V brownout +atmega168_isp: HFUSE ?= DD +# Full swing (16MHz) 16KCK/14CK+65ms +atmega168_isp: LFUSE ?= F7 +ifndef BIGBOOT +# 512 byte boot +atmega168_isp: EFUSE ?= 04 +else +# 1024byte boot +atmega168_isp: EFUSE ?= FA +endif +atmega168_isp: isp + +HELPTEXT += "target atmega328 - ATmega328p\n" +atmega328: TARGET = atmega328 +atmega328: MCU_TARGET = atmega328p +atmega328: CFLAGS += $(COMMON_OPTIONS) +atmega328: AVR_FREQ ?= 16000000L +ifndef BIGBOOT +atmega328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe +else +# bigboot version is 1k long; starts earlier +atmega328: LDSECTIONS = -Wl,--section-start=.text=0x7c00 -Wl,--section-start=.version=0x7ffe +endif +atmega328: $(PROGRAM)_atmega328.hex +atmega328: $(PROGRAM)_atmega328.lst + +atmega328_isp: atmega328 +atmega328_isp: TARGET = atmega328 +atmega328_isp: MCU_TARGET = atmega328p +ifndef BIGBOOT +# 512 byte boot, SPIEN +atmega328_isp: HFUSE ?= DE +else +# 1k byte boot, SPIEN +atmega328_isp: HFUSE ?= DC +endif +# Low power xtal (16MHz) 16KCK/14CK+65ms +atmega328_isp: LFUSE ?= FF +# 2.7V brownout +atmega328_isp: EFUSE ?= FD +atmega328_isp: isp + +#Atmega1280 +HELPTEXT += "target atmega1280 - ATmega1280 (100pin, 128k)\n" +atmega1280: MCU_TARGET = atmega1280 +atmega1280: CFLAGS += $(COMMON_OPTIONS) -DBIGBOOT $(UART_CMD) +atmega1280: AVR_FREQ ?= 16000000L +atmega1280: LDSECTIONS = -Wl,--section-start=.text=0x1fc00 -Wl,--section-start=.version=0x1fffe +atmega1280: $(PROGRAM)_atmega1280.hex +atmega1280: $(PROGRAM)_atmega1280.lst + + + +#--------------------------------------------------------------------------- +# "Board-level Platform" targets. +# A "Board-level Platform" implies a manufactured platform with a particular +# AVR_FREQ, LED, and so on. Parameters are not particularly changable from +# the "make" command line. +# Most of the board-level platform builds should envoke make recursively +# appropriate specific options +#--------------------------------------------------------------------------- +# 20MHz clocked platforms +# +# These are capable of 230400 baud, or 115200 baud on PC (Arduino Avrdude issue) +# + +pro20: TARGET = pro_20mhz +pro20: CHIP = atmega168 +pro20: + "$(MAKE)" atmega168 AVR_FREQ=20000000L LED_START_FLASHES=3 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + +pro20_isp: pro20 +pro20_isp: TARGET = pro_20mhz +# 4.3V brownout (for max speed!) +pro20_isp: HFUSE ?= DC +# Full swing xtal (20MHz) 258CK/14CK+4.1ms +pro20_isp: LFUSE ?= F7 +# 512 byte boot +pro20_isp: EFUSE ?= 04 +pro20_isp: isp + +# 16MHz clocked platforms +# +# These are capable of 230400 baud, or 115200 baud on PC (Arduino Avrdude issue) +# + +pro16: TARGET = pro_16MHz +pro16: CHIP = atmega168 +pro16: + "$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED_START_FLASHES=3 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + +pro16_isp: pro16 +pro16_isp: TARGET = pro_16MHz +# 2.7V brownout +pro16_isp: HFUSE ?= DD +# Full swing xtal (20MHz) 258CK/14CK+4.1ms +pro16_isp: LFUSE ?= F7 +# 512 byte boot +pro16_isp: EFUSE ?= 04 +pro16_isp: isp + +diecimila: TARGET = diecimila +diecimila: CHIP = atmega168 +diecimila: + "$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED_START_FLASHES=3 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + +diecimila_isp: diecimila +diecimila_isp: TARGET = diecimila +# 2.7V brownout +diecimila_isp: HFUSE ?= DD +# Low power xtal (16MHz) 16KCK/14CK+65ms +diecimila_isp: LFUSE ?= F7 +# 512 byte boot +diecimila_isp: EFUSE ?= 04 +diecimila_isp: isp + +# MEGA1280 Board (this is different from the atmega1280 chip platform) +# Mega has a minimum boot size of 1024 bytes, so enable extra functions +# Note that optiboot does not (can not) work on the MEGA2560 +#mega: TARGET = atmega1280 +mega1280: atmega1280 + +mega1280_isp: mega1280 +mega1280_isp: TARGET = atmega1280 +mega1280_isp: MCU_TARGET = atmega1280 +# 1024 byte boot +mega1280_isp: HFUSE ?= DE +# Low power xtal (16MHz) 16KCK/14CK+65ms +mega1280_isp: LFUSE ?= FF +# 2.7V brownout; wants F5 for some reason... +mega1280_isp: EFUSE ?= F5 +mega1280_isp: isp + +# 8MHz clocked platforms +# +# These are capable of 115200 baud +# Note that "new" Arduinos with an AVR as USB/Serial converter will NOT work +# with an 8MHz target Arduino. The bitrate errors are in opposite directions, +# and total too large a number. +# + +lilypad: TARGET = $@ +lilypad: CHIP = atmega168 +lilypad: + "$(MAKE)" $(CHIP) AVR_FREQ=8000000L LED_START_FLASHES=3 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + +lilypad_isp: lilypad +lilypad_isp: TARGET = lilypad +# 2.7V brownout +lilypad_isp: HFUSE ?= DD +# Internal 8MHz osc (8MHz) Slow rising power +lilypad_isp: LFUSE ?= E2 +# 512 byte boot +lilypad_isp: EFUSE ?= 04 +lilypad_isp: isp + +# lilypad_resonator is the same as a 8MHz lilypad, except for fuses. +lilypad_resonator: lilypad + +lilypad_resonator_isp: lilypad +lilypad_resonator_isp: TARGET = lilypad +# 2.7V brownout +lilypad_resonator_isp: HFUSE ?= DD +# Full swing xtal (20MHz) 258CK/14CK+4.1ms +lilypad_resonator_isp: LFUSE ?= C6 +# 512 byte boot +lilypad_resonator_isp: EFUSE ?= 04 +lilypad_resonator_isp: isp + +pro8: TARGET = pro_8MHz +pro8: CHIP = atmega168 +pro8: + "$(MAKE)" $(CHIP) AVR_FREQ=8000000L LED_START_FLASHES=3 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + +pro8_isp: pro8 +pro8_isp: TARGET = pro_8MHz +# 2.7V brownout +pro8_isp: HFUSE ?= DD +# Full swing xtal (20MHz) 258CK/14CK+4.1ms +pro8_isp: LFUSE ?= C6 +# 512 byte boot +pro8_isp: EFUSE ?= 04 +pro8_isp: isp + +atmega328_pro8: TARGET = atmega328_pro_8MHz +atmega328_pro8: CHIP = atmega328 +atmega328_pro8: + "$(MAKE)" $(CHIP) AVR_FREQ=8000000L LED_START_FLASHES=3 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + +atmega328_pro8_isp: atmega328_pro8 +atmega328_pro8_isp: TARGET = atmega328_pro_8MHz +atmega328_pro8_isp: MCU_TARGET = atmega328p +# 512 byte boot, SPIEN +atmega328_pro8_isp: HFUSE ?= DE +# Low power xtal (16MHz) 16KCK/14CK+65ms +atmega328_pro8_isp: LFUSE ?= FF +# 2.7V brownout +atmega328_pro8_isp: EFUSE ?= 05 +atmega328_pro8_isp: isp + +# +# Include additional platforms +include Makefile.atmel +include Makefile.extras +include Makefile.1284 +include Makefile.custom +include Makefile.2560 + + +#--------------------------------------------------------------------------- +# +# Generic build instructions +# + +FORCE: + +baudcheck: FORCE + - @$(CC) --version + - @$(CC) $(CFLAGS) -E baudcheck.c -o baudcheck.tmp.sh + - @$(SH) baudcheck.tmp.sh + +isp: $(TARGET) + "$(MAKE)" -f Makefile.isp isp TARGET=$(TARGET) + +isp-stk500: $(PROGRAM)_$(TARGET).hex + $(STK500-1) + $(STK500-2) + +%.elf: $(OBJ) baudcheck $(dummy) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) + $(SIZE) $@ + +clean: + rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex *.tmp.sh + +%.lst: %.elf + $(OBJDUMP) -h -S $< > $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O ihex $< $@ + +%.srec: %.elf + $(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O srec $< $@ + +%.bin: %.elf + $(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O binary $< $@ + +help: + @echo $(HELPTEXT) diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.1284 b/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.1284 new file mode 100644 index 0000000..a7485ee --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.1284 @@ -0,0 +1,146 @@ +# +# Makefile for 40-pin AVR chips, including ATmega644 and ATmega1284 +# +# * Copyright 2013-2015 by Bill Westfield. Part of Optiboot. +# * This software is licensed under version 2 of the Gnu Public Licence. +# * See optiboot.c for details. + +# Chip level targets +# +HELPTEXT += "target atmega644p - ATmega644p\n" +atmega644p: TARGET = atmega644p +atmega644p: MCU_TARGET = atmega644p +atmega644p: CFLAGS += $(COMMON_OPTIONS) -DBIGBOOT +atmega644p: AVR_FREQ ?= 16000000L +atmega644p: LDSECTIONS = -Wl,--section-start=.text=0xfc00 -Wl,--section-start=.version=0xfffe +atmega644p: CFLAGS += $(UART_CMD) +atmega644p: $(PROGRAM)_atmega644p.hex +atmega644p: $(PROGRAM)_atmega644p.lst + +HELPTEXT += "target atmega1284 - ATmega1284p (40 pin, 128k)\n" +atmega1284: TARGET = atmega1284p +atmega1284: MCU_TARGET = atmega1284p +atmega1284: CFLAGS += $(COMMON_OPTIONS) -DBIGBOOT +atmega1284: AVR_FREQ ?= 16000000L +atmega1284: LDSECTIONS = -Wl,--section-start=.text=0x1fc00 -Wl,--section-start=.version=0x1fffe +atmega1284: CFLAGS += $(UART_CMD) +atmega1284: $(PROGRAM)_atmega1284p.hex +atmega1284: $(PROGRAM)_atmega1284p.lst + +atmega1284p: atmega1284 + +atmega1284_isp: atmega1284 +atmega1284_isp: TARGET = atmega1284p +atmega1284_isp: MCU_TARGET = atmega1284p +# 1024 byte boot +atmega1284_isp: HFUSE ?= DE +# Full Swing xtal (16MHz) 16KCK/14CK+65ms +atmega1284_isp: LFUSE ?= F7 +# 2.7V brownout +atmega1284_isp: EFUSE ?= FD +atmega1284_isp: isp + +# +# Board-level targets +# + +# Sanguino has a minimum boot size of 1024 bytes, so enable extra functions +# +HELPTEXT += "target sanguino - ATmega644p board\n" +sanguino: TARGET = $@ +sanguino: CHIP = atmega644p +sanguino: + "$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED=B0 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + +sanguino_isp: sanguino +sanguino_isp: TARGET = sanguino +sanguino_isp: MCU_TARGET = atmega644p +# 1024 byte boot +sanguino_isp: HFUSE ?= DE +# Full swing xtal (16MHz) 16KCK/14CK+65ms +sanguino_isp: LFUSE ?= F7 +# 2.7V brownout +sanguino_isp: EFUSE ?= FD +sanguino_isp: isp + +HELPTEXT += "target mighty1284 - ManiacBug Mighty1284 board\n" +mighty1284: TARGET = $@ +mighty1284: CHIP = atmega1284p +mighty1284: + "$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED=B7 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + +mighty1284_isp: mighty1284 +mighty1284_isp: TARGET = mighty1284 +mighty1284_isp: MCU_TARGET = atmega1284p +# 1024 byte boot +mighty1284_isp: HFUSE ?= DE +# Full swing xtal (16MHz) 16KCK/14CK+65ms +mighty1284_isp: LFUSE ?= F7 +# 2.7V brownout +mighty1284_isp: EFUSE ?= FD +mighty1284_isp: isp + +HELPTEXT += "target bobuino - Crossroads 1284 board\n" +bobuino: TARGET = $@ +bobuino: CHIP = atmega1284p +bobuino: + "$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED=B7 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + +bobuino_isp: bobuino +bobuino_isp: TARGET = bobuino +bobuino_isp: MCU_TARGET = atmega1284p +# 1024 byte boot +bobuino_isp: HFUSE ?= DE +# Full swing xtal (16MHz) 16KCK/14CK+65ms +bobuino_isp: LFUSE ?= F7 +# 2.7V brownout +bobuino_isp: EFUSE ?= FD +bobuino_isp: isp + +# +# Wicked Devices "Wildfire" boards (1284 with wireless!) +# + +HELPTEXT += "target wildfirev2 - Wicked Devices board\n" +wildfirev2: TARGET = $@ +wildfirev2: CHIP = atmega1284p +wildfirev2: + "$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED=B7 BAUD_RATE=1000000 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + +wildfirev2_isp: wildfirev2 +wildfirev2_isp: TARGET = wildfirev2 +wildfirev2_isp: MCU_TARGET = atmega1284p +# 1024 byte boot +wildfirev2_isp: HFUSE ?= DE +# Full swing xtal (16MHz) 16KCK/14CK+65ms +wildfirev2_isp: LFUSE ?= F7 +# 2.7V brownout +wildfirev2_isp: EFUSE ?= FD +wildfirev2_isp: isp + +HELPTEXT += "target wildfirev3 - Wicked Devices board\n" +wildfirev3: TARGET = $@ +wildfirev3: CHIP = atmega1284p +wildfirev3: + "$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED=B5 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + +wildfirev3_isp: wildfirev3 +wildfirev3_isp: TARGET = wildfirev3 +wildfirev3_isp: MCU_TARGET = atmega1284p +# 1024 byte boot +wildfirev3_isp: HFUSE ?= DE +# Full swing xtal (16MHz) 16KCK/14CK+65ms +wildfirev3_isp: LFUSE ?= F7 +# 2.7V brownout +wildfirev3_isp: EFUSE ?= FD +wildfirev3_isp: isp diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.2560 b/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.2560 new file mode 100644 index 0000000..a0df373 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.2560 @@ -0,0 +1,56 @@ +# +# Makefile for 2560 AVR chips +# +# * Copyright 2013-2015 by Bill Westfield, Marek Wodzinski. Part of Optiboot. +# * This software is licensed under version 2 of the Gnu Public Licence. +# * See optiboot.c for details. + +# Chip level targets +# +HELPTEXT += "target atmega2560 - ATmega2560p (100pin, 256k)\n" +atmega2560: TARGET = atmega2560 +atmega2560: MCU_TARGET = atmega2560 +atmega2560: CFLAGS += $(COMMON_OPTIONS) -DBIGBOOT +atmega2560: AVR_FREQ ?= 16000000L +atmega2560: LDSECTIONS = -Wl,--section-start=.text=0x3fc00 -Wl,--section-start=.version=0x3fffe +atmega2560: CFLAGS += $(UART_CMD) +atmega2560: $(PROGRAM)_atmega2560.hex +atmega2560: $(PROGRAM)_atmega2560.lst + + +atmega2560_isp: atmega2560 +atmega2560_isp: TARGET = atmega2560 +atmega2560_isp: MCU_TARGET = atmega2560 +# 1024 byte boot, JTAG disabled +atmega2560_isp: HFUSE ?= DE +# Full Swing xtal (16MHz) 16KCK/14CK+65ms +atmega2560_isp: LFUSE ?= F7 +# 2.7V brownout +atmega2560_isp: EFUSE ?= FD +atmega2560_isp: isp + +# +# Board-level targets +# + +# Arduino/Geniuno MEGA 256 has a minimum boot size of 1024 bytes, so enable extra functions +# +HELPTEXT += "target mega2560 - Arduino MEGA2560 board, 2560ADK\n" +mega2560: TARGET = $@ +mega2560: CHIP = atmega2560 +mega2560: + "$(MAKE)" $(CHIP) AVR_FREQ=16000000L + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + +mega2560_isp: mega256 +mega2560_isp: TARGET = mega2560 +mega2560_isp: MCU_TARGET = atmega2560 +# 1024 byte boot, JTAG disabled +mega2560_isp: HFUSE ?= DE +# Full swing xtal (16MHz) 16KCK/14CK+65ms +mega2560_isp: LFUSE ?= F7 +# 2.7V brownout +mega2560_isp: EFUSE ?= FD +mega2560_isp: isp + diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.atmel b/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.atmel new file mode 100644 index 0000000..8c45bc2 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.atmel @@ -0,0 +1,37 @@ +# +# Support for the Atmel Xplained mini eval boards that are mostly +# compatible with Arduino. (168pb, 328p, and 328pb chips.) +# +# Currently these all masquerade as 168 or 328p, because the IDE +# does not yet have compiler support for the -pb variants. +# +# These boards have an mEDBG debug chip that: +# 1) means that optiboot can only be programmed via Atmel Studio +# 2) prevents optiboot from working at 115200bps. +# 3) provides 16MHz (at 5V) via Xin on the chip. +# +# +# +HELPTEXT += "target xplained168pb - Atmel Xplained Mini 168pb Eval board\n" +xplained168pb: TARGET = $@ +xplained168pb: CHIP = atmega168 +xplained168pb: + "$(MAKE)" $(CHIP) AVR_FREQ=16000000L BAUD_RATE=57600 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + +HELPTEXT += "target xplained328pb - Atmel Xplained Mini 328pb Eval board\n" +xplained328pb: TARGET = $@ +xplained328pb: CHIP = atmega328 +xplained328pb: + "$(MAKE)" $(CHIP) AVR_FREQ=16000000L BAUD_RATE=57600 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + +HELPTEXT += "target xplained328p - Atmel Xplained Mini 328p Eval board\n" +xplained328p: TARGET = $@ +xplained328p: CHIP = atmega328 +xplained328p: + "$(MAKE)" $(CHIP) AVR_FREQ=16000000L BAUD_RATE=57600 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.custom b/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.custom new file mode 100644 index 0000000..aa970ab --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.custom @@ -0,0 +1,16 @@ +# +# Makefile for "custom" platforms. Add your board here. +# +# * Copyright 2013-2015 by Bill Westfield. Part of Optiboot. +# * This software is licensed under version 2 of the Gnu Public Licence. +# * See optiboot.c for details. + + +HELPTEXT += "target wildfire - Wicked Devices Wildfire v1 board\n" +wildfire: TARGET = $@ +wildfire: CHIP = atmega1284p +wildfire: + "$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED=B5 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.extras b/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.extras new file mode 100644 index 0000000..996a740 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.extras @@ -0,0 +1,135 @@ +# +# Makefile for "other" implemented platforms. +# +# * Copyright 2013-2015 by Bill Westfield. Part of Optiboot. +# * This software is licensed under version 2 of the Gnu Public Licence. +# * See optiboot.c for details. +# + +# +# Extra chips (maybe) supported by optiboot +# Note that these are usually only minimally tested. +# + +# +# ATmega88 +# +HELPTEXT += "target atmega88 - ATmega88 or ATmega88p (28pin, 8k)\n" +atmega88: TARGET = atmega88 +atmega88: MCU_TARGET = atmega88 +atmega88: CFLAGS += $(COMMON_OPTIONS) +atmega88: AVR_FREQ ?= 16000000L +atmega88: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe -Wl,--gc-sections -Wl,--undefined=optiboot_version +atmega88: $(PROGRAM)_atmega88.hex +atmega88: $(PROGRAM)_atmega88.lst + +atmega88_isp: atmega88 +atmega88_isp: TARGET = atmega88 +atmega88_isp: MCU_TARGET = atmega88 +# 2.7V brownout +atmega88_isp: HFUSE ?= DD +# Low power xtal (16MHz) 16KCK/14CK+65ms +atmega88_isp: LFUSE ?= FF +# 512 byte boot +atmega88_isp: EFUSE ?= 04 +atmega88_isp: isp + +atmega88p_isp: atmega88 +atmega88p_isp: TARGET = atmega88 +atmega88p_isp: MCU_TARGET = atmega88p +# 2.7V brownout +atmega88p_isp: HFUSE ?= DD +# Low power xtal (16MHz) 16KCK/14CK+65ms +atmega88p_isp: LFUSE ?= FF +# 512 byte boot +atmega88p_isp: EFUSE ?= 04 +atmega88p_isp: isp + +# +# ATmega168p [QFN32] +# +HELPTEXT += "target atmega168p - ATmega168p\n" +atmega168p: TARGET = atmega168p +atmega168p: MCU_TARGET = atmega168p +atmega168p: CFLAGS += $(COMMON_OPTIONS) +atmega168p: AVR_FREQ ?= 16000000L +atmega168p: $(PROGRAM)_atmega168p_16MHz.hex +atmega168p: $(PROGRAM)_atmega168p_16MHz.lst + +atmega168p_isp: atmega168p +atmega168p_isp: TARGET = atmega168p +# 2.7V brownout +atmega168p_isp: HFUSE ?= DD +# Low power xtal (16MHz) 16KCK/14CK+65ms +atmega168p_isp: LFUSE ?= FF +# 512 byte boot +atmega168p_isp: EFUSE ?= 04 +atmega168p_isp: isp + +HELPTEXT += "target atmega16 - ATmega16 (40pin, 16k)\n" +atmega16: TARGET = atmega16 +atmega16: MCU_TARGET = atmega16 +atmega16: CFLAGS += $(COMMON_OPTIONS) +atmega16: AVR_FREQ ?= 16000000L +atmega16: $(PROGRAM)_atmega16.hex +atmega16: $(PROGRAM)_atmega16.lst + +# +# ATmega32 +# +HELPTEXT += "target atmega32 - ATmega32 (40pin, 32k)\n" +atmega32: TARGET = atmega32 +atmega32: MCU_TARGET = atmega32 +atmega32: CFLAGS += $(COMMON_OPTIONS) +atmega32: AVR_FREQ ?= 11059200L +atmega32: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe +atmega32: $(PROGRAM)_atmega32.hex +atmega32: $(PROGRAM)_atmega32.lst + +atmega32_isp: atmega32 +atmega32_isp: TARGET = atmega32 +atmega32_isp: MCU_TARGET = atmega32 +# No OCD or JTAG, SPIEN, CKOPT (for full swing xtal), Bootsize=512B +atmega32_isp: HFUSE ?= CE +# 2.7V brownout, 16MHz Xtal, 16KCK/14CK+65ms +atmega32_isp: LFUSE ?= BF +atmega32_isp: isp + + + +# +# ATtiny84 +# +attiny84: TARGET = attiny84 +attiny84: MCU_TARGET = attiny84 +attiny84: CFLAGS += $(COMMON_OPTIONS) -DSOFT_UART -DVIRTUAL_BOOT_PARTITION -Dsave_vect_num=4 +attiny84: LDSECTIONS = -Wl,--section-start=.text=0x1d00 -Wl,--section-start=.version=0x1ffe -Wl,--gc-sections -Wl,--undefined=optiboot_version +attiny84: $(PROGRAM)_attiny84.hex +attiny84: $(PROGRAM)_attiny84.lst + + + +# 1MHz clocked platforms/boards +# +# These are capable of 9600 baud +# + +luminet: TARGET = $@ +luminet: CHIP = attiny84 +luminet: + "$(MAKE)" $(CHIP) AVR_FREQ=1000000L LED_START_FLASHES=0 BAUD_RATE=9600 + mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex + mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst + +luminet_isp: luminet +luminet_isp: TARGET = luminet +luminet_isp: MCU_TARGET = attiny84 +# Brownout disabled +luminet_isp: HFUSE ?= DF +# 1MHz internal oscillator, slowly rising power +luminet_isp: LFUSE ?= 62 +# Self-programming enable +luminet_isp: EFUSE ?= FE +luminet_isp: isp + + diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.isp b/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.isp new file mode 100644 index 0000000..745729f --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/Makefile.isp @@ -0,0 +1,90 @@ +# Makefile.isp for Optiboot +# Bill Westfield (WestfW@yahoo.com) March, 2013 +# $Id$ +# +# Instructions: +# +# This is a "daughter" Makefile that burns the bootloader using a ISP +# device programmer. It is designed to inherit assorted variables from +# the parent optiboot "Makefile"... Using a daughter makefile makes +# certain variable manipulations more obvious. +# +# To burn bootloader .hex file, invoke the main Makefile using: +# make diecimila_isp +# make lilypad_isp +# make ng_isp +# etc... +# +# +# Note: inherit paths/etc from parent Makefile. +# +#--------------------------------------------------------------------------- +# +# * Copyright 2013-2015 by Bill Westfield. Part of Optiboot. +# * This software is licensed under version 2 of the Gnu Public Licence. +# * See optiboot.c for details. +# +#--------------------------------------------------------------------------- + +# enter the parameters for the avrdude isp tool -b19200 +# + +# Inherit avrdude paths from top-level makefile +AVRDUDE_ROOT ?= $(GCCROOT) +AVRDUDE_CONF ?= -C$(TOOLROOT)/avr/etc/avrdude.conf + +# These are the parameters for a usb-based STK500v2 programmer. +# Exact type unknown. (historical Makefile values.) +#ISPTOOL = stk500v2 +#ISPPORT = usb +#ISPSPEED = -b 115200 +# +# +# These are parameters for using an Arduino with the ArduinoISP sketch +# as the programmer. On a mac, for a particular Uno as programmer. +ISPTOOL ?= stk500v1 +ISPPORT ?= /dev/tty.usbserial-FTD61T6Q +ISPSPEED ?= -b19200 + + + +# Not all chips have EFUSE. + +ifdef EFUSE +EFUSE_CMD= -U efuse:w:0x$(EFUSE):m +endif + +# +# avrdude commands to erase chip, unlock memory, and program fuses. +# +ISPFUSES = -e -u -U lock:w:0x3f:m $(EFUSE_CMD) \ + -U hfuse:w:0x$(HFUSE):m -U lfuse:w:0x$(LFUSE):m + + +# +# avrdude commands to program the new bootloader, and protect the bootloader +# space from accidental SPM writes. Note: "2f" allows boot section to be read +# by the application, which is different than the arduino default. +# +ISPFLASH = -U flash:w:$(PROGRAM)_$(TARGET).hex -U lock:w:0x2f:m + +# There are certain complicated caused by the fact that the default state +# of a fuse is a "1" rather than a "0", especially with respect to fuse bits +# that have not been implemented. Those would normally not be included, but +# unimplemented fuses still default to being "1" +# +# the efuse should really be 0xf8; since, however, only the lower +# three bits of that byte are used on the atmega168, avrdude gets +# confused if you specify 1's for the higher bits, see: +# http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/ +# +# similarly, the lock bits should be 0xff instead of 0x3f (to +# unlock the bootloader section) and 0xcf instead of 0x2f (to +# lock it), but since the high two bits of the lock byte are +# unused, avrdude would get confused. + +isp: $(PROGRAM)_$(TARGET).hex + $(AVRDUDE_ROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \ + -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \ + $(ISPFUSES) \ + $(ISPFLASH) diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/README.TXT b/ActualOptiboot/optiboot/bootloaders/optiboot/README.TXT new file mode 100644 index 0000000..b4db4c9 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/README.TXT @@ -0,0 +1,99 @@ +This directory contains the Optiboot small bootloader for AVR +microcontrollers, somewhat modified specifically for the Arduino +environment. + +Optiboot is more fully described here: http://github.com/Optiboot/optiboot +and is the work of Peter Knight (aka Cathedrow), building on work of Jason P +Kyle, Spiff, and Ladyada. More recent maintenance and modifications are by +Bill Westfield (aka WestfW) + +Arduino-specific issues are tracked as part of the Arduino project +at http://github.com/arduino/Arduino + + +Most of the information in this file is superceeded by the wiki content at +https://github.com/Optiboot/optiboot/wiki + +It's till here "just in case." + +------------------------------------------------------------ + +Building optiboot for Arduino. + +Production builds of optiboot for Arduino are done on a Mac in "unix mode" +using CrossPack-AVR-20100115. CrossPack tracks WINAVR (for windows), which +is just a package of avr-gcc and related utilities, so similar builds should +work on Windows or Linux systems. + +One of the Arduino-specific changes is modifications to the makefile to +allow building optiboot using only the tools installed as part of the +Arduino environment, or the Arduino source development tree. All three +build procedures should yield identical binaries (.hex files) (although +this may change if compiler versions drift apart between CrossPack and +the Arduino IDE.) + + +Building Optiboot in the Arduino IDE Install. + +Work in the .../hardware/arduino/bootloaders/optiboot/ and use the +"omake " command, which just generates a command that uses +the arduino-included "make" utility with a command like: + make OS=windows ENV=arduino +or make OS=macosx ENV=arduino +On windows, this assumes you're using the windows command shell. If +you're using a cygwin or mingw shell, or have one of those in your +path, the build will probably break due to slash vs backslash issues. +On a Mac, if you have the developer tools installed, you can use the +Apple-supplied version of make. +The makefile uses relative paths ("../../../tools/" and such) to find +the programs it needs, so you need to work in the existing optiboot +directory (or something created at the same "level") for it to work. + + +Building Optiboot in the Arduino Source Development Install. + +In this case, there is no special shell script, and you're assumed to +have "make" installed somewhere in your path. +Build the Arduino source ("ant build") to unpack the tools into the +expected directory. +Work in Arduino/hardware/arduino/bootloaders/optiboot and use + make OS=windows ENV=arduinodev +or make OS=macosx ENV=arduinodev + + +Programming Chips Using the _isp Targets + +The CPU targets have corresponding ISP targets that will actuall +program the bootloader into a chip. "atmega328_isp" for the atmega328, +for example. These will set the fuses and lock bits as appropriate as +well as uploading the bootloader code. + +ISP Targets in Version 5.0 and later: + +The isp targets are now built using a separate "Makefile.isp" makefile, +which should make modification easier and more obvious. This also fixes +the atmega8_isp target problem mentioned below. The default +configuration assumes an ArduinoISP setup, but you will probably need to +update at least the serial port, since those are different for each +Arduino board and/or system/ + + +ISP Targets in Version 4.6 and earlier: + +The older makefiles default to using a USB programmer, but you can use a +serial programmer like ArduinoISP by changing the appropriate variables +when you invoke make: + + make ISPTOOL=stk500v1 ISPPORT=/dev/tty.usbserial-A20e1eAN \ + ISPSPEED=-b19200 atmega328_isp + +The "atmega8_isp" target does not currently work, because the mega8 +doesn't have the "extended" fuse that the generic ISP target wants to +pass on to avrdude. You'll need to run avrdude manually. + + +Standard Targets + +I've reduced the pre-built and source-version-controlled targets +(.hex and .lst files included in the git repository) to just the +three basic 16MHz targets: atmega8, atmega16, atmega328. diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/baudcheck.c b/ActualOptiboot/optiboot/bootloaders/optiboot/baudcheck.c new file mode 100644 index 0000000..2c9406a --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/baudcheck.c @@ -0,0 +1,56 @@ +/* + * baudcheck.c + * Mar, 2013 by Bill Westfield (WestfW@yahoo.com) + * Exercises in executing arithmetic code on a system that we can't count + * on having the usual languages or tools installed. + * + * This little "C program" is run through the C preprocessor using the same + * arguments as our "real" target (which should assure that it gets the + * same values for clock speed and desired baud rate), and produces as + * output a shell script that can be run through bash, and THAT in turn + * writes the desired output... + * + * Note that the C-style comments are stripped by the C preprocessor. + * + * Copyright 2013-2015 by Bill Westfield. + * This software is licensed under version 2 of the Gnu Public Licence. + * See optiboot.c for details. + */ + +/* + * First strip any trailing "L" from the defined constants. To do this + * we need to make the constants into shell variables first. + */ +bpsx=BAUD_RATE +bps=${bpsx/L/} +bps=${bps/U/} +fcpux=F_CPU +fcpu=${fcpux/L/} +fcpu=${fcpu/U/} + +// echo f_cpu = $fcpu, baud = $bps +/* + * Compute the divisor + */ +BAUD_SETTING=$(( ( ($fcpu + $bps * 4) / (($bps * 8))) - 1 )) +// echo baud setting = $BAUD_SETTING + +/* + * Based on the computer divisor, calculate the actual bitrate, + * And the error. Since we're all integers, we have to calculate + * the tenths part of the error separately. + */ +BAUD_ACTUAL=$(( ($fcpu/(8 * (($BAUD_SETTING)+1))) )) +BAUD_ERROR=$(( (( 100*($BAUD_ACTUAL - $bps) ) / $bps) )) +ERR_TS=$(( ((( 1000*($BAUD_ACTUAL - $bps) ) / $bps) - $BAUD_ERROR * 10) )) +ERR_TENTHS=$(( ERR_TS > 0 ? ERR_TS: -ERR_TS )) + +/* + * Print a nice message containing the info we've calculated + */ +echo BAUD RATE CHECK: Desired: $bps, Real: $BAUD_ACTUAL, UBRRL = $BAUD_SETTING, Difference=$BAUD_ERROR.$ERR_TENTHS\% + + + + + diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/boot_opt.h b/ActualOptiboot/optiboot/bootloaders/optiboot/boot_opt.h new file mode 100644 index 0000000..aa11e43 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/boot_opt.h @@ -0,0 +1,99 @@ +// Get all the "standard" definitions from the official boot.h +#include + + +/* + * Implement some optimized versions that will use OUT instead + * of STS to write SPMCSR. + * (However, omit the *_extended_short, since by the time you + * need _extended_, the extra byte shouldn't be relevant any more) + * + * The C preprocessor can not determin at compile time whether SPMCSR is + * "out of range" of the OUT instruction, but we CAN do that in the + * assembler. We can even make it pretty with a macro. + * With this modification, the _short functions should work on cpus + * (like ATmega128) where STS is required. + */ + +asm(".macro __wr_spmcsr p, v \n\t" + ".if \\p > 0x37 \n\t" + "sts \\p, \\v \n\t" + ".else \n\t" + "out \\p, \\v \n\t" + ".endif \n\t" + ".endm \n"); + + +#if defined(SPMCSR) || defined(SPMCR) + +#define __boot_page_fill_short(address, data) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "movw r0, %3\n\t" \ + "__wr_spmcsr %0, %1\n\t" \ + "spm\n\t" \ + "clr r1\n\t" \ + : \ + : "i" (_SFR_IO_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_PAGE_FILL), \ + "z" ((uint16_t)address), \ + "r" ((uint16_t)data) \ + : "r0" \ + ); \ +})) + +#define __boot_page_erase_short(address) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "__wr_spmcsr %0, %1\n\t" \ + "spm\n\t" \ + : \ + : "i" (_SFR_IO_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_PAGE_ERASE), \ + "z" ((uint16_t)address) \ + ); \ +})) + +#define __boot_page_write_short(address) \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "__wr_spmcsr %0, %1\n\t" \ + "spm\n\t" \ + : \ + : "i" (_SFR_IO_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_PAGE_WRITE), \ + "z" ((uint16_t)address) \ + ); \ +})) + +#define __boot_rww_enable_short() \ +(__extension__({ \ + __asm__ __volatile__ \ + ( \ + "__wr_spmcsr %0, %1\n\t" \ + "spm\n\t" \ + : \ + : "i" (_SFR_IO_ADDR(__SPM_REG)), \ + "r" ((uint8_t)__BOOT_RWW_ENABLE) \ + ); \ +})) + +#else + +/* + * if SPMCSR or SPMCR isn't defined, it means we have some sort of + * new-fangled chip that post-dates the version of boot.h that we + * know about. In this case, it's possible that the standard boot.h + * still has workable functions, so we'll alias those. + */ + +#define __boot_page_fill_short(address, data) boot_page_fill(address, data) +#define __boot_page_erase_short(address) boot_page_erase(address) +#define __boot_page_write_short(address) boot_page_write(address) +#define __boot_rww_enable_short() boot_rww_enable() + +#endif + diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/make-ccversions b/ActualOptiboot/optiboot/bootloaders/optiboot/make-ccversions new file mode 100755 index 0000000..5618c33 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/make-ccversions @@ -0,0 +1,34 @@ +# +# Compile a couple of Optiboot variations using several different compilers +# + + +# A list of compilers that are available. +# This is, um, 4.3.3, 4.6.2, 4.8.1, 4.9.2, and 5.4.0 +# +COMPS=' +/usr/local/CrossPack-AVR-20100115/bin/ +/usr/local/CrossPack-AVR-20121207/bin/ +/usr/local/CrossPack-AVR-48/bin/ +/usr/local/avr8-atmel-20160624/bin/ +/usr/local/avr8-Atmel-3.6.0.487/bin/ +' + +for c in $COMPS; do + # Pretty print for readability + echo + echo + echo =========================================================== + echo Using compiler in $c + $c/avr-gcc --version | head -1 + echo =========================================================== + + echo --------------- make GCCROOT=$c atmega328 + make GCCROOT=$c atmega328 + echo --------------- make GCCROOT=$c atmega1284 + make GCCROOT=$c atmega1284 + echo --------------- make GCCROOT=$c luminet + make GCCROOT=$c luminet + echo --------------- make GCCROOT=$c mega1280 + make GCCROOT=$c mega1280 +done diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/makeall b/ActualOptiboot/optiboot/bootloaders/optiboot/makeall new file mode 100755 index 0000000..9288d48 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/makeall @@ -0,0 +1,32 @@ +#!/bin/bash +make clean +# +# buildable platforms of somewhat questionable support level +make lilypad +make pro8 +make pro16 +make pro20 +make atmega328_pro8 +make sanguino +make mega1280 +make luminet +make diecimila +make bobuino +make wildfirev2 +make atmega1284 +make atmega32 +make atmega88 +make atmega168p + +# +# Atmel development board targets +make xplained168pb +make xplained328p +make xplained328pb + +# +# The "big three" standard bootloaders. +# These need to be built AFTER the platforms, or they'll get renamed +make atmega8 +make atmega168 +make atmega328 diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/makeoptions b/ActualOptiboot/optiboot/bootloaders/optiboot/makeoptions new file mode 100755 index 0000000..fad1631 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/makeoptions @@ -0,0 +1,37 @@ +#!/bin/bash +make clean +# + +# don't build most of the targets already in makeall + +# The "big three" standard bootloaders. +# These need to be built AFTER the platforms, or they'll get renamed +make atmega8 +make virboot8 +make atmega168 +make atmega328 +make virboot328 + +make atmega328 BIGBOOT=1 +make atmega328 SUPPORT_EEPROM=1 LED_START_FLASHES=0 LED_START_ON=1 +make atmega328 BAUD_RATE=19200 +make atmega328 SOFT_UART=1 +make atmega328 LED_START_FLASHES=20 + +make atmega1284 UART=1 LED=A1 + +echo -------------------------------------------------- +echo Expected to fail !!!! +echo -------------------------------------------------- + +# too big +make atmega328 SUPPORT_EEPROM=1 +# no such port +make atmega328 LED=J1 +# no such led +make atmega328 LED=fred +make atmega328 UART=1 +# +#invalid bit rates +make atmega328 BAUD_RATE=300 +make atmega328 BAUD_RATE=3000000 diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/omake b/ActualOptiboot/optiboot/bootloaders/optiboot/omake new file mode 100755 index 0000000..59d23d9 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/omake @@ -0,0 +1,9 @@ +#%/bin/bash +if [ -d ../../../tools ]; then + mypath=../../../tools/avr/bin +else + mypath=../../../../tools/avr/bin +fi + +echo $mypath/make OS=macosx ENV=arduino $* +$mypath/make OS=macosx ENV=arduino $* diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/omake.bat b/ActualOptiboot/optiboot/bootloaders/optiboot/omake.bat new file mode 100644 index 0000000..4c9b13d --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/omake.bat @@ -0,0 +1,221 @@ +@echo off +SET DEBUG=REM + +REM Batch file to build Optiboot by searching around for the right tools, and then +REM setting the path and invoking them with the specified arguments. +REM Based on https://github.com/WestfW/Arduino-avr-tools-install + +REM Batch file must run in Delayed Evaluation mode. +%DEBUG% checking cmd mode +call :clearerrors +if "!x!" EQU "%x%" ( + +REM Things are good; try to set the paths and run the compile + +REM -------------------------------------------------------- + call :findArduino + %DEBUG% Using make %* + make %* + exit /b 0 +REM -------------------------------------------------------- + +) +REM We have to run in /V mode to get late evaluation of variables inside loops +%DEBUG% re-running in delayed eval mode +cmd.exe /V /C "%0" %* +exit /b 0 + + + +REM ====================================================================== + +:findArduino +REM Here is most of the work of the script. +REM Look through the various places where an Arduino install is likely to exist, +REM make sure that we can find the avr-gcc binaries that should be part of that +REM install, print out the version, and ask the user if that's what they want. + +REM Look for existing avr-gcc in path. +%DEBUG% Looking for avr-gcc in current path +call :clearerrors +call :which avr-gcc.exe +IF "%gotwhich%" NEQ "" ( + @ECHO avr-gcc already installed at %gotwhich% + exit /b 123 +) ELSE ( + @ECHO No avr-gcc in current path +) + +REM look for Arduino install. +set picked=n +set printed=n +call :scandir "%ProgramFiles%" +if ERRORLEVEL 1 exit /b 1 +if "%picked%" NEQ "y" call :scandir "%ProgramFiles(x86)%" +if ERRORLEVEL 1 exit /b 1 +if "%picked%" NEQ "y" call :scandir "C:\bin" +if ERRORLEVEL 1 exit /b 1 +if "%picked%" EQU "y" goto gotdir +@echo. + REM try some of the more unlikely places that Arduino might live. + +:noarduino + @echo Can't find Arduino + exit /b 1 + + +REM Given the name of a program-containing directory (like "\bin"), +REM See if it looks like there are any "Arduino*" directories there, +REM and prompt the user to ask whether that's the one we want to use +REM for avr-gcc. If so, set variables saying we picked one. +:scandir + %DEBUG% ScanDir %1 + SET root=%~1 + if NOT EXIST "%root%" exit /b 0 + if NOT EXIST "%root%\Arduino*" exit /b 0 + FOR /F "tokens=*" %%f IN ('dir /b /x "%root%\Arduino*"') DO ( + SET prg=!root!\%%f + if exist "!prg!\Hardware\tools\avr\bin\avr-gcc.exe" ( + if "%printed%" NEQ "Y" ( + echo At least one Arduino install found. + echo. + set printed=Y + ) + @echo Looks like !prg! has version + call :gccversion "!prg!\Hardware\tools\avr\bin\avr-gcc.exe" + SET aroot=!prg! + set picked=y + exit /b 0 + ) else %DEBUG% No Arduino exe in expected spot !prg! + ) + exit /b 0 + + +REM prompt for arduino install location. +@echo ****WHY DID WE GET HERE**** +@echo asking if this is OK +SET /P confirm="Use %prg% [y/n]>" +if "%confirm%" NEQ "y" exit /b 0 + + +:gotdir +REM figure out arduino install version. +%DEBUG% gotdir has aroot = !aroot! +IF EXIST "!aroot!\hardware\tools\avr\bin\avr-gcc.exe" ( + set bin=!aroot!\hardware\tools\avr\bin + set etc=!aroot!\hardware\tools\avr\etc +) else ( + @echo Cant find a bin directory in !aroot! + exit /b 963 +) + +%DEBUG% Checking for utils at %prg%\hardware\tools\avr\utils\bin\ +IF EXIST "!aroot!\hardware\tools\avr\utils\bin\make.exe" ( + REM See if we have make and etc as well (from Arduino 1.0.x/WinAVR) + %DEBUG% Found make.exe + set utils=!aroot!\hardware\tools\avr\utils\bin +) else ( + IF EXIST "C:\Program Files (X86)\GnuWin32" ( + set utils="C:\Program Files (X86)\GnuWin32\bin" + ) + IF EXIST "C:\Program Files\GnuWin32" ( + set utils="C:\Program Files\GnuWin32\bin" + ) +) + + +REM find bin directory. +REM create tentative path for binaries and put it in our tmp batch file +%DEBUG% Setting paths to include bin and etc +REM +REM setx will set a permanent path in the registry, but it won't take effect +REM until the next invocation of cmd.exe +REM setx PATH %bin%;%etc% +REM +%DEBUG% adding arduin bin and etc to PATH %bin%;%etc% +call :shorten "%bin%" +PATH %PATH%;!shortout! +call :shorten "%etc%" +PATH %PATH%;!shortout! + +%DEBUG% Have utils = %utils% + +IF %utils% NEQ "" ( + REM Check for make already installed + %DEBUG% Have utils; checking whether make is already installed. + call :which make.exe + if "%gotwhich%" EQU "" ( + echo Found Make at %utils% + call :shorten %utils% + PATH %PATH%;!shortout! + ) +) +call :clearerrors +exit /b 0 +goto eof + + +REM ---------------------------------------------------------------------- +REM Subroutines +REM ---------------------------------------------------------------------- + +:which + %DEBUG% which %1 + SET gotwhich= + for %%i in (%1) do set fullspec=%%~$PATH:i + if not "x!fullspec!"=="x" ( + %DEBUG% !fullspec! + set gotwhich=!fullspec! + ) + %DEBUG% End which %gotwhich% + goto eof + + +REM ---------------------------------------------------------------------- + +:gccversion + REM This implements "gcc --version | head -1" - show the first line + if EXIST %1 ( + FOR /F "delims=*" %%l in ('%1 --version') DO ( + @echo %%l + REM return after we've output one line + exit /b 0 + ) + ) + exit /b 0 + + +REM ---------------------------------------------------------------------- + +:avrdudeversion + SETLOCAL ENABLEDELAYEDEXPANSION + REM This implements "gcc --version | head -4" - show the first line + set /a count=4 + FOR /F "delims=*" %%l in ('"avrdude -v 2>&1"') DO ( + @echo %%l + set /a count=!count!-1 + if !count! equ 0 ( + ENDLOCAL + exit /b 0 + ) + ) + exit /b 0 +goto :eof + + +REM ---------------------------------------------------------------------- + +REM Clear the ERRORLEVEL to 0, if it happened to be set +:clearerrors + exit /b 0 + + +REM ---------------------------------------------------------------------- + +REM Shorten a pathname to 8.3 format filenames. + +:shorten + set shortout=%~s1 + exit /b 0 + +:eof diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot.c b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot.c new file mode 100644 index 0000000..6f89d29 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot.c @@ -0,0 +1,1060 @@ +#define FUNC_READ 1 +#define FUNC_WRITE 1 +/**********************************************************/ +/* Optiboot bootloader for Arduino */ +/* */ +/* http://optiboot.googlecode.com */ +/* */ +/* Arduino-maintained version : See README.TXT */ +/* http://code.google.com/p/arduino/ */ +/* It is the intent that changes not relevant to the */ +/* Arduino production envionment get moved from the */ +/* optiboot project to the arduino project in "lumps." */ +/* */ +/* Heavily optimised bootloader that is faster and */ +/* smaller than the Arduino standard bootloader */ +/* */ +/* Enhancements: */ +/* Fits in 512 bytes, saving 1.5K of code space */ +/* Higher baud rate speeds up programming */ +/* Written almost entirely in C */ +/* Customisable timeout with accurate timeconstant */ +/* Optional virtual UART. No hardware UART required. */ +/* Optional virtual boot partition for devices without. */ +/* */ +/* What you lose: */ +/* Implements a skeleton STK500 protocol which is */ +/* missing several features including EEPROM */ +/* programming and non-page-aligned writes */ +/* High baud rate breaks compatibility with standard */ +/* Arduino flash settings */ +/* */ +/* Fully supported: */ +/* ATmega168 based devices (Diecimila etc) */ +/* ATmega328P based devices (Duemilanove etc) */ +/* */ +/* Beta test (believed working.) */ +/* ATmega8 based devices (Arduino legacy) */ +/* ATmega328 non-picopower devices */ +/* ATmega644P based devices (Sanguino) */ +/* ATmega1284P based devices */ +/* ATmega1280 based devices (Arduino Mega) */ +/* ATmega2560 based devices (Arduino Mega) */ +/* */ +/* Alpha test */ +/* ATmega32 */ +/* */ +/* Work in progress: */ +/* ATtiny84 based devices (Luminet) */ +/* */ +/* Does not support: */ +/* USB based devices (eg. Teensy, Leonardo) */ +/* */ +/* Assumptions: */ +/* The code makes several assumptions that reduce the */ +/* code size. They are all true after a hardware reset, */ +/* but may not be true if the bootloader is called by */ +/* other means or on other hardware. */ +/* No interrupts can occur */ +/* UART and Timer 1 are set to their reset state */ +/* SP points to RAMEND */ +/* */ +/* Code builds on code, libraries and optimisations from: */ +/* stk500boot.c by Jason P. Kyle */ +/* Arduino bootloader http://arduino.cc */ +/* Spiff's 1K bootloader http://spiffie.org/know/arduino_1k_bootloader/bootloader.shtml */ +/* avr-libc project http://nongnu.org/avr-libc */ +/* Adaboot http://www.ladyada.net/library/arduino/bootloader.html */ +/* AVR305 Atmel Application Note */ +/* */ + +/* Copyright 2013-2015 by Bill Westfield. */ +/* Copyright 2010 by Peter Knight. */ +/* */ +/* 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 */ +/* */ +/* Licence can be viewed at */ +/* http://www.fsf.org/licenses/gpl.txt */ +/* */ +/**********************************************************/ + + +/**********************************************************/ +/* */ +/* Optional defines: */ +/* */ +/**********************************************************/ +/* */ +/* BIGBOOT: */ +/* Build a 1k bootloader, not 512 bytes. This turns on */ +/* extra functionality. */ +/* */ +/* BAUD_RATE: */ +/* Set bootloader baud rate. */ +/* */ +/* SOFT_UART: */ +/* Use AVR305 soft-UART instead of hardware UART. */ +/* */ +/* LED_START_FLASHES: */ +/* Number of LED flashes on bootup. */ +/* */ +/* LED_DATA_FLASH: */ +/* Flash LED when transferring data. For boards without */ +/* TX or RX LEDs, or for people who like blinky lights. */ +/* */ +/* SUPPORT_EEPROM: */ +/* Support reading and writing from EEPROM. This is not */ +/* used by Arduino, so off by default. */ +/* */ +/* TIMEOUT_MS: */ +/* Bootloader timeout period, in milliseconds. */ +/* 500,1000,2000,4000,8000 supported. */ +/* */ +/* UART: */ +/* UART number (0..n) for devices with more than */ +/* one hardware uart (644P, 1284P, etc) */ +/* */ +/**********************************************************/ + +/**********************************************************/ +/* Version Numbers! */ +/* */ +/* Arduino Optiboot now includes this Version number in */ +/* the source and object code. */ +/* */ +/* Version 3 was released as zip from the optiboot */ +/* repository and was distributed with Arduino 0022. */ +/* Version 4 starts with the arduino repository commit */ +/* that brought the arduino repository up-to-date with */ +/* the optiboot source tree changes since v3. */ +/* Version 5 was created at the time of the new Makefile */ +/* structure (Mar, 2013), even though no binaries changed*/ +/* It would be good if versions implemented outside the */ +/* official repository used an out-of-seqeunce version */ +/* number (like 104.6 if based on based on 4.5) to */ +/* prevent collisions. */ +/* */ +/**********************************************************/ + +/**********************************************************/ +/* Edit History: */ +/* */ +/* July 2018 */ +/* 7.0 WestfW (with much input from Others) */ +/* Fix MCUSR treatement as per much discussion, */ +/* Patches by MarkG55, majekw. Preserve value */ +/* for the application, as much as possible. */ +/* see https://github.com/Optiboot/optiboot/issues/97 */ +/* Optimize a bit by implementing a union for the */ +/* various 16bit address values used (based on */ +/* observation by "aweatherguy", but different.) */ +/* Slightly optimize math in VIRTUAL_BOOT code */ +/* Add some virboot targets, fix some fuses. */ +/* Implement LED_START_ON; less code than flashes */ +/* Aug 2014 */ +/* 6.2 WestfW: make size of length variables dependent */ +/* on the SPM_PAGESIZE. This saves space */ +/* on the chips where it's most important. */ +/* 6.1 WestfW: Fix OPTIBOOT_CUSTOMVER (send it!) */ +/* Make no-wait mod less picky about */ +/* skipping the bootloader. */ +/* Remove some dead code */ +/* Jun 2014 */ +/* 6.0 WestfW: Modularize memory read/write functions */ +/* Remove serial/flash overlap */ +/* (and all references to NRWWSTART/etc) */ +/* Correctly handle pagesize > 255bytes */ +/* Add EEPROM support in BIGBOOT (1284) */ +/* EEPROM write on small chips now causes err */ +/* Split Makefile into smaller pieces */ +/* Add Wicked devices Wildfire */ +/* Move UART=n conditionals into pin_defs.h */ +/* Remove LUDICOUS_SPEED option */ +/* Replace inline assembler for .version */ +/* and add OPTIBOOT_CUSTOMVER for user code */ +/* Fix LED value for Bobuino (Makefile) */ +/* Make all functions explicitly inline or */ +/* noinline, so we fit when using gcc4.8 */ +/* Change optimization options for gcc4.8 */ +/* Make ENV=arduino work in 1.5.x trees. */ +/* May 2014 */ +/* 5.0 WestfW: Add support for 1Mbps UART */ +/* Mar 2013 */ +/* 5.0 WestfW: Major Makefile restructuring. */ +/* See Makefile and pin_defs.h */ +/* (no binary changes) */ +/* */ +/* 4.6 WestfW/Pito: Add ATmega32 support */ +/* 4.6 WestfW/radoni: Don't set LED_PIN as an output if */ +/* not used. (LED_START_FLASHES = 0) */ +/* Jan 2013 */ +/* 4.6 WestfW/dkinzer: use autoincrement lpm for read */ +/* 4.6 WestfW/dkinzer: pass reset cause to app in R2 */ +/* Mar 2012 */ +/* 4.5 WestfW: add infrastructure for non-zero UARTS. */ +/* 4.5 WestfW: fix SIGNATURE_2 for m644 (bad in avr-libc) */ +/* Jan 2012: */ +/* 4.5 WestfW: fix NRWW value for m1284. */ +/* 4.4 WestfW: use attribute OS_main instead of naked for */ +/* main(). This allows optimizations that we */ +/* count on, which are prohibited in naked */ +/* functions due to PR42240. (keeps us less */ +/* than 512 bytes when compiler is gcc4.5 */ +/* (code from 4.3.2 remains the same.) */ +/* 4.4 WestfW and Maniacbug: Add m1284 support. This */ +/* does not change the 328 binary, so the */ +/* version number didn't change either. (?) */ +/* June 2011: */ +/* 4.4 WestfW: remove automatic soft_uart detect (didn't */ +/* know what it was doing or why.) Added a */ +/* check of the calculated BRG value instead. */ +/* Version stays 4.4; existing binaries are */ +/* not changed. */ +/* 4.4 WestfW: add initialization of address to keep */ +/* the compiler happy. Change SC'ed targets. */ +/* Return the SW version via READ PARAM */ +/* 4.3 WestfW: catch framing errors in getch(), so that */ +/* AVRISP works without HW kludges. */ +/* http://code.google.com/p/arduino/issues/detail?id=368n*/ +/* 4.2 WestfW: reduce code size, fix timeouts, change */ +/* verifySpace to use WDT instead of appstart */ +/* 4.1 WestfW: put version number in binary. */ +/**********************************************************/ + +#define OPTIBOOT_MAJVER 7 +#define OPTIBOOT_MINVER 0 + +/* + * OPTIBOOT_CUSTOMVER should be defined (by the makefile) for custom edits + * of optiboot. That way you don't wind up with very different code that + * matches the version number of a "released" optiboot. + */ + +#if !defined(OPTIBOOT_CUSTOMVER) +#define OPTIBOOT_CUSTOMVER 0 +#endif + +unsigned const int __attribute__((section(".version"))) +optiboot_version = 256*(OPTIBOOT_MAJVER + OPTIBOOT_CUSTOMVER) + OPTIBOOT_MINVER; + + +#include +#include +#include +#include + +/* + * optiboot uses several "address" variables that are sometimes byte pointers, + * sometimes word pointers. sometimes 16bit quantities, and sometimes built + * up from 8bit input characters. avr-gcc is not great at optimizing the + * assembly of larger words from bytes, but we can use the usual union to + * do this manually. Expanding it a little, we can also get rid of casts. + */ +typedef union { + uint8_t *bptr; + uint16_t *wptr; + uint16_t word; + uint8_t bytes[2]; +} addr16_t; + +/* + * Note that we use a replacement of "boot.h" + * uses sts instructions, but this version uses out instructions + * This saves cycles and program memory, if possible. + * boot_opt.h pulls in the standard boot.h for the odd target (?) + */ +#include "boot_opt.h" + + +// We don't use as those routines have interrupt overhead we don't need. + +/* + * pin_defs.h + * This contains most of the rather ugly defines that implement our + * ability to use UART=n and LED=D3, and some avr family bit name differences. + */ +#include "pin_defs.h" + +/* + * stk500.h contains the constant definitions for the stk500v1 comm protocol + */ +#include "stk500.h" + +#ifndef LED_START_FLASHES +#define LED_START_FLASHES 0 +#endif + +/* set the UART baud rate defaults */ +#ifndef BAUD_RATE +#if F_CPU >= 8000000L +#define BAUD_RATE 115200L // Highest rate Avrdude win32 will support +#elif F_CPU >= 1000000L +#define BAUD_RATE 9600L // 19200 also supported, but with significant error +#elif F_CPU >= 128000L +#define BAUD_RATE 4800L // Good for 128kHz internal RC +#else +#define BAUD_RATE 1200L // Good even at 32768Hz +#endif +#endif + +#ifndef UART +#define UART 0 +#endif + +#define BAUD_SETTING (( (F_CPU + BAUD_RATE * 4L) / ((BAUD_RATE * 8L))) - 1 ) +#define BAUD_ACTUAL (F_CPU/(8 * ((BAUD_SETTING)+1))) +#if BAUD_ACTUAL <= BAUD_RATE + #define BAUD_ERROR (( 100*(BAUD_RATE - BAUD_ACTUAL) ) / BAUD_RATE) + #if BAUD_ERROR >= 5 + #error BAUD_RATE off by greater than -5% + #elif BAUD_ERROR >= 2 + #warning BAUD_RATE off by greater than -2% + #endif +#else + #define BAUD_ERROR (( 100*(BAUD_ACTUAL - BAUD_RATE) ) / BAUD_RATE) + #if BAUD_ERROR >= 5 + #error BAUD_RATE off by greater than 5% + #elif BAUD_ERROR >= 2 + #warning BAUD_RATE off by greater than 2% + #endif +#endif + +#if (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 > 250 +#error Unachievable baud rate (too slow) BAUD_RATE +#endif // baud rate slow check +#if (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 < 3 +#if BAUD_ERROR != 0 // permit high bitrates (ie 1Mbps@16MHz) if error is zero +#error Unachievable baud rate (too fast) BAUD_RATE +#endif +#endif // baud rate fastn check + +/* Watchdog settings */ +#define WATCHDOG_OFF (0) +#define WATCHDOG_16MS (_BV(WDE)) +#define WATCHDOG_32MS (_BV(WDP0) | _BV(WDE)) +#define WATCHDOG_64MS (_BV(WDP1) | _BV(WDE)) +#define WATCHDOG_125MS (_BV(WDP1) | _BV(WDP0) | _BV(WDE)) +#define WATCHDOG_250MS (_BV(WDP2) | _BV(WDE)) +#define WATCHDOG_500MS (_BV(WDP2) | _BV(WDP0) | _BV(WDE)) +#define WATCHDOG_1S (_BV(WDP2) | _BV(WDP1) | _BV(WDE)) +#define WATCHDOG_2S (_BV(WDP2) | _BV(WDP1) | _BV(WDP0) | _BV(WDE)) +#ifndef __AVR_ATmega8__ +#define WATCHDOG_4S (_BV(WDP3) | _BV(WDE)) +#define WATCHDOG_8S (_BV(WDP3) | _BV(WDP0) | _BV(WDE)) +#endif + + +/* + * We can never load flash with more than 1 page at a time, so we can save + * some code space on parts with smaller pagesize by using a smaller int. + */ +#if SPM_PAGESIZE > 255 +typedef uint16_t pagelen_t ; +#define GETLENGTH(len) len = getch()<<8; len |= getch() +#else +typedef uint8_t pagelen_t; +#define GETLENGTH(len) (void) getch() /* skip high byte */; len = getch() +#endif + + +/* Function Prototypes + * The main() function is in init9, which removes the interrupt vector table + * we don't need. It is also 'OS_main', which means the compiler does not + * generate any entry or exit code itself (but unlike 'naked', it doesn't + * supress some compile-time options we want.) + */ + +int main(void) __attribute__ ((OS_main)) __attribute__ ((section (".init9"))); + +void __attribute__((noinline)) putch(char); +uint8_t __attribute__((noinline)) getch(void); +void __attribute__((noinline)) verifySpace(); +void __attribute__((noinline)) watchdogConfig(uint8_t x); + +static inline void getNch(uint8_t); +#if LED_START_FLASHES > 0 +static inline void flash_led(uint8_t); +#endif +static inline void watchdogReset(); +static inline void writebuffer(int8_t memtype, addr16_t mybuff, + addr16_t address, pagelen_t len); +static inline void read_mem(uint8_t memtype, + addr16_t, pagelen_t len); + +#ifdef SOFT_UART +void uartDelay() __attribute__ ((naked)); +#endif +void appStart(uint8_t rstFlags) __attribute__ ((naked)); + +/* + * RAMSTART should be self-explanatory. It's bigger on parts with a + * lot of peripheral registers. Let 0x100 be the default + * Note that RAMSTART (for optiboot) need not be exactly at the start of RAM. + */ +#if !defined(RAMSTART) // newer versions of gcc avr-libc define RAMSTART +#define RAMSTART 0x100 +#if defined (__AVR_ATmega644P__) +// correct for a bug in avr-libc +#undef SIGNATURE_2 +#define SIGNATURE_2 0x0A +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#undef RAMSTART +#define RAMSTART (0x200) +#endif +#endif + +/* C zero initialises all global variables. However, that requires */ +/* These definitions are NOT zero initialised, but that doesn't matter */ +/* This allows us to drop the zero init code, saving us memory */ +static addr16_t buff = {(uint8_t *)(RAMSTART)}; + +/* Virtual boot partition support */ +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect0_sav (*(uint8_t*)(RAMSTART+SPM_PAGESIZE*2+4)) +#define rstVect1_sav (*(uint8_t*)(RAMSTART+SPM_PAGESIZE*2+5)) +#define saveVect0_sav (*(uint8_t*)(RAMSTART+SPM_PAGESIZE*2+6)) +#define saveVect1_sav (*(uint8_t*)(RAMSTART+SPM_PAGESIZE*2+7)) +// Vector to save original reset jump: +// SPM Ready is least probably used, so it's default +// if not, use old way WDT_vect_num, +// or simply set custom save_vect_num in Makefile using vector name +// or even raw number. +#if !defined (save_vect_num) +#if defined (SPM_RDY_vect_num) +#define save_vect_num (SPM_RDY_vect_num) +#elif defined (SPM_READY_vect_num) +#define save_vect_num (SPM_READY_vect_num) +#elif defined (WDT_vect_num) +#define save_vect_num (WDT_vect_num) +#else +#error Cant find SPM or WDT interrupt vector for this CPU +#endif +#endif //save_vect_num +// check if it's on the same page (code assumes that) +#if (SPM_PAGESIZE <= save_vect_num) +#error Save vector not in the same page as reset! +#endif +#if FLASHEND > 8192 +// AVRs with more than 8k of flash have 4-byte vectors, and use jmp. +// We save only 16 bits of address, so devices with more than 128KB +// may behave wrong for upper part of address space. +#define rstVect0 2 +#define rstVect1 3 +#define saveVect0 (save_vect_num*4+2) +#define saveVect1 (save_vect_num*4+3) +#define appstart_vec (save_vect_num*2) +#else +// AVRs with up to 8k of flash have 2-byte vectors, and use rjmp. +#define rstVect0 0 +#define rstVect1 1 +#define saveVect0 (save_vect_num*2) +#define saveVect1 (save_vect_num*2+1) +#define appstart_vec (save_vect_num) +#endif +#else +#define appstart_vec (0) +#endif // VIRTUAL_BOOT_PARTITION + + +/* main program starts here */ +int main(void) { + uint8_t ch; + + /* + * Making these local and in registers prevents the need for initializing + * them, and also saves space because code no longer stores to memory. + * (initializing address keeps the compiler happy, but isn't really + * necessary, and uses 4 bytes of flash.) + */ + register addr16_t address; + register pagelen_t length; + + // After the zero init loop, this is the first code to run. + // + // This code makes the following assumptions: + // No interrupts will execute + // SP points to RAMEND + // r1 contains zero + // + // If not, uncomment the following instructions: + // cli(); + asm volatile ("clr __zero_reg__"); +#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega16__) + SP=RAMEND; // This is done by hardware reset +#endif + + /* + * Protect as much from MCUSR as possible for application + * and still skip bootloader if not necessary + * + * Code by MarkG55 + * see discusion in https://github.com/Optiboot/optiboot/issues/97 + */ +#if !defined(__AVR_ATmega16__) + ch = MCUSR; +#else + ch = MCUCSR; +#endif + // Skip all logic and run bootloader if MCUSR is cleared (application request) + if (ch != 0) { + /* + * To run the boot loader, External Reset Flag must be set. + * If not, we could make shortcut and jump directly to application code. + * Also WDRF set with EXTRF is a result of Optiboot timeout, so we + * shouldn't run bootloader in loop :-) That's why: + * 1. application is running if WDRF is cleared + * 2. we clear WDRF if it's set with EXTRF to avoid loops + * One problematic scenario: broken application code sets watchdog timer + * without clearing MCUSR before and triggers it quickly. But it's + * recoverable by power-on with pushed reset button. + */ + if ((ch & (_BV(WDRF) | _BV(EXTRF))) != _BV(EXTRF)) { + if (ch & _BV(EXTRF)) { + /* + * Clear WDRF because it was most probably set by wdr in bootloader. + * It's also needed to avoid loop by broken application which could + * prevent entering bootloader. + * '&' operation is skipped to spare few bytes as bits in MCUSR + * can only be cleared. + */ +#if !defined(__AVR_ATmega16__) + MCUSR = ~(_BV(WDRF)); +#else + MCUCSR = ~(_BV(WDRF)); +#endif + } + appStart(ch); + } + } + +#if LED_START_FLASHES > 0 + // Set up Timer 1 for timeout counter + TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 +#endif + +#ifndef SOFT_UART +#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega16__) + UCSRA = _BV(U2X); //Double speed mode USART + UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx + UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1 + UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); +#else + UART_SRA = _BV(U2X0); //Double speed mode USART0 + UART_SRB = _BV(RXEN0) | _BV(TXEN0); + UART_SRC = _BV(UCSZ00) | _BV(UCSZ01); + UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); +#endif +#endif + + // Set up watchdog to trigger after 1s + watchdogConfig(WATCHDOG_1S); + +#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) || defined(LED_START_ON) + /* Set LED pin as output */ + LED_DDR |= _BV(LED); +#endif + +#ifdef SOFT_UART + /* Set TX pin as output */ + UART_DDR |= _BV(UART_TX_BIT); +#endif + +#if LED_START_FLASHES > 0 + /* Flash onboard LED to signal entering of bootloader */ + flash_led(LED_START_FLASHES * 2); +#else +#if defined(LED_START_ON) + /* Turn on LED to indicate starting bootloader (less code!) */ + LED_PORT |= _BV(LED); +#endif +#endif + + /* Forever loop: exits by causing WDT reset */ + for (;;) { + /* get character from UART */ + ch = getch(); + + if(ch == STK_GET_PARAMETER) { + unsigned char which = getch(); + verifySpace(); + /* + * Send optiboot version as "SW version" + * Note that the references to memory are optimized away. + */ + if (which == STK_SW_MINOR) { + putch(optiboot_version & 0xFF); + } else if (which == STK_SW_MAJOR) { + putch(optiboot_version >> 8); + } else { + /* + * GET PARAMETER returns a generic 0x03 reply for + * other parameters - enough to keep Avrdude happy + */ + putch(0x03); + } + } + else if(ch == STK_SET_DEVICE) { + // SET DEVICE is ignored + getNch(20); + } + else if(ch == STK_SET_DEVICE_EXT) { + // SET DEVICE EXT is ignored + getNch(5); + } + else if(ch == STK_LOAD_ADDRESS) { + // LOAD ADDRESS + address.bytes[0] = getch(); + address.bytes[1] = getch(); +#ifdef RAMPZ + // Transfer top bit to LSB in RAMPZ + if (address.bytes[1] & 0x80) { + RAMPZ |= 0x01; + } + else { + RAMPZ &= 0xFE; + } +#endif + address.word *= 2; // Convert from word address to byte address + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { +#ifdef RAMPZ + // LOAD_EXTENDED_ADDRESS is needed in STK_UNIVERSAL for addressing more than 128kB + if ( AVR_OP_LOAD_EXT_ADDR == getch() ) { + // get address + getch(); // get '0' + RAMPZ = (RAMPZ & 0x01) | ((getch() << 1) & 0xff); // get address and put it in RAMPZ + getNch(1); // get last '0' + // response + putch(0x00); + } + else { + // everything else is ignored + getNch(3); + putch(0x00); + } +#else + // UNIVERSAL command is ignored + getNch(4); + putch(0x00); +#endif + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t desttype; + uint8_t *bufPtr; + pagelen_t savelength; + + GETLENGTH(length); + savelength = length; + desttype = getch(); + + // read a page worth of contents + bufPtr = buff.bptr; + do *bufPtr++ = getch(); + while (--length); + + // Read command terminator, start reply + verifySpace(); + +#ifdef VIRTUAL_BOOT_PARTITION +#if FLASHEND > 8192 +/* + * AVR with 4-byte ISR Vectors and "jmp" + * WARNING: this works only up to 128KB flash! + */ + if (address.word == 0) { + // This is the reset vector page. We need to live-patch the + // code so the bootloader runs first. + // + // Save jmp targets (for "Verify") + rstVect0_sav = buff.bptr[rstVect0]; + rstVect1_sav = buff.bptr[rstVect1]; + saveVect0_sav = buff.bptr[saveVect0]; + saveVect1_sav = buff.bptr[saveVect1]; + + // Move RESET jmp target to 'save' vector + buff.bptr[saveVect0] = rstVect0_sav; + buff.bptr[saveVect1] = rstVect1_sav; + + // Add jump to bootloader at RESET vector + // WARNING: this works as long as 'main' is in first section + buff.bptr[rstVect0] = ((uint16_t)main) & 0xFF; + buff.bptr[rstVect1] = ((uint16_t)main) >> 8; + } + +#else +/* + * AVR with 2-byte ISR Vectors and rjmp + */ + if (address.word == rstVect0) { + // This is the reset vector page. We need to live-patch + // the code so the bootloader runs first. + // + // Move RESET vector to 'save' vector + // Save jmp targets (for "Verify") + rstVect0_sav = buff.bptr[rstVect0]; + rstVect1_sav = buff.bptr[rstVect1]; + saveVect0_sav = buff.bptr[saveVect0]; + saveVect1_sav = buff.bptr[saveVect1]; + + // Instruction is a relative jump (rjmp), so recalculate. + // an RJMP instruction is 0b1100xxxx xxxxxxxx, so we should be able to + // do math on the offsets without masking it off first. + addr16_t vect; + vect.bytes[0] = rstVect0_sav; + vect.bytes[1] = rstVect1_sav; + vect.word = (vect.word-save_vect_num); //substract 'save' interrupt position + // Move RESET jmp target to 'save' vector + buff.bptr[saveVect0] = vect.bytes[0]; + buff.bptr[saveVect1] = (vect.bytes[1] & 0x0F)| 0xC0; // make an "rjmp" + // Add rjump to bootloader at RESET vector + vect.word = ((uint16_t)main); // (main) is always <= 0x0FFF; no masking needed. + buff.bptr[0] = vect.bytes[0]; // rjmp 0x1c00 instruction + buff.bptr[1] = vect.bytes[1] | 0xC0; // make an "rjmp" + } +#endif // FLASHEND +#endif // VBP + + writebuffer(desttype, buff, address, savelength); + + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + uint8_t desttype; + GETLENGTH(length); + + desttype = getch(); + + verifySpace(); + + read_mem(desttype, address, length); + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + putch(SIGNATURE_0); + putch(SIGNATURE_1); + putch(SIGNATURE_2); + } + else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + } + putch(STK_OK); + } +} + +void putch(char ch) { +#ifndef SOFT_UART + while (!(UART_SRA & _BV(UDRE0))); + UART_UDR = ch; +#else + __asm__ __volatile__ ( + " com %[ch]\n" // ones complement, carry set + " sec\n" + "1: brcc 2f\n" + " cbi %[uartPort],%[uartBit]\n" + " rjmp 3f\n" + "2: sbi %[uartPort],%[uartBit]\n" + " nop\n" + "3: rcall uartDelay\n" + " rcall uartDelay\n" + " lsr %[ch]\n" + " dec %[bitcnt]\n" + " brne 1b\n" + : + : + [bitcnt] "d" (10), + [ch] "r" (ch), + [uartPort] "I" (_SFR_IO_ADDR(UART_PORT)), + [uartBit] "I" (UART_TX_BIT) + : + "r25" + ); +#endif +} + +uint8_t getch(void) { + uint8_t ch; + +#ifdef LED_DATA_FLASH +#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega16__) + LED_PORT ^= _BV(LED); +#else + LED_PIN |= _BV(LED); +#endif +#endif + +#ifdef SOFT_UART + watchdogReset(); + __asm__ __volatile__ ( + "1: sbic %[uartPin],%[uartBit]\n" // Wait for start edge + " rjmp 1b\n" + " rcall uartDelay\n" // Get to middle of start bit + "2: rcall uartDelay\n" // Wait 1 bit period + " rcall uartDelay\n" // Wait 1 bit period + " clc\n" + " sbic %[uartPin],%[uartBit]\n" + " sec\n" + " dec %[bitCnt]\n" + " breq 3f\n" + " ror %[ch]\n" + " rjmp 2b\n" + "3:\n" + : + [ch] "=r" (ch) + : + [bitCnt] "d" (9), + [uartPin] "I" (_SFR_IO_ADDR(UART_PIN)), + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UART_SRA & _BV(RXC0))) + ; + if (!(UART_SRA & _BV(FE0))) { + /* + * A Framing Error indicates (probably) that something is talking + * to us at the wrong bit rate. Assume that this is because it + * expects to be talking to the application, and DON'T reset the + * watchdog. This should cause the bootloader to abort and run + * the application "soon", if it keeps happening. (Note that we + * don't care that an invalid char is returned...) + */ + watchdogReset(); + } + + ch = UART_UDR; +#endif + +#ifdef LED_DATA_FLASH +#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega16__) + LED_PORT ^= _BV(LED); +#else + LED_PIN |= _BV(LED); +#endif +#endif + + return ch; +} + +#ifdef SOFT_UART +// AVR305 equation: #define UART_B_VALUE (((F_CPU/BAUD_RATE)-23)/6) +// Adding 3 to numerator simulates nearest rounding for more accurate baud rates +#define UART_B_VALUE (((F_CPU/BAUD_RATE)-20)/6) +#if UART_B_VALUE > 255 +#error Baud rate too slow for soft UART +#endif + +void uartDelay() { + __asm__ __volatile__ ( + "ldi r25,%[count]\n" + "1:dec r25\n" + "brne 1b\n" + "ret\n" + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) { + watchdogConfig(WATCHDOG_16MS); // shorten WD timeout + while (1) // and busy-loop so that WD causes + ; // a reset and app start. + } + putch(STK_INSYNC); +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + TIFR1 = _BV(TOV1); + while(!(TIFR1 & _BV(TOV1))); +#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega16__) + LED_PORT ^= _BV(LED); +#else + LED_PIN |= _BV(LED); +#endif + watchdogReset(); +#ifndef SOFT_UART + /* + * While in theory, the STK500 initial commands would be buffered + * by the UART hardware, avrdude sends several attempts in rather + * quick succession, some of which will be lost and cause us to + * get out of sync. So if we see any data; stop blinking. + */ + if (UART_SRA & _BV(RXC0)) + break; +#else +// This doesn't seem to work? +// if ((UART_PIN & (1<: + // SP points to RAMEND + // r1 contains zero + // + // If not, uncomment the following instructions: + // cli(); + asm volatile ("clr __zero_reg__"); + 1fc00: 11 24 eor r1, r1 + * + * Code by MarkG55 + * see discusion in https://github.com/Optiboot/optiboot/issues/97 + */ +#if !defined(__AVR_ATmega16__) + ch = MCUSR; + 1fc02: 84 b7 in r24, 0x34 ; 52 +#else + ch = MCUCSR; +#endif + // Skip all logic and run bootloader if MCUSR is cleared (application request) + if (ch != 0) { + 1fc04: 88 23 and r24, r24 + 1fc06: 49 f0 breq .+18 ; 0x1fc1a + * 2. we clear WDRF if it's set with EXTRF to avoid loops + * One problematic scenario: broken application code sets watchdog timer + * without clearing MCUSR before and triggers it quickly. But it's + * recoverable by power-on with pushed reset button. + */ + if ((ch & (_BV(WDRF) | _BV(EXTRF))) != _BV(EXTRF)) { + 1fc08: 98 2f mov r25, r24 + 1fc0a: 9a 70 andi r25, 0x0A ; 10 + 1fc0c: 92 30 cpi r25, 0x02 ; 2 + 1fc0e: 29 f0 breq .+10 ; 0x1fc1a + if (ch & _BV(EXTRF)) { + 1fc10: 81 ff sbrs r24, 1 + 1fc12: 02 c0 rjmp .+4 ; 0x1fc18 + * prevent entering bootloader. + * '&' operation is skipped to spare few bytes as bits in MCUSR + * can only be cleared. + */ +#if !defined(__AVR_ATmega16__) + MCUSR = ~(_BV(WDRF)); + 1fc14: 97 ef ldi r25, 0xF7 ; 247 + 1fc16: 94 bf out 0x34, r25 ; 52 +#else + MCUCSR = ~(_BV(WDRF)); +#endif + } + appStart(ch); + 1fc18: 10 d1 rcall .+544 ; 0x1fe3a + } + } + +#if LED_START_FLASHES > 0 + // Set up Timer 1 for timeout counter + TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 + 1fc1a: 85 e0 ldi r24, 0x05 ; 5 + 1fc1c: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081> + UCSRA = _BV(U2X); //Double speed mode USART + UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx + UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1 + UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); +#else + UART_SRA = _BV(U2X0); //Double speed mode USART0 + 1fc20: 82 e0 ldi r24, 0x02 ; 2 + 1fc22: 80 93 c0 00 sts 0x00C0, r24 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + UART_SRB = _BV(RXEN0) | _BV(TXEN0); + 1fc26: 88 e1 ldi r24, 0x18 ; 24 + 1fc28: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7e00c1> + UART_SRC = _BV(UCSZ00) | _BV(UCSZ01); + 1fc2c: 86 e0 ldi r24, 0x06 ; 6 + 1fc2e: 80 93 c2 00 sts 0x00C2, r24 ; 0x8000c2 <__TEXT_REGION_LENGTH__+0x7e00c2> + UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); + 1fc32: 80 e1 ldi r24, 0x10 ; 16 + 1fc34: 80 93 c4 00 sts 0x00C4, r24 ; 0x8000c4 <__TEXT_REGION_LENGTH__+0x7e00c4> +#endif +#endif + + // Set up watchdog to trigger after 1s + watchdogConfig(WATCHDOG_1S); + 1fc38: 8e e0 ldi r24, 0x0E ; 14 + 1fc3a: ea d0 rcall .+468 ; 0x1fe10 + +#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) || defined(LED_START_ON) + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + 1fc3c: 27 9a sbi 0x04, 7 ; 4 + 1fc3e: 86 e0 ldi r24, 0x06 ; 6 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 1fc40: 20 e3 ldi r18, 0x30 ; 48 + 1fc42: 3c ef ldi r19, 0xFC ; 252 + TIFR1 = _BV(TOV1); + 1fc44: 91 e0 ldi r25, 0x01 ; 1 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 1fc46: 30 93 85 00 sts 0x0085, r19 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7e0085> + 1fc4a: 20 93 84 00 sts 0x0084, r18 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7e0084> + TIFR1 = _BV(TOV1); + 1fc4e: 96 bb out 0x16, r25 ; 22 + while(!(TIFR1 & _BV(TOV1))); + 1fc50: b0 9b sbis 0x16, 0 ; 22 + 1fc52: fe cf rjmp .-4 ; 0x1fc50 +#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega16__) + LED_PORT ^= _BV(LED); +#else + LED_PIN |= _BV(LED); + 1fc54: 1f 9a sbi 0x03, 7 ; 3 +} +#endif + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 1fc56: a8 95 wdr + * While in theory, the STK500 initial commands would be buffered + * by the UART hardware, avrdude sends several attempts in rather + * quick succession, some of which will be lost and cause us to + * get out of sync. So if we see any data; stop blinking. + */ + if (UART_SRA & _BV(RXC0)) + 1fc58: 40 91 c0 00 lds r20, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + 1fc5c: 47 fd sbrc r20, 7 + 1fc5e: 02 c0 rjmp .+4 ; 0x1fc64 + 1fc60: 81 50 subi r24, 0x01 ; 1 +#else +// This doesn't seem to work? +// if ((UART_PIN & (1< + + /* + * Copy data from the buffer into the flash write buffer. + */ + do { + __boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++)); + 1fc64: ff 24 eor r15, r15 + 1fc66: f3 94 inc r15 + } while (len -= 2); + + /* + * Actually Write the buffer to flash (and wait for it to finish.) + */ + __boot_page_write_short(address.word); + 1fc68: 55 e0 ldi r21, 0x05 ; 5 + 1fc6a: e5 2e mov r14, r21 + boot_spm_busy_wait(); +#if defined(RWWSRE) + // Reenable read access to flash + __boot_rww_enable_short(); + 1fc6c: 61 e1 ldi r22, 0x11 ; 17 +#endif + + /* Forever loop: exits by causing WDT reset */ + for (;;) { + /* get character from UART */ + ch = getch(); + 1fc6e: d6 2e mov r13, r22 + + if(ch == STK_GET_PARAMETER) { + 1fc70: c3 d0 rcall .+390 ; 0x1fdf8 + unsigned char which = getch(); + 1fc72: 81 34 cpi r24, 0x41 ; 65 + 1fc74: c1 f4 brne .+48 ; 0x1fca6 + 1fc76: c0 d0 rcall .+384 ; 0x1fdf8 + verifySpace(); + 1fc78: c8 2f mov r28, r24 + 1fc7a: d0 d0 rcall .+416 ; 0x1fe1c + /* + * Send optiboot version as "SW version" + * Note that the references to memory are optimized away. + */ + if (which == STK_SW_MINOR) { + 1fc7c: c2 38 cpi r28, 0x82 ; 130 + 1fc7e: 09 f4 brne .+2 ; 0x1fc82 + 1fc80: 3a c0 rjmp .+116 ; 0x1fcf6 + putch(optiboot_version & 0xFF); + } else if (which == STK_SW_MAJOR) { + 1fc82: c1 38 cpi r28, 0x81 ; 129 + 1fc84: 69 f4 brne .+26 ; 0x1fca0 + putch(optiboot_version >> 8); + 1fc86: 87 e0 ldi r24, 0x07 ; 7 + 1fc88: 0c c0 rjmp .+24 ; 0x1fca2 + writebuffer(desttype, buff, address, savelength); + + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + 1fc8a: 84 37 cpi r24, 0x74 ; 116 + 1fc8c: 09 f4 brne .+2 ; 0x1fc90 + + read_mem(desttype, address, length); + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + 1fc8e: 82 c0 rjmp .+260 ; 0x1fd94 + 1fc90: 85 37 cpi r24, 0x75 ; 117 + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + 1fc92: 09 f0 breq .+2 ; 0x1fc96 + putch(SIGNATURE_0); + 1fc94: a2 c0 rjmp .+324 ; 0x1fdda + 1fc96: c2 d0 rcall .+388 ; 0x1fe1c + 1fc98: 8e e1 ldi r24, 0x1E ; 30 + putch(SIGNATURE_1); + 1fc9a: a7 d0 rcall .+334 ; 0x1fdea + 1fc9c: 87 e9 ldi r24, 0x97 ; 151 + 1fc9e: a5 d0 rcall .+330 ; 0x1fdea + } else { + /* + * GET PARAMETER returns a generic 0x03 reply for + * other parameters - enough to keep Avrdude happy + */ + putch(0x03); + 1fca0: 83 e0 ldi r24, 0x03 ; 3 + 1fca2: a3 d0 rcall .+326 ; 0x1fdea + 1fca4: 9f c0 rjmp .+318 ; 0x1fde4 + } + } + else if(ch == STK_SET_DEVICE) { + 1fca6: 82 34 cpi r24, 0x42 ; 66 + 1fca8: 11 f4 brne .+4 ; 0x1fcae + // SET DEVICE is ignored + getNch(20); + 1fcaa: 84 e1 ldi r24, 0x14 ; 20 + } + else if(ch == STK_SET_DEVICE_EXT) { + 1fcac: 03 c0 rjmp .+6 ; 0x1fcb4 + // SET DEVICE EXT is ignored + getNch(5); + 1fcae: 85 34 cpi r24, 0x45 ; 69 + 1fcb0: 19 f4 brne .+6 ; 0x1fcb8 + 1fcb2: 85 e0 ldi r24, 0x05 ; 5 + 1fcb4: bb d0 rcall .+374 ; 0x1fe2c + } + else if(ch == STK_LOAD_ADDRESS) { + 1fcb6: 96 c0 rjmp .+300 ; 0x1fde4 + 1fcb8: 85 35 cpi r24, 0x55 ; 85 + // LOAD ADDRESS + address.bytes[0] = getch(); + 1fcba: 79 f4 brne .+30 ; 0x1fcda + 1fcbc: 9d d0 rcall .+314 ; 0x1fdf8 + 1fcbe: 08 2f mov r16, r24 + address.bytes[1] = getch(); + 1fcc0: 9b d0 rcall .+310 ; 0x1fdf8 + 1fcc2: 18 2f mov r17, r24 + 1fcc4: 87 ff sbrs r24, 7 +#ifdef RAMPZ + // Transfer top bit to LSB in RAMPZ + if (address.bytes[1] & 0x80) { + 1fcc6: 03 c0 rjmp .+6 ; 0x1fcce + RAMPZ |= 0x01; + 1fcc8: 8b b7 in r24, 0x3b ; 59 + 1fcca: 81 60 ori r24, 0x01 ; 1 + } + else { + RAMPZ &= 0xFE; + 1fccc: 02 c0 rjmp .+4 ; 0x1fcd2 + 1fcce: 8b b7 in r24, 0x3b ; 59 + } +#endif + address.word *= 2; // Convert from word address to byte address + 1fcd0: 8e 7f andi r24, 0xFE ; 254 + 1fcd2: 8b bf out 0x3b, r24 ; 59 + 1fcd4: 00 0f add r16, r16 + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + 1fcd6: 11 1f adc r17, r17 +#ifdef RAMPZ + // LOAD_EXTENDED_ADDRESS is needed in STK_UNIVERSAL for addressing more than 128kB + if ( AVR_OP_LOAD_EXT_ADDR == getch() ) { + 1fcd8: 84 c0 rjmp .+264 ; 0x1fde2 + 1fcda: 86 35 cpi r24, 0x56 ; 86 + 1fcdc: 81 f4 brne .+32 ; 0x1fcfe + 1fcde: 8c d0 rcall .+280 ; 0x1fdf8 + // get address + getch(); // get '0' + 1fce0: 8d 34 cpi r24, 0x4D ; 77 + 1fce2: 59 f4 brne .+22 ; 0x1fcfa + RAMPZ = (RAMPZ & 0x01) | ((getch() << 1) & 0xff); // get address and put it in RAMPZ + 1fce4: 89 d0 rcall .+274 ; 0x1fdf8 + 1fce6: cb b7 in r28, 0x3b ; 59 + 1fce8: 87 d0 rcall .+270 ; 0x1fdf8 + 1fcea: c1 70 andi r28, 0x01 ; 1 + 1fcec: 88 0f add r24, r24 + 1fcee: c8 2b or r28, r24 + getNch(1); // get last '0' + 1fcf0: cb bf out 0x3b, r28 ; 59 + 1fcf2: 81 e0 ldi r24, 0x01 ; 1 + // response + putch(0x00); + 1fcf4: 9b d0 rcall .+310 ; 0x1fe2c + 1fcf6: 80 e0 ldi r24, 0x00 ; 0 + } + else { + // everything else is ignored + getNch(3); + 1fcf8: d4 cf rjmp .-88 ; 0x1fca2 + 1fcfa: 83 e0 ldi r24, 0x03 ; 3 + getNch(4); + putch(0x00); +#endif + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + 1fcfc: fb cf rjmp .-10 ; 0x1fcf4 + 1fcfe: 84 36 cpi r24, 0x64 ; 100 + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t desttype; + uint8_t *bufPtr; + pagelen_t savelength; + + GETLENGTH(length); + 1fd00: 09 f0 breq .+2 ; 0x1fd04 + 1fd02: c3 cf rjmp .-122 ; 0x1fc8a + 1fd04: 79 d0 rcall .+242 ; 0x1fdf8 + 1fd06: c8 2f mov r28, r24 + 1fd08: d0 e0 ldi r29, 0x00 ; 0 + 1fd0a: dc 2f mov r29, r28 + 1fd0c: cc 27 eor r28, r28 + 1fd0e: 74 d0 rcall .+232 ; 0x1fdf8 + savelength = length; + desttype = getch(); + 1fd10: c8 2b or r28, r24 + 1fd12: 72 d0 rcall .+228 ; 0x1fdf8 + 1fd14: c8 2e mov r12, r24 + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t desttype; + uint8_t *bufPtr; + pagelen_t savelength; + + GETLENGTH(length); + 1fd16: 5e 01 movw r10, r28 + savelength = length; + desttype = getch(); + 1fd18: 81 2c mov r8, r1 + 1fd1a: 32 e0 ldi r19, 0x02 ; 2 + 1fd1c: 93 2e mov r9, r19 + + // read a page worth of contents + bufPtr = buff.bptr; + do *bufPtr++ = getch(); + 1fd1e: 6c d0 rcall .+216 ; 0x1fdf8 + 1fd20: f4 01 movw r30, r8 + 1fd22: 81 93 st Z+, r24 + 1fd24: 4f 01 movw r8, r30 + 1fd26: f1 e0 ldi r31, 0x01 ; 1 + while (--length); + 1fd28: af 1a sub r10, r31 + 1fd2a: b1 08 sbc r11, r1 + 1fd2c: c1 f7 brne .-16 ; 0x1fd1e + + // Read command terminator, start reply + verifySpace(); + 1fd2e: 76 d0 rcall .+236 ; 0x1fe1c + 1fd30: 85 e4 ldi r24, 0x45 ; 69 + * void writebuffer(memtype, buffer, address, length) + */ +static inline void writebuffer(int8_t memtype, addr16_t mybuff, + addr16_t address, pagelen_t len) +{ + switch (memtype) { + 1fd32: c8 12 cpse r12, r24 + 1fd34: 12 c0 rjmp .+36 ; 0x1fd5a + 1fd36: de 5f subi r29, 0xFE ; 254 + 1fd38: 48 01 movw r8, r16 + 1fd3a: a1 2c mov r10, r1 + 1fd3c: 92 e0 ldi r25, 0x02 ; 2 + 1fd3e: b9 2e mov r11, r25 + 1fd40: ac 16 cp r10, r28 + case 'E': // EEPROM +#if defined(SUPPORT_EEPROM) || defined(BIGBOOT) + while(len--) { + 1fd42: bd 06 cpc r11, r29 + 1fd44: 09 f4 brne .+2 ; 0x1fd48 + 1fd46: 4e c0 rjmp .+156 ; 0x1fde4 + 1fd48: f5 01 movw r30, r10 + eeprom_write_byte((address.bptr++), *(mybuff.bptr++)); + 1fd4a: 61 91 ld r22, Z+ + 1fd4c: 5f 01 movw r10, r30 + 1fd4e: c4 01 movw r24, r8 + 1fd50: 82 d0 rcall .+260 ; 0x1fe56 + 1fd52: ff ef ldi r31, 0xFF ; 255 + 1fd54: 8f 1a sub r8, r31 + 1fd56: 9f 0a sbc r9, r31 + 1fd58: f3 cf rjmp .-26 ; 0x1fd40 + 1fd5a: 83 e0 ldi r24, 0x03 ; 3 + 1fd5c: f8 01 movw r30, r16 + * Start the page erase and wait for it to finish. There + * used to be code to do this while receiving the data over + * the serial link, but the performance improvement was slight, + * and we needed the space back. + */ + __boot_page_erase_short(address.word); + 1fd5e: 87 bf out 0x37, r24 ; 55 + 1fd60: e8 95 spm + 1fd62: 07 b6 in r0, 0x37 ; 55 + 1fd64: 00 fc sbrc r0, 0 + boot_spm_busy_wait(); + 1fd66: fd cf rjmp .-6 ; 0x1fd62 + 1fd68: a0 e0 ldi r26, 0x00 ; 0 + 1fd6a: b2 e0 ldi r27, 0x02 ; 2 + 1fd6c: f8 01 movw r30, r16 + 1fd6e: 8d 91 ld r24, X+ + + /* + * Copy data from the buffer into the flash write buffer. + */ + do { + __boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++)); + 1fd70: 9d 91 ld r25, X+ + 1fd72: 0c 01 movw r0, r24 + 1fd74: f7 be out 0x37, r15 ; 55 + 1fd76: e8 95 spm + 1fd78: 11 24 eor r1, r1 + addrPtr += 2; + } while (len -= 2); + 1fd7a: 22 97 sbiw r28, 0x02 ; 2 + 1fd7c: 32 96 adiw r30, 0x02 ; 2 + 1fd7e: 20 97 sbiw r28, 0x00 ; 0 + + /* + * Actually Write the buffer to flash (and wait for it to finish.) + */ + __boot_page_write_short(address.word); + 1fd80: b1 f7 brne .-20 ; 0x1fd6e + 1fd82: f8 01 movw r30, r16 + 1fd84: e7 be out 0x37, r14 ; 55 + boot_spm_busy_wait(); + 1fd86: e8 95 spm +#if defined(RWWSRE) + // Reenable read access to flash + __boot_rww_enable_short(); + 1fd88: 07 b6 in r0, 0x37 ; 55 + 1fd8a: 00 fc sbrc r0, 0 + 1fd8c: fd cf rjmp .-6 ; 0x1fd88 + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + uint8_t desttype; + GETLENGTH(length); + 1fd8e: d7 be out 0x37, r13 ; 55 + 1fd90: e8 95 spm + 1fd92: 28 c0 rjmp .+80 ; 0x1fde4 + 1fd94: 31 d0 rcall .+98 ; 0x1fdf8 + 1fd96: c8 2f mov r28, r24 + 1fd98: d0 e0 ldi r29, 0x00 ; 0 + 1fd9a: dc 2f mov r29, r28 + 1fd9c: cc 27 eor r28, r28 + 1fd9e: 2c d0 rcall .+88 ; 0x1fdf8 + + desttype = getch(); + 1fda0: 5e 01 movw r10, r28 + 1fda2: a8 2a or r10, r24 + 1fda4: 29 d0 rcall .+82 ; 0x1fdf8 + + verifySpace(); + 1fda6: 98 2e mov r9, r24 + 1fda8: 39 d0 rcall .+114 ; 0x1fe1c + 1fdaa: e8 01 movw r28, r16 + +static inline void read_mem(uint8_t memtype, addr16_t address, pagelen_t length) +{ + uint8_t ch; + + switch (memtype) { + 1fdac: f5 e4 ldi r31, 0x45 ; 69 + +#if defined(SUPPORT_EEPROM) || defined(BIGBOOT) + case 'E': // EEPROM + do { + putch(eeprom_read_byte((address.bptr++))); + 1fdae: 9f 12 cpse r9, r31 + 1fdb0: 0b c0 rjmp .+22 ; 0x1fdc8 + 1fdb2: ce 01 movw r24, r28 + 1fdb4: 48 d0 rcall .+144 ; 0x1fe46 + } while (--length); + 1fdb6: 19 d0 rcall .+50 ; 0x1fdea + 1fdb8: 81 e0 ldi r24, 0x01 ; 1 + 1fdba: a8 1a sub r10, r24 + 1fdbc: b1 08 sbc r11, r1 + 1fdbe: 21 96 adiw r28, 0x01 ; 1 + 1fdc0: a1 14 cp r10, r1 + 1fdc2: b1 04 cpc r11, r1 + 1fdc4: b1 f7 brne .-20 ; 0x1fdb2 + // Since RAMPZ should already be set, we need to use EPLM directly. + // Also, we can use the autoincrement version of lpm to update "address" + // do putch(pgm_read_byte_near(address++)); + // while (--length); + // read a Flash and increment the address (may increment RAMPZ) + __asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address)); + 1fdc6: 0e c0 rjmp .+28 ; 0x1fde4 + 1fdc8: fe 01 movw r30, r28 + 1fdca: 87 91 elpm r24, Z+ +#else + // read a Flash byte and increment the address + __asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address)); +#endif + putch(ch); + 1fdcc: ef 01 movw r28, r30 + 1fdce: 0d d0 rcall .+26 ; 0x1fdea + } while (--length); + 1fdd0: e1 e0 ldi r30, 0x01 ; 1 + 1fdd2: ae 1a sub r10, r30 + 1fdd4: b1 08 sbc r11, r1 + 1fdd6: c1 f7 brne .-16 ; 0x1fdc8 + 1fdd8: 05 c0 rjmp .+10 ; 0x1fde4 + verifySpace(); + putch(SIGNATURE_0); + putch(SIGNATURE_1); + putch(SIGNATURE_2); + } + else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ + 1fdda: 81 35 cpi r24, 0x51 ; 81 + 1fddc: 11 f4 brne .+4 ; 0x1fde2 + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + 1fdde: 88 e0 ldi r24, 0x08 ; 8 + 1fde0: 17 d0 rcall .+46 ; 0x1fe10 + 1fde2: 1c d0 rcall .+56 ; 0x1fe1c + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + 1fde4: 80 e1 ldi r24, 0x10 ; 16 + 1fde6: 01 d0 rcall .+2 ; 0x1fdea + } + putch(STK_OK); + 1fde8: 43 cf rjmp .-378 ; 0x1fc70 + +0001fdea : + 1fdea: 90 91 c0 00 lds r25, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + } + 1fdee: 95 ff sbrs r25, 5 +} + +void putch(char ch) { +#ifndef SOFT_UART + while (!(UART_SRA & _BV(UDRE0))); + 1fdf0: fc cf rjmp .-8 ; 0x1fdea + UART_UDR = ch; + 1fdf2: 80 93 c6 00 sts 0x00C6, r24 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6> + 1fdf6: 08 95 ret + +0001fdf8 : + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UART_SRA & _BV(RXC0))) + 1fdf8: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + 1fdfc: 87 ff sbrs r24, 7 + 1fdfe: fc cf rjmp .-8 ; 0x1fdf8 + ; + if (!(UART_SRA & _BV(FE0))) { + 1fe00: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + 1fe04: 84 fd sbrc r24, 4 + 1fe06: 01 c0 rjmp .+2 ; 0x1fe0a +} +#endif + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 1fe08: a8 95 wdr + * don't care that an invalid char is returned...) + */ + watchdogReset(); + } + + ch = UART_UDR; + 1fe0a: 80 91 c6 00 lds r24, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6> + LED_PIN |= _BV(LED); +#endif +#endif + + return ch; +} + 1fe0e: 08 95 ret + +0001fe10 : + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + 1fe10: e0 e6 ldi r30, 0x60 ; 96 + 1fe12: f0 e0 ldi r31, 0x00 ; 0 + 1fe14: 98 e1 ldi r25, 0x18 ; 24 + 1fe16: 90 83 st Z, r25 + WDTCSR = x; + 1fe18: 80 83 st Z, r24 + 1fe1a: 08 95 ret + +0001fe1c : + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) { + 1fe1c: ed df rcall .-38 ; 0x1fdf8 + 1fe1e: 80 32 cpi r24, 0x20 ; 32 + 1fe20: 19 f0 breq .+6 ; 0x1fe28 + watchdogConfig(WATCHDOG_16MS); // shorten WD timeout + 1fe22: 88 e0 ldi r24, 0x08 ; 8 + 1fe24: f5 df rcall .-22 ; 0x1fe10 + 1fe26: ff cf rjmp .-2 ; 0x1fe26 + while (1) // and busy-loop so that WD causes + ; // a reset and app start. + } + putch(STK_INSYNC); + 1fe28: 84 e1 ldi r24, 0x14 ; 20 + 1fe2a: df cf rjmp .-66 ; 0x1fdea + +0001fe2c : + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + 1fe2c: cf 93 push r28 + 1fe2e: c8 2f mov r28, r24 + do getch(); while (--count); + 1fe30: e3 df rcall .-58 ; 0x1fdf8 + 1fe32: c1 50 subi r28, 0x01 ; 1 + 1fe34: e9 f7 brne .-6 ; 0x1fe30 + verifySpace(); + 1fe36: cf 91 pop r28 + 1fe38: f1 cf rjmp .-30 ; 0x1fe1c + +0001fe3a : + +void appStart(uint8_t rstFlags) { + // save the reset flags in the designated register + // This can be saved in a main program by putting code in .init0 (which + // executes before normal c init code) to save R2 to a global variable. + __asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags)); + 1fe3a: 28 2e mov r2, r24 + + watchdogConfig(WATCHDOG_OFF); + 1fe3c: 80 e0 ldi r24, 0x00 ; 0 + 1fe3e: e8 df rcall .-48 ; 0x1fe10 + 1fe40: e0 e0 ldi r30, 0x00 ; 0 + // Note that appstart_vec is defined so that this works with either + // real or virtual boot partitions. + __asm__ __volatile__ ( + 1fe42: ff 27 eor r31, r31 + 1fe44: 09 94 ijmp + +0001fe46 : + 1fe46: f9 99 sbic 0x1f, 1 ; 31 + 1fe48: fe cf rjmp .-4 ; 0x1fe46 + 1fe4a: 92 bd out 0x22, r25 ; 34 + 1fe4c: 81 bd out 0x21, r24 ; 33 + 1fe4e: f8 9a sbi 0x1f, 0 ; 31 + 1fe50: 99 27 eor r25, r25 + 1fe52: 80 b5 in r24, 0x20 ; 32 + 1fe54: 08 95 ret + +0001fe56 : + 1fe56: 26 2f mov r18, r22 + +0001fe58 : + 1fe58: f9 99 sbic 0x1f, 1 ; 31 + 1fe5a: fe cf rjmp .-4 ; 0x1fe58 + 1fe5c: 1f ba out 0x1f, r1 ; 31 + 1fe5e: 92 bd out 0x22, r25 ; 34 + 1fe60: 81 bd out 0x21, r24 ; 33 + 1fe62: 20 bd out 0x20, r18 ; 32 + 1fe64: 0f b6 in r0, 0x3f ; 63 + 1fe66: f8 94 cli + 1fe68: fa 9a sbi 0x1f, 2 ; 31 + 1fe6a: f9 9a sbi 0x1f, 1 ; 31 + 1fe6c: 0f be out 0x3f, r0 ; 63 + 1fe6e: 01 96 adiw r24, 0x01 ; 1 + 1fe70: 08 95 ret diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega328.hex b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega328.hex new file mode 100644 index 0000000..8e1e547 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega328.hex @@ -0,0 +1,31 @@ +:107E0000112484B7882349F0982F9A70923029F072 +:107E100081FF02C097EF94BFCCD085E080938100B2 +:107E200082E08093C00088E18093C10086E0809367 +:107E3000C20080E18093C4008EE0A6D0259A86E03F +:107E400020E33CEF91E0309385002093840096BBC3 +:107E5000B09BFECF1D9AA8954091C00047FD02C07F +:107E6000815089F7EE24E39495E0D92E21E1C22ECA +:107E70007FD0813461F47CD0182F8CD01238E9F097 +:107E8000113811F487E001C083E06BD067C0823401 +:107E900011F484E103C0853419F485E083D05EC019 +:107EA000853539F465D0C82F63D0D82FCC0FDD1FAE +:107EB00054C0863521F484E075D080E0E6CF843666 +:107EC00009F02EC055D054D0F82E52D0B82E00E074 +:107ED00011E04ED0F80181938F01FE12FACF5AD0F3 +:107EE000F5E4BF1201C0FFCF83E0FE0187BFE89534 +:107EF00007B600FCFDCFA0E0B1E0FE018D919D91A1 +:107F00000C01E7BEE89511243296FA12F7CFFE0174 +:107F1000D7BEE89507B600FCFDCFC7BEE8951EC0EA +:107F2000843771F425D024D0F82E22D033D08E019E +:107F3000F80185918F0115D0FA94F110F9CF0EC098 +:107F4000853739F427D08EE10CD085E90AD08FE04F +:107F50009CCF813511F488E017D01CD080E101D08E +:107F600087CF9091C00095FFFCCF8093C600089505 +:107F70008091C00087FFFCCF8091C00084FD01C0CC +:107F8000A8958091C6000895E0E6F0E098E190831E +:107F900080830895EDDF803219F088E0F5DFFFCFB0 +:107FA00084E1DFCFCF93C82FE3DFC150E9F7CF9152 +:0E7FB000F1CF282E80E0E8DFE0E0FF27099403 +:027FFE0000077A +:0400000300007E007B +:00000001FF diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega328.lst b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega328.lst new file mode 100644 index 0000000..f27d30c --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega328.lst @@ -0,0 +1,584 @@ + +optiboot_atmega328.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .data 00000000 00800100 00007fbe 00000252 2**0 + CONTENTS, ALLOC, LOAD, DATA + 1 .text 000001be 00007e00 00007e00 00000094 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 2 .version 00000002 00007ffe 00007ffe 00000252 2**0 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 3 .comment 0000002f 00000000 00000000 00000254 2**0 + CONTENTS, READONLY + 4 .debug_aranges 00000028 00000000 00000000 00000283 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .debug_info 000005c8 00000000 00000000 000002ab 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_abbrev 00000282 00000000 00000000 00000873 2**0 + CONTENTS, READONLY, DEBUGGING + 7 .debug_line 000002f9 00000000 00000000 00000af5 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_frame 0000008c 00000000 00000000 00000df0 2**2 + CONTENTS, READONLY, DEBUGGING + 9 .debug_str 000001fa 00000000 00000000 00000e7c 2**0 + CONTENTS, READONLY, DEBUGGING + 10 .debug_loc 00000331 00000000 00000000 00001076 2**0 + CONTENTS, READONLY, DEBUGGING + 11 .debug_ranges 00000060 00000000 00000000 000013a7 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00007e00
: + // SP points to RAMEND + // r1 contains zero + // + // If not, uncomment the following instructions: + // cli(); + asm volatile ("clr __zero_reg__"); + 7e00: 11 24 eor r1, r1 + * + * Code by MarkG55 + * see discusion in https://github.com/Optiboot/optiboot/issues/97 + */ +#if !defined(__AVR_ATmega16__) + ch = MCUSR; + 7e02: 84 b7 in r24, 0x34 ; 52 +#else + ch = MCUCSR; +#endif + // Skip all logic and run bootloader if MCUSR is cleared (application request) + if (ch != 0) { + 7e04: 88 23 and r24, r24 + 7e06: 49 f0 breq .+18 ; 0x7e1a + * 2. we clear WDRF if it's set with EXTRF to avoid loops + * One problematic scenario: broken application code sets watchdog timer + * without clearing MCUSR before and triggers it quickly. But it's + * recoverable by power-on with pushed reset button. + */ + if ((ch & (_BV(WDRF) | _BV(EXTRF))) != _BV(EXTRF)) { + 7e08: 98 2f mov r25, r24 + 7e0a: 9a 70 andi r25, 0x0A ; 10 + 7e0c: 92 30 cpi r25, 0x02 ; 2 + 7e0e: 29 f0 breq .+10 ; 0x7e1a + if (ch & _BV(EXTRF)) { + 7e10: 81 ff sbrs r24, 1 + 7e12: 02 c0 rjmp .+4 ; 0x7e18 + * prevent entering bootloader. + * '&' operation is skipped to spare few bytes as bits in MCUSR + * can only be cleared. + */ +#if !defined(__AVR_ATmega16__) + MCUSR = ~(_BV(WDRF)); + 7e14: 97 ef ldi r25, 0xF7 ; 247 + 7e16: 94 bf out 0x34, r25 ; 52 +#else + MCUCSR = ~(_BV(WDRF)); +#endif + } + appStart(ch); + 7e18: cc d0 rcall .+408 ; 0x7fb2 + } + } + +#if LED_START_FLASHES > 0 + // Set up Timer 1 for timeout counter + TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 + 7e1a: 85 e0 ldi r24, 0x05 ; 5 + 7e1c: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081> + UCSRA = _BV(U2X); //Double speed mode USART + UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx + UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1 + UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); +#else + UART_SRA = _BV(U2X0); //Double speed mode USART0 + 7e20: 82 e0 ldi r24, 0x02 ; 2 + 7e22: 80 93 c0 00 sts 0x00C0, r24 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + UART_SRB = _BV(RXEN0) | _BV(TXEN0); + 7e26: 88 e1 ldi r24, 0x18 ; 24 + 7e28: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7e00c1> + UART_SRC = _BV(UCSZ00) | _BV(UCSZ01); + 7e2c: 86 e0 ldi r24, 0x06 ; 6 + 7e2e: 80 93 c2 00 sts 0x00C2, r24 ; 0x8000c2 <__TEXT_REGION_LENGTH__+0x7e00c2> + UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); + 7e32: 80 e1 ldi r24, 0x10 ; 16 + 7e34: 80 93 c4 00 sts 0x00C4, r24 ; 0x8000c4 <__TEXT_REGION_LENGTH__+0x7e00c4> +#endif +#endif + + // Set up watchdog to trigger after 1s + watchdogConfig(WATCHDOG_1S); + 7e38: 8e e0 ldi r24, 0x0E ; 14 + 7e3a: a6 d0 rcall .+332 ; 0x7f88 + +#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) || defined(LED_START_ON) + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + 7e3c: 25 9a sbi 0x04, 5 ; 4 + 7e3e: 86 e0 ldi r24, 0x06 ; 6 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 7e40: 20 e3 ldi r18, 0x30 ; 48 + 7e42: 3c ef ldi r19, 0xFC ; 252 + TIFR1 = _BV(TOV1); + 7e44: 91 e0 ldi r25, 0x01 ; 1 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 7e46: 30 93 85 00 sts 0x0085, r19 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7e0085> + 7e4a: 20 93 84 00 sts 0x0084, r18 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7e0084> + TIFR1 = _BV(TOV1); + 7e4e: 96 bb out 0x16, r25 ; 22 + while(!(TIFR1 & _BV(TOV1))); + 7e50: b0 9b sbis 0x16, 0 ; 22 + 7e52: fe cf rjmp .-4 ; 0x7e50 +#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega16__) + LED_PORT ^= _BV(LED); +#else + LED_PIN |= _BV(LED); + 7e54: 1d 9a sbi 0x03, 5 ; 3 +} +#endif + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 7e56: a8 95 wdr + * While in theory, the STK500 initial commands would be buffered + * by the UART hardware, avrdude sends several attempts in rather + * quick succession, some of which will be lost and cause us to + * get out of sync. So if we see any data; stop blinking. + */ + if (UART_SRA & _BV(RXC0)) + 7e58: 40 91 c0 00 lds r20, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + 7e5c: 47 fd sbrc r20, 7 + 7e5e: 02 c0 rjmp .+4 ; 0x7e64 + 7e60: 81 50 subi r24, 0x01 ; 1 +#else +// This doesn't seem to work? +// if ((UART_PIN & (1< + + /* + * Copy data from the buffer into the flash write buffer. + */ + do { + __boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++)); + 7e64: ee 24 eor r14, r14 + 7e66: e3 94 inc r14 + } while (len -= 2); + + /* + * Actually Write the buffer to flash (and wait for it to finish.) + */ + __boot_page_write_short(address.word); + 7e68: 95 e0 ldi r25, 0x05 ; 5 + 7e6a: d9 2e mov r13, r25 + boot_spm_busy_wait(); +#if defined(RWWSRE) + // Reenable read access to flash + __boot_rww_enable_short(); + 7e6c: 21 e1 ldi r18, 0x11 ; 17 +#endif + + /* Forever loop: exits by causing WDT reset */ + for (;;) { + /* get character from UART */ + ch = getch(); + 7e6e: c2 2e mov r12, r18 + + if(ch == STK_GET_PARAMETER) { + 7e70: 7f d0 rcall .+254 ; 0x7f70 + unsigned char which = getch(); + 7e72: 81 34 cpi r24, 0x41 ; 65 + 7e74: 61 f4 brne .+24 ; 0x7e8e + 7e76: 7c d0 rcall .+248 ; 0x7f70 + verifySpace(); + 7e78: 18 2f mov r17, r24 + 7e7a: 8c d0 rcall .+280 ; 0x7f94 + /* + * Send optiboot version as "SW version" + * Note that the references to memory are optimized away. + */ + if (which == STK_SW_MINOR) { + 7e7c: 12 38 cpi r17, 0x82 ; 130 + 7e7e: e9 f0 breq .+58 ; 0x7eba + putch(optiboot_version & 0xFF); + } else if (which == STK_SW_MAJOR) { + 7e80: 11 38 cpi r17, 0x81 ; 129 + putch(optiboot_version >> 8); + 7e82: 11 f4 brne .+4 ; 0x7e88 + 7e84: 87 e0 ldi r24, 0x07 ; 7 + } else { + /* + * GET PARAMETER returns a generic 0x03 reply for + * other parameters - enough to keep Avrdude happy + */ + putch(0x03); + 7e86: 01 c0 rjmp .+2 ; 0x7e8a + 7e88: 83 e0 ldi r24, 0x03 ; 3 + 7e8a: 6b d0 rcall .+214 ; 0x7f62 + 7e8c: 67 c0 rjmp .+206 ; 0x7f5c + } + } + else if(ch == STK_SET_DEVICE) { + 7e8e: 82 34 cpi r24, 0x42 ; 66 + // SET DEVICE is ignored + getNch(20); + 7e90: 11 f4 brne .+4 ; 0x7e96 + 7e92: 84 e1 ldi r24, 0x14 ; 20 + } + else if(ch == STK_SET_DEVICE_EXT) { + 7e94: 03 c0 rjmp .+6 ; 0x7e9c + // SET DEVICE EXT is ignored + getNch(5); + 7e96: 85 34 cpi r24, 0x45 ; 69 + 7e98: 19 f4 brne .+6 ; 0x7ea0 + 7e9a: 85 e0 ldi r24, 0x05 ; 5 + } + else if(ch == STK_LOAD_ADDRESS) { + 7e9c: 83 d0 rcall .+262 ; 0x7fa4 + 7e9e: 5e c0 rjmp .+188 ; 0x7f5c + // LOAD ADDRESS + address.bytes[0] = getch(); + 7ea0: 85 35 cpi r24, 0x55 ; 85 + 7ea2: 39 f4 brne .+14 ; 0x7eb2 + 7ea4: 65 d0 rcall .+202 ; 0x7f70 + address.bytes[1] = getch(); + 7ea6: c8 2f mov r28, r24 + 7ea8: 63 d0 rcall .+198 ; 0x7f70 + } + else { + RAMPZ &= 0xFE; + } +#endif + address.word *= 2; // Convert from word address to byte address + 7eaa: d8 2f mov r29, r24 + 7eac: cc 0f add r28, r28 + 7eae: dd 1f adc r29, r29 + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + 7eb0: 54 c0 rjmp .+168 ; 0x7f5a + getNch(3); + putch(0x00); + } +#else + // UNIVERSAL command is ignored + getNch(4); + 7eb2: 86 35 cpi r24, 0x56 ; 86 + 7eb4: 21 f4 brne .+8 ; 0x7ebe + putch(0x00); + 7eb6: 84 e0 ldi r24, 0x04 ; 4 + 7eb8: 75 d0 rcall .+234 ; 0x7fa4 +#endif + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + 7eba: 80 e0 ldi r24, 0x00 ; 0 + 7ebc: e6 cf rjmp .-52 ; 0x7e8a + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t desttype; + uint8_t *bufPtr; + pagelen_t savelength; + + GETLENGTH(length); + 7ebe: 84 36 cpi r24, 0x64 ; 100 + 7ec0: 09 f0 breq .+2 ; 0x7ec4 + 7ec2: 2e c0 rjmp .+92 ; 0x7f20 + 7ec4: 55 d0 rcall .+170 ; 0x7f70 + savelength = length; + desttype = getch(); + 7ec6: 54 d0 rcall .+168 ; 0x7f70 + 7ec8: f8 2e mov r15, r24 + 7eca: 52 d0 rcall .+164 ; 0x7f70 + 7ecc: b8 2e mov r11, r24 + 7ece: 00 e0 ldi r16, 0x00 ; 0 + + // read a page worth of contents + bufPtr = buff.bptr; + do *bufPtr++ = getch(); + 7ed0: 11 e0 ldi r17, 0x01 ; 1 + 7ed2: 4e d0 rcall .+156 ; 0x7f70 + 7ed4: f8 01 movw r30, r16 + 7ed6: 81 93 st Z+, r24 + 7ed8: 8f 01 movw r16, r30 + while (--length); + 7eda: fe 12 cpse r15, r30 + 7edc: fa cf rjmp .-12 ; 0x7ed2 + + // Read command terminator, start reply + verifySpace(); + 7ede: 5a d0 rcall .+180 ; 0x7f94 + 7ee0: f5 e4 ldi r31, 0x45 ; 69 + * void writebuffer(memtype, buffer, address, length) + */ +static inline void writebuffer(int8_t memtype, addr16_t mybuff, + addr16_t address, pagelen_t len) +{ + switch (memtype) { + 7ee2: bf 12 cpse r11, r31 + 7ee4: 01 c0 rjmp .+2 ; 0x7ee8 + 7ee6: ff cf rjmp .-2 ; 0x7ee6 + 7ee8: 83 e0 ldi r24, 0x03 ; 3 + * Start the page erase and wait for it to finish. There + * used to be code to do this while receiving the data over + * the serial link, but the performance improvement was slight, + * and we needed the space back. + */ + __boot_page_erase_short(address.word); + 7eea: fe 01 movw r30, r28 + 7eec: 87 bf out 0x37, r24 ; 55 + 7eee: e8 95 spm + 7ef0: 07 b6 in r0, 0x37 ; 55 + boot_spm_busy_wait(); + 7ef2: 00 fc sbrc r0, 0 + 7ef4: fd cf rjmp .-6 ; 0x7ef0 + 7ef6: a0 e0 ldi r26, 0x00 ; 0 + 7ef8: b1 e0 ldi r27, 0x01 ; 1 + 7efa: fe 01 movw r30, r28 + 7efc: 8d 91 ld r24, X+ + + /* + * Copy data from the buffer into the flash write buffer. + */ + do { + __boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++)); + 7efe: 9d 91 ld r25, X+ + 7f00: 0c 01 movw r0, r24 + 7f02: e7 be out 0x37, r14 ; 55 + 7f04: e8 95 spm + 7f06: 11 24 eor r1, r1 + 7f08: 32 96 adiw r30, 0x02 ; 2 + addrPtr += 2; + } while (len -= 2); + 7f0a: fa 12 cpse r15, r26 + + /* + * Actually Write the buffer to flash (and wait for it to finish.) + */ + __boot_page_write_short(address.word); + 7f0c: f7 cf rjmp .-18 ; 0x7efc + 7f0e: fe 01 movw r30, r28 + boot_spm_busy_wait(); + 7f10: d7 be out 0x37, r13 ; 55 + 7f12: e8 95 spm +#if defined(RWWSRE) + // Reenable read access to flash + __boot_rww_enable_short(); + 7f14: 07 b6 in r0, 0x37 ; 55 + 7f16: 00 fc sbrc r0, 0 + 7f18: fd cf rjmp .-6 ; 0x7f14 + writebuffer(desttype, buff, address, savelength); + + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + 7f1a: c7 be out 0x37, r12 ; 55 + 7f1c: e8 95 spm + uint8_t desttype; + GETLENGTH(length); + 7f1e: 1e c0 rjmp .+60 ; 0x7f5c + 7f20: 84 37 cpi r24, 0x74 ; 116 + 7f22: 71 f4 brne .+28 ; 0x7f40 + + desttype = getch(); + 7f24: 25 d0 rcall .+74 ; 0x7f70 + + verifySpace(); + 7f26: 24 d0 rcall .+72 ; 0x7f70 + 7f28: f8 2e mov r15, r24 + 7f2a: 22 d0 rcall .+68 ; 0x7f70 + // while (--length); + // read a Flash and increment the address (may increment RAMPZ) + __asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address)); +#else + // read a Flash byte and increment the address + __asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address)); + 7f2c: 33 d0 rcall .+102 ; 0x7f94 + 7f2e: 8e 01 movw r16, r28 +#endif + putch(ch); + 7f30: f8 01 movw r30, r16 + } while (--length); + 7f32: 85 91 lpm r24, Z+ + 7f34: 8f 01 movw r16, r30 + 7f36: 15 d0 rcall .+42 ; 0x7f62 + 7f38: fa 94 dec r15 + + read_mem(desttype, address, length); + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + 7f3a: f1 10 cpse r15, r1 + 7f3c: f9 cf rjmp .-14 ; 0x7f30 + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + 7f3e: 0e c0 rjmp .+28 ; 0x7f5c + 7f40: 85 37 cpi r24, 0x75 ; 117 + putch(SIGNATURE_0); + 7f42: 39 f4 brne .+14 ; 0x7f52 + 7f44: 27 d0 rcall .+78 ; 0x7f94 + 7f46: 8e e1 ldi r24, 0x1E ; 30 + putch(SIGNATURE_1); + 7f48: 0c d0 rcall .+24 ; 0x7f62 + 7f4a: 85 e9 ldi r24, 0x95 ; 149 + 7f4c: 0a d0 rcall .+20 ; 0x7f62 + putch(SIGNATURE_2); + 7f4e: 8f e0 ldi r24, 0x0F ; 15 + 7f50: 9c cf rjmp .-200 ; 0x7e8a + } + else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ + 7f52: 81 35 cpi r24, 0x51 ; 81 + 7f54: 11 f4 brne .+4 ; 0x7f5a + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + 7f56: 88 e0 ldi r24, 0x08 ; 8 + 7f58: 17 d0 rcall .+46 ; 0x7f88 + 7f5a: 1c d0 rcall .+56 ; 0x7f94 + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + 7f5c: 80 e1 ldi r24, 0x10 ; 16 + 7f5e: 01 d0 rcall .+2 ; 0x7f62 + } + putch(STK_OK); + 7f60: 87 cf rjmp .-242 ; 0x7e70 + +00007f62 : + 7f62: 90 91 c0 00 lds r25, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + } + 7f66: 95 ff sbrs r25, 5 +} + +void putch(char ch) { +#ifndef SOFT_UART + while (!(UART_SRA & _BV(UDRE0))); + 7f68: fc cf rjmp .-8 ; 0x7f62 + UART_UDR = ch; + 7f6a: 80 93 c6 00 sts 0x00C6, r24 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6> + 7f6e: 08 95 ret + +00007f70 : + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UART_SRA & _BV(RXC0))) + 7f70: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + 7f74: 87 ff sbrs r24, 7 + 7f76: fc cf rjmp .-8 ; 0x7f70 + ; + if (!(UART_SRA & _BV(FE0))) { + 7f78: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + 7f7c: 84 fd sbrc r24, 4 + 7f7e: 01 c0 rjmp .+2 ; 0x7f82 +} +#endif + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 7f80: a8 95 wdr + * don't care that an invalid char is returned...) + */ + watchdogReset(); + } + + ch = UART_UDR; + 7f82: 80 91 c6 00 lds r24, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6> + LED_PIN |= _BV(LED); +#endif +#endif + + return ch; +} + 7f86: 08 95 ret + +00007f88 : + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + 7f88: e0 e6 ldi r30, 0x60 ; 96 + 7f8a: f0 e0 ldi r31, 0x00 ; 0 + 7f8c: 98 e1 ldi r25, 0x18 ; 24 + 7f8e: 90 83 st Z, r25 + WDTCSR = x; + 7f90: 80 83 st Z, r24 + 7f92: 08 95 ret + +00007f94 : + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) { + 7f94: ed df rcall .-38 ; 0x7f70 + 7f96: 80 32 cpi r24, 0x20 ; 32 + 7f98: 19 f0 breq .+6 ; 0x7fa0 + watchdogConfig(WATCHDOG_16MS); // shorten WD timeout + 7f9a: 88 e0 ldi r24, 0x08 ; 8 + 7f9c: f5 df rcall .-22 ; 0x7f88 + 7f9e: ff cf rjmp .-2 ; 0x7f9e + while (1) // and busy-loop so that WD causes + ; // a reset and app start. + } + putch(STK_INSYNC); + 7fa0: 84 e1 ldi r24, 0x14 ; 20 + 7fa2: df cf rjmp .-66 ; 0x7f62 + +00007fa4 : + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + 7fa4: cf 93 push r28 + 7fa6: c8 2f mov r28, r24 + do getch(); while (--count); + 7fa8: e3 df rcall .-58 ; 0x7f70 + 7faa: c1 50 subi r28, 0x01 ; 1 + 7fac: e9 f7 brne .-6 ; 0x7fa8 + verifySpace(); + 7fae: cf 91 pop r28 + 7fb0: f1 cf rjmp .-30 ; 0x7f94 + +00007fb2 : + +void appStart(uint8_t rstFlags) { + // save the reset flags in the designated register + // This can be saved in a main program by putting code in .init0 (which + // executes before normal c init code) to save R2 to a global variable. + __asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags)); + 7fb2: 28 2e mov r2, r24 + + watchdogConfig(WATCHDOG_OFF); + 7fb4: 80 e0 ldi r24, 0x00 ; 0 + 7fb6: e8 df rcall .-48 ; 0x7f88 + 7fb8: e0 e0 ldi r30, 0x00 ; 0 + // Note that appstart_vec is defined so that this works with either + // real or virtual boot partitions. + __asm__ __volatile__ ( + 7fba: ff 27 eor r31, r31 + 7fbc: 09 94 ijmp diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega644p.hex b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega644p.hex new file mode 100644 index 0000000..997a61c --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega644p.hex @@ -0,0 +1,40 @@ +:10FC0000112484B7882349F0982F9A70923029F0F4 +:10FC100081FF02C097EF94BFFBD085E08093810005 +:10FC200082E08093C00088E18093C10086E08093E9 +:10FC3000C20080E18093C4008EE0D5D0209A86E097 +:10FC400020E33CEF91E0309385002093840096BB45 +:10FC5000B09BFECF189AA8954091C00047FD02C006 +:10FC6000815089F7FF24F39455E0E52E61E1D62E0B +:10FC7000AED0813461F4ABD0C82FBBD0C238E9F02C +:10FC8000C13811F487E001C083E09AD096C0823475 +:10FC900011F484E103C0853419F485E0B2D08DC03D +:10FCA000853539F494D0082F92D0182F000F111FEA +:10FCB00083C0863521F484E0A4D080E0E6CF84368A +:10FCC00009F048C084D0C82FD0E0DC2FCC277FD0EB +:10FCD000C82B7DD0C82E5E01812C9924939477D0B7 +:10FCE000F40181934F01F1E0AF1AB108C1F781D05F +:10FCF00085E4C81212C0D3954801A12CBB24B3944B +:10FD0000AC16BD0609F459C0F50161915F01C4014B +:10FD10008DD0FFEF8F1A9F0AF3CF83E0F80187BFE2 +:10FD2000E89507B600FCFDCFA0E0B1E0F8018D91A9 +:10FD30009D910C01F7BEE8951124229732962097E9 +:10FD4000B1F7F801E7BEE89507B600FCFDCFD7BED6 +:10FD5000E89533C0843719F53AD0C82FD0E0DC2FAE +:10FD6000CC2735D05E01A82A32D0982E42D0E801A7 +:10FD7000F5E49F120BC0CE0151D022D081E0A81A29 +:10FD8000B1082196A114B104B1F717C0FE01859105 +:10FD9000EF0116D0E1E0AE1AB108C1F70EC0853709 +:10FDA00039F427D08EE10CD086E90AD08AE06DCFF5 +:10FDB000813511F488E017D01CD080E101D058CFF4 +:10FDC0009091C00095FFFCCF8093C600089580916C +:10FDD000C00087FFFCCF8091C00084FD01C0A895C2 +:10FDE0008091C6000895E0E6F0E098E1908380837A +:10FDF0000895EDDF803219F088E0F5DFFFCF84E170 +:10FE0000DFCFCF93C82FE3DFC150E9F7CF91F1CF18 +:10FE1000282E80E0E8DFE0E0FF270994F999FECF83 +:10FE200092BD81BDF89A992780B50895262FF9993A +:10FE3000FECF1FBA92BD81BD20BD0FB6F894FA9ACD +:08FE4000F99A0FBE0196089526 +:02FFFE000007FA +:040000030000FC00FD +:00000001FF diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega644p.lst b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega644p.lst new file mode 100644 index 0000000..2ba4775 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_atmega644p.lst @@ -0,0 +1,683 @@ + +optiboot_atmega644p.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .data 00000000 00800100 0000fe48 000002dc 2**0 + CONTENTS, ALLOC, LOAD, DATA + 1 .text 00000248 0000fc00 0000fc00 00000094 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 2 .version 00000002 0000fffe 0000fffe 000002dc 2**0 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 3 .comment 0000002f 00000000 00000000 000002de 2**0 + CONTENTS, READONLY + 4 .debug_aranges 00000028 00000000 00000000 0000030d 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .debug_info 00000625 00000000 00000000 00000335 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_abbrev 00000286 00000000 00000000 0000095a 2**0 + CONTENTS, READONLY, DEBUGGING + 7 .debug_line 0000035f 00000000 00000000 00000be0 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_frame 0000008c 00000000 00000000 00000f40 2**2 + CONTENTS, READONLY, DEBUGGING + 9 .debug_str 0000021d 00000000 00000000 00000fcc 2**0 + CONTENTS, READONLY, DEBUGGING + 10 .debug_loc 00000421 00000000 00000000 000011e9 2**0 + CONTENTS, READONLY, DEBUGGING + 11 .debug_ranges 00000060 00000000 00000000 0000160a 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +0000fc00
: + // SP points to RAMEND + // r1 contains zero + // + // If not, uncomment the following instructions: + // cli(); + asm volatile ("clr __zero_reg__"); + fc00: 11 24 eor r1, r1 + * + * Code by MarkG55 + * see discusion in https://github.com/Optiboot/optiboot/issues/97 + */ +#if !defined(__AVR_ATmega16__) + ch = MCUSR; + fc02: 84 b7 in r24, 0x34 ; 52 +#else + ch = MCUCSR; +#endif + // Skip all logic and run bootloader if MCUSR is cleared (application request) + if (ch != 0) { + fc04: 88 23 and r24, r24 + fc06: 49 f0 breq .+18 ; 0xfc1a + * 2. we clear WDRF if it's set with EXTRF to avoid loops + * One problematic scenario: broken application code sets watchdog timer + * without clearing MCUSR before and triggers it quickly. But it's + * recoverable by power-on with pushed reset button. + */ + if ((ch & (_BV(WDRF) | _BV(EXTRF))) != _BV(EXTRF)) { + fc08: 98 2f mov r25, r24 + fc0a: 9a 70 andi r25, 0x0A ; 10 + fc0c: 92 30 cpi r25, 0x02 ; 2 + fc0e: 29 f0 breq .+10 ; 0xfc1a + if (ch & _BV(EXTRF)) { + fc10: 81 ff sbrs r24, 1 + fc12: 02 c0 rjmp .+4 ; 0xfc18 + * prevent entering bootloader. + * '&' operation is skipped to spare few bytes as bits in MCUSR + * can only be cleared. + */ +#if !defined(__AVR_ATmega16__) + MCUSR = ~(_BV(WDRF)); + fc14: 97 ef ldi r25, 0xF7 ; 247 + fc16: 94 bf out 0x34, r25 ; 52 +#else + MCUCSR = ~(_BV(WDRF)); +#endif + } + appStart(ch); + fc18: fb d0 rcall .+502 ; 0xfe10 + } + } + +#if LED_START_FLASHES > 0 + // Set up Timer 1 for timeout counter + TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 + fc1a: 85 e0 ldi r24, 0x05 ; 5 + fc1c: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081> + UCSRA = _BV(U2X); //Double speed mode USART + UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx + UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1 + UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); +#else + UART_SRA = _BV(U2X0); //Double speed mode USART0 + fc20: 82 e0 ldi r24, 0x02 ; 2 + fc22: 80 93 c0 00 sts 0x00C0, r24 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + UART_SRB = _BV(RXEN0) | _BV(TXEN0); + fc26: 88 e1 ldi r24, 0x18 ; 24 + fc28: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7e00c1> + UART_SRC = _BV(UCSZ00) | _BV(UCSZ01); + fc2c: 86 e0 ldi r24, 0x06 ; 6 + fc2e: 80 93 c2 00 sts 0x00C2, r24 ; 0x8000c2 <__TEXT_REGION_LENGTH__+0x7e00c2> + UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); + fc32: 80 e1 ldi r24, 0x10 ; 16 + fc34: 80 93 c4 00 sts 0x00C4, r24 ; 0x8000c4 <__TEXT_REGION_LENGTH__+0x7e00c4> +#endif +#endif + + // Set up watchdog to trigger after 1s + watchdogConfig(WATCHDOG_1S); + fc38: 8e e0 ldi r24, 0x0E ; 14 + fc3a: d5 d0 rcall .+426 ; 0xfde6 + +#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) || defined(LED_START_ON) + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + fc3c: 20 9a sbi 0x04, 0 ; 4 + fc3e: 86 e0 ldi r24, 0x06 ; 6 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + fc40: 20 e3 ldi r18, 0x30 ; 48 + fc42: 3c ef ldi r19, 0xFC ; 252 + TIFR1 = _BV(TOV1); + fc44: 91 e0 ldi r25, 0x01 ; 1 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + fc46: 30 93 85 00 sts 0x0085, r19 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7e0085> + fc4a: 20 93 84 00 sts 0x0084, r18 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7e0084> + TIFR1 = _BV(TOV1); + fc4e: 96 bb out 0x16, r25 ; 22 + while(!(TIFR1 & _BV(TOV1))); + fc50: b0 9b sbis 0x16, 0 ; 22 + fc52: fe cf rjmp .-4 ; 0xfc50 +#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega16__) + LED_PORT ^= _BV(LED); +#else + LED_PIN |= _BV(LED); + fc54: 18 9a sbi 0x03, 0 ; 3 +} +#endif + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + fc56: a8 95 wdr + * While in theory, the STK500 initial commands would be buffered + * by the UART hardware, avrdude sends several attempts in rather + * quick succession, some of which will be lost and cause us to + * get out of sync. So if we see any data; stop blinking. + */ + if (UART_SRA & _BV(RXC0)) + fc58: 40 91 c0 00 lds r20, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + fc5c: 47 fd sbrc r20, 7 + fc5e: 02 c0 rjmp .+4 ; 0xfc64 + fc60: 81 50 subi r24, 0x01 ; 1 +#else +// This doesn't seem to work? +// if ((UART_PIN & (1< + + /* + * Copy data from the buffer into the flash write buffer. + */ + do { + __boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++)); + fc64: ff 24 eor r15, r15 + fc66: f3 94 inc r15 + } while (len -= 2); + + /* + * Actually Write the buffer to flash (and wait for it to finish.) + */ + __boot_page_write_short(address.word); + fc68: 55 e0 ldi r21, 0x05 ; 5 + fc6a: e5 2e mov r14, r21 + boot_spm_busy_wait(); +#if defined(RWWSRE) + // Reenable read access to flash + __boot_rww_enable_short(); + fc6c: 61 e1 ldi r22, 0x11 ; 17 +#endif + + /* Forever loop: exits by causing WDT reset */ + for (;;) { + /* get character from UART */ + ch = getch(); + fc6e: d6 2e mov r13, r22 + + if(ch == STK_GET_PARAMETER) { + fc70: ae d0 rcall .+348 ; 0xfdce + unsigned char which = getch(); + fc72: 81 34 cpi r24, 0x41 ; 65 + fc74: 61 f4 brne .+24 ; 0xfc8e + fc76: ab d0 rcall .+342 ; 0xfdce + verifySpace(); + fc78: c8 2f mov r28, r24 + fc7a: bb d0 rcall .+374 ; 0xfdf2 + /* + * Send optiboot version as "SW version" + * Note that the references to memory are optimized away. + */ + if (which == STK_SW_MINOR) { + fc7c: c2 38 cpi r28, 0x82 ; 130 + fc7e: e9 f0 breq .+58 ; 0xfcba + putch(optiboot_version & 0xFF); + } else if (which == STK_SW_MAJOR) { + fc80: c1 38 cpi r28, 0x81 ; 129 + putch(optiboot_version >> 8); + fc82: 11 f4 brne .+4 ; 0xfc88 + fc84: 87 e0 ldi r24, 0x07 ; 7 + } else { + /* + * GET PARAMETER returns a generic 0x03 reply for + * other parameters - enough to keep Avrdude happy + */ + putch(0x03); + fc86: 01 c0 rjmp .+2 ; 0xfc8a + fc88: 83 e0 ldi r24, 0x03 ; 3 + fc8a: 9a d0 rcall .+308 ; 0xfdc0 + fc8c: 96 c0 rjmp .+300 ; 0xfdba + } + } + else if(ch == STK_SET_DEVICE) { + fc8e: 82 34 cpi r24, 0x42 ; 66 + // SET DEVICE is ignored + getNch(20); + fc90: 11 f4 brne .+4 ; 0xfc96 + fc92: 84 e1 ldi r24, 0x14 ; 20 + } + else if(ch == STK_SET_DEVICE_EXT) { + fc94: 03 c0 rjmp .+6 ; 0xfc9c + // SET DEVICE EXT is ignored + getNch(5); + fc96: 85 34 cpi r24, 0x45 ; 69 + fc98: 19 f4 brne .+6 ; 0xfca0 + fc9a: 85 e0 ldi r24, 0x05 ; 5 + } + else if(ch == STK_LOAD_ADDRESS) { + fc9c: b2 d0 rcall .+356 ; 0xfe02 + fc9e: 8d c0 rjmp .+282 ; 0xfdba + // LOAD ADDRESS + address.bytes[0] = getch(); + fca0: 85 35 cpi r24, 0x55 ; 85 + fca2: 39 f4 brne .+14 ; 0xfcb2 + fca4: 94 d0 rcall .+296 ; 0xfdce + address.bytes[1] = getch(); + fca6: 08 2f mov r16, r24 + fca8: 92 d0 rcall .+292 ; 0xfdce + } + else { + RAMPZ &= 0xFE; + } +#endif + address.word *= 2; // Convert from word address to byte address + fcaa: 18 2f mov r17, r24 + fcac: 00 0f add r16, r16 + fcae: 11 1f adc r17, r17 + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + fcb0: 83 c0 rjmp .+262 ; 0xfdb8 + getNch(3); + putch(0x00); + } +#else + // UNIVERSAL command is ignored + getNch(4); + fcb2: 86 35 cpi r24, 0x56 ; 86 + fcb4: 21 f4 brne .+8 ; 0xfcbe + fcb6: 84 e0 ldi r24, 0x04 ; 4 + putch(0x00); + fcb8: a4 d0 rcall .+328 ; 0xfe02 +#endif + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + fcba: 80 e0 ldi r24, 0x00 ; 0 + fcbc: e6 cf rjmp .-52 ; 0xfc8a + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t desttype; + uint8_t *bufPtr; + pagelen_t savelength; + + GETLENGTH(length); + fcbe: 84 36 cpi r24, 0x64 ; 100 + fcc0: 09 f0 breq .+2 ; 0xfcc4 + fcc2: 48 c0 rjmp .+144 ; 0xfd54 + fcc4: 84 d0 rcall .+264 ; 0xfdce + fcc6: c8 2f mov r28, r24 + fcc8: d0 e0 ldi r29, 0x00 ; 0 + fcca: dc 2f mov r29, r28 + fccc: cc 27 eor r28, r28 + savelength = length; + desttype = getch(); + fcce: 7f d0 rcall .+254 ; 0xfdce + fcd0: c8 2b or r28, r24 + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t desttype; + uint8_t *bufPtr; + pagelen_t savelength; + + GETLENGTH(length); + fcd2: 7d d0 rcall .+250 ; 0xfdce + savelength = length; + desttype = getch(); + fcd4: c8 2e mov r12, r24 + fcd6: 5e 01 movw r10, r28 + fcd8: 81 2c mov r8, r1 + + // read a page worth of contents + bufPtr = buff.bptr; + do *bufPtr++ = getch(); + fcda: 99 24 eor r9, r9 + fcdc: 93 94 inc r9 + fcde: 77 d0 rcall .+238 ; 0xfdce + fce0: f4 01 movw r30, r8 + fce2: 81 93 st Z+, r24 + while (--length); + fce4: 4f 01 movw r8, r30 + fce6: f1 e0 ldi r31, 0x01 ; 1 + fce8: af 1a sub r10, r31 + fcea: b1 08 sbc r11, r1 + + // Read command terminator, start reply + verifySpace(); + fcec: c1 f7 brne .-16 ; 0xfcde + fcee: 81 d0 rcall .+258 ; 0xfdf2 + * void writebuffer(memtype, buffer, address, length) + */ +static inline void writebuffer(int8_t memtype, addr16_t mybuff, + addr16_t address, pagelen_t len) +{ + switch (memtype) { + fcf0: 85 e4 ldi r24, 0x45 ; 69 + fcf2: c8 12 cpse r12, r24 + fcf4: 12 c0 rjmp .+36 ; 0xfd1a + fcf6: d3 95 inc r29 + fcf8: 48 01 movw r8, r16 + fcfa: a1 2c mov r10, r1 + fcfc: bb 24 eor r11, r11 + case 'E': // EEPROM +#if defined(SUPPORT_EEPROM) || defined(BIGBOOT) + while(len--) { + fcfe: b3 94 inc r11 + fd00: ac 16 cp r10, r28 + fd02: bd 06 cpc r11, r29 + fd04: 09 f4 brne .+2 ; 0xfd08 + eeprom_write_byte((address.bptr++), *(mybuff.bptr++)); + fd06: 59 c0 rjmp .+178 ; 0xfdba + fd08: f5 01 movw r30, r10 + fd0a: 61 91 ld r22, Z+ + fd0c: 5f 01 movw r10, r30 + fd0e: c4 01 movw r24, r8 + fd10: 8d d0 rcall .+282 ; 0xfe2c + fd12: ff ef ldi r31, 0xFF ; 255 + fd14: 8f 1a sub r8, r31 + fd16: 9f 0a sbc r9, r31 + fd18: f3 cf rjmp .-26 ; 0xfd00 + * Start the page erase and wait for it to finish. There + * used to be code to do this while receiving the data over + * the serial link, but the performance improvement was slight, + * and we needed the space back. + */ + __boot_page_erase_short(address.word); + fd1a: 83 e0 ldi r24, 0x03 ; 3 + fd1c: f8 01 movw r30, r16 + fd1e: 87 bf out 0x37, r24 ; 55 + fd20: e8 95 spm + boot_spm_busy_wait(); + fd22: 07 b6 in r0, 0x37 ; 55 + fd24: 00 fc sbrc r0, 0 + fd26: fd cf rjmp .-6 ; 0xfd22 + fd28: a0 e0 ldi r26, 0x00 ; 0 + fd2a: b1 e0 ldi r27, 0x01 ; 1 + fd2c: f8 01 movw r30, r16 + + /* + * Copy data from the buffer into the flash write buffer. + */ + do { + __boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++)); + fd2e: 8d 91 ld r24, X+ + fd30: 9d 91 ld r25, X+ + fd32: 0c 01 movw r0, r24 + fd34: f7 be out 0x37, r15 ; 55 + fd36: e8 95 spm + addrPtr += 2; + } while (len -= 2); + fd38: 11 24 eor r1, r1 + fd3a: 22 97 sbiw r28, 0x02 ; 2 + fd3c: 32 96 adiw r30, 0x02 ; 2 + fd3e: 20 97 sbiw r28, 0x00 ; 0 + + /* + * Actually Write the buffer to flash (and wait for it to finish.) + */ + __boot_page_write_short(address.word); + fd40: b1 f7 brne .-20 ; 0xfd2e + fd42: f8 01 movw r30, r16 + boot_spm_busy_wait(); + fd44: e7 be out 0x37, r14 ; 55 + fd46: e8 95 spm +#if defined(RWWSRE) + // Reenable read access to flash + __boot_rww_enable_short(); + fd48: 07 b6 in r0, 0x37 ; 55 + fd4a: 00 fc sbrc r0, 0 + fd4c: fd cf rjmp .-6 ; 0xfd48 + writebuffer(desttype, buff, address, savelength); + + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + fd4e: d7 be out 0x37, r13 ; 55 + fd50: e8 95 spm + uint8_t desttype; + GETLENGTH(length); + fd52: 33 c0 rjmp .+102 ; 0xfdba + fd54: 84 37 cpi r24, 0x74 ; 116 + fd56: 19 f5 brne .+70 ; 0xfd9e + fd58: 3a d0 rcall .+116 ; 0xfdce + fd5a: c8 2f mov r28, r24 + fd5c: d0 e0 ldi r29, 0x00 ; 0 + fd5e: dc 2f mov r29, r28 + fd60: cc 27 eor r28, r28 + + desttype = getch(); + fd62: 35 d0 rcall .+106 ; 0xfdce + fd64: 5e 01 movw r10, r28 + fd66: a8 2a or r10, r24 + + verifySpace(); + fd68: 32 d0 rcall .+100 ; 0xfdce + fd6a: 98 2e mov r9, r24 + +static inline void read_mem(uint8_t memtype, addr16_t address, pagelen_t length) +{ + uint8_t ch; + + switch (memtype) { + fd6c: 42 d0 rcall .+132 ; 0xfdf2 + fd6e: e8 01 movw r28, r16 + fd70: f5 e4 ldi r31, 0x45 ; 69 + +#if defined(SUPPORT_EEPROM) || defined(BIGBOOT) + case 'E': // EEPROM + do { + putch(eeprom_read_byte((address.bptr++))); + fd72: 9f 12 cpse r9, r31 + fd74: 0b c0 rjmp .+22 ; 0xfd8c + fd76: ce 01 movw r24, r28 + fd78: 51 d0 rcall .+162 ; 0xfe1c + } while (--length); + fd7a: 22 d0 rcall .+68 ; 0xfdc0 + fd7c: 81 e0 ldi r24, 0x01 ; 1 + fd7e: a8 1a sub r10, r24 + fd80: b1 08 sbc r11, r1 + fd82: 21 96 adiw r28, 0x01 ; 1 + fd84: a1 14 cp r10, r1 + fd86: b1 04 cpc r11, r1 + // while (--length); + // read a Flash and increment the address (may increment RAMPZ) + __asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address)); +#else + // read a Flash byte and increment the address + __asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address)); + fd88: b1 f7 brne .-20 ; 0xfd76 + fd8a: 17 c0 rjmp .+46 ; 0xfdba +#endif + putch(ch); + fd8c: fe 01 movw r30, r28 + fd8e: 85 91 lpm r24, Z+ + } while (--length); + fd90: ef 01 movw r28, r30 + fd92: 16 d0 rcall .+44 ; 0xfdc0 + fd94: e1 e0 ldi r30, 0x01 ; 1 + fd96: ae 1a sub r10, r30 + fd98: b1 08 sbc r11, r1 + + read_mem(desttype, address, length); + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + fd9a: c1 f7 brne .-16 ; 0xfd8c + fd9c: 0e c0 rjmp .+28 ; 0xfdba + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + fd9e: 85 37 cpi r24, 0x75 ; 117 + fda0: 39 f4 brne .+14 ; 0xfdb0 + putch(SIGNATURE_0); + fda2: 27 d0 rcall .+78 ; 0xfdf2 + fda4: 8e e1 ldi r24, 0x1E ; 30 + fda6: 0c d0 rcall .+24 ; 0xfdc0 + putch(SIGNATURE_1); + fda8: 86 e9 ldi r24, 0x96 ; 150 + fdaa: 0a d0 rcall .+20 ; 0xfdc0 + fdac: 8a e0 ldi r24, 0x0A ; 10 + putch(SIGNATURE_2); + fdae: 6d cf rjmp .-294 ; 0xfc8a + fdb0: 81 35 cpi r24, 0x51 ; 81 + } + else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ + fdb2: 11 f4 brne .+4 ; 0xfdb8 + fdb4: 88 e0 ldi r24, 0x08 ; 8 + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + fdb6: 17 d0 rcall .+46 ; 0xfde6 + fdb8: 1c d0 rcall .+56 ; 0xfdf2 + fdba: 80 e1 ldi r24, 0x10 ; 16 + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + fdbc: 01 d0 rcall .+2 ; 0xfdc0 + fdbe: 58 cf rjmp .-336 ; 0xfc70 + +0000fdc0 : + } + putch(STK_OK); + fdc0: 90 91 c0 00 lds r25, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + fdc4: 95 ff sbrs r25, 5 + } + fdc6: fc cf rjmp .-8 ; 0xfdc0 +} + +void putch(char ch) { +#ifndef SOFT_UART + while (!(UART_SRA & _BV(UDRE0))); + UART_UDR = ch; + fdc8: 80 93 c6 00 sts 0x00C6, r24 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6> + fdcc: 08 95 ret + +0000fdce : + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UART_SRA & _BV(RXC0))) + fdce: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + fdd2: 87 ff sbrs r24, 7 + fdd4: fc cf rjmp .-8 ; 0xfdce + ; + if (!(UART_SRA & _BV(FE0))) { + fdd6: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + fdda: 84 fd sbrc r24, 4 + fddc: 01 c0 rjmp .+2 ; 0xfde0 +} +#endif + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + fdde: a8 95 wdr + * don't care that an invalid char is returned...) + */ + watchdogReset(); + } + + ch = UART_UDR; + fde0: 80 91 c6 00 lds r24, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6> + LED_PIN |= _BV(LED); +#endif +#endif + + return ch; +} + fde4: 08 95 ret + +0000fde6 : + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + fde6: e0 e6 ldi r30, 0x60 ; 96 + fde8: f0 e0 ldi r31, 0x00 ; 0 + fdea: 98 e1 ldi r25, 0x18 ; 24 + fdec: 90 83 st Z, r25 + WDTCSR = x; + fdee: 80 83 st Z, r24 + fdf0: 08 95 ret + +0000fdf2 : + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) { + fdf2: ed df rcall .-38 ; 0xfdce + fdf4: 80 32 cpi r24, 0x20 ; 32 + fdf6: 19 f0 breq .+6 ; 0xfdfe + watchdogConfig(WATCHDOG_16MS); // shorten WD timeout + fdf8: 88 e0 ldi r24, 0x08 ; 8 + fdfa: f5 df rcall .-22 ; 0xfde6 + fdfc: ff cf rjmp .-2 ; 0xfdfc + while (1) // and busy-loop so that WD causes + ; // a reset and app start. + } + putch(STK_INSYNC); + fdfe: 84 e1 ldi r24, 0x14 ; 20 + fe00: df cf rjmp .-66 ; 0xfdc0 + +0000fe02 : + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + fe02: cf 93 push r28 + fe04: c8 2f mov r28, r24 + do getch(); while (--count); + fe06: e3 df rcall .-58 ; 0xfdce + fe08: c1 50 subi r28, 0x01 ; 1 + fe0a: e9 f7 brne .-6 ; 0xfe06 + verifySpace(); + fe0c: cf 91 pop r28 + fe0e: f1 cf rjmp .-30 ; 0xfdf2 + +0000fe10 : + +void appStart(uint8_t rstFlags) { + // save the reset flags in the designated register + // This can be saved in a main program by putting code in .init0 (which + // executes before normal c init code) to save R2 to a global variable. + __asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags)); + fe10: 28 2e mov r2, r24 + + watchdogConfig(WATCHDOG_OFF); + fe12: 80 e0 ldi r24, 0x00 ; 0 + fe14: e8 df rcall .-48 ; 0xfde6 + fe16: e0 e0 ldi r30, 0x00 ; 0 + // Note that appstart_vec is defined so that this works with either + // real or virtual boot partitions. + __asm__ __volatile__ ( + fe18: ff 27 eor r31, r31 + fe1a: 09 94 ijmp + +0000fe1c : + fe1c: f9 99 sbic 0x1f, 1 ; 31 + fe1e: fe cf rjmp .-4 ; 0xfe1c + fe20: 92 bd out 0x22, r25 ; 34 + fe22: 81 bd out 0x21, r24 ; 33 + fe24: f8 9a sbi 0x1f, 0 ; 31 + fe26: 99 27 eor r25, r25 + fe28: 80 b5 in r24, 0x20 ; 32 + fe2a: 08 95 ret + +0000fe2c : + fe2c: 26 2f mov r18, r22 + +0000fe2e : + fe2e: f9 99 sbic 0x1f, 1 ; 31 + fe30: fe cf rjmp .-4 ; 0xfe2e + fe32: 1f ba out 0x1f, r1 ; 31 + fe34: 92 bd out 0x22, r25 ; 34 + fe36: 81 bd out 0x21, r24 ; 33 + fe38: 20 bd out 0x20, r18 ; 32 + fe3a: 0f b6 in r0, 0x3f ; 63 + fe3c: f8 94 cli + fe3e: fa 9a sbi 0x1f, 2 ; 31 + fe40: f9 9a sbi 0x1f, 1 ; 31 + fe42: 0f be out 0x3f, r0 ; 63 + fe44: 01 96 adiw r24, 0x01 ; 1 + fe46: 08 95 ret diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_diecimila.lst b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_diecimila.lst new file mode 100644 index 0000000..5cb1e03 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_diecimila.lst @@ -0,0 +1,584 @@ + +optiboot_atmega168.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .data 00000000 00800100 00003fbe 00000252 2**0 + CONTENTS, ALLOC, LOAD, DATA + 1 .text 000001be 00003e00 00003e00 00000094 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 2 .version 00000002 00003ffe 00003ffe 00000252 2**0 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 3 .comment 0000002f 00000000 00000000 00000254 2**0 + CONTENTS, READONLY + 4 .debug_aranges 00000028 00000000 00000000 00000283 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .debug_info 000005c8 00000000 00000000 000002ab 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_abbrev 00000282 00000000 00000000 00000873 2**0 + CONTENTS, READONLY, DEBUGGING + 7 .debug_line 000002f9 00000000 00000000 00000af5 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_frame 0000008c 00000000 00000000 00000df0 2**2 + CONTENTS, READONLY, DEBUGGING + 9 .debug_str 000001fa 00000000 00000000 00000e7c 2**0 + CONTENTS, READONLY, DEBUGGING + 10 .debug_loc 00000331 00000000 00000000 00001076 2**0 + CONTENTS, READONLY, DEBUGGING + 11 .debug_ranges 00000060 00000000 00000000 000013a7 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00003e00
: + // SP points to RAMEND + // r1 contains zero + // + // If not, uncomment the following instructions: + // cli(); + asm volatile ("clr __zero_reg__"); + 3e00: 11 24 eor r1, r1 + * + * Code by MarkG55 + * see discusion in https://github.com/Optiboot/optiboot/issues/97 + */ +#if !defined(__AVR_ATmega16__) + ch = MCUSR; + 3e02: 84 b7 in r24, 0x34 ; 52 +#else + ch = MCUCSR; +#endif + // Skip all logic and run bootloader if MCUSR is cleared (application request) + if (ch != 0) { + 3e04: 88 23 and r24, r24 + 3e06: 49 f0 breq .+18 ; 0x3e1a + * 2. we clear WDRF if it's set with EXTRF to avoid loops + * One problematic scenario: broken application code sets watchdog timer + * without clearing MCUSR before and triggers it quickly. But it's + * recoverable by power-on with pushed reset button. + */ + if ((ch & (_BV(WDRF) | _BV(EXTRF))) != _BV(EXTRF)) { + 3e08: 98 2f mov r25, r24 + 3e0a: 9a 70 andi r25, 0x0A ; 10 + 3e0c: 92 30 cpi r25, 0x02 ; 2 + 3e0e: 29 f0 breq .+10 ; 0x3e1a + if (ch & _BV(EXTRF)) { + 3e10: 81 ff sbrs r24, 1 + 3e12: 02 c0 rjmp .+4 ; 0x3e18 + * prevent entering bootloader. + * '&' operation is skipped to spare few bytes as bits in MCUSR + * can only be cleared. + */ +#if !defined(__AVR_ATmega16__) + MCUSR = ~(_BV(WDRF)); + 3e14: 97 ef ldi r25, 0xF7 ; 247 + 3e16: 94 bf out 0x34, r25 ; 52 +#else + MCUCSR = ~(_BV(WDRF)); +#endif + } + appStart(ch); + 3e18: cc d0 rcall .+408 ; 0x3fb2 + } + } + +#if LED_START_FLASHES > 0 + // Set up Timer 1 for timeout counter + TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 + 3e1a: 85 e0 ldi r24, 0x05 ; 5 + 3e1c: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081> + UCSRA = _BV(U2X); //Double speed mode USART + UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx + UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1 + UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); +#else + UART_SRA = _BV(U2X0); //Double speed mode USART0 + 3e20: 82 e0 ldi r24, 0x02 ; 2 + 3e22: 80 93 c0 00 sts 0x00C0, r24 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + UART_SRB = _BV(RXEN0) | _BV(TXEN0); + 3e26: 88 e1 ldi r24, 0x18 ; 24 + 3e28: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7e00c1> + UART_SRC = _BV(UCSZ00) | _BV(UCSZ01); + 3e2c: 86 e0 ldi r24, 0x06 ; 6 + 3e2e: 80 93 c2 00 sts 0x00C2, r24 ; 0x8000c2 <__TEXT_REGION_LENGTH__+0x7e00c2> + UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); + 3e32: 80 e1 ldi r24, 0x10 ; 16 + 3e34: 80 93 c4 00 sts 0x00C4, r24 ; 0x8000c4 <__TEXT_REGION_LENGTH__+0x7e00c4> +#endif +#endif + + // Set up watchdog to trigger after 1s + watchdogConfig(WATCHDOG_1S); + 3e38: 8e e0 ldi r24, 0x0E ; 14 + 3e3a: a6 d0 rcall .+332 ; 0x3f88 + +#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) || defined(LED_START_ON) + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + 3e3c: 25 9a sbi 0x04, 5 ; 4 + 3e3e: 86 e0 ldi r24, 0x06 ; 6 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e40: 20 e3 ldi r18, 0x30 ; 48 + 3e42: 3c ef ldi r19, 0xFC ; 252 + TIFR1 = _BV(TOV1); + 3e44: 91 e0 ldi r25, 0x01 ; 1 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e46: 30 93 85 00 sts 0x0085, r19 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7e0085> + 3e4a: 20 93 84 00 sts 0x0084, r18 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7e0084> + TIFR1 = _BV(TOV1); + 3e4e: 96 bb out 0x16, r25 ; 22 + while(!(TIFR1 & _BV(TOV1))); + 3e50: b0 9b sbis 0x16, 0 ; 22 + 3e52: fe cf rjmp .-4 ; 0x3e50 +#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega16__) + LED_PORT ^= _BV(LED); +#else + LED_PIN |= _BV(LED); + 3e54: 1d 9a sbi 0x03, 5 ; 3 +} +#endif + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3e56: a8 95 wdr + * While in theory, the STK500 initial commands would be buffered + * by the UART hardware, avrdude sends several attempts in rather + * quick succession, some of which will be lost and cause us to + * get out of sync. So if we see any data; stop blinking. + */ + if (UART_SRA & _BV(RXC0)) + 3e58: 40 91 c0 00 lds r20, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + 3e5c: 47 fd sbrc r20, 7 + 3e5e: 02 c0 rjmp .+4 ; 0x3e64 + 3e60: 81 50 subi r24, 0x01 ; 1 +#else +// This doesn't seem to work? +// if ((UART_PIN & (1< + + /* + * Copy data from the buffer into the flash write buffer. + */ + do { + __boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++)); + 3e64: ee 24 eor r14, r14 + 3e66: e3 94 inc r14 + } while (len -= 2); + + /* + * Actually Write the buffer to flash (and wait for it to finish.) + */ + __boot_page_write_short(address.word); + 3e68: 95 e0 ldi r25, 0x05 ; 5 + 3e6a: d9 2e mov r13, r25 + boot_spm_busy_wait(); +#if defined(RWWSRE) + // Reenable read access to flash + __boot_rww_enable_short(); + 3e6c: 21 e1 ldi r18, 0x11 ; 17 +#endif + + /* Forever loop: exits by causing WDT reset */ + for (;;) { + /* get character from UART */ + ch = getch(); + 3e6e: c2 2e mov r12, r18 + + if(ch == STK_GET_PARAMETER) { + 3e70: 7f d0 rcall .+254 ; 0x3f70 + unsigned char which = getch(); + 3e72: 81 34 cpi r24, 0x41 ; 65 + 3e74: 61 f4 brne .+24 ; 0x3e8e + 3e76: 7c d0 rcall .+248 ; 0x3f70 + verifySpace(); + 3e78: 18 2f mov r17, r24 + 3e7a: 8c d0 rcall .+280 ; 0x3f94 + /* + * Send optiboot version as "SW version" + * Note that the references to memory are optimized away. + */ + if (which == STK_SW_MINOR) { + 3e7c: 12 38 cpi r17, 0x82 ; 130 + 3e7e: e9 f0 breq .+58 ; 0x3eba + putch(optiboot_version & 0xFF); + } else if (which == STK_SW_MAJOR) { + 3e80: 11 38 cpi r17, 0x81 ; 129 + putch(optiboot_version >> 8); + 3e82: 11 f4 brne .+4 ; 0x3e88 + 3e84: 87 e0 ldi r24, 0x07 ; 7 + } else { + /* + * GET PARAMETER returns a generic 0x03 reply for + * other parameters - enough to keep Avrdude happy + */ + putch(0x03); + 3e86: 01 c0 rjmp .+2 ; 0x3e8a + 3e88: 83 e0 ldi r24, 0x03 ; 3 + 3e8a: 6b d0 rcall .+214 ; 0x3f62 + 3e8c: 67 c0 rjmp .+206 ; 0x3f5c + } + } + else if(ch == STK_SET_DEVICE) { + 3e8e: 82 34 cpi r24, 0x42 ; 66 + // SET DEVICE is ignored + getNch(20); + 3e90: 11 f4 brne .+4 ; 0x3e96 + 3e92: 84 e1 ldi r24, 0x14 ; 20 + } + else if(ch == STK_SET_DEVICE_EXT) { + 3e94: 03 c0 rjmp .+6 ; 0x3e9c + // SET DEVICE EXT is ignored + getNch(5); + 3e96: 85 34 cpi r24, 0x45 ; 69 + 3e98: 19 f4 brne .+6 ; 0x3ea0 + 3e9a: 85 e0 ldi r24, 0x05 ; 5 + } + else if(ch == STK_LOAD_ADDRESS) { + 3e9c: 83 d0 rcall .+262 ; 0x3fa4 + 3e9e: 5e c0 rjmp .+188 ; 0x3f5c + // LOAD ADDRESS + address.bytes[0] = getch(); + 3ea0: 85 35 cpi r24, 0x55 ; 85 + 3ea2: 39 f4 brne .+14 ; 0x3eb2 + 3ea4: 65 d0 rcall .+202 ; 0x3f70 + address.bytes[1] = getch(); + 3ea6: c8 2f mov r28, r24 + 3ea8: 63 d0 rcall .+198 ; 0x3f70 + } + else { + RAMPZ &= 0xFE; + } +#endif + address.word *= 2; // Convert from word address to byte address + 3eaa: d8 2f mov r29, r24 + 3eac: cc 0f add r28, r28 + 3eae: dd 1f adc r29, r29 + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + 3eb0: 54 c0 rjmp .+168 ; 0x3f5a + getNch(3); + putch(0x00); + } +#else + // UNIVERSAL command is ignored + getNch(4); + 3eb2: 86 35 cpi r24, 0x56 ; 86 + 3eb4: 21 f4 brne .+8 ; 0x3ebe + putch(0x00); + 3eb6: 84 e0 ldi r24, 0x04 ; 4 + 3eb8: 75 d0 rcall .+234 ; 0x3fa4 +#endif + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + 3eba: 80 e0 ldi r24, 0x00 ; 0 + 3ebc: e6 cf rjmp .-52 ; 0x3e8a + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t desttype; + uint8_t *bufPtr; + pagelen_t savelength; + + GETLENGTH(length); + 3ebe: 84 36 cpi r24, 0x64 ; 100 + 3ec0: 09 f0 breq .+2 ; 0x3ec4 + 3ec2: 2e c0 rjmp .+92 ; 0x3f20 + 3ec4: 55 d0 rcall .+170 ; 0x3f70 + savelength = length; + desttype = getch(); + 3ec6: 54 d0 rcall .+168 ; 0x3f70 + 3ec8: f8 2e mov r15, r24 + 3eca: 52 d0 rcall .+164 ; 0x3f70 + 3ecc: b8 2e mov r11, r24 + 3ece: 00 e0 ldi r16, 0x00 ; 0 + + // read a page worth of contents + bufPtr = buff.bptr; + do *bufPtr++ = getch(); + 3ed0: 11 e0 ldi r17, 0x01 ; 1 + 3ed2: 4e d0 rcall .+156 ; 0x3f70 + 3ed4: f8 01 movw r30, r16 + 3ed6: 81 93 st Z+, r24 + 3ed8: 8f 01 movw r16, r30 + while (--length); + 3eda: fe 12 cpse r15, r30 + 3edc: fa cf rjmp .-12 ; 0x3ed2 + + // Read command terminator, start reply + verifySpace(); + 3ede: 5a d0 rcall .+180 ; 0x3f94 + 3ee0: f5 e4 ldi r31, 0x45 ; 69 + * void writebuffer(memtype, buffer, address, length) + */ +static inline void writebuffer(int8_t memtype, addr16_t mybuff, + addr16_t address, pagelen_t len) +{ + switch (memtype) { + 3ee2: bf 12 cpse r11, r31 + 3ee4: 01 c0 rjmp .+2 ; 0x3ee8 + 3ee6: ff cf rjmp .-2 ; 0x3ee6 + 3ee8: 83 e0 ldi r24, 0x03 ; 3 + * Start the page erase and wait for it to finish. There + * used to be code to do this while receiving the data over + * the serial link, but the performance improvement was slight, + * and we needed the space back. + */ + __boot_page_erase_short(address.word); + 3eea: fe 01 movw r30, r28 + 3eec: 87 bf out 0x37, r24 ; 55 + 3eee: e8 95 spm + 3ef0: 07 b6 in r0, 0x37 ; 55 + boot_spm_busy_wait(); + 3ef2: 00 fc sbrc r0, 0 + 3ef4: fd cf rjmp .-6 ; 0x3ef0 + 3ef6: a0 e0 ldi r26, 0x00 ; 0 + 3ef8: b1 e0 ldi r27, 0x01 ; 1 + 3efa: fe 01 movw r30, r28 + 3efc: 8d 91 ld r24, X+ + + /* + * Copy data from the buffer into the flash write buffer. + */ + do { + __boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++)); + 3efe: 9d 91 ld r25, X+ + 3f00: 0c 01 movw r0, r24 + 3f02: e7 be out 0x37, r14 ; 55 + 3f04: e8 95 spm + 3f06: 11 24 eor r1, r1 + 3f08: 32 96 adiw r30, 0x02 ; 2 + addrPtr += 2; + } while (len -= 2); + 3f0a: fa 12 cpse r15, r26 + + /* + * Actually Write the buffer to flash (and wait for it to finish.) + */ + __boot_page_write_short(address.word); + 3f0c: f7 cf rjmp .-18 ; 0x3efc + 3f0e: fe 01 movw r30, r28 + boot_spm_busy_wait(); + 3f10: d7 be out 0x37, r13 ; 55 + 3f12: e8 95 spm +#if defined(RWWSRE) + // Reenable read access to flash + __boot_rww_enable_short(); + 3f14: 07 b6 in r0, 0x37 ; 55 + 3f16: 00 fc sbrc r0, 0 + 3f18: fd cf rjmp .-6 ; 0x3f14 + writebuffer(desttype, buff, address, savelength); + + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + 3f1a: c7 be out 0x37, r12 ; 55 + 3f1c: e8 95 spm + uint8_t desttype; + GETLENGTH(length); + 3f1e: 1e c0 rjmp .+60 ; 0x3f5c + 3f20: 84 37 cpi r24, 0x74 ; 116 + 3f22: 71 f4 brne .+28 ; 0x3f40 + + desttype = getch(); + 3f24: 25 d0 rcall .+74 ; 0x3f70 + + verifySpace(); + 3f26: 24 d0 rcall .+72 ; 0x3f70 + 3f28: f8 2e mov r15, r24 + 3f2a: 22 d0 rcall .+68 ; 0x3f70 + // while (--length); + // read a Flash and increment the address (may increment RAMPZ) + __asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address)); +#else + // read a Flash byte and increment the address + __asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address)); + 3f2c: 33 d0 rcall .+102 ; 0x3f94 + 3f2e: 8e 01 movw r16, r28 +#endif + putch(ch); + 3f30: f8 01 movw r30, r16 + } while (--length); + 3f32: 85 91 lpm r24, Z+ + 3f34: 8f 01 movw r16, r30 + 3f36: 15 d0 rcall .+42 ; 0x3f62 + 3f38: fa 94 dec r15 + + read_mem(desttype, address, length); + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + 3f3a: f1 10 cpse r15, r1 + 3f3c: f9 cf rjmp .-14 ; 0x3f30 + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + 3f3e: 0e c0 rjmp .+28 ; 0x3f5c + 3f40: 85 37 cpi r24, 0x75 ; 117 + putch(SIGNATURE_0); + 3f42: 39 f4 brne .+14 ; 0x3f52 + 3f44: 27 d0 rcall .+78 ; 0x3f94 + 3f46: 8e e1 ldi r24, 0x1E ; 30 + putch(SIGNATURE_1); + 3f48: 0c d0 rcall .+24 ; 0x3f62 + 3f4a: 84 e9 ldi r24, 0x94 ; 148 + 3f4c: 0a d0 rcall .+20 ; 0x3f62 + putch(SIGNATURE_2); + 3f4e: 86 e0 ldi r24, 0x06 ; 6 + 3f50: 9c cf rjmp .-200 ; 0x3e8a + } + else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ + 3f52: 81 35 cpi r24, 0x51 ; 81 + 3f54: 11 f4 brne .+4 ; 0x3f5a + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + 3f56: 88 e0 ldi r24, 0x08 ; 8 + 3f58: 17 d0 rcall .+46 ; 0x3f88 + 3f5a: 1c d0 rcall .+56 ; 0x3f94 + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + 3f5c: 80 e1 ldi r24, 0x10 ; 16 + 3f5e: 01 d0 rcall .+2 ; 0x3f62 + } + putch(STK_OK); + 3f60: 87 cf rjmp .-242 ; 0x3e70 + +00003f62 : + 3f62: 90 91 c0 00 lds r25, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + } + 3f66: 95 ff sbrs r25, 5 +} + +void putch(char ch) { +#ifndef SOFT_UART + while (!(UART_SRA & _BV(UDRE0))); + 3f68: fc cf rjmp .-8 ; 0x3f62 + UART_UDR = ch; + 3f6a: 80 93 c6 00 sts 0x00C6, r24 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6> + 3f6e: 08 95 ret + +00003f70 : + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UART_SRA & _BV(RXC0))) + 3f70: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + 3f74: 87 ff sbrs r24, 7 + 3f76: fc cf rjmp .-8 ; 0x3f70 + ; + if (!(UART_SRA & _BV(FE0))) { + 3f78: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + 3f7c: 84 fd sbrc r24, 4 + 3f7e: 01 c0 rjmp .+2 ; 0x3f82 +} +#endif + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3f80: a8 95 wdr + * don't care that an invalid char is returned...) + */ + watchdogReset(); + } + + ch = UART_UDR; + 3f82: 80 91 c6 00 lds r24, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6> + LED_PIN |= _BV(LED); +#endif +#endif + + return ch; +} + 3f86: 08 95 ret + +00003f88 : + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + 3f88: e0 e6 ldi r30, 0x60 ; 96 + 3f8a: f0 e0 ldi r31, 0x00 ; 0 + 3f8c: 98 e1 ldi r25, 0x18 ; 24 + 3f8e: 90 83 st Z, r25 + WDTCSR = x; + 3f90: 80 83 st Z, r24 + 3f92: 08 95 ret + +00003f94 : + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) { + 3f94: ed df rcall .-38 ; 0x3f70 + 3f96: 80 32 cpi r24, 0x20 ; 32 + 3f98: 19 f0 breq .+6 ; 0x3fa0 + watchdogConfig(WATCHDOG_16MS); // shorten WD timeout + 3f9a: 88 e0 ldi r24, 0x08 ; 8 + 3f9c: f5 df rcall .-22 ; 0x3f88 + 3f9e: ff cf rjmp .-2 ; 0x3f9e + while (1) // and busy-loop so that WD causes + ; // a reset and app start. + } + putch(STK_INSYNC); + 3fa0: 84 e1 ldi r24, 0x14 ; 20 + 3fa2: df cf rjmp .-66 ; 0x3f62 + +00003fa4 : + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + 3fa4: cf 93 push r28 + 3fa6: c8 2f mov r28, r24 + do getch(); while (--count); + 3fa8: e3 df rcall .-58 ; 0x3f70 + 3faa: c1 50 subi r28, 0x01 ; 1 + 3fac: e9 f7 brne .-6 ; 0x3fa8 + verifySpace(); + 3fae: cf 91 pop r28 + 3fb0: f1 cf rjmp .-30 ; 0x3f94 + +00003fb2 : + +void appStart(uint8_t rstFlags) { + // save the reset flags in the designated register + // This can be saved in a main program by putting code in .init0 (which + // executes before normal c init code) to save R2 to a global variable. + __asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags)); + 3fb2: 28 2e mov r2, r24 + + watchdogConfig(WATCHDOG_OFF); + 3fb4: 80 e0 ldi r24, 0x00 ; 0 + 3fb6: e8 df rcall .-48 ; 0x3f88 + 3fb8: e0 e0 ldi r30, 0x00 ; 0 + // Note that appstart_vec is defined so that this works with either + // real or virtual boot partitions. + __asm__ __volatile__ ( + 3fba: ff 27 eor r31, r31 + 3fbc: 09 94 ijmp diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_lilypad.hex b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_lilypad.hex new file mode 100644 index 0000000..8503bb3 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_lilypad.hex @@ -0,0 +1,31 @@ +:103E0000112484B7882349F0982F9A70923029F0B2 +:103E100081FF02C097EF94BFCCD085E080938100F2 +:103E200082E08093C00088E18093C10086E08093A7 +:103E3000C20088E08093C4008EE0A6D0259A86E078 +:103E400028E13EEF91E0309385002093840096BBFB +:103E5000B09BFECF1D9AA8954091C00047FD02C0BF +:103E6000815089F7EE24E39495E0D92E21E1C22E0A +:103E70007FD0813461F47CD0182F8CD01238E9F0D7 +:103E8000113811F487E001C083E06BD067C0823441 +:103E900011F484E103C0853419F485E083D05EC059 +:103EA000853539F465D0C82F63D0D82FCC0FDD1FEE +:103EB00054C0863521F484E075D080E0E6CF8436A6 +:103EC00009F02EC055D054D0F82E52D0B82E00E0B4 +:103ED00011E04ED0F80181938F01FE12FACF5AD033 +:103EE000F5E4BF1201C0FFCF83E0FE0187BFE89574 +:103EF00007B600FCFDCFA0E0B1E0FE018D919D91E1 +:103F00000C01E7BEE89511243296FA12F7CFFE01B4 +:103F1000D7BEE89507B600FCFDCFC7BEE8951EC02A +:103F2000843771F425D024D0F82E22D033D08E01DE +:103F3000F80185918F0115D0FA94F110F9CF0EC0D8 +:103F4000853739F427D08EE10CD084E90AD086E099 +:103F50009CCF813511F488E017D01CD080E101D0CE +:103F600087CF9091C00095FFFCCF8093C600089545 +:103F70008091C00087FFFCCF8091C00084FD01C00C +:103F8000A8958091C6000895E0E6F0E098E190835E +:103F900080830895EDDF803219F088E0F5DFFFCFF0 +:103FA00084E1DFCFCF93C82FE3DFC150E9F7CF9192 +:0E3FB000F1CF282E80E0E8DFE0E0FF27099443 +:023FFE000007BA +:0400000300003E00BB +:00000001FF diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_lilypad.lst b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_lilypad.lst new file mode 100644 index 0000000..c92490b --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_lilypad.lst @@ -0,0 +1,584 @@ + +optiboot_atmega168.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .data 00000000 00800100 00003fbe 00000252 2**0 + CONTENTS, ALLOC, LOAD, DATA + 1 .text 000001be 00003e00 00003e00 00000094 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 2 .version 00000002 00003ffe 00003ffe 00000252 2**0 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 3 .comment 0000002f 00000000 00000000 00000254 2**0 + CONTENTS, READONLY + 4 .debug_aranges 00000028 00000000 00000000 00000283 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .debug_info 000005c8 00000000 00000000 000002ab 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_abbrev 00000282 00000000 00000000 00000873 2**0 + CONTENTS, READONLY, DEBUGGING + 7 .debug_line 000002f9 00000000 00000000 00000af5 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_frame 0000008c 00000000 00000000 00000df0 2**2 + CONTENTS, READONLY, DEBUGGING + 9 .debug_str 000001fa 00000000 00000000 00000e7c 2**0 + CONTENTS, READONLY, DEBUGGING + 10 .debug_loc 00000331 00000000 00000000 00001076 2**0 + CONTENTS, READONLY, DEBUGGING + 11 .debug_ranges 00000060 00000000 00000000 000013a7 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00003e00
: + // SP points to RAMEND + // r1 contains zero + // + // If not, uncomment the following instructions: + // cli(); + asm volatile ("clr __zero_reg__"); + 3e00: 11 24 eor r1, r1 + * + * Code by MarkG55 + * see discusion in https://github.com/Optiboot/optiboot/issues/97 + */ +#if !defined(__AVR_ATmega16__) + ch = MCUSR; + 3e02: 84 b7 in r24, 0x34 ; 52 +#else + ch = MCUCSR; +#endif + // Skip all logic and run bootloader if MCUSR is cleared (application request) + if (ch != 0) { + 3e04: 88 23 and r24, r24 + 3e06: 49 f0 breq .+18 ; 0x3e1a + * 2. we clear WDRF if it's set with EXTRF to avoid loops + * One problematic scenario: broken application code sets watchdog timer + * without clearing MCUSR before and triggers it quickly. But it's + * recoverable by power-on with pushed reset button. + */ + if ((ch & (_BV(WDRF) | _BV(EXTRF))) != _BV(EXTRF)) { + 3e08: 98 2f mov r25, r24 + 3e0a: 9a 70 andi r25, 0x0A ; 10 + 3e0c: 92 30 cpi r25, 0x02 ; 2 + 3e0e: 29 f0 breq .+10 ; 0x3e1a + if (ch & _BV(EXTRF)) { + 3e10: 81 ff sbrs r24, 1 + 3e12: 02 c0 rjmp .+4 ; 0x3e18 + * prevent entering bootloader. + * '&' operation is skipped to spare few bytes as bits in MCUSR + * can only be cleared. + */ +#if !defined(__AVR_ATmega16__) + MCUSR = ~(_BV(WDRF)); + 3e14: 97 ef ldi r25, 0xF7 ; 247 + 3e16: 94 bf out 0x34, r25 ; 52 +#else + MCUCSR = ~(_BV(WDRF)); +#endif + } + appStart(ch); + 3e18: cc d0 rcall .+408 ; 0x3fb2 + } + } + +#if LED_START_FLASHES > 0 + // Set up Timer 1 for timeout counter + TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 + 3e1a: 85 e0 ldi r24, 0x05 ; 5 + 3e1c: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081> + UCSRA = _BV(U2X); //Double speed mode USART + UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx + UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1 + UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); +#else + UART_SRA = _BV(U2X0); //Double speed mode USART0 + 3e20: 82 e0 ldi r24, 0x02 ; 2 + 3e22: 80 93 c0 00 sts 0x00C0, r24 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + UART_SRB = _BV(RXEN0) | _BV(TXEN0); + 3e26: 88 e1 ldi r24, 0x18 ; 24 + 3e28: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7e00c1> + UART_SRC = _BV(UCSZ00) | _BV(UCSZ01); + 3e2c: 86 e0 ldi r24, 0x06 ; 6 + 3e2e: 80 93 c2 00 sts 0x00C2, r24 ; 0x8000c2 <__TEXT_REGION_LENGTH__+0x7e00c2> + UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); + 3e32: 88 e0 ldi r24, 0x08 ; 8 + 3e34: 80 93 c4 00 sts 0x00C4, r24 ; 0x8000c4 <__TEXT_REGION_LENGTH__+0x7e00c4> +#endif +#endif + + // Set up watchdog to trigger after 1s + watchdogConfig(WATCHDOG_1S); + 3e38: 8e e0 ldi r24, 0x0E ; 14 + 3e3a: a6 d0 rcall .+332 ; 0x3f88 + +#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) || defined(LED_START_ON) + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + 3e3c: 25 9a sbi 0x04, 5 ; 4 + 3e3e: 86 e0 ldi r24, 0x06 ; 6 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e40: 28 e1 ldi r18, 0x18 ; 24 + 3e42: 3e ef ldi r19, 0xFE ; 254 + TIFR1 = _BV(TOV1); + 3e44: 91 e0 ldi r25, 0x01 ; 1 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e46: 30 93 85 00 sts 0x0085, r19 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7e0085> + 3e4a: 20 93 84 00 sts 0x0084, r18 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7e0084> + TIFR1 = _BV(TOV1); + 3e4e: 96 bb out 0x16, r25 ; 22 + while(!(TIFR1 & _BV(TOV1))); + 3e50: b0 9b sbis 0x16, 0 ; 22 + 3e52: fe cf rjmp .-4 ; 0x3e50 +#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega16__) + LED_PORT ^= _BV(LED); +#else + LED_PIN |= _BV(LED); + 3e54: 1d 9a sbi 0x03, 5 ; 3 +} +#endif + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3e56: a8 95 wdr + * While in theory, the STK500 initial commands would be buffered + * by the UART hardware, avrdude sends several attempts in rather + * quick succession, some of which will be lost and cause us to + * get out of sync. So if we see any data; stop blinking. + */ + if (UART_SRA & _BV(RXC0)) + 3e58: 40 91 c0 00 lds r20, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + 3e5c: 47 fd sbrc r20, 7 + 3e5e: 02 c0 rjmp .+4 ; 0x3e64 + 3e60: 81 50 subi r24, 0x01 ; 1 +#else +// This doesn't seem to work? +// if ((UART_PIN & (1< + + /* + * Copy data from the buffer into the flash write buffer. + */ + do { + __boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++)); + 3e64: ee 24 eor r14, r14 + 3e66: e3 94 inc r14 + } while (len -= 2); + + /* + * Actually Write the buffer to flash (and wait for it to finish.) + */ + __boot_page_write_short(address.word); + 3e68: 95 e0 ldi r25, 0x05 ; 5 + 3e6a: d9 2e mov r13, r25 + boot_spm_busy_wait(); +#if defined(RWWSRE) + // Reenable read access to flash + __boot_rww_enable_short(); + 3e6c: 21 e1 ldi r18, 0x11 ; 17 +#endif + + /* Forever loop: exits by causing WDT reset */ + for (;;) { + /* get character from UART */ + ch = getch(); + 3e6e: c2 2e mov r12, r18 + + if(ch == STK_GET_PARAMETER) { + 3e70: 7f d0 rcall .+254 ; 0x3f70 + unsigned char which = getch(); + 3e72: 81 34 cpi r24, 0x41 ; 65 + 3e74: 61 f4 brne .+24 ; 0x3e8e + 3e76: 7c d0 rcall .+248 ; 0x3f70 + verifySpace(); + 3e78: 18 2f mov r17, r24 + 3e7a: 8c d0 rcall .+280 ; 0x3f94 + /* + * Send optiboot version as "SW version" + * Note that the references to memory are optimized away. + */ + if (which == STK_SW_MINOR) { + 3e7c: 12 38 cpi r17, 0x82 ; 130 + 3e7e: e9 f0 breq .+58 ; 0x3eba + putch(optiboot_version & 0xFF); + } else if (which == STK_SW_MAJOR) { + 3e80: 11 38 cpi r17, 0x81 ; 129 + putch(optiboot_version >> 8); + 3e82: 11 f4 brne .+4 ; 0x3e88 + 3e84: 87 e0 ldi r24, 0x07 ; 7 + } else { + /* + * GET PARAMETER returns a generic 0x03 reply for + * other parameters - enough to keep Avrdude happy + */ + putch(0x03); + 3e86: 01 c0 rjmp .+2 ; 0x3e8a + 3e88: 83 e0 ldi r24, 0x03 ; 3 + 3e8a: 6b d0 rcall .+214 ; 0x3f62 + 3e8c: 67 c0 rjmp .+206 ; 0x3f5c + } + } + else if(ch == STK_SET_DEVICE) { + 3e8e: 82 34 cpi r24, 0x42 ; 66 + // SET DEVICE is ignored + getNch(20); + 3e90: 11 f4 brne .+4 ; 0x3e96 + 3e92: 84 e1 ldi r24, 0x14 ; 20 + } + else if(ch == STK_SET_DEVICE_EXT) { + 3e94: 03 c0 rjmp .+6 ; 0x3e9c + // SET DEVICE EXT is ignored + getNch(5); + 3e96: 85 34 cpi r24, 0x45 ; 69 + 3e98: 19 f4 brne .+6 ; 0x3ea0 + 3e9a: 85 e0 ldi r24, 0x05 ; 5 + } + else if(ch == STK_LOAD_ADDRESS) { + 3e9c: 83 d0 rcall .+262 ; 0x3fa4 + 3e9e: 5e c0 rjmp .+188 ; 0x3f5c + // LOAD ADDRESS + address.bytes[0] = getch(); + 3ea0: 85 35 cpi r24, 0x55 ; 85 + 3ea2: 39 f4 brne .+14 ; 0x3eb2 + 3ea4: 65 d0 rcall .+202 ; 0x3f70 + address.bytes[1] = getch(); + 3ea6: c8 2f mov r28, r24 + 3ea8: 63 d0 rcall .+198 ; 0x3f70 + } + else { + RAMPZ &= 0xFE; + } +#endif + address.word *= 2; // Convert from word address to byte address + 3eaa: d8 2f mov r29, r24 + 3eac: cc 0f add r28, r28 + 3eae: dd 1f adc r29, r29 + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + 3eb0: 54 c0 rjmp .+168 ; 0x3f5a + getNch(3); + putch(0x00); + } +#else + // UNIVERSAL command is ignored + getNch(4); + 3eb2: 86 35 cpi r24, 0x56 ; 86 + 3eb4: 21 f4 brne .+8 ; 0x3ebe + putch(0x00); + 3eb6: 84 e0 ldi r24, 0x04 ; 4 + 3eb8: 75 d0 rcall .+234 ; 0x3fa4 +#endif + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + 3eba: 80 e0 ldi r24, 0x00 ; 0 + 3ebc: e6 cf rjmp .-52 ; 0x3e8a + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t desttype; + uint8_t *bufPtr; + pagelen_t savelength; + + GETLENGTH(length); + 3ebe: 84 36 cpi r24, 0x64 ; 100 + 3ec0: 09 f0 breq .+2 ; 0x3ec4 + 3ec2: 2e c0 rjmp .+92 ; 0x3f20 + 3ec4: 55 d0 rcall .+170 ; 0x3f70 + savelength = length; + desttype = getch(); + 3ec6: 54 d0 rcall .+168 ; 0x3f70 + 3ec8: f8 2e mov r15, r24 + 3eca: 52 d0 rcall .+164 ; 0x3f70 + 3ecc: b8 2e mov r11, r24 + 3ece: 00 e0 ldi r16, 0x00 ; 0 + + // read a page worth of contents + bufPtr = buff.bptr; + do *bufPtr++ = getch(); + 3ed0: 11 e0 ldi r17, 0x01 ; 1 + 3ed2: 4e d0 rcall .+156 ; 0x3f70 + 3ed4: f8 01 movw r30, r16 + 3ed6: 81 93 st Z+, r24 + 3ed8: 8f 01 movw r16, r30 + while (--length); + 3eda: fe 12 cpse r15, r30 + 3edc: fa cf rjmp .-12 ; 0x3ed2 + + // Read command terminator, start reply + verifySpace(); + 3ede: 5a d0 rcall .+180 ; 0x3f94 + 3ee0: f5 e4 ldi r31, 0x45 ; 69 + * void writebuffer(memtype, buffer, address, length) + */ +static inline void writebuffer(int8_t memtype, addr16_t mybuff, + addr16_t address, pagelen_t len) +{ + switch (memtype) { + 3ee2: bf 12 cpse r11, r31 + 3ee4: 01 c0 rjmp .+2 ; 0x3ee8 + 3ee6: ff cf rjmp .-2 ; 0x3ee6 + 3ee8: 83 e0 ldi r24, 0x03 ; 3 + * Start the page erase and wait for it to finish. There + * used to be code to do this while receiving the data over + * the serial link, but the performance improvement was slight, + * and we needed the space back. + */ + __boot_page_erase_short(address.word); + 3eea: fe 01 movw r30, r28 + 3eec: 87 bf out 0x37, r24 ; 55 + 3eee: e8 95 spm + 3ef0: 07 b6 in r0, 0x37 ; 55 + boot_spm_busy_wait(); + 3ef2: 00 fc sbrc r0, 0 + 3ef4: fd cf rjmp .-6 ; 0x3ef0 + 3ef6: a0 e0 ldi r26, 0x00 ; 0 + 3ef8: b1 e0 ldi r27, 0x01 ; 1 + 3efa: fe 01 movw r30, r28 + 3efc: 8d 91 ld r24, X+ + + /* + * Copy data from the buffer into the flash write buffer. + */ + do { + __boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++)); + 3efe: 9d 91 ld r25, X+ + 3f00: 0c 01 movw r0, r24 + 3f02: e7 be out 0x37, r14 ; 55 + 3f04: e8 95 spm + 3f06: 11 24 eor r1, r1 + 3f08: 32 96 adiw r30, 0x02 ; 2 + addrPtr += 2; + } while (len -= 2); + 3f0a: fa 12 cpse r15, r26 + + /* + * Actually Write the buffer to flash (and wait for it to finish.) + */ + __boot_page_write_short(address.word); + 3f0c: f7 cf rjmp .-18 ; 0x3efc + 3f0e: fe 01 movw r30, r28 + boot_spm_busy_wait(); + 3f10: d7 be out 0x37, r13 ; 55 + 3f12: e8 95 spm +#if defined(RWWSRE) + // Reenable read access to flash + __boot_rww_enable_short(); + 3f14: 07 b6 in r0, 0x37 ; 55 + 3f16: 00 fc sbrc r0, 0 + 3f18: fd cf rjmp .-6 ; 0x3f14 + writebuffer(desttype, buff, address, savelength); + + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + 3f1a: c7 be out 0x37, r12 ; 55 + 3f1c: e8 95 spm + uint8_t desttype; + GETLENGTH(length); + 3f1e: 1e c0 rjmp .+60 ; 0x3f5c + 3f20: 84 37 cpi r24, 0x74 ; 116 + 3f22: 71 f4 brne .+28 ; 0x3f40 + + desttype = getch(); + 3f24: 25 d0 rcall .+74 ; 0x3f70 + + verifySpace(); + 3f26: 24 d0 rcall .+72 ; 0x3f70 + 3f28: f8 2e mov r15, r24 + 3f2a: 22 d0 rcall .+68 ; 0x3f70 + // while (--length); + // read a Flash and increment the address (may increment RAMPZ) + __asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address)); +#else + // read a Flash byte and increment the address + __asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address)); + 3f2c: 33 d0 rcall .+102 ; 0x3f94 + 3f2e: 8e 01 movw r16, r28 +#endif + putch(ch); + 3f30: f8 01 movw r30, r16 + } while (--length); + 3f32: 85 91 lpm r24, Z+ + 3f34: 8f 01 movw r16, r30 + 3f36: 15 d0 rcall .+42 ; 0x3f62 + 3f38: fa 94 dec r15 + + read_mem(desttype, address, length); + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + 3f3a: f1 10 cpse r15, r1 + 3f3c: f9 cf rjmp .-14 ; 0x3f30 + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + 3f3e: 0e c0 rjmp .+28 ; 0x3f5c + 3f40: 85 37 cpi r24, 0x75 ; 117 + putch(SIGNATURE_0); + 3f42: 39 f4 brne .+14 ; 0x3f52 + 3f44: 27 d0 rcall .+78 ; 0x3f94 + 3f46: 8e e1 ldi r24, 0x1E ; 30 + putch(SIGNATURE_1); + 3f48: 0c d0 rcall .+24 ; 0x3f62 + 3f4a: 84 e9 ldi r24, 0x94 ; 148 + 3f4c: 0a d0 rcall .+20 ; 0x3f62 + putch(SIGNATURE_2); + 3f4e: 86 e0 ldi r24, 0x06 ; 6 + 3f50: 9c cf rjmp .-200 ; 0x3e8a + } + else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ + 3f52: 81 35 cpi r24, 0x51 ; 81 + 3f54: 11 f4 brne .+4 ; 0x3f5a + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + 3f56: 88 e0 ldi r24, 0x08 ; 8 + 3f58: 17 d0 rcall .+46 ; 0x3f88 + 3f5a: 1c d0 rcall .+56 ; 0x3f94 + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + 3f5c: 80 e1 ldi r24, 0x10 ; 16 + 3f5e: 01 d0 rcall .+2 ; 0x3f62 + } + putch(STK_OK); + 3f60: 87 cf rjmp .-242 ; 0x3e70 + +00003f62 : + 3f62: 90 91 c0 00 lds r25, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + } + 3f66: 95 ff sbrs r25, 5 +} + +void putch(char ch) { +#ifndef SOFT_UART + while (!(UART_SRA & _BV(UDRE0))); + 3f68: fc cf rjmp .-8 ; 0x3f62 + UART_UDR = ch; + 3f6a: 80 93 c6 00 sts 0x00C6, r24 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6> + 3f6e: 08 95 ret + +00003f70 : + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UART_SRA & _BV(RXC0))) + 3f70: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + 3f74: 87 ff sbrs r24, 7 + 3f76: fc cf rjmp .-8 ; 0x3f70 + ; + if (!(UART_SRA & _BV(FE0))) { + 3f78: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0> + 3f7c: 84 fd sbrc r24, 4 + 3f7e: 01 c0 rjmp .+2 ; 0x3f82 +} +#endif + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3f80: a8 95 wdr + * don't care that an invalid char is returned...) + */ + watchdogReset(); + } + + ch = UART_UDR; + 3f82: 80 91 c6 00 lds r24, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6> + LED_PIN |= _BV(LED); +#endif +#endif + + return ch; +} + 3f86: 08 95 ret + +00003f88 : + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + 3f88: e0 e6 ldi r30, 0x60 ; 96 + 3f8a: f0 e0 ldi r31, 0x00 ; 0 + 3f8c: 98 e1 ldi r25, 0x18 ; 24 + 3f8e: 90 83 st Z, r25 + WDTCSR = x; + 3f90: 80 83 st Z, r24 + 3f92: 08 95 ret + +00003f94 : + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) { + 3f94: ed df rcall .-38 ; 0x3f70 + 3f96: 80 32 cpi r24, 0x20 ; 32 + 3f98: 19 f0 breq .+6 ; 0x3fa0 + watchdogConfig(WATCHDOG_16MS); // shorten WD timeout + 3f9a: 88 e0 ldi r24, 0x08 ; 8 + 3f9c: f5 df rcall .-22 ; 0x3f88 + 3f9e: ff cf rjmp .-2 ; 0x3f9e + while (1) // and busy-loop so that WD causes + ; // a reset and app start. + } + putch(STK_INSYNC); + 3fa0: 84 e1 ldi r24, 0x14 ; 20 + 3fa2: df cf rjmp .-66 ; 0x3f62 + +00003fa4 : + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + 3fa4: cf 93 push r28 + 3fa6: c8 2f mov r28, r24 + do getch(); while (--count); + 3fa8: e3 df rcall .-58 ; 0x3f70 + 3faa: c1 50 subi r28, 0x01 ; 1 + 3fac: e9 f7 brne .-6 ; 0x3fa8 + verifySpace(); + 3fae: cf 91 pop r28 + 3fb0: f1 cf rjmp .-30 ; 0x3f94 + +00003fb2 : + +void appStart(uint8_t rstFlags) { + // save the reset flags in the designated register + // This can be saved in a main program by putting code in .init0 (which + // executes before normal c init code) to save R2 to a global variable. + __asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags)); + 3fb2: 28 2e mov r2, r24 + + watchdogConfig(WATCHDOG_OFF); + 3fb4: 80 e0 ldi r24, 0x00 ; 0 + 3fb6: e8 df rcall .-48 ; 0x3f88 + 3fb8: e0 e0 ldi r30, 0x00 ; 0 + // Note that appstart_vec is defined so that this works with either + // real or virtual boot partitions. + __asm__ __volatile__ ( + 3fba: ff 27 eor r31, r31 + 3fbc: 09 94 ijmp diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_luminet.hex b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_luminet.hex new file mode 100644 index 0000000..2a22c46 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_luminet.hex @@ -0,0 +1,38 @@ +:101D0000112484B7882349F0982F9A70923029F0D3 +:101D100081FF02C097EF94BFFED08EE0E9D0D29A47 +:101D200023E0C22EBB24B39435E0A32ECDD0813462 +:101D300071F4CAD0F82EE0D082E8F816F1F0E1E8AC +:101D4000FE1202C087E001C083E0AFD0ABC0823496 +:101D500011F484E103C0853419F485E0D5D0A2C024 +:101D6000853539F4B1D0C82FAFD0D82FCC0FDD1FB7 +:101D700098C0863521F484E0C7D080E0E6CF843671 +:101D800009F055C0A1D0A0D0F82E9ED0D82EEF2CAF +:101D900080E6882E912C98D0F40181934F01EA942B +:101DA000E110F9CFA9D0209719F590916000909398 +:101DB000E400809161008093E50020916800209309 +:101DC000E600209169002093E700092F182F0450A6 +:101DD000110900936800812F8F70806C80936900D7 +:101DE00000E81EE000936000812F806C809361000A +:101DF000F5E4DF1201C0FFCFFE01C7BEE89507B6CC +:101E000000FCFDCFA0E6B0E0FE018D919D910C019C +:101E1000B7BEE8951124FA94FA943296F110F5CFF2 +:101E2000FE01A7BEE89507B600FCFDCF3BC0843796 +:101E300059F54AD049D0D82E47D05ED07E01E11462 +:101E4000F10419F48091E40017C0F1E0EF16F104F9 +:101E500019F48091E50010C088E0E816F10419F447 +:101E60008091E60009C0E9E0EE16F10419F48091D2 +:101E7000E70002C0F701849118D0DA94FFEFEF1A5F +:101E8000FF0AD110DCCF0EC0853739F435D08EE192 +:101E90000CD083E90AD08CE058CF813511F488E06A +:101EA00027D02AD080E101D041CF2AE030E08095D0 +:101EB000089410F4DA9802C0DA9A000015D014D011 +:101EC00086952A95B1F70895A89529E030E0CB9939 +:101ED000FECF0AD009D008D08894CB9908942A95CF +:101EE00011F08795F7CF08959EE09A95F1F7089540 +:101EF00098E191BD81BD0895E7DF803219F088E057 +:101F0000F7DFFFCF84E1D1CFCF93C82FDDDFC15002 +:101F1000E9F7CF91F1CF282E80E0EADFE4E0FF2758 +:021F2000099422 +:021FFE000007DA +:0400000300001D00DC +:00000001FF diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_luminet.lst b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_luminet.lst new file mode 100644 index 0000000..0eb42d4 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/optiboot_luminet.lst @@ -0,0 +1,634 @@ + +optiboot_attiny84.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .text 00000222 00001d00 00001d00 00000074 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .version 00000002 00001ffe 00001ffe 00000296 2**0 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 2 .data 00000000 00800060 00800060 00000298 2**0 + CONTENTS, ALLOC, LOAD, DATA + 3 .comment 0000002f 00000000 00000000 00000298 2**0 + CONTENTS, READONLY + 4 .debug_aranges 00000028 00000000 00000000 000002c7 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .debug_info 000005e9 00000000 00000000 000002ef 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_abbrev 0000029f 00000000 00000000 000008d8 2**0 + CONTENTS, READONLY, DEBUGGING + 7 .debug_line 00000307 00000000 00000000 00000b77 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_frame 0000009c 00000000 00000000 00000e80 2**2 + CONTENTS, READONLY, DEBUGGING + 9 .debug_str 00000212 00000000 00000000 00000f1c 2**0 + CONTENTS, READONLY, DEBUGGING + 10 .debug_loc 00000367 00000000 00000000 0000112e 2**0 + CONTENTS, READONLY, DEBUGGING + 11 .debug_ranges 00000060 00000000 00000000 00001495 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00001d00
: + // SP points to RAMEND + // r1 contains zero + // + // If not, uncomment the following instructions: + // cli(); + asm volatile ("clr __zero_reg__"); + 1d00: 11 24 eor r1, r1 + * + * Code by MarkG55 + * see discusion in https://github.com/Optiboot/optiboot/issues/97 + */ +#if !defined(__AVR_ATmega16__) + ch = MCUSR; + 1d02: 84 b7 in r24, 0x34 ; 52 +#else + ch = MCUCSR; +#endif + // Skip all logic and run bootloader if MCUSR is cleared (application request) + if (ch != 0) { + 1d04: 88 23 and r24, r24 + 1d06: 49 f0 breq .+18 ; 0x1d1a + * 2. we clear WDRF if it's set with EXTRF to avoid loops + * One problematic scenario: broken application code sets watchdog timer + * without clearing MCUSR before and triggers it quickly. But it's + * recoverable by power-on with pushed reset button. + */ + if ((ch & (_BV(WDRF) | _BV(EXTRF))) != _BV(EXTRF)) { + 1d08: 98 2f mov r25, r24 + 1d0a: 9a 70 andi r25, 0x0A ; 10 + 1d0c: 92 30 cpi r25, 0x02 ; 2 + 1d0e: 29 f0 breq .+10 ; 0x1d1a + if (ch & _BV(EXTRF)) { + 1d10: 81 ff sbrs r24, 1 + 1d12: 02 c0 rjmp .+4 ; 0x1d18 + * prevent entering bootloader. + * '&' operation is skipped to spare few bytes as bits in MCUSR + * can only be cleared. + */ +#if !defined(__AVR_ATmega16__) + MCUSR = ~(_BV(WDRF)); + 1d14: 97 ef ldi r25, 0xF7 ; 247 + 1d16: 94 bf out 0x34, r25 ; 52 +#else + MCUCSR = ~(_BV(WDRF)); +#endif + } + appStart(ch); + 1d18: fe d0 rcall .+508 ; 0x1f16 + UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); +#endif +#endif + + // Set up watchdog to trigger after 1s + watchdogConfig(WATCHDOG_1S); + 1d1a: 8e e0 ldi r24, 0x0E ; 14 + 1d1c: e9 d0 rcall .+466 ; 0x1ef0 + LED_DDR |= _BV(LED); +#endif + +#ifdef SOFT_UART + /* Set TX pin as output */ + UART_DDR |= _BV(UART_TX_BIT); + 1d1e: d2 9a sbi 0x1a, 2 ; 26 + * Start the page erase and wait for it to finish. There + * used to be code to do this while receiving the data over + * the serial link, but the performance improvement was slight, + * and we needed the space back. + */ + __boot_page_erase_short(address.word); + 1d20: 23 e0 ldi r18, 0x03 ; 3 + 1d22: c2 2e mov r12, r18 + + /* + * Copy data from the buffer into the flash write buffer. + */ + do { + __boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++)); + 1d24: bb 24 eor r11, r11 + 1d26: b3 94 inc r11 + } while (len -= 2); + + /* + * Actually Write the buffer to flash (and wait for it to finish.) + */ + __boot_page_write_short(address.word); + 1d28: 35 e0 ldi r19, 0x05 ; 5 + 1d2a: a3 2e mov r10, r19 +#endif + + /* Forever loop: exits by causing WDT reset */ + for (;;) { + /* get character from UART */ + ch = getch(); + 1d2c: cd d0 rcall .+410 ; 0x1ec8 + + if(ch == STK_GET_PARAMETER) { + 1d2e: 81 34 cpi r24, 0x41 ; 65 + 1d30: 71 f4 brne .+28 ; 0x1d4e + unsigned char which = getch(); + 1d32: ca d0 rcall .+404 ; 0x1ec8 + 1d34: f8 2e mov r15, r24 + verifySpace(); + 1d36: e0 d0 rcall .+448 ; 0x1ef8 + /* + * Send optiboot version as "SW version" + * Note that the references to memory are optimized away. + */ + if (which == STK_SW_MINOR) { + 1d38: 82 e8 ldi r24, 0x82 ; 130 + 1d3a: f8 16 cp r15, r24 + 1d3c: f1 f0 breq .+60 ; 0x1d7a + putch(optiboot_version & 0xFF); + } else if (which == STK_SW_MAJOR) { + 1d3e: e1 e8 ldi r30, 0x81 ; 129 + 1d40: fe 12 cpse r15, r30 + 1d42: 02 c0 rjmp .+4 ; 0x1d48 + putch(optiboot_version >> 8); + 1d44: 87 e0 ldi r24, 0x07 ; 7 + 1d46: 01 c0 rjmp .+2 ; 0x1d4a + } else { + /* + * GET PARAMETER returns a generic 0x03 reply for + * other parameters - enough to keep Avrdude happy + */ + putch(0x03); + 1d48: 83 e0 ldi r24, 0x03 ; 3 + 1d4a: af d0 rcall .+350 ; 0x1eaa + 1d4c: ab c0 rjmp .+342 ; 0x1ea4 + } + } + else if(ch == STK_SET_DEVICE) { + 1d4e: 82 34 cpi r24, 0x42 ; 66 + 1d50: 11 f4 brne .+4 ; 0x1d56 + // SET DEVICE is ignored + getNch(20); + 1d52: 84 e1 ldi r24, 0x14 ; 20 + 1d54: 03 c0 rjmp .+6 ; 0x1d5c + } + else if(ch == STK_SET_DEVICE_EXT) { + 1d56: 85 34 cpi r24, 0x45 ; 69 + 1d58: 19 f4 brne .+6 ; 0x1d60 + // SET DEVICE EXT is ignored + getNch(5); + 1d5a: 85 e0 ldi r24, 0x05 ; 5 + 1d5c: d5 d0 rcall .+426 ; 0x1f08 + 1d5e: a2 c0 rjmp .+324 ; 0x1ea4 + } + else if(ch == STK_LOAD_ADDRESS) { + 1d60: 85 35 cpi r24, 0x55 ; 85 + 1d62: 39 f4 brne .+14 ; 0x1d72 + // LOAD ADDRESS + address.bytes[0] = getch(); + 1d64: b1 d0 rcall .+354 ; 0x1ec8 + 1d66: c8 2f mov r28, r24 + address.bytes[1] = getch(); + 1d68: af d0 rcall .+350 ; 0x1ec8 + 1d6a: d8 2f mov r29, r24 + } + else { + RAMPZ &= 0xFE; + } +#endif + address.word *= 2; // Convert from word address to byte address + 1d6c: cc 0f add r28, r28 + 1d6e: dd 1f adc r29, r29 + 1d70: 98 c0 rjmp .+304 ; 0x1ea2 + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + 1d72: 86 35 cpi r24, 0x56 ; 86 + 1d74: 21 f4 brne .+8 ; 0x1d7e + getNch(3); + putch(0x00); + } +#else + // UNIVERSAL command is ignored + getNch(4); + 1d76: 84 e0 ldi r24, 0x04 ; 4 + 1d78: c7 d0 rcall .+398 ; 0x1f08 + putch(0x00); + 1d7a: 80 e0 ldi r24, 0x00 ; 0 + 1d7c: e6 cf rjmp .-52 ; 0x1d4a +#endif + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + 1d7e: 84 36 cpi r24, 0x64 ; 100 + 1d80: 09 f0 breq .+2 ; 0x1d84 + 1d82: 55 c0 rjmp .+170 ; 0x1e2e + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t desttype; + uint8_t *bufPtr; + pagelen_t savelength; + + GETLENGTH(length); + 1d84: a1 d0 rcall .+322 ; 0x1ec8 + 1d86: a0 d0 rcall .+320 ; 0x1ec8 + 1d88: f8 2e mov r15, r24 + savelength = length; + desttype = getch(); + 1d8a: 9e d0 rcall .+316 ; 0x1ec8 + 1d8c: d8 2e mov r13, r24 + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t desttype; + uint8_t *bufPtr; + pagelen_t savelength; + + GETLENGTH(length); + 1d8e: ef 2c mov r14, r15 + savelength = length; + desttype = getch(); + 1d90: 80 e6 ldi r24, 0x60 ; 96 + 1d92: 88 2e mov r8, r24 + 1d94: 91 2c mov r9, r1 + + // read a page worth of contents + bufPtr = buff.bptr; + do *bufPtr++ = getch(); + 1d96: 98 d0 rcall .+304 ; 0x1ec8 + 1d98: f4 01 movw r30, r8 + 1d9a: 81 93 st Z+, r24 + 1d9c: 4f 01 movw r8, r30 + while (--length); + 1d9e: ea 94 dec r14 + 1da0: e1 10 cpse r14, r1 + 1da2: f9 cf rjmp .-14 ; 0x1d96 + + // Read command terminator, start reply + verifySpace(); + 1da4: a9 d0 rcall .+338 ; 0x1ef8 + +#else +/* + * AVR with 2-byte ISR Vectors and rjmp + */ + if (address.word == rstVect0) { + 1da6: 20 97 sbiw r28, 0x00 ; 0 + 1da8: 19 f5 brne .+70 ; 0x1df0 + // This is the reset vector page. We need to live-patch + // the code so the bootloader runs first. + // + // Move RESET vector to 'save' vector + // Save jmp targets (for "Verify") + rstVect0_sav = buff.bptr[rstVect0]; + 1daa: 90 91 60 00 lds r25, 0x0060 ; 0x800060 <_edata> + 1dae: 90 93 e4 00 sts 0x00E4, r25 ; 0x8000e4 <_edata+0x84> + rstVect1_sav = buff.bptr[rstVect1]; + 1db2: 80 91 61 00 lds r24, 0x0061 ; 0x800061 <_edata+0x1> + 1db6: 80 93 e5 00 sts 0x00E5, r24 ; 0x8000e5 <_edata+0x85> + saveVect0_sav = buff.bptr[saveVect0]; + 1dba: 20 91 68 00 lds r18, 0x0068 ; 0x800068 <_edata+0x8> + 1dbe: 20 93 e6 00 sts 0x00E6, r18 ; 0x8000e6 <_edata+0x86> + saveVect1_sav = buff.bptr[saveVect1]; + 1dc2: 20 91 69 00 lds r18, 0x0069 ; 0x800069 <_edata+0x9> + 1dc6: 20 93 e7 00 sts 0x00E7, r18 ; 0x8000e7 <_edata+0x87> + + // Instruction is a relative jump (rjmp), so recalculate. + // an RJMP instruction is 0b1100xxxx xxxxxxxx, so we should be able to + // do math on the offsets without masking it off first. + addr16_t vect; + vect.bytes[0] = rstVect0_sav; + 1dca: 09 2f mov r16, r25 + vect.bytes[1] = rstVect1_sav; + 1dcc: 18 2f mov r17, r24 + vect.word = (vect.word-save_vect_num); //substract 'save' interrupt position + 1dce: 04 50 subi r16, 0x04 ; 4 + 1dd0: 11 09 sbc r17, r1 + // Move RESET jmp target to 'save' vector + buff.bptr[saveVect0] = vect.bytes[0]; + 1dd2: 00 93 68 00 sts 0x0068, r16 ; 0x800068 <_edata+0x8> + buff.bptr[saveVect1] = (vect.bytes[1] & 0x0F)| 0xC0; // make an "rjmp" + 1dd6: 81 2f mov r24, r17 + 1dd8: 8f 70 andi r24, 0x0F ; 15 + 1dda: 80 6c ori r24, 0xC0 ; 192 + 1ddc: 80 93 69 00 sts 0x0069, r24 ; 0x800069 <_edata+0x9> + // Add rjump to bootloader at RESET vector + vect.word = ((uint16_t)main); // (main) is always <= 0x0FFF; no masking needed. + 1de0: 00 e8 ldi r16, 0x80 ; 128 + 1de2: 1e e0 ldi r17, 0x0E ; 14 + buff.bptr[0] = vect.bytes[0]; // rjmp 0x1c00 instruction + 1de4: 00 93 60 00 sts 0x0060, r16 ; 0x800060 <_edata> + buff.bptr[1] = vect.bytes[1] | 0xC0; // make an "rjmp" + 1de8: 81 2f mov r24, r17 + 1dea: 80 6c ori r24, 0xC0 ; 192 + 1dec: 80 93 61 00 sts 0x0061, r24 ; 0x800061 <_edata+0x1> + * void writebuffer(memtype, buffer, address, length) + */ +static inline void writebuffer(int8_t memtype, addr16_t mybuff, + addr16_t address, pagelen_t len) +{ + switch (memtype) { + 1df0: f5 e4 ldi r31, 0x45 ; 69 + 1df2: df 12 cpse r13, r31 + 1df4: 01 c0 rjmp .+2 ; 0x1df8 + 1df6: ff cf rjmp .-2 ; 0x1df6 + * Start the page erase and wait for it to finish. There + * used to be code to do this while receiving the data over + * the serial link, but the performance improvement was slight, + * and we needed the space back. + */ + __boot_page_erase_short(address.word); + 1df8: fe 01 movw r30, r28 + 1dfa: c7 be out 0x37, r12 ; 55 + 1dfc: e8 95 spm + boot_spm_busy_wait(); + 1dfe: 07 b6 in r0, 0x37 ; 55 + 1e00: 00 fc sbrc r0, 0 + 1e02: fd cf rjmp .-6 ; 0x1dfe + 1e04: a0 e6 ldi r26, 0x60 ; 96 + 1e06: b0 e0 ldi r27, 0x00 ; 0 + 1e08: fe 01 movw r30, r28 + + /* + * Copy data from the buffer into the flash write buffer. + */ + do { + __boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++)); + 1e0a: 8d 91 ld r24, X+ + 1e0c: 9d 91 ld r25, X+ + 1e0e: 0c 01 movw r0, r24 + 1e10: b7 be out 0x37, r11 ; 55 + 1e12: e8 95 spm + 1e14: 11 24 eor r1, r1 + addrPtr += 2; + } while (len -= 2); + 1e16: fa 94 dec r15 + 1e18: fa 94 dec r15 + 1e1a: 32 96 adiw r30, 0x02 ; 2 + 1e1c: f1 10 cpse r15, r1 + 1e1e: f5 cf rjmp .-22 ; 0x1e0a + + /* + * Actually Write the buffer to flash (and wait for it to finish.) + */ + __boot_page_write_short(address.word); + 1e20: fe 01 movw r30, r28 + 1e22: a7 be out 0x37, r10 ; 55 + 1e24: e8 95 spm + boot_spm_busy_wait(); + 1e26: 07 b6 in r0, 0x37 ; 55 + 1e28: 00 fc sbrc r0, 0 + 1e2a: fd cf rjmp .-6 ; 0x1e26 + 1e2c: 3b c0 rjmp .+118 ; 0x1ea4 + writebuffer(desttype, buff, address, savelength); + + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + 1e2e: 84 37 cpi r24, 0x74 ; 116 + 1e30: 59 f5 brne .+86 ; 0x1e88 + uint8_t desttype; + GETLENGTH(length); + 1e32: 4a d0 rcall .+148 ; 0x1ec8 + 1e34: 49 d0 rcall .+146 ; 0x1ec8 + 1e36: d8 2e mov r13, r24 + + desttype = getch(); + 1e38: 47 d0 rcall .+142 ; 0x1ec8 + + verifySpace(); + 1e3a: 5e d0 rcall .+188 ; 0x1ef8 + 1e3c: 7e 01 movw r14, r28 +#endif + default: + do { +#ifdef VIRTUAL_BOOT_PARTITION + // Undo vector patch in bottom page so verify passes + if (address.word == rstVect0) ch = rstVect0_sav; + 1e3e: e1 14 cp r14, r1 + 1e40: f1 04 cpc r15, r1 + 1e42: 19 f4 brne .+6 ; 0x1e4a + 1e44: 80 91 e4 00 lds r24, 0x00E4 ; 0x8000e4 <_edata+0x84> + 1e48: 17 c0 rjmp .+46 ; 0x1e78 + else if (address.word == rstVect1) ch = rstVect1_sav; + 1e4a: f1 e0 ldi r31, 0x01 ; 1 + 1e4c: ef 16 cp r14, r31 + 1e4e: f1 04 cpc r15, r1 + 1e50: 19 f4 brne .+6 ; 0x1e58 + 1e52: 80 91 e5 00 lds r24, 0x00E5 ; 0x8000e5 <_edata+0x85> + 1e56: 10 c0 rjmp .+32 ; 0x1e78 + else if (address.word == saveVect0) ch = saveVect0_sav; + 1e58: 88 e0 ldi r24, 0x08 ; 8 + 1e5a: e8 16 cp r14, r24 + 1e5c: f1 04 cpc r15, r1 + 1e5e: 19 f4 brne .+6 ; 0x1e66 + 1e60: 80 91 e6 00 lds r24, 0x00E6 ; 0x8000e6 <_edata+0x86> + 1e64: 09 c0 rjmp .+18 ; 0x1e78 + else if (address.word == saveVect1) ch = saveVect1_sav; + 1e66: e9 e0 ldi r30, 0x09 ; 9 + 1e68: ee 16 cp r14, r30 + 1e6a: f1 04 cpc r15, r1 + 1e6c: 19 f4 brne .+6 ; 0x1e74 + 1e6e: 80 91 e7 00 lds r24, 0x00E7 ; 0x8000e7 <_edata+0x87> + 1e72: 02 c0 rjmp .+4 ; 0x1e78 + else ch = pgm_read_byte_near(address.bptr); + 1e74: f7 01 movw r30, r14 + 1e76: 84 91 lpm r24, Z + __asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address)); +#else + // read a Flash byte and increment the address + __asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address)); +#endif + putch(ch); + 1e78: 18 d0 rcall .+48 ; 0x1eaa + } while (--length); + 1e7a: da 94 dec r13 + 1e7c: ff ef ldi r31, 0xFF ; 255 + 1e7e: ef 1a sub r14, r31 + 1e80: ff 0a sbc r15, r31 + 1e82: d1 10 cpse r13, r1 + 1e84: dc cf rjmp .-72 ; 0x1e3e + 1e86: 0e c0 rjmp .+28 ; 0x1ea4 + + read_mem(desttype, address, length); + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + 1e88: 85 37 cpi r24, 0x75 ; 117 + 1e8a: 39 f4 brne .+14 ; 0x1e9a + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + 1e8c: 35 d0 rcall .+106 ; 0x1ef8 + putch(SIGNATURE_0); + 1e8e: 8e e1 ldi r24, 0x1E ; 30 + 1e90: 0c d0 rcall .+24 ; 0x1eaa + putch(SIGNATURE_1); + 1e92: 83 e9 ldi r24, 0x93 ; 147 + 1e94: 0a d0 rcall .+20 ; 0x1eaa + putch(SIGNATURE_2); + 1e96: 8c e0 ldi r24, 0x0C ; 12 + 1e98: 58 cf rjmp .-336 ; 0x1d4a + } + else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ + 1e9a: 81 35 cpi r24, 0x51 ; 81 + 1e9c: 11 f4 brne .+4 ; 0x1ea2 + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + 1e9e: 88 e0 ldi r24, 0x08 ; 8 + 1ea0: 27 d0 rcall .+78 ; 0x1ef0 + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + 1ea2: 2a d0 rcall .+84 ; 0x1ef8 + } + putch(STK_OK); + 1ea4: 80 e1 ldi r24, 0x10 ; 16 + 1ea6: 01 d0 rcall .+2 ; 0x1eaa + } + 1ea8: 41 cf rjmp .-382 ; 0x1d2c + +00001eaa : +void putch(char ch) { +#ifndef SOFT_UART + while (!(UART_SRA & _BV(UDRE0))); + UART_UDR = ch; +#else + __asm__ __volatile__ ( + 1eaa: 2a e0 ldi r18, 0x0A ; 10 + 1eac: 30 e0 ldi r19, 0x00 ; 0 + 1eae: 80 95 com r24 + 1eb0: 08 94 sec + 1eb2: 10 f4 brcc .+4 ; 0x1eb8 + 1eb4: da 98 cbi 0x1b, 2 ; 27 + 1eb6: 02 c0 rjmp .+4 ; 0x1ebc + 1eb8: da 9a sbi 0x1b, 2 ; 27 + 1eba: 00 00 nop + 1ebc: 15 d0 rcall .+42 ; 0x1ee8 + 1ebe: 14 d0 rcall .+40 ; 0x1ee8 + 1ec0: 86 95 lsr r24 + 1ec2: 2a 95 dec r18 + 1ec4: b1 f7 brne .-20 ; 0x1eb2 + 1ec6: 08 95 ret + +00001ec8 : +} +#endif + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 1ec8: a8 95 wdr +#endif +#endif + +#ifdef SOFT_UART + watchdogReset(); + __asm__ __volatile__ ( + 1eca: 29 e0 ldi r18, 0x09 ; 9 + 1ecc: 30 e0 ldi r19, 0x00 ; 0 + 1ece: cb 99 sbic 0x19, 3 ; 25 + 1ed0: fe cf rjmp .-4 ; 0x1ece + 1ed2: 0a d0 rcall .+20 ; 0x1ee8 + 1ed4: 09 d0 rcall .+18 ; 0x1ee8 + 1ed6: 08 d0 rcall .+16 ; 0x1ee8 + 1ed8: 88 94 clc + 1eda: cb 99 sbic 0x19, 3 ; 25 + 1edc: 08 94 sec + 1ede: 2a 95 dec r18 + 1ee0: 11 f0 breq .+4 ; 0x1ee6 + 1ee2: 87 95 ror r24 + 1ee4: f7 cf rjmp .-18 ; 0x1ed4 + LED_PIN |= _BV(LED); +#endif +#endif + + return ch; +} + 1ee6: 08 95 ret + +00001ee8 : +#if UART_B_VALUE > 255 +#error Baud rate too slow for soft UART +#endif + +void uartDelay() { + __asm__ __volatile__ ( + 1ee8: 9e e0 ldi r25, 0x0E ; 14 + 1eea: 9a 95 dec r25 + 1eec: f1 f7 brne .-4 ; 0x1eea + 1eee: 08 95 ret + +00001ef0 : + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + 1ef0: 98 e1 ldi r25, 0x18 ; 24 + 1ef2: 91 bd out 0x21, r25 ; 33 + WDTCSR = x; + 1ef4: 81 bd out 0x21, r24 ; 33 + 1ef6: 08 95 ret + +00001ef8 : + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) { + 1ef8: e7 df rcall .-50 ; 0x1ec8 + 1efa: 80 32 cpi r24, 0x20 ; 32 + 1efc: 19 f0 breq .+6 ; 0x1f04 + watchdogConfig(WATCHDOG_16MS); // shorten WD timeout + 1efe: 88 e0 ldi r24, 0x08 ; 8 + 1f00: f7 df rcall .-18 ; 0x1ef0 + 1f02: ff cf rjmp .-2 ; 0x1f02 + while (1) // and busy-loop so that WD causes + ; // a reset and app start. + } + putch(STK_INSYNC); + 1f04: 84 e1 ldi r24, 0x14 ; 20 + 1f06: d1 cf rjmp .-94 ; 0x1eaa + +00001f08 : + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + 1f08: cf 93 push r28 + 1f0a: c8 2f mov r28, r24 + do getch(); while (--count); + 1f0c: dd df rcall .-70 ; 0x1ec8 + 1f0e: c1 50 subi r28, 0x01 ; 1 + 1f10: e9 f7 brne .-6 ; 0x1f0c + verifySpace(); +} + 1f12: cf 91 pop r28 +} +#endif + +void getNch(uint8_t count) { + do getch(); while (--count); + verifySpace(); + 1f14: f1 cf rjmp .-30 ; 0x1ef8 + +00001f16 : + +void appStart(uint8_t rstFlags) { + // save the reset flags in the designated register + // This can be saved in a main program by putting code in .init0 (which + // executes before normal c init code) to save R2 to a global variable. + __asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags)); + 1f16: 28 2e mov r2, r24 + + watchdogConfig(WATCHDOG_OFF); + 1f18: 80 e0 ldi r24, 0x00 ; 0 + 1f1a: ea df rcall .-44 ; 0x1ef0 + // Note that appstart_vec is defined so that this works with either + // real or virtual boot partitions. + __asm__ __volatile__ ( + 1f1c: e4 e0 ldi r30, 0x04 ; 4 + 1f1e: ff 27 eor r31, r31 + 1f20: 09 94 ijmp diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/pin_defs.h b/ActualOptiboot/optiboot/bootloaders/optiboot/pin_defs.h new file mode 100644 index 0000000..27afa35 --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/pin_defs.h @@ -0,0 +1,891 @@ +/* + * pin_defs.h + * optiboot helper defining the default pin assignments (LED, SOFT_UART) + * for the various chips that are supported. This also has some ugly macros + * for selecting among various UARTs and LED possibilities using command-line + * defines like "UART=2 LED=B5" + * + * Copyright 2013-2015 by Bill Westfield. + * Copyright 2010 by Peter Knight. + * This software is licensed under version 2 of the Gnu Public Licence. + * See optiboot.c for details. + */ + +/*------------------------------------------------------------------------ */ +#if defined(__AVR_ATmega168__) \ + || defined(__AVR_ATmega168P__) \ + || defined(__AVR_ATmega328__) \ + || defined(__AVR_ATmega328P__) \ + || defined(__AVR_ATmega88) \ + || defined(__AVR_ATmega8__) \ + || defined(__AVR_ATmega88__) +/*------------------------------------------------------------------------ */ + +/* Onboard LED is connected to pin PB5 in Arduino NG, Diecimila, and Duemilanove + */ +#if !defined(LED) +#define LED B5 +#endif + +/* Ports for soft UART */ +#ifdef SOFT_UART +#define UART_PORT PORTD +#define UART_PIN PIND +#define UART_DDR DDRD +#define UART_TX_BIT 1 +#define UART_RX_BIT 0 +#endif +#endif + +/* + * Handle devices with up to 4 uarts (eg m1280.) Rather inelegantly. + * Note that mega8/m32 still needs special handling, because ubrr is handled + * differently. + */ +#if UART == 0 +# define UART_SRA UCSR0A +# define UART_SRB UCSR0B +# define UART_SRC UCSR0C +# define UART_SRL UBRR0L +# define UART_UDR UDR0 +#elif UART == 1 +#if !defined(UDR1) +#error UART == 1, but no UART1 on device +#endif +# define UART_SRA UCSR1A +# define UART_SRB UCSR1B +# define UART_SRC UCSR1C +# define UART_SRL UBRR1L +# define UART_UDR UDR1 +#elif UART == 2 +#if !defined(UDR2) +#error UART == 2, but no UART2 on device +#endif +# define UART_SRA UCSR2A +# define UART_SRB UCSR2B +# define UART_SRC UCSR2C +# define UART_SRL UBRR2L +# define UART_UDR UDR2 +#elif UART == 3 +#if !defined(UDR3) +#error UART == 3, but no UART3 on device +#endif +# define UART_SRA UCSR3A +# define UART_SRB UCSR3B +# define UART_SRC UCSR3C +# define UART_SRL UBRR3L +# define UART_UDR UDR3 +#endif + +#if defined(__AVR_ATmega8__) \ + || defined (__AVR_ATmega32__) \ + || defined (__AVR_ATmega16__) + //Name conversion R.Wiersma + #define UCSR0A UCSRA + #define UDR0 UDR + #define UDRE0 UDRE + #define RXC0 RXC + #define FE0 FE + #define TIFR1 TIFR + #define WDTCSR WDTCR +#endif + +#if defined (__AVR_ATmega32__) \ + || defined (__AVR_ATmega16__) + #define WDCE WDTOE +#endif + +/* Luminet support */ +/*------------------------------------------------------------------------ */ +#if defined(__AVR_ATtiny84__) +/*------------------------------------------------------------------------ */ +/* Red LED is connected to pin PA4 */ +#if !defined(LED) +#define LED A4 +#endif + +/* Ports for soft UART - left port only for now. TX/RX on PA2/PA3 */ +#ifdef SOFT_UART +#define UART_PORT PORTA +#define UART_PIN PINA +#define UART_DDR DDRA +#define UART_TX_BIT 2 +#define UART_RX_BIT 3 +#endif +#endif + +/*------------------------------------------------------------------------ */ +/* Sanguino support (and other 40pin DIP cpus) */ +#if defined(__AVR_ATmega644P__) \ + || defined(__AVR_ATmega1284P__) \ + || defined(__AVR_ATmega32__) \ + || defined (__AVR_ATmega16__) +/*------------------------------------------------------------------------ */ +/* Onboard LED is connected to pin PB0 on Sanguino */ +#if !defined(LED) +#define LED B0 +#endif + +/* Ports for soft UART */ +#ifdef SOFT_UART +#define UART_PORT PORTD +#define UART_PIN PIND +#define UART_DDR DDRD +#define UART_TX_BIT 1 +#define UART_RX_BIT 0 +#endif +#endif + +/*------------------------------------------------------------------------ */ +/* Mega support */ +#if defined(__AVR_ATmega1280__) \ + || defined(__AVR_ATmega2560__) +/*------------------------------------------------------------------------ */ +/* Onboard LED is connected to pin PB7 on Arduino Mega */ +#if !defined(LED) +#define LED B7 +#endif + +/* Ports for soft UART */ +#ifdef SOFT_UART +#define UART_PORT PORTE +#define UART_PIN PINE +#define UART_DDR DDRE +#define UART_TX_BIT 1 +#define UART_RX_BIT 0 +#endif +#endif + +/* + * ------------------------------------------------------------------------ + * A bunch of macros to enable the LED to be specifed as "B5" for bit 5 + * of port B, and similar. + * We define symbols for all the legal combination of port/bit on a chip, + * and do pre-processor tests to see if there's a match. This ends up + * being very verbose, but it is pretty easy to generate semi-automatically. + * (We wouldn't need this if the preprocessor could do string compares.) + */ + +// Symbols for each PortA bit. +#define A0 0x100 +#define A1 0x101 +#define A2 0x102 +#define A3 0x103 +#define A4 0x104 +#define A5 0x105 +#define A6 0x106 +#define A7 0x107 +// If there is no PORTA on this chip, don't allow these to be used +// (and indicate the error by redefining LED) +#if !defined(PORTA) +#if LED >= A0 && LED <= A7 +#undef LED +#define LED -1 +#endif +#endif + +#define B0 0x200 +#define B1 0x201 +#define B2 0x202 +#define B3 0x203 +#define B4 0x204 +#define B5 0x205 +#define B6 0x206 +#define B7 0x207 +#if !defined(PORTB) +#if LED >= B0 && LED <= B7 +#undef LED +#define LED -1 +#endif +#endif + +#define C0 0x300 +#define C1 0x301 +#define C2 0x302 +#define C3 0x303 +#define C4 0x304 +#define C5 0x305 +#define C6 0x306 +#define C7 0x307 +#if !(defined(PORTC)) +#if LED >= C0 && LED <= C7 +#undef LED +#define LED -1 +#endif +#endif + +#define D0 0x400 +#define D1 0x401 +#define D2 0x402 +#define D3 0x403 +#define D4 0x404 +#define D5 0x405 +#define D6 0x406 +#define D7 0x407 +#if !(defined(PORTD)) +#if LED >= D0 && LED <= D7 +#undef LED +#define LED -1 +#endif +#endif + +#define E0 0x500 +#define E1 0x501 +#define E2 0x502 +#define E3 0x503 +#define E4 0x504 +#define E5 0x505 +#define E6 0x506 +#define E7 0x507 +#if !(defined(PORTE)) +#if LED >= E0 && LED <= E7 +#undef LED +#define LED -1 +#endif +#endif + +#define F0 0x600 +#define F1 0x601 +#define F2 0x602 +#define F3 0x603 +#define F4 0x604 +#define F5 0x605 +#define F6 0x606 +#define F7 0x607 +#if !(defined(PORTF)) +#if LED >= F0 && LED <= F7 +#undef LED +#define LED -1 +#endif +#endif + +#define G0 0x700 +#define G1 0x701 +#define G2 0x702 +#define G3 0x703 +#define G4 0x704 +#define G5 0x705 +#define G6 0x706 +#define G7 0x707 +#if !defined(PORTG) +#if LED >= G0 && LED <= G7 +#undef LED +#define LED -1 +#endif +#endif + +#define H0 0x800 +#define H1 0x801 +#define H2 0x802 +#define H3 0x803 +#define H4 0x804 +#define H5 0x805 +#define H6 0x806 +#define H7 0x807 +#if !(defined(PORTH)) +#if LED >= H0 && LED <= H7 +#undef LED +#define LED -1 +#endif +#endif + +#define J0 0xA00 +#define J1 0xA01 +#define J2 0xA02 +#define J3 0xA03 +#define J4 0xA04 +#define J5 0xA05 +#define J6 0xA06 +#define J7 0xA07 +#if !(defined(PORTJ)) +#if LED >= J0 && LED <= J7 +#undef LED +#define LED -1 +#endif +#endif + +#define K0 0xB00 +#define K1 0xB01 +#define K2 0xB02 +#define K3 0xB03 +#define K4 0xB04 +#define K5 0xB05 +#define K6 0xB06 +#define K7 0xB07 +#if !(defined(PORTK)) +#if LED >= K0 && LED <= K7 +#undef LED +#define LED -1 +#endif +#endif + +#define L0 0xC00 +#define L1 0xC01 +#define L2 0xC02 +#define L3 0xC03 +#define L4 0xC04 +#define L5 0xC05 +#define L6 0xC06 +#define L7 0xC07 +#if !(defined(PORTL)) +#if LED >= L0 && LED <= L7 +#undef LED +#define LED -1 +#endif +#endif + + +/* + * A statement like "#if LED == B0" will evaluation (in the preprocessor) + * to #if C0 == B0, and then to #if 0x301 == 0x201 + */ +#if LED == B0 +#undef LED +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB0 +#elif LED == B1 +#undef LED +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB1 +#elif LED == B2 +#undef LED +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB2 +#elif LED == B3 +#undef LED +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB3 +#elif LED == B4 +#undef LED +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB4 +#elif LED == B5 +#undef LED +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB5 +#elif LED == B6 +#undef LED +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB6 +#elif LED == B7 +#undef LED +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB7 + +#elif LED == C0 +#undef LED +#define LED_DDR DDRC +#define LED_PORT PORTC +#define LED_PIN PINC +#define LED PINC0 +#elif LED == C1 +#undef LED +#define LED_DDR DDRC +#define LED_PORT PORTC +#define LED_PIN PINC +#define LED PINC1 +#elif LED == C2 +#undef LED +#define LED_DDR DDRC +#define LED_PORT PORTC +#define LED_PIN PINC +#define LED PINC2 +#elif LED == C3 +#undef LED +#define LED_DDR DDRC +#define LED_PORT PORTC +#define LED_PIN PINC +#define LED PINC3 +#elif LED == C4 +#undef LED +#define LED_DDR DDRC +#define LED_PORT PORTC +#define LED_PIN PINC +#define LED PINC4 +#elif LED == C5 +#undef LED +#define LED_DDR DDRC +#define LED_PORT PORTC +#define LED_PIN PINC +#define LED PINC5 +#elif LED == C6 +#undef LED +#define LED_DDR DDRC +#define LED_PORT PORTC +#define LED_PIN PINC +#define LED PINC6 +#elif LED == C7 +#undef LED +#define LED_DDR DDRC +#define LED_PORT PORTC +#define LED_PIN PINC +#define LED PINC7 + +#elif LED == D0 +#undef LED +#define LED_DDR DDRD +#define LED_PORT PORTD +#define LED_PIN PIND +#define LED PIND0 +#elif LED == D1 +#undef LED +#define LED_DDR DDRD +#define LED_PORT PORTD +#define LED_PIN PIND +#define LED PIND1 +#elif LED == D2 +#undef LED +#define LED_DDR DDRD +#define LED_PORT PORTD +#define LED_PIN PIND +#define LED PIND2 +#elif LED == D3 +#undef LED +#define LED_DDR DDRD +#define LED_PORT PORTD +#define LED_PIN PIND +#define LED PIND3 +#elif LED == D4 +#undef LED +#define LED_DDR DDRD +#define LED_PORT PORTD +#define LED_PIN PIND +#define LED PIND4 +#elif LED == D5 +#undef LED +#define LED_DDR DDRD +#define LED_PORT PORTD +#define LED_PIN PIND +#define LED PIND5 +#elif LED == D6 +#undef LED +#define LED_DDR DDRD +#define LED_PORT PORTD +#define LED_PIN PIND +#define LED PIND6 +#elif LED == D7 +#undef LED +#define LED_DDR DDRD +#define LED_PORT PORTD +#define LED_PIN PIND +#define LED PIND7 + +#elif LED == E0 +#undef LED +#define LED_DDR DDRE +#define LED_PORT PORTE +#define LED_PIN PINE +#define LED PINE0 +#elif LED == E1 +#undef LED +#define LED_DDR DDRE +#define LED_PORT PORTE +#define LED_PIN PINE +#define LED PINE1 +#elif LED == E2 +#undef LED +#define LED_DDR DDRE +#define LED_PORT PORTE +#define LED_PIN PINE +#define LED PINE2 +#elif LED == E3 +#undef LED +#define LED_DDR DDRE +#define LED_PORT PORTE +#define LED_PIN PINE +#define LED PINE3 +#elif LED == E4 +#undef LED +#define LED_DDR DDRE +#define LED_PORT PORTE +#define LED_PIN PINE +#define LED PINE4 +#elif LED == E5 +#undef LED +#define LED_DDR DDRE +#define LED_PORT PORTE +#define LED_PIN PINE +#define LED PINE5 +#elif LED == E6 +#undef LED +#define LED_DDR DDRE +#define LED_PORT PORTE +#define LED_PIN PINE +#define LED PINE6 +#elif LED == E7 +#undef LED +#define LED_DDR DDRE +#define LED_PORT PORTE +#define LED_PIN PINE +#define LED PINE7 + +#elif LED == F0 +#undef LED +#define LED_DDR DDRF +#define LED_PORT PORTF +#define LED_PIN PINF +#define LED PINF0 +#elif LED == F1 +#undef LED +#define LED_DDR DDRF +#define LED_PORT PORTF +#define LED_PIN PINF +#define LED PINF1 +#elif LED == F2 +#undef LED +#define LED_DDR DDRF +#define LED_PORT PORTF +#define LED_PIN PINF +#define LED PINF2 +#elif LED == F3 +#undef LED +#define LED_DDR DDRF +#define LED_PORT PORTF +#define LED_PIN PINF +#define LED PINF3 +#elif LED == F4 +#undef LED +#define LED_DDR DDRF +#define LED_PORT PORTF +#define LED_PIN PINF +#define LED PINF4 +#elif LED == F5 +#undef LED +#define LED_DDR DDRF +#define LED_PORT PORTF +#define LED_PIN PINF +#define LED PINF5 +#elif LED == F6 +#undef LED +#define LED_DDR DDRF +#define LED_PORT PORTF +#define LED_PIN PINF +#define LED PINF6 +#elif LED == F7 +#undef LED +#define LED_DDR DDRF +#define LED_PORT PORTF +#define LED_PIN PINF +#define LED PINF7 + +#elif LED == G0 +#undef LED +#define LED_DDR DDRG +#define LED_PORT PORTG +#define LED_PIN PING +#define LED PING0 +#elif LED == G1 +#undef LED +#define LED_DDR DDRG +#define LED_PORT PORTG +#define LED_PIN PING +#define LED PING1 +#elif LED == G2 +#undef LED +#define LED_DDR DDRG +#define LED_PORT PORTG +#define LED_PIN PING +#define LED PING2 +#elif LED == G3 +#undef LED +#define LED_DDR DDRG +#define LED_PORT PORTG +#define LED_PIN PING +#define LED PING3 +#elif LED == G4 +#undef LED +#define LED_DDR DDRG +#define LED_PORT PORTG +#define LED_PIN PING +#define LED PING4 +#elif LED == G5 +#undef LED +#define LED_DDR DDRG +#define LED_PORT PORTG +#define LED_PIN PING +#define LED PING5 +#elif LED == G6 +#undef LED +#define LED_DDR DDRG +#define LED_PORT PORTG +#define LED_PIN PING +#define LED PING6 +#elif LED == G7 +#undef LED +#define LED_DDR DDRG +#define LED_PORT PORTG +#define LED_PIN PING +#define LED PING7 + +#elif LED == H0 +#undef LED +#define LED_DDR DDRH +#define LED_PORT PORTH +#define LED_PIN PINH +#define LED PINH0 +#elif LED == H1 +#undef LED +#define LED_DDR DDRH +#define LED_PORT PORTH +#define LED_PIN PINH +#define LED PINH1 +#elif LED == H2 +#undef LED +#define LED_DDR DDRH +#define LED_PORT PORTH +#define LED_PIN PINH +#define LED PINH2 +#elif LED == H3 +#undef LED +#define LED_DDR DDRH +#define LED_PORT PORTH +#define LED_PIN PINH +#define LED PINH3 +#elif LED == H4 +#undef LED +#define LED_DDR DDRH +#define LED_PORT PORTH +#define LED_PIN PINH +#define LED PINH4 +#elif LED == H5 +#undef LED +#define LED_DDR DDRH +#define LED_PORT PORTH +#define LED_PIN PINH +#define LED PINH5 +#elif LED == H6 +#undef LED +#define LED_DDR DDRH +#define LED_PORT PORTH +#define LED_PIN PINH +#define LED PINH6 +#elif LED == H7 +#undef LED +#define LED_DDR DDRH +#define LED_PORT PORTH +#define LED_PIN PINH +#define LED PINH7 + +#elif LED == J0 +#undef LED +#define LED_DDR DDRJ +#define LED_PORT PORTJ +#define LED_PIN PINJ +#define LED PINJ0 +#elif LED == J1 +#undef LED +#define LED_DDR DDRJ +#define LED_PORT PORTJ +#define LED_PIN PINJ +#define LED PINJ1 +#elif LED == J2 +#undef LED +#define LED_DDR DDRJ +#define LED_PORT PORTJ +#define LED_PIN PINJ +#define LED PINJ2 +#elif LED == J3 +#undef LED +#define LED_DDR DDRJ +#define LED_PORT PORTJ +#define LED_PIN PINJ +#define LED PINJ3 +#elif LED == J4 +#undef LED +#define LED_DDR DDRJ +#define LED_PORT PORTJ +#define LED_PIN PINJ +#define LED PINJ4 +#elif LED == J5 +#undef LED +#define LED_DDR DDRJ +#define LED_PORT PORTJ +#define LED_PIN PINJ +#define LED PINJ5 +#elif LED == J6 +#undef LED +#define LED_DDR DDRJ +#define LED_PORT PORTJ +#define LED_PIN PINJ +#define LED PINJ6 +#elif LED == J7 +#undef LED +#define LED_DDR DDRJ +#define LED_PORT PORTJ +#define LED_PIN PINJ +#define LED PINJ7 + +#elif LED == K0 +#undef LED +#define LED_DDR DDRK +#define LED_PORT PORTK +#define LED_PIN PINK +#define LED PINK0 +#elif LED == K1 +#undef LED +#define LED_DDR DDRK +#define LED_PORT PORTK +#define LED_PIN PINK +#define LED PINK1 +#elif LED == K2 +#undef LED +#define LED_DDR DDRK +#define LED_PORT PORTK +#define LED_PIN PINK +#define LED PINK2 +#elif LED == K3 +#undef LED +#define LED_DDR DDRK +#define LED_PORT PORTK +#define LED_PIN PINK +#define LED PINK3 +#elif LED == K4 +#undef LED +#define LED_DDR DDRK +#define LED_PORT PORTK +#define LED_PIN PINK +#define LED PINK4 +#elif LED == K5 +#undef LED +#define LED_DDR DDRK +#define LED_PORT PORTK +#define LED_PIN PINK +#define LED PINK5 +#elif LED == K6 +#undef LED +#define LED_DDR DDRK +#define LED_PORT PORTK +#define LED_PIN PINK +#define LED PINK6 +#elif LED == K7 +#undef LED +#define LED_DDR DDRK +#define LED_PORT PORTK +#define LED_PIN PINK +#define LED PINK7 + +#elif LED == L0 +#undef LED +#define LED_DDR DDRL +#define LED_PORT PORTL +#define LED_PIN PINL +#define LED PINL0 +#elif LED == L1 +#undef LED +#define LED_DDR DDRL +#define LED_PORT PORTL +#define LED_PIN PINL +#define LED PINL1 +#elif LED == L2 +#undef LED +#define LED_DDR DDRL +#define LED_PORT PORTL +#define LED_PIN PINL +#define LED PINL2 +#elif LED == L3 +#undef LED +#define LED_DDR DDRL +#define LED_PORT PORTL +#define LED_PIN PINL +#define LED PINL3 +#elif LED == L4 +#undef LED +#define LED_DDR DDRL +#define LED_PORT PORTL +#define LED_PIN PINL +#define LED PINL4 +#elif LED == L5 +#undef LED +#define LED_DDR DDRL +#define LED_PORT PORTL +#define LED_PIN PINL +#define LED PINL5 +#elif LED == L6 +#undef LED +#define LED_DDR DDRL +#define LED_PORT PORTL +#define LED_PIN PINL +#define LED PINL6 +#elif LED == L7 +#undef LED +#define LED_DDR DDRL +#define LED_PORT PORTL +#define LED_PIN PINL +#define LED PINL7 + +#elif LED == A0 +#undef LED +#define LED_DDR DDRA +#define LED_PORT PORTA +#define LED_PIN PINA +#define LED PINA0 +#elif LED == A1 +#undef LED +#define LED_DDR DDRA +#define LED_PORT PORTA +#define LED_PIN PINA +#define LED PINA1 +#elif LED == A2 +#undef LED +#define LED_DDR DDRA +#define LED_PORT PORTA +#define LED_PIN PINA +#define LED PINA2 +#elif LED == A3 +#undef LED +#define LED_DDR DDRA +#define LED_PORT PORTA +#define LED_PIN PINA +#define LED PINA3 +#elif LED == A4 +#undef LED +#define LED_DDR DDRA +#define LED_PORT PORTA +#define LED_PIN PINA +#define LED PINA4 +#elif LED == A5 +#undef LED +#define LED_DDR DDRA +#define LED_PORT PORTA +#define LED_PIN PINA +#define LED PINA5 +#elif LED == A6 +#undef LED +#define LED_DDR DDRA +#define LED_PORT PORTA +#define LED_PIN PINA +#define LED PINA6 +#elif LED == A7 +#undef LED +#define LED_DDR DDRA +#define LED_PORT PORTA +#define LED_PIN PINA +#define LED PINA7 + +#else +// Stop compilation right away, so we don't get more errors. +#if LED == -1 +#error Unrecognized LED name. Should be like "B5" +// Stop compilation right away, so we don't get more errors. +#pragma GCC diagnostic warning "-Wfatal-errors" +#error Nonexistent LED PORT. Check datasheet. +#endif +#pragma GCC diagnostic warning "-Wfatal-errors" +#error Unrecognized LED name. Should be like "B5" +#endif diff --git a/ActualOptiboot/optiboot/bootloaders/optiboot/stk500.h b/ActualOptiboot/optiboot/bootloaders/optiboot/stk500.h new file mode 100644 index 0000000..ee1a17f --- /dev/null +++ b/ActualOptiboot/optiboot/bootloaders/optiboot/stk500.h @@ -0,0 +1,49 @@ +/* STK500 constants list, from AVRDUDE + * + * Trivial set of constants derived from Atmel App Note AVR061 + * Not copyrighted. Released to the public domain. + */ + +#define STK_OK 0x10 +#define STK_FAILED 0x11 // Not used +#define STK_UNKNOWN 0x12 // Not used +#define STK_NODEVICE 0x13 // Not used +#define STK_INSYNC 0x14 // ' ' +#define STK_NOSYNC 0x15 // Not used +#define ADC_CHANNEL_ERROR 0x16 // Not used +#define ADC_MEASURE_OK 0x17 // Not used +#define PWM_CHANNEL_ERROR 0x18 // Not used +#define PWM_ADJUST_OK 0x19 // Not used +#define CRC_EOP 0x20 // 'SPACE' +#define STK_GET_SYNC 0x30 // '0' +#define STK_GET_SIGN_ON 0x31 // '1' +#define STK_SET_PARAMETER 0x40 // '@' +#define STK_GET_PARAMETER 0x41 // 'A' +#define STK_SET_DEVICE 0x42 // 'B' +#define STK_SET_DEVICE_EXT 0x45 // 'E' +#define STK_ENTER_PROGMODE 0x50 // 'P' +#define STK_LEAVE_PROGMODE 0x51 // 'Q' +#define STK_CHIP_ERASE 0x52 // 'R' +#define STK_CHECK_AUTOINC 0x53 // 'S' +#define STK_LOAD_ADDRESS 0x55 // 'U' +#define STK_UNIVERSAL 0x56 // 'V' +#define STK_PROG_FLASH 0x60 // '`' +#define STK_PROG_DATA 0x61 // 'a' +#define STK_PROG_FUSE 0x62 // 'b' +#define STK_PROG_LOCK 0x63 // 'c' +#define STK_PROG_PAGE 0x64 // 'd' +#define STK_PROG_FUSE_EXT 0x65 // 'e' +#define STK_READ_FLASH 0x70 // 'p' +#define STK_READ_DATA 0x71 // 'q' +#define STK_READ_FUSE 0x72 // 'r' +#define STK_READ_LOCK 0x73 // 's' +#define STK_READ_PAGE 0x74 // 't' +#define STK_READ_SIGN 0x75 // 'u' +#define STK_READ_OSCCAL 0x76 // 'v' +#define STK_READ_FUSE_EXT 0x77 // 'w' +#define STK_READ_OSCCAL_EXT 0x78 // 'x' +#define STK_SW_MAJOR 0x81 // ' ' +#define STK_SW_MINOR 0x82 // ' ' + +/* AVR raw commands sent via STK_UNIVERSAL */ +#define AVR_OP_LOAD_EXT_ADDR 0x4d diff --git a/ActualOptiboot/optiboot/examples/chaucer112k/chaucer112k.ino b/ActualOptiboot/optiboot/examples/chaucer112k/chaucer112k.ino new file mode 100644 index 0000000..9efbd49 --- /dev/null +++ b/ActualOptiboot/optiboot/examples/chaucer112k/chaucer112k.ino @@ -0,0 +1,2355 @@ +// Text is an extract from The Canterbury Tales +// Full text at http://www.gutenberg.org/dirs/etext00/cbtls12.txt +#include + +const char knightsTale[] PROGMEM = { + " THE KNIGHT'S TALE <1>\n" + "\n" + "\n" + "WHILOM*, as olde stories tellen us, *formerly\n" + "There was a duke that highte* Theseus. *was called <2>\n" + "Of Athens he was lord and governor,\n" + "And in his time such a conqueror\n" + "That greater was there none under the sun.\n" + "Full many a riche country had he won.\n" + "What with his wisdom and his chivalry,\n" + "He conquer'd all the regne of Feminie,<3>\n" + "That whilom was y-cleped Scythia;\n" + "And weddede the Queen Hippolyta\n" + "And brought her home with him to his country\n" + "With muchel* glory and great solemnity, *great\n" + "And eke her younge sister Emily,\n" + "And thus with vict'ry and with melody\n" + "Let I this worthy Duke to Athens ride,\n" + "And all his host, in armes him beside.\n" + "\n" + "And certes, if it n'ere* too long to hear, *were not\n" + "I would have told you fully the mannere,\n" + "How wonnen* was the regne of Feminie, <4> *won\n" + "By Theseus, and by his chivalry;\n" + "And of the greate battle for the nonce\n" + "Betwixt Athenes and the Amazons;\n" + "And how assieged was Hippolyta,\n" + "The faire hardy queen of Scythia;\n" + "And of the feast that was at her wedding\n" + "And of the tempest at her homecoming.\n" + "But all these things I must as now forbear.\n" + "I have, God wot, a large field to ear* *plough<5>;\n" + "And weake be the oxen in my plough;\n" + "The remnant of my tale is long enow.\n" + "I will not *letten eke none of this rout*. *hinder any of\n" + "Let every fellow tell his tale about, this company*\n" + "And let see now who shall the supper win.\n" + "There *as I left*, I will again begin. *where I left off*\n" + "\n" + "This Duke, of whom I make mentioun,\n" + "When he was come almost unto the town,\n" + "In all his weal, and in his moste pride,\n" + "He was ware, as he cast his eye aside,\n" + "Where that there kneeled in the highe way\n" + "A company of ladies, tway and tway,\n" + "Each after other, clad in clothes black:\n" + "But such a cry and such a woe they make,\n" + "That in this world n'is creature living,\n" + "That hearde such another waimenting* *lamenting <6>\n" + "And of this crying would they never stenten*, *desist\n" + "Till they the reines of his bridle henten*. *seize\n" + "\"What folk be ye that at mine homecoming\n" + "Perturben so my feaste with crying?\"\n" + "Quoth Theseus; \"Have ye so great envy\n" + "Of mine honour, that thus complain and cry?\n" + "Or who hath you misboden*, or offended? *wronged\n" + "Do telle me, if it may be amended;\n" + "And why that ye be clad thus all in black?\"\n" + "\n" + "The oldest lady of them all then spake,\n" + "When she had swooned, with a deadly cheer*, *countenance\n" + "That it was ruthe* for to see or hear. *pity\n" + "She saide; \"Lord, to whom fortune hath given\n" + "Vict'ry, and as a conqueror to liven,\n" + "Nought grieveth us your glory and your honour;\n" + "But we beseechen mercy and succour.\n" + "Have mercy on our woe and our distress;\n" + "Some drop of pity, through thy gentleness,\n" + "Upon us wretched women let now fall.\n" + "For certes, lord, there is none of us all\n" + "That hath not been a duchess or a queen;\n" + "Now be we caitives*, as it is well seen: *captives\n" + "Thanked be Fortune, and her false wheel,\n" + "That *none estate ensureth to be wele*. *assures no continuance of\n" + "And certes, lord, t'abiden your presence prosperous estate*\n" + "Here in this temple of the goddess Clemence\n" + "We have been waiting all this fortenight:\n" + "Now help us, lord, since it lies in thy might.\n" + "\n" + "\"I, wretched wight, that weep and waile thus,\n" + "Was whilom wife to king Capaneus,\n" + "That starf* at Thebes, cursed be that day: *died <7>\n" + "And alle we that be in this array,\n" + "And maken all this lamentatioun,\n" + "We losten all our husbands at that town,\n" + "While that the siege thereabouten lay.\n" + "And yet the olde Creon, wellaway!\n" + "That lord is now of Thebes the city,\n" + "Fulfilled of ire and of iniquity,\n" + "He for despite, and for his tyranny,\n" + "To do the deade bodies villainy*, *insult\n" + "Of all our lorde's, which that been y-slaw, *slain\n" + "Hath all the bodies on an heap y-draw,\n" + "And will not suffer them by none assent\n" + "Neither to be y-buried, nor y-brent*, *burnt\n" + "But maketh houndes eat them in despite.\"\n" + "And with that word, withoute more respite\n" + "They fallen groff,* and cryden piteously; *grovelling\n" + "\"Have on us wretched women some mercy,\n" + "And let our sorrow sinken in thine heart.\"\n" + "\n" + "This gentle Duke down from his courser start\n" + "With hearte piteous, when he heard them speak.\n" + "Him thoughte that his heart would all to-break,\n" + "When he saw them so piteous and so mate* *abased\n" + "That whilom weren of so great estate.\n" + "And in his armes he them all up hent*, *raised, took\n" + "And them comforted in full good intent,\n" + "And swore his oath, as he was true knight,\n" + "He woulde do *so farforthly his might* *as far as his power went*\n" + "Upon the tyrant Creon them to wreak*, *avenge\n" + "That all the people of Greece shoulde speak,\n" + "How Creon was of Theseus y-served,\n" + "As he that had his death full well deserved.\n" + "And right anon withoute more abode* *delay\n" + "His banner he display'd, and forth he rode\n" + "To Thebes-ward, and all his, host beside:\n" + "No ner* Athenes would he go nor ride, *nearer\n" + "Nor take his ease fully half a day,\n" + "But onward on his way that night he lay:\n" + "And sent anon Hippolyta the queen,\n" + "And Emily her younge sister sheen* *bright, lovely\n" + "Unto the town of Athens for to dwell:\n" + "And forth he rit*; there is no more to tell. *rode\n" + "\n" + "The red statue of Mars with spear and targe* *shield\n" + "So shineth in his white banner large\n" + "That all the fieldes glitter up and down:\n" + "And by his banner borne is his pennon\n" + "Of gold full rich, in which there was y-beat* *stamped\n" + "The Minotaur<8> which that he slew in Crete\n" + "Thus rit this Duke, thus rit this conqueror\n" + "And in his host of chivalry the flower,\n" + "Till that he came to Thebes, and alight\n" + "Fair in a field, there as he thought to fight.\n" + "But shortly for to speaken of this thing,\n" + "With Creon, which that was of Thebes king,\n" + "He fought, and slew him manly as a knight\n" + "In plain bataille, and put his folk to flight:\n" + "And by assault he won the city after,\n" + "And rent adown both wall, and spar, and rafter;\n" + "And to the ladies he restored again\n" + "The bodies of their husbands that were slain,\n" + "To do obsequies, as was then the guise*. *custom\n" + "\n" + "But it were all too long for to devise* *describe\n" + "The greate clamour, and the waimenting*, *lamenting\n" + "Which that the ladies made at the brenning* *burning\n" + "Of the bodies, and the great honour\n" + "That Theseus the noble conqueror\n" + "Did to the ladies, when they from him went:\n" + "But shortly for to tell is mine intent.\n" + "When that this worthy Duke, this Theseus,\n" + "Had Creon slain, and wonnen Thebes thus,\n" + "Still in the field he took all night his rest,\n" + "And did with all the country as him lest*. *pleased\n" + "To ransack in the tas* of bodies dead, *heap\n" + "Them for to strip of *harness and of **weed, *armour **clothes\n" + "The pillers* did their business and cure, *pillagers <9>\n" + "After the battle and discomfiture.\n" + "And so befell, that in the tas they found,\n" + "Through girt with many a grievous bloody wound,\n" + "Two younge knightes *ligging by and by* *lying side by side*\n" + "Both in *one armes*, wrought full richely: *the same armour*\n" + "Of whiche two, Arcita hight that one,\n" + "And he that other highte Palamon.\n" + "Not fully quick*, nor fully dead they were, *alive\n" + "But by their coat-armour, and by their gear,\n" + "The heralds knew them well in special,\n" + "As those that weren of the blood royal\n" + "Of Thebes, and *of sistren two y-born*. *born of two sisters*\n" + "Out of the tas the pillers have them torn,\n" + "And have them carried soft unto the tent\n" + "Of Theseus, and he full soon them sent\n" + "To Athens, for to dwellen in prison\n" + "Perpetually, he *n'olde no ranson*. *would take no ransom*\n" + "And when this worthy Duke had thus y-done,\n" + "He took his host, and home he rit anon\n" + "With laurel crowned as a conquerour;\n" + "And there he lived in joy and in honour\n" + "Term of his life; what needeth wordes mo'?\n" + "And in a tower, in anguish and in woe,\n" + "Dwellen this Palamon, and eke Arcite,\n" + "For evermore, there may no gold them quite* *set free\n" + "\n" + "Thus passed year by year, and day by day,\n" + "Till it fell ones in a morn of May\n" + "That Emily, that fairer was to seen\n" + "Than is the lily upon his stalke green,\n" + "And fresher than the May with flowers new\n" + "(For with the rose colour strove her hue;\n" + "I n'ot* which was the finer of them two), *know not\n" + "Ere it was day, as she was wont to do,\n" + "She was arisen, and all ready dight*, *dressed\n" + "For May will have no sluggardy a-night;\n" + "The season pricketh every gentle heart,\n" + "And maketh him out of his sleep to start,\n" + "And saith, \"Arise, and do thine observance.\"\n" + "\n" + "This maketh Emily have remembrance\n" + "To do honour to May, and for to rise.\n" + "Y-clothed was she fresh for to devise;\n" + "Her yellow hair was braided in a tress,\n" + "Behind her back, a yarde long I guess.\n" + "And in the garden at *the sun uprist* *sunrise\n" + "She walketh up and down where as her list.\n" + "She gathereth flowers, party* white and red, *mingled\n" + "To make a sotel* garland for her head, *subtle, well-arranged\n" + "And as an angel heavenly she sung.\n" + "The greate tower, that was so thick and strong,\n" + "Which of the castle was the chief dungeon<10>\n" + "(Where as these knightes weren in prison,\n" + "Of which I tolde you, and telle shall),\n" + "Was even joinant* to the garden wall, *adjoining\n" + "There as this Emily had her playing.\n" + "\n" + "Bright was the sun, and clear that morrowning,\n" + "And Palamon, this woful prisoner,\n" + "As was his wont, by leave of his gaoler,\n" + "Was ris'n, and roamed in a chamber on high,\n" + "In which he all the noble city sigh*, *saw\n" + "And eke the garden, full of branches green,\n" + "There as this fresh Emelia the sheen\n" + "Was in her walk, and roamed up and down.\n" + "This sorrowful prisoner, this Palamon\n" + "Went in his chamber roaming to and fro,\n" + "And to himself complaining of his woe:\n" + "That he was born, full oft he said, Alas!\n" + "And so befell, by aventure or cas*, *chance\n" + "That through a window thick of many a bar\n" + "Of iron great, and square as any spar,\n" + "He cast his eyes upon Emelia,\n" + "And therewithal he blent* and cried, Ah! *started aside\n" + "As though he stungen were unto the heart.\n" + "And with that cry Arcite anon up start,\n" + "And saide, \"Cousin mine, what aileth thee,\n" + "That art so pale and deadly for to see?\n" + "Why cried'st thou? who hath thee done offence?\n" + "For Godde's love, take all in patience\n" + "Our prison*, for it may none other be. *imprisonment\n" + "Fortune hath giv'n us this adversity'.\n" + "Some wick'* aspect or disposition *wicked\n" + "Of Saturn<11>, by some constellation,\n" + "Hath giv'n us this, although we had it sworn,\n" + "So stood the heaven when that we were born,\n" + "We must endure; this is the short and plain.\n" + "\n" + "This Palamon answer'd, and said again:\n" + "\"Cousin, forsooth of this opinion\n" + "Thou hast a vain imagination.\n" + "This prison caused me not for to cry;\n" + "But I was hurt right now thorough mine eye\n" + "Into mine heart; that will my bane* be. *destruction\n" + "The fairness of the lady that I see\n" + "Yond in the garden roaming to and fro,\n" + "Is cause of all my crying and my woe.\n" + "I *n'ot wher* she be woman or goddess, *know not whether*\n" + "But Venus is it, soothly* as I guess, *truly\n" + "And therewithal on knees adown he fill,\n" + "And saide: \"Venus, if it be your will\n" + "You in this garden thus to transfigure\n" + "Before me sorrowful wretched creature,\n" + "Out of this prison help that we may scape.\n" + "And if so be our destiny be shape\n" + "By etern word to dien in prison,\n" + "Of our lineage have some compassion,\n" + "That is so low y-brought by tyranny.\"\n" + "\n" + "And with that word Arcita *gan espy* *began to look forth*\n" + "Where as this lady roamed to and fro\n" + "And with that sight her beauty hurt him so,\n" + "That if that Palamon was wounded sore,\n" + "Arcite is hurt as much as he, or more.\n" + "And with a sigh he saide piteously:\n" + "\"The freshe beauty slay'th me suddenly\n" + "Of her that roameth yonder in the place.\n" + "And but* I have her mercy and her grace, *unless\n" + "That I may see her at the leaste way,\n" + "I am but dead; there is no more to say.\"\n" + "This Palamon, when he these wordes heard,\n" + "Dispiteously* he looked, and answer'd: *angrily\n" + "\"Whether say'st thou this in earnest or in play?\"\n" + "\"Nay,\" quoth Arcite, \"in earnest, by my fay*. *faith\n" + "God help me so, *me lust full ill to play*.\" *I am in no humour\n" + "This Palamon gan knit his browes tway. for jesting*\n" + "\"It were,\" quoth he, \"to thee no great honour\n" + "For to be false, nor for to be traitour\n" + "To me, that am thy cousin and thy brother\n" + "Y-sworn full deep, and each of us to other,\n" + "That never for to dien in the pain <12>,\n" + "Till that the death departen shall us twain,\n" + "Neither of us in love to hinder other,\n" + "Nor in none other case, my leve* brother; *dear\n" + "But that thou shouldest truly farther me\n" + "In every case, as I should farther thee.\n" + "This was thine oath, and mine also certain;\n" + "I wot it well, thou dar'st it not withsayn*, *deny\n" + "Thus art thou of my counsel out of doubt,\n" + "And now thou wouldest falsely be about\n" + "To love my lady, whom I love and serve,\n" + "And ever shall, until mine hearte sterve* *die\n" + "Now certes, false Arcite, thou shalt not so\n" + "I lov'd her first, and tolde thee my woe\n" + "As to my counsel, and my brother sworn\n" + "To farther me, as I have told beforn.\n" + "For which thou art y-bounden as a knight\n" + "To helpe me, if it lie in thy might,\n" + "Or elles art thou false, I dare well sayn,\"\n" + "\n" + "This Arcita full proudly spake again:\n" + "\"Thou shalt,\" quoth he, \"be rather* false than I, *sooner\n" + "And thou art false, I tell thee utterly;\n" + "For par amour I lov'd her first ere thou.\n" + "What wilt thou say? *thou wist it not right now* *even now thou\n" + "Whether she be a woman or goddess. knowest not*\n" + "Thine is affection of holiness,\n" + "And mine is love, as to a creature:\n" + "For which I tolde thee mine aventure\n" + "As to my cousin, and my brother sworn\n" + "I pose*, that thou loved'st her beforn: *suppose\n" + "Wost* thou not well the olde clerke's saw<13>, *know'st\n" + "That who shall give a lover any law?\n" + "Love is a greater lawe, by my pan,\n" + "Than may be giv'n to any earthly man:\n" + "Therefore positive law, and such decree,\n" + "Is broke alway for love in each degree\n" + "A man must needes love, maugre his head.\n" + "He may not flee it, though he should be dead,\n" + "*All be she* maid, or widow, or else wife. *whether she be*\n" + "And eke it is not likely all thy life\n" + "To standen in her grace, no more than I\n" + "For well thou wost thyselfe verily,\n" + "That thou and I be damned to prison\n" + "Perpetual, us gaineth no ranson.\n" + "We strive, as did the houndes for the bone;\n" + "They fought all day, and yet their part was none.\n" + "There came a kite, while that they were so wroth,\n" + "And bare away the bone betwixt them both.\n" + "And therefore at the kinge's court, my brother,\n" + "Each man for himselfe, there is no other.\n" + "Love if thee list; for I love and aye shall\n" + "And soothly, leve brother, this is all.\n" + "Here in this prison musten we endure,\n" + "And each of us take his Aventure.\"\n" + "\n" + "Great was the strife and long between these tway,\n" + "If that I hadde leisure for to say;\n" + "But to the effect: it happen'd on a day\n" + "(To tell it you as shortly as I may),\n" + "A worthy duke that hight Perithous<14>\n" + "That fellow was to the Duke Theseus\n" + "Since thilke* day that they were children lite** *that **little\n" + "Was come to Athens, his fellow to visite,\n" + "And for to play, as he was wont to do;\n" + "For in this world he loved no man so;\n" + "And he lov'd him as tenderly again.\n" + "So well they lov'd, as olde bookes sayn,\n" + "That when that one was dead, soothly to sayn,\n" + "His fellow went and sought him down in hell:\n" + "But of that story list me not to write.\n" + "Duke Perithous loved well Arcite,\n" + "And had him known at Thebes year by year:\n" + "And finally at request and prayere\n" + "Of Perithous, withoute ranson\n" + "Duke Theseus him let out of prison,\n" + "Freely to go, where him list over all,\n" + "In such a guise, as I you tellen shall\n" + "This was the forword*, plainly to indite, *promise\n" + "Betwixte Theseus and him Arcite:\n" + "That if so were, that Arcite were y-found\n" + "Ever in his life, by day or night, one stound* *moment<15>\n" + "In any country of this Theseus,\n" + "And he were caught, it was accorded thus,\n" + "That with a sword he shoulde lose his head;\n" + "There was none other remedy nor rede*. *counsel\n" + "But took his leave, and homeward he him sped;\n" + "Let him beware, his necke lieth *to wed*. *in pledge*\n" + "\n" + "How great a sorrow suff'reth now Arcite!\n" + "The death he feeleth through his hearte smite;\n" + "He weepeth, waileth, crieth piteously;\n" + "To slay himself he waiteth privily.\n" + "He said; \"Alas the day that I was born!\n" + "Now is my prison worse than beforn:\n" + "*Now is me shape* eternally to dwell *it is fixed for me*\n" + "Not in purgatory, but right in hell.\n" + "Alas! that ever I knew Perithous.\n" + "For elles had I dwelt with Theseus\n" + "Y-fettered in his prison evermo'.\n" + "Then had I been in bliss, and not in woe.\n" + "Only the sight of her, whom that I serve,\n" + "Though that I never may her grace deserve,\n" + "Would have sufficed right enough for me.\n" + "O deare cousin Palamon,\" quoth he,\n" + "\"Thine is the vict'ry of this aventure,\n" + "Full blissfully in prison to endure:\n" + "In prison? nay certes, in paradise.\n" + "Well hath fortune y-turned thee the dice,\n" + "That hast the sight of her, and I th' absence.\n" + "For possible is, since thou hast her presence,\n" + "And art a knight, a worthy and an able,\n" + "That by some cas*, since fortune is changeable, *chance\n" + "Thou may'st to thy desire sometime attain.\n" + "But I that am exiled, and barren\n" + "Of alle grace, and in so great despair,\n" + "That there n'is earthe, water, fire, nor air,\n" + "Nor creature, that of them maked is,\n" + "That may me helpe nor comfort in this,\n" + "Well ought I *sterve in wanhope* and distress. *die in despair*\n" + "Farewell my life, my lust*, and my gladness. *pleasure\n" + "Alas, *why plainen men so in commune *why do men so often complain\n" + "Of purveyance of God*, or of Fortune, of God's providence?*\n" + "That giveth them full oft in many a guise\n" + "Well better than they can themselves devise?\n" + "Some man desireth for to have richess,\n" + "That cause is of his murder or great sickness.\n" + "And some man would out of his prison fain,\n" + "That in his house is of his meinie* slain. *servants <16>\n" + "Infinite harmes be in this mattere.\n" + "We wot never what thing we pray for here.\n" + "We fare as he that drunk is as a mouse.\n" + "A drunken man wot well he hath an house,\n" + "But he wot not which is the right way thither,\n" + "And to a drunken man the way is slither*. *slippery\n" + "And certes in this world so fare we.\n" + "We seeke fast after felicity,\n" + "But we go wrong full often truely.\n" + "Thus we may sayen all, and namely* I, *especially\n" + "That ween'd*, and had a great opinion, *thought\n" + "That if I might escape from prison\n" + "Then had I been in joy and perfect heal,\n" + "Where now I am exiled from my weal.\n" + "Since that I may not see you, Emily,\n" + "I am but dead; there is no remedy.\"\n" + "\n" + "Upon that other side, Palamon,\n" + "When that he wist Arcita was agone,\n" + "Much sorrow maketh, that the greate tower\n" + "Resounded of his yelling and clamour\n" + "The pure* fetters on his shinnes great *very <17>\n" + "Were of his bitter salte teares wet.\n" + "\n" + "\"Alas!\" quoth he, \"Arcita, cousin mine,\n" + "Of all our strife, God wot, the fruit is thine.\n" + "Thou walkest now in Thebes at thy large,\n" + "And of my woe thou *givest little charge*. *takest little heed*\n" + "Thou mayst, since thou hast wisdom and manhead*, *manhood, courage\n" + "Assemble all the folk of our kindred,\n" + "And make a war so sharp on this country\n" + "That by some aventure, or some treaty,\n" + "Thou mayst have her to lady and to wife,\n" + "For whom that I must needes lose my life.\n" + "For as by way of possibility,\n" + "Since thou art at thy large, of prison free,\n" + "And art a lord, great is thine avantage,\n" + "More than is mine, that sterve here in a cage.\n" + "For I must weep and wail, while that I live,\n" + "With all the woe that prison may me give,\n" + "And eke with pain that love me gives also,\n" + "That doubles all my torment and my woe.\"\n" + "\n" + "Therewith the fire of jealousy upstart\n" + "Within his breast, and hent* him by the heart *seized\n" + "So woodly*, that he like was to behold *madly\n" + "The box-tree, or the ashes dead and cold.\n" + "Then said; \"O cruel goddess, that govern\n" + "This world with binding of your word etern* *eternal\n" + "And writen in the table of adamant\n" + "Your parlement* and your eternal grant, *consultation\n" + "What is mankind more *unto you y-hold* *by you esteemed\n" + "Than is the sheep, that rouketh* in the fold! *lie huddled together\n" + "For slain is man, right as another beast;\n" + "And dwelleth eke in prison and arrest,\n" + "And hath sickness, and great adversity,\n" + "And oftentimes guilteless, pardie* *by God\n" + "What governance is in your prescience,\n" + "That guilteless tormenteth innocence?\n" + "And yet increaseth this all my penance,\n" + "That man is bounden to his observance\n" + "For Godde's sake to *letten of his will*, *restrain his desire*\n" + "Whereas a beast may all his lust fulfil.\n" + "And when a beast is dead, he hath no pain;\n" + "But man after his death must weep and plain,\n" + "Though in this worlde he have care and woe:\n" + "Withoute doubt it maye standen so.\n" + "\"The answer of this leave I to divines,\n" + "But well I wot, that in this world great pine* is; *pain, trouble\n" + "Alas! I see a serpent or a thief\n" + "That many a true man hath done mischief,\n" + "Go at his large, and where him list may turn.\n" + "But I must be in prison through Saturn,\n" + "And eke through Juno, jealous and eke wood*, *mad\n" + "That hath well nigh destroyed all the blood\n" + "Of Thebes, with his waste walles wide.\n" + "And Venus slay'th me on that other side\n" + "For jealousy, and fear of him, Arcite.\"\n" + "\n" + "Now will I stent* of Palamon a lite**, *pause **little\n" + "And let him in his prison stille dwell,\n" + "And of Arcita forth I will you tell.\n" + "The summer passeth, and the nightes long\n" + "Increase double-wise the paines strong\n" + "Both of the lover and the prisonere.\n" + "I n'ot* which hath the wofuller mistere**. *know not **condition\n" + "For, shortly for to say, this Palamon\n" + "Perpetually is damned to prison,\n" + "In chaines and in fetters to be dead;\n" + "And Arcite is exiled *on his head* *on peril of his head*\n" + "For evermore as out of that country,\n" + "Nor never more he shall his lady see.\n" + "You lovers ask I now this question,<18>\n" + "Who lieth the worse, Arcite or Palamon?\n" + "The one may see his lady day by day,\n" + "But in prison he dwelle must alway.\n" + "The other where him list may ride or go,\n" + "But see his lady shall he never mo'.\n" + "Now deem all as you liste, ye that can,\n" + "For I will tell you forth as I began.\n" + "\n" + "When that Arcite to Thebes comen was,\n" + "Full oft a day he swelt*, and said, \"Alas!\" *fainted\n" + "For see this lady he shall never mo'.\n" + "And shortly to concluden all his woe,\n" + "So much sorrow had never creature\n" + "That is or shall be while the world may dure.\n" + "His sleep, his meat, his drink is *him byraft*, *taken away from him*\n" + "That lean he wex*, and dry as any shaft. *became\n" + "His eyen hollow, grisly to behold,\n" + "His hue sallow, and pale as ashes cold,\n" + "And solitary he was, ever alone,\n" + "And wailing all the night, making his moan.\n" + "And if he hearde song or instrument,\n" + "Then would he weepen, he might not be stent*. *stopped\n" + "So feeble were his spirits, and so low,\n" + "And changed so, that no man coulde know\n" + "His speech, neither his voice, though men it heard.\n" + "And in his gear* for all the world he far'd *behaviour <19>\n" + "Not only like the lovers' malady\n" + "Of Eros, but rather y-like manie* *madness\n" + "Engender'd of humours melancholic,\n" + "Before his head in his cell fantastic.<20>\n" + "And shortly turned was all upside down,\n" + "Both habit and eke dispositioun,\n" + "Of him, this woful lover Dan* Arcite. *Lord <21>\n" + "Why should I all day of his woe indite?\n" + "When he endured had a year or two\n" + "This cruel torment, and this pain and woe,\n" + "At Thebes, in his country, as I said,\n" + "Upon a night in sleep as he him laid,\n" + "Him thought how that the winged god Mercury\n" + "Before him stood, and bade him to be merry.\n" + "His sleepy yard* in hand he bare upright; *rod <22>\n" + "A hat he wore upon his haires bright.\n" + "Arrayed was this god (as he took keep*) *notice\n" + "As he was when that Argus<23> took his sleep;\n" + "And said him thus: \"To Athens shalt thou wend*; *go\n" + "There is thee shapen* of thy woe an end.\" *fixed, prepared\n" + "And with that word Arcite woke and start.\n" + "\"Now truely how sore that e'er me smart,\"\n" + "Quoth he, \"to Athens right now will I fare.\n" + "Nor for no dread of death shall I not spare\n" + "To see my lady that I love and serve;\n" + "In her presence *I recke not to sterve.*\" *do not care if I die*\n" + "And with that word he caught a great mirror,\n" + "And saw that changed was all his colour,\n" + "And saw his visage all in other kind.\n" + "And right anon it ran him ill his mind,\n" + "That since his face was so disfigur'd\n" + "Of malady the which he had endur'd,\n" + "He mighte well, if that he *bare him low,* *lived in lowly fashion*\n" + "Live in Athenes evermore unknow,\n" + "And see his lady wellnigh day by day.\n" + "And right anon he changed his array,\n" + "And clad him as a poore labourer.\n" + "And all alone, save only a squier,\n" + "That knew his privity* and all his cas**, *secrets **fortune\n" + "Which was disguised poorly as he was,\n" + "To Athens is he gone the nexte* way. *nearest <24>\n" + "And to the court he went upon a day,\n" + "And at the gate he proffer'd his service,\n" + "To drudge and draw, what so men would devise*. *order\n" + "And, shortly of this matter for to sayn,\n" + "He fell in office with a chamberlain,\n" + "The which that dwelling was with Emily.\n" + "For he was wise, and coulde soon espy\n" + "Of every servant which that served her.\n" + "Well could he hewe wood, and water bear,\n" + "For he was young and mighty for the nones*, *occasion\n" + "And thereto he was strong and big of bones\n" + "To do that any wight can him devise.\n" + "\n" + "A year or two he was in this service,\n" + "Page of the chamber of Emily the bright;\n" + "And Philostrate he saide that he hight.\n" + "But half so well belov'd a man as he\n" + "Ne was there never in court of his degree.\n" + "He was so gentle of conditioun,\n" + "That throughout all the court was his renown.\n" + "They saide that it were a charity\n" + "That Theseus would *enhance his degree*, *elevate him in rank*\n" + "And put him in some worshipful service,\n" + "There as he might his virtue exercise.\n" + "And thus within a while his name sprung\n" + "Both of his deedes, and of his good tongue,\n" + "That Theseus hath taken him so near,\n" + "That of his chamber he hath made him squire,\n" + "And gave him gold to maintain his degree;\n" + "And eke men brought him out of his country\n" + "From year to year full privily his rent.\n" + "But honestly and slyly* he it spent, *discreetly, prudently\n" + "That no man wonder'd how that he it had.\n" + "And three year in this wise his life be lad*, *led\n" + "And bare him so in peace and eke in werre*, *war\n" + "There was no man that Theseus had so derre*. *dear\n" + "And in this blisse leave I now Arcite,\n" + "And speak I will of Palamon a lite*. *little\n" + "\n" + "In darkness horrible, and strong prison,\n" + "This seven year hath sitten Palamon,\n" + "Forpined*, what for love, and for distress. *pined, wasted away\n" + "Who feeleth double sorrow and heaviness\n" + "But Palamon? that love distraineth* so, *afflicts\n" + "That wood* out of his wits he went for woe, *mad\n" + "And eke thereto he is a prisonere\n" + "Perpetual, not only for a year.\n" + "Who coulde rhyme in English properly\n" + "His martyrdom? forsooth*, it is not I; *truly\n" + "Therefore I pass as lightly as I may.\n" + "It fell that in the seventh year, in May\n" + "The thirde night (as olde bookes sayn,\n" + "That all this story tellen more plain),\n" + "Were it by a venture or destiny\n" + "(As when a thing is shapen* it shall be), *settled, decreed\n" + "That soon after the midnight, Palamon\n" + "By helping of a friend brake his prison,\n" + "And fled the city fast as he might go,\n" + "For he had given drink his gaoler so\n" + "Of a clary <25>, made of a certain wine,\n" + "With *narcotise and opie* of Thebes fine, *narcotics and opium*\n" + "That all the night, though that men would him shake,\n" + "The gaoler slept, he mighte not awake:\n" + "And thus he fled as fast as ever he may.\n" + "The night was short, and *faste by the day *close at hand was\n" + "That needes cast he must himself to hide*. the day during which\n" + "And to a grove faste there beside he must cast about, or contrive,\n" + "With dreadful foot then stalked Palamon. to conceal himself.*\n" + "For shortly this was his opinion,\n" + "That in the grove he would him hide all day,\n" + "And in the night then would he take his way\n" + "To Thebes-ward, his friendes for to pray\n" + "On Theseus to help him to warray*. *make war <26>\n" + "And shortly either he would lose his life,\n" + "Or winnen Emily unto his wife.\n" + "This is th' effect, and his intention plain.\n" + "\n" + "Now will I turn to Arcita again,\n" + "That little wist how nighe was his care,\n" + "Till that Fortune had brought him in the snare.\n" + "The busy lark, the messenger of day,\n" + "Saluteth in her song the morning gray;\n" + "And fiery Phoebus riseth up so bright,\n" + "That all the orient laugheth at the sight,\n" + "And with his streames* drieth in the greves** *rays **groves\n" + "The silver droppes, hanging on the leaves;\n" + "And Arcite, that is in the court royal\n" + "With Theseus, his squier principal,\n" + "Is ris'n, and looketh on the merry day.\n" + "And for to do his observance to May,\n" + "Remembering the point* of his desire, *object\n" + "He on his courser, starting as the fire,\n" + "Is ridden to the fieldes him to play,\n" + "Out of the court, were it a mile or tway.\n" + "And to the grove, of which I have you told,\n" + "By a venture his way began to hold,\n" + "To make him a garland of the greves*, *groves\n" + "Were it of woodbine, or of hawthorn leaves,\n" + "And loud he sang against the sun so sheen*. *shining bright\n" + "\"O May, with all thy flowers and thy green,\n" + "Right welcome be thou, faire freshe May,\n" + "I hope that I some green here getten may.\"\n" + "And from his courser*, with a lusty heart, *horse\n" + "Into the grove full hastily he start,\n" + "And in a path he roamed up and down,\n" + "There as by aventure this Palamon\n" + "Was in a bush, that no man might him see,\n" + "For sore afeard of his death was he.\n" + "Nothing ne knew he that it was Arcite;\n" + "God wot he would have *trowed it full lite*. *full little believed it*\n" + "But sooth is said, gone since full many years,\n" + "The field hath eyen*, and the wood hath ears, *eyes\n" + "It is full fair a man *to bear him even*, *to be on his guard*\n" + "For all day meeten men at *unset steven*. *unexpected time <27>\n" + "Full little wot Arcite of his fellaw,\n" + "That was so nigh to hearken of his saw*, *saying, speech\n" + "For in the bush he sitteth now full still.\n" + "When that Arcite had roamed all his fill,\n" + "And *sungen all the roundel* lustily, *sang the roundelay*<28>\n" + "Into a study he fell suddenly,\n" + "As do those lovers in their *quainte gears*, *odd fashions*\n" + "Now in the crop*, and now down in the breres**, <29> *tree-top\n" + "Now up, now down, as bucket in a well. **briars\n" + "Right as the Friday, soothly for to tell,\n" + "Now shineth it, and now it raineth fast,\n" + "Right so can geary* Venus overcast *changeful\n" + "The heartes of her folk, right as her day\n" + "Is gearful*, right so changeth she array. *changeful\n" + "Seldom is Friday all the weeke like.\n" + "When Arcite had y-sung, he gan to sike*, *sigh\n" + "And sat him down withouten any more:\n" + "\"Alas!\" quoth he, \"the day that I was bore!\n" + "How longe, Juno, through thy cruelty\n" + "Wilt thou warrayen* Thebes the city? *torment\n" + "Alas! y-brought is to confusion\n" + "The blood royal of Cadm' and Amphion:\n" + "Of Cadmus, which that was the firste man,\n" +}; +const char knightsTale2[] PROGMEM = { + "That Thebes built, or first the town began,\n" + "And of the city first was crowned king.\n" + "Of his lineage am I, and his offspring\n" + "By very line, as of the stock royal;\n" + "And now I am *so caitiff and so thrall*, *wretched and enslaved*\n" + "That he that is my mortal enemy,\n" + "I serve him as his squier poorely.\n" + "And yet doth Juno me well more shame,\n" + "For I dare not beknow* mine owen name, *acknowledge <30>\n" + "But there as I was wont to hight Arcite,\n" + "Now hight I Philostrate, not worth a mite.\n" + "Alas! thou fell Mars, and alas! Juno,\n" + "Thus hath your ire our lineage all fordo* *undone, ruined\n" + "Save only me, and wretched Palamon,\n" + "That Theseus martyreth in prison.\n" + "And over all this, to slay me utterly,\n" + "Love hath his fiery dart so brenningly* *burningly\n" + "Y-sticked through my true careful heart,\n" + "That shapen was my death erst than my shert. <31>\n" + "Ye slay me with your eyen, Emily;\n" + "Ye be the cause wherefore that I die.\n" + "Of all the remnant of mine other care\n" + "Ne set I not the *mountance of a tare*, *value of a straw*\n" + "So that I could do aught to your pleasance.\"\n" + "\n" + "And with that word he fell down in a trance\n" + "A longe time; and afterward upstart\n" + "This Palamon, that thought thorough his heart\n" + "He felt a cold sword suddenly to glide:\n" + "For ire he quoke*, no longer would he hide. *quaked\n" + "And when that he had heard Arcite's tale,\n" + "As he were wood*, with face dead and pale, *mad\n" + "He start him up out of the bushes thick,\n" + "And said: \"False Arcita, false traitor wick'*, *wicked\n" + "Now art thou hent*, that lov'st my lady so, *caught\n" + "For whom that I have all this pain and woe,\n" + "And art my blood, and to my counsel sworn,\n" + "As I full oft have told thee herebeforn,\n" + "And hast bejaped* here Duke Theseus, *deceived, imposed upon\n" + "And falsely changed hast thy name thus;\n" + "I will be dead, or elles thou shalt die.\n" + "Thou shalt not love my lady Emily,\n" + "But I will love her only and no mo';\n" + "For I am Palamon thy mortal foe.\n" + "And though I have no weapon in this place,\n" + "But out of prison am astart* by grace, *escaped\n" + "I dreade* not that either thou shalt die, *doubt\n" + "Or else thou shalt not loven Emily.\n" + "Choose which thou wilt, for thou shalt not astart.\"\n" + "\n" + "This Arcite then, with full dispiteous* heart, *wrathful\n" + "When he him knew, and had his tale heard,\n" + "As fierce as lion pulled out a swerd,\n" + "And saide thus; \"By God that sitt'th above,\n" + "*N'ere it* that thou art sick, and wood for love, *were it not*\n" + "And eke that thou no weap'n hast in this place,\n" + "Thou should'st never out of this grove pace,\n" + "That thou ne shouldest dien of mine hand.\n" + "For I defy the surety and the band,\n" + "Which that thou sayest I have made to thee.\n" + "What? very fool, think well that love is free;\n" + "And I will love her maugre* all thy might. *despite\n" + "But, for thou art a worthy gentle knight,\n" + "And *wilnest to darraine her by bataille*, *will reclaim her\n" + "Have here my troth, to-morrow I will not fail, by combat*\n" + "Without weeting* of any other wight, *knowledge\n" + "That here I will be founden as a knight,\n" + "And bringe harness* right enough for thee; *armour and arms\n" + "And choose the best, and leave the worst for me.\n" + "And meat and drinke this night will I bring\n" + "Enough for thee, and clothes for thy bedding.\n" + "And if so be that thou my lady win,\n" + "And slay me in this wood that I am in,\n" + "Thou may'st well have thy lady as for me.\"\n" + "This Palamon answer'd, \"I grant it thee.\"\n" + "And thus they be departed till the morrow,\n" + "When each of them hath *laid his faith to borrow*. *pledged his faith*\n" + "\n" + "O Cupid, out of alle charity!\n" + "O Regne* that wilt no fellow have with thee! *queen <32>\n" + "Full sooth is said, that love nor lordeship\n" + "Will not, *his thanks*, have any fellowship. *thanks to him*\n" + "Well finden that Arcite and Palamon.\n" + "Arcite is ridd anon unto the town,\n" + "And on the morrow, ere it were daylight,\n" + "Full privily two harness hath he dight*, *prepared\n" + "Both suffisant and meete to darraine* *contest\n" + "The battle in the field betwixt them twain.\n" + "And on his horse, alone as he was born,\n" + "He carrieth all this harness him beforn;\n" + "And in the grove, at time and place y-set,\n" + "This Arcite and this Palamon be met.\n" + "Then change gan the colour of their face;\n" + "Right as the hunter in the regne* of Thrace *kingdom\n" + "That standeth at a gappe with a spear\n" + "When hunted is the lion or the bear,\n" + "And heareth him come rushing in the greves*, *groves\n" + "And breaking both the boughes and the leaves,\n" + "Thinketh, \"Here comes my mortal enemy,\n" + "Withoute fail, he must be dead or I;\n" + "For either I must slay him at the gap;\n" + "Or he must slay me, if that me mishap:\"\n" + "So fared they, in changing of their hue\n" + "*As far as either of them other knew*. *When they recognised each\n" + "There was no good day, and no saluting, other afar off*\n" + "But straight, withoute wordes rehearsing,\n" + "Evereach of them holp to arm the other,\n" + "As friendly, as he were his owen brother.\n" + "And after that, with sharpe speares strong\n" + "They foined* each at other wonder long. *thrust\n" + "Thou mightest weene*, that this Palamon *think\n" + "In fighting were as a wood* lion, *mad\n" + "And as a cruel tiger was Arcite:\n" + "As wilde boars gan they together smite,\n" + "That froth as white as foam, *for ire wood*. *mad with anger*\n" + "Up to the ancle fought they in their blood.\n" + "And in this wise I let them fighting dwell,\n" + "And forth I will of Theseus you tell.\n" + "\n" + "The Destiny, minister general,\n" + "That executeth in the world o'er all\n" + "The purveyance*, that God hath seen beforn; *foreordination\n" + "So strong it is, that though the world had sworn\n" + "The contrary of a thing by yea or nay,\n" + "Yet some time it shall fallen on a day\n" + "That falleth not eft* in a thousand year. *again\n" + "For certainly our appetites here,\n" + "Be it of war, or peace, or hate, or love,\n" + "All is this ruled by the sight* above. *eye, intelligence, power\n" + "This mean I now by mighty Theseus,\n" + "That for to hunten is so desirous --\n" + "And namely* the greate hart in May -- *especially\n" + "That in his bed there dawneth him no day\n" + "That he n'is clad, and ready for to ride\n" + "With hunt and horn, and houndes him beside.\n" + "For in his hunting hath he such delight,\n" + "That it is all his joy and appetite\n" + "To be himself the greate harte's bane* *destruction\n" + "For after Mars he serveth now Diane.\n" + "Clear was the day, as I have told ere this,\n" + "And Theseus, with alle joy and bliss,\n" + "With his Hippolyta, the faire queen,\n" + "And Emily, y-clothed all in green,\n" + "On hunting be they ridden royally.\n" + "And to the grove, that stood there faste by,\n" + "In which there was an hart, as men him told,\n" + "Duke Theseus the straighte way doth hold,\n" + "And to the laund* he rideth him full right, *plain <33>\n" + "There was the hart y-wont to have his flight,\n" + "And over a brook, and so forth on his way.\n" + "This Duke will have a course at him or tway\n" + "With houndes, such as him lust* to command. *pleased\n" + "And when this Duke was come to the laund,\n" + "Under the sun he looked, and anon\n" + "He was ware of Arcite and Palamon,\n" + "That foughte breme*, as it were bulles two. *fiercely\n" + "The brighte swordes wente to and fro\n" + "So hideously, that with the leaste stroke\n" + "It seemed that it woulde fell an oak,\n" + "But what they were, nothing yet he wote*. *knew\n" + "This Duke his courser with his spurres smote,\n" + "*And at a start* he was betwixt them two, *suddenly*\n" + "And pulled out a sword and cried, \"Ho!\n" + "No more, on pain of losing of your head.\n" + "By mighty Mars, he shall anon be dead\n" + "That smiteth any stroke, that I may see!\n" + "But tell to me what mister* men ye be, *manner, kind <34>\n" + "That be so hardy for to fighte here\n" + "Withoute judge or other officer,\n" + "As though it were in listes royally. <35>\n" + "This Palamon answered hastily,\n" + "And saide: \"Sir, what needeth wordes mo'?\n" + "We have the death deserved bothe two,\n" + "Two woful wretches be we, and caitives,\n" + "That be accumbered* of our own lives, *burdened\n" + "And as thou art a rightful lord and judge,\n" + "So give us neither mercy nor refuge.\n" + "And slay me first, for sainte charity,\n" + "But slay my fellow eke as well as me.\n" + "Or slay him first; for, though thou know it lite*, *little\n" + "This is thy mortal foe, this is Arcite\n" + "That from thy land is banisht on his head,\n" + "For which he hath deserved to be dead.\n" + "For this is he that came unto thy gate\n" + "And saide, that he highte Philostrate.\n" + "Thus hath he japed* thee full many year, *deceived\n" + "And thou hast made of him thy chief esquier;\n" + "And this is he, that loveth Emily.\n" + "For since the day is come that I shall die\n" + "I make pleinly* my confession, *fully, unreservedly\n" + "That I am thilke* woful Palamon, *that same <36>\n" + "That hath thy prison broken wickedly.\n" + "I am thy mortal foe, and it am I\n" + "That so hot loveth Emily the bright,\n" + "That I would die here present in her sight.\n" + "Therefore I aske death and my jewise*. *judgement\n" + "But slay my fellow eke in the same wise,\n" + "For both we have deserved to be slain.\"\n" + "\n" + "This worthy Duke answer'd anon again,\n" + "And said, \"This is a short conclusion.\n" + "Your own mouth, by your own confession\n" + "Hath damned you, and I will it record;\n" + "It needeth not to pain you with the cord;\n" + "Ye shall be dead, by mighty Mars the Red.<37>\n" + "\n" + "The queen anon for very womanhead\n" + "Began to weep, and so did Emily,\n" + "And all the ladies in the company.\n" + "Great pity was it as it thought them all,\n" + "That ever such a chance should befall,\n" + "For gentle men they were, of great estate,\n" + "And nothing but for love was this debate\n" + "They saw their bloody woundes wide and sore,\n" + "And cried all at once, both less and more,\n" + "\"Have mercy, Lord, upon us women all.\"\n" + "And on their bare knees adown they fall\n" + "And would have kissed his feet there as he stood,\n" + "Till at the last *aslaked was his mood* *his anger was\n" + "(For pity runneth soon in gentle heart); appeased*\n" + "And though at first for ire he quoke and start\n" + "He hath consider'd shortly in a clause\n" + "The trespass of them both, and eke the cause:\n" + "And although that his ire their guilt accused\n" + "Yet in his reason he them both excused;\n" + "As thus; he thoughte well that every man\n" + "Will help himself in love if that he can,\n" + "And eke deliver himself out of prison.\n" + "Of women, for they wepten ever-in-one:* *continually\n" + "And eke his hearte had compassion\n" + "And in his gentle heart he thought anon,\n" + "And soft unto himself he saide: \"Fie\n" + "Upon a lord that will have no mercy,\n" + "But be a lion both in word and deed,\n" + "To them that be in repentance and dread,\n" + "As well as-to a proud dispiteous* man *unpitying\n" + "That will maintaine what he first began.\n" + "That lord hath little of discretion,\n" + "That in such case *can no division*: *can make no distinction*\n" + "But weigheth pride and humbless *after one*.\" *alike*\n" + "And shortly, when his ire is thus agone,\n" + "He gan to look on them with eyen light*, *gentle, lenient*\n" + "And spake these same wordes *all on height.* *aloud*\n" + "\n" + "\"The god of love, ah! benedicite*, *bless ye him\n" + "How mighty and how great a lord is he!\n" + "Against his might there gaine* none obstacles, *avail, conquer\n" + "He may be called a god for his miracles\n" + "For he can maken at his owen guise\n" + "Of every heart, as that him list devise.\n" + "Lo here this Arcite, and this Palamon,\n" + "That quietly were out of my prison,\n" + "And might have lived in Thebes royally,\n" + "And weet* I am their mortal enemy, *knew\n" + "And that their death li'th in my might also,\n" + "And yet hath love, *maugre their eyen two*, *in spite of their eyes*\n" + "Y-brought them hither bothe for to die.\n" + "Now look ye, is not this an high folly?\n" + "Who may not be a fool, if but he love?\n" + "Behold, for Godde's sake that sits above,\n" + "See how they bleed! be they not well array'd?\n" + "Thus hath their lord, the god of love, them paid\n" + "Their wages and their fees for their service;\n" + "And yet they weene for to be full wise,\n" + "That serve love, for aught that may befall.\n" + "But this is yet the beste game* of all, *joke\n" + "That she, for whom they have this jealousy,\n" + "Can them therefor as muchel thank as me.\n" + "She wot no more of all this *hote fare*, *hot behaviour*\n" + "By God, than wot a cuckoo or an hare.\n" + "But all must be assayed hot or cold;\n" + "A man must be a fool, or young or old;\n" + "I wot it by myself *full yore agone*: *long years ago*\n" + "For in my time a servant was I one.\n" + "And therefore since I know of love's pain,\n" + "And wot how sore it can a man distrain*, *distress\n" + "As he that oft hath been caught in his last*, *snare <38>\n" + "I you forgive wholly this trespass,\n" + "At request of the queen that kneeleth here,\n" + "And eke of Emily, my sister dear.\n" + "And ye shall both anon unto me swear,\n" + "That never more ye shall my country dere* *injure\n" + "Nor make war upon me night nor day,\n" + "But be my friends in alle that ye may.\n" + "I you forgive this trespass *every deal*. *completely*\n" + "And they him sware *his asking* fair and well, *what he asked*\n" + "And him of lordship and of mercy pray'd,\n" + "And he them granted grace, and thus he said:\n" + "\n" + "\"To speak of royal lineage and richess,\n" + "Though that she were a queen or a princess,\n" + "Each of you both is worthy doubteless\n" + "To wedde when time is; but natheless\n" + "I speak as for my sister Emily,\n" + "For whom ye have this strife and jealousy,\n" + "Ye wot* yourselves, she may not wed the two *know\n" + "At once, although ye fight for evermo:\n" + "But one of you, *all be him loth or lief,* *whether or not he wishes*\n" + "He must *go pipe into an ivy leaf*: *\"go whistle\"*\n" + "This is to say, she may not have you both,\n" + "All be ye never so jealous, nor so wroth.\n" + "And therefore I you put in this degree,\n" + "That each of you shall have his destiny\n" + "As *him is shape*; and hearken in what wise *as is decreed for him*\n" + "Lo hear your end of that I shall devise.\n" + "My will is this, for plain conclusion\n" + "Withouten any replication*, *reply\n" + "If that you liketh, take it for the best,\n" + "That evereach of you shall go where *him lest*, *he pleases\n" + "Freely without ransom or danger;\n" + "And this day fifty weekes, *farre ne nerre*, *neither more nor less*\n" + "Evereach of you shall bring an hundred knights,\n" + "Armed for listes up at alle rights\n" + "All ready to darraine* her by bataille, *contend for\n" + "And this behete* I you withoute fail *promise\n" + "Upon my troth, and as I am a knight,\n" + "That whether of you bothe that hath might,\n" + "That is to say, that whether he or thou\n" + "May with his hundred, as I spake of now,\n" + "Slay his contrary, or out of listes drive,\n" + "Him shall I given Emily to wive,\n" + "To whom that fortune gives so fair a grace.\n" + "The listes shall I make here in this place.\n" + "*And God so wisly on my soule rue*, *may God as surely have\n" + "As I shall even judge be and true. mercy on my soul*\n" + "Ye shall none other ende with me maken\n" + "Than one of you shalle be dead or taken.\n" + "And if you thinketh this is well y-said,\n" + "Say your advice*, and hold yourselves apaid**. *opinion **satisfied\n" + "This is your end, and your conclusion.\"\n" + "Who looketh lightly now but Palamon?\n" + "Who springeth up for joye but Arcite?\n" + "Who could it tell, or who could it indite,\n" + "The joye that is maked in the place\n" + "When Theseus hath done so fair a grace?\n" + "But down on knees went every *manner wight*, *kind of person*\n" + "And thanked him with all their heartes' might,\n" + "And namely* these Thebans *ofte sithe*. *especially *oftentimes*\n" + "And thus with good hope and with hearte blithe\n" + "They take their leave, and homeward gan they ride\n" + "To Thebes-ward, with his old walles wide.\n" + "\n" + "I trow men woulde deem it negligence,\n" + "If I forgot to telle the dispence* *expenditure\n" + "Of Theseus, that went so busily\n" + "To maken up the listes royally,\n" + "That such a noble theatre as it was,\n" + "I dare well say, in all this world there n'as*. *was not\n" + "The circuit a mile was about,\n" + "Walled of stone, and ditched all without.\n" + "*Round was the shape, in manner of compass,\n" + "Full of degrees, the height of sixty pas* *see note <39>*\n" + "That when a man was set on one degree\n" + "He letted* not his fellow for to see. *hindered\n" + "Eastward there stood a gate of marble white,\n" + "Westward right such another opposite.\n" + "And, shortly to conclude, such a place\n" + "Was never on earth made in so little space,\n" + "For in the land there was no craftes-man,\n" + "That geometry or arsmetrike* can**, *arithmetic **knew\n" + "Nor pourtrayor*, nor carver of images, *portrait painter\n" + "That Theseus ne gave him meat and wages\n" + "The theatre to make and to devise.\n" + "And for to do his rite and sacrifice\n" + "He eastward hath upon the gate above,\n" + "In worship of Venus, goddess of love,\n" + "*Done make* an altar and an oratory; *caused to be made*\n" + "And westward, in the mind and in memory\n" + "Of Mars, he maked hath right such another,\n" + "That coste largely of gold a fother*. *a great amount\n" + "And northward, in a turret on the wall,\n" + "Of alabaster white and red coral\n" + "An oratory riche for to see,\n" + "In worship of Diane of chastity,\n" + "Hath Theseus done work in noble wise.\n" + "But yet had I forgotten to devise* *describe\n" + "The noble carving, and the portraitures,\n" + "The shape, the countenance of the figures\n" + "That weren in there oratories three.\n" + "\n" + "First in the temple of Venus may'st thou see\n" + "Wrought on the wall, full piteous to behold,\n" + "The broken sleepes, and the sikes* cold, *sighes\n" + "The sacred teares, and the waimentings*, *lamentings\n" + "The fiery strokes of the desirings,\n" + "That Love's servants in this life endure;\n" + "The oathes, that their covenants assure.\n" + "Pleasance and Hope, Desire, Foolhardiness,\n" + "Beauty and Youth, and Bawdry and Richess,\n" + "Charms and Sorc'ry, Leasings* and Flattery, *falsehoods\n" + "Dispence, Business, and Jealousy,\n" + "That wore of yellow goldes* a garland, *sunflowers <40>\n" + "And had a cuckoo sitting on her hand,\n" + "Feasts, instruments, and caroles and dances,\n" + "Lust and array, and all the circumstances\n" + "Of Love, which I reckon'd and reckon shall\n" + "In order, were painted on the wall,\n" + "And more than I can make of mention.\n" + "For soothly all the mount of Citheron,<41>\n" + "Where Venus hath her principal dwelling,\n" + "Was showed on the wall in pourtraying,\n" + "With all the garden, and the lustiness*. *pleasantness\n" + "Nor was forgot the porter Idleness,\n" + "Nor Narcissus the fair of *yore agone*, *olden times*\n" + "Nor yet the folly of King Solomon,\n" + "Nor yet the greate strength of Hercules,\n" + "Th' enchantments of Medea and Circes,\n" + "Nor of Turnus the hardy fierce courage,\n" + "The rich Croesus *caitif in servage.* <42> *abased into slavery*\n" + "Thus may ye see, that wisdom nor richess,\n" + "Beauty, nor sleight, nor strength, nor hardiness\n" + "Ne may with Venus holde champartie*, *divided possession <43>\n" + "For as her liste the world may she gie*. *guide\n" + "Lo, all these folk so caught were in her las* *snare\n" + "Till they for woe full often said, Alas!\n" + "Suffice these ensamples one or two,\n" + "Although I could reckon a thousand mo'.\n" + "\n" + "The statue of Venus, glorious to see\n" + "Was naked floating in the large sea,\n" + "And from the navel down all cover'd was\n" + "With waves green, and bright as any glass.\n" + "A citole <44> in her right hand hadde she,\n" + "And on her head, full seemly for to see,\n" + "A rose garland fresh, and well smelling,\n" + "Above her head her doves flickering\n" + "Before her stood her sone Cupido,\n" + "Upon his shoulders winges had he two;\n" + "And blind he was, as it is often seen;\n" + "A bow he bare, and arrows bright and keen.\n" + "\n" + "Why should I not as well eke tell you all\n" + "The portraiture, that was upon the wall\n" + "Within the temple of mighty Mars the Red?\n" + "All painted was the wall in length and brede* *breadth\n" + "Like to the estres* of the grisly place *interior chambers\n" + "That hight the great temple of Mars in Thrace,\n" + "In thilke* cold and frosty region, *that\n" + "There as Mars hath his sovereign mansion.\n" + "In which there dwelled neither man nor beast,\n" + "With knotty gnarry* barren trees old *gnarled\n" + "Of stubbes sharp and hideous to behold;\n" + "In which there ran a rumble and a sough*, *groaning noise\n" + "As though a storm should bursten every bough:\n" + "And downward from an hill under a bent* *slope\n" + "There stood the temple of Mars Armipotent,\n" + "Wrought all of burnish'd steel, of which th' entry\n" + "Was long and strait, and ghastly for to see.\n" + "And thereout came *a rage and such a vise*, *such a furious voice*\n" + "That it made all the gates for to rise.\n" + "The northern light in at the doore shone,\n" + "For window on the walle was there none\n" + "Through which men mighten any light discern.\n" + "The doors were all of adamant etern,\n" + "Y-clenched *overthwart and ende-long* *crossways and lengthways*\n" + "With iron tough, and, for to make it strong,\n" + "Every pillar the temple to sustain\n" + "Was tunne-great*, of iron bright and sheen. *thick as a tun (barrel)\n" + "There saw I first the dark imagining\n" + "Of felony, and all the compassing;\n" + "The cruel ire, as red as any glede*, *live coal\n" + "The picke-purse<45>, and eke the pale dread;\n" + "The smiler with the knife under the cloak,\n" + "The shepen* burning with the blacke smoke *stable <46>\n" + "The treason of the murd'ring in the bed,\n" + "The open war, with woundes all be-bled;\n" + "Conteke* with bloody knife, and sharp menace. *contention, discord\n" + "All full of chirking* was that sorry place. *creaking, jarring noise\n" + "The slayer of himself eke saw I there,\n" + "His hearte-blood had bathed all his hair:\n" + "The nail y-driven in the shode* at night, *hair of the head <47>\n" + "The colde death, with mouth gaping upright.\n" + "Amiddes of the temple sat Mischance,\n" + "With discomfort and sorry countenance;\n" + "Eke saw I Woodness* laughing in his rage, *Madness\n" + "Armed Complaint, Outhees*, and fierce Outrage; *Outcry\n" + "The carrain* in the bush, with throat y-corve**, *corpse **slashed\n" + "A thousand slain, and not *of qualm y-storve*; *dead of sickness*\n" + "The tyrant, with the prey by force y-reft;\n" + "The town destroy'd, that there was nothing left.\n" + "Yet saw I brent* the shippes hoppesteres, <48> *burnt\n" + "The hunter strangled with the wilde bears:\n" + "The sow freting* the child right in the cradle; *devouring <49>\n" + "The cook scalded, for all his longe ladle.\n" + "Nor was forgot, *by th'infortune of Mart* *through the misfortune\n" + "The carter overridden with his cart; of war*\n" + "Under the wheel full low he lay adown.\n" + "There were also of Mars' division,\n" + "The armourer, the bowyer*, and the smith, *maker of bows\n" + "That forgeth sharp swordes on his stith*. *anvil\n" + "And all above depainted in a tower\n" + "Saw I Conquest, sitting in great honour,\n" + "With thilke* sharpe sword over his head *that\n" + "Hanging by a subtle y-twined thread.\n" + "Painted the slaughter was of Julius<50>,\n" + "Of cruel Nero, and Antonius:\n" + "Although at that time they were yet unborn,\n" + "Yet was their death depainted there beforn,\n" + "By menacing of Mars, right by figure,\n" + "So was it showed in that portraiture,\n" + "As is depainted in the stars above,\n" + "Who shall be slain, or elles dead for love.\n" + "Sufficeth one ensample in stories old,\n" + "I may not reckon them all, though I wo'ld.\n" + "\n" + "The statue of Mars upon a carte* stood *chariot\n" + "Armed, and looked grim as he were wood*, *mad\n" + "And over his head there shone two figures\n" + "Of starres, that be cleped in scriptures,\n" + "That one Puella, that other Rubeus. <51>\n" + "This god of armes was arrayed thus:\n" + "A wolf there stood before him at his feet\n" + "With eyen red, and of a man he eat:\n" + "With subtle pencil painted was this story,\n" + "In redouting* of Mars and of his glory. *reverance, fear\n" + "\n" + "Now to the temple of Dian the chaste\n" + "As shortly as I can I will me haste,\n" + "To telle you all the descriptioun.\n" + "Depainted be the walles up and down\n" + "Of hunting and of shamefast chastity.\n" + "There saw I how woful Calistope,<52>\n" + "When that Dian aggrieved was with her,\n" + "Was turned from a woman to a bear,\n" + "And after was she made the lodestar*: *pole star\n" + "Thus was it painted, I can say no far*; *farther\n" + "Her son is eke a star as men may see.\n" + "There saw I Dane <53> turn'd into a tree,\n" + "I meane not the goddess Diane,\n" + "But Peneus' daughter, which that hight Dane.\n" + "There saw I Actaeon an hart y-maked*, *made\n" + "For vengeance that he saw Dian all naked:\n" + "I saw how that his houndes have him caught,\n" + "And freten* him, for that they knew him not. *devour\n" + "Yet painted was, a little farthermore\n" + "How Atalanta hunted the wild boar;\n" + "And Meleager, and many other mo',\n" + "For which Diana wrought them care and woe.\n" + "There saw I many another wondrous story,\n" + "The which me list not drawen to memory.\n" + "This goddess on an hart full high was set*, *seated\n" + "With smalle houndes all about her feet,\n" + "And underneath her feet she had a moon,\n" + "Waxing it was, and shoulde wane soon.\n" + "In gaudy green her statue clothed was,\n" + "With bow in hand, and arrows in a case*. *quiver\n" + "Her eyen caste she full low adown,\n" + "Where Pluto hath his darke regioun.\n" + "A woman travailing was her beforn,\n" + "But, for her child so longe was unborn,\n" + "Full piteously Lucina <54> gan she call,\n" + "And saide; \"Help, for thou may'st best of all.\"\n" + "Well could he painte lifelike that it wrought;\n" + "With many a florin he the hues had bought.\n" + "Now be these listes made, and Theseus,\n" + "That at his greate cost arrayed thus\n" + "The temples, and the theatre every deal*, *part <55>\n" + "When it was done, him liked wonder well.\n" + "\n" + "But stint* I will of Theseus a lite**, *cease speaking **little\n" + "And speak of Palamon and of Arcite.\n" + "The day approacheth of their returning,\n" + "That evereach an hundred knights should bring,\n" + "The battle to darraine* as I you told; *contest\n" + "And to Athens, their covenant to hold,\n" + "Hath ev'reach of them brought an hundred knights,\n" + "Well-armed for the war at alle rights.\n" + "And sickerly* there trowed** many a man, *surely <56> **believed\n" + "That never, sithen* that the world began, *since\n" + "For to speaken of knighthood of their hand,\n" + "As far as God hath maked sea and land,\n" + "Was, of so few, so noble a company.\n" + "For every wight that loved chivalry,\n" + "And would, *his thankes, have a passant name*, *thanks to his own\n" + "Had prayed, that he might be of that game, efforts, have a\n" + "And well was him, that thereto chosen was. surpassing name*\n" + "For if there fell to-morrow such a case,\n" + "Ye knowe well, that every lusty knight,\n" + "That loveth par amour, and hath his might\n" + "Were it in Engleland, or elleswhere,\n" + "They would, their thankes, willen to be there,\n" + "T' fight for a lady; Benedicite,\n" + "It were a lusty* sighte for to see. *pleasing\n" + "And right so fared they with Palamon;\n" + "With him there wente knightes many one.\n" + "Some will be armed in an habergeon,\n" + "And in a breast-plate, and in a gipon*; *short doublet.\n" + "And some will have *a pair of plates* large; *back and front armour*\n" + "And some will have a Prusse* shield, or targe; *Prussian\n" + "Some will be armed on their legges weel;\n" + "Some have an axe, and some a mace of steel.\n" + "There is no newe guise*, but it was old. *fashion\n" + "Armed they weren, as I have you told,\n" + "Evereach after his opinion.\n" + "There may'st thou see coming with Palamon\n" + "Licurgus himself, the great king of Thrace:\n" + "Black was his beard, and manly was his face.\n" + "The circles of his eyen in his head\n" + "They glowed betwixte yellow and red,\n" + "And like a griffin looked he about,\n" + "With kemped* haires on his browes stout; *combed<57>\n" + "His limbs were great, his brawns were hard and strong,\n" + "His shoulders broad, his armes round and long.\n" + "And as the guise* was in his country, *fashion\n" + "Full high upon a car of gold stood he,\n" + "With foure white bulles in the trace.\n" + "Instead of coat-armour on his harness,\n" + "With yellow nails, and bright as any gold,\n" + "He had a beare's skin, coal-black for old*. *age\n" + "His long hair was y-kempt behind his back,\n" + "As any raven's feather it shone for black.\n" + "A wreath of gold *arm-great*, of huge weight, *thick as a man's arm*\n" + "Upon his head sate, full of stones bright,\n" + "Of fine rubies and clear diamants.\n" + "About his car there wente white alauns*, *greyhounds <58>\n" + "Twenty and more, as great as any steer,\n" + "To hunt the lion or the wilde bear,\n" + "And follow'd him, with muzzle fast y-bound,\n" + "Collars of gold, and torettes* filed round. *rings\n" + "An hundred lordes had he in his rout* *retinue\n" + "Armed full well, with heartes stern and stout.\n" + "\n" + "With Arcita, in stories as men find,\n" + "The great Emetrius the king of Ind,\n" + "Upon a *steede bay* trapped in steel, *bay horse*\n" + "Cover'd with cloth of gold diapred* well, *decorated\n" + "Came riding like the god of armes, Mars.\n" + "His coat-armour was of *a cloth of Tars*, *a kind of silk*\n" + "Couched* with pearls white and round and great *trimmed\n" + "His saddle was of burnish'd gold new beat;\n" + "A mantelet on his shoulders hanging,\n" + "Bretful* of rubies red, as fire sparkling. *brimful\n" + "His crispe hair like ringes was y-run,\n" + "And that was yellow, glittering as the sun.\n" + "His nose was high, his eyen bright citrine*, *pale yellow\n" + "His lips were round, his colour was sanguine,\n" + "A fewe fracknes* in his face y-sprent**, *freckles **sprinkled\n" + "Betwixte yellow and black somedeal y-ment* *mixed <59>\n" + "And as a lion he *his looking cast* *cast about his eyes*\n" + "Of five and twenty year his age I cast* *reckon\n" + "His beard was well begunnen for to spring;\n" + "His voice was as a trumpet thundering.\n" + "Upon his head he wore of laurel green\n" + "A garland fresh and lusty to be seen;\n" + "Upon his hand he bare, for his delight,\n" + "An eagle tame, as any lily white.\n" + "An hundred lordes had he with him there,\n" + "All armed, save their heads, in all their gear,\n" + "Full richely in alle manner things.\n" + "For trust ye well, that earles, dukes, and kings\n" + "Were gather'd in this noble company,\n" + "For love, and for increase of chivalry.\n" + "About this king there ran on every part\n" + "Full many a tame lion and leopart.\n" + "And in this wise these lordes *all and some* *all and sundry*\n" + "Be on the Sunday to the city come\n" + "Aboute prime<60>, and in the town alight.\n" + "\n" + "This Theseus, this Duke, this worthy knight\n" + "When he had brought them into his city,\n" + "And inned* them, ev'reach at his degree, *lodged\n" + "He feasteth them, and doth so great labour\n" + "To *easen them*, and do them all honour, *make them comfortable*\n" + "That yet men weene* that no mannes wit *think\n" + "Of none estate could amenden* it. *improve\n" + "The minstrelsy, the service at the feast,\n" + "The greate giftes to the most and least,\n" + "The rich array of Theseus' palace,\n" + "Nor who sate first or last upon the dais.<61>\n" + "What ladies fairest be, or best dancing\n" + "Or which of them can carol best or sing,\n" + "Or who most feelingly speaketh of love;\n" + "What hawkes sitten on the perch above,\n" + "What houndes liggen* on the floor adown, *lie\n" + "Of all this now make I no mentioun\n" + "But of th'effect; that thinketh me the best\n" + "Now comes the point, and hearken if you lest.* *please\n" + "\n" + "The Sunday night, ere day began to spring,\n" + "When Palamon the larke hearde sing,\n" + "Although it were not day by houres two,\n" + "Yet sang the lark, and Palamon right tho* *then\n" + "With holy heart, and with an high courage,\n" + "Arose, to wenden* on his pilgrimage *go\n" + "Unto the blissful Cithera benign,\n" + "I meane Venus, honourable and digne*. *worthy\n" + "And in her hour <62> he walketh forth a pace\n" + "Unto the listes, where her temple was,\n" + "And down he kneeleth, and with humble cheer* *demeanour\n" +}; +const char knightsTale3[] PROGMEM = { + "And hearte sore, he said as ye shall hear.\n" + "\n" + "\"Fairest of fair, O lady mine Venus,\n" + "Daughter to Jove, and spouse of Vulcanus,\n" + "Thou gladder of the mount of Citheron!<41>\n" + "For thilke love thou haddest to Adon <63>\n" + "Have pity on my bitter teares smart,\n" + "And take mine humble prayer to thine heart.\n" + "Alas! I have no language to tell\n" + "Th'effecte, nor the torment of mine hell;\n" + "Mine hearte may mine harmes not betray;\n" + "I am so confused, that I cannot say.\n" + "But mercy, lady bright, that knowest well\n" + "My thought, and seest what harm that I feel.\n" + "Consider all this, and *rue upon* my sore, *take pity on*\n" + "As wisly* as I shall for evermore *truly\n" + "Enforce my might, thy true servant to be,\n" + "And holde war alway with chastity:\n" + "That make I mine avow*, so ye me help. *vow, promise\n" + "I keepe not of armes for to yelp,* *boast\n" + "Nor ask I not to-morrow to have victory,\n" + "Nor renown in this case, nor vaine glory\n" + "Of *prize of armes*, blowing up and down, *praise for valour*\n" + "But I would have fully possessioun\n" + "Of Emily, and die in her service;\n" + "Find thou the manner how, and in what wise.\n" + "I *recke not but* it may better be *do not know whether*\n" + "To have vict'ry of them, or they of me,\n" + "So that I have my lady in mine arms.\n" + "For though so be that Mars is god of arms,\n" + "Your virtue is so great in heaven above,\n" + "That, if you list, I shall well have my love.\n" + "Thy temple will I worship evermo',\n" + "And on thine altar, where I ride or go,\n" + "I will do sacrifice, and fires bete*. *make, kindle\n" + "And if ye will not so, my lady sweet,\n" + "Then pray I you, to-morrow with a spear\n" + "That Arcita me through the hearte bear\n" + "Then reck I not, when I have lost my life,\n" + "Though that Arcita win her to his wife.\n" + "This is th' effect and end of my prayere, --\n" + "Give me my love, thou blissful lady dear.\"\n" + "When th' orison was done of Palamon,\n" + "His sacrifice he did, and that anon,\n" + "Full piteously, with alle circumstances,\n" + "*All tell I not as now* his observances. *although I tell not now*\n" + "But at the last the statue of Venus shook,\n" + "And made a signe, whereby that he took\n" + "That his prayer accepted was that day.\n" + "For though the signe shewed a delay,\n" + "Yet wist he well that granted was his boon;\n" + "And with glad heart he went him home full soon.\n" + "\n" + "The third hour unequal <64> that Palamon\n" + "Began to Venus' temple for to gon,\n" + "Up rose the sun, and up rose Emily,\n" + "And to the temple of Dian gan hie.\n" + "Her maidens, that she thither with her lad*, *led\n" + "Th' incense, the clothes, and the remnant all\n" + "That to the sacrifice belonge shall,\n" + "The hornes full of mead, as was the guise;\n" + "There lacked nought to do her sacrifice.\n" + "Smoking* the temple full of clothes fair, *draping <65>\n" + "This Emily with hearte debonnair* *gentle\n" + "Her body wash'd with water of a well.\n" + "But how she did her rite I dare not tell;\n" + "But* it be any thing in general; *unless\n" + "And yet it were a game* to hearen all *pleasure\n" + "To him that meaneth well it were no charge:\n" + "But it is good a man to *be at large*. *do as he will*\n" + "Her bright hair combed was, untressed all.\n" + "A coronet of green oak cerriall <66>\n" + "Upon her head was set full fair and meet.\n" + "Two fires on the altar gan she bete,\n" + "And did her thinges, as men may behold\n" + "In Stace of Thebes <67>, and these bookes old.\n" + "When kindled was the fire, with piteous cheer\n" + "Unto Dian she spake as ye may hear.\n" + "\n" + "\"O chaste goddess of the woodes green,\n" + "To whom both heav'n and earth and sea is seen,\n" + "Queen of the realm of Pluto dark and low,\n" + "Goddess of maidens, that mine heart hast know\n" + "Full many a year, and wost* what I desire, *knowest\n" + "To keep me from the vengeance of thine ire,\n" + "That Actaeon aboughte* cruelly: *earned; suffered from\n" + "Chaste goddess, well wottest thou that I\n" + "Desire to be a maiden all my life,\n" + "Nor never will I be no love nor wife.\n" + "I am, thou wost*, yet of thy company, *knowest\n" + "A maid, and love hunting and venery*, *field sports\n" + "And for to walken in the woodes wild,\n" + "And not to be a wife, and be with child.\n" + "Nought will I know the company of man.\n" + "Now help me, lady, since ye may and can,\n" + "For those three formes <68> that thou hast in thee.\n" + "And Palamon, that hath such love to me,\n" + "And eke Arcite, that loveth me so sore,\n" + "This grace I pray thee withoute more,\n" + "As sende love and peace betwixt them two:\n" + "And from me turn away their heartes so,\n" + "That all their hote love, and their desire,\n" + "And all their busy torment, and their fire,\n" + "Be queint*, or turn'd into another place. *quenched\n" + "And if so be thou wilt do me no grace,\n" + "Or if my destiny be shapen so\n" + "That I shall needes have one of them two,\n" + "So send me him that most desireth me.\n" + "Behold, goddess of cleane chastity,\n" + "The bitter tears that on my cheekes fall.\n" + "Since thou art maid, and keeper of us all,\n" + "My maidenhead thou keep and well conserve,\n" + "And, while I live, a maid I will thee serve.\n" + "\n" + "The fires burn upon the altar clear,\n" + "While Emily was thus in her prayere:\n" + "But suddenly she saw a sighte quaint*. *strange\n" + "For right anon one of the fire's *queint\n" + "And quick'd* again, and after that anon *went out and revived*\n" + "That other fire was queint, and all agone:\n" + "And as it queint, it made a whisteling,\n" + "As doth a brande wet in its burning.\n" + "And at the brandes end outran anon\n" + "As it were bloody droppes many one:\n" + "For which so sore aghast was Emily,\n" + "That she was well-nigh mad, and gan to cry,\n" + "For she ne wiste what it signified;\n" + "But onely for feare thus she cried,\n" + "And wept, that it was pity for to hear.\n" + "And therewithal Diana gan appear\n" + "With bow in hand, right as an hunteress,\n" + "And saide; \"Daughter, stint* thine heaviness. *cease\n" + "Among the goddes high it is affirm'd,\n" + "And by eternal word writ and confirm'd,\n" + "Thou shalt be wedded unto one of tho* *those\n" + "That have for thee so muche care and woe:\n" + "But unto which of them I may not tell.\n" + "Farewell, for here I may no longer dwell.\n" + "The fires which that on mine altar brenn*, *burn\n" + "Shall thee declaren, ere that thou go henne*, *hence\n" + "Thine aventure of love, as in this case.\"\n" + "And with that word, the arrows in the case* *quiver\n" + "Of the goddess did clatter fast and ring,\n" + "And forth she went, and made a vanishing,\n" + "For which this Emily astonied was,\n" + "And saide; \"What amounteth this, alas!\n" + "I put me under thy protection,\n" + "Diane, and in thy disposition.\"\n" + "And home she went anon the nexte* way. *nearest\n" + "This is th' effect, there is no more to say.\n" + "\n" + "The nexte hour of Mars following this\n" + "Arcite to the temple walked is\n" + "Of fierce Mars, to do his sacrifice\n" + "With all the rites of his pagan guise.\n" + "With piteous* heart and high devotion *pious\n" + "Right thus to Mars he said his orison\n" + "\"O stronge god, that in the regnes* old *realms\n" + "Of Thrace honoured art, and lord y-hold* *held\n" + "And hast in every regne, and every land\n" + "Of armes all the bridle in thine hand,\n" + "And *them fortunest as thee list devise*, *send them fortune\n" + "Accept of me my piteous sacrifice. as you please*\n" + "If so be that my youthe may deserve,\n" + "And that my might be worthy for to serve\n" + "Thy godhead, that I may be one of thine,\n" + "Then pray I thee to *rue upon my pine*, *pity my anguish*\n" + "For thilke* pain, and thilke hote fire, *that\n" + "In which thou whilom burned'st for desire\n" + "Whenne that thou usedest* the beauty *enjoyed\n" + "Of faire young Venus, fresh and free,\n" + "And haddest her in armes at thy will:\n" + "And though thee ones on a time misfill*, *were unlucky\n" + "When Vulcanus had caught thee in his las*, *net <69>\n" + "And found thee ligging* by his wife, alas! *lying\n" + "For thilke sorrow that was in thine heart,\n" + "Have ruth* as well upon my paine's smart. *pity\n" + "I am young and unconning*, as thou know'st, *ignorant, simple\n" + "And, as I trow*, with love offended most *believe\n" + "That e'er was any living creature:\n" + "For she, that doth* me all this woe endure, *causes\n" + "Ne recketh ne'er whether I sink or fleet* *swim\n" + "And well I wot, ere she me mercy hete*, *promise, vouchsafe\n" + "I must with strengthe win her in the place:\n" + "And well I wot, withoute help or grace\n" + "Of thee, ne may my strengthe not avail:\n" + "Then help me, lord, to-morr'w in my bataille,\n" + "For thilke fire that whilom burned thee,\n" + "As well as this fire that now burneth me;\n" + "And do* that I to-morr'w may have victory. *cause\n" + "Mine be the travail, all thine be the glory.\n" + "Thy sovereign temple will I most honour\n" + "Of any place, and alway most labour\n" + "In thy pleasance and in thy craftes strong.\n" + "And in thy temple I will my banner hong*, *hang\n" + "And all the armes of my company,\n" + "And evermore, until that day I die,\n" + "Eternal fire I will before thee find\n" + "And eke to this my vow I will me bind:\n" + "My beard, my hair that hangeth long adown,\n" + "That never yet hath felt offension* *indignity\n" + "Of razor nor of shears, I will thee give,\n" + "And be thy true servant while I live.\n" + "Now, lord, have ruth upon my sorrows sore,\n" + "Give me the victory, I ask no more.\"\n" + "\n" + "The prayer stint* of Arcita the strong, *ended\n" + "The ringes on the temple door that hong,\n" + "And eke the doores, clattered full fast,\n" + "Of which Arcita somewhat was aghast.\n" + "The fires burn'd upon the altar bright,\n" + "That it gan all the temple for to light;\n" + "A sweete smell anon the ground up gaf*, *gave\n" + "And Arcita anon his hand up haf*, *lifted\n" + "And more incense into the fire he cast,\n" + "With other rites more and at the last\n" + "The statue of Mars began his hauberk ring;\n" + "And with that sound he heard a murmuring\n" + "Full low and dim, that saide thus, \"Victory.\"\n" + "For which he gave to Mars honour and glory.\n" + "And thus with joy, and hope well to fare,\n" + "Arcite anon unto his inn doth fare.\n" + "As fain* as fowl is of the brighte sun. *glad\n" + "\n" + "And right anon such strife there is begun\n" + "For thilke* granting, in the heav'n above, *that\n" + "Betwixte Venus the goddess of love,\n" + "And Mars the sterne god armipotent,\n" + "That Jupiter was busy it to stent*: *stop\n" + "Till that the pale Saturnus the cold,<70>\n" + "That knew so many of adventures old,\n" + "Found in his old experience such an art,\n" + "That he full soon hath pleased every part.\n" + "As sooth is said, eld* hath great advantage, *age\n" + "In eld is bothe wisdom and usage*: *experience\n" + "Men may the old out-run, but not out-rede*. *outwit\n" + "Saturn anon, to stint the strife and drede,\n" + "Albeit that it is against his kind,* *nature\n" + "Of all this strife gan a remedy find.\n" + "\"My deare daughter Venus,\" quoth Saturn,\n" + "\"My course*, that hath so wide for to turn, *orbit <71>\n" + "Hath more power than wot any man.\n" + "Mine is the drowning in the sea so wan;\n" + "Mine is the prison in the darke cote*, *cell\n" + "Mine the strangling and hanging by the throat,\n" + "The murmur, and the churlish rebelling,\n" + "The groyning*, and the privy poisoning. *discontent\n" + "I do vengeance and plein* correction, *full\n" + "I dwell in the sign of the lion.\n" + "Mine is the ruin of the highe halls,\n" + "The falling of the towers and the walls\n" + "Upon the miner or the carpenter:\n" + "I slew Samson in shaking the pillar:\n" + "Mine also be the maladies cold,\n" + "The darke treasons, and the castes* old: *plots\n" + "My looking is the father of pestilence.\n" + "Now weep no more, I shall do diligence\n" + "That Palamon, that is thine owen knight,\n" + "Shall have his lady, as thou hast him hight*. *promised\n" + "Though Mars shall help his knight, yet natheless\n" + "Betwixte you there must sometime be peace:\n" + "All be ye not of one complexion,\n" + "That each day causeth such division,\n" + "I am thine ayel*, ready at thy will; *grandfather <72>\n" + "Weep now no more, I shall thy lust* fulfil.\" *pleasure\n" + "Now will I stenten* of the gods above, *cease speaking\n" + "Of Mars, and of Venus, goddess of love,\n" + "And telle you as plainly as I can\n" + "The great effect, for which that I began.\n" + "\n" + "Great was the feast in Athens thilke* day; *that\n" + "And eke the lusty season of that May\n" + "Made every wight to be in such pleasance,\n" + "That all that Monday jousten they and dance,\n" + "And spenden it in Venus' high service.\n" + "But by the cause that they shoulde rise\n" + "Early a-morrow for to see that fight,\n" + "Unto their reste wente they at night.\n" + "And on the morrow, when the day gan spring,\n" + "Of horse and harness* noise and clattering *armour\n" + "There was in the hostelries all about:\n" + "And to the palace rode there many a rout* *train, retinue\n" + "Of lordes, upon steedes and palfreys.\n" + "There mayst thou see devising* of harness *decoration\n" + "So uncouth* and so rich, and wrought so weel *unkown, rare\n" + "Of goldsmithry, of brouding*, and of steel; *embroidery\n" + "The shieldes bright, the testers*, and trappures** *helmets<73>\n" + "Gold-hewen helmets, hauberks, coat-armures; **trappings\n" + "Lordes in parements* on their coursers, *ornamental garb <74>;\n" + "Knightes of retinue, and eke squiers,\n" + "Nailing the spears, and helmes buckeling,\n" + "Gniding* of shieldes, with lainers** lacing; *polishing <75>\n" + "There as need is, they were nothing idle: **lanyards\n" + "The foamy steeds upon the golden bridle\n" + "Gnawing, and fast the armourers also\n" + "With file and hammer pricking to and fro;\n" + "Yeomen on foot, and knaves* many one *servants\n" + "With shorte staves, thick* as they may gon**; *close **walk\n" + "Pipes, trumpets, nakeres*, and clariouns, *drums <76>\n" + "That in the battle blowe bloody souns;\n" + "The palace full of people up and down,\n" + "There three, there ten, holding their questioun*, *conversation\n" + "Divining* of these Theban knightes two. *conjecturing\n" + "Some saiden thus, some said it shall he so;\n" + "Some helden with him with the blacke beard,\n" + "Some with the bald, some with the thick-hair'd;\n" + "Some said he looked grim, and woulde fight:\n" + "He had a sparth* of twenty pound of weight. *double-headed axe\n" + "Thus was the halle full of divining* *conjecturing\n" + "Long after that the sunne gan up spring.\n" + "The great Theseus that of his sleep is waked\n" + "With minstrelsy, and noise that was maked,\n" + "Held yet the chamber of his palace rich,\n" + "Till that the Theban knightes both y-lich* *alike\n" + "Honoured were, and to the palace fet*. *fetched\n" + "Duke Theseus is at a window set,\n" + "Array'd right as he were a god in throne:\n" + "The people presseth thitherward full soon\n" + "Him for to see, and do him reverence,\n" + "And eke to hearken his hest* and his sentence**. *command **speech\n" + "An herald on a scaffold made an O, <77>\n" + "Till the noise of the people was y-do*: *done\n" + "And when he saw the people of noise all still,\n" + "Thus shewed he the mighty Duke's will.\n" + "\"The lord hath of his high discretion\n" + "Considered that it were destruction\n" + "To gentle blood, to fighten in the guise\n" + "Of mortal battle now in this emprise:\n" + "Wherefore to shape* that they shall not die, *arrange, contrive\n" + "He will his firste purpose modify.\n" + "No man therefore, on pain of loss of life,\n" + "No manner* shot, nor poleaxe, nor short knife *kind of\n" + "Into the lists shall send, or thither bring.\n" + "Nor short sword for to stick with point biting\n" + "No man shall draw, nor bear it by his side.\n" + "And no man shall unto his fellow ride\n" + "But one course, with a sharp y-grounden spear:\n" + "*Foin if him list on foot, himself to wear. *He who wishes can\n" + "And he that is at mischief shall be take*, fence on foot to defend\n" + "And not slain, but be brought unto the stake, himself, and he that\n" + "That shall be ordained on either side; is in peril shall be taken*\n" + "Thither he shall by force, and there abide.\n" + "And if *so fall* the chiefetain be take *should happen*\n" + "On either side, or elles slay his make*, *equal, match\n" + "No longer then the tourneying shall last.\n" + "God speede you; go forth and lay on fast.\n" + "With long sword and with mace fight your fill.\n" + "Go now your way; this is the lordes will.\n" + "The voice of the people touched the heaven,\n" + "So loude cried they with merry steven*: *sound\n" + "God save such a lord that is so good,\n" + "He willeth no destruction of blood.\n" + "\n" + "Up go the trumpets and the melody,\n" + "And to the listes rode the company\n" + "*By ordinance*, throughout the city large, *in orderly array*\n" + "Hanged with cloth of gold, and not with sarge*. *serge <78>\n" + "Full like a lord this noble Duke gan ride,\n" + "And these two Thebans upon either side:\n" + "\n" + "And after rode the queen and Emily,\n" + "And after them another company\n" + "Of one and other, after their degree.\n" + "And thus they passed thorough that city\n" + "And to the listes came they by time:\n" + "It was not of the day yet fully prime*. *between 6 & 9 a.m.\n" + "When set was Theseus full rich and high,\n" + "Hippolyta the queen and Emily,\n" + "And other ladies in their degrees about,\n" + "Unto the seates presseth all the rout.\n" + "And westward, through the gates under Mart,\n" + "Arcite, and eke the hundred of his part,\n" + "With banner red, is enter'd right anon;\n" + "And in the selve* moment Palamon *self-same\n" + "Is, under Venus, eastward in the place,\n" + "With banner white, and hardy cheer* and face *expression\n" + "In all the world, to seeken up and down\n" + "So even* without variatioun *equal\n" + "There were such companies never tway.\n" + "For there was none so wise that coulde say\n" + "That any had of other avantage\n" + "Of worthiness, nor of estate, nor age,\n" + "So even were they chosen for to guess.\n" + "And *in two ranges faire they them dress*. *they arranged themselves\n" + "When that their names read were every one, in two rows*\n" + "That in their number guile* were there none, *fraud\n" + "Then were the gates shut, and cried was loud;\n" + "\"Do now your devoir, younge knights proud\n" + "The heralds left their pricking* up and down *spurring their horses\n" + "Now ring the trumpet loud and clarioun.\n" + "There is no more to say, but east and west\n" + "In go the speares sadly* in the rest; *steadily\n" + "In go the sharpe spurs into the side.\n" + "There see me who can joust, and who can ride.\n" + "There shiver shaftes upon shieldes thick;\n" + "He feeleth through the hearte-spoon<79> the prick.\n" + "Up spring the speares twenty foot on height;\n" + "Out go the swordes as the silver bright.\n" + "The helmes they to-hewen, and to-shred*; *strike in pieces <80>\n" + "Out burst the blood, with sterne streames red.\n" + "With mighty maces the bones they to-brest*. *burst\n" + "He <81> through the thickest of the throng gan threst*. *thrust\n" + "There stumble steedes strong, and down go all.\n" + "He rolleth under foot as doth a ball.\n" + "He foineth* on his foe with a trunchoun, *forces himself\n" + "And he him hurtleth with his horse adown.\n" + "He through the body hurt is, and *sith take*, *afterwards captured*\n" + "Maugre his head, and brought unto the stake,\n" + "As forword* was, right there he must abide. *covenant\n" + "Another led is on that other side.\n" + "And sometime doth* them Theseus to rest, *caused\n" + "Them to refresh, and drinken if them lest*. *pleased\n" + "Full oft a day have thilke Thebans two *these\n" + "Together met and wrought each other woe:\n" + "Unhorsed hath each other of them tway* *twice\n" + "There is no tiger in the vale of Galaphay, <82>\n" + "When that her whelp is stole, when it is lite* *little\n" + "So cruel on the hunter, as Arcite\n" + "For jealous heart upon this Palamon:\n" + "Nor in Belmarie <83> there is no fell lion,\n" + "That hunted is, or for his hunger wood* *mad\n" + "Or for his prey desireth so the blood,\n" + "As Palamon to slay his foe Arcite.\n" + "The jealous strokes upon their helmets bite;\n" + "Out runneth blood on both their sides red,\n" + "Sometime an end there is of every deed\n" + "For ere the sun unto the reste went,\n" + "The stronge king Emetrius gan hent* *sieze, assail\n" + "This Palamon, as he fought with Arcite,\n" + "And made his sword deep in his flesh to bite,\n" + "And by the force of twenty is he take,\n" + "Unyielding, and is drawn unto the stake.\n" + "And in the rescue of this Palamon\n" + "The stronge king Licurgus is borne down:\n" + "And king Emetrius, for all his strength\n" + "Is borne out of his saddle a sword's length,\n" + "So hit him Palamon ere he were take:\n" + "But all for nought; he was brought to the stake:\n" + "His hardy hearte might him helpe naught,\n" + "He must abide when that he was caught,\n" + "By force, and eke by composition*. *the bargain\n" + "Who sorroweth now but woful Palamon\n" + "That must no more go again to fight?\n" + "And when that Theseus had seen that sight\n" + "Unto the folk that foughte thus each one,\n" + "He cried, Ho! no more, for it is done!\n" + "I will be true judge, and not party.\n" + "Arcite of Thebes shall have Emily,\n" + "That by his fortune hath her fairly won.\"\n" + "Anon there is a noise of people gone,\n" + "For joy of this, so loud and high withal,\n" + "It seemed that the listes shoulde fall.\n" + "\n" + "What can now faire Venus do above?\n" + "What saith she now? what doth this queen of love?\n" + "But weepeth so, for wanting of her will,\n" + "Till that her teares in the listes fill* *fall\n" + "She said: \"I am ashamed doubteless.\"\n" + "Saturnus saide: \"Daughter, hold thy peace.\n" + "Mars hath his will, his knight hath all his boon,\n" + "And by mine head thou shalt be eased soon.\"\n" + " The trumpeters with the loud minstrelsy,\n" + "The heralds, that full loude yell and cry,\n" + "Be in their joy for weal of Dan* Arcite. *Lord\n" + "But hearken me, and stinte noise a lite,\n" + "What a miracle there befell anon\n" + "This fierce Arcite hath off his helm y-done,\n" + "And on a courser for to shew his face\n" + "He *pricketh endelong* the large place, *rides from end to end*\n" + "Looking upward upon this Emily;\n" + "And she again him cast a friendly eye\n" + "(For women, as to speaken *in commune*, *generally*\n" + "They follow all the favour of fortune),\n" + "And was all his in cheer*, as his in heart. *countenance\n" + "Out of the ground a fire infernal start,\n" + "From Pluto sent, at request of Saturn\n" + "For which his horse for fear began to turn,\n" + "And leap aside, and founder* as he leap *stumble\n" + "And ere that Arcite may take any keep*, *care\n" + "He pight* him on the pummel** of his head. *pitched **top\n" + "That in the place he lay as he were dead.\n" + "His breast to-bursten with his saddle-bow.\n" + "As black he lay as any coal or crow,\n" + "So was the blood y-run into his face.\n" + "Anon he was y-borne out of the place\n" + "With hearte sore, to Theseus' palace.\n" + "Then was he carven* out of his harness. *cut\n" + "And in a bed y-brought full fair and blive* *quickly\n" + "For he was yet in mem'ry and alive,\n" + "And always crying after Emily.\n" + "\n" + "Duke Theseus, with all his company,\n" + "Is come home to Athens his city,\n" + "With alle bliss and great solemnity.\n" + "Albeit that this aventure was fall*, *befallen\n" + "He woulde not discomforte* them all *discourage\n" + "Then said eke, that Arcite should not die,\n" + "He should be healed of his malady.\n" + "And of another thing they were as fain*. *glad\n" + "That of them alle was there no one slain,\n" + "All* were they sorely hurt, and namely** one, *although **especially\n" + "That with a spear was thirled* his breast-bone. *pierced\n" + "To other woundes, and to broken arms,\n" + "Some hadden salves, and some hadden charms:\n" + "And pharmacies of herbs, and eke save* *sage, Salvia officinalis\n" + "They dranken, for they would their lives have.\n" + "For which this noble Duke, as he well can,\n" + "Comforteth and honoureth every man,\n" + "And made revel all the longe night,\n" + "Unto the strange lordes, as was right.\n" + "Nor there was holden no discomforting,\n" + "But as at jousts or at a tourneying;\n" + "For soothly there was no discomfiture,\n" + "For falling is not but an aventure*. *chance, accident\n" + "Nor to be led by force unto a stake\n" + "Unyielding, and with twenty knights y-take\n" + "One person all alone, withouten mo',\n" + "And harried* forth by armes, foot, and toe, *dragged, hurried\n" + "And eke his steede driven forth with staves,\n" + "With footmen, bothe yeomen and eke knaves*, *servants\n" + "It was *aretted him no villainy:* *counted no disgrace to him*\n" + "There may no man *clepen it cowardy*. *call it cowardice*\n" + "For which anon Duke Theseus *let cry*, -- *caused to be proclaimed*\n" + "To stenten* alle rancour and envy, -- *stop\n" + "The gree* as well on one side as the other, *prize, merit\n" + "And either side alike as other's brother:\n" + "And gave them giftes after their degree,\n" + "And held a feaste fully dayes three:\n" + "And conveyed the kinges worthily\n" + "Out of his town a journee* largely *day's journey\n" + "And home went every man the righte way,\n" + "There was no more but \"Farewell, Have good day.\"\n" + "Of this bataille I will no more indite\n" + "But speak of Palamon and of Arcite.\n" + "\n" + "Swelleth the breast of Arcite and the sore\n" + "Increaseth at his hearte more and more.\n" + "The clotted blood, for any leache-craft* *surgical skill\n" + "Corrupteth and is *in his bouk y-laft* *left in his body*\n" + "That neither *veine blood nor ventousing*, *blood-letting or cupping*\n" + "Nor drink of herbes may be his helping.\n" + "The virtue expulsive or animal,\n" + "From thilke virtue called natural,\n" + "Nor may the venom voide, nor expel\n" + "The pipes of his lungs began to swell\n" + "And every lacert* in his breast adown *sinew, muscle\n" + "Is shent* with venom and corruption. *destroyed\n" + "Him gaineth* neither, for to get his life, *availeth\n" + "Vomit upward, nor downward laxative;\n" + "All is to-bursten thilke region;\n" + "Nature hath now no domination.\n" + "And certainly where nature will not wirch,* *work\n" + "Farewell physic: go bear the man to chirch.* *church\n" + "This all and some is, Arcite must die.\n" + "For which he sendeth after Emily,\n" + "And Palamon, that was his cousin dear,\n" + "Then said he thus, as ye shall after hear.\n" + "\n" + "\"Nought may the woful spirit in mine heart\n" + "Declare one point of all my sorrows' smart\n" + "To you, my lady, that I love the most:\n" + "But I bequeath the service of my ghost\n" + "To you aboven every creature,\n" + "Since that my life ne may no longer dure.\n" + "Alas the woe! alas, the paines strong\n" + "That I for you have suffered and so long!\n" + "Alas the death, alas, mine Emily!\n" + "Alas departing* of our company! *the severance\n" + "Alas, mine hearte's queen! alas, my wife!\n" + "Mine hearte's lady, ender of my life!\n" + "What is this world? what aske men to have?\n" + "Now with his love, now in his colde grave\n" + "Al one, withouten any company.\n" + "Farewell, my sweet, farewell, mine Emily,\n" + "And softly take me in your armes tway,\n" + "For love of God, and hearken what I say.\n" + "I have here with my cousin Palamon\n" + "Had strife and rancour many a day agone,\n" + "For love of you, and for my jealousy.\n" + "And Jupiter so *wis my soule gie*, *surely guides my soul*\n" + "To speaken of a servant properly,\n" + "With alle circumstances truely,\n" + "That is to say, truth, honour, and knighthead,\n" + "Wisdom, humbless*, estate, and high kindred, *humility\n" + "Freedom, and all that longeth to that art,\n" + "So Jupiter have of my soul part,\n" + "As in this world right now I know not one,\n" + "So worthy to be lov'd as Palamon,\n" + "That serveth you, and will do all his life.\n" + "And if that you shall ever be a wife,\n" + "Forget not Palamon, the gentle man.\"\n" + "\n" + "And with that word his speech to fail began.\n" + "For from his feet up to his breast was come\n" + "The cold of death, that had him overnome*. *overcome\n" + "And yet moreover in his armes two\n" + "The vital strength is lost, and all ago*. *gone\n" + "Only the intellect, withoute more,\n" + "That dwelled in his hearte sick and sore,\n" + "Gan faile, when the hearte felte death;\n" + "Dusked* his eyen two, and fail'd his breath. *grew dim\n" + "But on his lady yet he cast his eye;\n" + "His laste word was; \"Mercy, Emily!\"\n" + "His spirit changed house, and wente there,\n" + "As I came never I cannot telle where.<84>\n" + "Therefore I stent*, I am no divinister**; *refrain **diviner\n" + "Of soules find I nought in this register.\n" + "Ne me list not th' opinions to tell\n" + "Of them, though that they writen where they dwell;\n" + "Arcite is cold, there Mars his soule gie.* *guide\n" + "Now will I speake forth of Emily.\n" + "\n" + "Shriek'd Emily, and howled Palamon,\n" + "And Theseus his sister took anon\n" + "Swooning, and bare her from the corpse away.\n" + "What helpeth it to tarry forth the day,\n" + "To telle how she wept both eve and morrow?\n" + "For in such cases women have such sorrow,\n" + "When that their husbands be from them y-go*, *gone\n" + "That for the more part they sorrow so,\n" + "Or elles fall into such malady,\n" + "That at the laste certainly they die.\n" + "Infinite be the sorrows and the tears\n" + "Of olde folk, and folk of tender years,\n" + "In all the town, for death of this Theban:\n" + "For him there weepeth bothe child and man.\n" + "So great a weeping was there none certain,\n" + "When Hector was y-brought, all fresh y-slain,\n" + "To Troy: alas! the pity that was there,\n" + "Scratching of cheeks, and rending eke of hair.\n" + "\"Why wouldest thou be dead?\" these women cry,\n" + "\"And haddest gold enough, and Emily.\"\n" + "No manner man might gladden Theseus,\n" + "Saving his olde father Egeus,\n" + "That knew this worlde's transmutatioun,\n" + "As he had seen it changen up and down,\n" + "Joy after woe, and woe after gladness;\n" + "And shewed him example and likeness.\n" + "\"Right as there died never man,\" quoth he,\n" + "\"That he ne liv'd in earth in some degree*, *rank, condition\n" + "Right so there lived never man,\" he said,\n" + "\"In all this world, that sometime be not died.\n" + "This world is but a throughfare full of woe,\n" + "And we be pilgrims, passing to and fro:\n" + "Death is an end of every worldly sore.\"\n" + "And over all this said he yet much more\n" + "To this effect, full wisely to exhort\n" + "The people, that they should them recomfort.\n" + "Duke Theseus, with all his busy cure*, *care\n" + "*Casteth about*, where that the sepulture *deliberates*\n" + "Of good Arcite may best y-maked be,\n" + "And eke most honourable in his degree.\n" + "And at the last he took conclusion,\n" + "That there as first Arcite and Palamon\n" + "Hadde for love the battle them between,\n" + "That in that selve* grove, sweet and green, *self-same\n" + "There as he had his amorous desires,\n" + "His complaint, and for love his hote fires,\n" + "He woulde make a fire*, in which th' office *funeral pyre\n" + "Of funeral he might all accomplice;\n" + "And *let anon command* to hack and hew *immediately gave orders*\n" + "The oakes old, and lay them *on a rew* *in a row*\n" + "In culpons*, well arrayed for to brenne**. *logs **burn\n" + "His officers with swifte feet they renne* *run\n" + "And ride anon at his commandement.\n" + "And after this, Duke Theseus hath sent\n" + "After a bier, and it all oversprad\n" + "With cloth of gold, the richest that he had;\n" + "And of the same suit he clad Arcite.\n" + "Upon his handes were his gloves white,\n" + "Eke on his head a crown of laurel green,\n" + "And in his hand a sword full bright and keen.\n" + "He laid him *bare the visage* on the bier, *with face uncovered*\n" + "Therewith he wept, that pity was to hear.\n" + "And, for the people shoulde see him all,\n" + "When it was day he brought them to the hall,\n" + "That roareth of the crying and the soun'.\n" + "Then came this woful Theban, Palamon,\n" + "With sluttery beard, and ruggy ashy hairs,<85>\n" + "In clothes black, y-dropped all with tears,\n" + "And (passing over weeping Emily)\n" + "The ruefullest of all the company.\n" + "And *inasmuch as* the service should be *in order that*\n" + "The more noble and rich in its degree,\n" + "Duke Theseus let forth three steedes bring,\n" + "That trapped were in steel all glittering.\n" + "And covered with the arms of Dan Arcite.\n" + "Upon these steedes, that were great and white,\n" + "There satte folk, of whom one bare his shield,\n" + "Another his spear in his handes held;\n" +}; +const char knightsTale4[] PROGMEM = { + "The thirde bare with him his bow Turkeis*, *Turkish.\n" + "Of brent* gold was the case** and the harness: *burnished **quiver\n" + "And ride forth *a pace* with sorrowful cheer** *at a foot pace*\n" + "Toward the grove, as ye shall after hear. **expression\n" + "\n" + "The noblest of the Greekes that there were\n" + "Upon their shoulders carried the bier,\n" + "With slacke pace, and eyen red and wet,\n" + "Throughout the city, by the master* street, *main <86>\n" + "That spread was all with black, and wondrous high\n" + "Right of the same is all the street y-wrie.* *covered <87>\n" + "Upon the right hand went old Egeus,\n" + "And on the other side Duke Theseus,\n" + "With vessels in their hand of gold full fine,\n" + "All full of honey, milk, and blood, and wine;\n" + "Eke Palamon, with a great company;\n" + "And after that came woful Emily,\n" + "With fire in hand, as was that time the guise*, *custom\n" + "To do th' office of funeral service.\n" + "\n" + "High labour, and full great appareling* *preparation\n" + "Was at the service, and the pyre-making,\n" + "That with its greene top the heaven raught*, *reached\n" + "And twenty fathom broad its armes straught*: *stretched\n" + "This is to say, the boughes were so broad.\n" + "Of straw first there was laid many a load.\n" + "But how the pyre was maked up on height,\n" + "And eke the names how the trees hight*, *were called\n" + "As oak, fir, birch, asp*, alder, holm, poplere, *aspen\n" + "Willow, elm, plane, ash, box, chestnut, lind*, laurere, *linden, lime\n" + "Maple, thorn, beech, hazel, yew, whipul tree,\n" + "How they were fell'd, shall not be told for me;\n" + "Nor how the goddes* rannen up and down *the forest deities\n" + "Disinherited of their habitatioun,\n" + "In which they wonned* had in rest and peace, *dwelt\n" + "Nymphes, Faunes, and Hamadryades;\n" + "Nor how the beastes and the birdes all\n" + "Fledden for feare, when the wood gan fall;\n" + "Nor how the ground aghast* was of the light, *terrified\n" + "That was not wont to see the sunne bright;\n" + "Nor how the fire was couched* first with stre**, *laid **straw\n" + "And then with dry stickes cloven in three,\n" + "And then with greene wood and spicery*, *spices\n" + "And then with cloth of gold and with pierrie*, *precious stones\n" + "And garlands hanging with full many a flower,\n" + "The myrrh, the incense with so sweet odour;\n" + "Nor how Arcita lay among all this,\n" + "Nor what richess about his body is;\n" + "Nor how that Emily, as was the guise*, *custom\n" + "*Put in the fire* of funeral service<88>; *appplied the torch*\n" + "Nor how she swooned when she made the fire,\n" + "Nor what she spake, nor what was her desire;\n" + "Nor what jewels men in the fire then cast\n" + "When that the fire was great and burned fast;\n" + "\n" + "Nor how some cast their shield, and some their spear,\n" + "And of their vestiments, which that they wear,\n" + "And cuppes full of wine, and milk, and blood,\n" + "Into the fire, that burnt as it were wood*; *mad\n" + "Nor how the Greekes with a huge rout* *procession\n" + "Three times riden all the fire about <89>\n" + "Upon the left hand, with a loud shouting,\n" + "And thries with their speares clattering;\n" + "And thries how the ladies gan to cry;\n" + "Nor how that led was homeward Emily;\n" + "Nor how Arcite is burnt to ashes cold;\n" + "Nor how the lyke-wake* was y-hold *wake <90>\n" + "All thilke* night, nor how the Greekes play *that\n" + "The wake-plays*, ne keep** I not to say: *funeral games **care\n" + "Who wrestled best naked, with oil anoint,\n" + "Nor who that bare him best *in no disjoint*. *in any contest*\n" + "I will not tell eke how they all are gone\n" + "Home to Athenes when the play is done;\n" + "But shortly to the point now will I wend*, *come\n" + "And maken of my longe tale an end.\n" + "\n" + "By process and by length of certain years\n" + "All stinted* is the mourning and the tears *ended\n" + "Of Greekes, by one general assent.\n" + "Then seemed me there was a parlement\n" + "At Athens, upon certain points and cas*: *cases\n" + "Amonge the which points y-spoken was\n" + "To have with certain countries alliance,\n" + "And have of Thebans full obeisance.\n" + "For which this noble Theseus anon\n" + "Let* send after the gentle Palamon, *caused\n" + "Unwist* of him what was the cause and why: *unknown\n" + "But in his blacke clothes sorrowfully\n" + "He came at his commandment *on hie*; *in haste*\n" + "Then sente Theseus for Emily.\n" + "When they were set*, and hush'd was all the place *seated\n" + "And Theseus abided* had a space *waited\n" + "Ere any word came from his wise breast\n" + "*His eyen set he there as was his lest*, *he cast his eyes\n" + "And with a sad visage he sighed still, wherever he pleased*\n" + "And after that right thus he said his will.\n" + "\"The firste mover of the cause above\n" + "When he first made the faire chain of love,\n" + "Great was th' effect, and high was his intent;\n" + "Well wist he why, and what thereof he meant:\n" + "For with that faire chain of love he bond* *bound\n" + "The fire, the air, the water, and the lond\n" + "In certain bondes, that they may not flee:<91>\n" + "That same prince and mover eke,\" quoth he,\n" + "\"Hath stablish'd, in this wretched world adown,\n" + "Certain of dayes and duration\n" + "To all that are engender'd in this place,\n" + "Over the whiche day they may not pace*, *pass\n" + "All may they yet their dayes well abridge.\n" + "There needeth no authority to allege\n" + "For it is proved by experience;\n" + "But that me list declare my sentence*. *opinion\n" + "Then may men by this order well discern,\n" + "That thilke* mover stable is and etern. *the same\n" + "Well may men know, but that it be a fool,\n" + "That every part deriveth from its whole.\n" + "For nature hath not ta'en its beginning\n" + "Of no *partie nor cantle* of a thing, *part or piece*\n" + "But of a thing that perfect is and stable,\n" + "Descending so, till it be corruptable.\n" + "And therefore of His wise purveyance* *providence\n" + "He hath so well beset* his ordinance,\n" + "That species of things and progressions\n" + "Shallen endure by successions,\n" + "And not etern, withouten any lie:\n" + "This mayst thou understand and see at eye.\n" + "Lo th' oak, that hath so long a nourishing\n" + "From the time that it 'ginneth first to spring,\n" + "And hath so long a life, as ye may see,\n" + "Yet at the last y-wasted is the tree.\n" + "Consider eke, how that the harde stone\n" + "Under our feet, on which we tread and gon*, *walk\n" + "Yet wasteth, as it lieth by the way.\n" + "The broade river some time waxeth drey*. *dry\n" + "The greate townes see we wane and wend*. *go, disappear\n" + "Then may ye see that all things have an end.\n" + "Of man and woman see we well also, --\n" + "That needes in one of the termes two, --\n" + "That is to say, in youth or else in age,-\n" + "He must be dead, the king as shall a page;\n" + "Some in his bed, some in the deepe sea,\n" + "Some in the large field, as ye may see:\n" + "There helpeth nought, all go that ilke* way: *same\n" + "Then may I say that alle thing must die.\n" + "What maketh this but Jupiter the king?\n" + "The which is prince, and cause of alle thing,\n" + "Converting all unto his proper will,\n" + "From which it is derived, sooth to tell\n" + "And hereagainst no creature alive,\n" + "Of no degree, availeth for to strive.\n" + "Then is it wisdom, as it thinketh me,\n" + "To make a virtue of necessity,\n" + "And take it well, that we may not eschew*, *escape\n" + "And namely what to us all is due.\n" + "And whoso grudgeth* ought, he doth folly, *murmurs at\n" + "And rebel is to him that all may gie*. *direct, guide\n" + "And certainly a man hath most honour\n" + "To dien in his excellence and flower,\n" + "When he is sicker* of his goode name. *certain\n" + "Then hath he done his friend, nor him*, no shame *himself\n" + "And gladder ought his friend be of his death,\n" + "When with honour is yielded up his breath,\n" + "Than when his name *appalled is for age*; *decayed by old age*\n" + "For all forgotten is his vassalage*. *valour, service\n" + "Then is it best, as for a worthy fame,\n" + "To dien when a man is best of name.\n" + "The contrary of all this is wilfulness.\n" + "Why grudge we, why have we heaviness,\n" + "That good Arcite, of chivalry the flower,\n" + "Departed is, with duty and honour,\n" + "Out of this foule prison of this life?\n" + "Why grudge here his cousin and his wife\n" + "Of his welfare, that loved him so well?\n" + "Can he them thank? nay, God wot, neverdeal*, -- *not a jot\n" + "That both his soul and eke themselves offend*, *hurt\n" + "And yet they may their lustes* not amend**. *desires **control\n" + "What may I conclude of this longe serie*, *string of remarks\n" + "But after sorrow I rede* us to be merry, *counsel\n" + "And thanke Jupiter for all his grace?\n" + "And ere that we departe from this place,\n" + "I rede that we make of sorrows two\n" + "One perfect joye lasting evermo':\n" + "And look now where most sorrow is herein,\n" + "There will I first amenden and begin.\n" + "\"Sister,\" quoth he, \"this is my full assent,\n" + "With all th' advice here of my parlement,\n" + "That gentle Palamon, your owen knight,\n" + "That serveth you with will, and heart, and might,\n" + "And ever hath, since first time ye him knew,\n" + "That ye shall of your grace upon him rue*, *take pity\n" + "And take him for your husband and your lord:\n" + "Lend me your hand, for this is our accord.\n" + "*Let see* now of your womanly pity. *make display*\n" + "He is a kinge's brother's son, pardie*. *by God\n" + "And though he were a poore bachelere,\n" + "Since he hath served you so many a year,\n" + "And had for you so great adversity,\n" + "It muste be considered, *'lieveth me*. *believe me*\n" + "For gentle mercy *oweth to passen right*.\" *ought to be rightly\n" + "Then said he thus to Palamon the knight; directed*\n" + "\"I trow there needeth little sermoning\n" + "To make you assente to this thing.\n" + "Come near, and take your lady by the hand.\"\n" + "Betwixte them was made anon the band,\n" + "That hight matrimony or marriage,\n" + "By all the counsel of the baronage.\n" + "And thus with alle bliss and melody\n" + "Hath Palamon y-wedded Emily.\n" + "And God, that all this wide world hath wrought,\n" + "Send him his love, that hath it dearly bought.\n" + "For now is Palamon in all his weal,\n" + "Living in bliss, in riches, and in heal*. *health\n" + "And Emily him loves so tenderly,\n" + "And he her serveth all so gentilly,\n" + "That never was there worde them between\n" + "Of jealousy, nor of none other teen*. *cause of anger\n" + "Thus endeth Palamon and Emily\n" + "And God save all this faire company.\n" +}; + +void setup() { + int i = 0; + uint8_t c; + Serial.begin(115200); + do { + c = pgm_read_byte_far(pgm_get_far_address(knightsTale) + i); + if (c) Serial.write(c); + i++; + } while (c); + i = 0; + do { + c = pgm_read_byte_far(pgm_get_far_address(knightsTale2) + i); + if (c) Serial.write(c); + i++; + } while (c); + i = 0; + do { + c = pgm_read_byte_far(pgm_get_far_address(knightsTale3) + i); + if (c) Serial.write(c); + i++; + } while (c); + i = 0; + do { + c = pgm_read_byte_far(pgm_get_far_address(knightsTale4) + i); + if (c) Serial.write(c); + i++; + } while (c); +} +void loop() { +} diff --git a/ActualOptiboot/optiboot/examples/chaucer16k/chaucer16k.ino b/ActualOptiboot/optiboot/examples/chaucer16k/chaucer16k.ino new file mode 100644 index 0000000..8598786 --- /dev/null +++ b/ActualOptiboot/optiboot/examples/chaucer16k/chaucer16k.ino @@ -0,0 +1,306 @@ +// Text is an extract from The Canterbury Tales +// Full text at http://www.gutenberg.org/dirs/etext00/cbtls12.txt +#include + +const char knightsTale[] PROGMEM= { +" THE KNIGHT'S TALE <1>\n" +"\n" +"\n" +"WHILOM*, as olde stories tellen us, *formerly\n" +"There was a duke that highte* Theseus. *was called <2>\n" +"Of Athens he was lord and governor,\n" +"And in his time such a conqueror\n" +"That greater was there none under the sun.\n" +"Full many a riche country had he won.\n" +"What with his wisdom and his chivalry,\n" +"He conquer'd all the regne of Feminie,<3>\n" +"That whilom was y-cleped Scythia;\n" +"And weddede the Queen Hippolyta\n" +"And brought her home with him to his country\n" +"With muchel* glory and great solemnity, *great\n" +"And eke her younge sister Emily,\n" +"And thus with vict'ry and with melody\n" +"Let I this worthy Duke to Athens ride,\n" +"And all his host, in armes him beside.\n" +"\n" +"And certes, if it n'ere* too long to hear, *were not\n" +"I would have told you fully the mannere,\n" +"How wonnen* was the regne of Feminie, <4> *won\n" +"By Theseus, and by his chivalry;\n" +"And of the greate battle for the nonce\n" +"Betwixt Athenes and the Amazons;\n" +"And how assieged was Hippolyta,\n" +"The faire hardy queen of Scythia;\n" +"And of the feast that was at her wedding\n" +"And of the tempest at her homecoming.\n" +"But all these things I must as now forbear.\n" +"I have, God wot, a large field to ear* *plough<5>;\n" +"And weake be the oxen in my plough;\n" +"The remnant of my tale is long enow.\n" +"I will not *letten eke none of this rout*. *hinder any of\n" +"Let every fellow tell his tale about, this company*\n" +"And let see now who shall the supper win.\n" +"There *as I left*, I will again begin. *where I left off*\n" +"\n" +"This Duke, of whom I make mentioun,\n" +"When he was come almost unto the town,\n" +"In all his weal, and in his moste pride,\n" +"He was ware, as he cast his eye aside,\n" +"Where that there kneeled in the highe way\n" +"A company of ladies, tway and tway,\n" +"Each after other, clad in clothes black:\n" +"But such a cry and such a woe they make,\n" +"That in this world n'is creature living,\n" +"That hearde such another waimenting* *lamenting <6>\n" +"And of this crying would they never stenten*, *desist\n" +"Till they the reines of his bridle henten*. *seize\n" +"\"What folk be ye that at mine homecoming\n" +"Perturben so my feaste with crying?\"\n" +"Quoth Theseus; \"Have ye so great envy\n" +"Of mine honour, that thus complain and cry?\n" +"Or who hath you misboden*, or offended? *wronged\n" +"Do telle me, if it may be amended;\n" +"And why that ye be clad thus all in black?\"\n" +"\n" +"The oldest lady of them all then spake,\n" +"When she had swooned, with a deadly cheer*, *countenance\n" +"That it was ruthe* for to see or hear. *pity\n" +"She saide; \"Lord, to whom fortune hath given\n" +"Vict'ry, and as a conqueror to liven,\n" +"Nought grieveth us your glory and your honour;\n" +"But we beseechen mercy and succour.\n" +"Have mercy on our woe and our distress;\n" +"Some drop of pity, through thy gentleness,\n" +"Upon us wretched women let now fall.\n" +"For certes, lord, there is none of us all\n" +"That hath not been a duchess or a queen;\n" +"Now be we caitives*, as it is well seen: *captives\n" +"Thanked be Fortune, and her false wheel,\n" +"That *none estate ensureth to be wele*. *assures no continuance of\n" +"And certes, lord, t'abiden your presence prosperous estate*\n" +"Here in this temple of the goddess Clemence\n" +"We have been waiting all this fortenight:\n" +"Now help us, lord, since it lies in thy might.\n" +"\n" +"\"I, wretched wight, that weep and waile thus,\n" +"Was whilom wife to king Capaneus,\n" +"That starf* at Thebes, cursed be that day: *died <7>\n" +"And alle we that be in this array,\n" +"And maken all this lamentatioun,\n" +"We losten all our husbands at that town,\n" +"While that the siege thereabouten lay.\n" +"And yet the olde Creon, wellaway!\n" +"That lord is now of Thebes the city,\n" +"Fulfilled of ire and of iniquity,\n" +"He for despite, and for his tyranny,\n" +"To do the deade bodies villainy*, *insult\n" +"Of all our lorde's, which that been y-slaw, *slain\n" +"Hath all the bodies on an heap y-draw,\n" +"And will not suffer them by none assent\n" +"Neither to be y-buried, nor y-brent*, *burnt\n" +"But maketh houndes eat them in despite.\"\n" +"And with that word, withoute more respite\n" +"They fallen groff,* and cryden piteously; *grovelling\n" +"\"Have on us wretched women some mercy,\n" +"And let our sorrow sinken in thine heart.\"\n" +"\n" +"This gentle Duke down from his courser start\n" +"With hearte piteous, when he heard them speak.\n" +"Him thoughte that his heart would all to-break,\n" +"When he saw them so piteous and so mate* *abased\n" +"That whilom weren of so great estate.\n" +"And in his armes he them all up hent*, *raised, took\n" +"And them comforted in full good intent,\n" +"And swore his oath, as he was true knight,\n" +"He woulde do *so farforthly his might* *as far as his power went*\n" +"Upon the tyrant Creon them to wreak*, *avenge\n" +"That all the people of Greece shoulde speak,\n" +"How Creon was of Theseus y-served,\n" +"As he that had his death full well deserved.\n" +"And right anon withoute more abode* *delay\n" +"His banner he display'd, and forth he rode\n" +"To Thebes-ward, and all his, host beside:\n" +"No ner* Athenes would he go nor ride, *nearer\n" +"Nor take his ease fully half a day,\n" +"But onward on his way that night he lay:\n" +"And sent anon Hippolyta the queen,\n" +"And Emily her younge sister sheen* *bright, lovely\n" +"Unto the town of Athens for to dwell:\n" +"And forth he rit*; there is no more to tell. *rode\n" +"\n" +"The red statue of Mars with spear and targe* *shield\n" +"So shineth in his white banner large\n" +"That all the fieldes glitter up and down:\n" +"And by his banner borne is his pennon\n" +"Of gold full rich, in which there was y-beat* *stamped\n" +"The Minotaur<8> which that he slew in Crete\n" +"Thus rit this Duke, thus rit this conqueror\n" +"And in his host of chivalry the flower,\n" +"Till that he came to Thebes, and alight\n" +"Fair in a field, there as he thought to fight.\n" +"But shortly for to speaken of this thing,\n" +"With Creon, which that was of Thebes king,\n" +"He fought, and slew him manly as a knight\n" +"In plain bataille, and put his folk to flight:\n" +"And by assault he won the city after,\n" +"And rent adown both wall, and spar, and rafter;\n" +"And to the ladies he restored again\n" +"The bodies of their husbands that were slain,\n" +"To do obsequies, as was then the guise*. *custom\n" +"\n" +"But it were all too long for to devise* *describe\n" +"The greate clamour, and the waimenting*, *lamenting\n" +"Which that the ladies made at the brenning* *burning\n" +"Of the bodies, and the great honour\n" +"That Theseus the noble conqueror\n" +"Did to the ladies, when they from him went:\n" +"But shortly for to tell is mine intent.\n" +"When that this worthy Duke, this Theseus,\n" +"Had Creon slain, and wonnen Thebes thus,\n" +"Still in the field he took all night his rest,\n" +"And did with all the country as him lest*. *pleased\n" +"To ransack in the tas* of bodies dead, *heap\n" +"Them for to strip of *harness and of **weed, *armour **clothes\n" +"The pillers* did their business and cure, *pillagers <9>\n" +"After the battle and discomfiture.\n" +"And so befell, that in the tas they found,\n" +"Through girt with many a grievous bloody wound,\n" +"Two younge knightes *ligging by and by* *lying side by side*\n" +"Both in *one armes*, wrought full richely: *the same armour*\n" +"Of whiche two, Arcita hight that one,\n" +"And he that other highte Palamon.\n" +"Not fully quick*, nor fully dead they were, *alive\n" +"But by their coat-armour, and by their gear,\n" +"The heralds knew them well in special,\n" +"As those that weren of the blood royal\n" +"Of Thebes, and *of sistren two y-born*. *born of two sisters*\n" +"Out of the tas the pillers have them torn,\n" +"And have them carried soft unto the tent\n" +"Of Theseus, and he full soon them sent\n" +"To Athens, for to dwellen in prison\n" +"Perpetually, he *n'olde no ranson*. *would take no ransom*\n" +"And when this worthy Duke had thus y-done,\n" +"He took his host, and home he rit anon\n" +"With laurel crowned as a conquerour;\n" +"And there he lived in joy and in honour\n" +"Term of his life; what needeth wordes mo'?\n" +"And in a tower, in anguish and in woe,\n" +"Dwellen this Palamon, and eke Arcite,\n" +"For evermore, there may no gold them quite* *set free\n" +"\n" +"Thus passed year by year, and day by day,\n" +"Till it fell ones in a morn of May\n" +"That Emily, that fairer was to seen\n" +"Than is the lily upon his stalke green,\n" +"And fresher than the May with flowers new\n" +"(For with the rose colour strove her hue;\n" +"I n'ot* which was the finer of them two), *know not\n" +"Ere it was day, as she was wont to do,\n" +"She was arisen, and all ready dight*, *dressed\n" +"For May will have no sluggardy a-night;\n" +"The season pricketh every gentle heart,\n" +"And maketh him out of his sleep to start,\n" +"And saith, \"Arise, and do thine observance.\"\n" +"\n" +"This maketh Emily have remembrance\n" +"To do honour to May, and for to rise.\n" +"Y-clothed was she fresh for to devise;\n" +"Her yellow hair was braided in a tress,\n" +"Behind her back, a yarde long I guess.\n" +"And in the garden at *the sun uprist* *sunrise\n" +"She walketh up and down where as her list.\n" +"She gathereth flowers, party* white and red, *mingled\n" +"To make a sotel* garland for her head, *subtle, well-arranged\n" +"And as an angel heavenly she sung.\n" +"The greate tower, that was so thick and strong,\n" +"Which of the castle was the chief dungeon<10>\n" +"(Where as these knightes weren in prison,\n" +"Of which I tolde you, and telle shall),\n" +"Was even joinant* to the garden wall, *adjoining\n" +"There as this Emily had her playing.\n" +"\n" +"Bright was the sun, and clear that morrowning,\n" +"And Palamon, this woful prisoner,\n" +"As was his wont, by leave of his gaoler,\n" +"Was ris'n, and roamed in a chamber on high,\n" +"In which he all the noble city sigh*, *saw\n" +"And eke the garden, full of branches green,\n" +"There as this fresh Emelia the sheen\n" +"Was in her walk, and roamed up and down.\n" +"This sorrowful prisoner, this Palamon\n" +"Went in his chamber roaming to and fro,\n" +"And to himself complaining of his woe:\n" +"That he was born, full oft he said, Alas!\n" +"And so befell, by aventure or cas*, *chance\n" +"That through a window thick of many a bar\n" +"Of iron great, and square as any spar,\n" +"He cast his eyes upon Emelia,\n" +"And therewithal he blent* and cried, Ah! *started aside\n" +"As though he stungen were unto the heart.\n" +"And with that cry Arcite anon up start,\n" +"And saide, \"Cousin mine, what aileth thee,\n" +"That art so pale and deadly for to see?\n" +"Why cried'st thou? who hath thee done offence?\n" +"For Godde's love, take all in patience\n" +"Our prison*, for it may none other be. *imprisonment\n" +"Fortune hath giv'n us this adversity'.\n" +"Some wick'* aspect or disposition *wicked\n" +"Of Saturn<11>, by some constellation,\n" +"Hath giv'n us this, although we had it sworn,\n" +"So stood the heaven when that we were born,\n" +"We must endure; this is the short and plain.\n" +"\n" +"This Palamon answer'd, and said again:\n" +"\"Cousin, forsooth of this opinion\n" +"Thou hast a vain imagination.\n" +"This prison caused me not for to cry;\n" +"But I was hurt right now thorough mine eye\n" +"Into mine heart; that will my bane* be. *destruction\n" +"The fairness of the lady that I see\n" +"Yond in the garden roaming to and fro,\n" +"Is cause of all my crying and my woe.\n" +"I *n'ot wher* she be woman or goddess, *know not whether*\n" +"But Venus is it, soothly* as I guess, *truly\n" +"And therewithal on knees adown he fill,\n" +"And saide: \"Venus, if it be your will\n" +"You in this garden thus to transfigure\n" +"Before me sorrowful wretched creature,\n" +"Out of this prison help that we may scape.\n" +"And if so be our destiny be shape\n" +"By etern word to dien in prison,\n" +"Of our lineage have some compassion,\n" +"That is so low y-brought by tyranny.\"\n" +"\n" +"And with that word Arcita *gan espy* *began to look forth*\n" +"Where as this lady roamed to and fro\n" +"And with that sight her beauty hurt him so,\n" +"That if that Palamon was wounded sore,\n" +"Arcite is hurt as much as he, or more.\n" +"And with a sigh he saide piteously:\n" +"\"The freshe beauty slay'th me suddenly\n" +"Of her that roameth yonder in the place.\n" +"And but* I have her mercy and her grace, *unless\n" +"That I may see her at the leaste way,\n" +"I am but dead; there is no more to say.\"\n" +"This Palamon, when he these wordes heard,\n" +"Dispiteously* he looked, and answer'd: *angrily\n" +"\"Whether say'st thou this in earnest or in play?\"\n" +"\"Nay,\" quoth Arcite, \"in earnest, by my fay*. *faith\n" +"God help me so, *me lust full ill to play*.\" *I am in no humour\n" +"This Palamon gan knit his browes tway. for jesting*\n" +"\"It were,\" quoth he, \"to thee no great honour\n" +"For to be false, nor for to be traitour\n" +}; + +void setup() { + int i=0; + uint8_t c; + Serial.begin(115200); + do { + c = pgm_read_byte(knightsTale+i); + if (c) Serial.write(c); + i++; + } while (c); +} +void loop() { +} diff --git a/ActualOptiboot/optiboot/examples/chaucer256k/chaucer256k.ino b/ActualOptiboot/optiboot/examples/chaucer256k/chaucer256k.ino new file mode 100644 index 0000000..17a93da --- /dev/null +++ b/ActualOptiboot/optiboot/examples/chaucer256k/chaucer256k.ino @@ -0,0 +1,3778 @@ +// Text is an extract from The Canterbury Tales +// Full text at http://www.gutenberg.org/dirs/etext00/cbtls12.txt +#include + +const char knightsTale[] PROGMEM= { +" THE KNIGHT'S TALE <1>\n" +"\n" +"\n" +"WHILOM*, as olde stories tellen us, *formerly\n" +"There was a duke that highte* Theseus. *was called <2>\n" +"Of Athens he was lord and governor,\n" +"And in his time such a conqueror\n" +"That greater was there none under the sun.\n" +"Full many a riche country had he won.\n" +"What with his wisdom and his chivalry,\n" +"He conquer'd all the regne of Feminie,<3>\n" +"That whilom was y-cleped Scythia;\n" +"And weddede the Queen Hippolyta\n" +"And brought her home with him to his country\n" +"With muchel* glory and great solemnity, *great\n" +"And eke her younge sister Emily,\n" +"And thus with vict'ry and with melody\n" +"Let I this worthy Duke to Athens ride,\n" +"And all his host, in armes him beside.\n" +"\n" +"And certes, if it n'ere* too long to hear, *were not\n" +"I would have told you fully the mannere,\n" +"How wonnen* was the regne of Feminie, <4> *won\n" +"By Theseus, and by his chivalry;\n" +"And of the greate battle for the nonce\n" +"Betwixt Athenes and the Amazons;\n" +"And how assieged was Hippolyta,\n" +"The faire hardy queen of Scythia;\n" +"And of the feast that was at her wedding\n" +"And of the tempest at her homecoming.\n" +"But all these things I must as now forbear.\n" +"I have, God wot, a large field to ear* *plough<5>;\n" +"And weake be the oxen in my plough;\n" +"The remnant of my tale is long enow.\n" +"I will not *letten eke none of this rout*. *hinder any of\n" +"Let every fellow tell his tale about, this company*\n" +"And let see now who shall the supper win.\n" +"There *as I left*, I will again begin. *where I left off*\n" +"\n" +"This Duke, of whom I make mentioun,\n" +"When he was come almost unto the town,\n" +"In all his weal, and in his moste pride,\n" +"He was ware, as he cast his eye aside,\n" +"Where that there kneeled in the highe way\n" +"A company of ladies, tway and tway,\n" +"Each after other, clad in clothes black:\n" +"But such a cry and such a woe they make,\n" +"That in this world n'is creature living,\n" +"That hearde such another waimenting* *lamenting <6>\n" +"And of this crying would they never stenten*, *desist\n" +"Till they the reines of his bridle henten*. *seize\n" +"\"What folk be ye that at mine homecoming\n" +"Perturben so my feaste with crying?\"\n" +"Quoth Theseus; \"Have ye so great envy\n" +"Of mine honour, that thus complain and cry?\n" +"Or who hath you misboden*, or offended? *wronged\n" +"Do telle me, if it may be amended;\n" +"And why that ye be clad thus all in black?\"\n" +"\n" +"The oldest lady of them all then spake,\n" +"When she had swooned, with a deadly cheer*, *countenance\n" +"That it was ruthe* for to see or hear. *pity\n" +"She saide; \"Lord, to whom fortune hath given\n" +"Vict'ry, and as a conqueror to liven,\n" +"Nought grieveth us your glory and your honour;\n" +"But we beseechen mercy and succour.\n" +"Have mercy on our woe and our distress;\n" +"Some drop of pity, through thy gentleness,\n" +"Upon us wretched women let now fall.\n" +"For certes, lord, there is none of us all\n" +"That hath not been a duchess or a queen;\n" +"Now be we caitives*, as it is well seen: *captives\n" +"Thanked be Fortune, and her false wheel,\n" +"That *none estate ensureth to be wele*. *assures no continuance of\n" +"And certes, lord, t'abiden your presence prosperous estate*\n" +"Here in this temple of the goddess Clemence\n" +"We have been waiting all this fortenight:\n" +"Now help us, lord, since it lies in thy might.\n" +"\n" +"\"I, wretched wight, that weep and waile thus,\n" +"Was whilom wife to king Capaneus,\n" +"That starf* at Thebes, cursed be that day: *died <7>\n" +"And alle we that be in this array,\n" +"And maken all this lamentatioun,\n" +"We losten all our husbands at that town,\n" +"While that the siege thereabouten lay.\n" +"And yet the olde Creon, wellaway!\n" +"That lord is now of Thebes the city,\n" +"Fulfilled of ire and of iniquity,\n" +"He for despite, and for his tyranny,\n" +"To do the deade bodies villainy*, *insult\n" +"Of all our lorde's, which that been y-slaw, *slain\n" +"Hath all the bodies on an heap y-draw,\n" +"And will not suffer them by none assent\n" +"Neither to be y-buried, nor y-brent*, *burnt\n" +"But maketh houndes eat them in despite.\"\n" +"And with that word, withoute more respite\n" +"They fallen groff,* and cryden piteously; *grovelling\n" +"\"Have on us wretched women some mercy,\n" +"And let our sorrow sinken in thine heart.\"\n" +"\n" +"This gentle Duke down from his courser start\n" +"With hearte piteous, when he heard them speak.\n" +"Him thoughte that his heart would all to-break,\n" +"When he saw them so piteous and so mate* *abased\n" +"That whilom weren of so great estate.\n" +"And in his armes he them all up hent*, *raised, took\n" +"And them comforted in full good intent,\n" +"And swore his oath, as he was true knight,\n" +"He woulde do *so farforthly his might* *as far as his power went*\n" +"Upon the tyrant Creon them to wreak*, *avenge\n" +"That all the people of Greece shoulde speak,\n" +"How Creon was of Theseus y-served,\n" +"As he that had his death full well deserved.\n" +"And right anon withoute more abode* *delay\n" +"His banner he display'd, and forth he rode\n" +"To Thebes-ward, and all his, host beside:\n" +"No ner* Athenes would he go nor ride, *nearer\n" +"Nor take his ease fully half a day,\n" +"But onward on his way that night he lay:\n" +"And sent anon Hippolyta the queen,\n" +"And Emily her younge sister sheen* *bright, lovely\n" +"Unto the town of Athens for to dwell:\n" +"And forth he rit*; there is no more to tell. *rode\n" +"\n" +"The red statue of Mars with spear and targe* *shield\n" +"So shineth in his white banner large\n" +"That all the fieldes glitter up and down:\n" +"And by his banner borne is his pennon\n" +"Of gold full rich, in which there was y-beat* *stamped\n" +"The Minotaur<8> which that he slew in Crete\n" +"Thus rit this Duke, thus rit this conqueror\n" +"And in his host of chivalry the flower,\n" +"Till that he came to Thebes, and alight\n" +"Fair in a field, there as he thought to fight.\n" +"But shortly for to speaken of this thing,\n" +"With Creon, which that was of Thebes king,\n" +"He fought, and slew him manly as a knight\n" +"In plain bataille, and put his folk to flight:\n" +"And by assault he won the city after,\n" +"And rent adown both wall, and spar, and rafter;\n" +"And to the ladies he restored again\n" +"The bodies of their husbands that were slain,\n" +"To do obsequies, as was then the guise*. *custom\n" +"\n" +"But it were all too long for to devise* *describe\n" +"The greate clamour, and the waimenting*, *lamenting\n" +"Which that the ladies made at the brenning* *burning\n" +"Of the bodies, and the great honour\n" +"That Theseus the noble conqueror\n" +"Did to the ladies, when they from him went:\n" +"But shortly for to tell is mine intent.\n" +"When that this worthy Duke, this Theseus,\n" +"Had Creon slain, and wonnen Thebes thus,\n" +"Still in the field he took all night his rest,\n" +"And did with all the country as him lest*. *pleased\n" +"To ransack in the tas* of bodies dead, *heap\n" +"Them for to strip of *harness and of **weed, *armour **clothes\n" +"The pillers* did their business and cure, *pillagers <9>\n" +"After the battle and discomfiture.\n" +"And so befell, that in the tas they found,\n" +"Through girt with many a grievous bloody wound,\n" +"Two younge knightes *ligging by and by* *lying side by side*\n" +"Both in *one armes*, wrought full richely: *the same armour*\n" +"Of whiche two, Arcita hight that one,\n" +"And he that other highte Palamon.\n" +"Not fully quick*, nor fully dead they were, *alive\n" +"But by their coat-armour, and by their gear,\n" +"The heralds knew them well in special,\n" +"As those that weren of the blood royal\n" +"Of Thebes, and *of sistren two y-born*. *born of two sisters*\n" +"Out of the tas the pillers have them torn,\n" +"And have them carried soft unto the tent\n" +"Of Theseus, and he full soon them sent\n" +"To Athens, for to dwellen in prison\n" +"Perpetually, he *n'olde no ranson*. *would take no ransom*\n" +"And when this worthy Duke had thus y-done,\n" +"He took his host, and home he rit anon\n" +"With laurel crowned as a conquerour;\n" +"And there he lived in joy and in honour\n" +"Term of his life; what needeth wordes mo'?\n" +"And in a tower, in anguish and in woe,\n" +"Dwellen this Palamon, and eke Arcite,\n" +"For evermore, there may no gold them quite* *set free\n" +"\n" +"Thus passed year by year, and day by day,\n" +"Till it fell ones in a morn of May\n" +"That Emily, that fairer was to seen\n" +"Than is the lily upon his stalke green,\n" +"And fresher than the May with flowers new\n" +"(For with the rose colour strove her hue;\n" +"I n'ot* which was the finer of them two), *know not\n" +"Ere it was day, as she was wont to do,\n" +"She was arisen, and all ready dight*, *dressed\n" +"For May will have no sluggardy a-night;\n" +"The season pricketh every gentle heart,\n" +"And maketh him out of his sleep to start,\n" +"And saith, \"Arise, and do thine observance.\"\n" +"\n" +"This maketh Emily have remembrance\n" +"To do honour to May, and for to rise.\n" +"Y-clothed was she fresh for to devise;\n" +"Her yellow hair was braided in a tress,\n" +"Behind her back, a yarde long I guess.\n" +"And in the garden at *the sun uprist* *sunrise\n" +"She walketh up and down where as her list.\n" +"She gathereth flowers, party* white and red, *mingled\n" +"To make a sotel* garland for her head, *subtle, well-arranged\n" +"And as an angel heavenly she sung.\n" +"The greate tower, that was so thick and strong,\n" +"Which of the castle was the chief dungeon<10>\n" +"(Where as these knightes weren in prison,\n" +"Of which I tolde you, and telle shall),\n" +"Was even joinant* to the garden wall, *adjoining\n" +"There as this Emily had her playing.\n" +"\n" +"Bright was the sun, and clear that morrowning,\n" +"And Palamon, this woful prisoner,\n" +"As was his wont, by leave of his gaoler,\n" +"Was ris'n, and roamed in a chamber on high,\n" +"In which he all the noble city sigh*, *saw\n" +"And eke the garden, full of branches green,\n" +"There as this fresh Emelia the sheen\n" +"Was in her walk, and roamed up and down.\n" +"This sorrowful prisoner, this Palamon\n" +"Went in his chamber roaming to and fro,\n" +"And to himself complaining of his woe:\n" +"That he was born, full oft he said, Alas!\n" +"And so befell, by aventure or cas*, *chance\n" +"That through a window thick of many a bar\n" +"Of iron great, and square as any spar,\n" +"He cast his eyes upon Emelia,\n" +"And therewithal he blent* and cried, Ah! *started aside\n" +"As though he stungen were unto the heart.\n" +"And with that cry Arcite anon up start,\n" +"And saide, \"Cousin mine, what aileth thee,\n" +"That art so pale and deadly for to see?\n" +"Why cried'st thou? who hath thee done offence?\n" +"For Godde's love, take all in patience\n" +"Our prison*, for it may none other be. *imprisonment\n" +"Fortune hath giv'n us this adversity'.\n" +"Some wick'* aspect or disposition *wicked\n" +"Of Saturn<11>, by some constellation,\n" +"Hath giv'n us this, although we had it sworn,\n" +"So stood the heaven when that we were born,\n" +"We must endure; this is the short and plain.\n" +"\n" +"This Palamon answer'd, and said again:\n" +"\"Cousin, forsooth of this opinion\n" +"Thou hast a vain imagination.\n" +"This prison caused me not for to cry;\n" +"But I was hurt right now thorough mine eye\n" +"Into mine heart; that will my bane* be. *destruction\n" +"The fairness of the lady that I see\n" +"Yond in the garden roaming to and fro,\n" +"Is cause of all my crying and my woe.\n" +"I *n'ot wher* she be woman or goddess, *know not whether*\n" +"But Venus is it, soothly* as I guess, *truly\n" +"And therewithal on knees adown he fill,\n" +"And saide: \"Venus, if it be your will\n" +"You in this garden thus to transfigure\n" +"Before me sorrowful wretched creature,\n" +"Out of this prison help that we may scape.\n" +"And if so be our destiny be shape\n" +"By etern word to dien in prison,\n" +"Of our lineage have some compassion,\n" +"That is so low y-brought by tyranny.\"\n" +"\n" +"And with that word Arcita *gan espy* *began to look forth*\n" +"Where as this lady roamed to and fro\n" +"And with that sight her beauty hurt him so,\n" +"That if that Palamon was wounded sore,\n" +"Arcite is hurt as much as he, or more.\n" +"And with a sigh he saide piteously:\n" +"\"The freshe beauty slay'th me suddenly\n" +"Of her that roameth yonder in the place.\n" +"And but* I have her mercy and her grace, *unless\n" +"That I may see her at the leaste way,\n" +"I am but dead; there is no more to say.\"\n" +"This Palamon, when he these wordes heard,\n" +"Dispiteously* he looked, and answer'd: *angrily\n" +"\"Whether say'st thou this in earnest or in play?\"\n" +"\"Nay,\" quoth Arcite, \"in earnest, by my fay*. *faith\n" +"God help me so, *me lust full ill to play*.\" *I am in no humour\n" +"This Palamon gan knit his browes tway. for jesting*\n" +"\"It were,\" quoth he, \"to thee no great honour\n" +"For to be false, nor for to be traitour\n" +"To me, that am thy cousin and thy brother\n" +"Y-sworn full deep, and each of us to other,\n" +"That never for to dien in the pain <12>,\n" +"Till that the death departen shall us twain,\n" +"Neither of us in love to hinder other,\n" +"Nor in none other case, my leve* brother; *dear\n" +"But that thou shouldest truly farther me\n" +"In every case, as I should farther thee.\n" +"This was thine oath, and mine also certain;\n" +"I wot it well, thou dar'st it not withsayn*, *deny\n" +"Thus art thou of my counsel out of doubt,\n" +"And now thou wouldest falsely be about\n" +"To love my lady, whom I love and serve,\n" +"And ever shall, until mine hearte sterve* *die\n" +"Now certes, false Arcite, thou shalt not so\n" +"I lov'd her first, and tolde thee my woe\n" +"As to my counsel, and my brother sworn\n" +"To farther me, as I have told beforn.\n" +"For which thou art y-bounden as a knight\n" +"To helpe me, if it lie in thy might,\n" +"Or elles art thou false, I dare well sayn,\"\n" +"\n" +"This Arcita full proudly spake again:\n" +"\"Thou shalt,\" quoth he, \"be rather* false than I, *sooner\n" +"And thou art false, I tell thee utterly;\n" +"For par amour I lov'd her first ere thou.\n" +"What wilt thou say? *thou wist it not right now* *even now thou\n" +"Whether she be a woman or goddess. knowest not*\n" +"Thine is affection of holiness,\n" +"And mine is love, as to a creature:\n" +"For which I tolde thee mine aventure\n" +"As to my cousin, and my brother sworn\n" +"I pose*, that thou loved'st her beforn: *suppose\n" +"Wost* thou not well the olde clerke's saw<13>, *know'st\n" +"That who shall give a lover any law?\n" +"Love is a greater lawe, by my pan,\n" +"Than may be giv'n to any earthly man:\n" +"Therefore positive law, and such decree,\n" +"Is broke alway for love in each degree\n" +"A man must needes love, maugre his head.\n" +"He may not flee it, though he should be dead,\n" +"*All be she* maid, or widow, or else wife. *whether she be*\n" +"And eke it is not likely all thy life\n" +"To standen in her grace, no more than I\n" +"For well thou wost thyselfe verily,\n" +"That thou and I be damned to prison\n" +"Perpetual, us gaineth no ranson.\n" +"We strive, as did the houndes for the bone;\n" +"They fought all day, and yet their part was none.\n" +"There came a kite, while that they were so wroth,\n" +"And bare away the bone betwixt them both.\n" +"And therefore at the kinge's court, my brother,\n" +"Each man for himselfe, there is no other.\n" +"Love if thee list; for I love and aye shall\n" +"And soothly, leve brother, this is all.\n" +"Here in this prison musten we endure,\n" +"And each of us take his Aventure.\"\n" +"\n" +"Great was the strife and long between these tway,\n" +"If that I hadde leisure for to say;\n" +"But to the effect: it happen'd on a day\n" +"(To tell it you as shortly as I may),\n" +"A worthy duke that hight Perithous<14>\n" +"That fellow was to the Duke Theseus\n" +"Since thilke* day that they were children lite** *that **little\n" +"Was come to Athens, his fellow to visite,\n" +"And for to play, as he was wont to do;\n" +"For in this world he loved no man so;\n" +"And he lov'd him as tenderly again.\n" +"So well they lov'd, as olde bookes sayn,\n" +"That when that one was dead, soothly to sayn,\n" +"His fellow went and sought him down in hell:\n" +"But of that story list me not to write.\n" +"Duke Perithous loved well Arcite,\n" +"And had him known at Thebes year by year:\n" +"And finally at request and prayere\n" +"Of Perithous, withoute ranson\n" +"Duke Theseus him let out of prison,\n" +"Freely to go, where him list over all,\n" +"In such a guise, as I you tellen shall\n" +"This was the forword*, plainly to indite, *promise\n" +"Betwixte Theseus and him Arcite:\n" +"That if so were, that Arcite were y-found\n" +"Ever in his life, by day or night, one stound* *moment<15>\n" +"In any country of this Theseus,\n" +"And he were caught, it was accorded thus,\n" +"That with a sword he shoulde lose his head;\n" +"There was none other remedy nor rede*. *counsel\n" +"But took his leave, and homeward he him sped;\n" +"Let him beware, his necke lieth *to wed*. *in pledge*\n" +"\n" +"How great a sorrow suff'reth now Arcite!\n" +"The death he feeleth through his hearte smite;\n" +"He weepeth, waileth, crieth piteously;\n" +"To slay himself he waiteth privily.\n" +"He said; \"Alas the day that I was born!\n" +"Now is my prison worse than beforn:\n" +"*Now is me shape* eternally to dwell *it is fixed for me*\n" +"Not in purgatory, but right in hell.\n" +"Alas! that ever I knew Perithous.\n" +"For elles had I dwelt with Theseus\n" +"Y-fettered in his prison evermo'.\n" +"Then had I been in bliss, and not in woe.\n" +"Only the sight of her, whom that I serve,\n" +"Though that I never may her grace deserve,\n" +"Would have sufficed right enough for me.\n" +"O deare cousin Palamon,\" quoth he,\n" +"\"Thine is the vict'ry of this aventure,\n" +"Full blissfully in prison to endure:\n" +"In prison? nay certes, in paradise.\n" +"Well hath fortune y-turned thee the dice,\n" +"That hast the sight of her, and I th' absence.\n" +"For possible is, since thou hast her presence,\n" +"And art a knight, a worthy and an able,\n" +"That by some cas*, since fortune is changeable, *chance\n" +"Thou may'st to thy desire sometime attain.\n" +"But I that am exiled, and barren\n" +"Of alle grace, and in so great despair,\n" +"That there n'is earthe, water, fire, nor air,\n" +"Nor creature, that of them maked is,\n" +"That may me helpe nor comfort in this,\n" +"Well ought I *sterve in wanhope* and distress. *die in despair*\n" +"Farewell my life, my lust*, and my gladness. *pleasure\n" +"Alas, *why plainen men so in commune *why do men so often complain\n" +"Of purveyance of God*, or of Fortune, of God's providence?*\n" +"That giveth them full oft in many a guise\n" +"Well better than they can themselves devise?\n" +"Some man desireth for to have richess,\n" +"That cause is of his murder or great sickness.\n" +"And some man would out of his prison fain,\n" +"That in his house is of his meinie* slain. *servants <16>\n" +"Infinite harmes be in this mattere.\n" +"We wot never what thing we pray for here.\n" +"We fare as he that drunk is as a mouse.\n" +"A drunken man wot well he hath an house,\n" +"But he wot not which is the right way thither,\n" +"And to a drunken man the way is slither*. *slippery\n" +"And certes in this world so fare we.\n" +"We seeke fast after felicity,\n" +"But we go wrong full often truely.\n" +"Thus we may sayen all, and namely* I, *especially\n" +"That ween'd*, and had a great opinion, *thought\n" +"That if I might escape from prison\n" +"Then had I been in joy and perfect heal,\n" +"Where now I am exiled from my weal.\n" +"Since that I may not see you, Emily,\n" +"I am but dead; there is no remedy.\"\n" +"\n" +"Upon that other side, Palamon,\n" +"When that he wist Arcita was agone,\n" +"Much sorrow maketh, that the greate tower\n" +"Resounded of his yelling and clamour\n" +"The pure* fetters on his shinnes great *very <17>\n" +"Were of his bitter salte teares wet.\n" +"\n" +"\"Alas!\" quoth he, \"Arcita, cousin mine,\n" +"Of all our strife, God wot, the fruit is thine.\n" +"Thou walkest now in Thebes at thy large,\n" +"And of my woe thou *givest little charge*. *takest little heed*\n" +"Thou mayst, since thou hast wisdom and manhead*, *manhood, courage\n" +"Assemble all the folk of our kindred,\n" +"And make a war so sharp on this country\n" +"That by some aventure, or some treaty,\n" +"Thou mayst have her to lady and to wife,\n" +"For whom that I must needes lose my life.\n" +"For as by way of possibility,\n" +"Since thou art at thy large, of prison free,\n" +"And art a lord, great is thine avantage,\n" +"More than is mine, that sterve here in a cage.\n" +"For I must weep and wail, while that I live,\n" +"With all the woe that prison may me give,\n" +"And eke with pain that love me gives also,\n" +"That doubles all my torment and my woe.\"\n" +"\n" +"Therewith the fire of jealousy upstart\n" +"Within his breast, and hent* him by the heart *seized\n" +"So woodly*, that he like was to behold *madly\n" +"The box-tree, or the ashes dead and cold.\n" +"Then said; \"O cruel goddess, that govern\n" +"This world with binding of your word etern* *eternal\n" +"And writen in the table of adamant\n" +"Your parlement* and your eternal grant, *consultation\n" +"What is mankind more *unto you y-hold* *by you esteemed\n" +"Than is the sheep, that rouketh* in the fold! *lie huddled together\n" +"For slain is man, right as another beast;\n" +"And dwelleth eke in prison and arrest,\n" +"And hath sickness, and great adversity,\n" +"And oftentimes guilteless, pardie* *by God\n" +"What governance is in your prescience,\n" +"That guilteless tormenteth innocence?\n" +"And yet increaseth this all my penance,\n" +"That man is bounden to his observance\n" +"For Godde's sake to *letten of his will*, *restrain his desire*\n" +"Whereas a beast may all his lust fulfil.\n" +"And when a beast is dead, he hath no pain;\n" +"But man after his death must weep and plain,\n" +"Though in this worlde he have care and woe:\n" +"Withoute doubt it maye standen so.\n" +"\"The answer of this leave I to divines,\n" +"But well I wot, that in this world great pine* is; *pain, trouble\n" +"Alas! I see a serpent or a thief\n" +"That many a true man hath done mischief,\n" +"Go at his large, and where him list may turn.\n" +"But I must be in prison through Saturn,\n" +"And eke through Juno, jealous and eke wood*, *mad\n" +"That hath well nigh destroyed all the blood\n" +"Of Thebes, with his waste walles wide.\n" +"And Venus slay'th me on that other side\n" +"For jealousy, and fear of him, Arcite.\"\n" +"\n" +"Now will I stent* of Palamon a lite**, *pause **little\n" +"And let him in his prison stille dwell,\n" +"And of Arcita forth I will you tell.\n" +"The summer passeth, and the nightes long\n" +"Increase double-wise the paines strong\n" +"Both of the lover and the prisonere.\n" +"I n'ot* which hath the wofuller mistere**. *know not **condition\n" +"For, shortly for to say, this Palamon\n" +"Perpetually is damned to prison,\n" +"In chaines and in fetters to be dead;\n" +"And Arcite is exiled *on his head* *on peril of his head*\n" +"For evermore as out of that country,\n" +"Nor never more he shall his lady see.\n" +"You lovers ask I now this question,<18>\n" +"Who lieth the worse, Arcite or Palamon?\n" +"The one may see his lady day by day,\n" +"But in prison he dwelle must alway.\n" +"The other where him list may ride or go,\n" +"But see his lady shall he never mo'.\n" +"Now deem all as you liste, ye that can,\n" +"For I will tell you forth as I began.\n" +"\n" +"When that Arcite to Thebes comen was,\n" +"Full oft a day he swelt*, and said, \"Alas!\" *fainted\n" +"For see this lady he shall never mo'.\n" +"And shortly to concluden all his woe,\n" +"So much sorrow had never creature\n" +"That is or shall be while the world may dure.\n" +"His sleep, his meat, his drink is *him byraft*, *taken away from him*\n" +"That lean he wex*, and dry as any shaft. *became\n" +"His eyen hollow, grisly to behold,\n" +"His hue sallow, and pale as ashes cold,\n" +"And solitary he was, ever alone,\n" +"And wailing all the night, making his moan.\n" +"And if he hearde song or instrument,\n" +"Then would he weepen, he might not be stent*. *stopped\n" +"So feeble were his spirits, and so low,\n" +"And changed so, that no man coulde know\n" +"His speech, neither his voice, though men it heard.\n" +"And in his gear* for all the world he far'd *behaviour <19>\n" +"Not only like the lovers' malady\n" +"Of Eros, but rather y-like manie* *madness\n" +"Engender'd of humours melancholic,\n" +"Before his head in his cell fantastic.<20>\n" +"And shortly turned was all upside down,\n" +"Both habit and eke dispositioun,\n" +"Of him, this woful lover Dan* Arcite. *Lord <21>\n" +"Why should I all day of his woe indite?\n" +"When he endured had a year or two\n" +"This cruel torment, and this pain and woe,\n" +"At Thebes, in his country, as I said,\n" +"Upon a night in sleep as he him laid,\n" +"Him thought how that the winged god Mercury\n" +"Before him stood, and bade him to be merry.\n" +"His sleepy yard* in hand he bare upright; *rod <22>\n" +"A hat he wore upon his haires bright.\n" +"Arrayed was this god (as he took keep*) *notice\n" +"As he was when that Argus<23> took his sleep;\n" +"And said him thus: \"To Athens shalt thou wend*; *go\n" +"There is thee shapen* of thy woe an end.\" *fixed, prepared\n" +"And with that word Arcite woke and start.\n" +"\"Now truely how sore that e'er me smart,\"\n" +"Quoth he, \"to Athens right now will I fare.\n" +"Nor for no dread of death shall I not spare\n" +"To see my lady that I love and serve;\n" +"In her presence *I recke not to sterve.*\" *do not care if I die*\n" +"And with that word he caught a great mirror,\n" +"And saw that changed was all his colour,\n" +"And saw his visage all in other kind.\n" +"And right anon it ran him ill his mind,\n" +"That since his face was so disfigur'd\n" +"Of malady the which he had endur'd,\n" +"He mighte well, if that he *bare him low,* *lived in lowly fashion*\n" +"Live in Athenes evermore unknow,\n" +"And see his lady wellnigh day by day.\n" +"And right anon he changed his array,\n" +"And clad him as a poore labourer.\n" +"And all alone, save only a squier,\n" +"That knew his privity* and all his cas**, *secrets **fortune\n" +"Which was disguised poorly as he was,\n" +"To Athens is he gone the nexte* way. *nearest <24>\n" +"And to the court he went upon a day,\n" +"And at the gate he proffer'd his service,\n" +"To drudge and draw, what so men would devise*. *order\n" +"And, shortly of this matter for to sayn,\n" +"He fell in office with a chamberlain,\n" +"The which that dwelling was with Emily.\n" +"For he was wise, and coulde soon espy\n" +"Of every servant which that served her.\n" +"Well could he hewe wood, and water bear,\n" +"For he was young and mighty for the nones*, *occasion\n" +"And thereto he was strong and big of bones\n" +"To do that any wight can him devise.\n" +"\n" +"A year or two he was in this service,\n" +"Page of the chamber of Emily the bright;\n" +"And Philostrate he saide that he hight.\n" +"But half so well belov'd a man as he\n" +"Ne was there never in court of his degree.\n" +"He was so gentle of conditioun,\n" +"That throughout all the court was his renown.\n" +"They saide that it were a charity\n" +"That Theseus would *enhance his degree*, *elevate him in rank*\n" +"And put him in some worshipful service,\n" +"There as he might his virtue exercise.\n" +"And thus within a while his name sprung\n" +"Both of his deedes, and of his good tongue,\n" +"That Theseus hath taken him so near,\n" +"That of his chamber he hath made him squire,\n" +"And gave him gold to maintain his degree;\n" +"And eke men brought him out of his country\n" +"From year to year full privily his rent.\n" +"But honestly and slyly* he it spent, *discreetly, prudently\n" +"That no man wonder'd how that he it had.\n" +"And three year in this wise his life be lad*, *led\n" +"And bare him so in peace and eke in werre*, *war\n" +"There was no man that Theseus had so derre*. *dear\n" +"And in this blisse leave I now Arcite,\n" +"And speak I will of Palamon a lite*. *little\n" +"\n" +"In darkness horrible, and strong prison,\n" +"This seven year hath sitten Palamon,\n" +"Forpined*, what for love, and for distress. *pined, wasted away\n" +"Who feeleth double sorrow and heaviness\n" +"But Palamon? that love distraineth* so, *afflicts\n" +"That wood* out of his wits he went for woe, *mad\n" +"And eke thereto he is a prisonere\n" +"Perpetual, not only for a year.\n" +"Who coulde rhyme in English properly\n" +"His martyrdom? forsooth*, it is not I; *truly\n" +"Therefore I pass as lightly as I may.\n" +"It fell that in the seventh year, in May\n" +"The thirde night (as olde bookes sayn,\n" +"That all this story tellen more plain),\n" +"Were it by a venture or destiny\n" +"(As when a thing is shapen* it shall be), *settled, decreed\n" +"That soon after the midnight, Palamon\n" +"By helping of a friend brake his prison,\n" +"And fled the city fast as he might go,\n" +"For he had given drink his gaoler so\n" +"Of a clary <25>, made of a certain wine,\n" +"With *narcotise and opie* of Thebes fine, *narcotics and opium*\n" +"That all the night, though that men would him shake,\n" +"The gaoler slept, he mighte not awake:\n" +"And thus he fled as fast as ever he may.\n" +"The night was short, and *faste by the day *close at hand was\n" +"That needes cast he must himself to hide*. the day during which\n" +"And to a grove faste there beside he must cast about, or contrive,\n" +"With dreadful foot then stalked Palamon. to conceal himself.*\n" +"For shortly this was his opinion,\n" +"That in the grove he would him hide all day,\n" +"And in the night then would he take his way\n" +"To Thebes-ward, his friendes for to pray\n" +"On Theseus to help him to warray*. *make war <26>\n" +"And shortly either he would lose his life,\n" +"Or winnen Emily unto his wife.\n" +"This is th' effect, and his intention plain.\n" +"\n" +"Now will I turn to Arcita again,\n" +"That little wist how nighe was his care,\n" +"Till that Fortune had brought him in the snare.\n" +"The busy lark, the messenger of day,\n" +"Saluteth in her song the morning gray;\n" +"And fiery Phoebus riseth up so bright,\n" +"That all the orient laugheth at the sight,\n" +"And with his streames* drieth in the greves** *rays **groves\n" +"The silver droppes, hanging on the leaves;\n" +"And Arcite, that is in the court royal\n" +"With Theseus, his squier principal,\n" +"Is ris'n, and looketh on the merry day.\n" +"And for to do his observance to May,\n" +"Remembering the point* of his desire, *object\n" +"He on his courser, starting as the fire,\n" +"Is ridden to the fieldes him to play,\n" +"Out of the court, were it a mile or tway.\n" +"And to the grove, of which I have you told,\n" +"By a venture his way began to hold,\n" +"To make him a garland of the greves*, *groves\n" +"Were it of woodbine, or of hawthorn leaves,\n" +"And loud he sang against the sun so sheen*. *shining bright\n" +"\"O May, with all thy flowers and thy green,\n" +"Right welcome be thou, faire freshe May,\n" +"I hope that I some green here getten may.\"\n" +"And from his courser*, with a lusty heart, *horse\n" +"Into the grove full hastily he start,\n" +"And in a path he roamed up and down,\n" +"There as by aventure this Palamon\n" +"Was in a bush, that no man might him see,\n" +"For sore afeard of his death was he.\n" +"Nothing ne knew he that it was Arcite;\n" +"God wot he would have *trowed it full lite*. *full little believed it*\n" +"But sooth is said, gone since full many years,\n" +"The field hath eyen*, and the wood hath ears, *eyes\n" +"It is full fair a man *to bear him even*, *to be on his guard*\n" +"For all day meeten men at *unset steven*. *unexpected time <27>\n" +"Full little wot Arcite of his fellaw,\n" +"That was so nigh to hearken of his saw*, *saying, speech\n" +"For in the bush he sitteth now full still.\n" +"When that Arcite had roamed all his fill,\n" +"And *sungen all the roundel* lustily, *sang the roundelay*<28>\n" +"Into a study he fell suddenly,\n" +"As do those lovers in their *quainte gears*, *odd fashions*\n" +"Now in the crop*, and now down in the breres**, <29> *tree-top\n" +"Now up, now down, as bucket in a well. **briars\n" +"Right as the Friday, soothly for to tell,\n" +"Now shineth it, and now it raineth fast,\n" +"Right so can geary* Venus overcast *changeful\n" +"The heartes of her folk, right as her day\n" +"Is gearful*, right so changeth she array. *changeful\n" +"Seldom is Friday all the weeke like.\n" +"When Arcite had y-sung, he gan to sike*, *sigh\n" +"And sat him down withouten any more:\n" +"\"Alas!\" quoth he, \"the day that I was bore!\n" +"How longe, Juno, through thy cruelty\n" +"Wilt thou warrayen* Thebes the city? *torment\n" +"Alas! y-brought is to confusion\n" +"The blood royal of Cadm' and Amphion:\n" +"Of Cadmus, which that was the firste man,\n" +}; +const char knightsTale2[] PROGMEM= { +"That Thebes built, or first the town began,\n" +"And of the city first was crowned king.\n" +"Of his lineage am I, and his offspring\n" +"By very line, as of the stock royal;\n" +"And now I am *so caitiff and so thrall*, *wretched and enslaved*\n" +"That he that is my mortal enemy,\n" +"I serve him as his squier poorely.\n" +"And yet doth Juno me well more shame,\n" +"For I dare not beknow* mine owen name, *acknowledge <30>\n" +"But there as I was wont to hight Arcite,\n" +"Now hight I Philostrate, not worth a mite.\n" +"Alas! thou fell Mars, and alas! Juno,\n" +"Thus hath your ire our lineage all fordo* *undone, ruined\n" +"Save only me, and wretched Palamon,\n" +"That Theseus martyreth in prison.\n" +"And over all this, to slay me utterly,\n" +"Love hath his fiery dart so brenningly* *burningly\n" +"Y-sticked through my true careful heart,\n" +"That shapen was my death erst than my shert. <31>\n" +"Ye slay me with your eyen, Emily;\n" +"Ye be the cause wherefore that I die.\n" +"Of all the remnant of mine other care\n" +"Ne set I not the *mountance of a tare*, *value of a straw*\n" +"So that I could do aught to your pleasance.\"\n" +"\n" +"And with that word he fell down in a trance\n" +"A longe time; and afterward upstart\n" +"This Palamon, that thought thorough his heart\n" +"He felt a cold sword suddenly to glide:\n" +"For ire he quoke*, no longer would he hide. *quaked\n" +"And when that he had heard Arcite's tale,\n" +"As he were wood*, with face dead and pale, *mad\n" +"He start him up out of the bushes thick,\n" +"And said: \"False Arcita, false traitor wick'*, *wicked\n" +"Now art thou hent*, that lov'st my lady so, *caught\n" +"For whom that I have all this pain and woe,\n" +"And art my blood, and to my counsel sworn,\n" +"As I full oft have told thee herebeforn,\n" +"And hast bejaped* here Duke Theseus, *deceived, imposed upon\n" +"And falsely changed hast thy name thus;\n" +"I will be dead, or elles thou shalt die.\n" +"Thou shalt not love my lady Emily,\n" +"But I will love her only and no mo';\n" +"For I am Palamon thy mortal foe.\n" +"And though I have no weapon in this place,\n" +"But out of prison am astart* by grace, *escaped\n" +"I dreade* not that either thou shalt die, *doubt\n" +"Or else thou shalt not loven Emily.\n" +"Choose which thou wilt, for thou shalt not astart.\"\n" +"\n" +"This Arcite then, with full dispiteous* heart, *wrathful\n" +"When he him knew, and had his tale heard,\n" +"As fierce as lion pulled out a swerd,\n" +"And saide thus; \"By God that sitt'th above,\n" +"*N'ere it* that thou art sick, and wood for love, *were it not*\n" +"And eke that thou no weap'n hast in this place,\n" +"Thou should'st never out of this grove pace,\n" +"That thou ne shouldest dien of mine hand.\n" +"For I defy the surety and the band,\n" +"Which that thou sayest I have made to thee.\n" +"What? very fool, think well that love is free;\n" +"And I will love her maugre* all thy might. *despite\n" +"But, for thou art a worthy gentle knight,\n" +"And *wilnest to darraine her by bataille*, *will reclaim her\n" +"Have here my troth, to-morrow I will not fail, by combat*\n" +"Without weeting* of any other wight, *knowledge\n" +"That here I will be founden as a knight,\n" +"And bringe harness* right enough for thee; *armour and arms\n" +"And choose the best, and leave the worst for me.\n" +"And meat and drinke this night will I bring\n" +"Enough for thee, and clothes for thy bedding.\n" +"And if so be that thou my lady win,\n" +"And slay me in this wood that I am in,\n" +"Thou may'st well have thy lady as for me.\"\n" +"This Palamon answer'd, \"I grant it thee.\"\n" +"And thus they be departed till the morrow,\n" +"When each of them hath *laid his faith to borrow*. *pledged his faith*\n" +"\n" +"O Cupid, out of alle charity!\n" +"O Regne* that wilt no fellow have with thee! *queen <32>\n" +"Full sooth is said, that love nor lordeship\n" +"Will not, *his thanks*, have any fellowship. *thanks to him*\n" +"Well finden that Arcite and Palamon.\n" +"Arcite is ridd anon unto the town,\n" +"And on the morrow, ere it were daylight,\n" +"Full privily two harness hath he dight*, *prepared\n" +"Both suffisant and meete to darraine* *contest\n" +"The battle in the field betwixt them twain.\n" +"And on his horse, alone as he was born,\n" +"He carrieth all this harness him beforn;\n" +"And in the grove, at time and place y-set,\n" +"This Arcite and this Palamon be met.\n" +"Then change gan the colour of their face;\n" +"Right as the hunter in the regne* of Thrace *kingdom\n" +"That standeth at a gappe with a spear\n" +"When hunted is the lion or the bear,\n" +"And heareth him come rushing in the greves*, *groves\n" +"And breaking both the boughes and the leaves,\n" +"Thinketh, \"Here comes my mortal enemy,\n" +"Withoute fail, he must be dead or I;\n" +"For either I must slay him at the gap;\n" +"Or he must slay me, if that me mishap:\"\n" +"So fared they, in changing of their hue\n" +"*As far as either of them other knew*. *When they recognised each\n" +"There was no good day, and no saluting, other afar off*\n" +"But straight, withoute wordes rehearsing,\n" +"Evereach of them holp to arm the other,\n" +"As friendly, as he were his owen brother.\n" +"And after that, with sharpe speares strong\n" +"They foined* each at other wonder long. *thrust\n" +"Thou mightest weene*, that this Palamon *think\n" +"In fighting were as a wood* lion, *mad\n" +"And as a cruel tiger was Arcite:\n" +"As wilde boars gan they together smite,\n" +"That froth as white as foam, *for ire wood*. *mad with anger*\n" +"Up to the ancle fought they in their blood.\n" +"And in this wise I let them fighting dwell,\n" +"And forth I will of Theseus you tell.\n" +"\n" +"The Destiny, minister general,\n" +"That executeth in the world o'er all\n" +"The purveyance*, that God hath seen beforn; *foreordination\n" +"So strong it is, that though the world had sworn\n" +"The contrary of a thing by yea or nay,\n" +"Yet some time it shall fallen on a day\n" +"That falleth not eft* in a thousand year. *again\n" +"For certainly our appetites here,\n" +"Be it of war, or peace, or hate, or love,\n" +"All is this ruled by the sight* above. *eye, intelligence, power\n" +"This mean I now by mighty Theseus,\n" +"That for to hunten is so desirous --\n" +"And namely* the greate hart in May -- *especially\n" +"That in his bed there dawneth him no day\n" +"That he n'is clad, and ready for to ride\n" +"With hunt and horn, and houndes him beside.\n" +"For in his hunting hath he such delight,\n" +"That it is all his joy and appetite\n" +"To be himself the greate harte's bane* *destruction\n" +"For after Mars he serveth now Diane.\n" +"Clear was the day, as I have told ere this,\n" +"And Theseus, with alle joy and bliss,\n" +"With his Hippolyta, the faire queen,\n" +"And Emily, y-clothed all in green,\n" +"On hunting be they ridden royally.\n" +"And to the grove, that stood there faste by,\n" +"In which there was an hart, as men him told,\n" +"Duke Theseus the straighte way doth hold,\n" +"And to the laund* he rideth him full right, *plain <33>\n" +"There was the hart y-wont to have his flight,\n" +"And over a brook, and so forth on his way.\n" +"This Duke will have a course at him or tway\n" +"With houndes, such as him lust* to command. *pleased\n" +"And when this Duke was come to the laund,\n" +"Under the sun he looked, and anon\n" +"He was ware of Arcite and Palamon,\n" +"That foughte breme*, as it were bulles two. *fiercely\n" +"The brighte swordes wente to and fro\n" +"So hideously, that with the leaste stroke\n" +"It seemed that it woulde fell an oak,\n" +"But what they were, nothing yet he wote*. *knew\n" +"This Duke his courser with his spurres smote,\n" +"*And at a start* he was betwixt them two, *suddenly*\n" +"And pulled out a sword and cried, \"Ho!\n" +"No more, on pain of losing of your head.\n" +"By mighty Mars, he shall anon be dead\n" +"That smiteth any stroke, that I may see!\n" +"But tell to me what mister* men ye be, *manner, kind <34>\n" +"That be so hardy for to fighte here\n" +"Withoute judge or other officer,\n" +"As though it were in listes royally. <35>\n" +"This Palamon answered hastily,\n" +"And saide: \"Sir, what needeth wordes mo'?\n" +"We have the death deserved bothe two,\n" +"Two woful wretches be we, and caitives,\n" +"That be accumbered* of our own lives, *burdened\n" +"And as thou art a rightful lord and judge,\n" +"So give us neither mercy nor refuge.\n" +"And slay me first, for sainte charity,\n" +"But slay my fellow eke as well as me.\n" +"Or slay him first; for, though thou know it lite*, *little\n" +"This is thy mortal foe, this is Arcite\n" +"That from thy land is banisht on his head,\n" +"For which he hath deserved to be dead.\n" +"For this is he that came unto thy gate\n" +"And saide, that he highte Philostrate.\n" +"Thus hath he japed* thee full many year, *deceived\n" +"And thou hast made of him thy chief esquier;\n" +"And this is he, that loveth Emily.\n" +"For since the day is come that I shall die\n" +"I make pleinly* my confession, *fully, unreservedly\n" +"That I am thilke* woful Palamon, *that same <36>\n" +"That hath thy prison broken wickedly.\n" +"I am thy mortal foe, and it am I\n" +"That so hot loveth Emily the bright,\n" +"That I would die here present in her sight.\n" +"Therefore I aske death and my jewise*. *judgement\n" +"But slay my fellow eke in the same wise,\n" +"For both we have deserved to be slain.\"\n" +"\n" +"This worthy Duke answer'd anon again,\n" +"And said, \"This is a short conclusion.\n" +"Your own mouth, by your own confession\n" +"Hath damned you, and I will it record;\n" +"It needeth not to pain you with the cord;\n" +"Ye shall be dead, by mighty Mars the Red.<37>\n" +"\n" +"The queen anon for very womanhead\n" +"Began to weep, and so did Emily,\n" +"And all the ladies in the company.\n" +"Great pity was it as it thought them all,\n" +"That ever such a chance should befall,\n" +"For gentle men they were, of great estate,\n" +"And nothing but for love was this debate\n" +"They saw their bloody woundes wide and sore,\n" +"And cried all at once, both less and more,\n" +"\"Have mercy, Lord, upon us women all.\"\n" +"And on their bare knees adown they fall\n" +"And would have kissed his feet there as he stood,\n" +"Till at the last *aslaked was his mood* *his anger was\n" +"(For pity runneth soon in gentle heart); appeased*\n" +"And though at first for ire he quoke and start\n" +"He hath consider'd shortly in a clause\n" +"The trespass of them both, and eke the cause:\n" +"And although that his ire their guilt accused\n" +"Yet in his reason he them both excused;\n" +"As thus; he thoughte well that every man\n" +"Will help himself in love if that he can,\n" +"And eke deliver himself out of prison.\n" +"Of women, for they wepten ever-in-one:* *continually\n" +"And eke his hearte had compassion\n" +"And in his gentle heart he thought anon,\n" +"And soft unto himself he saide: \"Fie\n" +"Upon a lord that will have no mercy,\n" +"But be a lion both in word and deed,\n" +"To them that be in repentance and dread,\n" +"As well as-to a proud dispiteous* man *unpitying\n" +"That will maintaine what he first began.\n" +"That lord hath little of discretion,\n" +"That in such case *can no division*: *can make no distinction*\n" +"But weigheth pride and humbless *after one*.\" *alike*\n" +"And shortly, when his ire is thus agone,\n" +"He gan to look on them with eyen light*, *gentle, lenient*\n" +"And spake these same wordes *all on height.* *aloud*\n" +"\n" +"\"The god of love, ah! benedicite*, *bless ye him\n" +"How mighty and how great a lord is he!\n" +"Against his might there gaine* none obstacles, *avail, conquer\n" +"He may be called a god for his miracles\n" +"For he can maken at his owen guise\n" +"Of every heart, as that him list devise.\n" +"Lo here this Arcite, and this Palamon,\n" +"That quietly were out of my prison,\n" +"And might have lived in Thebes royally,\n" +"And weet* I am their mortal enemy, *knew\n" +"And that their death li'th in my might also,\n" +"And yet hath love, *maugre their eyen two*, *in spite of their eyes*\n" +"Y-brought them hither bothe for to die.\n" +"Now look ye, is not this an high folly?\n" +"Who may not be a fool, if but he love?\n" +"Behold, for Godde's sake that sits above,\n" +"See how they bleed! be they not well array'd?\n" +"Thus hath their lord, the god of love, them paid\n" +"Their wages and their fees for their service;\n" +"And yet they weene for to be full wise,\n" +"That serve love, for aught that may befall.\n" +"But this is yet the beste game* of all, *joke\n" +"That she, for whom they have this jealousy,\n" +"Can them therefor as muchel thank as me.\n" +"She wot no more of all this *hote fare*, *hot behaviour*\n" +"By God, than wot a cuckoo or an hare.\n" +"But all must be assayed hot or cold;\n" +"A man must be a fool, or young or old;\n" +"I wot it by myself *full yore agone*: *long years ago*\n" +"For in my time a servant was I one.\n" +"And therefore since I know of love's pain,\n" +"And wot how sore it can a man distrain*, *distress\n" +"As he that oft hath been caught in his last*, *snare <38>\n" +"I you forgive wholly this trespass,\n" +"At request of the queen that kneeleth here,\n" +"And eke of Emily, my sister dear.\n" +"And ye shall both anon unto me swear,\n" +"That never more ye shall my country dere* *injure\n" +"Nor make war upon me night nor day,\n" +"But be my friends in alle that ye may.\n" +"I you forgive this trespass *every deal*. *completely*\n" +"And they him sware *his asking* fair and well, *what he asked*\n" +"And him of lordship and of mercy pray'd,\n" +"And he them granted grace, and thus he said:\n" +"\n" +"\"To speak of royal lineage and richess,\n" +"Though that she were a queen or a princess,\n" +"Each of you both is worthy doubteless\n" +"To wedde when time is; but natheless\n" +"I speak as for my sister Emily,\n" +"For whom ye have this strife and jealousy,\n" +"Ye wot* yourselves, she may not wed the two *know\n" +"At once, although ye fight for evermo:\n" +"But one of you, *all be him loth or lief,* *whether or not he wishes*\n" +"He must *go pipe into an ivy leaf*: *\"go whistle\"*\n" +"This is to say, she may not have you both,\n" +"All be ye never so jealous, nor so wroth.\n" +"And therefore I you put in this degree,\n" +"That each of you shall have his destiny\n" +"As *him is shape*; and hearken in what wise *as is decreed for him*\n" +"Lo hear your end of that I shall devise.\n" +"My will is this, for plain conclusion\n" +"Withouten any replication*, *reply\n" +"If that you liketh, take it for the best,\n" +"That evereach of you shall go where *him lest*, *he pleases\n" +"Freely without ransom or danger;\n" +"And this day fifty weekes, *farre ne nerre*, *neither more nor less*\n" +"Evereach of you shall bring an hundred knights,\n" +"Armed for listes up at alle rights\n" +"All ready to darraine* her by bataille, *contend for\n" +"And this behete* I you withoute fail *promise\n" +"Upon my troth, and as I am a knight,\n" +"That whether of you bothe that hath might,\n" +"That is to say, that whether he or thou\n" +"May with his hundred, as I spake of now,\n" +"Slay his contrary, or out of listes drive,\n" +"Him shall I given Emily to wive,\n" +"To whom that fortune gives so fair a grace.\n" +"The listes shall I make here in this place.\n" +"*And God so wisly on my soule rue*, *may God as surely have\n" +"As I shall even judge be and true. mercy on my soul*\n" +"Ye shall none other ende with me maken\n" +"Than one of you shalle be dead or taken.\n" +"And if you thinketh this is well y-said,\n" +"Say your advice*, and hold yourselves apaid**. *opinion **satisfied\n" +"This is your end, and your conclusion.\"\n" +"Who looketh lightly now but Palamon?\n" +"Who springeth up for joye but Arcite?\n" +"Who could it tell, or who could it indite,\n" +"The joye that is maked in the place\n" +"When Theseus hath done so fair a grace?\n" +"But down on knees went every *manner wight*, *kind of person*\n" +"And thanked him with all their heartes' might,\n" +"And namely* these Thebans *ofte sithe*. *especially *oftentimes*\n" +"And thus with good hope and with hearte blithe\n" +"They take their leave, and homeward gan they ride\n" +"To Thebes-ward, with his old walles wide.\n" +"\n" +"I trow men woulde deem it negligence,\n" +"If I forgot to telle the dispence* *expenditure\n" +"Of Theseus, that went so busily\n" +"To maken up the listes royally,\n" +"That such a noble theatre as it was,\n" +"I dare well say, in all this world there n'as*. *was not\n" +"The circuit a mile was about,\n" +"Walled of stone, and ditched all without.\n" +"*Round was the shape, in manner of compass,\n" +"Full of degrees, the height of sixty pas* *see note <39>*\n" +"That when a man was set on one degree\n" +"He letted* not his fellow for to see. *hindered\n" +"Eastward there stood a gate of marble white,\n" +"Westward right such another opposite.\n" +"And, shortly to conclude, such a place\n" +"Was never on earth made in so little space,\n" +"For in the land there was no craftes-man,\n" +"That geometry or arsmetrike* can**, *arithmetic **knew\n" +"Nor pourtrayor*, nor carver of images, *portrait painter\n" +"That Theseus ne gave him meat and wages\n" +"The theatre to make and to devise.\n" +"And for to do his rite and sacrifice\n" +"He eastward hath upon the gate above,\n" +"In worship of Venus, goddess of love,\n" +"*Done make* an altar and an oratory; *caused to be made*\n" +"And westward, in the mind and in memory\n" +"Of Mars, he maked hath right such another,\n" +"That coste largely of gold a fother*. *a great amount\n" +"And northward, in a turret on the wall,\n" +"Of alabaster white and red coral\n" +"An oratory riche for to see,\n" +"In worship of Diane of chastity,\n" +"Hath Theseus done work in noble wise.\n" +"But yet had I forgotten to devise* *describe\n" +"The noble carving, and the portraitures,\n" +"The shape, the countenance of the figures\n" +"That weren in there oratories three.\n" +"\n" +"First in the temple of Venus may'st thou see\n" +"Wrought on the wall, full piteous to behold,\n" +"The broken sleepes, and the sikes* cold, *sighes\n" +"The sacred teares, and the waimentings*, *lamentings\n" +"The fiery strokes of the desirings,\n" +"That Love's servants in this life endure;\n" +"The oathes, that their covenants assure.\n" +"Pleasance and Hope, Desire, Foolhardiness,\n" +"Beauty and Youth, and Bawdry and Richess,\n" +"Charms and Sorc'ry, Leasings* and Flattery, *falsehoods\n" +"Dispence, Business, and Jealousy,\n" +"That wore of yellow goldes* a garland, *sunflowers <40>\n" +"And had a cuckoo sitting on her hand,\n" +"Feasts, instruments, and caroles and dances,\n" +"Lust and array, and all the circumstances\n" +"Of Love, which I reckon'd and reckon shall\n" +"In order, were painted on the wall,\n" +"And more than I can make of mention.\n" +"For soothly all the mount of Citheron,<41>\n" +"Where Venus hath her principal dwelling,\n" +"Was showed on the wall in pourtraying,\n" +"With all the garden, and the lustiness*. *pleasantness\n" +"Nor was forgot the porter Idleness,\n" +"Nor Narcissus the fair of *yore agone*, *olden times*\n" +"Nor yet the folly of King Solomon,\n" +"Nor yet the greate strength of Hercules,\n" +"Th' enchantments of Medea and Circes,\n" +"Nor of Turnus the hardy fierce courage,\n" +"The rich Croesus *caitif in servage.* <42> *abased into slavery*\n" +"Thus may ye see, that wisdom nor richess,\n" +"Beauty, nor sleight, nor strength, nor hardiness\n" +"Ne may with Venus holde champartie*, *divided possession <43>\n" +"For as her liste the world may she gie*. *guide\n" +"Lo, all these folk so caught were in her las* *snare\n" +"Till they for woe full often said, Alas!\n" +"Suffice these ensamples one or two,\n" +"Although I could reckon a thousand mo'.\n" +"\n" +"The statue of Venus, glorious to see\n" +"Was naked floating in the large sea,\n" +"And from the navel down all cover'd was\n" +"With waves green, and bright as any glass.\n" +"A citole <44> in her right hand hadde she,\n" +"And on her head, full seemly for to see,\n" +"A rose garland fresh, and well smelling,\n" +"Above her head her doves flickering\n" +"Before her stood her sone Cupido,\n" +"Upon his shoulders winges had he two;\n" +"And blind he was, as it is often seen;\n" +"A bow he bare, and arrows bright and keen.\n" +"\n" +"Why should I not as well eke tell you all\n" +"The portraiture, that was upon the wall\n" +"Within the temple of mighty Mars the Red?\n" +"All painted was the wall in length and brede* *breadth\n" +"Like to the estres* of the grisly place *interior chambers\n" +"That hight the great temple of Mars in Thrace,\n" +"In thilke* cold and frosty region, *that\n" +"There as Mars hath his sovereign mansion.\n" +"In which there dwelled neither man nor beast,\n" +"With knotty gnarry* barren trees old *gnarled\n" +"Of stubbes sharp and hideous to behold;\n" +"In which there ran a rumble and a sough*, *groaning noise\n" +"As though a storm should bursten every bough:\n" +"And downward from an hill under a bent* *slope\n" +"There stood the temple of Mars Armipotent,\n" +"Wrought all of burnish'd steel, of which th' entry\n" +"Was long and strait, and ghastly for to see.\n" +"And thereout came *a rage and such a vise*, *such a furious voice*\n" +"That it made all the gates for to rise.\n" +"The northern light in at the doore shone,\n" +"For window on the walle was there none\n" +"Through which men mighten any light discern.\n" +"The doors were all of adamant etern,\n" +"Y-clenched *overthwart and ende-long* *crossways and lengthways*\n" +"With iron tough, and, for to make it strong,\n" +"Every pillar the temple to sustain\n" +"Was tunne-great*, of iron bright and sheen. *thick as a tun (barrel)\n" +"There saw I first the dark imagining\n" +"Of felony, and all the compassing;\n" +"The cruel ire, as red as any glede*, *live coal\n" +"The picke-purse<45>, and eke the pale dread;\n" +"The smiler with the knife under the cloak,\n" +"The shepen* burning with the blacke smoke *stable <46>\n" +"The treason of the murd'ring in the bed,\n" +"The open war, with woundes all be-bled;\n" +"Conteke* with bloody knife, and sharp menace. *contention, discord\n" +"All full of chirking* was that sorry place. *creaking, jarring noise\n" +"The slayer of himself eke saw I there,\n" +"His hearte-blood had bathed all his hair:\n" +"The nail y-driven in the shode* at night, *hair of the head <47>\n" +"The colde death, with mouth gaping upright.\n" +"Amiddes of the temple sat Mischance,\n" +"With discomfort and sorry countenance;\n" +"Eke saw I Woodness* laughing in his rage, *Madness\n" +"Armed Complaint, Outhees*, and fierce Outrage; *Outcry\n" +"The carrain* in the bush, with throat y-corve**, *corpse **slashed\n" +"A thousand slain, and not *of qualm y-storve*; *dead of sickness*\n" +"The tyrant, with the prey by force y-reft;\n" +"The town destroy'd, that there was nothing left.\n" +"Yet saw I brent* the shippes hoppesteres, <48> *burnt\n" +"The hunter strangled with the wilde bears:\n" +"The sow freting* the child right in the cradle; *devouring <49>\n" +"The cook scalded, for all his longe ladle.\n" +"Nor was forgot, *by th'infortune of Mart* *through the misfortune\n" +"The carter overridden with his cart; of war*\n" +"Under the wheel full low he lay adown.\n" +"There were also of Mars' division,\n" +"The armourer, the bowyer*, and the smith, *maker of bows\n" +"That forgeth sharp swordes on his stith*. *anvil\n" +"And all above depainted in a tower\n" +"Saw I Conquest, sitting in great honour,\n" +"With thilke* sharpe sword over his head *that\n" +"Hanging by a subtle y-twined thread.\n" +"Painted the slaughter was of Julius<50>,\n" +"Of cruel Nero, and Antonius:\n" +"Although at that time they were yet unborn,\n" +"Yet was their death depainted there beforn,\n" +"By menacing of Mars, right by figure,\n" +"So was it showed in that portraiture,\n" +"As is depainted in the stars above,\n" +"Who shall be slain, or elles dead for love.\n" +"Sufficeth one ensample in stories old,\n" +"I may not reckon them all, though I wo'ld.\n" +"\n" +"The statue of Mars upon a carte* stood *chariot\n" +"Armed, and looked grim as he were wood*, *mad\n" +"And over his head there shone two figures\n" +"Of starres, that be cleped in scriptures,\n" +"That one Puella, that other Rubeus. <51>\n" +"This god of armes was arrayed thus:\n" +"A wolf there stood before him at his feet\n" +"With eyen red, and of a man he eat:\n" +"With subtle pencil painted was this story,\n" +"In redouting* of Mars and of his glory. *reverance, fear\n" +"\n" +"Now to the temple of Dian the chaste\n" +"As shortly as I can I will me haste,\n" +"To telle you all the descriptioun.\n" +"Depainted be the walles up and down\n" +"Of hunting and of shamefast chastity.\n" +"There saw I how woful Calistope,<52>\n" +"When that Dian aggrieved was with her,\n" +"Was turned from a woman to a bear,\n" +"And after was she made the lodestar*: *pole star\n" +"Thus was it painted, I can say no far*; *farther\n" +"Her son is eke a star as men may see.\n" +"There saw I Dane <53> turn'd into a tree,\n" +"I meane not the goddess Diane,\n" +"But Peneus' daughter, which that hight Dane.\n" +"There saw I Actaeon an hart y-maked*, *made\n" +"For vengeance that he saw Dian all naked:\n" +"I saw how that his houndes have him caught,\n" +"And freten* him, for that they knew him not. *devour\n" +"Yet painted was, a little farthermore\n" +"How Atalanta hunted the wild boar;\n" +"And Meleager, and many other mo',\n" +"For which Diana wrought them care and woe.\n" +"There saw I many another wondrous story,\n" +"The which me list not drawen to memory.\n" +"This goddess on an hart full high was set*, *seated\n" +"With smalle houndes all about her feet,\n" +"And underneath her feet she had a moon,\n" +"Waxing it was, and shoulde wane soon.\n" +"In gaudy green her statue clothed was,\n" +"With bow in hand, and arrows in a case*. *quiver\n" +"Her eyen caste she full low adown,\n" +"Where Pluto hath his darke regioun.\n" +"A woman travailing was her beforn,\n" +"But, for her child so longe was unborn,\n" +"Full piteously Lucina <54> gan she call,\n" +"And saide; \"Help, for thou may'st best of all.\"\n" +"Well could he painte lifelike that it wrought;\n" +"With many a florin he the hues had bought.\n" +"Now be these listes made, and Theseus,\n" +"That at his greate cost arrayed thus\n" +"The temples, and the theatre every deal*, *part <55>\n" +"When it was done, him liked wonder well.\n" +"\n" +"But stint* I will of Theseus a lite**, *cease speaking **little\n" +"And speak of Palamon and of Arcite.\n" +"The day approacheth of their returning,\n" +"That evereach an hundred knights should bring,\n" +"The battle to darraine* as I you told; *contest\n" +"And to Athens, their covenant to hold,\n" +"Hath ev'reach of them brought an hundred knights,\n" +"Well-armed for the war at alle rights.\n" +"And sickerly* there trowed** many a man, *surely <56> **believed\n" +"That never, sithen* that the world began, *since\n" +"For to speaken of knighthood of their hand,\n" +"As far as God hath maked sea and land,\n" +"Was, of so few, so noble a company.\n" +"For every wight that loved chivalry,\n" +"And would, *his thankes, have a passant name*, *thanks to his own\n" +"Had prayed, that he might be of that game, efforts, have a\n" +"And well was him, that thereto chosen was. surpassing name*\n" +"For if there fell to-morrow such a case,\n" +"Ye knowe well, that every lusty knight,\n" +"That loveth par amour, and hath his might\n" +"Were it in Engleland, or elleswhere,\n" +"They would, their thankes, willen to be there,\n" +"T' fight for a lady; Benedicite,\n" +"It were a lusty* sighte for to see. *pleasing\n" +"And right so fared they with Palamon;\n" +"With him there wente knightes many one.\n" +"Some will be armed in an habergeon,\n" +"And in a breast-plate, and in a gipon*; *short doublet.\n" +"And some will have *a pair of plates* large; *back and front armour*\n" +"And some will have a Prusse* shield, or targe; *Prussian\n" +"Some will be armed on their legges weel;\n" +"Some have an axe, and some a mace of steel.\n" +"There is no newe guise*, but it was old. *fashion\n" +"Armed they weren, as I have you told,\n" +"Evereach after his opinion.\n" +"There may'st thou see coming with Palamon\n" +"Licurgus himself, the great king of Thrace:\n" +"Black was his beard, and manly was his face.\n" +"The circles of his eyen in his head\n" +"They glowed betwixte yellow and red,\n" +"And like a griffin looked he about,\n" +"With kemped* haires on his browes stout; *combed<57>\n" +"His limbs were great, his brawns were hard and strong,\n" +"His shoulders broad, his armes round and long.\n" +"And as the guise* was in his country, *fashion\n" +"Full high upon a car of gold stood he,\n" +"With foure white bulles in the trace.\n" +"Instead of coat-armour on his harness,\n" +"With yellow nails, and bright as any gold,\n" +"He had a beare's skin, coal-black for old*. *age\n" +"His long hair was y-kempt behind his back,\n" +"As any raven's feather it shone for black.\n" +"A wreath of gold *arm-great*, of huge weight, *thick as a man's arm*\n" +"Upon his head sate, full of stones bright,\n" +"Of fine rubies and clear diamants.\n" +"About his car there wente white alauns*, *greyhounds <58>\n" +"Twenty and more, as great as any steer,\n" +"To hunt the lion or the wilde bear,\n" +"And follow'd him, with muzzle fast y-bound,\n" +"Collars of gold, and torettes* filed round. *rings\n" +"An hundred lordes had he in his rout* *retinue\n" +"Armed full well, with heartes stern and stout.\n" +"\n" +"With Arcita, in stories as men find,\n" +"The great Emetrius the king of Ind,\n" +"Upon a *steede bay* trapped in steel, *bay horse*\n" +"Cover'd with cloth of gold diapred* well, *decorated\n" +"Came riding like the god of armes, Mars.\n" +"His coat-armour was of *a cloth of Tars*, *a kind of silk*\n" +"Couched* with pearls white and round and great *trimmed\n" +"His saddle was of burnish'd gold new beat;\n" +"A mantelet on his shoulders hanging,\n" +"Bretful* of rubies red, as fire sparkling. *brimful\n" +"His crispe hair like ringes was y-run,\n" +"And that was yellow, glittering as the sun.\n" +"His nose was high, his eyen bright citrine*, *pale yellow\n" +"His lips were round, his colour was sanguine,\n" +"A fewe fracknes* in his face y-sprent**, *freckles **sprinkled\n" +"Betwixte yellow and black somedeal y-ment* *mixed <59>\n" +"And as a lion he *his looking cast* *cast about his eyes*\n" +"Of five and twenty year his age I cast* *reckon\n" +"His beard was well begunnen for to spring;\n" +"His voice was as a trumpet thundering.\n" +"Upon his head he wore of laurel green\n" +"A garland fresh and lusty to be seen;\n" +"Upon his hand he bare, for his delight,\n" +"An eagle tame, as any lily white.\n" +"An hundred lordes had he with him there,\n" +"All armed, save their heads, in all their gear,\n" +"Full richely in alle manner things.\n" +"For trust ye well, that earles, dukes, and kings\n" +"Were gather'd in this noble company,\n" +"For love, and for increase of chivalry.\n" +"About this king there ran on every part\n" +"Full many a tame lion and leopart.\n" +"And in this wise these lordes *all and some* *all and sundry*\n" +"Be on the Sunday to the city come\n" +"Aboute prime<60>, and in the town alight.\n" +"\n" +"This Theseus, this Duke, this worthy knight\n" +"When he had brought them into his city,\n" +"And inned* them, ev'reach at his degree, *lodged\n" +"He feasteth them, and doth so great labour\n" +"To *easen them*, and do them all honour, *make them comfortable*\n" +"That yet men weene* that no mannes wit *think\n" +"Of none estate could amenden* it. *improve\n" +"The minstrelsy, the service at the feast,\n" +"The greate giftes to the most and least,\n" +"The rich array of Theseus' palace,\n" +"Nor who sate first or last upon the dais.<61>\n" +"What ladies fairest be, or best dancing\n" +"Or which of them can carol best or sing,\n" +"Or who most feelingly speaketh of love;\n" +"What hawkes sitten on the perch above,\n" +"What houndes liggen* on the floor adown, *lie\n" +"Of all this now make I no mentioun\n" +"But of th'effect; that thinketh me the best\n" +"Now comes the point, and hearken if you lest.* *please\n" +"\n" +"The Sunday night, ere day began to spring,\n" +"When Palamon the larke hearde sing,\n" +"Although it were not day by houres two,\n" +"Yet sang the lark, and Palamon right tho* *then\n" +"With holy heart, and with an high courage,\n" +"Arose, to wenden* on his pilgrimage *go\n" +"Unto the blissful Cithera benign,\n" +"I meane Venus, honourable and digne*. *worthy\n" +"And in her hour <62> he walketh forth a pace\n" +"Unto the listes, where her temple was,\n" +"And down he kneeleth, and with humble cheer* *demeanour\n" +}; +const char knightsTale3[] PROGMEM= { +"And hearte sore, he said as ye shall hear.\n" +"\n" +"\"Fairest of fair, O lady mine Venus,\n" +"Daughter to Jove, and spouse of Vulcanus,\n" +"Thou gladder of the mount of Citheron!<41>\n" +"For thilke love thou haddest to Adon <63>\n" +"Have pity on my bitter teares smart,\n" +"And take mine humble prayer to thine heart.\n" +"Alas! I have no language to tell\n" +"Th'effecte, nor the torment of mine hell;\n" +"Mine hearte may mine harmes not betray;\n" +"I am so confused, that I cannot say.\n" +"But mercy, lady bright, that knowest well\n" +"My thought, and seest what harm that I feel.\n" +"Consider all this, and *rue upon* my sore, *take pity on*\n" +"As wisly* as I shall for evermore *truly\n" +"Enforce my might, thy true servant to be,\n" +"And holde war alway with chastity:\n" +"That make I mine avow*, so ye me help. *vow, promise\n" +"I keepe not of armes for to yelp,* *boast\n" +"Nor ask I not to-morrow to have victory,\n" +"Nor renown in this case, nor vaine glory\n" +"Of *prize of armes*, blowing up and down, *praise for valour*\n" +"But I would have fully possessioun\n" +"Of Emily, and die in her service;\n" +"Find thou the manner how, and in what wise.\n" +"I *recke not but* it may better be *do not know whether*\n" +"To have vict'ry of them, or they of me,\n" +"So that I have my lady in mine arms.\n" +"For though so be that Mars is god of arms,\n" +"Your virtue is so great in heaven above,\n" +"That, if you list, I shall well have my love.\n" +"Thy temple will I worship evermo',\n" +"And on thine altar, where I ride or go,\n" +"I will do sacrifice, and fires bete*. *make, kindle\n" +"And if ye will not so, my lady sweet,\n" +"Then pray I you, to-morrow with a spear\n" +"That Arcita me through the hearte bear\n" +"Then reck I not, when I have lost my life,\n" +"Though that Arcita win her to his wife.\n" +"This is th' effect and end of my prayere, --\n" +"Give me my love, thou blissful lady dear.\"\n" +"When th' orison was done of Palamon,\n" +"His sacrifice he did, and that anon,\n" +"Full piteously, with alle circumstances,\n" +"*All tell I not as now* his observances. *although I tell not now*\n" +"But at the last the statue of Venus shook,\n" +"And made a signe, whereby that he took\n" +"That his prayer accepted was that day.\n" +"For though the signe shewed a delay,\n" +"Yet wist he well that granted was his boon;\n" +"And with glad heart he went him home full soon.\n" +"\n" +"The third hour unequal <64> that Palamon\n" +"Began to Venus' temple for to gon,\n" +"Up rose the sun, and up rose Emily,\n" +"And to the temple of Dian gan hie.\n" +"Her maidens, that she thither with her lad*, *led\n" +"Th' incense, the clothes, and the remnant all\n" +"That to the sacrifice belonge shall,\n" +"The hornes full of mead, as was the guise;\n" +"There lacked nought to do her sacrifice.\n" +"Smoking* the temple full of clothes fair, *draping <65>\n" +"This Emily with hearte debonnair* *gentle\n" +"Her body wash'd with water of a well.\n" +"But how she did her rite I dare not tell;\n" +"But* it be any thing in general; *unless\n" +"And yet it were a game* to hearen all *pleasure\n" +"To him that meaneth well it were no charge:\n" +"But it is good a man to *be at large*. *do as he will*\n" +"Her bright hair combed was, untressed all.\n" +"A coronet of green oak cerriall <66>\n" +"Upon her head was set full fair and meet.\n" +"Two fires on the altar gan she bete,\n" +"And did her thinges, as men may behold\n" +"In Stace of Thebes <67>, and these bookes old.\n" +"When kindled was the fire, with piteous cheer\n" +"Unto Dian she spake as ye may hear.\n" +"\n" +"\"O chaste goddess of the woodes green,\n" +"To whom both heav'n and earth and sea is seen,\n" +"Queen of the realm of Pluto dark and low,\n" +"Goddess of maidens, that mine heart hast know\n" +"Full many a year, and wost* what I desire, *knowest\n" +"To keep me from the vengeance of thine ire,\n" +"That Actaeon aboughte* cruelly: *earned; suffered from\n" +"Chaste goddess, well wottest thou that I\n" +"Desire to be a maiden all my life,\n" +"Nor never will I be no love nor wife.\n" +"I am, thou wost*, yet of thy company, *knowest\n" +"A maid, and love hunting and venery*, *field sports\n" +"And for to walken in the woodes wild,\n" +"And not to be a wife, and be with child.\n" +"Nought will I know the company of man.\n" +"Now help me, lady, since ye may and can,\n" +"For those three formes <68> that thou hast in thee.\n" +"And Palamon, that hath such love to me,\n" +"And eke Arcite, that loveth me so sore,\n" +"This grace I pray thee withoute more,\n" +"As sende love and peace betwixt them two:\n" +"And from me turn away their heartes so,\n" +"That all their hote love, and their desire,\n" +"And all their busy torment, and their fire,\n" +"Be queint*, or turn'd into another place. *quenched\n" +"And if so be thou wilt do me no grace,\n" +"Or if my destiny be shapen so\n" +"That I shall needes have one of them two,\n" +"So send me him that most desireth me.\n" +"Behold, goddess of cleane chastity,\n" +"The bitter tears that on my cheekes fall.\n" +"Since thou art maid, and keeper of us all,\n" +"My maidenhead thou keep and well conserve,\n" +"And, while I live, a maid I will thee serve.\n" +"\n" +"The fires burn upon the altar clear,\n" +"While Emily was thus in her prayere:\n" +"But suddenly she saw a sighte quaint*. *strange\n" +"For right anon one of the fire's *queint\n" +"And quick'd* again, and after that anon *went out and revived*\n" +"That other fire was queint, and all agone:\n" +"And as it queint, it made a whisteling,\n" +"As doth a brande wet in its burning.\n" +"And at the brandes end outran anon\n" +"As it were bloody droppes many one:\n" +"For which so sore aghast was Emily,\n" +"That she was well-nigh mad, and gan to cry,\n" +"For she ne wiste what it signified;\n" +"But onely for feare thus she cried,\n" +"And wept, that it was pity for to hear.\n" +"And therewithal Diana gan appear\n" +"With bow in hand, right as an hunteress,\n" +"And saide; \"Daughter, stint* thine heaviness. *cease\n" +"Among the goddes high it is affirm'd,\n" +"And by eternal word writ and confirm'd,\n" +"Thou shalt be wedded unto one of tho* *those\n" +"That have for thee so muche care and woe:\n" +"But unto which of them I may not tell.\n" +"Farewell, for here I may no longer dwell.\n" +"The fires which that on mine altar brenn*, *burn\n" +"Shall thee declaren, ere that thou go henne*, *hence\n" +"Thine aventure of love, as in this case.\"\n" +"And with that word, the arrows in the case* *quiver\n" +"Of the goddess did clatter fast and ring,\n" +"And forth she went, and made a vanishing,\n" +"For which this Emily astonied was,\n" +"And saide; \"What amounteth this, alas!\n" +"I put me under thy protection,\n" +"Diane, and in thy disposition.\"\n" +"And home she went anon the nexte* way. *nearest\n" +"This is th' effect, there is no more to say.\n" +"\n" +"The nexte hour of Mars following this\n" +"Arcite to the temple walked is\n" +"Of fierce Mars, to do his sacrifice\n" +"With all the rites of his pagan guise.\n" +"With piteous* heart and high devotion *pious\n" +"Right thus to Mars he said his orison\n" +"\"O stronge god, that in the regnes* old *realms\n" +"Of Thrace honoured art, and lord y-hold* *held\n" +"And hast in every regne, and every land\n" +"Of armes all the bridle in thine hand,\n" +"And *them fortunest as thee list devise*, *send them fortune\n" +"Accept of me my piteous sacrifice. as you please*\n" +"If so be that my youthe may deserve,\n" +"And that my might be worthy for to serve\n" +"Thy godhead, that I may be one of thine,\n" +"Then pray I thee to *rue upon my pine*, *pity my anguish*\n" +"For thilke* pain, and thilke hote fire, *that\n" +"In which thou whilom burned'st for desire\n" +"Whenne that thou usedest* the beauty *enjoyed\n" +"Of faire young Venus, fresh and free,\n" +"And haddest her in armes at thy will:\n" +"And though thee ones on a time misfill*, *were unlucky\n" +"When Vulcanus had caught thee in his las*, *net <69>\n" +"And found thee ligging* by his wife, alas! *lying\n" +"For thilke sorrow that was in thine heart,\n" +"Have ruth* as well upon my paine's smart. *pity\n" +"I am young and unconning*, as thou know'st, *ignorant, simple\n" +"And, as I trow*, with love offended most *believe\n" +"That e'er was any living creature:\n" +"For she, that doth* me all this woe endure, *causes\n" +"Ne recketh ne'er whether I sink or fleet* *swim\n" +"And well I wot, ere she me mercy hete*, *promise, vouchsafe\n" +"I must with strengthe win her in the place:\n" +"And well I wot, withoute help or grace\n" +"Of thee, ne may my strengthe not avail:\n" +"Then help me, lord, to-morr'w in my bataille,\n" +"For thilke fire that whilom burned thee,\n" +"As well as this fire that now burneth me;\n" +"And do* that I to-morr'w may have victory. *cause\n" +"Mine be the travail, all thine be the glory.\n" +"Thy sovereign temple will I most honour\n" +"Of any place, and alway most labour\n" +"In thy pleasance and in thy craftes strong.\n" +"And in thy temple I will my banner hong*, *hang\n" +"And all the armes of my company,\n" +"And evermore, until that day I die,\n" +"Eternal fire I will before thee find\n" +"And eke to this my vow I will me bind:\n" +"My beard, my hair that hangeth long adown,\n" +"That never yet hath felt offension* *indignity\n" +"Of razor nor of shears, I will thee give,\n" +"And be thy true servant while I live.\n" +"Now, lord, have ruth upon my sorrows sore,\n" +"Give me the victory, I ask no more.\"\n" +"\n" +"The prayer stint* of Arcita the strong, *ended\n" +"The ringes on the temple door that hong,\n" +"And eke the doores, clattered full fast,\n" +"Of which Arcita somewhat was aghast.\n" +"The fires burn'd upon the altar bright,\n" +"That it gan all the temple for to light;\n" +"A sweete smell anon the ground up gaf*, *gave\n" +"And Arcita anon his hand up haf*, *lifted\n" +"And more incense into the fire he cast,\n" +"With other rites more and at the last\n" +"The statue of Mars began his hauberk ring;\n" +"And with that sound he heard a murmuring\n" +"Full low and dim, that saide thus, \"Victory.\"\n" +"For which he gave to Mars honour and glory.\n" +"And thus with joy, and hope well to fare,\n" +"Arcite anon unto his inn doth fare.\n" +"As fain* as fowl is of the brighte sun. *glad\n" +"\n" +"And right anon such strife there is begun\n" +"For thilke* granting, in the heav'n above, *that\n" +"Betwixte Venus the goddess of love,\n" +"And Mars the sterne god armipotent,\n" +"That Jupiter was busy it to stent*: *stop\n" +"Till that the pale Saturnus the cold,<70>\n" +"That knew so many of adventures old,\n" +"Found in his old experience such an art,\n" +"That he full soon hath pleased every part.\n" +"As sooth is said, eld* hath great advantage, *age\n" +"In eld is bothe wisdom and usage*: *experience\n" +"Men may the old out-run, but not out-rede*. *outwit\n" +"Saturn anon, to stint the strife and drede,\n" +"Albeit that it is against his kind,* *nature\n" +"Of all this strife gan a remedy find.\n" +"\"My deare daughter Venus,\" quoth Saturn,\n" +"\"My course*, that hath so wide for to turn, *orbit <71>\n" +"Hath more power than wot any man.\n" +"Mine is the drowning in the sea so wan;\n" +"Mine is the prison in the darke cote*, *cell\n" +"Mine the strangling and hanging by the throat,\n" +"The murmur, and the churlish rebelling,\n" +"The groyning*, and the privy poisoning. *discontent\n" +"I do vengeance and plein* correction, *full\n" +"I dwell in the sign of the lion.\n" +"Mine is the ruin of the highe halls,\n" +"The falling of the towers and the walls\n" +"Upon the miner or the carpenter:\n" +"I slew Samson in shaking the pillar:\n" +"Mine also be the maladies cold,\n" +"The darke treasons, and the castes* old: *plots\n" +"My looking is the father of pestilence.\n" +"Now weep no more, I shall do diligence\n" +"That Palamon, that is thine owen knight,\n" +"Shall have his lady, as thou hast him hight*. *promised\n" +"Though Mars shall help his knight, yet natheless\n" +"Betwixte you there must sometime be peace:\n" +"All be ye not of one complexion,\n" +"That each day causeth such division,\n" +"I am thine ayel*, ready at thy will; *grandfather <72>\n" +"Weep now no more, I shall thy lust* fulfil.\" *pleasure\n" +"Now will I stenten* of the gods above, *cease speaking\n" +"Of Mars, and of Venus, goddess of love,\n" +"And telle you as plainly as I can\n" +"The great effect, for which that I began.\n" +"\n" +"Great was the feast in Athens thilke* day; *that\n" +"And eke the lusty season of that May\n" +"Made every wight to be in such pleasance,\n" +"That all that Monday jousten they and dance,\n" +"And spenden it in Venus' high service.\n" +"But by the cause that they shoulde rise\n" +"Early a-morrow for to see that fight,\n" +"Unto their reste wente they at night.\n" +"And on the morrow, when the day gan spring,\n" +"Of horse and harness* noise and clattering *armour\n" +"There was in the hostelries all about:\n" +"And to the palace rode there many a rout* *train, retinue\n" +"Of lordes, upon steedes and palfreys.\n" +"There mayst thou see devising* of harness *decoration\n" +"So uncouth* and so rich, and wrought so weel *unkown, rare\n" +"Of goldsmithry, of brouding*, and of steel; *embroidery\n" +"The shieldes bright, the testers*, and trappures** *helmets<73>\n" +"Gold-hewen helmets, hauberks, coat-armures; **trappings\n" +"Lordes in parements* on their coursers, *ornamental garb <74>;\n" +"Knightes of retinue, and eke squiers,\n" +"Nailing the spears, and helmes buckeling,\n" +"Gniding* of shieldes, with lainers** lacing; *polishing <75>\n" +"There as need is, they were nothing idle: **lanyards\n" +"The foamy steeds upon the golden bridle\n" +"Gnawing, and fast the armourers also\n" +"With file and hammer pricking to and fro;\n" +"Yeomen on foot, and knaves* many one *servants\n" +"With shorte staves, thick* as they may gon**; *close **walk\n" +"Pipes, trumpets, nakeres*, and clariouns, *drums <76>\n" +"That in the battle blowe bloody souns;\n" +"The palace full of people up and down,\n" +"There three, there ten, holding their questioun*, *conversation\n" +"Divining* of these Theban knightes two. *conjecturing\n" +"Some saiden thus, some said it shall he so;\n" +"Some helden with him with the blacke beard,\n" +"Some with the bald, some with the thick-hair'd;\n" +"Some said he looked grim, and woulde fight:\n" +"He had a sparth* of twenty pound of weight. *double-headed axe\n" +"Thus was the halle full of divining* *conjecturing\n" +"Long after that the sunne gan up spring.\n" +"The great Theseus that of his sleep is waked\n" +"With minstrelsy, and noise that was maked,\n" +"Held yet the chamber of his palace rich,\n" +"Till that the Theban knightes both y-lich* *alike\n" +"Honoured were, and to the palace fet*. *fetched\n" +"Duke Theseus is at a window set,\n" +"Array'd right as he were a god in throne:\n" +"The people presseth thitherward full soon\n" +"Him for to see, and do him reverence,\n" +"And eke to hearken his hest* and his sentence**. *command **speech\n" +"An herald on a scaffold made an O, <77>\n" +"Till the noise of the people was y-do*: *done\n" +"And when he saw the people of noise all still,\n" +"Thus shewed he the mighty Duke's will.\n" +"\"The lord hath of his high discretion\n" +"Considered that it were destruction\n" +"To gentle blood, to fighten in the guise\n" +"Of mortal battle now in this emprise:\n" +"Wherefore to shape* that they shall not die, *arrange, contrive\n" +"He will his firste purpose modify.\n" +"No man therefore, on pain of loss of life,\n" +"No manner* shot, nor poleaxe, nor short knife *kind of\n" +"Into the lists shall send, or thither bring.\n" +"Nor short sword for to stick with point biting\n" +"No man shall draw, nor bear it by his side.\n" +"And no man shall unto his fellow ride\n" +"But one course, with a sharp y-grounden spear:\n" +"*Foin if him list on foot, himself to wear. *He who wishes can\n" +"And he that is at mischief shall be take*, fence on foot to defend\n" +"And not slain, but be brought unto the stake, himself, and he that\n" +"That shall be ordained on either side; is in peril shall be taken*\n" +"Thither he shall by force, and there abide.\n" +"And if *so fall* the chiefetain be take *should happen*\n" +"On either side, or elles slay his make*, *equal, match\n" +"No longer then the tourneying shall last.\n" +"God speede you; go forth and lay on fast.\n" +"With long sword and with mace fight your fill.\n" +"Go now your way; this is the lordes will.\n" +"The voice of the people touched the heaven,\n" +"So loude cried they with merry steven*: *sound\n" +"God save such a lord that is so good,\n" +"He willeth no destruction of blood.\n" +"\n" +"Up go the trumpets and the melody,\n" +"And to the listes rode the company\n" +"*By ordinance*, throughout the city large, *in orderly array*\n" +"Hanged with cloth of gold, and not with sarge*. *serge <78>\n" +"Full like a lord this noble Duke gan ride,\n" +"And these two Thebans upon either side:\n" +"\n" +"And after rode the queen and Emily,\n" +"And after them another company\n" +"Of one and other, after their degree.\n" +"And thus they passed thorough that city\n" +"And to the listes came they by time:\n" +"It was not of the day yet fully prime*. *between 6 & 9 a.m.\n" +"When set was Theseus full rich and high,\n" +"Hippolyta the queen and Emily,\n" +"And other ladies in their degrees about,\n" +"Unto the seates presseth all the rout.\n" +"And westward, through the gates under Mart,\n" +"Arcite, and eke the hundred of his part,\n" +"With banner red, is enter'd right anon;\n" +"And in the selve* moment Palamon *self-same\n" +"Is, under Venus, eastward in the place,\n" +"With banner white, and hardy cheer* and face *expression\n" +"In all the world, to seeken up and down\n" +"So even* without variatioun *equal\n" +"There were such companies never tway.\n" +"For there was none so wise that coulde say\n" +"That any had of other avantage\n" +"Of worthiness, nor of estate, nor age,\n" +"So even were they chosen for to guess.\n" +"And *in two ranges faire they them dress*. *they arranged themselves\n" +"When that their names read were every one, in two rows*\n" +"That in their number guile* were there none, *fraud\n" +"Then were the gates shut, and cried was loud;\n" +"\"Do now your devoir, younge knights proud\n" +"The heralds left their pricking* up and down *spurring their horses\n" +"Now ring the trumpet loud and clarioun.\n" +"There is no more to say, but east and west\n" +"In go the speares sadly* in the rest; *steadily\n" +"In go the sharpe spurs into the side.\n" +"There see me who can joust, and who can ride.\n" +"There shiver shaftes upon shieldes thick;\n" +"He feeleth through the hearte-spoon<79> the prick.\n" +"Up spring the speares twenty foot on height;\n" +"Out go the swordes as the silver bright.\n" +"The helmes they to-hewen, and to-shred*; *strike in pieces <80>\n" +"Out burst the blood, with sterne streames red.\n" +"With mighty maces the bones they to-brest*. *burst\n" +"He <81> through the thickest of the throng gan threst*. *thrust\n" +"There stumble steedes strong, and down go all.\n" +"He rolleth under foot as doth a ball.\n" +"He foineth* on his foe with a trunchoun, *forces himself\n" +"And he him hurtleth with his horse adown.\n" +"He through the body hurt is, and *sith take*, *afterwards captured*\n" +"Maugre his head, and brought unto the stake,\n" +"As forword* was, right there he must abide. *covenant\n" +"Another led is on that other side.\n" +"And sometime doth* them Theseus to rest, *caused\n" +"Them to refresh, and drinken if them lest*. *pleased\n" +"Full oft a day have thilke Thebans two *these\n" +"Together met and wrought each other woe:\n" +"Unhorsed hath each other of them tway* *twice\n" +"There is no tiger in the vale of Galaphay, <82>\n" +"When that her whelp is stole, when it is lite* *little\n" +"So cruel on the hunter, as Arcite\n" +"For jealous heart upon this Palamon:\n" +"Nor in Belmarie <83> there is no fell lion,\n" +"That hunted is, or for his hunger wood* *mad\n" +"Or for his prey desireth so the blood,\n" +"As Palamon to slay his foe Arcite.\n" +"The jealous strokes upon their helmets bite;\n" +"Out runneth blood on both their sides red,\n" +"Sometime an end there is of every deed\n" +"For ere the sun unto the reste went,\n" +"The stronge king Emetrius gan hent* *sieze, assail\n" +"This Palamon, as he fought with Arcite,\n" +"And made his sword deep in his flesh to bite,\n" +"And by the force of twenty is he take,\n" +"Unyielding, and is drawn unto the stake.\n" +"And in the rescue of this Palamon\n" +"The stronge king Licurgus is borne down:\n" +"And king Emetrius, for all his strength\n" +"Is borne out of his saddle a sword's length,\n" +"So hit him Palamon ere he were take:\n" +"But all for nought; he was brought to the stake:\n" +"His hardy hearte might him helpe naught,\n" +"He must abide when that he was caught,\n" +"By force, and eke by composition*. *the bargain\n" +"Who sorroweth now but woful Palamon\n" +"That must no more go again to fight?\n" +"And when that Theseus had seen that sight\n" +"Unto the folk that foughte thus each one,\n" +"He cried, Ho! no more, for it is done!\n" +"I will be true judge, and not party.\n" +"Arcite of Thebes shall have Emily,\n" +"That by his fortune hath her fairly won.\"\n" +"Anon there is a noise of people gone,\n" +"For joy of this, so loud and high withal,\n" +"It seemed that the listes shoulde fall.\n" +"\n" +"What can now faire Venus do above?\n" +"What saith she now? what doth this queen of love?\n" +"But weepeth so, for wanting of her will,\n" +"Till that her teares in the listes fill* *fall\n" +"She said: \"I am ashamed doubteless.\"\n" +"Saturnus saide: \"Daughter, hold thy peace.\n" +"Mars hath his will, his knight hath all his boon,\n" +"And by mine head thou shalt be eased soon.\"\n" +" The trumpeters with the loud minstrelsy,\n" +"The heralds, that full loude yell and cry,\n" +"Be in their joy for weal of Dan* Arcite. *Lord\n" +"But hearken me, and stinte noise a lite,\n" +"What a miracle there befell anon\n" +"This fierce Arcite hath off his helm y-done,\n" +"And on a courser for to shew his face\n" +"He *pricketh endelong* the large place, *rides from end to end*\n" +"Looking upward upon this Emily;\n" +"And she again him cast a friendly eye\n" +"(For women, as to speaken *in commune*, *generally*\n" +"They follow all the favour of fortune),\n" +"And was all his in cheer*, as his in heart. *countenance\n" +"Out of the ground a fire infernal start,\n" +"From Pluto sent, at request of Saturn\n" +"For which his horse for fear began to turn,\n" +"And leap aside, and founder* as he leap *stumble\n" +"And ere that Arcite may take any keep*, *care\n" +"He pight* him on the pummel** of his head. *pitched **top\n" +"That in the place he lay as he were dead.\n" +"His breast to-bursten with his saddle-bow.\n" +"As black he lay as any coal or crow,\n" +"So was the blood y-run into his face.\n" +"Anon he was y-borne out of the place\n" +"With hearte sore, to Theseus' palace.\n" +"Then was he carven* out of his harness. *cut\n" +"And in a bed y-brought full fair and blive* *quickly\n" +"For he was yet in mem'ry and alive,\n" +"And always crying after Emily.\n" +"\n" +"Duke Theseus, with all his company,\n" +"Is come home to Athens his city,\n" +"With alle bliss and great solemnity.\n" +"Albeit that this aventure was fall*, *befallen\n" +"He woulde not discomforte* them all *discourage\n" +"Then said eke, that Arcite should not die,\n" +"He should be healed of his malady.\n" +"And of another thing they were as fain*. *glad\n" +"That of them alle was there no one slain,\n" +"All* were they sorely hurt, and namely** one, *although **especially\n" +"That with a spear was thirled* his breast-bone. *pierced\n" +"To other woundes, and to broken arms,\n" +"Some hadden salves, and some hadden charms:\n" +"And pharmacies of herbs, and eke save* *sage, Salvia officinalis\n" +"They dranken, for they would their lives have.\n" +"For which this noble Duke, as he well can,\n" +"Comforteth and honoureth every man,\n" +"And made revel all the longe night,\n" +"Unto the strange lordes, as was right.\n" +"Nor there was holden no discomforting,\n" +"But as at jousts or at a tourneying;\n" +"For soothly there was no discomfiture,\n" +"For falling is not but an aventure*. *chance, accident\n" +"Nor to be led by force unto a stake\n" +"Unyielding, and with twenty knights y-take\n" +"One person all alone, withouten mo',\n" +"And harried* forth by armes, foot, and toe, *dragged, hurried\n" +"And eke his steede driven forth with staves,\n" +"With footmen, bothe yeomen and eke knaves*, *servants\n" +"It was *aretted him no villainy:* *counted no disgrace to him*\n" +"There may no man *clepen it cowardy*. *call it cowardice*\n" +"For which anon Duke Theseus *let cry*, -- *caused to be proclaimed*\n" +"To stenten* alle rancour and envy, -- *stop\n" +"The gree* as well on one side as the other, *prize, merit\n" +"And either side alike as other's brother:\n" +"And gave them giftes after their degree,\n" +"And held a feaste fully dayes three:\n" +"And conveyed the kinges worthily\n" +"Out of his town a journee* largely *day's journey\n" +"And home went every man the righte way,\n" +"There was no more but \"Farewell, Have good day.\"\n" +"Of this bataille I will no more indite\n" +"But speak of Palamon and of Arcite.\n" +"\n" +"Swelleth the breast of Arcite and the sore\n" +"Increaseth at his hearte more and more.\n" +"The clotted blood, for any leache-craft* *surgical skill\n" +"Corrupteth and is *in his bouk y-laft* *left in his body*\n" +"That neither *veine blood nor ventousing*, *blood-letting or cupping*\n" +"Nor drink of herbes may be his helping.\n" +"The virtue expulsive or animal,\n" +"From thilke virtue called natural,\n" +"Nor may the venom voide, nor expel\n" +"The pipes of his lungs began to swell\n" +"And every lacert* in his breast adown *sinew, muscle\n" +"Is shent* with venom and corruption. *destroyed\n" +"Him gaineth* neither, for to get his life, *availeth\n" +"Vomit upward, nor downward laxative;\n" +"All is to-bursten thilke region;\n" +"Nature hath now no domination.\n" +"And certainly where nature will not wirch,* *work\n" +"Farewell physic: go bear the man to chirch.* *church\n" +"This all and some is, Arcite must die.\n" +"For which he sendeth after Emily,\n" +"And Palamon, that was his cousin dear,\n" +"Then said he thus, as ye shall after hear.\n" +"\n" +"\"Nought may the woful spirit in mine heart\n" +"Declare one point of all my sorrows' smart\n" +"To you, my lady, that I love the most:\n" +"But I bequeath the service of my ghost\n" +"To you aboven every creature,\n" +"Since that my life ne may no longer dure.\n" +"Alas the woe! alas, the paines strong\n" +"That I for you have suffered and so long!\n" +"Alas the death, alas, mine Emily!\n" +"Alas departing* of our company! *the severance\n" +"Alas, mine hearte's queen! alas, my wife!\n" +"Mine hearte's lady, ender of my life!\n" +"What is this world? what aske men to have?\n" +"Now with his love, now in his colde grave\n" +"Al one, withouten any company.\n" +"Farewell, my sweet, farewell, mine Emily,\n" +"And softly take me in your armes tway,\n" +"For love of God, and hearken what I say.\n" +"I have here with my cousin Palamon\n" +"Had strife and rancour many a day agone,\n" +"For love of you, and for my jealousy.\n" +"And Jupiter so *wis my soule gie*, *surely guides my soul*\n" +"To speaken of a servant properly,\n" +"With alle circumstances truely,\n" +"That is to say, truth, honour, and knighthead,\n" +"Wisdom, humbless*, estate, and high kindred, *humility\n" +"Freedom, and all that longeth to that art,\n" +"So Jupiter have of my soul part,\n" +"As in this world right now I know not one,\n" +"So worthy to be lov'd as Palamon,\n" +"That serveth you, and will do all his life.\n" +"And if that you shall ever be a wife,\n" +"Forget not Palamon, the gentle man.\"\n" +"\n" +"And with that word his speech to fail began.\n" +"For from his feet up to his breast was come\n" +"The cold of death, that had him overnome*. *overcome\n" +"And yet moreover in his armes two\n" +"The vital strength is lost, and all ago*. *gone\n" +"Only the intellect, withoute more,\n" +"That dwelled in his hearte sick and sore,\n" +"Gan faile, when the hearte felte death;\n" +"Dusked* his eyen two, and fail'd his breath. *grew dim\n" +"But on his lady yet he cast his eye;\n" +"His laste word was; \"Mercy, Emily!\"\n" +"His spirit changed house, and wente there,\n" +"As I came never I cannot telle where.<84>\n" +"Therefore I stent*, I am no divinister**; *refrain **diviner\n" +"Of soules find I nought in this register.\n" +"Ne me list not th' opinions to tell\n" +"Of them, though that they writen where they dwell;\n" +"Arcite is cold, there Mars his soule gie.* *guide\n" +"Now will I speake forth of Emily.\n" +"\n" +"Shriek'd Emily, and howled Palamon,\n" +"And Theseus his sister took anon\n" +"Swooning, and bare her from the corpse away.\n" +"What helpeth it to tarry forth the day,\n" +"To telle how she wept both eve and morrow?\n" +"For in such cases women have such sorrow,\n" +"When that their husbands be from them y-go*, *gone\n" +"That for the more part they sorrow so,\n" +"Or elles fall into such malady,\n" +"That at the laste certainly they die.\n" +"Infinite be the sorrows and the tears\n" +"Of olde folk, and folk of tender years,\n" +"In all the town, for death of this Theban:\n" +"For him there weepeth bothe child and man.\n" +"So great a weeping was there none certain,\n" +"When Hector was y-brought, all fresh y-slain,\n" +"To Troy: alas! the pity that was there,\n" +"Scratching of cheeks, and rending eke of hair.\n" +"\"Why wouldest thou be dead?\" these women cry,\n" +"\"And haddest gold enough, and Emily.\"\n" +"No manner man might gladden Theseus,\n" +"Saving his olde father Egeus,\n" +"That knew this worlde's transmutatioun,\n" +"As he had seen it changen up and down,\n" +"Joy after woe, and woe after gladness;\n" +"And shewed him example and likeness.\n" +"\"Right as there died never man,\" quoth he,\n" +"\"That he ne liv'd in earth in some degree*, *rank, condition\n" +"Right so there lived never man,\" he said,\n" +"\"In all this world, that sometime be not died.\n" +"This world is but a throughfare full of woe,\n" +"And we be pilgrims, passing to and fro:\n" +"Death is an end of every worldly sore.\"\n" +"And over all this said he yet much more\n" +"To this effect, full wisely to exhort\n" +"The people, that they should them recomfort.\n" +"Duke Theseus, with all his busy cure*, *care\n" +"*Casteth about*, where that the sepulture *deliberates*\n" +"Of good Arcite may best y-maked be,\n" +"And eke most honourable in his degree.\n" +"And at the last he took conclusion,\n" +"That there as first Arcite and Palamon\n" +"Hadde for love the battle them between,\n" +"That in that selve* grove, sweet and green, *self-same\n" +"There as he had his amorous desires,\n" +"His complaint, and for love his hote fires,\n" +"He woulde make a fire*, in which th' office *funeral pyre\n" +"Of funeral he might all accomplice;\n" +"And *let anon command* to hack and hew *immediately gave orders*\n" +"The oakes old, and lay them *on a rew* *in a row*\n" +"In culpons*, well arrayed for to brenne**. *logs **burn\n" +"His officers with swifte feet they renne* *run\n" +"And ride anon at his commandement.\n" +"And after this, Duke Theseus hath sent\n" +"After a bier, and it all oversprad\n" +"With cloth of gold, the richest that he had;\n" +"And of the same suit he clad Arcite.\n" +"Upon his handes were his gloves white,\n" +"Eke on his head a crown of laurel green,\n" +"And in his hand a sword full bright and keen.\n" +"He laid him *bare the visage* on the bier, *with face uncovered*\n" +"Therewith he wept, that pity was to hear.\n" +"And, for the people shoulde see him all,\n" +"When it was day he brought them to the hall,\n" +"That roareth of the crying and the soun'.\n" +"Then came this woful Theban, Palamon,\n" +"With sluttery beard, and ruggy ashy hairs,<85>\n" +"In clothes black, y-dropped all with tears,\n" +"And (passing over weeping Emily)\n" +"The ruefullest of all the company.\n" +"And *inasmuch as* the service should be *in order that*\n" +"The more noble and rich in its degree,\n" +"Duke Theseus let forth three steedes bring,\n" +"That trapped were in steel all glittering.\n" +"And covered with the arms of Dan Arcite.\n" +"Upon these steedes, that were great and white,\n" +"There satte folk, of whom one bare his shield,\n" +"Another his spear in his handes held;\n" +}; +const char knightsTale4[] PROGMEM= { +"The thirde bare with him his bow Turkeis*, *Turkish.\n" +"Of brent* gold was the case** and the harness: *burnished **quiver\n" +"And ride forth *a pace* with sorrowful cheer** *at a foot pace*\n" +"Toward the grove, as ye shall after hear. **expression\n" +"\n" +"The noblest of the Greekes that there were\n" +"Upon their shoulders carried the bier,\n" +"With slacke pace, and eyen red and wet,\n" +"Throughout the city, by the master* street, *main <86>\n" +"That spread was all with black, and wondrous high\n" +"Right of the same is all the street y-wrie.* *covered <87>\n" +"Upon the right hand went old Egeus,\n" +"And on the other side Duke Theseus,\n" +"With vessels in their hand of gold full fine,\n" +"All full of honey, milk, and blood, and wine;\n" +"Eke Palamon, with a great company;\n" +"And after that came woful Emily,\n" +"With fire in hand, as was that time the guise*, *custom\n" +"To do th' office of funeral service.\n" +"\n" +"High labour, and full great appareling* *preparation\n" +"Was at the service, and the pyre-making,\n" +"That with its greene top the heaven raught*, *reached\n" +"And twenty fathom broad its armes straught*: *stretched\n" +"This is to say, the boughes were so broad.\n" +"Of straw first there was laid many a load.\n" +"But how the pyre was maked up on height,\n" +"And eke the names how the trees hight*, *were called\n" +"As oak, fir, birch, asp*, alder, holm, poplere, *aspen\n" +"Willow, elm, plane, ash, box, chestnut, lind*, laurere, *linden, lime\n" +"Maple, thorn, beech, hazel, yew, whipul tree,\n" +"How they were fell'd, shall not be told for me;\n" +"Nor how the goddes* rannen up and down *the forest deities\n" +"Disinherited of their habitatioun,\n" +"In which they wonned* had in rest and peace, *dwelt\n" +"Nymphes, Faunes, and Hamadryades;\n" +"Nor how the beastes and the birdes all\n" +"Fledden for feare, when the wood gan fall;\n" +"Nor how the ground aghast* was of the light, *terrified\n" +"That was not wont to see the sunne bright;\n" +"Nor how the fire was couched* first with stre**, *laid **straw\n" +"And then with dry stickes cloven in three,\n" +"And then with greene wood and spicery*, *spices\n" +"And then with cloth of gold and with pierrie*, *precious stones\n" +"And garlands hanging with full many a flower,\n" +"The myrrh, the incense with so sweet odour;\n" +"Nor how Arcita lay among all this,\n" +"Nor what richess about his body is;\n" +"Nor how that Emily, as was the guise*, *custom\n" +"*Put in the fire* of funeral service<88>; *appplied the torch*\n" +"Nor how she swooned when she made the fire,\n" +"Nor what she spake, nor what was her desire;\n" +"Nor what jewels men in the fire then cast\n" +"When that the fire was great and burned fast;\n" +"\n" +"Nor how some cast their shield, and some their spear,\n" +"And of their vestiments, which that they wear,\n" +"And cuppes full of wine, and milk, and blood,\n" +"Into the fire, that burnt as it were wood*; *mad\n" +"Nor how the Greekes with a huge rout* *procession\n" +"Three times riden all the fire about <89>\n" +"Upon the left hand, with a loud shouting,\n" +"And thries with their speares clattering;\n" +"And thries how the ladies gan to cry;\n" +"Nor how that led was homeward Emily;\n" +"Nor how Arcite is burnt to ashes cold;\n" +"Nor how the lyke-wake* was y-hold *wake <90>\n" +"All thilke* night, nor how the Greekes play *that\n" +"The wake-plays*, ne keep** I not to say: *funeral games **care\n" +"Who wrestled best naked, with oil anoint,\n" +"Nor who that bare him best *in no disjoint*. *in any contest*\n" +"I will not tell eke how they all are gone\n" +"Home to Athenes when the play is done;\n" +"But shortly to the point now will I wend*, *come\n" +"And maken of my longe tale an end.\n" +"\n" +"By process and by length of certain years\n" +"All stinted* is the mourning and the tears *ended\n" +"Of Greekes, by one general assent.\n" +"Then seemed me there was a parlement\n" +"At Athens, upon certain points and cas*: *cases\n" +"Amonge the which points y-spoken was\n" +"To have with certain countries alliance,\n" +"And have of Thebans full obeisance.\n" +"For which this noble Theseus anon\n" +"Let* send after the gentle Palamon, *caused\n" +"Unwist* of him what was the cause and why: *unknown\n" +"But in his blacke clothes sorrowfully\n" +"He came at his commandment *on hie*; *in haste*\n" +"Then sente Theseus for Emily.\n" +"When they were set*, and hush'd was all the place *seated\n" +"And Theseus abided* had a space *waited\n" +"Ere any word came from his wise breast\n" +"*His eyen set he there as was his lest*, *he cast his eyes\n" +"And with a sad visage he sighed still, wherever he pleased*\n" +"And after that right thus he said his will.\n" +"\"The firste mover of the cause above\n" +"When he first made the faire chain of love,\n" +"Great was th' effect, and high was his intent;\n" +"Well wist he why, and what thereof he meant:\n" +"For with that faire chain of love he bond* *bound\n" +"The fire, the air, the water, and the lond\n" +"In certain bondes, that they may not flee:<91>\n" +"That same prince and mover eke,\" quoth he,\n" +"\"Hath stablish'd, in this wretched world adown,\n" +"Certain of dayes and duration\n" +"To all that are engender'd in this place,\n" +"Over the whiche day they may not pace*, *pass\n" +"All may they yet their dayes well abridge.\n" +"There needeth no authority to allege\n" +"For it is proved by experience;\n" +"But that me list declare my sentence*. *opinion\n" +"Then may men by this order well discern,\n" +"That thilke* mover stable is and etern. *the same\n" +"Well may men know, but that it be a fool,\n" +"That every part deriveth from its whole.\n" +"For nature hath not ta'en its beginning\n" +"Of no *partie nor cantle* of a thing, *part or piece*\n" +"But of a thing that perfect is and stable,\n" +"Descending so, till it be corruptable.\n" +"And therefore of His wise purveyance* *providence\n" +"He hath so well beset* his ordinance,\n" +"That species of things and progressions\n" +"Shallen endure by successions,\n" +"And not etern, withouten any lie:\n" +"This mayst thou understand and see at eye.\n" +"Lo th' oak, that hath so long a nourishing\n" +"From the time that it 'ginneth first to spring,\n" +"And hath so long a life, as ye may see,\n" +"Yet at the last y-wasted is the tree.\n" +"Consider eke, how that the harde stone\n" +"Under our feet, on which we tread and gon*, *walk\n" +"Yet wasteth, as it lieth by the way.\n" +"The broade river some time waxeth drey*. *dry\n" +"The greate townes see we wane and wend*. *go, disappear\n" +"Then may ye see that all things have an end.\n" +"Of man and woman see we well also, --\n" +"That needes in one of the termes two, --\n" +"That is to say, in youth or else in age,-\n" +"He must be dead, the king as shall a page;\n" +"Some in his bed, some in the deepe sea,\n" +"Some in the large field, as ye may see:\n" +"There helpeth nought, all go that ilke* way: *same\n" +"Then may I say that alle thing must die.\n" +"What maketh this but Jupiter the king?\n" +"The which is prince, and cause of alle thing,\n" +"Converting all unto his proper will,\n" +"From which it is derived, sooth to tell\n" +"And hereagainst no creature alive,\n" +"Of no degree, availeth for to strive.\n" +"Then is it wisdom, as it thinketh me,\n" +"To make a virtue of necessity,\n" +"And take it well, that we may not eschew*, *escape\n" +"And namely what to us all is due.\n" +"And whoso grudgeth* ought, he doth folly, *murmurs at\n" +"And rebel is to him that all may gie*. *direct, guide\n" +"And certainly a man hath most honour\n" +"To dien in his excellence and flower,\n" +"When he is sicker* of his goode name. *certain\n" +"Then hath he done his friend, nor him*, no shame *himself\n" +"And gladder ought his friend be of his death,\n" +"When with honour is yielded up his breath,\n" +"Than when his name *appalled is for age*; *decayed by old age*\n" +"For all forgotten is his vassalage*. *valour, service\n" +"Then is it best, as for a worthy fame,\n" +"To dien when a man is best of name.\n" +"The contrary of all this is wilfulness.\n" +"Why grudge we, why have we heaviness,\n" +"That good Arcite, of chivalry the flower,\n" +"Departed is, with duty and honour,\n" +"Out of this foule prison of this life?\n" +"Why grudge here his cousin and his wife\n" +"Of his welfare, that loved him so well?\n" +"Can he them thank? nay, God wot, neverdeal*, -- *not a jot\n" +"That both his soul and eke themselves offend*, *hurt\n" +"And yet they may their lustes* not amend**. *desires **control\n" +"What may I conclude of this longe serie*, *string of remarks\n" +"But after sorrow I rede* us to be merry, *counsel\n" +"And thanke Jupiter for all his grace?\n" +"And ere that we departe from this place,\n" +"I rede that we make of sorrows two\n" +"One perfect joye lasting evermo':\n" +"And look now where most sorrow is herein,\n" +"There will I first amenden and begin.\n" +"\"Sister,\" quoth he, \"this is my full assent,\n" +"With all th' advice here of my parlement,\n" +"That gentle Palamon, your owen knight,\n" +"That serveth you with will, and heart, and might,\n" +"And ever hath, since first time ye him knew,\n" +"That ye shall of your grace upon him rue*, *take pity\n" +"And take him for your husband and your lord:\n" +"Lend me your hand, for this is our accord.\n" +"*Let see* now of your womanly pity. *make display*\n" +"He is a kinge's brother's son, pardie*. *by God\n" +"And though he were a poore bachelere,\n" +"Since he hath served you so many a year,\n" +"And had for you so great adversity,\n" +"It muste be considered, *'lieveth me*. *believe me*\n" +"For gentle mercy *oweth to passen right*.\" *ought to be rightly\n" +"Then said he thus to Palamon the knight; directed*\n" +"\"I trow there needeth little sermoning\n" +"To make you assente to this thing.\n" +"Come near, and take your lady by the hand.\"\n" +"Betwixte them was made anon the band,\n" +"That hight matrimony or marriage,\n" +"By all the counsel of the baronage.\n" +"And thus with alle bliss and melody\n" +"Hath Palamon y-wedded Emily.\n" +"And God, that all this wide world hath wrought,\n" +"Send him his love, that hath it dearly bought.\n" +"For now is Palamon in all his weal,\n" +"Living in bliss, in riches, and in heal*. *health\n" +"And Emily him loves so tenderly,\n" +"And he her serveth all so gentilly,\n" +"That never was there worde them between\n" +"Of jealousy, nor of none other teen*. *cause of anger\n" +"Thus endeth Palamon and Emily\n" +"And God save all this faire company.\n" +}; + +const char knightsTale5[] PROGMEM= { +" THE KNIGHT'S TALE <1>\n" +"\n" +"\n" +"WHILOM*, as olde stories tellen us, *formerly\n" +"There was a duke that highte* Theseus. *was called <2>\n" +"Of Athens he was lord and governor,\n" +"And in his time such a conqueror\n" +"That greater was there none under the sun.\n" +"Full many a riche country had he won.\n" +"What with his wisdom and his chivalry,\n" +"He conquer'd all the regne of Feminie,<3>\n" +"That whilom was y-cleped Scythia;\n" +"And weddede the Queen Hippolyta\n" +"And brought her home with him to his country\n" +"With muchel* glory and great solemnity, *great\n" +"And eke her younge sister Emily,\n" +"And thus with vict'ry and with melody\n" +"Let I this worthy Duke to Athens ride,\n" +"And all his host, in armes him beside.\n" +"\n" +"And certes, if it n'ere* too long to hear, *were not\n" +"I would have told you fully the mannere,\n" +"How wonnen* was the regne of Feminie, <4> *won\n" +"By Theseus, and by his chivalry;\n" +"And of the greate battle for the nonce\n" +"Betwixt Athenes and the Amazons;\n" +"And how assieged was Hippolyta,\n" +"The faire hardy queen of Scythia;\n" +"And of the feast that was at her wedding\n" +"And of the tempest at her homecoming.\n" +"But all these things I must as now forbear.\n" +"I have, God wot, a large field to ear* *plough<5>;\n" +"And weake be the oxen in my plough;\n" +"The remnant of my tale is long enow.\n" +"I will not *letten eke none of this rout*. *hinder any of\n" +"Let every fellow tell his tale about, this company*\n" +"And let see now who shall the supper win.\n" +"There *as I left*, I will again begin. *where I left off*\n" +"\n" +"This Duke, of whom I make mentioun,\n" +"When he was come almost unto the town,\n" +"In all his weal, and in his moste pride,\n" +"He was ware, as he cast his eye aside,\n" +"Where that there kneeled in the highe way\n" +"A company of ladies, tway and tway,\n" +"Each after other, clad in clothes black:\n" +"But such a cry and such a woe they make,\n" +"That in this world n'is creature living,\n" +"That hearde such another waimenting* *lamenting <6>\n" +"And of this crying would they never stenten*, *desist\n" +"Till they the reines of his bridle henten*. *seize\n" +"\"What folk be ye that at mine homecoming\n" +"Perturben so my feaste with crying?\"\n" +"Quoth Theseus; \"Have ye so great envy\n" +"Of mine honour, that thus complain and cry?\n" +"Or who hath you misboden*, or offended? *wronged\n" +"Do telle me, if it may be amended;\n" +"And why that ye be clad thus all in black?\"\n" +"\n" +"The oldest lady of them all then spake,\n" +"When she had swooned, with a deadly cheer*, *countenance\n" +"That it was ruthe* for to see or hear. *pity\n" +"She saide; \"Lord, to whom fortune hath given\n" +"Vict'ry, and as a conqueror to liven,\n" +"Nought grieveth us your glory and your honour;\n" +"But we beseechen mercy and succour.\n" +"Have mercy on our woe and our distress;\n" +"Some drop of pity, through thy gentleness,\n" +"Upon us wretched women let now fall.\n" +"For certes, lord, there is none of us all\n" +"That hath not been a duchess or a queen;\n" +"Now be we caitives*, as it is well seen: *captives\n" +"Thanked be Fortune, and her false wheel,\n" +"That *none estate ensureth to be wele*. *assures no continuance of\n" +"And certes, lord, t'abiden your presence prosperous estate*\n" +"Here in this temple of the goddess Clemence\n" +"We have been waiting all this fortenight:\n" +"Now help us, lord, since it lies in thy might.\n" +"\n" +"\"I, wretched wight, that weep and waile thus,\n" +"Was whilom wife to king Capaneus,\n" +"That starf* at Thebes, cursed be that day: *died <7>\n" +"And alle we that be in this array,\n" +"And maken all this lamentatioun,\n" +"We losten all our husbands at that town,\n" +"While that the siege thereabouten lay.\n" +"And yet the olde Creon, wellaway!\n" +"That lord is now of Thebes the city,\n" +"Fulfilled of ire and of iniquity,\n" +"He for despite, and for his tyranny,\n" +"To do the deade bodies villainy*, *insult\n" +"Of all our lorde's, which that been y-slaw, *slain\n" +"Hath all the bodies on an heap y-draw,\n" +"And will not suffer them by none assent\n" +"Neither to be y-buried, nor y-brent*, *burnt\n" +"But maketh houndes eat them in despite.\"\n" +"And with that word, withoute more respite\n" +"They fallen groff,* and cryden piteously; *grovelling\n" +"\"Have on us wretched women some mercy,\n" +"And let our sorrow sinken in thine heart.\"\n" +"\n" +"This gentle Duke down from his courser start\n" +"With hearte piteous, when he heard them speak.\n" +"Him thoughte that his heart would all to-break,\n" +"When he saw them so piteous and so mate* *abased\n" +"That whilom weren of so great estate.\n" +"And in his armes he them all up hent*, *raised, took\n" +"And them comforted in full good intent,\n" +"And swore his oath, as he was true knight,\n" +"He woulde do *so farforthly his might* *as far as his power went*\n" +"Upon the tyrant Creon them to wreak*, *avenge\n" +"That all the people of Greece shoulde speak,\n" +"How Creon was of Theseus y-served,\n" +"As he that had his death full well deserved.\n" +"And right anon withoute more abode* *delay\n" +"His banner he display'd, and forth he rode\n" +"To Thebes-ward, and all his, host beside:\n" +"No ner* Athenes would he go nor ride, *nearer\n" +"Nor take his ease fully half a day,\n" +"But onward on his way that night he lay:\n" +"And sent anon Hippolyta the queen,\n" +"And Emily her younge sister sheen* *bright, lovely\n" +"Unto the town of Athens for to dwell:\n" +"And forth he rit*; there is no more to tell. *rode\n" +"\n" +"The red statue of Mars with spear and targe* *shield\n" +"So shineth in his white banner large\n" +"That all the fieldes glitter up and down:\n" +"And by his banner borne is his pennon\n" +"Of gold full rich, in which there was y-beat* *stamped\n" +"The Minotaur<8> which that he slew in Crete\n" +"Thus rit this Duke, thus rit this conqueror\n" +"And in his host of chivalry the flower,\n" +"Till that he came to Thebes, and alight\n" +"Fair in a field, there as he thought to fight.\n" +"But shortly for to speaken of this thing,\n" +"With Creon, which that was of Thebes king,\n" +"He fought, and slew him manly as a knight\n" +"In plain bataille, and put his folk to flight:\n" +"And by assault he won the city after,\n" +"And rent adown both wall, and spar, and rafter;\n" +"And to the ladies he restored again\n" +"The bodies of their husbands that were slain,\n" +"To do obsequies, as was then the guise*. *custom\n" +"\n" +"But it were all too long for to devise* *describe\n" +"The greate clamour, and the waimenting*, *lamenting\n" +"Which that the ladies made at the brenning* *burning\n" +"Of the bodies, and the great honour\n" +"That Theseus the noble conqueror\n" +"Did to the ladies, when they from him went:\n" +"But shortly for to tell is mine intent.\n" +"When that this worthy Duke, this Theseus,\n" +"Had Creon slain, and wonnen Thebes thus,\n" +"Still in the field he took all night his rest,\n" +"And did with all the country as him lest*. *pleased\n" +"To ransack in the tas* of bodies dead, *heap\n" +"Them for to strip of *harness and of **weed, *armour **clothes\n" +"The pillers* did their business and cure, *pillagers <9>\n" +"After the battle and discomfiture.\n" +"And so befell, that in the tas they found,\n" +"Through girt with many a grievous bloody wound,\n" +"Two younge knightes *ligging by and by* *lying side by side*\n" +"Both in *one armes*, wrought full richely: *the same armour*\n" +"Of whiche two, Arcita hight that one,\n" +"And he that other highte Palamon.\n" +"Not fully quick*, nor fully dead they were, *alive\n" +"But by their coat-armour, and by their gear,\n" +"The heralds knew them well in special,\n" +"As those that weren of the blood royal\n" +"Of Thebes, and *of sistren two y-born*. *born of two sisters*\n" +"Out of the tas the pillers have them torn,\n" +"And have them carried soft unto the tent\n" +"Of Theseus, and he full soon them sent\n" +"To Athens, for to dwellen in prison\n" +"Perpetually, he *n'olde no ranson*. *would take no ransom*\n" +"And when this worthy Duke had thus y-done,\n" +"He took his host, and home he rit anon\n" +"With laurel crowned as a conquerour;\n" +"And there he lived in joy and in honour\n" +"Term of his life; what needeth wordes mo'?\n" +"And in a tower, in anguish and in woe,\n" +"Dwellen this Palamon, and eke Arcite,\n" +"For evermore, there may no gold them quite* *set free\n" +"\n" +"Thus passed year by year, and day by day,\n" +"Till it fell ones in a morn of May\n" +"That Emily, that fairer was to seen\n" +"Than is the lily upon his stalke green,\n" +"And fresher than the May with flowers new\n" +"(For with the rose colour strove her hue;\n" +"I n'ot* which was the finer of them two), *know not\n" +"Ere it was day, as she was wont to do,\n" +"She was arisen, and all ready dight*, *dressed\n" +"For May will have no sluggardy a-night;\n" +"The season pricketh every gentle heart,\n" +"And maketh him out of his sleep to start,\n" +"And saith, \"Arise, and do thine observance.\"\n" +"\n" +"This maketh Emily have remembrance\n" +"To do honour to May, and for to rise.\n" +"Y-clothed was she fresh for to devise;\n" +"Her yellow hair was braided in a tress,\n" +"Behind her back, a yarde long I guess.\n" +"And in the garden at *the sun uprist* *sunrise\n" +"She walketh up and down where as her list.\n" +"She gathereth flowers, party* white and red, *mingled\n" +"To make a sotel* garland for her head, *subtle, well-arranged\n" +"And as an angel heavenly she sung.\n" +"The greate tower, that was so thick and strong,\n" +"Which of the castle was the chief dungeon<10>\n" +"(Where as these knightes weren in prison,\n" +"Of which I tolde you, and telle shall),\n" +"Was even joinant* to the garden wall, *adjoining\n" +"There as this Emily had her playing.\n" +"\n" +"Bright was the sun, and clear that morrowning,\n" +"And Palamon, this woful prisoner,\n" +"As was his wont, by leave of his gaoler,\n" +"Was ris'n, and roamed in a chamber on high,\n" +"In which he all the noble city sigh*, *saw\n" +"And eke the garden, full of branches green,\n" +"There as this fresh Emelia the sheen\n" +"Was in her walk, and roamed up and down.\n" +"This sorrowful prisoner, this Palamon\n" +"Went in his chamber roaming to and fro,\n" +"And to himself complaining of his woe:\n" +"That he was born, full oft he said, Alas!\n" +"And so befell, by aventure or cas*, *chance\n" +"That through a window thick of many a bar\n" +"Of iron great, and square as any spar,\n" +"He cast his eyes upon Emelia,\n" +"And therewithal he blent* and cried, Ah! *started aside\n" +"As though he stungen were unto the heart.\n" +"And with that cry Arcite anon up start,\n" +"And saide, \"Cousin mine, what aileth thee,\n" +"That art so pale and deadly for to see?\n" +"Why cried'st thou? who hath thee done offence?\n" +"For Godde's love, take all in patience\n" +"Our prison*, for it may none other be. *imprisonment\n" +"Fortune hath giv'n us this adversity'.\n" +"Some wick'* aspect or disposition *wicked\n" +"Of Saturn<11>, by some constellation,\n" +"Hath giv'n us this, although we had it sworn,\n" +"So stood the heaven when that we were born,\n" +"We must endure; this is the short and plain.\n" +"\n" +"This Palamon answer'd, and said again:\n" +"\"Cousin, forsooth of this opinion\n" +"Thou hast a vain imagination.\n" +"This prison caused me not for to cry;\n" +"But I was hurt right now thorough mine eye\n" +"Into mine heart; that will my bane* be. *destruction\n" +"The fairness of the lady that I see\n" +"Yond in the garden roaming to and fro,\n" +"Is cause of all my crying and my woe.\n" +"I *n'ot wher* she be woman or goddess, *know not whether*\n" +"But Venus is it, soothly* as I guess, *truly\n" +"And therewithal on knees adown he fill,\n" +"And saide: \"Venus, if it be your will\n" +"You in this garden thus to transfigure\n" +"Before me sorrowful wretched creature,\n" +"Out of this prison help that we may scape.\n" +"And if so be our destiny be shape\n" +"By etern word to dien in prison,\n" +"Of our lineage have some compassion,\n" +"That is so low y-brought by tyranny.\"\n" +"\n" +"And with that word Arcita *gan espy* *began to look forth*\n" +"Where as this lady roamed to and fro\n" +"And with that sight her beauty hurt him so,\n" +"That if that Palamon was wounded sore,\n" +"Arcite is hurt as much as he, or more.\n" +"And with a sigh he saide piteously:\n" +"\"The freshe beauty slay'th me suddenly\n" +"Of her that roameth yonder in the place.\n" +"And but* I have her mercy and her grace, *unless\n" +"That I may see her at the leaste way,\n" +"I am but dead; there is no more to say.\"\n" +"This Palamon, when he these wordes heard,\n" +"Dispiteously* he looked, and answer'd: *angrily\n" +"\"Whether say'st thou this in earnest or in play?\"\n" +"\"Nay,\" quoth Arcite, \"in earnest, by my fay*. *faith\n" +"God help me so, *me lust full ill to play*.\" *I am in no humour\n" +"This Palamon gan knit his browes tway. for jesting*\n" +"\"It were,\" quoth he, \"to thee no great honour\n" +"For to be false, nor for to be traitour\n" +"To me, that am thy cousin and thy brother\n" +"Y-sworn full deep, and each of us to other,\n" +"That never for to dien in the pain <12>,\n" +"Till that the death departen shall us twain,\n" +"Neither of us in love to hinder other,\n" +"Nor in none other case, my leve* brother; *dear\n" +"But that thou shouldest truly farther me\n" +"In every case, as I should farther thee.\n" +"This was thine oath, and mine also certain;\n" +"I wot it well, thou dar'st it not withsayn*, *deny\n" +"Thus art thou of my counsel out of doubt,\n" +"And now thou wouldest falsely be about\n" +"To love my lady, whom I love and serve,\n" +"And ever shall, until mine hearte sterve* *die\n" +"Now certes, false Arcite, thou shalt not so\n" +"I lov'd her first, and tolde thee my woe\n" +"As to my counsel, and my brother sworn\n" +"To farther me, as I have told beforn.\n" +"For which thou art y-bounden as a knight\n" +"To helpe me, if it lie in thy might,\n" +"Or elles art thou false, I dare well sayn,\"\n" +"\n" +"This Arcita full proudly spake again:\n" +"\"Thou shalt,\" quoth he, \"be rather* false than I, *sooner\n" +"And thou art false, I tell thee utterly;\n" +"For par amour I lov'd her first ere thou.\n" +"What wilt thou say? *thou wist it not right now* *even now thou\n" +"Whether she be a woman or goddess. knowest not*\n" +"Thine is affection of holiness,\n" +"And mine is love, as to a creature:\n" +"For which I tolde thee mine aventure\n" +"As to my cousin, and my brother sworn\n" +"I pose*, that thou loved'st her beforn: *suppose\n" +"Wost* thou not well the olde clerke's saw<13>, *know'st\n" +"That who shall give a lover any law?\n" +"Love is a greater lawe, by my pan,\n" +"Than may be giv'n to any earthly man:\n" +"Therefore positive law, and such decree,\n" +"Is broke alway for love in each degree\n" +"A man must needes love, maugre his head.\n" +"He may not flee it, though he should be dead,\n" +"*All be she* maid, or widow, or else wife. *whether she be*\n" +"And eke it is not likely all thy life\n" +"To standen in her grace, no more than I\n" +"For well thou wost thyselfe verily,\n" +"That thou and I be damned to prison\n" +"Perpetual, us gaineth no ranson.\n" +"We strive, as did the houndes for the bone;\n" +"They fought all day, and yet their part was none.\n" +"There came a kite, while that they were so wroth,\n" +"And bare away the bone betwixt them both.\n" +"And therefore at the kinge's court, my brother,\n" +"Each man for himselfe, there is no other.\n" +"Love if thee list; for I love and aye shall\n" +"And soothly, leve brother, this is all.\n" +"Here in this prison musten we endure,\n" +"And each of us take his Aventure.\"\n" +"\n" +"Great was the strife and long between these tway,\n" +"If that I hadde leisure for to say;\n" +"But to the effect: it happen'd on a day\n" +"(To tell it you as shortly as I may),\n" +"A worthy duke that hight Perithous<14>\n" +"That fellow was to the Duke Theseus\n" +"Since thilke* day that they were children lite** *that **little\n" +"Was come to Athens, his fellow to visite,\n" +"And for to play, as he was wont to do;\n" +"For in this world he loved no man so;\n" +"And he lov'd him as tenderly again.\n" +"So well they lov'd, as olde bookes sayn,\n" +"That when that one was dead, soothly to sayn,\n" +"His fellow went and sought him down in hell:\n" +"But of that story list me not to write.\n" +"Duke Perithous loved well Arcite,\n" +"And had him known at Thebes year by year:\n" +"And finally at request and prayere\n" +"Of Perithous, withoute ranson\n" +"Duke Theseus him let out of prison,\n" +"Freely to go, where him list over all,\n" +"In such a guise, as I you tellen shall\n" +"This was the forword*, plainly to indite, *promise\n" +"Betwixte Theseus and him Arcite:\n" +"That if so were, that Arcite were y-found\n" +"Ever in his life, by day or night, one stound* *moment<15>\n" +"In any country of this Theseus,\n" +"And he were caught, it was accorded thus,\n" +"That with a sword he shoulde lose his head;\n" +"There was none other remedy nor rede*. *counsel\n" +"But took his leave, and homeward he him sped;\n" +"Let him beware, his necke lieth *to wed*. *in pledge*\n" +"\n" +"How great a sorrow suff'reth now Arcite!\n" +"The death he feeleth through his hearte smite;\n" +"He weepeth, waileth, crieth piteously;\n" +"To slay himself he waiteth privily.\n" +"He said; \"Alas the day that I was born!\n" +"Now is my prison worse than beforn:\n" +"*Now is me shape* eternally to dwell *it is fixed for me*\n" +"Not in purgatory, but right in hell.\n" +"Alas! that ever I knew Perithous.\n" +"For elles had I dwelt with Theseus\n" +"Y-fettered in his prison evermo'.\n" +"Then had I been in bliss, and not in woe.\n" +"Only the sight of her, whom that I serve,\n" +"Though that I never may her grace deserve,\n" +"Would have sufficed right enough for me.\n" +"O deare cousin Palamon,\" quoth he,\n" +"\"Thine is the vict'ry of this aventure,\n" +"Full blissfully in prison to endure:\n" +"In prison? nay certes, in paradise.\n" +"Well hath fortune y-turned thee the dice,\n" +"That hast the sight of her, and I th' absence.\n" +"For possible is, since thou hast her presence,\n" +"And art a knight, a worthy and an able,\n" +"That by some cas*, since fortune is changeable, *chance\n" +"Thou may'st to thy desire sometime attain.\n" +"But I that am exiled, and barren\n" +"Of alle grace, and in so great despair,\n" +"That there n'is earthe, water, fire, nor air,\n" +"Nor creature, that of them maked is,\n" +"That may me helpe nor comfort in this,\n" +"Well ought I *sterve in wanhope* and distress. *die in despair*\n" +"Farewell my life, my lust*, and my gladness. *pleasure\n" +"Alas, *why plainen men so in commune *why do men so often complain\n" +"Of purveyance of God*, or of Fortune, of God's providence?*\n" +"That giveth them full oft in many a guise\n" +"Well better than they can themselves devise?\n" +"Some man desireth for to have richess,\n" +"That cause is of his murder or great sickness.\n" +"And some man would out of his prison fain,\n" +"That in his house is of his meinie* slain. *servants <16>\n" +"Infinite harmes be in this mattere.\n" +"We wot never what thing we pray for here.\n" +"We fare as he that drunk is as a mouse.\n" +"A drunken man wot well he hath an house,\n" +"But he wot not which is the right way thither,\n" +"And to a drunken man the way is slither*. *slippery\n" +"And certes in this world so fare we.\n" +"We seeke fast after felicity,\n" +"But we go wrong full often truely.\n" +"Thus we may sayen all, and namely* I, *especially\n" +"That ween'd*, and had a great opinion, *thought\n" +"That if I might escape from prison\n" +"Then had I been in joy and perfect heal,\n" +"Where now I am exiled from my weal.\n" +"Since that I may not see you, Emily,\n" +"I am but dead; there is no remedy.\"\n" +"\n" +"Upon that other side, Palamon,\n" +"When that he wist Arcita was agone,\n" +"Much sorrow maketh, that the greate tower\n" +"Resounded of his yelling and clamour\n" +"The pure* fetters on his shinnes great *very <17>\n" +"Were of his bitter salte teares wet.\n" +"\n" +"\"Alas!\" quoth he, \"Arcita, cousin mine,\n" +"Of all our strife, God wot, the fruit is thine.\n" +"Thou walkest now in Thebes at thy large,\n" +"And of my woe thou *givest little charge*. *takest little heed*\n" +"Thou mayst, since thou hast wisdom and manhead*, *manhood, courage\n" +"Assemble all the folk of our kindred,\n" +"And make a war so sharp on this country\n" +"That by some aventure, or some treaty,\n" +"Thou mayst have her to lady and to wife,\n" +"For whom that I must needes lose my life.\n" +"For as by way of possibility,\n" +"Since thou art at thy large, of prison free,\n" +"And art a lord, great is thine avantage,\n" +"More than is mine, that sterve here in a cage.\n" +"For I must weep and wail, while that I live,\n" +"With all the woe that prison may me give,\n" +"And eke with pain that love me gives also,\n" +"That doubles all my torment and my woe.\"\n" +"\n" +"Therewith the fire of jealousy upstart\n" +"Within his breast, and hent* him by the heart *seized\n" +"So woodly*, that he like was to behold *madly\n" +"The box-tree, or the ashes dead and cold.\n" +"Then said; \"O cruel goddess, that govern\n" +"This world with binding of your word etern* *eternal\n" +"And writen in the table of adamant\n" +"Your parlement* and your eternal grant, *consultation\n" +"What is mankind more *unto you y-hold* *by you esteemed\n" +"Than is the sheep, that rouketh* in the fold! *lie huddled together\n" +"For slain is man, right as another beast;\n" +"And dwelleth eke in prison and arrest,\n" +"And hath sickness, and great adversity,\n" +"And oftentimes guilteless, pardie* *by God\n" +"What governance is in your prescience,\n" +"That guilteless tormenteth innocence?\n" +"And yet increaseth this all my penance,\n" +"That man is bounden to his observance\n" +"For Godde's sake to *letten of his will*, *restrain his desire*\n" +"Whereas a beast may all his lust fulfil.\n" +"And when a beast is dead, he hath no pain;\n" +"But man after his death must weep and plain,\n" +"Though in this worlde he have care and woe:\n" +"Withoute doubt it maye standen so.\n" +"\"The answer of this leave I to divines,\n" +"But well I wot, that in this world great pine* is; *pain, trouble\n" +"Alas! I see a serpent or a thief\n" +"That many a true man hath done mischief,\n" +"Go at his large, and where him list may turn.\n" +"But I must be in prison through Saturn,\n" +"And eke through Juno, jealous and eke wood*, *mad\n" +"That hath well nigh destroyed all the blood\n" +"Of Thebes, with his waste walles wide.\n" +"And Venus slay'th me on that other side\n" +"For jealousy, and fear of him, Arcite.\"\n" +"\n" +"Now will I stent* of Palamon a lite**, *pause **little\n" +"And let him in his prison stille dwell,\n" +"And of Arcita forth I will you tell.\n" +"The summer passeth, and the nightes long\n" +"Increase double-wise the paines strong\n" +"Both of the lover and the prisonere.\n" +"I n'ot* which hath the wofuller mistere**. *know not **condition\n" +"For, shortly for to say, this Palamon\n" +"Perpetually is damned to prison,\n" +"In chaines and in fetters to be dead;\n" +"And Arcite is exiled *on his head* *on peril of his head*\n" +"For evermore as out of that country,\n" +"Nor never more he shall his lady see.\n" +"You lovers ask I now this question,<18>\n" +"Who lieth the worse, Arcite or Palamon?\n" +"The one may see his lady day by day,\n" +"But in prison he dwelle must alway.\n" +"The other where him list may ride or go,\n" +"But see his lady shall he never mo'.\n" +"Now deem all as you liste, ye that can,\n" +"For I will tell you forth as I began.\n" +"\n" +"When that Arcite to Thebes comen was,\n" +"Full oft a day he swelt*, and said, \"Alas!\" *fainted\n" +"For see this lady he shall never mo'.\n" +"And shortly to concluden all his woe,\n" +"So much sorrow had never creature\n" +"That is or shall be while the world may dure.\n" +"His sleep, his meat, his drink is *him byraft*, *taken away from him*\n" +"That lean he wex*, and dry as any shaft. *became\n" +"His eyen hollow, grisly to behold,\n" +"His hue sallow, and pale as ashes cold,\n" +"And solitary he was, ever alone,\n" +"And wailing all the night, making his moan.\n" +"And if he hearde song or instrument,\n" +"Then would he weepen, he might not be stent*. *stopped\n" +"So feeble were his spirits, and so low,\n" +"And changed so, that no man coulde know\n" +"His speech, neither his voice, though men it heard.\n" +"And in his gear* for all the world he far'd *behaviour <19>\n" +"Not only like the lovers' malady\n" +"Of Eros, but rather y-like manie* *madness\n" +"Engender'd of humours melancholic,\n" +"Before his head in his cell fantastic.<20>\n" +"And shortly turned was all upside down,\n" +"Both habit and eke dispositioun,\n" +"Of him, this woful lover Dan* Arcite. *Lord <21>\n" +"Why should I all day of his woe indite?\n" +"When he endured had a year or two\n" +"This cruel torment, and this pain and woe,\n" +"At Thebes, in his country, as I said,\n" +"Upon a night in sleep as he him laid,\n" +"Him thought how that the winged god Mercury\n" +"Before him stood, and bade him to be merry.\n" +"His sleepy yard* in hand he bare upright; *rod <22>\n" +"A hat he wore upon his haires bright.\n" +"Arrayed was this god (as he took keep*) *notice\n" +"As he was when that Argus<23> took his sleep;\n" +"And said him thus: \"To Athens shalt thou wend*; *go\n" +"There is thee shapen* of thy woe an end.\" *fixed, prepared\n" +"And with that word Arcite woke and start.\n" +"\"Now truely how sore that e'er me smart,\"\n" +"Quoth he, \"to Athens right now will I fare.\n" +"Nor for no dread of death shall I not spare\n" +"To see my lady that I love and serve;\n" +"In her presence *I recke not to sterve.*\" *do not care if I die*\n" +"And with that word he caught a great mirror,\n" +"And saw that changed was all his colour,\n" +"And saw his visage all in other kind.\n" +"And right anon it ran him ill his mind,\n" +"That since his face was so disfigur'd\n" +"Of malady the which he had endur'd,\n" +"He mighte well, if that he *bare him low,* *lived in lowly fashion*\n" +"Live in Athenes evermore unknow,\n" +"And see his lady wellnigh day by day.\n" +"And right anon he changed his array,\n" +"And clad him as a poore labourer.\n" +"And all alone, save only a squier,\n" +"That knew his privity* and all his cas**, *secrets **fortune\n" +"Which was disguised poorly as he was,\n" +"To Athens is he gone the nexte* way. *nearest <24>\n" +"And to the court he went upon a day,\n" +"And at the gate he proffer'd his service,\n" +"To drudge and draw, what so men would devise*. *order\n" +"And, shortly of this matter for to sayn,\n" +"He fell in office with a chamberlain,\n" +"The which that dwelling was with Emily.\n" +"For he was wise, and coulde soon espy\n" +"Of every servant which that served her.\n" +"Well could he hewe wood, and water bear,\n" +"For he was young and mighty for the nones*, *occasion\n" +"And thereto he was strong and big of bones\n" +"To do that any wight can him devise.\n" +"\n" +"A year or two he was in this service,\n" +"Page of the chamber of Emily the bright;\n" +"And Philostrate he saide that he hight.\n" +"But half so well belov'd a man as he\n" +"Ne was there never in court of his degree.\n" +"He was so gentle of conditioun,\n" +"That throughout all the court was his renown.\n" +"They saide that it were a charity\n" +"That Theseus would *enhance his degree*, *elevate him in rank*\n" +"And put him in some worshipful service,\n" +"There as he might his virtue exercise.\n" +"And thus within a while his name sprung\n" +"Both of his deedes, and of his good tongue,\n" +"That Theseus hath taken him so near,\n" +"That of his chamber he hath made him squire,\n" +"And gave him gold to maintain his degree;\n" +"And eke men brought him out of his country\n" +"From year to year full privily his rent.\n" +"But honestly and slyly* he it spent, *discreetly, prudently\n" +"That no man wonder'd how that he it had.\n" +"And three year in this wise his life be lad*, *led\n" +"And bare him so in peace and eke in werre*, *war\n" +"There was no man that Theseus had so derre*. *dear\n" +"And in this blisse leave I now Arcite,\n" +"And speak I will of Palamon a lite*. *little\n" +"\n" +"In darkness horrible, and strong prison,\n" +"This seven year hath sitten Palamon,\n" +"Forpined*, what for love, and for distress. *pined, wasted away\n" +"Who feeleth double sorrow and heaviness\n" +"But Palamon? that love distraineth* so, *afflicts\n" +"That wood* out of his wits he went for woe, *mad\n" +"And eke thereto he is a prisonere\n" +"Perpetual, not only for a year.\n" +"Who coulde rhyme in English properly\n" +"His martyrdom? forsooth*, it is not I; *truly\n" +"Therefore I pass as lightly as I may.\n" +"It fell that in the seventh year, in May\n" +"The thirde night (as olde bookes sayn,\n" +"That all this story tellen more plain),\n" +"Were it by a venture or destiny\n" +"(As when a thing is shapen* it shall be), *settled, decreed\n" +"That soon after the midnight, Palamon\n" +"By helping of a friend brake his prison,\n" +"And fled the city fast as he might go,\n" +"For he had given drink his gaoler so\n" +"Of a clary <25>, made of a certain wine,\n" +"With *narcotise and opie* of Thebes fine, *narcotics and opium*\n" +"That all the night, though that men would him shake,\n" +"The gaoler slept, he mighte not awake:\n" +"And thus he fled as fast as ever he may.\n" +"The night was short, and *faste by the day *close at hand was\n" +"That needes cast he must himself to hide*. the day during which\n" +"And to a grove faste there beside he must cast about, or contrive,\n" +"With dreadful foot then stalked Palamon. to conceal himself.*\n" +"For shortly this was his opinion,\n" +"That in the grove he would him hide all day,\n" +"And in the night then would he take his way\n" +"To Thebes-ward, his friendes for to pray\n" +"On Theseus to help him to warray*. *make war <26>\n" +"And shortly either he would lose his life,\n" +"Or winnen Emily unto his wife.\n" +"This is th' effect, and his intention plain.\n" +"\n" +"Now will I turn to Arcita again,\n" +"That little wist how nighe was his care,\n" +"Till that Fortune had brought him in the snare.\n" +"The busy lark, the messenger of day,\n" +"Saluteth in her song the morning gray;\n" +"And fiery Phoebus riseth up so bright,\n" +"That all the orient laugheth at the sight,\n" +"And with his streames* drieth in the greves** *rays **groves\n" +"The silver droppes, hanging on the leaves;\n" +"And Arcite, that is in the court royal\n" +"With Theseus, his squier principal,\n" +"Is ris'n, and looketh on the merry day.\n" +"And for to do his observance to May,\n" +"Remembering the point* of his desire, *object\n" +"He on his courser, starting as the fire,\n" +"Is ridden to the fieldes him to play,\n" +"Out of the court, were it a mile or tway.\n" +"And to the grove, of which I have you told,\n" +"By a venture his way began to hold,\n" +"To make him a garland of the greves*, *groves\n" +"Were it of woodbine, or of hawthorn leaves,\n" +"And loud he sang against the sun so sheen*. *shining bright\n" +"\"O May, with all thy flowers and thy green,\n" +"Right welcome be thou, faire freshe May,\n" +"I hope that I some green here getten may.\"\n" +"And from his courser*, with a lusty heart, *horse\n" +"Into the grove full hastily he start,\n" +"And in a path he roamed up and down,\n" +"There as by aventure this Palamon\n" +"Was in a bush, that no man might him see,\n" +"For sore afeard of his death was he.\n" +"Nothing ne knew he that it was Arcite;\n" +"God wot he would have *trowed it full lite*. *full little believed it*\n" +"But sooth is said, gone since full many years,\n" +"The field hath eyen*, and the wood hath ears, *eyes\n" +"It is full fair a man *to bear him even*, *to be on his guard*\n" +"For all day meeten men at *unset steven*. *unexpected time <27>\n" +"Full little wot Arcite of his fellaw,\n" +"That was so nigh to hearken of his saw*, *saying, speech\n" +"For in the bush he sitteth now full still.\n" +"When that Arcite had roamed all his fill,\n" +"And *sungen all the roundel* lustily, *sang the roundelay*<28>\n" +"Into a study he fell suddenly,\n" +"As do those lovers in their *quainte gears*, *odd fashions*\n" +"Now in the crop*, and now down in the breres**, <29> *tree-top\n" +"Now up, now down, as bucket in a well. **briars\n" +"Right as the Friday, soothly for to tell,\n" +"Now shineth it, and now it raineth fast,\n" +"Right so can geary* Venus overcast *changeful\n" +"The heartes of her folk, right as her day\n" +"Is gearful*, right so changeth she array. *changeful\n" +"Seldom is Friday all the weeke like.\n" +"When Arcite had y-sung, he gan to sike*, *sigh\n" +"And sat him down withouten any more:\n" +"\"Alas!\" quoth he, \"the day that I was bore!\n" +"How longe, Juno, through thy cruelty\n" +"Wilt thou warrayen* Thebes the city? *torment\n" +"Alas! y-brought is to confusion\n" +"The blood royal of Cadm' and Amphion:\n" +"Of Cadmus, which that was the firste man,\n" +}; +const char knightsTale6[] PROGMEM= { +"That Thebes built, or first the town began,\n" +"And of the city first was crowned king.\n" +"Of his lineage am I, and his offspring\n" +"By very line, as of the stock royal;\n" +"And now I am *so caitiff and so thrall*, *wretched and enslaved*\n" +"That he that is my mortal enemy,\n" +"I serve him as his squier poorely.\n" +"And yet doth Juno me well more shame,\n" +"For I dare not beknow* mine owen name, *acknowledge <30>\n" +"But there as I was wont to hight Arcite,\n" +"Now hight I Philostrate, not worth a mite.\n" +"Alas! thou fell Mars, and alas! Juno,\n" +"Thus hath your ire our lineage all fordo* *undone, ruined\n" +"Save only me, and wretched Palamon,\n" +"That Theseus martyreth in prison.\n" +"And over all this, to slay me utterly,\n" +"Love hath his fiery dart so brenningly* *burningly\n" +"Y-sticked through my true careful heart,\n" +"That shapen was my death erst than my shert. <31>\n" +"Ye slay me with your eyen, Emily;\n" +"Ye be the cause wherefore that I die.\n" +"Of all the remnant of mine other care\n" +"Ne set I not the *mountance of a tare*, *value of a straw*\n" +"So that I could do aught to your pleasance.\"\n" +"\n" +"And with that word he fell down in a trance\n" +"A longe time; and afterward upstart\n" +"This Palamon, that thought thorough his heart\n" +"He felt a cold sword suddenly to glide:\n" +"For ire he quoke*, no longer would he hide. *quaked\n" +"And when that he had heard Arcite's tale,\n" +"As he were wood*, with face dead and pale, *mad\n" +"He start him up out of the bushes thick,\n" +"And said: \"False Arcita, false traitor wick'*, *wicked\n" +"Now art thou hent*, that lov'st my lady so, *caught\n" +"For whom that I have all this pain and woe,\n" +"And art my blood, and to my counsel sworn,\n" +"As I full oft have told thee herebeforn,\n" +"And hast bejaped* here Duke Theseus, *deceived, imposed upon\n" +"And falsely changed hast thy name thus;\n" +"I will be dead, or elles thou shalt die.\n" +"Thou shalt not love my lady Emily,\n" +"But I will love her only and no mo';\n" +"For I am Palamon thy mortal foe.\n" +"And though I have no weapon in this place,\n" +"But out of prison am astart* by grace, *escaped\n" +"I dreade* not that either thou shalt die, *doubt\n" +"Or else thou shalt not loven Emily.\n" +"Choose which thou wilt, for thou shalt not astart.\"\n" +"\n" +"This Arcite then, with full dispiteous* heart, *wrathful\n" +"When he him knew, and had his tale heard,\n" +"As fierce as lion pulled out a swerd,\n" +"And saide thus; \"By God that sitt'th above,\n" +"*N'ere it* that thou art sick, and wood for love, *were it not*\n" +"And eke that thou no weap'n hast in this place,\n" +"Thou should'st never out of this grove pace,\n" +"That thou ne shouldest dien of mine hand.\n" +"For I defy the surety and the band,\n" +"Which that thou sayest I have made to thee.\n" +"What? very fool, think well that love is free;\n" +"And I will love her maugre* all thy might. *despite\n" +"But, for thou art a worthy gentle knight,\n" +"And *wilnest to darraine her by bataille*, *will reclaim her\n" +"Have here my troth, to-morrow I will not fail, by combat*\n" +"Without weeting* of any other wight, *knowledge\n" +"That here I will be founden as a knight,\n" +"And bringe harness* right enough for thee; *armour and arms\n" +"And choose the best, and leave the worst for me.\n" +"And meat and drinke this night will I bring\n" +"Enough for thee, and clothes for thy bedding.\n" +"And if so be that thou my lady win,\n" +"And slay me in this wood that I am in,\n" +"Thou may'st well have thy lady as for me.\"\n" +"This Palamon answer'd, \"I grant it thee.\"\n" +"And thus they be departed till the morrow,\n" +"When each of them hath *laid his faith to borrow*. *pledged his faith*\n" +"\n" +"O Cupid, out of alle charity!\n" +"O Regne* that wilt no fellow have with thee! *queen <32>\n" +"Full sooth is said, that love nor lordeship\n" +"Will not, *his thanks*, have any fellowship. *thanks to him*\n" +"Well finden that Arcite and Palamon.\n" +"Arcite is ridd anon unto the town,\n" +"And on the morrow, ere it were daylight,\n" +"Full privily two harness hath he dight*, *prepared\n" +"Both suffisant and meete to darraine* *contest\n" +"The battle in the field betwixt them twain.\n" +"And on his horse, alone as he was born,\n" +"He carrieth all this harness him beforn;\n" +"And in the grove, at time and place y-set,\n" +"This Arcite and this Palamon be met.\n" +"Then change gan the colour of their face;\n" +"Right as the hunter in the regne* of Thrace *kingdom\n" +"That standeth at a gappe with a spear\n" +"When hunted is the lion or the bear,\n" +"And heareth him come rushing in the greves*, *groves\n" +"And breaking both the boughes and the leaves,\n" +"Thinketh, \"Here comes my mortal enemy,\n" +"Withoute fail, he must be dead or I;\n" +"For either I must slay him at the gap;\n" +"Or he must slay me, if that me mishap:\"\n" +"So fared they, in changing of their hue\n" +"*As far as either of them other knew*. *When they recognised each\n" +"There was no good day, and no saluting, other afar off*\n" +"But straight, withoute wordes rehearsing,\n" +"Evereach of them holp to arm the other,\n" +"As friendly, as he were his owen brother.\n" +"And after that, with sharpe speares strong\n" +"They foined* each at other wonder long. *thrust\n" +"Thou mightest weene*, that this Palamon *think\n" +"In fighting were as a wood* lion, *mad\n" +"And as a cruel tiger was Arcite:\n" +"As wilde boars gan they together smite,\n" +"That froth as white as foam, *for ire wood*. *mad with anger*\n" +"Up to the ancle fought they in their blood.\n" +"And in this wise I let them fighting dwell,\n" +"And forth I will of Theseus you tell.\n" +"\n" +"The Destiny, minister general,\n" +"That executeth in the world o'er all\n" +"The purveyance*, that God hath seen beforn; *foreordination\n" +"So strong it is, that though the world had sworn\n" +"The contrary of a thing by yea or nay,\n" +"Yet some time it shall fallen on a day\n" +"That falleth not eft* in a thousand year. *again\n" +"For certainly our appetites here,\n" +"Be it of war, or peace, or hate, or love,\n" +"All is this ruled by the sight* above. *eye, intelligence, power\n" +"This mean I now by mighty Theseus,\n" +"That for to hunten is so desirous --\n" +"And namely* the greate hart in May -- *especially\n" +"That in his bed there dawneth him no day\n" +"That he n'is clad, and ready for to ride\n" +"With hunt and horn, and houndes him beside.\n" +"For in his hunting hath he such delight,\n" +"That it is all his joy and appetite\n" +"To be himself the greate harte's bane* *destruction\n" +"For after Mars he serveth now Diane.\n" +"Clear was the day, as I have told ere this,\n" +"And Theseus, with alle joy and bliss,\n" +"With his Hippolyta, the faire queen,\n" +"And Emily, y-clothed all in green,\n" +"On hunting be they ridden royally.\n" +"And to the grove, that stood there faste by,\n" +"In which there was an hart, as men him told,\n" +"Duke Theseus the straighte way doth hold,\n" +"And to the laund* he rideth him full right, *plain <33>\n" +"There was the hart y-wont to have his flight,\n" +"And over a brook, and so forth on his way.\n" +"This Duke will have a course at him or tway\n" +"With houndes, such as him lust* to command. *pleased\n" +"And when this Duke was come to the laund,\n" +"Under the sun he looked, and anon\n" +"He was ware of Arcite and Palamon,\n" +"That foughte breme*, as it were bulles two. *fiercely\n" +"The brighte swordes wente to and fro\n" +"So hideously, that with the leaste stroke\n" +"It seemed that it woulde fell an oak,\n" +"But what they were, nothing yet he wote*. *knew\n" +"This Duke his courser with his spurres smote,\n" +"*And at a start* he was betwixt them two, *suddenly*\n" +"And pulled out a sword and cried, \"Ho!\n" +"No more, on pain of losing of your head.\n" +"By mighty Mars, he shall anon be dead\n" +"That smiteth any stroke, that I may see!\n" +"But tell to me what mister* men ye be, *manner, kind <34>\n" +"That be so hardy for to fighte here\n" +"Withoute judge or other officer,\n" +"As though it were in listes royally. <35>\n" +"This Palamon answered hastily,\n" +"And saide: \"Sir, what needeth wordes mo'?\n" +"We have the death deserved bothe two,\n" +"Two woful wretches be we, and caitives,\n" +"That be accumbered* of our own lives, *burdened\n" +"And as thou art a rightful lord and judge,\n" +"So give us neither mercy nor refuge.\n" +"And slay me first, for sainte charity,\n" +"But slay my fellow eke as well as me.\n" +"Or slay him first; for, though thou know it lite*, *little\n" +"This is thy mortal foe, this is Arcite\n" +"That from thy land is banisht on his head,\n" +"For which he hath deserved to be dead.\n" +"For this is he that came unto thy gate\n" +"And saide, that he highte Philostrate.\n" +"Thus hath he japed* thee full many year, *deceived\n" +"And thou hast made of him thy chief esquier;\n" +"And this is he, that loveth Emily.\n" +"For since the day is come that I shall die\n" +"I make pleinly* my confession, *fully, unreservedly\n" +"That I am thilke* woful Palamon, *that same <36>\n" +"That hath thy prison broken wickedly.\n" +"I am thy mortal foe, and it am I\n" +"That so hot loveth Emily the bright,\n" +"That I would die here present in her sight.\n" +"Therefore I aske death and my jewise*. *judgement\n" +"But slay my fellow eke in the same wise,\n" +"For both we have deserved to be slain.\"\n" +"\n" +"This worthy Duke answer'd anon again,\n" +"And said, \"This is a short conclusion.\n" +"Your own mouth, by your own confession\n" +"Hath damned you, and I will it record;\n" +"It needeth not to pain you with the cord;\n" +"Ye shall be dead, by mighty Mars the Red.<37>\n" +"\n" +"The queen anon for very womanhead\n" +"Began to weep, and so did Emily,\n" +"And all the ladies in the company.\n" +"Great pity was it as it thought them all,\n" +"That ever such a chance should befall,\n" +"For gentle men they were, of great estate,\n" +"And nothing but for love was this debate\n" +"They saw their bloody woundes wide and sore,\n" +"And cried all at once, both less and more,\n" +"\"Have mercy, Lord, upon us women all.\"\n" +"And on their bare knees adown they fall\n" +"And would have kissed his feet there as he stood,\n" +"Till at the last *aslaked was his mood* *his anger was\n" +"(For pity runneth soon in gentle heart); appeased*\n" +"And though at first for ire he quoke and start\n" +"He hath consider'd shortly in a clause\n" +"The trespass of them both, and eke the cause:\n" +"And although that his ire their guilt accused\n" +"Yet in his reason he them both excused;\n" +"As thus; he thoughte well that every man\n" +"Will help himself in love if that he can,\n" +"And eke deliver himself out of prison.\n" +"Of women, for they wepten ever-in-one:* *continually\n" +"And eke his hearte had compassion\n" +"And in his gentle heart he thought anon,\n" +"And soft unto himself he saide: \"Fie\n" +"Upon a lord that will have no mercy,\n" +"But be a lion both in word and deed,\n" +"To them that be in repentance and dread,\n" +"As well as-to a proud dispiteous* man *unpitying\n" +"That will maintaine what he first began.\n" +"That lord hath little of discretion,\n" +"That in such case *can no division*: *can make no distinction*\n" +"But weigheth pride and humbless *after one*.\" *alike*\n" +"And shortly, when his ire is thus agone,\n" +"He gan to look on them with eyen light*, *gentle, lenient*\n" +"And spake these same wordes *all on height.* *aloud*\n" +"\n" +"\"The god of love, ah! benedicite*, *bless ye him\n" +"How mighty and how great a lord is he!\n" +"Against his might there gaine* none obstacles, *avail, conquer\n" +"He may be called a god for his miracles\n" +"For he can maken at his owen guise\n" +"Of every heart, as that him list devise.\n" +"Lo here this Arcite, and this Palamon,\n" +"That quietly were out of my prison,\n" +"And might have lived in Thebes royally,\n" +"And weet* I am their mortal enemy, *knew\n" +"And that their death li'th in my might also,\n" +"And yet hath love, *maugre their eyen two*, *in spite of their eyes*\n" +"Y-brought them hither bothe for to die.\n" +"Now look ye, is not this an high folly?\n" +"Who may not be a fool, if but he love?\n" +"Behold, for Godde's sake that sits above,\n" +"See how they bleed! be they not well array'd?\n" +"Thus hath their lord, the god of love, them paid\n" +"Their wages and their fees for their service;\n" +"And yet they weene for to be full wise,\n" +"That serve love, for aught that may befall.\n" +"But this is yet the beste game* of all, *joke\n" +"That she, for whom they have this jealousy,\n" +"Can them therefor as muchel thank as me.\n" +"She wot no more of all this *hote fare*, *hot behaviour*\n" +"By God, than wot a cuckoo or an hare.\n" +"But all must be assayed hot or cold;\n" +"A man must be a fool, or young or old;\n" +"I wot it by myself *full yore agone*: *long years ago*\n" +"For in my time a servant was I one.\n" +"And therefore since I know of love's pain,\n" +"And wot how sore it can a man distrain*, *distress\n" +"As he that oft hath been caught in his last*, *snare <38>\n" +"I you forgive wholly this trespass,\n" +"At request of the queen that kneeleth here,\n" +"And eke of Emily, my sister dear.\n" +"And ye shall both anon unto me swear,\n" +"That never more ye shall my country dere* *injure\n" +"Nor make war upon me night nor day,\n" +"But be my friends in alle that ye may.\n" +"I you forgive this trespass *every deal*. *completely*\n" +"And they him sware *his asking* fair and well, *what he asked*\n" +"And him of lordship and of mercy pray'd,\n" +"And he them granted grace, and thus he said:\n" +"\n" +"\"To speak of royal lineage and richess,\n" +"Though that she were a queen or a princess,\n" +"Each of you both is worthy doubteless\n" +"To wedde when time is; but natheless\n" +"I speak as for my sister Emily,\n" +"For whom ye have this strife and jealousy,\n" +"Ye wot* yourselves, she may not wed the two *know\n" +"At once, although ye fight for evermo:\n" +"But one of you, *all be him loth or lief,* *whether or not he wishes*\n" +"He must *go pipe into an ivy leaf*: *\"go whistle\"*\n" +"This is to say, she may not have you both,\n" +"All be ye never so jealous, nor so wroth.\n" +"And therefore I you put in this degree,\n" +"That each of you shall have his destiny\n" +"As *him is shape*; and hearken in what wise *as is decreed for him*\n" +"Lo hear your end of that I shall devise.\n" +"My will is this, for plain conclusion\n" +"Withouten any replication*, *reply\n" +"If that you liketh, take it for the best,\n" +"That evereach of you shall go where *him lest*, *he pleases\n" +"Freely without ransom or danger;\n" +"And this day fifty weekes, *farre ne nerre*, *neither more nor less*\n" +"Evereach of you shall bring an hundred knights,\n" +"Armed for listes up at alle rights\n" +"All ready to darraine* her by bataille, *contend for\n" +"And this behete* I you withoute fail *promise\n" +"Upon my troth, and as I am a knight,\n" +"That whether of you bothe that hath might,\n" +"That is to say, that whether he or thou\n" +"May with his hundred, as I spake of now,\n" +"Slay his contrary, or out of listes drive,\n" +"Him shall I given Emily to wive,\n" +"To whom that fortune gives so fair a grace.\n" +"The listes shall I make here in this place.\n" +"*And God so wisly on my soule rue*, *may God as surely have\n" +"As I shall even judge be and true. mercy on my soul*\n" +"Ye shall none other ende with me maken\n" +"Than one of you shalle be dead or taken.\n" +"And if you thinketh this is well y-said,\n" +"Say your advice*, and hold yourselves apaid**. *opinion **satisfied\n" +"This is your end, and your conclusion.\"\n" +"Who looketh lightly now but Palamon?\n" +"Who springeth up for joye but Arcite?\n" +"Who could it tell, or who could it indite,\n" +"The joye that is maked in the place\n" +"When Theseus hath done so fair a grace?\n" +"But down on knees went every *manner wight*, *kind of person*\n" +"And thanked him with all their heartes' might,\n" +"And namely* these Thebans *ofte sithe*. *especially *oftentimes*\n" +"And thus with good hope and with hearte blithe\n" +"They take their leave, and homeward gan they ride\n" +"To Thebes-ward, with his old walles wide.\n" +"\n" +"I trow men woulde deem it negligence,\n" +"If I forgot to telle the dispence* *expenditure\n" +"Of Theseus, that went so busily\n" +"To maken up the listes royally,\n" +"That such a noble theatre as it was,\n" +"I dare well say, in all this world there n'as*. *was not\n" +"The circuit a mile was about,\n" +"Walled of stone, and ditched all without.\n" +"*Round was the shape, in manner of compass,\n" +"Full of degrees, the height of sixty pas* *see note <39>*\n" +"That when a man was set on one degree\n" +"He letted* not his fellow for to see. *hindered\n" +"Eastward there stood a gate of marble white,\n" +"Westward right such another opposite.\n" +"And, shortly to conclude, such a place\n" +"Was never on earth made in so little space,\n" +"For in the land there was no craftes-man,\n" +"That geometry or arsmetrike* can**, *arithmetic **knew\n" +"Nor pourtrayor*, nor carver of images, *portrait painter\n" +"That Theseus ne gave him meat and wages\n" +"The theatre to make and to devise.\n" +"And for to do his rite and sacrifice\n" +"He eastward hath upon the gate above,\n" +"In worship of Venus, goddess of love,\n" +"*Done make* an altar and an oratory; *caused to be made*\n" +"And westward, in the mind and in memory\n" +"Of Mars, he maked hath right such another,\n" +"That coste largely of gold a fother*. *a great amount\n" +"And northward, in a turret on the wall,\n" +"Of alabaster white and red coral\n" +"An oratory riche for to see,\n" +"In worship of Diane of chastity,\n" +"Hath Theseus done work in noble wise.\n" +"But yet had I forgotten to devise* *describe\n" +"The noble carving, and the portraitures,\n" +"The shape, the countenance of the figures\n" +"That weren in there oratories three.\n" +"\n" +"First in the temple of Venus may'st thou see\n" +"Wrought on the wall, full piteous to behold,\n" +"The broken sleepes, and the sikes* cold, *sighes\n" +"The sacred teares, and the waimentings*, *lamentings\n" +"The fiery strokes of the desirings,\n" +"That Love's servants in this life endure;\n" +"The oathes, that their covenants assure.\n" +"Pleasance and Hope, Desire, Foolhardiness,\n" +"Beauty and Youth, and Bawdry and Richess,\n" +"Charms and Sorc'ry, Leasings* and Flattery, *falsehoods\n" +"Dispence, Business, and Jealousy,\n" +"That wore of yellow goldes* a garland, *sunflowers <40>\n" +"And had a cuckoo sitting on her hand,\n" +"Feasts, instruments, and caroles and dances,\n" +"Lust and array, and all the circumstances\n" +"Of Love, which I reckon'd and reckon shall\n" +"In order, were painted on the wall,\n" +"And more than I can make of mention.\n" +"For soothly all the mount of Citheron,<41>\n" +"Where Venus hath her principal dwelling,\n" +"Was showed on the wall in pourtraying,\n" +"With all the garden, and the lustiness*. *pleasantness\n" +"Nor was forgot the porter Idleness,\n" +"Nor Narcissus the fair of *yore agone*, *olden times*\n" +"Nor yet the folly of King Solomon,\n" +"Nor yet the greate strength of Hercules,\n" +"Th' enchantments of Medea and Circes,\n" +"Nor of Turnus the hardy fierce courage,\n" +"The rich Croesus *caitif in servage.* <42> *abased into slavery*\n" +"Thus may ye see, that wisdom nor richess,\n" +"Beauty, nor sleight, nor strength, nor hardiness\n" +"Ne may with Venus holde champartie*, *divided possession <43>\n" +"For as her liste the world may she gie*. *guide\n" +"Lo, all these folk so caught were in her las* *snare\n" +"Till they for woe full often said, Alas!\n" +"Suffice these ensamples one or two,\n" +"Although I could reckon a thousand mo'.\n" +"\n" +"The statue of Venus, glorious to see\n" +"Was naked floating in the large sea,\n" +"And from the navel down all cover'd was\n" +"With waves green, and bright as any glass.\n" +"A citole <44> in her right hand hadde she,\n" +"And on her head, full seemly for to see,\n" +"A rose garland fresh, and well smelling,\n" +"Above her head her doves flickering\n" +"Before her stood her sone Cupido,\n" +"Upon his shoulders winges had he two;\n" +"And blind he was, as it is often seen;\n" +"A bow he bare, and arrows bright and keen.\n" +"\n" +"Why should I not as well eke tell you all\n" +"The portraiture, that was upon the wall\n" +"Within the temple of mighty Mars the Red?\n" +"All painted was the wall in length and brede* *breadth\n" +"Like to the estres* of the grisly place *interior chambers\n" +"That hight the great temple of Mars in Thrace,\n" +"In thilke* cold and frosty region, *that\n" +"There as Mars hath his sovereign mansion.\n" +"In which there dwelled neither man nor beast,\n" +"With knotty gnarry* barren trees old *gnarled\n" +"Of stubbes sharp and hideous to behold;\n" +"In which there ran a rumble and a sough*, *groaning noise\n" +"As though a storm should bursten every bough:\n" +"And downward from an hill under a bent* *slope\n" +"There stood the temple of Mars Armipotent,\n" +"Wrought all of burnish'd steel, of which th' entry\n" +"Was long and strait, and ghastly for to see.\n" +"And thereout came *a rage and such a vise*, *such a furious voice*\n" +"That it made all the gates for to rise.\n" +"The northern light in at the doore shone,\n" +"For window on the walle was there none\n" +"Through which men mighten any light discern.\n" +"The doors were all of adamant etern,\n" +"Y-clenched *overthwart and ende-long* *crossways and lengthways*\n" +"With iron tough, and, for to make it strong,\n" +"Every pillar the temple to sustain\n" +"Was tunne-great*, of iron bright and sheen. *thick as a tun (barrel)\n" +"There saw I first the dark imagining\n" +"Of felony, and all the compassing;\n" +"The cruel ire, as red as any glede*, *live coal\n" +"The picke-purse<45>, and eke the pale dread;\n" +"The smiler with the knife under the cloak,\n" +"The shepen* burning with the blacke smoke *stable <46>\n" +"The treason of the murd'ring in the bed,\n" +"The open war, with woundes all be-bled;\n" +"Conteke* with bloody knife, and sharp menace. *contention, discord\n" +"All full of chirking* was that sorry place. *creaking, jarring noise\n" +"The slayer of himself eke saw I there,\n" +"His hearte-blood had bathed all his hair:\n" +"The nail y-driven in the shode* at night, *hair of the head <47>\n" +"The colde death, with mouth gaping upright.\n" +"Amiddes of the temple sat Mischance,\n" +"With discomfort and sorry countenance;\n" +"Eke saw I Woodness* laughing in his rage, *Madness\n" +"Armed Complaint, Outhees*, and fierce Outrage; *Outcry\n" +"The carrain* in the bush, with throat y-corve**, *corpse **slashed\n" +"A thousand slain, and not *of qualm y-storve*; *dead of sickness*\n" +"The tyrant, with the prey by force y-reft;\n" +"The town destroy'd, that there was nothing left.\n" +"Yet saw I brent* the shippes hoppesteres, <48> *burnt\n" +"The hunter strangled with the wilde bears:\n" +"The sow freting* the child right in the cradle; *devouring <49>\n" +"The cook scalded, for all his longe ladle.\n" +"Nor was forgot, *by th'infortune of Mart* *through the misfortune\n" +"The carter overridden with his cart; of war*\n" +"Under the wheel full low he lay adown.\n" +"There were also of Mars' division,\n" +"The armourer, the bowyer*, and the smith, *maker of bows\n" +"That forgeth sharp swordes on his stith*. *anvil\n" +"And all above depainted in a tower\n" +"Saw I Conquest, sitting in great honour,\n" +"With thilke* sharpe sword over his head *that\n" +"Hanging by a subtle y-twined thread.\n" +"Painted the slaughter was of Julius<50>,\n" +"Of cruel Nero, and Antonius:\n" +"Although at that time they were yet unborn,\n" +"Yet was their death depainted there beforn,\n" +"By menacing of Mars, right by figure,\n" +"So was it showed in that portraiture,\n" +"As is depainted in the stars above,\n" +"Who shall be slain, or elles dead for love.\n" +"Sufficeth one ensample in stories old,\n" +"I may not reckon them all, though I wo'ld.\n" +"\n" +"The statue of Mars upon a carte* stood *chariot\n" +"Armed, and looked grim as he were wood*, *mad\n" +"And over his head there shone two figures\n" +"Of starres, that be cleped in scriptures,\n" +"That one Puella, that other Rubeus. <51>\n" +"This god of armes was arrayed thus:\n" +"A wolf there stood before him at his feet\n" +"With eyen red, and of a man he eat:\n" +"With subtle pencil painted was this story,\n" +"In redouting* of Mars and of his glory. *reverance, fear\n" +"\n" +"Now to the temple of Dian the chaste\n" +"As shortly as I can I will me haste,\n" +"To telle you all the descriptioun.\n" +"Depainted be the walles up and down\n" +"Of hunting and of shamefast chastity.\n" +"There saw I how woful Calistope,<52>\n" +"When that Dian aggrieved was with her,\n" +"Was turned from a woman to a bear,\n" +"And after was she made the lodestar*: *pole star\n" +"Thus was it painted, I can say no far*; *farther\n" +"Her son is eke a star as men may see.\n" +"There saw I Dane <53> turn'd into a tree,\n" +"I meane not the goddess Diane,\n" +"But Peneus' daughter, which that hight Dane.\n" +"There saw I Actaeon an hart y-maked*, *made\n" +"For vengeance that he saw Dian all naked:\n" +"I saw how that his houndes have him caught,\n" +"And freten* him, for that they knew him not. *devour\n" +"Yet painted was, a little farthermore\n" +"How Atalanta hunted the wild boar;\n" +"And Meleager, and many other mo',\n" +"For which Diana wrought them care and woe.\n" +"There saw I many another wondrous story,\n" +"The which me list not drawen to memory.\n" +"This goddess on an hart full high was set*, *seated\n" +"With smalle houndes all about her feet,\n" +"And underneath her feet she had a moon,\n" +"Waxing it was, and shoulde wane soon.\n" +"In gaudy green her statue clothed was,\n" +"With bow in hand, and arrows in a case*. *quiver\n" +"Her eyen caste she full low adown,\n" +"Where Pluto hath his darke regioun.\n" +"A woman travailing was her beforn,\n" +"But, for her child so longe was unborn,\n" +"Full piteously Lucina <54> gan she call,\n" +"And saide; \"Help, for thou may'st best of all.\"\n" +"Well could he painte lifelike that it wrought;\n" +"With many a florin he the hues had bought.\n" +"Now be these listes made, and Theseus,\n" +"That at his greate cost arrayed thus\n" +"The temples, and the theatre every deal*, *part <55>\n" +"When it was done, him liked wonder well.\n" +"\n" +"But stint* I will of Theseus a lite**, *cease speaking **little\n" +"And speak of Palamon and of Arcite.\n" +"The day approacheth of their returning,\n" +"That evereach an hundred knights should bring,\n" +"The battle to darraine* as I you told; *contest\n" +"And to Athens, their covenant to hold,\n" +"Hath ev'reach of them brought an hundred knights,\n" +"Well-armed for the war at alle rights.\n" +"And sickerly* there trowed** many a man, *surely <56> **believed\n" +"That never, sithen* that the world began, *since\n" +"For to speaken of knighthood of their hand,\n" +"As far as God hath maked sea and land,\n" +"Was, of so few, so noble a company.\n" +"For every wight that loved chivalry,\n" +"And would, *his thankes, have a passant name*, *thanks to his own\n" +"Had prayed, that he might be of that game, efforts, have a\n" +"And well was him, that thereto chosen was. surpassing name*\n" +"For if there fell to-morrow such a case,\n" +"Ye knowe well, that every lusty knight,\n" +"That loveth par amour, and hath his might\n" +"Were it in Engleland, or elleswhere,\n" +"They would, their thankes, willen to be there,\n" +"T' fight for a lady; Benedicite,\n" +"It were a lusty* sighte for to see. *pleasing\n" +"And right so fared they with Palamon;\n" +"With him there wente knightes many one.\n" +"Some will be armed in an habergeon,\n" +"And in a breast-plate, and in a gipon*; *short doublet.\n" +"And some will have *a pair of plates* large; *back and front armour*\n" +"And some will have a Prusse* shield, or targe; *Prussian\n" +"Some will be armed on their legges weel;\n" +"Some have an axe, and some a mace of steel.\n" +"There is no newe guise*, but it was old. *fashion\n" +"Armed they weren, as I have you told,\n" +"Evereach after his opinion.\n" +"There may'st thou see coming with Palamon\n" +"Licurgus himself, the great king of Thrace:\n" +"Black was his beard, and manly was his face.\n" +"The circles of his eyen in his head\n" +"They glowed betwixte yellow and red,\n" +"And like a griffin looked he about,\n" +"With kemped* haires on his browes stout; *combed<57>\n" +"His limbs were great, his brawns were hard and strong,\n" +"His shoulders broad, his armes round and long.\n" +"And as the guise* was in his country, *fashion\n" +"Full high upon a car of gold stood he,\n" +"With foure white bulles in the trace.\n" +"Instead of coat-armour on his harness,\n" +"With yellow nails, and bright as any gold,\n" +"He had a beare's skin, coal-black for old*. *age\n" +"His long hair was y-kempt behind his back,\n" +"As any raven's feather it shone for black.\n" +"A wreath of gold *arm-great*, of huge weight, *thick as a man's arm*\n" +"Upon his head sate, full of stones bright,\n" +"Of fine rubies and clear diamants.\n" +"About his car there wente white alauns*, *greyhounds <58>\n" +"Twenty and more, as great as any steer,\n" +"To hunt the lion or the wilde bear,\n" +"And follow'd him, with muzzle fast y-bound,\n" +"Collars of gold, and torettes* filed round. *rings\n" +"An hundred lordes had he in his rout* *retinue\n" +"Armed full well, with heartes stern and stout.\n" +"\n" +"With Arcita, in stories as men find,\n" +"The great Emetrius the king of Ind,\n" +"Upon a *steede bay* trapped in steel, *bay horse*\n" +"Cover'd with cloth of gold diapred* well, *decorated\n" +"Came riding like the god of armes, Mars.\n" +"His coat-armour was of *a cloth of Tars*, *a kind of silk*\n" +"Couched* with pearls white and round and great *trimmed\n" +"His saddle was of burnish'd gold new beat;\n" +"A mantelet on his shoulders hanging,\n" +"Bretful* of rubies red, as fire sparkling. *brimful\n" +"His crispe hair like ringes was y-run,\n" +"And that was yellow, glittering as the sun.\n" +"His nose was high, his eyen bright citrine*, *pale yellow\n" +"His lips were round, his colour was sanguine,\n" +"A fewe fracknes* in his face y-sprent**, *freckles **sprinkled\n" +"Betwixte yellow and black somedeal y-ment* *mixed <59>\n" +"And as a lion he *his looking cast* *cast about his eyes*\n" +"Of five and twenty year his age I cast* *reckon\n" +"His beard was well begunnen for to spring;\n" +"His voice was as a trumpet thundering.\n" +"Upon his head he wore of laurel green\n" +"A garland fresh and lusty to be seen;\n" +"Upon his hand he bare, for his delight,\n" +"An eagle tame, as any lily white.\n" +"An hundred lordes had he with him there,\n" +"All armed, save their heads, in all their gear,\n" +"Full richely in alle manner things.\n" +"For trust ye well, that earles, dukes, and kings\n" +"Were gather'd in this noble company,\n" +"For love, and for increase of chivalry.\n" +"About this king there ran on every part\n" +"Full many a tame lion and leopart.\n" +"And in this wise these lordes *all and some* *all and sundry*\n" +"Be on the Sunday to the city come\n" +"Aboute prime<60>, and in the town alight.\n" +"\n" +"This Theseus, this Duke, this worthy knight\n" +"When he had brought them into his city,\n" +"And inned* them, ev'reach at his degree, *lodged\n" +"He feasteth them, and doth so great labour\n" +"To *easen them*, and do them all honour, *make them comfortable*\n" +"That yet men weene* that no mannes wit *think\n" +"Of none estate could amenden* it. *improve\n" +"The minstrelsy, the service at the feast,\n" +"The greate giftes to the most and least,\n" +"The rich array of Theseus' palace,\n" +"Nor who sate first or last upon the dais.<61>\n" +"What ladies fairest be, or best dancing\n" +"Or which of them can carol best or sing,\n" +"Or who most feelingly speaketh of love;\n" +"What hawkes sitten on the perch above,\n" +"What houndes liggen* on the floor adown, *lie\n" +"Of all this now make I no mentioun\n" +"But of th'effect; that thinketh me the best\n" +"Now comes the point, and hearken if you lest.* *please\n" +"\n" +"The Sunday night, ere day began to spring,\n" +"When Palamon the larke hearde sing,\n" +"Although it were not day by houres two,\n" +"Yet sang the lark, and Palamon right tho* *then\n" +"With holy heart, and with an high courage,\n" +"Arose, to wenden* on his pilgrimage *go\n" +"Unto the blissful Cithera benign,\n" +"I meane Venus, honourable and digne*. *worthy\n" +"And in her hour <62> he walketh forth a pace\n" +"Unto the listes, where her temple was,\n" +"And down he kneeleth, and with humble cheer* *demeanour\n" +}; + + +void setup() { + int i=0; + uint8_t c; + Serial.begin(115200); + do { + c = pgm_read_byte_far(pgm_get_far_address(knightsTale)+i); + if (c) Serial.write(c); + i++; + } while (c); + i = 0; + do { + c = pgm_read_byte_far(pgm_get_far_address(knightsTale2)+i); + if (c) Serial.write(c); + i++; + } while (c); + i = 0; + do { + c = pgm_read_byte_far(pgm_get_far_address(knightsTale3)+i); + if (c) Serial.write(c); + i++; + } while (c); + i = 0; + do { + c = pgm_read_byte_far(pgm_get_far_address(knightsTale4)+i); + if (c) Serial.write(c); + i++; + } while (c); + i = 0; + do { + c = pgm_read_byte_far(pgm_get_far_address(knightsTale5)+i); + if (c) Serial.write(c); + i++; + } while (c); + i = 0; + do { + c = pgm_read_byte_far(pgm_get_far_address(knightsTale6)+i); + if (c) Serial.write(c); + i++; + } while (c); +} + +void loop() { +} diff --git a/ActualOptiboot/optiboot/examples/chaucer32k/chaucer32k.ino b/ActualOptiboot/optiboot/examples/chaucer32k/chaucer32k.ino new file mode 100644 index 0000000..8112a1c --- /dev/null +++ b/ActualOptiboot/optiboot/examples/chaucer32k/chaucer32k.ino @@ -0,0 +1,679 @@ +// Text is an extract from The Canterbury Tales +// Full text at http://www.gutenberg.org/dirs/etext00/cbtls12.txt +#include + +const char knightsTale[] PROGMEM= { +" THE KNIGHT'S TALE <1>\n" +"\n" +"\n" +"WHILOM*, as olde stories tellen us, *formerly\n" +"There was a duke that highte* Theseus. *was called <2>\n" +"Of Athens he was lord and governor,\n" +"And in his time such a conqueror\n" +"That greater was there none under the sun.\n" +"Full many a riche country had he won.\n" +"What with his wisdom and his chivalry,\n" +"He conquer'd all the regne of Feminie,<3>\n" +"That whilom was y-cleped Scythia;\n" +"And weddede the Queen Hippolyta\n" +"And brought her home with him to his country\n" +"With muchel* glory and great solemnity, *great\n" +"And eke her younge sister Emily,\n" +"And thus with vict'ry and with melody\n" +"Let I this worthy Duke to Athens ride,\n" +"And all his host, in armes him beside.\n" +"\n" +"And certes, if it n'ere* too long to hear, *were not\n" +"I would have told you fully the mannere,\n" +"How wonnen* was the regne of Feminie, <4> *won\n" +"By Theseus, and by his chivalry;\n" +"And of the greate battle for the nonce\n" +"Betwixt Athenes and the Amazons;\n" +"And how assieged was Hippolyta,\n" +"The faire hardy queen of Scythia;\n" +"And of the feast that was at her wedding\n" +"And of the tempest at her homecoming.\n" +"But all these things I must as now forbear.\n" +"I have, God wot, a large field to ear* *plough<5>;\n" +"And weake be the oxen in my plough;\n" +"The remnant of my tale is long enow.\n" +"I will not *letten eke none of this rout*. *hinder any of\n" +"Let every fellow tell his tale about, this company*\n" +"And let see now who shall the supper win.\n" +"There *as I left*, I will again begin. *where I left off*\n" +"\n" +"This Duke, of whom I make mentioun,\n" +"When he was come almost unto the town,\n" +"In all his weal, and in his moste pride,\n" +"He was ware, as he cast his eye aside,\n" +"Where that there kneeled in the highe way\n" +"A company of ladies, tway and tway,\n" +"Each after other, clad in clothes black:\n" +"But such a cry and such a woe they make,\n" +"That in this world n'is creature living,\n" +"That hearde such another waimenting* *lamenting <6>\n" +"And of this crying would they never stenten*, *desist\n" +"Till they the reines of his bridle henten*. *seize\n" +"\"What folk be ye that at mine homecoming\n" +"Perturben so my feaste with crying?\"\n" +"Quoth Theseus; \"Have ye so great envy\n" +"Of mine honour, that thus complain and cry?\n" +"Or who hath you misboden*, or offended? *wronged\n" +"Do telle me, if it may be amended;\n" +"And why that ye be clad thus all in black?\"\n" +"\n" +"The oldest lady of them all then spake,\n" +"When she had swooned, with a deadly cheer*, *countenance\n" +"That it was ruthe* for to see or hear. *pity\n" +"She saide; \"Lord, to whom fortune hath given\n" +"Vict'ry, and as a conqueror to liven,\n" +"Nought grieveth us your glory and your honour;\n" +"But we beseechen mercy and succour.\n" +"Have mercy on our woe and our distress;\n" +"Some drop of pity, through thy gentleness,\n" +"Upon us wretched women let now fall.\n" +"For certes, lord, there is none of us all\n" +"That hath not been a duchess or a queen;\n" +"Now be we caitives*, as it is well seen: *captives\n" +"Thanked be Fortune, and her false wheel,\n" +"That *none estate ensureth to be wele*. *assures no continuance of\n" +"And certes, lord, t'abiden your presence prosperous estate*\n" +"Here in this temple of the goddess Clemence\n" +"We have been waiting all this fortenight:\n" +"Now help us, lord, since it lies in thy might.\n" +"\n" +"\"I, wretched wight, that weep and waile thus,\n" +"Was whilom wife to king Capaneus,\n" +"That starf* at Thebes, cursed be that day: *died <7>\n" +"And alle we that be in this array,\n" +"And maken all this lamentatioun,\n" +"We losten all our husbands at that town,\n" +"While that the siege thereabouten lay.\n" +"And yet the olde Creon, wellaway!\n" +"That lord is now of Thebes the city,\n" +"Fulfilled of ire and of iniquity,\n" +"He for despite, and for his tyranny,\n" +"To do the deade bodies villainy*, *insult\n" +"Of all our lorde's, which that been y-slaw, *slain\n" +"Hath all the bodies on an heap y-draw,\n" +"And will not suffer them by none assent\n" +"Neither to be y-buried, nor y-brent*, *burnt\n" +"But maketh houndes eat them in despite.\"\n" +"And with that word, withoute more respite\n" +"They fallen groff,* and cryden piteously; *grovelling\n" +"\"Have on us wretched women some mercy,\n" +"And let our sorrow sinken in thine heart.\"\n" +"\n" +"This gentle Duke down from his courser start\n" +"With hearte piteous, when he heard them speak.\n" +"Him thoughte that his heart would all to-break,\n" +"When he saw them so piteous and so mate* *abased\n" +"That whilom weren of so great estate.\n" +"And in his armes he them all up hent*, *raised, took\n" +"And them comforted in full good intent,\n" +"And swore his oath, as he was true knight,\n" +"He woulde do *so farforthly his might* *as far as his power went*\n" +"Upon the tyrant Creon them to wreak*, *avenge\n" +"That all the people of Greece shoulde speak,\n" +"How Creon was of Theseus y-served,\n" +"As he that had his death full well deserved.\n" +"And right anon withoute more abode* *delay\n" +"His banner he display'd, and forth he rode\n" +"To Thebes-ward, and all his, host beside:\n" +"No ner* Athenes would he go nor ride, *nearer\n" +"Nor take his ease fully half a day,\n" +"But onward on his way that night he lay:\n" +"And sent anon Hippolyta the queen,\n" +"And Emily her younge sister sheen* *bright, lovely\n" +"Unto the town of Athens for to dwell:\n" +"And forth he rit*; there is no more to tell. *rode\n" +"\n" +"The red statue of Mars with spear and targe* *shield\n" +"So shineth in his white banner large\n" +"That all the fieldes glitter up and down:\n" +"And by his banner borne is his pennon\n" +"Of gold full rich, in which there was y-beat* *stamped\n" +"The Minotaur<8> which that he slew in Crete\n" +"Thus rit this Duke, thus rit this conqueror\n" +"And in his host of chivalry the flower,\n" +"Till that he came to Thebes, and alight\n" +"Fair in a field, there as he thought to fight.\n" +"But shortly for to speaken of this thing,\n" +"With Creon, which that was of Thebes king,\n" +"He fought, and slew him manly as a knight\n" +"In plain bataille, and put his folk to flight:\n" +"And by assault he won the city after,\n" +"And rent adown both wall, and spar, and rafter;\n" +"And to the ladies he restored again\n" +"The bodies of their husbands that were slain,\n" +"To do obsequies, as was then the guise*. *custom\n" +"\n" +"But it were all too long for to devise* *describe\n" +"The greate clamour, and the waimenting*, *lamenting\n" +"Which that the ladies made at the brenning* *burning\n" +"Of the bodies, and the great honour\n" +"That Theseus the noble conqueror\n" +"Did to the ladies, when they from him went:\n" +"But shortly for to tell is mine intent.\n" +"When that this worthy Duke, this Theseus,\n" +"Had Creon slain, and wonnen Thebes thus,\n" +"Still in the field he took all night his rest,\n" +"And did with all the country as him lest*. *pleased\n" +"To ransack in the tas* of bodies dead, *heap\n" +"Them for to strip of *harness and of **weed, *armour **clothes\n" +"The pillers* did their business and cure, *pillagers <9>\n" +"After the battle and discomfiture.\n" +"And so befell, that in the tas they found,\n" +"Through girt with many a grievous bloody wound,\n" +"Two younge knightes *ligging by and by* *lying side by side*\n" +"Both in *one armes*, wrought full richely: *the same armour*\n" +"Of whiche two, Arcita hight that one,\n" +"And he that other highte Palamon.\n" +"Not fully quick*, nor fully dead they were, *alive\n" +"But by their coat-armour, and by their gear,\n" +"The heralds knew them well in special,\n" +"As those that weren of the blood royal\n" +"Of Thebes, and *of sistren two y-born*. *born of two sisters*\n" +"Out of the tas the pillers have them torn,\n" +"And have them carried soft unto the tent\n" +"Of Theseus, and he full soon them sent\n" +"To Athens, for to dwellen in prison\n" +"Perpetually, he *n'olde no ranson*. *would take no ransom*\n" +"And when this worthy Duke had thus y-done,\n" +"He took his host, and home he rit anon\n" +"With laurel crowned as a conquerour;\n" +"And there he lived in joy and in honour\n" +"Term of his life; what needeth wordes mo'?\n" +"And in a tower, in anguish and in woe,\n" +"Dwellen this Palamon, and eke Arcite,\n" +"For evermore, there may no gold them quite* *set free\n" +"\n" +"Thus passed year by year, and day by day,\n" +"Till it fell ones in a morn of May\n" +"That Emily, that fairer was to seen\n" +"Than is the lily upon his stalke green,\n" +"And fresher than the May with flowers new\n" +"(For with the rose colour strove her hue;\n" +"I n'ot* which was the finer of them two), *know not\n" +"Ere it was day, as she was wont to do,\n" +"She was arisen, and all ready dight*, *dressed\n" +"For May will have no sluggardy a-night;\n" +"The season pricketh every gentle heart,\n" +"And maketh him out of his sleep to start,\n" +"And saith, \"Arise, and do thine observance.\"\n" +"\n" +"This maketh Emily have remembrance\n" +"To do honour to May, and for to rise.\n" +"Y-clothed was she fresh for to devise;\n" +"Her yellow hair was braided in a tress,\n" +"Behind her back, a yarde long I guess.\n" +"And in the garden at *the sun uprist* *sunrise\n" +"She walketh up and down where as her list.\n" +"She gathereth flowers, party* white and red, *mingled\n" +"To make a sotel* garland for her head, *subtle, well-arranged\n" +"And as an angel heavenly she sung.\n" +"The greate tower, that was so thick and strong,\n" +"Which of the castle was the chief dungeon<10>\n" +"(Where as these knightes weren in prison,\n" +"Of which I tolde you, and telle shall),\n" +"Was even joinant* to the garden wall, *adjoining\n" +"There as this Emily had her playing.\n" +"\n" +"Bright was the sun, and clear that morrowning,\n" +"And Palamon, this woful prisoner,\n" +"As was his wont, by leave of his gaoler,\n" +"Was ris'n, and roamed in a chamber on high,\n" +"In which he all the noble city sigh*, *saw\n" +"And eke the garden, full of branches green,\n" +"There as this fresh Emelia the sheen\n" +"Was in her walk, and roamed up and down.\n" +"This sorrowful prisoner, this Palamon\n" +"Went in his chamber roaming to and fro,\n" +"And to himself complaining of his woe:\n" +"That he was born, full oft he said, Alas!\n" +"And so befell, by aventure or cas*, *chance\n" +"That through a window thick of many a bar\n" +"Of iron great, and square as any spar,\n" +"He cast his eyes upon Emelia,\n" +"And therewithal he blent* and cried, Ah! *started aside\n" +"As though he stungen were unto the heart.\n" +"And with that cry Arcite anon up start,\n" +"And saide, \"Cousin mine, what aileth thee,\n" +"That art so pale and deadly for to see?\n" +"Why cried'st thou? who hath thee done offence?\n" +"For Godde's love, take all in patience\n" +"Our prison*, for it may none other be. *imprisonment\n" +"Fortune hath giv'n us this adversity'.\n" +"Some wick'* aspect or disposition *wicked\n" +"Of Saturn<11>, by some constellation,\n" +"Hath giv'n us this, although we had it sworn,\n" +"So stood the heaven when that we were born,\n" +"We must endure; this is the short and plain.\n" +"\n" +"This Palamon answer'd, and said again:\n" +"\"Cousin, forsooth of this opinion\n" +"Thou hast a vain imagination.\n" +"This prison caused me not for to cry;\n" +"But I was hurt right now thorough mine eye\n" +"Into mine heart; that will my bane* be. *destruction\n" +"The fairness of the lady that I see\n" +"Yond in the garden roaming to and fro,\n" +"Is cause of all my crying and my woe.\n" +"I *n'ot wher* she be woman or goddess, *know not whether*\n" +"But Venus is it, soothly* as I guess, *truly\n" +"And therewithal on knees adown he fill,\n" +"And saide: \"Venus, if it be your will\n" +"You in this garden thus to transfigure\n" +"Before me sorrowful wretched creature,\n" +"Out of this prison help that we may scape.\n" +"And if so be our destiny be shape\n" +"By etern word to dien in prison,\n" +"Of our lineage have some compassion,\n" +"That is so low y-brought by tyranny.\"\n" +"\n" +"And with that word Arcita *gan espy* *began to look forth*\n" +"Where as this lady roamed to and fro\n" +"And with that sight her beauty hurt him so,\n" +"That if that Palamon was wounded sore,\n" +"Arcite is hurt as much as he, or more.\n" +"And with a sigh he saide piteously:\n" +"\"The freshe beauty slay'th me suddenly\n" +"Of her that roameth yonder in the place.\n" +"And but* I have her mercy and her grace, *unless\n" +"That I may see her at the leaste way,\n" +"I am but dead; there is no more to say.\"\n" +"This Palamon, when he these wordes heard,\n" +"Dispiteously* he looked, and answer'd: *angrily\n" +"\"Whether say'st thou this in earnest or in play?\"\n" +"\"Nay,\" quoth Arcite, \"in earnest, by my fay*. *faith\n" +"God help me so, *me lust full ill to play*.\" *I am in no humour\n" +"This Palamon gan knit his browes tway. for jesting*\n" +"\"It were,\" quoth he, \"to thee no great honour\n" +"For to be false, nor for to be traitour\n" +"To me, that am thy cousin and thy brother\n" +"Y-sworn full deep, and each of us to other,\n" +"That never for to dien in the pain <12>,\n" +"Till that the death departen shall us twain,\n" +"Neither of us in love to hinder other,\n" +"Nor in none other case, my leve* brother; *dear\n" +"But that thou shouldest truly farther me\n" +"In every case, as I should farther thee.\n" +"This was thine oath, and mine also certain;\n" +"I wot it well, thou dar'st it not withsayn*, *deny\n" +"Thus art thou of my counsel out of doubt,\n" +"And now thou wouldest falsely be about\n" +"To love my lady, whom I love and serve,\n" +"And ever shall, until mine hearte sterve* *die\n" +"Now certes, false Arcite, thou shalt not so\n" +"I lov'd her first, and tolde thee my woe\n" +"As to my counsel, and my brother sworn\n" +"To farther me, as I have told beforn.\n" +"For which thou art y-bounden as a knight\n" +"To helpe me, if it lie in thy might,\n" +"Or elles art thou false, I dare well sayn,\"\n" +"\n" +"This Arcita full proudly spake again:\n" +"\"Thou shalt,\" quoth he, \"be rather* false than I, *sooner\n" +"And thou art false, I tell thee utterly;\n" +"For par amour I lov'd her first ere thou.\n" +"What wilt thou say? *thou wist it not right now* *even now thou\n" +"Whether she be a woman or goddess. knowest not*\n" +"Thine is affection of holiness,\n" +"And mine is love, as to a creature:\n" +"For which I tolde thee mine aventure\n" +"As to my cousin, and my brother sworn\n" +"I pose*, that thou loved'st her beforn: *suppose\n" +"Wost* thou not well the olde clerke's saw<13>, *know'st\n" +"That who shall give a lover any law?\n" +"Love is a greater lawe, by my pan,\n" +"Than may be giv'n to any earthly man:\n" +"Therefore positive law, and such decree,\n" +"Is broke alway for love in each degree\n" +"A man must needes love, maugre his head.\n" +"He may not flee it, though he should be dead,\n" +"*All be she* maid, or widow, or else wife. *whether she be*\n" +"And eke it is not likely all thy life\n" +"To standen in her grace, no more than I\n" +"For well thou wost thyselfe verily,\n" +"That thou and I be damned to prison\n" +"Perpetual, us gaineth no ranson.\n" +"We strive, as did the houndes for the bone;\n" +"They fought all day, and yet their part was none.\n" +"There came a kite, while that they were so wroth,\n" +"And bare away the bone betwixt them both.\n" +"And therefore at the kinge's court, my brother,\n" +"Each man for himselfe, there is no other.\n" +"Love if thee list; for I love and aye shall\n" +"And soothly, leve brother, this is all.\n" +"Here in this prison musten we endure,\n" +"And each of us take his Aventure.\"\n" +"\n" +"Great was the strife and long between these tway,\n" +"If that I hadde leisure for to say;\n" +"But to the effect: it happen'd on a day\n" +"(To tell it you as shortly as I may),\n" +"A worthy duke that hight Perithous<14>\n" +"That fellow was to the Duke Theseus\n" +"Since thilke* day that they were children lite** *that **little\n" +"Was come to Athens, his fellow to visite,\n" +"And for to play, as he was wont to do;\n" +"For in this world he loved no man so;\n" +"And he lov'd him as tenderly again.\n" +"So well they lov'd, as olde bookes sayn,\n" +"That when that one was dead, soothly to sayn,\n" +"His fellow went and sought him down in hell:\n" +"But of that story list me not to write.\n" +"Duke Perithous loved well Arcite,\n" +"And had him known at Thebes year by year:\n" +"And finally at request and prayere\n" +"Of Perithous, withoute ranson\n" +"Duke Theseus him let out of prison,\n" +"Freely to go, where him list over all,\n" +"In such a guise, as I you tellen shall\n" +"This was the forword*, plainly to indite, *promise\n" +"Betwixte Theseus and him Arcite:\n" +"That if so were, that Arcite were y-found\n" +"Ever in his life, by day or night, one stound* *moment<15>\n" +"In any country of this Theseus,\n" +"And he were caught, it was accorded thus,\n" +"That with a sword he shoulde lose his head;\n" +"There was none other remedy nor rede*. *counsel\n" +"But took his leave, and homeward he him sped;\n" +"Let him beware, his necke lieth *to wed*. *in pledge*\n" +"\n" +"How great a sorrow suff'reth now Arcite!\n" +"The death he feeleth through his hearte smite;\n" +"He weepeth, waileth, crieth piteously;\n" +"To slay himself he waiteth privily.\n" +"He said; \"Alas the day that I was born!\n" +"Now is my prison worse than beforn:\n" +"*Now is me shape* eternally to dwell *it is fixed for me*\n" +"Not in purgatory, but right in hell.\n" +"Alas! that ever I knew Perithous.\n" +"For elles had I dwelt with Theseus\n" +"Y-fettered in his prison evermo'.\n" +"Then had I been in bliss, and not in woe.\n" +"Only the sight of her, whom that I serve,\n" +"Though that I never may her grace deserve,\n" +"Would have sufficed right enough for me.\n" +"O deare cousin Palamon,\" quoth he,\n" +"\"Thine is the vict'ry of this aventure,\n" +"Full blissfully in prison to endure:\n" +"In prison? nay certes, in paradise.\n" +"Well hath fortune y-turned thee the dice,\n" +"That hast the sight of her, and I th' absence.\n" +"For possible is, since thou hast her presence,\n" +"And art a knight, a worthy and an able,\n" +"That by some cas*, since fortune is changeable, *chance\n" +"Thou may'st to thy desire sometime attain.\n" +"But I that am exiled, and barren\n" +"Of alle grace, and in so great despair,\n" +"That there n'is earthe, water, fire, nor air,\n" +"Nor creature, that of them maked is,\n" +"That may me helpe nor comfort in this,\n" +"Well ought I *sterve in wanhope* and distress. *die in despair*\n" +"Farewell my life, my lust*, and my gladness. *pleasure\n" +"Alas, *why plainen men so in commune *why do men so often complain\n" +"Of purveyance of God*, or of Fortune, of God's providence?*\n" +"That giveth them full oft in many a guise\n" +"Well better than they can themselves devise?\n" +"Some man desireth for to have richess,\n" +"That cause is of his murder or great sickness.\n" +"And some man would out of his prison fain,\n" +"That in his house is of his meinie* slain. *servants <16>\n" +"Infinite harmes be in this mattere.\n" +"We wot never what thing we pray for here.\n" +"We fare as he that drunk is as a mouse.\n" +"A drunken man wot well he hath an house,\n" +"But he wot not which is the right way thither,\n" +"And to a drunken man the way is slither*. *slippery\n" +"And certes in this world so fare we.\n" +"We seeke fast after felicity,\n" +"But we go wrong full often truely.\n" +"Thus we may sayen all, and namely* I, *especially\n" +"That ween'd*, and had a great opinion, *thought\n" +"That if I might escape from prison\n" +"Then had I been in joy and perfect heal,\n" +"Where now I am exiled from my weal.\n" +"Since that I may not see you, Emily,\n" +"I am but dead; there is no remedy.\"\n" +"\n" +"Upon that other side, Palamon,\n" +"When that he wist Arcita was agone,\n" +"Much sorrow maketh, that the greate tower\n" +"Resounded of his yelling and clamour\n" +"The pure* fetters on his shinnes great *very <17>\n" +"Were of his bitter salte teares wet.\n" +"\n" +"\"Alas!\" quoth he, \"Arcita, cousin mine,\n" +"Of all our strife, God wot, the fruit is thine.\n" +"Thou walkest now in Thebes at thy large,\n" +"And of my woe thou *givest little charge*. *takest little heed*\n" +"Thou mayst, since thou hast wisdom and manhead*, *manhood, courage\n" +"Assemble all the folk of our kindred,\n" +"And make a war so sharp on this country\n" +"That by some aventure, or some treaty,\n" +"Thou mayst have her to lady and to wife,\n" +"For whom that I must needes lose my life.\n" +"For as by way of possibility,\n" +"Since thou art at thy large, of prison free,\n" +"And art a lord, great is thine avantage,\n" +"More than is mine, that sterve here in a cage.\n" +"For I must weep and wail, while that I live,\n" +"With all the woe that prison may me give,\n" +"And eke with pain that love me gives also,\n" +"That doubles all my torment and my woe.\"\n" +"\n" +"Therewith the fire of jealousy upstart\n" +"Within his breast, and hent* him by the heart *seized\n" +"So woodly*, that he like was to behold *madly\n" +"The box-tree, or the ashes dead and cold.\n" +"Then said; \"O cruel goddess, that govern\n" +"This world with binding of your word etern* *eternal\n" +"And writen in the table of adamant\n" +"Your parlement* and your eternal grant, *consultation\n" +"What is mankind more *unto you y-hold* *by you esteemed\n" +"Than is the sheep, that rouketh* in the fold! *lie huddled together\n" +"For slain is man, right as another beast;\n" +"And dwelleth eke in prison and arrest,\n" +"And hath sickness, and great adversity,\n" +"And oftentimes guilteless, pardie* *by God\n" +"What governance is in your prescience,\n" +"That guilteless tormenteth innocence?\n" +"And yet increaseth this all my penance,\n" +"That man is bounden to his observance\n" +"For Godde's sake to *letten of his will*, *restrain his desire*\n" +"Whereas a beast may all his lust fulfil.\n" +"And when a beast is dead, he hath no pain;\n" +"But man after his death must weep and plain,\n" +"Though in this worlde he have care and woe:\n" +"Withoute doubt it maye standen so.\n" +"\"The answer of this leave I to divines,\n" +"But well I wot, that in this world great pine* is; *pain, trouble\n" +"Alas! I see a serpent or a thief\n" +"That many a true man hath done mischief,\n" +"Go at his large, and where him list may turn.\n" +"But I must be in prison through Saturn,\n" +"And eke through Juno, jealous and eke wood*, *mad\n" +"That hath well nigh destroyed all the blood\n" +"Of Thebes, with his waste walles wide.\n" +"And Venus slay'th me on that other side\n" +"For jealousy, and fear of him, Arcite.\"\n" +"\n" +"Now will I stent* of Palamon a lite**, *pause **little\n" +"And let him in his prison stille dwell,\n" +"And of Arcita forth I will you tell.\n" +"The summer passeth, and the nightes long\n" +"Increase double-wise the paines strong\n" +"Both of the lover and the prisonere.\n" +"I n'ot* which hath the wofuller mistere**. *know not **condition\n" +"For, shortly for to say, this Palamon\n" +"Perpetually is damned to prison,\n" +"In chaines and in fetters to be dead;\n" +"And Arcite is exiled *on his head* *on peril of his head*\n" +"For evermore as out of that country,\n" +"Nor never more he shall his lady see.\n" +"You lovers ask I now this question,<18>\n" +"Who lieth the worse, Arcite or Palamon?\n" +"The one may see his lady day by day,\n" +"But in prison he dwelle must alway.\n" +"The other where him list may ride or go,\n" +"But see his lady shall he never mo'.\n" +"Now deem all as you liste, ye that can,\n" +"For I will tell you forth as I began.\n" +"\n" +"When that Arcite to Thebes comen was,\n" +"Full oft a day he swelt*, and said, \"Alas!\" *fainted\n" +"For see this lady he shall never mo'.\n" +"And shortly to concluden all his woe,\n" +"So much sorrow had never creature\n" +"That is or shall be while the world may dure.\n" +"His sleep, his meat, his drink is *him byraft*, *taken away from him*\n" +"That lean he wex*, and dry as any shaft. *became\n" +"His eyen hollow, grisly to behold,\n" +"His hue sallow, and pale as ashes cold,\n" +"And solitary he was, ever alone,\n" +"And wailing all the night, making his moan.\n" +"And if he hearde song or instrument,\n" +"Then would he weepen, he might not be stent*. *stopped\n" +"So feeble were his spirits, and so low,\n" +"And changed so, that no man coulde know\n" +"His speech, neither his voice, though men it heard.\n" +"And in his gear* for all the world he far'd *behaviour <19>\n" +"Not only like the lovers' malady\n" +"Of Eros, but rather y-like manie* *madness\n" +"Engender'd of humours melancholic,\n" +"Before his head in his cell fantastic.<20>\n" +"And shortly turned was all upside down,\n" +"Both habit and eke dispositioun,\n" +"Of him, this woful lover Dan* Arcite. *Lord <21>\n" +"Why should I all day of his woe indite?\n" +"When he endured had a year or two\n" +"This cruel torment, and this pain and woe,\n" +"At Thebes, in his country, as I said,\n" +"Upon a night in sleep as he him laid,\n" +"Him thought how that the winged god Mercury\n" +"Before him stood, and bade him to be merry.\n" +"His sleepy yard* in hand he bare upright; *rod <22>\n" +"A hat he wore upon his haires bright.\n" +"Arrayed was this god (as he took keep*) *notice\n" +"As he was when that Argus<23> took his sleep;\n" +"And said him thus: \"To Athens shalt thou wend*; *go\n" +"There is thee shapen* of thy woe an end.\" *fixed, prepared\n" +"And with that word Arcite woke and start.\n" +"\"Now truely how sore that e'er me smart,\"\n" +"Quoth he, \"to Athens right now will I fare.\n" +"Nor for no dread of death shall I not spare\n" +"To see my lady that I love and serve;\n" +"In her presence *I recke not to sterve.*\" *do not care if I die*\n" +"And with that word he caught a great mirror,\n" +"And saw that changed was all his colour,\n" +"And saw his visage all in other kind.\n" +"And right anon it ran him ill his mind,\n" +"That since his face was so disfigur'd\n" +"Of malady the which he had endur'd,\n" +"He mighte well, if that he *bare him low,* *lived in lowly fashion*\n" +"Live in Athenes evermore unknow,\n" +"And see his lady wellnigh day by day.\n" +"And right anon he changed his array,\n" +"And clad him as a poore labourer.\n" +"And all alone, save only a squier,\n" +"That knew his privity* and all his cas**, *secrets **fortune\n" +"Which was disguised poorly as he was,\n" +"To Athens is he gone the nexte* way. *nearest <24>\n" +"And to the court he went upon a day,\n" +"And at the gate he proffer'd his service,\n" +"To drudge and draw, what so men would devise*. *order\n" +"And, shortly of this matter for to sayn,\n" +"He fell in office with a chamberlain,\n" +"The which that dwelling was with Emily.\n" +"For he was wise, and coulde soon espy\n" +"Of every servant which that served her.\n" +"Well could he hewe wood, and water bear,\n" +"For he was young and mighty for the nones*, *occasion\n" +"And thereto he was strong and big of bones\n" +"To do that any wight can him devise.\n" +"\n" +"A year or two he was in this service,\n" +"Page of the chamber of Emily the bright;\n" +"And Philostrate he saide that he hight.\n" +"But half so well belov'd a man as he\n" +"Ne was there never in court of his degree.\n" +"He was so gentle of conditioun,\n" +"That throughout all the court was his renown.\n" +"They saide that it were a charity\n" +"That Theseus would *enhance his degree*, *elevate him in rank*\n" +"And put him in some worshipful service,\n" +"There as he might his virtue exercise.\n" +"And thus within a while his name sprung\n" +"Both of his deedes, and of his good tongue,\n" +"That Theseus hath taken him so near,\n" +"That of his chamber he hath made him squire,\n" +"And gave him gold to maintain his degree;\n" +"And eke men brought him out of his country\n" +"From year to year full privily his rent.\n" +"But honestly and slyly* he it spent, *discreetly, prudently\n" +"That no man wonder'd how that he it had.\n" +"And three year in this wise his life be lad*, *led\n" +"And bare him so in peace and eke in werre*, *war\n" +"There was no man that Theseus had so derre*. *dear\n" +"And in this blisse leave I now Arcite,\n" +"And speak I will of Palamon a lite*. *little\n" +"\n" +"In darkness horrible, and strong prison,\n" +"This seven year hath sitten Palamon,\n" +"Forpined*, what for love, and for distress. *pined, wasted away\n" +"Who feeleth double sorrow and heaviness\n" +"But Palamon? that love distraineth* so, *afflicts\n" +"That wood* out of his wits he went for woe, *mad\n" +"And eke thereto he is a prisonere\n" +"Perpetual, not only for a year.\n" +"Who coulde rhyme in English properly\n" +"His martyrdom? forsooth*, it is not I; *truly\n" +"Therefore I pass as lightly as I may.\n" +"It fell that in the seventh year, in May\n" +"The thirde night (as olde bookes sayn,\n" +"That all this story tellen more plain),\n" +"Were it by a venture or destiny\n" +"(As when a thing is shapen* it shall be), *settled, decreed\n" +"That soon after the midnight, Palamon\n" +"By helping of a friend brake his prison,\n" +"And fled the city fast as he might go,\n" +"For he had given drink his gaoler so\n" +"Of a clary <25>, made of a certain wine,\n" +"With *narcotise and opie* of Thebes fine, *narcotics and opium*\n" +"That all the night, though that men would him shake,\n" +"The gaoler slept, he mighte not awake:\n" +"And thus he fled as fast as ever he may.\n" +"The night was short, and *faste by the day *close at hand was\n" +"That needes cast he must himself to hide*. the day during which\n" +"And to a grove faste there beside he must cast about, or contrive,\n" +"With dreadful foot then stalked Palamon. to conceal himself.*\n" +"For shortly this was his opinion,\n" +"That in the grove he would him hide all day,\n" +"And in the night then would he take his way\n" +"To Thebes-ward, his friendes for to pray\n" +"On Theseus to help him to warray*. *make war <26>\n" +"And shortly either he would lose his life,\n" +"Or winnen Emily unto his wife.\n" +"This is th' effect, and his intention plain.\n" +"\n" +"Now will I turn to Arcita again,\n" +"That little wist how nighe was his care,\n" +"Till that Fortune had brought him in the snare.\n" +"The busy lark, the messenger of day,\n" +"Saluteth in her song the morning gray;\n" +}; + +void setup() { + int i=0; + uint8_t c; + Serial.begin(115200); + do { + c = pgm_read_byte(knightsTale+i); + if (c) Serial.write(c); + i++; + } while (c); +} +void loop() { +} diff --git a/ActualOptiboot/optiboot/examples/chaucer64k/chaucer64k.ino b/ActualOptiboot/optiboot/examples/chaucer64k/chaucer64k.ino new file mode 100644 index 0000000..1dfde21 --- /dev/null +++ b/ActualOptiboot/optiboot/examples/chaucer64k/chaucer64k.ino @@ -0,0 +1,1335 @@ +// Text is an extract from The Canterbury Tales +// Full text at http://www.gutenberg.org/dirs/etext00/cbtls12.txt +#include + +const char knightsTale[] PROGMEM = { + " THE KNIGHT'S TALE <1>\n" + "\n" + "\n" + "WHILOM*, as olde stories tellen us, *formerly\n" + "There was a duke that highte* Theseus. *was called <2>\n" + "Of Athens he was lord and governor,\n" + "And in his time such a conqueror\n" + "That greater was there none under the sun.\n" + "Full many a riche country had he won.\n" + "What with his wisdom and his chivalry,\n" + "He conquer'd all the regne of Feminie,<3>\n" + "That whilom was y-cleped Scythia;\n" + "And weddede the Queen Hippolyta\n" + "And brought her home with him to his country\n" + "With muchel* glory and great solemnity, *great\n" + "And eke her younge sister Emily,\n" + "And thus with vict'ry and with melody\n" + "Let I this worthy Duke to Athens ride,\n" + "And all his host, in armes him beside.\n" + "\n" + "And certes, if it n'ere* too long to hear, *were not\n" + "I would have told you fully the mannere,\n" + "How wonnen* was the regne of Feminie, <4> *won\n" + "By Theseus, and by his chivalry;\n" + "And of the greate battle for the nonce\n" + "Betwixt Athenes and the Amazons;\n" + "And how assieged was Hippolyta,\n" + "The faire hardy queen of Scythia;\n" + "And of the feast that was at her wedding\n" + "And of the tempest at her homecoming.\n" + "But all these things I must as now forbear.\n" + "I have, God wot, a large field to ear* *plough<5>;\n" + "And weake be the oxen in my plough;\n" + "The remnant of my tale is long enow.\n" + "I will not *letten eke none of this rout*. *hinder any of\n" + "Let every fellow tell his tale about, this company*\n" + "And let see now who shall the supper win.\n" + "There *as I left*, I will again begin. *where I left off*\n" + "\n" + "This Duke, of whom I make mentioun,\n" + "When he was come almost unto the town,\n" + "In all his weal, and in his moste pride,\n" + "He was ware, as he cast his eye aside,\n" + "Where that there kneeled in the highe way\n" + "A company of ladies, tway and tway,\n" + "Each after other, clad in clothes black:\n" + "But such a cry and such a woe they make,\n" + "That in this world n'is creature living,\n" + "That hearde such another waimenting* *lamenting <6>\n" + "And of this crying would they never stenten*, *desist\n" + "Till they the reines of his bridle henten*. *seize\n" + "\"What folk be ye that at mine homecoming\n" + "Perturben so my feaste with crying?\"\n" + "Quoth Theseus; \"Have ye so great envy\n" + "Of mine honour, that thus complain and cry?\n" + "Or who hath you misboden*, or offended? *wronged\n" + "Do telle me, if it may be amended;\n" + "And why that ye be clad thus all in black?\"\n" + "\n" + "The oldest lady of them all then spake,\n" + "When she had swooned, with a deadly cheer*, *countenance\n" + "That it was ruthe* for to see or hear. *pity\n" + "She saide; \"Lord, to whom fortune hath given\n" + "Vict'ry, and as a conqueror to liven,\n" + "Nought grieveth us your glory and your honour;\n" + "But we beseechen mercy and succour.\n" + "Have mercy on our woe and our distress;\n" + "Some drop of pity, through thy gentleness,\n" + "Upon us wretched women let now fall.\n" + "For certes, lord, there is none of us all\n" + "That hath not been a duchess or a queen;\n" + "Now be we caitives*, as it is well seen: *captives\n" + "Thanked be Fortune, and her false wheel,\n" + "That *none estate ensureth to be wele*. *assures no continuance of\n" + "And certes, lord, t'abiden your presence prosperous estate*\n" + "Here in this temple of the goddess Clemence\n" + "We have been waiting all this fortenight:\n" + "Now help us, lord, since it lies in thy might.\n" + "\n" + "\"I, wretched wight, that weep and waile thus,\n" + "Was whilom wife to king Capaneus,\n" + "That starf* at Thebes, cursed be that day: *died <7>\n" + "And alle we that be in this array,\n" + "And maken all this lamentatioun,\n" + "We losten all our husbands at that town,\n" + "While that the siege thereabouten lay.\n" + "And yet the olde Creon, wellaway!\n" + "That lord is now of Thebes the city,\n" + "Fulfilled of ire and of iniquity,\n" + "He for despite, and for his tyranny,\n" + "To do the deade bodies villainy*, *insult\n" + "Of all our lorde's, which that been y-slaw, *slain\n" + "Hath all the bodies on an heap y-draw,\n" + "And will not suffer them by none assent\n" + "Neither to be y-buried, nor y-brent*, *burnt\n" + "But maketh houndes eat them in despite.\"\n" + "And with that word, withoute more respite\n" + "They fallen groff,* and cryden piteously; *grovelling\n" + "\"Have on us wretched women some mercy,\n" + "And let our sorrow sinken in thine heart.\"\n" + "\n" + "This gentle Duke down from his courser start\n" + "With hearte piteous, when he heard them speak.\n" + "Him thoughte that his heart would all to-break,\n" + "When he saw them so piteous and so mate* *abased\n" + "That whilom weren of so great estate.\n" + "And in his armes he them all up hent*, *raised, took\n" + "And them comforted in full good intent,\n" + "And swore his oath, as he was true knight,\n" + "He woulde do *so farforthly his might* *as far as his power went*\n" + "Upon the tyrant Creon them to wreak*, *avenge\n" + "That all the people of Greece shoulde speak,\n" + "How Creon was of Theseus y-served,\n" + "As he that had his death full well deserved.\n" + "And right anon withoute more abode* *delay\n" + "His banner he display'd, and forth he rode\n" + "To Thebes-ward, and all his, host beside:\n" + "No ner* Athenes would he go nor ride, *nearer\n" + "Nor take his ease fully half a day,\n" + "But onward on his way that night he lay:\n" + "And sent anon Hippolyta the queen,\n" + "And Emily her younge sister sheen* *bright, lovely\n" + "Unto the town of Athens for to dwell:\n" + "And forth he rit*; there is no more to tell. *rode\n" + "\n" + "The red statue of Mars with spear and targe* *shield\n" + "So shineth in his white banner large\n" + "That all the fieldes glitter up and down:\n" + "And by his banner borne is his pennon\n" + "Of gold full rich, in which there was y-beat* *stamped\n" + "The Minotaur<8> which that he slew in Crete\n" + "Thus rit this Duke, thus rit this conqueror\n" + "And in his host of chivalry the flower,\n" + "Till that he came to Thebes, and alight\n" + "Fair in a field, there as he thought to fight.\n" + "But shortly for to speaken of this thing,\n" + "With Creon, which that was of Thebes king,\n" + "He fought, and slew him manly as a knight\n" + "In plain bataille, and put his folk to flight:\n" + "And by assault he won the city after,\n" + "And rent adown both wall, and spar, and rafter;\n" + "And to the ladies he restored again\n" + "The bodies of their husbands that were slain,\n" + "To do obsequies, as was then the guise*. *custom\n" + "\n" + "But it were all too long for to devise* *describe\n" + "The greate clamour, and the waimenting*, *lamenting\n" + "Which that the ladies made at the brenning* *burning\n" + "Of the bodies, and the great honour\n" + "That Theseus the noble conqueror\n" + "Did to the ladies, when they from him went:\n" + "But shortly for to tell is mine intent.\n" + "When that this worthy Duke, this Theseus,\n" + "Had Creon slain, and wonnen Thebes thus,\n" + "Still in the field he took all night his rest,\n" + "And did with all the country as him lest*. *pleased\n" + "To ransack in the tas* of bodies dead, *heap\n" + "Them for to strip of *harness and of **weed, *armour **clothes\n" + "The pillers* did their business and cure, *pillagers <9>\n" + "After the battle and discomfiture.\n" + "And so befell, that in the tas they found,\n" + "Through girt with many a grievous bloody wound,\n" + "Two younge knightes *ligging by and by* *lying side by side*\n" + "Both in *one armes*, wrought full richely: *the same armour*\n" + "Of whiche two, Arcita hight that one,\n" + "And he that other highte Palamon.\n" + "Not fully quick*, nor fully dead they were, *alive\n" + "But by their coat-armour, and by their gear,\n" + "The heralds knew them well in special,\n" + "As those that weren of the blood royal\n" + "Of Thebes, and *of sistren two y-born*. *born of two sisters*\n" + "Out of the tas the pillers have them torn,\n" + "And have them carried soft unto the tent\n" + "Of Theseus, and he full soon them sent\n" + "To Athens, for to dwellen in prison\n" + "Perpetually, he *n'olde no ranson*. *would take no ransom*\n" + "And when this worthy Duke had thus y-done,\n" + "He took his host, and home he rit anon\n" + "With laurel crowned as a conquerour;\n" + "And there he lived in joy and in honour\n" + "Term of his life; what needeth wordes mo'?\n" + "And in a tower, in anguish and in woe,\n" + "Dwellen this Palamon, and eke Arcite,\n" + "For evermore, there may no gold them quite* *set free\n" + "\n" + "Thus passed year by year, and day by day,\n" + "Till it fell ones in a morn of May\n" + "That Emily, that fairer was to seen\n" + "Than is the lily upon his stalke green,\n" + "And fresher than the May with flowers new\n" + "(For with the rose colour strove her hue;\n" + "I n'ot* which was the finer of them two), *know not\n" + "Ere it was day, as she was wont to do,\n" + "She was arisen, and all ready dight*, *dressed\n" + "For May will have no sluggardy a-night;\n" + "The season pricketh every gentle heart,\n" + "And maketh him out of his sleep to start,\n" + "And saith, \"Arise, and do thine observance.\"\n" + "\n" + "This maketh Emily have remembrance\n" + "To do honour to May, and for to rise.\n" + "Y-clothed was she fresh for to devise;\n" + "Her yellow hair was braided in a tress,\n" + "Behind her back, a yarde long I guess.\n" + "And in the garden at *the sun uprist* *sunrise\n" + "She walketh up and down where as her list.\n" + "She gathereth flowers, party* white and red, *mingled\n" + "To make a sotel* garland for her head, *subtle, well-arranged\n" + "And as an angel heavenly she sung.\n" + "The greate tower, that was so thick and strong,\n" + "Which of the castle was the chief dungeon<10>\n" + "(Where as these knightes weren in prison,\n" + "Of which I tolde you, and telle shall),\n" + "Was even joinant* to the garden wall, *adjoining\n" + "There as this Emily had her playing.\n" + "\n" + "Bright was the sun, and clear that morrowning,\n" + "And Palamon, this woful prisoner,\n" + "As was his wont, by leave of his gaoler,\n" + "Was ris'n, and roamed in a chamber on high,\n" + "In which he all the noble city sigh*, *saw\n" + "And eke the garden, full of branches green,\n" + "There as this fresh Emelia the sheen\n" + "Was in her walk, and roamed up and down.\n" + "This sorrowful prisoner, this Palamon\n" + "Went in his chamber roaming to and fro,\n" + "And to himself complaining of his woe:\n" + "That he was born, full oft he said, Alas!\n" + "And so befell, by aventure or cas*, *chance\n" + "That through a window thick of many a bar\n" + "Of iron great, and square as any spar,\n" + "He cast his eyes upon Emelia,\n" + "And therewithal he blent* and cried, Ah! *started aside\n" + "As though he stungen were unto the heart.\n" + "And with that cry Arcite anon up start,\n" + "And saide, \"Cousin mine, what aileth thee,\n" + "That art so pale and deadly for to see?\n" + "Why cried'st thou? who hath thee done offence?\n" + "For Godde's love, take all in patience\n" + "Our prison*, for it may none other be. *imprisonment\n" + "Fortune hath giv'n us this adversity'.\n" + "Some wick'* aspect or disposition *wicked\n" + "Of Saturn<11>, by some constellation,\n" + "Hath giv'n us this, although we had it sworn,\n" + "So stood the heaven when that we were born,\n" + "We must endure; this is the short and plain.\n" + "\n" + "This Palamon answer'd, and said again:\n" + "\"Cousin, forsooth of this opinion\n" + "Thou hast a vain imagination.\n" + "This prison caused me not for to cry;\n" + "But I was hurt right now thorough mine eye\n" + "Into mine heart; that will my bane* be. *destruction\n" + "The fairness of the lady that I see\n" + "Yond in the garden roaming to and fro,\n" + "Is cause of all my crying and my woe.\n" + "I *n'ot wher* she be woman or goddess, *know not whether*\n" + "But Venus is it, soothly* as I guess, *truly\n" + "And therewithal on knees adown he fill,\n" + "And saide: \"Venus, if it be your will\n" + "You in this garden thus to transfigure\n" + "Before me sorrowful wretched creature,\n" + "Out of this prison help that we may scape.\n" + "And if so be our destiny be shape\n" + "By etern word to dien in prison,\n" + "Of our lineage have some compassion,\n" + "That is so low y-brought by tyranny.\"\n" + "\n" + "And with that word Arcita *gan espy* *began to look forth*\n" + "Where as this lady roamed to and fro\n" + "And with that sight her beauty hurt him so,\n" + "That if that Palamon was wounded sore,\n" + "Arcite is hurt as much as he, or more.\n" + "And with a sigh he saide piteously:\n" + "\"The freshe beauty slay'th me suddenly\n" + "Of her that roameth yonder in the place.\n" + "And but* I have her mercy and her grace, *unless\n" + "That I may see her at the leaste way,\n" + "I am but dead; there is no more to say.\"\n" + "This Palamon, when he these wordes heard,\n" + "Dispiteously* he looked, and answer'd: *angrily\n" + "\"Whether say'st thou this in earnest or in play?\"\n" + "\"Nay,\" quoth Arcite, \"in earnest, by my fay*. *faith\n" + "God help me so, *me lust full ill to play*.\" *I am in no humour\n" + "This Palamon gan knit his browes tway. for jesting*\n" + "\"It were,\" quoth he, \"to thee no great honour\n" + "For to be false, nor for to be traitour\n" + "To me, that am thy cousin and thy brother\n" + "Y-sworn full deep, and each of us to other,\n" + "That never for to dien in the pain <12>,\n" + "Till that the death departen shall us twain,\n" + "Neither of us in love to hinder other,\n" + "Nor in none other case, my leve* brother; *dear\n" + "But that thou shouldest truly farther me\n" + "In every case, as I should farther thee.\n" + "This was thine oath, and mine also certain;\n" + "I wot it well, thou dar'st it not withsayn*, *deny\n" + "Thus art thou of my counsel out of doubt,\n" + "And now thou wouldest falsely be about\n" + "To love my lady, whom I love and serve,\n" + "And ever shall, until mine hearte sterve* *die\n" + "Now certes, false Arcite, thou shalt not so\n" + "I lov'd her first, and tolde thee my woe\n" + "As to my counsel, and my brother sworn\n" + "To farther me, as I have told beforn.\n" + "For which thou art y-bounden as a knight\n" + "To helpe me, if it lie in thy might,\n" + "Or elles art thou false, I dare well sayn,\"\n" + "\n" + "This Arcita full proudly spake again:\n" + "\"Thou shalt,\" quoth he, \"be rather* false than I, *sooner\n" + "And thou art false, I tell thee utterly;\n" + "For par amour I lov'd her first ere thou.\n" + "What wilt thou say? *thou wist it not right now* *even now thou\n" + "Whether she be a woman or goddess. knowest not*\n" + "Thine is affection of holiness,\n" + "And mine is love, as to a creature:\n" + "For which I tolde thee mine aventure\n" + "As to my cousin, and my brother sworn\n" + "I pose*, that thou loved'st her beforn: *suppose\n" + "Wost* thou not well the olde clerke's saw<13>, *know'st\n" + "That who shall give a lover any law?\n" + "Love is a greater lawe, by my pan,\n" + "Than may be giv'n to any earthly man:\n" + "Therefore positive law, and such decree,\n" + "Is broke alway for love in each degree\n" + "A man must needes love, maugre his head.\n" + "He may not flee it, though he should be dead,\n" + "*All be she* maid, or widow, or else wife. *whether she be*\n" + "And eke it is not likely all thy life\n" + "To standen in her grace, no more than I\n" + "For well thou wost thyselfe verily,\n" + "That thou and I be damned to prison\n" + "Perpetual, us gaineth no ranson.\n" + "We strive, as did the houndes for the bone;\n" + "They fought all day, and yet their part was none.\n" + "There came a kite, while that they were so wroth,\n" + "And bare away the bone betwixt them both.\n" + "And therefore at the kinge's court, my brother,\n" + "Each man for himselfe, there is no other.\n" + "Love if thee list; for I love and aye shall\n" + "And soothly, leve brother, this is all.\n" + "Here in this prison musten we endure,\n" + "And each of us take his Aventure.\"\n" + "\n" + "Great was the strife and long between these tway,\n" + "If that I hadde leisure for to say;\n" + "But to the effect: it happen'd on a day\n" + "(To tell it you as shortly as I may),\n" + "A worthy duke that hight Perithous<14>\n" + "That fellow was to the Duke Theseus\n" + "Since thilke* day that they were children lite** *that **little\n" + "Was come to Athens, his fellow to visite,\n" + "And for to play, as he was wont to do;\n" + "For in this world he loved no man so;\n" + "And he lov'd him as tenderly again.\n" + "So well they lov'd, as olde bookes sayn,\n" + "That when that one was dead, soothly to sayn,\n" + "His fellow went and sought him down in hell:\n" + "But of that story list me not to write.\n" + "Duke Perithous loved well Arcite,\n" + "And had him known at Thebes year by year:\n" + "And finally at request and prayere\n" + "Of Perithous, withoute ranson\n" + "Duke Theseus him let out of prison,\n" + "Freely to go, where him list over all,\n" + "In such a guise, as I you tellen shall\n" + "This was the forword*, plainly to indite, *promise\n" + "Betwixte Theseus and him Arcite:\n" + "That if so were, that Arcite were y-found\n" + "Ever in his life, by day or night, one stound* *moment<15>\n" + "In any country of this Theseus,\n" + "And he were caught, it was accorded thus,\n" + "That with a sword he shoulde lose his head;\n" + "There was none other remedy nor rede*. *counsel\n" + "But took his leave, and homeward he him sped;\n" + "Let him beware, his necke lieth *to wed*. *in pledge*\n" + "\n" + "How great a sorrow suff'reth now Arcite!\n" + "The death he feeleth through his hearte smite;\n" + "He weepeth, waileth, crieth piteously;\n" + "To slay himself he waiteth privily.\n" + "He said; \"Alas the day that I was born!\n" + "Now is my prison worse than beforn:\n" + "*Now is me shape* eternally to dwell *it is fixed for me*\n" + "Not in purgatory, but right in hell.\n" + "Alas! that ever I knew Perithous.\n" + "For elles had I dwelt with Theseus\n" + "Y-fettered in his prison evermo'.\n" + "Then had I been in bliss, and not in woe.\n" + "Only the sight of her, whom that I serve,\n" + "Though that I never may her grace deserve,\n" + "Would have sufficed right enough for me.\n" + "O deare cousin Palamon,\" quoth he,\n" + "\"Thine is the vict'ry of this aventure,\n" + "Full blissfully in prison to endure:\n" + "In prison? nay certes, in paradise.\n" + "Well hath fortune y-turned thee the dice,\n" + "That hast the sight of her, and I th' absence.\n" + "For possible is, since thou hast her presence,\n" + "And art a knight, a worthy and an able,\n" + "That by some cas*, since fortune is changeable, *chance\n" + "Thou may'st to thy desire sometime attain.\n" + "But I that am exiled, and barren\n" + "Of alle grace, and in so great despair,\n" + "That there n'is earthe, water, fire, nor air,\n" + "Nor creature, that of them maked is,\n" + "That may me helpe nor comfort in this,\n" + "Well ought I *sterve in wanhope* and distress. *die in despair*\n" + "Farewell my life, my lust*, and my gladness. *pleasure\n" + "Alas, *why plainen men so in commune *why do men so often complain\n" + "Of purveyance of God*, or of Fortune, of God's providence?*\n" + "That giveth them full oft in many a guise\n" + "Well better than they can themselves devise?\n" + "Some man desireth for to have richess,\n" + "That cause is of his murder or great sickness.\n" + "And some man would out of his prison fain,\n" + "That in his house is of his meinie* slain. *servants <16>\n" + "Infinite harmes be in this mattere.\n" + "We wot never what thing we pray for here.\n" + "We fare as he that drunk is as a mouse.\n" + "A drunken man wot well he hath an house,\n" + "But he wot not which is the right way thither,\n" + "And to a drunken man the way is slither*. *slippery\n" + "And certes in this world so fare we.\n" + "We seeke fast after felicity,\n" + "But we go wrong full often truely.\n" + "Thus we may sayen all, and namely* I, *especially\n" + "That ween'd*, and had a great opinion, *thought\n" + "That if I might escape from prison\n" + "Then had I been in joy and perfect heal,\n" + "Where now I am exiled from my weal.\n" + "Since that I may not see you, Emily,\n" + "I am but dead; there is no remedy.\"\n" + "\n" + "Upon that other side, Palamon,\n" + "When that he wist Arcita was agone,\n" + "Much sorrow maketh, that the greate tower\n" + "Resounded of his yelling and clamour\n" + "The pure* fetters on his shinnes great *very <17>\n" + "Were of his bitter salte teares wet.\n" + "\n" + "\"Alas!\" quoth he, \"Arcita, cousin mine,\n" + "Of all our strife, God wot, the fruit is thine.\n" + "Thou walkest now in Thebes at thy large,\n" + "And of my woe thou *givest little charge*. *takest little heed*\n" + "Thou mayst, since thou hast wisdom and manhead*, *manhood, courage\n" + "Assemble all the folk of our kindred,\n" + "And make a war so sharp on this country\n" + "That by some aventure, or some treaty,\n" + "Thou mayst have her to lady and to wife,\n" + "For whom that I must needes lose my life.\n" + "For as by way of possibility,\n" + "Since thou art at thy large, of prison free,\n" + "And art a lord, great is thine avantage,\n" + "More than is mine, that sterve here in a cage.\n" + "For I must weep and wail, while that I live,\n" + "With all the woe that prison may me give,\n" + "And eke with pain that love me gives also,\n" + "That doubles all my torment and my woe.\"\n" + "\n" + "Therewith the fire of jealousy upstart\n" + "Within his breast, and hent* him by the heart *seized\n" + "So woodly*, that he like was to behold *madly\n" + "The box-tree, or the ashes dead and cold.\n" + "Then said; \"O cruel goddess, that govern\n" + "This world with binding of your word etern* *eternal\n" + "And writen in the table of adamant\n" + "Your parlement* and your eternal grant, *consultation\n" + "What is mankind more *unto you y-hold* *by you esteemed\n" + "Than is the sheep, that rouketh* in the fold! *lie huddled together\n" + "For slain is man, right as another beast;\n" + "And dwelleth eke in prison and arrest,\n" + "And hath sickness, and great adversity,\n" + "And oftentimes guilteless, pardie* *by God\n" + "What governance is in your prescience,\n" + "That guilteless tormenteth innocence?\n" + "And yet increaseth this all my penance,\n" + "That man is bounden to his observance\n" + "For Godde's sake to *letten of his will*, *restrain his desire*\n" + "Whereas a beast may all his lust fulfil.\n" + "And when a beast is dead, he hath no pain;\n" + "But man after his death must weep and plain,\n" + "Though in this worlde he have care and woe:\n" + "Withoute doubt it maye standen so.\n" + "\"The answer of this leave I to divines,\n" + "But well I wot, that in this world great pine* is; *pain, trouble\n" + "Alas! I see a serpent or a thief\n" + "That many a true man hath done mischief,\n" + "Go at his large, and where him list may turn.\n" + "But I must be in prison through Saturn,\n" + "And eke through Juno, jealous and eke wood*, *mad\n" + "That hath well nigh destroyed all the blood\n" + "Of Thebes, with his waste walles wide.\n" + "And Venus slay'th me on that other side\n" + "For jealousy, and fear of him, Arcite.\"\n" + "\n" + "Now will I stent* of Palamon a lite**, *pause **little\n" + "And let him in his prison stille dwell,\n" + "And of Arcita forth I will you tell.\n" + "The summer passeth, and the nightes long\n" + "Increase double-wise the paines strong\n" + "Both of the lover and the prisonere.\n" + "I n'ot* which hath the wofuller mistere**. *know not **condition\n" + "For, shortly for to say, this Palamon\n" + "Perpetually is damned to prison,\n" + "In chaines and in fetters to be dead;\n" + "And Arcite is exiled *on his head* *on peril of his head*\n" + "For evermore as out of that country,\n" + "Nor never more he shall his lady see.\n" + "You lovers ask I now this question,<18>\n" + "Who lieth the worse, Arcite or Palamon?\n" + "The one may see his lady day by day,\n" + "But in prison he dwelle must alway.\n" + "The other where him list may ride or go,\n" + "But see his lady shall he never mo'.\n" + "Now deem all as you liste, ye that can,\n" + "For I will tell you forth as I began.\n" + "\n" + "When that Arcite to Thebes comen was,\n" + "Full oft a day he swelt*, and said, \"Alas!\" *fainted\n" + "For see this lady he shall never mo'.\n" + "And shortly to concluden all his woe,\n" + "So much sorrow had never creature\n" + "That is or shall be while the world may dure.\n" + "His sleep, his meat, his drink is *him byraft*, *taken away from him*\n" + "That lean he wex*, and dry as any shaft. *became\n" + "His eyen hollow, grisly to behold,\n" + "His hue sallow, and pale as ashes cold,\n" + "And solitary he was, ever alone,\n" + "And wailing all the night, making his moan.\n" + "And if he hearde song or instrument,\n" + "Then would he weepen, he might not be stent*. *stopped\n" + "So feeble were his spirits, and so low,\n" + "And changed so, that no man coulde know\n" + "His speech, neither his voice, though men it heard.\n" + "And in his gear* for all the world he far'd *behaviour <19>\n" + "Not only like the lovers' malady\n" + "Of Eros, but rather y-like manie* *madness\n" + "Engender'd of humours melancholic,\n" + "Before his head in his cell fantastic.<20>\n" + "And shortly turned was all upside down,\n" + "Both habit and eke dispositioun,\n" + "Of him, this woful lover Dan* Arcite. *Lord <21>\n" + "Why should I all day of his woe indite?\n" + "When he endured had a year or two\n" + "This cruel torment, and this pain and woe,\n" + "At Thebes, in his country, as I said,\n" + "Upon a night in sleep as he him laid,\n" + "Him thought how that the winged god Mercury\n" + "Before him stood, and bade him to be merry.\n" + "His sleepy yard* in hand he bare upright; *rod <22>\n" + "A hat he wore upon his haires bright.\n" + "Arrayed was this god (as he took keep*) *notice\n" + "As he was when that Argus<23> took his sleep;\n" + "And said him thus: \"To Athens shalt thou wend*; *go\n" + "There is thee shapen* of thy woe an end.\" *fixed, prepared\n" + "And with that word Arcite woke and start.\n" + "\"Now truely how sore that e'er me smart,\"\n" + "Quoth he, \"to Athens right now will I fare.\n" + "Nor for no dread of death shall I not spare\n" + "To see my lady that I love and serve;\n" + "In her presence *I recke not to sterve.*\" *do not care if I die*\n" + "And with that word he caught a great mirror,\n" + "And saw that changed was all his colour,\n" + "And saw his visage all in other kind.\n" + "And right anon it ran him ill his mind,\n" + "That since his face was so disfigur'd\n" + "Of malady the which he had endur'd,\n" + "He mighte well, if that he *bare him low,* *lived in lowly fashion*\n" + "Live in Athenes evermore unknow,\n" + "And see his lady wellnigh day by day.\n" + "And right anon he changed his array,\n" + "And clad him as a poore labourer.\n" + "And all alone, save only a squier,\n" + "That knew his privity* and all his cas**, *secrets **fortune\n" + "Which was disguised poorly as he was,\n" + "To Athens is he gone the nexte* way. *nearest <24>\n" + "And to the court he went upon a day,\n" + "And at the gate he proffer'd his service,\n" + "To drudge and draw, what so men would devise*. *order\n" + "And, shortly of this matter for to sayn,\n" + "He fell in office with a chamberlain,\n" + "The which that dwelling was with Emily.\n" + "For he was wise, and coulde soon espy\n" + "Of every servant which that served her.\n" + "Well could he hewe wood, and water bear,\n" + "For he was young and mighty for the nones*, *occasion\n" + "And thereto he was strong and big of bones\n" + "To do that any wight can him devise.\n" + "\n" + "A year or two he was in this service,\n" + "Page of the chamber of Emily the bright;\n" + "And Philostrate he saide that he hight.\n" + "But half so well belov'd a man as he\n" + "Ne was there never in court of his degree.\n" + "He was so gentle of conditioun,\n" + "That throughout all the court was his renown.\n" + "They saide that it were a charity\n" + "That Theseus would *enhance his degree*, *elevate him in rank*\n" + "And put him in some worshipful service,\n" + "There as he might his virtue exercise.\n" + "And thus within a while his name sprung\n" + "Both of his deedes, and of his good tongue,\n" + "That Theseus hath taken him so near,\n" + "That of his chamber he hath made him squire,\n" + "And gave him gold to maintain his degree;\n" + "And eke men brought him out of his country\n" + "From year to year full privily his rent.\n" + "But honestly and slyly* he it spent, *discreetly, prudently\n" + "That no man wonder'd how that he it had.\n" + "And three year in this wise his life be lad*, *led\n" + "And bare him so in peace and eke in werre*, *war\n" + "There was no man that Theseus had so derre*. *dear\n" + "And in this blisse leave I now Arcite,\n" + "And speak I will of Palamon a lite*. *little\n" + "\n" + "In darkness horrible, and strong prison,\n" + "This seven year hath sitten Palamon,\n" + "Forpined*, what for love, and for distress. *pined, wasted away\n" + "Who feeleth double sorrow and heaviness\n" + "But Palamon? that love distraineth* so, *afflicts\n" + "That wood* out of his wits he went for woe, *mad\n" + "And eke thereto he is a prisonere\n" + "Perpetual, not only for a year.\n" + "Who coulde rhyme in English properly\n" + "His martyrdom? forsooth*, it is not I; *truly\n" + "Therefore I pass as lightly as I may.\n" + "It fell that in the seventh year, in May\n" + "The thirde night (as olde bookes sayn,\n" + "That all this story tellen more plain),\n" + "Were it by a venture or destiny\n" + "(As when a thing is shapen* it shall be), *settled, decreed\n" + "That soon after the midnight, Palamon\n" + "By helping of a friend brake his prison,\n" + "And fled the city fast as he might go,\n" + "For he had given drink his gaoler so\n" + "Of a clary <25>, made of a certain wine,\n" + "With *narcotise and opie* of Thebes fine, *narcotics and opium*\n" + "That all the night, though that men would him shake,\n" + "The gaoler slept, he mighte not awake:\n" + "And thus he fled as fast as ever he may.\n" + "The night was short, and *faste by the day *close at hand was\n" + "That needes cast he must himself to hide*. the day during which\n" + "And to a grove faste there beside he must cast about, or contrive,\n" + "With dreadful foot then stalked Palamon. to conceal himself.*\n" + "For shortly this was his opinion,\n" + "That in the grove he would him hide all day,\n" + "And in the night then would he take his way\n" + "To Thebes-ward, his friendes for to pray\n" + "On Theseus to help him to warray*. *make war <26>\n" + "And shortly either he would lose his life,\n" + "Or winnen Emily unto his wife.\n" + "This is th' effect, and his intention plain.\n" + "\n" + "Now will I turn to Arcita again,\n" + "That little wist how nighe was his care,\n" + "Till that Fortune had brought him in the snare.\n" + "The busy lark, the messenger of day,\n" + "Saluteth in her song the morning gray;\n" + "And fiery Phoebus riseth up so bright,\n" + "That all the orient laugheth at the sight,\n" + "And with his streames* drieth in the greves** *rays **groves\n" + "The silver droppes, hanging on the leaves;\n" + "And Arcite, that is in the court royal\n" + "With Theseus, his squier principal,\n" + "Is ris'n, and looketh on the merry day.\n" + "And for to do his observance to May,\n" + "Remembering the point* of his desire, *object\n" + "He on his courser, starting as the fire,\n" + "Is ridden to the fieldes him to play,\n" + "Out of the court, were it a mile or tway.\n" + "And to the grove, of which I have you told,\n" + "By a venture his way began to hold,\n" + "To make him a garland of the greves*, *groves\n" + "Were it of woodbine, or of hawthorn leaves,\n" + "And loud he sang against the sun so sheen*. *shining bright\n" + "\"O May, with all thy flowers and thy green,\n" + "Right welcome be thou, faire freshe May,\n" + "I hope that I some green here getten may.\"\n" + "And from his courser*, with a lusty heart, *horse\n" + "Into the grove full hastily he start,\n" + "And in a path he roamed up and down,\n" + "There as by aventure this Palamon\n" + "Was in a bush, that no man might him see,\n" + "For sore afeard of his death was he.\n" + "Nothing ne knew he that it was Arcite;\n" + "God wot he would have *trowed it full lite*. *full little believed it*\n" + "But sooth is said, gone since full many years,\n" + "The field hath eyen*, and the wood hath ears, *eyes\n" + "It is full fair a man *to bear him even*, *to be on his guard*\n" + "For all day meeten men at *unset steven*. *unexpected time <27>\n" + "Full little wot Arcite of his fellaw,\n" + "That was so nigh to hearken of his saw*, *saying, speech\n" + "For in the bush he sitteth now full still.\n" + "When that Arcite had roamed all his fill,\n" + "And *sungen all the roundel* lustily, *sang the roundelay*<28>\n" + "Into a study he fell suddenly,\n" + "As do those lovers in their *quainte gears*, *odd fashions*\n" + "Now in the crop*, and now down in the breres**, <29> *tree-top\n" + "Now up, now down, as bucket in a well. **briars\n" + "Right as the Friday, soothly for to tell,\n" + "Now shineth it, and now it raineth fast,\n" + "Right so can geary* Venus overcast *changeful\n" + "The heartes of her folk, right as her day\n" + "Is gearful*, right so changeth she array. *changeful\n" + "Seldom is Friday all the weeke like.\n" + "When Arcite had y-sung, he gan to sike*, *sigh\n" + "And sat him down withouten any more:\n" + "\"Alas!\" quoth he, \"the day that I was bore!\n" + "How longe, Juno, through thy cruelty\n" + "Wilt thou warrayen* Thebes the city? *torment\n" + "Alas! y-brought is to confusion\n" + "The blood royal of Cadm' and Amphion:\n" + "Of Cadmus, which that was the firste man,\n" +}; +const char knightsTale2[] PROGMEM = { + "That Thebes built, or first the town began,\n" + "And of the city first was crowned king.\n" + "Of his lineage am I, and his offspring\n" + "By very line, as of the stock royal;\n" + "And now I am *so caitiff and so thrall*, *wretched and enslaved*\n" + "That he that is my mortal enemy,\n" + "I serve him as his squier poorely.\n" + "And yet doth Juno me well more shame,\n" + "For I dare not beknow* mine owen name, *acknowledge <30>\n" + "But there as I was wont to hight Arcite,\n" + "Now hight I Philostrate, not worth a mite.\n" + "Alas! thou fell Mars, and alas! Juno,\n" + "Thus hath your ire our lineage all fordo* *undone, ruined\n" + "Save only me, and wretched Palamon,\n" + "That Theseus martyreth in prison.\n" + "And over all this, to slay me utterly,\n" + "Love hath his fiery dart so brenningly* *burningly\n" + "Y-sticked through my true careful heart,\n" + "That shapen was my death erst than my shert. <31>\n" + "Ye slay me with your eyen, Emily;\n" + "Ye be the cause wherefore that I die.\n" + "Of all the remnant of mine other care\n" + "Ne set I not the *mountance of a tare*, *value of a straw*\n" + "So that I could do aught to your pleasance.\"\n" + "\n" + "And with that word he fell down in a trance\n" + "A longe time; and afterward upstart\n" + "This Palamon, that thought thorough his heart\n" + "He felt a cold sword suddenly to glide:\n" + "For ire he quoke*, no longer would he hide. *quaked\n" + "And when that he had heard Arcite's tale,\n" + "As he were wood*, with face dead and pale, *mad\n" + "He start him up out of the bushes thick,\n" + "And said: \"False Arcita, false traitor wick'*, *wicked\n" + "Now art thou hent*, that lov'st my lady so, *caught\n" + "For whom that I have all this pain and woe,\n" + "And art my blood, and to my counsel sworn,\n" + "As I full oft have told thee herebeforn,\n" + "And hast bejaped* here Duke Theseus, *deceived, imposed upon\n" + "And falsely changed hast thy name thus;\n" + "I will be dead, or elles thou shalt die.\n" + "Thou shalt not love my lady Emily,\n" + "But I will love her only and no mo';\n" + "For I am Palamon thy mortal foe.\n" + "And though I have no weapon in this place,\n" + "But out of prison am astart* by grace, *escaped\n" + "I dreade* not that either thou shalt die, *doubt\n" + "Or else thou shalt not loven Emily.\n" + "Choose which thou wilt, for thou shalt not astart.\"\n" + "\n" + "This Arcite then, with full dispiteous* heart, *wrathful\n" + "When he him knew, and had his tale heard,\n" + "As fierce as lion pulled out a swerd,\n" + "And saide thus; \"By God that sitt'th above,\n" + "*N'ere it* that thou art sick, and wood for love, *were it not*\n" + "And eke that thou no weap'n hast in this place,\n" + "Thou should'st never out of this grove pace,\n" + "That thou ne shouldest dien of mine hand.\n" + "For I defy the surety and the band,\n" + "Which that thou sayest I have made to thee.\n" + "What? very fool, think well that love is free;\n" + "And I will love her maugre* all thy might. *despite\n" + "But, for thou art a worthy gentle knight,\n" + "And *wilnest to darraine her by bataille*, *will reclaim her\n" + "Have here my troth, to-morrow I will not fail, by combat*\n" + "Without weeting* of any other wight, *knowledge\n" + "That here I will be founden as a knight,\n" + "And bringe harness* right enough for thee; *armour and arms\n" + "And choose the best, and leave the worst for me.\n" + "And meat and drinke this night will I bring\n" + "Enough for thee, and clothes for thy bedding.\n" + "And if so be that thou my lady win,\n" + "And slay me in this wood that I am in,\n" + "Thou may'st well have thy lady as for me.\"\n" + "This Palamon answer'd, \"I grant it thee.\"\n" + "And thus they be departed till the morrow,\n" + "When each of them hath *laid his faith to borrow*. *pledged his faith*\n" + "\n" + "O Cupid, out of alle charity!\n" + "O Regne* that wilt no fellow have with thee! *queen <32>\n" + "Full sooth is said, that love nor lordeship\n" + "Will not, *his thanks*, have any fellowship. *thanks to him*\n" + "Well finden that Arcite and Palamon.\n" + "Arcite is ridd anon unto the town,\n" + "And on the morrow, ere it were daylight,\n" + "Full privily two harness hath he dight*, *prepared\n" + "Both suffisant and meete to darraine* *contest\n" + "The battle in the field betwixt them twain.\n" + "And on his horse, alone as he was born,\n" + "He carrieth all this harness him beforn;\n" + "And in the grove, at time and place y-set,\n" + "This Arcite and this Palamon be met.\n" + "Then change gan the colour of their face;\n" + "Right as the hunter in the regne* of Thrace *kingdom\n" + "That standeth at a gappe with a spear\n" + "When hunted is the lion or the bear,\n" + "And heareth him come rushing in the greves*, *groves\n" + "And breaking both the boughes and the leaves,\n" + "Thinketh, \"Here comes my mortal enemy,\n" + "Withoute fail, he must be dead or I;\n" + "For either I must slay him at the gap;\n" + "Or he must slay me, if that me mishap:\"\n" + "So fared they, in changing of their hue\n" + "*As far as either of them other knew*. *When they recognised each\n" + "There was no good day, and no saluting, other afar off*\n" + "But straight, withoute wordes rehearsing,\n" + "Evereach of them holp to arm the other,\n" + "As friendly, as he were his owen brother.\n" + "And after that, with sharpe speares strong\n" + "They foined* each at other wonder long. *thrust\n" + "Thou mightest weene*, that this Palamon *think\n" + "In fighting were as a wood* lion, *mad\n" + "And as a cruel tiger was Arcite:\n" + "As wilde boars gan they together smite,\n" + "That froth as white as foam, *for ire wood*. *mad with anger*\n" + "Up to the ancle fought they in their blood.\n" + "And in this wise I let them fighting dwell,\n" + "And forth I will of Theseus you tell.\n" + "\n" + "The Destiny, minister general,\n" + "That executeth in the world o'er all\n" + "The purveyance*, that God hath seen beforn; *foreordination\n" + "So strong it is, that though the world had sworn\n" + "The contrary of a thing by yea or nay,\n" + "Yet some time it shall fallen on a day\n" + "That falleth not eft* in a thousand year. *again\n" + "For certainly our appetites here,\n" + "Be it of war, or peace, or hate, or love,\n" + "All is this ruled by the sight* above. *eye, intelligence, power\n" + "This mean I now by mighty Theseus,\n" + "That for to hunten is so desirous --\n" + "And namely* the greate hart in May -- *especially\n" + "That in his bed there dawneth him no day\n" + "That he n'is clad, and ready for to ride\n" + "With hunt and horn, and houndes him beside.\n" + "For in his hunting hath he such delight,\n" + "That it is all his joy and appetite\n" + "To be himself the greate harte's bane* *destruction\n" + "For after Mars he serveth now Diane.\n" + "Clear was the day, as I have told ere this,\n" + "And Theseus, with alle joy and bliss,\n" + "With his Hippolyta, the faire queen,\n" + "And Emily, y-clothed all in green,\n" + "On hunting be they ridden royally.\n" + "And to the grove, that stood there faste by,\n" + "In which there was an hart, as men him told,\n" + "Duke Theseus the straighte way doth hold,\n" + "And to the laund* he rideth him full right, *plain <33>\n" + "There was the hart y-wont to have his flight,\n" + "And over a brook, and so forth on his way.\n" + "This Duke will have a course at him or tway\n" + "With houndes, such as him lust* to command. *pleased\n" + "And when this Duke was come to the laund,\n" + "Under the sun he looked, and anon\n" + "He was ware of Arcite and Palamon,\n" + "That foughte breme*, as it were bulles two. *fiercely\n" + "The brighte swordes wente to and fro\n" + "So hideously, that with the leaste stroke\n" + "It seemed that it woulde fell an oak,\n" + "But what they were, nothing yet he wote*. *knew\n" + "This Duke his courser with his spurres smote,\n" + "*And at a start* he was betwixt them two, *suddenly*\n" + "And pulled out a sword and cried, \"Ho!\n" + "No more, on pain of losing of your head.\n" + "By mighty Mars, he shall anon be dead\n" + "That smiteth any stroke, that I may see!\n" + "But tell to me what mister* men ye be, *manner, kind <34>\n" + "That be so hardy for to fighte here\n" + "Withoute judge or other officer,\n" + "As though it were in listes royally. <35>\n" + "This Palamon answered hastily,\n" + "And saide: \"Sir, what needeth wordes mo'?\n" + "We have the death deserved bothe two,\n" + "Two woful wretches be we, and caitives,\n" + "That be accumbered* of our own lives, *burdened\n" + "And as thou art a rightful lord and judge,\n" + "So give us neither mercy nor refuge.\n" + "And slay me first, for sainte charity,\n" + "But slay my fellow eke as well as me.\n" + "Or slay him first; for, though thou know it lite*, *little\n" + "This is thy mortal foe, this is Arcite\n" + "That from thy land is banisht on his head,\n" + "For which he hath deserved to be dead.\n" + "For this is he that came unto thy gate\n" + "And saide, that he highte Philostrate.\n" + "Thus hath he japed* thee full many year, *deceived\n" + "And thou hast made of him thy chief esquier;\n" + "And this is he, that loveth Emily.\n" + "For since the day is come that I shall die\n" + "I make pleinly* my confession, *fully, unreservedly\n" + "That I am thilke* woful Palamon, *that same <36>\n" + "That hath thy prison broken wickedly.\n" + "I am thy mortal foe, and it am I\n" + "That so hot loveth Emily the bright,\n" + "That I would die here present in her sight.\n" + "Therefore I aske death and my jewise*. *judgement\n" + "But slay my fellow eke in the same wise,\n" + "For both we have deserved to be slain.\"\n" + "\n" + "This worthy Duke answer'd anon again,\n" + "And said, \"This is a short conclusion.\n" + "Your own mouth, by your own confession\n" + "Hath damned you, and I will it record;\n" + "It needeth not to pain you with the cord;\n" + "Ye shall be dead, by mighty Mars the Red.<37>\n" + "\n" + "The queen anon for very womanhead\n" + "Began to weep, and so did Emily,\n" + "And all the ladies in the company.\n" + "Great pity was it as it thought them all,\n" + "That ever such a chance should befall,\n" + "For gentle men they were, of great estate,\n" + "And nothing but for love was this debate\n" + "They saw their bloody woundes wide and sore,\n" + "And cried all at once, both less and more,\n" + "\"Have mercy, Lord, upon us women all.\"\n" + "And on their bare knees adown they fall\n" + "And would have kissed his feet there as he stood,\n" + "Till at the last *aslaked was his mood* *his anger was\n" + "(For pity runneth soon in gentle heart); appeased*\n" + "And though at first for ire he quoke and start\n" + "He hath consider'd shortly in a clause\n" + "The trespass of them both, and eke the cause:\n" + "And although that his ire their guilt accused\n" + "Yet in his reason he them both excused;\n" + "As thus; he thoughte well that every man\n" + "Will help himself in love if that he can,\n" + "And eke deliver himself out of prison.\n" + "Of women, for they wepten ever-in-one:* *continually\n" + "And eke his hearte had compassion\n" + "And in his gentle heart he thought anon,\n" + "And soft unto himself he saide: \"Fie\n" + "Upon a lord that will have no mercy,\n" + "But be a lion both in word and deed,\n" + "To them that be in repentance and dread,\n" + "As well as-to a proud dispiteous* man *unpitying\n" + "That will maintaine what he first began.\n" + "That lord hath little of discretion,\n" + "That in such case *can no division*: *can make no distinction*\n" + "But weigheth pride and humbless *after one*.\" *alike*\n" + "And shortly, when his ire is thus agone,\n" + "He gan to look on them with eyen light*, *gentle, lenient*\n" + "And spake these same wordes *all on height.* *aloud*\n" + "\n" + "\"The god of love, ah! benedicite*, *bless ye him\n" + "How mighty and how great a lord is he!\n" + "Against his might there gaine* none obstacles, *avail, conquer\n" + "He may be called a god for his miracles\n" + "For he can maken at his owen guise\n" + "Of every heart, as that him list devise.\n" + "Lo here this Arcite, and this Palamon,\n" + "That quietly were out of my prison,\n" + "And might have lived in Thebes royally,\n" + "And weet* I am their mortal enemy, *knew\n" + "And that their death li'th in my might also,\n" + "And yet hath love, *maugre their eyen two*, *in spite of their eyes*\n" + "Y-brought them hither bothe for to die.\n" + "Now look ye, is not this an high folly?\n" + "Who may not be a fool, if but he love?\n" + "Behold, for Godde's sake that sits above,\n" + "See how they bleed! be they not well array'd?\n" + "Thus hath their lord, the god of love, them paid\n" + "Their wages and their fees for their service;\n" + "And yet they weene for to be full wise,\n" + "That serve love, for aught that may befall.\n" + "But this is yet the beste game* of all, *joke\n" + "That she, for whom they have this jealousy,\n" + "Can them therefor as muchel thank as me.\n" + "She wot no more of all this *hote fare*, *hot behaviour*\n" + "By God, than wot a cuckoo or an hare.\n" + "But all must be assayed hot or cold;\n" + "A man must be a fool, or young or old;\n" + "I wot it by myself *full yore agone*: *long years ago*\n" + "For in my time a servant was I one.\n" + "And therefore since I know of love's pain,\n" + "And wot how sore it can a man distrain*, *distress\n" + "As he that oft hath been caught in his last*, *snare <38>\n" + "I you forgive wholly this trespass,\n" + "At request of the queen that kneeleth here,\n" + "And eke of Emily, my sister dear.\n" + "And ye shall both anon unto me swear,\n" + "That never more ye shall my country dere* *injure\n" + "Nor make war upon me night nor day,\n" + "But be my friends in alle that ye may.\n" + "I you forgive this trespass *every deal*. *completely*\n" + "And they him sware *his asking* fair and well, *what he asked*\n" + "And him of lordship and of mercy pray'd,\n" + "And he them granted grace, and thus he said:\n" + "\n" + "\"To speak of royal lineage and richess,\n" + "Though that she were a queen or a princess,\n" + "Each of you both is worthy doubteless\n" + "To wedde when time is; but natheless\n" + "I speak as for my sister Emily,\n" + "For whom ye have this strife and jealousy,\n" + "Ye wot* yourselves, she may not wed the two *know\n" + "At once, although ye fight for evermo:\n" + "But one of you, *all be him loth or lief,* *whether or not he wishes*\n" + "He must *go pipe into an ivy leaf*: *\"go whistle\"*\n" + "This is to say, she may not have you both,\n" + "All be ye never so jealous, nor so wroth.\n" + "And therefore I you put in this degree,\n" + "That each of you shall have his destiny\n" + "As *him is shape*; and hearken in what wise *as is decreed for him*\n" + "Lo hear your end of that I shall devise.\n" + "My will is this, for plain conclusion\n" + "Withouten any replication*, *reply\n" + "If that you liketh, take it for the best,\n" + "That evereach of you shall go where *him lest*, *he pleases\n" + "Freely without ransom or danger;\n" + "And this day fifty weekes, *farre ne nerre*, *neither more nor less*\n" + "Evereach of you shall bring an hundred knights,\n" + "Armed for listes up at alle rights\n" + "All ready to darraine* her by bataille, *contend for\n" + "And this behete* I you withoute fail *promise\n" + "Upon my troth, and as I am a knight,\n" + "That whether of you bothe that hath might,\n" + "That is to say, that whether he or thou\n" + "May with his hundred, as I spake of now,\n" + "Slay his contrary, or out of listes drive,\n" + "Him shall I given Emily to wive,\n" + "To whom that fortune gives so fair a grace.\n" + "The listes shall I make here in this place.\n" + "*And God so wisly on my soule rue*, *may God as surely have\n" + "As I shall even judge be and true. mercy on my soul*\n" + "Ye shall none other ende with me maken\n" + "Than one of you shalle be dead or taken.\n" + "And if you thinketh this is well y-said,\n" + "Say your advice*, and hold yourselves apaid**. *opinion **satisfied\n" + "This is your end, and your conclusion.\"\n" + "Who looketh lightly now but Palamon?\n" + "Who springeth up for joye but Arcite?\n" + "Who could it tell, or who could it indite,\n" + "The joye that is maked in the place\n" + "When Theseus hath done so fair a grace?\n" + "But down on knees went every *manner wight*, *kind of person*\n" + "And thanked him with all their heartes' might,\n" + "And namely* these Thebans *ofte sithe*. *especially *oftentimes*\n" + "And thus with good hope and with hearte blithe\n" + "They take their leave, and homeward gan they ride\n" + "To Thebes-ward, with his old walles wide.\n" + "\n" + "I trow men woulde deem it negligence,\n" + "If I forgot to telle the dispence* *expenditure\n" + "Of Theseus, that went so busily\n" + "To maken up the listes royally,\n" + "That such a noble theatre as it was,\n" + "I dare well say, in all this world there n'as*. *was not\n" + "The circuit a mile was about,\n" + "Walled of stone, and ditched all without.\n" + "*Round was the shape, in manner of compass,\n" + "Full of degrees, the height of sixty pas* *see note <39>*\n" + "That when a man was set on one degree\n" + "He letted* not his fellow for to see. *hindered\n" + "Eastward there stood a gate of marble white,\n" + "Westward right such another opposite.\n" + "And, shortly to conclude, such a place\n" + "Was never on earth made in so little space,\n" + "For in the land there was no craftes-man,\n" + "That geometry or arsmetrike* can**, *arithmetic **knew\n" + "Nor pourtrayor*, nor carver of images, *portrait painter\n" + "That Theseus ne gave him meat and wages\n" + "The theatre to make and to devise.\n" + "And for to do his rite and sacrifice\n" + "He eastward hath upon the gate above,\n" + "In worship of Venus, goddess of love,\n" + "*Done make* an altar and an oratory; *caused to be made*\n" + "And westward, in the mind and in memory\n" + "Of Mars, he maked hath right such another,\n" + "That coste largely of gold a fother*. *a great amount\n" + "And northward, in a turret on the wall,\n" + "Of alabaster white and red coral\n" + "An oratory riche for to see,\n" + "In worship of Diane of chastity,\n" + "Hath Theseus done work in noble wise.\n" + "But yet had I forgotten to devise* *describe\n" + "The noble carving, and the portraitures,\n" + "The shape, the countenance of the figures\n" + "That weren in there oratories three.\n" + "\n" + "First in the temple of Venus may'st thou see\n" + "Wrought on the wall, full piteous to behold,\n" + "The broken sleepes, and the sikes* cold, *sighes\n" + "The sacred teares, and the waimentings*, *lamentings\n" + "The fiery strokes of the desirings,\n" + "That Love's servants in this life endure;\n" + "The oathes, that their covenants assure.\n" + "Pleasance and Hope, Desire, Foolhardiness,\n" + "Beauty and Youth, and Bawdry and Richess,\n" + "Charms and Sorc'ry, Leasings* and Flattery, *falsehoods\n" + "Dispence, Business, and Jealousy,\n" + "That wore of yellow goldes* a garland, *sunflowers <40>\n" + "And had a cuckoo sitting on her hand,\n" + "Feasts, instruments, and caroles and dances,\n" + "Lust and array, and all the circumstances\n" + "Of Love, which I reckon'd and reckon shall\n" + "In order, were painted on the wall,\n" + "And more than I can make of mention.\n" + "For soothly all the mount of Citheron,<41>\n" + "Where Venus hath her principal dwelling,\n" + "Was showed on the wall in pourtraying,\n" + "With all the garden, and the lustiness*. *pleasantness\n" + "Nor was forgot the porter Idleness,\n" + "Nor Narcissus the fair of *yore agone*, *olden times*\n" + "Nor yet the folly of King Solomon,\n" + "Nor yet the greate strength of Hercules,\n" + "Th' enchantments of Medea and Circes,\n" + "Nor of Turnus the hardy fierce courage,\n" + "The rich Croesus *caitif in servage.* <42> *abased into slavery*\n" + "Thus may ye see, that wisdom nor richess,\n" + "Beauty, nor sleight, nor strength, nor hardiness\n" + "Ne may with Venus holde champartie*, *divided possession <43>\n" + "For as her liste the world may she gie*. *guide\n" + "Lo, all these folk so caught were in her las* *snare\n" + "Till they for woe full often said, Alas!\n" + "Suffice these ensamples one or two,\n" + "Although I could reckon a thousand mo'.\n" + "\n" + "The statue of Venus, glorious to see\n" + "Was naked floating in the large sea,\n" + "And from the navel down all cover'd was\n" + "With waves green, and bright as any glass.\n" + "A citole <44> in her right hand hadde she,\n" + "And on her head, full seemly for to see,\n" + "A rose garland fresh, and well smelling,\n" + "Above her head her doves flickering\n" + "Before her stood her sone Cupido,\n" + "Upon his shoulders winges had he two;\n" + "And blind he was, as it is often seen;\n" + "A bow he bare, and arrows bright and keen.\n" + "\n" + "Why should I not as well eke tell you all\n" + "The portraiture, that was upon the wall\n" + "Within the temple of mighty Mars the Red?\n" + "All painted was the wall in length and brede* *breadth\n" + "Like to the estres* of the grisly place *interior chambers\n" + "That hight the great temple of Mars in Thrace,\n" + "In thilke* cold and frosty region, *that\n" + "There as Mars hath his sovereign mansion.\n" + "In which there dwelled neither man nor beast,\n" + "With knotty gnarry* barren trees old *gnarled\n" + "Of stubbes sharp and hideous to behold;\n" + "In which there ran a rumble and a sough*, *groaning noise\n" + "As though a storm should bursten every bough:\n" + "And downward from an hill under a bent* *slope\n" + "There stood the temple of Mars Armipotent,\n" + "Wrought all of burnish'd steel, of which th' entry\n" + "Was long and strait, and ghastly for to see.\n" + "And thereout came *a rage and such a vise*, *such a furious voice*\n" + "That it made all the gates for to rise.\n" + "The northern light in at the doore shone,\n" + "For window on the walle was there none\n" + "Through which men mighten any light discern.\n" + "The doors were all of adamant etern,\n" + "Y-clenched *overthwart and ende-long* *crossways and lengthways*\n" + "With iron tough, and, for to make it strong,\n" + "Every pillar the temple to sustain\n" + "Was tunne-great*, of iron bright and sheen. *thick as a tun (barrel)\n" + "There saw I first the dark imagining\n" + "Of felony, and all the compassing;\n" + "The cruel ire, as red as any glede*, *live coal\n" + "The picke-purse<45>, and eke the pale dread;\n" + "The smiler with the knife under the cloak,\n" + "The shepen* burning with the blacke smoke *stable <46>\n" + "The treason of the murd'ring in the bed,\n" + "The open war, with woundes all be-bled;\n" + "Conteke* with bloody knife, and sharp menace. *contention, discord\n" + "All full of chirking* was that sorry place. *creaking, jarring noise\n" + "The slayer of himself eke saw I there,\n" + "His hearte-blood had bathed all his hair:\n" + "The nail y-driven in the shode* at night, *hair of the head <47>\n" + "The colde death, with mouth gaping upright.\n" + "Amiddes of the temple sat Mischance,\n" + "With discomfort and sorry countenance;\n" + "Eke saw I Woodness* laughing in his rage, *Madness\n" + "Armed Complaint, Outhees*, and fierce Outrage; *Outcry\n" + "The carrain* in the bush, with throat y-corve**, *corpse **slashed\n" + "A thousand slain, and not *of qualm y-storve*; *dead of sickness*\n" + "The tyrant, with the prey by force y-reft;\n" + "The town destroy'd, that there was nothing left.\n" + "Yet saw I brent* the shippes hoppesteres, <48> *burnt\n" + "The hunter strangled with the wilde bears:\n" + "The sow freting* the child right in the cradle; *devouring <49>\n" + "The cook scalded, for all his longe ladle.\n" + "Nor was forgot, *by th'infortune of Mart* *through the misfortune\n" + "The carter overridden with his cart; of war*\n" + "Under the wheel full low he lay adown.\n" + "There were also of Mars' division,\n" + "The armourer, the bowyer*, and the smith, *maker of bows\n" + "That forgeth sharp swordes on his stith*. *anvil\n" + "And all above depainted in a tower\n" + "Saw I Conquest, sitting in great honour,\n" + "With thilke* sharpe sword over his head *that\n" + "Hanging by a subtle y-twined thread.\n" + "Painted the slaughter was of Julius<50>,\n" + "Of cruel Nero, and Antonius:\n" + "Although at that time they were yet unborn,\n" + "Yet was their death depainted there beforn,\n" + "By menacing of Mars, right by figure,\n" + "So was it showed in that portraiture,\n" + "As is depainted in the stars above,\n" + "Who shall be slain, or elles dead for love.\n" + "Sufficeth one ensample in stories old,\n" + "I may not reckon them all, though I wo'ld.\n" + "\n" + "The statue of Mars upon a carte* stood *chariot\n" + "Armed, and looked grim as he were wood*, *mad\n" + "And over his head there shone two figures\n" + "Of starres, that be cleped in scriptures,\n" + "That one Puella, that other Rubeus. <51>\n" + "This god of armes was arrayed thus:\n" + "A wolf there stood before him at his feet\n" + "With eyen red, and of a man he eat:\n" + "With subtle pencil painted was this story,\n" + "In redouting* of Mars and of his glory. *reverance, fear\n" + "\n" + "Now to the temple of Dian the chaste\n" + "As shortly as I can I will me haste,\n" + "To telle you all the descriptioun.\n" + "Depainted be the walles up and down\n" + "Of hunting and of shamefast chastity.\n" + "There saw I how woful Calistope,<52>\n" + "When that Dian aggrieved was with her,\n" + "Was turned from a woman to a bear,\n" + "And after was she made the lodestar*: *pole star\n" + "Thus was it painted, I can say no far*; *farther\n" + "Her son is eke a star as men may see.\n" + "There saw I Dane <53> turn'd into a tree,\n" + "I meane not the goddess Diane,\n" + "But Peneus' daughter, which that hight Dane.\n" + "There saw I Actaeon an hart y-maked*, *made\n" + "For vengeance that he saw Dian all naked:\n" + "I saw how that his houndes have him caught,\n" + "And freten* him, for that they knew him not. *devour\n" + "Yet painted was, a little farthermore\n" + "How Atalanta hunted the wild boar;\n" + "And Meleager, and many other mo',\n" + "For which Diana wrought them care and woe.\n" + "There saw I many another wondrous story,\n" + "The which me list not drawen to memory.\n" + "This goddess on an hart full high was set*, *seated\n" + "With smalle houndes all about her feet,\n" + "And underneath her feet she had a moon,\n" + "Waxing it was, and shoulde wane soon.\n" + "In gaudy green her statue clothed was,\n" + "With bow in hand, and arrows in a case*. *quiver\n" + "Her eyen caste she full low adown,\n" + "Where Pluto hath his darke regioun.\n" + "A woman travailing was her beforn,\n" + "But, for her child so longe was unborn,\n" + "Full piteously Lucina <54> gan she call,\n" + "And saide; \"Help, for thou may'st best of all.\"\n" + "Well could he painte lifelike that it wrought;\n" + "With many a florin he the hues had bought.\n" + "Now be these listes made, and Theseus,\n" + "That at his greate cost arrayed thus\n" + "The temples, and the theatre every deal*, *part <55>\n" + "When it was done, him liked wonder well.\n" + "\n" + "But stint* I will of Theseus a lite**, *cease speaking **little\n" + "And speak of Palamon and of Arcite.\n" + "The day approacheth of their returning,\n" + "That evereach an hundred knights should bring,\n" + "The battle to darraine* as I you told; *contest\n" + "And to Athens, their covenant to hold,\n" + "Hath ev'reach of them brought an hundred knights,\n" + "Well-armed for the war at alle rights.\n" + "And sickerly* there trowed** many a man, *surely <56> **believed\n" + "That never, sithen* that the world began, *since\n" + "For to speaken of knighthood of their hand,\n" + "As far as God hath maked sea and land,\n" + "Was, of so few, so noble a company.\n" + "For every wight that loved chivalry,\n" + "And would, *his thankes, have a passant name*, *thanks to his own\n" + "Had prayed, that he might be of that game, efforts, have a\n" + "And well was him, that thereto chosen was. surpassing name*\n" + "For if there fell to-morrow such a case,\n" + "Ye knowe well, that every lusty knight,\n" + "That loveth par amour, and hath his might\n" + "Were it in Engleland, or elleswhere,\n" + "They would, their thankes, willen to be there,\n" + "T' fight for a lady; Benedicite,\n" + "It were a lusty* sighte for to see. *pleasing\n" + "And right so fared they with Palamon;\n" + "With him there wente knightes many one.\n" + "Some will be armed in an habergeon,\n" + "And in a breast-plate, and in a gipon*; *short doublet.\n" + "And some will have *a pair of plates* large; *back and front armour*\n" + "And some will have a Prusse* shield, or targe; *Prussian\n" + "Some will be armed on their legges weel;\n" + "Some have an axe, and some a mace of steel.\n" +}; + +void setup() { + int i = 0; + uint8_t c; + Serial.begin(115200); + + do { + c = pgm_read_byte_far(pgm_get_far_address(knightsTale) + i); + if (c) Serial.write(c); + i++; + } while (c); + + i = 0; + do { + c = pgm_read_byte_far(pgm_get_far_address(knightsTale2) + i); + if (c) Serial.write(c); + i++; + } while (c); +} +void loop() { +} diff --git a/ActualOptiboot/optiboot/examples/eeprom_data.c b/ActualOptiboot/optiboot/examples/eeprom_data.c new file mode 100644 index 0000000..9eff92f --- /dev/null +++ b/ActualOptiboot/optiboot/examples/eeprom_data.c @@ -0,0 +1,26 @@ +/* + * This short C progam creates a .elf file with EEPROM contents that + * can be extracted to form a .hex file for testing EEPROM upload/downloads + * via the bootloader. + * + * Compile with: + * avr-gcc -mmcu=atmega328p eeprom_data.c -o eeprom_data.elf + * avr-objcopy -j .eeprom --change-section-lma .eeprom=0 -O ihex eeprom_data.elf eeprom_data.hex + * Upload with: + * avrdude ... -U eeprom:w:eeprom_data.hex + */ +#include +#include + +#define zero16 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 +#define zero32 zero16, zero16 + +const EEMEM unsigned long longs[32] = {0x12345678, 0x9abcdef0, 0x11223344, 0, 0xdeadbeef, zero16, 0xdecade, 0x78563412}; +const EEMEM unsigned int integers[64] = {0x1234, 0x5678, 0x9ABC, 0, 0, 0, 1, 2 , zero32, 0xAB90, 0x3412}; +const EEMEM char characters[128] = "test 1 2 3 4 5 6 7 8 9 0" " " + "more testing abcdefghijklmnop"; + + +int main() {} + + diff --git a/ActualOptiboot/optiboot/examples/hex-with-FFs.hex b/ActualOptiboot/optiboot/examples/hex-with-FFs.hex new file mode 100644 index 0000000..c0baaef --- /dev/null +++ b/ActualOptiboot/optiboot/examples/hex-with-FFs.hex @@ -0,0 +1,173 @@ +:100000000C9474000C949C000C949C000C949C0028 +:100010000C949C000C949C000C949C000C949C00F0 +:100020000C949C000C949C000C949C000C949C00E0 +:100030000C949C000C949C000C949C000C949C00D0 +:100040000C94E7020C949C000C9457030C9431031D +:100050000C949C000C949C000C949C000C949C00B0 +:100060000C949C000C949C000000000024002700CD +:100070002A0000000000250028002B0004040404CE +:100080000404040402020202020203030303030342 +:10009000010204081020408001020408102001021F +:1000A00004081020746869732069732061207465E6 +:1000B0007374206F66206D616B696E672073757253 +:1000C000652064617461206D616B657320697420C3 +:1000D000696E746F20746865207465787420736528 +:1000E000676D656E7400F60311241FBECFEFD8E074 +:1000F000DEBFCDBF11E0A0E0B1E0E8EBFAE002C066 +:1001000005900D92A231B107D9F721E0A2E1B1E04B +:1001100001C01D92A83BB207E1F710E0C4E7D0E0B0 +:1001200004C02197FE010E942304C337D107C9F7F9 +:100130000E9489030C942E040C940000FFFFFFFF23 +:10014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:10017000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:10018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:10019000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:1001A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:1001B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:1001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:1001D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:1001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:1001F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:10020000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:10021000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:10022000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:10023000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:10024000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:10025000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:10026000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:10027000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:10028000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:10029000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:1002A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:1002B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:1002C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:1002D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:1002E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:1002F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:10030000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:10031000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:10032000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:10033000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:10034000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:10035000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:10036000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:10037000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:10038000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:10039000FFFFFFFFFC01538D448D252F30E0842F9C +:1003A00090E0821B930B541710F0CF96089501979D +:1003B0000895FC01918D828D981761F0828DDF0187 +:1003C000A80FB11D5D968C91928D9F5F9F73928F48 +:1003D00090E008958FEF9FEF0895FC01918D828D3D +:1003E000981731F0828DE80FF11D858D90E008950A +:1003F0008FEF9FEF0895FC01918D228D892F90E062 +:10040000805C9F4F821B91098F7399270895FC018F +:10041000848DDF01A80FB11DA35ABF4F2C91848D8D +:1004200090E001968F739927848FA689B7892C93C2 +:10043000A089B1898C9180648C93938D848D98135D +:1004400006C00288F389E02D80818F7D8083089526 +:10045000EF92FF920F931F93CF93DF93EC0181E014 +:10046000888F9B8D8C8D981305C0E889F9898081D0 +:1004700085FD24C0F62E0B8D10E00F5F1F4F0F730C +:100480001127E02E8C8DE8120CC00FB607FCFACFB6 +:10049000E889F989808185FFF5CFCE010E940702A6 +:1004A000F1CF8B8DFE01E80FF11DE35AFF4FF08273 +:1004B0000B8FEA89FB898081806207C0EE89FF8902 +:1004C0006083E889F98980818064808381E090E09D +:1004D000DF91CF911F910F91FF90EF900895CF93EF +:1004E000DF93EC01888D8823C9F0EA89FB8980813C +:1004F00085FD05C0A889B9898C9186FD0FC00FB60E +:1005000007FCF5CF808185FFF2CFA889B9898C914E +:1005100085FFEDCFCE010E940702E7CFDF91CF919B +:1005200008958BE191E00E94FB0121E0892B09F401 +:1005300020E0822F089580E090E0892B29F00E942E +:10054000910281110C9400000895CF92DF92EF92F6 +:10055000FF920F931F93CF93DF936C017A018B016E +:10056000C0E0D0E0CE15DF0581F0D8016D918D019E +:10057000D601ED91FC910190F081E02DC601099525 +:10058000892B11F02196EECF7E01C701DF91CF912B +:100590001F910F91FF90EF90DF90CF9008950895F5 +:1005A00080E090E00895009769F0FC010190002040 +:1005B000E9F73197AF01481B590BBC018BE191E082 +:1005C0000C94A50280E090E008950E9429041F92F7 +:1005D0000F920FB60F9211242F933F938F939F93F7 +:1005E000AF93BF938091170190911801A0911901C9 +:1005F000B0911A013091160123E0230F2D3720F41A +:100600000196A11DB11D05C026E8230F0296A11D6C +:10061000B11D209316018093170190931801A093A8 +:100620001901B0931A018091120190911301A091C8 +:100630001401B09115010196A11DB11D8093120105 +:1006400090931301A0931401B0931501BF91AF9142 +:100650009F918F913F912F910F900FBE0F901F9000 +:1006600018951F920F920FB60F9211242F933F935C +:100670004F935F936F937F938F939F93AF93BF93AA +:10068000EF93FF938BE191E00E940702FF91EF91BE +:10069000BF91AF919F918F917F916F915F914F919A +:1006A0003F912F910F900FBE0F901F9018951F92A2 +:1006B0000F920FB60F9211242F938F939F93EF9366 +:1006C000FF93E0912B01F0912C018081E0913101A9 +:1006D000F091320182FD12C09081809134018F5FD0 +:1006E0008F7320913501821751F0E0913401F0E0D1 +:1006F000E55EFE4F958F8093340101C08081FF91AC +:10070000EF919F918F912F910F900FBE0F901F909F +:100710001895789484B5826084BD84B5816084BD69 +:1007200085B5826085BD85B5816085BD80916E008F +:10073000816080936E0010928100809181008260C0 +:1007400080938100809181008160809381008091FD +:1007500080008160809380008091B10084608093EC +:10076000B1008091B00081608093B00080917A00E8 +:10077000846080937A0080917A00826080937A000E +:1007800080917A00816080937A0080917A008068FD +:1007900080937A001092C100EDE9F0E02491E9E83D +:1007A000F0E08491882399F090E0880F991FFC0174 +:1007B000E859FF4FA591B491FC01EE58FF4F859188 +:1007C00094918FB7F894EC91E22BEC938FBF84EA6D +:1007D00090E00E94D3028CE391E00E94D3028CE56A +:1007E00098E00E94D3020E949B02FDCFEBE1F1E072 +:1007F0001382128288EE93E0A0E0B0E084839583B8 +:10080000A683B78384E091E09183808385EC90E0B8 +:100810009587848784EC90E09787868780EC90E0CA +:10082000918B808B81EC90E0938B828B82EC90E0BB +:10083000958B848B86EC90E0978B868B118E128E35 +:10084000138E148E0895EE0FFF1F0590F491E02D86 +:10085000099481E090E0F8940C942E04FFFFFFFFD0 +:10086000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:10087000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:10088000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10089000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:1008A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:1008B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:1008C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:1008D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:1008E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:1008F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10090000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10091000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:10092000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:10093000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:10094000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:10095000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:10096000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:10097000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:10098000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:10099000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:1009A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:1009B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:1009C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:1009D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:1009E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:1009F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:100A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:100A1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:100A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:100A3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:100A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:100A5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:100A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:100A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:100A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:100A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:100AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:020AC800ED013E +:00000001FF diff --git a/ActualOptiboot/optiboot/examples/test_eeprom/test_eeprom.ino b/ActualOptiboot/optiboot/examples/test_eeprom/test_eeprom.ino new file mode 100644 index 0000000..727660c --- /dev/null +++ b/ActualOptiboot/optiboot/examples/test_eeprom/test_eeprom.ino @@ -0,0 +1,107 @@ +/* + EEPROM test program with more features. +*/ + +#include + +void setup() { + // initialize the LED pin as an output. + pinMode(13, OUTPUT); + Serial.begin(115200); + Serial.println("EEPROM test program.\n" + "Enter one of (C)lear, (E)rase, (I)incrementing, (U)p&Down, (0)check,\n" + "(D)ump, (F)check, (T)inccheck"); + +} + +void hex2(uint8_t n) { + if (n <= 15) + Serial.write('0'); + Serial.print(n, HEX); + Serial.write(' '); +} + +void print16(uint8_t *buf) { + for (int i = 0; i < 16; i++) { + hex2(buf[i]); + } + Serial.print(" "); + for (int i = 0; i < 16; i++) { + uint8_t c = buf[i]; + if (c < 32 || c > 126) + Serial.write('.'); + else + Serial.write(c); + } + Serial.println(); +} + +void dump16(uint16_t addr) { + struct { + uint8_t buf[16]; + } s; + + EEPROM.get(addr, s); + print16(s.buf); +} + + +int cmd = -1; +void loop() { + uint16_t i; + do { + cmd = Serial.read(); + } while (cmd < 0); + + switch (cmd & ~('a' - 'A')) { + case 'C': + for (i = 0 ; i < EEPROM.length() ; i++) { + EEPROM.write(i, 0); + } + break; + case 'D': + Serial.println("EEPROM Dump\n"); + for (i = 0; i < EEPROM.length(); i += 16) { + Serial.print(i, HEX); + Serial.print(": "); + dump16(i); + } + Serial.println(); + break; + case 'E': + for (i = 0 ; i < EEPROM.length() ; i++) { + EEPROM.write(i, 0xFF); + } + break; + case 'I': + for (i = 0 ; i < EEPROM.length() ; i++) { + EEPROM.write(i, i & 0xFF); + } + break; + case 'U': + for (i = 0 ; i < EEPROM.length() ; i++) { + if ((i & 0x100) == 0) { + EEPROM.write(i, i & 0xFF); + } else { + EEPROM.write(i, 255 - (i & 0xFF)); + } + } + break; + case '?': + Serial.println("EEPROM test program.\n" + "Enter one of (C)lear, (E)rase, (I)incrementing, (0)check,\n" + "(D)ump, (F)check, (T)inccheck"); + // Fall through + case '\n': + case '\r': + break; + default: + Serial.print("unrecognized command "); + Serial.println(cmd); + break; + // turn the LED on when we're done + digitalWrite(13, HIGH); + } +} + + diff --git a/ActualOptiboot/optiboot/examples/test_reset/test_reset.ino b/ActualOptiboot/optiboot/examples/test_reset/test_reset.ino new file mode 100644 index 0000000..a7740f7 --- /dev/null +++ b/ActualOptiboot/optiboot/examples/test_reset/test_reset.ino @@ -0,0 +1,137 @@ +/* + test_reset + May 2015 by Bill Westfield (WestfW) + Released to the public domain. + + This sketch demonstrates retrival of the Reset Cause register (MCUSR) of the AVR. + Normally, MCUSR itself is destroyed by the use of a bootloader, but Optiboot v4.6 + and later save the contents in register r2, where it can be accessed by an + application. +*/ +#include +#if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega168__) +#include +#endif + +/* + First, we need a variable to hold the reset cause that can be written before + early sketch initialization (that might change r2), and won't be reset by the + various initialization code. + avr-gcc provides for this via the ".noinit" section. +*/ +uint8_t resetFlag __attribute__ ((section(".noinit"))); + +/* + Next, we need to put some code to save reset cause from the bootload (in r2) + to the variable. Again, avr-gcc provides special code sections for this. + If compiled with link time optimization (-flto), as done by the Arduno + IDE version 1.6 and higher, we need the "used" attribute to prevent this + from being omitted. +*/ +void resetFlagsInit(void) __attribute__ ((naked)) +__attribute__ ((used)) +__attribute__ ((section (".init0"))); +void resetFlagsInit(void) +{ + /* + save the reset flags passed from the bootloader + This is a "simple" matter of storing (STS) r2 in the special variable + that we have created. We use assembler to access the right variable. + */ + __asm__ __volatile__ ("sts %0, r2\n" : "=m" (resetFlag) :); +} + +void printReset(const char *label, uint8_t resetFlags) +{ + Serial.print(label); + Serial.print(resetFlags, HEX); + /* + check for the usual bits. Note that the symnbols defined in wdt.h are + bit numbers, so they have to be shifted before comparison. + */ + if (resetFlags & (1 << WDRF)) + { + Serial.print(F(" Watchdog")); + resetFlags &= ~(1 << WDRF); + } + if (resetFlags & (1 << BORF)) + { + Serial.print(F(" Brownout")); + resetFlags &= ~(1 << BORF); + } + if (resetFlags & (1 << EXTRF)) + { + Serial.print(F(" External")); + resetFlags &= ~(1 << EXTRF); + } + if (resetFlags & (1 << PORF)) + { + Serial.print(F(" PowerOn")); + resetFlags &= ~(1 << PORF); + } + if (resetFlags != 0x00) + { + // It should never enter here + Serial.print(" Unknown"); + } + Serial.println(""); +} + +void setup() { + Serial.begin(9600); // Initialize serial port + + Serial.println(F("Reset flag test\n")); + + printReset("Actual MCUSR content: 0x", MCUSR); + printReset("Passed in R2: 0x", resetFlag); +#ifdef GPIOR0 + printReset("Passed in GPIOR0: 0x", GPIOR0); +#endif +} + +void loop() { + int ch; + Serial.println(F("\nSend 0-9 to set MCUSR, (W)atchdog enable, (J)mp to bootload, (S)leep")); + while ((ch = Serial.read()) < 0) ; + if (ch >= '0' && ch <= '9') { + MCUSR = ch & 0xF; + printReset("\nNew MCUSR content: 0x", MCUSR); + } else + switch (ch & ~('a' - 'A')) { + + case 'W': + wdt_enable(WDTO_15MS); + while (1); // To prevent the loop to start again before WDT resets the board + break; + case 'S': +#if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega168__) + // Enter power down state for 8 s with ADC and BOD module disabled + Serial.println(F("Low Power Sleep Mode")); + Serial.flush(); + LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); + Serial.println(F("Sleep Wakeup")); + Serial.flush(); +#else + Serial.print(F("\nPower down not supported on this CPU\n")); +#endif + break; + + case 'J': + /* Figure out where the bootloader starts. */ +#if FLASHEND > 140000 + Serial.println(F("Jump to bootloader not supported on chips with >128k memory")); +#else + typedef void (*do_reboot_t)(void); + const do_reboot_t do_reboot = (do_reboot_t)((FLASHEND - 511) >> 1); + + Serial.print("bootstart = "); + Serial.println((unsigned int)do_reboot, HEX); + Serial.flush(); + cli(); TCCR0A = TCCR1A = TCCR2A = 0; // make sure interrupts are off and timers are reset. + do_reboot(); +#endif + break; + } + +} + diff --git a/ActualOptiboot/optiboot/package_optiboot_optiboot-additional_index.json.TEMPLATE b/ActualOptiboot/optiboot/package_optiboot_optiboot-additional_index.json.TEMPLATE new file mode 100644 index 0000000..10cb5c5 --- /dev/null +++ b/ActualOptiboot/optiboot/package_optiboot_optiboot-additional_index.json.TEMPLATE @@ -0,0 +1,56 @@ +# Template file for generating the .json file that the Arduino IDE +# "Boards Manager" wants to see. This file must be pre-processed +# before it will be valid: +# Strip comments. +# Replace variables: +# %VERSION% gets the Optiboot Version +# %HASH% gets the SHA-256 has for the .zip file. +# (generate with: openssl dgst -sha256 optiboot.zip | sed -e 's/.* //' +# %SIZE% gets the size of the .zip file +# +{ + "packages": [ + { + "name": "Optiboot", + "maintainer": "westfw", + "websiteURL": "https://github.com/Optiboot/optiboot", + "email": "", + "help": { + "online": "" + }, + "platforms": [ + { + "name": "Optiboot %VERSION%", + "architecture": "avr", + "version": "0.%VERSION%", +# +# 3r party packages must use "Contributed" +# + "category": "Contributed", + "help": { + "online": "https://github.com/Optiboot/optiboot/wiki" + }, + "url": "https://github.com/Optiboot/optiboot/releases/download/v%VERSION%/Optiboot%VERSION%.zip", + "archiveFileName": "optiboot%VERSION%.zip", +# +# Package file verification data +# + "checksum": "SHA-256:%HASH%", + "size": "%SIZE%", +# + "boards": [ + {"name": "New Optiboot"} + ], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avrdude", + "version": "6.0.1-arduino5" + } + ] + } + ], + "tools": [] + } + ] +} diff --git a/ActualOptiboot/optiboot/release.sh b/ActualOptiboot/optiboot/release.sh new file mode 100644 index 0000000..287fb9d --- /dev/null +++ b/ActualOptiboot/optiboot/release.sh @@ -0,0 +1,75 @@ +#%/bin/bash +# +# Use like: "sh release.sh " +# +# Build a "release" .zip file for Optiboot bootloader +# Run from the build directory + +# Uncomment if you want a clean builds of specific files +# make clean +# make atmega328 +# make atmega168 +# make atmega8 + +rm -Rf /tmp/optiboot-release + +# +# Create the 3rd-party hardware extension directory structure +# Note that the structure under "packages" (handed by boards manager) +# is different than the structure under "sketchbook/hardware" would be. + +TOP=/tmp/optiboot-release/Optiboot$1/ +# +# Bootloaders directory +mkdir -p $TOP/bootloaders/optiboot +# cores, variants, libraries +# mkdir -p $TOP/variants/ +mkdir -p $TOP/libraries/ +# Less common: firmware, system. +# mkdir -p $TOP/firmwares/ +# mkdir -p $TOP/system/ + +# +# Copy files from whereever into the release directory +cp ../../boards-1.6.txt $TOP/boards.txt +#cp -R ../../examples $TOP/libraries/ +#cp -R ../../variants $TOP/ +#cp -R ../../system $TOP/ + +# +# Create platform.txt, because it contains the "group" name for the boards menu +echo name=Optiboot $1 > $TOP/platform.txt +echo version=$1 >> $TOP/platform.txt + +# +# Create a README file. +echo This is an Optiboot version $1 \"Binary\" Release. > $TOP/README.TXT +echo >> $TOP/README.TXT +echo For Source code see http://github.com/Optiboot/optiboot>> $TOP/README.TXT + +# +# Copy over our "binaries." +cp *.hex $TOP/bootloaders/optiboot + +# +# Copy examples ? (examples for a boards.txt don't seem possible?) + + +# files we'd specifical exclude, if we weren't doing only .hex files. +#rm /tmp/optiboot-release/Optiboot/avr/bootloaders/optiboot/*.lst +#rm /tmp/optiboot-release/Optiboot/avr/bootloaders/optiboot/*~ +#rm /tmp/optiboot-release/Optiboot/avr/bootloaders/optiboot/#* + +# +# zip everything up. +pushd /tmp/optiboot-release +zip -r Optiboot$1.zip Optiboot$1 +HASH=`openssl dgst -sha256 Optiboot$1.zip | sed -e 's/.* //'` +SIZE=`stat -f %z Optiboot$1.zip` +popd +sed -e "s/#.*//" -e "s/%HASH%/$HASH/g" -e "s/%VERSION%/$1/g" -e "s/%SIZE%/$SIZE/g" ../../package_optiboot_optiboot-additional_index.json.TEMPLATE > /tmp/optiboot-release/package_optiboot_optiboot-additional_index.json + +# +# This leaves the .zip and the .json file in /tmp/optiboot-release +# where it can be copied to a suitable network location. + diff --git a/ActualOptiboot/scripts/travis-build.sh b/ActualOptiboot/scripts/travis-build.sh new file mode 100755 index 0000000..daf7a23 --- /dev/null +++ b/ActualOptiboot/scripts/travis-build.sh @@ -0,0 +1,113 @@ +#!/usr/bin/env bash + +LOCAL_TOOLS_DIR=$HOME/avr-tools +MAKE_PACKAGE=make_4.1-6_amd64.deb +WGET_FLAGS="--retry-connrefused --tries=3 --timeout=60 --continue" + + +if [ -z "$TRAVIS_BUILD_DIR" ]; then + echo "This script should be run by Travis-CI environment" + echo "If you want to simulate Travis build, please set TRAVIS_BUILD_DIR" + echo "envirinment variable to directory where your code lives" + exit 1 +fi + +if [ -z "$1" ]; then + echo "Arduino version required" + exit 1 +fi + +if [ -z "$2" ]; then + echo "Target required" + exit 1 +fi + + +# oownload and unpack package +function download_and_unpack() +{ + cd $LOCAL_TOOLS_DIR + + # check if tools are already in place + if [ -d arduino-$1/hardware/tools/avr ]; then + echo "Arduino version $1 already downloaded and extracted, skipping" + return + fi + + echo "Downloading Arduino version $1" + + # default package extension + local arduExt="tar.xz" + + # for packages in version <1.6 extension is .tgz + local regex="1\.[05]" + if [[ "$1" =~ $regex ]]; then arduExt="tgz"; fi + + # download package + wget $WGET_FLAGS "http://downloads.arduino.cc/arduino-$1-linux64.$arduExt" + if [ $? -ne 0 ]; then + echo "ERROR: Can't download Arduino" + rm arduino-$1-linux64.$arduExt* + exit 1 + fi + + # try to check md5sum, but Arduino provide only checksums for version 1.6 and greater + wget $WGET_FLAGS https://downloads.arduino.cc/arduino-$1.md5sum.txt + if [ $? -eq -0 ]; then + cat arduino-$1.md5sum.txt|grep "linux64"|md5sum -c + if [ $? -ne 0 ]; then + echo "ERROR: md5sum for downloaded Arduino doesn't match" + rm arduino-$1.md5sum.txt* + exit 1 + fi + rm arduino-$1.md5sum.txt* + fi + + # extract only avr-gcc + tar xf arduino-$1-linux64.$arduExt --wildcards '*/hardware/tools/avr/' + + # clean up + rm arduino-$1-linux64.$arduExt* +} + +function get_make4() +{ + cd $LOCAL_TOOLS_DIR + + # check for existence + if [ -x usr/bin/make ]; then + echo "Make already in place, skipping" + return + fi + + # download + wget http://archive.ubuntu.com/ubuntu/pool/main/m/make-dfsg/$MAKE_PACKAGE + if [ $? -ne 0 ]; then + echo "ERROR: Can't download make4" + exit 1 + fi + + # unpack + dpkg-deb -x $MAKE_PACKAGE $LOCAL_TOOLS_DIR + + # clean up + rm ${MAKE_PACKAGE}* +} + +# make directory for tools +mkdir -p $LOCAL_TOOLS_DIR + +# get new make as Optiboot requires version >4.0 +get_make4 + +# download specific Arduino version +download_and_unpack $1 + +# set search path +PATH=$LOCAL_TOOLS_DIR/usr/bin:$PATH:$LOCAL_TOOLS_DIR/arduino-$1/hardware/tools/avr/bin + +cd $TRAVIS_BUILD_DIR/optiboot/bootloaders/optiboot + +make --version +make clean +make $2