From 67d25d837ac55f28a366c0a3b262e439a6e75fc3 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 19 Aug 2017 12:15:28 +0200 Subject: Add AmForth --- amforth-6.5/avr8/amforth-eeprom.inc | 64 + amforth-6.5/avr8/amforth-interpreter.asm | 33 + amforth-6.5/avr8/amforth-low.asm | 31 + amforth-6.5/avr8/amforth.asm | 39 + amforth-6.5/avr8/devices/at90can128/at90can128.frt | 465 ++++ amforth-6.5/avr8/devices/at90can128/device.asm | 145 + amforth-6.5/avr8/devices/at90can128/device.inc | 1707 ++++++++++++ amforth-6.5/avr8/devices/at90can128/device.py | 507 ++++ .../avr8/devices/at90can128/words/no-jtag.asm | 14 + .../avr8/devices/at90can128/words/no-wdt.asm | 22 + .../avr8/devices/at90can128/words/sleep.asm | 19 + amforth-6.5/avr8/devices/at90can32/at90can32.frt | 465 ++++ amforth-6.5/avr8/devices/at90can32/device.asm | 139 + amforth-6.5/avr8/devices/at90can32/device.inc | 1707 ++++++++++++ amforth-6.5/avr8/devices/at90can32/device.py | 507 ++++ .../avr8/devices/at90can32/words/no-jtag.asm | 14 + .../avr8/devices/at90can32/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/at90can32/words/sleep.asm | 19 + amforth-6.5/avr8/devices/at90can64/at90can64.frt | 465 ++++ amforth-6.5/avr8/devices/at90can64/device.asm | 139 + amforth-6.5/avr8/devices/at90can64/device.inc | 1707 ++++++++++++ amforth-6.5/avr8/devices/at90can64/device.py | 507 ++++ .../avr8/devices/at90can64/words/no-jtag.asm | 14 + .../avr8/devices/at90can64/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/at90can64/words/sleep.asm | 19 + amforth-6.5/avr8/devices/at90pwm1/at90pwm1.frt | 381 +++ amforth-6.5/avr8/devices/at90pwm1/device.asm | 121 + amforth-6.5/avr8/devices/at90pwm1/device.inc | 1143 ++++++++ amforth-6.5/avr8/devices/at90pwm1/device.py | 404 +++ .../avr8/devices/at90pwm1/words/no-jtag.asm | 14 + amforth-6.5/avr8/devices/at90pwm1/words/no-wdt.asm | 34 + amforth-6.5/avr8/devices/at90pwm1/words/sleep.asm | 19 + .../devices/at90pwm161/blocks/AD_CONVERTER.frt | 71 + .../at90pwm161/blocks/ANALOG_COMPARATOR.frt | 69 + .../avr8/devices/at90pwm161/blocks/BOOT_LOAD.frt | 21 + amforth-6.5/avr8/devices/at90pwm161/blocks/CPU.frt | 114 + .../devices/at90pwm161/blocks/DA_CONVERTER.frt | 19 + .../avr8/devices/at90pwm161/blocks/EEPROM.frt | 21 + .../at90pwm161/blocks/EXTERNAL_INTERRUPT.frt | 17 + .../avr8/devices/at90pwm161/blocks/PORTB.frt | 7 + .../avr8/devices/at90pwm161/blocks/PORTD.frt | 7 + .../avr8/devices/at90pwm161/blocks/PORTE.frt | 7 + .../avr8/devices/at90pwm161/blocks/PSC0.frt | 90 + .../avr8/devices/at90pwm161/blocks/PSC2.frt | 126 + amforth-6.5/avr8/devices/at90pwm161/blocks/SPI.frt | 27 + .../devices/at90pwm161/blocks/TIMER_COUNTER_1.frt | 25 + .../avr8/devices/at90pwm161/blocks/WATCHDOG.frt | 15 + amforth-6.5/avr8/devices/at90pwm161/device.asm | 52 + amforth-6.5/avr8/devices/at90pwm161/device.frt | 613 +++++ amforth-6.5/avr8/devices/at90pwm161/device.py | 389 +++ amforth-6.5/avr8/devices/at90pwm2/at90pwm2.frt | 193 ++ amforth-6.5/avr8/devices/at90pwm2/device.asm | 137 + amforth-6.5/avr8/devices/at90pwm2/device.inc | 1539 +++++++++++ amforth-6.5/avr8/devices/at90pwm2/device.py | 155 ++ amforth-6.5/avr8/devices/at90pwm216/at90pwm216.frt | 423 +++ amforth-6.5/avr8/devices/at90pwm216/device.asm | 123 + amforth-6.5/avr8/devices/at90pwm216/device.inc | 1281 +++++++++ amforth-6.5/avr8/devices/at90pwm216/device.py | 448 ++++ .../avr8/devices/at90pwm216/words/no-jtag.asm | 14 + .../avr8/devices/at90pwm216/words/no-wdt.asm | 34 + .../avr8/devices/at90pwm216/words/sleep.asm | 19 + amforth-6.5/avr8/devices/at90pwm2b/at90pwm2b.frt | 423 +++ amforth-6.5/avr8/devices/at90pwm2b/device.asm | 123 + amforth-6.5/avr8/devices/at90pwm2b/device.inc | 1281 +++++++++ amforth-6.5/avr8/devices/at90pwm2b/device.py | 448 ++++ .../avr8/devices/at90pwm2b/words/no-jtag.asm | 14 + .../avr8/devices/at90pwm2b/words/no-wdt.asm | 34 + amforth-6.5/avr8/devices/at90pwm2b/words/sleep.asm | 19 + amforth-6.5/avr8/devices/at90pwm3/at90pwm3.frt | 217 ++ amforth-6.5/avr8/devices/at90pwm3/device.asm | 139 + amforth-6.5/avr8/devices/at90pwm3/device.inc | 1791 +++++++++++++ amforth-6.5/avr8/devices/at90pwm3/device.py | 175 ++ amforth-6.5/avr8/devices/at90pwm316/at90pwm316.frt | 478 ++++ amforth-6.5/avr8/devices/at90pwm316/device.asm | 125 + amforth-6.5/avr8/devices/at90pwm316/device.inc | 1467 ++++++++++ amforth-6.5/avr8/devices/at90pwm316/device.py | 505 ++++ .../avr8/devices/at90pwm316/words/no-jtag.asm | 14 + .../avr8/devices/at90pwm316/words/no-wdt.asm | 34 + .../avr8/devices/at90pwm316/words/sleep.asm | 19 + amforth-6.5/avr8/devices/at90pwm3b/at90pwm3b.frt | 478 ++++ amforth-6.5/avr8/devices/at90pwm3b/device.asm | 125 + amforth-6.5/avr8/devices/at90pwm3b/device.inc | 1467 ++++++++++ amforth-6.5/avr8/devices/at90pwm3b/device.py | 505 ++++ .../avr8/devices/at90pwm3b/words/no-jtag.asm | 14 + .../avr8/devices/at90pwm3b/words/no-wdt.asm | 34 + amforth-6.5/avr8/devices/at90pwm3b/words/sleep.asm | 19 + amforth-6.5/avr8/devices/at90pwm81/at90pwm81.frt | 370 +++ amforth-6.5/avr8/devices/at90pwm81/device.asm | 96 + amforth-6.5/avr8/devices/at90pwm81/device.inc | 1080 ++++++++ amforth-6.5/avr8/devices/at90pwm81/device.py | 389 +++ .../avr8/devices/at90pwm81/words/no-jtag.asm | 14 + .../avr8/devices/at90pwm81/words/no-wdt.asm | 34 + amforth-6.5/avr8/devices/at90pwm81/words/sleep.asm | 19 + .../avr8/devices/at90usb1286/at90usb1286.frt | 486 ++++ amforth-6.5/avr8/devices/at90usb1286/device.asm | 145 + amforth-6.5/avr8/devices/at90usb1286/device.inc | 1611 +++++++++++ amforth-6.5/avr8/devices/at90usb1286/device.py | 523 ++++ .../avr8/devices/at90usb1286/words/no-jtag.asm | 14 + .../avr8/devices/at90usb1286/words/no-wdt.asm | 34 + .../avr8/devices/at90usb1286/words/sleep.asm | 19 + .../avr8/devices/at90usb1287/at90usb1287.frt | 587 ++++ amforth-6.5/avr8/devices/at90usb1287/device.asm | 146 + amforth-6.5/avr8/devices/at90usb1287/device.inc | 1914 +++++++++++++ amforth-6.5/avr8/devices/at90usb1287/device.py | 625 +++++ .../avr8/devices/at90usb1287/words/no-jtag.asm | 14 + .../avr8/devices/at90usb1287/words/no-wdt.asm | 34 + .../avr8/devices/at90usb1287/words/sleep.asm | 19 + amforth-6.5/avr8/devices/at90usb162/at90usb162.frt | 367 +++ amforth-6.5/avr8/devices/at90usb162/device.asm | 113 + amforth-6.5/avr8/devices/at90usb162/device.inc | 1155 ++++++++ amforth-6.5/avr8/devices/at90usb162/device.py | 387 +++ .../avr8/devices/at90usb162/words/no-jtag.asm | 14 + .../avr8/devices/at90usb162/words/no-wdt.asm | 34 + .../avr8/devices/at90usb162/words/sleep.asm | 19 + amforth-6.5/avr8/devices/at90usb646/at90usb646.frt | 587 ++++ amforth-6.5/avr8/devices/at90usb646/device.asm | 140 + amforth-6.5/avr8/devices/at90usb646/device.inc | 1914 +++++++++++++ amforth-6.5/avr8/devices/at90usb646/device.py | 625 +++++ .../avr8/devices/at90usb646/words/no-jtag.asm | 14 + .../avr8/devices/at90usb646/words/no-wdt.asm | 34 + .../avr8/devices/at90usb646/words/sleep.asm | 19 + amforth-6.5/avr8/devices/at90usb647/at90usb647.frt | 587 ++++ amforth-6.5/avr8/devices/at90usb647/device.asm | 140 + amforth-6.5/avr8/devices/at90usb647/device.inc | 1914 +++++++++++++ amforth-6.5/avr8/devices/at90usb647/device.py | 625 +++++ .../avr8/devices/at90usb647/words/no-jtag.asm | 14 + .../avr8/devices/at90usb647/words/no-wdt.asm | 34 + .../avr8/devices/at90usb647/words/sleep.asm | 19 + amforth-6.5/avr8/devices/at90usb82/at90usb82.frt | 367 +++ amforth-6.5/avr8/devices/at90usb82/device.asm | 113 + amforth-6.5/avr8/devices/at90usb82/device.inc | 1155 ++++++++ amforth-6.5/avr8/devices/at90usb82/device.py | 387 +++ .../avr8/devices/at90usb82/words/no-jtag.asm | 14 + .../avr8/devices/at90usb82/words/no-wdt.asm | 34 + amforth-6.5/avr8/devices/at90usb82/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega103/atmega103.frt | 124 + amforth-6.5/avr8/devices/atmega103/device.asm | 126 + amforth-6.5/avr8/devices/atmega103/device.inc | 825 ++++++ amforth-6.5/avr8/devices/atmega103/device.py | 88 + amforth-6.5/avr8/devices/atmega128/atmega128.frt | 329 +++ amforth-6.5/avr8/devices/atmega128/device.asm | 141 + amforth-6.5/avr8/devices/atmega128/device.inc | 1179 ++++++++ amforth-6.5/avr8/devices/atmega128/device.py | 403 +++ .../avr8/devices/atmega128/words/no-jtag.asm | 14 + .../avr8/devices/atmega128/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/atmega128/words/sleep.asm | 24 + amforth-6.5/avr8/devices/atmega1280/atmega1280.frt | 580 ++++ amforth-6.5/avr8/devices/atmega1280/device.asm | 190 ++ amforth-6.5/avr8/devices/atmega1280/device.inc | 1980 ++++++++++++++ amforth-6.5/avr8/devices/atmega1280/device.py | 633 +++++ .../avr8/devices/atmega1280/words/no-jtag.asm | 14 + .../avr8/devices/atmega1280/words/no-wdt.asm | 34 + .../avr8/devices/atmega1280/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega1281/atmega1281.frt | 509 ++++ amforth-6.5/avr8/devices/atmega1281/device.asm | 184 ++ amforth-6.5/avr8/devices/atmega1281/device.inc | 1686 ++++++++++++ amforth-6.5/avr8/devices/atmega1281/device.py | 556 ++++ .../avr8/devices/atmega1281/words/no-jtag.asm | 14 + .../avr8/devices/atmega1281/words/no-wdt.asm | 34 + .../avr8/devices/atmega1281/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega1284/atmega1284.frt | 380 +++ amforth-6.5/avr8/devices/atmega1284/device.asm | 135 + amforth-6.5/avr8/devices/atmega1284/device.inc | 1263 +++++++++ amforth-6.5/avr8/devices/atmega1284/device.py | 421 +++ .../avr8/devices/atmega1284/words/no-jtag.asm | 14 + .../avr8/devices/atmega1284/words/no-wdt.asm | 34 + .../avr8/devices/atmega1284/words/sleep.asm | 19 + .../avr8/devices/atmega1284p/atmega1284p.frt | 380 +++ amforth-6.5/avr8/devices/atmega1284p/device.asm | 135 + amforth-6.5/avr8/devices/atmega1284p/device.inc | 1263 +++++++++ amforth-6.5/avr8/devices/atmega1284p/device.py | 423 +++ .../avr8/devices/atmega1284p/words/no-jtag.asm | 14 + .../avr8/devices/atmega1284p/words/no-wdt.asm | 34 + .../avr8/devices/atmega1284p/words/sleep.asm | 19 + .../devices/atmega1284rfr2/blocks/AD_CONVERTER.frt | 79 + .../atmega1284rfr2/blocks/ANALOG_COMPARATOR.frt | 27 + .../devices/atmega1284rfr2/blocks/BOOT_LOAD.frt | 21 + .../avr8/devices/atmega1284rfr2/blocks/CPU.frt | 128 + .../avr8/devices/atmega1284rfr2/blocks/EEPROM.frt | 19 + .../atmega1284rfr2/blocks/EXTERNAL_INTERRUPT.frt | 45 + .../avr8/devices/atmega1284rfr2/blocks/FLASH.frt | 16 + .../avr8/devices/atmega1284rfr2/blocks/JTAG.frt | 13 + .../avr8/devices/atmega1284rfr2/blocks/PORTA.frt | 7 + .../avr8/devices/atmega1284rfr2/blocks/PORTB.frt | 7 + .../avr8/devices/atmega1284rfr2/blocks/PORTC.frt | 7 + .../avr8/devices/atmega1284rfr2/blocks/PORTD.frt | 7 + .../avr8/devices/atmega1284rfr2/blocks/PORTE.frt | 7 + .../avr8/devices/atmega1284rfr2/blocks/PORTF.frt | 7 + .../avr8/devices/atmega1284rfr2/blocks/PORTG.frt | 7 + .../avr8/devices/atmega1284rfr2/blocks/PWRCTRL.frt | 81 + .../avr8/devices/atmega1284rfr2/blocks/SPI.frt | 29 + .../avr8/devices/atmega1284rfr2/blocks/SYMCNT.frt | 156 ++ .../atmega1284rfr2/blocks/TIMER_COUNTER_0.frt | 54 + .../atmega1284rfr2/blocks/TIMER_COUNTER_1.frt | 68 + .../atmega1284rfr2/blocks/TIMER_COUNTER_2.frt | 67 + .../atmega1284rfr2/blocks/TIMER_COUNTER_3.frt | 68 + .../atmega1284rfr2/blocks/TIMER_COUNTER_4.frt | 68 + .../atmega1284rfr2/blocks/TIMER_COUNTER_5.frt | 68 + .../avr8/devices/atmega1284rfr2/blocks/TRX24.frt | 495 ++++ .../avr8/devices/atmega1284rfr2/blocks/TWI.frt | 40 + .../avr8/devices/atmega1284rfr2/blocks/USART0.frt | 51 + .../devices/atmega1284rfr2/blocks/USART0_SPI.frt | 29 + .../avr8/devices/atmega1284rfr2/blocks/USART1.frt | 51 + .../devices/atmega1284rfr2/blocks/USART1_SPI.frt | 29 + .../devices/atmega1284rfr2/blocks/WATCHDOG.frt | 15 + amforth-6.5/avr8/devices/atmega1284rfr2/device.asm | 166 ++ amforth-6.5/avr8/devices/atmega1284rfr2/device.frt | 1752 ++++++++++++ amforth-6.5/avr8/devices/atmega1284rfr2/device.py | 1103 ++++++++ amforth-6.5/avr8/devices/atmega128a/atmega128a.frt | 329 +++ amforth-6.5/avr8/devices/atmega128a/device.asm | 141 + amforth-6.5/avr8/devices/atmega128a/device.inc | 1179 ++++++++ amforth-6.5/avr8/devices/atmega128a/device.py | 403 +++ .../avr8/devices/atmega128a/words/no-jtag.asm | 14 + .../avr8/devices/atmega128a/words/no-wdt.asm | 22 + .../avr8/devices/atmega128a/words/sleep.asm | 24 + .../avr8/devices/atmega128rfa1/atmega128rfa1.frt | 902 +++++++ amforth-6.5/avr8/devices/atmega128rfa1/device.asm | 220 ++ amforth-6.5/avr8/devices/atmega128rfa1/device.inc | 2808 ++++++++++++++++++++ amforth-6.5/avr8/devices/atmega128rfa1/device.py | 991 +++++++ .../avr8/devices/atmega128rfa1/words/no-jtag.asm | 14 + .../avr8/devices/atmega128rfa1/words/no-wdt.asm | 34 + .../avr8/devices/atmega128rfa1/words/sleep.asm | 19 + .../devices/atmega128rfr2/blocks/AD_CONVERTER.frt | 79 + .../atmega128rfr2/blocks/ANALOG_COMPARATOR.frt | 27 + .../devices/atmega128rfr2/blocks/BOOT_LOAD.frt | 21 + .../avr8/devices/atmega128rfr2/blocks/CPU.frt | 128 + .../avr8/devices/atmega128rfr2/blocks/EEPROM.frt | 19 + .../atmega128rfr2/blocks/EXTERNAL_INTERRUPT.frt | 45 + .../avr8/devices/atmega128rfr2/blocks/FLASH.frt | 16 + .../avr8/devices/atmega128rfr2/blocks/JTAG.frt | 13 + .../avr8/devices/atmega128rfr2/blocks/PORTA.frt | 7 + .../avr8/devices/atmega128rfr2/blocks/PORTB.frt | 7 + .../avr8/devices/atmega128rfr2/blocks/PORTC.frt | 7 + .../avr8/devices/atmega128rfr2/blocks/PORTD.frt | 7 + .../avr8/devices/atmega128rfr2/blocks/PORTE.frt | 7 + .../avr8/devices/atmega128rfr2/blocks/PORTF.frt | 7 + .../avr8/devices/atmega128rfr2/blocks/PORTG.frt | 7 + .../avr8/devices/atmega128rfr2/blocks/PWRCTRL.frt | 81 + .../avr8/devices/atmega128rfr2/blocks/SPI.frt | 29 + .../avr8/devices/atmega128rfr2/blocks/SYMCNT.frt | 156 ++ .../atmega128rfr2/blocks/TIMER_COUNTER_0.frt | 54 + .../atmega128rfr2/blocks/TIMER_COUNTER_1.frt | 68 + .../atmega128rfr2/blocks/TIMER_COUNTER_2.frt | 67 + .../atmega128rfr2/blocks/TIMER_COUNTER_3.frt | 68 + .../atmega128rfr2/blocks/TIMER_COUNTER_4.frt | 68 + .../atmega128rfr2/blocks/TIMER_COUNTER_5.frt | 68 + .../avr8/devices/atmega128rfr2/blocks/TRX24.frt | 495 ++++ .../avr8/devices/atmega128rfr2/blocks/TWI.frt | 40 + .../avr8/devices/atmega128rfr2/blocks/USART0.frt | 51 + .../devices/atmega128rfr2/blocks/USART0_SPI.frt | 29 + .../avr8/devices/atmega128rfr2/blocks/USART1.frt | 51 + .../devices/atmega128rfr2/blocks/USART1_SPI.frt | 29 + .../avr8/devices/atmega128rfr2/blocks/WATCHDOG.frt | 15 + amforth-6.5/avr8/devices/atmega128rfr2/device.asm | 166 ++ amforth-6.5/avr8/devices/atmega128rfr2/device.frt | 1752 ++++++++++++ amforth-6.5/avr8/devices/atmega128rfr2/device.py | 1103 ++++++++ amforth-6.5/avr8/devices/atmega16/atmega16.frt | 221 ++ amforth-6.5/avr8/devices/atmega16/device.asm | 101 + amforth-6.5/avr8/devices/atmega16/device.inc | 765 ++++++ amforth-6.5/avr8/devices/atmega16/device.py | 284 ++ .../avr8/devices/atmega16/words/no-jtag.asm | 14 + amforth-6.5/avr8/devices/atmega16/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/atmega16/words/sleep.asm | 24 + amforth-6.5/avr8/devices/atmega161/atmega161.frt | 121 + amforth-6.5/avr8/devices/atmega161/device.asm | 113 + amforth-6.5/avr8/devices/atmega161/device.inc | 843 ++++++ amforth-6.5/avr8/devices/atmega161/device.py | 87 + amforth-6.5/avr8/devices/atmega162/atmega162.frt | 289 ++ amforth-6.5/avr8/devices/atmega162/device.asm | 117 + amforth-6.5/avr8/devices/atmega162/device.inc | 924 +++++++ amforth-6.5/avr8/devices/atmega162/device.py | 332 +++ .../avr8/devices/atmega162/words/no-jtag.asm | 14 + .../avr8/devices/atmega162/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/atmega162/words/sleep.asm | 24 + amforth-6.5/avr8/devices/atmega163/atmega163.frt | 121 + amforth-6.5/avr8/devices/atmega163/device.asm | 108 + amforth-6.5/avr8/devices/atmega163/device.inc | 861 ++++++ amforth-6.5/avr8/devices/atmega163/device.py | 85 + amforth-6.5/avr8/devices/atmega164a/atmega164a.frt | 347 +++ .../devices/atmega164a/blocks/AD_CONVERTER.frt | 47 + .../atmega164a/blocks/ANALOG_COMPARATOR.frt | 27 + .../avr8/devices/atmega164a/blocks/BOOT_LOAD.frt | 21 + amforth-6.5/avr8/devices/atmega164a/blocks/CPU.frt | 91 + .../avr8/devices/atmega164a/blocks/EEPROM.frt | 17 + .../atmega164a/blocks/EXTERNAL_INTERRUPT.frt | 35 + .../avr8/devices/atmega164a/blocks/JTAG.frt | 11 + .../avr8/devices/atmega164a/blocks/PORTA.frt | 7 + .../avr8/devices/atmega164a/blocks/PORTB.frt | 7 + .../avr8/devices/atmega164a/blocks/PORTC.frt | 7 + .../avr8/devices/atmega164a/blocks/PORTD.frt | 7 + amforth-6.5/avr8/devices/atmega164a/blocks/SPI.frt | 29 + .../devices/atmega164a/blocks/TIMER_COUNTER_0.frt | 42 + .../devices/atmega164a/blocks/TIMER_COUNTER_1.frt | 47 + .../devices/atmega164a/blocks/TIMER_COUNTER_2.frt | 57 + amforth-6.5/avr8/devices/atmega164a/blocks/TWI.frt | 34 + .../avr8/devices/atmega164a/blocks/USART0.frt | 51 + .../avr8/devices/atmega164a/blocks/USART1.frt | 51 + .../avr8/devices/atmega164a/blocks/WATCHDOG.frt | 15 + amforth-6.5/avr8/devices/atmega164a/device.asm | 120 + amforth-6.5/avr8/devices/atmega164a/device.inc | 1128 ++++++++ amforth-6.5/avr8/devices/atmega164a/device.py | 387 +++ .../avr8/devices/atmega164a/words/no-jtag.asm | 14 + .../avr8/devices/atmega164a/words/no-wdt.asm | 34 + .../avr8/devices/atmega164a/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega164p/atmega164p.frt | 347 +++ amforth-6.5/avr8/devices/atmega164p/device.asm | 120 + amforth-6.5/avr8/devices/atmega164p/device.inc | 1128 ++++++++ amforth-6.5/avr8/devices/atmega164p/device.py | 389 +++ .../avr8/devices/atmega164p/words/no-jtag.asm | 14 + .../avr8/devices/atmega164p/words/no-wdt.asm | 34 + .../avr8/devices/atmega164p/words/sleep.asm | 19 + .../avr8/devices/atmega164pa/atmega164pa.frt | 347 +++ amforth-6.5/avr8/devices/atmega164pa/device.asm | 120 + amforth-6.5/avr8/devices/atmega164pa/device.inc | 1128 ++++++++ amforth-6.5/avr8/devices/atmega164pa/device.py | 389 +++ .../avr8/devices/atmega164pa/words/no-jtag.asm | 14 + .../avr8/devices/atmega164pa/words/no-wdt.asm | 34 + .../avr8/devices/atmega164pa/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega165/atmega165.frt | 160 ++ amforth-6.5/avr8/devices/atmega165/device.asm | 120 + amforth-6.5/avr8/devices/atmega165/device.inc | 1209 +++++++++ amforth-6.5/avr8/devices/atmega165/device.py | 319 +++ amforth-6.5/avr8/devices/atmega165a/atmega165a.frt | 280 ++ amforth-6.5/avr8/devices/atmega165a/device.asm | 106 + amforth-6.5/avr8/devices/atmega165a/device.inc | 1050 ++++++++ amforth-6.5/avr8/devices/atmega165a/device.py | 258 ++ .../avr8/devices/atmega165a/words/no-jtag.asm | 14 + .../avr8/devices/atmega165a/words/no-wdt.asm | 22 + .../avr8/devices/atmega165a/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega165p/atmega165p.frt | 280 ++ amforth-6.5/avr8/devices/atmega165p/device.asm | 106 + amforth-6.5/avr8/devices/atmega165p/device.inc | 1050 ++++++++ amforth-6.5/avr8/devices/atmega165p/device.py | 319 +++ .../avr8/devices/atmega165p/words/no-jtag.asm | 14 + .../avr8/devices/atmega165p/words/no-wdt.asm | 22 + .../avr8/devices/atmega165p/words/sleep.asm | 19 + .../avr8/devices/atmega165pa/atmega165pa.frt | 280 ++ amforth-6.5/avr8/devices/atmega165pa/device.asm | 106 + amforth-6.5/avr8/devices/atmega165pa/device.inc | 1050 ++++++++ amforth-6.5/avr8/devices/atmega165pa/device.py | 321 +++ .../avr8/devices/atmega165pa/words/no-jtag.asm | 14 + .../avr8/devices/atmega165pa/words/no-wdt.asm | 22 + .../avr8/devices/atmega165pa/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega168/atmega168.frt | 297 +++ amforth-6.5/avr8/devices/atmega168/device.asm | 107 + amforth-6.5/avr8/devices/atmega168/device.inc | 996 +++++++ amforth-6.5/avr8/devices/atmega168/device.py | 322 +++ .../avr8/devices/atmega168/words/no-jtag.asm | 14 + .../avr8/devices/atmega168/words/no-wdt.asm | 34 + amforth-6.5/avr8/devices/atmega168/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega168a/atmega168a.frt | 297 +++ amforth-6.5/avr8/devices/atmega168a/device.asm | 107 + amforth-6.5/avr8/devices/atmega168a/device.inc | 996 +++++++ amforth-6.5/avr8/devices/atmega168a/device.py | 322 +++ .../avr8/devices/atmega168a/words/no-jtag.asm | 14 + .../avr8/devices/atmega168a/words/no-wdt.asm | 34 + .../avr8/devices/atmega168a/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega168p/atmega168p.frt | 299 +++ amforth-6.5/avr8/devices/atmega168p/device.asm | 107 + amforth-6.5/avr8/devices/atmega168p/device.inc | 996 +++++++ amforth-6.5/avr8/devices/atmega168p/device.py | 324 +++ .../avr8/devices/atmega168p/words/no-jtag.asm | 14 + .../avr8/devices/atmega168p/words/no-wdt.asm | 34 + .../avr8/devices/atmega168p/words/sleep.asm | 19 + .../avr8/devices/atmega168pa/atmega168pa.frt | 299 +++ amforth-6.5/avr8/devices/atmega168pa/device.asm | 107 + amforth-6.5/avr8/devices/atmega168pa/device.inc | 996 +++++++ amforth-6.5/avr8/devices/atmega168pa/device.py | 324 +++ .../avr8/devices/atmega168pa/words/no-jtag.asm | 14 + .../avr8/devices/atmega168pa/words/no-wdt.asm | 34 + .../avr8/devices/atmega168pa/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega169/atmega169.frt | 183 ++ amforth-6.5/avr8/devices/atmega169/device.asm | 123 + amforth-6.5/avr8/devices/atmega169/device.inc | 1455 ++++++++++ amforth-6.5/avr8/devices/atmega169/device.py | 137 + amforth-6.5/avr8/devices/atmega169a/atmega169a.frt | 319 +++ amforth-6.5/avr8/devices/atmega169a/device.asm | 109 + amforth-6.5/avr8/devices/atmega169a/device.inc | 1293 +++++++++ amforth-6.5/avr8/devices/atmega169a/device.py | 359 +++ .../avr8/devices/atmega169a/words/no-jtag.asm | 14 + .../avr8/devices/atmega169a/words/no-wdt.asm | 22 + .../avr8/devices/atmega169a/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega169p/atmega169p.frt | 319 +++ amforth-6.5/avr8/devices/atmega169p/device.asm | 109 + amforth-6.5/avr8/devices/atmega169p/device.inc | 1293 +++++++++ amforth-6.5/avr8/devices/atmega169p/device.py | 359 +++ .../avr8/devices/atmega169p/words/no-jtag.asm | 14 + .../avr8/devices/atmega169p/words/no-wdt.asm | 22 + .../avr8/devices/atmega169p/words/sleep.asm | 19 + .../avr8/devices/atmega169pa/atmega169pa.frt | 319 +++ amforth-6.5/avr8/devices/atmega169pa/device.asm | 109 + amforth-6.5/avr8/devices/atmega169pa/device.inc | 1293 +++++++++ amforth-6.5/avr8/devices/atmega169pa/device.py | 361 +++ .../avr8/devices/atmega169pa/words/no-jtag.asm | 14 + .../avr8/devices/atmega169pa/words/no-wdt.asm | 22 + .../avr8/devices/atmega169pa/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega16a/atmega16a.frt | 221 ++ amforth-6.5/avr8/devices/atmega16a/device.asm | 101 + amforth-6.5/avr8/devices/atmega16a/device.inc | 765 ++++++ amforth-6.5/avr8/devices/atmega16a/device.py | 284 ++ .../avr8/devices/atmega16a/words/no-jtag.asm | 14 + .../avr8/devices/atmega16a/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/atmega16a/words/sleep.asm | 24 + .../avr8/devices/atmega16hva/atmega16hva.frt | 140 + amforth-6.5/avr8/devices/atmega16hva/device.asm | 114 + amforth-6.5/avr8/devices/atmega16hva/device.inc | 1053 ++++++++ amforth-6.5/avr8/devices/atmega16hva/device.py | 274 ++ .../avr8/devices/atmega16hva2/atmega16hva2.frt | 144 + amforth-6.5/avr8/devices/atmega16hva2/device.asm | 116 + amforth-6.5/avr8/devices/atmega16hva2/device.inc | 1089 ++++++++ amforth-6.5/avr8/devices/atmega16hva2/device.py | 108 + .../avr8/devices/atmega16hvb/atmega16hvb.frt | 33 + amforth-6.5/avr8/devices/atmega16hvb/device.asm | 101 + amforth-6.5/avr8/devices/atmega16hvb/device.inc | 3 + amforth-6.5/avr8/devices/atmega16hvb/device.py | 342 +++ .../avr8/devices/atmega16hvb/words/no-jtag.asm | 14 + .../avr8/devices/atmega16hvb/words/no-wdt.asm | 22 + .../avr8/devices/atmega16hvb/words/sleep.asm | 24 + .../devices/atmega16hvbrevb/atmega16hvbrevb.frt | 33 + .../avr8/devices/atmega16hvbrevb/device.asm | 101 + .../avr8/devices/atmega16hvbrevb/device.inc | 3 + amforth-6.5/avr8/devices/atmega16hvbrevb/device.py | 342 +++ .../avr8/devices/atmega16hvbrevb/words/no-jtag.asm | 14 + .../avr8/devices/atmega16hvbrevb/words/no-wdt.asm | 22 + .../avr8/devices/atmega16hvbrevb/words/sleep.asm | 24 + amforth-6.5/avr8/devices/atmega16m1/atmega16m1.frt | 513 ++++ amforth-6.5/avr8/devices/atmega16m1/device.asm | 120 + amforth-6.5/avr8/devices/atmega16m1/device.inc | 1734 ++++++++++++ amforth-6.5/avr8/devices/atmega16m1/device.py | 537 ++++ .../avr8/devices/atmega16m1/words/no-jtag.asm | 14 + .../avr8/devices/atmega16m1/words/no-wdt.asm | 34 + .../avr8/devices/atmega16m1/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega16u2/atmega16u2.frt | 367 +++ amforth-6.5/avr8/devices/atmega16u2/device.asm | 113 + amforth-6.5/avr8/devices/atmega16u2/device.inc | 1155 ++++++++ amforth-6.5/avr8/devices/atmega16u2/device.py | 387 +++ .../avr8/devices/atmega16u2/words/no-jtag.asm | 14 + .../avr8/devices/atmega16u2/words/no-wdt.asm | 34 + .../avr8/devices/atmega16u2/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega16u4/atmega16u4.frt | 496 ++++ amforth-6.5/avr8/devices/atmega16u4/device.asm | 146 + amforth-6.5/avr8/devices/atmega16u4/device.inc | 1602 +++++++++++ amforth-6.5/avr8/devices/atmega16u4/device.py | 554 ++++ .../avr8/devices/atmega16u4/words/no-jtag.asm | 14 + .../avr8/devices/atmega16u4/words/no-wdt.asm | 34 + .../avr8/devices/atmega16u4/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega2560/atmega2560.frt | 580 ++++ amforth-6.5/avr8/devices/atmega2560/device.asm | 190 ++ amforth-6.5/avr8/devices/atmega2560/device.inc | 1980 ++++++++++++++ amforth-6.5/avr8/devices/atmega2560/device.py | 633 +++++ .../avr8/devices/atmega2560/words/no-jtag.asm | 14 + .../avr8/devices/atmega2560/words/no-wdt.asm | 34 + .../avr8/devices/atmega2560/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega2561/atmega2561.frt | 510 ++++ amforth-6.5/avr8/devices/atmega2561/device.asm | 184 ++ amforth-6.5/avr8/devices/atmega2561/device.inc | 1698 ++++++++++++ amforth-6.5/avr8/devices/atmega2561/device.py | 557 ++++ .../avr8/devices/atmega2561/words/no-jtag.asm | 14 + .../avr8/devices/atmega2561/words/no-wdt.asm | 34 + .../avr8/devices/atmega2561/words/sleep.asm | 19 + .../devices/atmega2564rfr2/blocks/AD_CONVERTER.frt | 79 + .../atmega2564rfr2/blocks/ANALOG_COMPARATOR.frt | 27 + .../devices/atmega2564rfr2/blocks/BOOT_LOAD.frt | 21 + .../avr8/devices/atmega2564rfr2/blocks/CPU.frt | 129 + .../avr8/devices/atmega2564rfr2/blocks/EEPROM.frt | 19 + .../atmega2564rfr2/blocks/EXTERNAL_INTERRUPT.frt | 45 + .../avr8/devices/atmega2564rfr2/blocks/FLASH.frt | 16 + .../avr8/devices/atmega2564rfr2/blocks/JTAG.frt | 13 + .../avr8/devices/atmega2564rfr2/blocks/PORTA.frt | 7 + .../avr8/devices/atmega2564rfr2/blocks/PORTB.frt | 7 + .../avr8/devices/atmega2564rfr2/blocks/PORTC.frt | 7 + .../avr8/devices/atmega2564rfr2/blocks/PORTD.frt | 7 + .../avr8/devices/atmega2564rfr2/blocks/PORTE.frt | 7 + .../avr8/devices/atmega2564rfr2/blocks/PORTF.frt | 7 + .../avr8/devices/atmega2564rfr2/blocks/PORTG.frt | 7 + .../avr8/devices/atmega2564rfr2/blocks/PWRCTRL.frt | 81 + .../avr8/devices/atmega2564rfr2/blocks/SPI.frt | 29 + .../avr8/devices/atmega2564rfr2/blocks/SYMCNT.frt | 156 ++ .../atmega2564rfr2/blocks/TIMER_COUNTER_0.frt | 54 + .../atmega2564rfr2/blocks/TIMER_COUNTER_1.frt | 68 + .../atmega2564rfr2/blocks/TIMER_COUNTER_2.frt | 67 + .../atmega2564rfr2/blocks/TIMER_COUNTER_3.frt | 68 + .../atmega2564rfr2/blocks/TIMER_COUNTER_4.frt | 68 + .../atmega2564rfr2/blocks/TIMER_COUNTER_5.frt | 68 + .../avr8/devices/atmega2564rfr2/blocks/TRX24.frt | 495 ++++ .../avr8/devices/atmega2564rfr2/blocks/TWI.frt | 40 + .../avr8/devices/atmega2564rfr2/blocks/USART0.frt | 51 + .../devices/atmega2564rfr2/blocks/USART0_SPI.frt | 29 + .../avr8/devices/atmega2564rfr2/blocks/USART1.frt | 51 + .../devices/atmega2564rfr2/blocks/USART1_SPI.frt | 29 + .../devices/atmega2564rfr2/blocks/WATCHDOG.frt | 15 + amforth-6.5/avr8/devices/atmega2564rfr2/device.asm | 166 ++ amforth-6.5/avr8/devices/atmega2564rfr2/device.frt | 1753 ++++++++++++ amforth-6.5/avr8/devices/atmega2564rfr2/device.py | 1104 ++++++++ .../devices/atmega256rfr2/blocks/AD_CONVERTER.frt | 79 + .../atmega256rfr2/blocks/ANALOG_COMPARATOR.frt | 27 + .../devices/atmega256rfr2/blocks/BOOT_LOAD.frt | 21 + .../avr8/devices/atmega256rfr2/blocks/CPU.frt | 129 + .../avr8/devices/atmega256rfr2/blocks/EEPROM.frt | 19 + .../atmega256rfr2/blocks/EXTERNAL_INTERRUPT.frt | 45 + .../avr8/devices/atmega256rfr2/blocks/FLASH.frt | 16 + .../avr8/devices/atmega256rfr2/blocks/JTAG.frt | 13 + .../avr8/devices/atmega256rfr2/blocks/PORTA.frt | 7 + .../avr8/devices/atmega256rfr2/blocks/PORTB.frt | 7 + .../avr8/devices/atmega256rfr2/blocks/PORTC.frt | 7 + .../avr8/devices/atmega256rfr2/blocks/PORTD.frt | 7 + .../avr8/devices/atmega256rfr2/blocks/PORTE.frt | 7 + .../avr8/devices/atmega256rfr2/blocks/PORTF.frt | 7 + .../avr8/devices/atmega256rfr2/blocks/PORTG.frt | 7 + .../avr8/devices/atmega256rfr2/blocks/PWRCTRL.frt | 81 + .../avr8/devices/atmega256rfr2/blocks/SPI.frt | 29 + .../avr8/devices/atmega256rfr2/blocks/SYMCNT.frt | 156 ++ .../atmega256rfr2/blocks/TIMER_COUNTER_0.frt | 54 + .../atmega256rfr2/blocks/TIMER_COUNTER_1.frt | 68 + .../atmega256rfr2/blocks/TIMER_COUNTER_2.frt | 67 + .../atmega256rfr2/blocks/TIMER_COUNTER_3.frt | 68 + .../atmega256rfr2/blocks/TIMER_COUNTER_4.frt | 68 + .../atmega256rfr2/blocks/TIMER_COUNTER_5.frt | 68 + .../avr8/devices/atmega256rfr2/blocks/TRX24.frt | 495 ++++ .../avr8/devices/atmega256rfr2/blocks/TWI.frt | 40 + .../avr8/devices/atmega256rfr2/blocks/USART0.frt | 51 + .../devices/atmega256rfr2/blocks/USART0_SPI.frt | 29 + .../avr8/devices/atmega256rfr2/blocks/USART1.frt | 51 + .../devices/atmega256rfr2/blocks/USART1_SPI.frt | 29 + .../avr8/devices/atmega256rfr2/blocks/WATCHDOG.frt | 15 + amforth-6.5/avr8/devices/atmega256rfr2/device.asm | 166 ++ amforth-6.5/avr8/devices/atmega256rfr2/device.frt | 1753 ++++++++++++ amforth-6.5/avr8/devices/atmega256rfr2/device.py | 1104 ++++++++ amforth-6.5/avr8/devices/atmega32/atmega32.frt | 216 ++ amforth-6.5/avr8/devices/atmega32/device.asm | 101 + amforth-6.5/avr8/devices/atmega32/device.inc | 750 ++++++ amforth-6.5/avr8/devices/atmega32/device.py | 268 ++ .../avr8/devices/atmega32/words/no-jtag.asm | 14 + amforth-6.5/avr8/devices/atmega32/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/atmega32/words/sleep.asm | 24 + amforth-6.5/avr8/devices/atmega323/atmega323.frt | 123 + amforth-6.5/avr8/devices/atmega323/device.asm | 113 + amforth-6.5/avr8/devices/atmega323/device.inc | 867 ++++++ amforth-6.5/avr8/devices/atmega323/device.py | 89 + amforth-6.5/avr8/devices/atmega324a/atmega324a.frt | 347 +++ amforth-6.5/avr8/devices/atmega324a/device.asm | 120 + amforth-6.5/avr8/devices/atmega324a/device.inc | 1128 ++++++++ amforth-6.5/avr8/devices/atmega324a/device.py | 388 +++ .../avr8/devices/atmega324a/words/no-jtag.asm | 14 + .../avr8/devices/atmega324a/words/no-wdt.asm | 34 + .../avr8/devices/atmega324a/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega324p/atmega324p.frt | 347 +++ amforth-6.5/avr8/devices/atmega324p/device.asm | 120 + amforth-6.5/avr8/devices/atmega324p/device.inc | 1128 ++++++++ amforth-6.5/avr8/devices/atmega324p/device.py | 390 +++ .../avr8/devices/atmega324p/words/no-jtag.asm | 14 + .../avr8/devices/atmega324p/words/no-wdt.asm | 34 + .../avr8/devices/atmega324p/words/sleep.asm | 19 + .../avr8/devices/atmega324pa/atmega324pa.frt | 347 +++ amforth-6.5/avr8/devices/atmega324pa/device.asm | 120 + amforth-6.5/avr8/devices/atmega324pa/device.inc | 1128 ++++++++ amforth-6.5/avr8/devices/atmega324pa/device.py | 389 +++ .../avr8/devices/atmega324pa/words/no-jtag.asm | 14 + .../avr8/devices/atmega324pa/words/no-wdt.asm | 34 + .../avr8/devices/atmega324pa/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega325/atmega325.frt | 278 ++ amforth-6.5/avr8/devices/atmega325/device.asm | 106 + amforth-6.5/avr8/devices/atmega325/device.inc | 1050 ++++++++ amforth-6.5/avr8/devices/atmega325/device.py | 317 +++ .../avr8/devices/atmega325/words/no-jtag.asm | 14 + .../avr8/devices/atmega325/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/atmega325/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega3250/atmega3250.frt | 292 ++ amforth-6.5/avr8/devices/atmega3250/device.asm | 114 + amforth-6.5/avr8/devices/atmega3250/device.inc | 1152 ++++++++ amforth-6.5/avr8/devices/atmega3250/device.py | 333 +++ .../avr8/devices/atmega3250/words/no-jtag.asm | 14 + .../avr8/devices/atmega3250/words/no-wdt.asm | 22 + .../avr8/devices/atmega3250/words/sleep.asm | 19 + .../avr8/devices/atmega3250a/atmega3250a.frt | 292 ++ amforth-6.5/avr8/devices/atmega3250a/device.asm | 114 + amforth-6.5/avr8/devices/atmega3250a/device.inc | 1152 ++++++++ amforth-6.5/avr8/devices/atmega3250a/device.py | 336 +++ .../avr8/devices/atmega3250a/words/no-jtag.asm | 14 + .../avr8/devices/atmega3250a/words/no-wdt.asm | 22 + .../avr8/devices/atmega3250a/words/sleep.asm | 19 + .../avr8/devices/atmega3250p/atmega3250p.frt | 292 ++ amforth-6.5/avr8/devices/atmega3250p/device.asm | 114 + amforth-6.5/avr8/devices/atmega3250p/device.inc | 1152 ++++++++ amforth-6.5/avr8/devices/atmega3250p/device.py | 336 +++ .../avr8/devices/atmega3250p/words/no-jtag.asm | 14 + .../avr8/devices/atmega3250p/words/no-wdt.asm | 22 + .../avr8/devices/atmega3250p/words/sleep.asm | 19 + .../avr8/devices/atmega3250pa/atmega3250pa.frt | 292 ++ amforth-6.5/avr8/devices/atmega3250pa/device.asm | 114 + amforth-6.5/avr8/devices/atmega3250pa/device.inc | 1152 ++++++++ amforth-6.5/avr8/devices/atmega3250pa/device.py | 321 +++ .../avr8/devices/atmega3250pa/words/no-jtag.asm | 14 + .../avr8/devices/atmega3250pa/words/no-wdt.asm | 22 + .../avr8/devices/atmega3250pa/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega325a/atmega325a.frt | 279 ++ amforth-6.5/avr8/devices/atmega325a/device.asm | 106 + amforth-6.5/avr8/devices/atmega325a/device.inc | 1050 ++++++++ amforth-6.5/avr8/devices/atmega325a/device.py | 319 +++ .../avr8/devices/atmega325a/words/no-jtag.asm | 14 + .../avr8/devices/atmega325a/words/no-wdt.asm | 22 + .../avr8/devices/atmega325a/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega325p/atmega325p.frt | 279 ++ amforth-6.5/avr8/devices/atmega325p/device.asm | 106 + amforth-6.5/avr8/devices/atmega325p/device.inc | 1050 ++++++++ amforth-6.5/avr8/devices/atmega325p/device.py | 321 +++ .../avr8/devices/atmega325p/words/no-jtag.asm | 14 + .../avr8/devices/atmega325p/words/no-wdt.asm | 22 + .../avr8/devices/atmega325p/words/sleep.asm | 19 + .../avr8/devices/atmega325pa/atmega325pa.frt | 279 ++ amforth-6.5/avr8/devices/atmega325pa/device.asm | 106 + amforth-6.5/avr8/devices/atmega325pa/device.inc | 1050 ++++++++ amforth-6.5/avr8/devices/atmega325pa/device.py | 321 +++ .../avr8/devices/atmega325pa/words/no-jtag.asm | 14 + .../avr8/devices/atmega325pa/words/no-wdt.asm | 22 + .../avr8/devices/atmega325pa/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega328/atmega328.frt | 297 +++ amforth-6.5/avr8/devices/atmega328/device.asm | 107 + amforth-6.5/avr8/devices/atmega328/device.inc | 996 +++++++ amforth-6.5/avr8/devices/atmega328/device.py | 322 +++ .../avr8/devices/atmega328/words/no-jtag.asm | 14 + .../avr8/devices/atmega328/words/no-wdt.asm | 34 + amforth-6.5/avr8/devices/atmega328/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega328p/atmega328p.frt | 299 +++ amforth-6.5/avr8/devices/atmega328p/device.asm | 107 + amforth-6.5/avr8/devices/atmega328p/device.inc | 996 +++++++ amforth-6.5/avr8/devices/atmega328p/device.py | 324 +++ .../avr8/devices/atmega328p/words/no-jtag.asm | 14 + .../avr8/devices/atmega328p/words/no-wdt.asm | 34 + .../avr8/devices/atmega328p/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega329/atmega329.frt | 312 +++ amforth-6.5/avr8/devices/atmega329/device.asm | 109 + amforth-6.5/avr8/devices/atmega329/device.inc | 1293 +++++++++ amforth-6.5/avr8/devices/atmega329/device.py | 352 +++ .../avr8/devices/atmega329/words/no-jtag.asm | 14 + .../avr8/devices/atmega329/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/atmega329/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega3290/atmega3290.frt | 328 +++ amforth-6.5/avr8/devices/atmega3290/device.asm | 115 + amforth-6.5/avr8/devices/atmega3290/device.inc | 1443 ++++++++++ amforth-6.5/avr8/devices/atmega3290/device.py | 370 +++ .../avr8/devices/atmega3290/words/no-jtag.asm | 14 + .../avr8/devices/atmega3290/words/no-wdt.asm | 22 + .../avr8/devices/atmega3290/words/sleep.asm | 19 + .../avr8/devices/atmega3290a/atmega3290a.frt | 333 +++ amforth-6.5/avr8/devices/atmega3290a/device.asm | 115 + amforth-6.5/avr8/devices/atmega3290a/device.inc | 1443 ++++++++++ amforth-6.5/avr8/devices/atmega3290a/device.py | 378 +++ .../avr8/devices/atmega3290a/words/no-jtag.asm | 14 + .../avr8/devices/atmega3290a/words/no-wdt.asm | 22 + .../avr8/devices/atmega3290a/words/sleep.asm | 19 + .../avr8/devices/atmega3290p/atmega3290p.frt | 333 +++ amforth-6.5/avr8/devices/atmega3290p/device.asm | 115 + amforth-6.5/avr8/devices/atmega3290p/device.inc | 1443 ++++++++++ amforth-6.5/avr8/devices/atmega3290p/device.py | 378 +++ .../avr8/devices/atmega3290p/words/no-jtag.asm | 14 + .../avr8/devices/atmega3290p/words/no-wdt.asm | 22 + .../avr8/devices/atmega3290p/words/sleep.asm | 19 + .../avr8/devices/atmega3290pa/atmega3290pa.frt | 333 +++ amforth-6.5/avr8/devices/atmega3290pa/device.asm | 115 + amforth-6.5/avr8/devices/atmega3290pa/device.inc | 1443 ++++++++++ amforth-6.5/avr8/devices/atmega3290pa/device.py | 378 +++ .../avr8/devices/atmega3290pa/words/no-jtag.asm | 14 + .../avr8/devices/atmega3290pa/words/no-wdt.asm | 22 + .../avr8/devices/atmega3290pa/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega329a/atmega329a.frt | 461 ++++ amforth-6.5/avr8/devices/atmega329a/device.asm | 109 + amforth-6.5/avr8/devices/atmega329a/device.inc | 1293 +++++++++ amforth-6.5/avr8/devices/atmega329a/device.py | 502 ++++ .../avr8/devices/atmega329a/words/no-jtag.asm | 14 + .../avr8/devices/atmega329a/words/no-wdt.asm | 22 + .../avr8/devices/atmega329a/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega329p/atmega329p.frt | 461 ++++ amforth-6.5/avr8/devices/atmega329p/device.asm | 109 + amforth-6.5/avr8/devices/atmega329p/device.inc | 1293 +++++++++ amforth-6.5/avr8/devices/atmega329p/device.py | 504 ++++ .../avr8/devices/atmega329p/words/no-jtag.asm | 14 + .../avr8/devices/atmega329p/words/no-wdt.asm | 22 + .../avr8/devices/atmega329p/words/sleep.asm | 19 + .../avr8/devices/atmega329pa/atmega329pa.frt | 461 ++++ amforth-6.5/avr8/devices/atmega329pa/device.asm | 109 + amforth-6.5/avr8/devices/atmega329pa/device.inc | 1293 +++++++++ amforth-6.5/avr8/devices/atmega329pa/device.py | 504 ++++ .../avr8/devices/atmega329pa/words/no-jtag.asm | 14 + .../avr8/devices/atmega329pa/words/no-wdt.asm | 22 + .../avr8/devices/atmega329pa/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega32a/atmega32a.frt | 216 ++ amforth-6.5/avr8/devices/atmega32a/device.asm | 101 + amforth-6.5/avr8/devices/atmega32a/device.inc | 750 ++++++ amforth-6.5/avr8/devices/atmega32a/device.py | 268 ++ .../avr8/devices/atmega32a/words/no-jtag.asm | 14 + .../avr8/devices/atmega32a/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/atmega32a/words/sleep.asm | 24 + amforth-6.5/avr8/devices/atmega32c1/atmega32c1.frt | 454 ++++ amforth-6.5/avr8/devices/atmega32c1/device.asm | 119 + amforth-6.5/avr8/devices/atmega32c1/device.inc | 1503 +++++++++++ amforth-6.5/avr8/devices/atmega32c1/device.py | 477 ++++ .../avr8/devices/atmega32c1/words/no-jtag.asm | 14 + .../avr8/devices/atmega32c1/words/no-wdt.asm | 34 + .../avr8/devices/atmega32c1/words/sleep.asm | 19 + .../avr8/devices/atmega32hvb/atmega32hvb.frt | 33 + amforth-6.5/avr8/devices/atmega32hvb/device.asm | 101 + amforth-6.5/avr8/devices/atmega32hvb/device.inc | 3 + amforth-6.5/avr8/devices/atmega32hvb/device.py | 342 +++ .../avr8/devices/atmega32hvb/words/no-jtag.asm | 14 + .../avr8/devices/atmega32hvb/words/no-wdt.asm | 22 + .../avr8/devices/atmega32hvb/words/sleep.asm | 24 + .../devices/atmega32hvbrevb/atmega32hvbrevb.frt | 33 + .../avr8/devices/atmega32hvbrevb/device.asm | 101 + .../avr8/devices/atmega32hvbrevb/device.inc | 3 + amforth-6.5/avr8/devices/atmega32hvbrevb/device.py | 342 +++ .../avr8/devices/atmega32hvbrevb/words/no-jtag.asm | 14 + .../avr8/devices/atmega32hvbrevb/words/no-wdt.asm | 22 + .../avr8/devices/atmega32hvbrevb/words/sleep.asm | 24 + amforth-6.5/avr8/devices/atmega32m1/atmega32m1.frt | 513 ++++ amforth-6.5/avr8/devices/atmega32m1/device.asm | 120 + amforth-6.5/avr8/devices/atmega32m1/device.inc | 1734 ++++++++++++ amforth-6.5/avr8/devices/atmega32m1/device.py | 537 ++++ .../avr8/devices/atmega32m1/words/no-jtag.asm | 14 + .../avr8/devices/atmega32m1/words/no-wdt.asm | 34 + .../avr8/devices/atmega32m1/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega32u2/atmega32u2.frt | 367 +++ amforth-6.5/avr8/devices/atmega32u2/device.asm | 113 + amforth-6.5/avr8/devices/atmega32u2/device.inc | 1155 ++++++++ amforth-6.5/avr8/devices/atmega32u2/device.py | 387 +++ .../avr8/devices/atmega32u2/words/no-jtag.asm | 14 + .../avr8/devices/atmega32u2/words/no-wdt.asm | 34 + .../avr8/devices/atmega32u2/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega32u4/atmega32u4.frt | 496 ++++ amforth-6.5/avr8/devices/atmega32u4/device.asm | 146 + amforth-6.5/avr8/devices/atmega32u4/device.inc | 1602 +++++++++++ amforth-6.5/avr8/devices/atmega32u4/device.py | 554 ++++ .../avr8/devices/atmega32u4/words/no-jtag.asm | 14 + .../avr8/devices/atmega32u4/words/no-wdt.asm | 34 + .../avr8/devices/atmega32u4/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega32u6/atmega32u6.frt | 233 ++ amforth-6.5/avr8/devices/atmega32u6/device.asm | 155 ++ amforth-6.5/avr8/devices/atmega32u6/device.inc | 1839 +++++++++++++ amforth-6.5/avr8/devices/atmega32u6/device.py | 183 ++ amforth-6.5/avr8/devices/atmega406/atmega406.frt | 267 ++ amforth-6.5/avr8/devices/atmega406/device.asm | 104 + amforth-6.5/avr8/devices/atmega406/device.inc | 1008 +++++++ amforth-6.5/avr8/devices/atmega406/device.py | 290 ++ .../avr8/devices/atmega406/words/no-jtag.asm | 14 + .../avr8/devices/atmega406/words/no-wdt.asm | 34 + amforth-6.5/avr8/devices/atmega406/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega64/atmega64.frt | 331 +++ amforth-6.5/avr8/devices/atmega64/device.asm | 135 + amforth-6.5/avr8/devices/atmega64/device.inc | 1179 ++++++++ amforth-6.5/avr8/devices/atmega64/device.py | 405 +++ .../avr8/devices/atmega64/words/no-jtag.asm | 14 + amforth-6.5/avr8/devices/atmega64/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/atmega64/words/sleep.asm | 24 + amforth-6.5/avr8/devices/atmega640/atmega640.frt | 579 ++++ amforth-6.5/avr8/devices/atmega640/device.asm | 184 ++ amforth-6.5/avr8/devices/atmega640/device.inc | 1968 ++++++++++++++ amforth-6.5/avr8/devices/atmega640/device.py | 632 +++++ .../avr8/devices/atmega640/words/no-jtag.asm | 14 + .../avr8/devices/atmega640/words/no-wdt.asm | 34 + amforth-6.5/avr8/devices/atmega640/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega644/atmega644.frt | 316 +++ amforth-6.5/avr8/devices/atmega644/device.asm | 113 + amforth-6.5/avr8/devices/atmega644/device.inc | 1065 ++++++++ amforth-6.5/avr8/devices/atmega644/device.py | 355 +++ .../avr8/devices/atmega644/words/no-jtag.asm | 14 + .../avr8/devices/atmega644/words/no-wdt.asm | 34 + amforth-6.5/avr8/devices/atmega644/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega644a/atmega644a.frt | 346 +++ amforth-6.5/avr8/devices/atmega644a/device.asm | 120 + amforth-6.5/avr8/devices/atmega644a/device.inc | 1128 ++++++++ amforth-6.5/avr8/devices/atmega644a/device.py | 386 +++ .../avr8/devices/atmega644a/words/no-jtag.asm | 14 + .../avr8/devices/atmega644a/words/no-wdt.asm | 34 + .../avr8/devices/atmega644a/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega644p/atmega644p.frt | 346 +++ amforth-6.5/avr8/devices/atmega644p/device.asm | 120 + amforth-6.5/avr8/devices/atmega644p/device.inc | 1128 ++++++++ amforth-6.5/avr8/devices/atmega644p/device.py | 388 +++ .../avr8/devices/atmega644p/words/no-jtag.asm | 14 + .../avr8/devices/atmega644p/words/no-wdt.asm | 34 + .../avr8/devices/atmega644p/words/sleep.asm | 19 + .../avr8/devices/atmega644pa/atmega644pa.frt | 346 +++ amforth-6.5/avr8/devices/atmega644pa/device.asm | 120 + amforth-6.5/avr8/devices/atmega644pa/device.inc | 1128 ++++++++ amforth-6.5/avr8/devices/atmega644pa/device.py | 388 +++ .../avr8/devices/atmega644pa/words/no-jtag.asm | 14 + .../avr8/devices/atmega644pa/words/no-wdt.asm | 34 + .../avr8/devices/atmega644pa/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega645/atmega645.frt | 285 ++ amforth-6.5/avr8/devices/atmega645/device.asm | 106 + amforth-6.5/avr8/devices/atmega645/device.inc | 1050 ++++++++ amforth-6.5/avr8/devices/atmega645/device.py | 318 +++ .../avr8/devices/atmega645/words/no-jtag.asm | 14 + .../avr8/devices/atmega645/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/atmega645/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega6450/atmega6450.frt | 298 +++ amforth-6.5/avr8/devices/atmega6450/device.asm | 114 + amforth-6.5/avr8/devices/atmega6450/device.inc | 1152 ++++++++ amforth-6.5/avr8/devices/atmega6450/device.py | 333 +++ .../avr8/devices/atmega6450/words/no-jtag.asm | 14 + .../avr8/devices/atmega6450/words/no-wdt.asm | 22 + .../avr8/devices/atmega6450/words/sleep.asm | 19 + .../avr8/devices/atmega6450a/atmega6450a.frt | 298 +++ amforth-6.5/avr8/devices/atmega6450a/device.asm | 114 + amforth-6.5/avr8/devices/atmega6450a/device.inc | 1152 ++++++++ amforth-6.5/avr8/devices/atmega6450a/device.py | 333 +++ .../avr8/devices/atmega6450a/words/no-jtag.asm | 14 + .../avr8/devices/atmega6450a/words/no-wdt.asm | 22 + .../avr8/devices/atmega6450a/words/sleep.asm | 19 + .../avr8/devices/atmega6450p/atmega6450p.frt | 298 +++ amforth-6.5/avr8/devices/atmega6450p/device.asm | 114 + amforth-6.5/avr8/devices/atmega6450p/device.inc | 1152 ++++++++ amforth-6.5/avr8/devices/atmega6450p/device.py | 333 +++ .../avr8/devices/atmega6450p/words/no-jtag.asm | 14 + .../avr8/devices/atmega6450p/words/no-wdt.asm | 22 + .../avr8/devices/atmega6450p/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega645a/atmega645a.frt | 285 ++ amforth-6.5/avr8/devices/atmega645a/device.asm | 106 + amforth-6.5/avr8/devices/atmega645a/device.inc | 1050 ++++++++ amforth-6.5/avr8/devices/atmega645a/device.py | 318 +++ .../avr8/devices/atmega645a/words/no-jtag.asm | 14 + .../avr8/devices/atmega645a/words/no-wdt.asm | 22 + .../avr8/devices/atmega645a/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega645p/atmega645p.frt | 285 ++ amforth-6.5/avr8/devices/atmega645p/device.asm | 106 + amforth-6.5/avr8/devices/atmega645p/device.inc | 1050 ++++++++ amforth-6.5/avr8/devices/atmega645p/device.py | 318 +++ .../avr8/devices/atmega645p/words/no-jtag.asm | 14 + .../avr8/devices/atmega645p/words/no-wdt.asm | 22 + .../avr8/devices/atmega645p/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega649/atmega649.frt | 318 +++ amforth-6.5/avr8/devices/atmega649/device.asm | 109 + amforth-6.5/avr8/devices/atmega649/device.inc | 1293 +++++++++ amforth-6.5/avr8/devices/atmega649/device.py | 352 +++ .../avr8/devices/atmega649/words/no-jtag.asm | 14 + .../avr8/devices/atmega649/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/atmega649/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega6490/atmega6490.frt | 334 +++ amforth-6.5/avr8/devices/atmega6490/device.asm | 115 + amforth-6.5/avr8/devices/atmega6490/device.inc | 1443 ++++++++++ amforth-6.5/avr8/devices/atmega6490/device.py | 370 +++ .../avr8/devices/atmega6490/words/no-jtag.asm | 14 + .../avr8/devices/atmega6490/words/no-wdt.asm | 22 + .../avr8/devices/atmega6490/words/sleep.asm | 19 + .../avr8/devices/atmega6490a/atmega6490a.frt | 334 +++ amforth-6.5/avr8/devices/atmega6490a/device.asm | 115 + amforth-6.5/avr8/devices/atmega6490a/device.inc | 1443 ++++++++++ amforth-6.5/avr8/devices/atmega6490a/device.py | 370 +++ .../avr8/devices/atmega6490a/words/no-jtag.asm | 14 + .../avr8/devices/atmega6490a/words/no-wdt.asm | 22 + .../avr8/devices/atmega6490a/words/sleep.asm | 19 + .../avr8/devices/atmega6490p/atmega6490p.frt | 334 +++ amforth-6.5/avr8/devices/atmega6490p/device.asm | 115 + amforth-6.5/avr8/devices/atmega6490p/device.inc | 1443 ++++++++++ amforth-6.5/avr8/devices/atmega6490p/device.py | 370 +++ .../avr8/devices/atmega6490p/words/no-jtag.asm | 14 + .../avr8/devices/atmega6490p/words/no-wdt.asm | 22 + .../avr8/devices/atmega6490p/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega649a/atmega649a.frt | 318 +++ amforth-6.5/avr8/devices/atmega649a/device.asm | 109 + amforth-6.5/avr8/devices/atmega649a/device.inc | 1293 +++++++++ amforth-6.5/avr8/devices/atmega649a/device.py | 352 +++ .../avr8/devices/atmega649a/words/no-jtag.asm | 14 + .../avr8/devices/atmega649a/words/no-wdt.asm | 22 + .../avr8/devices/atmega649a/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega649p/atmega649p.frt | 318 +++ amforth-6.5/avr8/devices/atmega649p/device.asm | 109 + amforth-6.5/avr8/devices/atmega649p/device.inc | 1293 +++++++++ amforth-6.5/avr8/devices/atmega649p/device.py | 352 +++ .../avr8/devices/atmega649p/words/no-jtag.asm | 14 + .../avr8/devices/atmega649p/words/no-wdt.asm | 22 + .../avr8/devices/atmega649p/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega64a/atmega64a.frt | 331 +++ amforth-6.5/avr8/devices/atmega64a/device.asm | 135 + amforth-6.5/avr8/devices/atmega64a/device.inc | 1179 ++++++++ amforth-6.5/avr8/devices/atmega64a/device.py | 405 +++ .../avr8/devices/atmega64a/words/no-jtag.asm | 14 + .../avr8/devices/atmega64a/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/atmega64a/words/sleep.asm | 24 + amforth-6.5/avr8/devices/atmega64c1/atmega64c1.frt | 454 ++++ amforth-6.5/avr8/devices/atmega64c1/device.asm | 119 + amforth-6.5/avr8/devices/atmega64c1/device.inc | 1503 +++++++++++ amforth-6.5/avr8/devices/atmega64c1/device.py | 477 ++++ .../avr8/devices/atmega64c1/words/no-jtag.asm | 14 + .../avr8/devices/atmega64c1/words/no-wdt.asm | 34 + .../avr8/devices/atmega64c1/words/sleep.asm | 19 + .../avr8/devices/atmega64hve/atmega64hve.frt | 154 ++ amforth-6.5/avr8/devices/atmega64hve/device.asm | 119 + amforth-6.5/avr8/devices/atmega64hve/device.inc | 1227 +++++++++ amforth-6.5/avr8/devices/atmega64hve/device.py | 124 + amforth-6.5/avr8/devices/atmega64m1/atmega64m1.frt | 513 ++++ amforth-6.5/avr8/devices/atmega64m1/device.asm | 120 + amforth-6.5/avr8/devices/atmega64m1/device.inc | 1734 ++++++++++++ amforth-6.5/avr8/devices/atmega64m1/device.py | 495 ++++ .../avr8/devices/atmega64m1/words/no-jtag.asm | 14 + .../avr8/devices/atmega64m1/words/no-wdt.asm | 34 + .../avr8/devices/atmega64m1/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega8/atmega8.frt | 207 ++ amforth-6.5/avr8/devices/atmega8/device.asm | 95 + amforth-6.5/avr8/devices/atmega8/device.inc | 696 +++++ amforth-6.5/avr8/devices/atmega8/device.py | 191 ++ amforth-6.5/avr8/devices/atmega8/words/no-jtag.asm | 14 + amforth-6.5/avr8/devices/atmega8/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/atmega8/words/sleep.asm | 24 + amforth-6.5/avr8/devices/atmega8515/atmega8515.frt | 193 ++ amforth-6.5/avr8/devices/atmega8515/device.asm | 90 + amforth-6.5/avr8/devices/atmega8515/device.inc | 645 +++++ amforth-6.5/avr8/devices/atmega8515/device.py | 178 ++ .../avr8/devices/atmega8515/words/no-jtag.asm | 14 + .../avr8/devices/atmega8515/words/no-wdt.asm | 22 + .../avr8/devices/atmega8515/words/sleep.asm | 24 + amforth-6.5/avr8/devices/atmega8535/atmega8535.frt | 220 ++ amforth-6.5/avr8/devices/atmega8535/device.asm | 100 + amforth-6.5/avr8/devices/atmega8535/device.inc | 747 ++++++ amforth-6.5/avr8/devices/atmega8535/device.py | 203 ++ .../avr8/devices/atmega8535/words/no-jtag.asm | 14 + .../avr8/devices/atmega8535/words/no-wdt.asm | 22 + .../avr8/devices/atmega8535/words/sleep.asm | 24 + amforth-6.5/avr8/devices/atmega88/atmega88.frt | 297 +++ amforth-6.5/avr8/devices/atmega88/device.asm | 107 + amforth-6.5/avr8/devices/atmega88/device.inc | 996 +++++++ amforth-6.5/avr8/devices/atmega88/device.py | 281 ++ .../avr8/devices/atmega88/words/no-jtag.asm | 14 + amforth-6.5/avr8/devices/atmega88/words/no-wdt.asm | 34 + amforth-6.5/avr8/devices/atmega88/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega88a/atmega88a.frt | 297 +++ amforth-6.5/avr8/devices/atmega88a/device.asm | 107 + amforth-6.5/avr8/devices/atmega88a/device.inc | 996 +++++++ amforth-6.5/avr8/devices/atmega88a/device.py | 281 ++ .../avr8/devices/atmega88a/words/no-jtag.asm | 14 + .../avr8/devices/atmega88a/words/no-wdt.asm | 34 + amforth-6.5/avr8/devices/atmega88a/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega88p/atmega88p.frt | 299 +++ amforth-6.5/avr8/devices/atmega88p/device.asm | 107 + amforth-6.5/avr8/devices/atmega88p/device.inc | 996 +++++++ amforth-6.5/avr8/devices/atmega88p/device.py | 283 ++ .../avr8/devices/atmega88p/words/no-jtag.asm | 14 + .../avr8/devices/atmega88p/words/no-wdt.asm | 34 + amforth-6.5/avr8/devices/atmega88p/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega88pa/atmega88pa.frt | 299 +++ amforth-6.5/avr8/devices/atmega88pa/device.asm | 107 + amforth-6.5/avr8/devices/atmega88pa/device.inc | 996 +++++++ amforth-6.5/avr8/devices/atmega88pa/device.py | 283 ++ .../avr8/devices/atmega88pa/words/no-jtag.asm | 14 + .../avr8/devices/atmega88pa/words/no-wdt.asm | 34 + .../avr8/devices/atmega88pa/words/sleep.asm | 19 + amforth-6.5/avr8/devices/atmega8a/atmega8a.frt | 207 ++ amforth-6.5/avr8/devices/atmega8a/device.asm | 95 + amforth-6.5/avr8/devices/atmega8a/device.inc | 696 +++++ amforth-6.5/avr8/devices/atmega8a/device.py | 191 ++ .../avr8/devices/atmega8a/words/no-jtag.asm | 14 + amforth-6.5/avr8/devices/atmega8a/words/no-wdt.asm | 22 + amforth-6.5/avr8/devices/atmega8a/words/sleep.asm | 24 + amforth-6.5/avr8/devices/atmega8hva/atmega8hva.frt | 140 + amforth-6.5/avr8/devices/atmega8hva/device.asm | 114 + amforth-6.5/avr8/devices/atmega8hva/device.inc | 1053 ++++++++ amforth-6.5/avr8/devices/atmega8hva/device.py | 104 + amforth-6.5/avr8/devices/atmega8u2/atmega8u2.frt | 357 +++ amforth-6.5/avr8/devices/atmega8u2/device.asm | 112 + amforth-6.5/avr8/devices/atmega8u2/device.inc | 1128 ++++++++ amforth-6.5/avr8/devices/atmega8u2/device.py | 341 +++ .../avr8/devices/atmega8u2/words/no-jtag.asm | 14 + .../avr8/devices/atmega8u2/words/no-wdt.asm | 34 + amforth-6.5/avr8/devices/atmega8u2/words/sleep.asm | 19 + amforth-6.5/avr8/dict/appl_2k.inc | 175 ++ amforth-6.5/avr8/dict/appl_4k.inc | 81 + amforth-6.5/avr8/dict/appl_8k.inc | 1 + amforth-6.5/avr8/dict/compiler1.inc | 70 + amforth-6.5/avr8/dict/compiler2.inc | 19 + amforth-6.5/avr8/dict/core_2k.inc | 2 + amforth-6.5/avr8/dict/core_4k.inc | 98 + amforth-6.5/avr8/dict/core_8k.inc | 180 ++ amforth-6.5/avr8/dict/interrupt.inc | 16 + amforth-6.5/avr8/dict/nrww.inc | 114 + amforth-6.5/avr8/dict/rww.inc | 16 + amforth-6.5/avr8/drivers/1wire.asm | 165 ++ amforth-6.5/avr8/drivers/generic-isr.asm | 41 + amforth-6.5/avr8/drivers/usart-rx-buffer.asm | 132 + amforth-6.5/avr8/drivers/usart.asm | 30 + amforth-6.5/avr8/drivers/usart_0.asm | 32 + amforth-6.5/avr8/drivers/usart_1.asm | 31 + amforth-6.5/avr8/drivers/usart_2.asm | 34 + amforth-6.5/avr8/drivers/usart_3.asm | 31 + amforth-6.5/avr8/drivers/usart_common.asm | 30 + amforth-6.5/avr8/lib/2evalue.frt | 30 + amforth-6.5/avr8/lib/assembler-test.frt | 58 + amforth-6.5/avr8/lib/assembler.frt | 325 +++ amforth-6.5/avr8/lib/bitnames-code.frt | 351 +++ amforth-6.5/avr8/lib/bitnames.frt | 155 ++ amforth-6.5/avr8/lib/calc-baudrate.frt | 12 + amforth-6.5/avr8/lib/dot-res.frt | 19 + amforth-6.5/avr8/lib/eallot.frt | 5 + amforth-6.5/avr8/lib/forth2012/core-ext.frt | 13 + .../avr8/lib/forth2012/core-ext/avr-defers.frt | 20 + .../avr8/lib/forth2012/core-ext/marker-test.frt | 18 + amforth-6.5/avr8/lib/forth2012/core-ext/marker.frt | 23 + amforth-6.5/avr8/lib/forth2012/core.frt | 26 + amforth-6.5/avr8/lib/forth2012/core/align.frt | 3 + amforth-6.5/avr8/lib/forth2012/core/aligned.frt | 3 + amforth-6.5/avr8/lib/forth2012/core/avr-values.frt | 11 + amforth-6.5/avr8/lib/forth2012/core/c-comma.frt | 3 + .../avr8/lib/forth2012/core/eeprom-buffer.frt | 15 + .../avr8/lib/forth2012/core/environment-q.frt | 53 + amforth-6.5/avr8/lib/forth2012/core/evaluate.frt | 46 + .../avr8/lib/forth2012/core/fm-slash-mod.frt | 22 + .../avr8/lib/forth2012/core/sm-slash-rem.frt | 8 + .../avr8/lib/forth2012/core/star-slash-mod.frt | 4 + amforth-6.5/avr8/lib/hardware/25xxx.frt | 131 + amforth-6.5/avr8/lib/hardware/flash-block.frt | 37 + amforth-6.5/avr8/lib/hardware/i2c-twi-master.frt | 136 + amforth-6.5/avr8/lib/hardware/i2c-twi-slave.frt | 89 + amforth-6.5/avr8/lib/hardware/int-q.frt | 2 + amforth-6.5/avr8/lib/hardware/interrupts.frt | 7 + amforth-6.5/avr8/lib/hardware/key2char.frt | 135 + amforth-6.5/avr8/lib/hardware/keyboard.frt | 486 ++++ amforth-6.5/avr8/lib/hardware/mmc.frt | 371 +++ amforth-6.5/avr8/lib/hardware/mpc485.frt | 156 ++ amforth-6.5/avr8/lib/hardware/spi.frt | 110 + amforth-6.5/avr8/lib/hardware/timer0.frt | 43 + amforth-6.5/avr8/lib/hardware/timer1.frt | 44 + amforth-6.5/avr8/lib/hardware/timer2.frt | 42 + amforth-6.5/avr8/lib/imove.frt | 12 + amforth-6.5/avr8/lib/portio.frt | 46 + amforth-6.5/avr8/lib/ram.frt | 225 ++ amforth-6.5/avr8/lib/recognizer-arch.frt | 8 + amforth-6.5/avr8/lib/run-hayes.frt | 28 + amforth-6.5/avr8/macros.asm | 158 ++ amforth-6.5/avr8/preamble.inc | 50 + amforth-6.5/avr8/tools/99-avr.rules | 10 + amforth-6.5/avr8/user.inc | 34 + amforth-6.5/avr8/words/1minus.asm | 13 + amforth-6.5/avr8/words/1ms.asm | 13 + amforth-6.5/avr8/words/1plus.asm | 13 + amforth-6.5/avr8/words/2r_fetch.asm | 23 + amforth-6.5/avr8/words/2r_from.asm | 19 + amforth-6.5/avr8/words/2slash.asm | 14 + amforth-6.5/avr8/words/2spirw.asm | 19 + amforth-6.5/avr8/words/2star.asm | 14 + amforth-6.5/avr8/words/2to_r.asm | 19 + amforth-6.5/avr8/words/allot.asm | 16 + amforth-6.5/avr8/words/and.asm | 16 + amforth-6.5/avr8/words/bm-clear.asm | 19 + amforth-6.5/avr8/words/bm-set.asm | 18 + amforth-6.5/avr8/words/bm-toggle.asm | 18 + amforth-6.5/avr8/words/byteswap.asm | 15 + amforth-6.5/avr8/words/cas.asm | 28 + amforth-6.5/avr8/words/cellplus.asm | 13 + amforth-6.5/avr8/words/cells.asm | 10 + amforth-6.5/avr8/words/cfetch.asm | 15 + amforth-6.5/avr8/words/cmove.asm | 30 + amforth-6.5/avr8/words/cmove_g.asm | 34 + amforth-6.5/avr8/words/code.asm | 17 + amforth-6.5/avr8/words/cold.asm | 52 + amforth-6.5/avr8/words/colon-noname.asm | 21 + amforth-6.5/avr8/words/comma.asm | 18 + amforth-6.5/avr8/words/compare.asm | 47 + amforth-6.5/avr8/words/const-fold-depth.asm | 18 + amforth-6.5/avr8/words/cstore.asm | 16 + amforth-6.5/avr8/words/d-2slash.asm | 20 + amforth-6.5/avr8/words/d-2star.asm | 20 + amforth-6.5/avr8/words/d-greaterzero.asm | 19 + amforth-6.5/avr8/words/d-invert.asm | 20 + amforth-6.5/avr8/words/d-lesszero.asm | 15 + amforth-6.5/avr8/words/d-minus.asm | 28 + amforth-6.5/avr8/words/d-plus.asm | 27 + amforth-6.5/avr8/words/dabs.asm | 19 + amforth-6.5/avr8/words/dnegate.asm | 17 + amforth-6.5/avr8/words/do-defer.asm | 27 + amforth-6.5/avr8/words/do-sliteral.asm | 21 + amforth-6.5/avr8/words/do-value.asm | 25 + amforth-6.5/avr8/words/dobranch.asm | 14 + amforth-6.5/avr8/words/docondbranch.asm | 16 + amforth-6.5/avr8/words/doconstant.asm | 15 + amforth-6.5/avr8/words/dodo.asm | 25 + amforth-6.5/avr8/words/does.asm | 53 + amforth-6.5/avr8/words/doliteral.asm | 17 + amforth-6.5/avr8/words/doloop.asm | 16 + amforth-6.5/avr8/words/doplusloop.asm | 28 + amforth-6.5/avr8/words/douser.asm | 18 + amforth-6.5/avr8/words/dovariable.asm | 16 + amforth-6.5/avr8/words/dp.asm | 14 + amforth-6.5/avr8/words/drop.asm | 13 + amforth-6.5/avr8/words/dup.asm | 13 + amforth-6.5/avr8/words/edefer-fetch.asm | 14 + amforth-6.5/avr8/words/edefer-store.asm | 14 + amforth-6.5/avr8/words/ehere.asm | 14 + amforth-6.5/avr8/words/end-code.asm | 16 + amforth-6.5/avr8/words/env-mcuinfo.asm | 14 + amforth-6.5/avr8/words/env-slashpad.asm | 15 + amforth-6.5/avr8/words/env-wordlists.asm | 14 + amforth-6.5/avr8/words/environment.asm | 12 + amforth-6.5/avr8/words/equal.asm | 14 + amforth-6.5/avr8/words/equalzero.asm | 14 + amforth-6.5/avr8/words/execute.asm | 14 + amforth-6.5/avr8/words/exit.asm | 14 + amforth-6.5/avr8/words/fetch-e.asm | 51 + amforth-6.5/avr8/words/fetch-i.asm | 14 + amforth-6.5/avr8/words/fetch-u.asm | 15 + amforth-6.5/avr8/words/fetch.asm | 33 + amforth-6.5/avr8/words/fill.asm | 26 + amforth-6.5/avr8/words/forth-recognizer.asm | 14 + amforth-6.5/avr8/words/forth-wordlist.asm | 12 + amforth-6.5/avr8/words/g-mark.asm | 16 + amforth-6.5/avr8/words/g-resolve.asm | 16 + amforth-6.5/avr8/words/get-current.asm | 15 + amforth-6.5/avr8/words/greater.asm | 19 + amforth-6.5/avr8/words/greaterzero.asm | 16 + amforth-6.5/avr8/words/header.asm | 36 + amforth-6.5/avr8/words/here.asm | 14 + amforth-6.5/avr8/words/hld.asm | 16 + amforth-6.5/avr8/words/i-cellplus.asm | 13 + amforth-6.5/avr8/words/i.asm | 23 + amforth-6.5/avr8/words/icompare.asm | 103 + amforth-6.5/avr8/words/icount.asm | 16 + amforth-6.5/avr8/words/immediate-q.asm | 23 + amforth-6.5/avr8/words/immediate.asm | 21 + amforth-6.5/avr8/words/init-ram.asm | 48 + amforth-6.5/avr8/words/int-fetch.asm | 16 + amforth-6.5/avr8/words/int-num.asm | 12 + amforth-6.5/avr8/words/int-off.asm | 13 + amforth-6.5/avr8/words/int-on.asm | 13 + amforth-6.5/avr8/words/int-store.asm | 16 + amforth-6.5/avr8/words/int-trap.asm | 14 + amforth-6.5/avr8/words/invert.asm | 14 + amforth-6.5/avr8/words/irqcnt.asm | 15 + amforth-6.5/avr8/words/isr-end.asm | 15 + amforth-6.5/avr8/words/isr-exec.asm | 15 + amforth-6.5/avr8/words/itype.asm | 74 + amforth-6.5/avr8/words/j.asm | 23 + amforth-6.5/avr8/words/l_mark.asm | 13 + amforth-6.5/avr8/words/l_resolve.asm | 14 + amforth-6.5/avr8/words/latest.asm | 16 + amforth-6.5/avr8/words/less.asm | 18 + amforth-6.5/avr8/words/lesszero.asm | 14 + amforth-6.5/avr8/words/log2.asm | 26 + amforth-6.5/avr8/words/lp.asm | 17 + amforth-6.5/avr8/words/lp0.asm | 14 + amforth-6.5/avr8/words/lshift.asm | 22 + amforth-6.5/avr8/words/marker.asm | 14 + amforth-6.5/avr8/words/minus.asm | 17 + amforth-6.5/avr8/words/mplus.asm | 14 + amforth-6.5/avr8/words/mstar.asm | 37 + amforth-6.5/avr8/words/n-spi.asm | 55 + amforth-6.5/avr8/words/n_r_from.asm | 23 + amforth-6.5/avr8/words/n_to_r.asm | 23 + amforth-6.5/avr8/words/name2flags.asm | 16 + amforth-6.5/avr8/words/negate.asm | 14 + amforth-6.5/avr8/words/newest.asm | 16 + amforth-6.5/avr8/words/nfa2cfa.asm | 14 + amforth-6.5/avr8/words/nfa2lfa.asm | 16 + amforth-6.5/avr8/words/nip.asm | 13 + amforth-6.5/avr8/words/not.asm | 13 + amforth-6.5/avr8/words/notequalzero.asm | 14 + amforth-6.5/avr8/words/or.asm | 17 + amforth-6.5/avr8/words/over.asm | 16 + amforth-6.5/avr8/words/pause.asm | 18 + amforth-6.5/avr8/words/plus.asm | 16 + amforth-6.5/avr8/words/plusstore.asm | 21 + amforth-6.5/avr8/words/popcnt.asm | 29 + amforth-6.5/avr8/words/qdup.asm | 17 + amforth-6.5/avr8/words/r_fetch.asm | 17 + amforth-6.5/avr8/words/r_from.asm | 15 + amforth-6.5/avr8/words/reg-a.asm | 180 ++ amforth-6.5/avr8/words/reg-b.asm | 180 ++ amforth-6.5/avr8/words/rot.asm | 22 + amforth-6.5/avr8/words/rp0.asm | 27 + amforth-6.5/avr8/words/rpfetch.asm | 15 + amforth-6.5/avr8/words/rpstore.asm | 18 + amforth-6.5/avr8/words/rshift.asm | 22 + amforth-6.5/avr8/words/scomma.asm | 56 + amforth-6.5/avr8/words/set-current.asm | 15 + amforth-6.5/avr8/words/slashmod.asm | 66 + amforth-6.5/avr8/words/sp0.asm | 27 + amforth-6.5/avr8/words/spfetch.asm | 14 + amforth-6.5/avr8/words/spirw.asm | 26 + amforth-6.5/avr8/words/spstore.asm | 14 + amforth-6.5/avr8/words/state.asm | 16 + amforth-6.5/avr8/words/store-e.asm | 66 + amforth-6.5/avr8/words/store-i.asm | 14 + amforth-6.5/avr8/words/store-i_big.asm | 129 + amforth-6.5/avr8/words/store-i_nrww.asm | 123 + amforth-6.5/avr8/words/store-u.asm | 15 + amforth-6.5/avr8/words/store.asm | 35 + amforth-6.5/avr8/words/swap.asm | 16 + amforth-6.5/avr8/words/to-body.asm | 10 + amforth-6.5/avr8/words/to_r.asm | 15 + amforth-6.5/avr8/words/true.asm | 16 + amforth-6.5/avr8/words/turnkey.asm | 14 + amforth-6.5/avr8/words/ubrr.asm | 14 + amforth-6.5/avr8/words/uless.asm | 18 + amforth-6.5/avr8/words/umslashmod.asm | 62 + amforth-6.5/avr8/words/umstar.asm | 37 + amforth-6.5/avr8/words/unloop.asm | 16 + amforth-6.5/avr8/words/unused.asm | 15 + amforth-6.5/avr8/words/up.asm | 29 + amforth-6.5/avr8/words/usart-rx-poll.asm | 42 + amforth-6.5/avr8/words/usart-tx-poll.asm | 40 + amforth-6.5/avr8/words/usart.asm | 41 + amforth-6.5/avr8/words/user.asm | 18 + amforth-6.5/avr8/words/uslashmod.asm | 16 + amforth-6.5/avr8/words/wdr.asm | 13 + amforth-6.5/avr8/words/wlscope.asm | 22 + amforth-6.5/avr8/words/wordlist.asm | 20 + amforth-6.5/avr8/words/xor.asm | 16 + amforth-6.5/avr8/words/zero.asm | 15 + 1205 files changed, 276507 insertions(+) create mode 100644 amforth-6.5/avr8/amforth-eeprom.inc create mode 100644 amforth-6.5/avr8/amforth-interpreter.asm create mode 100644 amforth-6.5/avr8/amforth-low.asm create mode 100644 amforth-6.5/avr8/amforth.asm create mode 100644 amforth-6.5/avr8/devices/at90can128/at90can128.frt create mode 100644 amforth-6.5/avr8/devices/at90can128/device.asm create mode 100644 amforth-6.5/avr8/devices/at90can128/device.inc create mode 100644 amforth-6.5/avr8/devices/at90can128/device.py create mode 100644 amforth-6.5/avr8/devices/at90can128/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/at90can128/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/at90can128/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/at90can32/at90can32.frt create mode 100644 amforth-6.5/avr8/devices/at90can32/device.asm create mode 100644 amforth-6.5/avr8/devices/at90can32/device.inc create mode 100644 amforth-6.5/avr8/devices/at90can32/device.py create mode 100644 amforth-6.5/avr8/devices/at90can32/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/at90can32/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/at90can32/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/at90can64/at90can64.frt create mode 100644 amforth-6.5/avr8/devices/at90can64/device.asm create mode 100644 amforth-6.5/avr8/devices/at90can64/device.inc create mode 100644 amforth-6.5/avr8/devices/at90can64/device.py create mode 100644 amforth-6.5/avr8/devices/at90can64/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/at90can64/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/at90can64/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm1/at90pwm1.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm1/device.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm1/device.inc create mode 100644 amforth-6.5/avr8/devices/at90pwm1/device.py create mode 100644 amforth-6.5/avr8/devices/at90pwm1/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm1/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm1/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm161/blocks/AD_CONVERTER.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/blocks/ANALOG_COMPARATOR.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/blocks/BOOT_LOAD.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/blocks/CPU.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/blocks/DA_CONVERTER.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/blocks/EEPROM.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/blocks/EXTERNAL_INTERRUPT.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/blocks/PORTB.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/blocks/PORTD.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/blocks/PORTE.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/blocks/PSC0.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/blocks/PSC2.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/blocks/SPI.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/blocks/TIMER_COUNTER_1.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/blocks/WATCHDOG.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/device.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm161/device.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm161/device.py create mode 100644 amforth-6.5/avr8/devices/at90pwm2/at90pwm2.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm2/device.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm2/device.inc create mode 100644 amforth-6.5/avr8/devices/at90pwm2/device.py create mode 100644 amforth-6.5/avr8/devices/at90pwm216/at90pwm216.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm216/device.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm216/device.inc create mode 100644 amforth-6.5/avr8/devices/at90pwm216/device.py create mode 100644 amforth-6.5/avr8/devices/at90pwm216/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm216/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm216/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm2b/at90pwm2b.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm2b/device.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm2b/device.inc create mode 100644 amforth-6.5/avr8/devices/at90pwm2b/device.py create mode 100644 amforth-6.5/avr8/devices/at90pwm2b/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm2b/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm2b/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm3/at90pwm3.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm3/device.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm3/device.inc create mode 100644 amforth-6.5/avr8/devices/at90pwm3/device.py create mode 100644 amforth-6.5/avr8/devices/at90pwm316/at90pwm316.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm316/device.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm316/device.inc create mode 100644 amforth-6.5/avr8/devices/at90pwm316/device.py create mode 100644 amforth-6.5/avr8/devices/at90pwm316/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm316/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm316/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm3b/at90pwm3b.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm3b/device.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm3b/device.inc create mode 100644 amforth-6.5/avr8/devices/at90pwm3b/device.py create mode 100644 amforth-6.5/avr8/devices/at90pwm3b/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm3b/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm3b/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm81/at90pwm81.frt create mode 100644 amforth-6.5/avr8/devices/at90pwm81/device.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm81/device.inc create mode 100644 amforth-6.5/avr8/devices/at90pwm81/device.py create mode 100644 amforth-6.5/avr8/devices/at90pwm81/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm81/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/at90pwm81/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/at90usb1286/at90usb1286.frt create mode 100644 amforth-6.5/avr8/devices/at90usb1286/device.asm create mode 100644 amforth-6.5/avr8/devices/at90usb1286/device.inc create mode 100644 amforth-6.5/avr8/devices/at90usb1286/device.py create mode 100644 amforth-6.5/avr8/devices/at90usb1286/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/at90usb1286/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/at90usb1286/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/at90usb1287/at90usb1287.frt create mode 100644 amforth-6.5/avr8/devices/at90usb1287/device.asm create mode 100644 amforth-6.5/avr8/devices/at90usb1287/device.inc create mode 100644 amforth-6.5/avr8/devices/at90usb1287/device.py create mode 100644 amforth-6.5/avr8/devices/at90usb1287/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/at90usb1287/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/at90usb1287/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/at90usb162/at90usb162.frt create mode 100644 amforth-6.5/avr8/devices/at90usb162/device.asm create mode 100644 amforth-6.5/avr8/devices/at90usb162/device.inc create mode 100644 amforth-6.5/avr8/devices/at90usb162/device.py create mode 100644 amforth-6.5/avr8/devices/at90usb162/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/at90usb162/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/at90usb162/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/at90usb646/at90usb646.frt create mode 100644 amforth-6.5/avr8/devices/at90usb646/device.asm create mode 100644 amforth-6.5/avr8/devices/at90usb646/device.inc create mode 100644 amforth-6.5/avr8/devices/at90usb646/device.py create mode 100644 amforth-6.5/avr8/devices/at90usb646/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/at90usb646/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/at90usb646/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/at90usb647/at90usb647.frt create mode 100644 amforth-6.5/avr8/devices/at90usb647/device.asm create mode 100644 amforth-6.5/avr8/devices/at90usb647/device.inc create mode 100644 amforth-6.5/avr8/devices/at90usb647/device.py create mode 100644 amforth-6.5/avr8/devices/at90usb647/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/at90usb647/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/at90usb647/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/at90usb82/at90usb82.frt create mode 100644 amforth-6.5/avr8/devices/at90usb82/device.asm create mode 100644 amforth-6.5/avr8/devices/at90usb82/device.inc create mode 100644 amforth-6.5/avr8/devices/at90usb82/device.py create mode 100644 amforth-6.5/avr8/devices/at90usb82/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/at90usb82/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/at90usb82/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega103/atmega103.frt create mode 100644 amforth-6.5/avr8/devices/atmega103/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega103/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega103/device.py create mode 100644 amforth-6.5/avr8/devices/atmega128/atmega128.frt create mode 100644 amforth-6.5/avr8/devices/atmega128/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega128/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega128/device.py create mode 100644 amforth-6.5/avr8/devices/atmega128/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega128/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega128/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega1280/atmega1280.frt create mode 100644 amforth-6.5/avr8/devices/atmega1280/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega1280/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega1280/device.py create mode 100644 amforth-6.5/avr8/devices/atmega1280/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega1280/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega1280/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega1281/atmega1281.frt create mode 100644 amforth-6.5/avr8/devices/atmega1281/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega1281/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega1281/device.py create mode 100644 amforth-6.5/avr8/devices/atmega1281/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega1281/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega1281/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega1284/atmega1284.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega1284/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega1284/device.py create mode 100644 amforth-6.5/avr8/devices/atmega1284/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega1284/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega1284/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega1284p/atmega1284p.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega1284p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega1284p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega1284p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega1284p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega1284p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/AD_CONVERTER.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/ANALOG_COMPARATOR.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/BOOT_LOAD.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/CPU.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/EEPROM.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/EXTERNAL_INTERRUPT.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/FLASH.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/JTAG.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/PORTA.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/PORTB.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/PORTC.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/PORTD.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/PORTE.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/PORTF.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/PORTG.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/PWRCTRL.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/SPI.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/SYMCNT.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/TIMER_COUNTER_0.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/TIMER_COUNTER_1.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/TIMER_COUNTER_2.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/TIMER_COUNTER_3.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/TIMER_COUNTER_4.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/TIMER_COUNTER_5.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/TRX24.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/TWI.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/USART0.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/USART0_SPI.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/USART1.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/USART1_SPI.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/blocks/WATCHDOG.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/device.frt create mode 100644 amforth-6.5/avr8/devices/atmega1284rfr2/device.py create mode 100644 amforth-6.5/avr8/devices/atmega128a/atmega128a.frt create mode 100644 amforth-6.5/avr8/devices/atmega128a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega128a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega128a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega128a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega128a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega128a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega128rfa1/atmega128rfa1.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfa1/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega128rfa1/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega128rfa1/device.py create mode 100644 amforth-6.5/avr8/devices/atmega128rfa1/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega128rfa1/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega128rfa1/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/AD_CONVERTER.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/ANALOG_COMPARATOR.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/BOOT_LOAD.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/CPU.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/EEPROM.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/EXTERNAL_INTERRUPT.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/FLASH.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/JTAG.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/PORTA.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/PORTB.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/PORTC.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/PORTD.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/PORTE.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/PORTF.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/PORTG.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/PWRCTRL.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/SPI.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/SYMCNT.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/TIMER_COUNTER_0.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/TIMER_COUNTER_1.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/TIMER_COUNTER_2.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/TIMER_COUNTER_3.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/TIMER_COUNTER_4.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/TIMER_COUNTER_5.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/TRX24.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/TWI.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/USART0.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/USART0_SPI.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/USART1.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/USART1_SPI.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/blocks/WATCHDOG.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/device.frt create mode 100644 amforth-6.5/avr8/devices/atmega128rfr2/device.py create mode 100644 amforth-6.5/avr8/devices/atmega16/atmega16.frt create mode 100644 amforth-6.5/avr8/devices/atmega16/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega16/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega16/device.py create mode 100644 amforth-6.5/avr8/devices/atmega16/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega16/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega16/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega161/atmega161.frt create mode 100644 amforth-6.5/avr8/devices/atmega161/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega161/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega161/device.py create mode 100644 amforth-6.5/avr8/devices/atmega162/atmega162.frt create mode 100644 amforth-6.5/avr8/devices/atmega162/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega162/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega162/device.py create mode 100644 amforth-6.5/avr8/devices/atmega162/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega162/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega162/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega163/atmega163.frt create mode 100644 amforth-6.5/avr8/devices/atmega163/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega163/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega163/device.py create mode 100644 amforth-6.5/avr8/devices/atmega164a/atmega164a.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/AD_CONVERTER.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/ANALOG_COMPARATOR.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/BOOT_LOAD.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/CPU.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/EEPROM.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/EXTERNAL_INTERRUPT.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/JTAG.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/PORTA.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/PORTB.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/PORTC.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/PORTD.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/SPI.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/TIMER_COUNTER_0.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/TIMER_COUNTER_1.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/TIMER_COUNTER_2.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/TWI.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/USART0.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/USART1.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/blocks/WATCHDOG.frt create mode 100644 amforth-6.5/avr8/devices/atmega164a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega164a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega164a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega164a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega164a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega164a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega164p/atmega164p.frt create mode 100644 amforth-6.5/avr8/devices/atmega164p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega164p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega164p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega164p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega164p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega164p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega164pa/atmega164pa.frt create mode 100644 amforth-6.5/avr8/devices/atmega164pa/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega164pa/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega164pa/device.py create mode 100644 amforth-6.5/avr8/devices/atmega164pa/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega164pa/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega164pa/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega165/atmega165.frt create mode 100644 amforth-6.5/avr8/devices/atmega165/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega165/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega165/device.py create mode 100644 amforth-6.5/avr8/devices/atmega165a/atmega165a.frt create mode 100644 amforth-6.5/avr8/devices/atmega165a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega165a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega165a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega165a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega165a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega165a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega165p/atmega165p.frt create mode 100644 amforth-6.5/avr8/devices/atmega165p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega165p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega165p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega165p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega165p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega165p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega165pa/atmega165pa.frt create mode 100644 amforth-6.5/avr8/devices/atmega165pa/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega165pa/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega165pa/device.py create mode 100644 amforth-6.5/avr8/devices/atmega165pa/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega165pa/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega165pa/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega168/atmega168.frt create mode 100644 amforth-6.5/avr8/devices/atmega168/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega168/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega168/device.py create mode 100644 amforth-6.5/avr8/devices/atmega168/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega168/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega168/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega168a/atmega168a.frt create mode 100644 amforth-6.5/avr8/devices/atmega168a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega168a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega168a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega168a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega168a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega168a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega168p/atmega168p.frt create mode 100644 amforth-6.5/avr8/devices/atmega168p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega168p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega168p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega168p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega168p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega168p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega168pa/atmega168pa.frt create mode 100644 amforth-6.5/avr8/devices/atmega168pa/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega168pa/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega168pa/device.py create mode 100644 amforth-6.5/avr8/devices/atmega168pa/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega168pa/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega168pa/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega169/atmega169.frt create mode 100644 amforth-6.5/avr8/devices/atmega169/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega169/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega169/device.py create mode 100644 amforth-6.5/avr8/devices/atmega169a/atmega169a.frt create mode 100644 amforth-6.5/avr8/devices/atmega169a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega169a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega169a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega169a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega169a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega169a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega169p/atmega169p.frt create mode 100644 amforth-6.5/avr8/devices/atmega169p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega169p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega169p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega169p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega169p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega169p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega169pa/atmega169pa.frt create mode 100644 amforth-6.5/avr8/devices/atmega169pa/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega169pa/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega169pa/device.py create mode 100644 amforth-6.5/avr8/devices/atmega169pa/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega169pa/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega169pa/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega16a/atmega16a.frt create mode 100644 amforth-6.5/avr8/devices/atmega16a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega16a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega16a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega16a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega16a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega16a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega16hva/atmega16hva.frt create mode 100644 amforth-6.5/avr8/devices/atmega16hva/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega16hva/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega16hva/device.py create mode 100644 amforth-6.5/avr8/devices/atmega16hva2/atmega16hva2.frt create mode 100644 amforth-6.5/avr8/devices/atmega16hva2/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega16hva2/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega16hva2/device.py create mode 100644 amforth-6.5/avr8/devices/atmega16hvb/atmega16hvb.frt create mode 100644 amforth-6.5/avr8/devices/atmega16hvb/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega16hvb/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega16hvb/device.py create mode 100644 amforth-6.5/avr8/devices/atmega16hvb/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega16hvb/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega16hvb/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega16hvbrevb/atmega16hvbrevb.frt create mode 100644 amforth-6.5/avr8/devices/atmega16hvbrevb/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega16hvbrevb/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega16hvbrevb/device.py create mode 100644 amforth-6.5/avr8/devices/atmega16hvbrevb/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega16hvbrevb/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega16hvbrevb/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega16m1/atmega16m1.frt create mode 100644 amforth-6.5/avr8/devices/atmega16m1/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega16m1/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega16m1/device.py create mode 100644 amforth-6.5/avr8/devices/atmega16m1/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega16m1/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega16m1/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega16u2/atmega16u2.frt create mode 100644 amforth-6.5/avr8/devices/atmega16u2/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega16u2/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega16u2/device.py create mode 100644 amforth-6.5/avr8/devices/atmega16u2/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega16u2/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega16u2/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega16u4/atmega16u4.frt create mode 100644 amforth-6.5/avr8/devices/atmega16u4/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega16u4/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega16u4/device.py create mode 100644 amforth-6.5/avr8/devices/atmega16u4/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega16u4/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega16u4/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega2560/atmega2560.frt create mode 100644 amforth-6.5/avr8/devices/atmega2560/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega2560/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega2560/device.py create mode 100644 amforth-6.5/avr8/devices/atmega2560/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega2560/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega2560/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega2561/atmega2561.frt create mode 100644 amforth-6.5/avr8/devices/atmega2561/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega2561/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega2561/device.py create mode 100644 amforth-6.5/avr8/devices/atmega2561/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega2561/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega2561/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/AD_CONVERTER.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/ANALOG_COMPARATOR.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/BOOT_LOAD.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/CPU.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/EEPROM.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/EXTERNAL_INTERRUPT.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/FLASH.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/JTAG.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/PORTA.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/PORTB.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/PORTC.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/PORTD.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/PORTE.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/PORTF.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/PORTG.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/PWRCTRL.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/SPI.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/SYMCNT.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/TIMER_COUNTER_0.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/TIMER_COUNTER_1.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/TIMER_COUNTER_2.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/TIMER_COUNTER_3.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/TIMER_COUNTER_4.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/TIMER_COUNTER_5.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/TRX24.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/TWI.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/USART0.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/USART0_SPI.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/USART1.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/USART1_SPI.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/blocks/WATCHDOG.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/device.frt create mode 100644 amforth-6.5/avr8/devices/atmega2564rfr2/device.py create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/AD_CONVERTER.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/ANALOG_COMPARATOR.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/BOOT_LOAD.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/CPU.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/EEPROM.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/EXTERNAL_INTERRUPT.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/FLASH.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/JTAG.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/PORTA.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/PORTB.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/PORTC.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/PORTD.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/PORTE.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/PORTF.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/PORTG.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/PWRCTRL.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/SPI.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/SYMCNT.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/TIMER_COUNTER_0.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/TIMER_COUNTER_1.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/TIMER_COUNTER_2.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/TIMER_COUNTER_3.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/TIMER_COUNTER_4.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/TIMER_COUNTER_5.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/TRX24.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/TWI.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/USART0.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/USART0_SPI.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/USART1.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/USART1_SPI.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/blocks/WATCHDOG.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/device.frt create mode 100644 amforth-6.5/avr8/devices/atmega256rfr2/device.py create mode 100644 amforth-6.5/avr8/devices/atmega32/atmega32.frt create mode 100644 amforth-6.5/avr8/devices/atmega32/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega32/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega32/device.py create mode 100644 amforth-6.5/avr8/devices/atmega32/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega32/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega32/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega323/atmega323.frt create mode 100644 amforth-6.5/avr8/devices/atmega323/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega323/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega323/device.py create mode 100644 amforth-6.5/avr8/devices/atmega324a/atmega324a.frt create mode 100644 amforth-6.5/avr8/devices/atmega324a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega324a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega324a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega324a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega324a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega324a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega324p/atmega324p.frt create mode 100644 amforth-6.5/avr8/devices/atmega324p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega324p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega324p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega324p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega324p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega324p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega324pa/atmega324pa.frt create mode 100644 amforth-6.5/avr8/devices/atmega324pa/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega324pa/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega324pa/device.py create mode 100644 amforth-6.5/avr8/devices/atmega324pa/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega324pa/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega324pa/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega325/atmega325.frt create mode 100644 amforth-6.5/avr8/devices/atmega325/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega325/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega325/device.py create mode 100644 amforth-6.5/avr8/devices/atmega325/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega325/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega325/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250/atmega3250.frt create mode 100644 amforth-6.5/avr8/devices/atmega3250/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega3250/device.py create mode 100644 amforth-6.5/avr8/devices/atmega3250/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250a/atmega3250a.frt create mode 100644 amforth-6.5/avr8/devices/atmega3250a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega3250a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega3250a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250p/atmega3250p.frt create mode 100644 amforth-6.5/avr8/devices/atmega3250p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega3250p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega3250p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250pa/atmega3250pa.frt create mode 100644 amforth-6.5/avr8/devices/atmega3250pa/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250pa/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega3250pa/device.py create mode 100644 amforth-6.5/avr8/devices/atmega3250pa/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250pa/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega3250pa/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega325a/atmega325a.frt create mode 100644 amforth-6.5/avr8/devices/atmega325a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega325a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega325a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega325a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega325a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega325a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega325p/atmega325p.frt create mode 100644 amforth-6.5/avr8/devices/atmega325p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega325p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega325p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega325p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega325p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega325p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega325pa/atmega325pa.frt create mode 100644 amforth-6.5/avr8/devices/atmega325pa/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega325pa/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega325pa/device.py create mode 100644 amforth-6.5/avr8/devices/atmega325pa/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega325pa/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega325pa/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega328/atmega328.frt create mode 100644 amforth-6.5/avr8/devices/atmega328/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega328/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega328/device.py create mode 100644 amforth-6.5/avr8/devices/atmega328/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega328/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega328/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega328p/atmega328p.frt create mode 100644 amforth-6.5/avr8/devices/atmega328p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega328p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega328p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega328p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega328p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega328p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega329/atmega329.frt create mode 100644 amforth-6.5/avr8/devices/atmega329/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega329/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega329/device.py create mode 100644 amforth-6.5/avr8/devices/atmega329/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega329/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega329/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290/atmega3290.frt create mode 100644 amforth-6.5/avr8/devices/atmega3290/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega3290/device.py create mode 100644 amforth-6.5/avr8/devices/atmega3290/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290a/atmega3290a.frt create mode 100644 amforth-6.5/avr8/devices/atmega3290a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega3290a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega3290a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290p/atmega3290p.frt create mode 100644 amforth-6.5/avr8/devices/atmega3290p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega3290p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega3290p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290pa/atmega3290pa.frt create mode 100644 amforth-6.5/avr8/devices/atmega3290pa/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290pa/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega3290pa/device.py create mode 100644 amforth-6.5/avr8/devices/atmega3290pa/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290pa/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega3290pa/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega329a/atmega329a.frt create mode 100644 amforth-6.5/avr8/devices/atmega329a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega329a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega329a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega329a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega329a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega329a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega329p/atmega329p.frt create mode 100644 amforth-6.5/avr8/devices/atmega329p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega329p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega329p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega329p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega329p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega329p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega329pa/atmega329pa.frt create mode 100644 amforth-6.5/avr8/devices/atmega329pa/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega329pa/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega329pa/device.py create mode 100644 amforth-6.5/avr8/devices/atmega329pa/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega329pa/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega329pa/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega32a/atmega32a.frt create mode 100644 amforth-6.5/avr8/devices/atmega32a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega32a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega32a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega32a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega32a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega32a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega32c1/atmega32c1.frt create mode 100644 amforth-6.5/avr8/devices/atmega32c1/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega32c1/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega32c1/device.py create mode 100644 amforth-6.5/avr8/devices/atmega32c1/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega32c1/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega32c1/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega32hvb/atmega32hvb.frt create mode 100644 amforth-6.5/avr8/devices/atmega32hvb/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega32hvb/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega32hvb/device.py create mode 100644 amforth-6.5/avr8/devices/atmega32hvb/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega32hvb/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega32hvb/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega32hvbrevb/atmega32hvbrevb.frt create mode 100644 amforth-6.5/avr8/devices/atmega32hvbrevb/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega32hvbrevb/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega32hvbrevb/device.py create mode 100644 amforth-6.5/avr8/devices/atmega32hvbrevb/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega32hvbrevb/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega32hvbrevb/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega32m1/atmega32m1.frt create mode 100644 amforth-6.5/avr8/devices/atmega32m1/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega32m1/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega32m1/device.py create mode 100644 amforth-6.5/avr8/devices/atmega32m1/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega32m1/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega32m1/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega32u2/atmega32u2.frt create mode 100644 amforth-6.5/avr8/devices/atmega32u2/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega32u2/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega32u2/device.py create mode 100644 amforth-6.5/avr8/devices/atmega32u2/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega32u2/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega32u2/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega32u4/atmega32u4.frt create mode 100644 amforth-6.5/avr8/devices/atmega32u4/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega32u4/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega32u4/device.py create mode 100644 amforth-6.5/avr8/devices/atmega32u4/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega32u4/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega32u4/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega32u6/atmega32u6.frt create mode 100644 amforth-6.5/avr8/devices/atmega32u6/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega32u6/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega32u6/device.py create mode 100644 amforth-6.5/avr8/devices/atmega406/atmega406.frt create mode 100644 amforth-6.5/avr8/devices/atmega406/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega406/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega406/device.py create mode 100644 amforth-6.5/avr8/devices/atmega406/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega406/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega406/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega64/atmega64.frt create mode 100644 amforth-6.5/avr8/devices/atmega64/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega64/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega64/device.py create mode 100644 amforth-6.5/avr8/devices/atmega64/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega64/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega64/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega640/atmega640.frt create mode 100644 amforth-6.5/avr8/devices/atmega640/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega640/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega640/device.py create mode 100644 amforth-6.5/avr8/devices/atmega640/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega640/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega640/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega644/atmega644.frt create mode 100644 amforth-6.5/avr8/devices/atmega644/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega644/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega644/device.py create mode 100644 amforth-6.5/avr8/devices/atmega644/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega644/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega644/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega644a/atmega644a.frt create mode 100644 amforth-6.5/avr8/devices/atmega644a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega644a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega644a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega644a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega644a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega644a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega644p/atmega644p.frt create mode 100644 amforth-6.5/avr8/devices/atmega644p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega644p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega644p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega644p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega644p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega644p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega644pa/atmega644pa.frt create mode 100644 amforth-6.5/avr8/devices/atmega644pa/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega644pa/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega644pa/device.py create mode 100644 amforth-6.5/avr8/devices/atmega644pa/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega644pa/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega644pa/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega645/atmega645.frt create mode 100644 amforth-6.5/avr8/devices/atmega645/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega645/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega645/device.py create mode 100644 amforth-6.5/avr8/devices/atmega645/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega645/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega645/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega6450/atmega6450.frt create mode 100644 amforth-6.5/avr8/devices/atmega6450/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega6450/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega6450/device.py create mode 100644 amforth-6.5/avr8/devices/atmega6450/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega6450/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega6450/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega6450a/atmega6450a.frt create mode 100644 amforth-6.5/avr8/devices/atmega6450a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega6450a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega6450a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega6450a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega6450a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega6450a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega6450p/atmega6450p.frt create mode 100644 amforth-6.5/avr8/devices/atmega6450p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega6450p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega6450p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega6450p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega6450p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega6450p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega645a/atmega645a.frt create mode 100644 amforth-6.5/avr8/devices/atmega645a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega645a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega645a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega645a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega645a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega645a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega645p/atmega645p.frt create mode 100644 amforth-6.5/avr8/devices/atmega645p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega645p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega645p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega645p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega645p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega645p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega649/atmega649.frt create mode 100644 amforth-6.5/avr8/devices/atmega649/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega649/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega649/device.py create mode 100644 amforth-6.5/avr8/devices/atmega649/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega649/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega649/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega6490/atmega6490.frt create mode 100644 amforth-6.5/avr8/devices/atmega6490/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega6490/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega6490/device.py create mode 100644 amforth-6.5/avr8/devices/atmega6490/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega6490/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega6490/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega6490a/atmega6490a.frt create mode 100644 amforth-6.5/avr8/devices/atmega6490a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega6490a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega6490a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega6490a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega6490a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega6490a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega6490p/atmega6490p.frt create mode 100644 amforth-6.5/avr8/devices/atmega6490p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega6490p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega6490p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega6490p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega6490p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega6490p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega649a/atmega649a.frt create mode 100644 amforth-6.5/avr8/devices/atmega649a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega649a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega649a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega649a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega649a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega649a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega649p/atmega649p.frt create mode 100644 amforth-6.5/avr8/devices/atmega649p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega649p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega649p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega649p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega649p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega649p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega64a/atmega64a.frt create mode 100644 amforth-6.5/avr8/devices/atmega64a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega64a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega64a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega64a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega64a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega64a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega64c1/atmega64c1.frt create mode 100644 amforth-6.5/avr8/devices/atmega64c1/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega64c1/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega64c1/device.py create mode 100644 amforth-6.5/avr8/devices/atmega64c1/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega64c1/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega64c1/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega64hve/atmega64hve.frt create mode 100644 amforth-6.5/avr8/devices/atmega64hve/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega64hve/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega64hve/device.py create mode 100644 amforth-6.5/avr8/devices/atmega64m1/atmega64m1.frt create mode 100644 amforth-6.5/avr8/devices/atmega64m1/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega64m1/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega64m1/device.py create mode 100644 amforth-6.5/avr8/devices/atmega64m1/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega64m1/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega64m1/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega8/atmega8.frt create mode 100644 amforth-6.5/avr8/devices/atmega8/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega8/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega8/device.py create mode 100644 amforth-6.5/avr8/devices/atmega8/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega8/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega8/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega8515/atmega8515.frt create mode 100644 amforth-6.5/avr8/devices/atmega8515/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega8515/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega8515/device.py create mode 100644 amforth-6.5/avr8/devices/atmega8515/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega8515/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega8515/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega8535/atmega8535.frt create mode 100644 amforth-6.5/avr8/devices/atmega8535/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega8535/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega8535/device.py create mode 100644 amforth-6.5/avr8/devices/atmega8535/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega8535/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega8535/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega88/atmega88.frt create mode 100644 amforth-6.5/avr8/devices/atmega88/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega88/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega88/device.py create mode 100644 amforth-6.5/avr8/devices/atmega88/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega88/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega88/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega88a/atmega88a.frt create mode 100644 amforth-6.5/avr8/devices/atmega88a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega88a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega88a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega88a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega88a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega88a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega88p/atmega88p.frt create mode 100644 amforth-6.5/avr8/devices/atmega88p/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega88p/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega88p/device.py create mode 100644 amforth-6.5/avr8/devices/atmega88p/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega88p/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega88p/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega88pa/atmega88pa.frt create mode 100644 amforth-6.5/avr8/devices/atmega88pa/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega88pa/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega88pa/device.py create mode 100644 amforth-6.5/avr8/devices/atmega88pa/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega88pa/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega88pa/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega8a/atmega8a.frt create mode 100644 amforth-6.5/avr8/devices/atmega8a/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega8a/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega8a/device.py create mode 100644 amforth-6.5/avr8/devices/atmega8a/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega8a/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega8a/words/sleep.asm create mode 100644 amforth-6.5/avr8/devices/atmega8hva/atmega8hva.frt create mode 100644 amforth-6.5/avr8/devices/atmega8hva/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega8hva/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega8hva/device.py create mode 100644 amforth-6.5/avr8/devices/atmega8u2/atmega8u2.frt create mode 100644 amforth-6.5/avr8/devices/atmega8u2/device.asm create mode 100644 amforth-6.5/avr8/devices/atmega8u2/device.inc create mode 100644 amforth-6.5/avr8/devices/atmega8u2/device.py create mode 100644 amforth-6.5/avr8/devices/atmega8u2/words/no-jtag.asm create mode 100644 amforth-6.5/avr8/devices/atmega8u2/words/no-wdt.asm create mode 100644 amforth-6.5/avr8/devices/atmega8u2/words/sleep.asm create mode 100644 amforth-6.5/avr8/dict/appl_2k.inc create mode 100644 amforth-6.5/avr8/dict/appl_4k.inc create mode 100644 amforth-6.5/avr8/dict/appl_8k.inc create mode 100644 amforth-6.5/avr8/dict/compiler1.inc create mode 100644 amforth-6.5/avr8/dict/compiler2.inc create mode 100644 amforth-6.5/avr8/dict/core_2k.inc create mode 100644 amforth-6.5/avr8/dict/core_4k.inc create mode 100644 amforth-6.5/avr8/dict/core_8k.inc create mode 100644 amforth-6.5/avr8/dict/interrupt.inc create mode 100644 amforth-6.5/avr8/dict/nrww.inc create mode 100644 amforth-6.5/avr8/dict/rww.inc create mode 100644 amforth-6.5/avr8/drivers/1wire.asm create mode 100644 amforth-6.5/avr8/drivers/generic-isr.asm create mode 100644 amforth-6.5/avr8/drivers/usart-rx-buffer.asm create mode 100644 amforth-6.5/avr8/drivers/usart.asm create mode 100644 amforth-6.5/avr8/drivers/usart_0.asm create mode 100644 amforth-6.5/avr8/drivers/usart_1.asm create mode 100644 amforth-6.5/avr8/drivers/usart_2.asm create mode 100644 amforth-6.5/avr8/drivers/usart_3.asm create mode 100644 amforth-6.5/avr8/drivers/usart_common.asm create mode 100644 amforth-6.5/avr8/lib/2evalue.frt create mode 100644 amforth-6.5/avr8/lib/assembler-test.frt create mode 100644 amforth-6.5/avr8/lib/assembler.frt create mode 100644 amforth-6.5/avr8/lib/bitnames-code.frt create mode 100644 amforth-6.5/avr8/lib/bitnames.frt create mode 100644 amforth-6.5/avr8/lib/calc-baudrate.frt create mode 100644 amforth-6.5/avr8/lib/dot-res.frt create mode 100644 amforth-6.5/avr8/lib/eallot.frt create mode 100644 amforth-6.5/avr8/lib/forth2012/core-ext.frt create mode 100644 amforth-6.5/avr8/lib/forth2012/core-ext/avr-defers.frt create mode 100644 amforth-6.5/avr8/lib/forth2012/core-ext/marker-test.frt create mode 100644 amforth-6.5/avr8/lib/forth2012/core-ext/marker.frt create mode 100644 amforth-6.5/avr8/lib/forth2012/core.frt create mode 100644 amforth-6.5/avr8/lib/forth2012/core/align.frt create mode 100644 amforth-6.5/avr8/lib/forth2012/core/aligned.frt create mode 100644 amforth-6.5/avr8/lib/forth2012/core/avr-values.frt create mode 100644 amforth-6.5/avr8/lib/forth2012/core/c-comma.frt create mode 100644 amforth-6.5/avr8/lib/forth2012/core/eeprom-buffer.frt create mode 100644 amforth-6.5/avr8/lib/forth2012/core/environment-q.frt create mode 100644 amforth-6.5/avr8/lib/forth2012/core/evaluate.frt create mode 100644 amforth-6.5/avr8/lib/forth2012/core/fm-slash-mod.frt create mode 100644 amforth-6.5/avr8/lib/forth2012/core/sm-slash-rem.frt create mode 100644 amforth-6.5/avr8/lib/forth2012/core/star-slash-mod.frt create mode 100644 amforth-6.5/avr8/lib/hardware/25xxx.frt create mode 100644 amforth-6.5/avr8/lib/hardware/flash-block.frt create mode 100644 amforth-6.5/avr8/lib/hardware/i2c-twi-master.frt create mode 100644 amforth-6.5/avr8/lib/hardware/i2c-twi-slave.frt create mode 100644 amforth-6.5/avr8/lib/hardware/int-q.frt create mode 100644 amforth-6.5/avr8/lib/hardware/interrupts.frt create mode 100644 amforth-6.5/avr8/lib/hardware/key2char.frt create mode 100644 amforth-6.5/avr8/lib/hardware/keyboard.frt create mode 100644 amforth-6.5/avr8/lib/hardware/mmc.frt create mode 100644 amforth-6.5/avr8/lib/hardware/mpc485.frt create mode 100644 amforth-6.5/avr8/lib/hardware/spi.frt create mode 100644 amforth-6.5/avr8/lib/hardware/timer0.frt create mode 100644 amforth-6.5/avr8/lib/hardware/timer1.frt create mode 100644 amforth-6.5/avr8/lib/hardware/timer2.frt create mode 100644 amforth-6.5/avr8/lib/imove.frt create mode 100644 amforth-6.5/avr8/lib/portio.frt create mode 100644 amforth-6.5/avr8/lib/ram.frt create mode 100644 amforth-6.5/avr8/lib/recognizer-arch.frt create mode 100644 amforth-6.5/avr8/lib/run-hayes.frt create mode 100644 amforth-6.5/avr8/macros.asm create mode 100644 amforth-6.5/avr8/preamble.inc create mode 100644 amforth-6.5/avr8/tools/99-avr.rules create mode 100644 amforth-6.5/avr8/user.inc create mode 100644 amforth-6.5/avr8/words/1minus.asm create mode 100644 amforth-6.5/avr8/words/1ms.asm create mode 100644 amforth-6.5/avr8/words/1plus.asm create mode 100644 amforth-6.5/avr8/words/2r_fetch.asm create mode 100644 amforth-6.5/avr8/words/2r_from.asm create mode 100644 amforth-6.5/avr8/words/2slash.asm create mode 100644 amforth-6.5/avr8/words/2spirw.asm create mode 100644 amforth-6.5/avr8/words/2star.asm create mode 100644 amforth-6.5/avr8/words/2to_r.asm create mode 100644 amforth-6.5/avr8/words/allot.asm create mode 100644 amforth-6.5/avr8/words/and.asm create mode 100644 amforth-6.5/avr8/words/bm-clear.asm create mode 100644 amforth-6.5/avr8/words/bm-set.asm create mode 100644 amforth-6.5/avr8/words/bm-toggle.asm create mode 100644 amforth-6.5/avr8/words/byteswap.asm create mode 100644 amforth-6.5/avr8/words/cas.asm create mode 100644 amforth-6.5/avr8/words/cellplus.asm create mode 100644 amforth-6.5/avr8/words/cells.asm create mode 100644 amforth-6.5/avr8/words/cfetch.asm create mode 100644 amforth-6.5/avr8/words/cmove.asm create mode 100644 amforth-6.5/avr8/words/cmove_g.asm create mode 100644 amforth-6.5/avr8/words/code.asm create mode 100644 amforth-6.5/avr8/words/cold.asm create mode 100644 amforth-6.5/avr8/words/colon-noname.asm create mode 100644 amforth-6.5/avr8/words/comma.asm create mode 100644 amforth-6.5/avr8/words/compare.asm create mode 100644 amforth-6.5/avr8/words/const-fold-depth.asm create mode 100644 amforth-6.5/avr8/words/cstore.asm create mode 100644 amforth-6.5/avr8/words/d-2slash.asm create mode 100644 amforth-6.5/avr8/words/d-2star.asm create mode 100644 amforth-6.5/avr8/words/d-greaterzero.asm create mode 100644 amforth-6.5/avr8/words/d-invert.asm create mode 100644 amforth-6.5/avr8/words/d-lesszero.asm create mode 100644 amforth-6.5/avr8/words/d-minus.asm create mode 100644 amforth-6.5/avr8/words/d-plus.asm create mode 100644 amforth-6.5/avr8/words/dabs.asm create mode 100644 amforth-6.5/avr8/words/dnegate.asm create mode 100644 amforth-6.5/avr8/words/do-defer.asm create mode 100644 amforth-6.5/avr8/words/do-sliteral.asm create mode 100644 amforth-6.5/avr8/words/do-value.asm create mode 100644 amforth-6.5/avr8/words/dobranch.asm create mode 100644 amforth-6.5/avr8/words/docondbranch.asm create mode 100644 amforth-6.5/avr8/words/doconstant.asm create mode 100644 amforth-6.5/avr8/words/dodo.asm create mode 100644 amforth-6.5/avr8/words/does.asm create mode 100644 amforth-6.5/avr8/words/doliteral.asm create mode 100644 amforth-6.5/avr8/words/doloop.asm create mode 100644 amforth-6.5/avr8/words/doplusloop.asm create mode 100644 amforth-6.5/avr8/words/douser.asm create mode 100644 amforth-6.5/avr8/words/dovariable.asm create mode 100644 amforth-6.5/avr8/words/dp.asm create mode 100644 amforth-6.5/avr8/words/drop.asm create mode 100644 amforth-6.5/avr8/words/dup.asm create mode 100644 amforth-6.5/avr8/words/edefer-fetch.asm create mode 100644 amforth-6.5/avr8/words/edefer-store.asm create mode 100644 amforth-6.5/avr8/words/ehere.asm create mode 100644 amforth-6.5/avr8/words/end-code.asm create mode 100644 amforth-6.5/avr8/words/env-mcuinfo.asm create mode 100644 amforth-6.5/avr8/words/env-slashpad.asm create mode 100644 amforth-6.5/avr8/words/env-wordlists.asm create mode 100644 amforth-6.5/avr8/words/environment.asm create mode 100644 amforth-6.5/avr8/words/equal.asm create mode 100644 amforth-6.5/avr8/words/equalzero.asm create mode 100644 amforth-6.5/avr8/words/execute.asm create mode 100644 amforth-6.5/avr8/words/exit.asm create mode 100644 amforth-6.5/avr8/words/fetch-e.asm create mode 100644 amforth-6.5/avr8/words/fetch-i.asm create mode 100644 amforth-6.5/avr8/words/fetch-u.asm create mode 100644 amforth-6.5/avr8/words/fetch.asm create mode 100644 amforth-6.5/avr8/words/fill.asm create mode 100644 amforth-6.5/avr8/words/forth-recognizer.asm create mode 100644 amforth-6.5/avr8/words/forth-wordlist.asm create mode 100644 amforth-6.5/avr8/words/g-mark.asm create mode 100644 amforth-6.5/avr8/words/g-resolve.asm create mode 100644 amforth-6.5/avr8/words/get-current.asm create mode 100644 amforth-6.5/avr8/words/greater.asm create mode 100644 amforth-6.5/avr8/words/greaterzero.asm create mode 100644 amforth-6.5/avr8/words/header.asm create mode 100644 amforth-6.5/avr8/words/here.asm create mode 100644 amforth-6.5/avr8/words/hld.asm create mode 100644 amforth-6.5/avr8/words/i-cellplus.asm create mode 100644 amforth-6.5/avr8/words/i.asm create mode 100644 amforth-6.5/avr8/words/icompare.asm create mode 100644 amforth-6.5/avr8/words/icount.asm create mode 100644 amforth-6.5/avr8/words/immediate-q.asm create mode 100644 amforth-6.5/avr8/words/immediate.asm create mode 100644 amforth-6.5/avr8/words/init-ram.asm create mode 100644 amforth-6.5/avr8/words/int-fetch.asm create mode 100644 amforth-6.5/avr8/words/int-num.asm create mode 100644 amforth-6.5/avr8/words/int-off.asm create mode 100644 amforth-6.5/avr8/words/int-on.asm create mode 100644 amforth-6.5/avr8/words/int-store.asm create mode 100644 amforth-6.5/avr8/words/int-trap.asm create mode 100644 amforth-6.5/avr8/words/invert.asm create mode 100644 amforth-6.5/avr8/words/irqcnt.asm create mode 100644 amforth-6.5/avr8/words/isr-end.asm create mode 100644 amforth-6.5/avr8/words/isr-exec.asm create mode 100644 amforth-6.5/avr8/words/itype.asm create mode 100644 amforth-6.5/avr8/words/j.asm create mode 100644 amforth-6.5/avr8/words/l_mark.asm create mode 100644 amforth-6.5/avr8/words/l_resolve.asm create mode 100644 amforth-6.5/avr8/words/latest.asm create mode 100644 amforth-6.5/avr8/words/less.asm create mode 100644 amforth-6.5/avr8/words/lesszero.asm create mode 100644 amforth-6.5/avr8/words/log2.asm create mode 100644 amforth-6.5/avr8/words/lp.asm create mode 100644 amforth-6.5/avr8/words/lp0.asm create mode 100644 amforth-6.5/avr8/words/lshift.asm create mode 100644 amforth-6.5/avr8/words/marker.asm create mode 100644 amforth-6.5/avr8/words/minus.asm create mode 100644 amforth-6.5/avr8/words/mplus.asm create mode 100644 amforth-6.5/avr8/words/mstar.asm create mode 100644 amforth-6.5/avr8/words/n-spi.asm create mode 100644 amforth-6.5/avr8/words/n_r_from.asm create mode 100644 amforth-6.5/avr8/words/n_to_r.asm create mode 100644 amforth-6.5/avr8/words/name2flags.asm create mode 100644 amforth-6.5/avr8/words/negate.asm create mode 100644 amforth-6.5/avr8/words/newest.asm create mode 100644 amforth-6.5/avr8/words/nfa2cfa.asm create mode 100644 amforth-6.5/avr8/words/nfa2lfa.asm create mode 100644 amforth-6.5/avr8/words/nip.asm create mode 100644 amforth-6.5/avr8/words/not.asm create mode 100644 amforth-6.5/avr8/words/notequalzero.asm create mode 100644 amforth-6.5/avr8/words/or.asm create mode 100644 amforth-6.5/avr8/words/over.asm create mode 100644 amforth-6.5/avr8/words/pause.asm create mode 100644 amforth-6.5/avr8/words/plus.asm create mode 100644 amforth-6.5/avr8/words/plusstore.asm create mode 100644 amforth-6.5/avr8/words/popcnt.asm create mode 100644 amforth-6.5/avr8/words/qdup.asm create mode 100644 amforth-6.5/avr8/words/r_fetch.asm create mode 100644 amforth-6.5/avr8/words/r_from.asm create mode 100644 amforth-6.5/avr8/words/reg-a.asm create mode 100644 amforth-6.5/avr8/words/reg-b.asm create mode 100644 amforth-6.5/avr8/words/rot.asm create mode 100644 amforth-6.5/avr8/words/rp0.asm create mode 100644 amforth-6.5/avr8/words/rpfetch.asm create mode 100644 amforth-6.5/avr8/words/rpstore.asm create mode 100644 amforth-6.5/avr8/words/rshift.asm create mode 100644 amforth-6.5/avr8/words/scomma.asm create mode 100644 amforth-6.5/avr8/words/set-current.asm create mode 100644 amforth-6.5/avr8/words/slashmod.asm create mode 100644 amforth-6.5/avr8/words/sp0.asm create mode 100644 amforth-6.5/avr8/words/spfetch.asm create mode 100644 amforth-6.5/avr8/words/spirw.asm create mode 100644 amforth-6.5/avr8/words/spstore.asm create mode 100644 amforth-6.5/avr8/words/state.asm create mode 100644 amforth-6.5/avr8/words/store-e.asm create mode 100644 amforth-6.5/avr8/words/store-i.asm create mode 100644 amforth-6.5/avr8/words/store-i_big.asm create mode 100644 amforth-6.5/avr8/words/store-i_nrww.asm create mode 100644 amforth-6.5/avr8/words/store-u.asm create mode 100644 amforth-6.5/avr8/words/store.asm create mode 100644 amforth-6.5/avr8/words/swap.asm create mode 100644 amforth-6.5/avr8/words/to-body.asm create mode 100644 amforth-6.5/avr8/words/to_r.asm create mode 100644 amforth-6.5/avr8/words/true.asm create mode 100644 amforth-6.5/avr8/words/turnkey.asm create mode 100644 amforth-6.5/avr8/words/ubrr.asm create mode 100644 amforth-6.5/avr8/words/uless.asm create mode 100644 amforth-6.5/avr8/words/umslashmod.asm create mode 100644 amforth-6.5/avr8/words/umstar.asm create mode 100644 amforth-6.5/avr8/words/unloop.asm create mode 100644 amforth-6.5/avr8/words/unused.asm create mode 100644 amforth-6.5/avr8/words/up.asm create mode 100644 amforth-6.5/avr8/words/usart-rx-poll.asm create mode 100644 amforth-6.5/avr8/words/usart-tx-poll.asm create mode 100644 amforth-6.5/avr8/words/usart.asm create mode 100644 amforth-6.5/avr8/words/user.asm create mode 100644 amforth-6.5/avr8/words/uslashmod.asm create mode 100644 amforth-6.5/avr8/words/wdr.asm create mode 100644 amforth-6.5/avr8/words/wlscope.asm create mode 100644 amforth-6.5/avr8/words/wordlist.asm create mode 100644 amforth-6.5/avr8/words/xor.asm create mode 100644 amforth-6.5/avr8/words/zero.asm (limited to 'amforth-6.5/avr8') diff --git a/amforth-6.5/avr8/amforth-eeprom.inc b/amforth-6.5/avr8/amforth-eeprom.inc new file mode 100644 index 0000000..d71eeb0 --- /dev/null +++ b/amforth-6.5/avr8/amforth-eeprom.inc @@ -0,0 +1,64 @@ + .dw -1 ; EEPROM Address 0 should not be used +; some configs +CFG_DP: .dw DPSTART ; Dictionary Pointer +EE_HERE: .dw HERESTART ; Memory Allocation +EE_EHERE: .dw EHERESTART ; EEProm Memory Allocation +CFG_WLSCOPE: .dw XT_GET_CURRENT ; default wordlist scope +CFG_FORTHRECOGNIZER: .dw CFG_RECOGNIZERLISTLEN ; Recognizer word set +; LEAVE stack is between data stack and return stack. +CFG_LP0: .dw stackstart+1 +CFG_TURNKEY: .dw XT_APPLTURNKEY ; TURNKEY +CFG_ENVIRONMENT:.dw VE_ENVHEAD ; environmental queries +CFG_CURRENT: .dw CFG_FORTHWORDLIST ; forth-wordlist +CFG_FORTHWORDLIST:.dw VE_HEAD ; pre-defined (compiled in) wordlist +CFG_ORDERLISTLEN: + .dw 1 +CFG_ORDERLIST: ; list of wordlist id, exactly numwordlist entries + .dw CFG_FORTHWORDLIST ; get/set-order + .byte (NUMWORDLISTS-1)*CELLSIZE ; one slot is already used +CFG_RECOGNIZERLISTLEN: + .dw 2 +CFG_RECOGNIZERLIST: + .dw XT_REC_FIND + .dw XT_REC_NUM + .byte (NUMRECOGNIZERS-2)*CELLSIZE ; two slots are already used + +EE_STOREI: + .dw XT_DO_STOREI ; Store a cell into flash + +; MARKER saves everything up to here. Nothing beyond gets saved +EE_MARKER: + .dw EE_MARKER + +; default user area +EE_INITUSER: + .dw 0 ; USER_STATE + .dw 0 ; USER_FOLLOWER + .dw rstackstart ; USER_RP + .dw stackstart ; USER_SP0 + .dw stackstart ; USER_SP + + .dw 0 ; USER_HANDLER + .dw 10 ; USER_BASE + + .dw XT_TX ; USER_EMIT + .dw XT_TXQ ; USER_EMITQ + .dw XT_RX ; USER_KEY + .dw XT_RXQ ; USER_KEYQ + .dw XT_SOURCETIB ; USER_SOURCE + .dw 0 ; USER_G_IN + .dw XT_REFILLTIB ; USER_REFILL + .dw XT_DEFAULT_PROMPTOK + .dw XT_DEFAULT_PROMPTERROR + .dw XT_DEFAULT_PROMPTREADY + +; calculate baud rate error +.equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; smart round +.equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; effective baud rate +.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; error in pro mille + +.if ((BAUD_ERROR>BAUD_MAXERROR) || (BAUD_ERROR<-BAUD_MAXERROR)) + .error "Serial line cannot be set up properly (systematic baud error too high)" +.endif +EE_UBRRVAL: + .dw UBRR_VAL ; BAUDRATE diff --git a/amforth-6.5/avr8/amforth-interpreter.asm b/amforth-6.5/avr8/amforth-interpreter.asm new file mode 100644 index 0000000..1d72745 --- /dev/null +++ b/amforth-6.5/avr8/amforth-interpreter.asm @@ -0,0 +1,33 @@ +; the inner interpreter. + +DO_COLON: + push XH + push XL ; PUSH IP + movw XL, wl + adiw xl, 1 +DO_NEXT: +.if WANT_INTERRUPTS == 1 + cp isrflag, zerol + brne DO_INTERRUPT +.endif + movw zl, XL ; READ IP + readflashcell wl, wh + adiw XL, 1 ; INC IP + +DO_EXECUTE: + movw zl, wl + readflashcell temp0,temp1 + movw zl, temp0 + ijmp + +.if WANT_INTERRUPTS == 1 +DO_INTERRUPT: + ; here we deal with interrupts the forth way + savetos + mov tosl, isrflag + clr tosh + clr isrflag + ldi wl, LOW(XT_ISREXEC) + ldi wh, HIGH(XT_ISREXEC) + rjmp DO_EXECUTE +.endif \ No newline at end of file diff --git a/amforth-6.5/avr8/amforth-low.asm b/amforth-6.5/avr8/amforth-low.asm new file mode 100644 index 0000000..0bd5ece --- /dev/null +++ b/amforth-6.5/avr8/amforth-low.asm @@ -0,0 +1,31 @@ +;;;; avr forth +;;;; +;;;; GPL V2 (only) + +.set pc_ = pc + +.org $0000 + jmp_ PFA_COLD +.org pc_ + +.include "amforth-interpreter.asm" +.include "drivers/generic-isr.asm" +.set AMFORTH_NRWW_SIZE=(FLASHEND-AMFORTH_RO_SEG)*2 +; lower part of the dictionary +.include "dict/rww.inc" +.include "dict_appl.inc" +.include "dict/nrww.inc" ; well, not really nrww, but simplifies things alot +.include "dict_appl_core.inc" + + +.set DPSTART = pc +.set flashlast = pc + +.dseg +HERESTART: +.eseg +.include "amforth-eeprom.inc" +; 1st free address in EEPROM. +EHERESTART: + +.cseg diff --git a/amforth-6.5/avr8/amforth.asm b/amforth-6.5/avr8/amforth.asm new file mode 100644 index 0000000..3e9a9f2 --- /dev/null +++ b/amforth-6.5/avr8/amforth.asm @@ -0,0 +1,39 @@ +;;;; avr forth +;;;; +;;;; GPL V2 (only) + +.set AMFORTH_NRWW_SIZE=(FLASHEND-AMFORTH_RO_SEG)*2 + +.set corepc = pc +.org $0000 + jmp_ PFA_COLD + +.org corepc +.include "drivers/generic-isr.asm" +; lower part of the dictionary +.include "dict/rww.inc" +.include "dict_appl.inc" + +.set DPSTART = pc +.if(pc>AMFORTH_RO_SEG) +.error "RWW Segment Overflow, please edit your dict_appl.inc" +.endif + +.org AMFORTH_RO_SEG +.include "amforth-interpreter.asm" +.include "dict/nrww.inc" +.include "dict_appl_core.inc" + +.set flashlast = pc +.if (pc>FLASHEND) + .error "*** Flash size exceeded, please edit your dict_appl_core file to use less space! Aborting." +.endif + +.dseg +; define a label for the 1st free ram address +HERESTART: +.eseg +.include "amforth-eeprom.inc" +; 1st free address in EEPROM. +EHERESTART: +.cseg diff --git a/amforth-6.5/avr8/devices/at90can128/at90can128.frt b/amforth-6.5/avr8/devices/at90can128/at90can128.frt new file mode 100644 index 0000000..28cb0af --- /dev/null +++ b/amforth-6.5/avr8/devices/at90can128/at90can128.frt @@ -0,0 +1,465 @@ +\ Partname: AT90CAN128 +\ generated automatically + +\ PORTA +&34 constant PORTA \ Port A Data Register +&33 constant DDRA \ Port A Data Direction Register +&32 constant PINA \ Port A Input Pins +\ PORTB +&37 constant PORTB \ Port B Data Register +&36 constant DDRB \ Port B Data Direction Register +&35 constant PINB \ Port B Input Pins +\ PORTC +&40 constant PORTC \ Port C Data Register +&39 constant DDRC \ Port C Data Direction Register +&38 constant PINC \ Port C Input Pins +\ PORTD +&43 constant PORTD \ Port D Data Register +&42 constant DDRD \ Port D Data Direction Register +&41 constant PIND \ Port D Input Pins +\ PORTE +&46 constant PORTE \ Data Register, Port E +&45 constant DDRE \ Data Direction Register, Port E +&44 constant PINE \ Input Pins, Port E +\ PORTF +&49 constant PORTF \ Data Register, Port F +&48 constant DDRF \ Data Direction Register, Port F +&47 constant PINF \ Input Pins, Port F +\ JTAG +&81 constant OCDR \ On-Chip Debug Related Register in I/O Memory +&85 constant MCUCR \ MCU Control Register + $80 constant MCUCR_JTD \ JTAG Interface Disable +&84 constant MCUSR \ MCU Status Register + $10 constant MCUSR_JTRF \ JTAG Reset Flag +\ SPI +&76 constant SPCR \ SPI Control Register + $80 constant SPCR_SPIE \ SPI Interrupt Enable + $40 constant SPCR_SPE \ SPI Enable + $20 constant SPCR_DORD \ Data Order + $10 constant SPCR_MSTR \ Master/Slave Select + $08 constant SPCR_CPOL \ Clock polarity + $04 constant SPCR_CPHA \ Clock Phase + $03 constant SPCR_SPR \ SPI Clock Rate Selects +&77 constant SPSR \ SPI Status Register + $80 constant SPSR_SPIF \ SPI Interrupt Flag + $40 constant SPSR_WCOL \ Write Collision Flag + $01 constant SPSR_SPI2X \ Double SPI Speed Bit +&78 constant SPDR \ SPI Data Register +\ TWI +&184 constant TWBR \ TWI Bit Rate register +&188 constant TWCR \ TWI Control Register + $80 constant TWCR_TWINT \ TWI Interrupt Flag + $40 constant TWCR_TWEA \ TWI Enable Acknowledge Bit + $20 constant TWCR_TWSTA \ TWI Start Condition Bit + $10 constant TWCR_TWSTO \ TWI Stop Condition Bit + $08 constant TWCR_TWWC \ TWI Write Collition Flag + $04 constant TWCR_TWEN \ TWI Enable Bit + $01 constant TWCR_TWIE \ TWI Interrupt Enable +&185 constant TWSR \ TWI Status Register + $F8 constant TWSR_TWS \ TWI Status + $03 constant TWSR_TWPS \ TWI Prescaler +&187 constant TWDR \ TWI Data register +&186 constant TWAR \ TWI (Slave) Address register + $FE constant TWAR_TWA \ TWI (Slave) Address register Bits + $01 constant TWAR_TWGCE \ TWI General Call Recognition Enable Bit +\ USART0 +&198 constant UDR0 \ USART I/O Data Register +&192 constant UCSR0A \ USART Control and Status Register A + $80 constant UCSR0A_RXC0 \ USART Receive Complete + $40 constant UCSR0A_TXC0 \ USART Transmitt Complete + $20 constant UCSR0A_UDRE0 \ USART Data Register Empty + $10 constant UCSR0A_FE0 \ Framing Error + $08 constant UCSR0A_DOR0 \ Data overRun + $04 constant UCSR0A_UPE0 \ Parity Error + $02 constant UCSR0A_U2X0 \ Double the USART transmission speed + $01 constant UCSR0A_MPCM0 \ Multi-processor Communication Mode +&193 constant UCSR0B \ USART Control and Status Register B + $80 constant UCSR0B_RXCIE0 \ RX Complete Interrupt Enable + $40 constant UCSR0B_TXCIE0 \ TX Complete Interrupt Enable + $20 constant UCSR0B_UDRIE0 \ USART Data register Empty Interrupt Enable + $10 constant UCSR0B_RXEN0 \ Receiver Enable + $08 constant UCSR0B_TXEN0 \ Transmitter Enable + $04 constant UCSR0B_UCSZ02 \ Character Size + $02 constant UCSR0B_RXB80 \ Receive Data Bit 8 + $01 constant UCSR0B_TXB80 \ Transmit Data Bit 8 +&194 constant UCSR0C \ USART Control and Status Register C + $40 constant UCSR0C_UMSEL0 \ USART Mode Select + $30 constant UCSR0C_UPM0 \ Parity Mode Bits + $08 constant UCSR0C_USBS0 \ Stop Bit Select + $06 constant UCSR0C_UCSZ0 \ Character Size + $01 constant UCSR0C_UCPOL0 \ Clock Polarity +&196 constant UBRR0 \ USART Baud Rate Register t Bytes +\ USART1 +&206 constant UDR1 \ USART I/O Data Register +&200 constant UCSR1A \ USART Control and Status Register A + $80 constant UCSR1A_RXC1 \ USART Receive Complete + $40 constant UCSR1A_TXC1 \ USART Transmitt Complete + $20 constant UCSR1A_UDRE1 \ USART Data Register Empty + $10 constant UCSR1A_FE1 \ Framing Error + $08 constant UCSR1A_DOR1 \ Data overRun + $04 constant UCSR1A_UPE1 \ Parity Error + $02 constant UCSR1A_U2X1 \ Double the USART transmission speed + $01 constant UCSR1A_MPCM1 \ Multi-processor Communication Mode +&201 constant UCSR1B \ USART Control and Status Register B + $80 constant UCSR1B_RXCIE1 \ RX Complete Interrupt Enable + $40 constant UCSR1B_TXCIE1 \ TX Complete Interrupt Enable + $20 constant UCSR1B_UDRIE1 \ USART Data register Empty Interrupt Enable + $10 constant UCSR1B_RXEN1 \ Receiver Enable + $08 constant UCSR1B_TXEN1 \ Transmitter Enable + $04 constant UCSR1B_UCSZ12 \ Character Size + $02 constant UCSR1B_RXB81 \ Receive Data Bit 8 + $01 constant UCSR1B_TXB81 \ Transmit Data Bit 8 +&202 constant UCSR1C \ USART Control and Status Register C + $40 constant UCSR1C_UMSEL1 \ USART Mode Select + $30 constant UCSR1C_UPM1 \ Parity Mode Bits + $08 constant UCSR1C_USBS1 \ Stop Bit Select + $06 constant UCSR1C_UCSZ1 \ Character Size + $01 constant UCSR1C_UCPOL1 \ Clock Polarity +&204 constant UBRR1 \ USART Baud Rate Register t Bytes +\ CPU +&95 constant SREG \ Status Register + $80 constant SREG_I \ Global Interrupt Enable + $40 constant SREG_T \ Bit Copy Storage + $20 constant SREG_H \ Half Carry Flag + $10 constant SREG_S \ Sign Bit + $08 constant SREG_V \ Two's Complement Overflow Flag + $04 constant SREG_N \ Negative Flag + $02 constant SREG_Z \ Zero Flag + $01 constant SREG_C \ Carry Flag +&93 constant SP \ Stack Pointer +&116 constant XMCRA \ External Memory Control Register A + $80 constant XMCRA_SRE \ External SRAM Enable + $70 constant XMCRA_SRL \ Wait state page limit + $0C constant XMCRA_SRW1 \ Wait state select bit upper page + $03 constant XMCRA_SRW0 \ Wait state select bit lower page +&117 constant XMCRB \ External Memory Control Register B + $80 constant XMCRB_XMBK \ External Memory Bus Keeper Enable + $07 constant XMCRB_XMM \ External Memory High Mask +&102 constant OSCCAL \ Oscillator Calibration Value +&97 constant CLKPR \ Clock Prescale Register + $80 constant CLKPR_CLKPCE \ + $0F constant CLKPR_CLKPS \ +&83 constant SMCR \ Sleep Mode Control Register + $0E constant SMCR_SM \ Sleep Mode Select bits + $01 constant SMCR_SE \ Sleep Enable +&91 constant RAMPZ \ RAM Page Z Select Register + $01 constant RAMPZ_RAMPZ0 \ RAM Page Z Select Register Bit 0 +&75 constant GPIOR2 \ General Purpose IO Register 2 + $FF constant GPIOR2_GPIOR \ General Purpose IO Register 2 bis +&74 constant GPIOR1 \ General Purpose IO Register 1 + $FF constant GPIOR1_GPIOR \ General Purpose IO Register 1 bis +&62 constant GPIOR0 \ General Purpose IO Register 0 + $80 constant GPIOR0_GPIOR07 \ General Purpose IO Register 0 bit 7 + $40 constant GPIOR0_GPIOR06 \ General Purpose IO Register 0 bit 6 + $20 constant GPIOR0_GPIOR05 \ General Purpose IO Register 0 bit 5 + $10 constant GPIOR0_GPIOR04 \ General Purpose IO Register 0 bit 4 + $08 constant GPIOR0_GPIOR03 \ General Purpose IO Register 0 bit 3 + $04 constant GPIOR0_GPIOR02 \ General Purpose IO Register 0 bit 2 + $02 constant GPIOR0_GPIOR01 \ General Purpose IO Register 0 bit 1 + $01 constant GPIOR0_GPIOR00 \ General Purpose IO Register 0 bit 0 +\ BOOT_LOAD +&87 constant SPMCSR \ Store Program Memory Control Register + $80 constant SPMCSR_SPMIE \ SPM Interrupt Enable + $40 constant SPMCSR_RWWSB \ Read While Write Section Busy + $10 constant SPMCSR_RWWSRE \ Read While Write section read enable + $08 constant SPMCSR_BLBSET \ Boot Lock Bit Set + $04 constant SPMCSR_PGWRT \ Page Write + $02 constant SPMCSR_PGERS \ Page Erase + $01 constant SPMCSR_SPMEN \ Store Program Memory Enable +\ EXTERNAL_INTERRUPT +&105 constant EICRA \ External Interrupt Control Register A + $C0 constant EICRA_ISC3 \ External Interrupt Sense Control Bit + $30 constant EICRA_ISC2 \ External Interrupt Sense Control Bit + $0C constant EICRA_ISC1 \ External Interrupt Sense Control Bit + $03 constant EICRA_ISC0 \ External Interrupt Sense Control Bit +&106 constant EICRB \ External Interrupt Control Register B + $C0 constant EICRB_ISC7 \ External Interrupt 7-4 Sense Control Bit + $30 constant EICRB_ISC6 \ External Interrupt 7-4 Sense Control Bit + $0C constant EICRB_ISC5 \ External Interrupt 7-4 Sense Control Bit + $03 constant EICRB_ISC4 \ External Interrupt 7-4 Sense Control Bit +&61 constant EIMSK \ External Interrupt Mask Register + $FF constant EIMSK_INT \ External Interrupt Request 7 Enable +&60 constant EIFR \ External Interrupt Flag Register + $FF constant EIFR_INTF \ External Interrupt Flags +\ EEPROM +&65 constant EEAR \ EEPROM Read/Write Access Bytes +&64 constant EEDR \ EEPROM Data Register +&63 constant EECR \ EEPROM Control Register + $08 constant EECR_EERIE \ EEPROM Ready Interrupt Enable + $04 constant EECR_EEMWE \ EEPROM Master Write Enable + $02 constant EECR_EEWE \ EEPROM Write Enable + $01 constant EECR_EERE \ EEPROM Read Enable +\ PORTG +&52 constant PORTG \ Data Register, Port G +&51 constant DDRG \ Data Direction Register, Port G +&50 constant PING \ Input Pins, Port G +\ TIMER_COUNTER_0 +&68 constant TCCR0A \ Timer/Counter0 Control Register + $80 constant TCCR0A_FOC0A \ Force Output Compare + $40 constant TCCR0A_WGM00 \ Waveform Generation Mode 0 + $30 constant TCCR0A_COM0A \ Compare Match Output Modes + $08 constant TCCR0A_WGM01 \ Waveform Generation Mode 1 + $07 constant TCCR0A_CS0 \ Clock Selects +&70 constant TCNT0 \ Timer/Counter0 +&71 constant OCR0A \ Timer/Counter0 Output Compare Register +&110 constant TIMSK0 \ Timer/Counter0 Interrupt Mask Register + $02 constant TIMSK0_OCIE0A \ Timer/Counter0 Output Compare Match Interrupt Enable + $01 constant TIMSK0_TOIE0 \ Timer/Counter0 Overflow Interrupt Enable +&53 constant TIFR0 \ Timer/Counter0 Interrupt Flag register + $02 constant TIFR0_OCF0A \ Timer/Counter0 Output Compare Flag 0 + $01 constant TIFR0_TOV0 \ Timer/Counter0 Overflow Flag +&67 constant GTCCR \ General Timer/Control Register + $80 constant GTCCR_TSM \ Timer/Counter Synchronization Mode + $01 constant GTCCR_PSR310 \ Prescaler Reset Timer/Counter1 and Timer/Counter0 +\ TIMER_COUNTER_1 +&128 constant TCCR1A \ Timer/Counter1 Control Register A + $C0 constant TCCR1A_COM1A \ Compare Output Mode 1A, bits + $30 constant TCCR1A_COM1B \ Compare Output Mode 1B, bits + $0C constant TCCR1A_COM1C \ Compare Output Mode 1C, bits + $03 constant TCCR1A_WGM1 \ Waveform Generation Mode +&129 constant TCCR1B \ Timer/Counter1 Control Register B + $80 constant TCCR1B_ICNC1 \ Input Capture 1 Noise Canceler + $40 constant TCCR1B_ICES1 \ Input Capture 1 Edge Select + $18 constant TCCR1B_WGM1 \ Waveform Generation Mode + $07 constant TCCR1B_CS1 \ Prescaler source of Timer/Counter 1 +&130 constant TCCR1C \ Timer/Counter 1 Control Register C + $80 constant TCCR1C_FOC1A \ Force Output Compare 1A + $40 constant TCCR1C_FOC1B \ Force Output Compare 1B + $20 constant TCCR1C_FOC1C \ Force Output Compare 1C +&132 constant TCNT1 \ Timer/Counter1 Bytes +&136 constant OCR1A \ Timer/Counter1 Output Compare Register Bytes +&138 constant OCR1B \ Timer/Counter1 Output Compare Register Bytes +&140 constant OCR1C \ Timer/Counter1 Output Compare Register Bytes +&134 constant ICR1 \ Timer/Counter1 Input Capture Register Bytes +&111 constant TIMSK1 \ Timer/Counter Interrupt Mask Register + $20 constant TIMSK1_ICIE1 \ Timer/Counter1 Input Capture Interrupt Enable + $08 constant TIMSK1_OCIE1C \ Timer/Counter1 Output CompareC Match Interrupt Enable + $04 constant TIMSK1_OCIE1B \ Timer/Counter1 Output CompareB Match Interrupt Enable + $02 constant TIMSK1_OCIE1A \ Timer/Counter1 Output CompareA Match Interrupt Enable + $01 constant TIMSK1_TOIE1 \ Timer/Counter1 Overflow Interrupt Enable +&54 constant TIFR1 \ Timer/Counter Interrupt Flag register + $20 constant TIFR1_ICF1 \ Input Capture Flag 1 + $08 constant TIFR1_OCF1C \ Output Compare Flag 1C + $04 constant TIFR1_OCF1B \ Output Compare Flag 1B + $02 constant TIFR1_OCF1A \ Output Compare Flag 1A + $01 constant TIFR1_TOV1 \ Timer/Counter1 Overflow Flag +\ TIMER_COUNTER_3 +&144 constant TCCR3A \ Timer/Counter3 Control Register A + $C0 constant TCCR3A_COM3A \ Compare Output Mode 3A, bits + $30 constant TCCR3A_COM3B \ Compare Output Mode 3B, bits + $0C constant TCCR3A_COM3C \ Compare Output Mode 3C, bits + $03 constant TCCR3A_WGM3 \ Waveform Generation Mode +&145 constant TCCR3B \ Timer/Counter3 Control Register B + $80 constant TCCR3B_ICNC3 \ Input Capture 3 Noise Canceler + $40 constant TCCR3B_ICES3 \ Input Capture 3 Edge Select + $18 constant TCCR3B_WGM3 \ Waveform Generation Mode + $07 constant TCCR3B_CS3 \ Prescaler source of Timer/Counter 3 +&146 constant TCCR3C \ Timer/Counter 3 Control Register C + $80 constant TCCR3C_FOC3A \ Force Output Compare 3A + $40 constant TCCR3C_FOC3B \ Force Output Compare 3B + $20 constant TCCR3C_FOC3C \ Force Output Compare 3C +&148 constant TCNT3 \ Timer/Counter3 Bytes +&152 constant OCR3A \ Timer/Counter3 Output Compare Register Bytes +&154 constant OCR3B \ Timer/Counter3 Output Compare Register Bytes +&156 constant OCR3C \ Timer/Counter3 Output Compare Register Bytes +&150 constant ICR3 \ Timer/Counter3 Input Capture Register Bytes +&113 constant TIMSK3 \ Timer/Counter Interrupt Mask Register + $20 constant TIMSK3_ICIE3 \ Timer/Counter3 Input Capture Interrupt Enable + $08 constant TIMSK3_OCIE3C \ Timer/Counter3 Output CompareC Match Interrupt Enable + $04 constant TIMSK3_OCIE3B \ Timer/Counter3 Output CompareB Match Interrupt Enable + $02 constant TIMSK3_OCIE3A \ Timer/Counter3 Output CompareA Match Interrupt Enable + $01 constant TIMSK3_TOIE3 \ Timer/Counter3 Overflow Interrupt Enable +&56 constant TIFR3 \ Timer/Counter Interrupt Flag register + $20 constant TIFR3_ICF3 \ Input Capture Flag 3 + $08 constant TIFR3_OCF3C \ Output Compare Flag 3C + $04 constant TIFR3_OCF3B \ Output Compare Flag 3B + $02 constant TIFR3_OCF3A \ Output Compare Flag 3A + $01 constant TIFR3_TOV3 \ Timer/Counter3 Overflow Flag +\ TIMER_COUNTER_2 +&176 constant TCCR2 \ Timer/Counter2 Control Register + $80 constant TCCR2_FOC2A \ Force Output Compare + $40 constant TCCR2_WGM20 \ Waveform Genration Mode + $30 constant TCCR2_COM2A \ Compare Output Mode bits + $08 constant TCCR2_WGM21 \ Waveform Generation Mode + $07 constant TCCR2_CS2 \ Clock Select bits +&178 constant TCNT2 \ Timer/Counter2 +&179 constant OCR2A \ Timer/Counter2 Output Compare Register +&112 constant TIMSK2 \ Timer/Counter Interrupt Mask register + $02 constant TIMSK2_OCIE2A \ Timer/Counter2 Output Compare Match Interrupt Enable + $01 constant TIMSK2_TOIE2 \ Timer/Counter2 Overflow Interrupt Enable +&55 constant TIFR2 \ Timer/Counter Interrupt Flag Register + $02 constant TIFR2_OCF2A \ Output Compare Flag 2 + $01 constant TIFR2_TOV2 \ Timer/Counter2 Overflow Flag +&182 constant ASSR \ Asynchronous Status Register + $10 constant ASSR_EXCLK \ Enable External Clock Interrupt + $08 constant ASSR_AS2 \ AS2: Asynchronous Timer/Counter2 + $04 constant ASSR_TCN2UB \ TCN2UB: Timer/Counter2 Update Busy + $02 constant ASSR_OCR2UB \ Output Compare Register2 Update Busy + $01 constant ASSR_TCR2UB \ TCR2UB: Timer/Counter Control Register2 Update Busy +\ WATCHDOG +&96 constant WDTCR \ Watchdog Timer Control Register + $10 constant WDTCR_WDCE \ Watchdog Change Enable + $08 constant WDTCR_WDE \ Watch Dog Enable + $07 constant WDTCR_WDP \ Watch Dog Timer Prescaler bits +\ AD_CONVERTER +&124 constant ADMUX \ The ADC multiplexer Selection Register + $C0 constant ADMUX_REFS \ Reference Selection Bits + $20 constant ADMUX_ADLAR \ Left Adjust Result + $1F constant ADMUX_MUX \ Analog Channel and Gain Selection Bits +&122 constant ADCSRA \ The ADC Control and Status register + $80 constant ADCSRA_ADEN \ ADC Enable + $40 constant ADCSRA_ADSC \ ADC Start Conversion + $20 constant ADCSRA_ADATE \ ADC Auto Trigger Enable + $10 constant ADCSRA_ADIF \ ADC Interrupt Flag + $08 constant ADCSRA_ADIE \ ADC Interrupt Enable + $07 constant ADCSRA_ADPS \ ADC Prescaler Select Bits +&120 constant ADC \ ADC Data Register Bytes +&123 constant ADCSRB \ ADC Control and Status Register B + $80 constant ADCSRB_ADHSM \ ADC High Speed Mode + $07 constant ADCSRB_ADTS \ ADC Auto Trigger Sources +&126 constant DIDR0 \ Digital Input Disable Register 1 + $80 constant DIDR0_ADC7D \ ADC7 Digital input Disable + $40 constant DIDR0_ADC6D \ ADC6 Digital input Disable + $20 constant DIDR0_ADC5D \ ADC5 Digital input Disable + $10 constant DIDR0_ADC4D \ ADC4 Digital input Disable + $08 constant DIDR0_ADC3D \ ADC3 Digital input Disable + $04 constant DIDR0_ADC2D \ ADC2 Digital input Disable + $02 constant DIDR0_ADC1D \ ADC1 Digital input Disable + $01 constant DIDR0_ADC0D \ ADC0 Digital input Disable +\ ANALOG_COMPARATOR +&80 constant ACSR \ Analog Comparator Control And Status Register + $80 constant ACSR_ACD \ Analog Comparator Disable + $40 constant ACSR_ACBG \ Analog Comparator Bandgap Select + $20 constant ACSR_ACO \ Analog Compare Output + $10 constant ACSR_ACI \ Analog Comparator Interrupt Flag + $08 constant ACSR_ACIE \ Analog Comparator Interrupt Enable + $04 constant ACSR_ACIC \ Analog Comparator Input Capture Enable + $03 constant ACSR_ACIS \ Analog Comparator Interrupt Mode Select bits +&127 constant DIDR1 \ + $02 constant DIDR1_AIN1D \ AIN1 Digital Input Disable + $01 constant DIDR1_AIN0D \ AIN0 Digital Input Disable +\ CAN +&216 constant CANGCON \ CAN General Control Register + $80 constant CANGCON_ABRQ \ Abort Request + $40 constant CANGCON_OVRQ \ Overload Frame Request + $20 constant CANGCON_TTC \ Time Trigger Communication + $10 constant CANGCON_SYNTTC \ Synchronization of TTC + $08 constant CANGCON_LISTEN \ Listening Mode + $04 constant CANGCON_TEST \ Test Mode + $02 constant CANGCON_ENASTB \ Enable / Standby + $01 constant CANGCON_SWRES \ Software Reset Request +&217 constant CANGSTA \ CAN General Status Register + $40 constant CANGSTA_OVRG \ Overload Frame Flag + $10 constant CANGSTA_TXBSY \ Transmitter Busy + $08 constant CANGSTA_RXBSY \ Receiver Busy + $04 constant CANGSTA_ENFG \ Enable Flag + $02 constant CANGSTA_BOFF \ Bus Off Mode + $01 constant CANGSTA_ERRP \ Error Passive Mode +&218 constant CANGIT \ CAN General Interrupt Register + $80 constant CANGIT_CANIT \ General Interrupt Flag + $40 constant CANGIT_BOFFIT \ Bus Off Interrupt Flag + $20 constant CANGIT_OVRTIM \ Overrun CAN Timer + $10 constant CANGIT_BXOK \ Burst Receive Interrupt + $08 constant CANGIT_SERG \ Stuff Error General + $04 constant CANGIT_CERG \ CRC Error General + $02 constant CANGIT_FERG \ Form Error General + $01 constant CANGIT_AERG \ Ackknowledgement Error General +&219 constant CANGIE \ CAN General Interrupt Enable Register + $80 constant CANGIE_ENIT \ Enable all Interrupts + $40 constant CANGIE_ENBOFF \ Enable Bus Off INterrupt + $20 constant CANGIE_ENRX \ Enable Receive Interrupt + $10 constant CANGIE_ENTX \ Enable Transmitt Interrupt + $08 constant CANGIE_ENERR \ Enable MOb Error Interrupt + $04 constant CANGIE_ENBX \ Enable Burst Receive Interrupt + $02 constant CANGIE_ENERG \ Enable General Error Interrupt + $01 constant CANGIE_ENOVRT \ Enable CAN Timer Overrun Interrupt +&220 constant CANEN2 \ Enable MOb Register +&221 constant CANEN1 \ Enable MOb Register +&222 constant CANIE2 \ Enable Interrupt MOb Register +&223 constant CANIE1 \ Enable Interrupt MOb Register +&224 constant CANSIT2 \ CAN Status Interrupt MOb Register +&225 constant CANSIT1 \ CAN Status Interrupt MOb Register +&226 constant CANBT1 \ Bit Timing Register 1 + $7E constant CANBT1_BRP \ Baud Rate Prescaler bits +&227 constant CANBT2 \ Bit Timing Register 2 + $60 constant CANBT2_SJW \ Re-Sync Jump Width + $0E constant CANBT2_PRS \ Propagation Time Segment +&228 constant CANBT3 \ Bit Timing Register 3 + $70 constant CANBT3_PHS2 \ Phase Segments + $0E constant CANBT3_PHS1 \ Phase Segment 1 + $01 constant CANBT3_SMP \ Sample Type +&229 constant CANTCON \ Timer Control Register +&230 constant CANTIML \ Timer Register Low +&231 constant CANTIMH \ Timer Register High +&232 constant CANTTCL \ TTC Timer Register Low +&233 constant CANTTCH \ TTC Timer Register High +&234 constant CANTEC \ Transmit Error Counter Register +&235 constant CANREC \ Receive Error Counter Register +&236 constant CANHPMOB \ Highest Priority MOb Register +&237 constant CANPAGE \ Page MOb Register + $F0 constant CANPAGE_MOBNB \ MOb Number Bits + $08 constant CANPAGE_AINC \ MOb Data Buffer Auto Increment + $07 constant CANPAGE_INDX \ Data Buffer Index Bits +&238 constant CANSTMOB \ MOb Status Register + $80 constant CANSTMOB_DLCW \ Data Length Code Warning + $40 constant CANSTMOB_TXOK \ Transmit OK + $20 constant CANSTMOB_RXOK \ Receive OK + $10 constant CANSTMOB_BERR \ Bit Error + $08 constant CANSTMOB_SERR \ Stuff Error + $04 constant CANSTMOB_CERR \ CRC Error + $02 constant CANSTMOB_FERR \ Form Error + $01 constant CANSTMOB_AERR \ Ackknowledgement Error +&239 constant CANCDMOB \ MOb Control and DLC Register + $C0 constant CANCDMOB_CONMOB \ MOb Config Bits + $20 constant CANCDMOB_RPLV \ Reply Valid + $10 constant CANCDMOB_IDE \ Identifier Extension + $0F constant CANCDMOB_DLC \ Data Length Code Bits +&240 constant CANIDT4 \ Identifier Tag Register 4 +&241 constant CANIDT3 \ Identifier Tag Register 3 +&242 constant CANIDT2 \ Identifier Tag Register 2 +&243 constant CANIDT1 \ Identifier Tag Register 1 +&244 constant CANIDM4 \ Identifier Mask Register 4 +&245 constant CANIDM3 \ Identifier Mask Register 3 +&246 constant CANIDM2 \ Identifier Mask Register 2 +&247 constant CANIDM1 \ Identifier Mask Register 1 +&248 constant CANSTML \ Time Stamp Register Low +&249 constant CANSTMH \ Time Stamp Register High +&250 constant CANMSG \ Message Data Register + +\ Interrupts +&2 constant INT0Addr \ External Interrupt Request 0 +&4 constant INT1Addr \ External Interrupt Request 1 +&6 constant INT2Addr \ External Interrupt Request 2 +&8 constant INT3Addr \ External Interrupt Request 3 +&10 constant INT4Addr \ External Interrupt Request 4 +&12 constant INT5Addr \ External Interrupt Request 5 +&14 constant INT6Addr \ External Interrupt Request 6 +&16 constant INT7Addr \ External Interrupt Request 7 +&18 constant TIMER2_COMPAddr \ Timer/Counter2 Compare Match +&20 constant TIMER2_OVFAddr \ Timer/Counter2 Overflow +&22 constant TIMER1_CAPTAddr \ Timer/Counter1 Capture Event +&24 constant TIMER1_COMPAAddr \ Timer/Counter1 Compare Match A +&26 constant TIMER1_COMPBAddr \ Timer/Counter Compare Match B +&28 constant TIMER1_COMPCAddr \ Timer/Counter1 Compare Match C +&30 constant TIMER1_OVFAddr \ Timer/Counter1 Overflow +&32 constant TIMER0_COMPAddr \ Timer/Counter0 Compare Match +&34 constant TIMER0_OVFAddr \ Timer/Counter0 Overflow +&36 constant CANITAddr \ CAN Transfer Complete or Error +&38 constant OVRITAddr \ CAN Timer Overrun +&40 constant SPI__STCAddr \ SPI Serial Transfer Complete +&42 constant USART0__RXAddr \ USART0, Rx Complete +&44 constant USART0__UDREAddr \ USART0 Data Register Empty +&46 constant USART0__TXAddr \ USART0, Tx Complete +&48 constant ANALOG_COMPAddr \ Analog Comparator +&50 constant ADCAddr \ ADC Conversion Complete +&52 constant EE_READYAddr \ EEPROM Ready +&54 constant TIMER3_CAPTAddr \ Timer/Counter3 Capture Event +&56 constant TIMER3_COMPAAddr \ Timer/Counter3 Compare Match A +&58 constant TIMER3_COMPBAddr \ Timer/Counter3 Compare Match B +&60 constant TIMER3_COMPCAddr \ Timer/Counter3 Compare Match C +&62 constant TIMER3_OVFAddr \ Timer/Counter3 Overflow +&64 constant USART1__RXAddr \ USART1, Rx Complete +&66 constant USART1__UDREAddr \ USART1, Data Register Empty +&68 constant USART1__TXAddr \ USART1, Tx Complete +&70 constant TWIAddr \ 2-wire Serial Interface +&72 constant SPM_READYAddr \ Store Program Memory Read diff --git a/amforth-6.5/avr8/devices/at90can128/device.asm b/amforth-6.5/avr8/devices/at90can128/device.asm new file mode 100644 index 0000000..e669742 --- /dev/null +++ b/amforth-6.5/avr8/devices/at90can128/device.asm @@ -0,0 +1,145 @@ +; Partname: AT90CAN128 +; generated automatically, do not edit + +.nolist + .include "can128def.inc" +.list + +.equ ramstart = 256 +.equ CELLSIZE = 2 +.macro readflashcell + clr temp7 + lsl zl + rol zh + rol temp7 + out_ RAMPZ, temp7 + elpm @0, Z+ + elpm @1, Z+ +.endmacro +.macro writeflashcell + clr temp7 + lsl zl + rol zh + rol temp7 + out_ RAMPZ, temp7 +.endmacro +.set WANT_PORTA = 0 +.set WANT_PORTB = 0 +.set WANT_PORTC = 0 +.set WANT_PORTD = 0 +.set WANT_PORTE = 0 +.set WANT_PORTF = 0 +.set WANT_JTAG = 0 +.set WANT_SPI = 0 +.set WANT_TWI = 0 +.set WANT_USART0 = 0 +.set WANT_USART1 = 0 +.set WANT_CPU = 0 +.set WANT_BOOT_LOAD = 0 +.set WANT_EXTERNAL_INTERRUPT = 0 +.set WANT_EEPROM = 0 +.set WANT_PORTG = 0 +.set WANT_TIMER_COUNTER_0 = 0 +.set WANT_TIMER_COUNTER_1 = 0 +.set WANT_TIMER_COUNTER_3 = 0 +.set WANT_TIMER_COUNTER_2 = 0 +.set WANT_WATCHDOG = 0 +.set WANT_AD_CONVERTER = 0 +.set WANT_ANALOG_COMPARATOR = 0 +.set WANT_CAN = 0 +.equ intvecsize = 2 ; please verify; flash size: 131072 bytes +.equ pclen = 2 ; please verify +.overlap +.org 2 + rcall isr ; External Interrupt Request 0 +.org 4 + rcall isr ; External Interrupt Request 1 +.org 6 + rcall isr ; External Interrupt Request 2 +.org 8 + rcall isr ; External Interrupt Request 3 +.org 10 + rcall isr ; External Interrupt Request 4 +.org 12 + rcall isr ; External Interrupt Request 5 +.org 14 + rcall isr ; External Interrupt Request 6 +.org 16 + rcall isr ; External Interrupt Request 7 +.org 18 + rcall isr ; Timer/Counter2 Compare Match +.org 20 + rcall isr ; Timer/Counter2 Overflow +.org 22 + rcall isr ; Timer/Counter1 Capture Event +.org 24 + rcall isr ; Timer/Counter1 Compare Match A +.org 26 + rcall isr ; Timer/Counter Compare Match B +.org 28 + rcall isr ; Timer/Counter1 Compare Match C +.org 30 + rcall isr ; Timer/Counter1 Overflow +.org 32 + rcall isr ; Timer/Counter0 Compare Match +.org 34 + rcall isr ; Timer/Counter0 Overflow +.org 36 + rcall isr ; CAN Transfer Complete or Error +.org 38 + rcall isr ; CAN Timer Overrun +.org 40 + rcall isr ; SPI Serial Transfer Complete +.org 42 + rcall isr ; USART0, Rx Complete +.org 44 + rcall isr ; USART0 Data Register Empty +.org 46 + rcall isr ; USART0, Tx Complete +.org 48 + rcall isr ; Analog Comparator +.org 50 + rcall isr ; ADC Conversion Complete +.org 52 + rcall isr ; EEPROM Ready +.org 54 + rcall isr ; Timer/Counter3 Capture Event +.org 56 + rcall isr ; Timer/Counter3 Compare Match A +.org 58 + rcall isr ; Timer/Counter3 Compare Match B +.org 60 + rcall isr ; Timer/Counter3 Compare Match C +.org 62 + rcall isr ; Timer/Counter3 Overflow +.org 64 + rcall isr ; USART1, Rx Complete +.org 66 + rcall isr ; USART1, Data Register Empty +.org 68 + rcall isr ; USART1, Tx Complete +.org 70 + rcall isr ; 2-wire Serial Interface +.org 72 + rcall isr ; Store Program Memory Read +.equ INTVECTORS = 37 +.nooverlap + +; compatability layer (maybe empty) +.equ EEPE = EEWE +.equ EEMPE = EEMWE + +; controller data area, environment query mcu-info +mcu_info: +mcu_ramsize: + .dw 4096 +mcu_eepromsize: + .dw 4096 +mcu_maxdp: + .dw 65535 +mcu_numints: + .dw 37 +mcu_name: + .dw 10 + .db "AT90CAN128" +.set codestart=pc diff --git a/amforth-6.5/avr8/devices/at90can128/device.inc b/amforth-6.5/avr8/devices/at90can128/device.inc new file mode 100644 index 0000000..59c6d52 --- /dev/null +++ b/amforth-6.5/avr8/devices/at90can128/device.inc @@ -0,0 +1,1707 @@ +; Partname: AT90CAN128 +; generated automatically, no not edit + +.if WANT_PORTA == 1 +; ( -- addr ) System Constant +; R( -- ) +; Port A Data Register +VE_PORTA: + .dw $ff05 + .db "PORTA",0 + .dw VE_HEAD + .set VE_HEAD=VE_PORTA +XT_PORTA: + .dw PFA_DOVARIABLE +PFA_PORTA: + .dw 34 +; ( -- addr ) System Constant +; R( -- ) +; Port A Data Direction Register +VE_DDRA: + .dw $ff04 + .db "DDRA" + .dw VE_HEAD + .set VE_HEAD=VE_DDRA +XT_DDRA: + .dw PFA_DOVARIABLE +PFA_DDRA: + .dw 33 +; ( -- addr ) System Constant +; R( -- ) +; Port A Input Pins +VE_PINA: + .dw $ff04 + .db "PINA" + .dw VE_HEAD + .set VE_HEAD=VE_PINA +XT_PINA: + .dw PFA_DOVARIABLE +PFA_PINA: + .dw 32 + +.endif +.if WANT_PORTB == 1 +; ( -- addr ) System Constant +; R( -- ) +; Port B Data Register +VE_PORTB: + .dw $ff05 + .db "PORTB",0 + .dw VE_HEAD + .set VE_HEAD=VE_PORTB +XT_PORTB: + .dw PFA_DOVARIABLE +PFA_PORTB: + .dw 37 +; ( -- addr ) System Constant +; R( -- ) +; Port B Data Direction Register +VE_DDRB: + .dw $ff04 + .db "DDRB" + .dw VE_HEAD + .set VE_HEAD=VE_DDRB +XT_DDRB: + .dw PFA_DOVARIABLE +PFA_DDRB: + .dw 36 +; ( -- addr ) System Constant +; R( -- ) +; Port B Input Pins +VE_PINB: + .dw $ff04 + .db "PINB" + .dw VE_HEAD + .set VE_HEAD=VE_PINB +XT_PINB: + .dw PFA_DOVARIABLE +PFA_PINB: + .dw 35 + +.endif +.if WANT_PORTC == 1 +; ( -- addr ) System Constant +; R( -- ) +; Port C Data Register +VE_PORTC: + .dw $ff05 + .db "PORTC",0 + .dw VE_HEAD + .set VE_HEAD=VE_PORTC +XT_PORTC: + .dw PFA_DOVARIABLE +PFA_PORTC: + .dw 40 +; ( -- addr ) System Constant +; R( -- ) +; Port C Data Direction Register +VE_DDRC: + .dw $ff04 + .db "DDRC" + .dw VE_HEAD + .set VE_HEAD=VE_DDRC +XT_DDRC: + .dw PFA_DOVARIABLE +PFA_DDRC: + .dw 39 +; ( -- addr ) System Constant +; R( -- ) +; Port C Input Pins +VE_PINC: + .dw $ff04 + .db "PINC" + .dw VE_HEAD + .set VE_HEAD=VE_PINC +XT_PINC: + .dw PFA_DOVARIABLE +PFA_PINC: + .dw 38 + +.endif +.if WANT_PORTD == 1 +; ( -- addr ) System Constant +; R( -- ) +; Port D Data Register +VE_PORTD: + .dw $ff05 + .db "PORTD",0 + .dw VE_HEAD + .set VE_HEAD=VE_PORTD +XT_PORTD: + .dw PFA_DOVARIABLE +PFA_PORTD: + .dw 43 +; ( -- addr ) System Constant +; R( -- ) +; Port D Data Direction Register +VE_DDRD: + .dw $ff04 + .db "DDRD" + .dw VE_HEAD + .set VE_HEAD=VE_DDRD +XT_DDRD: + .dw PFA_DOVARIABLE +PFA_DDRD: + .dw 42 +; ( -- addr ) System Constant +; R( -- ) +; Port D Input Pins +VE_PIND: + .dw $ff04 + .db "PIND" + .dw VE_HEAD + .set VE_HEAD=VE_PIND +XT_PIND: + .dw PFA_DOVARIABLE +PFA_PIND: + .dw 41 + +.endif +.if WANT_PORTE == 1 +; ( -- addr ) System Constant +; R( -- ) +; Data Register, Port E +VE_PORTE: + .dw $ff05 + .db "PORTE",0 + .dw VE_HEAD + .set VE_HEAD=VE_PORTE +XT_PORTE: + .dw PFA_DOVARIABLE +PFA_PORTE: + .dw 46 +; ( -- addr ) System Constant +; R( -- ) +; Data Direction Register, Port E +VE_DDRE: + .dw $ff04 + .db "DDRE" + .dw VE_HEAD + .set VE_HEAD=VE_DDRE +XT_DDRE: + .dw PFA_DOVARIABLE +PFA_DDRE: + .dw 45 +; ( -- addr ) System Constant +; R( -- ) +; Input Pins, Port E +VE_PINE: + .dw $ff04 + .db "PINE" + .dw VE_HEAD + .set VE_HEAD=VE_PINE +XT_PINE: + .dw PFA_DOVARIABLE +PFA_PINE: + .dw 44 + +.endif +.if WANT_PORTF == 1 +; ( -- addr ) System Constant +; R( -- ) +; Data Register, Port F +VE_PORTF: + .dw $ff05 + .db "PORTF",0 + .dw VE_HEAD + .set VE_HEAD=VE_PORTF +XT_PORTF: + .dw PFA_DOVARIABLE +PFA_PORTF: + .dw 49 +; ( -- addr ) System Constant +; R( -- ) +; Data Direction Register, Port F +VE_DDRF: + .dw $ff04 + .db "DDRF" + .dw VE_HEAD + .set VE_HEAD=VE_DDRF +XT_DDRF: + .dw PFA_DOVARIABLE +PFA_DDRF: + .dw 48 +; ( -- addr ) System Constant +; R( -- ) +; Input Pins, Port F +VE_PINF: + .dw $ff04 + .db "PINF" + .dw VE_HEAD + .set VE_HEAD=VE_PINF +XT_PINF: + .dw PFA_DOVARIABLE +PFA_PINF: + .dw 47 + +.endif +.if WANT_JTAG == 1 +; ( -- addr ) System Constant +; R( -- ) +; On-Chip Debug Related Register in I/O Memory +VE_OCDR: + .dw $ff04 + .db "OCDR" + .dw VE_HEAD + .set VE_HEAD=VE_OCDR +XT_OCDR: + .dw PFA_DOVARIABLE +PFA_OCDR: + .dw 81 +; ( -- addr ) System Constant +; R( -- ) +; MCU Control Register +VE_MCUCR: + .dw $ff05 + .db "MCUCR",0 + .dw VE_HEAD + .set VE_HEAD=VE_MCUCR +XT_MCUCR: + .dw PFA_DOVARIABLE +PFA_MCUCR: + .dw 85 +; ( -- addr ) System Constant +; R( -- ) +; MCU Status Register +VE_MCUSR: + .dw $ff05 + .db "MCUSR",0 + .dw VE_HEAD + .set VE_HEAD=VE_MCUSR +XT_MCUSR: + .dw PFA_DOVARIABLE +PFA_MCUSR: + .dw 84 + +.endif +.if WANT_SPI == 1 +; ( -- addr ) System Constant +; R( -- ) +; SPI Control Register +VE_SPCR: + .dw $ff04 + .db "SPCR" + .dw VE_HEAD + .set VE_HEAD=VE_SPCR +XT_SPCR: + .dw PFA_DOVARIABLE +PFA_SPCR: + .dw 76 +; ( -- addr ) System Constant +; R( -- ) +; SPI Status Register +VE_SPSR: + .dw $ff04 + .db "SPSR" + .dw VE_HEAD + .set VE_HEAD=VE_SPSR +XT_SPSR: + .dw PFA_DOVARIABLE +PFA_SPSR: + .dw 77 +; ( -- addr ) System Constant +; R( -- ) +; SPI Data Register +VE_SPDR: + .dw $ff04 + .db "SPDR" + .dw VE_HEAD + .set VE_HEAD=VE_SPDR +XT_SPDR: + .dw PFA_DOVARIABLE +PFA_SPDR: + .dw 78 + +.endif +.if WANT_TWI == 1 +; ( -- addr ) System Constant +; R( -- ) +; TWI Bit Rate register +VE_TWBR: + .dw $ff04 + .db "TWBR" + .dw VE_HEAD + .set VE_HEAD=VE_TWBR +XT_TWBR: + .dw PFA_DOVARIABLE +PFA_TWBR: + .dw 184 +; ( -- addr ) System Constant +; R( -- ) +; TWI Control Register +VE_TWCR: + .dw $ff04 + .db "TWCR" + .dw VE_HEAD + .set VE_HEAD=VE_TWCR +XT_TWCR: + .dw PFA_DOVARIABLE +PFA_TWCR: + .dw 188 +; ( -- addr ) System Constant +; R( -- ) +; TWI Status Register +VE_TWSR: + .dw $ff04 + .db "TWSR" + .dw VE_HEAD + .set VE_HEAD=VE_TWSR +XT_TWSR: + .dw PFA_DOVARIABLE +PFA_TWSR: + .dw 185 +; ( -- addr ) System Constant +; R( -- ) +; TWI Data register +VE_TWDR: + .dw $ff04 + .db "TWDR" + .dw VE_HEAD + .set VE_HEAD=VE_TWDR +XT_TWDR: + .dw PFA_DOVARIABLE +PFA_TWDR: + .dw 187 +; ( -- addr ) System Constant +; R( -- ) +; TWI (Slave) Address register +VE_TWAR: + .dw $ff04 + .db "TWAR" + .dw VE_HEAD + .set VE_HEAD=VE_TWAR +XT_TWAR: + .dw PFA_DOVARIABLE +PFA_TWAR: + .dw 186 + +.endif +.if WANT_USART0 == 1 +; ( -- addr ) System Constant +; R( -- ) +; USART I/O Data Register +VE_UDR0: + .dw $ff04 + .db "UDR0" + .dw VE_HEAD + .set VE_HEAD=VE_UDR0 +XT_UDR0: + .dw PFA_DOVARIABLE +PFA_UDR0: + .dw 198 +; ( -- addr ) System Constant +; R( -- ) +; USART Control and Status Register A +VE_UCSR0A: + .dw $ff06 + .db "UCSR0A" + .dw VE_HEAD + .set VE_HEAD=VE_UCSR0A +XT_UCSR0A: + .dw PFA_DOVARIABLE +PFA_UCSR0A: + .dw 192 +; ( -- addr ) System Constant +; R( -- ) +; USART Control and Status Register B +VE_UCSR0B: + .dw $ff06 + .db "UCSR0B" + .dw VE_HEAD + .set VE_HEAD=VE_UCSR0B +XT_UCSR0B: + .dw PFA_DOVARIABLE +PFA_UCSR0B: + .dw 193 +; ( -- addr ) System Constant +; R( -- ) +; USART Control and Status Register C +VE_UCSR0C: + .dw $ff06 + .db "UCSR0C" + .dw VE_HEAD + .set VE_HEAD=VE_UCSR0C +XT_UCSR0C: + .dw PFA_DOVARIABLE +PFA_UCSR0C: + .dw 194 +; ( -- addr ) System Constant +; R( -- ) +; USART Baud Rate Register t Bytes +VE_UBRR0: + .dw $ff05 + .db "UBRR0",0 + .dw VE_HEAD + .set VE_HEAD=VE_UBRR0 +XT_UBRR0: + .dw PFA_DOVARIABLE +PFA_UBRR0: + .dw 196 + +.endif +.if WANT_USART1 == 1 +; ( -- addr ) System Constant +; R( -- ) +; USART I/O Data Register +VE_UDR1: + .dw $ff04 + .db "UDR1" + .dw VE_HEAD + .set VE_HEAD=VE_UDR1 +XT_UDR1: + .dw PFA_DOVARIABLE +PFA_UDR1: + .dw 206 +; ( -- addr ) System Constant +; R( -- ) +; USART Control and Status Register A +VE_UCSR1A: + .dw $ff06 + .db "UCSR1A" + .dw VE_HEAD + .set VE_HEAD=VE_UCSR1A +XT_UCSR1A: + .dw PFA_DOVARIABLE +PFA_UCSR1A: + .dw 200 +; ( -- addr ) System Constant +; R( -- ) +; USART Control and Status Register B +VE_UCSR1B: + .dw $ff06 + .db "UCSR1B" + .dw VE_HEAD + .set VE_HEAD=VE_UCSR1B +XT_UCSR1B: + .dw PFA_DOVARIABLE +PFA_UCSR1B: + .dw 201 +; ( -- addr ) System Constant +; R( -- ) +; USART Control and Status Register C +VE_UCSR1C: + .dw $ff06 + .db "UCSR1C" + .dw VE_HEAD + .set VE_HEAD=VE_UCSR1C +XT_UCSR1C: + .dw PFA_DOVARIABLE +PFA_UCSR1C: + .dw 202 +; ( -- addr ) System Constant +; R( -- ) +; USART Baud Rate Register t Bytes +VE_UBRR1: + .dw $ff05 + .db "UBRR1",0 + .dw VE_HEAD + .set VE_HEAD=VE_UBRR1 +XT_UBRR1: + .dw PFA_DOVARIABLE +PFA_UBRR1: + .dw 204 + +.endif +.if WANT_CPU == 1 +; ( -- addr ) System Constant +; R( -- ) +; Status Register +VE_SREG: + .dw $ff04 + .db "SREG" + .dw VE_HEAD + .set VE_HEAD=VE_SREG +XT_SREG: + .dw PFA_DOVARIABLE +PFA_SREG: + .dw 95 +; ( -- addr ) System Constant +; R( -- ) +; Stack Pointer +VE_SP: + .dw $ff02 + .db "SP" + .dw VE_HEAD + .set VE_HEAD=VE_SP +XT_SP: + .dw PFA_DOVARIABLE +PFA_SP: + .dw 93 +; ( -- addr ) System Constant +; R( -- ) +; External Memory Control Register A +VE_XMCRA: + .dw $ff05 + .db "XMCRA",0 + .dw VE_HEAD + .set VE_HEAD=VE_XMCRA +XT_XMCRA: + .dw PFA_DOVARIABLE +PFA_XMCRA: + .dw 116 +; ( -- addr ) System Constant +; R( -- ) +; External Memory Control Register B +VE_XMCRB: + .dw $ff05 + .db "XMCRB",0 + .dw VE_HEAD + .set VE_HEAD=VE_XMCRB +XT_XMCRB: + .dw PFA_DOVARIABLE +PFA_XMCRB: + .dw 117 +; ( -- addr ) System Constant +; R( -- ) +; Oscillator Calibration Value +VE_OSCCAL: + .dw $ff06 + .db "OSCCAL" + .dw VE_HEAD + .set VE_HEAD=VE_OSCCAL +XT_OSCCAL: + .dw PFA_DOVARIABLE +PFA_OSCCAL: + .dw 102 +; ( -- addr ) System Constant +; R( -- ) +; Clock Prescale Register +VE_CLKPR: + .dw $ff05 + .db "CLKPR",0 + .dw VE_HEAD + .set VE_HEAD=VE_CLKPR +XT_CLKPR: + .dw PFA_DOVARIABLE +PFA_CLKPR: + .dw 97 +; ( -- addr ) System Constant +; R( -- ) +; Sleep Mode Control Register +VE_SMCR: + .dw $ff04 + .db "SMCR" + .dw VE_HEAD + .set VE_HEAD=VE_SMCR +XT_SMCR: + .dw PFA_DOVARIABLE +PFA_SMCR: + .dw 83 +; ( -- addr ) System Constant +; R( -- ) +; RAM Page Z Select Register +VE_RAMPZ: + .dw $ff05 + .db "RAMPZ",0 + .dw VE_HEAD + .set VE_HEAD=VE_RAMPZ +XT_RAMPZ: + .dw PFA_DOVARIABLE +PFA_RAMPZ: + .dw 91 +; ( -- addr ) System Constant +; R( -- ) +; General Purpose IO Register 2 +VE_GPIOR2: + .dw $ff06 + .db "GPIOR2" + .dw VE_HEAD + .set VE_HEAD=VE_GPIOR2 +XT_GPIOR2: + .dw PFA_DOVARIABLE +PFA_GPIOR2: + .dw 75 +; ( -- addr ) System Constant +; R( -- ) +; General Purpose IO Register 1 +VE_GPIOR1: + .dw $ff06 + .db "GPIOR1" + .dw VE_HEAD + .set VE_HEAD=VE_GPIOR1 +XT_GPIOR1: + .dw PFA_DOVARIABLE +PFA_GPIOR1: + .dw 74 +; ( -- addr ) System Constant +; R( -- ) +; General Purpose IO Register 0 +VE_GPIOR0: + .dw $ff06 + .db "GPIOR0" + .dw VE_HEAD + .set VE_HEAD=VE_GPIOR0 +XT_GPIOR0: + .dw PFA_DOVARIABLE +PFA_GPIOR0: + .dw 62 + +.endif +.if WANT_BOOT_LOAD == 1 +; ( -- addr ) System Constant +; R( -- ) +; Store Program Memory Control Register +VE_SPMCSR: + .dw $ff06 + .db "SPMCSR" + .dw VE_HEAD + .set VE_HEAD=VE_SPMCSR +XT_SPMCSR: + .dw PFA_DOVARIABLE +PFA_SPMCSR: + .dw 87 + +.endif +.if WANT_EXTERNAL_INTERRUPT == 1 +; ( -- addr ) System Constant +; R( -- ) +; External Interrupt Control Register A +VE_EICRA: + .dw $ff05 + .db "EICRA",0 + .dw VE_HEAD + .set VE_HEAD=VE_EICRA +XT_EICRA: + .dw PFA_DOVARIABLE +PFA_EICRA: + .dw 105 +; ( -- addr ) System Constant +; R( -- ) +; External Interrupt Control Register B +VE_EICRB: + .dw $ff05 + .db "EICRB",0 + .dw VE_HEAD + .set VE_HEAD=VE_EICRB +XT_EICRB: + .dw PFA_DOVARIABLE +PFA_EICRB: + .dw 106 +; ( -- addr ) System Constant +; R( -- ) +; External Interrupt Mask Register +VE_EIMSK: + .dw $ff05 + .db "EIMSK",0 + .dw VE_HEAD + .set VE_HEAD=VE_EIMSK +XT_EIMSK: + .dw PFA_DOVARIABLE +PFA_EIMSK: + .dw 61 +; ( -- addr ) System Constant +; R( -- ) +; External Interrupt Flag Register +VE_EIFR: + .dw $ff04 + .db "EIFR" + .dw VE_HEAD + .set VE_HEAD=VE_EIFR +XT_EIFR: + .dw PFA_DOVARIABLE +PFA_EIFR: + .dw 60 + +.endif +.if WANT_EEPROM == 1 +; ( -- addr ) System Constant +; R( -- ) +; EEPROM Read/Write Access Bytes +VE_EEAR: + .dw $ff04 + .db "EEAR" + .dw VE_HEAD + .set VE_HEAD=VE_EEAR +XT_EEAR: + .dw PFA_DOVARIABLE +PFA_EEAR: + .dw 65 +; ( -- addr ) System Constant +; R( -- ) +; EEPROM Data Register +VE_EEDR: + .dw $ff04 + .db "EEDR" + .dw VE_HEAD + .set VE_HEAD=VE_EEDR +XT_EEDR: + .dw PFA_DOVARIABLE +PFA_EEDR: + .dw 64 +; ( -- addr ) System Constant +; R( -- ) +; EEPROM Control Register +VE_EECR: + .dw $ff04 + .db "EECR" + .dw VE_HEAD + .set VE_HEAD=VE_EECR +XT_EECR: + .dw PFA_DOVARIABLE +PFA_EECR: + .dw 63 + +.endif +.if WANT_PORTG == 1 +; ( -- addr ) System Constant +; R( -- ) +; Data Register, Port G +VE_PORTG: + .dw $ff05 + .db "PORTG",0 + .dw VE_HEAD + .set VE_HEAD=VE_PORTG +XT_PORTG: + .dw PFA_DOVARIABLE +PFA_PORTG: + .dw 52 +; ( -- addr ) System Constant +; R( -- ) +; Data Direction Register, Port G +VE_DDRG: + .dw $ff04 + .db "DDRG" + .dw VE_HEAD + .set VE_HEAD=VE_DDRG +XT_DDRG: + .dw PFA_DOVARIABLE +PFA_DDRG: + .dw 51 +; ( -- addr ) System Constant +; R( -- ) +; Input Pins, Port G +VE_PING: + .dw $ff04 + .db "PING" + .dw VE_HEAD + .set VE_HEAD=VE_PING +XT_PING: + .dw PFA_DOVARIABLE +PFA_PING: + .dw 50 + +.endif +.if WANT_TIMER_COUNTER_0 == 1 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter0 Control Register +VE_TCCR0A: + .dw $ff06 + .db "TCCR0A" + .dw VE_HEAD + .set VE_HEAD=VE_TCCR0A +XT_TCCR0A: + .dw PFA_DOVARIABLE +PFA_TCCR0A: + .dw 68 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter0 +VE_TCNT0: + .dw $ff05 + .db "TCNT0",0 + .dw VE_HEAD + .set VE_HEAD=VE_TCNT0 +XT_TCNT0: + .dw PFA_DOVARIABLE +PFA_TCNT0: + .dw 70 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter0 Output Compare Register +VE_OCR0A: + .dw $ff05 + .db "OCR0A",0 + .dw VE_HEAD + .set VE_HEAD=VE_OCR0A +XT_OCR0A: + .dw PFA_DOVARIABLE +PFA_OCR0A: + .dw 71 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter0 Interrupt Mask Register +VE_TIMSK0: + .dw $ff06 + .db "TIMSK0" + .dw VE_HEAD + .set VE_HEAD=VE_TIMSK0 +XT_TIMSK0: + .dw PFA_DOVARIABLE +PFA_TIMSK0: + .dw 110 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter0 Interrupt Flag register +VE_TIFR0: + .dw $ff05 + .db "TIFR0",0 + .dw VE_HEAD + .set VE_HEAD=VE_TIFR0 +XT_TIFR0: + .dw PFA_DOVARIABLE +PFA_TIFR0: + .dw 53 +; ( -- addr ) System Constant +; R( -- ) +; General Timer/Control Register +VE_GTCCR: + .dw $ff05 + .db "GTCCR",0 + .dw VE_HEAD + .set VE_HEAD=VE_GTCCR +XT_GTCCR: + .dw PFA_DOVARIABLE +PFA_GTCCR: + .dw 67 + +.endif +.if WANT_TIMER_COUNTER_1 == 1 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter1 Control Register A +VE_TCCR1A: + .dw $ff06 + .db "TCCR1A" + .dw VE_HEAD + .set VE_HEAD=VE_TCCR1A +XT_TCCR1A: + .dw PFA_DOVARIABLE +PFA_TCCR1A: + .dw 128 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter1 Control Register B +VE_TCCR1B: + .dw $ff06 + .db "TCCR1B" + .dw VE_HEAD + .set VE_HEAD=VE_TCCR1B +XT_TCCR1B: + .dw PFA_DOVARIABLE +PFA_TCCR1B: + .dw 129 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter 1 Control Register C +VE_TCCR1C: + .dw $ff06 + .db "TCCR1C" + .dw VE_HEAD + .set VE_HEAD=VE_TCCR1C +XT_TCCR1C: + .dw PFA_DOVARIABLE +PFA_TCCR1C: + .dw 130 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter1 Bytes +VE_TCNT1: + .dw $ff05 + .db "TCNT1",0 + .dw VE_HEAD + .set VE_HEAD=VE_TCNT1 +XT_TCNT1: + .dw PFA_DOVARIABLE +PFA_TCNT1: + .dw 132 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter1 Output Compare Register Bytes +VE_OCR1A: + .dw $ff05 + .db "OCR1A",0 + .dw VE_HEAD + .set VE_HEAD=VE_OCR1A +XT_OCR1A: + .dw PFA_DOVARIABLE +PFA_OCR1A: + .dw 136 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter1 Output Compare Register Bytes +VE_OCR1B: + .dw $ff05 + .db "OCR1B",0 + .dw VE_HEAD + .set VE_HEAD=VE_OCR1B +XT_OCR1B: + .dw PFA_DOVARIABLE +PFA_OCR1B: + .dw 138 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter1 Output Compare Register Bytes +VE_OCR1C: + .dw $ff05 + .db "OCR1C",0 + .dw VE_HEAD + .set VE_HEAD=VE_OCR1C +XT_OCR1C: + .dw PFA_DOVARIABLE +PFA_OCR1C: + .dw 140 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter1 Input Capture Register Bytes +VE_ICR1: + .dw $ff04 + .db "ICR1" + .dw VE_HEAD + .set VE_HEAD=VE_ICR1 +XT_ICR1: + .dw PFA_DOVARIABLE +PFA_ICR1: + .dw 134 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter Interrupt Mask Register +VE_TIMSK1: + .dw $ff06 + .db "TIMSK1" + .dw VE_HEAD + .set VE_HEAD=VE_TIMSK1 +XT_TIMSK1: + .dw PFA_DOVARIABLE +PFA_TIMSK1: + .dw 111 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter Interrupt Flag register +VE_TIFR1: + .dw $ff05 + .db "TIFR1",0 + .dw VE_HEAD + .set VE_HEAD=VE_TIFR1 +XT_TIFR1: + .dw PFA_DOVARIABLE +PFA_TIFR1: + .dw 54 + +.endif +.if WANT_TIMER_COUNTER_3 == 1 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter3 Control Register A +VE_TCCR3A: + .dw $ff06 + .db "TCCR3A" + .dw VE_HEAD + .set VE_HEAD=VE_TCCR3A +XT_TCCR3A: + .dw PFA_DOVARIABLE +PFA_TCCR3A: + .dw 144 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter3 Control Register B +VE_TCCR3B: + .dw $ff06 + .db "TCCR3B" + .dw VE_HEAD + .set VE_HEAD=VE_TCCR3B +XT_TCCR3B: + .dw PFA_DOVARIABLE +PFA_TCCR3B: + .dw 145 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter 3 Control Register C +VE_TCCR3C: + .dw $ff06 + .db "TCCR3C" + .dw VE_HEAD + .set VE_HEAD=VE_TCCR3C +XT_TCCR3C: + .dw PFA_DOVARIABLE +PFA_TCCR3C: + .dw 146 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter3 Bytes +VE_TCNT3: + .dw $ff05 + .db "TCNT3",0 + .dw VE_HEAD + .set VE_HEAD=VE_TCNT3 +XT_TCNT3: + .dw PFA_DOVARIABLE +PFA_TCNT3: + .dw 148 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter3 Output Compare Register Bytes +VE_OCR3A: + .dw $ff05 + .db "OCR3A",0 + .dw VE_HEAD + .set VE_HEAD=VE_OCR3A +XT_OCR3A: + .dw PFA_DOVARIABLE +PFA_OCR3A: + .dw 152 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter3 Output Compare Register Bytes +VE_OCR3B: + .dw $ff05 + .db "OCR3B",0 + .dw VE_HEAD + .set VE_HEAD=VE_OCR3B +XT_OCR3B: + .dw PFA_DOVARIABLE +PFA_OCR3B: + .dw 154 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter3 Output Compare Register Bytes +VE_OCR3C: + .dw $ff05 + .db "OCR3C",0 + .dw VE_HEAD + .set VE_HEAD=VE_OCR3C +XT_OCR3C: + .dw PFA_DOVARIABLE +PFA_OCR3C: + .dw 156 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter3 Input Capture Register Bytes +VE_ICR3: + .dw $ff04 + .db "ICR3" + .dw VE_HEAD + .set VE_HEAD=VE_ICR3 +XT_ICR3: + .dw PFA_DOVARIABLE +PFA_ICR3: + .dw 150 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter Interrupt Mask Register +VE_TIMSK3: + .dw $ff06 + .db "TIMSK3" + .dw VE_HEAD + .set VE_HEAD=VE_TIMSK3 +XT_TIMSK3: + .dw PFA_DOVARIABLE +PFA_TIMSK3: + .dw 113 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter Interrupt Flag register +VE_TIFR3: + .dw $ff05 + .db "TIFR3",0 + .dw VE_HEAD + .set VE_HEAD=VE_TIFR3 +XT_TIFR3: + .dw PFA_DOVARIABLE +PFA_TIFR3: + .dw 56 + +.endif +.if WANT_TIMER_COUNTER_2 == 1 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter2 Control Register +VE_TCCR2: + .dw $ff05 + .db "TCCR2",0 + .dw VE_HEAD + .set VE_HEAD=VE_TCCR2 +XT_TCCR2: + .dw PFA_DOVARIABLE +PFA_TCCR2: + .dw 176 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter2 +VE_TCNT2: + .dw $ff05 + .db "TCNT2",0 + .dw VE_HEAD + .set VE_HEAD=VE_TCNT2 +XT_TCNT2: + .dw PFA_DOVARIABLE +PFA_TCNT2: + .dw 178 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter2 Output Compare Register +VE_OCR2A: + .dw $ff05 + .db "OCR2A",0 + .dw VE_HEAD + .set VE_HEAD=VE_OCR2A +XT_OCR2A: + .dw PFA_DOVARIABLE +PFA_OCR2A: + .dw 179 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter Interrupt Mask register +VE_TIMSK2: + .dw $ff06 + .db "TIMSK2" + .dw VE_HEAD + .set VE_HEAD=VE_TIMSK2 +XT_TIMSK2: + .dw PFA_DOVARIABLE +PFA_TIMSK2: + .dw 112 +; ( -- addr ) System Constant +; R( -- ) +; Timer/Counter Interrupt Flag Register +VE_TIFR2: + .dw $ff05 + .db "TIFR2",0 + .dw VE_HEAD + .set VE_HEAD=VE_TIFR2 +XT_TIFR2: + .dw PFA_DOVARIABLE +PFA_TIFR2: + .dw 55 +; ( -- addr ) System Constant +; R( -- ) +; Asynchronous Status Register +VE_ASSR: + .dw $ff04 + .db "ASSR" + .dw VE_HEAD + .set VE_HEAD=VE_ASSR +XT_ASSR: + .dw PFA_DOVARIABLE +PFA_ASSR: + .dw 182 + +.endif +.if WANT_WATCHDOG == 1 +; ( -- addr ) System Constant +; R( -- ) +; Watchdog Timer Control Register +VE_WDTCR: + .dw $ff05 + .db "WDTCR",0 + .dw VE_HEAD + .set VE_HEAD=VE_WDTCR +XT_WDTCR: + .dw PFA_DOVARIABLE +PFA_WDTCR: + .dw 96 + +.endif +.if WANT_AD_CONVERTER == 1 +; ( -- addr ) System Constant +; R( -- ) +; The ADC multiplexer Selection Register +VE_ADMUX: + .dw $ff05 + .db "ADMUX",0 + .dw VE_HEAD + .set VE_HEAD=VE_ADMUX +XT_ADMUX: + .dw PFA_DOVARIABLE +PFA_ADMUX: + .dw 124 +; ( -- addr ) System Constant +; R( -- ) +; The ADC Control and Status register +VE_ADCSRA: + .dw $ff06 + .db "ADCSRA" + .dw VE_HEAD + .set VE_HEAD=VE_ADCSRA +XT_ADCSRA: + .dw PFA_DOVARIABLE +PFA_ADCSRA: + .dw 122 +; ( -- addr ) System Constant +; R( -- ) +; ADC Data Register Bytes +VE_ADC: + .dw $ff03 + .db "ADC",0 + .dw VE_HEAD + .set VE_HEAD=VE_ADC +XT_ADC: + .dw PFA_DOVARIABLE +PFA_ADC: + .dw 120 +; ( -- addr ) System Constant +; R( -- ) +; ADC Control and Status Register B +VE_ADCSRB: + .dw $ff06 + .db "ADCSRB" + .dw VE_HEAD + .set VE_HEAD=VE_ADCSRB +XT_ADCSRB: + .dw PFA_DOVARIABLE +PFA_ADCSRB: + .dw 123 +; ( -- addr ) System Constant +; R( -- ) +; Digital Input Disable Register 1 +VE_DIDR0: + .dw $ff05 + .db "DIDR0",0 + .dw VE_HEAD + .set VE_HEAD=VE_DIDR0 +XT_DIDR0: + .dw PFA_DOVARIABLE +PFA_DIDR0: + .dw 126 + +.endif +.if WANT_ANALOG_COMPARATOR == 1 +; ( -- addr ) System Constant +; R( -- ) +; Analog Comparator Control And Status Register +VE_ACSR: + .dw $ff04 + .db "ACSR" + .dw VE_HEAD + .set VE_HEAD=VE_ACSR +XT_ACSR: + .dw PFA_DOVARIABLE +PFA_ACSR: + .dw 80 +; ( -- addr ) System Constant +; R( -- ) +; +VE_DIDR1: + .dw $ff05 + .db "DIDR1",0 + .dw VE_HEAD + .set VE_HEAD=VE_DIDR1 +XT_DIDR1: + .dw PFA_DOVARIABLE +PFA_DIDR1: + .dw 127 + +.endif +.if WANT_CAN == 1 +; ( -- addr ) System Constant +; R( -- ) +; CAN General Control Register +VE_CANGCON: + .dw $ff07 + .db "CANGCON",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANGCON +XT_CANGCON: + .dw PFA_DOVARIABLE +PFA_CANGCON: + .dw 216 +; ( -- addr ) System Constant +; R( -- ) +; CAN General Status Register +VE_CANGSTA: + .dw $ff07 + .db "CANGSTA",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANGSTA +XT_CANGSTA: + .dw PFA_DOVARIABLE +PFA_CANGSTA: + .dw 217 +; ( -- addr ) System Constant +; R( -- ) +; CAN General Interrupt Register +VE_CANGIT: + .dw $ff06 + .db "CANGIT" + .dw VE_HEAD + .set VE_HEAD=VE_CANGIT +XT_CANGIT: + .dw PFA_DOVARIABLE +PFA_CANGIT: + .dw 218 +; ( -- addr ) System Constant +; R( -- ) +; CAN General Interrupt Enable Register +VE_CANGIE: + .dw $ff06 + .db "CANGIE" + .dw VE_HEAD + .set VE_HEAD=VE_CANGIE +XT_CANGIE: + .dw PFA_DOVARIABLE +PFA_CANGIE: + .dw 219 +; ( -- addr ) System Constant +; R( -- ) +; Enable MOb Register +VE_CANEN2: + .dw $ff06 + .db "CANEN2" + .dw VE_HEAD + .set VE_HEAD=VE_CANEN2 +XT_CANEN2: + .dw PFA_DOVARIABLE +PFA_CANEN2: + .dw 220 +; ( -- addr ) System Constant +; R( -- ) +; Enable MOb Register +VE_CANEN1: + .dw $ff06 + .db "CANEN1" + .dw VE_HEAD + .set VE_HEAD=VE_CANEN1 +XT_CANEN1: + .dw PFA_DOVARIABLE +PFA_CANEN1: + .dw 221 +; ( -- addr ) System Constant +; R( -- ) +; Enable Interrupt MOb Register +VE_CANIE2: + .dw $ff06 + .db "CANIE2" + .dw VE_HEAD + .set VE_HEAD=VE_CANIE2 +XT_CANIE2: + .dw PFA_DOVARIABLE +PFA_CANIE2: + .dw 222 +; ( -- addr ) System Constant +; R( -- ) +; Enable Interrupt MOb Register +VE_CANIE1: + .dw $ff06 + .db "CANIE1" + .dw VE_HEAD + .set VE_HEAD=VE_CANIE1 +XT_CANIE1: + .dw PFA_DOVARIABLE +PFA_CANIE1: + .dw 223 +; ( -- addr ) System Constant +; R( -- ) +; CAN Status Interrupt MOb Register +VE_CANSIT2: + .dw $ff07 + .db "CANSIT2",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANSIT2 +XT_CANSIT2: + .dw PFA_DOVARIABLE +PFA_CANSIT2: + .dw 224 +; ( -- addr ) System Constant +; R( -- ) +; CAN Status Interrupt MOb Register +VE_CANSIT1: + .dw $ff07 + .db "CANSIT1",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANSIT1 +XT_CANSIT1: + .dw PFA_DOVARIABLE +PFA_CANSIT1: + .dw 225 +; ( -- addr ) System Constant +; R( -- ) +; Bit Timing Register 1 +VE_CANBT1: + .dw $ff06 + .db "CANBT1" + .dw VE_HEAD + .set VE_HEAD=VE_CANBT1 +XT_CANBT1: + .dw PFA_DOVARIABLE +PFA_CANBT1: + .dw 226 +; ( -- addr ) System Constant +; R( -- ) +; Bit Timing Register 2 +VE_CANBT2: + .dw $ff06 + .db "CANBT2" + .dw VE_HEAD + .set VE_HEAD=VE_CANBT2 +XT_CANBT2: + .dw PFA_DOVARIABLE +PFA_CANBT2: + .dw 227 +; ( -- addr ) System Constant +; R( -- ) +; Bit Timing Register 3 +VE_CANBT3: + .dw $ff06 + .db "CANBT3" + .dw VE_HEAD + .set VE_HEAD=VE_CANBT3 +XT_CANBT3: + .dw PFA_DOVARIABLE +PFA_CANBT3: + .dw 228 +; ( -- addr ) System Constant +; R( -- ) +; Timer Control Register +VE_CANTCON: + .dw $ff07 + .db "CANTCON",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANTCON +XT_CANTCON: + .dw PFA_DOVARIABLE +PFA_CANTCON: + .dw 229 +; ( -- addr ) System Constant +; R( -- ) +; Timer Register Low +VE_CANTIML: + .dw $ff07 + .db "CANTIML",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANTIML +XT_CANTIML: + .dw PFA_DOVARIABLE +PFA_CANTIML: + .dw 230 +; ( -- addr ) System Constant +; R( -- ) +; Timer Register High +VE_CANTIMH: + .dw $ff07 + .db "CANTIMH",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANTIMH +XT_CANTIMH: + .dw PFA_DOVARIABLE +PFA_CANTIMH: + .dw 231 +; ( -- addr ) System Constant +; R( -- ) +; TTC Timer Register Low +VE_CANTTCL: + .dw $ff07 + .db "CANTTCL",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANTTCL +XT_CANTTCL: + .dw PFA_DOVARIABLE +PFA_CANTTCL: + .dw 232 +; ( -- addr ) System Constant +; R( -- ) +; TTC Timer Register High +VE_CANTTCH: + .dw $ff07 + .db "CANTTCH",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANTTCH +XT_CANTTCH: + .dw PFA_DOVARIABLE +PFA_CANTTCH: + .dw 233 +; ( -- addr ) System Constant +; R( -- ) +; Transmit Error Counter Register +VE_CANTEC: + .dw $ff06 + .db "CANTEC" + .dw VE_HEAD + .set VE_HEAD=VE_CANTEC +XT_CANTEC: + .dw PFA_DOVARIABLE +PFA_CANTEC: + .dw 234 +; ( -- addr ) System Constant +; R( -- ) +; Receive Error Counter Register +VE_CANREC: + .dw $ff06 + .db "CANREC" + .dw VE_HEAD + .set VE_HEAD=VE_CANREC +XT_CANREC: + .dw PFA_DOVARIABLE +PFA_CANREC: + .dw 235 +; ( -- addr ) System Constant +; R( -- ) +; Highest Priority MOb Register +VE_CANHPMOB: + .dw $ff08 + .db "CANHPMOB" + .dw VE_HEAD + .set VE_HEAD=VE_CANHPMOB +XT_CANHPMOB: + .dw PFA_DOVARIABLE +PFA_CANHPMOB: + .dw 236 +; ( -- addr ) System Constant +; R( -- ) +; Page MOb Register +VE_CANPAGE: + .dw $ff07 + .db "CANPAGE",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANPAGE +XT_CANPAGE: + .dw PFA_DOVARIABLE +PFA_CANPAGE: + .dw 237 +; ( -- addr ) System Constant +; R( -- ) +; MOb Status Register +VE_CANSTMOB: + .dw $ff08 + .db "CANSTMOB" + .dw VE_HEAD + .set VE_HEAD=VE_CANSTMOB +XT_CANSTMOB: + .dw PFA_DOVARIABLE +PFA_CANSTMOB: + .dw 238 +; ( -- addr ) System Constant +; R( -- ) +; MOb Control and DLC Register +VE_CANCDMOB: + .dw $ff08 + .db "CANCDMOB" + .dw VE_HEAD + .set VE_HEAD=VE_CANCDMOB +XT_CANCDMOB: + .dw PFA_DOVARIABLE +PFA_CANCDMOB: + .dw 239 +; ( -- addr ) System Constant +; R( -- ) +; Identifier Tag Register 4 +VE_CANIDT4: + .dw $ff07 + .db "CANIDT4",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANIDT4 +XT_CANIDT4: + .dw PFA_DOVARIABLE +PFA_CANIDT4: + .dw 240 +; ( -- addr ) System Constant +; R( -- ) +; Identifier Tag Register 3 +VE_CANIDT3: + .dw $ff07 + .db "CANIDT3",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANIDT3 +XT_CANIDT3: + .dw PFA_DOVARIABLE +PFA_CANIDT3: + .dw 241 +; ( -- addr ) System Constant +; R( -- ) +; Identifier Tag Register 2 +VE_CANIDT2: + .dw $ff07 + .db "CANIDT2",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANIDT2 +XT_CANIDT2: + .dw PFA_DOVARIABLE +PFA_CANIDT2: + .dw 242 +; ( -- addr ) System Constant +; R( -- ) +; Identifier Tag Register 1 +VE_CANIDT1: + .dw $ff07 + .db "CANIDT1",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANIDT1 +XT_CANIDT1: + .dw PFA_DOVARIABLE +PFA_CANIDT1: + .dw 243 +; ( -- addr ) System Constant +; R( -- ) +; Identifier Mask Register 4 +VE_CANIDM4: + .dw $ff07 + .db "CANIDM4",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANIDM4 +XT_CANIDM4: + .dw PFA_DOVARIABLE +PFA_CANIDM4: + .dw 244 +; ( -- addr ) System Constant +; R( -- ) +; Identifier Mask Register 3 +VE_CANIDM3: + .dw $ff07 + .db "CANIDM3",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANIDM3 +XT_CANIDM3: + .dw PFA_DOVARIABLE +PFA_CANIDM3: + .dw 245 +; ( -- addr ) System Constant +; R( -- ) +; Identifier Mask Register 2 +VE_CANIDM2: + .dw $ff07 + .db "CANIDM2",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANIDM2 +XT_CANIDM2: + .dw PFA_DOVARIABLE +PFA_CANIDM2: + .dw 246 +; ( -- addr ) System Constant +; R( -- ) +; Identifier Mask Register 1 +VE_CANIDM1: + .dw $ff07 + .db "CANIDM1",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANIDM1 +XT_CANIDM1: + .dw PFA_DOVARIABLE +PFA_CANIDM1: + .dw 247 +; ( -- addr ) System Constant +; R( -- ) +; Time Stamp Register Low +VE_CANSTML: + .dw $ff07 + .db "CANSTML",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANSTML +XT_CANSTML: + .dw PFA_DOVARIABLE +PFA_CANSTML: + .dw 248 +; ( -- addr ) System Constant +; R( -- ) +; Time Stamp Register High +VE_CANSTMH: + .dw $ff07 + .db "CANSTMH",0 + .dw VE_HEAD + .set VE_HEAD=VE_CANSTMH +XT_CANSTMH: + .dw PFA_DOVARIABLE +PFA_CANSTMH: + .dw 249 +; ( -- addr ) System Constant +; R( -- ) +; Message Data Register +VE_CANMSG: + .dw $ff06 + .db "CANMSG" + .dw VE_HEAD + .set VE_HEAD=VE_CANMSG +XT_CANMSG: + .dw PFA_DOVARIABLE +PFA_CANMSG: + .dw 250 + +.endif diff --git a/amforth-6.5/avr8/devices/at90can128/device.py b/amforth-6.5/avr8/devices/at90can128/device.py new file mode 100644 index 0000000..778b42e --- /dev/null +++ b/amforth-6.5/avr8/devices/at90can128/device.py @@ -0,0 +1,507 @@ +# Generated Automatically + +# Partname AT90CAN128 + +MCUREGS = { +# Interrupt Vectors + 'INT0Addr' : '#2', # External Interrupt Request 0 + 'INT1Addr' : '#4', # External Interrupt Request 1 + 'INT2Addr' : '#6', # External Interrupt Request 2 + 'INT3Addr' : '#8', # External Interrupt Request 3 + 'INT4Addr' : '#10', # External Interrupt Request 4 + 'INT5Addr' : '#12', # External Interrupt Request 5 + 'INT6Addr' : '#14', # External Interrupt Request 6 + 'INT7Addr' : '#16', # External Interrupt Request 7 + 'TIMER2_COMPAddr' : '#18', # Timer/Counter2 Compare Match + 'TIMER2_OVFAddr' : '#20', # Timer/Counter2 Overflow + 'TIMER1_CAPTAddr' : '#22', # Timer/Counter1 Capture Event + 'TIMER1_COMPAAddr' : '#24', # Timer/Counter1 Compare Match A + 'TIMER1_COMPBAddr' : '#26', # Timer/Counter Compare Match B + 'TIMER1_COMPCAddr' : '#28', # Timer/Counter1 Compare Match C + 'TIMER1_OVFAddr' : '#30', # Timer/Counter1 Overflow + 'TIMER0_COMPAddr' : '#32', # Timer/Counter0 Compare Match + 'TIMER0_OVFAddr' : '#34', # Timer/Counter0 Overflow + 'CANITAddr' : '#36', # CAN Transfer Complete or Error + 'OVRITAddr' : '#38', # CAN Timer Overrun + 'SPI_STCAddr' : '#40', # SPI Serial Transfer Complete + 'USART0_RXAddr' : '#42', # USART0, Rx Complete + 'USART0_UDREAddr' : '#44', # USART0 Data Register Empty + 'USART0_TXAddr' : '#46', # USART0, Tx Complete + 'ANALOG_COMPAddr' : '#48', # Analog Comparator + 'ADCAddr' : '#50', # ADC Conversion Complete + 'EE_READYAddr' : '#52', # EEPROM Ready + 'TIMER3_CAPTAddr' : '#54', # Timer/Counter3 Capture Event + 'TIMER3_COMPAAddr' : '#56', # Timer/Counter3 Compare Match A + 'TIMER3_COMPBAddr' : '#58', # Timer/Counter3 Compare Match B + 'TIMER3_COMPCAddr' : '#60', # Timer/Counter3 Compare Match C + 'TIMER3_OVFAddr' : '#62', # Timer/Counter3 Overflow + 'USART1_RXAddr' : '#64', # USART1, Rx Complete + 'USART1_UDREAddr' : '#66', # USART1, Data Register Empty + 'USART1_TXAddr' : '#68', # USART1, Tx Complete + 'TWIAddr' : '#70', # 2-wire Serial Interface + 'SPM_READYAddr' : '#72', # Store Program Memory Read + +# Module PORTA + 'PORTA' : '$22', # Port A Data Register + 'DDRA' : '$21', # Port A Data Direction Register + 'PINA' : '$20', # Port A Input Pins + +# Module PORTB + 'PORTB' : '$25', # Port B Data Register + 'DDRB' : '$24', # Port B Data Direction Register + 'PINB' : '$23', # Port B Input Pins + +# Module PORTC + 'PORTC' : '$28', # Port C Data Register + 'DDRC' : '$27', # Port C Data Direction Register + 'PINC' : '$26', # Port C Input Pins + +# Module PORTD + 'PORTD' : '$2b', # Port D Data Register + 'DDRD' : '$2a', # Port D Data Direction Register + 'PIND' : '$29', # Port D Input Pins + +# Module PORTE + 'PORTE' : '$2e', # Data Register, Port E + 'DDRE' : '$2d', # Data Direction Register, Port + 'PINE' : '$2c', # Input Pins, Port E + +# Module PORTF + 'PORTF' : '$31', # Data Register, Port F + 'DDRF' : '$30', # Data Direction Register, Port + 'PINF' : '$2f', # Input Pins, Port F + +# Module JTAG + 'OCDR' : '$51', # On-Chip Debug Related Register + 'MCUCR' : '$55', # MCU Control Register + 'MCUCR_JTD': '$80', # JTAG Interface Disable + 'MCUSR' : '$54', # MCU Status Register + 'MCUSR_JTRF': '$10', # JTAG Reset Flag + +# Module SPI + 'SPCR' : '$4c', # SPI Control Register + 'SPCR_SPIE': '$80', # SPI Interrupt Enable + 'SPCR_SPE': '$40', # SPI Enable + 'SPCR_DORD': '$20', # Data Order + 'SPCR_MSTR': '$10', # Master/Slave Select + 'SPCR_CPOL': '$8', # Clock polarity + 'SPCR_CPHA': '$4', # Clock Phase + 'SPCR_SPR': '$3', # SPI Clock Rate Selects + 'SPSR' : '$4d', # SPI Status Register + 'SPSR_SPIF': '$80', # SPI Interrupt Flag + 'SPSR_WCOL': '$40', # Write Collision Flag + 'SPSR_SPI2X': '$1', # Double SPI Speed Bit + 'SPDR' : '$4e', # SPI Data Register + +# Module TWI + 'TWBR' : '$b8', # TWI Bit Rate register + 'TWCR' : '$bc', # TWI Control Register + 'TWCR_TWINT': '$80', # TWI Interrupt Flag + 'TWCR_TWEA': '$40', # TWI Enable Acknowledge Bit + 'TWCR_TWSTA': '$20', # TWI Start Condition Bit + 'TWCR_TWSTO': '$10', # TWI Stop Condition Bit + 'TWCR_TWWC': '$8', # TWI Write Collition Flag + 'TWCR_TWEN': '$4', # TWI Enable Bit + 'TWCR_TWIE': '$1', # TWI Interrupt Enable + 'TWSR' : '$b9', # TWI Status Register + 'TWSR_TWS': '$f8', # TWI Status + 'TWSR_TWPS': '$3', # TWI Prescaler + 'TWDR' : '$bb', # TWI Data register + 'TWAR' : '$ba', # TWI (Slave) Address register + 'TWAR_TWA': '$fe', # TWI (Slave) Address register B + 'TWAR_TWGCE': '$1', # TWI General Call Recognition E + +# Module USART0 + 'UDR0' : '$c6', # USART I/O Data Register + 'UCSR0A' : '$c0', # USART Control and Status Regis + 'UCSR0A_RXC0': '$80', # USART Receive Complete + 'UCSR0A_TXC0': '$40', # USART Transmitt Complete + 'UCSR0A_UDRE0': '$20', # USART Data Register Empty + 'UCSR0A_FE0': '$10', # Framing Error + 'UCSR0A_DOR0': '$8', # Data overRun + 'UCSR0A_UPE0': '$4', # Parity Error + 'UCSR0A_U2X0': '$2', # Double the USART transmission + 'UCSR0A_MPCM0': '$1', # Multi-processor Communication + 'UCSR0B' : '$c1', # USART Control and Status Regis + 'UCSR0B_RXCIE0': '$80', # RX Complete Interrupt Enable + 'UCSR0B_TXCIE0': '$40', # TX Complete Interrupt Enable + 'UCSR0B_UDRIE0': '$20', # USART Data register Empty Inte + 'UCSR0B_RXEN0': '$10', # Receiver Enable + 'UCSR0B_TXEN0': '$8', # Transmitter Enable + 'UCSR0B_UCSZ02': '$4', # Character Size + 'UCSR0B_RXB80': '$2', # Receive Data Bit 8 + 'UCSR0B_TXB80': '$1', # Transmit Data Bit 8 + 'UCSR0C' : '$c2', # USART Control and Status Regis + 'UCSR0C_UMSEL0': '$40', # USART Mode Select + 'UCSR0C_UPM0': '$30', # Parity Mode Bits + 'UCSR0C_USBS0': '$8', # Stop Bit Select + 'UCSR0C_UCSZ0': '$6', # Character Size + 'UCSR0C_UCPOL0': '$1', # Clock Polarity + 'UBRR0' : '$c4', # USART Baud Rate Register t Byt + +# Module USART1 + 'UDR1' : '$ce', # USART I/O Data Register + 'UCSR1A' : '$c8', # USART Control and Status Regis + 'UCSR1A_RXC1': '$80', # USART Receive Complete + 'UCSR1A_TXC1': '$40', # USART Transmitt Complete + 'UCSR1A_UDRE1': '$20', # USART Data Register Empty + 'UCSR1A_FE1': '$10', # Framing Error + 'UCSR1A_DOR1': '$8', # Data overRun + 'UCSR1A_UPE1': '$4', # Parity Error + 'UCSR1A_U2X1': '$2', # Double the USART transmission + 'UCSR1A_MPCM1': '$1', # Multi-processor Communication + 'UCSR1B' : '$c9', # USART Control and Status Regis + 'UCSR1B_RXCIE1': '$80', # RX Complete Interrupt Enable + 'UCSR1B_TXCIE1': '$40', # TX Complete Interrupt Enable + 'UCSR1B_UDRIE1': '$20', # USART Data register Empty Inte + 'UCSR1B_RXEN1': '$10', # Receiver Enable + 'UCSR1B_TXEN1': '$8', # Transmitter Enable + 'UCSR1B_UCSZ12': '$4', # Character Size + 'UCSR1B_RXB81': '$2', # Receive Data Bit 8 + 'UCSR1B_TXB81': '$1', # Transmit Data Bit 8 + 'UCSR1C' : '$ca', # USART Control and Status Regis + 'UCSR1C_UMSEL1': '$40', # USART Mode Select + 'UCSR1C_UPM1': '$30', # Parity Mode Bits + 'UCSR1C_USBS1': '$8', # Stop Bit Select + 'UCSR1C_UCSZ1': '$6', # Character Size + 'UCSR1C_UCPOL1': '$1', # Clock Polarity + 'UBRR1' : '$cc', # USART Baud Rate Register t Byt + +# Module CPU + 'SREG' : '$5f', # Status Register + 'SREG_I': '$80', # Global Interrupt Enable + 'SREG_T': '$40', # Bit Copy Storage + 'SREG_H': '$20', # Half Carry Flag + 'SREG_S': '$10', # Sign Bit + 'SREG_V': '$8', # Two's Complement Overflow Flag + 'SREG_N': '$4', # Negative Flag + 'SREG_Z': '$2', # Zero Flag + 'SREG_C': '$1', # Carry Flag + 'SP' : '$5d', # Stack Pointer + 'MCUCR' : '$55', # MCU Control Register + 'MCUCR_PUD': '$10', # Pull-up disable + 'MCUCR_IVSEL': '$2', # Interrupt Vector Select + 'MCUCR_IVCE': '$1', # Interrupt Vector Change Enable + 'MCUSR' : '$54', # MCU Status Register + 'MCUSR_JTRF': '$10', # JTAG Reset Flag + 'MCUSR_WDRF': '$8', # Watchdog Reset Flag + 'MCUSR_BORF': '$4', # Brown-out Reset Flag + 'MCUSR_EXTRF': '$2', # External Reset Flag + 'MCUSR_PORF': '$1', # Power-on reset flag + 'XMCRA' : '$74', # External Memory Control Regist + 'XMCRA_SRE': '$80', # External SRAM Enable + 'XMCRA_SRL': '$70', # Wait state page limit + 'XMCRA_SRW1': '$c', # Wait state select bit upper pa + 'XMCRA_SRW0': '$3', # Wait state select bit lower pa + 'XMCRB' : '$75', # External Memory Control Regist + 'XMCRB_XMBK': '$80', # External Memory Bus Keeper Ena + 'XMCRB_XMM': '$7', # External Memory High Mask + 'OSCCAL' : '$66', # Oscillator Calibration Value + 'CLKPR' : '$61', # Clock Prescale Register + 'CLKPR_CLKPCE': '$80', # + 'CLKPR_CLKPS': '$f', # + 'SMCR' : '$53', # Sleep Mode Control Register + 'SMCR_SM': '$e', # Sleep Mode Select bits + 'SMCR_SE': '$1', # Sleep Enable + 'RAMPZ' : '$5b', # RAM Page Z Select Register + 'RAMPZ_RAMPZ0': '$1', # RAM Page Z Select Register Bit + 'GPIOR2' : '$4b', # General Purpose IO Register 2 + 'GPIOR2_GPIOR': '$ff', # General Purpose IO Register 2 + 'GPIOR1' : '$4a', # General Purpose IO Register 1 + 'GPIOR1_GPIOR': '$ff', # General Purpose IO Register 1 + 'GPIOR0' : '$3e', # General Purpose IO Register 0 + 'GPIOR0_GPIOR07': '$80', # General Purpose IO Register 0 + 'GPIOR0_GPIOR06': '$40', # General Purpose IO Register 0 + 'GPIOR0_GPIOR05': '$20', # General Purpose IO Register 0 + 'GPIOR0_GPIOR04': '$10', # General Purpose IO Register 0 + 'GPIOR0_GPIOR03': '$8', # General Purpose IO Register 0 + 'GPIOR0_GPIOR02': '$4', # General Purpose IO Register 0 + 'GPIOR0_GPIOR01': '$2', # General Purpose IO Register 0 + 'GPIOR0_GPIOR00': '$1', # General Purpose IO Register 0 + +# Module BOOT_LOAD + 'SPMCSR' : '$57', # Store Program Memory Control R + 'SPMCSR_SPMIE': '$80', # SPM Interrupt Enable + 'SPMCSR_RWWSB': '$40', # Read While Write Section Busy + 'SPMCSR_RWWSRE': '$10', # Read While Write section read + 'SPMCSR_BLBSET': '$8', # Boot Lock Bit Set + 'SPMCSR_PGWRT': '$4', # Page Write + 'SPMCSR_PGERS': '$2', # Page Erase + 'SPMCSR_SPMEN': '$1', # Store Program Memory Enable + +# Module EXTERNAL_INTERRUPT + 'EICRA' : '$69', # External Interrupt Control Reg + 'EICRA_ISC3': '$c0', # External Interrupt Sense Contr + 'EICRA_ISC2': '$30', # External Interrupt Sense Contr + 'EICRA_ISC1': '$c', # External Interrupt Sense Contr + 'EICRA_ISC0': '$3', # External Interrupt Sense Contr + 'EICRB' : '$6a', # External Interrupt Control Reg + 'EICRB_ISC7': '$c0', # External Interrupt 7-4 Sense C + 'EICRB_ISC6': '$30', # External Interrupt 7-4 Sense C + 'EICRB_ISC5': '$c', # External Interrupt 7-4 Sense C + 'EICRB_ISC4': '$3', # External Interrupt 7-4 Sense C + 'EIMSK' : '$3d', # External Interrupt Mask Regist + 'EIMSK_INT': '$ff', # External Interrupt Request 7 E + 'EIFR' : '$3c', # External Interrupt Flag Regist + 'EIFR_INTF': '$ff', # External Interrupt Flags + +# Module EEPROM + 'EEAR' : '$41', # EEPROM Read/Write Access Byte + 'EEDR' : '$40', # EEPROM Data Register + 'EECR' : '$3f', # EEPROM Control Register + 'EECR_EERIE': '$8', # EEPROM Ready Interrupt Enable + 'EECR_EEMWE': '$4', # EEPROM Master Write Enable + 'EECR_EEWE': '$2', # EEPROM Write Enable + 'EECR_EERE': '$1', # EEPROM Read Enable + +# Module PORTG + 'PORTG' : '$34', # Data Register, Port G + 'DDRG' : '$33', # Data Direction Register, Port + 'PING' : '$32', # Input Pins, Port G + +# Module TIMER_COUNTER_0 + 'TCCR0A' : '$44', # Timer/Counter0 Control Registe + 'TCCR0A_FOC0A': '$80', # Force Output Compare + 'TCCR0A_WGM00': '$40', # Waveform Generation Mode 0 + 'TCCR0A_COM0A': '$30', # Compare Match Output Modes + 'TCCR0A_WGM01': '$8', # Waveform Generation Mode 1 + 'TCCR0A_CS0': '$7', # Clock Selects + 'TCNT0' : '$46', # Timer/Counter0 + 'OCR0A' : '$47', # Timer/Counter0 Output Compare + 'TIMSK0' : '$6e', # Timer/Counter0 Interrupt Mask + 'TIMSK0_OCIE0A': '$2', # Timer/Counter0 Output Compare + 'TIMSK0_TOIE0': '$1', # Timer/Counter0 Overflow Interr + 'TIFR0' : '$35', # Timer/Counter0 Interrupt Flag + 'TIFR0_OCF0A': '$2', # Timer/Counter0 Output Compare + 'TIFR0_TOV0': '$1', # Timer/Counter0 Overflow Flag + 'GTCCR' : '$43', # General Timer/Control Register + 'GTCCR_TSM': '$80', # Timer/Counter Synchronization + 'GTCCR_PSR310': '$1', # Prescaler Reset Timer/Counter1 + +# Module TIMER_COUNTER_1 + 'TCCR1A' : '$80', # Timer/Counter1 Control Registe + 'TCCR1A_COM1A': '$c0', # Compare Output Mode 1A, bits + 'TCCR1A_COM1B': '$30', # Compare Output Mode 1B, bits + 'TCCR1A_COM1C': '$c', # Compare Output Mode 1C, bits + 'TCCR1A_WGM1': '$3', # Waveform Generation Mode + 'TCCR1B' : '$81', # Timer/Counter1 Control Registe + 'TCCR1B_ICNC1': '$80', # Input Capture 1 Noise Canceler + 'TCCR1B_ICES1': '$40', # Input Capture 1 Edge Select + 'TCCR1B_WGM1': '$18', # Waveform Generation Mode + 'TCCR1B_CS1': '$7', # Prescaler source of Timer/Coun + 'TCCR1C' : '$82', # Timer/Counter 1 Control Regist + 'TCCR1C_FOC1A': '$80', # Force Output Compare 1A + 'TCCR1C_FOC1B': '$40', # Force Output Compare 1B + 'TCCR1C_FOC1C': '$20', # Force Output Compare 1C + 'TCNT1' : '$84', # Timer/Counter1 Bytes + 'OCR1A' : '$88', # Timer/Counter1 Output Compare + 'OCR1B' : '$8a', # Timer/Counter1 Output Compare + 'OCR1C' : '$8c', # Timer/Counter1 Output Compare + 'ICR1' : '$86', # Timer/Counter1 Input Capture R + 'TIMSK1' : '$6f', # Timer/Counter Interrupt Mask R + 'TIMSK1_ICIE1': '$20', # Timer/Counter1 Input Capture I + 'TIMSK1_OCIE1C': '$8', # Timer/Counter1 Output CompareC + 'TIMSK1_OCIE1B': '$4', # Timer/Counter1 Output CompareB + 'TIMSK1_OCIE1A': '$2', # Timer/Counter1 Output CompareA + 'TIMSK1_TOIE1': '$1', # Timer/Counter1 Overflow Interr + 'TIFR1' : '$36', # Timer/Counter Interrupt Flag r + 'TIFR1_ICF1': '$20', # Input Capture Flag 1 + 'TIFR1_OCF1C': '$8', # Output Compare Flag 1C + 'TIFR1_OCF1B': '$4', # Output Compare Flag 1B + 'TIFR1_OCF1A': '$2', # Output Compare Flag 1A + 'TIFR1_TOV1': '$1', # Timer/Counter1 Overflow Flag + +# Module TIMER_COUNTER_3 + 'TCCR3A' : '$90', # Timer/Counter3 Control Registe + 'TCCR3A_COM3A': '$c0', # Compare Output Mode 3A, bits + 'TCCR3A_COM3B': '$30', # Compare Output Mode 3B, bits + 'TCCR3A_COM3C': '$c', # Compare Output Mode 3C, bits + 'TCCR3A_WGM3': '$3', # Waveform Generation Mode + 'TCCR3B' : '$91', # Timer/Counter3 Control Registe + 'TCCR3B_ICNC3': '$80', # Input Capture 3 Noise Canceler + 'TCCR3B_ICES3': '$40', # Input Capture 3 Edge Select + 'TCCR3B_WGM3': '$18', # Waveform Generation Mode + 'TCCR3B_CS3': '$7', # Prescaler source of Timer/Coun + 'TCCR3C' : '$92', # Timer/Counter 3 Control Regist + 'TCCR3C_FOC3A': '$80', # Force Output Compare 3A + 'TCCR3C_FOC3B': '$40', # Force Output Compare 3B + 'TCCR3C_FOC3C': '$20', # Force Output Compare 3C + 'TCNT3' : '$94', # Timer/Counter3 Bytes + 'OCR3A' : '$98', # Timer/Counter3 Output Compare + 'OCR3B' : '$9a', # Timer/Counter3 Output Compare + 'OCR3C' : '$9c', # Timer/Counter3 Output Compare + 'ICR3' : '$96', # Timer/Counter3 Input Capture R + 'TIMSK3' : '$71', # Timer/Counter Interrupt Mask R + 'TIMSK3_ICIE3': '$20', # Timer/Counter3 Input Capture I + 'TIMSK3_OCIE3C': '$8', # Timer/Counter3 Output CompareC + 'TIMSK3_OCIE3B': '$4', # Timer/Counter3 Output CompareB + 'TIMSK3_OCIE3A': '$2', # Timer/Counter3 Output CompareA + 'TIMSK3_TOIE3': '$1', # Timer/Counter3 Overflow Interr + 'TIFR3' : '$38', # Timer/Counter Interrupt Flag r + 'TIFR3_ICF3': '$20', # Input Capture Flag 3 + 'TIFR3_OCF3C': '$8', # Output Compare Flag 3C + 'TIFR3_OCF3B': '$4', # Output Compare Flag 3B + 'TIFR3_OCF3A': '$2', # Output Compare Flag 3A + 'TIFR3_TOV3': '$1', # Timer/Counter3 Overflow Flag + +# Module TIMER_COUNTER_2 + 'TCCR2' : '$b0', # Timer/Counter2 Control Registe + 'TCCR2_FOC2A': '$80', # Force Output Compare + 'TCCR2_WGM20': '$40', # Waveform Genration Mode + 'TCCR2_COM2A': '$30', # Compare Output Mode bits + 'TCCR2_WGM21': '$8', # Waveform Generation Mode + 'TCCR2_CS2': '$7', # Clock Select bits + 'TCNT2' : '$b2', # Timer/Counter2 + 'OCR2A' : '$b3', # Timer/Counter2 Output Compare + 'TIMSK2' : '$70', # Timer/Counter Interrupt Mask r + 'TIMSK2_OCIE2A': '$2', # Timer/Counter2 Output Compare + 'TIMSK2_TOIE2': '$1', # Timer/Counter2 Overflow Interr + 'TIFR2' : '$37', # Timer/Counter Interrupt Flag R + 'TIFR2_OCF2A': '$2', # Output Compare Flag 2 + 'TIFR2_TOV2': '$1', # Timer/Counter2 Overflow Flag + 'GTCCR' : '$43', # General Timer/Counter Control + 'GTCCR_PSR2': '$2', # Prescaler Reset Timer/Counter2 + 'ASSR' : '$b6', # Asynchronous Status Register + 'ASSR_EXCLK': '$10', # Enable External Clock Interrup + 'ASSR_AS2': '$8', # AS2: Asynchronous Timer/Counte + 'ASSR_TCN2UB': '$4', # TCN2UB: Timer/Counter2 Update + 'ASSR_OCR2UB': '$2', # Output Compare Register2 Updat + 'ASSR_TCR2UB': '$1', # TCR2UB: Timer/Counter Control + +# Module WATCHDOG + 'WDTCR' : '$60', # Watchdog Timer Control Registe + 'WDTCR_WDCE': '$10', # Watchdog Change Enable + 'WDTCR_WDE': '$8', # Watch Dog Enable + 'WDTCR_WDP': '$7', # Watch Dog Timer Prescaler bits + +# Module AD_CONVERTER + 'ADMUX' : '$7c', # The ADC multiplexer Selection + 'ADMUX_REFS': '$c0', # Reference Selection Bits + 'ADMUX_ADLAR': '$20', # Left Adjust Result + 'ADMUX_MUX': '$1f', # Analog Channel and Gain Select + 'ADCSRA' : '$7a', # The ADC Control and Status reg + 'ADCSRA_ADEN': '$80', # ADC Enable + 'ADCSRA_ADSC': '$40', # ADC Start Conversion + 'ADCSRA_ADATE': '$20', # ADC Auto Trigger Enable + 'ADCSRA_ADIF': '$10', # ADC Interrupt Flag + 'ADCSRA_ADIE': '$8', # ADC Interrupt Enable + 'ADCSRA_ADPS': '$7', # ADC Prescaler Select Bits + 'ADC' : '$78', # ADC Data Register Bytes + 'ADCSRB' : '$7b', # ADC Control and Status Registe + 'ADCSRB_ADHSM': '$80', # ADC High Speed Mode + 'ADCSRB_ADTS': '$7', # ADC Auto Trigger Sources + 'DIDR0' : '$7e', # Digital Input Disable Register + 'DIDR0_ADC7D': '$80', # ADC7 Digital input Disable + 'DIDR0_ADC6D': '$40', # ADC6 Digital input Disable + 'DIDR0_ADC5D': '$20', # ADC5 Digital input Disable + 'DIDR0_ADC4D': '$10', # ADC4 Digital input Disable + 'DIDR0_ADC3D': '$8', # ADC3 Digital input Disable + 'DIDR0_ADC2D': '$4', # ADC2 Digital input Disable + 'DIDR0_ADC1D': '$2', # ADC1 Digital input Disable + 'DIDR0_ADC0D': '$1', # ADC0 Digital input Disable + +# Module ANALOG_COMPARATOR + 'ADCSRB' : '$7b', # ADC Control and Status Registe + 'ADCSRB_ACME': '$40', # Analog Comparator Multiplexer + 'ACSR' : '$50', # Analog Comparator Control And + 'ACSR_ACD': '$80', # Analog Comparator Disable + 'ACSR_ACBG': '$40', # Analog Comparator Bandgap Sele + 'ACSR_ACO': '$20', # Analog Compare Output + 'ACSR_ACI': '$10', # Analog Comparator Interrupt Fl + 'ACSR_ACIE': '$8', # Analog Comparator Interrupt En + 'ACSR_ACIC': '$4', # Analog Comparator Input Captur + 'ACSR_ACIS': '$3', # Analog Comparator Interrupt Mo + 'DIDR1' : '$7f', # + 'DIDR1_AIN1D': '$2', # AIN1 Digital Input Disable + 'DIDR1_AIN0D': '$1', # AIN0 Digital Input Disable + +# Module CAN + 'CANGCON' : '$d8', # CAN General Control Register + 'CANGCON_ABRQ': '$80', # Abort Request + 'CANGCON_OVRQ': '$40', # Overload Frame Request + 'CANGCON_TTC': '$20', # Time Trigger Communication + 'CANGCON_SYNTTC': '$10', # Synchronization of TTC + 'CANGCON_LISTEN': '$8', # Listening Mode + 'CANGCON_TEST': '$4', # Test Mode + 'CANGCON_ENASTB': '$2', # Enable / Standby + 'CANGCON_SWRES': '$1', # Software Reset Request + 'CANGSTA' : '$d9', # CAN General Status Register + 'CANGSTA_OVRG': '$40', # Overload Frame Flag + 'CANGSTA_TXBSY': '$10', # Transmitter Busy + 'CANGSTA_RXBSY': '$8', # Receiver Busy + 'CANGSTA_ENFG': '$4', # Enable Flag + 'CANGSTA_BOFF': '$2', # Bus Off Mode + 'CANGSTA_ERRP': '$1', # Error Passive Mode + 'CANGIT' : '$da', # CAN General Interrupt Register + 'CANGIT_CANIT': '$80', # General Interrupt Flag + 'CANGIT_BOFFIT': '$40', # Bus Off Interrupt Flag + 'CANGIT_OVRTIM': '$20', # Overrun CAN Timer + 'CANGIT_BXOK': '$10', # Burst Receive Interrupt + 'CANGIT_SERG': '$8', # Stuff Error General + 'CANGIT_CERG': '$4', # CRC Error General + 'CANGIT_FERG': '$2', # Form Error General + 'CANGIT_AERG': '$1', # Ackknowledgement Error General + 'CANGIE' : '$db', # CAN General Interrupt Enable R + 'CANGIE_ENIT': '$80', # Enable all Interrupts + 'CANGIE_ENBOFF': '$40', # Enable Bus Off INterrupt + 'CANGIE_ENRX': '$20', # Enable Receive Interrupt + 'CANGIE_ENTX': '$10', # Enable Transmitt Interrupt + 'CANGIE_ENERR': '$8', # Enable MOb Error Interrupt + 'CANGIE_ENBX': '$4', # Enable Burst Receive Interrupt + 'CANGIE_ENERG': '$2', # Enable General Error Interrupt + 'CANGIE_ENOVRT': '$1', # Enable CAN Timer Overrun Inter + 'CANEN2' : '$dc', # Enable MOb Register + 'CANEN1' : '$dd', # Enable MOb Register + 'CANIE2' : '$de', # Enable Interrupt MOb Register + 'CANIE1' : '$df', # Enable Interrupt MOb Register + 'CANSIT2' : '$e0', # CAN Status Interrupt MOb Regis + 'CANSIT1' : '$e1', # CAN Status Interrupt MOb Regis + 'CANBT1' : '$e2', # Bit Timing Register 1 + 'CANBT1_BRP': '$7e', # Baud Rate Prescaler bits + 'CANBT2' : '$e3', # Bit Timing Register 2 + 'CANBT2_SJW': '$60', # Re-Sync Jump Width + 'CANBT2_PRS': '$e', # Propagation Time Segment + 'CANBT3' : '$e4', # Bit Timing Register 3 + 'CANBT3_PHS2': '$70', # Phase Segments + 'CANBT3_PHS1': '$e', # Phase Segment 1 + 'CANBT3_SMP': '$1', # Sample Type + 'CANTCON' : '$e5', # Timer Control Register + 'CANTIML' : '$e6', # Timer Register Low + 'CANTIMH' : '$e7', # Timer Register High + 'CANTTCL' : '$e8', # TTC Timer Register Low + 'CANTTCH' : '$e9', # TTC Timer Register High + 'CANTEC' : '$ea', # Transmit Error Counter Registe + 'CANREC' : '$eb', # Receive Error Counter Register + 'CANHPMOB' : '$ec', # Highest Priority MOb Register + 'CANPAGE' : '$ed', # Page MOb Register + 'CANPAGE_MOBNB': '$f0', # MOb Number Bits + 'CANPAGE_AINC': '$8', # MOb Data Buffer Auto Increment + 'CANPAGE_INDX': '$7', # Data Buffer Index Bits + 'CANSTMOB' : '$ee', # MOb Status Register + 'CANSTMOB_DLCW': '$80', # Data Length Code Warning + 'CANSTMOB_TXOK': '$40', # Transmit OK + 'CANSTMOB_RXOK': '$20', # Receive OK + 'CANSTMOB_BERR': '$10', # Bit Error + 'CANSTMOB_SERR': '$8', # Stuff Error + 'CANSTMOB_CERR': '$4', # CRC Error + 'CANSTMOB_FERR': '$2', # Form Error + 'CANSTMOB_AERR': '$1', # Ackknowledgement Error + 'CANCDMOB' : '$ef', # MOb Control and DLC Register + 'CANCDMOB_CONMOB': '$c0', # MOb Config Bits + 'CANCDMOB_RPLV': '$20', # Reply Valid + 'CANCDMOB_IDE': '$10', # Identifier Extension + 'CANCDMOB_DLC': '$f', # Data Length Code Bits + 'CANIDT4' : '$f0', # Identifier Tag Register 4 + 'CANIDT3' : '$f1', # Identifier Tag Register 3 + 'CANIDT2' : '$f2', # Identifier Tag Register 2 + 'CANIDT1' : '$f3', # Identifier Tag Register 1 + 'CANIDM4' : '$f4', # Identifier Mask Register 4 + 'CANIDM3' : '$f5', # Identifier Mask Register 3 + 'CANIDM2' : '$f6', # Identifier Mask Register 2 + 'CANIDM1' : '$f7', # Identifier Mask Register 1 + 'CANSTML' : '$f8', # Time Stamp Register Low + 'CANSTMH' : '$f9', # Time Stamp Register High + 'CANMSG' : '$fa', # Message Data Register + + '__amforth_dummy':'0' +} diff --git a/amforth-6.5/avr8/devices/at90can128/words/no-jtag.asm b/amforth-6.5/avr8/devices/at90can128/words/no-jtag.asm new file mode 100644 index 0000000..352a4bb --- /dev/null +++ b/amforth-6.5/avr8/devices/at90can128/words/no-jtag.asm @@ -0,0 +1,14 @@ +; ( -- ) +; ( -- ) +; MCU +; disable jtag at runtime +VE_NOJTAG: + .dw $FF05 + .db "-jtag",0 + .dw VE_HEAD + .set VE_HEAD = VE_NOJTAG +XT_NOJTAG: + .dw PFA_NOJTAG +PFA_NOJTAG: + + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/devices/at90can128/words/no-wdt.asm b/amforth-6.5/avr8/devices/at90can128/words/no-wdt.asm new file mode 100644 index 0000000..4a12261 --- /dev/null +++ b/amforth-6.5/avr8/devices/at90can128/words/no-wdt.asm @@ -0,0 +1,22 @@ +; ( -- ) +; MCU +; disable watch dog timer at runtime +VE_NOWDT: + .dw $ff04 + .db "-wdt" + .dw VE_HEAD + .set VE_HEAD = VE_NOWDT +XT_NOWDT: + .dw PFA_NOWDT +PFA_NOWDT: + +; Reset WDT + wdr +; Write logical one to WDTOE and WDE + in_ temp1, WDTCR + ori temp1, (1< +.include "words/sign.asm" +.include "words/d-dot-r.asm" +.include "words/dot-r.asm" +.include "words/d-dot.asm" +.include "words/dot.asm" +.include "words/ud-dot.asm" +.include "words/ud-dot-r.asm" +.include "words/ud-slash-mod.asm" +.include "words/digit-q.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/do-sliteral.asm" +.include "words/scomma.asm" +.include "words/itype.asm" +.include "words/icount.asm" +.include "words/cr.asm" +.include "words/space.asm" +.include "words/spaces.asm" +.include "words/type.asm" +.include "words/tick.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/handler.asm" +.include "words/catch.asm" +.include "words/throw.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/cskip.asm" +.include "words/cscan.asm" +.include "words/accept.asm" +.include "words/refill.asm" +.include "words/char.asm" +.include "words/number.asm" +.include "words/q-sign.asm" +.include "words/set-base.asm" +.include "words/to-number.asm" +.include "words/parse.asm" +.include "words/source.asm" +.include "words/slash-string.asm" +.include "words/parse-name.asm" +.include "words/find-xt.asm" + +.include "words/quit.asm" +.include "words/prompt-ok.asm" +.include "words/prompt-ready.asm" +.include "words/prompt-error.asm" +.include "words/pause.asm" +.include "words/cold.asm" +.include "words/warm.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/sp0.asm" +.include "words/rp0.asm" +.include "words/depth.asm" +.include "words/recognize.asm" +.include "words/forth-recognizer.asm" +.include "words/interpret.asm" +.include "words/rec-intnum.asm" +.include "words/rec-find.asm" +.include "words/dt-null.asm" + +.include "words/q-stack.asm" +.include "words/ver.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/noop.asm" +.include "words/unused.asm" + +.include "words/to.asm" +.include "words/i-cellplus.asm" + +.include "words/edefer-fetch.asm" +.include "words/edefer-store.asm" +.include "words/rdefer-fetch.asm" +.include "words/rdefer-store.asm" +.include "words/udefer-fetch.asm" +.include "words/udefer-store.asm" +.include "words/defer-store.asm" +.include "words/defer-fetch.asm" +.include "words/do-defer.asm" + +.include "words/search-wordlist.asm" +.include "words/traverse-wordlist.asm" +.include "words/name2string.asm" +.include "words/nfa2cfa.asm" +.include "words/icompare.asm" + +.include "words/star.asm" +.include "words/j.asm" + +.include "words/dabs.asm" +.include "words/dnegate.asm" +.include "words/cmove.asm" +.include "words/2swap.asm" + +.include "words/tib.asm" + +.include "words/init-ram.asm" +.include "words/bounds.asm" +.include "words/s-to-d.asm" +.include "words/to-body.asm" diff --git a/amforth-6.5/avr8/dict/appl_4k.inc b/amforth-6.5/avr8/dict/appl_4k.inc new file mode 100644 index 0000000..8cc8451 --- /dev/null +++ b/amforth-6.5/avr8/dict/appl_4k.inc @@ -0,0 +1,81 @@ +.include "words/ver.asm" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/noop.asm" +.include "words/unused.asm" +.include "words/to.asm" +.include "words/i-cellplus.asm" +.include "words/icompare.asm" +.include "words/star.asm" +.include "words/j.asm" +.include "words/dabs.asm" +.include "words/dnegate.asm" +.include "words/cmove.asm" +.include "words/2swap.asm" +.include "words/tib.asm" +.include "words/init-ram.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +.include "words/environment.asm" +.include "words/env-wordlists.asm" +.include "words/env-slashpad.asm" +.include "words/env-slashhold.asm" +.include "words/env-forthname.asm" +.include "words/env-forthversion.asm" +.include "words/env-cpu.asm" +.include "words/env-mcuinfo.asm" +.include "words/env-usersize.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/hld.asm" +.include "words/hold.asm" +.include "words/less-sharp.asm" ; <# +.include "words/sharp.asm" +.include "words/sharp-s.asm" +.include "words/sharp-greater.asm" ; #> +.include "words/sign.asm" +.include "words/d-dot-r.asm" +.include "words/dot-r.asm" +.include "words/d-dot.asm" +.include "words/dot.asm" +.include "words/ud-dot.asm" +.include "words/ud-dot-r.asm" +.include "words/ud-slash-mod.asm" +.include "words/digit-q.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/do-sliteral.asm" +.include "words/scomma.asm" +.include "words/itype.asm" +.include "words/icount.asm" +.include "words/type.asm" +.include "words/tick.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/cskip.asm" +.include "words/cscan.asm" +.include "words/accept.asm" +.include "words/refill.asm" +.include "words/char.asm" +.include "words/number.asm" +.include "words/q-sign.asm" +.include "words/set-base.asm" +.include "words/to-number.asm" +.include "words/parse.asm" +.include "words/source.asm" +.include "words/slash-string.asm" +.include "words/parse-name.asm" +.include "words/sp0.asm" +.include "words/rp0.asm" +.include "words/depth.asm" +.include "words/forth-recognizer.asm" +.include "words/recognize.asm" +.include "words/interpret.asm" +.include "words/rec-intnum.asm" +.include "words/rec-find.asm" +.include "words/dt-null.asm" +.include "words/search-wordlist.asm" +.include "words/traverse-wordlist.asm" +.include "words/name2string.asm" +.include "words/nfa2cfa.asm" +.include "words/find-xt.asm" + +.include "dict/compiler1.inc" diff --git a/amforth-6.5/avr8/dict/appl_8k.inc b/amforth-6.5/avr8/dict/appl_8k.inc new file mode 100644 index 0000000..bfedb0a --- /dev/null +++ b/amforth-6.5/avr8/dict/appl_8k.inc @@ -0,0 +1 @@ +.include "dict/compiler1.inc" diff --git a/amforth-6.5/avr8/dict/compiler1.inc b/amforth-6.5/avr8/dict/compiler1.inc new file mode 100644 index 0000000..7baa432 --- /dev/null +++ b/amforth-6.5/avr8/dict/compiler1.inc @@ -0,0 +1,70 @@ + +.include "words/newest.asm" +.include "words/latest.asm" +.include "words/do-create.asm" +.include "words/backslash.asm" +.include "words/l-paren.asm" + +.include "words/compile.asm" +.include "words/comma.asm" +.include "words/brackettick.asm" + + +.include "words/literal.asm" +.include "words/sliteral.asm" +.include "words/g-mark.asm" +.include "words/g-resolve.asm" +.include "words/l_mark.asm" +.include "words/l_resolve.asm" + +.include "words/ahead.asm" +.include "words/if.asm" +.include "words/else.asm" +.include "words/then.asm" +.include "words/begin.asm" +.include "words/while.asm" +.include "words/repeat.asm" +.include "words/until.asm" +.include "words/again.asm" +.include "words/do.asm" +.include "words/loop.asm" +.include "words/plusloop.asm" +.include "words/leave.asm" +.include "words/qdo.asm" +.include "words/endloop.asm" +; leave address stack +.include "words/l-from.asm" +.include "words/to-l.asm" +.include "words/lp0.asm" +.include "words/lp.asm" + +.include "words/create.asm" +.include "words/header.asm" +.include "words/wlscope.asm" +.include "words/reveal.asm" +.include "words/does.asm" +.include "words/colon.asm" +.include "words/colon-noname.asm" +.include "words/semicolon.asm" +.include "words/right-bracket.asm" +.include "words/left-bracket.asm" +.include "words/variable.asm" +.include "words/constant.asm" +.include "words/user.asm" + +.include "words/recurse.asm" +.include "words/immediate.asm" + +.include "words/bracketchar.asm" +.include "words/abort-string.asm" +.include "words/abort.asm" +.include "words/q-abort.asm" + +.include "words/get-stack.asm" +.include "words/set-stack.asm" +.include "words/map-stack.asm" +.include "words/get-current.asm" +.include "words/get-order.asm" +.include "words/cfg-order.asm" +.include "words/compare.asm" +.include "words/nfa2lfa.asm" diff --git a/amforth-6.5/avr8/dict/compiler2.inc b/amforth-6.5/avr8/dict/compiler2.inc new file mode 100644 index 0000000..5d06a55 --- /dev/null +++ b/amforth-6.5/avr8/dict/compiler2.inc @@ -0,0 +1,19 @@ +; words from this file are optional. They can be +; included almost independently from each other +; on a include-per-use basis +; +.if DICT_COMPILER2 == 0 +.set DICT_COMPILER2 = 1 + +.include "words/set-current.asm" +.include "words/wordlist.asm" + +.include "words/forth-wordlist.asm" +.include "words/set-order.asm" +.include "words/set-recognizer.asm" +.include "words/get-recognizer.asm" +.include "words/code.asm" +.include "words/end-code.asm" +.include "words/marker.asm" +.include "words/postpone.asm" +.endif diff --git a/amforth-6.5/avr8/dict/core_2k.inc b/amforth-6.5/avr8/dict/core_2k.inc new file mode 100644 index 0000000..5ac1e93 --- /dev/null +++ b/amforth-6.5/avr8/dict/core_2k.inc @@ -0,0 +1,2 @@ +; this file contains nothing +; \ No newline at end of file diff --git a/amforth-6.5/avr8/dict/core_4k.inc b/amforth-6.5/avr8/dict/core_4k.inc new file mode 100644 index 0000000..6e083d5 --- /dev/null +++ b/amforth-6.5/avr8/dict/core_4k.inc @@ -0,0 +1,98 @@ +; first the assembly words to keep them +; in a short distance to DO_NEXT +.include "words/n_to_r.asm" +.include "words/n_r_from.asm" +.include "words/d-2star.asm" +.include "words/d-2slash.asm" +.include "words/d-plus.asm" +.include "words/d-minus.asm" +.include "words/d-invert.asm" +.include "words/slashmod.asm" +.include "words/abs.asm" +.include "words/pick.asm" +.include "words/cellplus.asm" +.include "dict/interrupt.inc" + +; now the relocatable colon words +.include "words/prompt-ok.asm" +.include "words/prompt-ready.asm" +.include "words/prompt-error.asm" + +.include "words/quit.asm" +.include "words/pause.asm" +.include "words/cold.asm" +.include "words/warm.asm" + +.include "words/handler.asm" +.include "words/catch.asm" +.include "words/throw.asm" + + +.include "words/edefer-fetch.asm" +.include "words/edefer-store.asm" +.include "words/rdefer-fetch.asm" +.include "words/rdefer-store.asm" +.include "words/udefer-fetch.asm" +.include "words/udefer-store.asm" +.include "words/defer-store.asm" +.include "words/defer-fetch.asm" +.include "words/do-defer.asm" + +.include "words/u-dot.asm" +.include "words/u-dot-r.asm" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/uslashmod.asm" +.include "words/negate.asm" +.include "words/slash.asm" +.include "words/mod.asm" + +.include "words/min.asm" +.include "words/max.asm" +.include "words/within.asm" + +.include "words/show-wordlist.asm" +.include "words/words.asm" + +.include "words/dot-quote.asm" +.include "words/squote.asm" +.include "words/fill.asm" + +.include "words/f_cpu.asm" +.include "words/state.asm" +.include "words/base.asm" + +.include "words/cells.asm" + +.include "words/2dup.asm" +.include "words/2drop.asm" +.include "words/tuck.asm" + +.include "words/to-in.asm" +.include "words/pad.asm" +.include "words/emit.asm" +.include "words/emitq.asm" +.include "words/key.asm" +.include "words/keyq.asm" + +.include "words/dp.asm" +.include "words/ehere.asm" +.include "words/here.asm" +.include "words/allot.asm" + +.include "words/bin.asm" +.include "words/decimal.asm" +.include "words/hex.asm" +.include "words/bl.asm" + +.include "words/turnkey.asm" +.include "words/to-upper.asm" +.include "words/to-lower.asm" + +.include "words/q-stack.asm" +.include "words/bounds.asm" +.include "words/cr.asm" +.include "words/space.asm" +.include "words/spaces.asm" +.include "words/s-to-d.asm" +.include "words/to-body.asm" diff --git a/amforth-6.5/avr8/dict/core_8k.inc b/amforth-6.5/avr8/dict/core_8k.inc new file mode 100644 index 0000000..ed5b805 --- /dev/null +++ b/amforth-6.5/avr8/dict/core_8k.inc @@ -0,0 +1,180 @@ + +.include "words/n_to_r.asm" +.include "words/n_r_from.asm" + +.include "words/d-2star.asm" +.include "words/d-2slash.asm" +.include "words/d-plus.asm" +.include "words/d-minus.asm" +.include "words/d-invert.asm" +.include "words/u-dot.asm" +.include "words/u-dot-r.asm" + +.include "words/show-wordlist.asm" +.include "words/words.asm" +.include "dict/interrupt.inc" + +.include "words/pick.asm" +.include "words/dot-quote.asm" +.include "words/squote.asm" + +.include "words/fill.asm" + +.include "words/environment.asm" +.include "words/env-wordlists.asm" +.include "words/env-slashpad.asm" +.include "words/env-slashhold.asm" +.include "words/env-forthname.asm" +.include "words/env-forthversion.asm" +.include "words/env-cpu.asm" +.include "words/env-mcuinfo.asm" +.include "words/env-usersize.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/f_cpu.asm" +.include "words/state.asm" +.include "words/base.asm" + +.include "words/cells.asm" +.include "words/cellplus.asm" + +.include "words/2dup.asm" +.include "words/2drop.asm" + +.include "words/tuck.asm" + +.include "words/to-in.asm" +.include "words/pad.asm" +.include "words/emit.asm" +.include "words/emitq.asm" +.include "words/key.asm" +.include "words/keyq.asm" + +.include "words/dp.asm" +.include "words/ehere.asm" +.include "words/here.asm" +.include "words/allot.asm" + +.include "words/bin.asm" +.include "words/decimal.asm" +.include "words/hex.asm" +.include "words/bl.asm" + +.include "words/turnkey.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/slashmod.asm" +.include "words/uslashmod.asm" +.include "words/negate.asm" +.include "words/slash.asm" +.include "words/mod.asm" +.include "words/abs.asm" +.include "words/min.asm" +.include "words/max.asm" +.include "words/within.asm" + +.include "words/to-upper.asm" +.include "words/to-lower.asm" +;;;;;;;;;;;;;;;;;;;;;; +.include "words/hld.asm" +.include "words/hold.asm" +.include "words/less-sharp.asm" ; <# +.include "words/sharp.asm" +.include "words/sharp-s.asm" +.include "words/sharp-greater.asm" ; #> +.include "words/sign.asm" +.include "words/d-dot-r.asm" +.include "words/dot-r.asm" +.include "words/d-dot.asm" +.include "words/dot.asm" +.include "words/ud-dot.asm" +.include "words/ud-dot-r.asm" +.include "words/ud-slash-mod.asm" +.include "words/digit-q.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/do-sliteral.asm" +.include "words/scomma.asm" +.include "words/itype.asm" +.include "words/icount.asm" +.include "words/cr.asm" +.include "words/space.asm" +.include "words/spaces.asm" +.include "words/type.asm" +.include "words/tick.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/handler.asm" +.include "words/catch.asm" +.include "words/throw.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/cskip.asm" +.include "words/cscan.asm" +.include "words/accept.asm" +.include "words/refill.asm" +.include "words/char.asm" +.include "words/number.asm" +.include "words/q-sign.asm" +.include "words/set-base.asm" +.include "words/to-number.asm" +.include "words/parse.asm" +.include "words/source.asm" +.include "words/slash-string.asm" +.include "words/parse-name.asm" +.include "words/find-xt.asm" + +.include "words/prompt-ok.asm" +.include "words/prompt-ready.asm" +.include "words/prompt-error.asm" + +.include "words/quit.asm" +.include "words/pause.asm" +.include "words/cold.asm" +.include "words/warm.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/sp0.asm" +.include "words/rp0.asm" +.include "words/depth.asm" +.include "words/interpret.asm" +.include "words/forth-recognizer.asm" +.include "words/recognize.asm" +.include "words/rec-intnum.asm" +.include "words/rec-find.asm" +.include "words/dt-null.asm" + +.include "words/q-stack.asm" +.include "words/ver.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/noop.asm" +.include "words/unused.asm" + +.include "words/to.asm" +.include "words/i-cellplus.asm" + +.include "words/edefer-fetch.asm" +.include "words/edefer-store.asm" +.include "words/rdefer-fetch.asm" +.include "words/rdefer-store.asm" +.include "words/udefer-fetch.asm" +.include "words/udefer-store.asm" +.include "words/defer-store.asm" +.include "words/defer-fetch.asm" +.include "words/do-defer.asm" + +.include "words/search-wordlist.asm" +.include "words/traverse-wordlist.asm" +.include "words/name2string.asm" +.include "words/nfa2cfa.asm" +.include "words/icompare.asm" + +.include "words/star.asm" +.include "words/j.asm" + +.include "words/dabs.asm" +.include "words/dnegate.asm" +.include "words/cmove.asm" +.include "words/2swap.asm" + +.include "words/tib.asm" + +.include "words/init-ram.asm" +.include "dict/compiler2.inc" +.include "words/bounds.asm" +.include "words/s-to-d.asm" +.include "words/to-body.asm" diff --git a/amforth-6.5/avr8/dict/interrupt.inc b/amforth-6.5/avr8/dict/interrupt.inc new file mode 100644 index 0000000..a22c9b5 --- /dev/null +++ b/amforth-6.5/avr8/dict/interrupt.inc @@ -0,0 +1,16 @@ + +.if WANT_INTERRUPTS == 1 + +.if WANT_INTERRUPT_COUNTERS == 1 + .include "words/irqcnt.asm" +.endif + +.include "words/int-on.asm" +.include "words/int-off.asm" +.include "words/int-store.asm" +.include "words/int-fetch.asm" +.include "words/int-trap.asm" + +.include "words/isr-exec.asm" +.include "words/isr-end.asm" +.endif diff --git a/amforth-6.5/avr8/dict/nrww.inc b/amforth-6.5/avr8/dict/nrww.inc new file mode 100644 index 0000000..b46c307 --- /dev/null +++ b/amforth-6.5/avr8/dict/nrww.inc @@ -0,0 +1,114 @@ +; this part of the dictionay has to fit into the nrww flash +; section together with the forth inner interpreter + +.include "words/exit.asm" +.include "words/execute.asm" +.include "words/dobranch.asm" +.include "words/docondbranch.asm" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/doliteral.asm" +.include "words/dovariable.asm" +.include "words/doconstant.asm" +.include "words/douser.asm" +.include "words/do-value.asm" +.include "words/fetch.asm" +.include "words/store.asm" +.include "words/cstore.asm" +.include "words/cfetch.asm" +.include "words/fetch-u.asm" +.include "words/store-u.asm" + +;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/dup.asm" +.include "words/qdup.asm" +.include "words/swap.asm" +.include "words/over.asm" +.include "words/drop.asm" +.include "words/rot.asm" +.include "words/nip.asm" +;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/r_from.asm" +.include "words/to_r.asm" +.include "words/r_fetch.asm" + + +.include "words/not-equal.asm" +.include "words/equalzero.asm" +.include "words/lesszero.asm" +.include "words/greaterzero.asm" +.include "words/d-greaterzero.asm" +.include "words/d-lesszero.asm" + +.include "words/true.asm" +.include "words/zero.asm" +.include "words/uless.asm" +.include "words/u-greater.asm" +.include "words/less.asm" +.include "words/greater.asm" + +.include "words/log2.asm" +.include "words/minus.asm" +.include "words/plus.asm" +.include "words/mstar.asm" +.include "words/umslashmod.asm" +.include "words/umstar.asm" + +.include "words/invert.asm" +.include "words/2slash.asm" +.include "words/2star.asm" +.include "words/and.asm" +.include "words/or.asm" +.include "words/xor.asm" + +.include "words/1plus.asm" +.include "words/1minus.asm" +.include "words/q-negate.asm" +.include "words/lshift.asm" +.include "words/rshift.asm" +.include "words/plusstore.asm" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/rpfetch.asm" +.include "words/rpstore.asm" +.include "words/spfetch.asm" +.include "words/spstore.asm" + +.include "words/dodo.asm" +.include "words/i.asm" +.include "words/doplusloop.asm" +.include "words/doloop.asm" +.include "words/unloop.asm" + +;;;;;;;;;;;;;;;;;;;;;;;;;;; + +.include "words/cmove_g.asm" +.include "words/byteswap.asm" +.include "words/up.asm" +.include "words/1ms.asm" +.include "words/2to_r.asm" +.include "words/2r_from.asm" + +.include "words/store-e.asm" +.include "words/fetch-e.asm" +.include "words/store-i.asm" +.if FLASHEND > $10000 + .include "words/store-i_big.asm" +.else + .include "words/store-i_nrww.asm" +.endif +.include "words/fetch-i.asm" + +.if AMFORTH_NRWW_SIZE>8000 +.include "dict/core_8k.inc" +.elif AMFORTH_NRWW_SIZE>4000 +.include "dict/core_4k.inc" +.elif AMFORTH_NRWW_SIZE>2000 +.include "dict/core_2k.inc" +.else +.error "AMFORTH_NRWW_SIZE too small, cannot continue" +.endif +; now colon words +;;;;;;;;;;;;;;;;;;;;;;;; +.include "words/2literal.asm" +.include "words/equal.asm" +.include "words/num-constants.asm" diff --git a/amforth-6.5/avr8/dict/rww.inc b/amforth-6.5/avr8/dict/rww.inc new file mode 100644 index 0000000..a9ab0df --- /dev/null +++ b/amforth-6.5/avr8/dict/rww.inc @@ -0,0 +1,16 @@ +.include "words/mplus.asm" +.include "words/ud-star.asm" +.include "words/umax.asm" +.include "words/umin.asm" +.include "words/immediate-q.asm" +.include "words/name2flags.asm" + +.if AMFORTH_NRWW_SIZE > 8000 +.include "dict/appl_8k.inc" +.elif AMFORTH_NRWW_SIZE > 4000 +.include "dict/appl_4k.inc" +.elif AMFORTH_NRWW_SIZE > 2000 +.include "dict/appl_2k.inc" +.else +.error "AMFORTH_NRWW_SIZE too small. Cannot continue" +.endif diff --git a/amforth-6.5/avr8/drivers/1wire.asm b/amforth-6.5/avr8/drivers/1wire.asm new file mode 100644 index 0000000..ab5c9f4 --- /dev/null +++ b/amforth-6.5/avr8/drivers/1wire.asm @@ -0,0 +1,165 @@ +;; AUTHORs +; B. J. Rodriguez (MSP 430) +; Matthias Trute (AVR Atmega) +; COPYRIGHT +; (c) 2012 Bradford J. Rodriguez for the 430 code and API + +; adapted 430 assembly code to AVR +; wishlist: +; use a configurable pin at runtime, compatible with bitnames.frt +; no external pull up, no external power supply for devices +; ??? +; +;.EQU OW_BIT=4 +;.equ OW_PORT=PORTE +.set OW_DDR=(OW_PORT-1) +.set OW_PIN=(OW_DDR-1) + +;****f* 1W.RESET +; NAME +; 1W.RESET +; SYNOPSIS +; 1W.RESET ( -- f ) Initialize 1-wire devices; return true if present +; DESCRIPTION +; This configures the port pin used by the 1-wire interface, and then +; sends an "initialize" sequence to the 1-wire devices. If any device +; is present, it will be detected. +; +; Timing, per DS18B20 data sheet: +; a) Output "0" (drive output low) for >480 usec. +; b) Output "1" (let output float). +; c) After 15 to 60 usec, device will drive pin low for 60 to 240 usec. +; So, wait 75 usec and sample input. +; d) Leave output high (floating) for at least 480 usec. +;****** +; ( -- f ) +; Hardware +; Initialize 1-wire devices; return true if present +VE_OW_RESET: + .dw $ff08 + .db "1w.reset" + .dw VE_HEAD + .set VE_HEAD = VE_OW_RESET +XT_OW_RESET: + .dw PFA_OW_RESET +PFA_OW_RESET: + savetos + ; setup to output + sbi OW_DDR, OW_BIT + ; Pull output low + cbi OW_PORT, OW_BIT + ; Delay >480 usec + DELAY 480 + ; Critical timing period, disable interrupts. + in temp1, SREG + cli + ; Pull output high + sbi OW_PORT, OW_BIT + ; make pin input, sends "1" + cbi OW_DDR, OW_BIT + DELAY 64 ; delayB + ; Sample input pin, set TOS if input is zero + in tosl, OW_PIN + sbrs tosl, OW_BIT + ser tosh + ; End critical timing period, enable interrupts + out SREG, temp1 + ; release bus + cbi OW_DDR, OW_BIT + cbi OW_PORT, OW_BIT + + ; Delay rest of 480 usec + DELAY 416 + ; we now have the result flag in TOS + mov tosl, tosh + jmp_ DO_NEXT + +;****f* 1W.SLOT +; NAME +; 1W.SLOT +; SYNOPSIS +; 1W.SLOT ( c -- c' ) Write and read one bit to/from 1-wire. +; DESCRIPTION +; The "touch byte" function is described in Dallas App Note 74. +; It outputs a byte to the 1-wire pin, LSB first, and reads back +; the state of the 1-wire pin after a suitable delay. +; To read a byte, output $FF and read the reply data. +; To write a byte, output that byte and discard the reply. +; +; This function performs one bit of the "touch" operation -- +; one read/write "slot" in Dallas jargon. Perform this eight +; times in a row to get the "touch byte" function. +; +; PARAMETERS +; The input parameter is xxxxxxxxbbbbbbbo where +; 'xxxxxxxx' are don't cares, +; 'bbbbbbb' are bits to be shifted down, and +; 'o' is the bit to be output in the slot. This must be 1 +; to create a read slot. +; +; The returned value is xxxxxxxxibbbbbbb where +; 'xxxxxxxx' are not known (the input shifted down 1 position), +; 'i' is the bit read during the slot. This has no meaning +; if it was a write slot. +; 'bbbbbbb' are the 7 input bits, shifted down one position. +; +; This peculiar parameter usage allows OWTOUCH to be written as +; OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT +; +; NOTES +; Interrupts are disabled during each bit. + +; Timing, per DS18B20 data sheet: +; a) Output "0" for start period. (> 1 us, < 15 us, typ. 6 us*) +; b) Output data bit (0 or 1), open drain +; c) After MS from start of cycle, sample input (15 to 60 us, typ. 25 us*) +; d) After write-0 period from start of cycle, output "1" (>60 us) +; e) After recovery period, loop or return. (> 1 us) +; For writes, DS18B20 samples input 15 to 60 usec from start of cycle. +; * "Typical" values are per App Note 132 for a 300m cable length. + +; --------- ------------------------------- +; \ / / +; ------------------------------- +; a b c d e +; | 6us | 19us | 35us | 2us | +;****** +; ( c -- c' ) +; Hardware +; Write and read one bit to/from 1-wire. +VE_OW_SLOT: + .dw $ff07 + .db "1w.slot",0 + .dw VE_HEAD + .set VE_HEAD = VE_OW_SLOT +XT_OW_SLOT: + .dw PFA_OW_SLOT +PFA_OW_SLOT: + ; pull low + cbi OW_PORT, OW_BIT + sbi OW_DDR, OW_BIT + ; disable interrupts + in temp1, SREG + cli + DELAY 6 ; DELAY A + ; check bit + clc + ror tosl + brcc PFA_OW_SLOT0 ; a 0 keeps the bus low + ; release bus, a 1 is written + sbi OW_PORT, OW_BIT + cbi OW_DDR, OW_BIT +PFA_OW_SLOT0: + ; sample the input (no action required if zero) + DELAY 9 ; wait DELAY E to sample + in temp0, OW_PIN + sbrc temp0, OW_BIT + ori tosl, $80 + + DELAY 51 ; DELAY B + sbi OW_PORT, OW_BIT ; release bus + cbi OW_DDR, OW_BIT + delay 2 + ; re-enable interrupts + out SREG, temp1 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/drivers/generic-isr.asm b/amforth-6.5/avr8/drivers/generic-isr.asm new file mode 100644 index 0000000..e0aeaed --- /dev/null +++ b/amforth-6.5/avr8/drivers/generic-isr.asm @@ -0,0 +1,41 @@ +; ISR routines +.eseg +intvec: .byte INTVECTORS * CELLSIZE +.dseg +intcnt: .byte INTVECTORS +.cseg + +; interrupt routine gets called (again) by rcall! This gives the +; address of the int-vector on the stack. +isr: + st -Y, r0 + in r0, SREG + st -Y, r0 +.if (pclen==3) + pop r0 ; some 128+K Flash devices use 3 cells for call/ret +.endif + pop r0 + pop r0 ; = intnum * intvectorsize + 1 (address following the rcall) + dec r0 +.if intvecsize == 1 ; + lsl r0 +.endif + mov isrflag, r0 + push zh + push zl + ldi zl, low(intcnt) + ldi zh, high(intcnt) + lsr r0 ; we use byte addresses in the counter array, not words + add zl, r0 + adc zh, zeroh + ld r0, Z + inc r0 + st Z, r0 + pop zl + pop zh + + ld r0, Y+ + out SREG, r0 + ld r0, Y+ + ret ; returns the interrupt, the rcall stack frame is removed! + ; no reti here, see words/isr-end.asm diff --git a/amforth-6.5/avr8/drivers/usart-rx-buffer.asm b/amforth-6.5/avr8/drivers/usart-rx-buffer.asm new file mode 100644 index 0000000..b6a64b8 --- /dev/null +++ b/amforth-6.5/avr8/drivers/usart-rx-buffer.asm @@ -0,0 +1,132 @@ +;;; usart driver, receiving + +; sizes have to be powers of 2! +.equ usart_rx_size = $10 +.equ usart_rx_mask = usart_rx_size - 1 +.dseg + usart_rx_data: .byte usart_rx_size + usart_rx_in: .byte 1 + usart_rx_out: .byte 1 +.cseg + +VE_TO_RXBUF: + .dw $ff07 + .db ">rx-buf",0 + .dw VE_HEAD + .set VE_HEAD = VE_TO_RXBUF +XT_TO_RXBUF: + .dw PFA_rx_tobuf +PFA_rx_tobuf: + mov temp0, tosl + lds temp1, usart_rx_in + ldi zl, low(usart_rx_data) + ldi zh, high(usart_rx_data) + add zl, temp1 + adc zh, zeroh + st Z, temp0 + inc temp1 + andi temp1,usart_rx_mask + sts usart_rx_in, temp1 + loadtos + jmp_ DO_NEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; setup with +; ' isr-rx URXCaddr int! +VE_ISR_RX: + .dw $ff06 + .db "isr-rx" + .dw VE_HEAD + .set VE_HEAD = VE_ISR_RX +XT_ISR_RX: + .dw DO_COLON +usart_rx_isr: + .dw XT_DOLITERAL + .dw usart_data + .dw XT_CFETCH + .dw XT_DUP + .dw XT_DOLITERAL + .dw 3 + .dw XT_EQUAL + .dw XT_DOCONDBRANCH + .dw usart_rx_isr1 + .dw XT_COLD +usart_rx_isr1: + .dw XT_TO_RXBUF + .dw XT_EXIT + +; ( -- ) Hardware Access +; R( --) +; initialize usart +;VE_USART_INIT_RXBUFFER: +; .dw $ff0x +; .db "+usart-buffer" +; .dw VE_HEAD +; .set VE_HEAD = VE_USART_INIT_RXBUFFER +XT_USART_INIT_RX_BUFFER: + .dw DO_COLON +PFA_USART_INIT_RX_BUFFER: ; ( -- ) + .dw XT_DOLITERAL, XT_ISR_RX + .dw XT_DOLITERAL, URXCaddr + .dw XT_INTSTORE + + .dw XT_DOLITERAL + .dw usart_rx_data + .dw XT_DOLITERAL + .dw usart_rx_size + 6 + .dw XT_ZERO + .dw XT_FILL + .dw XT_EXIT + +; ( -- c) +; MCU +; get 1 character from input queue, wait if needed using interrupt driver +VE_RX_BUFFER: + .dw $ff06 + .db "rx-buf" + .dw VE_HEAD + .set VE_HEAD = VE_RX_BUFFER +XT_RX_BUFFER: + .dw DO_COLON +PFA_RX_BUFFER: + .dw XT_RXQ_BUFFER + .dw XT_DOCONDBRANCH + .dw PFA_RX_BUFFER + .dw XT_DOLITERAL + .dw usart_rx_out + .dw XT_CFETCH + .dw XT_DUP + .dw XT_DOLITERAL + .dw usart_rx_data + .dw XT_PLUS + .dw XT_CFETCH + .dw XT_SWAP + .dw XT_1PLUS + .dw XT_DOLITERAL + .dw usart_rx_mask + .dw XT_AND + .dw XT_DOLITERAL + .dw usart_rx_out + .dw XT_CSTORE + .dw XT_EXIT + +; ( -- f) +; MCU +; check if unread characters are in the input queue +VE_RXQ_BUFFER: + .dw $ff07 + .db "rx?-buf",0 + .dw VE_HEAD + .set VE_HEAD = VE_RXQ_BUFFER +XT_RXQ_BUFFER: + .dw DO_COLON +PFA_RXQ_BUFFER: + .dw XT_PAUSE + .dw XT_DOLITERAL + .dw usart_rx_out + .dw XT_CFETCH + .dw XT_DOLITERAL + .dw usart_rx_in + .dw XT_CFETCH + .dw XT_NOTEQUAL + .dw XT_EXIT diff --git a/amforth-6.5/avr8/drivers/usart.asm b/amforth-6.5/avr8/drivers/usart.asm new file mode 100644 index 0000000..7274789 --- /dev/null +++ b/amforth-6.5/avr8/drivers/usart.asm @@ -0,0 +1,30 @@ + +.equ BAUDRATE_LOW = UBRRL+$20 +.equ BAUDRATE_HIGH = UBRRH+$20 +.equ USART_C = UCSRC+$20 +.equ USART_B = UCSRB+$20 +.equ USART_A = UCSRA+$20 +.equ USART_DATA = UDR+$20 +.equ bm_USARTC_en = 1 << 7 + +; some generic constants +.equ bm_USART_RXRD = 1 << RXC +.equ bm_USART_TXRD = 1 << UDRE +.equ bm_ENABLE_TX = 1 << TXEN +.equ bm_ENABLE_RX = 1 << RXEN +.equ bm_ENABLE_INT_RX = 1< + R16 Y+ ld, + R17 Y+ ld, + R24 R16 add, + R25 R17 adc, + R14 1 subi, + 0 jmp, \ -+ +\ label> \ | +>-+ +\ clc, \ | | | +\ adr> rjmp, \ | | +-+ +\ nop, \ | | | +\ brcc, \ | | +-+ +\ nop, \ | | | +\ rot | | +\ swap 0 jmp, 0 >lbl \ addr->lbl[0] +\ label> 1 >lbl +\ clc, +\ adr> rjmp, 2 >lbl +\ nop, +\ 2 brcc, 3 >lbl +\ nop, +\ 0 tos +\ 1 r >r \ -- Rd Rr | -- mask opcode + 1F and dup 5 lshift or 20F and \ -- Rd r00000rrrr + swap 4 lshift 1F0 and \ -- rr 0ddddd0000 + or r> r> mask! \ -- ddrr opcode mask mask! + dup FC07 and 9000 = if EFFF and then , ; \ if Z or Y then z=0 + + + \ Operand Rd +: Rd, ( Rd opcode mask -- xxxx.xxxd.dddd.xxxx ) + >r >r \ -- Rd | -- mask opcode + 4 lshift 1F0 and \ -- 0ddddd0000 + r> r> mask! , ; \ dd opcode mask mask! to flash + + + \ Operands Rd,constant 8bit +: Rd,k, ( Rd k8 opcode mask -- xxxx.kkkk.dddd.kkkk ) + >r >r \ -- Rd k8 | -- mask opcode + FF and dup 4 lshift or F0F and \ -- Rd kkkk0000kkkk + swap 4 lshift F0 and \ -- kk dddd0000 + or r> r> mask! , ; \ kkdd opcode mask mask! to flash + + + \ Operands Rd,Rr,constant 6bit +: Rd,Rr+q, ( Rd Rr k6 opcode mask -- xxkx.kkxd.dddd.rkkk ) + >r >r \ -- Rd Rr k6 | -- mask opcode + 3F and dup 7 lshift \ -- Rd Rr k6 xkkkkkkxxxxxxx + dup 1000 and 1 lshift or or 2C07 and \ -- Rd Rr kxkkxxxxxxxkkk + rot 4 lshift 1F0 and \ -- Rr kk ddddd0000 + or swap 8 and \ -- kkdd rxxx + or r> r> mask! , ; \ kkddrr opcode mask mask! to flash + + + \ Operands Rw pair,constant 6bit +: Rw,k, ( Rw k6 opcode mask -- xxxx.xxxx.kkww.kkkk ) + >r >r \ -- Rw k6 | -- mask opcode + 3F and dup 2 lshift C0 and \ -- Rw k6 kk000000 + swap F and or \ -- Rw kk00kkkk + swap 4 lshift 30 and \ -- kk ww0000 + or r> r> mask! , ; \ kkww opcode mask mask! to flash + + + \ Operands P-port,bit +: P,b, ( P b opcode mask -- xxxx.xxxx.PPPP.Pbbb ) + >r >r \ -- P b | -- mask opcode + 7 and swap 3 lshift \ -- 0bbb PPPPP000 + or r> r> mask! , ; \ PPbb opcode mask mask! to flash + + + \ Operands Rd,P-port +: Rd,P, ( Rd P opcode mask -- xxxx.xPPd.dddd.PPPP ) + >r >r \ -- Rd P | -- mask opcode + 3F and dup 5 lshift or 60F and \ -- Rd PP00000PPPP + swap 4 lshift 1F0 and \ -- PP 00ddddd0000 + or r> r> mask! , ; \ ddPP opcode mask mask! to flash + + + \ Operand k16 k6 +: k22, ( k16 k6 opcode mask -- k16 xxxx.xxxk.kkkk.xxxk ) + >r >r \ -- k16 k6 | -- mask opcode + dup 1 and swap 3 lshift \ -- 000k kkkkkk000 + or r> r> mask! , , ; \ k16 kk opcode mask mask! to flash + + +00 constant Z +01 constant Z+ +02 constant -Z +08 constant Y +09 constant Y+ +0A constant -Y +0C constant X +0D constant X+ +0E constant -X + + +: movw, 1 rshift swap \ R0:1,R2:3,R4:5,..R30:31 + 1 rshift swap \ 0 2 movw, R0:1<--R2:3 + 0100 FF00 Rd,Rr, ; ( Rd Rr -- ) +: mul, 9C00 FC00 Rd,Rr, ; \ 2 3 mul, +: muls, 0200 FF00 Rd,Rr, ; +: mulsu, 0300 FF88 Rd,Rr, ; +: fmul, 0308 FF88 Rd,Rr, ; +: fmuls, 0380 FF88 Rd,Rr, ; +: fmulsu, 0388 FF88 Rd,Rr, ; +: cpc, 0400 FC00 Rd,Rr, ; +: sbc, 0800 FC00 Rd,Rr, ; +: add, 0C00 FC00 Rd,Rr, ; +: cpse, 1000 FC00 Rd,Rr, ; +: cp, 1400 FC00 Rd,Rr, ; +: sub, 1800 FC00 Rd,Rr, ; +: adc, 1C00 FC00 Rd,Rr, ; +: and, 2000 FC00 Rd,Rr, ; +: eor, 2400 FC00 Rd,Rr, ; +: or, 2800 FC00 Rd,Rr, ; +: mov, 2C00 FC00 Rd,Rr, ; \ 2 3 mov, R2<--R3 + +: cpi, 3000 F000 Rd,k, ; ( Rd k8 -- ) +: sbci, 4000 F000 Rd,k, ; +: subi, 5000 F000 Rd,k, ; +: ori, 6000 F000 Rd,k, ; +: sbr, ori, ; +: andi, 7000 F000 Rd,k, ; +: cbr, invert andi, ; +: ldi, E000 F000 Rd,k, ; \ 2 FF ldi, R2<--#FF + +: ldd, 8000 D200 Rd,Rr+q, ; ( Rd Rr q -- ) \ Rr={Z+,Y+}, 2 Y+ 3F ldd, +: std, rot rot + 8200 D200 Rd,Rr+q, ; ( Rd q Rr -- ) \ Rd={Z+,Y+}, Y+ 3F 2 std, + +: ld, 9000 FE00 Rd,Rr, ; ( Rd Rr -- ) \ Rr={Z+,-Z,Y+,-Y,X+,-X,X,Y,Z} +: lds, swap + 9000 FE0F Rd, , ; ( Rd k16 -- ) +: lpm_, 9004 FE0E Rd,Rr, ; ( Rd Rr -- ) \ Rr={Z,Z+}, 2 Z+ lpm_ +: elpm_, 9006 FE0E Rd,Rr, ; ( Rd Rr -- ) \ Rr={Z,Z+} +: st, swap + 9200 FE00 Rd,Rr, ; ( Rd Rr -- ) \ Rd={Z+,-Z,Y+,-Y,X+,-X,X,Y,Z} +: sts, 9200 FE0F Rd, , ; ( k16 Rd -- ) \ FFFF 2 sts, adr(FFFF)<--R2 + +: lsl, dup add, ; ( Rd -- ) +: rol, dup adc, ; +: tst, dup and, ; +: clr, dup eor, ; +: ser, FF ldi, ; + +: pop, 900F FE0F Rd, ; ( Rd -- ) \ 2 pop, +: push, 920F FE0F Rd, ; +: com, 9400 FE0F Rd, ; +: neg, 9401 FE0F Rd, ; +: swap, 9402 FE0F Rd, ; +: inc, 9403 FE0F Rd, ; +: asr, 9405 FE0F Rd, ; +: lsr, 9406 FE0F Rd, ; +: ror, 9407 FE0F Rd, ; +: bset, 9408 FF8F Rd, ; +: bclr, 9488 FF8F Rd, ; +: dec, 940A FE0F Rd, ; + +: nop, 0000 , ; ( -- ) +: ret, 9508 , ; +: reti, 9518 , ; +: sleep, 9588 , ; +: break, 9598 , ; +: wdr, 95A8 , ; +: lpm, 95C8 , ; +: elpm, 95D8 , ; +: spm, 95E8 , ; +: espm, 95F8 , ; +: ijmp, 9409 , ; +: eijmp, 9419 , ; +: icall, 9509 , ; +: eicall, 9519 , ; + +: clc, 9488 , ; +: clh, 94D8 , ; +: cli, 94F8 , ; +: cln, 94A8 , ; +: cls, 94C8 , ; +: clt, 94E8 , ; +: clv, 94B8 , ; +: clz, 9498 , ; +: sec, 9408 , ; +: seh, 9458 , ; +: sei, 9478 , ; +: sen, 9428 , ; +: ses, 9448 , ; +: set, 9468 , ; +: sev, 9438 , ; +: sez, 9418 , ; + +: adiw, 9600 FF00 Rw,k, ; ( Rw k6 -- ) \ 3 3F adiw, ZLH=ZLH+#3F +: sbiw, 9700 FF00 Rw,k, ; +: cbi, 9800 FF00 P,b, ; ( P b -- ) +: sbic, 9900 FF00 P,b, ; +: sbi, 9A00 FF00 P,b, ; +: sbis, 9B00 FF00 P,b, ; + +: in, B000 F800 Rd,P, ; ( Rd P -- ) +: out, swap + B800 F800 Rd,P, ; ( P Rr -- ) + +: bld, F800 FE08 Rd,Rr, ; ( Rd b -- ) +: bst, FA00 FE08 Rd,Rr, ; +: sbrc, FC00 FE08 Rd,Rr, ; +: sbrs, FE00 FE08 Rd,Rr, ; + +: jmp, 940C FE0E k22, ; ( k16 k6 -- ) \ k6=0 for 16b addr +: call, 940E FE0E k22, ; +: rjmp, C000 F000 mask! , ; ( k12 -- ) +: rcall, D000 F000 mask! , ; + +: brbc, F400 FC00 P,b, ; ( k7 b -- ) +: brbs, F000 FC00 P,b, ; +: brcc, 0 brbc, ; ( k7 ) +: brcs, 0 brbs, ; +: brsh, 0 brbc, ; +: brlo, 0 brbs, ; +: brne, 1 brbc, ; +: breq, 1 brbs, ; +: brpl, 2 brbc, ; +: brmi, 2 brbs, ; +: brvc, 3 brbc, ; +: brvs, 3 brbs, ; +: brge, 4 brbc, ; +: brlt, 4 brbs, ; +: brhc, 5 brbc, ; +: brhs, 5 brbs, ; +: brtc, 6 brbc, ; +: brts, 6 brbs, ; +: brid, 7 brbc, ; +: brie, 7 brbs, ; + + + \ Relative addr, for jump back, ......... ( -- adr ) \ label> ......... ......... 0 jmp, + + + \ Addr, for jump forward, adr> brne, adr> 0 jmp, +: adr> ( -- adr k ) + dp 0 ; + + + \ Label for branch forward, adr> brne, ......... rjmp, ......... 0 jmp, ......... lbl ( addr c -- ) \ index c=0..9 + 2* (lbl) + ! ; + + \ read addr from vector of labels +: pulse ( turn portD pin #7 for high and low) +\ the following words are for "real" IO pins only +\ PD.7 pin_output ( set DDRD so that portD pin #7 is output) +\ PD.7 pin_input ( set DDRD so that portD pin #7 is input) +\ PD.7 pin_high? ( true if pinD pin #7 is high) +\ PD.7 pin_low? ( true if pinD pin #7 is low) +\ +\ multi bit operation +\ PORTD F portpin PD.F ( define the lower nibble of port d ) +\ PD.F pin@ ( get the lower nibble bits ) +\ 5 PD.F pin! ( put the lower nibble bits, do not change the others ) + +hex + +\ At compiletime: +\ Store combination of portaddress and bit number in a cell and give it a name. +\ At runtime: +\ Get pinmask and portaddress on stack. +: portpin: create ( C: "ccc" portadr n -- ) ( R: -- pinmask portadr ) + 1 swap lshift + 8 lshift or , \ packed value + does> @i \ get packed value + dup 8 rshift swap ff and \ +; + +: bitmask: create ( C: "ccc" portadr n -- ) ( R: -- pinmask portadr ) + 8 lshift or , \ packed value + does> @i \ get packed value + dup 8 rshift swap ff and \ +; + + +\ Turn a port pin on, dont change the others. +: high ( pinmask portadr -- ) + dup ( -- pinmask portadr portadr ) + c@ ( -- pinmask portadr value ) + rot ( -- portadr value pinmask ) + or ( -- portadr new-value) + swap ( -- new-value portadr) + c! +; + +\ Turn a port pin off, dont change the others. +: low ( pinmask portadr -- ) + dup ( -- pinmask portadr portadr ) + c@ ( -- pinmask portadr value ) + rot ( -- portadr value pinmask ) + invert and ( -- portadr new-value) + swap ( -- new-value port) + c! +; + +\ pulse the pin +: pulse ( pinmask portaddr time -- ) + >r + over over high + r> 0 ?do 1ms loop + low +; + +: is_low? ( pinmask portaddr -- f ) + c@ invert and +; + +: is_high? ( pinmask portaddr -- f ) + c@ and +; + +\ write the pins masked as output +\ read the current value, mask all but +\ the desired bits and set the new +\ bits. write back the resulting byte +: pin! ( c pinmask portaddr -- ) + dup ( -- c pm pa pa ) + >r + c@ ( -- c pm c' ) + over invert and ( -- c pm c'' ) + >r ( -- c pm ) + and + r> ( -- c c'' ) + or r> + c! +; + + +\ Only for PORTx bits, +\ because address of DDRx is one less than address of PORTx. + +\ Set DDRx so its corresponding pin is output. +: pin_output ( pinmask portadr -- ) + 1- high +; + +\ Set DDRx so its corresponding pin is input. +: pin_input ( pinmask portadr -- ) + 1- low +; + +\ PINx is two less of PORTx +: pin_high? ( pinmask portaddr -- f ) + 1- 1- c@ and +; + +: pin_low? ( pinmask portaddr -- f ) + 1- 1- c@ invert and +; + +\ read the pins masked as input +: pin@ ( pinmask portaddr -- c ) + 1- 1- c@ and +; + +\ toggle the pin +: toggle ( pinmask portaddr -- ) + over over pin_high? if + low + else + high + then +; + + +\ ----- assembler version ----- +\ assembler library: loadtos, savetos, TOSL,TOSH, readflashcell + +\ macros definitions +: loadtos, 16 Y+ ld, 17 Y+ ld, ; \ define macro +: savetos, -Y 17 st, -Y 16 st, ; \ tosl=r22, tosh=r23 +: TOSL 16 ; +: TOSH 17 ; + + \ read flash cell to tos +: readflashcell, + assembler + ZL lsl, \ addr in ZH:ZL + ZH rol, + TOSL Z+ lpm_, + TOSH Z+ lpm_, ; \ @i to tos + +\ --------------------------------------------- +\ macros definitions + + \ convert mask+addr to port+bit for cbi, sbi, +: ma2pbi ( mask addr -- port bit ) + 20 - swap log2 ; + + + \ set pin high +: high, ( pinmask portadr -- ) + assembler + R16 over lds, \ @portadr + R16 rot ori, \ or pinmask + R16 sts, ; \ c! + + + \ set pin low +: low, ( pinmask portadr -- ) + assembler + R16 over lds, \ @portadr + R16 rot invert andi, \ and not(pinmask) + R16 sts, ; \ c! + + + \ c@ and +: is_high?, ( pinmask portadr -- f ) + assembler + R16 swap lds, \ @portadr + R16 swap andi, \ c@ and m + savetos, + TOSL R16 mov, + TOSH clr, ; + + + \ c@ invert and +: is_low?, ( pinmask portadr -- f ) + assembler + R16 swap lds, \ @portadr + R16 com, \ invert + R16 swap andi, \ and m + savetos, + TOSL R16 mov, + TOSH clr, ; + + + \ 1- 1- c@ and +: pin@, ( pinmask portadr -- c ) + 1- 1- is_high?, ; + +\ macros are for high speed words +\ pin,addr,mask is directly in asm instruction +\ example for use macros +\ PORTB 04 portpin: SPI_SS \ PB.4 - SPI select +\ : setoutSS SPI_SS pin_output ; +\ code setoutSS SPI_SS 1- high, end-code +\ code setoutSS SPI_SS 1- ma2pbi sbi, end-code +\ : +mmc SPI_SS low ; \ forth speed +\ code +mmc SPI_SS low, end-code \ asm speed +\ code +mmc SPI_SS ma2pbi cbi, end-code \ asm high speed +\ code SPI_SS_clk +\ SPI_SS low, +\ SPI_SS high, +\ end-code + + +\ code definitions +\ pin,addr,mask is read from tos + +code (portpin:) ( addr -- pinmask portadr ) + ZL TOSL movw, \ tos->z, addr @i + readflashcell, \ TOSH pinmask, TOSL portadr + R16 TOSL mov, \ temp0 + TOSL TOSH mov, + TOSH clr, + savetos, \ -- pinmask + TOSL R16 mov, \ -- pinmask portadr +end-code + +: portpin: create ( C: "ccc" portadr n -- ) ( R: -- pinmask portadr ) + 1 swap lshift + 8 lshift or , \ packed value + does> (portpin:) \ get packed value + \ @i dup 8 rshift swap ff and \ replaced by (portpin:) +; + + +code high ( pinmask portadr -- ) + \ dup c@ rot or swap c! \ replaced by assembler + ZL TOSL movw, \ tos->z + R16 Z ld, \ addr c@ + loadtos, \ delete portadr + R16 TOSL or, \ or pinmask + Z R16 st, \ c! + loadtos, \ delete pinmask +end-code + + +code low ( pinmask portadr -- ) + \ dup c@ rot invert and swap c! \ replaced by assembler + ZL TOSL movw, \ tos->z + R16 Z ld, \ addr c@ + loadtos, \ delete portadr + TOSL com, \ not(pinmask) + R16 TOSL and, \ and pinmask + Z R16 st, \ c! + loadtos, \ delete pinmask +end-code + + +: pin_output ( pinmask portadr -- ) + 1- high ; + + +: pin_input ( pinmask portadr -- ) + 1- low ; + + +code pin! ( c pinmask portadr -- ) + \ (c and m) or (@port and not(m)) + ZL TOSL movw, \ tos->z + R16 Z ld, \ addr c@ + loadtos, \ delete portadr + R17 TOSL mov, \ pinmask + TOSL com, \ not(pinmask) + R16 TOSL and, \ and pinmask + loadtos, \ delete pinmask + R17 TOSL and, \ m and c + R16 R17 or, \ () or () + Z R16 st, \ c! + loadtos, \ delete c +end-code + + +code pin@ ( pinmask portadr -- c ) + \ 1- 1- c@ and + ZL TOSL movw, \ tos->z + ZH:ZL 2 sbiw, \ 1- 1- + R16 Z ld, \ addr c@ + loadtos, \ delete portadr + TOSL R16 and, \ and pinmask + TOSH clr, +end-code + + +code is_low? ( pinmask portaddr -- c ) + \ c@ invert and + ZL TOSL movw, \ tos->z + R16 Z ld, \ addr c@ + R16 com, \ invert + loadtos, \ delete portadr + TOSL R16 and, \ and pinmask + TOSH clr, +end-code + + +code is_high? ( pinmask portaddr -- c ) + \ c@ and + ZL TOSL movw, \ tos->z + R16 Z ld, \ addr c@ + loadtos, \ delete portadr + TOSL R16 and, \ and pinmask + TOSH clr, +end-code + + +code pin_low? ( pinmask portadr -- c ) + \ 1- 1- c@ invert and + ZL TOSL movw, \ tos->z + ZH:ZL 2 sbiw, \ 1- 1- + R16 Z ld, \ addr c@ + R16 com, \ invert + loadtos, \ delete portadr + TOSL R16 and, \ and pinmask + TOSH clr, +end-code + + +code pin_high? ( pinmask portadr -- c ) + \ 1- 1- c@ and + ZL TOSL movw, \ tos->z + ZH:ZL 2 sbiw, \ 1- 1- + R16 Z ld, \ addr c@ + loadtos, \ delete portadr + TOSL R16 and, \ and pinmask + TOSH clr, +end-code + + +code toggle ( pinmask portaddr -- ) + ZL TOSL movw, \ tos->z + R16 Z ld, \ addr c@ + loadtos, \ delete portadr + R16 TOSL eor, \ xor pinmask + Z R16 st, \ c! + loadtos, \ delete pinmask +end-code + +\ end of file diff --git a/amforth-6.5/avr8/lib/bitnames.frt b/amforth-6.5/avr8/lib/bitnames.frt new file mode 100644 index 0000000..fdda840 --- /dev/null +++ b/amforth-6.5/avr8/lib/bitnames.frt @@ -0,0 +1,155 @@ +\ Code: Matthias Trute +\ Text: M.Kalus + +\ A named port pin puts a bitmask on stack, wherin the set bit indicates which +\ bit of the port register corresponds to the pin. +\ And then puts the address of its port on stack too. + +\ Use it this way: +\ PORTD 7 portpin: PD.7 ( define portD pin #7) +\ PD.7 high ( turn portD pin #7 on, i.e. set it high-level) +\ PD.7 low ( turn portD pin #7 off, i.e. set it low-level) +\ PD.7 pulse ( turn portD pin #7 for high and low) +\ the following words are for "real" IO pins only +\ PD.7 pin_output ( set DDRD so that portD pin #7 is output) +\ PD.7 pin_input ( set DDRD so that portD pin #7 is input) +\ PD.7 pin_high? ( true if pinD pin #7 is high) +\ PD.7 pin_low? ( true if pinD pin #7 is low) +\ +\ multi bit operation +\ PORTD F bitmask: PD.F ( define the lower nibble of port d ) +\ PD.F pin@ ( get the lower nibble bits ) +\ 5 PD.F pin! ( put the lower nibble bits, do not change the others ) + +\ #require builds.frt + +: bitmask: ( C: "ccc" portadr bmask -- ) ( R: -- pinmask portadr ) + + dup @i swap i-cell+ @i +; + +: portpin: ( C: "ccc" portadr n -- ) ( R: -- pinmask portadr ) + 1 over 7 and lshift >r \ bit position + 3 rshift + \ byte address + r> bitmask: \ portaddr may have changed +; + + + +\ Turn a port pin on, dont change the others. +: high ( pinmask portadr -- ) + dup ( -- pinmask portadr portadr ) + c@ ( -- pinmask portadr value ) + rot ( -- portadr value pinmask ) + or ( -- portadr new-value) + swap ( -- new-value portadr) + c! +; + +\ Turn a port pin off, dont change the others. +: low ( pinmask portadr -- ) + dup ( -- pinmask portadr portadr ) + c@ ( -- pinmask portadr value ) + rot ( -- portadr value pinmask ) + invert and ( -- portadr new-value) + swap ( -- new-value port) + c! +; + + +\ synonym off low +\ synonym on high + +\ pulse the pin +: pulse ( pinmask portaddr time -- ) + >r + 2dup high + r> 0 ?do 1ms loop + low +; + +: is_low? ( pinmask portaddr -- f) + c@ and 0= +; + +: is_high? ( pinmask portaddr -- f) + c@ over and = +; + +: wait_low ( pinmask portaddr -- ) + begin + 2dup is_low? + until 2drop +; + +: wait_high_all ( pinmask portaddr -- ) + begin + 2dup is_high? + until 2drop +; + +\ write the pins masked as output +\ read the current value, mask all but +\ the desired bits and set the new +\ bits. write back the resulting byte +: pin! ( c pinmask portaddr -- ) + dup ( -- c pm pa pa ) + >r + c@ ( -- c pm c' ) + over invert and ( -- c pm c'' ) + >r ( -- c pm ) + and + r> ( -- c c'' ) + or r> + c! +; + + +\ Only for PORTx bits, +\ because address of DDRx is one less than address of PORTx. + +\ Set DDRx so its corresponding pin is output. +: pin_output ( pinmask portadr -- ) + 1- high +; + +\ Set DDRx so its corresponding pin is input. +: pin_input ( pinmask portadr -- ) + 1- low +; + +\ PINx is two less of PORTx +: pin_high? ( pinmask portaddr -- f) + 1- 1- c@ and +; + +: pin_low? ( pinmask portaddr -- f) + 1- 1- c@ invert and +; + +\ read the pins masked as input +: pin@ ( pinmask portaddr -- c ) + 1- 1- c@ and +; + +\ toggle the pin +: toggle ( pinmask portaddr -- ) + 2dup pin_high? if + low + else + high + then +; + +\ disable the pull up resistor +: pin_pullup_off ( pinmask portaddr -- ) + 2dup pin_input low +; + + +\ enable the pull up resistor +: pin_pullup_on ( pinmask portaddr -- ) + 2dup pin_input high +; diff --git a/amforth-6.5/avr8/lib/calc-baudrate.frt b/amforth-6.5/avr8/lib/calc-baudrate.frt new file mode 100644 index 0000000..015eb10 --- /dev/null +++ b/amforth-6.5/avr8/lib/calc-baudrate.frt @@ -0,0 +1,12 @@ + +\ calculates the baudrate register values +\ the two bytes of the result should be +\ transferred in high - low order + +\ ( baudrate -- baud-rate-register) +: calc-baudrate + f_cpu + d2/ d2/ d2/ d2/ + rot um/mod + swap drop 1- +; diff --git a/amforth-6.5/avr8/lib/dot-res.frt b/amforth-6.5/avr8/lib/dot-res.frt new file mode 100644 index 0000000..398bd88 --- /dev/null +++ b/amforth-6.5/avr8/lib/dot-res.frt @@ -0,0 +1,19 @@ + +\ dump free ressources +: .res ( -- ) + base @ >r + decimal + ver ." running at " f_cpu #1000 um/mod . drop ." kHz " cr + s" mcu-info" environment? if + 2 + @i 2/ dp - + ." free FLASH cells " u. cr + else + ." no flash size information available " cr + then + ." free RAM bytes " unused u. cr + ." used EEPROM bytes " ehere u. cr + ." used data stack cells " depth u. cr + ." used return stack cells " rp0 rp@ - 1- 1- 2/ u. cr + ." free return stack cells " rp@ sp0 - 1+ 1+ 2/ u. cr + r> base ! +; diff --git a/amforth-6.5/avr8/lib/eallot.frt b/amforth-6.5/avr8/lib/eallot.frt new file mode 100644 index 0000000..73939cc --- /dev/null +++ b/amforth-6.5/avr8/lib/eallot.frt @@ -0,0 +1,5 @@ +\ allocate n bytes in EEPROM + +: eallot ( n -- ) + ehere + to ehere +; diff --git a/amforth-6.5/avr8/lib/forth2012/core-ext.frt b/amforth-6.5/avr8/lib/forth2012/core-ext.frt new file mode 100644 index 0000000..7e16121 --- /dev/null +++ b/amforth-6.5/avr8/lib/forth2012/core-ext.frt @@ -0,0 +1,13 @@ +\ 'core-ext.frt' generated automatically, do not edit +#require case.frt +\ #require case-test.frt +#require compile-comma.frt +\ #require exceptions.frt +#require marker.frt +\ #require marker-test.frt + +\ update the environment +\ get-current environment set-current +\ : core-ext 0 ; +\ reset the definition word list +\ set-current diff --git a/amforth-6.5/avr8/lib/forth2012/core-ext/avr-defers.frt b/amforth-6.5/avr8/lib/forth2012/core-ext/avr-defers.frt new file mode 100644 index 0000000..0421ab3 --- /dev/null +++ b/amforth-6.5/avr8/lib/forth2012/core-ext/avr-defers.frt @@ -0,0 +1,20 @@ +\ the following code works in the AVR only + +\ use the eeprom to keep the XT. Unlike the RAM/USER +\ based locations, the EEPROM vector is available without +\ initialization. +: Edefer ( "name" -- ) + (defer) + ehere dup , + ['] Edefer@ , + ['] Edefer! , + cell+ to ehere +; + +\ the flash is writable, not that often, but it is +: Idefer ( "name" -- ) + (defer) + ['] noop , \ a dummy action as place holder + [: @i execute ;] , \ XT is directly in the dictionary. + [: !i ;] , +; diff --git a/amforth-6.5/avr8/lib/forth2012/core-ext/marker-test.frt b/amforth-6.5/avr8/lib/forth2012/core-ext/marker-test.frt new file mode 100644 index 0000000..3a7c9b0 --- /dev/null +++ b/amforth-6.5/avr8/lib/forth2012/core-ext/marker-test.frt @@ -0,0 +1,18 @@ +#include dumper.frt +#include order.frt +#include marker.frt + +wordlist constant test-wl +get-order test-wl swap 1+ set-order +order +marker empty + +' empty 4 - 10 idump + +: hallo ." Hallo " ; + +order +words +empty +words +order diff --git a/amforth-6.5/avr8/lib/forth2012/core-ext/marker.frt b/amforth-6.5/avr8/lib/forth2012/core-ext/marker.frt new file mode 100644 index 0000000..8d5756b --- /dev/null +++ b/amforth-6.5/avr8/lib/forth2012/core-ext/marker.frt @@ -0,0 +1,23 @@ +\ Defines a word which resets the dictionary and removes itself +\ when called. +\ Better then forget but still has limitations. + +\ all information is in the first few EEPROM cells. +\ (marker) is a value that holds the max eeprom address + +: marker + \ get information to remove the marker itself + get-current @e dp + \ create the wordlist entry + create + \ save all data + (marker) 0 do i @e , 2 +loop + \ save the marker-remove data + , , + does> + \ restore data from saved state + (marker) 0 do dup @i i !e 1+ 2 +loop + \ purge the marker itself + dup @i to dp + 1+ @i get-current !e +; diff --git a/amforth-6.5/avr8/lib/forth2012/core.frt b/amforth-6.5/avr8/lib/forth2012/core.frt new file mode 100644 index 0000000..5db1994 --- /dev/null +++ b/amforth-6.5/avr8/lib/forth2012/core.frt @@ -0,0 +1,26 @@ +\ 'core.frt' generated automatically, do not edit +#require 2over.frt +#require 2swap.frt +#require aligned.frt +#require align.frt +#require blank.frt +#require c-comma.frt +#require char-plus.frt +#require chars.frt +#require dot-paren.frt +#require environment-q.frt +#require erase.frt +#require evaluate.frt +#require fm-slash-mod.frt +#require star-slash.frt +#require move.frt + +#require sm-slash-rem.frt +#require source-id.frt +#require find.frt + +\ update the environment +get-current environment set-current +: core -1 ; +\ reset the definition word list +set-current diff --git a/amforth-6.5/avr8/lib/forth2012/core/align.frt b/amforth-6.5/avr8/lib/forth2012/core/align.frt new file mode 100644 index 0000000..e68f679 --- /dev/null +++ b/amforth-6.5/avr8/lib/forth2012/core/align.frt @@ -0,0 +1,3 @@ +\ atmega's are always aligned +: align ; + diff --git a/amforth-6.5/avr8/lib/forth2012/core/aligned.frt b/amforth-6.5/avr8/lib/forth2012/core/aligned.frt new file mode 100644 index 0000000..f2b942a --- /dev/null +++ b/amforth-6.5/avr8/lib/forth2012/core/aligned.frt @@ -0,0 +1,3 @@ +\ atmega's are always aligned +: aligned ; + diff --git a/amforth-6.5/avr8/lib/forth2012/core/avr-values.frt b/amforth-6.5/avr8/lib/forth2012/core/avr-values.frt new file mode 100644 index 0000000..a23d0be --- /dev/null +++ b/amforth-6.5/avr8/lib/forth2012/core/avr-values.frt @@ -0,0 +1,11 @@ + + +\ EEPROM based values + +: Evalue ( n -- ) + (value) + ehere , + ['] Edefer@ , + ['] Edefer! , + ehere dup cell+ to ehere !e +; diff --git a/amforth-6.5/avr8/lib/forth2012/core/c-comma.frt b/amforth-6.5/avr8/lib/forth2012/core/c-comma.frt new file mode 100644 index 0000000..2c4e678 --- /dev/null +++ b/amforth-6.5/avr8/lib/forth2012/core/c-comma.frt @@ -0,0 +1,3 @@ +\ a character occupies a full flash cell +: c, , ; + diff --git a/amforth-6.5/avr8/lib/forth2012/core/eeprom-buffer.frt b/amforth-6.5/avr8/lib/forth2012/core/eeprom-buffer.frt new file mode 100644 index 0000000..5cb2ceb --- /dev/null +++ b/amforth-6.5/avr8/lib/forth2012/core/eeprom-buffer.frt @@ -0,0 +1,15 @@ +\ internal EEPROM routines. They do not operate on external +\ storage + +\ Ebuffer: is the EEPROM pendant to buffer: from forth200x +\ it takes the number of bytes to allocate in RAM and parses +\ SOURCE for the name to give to the buffer + +\ Eallot is the EEPROM pendant for allot from the core word set +\ it allocates n bytes of EEPROM storage and return the starting +\ address. + +: Eallot ehere + to ehere ; +: Ebuffer: ehere constant Eallot ; + +\ for usage see http://amforth.sourceforge.net/TG/recipes/EEPROM.html diff --git a/amforth-6.5/avr8/lib/forth2012/core/environment-q.frt b/amforth-6.5/avr8/lib/forth2012/core/environment-q.frt new file mode 100644 index 0000000..e16428d --- /dev/null +++ b/amforth-6.5/avr8/lib/forth2012/core/environment-q.frt @@ -0,0 +1,53 @@ +\ environment queries are placed in a +\ separate wordlist. + +\ #require imove.frt + +\ we have to distinguish between interpreted (RAM) +\ and compiled (Flash) strings. First the RAM +\ strings + +: (environment?) \ addr len -- 0|x*i -1 + environment search-wordlist dup + if >r execute r> then +; + + +\ the compiled (Flash) strings are transferred +\ to RAM and this copy processed afterwards. +: [environment?] + ( iaddr len -- ) + dup >r + here imove + here r> (environment?) +; + +\ a state smart word to decide what to do. +: environment? + state @ if + postpone [environment?] + else + (environment?) + then +; immediate + +\ some environment queries + +\ save the definitions word list for this file +\ and switch to the environment queries wordlist +get-current environment set-current + +: /counted-strings &60 ; +: floored 0 ; +: address-unit-bits $10 ; +: max-char $ff ; +: max-d $7fffffff. ; +: max-ud $ffffffff. ; +: max-n $7fff ; +: max-u $ffff ; + +: return-stack-cells &10 ; +: stack-cells &10 ; + +\ reset the definition word list +set-current diff --git a/amforth-6.5/avr8/lib/forth2012/core/evaluate.frt b/amforth-6.5/avr8/lib/forth2012/core/evaluate.frt new file mode 100644 index 0000000..80659bc --- /dev/null +++ b/amforth-6.5/avr8/lib/forth2012/core/evaluate.frt @@ -0,0 +1,46 @@ +\ evaluate +\ temporarily redirect the input source +\ to string buffer. Return the the previous +\ input source afterwards and continue + +\ #require imove.frt + +\ some helper words +variable strlen +variable str +: source-string str @ strlen @ ; + +\ we have to distinguish between interpreted (RAM) +\ and compiled (Flash) strings. First the RAM +\ strings + +: (evaluate) \ i*x addr len -- j*y + ['] source defer@ >r + >in @ >r + 0 >in ! + strlen ! + str ! + ['] source-string is source + ['] interpret catch + r> >in ! + r> is source + throw +; + +\ the compiled (Flash) strings are transferred +\ to RAM and processed there. +: [evaluate] + ( iaddr len -- ) + dup >r + here imove + here r> (evaluate) +; + +\ a state smart word to decide what to do. +: evaluate + state @ if + postpone [evaluate] + else + (evaluate) + then +; immediate diff --git a/amforth-6.5/avr8/lib/forth2012/core/fm-slash-mod.frt b/amforth-6.5/avr8/lib/forth2012/core/fm-slash-mod.frt new file mode 100644 index 0000000..dfb10e9 --- /dev/null +++ b/amforth-6.5/avr8/lib/forth2012/core/fm-slash-mod.frt @@ -0,0 +1,22 @@ + + +: fm/mod ( d1 n1 -- n2 n3 ) + dup >r + 2dup xor >r + >r + dabs r@ abs um/mod + swap r> ?negate swap + r> 0< if + negate + over if + r@ rot - swap 1- + then + then + r> drop +; + +\ alternative solution +\ +\ : FM/MOD \ ( d m -- r q ) signed floored division +\ DUP >R SM/REM 2DUP 0< AND IF 1- SWAP R> + SWAP ELSE R> DROP THEN ; +\ \ No newline at end of file diff --git a/amforth-6.5/avr8/lib/forth2012/core/sm-slash-rem.frt b/amforth-6.5/avr8/lib/forth2012/core/sm-slash-rem.frt new file mode 100644 index 0000000..baf07cf --- /dev/null +++ b/amforth-6.5/avr8/lib/forth2012/core/sm-slash-rem.frt @@ -0,0 +1,8 @@ + +: sm/rem ( d1 n1 -- n2 n3 ) + 2dup xor >r + over >r + abs >r dabs r> um/mod + swap r> ?negate + swap r> ?negate +; diff --git a/amforth-6.5/avr8/lib/forth2012/core/star-slash-mod.frt b/amforth-6.5/avr8/lib/forth2012/core/star-slash-mod.frt new file mode 100644 index 0000000..9d47a61 --- /dev/null +++ b/amforth-6.5/avr8/lib/forth2012/core/star-slash-mod.frt @@ -0,0 +1,4 @@ + +\ #require sm-slash-rem.frt + +: */mod >r m* r> sm/rem ; diff --git a/amforth-6.5/avr8/lib/hardware/25xxx.frt b/amforth-6.5/avr8/lib/hardware/25xxx.frt new file mode 100644 index 0000000..2951810 --- /dev/null +++ b/amforth-6.5/avr8/lib/hardware/25xxx.frt @@ -0,0 +1,131 @@ + + 6 constant SEE_WREN + 4 constant SEE_WRDI + 5 constant SEE_RDSR + 1 constant SEE_WRSR + 3 constant SEE_READ + 2 constant SEE_WRITE +$AB constant SEE_RDID \ Microchip 25LCxxx only; remove from deep power-down + + : 25xxx_disable \ raise serial EEPROM chip-select line high + 25XXX_CS_A_MASK + 25XXX_CS_A_PORT c@ + or + 25XXX_CS_A_PORT c! + ; + + : 25xxx_enable ( -- ) \ pull serial EEPROM chip-select line low + 25XXX_CS_A_MASK invert + 25XXX_CS_A_PORT c@ + and + 25XXX_CS_A_PORT c! + ; + + : 25xxx_c! ( c addr -- ) \ writes char in NOS to serial EEPROM, address in TOS + 25xxx_enable + 25XXX_WREN spi_send \ send enable-write command, ignore response + 25xxx_disable + + 25xxx_enable + 25XXX_WRITE spi_send \ send write command, ignore response + 25xxx_sendaddr \ send addr (16 or 24 bits) + spi_send \ write byte + 25xxx_disable + 25xxx_wait_rdy + ; + + : 25xxx_! ( w seeaddrl seeaddrh -- ) \ write word in NOS to serial EEPROM at addr in TOS + 2>r dup >< 2r> \ fast way to prep data in stack ( wl wh seeaddrl seeaddrh ) + over over 1 0 d+ \ precalc addr of second byte in data + 2>r \ save for later ( wl wh seeaddrl seeaddrh ) + 25xxx_c! \ write MSB of word ( wl ) + 2r> \ recover addr of next byte ( wl seeaddrl+1 seeaddrh ) + 25xxx_c! \ write LSB + ; + + : 25xxx_wait_rdy ( -- ) \ busy-wait until serial EEPROM finishes writing + begin + 25xxx_enable + 25XXX_RDSR spi_xchg drop \ send read-status command, ignore response + 0 spi_xchg \ send null byte, response is on TOS + 25xxx_disable + 1 and \ isolate the WIP (write-in-progress) bit + 1 xor \ reverse state of WIP bit + until \ loop until WIP = 0 + ; + + : see_c@ ( addrl addrh -- c ) \ returns byte at 32-bit address in TOS + 25xxx_enable + 25XXX_READ spi_send \ send READ command, ignore response + 25xxx_sendaddr \ send address (16 or 24 bits) + 0 spi_xchg \ send null byte, response is in TOS + 25xxx_disable + ; + + : 25xxx_c@_blk ( addr n eeaddrl eeaddrh -- ) + 25xxx_enable + 25XXX_READ spi_send \ send READ command, ignore response + 25xxx_sendaddr \ send address (16 or 24 bits) + 0 \ ( -- addr n 0 ) + do \ for all requested bytes... + 0 spi_xchg \ get byte from serial EEPROM + over \ get addr to use + c! \ save the byte + 1+ \ bump pointer + loop + drop \ done with address + 25xxx_disable + ; + + + : 25xxx_c!blk ( addr n seeaddrl seeaddrh -- ) \ copies N bytes from addr to EEPROM address in TOS/NOS + 25xxx_enable + 25XXX_WREN spisend \ need to enable serial EEPROM for writing + 25xxx_disable + + 25xxx_enable + 25XXX_WRITE spi_send \ send WRITE command, ignore response + over over \ copy of 32-bit serial EEPROM addr + 25xxx_sendaddr \ send addr to serial EEPROM ( -- addr n seeaddrl seeaddrh ) + rot \ ( -- addr seeaddrl seeaddrh n ) + 0 \ ( -- addr seeaddrl seeaddrh n 0 ) + do \ for all requested bytes ( -- addr seeaddrl seeaddrh ) + rot dup i + \ addr of byte to fetch ( -- seeaddrl seeaddrh addr addr+i ) + c@ spi_send \ write to serial EEPROM ( -- seeaddrl seeaddrh addr ) + rot dup i + \ calc addr within serial EEPROM ( -- seeaddrh addr seeaddrl seeaddrl+i ) + 7f and 7f = \ last addr in page?; use 7f for 25LC256/512, 3f for AT25128/256 + if + 25xxx_disable \ done with this page + 25xxx_wait_rdy + 25xxx_enable + 25XXX_WREN spi_send \ need to enable serial EEPROM for writing + 25xxx_disable + 25xxx_enable + 25XXX_WRITE spi_send \ send WRITE command ( -- seeaddrh addr seeaddrl ) + rot \ set up EEPROM addr ( -- addr seeaddrl seeaddrh ) + over over \ get a copy + i 1+ 0 d+ \ calc addr of next page ( -- addr seeaddrl seeaddrh seeaddrl seeaddrh ) + 25xxx_sendaddr \ send addr to serial EEPROM ( -- addr seeaddrl seeaddrh) + else \ not start of new page ( -- seeaddrh addr seeaddrl ) + rot \ rearrange ( -- addr seeaddrl seeaddrh ) + then + loop + drop + drop drop + 25xxx_disable + 25xxx_wait_rdy + ; + + + : 25xxx_init ( -- ) \ initialize SPI and I/O ports for accessing serial EEPROM + spi_init + 25XXX_CS_A_DDR c@ + 25XXX_CS_A_MASK or \ need to make CS an output + 25XXX_CS_A_DDR c! + 25xxx_enable + 25XXX_RDID spi_xchg drop \ Microchip 25LCxxx only; take chip out of deep power-down + 0 spi_xchg drop \ need to send dummy 16-bit addr, ignore response + 0 spi_xchg drop + 0 spi_xchg drop \ one last null byte, Microchip devices will send ID, ignore it + 25xxx_disable + ; diff --git a/amforth-6.5/avr8/lib/hardware/flash-block.frt b/amforth-6.5/avr8/lib/hardware/flash-block.frt new file mode 100644 index 0000000..661e3b4 --- /dev/null +++ b/amforth-6.5/avr8/lib/hardware/flash-block.frt @@ -0,0 +1,37 @@ +\ +\ flash-block +\ contiguous flash region used a block storage +\ +\ requires blocks.frt (for init and blocksize) +\ + +\ start address for blocks. +\ the block data starts at +\ flash.base-addr + (blocknum*blocksize) +\ it could be beyond the 128K limit, if the +\ !i and @i are replaced by words which take a +\ doube cell address or handle the block at once +\ (preferred) +\ +variable flash.base-addr + +\ remember a flash cell contains 2 bytes + +: flash.load-buffer ( a-addr u -- ) + 1- blocksize 2/ * flash.base-addr @ + + blocksize 2/ bounds ?do i @i over ! cell+ loop drop +; + +: flash.save-buffer ( a-addr u -- ) + 1- blocksize 2/ * flash.base-addr @ + + ." still debugging. no actual flash write!" + blocksize 2/ bounds ?do dup @ i 2drop ( !i) cell+ loop drop +; + +\ for turnkey +: flash.init ( -- ) + ['] flash.load-buffer is load-buffer + ['] flash.save-buffer is save-buffer + 0 flash.base-addr ! + block:init +; diff --git a/amforth-6.5/avr8/lib/hardware/i2c-twi-master.frt b/amforth-6.5/avr8/lib/hardware/i2c-twi-master.frt new file mode 100644 index 0000000..3bd2190 --- /dev/null +++ b/amforth-6.5/avr8/lib/hardware/i2c-twi-master.frt @@ -0,0 +1,136 @@ +\ basic I2C operations, uses 7bit bus addresses +\ uses the TWI module of the Atmega's. + +#require bitnames.frt +#require avr-values.frt + +\ provides public commands +\ i2c.ping? -- checks if addr is active +\ i2c.init -- flexible configuration setup. see below +\ i2c.init.default -- generic slow speed setup +\ i2c.off -- turns off I2C + +\ and more internal commands +\ i2c.wait -- wait for the current i2c transaction +\ i2c.start -- send start condition +\ i2c.stop -- send stop condition +\ i2c.tx -- send one byte, wait for ACK +\ i2c.rx -- receive one byte with ACK +\ i2c.rxn .. receive one byte with NACK +\ i2c.status -- get the last i2c status + +\ +\ i2c (SCL) clock speed = CPU_clock/(16 + 2*bitrateregister*(4^prescaler)) +\ following the SCL clock speed in Hz for an 8Mhz device +\ bitrate register (may be any value between 0 and 255) +\ 4 8 16 32 64 128 255 +\ prescaler +\ /1 333.333 250.000 166.667 100.000 55.556 29.412 15.209 +\ /4 166.667 100.000 55.556 29.412 15.152 7.692 3.891 +\ /16 55.556 29.412 15.152 7.692 3.876 1.946 978 +\ /64 15.152 7.692 3.876 1.946 975 488 245 +\ +\ + +-#4000 constant i2c.timeout \ exception number for timeout +#10000 Evalue i2c.maxticks \ # of checks until timeout is reached +variable i2c.loop \ timeout counter +variable i2c.current \ current hwid if <> 0 + +: i2c.timeout? + i2c.loop @ 1- dup i2c.loop ! 0= +; + +\ turn off i2c +: i2c.off ( -- ) + 0 TWCR c! + 0 i2c.current ! +; + +#0 constant i2c.prescaler/1 +#1 constant i2c.prescaler/4 +#2 constant i2c.prescaler/16 +#3 constant i2c.prescaler/64 +TWSR $3 bitmask: i2c.conf.prescaler + +TWCR #7 portpin: i2c.int +TWCR #6 portpin: i2c.ea +TWCR #5 portpin: i2c.sta + +\ enable i2c +: i2c.init ( prescaler bitrate -- ) + i2c.off \ stop i2c, just to be sure + TWBR c! \ set bitrate register + i2c.conf.prescaler pin! \ the prescaler has only 2 bits +; + +\ a very low speed initialization. +: i2c.init.default + i2c.prescaler/64 #3 i2c.init +; + +\ wait for i2c finish +: i2c.wait ( -- ) + i2c.maxticks i2c.loop ! + begin + pause \ or 1ms? + i2c.int is_high? + i2c.timeout? if i2c.timeout throw then + until +; + +\ send start condition +: i2c.start ( -- ) + %10100100 TWCR c! + i2c.wait +; + +\ send stop condition +: i2c.stop ( -- ) + %10010100 TWCR c! + \ no wait for completion. +; + +\ send the restart condition (AVR simply sends start again) +: i2c.restart ( -- ) + i2c.start +; + +\ process the data, waits for completion +: i2c.action + %10000100 or TWCR c! \ _BV(i2cNT)|_BV(TWEN) + i2c.wait +; + +\ send 1 byte +: i2c.tx ( c -- ) + TWDR c! + 0 i2c.action +; + +\ receive 1 byte, send ACK +: i2c.rx ( -- c ) + %01000000 \ TWEA + i2c.action + TWDR c@ +; + +\ receive 1 byte, send NACK +: i2c.rxn ( -- c ) + 0 i2c.action + TWDR c@ +; + +\ get i2c status +: i2c.status ( -- n ) + TWSR c@ + $f8 and +; + +\ detect presence of a device on the bus +: i2c.ping? ( addr -- f ) + i2c.start + 2* i2c.tx + i2c.status $18 = + i2c.stop +; diff --git a/amforth-6.5/avr8/lib/hardware/i2c-twi-slave.frt b/amforth-6.5/avr8/lib/hardware/i2c-twi-slave.frt new file mode 100644 index 0000000..c045433 --- /dev/null +++ b/amforth-6.5/avr8/lib/hardware/i2c-twi-slave.frt @@ -0,0 +1,89 @@ +\ the following code is work in progress. +\ debug output and other oddities are possible + +\ The slave provides a circular buffer of +\ $10 bytes size. The variables i2c-in +\ and i2c-out are pointers to the next +\ byte in this buffer. +\ + +\ #require buffer.frt + +$10 constant i2c-bufsize + +i2c-bufsize buffer: i2c-buffer +variable i2c-in +variable i2c-out + +: ++wrap ( addr -- n ) + dup @ ( -- addr n ) + dup 0 [ i2c-bufsize 1- ] literal within + if 1+ else drop 0 then + dup rot ! +; + +: >i2c-buffer ( c -- ) + i2c-buffer i2c-in ++wrap + c! +; + +: i2c-buffer> ( -- c ) + i2c-buffer i2c-out ++wrap + c@ +; + + +TWCR_TWEN TWCR_TWIE TWCR_TWINT or or constant TWCR_TWENALL + +\ set the hw address and start the receiver +: i2c.slave.init ( hwid -- ) + 2* \ see datasheet + TWAR c! + [ TWCR_TWENALL TWCR_TWEA or ] literal TWCR c! +; + +: i2c.slave.twcr.ack + [ TWCR_TWENALL TWCR_TWEA or ] literal TWCR c! +; +: i2c.slave.twcr.nack + [ TWCR_TWENALL ] literal TWCR c! +; + +: i2c.slave.twcr.reset + [ TWCR_TWENALL TWCR_TWEA TWCR_TWSTO or or ] literal TWCR c! +; + +\ own address received with ACK +: i2c.addr.ack ( -- ) + \ well, nothing to do + i2c.slave.twcr.ack +; + +\ data received with NACK, probably the last one +: i2c.data.nack ( -- ) + TWDR c@ >i2c-buffer + i2c.slave.twcr.nack +; +\ data received with ACK, more to follow +: i2c.data.ack ( -- ) + TWDR c@ >i2c-buffer + i2c.slave.twcr.ack +; + +: i2c.data.send ( -- ) + i2c-buffer> TWDR c! + i2c.slave.twcr.ack +; + +: i2c.slave.isr ( -- ) + TWSR c@ $f8 and + \ receiving data + dup $60 = if drop i2c.addr.ack exit then \ TW_SR_SLA_ACK + dup $80 = if drop i2c.data.ack exit then \ TW_SR_SLA_ACK + dup $88 = if drop i2c.data.nack exit then \ TW_SR_SLA_NACK + \ sending data + dup $a8 = if drop i2c.data.send exit then \ TW_ST_SLA_ACK + dup $b8 = if drop i2c.data.send exit then \ TW_ST_DATA_ACK + drop i2c.slave.twcr.reset +; + +' i2c.slave.isr decimal TWIAddr int! +$42 i2c.slave.init diff --git a/amforth-6.5/avr8/lib/hardware/int-q.frt b/amforth-6.5/avr8/lib/hardware/int-q.frt new file mode 100644 index 0000000..923e000 --- /dev/null +++ b/amforth-6.5/avr8/lib/hardware/int-q.frt @@ -0,0 +1,2 @@ + +: int? SREG c@ SREG_I and 0> ; \ AVR diff --git a/amforth-6.5/avr8/lib/hardware/interrupts.frt b/amforth-6.5/avr8/lib/hardware/interrupts.frt new file mode 100644 index 0000000..d6eae22 --- /dev/null +++ b/amforth-6.5/avr8/lib/hardware/interrupts.frt @@ -0,0 +1,7 @@ +\ initialize interrupt vectors + +: initIntVectors + #int 0 do + ['] noop i int! + loop +; diff --git a/amforth-6.5/avr8/lib/hardware/key2char.frt b/amforth-6.5/avr8/lib/hardware/key2char.frt new file mode 100644 index 0000000..37e3d45 --- /dev/null +++ b/amforth-6.5/avr8/lib/hardware/key2char.frt @@ -0,0 +1,135 @@ +\ Convert tab for Keyboard.frt - Lubos Pekny, www.forth.cz +\ V.1.0, 26.05.2008 +\ keyboard scan code->ascii char, 128 words, Hi:Lo byte (Hi is with shift) + +create kbd_CHARTAB +\ ascii key char char^ +0000 , \ 00 +0000 , \ 01 F9 +0000 , \ 02 +0000 , \ 03 F5 +0000 , \ 04 F3 +0000 , \ 05 F1 +0000 , \ 06 F2 +0000 , \ 07 F12 +0000 , \ 08 +0000 , \ 09 F10 +0000 , \ 0A F8 +0000 , \ 0B F6 +0000 , \ 0C F4 +0909 , \ 0D TAB +7E60 , \ 0E ` ~ +0000 , \ 0F +0000 , \ 10 +0000 , \ 11 ALT +0000 , \ 12 Left SHIFT +0000 , \ 13 +0000 , \ 14 Ctrl +5171 , \ 15 q Q +2131 , \ 16 1 ! +0000 , \ 17 +0000 , \ 18 +0000 , \ 19 +5A7A , \ 1A z Z +5373 , \ 1B s S +4161 , \ 1C a A +5777 , \ 1D w W +4032 , \ 1E 2 @ +0000 , \ 1F +0000 , \ 20 +4363 , \ 21 c C +5878 , \ 22 x X +4464 , \ 23 d D +4565 , \ 24 e E +2434 , \ 25 4 $ +2333 , \ 26 3 # +0000 , \ 27 +0000 , \ 28 +2020 , \ 29 Space +5676 , \ 2A v V +4666 , \ 2B f F +5474 , \ 2C t T +5272 , \ 2D r R +2535 , \ 2E 5 % +0000 , \ 2F +0000 , \ 30 +4E6E , \ 31 n N +4262 , \ 32 b B +4868 , \ 33 h H +4767 , \ 34 g G +5979 , \ 35 y Y +5E36 , \ 36 6 ^ +0000 , \ 37 +0000 , \ 38 +0000 , \ 39 +4D6D , \ 3A m M +4A6A , \ 3B j J +5575 , \ 3C u U +2637 , \ 3D 7 & +2A38 , \ 3E 8 * +0000 , \ 3F +0000 , \ 40 +3C2C , \ 41 , < +4B6B , \ 42 k K +4969 , \ 43 i I +4F6F , \ 44 o O +2930 , \ 45 0 ) +2839 , \ 46 9 ( +0000 , \ 47 +0000 , \ 48 +3E2E , \ 49 . > +3F2F , \ 4A / ? +4C6C , \ 4B l L +3A3B , \ 4C ; : +5070 , \ 4D p P +5F2D , \ 4E - _ +0000 , \ 4F +0000 , \ 50 +0000 , \ 51 +2227 , \ 52 ' " +0000 , \ 53 +7B5B , \ 54 [ { +2B3D , \ 55 = + +0000 , \ 56 +0000 , \ 57 +0000 , \ 58 Caps Lock +0000 , \ 59 Right Shift +0D0D , \ 5A Enter +7D5D , \ 5B ] } +0000 , \ 5C +7C5C , \ 5D \ | +0000 , \ 5E +0000 , \ 5F +0000 , \ 60 +0000 , \ 61 +0000 , \ 62 +0000 , \ 63 +0000 , \ 64 +0000 , \ 65 +0808 , \ 66 Backspace +0000 , \ 67 +0000 , \ 68 +3100 , \ 69 END, NUM 1 +0000 , \ 6A +3400 , \ 6B LEFT, NUM 4 +3700 , \ 6C HOME, NUM 7 +0000 , \ 6D +0000 , \ 6E +0000 , \ 6F +3000 , \ 70 INS, NUM 0 +2E00 , \ 71 DEL, NUM . +3200 , \ 72 DOWN, NUM 2 +3500 , \ 73 , NUM 5 +3600 , \ 74 RIGHT,NUM 6 +3800 , \ 75 UP, NUM 8 +1B1B , \ 76 ESC +0000 , \ 77 NUM LOCK +0000 , \ 78 F11 +2B2B , \ 79 NUM + +3300 , \ 7A PgDwn,NUM 3 +2D2D , \ 7B NUM - +2A2A , \ 7C NUM * +3900 , \ 7D PgUp, NUM 9 +0000 , \ 7E SCROLL LOCK +0000 , \ 7F +\ 83 F7 diff --git a/amforth-6.5/avr8/lib/hardware/keyboard.frt b/amforth-6.5/avr8/lib/hardware/keyboard.frt new file mode 100644 index 0000000..7182f26 --- /dev/null +++ b/amforth-6.5/avr8/lib/hardware/keyboard.frt @@ -0,0 +1,486 @@ +\ Keyboard PS/2 - Lubos Pekny, www.forth.cz +\ Library for amforth 3.0 mFC 1.0 + +\ V.1.2v, 29.01.2009, add vocabulary + +\ V.1.2, 14.01.2009, tested on atmega32, amforth 3.0 +\ - add err bit in kbd_FLGR +\ - add sync to kbd_ekey? + +\ V.1.1, 06.07.2008, tested on atmega32, amforth 2.7 +\ - changes in key->ps2, kbd_ascii, kbd_sync, appl_kbdlcd +\ - optimalized restart and clk-sync + +\ V.1.0, 03.07.2008, tested on atmega32, amforth 2.7 +\ - used INT2 + 1 pin +\ - kbd_init kbd_char kbd_ekey? kbd_ekey +\ - ekey? ekey ekey>char ekey>fkey key? key + +\ a = char a $61 +\ shift+a = char A $41 +\ ctrl+a = no char, events $401C +\ ctrl+shift+a = char $01 +\ alt+char = $80+char +\ alt+ctrl+shift+a = char $81 + +#include key2char.frt \ V 1.0, 26.05.2008 + +hex + +forth + definitions \ into vocabulary + +38 constant PORTB \ Atmega32, PB.2 (INT2)<-clk, PB.1 (in)<-data out + +forth + definitions \ into vocabulary + +variable PENDING-CHAR \ for key?, key +variable kbd_CNTR \ r4:w4:b8, 8bit+2x4b circular buf counters +variable kbd_ROTR \ received bits from keyboard +variable kbd_FLGR \ flags, final hi=|alt|ctrl|shift|num|releas|extend|0|err| + \ work lo=|altL|altR|ctrlL|ctrlR|shiftL|shiftR|caps|num| +variable kbd_SKEY \ keyboard scan code+flags + 8 cells allot \ 8 events buf + +8000 constant K-ALT-MASK +4000 constant K-CTRL-MASK +2000 constant K-SHIFT-MASK +1000 constant K-NUM-MASK +0800 constant K-RELEAS-MASK +0400 constant K-EXTEND-MASK +0100 constant K-EVENTS-MASK + + + \ interrupt, keyboard clock +code kbd_clk + R18 push, + R18 3F in, \ SREG 0x3F(0x5F) + R18 push, + R17 push, R16 push, + ZH push, ZL push, + +\ --- Receive bits -- + R16 kbd_ROTR lds, \ received bits reg + R17 kbd_ROTR 1+ lds, + clc, \ CY=0 + PORTB assembler + 22 - 1 sbic, \ PinB.1=1 then CY=1 + sec, + R17 ror, R16 ror, \ CY->R17.7->R16, rotate + kbd_ROTR 1+ R17 sts, + kbd_ROTR R16 sts, \ update variable kbd_ROTR + + R18 kbd_CNTR lds, \ bit counter reg + R18 0F andi, + R18 00 cpi, \ =0 then 0B + adr> brne, + R18 0B ldi, + =0B then 0B + adr> brcs, + R18 0B ldi, + brne, 0 >lbl \ all 8+3 bits? else end + + R16 rol, + R17 rol, \ CY=stopbit + adr> brcc, 1 >lbl \ CY=0 then error end + R16 rol, + R17 rol, \ CY=parity, data + R16 rol, \ CY=startbit + adr> brcs, 2 >lbl \ CY=1? then error end + +\ --- Entry point, R17-scan code + + ZL kbd_FLGR lds, \ work flags + ZH kbd_FLGR 1+ lds, \ final flags + + R18 kbd_CNTR 1+ lds, \ buf counters + R16 R18 mov, \ read:write counter + R16 swap, + R18 inc, \ wr+1, next position + R18 07 andi, \ 3b counters + R16 0F andi, + R16 R18 cp, \ rd=wr+1? ->no overwrite buf + adr> breq, 3 >lbl \ end + + R16 swap, + R16 R18 or, \ rd:wr+1, update counter + + R17 E0 cpi, \ data>=E0 then no update + adr> brcc, 4 >lbl \ skip for EXTEND or RELEAS + + kbd_CNTR 1+ R16 sts, \ update position + +\ --- Flags --- + adr> rcall, 5 >lbl \ make work flags + adr> rcall, 6 >lbl \ make final flags + +\ --- Write to the buf --- + R16 clr, \ write to the kbd_SKEY buf + R18 lsl, \ 2*(wr+1) + ZL kbd_SKEY ldi, \ addr buf + ZH kbd_SKEY >< ldi, + ZL R18 add, + ZH R16 adc, \ ZH:ZL+0:R18 + Z+ R17 st, \ scan code->lo(kbd_SKEY+wr) + R17 kbd_FLGR 1+ lds, + Z+ R17 st, \ flags->hi(kbd_SKEY+wr) + kbd_FLGR 1+ R16 sts, \ clear final flags + R16 R16 cpse, \ end + +\ --- EXTEND or RELEAS --- + 4 rcall, 7 >lbl \ set flag EXTEND or RELEAS + +\ --- End --- + 3 \ from Set err + ZL pop, ZH pop, + R16 pop, R17 pop, + R18 pop, 3F R18 out, + R18 pop, + reti, + +\ --- Set err --- + 2 brcc, \ >=F0 + ZH K-EXTEND-MASK >< ori, + ZH ZH cpse, + < ori, + kbd_FLGR 1+ ZH sts, \ update final flags + ret, + + +\ Make work flags, Caps, LShift, RShift, etc. + 5 rjmp, \ jmp EXTEND + + R17 14 cpi, \ ctrl no EXTEND + 1 brne, + R16 10 ldi, + R17 11 cpi, \ alt + 1 brne, + R16 40 ldi, + adr> rjmp, \ jmp test F0 + + swap brcs, \ jmp num or caps + ZH 03 sbrs, \ F0? + adr> rjmp, \ jmp no RELEAS + R16 com, + ZL R16 and, \ clear flag + ZL ZL cpse, \ skip + < ldi, + ZL 7 sbrc, \ test work flags + ZH K-ALT-MASK >< ori, \ set final flags + ZL 6 sbrc, + ZH K-ALT-MASK >< ori, + ZL 5 sbrc, + ZH K-CTRL-MASK >< ori, + ZL 4 sbrc, + ZH K-CTRL-MASK >< ori, + ZL 3 sbrc, + ZH K-SHIFT-MASK >< ori, + ZL 2 sbrc, + ZH K-SHIFT-MASK >< ori, + ZL 1 sbrc, + ZH R16 eor, + ZL 0 sbrc, + ZH K-NUM-MASK >< ori, + kbd_FLGR 1+ ZH sts, \ update final flags + ret, +end-code + + +940C 0006 i! ' kbd_clk i@ 0007 i! \ Set INT2 vector + + \ INT2 enabled, clear buf +: kbd_init ( -- ) + + -int drop + PORTB c@ 06 or PORTB c! \ pull-up + PORTB 1- c@ F9 and PORTB 1- c! \ DDRB, PB.1,2 in + 54 c@ BF and 54 c! \ MCUCSR.ISC2=0, 0x34(0x54).6, fall + 5B c@ 20 or 5B c! \ GICR.INT2=1, 0x3B(0x5B).5, enable + +int + 0 kbd_CNTR ! 0 kbd_ROTR ! 1 kbd_FLGR ! \ all reset, set num + 10 0 do 0 kbd_SKEY i + c! loop \ clear buffer + -1 PENDING-CHAR ! ; + + + \ convert scan code to visible char +: kbd_char ( u -- char ) \ u=|alt|ctrl|shift|num|releas|extend|0|0|:|8b code| + dup 7F and dup \ -- u c c + kbd_CHARTAB + i@ \ -- u c 2char + swap \ -- u 2char c + dup 68 > swap 7E < and \ c=69..7D then num else shift + if \ -- u 2char + swap K-NUM-MASK and \ num? + else + swap K-SHIFT-MASK and \ shift? + then + if >< then \ swap byte in 2char, Hi->Lo + FF and ; \ -- char + + + \ convert scan code to ascii,+ctrl+alt +: kbd_ascii ( u -- char ) + dup 0C00 and \ releas,extend? + if drop 00 exit then \ event, char 00 + dup kbd_char \ -- u char + dup 0= + if swap drop exit then \ -- 00, isn't visible char + over K-CTRL-MASK and \ -- u char, ctrl? + if + dup 3F > over 60 < and \ 64<=char<96 + if + 40 - \ -- char-64 + else + drop drop 00 exit \ event, char 00 + then + then + swap K-ALT-MASK and \ alt? + if 80 + then ; \ -- char+128 + + + \ int-, set b7 in kbd_CNTR, int+ +code kbd_b7set + R18 push, + R18 3F in, \ SREG 0x3F(0x5F) + R18 push, + cli, + R18 kbd_CNTR lds, \ bit counter reg + R18 80 ori, \ set b7 + kbd_CNTR R18 sts, + sei, + R18 pop, 3F R18 out, + R18 pop, +end-code + + + \ int-, b7=1? then clear kbd_CNTR, int+ +code kbd_b7tst + R18 push, + R18 3F in, \ SREG 0x3F(0x5F) + R18 push, + cli, + + R18 kbd_CNTR lds, \ bit counter reg + R18 rol, + adr> brcc, \ b7=0? then end + R18 clr, + kbd_CNTR R18 sts, \ clear bits counter + + 3ms, int-, int+ + kbd_b7set \ set b7 in kbd_CNTR + 3 ms + kbd_b7tst ; \ b7=1? then clear bits counter + + + \ keyboard events?, rd<>wr counter +: kbd_ekey? ( -- flag ) + kbd_FLGR 1+ c@ 1 and \ flag err is set in kbd_clk + if + kbd_FLGR 1+ dup c@ \ -- addr c + FE and swap c! \ clear err + 3 ms 0 kbd_CNTR c! \ if err then sync + then + kbd_CNTR 1+ c@ \ -- rd:wr, 3b counters + dup 4 lshift F0 and \ -- rd:wr wr:0 + swap F0 and xor ; \ wr=rd?, 0 is false + + + \ Read event, scan code from buffer +: kbd_ekey ( -- u ) \ |alt|ctrl|shift|num|releas|extend|0|0|:|8b code| + begin kbd_ekey? until \ events? + kbd_CNTR 1+ dup c@ dup \ -- addr addr rd:wr rd:wr + 4 rshift 1+ 07 and \ -- addr addr rd:wr 0:rd+1 + >r 0F and r@ 4 lshift or \ -- addr addr rd+1:wr + swap c! \ -- addr, update counter rd + r> 2* kbd_SKEY + @ \ kbd_SKEY+2*(rd+1) @ + kbd_sync ; \ sync after stopbit + + + \ convert num '/','enter' to char +: kbd_numchar ( u -- u|char ) + dup 0FFF and dup \ -- u1 u2 u2 + 054A = swap 55A = or \ -- u1 flag + if + F0FF and kbd_ascii \ num '/','enter' + then ; + + +: ekey? ( -- flag ) + kbd_ekey? ; + + + \ Ascii char or u scan code +: ekey ( -- char|u ) + kbd_ekey dup kbd_ascii \ -- u char + ?dup 0= + if + K-EVENTS-MASK or \ -- u+256 + K-NUM-MASK invert and \ clear num + else + swap drop \ -- char + then + kbd_numchar ; \ '/','enter' + + +: ekey>char ( u -- u false|char true) + dup FF u> + if false else true then ; + + +: ekey>fkey ( u1 -- u2 flag ) + dup ekey>char swap drop 0= ; + + +: ps2key? ( -- flag ) + PENDING-CHAR @ 0< + if + begin + ekey? + while + ekey ekey>char + if + PENDING-CHAR ! true exit + then drop + repeat false exit + then true ; + + +: ps2key ( -- char ) + PENDING-CHAR @ 0< + if + begin + ekey ekey>char 0= + while + drop + repeat exit + then + PENDING-CHAR @ -1 PENDING-CHAR ! ; + + + \ Switch key to ps2 keyboard +: key->ps2 ( -- ) + ['] ps2key ['] key defer! + ['] ps2key? ['] key? defer! + ['] noop ['] /key defer! ; \ v.1.1 add /key + + + \ Switch key to serial port +: key->rx0 ( -- ) + ['] rx0 ['] key defer! + ['] rx0? ['] key? defer! ; + + + \ Alone system PS2-keyboard+LCD20x4 + \ PS2 keyboard started slowly. To delay amforth abouth 0.5s + \ +echo or set eeprom $14.0=H if you need view keyboard char +: appl_kbdlcd + 200 ms \ v.1.1, to delay amforth or app restart + + applturnkey + kbd_init scr_init + key->ps2 emit->scr + ver ; + + +\ Write to the eeprom appl started after switch on. +\ ' appl_kbdlcd 0A e! \ PS2+LCD +\ ' applturnkey 0A e! \ UART0 +\ ' appl_mpc 0A e! \ applturnkey+slave detect + + +\ ----- Test key ----- + + \ info about pressed key, 'Ctrl+c' end loop +: kbd_info ( -- ) + begin + ekey \ get char|event + dup 21 \ 'c' + K-EVENTS-MASK or \ event, no ascii + K-CTRL-MASK or <> \ ctrl+c? + while + dup u. space \ code + dup FF u> \ char + if drop else emit then + cr + repeat drop ; + + \ write text, 'Esc' end loop +: kbd_writer ( -- ) + begin + ps2key \ get char + dup 1B <> \ Esc? + while + emit \ view char + repeat drop ; + +\ end of file diff --git a/amforth-6.5/avr8/lib/hardware/mmc.frt b/amforth-6.5/avr8/lib/hardware/mmc.frt new file mode 100644 index 0000000..f213c9b --- /dev/null +++ b/amforth-6.5/avr8/lib/hardware/mmc.frt @@ -0,0 +1,371 @@ +\ MMC+SD card - Lubos Pekny, www.forth.cz +\ Library for amforth 3.0, mFC modification +\ Max. 4GB no SDHC, access thru buffer 512B or short block or direct + +\ V.1.0, 16.07.2009, tested on atmega32, amforth30mFC12.zip +\ - used SPI (MOSI, MISO, SCK, SS) +\ mmc_init, mmc_CID, mmc_CSD, mmc_read, mmc_mread, mmc_write, +\ mmc_blk@, mmc_blk!, mmc_c@, mmc_c!, mmc_end?, mmc_end! + +\ needs +/-spi for pin configuration +\ needs +/-mmc for slave select action + +hex + +variable mmc_#buf \ position in buf +variable mmc_buf 1FE allot \ 512B RAM + + + \ enable spi for mmc, set I/O +: mmc_+spi ( -- ) + +spi + -spi2x + SPCR_SPE SPCR_MSTR or + spi.f/128 or + spi.mode0 or SPCR c! ; + + \ send dummy byte x-times +: mmc_dummy ( x -- ) + 0 ?do $ff c!spi loop ; + + +\ convert 32b block to byte addr, double 9 lshift +: mmc_blk2addr ( L H -- L H ) + swap dup 9 lshift \ -- H L L<<9 + swap 7 rshift \ -- H L<<9 L>>7 + rot 9 lshift or ; \ -- L<<9 H<<9 + + + \ waiting for cmd response +: mmc_cresp ( -- c|-1 ) + FF 0 do + c@spi dup 80 and 0= \ bit7=0? + if unloop exit then \ -- c, 0=ok + drop \ -- + loop -1 ; \ -- -1, timeout + + + \ waiting for data response +: mmc_dresp ( -- c|-1 ) + FF 0 do + c@spi dup 11 and 1 = \ xxx0ccc1 + if + 0F and unloop exit \ -- c, 5=ok + then + drop \ -- + loop -1 ; \ -- -1, timeout + + + \ waiting for token +: mmc_token ( -- c|-1 ) + FF 0 do + c@spi dup FF - \ <>FF? + if unloop exit then \ -- c, FC,FE=ok + drop \ -- + loop -1 ; \ -- -1, timeout + + + \ waiting while busy, after write +: mmc_busy ( -- 0|-1 ) + FF 0 do + c@spi FF = \ =FF? + if 0 unloop exit then \ -- 0, ok + loop -1 ; \ -- -1, timeout + + + \ send command cmd, data xl, xh +: mmc_cmd ( xl xh cmd -- c|-1 ) + FF c!spi \ flush spi register + 40 or c!spi \ send command cmd + dup >< c!spi c!spi \ send xhh, xhl + dup >< c!spi c!spi \ send xlh, xll + 95 c!spi \ no crc + mmc_cresp ; \ -- c|-1, c=0 no errors + + + \ set block length +: mmc_length ( n -- c|-1 ) + 0 10 mmc_cmd ; \ CMD16 + + + \ stop multiread +: mmc_rstop ( -- c|-1 ) + 0 0 C mmc_cmd \ CMD12 + mmc_busy or -mmc ; \ -- c|-1, c=0 no errors + + + \ stop multiwrite +: mmc_wstop ( -- c|-1 ) + FD c!spi \ Stop tran for CMD25 + FF c!spi \ 1B wait + mmc_busy -mmc ; \ -- c|-1, c=0 no errors + + + \ reset card, idle +: mmc_reset ( -- c|-1 ) + -mmc 10 mmc_dummy \ 74< clk to reset mmc + +mmc + 0 0 0 mmc_cmd ; \ CMD0, -- 1, reset ok + + + \ detect sd card, 0=SD, -1=timeout +: mmc_sd? ( -- c|-1 ) + 0 0 37 mmc_cmd drop \ CMD55 + 0 0 29 mmc_cmd \ ACMD41, -- c + dup 1+ \ -- -1 0, timeout + if 4 and then ; \ SD(R1.2=0) / MMC(R1.2=1) + + + \ wait for init MMC card +: mmc_waitmmc ( -- 0|-1 ) + FF \ -- cnt + begin + 0 0 1 mmc_cmd 0= \ CMD1, -- cnt f + if drop 0 exit then \ -- 0, ok + 1- dup 0= \ -- cnt-1 f + until 1- ; \ -- -1, timeout + + + \ wait for init SD card +: mmc_waitsd ( -- 0|-1 ) + FF \ -- cnt + begin + 0 0 37 mmc_cmd drop \ CMD55 + 0 0 29 mmc_cmd 0= \ ACMD41, -- cnt f + if drop 0 exit then \ -- 0, ok + 1- dup 0= \ -- cnt-1 f + until 1- ; \ -- -1, timeout + + + + + \ check end of sector, for mmc read +: mmc_end? ( -- flag ) + 200 mmc_#buf @ + > 0= dup \ -- c c, -1=end + if \ size<=#buf then + 2 mmc_dummy \ dummy crc + then ; + + +\ check end of sector, wait for no busy, for mmc write +: mmc_end! ( -- 0|-1 ) + mmc_end? \ -- flag, crc dummy for end + if + mmc_dresp 5 <> \ -- 0, 0=ok, response + mmc_busy or \ -- c, 0=ok, writed + else 0 then ; \ -- c, 0=ok, -1=timeout + + +: mmc_buf> ( addr n -- 0|-1 ) + dup mmc_#buf +! \ +n, update buf position + 0 ?do \ addr n -- send n bytes from addr + dup c@ c!spi 1+ \ -- addr+1 + loop drop + \ n!spi + mmc_end! ; \ -- c, 0=ok, -1=timeout + + + \ copy spi to buf +: mmc_>buf ( addr n -- ) + dup mmc_#buf +! \ +n, update buf position + 0 ?do \ write n bytes to addr + c@spi over c! 1+ \ -- addr+1 + loop drop +\ n@spi + mmc_end? drop ; \ crc dummy for end + + + \ wait for token, copy first n bytes to buf +: mmc_(read) ( n 0 -- c|-1 ) + 0 mmc_#buf ! \ reset buf position + dup 0= \ 0 -- , cmd ok + if + drop mmc_token dup \ c -- c c + FE = + if + drop mmc_buf swap \ -- addr n + mmc_>buf 0 \ -- 0, ok + else + swap drop \ n c -- c + then + else + swap drop \ n c -- c + then ; \ 0=ok, -1=timeout + + + \ copy first n bytes to card, response, busy +: mmc_(write) ( n 0 -- c|-1 ) + 0 mmc_#buf ! \ reset buf position + dup 0= \ 0 -- , cmd ok + if + drop FF c!spi \ wait 1B + FE c!spi \ send start byte + mmc_buf swap \ -- addr n + mmc_buf> \ -- c, 0=ok, -1=timeout + else + swap drop \ n c -- c + then ; \ 0=ok, -1=timeout + + + \ copy first n bytes to card, multiwrite, busy +: mmc_(mwrite) ( n 0 -- c|-1 ) + 0 mmc_#buf ! \ reset buf position + dup 0= \ 0 -- , cmd ok + if + drop FF c!spi \ wait 1B + FC c!spi \ send start byte + mmc_buf swap \ -- addr n + mmc_buf> \ -- c, 0=ok, -1=timeout + else + swap drop \ n c -- c + then ; \ 0=ok, -1=timeout + + +\ ----- final words ----- + + \ initialize card MMC or SD v.1.x +: mmc_init ( -- x|-1 ) + 0 mmc_#buf ! + mmc_+spi \ init spi, I/O + mmc_reset \ -- c, 1=ok + dup 1- + if -mmc 100 xor exit then \ <>1 then exit + drop \ -- + + mmc_sd? \ detect SD + dup 0< \ -- 0, SD + if -mmc 200 xor exit then \ -1 --, timeout + if + mmc_waitmmc \ MMC init + else + mmc_waitsd \ SD init + then + 200 mmc_length \ set sector length + or -mmc ; \ -- 0|-1, 0=ok, -1=timeout + + + \ read CID register 16B +: mmc_CID ( -- c|-1 ) + +mmc 10 \ length 16B + 0 0 A mmc_cmd \ CMD10, + mmc_(read) \ 10 c -- c, 0=ok, -1=timeout + 2 mmc_dummy \ dummy CRC + -mmc ; + + + \ read CSD register 16B +: mmc_CSD ( -- c|-1 ) + +mmc 10 \ length 16B + 0 0 9 mmc_cmd \ CMD9 + mmc_(read) \ 10 c -- c, 0=ok, -1=timeout + 2 mmc_dummy \ dummy CRC + -mmc ; + + + \ open sector for read, copy n bytes to buf + \ 200 ABCD 7F mmc_read \ open,copy 512B from sector + \ 0 ABCD 7F mmc_read \ only open sector 7FABCD +: mmc_read ( n xl xh -- c|-1 ) \ length, sector addr + +mmc + mmc_blk2addr \ addr*512, block->byte + 11 mmc_cmd \ addrL addrH 11 --, CMD17 + mmc_(read) \ n c -- c, 0=ok, -1=timeout + -mmc ; + + + \ open sector for multi read, copy n bytes to buf +: mmc_mread ( n xl xh -- c|-1 ) \ length, sector addr + +mmc + mmc_blk2addr \ addr*512, block->byte + 12 mmc_cmd \ addrL addrH 12 --, CMD18 + mmc_(read) \ n c -- c, 0=ok, -1=timeout + -mmc ; + + + \ open sector for write, copy n bytes from buf to card +: mmc_write ( n xl xh -- c|-1 ) \ length, sector addr + +mmc + mmc_blk2addr \ addr*512, block->byte + 18 mmc_cmd \ addrL addrH 18 --, CMD24 + mmc_(write) \ n c -- c, 0=ok, -1=timeout + -mmc ; + + + \ open sector for multi write, copy n bytes from buf to card +: mmc_mwrite ( n xl xh -- c|-1 ) \ length, sector addr + +mmc + mmc_blk2addr \ addr*512, block->byte + 19 mmc_cmd \ addrL addrH 19 --, CMD25 + mmc_(mwrite) \ n c -- c, 0=ok, -1=timeout + -mmc ; + + + \ read short block from opened sector to buf + \ use mmc_read or mmc_(read) first +: mmc_blk@ ( addr n -- ) \ addr, length of blk + +mmc + mmc_>buf \ addr n -- ,copy spi to buf + -mmc ; + + + \ write short block to opened sector from buf + \ use mmc_write or mmc_(write) first +: mmc_blk! ( addr n -- 0|-1 ) \ addr, length of blk + +mmc + mmc_buf> \ addr n -- 0|-1, from buf + -mmc ; \ 0=ok, -1=timeout + + + \ direct read byte from opened sector + \ note: +mmc, if end of sector then dummy crc, -mmc +: mmc_c@ ( -- c ) + c@spi \ read byte from card + 1 mmc_#buf +! ; \ increment position + + + \ direct write byte to opened sector + \ note: +mmc, if end of sector then mmc_end!, -mmc +: mmc_c! ( c -- ) + c!spi \ write byte to card + 1 mmc_#buf +! ; \ increment position + + + \ view n bytes from mmc_buf+offset +: mmc. ( n offset -- ) + mmc_buf + swap + 0 ?do \ addr n -- view n bytes from addr + dup c@ . 1+ \ -- addr+1 + loop drop ; + + +\ sptx Stop transmit + +: mmc_tstmread ( n -- ) \ read n x 1MB + 0 . + 200 0 0 mmc_mread . \ open for multiread + +mmc + 0 ?do + 800 1 do \ 1MB + 200 0 mmc_(read) \ 512B + drop + loop + i . + loop 0 . + mmc_rstop drop ; + + +: mmc_tstread ( n -- ) \ read n x 1MB + 0 . + 200 0 0 mmc_read . + 0 ?do + 800 1 do \ 1MB + 200 0 0 mmc_read \ 512B + drop + loop + i . + loop 0 . ; + + +\ sptx Stop transmit + diff --git a/amforth-6.5/avr8/lib/hardware/mpc485.frt b/amforth-6.5/avr8/lib/hardware/mpc485.frt new file mode 100644 index 0000000..811b9b3 --- /dev/null +++ b/amforth-6.5/avr8/lib/hardware/mpc485.frt @@ -0,0 +1,156 @@ +\ Multi-processor communication RS485 - Lubos Pekny, www.forth.cz +\ Library for amforth 3.0, mFC modification + +\ V.1.0, 30.01.2009, tested on atmega32, amforth30mFC10.zip +\ - used PD.7 for switch RX/TX RS485 + +hex + +forth + definitions \ into vocabulary + +\ usart i/o atmega32 +32 constant PORTD +2B constant UCSRA +2A constant UCSRB +40 constant UCSRC + +forth + definitions \ into vocabulary + +06 constant ACK +15 constant NAK + + \ wait for tx complete, rx ready +: txc ( -- ) + + begin PORTD @ 80 and 0= until ; \ wait for PD.7=0 + + + \ initialize multi-processor communication 7-bit + \ modul is waiting for address, b7=1 +: +mpc7 ( -- ) + + txc \ wait for tx complete + UCSRA c@ 01 or UCSRA c! \ MPCM=1, multiprocessor + 8C UCSRC c! ; \ UCSZ=10, no parity, 2 Stopbits + + + \ initialize no MPC communication 8-bit + \ modul receive/transmit 8-bit data, b7=0 +: -mpc7 ( -- ) + + UCSRA c@ FE and UCSRA c! \ MPCM=0, no multiprocessor + 86 UCSRC c! ; \ UCSZ=11, no parity, 1 Stopbit + + + \ write ID to mpc_ID and eeprom 000C +: mpc_ID! ( x -- ) + dup 12 e! \ 16b to $0012:0013 + mpc_ID c! ; \ 8b ID to RAM + + + \ send buffer+CR+crc if enabled + \ if n=0 then send CR only +: mpc_sendbuf ( addr n -- ) + dup 0= \ n=0? + if + drop drop 0D tx0 exit + then + begin + over over 0 \ -- addr n addr n 0 + do + dup i + c@ tx0 \ send buffer + loop over \ -- addr n addr n + 0D tx0 \ send CR + crc \ -- c1 c2 c3 c4 flag + if + 4 0 do tx0 loop \ send crc4-1 + rx0 \ wait for ack/nak + else + ACK + then + ACK = + until drop drop ; \ ACK or crc disabled + + + \ send ID, slave initialized for communication +: mpc_call ( c -- ) \ ID + 0 tx0 \ delay + 80 or tx0 \ set 7.bit+ID, for slave + +mpc7 ; \ modul off, wait for ID + + + \ send command line for ID.slave +: mpc_line ( c -- ) \ ID + mpc_call \ ID.slave + tib >in @ \ -- addr offs + swap over + \ -- offs addr+ + #tib @ rot - \ -- addr+ n + -mpc7 + mpc_sendbuf + 0 #tib ! ; \ stop interpret + + + \ terminal-char, text commands for slave + \ send char, until ESC +: mpc_termc ( -- ) + begin + rx0? + if rx0 emit then \ answer + key? + if + key dup tx0 \ send char + 1B = + else + 0 + then + until ; \ until ESC pressed + + +: ~end +mpc7 ; +: ~call mpc_call ; +: ~line mpc_line ; +: ~id mpc_ID c@ ; + + + \ init mpc after restart, $14.7=1 then slave +: appl_mpc ( -- ) + applturnkey \ init vocabulary, ID, echo, antic + 14 e@ 80 and \ default echo b7=1 then slave, wait + if +mpc7 then ; \ ~end + +' appl_mpc 0A e! \ write appl_mpc to eeprom APPLTURNKEY + +\ echo c@ 80 or 14 e! \ set slave after restart +\ echo c@ 7F and 14 e! \ set master, no wait + +\ ditx Disable transmit + +\ ----- Test ----- +\ master: PC, 8-bits data, bit 7 cleared +\ two slaves: ID=2, ID=5 +\ slave ID5: 4 3 + 5 +\ slave ID2: + +\ result: C +\ +antic ~end modules are waiting +\ alt+0133 send 128+5, select slave ID5 +\ !! wait line by line +\ Forfiter: TestOK=Off, CRdelay=1000 or TestOK=On, F8-step by step +\ if loop created then try backspace, enter or +crc ~end from editor + +~id . \ 5, view selected slave +2 ~call \ switch to slave ID2 +~id . \ 2, this run on slave ID2 +5 ~line 4 3 + . cr ~end \ send line from slave ID2 to ID5 + \ "5 ~line" run on slave ID2 + \ "4 3 + . cr ~end" run on slave ID5 + \ 7, store to slave ID2 TOS +5 ~line ~id . cr ~end \ " ~id . cr ~end" run on slave ID5 + \ 5, store to slave ID2 TOS ++ . \ C, run on slave ID2 +5 ~call \ switch to slave ID5, run on slave ID2 +~id . \ 5, run on slave ID5 + +\ entx Enable transmit +\ end of file diff --git a/amforth-6.5/avr8/lib/hardware/spi.frt b/amforth-6.5/avr8/lib/hardware/spi.frt new file mode 100644 index 0000000..49dbd19 --- /dev/null +++ b/amforth-6.5/avr8/lib/hardware/spi.frt @@ -0,0 +1,110 @@ +\ SPI routines + +\ requires: 2rvalue (with further deps) +\ bitnames + +#require 2rvalue.frt +#require bitnames.frt + +\ definitions from application, matching the +\ SPI hardware pins +\ PORTB 1 portpin: spi.clk +\ PORTB 2 portpin: spi.mosi +\ PORTB 3 portpin: spi.miso + +\ usage + +\ specific slave select pin +\ PORTX PINY portpin: appl.ss_line +\ appl.ss_line to spi.ss + +0. 2rvalue spi.ss + +\ update spi.ss to the actual setup +\ +spi -- turn on SPI module, sets up the pins as well +\ spi.modeX spi.setmode -- switch clock polarity/clock phase +\ spi.f/X spi.setspeed -- select spi clock rate relative to f_cpu +\ +spi.2x -- double speed +\ -spi.2x -- normal speed +\ -spi -- turn off SPI +\ + +\ following definitions are the same for all atmegas + +SPSR 0 portpin: spi.2x + +SPCR 6 portpin: spi.enable +SPCR 5 portpin: spi.dord +SPCR 4 portpin: spi.master +SPCR %00001100 bitmask: spi.mode +SPCR %00000011 bitmask: spi.speed + +$0 constant spi.mode0 \ sample rising/-- +$4 constant spi.mode1 \ --/sample falling +$8 constant spi.mode2 \ sample falling/-- +$c constant spi.mode3 \ --/sample rising + +0 constant spi.f/4 +1 constant spi.f/16 +2 constant spi.f/64 +3 constant spi.f/128 + +: +spi + \ Slave select *must* be *always* at a controlled level when SPI is activated. + \ Changing a pin into output mode change its level to low. that makes a SPI think + \ a communication has started which is not the case when this word is called. + spi.ss high \ deselect slave + spi.ss pin_output \ possibly short low pulse + spi.ss high \ + + \ now its save to turn on the SPI module + spi.master high + spi.enable high + + \ since spi.ss is HIGH, nobody will be confused + spi.clk pin_output + spi.mosi pin_output + \ miso is controlled by SPI module internally +; + +: -spi 0 SPCR c! ; + +\ check SPI device datasheet for mode settings +: spi.setmode ( spi-mode -- ) + spi.mode pin! +; + +\ speed relative to f_cpu, constants see above +: spi.setspeed ( spi.speed -- ) + spi.speed pin! +; + +\ double speed mode +: +spi2x + spi.2x high +; + + +: -spi2x + spi.2x low +; + +\ send a byte, ignore recieved byte +: c!spi ( c -- ) + c!@spi drop +; + + \ receive a byte, send a dummy one +: c@spi ( -- c) + 0 c!@spi +; + +\ send a cell, check data order for MSB/LSB +\ untested so far +: !@spi + dup >< ( -- low high ) + spi.dord is_high? if swap then \ LSB first + c!@spi swap c!@spi + spi.dord is_low? if swap then \ MSB was first + >< or \ upper nibble is set to 0 automatically +; diff --git a/amforth-6.5/avr8/lib/hardware/timer0.frt b/amforth-6.5/avr8/lib/hardware/timer0.frt new file mode 100644 index 0000000..29670e6 --- /dev/null +++ b/amforth-6.5/avr8/lib/hardware/timer0.frt @@ -0,0 +1,43 @@ +\ TIMER_0 example +\ +\ requires +\ in application master file +\ .set WANT_TIMER_COUNTER_0 = 1 +\ from device.frt +\ TIMER0_OVFAddr +\ provides +\ timer0.tick -- increasing ticker +\ +\ older mcu's may need +TCCR0 constant TCCR0B +TIMSK constant TIMSK0 + +variable timer0.tick + +: timer0.isr + 1 timer0.tick +! +; + +\ preload for overflow interrupt every 1ms +\ preload = 256 - (f_cpu / (prescaler * 1000)) + +: timer0.preload + f_cpu #1000 um/mod nip 64 / 256 - negate +; + +: timer0.init ( -- ) + timer0.preload TCNT0 c! + 0 timer0.tick ! + ['] timer0.isr TIMER0_OVFAddr int! +; + +: timer0.start + timer0.init + %00000011 TCCR0B c! \ prescaler 64 + %00000001 TIMSK0 c! \ enable overflow interrupt +; + +: timer0.stop + %00000000 TCCR0B c! \ stop timer + %00000000 TIMSK0 c! \ stop interrupt +; diff --git a/amforth-6.5/avr8/lib/hardware/timer1.frt b/amforth-6.5/avr8/lib/hardware/timer1.frt new file mode 100644 index 0000000..7ab9061 --- /dev/null +++ b/amforth-6.5/avr8/lib/hardware/timer1.frt @@ -0,0 +1,44 @@ +\ TIMER_1 example +\ +\ requires +\ in application master file +\ .set WANT_TIMER_COUNTER_1 = 1 +\ from device.frt +\ TIMER1_OVFAddr +\ provides +\ timer1.tick -- increasing ticker +\ +\ older mcu's may need +\ TCCR1 constant TCCR1B +\ TIMSK constant TIMSK1 + +variable timer1.tick + +: timer1.isr + 1 timer1.tick +! +; + +\ preload for overflow interrupt every 1 ms +\ preload = 65536 - (f_cpu / (prescaler * 1000)) + +: timer1.preload + f_cpu #1000 um/mod nip 8 / negate +; + +: timer1.init ( -- ) + timer1.preload TCNT1 ! + 0 timer1.tick ! + ['] timer1.isr TIMER1_OVFAddr int! +; + +: timer1.start + timer1.init + 0 timer1.tick ! + %00000010 TCCR1B c! \ prescaler 8 + %00000001 TIMSK1 c! \ enable overflow interrupt +; + +: timer1.stop + %00000000 TCCR1B c! \ stop timer + %00000000 TIMSK1 c! \ stop interrupt +; diff --git a/amforth-6.5/avr8/lib/hardware/timer2.frt b/amforth-6.5/avr8/lib/hardware/timer2.frt new file mode 100644 index 0000000..ed0472f --- /dev/null +++ b/amforth-6.5/avr8/lib/hardware/timer2.frt @@ -0,0 +1,42 @@ +\ TIMER_2 example +\ uses an external 32kHz clock quartz +\ 32kHz / 256 => 128 ticks per second +\ 7.8125 ms per tick (gets approximated) +\ --> less accurate than the other timers, but... +\ +\ 16 ticks are 125ms +\ 125 = 15*8+5: 15x 8-tock and a short step +\ or 125 = 15*7+20:15x 7-tock and a huge step +\ -> we choose the 1st variant +\ provides +\ timer2.tick -- increasing ticker +\ + +variable timer2.tick +variable timer2.tock \ used internally + +: timer2.isr ( -- ) + timer2.tock @ 1+ 15 = if + 0 timer2.tock ! + 5 timer2.tick +! + else + 8 timer2.tick +! + 1 timer2.tock +! + then +; + +: timer2.init ( -- ) + 1 TCCR2 c! + 8 ASSR c! + ['] timer2.isr TIMER2_OVFAddr int! +; + +: timer2.start + 0 timer2.tick ! + 0 timer2.tock ! + TIMSK c@ $40 or TIMSK c! ( enable timer2 interupt ) +; + +: timer2.stop + TIMSK c@ [ $40 invert ] literal and TIMSK c! \ stop timer2 interrupt +; diff --git a/amforth-6.5/avr8/lib/imove.frt b/amforth-6.5/avr8/lib/imove.frt new file mode 100644 index 0000000..bf33697 --- /dev/null +++ b/amforth-6.5/avr8/lib/imove.frt @@ -0,0 +1,12 @@ +\ copy a string from flash to RAM +\ +\ i->d on the msp430, and the same stack as cmove +\ +: imove ( i-addr len ram -- ) + rot rot dup 1 and >r \ ( ram i-addr len ) ( r: odd ) + 2/ over + dup >r \ ( ram i-addr i-addr' ) ( r: odd i-addr' ) + swap \ ( ram i-addr' i-addr ) + ?do i @i over ! cell+ loop \ ( ram' ) + r> r> \ ( ram' i-addr' odd ) + if @i swap c! else 2drop then +; diff --git a/amforth-6.5/avr8/lib/portio.frt b/amforth-6.5/avr8/lib/portio.frt new file mode 100644 index 0000000..4d40c46 --- /dev/null +++ b/amforth-6.5/avr8/lib/portio.frt @@ -0,0 +1,46 @@ +\ Only for PORTx bits, +\ because address of DDRx is one less than address of PORTx. + +\ Set DDRx so its corresponding pin is output. +: pin_output ( pinmask portadr -- ) + 1- bm:high +; + +\ Set DDRx so its corresponding pin is input. +: pin_input ( pinmask portadr -- ) + 1- bm:low +; + +\ PINx is two less of PORTx +: pin_high? ( pinmask portaddr -- f) + 1- 1- c@ and +; + +: pin_low? ( pinmask portaddr -- f) + 1- 1- c@ invert and +; + +\ read the pins masked as input +: pin@ ( pinmask portaddr -- c ) + 1- 1- c@ and +; + +\ toggle the pin +: toggle ( pinmask portaddr -- ) + 2dup bm:high? if + bm:low + else + bm:high + then +; + +\ disable the pull up resistor +: pin_pullup_off ( pinmask portaddr -- ) + 2dup pin_input low +; + + +\ enable the pull up resistor +: pin_pullup_on ( pinmask portaddr -- ) + 2dup pin_input high +; diff --git a/amforth-6.5/avr8/lib/ram.frt b/amforth-6.5/avr8/lib/ram.frt new file mode 100644 index 0000000..fb37ab7 --- /dev/null +++ b/amforth-6.5/avr8/lib/ram.frt @@ -0,0 +1,225 @@ +\ RAM - 512kB sram memory, Lubos Pekny, www.forth.cz +\ Library for amforth 3.0, mFC modification +\ ram_init, ram_addr, ram_addr+, ram_read, ram_write, ram_off +\ ram_c@, ram_c!, ram_c@+, ram_c!+ + +\ V.1.1, 28.07.2009, asm optimalization, amforth30mFC12.zip +\ V.1.0, 20.03.2009, tested on atmega32, amforth30mFC11.zip +\ - used bitnames.frt +\ - used PA0-7, PB0-2, PC2-7 + +hex + +forth + definitions \ into vocabulary + +3B constant PORTA \ ATmega32 +\ 38 constant PORTB +\ 35 constant PORTC + + +forth + definitions \ into vocabulary + + +PORTC 02 portpin: ram_WRL \ PC.2 set low 8b addr +PORTC 03 portpin: ram_WRH \ PC.3 set high 8b addr +PORTC 04 portpin: ram_INC \ PC.4 increment addr +PORTC 05 portpin: ram_WR \ PC.5 write to sram +PORTC 06 portpin: ram_OE \ PC.6 output enable +PORTC 07 portpin: ram_CS \ PC.7 chip select +PORTA constant ram_DATA \ PA data 8b, in/out +: ram_PAGE 07 PORTB ; \ PB.0-2 out +: ram_CTRL FC PORTC ; \ PC.2-7 out + + \ define macros +: ram_din, + assembler + R16 0 ldi, + ram_DATA 1- R16 sts, ; + +: ram_dout, + assembler + R16 FF ldi, + ram_DATA 1- R16 sts, ; + + + \ data port direction - input +code ram_din ( -- ) + ram_din, +end-code + + + \ data port direction - output +code ram_dout ( -- ) + ram_dout, +end-code + + + \ set I/O +: ram_init ( -- ) + + -jtag \ port C i/o + ram_din \ port in + ram_PAGE pin_output \ out + ram_CTRL pin_output \ out + ram_PAGE high \ last page + ram_CTRL high ; \ sram disabled + + + \ set low 8b addr +code ram_addrl ( c -- ) + ram_DATA TOSL sts, \ data + loadtos, \ delete c + + ram_WRL low, + ram_WRL high, \ set counter +end-code + + + \ set high 8b addr +code ram_addrh ( c -- ) + ram_DATA TOSL sts, \ data + loadtos, \ delete c + + ram_WRH low, + ram_WRH high, \ set counter +end-code + + + \ set addr, sram off, port input +: ram_addr ( addr page -- ) + + ram_CS high \ sram disabled + ram_PAGE pin! \ set page + ram_dout \ port out + dup ram_addrl \ addr low + >< ram_addrh \ addr high + ram_din ; \ port in + + + \ increment addr +code ram_addr+ ( -- ) + + ram_INC low, + ram_INC high, \ increment addr +end-code + + + \ set pins for read from sram +code ram_read ( -- ) + + ram_din, \ port in + ram_OE low, + ram_CS low, \ out and chip enabled +end-code + + + \ set pins for write to sram +code ram_write ( -- ) + + ram_OE high, + ram_CS low, \ chip enabled + ram_dout, \ port out +end-code + + + \ set pins for disable sram +code ram_off ( -- ) + + ram_CS high, + ram_OE high, \ sram disabled + ram_din, \ port in +end-code + + + \ write pulse +code ram_clk ( -- ) + + ram_WR low, + ram_WR high, \ write to sram +end-code + + + \ read from sram +: ram_c@ ( -- c ) + ram_read \ sram enabled, out + [ ram_DATA 1- 1- ] \ convert to literal + literal c@ \ read byte from sram + ram_off ; + + + \ write to sram +: ram_c! ( c -- ) + ram_write \ sram enabled, in + ram_DATA c! \ write byte to sram + ram_clk \ write pulse + ram_off ; + + + \ read from sram, increment addr, page 64kB + \ use ram_read ram_c@+ .... ram_off +code ram_c@+ ( -- c ) + \ ram_DATA 1- 1- c@ + savetos, \ add item + TOSL ram_DATA 1- 1- lds, \ port -> tosl + TOSH 0 ldi, \ 0 -> tosh + + \ ram_addr+ + ram_INC ma2pbi \ mask addr -- port bit + over over \ 2dup + assembler + cbi, nop, sbi, \ pulse INC +end-code + + + \ write to sram, increment addr, page 64kB + \ use ram_write ram_c!+ .... ram_off +code ram_c!+ ( c -- ) + \ ram_DATA c! + ram_DATA TOSL sts, \ c!, tosl -> port + loadtos, \ delete item + + \ ram_clk + ram_WR ma2pbi \ mask addr -- port bit + over over \ 2dup + assembler + cbi, nop, sbi, \ pulse WR + + \ ram_addr+ + ram_INC ma2pbi \ mask addr -- port bit + over over \ 2dup + assembler + cbi, nop, sbi, \ pulse INC +end-code + + +\ sptx Stop transmit + +\ ----- Test ----- +forth + +ram_init +13 3 0 ram_addr ram_c! \ 13 write at addr 0003, page 0 +14 4 0 ram_addr ram_c! \ 14 write at addr 0004, page 0 + +0 0 ram_addr \ set addr to 0:0000 +ram_write \ mode write +31 ram_c!+ +32 ram_c!+ +33 ram_c!+ \ write 31,32,33 from addr 0:0000 + +0 0 ram_addr \ set addr to 0:0000 +ram_read \ mode read +ram_c@+ . +ram_c@+ . +ram_c@+ . \ read 31,32,33 from addr 0:0000 +ram_c@+ . +ram_c@+ . \ read 13,14 +ram_off + +4 0 ram_addr ram_c@ . \ read 14 at addr 0:0004 +2 0 ram_addr ram_c@ . \ read 33 at addr 0:0002 +3 0 ram_addr ram_c@ . \ read 13 at addr 0:0003 + +\ end of file diff --git a/amforth-6.5/avr8/lib/recognizer-arch.frt b/amforth-6.5/avr8/lib/recognizer-arch.frt new file mode 100644 index 0000000..9f8cb52 --- /dev/null +++ b/amforth-6.5/avr8/lib/recognizer-arch.frt @@ -0,0 +1,8 @@ +\ platform specific core + +\ #require eallot.frt + +: recognizer ( size -- stack-id ) + \ allocate size + 1 cells in config space (eeprom, info flash) + 1+ cells ehere swap eallot dup 0 !e +; diff --git a/amforth-6.5/avr8/lib/run-hayes.frt b/amforth-6.5/avr8/lib/run-hayes.frt new file mode 100644 index 0000000..20442a5 --- /dev/null +++ b/amforth-6.5/avr8/lib/run-hayes.frt @@ -0,0 +1,28 @@ +\ +\ process this file with amforth-upload.py and +\ the proper setting of $AMFORTH_LIB (basedir of +\ you amforth file tree) +\ WIN (untested, DOS Box) +\ cd c:\amforth-x.y +\ set AMFORTH_LIB=c:\amforth-x.y +\ python tools\amforth-upload.py -t com1: examples\run-hayes.frt +\ UNIX / MAC (Terminal) +\ cd $HOME/amforth-x.y +\ export AMFORTH_LIB=$HOME/amforth-x.y +\ tools/amforth-upload.py -t /dev/ttyUSB0 examples/run-hayes.frt +\ enjoy! +\ +\ it is meant to be run on a newly flashed +\ controller, e.g. all the dict_* are included +\ + +#require is.frt + +\ include all sources +#include core.frt +#include double.frt +#include marker.frt +#include tester-amforth.frt +\ and finally run all the tests + +#include core.fr diff --git a/amforth-6.5/avr8/macros.asm b/amforth-6.5/avr8/macros.asm new file mode 100644 index 0000000..6ee20a5 --- /dev/null +++ b/amforth-6.5/avr8/macros.asm @@ -0,0 +1,158 @@ +; conditional assembly needs preparation +.set DICT_COMPILER2 = 0 ; +.set cpu_msp430 = 0 +.set cpu_avr8 = 1 + +.include "user.inc" + + .def zerol = r2 + .def zeroh = r3 + .def upl = r4 + .def uph = r5 + + .def al = r6 + .def ah = r7 + .def bl = r8 + .def bh = r9 + +; internal + .def mcu_boot = r10 + .def isrflag = r11 + + .def temp4 = r14 + .def temp5 = r15 + + .def temp0 = r16 + .def temp1 = r17 + .def temp2 = r18 + .def temp3 = r19 + + .def temp6 = r20 + .def temp7 = r21 + + .def tosl = r24 + .def tosh = r25 + + .def wl = r22 + .def wh = r23 + +.macro loadtos + ld tosl, Y+ + ld tosh, Y+ +.endmacro + +.macro savetos + st -Y, tosh + st -Y, tosl +.endmacro + +.macro in_ +.if (@1 < $40) + in @0,@1 +.else + lds @0,@1 +.endif +.endmacro + +.macro out_ +.if (@0 < $40) + out @0,@1 +.else + sts @0,@1 +.endif +.endmacro + +.macro sbi_ +.if (@0 < $40) + sbi @0,@1 +.else + in_ @2,@0 + ori @2,exp2(@1) + out_ @0,@2 +.endif +.endmacro + +.macro cbi_ +.if (@0 < $40) + cbi @0,@1 +.else + in_ @2,@0 + andi @2,~(exp2(@1)) + out_ @0,@2 +.endif +.endmacro + +.macro jmp_ + ; a more flexible macro + .ifdef @0 + .if (@0-pc > 2040) || (pc-@0>2040) + jmp @0 + .else + rjmp @0 + .endif + .else + jmp @0 + .endif +.endmacro +.macro call_ + ; a more flexible macro + .ifdef @0 + .if (@0-pc > 2040) || (pc-@0>2040) + call @0 + .else + rcall @0 + .endif + .else + call @0 + .endif +.endmacro + +; F_CPU +; µsec 16000000 14745600 8000000 1000000 +; 1 16 14,74 8 1 +; 10 160 147,45 80 10 +; 100 1600 1474,56 800 100 +; 1000 16000 14745,6 8000 1000 +; +; cycles = µsec * f_cpu / 1e6 +; n_loops=cycles/5 +; +; cycles already used will be subtracted from the delay +; the waittime resolution is 1 cycle (delay from exact to +1 cycle) +; the maximum delay at 20MHz (50ns/clock) is 38350ns +; waitcount register must specify an immediate register +; +; busy waits a specfied amount of microseconds +.macro delay + .set cycles = ( ( @0 * F_CPU ) / 1000000 ) + .if (cycles > ( 256 * 255 * 4 + 2)) + .error "MACRO delay - too many cycles to burn" + .else + .if (cycles > 6) + .set loop_cycles = (cycles / 4) + ldi zl,low(loop_cycles) + ldi zh,high(loop_cycles) + sbiw Z, 1 + brne pc-1 + .set cycles = (cycles - (loop_cycles * 4)) + .endif + .if (cycles > 0) + .if (cycles & 4) + rjmp pc+1 + rjmp pc+1 + .endif + .if (cycles & 2) + rjmp pc+1 + .endif + .if (cycles & 1) + nop + .endif + .endif + .endif +.endmacro + +; portability macros, they come from the msp430 branches + +.macro DEST + .dw @0 +.endm diff --git a/amforth-6.5/avr8/preamble.inc b/amforth-6.5/avr8/preamble.inc new file mode 100644 index 0000000..8f141dc --- /dev/null +++ b/amforth-6.5/avr8/preamble.inc @@ -0,0 +1,50 @@ +; generic macros and register definitions +.include "macros.asm" + +; controller specific file selected via include +; directory definition when calling the assembler (-I) +.include "device.asm" + +; some defaults, change them in your application master file +; see template.asm for an example + +; enabling Interrupts, disabling them affects +; other settings as well. +.set WANT_INTERRUPTS = 1 + +; count the number of interrupts individually. +; requires a lot of RAM (one byte per interrupt) +; disabled by default. +.set WANT_INTERRUPT_COUNTERS = 0 + +; receiving is asynchronously, so an interrupt queue is useful. +.set WANT_ISR_RX = 1 + +; case insensitve dictionary lookup. +.set WANT_IGNORECASE = 0 + +; map all memories to one address space. Details in the +; technical guide +.set WANT_UNIFIED = 0 + +; terminal input buffer +.set TIB_SIZE = 90 ; ANS94 needs at least 80 characters per line + +; USER variables *in addition* to system ones +.set APPUSERSIZE = 10 ; size of application specific user area in bytes + +; addresses of various data segments +.set rstackstart = RAMEND ; start address of return stack, grows downward +.set stackstart = RAMEND - 80 ; start address of data stack, grows downward +; change only if you know what to you do +.set NUMWORDLISTS = 8 ; number of word lists in the searh order, at least 8 +.set NUMRECOGNIZERS = 4 ; total number of recognizers, two are always used. + +; 10 per mille (1 per cent) is ok. +.set BAUD = 38400 +.set BAUD_MAXERROR = 10 + +; Dictionary setup +.set VE_HEAD = $0000 +.set VE_ENVHEAD = $0000 +.set AMFORTH_RO_SEG = NRWW_START_ADDR \ No newline at end of file diff --git a/amforth-6.5/avr8/tools/99-avr.rules b/amforth-6.5/avr8/tools/99-avr.rules new file mode 100644 index 0000000..4dc9da4 --- /dev/null +++ b/amforth-6.5/avr8/tools/99-avr.rules @@ -0,0 +1,10 @@ + +# Atmel Corp.JTAG ICE mkII +ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2103", MODE="660", GROUP="plugdev" + +# Atmel Corp. AVRISP mkII +ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2104", MODE="660", GROUP="plugdev" + +# Atmel Corp. Dragon +ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2107", MODE="660", GROUP="plugdev" + diff --git a/amforth-6.5/avr8/user.inc b/amforth-6.5/avr8/user.inc new file mode 100644 index 0000000..ff7bbcd --- /dev/null +++ b/amforth-6.5/avr8/user.inc @@ -0,0 +1,34 @@ +; Layout of the user area +; + +; used by the multitasker +.set USER_STATE = 0 +.set USER_FOLLOWER = 2 + +; stackpointer, used by mulitasker +.set USER_RP = 4 +.set USER_SP0 = 6 +.set USER_SP = 8 + +; excpection handling +.set USER_HANDLER = 10 + +; numeric IO +.set USER_BASE = 12 + +; character IO +.set USER_EMIT = 14 +.set USER_EMITQ = 16 +.set USER_KEY = 18 +.set USER_KEYQ = 20 + +.set USER_SOURCE = 22 +.set USER_TO_IN = 24 +.set USER_REFILL = 26 + +.set USER_P_OK = 28 +.set USER_P_ERR = 30 +.set USER_P_RDY = 32 + +.set SYSUSERSIZE = 34 +; diff --git a/amforth-6.5/avr8/words/1minus.asm b/amforth-6.5/avr8/words/1minus.asm new file mode 100644 index 0000000..ca70fed --- /dev/null +++ b/amforth-6.5/avr8/words/1minus.asm @@ -0,0 +1,13 @@ +; (S: n1 -- n2 ) +; Arithmetics +; optimized decrement +VE_1MINUS: + .dw $ff02 + .db "1-" + .dw VE_HEAD + .set VE_HEAD = VE_1MINUS +XT_1MINUS: + .dw PFA_1MINUS +PFA_1MINUS: + sbiw tosl, 1 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/1ms.asm b/amforth-6.5/avr8/words/1ms.asm new file mode 100644 index 0000000..f23951d --- /dev/null +++ b/amforth-6.5/avr8/words/1ms.asm @@ -0,0 +1,13 @@ +; ( -- ) +; Time +; busy waits (almost) exactly 1 millisecond +VE_1MS: + .dw $ff03 + .db "1ms",0 + .dw VE_HEAD + .set VE_HEAD = VE_1MS +XT_1MS: + .dw PFA_1MS +PFA_1MS: + delay 1000 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/1plus.asm b/amforth-6.5/avr8/words/1plus.asm new file mode 100644 index 0000000..ffaaec2 --- /dev/null +++ b/amforth-6.5/avr8/words/1plus.asm @@ -0,0 +1,13 @@ +; ( n1|u1 -- n2|u2 ) +; Arithmetics +; optimized increment +VE_1PLUS: + .dw $ff02 + .db "1+" + .dw VE_HEAD + .set VE_HEAD = VE_1PLUS +XT_1PLUS: + .dw PFA_1PLUS +PFA_1PLUS: + adiw tosl,1 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/2r_fetch.asm b/amforth-6.5/avr8/words/2r_fetch.asm new file mode 100644 index 0000000..8d0060b --- /dev/null +++ b/amforth-6.5/avr8/words/2r_fetch.asm @@ -0,0 +1,23 @@ +; ( -- d) (R: d -- d ) +; Stack +; fetch content of TOR +VE_2R_FETCH: + .dw $ff03 + .db "2r@",0 + .dw VE_HEAD + .set VE_HEAD = VE_2R_FETCH +XT_2R_FETCH: + .dw PFA_2R_FETCH +PFA_2R_FETCH: + savetos + pop zl + pop zh + pop tosl + pop tosh + push tosh + push tosl + push zh + push zl + savetos + movw tosl, zl + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/2r_from.asm b/amforth-6.5/avr8/words/2r_from.asm new file mode 100644 index 0000000..ffb5a34 --- /dev/null +++ b/amforth-6.5/avr8/words/2r_from.asm @@ -0,0 +1,19 @@ +; ( -- x1 x2 ) (R: x1 x2 --) +; Stack +; move DTOR to TOS +VE_2R_FROM: + .dw $ff03 + .db "2r>",0 + .dw VE_HEAD + .set VE_HEAD = VE_2R_FROM +XT_2R_FROM: + .dw PFA_2R_FROM +PFA_2R_FROM: + savetos + pop zl + pop zh + pop tosl + pop tosh + savetos + movw tosl, zl + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/2slash.asm b/amforth-6.5/avr8/words/2slash.asm new file mode 100644 index 0000000..5d4ada2 --- /dev/null +++ b/amforth-6.5/avr8/words/2slash.asm @@ -0,0 +1,14 @@ +; ( n1 -- n2 ) +; Arithmetics +; arithmetic shift right +VE_2SLASH: + .dw $ff02 + .db "2/" + .dw VE_HEAD + .set VE_HEAD = VE_2SLASH +XT_2SLASH: + .dw PFA_2SLASH +PFA_2SLASH: + asr tosh + ror tosl + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/2spirw.asm b/amforth-6.5/avr8/words/2spirw.asm new file mode 100644 index 0000000..a7064da --- /dev/null +++ b/amforth-6.5/avr8/words/2spirw.asm @@ -0,0 +1,19 @@ +; ( n1 -- n2 ) +; MCU +; SPI exchange of 2 bytes, high byte first +VE_2SPIRW: + .dw $ff05 + .db "!@spi",0 + .dw VE_HEAD + .set VE_HEAD = VE_2SPIRW +XT_2SPIRW: + .dw PFA_2SPIRW +PFA_2SPIRW: + push tosl + mov tosl, tosh + call_ do_spirw + mov tosh, tosl + pop tosl + call_ do_spirw + jmp_ DO_NEXT + diff --git a/amforth-6.5/avr8/words/2star.asm b/amforth-6.5/avr8/words/2star.asm new file mode 100644 index 0000000..ef307e3 --- /dev/null +++ b/amforth-6.5/avr8/words/2star.asm @@ -0,0 +1,14 @@ +; ( n1 -- n2 ) +; Arithmetics +; arithmetic shift left, filling with zero +VE_2STAR: + .dw $ff02 + .db "2*" + .dw VE_HEAD + .set VE_HEAD = VE_2STAR +XT_2STAR: + .dw PFA_2STAR +PFA_2STAR: + lsl tosl + rol tosh + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/2to_r.asm b/amforth-6.5/avr8/words/2to_r.asm new file mode 100644 index 0000000..0e70f18 --- /dev/null +++ b/amforth-6.5/avr8/words/2to_r.asm @@ -0,0 +1,19 @@ +; ( x1 x2 -- ) (R: -- x1 x2) +; Stack +; move DTOS to TOR +VE_2TO_R: + .dw $ff03 + .db "2>r",0 + .dw VE_HEAD + .set VE_HEAD = VE_2TO_R +XT_2TO_R: + .dw PFA_2TO_R +PFA_2TO_R: + movw zl, tosl + loadtos + push tosh + push tosl + push zh + push zl + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/allot.asm b/amforth-6.5/avr8/words/allot.asm new file mode 100644 index 0000000..0356fa4 --- /dev/null +++ b/amforth-6.5/avr8/words/allot.asm @@ -0,0 +1,16 @@ +; ( n -- ) +; System +; allocate or release memory in RAM +VE_ALLOT: + .dw $ff05 + .db "allot",0 + .dw VE_HEAD + .set VE_HEAD = VE_ALLOT +XT_ALLOT: + .dw DO_COLON +PFA_ALLOT: + .dw XT_HERE + .dw XT_PLUS + .dw XT_DOTO + .dw PFA_HERE + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/and.asm b/amforth-6.5/avr8/words/and.asm new file mode 100644 index 0000000..ed31668 --- /dev/null +++ b/amforth-6.5/avr8/words/and.asm @@ -0,0 +1,16 @@ +; ( n1 n2 -- n3 ) +; Logic +; bitwise and +VE_AND: + .dw $ff03 + .db "and",0 + .dw VE_HEAD + .set VE_HEAD = VE_AND +XT_AND: + .dw PFA_AND +PFA_AND: + ld temp0, Y+ + ld temp1, Y+ + and tosl, temp0 + and tosh, temp1 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/bm-clear.asm b/amforth-6.5/avr8/words/bm-clear.asm new file mode 100644 index 0000000..6c47517 --- /dev/null +++ b/amforth-6.5/avr8/words/bm-clear.asm @@ -0,0 +1,19 @@ +; ( bitmask byte-addr -- ) +; MCU +; clear bits set in bitmask on byte at addr +VE_BM_CLEAR: + .dw $ff08 + .db "bm-clear" + .dw VE_HEAD + .set VE_HEAD = VE_BM_CLEAR +XT_BM_CLEAR: + .dw PFA_BM_CLEAR +PFA_BM_CLEAR: + movw zl, tosl + loadtos + com tosl + ld temp0, Z + and temp0, tosl + st Z, temp0 + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/bm-set.asm b/amforth-6.5/avr8/words/bm-set.asm new file mode 100644 index 0000000..1ba5faa --- /dev/null +++ b/amforth-6.5/avr8/words/bm-set.asm @@ -0,0 +1,18 @@ +; ( bitmask byte-addr -- ) +; MCU +; set bits from bitmask on byte at addr +VE_BM_SET: + .dw $ff06 + .db "bm-set" + .dw VE_HEAD + .set VE_HEAD = VE_BM_SET +XT_BM_SET: + .dw PFA_BM_SET +PFA_BM_SET: + movw zl, tosl + loadtos + ld temp0, Z + or temp0, tosl + st Z, temp0 + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/bm-toggle.asm b/amforth-6.5/avr8/words/bm-toggle.asm new file mode 100644 index 0000000..fbbdc21 --- /dev/null +++ b/amforth-6.5/avr8/words/bm-toggle.asm @@ -0,0 +1,18 @@ +; ( bitmask byte-addr -- ) +; MCU +; toggle bits set in bitmask on byte at addr +VE_BM_TOGGLE: + .dw $ff09 + .db "bm-toggle",0 + .dw VE_HEAD + .set VE_HEAD = VE_BM_TOGGLE +XT_BM_TOGGLE: + .dw PFA_BM_TOGGLE +PFA_BM_TOGGLE: + movw zl, tosl + loadtos + ld temp0, Z + eor temp0, tosl + st Z, temp0 + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/byteswap.asm b/amforth-6.5/avr8/words/byteswap.asm new file mode 100644 index 0000000..b49cd2f --- /dev/null +++ b/amforth-6.5/avr8/words/byteswap.asm @@ -0,0 +1,15 @@ +; ( n1 -- n2 ) +; Arithmetics +; exchange the bytes of the TOS +VE_BYTESWAP: + .dw $ff02 + .db "><" + .dw VE_HEAD + .set VE_HEAD = VE_BYTESWAP +XT_BYTESWAP: + .dw PFA_BYTESWAP +PFA_BYTESWAP: + mov temp0, tosh + mov tosh, tosl + mov tosl, temp0 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/cas.asm b/amforth-6.5/avr8/words/cas.asm new file mode 100644 index 0000000..f59ae26 --- /dev/null +++ b/amforth-6.5/avr8/words/cas.asm @@ -0,0 +1,28 @@ +; ( new old addr -- f ) +; Multitasking +; Atomic Compare and Swap: store new at addr and set f to true if contents of addr is equal to old. +VE_CAS: + .dw $ff03 + .db "cas",0 + .dw VE_HEAD + .set VE_HEAD = VE_CAS +XT_CAS: + .dw PFA_CAS +PFA_CAS: + movw zl, tosl + loadtos + ldd temp0, Z+0 + ldd temp1, Z+1 + cp tosl, temp0 + cpc tosh, temp1 + loadtos + brne PFA_CAS1 + std Z+0, tosl + std Z+1, tosh + ser tosl + rjmp PFA_CAS2 +PFA_CAS1: + clr tosl +PFA_CAS2: + mov tosh, tosl + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/cellplus.asm b/amforth-6.5/avr8/words/cellplus.asm new file mode 100644 index 0000000..e75de15 --- /dev/null +++ b/amforth-6.5/avr8/words/cellplus.asm @@ -0,0 +1,13 @@ +; ( a-addr1 -- a-addr2 ) +; Arithmetics +; add the size of an address-unit to a-addr1 +VE_CELLPLUS: + .dw $ff05 + .db "cell+",0 + .dw VE_HEAD + .set VE_HEAD = VE_CELLPLUS +XT_CELLPLUS: + .dw PFA_CELLPLUS +PFA_CELLPLUS: + adiw tosl, CELLSIZE + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/cells.asm b/amforth-6.5/avr8/words/cells.asm new file mode 100644 index 0000000..2876c2d --- /dev/null +++ b/amforth-6.5/avr8/words/cells.asm @@ -0,0 +1,10 @@ +; ( n1 -- n2 ) +; Arithmetics +; n2 is the size in address units of n1 cells +VE_CELLS: + .dw $ff05 + .db "cells",0 + .dw VE_HEAD + .set VE_HEAD = VE_CELLS +XT_CELLS: + .dw PFA_2STAR diff --git a/amforth-6.5/avr8/words/cfetch.asm b/amforth-6.5/avr8/words/cfetch.asm new file mode 100644 index 0000000..97ff7dc --- /dev/null +++ b/amforth-6.5/avr8/words/cfetch.asm @@ -0,0 +1,15 @@ +; ( a-addr - c1 ) +; Memory +; fetch a single byte from memory mapped locations +VE_CFETCH: + .dw $ff02 + .db "c@" + .dw VE_HEAD + .set VE_HEAD = VE_CFETCH +XT_CFETCH: + .dw PFA_CFETCH +PFA_CFETCH: + movw zl, tosl + clr tosh + ld tosl, Z + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/cmove.asm b/amforth-6.5/avr8/words/cmove.asm new file mode 100644 index 0000000..f7a1134 --- /dev/null +++ b/amforth-6.5/avr8/words/cmove.asm @@ -0,0 +1,30 @@ +; (addr-from addr-to n -- ) +; Memory +; copy data in RAM, from lower to higher addresses +VE_CMOVE: + .dw $ff05 + .db "cmove",0 + .dw VE_HEAD + .set VE_HEAD = VE_CMOVE +XT_CMOVE: + .dw PFA_CMOVE +PFA_CMOVE: + push xh + push xl + ld zl, Y+ + ld zh, Y+ ; addr-to + ld xl, Y+ + ld xh, Y+ ; addr-from + mov temp0, tosh + or temp0, tosl + brbs 1, PFA_CMOVE1 +PFA_CMOVE2: + ld temp1, X+ + st Z+, temp1 + sbiw tosl, 1 + brbc 1, PFA_CMOVE2 +PFA_CMOVE1: + pop xl + pop xh + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/cmove_g.asm b/amforth-6.5/avr8/words/cmove_g.asm new file mode 100644 index 0000000..3bcbb4e --- /dev/null +++ b/amforth-6.5/avr8/words/cmove_g.asm @@ -0,0 +1,34 @@ +; (addr-from addr-to n -- ) +; Memory +; copy data in RAM from higher to lower addresses. +VE_CMOVE_G: + .dw $ff06 + .db "cmove>" + .dw VE_HEAD + .set VE_HEAD = VE_CMOVE_G +XT_CMOVE_G: + .dw PFA_CMOVE_G +PFA_CMOVE_G: + push xh + push xl + ld zl, Y+ + ld zh, Y+ ; addr-to + ld xl, Y+ + ld xh, Y+ ; addr-from + mov temp0, tosh + or temp0, tosl + brbs 1, PFA_CMOVE_G1 + add zl, tosl + adc zh, tosh + add xl, tosl + adc xh, tosh +PFA_CMOVE_G2: + ld temp1, -X + st -Z, temp1 + sbiw tosl, 1 + brbc 1, PFA_CMOVE_G2 +PFA_CMOVE_G1: + pop xl + pop xh + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/code.asm b/amforth-6.5/avr8/words/code.asm new file mode 100644 index 0000000..ecbb6d5 --- /dev/null +++ b/amforth-6.5/avr8/words/code.asm @@ -0,0 +1,17 @@ +; ( -- ) (C: cchar -- ) +; Compiler +; create named entry in the dictionary, XT is the data field +VE_CODE: + .dw $ff04 + .db "code" + .dw VE_HEAD + .set VE_HEAD = VE_CODE +XT_CODE: + .dw DO_COLON +PFA_CODE: + .dw XT_DOCREATE + .dw XT_REVEAL + .dw XT_DP + .dw XT_ICELLPLUS + .dw XT_COMMA + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/cold.asm b/amforth-6.5/avr8/words/cold.asm new file mode 100644 index 0000000..4547f55 --- /dev/null +++ b/amforth-6.5/avr8/words/cold.asm @@ -0,0 +1,52 @@ +; ( i*x -- ) (R: j*y -- ) +; System +; start up amforth. +VE_COLD: + .dw $ff04 + .db "cold" + .dw VE_HEAD + .set VE_HEAD = VE_COLD +XT_COLD: + .dw PFA_COLD +PFA_COLD: + in_ mcu_boot, MCUSR + clr zerol + clr zeroh + clr isrflag + out_ MCUSR, zerol + ; clear RAM + ldi zl, low(ramstart) + ldi zh, high(ramstart) +clearloop: + st Z+, zerol + cpi zl, low(sram_size+ramstart) + brne clearloop + cpi zh, high(sram_size+ramstart) + brne clearloop + ; init first user data area + ; allocate space for User Area +.dseg +ram_user1: .byte SYSUSERSIZE + APPUSERSIZE +.cseg + ldi zl, low(ram_user1) + ldi zh, high(ram_user1) + movw upl, zl + ; init return stack pointer + ldi temp0,low(rstackstart) + out_ SPL,temp0 + std Z+4, temp0 + ldi temp1,high(rstackstart) + out_ SPH,temp1 + std Z+5, temp1 + + ; init parameter stack pointer + ldi yl,low(stackstart) + std Z+6, yl + ldi yh,high(stackstart) + std Z+7, yh + + ; load Forth IP with starting word + ldi XL, low(PFA_WARM) + ldi XH, high(PFA_WARM) + ; its a far jump... + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/colon-noname.asm b/amforth-6.5/avr8/words/colon-noname.asm new file mode 100644 index 0000000..8c47fb3 --- /dev/null +++ b/amforth-6.5/avr8/words/colon-noname.asm @@ -0,0 +1,21 @@ +; ( -- xt ) +; Compiler +; create an unnamed entry in the dictionary, XT is DO_COLON +VE_COLONNONAME: + .dw $ff07 + .db ":noname",0 + .dw VE_HEAD + .set VE_HEAD = VE_COLONNONAME +XT_COLONNONAME: + .dw DO_COLON +PFA_COLONNONAME: + .dw XT_DP + .dw XT_DUP + .dw XT_LATEST + .dw XT_STORE + + .dw XT_COMPILE + .dw DO_COLON + + .dw XT_RBRACKET + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/comma.asm b/amforth-6.5/avr8/words/comma.asm new file mode 100644 index 0000000..a9a903b --- /dev/null +++ b/amforth-6.5/avr8/words/comma.asm @@ -0,0 +1,18 @@ +; ( n -- ) +; Dictionary +; compile 16 bit into flash at DP +VE_COMMA: + .dw $ff01 + .db ',',0 ; , + .dw VE_HEAD + .set VE_HEAD = VE_COMMA +XT_COMMA: + .dw DO_COLON +PFA_COMMA: + .dw XT_DP + .dw XT_STOREI + .dw XT_DP + .dw XT_1PLUS + .dw XT_DOTO + .dw PFA_DP + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/compare.asm b/amforth-6.5/avr8/words/compare.asm new file mode 100644 index 0000000..0a33f47 --- /dev/null +++ b/amforth-6.5/avr8/words/compare.asm @@ -0,0 +1,47 @@ +; ( r-addr r-len f-addr f-len -- f) +; String +; compares two strings in RAM +VE_COMPARE: + .dw $ff07 + .db "compare",0 + .dw VE_HEAD + .set VE_HEAD = VE_COMPARE +XT_COMPARE: + .dw PFA_COMPARE +PFA_COMPARE: + push xh + push xl + movw temp0, tosl + loadtos + movw xl, tosl + loadtos + movw temp2, tosl + loadtos + movw zl, tosl +PFA_COMPARE_LOOP: + ld temp4, X+ + ld temp5, Z+ + cp temp4, temp5 + brne PFA_COMPARE_NOTEQUAL + dec temp0 + breq PFA_COMPARE_ENDREACHED2 + dec temp2 + brne PFA_COMPARE_LOOP + rjmp PFA_COMPARE_ENDREACHED +PFA_COMPARE_ENDREACHED2: + dec temp2 +PFA_COMPARE_ENDREACHED: + or temp0, temp2 + brne PFA_COMPARE_CHECKLASTCHAR + clr tosl + rjmp PFA_COMPARE_DONE +PFA_COMPARE_CHECKLASTCHAR: +PFA_COMPARE_NOTEQUAL: + ser tosl + rjmp PFA_COMPARE_DONE + +PFA_COMPARE_DONE: + mov tosh, tosl + pop xl + pop xh + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/const-fold-depth.asm b/amforth-6.5/avr8/words/const-fold-depth.asm new file mode 100644 index 0000000..40b80eb --- /dev/null +++ b/amforth-6.5/avr8/words/const-fold-depth.asm @@ -0,0 +1,18 @@ +; ( flagset -- n ) +; Tools +; constant fold depth +VE_CONSTFOLDDEPTH: + .dw $ff0a + .db "cfolddepth" + .dw VE_HEAD + .set VE_HEAD = VE_CONSTFOLDDEPTH +XT_CONSTFOLDDEPTH: + .dw DO_COLON +PFA_CONSTFOLDDEPTH: + .dw XT_DOLITERAL + .dw $7000 + .dw XT_AND + .dw XT_DOLITERAL + .dw 12 + .dw XT_RSHIFT + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/cstore.asm b/amforth-6.5/avr8/words/cstore.asm new file mode 100644 index 0000000..f953f8f --- /dev/null +++ b/amforth-6.5/avr8/words/cstore.asm @@ -0,0 +1,16 @@ +; ( c a-addr -- ) +; Memory +; store a single byte to RAM address +VE_CSTORE: + .dw $ff02 + .db "c!" + .dw VE_HEAD + .set VE_HEAD = VE_CSTORE +XT_CSTORE: + .dw PFA_CSTORE +PFA_CSTORE: + movw zl, tosl + loadtos + st Z, tosl + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/d-2slash.asm b/amforth-6.5/avr8/words/d-2slash.asm new file mode 100644 index 0000000..e9a67ea --- /dev/null +++ b/amforth-6.5/avr8/words/d-2slash.asm @@ -0,0 +1,20 @@ +; ( d1 -- d2 ) +; Arithmetics +; shift a double cell value right +VE_D2SLASH: + .dw $ff03 + .db "d2/",0 + .dw VE_HEAD + .set VE_HEAD = VE_D2SLASH +XT_D2SLASH: + .dw PFA_D2SLASH +PFA_D2SLASH: + ld temp0, Y+ + ld temp1, Y+ + asr tosh + ror tosl + ror temp1 + ror temp0 + st -Y, temp1 + st -Y, temp0 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/d-2star.asm b/amforth-6.5/avr8/words/d-2star.asm new file mode 100644 index 0000000..f0ca099 --- /dev/null +++ b/amforth-6.5/avr8/words/d-2star.asm @@ -0,0 +1,20 @@ +; ( d1 -- d2 ) +; Arithmetics +; shift a double cell left +VE_D2STAR: + .dw $ff03 + .db "d2*",0 + .dw VE_HEAD + .set VE_HEAD = VE_D2STAR +XT_D2STAR: + .dw PFA_D2STAR +PFA_D2STAR: + ld temp0, Y+ + ld temp1, Y+ + lsl temp0 + rol temp1 + rol tosl + rol tosh + st -Y, temp1 + st -Y, temp0 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/d-greaterzero.asm b/amforth-6.5/avr8/words/d-greaterzero.asm new file mode 100644 index 0000000..30fad34 --- /dev/null +++ b/amforth-6.5/avr8/words/d-greaterzero.asm @@ -0,0 +1,19 @@ +; ( d -- flag ) +; Compare +; compares if a double double cell number is greater 0 +VE_DGREATERZERO: + .dw $ff03 + .db "d0>",0 + .dw VE_HEAD + .set VE_HEAD = VE_DGREATERZERO +XT_DGREATERZERO: + .dw PFA_DGREATERZERO +PFA_DGREATERZERO: + cp tosl, zerol + cpc tosh, zeroh + loadtos + cpc tosl, zerol + cpc tosh, zeroh + brlt PFA_ZERO1 + brbs 1, PFA_ZERO1 + rjmp PFA_TRUE1 diff --git a/amforth-6.5/avr8/words/d-invert.asm b/amforth-6.5/avr8/words/d-invert.asm new file mode 100644 index 0000000..c87ae05 --- /dev/null +++ b/amforth-6.5/avr8/words/d-invert.asm @@ -0,0 +1,20 @@ +; ( d1 -- d2) +; Arithmetics +; invert all bits in the double cell value +VE_DINVERT: + .dw $ff07 + .db "dinvert",0 + .dw VE_HEAD + .set VE_HEAD = VE_DINVERT +XT_DINVERT: + .dw PFA_DINVERT +PFA_DINVERT: + ld temp0, Y+ + ld temp1, Y+ + com tosl + com tosh + com temp0 + com temp1 + st -Y, temp1 + st -Y, temp0 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/d-lesszero.asm b/amforth-6.5/avr8/words/d-lesszero.asm new file mode 100644 index 0000000..afa70c7 --- /dev/null +++ b/amforth-6.5/avr8/words/d-lesszero.asm @@ -0,0 +1,15 @@ +; ( d -- flag ) +; Compare +; compares if a double double cell number is less than 0 +VE_DXT_ZEROLESS: + .dw $ff03 + .db "d0<",0 + .dw VE_HEAD + .set VE_HEAD = VE_DXT_ZEROLESS +XT_DXT_ZEROLESS: + .dw PFA_DXT_ZEROLESS +PFA_DXT_ZEROLESS: + adiw Y,2 + sbrc tosh,7 + jmp PFA_TRUE1 + jmp PFA_ZERO1 diff --git a/amforth-6.5/avr8/words/d-minus.asm b/amforth-6.5/avr8/words/d-minus.asm new file mode 100644 index 0000000..a458851 --- /dev/null +++ b/amforth-6.5/avr8/words/d-minus.asm @@ -0,0 +1,28 @@ +; ( d1 d2 -- d3 ) +; Arithmetics +; subtract d2 from d1 +VE_DMINUS: + .dw $ff02 + .db "d-" + .dw VE_HEAD + .set VE_HEAD = VE_DMINUS +XT_DMINUS: + .dw PFA_DMINUS +PFA_DMINUS: + ld temp2, Y+ + ld temp3, Y+ + + ld temp4, Y+ + ld temp5, Y+ + ld temp6, Y+ + ld temp7, Y+ + + sub temp6, temp2 + sbc temp7, temp3 + sbc temp4, tosl + sbc temp5, tosh + + st -Y, temp7 + st -Y, temp6 + movw tosl, temp4 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/d-plus.asm b/amforth-6.5/avr8/words/d-plus.asm new file mode 100644 index 0000000..60286dd --- /dev/null +++ b/amforth-6.5/avr8/words/d-plus.asm @@ -0,0 +1,27 @@ +; ( d1 d2 -- d3) +; Arithmetics +; add 2 double cell values +VE_DPLUS: + .dw $ff02 + .db "d+" + .dw VE_HEAD + .set VE_HEAD = VE_DPLUS +XT_DPLUS: + .dw PFA_DPLUS +PFA_DPLUS: + ld temp2, Y+ + ld temp3, Y+ + + ld temp4, Y+ + ld temp5, Y+ + ld temp6, Y+ + ld temp7, Y+ + + add temp2, temp6 + adc temp3, temp7 + adc tosl, temp4 + adc tosh, temp5 + + st -Y, temp3 + st -Y, temp2 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/dabs.asm b/amforth-6.5/avr8/words/dabs.asm new file mode 100644 index 0000000..43b372d --- /dev/null +++ b/amforth-6.5/avr8/words/dabs.asm @@ -0,0 +1,19 @@ +; ( d -- ud ) +; Arithmetics +; double cell absolute value +VE_DABS: + .dw $ff04 + .db "dabs" + .dw VE_HEAD + .set VE_HEAD = VE_DABS +XT_DABS: + .dw DO_COLON +PFA_DABS: + .dw XT_DUP + .dw XT_ZEROLESS + .dw XT_DOCONDBRANCH + .dw PFA_DABS1 + .dw XT_DNEGATE +PFA_DABS1: + .dw XT_EXIT +; : dabs ( ud1 -- +d2 ) dup 0< if dnegate then ; diff --git a/amforth-6.5/avr8/words/dnegate.asm b/amforth-6.5/avr8/words/dnegate.asm new file mode 100644 index 0000000..cfa45ca --- /dev/null +++ b/amforth-6.5/avr8/words/dnegate.asm @@ -0,0 +1,17 @@ +; ( d1 -- d2 ) +; Arithmetics +; double cell negation +VE_DNEGATE: + .dw $ff07 + .db "dnegate",0 + .dw VE_HEAD + .set VE_HEAD = VE_DNEGATE +XT_DNEGATE: + .dw DO_COLON +PFA_DNEGATE: + .dw XT_DINVERT + .dw XT_ONE + .dw XT_ZERO + .dw XT_DPLUS + .dw XT_EXIT +; : dnegate ( ud1 -- ud2 ) dinvert 1. d+ ; diff --git a/amforth-6.5/avr8/words/do-defer.asm b/amforth-6.5/avr8/words/do-defer.asm new file mode 100644 index 0000000..dbd190e --- /dev/null +++ b/amforth-6.5/avr8/words/do-defer.asm @@ -0,0 +1,27 @@ +; ( i*x -- j*x ) +; System +; runtime of defer +VE_DODEFER: + .dw $ff07 + .db "(defer)", 0 + .dw VE_HEAD + .set VE_HEAD = VE_DODEFER +XT_DODEFER: + .dw DO_COLON +PFA_DODEFER: + .dw XT_DOCREATE + .dw XT_REVEAL + .dw XT_COMPILE + .dw PFA_DODEFER1 + .dw XT_EXIT +PFA_DODEFER1: + call_ DO_DODOES + .dw XT_DUP + .dw XT_ICELLPLUS + .dw XT_FETCHI + .dw XT_EXECUTE + .dw XT_EXECUTE + .dw XT_EXIT + +; : (defer) dup i-cell+ @i execute execute ; + diff --git a/amforth-6.5/avr8/words/do-sliteral.asm b/amforth-6.5/avr8/words/do-sliteral.asm new file mode 100644 index 0000000..41ddb15 --- /dev/null +++ b/amforth-6.5/avr8/words/do-sliteral.asm @@ -0,0 +1,21 @@ +; ( -- addr len ) +; String +; runtime portion of sliteral +;VE_DOSLITERAL: +; .dw $ff0a +; .db "(sliteral)" +; .dw VE_HEAD +; .set VE_HEAD = VE_DOSLITERAL +XT_DOSLITERAL: + .dw DO_COLON +PFA_DOSLITERAL: + .dw XT_R_FETCH ; ( -- addr ) + .dw XT_ICOUNT + .dw XT_R_FROM + .dw XT_OVER ; ( -- addr' n addr n) + .dw XT_1PLUS + .dw XT_2SLASH ; ( -- addr' n addr k ) + .dw XT_PLUS ; ( -- addr' n addr'' ) + .dw XT_1PLUS + .dw XT_TO_R ; ( -- ) + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/do-value.asm b/amforth-6.5/avr8/words/do-value.asm new file mode 100644 index 0000000..65182f5 --- /dev/null +++ b/amforth-6.5/avr8/words/do-value.asm @@ -0,0 +1,25 @@ +; ( -- n ) +; System +; runtime of value +VE_DOVALUE: + .dw $ff07 + .db "(value)", 0 + .dw VE_HEAD + .set VE_HEAD = VE_DOVALUE +XT_DOVALUE: + .dw DO_COLON +PFA_DOVALUE: + .dw XT_DOCREATE + .dw XT_REVEAL + .dw XT_COMPILE + .dw PFA_DOVALUE1 + .dw XT_EXIT +PFA_DOVALUE1: + call_ DO_DODOES + .dw XT_DUP + .dw XT_ICELLPLUS + .dw XT_FETCHI + .dw XT_EXECUTE + .dw XT_EXIT + +; : (value) dup icell+ @i execute ; diff --git a/amforth-6.5/avr8/words/dobranch.asm b/amforth-6.5/avr8/words/dobranch.asm new file mode 100644 index 0000000..7ff018f --- /dev/null +++ b/amforth-6.5/avr8/words/dobranch.asm @@ -0,0 +1,14 @@ +; ( -- ) +; System +; runtime of branch +;VE_DOBRANCH: +; .dw $ff08 +; .db "(branch)" +; .dw VE_HEAD +; .set VE_HEAD = VE_DOBRANCH +XT_DOBRANCH: + .dw PFA_DOBRANCH +PFA_DOBRANCH: + movw zl, XL + readflashcell XL,XH + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/docondbranch.asm b/amforth-6.5/avr8/words/docondbranch.asm new file mode 100644 index 0000000..64b2e5e --- /dev/null +++ b/amforth-6.5/avr8/words/docondbranch.asm @@ -0,0 +1,16 @@ +; ( f -- ) +; System +; runtime of ?branch +;VE_DOCONDBRANCH: +; .dw $ff09 +; .db "(?branch)" +; .dw VE_HEAD +; .set VE_HEAD = VE_DOCONDBRANCH +XT_DOCONDBRANCH: + .dw PFA_DOCONDBRANCH +PFA_DOCONDBRANCH: + or tosh, tosl + loadtos + brbs 1, PFA_DOBRANCH ; 1 is z flag; if tos is zero (false), do the branch + adiw XL, 1 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/doconstant.asm b/amforth-6.5/avr8/words/doconstant.asm new file mode 100644 index 0000000..0ecdf27 --- /dev/null +++ b/amforth-6.5/avr8/words/doconstant.asm @@ -0,0 +1,15 @@ +; ( -- addr ) +; System +; place data field address on TOS +;VE_DOCONSTANT: +; .dw $ff0a +; .db "(constant)" +; .dw VE_HEAD +; .set VE_HEAD = VE_DOCONSTANT +XT_DOCONSTANT: + .dw PFA_DOCONSTANT +PFA_DOCONSTANT: + savetos + movw tosl, wl + adiw tosl, 1 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/dodo.asm b/amforth-6.5/avr8/words/dodo.asm new file mode 100644 index 0000000..3b88694 --- /dev/null +++ b/amforth-6.5/avr8/words/dodo.asm @@ -0,0 +1,25 @@ +; ( limit start -- ) (R: -- loop-sys ) +; System +; runtime of do +;VE_DODO: +; .dw $ff04 +; .db "(do)" +; .dw VE_HEAD +; .set VE_HEAD = VE_DODO +XT_DODO: + .dw PFA_DODO +PFA_DODO: + ld temp2, Y+ + ld temp3, Y+ ; limit +PFA_DODO1: + ldi zl, $80 + add temp3, zl + sub tosl, temp2 + sbc tosh, temp3 + + push temp3 + push temp2 ; limit ( --> limit + $8000) + push tosh + push tosl ; start -> index ( --> index - (limit - $8000) + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/does.asm b/amforth-6.5/avr8/words/does.asm new file mode 100644 index 0000000..6e3e71b --- /dev/null +++ b/amforth-6.5/avr8/words/does.asm @@ -0,0 +1,53 @@ +; ( i*x -- j*y ) (R: nest-sys1 -- ) (C: colon-sys1 -- colon-sys2 ) +; Compiler +; organize the XT replacement to call other colon code +VE_DOES: + .dw $0005 + .db "does>",0 + .dw VE_HEAD + .set VE_HEAD = VE_DOES +XT_DOES: + .dw DO_COLON +PFA_DOES: + .dw XT_COMPILE + .dw XT_DODOES + .dw XT_COMPILE ; create a code snippet to be used in an embedded XT + .dw $940e ; the address of this compiled + .dw XT_COMPILE ; code will replace the XT of the + .dw DO_DODOES ; word that CREATE created + .dw XT_EXIT ; + +DO_DODOES: ; ( -- PFA ) + savetos + movw tosl, wl + adiw tosl, 1 + ; the following takes the address from a real uC-call +.if (pclen==3) + pop wh ; some 128K Flash devices use 3 cells for call/ret +.endif + pop wh + pop wl + + push XH + push XL + movw XL, wl + jmp_ DO_NEXT + +; ( -- ) +; System +; replace the XT written by CREATE to call the code that follows does> +;VE_DODOES: +; .dw $ff07 +; .db "(does>)" +; .set VE_HEAD = VE_DODOES +XT_DODOES: + .dw DO_COLON +PFA_DODOES: + .dw XT_R_FROM + .dw XT_NEWEST + .dw XT_CELLPLUS + .dw XT_FETCH + .dw XT_FETCHE + .dw XT_NFA2CFA + .dw XT_STOREI + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/doliteral.asm b/amforth-6.5/avr8/words/doliteral.asm new file mode 100644 index 0000000..31da4b3 --- /dev/null +++ b/amforth-6.5/avr8/words/doliteral.asm @@ -0,0 +1,17 @@ +; ( -- n1 ) +; System +; runtime of literal +;VE_DOLITERAL: +; .dw $ff09 +; .db "(literal)" +; .dw VE_HEAD +; .set VE_HEAD = VE_DOLITERAL +XT_DOLITERAL: + .dw PFA_DOLITERAL +PFA_DOLITERAL: + savetos + movw zl, xl + readflashcell tosl,tosh + adiw xl, 1 + jmp_ DO_NEXT + diff --git a/amforth-6.5/avr8/words/doloop.asm b/amforth-6.5/avr8/words/doloop.asm new file mode 100644 index 0000000..b5e0a26 --- /dev/null +++ b/amforth-6.5/avr8/words/doloop.asm @@ -0,0 +1,16 @@ +; ( -- ) (R: loop-sys1 -- loop-sys2| ) +; System +; runtime of loop +;VE_DOLOOP: +; .dw $ff06 +; .db "(loop)" +; .dw VE_HEAD +; .set VE_HEAD = VE_DOLOOP +XT_DOLOOP: + .dw PFA_DOLOOP +PFA_DOLOOP: + pop zl + pop zh + adiw zl,1 + brvs PFA_DOPLUSLOOP_LEAVE + jmp_ PFA_DOPLUSLOOP_NEXT diff --git a/amforth-6.5/avr8/words/doplusloop.asm b/amforth-6.5/avr8/words/doplusloop.asm new file mode 100644 index 0000000..c34cae5 --- /dev/null +++ b/amforth-6.5/avr8/words/doplusloop.asm @@ -0,0 +1,28 @@ +; ( n1 -- ) (R: loop-sys1 -- loop-sys2| ) +; System +; runtime of +loop +;VE_DOPLUSLOOP: +; .dw $ff07 +; .db "(+loop)" +; .dw VE_HEAD +; .set VE_HEAD = VE_DOPLUSLOOP +XT_DOPLUSLOOP: + .dw PFA_DOPLUSLOOP +PFA_DOPLUSLOOP: + pop zl + pop zh + add zl, tosl + adc zh, tosh + loadtos + brvs PFA_DOPLUSLOOP_LEAVE + ; next cycle +PFA_DOPLUSLOOP_NEXT: + ; next iteration + push zh + push zl + rjmp PFA_DOBRANCH ; read next cell from dictionary and jump to its destination +PFA_DOPLUSLOOP_LEAVE: + pop temp0 + pop temp1 ; remove limit + adiw xl, 1 ; skip branch-back address + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/douser.asm b/amforth-6.5/avr8/words/douser.asm new file mode 100644 index 0000000..1347651 --- /dev/null +++ b/amforth-6.5/avr8/words/douser.asm @@ -0,0 +1,18 @@ +; ( -- addr ) +; System +; runtime part of user +;VE_DOUSER: +; .dw $ff06 +; .db "(user)" +; .dw VE_HEAD +; .set VE_HEAD = VE_DOUSER +XT_DOUSER: + .dw PFA_DOUSER +PFA_DOUSER: + savetos + movw zl, wl + adiw zl, 1 + readflashcell tosl,tosh + add tosl, upl + adc tosh, uph + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/dovariable.asm b/amforth-6.5/avr8/words/dovariable.asm new file mode 100644 index 0000000..6866ef4 --- /dev/null +++ b/amforth-6.5/avr8/words/dovariable.asm @@ -0,0 +1,16 @@ +; ( -- addr ) +; System +; puts content of parameter field (1 cell) to TOS +;VE_DOVARIABLE: +; .dw $ff0a +; .db "(variable)" +; .dw VE_HEAD +; .set VE_HEAD = VE_DOVARIABLE +XT_DOVARIABLE: + .dw PFA_DOVARIABLE +PFA_DOVARIABLE: + savetos + movw zl, wl + adiw zl,1 + readflashcell tosl,tosh + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/dp.asm b/amforth-6.5/avr8/words/dp.asm new file mode 100644 index 0000000..c9507f7 --- /dev/null +++ b/amforth-6.5/avr8/words/dp.asm @@ -0,0 +1,14 @@ +; ( -- f-addr ) +; System Value +; address of the next free dictionary cell +VE_DP: + .dw $ff02 + .db "dp" + .dw VE_HEAD + .set VE_HEAD = VE_DP +XT_DP: + .dw PFA_DOVALUE1 +PFA_DP: + .dw CFG_DP + .dw XT_EDEFERFETCH + .dw XT_EDEFERSTORE diff --git a/amforth-6.5/avr8/words/drop.asm b/amforth-6.5/avr8/words/drop.asm new file mode 100644 index 0000000..baee84b --- /dev/null +++ b/amforth-6.5/avr8/words/drop.asm @@ -0,0 +1,13 @@ +; ( n -- ) +; Stack +; drop TOS +VE_DROP: + .dw $ff04 + .db "drop" + .dw VE_HEAD + .set VE_HEAD = VE_DROP +XT_DROP: + .dw PFA_DROP +PFA_DROP: + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/dup.asm b/amforth-6.5/avr8/words/dup.asm new file mode 100644 index 0000000..0b5fa27 --- /dev/null +++ b/amforth-6.5/avr8/words/dup.asm @@ -0,0 +1,13 @@ +; ( n -- n n ) +; Stack +; duplicate TOS +VE_DUP: + .dw $ff03 + .db "dup",0 + .dw VE_HEAD + .set VE_HEAD = VE_DUP +XT_DUP: + .dw PFA_DUP +PFA_DUP: + savetos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/edefer-fetch.asm b/amforth-6.5/avr8/words/edefer-fetch.asm new file mode 100644 index 0000000..651bb53 --- /dev/null +++ b/amforth-6.5/avr8/words/edefer-fetch.asm @@ -0,0 +1,14 @@ +; ( xt1 -- xt2 ) +; System +; does the real defer@ for eeprom defers +VE_EDEFERFETCH: + .dw $ff07 + .db "Edefer@",0 + .dw VE_HEAD + .set VE_HEAD = VE_EDEFERFETCH +XT_EDEFERFETCH: + .dw DO_COLON +PFA_EDEFERFETCH: + .dw XT_FETCHI + .dw XT_FETCHE + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/edefer-store.asm b/amforth-6.5/avr8/words/edefer-store.asm new file mode 100644 index 0000000..1c0011b --- /dev/null +++ b/amforth-6.5/avr8/words/edefer-store.asm @@ -0,0 +1,14 @@ +; ( xt1 xt2 -- ) +; System +; does the real defer! for eeprom defers +VE_EDEFERSTORE: + .dw $ff07 + .db "Edefer!",0 + .dw VE_HEAD + .set VE_HEAD = VE_EDEFERSTORE +XT_EDEFERSTORE: + .dw DO_COLON +PFA_EDEFERSTORE: + .dw XT_FETCHI + .dw XT_STOREE + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/ehere.asm b/amforth-6.5/avr8/words/ehere.asm new file mode 100644 index 0000000..e416c0e --- /dev/null +++ b/amforth-6.5/avr8/words/ehere.asm @@ -0,0 +1,14 @@ +; ( -- e-addr ) +; System Value +; address of the next free address in eeprom +VE_EHERE: + .dw $ff05 + .db "ehere",0 + .dw VE_HEAD + .set VE_HEAD = VE_EHERE +XT_EHERE: + .dw PFA_DOVALUE1 +PFA_EHERE: + .dw EE_EHERE + .dw XT_EDEFERFETCH + .dw XT_EDEFERSTORE diff --git a/amforth-6.5/avr8/words/end-code.asm b/amforth-6.5/avr8/words/end-code.asm new file mode 100644 index 0000000..bf161eb --- /dev/null +++ b/amforth-6.5/avr8/words/end-code.asm @@ -0,0 +1,16 @@ +; ( -- ) +; Compiler +; finish a code definition +VE_ENDCODE: + .dw $ff08 + .db "end-code" + .dw VE_HEAD + .set VE_HEAD = VE_ENDCODE +XT_ENDCODE: + .dw DO_COLON +PFA_ENDCODE: + .dw XT_COMPILE + .dw $940c + .dw XT_COMPILE + .dw DO_NEXT + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/env-mcuinfo.asm b/amforth-6.5/avr8/words/env-mcuinfo.asm new file mode 100644 index 0000000..ef7240a --- /dev/null +++ b/amforth-6.5/avr8/words/env-mcuinfo.asm @@ -0,0 +1,14 @@ +; ( -- faddr len ) +; Environment +; flash address of some CPU specific parameters +VE_ENV_MCUINFO: + .dw $ff08 + .db "mcu-info" + .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_MCUINFO +XT_ENV_MCUINFO: + .dw DO_COLON +PFA_EN_MCUINFO: + .dw XT_DOLITERAL + .dw mcu_info + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/env-slashpad.asm b/amforth-6.5/avr8/words/env-slashpad.asm new file mode 100644 index 0000000..1cb7dbb --- /dev/null +++ b/amforth-6.5/avr8/words/env-slashpad.asm @@ -0,0 +1,15 @@ +; ( -- padsize ) +; Environment +; Size of the PAD buffer in bytes +VE_ENVSLASHPAD: + .dw $ff04 + .db "/pad" + .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVSLASHPAD +XT_ENVSLASHPAD: + .dw DO_COLON +PFA_ENVSLASHPAD: + .dw XT_SP_FETCH + .dw XT_PAD + .dw XT_MINUS + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/env-wordlists.asm b/amforth-6.5/avr8/words/env-wordlists.asm new file mode 100644 index 0000000..643cfb7 --- /dev/null +++ b/amforth-6.5/avr8/words/env-wordlists.asm @@ -0,0 +1,14 @@ +; ( -- n ) +; Environment +; maximum number of wordlists in the dictionary search order +VE_ENVWORDLISTS: + .dw $ff09 + .db "wordlists",0 + .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVWORDLISTS +XT_ENVWORDLISTS: + .dw DO_COLON +PFA_ENVWORDLISTS: + .dw XT_DOLITERAL + .dw NUMWORDLISTS + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/environment.asm b/amforth-6.5/avr8/words/environment.asm new file mode 100644 index 0000000..8e39c08 --- /dev/null +++ b/amforth-6.5/avr8/words/environment.asm @@ -0,0 +1,12 @@ +; ( -- wid) +; System Value +; word list identifier of the environmental search list +VE_ENVIRONMENT: + .dw $ff0b + .db "environment",0 + .dw VE_HEAD + .set VE_HEAD = VE_ENVIRONMENT +XT_ENVIRONMENT: + .dw PFA_DOVARIABLE +PFA_ENVIRONMENT: + .dw CFG_ENVIRONMENT diff --git a/amforth-6.5/avr8/words/equal.asm b/amforth-6.5/avr8/words/equal.asm new file mode 100644 index 0000000..1cd3e57 --- /dev/null +++ b/amforth-6.5/avr8/words/equal.asm @@ -0,0 +1,14 @@ +; ( n1 n2 -- flag ) +; Compare +; compares two values for equality +VE_EQUAL: + .dw $ff01 + .db "=",0 + .dw VE_HEAD + .set VE_HEAD = VE_EQUAL +XT_EQUAL: + .dw DO_COLON +PFA_EQUAL: + .dw XT_MINUS + .dw XT_ZEROEQUAL + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/equalzero.asm b/amforth-6.5/avr8/words/equalzero.asm new file mode 100644 index 0000000..d33cedd --- /dev/null +++ b/amforth-6.5/avr8/words/equalzero.asm @@ -0,0 +1,14 @@ +; ( n -- flag ) +; Compare +; compare with 0 (zero) +VE_ZEROEQUAL: + .dw $ff02 + .db "0=" + .dw VE_HEAD + .set VE_HEAD = VE_ZEROEQUAL +XT_ZEROEQUAL: + .dw PFA_ZEROEQUAL +PFA_ZEROEQUAL: + or tosh, tosl + brne PFA_ZERO1 + rjmp PFA_TRUE1 diff --git a/amforth-6.5/avr8/words/execute.asm b/amforth-6.5/avr8/words/execute.asm new file mode 100644 index 0000000..4a2308d --- /dev/null +++ b/amforth-6.5/avr8/words/execute.asm @@ -0,0 +1,14 @@ +; ( xt -- ) +; System +; execute XT +VE_EXECUTE: + .dw $ff07 + .db "execute",0 + .dw VE_HEAD + .set VE_HEAD = VE_EXECUTE +XT_EXECUTE: + .dw PFA_EXECUTE +PFA_EXECUTE: + movw wl, tosl + loadtos + jmp_ DO_EXECUTE diff --git a/amforth-6.5/avr8/words/exit.asm b/amforth-6.5/avr8/words/exit.asm new file mode 100644 index 0000000..89e19b9 --- /dev/null +++ b/amforth-6.5/avr8/words/exit.asm @@ -0,0 +1,14 @@ +; ( -- ) (R: nest-sys -- ) +; Compiler +; end of current colon word +VE_EXIT: + .dw $ff04 + .db "exit" + .dw VE_HEAD + .set VE_HEAD = VE_EXIT +XT_EXIT: + .dw PFA_EXIT +PFA_EXIT: + pop XL + pop XH + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/fetch-e.asm b/amforth-6.5/avr8/words/fetch-e.asm new file mode 100644 index 0000000..fb0dee5 --- /dev/null +++ b/amforth-6.5/avr8/words/fetch-e.asm @@ -0,0 +1,51 @@ +; ( e-addr - n) +; Memory +; read 1 cell from eeprom +VE_FETCHE: + .dw $ff02 + .db "@e" + .dw VE_HEAD + .set VE_HEAD = VE_FETCHE +XT_FETCHE: + .dw PFA_FETCHE +PFA_FETCHE: +.if WANT_UNIFIED == 1 + ldi zh, high(EEPROMEND) + ldi zl, low(EEPROMEND) + cp tosl, zl + cpc tosh, zh + brlt PFA_FETCHE1 + brbs 1, PFA_FETCHE1 + rjmp PFA_FETCHE_OTHER +.endif +PFA_FETCHE1: + in_ temp2, SREG + cli + movw zl, tosl + rcall PFA_FETCHE2 + in_ tosl, EEDR + + adiw zl,1 + + rcall PFA_FETCHE2 + in_ tosh, EEDR + out_ SREG, temp2 + jmp_ DO_NEXT + +PFA_FETCHE2: + sbic EECR, EEPE + rjmp PFA_FETCHE2 + + out_ EEARH,zh + out_ EEARL,zl + + sbi EECR,EERE + ret + +.if WANT_UNIFIED == 1 +PFA_FETCHE_OTHER: + adiw zl, 1 + sub tosl, zl + sbc tosh, zh + jmp_ PFA_FETCHI +.endif diff --git a/amforth-6.5/avr8/words/fetch-i.asm b/amforth-6.5/avr8/words/fetch-i.asm new file mode 100644 index 0000000..5cdcc37 --- /dev/null +++ b/amforth-6.5/avr8/words/fetch-i.asm @@ -0,0 +1,14 @@ +; ( f-addr -- n1 ) +; Memory +; read 1 cell from flash +VE_FETCHI: + .dw $ff02 + .db "@i" + .dw VE_HEAD + .set VE_HEAD = VE_FETCHI +XT_FETCHI: + .dw PFA_FETCHI +PFA_FETCHI: + movw zl, tosl + readflashcell tosl,tosh + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/fetch-u.asm b/amforth-6.5/avr8/words/fetch-u.asm new file mode 100644 index 0000000..6e94616 --- /dev/null +++ b/amforth-6.5/avr8/words/fetch-u.asm @@ -0,0 +1,15 @@ +; ( offset -- n ) +; Memory +; read 1 cell from USER area +VE_FETCHU: + .dw $ff02 + .db "@u" + .dw VE_HEAD + .set VE_HEAD = VE_FETCHU +XT_FETCHU: + .dw DO_COLON +PFA_FETCHU: + .dw XT_UP_FETCH + .dw XT_PLUS + .dw XT_FETCH + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/fetch.asm b/amforth-6.5/avr8/words/fetch.asm new file mode 100644 index 0000000..6cd2f2b --- /dev/null +++ b/amforth-6.5/avr8/words/fetch.asm @@ -0,0 +1,33 @@ +; ( a-addr -- n ) +; Memory +; read 1 cell from RAM address +VE_FETCH: + .dw $ff01 + .db "@",0 + .dw VE_HEAD + .set VE_HEAD = VE_FETCH +XT_FETCH: + .dw PFA_FETCH +PFA_FETCH: +.if WANT_UNIFIED == 1 + ldi zh, high(RAMEND) + ldi zl, low(RAMEND) + cp tosl, zl + cpc tosh, zh + brlt PFA_FETCHRAM + brbs 1, PFA_FETCHRAM + rjmp PFA_FETCHOTHER +.endif +PFA_FETCHRAM: + movw zl, tosl + ; low byte is read before the high byte + ld tosl, z+ + ld tosh, z+ + jmp_ DO_NEXT +.if WANT_UNIFIED == 1 +PFA_FETCHOTHER: + adiw zl, 1 + sub tosl, zl + sbc tosh, zh + jmp_ PFA_FETCHE +.endif diff --git a/amforth-6.5/avr8/words/fill.asm b/amforth-6.5/avr8/words/fill.asm new file mode 100644 index 0000000..e8bcacc --- /dev/null +++ b/amforth-6.5/avr8/words/fill.asm @@ -0,0 +1,26 @@ +; ( a-addr u c -- ) +; Memory +; fill u bytes memory beginning at a-addr with character c +VE_FILL: + .dw $ff04 + .db "fill" + .dw VE_HEAD + .set VE_HEAD = VE_FILL +XT_FILL: + .dw DO_COLON +PFA_FILL: + .dw XT_ROT + .dw XT_ROT + .dw XT_QDUP,XT_DOCONDBRANCH + DEST(PFA_FILL2) + .dw XT_BOUNDS + .dw XT_DODO +PFA_FILL1: + .dw XT_DUP + .dw XT_I + .dw XT_CSTORE ; ( -- c c-addr) + .dw XT_DOLOOP + .dw PFA_FILL1 +PFA_FILL2: + .dw XT_DROP + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/forth-recognizer.asm b/amforth-6.5/avr8/words/forth-recognizer.asm new file mode 100644 index 0000000..5b50820 --- /dev/null +++ b/amforth-6.5/avr8/words/forth-recognizer.asm @@ -0,0 +1,14 @@ +; ( -- addr ) +; System Value +; address of the next free data space (RAM) cell +VE_FORTHRECOGNIZER: + .dw $ff10 + .db "forth-recognizer" + .dw VE_HEAD + .set VE_HEAD = VE_FORTHRECOGNIZER +XT_FORTHRECOGNIZER: + .dw PFA_DOVALUE1 +PFA_FORTHRECOGNIZER: + .dw CFG_FORTHRECOGNIZER + .dw XT_EDEFERFETCH + .dw XT_EDEFERSTORE diff --git a/amforth-6.5/avr8/words/forth-wordlist.asm b/amforth-6.5/avr8/words/forth-wordlist.asm new file mode 100644 index 0000000..4147aea --- /dev/null +++ b/amforth-6.5/avr8/words/forth-wordlist.asm @@ -0,0 +1,12 @@ +; ( -- wid ) +; Search Order +; get the system default word list +VE_FORTHWORDLIST: + .dw $ff0e + .db "forth-wordlist" + .dw VE_HEAD + .set VE_HEAD = VE_FORTHWORDLIST +XT_FORTHWORDLIST: + .dw PFA_DOVARIABLE +PFA_FORTHWORDLIST: + .dw CFG_FORTHWORDLIST diff --git a/amforth-6.5/avr8/words/g-mark.asm b/amforth-6.5/avr8/words/g-mark.asm new file mode 100644 index 0000000..7f7fa36 --- /dev/null +++ b/amforth-6.5/avr8/words/g-mark.asm @@ -0,0 +1,16 @@ +; ( -- dest ) +; Compiler +; places current dictionary position for backward resolves +;VE_GMARK: +; .dw $ff05 +; .db ">mark" +; .dw VE_HEAD +; .set VE_HEAD = VE_GMARK +XT_GMARK: + .dw DO_COLON +PFA_GMARK: + .dw XT_DP + .dw XT_COMPILE + .dw -1 ; ffff does not erase flash + .dw XT_EXIT + \ No newline at end of file diff --git a/amforth-6.5/avr8/words/g-resolve.asm b/amforth-6.5/avr8/words/g-resolve.asm new file mode 100644 index 0000000..0566b37 --- /dev/null +++ b/amforth-6.5/avr8/words/g-resolve.asm @@ -0,0 +1,16 @@ +; ( dest -- ) +; Compiler +; resolve backward jumps +;VE_GRESOLVE: +; .dw $ff08 +; .db ">resolve" +; .dw VE_HEAD +; .set VE_HEAD = VE_GRESOLVE +XT_GRESOLVE: + .dw DO_COLON +PFA_GRESOLVE: + .dw XT_QSTACK + .dw XT_DP + .dw XT_SWAP + .dw XT_STOREI + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/get-current.asm b/amforth-6.5/avr8/words/get-current.asm new file mode 100644 index 0000000..a016a95 --- /dev/null +++ b/amforth-6.5/avr8/words/get-current.asm @@ -0,0 +1,15 @@ +; ( -- wid) +; Search Order +; get the wid of the current compilation word list +VE_GET_CURRENT: + .dw $ff0b + .db "get-current",0 + .dw VE_HEAD + .set VE_HEAD = VE_GET_CURRENT +XT_GET_CURRENT: + .dw DO_COLON +PFA_GET_CURRENT: + .dw XT_DOLITERAL + .dw CFG_CURRENT + .dw XT_FETCHE + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/greater.asm b/amforth-6.5/avr8/words/greater.asm new file mode 100644 index 0000000..b4a9731 --- /dev/null +++ b/amforth-6.5/avr8/words/greater.asm @@ -0,0 +1,19 @@ +; ( n1 n2 -- flag ) +; Compare +; flag is true if n1 is greater than n2 +VE_GREATER: + .dw $ff01 + .db ">",0 + .dw VE_HEAD + .set VE_HEAD = VE_GREATER +XT_GREATER: + .dw PFA_GREATER +PFA_GREATER: + ld temp2, Y+ + ld temp3, Y+ + cp temp2, tosl + cpc temp3, tosh +PFA_GREATERDONE: + brlt PFA_ZERO1 + brbs 1, PFA_ZERO1 + rjmp PFA_TRUE1 diff --git a/amforth-6.5/avr8/words/greaterzero.asm b/amforth-6.5/avr8/words/greaterzero.asm new file mode 100644 index 0000000..61cca0e --- /dev/null +++ b/amforth-6.5/avr8/words/greaterzero.asm @@ -0,0 +1,16 @@ +; ( n1 -- flag ) +; Compare +; true if n1 is greater than 0 +VE_GREATERZERO: + .dw $ff02 + .db "0>" + .dw VE_HEAD + .set VE_HEAD = VE_GREATERZERO +XT_GREATERZERO: + .dw PFA_GREATERZERO +PFA_GREATERZERO: + cp tosl, zerol + cpc tosh, zeroh + brlt PFA_ZERO1 + brbs 1, PFA_ZERO1 + rjmp PFA_TRUE1 diff --git a/amforth-6.5/avr8/words/header.asm b/amforth-6.5/avr8/words/header.asm new file mode 100644 index 0000000..4a1e6e9 --- /dev/null +++ b/amforth-6.5/avr8/words/header.asm @@ -0,0 +1,36 @@ +; ( addr len wid -- nfa ) +; Compiler +; creates the vocabulary header without XT and data field (PF) in the wordlist wid +VE_HEADER: + .dw $ff06 + .db "header" + .dw VE_HEAD + .set VE_HEAD = VE_HEADER +XT_HEADER: + .dw DO_COLON +PFA_HEADER: + .dw XT_DP ; the new Name Field + .dw XT_TO_R + .dw XT_TO_R ; ( R: NFA WID ) + .dw XT_DUP + .dw XT_GREATERZERO + .dw XT_DOCONDBRANCH + .dw PFA_HEADER1 + .dw XT_DUP + .dw XT_DOLITERAL + .dw $ff00 ; all flags are off (e.g. immediate) + .dw XT_OR + .dw XT_DOSCOMMA + ; make the link to the previous entry in this wordlist + .dw XT_R_FROM + .dw XT_FETCHE + .dw XT_COMMA + .dw XT_R_FROM + .dw XT_EXIT + +PFA_HEADER1: + ; -16: attempt to use zero length string as a name + .dw XT_DOLITERAL + .dw -16 + .dw XT_THROW + diff --git a/amforth-6.5/avr8/words/here.asm b/amforth-6.5/avr8/words/here.asm new file mode 100644 index 0000000..c3fc5cb --- /dev/null +++ b/amforth-6.5/avr8/words/here.asm @@ -0,0 +1,14 @@ +; ( -- addr ) +; System Value +; address of the next free data space (RAM) cell +VE_HERE: + .dw $ff04 + .db "here" + .dw VE_HEAD + .set VE_HEAD = VE_HERE +XT_HERE: + .dw PFA_DOVALUE1 +PFA_HERE: + .dw EE_HERE + .dw XT_EDEFERFETCH + .dw XT_EDEFERSTORE diff --git a/amforth-6.5/avr8/words/hld.asm b/amforth-6.5/avr8/words/hld.asm new file mode 100644 index 0000000..d31590c --- /dev/null +++ b/amforth-6.5/avr8/words/hld.asm @@ -0,0 +1,16 @@ +; ( -- addr ) +; Numeric IO +; pointer to current write position in the Pictured Numeric Output buffer +VE_HLD: + .dw $ff03 + .db "hld",0 + .dw VE_HEAD + .set VE_HEAD = VE_HLD +XT_HLD: + .dw PFA_DOVARIABLE +PFA_HLD: + .dw ram_hld + +.dseg +ram_hld: .byte 2 +.cseg diff --git a/amforth-6.5/avr8/words/i-cellplus.asm b/amforth-6.5/avr8/words/i-cellplus.asm new file mode 100644 index 0000000..08cbb14 --- /dev/null +++ b/amforth-6.5/avr8/words/i-cellplus.asm @@ -0,0 +1,13 @@ +; ( addr -- addr' ) +; Compiler +; skip to the next cell in flash +VE_ICELLPLUS: + .dw $FF07 + .db "i-cell+",0 + .dw VE_HEAD + .set VE_HEAD = VE_ICELLPLUS +XT_ICELLPLUS: + .dw DO_COLON +PFA_ICELLPLUS: + .dw XT_1PLUS + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/i.asm b/amforth-6.5/avr8/words/i.asm new file mode 100644 index 0000000..4943073 --- /dev/null +++ b/amforth-6.5/avr8/words/i.asm @@ -0,0 +1,23 @@ +; ( -- n ) (R: loop-sys -- loop-sys) +; Compiler +; current loop counter +VE_I: + .dw $FF01 + .db "i",0 + .dw VE_HEAD + .set VE_HEAD = VE_I +XT_I: + .dw PFA_I +PFA_I: + savetos + pop tosl + pop tosh ; index + pop zl + pop zh ; limit + push zh + push zl + push tosh + push tosl + add tosl, zl + adc tosh, zh + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/icompare.asm b/amforth-6.5/avr8/words/icompare.asm new file mode 100644 index 0000000..f0fbab5 --- /dev/null +++ b/amforth-6.5/avr8/words/icompare.asm @@ -0,0 +1,103 @@ +; ( r-addr r-len f-addr f-len -- f) +; Tools +; compares string in RAM with string in flash. f is zero if equal like COMPARE +VE_ICOMPARE: + .dw $ff08 + .db "icompare" + .dw VE_HEAD + .set VE_HEAD = VE_ICOMPARE +XT_ICOMPARE: + .dw DO_COLON +PFA_ICOMPARE: + .dw XT_TO_R ; ( -- r-addr r-len f-addr) + .dw XT_OVER ; ( -- r-addr r-len f-addr r-len) + .dw XT_R_FROM ; ( -- r-addr r-len f-addr r-len f-len ) + .dw XT_NOTEQUAL ; ( -- r-addr r-len f-addr flag ) + .dw XT_DOCONDBRANCH + .dw PFA_ICOMPARE_SAMELEN + .dw XT_2DROP + .dw XT_DROP + .dw XT_TRUE + .dw XT_EXIT +PFA_ICOMPARE_SAMELEN: + .dw XT_SWAP ; ( -- r-addr f-addr len ) + .dw XT_ZERO + .dw XT_QDOCHECK + .dw XT_DOCONDBRANCH + .dw PFA_ICOMPARE_DONE + .dw XT_DODO +PFA_ICOMPARE_LOOP: + ; ( r-addr f-addr --) + .dw XT_OVER + .dw XT_FETCH +.if WANT_IGNORECASE == 1 + .dw XT_ICOMPARE_LC +.endif + .dw XT_OVER + .dw XT_FETCHI ; ( -- r-addr f-addr r-cc f- cc) +.if WANT_IGNORECASE == 1 + .dw XT_ICOMPARE_LC +.endif + ; flash strings are zero-padded at the last cell + ; that means: if the flash cell is less $0100, than mask the + ; high byte in the ram cell + .dw XT_DUP + ;.dw XT_BYTESWAP + .dw XT_DOLITERAL + .dw $100 + .dw XT_ULESS + .dw XT_DOCONDBRANCH + .dw PFA_ICOMPARE_LASTCELL + .dw XT_SWAP + .dw XT_DOLITERAL + .dw $00FF + .dw XT_AND ; the final swap can be omitted +PFA_ICOMPARE_LASTCELL: + .dw XT_NOTEQUAL + .dw XT_DOCONDBRANCH + .dw PFA_ICOMPARE_NEXTLOOP + .dw XT_2DROP + .dw XT_TRUE + .dw XT_UNLOOP + .dw XT_EXIT +PFA_ICOMPARE_NEXTLOOP: + .dw XT_1PLUS + .dw XT_SWAP + .dw XT_CELLPLUS + .dw XT_SWAP + .dw XT_DOLITERAL + .dw 2 + .dw XT_DOPLUSLOOP + .dw PFA_ICOMPARE_LOOP +PFA_ICOMPARE_DONE: + .dw XT_2DROP + .dw XT_ZERO + .dw XT_EXIT + +.if WANT_IGNORECASE == 1 +; ( cc1 cc2 -- f) +; Tools +; compares two packed characters +;VE_ICOMPARELC: +; .dw $ff08 +; .db "icompare-lower" +; .dw VE_HEAD +; .set VE_HEAD = VE_ICOMPARELC +XT_ICOMPARE_LC: + .dw DO_COLON +PFA_ICOMPARE_LC: + .dw XT_DUP + .dw XT_DOLITERAL + .dw $00ff + .dw XT_AND + .dw XT_TOLOWER + .dw XT_SWAP + .dw XT_BYTESWAP + .dw XT_DOLITERAL + .dw $00ff + .dw XT_AND + .dw XT_TOLOWER + .dw XT_BYTESWAP + .dw XT_OR + .dw XT_EXIT +.endif diff --git a/amforth-6.5/avr8/words/icount.asm b/amforth-6.5/avr8/words/icount.asm new file mode 100644 index 0000000..d71ef13 --- /dev/null +++ b/amforth-6.5/avr8/words/icount.asm @@ -0,0 +1,16 @@ +; ( addr -- addr+1 n ) +; Tools +; get count information out of a counted string in flash +VE_ICOUNT: + .dw $ff06 + .db "icount" + .dw VE_HEAD + .set VE_HEAD = VE_ICOUNT +XT_ICOUNT: + .dw DO_COLON +PFA_ICOUNT: + .dw XT_DUP + .dw XT_1PLUS + .dw XT_SWAP + .dw XT_FETCHI + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/immediate-q.asm b/amforth-6.5/avr8/words/immediate-q.asm new file mode 100644 index 0000000..36fb29a --- /dev/null +++ b/amforth-6.5/avr8/words/immediate-q.asm @@ -0,0 +1,23 @@ +; ( flagset -- +/-1 ) +; Tools +; return +1 if immediate, -1 otherwise, flag from name>flags +;VE_IMMEDIATEQ: +; .dw $ff06 +; .db "immediate?" +; .dw VE_HEAD +; .set VE_HEAD = VE_IMMEDIATEQ +XT_IMMEDIATEQ: + .dw DO_COLON +PFA_IMMEDIATEQ: + .dw XT_DOLITERAL + .dw $8000 + .dw XT_AND + .dw XT_ZEROEQUAL + .dw XT_DOCONDBRANCH + DEST(IMMEDIATEQ1) + .dw XT_ONE + .dw XT_EXIT +IMMEDIATEQ1: + ; not immediate + .dw XT_TRUE + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/immediate.asm b/amforth-6.5/avr8/words/immediate.asm new file mode 100644 index 0000000..6a2370d --- /dev/null +++ b/amforth-6.5/avr8/words/immediate.asm @@ -0,0 +1,21 @@ +; ( -- ) +; Compiler +; set immediate flag for the most recent word definition +VE_IMMEDIATE: + .dw $ff09 + .db "immediate",0 + .dw VE_HEAD + .set VE_HEAD = VE_IMMEDIATE +XT_IMMEDIATE: + .dw DO_COLON +PFA_IMMEDIATE: + .dw XT_GET_CURRENT + .dw XT_FETCHE + .dw XT_DUP + .dw XT_FETCHI + .dw XT_DOLITERAL + .dw $7fff + .dw XT_AND + .dw XT_SWAP + .dw XT_STOREI + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/init-ram.asm b/amforth-6.5/avr8/words/init-ram.asm new file mode 100644 index 0000000..cd672bd --- /dev/null +++ b/amforth-6.5/avr8/words/init-ram.asm @@ -0,0 +1,48 @@ +; ( e-addr r-addr len -- ) +; Tools +; copy len cells from eeprom to ram +VE_EE2RAM: + .dw $ff06 + .db "ee>ram" + .dw VE_HEAD + .set VE_HEAD = VE_EE2RAM +XT_EE2RAM: + .dw DO_COLON +PFA_EE2RAM: ; ( -- ) + .dw XT_ZERO + .dw XT_DODO +PFA_EE2RAM_1: + ; ( -- e-addr r-addr ) + .dw XT_OVER + .dw XT_FETCHE + .dw XT_OVER + .dw XT_STORE + .dw XT_CELLPLUS + .dw XT_SWAP + .dw XT_CELLPLUS + .dw XT_SWAP + .dw XT_DOLOOP + .dw PFA_EE2RAM_1 +PFA_EE2RAM_2: + .dw XT_2DROP + .dw XT_EXIT + +; ( -- ) +; Tools +; setup the default user area from eeprom +VE_INIT_RAM: + .dw $ff08 + .db "init-ram" + .dw VE_HEAD + .set VE_HEAD = VE_INIT_RAM +XT_INIT_RAM: + .dw DO_COLON +PFA_INI_RAM: ; ( -- ) + .dw XT_DOLITERAL + .dw EE_INITUSER + .dw XT_UP_FETCH + .dw XT_DOLITERAL + .dw SYSUSERSIZE + .dw XT_2SLASH + .dw XT_EE2RAM + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/int-fetch.asm b/amforth-6.5/avr8/words/int-fetch.asm new file mode 100644 index 0000000..f0c713a --- /dev/null +++ b/amforth-6.5/avr8/words/int-fetch.asm @@ -0,0 +1,16 @@ +; ( i -- xt ) +; Interrupt +; fetches XT from interrupt vector i +VE_INTFETCH: + .dw $ff04 + .db "int@" + .dw VE_HEAD + .set VE_HEAD = VE_INTFETCH +XT_INTFETCH: + .dw DO_COLON +PFA_INTFETCH: + .dw XT_DOLITERAL + .dw intvec + .dw XT_PLUS + .dw XT_FETCHE + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/int-num.asm b/amforth-6.5/avr8/words/int-num.asm new file mode 100644 index 0000000..31f51df --- /dev/null +++ b/amforth-6.5/avr8/words/int-num.asm @@ -0,0 +1,12 @@ +; ( -- n ) +; Interrupt +; number of interrupt vectors (0 based) +VE_NUMINT: + .dw $ff04 + .db "#int" + .dw VE_HEAD + .set VE_HEAD = VE_NUMINT +XT_NUMINT: + .dw PFA_DOVARIABLE +PFA_NUMINT: + .dw INTVECTORS diff --git a/amforth-6.5/avr8/words/int-off.asm b/amforth-6.5/avr8/words/int-off.asm new file mode 100644 index 0000000..4301404 --- /dev/null +++ b/amforth-6.5/avr8/words/int-off.asm @@ -0,0 +1,13 @@ +; ( -- ) +; Interrupt +; turns off all interrupts +VE_INTOFF: + .dw $ff04 + .db "-int" + .dw VE_HEAD + .set VE_HEAD = VE_INTOFF +XT_INTOFF: + .dw PFA_INTOFF +PFA_INTOFF: + cli + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/int-on.asm b/amforth-6.5/avr8/words/int-on.asm new file mode 100644 index 0000000..8b909da --- /dev/null +++ b/amforth-6.5/avr8/words/int-on.asm @@ -0,0 +1,13 @@ +; ( -- ) +; Interrupt +; turns on all interrupts +VE_INTON: + .dw $ff04 + .db "+int" + .dw VE_HEAD + .set VE_HEAD = VE_INTON +XT_INTON: + .dw PFA_INTON +PFA_INTON: + sei + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/int-store.asm b/amforth-6.5/avr8/words/int-store.asm new file mode 100644 index 0000000..9189ba0 --- /dev/null +++ b/amforth-6.5/avr8/words/int-store.asm @@ -0,0 +1,16 @@ +; ( xt i -- ) +; Interrupt +; stores XT as interrupt vector i +VE_INTSTORE: + .dw $ff04 + .db "int!" + .dw VE_HEAD + .set VE_HEAD = VE_INTSTORE +XT_INTSTORE: + .dw DO_COLON +PFA_INTSTORE: + .dw XT_DOLITERAL + .dw intvec + .dw XT_PLUS + .dw XT_STOREE + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/int-trap.asm b/amforth-6.5/avr8/words/int-trap.asm new file mode 100644 index 0000000..dd3170f --- /dev/null +++ b/amforth-6.5/avr8/words/int-trap.asm @@ -0,0 +1,14 @@ +; ( i -- ) +; Interrupt +; trigger an interrupt +VE_INTTRAP: + .dw $ff08 + .db "int-trap" + .dw VE_HEAD + .set VE_HEAD = VE_INTTRAP +XT_INTTRAP: + .dw PFA_INTTRAP +PFA_INTTRAP: + mov isrflag, tosl + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/invert.asm b/amforth-6.5/avr8/words/invert.asm new file mode 100644 index 0000000..84d7a1d --- /dev/null +++ b/amforth-6.5/avr8/words/invert.asm @@ -0,0 +1,14 @@ +; ( n1 -- n2) +; Arithmetics +; 1-complement of TOS +VE_INVERT: + .dw $ff06 + .db "invert" + .dw VE_HEAD + .set VE_HEAD = VE_INVERT +XT_INVERT: + .dw PFA_INVERT +PFA_INVERT: + com tosl + com tosh + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/irqcnt.asm b/amforth-6.5/avr8/words/irqcnt.asm new file mode 100644 index 0000000..edb8a39 --- /dev/null +++ b/amforth-6.5/avr8/words/irqcnt.asm @@ -0,0 +1,15 @@ +; ( i -- xt ) +; Interrupt +; fetches XT from interrupt vector i +VE_IRQCNTADDR: + .dw $ff06 + .db "irq[]#" + .dw VE_HEAD + .set VE_HEAD = VE_IRQCNTADDR +XT_IRQCNTADDR: + .dw DO_COLON +PFA_IRQCNTADDR: + .dw XT_DOLITERAL + .dw intcnt + .dw XT_PLUS + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/isr-end.asm b/amforth-6.5/avr8/words/isr-end.asm new file mode 100644 index 0000000..7fe6132 --- /dev/null +++ b/amforth-6.5/avr8/words/isr-end.asm @@ -0,0 +1,15 @@ +; ( -- ) +; Interrupt +; re-enables interrupts in an ISR +;VE_ISREND: +; .dw $ff07 +; .db "isr-end",0 +; .dw VE_HEAD +; .set VE_HEAD = VE_ISREND +XT_ISREND: + .dw PFA_ISREND +PFA_ISREND: + rcall PFA_ISREND1 ; clear the interrupt flag for the controller + jmp_ DO_NEXT +PFA_ISREND1: + reti diff --git a/amforth-6.5/avr8/words/isr-exec.asm b/amforth-6.5/avr8/words/isr-exec.asm new file mode 100644 index 0000000..6c1a379 --- /dev/null +++ b/amforth-6.5/avr8/words/isr-exec.asm @@ -0,0 +1,15 @@ +; ( n -- ) +; Interrupt +; executes an interrupt service routine +;VE_ISREXEC: +; .dw $ff08 +; .db "isr-exec" +; .dw VE_HEAD +; .set VE_HEAD = VE_ISREXEC +XT_ISREXEC: + .dw DO_COLON +PFA_ISREXEC: + .dw XT_INTFETCH + .dw XT_EXECUTE + .dw XT_ISREND + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/itype.asm b/amforth-6.5/avr8/words/itype.asm new file mode 100644 index 0000000..7831344 --- /dev/null +++ b/amforth-6.5/avr8/words/itype.asm @@ -0,0 +1,74 @@ +; ( addr n -- ) +; Tools +; reads string from flash and prints it +VE_ITYPE: + .dw $ff05 + .db "itype",0 + .dw VE_HEAD + .set VE_HEAD = VE_ITYPE +XT_ITYPE: + .dw DO_COLON +PFA_ITYPE: + .dw XT_DUP ; ( --addr len len) + .dw XT_2SLASH ; ( -- addr len len/2 + .dw XT_TUCK ; ( -- addr len/2 len len/2 + .dw XT_2STAR ; ( -- addr len/2 len len' + .dw XT_MINUS ; ( -- addr len/2 rem + .dw XT_TO_R + .dw XT_ZERO + .dw XT_QDOCHECK + .dw XT_DOCONDBRANCH + .dw PFA_ITYPE2 + .dw XT_DODO +PFA_ITYPE1: + .dw XT_DUP ; ( -- addr addr ) + .dw XT_FETCHI ; ( -- addr c1c2 ) + .dw XT_DUP + .dw XT_LOWEMIT + .dw XT_HIEMIT + .dw XT_1PLUS ; ( -- addr+cell ) + .dw XT_DOLOOP + .dw PFA_ITYPE1 +PFA_ITYPE2: + .dw XT_R_FROM + .dw XT_GREATERZERO + .dw XT_DOCONDBRANCH + .dw PFA_ITYPE3 + .dw XT_DUP ; make sure the drop below has always something to do + .dw XT_FETCHI + .dw XT_LOWEMIT +PFA_ITYPE3: + .dw XT_DROP + .dw XT_EXIT + +; ( w -- ) +; R( -- ) +; content of cell fetched on stack. +;VE_HIEMIT: +; .dw $ff06 +; .db "hiemit" +; .dw VE_HEAD +; .set VE_HEAD = VE_HIEMIT +XT_HIEMIT: + .dw DO_COLON +PFA_HIEMIT: + .dw XT_BYTESWAP + .dw XT_LOWEMIT + .dw XT_EXIT + +; ( w -- ) +; R( -- ) +; content of cell fetched on stack. +;VE_LOWEMIT: +; .dw $ff07 +; .db "lowemit" +; .dw VE_HEAD +; .set VE_HEAD = VE_LOWEMIT +XT_LOWEMIT: + .dw DO_COLON +PFA_LOWEMIT: + .dw XT_DOLITERAL + .dw $00ff + .dw XT_AND + .dw XT_EMIT + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/j.asm b/amforth-6.5/avr8/words/j.asm new file mode 100644 index 0000000..30ba24b --- /dev/null +++ b/amforth-6.5/avr8/words/j.asm @@ -0,0 +1,23 @@ +; ( -- n ) (R: loop-sys1 loop-sys2 -- loop-sys1 loop-sys2) +; Compiler +; loop counter of outer loop +VE_J: + .dw $FF01 + .db "j",0 + .dw VE_HEAD + .set VE_HEAD = VE_J +XT_J: + .dw DO_COLON +PFA_J: + .dw XT_RP_FETCH + .dw XT_DOLITERAL + .dw 7 + .dw XT_PLUS + .dw XT_FETCH + .dw XT_RP_FETCH + .dw XT_DOLITERAL + .dw 9 + .dw XT_PLUS + .dw XT_FETCH + .dw XT_PLUS + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/l_mark.asm b/amforth-6.5/avr8/words/l_mark.asm new file mode 100644 index 0000000..9d5c5ae --- /dev/null +++ b/amforth-6.5/avr8/words/l_mark.asm @@ -0,0 +1,13 @@ +; ( -- dest ) +; Compiler +; place destination for backward branch +;VE_LMARK: +; .dw $ff05 +; .db "",0 + .dw VE_HEAD + .set VE_HEAD = VE_N_R_FROM +XT_N_R_FROM: + .dw PFA_N_R_FROM +PFA_N_R_FROM: + savetos + pop zh + pop zl + mov temp0, zl +PFA_N_R_FROM1: + pop tosl + pop tosh + savetos + dec temp0 + brne PFA_N_R_FROM1 + movw tosl, zl + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/n_to_r.asm b/amforth-6.5/avr8/words/n_to_r.asm new file mode 100644 index 0000000..9efdaa6 --- /dev/null +++ b/amforth-6.5/avr8/words/n_to_r.asm @@ -0,0 +1,23 @@ +; ( x-n .. x-1 n -- ) (R: -- x-n .. x-1 n) +; Stack +; move n items from data stack to return stack +VE_N_TO_R: + .dw $ff03 + .db "n>r",0 + .dw VE_HEAD + .set VE_HEAD = VE_N_TO_R +XT_N_TO_R: + .dw PFA_N_TO_R +PFA_N_TO_R: + movw zl, tosl + mov temp0, tosl +PFA_N_TO_R1: + loadtos + push tosh + push tosl + dec temp0 + brne PFA_N_TO_R1 + push zl + push zh + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/name2flags.asm b/amforth-6.5/avr8/words/name2flags.asm new file mode 100644 index 0000000..12f618e --- /dev/null +++ b/amforth-6.5/avr8/words/name2flags.asm @@ -0,0 +1,16 @@ +; ( nt -- f ) +; Tools +; get the flags from a name token +VE_NAME2FLAGS: + .dw $ff0a + .db "name>flags" + .dw VE_HEAD + .set VE_HEAD = VE_NAME2FLAGS +XT_NAME2FLAGS: + .dw DO_COLON +PFA_NAME2FLAGS: + .dw XT_FETCHI ; skip to link field + .dw XT_DOLITERAL + .dw $ff00 + .dw XT_AND + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/negate.asm b/amforth-6.5/avr8/words/negate.asm new file mode 100644 index 0000000..6a88d58 --- /dev/null +++ b/amforth-6.5/avr8/words/negate.asm @@ -0,0 +1,14 @@ +; ( n1 -- n2 ) +; Logic +; 2-complement +VE_NEGATE: + .dw $ff06 + .db "negate" + .dw VE_HEAD + .set VE_HEAD = VE_NEGATE +XT_NEGATE: + .dw DO_COLON +PFA_NEGATE: + .dw XT_INVERT + .dw XT_1PLUS + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/newest.asm b/amforth-6.5/avr8/words/newest.asm new file mode 100644 index 0000000..62839fc --- /dev/null +++ b/amforth-6.5/avr8/words/newest.asm @@ -0,0 +1,16 @@ +; ( -- addr ) +; System Variable +; system state +VE_NEWEST: + .dw $ff06 + .db "newest" + .dw VE_HEAD + .set VE_HEAD = VE_NEWEST +XT_NEWEST: + .dw PFA_DOVARIABLE +PFA_NEWEST: + .dw ram_newest + +.dseg +ram_newest: .byte 4 +.cseg \ No newline at end of file diff --git a/amforth-6.5/avr8/words/nfa2cfa.asm b/amforth-6.5/avr8/words/nfa2cfa.asm new file mode 100644 index 0000000..ab1b230 --- /dev/null +++ b/amforth-6.5/avr8/words/nfa2cfa.asm @@ -0,0 +1,14 @@ +; ( nt -- xt ) +; Tools +; get the XT from a name token +VE_NFA2CFA: + .dw $ff07 + .db "nfa>cfa" + .dw VE_HEAD + .set VE_HEAD = VE_NFA2CFA +XT_NFA2CFA: + .dw DO_COLON +PFA_NFA2CFA: + .dw XT_NFA2LFA ; skip to link field + .dw XT_1PLUS ; next is the execution token + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/nfa2lfa.asm b/amforth-6.5/avr8/words/nfa2lfa.asm new file mode 100644 index 0000000..945fb64 --- /dev/null +++ b/amforth-6.5/avr8/words/nfa2lfa.asm @@ -0,0 +1,16 @@ +; ( nfa -- lfa ) +; System +; get the link field address from the name field address +VE_NFA2LFA: + .dw $ff07 + .db "nfa>lfa",0 + .dw VE_HEAD + .set VE_HEAD = VE_NFA2LFA +XT_NFA2LFA: + .dw DO_COLON +PFA_NFA2LFA: + .dw XT_NAME2STRING + .dw XT_1PLUS + .dw XT_2SLASH + .dw XT_PLUS + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/nip.asm b/amforth-6.5/avr8/words/nip.asm new file mode 100644 index 0000000..cfa1d1a --- /dev/null +++ b/amforth-6.5/avr8/words/nip.asm @@ -0,0 +1,13 @@ +; ( n1 n2 -- n2 ) +; Stack +; Remove Second of Stack +VE_NIP: + .dw $ff03 + .db "nip",0 + .dw VE_HEAD + .set VE_HEAD = VE_NIP +XT_NIP: + .dw PFA_NIP +PFA_NIP: + adiw yl, 2 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/not.asm b/amforth-6.5/avr8/words/not.asm new file mode 100644 index 0000000..26aa5c4 --- /dev/null +++ b/amforth-6.5/avr8/words/not.asm @@ -0,0 +1,13 @@ +; ( flag -- flag' ) +; Logic +; identical to 0= +VE_NOT: + .dw $ff03 + .db "not",0 + .dw VE_HEAD + .set VE_HEAD = VE_NOT +XT_NOT: + .dw DO_COLON +PFA_NOT: + .dw XT_ZEROEQUAL + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/notequalzero.asm b/amforth-6.5/avr8/words/notequalzero.asm new file mode 100644 index 0000000..5088bf3 --- /dev/null +++ b/amforth-6.5/avr8/words/notequalzero.asm @@ -0,0 +1,14 @@ +; ( n -- flag ) +; Compare +; true if n is not zero +VE_NOTZEROEQUAL: + .dw $ff03 + .db "0<>",0 + .dw VE_HEAD + .set VE_HEAD = VE_NOTZEROEQUAL +XT_NOTZEROEQUAL: + .dw DO_COLON +PFA_NOTZEROEQUAL: + .dw XT_ZEROEQUAL + .dw XT_ZEROEQUAL + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/or.asm b/amforth-6.5/avr8/words/or.asm new file mode 100644 index 0000000..24bc268 --- /dev/null +++ b/amforth-6.5/avr8/words/or.asm @@ -0,0 +1,17 @@ +; ( n1 n2 -- n3 ) +; Logic +; logical or +VE_OR: + .dw $ff02 + .db "or" + .dw VE_HEAD + .set VE_HEAD = VE_OR +XT_OR: + .dw PFA_OR +PFA_OR: + ld temp0, Y+ + ld temp1, Y+ + or tosl, temp0 + or tosh, temp1 + jmp_ DO_NEXT + diff --git a/amforth-6.5/avr8/words/over.asm b/amforth-6.5/avr8/words/over.asm new file mode 100644 index 0000000..97ca242 --- /dev/null +++ b/amforth-6.5/avr8/words/over.asm @@ -0,0 +1,16 @@ +; ( x1 x2 -- x1 x2 x1 ) +; Stack +; Place a copy of x1 on top of the stack +VE_OVER: + .dw $ff04 + .db "over" + .dw VE_HEAD + .set VE_HEAD = VE_OVER +XT_OVER: + .dw PFA_OVER +PFA_OVER: + savetos + ldd tosl, Y+2 + ldd tosh, Y+3 + + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/pause.asm b/amforth-6.5/avr8/words/pause.asm new file mode 100644 index 0000000..747fde4 --- /dev/null +++ b/amforth-6.5/avr8/words/pause.asm @@ -0,0 +1,18 @@ +; ( -- ) +; Multitasking +; Fetch pause vector and execute it. may make a context/task switch +VE_PAUSE: + .dw $ff05 + .db "pause",0 + .dw VE_HEAD + .set VE_HEAD = VE_PAUSE +XT_PAUSE: + .dw PFA_DODEFER1 +PFA_PAUSE: + .dw ram_pause + .dw XT_RDEFERFETCH + .dw XT_RDEFERSTORE + +.dseg +ram_pause: .byte 2 +.cseg diff --git a/amforth-6.5/avr8/words/plus.asm b/amforth-6.5/avr8/words/plus.asm new file mode 100644 index 0000000..1b2a6c4 --- /dev/null +++ b/amforth-6.5/avr8/words/plus.asm @@ -0,0 +1,16 @@ +; ( n1 n2 -- n3) +; Arithmetics +; add n1 and n2 +VE_PLUS: + .dw $ff01 + .db "+",0 + .dw VE_HEAD + .set VE_HEAD = VE_PLUS +XT_PLUS: + .dw PFA_PLUS +PFA_PLUS: + ld temp0, Y+ + ld temp1, Y+ + add tosl, temp0 + adc tosh, temp1 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/plusstore.asm b/amforth-6.5/avr8/words/plusstore.asm new file mode 100644 index 0000000..344670b --- /dev/null +++ b/amforth-6.5/avr8/words/plusstore.asm @@ -0,0 +1,21 @@ +; ( n a-addr -- ) +; Arithmetics +; add n to content of RAM address a-addr +VE_PLUSSTORE: + .dw $ff02 + .db "+!" + .dw VE_HEAD + .set VE_HEAD = VE_PLUSSTORE +XT_PLUSSTORE: + .dw PFA_PLUSSTORE +PFA_PLUSSTORE: + movw zl, tosl + loadtos + ldd temp2, Z+0 + ldd temp3, Z+1 + add tosl, temp2 + adc tosh, temp3 + std Z+0, tosl + std Z+1, tosh + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/popcnt.asm b/amforth-6.5/avr8/words/popcnt.asm new file mode 100644 index 0000000..66f8f47 --- /dev/null +++ b/amforth-6.5/avr8/words/popcnt.asm @@ -0,0 +1,29 @@ +; ( n1 -- n2 ) +; Arithmetics +; count the Number of 1 bits (population count) +VE_POPCNT: + .dw $ff06 + .db "popcnt" + .dw VE_HEAD + .set VE_HEAD = VE_POPCNT +XT_POPCNT: + .dw PFA_POPCNT +PFA_POPCNT: + movw zl, tosl + clr tosl + rcall PFA_POPCNT1 + mov zl, zh + rcall PFA_POPCNT1 + clr tosh + jmp_ DO_NEXT + +PFA_POPCNT1: + ldi tosh, 8 +PFA_POPCNT2: + ror zl + ;breq PFA_POPCNT3 + adc tosl, zeroh + dec tosh + brne PFA_POPCNT2 +POPCNT3: + ret \ No newline at end of file diff --git a/amforth-6.5/avr8/words/qdup.asm b/amforth-6.5/avr8/words/qdup.asm new file mode 100644 index 0000000..e65640b --- /dev/null +++ b/amforth-6.5/avr8/words/qdup.asm @@ -0,0 +1,17 @@ +; ( n1 -- [ n1 n1 ] | 0) +; Stack +; duplicate TOS if non-zero +VE_QDUP: + .dw $ff04 + .db "?dup" + .dw VE_HEAD + .set VE_HEAD = VE_QDUP +XT_QDUP: + .dw PFA_QDUP +PFA_QDUP: + mov temp0, tosl + or temp0, tosh + breq PFA_QDUP1 + savetos +PFA_QDUP1: + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/r_fetch.asm b/amforth-6.5/avr8/words/r_fetch.asm new file mode 100644 index 0000000..06d8ab0 --- /dev/null +++ b/amforth-6.5/avr8/words/r_fetch.asm @@ -0,0 +1,17 @@ +; ( -- n) (R: n -- n ) +; Stack +; fetch content of TOR +VE_R_FETCH: + .dw $ff02 + .db "r@" + .dw VE_HEAD + .set VE_HEAD = VE_R_FETCH +XT_R_FETCH: + .dw PFA_R_FETCH +PFA_R_FETCH: + savetos + pop tosl + pop tosh + push tosh + push tosl + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/r_from.asm b/amforth-6.5/avr8/words/r_from.asm new file mode 100644 index 0000000..66c1ebc --- /dev/null +++ b/amforth-6.5/avr8/words/r_from.asm @@ -0,0 +1,15 @@ +; ( -- n ) (R: n --) +; Stack +; move TOR to TOS +VE_R_FROM: + .dw $ff02 + .db "r>" + .dw VE_HEAD + .set VE_HEAD = VE_R_FROM +XT_R_FROM: + .dw PFA_R_FROM +PFA_R_FROM: + savetos + pop tosl + pop tosh + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/reg-a.asm b/amforth-6.5/avr8/words/reg-a.asm new file mode 100644 index 0000000..196ca3c --- /dev/null +++ b/amforth-6.5/avr8/words/reg-a.asm @@ -0,0 +1,180 @@ +; ( -- n2 ) +; Extended VM +; Read memory pointed to by register A (Extended VM) +VE_AFETCH: + .dw $ff02 + .db "a@" + .dw VE_HEAD + .set VE_HEAD = VE_AFETCH +XT_AFETCH: + .dw PFA_AFETCH +PFA_AFETCH: + savetos + movw zl, al + ld tosl, Z+ + ld tosh, Z+ + jmp_ DO_NEXT + +; ( n1 -- n2 ) +; Extended VM +; Read memory pointed to by register A plus offset (Extended VM) +VE_NAFETCH: + .dw $ff03 + .db "na@",0 + .dw VE_HEAD + .set VE_HEAD = VE_NAFETCH +XT_NAFETCH: + .dw PFA_NAFETCH +PFA_NAFETCH: + movw zl, al + add zl, tosl + adc zh, tosh + ld tosl, Z+ + ld tosh, Z+ + jmp_ DO_NEXT + +; ( -- n ) +; Extended VM +; Read memory pointed to by register A, increment A by 1 cell (Extended VM) +VE_AFETCHPLUS: + .dw $ff03 + .db "a@+",0 + .dw VE_HEAD + .set VE_HEAD = VE_AFETCHPLUS +XT_AFETCHPLUS: + .dw PFA_AFETCHPLUS +PFA_AFETCHPLUS: + savetos + movw zl, al + ld tosl, Z+ + ld tosh, Z+ + movw al, zl + jmp_ DO_NEXT + +; ( -- n ) +; Extended VM +; Read memory pointed to by register A, decrement A by 1 cell (Extended VM) +VE_AFETCHMINUS: + .dw $ff03 + .db "a@-",0 + .dw VE_HEAD + .set VE_HEAD = VE_AFETCHMINUS +XT_AFETCHMINUS: + .dw PFA_AFETCHMINUS +PFA_AFETCHMINUS: + savetos + movw zl, al + ld tosh, -Z ; TODO: check byte order!! + ld tosl, -Z + movw al, zl + jmp_ DO_NEXT + +; ( n -- ) +; Extended VM +; Write memory pointed to by register A (Extended VM) +VE_ASTORE: + .dw $ff02 + .db "a!" + .dw VE_HEAD + .set VE_HEAD = VE_ASTORE +XT_ASTORE: + .dw PFA_ASTORE +PFA_ASTORE: + movw zl, al + st Z+, tosl + st Z+, tosh + loadtos + jmp_ DO_NEXT + +; ( n offs -- ) +; Extended VM +; Write memory pointed to by register A plus offset (Extended VM) +VE_NASTORE: + .dw $ff03 + .db "na!",0 + .dw VE_HEAD + .set VE_HEAD = VE_NASTORE +XT_NASTORE: + .dw PFA_NASTORE +PFA_NASTORE: + movw zl, al + add zl, tosl + adc zh, tosh + loadtos + st Z+, tosl + st Z+, tosh + loadtos + jmp_ DO_NEXT + +; ( -- n2 ) +; Extended VM +; Write memory pointed to by register A, increment A by 1 cell (Extended VM) +VE_ASTOREPLUS: + .dw $ff03 + .db "a!+",0 + .dw VE_HEAD + .set VE_HEAD = VE_ASTOREPLUS +XT_ASTOREPLUS: + .dw PFA_ASTOREPLUS +PFA_ASTOREPLUS: + movw zl, al + st Z+, tosl + st Z+, tosh + loadtos + movw al, zl + jmp_ DO_NEXT + +; ( -- n2 ) +; Extended VM +; Write memory pointed to by register A, decrement A by 1 cell (Extended VM) +VE_ASTOREMINUS: + .dw $ff03 + .db "a!-",0 + .dw VE_HEAD + .set VE_HEAD = VE_ASTOREMINUS +XT_ASTOREMINUS: + .dw PFA_ASTOREMINUS +PFA_ASTOREMINUS: + movw zl, al + st -Z, tosh + st -Z, tosl + loadtos + movw al, zl + jmp_ DO_NEXT + + + +; ( n -- ) +; Extended VM +; Write to A register (Extended VM) +VE_TO_A: + .dw $ff02 + .db ">a" + .dw VE_HEAD + .set VE_HEAD = VE_TO_A +XT_TO_A: + .dw PFA_TO_A +PFA_TO_A: + movw al, tosl + loadtos + jmp_ DO_NEXT + +; ( n1 -- n2 ) +; Extended VM +; read the A register (Extended VM) +VE_A_FROM: + .dw $ff02 + .db "a>" + .dw VE_HEAD + .set VE_HEAD = VE_A_FROM +XT_A_FROM: + .dw PFA_A_FROM +PFA_A_FROM: + savetos + movw tosl, al + jmp_ DO_NEXT + +; for more information read +; http://www.complang.tuwien.ac.at/anton/euroforth/ef08/papers/pelc.pdf +; adapted index based access from X/Y registers +; note: offset is byte address, not cell! diff --git a/amforth-6.5/avr8/words/reg-b.asm b/amforth-6.5/avr8/words/reg-b.asm new file mode 100644 index 0000000..4b77e99 --- /dev/null +++ b/amforth-6.5/avr8/words/reg-b.asm @@ -0,0 +1,180 @@ +; ( -- n2 ) +; Extended VM +; Read memory pointed to by register B (Extended VM) +VE_BFETCH: + .dw $ff02 + .db "b@" + .dw VE_HEAD + .set VE_HEAD = VE_BFETCH +XT_BFETCH: + .dw PFA_BFETCH +PFA_BFETCH: + savetos + movw zl, bl + ld tosl, Z+ + ld tosh, Z+ + jmp_ DO_NEXT + +; ( n1 -- n2 ) +; Extended VM +; Read memory pointed to by register B plus offset (Extended VM) +VE_NBFETCH: + .dw $ff03 + .db "nb@",0 + .dw VE_HEAD + .set VE_HEAD = VE_NBFETCH +XT_NBFETCH: + .dw PFA_NBFETCH +PFA_NBFETCH: + movw zl, bl + add zl, tosl + adc zh, tosh + ld tosl, Z+ + ld tosh, Z+ + jmp_ DO_NEXT + +; ( -- n ) +; Extended VM +; Read memory pointed to by register B, increment B by 1 cell (Extended VM) +VE_BFETCHPLUS: + .dw $ff03 + .db "b@+",0 + .dw VE_HEAD + .set VE_HEAD = VE_BFETCHPLUS +XT_BFETCHPLUS: + .dw PFA_BFETCHPLUS +PFA_BFETCHPLUS: + savetos + movw zl, bl + ld tosl, Z+ + ld tosh, Z+ + movw bl, zl + jmp_ DO_NEXT + +; ( -- n ) +; Extended VM +; Read memory pointed to by register B, decrement B by 1 cell (Extended VM) +VE_BFETCHMINUS: + .dw $ff03 + .db "b@-",0 + .dw VE_HEAD + .set VE_HEAD = VE_BFETCHMINUS +XT_BFETCHMINUS: + .dw PFA_BFETCHMINUS +PFA_BFETCHMINUS: + savetos + movw zl, bl + ld tosh, -Z + ld tosl, -Z + movw bl, zl + jmp_ DO_NEXT + +; ( n -- ) +; Extended VM +; Write memory pointed to by register B (Extended VM) +VE_BSTORE: + .dw $ff02 + .db "b!" + .dw VE_HEAD + .set VE_HEAD = VE_BSTORE +XT_BSTORE: + .dw PFA_BSTORE +PFA_BSTORE: + movw zl, bl + st Z+, tosl + st Z+, tosh + loadtos + jmp_ DO_NEXT + +; ( n offs -- ) +; Extended VM +; Write memory pointed to by register B plus offset (Extended VM) +VE_NBSTORE: + .dw $ff03 + .db "nb!",0 + .dw VE_HEAD + .set VE_HEAD = VE_NBSTORE +XT_NBSTORE: + .dw PFA_NBSTORE +PFA_NBSTORE: + movw zl, bl + add zl, tosl + adc zh, tosh + loadtos + st Z+, tosl + st Z+, tosh + loadtos + jmp_ DO_NEXT + +; ( -- n2 ) +; Extended VM +; Write memory pointed to by register B, increment B by 1 cell (Extended VM) +VE_BSTOREPLUS: + .dw $ff03 + .db "b!+",0 + .dw VE_HEAD + .set VE_HEAD = VE_BSTOREPLUS +XT_BSTOREPLUS: + .dw PFA_BSTOREPLUS +PFA_BSTOREPLUS: + movw zl, bl + st Z+, tosl + st Z+, tosh + loadtos + movw bl, zl + jmp_ DO_NEXT + +; ( -- n2 ) +; Extended VM +; Write memory pointed to by register B, decrement B by 1 cell (Extended VM) +VE_BSTOREMINUS: + .dw $ff03 + .db "b!-",0 + .dw VE_HEAD + .set VE_HEAD = VE_BSTOREMINUS +XT_BSTOREMINUS: + .dw PFA_BSTOREMINUS +PFA_BSTOREMINUS: + movw zl, bl + st -Z, tosh + st -Z, tosl + loadtos + movw bl, zl + jmp_ DO_NEXT + + + +; ( n -- ) +; Extended VM +; Write to B register (Extended VM) +VE_TO_B: + .dw $ff02 + .db ">b" + .dw VE_HEAD + .set VE_HEAD = VE_TO_B +XT_TO_B: + .dw PFA_TO_B +PFA_TO_B: + movw bl, tosl + loadtos + jmp_ DO_NEXT + +; ( n1 -- n2 ) +; Extended VM +; read the B register (Extended VM) +VE_B_FROM: + .dw $ff02 + .db "b>" + .dw VE_HEAD + .set VE_HEAD = VE_B_FROM +XT_B_FROM: + .dw PFA_B_FROM +PFA_B_FROM: + savetos + movw tosl, bl + jmp_ DO_NEXT + +; for more information read +; http://www.complang.tuwien.ac.at/anton/euroforth/ef08/papers/pelc.pdf +; adapted index based access from X/Y registers +; note: offset is byte address, not cell! diff --git a/amforth-6.5/avr8/words/rot.asm b/amforth-6.5/avr8/words/rot.asm new file mode 100644 index 0000000..298b79c --- /dev/null +++ b/amforth-6.5/avr8/words/rot.asm @@ -0,0 +1,22 @@ +; ( n1 n2 n3 -- n2 n3 n1) +; Stack +; rotate the three top level cells +VE_ROT: + .dw $ff03 + .db "rot",0 + .dw VE_HEAD + .set VE_HEAD = VE_ROT +XT_ROT: + .dw PFA_ROT +PFA_ROT: + movw temp0, tosl + ld temp2, Y+ + ld temp3, Y+ + loadtos + + st -Y, temp3 + st -Y, temp2 + st -Y, temp1 + st -Y, temp0 + + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/rp0.asm b/amforth-6.5/avr8/words/rp0.asm new file mode 100644 index 0000000..1909f1c --- /dev/null +++ b/amforth-6.5/avr8/words/rp0.asm @@ -0,0 +1,27 @@ +; ( -- addr) +; Stack +; start address of return stack +VE_RP0: + .dw $ff03 + .db "rp0",0 + .dw VE_HEAD + .set VE_HEAD = VE_RP0 +XT_RP0: + .dw DO_COLON +PFA_RP0: + .dw XT_DORP0 + .dw XT_FETCH + .dw XT_EXIT + +; ( -- addr) +; Stack +; user variable of the address of the initial return stack +;VE_DORP0: +; .dw $ff05 +; .db "(rp0)" +; .dw VE_HEAD +; .set VE_HEAD = VE_DORP0 +XT_DORP0: + .dw PFA_DOUSER +PFA_DORP0: + .dw USER_RP diff --git a/amforth-6.5/avr8/words/rpfetch.asm b/amforth-6.5/avr8/words/rpfetch.asm new file mode 100644 index 0000000..8d1cdb6 --- /dev/null +++ b/amforth-6.5/avr8/words/rpfetch.asm @@ -0,0 +1,15 @@ +; ( -- n) +; Stack +; current return stack pointer address +VE_RP_FETCH: + .dw $ff03 + .db "rp@",0 + .dw VE_HEAD + .set VE_HEAD = VE_RP_FETCH +XT_RP_FETCH: + .dw PFA_RP_FETCH +PFA_RP_FETCH: + savetos + in tosl, SPL + in tosh, SPH + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/rpstore.asm b/amforth-6.5/avr8/words/rpstore.asm new file mode 100644 index 0000000..2a3d778 --- /dev/null +++ b/amforth-6.5/avr8/words/rpstore.asm @@ -0,0 +1,18 @@ +; ( addr -- ) (R: -- x*y) +; Stack +; set return stack pointer +VE_RP_STORE: + .dw $ff03 + .db "rp!",0 + .dw VE_HEAD + .set VE_HEAD = VE_RP_STORE +XT_RP_STORE: + .dw PFA_RP_STORE +PFA_RP_STORE: + in temp2, SREG + cli + out SPL, tosl + out SPH, tosh + out SREG, temp2 + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/rshift.asm b/amforth-6.5/avr8/words/rshift.asm new file mode 100644 index 0000000..e0e2231 --- /dev/null +++ b/amforth-6.5/avr8/words/rshift.asm @@ -0,0 +1,22 @@ +; ( n1 n2 -- n3 ) +; Arithmetics +; shift n1 n2-times logically right +VE_RSHIFT: + .dw $ff06 + .db "rshift" + .dw VE_HEAD + .set VE_HEAD = VE_RSHIFT +XT_RSHIFT: + .dw PFA_RSHIFT +PFA_RSHIFT: + movw zl, tosl + loadtos +PFA_RSHIFT1: + sbiw zl, 1 + brmi PFA_RSHIFT2 + lsr tosh + ror tosl + rjmp PFA_RSHIFT1 +PFA_RSHIFT2: + jmp_ DO_NEXT + diff --git a/amforth-6.5/avr8/words/scomma.asm b/amforth-6.5/avr8/words/scomma.asm new file mode 100644 index 0000000..a5be0ca --- /dev/null +++ b/amforth-6.5/avr8/words/scomma.asm @@ -0,0 +1,56 @@ +; ( addr len -- ) +; Compiler +; compiles a string from RAM to Flash +VE_SCOMMA: + .dw $ff02 + .db "s",$2c + .dw VE_HEAD + .set VE_HEAD = VE_SCOMMA +XT_SCOMMA: + .dw DO_COLON +PFA_SCOMMA: + .dw XT_DUP + .dw XT_DOSCOMMA + .dw XT_EXIT + +; ( addr len len' -- ) +; Compiler +; compiles a string from RAM to Flash +;VE_DOSCOMMA: +; .dw $ff04 +; .db "(s",$2c,")" +; .dw VE_HEAD +; .set VE_HEAD = VE_DOSCOMMA +XT_DOSCOMMA: + .dw DO_COLON +PFA_DOSCOMMA: + .dw XT_COMMA + .dw XT_DUP ; ( --addr len len) + .dw XT_2SLASH ; ( -- addr len len/2 + .dw XT_TUCK ; ( -- addr len/2 len len/2 + .dw XT_2STAR ; ( -- addr len/2 len len' + .dw XT_MINUS ; ( -- addr len/2 rem + .dw XT_TO_R + .dw XT_ZERO + .dw XT_QDOCHECK + .dw XT_DOCONDBRANCH + .dw PFA_SCOMMA2 + .dw XT_DODO +PFA_SCOMMA1: + .dw XT_DUP ; ( -- addr addr ) + .dw XT_FETCH ; ( -- addr c1c2 ) + .dw XT_COMMA ; ( -- addr ) + .dw XT_CELLPLUS ; ( -- addr+cell ) + .dw XT_DOLOOP + .dw PFA_SCOMMA1 +PFA_SCOMMA2: + .dw XT_R_FROM + .dw XT_GREATERZERO + .dw XT_DOCONDBRANCH + .dw PFA_SCOMMA3 + .dw XT_DUP ; well, tricky + .dw XT_CFETCH + .dw XT_COMMA +PFA_SCOMMA3: + .dw XT_DROP ; ( -- ) + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/set-current.asm b/amforth-6.5/avr8/words/set-current.asm new file mode 100644 index 0000000..334e167 --- /dev/null +++ b/amforth-6.5/avr8/words/set-current.asm @@ -0,0 +1,15 @@ +; ( wid -- ) +; Search Order +; set current word list to the given word list wid +VE_SET_CURRENT: + .dw $ff0b + .db "set-current",0 + .dw VE_HEAD + .set VE_HEAD = VE_SET_CURRENT +XT_SET_CURRENT: + .dw DO_COLON +PFA_SET_CURRENT: + .dw XT_DOLITERAL + .dw CFG_CURRENT + .dw XT_STOREE + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/slashmod.asm b/amforth-6.5/avr8/words/slashmod.asm new file mode 100644 index 0000000..2772651 --- /dev/null +++ b/amforth-6.5/avr8/words/slashmod.asm @@ -0,0 +1,66 @@ +; ( n1 n2 -- rem quot) +; Arithmetics +; signed division n1/n2 with remainder and quotient +VE_SLASHMOD: + .dw $ff04 + .db "/mod" + .dw VE_HEAD + .set VE_HEAD = VE_SLASHMOD +XT_SLASHMOD: + .dw PFA_SLASHMOD +PFA_SLASHMOD: + movw temp2, tosl + + ld temp0, Y+ + ld temp1, Y+ + + mov temp6,temp1 ;move dividend High to sign register + eor temp6,temp3 ;xor divisor High with sign register + sbrs temp1,7 ;if MSB in dividend set + rjmp PFA_SLASHMOD_1 + com temp1 ; change sign of dividend + com temp0 + subi temp0,low(-1) + sbci temp1,high(-1) +PFA_SLASHMOD_1: + sbrs temp3,7 ;if MSB in divisor set + rjmp PFA_SLASHMOD_2 + com temp3 ; change sign of divisor + com temp2 + subi temp2,low(-1) + sbci temp3,high(-1) +PFA_SLASHMOD_2: clr temp4 ;clear remainder Low byte + sub temp5,temp5;clear remainder High byte and carry + ldi temp7,17 ;init loop counter + +PFA_SLASHMOD_3: rol temp0 ;shift left dividend + rol temp1 + dec temp7 ;decrement counter + brne PFA_SLASHMOD_5 ;if done + sbrs temp6,7 ; if MSB in sign register set + rjmp PFA_SLASHMOD_4 + com temp1 ; change sign of result + com temp0 + subi temp0,low(-1) + sbci temp1,high(-1) +PFA_SLASHMOD_4: rjmp PFA_SLASHMODmod_done ; return +PFA_SLASHMOD_5: rol temp4 ;shift dividend into remainder + rol temp5 + sub temp4,temp2 ;remainder = remainder - divisor + sbc temp5,temp3 ; + brcc PFA_SLASHMOD_6 ;if result negative + add temp4,temp2 ; restore remainder + adc temp5,temp3 + clc ; clear carry to be shifted into result + rjmp PFA_SLASHMOD_3 ;else +PFA_SLASHMOD_6: sec ; set carry to be shifted into result + rjmp PFA_SLASHMOD_3 + +PFA_SLASHMODmod_done: + ; put remainder on stack + st -Y,temp5 + st -Y,temp4 + + ; put quotient on stack + movw tosl, temp0 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/sp0.asm b/amforth-6.5/avr8/words/sp0.asm new file mode 100644 index 0000000..324c1cf --- /dev/null +++ b/amforth-6.5/avr8/words/sp0.asm @@ -0,0 +1,27 @@ +; ( -- addr) +; Stack +; start address of the data stack +VE_SP0: + .dw $ff03 + .db "sp0",0 + .dw VE_HEAD + .set VE_HEAD = VE_SP0 +XT_SP0: + .dw PFA_DOVALUE1 +PFA_SP0: + .dw USER_SP0 + .dw XT_UDEFERFETCH + .dw XT_UDEFERSTORE + +; ( -- addr) +; Stack +; address of user variable to store top-of-stack for inactive tasks +VE_SP: + .dw $ff02 + .db "sp" + .dw VE_HEAD + .set VE_HEAD = VE_SP +XT_SP: + .dw PFA_DOUSER +PFA_SP: + .dw USER_SP diff --git a/amforth-6.5/avr8/words/spfetch.asm b/amforth-6.5/avr8/words/spfetch.asm new file mode 100644 index 0000000..69a0709 --- /dev/null +++ b/amforth-6.5/avr8/words/spfetch.asm @@ -0,0 +1,14 @@ +; ( -- addr ) +; Stack +; current data stack pointer +VE_SP_FETCH: + .dw $ff03 + .db "sp@",0 + .dw VE_HEAD + .set VE_HEAD = VE_SP_FETCH +XT_SP_FETCH: + .dw PFA_SP_FETCH +PFA_SP_FETCH: + savetos + movw tosl, yl + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/spirw.asm b/amforth-6.5/avr8/words/spirw.asm new file mode 100644 index 0000000..bd6616a --- /dev/null +++ b/amforth-6.5/avr8/words/spirw.asm @@ -0,0 +1,26 @@ +; ( txbyte -- rxbyte) +; MCU +; SPI exchange of 1 byte +VE_SPIRW: + .dw $ff06 + .db "c!@spi" + .dw VE_HEAD + .set VE_HEAD = VE_SPIRW +XT_SPIRW: + .dw PFA_SPIRW +PFA_SPIRW: + rcall do_spirw + clr tosh + jmp_ DO_NEXT + +do_spirw: + out_ SPDR, tosl +do_spirw1: + in_ temp0, SPSR + cbr temp0,7 + out_ SPSR, temp0 + in_ temp0, SPSR + sbrs temp0, 7 + rjmp do_spirw1 ; wait until complete + in_ tosl, SPDR + ret diff --git a/amforth-6.5/avr8/words/spstore.asm b/amforth-6.5/avr8/words/spstore.asm new file mode 100644 index 0000000..004d348 --- /dev/null +++ b/amforth-6.5/avr8/words/spstore.asm @@ -0,0 +1,14 @@ +; ( addr -- i*x) +; Stack +; set data stack pointer to addr +VE_SP_STORE: + .dw $ff03 + .db "sp!",0 + .dw VE_HEAD + .set VE_HEAD = VE_SP_STORE +XT_SP_STORE: + .dw PFA_SP_STORE +PFA_SP_STORE: + movw yl, tosl + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/state.asm b/amforth-6.5/avr8/words/state.asm new file mode 100644 index 0000000..31895fd --- /dev/null +++ b/amforth-6.5/avr8/words/state.asm @@ -0,0 +1,16 @@ +; ( -- addr ) +; System Variable +; system state +VE_STATE: + .dw $ff05 + .db "state",0 + .dw VE_HEAD + .set VE_HEAD = VE_STATE +XT_STATE: + .dw PFA_DOVARIABLE +PFA_STATE: + .dw ram_state + +.dseg +ram_state: .byte 2 +.cseg \ No newline at end of file diff --git a/amforth-6.5/avr8/words/store-e.asm b/amforth-6.5/avr8/words/store-e.asm new file mode 100644 index 0000000..45fff2a --- /dev/null +++ b/amforth-6.5/avr8/words/store-e.asm @@ -0,0 +1,66 @@ +; ( n e-addr -- ) +; Memory +; write n (2bytes) to eeprom address +VE_STOREE: + .dw $ff02 + .db "!e" + .dw VE_HEAD + .set VE_HEAD = VE_STOREE +XT_STOREE: + .dw PFA_STOREE +PFA_STOREE: +.if WANT_UNIFIED == 1 + ldi zh, high(EEPROMEND) + ldi zl, low(EEPROMEND) + cp tosl, zl + cpc tosh, zh + brlt PFA_STOREE0 + brbs 1, PFA_STOREE0 + rjmp PFA_STOREE_OTHER +.endif +PFA_STOREE0: + movw zl, tosl + loadtos + in_ temp2, SREG + cli + rcall PFA_FETCHE2 + in_ temp0, EEDR + cp temp0,tosl + breq PFA_STOREE3 + rcall PFA_STOREE1 +PFA_STOREE3: + adiw zl,1 + rcall PFA_FETCHE2 + in_ temp0, EEDR + cp temp0,tosh + breq PFA_STOREE4 + mov tosl, tosh + rcall PFA_STOREE1 +PFA_STOREE4: + out_ SREG, temp2 + loadtos + jmp_ DO_NEXT + +PFA_STOREE1: + sbic EECR, EEPE + rjmp PFA_STOREE1 + +PFA_STOREE2: ; estore_wait_low_spm: + in_ temp0, SPMCSR + sbrc temp0,SPMEN + rjmp PFA_STOREE2 + + out_ EEARH,zh + out_ EEARL,zl + out_ EEDR, tosl + sbi EECR,EEMPE + sbi EECR,EEPE + + ret +.if WANT_UNIFIED == 1 +PFA_STOREE_OTHER: + adiw zl, 1 + sub tosl, zl + sbc tosh, zh + jmp_ PFA_STOREI +.endif diff --git a/amforth-6.5/avr8/words/store-i.asm b/amforth-6.5/avr8/words/store-i.asm new file mode 100644 index 0000000..a56fce2 --- /dev/null +++ b/amforth-6.5/avr8/words/store-i.asm @@ -0,0 +1,14 @@ +; ( n addr -- ) +; System Value +; Deferred action to write a single 16bit cell to flash +VE_STOREI: + .dw $ff02 + .db "!i" + .dw VE_HEAD + .set VE_HEAD = VE_STOREI +XT_STOREI: + .dw PFA_DODEFER1 +PFA_STOREI: + .dw EE_STOREI + .dw XT_EDEFERFETCH + .dw XT_EDEFERSTORE diff --git a/amforth-6.5/avr8/words/store-i_big.asm b/amforth-6.5/avr8/words/store-i_big.asm new file mode 100644 index 0000000..422da39 --- /dev/null +++ b/amforth-6.5/avr8/words/store-i_big.asm @@ -0,0 +1,129 @@ +; ( n addr -- ) Memory +; R( -- ) +; writes a cell in flash +VE_DO_STOREI_BIG: + .dw $ff04 + .db "(i!)" + .dw VE_HEAD + .set VE_HEAD = VE_DO_STOREI_BIG +XT_DO_STOREI: + .dw PFA_DO_STOREI_BIG +PFA_DO_STOREI_BIG: + movw temp2, tosl ; save the (word) address + loadtos ; get the new value for the flash cell + push xl + push xh + push yl + push yh + ldi zl, byte3(DO_STOREI_atmega) + out_ rampz, zl + ldi zh, byte2(DO_STOREI_atmega) + ldi zl, byte1(DO_STOREI_atmega) + eicall + pop yh + pop yl + pop xh + pop xl + ; finally clear the stack + loadtos + jmp_ DO_NEXT + +; +.set _pc = pc +.org NRWW_START_ADDR +DO_STOREI_atmega: + ; write data to temp page buffer + ; use the values in tosl/tosh at the + ; appropiate place + rcall pageload + + ; erase page if needed + ; it is needed if a bit goes from 0 to 1 + com temp4 + com temp5 + and tosl, temp4 + and tosh, temp5 + or tosh, tosl + breq DO_STOREI_writepage + + movw zl, temp2 + ldi temp0,(1<body",0 + .dw VE_HEAD + .set VE_HEAD = VE_TO_BODY +XT_TO_BODY: + .dw PFA_1PLUS diff --git a/amforth-6.5/avr8/words/to_r.asm b/amforth-6.5/avr8/words/to_r.asm new file mode 100644 index 0000000..3e038de --- /dev/null +++ b/amforth-6.5/avr8/words/to_r.asm @@ -0,0 +1,15 @@ +; ( n -- ) (R: -- n) +; Stack +; move TOS to TOR +VE_TO_R: + .dw $ff02 + .db ">r" + .dw VE_HEAD + .set VE_HEAD = VE_TO_R +XT_TO_R: + .dw PFA_TO_R +PFA_TO_R: + push tosh + push tosl + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/true.asm b/amforth-6.5/avr8/words/true.asm new file mode 100644 index 0000000..9b64014 --- /dev/null +++ b/amforth-6.5/avr8/words/true.asm @@ -0,0 +1,16 @@ +; ( -- -1 ) +; Arithmetics +; leaves the value -1 (true) on TOS +VE_TRUE: + .dw $ff04 + .db "true" + .dw VE_HEAD + .set VE_HEAD = VE_TRUE +XT_TRUE: + .dw PFA_TRUE +PFA_TRUE: + savetos +PFA_TRUE1: + ser tosl + ser tosh + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/turnkey.asm b/amforth-6.5/avr8/words/turnkey.asm new file mode 100644 index 0000000..6f8e0c4 --- /dev/null +++ b/amforth-6.5/avr8/words/turnkey.asm @@ -0,0 +1,14 @@ +; ( -- n*y ) +; System Value +; Deferred action during startup/reset +VE_TURNKEY: + .dw $ff07 + .db "turnkey",0 + .dw VE_HEAD + .set VE_HEAD = VE_TURNKEY +XT_TURNKEY: + .dw PFA_DODEFER1 +PFA_TURNKEY: + .dw CFG_TURNKEY + .dw XT_EDEFERFETCH + .dw XT_EDEFERSTORE diff --git a/amforth-6.5/avr8/words/ubrr.asm b/amforth-6.5/avr8/words/ubrr.asm new file mode 100644 index 0000000..40f4304 --- /dev/null +++ b/amforth-6.5/avr8/words/ubrr.asm @@ -0,0 +1,14 @@ +; ( -- v) +; MCU +; returns usart UBRR settings +VE_UBRR: + .dw $ff04 + .db "ubrr" + .dw VE_HEAD + .set VE_HEAD = VE_UBRR +XT_UBRR: + .dw PFA_DOVALUE1 +PFA_UBRR: ; ( -- ) + .dw EE_UBRRVAL + .dw XT_EDEFERFETCH + .dw XT_EDEFERSTORE diff --git a/amforth-6.5/avr8/words/uless.asm b/amforth-6.5/avr8/words/uless.asm new file mode 100644 index 0000000..69d5a6b --- /dev/null +++ b/amforth-6.5/avr8/words/uless.asm @@ -0,0 +1,18 @@ +; ( u1 u2 -- flasg) +; Compare +; true if u1 < u2 (unsigned) +VE_ULESS: + .dw $ff02 + .db "u<" + .dw VE_HEAD + .set VE_HEAD = VE_ULESS +XT_ULESS: + .dw PFA_ULESS +PFA_ULESS: + ld temp2, Y+ + ld temp3, Y+ + cp tosl, temp2 + cpc tosh, temp3 + brlo PFA_ZERO1 + brbs 1, PFA_ZERO1 + jmp_ PFA_TRUE1 diff --git a/amforth-6.5/avr8/words/umslashmod.asm b/amforth-6.5/avr8/words/umslashmod.asm new file mode 100644 index 0000000..6adfbb1 --- /dev/null +++ b/amforth-6.5/avr8/words/umslashmod.asm @@ -0,0 +1,62 @@ +; ( ud u2 -- rem quot) +; Arithmetics +; unsigned division ud / u2 with remainder +VE_UMSLASHMOD: + .dw $ff06 + .db "um/mod" + .dw VE_HEAD + .set VE_HEAD = VE_UMSLASHMOD +XT_UMSLASHMOD: + .dw PFA_UMSLASHMOD +PFA_UMSLASHMOD: + movw temp4, tosl + + ld temp2, Y+ + ld temp3, Y+ + + ld temp0, Y+ + ld temp1, Y+ + +;; unsigned 32/16 -> 16r16 divide + +PFA_UMSLASHMODmod: + + ; set loop counter + ldi temp6,$10 + +PFA_UMSLASHMODmod_loop: + ; shift left, saving high bit + clr temp7 + lsl temp0 + rol temp1 + rol temp2 + rol temp3 + rol temp7 + + ; try subtracting divisor + cp temp2, temp4 + cpc temp3, temp5 + cpc temp7,zerol + + brcs PFA_UMSLASHMODmod_loop_control + +PFA_UMSLASHMODmod_subtract: + ; dividend is large enough + ; do the subtraction for real + ; and set lowest bit + inc temp0 + sub temp2, temp4 + sbc temp3, temp5 + +PFA_UMSLASHMODmod_loop_control: + dec temp6 + brne PFA_UMSLASHMODmod_loop + +PFA_UMSLASHMODmod_done: + ; put remainder on stack + st -Y,temp3 + st -Y,temp2 + + ; put quotient on stack + movw tosl, temp0 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/umstar.asm b/amforth-6.5/avr8/words/umstar.asm new file mode 100644 index 0000000..ee53c87 --- /dev/null +++ b/amforth-6.5/avr8/words/umstar.asm @@ -0,0 +1,37 @@ +; ( u1 u2 -- d) +; Arithmetics +; multiply 2 unsigned cells to a double cell +VE_UMSTAR: + .dw $ff03 + .db "um*",0 + .dw VE_HEAD + .set VE_HEAD = VE_UMSTAR +XT_UMSTAR: + .dw PFA_UMSTAR +PFA_UMSTAR: + movw temp0, tosl + loadtos + ; result: (temp3*temp1)* 65536 + (temp3*temp0 + temp1*temp2) * 256 + (temp0 * temp2) + ; low bytes + mul tosl,temp0 + movw zl, r0 + clr temp2 + clr temp3 + ; middle bytes + mul tosh, temp0 + add zh, r0 + adc temp2, r1 + adc temp3, zeroh + + mul tosl, temp1 + add zh, r0 + adc temp2, r1 + adc temp3, zeroh + + mul tosh, temp1 + add temp2, r0 + adc temp3, r1 + movw tosl, zl + savetos + movw tosl, temp2 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/unloop.asm b/amforth-6.5/avr8/words/unloop.asm new file mode 100644 index 0000000..f4fb4bc --- /dev/null +++ b/amforth-6.5/avr8/words/unloop.asm @@ -0,0 +1,16 @@ +; ( -- ) (R: loop-sys -- ) +; Compiler +; remove loop-sys, exit the loop and continue execution after it +VE_UNLOOP: + .dw $ff06 + .db "unloop" + .dw VE_HEAD + .set VE_HEAD = VE_UNLOOP +XT_UNLOOP: + .dw PFA_UNLOOP +PFA_UNLOOP: + pop temp1 + pop temp0 + pop temp1 + pop temp0 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/unused.asm b/amforth-6.5/avr8/words/unused.asm new file mode 100644 index 0000000..16566d4 --- /dev/null +++ b/amforth-6.5/avr8/words/unused.asm @@ -0,0 +1,15 @@ +; ( -- n ) +; Tools +; Amount of available RAM (incl. PAD) +VE_UNUSED: + .dw $ff06 + .db "unused" + .dw VE_HEAD + .set VE_HEAD = VE_UNUSED +XT_UNUSED: + .dw DO_COLON +PFA_UNUSED: + .dw XT_SP_FETCH + .dw XT_HERE + .dw XT_MINUS + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/up.asm b/amforth-6.5/avr8/words/up.asm new file mode 100644 index 0000000..0edfc01 --- /dev/null +++ b/amforth-6.5/avr8/words/up.asm @@ -0,0 +1,29 @@ +; ( -- addr ) +; System Variable +; get user area pointer +VE_UP_FETCH: + .dw $ff03 + .db "up@",0 + .dw VE_HEAD + .set VE_HEAD = VE_UP_FETCH +XT_UP_FETCH: + .dw PFA_UP_FETCH +PFA_UP_FETCH: + savetos + movw tosl, upl + jmp_ DO_NEXT + +; ( addr -- ) +; System Variable +; set user area pointer +VE_UP_STORE: + .dw $ff03 + .db "up!",0 + .dw VE_HEAD + .set VE_HEAD = VE_UP_STORE +XT_UP_STORE: + .dw PFA_UP_STORE +PFA_UP_STORE: + movw upl, tosl + loadtos + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/usart-rx-poll.asm b/amforth-6.5/avr8/words/usart-rx-poll.asm new file mode 100644 index 0000000..9896175 --- /dev/null +++ b/amforth-6.5/avr8/words/usart-rx-poll.asm @@ -0,0 +1,42 @@ +; (c -- ) +; MCU +; wait for one character and read it from the terminal connection using register poll +VE_RX_POLL: + .dw $ff07 + .db "rx-poll",0 + .dw VE_HEAD + .set VE_HEAD = VE_RX_POLL +XT_RX_POLL: + .dw DO_COLON +PFA_RX_POLL: + ; wait for data ready + .dw XT_RXQ_POLL + .dw XT_DOCONDBRANCH + .dw PFA_RX_POLL + ; send to usart + .dw XT_DOLITERAL + .dw USART_DATA + .dw XT_CFETCH + .dw XT_EXIT + +; ( -- f) +; MCU +; check if a unread character in the input device is available +VE_RXQ_POLL: + .dw $ff08 + .db "rx?-poll" + .dw VE_HEAD + .set VE_HEAD = VE_RXQ_POLL +XT_RXQ_POLL: + .dw DO_COLON +PFA_RXQ_POLL: + .dw XT_PAUSE + .dw XT_DOLITERAL + .dw bm_USART_RXRD + .dw XT_DUP + .dw XT_DOLITERAL + .dw USART_A + .dw XT_CFETCH + .dw XT_AND + .dw XT_EQUAL + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/usart-tx-poll.asm b/amforth-6.5/avr8/words/usart-tx-poll.asm new file mode 100644 index 0000000..a33e8fb --- /dev/null +++ b/amforth-6.5/avr8/words/usart-tx-poll.asm @@ -0,0 +1,40 @@ +; (c -- ) +; MCU +; check availability and send one character to the terminal using register poll +VE_TX_POLL: + .dw $ff07 + .db "tx-poll",0 + .dw VE_HEAD + .set VE_HEAD = VE_TX_POLL +XT_TX_POLL: + .dw DO_COLON +PFA_TX_POLL: + ; wait for data ready + .dw XT_TXQ_POLL + .dw XT_DOCONDBRANCH + .dw PFA_TX_POLL + ; send to usart + .dw XT_DOLITERAL + .dw USART_DATA + .dw XT_CSTORE + .dw XT_EXIT + +; ( -- f) MCU +; MCU +; check if a character can be send using register poll +VE_TXQ_POLL: + .dw $ff08 + .db "tx?-poll" + .dw VE_HEAD + .set VE_HEAD = VE_TXQ_POLL +XT_TXQ_POLL: + .dw DO_COLON +PFA_TXQ_POLL: + .dw XT_PAUSE + .dw XT_DOLITERAL + .dw USART_A + .dw XT_CFETCH + .dw XT_DOLITERAL + .dw bm_USART_TXRD + .dw XT_AND + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/usart.asm b/amforth-6.5/avr8/words/usart.asm new file mode 100644 index 0000000..f14e62f --- /dev/null +++ b/amforth-6.5/avr8/words/usart.asm @@ -0,0 +1,41 @@ +; ( -- ) +; MCU +; initialize usart +VE_USART: + .dw $ff06 + .db "+usart" + .dw VE_HEAD + .set VE_HEAD = VE_USART +XT_USART: + .dw DO_COLON +PFA_USART: ; ( -- ) + + .dw XT_DOLITERAL + .dw USART_B_VALUE + .dw XT_DOLITERAL + .dw USART_B + .dw XT_CSTORE + + .dw XT_DOLITERAL + .dw USART_C_VALUE + .dw XT_DOLITERAL + .dw USART_C | bm_USARTC_en + .dw XT_CSTORE + + .dw XT_UBRR + .dw XT_DUP + .dw XT_BYTESWAP + .dw XT_DOLITERAL + .dw BAUDRATE_HIGH + .dw XT_CSTORE + .dw XT_DOLITERAL + .dw BAUDRATE_LOW + .dw XT_CSTORE +.if XT_USART_INIT_RX!=0 + .dw XT_USART_INIT_RX +.endif +.if XT_USART_INIT_TX!=0 + .dw XT_USART_INIT_TX +.endif + + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/user.asm b/amforth-6.5/avr8/words/user.asm new file mode 100644 index 0000000..c11f600 --- /dev/null +++ b/amforth-6.5/avr8/words/user.asm @@ -0,0 +1,18 @@ +; ( n cchar -- ) +; Compiler +; create a dictionary entry for a user variable at offset n +VE_USER: + .dw $ff04 + .db "user" + .dw VE_HEAD + .set VE_HEAD = VE_USER +XT_USER: + .dw DO_COLON +PFA_USER: + .dw XT_DOCREATE + .dw XT_REVEAL + + .dw XT_COMPILE + .dw PFA_DOUSER + .dw XT_COMMA + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/uslashmod.asm b/amforth-6.5/avr8/words/uslashmod.asm new file mode 100644 index 0000000..0d9b5aa --- /dev/null +++ b/amforth-6.5/avr8/words/uslashmod.asm @@ -0,0 +1,16 @@ +; (u1 u2 -- rem quot) +; Arithmetics +; unsigned division with remainder +VE_USLASHMOD: + .dw $ff05 + .db "u/mod",0 + .dw VE_HEAD + .set VE_HEAD = VE_USLASHMOD +XT_USLASHMOD: + .dw DO_COLON +PFA_USLASHMOD: + .dw XT_TO_R + .dw XT_ZERO + .dw XT_R_FROM + .dw XT_UMSLASHMOD + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/wdr.asm b/amforth-6.5/avr8/words/wdr.asm new file mode 100644 index 0000000..b2c78f6 --- /dev/null +++ b/amforth-6.5/avr8/words/wdr.asm @@ -0,0 +1,13 @@ +; ( -- ) +; MCU +; calls the MCU watch dog reset instruction +VE_WDR: + .dw $ff03 + .db "wdr",0 + .dw VE_HEAD + .set VE_HEAD = VE_WDR +XT_WDR: + .dw PFA_WDR +PFA_WDR: + wdr + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/wlscope.asm b/amforth-6.5/avr8/words/wlscope.asm new file mode 100644 index 0000000..cbef8c2 --- /dev/null +++ b/amforth-6.5/avr8/words/wlscope.asm @@ -0,0 +1,22 @@ +; ( addr len -- addr' len' wid ) +; Compiler +; dynamically place a word in a wordlist. The word name may be changed. +VE_WLSCOPE: + .dw $ff07 + .db "wlscope",0 + .dw VE_HEAD + .set VE_HEAD = VE_WLSCOPE +XT_WLSCOPE: + .dw PFA_DODEFER1 +PFA_WLSCOPE: + .dw CFG_WLSCOPE + .dw XT_EDEFERFETCH + .dw XT_EDEFERSTORE + +; wlscope, "wordlist scope" ( addr len -- addr' len' wid ), is a deferred word +; which enables the AmForth application to choose the wordlist ( wid ) for the +; new voc entry based on the input ( addr len ) string. The name of the new voc +; entry ( addr' len' ) may be different from the input string. Note that all +; created voc entry types pass through the wlscope mechanism. The default +; wlscope action passes the input string to the output without modification and +; uses get-current to select the wid. diff --git a/amforth-6.5/avr8/words/wordlist.asm b/amforth-6.5/avr8/words/wordlist.asm new file mode 100644 index 0000000..d5d2980 --- /dev/null +++ b/amforth-6.5/avr8/words/wordlist.asm @@ -0,0 +1,20 @@ +; ( -- wid ) +; Search Order +; create a new, empty wordlist +VE_WORDLIST: + .dw $ff08 + .db "wordlist" + .dw VE_HEAD + .set VE_HEAD = VE_WORDLIST +XT_WORDLIST: + .dw DO_COLON +PFA_WORDLIST: + .dw XT_EHERE + .dw XT_ZERO + .dw XT_OVER + .dw XT_STOREE + .dw XT_DUP + .dw XT_CELLPLUS + .dw XT_DOTO + .dw PFA_EHERE + .dw XT_EXIT diff --git a/amforth-6.5/avr8/words/xor.asm b/amforth-6.5/avr8/words/xor.asm new file mode 100644 index 0000000..337259c --- /dev/null +++ b/amforth-6.5/avr8/words/xor.asm @@ -0,0 +1,16 @@ +; ( n1 n2 -- n3) +; Logic +; exclusive or +VE_XOR: + .dw $ff03 + .db "xor",0 + .dw VE_HEAD + .set VE_HEAD = VE_XOR +XT_XOR: + .dw PFA_XOR +PFA_XOR: + ld temp0, Y+ + ld temp1, Y+ + eor tosl, temp0 + eor tosh, temp1 + jmp_ DO_NEXT diff --git a/amforth-6.5/avr8/words/zero.asm b/amforth-6.5/avr8/words/zero.asm new file mode 100644 index 0000000..a03942c --- /dev/null +++ b/amforth-6.5/avr8/words/zero.asm @@ -0,0 +1,15 @@ +; ( -- 0 ) +; Arithmetics +; place a value 0 on TOS +VE_ZERO: + .dw $ff01 + .db "0",0 + .dw VE_HEAD + .set VE_HEAD = VE_ZERO +XT_ZERO: + .dw PFA_ZERO +PFA_ZERO: + savetos +PFA_ZERO1: + movw tosl, zerol + jmp_ DO_NEXT -- cgit v1.2.3