From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=BAYES_00,INVALID_DATE autolearn=no autolearn_force=no version=3.4.4 Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!csd4.milw.wisc.edu!bionet!apple!motcsd!hpda!hpcuhb!hpcllla!hpclisp!hpcljms!brians From: brians@hpcljms.HP.COM (Brian Sullivan) Newsgroups: comp.lang.ada Subject: Re: Memory Access Question Message-ID: <920013@hpcljms.HP.COM> Date: 29 Jul 89 00:00:49 GMT References: <18800002@ucf-cs.ucf.edu> Organization: Hewlett-Packard Calif. Language Lab List-Id: It is possible to use UNCHECKED_CONVERSION to provide access memory locations. The following Ada package will allows you to read and write to memory locations. The file depends on the existence of a predefined integer type that is the same size as SYSTEM.ADDRESS, and the SYSTEM.ADDRESS is of the same size as a pointer or access object. ------------------------------------------------------------------------ with SYSTEM; package MEMORY is -- -- The predefined integer type used for the type ADDR_INT -- must be the same size in bits as the type SYSTEM.ADDRESS -- because unchecked conversion is used to convert ADDR_INT -- into SYSTEM.ADDRESS -- -- Also the size of an access type must be the same as the -- size of SYSTEM.ADDRESS -- -- These two requirements are automatically check in the -- elaboration code for the body of this package. -- type ADDR_INT is new INTEGER; type DATUM is range 0 .. (2**SYSTEM.STORAGE_UNIT)-1; function READ ( FROM : ADDR_INT ) return DATUM; procedure WRITE( TO : ADDR_INT; VALUE : DATUM); function CONVERT_TO_ADDR_INT( LOC : SYSTEM.ADDRESS) return ADDR_INT; private pragma INLINE(READ); pragma INLINE(WRITE); pragma INLINE(CONVERT_TO_ADDR_INT); for DATUM'SIZE use SYSTEM.STORAGE_UNIT; end MEMORY; with UNCHECKED_CONVERSION; package body MEMORY is type DATUM_PTR is access DATUM; function CONVERT_TO_DATUM_PTR is new UNCHECKED_CONVERSION( SOURCE => ADDR_INT, TARGET => DATUM_PTR); pragma INLINE(CONVERT_TO_DATUM_PTR); function LOCAL_CONVERT_TO_ADDR_INT is new UNCHECKED_CONVERSION( SOURCE => SYSTEM.ADDRESS, TARGET => ADDR_INT); pragma INLINE(LOCAL_CONVERT_TO_ADDR_INT); function READ ( FROM : ADDR_INT ) return DATUM is begin return CONVERT_TO_DATUM_PTR(FROM).all; end; procedure WRITE( TO : ADDR_INT; VALUE : DATUM) is begin CONVERT_TO_DATUM_PTR(TO).all := VALUE; end; function CONVERT_TO_ADDR_INT( LOC : SYSTEM.ADDRESS) return ADDR_INT is begin return LOCAL_CONVERT_TO_ADDR_INT(LOC); end; begin if ADDR_INT'SIZE /= SYSTEM.ADDRESS'SIZE then raise PROGRAM_ERROR; end if; if DATUM_PTR'SIZE /= SYSTEM.ADDRESS'SIZE then raise PROGRAM_ERROR; end if; end MEMORY;