Rapunzel: PROGRAM 2200 VERSION 4 = BEGIN Short: TYPE = CARDINAL; Long: TYPE = LONG CARDINAL; SeqShort: TYPE = SEQUENCE OF Short; SeqLong: TYPE = SEQUENCE OF Long; Address: TYPE = LONG CARDINAL; PeekShortCmd: TYPE = RECORD [address: Address]; PokeShortCmd: TYPE = RECORD [address: Address, value: Short]; PokeLongCmd: TYPE = RECORD [address: Address, value: Long]; ShftReadCmd: TYPE = RECORD [address: Address, numRepeats: Short]; ShftWriteCmd: TYPE = RECORD [address: Address, numRepeats: Short]; ReturnLengthCmd: TYPE = RECORD [returnLength: Short]; -- ignored if not the first Cmd OpCode: TYPE = { peekShort(0), pokeShort(1), pokeLong(2), shftRead(3), shftWrite(4), returnLength(5) }; Cmd: TYPE = CHOICE OpCode OF { peekShort => PeekShortCmd, pokeShort => PokeShortCmd, pokeLong => PokeLongCmd, shftRead => ShftReadCmd, shftWrite => ShftWriteCmd, returnLength => ReturnLengthCmd }; SeqCmd: TYPE = SEQUENCE OF Cmd; PeekShortResult: TYPE = RECORD [value: Short]; PokeShortResult: TYPE = RECORD []; PokeLongResult: TYPE = RECORD []; ShftReadResult: TYPE = RECORD [numRepeats: Short]; ShftWriteResult: TYPE = RECORD [numRepeats: Short]; ReturnLengthResult: TYPE = RECORD []; -- actually nothing returned Result: TYPE = CHOICE OpCode OF { peekShort => PeekShortResult, pokeShort => PokeShortResult, pokeLong => PokeLongResult, shftRead => ShftReadResult, shftWrite => ShftWriteResult, returnLength => ReturnLengthResult }; SeqResult: TYPE = SEQUENCE OF Result; Fault: ERROR [code: FaultCode, address: Address] = 0; FaultCode: TYPE = { nonexistent(1), -- the referenced memory location does not exist protection(2), -- access denied (can't happen with Softcard?) alignmentShort(3), -- alignment error for Short (can't happen with 6085) alignmentLong(4) -- alignment error for Long }; PeekShort: PROCEDURE [address: Address] RETURNS [result: Short] REPORTS [Fault] = 1; PokeShort: PROCEDURE [address: Address, value: Short] REPORTS [Fault] = 3; PeekSeqShort: PROCEDURE [address: Address, count: CARDINAL] RETURNS [resultSeq: SeqShort] REPORTS [Fault] = 4; PeekSeqLong: PROCEDURE [address: Address, count: CARDINAL] RETURNS [resultSeq: SeqLong] REPORTS [Fault] = 5; PokeSeqShort: PROCEDURE [address: Address, valueSeq: SeqShort] REPORTS [Fault] = 6; PeekLong: PROCEDURE [address: Address] RETURNS [result: Long] REPORTS [Fault] = 7; PokeLong: PROCEDURE [address: Address, value: Long] REPORTS [Fault] = 8; DoCmds: PROCEDURE [cmdSeq: SeqCmd] RETURNS [resultSeq: SeqResult] REPORTS [Fault] = 9; SetShftAddrs: PROCEDURE[shftA, shftB: Address] REPORTS [Fault] = 10; WriteSequential: PROCEDURE[startingAddress: Address, count: CARDINAL, seq: SeqLong] REPORTS [Fault] = 11; END. ¦Rapunzel4.cr Copyright Σ 1986, 1987 by Xerox Corporation. All rights reserved. Demers, September 18, 1986 5:39:53 pm PDT Willie-Sue, April 9, 1987 4:57:59 pm PDT Introduction This package provides generic remote peek and poke operations for 16-bit and 32-bit entities. It also provides specialized operations that are useful to the Softcard Word Order: For either Short (n = 16) or Long (n = 32), an n-bit number on the source machine is mapped to (the same) n-bit number in standard representation on the wire, which is mapped to (the same) n-bit number on the target machine. Types Errors Procedures Procedure 0 is reserved for address lookup - not used at the moment Κ_˜šœ ™ IcodešœB™BK™)K™(—J˜šΟnœΟkœžœ˜ Jšœž˜head™ Iblockšœ%ΠeiœΟiœ+™]M™HMš œ œ œ  œ: œR œ"™μ—šœ™Jšœžœžœ˜Jšœžœžœžœ˜J˜Jšœ žœžœžœ˜#Jšœ žœžœžœ˜!J˜Jšœ žœžœžœ˜J˜Jšœžœžœ˜/Jšœžœžœ"˜=Jšœ žœžœ!˜;Jšœ žœžœ'˜AJšœžœžœ'˜BJšœžœžœΟc˜UJ˜šœžœ˜Jšœ(˜(Jšœ˜Jšœ˜Jšœ˜—J˜šœžœžœžœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœžœžœžœ˜J˜Jšœžœžœ˜.Jšœžœžœ˜"Jšœžœžœ˜!Jšœžœžœ˜2Jšœžœžœ˜3Jšœžœžœ‘˜BJ˜šœžœžœžœ˜!Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ"˜"Jšœ˜—Jšœ žœžœžœ˜%—™Kšœžœ)˜5šœ žœ˜Kšœ‘0˜@Kšœ‘.˜=Kšœ‘5˜HKšœ‘˜,Kšœ˜—J˜—™ K™CK˜š œž œ˜'Kšžœ˜Kšžœ˜K˜K˜—š œž œ!˜5Kšžœ˜K˜—K˜š œž œžœ˜;Kšžœ˜Kšžœ˜K˜K˜—š œž œžœ˜:Kšžœ˜Kšžœ˜K˜K˜—š œž œ'˜>Kšžœ˜K˜—K˜šœž œ˜&Kšžœ˜Kšžœ˜K˜K˜—šœž œ ˜3Kšžœ˜K˜K˜—šœž œ˜"Kšžœ˜Kšžœ˜˜K˜——š œž œ˜.Kšžœ˜K˜K˜—šœž œ"žœ˜SKšžœ˜K˜—K˜—Kšžœ˜—J˜J˜J˜—…— „‰