DIRECTORY Basics, PrincOps, SparcSoftcard, SoftcardBDVM, SoftcardBDVMCheck, SoftcardBDVMPrivate, SparcSoftcardMap; SoftcardBDVMImpl: CEDAR MONITOR IMPORTS SparcSoftcardMap, SoftcardBDVMCheck, SoftcardBDVMPrivate EXPORTS SoftcardBDVM ~ BEGIN softcardPage: CARD32 = SparcSoftcard.softcardPageSizeByte; Address: TYPE ~ SoftcardBDVM.Address; debug: BOOLEAN _ FALSE; AssignBDVM: PUBLIC PROC [realAddressByte, byteSize: CARD32] RETURNS [translationBase: CARD32] ~ TRUSTED { virtualAddressByte: CARD32 _ SoftcardBDVMPrivate.firstBDRealAd; pageRealAd: CARD32 _ (realAddressByte/softcardPage)*softcardPage; --Round it lastRealAd: CARD32 _ realAddressByte+byteSize; nPages: CARD32 _ (lastRealAd-pageRealAd)/softcardPage; IF nPages*softcardPage#(lastRealAd-pageRealAd) THEN nPages _ nPages+1; IF nPages*softcardPage>SoftcardBDVMPrivate.maxBDVMBytes THEN ERROR; translationBase _ pageRealAd; IF debug THEN SoftcardBDVMCheck.Check[]; THROUGH [0..nPages) DO mapEntry: SparcSoftcardMap.MapEntry _ [ flags: [], vMSpace: [name: cP], virtualAddressByte: virtualAddressByte, realAddressByte: pageRealAd ]; SparcSoftcardMap.WriteMapEntry[mapEntry]; virtualAddressByte _ virtualAddressByte+softcardPage; pageRealAd _ pageRealAd+softcardPage; ENDLOOP; IF debug THEN SoftcardBDVMCheck.Check[]; }; RealFromAddress: PUBLIC PROC [address: Address] RETURNS [realAddress: CARD32] ~ { roundAd: CARD32 _ ((2*address.a)/softcardPage)*softcardPage; leftOver: CARD32 _ 2*address.a-roundAd; mapEntry: SparcSoftcardMap.MapEntry _ [ flags: [], vMSpace: [name: cP], virtualAddressByte: roundAd, realAddressByte: 0 ]; TRUSTED {mapEntry _ SparcSoftcardMap.ReadMapEntry[mapEntry]}; realAddress _ mapEntry.realAddressByte+leftOver; }; DoWithTranslation: PUBLIC ENTRY PROC [realAddressByte, byteSize: CARD32, action: PROC[Basics.UnsafeBlock]] ~ { ENABLE UNWIND => NULL; firstPageRealAd: CARD32 _ (realAddressByte/softcardPage)*softcardPage; --Round it firstPageOffset: CARD32 _ realAddressByte-firstPageRealAd; totalSize: CARD32 _ firstPageOffset+byteSize; chunk: CARD32 _ MIN[totalSize, SoftcardBDVMPrivate.maxBDVMBytes]-firstPageOffset; WHILE byteSize>0 DO translationBase: CARD32 _ AssignBDVM[realAddressByte, chunk]; action[[SoftcardBDVMPrivate.firstBDVMAd, realAddressByte-translationBase, chunk]]; byteSize _ byteSize - chunk; realAddressByte _ realAddressByte+chunk; chunk _ MIN[byteSize, SoftcardBDVMPrivate.maxBDVMBytes]; ENDLOOP; }; END. &SoftcardBDVMImpl.mesa Copyright Σ 1988 by Xerox Corporation. All rights reserved. Ch. Le Cocq, October 26, 1988 Christian Le Cocq December 7, 1988 2:04:47 pm PST Allocation and mapping of the Softcard backdoor memory. a real address for the 6085 is a virtual address for the softcard. Κε˜code•Mark outsideHeaderšœ™Kšœ<™˜Qšœ ˜Kšœœ&˜=KšœR˜RKšœ˜Kšœ(˜(Kšœœ-˜8Kšœ˜—K˜——K˜Kšœ˜—…— n y