// IfsMemoryError.bcpl -- Main memory single-error reporting (Alto-II only) // Copyright Xerox Corporation 1981 // Last modified October 4, 1981 4:17 PM by Taft get "Ifs.decl" get "IfsSystemInfo.decl" get "AltoDefs.d" external [ // outgoing procedures InitMemoryError; RecordMemoryError; PrintMemoryErrors // incoming procedures VFileReadPage; VFileWritePage; LockCell; UnlockCell Ws; PutTemplate; Plural; Zero // outgoing statics // incoming statics infoVMD; AltoVersion; dsp ] structure ME: // memory errors, recorded in mePage of <System>Info [ numErrors word numBadSyndrome word errors↑0,0: [ location word = [ card byte; chip byte ] errorCount word ] ] structure MESR: [ hamming bit 6 parityError bit parity bit syndrome bit 6 bank bit 2 ] structure Bytes↑0,0 byte manifest [ maxErrors = (1 lshift logStdPageLength - offset ME.errors/16) / ((size ME.errors↑0)/16) ] //---------------------------------------------------------------------------- let InitMemoryError() be //---------------------------------------------------------------------------- [ let me = VFileWritePage(infoVMD, mePage) Zero(me, (offset ME.errors↑0)/16) @MESR = 0 // reset error latches ] //---------------------------------------------------------------------------- and RecordMemoryError() be //---------------------------------------------------------------------------- // Records a memory error that has occurred, and resets the error latches. [ let syndromeMapping = table [ 38 lshift 8 + 37; 36 lshift 8 + 255; 35 lshift 8 + 255; 18 lshift 8 + 255 34 lshift 8 + 29; 14 lshift 8 + 255; 7 lshift 8 + 255; 22 lshift 8 + 255 33 lshift 8 + 27; 12 lshift 8 + 255; 5 lshift 8 + 255; 20 lshift 8 + 255 2 lshift 8 + 31; 16 lshift 8 + 255; 9 lshift 8 + 255; 24 lshift 8 + 255 32 lshift 8 + 26; 11 lshift 8 + 255; 4 lshift 8 + 255; 19 lshift 8 + 255 1 lshift 8 + 30; 15 lshift 8 + 255; 8 lshift 8 + 255; 23 lshift 8 + 255 0 lshift 8 + 28; 13 lshift 8 + 255; 6 lshift 8 + 255; 21 lshift 8 + 255 3 lshift 8 + 255; 17 lshift 8 + 255; 10 lshift 8 + 255; 25 lshift 8 + 255 ] let me = VFileWritePage(infoVMD, mePage) let mesr = not @MESR // MESR reads out low-true let address = @MEAR let switch = utilIn>>UtilIn.memConfig let xm = AltoVersion<<VERS.eng eq 3 let bank = xm? mesr<<MESR.bank, 0 let bitNum = syndromeMapping>>Bytes↑(mesr<<MESR.syndrome) test bitNum eq 255 ifso me>>ME.numBadSyndrome = me>>ME.numBadSyndrome+1 ifnot [ if switch ne 0 then address = address xor 100000B let card = (bitNum & 3) +1 let chip = bitNum rshift 3 + 16 - ((bitNum & 4) ne 0? 5, 0) + 10*(address rshift (xm? 15, 13)) + bank*20 let location = card lshift 8 + chip let found = false for i = 0 to me>>ME.numErrors-1 do if location eq me>>ME.errors↑i.location then [ me>>ME.errors↑i.errorCount = me>>ME.errors↑i.errorCount+1 found = true break ] unless found % me>>ME.numErrors eq maxErrors do [ let i = me>>ME.numErrors me>>ME.errors↑i.location = location me>>ME.errors↑i.errorCount = 1 me>>ME.numErrors = i+1 ] ] @MESR = 0 // reset error latches ] //---------------------------------------------------------------------------- and PrintMemoryErrors() be //---------------------------------------------------------------------------- [ let me = VFileReadPage(infoVMD, mePage) LockCell(lv me) if me>>ME.numErrors ne 0 then [ Ws("*n*nMain memory errors:*nCard Chip Errors") for i = 0 to me>>ME.numErrors-1 do PutTemplate(dsp, "*n$3D$6D$7UD", me>>ME.errors↑i.card, me>>ME.errors↑i.chip, me>>ME.errors↑i.errorCount) ] if me>>ME.numBadSyndrome ne 0 then PutTemplate(dsp, "*n*n$UD main memory error$S with bad syndrome.", me>>ME.numBadSyndrome, Plural(me>>ME.numBadSyndrome)) UnlockCell(lv me) ]