%include "moose:mouse.inc"

%Constinteger nfiles = 20

!%Recordformat filefm (%Integer flags,%Record(scbfm)%Name scb) for mouse
%Recordformat filefm (%Integer streamno,mode)

%ownrecord(filefm)%array files (0:NFILES) =0(*)

%Routine Setup IO
   %Integer i
   files(0)_streamno = 0; files(0)_mode = inputmode
   files(1)_streamno = 0; files(1)_mode = outputmode
   files(2)_streamno = 0; files(2)_mode = outputmode
   %for i = 3,1,nfiles %cycle
      files(i)_mode = -1
      files(i)_streamno = i-2
   %Repeat
   Printstring("IO Setup");newline
%End

%Externalinteger ErrNO %Alias "C_ERRNO" = 0

%Routine debug (%String(255) s)
   selectoutput(0)
   printstring(s)
   newline
%End

%Externalroutine Start
   %Integer c
   
   %Routine Go
!      %on 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 %start
!         Printstring("Event_no  =");write(event_event,0);newline
!         Printstring("Event_mess=".event_message);newline
!         %Return
!      %Finish

      *move.l c,a0
      *jsr (a0)
   %End

   *move.l a0,c
   printstring("Image Startup");newline
   setup IO
   go
   printstring("Image Rundown");newline
   %Stop
%End

%Externalintegerfn EXIT (%integer reason)
   %Signal 1,1,1,"_exit called"
%End

%Externalintegerfn SIGNAL
   Printstring("Signal called")
   %result = -1
%End

%Externalintegerfn BRK (%integer addr)
   %result = -1
%End

%Externalintegerfn EXECL (%integer name,argl)
   %Result = -1
%End

%Externalintegerfn EXECV (%Integer name, argv)
   %Result = -1
%End

%Externalintegerfn EXECLE (%integer name,argl)
   %Result = -1
%End

%Externalintegerfn FORK
   %Result = -1
%End

%Externalintegerfn GETUID
   %Result = -1
%End

%Externalintegerfn GETEUID
   %Result = -1
%End

%Externalintegerfn GETGID
   %Result = -1
%End

%Externalintegerfn GETEGID
   %Result = -1
%End

%Externalintegerfn GETPID
   %result = -1
%End

%Externalintegerfn KILL
   %result = -1
%End

%Externalintegerfn LINK
   %Result = -1
%End

%Externalintegerfn NICE
   %result = -1
%End

%Externalintegerfn PIPE (%Integer filedes)
   %Result = -1
%End

%Externalintegerfn PROFIL
   %Result = -1
%End

%Externalintegerfn SETUID
   %result = -1
%End

%Externalintegerfn SETGID
   %result = -1
%End

%Externalintegerfn UMASK
   %Result = -1
%End

%Externalintegerfn WAIT (%integer status)
   %Result = -1
%End

%externalpredicatespec exists (%String(255) s)
%Routine scopy (%integer name,%string(*)%name s)
   s = ""
   %While byteinteger(name) # 0 %cycle
      s = s.tostring(byteinteger(name))
      name = name + 1
   %Repeat 
%End      

%Routine copy s (%string(*)%name s, %integer name)
   %integer i
   %for i = 1,1,length(s) %cycle
      byteinteger(name) = charno (s,i)
      name = name + 1
   %Repeat
   byteinteger(name)=0
%End

%Externalroutine PS (%Integer x)
   %String(255) s
   scopy (x,s)
   printstring(s);newline
%End

%ExternalIntegerfn ACCESS (%Integer name,mode)
   %string(255) filename

   debug ("access")
   scopy (name,filename)
   %Result = 0 %if exists(filename)
   %result = -1
%End

%Externalintegerfn CHDIR (%Integer name)
   %string(255) filename

   debug("chdir")
   scopy (name,filename)
   ! Do something ???
   %Result = 0
%End

%Externalintegerfn CHMOD (%Integer name,mode)
   %string(255) filename

   debug ("chmod")
   scopy (name,filename)
   ! Do something
   %Result = 0
%End

%Externalintegerfn TIME (%Integer tloc)
   !Return no. of secs since Jan 1, 1970
   %Result = 0
%End

%Recordformat Timebfm (%Integer time,%Short millitm,timezone,dstflag)

%Externalintegerfn FTIME (%Integer tp)
   %Record(timebfm)%name t == record(tp)

   debug ("ftime")
   t_time = time(0)
   t_millitm = cputime
   t_timezone = 0
   t_dstflag = 0
   %Result = 0
%End

%Recordformat tmsfm (%Integer utime,stime,ctime,cstime)

%Externalintegerfn TIMES (%integer buff)
   %Record(tmsfm)%name b == record(buff)

   debug ("times")
   b_utime = cputime // 10
