( AVR Programmer, load range 160-163. doc/avr.txt ) ( page size in words, 64 is default on atmega328P ) CREATE aspfpgsz 64 , VARIABLE aspprevx : _x ( a -- b ) DUP aspprevx ! (spix) ; : _xc ( a -- b ) DUP (spix) ( a b ) DUP aspprevx @ = NOT IF ABORT" AVR err" THEN ( a b ) SWAP aspprevx ! ( b ) ; : _cmd ( b4 b3 b2 b1 -- r4 ) _xc DROP _xc DROP _xc DROP _x ; : asprdy ( -- ) BEGIN 0 0 0 0xf0 _cmd 1 AND NOT UNTIL ; : asp$ ( spidevid -- ) ( RESET pulse ) DUP (spie) 0 (spie) (spie) ( wait >20ms ) 220 TICKS ( enable prog ) 0xac (spix) DROP 0x53 _x DROP 0 _xc DROP 0 _x DROP ; : asperase 0 0 0x80 0xac _cmd asprdy ;