' Spin boot loader and OS for CVM
CON

_clkmode        = xtal1 + pll16x
_xinfreq        = 5_000_000

'The size of LMM memory area in HUB
cvm_memory_size = (24 * 1024)

OBJ
  cvm  : "cvm.spin"

DAT                     org 0
cvm_memory              byte ' Force cvm_memory to be BYTE type.
'cvm_image               file "a.out"
padding                 byte 0[(cvm_memory_size) - (@padding - @cvm_memory)]

                        fit (cvm_memory_size / 4)

VAR
  ' CVM parameter block
  long par_LMM_base
  long par_initial_pc
  long par_initial_sp
  long par_dispatch_tab
  long par_pasm_addr

  'id+1 of cog running CVM
  long cogno

  ' OS loop temporary variables
  long addr
  long c
  long f
  long r
  long ptr
  long siz
  long n
  long name
  long mode

PUB start | b, ad
  'Set up Zog's parameter block
  par_LMM_base := @cvm_memory
  par_initial_pc := 0
  par_initial_sp := cvm_memory_size - 8
  par_dispatch_tab := cvm.getdispatch_table
  par_pasm_addr := cvm.getcvm

  cogno := cvm.start(@par_LMM_base)

  ' enter into the OS loop
  repeat
    case sys_op+1
       1: ' get args
         addr := par_LMM_base[sys_bp + 12]
         par_LMM_base[addr]    := 0 'stdin
         par_LMM_base[addr+4]  := 0 'stdout
         par_LMM_base[addr+8]  := 0 'stderr
         par_LMM_base[addr+12] := 0 'argc
         par_LMM_base[addr+16] := 0 'argv
       2: ' malloc -- TBD change to sbrk + malloc lib
       3: ' free -- TBD change to sbrk + malloc lib
       4: ' exit
         cogstop( cogno-1 )
         ' stop & return to TriOS -- TriOS wizards please help
       5: ' realloc -- TBD change to sbrk + malloc lib
       6: ' fputc
         c := par_LMM_base[sys_bp + 12]
         f := par_LMM_base[sys_bp + 16]
         ' r = fputc(c, f) -- TriOS wizards please help
         par_LMM_base[sys_sp] := r
       7: ' fgetc
         f := par_LMM_base[sys_bp + 12]
         ' r = fgetc(c, f) -- TriOS wizards please help
         par_LMM_base[sys_sp] := r
       8: ' fread
         ptr := par_LMM_base[sys_bp + 12]
         siz := par_LMM_base[sys_bp + 16]
         n   := par_LMM_base[sys_bp + 20]
         f   := par_LMM_base[sys_bp + 24]
         ' r = fread(ptr, siz, n, f) -- TriOS wizards please help
         par_LMM_base[sys_sp] := r
       9: ' fwrite
         ptr := par_LMM_base[sys_bp + 12]
         siz := par_LMM_base[sys_bp + 16]
         n   := par_LMM_base[sys_bp + 20]
         f   := par_LMM_base[sys_bp + 24]
         ' r = fwrite(ptr, siz, n, f) -- TriOS wizards please help
         par_LMM_base[sys_sp] := r
      10: ' ferror
         f := par_LMM_base[sys_bp + 12]
         ' r = ferror(c, f) -- TriOS wizards please help
         par_LMM_base[sys_sp] := r
      11: ' fopen
         name := par_LMM_base[sys_bp + 12] ' name is a char ptr
         mode := par_LMM_base[sys_bp + 16] ' mode is a char ptr
         ' r = fputc(name, mode) -- TriOS wizards please help
         par_LMM_base[sys_sp] := r
      12: ' fclose
         f := par_LMM_base[sys_bp + 12]
         ' r = ferror(c, f) -- TriOS wizards please help
         par_LMM_base[sys_sp] := r
    sys_op := 0

DAT

' Spin/PASM wizards: Are these the same locations as in cvm.spin ?
sys_op        long      0
sys_sp        long      0
sys_bp        long      0

