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