\ flashio needs double hex fffff304. 2constant IMR fffff110. 2constant CSA0 10c00000. 2constant FLASH 2variable irq-save 2variable ftgt 2variable fdata : 2and rot and rot rot and swap ; : 2or rot or rot rot or swap ; : c@f FLASH d+ c@a ; : c!f FLASH d+ c!a ; : @f FLASH d+ @a ; : !f FLASH d+ !a ; : flash-open ( -- ) hex IMR 2@a irq-save 2! 00ffffff. IMR 2!a CSA0 2@a fffffff7. 2and CSA0 2!a ; : flash-close ( -- ) irq-save 2@ IMR 2!a CSA0 2@a 8. 2or CSA0 2!a ; : flash-cmd ( d -- ) 0aa aaa. !f 055 554. !f aaa. !f ; : flash-check ( a. -- flag ) 2dup 10d40000. d< if 2drop false else 10e00000. d< if true else false then then ; : flash-is-present ( -- flag ) flash-open 090 flash-cmd 1. c@f 1 = if 2. @f 02249 = if true else false then else false then 0f0 0. c!f flash-close ; : f-data-toggle ( -- flag ) ftgt 2@ @a 040 and ftgt 2@ @a 040 and = ; : f-timeout ( -- flag ) ftgt 2@ @a 020 and 020 = ; : f-erased ( -- flag ) ftgt 2@ @a 080 and 080 = ; : !!f ( d a. -- ) 3 enough? ftgt 2! fdata ! ftgt 2@ flash-check if ftgt 2@ @a fdata @ <> if flash-open 0a0 flash-cmd fdata @ ftgt 2@ !a begin f-data-toggle f-timeout or until f-data-toggle 0= flash-close if -15 throw then then else -9 throw then ; : !!fse ( a. -- ) 2 enough? ftgt 2! ftgt 2@ flash-check if flash-open 080 flash-cmd 0aa aaa. !f 055 554. !f 030 ftgt 2@ !a begin f-erased f-timeout or until f-erased 0= flash-close if -15 throw then else -9 throw then ;