From 2f83a0bea9da444e3d70569eba3d6847ca02be03 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Fri, 21 Sep 2018 21:59:17 +0200 Subject: ... --- forth/forth/avr/bit.fs | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 forth/forth/avr/bit.fs (limited to 'forth/forth/avr/bit.fs') diff --git a/forth/forth/avr/bit.fs b/forth/forth/avr/bit.fs new file mode 100644 index 0000000..c61e48e --- /dev/null +++ b/forth/forth/avr/bit.fs @@ -0,0 +1,77 @@ +\ ********************************************************************* +\ * +\ Filename: bit.txt * +\ Date: 06.01.2015 * +\ FF Version: 5.0 * +\ MCU: Atmega * +\ Copyright: Mikael Nordman * +\ Author: Mikael Nordman * +\ ********************************************************************* +\ FlashForth is licensed acording to the GNU General Public License* +\ ********************************************************************* +\ Words for manipulating bits in ram. +\ Memory mapped addresses of I/O ports must be used. +\ CBI SBI SBIS instructions will be generated for adresses $20-$3f +\ IN and OUT instruction will be used for addresses $40 to $5f +\ LDS and STS instructions will be used for addresses over $60 +\ Bit has value 0..7 + +-bit +marker -bit +: (bio) ( c-addr -- in/out-addr ) $20 - dup $5 lshift or $60f and ; +: (bit) ( c-addr bit flag "name" -- ) + : >r + over $40 < if + swap $20 - 3 lshift or + r> + if $9a00 \ sbi io-addr, bit + else $9800 \ cbi io-addr, bit + then or i, + else + over $60 < + if over (bio) $b100 or \ in r16 io-addr + else $9100 i, over \ lds r16 c-addr + then i, + 1 swap lshift + r> + if $6000 >r + else $7000 >r invert $ff and + then dup 4 lshift or $f0f and r> or i, \ andi/ori r16, mask + dup $60 < + if (bio) $b900 or \ out io-addr r16 + else $9300 i, \ sts c-addr r16 + then i, + then + $9508 i, \ return + postpone [ +; + +\ Define a word that clears a bit in ram +\ The defined word can be inlined +( c-addr bit "name" -- ) +: bit0: false (bit) ; + +\ Define a word that sets a bit in ram +\ The defined word can be inlined +( c-addr bit "name" -- ) +: bit1: true (bit) ; + +\ Define a word that leaves a true flag if a bit in ram is one +\ and a false flag if a bit is zero. +\ The defined word can be inlined +( c-addr bit "name" -- ) +: bit?: + : + $939a i, $938a i, $ef8f i, $ef9f i, \ true + over $40 < if + swap $20 - 3 lshift or $9b00 or i, \ sbis io-addr, bit + else + over $60 < + if swap (bio) $b100 or \ in r16 io-addr + else $9100 i, swap \ lds r16 c-addr + then i, $ff00 or i, \ sbrs r16, bit + then + $9601 i, \ 1+ + $9508 i, \ return + postpone [ +; -- cgit v1.2.3