DIRECTORY Basics USING [ LowByte, DoubleShiftRight ], DoveInputOutput USING [ Noop, Peek, Poke ], SparcSoftcardInit, PrincOps USING [ PageNumber, RealPageNumber, wordsPerPage ], SparcSoftcard, SparcSoftcardMap; SparcSoftcardInitImpl: PROGRAM IMPORTS Basics, DoveInputOutput, SparcSoftcardMap EXPORTS SparcSoftcardInit ~ { OPEN SparcSoftcard; PeekAtByteAd: PROC [byteAd: CARD32] RETURNS [content: CARD16] ~ { wordAd: CARD32 _ Basics.DoubleShiftRight[[lc [byteAd]], 1].lc; content _ DoveInputOutput.Peek[wordAd]; }; PokeAtByteAd: PROC [byteAd: CARD32, content: CARD16] ~ { wordAd: CARD32 _ Basics.DoubleShiftRight[[lc [byteAd]], 1].lc; DoveInputOutput.Poke[wordAd, content]; }; PeekPokePeekRestore: PROC [ byteAddress0: CARD32, content: CARD16, byteAddress1: CARD32 ] RETURNS [ lowByte: BYTE ] ~ { word0: CARD16 ~ PeekAtByteAd[byteAddress0]; PokeAtByteAd[byteAddress0, content]; { word1: CARD16 ~ PeekAtByteAd[byteAddress1]; lowByte _ Basics.LowByte[word1]; }; PokeAtByteAd[byteAddress0, word0]; }; SoftcardPresent: PUBLIC PROC RETURNS [ present: BOOL ] ~ { magic: BYTE ~ 05Ah; -- Arbitrary constant magicNot: BYTE ~ 0A5h; -- Another arbitrary constant value: BYTE ~ PeekPokePeekRestore[tRegisterByte, magic, tRegisterAlternateByte]; valueNot: BYTE ~ PeekPokePeekRestore[tRegisterAlternateByte, magicNot, tRegisterByte]; present _ (value=magic) AND (valueNot=magicNot); }; InitializeCPandIOPMaps: PUBLIC PROC ~ { iOPEntry, cPEntry: SparcSoftcardMap.MapEntry; iOPEntry.vMSpace.name _ iOP; cPEntry.vMSpace.name _ cP; iOPEntry.virtualAddressByte _ cedarMemoryExtensionBaseByte; iOPEntry.realAddressByte _ 0; cPEntry.virtualAddressByte _ cedarMemoryExtensionBaseByte; cPEntry.realAddressByte _ 0; FOR i: INT IN [0..cedarMemoryExtensionSizeByte/softcardPageSizeByte) DO SparcSoftcardMap.WriteMapEntry[iOPEntry]; iOPEntry.virtualAddressByte _ iOPEntry.virtualAddressByte + softcardPageSizeByte; iOPEntry.realAddressByte _ iOPEntry.realAddressByte+softcardPageSizeByte; SparcSoftcardMap.WriteMapEntry[cPEntry]; cPEntry.virtualAddressByte _ cPEntry.virtualAddressByte+softcardPageSizeByte; cPEntry.realAddressByte _ cPEntry.realAddressByte+softcardPageSizeByte; ENDLOOP; }; InsertSoftcardPhysicalMemory: PUBLIC PROC [ reclaim: PROC [ PrincOps.RealPageNumber ] ] ~ { startingPage: NAT ~ cedarMemoryExtensionBaseByte / (2*PrincOps.wordsPerPage); endingPage: NAT ~ (cedarMemoryExtensionBaseByte+cedarMemoryExtensionSizeByte) / (2*PrincOps.wordsPerPage); FOR p: PrincOps.PageNumber IN [startingPage..endingPage) DO reclaim[p]; ENDLOOP; }; InitializeSoftcard: PUBLIC PROC [ reclaim: PROC [ real: PrincOps.RealPageNumber ] ] ~ { IF ( NOT SoftcardPresent[] ) THEN RETURN; InitializeCPandIOPMaps[]; InsertSoftcardPhysicalMemory[reclaim]; DoveInputOutput.Noop[]; }; ResetSoftcard: PUBLIC PROC ~ { IF ( NOT SoftcardPresent[] ) THEN RETURN; InitializeCPandIOPMaps[]; DoveInputOutput.Noop[]; }; }. rSparcSoftcardInitImpl.Mesa Copyright Σ 1988 by Xerox Corporation. All rights reserved. Christophe Cuenod, September 12, 1988 9:35:17 am PDT Bill Jackson (bj) April 19, 1988 3:34:37 am PDT Christian Le Cocq November 1, 1988 3:53:19 pm PST Private procs Public procs start memory at 1.5 meg in Daybreak adress space end memory at 3.5 meg in Daybreak adress space Κˆ˜code•Mark outsideHeaderšœ™Kšœ<™Kšœ'˜'K˜K˜—š‘ œœ œ œ˜8Kšœœ0˜>Kšœ&˜&K˜K˜—š‘œœœ œœœ œ˜wKšœœ˜,Kšœ$˜$˜Kšœœ˜+Kšœ ˜ K˜—Kšœ"˜"K˜——šŸ Ÿ™ š ‘œœœœ œ˜:Kšœœ Οc˜)Kšœ œ ’˜4KšœœE˜PKšœ œH˜VKšœœ˜1K˜K˜—š‘œœœ˜'Kšœ-˜-K˜Kšœ˜Kšœ˜K˜Kšœ;˜;Kšœ˜Kšœ:˜:Kšœ˜K˜šœœœ8˜GKšœ)˜)KšœQ˜QKšœI˜IKšœ(˜(KšœM˜MKšœG˜GKšœ˜—Kšœ˜K˜—š‘œœœ œ"˜[šœœ=˜NKšœ0™0—šœ œ\˜kKšœ.™.—šœœ˜;Kšœ ˜ Kšœ˜—K˜K˜—š‘œœœ œ(˜WKšœœœœ˜)Kšœ˜Kšœ&˜&Kšœ˜Kšœ˜K˜—š‘ œœœ˜Kšœœœœ˜)Kšœ˜Kšœ˜Kšœ˜K˜—Kšœ˜K˜——…— NH