!***********************************************************************
!*
!* 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