<> <> <> <> <<>> <> <<>> 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.