DIRECTORY Basics USING [Card32FromF, HighHalf, LowHalf, Card16FromH, HighByte], DoveInputOutput USING [Peek, Poke], SoftcardUtil; SoftcardUtilImpl: CEDAR PROGRAM IMPORTS Basics, DoveInputOutput EXPORTS SoftcardUtil ~ BEGIN Address: TYPE ~ SoftcardUtil.Address; Error: PUBLIC ERROR ~ CODE; FillZones: PUBLIC PROC [base: Address, len: CARD32, w: UNSPECIFIED _ 0] ~ { FOR i: CARD32 IN [0..len) DO DoveInputOutput.Poke[base.a+i, w]; ENDLOOP; }; GetCard32: PUBLIC PROC [base: Address] RETURNS [val: CARD32] ~ { val _ Basics.Card32FromF[[hi: LOOPHOLE[DoveInputOutput.Peek[base.a]], lo: LOOPHOLE[DoveInputOutput.Peek[base.a+1]]]]; }; PutCard32: PUBLIC PROC [base: Address, val: CARD32] ~ { DoveInputOutput.Poke[base.a, Basics.HighHalf[val]]; DoveInputOutput.Poke[base.a+1, Basics.LowHalf[val]]; }; CopyTo: PUBLIC PROC [from: REF TEXT, start, len: CARD32, base: Address] ~ { wordLen: CARD32 _ len/2; IF len=0 THEN RETURN; IF start MOD 2#0 THEN Error; IF wordLen>0 THEN TRUSTED { p: LONG POINTER TO UNSPECIFIED _ LOOPHOLE[from, LONG POINTER TO UNSPECIFIED]+SIZE[TEXT[start]]; --@from.text[start]]; limit: LONG POINTER TO UNSPECIFIED _ p+wordLen*SIZE[UNSPECIFIED]; b: CARD32 _ base.a; DO DoveInputOutput.Poke[b, p^]; b _ b+1; p _ p+SIZE[UNSPECIFIED]; IF p=limit THEN EXIT; ENDLOOP; }; IF len MOD 2#0 THEN { w: CARD16 _ Basics.Card16FromH[[hi: LOOPHOLE[from.text[start+len-1]], lo: 0 ]]; DoveInputOutput.Poke[base.a+wordLen, w]; }; }; CopyFrom: PUBLIC PROC [to: REF TEXT, start, len: CARD32, base: Address] ~ { wordLen: CARD32 _ len/2; IF len=0 THEN RETURN; IF start MOD 2#0 THEN Error; IF wordLen>0 THEN TRUSTED { p: LONG POINTER TO UNSPECIFIED _ LOOPHOLE[to, LONG POINTER TO UNSPECIFIED]+SIZE[TEXT[start]]; --@from.text[start]]; limit: LONG POINTER TO UNSPECIFIED _ p+wordLen*SIZE[UNSPECIFIED]; b: CARD32 _ base.a; DO p^ _ DoveInputOutput.Peek[b]; b _ b+1; p _ p+SIZE[UNSPECIFIED]; IF p=limit THEN EXIT; ENDLOOP; }; IF len MOD 2#0 THEN { w: CARD16 _ DoveInputOutput.Peek[base.a+wordLen]; to.text[start+len-1] _ LOOPHOLE[Basics.HighByte[w]]; }; }; END. ξSoftcardUtilImpl.mesa Copyright Σ 1987 by Xerox Corporation. All rights reserved. written by Ch. Le Cocq, August 4, 1988 Christian Le Cocq October 10, 1988 10:56:52 am PDT Low level communication between CP (6085 mesa processor) and Sparc, assuming Big [Big Endian] byte order (hh, hl, lh, ll) which is not the PrincOps CARD32 byte order (lh, ll, hh, hl). the buffer is supposed to be aligned on a word (16b) boundary. the buffer is supposed to be aligned on a word (16b) boundary. Κκ˜code•Mark outsideHeaderšœ™Kšœ<™—šžœ žœžœ˜Kšœžœžœžœž œžœžœžœžœž œžœžœ Οc˜uKš œžœžœžœž œ žœž œ˜AKšœžœ ˜šžœ˜Kšœ˜K˜Kšœžœž œ˜Kšžœ žœžœ˜Kšžœ˜—K˜—šžœžœžœ˜Kšœžœžœ#˜OKšœ(˜(K˜—K˜K™—š  œžœžœžœžœžœ˜KKšœ ž œ˜Kšžœžœžœ˜šžœžœžœ˜K™>—šžœ žœžœ˜Kšœžœžœžœž œžœžœžœžœž œžœžœ ‘˜sKš œžœžœžœž œ žœž œ˜AKšœžœ ˜šžœ˜Jšœ˜K˜Kšœžœž œ˜Kšžœ žœžœ˜Kšžœ˜—K˜—šžœžœžœ˜Kšœžœ(˜1Kšœžœ˜4K˜—K˜K™——Kšžœ˜—…— ή