! NULL device interface module

%option "-low-nons-nocheck-nodiag"
%include "nmouse.inc"

%externalrecord(fcbfm)%map FOP %alias "FOP_N" -
  (%integer code,%string(*)%name file,%name x)
%conststring eof = "Attempting to read from null device"
%record(fcbfm)%name cb == nil
%integer pc
%label yes,no

  %routine cbop (%record(fcb fm)%name cb,%integer code,p1,p2,%bytename b)
  %switch sw(cbopclose:cbopread)
    ->sw(code) %if cbopclose<=code<=cbopread
    %signal 3,4,code,"Illegal fcb operation (:T)"
  sw(cbopflush):
  sw(cbopwrite):   %return
  sw(cboprefresh):
  sw(cbopread):    %signal 9,,,eof
  sw(cbopclose):
  sw(cbopabort):
    heapput(cb_bs) %unless cb_bs=0; cb_bs = 0
    dispose(cb_prompt) %unless cb_prompt==nil; cb_prompt == nil
    dispose(cb)
  %end

  *lea cbop,a0; *move.l a0,pc
  %if code = fop openi %start
    cb == newfcb(file)
    cb_fastpc = addr(no); cb_pc = pc; cb_gla = a4
    cb_prompt == string(heapget(256))
    cb_prompt = ":"
    cb_bs = heapget(256)
    cb_bl = cb_bs+256
    cb_fs = cb_bs; cb_fl = cb_fs
    cb_p = cb_bs; cb_l = cb_p
  %elseif fop openo <= code <= fop opena
    cb == newfcb(file)
    cb_fastpc = addr(yes); cb_pc = pc; cb_gla = a4
  %else
    %signal 3,3,code,"File operation not supported (:N)"
  %finish
  %result == cb
yes: *rts
no:  %signal 9,,,eof
%end