!NOSQUEAK   b_stime = realtime // 10
   b_ctime = 0
   b_cstime = 0
   %Result = -1
%End

%Externalintegerfn UNLINK (%Integer name)
   %String(255) filename

   %on 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 %start
      %result = -1
   %Finish

   debug ("unlink")
   scopy (name,filename)
!   delete file (filename)
   %result = 0
%End

%Externalintegerfn GETWD (%integer name)
   %string(255) dirname

   debug ("getwd")
! get default directory
   copys (dirname,name)
   %Result = 0
%End

%Externalintegerfn SBRK (%Integer inc)
   debug ("sbrk")
   %result = heapget (inc)
%End

%Externalintegerfn FREE (%Integer adr)
   debug ("free")
   heapput (adr)
   %result = 0
%End

%Integerfn fdalloc
   %integer i
   %for i = 3,1,nfiles %cycle
      %result = i %if files(i)_mode = -1
   %Repeat
   %result = -1
%End

%Externalintegerfn OPENC (%integer name, mode)
   %string(255) filename
   %Record(filefm)%name f
   %integer fd

   %on 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 %start
      Printstring("OPENC signalled");newline
      %result = -1
   %Finish

   %result = -1 %unless 0<=mode<=1
   scopy (name,filename)
   printstring("OPENC ".filename);newline
   fd = fdalloc; %result = -1 %if fd = -1
   f == files(fd)
   %if mode = input mode %start
      open input (f_streamno,filename)
      f_mode = input mode
   %Else
      open output (f_streamno,filename)
      f_mode = output mode
   %finish
   %Result = fd
%End

%Predicate fdok (%integer fd)
   %falseunless 0<=fd<=nfiles
   %falseif files(fd)_mode = -1
   %true
%End

%Externalintegerfn CLOSEC (%integer fd)
   %record(filefm)%name f
   
   printstring("CLOSEC ");write(fd,0);newline
   %Result = -1 %unless fdok (fd)
   f == files(fd)
   printstring("just after f==");newline
   printstring("Stream = ");write(f_streamno,0);newline
   printstring("Mode = ");write(f_mode,0);newline
   %if f_mode = input mode %start
      printstring("closing input");newline
      select input(f_streamno);closeinput
      printstring("closed input");newline
   %elseif f_mode = output mode
      printstring("closing output");newline
      select output(f_streamno);closeoutput
      printstring("closed output");newline
   %else
      %result = -1
   %finish
   f_mode = -1
   %Result = 0
%End

%Externalintegerfn UCLOSEC (%Integer fd)
   %result=Closec(fd)
%End

%Externalintegerfn IOCTL (%integer fd,req,argp)
   %result = -1
%End

%Externalintegerfn CREAT (%Integer name,mode)
   %integer fd
   debug ("creat")
   fd = openc (name,outputmode)
   %result = fd
%End

%Externalintegerfn LSEEK (%Integer fd,offset,dir)
   %Integer curpos,newpos
   %Record(filefm)%name f

   printstring("LSEEK");newline
!   %Result = -1 %unless fdok (fd)
!   f == files(fd)
!   curpos = f_scb_p - f_scb_fs
!   %if dir = 0 %start
!      newpos = offset
!   %elseif dir = 1
!      newpos = curpos + offset
!   %elseif dir = 2
!      %Result = -1 %unless offset <= 0
!      newpos = f_scb_fl + offset
!   %finish
!   %if f_scb_mode = input mode %start
!      service (f_scb,ser set in ,newpos)
!   %else
!      service (f_scb,ser set out,newpos)
!   %Finish
!   %Result = newpos
   %result = -1
%End

%Externalintegerfn READC (%Integer fd, buffer, nbytes)
   %Record(filefm)%name f
   %integer i,sym,count=0

   %on 9 %start
      %result = count
   %finish

   Printstring("READC ");write(nbytes,0);newline
   %Result = -1 %unless fdok (fd)
   f == files(fd)
   %result = -1 %unless f_mode = input mode
   select input (f_streamno)
   %if fd=0 %start {special for term}
      readsymbol(sym)
      byteinteger(buffer)=sym
      %result=1
   %finish
   %for i = 1,1,nbytes %cycle
      read symbol (sym)
      byteinteger(buffer)=sym
      buffer=buffer+1
      count = count +1
   %Repeat
   %Result =count
%End

%Externalintegerfn WRITEC (%Integer fd,buffer,nbytes)
   %record(filefm)%name f
   %integer i

!   Printstring("WRITEC");newline
   %Result = -1 %unless fdok(fd)
   f == files(fd)
   %result = -1 %unless f_mode = output mode
   select output (f_streamno)
   %for i=1,1,nbytes %cycle
      printsymbol(byteinteger(buffer))
      buffer=buffer+1
   %repeat
   %Result = nbytes
%End
