!***********************************************************************
!*
!*                      Microprogram patch program
!*
!*      Copyright (C) R.D. Eager   University of Kent   MCMLXXXIV
!*
!***********************************************************************
!
!
!***********************************************************************
!*
!*          Constants
!*
!***********************************************************************
!
constantbyteinteger  eom = 25;          ! End of file character
constantstring (1) snl = "
"
!
!
!***********************************************************************
!*
!*          Record formats
!*
!***********************************************************************
!
recordformat  rf(integer  conad,filetype,datastart,dataend)
!
!
!***********************************************************************
!*
!*          Subsystem references
!*
!***********************************************************************
!
systemroutinespec  connect(string (31) file,integer  mode,hole,
                           prot,record (rf)name  r,integername  flag)
systemroutinespec  disconnect(string (31) file,integername  flag)
systemstringfunctionspec  failuremessage(integer  mess)
systemstringfunctionspec  htos(integer  value,places)
systemstringfunctionspec  itos(integer  n)
systemintegerfunctionspec  parmap
externalroutinespec  prompt(string (255) s)
systemroutinespec  setpar(string (255) s)
externalroutinespec  set return code(integer  i)
systemstringfunctionspec  spar(integer  n)
systemroutinespec  uctranslate(integer  ad,len)
!
!
!***********************************************************************
!*
!*          Service routines
!*
!***********************************************************************
!
routine  conv(stringname  s,integer  lineno,field,integername  value,flag)
integer  base,c,i
longinteger  res
!
flag = 0
if  charno(s,1) = 'X' then  start 
   s = substring(s,2,length(s))
   base = 16
else 
   base = 10
finish 
!
if  length(s) = 0 then  start 
   printstring("Warning - invalid or null field ".itos(field)." on line ".itos(lineno).snl)
   flag = 1
   return 
finish 
!
res = 0
for  i = 1,1,length(s) cycle 
   c = charno(s,i)
   if  '0' <= c <= '9' then  c = c - '0' else  c 
                             c = c - 'A' + 10
   if  0 <= c < base then  start 
      res = res*lengtheni(base) + c
   else 
      printstring("Warning - invalid digit in field ".itos(field)." on line ".itos(lineno).snl)
      flag = 1
      exit 
   finish 
repeat 
!
value <- res
end ;   ! of conv
!
!-----------------------------------------------------------------------
!
routine  readline(stringname  s)
integer  c
string (255) s1,s2
!
on  event  9 start 
   s = ".END"
   return 
finish 
!
s = ""
cycle 
   cycle 
      readsymbol(c)
      exit  if  c = nl
      s <- s.tostring(c)
   repeat 
   while  length(s) > 0 and  charno(s,length(s)) = ' ' cycle 
      length(s) = length(s) - 1
   repeat 
   exit  unless  s = ""
repeat 
!
s = s1.s2 while  s -> s1.(" ").s2
!
uctranslate(addr(s)+1,length(s))
end ;   ! of readline
!
!
!***********************************************************************
!*
!*          M P
!*
!***********************************************************************
!
externalroutine  mp(string (255) parms)
integer  flag,conad,lineno,address,from,to,dummy
integername  w
record (rf) rr
string (31) file
string (255) s,s1,s2,s3
!
setpar(parms)
if  parmap # 1 then  start 
   flag = 263;                          ! Wrong number of parameters
   -> err
finish 
!
file = spar(1)
connect(file,3,0,0,rr,flag)
-> err if  flag # 0
!
conad = rr_conad + rr_datastart
!
prompt("Alter: ")
lineno = 0
cycle 
   readline(s) until  s # ""
   exit  if  s = ".END"
   lineno = lineno + 1
   unless  s -> s1.(",").s2.(",").s3 then  start 
      printstring("Warning - line ".itos(lineno)." has invalid format".snl)
      continue 
   finish 
   !
   conv(s1,lineno,1,address,flag)
   continue  if  flag # 0
   conv(s2,lineno,2,from,flag)
   continue  if  flag # 0
   conv(s3,lineno,3,to,flag)
   continue  if  flag # 0
   !
   w == integer(conad+address)
   unless  w = from then  start 
      printstring("Warning - line ".itos(lineno)." - old value is X".htos(w,8).", not X".htos(from,8)." as expected".snl)
      continue 
   finish 
   w = to
repeat 
!
disconnect(file,flag)
printstring("Finished".snl)
set return code(0)
return 
!
err:
disconnect(file,dummy)
printstring(snl."MP fails -".failuremessage(flag))
set return code(flag)
stop 
end ;   ! of mp
endoffile