new SPI impl; untested