#lang planet zwizwa/staapl/pic18 \ -*- forth -*-
provide-all
\ On-target immediate words implementing the control words.
staapl pic18/double-math
staapl pic18/double-pred
staapl pic18/execute
staapl pic18/dtc
\ This needs "comma" and a way to back-patch words.  The idea is to
\ compile to a RAM buffer first, and transfer it to FLASH when it's
\ done.
staapl pic18/double-comma
macro
: _address  word-address lohi forth  
: _mask    #x3F and : _lmask   _mask #x40 or : _compile _mask _, : _literal _lmask _, : _0       0 0     
\ These compile unconditional and conditional jump.
: _jump,   ' _run    _address exitbit _compile : _0=jump, ' _0=run
\ Jumps are proper primitives.  They take a single argument which we
\ compile as a literal.
: _hole    _here@ _0 _literal : _lpack   _>> _lmask : _then    _>r _here@ _lpack _r> _!     
: _if      _hole _0=jump, : _else    _>r _hole _jump, _r> _then 
: _begin   _here@ : _again   _lpack _, _jump, : _until   _lpack _, _0=jump, 
    
\ COMPLICATIONS: because of the exit bit, jump targets need to be
\ protected so the previous instruction doesn't get exit-tagged.  See
 \ -m.ss