pic18/demo.ss
;; PIC18 compiler core test without Forth syntax and CFG compiler.

;; This module is used in the documentation.

#lang scheme/base
(require
 "../tools.ss")
(require/provide
 "../sig.ss"
 "sig.ss"
 "../target.ss"
 "../tools.ss"
 
 "../coma/comma-unit.ss"
 "../coma/code-unit.ss"
 "../control/control-unit.ss"
 "../control/jump-test-unit.ss"
 "pic18-unit.ss"
 "pic18-control-unit.ss"

 "../coma/macro-forth.ss"

 "../forth/forth-lex.ss"

 ;; forth
 "../ns.ss"
 "../rpn.ss"

 "../macro.ss"

 "pic18-const.ss"
 "asm.ss"

 )


(provide
 (all-defined-out))

(define/invoke
  (stack^
   stack-extra^
   memory-extra^
   comma^
   code^
   jump^
   cjump^
   control^
   machine^
   pic18-assembler^
   pic18-extra^
   pic18-postproc^)
  (pic18@
   comma@
   code@
   control@
   jump-test@
   ))

(target-print-word-bytes 2) 
(target-print-address-bits 16)


(define (optimize-state optimizer state)
  (macro-list->state
   (for/list ((macro (state->macro-list state)))
     (macro: ,macro ,optimizer))
   state:stack))

(define (optimize state . optimizers)
  (foldl optimize-state state optimizers))

(define-syntax-rule (code> . code)
  (state-print-code
   ((macro: . code) (state:stack))))

(define-syntax-rule (pic18> . code)
  (state-print-code
   (optimize ((macro: . code) (state:stack))
             (macro: pseudo)
             (macro: opti-save))))

  
(define (help)
  (display "Use the pic18> form to compile Forth code to intermediate form.\n"))


;; snot
(define-syntax-rule (forth-compile str)
  (forth-lex-string/cps macro> str))