CA2122255C - Stereotactic mammography imaging system with prone position examination table and ccd imaging system - Google Patents

Stereotactic mammography imaging system with prone position examination table and ccd imaging system

Info

Publication number
CA2122255C
CA2122255C CA002122255A CA2122255A CA2122255C CA 2122255 C CA2122255 C CA 2122255C CA 002122255 A CA002122255 A CA 002122255A CA 2122255 A CA2122255 A CA 2122255A CA 2122255 C CA2122255 C CA 2122255C
Authority
CA
Canada
Prior art keywords
patient
breast
platform
ray
arm
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CA002122255A
Other languages
French (fr)
Other versions
CA2122255A1 (en
Inventor
Anthony J. Pellegrino
Milton Stoller
Kenneth F. De Freitas
David D. Camarra
Anthony M. Scandura
Richard F. Schutz
Jeffrey R. Storm
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Trex Medical Corp
Original Assignee
Thermotrex Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Thermotrex Corp filed Critical Thermotrex Corp
Publication of CA2122255A1 publication Critical patent/CA2122255A1/en
Application granted granted Critical
Publication of CA2122255C publication Critical patent/CA2122255C/en
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Classifications

    • AHUMAN NECESSITIES
    • A61MEDICAL OR VETERINARY SCIENCE; HYGIENE
    • A61BDIAGNOSIS; SURGERY; IDENTIFICATION
    • A61B6/00Apparatus for radiation diagnosis, e.g. combined with radiation therapy equipment
    • A61B6/04Positioning of patients; Tiltable beds or the like
    • AHUMAN NECESSITIES
    • A61MEDICAL OR VETERINARY SCIENCE; HYGIENE
    • A61BDIAGNOSIS; SURGERY; IDENTIFICATION
    • A61B6/00Apparatus for radiation diagnosis, e.g. combined with radiation therapy equipment
    • A61B6/50Clinical applications
    • A61B6/502Clinical applications involving diagnosis of breast, i.e. mammography
    • AHUMAN NECESSITIES
    • A61MEDICAL OR VETERINARY SCIENCE; HYGIENE
    • A61BDIAGNOSIS; SURGERY; IDENTIFICATION
    • A61B6/00Apparatus for radiation diagnosis, e.g. combined with radiation therapy equipment
    • A61B6/04Positioning of patients; Tiltable beds or the like
    • A61B6/0407Supports, e.g. tables or beds, for the body or parts of the body
    • A61B6/0414Supports, e.g. tables or beds, for the body or parts of the body with compression means
    • AHUMAN NECESSITIES
    • A61MEDICAL OR VETERINARY SCIENCE; HYGIENE
    • A61BDIAGNOSIS; SURGERY; IDENTIFICATION
    • A61B6/00Apparatus for radiation diagnosis, e.g. combined with radiation therapy equipment
    • A61B6/04Positioning of patients; Tiltable beds or the like
    • A61B6/0407Supports, e.g. tables or beds, for the body or parts of the body
    • A61B6/0435Supports, e.g. tables or beds, for the body or parts of the body with means for imaging suspended breasts
    • AHUMAN NECESSITIES
    • A61MEDICAL OR VETERINARY SCIENCE; HYGIENE
    • A61BDIAGNOSIS; SURGERY; IDENTIFICATION
    • A61B90/00Instruments, implements or accessories specially adapted for surgery or diagnosis and not covered by any of the groups A61B1/00 - A61B50/00, e.g. for luxation treatment or for protecting wound edges
    • A61B90/10Instruments, implements or accessories specially adapted for surgery or diagnosis and not covered by any of the groups A61B1/00 - A61B50/00, e.g. for luxation treatment or for protecting wound edges for stereotaxic surgery, e.g. frame-based stereotaxis
    • AHUMAN NECESSITIES
    • A61MEDICAL OR VETERINARY SCIENCE; HYGIENE
    • A61BDIAGNOSIS; SURGERY; IDENTIFICATION
    • A61B90/00Instruments, implements or accessories specially adapted for surgery or diagnosis and not covered by any of the groups A61B1/00 - A61B50/00, e.g. for luxation treatment or for protecting wound edges
    • A61B90/10Instruments, implements or accessories specially adapted for surgery or diagnosis and not covered by any of the groups A61B1/00 - A61B50/00, e.g. for luxation treatment or for protecting wound edges for stereotaxic surgery, e.g. frame-based stereotaxis
    • A61B90/11Instruments, implements or accessories specially adapted for surgery or diagnosis and not covered by any of the groups A61B1/00 - A61B50/00, e.g. for luxation treatment or for protecting wound edges for stereotaxic surgery, e.g. frame-based stereotaxis with guides for needles or instruments, e.g. arcuate slides or ball joints
    • AHUMAN NECESSITIES
    • A61MEDICAL OR VETERINARY SCIENCE; HYGIENE
    • A61BDIAGNOSIS; SURGERY; IDENTIFICATION
    • A61B90/00Instruments, implements or accessories specially adapted for surgery or diagnosis and not covered by any of the groups A61B1/00 - A61B50/00, e.g. for luxation treatment or for protecting wound edges
    • A61B90/10Instruments, implements or accessories specially adapted for surgery or diagnosis and not covered by any of the groups A61B1/00 - A61B50/00, e.g. for luxation treatment or for protecting wound edges for stereotaxic surgery, e.g. frame-based stereotaxis
    • A61B90/14Fixators for body parts, e.g. skull clamps; Constructional details of fixators, e.g. pins
    • A61B90/17Fixators for body parts, e.g. skull clamps; Constructional details of fixators, e.g. pins for soft tissue, e.g. breast-holding devices
    • AHUMAN NECESSITIES
    • A61MEDICAL OR VETERINARY SCIENCE; HYGIENE
    • A61BDIAGNOSIS; SURGERY; IDENTIFICATION
    • A61B10/00Other methods or instruments for diagnosis, e.g. instruments for taking a cell sample, for biopsy, for vaccination diagnosis; Sex determination; Ovulation-period determination; Throat striking implements
    • A61B10/02Instruments for taking cell samples or for biopsy
    • A61B10/0233Pointed or sharp biopsy instruments
    • AHUMAN NECESSITIES
    • A61MEDICAL OR VETERINARY SCIENCE; HYGIENE
    • A61BDIAGNOSIS; SURGERY; IDENTIFICATION
    • A61B6/00Apparatus for radiation diagnosis, e.g. combined with radiation therapy equipment
    • A61B6/44Constructional features of apparatus for radiation diagnosis
    • A61B6/4488Means for cooling

Abstract

An elongated prone patient-supporting examining table (43) for X-ray mammography is centrally supported at variable heights by a rear pedestal. The table is provided with a central breast-receiving aperture (35) through which the patient's pendulant breast is exposed to a horizontal beam of X-rays from a tube head source (280) mounted on an arm angularly movable through an arc of some 210.degree. centered on the patient's breast. Diagnosis of suspect lesions and fine needle biopsy are both facilitated by stereotactic examination. Digital imaging using a CCD camera (36) and image enhancement software provides magnification, contrast enhancement, window and level manipulation and high resolution images, with low exposure levels, short exposure times, and greatly reduced imaging times.

Description

STEREOTACTIC MAMMOGRAPHY IMAGING SYSTEM WITH PRONE POSITION
EXAMINATION TABLE AND CCD IMAGING SYSTEM

This invention relates to a patient-supporting table and associated equipment for X-ray mammography and stereotactic needle biopsy of breast tiscue suspected to contain lesions requiring radiographic evaluation.

~elated Art Since the publication of an article entitled 'Stereotaxic Instrument for Needle Biopsy of the Mamma' by Jan Bolmgren et al, published in the American Journal of Roentgenology ~ol. 129, Page 121 in July 1977, needle biopsy of breast lesions to ,min;m~ ze unn~Cc~y surgical invasion of the patient's tissue has achieved increasing acceptance.
Gui~c~ of the biopsy needle by stereotactic X-ray exposures traditionally re~uired development of the two X-ray film images and their comparison to det~r;ne the X, Y
and Z coordinates of the lesion in question. Insertion of CA 021222~ 1998-09-10 the biopsy needle via a carefully placed needle guide directed toward the lesion site could be verified only by additional stereo X-ray film exposures.
Mammograms made while the patient sits erect before the X-ray equipment may introduce unavoidable patient movement and resulting inaccuracy, while conventional tables supporting the patient in the prone position with the breast depending through a suitable aperture in the table generally require a patient's arms to be raised, tensing arm muscles, straining or distorting the breast tissue and again introducing inaccuracies. In addition, relatively flat and rigid tables often impose undue stress and discomfort on the patient's joints and vertebra, inducing undesired restless movements.
SummarY of the Invention The unique prone position mammography tables of the present invention provide comfortable support for the prone patient, with a front edge portion being removable, permitting the patient's arm and shoulder to be lowered to more normal positions and thus minimizing patient discomfort and involuntary movements, leaving the patient normally relaxed during the procedure. In addition, a central concave torso depression formed in these tables exposes the maximum volume of breast tissue for X-ray examination.

~93/11706 PCT/US92/10327 ~ ~ 2 ~

Furthermore, the central concave torso depression encircling the breast-receiving aperture is positioned at the center of a longer-than-normal table having an ext~n~hle fo~LLe~L at each end, which is ~ Led by a rear pedestal opposite the removable front edge portion.
The X-ray tube and the biopsy needle guide are thus afforded ~cc~s to the patient's p~ nt breast from all pQ~C~hle angles, over a range of more than 360~.
With this invention, accurate r~ nt of the biop~y ~Ale is further A~-h;~ved via electronic i~-_in~ o~
the ~i n~--~ X-rayed u~ ; ng charge ~onrl e~ devices or CCDs, with computer ~nh~ncement software de~igned to increase t~e sharpness of ~Vl-LL~t ~et e~. portion~ of the image most ~nA~tive o~ part1~-~A~ 1~ stru~u~_ of ~
int~rest. This CCD-hAr~~ imaging system offers such adv~.t _~_ in v;r~li7-~tion and differentiation of no~r~l r~hl e lesions that ~ol.LL~st ~ ution and system sensitivity ~ F l that avAil~le wit~ conven~i~n~l screen or ~ilm X-ray mammuy~hy, often permitting ~f;nitive ~ ~ Aqn~Q~ ~ 0~ equivocal f~ nA i ngq without the need ~or h~rcy Vi~ 7~tion c~r~hilities are further increased by ele_Lr~l.ic image pL~ s;ng ~ec~n~ques to ~nh~n~
c~..LLasts. Delays in film development and evaluation are eli~minated by the systems o~ the ~sent invention, WO93/11706 PCT/US92/10327 ~

providing virtually instant confirmation of proper biopsy needle placement, reducing patient discomfort during this critical phase of the ~,~ e.
This virtually real time imaging of the steleoLactic X-ray images, and their computer ~~h~nccment~
are prefera~ly facilitated by an optical system inte in the position normally o~ied by the X-ray film cassette. This preferred optical system employs a rh~~rhor screen ~ to the arriving X-rays passing through the breast ~n~, and the image created on the pho~rho~ screen by the arriving X-rays is reflected by a mirror surface provided by a rell~cle reflector, comprising an ~xL emely thin sheet of select optical grade niLro~ellulose, on the order of five to nine microns in ~h ~ f ' - ~ stretched like a drumhead over a hl~ok A~oA~7 d ~lat metal fra~e and h~nA~
to the precision l ~rre~ edge of the frame. The X-radiation r~ directly ~,ro~h this thin ~ilm to the rhG ~
~e~l, while the visible light image of the ,~ screen i5 reflected from the film's underside directly toward the camera lens, due to a reflective coating of metallic material such as aluminu~ silicate, deposited on the underside o~ the thin film. Suitable coatings ~ Gd~-e up to nearly sixty percent reflectance, ~ n~ng upon wavelength. In a preferred embodiment, a ~onA flat mirror ~293/l1706 PCT/US92/10327 _ 212~2~.3 ~urface redirects the re~lected image, thereby producing a _ rAçt ~olded optical 8y8tem ~l~ve..iently enclosed in a light-tight hou~ing G~ ~ ng very l~ttle more ~p~ae than .Lional X-ray film r~ttes and ~o~1~tea film holder stru~Lu~e_. The preferred camera i5 Peltier cooled, and ~ o.~aLes a rectangular CCD format with one ~hQ~ n~ or more pixels along each orthogonal edge.
The com~ortable table for ~u~ Ling the patient in ~he prone position with minimum distortion of normal breast configuration ~,~olr ates with the ~te~ ~t~c X-ray pro~ection ~ystem mounted directly under the tablQ~ When desired, the folded CC~ imaging system r~pl A~C the normal X-ray film cassette, and the unique software ~.1~ the c~l~Ll~st and sharpness of the resulting virtually real time image. Preferably the ima~e le__~Lor and the X-ray tube are mounted on the ~ame angularly movable C-arm, a~fiuring that the X-ray image is always ~e ~ ~ to the optic axis of the arriving X-rays. This permits a bucky grid to have all of its grid rl~c permanently aligned with the X-ray fiource, minimizing lateral ~catter radiation a~d pro~n~-~ ng X-ray images of maximum fiha~ D and clarity.
These ~or~ts of the inve~tion all combine to ~ e a highly use~ul prone patient ~ l~v~Ling table ~or X-ray mammo~l,y and an e~fective stereotactic mammography W093/11706 PCT/US92/10327 ~

system serving to minimize patient ~i~ fort and trauma while permitting highly precise location and needle biopsy of ~ ~l~Led breast lesions, avoiding invasive surgery in a large number of cases.
Thus, a principal ob~ect of the ~.~ ~nt invention is to provide highly precise ~ammGy~hy systems providing uniquely a~Le images of the observed breast stru~Lul~e-of the patient.
Another object of the invention is to provide such systems il.~GL~L~ing prone patient ~l~tling tables designed to e~. ~ the breast for mammGy~ic examination while also assuring its undistorted orientation and the optimum comfort and relnxation for the patient during the ~1'~1 ~ ~ r e.
Still another object of the invention is to provide such syst~m~ with the capability ~or a~Le n~ of n~le biopsy ~L.,cel~ employing virtually real time electronic imaging and needle placement verification, eliminating delays for film cassette lo~ing, ch~n~-ng, unlo~ng, developing and evaluation.
A further ob~ect of the invention is to provide such systems which are c~r~h~e of ~tereotactic imaging of the maximum volume of the patient's breast ~;~fi"~ to provide three dimensional location of in~n~l lesions or other in~rn~l sites requiring surgical examination.

~ ~ ~225~

A still further object of the invention is to provide folded CCD optical systems taking advantage of large CCD
devices to provide extremely high resolution images of the patient tissue sites under study.
Another object of the invention is to provide digital X-ray image processing techniques using window and level manipulation, region of interest analy~is, filters and edge enhancement, providing definitive X-ray diagnosis in many cases.
lo According to the present invention, there is provided an X-ray table assembly for supporting a female patient in a prone position for mammography procedures, comprising:
- a base having a front portion and a rear portion, - a rear pedestal upstanding from the rear portion of said base, - a substantially flat and horizontal patient-supporting platform which is supported cantilever-fashion from a rear longitudinal edge by said rear pedestal, having a free unsupported front edge, a right end, a left end, and a concavely-dished shallow torso-receiving recess extending across its central portion from said pedestal to said front edge, - means centrally positioned in said platform recess, mid-way between said right end and said left end, forming an open breast-receiving aperture for pendulant presentation of the patient's breast therethrough below the level of the platform, whether the patient's head is positioned to the right or to the left of said aperture, - means forming wide shallow right and left underside recesses in said platform flanking said breast-receiving aperture and said shallow torso-receiving recess, - a C-arm pivotally mounted on the pedestal beneath the platform for angular movement about a vertical pivot axis aligned with said aperture and having a near end supporting an image receptor, and a remote end supporting an X-ray tubehead forming an X-ray source, said C-arm being dimensioned for ~ 1~
, .

~ 2 ~ ~ 5 pivotal movement through a wide arc of more than 180~ around the breast-receiving aperture, positioning the x-ray source in any of an infinite number of source positions ranging from the direction of one end of said platform through a lateral position remote from said rear pedestal to the direction of the other end of said platform, with the tubehead having an upper end positionable in either of said shallow underside recesses above the level of said breast-receiving aperture, thereby facilitating X-ray source positioning around more than a 360~
lo range of positions, with the patient's head positioned toward either the right end or the left end of the platform, - a fixed compression plate independent of said C-arm, positioned under said platform near said vertical pivot axis for gentle abutting contact with the patient's presented breast, - a movable compression paddle positioned under said ~ platform near said first compression plate for gentle clamping of said presented breast between said compression plate and said paddle independent of said pivotally mounted C-arm, and - X-ray responsive image-forming means mounted on said image receptor.
According to the present invention, there is also provided an X-ray table assembly for supporting a female patient in a prone position for mammography procedures, comprising:
- a base having a front portion and a rear portion, - a rear pedestal upstanding from said rear portion of the base, - a substantially flat, horizontal r elongated patient-supporting platform which is centrally supported cantilever-fashion from a rear longitudinal edge by said rear pedestal and having a free unsupported front edge, and unsupported right and left lateral ends, - means centrally positioned in said platform between said ends, forming an open breast-receiving aperture for pendulant presentation of the patient's breast therethrough lD

~ 2 11 ~
below the level of the platform, - a C-arm having a remote end supporting an X-ray tubehead forming an X-ray source, and a near end supporting an image receptor, pivotally mounted on the rear pedestal beneath the platform for angular movement through an angular range of more than 180~ about a vertical pivot axis aligned with said aperture positioning the X-ray source in any of an infinite number of source positions ranging from the direction of one end of said platform through a lateral position remote from lo said rear pedestal to the direction of the other end of said platform, thereby facilitating X-ray source positioning around more than a 360~ range of positions, with the patient's head positioned toward either the right end or the left end of the platform, - a fixed compression plate independent of said C-arm, positioned under said platform near said vertical pivot axis for gentle abutting contact with the patient's presented breast, a movable compression paddle independent of said C-arm, positioned under said platform near said first compression plate for gentle clamping of said presented breast between said compression plate and said paddle independent of said pivotally mounted C-arm, and - X-ray responsive image-forming means mounted on said image receptor, - whereby free access is provided for attending personnel to the upper, the lateral and the lower surfaces of the patient's pendulant breast over a range of more than 180~, unimpeded by the rear supporting pedestal.
According to the present invention, there is also provided an X-ray table assembly for supporting a female patient in a prone position for mammography procedures, comprising:
- a base, - a pedestal upstanding from said base, - a substantially flat and horizontal patient-supporting platform which is supported cantilever-fashion from 7b ~' ,. ~

~ 2 2 5 ~ ~
a rear longitudinal edge by said pedestal and having a free unsupported front edge, - means centrally positioned in ~aid platform forming an open breast-receiving aperture for pendulant presentation of the patient's breast therethrough below the level of the platform, - a C-arm pivotally mounted on the pedestal beneath the platform for angular movement about a vertical pivot axis aligned with said aperture and having a remote end supporting an X-ray tubehead forming an X-ray source, and a near end supporting an image receptor, - a fixed compression plate positioned under said platform near said vertical pivot axis for gentle abutting contact with the patient's presented breast, - a movable compression paddle positioned under said platform near said first compression plate for gentle clamping of said pre~ented breast between said compre6~ion plates independent of said pivotally mounted c-arm, and - X-ray responsive image-forming means mounted on said image receptor, including a charge coupled device (CCD) camera for converting visible light into an electronic signal, a phosphor plate producing on its proximal surface a visible light image in response to arriving X-radiation impinging thereon, light-directing means positioned to direct said phosphor plate's proximal surface visible light image toward the CCD camera, computing means connected to the CCD camera for receipt of its electronic signal and for producing an imaging signal representative of at least a portion of the received CCD
camera electronic signal, and means connected to the computer imaging signal, for displaying the imaging signal, - wherein the light-directing means is a diagonally positioned X-ray transparent pellicle mirror interposed in the path of said arriving X-radiation, with its undersurface positioned to reflect said phosphor plate's image toward the CCD camera, and wherein the phosphor plate, the pellicle mirror and the CCD camera are all enclosed in a compact light-tight 2 ~ S 5 ~
.

optical system housing positioned closely adjacent to said clamping plates.
According to the present invention, there is also provided a compact CCD imaging assembly for converting arriving X-radiation to a digital image signal output, comprising:
- a hollow camera housing positioned in the path of the arriving X-radi.ation and having an X-ray transparent wall member presented to receive and transmit the ar~iving X-radiation to the interior of the housing, - a phosphor plate positioned inside the housing in the path of the arriving X-radiation, producing on its proximal surface a visible light image corresponding to the intensity variations exhibited by the arriving X-radiation, - a light pellicle film diagonally positioned between the transparent wall member and the phosphor plate, substantially transparent to X-radiation and having its underside bearing a thin reflective coating, and - a CCD camera aligned to receive visible light produced by said phosphor plate and reflected by said reflective coating.
According to the present invention, there is also provided an X-ray table assembly for supporting a female patient in a prone position for mammography procedures, comprising:
- a base having a front portion and rear portion, - a rear pedestal upstanding from said rear portion of the base, - a substantially flat, horizontal, elongated patient-supporting platform which is centrally supported cantilever-fashion from a rear longitudinal edge by said rear pedestal and having a free unsupported front edge, and unsupported right and left lateral ends, - means centrally positioned in said platform between said ends, forming an open breast-receiving aperture for pendulant presentation of the patient's breast therethrough below the level of the platform, 7d ~.

5 ~ i - a C-arm having a remote and supporting an X-ray tubehead forming an X-ray source, and a near end supporting an image receptor, pivotally mounted on the rear pedestal beneath the platform for angular movement through an angular range of more than 180~ about a vertical pivot axis aligned with said aperture, positioning the x-ray source in any of an infinite number of source positions ranging from the direction of one end of said platform through a lateral position remote from said rear pedestal to the direction of the other end of said platform, thereby facilitating X-ray source positioning around more than a 360~ range of positions, with the patient's head positioned toward either the right end or the le~t end of the platform, - a fixed compression plate independent of said C-arm, positioned under said platform near said vertical pivot axis for gentle abutting contact with the patient's presented breast, - a movable compression paddle independent of said c-arm, positioned under said platform near said first compression plate for gentle clamping of said presented breast between said compression plate and said paddle independent of said pivotally mounted C-arm, and - X-ray responsive image-forming means mounted on said image receptor, - with the central part of the free unsupported front edge of the patient-supporting platform being formed as a detachable segment, removable from the platform to provide a cutaway bight near said aperture accommodating the patient's arm in a comfortable relaxed position, whereby the patient's presented breast is freely pendulant in an undistorted position beneath the platform, whereby free access is provided for attending personnel to the upper, the lateral and the lower surfaces of the patient's pendulant breast over a range of more than 180~, unimpeded by the rear supporting pedestal.
According to the present invention, there is also 7e ~ ~ 2 ~ ~ 5 5 ?

provided a stereotactic mammographic biopsy apparatus for performing stereotactically guided biopsy localization comprising:
- a base;
- a pedestal extending upwardly from the base;
- an imaging arm pivotally mounted to the pedestal, the imaging arm having a near end supporting an image receptor responsive to X-ray exposure and a remote end supporting an X-ray source having an X-ray focal point, wherein the imaging arm is pivotally mounted to the pedestal at a point between the near end and the remote end;
- a compression arm pivotally mounted to the pedestal, the compres~ion arm having a near end and a remote end, wherein the compression arm is pivotally mounted to the pedestal at a point between its near end and its remote end and wherein the pivot point o~ the compression arm is axially aligned with the pivot point of the imaging arm;
- a first compression plate slidably attached to the compression arm at its near end, wherein the first compres6ion plate is slidable along the compression arm from the near end of the compression arm to the remote end of the compression arm;
- a carriage slidably attached to the compression arm, wherein the carriage is slidable along the compression arm from the near end of the compression arm to the remote end of arm and wherein the carriage is positioned between the remote end and the first compression plate;
- a second compression plate supported by the carriage; and - a multi-dimensionally positionable biopsy needle guide supported by the carriage.
According to the present invention, there is also provided a stereotactic mammographic biopsy apparatus for per~orming stereotactically guided biopsy localization comprising:
- a base;

7f , ~ ' ~ 2 ~ 5 - a pedestal extending upwardly from the base;
- an imaging arm pivotally mounted to the pedestal, the imaging arm having a near end and a remote end, wherein the imaging arm is pivotally mounted to the pedestal at a point between the near end and the remote end;
- an image forming means including a charge coupled device (CCD) array for converting X-rays impinging on the image ~orming means into an array of electronic signals represen-tative of the intensity and location of the impinging X-rays, lo wherein the image forming means is supported by the imaging arm at its near end;
- an X-ray source having a focal point, wherein the x-ray source is supported by the imaging arm at its remote end and wherein the focal point of the x-ray source is directed at the image forming means;
- a compression arm pivotally mounted to the pedestal, the compression arm having a near end and a remote end, wherein the compression arm is pivotally mounted to the pedestal at a point between its near end and its remote end and wherein the pivot point of the compression arm is axially aligned with the pivot point of the imaging arm;
- a first compression plate slidably attached to the compression arm, wherein the first compression plate is slidable along the compression arm from the near end of the compression arm to the remote end of the compression arm;
- a carriage slidably attached to the compression arm, wherein the carriage is slidable along the compression arm from the near end of the compression arm to the remote end of the compression arm and wherein the carriage is positioned between the remote end and the first compression plate;
- a second compression plate supported by the carriage;
- a display means for receiving the array of electrical signals from the CCD and for displaying at least a portion of the array of electrical signals; and - a multi-dimensionally positionable biopsy needle 7g ~ ~ '' ~.

O ~ 2 ~ ~ 5 guide supported by the carriage.
According to the present invention, there is also provided a patient-supporting table for a prone stereo-tactic X-ray guided mammographic biopsy apparatus, the table comprising:
- a platform further including a breast-receiving aperture permitting pendulant presentation of a patient's breast therethrough, wherein the breast-receiving aperture i~
positioned on the platform so as to divide the platform into a lo first supporting portion and a second supporting portion, whereby the first supporting portion of the plat~orm enables the patient's breast to be pendulantly presented in a first orientation with respect to a stereotactic imaging means, compression means and biopsy needle guiding means of the apparatus when the patient is positioned and supported on the first supporting portion of the platform, and whereby the second supporting portion of the platform enables the patient's breast to be pendulantly presented in a second orientation with respect to the stereotactic imaging means, compression means and biopsy needle guiding means of the apparatus when the patient is positioned and supported on the second supporting portion of the platform.
According to the present invention, there is also provided a prone stereotactic mammographic biopsy apparatus for performing stereo.tactic x-ray guided breast biopsies comprising:
- a base;
- a pedestal extending upwardly from the base;
- a patient-supporting platform supported by the pedestal, the patient supporting platform further including a breast-receiving aperture permitting pendulant presentation of a patient's breast therethrough, wherein the breast-receiving aperture is positioned on the patient-supporting platform so as to divide the patient-supporting platform into a first supporting portion and a second supporting portion;
- a positionable ledge extending outwardly from the . ~ i, . ~

~ 5 ~
pedestal below the patient-supporting platform;
- means for obtaining stereotactic X-ray images of the patient's breast pendulantly presented through the breast-receiving aperture in the patient-supporting platform, the means being supported by the positionable ledge;
- means for compressing the pendulantly presented breast, the means being supported by the positionable ledge;
and - means for guiding a biopsy needle into the pendulantly presented and compressed breastj the means being supported by the posionable ledge;
whereby the patient's breast may be pendulantly presented through the aperture in a first orientation with respect to the means for obtaining stereotactic x-ray images, means for compressing the breast and means for guiding a biopsy needle by positioning and supporting the patient on the first supporting portion, and whereby the patient's breast may be pendulantly presented through the aperture in a second orientation with respect to the means for obtaining stereotactic X-ray images, means for compressing the breast and means for guiding a biopsy needle by positioning and supporting the patient on the second supporting portion.
According to the present invention, there is also provided a method for using a patient-supporting table for a prone stereotactic X-ray mammographic guided biopsy apparatus comprising a platform further including a breast-receiving aperture permitting pendulant presentation of a patient's breast therethrough, wherein the breast-receiving aperture is positioned on the platform so as to divide the platform into a first supporting portion and a second supporting portion, whereby the first supporting portion of the platform enables the patient's breast to be pendulantly presented in a first orientation with respect to a stereotactic imaging means, compression means and biopsy needle guiding means of the apparatus when the patient is positioned and supported on the first supporting portion of the platform, and whereby the ~ _~
...
r ~ ~ 22~5~

second supporting portion of the platform enables the patient's breast to be pendulantly presented in a second orientation with respect to the stereotactic imaging means, compression means and biopsy needle guiding means of the apparatus when the patient is positioned and supported on the second supporting portion of the platform;
the method comprising the steps of:
(a) determining the approximate location of a suspicious lesion in a patient's breast;
(b) determining whether the first orientation or the eecond orientation of the pendulantly presented breast provides the minimum path length for a biopsy needle, guided by the biopsy needle guiding means, to access the approximate location of the suspicious lesion as determined in step (a); and (c) positioning the patient:
(1) so as to be supported by the first supporting portion of the patient-supporting table to present the breast in the first orientation if the first orientation of the pendulantly presented breast is determined, in step (b), to provide the minimum path length for the biopsy needle, or (2) so as to be supported by the second supporting portion of the patient-supporting table to present the breast in the second orientation if the second orientation of the pendulantly presented breast is determined, in step (b), to provide the minimum path length for the biopsy needle.
According to the present invention, there is also provided a method for using a prone stereotactic mammographic biopsy apparatus for performing stereotactic X-ray guided breast biopsies comprising:
- a base;
- a pedestal extending upwardly from the base;
- a patient-supporting platform supported by the pedestal, the patient supporting platform further including a breast-receiving aperture permitting pendulant presentation of a patient's breast therethrough, wherein the breast-receiving aperture is positioned on the patient-supporting platform so as 1~
r 5 ~

to divide the patient-supporting platform into a first supporting portion and a second supporting portion;
- a positionable ledge extending outwardly from the pedestal below the patient-supporting base;
- means for obtaining stereotactic X-ray images of the patient's breast pendulantly presented through the breast-receiving aperture in the patient-supporting platform, the means being supported by the positionable ledge;
- means for compressing the pendulantly presented breast, the means being supported by the positionable ledge;
and - means for guiding a biopsy needle into the pendulantly presented and compressed breast, the means being supported by the positionable ledge;
whereby the patient's breast may be pendulantly presented through the aperture in a first orientation with respect to the means for obtaining stereotactic X-ray images, means for compressing the breast and means for guiding a biopsy needle by positioning and supporting the patient on the first supporting portion, and whereby the patient's breast may be pendulantly presented through the aperture in a second orientation with respect to the means for obtaining stereotactic X-ray images, means for compressing the breast and means for guiding a biopsy needle by positioning and supporting the patient on the second supporting portion;
the method comprising the steps of:
(a) determining the approximate location of a suspicious lesion in a patient's breast;
(b) determining whether the first orientation or the second orientation of the pendulantly presented breast provides the minimum path length for a biopsy needle, guided by the biopsy needle guiding means, to access the approximate location of the suspicious lesion as determined in step (a); and (c) positioning the patient:
~ (1) so as to be supported by the first supporting portion of the patient-supporting table to present 7k ~'~
L'~

o the breast in the first orientation if the first orientation of the pendulantly presented breast is determined, in step (b), to provide the minimum path length for the biopsy needle, or t2) so as to be supported by the second supporting portion of the patient-supporting table to present the breast in the second orientation if the second orientation of the pendulantly presented breast is determined, in step (b), to provide the minimum path length for the biopsy needle;
(d) compressing the pendulantly presented breast so as to obtain a compressed pendulantly presented breast;
(e) imaging the compressed pendulantly presented breast so as to obtain stereotactic images of the suspicious lesion therein;
(f) determining the three dimensional location of the suspicious lesion from the stereotactic images thereof obtained in step (e) ; and (g) inserting a biopsy needle into the compressed pendulantly presented breast at the three dimensional location determined in step (f) so as to obtain a sample of breast tissue.
Other objects of the invention will in part be obvious and will in part appear hereinafter.
The invention accordingly comprises the features of construction, combinations of elements, and arrangements of parts which will be exemplified in the constructions hereinafter set forth, and the scope of the invention will be indicated in the claims.

The Drawinqs For a fuller understanding of the nature and objects of the invention, reference should be made to the following detailed description taken in connection with the accompanying drawings in which:
FIGURE 1 is a top perspective view of the prone patient supporting mammography table of the present invention;

.= ~W

.. - ~ 3/11706 PCT/US92/1032 ~
~2~5~

FIGURE 2 is an end perspective view of the same table showing the base, pedestal and angularly movable C-arm carrying the X-ray tube and the image receptor, as well as the separate compression ar~ carrying compression plates and nee~le guide;
FIGURE 3 i~ a front elevation view of the came table ~o~Ling a ~ C female patient at maximum elevatlon above the floor, delivering X-radiation to the underside o~
the breast, toward the table's right end;
~ IGURE 4 is a schematic top plan view of the table showing the range of X-ray tube positions 2ade possible by the rear pedestal ~o.._LL~ction of the unit;
FIGURE S is a top plan view of the tnble of ~,u~ 1-3, with the C-arm positioned ~or delivering X-radiation ~rom the side o~ the patien~:
FIGUR~ 6 is a sche~atic fro~t elevation view of the came table, with the C-ar~ positioned for delivering X-radiation toward the table's left end, FIGURES 7A, 7B and 7C are ~o~l~~rQnAin~ ~n~ ve ~ra~mentary top plan schematic ViQWs showing the com~ n arm carrying the brQast compre~i~ plates and needle guiae in a fixed position h~n~~th the table~ while the underly~ng C-arm carrying the X-ray tube and image ~e~e~or is moved to different angular positions;

. . . ; ~
., ~,C~93/11706 PCT/US92/10327 '7 FIGURE 8 is a schematic diagram o~ the stereotactic , aphy pr~e~e o~ this invention, ~ ing the X-radiation paths through a suspect lesion and a reference point on the compr~ci n~ plate for two angularly off~et tnh~h~ ~r~e positions, when the image ~e~_~Lor pivots with the ~-lh~h--~ on the C-arm;
FIGUR~ 9 is a fragmentary enlarged ~ -tic diagram showing the lower end of ~IG~RE 8 in more detail;
FIGURE lO is a schematic diagram of the two images pro~1~D~ at the image L~_ _~Lor by X-radiation ~rom the same two source positions;
FIGURES ll and 12 are ~ - h ~ - - tic diagrams of the X-radiation paths for two angularly o~f~et stereo t~h~~~
~v~a positions ut~ ~g a f~l~ CCD optical imaging system inserted in the position or~r~ by the X-ray ~il~
cas~ette in film mammo~hy but with the digital CCD
optical imaging system of FIGURES 13-17 pivoting with the t~h~h~, ~ l~UK~ 13 is a top plan sch~atic view of the conventio~l stete~L~ctic mamm~y ~p~y ~,o~ e performed on prior art devices, showing the X-radiation arri~ing at signi~icant angles o~ inC-l~n~tion ~ro~ the ~elL~
inL~ucing undesired ~m~ge degradation, when ~he image receptor is sta~; on~y, -7 ~ PCT/US92/10327 FIGURE 14 is a schematic diagram illustrating the stereotactic images.employea to identify the coordinates of the target lesion with the imaging system of FIGURE 13;
FIGURE 15 is a perspective top view of the folded optical system employed in the stereotactic CCD imaging system of FIGURES 11 and 12, with a portion of the light-tight ho ~C~ e~ to reveal the location of the various compc-~..Ls of the optical ~ystem;
FIGURE 16 is a top plan view of the thin film r~ e mirror employed in the optical system of FIGURE 15;
FIGURE 17 is an edge elevation view of the same r~ 1 e mirror;
FIGURE 18 is a schematic diagram showing the imaging of the patient's com~L.~ breast on a ~
plate in the optical system delivering a f~r~ image to the CCD ~ncQ~ and the ~ v~e~ing of the CCD v~L~L ~i~nAl~
LLlv~h the image ~nh~naement computer to the monitor screen l~y.
FIGURE 19 is a detailed schematic diagram of a preferred form of CCD camera e~ployed in the optical system of FIGURE 15.
FIGURE 20 is an overall block diagram of the system electronics used to ~o..velL the digital information from the CCD camera into mammcy.~ .;a ~i~rl~y information as presented on the monitor driven by an ~c~ociated computer.

93/11706 ~ 1~ 2 ~ PCT/US92/10327 FIGURE 21 is a detail block diagram of the digital col.L.~1 logic module shown in FIGURE 20.
FIGURE 22 is a detail block diagram of the analog signal pro~o~ module shown in FIGURE zo.
FIGURE 23 is an overall diag~ammatic view of the CCD camera and its A~; Ated electronics, and FIGURE 24 is a diagram illustrating the number of pixels of an overall typical image which have par~
lum~ n~ values.

Best Mode for ~ArrYina Out the Tnvent-~on -~h~e~ pr~n~r~l component~ or sub-assemblie~ are i,.~ ~vl~ted in the preferred .~ i~e~ts of the ~ ~ -~t invention. These are the ad~ustable a~d ~ aLile ~v..e patient ~ Ling table shown in FIGU~ES 1-7C, the novel CCD i~aging fol~ optical system ~hown in FIGURES ll, 12 and 15-17, and the image ~nh~nG~ment and data ~i~rl ~y monitor systems providing high resolution and nearly real time image ~; ~rl ~ys in the systems of ~he invention as illustrated sahema~; CA 11y in FIGURE 18.
Patient ~ or~ing t_ble 21 comprises platform 22 on which the patient rests in a prone position, ~ Led by a rear pedestal 23 upst~n~i n~ from the rear portion of a ~2~5 0 base 24, all as shown in FIGURE 1. Pedestal 23 preferably in~o ~o~tes table elevating ~An~ to raise and lower the table within limits for convenience of the patient and att~nAtng per~nn~l.
~ l~Ll~ding forward over the lower part of base 24 from the front face of pedestal 23 is a ledge 26 sturdily constructed to provide underlying .~ L for an angularly movable ~C-arm~ 27. ~rm 27 is ~hApeA like a letter C lying on its back, with one ups~AnA~ng end mounting the X-ray source or mammcy ~pl,~ unit tube head 28. The pivot axis 29, about which C-arm 27 is mounted for angular rotation relative to ledge 26, is close to the ~rro~te upg~nA~ng end of the C-arm 27, and this ~ ng end inwl~L~Les either X-ray ~ilm cassette 31 or CCD ~n~o~ folded optical system 32 enclosed in a light-tight housing and shown schematically in FIGUR~S 11 and 12, and in the ~~~e~Live top view of FIGURE 15.
As ~nA~ted in FIGURES 1-3, the u~eL portion 33 of peaestal 23 .~u~L ~ing the table platform 22 at its upper end and the ledge 26 at its lower end is ~nr~le o~ vertical downward movement from the r~i~A position shown in FIGURE 3 to a l~r~ed position in which the ledge 26 is close to base 24, shown in FIGURE 1. This vertical adjustment motion is provided by telescoping upper pedestal portion 33 over the underlying lower pedestal portion 34 shown in FIGURE 3.

~ 93/11706 PCT/US92/10327 2~222~ .

Further adjustability of the s~stem is provided by separate vertical ad;ustment of ledge 26 relative to u~e~
pedestal 33.
Ideally, the upp~ - L position 28A Of ~h~he~ 28 places it within the underside ~e~e~:s 49 formed in table platform 22 (FIGURE 3) with the orroC~te end of the C-arm 27 co~prising the image l~e_~Lor 36, carrying either the X-r~y film cassette 31 or the optical system 32, preferably being closely positioned ad~acent the under~ide of table 22 as ~hown in FIGURE 3, in order to bring ~he X-ray beam and the image ~e~Lor as close as po~hle to the chest wall of the patient lying prone, face down on platform 22.
As shown in FT~R~ 1, 4 and 5, a ~-L-~l a~elLu~e 37 is provided in the ~LLa1 portion of platform 22 accommodating one or both of the female patient's breast~ ;
~ ng therethrough as the patient lies face down on plaLfoLm 22. Since image ~e~Lor 36 is relatively thin, as shown in FI~uK~S 3 and 5, and is positioned close to the pivot axis 29 about which the C-arm moves angularly, the pivoting movement of C-arm 27 about nxis 29 allows the i~age ~ Lor 36 to be positioned L~ the patient's brea~ts, or against the underside of either breast, by making minor adjustments in the position o~ axis 29 relative to ledge 26~

W093/11706 PCT/US92/10327~
;S

A fixed compression plate S3 and a compression paddle 38 movable toward and away from plate 53 are mounted above the C-arm 27 on an i~A~r~ntly pivoted compression arm 50. Compression paddle 38 may be considered a biopsy compression device, since it il-~V~ ~0 ates both a trAn,r~ent portion permitting X-rays to pass th~ough it toward the patient's breast and image le_~LoL 36, and a ~L~&l needle access a~,Lu~. The com~e__ion arm 50 al80 in~,~Les me~h~n~m for at~nh~n~ a needle guide 39 for performing a needle biopsy without releasing the breast from the compression plate, thereby assuring that the target lesion coordinates determined by the original stereotactic measure~ents will be main~n-~ upon insertion of the needle to reach the same target lesion coordinates.
The pre~erred form of table 22 shown in FIG~RES 1 ULh~yL 6 ~.~ ~o ~tes an additional useful feature, a ~ L~al ~..~ve torso depression 35 ~u~lo! ling the c~l~
a~elL~e 37- D~e__ion 35 provides comfortable ~ ~r~ for the prone patient's head, ~h9~-1 A~8 and torso, with her hips and legs ext~nA~ng either to the right or to the left over the slightly h~gh~ end portions of table 22, wh~h ~ay also il.~ ~o~ate the fooLIe_L~ 43 and 44 if desired.
The central position of ape~Lu.e 37, and the fooL~e_Ls 43 and 44 at both ends of the ~u~o~L tables 22 or W~93/11706 2~ 1 2 ~ 3 PCI/US92/103:27 22A, provide double the 210~ range o~ available x-ray projection angles indicated in FIGURE 4, a range of some 420~. No conventional mammography tables are known to afford such a wide range of projection angles.
The slight elevation o~ the patient's hips by depression 35 maintains the - -1 r~l~Y~A curve of the patient'~ vertebra, while ~ ting the maximum ~QC~ihle volume of breast t;c~ through ~e~L~ e 37 for X-ray examination. In addition, the ~light elevation of the end~
o~ table 22 outside o~ the ~,Ll-l de~Le_~ion 35 provides the underside ~oe~ 49 encircling ~elLu~e 37, with vertical clearance for the ~e end of X-ray ~-h~h~ 28 under table 22. This permits the focal point source FP of X-radiation to be elevated to a level nearly in tangent co~nG~A~nc~ with the lower rim of ~e~Lu~e 37, providing desirable ~ e o~ the maximum volu~e o~ the patient's nt breast ~ ~ for examination.
The front edge of platform 22 h~ci ~ aperture 37, orrocite pedestal 23, is preferably fo~med as a removable panel 41, providing unimrD~A ~ce~C ~n~th platform 22 for the radiologist and ~n ~ n~, and permitting the patient' 8 arm to be lo~re~e~ th~ h the open space left by the removal of the panel 41 (FIGURE 4) bringing her ~o~
.. .

WO 93/11706 PCI'/US92/103270 X ~ ~

comfortably down toward the level of aperture 37 (FIGURE 3) and ; n i ; ~ ing any distortion or stret~-hi n~ of the breast p~n~ ant through aperture 37.
Different positions of ~he~ 28 prq~lls~ by angular movement of c-arm 27 are illustrated in FIG~RES 3-6, along the circular arcuate path 42 shown in FIGURE 4. In the outermost tubehead position 28B, shown in FIGURE 4 and FIGUR~ 5, X-radiation pro;ected toward axi~ 29 will approach a lesion from the lateral aspect of the right breast or the medial aspect of the left breast if the patient'~ head i~
positioned to the right on platform 22, as in FIGURE 3. The fGoL~c_L 43 at the left end of pl~L~ m 22 is preferably ext~nA~ to ~ L the patient's legs in this position, while the fo~L e_L 44 at the right end of pl~L~v-m 22 is preferably retracted toward the table end to the dash line position 44A shown in FIGUR~ 4. With the patient's head pl~ce~ to the left of axis 29 in FIG~R~ 4 and the LooL e_L
44 being ext~n~ to its ~ line position at the right end of platform 22, X-radiation from ~ h~ position 28B
ap~ oA~h~ the lateral a~e_L of the le~t breast or the medial aspect of the right breast. ~t either axial position, 28C near the right end of platform 22, or 28D near the left end of platform 22, the X-radiation appro~-he~ the breast from either above or below, with the image ~e~Lor ~ 93/11706 2 ~ 2 2 ~ ~ ~ PCT/US92/10327 36 being positioned on the opposite side of the breast andthe compression plate 53 and paddle 38 assuring that the patient is comfortably posi~;on~ with no risk o~ ~n~Yr~oted movement during the prs~ e.
In most cases, the ~--~h~A~ 28 delivering X-rayD
to the patient will be posi~ion~ at the patient'D head end of platform 22 with image receptor 36 and compression plate 53 being positioned on the underside of the r~n~ Ant brea~t and the compr~C~tQn paddle 38 being positioned on the upper side of the breast, both - ~ed on ~ _ e~sion arm 50, whiah also provideD ~L~ L for nee~le guide 39 from this u~eL~ide when required. However, the ~ ç of a ~ Qn near the underside o~ the breast may ; n~ te that the ~v~De orientation is preferred for minimum trauma, as ~nA~ted in FIGURE 3, with the needle guide 39 and compression paddle 38 h~; ng posi~; Q~ on the underside of the breast with the X-r~y ~-h~h~-~ 28 hei nq posi~;
beyond compression plate 53 on the upper side of the breast. In this position, the entry of the biopsy nee~l e via needle guide 39 at~h~ to co~pression paddle 38 into the underside of the breast t~ offers the ~inimum path length for ~c~e~c to the lesion, and this position may be preferred by many patients to assure that any needle scar will be on the underside of the breast where it is less easily observed.

~225~i Two additional tubehead positions 28E and 28F are also shown in FIGURE 4, these being respectively displaced angularly by approximately 15 degrees counterclockwise and 15 degrees clockwise, ~-h; Ch are typical angular ~i~rlAcements for stereotactic mammography. ~wever, lesser angular amounts, of lO d~ s for example, on each side of the longit~inAl axis 46 of platform 22 can be used i~
desired, to assure that the stereo-~orically displaced images both fall on the de~ired portion of the image ~e~Lor, whether it be X-ray film in a film cassette 31 or the ele~LLo"ic imaging optical system 32 illustrated in the figures. Stere_ - -~pic displacement of the ~ Lmage may place it near the periphery of the total image plane in par~i~-l A~ lesion orientations, and for this reason, a lesser stereo ~; ~r~ A~ement of the positions 28E and 28F may be indicated.
When the film ~ tte 31 is u~il; 7~ at the image receptor 36 in stereotactic mam~cy,~, the cassette~3l may be provided with a ~ilm position shift lever 47, shown in FIGURES 7A-7C, and movement of this lever ~hifts the film cassette position 80 that stereo ~o-- -es at plus 15 degrees and minus lS de~.ee_ angular ~i~pl~e~ent from axis 46 will be -Yr.~,~~~ side by side on the X-ray film. While the patient remains on platform 22 and the compr~i n~
paddle 38 ~ ~i n~ in position, the cassette may be removed W5~93/l1706 PCT/US92/10327 ~ 2122~

and the film developed and ~Y~ i~ed to provide actual coordinates of the target lesion for needle biopsy. When the needle guide 39 is placed in position and the needle is inserted into the predet~ ; n~ target ~ e location, a new film cassette 31 may be plA~e~ in position on receptor 36 and two more stereo mammogrA~C may be ~ade to assure that the tip of the ~e~le is at the desired location in the target lesion. Removal and development of this second cassette verifying the needle tip location thus permits any ~in 1 adjustments required, and the needle biopsy may then be completed i~mediately.
X-, Y- and Z- a_is i nA~Yi n~ of needle guide 39 relative to the patient's brea~t ~ is provided by lineA~ motorized adjustments mounted on an ;n~Yin~ carriage 45 ~ovably mounted on l;n~A~ bearings on the compression arm 50 pivoted on ledge 26 above pivoting ~lh~h~A~ C-arm 27. An ;n~Y;n~ knob 48 cooperating with a tLming belt or endless chain drive moves carriage 45 and compression paddle 38 into gentle compressive contact with the patient's breast 52, clamping it gently but firmly ~g~in~t the fixed breast comprec~1 ~n plate 53. If fine needle biopsy is re~uired, X, Y or Z ~,~L~ol knobs on carriage 45 permit the operator to position the needle guide 39, adjusted for biopsy as required by the lesion coordinates found by stereotactic X-ray observations.

For convenience of notation, the X - axis is horizontal, ext~nA i ~ toward pedestal 23; the Y-axis is vertical, ext~n~i n~ upward toward the patient, and the Z-axis extends horizontally, parallel to table platform 22, toward X-ray tubehead source 28. The ~pivot point~ where pivot axis 29 intersects the X-Z plane pA~c1 ng through source focal point FP, ic taken as the origin or zero-point for X, Y and 2 values.
When the ele~L ~.~ically ~h~nc~ CCD ~~n~
optical system 32 is employed in place of the film cassette 31, a much shorter time is required for completion of the entire ~ ~l..e. For example, the stereotactic ~ el ~e ~ust described with two X-ray ~ilm cassettes cu~tomarily takes between 20 and 70 ~inutes during which time the patient must ; n in the same position ~ace down on the ma~m~y ~p~y table. With the ele~L~onic imaging systems ~lc~L~o~dted in the preferred embodi~ents of the ~}. ~nt invention, the digital image data received and ~ ~ in the system shown schemat~c~lly in FIG~RE 18 i~e~lly permits the mammo~ ~p1~, the n~e~le placement, the X-ray verification of n~l e location and the needle biopsy all to be completed within a period of one to two minutes, and certainly within a period far less than the 20 to 70 minutes normally eXperience~ with customary X-ray film cassettes in W~93/11706 2 1 2 2 2 5 5 PCI'JUS92/10327 stereotactic -- -~. aphy. ~y minimizing the length of time a patient is required to remain in the same prone position~
the patient's comfort and also the patient~s relative immobility will be enh~nC~ ~ mi n; ;~ing ;n~o~acies which might be unavoidable if a patient were expected to lie Cti in the same position for a long period of time.
In addition to the very short time c~ ~med by needle or core biopsy ~o~Al~es when digital stereo CCD
imaging is employed, there is a further ; , lLant advantage achieved by the prone stereo - -_ aphy tables of this invention. As shown in FIGURE 4, table 22 projects forward and is ,~ v~Led cantilever-fA~iQ~ along its rear edge by rear pedestal 23. The wide clear open fipA~e under table 22 provides ample room for X-ray t~h~h~ 28 to move pivotally tl~u~h the ~nf~n~te range of positions including those shown in the FIGURES: left longi~A~n~l positions 28A or 28D (FIGS. 3, 4); stereo offset positions 28E or 28F (FIG.
4); lateral position 28B (FIGS. 4, 5) and right longitl~Ai position 28C (FIGS. 4, 6).
Thus ~or a patient lying with her feet on left fooL eDL 43, a range of 180~ + 15~ + 15~ or 210~ of right side ~--h~h~A~ positions are all available. If the same patient lies with her feet on right foo~e_L 44, the full range of 210~ of left side positions are equally available.

W093/1~7~0~ PCT/US92/10327 Thus for the same patient, not just a 360~ range but actually a 420~ range of tubehead posi~ions is readily available.
The ~gull-wing~ longi~ n~ 1 cross-section of table 22, best seen in FIGURES 3 and 6, with the shallow conical ~e.lL~al depression 35 ~o~ ;ng aperture 37, allows maximum patient comfort and eY~ellent posi~innin~ of the p~n~11lAnt breast to be examined, and also provides an added advantage over this entire 420~ range. This i~
h~n~ both slightly raised ~gull-wing~ ends of table 22 create underside rec~ 49 (FIGURES 2, 3 and 6), and X-ray Z8 can thus be moved pivotally around the entire front 210~ arcuate p OE iphery of aperture 37 with its upper end projecting into recess 49. The ~--h~h~ ~ 8 X-ray projection portal 55 (FIGURE l) positioned several i n~h~
below its uppermost end thus delivers its X-ray beam along a projection axis G = SID (FIGURE 8) passing through a pivot axis 29 and perp~~ ~ to image receptor 36, closely grazing the ~ e- rim of aperture 37. This permits the maximum volume of breast ~i~-1~ to be ~ nted for mammogrArhic examination over the infinite range of projection angles just deficribed~ with ample wo~ing space for radiologist and ~e~hni cians beneath table 22, as indicated in FIGURES 2 and 3, ~or example.

-~ 93/11706 2 ~ 2 2 2 ~ ~ PCT/US92/10327 Stereotactic Imaqinq Svstem Stereotactic imaging of breast tissue bypro3ecting X-rays through the patient's compressed breast from two different source positions to produce two stereo images on an X-ray film is disclosed in detail in the Bolmgren article, supra, from the American Journal of Roentgenology for July 1977 and also in United States Patent 4,727,565 to Ericson and 4,930,143 to Lundgren. Applicants' FIGURE 13 shows a s~-h -tic diagram of such prior art two-source-position stereotactic X-ray - -_ r aphy with a lesion 51 in the tissue of a patient's breast 52 compressed betw~en a fixed compression plate 53 and an adjustable compression paddle 38, both of which are transparent to X-rays.
When image receptor 36 is stationary, the fixed compression plate 53 preferably coi nci ~ with the position of image receptor 36 shown in FIGURE 13 and comprises the proximal surface of receptor 36.
When image receptor 36 of the present invention is mounted on the C-arm 27 for pivoting ~ovement with the X-xay tllh~h~ 28 source FP, as shown in FIGURES 2, 3 and 6-12, receptor 36 is spaced far enough behind pivot axis 29 to afford clearance for the desired angular pivoting motion.

.

21222~5 An additional advantage of the mounting of the image receptor on the C-arm arises from the usefl1l n~Sc of bucky grids with divergingly slanted vanes to pass direct X-radiation from the source FP while blocki n~ laterally scattered or ~?~n~y X-radiation ~-hirh would otherwise reduce image sharpness. When the bucky grid is mounted on the image receptor 36 pivoting with the tllh~h~A~ C-arm 27, its diverging vanes are ~ n~ with source FP in all of its adjusted stereo positions shown in FIGURES 7A and 7B. By ~"L ast, a stationary bucky mounted in front of the image plane in the prior art image ~ece~Lor o~ FIGURE 13 can have its vanes Ali~n~ with only one X-ray source point, interfering with ~ome of the desired direct X-radiation projected from other, offset source points and seriously r~t~-;n~ the bucky~s usefll nt-c~, The determination of X-, Y- and Z- coordinates of ~ ~c~ lesions is performed by calculating the equations of slope for the X-ray paths p~ci ng through the lesion and through a reference point 40 on the compression 38 to a first image plane for the first source position Sl or Z8E
(FI~K~S 4, 8) and for the ~econ~ source position S2 or 28F.
In FIG~RES 8, 9 and lO, the coordinates of the suspect lesion 51 are X, Y and Z. Points l and 2 are the Y

W~93/11706 PCT/US92/10327 -- 21222~

and X positions of the reference hole 40 image on the le~t image area in FIG~RE lO, pro~ when the source is at S2 or 28F. Points 3 and 4 are the X and Y positions of the hole 40 image on the right image area, ~ ~l..~A when the source is at Sl or 28E. Points 5 and 6 are the images of the s~p~ct lesion 51 in the two image areas of FIGURE lO.
This method is hA~ on f;nA;ng the equations of the ~wo 50 ~ to-image lines for the two lesion images.
The intersection of the two lines provides the X, Y and Z
coordinates, on the X-Y, Y-Z and X-Z planes.
Diagrammatic Figure 8 shows the X-Z plane as viewed from below. The pivot point, where the pivot axis 29 rA~ through the X-Z plane, serves as the zero point for both X and Z values, for analytical ~u~v_o~.
Diagram~atic Figure 9 is an enlarged view of the portion of the same diagram around the pivot point.
The source-to-image lines for the image created when the ~llh~h~AA source is in the left position (-15~), ;nA;c~ted by position Sl or 28E in the other figures is:

X - Xl = Z-Zl M~ Xl = -R; Zl = I
Z = distance from pivot point to lesion 2t 22255 C~Q-l] X = Z-I - R

ML = tan C = tan (105~ + arc tan M + ~) G .
= tan 105~ + M + B
l - tan 105~ x M + B

Where G = SID, the source-to-image distance M = distance from projected pivot point to compression reference hole 40 images E, F (see Figures 8, 9 and lO).
B = distance between reference image (point 3) and lesion image (point 6).
The source-to-image lines with the source in the right half (or ~15~) position S2 or 28F is:

X - Xl = Z - 7.1 Xl - R; Zl = I
MR
Z = pivot point to lesion l~Q-2] X z Z - I + R
MR
NR = tan D = tan (75~ - arc tan M - A) = tan 75~ - M - A
l + tan 75~ x ~ - A

A = distance between reference image (point 2) and lesion image (point 5).

~I~93/l1706 PCT/US92/10327 ~ 21222~5 Sol~ing for Z: [EQ.l] = [EQ.2]
Z - I - R = Z - I + R
ML MR
Z = 2R + I
, 1 -- 1 ~ ML NR , height (by similar methods using -lS~ image) Z () - Zl = MT (X - X1) MT = tan ( 105~ + arc tan M ) tan 105 + ~
1 - tan 105 x M
G

tan 105~ + M
Z () = R G ~ + I
1 - tan 105 x M
G ~
T~ciQn depth = 1 + I -- RMT + I J
, ~ N:l. MR ~

= 2R - RMT

Finding X:
(X + R) ML + I = (X + R) MR + I
~ XML + RML + I = XMR + RMR + I
X = -R (ML + MR) (ML - MR) W O 93/11706 PC~r/US92/10327 ~2~55 ~

Then Y:
X - Xl = Y - Yl Yl = Y(source) = O
X2 - Xl = Y2 - Yl Y2 is measured on film PT3 -PT6 (FIGURE 10) Y = (Y2 - Yl) (X - Xl) + Yl Xl = -R
(X2 - Xl) = Y2 (X - Xl) (X2 - Xl) = Y2 (X +
(X2 + R) X2 = (SID - FPD) sin 15~ + (M + B) cos 15~

See FIGURE 10 In FIGURES 8, 9 and 10, M = 1 (S - ~) R = FILM SHIFT (74.5 mm) G = SID (743.0 mm) FPD ~ FOCAL PT. - ~~ POINT (661.5 mm) R = FOCAL SHIFT = FPD sin 15~ (171.2 mm) I = FPD cos 15~
n;~ l Tmaqi n-r Svstem The pri~Ci r~ in~ern~l comrQ~~nts of the folded optical cystem 32 are ~hown schema~i~lly in FIG~RES 11 and 12, and in the cutaway top percpective view of FIGURE 15, ~ 93/11706 2 1 2 2 2 5 ~ PCT/US92/10327 where the X-ray transparent cover plate 60 forming the proximal or front wall of housing 54 has been removed from its ~u~olLing proximal flanges 56, tc reveal the in~ern~
stru~Luleu inside housing 54. In the same manner, an u~
ho ~~ng panel 57 has been removed fro~ its upper ~ o~Ling flanges S8, thus reveAl~n~ the in~ern~l structure of the opti~al system 32. Fragmentary broken away portions of panel 57 and cover plate 60 are shown at the left side of FIG~R~ lS.
As ~n~tc~ted in FIG~RES ll znd 12, radiation from the X-ray ~t-h~h~A~ 28 rA~ ~;vely through the X-ray L ~ ~ent ad~ustAble compression padldle 38, the patient~s breast 52, the fixed compr~C~n plate 53, and then through a thin film relli~le mirror 59. This is a film of high ten~ile ~L ~.~Lh elastic m~mhrane ~aterial such as nitrocellulose having a ~ h;~r~c r~ng;ng between 5 and 9 microns (micrometers), for ex~mple, stretched like a drumhead over a flat metal ~rame 61 (FIGURE 15) and ho to the precision lArreA edge of this frame. The thin r~~ e film is virtually tr~n~r~ent to X-radiation whiah r~ directly ~o~h it to i_pinge upon the underlying ho~rho~ screen 62 mounted on the ~mAge plane at the rear wall 63 of the housing 54.

W O 93/11706 PC~r/US92/10327 2~2~25~ 0 Positioned at points Bl and B2 on the X-ray transparent fixed compression plate 53, in the prior art fixed image receptor of FIGURE 13, are X-ray opaque index marks which may-take the form of cross hair~ as ;~Ai cAted in FIGURE 14. These index marks are imaged as shown by the crosses Bl and B2 in FIGURE 14, which comprises a vertical projection of the various points along the path of the X-ray8 ~lo--~eA; n~ through the system shown schematically în FIGURE 13. Thus the point Sl in FIGURE 14 corr~ron~ to the vertical projection on the ;~ge plane of the source position 28E at which the ~b~h~ 28 is first angularly offset, as indicated in FIGURES 4 and 13. In the same manner, point S2 on the image plane is the vertical projection of the ~cQnA tubehead ~ource position 28F shown in FT~rR~ 4 and 13.
The X-ray path from point 28E through X-ray opaque ~nA~Y Bl is imaged at point P4 on the image plane, while at the ~- ~Q~ source position 28F the X-ray p~c~; ng through index point Bl is imaged at point P2 as ; n~ ic~ted in the vertical projection diagram o~ FIGURE 14, and these two X-ray paths projected on the image plane cross at the index point Bl shown in FIGURE 14. In the same manner, index point B2 is determined by the crossing of the vertical projections of the X-ray paths S2Pl and SlP3.

~ 93/11706 2 1 2 2 2 ~5 PCT/US9~/10327 As also indicated in FIGURE 14, the X-ray path from source Sl through lesion Sl creates the vertical pro3ection X-ray path Sl~l on the im~ge plane and the crossing o~ this pro~ected line with line S2I2 ~nA~te~ the position at which the lesion appears in the stereo pro~ection of FIGUR~ 14. When the coordinates of these points Sl, S2, Bl, B2 and Ll and I2 are deter~ined on the i~age plane, this data may be recorded digitally and n~r-lated to provide highly acaurate X, Y and Z
aoordinates for the aatual position of the lesion.
This digital data h~nAl in~ v~e ~Lion is f~ tated by the optical system 32, shown in FIG~RES ll, 12 and 15-18. These include the coated underside of the pel~ e mirror 59 wh~ ~h serves as a mirror refl~ ~he i~age o~ the image plane l-'.o.L~?~Q~ plate 62 toward a ~ n~
mlrror 64, which delivers the reflected i~age of the ph~-~h~ plate 62 to lens 66 of the CCD e~rr~A camera 67.
Thus, as viewed from above loo~ ng down in FIC.~E
15, the image of the ~ l.o~ screen 62 is reflected fro~
the underside of pellicle film 59 to the right toward the angularly positioned mirror 64 which then directs it downward toward the lens 66, clearly shown in FIGURE l5 overlying the CCD camera 67.

O

Advantageously the pellicle film's reflective unde~rrace reflects the visible light image toward the CCD
camera, avoiding any di~usion or losses ~rom transmission thlv~l- the rh~ o- plate 62. Al80, the diagonal positioning of film 59 ~ e --rily requires ~pAc~n~ plate 62 away from X-ray tr~n-r~rent cv~e plate 60. phs~r~r plate 62 thus receives the direct X-rays passing from the tt~h~h~
tl.o~h the target, but most r?~onAS~y or scatterea X-ray~
pro~nceA within the target are lost, leaving a clean, sharp resulting image on plate 62.
The camera, v~e ~Ling in the ~It~tpchot moae, integrates the image from the rho~ plate 62 and at the end of the ~ nre~ the image is stored in computer memory.
This ~.&Lion is ~e ~o med ~or the image pro~n~eA by X-ray source position 1 at ~ ;rh~s~ position 28E, and it is then ~e~eaLea for DV~e position 2 at ~nhPIh~A position 28F and a~.GLL~r ,~ re is made. Thus in a few ~P~ lc, two stereo pair images are obt~ne~ and stored in the computer. The o~ ~Lor then brings the images to the monitor and using a track ball, places ~Y~L locators on the calibration marks Bl and B2 and on the lesion.
R~e~ on the position of these ~u~DG~D on the monitor D~reel., the computer then calculates the X, Y and Z
location of the lesion relative to the breast ~ _~ession paddle 38 and plate 53.

2~222~5 3/11706 PCT/US92/103~7 These X, Y and Z coordinates may be used ~ tely for fine needle or core biopsy, using the needle guide to direct the biopsy needle to the site of the lesion, where two more ~tereo i~ages are ~c~lded to confirm the a~u~e posit~i~q Or the neeale tip at the lesion site.
Alternatively, these images may al80 be smployed to guide if desired.
The p~ le film ~h~-k--r ~ preferably falls L~ ~. five and nine micrometers, and most desirably falls within the range of 8iX to seven micrometers, with the ~hi~ ~-n~ fo~mity being a~aLe and the faceC o~ the ~il~ h~ n~ parallsl within two wavelength~ of X-radiation per inch. A coating of aluminum and ~ con ~QY~ on t~e ~-n~~r~ o~ the pellicle film provides a refl~ct~
greater than 8%, with no pinholes being vi~ible to the ~-nA~o~ eye, thus as~uring the uniformity of the resulting CCD image. W~ile normal r~ e mirror ~rames 61 are ring ~h~e~ ~ the unique ~D ~ configuration of the r~llicle mirror 59 and frame 61 in the optical systems of the pref~ ~ embodiments of the i~vention provide a ~-ni ~'?
advantage: the rectangular area 68 ~ ~lr~nAi~ to the r~ le film reflection of the rho_lhor plate 62 i8 uniformly smooth and flat over its entire surface and it will be noted that the circular ~C~Q~ of ~rame 61 su~tends W O 93/11706 PC~r/US92/10327 ~
5~
.

approximately 250 degrees, while the straight chord 69 closing the D-chzp~A frame 61 subtends the rem~inin~ angle of about 110 degrees. This D-~hz~r~ ~rame 61 thus brings the critical area 68 very close to the adjacent chord segment 69 of frame 61, as shown in FIGURE 16. Chord segment 69 i8 posi~i QneA closely adjacent to upper hottcin~
panel 57, as can be observed in FIGURE 15, thus bri n~i n~ the critical area for imaging X-radiation pzl~cin~ through the patient's breast 52 close to table plat~orm 22, and ~ i n~ a ~isible image on the phosphor plate 62 in close juxtaposition with ~e housing panel 57, which is positinn~A ver~icz~lly as çln-? as pQCcihle to the patient's chest wall. By this means, the maximum volume of the patient's brea~t 52 is ~YpO-~~ to the mammcy~ ic examination using the X-radiation rZ~Ci n~ through the D-~h~n pellicle mirror 59.

FTr~R-~ 7A-7C, 11 and 12 show the preferred embodiment of the invention in which the light-tight housing 54 is inA~r~nA~nt of f;Y~A compre-ccio~ plate 53 and i~
mounted for pivoting movement on the C-arm with ~--hoh~~~ 28 about a pivot axis 29 spaced slightly away from ~ixed compr~; Qr~ plate 53. T~ h~A 28 and housing 54 thus pivot together as a unit, ~rom position 28E-54E in FIG~RE 18 to position 28F-54F in FIGURE 19. A substantial portion o~ the ~ 3/11706 2 ~ 2 2 2 5 5 PCT/US92/10327 patient's breast 52 can then be viewed in each position, in a wide image ut~ ng virtually the ft~l width of ph9-rhQ~
plate 62, as shown in these ~igures. As soon a5 CCD camera 67 has recorded the ;~ge ~ C~A by t~h~A 28~, X-ray source Sl, the C-arm 27 can be swung to ~-lh~~-~ position 28F, ~ ~e S2, and the entire width of rh~rh~r plate 62 is again avA~1Ahl~ to receive the ~ A~ ~tereo image-FIGURES ll and 12 chow a ~?c~A featurecharacterizing thi~ embodiment: the X~ray or~ index rk~ Bl and B2, like refelel-~e hole 40, are posi~onDA on mo~able compression paddle 38, rather than on fixed com~ ~n plate 53, to assure that diverging radiation paths from either source position ~AC~ n~ Lh.o~ the index ~ will fall with~n the useful image area o~ rh~-pla~.e 62.

CCD Diqital Imaqinq OPtical System The preferred form of CCD Camera 67 is sho~n 5~hf tically in more detail in FIGURE l9. In this diagram, lens 66 is ~L ~ed on a lens mount 71 positioned on the front face 73 of camera body 72. Face 73 incorporates a light-transparent window 74 behind which CCD array 76 is positioned. Light focused by lens 66 is delivered through window 74 to a focal plane corresponding to the face of CCD
array 76.

-W093/11706 PCT/US92/10327~

.

Array 76 is ~.Led on the ~ront end of a ~cold finger~ pedestal 77 whose rear end is An~ho~ed to a Peltier thermoelectric cooler 78 mounted on the camera body' 8 rear face 79 with heat-transfer fins 81 eX~n~n~ into the ambient atmo~ph~e. A ri..~ peA printed circuit board 80 closely encircles ~cold ~inger~ pedestal 77, minimizing resistance losses in the cQ~Anctors (not shown in FIGURE
19), ~o~n~ting CCD array 76 to board 80.
CCD array 76, positioned at the focal plane of lens 66, receives a fo~ image of the light pr~ by phosphor plate 62 via mirrors 59 and 64, and the array is quickly r~Ann~A, fA~ tating the storing of the ~Age in memory for man~r~l~tion, enh~n~-ment and r~Lu~e ~tudy as desired, without any delays such ~s ~ _-e required ~or in~ of X-ray film.
As best seen in FIG~RES 18 and 20, the computer and Ar~o~Ated system el~_LLo.,ics forming part of the overall digital mammo~ a~l~y system comprises computer 100, a aol,L ol module 102, a module 104 for ~L~ ~~tation of mammGy aphy~ information, disc drive 106 and ~yLo~ld 108 A~o~i~ted with computer 100. As best seen in FIGoRE 20, the system ele~o"ics include an inter~ace card 110 and a video di~play card 112 uh ~ ~h reside within computer 100.

-~ ~ ~r W ~ 3/117~6 PCT/US92/10327 212225~

Details con~i~ the I , Ler, video card and monitor used in the,preferred ~ ~t of the present invention are ~L.- ~nted in Table 1.

Table 1 Computer lOo IBM _- ~Atible per~onal computer with an Intel type 80386U or 80486 ~LG~ -~ and 12 to 16 Mb RAM, an~
200 MB hard disk ~torage Vid~o ~; ~rl ~Y card 112 Trident Impact 3~ video ~i~rl Ay card with 1024 x 768 pixel ~ ?lution and 8 bit lumin~nce L-- ~ tion per pixel Moni.tor 104 DGL o~.ix M2400~ 20 inch m~ooh~ome monitor with P104 phosphor, set to vertical and horizontal scan rate of video card; analog input.

A digital ~LL~1 logic module 114 and an An~lgg signal p~ -or 116 form the overall ~l-LLol module 102.
The digital ~,lL ol logic module generates various clocking 2~ 222~ ~

signals for transfer to the camera 67 for use by CCDs 76.
The o~L~ o~ the CCDs are applied through a preamplifier 120 so as to generate a CCD v~L~uL signal on a bus 122 for ~tation to the analog signal ~ -~ o~ 116.
Figure 21 is a detailed block diagram of the digital ~..L~ol logic module 114 and illustrates the ~r~c~ f~ C clock signals generated on vuL~L bus 124 as well as the clamped sample and data transferred be~e~ll this module and the analog signal ~Lv~ O~ module 116 on vuL~
bus 126. An integrate ~v..L~ol signal from the computer is also shown received on line 130 to the main ~v,~L ol logic le 132.
Details of the analog signal proce~o~ module 116 are shown in the detail block diagram of Figure 22. As seen in Figures 20 and 22 ~n X-ray ~L~L~ signal inA~ting the c~ of X-rays from X-ray detector 134 is ~ ~ ~nted on input status line 136.
As can generally be seen in Figure 22, the CCD
vuL~uL signal received on line 122 is ~L~~~ted to an input amrl~ff er 138 and from there ~-~ented under ~nL~ol of the clamp and sample signals to two sample ana hold modules 140 ana from there to differential amrl~f~ 142 and buffer 144 so as to be presented to a 12 bit analog digital converter 146 so as to present the digital ouL~uL of the CCD image to ~ 3/11706 2 1 2 2 2 ~ 5 PCT/US92/10327 a first in first out (FIF0) m~mory 1480 The ouL~L o~ the FIF0 memory is ~o~nected to the computer interface card llO
~or display and image ~ ~ r ~; ng by the _ Ler so as to ~ -~nt via display card 112 an v~L i~age onto monitor 1040 (See Figures 18-20).
Figure 23 is a detailed diagrammatic view o~ the camera 67 and its ~QCi Ated el~L v~iC8 illu~L.aLing the serial clock inputs ~rom the digital ~"L ol logic module 114 via bus 124: the o~L~L of CCD digital data via bus 122:
the input of V clocks (parallel clock) information on bus 24; as well as bias voltages from the ~nAlo~ and digital ~v.,L ol logic mQ~1~1~ 114 and 116.

Diaital Image ~G~e~sinq The overall imaging system shown in Figure 20 pro~ides an image o~ the mam~Gy ~ic information on ~i~rl~y monitor 104. In order to accomplish this task, the digitized CCD data received on bus 150 ~rom FIF0 memory 148 (see Figure 22) i5 under the ~v,,L~ol cf computer lO0 via ~e ~Lion of a computer ~o~m as set forth in a ~vy ~m listing Table 2. As seen in Table 2, the ~rog om for ~-hieving mammogrA~ic ~i~rl~y as well as digital image ooe~sing of the mammoy~ ic in~ormation is written in W093/11706 PCT/US92/10327 ~
212225~

Microsoft corporation assembly language as well as Microso~t ~C~ high level language.
In general, the image ~ ~- ~nted on monitor 104 compri~es 512 x 512 pixel~ of mammographic information on a video display of lQ24 x 768 pixels, with eaah pixel having a lum~ n~n~ resolution of 8 bits or 256 lu~in~ce values. The ~ e_cnt invention can also ~ L a pixel size ~ ~ ~rl Ay up to 1,024 x 1,024 pixels. The value of the lw-; n~nc~ from t_e CCD camera has a resolution of 12 bits or 4,096 lum~n~nc~ values. Of course, the 12-bit lumin~n~e information from the CCD camera could be displayed with use of a video ~;~P1AY card and ~onitor having such h~gh~
lumin~G~ imaging cspability.
The CCD camera can G~L~L data in a 512 x 512 pixel array or in a 1024 x 1024 pixel array. If the higher resolution array is used, mo~itor 104 ~i ~rl ~ys a 1024 X 768 portion of the CCD data with 128 rows at the top ,and bottom of the CCD image typically masked; al~ho~h the viewed image can be scrollea t~ t the CCD image.

over~ll O~Lion of Diaital Imaqe ~,~e~inq The computer ~oy ~ li~ting set forth in table 1 basically performs the following steps in its display of mamm~y a~hia information: (1) generates 12 bit lumin~n~e = ~ 3/11706 212 2 2 ~ 5 PCT/US92/10327 in~ormation for each pixel in the overall display area via subtracting a dark field and ,. ving fixed pattern noise A~o~i~ted with the particular CCD imaging device, (2) divides the dark field by a white field sometimes referred to as ~flat fi~l~ing~ 80 as to even out any uneV~n~e~ in the luminAn~e X-ray information as a result of ~on-uniform X-ray beam illumination, and (3) pro~oe~ a lumin~
histcy - of the displayed data.
In addition, the digital image prsc~i ng of the present invention allows for incr~in~ the ~u~.L~st which effectively narrows the lumin~n~e window as well as providing movement of the 1~ in~n~e window with regard to the luminAn~ range of values ~or which ~,~o~ l gray-c~Alin~ ic implemented; that is to move the window with ~L to the CCD lum;n~n~e values Of 0 to 4,095. This funation i8 sometimes referrea to as ~windowing~. More par~ ~ly~ the ~..LL~st ~i~rlAyed on monitor 104 can be increased by reA~c; ng the lu~inAn~ values that are yed. For example, the luminAn~e values fro~ 1,000 to 1,511 ço~ e ~i~plAyed out of all lu~i~Ance values from 0 to 4,095. Then, the 512 different lum;nA~ values (1,511 -1,000 - 512) co~l~ be mapped into the 256 brightness values displayable on monitor 104 from white for lum~n~n~e value equal to 1,000 to hlA~X for lumin~no~ value equal to 1,511.

WOg3/l1706 PCT/US92/10327 All lumi n~n~ values equal to or below 1,000 would be displayed as white and all those equal to or above 1511 would be displayed as black. Of course, the luli n~n~e values from the CCD camera could be inversely ~i~pl~yed on the monitor. For the example above, all lumin~nce valuec equal to or less than 1,000 co~l~ be ~plAyed a8 ~1A~ and vice versa for lum;n~n~e values equal to or greater than 1511. It should also be noted that rAp;~ly inverting the aisplayed data can help the operator to see features of the image than otherwise roCc~le if only one video polarity is ~ i ~rl ~yable.
Windowing is the ability to slide the range of values to be ~plAyea up or down the lum~nan~ 4,096 values from the CCD camera. In the example above, the 512 different lum~n~n~ values ~pl~yable on monitor 104 ~o~l~
be slid down so ac, for example, to include pixel lum;~c~
values from 70 to 581, or slid upward, to include pixel lumin~nc~ values from 4,020 to 4,531, for example. This combination of ~G1~D~L ~O~L~O1 and windowing provide significant diagnostic imaging improve~ent for the original CCD imaging data received from the ca~era.
Furthermore, a lum;n~nce histogram can be ~l ce~
by the imaging system. This lum~n~nce histogram is then used in a process sometimes referred to as auto ~l~y -~ 3/l1706 PCT/US92/103~7 2~2225~

~c~l ing, In essence, this p~ocess analyzes the CCD imaging data to determine what l~ in~nc~ values are pred in~ntly ob~i n~ for a particular image. For example, an image might have most pixels at lum;n~n~e values in a range of 2,000 to 3,000. Typically, the number of pixels at particular l~ ;nAnc~ values would have a characteristic bell-shape curve such as shown in FIGURE 240 The system then determines that the majority of pixel lumin~nce values predominantly lie between 2,000 and 3,000 and thus would ~plAy only those values as gray scale on the monitor.
Those pixels with lumi n~nC~ values equal to or less than 2,000 would be ~i~pl~yed as white while pixel values egual to or greater than 3,000 would be ~pl~yed as hl~ck. The ~Lv~ is therefore similar to selecting the lum; n~nce values to be ~i~rl~yed for ~o~ ~st ~nh~n~me~t.
The present invention also i~.~ ~tes convolution filtering and edge ~nh~nGe~ent wh;~h can operate on nll or a ~ ~et of the ~i~rl~yed image. For convolution filtering a k~rn-l having a matrix size o~ 3 x 3 pixels or 5 x 5 r~ Y~l S can be used around each pixel for which such convolution filtering is desired.
Furthermore, the implementation uses a lookup table ~chn;que for the gray scale ~c~c;~ted with the screen lumin~nc~ and thus provides a lumin~nce to gray scale~
image mapping as described above.

Additional features al-co include a high pass filtering so as to sharpen details as well as low pass filtering so as to remove high spatial noise which effectively provides for edge ~hAnc--?nt ~or rapidly changing data.
Furthermore, the present invention can perform ~histogram equalization~ and ~ ~st stretch1ng~. Similar to the convolution filtering described above, these functions can operate on all or a subset of the displayed image, sometimes referred to as the region of interest.
~C~ ,~st stre~chi ng~ e~fectively stretches the grayscale over the region of interest, thereby using the entire avAil~hle range of ~pl~yable grayscale only in this region of interest.
In ~histogram eqn~l;7~tion~ the system ~.- pC the data in the region of interest so that the resulting data has an equal number of o~ el.ces for each histogram bin.
In other words, if one looked at the luminAnce histogram in the region of interest after doing histogram e~ tion, each bar of the histogram would have the same h~; ght rather than the bell r~re curve as shown in FIGURE 24. Histogram e~l~li7Ation helps to enhAn~e the grayscale rendition for certain image k; ng visualization o~ abnormalities easier.

~ 3/11706 2 1 2 2 2 5 ~ PCT/US92/10327 Finally, the stereotactic imaging explained above u~es cursor marking of the displayed i~age and is implemented in the ~ v~am li~tings forming Table 2.
Posi~io~e~ information in digital form interfaces with the X, Y or Z ~ul,~Lol knobs on the ~Ae~leguide stage or carriage 45 (FIGURES 6, 7) actuated n~ y or ~e~ iven, and a null indication ~n~l~ ma~h;n~ of calculated with actual coordinates. This interfacing coL-~-ronA~ to the manual calculation of coordinates using a ~digitizing pad~ with a ~ilm grid system like those used with computer pads, to ~LG~_2 the same matchi ng with the actual coordinates of the needle guide stage.
The overall operation of the various yLOy~m modules are explained via the comments associated with those m~A~t~le~ in ~L~ , - listing Table 2. The overall result is not only to ~rl- Ant the digitized infonmation but to provide for overall _nh~n~-ment of the informativn including zooming of ~pACi fiC regions of interest, edge ~nh~nC--ment~ ~.,L ast enh~nc-ment as well as artifact removal associated with the CCD imaging ~-n~orS. In general, the digital image ~LO~ ~ '~i ng provides much greater information to the examining physician than that a~ hl e using radiographic imaging.

2~ 222~

It will thus be seen that the objects set forth above, and those made apparent from the pr~ceAing descriptions, are effi~;ently att~;ne~ and, since certain changes may be made in the above construction without departing from the scope of the invention, it is inte~
that all matter cont~;ne~ in the above description or shown in the accompanying drawings shall be intel~eLed as illustrative and not in a limiting sense.
It is also to be understood that the following claims are int~ed to cover all of the generic and specific feaLu~er: of the invention herein described, and all statements of the score of the invention which, as a matter of language, might be said ~o fall therebetween.

;**~ ~*~**~*~***~*****~***~****** * * ~*~********\
;FUNCTION:
; xchg_array(source address, count) ;

;AR~ lS:
; int ~ource; lli. ~y address of integer array ; unsigned int count; Nu~ber of words in array ;

;DESCRIPTION:
; Inverts a video line left to right, starting at source addres~.
;***********************************~*********************~**~***~*~*1 ;
;

TITLE Invert video line left to right NAME BINNING
;

.286c INCLUDE MEMMODEL.MAC
INCLUDE TRIDENT.ASM
;
;

IF LPROG

ELSE

ENDIF
;

PSEG
PUBLIC _XCHG_ARRAY
IF LPROG
_XCHG_ARRAY PROC FAR
XCHG ARRAY PROC NEAR
ENDIF
CLI
PUSH BP
MOV BP,SP
PUSii SI
;

;SET UP REGISTERS FOR XCflG
;

MOV BX,tBP+X] ;SET UP POINTER TO ARRAY
MOV SI,tBP+X+2] ;GET ARRAY LENGTH
MOV CX,SI ;COF.~lh NUMBER OF WORDS TO XCflG
SHR CX,1 DEC SI;C~II~L~ ADDRESS OF LAST ELEMENT
SHL SI,l ADD SI,BX
L10: MOV AX,tSI~ ;GET A WORD
XCHG AX,tBX] ;XCHANGE lST ~ LAST ELEMENT
MOV tSI],~X
INC BX;INCREMENT POINTER TO ARRAY
INC BX
DEC SI;DECREMENT POINTER TO ARRAY
DEC SI

Table 2~ p.l-POP SI
POP BP
STI
RET
;

XCHG ARRAY ENDP
_*********************************************
;FUNCTION:
; squeeze(source address, count) ,A~uM~-S:
; int *source; Memory address of integer array unsigned int count; Nu~ber of words in array ;DESCRIPTION:
; Gets rid of holes in the data strea~ caused by reading binned.
;**********************************************************************/
.
TITLE Squeeze video line left ; SUBTTL TONY SCANDURA 09/13/91 NAME SQUEEZE
PUBLIC SQUEEZE
IF LPROG
SQUEEZE PROC FAR
ELSE
2û _SQUEEZE PROC NEAR
ENDIF
CLI
PUSH BP
MOV BP,SP
PUSH SI
PUSH DI

,SET UP REGISTERS FOR XCHG
MOV DI,tBP+X] ;SET UP POINTER TO ARRAY
MOV CX,tBP+X+2] ;GET ARRAY LENGTH
SHR CX,l ;CO.. ~u,~ t OF WORDS TO MOVE
MOV BX,02H ;INCREMENT VALUE
MOV SI,DI ;CO'I~ul~ ADDRESS OF FIRST REAL ELEMENT
L100: ADD SI,BX
LODSW ;GET A WORD
STOSW ;STORE IT IN NEW LOCATION

POP DI
POP SI
POP BP

Table 2, p.2-STI
RET
SQ~ ENDP
ENDPS
END
;**********************************************************************\
;~-uN~-~lON:
; inp to crt(xpos, ypos, count) inp a series of bytes to crt ;

;Ak~u..~h,S:
lû ; int xpos, ypos; X, Y coordinate of pixel to write ; unsigned int count; Number of bytes to input ;

;DESCRIPTION:
; Inputs a series of bytes from an input port to consecutive crt ; y locations. This function handles conv~r~ing the X, Y
coordinate to the linear address space of the Trident memory map.
;**********************************************************************l TITLE Input a series of bytes to memory NAME _INTOCRT
;

.286c INCLUDE MEMMODEL.MAC
INCLUDE TRIDENT.ASM
IF LPROG

ELSE

ENDIF
;

PSEG
PUBLIC INP TO CRT
IF LPROG
INP TO CRT PROC FAR
ELSE
INP TO CRT PROC NEAR
ENDIF
PUSH BP
MOV BP,SP
PUSH DI
;Col.~u.~ REAL ADDRESS USING Y * 1024 + X
; CO..~U L~ S~n~ N l PART OF ADDRESS

Table 2, p.3-MOV BX,~BP+X+2~ ;GET Y VALUE
SHL BX,l ;Y * 4 SHL BX,l HOV AH,BH ;GET ~.l~h. VALUE
XOR AH,02H ;ADJUST PAGE BIT
MOV AL,OEH ;MODE CONTROL REGISTER 1 MOV DX,SEQAP ;SEQUENCER ADDRESS PORT
OUT DX,AX ;SET TRIDENT ~.I~N1 REGISTER
;COh~U~ OFFSET PART OF ~nn~F..~S
;

XOR BH,BH ;GET RID OF Sr:~ ~Nl BITS
XCHG BH,BL ;Y * 256 MOV AX,[BP+X] ;GET X VALUE
ADD AX,BX ;ADD IN X OFFSET
;UPDATE THE SCREEN
;

LES DI,DWORD PTR SCR BASE ; SET UP POINTER TO SCREEN BASE
ADD DI,AX ;POINT TO PIX LOCATION USING ES:DI
MOV DX,DATA PORT ;INPUT PORT TO DX
MOV CX,[BP+X+4] ;NUMBER OF BYTES TO INPUT
REP INSB
poP DI
POP BP
RET
INP TO CRT ENDP
ENDPS
;

DSEG
SCR BASE DD MBASE DWORD
ENDDS
END
;

;MACRO PARAMETERS FOR TRIDENT VIDEO CARD
;

MBASE SEG EQU OAOOOH
MBASE DWORD EQU OAOOOOOOOH

B~ ~P~KLINE EQU 1024 ;***********************************************************************
~***
;FUNCTION:

Table 2, p.4-; invert_video(xpos, ypos, xlen, ylen)Invert the video image ;AK~U.I~h~S:
; int xpos, ypos; X, Y coordinate of starting pixel ; int xlen, ylen; x and y length of block in pixels ;

;DESCRIPTION:
; This function inverts the video image (black on white to/fro~
; white on black) for the specified block of pixels.
1û ;~**********************************************************************
***

TITLE Invert video image NAME _INVIDEO
;

.286C
INCLUDE MEMMODEL.MAC
INCLUDE TRIDENT.ASM

IF LPROG

ELSE

XPOS EQU BP+X]
YPOS EQU BP+X+2]
XLEN EQU BP+X+4]
YLEN EQU BP+X+6]
;

PSEG
PUBLIC _INVERT_VIDEO
IF LPROG
INVERT_VIDEO PROC FAR
ELSE
1NV~K~ VIDEO PROC NEAR
ENDI F
PUSH BP
MOV BP,SP
PUSH SI
PUSH DI
3û PUSH DS
;

;COMPUTE REAL ADDRESS USING Y * 1024 + X
;COI.~U~ S~..~h~ PART OF ADDRESS
;

MOV 8X,YPOS ; GET Y VALUE

Table 2~ P.5-SHL BX~l ;Y * 4 SHL BX~l MOV AH~BH ;GET g~v.. ~ VALUE
XOR AH~02H ;ADJUST PAGE BIT
MOV AL~OEH ;MODE CONTROL REGISTER 1 MOV DX~SEQAP ;S~UU~N~K AnD~F.~5 PORT
OUT DX~AX ;SET TRIDENT ~}~ ~h~ REGISTER
;CO..~u~: OFFSET PART OF ADDRESS
;

XOR BH~BH ;GET RID OF ~:~.. ~h~ BITS
XCHG BH~BL ;Y * 256 MOV AX,XPOS ;GET X VALUE
ADD AX~BX ;ADD IN X OFFSET
LES DI,DWORD PTR SCR_BASE ; SET UP POINTER TO SCREEN BASE
ADD DI~AX ;POINT TO PIX LOCATION USING ES:DI
LDS SI~DWORD PTR SCR_BASE ; SET UP POINTER TO SCREEN BASE
ADD SI~AX ;POINT TO PIX LOCATION USING DS:SI
;

;UPDATE THE SCREEN
;

MOV BX~B~ :S~KLINE ;CVM~U1r: lN~h~ FROM END OF
SUB BX,XLEN ;LINE TO BEGINING OF NEXT LINE
MOV CX,YLEN ;NUMBER OF ROWS IN LINE
L10: P~SH CX ;SAVE COUN~K FOR NUMBER OF REMAINING ROWS
MOV CX~XLEN ;CO~h~K FOR WIDTH OF BLOCK
L20: LODSB ;GET A PIXEL
NOT AL ;INVERT THE BITS
STOSB ;UPDATE ONE PIXEL ON CRT
LOOP L20 ;LOOP 'TIL LINE DONE
ADD DI~BX ;IN~K~hl POINTER TO NEXT ROW OF PIXELS
ADD SI~BX ;INv ~ ~hl POINTER TO NEXT ROW OF PIXELS
JA L30 ;IF CARRY~ OR 0~ NEED TO UPDATE Sr~
CALL CHKBANK ;UPDATE S~:~M~:h~ REGISTER
L30: POP CX
LOOP L10 ;LOOP DOWN THE ROWS
;

DONE: POP DS
POP DI
POP SI
POP BP
RET
;

INVERT_VIDEO ENDP
;

,SUBROUTINE TO UPDATE THE SEGMENT REGISTER
IF LPROG
CHKBANK PROC FAR
ELSE
CHRBANK PROC NEAR

Table 2, p.6-ENDIF
MOV DX,SEQAP ;S~:yO~ ADDRESS PORT
MOV AL,OEH ;MODE CONTROL REGISTER 1 OUT DX,AL
INC DX;SEQUENCER DATA PORT
IN AL,DX;GET OLD BANK
INC AL;INCREMEWT THE BANK
XOR AL,02;INVERT PAGE BIT
OUT DX,AL
RET
CHKBANR ENDP
ENDPS
;

DSEG
SCR BASE DD MBASE DWORD
ENDDS
END
;*~*********************************************************************
******\
;FUNCTION:
; inpw to mem(address, port, count); Input a series of words to memory ;

;AR~u~h,S:
; char far *address; Memory address of starting pixel to write ; int port; Port to input from ; unsigned int count; Number of bytes to input ;DESCRIPTION:
; Inputs a series of words from an input port to consecutive ; - -Ly locations starting at address.
;***********************************************************************
******/
;

TITLE Input a series of words to memory NAME _ lN~
;
.286c INCLUDE MEMMODEL.MAC
INCLUDE TRIDENT.ASM
;
;

IF LPROG

ELSE

ENDIF
;

PSEG

Table 2, p.7-PUBLIC INPW_TO_MEM
IF LPROG
INPW_TO_MEM PROC FAR
ELSE
INPW TO_MEM PROC NEAR
ENDIF
CLI
PUSH BP
MOV BP,SP
PUSH DI
;

;SET UP REGISTERS FOR REP INSB
LES DI,tBP+X] ;SET UP POINTER TO DESTINATION
MOV DX,tBP+X+4] ;INPUT PORT TO DX
MOV CX,[BP+X+6] ;NUMBER OF WORDS TO INPUT
REP INSW
;

POP DI
POP BP
STI
RET
;

INPW_TO_MEM ENDP
ENDPS
END
;***************************************************~*****************~*
******\
;FUNCTION:
, load_grayscale(address); Load the video DAC LUTs ;AK~..~S:
char far *address; Memory address of table of R, G, ~ values ;DESCRIPTION:
; Load the video DAC loo~up tables from table pointed to by address ;***********************************************************************
******/

TITLE Load LUTs SUBTTL TONY SCANDURA ll/05/90 NAME LOADGRY
.286c INCLUDE MEMMODEL.MAC
INCLUDE TRIDENT.ASM

IF LPROG

ELSE

Table 2~ p.8-CA 021222~ 1998-09-10 ENDIF
;

TABLE EQU tBP+X]
;

PSEG
PUBLIC LOAD GRAYSCALE
IF LPROG
LOAD_GRAYSCALE PROC FAR
ELSE
LOAD_GRAYSCALE PROC NEAR
ENDIF
CLI
PUSH BP
MOV BP,SP
PUSH SI
PUSH DS
;

;SET UP REGISTERS FOR REP OUTSB
;

LDS SI,TABLE ;SET UP POINTER TO TABLE OF VALUES
MOV DX,DACWRAD ; O~'1'U'1' PORT FOR DAC WRITE ADDRESS
MOV CX,768 ;NUMBER OF BYTES TO Oul~u XOR AL,AL ;LOAD STARTING ADDRESS
OUT DX,AL
INC DX ;PORT FOR DAC LUT DATA
REP OUTSB
poP DS
poP SI
POP BP
STI
RET
;

LOAD GRAYSCALE ENDP
ENDPS
END
;**********************************************************************\
;FUNCTION:
; mem_to_mem(source address, dest address, count) ;

;ARGUMENTS:
; char far *source, *dest; Memory addresses of source and destination ; unsigned int count; Number of bytes to move ;DESCRIPTION:
; Moves a series of bytes from consecutive memory locations ; starting at source address to dest address.
;**********************************************************************l ;
;

Table 2, p.9-TITLE Move a series of bytes from - -Ly- to --y NAME }l~r.~
-.286c INCLUDE M~IODEL.MAC
INCLUDE TRIDENT.ASH

IF LPROG

ELSE

ENDIF
;

PSEG
PUBLIC MEM TO MEM
IF LPROG
MEM TO MEM PROC FAR
ELSE
MEM TO MEM PROC NEAR
ENDIF
CLI
PUSH BP
MOV BP,SP
PUSH DI
PUSH SI
PUSH DS
;SET UP REGISTERS FOR REP MOVSB
;

CLD
LDS SI, BP+X] ;SET UP POINTER TO SOURCE
LES DI, BP+X+4] ;SET UP POINTER TO DESTINATION
MOV CX, BP+X+8] ;NUMBER OF BYTES TO INPUT
REP MOV"B
;

POP DS
POP SI
POP DI
POP BP
-STI
RET
;

MEM TO MEM ENDP
ENDPs END
;**********************************************************************\
;FUNCTION:
; print 8x8(char, xpos, ypos, fgd, bkgd) Display a character ; In Graphics Mode Table 2, p. 10-CA 02l22255 l998-09-l0 ;AR~u..~h~S:
; char *char; Pointer to character string to print ; int xpos, ypos; X, Y coordinate of pixel to write int fgd, bkgd; f~l~y~ulld and background pixel values ;DESCRIPTION:
; This function is a complete software character generator.
; It writes a single character to the specified X, Y coordinate.
lû ; Both the fole~uu-ld and back~Luw,d pixel values must be given.
;**********************************************************************l TITLE Display character using X,Y coordinates NAME _PR 8X8 ;

.286c INCLUDE MEMMODEL.MAC
INCLUDE TRIDENT.ASM
;
;

IF LPROG

ELSE

ENDIF
CHAR EQU BP+X]
XPOS EQU BP+X+2]
YPOS EQU BP+X+4]
FGD EQU tBP+X+6]
BKGD EQU [BP+X+8 ;

B~ ~KLINE EQU 1024 IN~-K~.~ EQU B~ P~KLINE-CHAR WIDTH
NEXT_CHAR8 EQU B~ P~KLINE*CHAR_HEIGHT8-CHAR_WIDTH
PSEG
PUBLIC _PRINT 8X8 IF LPROG

ELSE

ENDIF
PUSH BP
MOY BP,SP
PUSH SI
PUSH DI

Table 2~ p.11-;COI.~U~ REAL AnD~S USING Y * 1024 + X
,C~.~U~ SEGMENT PART OF AnD~S
MOV BX,YPOS ;GET Y VALUE
SHL BX,1 ;Y * 4 SHL BX,1 MOV AH,BH ;GET SEGMENT VALUE
XOR AH,02H ;ADJUST PAGE BIT
MOV AL,0EH ;MODE CONTROL REGISTER 1 1U MOV DX,SEQAP ;SEQUENCER ADDRESS PORT
OUT DX,AX ;SET TRIDENT S~:~.. ~N1 REGISTER
;

;COMPUTE OFFSET PART OF ADDRE55 ;

XOR BH,BH ;GET RID OF SEGMENT BITS
XCHG BH,BL ;Y * 256 MOV AX,XPOS ;GET X VALUE
ADD AX,BX ;ADD IN X OFFSET
LES DI,DWORD PTR SCR BASE ;SET UP POINTER TO SCREEN BASE
ADD DI,AX ,POINT TO PIX LOCATION USING ES:DI
;

;SET UP CHARACTER D~1N1r110N TABLE ADDRESSING
;

MOV BX,CHAR ;GET POINTER TO CHARACTER
NX CHR: MOV AL,[BX] ;THEN MULTIPLY BY NUMBER OF
XOR AH,AH
SHL AX,3 ;POINTS TO GET OFFSET INTO TABLE
JZ DONE ;DONE IF CHARACTER WAS ZERO
PUSH DS ;SAVE DATA S~:~.I~N1 POINTER TO S0URCE
LDS SI,DWORD PTR CHAR ADR8 ;START OF CHARACTER DEF TABLE
ADD SI,AX ;DS:SI POINTS TO ADDRESS OF CHAR DEF

,UPDATE THE SCREEN
MOV CX,CHAR_HEIGHT8 ;NUMBER OF ROWS IN CHARACTER
MOV DH,FGD ;GET ~K~KOUNU PIXEL VALUE
MOV DL,BKGD ;GET BACK~KODNU PIXEL VALUE
L10: PUSH CX ;SAVE COUN~r:~ FOR NUMBER OF REMAINING ROWS
MOV CX,CHAR_WIDTH ;COU1~K FOR CHARACTER WIDTH
LODSB
MOV AH,AL ;PUT CHARACTER CODE IN AH
L11: MOV AL,DH ;AL = FOREGROUND PIXEL VALUE
SHL AH,1 ;TEST EACH BIT IN AH
JC L12 ;JUMP IF FOREGROUND PIXEL ELSE
MOV AL,DL ;LOAD BACKGROUND PIXEL VALUE
L12: STOSB ;UPDATE ONE PIXEL ON CRT

ADD DI,INCREMENT ;INCREMENT BUFFER TO NEXT ROW OF PIXELS
MOV AH,1 ;VALUE TO ADD TO S~ N1 IF NEEDED

Table 2, p.12-CA 02l22255 l998-09-l0 CALL ~K~AN~ ;UPDATE SEGMENT IF NEEDED
POP CX
LOOP LlO ;LOOP DOWN THE CHARACTER
;

INC BX ;INCREHENT POINTER TO CHAR STRING
SUB DI,NEXT CHAR8 ;COMPUTE NEXT SCREEN ~nDR~S
MOV AH,-l ;VALUE TO ADD TO ~GM~' IF NEEDED
CALL ~UKRANK ;UPDATE SEGMENT IF NEEDED
POP DS ;GET DATA S~M~-h~ POINTER TO SOURCE
JMP SRORT NX CHR ;LOOP 'TIL ENTIRE STRING IS PROCESSED

DONE: POP DI
POP SI
POP BP
RET
;

;**********************************************************************~
;FUNCTION:
; print_8xl6(char, xpos, ypos, fgd, bkgd~ Display a character In Graphics Mode ;AR~u~h~S:
; char *char; Pointer to character string to print ; int xpos, ypos; X, Y coordinate of pixel to write , int fgd, bkgd; foreground and background pixel values ;DESCRIPTION:
; This function is a complete software character generator.
; It writes a single character to the specified X, Y coordinate.
; Both the fo.e~ruul.d and ba~,uu.ld pixel values must be given.
;**********************************************************************/

; TITLE Display character using X,Y coordinates ; SUBTTL TONY SCANDURA lO/23/9O
; NAME PR 8X16 CHAR_HEIGHT6 EQU 16 NEXT_CHAR6 EQU B~ S~:KLINE*CHAR HEIGHT6-CHAR WIDTH
PUBLIC _PRINT_8Xl6 IF LPROG
_PRINT_8X16 PROC FAR
ELSE
PRINT_8X16 PROC NEAR
- ENDIF
PUSH BP
MOV 8P,SP
PUSH SI
PUSH DI

Table 2~ p.13-;COI~uLr. REAL ADDRESS USING Y * 1024 + X
~r.~..r~ PART OF ADDRESS
MOV BX,YPOS ;GET Y VALUE
SHL BX,l ;Y * 4 SHL BX,l MOV AH,BH ;GET S~.. ~ VALUE
XOR AH,02H ;AWUST PAGE BIT
MOV AL,OEH ;MODE CONTROL REGISTER 1 MOV DX,SEQAP ;SEQUENCER ADDRESS PORT
OUT DX,AX ;SET TRIDENT S~M~N~1~ REGISTER
;CO.~ulr: OFFSET PART OF ADDRESS
;

XOR BH,BH ;GET RID OF Sr~M~Nl BITS
XCHG BH,BL ;Y * 256 MOV AX,XPOS ;GET X VALUE
ADD AX,BX ;ADD IN X OFFSET
LES DI,DWORD PTR SCR BASE ; SET UP POINTER TO SCREEN BASE
ADD DI,AX ;POINT TO PIX LOCATION USING ES:DI
,SET UP CHARACTER D~lNl-LlON TABLE ADDRESSING
MOV BX,CHAR ;GET POINTER TO CHARACTER
NXXCHR: MOV AL,tBX] ;THEN MULTIPLY BY NUMBER OF
XOR AH,AH
SHL AX,4 ;POINTS TO GET OFFSET INTO TABLE

JZ DONEl ;DONE IF CHARACTER WAS ZERO
PUSH DS ;SAVE DATA S~ POINTER TO SOURCE
LDS SI,DWORD PTR CHAR ADR6 ;START OF CHARACTER DEF TABLE
ADD SI,AX ;DS:SI POINTS TO ADDRESS OF CHAR DEF
;

,UPDATE THE SCREEN
MOV CX,CHAR HEIGHT6 ;NUMBER OF ROWS IN CHARACTER
MOV DH,FGD ;GET FOREGROUND PIXEL VALUE
MOV DL,BKGD ;GET BACRGROUND PIXEL VALUE
L100: PUSH CX ;SAVE co~N~rK FOR NUMBER OF REMAINING ROWS
MOV CX,CHAR WIDTH ;COu.~,r~ FOR CHARACTER WIDTH
LODSB
MOV AH,AL ;PUT CHARACTER CODE IN AH
L110: MOV AL,DH ;AL = FoRr~KuuNu PIXEL VALUE
SHL AH,l ;TEST EACH BIT IN AH
JC L120 ;JUMP IF r~r~KOuNu PIXEL ELSE
MOV AL,DL ;LOAD BACRGROUND PIXEL VALUE
L120: STOSB ;UPDATE ONE PIXEL ON CRT

ADD DI,INCREMENT ;INCREMENT Burr~K TO NEXT ROW OF PIXELS
MOV AH,l ;VALUE TO ADD TO S~ l IF NEEDED

Table 2, p.14-CALL CHKBANR ;UPDATE ~E~M~N1' IF NEEDED
poP CX
LOOP 1100 ;LOOP DOWN THE CHARA ~ ER
INC BX ;INCREMENT POINTER TO CHAR STRING
SUB DI,NEXT_CHAR6 ;COh~ul~ NEXT SCREEN ADDRESS
HOV AH,-l ;VALUE TO ADD TO SEGMENT IF NEEDED
CALL C~RRANK ;UPDATE ~1M~ IF NEEDED
POP DS ;GET DATA ~M~N~l~ POINTER TO SOURCE
JMP SHORT NXXCHR ;LOOP 'TIL ~hllK~ STRING IS PROCESSED
DONEl: POP DI
poP SI

RET
i PRINT 8Xl6 ENDP
;

,~u~kOu~lN~ TO UPDATE THE S~:~M~:N~ REGISTER
IF LPROG
CHKBANK PROC FAR
ELSE
CHKBANK PROC NEAR
ENDIF
JC 'N~W~NK ;IF CARRY, NEED TO UPDATE S~:~M~'N1' RET
NEWBNR: PUSH DX
MOV DX,SEQAP ;SEQUENCER ADDRESS PORT
MOV AL,OEH ;MODE CONTROL REGISTER l OUT DX,AL
INC DX ;SEQUENCER DATA PORT
IN AL,DX ;GET OLD BANR
ADD AL,AH ;INCREMENT OR DECREMENT THE BANK
XOR AL,OZ ;INVERT PAGE BIT
OUT DX,AL
POP DX
RET
;

CHKBANK ENDP
;******************************************************************\
;FUNCTION:
; set char adr(); set character pointers to ; character definition tables ;

;ARGUMENTS
; None ;

;DESCRIPTION:
; This function sets far character pointers to the ; character definition tables for 8x8 and 8x16 characters.

Table 2, p.l5-CA 02l222~ l998-09-l0 ; T~is function only needs to be called once.
;******************************************************************l PUBLIC SET CHAR ADR
IF LPROG
SET CHAR ADR PROC FAR
ELSE
SET CHAR ADR PROC NEAR
ENDIF
PUSH BP
MOV BP,SP
MOV AX,1130H ;SET UP FOR VIDEO BIOS Ih~KKUr~
MOV BH,3 ;LOAD TABLE NUMBER FOR 8x8 CHARACTERS

MOV WORD PTR CHAR ADR8+2,ES ;SAVE DD POINTER IN CHAR ADR8 MOV WORD PTR CHAR ADR8,BP ;BP = OFFSET, ES = S~M~NL
MOV AX,1130H ;SET UP FOR VIDEO BIOS lN'l'~K~U~I' MOV 8H,6 ;LOAD TABLE NUMBER FOR 8x16 CHARACTERS

MOV WORD PTR CHAR_ADR6+2,ES ;SAVE DD POINTER IN CHAR ADR6 MOV WORD PTR CHAR_ADR6,BP ;BP = OFFSET, ES = SEGMENT
POP BP
RET
SET CHAR ADR ENDP
ENDPS
;

DSEG
CHAR ADR8 DD ?
CHAR ADR6 DD ?
SCR_BASE DD MBASE_DWORD
ENDDS
END
;**********************************************************************~
;FUN ~ ION:
; rec_window(source address, dest address, width, height) ;

; Ak~iUM~ S:
; char far *source, far *dest; Memory addr of source and destination ; int width, height; Width and height of rectangle ;

;DESCRIPTION:
; Recalls a window from a memory buffer to the CRT.

;**********************************************************************/
i ;

Table 2, p.16-TITLE Rec~ a window.

NAME _REC WIN
;

.286c INCLUDE MEMMODEL.MAC
INCLUDE TRIDENT.ASM
;
i IF LPROG

ELSE

ENDIF
;

SOURCE EQU BP+X]
DEST EQU BPIX14]
XLEN EQU BP+X~8]
YLEN EQU BP+X+10]
;

PSEG
PUBLIC _REC WINDOW
IF LPROG
_REC_WINDOW PROC FAR
ELSE
REC WINDOW PROC NEAR
ENDIF

CLI
PUSH BP
MOV BP,SP
PUSH DI
PUSH SI
PUSH DS
i CLD
LDS SI,SOURCE ;SET UP POINTER TO SOURCE
LES DI,DEST ;SET UP POINTER TO DESTINATION
MOV CX,YLEN ;NUMBER OF BYTES IN HEIGHT (Y) MOV AX,BYTESPERLINE ;CO..~ul~ INCREMENT VALUE FROM END OF ONE
SUB AX,XLEN ;LINE TO B~lNNlNG OF NEXT LINE - SAVE IN AX
L10: MOV BX,CX ;SAVE COUh~ FOR NUMBER OF ROWS REMAINING
MOV CX,XLEN ;NUMBER OF BYTES IN WIDTH (X) REP MOVSB
OR DI,DI ;IF ZERO, NEED TO UPDATE S~M~:N1 CALL INCBANK
L15: ADD DI,AX ;DESTINATION POINTS TO ADDRESS OF NEXT LINE
JNC L20 ;IF CARRY, NEED TO UPDATE S~M~N~
CALL INCBANK ;UPDATE S~..~N1 REGISTER
L20: MOV CX,BX . ;GET LOOP COUNTER

Table 2, p.17-LOOP L10 ;LOOP TIL ALL ROWS DONE
POP DS
POP SI
POP DI
POP BP
STI
RET
;

_REC_ hlNuow ENDP
;SUBROullN~: TO UPDATE THE S~n~:Nl REGISTER
;

IF LPROG
INCBANK PROC FAR
ELSE

ENDIF
PUSH AX - -MOV DX,SEQAP ;SEQUENCER ADDRESS PORT
MOV AL,OEH ;MODE CONTROL REGISTER 1 OUT DX,AL
INC DX ;SEQUENCER DATA PORT
IN AL,DX ;GET OLD BANK
INC AL ;INc ~I~:N1 THE BANK
XOR AL,02 ; lNV~Kl PAGE BIT
OUT DX,AL
POP AX
RET
;

INCBANK ENDP
ENDPS
END
;***********************************************************************
****
;FUNCTION:
; rev_fgd_bkgd(xpos, ypos, fgd, bkgd, xlen, ylen) ; Reverse fo,~-Gund and backy~ound ; pixel block in Graphics Mode ;

; AR~jUM~ S:
; int xpos, ypos; X, Y coordinate of starting pixel ; int fgd, bkgd; fo,e~L~und and background pixel values to swap , int xlen, ylen; x and y length of block in pixels ;DESCRIPTION:
; This function swaps the foreground and background ; pixel values for the specified block of pixels.
;***********************************************************************
***
;

Table 2~ p.18-CA 02l22255 l998-09-lO

TITLE Reverse f~L~yL~ul~d and back~Lo~nd block of pixels NAME _R v~
;

.286c INCLUDE I.~SODEL.MAC
INCLUDE TRIDENT.ASM
;
;

IF LPROG

ELSE

ENDIF
;

XPOS EQU t BP+X]
YPOS EQU t BP+X+2]
FGD EQU t BP+X+4]
BgGD EQU t BP+X+6]
XLEN EQU t BP+X+8]
YLEN EQU t BP+X+10]
;

PSEG
PUBLIC _REV_FGD_BKGD
IF LPROG
_REV_FGD_BKGD PROC FAR
ELSE
_REV_FGD_BRGD PROC NEAR
ENDIF
PUSH BP
MOV BP,SP
PUSH SI
PUSH DI
;

;COllru~ REAL ADDRESS USING Y * 1024 + X
;C011rUl~ Nl PART OF ADDRESS
;

MOV BX,YPOS ;GET Y VALUE
SHL BX,1 ;Y * 4 SHL BX,1 MOV AH,BH ;GET SEGMENT VALUE
XOR AH,02H ;ADJUST PAGE BIT
MOV AL,OEH ;MODE CONTROL REGISTER 1 MOV DX,SEQAP ;SEQUENCER ADDRESS PORT
OUT DX,AX ;SET TRIDENT S~.. ~Nl REGISTER
,COMPUTE OFFSET PART OF ADDRESS
XOR BH,BH ;GET RID OF S~.l~hl- BITS
XCHG BH,BL ;Y * 256 Table 2~ p.19-MOY AX,XPOS ;GET X VALUE
ADD AX,BX ;ADD IN X OFFSET
LES DI,DWORD PTR SCR_BASE ; SET UP POINTER TO SCREEN BASE
ADD DI,AX ;POINT TO PIX LOCATION USING ES:DI
,UPDATE THE SCREEN
MOV BX,B~ P~:KLINE ;COH~ul~ INCREMENT FROM END OF
SUB BX,XLEN ;LINE TO B~:GINlNG OF NEXT LINE
MOV CX,YLEN ;NUMBER OF ROWS IN CHARACTER
MOV DH,FGD ;GET FOREGROUND PIXEL VALUE
lû MOV DL,BXGD ;GET BACRGROUND PIXEL VALUE
L10: PUSH CX ;SAVE CODh~}:K FOR NUMBER OF REMAINING ROWS
MOV CX,XLEN ;CODh~K FOR WIDTH OF 8LOCK
L20: - MOV AL,DH ;AL = FOREGROUND PIXEL VALUE
SCASB
JNE L30 ;JUMP IF ES:DI NOT FOREGROUND VALUE
MOV AL,DL ;O~KWlSE LOAD R~R~-~UND PIXEL VALUE
L30: DEC DI ;ADJUST DESTINATION ADDRESS
STOSB ;UPDATE ONE PIXEL ON CRT
LOOP L20 ;LOOP 'TIL LINE DONE
ADD DI,BX ;INCREMENT POINTER TO NEXT ROW OF PIXELS
JNC L40 ;IF CARRY, NEED TO UPDATE SEGMENT
Q LL CHRBANX ;UPDATE S~M~:N-1 REGISTER
L40: POP CX
LOOP L10 ;LOOP DOWN THE ROWS
;

DONE: POP DI
pOP SI
2û pop BP
RET
;

_REV_FGD BRGD ENDP
;

;SUBROUTINE TO UPDATE THE SEGMENT REGISTER
;

IF LPROG
CHRBANX PROC FAR
ELSE
CHXBANX PROCNEAR
ENDIF
PUSH DX
MOV DX,SEQAP ;SEQUENCER ADDRESS PORT
MOV AL,OEH ;MODE CONTROL REGISTER 1 OUT DX,AL
INC DX;SEQUENCER DATA PORT
IN AL,DX;GET OLD BANR
INC AL;INCREMENT THE BANR
XOR AL,02;lNVk~l PAGE BIT
OUT DX,AL
POP DX

Table 2, p.20-RET
i CHRBANR ENDP
ENDPS
;

DSEG
SCR_BASE DD MBASE_DWORD
ENDDS
END
;**********************************************************************\
;FUNCTION:
; rd ~x_xy(xpos, ypos) read a single pixel ;

;AR~M~S:
; int xpos, ypos; X, Y coordinate of pixel to read ;

;DESCRIPTION:
; reads a single pixel at the specified X, Y coordinate.
; This function handles converting the X, Y coordinate to the linear address space of the Trident - ly map.
;*********************************************************************~1 TITLE read a pixel using X,Y coordinates NAME _RD_PX_XY
.286c INCLUDE MEMMODEL.MAC
INCLUDE TRIDENT.ASM

IF LPROG

ELSE

ENDIF

;

XPOS EQU tBP~X]
YPOS EQU tBP+X+2]
;

PSEG
PUBLIC _RD_PX XY
IF LPROG
RD_PX_XY PROC FAR
ELSE
_RD_PX XY PROC NEAR
ENDIF
PUSH BP
MOV BP,SP

Table 2, p.21-PUSH DS
PUSH SI
;

;ou.S~u.~: REAL ADDRESS USING Y * 1024 ~ X
,CO.~ PART OF ADDRESS
MOV BX,YPOS ;GET Y VALUE
SHL BX,l ;Y * 4 SHL BX,l MOV AH,BH ;GET 5~-~M~:N-L VALUE
XOR AH,02H ;ADJUST PAGE BIT
MOV AL,OEH ;MODE CONTROL REGISTER 1 MOV DX,SEQAP ;SEQUENCER ADDRESS PORT
OUT DX,AX ;SET TRIDEN~ SEGMENT REGISTER
;

,COh~uL~: OFFSET PART OF ADDRESS
XOR BH,BH;GET RID OF SEGMENT BITS
XCHG BH,BL;Y * 256 MOV AX,XPOS ;GET X VALUE
ADD AX,BX;ADD IN X OFFSET
;UPDATE THE SCREEN
;

LDS SI,DWORD PTR SCR_BASE ; SET UP POINTER TO SCREEN BASE
ADD SI,AX ;POINT TO PIX LOCATION USING DS-SI
MOV AL,tSI~ jRETURN THE INTENSITY VALUE
XOR AH,AH
POP SI
POP DS
PoP BP
RET
;

RD_PX XY ENDP
ENDPS
;

DSEG
SCR_BASE DD MBASE_DWORD
ENDDS
END
;***********************************************************************
******~
;FUNCTION:
, save_window(source address, dest address, width, height) ;AR~u~.h-S:
; char far *source, far *dest; Memory addr of source and destination , int width, height; Width and height of rectangle ;DESCRIPTION:
; Saves a window to a memory buffer.

Table 2, p.22-;********~********************************************~*****************
***~**1 TITLE Sa~es a window to a ~ ~ buffer.

NAME _SAVEWIN
;
.286c INCLUDE MEMMODEL.MAC
INCLUDE TRIDENT.ASM

;

IF LPROG

ELSE

ENDIF
;

SOURCE EQU -BP+X]
DEST EQU 9P+X+4]
XLEN EQU BP+X+8]
YLEN EQU BP+X+10]
;

PSEG
PUBLIC SAVE_WINDOW
IF LPROG
_SAVE_WINDOW PROC FAR

_SAVE_WINDOW PROC NEAR
ENDIF
;

CLI
PUSH BP
MOV BP,SP
PUSH DI
PUSH SI
PUSH DS
;

CLD
LDS SI,SOURCE ;SET UP POINTER TO SOURCE
LES DI,DEST ;SET UP POINTER TO DESTINATION
MOV CX,YLEN ;NUM8ER OF BYTES IN HEIGHT (Y) MOV AX,BYTESPERLINE ;COH~U~ INCREMENT VALUE FROM END OF ONE
. SUB AX,XLEN ;LINE TO B~lNNlNG OF NEXT LINE - SAVE IN AX
L10: MOV BX,CX ;SAVE COUNTER FOR NUMBER OF ROWS REMAINING
MOV CX,XLEN ;NUMBER OF BYTES IN WIDTH (X) REP MOVSB
OR SI,SI ;IF ZERO, NEED TO UPDATE SEGMENT

CALL INCBANK

Table 2~ p.23-L15: ADD SI,AX ;SOURCE POINTS TO ADDRESS OF NEXT LINE
JNC L20 ;IF CARRY, NEED TO UPDATE ~.1 CAL~ INCBANK ;UPDATE ~ REGISTER
L20: HOV CX,BX ;GET LOOP COuh 1 ~K
LOOP L10 ;LOOP TIL ALL ROWS DONE
POP DS
poP SI
POP DI
poP BP
STI
lû RET
SAVE ~lNVG~. ENDP
,SUBROUTINE TO UPDATE THE SEGMENT REGISTER
IF LPROG
INCBANX PROC FAR
ELSE
INCBANK PROC NEAR
ENDIF
PUSH AX
MOV DX,SEQAP ;SEQUENCER ADDRESS PORT
MOV AL,OEH ;MODE CONTROL REGISTER 1 OUT DX,AL
INC DX ;SEQUENCER DATA PORT
IN AL,DX ;GET OLD BANK
INC AL jINCREMENT THE BANK
2û XOR AL,02 ;INVERT PAGE BIT
OUT DX,AL
POP AX
RET
;

INCBANK ENDP
ENDPS
END
TITLE Set trident segment register SUBTTL Tony Scandura 10-22-90 NAME _SET_VID_SEG
INCLUDE MEMMODEL.MAC
INCLUDE TRIDENT.ASM
IF LPROG

ELSE

ENDIF
PSEG

Table 2, p.24-PUBLIC SET VID_SEG
IF LPROG
SET VID SEG PROC FAR
F~CE
SET_VID SEG PROC NEAR
ENDIF
PUSH BP
MOV BP,SP
MOV DX,SEQAP ;SEQUENCER ADDRESS PORT
MOV AH,tBP+X] ;GET HIG~ ORDER ADDRESS BITS
XOR AH,02H ;ADJUST PAGE BIT
MOV AL,O B ;MODE CONTROL REGISTER 1 OUT DX,AX ;SELECT BANX, PAGE, AND S~ N
POP BP
RET
SET VID SEG ENDP
ENDPS
END
;************************************************~*************~*******\
;FUNCTION:
; wr px_xy(xpos, ypos, value) ~rite a single pixel ;

;AR~un~lS:
; int xpos, ypos; X, Y coordinate of pixel to write 2û ' int value; Intensity value (O - 255) of pixel ;DESCRIPTION:
; Writes a single pixel of the specified value to the specified ; X, Y coordinate. Th~s function handles converting the X, Y
coordinate to the linear address space of the Trident memory map.
;**********************************************************************l TITLE Write a pixel using X,Y coordinates SUBTTL TONY SCANDURA 10/23/9o NAME WR PX_XY
;

.286c INCLUDE MEMMODEL.MAC
INCLUDE TRIDENT.ASM
;

IF LPROG

ELSE

Table 2, p. 25-ENDIF

XPOS EQU [BP+Xl YPOS EQU [BPIX~2]
IVALUE EQU [BP+X+4]
;

PSEG
PUBLIC WR_PX_XY
IF LPROG
WR PX XY PROC FAR
ELSE
WR PX XY PROC NEAR
ENDIF
PUSH BP
MOV BP~SP
PUSB DS
PUSH SI
;

;COI~u~ REAL ADDRESS USING Y * 1024 ~ X
;CO ~u~ ~.~-1 PART OF ADDRESS
;

MOV BX,YPOS ;GET Y VALUE
SHL BX~l ;Y * 4 SHL BX,l MOV AH,BH ;GET S~.. ~l VALUE
XOR AH~02H ;ADJUST PAGE BIT
MOV AL~0EH ;MODE CONTROL REGISTER 1 0 MOV DX~SEQAP ;~yu~:NCER ADDRESS PORT
2 OUT DX~AX ;SET TRIDENT S~Hkh~ REGISTER
;COMPUTE OFFSET PART OF ADDRESS
;

XOR BH~BH;GET RID OF Sr.~ ~N~ BITS
XCHG BH,BL;Y * 256 MOV AX~XPOS ;GET X VALUE
ADD AX,BX;ADD IN X OFFSET
;UPDATE THE SCREEN
i LDS SI,DWORD PTR SCR BASE ; SET UP POINTER TO SCREEN BASE
ADD SI~AX ;POINT TO PIX LOCATION USING DS:SI
MOV DX,IVALUE ;GET INTENSITY VALUE
MOV tSI],DL ;UPDATE X~Y COORD WITH INTENSITY VALUE
POP SI
pOP DS
POP BP
RET
;

_WR PX XY ENDP
ENDPS

Table 21 p.26-CA 02l22255 l998-09-l0 DSEG
SCR BASE DD MBAsE DWORD
ENDDS
END
;**********************************************************************\
;FUNCTION:
; char far *xy to ad(xpos, ypos); return pointer to x, y address ;

;ARGUMENTS:
; int xpos, ypos; X, Y coordinate of pixel to write ;

;DESCRIPTION:
; This function converts the X, Y coordinate to the linear address ; space of the Trident memory map. It sets the proper segment, and ; returns a far character pointer to the proper memory location.
;**********************************************************************/

TITLE CO~VeL~ X,Y coordinates to pointer to ~emory NAME XY TO AD
_ .286c INCLUDE MEMMODEL.MAC
INCLUDE TRIDENT.ASM

ELSE

ENDIF
;

XPOS EQU [BP+X]
YPOS EQU tBP+X+2]

PSEG
PUBLIC XY_TO_AD
IF LPROG
XY TO AD PROC FAR
ELSE
XY TO AD PROC NEAR
ENDIF
PUSH BP
MOV BP,SP

;CO..~u~ REAL ADDRESS USING Y * 1024 + X
,CO'.~U1~ S~h~l PART OF ADDRESS
MOV BX,YPOS ;GET Y VALUE

Table 2, p.27-SHL BX,l ;Y * 4 SHL BX,l MOV AH,BH ;GET ~ N~ VALUE
XOR AH,02H ;ADJUST PAGE BIT
MOV AL,OEH ;MODE CONTROL REGISTER 1 MOV DX,SEQAP ;SEQUENCER ADDRESS PORT
OUT DX,AX ;SET TRIDENT S~h ~ REGISTER
;

;COMPUTE OFFSET PART OF ADDRESS
;

XOR BH,BH;GET RID OF S~M~1 BITS
XCHG BH,BL ;Y * 256 MOV AX,XPOS ;GET X VALUE
ADD AX,BX;ADD IN X OFFSET
;RETURN SCREEN ADDRESS

;

MOV DX,MBASE SEG ;DX = ~GM~h~, AX = OFFSET
POP BP
REr ;

_XY_TO_AD ENDP
ENDPS
END
/*
Miscellaneous:
*/
tdefine TRUE (1) ~define FALSE (0) ~define ERROR (-1) I*
Display Parameters *l ~define FGDI (160) /* Fure~Lu~lld pixel intensity */
~define BGDI (60) /* Back~Luund pixel intensity */
~define MAXFGDI (255) /* M~Y; foLe~Luund pixel intensity *
~define CHRW (8) /* Character width */
~define CHRH (16) /* Character height */
~define MAXVIDBANK (5) tdefine MAx~RT~TNT's (6) tdefine MAxsT~GT~TNT~ (64) ~define B~ ~LINE ~1024) tdefine MAXVIDEOLINE 768) ~define MAXBANK~ S 0xfO00) ~define XMID (~ ~hLINE >> 1) ~define YMID (MAXVIDEOLINE >> 1) ~define XIMAGEPOS 'O
~define YIMAGEPOS O
~define XIMAGEBIN O
~define YIMAGEBIN ~7') Table 2, p.28-tdefine XHIDISPLAY (880) tdefine YDISPLAYPOS (224) t~f~ne X~ OS ~552' tdefine ~ OS 536 ~define ~NU~OS 600 tdefine Yn~U~OS ~280, tdefine A~lNS~OS '216) tdefine A~1N5~0S 720) tdefine ~ .~uYOS o) tdefine AI.~U~OS 592) tdefine LEFT IMG (0) tdefine RIGHT IMG (1) /*
Port Definitions:
*/
tdefine STAT PORT 0X310 /* Port for inputing status */
tdefine MODE PORT 0x310 /* Port for writting ~tatus */
tdefine INT PORT 0x311 /* Port for integration signal */
tdefine RSRDOUT_PORT 0x311 /* Port for resetting integrate */
tdefine RSCLR PORT 0x312 /* Port for resetting clock and fifo *l tdefine FIFO2 PORT 0x314 /* Port for inputing data from fifo2 */
tdefine FIFOl PORT 0x316 /* Port for inputing data from fifol */
/*
Bit Definitions for camera interface card:
*/
/* Status Bits: */
tdefine XRAY 0x80 tdefine LINERDY 0x40 ~define FF2 0x20 tdefine HF2 0x10 tdefine EF2 0x08 tdefine FF1 0x04 tdefine HFl 0x02 tdefine EFl 0x01 /* Mode Bits: */
~define NORMAL_M 0x00 ~define BINNED_M 0x01 ~define FLUSH M 0x02 ~define LOWER AMP 0x04 tdefine UPPER_AMP 0x08 tdefine BOTH AMP 0x0C
tdefine ~ULL_M 0x00 ~define SPLIT_M 0x01 /*
CCD Sensor Parameters:
*/

Table 2, p.29-CA 02l222~ l998-09-l0 ~define NOPIXELS (32) ~define ~O~DSlZE (1024) tdefine REALFORDSIZE (1056) tdefine BINSIzE (512) /*
Structure for menu window:
*/
struct menwindow int xlen;
int ylen;
char *labeltl6];
void far *buffer;

/~
Structure for general box:
*/
struct genbox int xpos;
int ypos;
int xlen;
int ylen;
void far *buffer;
} ;
/*
Structure for cursor:
*/
struct curwindow int xpos; /* x position for start of window */
int ypos; /* y position for start of window */
int xposl; /* x position for lower right of window */
int yposl; /* y position for lower right of window */
int ave; /* flag for average or single pixel */
int *pixdatat2]; /* pointers to data under pixel dots */
};
/*
Function key definitions:
*/

~define F1 KEY OxBB
tdefine F2 ~Y 0xBC
~define F3 KEY OxBD
~define F4 KEY 0xBE
~define F5 REY OxBF

Table 2, p.30-CA 021222~ 1998-09-10 ~define F6 REY 0XCO
tdefine F7 KEY 0xCl tdefine F8 KEY OxC2 tdefine F9 KEY OxC3 tdefine F10 KEY OxC4 tdefine Fll KEY Ox85 tdefine F12 KEY 0x86 tdefine M FIl KEY 0XAD
tdefine H F12 ~ Y OxB4 tdefine HOME KEY 0xC7 tdefine UP ARROW OxC8 tdefine PG UP OxC9 tdefine LEFT ARROW OxCB
tdefine RIGHT ARROW OxCD
tdefine END XEY OxCF
tdefine TAB KEY 0x09 tdefine DOWN ARROW OxD0 tdefine PG DOWN OxDl tdefine INS KEY 0xD2 tdefine DEL KEY OxD3 tdefine ESC KEY 0xlB
tdefine SHFT F0 0XD3 tdefine SHFT Fl 0xD4 tdefine SHFT F2 0xD5 ~define SHFT F3 0xD6 tdefine SHFT F4 0xD7 tdefine SHFT F5 OxD8 tdefine SHFT F6 0xD9 tdefine SHFT F7 0xDA
tdefine SHFT F8 0xDB
tdefine SHFT F9 0xDC
tdefine SHFT F10 OxDD
tdefine SHFT Fll 0x87 tdefine SHFT F12 0x88 tdefine ALT ENTER REY Ox9C
tdefine CTRL ENTER KEY 0x0A
****************
Header file containing system dependencies and related defines ***********************************************************************l Bit Definitions for configuring the Trident VGA:
*l tdefine DAC6BIT (0) tdefine DAC8BIT (1) tdefine ENABLE (O) tdefine DISABLE (1) tdefine C08025 (0x03) tdefine BW8025 (0x07) tdefine BW13225 (0x53) Table 2, p.31-CA 021222~ 1998-09-10 tdefine C013225 0x57 tdefine BN13243 0x54 tdefine CO13243 ~0xS9l tdefine G6404801~ (0x_2) tdefine G320200256 (0x13) tdefine G80060016 (0x5b) tdefine G640400256 ~0x5c tdefine G640480256 0xSd tdefine G800600256 ,OxSe tdefine G102476016 ,0xSf, tdefine G10247684 (0x60) tdefine G768102416 (0x61) tdefine G1024768256 (0x62) I*
Mo..ocl~ ~ text attribute bytes:
*/
tdefine BOLD (0x0f) tdefine B~rNR (0x87) tdefine NORMAL (0x07) tdefine REVERSE (0x70) tdefine UNDERLINE (0x01) tdefine BOLD_REVERSE (0xf0) tdefine BOLD UNDERLINE (0x09) /*
Base Memory:
*/
tdefine CRT_BASE_ADR ((unsigned char far *)0xA0000000) /********************************************************
This function allows annotating the video image ***************************************~*****************1 /*
Tony Scandura 11-16-90 */
tinclude <time.h>
tinclude <stdio.h>
tinclude <fcntl.h>
tinclude <syc\types.h>
tinclude <sys\stat.h>
tinclude "trident.h"
tinclude "ccd.h"
tinclude "keys.h"
tdefine ~lN~1~OS 512 tdefine YINSTPOS 0 static int kvp = 28, spot, viewptr;
static float exp = 0.5., mas;

Table 2~ p.32-CA 02l22255 1998-09-l0 static char pt idtl6~ = n?n, op_id~16] = "?", datebuft9], timebuf[9];
static char *vlewl] = {nR CC", "L CC", "R Md Lat", "L Md Latn, "R Lat Md", "L Lat Md", ~R Axilla", "L AY~ ?~ };
extern int in~play, -Y~i~play, ini ge, -Yi ~ge;
extern int mil.co~ ast, ma~on~ast, invert flag;
extern unsigned histdata[~;
extern char ~dbase fspec;
annotate(ext flag) int ext flag;
int i;
char ~ strdate(), *strtime(), *getinput();
static struct genbox box = {XINSTPOS, YINSTPOS, 36, 6};
struct genbox ~bp = &box;
pr xray Parms();
open box(bp);
print 8x16("Type A New ID ~, Then Press ENTER", XINSTPOS + 12, YlN~OS
+ 16, FGDI, BGDI);
print 8x16("--- OR ---", XINSTPOS + (13 <~ 3), YINSTPOS + 40, FGDI, BGDI);
print 8x16("Press ENTER To Leave ID Unchanged", XINSTPOS + 12, YINSTPOS
+ 64, FGDI, BGDI);
getinput(pt id, 13, 0, 10);
getinput(op id, 13, 24, 10);
rev fgd bkgd(38 << 3, O, FGDI, O, 40, 16);
print 8x16(" Arrow Keys Or Spacebar To Change ", ~ ~OS + 8, YINSTPOS
16, FGDI, BGDI);
print 8x16( n Press ENTER To Leave Unchanged ", XINSTPOS + 8, YINSTPOS +
64, FGDI, BGDI);
while~(i = get key()) != '~r') switch(i) case ' ':
case ~OWN ARROW:
case RIGHT ARROW:
case UP ARROW:
case LEFT ARROW:
~pot ~= 1;
pr xray parms();
rev fgd bkgd(38 << 3, 0, FGDI, 0, 40, 16);

Table 2, p.33-break;
}

rev_fgd bkgd(38 << 3, 0, FGDI, O, 40, 16);
if(datebuft0] - '?' l0 ext flag == TRUE) date_stamp_annot(O);
print_8x16("Type A New Date, Then Press ENTER", XINSTPOS + 12, YINSTPOS
+ 16, FGDI, BGDI);
getinput(datebuf, 55, o, 8);
print 8xl6(nTime", XINSTPOS + 100, YINSTPOS + 16, FGDI, BGDI);
getinput(timebuf, 55, 24, 8);
print_8x16(" Arrow ~eys Or Spacebar To Change ", XINSTPOS + 8, YINSTPOS +
16, FGDI, BGDI);
}

rev_fgd bkgd(5 << 3, 48, FGDI, 0, 16, 16);
while((l = get_key()) != '\r') switch(i) {

case ' ':
case UP_ARROW:
case RIGHT_ARROW:
++kvp;
if(kvp > 39 ', kvp == 1) kvp = 22;
pr xray_parms()-;
rev fgd_bkgd(5 << 3, 48, FGDI, 0, 16, 16);
break;
case DOWN_ARROW:
case LEFT ARROW:
if(--kvp < 22) kvp = 39;
pr xray parms();
rev fgd bkgd(5 << 3, 48, FGDI, 0, 16, 16);
break;
}

rev_fgd_bkgd(5 << 3, 48, FGDI, 0, 16, 16);
f(exp = 0.0 ll ext flag z TRUE) rev_fgd bkgd(42 << 3, 48, FGDI, 0, 24, 16);
while((l = get key()) != '\r') switch(i) Table 2~ p.34-case ' ':
case UP_ARROW:
case RIGHT_ARROW:
if((exp ~= O.1) > 5.0) exp =
0.1;
pr xray parms();
rev fgd bkgd(42 << 3, 48, FGDI, O, 24, 16);
break;
case DOWN ARROW:
case LEFT ARROW:
if((exp -= O.l) < O.1) exp =
5.0;
pr xray_parms();
rev fgd_bkgd(42 <~ 3, 48, FGDI, O, 24, 16);
break;
}
}

rev fgd bkgd(42 << 3, 48, FGDI, O, 24, 16);
}

rev fgd bkgd(55 << 3, 48, FGDI, O, 64, 16);
while((l = get key()) != '\r') switch(i) case ' ':
case UP ARROW:
case RIGHT_ARROW:
if(+~viewptr > 7) viewptr = O;
pr xray parms();
rev fgd_bkgd(55 << 3, 48, FGDI, O, 64, 16);
break;
case DOWN ARROW:
case LEFT ARROW:
if(--viewptr < O) viewptr = 7;
pr xray_parms();
rev fgd bkgd(55 << 3, 48, FGDI, O, 64, 16);
break;
}

rev fgd_bkgd(55 ~ 3, 48, FGDI, O, 64, 16);
close_box(bp);
}
char *getinput(buffer, xpos, ypos, length) Table 2, p.35-CA 021222~ 1998-09-10 char *buffer;
int xpos, ypos, length;
lnt ~
char pchart2], boxes[16~;
xpos *= CHRW;
pchartO] = '\xfe';
pchartl] = '\O';
for(i = O; i < length; i++) boxesti] = '\xfe';
boxesti] = '\O';
rev fgd bkgd(xpos, ypos, FGDI, O, length << 3, 16);
d{o if((boxestO] = get key()) == '\r') {

rev fgd bkgd(xpos, ypos, FGDI, O, length << 3, 16);
return;
if(boxestO] = ' ') boxestO] = '_';
while(boxestO] < 44 ¦ ¦ boxestO] > 122);
print 8xl6(boxes, xpos, ypos, FGDI, O);
*buffer = boxestO];
i = l;
qn XpOS += CHRW;
.v while((*pchar = get_key()) != '\r') {

if(*pchar - '\b') {

if(i) {

print 8xl6("\xfe", xpos -= CHRW, ypos, FGDI, O);
}
.else if(*pchar == ' ') *pchar = '_';
if(i < length && *pchar > 43 && *pchar < 123) print 8xl6(pchar, xpos, ypos, FGDI, O);
xpos += CHRW;
*(buffer ~ i++) = *pchar;
}

*(buffer + i) = '\0';

Table 2, p. 36-j = O;
while(i+~ < length) boxestj++l = ' ;
boxestj] - ~\0~;
print 8xl6(boxes, xpos, ypos, FGDI, 0);
}

pr xray par~s() int ma = 0;
char buffert64];
if(kvp ~ 21 &~ ~vp < 29) ma = (spot) ? 20 : 80;
else if(kvp > 28 ~ kvp < 35) ma = (spot) ? 17 : 70;
else if(kvp ~ 34 && kvp < 40) ma = (~pot) ? 15 : 60;
sprintf(buffer, "Patient ID : %-14sSpot Size: %-llsDate: %-8s", pt id, (spot) ? "Small" : "Large", datebuf);
print 8xl6(buffer, 0, 0, FGDI, 0);
sprintf(buffer, "Operator ID: %-14sManual Exposure Time:
%-8s", op id, timebuf);
print 8xl6(buffer, 0, 24, FGDI, 0);
sprintf(buffer, "kVp: %2d mAs: %S.lf Exposure Time:
%3.lf View: %-8s", kvp, ma * exp, exp, view[viewptr]);
print 8xl6(buffer, 0, 48, FGDI, 0);

save_annotation(fspec) char *fspec;
{

FILE *stream;
char buffert64], *strcat(), *strrchr();
int fp;
sscanf(fspec, "%[~.]", buffer);
strcat(buffer, ".datn);
if((stream = fopen(buffer, "w")) ~ NULL) {

pr error(0);
return(ERROR);
}
sscanf(fspec, "%[~.]", buffer);
strcat(buffer, ".dsp");
if((fp = open(buffer, O RDWR t O CREAT ¦ O BINARY, S_IREAD ' S_IWRITE)) ==
ERROR) Table 2, p.37-CA 021222~ 1998-09-10 pr error(O);
fclose(stream);
return(ERROR);
}

fprintf(stream, "%s Ss %d %f %d %s %s %d %d Sd %d %d %d %d %d", pt_id, op id, kvp, exp, spot, datebuf, timebuf, viewptr, mindisplay, maxdisplay, ini ~ge, ~ -xi ~ge, mincontrast, maxconLLdst, invert flag);
write(fp, hlstdata, 256 * sizeof(int));
fclose(stream);
close(fp);
if((fp = open(dbase fspec, O RDWR ¦ O CREAT ' O BINARY
O APPEND, S IREAD I S_IWRITE)) =
ERROR) {

pr_error(O);
return(ERROR);
}

sscanf~fspec, "%t~.]", buffer);
strcpy'buffer + 40, stLLc~lL(buffer, '\\'));
strcpy buffer, pt_id);
strcpy'buffer + 16, op id);
strcpy buffer + 32, datebuf);
write(_p, buffer, 50);
close(fp);
return(0);
}

rec annotation(fspec) c~ar ~fspec;
FILE ~strea~;
char buffer[64], ~strcat();
int i, fp;
sscanf(fspec, "%[~.]", buffer);
strcat(buffer, ".dat~);
if((stream = fopen(buffer, "r~)) == NULL) sprintf~pt id, "?");
sprintf'op id, n?~
sprintf'datebuf, n?~I);
sprintf timebuf, "?");
kvp = 0, exp = O.O, viewptr = 8;
pr xray parms();
return(ERROR);

Table 2, p.38-CA 021222~ 1998-09-10 sscanf(f6pec, "St~.]", buffer);
strcat(buffer, n . dsp~ );
if((fp = open(buffer, O_RDWR O O BINARY, S IREAD ' S IWRITE)) !=
ERROR) read(fp, histdata, 256 * sizeof(int));
close(fp);
i = fscanf(stream, "%s %s %d %f %d %s %s %d Sd %d %d %d %d %d %dn ~
pt_id, op_id, &kvp, &exp, &spot, datebuf, timebuf, ~ viewptr, ~ i n~ i splay, -Y~i~play, &~ini -ge, L _Yi age, &mincontraSt, ~maxco..~Last, &invert flag);
fclose(stream);
if(i != 15) ~iewptr = 8;
pr xray parms();
if(i = 15) return(0);
return(ERROR);

date stamp annot(time) int time;
strdate(datebuf);
strtime(ti ,~l.f);
time = (time + 50) / 100;
exp = time / 10.0;
pr xray parms();
}

del annotation(fspec) char *fspec;
{

FILE *stream;
char buffer[64], *strcat();
sscanf(fspec, "%[~.]", buffer);
strcat(buffer, ".datn);
unlink(buffer);
sscanf(fspec, "%[~.]n, buffer);
strcat(buffer, ".dspn);
return(unlink(buffer));
/****************************************************************
This is the main program for controlling the CCD camera (using the FORD 1024 CCD sensor and the VGA monitor) Table 2, p.39-CA 02l22255 1998-09-lO

*******~**~***~*~**~****,***~**~***~********************~***~***~/
/*
Tony Scandura lO-25-90 */
tinclude <dos.h>
~include <stdio.h>
~include "trident.h"
tinclude "ccd.h"
finclude "keys.h"
~define XCURSOR (XIMAGEBIN) ~define YCURSOR (YIMAGEBIN) ~define XCURSOR1 XIMAGEBIN + BINSIZE - 1) tdefine YCURSOR1 YIMAGEBIN + BINSIZE - 1) ~define ~u.~X 839) tdefine ~I~NU.~X 543) tdefine ~lrOS XMID - 196) ~define ~ rOS l160) tdefine XCURMODEL-:N 44) tdefine YCURMODELEN 3) ~define XCURMODEPOS 528) tdefine YCURMODEPOS MAXVIDEOLINE - YCURMODELEN * CHRH) int xmenu = ~I~:NU~OS~ ymenu = Y~NUYOS, altpixdatat49];
c~ar *fin filespec = "d:_image.fin";
char *tmp filespec = "e: image.tmp";
char *wht filespec = nf :_ image.wht";
char *drk filespec = ng: image.drk";
char *hf wht fspec = "c:\\images\\ image.wht";
char *hb wht fspec = nc:\\images~\ bimage.wht";
char *hf drk fspec = "c:\\images\\ image.drk";
char *hb drk fspec = "c:\\images\\ bimage.drX";
char *cnf filespec = nc:\\trident\\ccd.cnf";
char *stereo filespec = "c:\\trident\\ccd.cal";
struct curwindow altcursor =
{XIMAGEBIN + 256, YIMAGEBIN + 256, XCURSORl, YCURSOR1, FALSE, altpixdata};
struct genbox instbox = {XINSTPOS, YINSTPOS, 36, 3};
static char *instructions~] =
"Press ENTER When Ready For X-Ray", "Contrast/Data Window / Histogram", "Labels For ID ~ X-Ray Parameters", "Recall Image By: ID, Name, Date ", "Change Acquisition Or CRT Modes ", nOrderly Exit and Park Disk Heads", "Contrast/Data window / Histogram", "Press ENTER To Start Stereo Mode", "Change Acquisition or CRT Modes ", Table 2, p.40-CA 021222~ 1998-09-10 "Alter Rotation Angle/Select Mode"
static char *acq msgt~ =

"Resolution (1024)", "Sensitivity (512)"
extern int bin mode, crt mode, stereo mode;
main() int video mode, i;
static int pixdatal[49], pixdata2t49];
static struct menwindow menu =
{

18, 7, " -- Main Menu --", "Fl: Acquire Image", "F2:
Process Image", "F3: Annotate Image", "F4: Recall Image", "F5: Change Mode", "F6: Exit PLO~L
};
static struct menwindow stereo menu =

18, 7, "-- Stereo Menu --", "Fl: Acquire Image", "F2:
Acquire Stereo", "F3: Annotate Image", "F4: Recall Image", "F5: Change Mode", "F6: Exit Program"
};
static struct curwindow cursorw =
{XCURSOR, YCURSOR, XCURSORl, YCURSORl, FALSE, pixdatal, pixdata2};
static struct genbox exbox = {X~Xl~OS, ~:Xl-~OS, 49, 3};
struct menwindow ~wp = &menu;
struct genbox *ip = &instbox, *eb = &exbox;
6truct curwindow *cp = &cursorw, *altcp = &altcursor;

get defaults();
rec calibration();
set char adr();
init ford();
unlink(fin filespec);

video mode = get vid mode();
set gs summing(DISABLE);
set df pallet(DISABLE);
set vid mode(G1024768256);
reset grayscales();
make dirdata();
while~

Table 2, p.41-wp = (stereo_mode) ? ~stereo menu : &menu;
~ y(instructionstl], instructionststereo mode + 6~);
sL~c~(instructionst4], instructionststereo mode 1 8]);
pr settings();
if(crt mode = 1) instbox.xpos = AXINSTPOS, instbox.ypos =
AYINSTPOS;
xmenu = AXh~NU~OS, ymenu = AYM~NU~OS;
}

else if(lcrt mode) {
instbox.xpos = XINSTPOS, instbox.ypos =
YINSTPOS;
xmenu = XMENUPOS, ymenu = Y~N U~OS;
open box(ip);
switch(get menu ptr(wp, TRUE, TRUE)) case O:
close box(ip);
if(int image(fin filespec) != ERROR) chg contrast();
auto save it();
}

break;
case 0x80:
close box(ip);
if(crt mode) {
1 5 ymenu;
y~enu -= 64;
integrate(cp);
if(crt mode) ymenu = i;
break;
case 1:
close box(ip);
(stereo mode) ? do stereo() : chg contrast();
break;
case Ox81:
close box(ip);
if(crt mode) {

. i = ymenu;
ymenu -= 96;
(stereo_mode) ? calibrate() : contrast(cp, l);

Table 2~ p.42-CA 02l22255 l998-09-l0 if(crt mode) ymenu = i;
break;
case 2:
close box(ip);
annotate(FALSE);
break;
case Ox82:
close box(ip);
annotate(TRUE);
break;
case 3:
close box(ip);
rec it(o);
break;
case Ox83:
close box(ip);
if(crt mode) {

i = ymenu;
ymenu -= 48;
}

disk io(1);
if(crt mode) ymenu = i;
break;
case 4:
case Ox84:
close box(ip);
(stereo ~mode) ? get_stereo settings() :
get norm settings();
break;
case 5:
case Ox85:
close box(ip);
open box(eb~;
print 8x16("Are You Sure You Wish To Exit Program ? (y/n) n, ~ ~OS + 16, YEXITPOS + 16, FGDI, BGDI);
i = get key();
if(i =-~'y' I' i == 'Y') close box(eb);
set gs summing(ENABLE);
set df pallet~ENABLE);
set vid seg(OxOO);
set vid mode(video mode);
exit();
}

close box(eb);

Table 2, p.43-break;
}
}
make_box(xpos, ypos, width, height) int xpos, ypos, width, height;
{

int i, x = XpO5, y = ypos;
char topt64], bott64], linel64], space[64];
width--;
height -= 6;
bottO] z 200;
toptO] = 201;
linetO] = 199;
spacetO] - 186;
for(i = l; i < width; i++) bot~i] = top[i] = 205;
lineti] = 196;
spaceti] = 32;
}

botti] = 188;
topti] = 187;
lineti] = 182;
spaceti++3 = 186;
botti] = topti] = lineti] = space[i~ = '\0';
print_8x16~top, x, y, FGDI, BGDI);
print_8x16(space, x, y += 16, FGDI, BGDI);
print_8xl6(1ine, x, y ~= 16, FGDI, BGDI);
while(height--) print_8xl6(space, x, y += 16, FGDI, BGDI);
print_8xl6(1ine, x, y += 16, FGDI, BGDI);
print_8xl6(space, x, y += 16, FGDI, BGDI);
print_8x16(bot, x, y ~= 16, FGDI, BGDI);
}

open_window(wp) struct menwindow *wp;
void far ~_fmalloc();
int i, menulen, xpos = xmenu, ypos = ymenu, xlen, ylen;
char far *src, far *xy_to_ad(), far *mbuffer;
xlen = wp->xlen + 4;
ylen = wp->ylen + 4;

Table 2, p.44-CA 02l222~ l998-09-lO

if((wp->buffer = fmalloc(xlen * ylen ~< 7)) -- NULL) exit();
menulen = ylen - 5;
mbuffer = (char far *)wp->buffer;
src = xy to ad(xpos, ypos);
save window(src, mbuffer, xlen << 3, ylen << 4);
make box(xmenu, ymenu, xlen, ylen);
ypos = ymenu + 16;
print 8xl6(wp->labeltO], xpos l= 16, ypos, FGDI, BGDI);
for(i - 1, ypos += 16; i < menulen; i++) print 8xl6(wp->labelti], xpos, ypos += 16, FGDI, BGDI);
print 8xl6(wp->labelti], xpos, ypos += 32, FGDI, BGDI);

close window(wp) struct menwindow *wp;
int xpos = xmenu, ypos = ymenu;
char far *dest, far *xy to ad(), far *mbuffer;
mbuffer = (char far *)wp->buffer;
dest = xy to ad(xpos, ypos);
rec window(mbuffer, dest, wp->xlen + 4 << 3, wp->ylen + 4 << 4);
ffree(wp->buffer);
make gen box(xpos, ypos, width, height) int xpos, ypos, width, height;
int i;
char top[80], bot[80], space[80];
width--;
bottO] = 200;
toplO] = 201;
space[0] = 186;
for(i = l; i < width; i++) bot[i] = top[i~ = 205;
space[i] = 32;
bot[i = 188;
topti = 187;
space i++] = 186;
bot[i = top[i] = space[i] = '\0';

Table 2, p. 45-~ CA 021222~ 1998-09-10 print 8x16(top, xpos, ypos, FGDI, BGDI);
height -= 2;
while(height--) print 8xl6(space, xpos, ypos +- 16, FGDI, BGDI);
print 8x16(bot, xpos, ypos ~= 16, FGDI, BGDI);

open box(bp) struct genbox *bp;
void far *_fmalloc();
char far *src, far *xy to ad(), far *mbuffer;
lf((bp->buffer = fmalloc(bp->xlen * bp->ylen << 7)) = NULL) exit();
mbuffer = (char far *)bp->buffer;
src = xy to ad(bp->xpos, bp->ypos);
save window(src, mbuffer, bp->xlen << 3, bp->ylen << 4);
make gen box(bp-~xpos, bp->ypos, bp->xlen, bp->ylen);

close box(bp) struct genbox *bp;
int xpos = bp->xpos, ypos = bp->ypos;
char far *dest, far *xy to ad(), far ~mbuffer;
mbuffer = (char far *)bp->buffer;
dest = xy_to ad(xpos, ypos);
rec window(mbuffer, dest, bp->xlen << 3, bp->ylen <~ 4);
_ffree(bp->buffer);
}

get menu ptr(wp, window flag, inst_flag) struct menwindow *wp;
int window flag, inst flag;
{

int i, revx, revy, revlen, menupt = 0, xinst, yinst;
xinst = instbox.xpos + 16;
yinst = instbox.ypos + 16;
revlen = (wp->xlen ~< 3) + 4;
revx = xmenu + 14, revy = ymenu + 3 * CHRH + menupt * CHRH;
if(window flag) open_window(wp);
rev fgd_bkgd(reVX, revy, FGDI, BGDI, revlen, C~RH);
while(l) {

if(inst flag) ~print 8xl6~instructionsl~enupt]~ xinst, yins~, Table 2, p.46-~GDI, BGDI);
switch(i = get key()) {

case UP_ARROW:
case LEFT_ARROW:
if(menupt = wp-~ylen - 2) menupt--;
rev_fgd_bkgd(revx, revy, FGDI, BGDI, revlen, CHRH);
revy -= CHRH << l;
rev fgd_bkgd(revx, revy, FGDI, BGDI, revlen, CHRH);
}

else if(menupt > 0) menupt--;
revv -= CHRH;
rev_fgd bkgd(revx, revy, FGDI, BGDI, revlen, 32);
}

break;
case DOWN_ARROW:
case RIGHT_ARROW:
if(menupt ~ wp->ylen - 3) {

menupt++;
rev_fgd_bkgd(revx, revy, FGDI, BGDI, revlen, 32);
revy += CHRH;
else if~menupt = wp->ylen - 3) menupt++;
rev_fgd_bkgd(revx, revy, FGDI, BGDI, revlen, CHRH);
revy += CHRH << l;
rev fgd_bkgd(revx, revy, FGDI, BGDI, revlen, CHRH);
}

break;
case '\r':
if(window_flag) close_window(wp);
return(menupt);
break;
case CTRL_ENTER_REY:
if(window_flag) close_window(wp);
return(menupt ' 0x80);
break;
case ESC KEY:
if(window_flag) close window(wp);

Table 2, p.47-return(wp->ylen - 2);
break;
case SHFT F1:
dlsp_f ull screen();
break;
/*
case SHFT F12:
if(window flag) close window(wp);
print screen();
if (window flag) open_window(wp);
rev fgd bkgd(revx, revy, FGDI, BGDI, revlen, CHRH);
break;
10 *~
i -= Fl_REY;
if (i > -1 && i < wp->ylen - 1) menupt = i;
rev fgd bkgd(revx, revy, FGDI, BGDI, revlen, CHRH);
revy = ymenu + 3 * CHRH + menupt ~ CHRH;
if(i == wp->ylen - 2) revy += CHRH;
rev fgd bkgd(revx, revy, FGDI, BGDI, revlen, CHRH);
if(window flag) close window(wp);
return(menupt);
}
}

move_menu(cp) struct curwindow *cp;
{

static struct menwindow menu =
15, 7, " - Move Menu -", "F1: Cursorn, "F2: Upper Left", "F3: Upper Right", "F4: Lower Left", "F5: Lower Right", " F6: Main Menu"
};
struct menwindow ~wp;
wp = &menu;
while(l) {

switch(get menu_ptr(wp, TRUE, FALSE)) {

case 0:
move cursor(cp, FALSE, LEFT_IMG);
wr_cursor(cp->pixdatatO], cp->xpos, cp->ypos);
xmenu = (cp->xpos > XMENUMAX) ? ~I~NU~AX:

Table 2, p. 48-cp->xpos;
ymenu = (cp-~ypos > Y~u~AX) ? Y~ENUMAX :
cp->ypos;
break;
case 1:
xmenu = ymenu = 0;
break;
case 2:
xmenu = XMENUMAX;
ymenu = o;
break;
case 3:
xmenu = 0;
ymenu = YMENUMAX;
break;
case 4:
xmenu = XMENUMAX;
ymenu = Y..~NU~AX;
break;
case 5:
case 6:
return;
break;
}
}

analyze(cp) struct curwindow *cp;
{
static struct menwindow menu =
14, 5, " - Analyze -", "Fl: Histograms", "F2: Plot Data", ~F3: List Data", "F4: Main Menu"
};
struct menwindow *wp;
wp = &menu;
while(l) switch(get menu ptr(wp, TRUE, FALSE)) case O:
histogram(cp);
break;
case 1:
sav_image(tmp_filespec);
plot(cp);
get_key();
if(restore_image() == 'y') Table 2, p.49-rec_image(tmp_filespec);
break;
case 2:
print_data(cp);
break;
case 3:
return;
break;
}
}

10 }
get norm_settings() int i, oldcrtmode, oldbinmode;
static struct menwindow menu =
24, 7, n -- Mode Change Menu --", "F1: Hi Resolution (1024)n, "F2: Hi Sensitivity (512)~', "F3: Single Image Display", "F4: Side By Side Display", "F5: Turn Stereo Mode on", ~F6: Main Menu/No Changes"
};
struct menw~ndow *wp;
oldcrtmode = crt_mode;
oldbinmode = bin_mode;
wp = &menu;
switch(i = get_menu_ptr(wp, TRUE, FALSE)) {

case O:
case 1:
bin_mode = i;
break;
case 2:
case 3:
crt_mode = i - 2;
break;
case 4:
stereo_mode = bin_mode = crt_mode = l;
break;
case 5:
break;
}

if(oldbinmode != bin_mode) init_ford();
if(old~Lt -de != crt_mode && !crt_mode) clear_image(l);
}

Table 2, p. 50-CA 02l222~ l998-09-l0 pr_settings() char buft64~;
make gen box(XCuh~OD~OS, YCURMODEPOS, XCURMODELEN, YCURMODELEN);
sprintf(buf, "Acquisition Mode: High %s", acq msg[bin_mode~);
print 8x16(buf, XCURMODEPOS + (CHRW c< 1), YCURMODEPOS + CHRH, FGDI, BGDI);
clear_image(lr) int lr;
int i;
char far *dest, far *xy to ad();
lr *= BINSIZE;
for(i = 0; i < YIMAGEBIN + BINSIZE + 72; i++) dest = xy_to_ad(lr, i);
*dest = '\0', mem to_mem(dest, dest + 1, BINSIZE - l);

/***************************************************************
These functions ~anipulate the luminance tables and data in ~emory to change the brightness and contrast ***************************************************************l /*
Tony Scandura 11-05-90 */
~include <stdio.h>
tinclude "ccd.h"
~include "keys.h"
tdefine EX_COMPILE (FALSE) ~define XHISTPOS f544) tdefine YHISTPOS 88) tdefine XINSTPOS XHISTPOS) ~define YINSTPOS ~280 + YHISTPOS) #define HISTI (160) #define O INC 4 tdefine S_INC 1 tdefine XSLOFBX (XMIDISPLAY - 124) ~define YSLOFBX (YDISPLAYPOS) #define XSLICEBX (416) ~define YSLICEBX (20) ~define MAXBINS 256 Table 2, p.51-CA 021222S~ 1998-09-10 extern struct curwindow altcursor;
extern char *fin_filespec, *tmp filespec;
extern int -Y~i~play~ play;
int ~ r.tL~st, inContrast~ invert flag = l;
unsigned histdatar256];
contrast(cp, ext flag) struct curwindow *cp;
{

int menupt;
static int hist on;
static struct menwindow menu =
22 ~ 8 ~ n - Processing Menu -", "F1: Contrast I Window", "F2: Region Of Interest", "F3: Histogram Equalize", "F4: Stretch Contrast", "F5: Convolution F~lter", "F6: Histogram On/Off", "F7: - Main Menu -"
static struct menwindow ext menu =
22 ~ 12, ~ ~ Processing Menu -", "F1: Contrast /
Window", "F2: Region Of Interest", "F3: Histogram Equalize", "F4: Stretch Contrast", "F5: Convolution Filter", "F6: Histogram On/Off", "F7: Disk Services", "F8: Std Deviation", 2 0 ~F9: Modify LUTs", "F10: Set Display Bits", " -- Main Menu --"
};
struct menwindow *wp;
struct curwindow *altcp;
altcp = &altcursor;
wp = (ext flag) ? &ext menu : &menu;
if(hist on) histgram(cp, 0, O, 1);
while(1) {

menupt = get menu_ptr(wp, TRUE, FALSE);
if(hist on) histgram(cp, O, 0, O);
switch(menupt) {

case O:
chg_contrast();
break;
case 1:
. xvcursor(cp);
breal:;

Table 2, p.52-CA 021222~ 1998-09-10 case 2:
equalize~cp);
break;
case 3:
stretch(cp);
break;
case 4:
convolve(cp);
break;
case 5:
hist on ~= 1;
break;
if(ext_flag) switch(menupt) {

case 6:
disk io(O);
break;
case Ox86:
disk io(l);
break;
case 7:
get stdev(fin_filespec, cp);
break;
case 8:
lumtable(cp);
break;
case 9:
set_display_bits(TRUE);
break;
case lO:
if(hist_on) histgram(cp, O, O, O);
return;
break;
else if(menupt = 6) if(hist on) histgram(cp, o, o, O);
return;
}

if(hist_on) histgram(cp, O, 0, 1);

}
}

/*************************************************************
This function ~anipulates the luminance look up tables ********************************~****************************/

Table 2~ p.53-lumtable(cp) struct curwindow *cp;
int i, j, xstart, ystart, x, y;
char buf~32];
int xprint = XSLOFBX + (CHRW ~< 1), yprint = YSLOFBX + CHRH;
static int offset = 0, slope = 10;
static unsigned char far *ptable, far buffert768~, graybuf[256];
unsigned char *pgraybuf, far *xy_to_ad();
static struct genbox boxl = ~XSLOFBX, YSLOFBX, 31, 3};
static struct genbox box = ~XHISTPOS, YHISTPOS, 36, 11};
struct genbox *bp, *bpl;
bp = &box;
bpl = &boxl;
open box(bp);
xstart = x = XHISTPOS + (CHRW ~< 1);
ystart = y = YHISTPOS + 112;
for (i = 0, pgraybuf = graybuf; i < 256; i++) {

y = ystart;
wr_px_xy(x++, y - *pgraybuf++, HISTI);
y = CHRH;
ystart += 2;
while(y--) ptable = xy to_ad(xstzrt, ystart++);
for(i = 0; 1 < 256; i++}
*ptable++ = i;
}

ystart++;
ptable = xy to ad(xstart, ystart++);
for(i = 0; 1 < 256; i++) *ptable++ = HISTI;
y = 4;
ystart++;
while(y--) ptable = xy to_ad(xstart, ystart++);
for(i = 0; 1 < 256; i++) *ptable++ = (i % 32) ? BGDI : HISTI;
*--ptable = HISTI;
}

ystart++;
print_8x8(n0 32 64 96 128 160 l9Z 224 256", 0 xstart - 3, ystart, 3 HISTI, BGDI);
xstart = x = XHISTPOS + (CHRw << l);
ystart = y = YHISTPOS + 112;

Table 2~ p.54-while((i = get key()) I= '\r') switch(i) case UP ARROW:
offset += O INC;
break;
case DOWN ARROW:
offset -= O INC;
break;
case LEFT ARROW:
slope += S INC;
break;
case RIGHT ARROW:
slope -= S_INC;
break;
case ' ':
slope = 10;
off6et = 0;
break;
case F1_REY:
. invert videotXIMAGEPOS, YIMAGEPOS, FORDSIZE, MAXVIDEOLINE);
break;
}

x = xstart;
for (i = O, pgraybuf = graybuf; i < 256; i++) wr_px xy(x++, y - *pgraybuf+l, BGDI);
for(i = O, ptable = buffer, pgraybuf = graybuf; i < 256;
i++) j = (slope * i) I 10 + offset >> 2;
if(j < O) j = ~;
if(j > 63) j = 63;
*pgraybuf++ = j;
*ptable++ = ;
*ptable++ = ;
*ptable++ = ;
}
load grayscale(buffer);
x = xstart;
for (i = O, pgraybuf = graybuf; i < 256; i++) wr px xy(x++, y - ~pgraybuf++, HISTI~;
}

close box(bp);
open box(bpl);
print 8xl6(nConvert To In Memory Data ? ", xprint, yprint, HISTI, BGDI);
i = get key();
close box(bpl);
if (i -- 'y') Table 2, p.55-CA 021222S~ 1998-09-10 translate(cp, buffer);
slope = lo;
offset = 0;
for(i = 0, ptable = buffer, pgraybuf = graybuf; i < 256; i++) {

j = (slope * i) / 10 + offset >> 2;
if(j < 0) j = ~;
if(j > 63) j = 63;
~ ybuf++ = j;
*ptable++ = j;
*ptable++ = j;
*ptable++ = j;
}
load grayscale(buffer);
}

/***************************~*******************************************
******
This function performs linear contrast stretch on data in ~ideo memory ************************************************************~***********
*****/
/*
Tony Scandura 4-22-90 */
stretch(cp) struct curwindow *cp;
int x, y, ystart, xstart, cols, rows;
unsigned big, small;
unsigned char far *pmem, far *xy_to_ad();
big = 0, small = 255;
xstart = (cp->xpos < cp->xposl) ? cp->xpos : cp->xposl;
cols = abs(cp->xpos - cp->xposl) + 1;
y = ystart = (cp->ypos ~ cp->yposl) ? cp->ypos : cp->yposl;
rows = abs(cp->ypos - cp->yposl) + 1;
while(rows--) {

pmem = xy to ad(xstart, y++);
x = cols;
while(x--) ~ .
small = (small < *pmem) ? small : *pmem;
big = (big > *pmem) ? big : *pmem;
pmem+~;
) big -= small;

Table 2, p.56-CA 02l22255 l998-09-lO

y = ystart;
rows = abs(cp->ypos - cp->yposl) + 1;
while(rows--) {

pmem = xy to ad(xstart, y++);
x = cols;
while(x--) {

*pmem -= small;
A~ - I I = (255 * *pmem) / biy;
}
?

~if (EX COMPILE = TRUE) *************
. This function turns the grayscale display on and off ***********************************************************/
tdefine GRAYW 32 tdefine GRAY~ 2S6 tdefine GRAYX 990 tdefine GRAYY 112 gray_bar() void far * fmalloc();
int i, xpos, ypos, cols;
static int onoff;
unsigned char far *src, far *dst, far *xy_to_ad();
static char far *mbuffer;
xpos = GRAYX;
ypos = GRAYY;
if(onoff A= 1) if((dst = mbuffer = (char far *)_fmalloc(GRAYW * GRAYH)) == NULL) exit();
src = xy_to_ad(xpos, ypos);
save_window(src, dst, GRAYW, GRAYH);
ypos = GRAYY;
for(i = O; i < 256; i++) cols = GRAYW;
src = xy to_ad(xpos, ypos++);
while(cols--) *src++ = i;
}

Table 2, p.57-CA 021222~ 1998-09-10 else src - ~buffer;
dst ~ xy to ad(xpos, ypos);
rec window(src, dst, GRAYW, GRAYH);
ffree(mbuffer);
}

/***********~**********~***********~********************~
This function performs the level slicing function *****************~**~********~********************~****~/
slice() int i, j, x, y, xl, x2, yl, y2, y3, offset = 0, ~lope = 10;
unsigned char far *ptable, far *data, far *xy to ad();
char buf[32], topt64], botl64], spacet64];
int xprint = XSLICEBX + (CHRW << 1), yprint = YSLICEBX + CHRH;
static int upper = 100, lower = 100;
static unsigned char far buffer[768];
static sLr~ genbox box = ~XSLICEBX, YSLICEBX, 47, 3};
struct genbox *bp;
bp = &box;
xl = bp->xpos;
x2 = xl ~ (47 << 3);
yl = bp->ypos;
y2 = yl + CHRH;
y3 = y2 + CHRH;
bottO] = 200;
toptO~ = 201;
spacetO~ = 186;
for(i = 1; i < 47; i++) botti] = topti] = 205;
spaceti] = 32;
}

botti = 188;
topti = 187;
space i++~ = 186;
botti = topti] = sPaCeti] = '\0';
open box(bp);
print_8x16 top, xl, yl, upper, o);
print 8x16 space, xl, y2, upper, 0);
print_8x161bot, xl, y3, upper, 0);
sprintf(buf, "$3d - %3d ", lower, upper);
print_8x16(buf, xprint, yprint, upper, 0);

Table 2, p.58-j = CHR~;
x = xprint + 84;
y = yprint;
while(j--) data = xy to ad(x, y++);
for~i = 0, i-< 256; i++) *data++ = i;
for(i = 0, ptable = buffer; i < 256; i++) j = (i < lower ,l i > upper) ? 0 : 150;
*ptable++ = j;
*ptable++ = j;
*ptable++ = j;
}

load grayscale(buffer);
spacetl] = '\0';
while((i = get key()) != '~r') switch(i) case UP ARROW:
if(upper < 255) upper++;
break;
case DOWN ARROW:
if(upper > lower) upper--;
break;
case LEFT ARROW:
if(lower > 1) {

lower--;
upper--;
}

break;
- case RIGHT_ARROW:
if(upper < 255) {

lower++;
upper++;
}

break;
for(i = 0, ptable = buffer; i < 256; i++) j = (i < lower '' i > upper) ? 0 : 150;
*ptable++ = j;
*ptable++ = j;

Table 2, p.59-CA 021222~ 1998-09-10 *ptable++ = j;
load grayscale(buffer);
print 8x16~top, xl, yl, upper, O);
print_8x16 space, xl, y2, upper, O);
print 8xl6.'space, x2, y2, upper, o);
print 8x16'bot, xl, y3, upper, O);
sprintf(bu~ 3d - %3d", lower, upper);
print 8x16(buf, xprint, yprint, upper, O);
}

for(i = 0, ptable = buffer; i < 256; i++) j = i >> 2;
*ptable++ = j;
*ptable++ = j;
*ptable++ = j;
load_grayscale(buffer);
close_box(bp);
}

~endif /************************************************************
This function translates the LUTs to in memory values *************************************************************/
translate(cp, buffer) struct curwindow *cp;
unsigned char far *buffer;
int x, y, ystart, xstart, cols, rows;
unsigned char far *src, far *xy to ad();
xstart = (cp->xpos < cp->xposl) ? cp->xpos : cp->xposl;
cols = abs(cp->xpos - cp->xposl) + 1;
y = ystart = (cp->ypos < cp->yposl) ? cp-~ypos : cp->yposl;
rows = abs(cp->ypos - cp->yposl) + l;
while(rows--) {

src = xy to_ad(xstart, y++);
x = cols;
whilç(x--) *src++ = (*(buffer + *src * 3)) << 2;
}

/****************************************
*****
This function performs histogram equalization on data in video memory ***********************************************************************~

Table 2, p.60-****/
/*
Tony Sc~n~ra 4-22-90 */
equalize(cp) struct curwindow *cp;
int i, x, y, ystart, xstart, cols, rows, bins;
unsigned char far *pmem, far *xy_to_ad();
long histtMAXBINS], big, histotal, scale = 255;
xstart = (cp->xpos < cp->xposl) ? cp->xpos : cp->xposl;
cols = abs(cp->xpos - cp->xposl) + l;
y = ystart = (cp->ypos < cp->yposl) ? cp->ypos : cp->yposl;
rows = abs(cp->ypos - cp->yposl) + l;
bins = MAXBINS;
for (i = 0; i < bins; i++) histti] = O;
while(rows--) pmem = xy_to_ad(xstart, y++);
x = cols;
while(x--) histti]++;

for (i = 0, histotal = 0; i < bins; i++) histotal += histti];
histti] = histotal;
for (i = 1, big = hist[0] i < bins; i++) big = (big > hist i]) ? big : histti];
for (i = 0; i < bins; i++!
histti] = (histti~ * scale) / big;
y = ystart;
rows = abs(cp->ypos - cp->yposl) + l;
while(rows--) pmem = xy_to_ad(xstart, y++);
x = cols;
while(x--) i = *pmem;
*pmem++ = histti];

Table 2, p.61-CA 02l222~ l998-09-l0 chg contrast() void *malloc();
int i, j, k, maxmin, increment, display_flag = 0, mintick, maxtick;
int xstart, ystart, x, y, oldmode;
unsigned char far *pcrt, far *xy to ad();
unsigned char *pgraybuf, *graybuf, *graybar, *pgraybar;
static struct genbox box = {XHISTPOS, YHISTPOS, 36, 14);
static struct genbox instbox = ~XINSTPOS, YINSTPOS, 36, 11};
struct genbox *bp = ~box, *ib = ~instbox;
extern int crt mode;
if(access(fin filespec, 0) == ERROR) pr error(7);
return(ERROR);
if((graybuf = graybar = (char *)malloc(512)) = NULL) pr error(5);
return(ERROR);
oldmode = crt mode;
crt mode = ERROR;
graybar += 256;
open box(bp);
xstart = x = XHISTPOS + (CHRW << l);
ystart = y = YHISTPOS + 104;
print 8x8("Contrast / Data Window", XHISTPOS + 56, YHISTPOS
+ 16, HISTI, BGDI);
maxmin = maxcontrast - incsntrast;
increment = ( -Y~j~play - in~i~play) / 25;
increment++;
for(i = 0, pgraybuf = graybuf, pgraybar = graybar; i < 256; i++) j = (((i << 4) - mincon~dst) * 63L) / ~ in;
if(j > 63) j = 63;
if(~ < 0) j = ~;
*pgraybuf = (invert flag) ? ~j & 0x3F : j;
*pgraybar++ = *pgraybuf << 2;
wr_px xy(x++, ystart - *pgraybuf++, HISTI);

y ~= 72;
x = xstart Table 2, p.62-for (i = 0; i ~ 256; i++, x++) i = Y;
k = (histdatati] > 160) ? 160 : histdata[i~;
while (k--) pcrt = xy to_ad(x, j--);
*pcrt = HISTI;
}
y += 2;
pcrt = xy_to ad(xstart, y++);
for(i = 0, i-< 256; i++) *pcrt++ = HISTI;
j = 4;
Y++;
while(j--) {

pcrt = xy to ad(xstart, y++);
for(i = 0; i < 256; i++) *pcrt++ = (i % 32) ? BGDI : HISTI;
*--pcrt = HISTI;
}

Y++;
print_8x8("0 1024 2048 3072 4096", xstart - 3, y, HISTI, BGDI);
y ~= 12;
i = y;
j = 8;
while(j--) mem_to_mem((char far *)graybar, xy to ad(xstart, i++), 256);
maxtick = ((maxc~l.LLast > 4094) ? 4095 : maxcontrast) >> 4;
mintick = ((min~on-Ldst < 1) ? 0 : mincontrast) >> 4;
i = y + 9;
j = 4;
while(j--) wr px xy(xstart + mintick, i, HISTI);
wr_px-xy(xstart + maxtick, i++, HISTI);
~ OS + 16;
j = YINSTPOS + 16;
open box(ib);
print 8x16( nuP ARROW : Increase Contrast", i, j, FGDI, BGDI);
print 8x16("DO~ ARROW: Decrease Contrast", i, j += CHRH, FGDI, BGDI);
print 8x16("LEFT ARROW: Data Window Left", i, j ~= CHRH, FGDI, BGDI);

Table 2~ p.63-print 8x16(nRIGHT ARROW: Data Window Rightn, i, j += CHRH, FGDI, BGDI);
print_8x16("SPACE BAR : Restore Auto-Gray",i, j I= CHRH << 1, FGDI, BGDI);
print_8xl6("Fll KEY : Invert Video On CRT", i, j ~= CH~H, FGDI, BGDI);
print_8x16("ENTER KEY : Return To Main Menu",i,j += CHRH <<
1,FGDI,BGDI);
k = l;
while(l) while(i = readkey()) switch(i) case RIGHT ARROW:
display_flag = 1;
maxcontrast += increment * k;
minco,.tlast ~= increment * k;
break;
case LEFT ARROW:
dIsplay flag = 1;
maxcontrast -= increment * k;
mincontrast -= increment * k;
break;
case UP_ARROW:
display_flag = l;
maxco~ ast -= increment * k;
mincontrast += increment * k;
if(maxcontrast - mincontrast < 1) {
maxcontrast += increment * k;
mincontrast -= increment * k;
break;
case DOWN ARROW:
dIsplay flag = 1;
maxcontrast ~= increment * k;
mincontrast -= increment * k;
break;
case ' ':
display flag = 1;
maxcG..~Last = ~isplay;
mincontrast = in~i~play;
break;
case Fll_KEY:
. display_flag = l;
invert_flag ~= 1;
break;
case Fl_REY:

Table 2, p.64-case F2 KEY:
case F3 KEY:
case F4 KEY:
case F5 KEY:
case F6 KEY:
case F7 KEY:
case F8 ~Y:
case F9 KEY:
display flag = l;
j = (maxcon~dst + mincontrast >> 1) -(i - F1 XEY << g);
Dax~ st -= j;
incontraSt -= j;
break;
case SHFT Fl:
dlsp full screen();
break;
case '\r':
case ESC KEY:
close box(bp';
close box(ib,;
free((void * graybuf);
crt mode = o_dmode;
return;
break;
}

x = xstart;
for (i - o, pgraybuf = graybuf; i < 256; i++) wr px xy(x++, ystart - *pgraybuf++, BGDI);
- i n = maxcon-rast - mincontrast;
x = xstart;
for(i = 0, pgraybuf = graybuf, pgraybar =
graybar; i < 256; i++) {

j = (((i << 4) - mincontrast) * 63L) /
maxmin;
if(j > 63) j = 63;
if(j < 0) j = O;
*pgraybuf = (invert flag) ? ~j & Ox3F :
;
*pgraybar++ = *pgraybuf << 2;
wr px xy(x++, ystart - *pgraybuf++, HISTI);
}
i = Y;
j = 8;
while(j--) mem to_mem((char far *)graybar, xy to_ad(xstart, i++), 256);
~i = y + 9;

Table 2, p.65-CA 02l22255 l998-09-l0 j = 4;
while(j--) {

wr_px xy(xstart + mintick, i, BGDI);
wr lpx xy(xstart + maxtick, i++, BGDI);
}

maxtick = ((maxco..~Ldst > 4094) ? 4095 :
maxcontrast) >> 4;
mintick = ((mincontrast < 1) ? 0 : mincontrast) >~ 4;
i = y + 9;
j = 4;
while(j--) {

wr px_xy(xstart + mintick, i, RISTI);
wr px xy(xstart + maxtick, i++, HISTI);
}
if(display_flag) display_image(fin_filespec, mincontrast, maxcontrast);
display_flag = k = O;
i = readkey();
while(readkey()) k++;
if(i && k < 2) ungetch(i);
k = (k < 8) ? 1 : 2;
}

~ }

1~************************************************************
This function implements a 3 X 3 convolution filter The filters implemented are:
HIPASS Dx LOPASS Dy AVERAGE
LAPLACE
*************************************************************/
/*
Tony Scandura 07/18/85 04110/90 */
~include <stdio.h>
~include "ccd.h"
~include "keys.h~
tdefine XRESTOREBX 208 ~define YRESTOREBX 432 extern char *tmp filespec;

Table 2, p. 66-CA 02l222~ l998-09-lO

convolve(cp) struct curwindow *cp;
int menupt;
static struct menwindow menu =
14, 8, " - Filter -", "Fl: Lopass", "F2: Hipass", "F3:
Average", "F4: Laplace", "F5: Edge", "F6: Restore", "F7: Main ~0 Menu~
struct menwindow *wp;
wp = &menu;
sav_image(tmp_filespec);
while(l) switch(menupt = get_menu_ptr(wp, TRUE, FALSE)) {

case 0:
case 1:
case 2:
case 3:
conv3x3(cp, menupt);
break;
case 4:
edge filter(cp);
break;
case 5:
rec image(tmp filespec);
break;
case 6:
case 7:
return;
break;
}

edge_filter(cp) struct curwindow *cp;
int menupt;
static struct menwindow menu =
17, 10, " - Edge Filter -", "Fl: Sobel", "F2: Edge", "F3: Ripple", "F4: Line", "F5: Point", "F6: Edge Subspace", "F7: Line Subspace", Table 2, p.67-CA 021222~ 1998-09-10 "F8: Restore~, "F9: Previous Menu"
struct menwindow *wp;
wp = &menu;
while(l) switch(menupt = get_menu_ptr(wp, TRUE, FALSE)) case O:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
conv3x3(cp, menupt + 4);
break;
case 7:
rec image(tmp_filespec);
break;
case 8:
case 9:
return;
break;

}

}
conv3x3(cp, nfilter) struct curwindow *cp;
int nfilter;
{

void *malloc();
unsigned char far *p, far *pp, far *xy_to_ad();
unsigned char *s, *t, last, ~pm;
int new, xpos,-ypos, xstart, ystart, xwidth, rows;
int 1, n, cols;
if((s = t = (unsigned char ~)malloc(BINS~ZE << 1)) == NULL) pr_errort5);
return(ERROR);
}
t l= BINSIZE;
xstart = xpos = (cp->xpos < cp->xposl) ? cp->xpos : Cp->XpOS1;
xwidth = cols = abs(cp->xpos - cp->xposl) + l;
ystart = ypos = (cp->ypos < cp->yposl) ? cp->ypos : cp->yposl;
rows = abs(cp->ypos - cp->yposl) ~ I;

Table 2, p.68-CA 021222~ 1998-09-10 p = xy to ad(xpos, ypos++);
pm = s;
n = cols;
while(n--) *pm++ = *p++;
1 = rows - 2;
while(l--) pp = xy to ad(xpos, ++ypos);
for(n - O; n < cols; n++) *(t + n) = *pp++;
pp = t;
p = xy to ad(xpos, --ypos);
++ypos;
last = *p++;
pm = s;
n = cols-2;
while(n--) switch(nfilter) {
case 1: /* HIPASS */
new = 9 * p[O] - last - p[l]
- pmt0] - pm~1] - pm[2]
~ PPtO] - pptl] - pp[2];
break;
case 2: /* AVERAGE */
new = (PtO] + last + p[l]
+ pm[o] + pmtl] + pmt2]
+ PPtO] + pp[l] + pp[2]) / 9;
break;
case 0: /* LOPASS */
new = ((PtO~ ~< 2) + (last <~ 1) + (p[l]
<< 1) + pmtO] + (pmtl] << 1) + pmt2]
+ PPt~] + (pptl] << 1) + ppt2]) >~ 4;
break;
case 3: /* LAPLACE */
new = ((p[O] << 3) - last - p[1]
- pmtO] - pmtl] - pmt2]
~ PPt~] ~ PPtl] - ppt2]) << 1;
break;
case 4: /* SOBEL */
new = abs(-pmt0] - (pmll] << 1) - pm[2]

Table 2, p.69-CA 021222~ 1998-09-10 + pp~O] + (pp~l] C< 1) +
ppt2] ) + abs((p[l] ~ 1) -(last << 1) - pm[O] + pm[2]
- pp[O] + pp[2~);
break;
case 5: /* EDGE */
new = abs(pmtO] + (pmt1] * 181 >> 7) +
pmt2]
~ PP[O] - (pp~l] * 181 >~ 7) - pp[2]) + abs(pm[O] - pm[2]
+ (last * 181 >> 7) -(p[l] * 181 >> 7) + PPtO] ~ ppt2]);
break;
case 6: /* RIPPLE */
new = abs(-pmt1] + (Pmt2] * 181 >> 7) + last - p[1]
- (pptO] * 181 >> 7) +
pptl] ) - + abs((pmtO] * 181 >> 7) - pmtl]
- last + ptl]
- + pptl] ~ (ppt2] * 181 >> 7));
break;
case 7: /* LINE */
new = abs(pmtl]
- last - ptl]
+ pptl] ) + abs(-pmtO] + pmt2]
+ pp[O] - pp[2]);
break;
case 8: /* POINT */
new = abs(pmtO] - (Pmtl] << 1) + pmt2]
- (last << 1) + (ptO] <<
2) - (ptl] << 1) + pp[O] - (pp[l] << 1) +
pm[2]) + abs(-(pm[O] << 1) +
pm[l] - (pmt2] << 1) + last + (PtO] << 2) +
p[l]
_ (pp[o] << 1) + pptl] -(ppt2] << 1));

Table 2, p.70-CA 021222~ 1998-09-10 break;
case 9: /* EDGE SUBSPACE */
new = abs(pmtO] + (Pmtl] * 181 >> 7) +
pm[2]
~ PPt~] ~ (pptl] * 181 >> 7) ~ ppt2]) + abs(pmtO~ - pm[2]
+ (last * 181 >> 7) -~Ptl] * 181 >> 7) + pptO] ~ ppt2] ) + abs(-pmtl] + (Pmt2] *
181 >> 7) + last - p[1]
- (pptO] * 181 >> 7) +
pp[l]) + abs((pmtO] * 181 >> 7) - pmtl]
- last + ptl]
+ pptl] ~ (ppt2] * 181 >> 7));
brea~;
case 10: /* LINE SUBSPACE */
new = abs(pmtl]
- last - ptl]
+ pptl]) + abs(-pm[0] + pmt2]
+ PPtO] ~ ppt2] ) + abs(pm~0] - (pm[l~ <<
1) + pm[2]
- (last c< 1) + (p[0] <<
2) - (ptl] << 1) + pptO] - (pptl] << 1) +
pmt2]) + abs(-(pmtO] << 1) +
pmtl] - (pmt2] << 1) + last + (ptO] << 2) +
Ptl]
_ (ppto] << 1) + pptl] -(ppt2) << 1));
break;
}
*pm++ = last;
last = *p;
if(new < 0) new = o;
if(new > Oxff) new = Oxff;
*p++ = new;
PP++;
}

pmtO] = last;

Table 2, p.71-CA 021222~ 1998-09-10 } pm[l~ = *p++;
free((void *)s);

restore_image() int i, xprint = XRESTOREBX + (CHRW << 1), yprint = YRESTOREBX +
CHRH;
static struct genbox box = {XRESTOREBX, YRESTOREBX, 28, 3};
struct genbox *bp;
bp = &box;
open box(bp);
print 8xl6(nRestore Original Image ?", xprint, yprint, FGDI, BGDI);
i = get key();
close box(bp);
return(i);
} * ****************************************
This function delays for the specified number of one millisecond intervals ********************************************************/
delay ( i ) nt i;
int onemilli = 1245; /* counter for 1 ms delay */
int j; /* 126 = 6MHz, 179 =
8M~z, 3ss = 12MHz */
/* 1245 = 33MHz */
while (i--) {

for (j = o; j < onemilli; j++);
}

/*****************************************************
These functions control the disk services for the VGA display adapter in graphics mode ******************************************************/
/*
Tony Scandura 04/13/90 */
,~include <stdio.h>
~include <dos.h>
~include <fcntl.h>
~include <sys\types.h>
,~include <sys\stat.h>

Table 2, p.72-CA 021222~ 1998-09-10 ~include "trident.h"
tinclude Uccd.h'' ~include nkeyS~hn tdefine XFSPECBOX XMID - 188 tdefine Y~ OX YMID - 224 tdefine ~KR~BOX XMID - 116 tdefine YERRORBOX YMID - 64 char df path[64] = nc:\\images\\ford", df_exttl6] = ".img";
static lnt xerr = XERRORBOX + (CHRW << 1), yerr = YERRORBOX + CHRH;
static int xfspec = x~-~r:~OX + (CHRW << 1), yfspec = YFSPECBOX + CHRH;
static struct genbox fspec_box = {x~S~ OX, YFSPECBOX, 47, 8};
static struct genbox error box = ~XERROR~30X, YERRORBOX, 29, 7};
extern char *fin_filespec;
extern int mincontrast, maxcontrast, crt_mode;
disk io(ext_flag) int ext_flag;
int i;
char buf[64~;
char *filespec, *gr_gets(), *strcat(), *strcpy();
char *get_filespec(), *get_smfilespec(), *search_filespec();
static struct menwindow menu =
19, 6, -- Disk Menu --", "Fl: Recall An Image", "F2: Disk Directory", "F3: Save An Image", "F4: Delete A
File", "F5: - Main Menu -"
};
static struct menwindow ext menu =
19 ~ 10 ~ n -- Disk Menu --", "Fl: Recall An Image", "F2: Disk Directory", "F3: Save An Image", "F4: Delete A
File", "F5: Change Dir Path", "F6: Recall Screen", "F7: Save 8CRT Whole", "F8: Save 8CRT Image","F9: - Main Menu -"
};
struct ~enwindow *wp;
struct genbox *bp;
bp = &fspec_box;
wp = (ext_flag) ? &ext_menu : &menu;
while(l) switch(i = get_menu_ptr(wp, TRUE, FALSE)) {

Table 2~ p.73-CA 021222~ 1998-09-10 case 0:
rec_it(ext flag);
break;
case 1:
get_dir(strcat(strcpy(buf, df_path), "\\*.img"));
- break;
case 2:
save_it(fin_filespec, ext_flag);
break;
case 3:
open_box(bp);
print 8x16(nFile Deletion:", xfspec, yfspec, FGDI, BGDI);
filespec = (ext_flag) ?
get filespec~buf, xfspec, yfspec + (CHRH << 1)) :
get_s~filespec(buf, xfspec, yfspec + (CHRH << l));
close box(bp);
if(*fllespec != '.') (unlink(filespec)) ? pr_error(1) :
del_annotation(filespec);
break;
}

if(ext_flag) switch(i) case 4:
open_box(bp);
print 8xl6("Change Default Path:", xfspec, yfspec, FGDI, BGDI);
sprintf(buf, "Default Path = ~s", df_path);
print_8x16(buf, xfspec + (6 << 3), yfspec +
(CHRH<<l), FGDI, BGDI);
sprintf(buf, "Default Ext = ~Sn ~ df ext);
print 8x16(buf, xfspec + (6 << 3), yfspec + CHRH
* 3, FGDI, BGDI);
print_8x16(nEnter New Default Path: ", xfspec, yfspec + CHRH *
5, FGDI, BGDI);
sscanf(gr_gets(buf, xfspec + (24 << 3), yfspec +
CHRH * 5, 20), "%s", df path);
close_box(bp);
break;
case 5:
open_box(bp);
print_8xl6("Image Recall:", xfspec, yfspec, FGDI, BGDI);
filespec = get_filespec(buf, xfspec, yfspec Table 2, p.74-CA 021222~ 1998-09-10 (CHRH << l));
close_box(bp);
if(*fllespec - '.') break;
rec image(filespec);
break;
case 6:
case 7:
open box(bp);
print 8xl6(nImage Save:", xfspec, yfspec, FGDI, BGDI);
filespec = get_filespec(buf, xfspec, yfspec (CHRH << l));
close box(bp);
if(*fllespec -- '.') break;
if(exist file(filespec) != ERROR) ~ 6) ? sav image(filespec) :
sav only_image(filespec);
break;
case 8:
return;
break;
else if(i -- 4) return;
}

rec it(ext flag) int ext_flag;
char ~filespec, *get_filespec(), *get smfilespec(), *strrchr();
char buft64], *pchr;
struct genbox *bp;
int oldcL~ ~'e;
bp = ~fspec box;
open_box(bp);
print_8xl6(nImage Recall:", xfspec, yfspec, FGDI, BGDI);
filespec = (ext_flag) ?
get filespec(buf, xfspec, yfspec + (CHRH << 1)) :
search_filespec(buf, xfspec, yfspec + (CHRH << l));
close_box(bp);
if(*filespec == '.') return;
if(copy_image(filespec, fin-filespec) != ERROR) dup_image();

Table 2, p.75-CA 021222~ 1998-09-10 (rec_annotation(filespec)) ?
display_fullgry(fin filespec) :
display image(fin fllespec, mincontrast, maxcontrast);
}

pchr = strrchr(filespec, '\\');
if(*(pchr + 1) = ' ' && *(pchr + 2) == 'S') {

*(pchr + 2) = 'T';
if(copy image(filespec, fin filespec) != ERROR) ~ --oldcrtmode = crt mode;
crt mode = l;
dup image();
display image(fin_filespec, mincontrast, maxcontrast);
rec stereo(filespec);
pr stereo result();
crt_mode - oldcrtmode;
}
}

save_it(src fspec, ext flag) char *src fspec;
int ext_flag;
char *filespec, *get filespec(), *get_smfilespec(), buft64];
struct genbox *bp;
bp = &fspec_box;
open box(bp);
print 8xl6(nImage Save:", xfspec, yfspec, FGDI, BGDI);
filespec = (ext flag) ~ get f~lespec(buf, xfspec, yfspec ~ (CHRH
<< 1) ) get_smfilespec(buf, xfspec, yfspec f (CHRH << 1) );
close box(bp);
if(*filespec = '.') return;
if(exist file(filespec) != ERROR) if(copy_image(src fspec, filespec) != ERROR) save annotation(filespec); ~
}

auto_save_it() static int i;
char filespect64], *get_new name();
if(exist_file(get_new name(filespec)) != ERROR) Table 2, p. 76-CA 021222~ 1998-09-10 if(copy image(fin filespec, filespec) != ERROR) save annotation(filespec);

char *get_new name(buffer) char *buffer;
static int i;
char datet9], buft64];
_strdate(date);
d{o sprintf(buffer, "%s\~%c%c%c%c%d%s", df_path, date[O], date[l], date[3], datet4], i, df ext);
sprintf(buf, "%s\\_S%c%c%d%s", df_path, datet3], date[4], i, df ext);
if(i++ > 9999) break;
while(!access(buffer, O) 11 !access(buf, 0));
return(buffer);

/*****************************************************
This function displays the specified directory *****************************************************l /*
Tony Scandura 07/16/86 */
tdefine MAXFILES 360 get_dir(pathname) char *pathname;
union REGS inregs, outregs;
static char dta[128];
char buft32~;
int ret_code, nfiles, x = O, y = O;
extern char *tmp_filespec;
sav_image(tmp_filespec);
nfiles = 1;
reset_vid_mode();
inregs.h.ah = Oxla;
inregs.x.dx = (unsigned)dta;
ret_code = intdos(&inregs, &outregs);

Table 2, p.77-inregs.h.ah = Ox4e;
inregs.x.dx = (unsigned int)pathname;
inregs.x.cx = O;
if(ret code = intdos(&inregs, &outregs)) switch(ret_code) case 2:
case 18:
pr_error(8);
break;
default:
pr_error(9);
break;
}

rec_image(tmp_filespec);
return;
}

else print_8xl6(dta + 30, x, y, FGDI, sGDI);
nfiles++;

do {

x += lZ8;
if(x == BYTESPERLINE) x = O, y += 16;
inregs.h.ah = Ox4f;
ret_code = intdos(&inregs, &outregs);
if(lret_code) print_8xl6(dta + 30, x, y, FGDI, BGDI);
nfiles++;

}

if(nfiles > MAXFILES) print_8x16("*** Press any key to continue ***'~, XMID - 132, MAXVIDEOLINE
- 16, FGDI, BGDI);
get_key();
nfiles = l;
x = -128;
y = O;
reset_vid_mode();
}
while(!(ret_code));
print_8x16("*** Press any key to continue ***",XMID -132, y +=
48, FGDI, BGDI);

Table 2, p.78-CA 021222~ 1998-09-10 get_key();
rec image(tmp_filespec);

/**************************************************
Function to read screen images from the disk **************************************************/
/*
Tony Scandura 8/1/89 3/13/90 */
rec image(filespec) char *filespec;
int fp, ret code, bank;
unsigned int nbytes = 0x8000;
unsigned char far *pscreen, far *xy_to_ad();
union REGS inregs, ouL~ e~s;
struct SREGS segregs;
inregs.h.ah = 0x3d;
inregs.x.dx = (unsigned int)filespec;
inregs.h.al = 0;
fp = intdos(&inregs, &outregs);
if (outregs.x.cflag) pr error(l);
return(ERROR);
}

for(bank = 0; bank < 24; bank++) pscreen = xy to ad(0, bank * 32);
inregs.h.ah = 0x3f;
inregs.x.bx = fp;
inregs.x.cx = nbytes;
inregs.x.dx = FP OFF(pscreen);
segregs.ds = FP SEG(pscreen);
ret_code = intdosx(&inregs, &outregs, &segregs);
if (outregs.x.cflag) {
pr_error(2);
return(ERROR);
}
inregs.h.ah = Ox3e;
inregs.x.bx = fp;-ret_code = intdos(&inregs, &outregs);
if (outregs.x.cflag) Table 2, p.79-CA 021222~ 1998-09-10 pr_error(3);
return(ERROR);
return(o);
}

/**********************************************
Function to save an screen image to disk ********************************~*************t J*
Tony Scandura 18/05/90 */
sav_image(filespec) char *filespec;
int fp, ret code, bank;
unsigned int nbytes = Ox8000;
unsigned char far *pscreen, far *xy_to_ad();
union REGS inregs, outregs;
struct SREGS segregs;
if (~fp = open(filespec, O_RDWR I O_CREAT ' O_8INARY, S_IREAD ' S_IWRITE)) == ERROR) pr_error(O);
return(ERROR);
}

for (bank = O; bank ~ 24; bank++) pscreen = xy_to_ad(0, bank * 32);
inregs.h.ah = Ox40;
inregs.x.bx = fp;
inregs.x.cx = nbytes;
inregs.x.dx = FP_OFF(pscreen);
segregs.ds = FP_SEG(pscreen);
ret_code = intdosx(&inregs, &outregs, &segregs);
if (GuLre~s.x.cflag) pr_error(4);
return(ERROR);
}

inregs.h.ah = 0x3e;
inregs.x.bx = fp;
ret_code = intdos(&inregs, &OutLe~s);
if (vu~Legs.x.cflag) Table 2~ p.80-CA 021222~ 1998-09-10 pr error(3);
~u~l(ERROR);
}

return(o);
}

sav only i~age(filespec) char *filespec;
int fp, ret code, y;
unsigned int nbytes = BINSIZE;
unsigned char far *pscreen, far *xy to ad();
union REGS inregs, ouLLe~;
struct SREGS segregs;
if ((fp = open(filespec, O RDWR I O CREAT ' O BINARY, S IREAD ¦ S IWRITE)) == E~ROR) {

pr error(O);
return(ERROR);
}

for (y = YIMAGEBIN; y < YIMAGEBIN + BINSIZE; y++) pscreen = xy_to ad(O, y);
inregs.h.ah = ox40;
inregs.x.bx = fp;
inregs.x.cx = nbytes;
inregs.x.dx = FP OFF(pscreen);
segregs.ds = FP SEG(pscreen);
ret code = intdosx(&inregs, &outregs, &segregs);
if (ouL~egs.x.cflag) {

pr error(4);
return(ERROR);
}

inregs.h.ah = Ox3e;
inregs.x.bx = fp;
ret code = intdos(&inregs, &outregs);
if (outregs.x.cflag) {

pr error(3);
return(ERROR);
}
return( o );

/******************************************************
This function gets a filespec from the keyboard Table 2, p. 81-CA 02l222~ l998-09-l0 and returns a pointer to it ***************~**************************************1 I*
Tony Scandura 05-09-88 04-13-90 *l char *get_filespec(buffer, xpos, ypos) char *buffer;
int xpos, ypos;
char filespect64];
char *pbuf, *gr_gets(), *strchr(), *strcat(), ~strcpy();
sprintf(filespec, "Default Path = %s", df_path);
print_8xl6~filespec, xpos + (6 <~ 3), ypos, FGDI, BGDI);
sprintf(filespec, "Default Ext = %s", df_ext);
print_8xl6(filespec, xpos + (6 <~ 3), ypos += CHRH, FGDI, BGDI);
print 8xl6(nFilespec ? ", xpos, ypos += CHRH << 1, FGDI, BGDI);
sprintf(filespec, "%s\\", df path);
pbuf = gr gets(buffer, xpos + (11 << 3), ypos, 32);
if(strchr(pbuf, '.') - NULL) strcat(pbuf, df ext);
if(*pbuf ~ *(pbuf + 1) c ~ *pbuf -- '.') return(pbuf);
strcattfilespec, pbuf);
strcpy(buffer, filespec);
return(buffer);
}
/*****************************************************~
This function gets a filespec from the keyboard and returns a pointer to it ******************************************************l char *get smfilespec(buffer, xpos, ypos) char *buffer;
int xpos, ypos;
{

char filespect64];
char *pbuf, *gr_gets(), *strchr(), *strcat(), *strcpy();
print_8xl6(nType Image Name, Then Press ENTER: ", xpos, ypos, FGDI, BGDI);
print_8x16("--- OR ---~, xpos + (16 << 3), ypos + CHRH + 8, FGDI, BGDI);
print 8xl6(nPress ENTER To Return To Disk Menu", - xpos + (4 << 3), ypos +
CHRH * 3, FGDI, BGDI);
sprintf(filespec, "%s\\", df_path);

Table 2~ p.82-CA 021222~ 1998-09-10 pbuf = gr gets(buffer, xpos + (35 << 3), ypos, 8);
if(strchr(pbuf, '.') -- NULL) strcat(pbuf, df_ext);
if(*pbuf ~ ' *(pbuf + 1) == '~ *pbuf z= '.') return(pbuf);
strcat(filespec, pbuf);
strcpy(buffer, filespec);
return(buffer);
}

char *gr_gets(buffer, xpos, ypos, length) char *buffer;
int xpos, ypos, length;
int i, j;
char pchart2], boxes[64];
pchartl] = '\0';
for(i = 0; i < length; i++) boxesti] = '\xfe';
boxes[i] = '\0';
print_8xl6(boxes, xpos, ypos, FGDI, BGDI);
i = O;
while((*pchar = get_key()) != '\r') if(*pchar - '\b') {

if(i) print_8xl6(n\xfe", xpos -= CHRW, ypos, FGDI, BGDI);
}
}

else {

if(i < length && *pchar > 31 && *pchar < 128) {

print 8x16(pchar, xpos, ypos, FGDI, BGDI);
xpos += CHRW;
~(buffer + i++)= ~pchar;
}
}

*(buffer + i) = '\0';
j = O;
while(i++ < length) boxestj++] = ' ';
boxes[j] = '\0';
print_8xl6(boxes, xpos, ypos, FGDI, BGDI);
return(buffer);

Table 2, p. 83-CA 021222~ 1998-09-10 /**********************************~*~**********************************
*}***
This function checks if a file exists and returns an error if it does **********************************************}*************}***********
* * * * /
/*
Tony Scandura 04-16-90 */
exist_file(filespec) char *filespec;
struct genbox *eb;
eb = &error_box;
if(!access(filespec, 0)) open_box(eb);
print_8x16(" W A R N I N G ", xerr, yerr, FGDI, BGDI);
print_8x16(" The File Already Exists", xerr, yerr + (CHRH <<
1), FGDI, BGDI);
print_8x16(" Overwrite File ? (y/n)", xerr, yerr + (CHRH <<
2), FGDI, BGDI);
if(get_key() != 'y') close_box(eb);
return(ERROR);
}

close_box(eb);
}

return(0);

}

pr_error(errornum) int e~ L ~L IIUIU;
struct genbox *eb;
static char *error-msgt] =
"The File Cannot Be Opened", "The File Does Not Exist !", "Errors While Reading File", "Errors While Closing File", "Error While Writting File", Not Enough Memory !", There Is No Image To Save~, Table 2, p. 84-CA 02l222~ l998-09-l0 " There Is No Image", n No Files Were Found", n The Path Does Not Exist", "Error While M~i ng D-base", "WARNING: Optics distorted"
};
eb = &error box;
open box(eb);
print 8x16(" E R R O R ", xerr, yerr, FGDI, BGDI);
print_8xl6(error msgterrornum], xerr, yerr + (CHRH << 1), FGDI, BGDI);
print 8x16("Press ANY Rey To Continue", xerr, yerr + (CHRH ~<
2), FGDI, BGDI);
get key();
close box(eb);
}

/****************************************************************
These functions output a ll in~nce histogram to any of the following: the CRT, the line printer, or a Lotus File.
****************************************************************l /*
Tony Scandura 04-02-86 11-18-8602-14-8904-07-89 ~/
~include <stdio.h>
~include <fcntl.h>
~include n ccd.h"
~include "keys.h"
~define CRT SCALE fO0 tdefine PRT SCALE 50 ~define MA~INS 256 ~define XHISTPOS (XIMAGEBIN + BINSIZE + 8) ~define YHISTPOS (YIMAGEBIN) ~define ~ OX 324 ~define ~ OX 160 ~define XERRORBOX 396 ~define YERRORBOX 320 histogram(cp) struct curwindow *cp;
{

int menupt;
int out device, factor = O;
static struct menwindow menu =
13, 8l "- t Of Bins -", "Fl: 8", "F2: 16", "F3: 32", Table 2, p.85-CA 021222~ 1998-09-10 "F4: 64n, ~ F5: 128n, ~F6: 256n, "F7: Main Menu"
};
struct menwindow *wp;
wp = &menu;
if((out device = get_outdevice()) != ERROR) switch(menupt = get_menu_ptr~wp, TRUE, FALSE)) case O:
case 1:
case 2:
case 3:
case 4:
case 5:
factor = 5 - menupt;
break;
case 6:
case 7:
return;
break;
histgram(cp, out device, factor);
}

histgram(cp, out_device, factor, onoff) struct curwindow ~cp;
int out_device, factor, onoff;
{

FILE *stream;
int i, x, y, bins, scale;
int xstart, ystart, xwidth, cols, rows;
int xprint = ~ OX + (CHRW <~ 1), yprint = YFSPECBOX + CHRH;
unsigned char far *pmem, far *xy_to_ad();
long big, histotal;
static long histtMAXBINS], phist~MAXBINS];
char *get_filespec(), bUft64~;
static struct genbox box = {XHISTPOS, YHISTPOS, 36, 11};
static struct genbox fspec_box = {XFSPECBOX, YFSPECBOX, 47, 8~;
static struct genbox error_box = {XERRORBOX, YERRORBOX, 29, 7~;
struct genbox *bp, *eb, *fs;
bp = &box;
eb = &error_box;
fs = ~fspec_box;
if(! onoff) {

close_box(bp);
return;

Table 2, p.86-CA 021222~ 1998-09-10 xstart = (cp->xpos < Cp->Xposl) ? cp->xpos : cp->xposl;
xwidth = abs(cp->xpos - cp->xposl1 + 1;
ystart = (cp->ypos < cp->yposl) ? cp->ypos : cp->yposl;
rows = abs(cp->ypos - cp->yposl) + l;
scale = (out_device) ? PRT_SCALE : CRT_SCALE;
bins = MAXBINS >> factor;
for (i = 0; i < bins; i++) histti] = 0;
while(rows--) {

pmem = xy to_ad(xstart, ystart++);
cols = xwldth;
while(cols--) {

i = Al - I I >> factor;
hlstti]++;
}
for (i = 1, big = histt0]; i < bins; i++) big = (big > histti]) ? big : histti];
for (i = o, histotal = 0; i < bins; i++) histotal += histti];
phistti] = (scale * histti]) / big;
}
switch(out_device) {

case 0:
open box(bp);
xstart = x = XHISTPOS + (CHRW << l);
ystart = y = YHISTPOS + 122;
for (i = O; i < bins; i++) {

y = ystart;
while (phist[i]--) pmem = xy_to_ad(x, y--);
} *pmem = FGDI, x++;
}

y = CHRH;
ystart += 2;
while(y--) {

pmem = xy_to_ad(xstart, ystart++);
for(i = 0, i < 256; i++) Table 2, p.87-CA 021222~ 1998-09-10 ~, I I = i;
ystart++;
pmem = xy to ad(xstart, ystart++);
for(i = 0, i-< 256; i++) *~ 1l = FGDI;
y = 4;
ystart++;
while(y--) pmem = xy to_ad(xstart, ystart++);
for(i = 0; i < 256; i++) ~ l = (i % 32) ? BGDI :
FGDI;
*--pmem = FGDI;
}

ystart++;
print 8x8(nO 32 64 96 128 160 192 224 256", xstart - 3, ystart, FGDI, BGDI);
/*
get key();
*l break;
case 1:
prheaders();
for (i = o; i < bins; i++) if(readkey() == ESC_KEY) fprintf(stdprn, "\n\f");
break;
}

x = i << factor;
fprintf(stdprn, ~%8li%5d to %3d ", hist[i], x, x - 1 + (1~< factor));
x = (int)(scale - phistti]);
while(phist[i]--) fprintf(stdprn, "%c", 254);
pspace(x);
fprintf(stdprn, " %7.2f", hist[i] *~00.0 / histotal);
fprintf(stdprn, "\n");
}

fprintf(stdprn, "\n\n");
fprintf(stdprn, "%81d Total Bytes\n\f", histotal);
fflush(stdprn);
break;
case 2:

Table 2, p . 88-CA 021222~ 1998-09-10 x = XERRORBOX + (CHRW << 1);
y = YERRORBOX + CHRH;
open_box(fs);
print_8x16("Enter Filespec For Lotus File: n, xprint, yprint, FGDI, BGDI);
if((stream = fopen(get_filespec(buf, xprint, yprint + (CHRH << 1)), "w")) == NULL) {

open_box(eb);
print_8x16(" E R R O R ", x, y, FGDI, BGDI);
print_8x16("The File Cannot Be Opened", x, y += CHRH << 1, FGDI, BGDI);
print 8xl6("Press ANY Key To Continue", x, y += C~RH << 1, FGDI, BGDI);
get_key();
close_box(eb);
close_box(fs);
break, }

close_box(fs);
fprintf(stream, "\nRange\" \"\~ \"Number\"\n");
for (i = O; i < bins; i++) x = i << factor;
fprintf(stream, "%d %d %li\n", x, x -- 1 + (1 <<
factor), histti]);
fprintf(stream, "\"Tot Bytes\" \n\" %ld\n", histotal);
fclose(stream);
break;
}

}
prheaders() int i;
pspace(23);
fprintf(stdprn, "L U M I N A N C E H I S T O G R A
~0 M\n\n\n\n\n");
pspace(39);
fprintf(stdprn, "Relative Percent\n");
pspace(3);
fprintf(stdprn, "~ Of Range");

Table 2, p.89-CA 02l222~ l998-09-l0 pspace(S7);
fprintf(stdprn, "%% Of\nn);
fprintf(stdprn, "Occurances of Data ");
for (i = 10; i < 101; i += 10) fprintf(stdprn, " %3d", i);
fprintf(stdprn, n Total\n");
pspace(21);
for (i = l; i < 51; i++) (i % 5) ? fprintf(stdprn, "%c", 196) : fprintf(stdprn, "%c", 193);
fprintf(stdprn, "\n");
pspace(number) int number;
while(number--) fprintf(stdprn, ~ n);
}

get_outdevice() int menupt;
static struct menwindow menu =
18, 9, "- Out Device -", " CRT", " Printer", " Lotus File", " Main Menu"
};
struct menwindow *wp;
wp = &menu;
switch(menupt = get_menu_ptr(wp, TRUE, FALSE)) {

case o:
case 1:
case 2:
return(menupt);
break;
case 3:
case 4:
return(ERROR);
break;
}

} *************************************
******************************************************/
I*
Tony Scandura 11/07/91 *l Table 2, p. 90-CA 021222~ 1998-09-10 tinclude <stdio.h>
~include <dos.h>
~include <fcntl.h>
~include <sys\types.h>
tinclude <sys\stat.h>
~include "trident.h"
tinclude "ccd.h"
tinclude "keys.h"
extern char df_patht], df_extt];
char *dbase_fspec = "h:dirdata.dir";
static char dtat128], dir_buft64];
static char *sav_fspec = "h:box";
make_dirdata() union REGS inregs, outregs;
int fp;
if((fp = open(dbase_fspec, O_RDWR ¦ O_CREAT ¦ O_BINARY
O_TRUNC, S_IREAD ' S_IWRITE)) -ERROR) {

pr_error(O);
return(ERROR);
}

inregs.h.ah = Oxla;
inregs.x.dx = (unsigned)dta;
intdos(&inregs, &outregs);
sprintf(dir_buf, "~s%s", df_path, "\\*.dat");
inregs.h.ah = Ox4e;
inregs.x.dx = (unsiqned int)dir_buf;
inregs.x.cx = O;
if(intdos(&inregs, &outregs)) pr_error(10);
close(fp);
L eLUL ~ ( ERROR);
}

if(readdata(fp)) close(fp);
return(ERROR);
}

inregs.h.ah = Ox4f;
while(!intdos(&inregs, &outregs)) if(readdata(fp)) {

Table 2, p.91-CA 021222~ 1998-09-10 close(fp);
return(ERROR);
}

close(fp);
return(o);
}

readdata(fp) int fp;
FILE *stream;
char buffert64];
int i;
sprintf(buffer, "~s\\%s", df_path, dta + 30);
sscanf(dta + 30, "%[~.]n, dir_buf + 41);
if((stream = fopen(buffer, "r")~ == NULL) pr error(lO);
return(ERROR);
fscanf(stream, "%s %s %*d %*f %*d %s %*s %d", dir_buf, dir_buf + 16, dir_buf + 32, &i);
fclose(stream);
write(fp, dir_buf, 50);
return(0);

char *search_filespec(buffer, xpos, ypos) char *buffer;
int xpos, ypos;
char buft64], hitst256];
char *pbuf, *gr gets();
int i, length, fp, x, y, revx, revylen;
*buffer = '.';
y = (ypos -= 8);
wr 8_box(sav_fspec, xpos, 44 * CHRW, ypos + CHRH * 7, 27 *
CHRH);
pbuf = buf;
*pbuf++ = '\xc9';
for(i = 1; i < 43; i++) *pbuf++ = '\xcd';
*pbuf++ = '\xbb';
*pbuf = '\0';
xpos += 6 * CHRW;
print_8x16(nFl: Patient ID :", xpos, ypos, FGDI, BGDI);
print_8x16(nF2: Patient Name:", xpos, ypos + CHRH, FGDI, BGDI);
print_8x16("F3: Patient Date:", xpos, ypos + CHRH * 2, FGDI, BGDI);

Table 2, p.92-print_8x16("F4: Return To ~ain Menu", xpos, ypos + 8 + CHRH
3,FGDI,BGDI);
do if((i = get_key()) = ESC_KEY) L~Lu~ ..(buffer);
while(i < Fl REY ¦ ¦ i > F4_KEY);
i -= Fl KEY;
xpos +- CHRW * 18;
y +z CHRH * i;
switch(i) case O:
pbuf = dir buf;
length = 15;
break;
case 1:
pbuf = dir buf + 16;
length = 15;
break;
case 2:
pbuf = dir buf + 32;
lenyth = 8, break;
case 3:
return(buffer);
break;
}

gr_gets(buffer, xpos, y, length);
if(i -- 2) *(buffer + 2) = *(buffer + 5) = '/';
if((fp = open(dbase_fspec, O RDwR ' O BINARY)) == ERROR) pr error(0);
*buffer = '.';
return(buffer);
}

xpos -= CHRW * 24;
ypos += CHRH * 7;
y = ypos - CHR~;
length = x = 0;
print_8x16(buf, xpos, y += CHRH, FGDI, BGDI);
while(read(fp, dir buf, 50)) if(!strcmpl(buffer, pbuf)) ~LL~y(hits + (length++ * 9), dir_buf + 41);
sprintf(buf,"\xba %-16s%-16s%-8s \xba", dir_buf, dir_buf + 16, dir buf + 32);
print_8x16(buf, xpos, y += CHRH, FGDI, BGDI);
~ if(length > 26) break;

Table 2, p.93-pbuf = buf;
*pbuf++ = '\xc8';
for(i = l; i < 43; i++) *pbuf++ = '~xcd';
*pbuf++ - '\xbc';
*pbuf = '\o';
print 8x16(buf, xpos, y += CHRH, FGDI, 8GDI);
y = ypos + CHRH;
revx = xpos + 14;
revylen = 40 * CHRW + 4;
if(length--) rev fgd bkgd(revx, y, FGDI, BGDI, revylen, CHRH);
while((l = get key()) != '\r') switch(i) case UP ARROW:
case RIGHT ARROW:
if(x) {

x----;
y -= CHRH;
rev_fgd_bkgd(revx, y, FGDI, BGDI, revylen, 32);
}

break;
case DOWN_ARROW:
case LEFT ARROW:
if (x < length) {

x++;
rev_fgd_bkgd(revx, y,~GDI, BGDI, revylen, 32);
y += CHRH;
}

break;
case F4 XEY:
case ESC_REY:
rd_8_box(sav_f~pec, xpos, 44 * CHRW, ypos, (length + 3) ~ CHRH);
*buffer = '.';
return(buffer);
break;
}

}
sprintf(buffer, "Ss\\%s%s", df_path, hits + (x * 9), df_ext);
rd_8 box(sav_fspec, xpos, 44 * CHRW, ypos, (length + 3) *-CHRH);

Table 2, p.94-return(buffer);
}
wr_8_box(fspec, x, xlen, y, ylen) char *fspec;
int x, xlen, y, ylen;
{

int linelen, fp;
unsigned char far *pscreen, far *xy to ad();
union REGS inregs, o~L~eg~;
struct SREGS segregs;
if((fp = open(fspec, O_RDWR I O_BINARY ¦ O_CREAT ' O TRUNC, S_IREAD ' S_IWRITE)) -ERROR) pr_error(O);
return(ERROR);
}

while(ylen--) pscreen = xy_to ad(x, y++);
inregs.h.ah = Ox40;
inregs.x.bx = fp;
inregs.x.cx = xlen;
inregs.x.dx = FP OFF(pscreen);
segregs.ds = FP_SEG(pscreen);
intdosx(&inregs, Loutregs, ~segregs);
if (outregs.x.cflag) pr_error(4);
return(ERROR);
}
}

inregs.h.ah = Ox3e;
inregs.x.bx = fp;
intdos(&inregs, ~OU~LegS);
if (ou~.e~.x.cflag) pr_error(3);
~LuL.l(ERROR);
?

return(o);
}

rd_8_box(fspec, x, xlen, y, ylen) char *fspec;
int x, xlen, y, ylen;

Table 2, p.95-CA 021222~ 1998-09-10 int linelen, fp;
unsigned char far *pscreen, far *xy to ad();
union REGS inregs, ~uL.e~s;
struct SREGS segregs;
if((fp = open(fspec, O RDWR I O ~3INARY)) = ERROR) pr_error(O);
return(ERROR);
}
while(ylen--) {

pscreen = xy to ad(x, y++);
inregs.h.ah = Ox3f;
inregs.x.bx = fp;
inregs.x.cx = xlen;
inregs.x.dx = FP_OFF(pscreen);
segregs.ds = FP_SEG(pscreen);
intdosx(&inregs, &~uL~eys~ &segregs);
if (ou LL e~ ~ . X . cflag) {

pr_error(2);
return(ERROR);
}

inregs.h.ah = Ox3e;
inregs.x.bx = fp;
intdos(&inregs, &outregs);
if (out.~gs.x.cflag) {

pr error(3);
return(ERROR);
}

return(O);
/*************************************************************
This function CO~I~LO1S integrating the CCD camera and and capturing and displaying the integrated image *************************************************************l /*
Tony Scandura 03/16/90 ~0 tinclude <stdio.h>
tinclude <fcntl.h>
tinclude ~sys\types.h>
tinclude <sys\stat.h>
tinclude "ccd.h"

Table 2~ p.96-CA 021222~ 1998-09-10 ~include nkeys.hn tinclude "trident.h"
tdefine FOCUSLINES (128) tdefine HST CONT M~N (8) ~define HST ~ HOLD (25) tdefine XWAITPOS (XMID - 236) tdefine YWAITPOS (160) tdefine EXTRACHRS (18) ~define MA~n~TA (4096) ~define MAXGREY (2S5) tdefine XDISPRNGPOS (XIMAGEBIN + 216) ~define YDI~KN~OS (YIMAGBIN + BINSIZE + 8) ~define XZOOMPOS (XIMAGEBIN + 216) tdefine YZOOHPOS (YIMAGEBIN + BINSIZE + 80) tdefine DARXOFFSET 50 tdefine TOPBORDER 128 int maxwhite, ~Yi -~e, minimage, ~-Y~ play, mindisplay;
int bin mode = BINNED M, crt_mode = 0, disp_mode = SPLIT_M, stereo_mode;
extern lnt xmenu, ymenu, ~ G.ILLast~ mincontrast, invert_flag;
extern unsiqned histdata[];
extern struct curwindow altcursor;
extern struct menwindow quit_menu;
extern struct genbox instbox;
extern char *fin filespec, *tmp_filespec, *wht filespec, ~drk_filespec;
extern char *hf=ht_fspec, *hb_wht_fspec, ~hf=rk_fspec, *hb_drk_fspec;
extern char *cnf filespec;
static int int tlme = 100, stst_method = 1, crtbitshft = 4, int_formula = 2;
static int out_amp = LOWER_AHP, zoomflag;
static char *ststresponsest] = {nEntered Int Time ", "External On X-Ray", "X-Ray & Int Time "};
static char *formresponsest] = {nI ", "I - D
"I / W ", "(I
- D) / (W - D)"};
static char *outresponsest] = {"Lower Amp Only", "Upper Amp Only", "Upper ~ Lower "};
static char *binresponsest] = {nFull Resolution", "Bin To 512 "};
static char *dispresponsest] = {"Single Image", "Side By Side"};
static char *steresponsest] = {"Stereo Mode OFF", "Stereo Mode ON "};
static int ststmax = 3, fo.~..ax = 4, out~ -x = 12;
integrate(cp) struct curwindow *cp;
int i, lines;
char buffert35], *gr_gets();
static struct menwindow ~enu =

Table 2, p.97-CA 021222~ 1998-09-10 17, 10,-"-Integrate Menu-", "Fl: Acquire Imagen, "F2: Acquire Raw", "F3: Focus Cycle", "F4: Set Def aults", "F5: Make Files", ~F6: Clear System", "F7: Move Menu", "F8: Disk Services", "Fs: Main Menu"
static struct genbox box = {XINSTPOS, YINSTPOS, 36, 3};
struct menwindow *wp;
struct curwindow *altcp;
struct genbox *ip = &box;
wp = &menu;
altcp = &altcursor;
while(1) switch(get menu_ptr(wp, TRUE, FALSE)) case 0:
if((i = int image(fin filespec)) != ERROR) open box(ip);
sprintf(buffer, "Integration Time:%Sd ~illisecsn, i);
print 8xl6(buffer, XINSTPOS + 16, YINSTPOS + 16, FGDI, BGDI);
delay(2000);
close box(ip);
}
break;
case 1:
if((i = int raw(fin filespec)) != ERROR) open box(ip);
sprintf(buffer, "Integration Time:~5d millisecs", i);
print 8x16(buffer, XINSTPOS I 16, YINSTPOS ~ 16, FGDI, BGDI);
delay(2000);
close_box(ip);
}
break;
case 2:
reset vid mode();
set dlsplay bits(FALSE);
print 8x16("Enter Number Of Lines : ", XMID - 104, YMID, FGDI, BGDI);
sscanf(gr gets(buffer, XMID + 80, YMID, 4),"%d", &lines);

Table 2, p.98-CA 02l222~ l998-09-l0 print 8x16("Enter Integration time- ", XMID - 104, YMID + CHRH, FGDI, BGDI);
sscanf(gr gets(buffer, XMID + 80, YMID + CHRH, 5),"%d", &int_time);
cycle(lines);
reset vid mode();
break;
case 3:
set parameters();
break;
case 4:
make files();
break;
case 5:
reset vid mode();
break, case 6:
move_menu(altcp);
break;
case 7:
disk_io(1);
break;
case 8:
return;
break;
}

}
int_raw(filespec) char *filespec;
int old formula, i;
old formula = int formula;
int~formula = 0;
i - int image(filespec);
int formula = old formula;
return(i);

int_image(filespec) char *filespec;
{

void *malloc(), *calloc();
int i = 0, lines, fpf, fpw, fpd;
unsigned int nrdbytes, nwrbytes;
int *lower, *upper, *wbuf, *dbuf, big = 0, small = 4096;
unsigned long *hist;
static struct genbox box = {XWAITPOS, YWAITPOS, 59, 5};

Table 2, p.99-struct genbox *bp;
bp = &box;
nrdbytes = nwrbytes =(out_amp == BOTH_AMP) ? FORDSIZE << 2 :
FORDSIZE << l;
lines = (bin_mode = NORMAL_M) ? FORDSIZE : (FORDSIZE >> l);
if(out_amp - BOTH_AMP) lines >>= l;
if(bin_mode Q BINNED M) nwrbytes >>= l;
/*
open box(bp);
print 8x16("W A I T I N G F O R X - R A Y T O B E G I N", XWAITPOS + (CHRW << 1), YWAITPOS + CHRH, FGDI, BGDI);
print_8x16( n -- Press ANY Rey To Return To Main Menu __n, XWAITPOS + (CHRW << 1), YWAITPOS + CHRH * 3, FGDI, BGDI);
while(l) if(kbhit()) {

readkey();
close_box(bp);
return(ERROR);
}

*/
if((upper = lower = (int ~)malloc(nrdbytes)) - NULL) {

pr_error(5);
return(ERROR);

lower += FORDSIZE;
if((wbuf = (int *)malloc(nwrbytes)) == NULL) {

pr_error(5);
free((void ~)upper);
return(ERROR);
f((dbuf = (int *)malloc(nwrbytes)) = NULL) pr error(5);
free((void *)upper);
free((void *)wbuf);
return(ERROR);
if((hist = (unsigned long *)calloc(MAXDATA + 256, sizeof(long))) == NULL) ~0 pr_error(5);
free((void *)upper);
free((void *)wbuf);
free((void *)dbuf);

Table 2~ p.100-CA 02l22255 l998-09-l0 return(ERROR);
if((fpw = open(wht filespec, O RDWR ' O_BINARY, S IREAD I S_IWRITE)) ==
ERROR) {

pr error(0);
freer'void * upper);
free rvoid * wbuf);
free rvOid * dbuf);
free ~void * hist);
return(ERROR ;
}

if((fpd = open(drk_filespec, o-RDWR 0 O_BINARY, S IREAD I S IWRITE)) ~=
ERROR) {

pr error(0);
free ~void * upper);
free void * wbuf);
free ~void * dbuf);
free void *Jhist);
close fpw);
return(ERROR);
}

if(stst method) { open_box(bp);
print_8x16(nW A I T I N G F O R X - R A Y T O
B E G I N", XWAITPOS + (CHRW << 1), YWAITPOS + CHRH, FGDI, 8GDI);
print_8x16(" -- Press ANY Key To Return To Main Menu --~, XWAITPOS + (CHRW << 1), YWAITPOS
+ CHRH * 3, FGDI, BGDI);
while(inp(STAT_PORT) & XRAY) if(kbhit()) readkey();
close box(bp);
close~fpw);
close fpd);
free ! void *lupper);
free (void * wbuf);
free (void * dbuf);
free,(void * hist);
return(ERROR);
}
}

Table 2, p. 101-CA 021222~ 1998-09-10 outp(MODE PORT, out_a~p I bin mode);
outptINT_PORT, O~;
if(stst_~ethod ~= 1) while(!(inp(STAT ? ORT) & XRAY)) delay(l0);
i l= 10;
}

else delay(i = int_time);
outp(RSCLR_PORT, 0);
if(stst method) close box(bp);
fpf = open~filespec, O RDWR t o _CREAT ' O_BINARY I O TRUNC, S IREAD I S_IWRITE);
switch(out amp) {

case BOTH_AMP:
while(lines--) {

while(inp(STAT_PORT) & LINERDY);
inpw to_mem((char far *)lower, FIFOl_PORT, FORDSIZE);
inpw_to_mem((char far *)upper, FIFO2_PORT, FORDSIZE);
outp(RSCLK_PORT, O);
if(bin_mode == BINNED_M) squeeze(upper, nwrbytes);
xchg_array(upper, BINSIZE);
}

else xchg_array(upper, FORDSIZE);
read(fpw, wbuf, nwrbytes);
read(fpd, dbuf, nwrbytes);
~rocess_i~age(hist,upper,wbuf,dbuf,nwrbytes >> l,&big,&small);
write(fpf, upper, nwrbytes);
}

break;
case LOWER_AMP:
while(lines--) {

while(inp(STAT_PORT) & LINERDY);
inpw to_mem((char far *)upper, FIFOl_PORT, FORDSIZE);
outp(RSCLK_PORT, O);
if(bin_mode == BINNED_M) s~ueeze(upper, nwrbytes);

Table 2, p.l02-read(fpw, wbuf, nwrbytes);
read(fpd, dbuf, nwrbytes);
~rocess_image(hist,upper,wbuf,dbuf,nwrbytes >> 1,&big,&small);
write(fpf, upper, nwrbytes);
}

break;
case UPPER AMP:
whlle(lines--) { while(inp(STAT_PORT) ~ LINERDY);
inpw to mem((char far *)upper, FIFO2 PORT, FORDSIZE);
outp(RSCLK? ORT, O);
xchg array(upper, FORDSIZE);
if(bin_mode == BINNED_M) squeeze(upper + 1, nwrbytes);
read(fpw, wbuf, nwrbytes);
read(fpd, dbuf, nwrbytes);
process_image(hist,upper,wbuf,dbuf,nwrbytes ~> l,&big,&small);
write(fpf, upper, nwrbytes);
}

break;
}

outp(MODE_PORT, BOTH_AMP ' FLUSH_M);
inp(RSRDOUT PORT);
outp(RSCLK= oRT, O);
free(~void *)upper);
free( void *)wbuf);
free( void *)dbuf);
close fpf);
close fpw);
close fpd);

-Yi -ge = big;
i ni ~ge = small;
find_contrast(hist);
dup_image();
display_image(filespec, mindisplay, maxdisplay);
free((void *)hist);
date stamp_annot(i);
L~--UL-I (i);
}

~0 cycle(lines) int lines;
{

void ~malloc();
int x, xl, y, yl, cols, fpf;

Table 2, p.103-CA 021222~ 1998-09-10 unsigned int nbytes;
int *lower, *upper, *plower, *pupper;
unsi~ned char far *dest, far *xy to ad();
nbytes = (out_amp == BOTH AMP) ? FORDSIZE << 2 : FORDSIZE << 1;
if((upper z lower = (int *)malloc(nbytes)) -- NULL) {

pr error(5);
return(ERROR);
}

lower l= FORDSIZE;
if((fpf = open(fin filespec, O RDWR ' O CREAT ¦ O BINARY, S IREAD t s IWRITE)) =--ERROR) {

pr error(0);
free((void *)upper);
return(ERROR);
}

while(!readkey()) lseek(fpf, OL, SEEK_SET);
outp(MODE_PORT, out_amp I NORMAL M);
outp(INT_PORT, O);
delay(int_time);
outp(RSCLK PORT, O);
switch(out_amp) case BOTH_AMP:
for(y = O; y < lines; y++) while(inp(STAT PORT) ~ LINERDY);
inpw_to mem((char far *)upper, FIFOl_PORT, FORDSIZE);
inpw_to mem((char far *)lower, FIFO2_PORT, FORDSIZE);
outp(RSCLR PORT, O);
write(fpf, upper, nbytes);
break;
case LOWER AMP:
for(y = O; y < lines; y++) {

while(inp(STAT_PORT) & LINERDY);

inpw_to_mem((char far ~)upper, FIFOl_PORT, FORDSIZE);
outp(RSCLK_PORT, O);
write(fpf, upper, nbytes);
}

Table 2, p.l04-CA 021222~ 1998-09-10 break;
case UPPER AMP:
for(y = 0; y < lines; y++) while(inp(STAT PORT) & LINERDY);
inpw_to mem((char far *)upper, FIFO2 PORT, FORDSIZE);
outp(RSCLK PORT, 0);
write(fpf, upper, nbytes);
}
break;
}

outp(MODE PORT, BOTH AMP I FLUSH M);
inp(RSRDOUT PORT);
outp(RSCLK = ORT, 0);
lseek(fpf, OL, SEEK SET);
~*
for(y = 0; y < TOPBORDER; y++) read(fpf, upper, nbytes);~/
x = y = O;
xl = 1023, yl = 767;
switch(out amp) case BOTH AMP:
while(y < lines) {

plower = lower;
pupper = upper;
read(fpf, upper, nbytes);
dest = xy to ad(x, y++);
cols = FORDSIZE;
while(cols--) *dest++ = *pupper++ >> crtbitshft;
dest = xy to ad(xl, yl--);
cols = FORDSIZE;
while(cols--) *dest-- = *plower++ >> crtbitshft;
}

break;
case LOWER AMP:
whlle(y ~ lines) pupper = upper;
read(fpf, upper, nbytes);
dest = xy to ad(x, y++);
cols = FORDSIZE;
while(cols--) *dest++ = *pupper++ >> crtbitshft;

Table 2, p. 105-CA 021222~ 1998-09-10 break;
case UPPER AMP:
whlle(y++ ~ lines) {

pupper = upper;
read(fpf, upper, nbytes);
dest = xy_to_ad(xl, yl~
cols = FORDSIZE;
while(cols--) ~dest-- = *pupper++ >> crtbitshft;
}

break;
}
close(fpf);
free((void ~)upper);

}

init_ford() char ~whtfspec, ~drkfspec;
int old_maximage, old_minimage, old_maxcontrast, old_mincontrast;
int old_maxdisplay, old_mindisplay;
unsigned old_histdatar256];
outp(MODE_PORT, BOTH_AMP ' FLUSH_M);
inp(RSRDOUT PORT);
outp(RSCLK= ORT, 0);
if(bin_mode = NORMAL_M) whtfspec = hf_wht_fspec;
drkfspec = hf_drk_fspec;
else {

whtfspec = hb_wht fspec;
drkfspec = hb_drk_fspec;
copy_image(whtfspec, wht_filespec);
copy_image(drkfspec, drk_filespec);
if(int_formula - 3) subtract_image(wht_filespec, drk_filespec, tmp_filespec);
copy_image(tmp filespec, wht_filespec);

old_maximage = ~xi -ge, old minimage = minimage;
old_maxco~t ast = ma~co~--Last, old mincontrast = mincontrast;

Table 2, p.106-CA 02l22255 l998-09-lO

old -Y~isplay = -Ydisplay, old mindisplay = mindisplay;
~ y(old histdata, histdata, 256 * sizeof(int));
find maxwhlte();
~Yi .ge = old -Yi -ye, ~inimage = old tni~-ge;
maxcontrast = old maxco~ dst, mincontrast = old mincontrast;
~y~i~play = old = -Y~isplay, mindisplay = old mindisplay;
-~y(histdata, old histdata, 256 * sizeof(int));

set display bits(disp flag) int disp_flag;

int menupt;
static struct menuindow menu =
13, 7, "Display Bits:", "Fl: ll thru 4", "F2: 10 thru "F3: 9 thru 2", "F4: 8 thru l", "F5: 7 thru 0", "F6:
Prev Menu n };
struct menwindow *wp;
wp = &menu;
switch(menupt = get menu ptr(wp, TRUE, FALSE)) case o:
case 1:
case 2:
case 3:
case 4:
crtbitshft = 4 - menupt;
if(disp flag) {

find - in(fin filespec);
display image(fln filespec, mincontrast = 0, maxcontrast = (4096 >> menupt) - 1);
}
break;
case 5:
case 6:
break;

}

}
set_parameters() int xstatus, ystatus, i;
char buft64], ~gr_gets();

Table 2, p.107-CA 021222~ 1998-09-10 static struct menwindow menu =
{
17.~ 9~ n - Parameter -", "Fl: Integrate Tm:", "F2:
Start / Stop: n, ~F3: Math Formula:", "F4: Output Amp :", "F5: Binning Mode:", "F6: Display Mode: n, ~F7: Stereo Mode :", "F8: Previous Menu"
};
struct menwindow *wp, *qm;
wp = &menu;
qm = hquit menu;
xstatus = xmenu + CHRW * (wp->xlen + 3);
ystatus = ymenu + CHRH * 3;
wp-~xlen += EXTRACHRS;
open window(wp);
wp->xlen -= EXTRACHRS;
print status(xstatus, ystatus);
print_8x16("- Current Value -", xstatus, ymenu + CHRH, FGDI, BGDI);
while(1) i = get menu_ptr(wp, FALSE, FALSE);
rev_fgd_bkgd(xmenu + 14, ymenu + 3 * CHRH + i * CHRH, FGDI, BGDI, (wp->xlen <<
3) + 4, CHRH);
print_8x16("\xlO", xstatus - CHRW, ystatus + i *
CHRH, FGDI, BGDI);
switch(i) case O:
print_8x16("Enter Time: ", xstatus, ystatus, FGDI, BGDI);
sscanf(gr_gets(buf, xstatus + (12 << 3), ystatus, 5),"%d", ~int_time);
print_status(xstatus, ystatus);
break, case 1:
get_stsp(x~tatus, ystatus);
break;
case 2:
get_form(xstatus, ystatus);
init ford();
break;
case 3:
get_out_amp(xstatus, ystatus);
break;
case 4:
~ get_bin mode(xstatus, ystatus);

Table 2~ p.lOô-init ford();
break;
case 5:
get disp mode(xstatus, ystatus);
break;
case 6:
get ste mode(xstatus, ystatus);
break;
case 7:
wp->xlen += EXTRACHRS;
close window(wp);
wp->xlen -= EXTRACHRS;
switch(get menu ptr(qm, TRUE, FALSE)) case O:
case 1:
save defaults();
break;
}

L~tULII;
break;
}

print 8x16(" ", xstatus - CHRw, ystatus + i * CHRH, FGDI, BGDI);
}
}

print status(xmen, ymen) nt xmen, ymen;
char buffert32~;
sprintf(buffer, "%-18u~, int time);
print 8xl6(buffer, xmen, ymen, FGDI, BGDI);
print_8xl6(st~L.esyollses[stst method], xmen, ymen += CHRH, FGDI, 8GDI);
print_8xl6(foL es~unses[int_formula], xmen, ymen += CHRH, FGDI, BGDI);
print 8xl6(ouLLe~onses[out_amp - 4 >> 2], xmen, ymen ~- CHRH, FGDI, BGDI);
print_8xl6(binresponses[bin_mode], xmen, ymen += CHRH, FGDI, BGDI);
print 8xl6(dispresponses[crt mode], xmen, ymen += CHRH, FGDI, BGDI);
print 8xl6(steresponses[stereo_mode], xmen, ymen += CHRH, FGDI, BGDI);
get_stsp(xstatus, ystatus) int xstatus, ystatus;

Table 2, p.109-int i;
while((i = get_key()) != '\r') switch(il {

case DOWN_ARROW:
case RIGHT_ARROW:
case ' ':
if(++stst_method == ststmax) stst_method = ~;
break;
case UP_ARROW:
case LEFT_ARROW:
if(--stst method < 0) stst method +=
ststmax;
break;
print_status(xstatus, ystatus);

get_form(xstatus, ystatus) int xstatus, ystatus;
int i;
while((i = get_key()) != '\r') switch(i) case DOWN_ARROW:
case RIGHT_ARROW:
case ' ':
if(++int_formula == formmax) int_formula = O;
break;
case UP_ARROW:
case LEFT ARROW:
if(--int_formula < O) int_formula +=
formmax;
break;
}

print_status(xstatus, ystatus);
}

}
get_out_amp(xstatus, ystatus) int xstatus, ystatus;

Table 2, p. 110-CA 021222~ 1998-09-10 int i;
while((i = get key()) != '\r') switch(i) case DOWN ARROW:
case RIGHT ARROW:
case ' ':
4; if((out amp += 4) > out~ , ~x) out amp =

break;
case UP ARROW:
case LEFT ARROW:
if((out amp -= 4) ~ 4) out amp =
out~ , -Y;
break;
print status(xstatus, ystatus);
}

get bin_mode(xstatus, ystatus) int xstatus, ystatus;
int i;
while((i = get key()) != '\r') switch(i) case DOWN ARROW:
case RIGHT ARROW:
case UP ARROW:
case LEFT_ARROW:
case ' ':
bin mode ~= 1;
break;
print status(xstatus, ystatus);

}

get disp mode(xstatus, ystatus) int xstatus, ystatus;
int i, oldcrtmode;
oldcrtmode = crt mode;
while((i = get key()) != '\r') Table 2~ p.111-CA 021222~ 1998-09-10 switch(i) case DOWN ARROW:
case RIGHT_ARROW:
case UP ARROW:
case LEFT ARROW:
case ' ':
crt mode ~= l;
break;
, ~
print status(xstatus, ystatus);
if(oldcrtmode != crt mode && !crt mode) clear image(l);

get ste mode(xstatus, ystatus) int xstatus, ystatus;
int i;
while((i = get_key()) != '\r') switch(i) {

case DOWN ARROW:
case RIGHT ARROW:
case UP_ARROW:
case LEFT ARROW:
case ' ':
stereo ~ode ~= l;
break;
}

print status(xstatus, ystatus);
}
}

subtract image(fspecl, fspec2, fspec3) char *fspecl, *fspec2, *fspec3;
void *malloc();
int cols, size, fpl, fp2, fp3;
int *bufl, *pbufl, *buf2, *pbuf2;
unsigned int nbytes = FORDSIZE << l;
long filelength();
if((bufl = (int *)~alloc(nbytes)) == NULL) pr error(5);
return(ERROR);
}

Table 2, p.112-if((buf2 = (int *)malloc(nbytes)) == NULL) {
pr error(5);
free((void *)bufl);
return(ERROR);
if((fpl = open(fspecl, O_RDWR I O_BINARY, S_IREAD ¦ S_IWRITE)) == ERROR) pr_error(0);
free((void *)bufl);
free((void *)buf2);
return(ERROR);
}

if((fp2 = opentfspec2, O RDWR ~ O_BINARY, S_IREAD I S_IWRITE)) pr_error(0);
free((void *)bufl);
free((void *)buf2);
close(fpl);
return(ERROR);
if((fp3 = open(fspec3, O_RDWR ' O_CREAT , O_BINARY ' O_TRUNC, S_IREAD ' S_IWRITE)) ==
ERROR) pr_error(0);
free( void *)bufl);

free( void ~)buf2);
close~fpl);
close fp2);
return(ERROR);
size = filelength(fpl) / nbytes;
while(size--) read(fpl, bufl, nbytes);
read(fp2, buf2, nbytes);
pbufl = bufl;
pbuf2 = buf2;
cols = FORDSIZE;
while(cols--) *pbufl -= *pbuf2++;
if(*pbufl < 0) *pbufl = O;
pbufl++;
write(fp3, bufl, nbytes);
}

Table 2, p.ll3-close!fpl);
close fp2);
close fp3);
free~ void *)bufl);
free(~void *1buf2);
return(O);
}

divide image(fspecl, fspec2, fspec3) char *fspecl, *fspec2, *fspec~;
void ~malloc();
int cols, size, fpl, fp2, fp3;
unsigned int nbytes = FORDSIZE << l, *bufl, *pbufl, *buf2, *pbuf2;
long filelength();
if((bufl = (int *)malloc(nbytes)) == NULL) pr error(5);
return(ERROR);
if((buf2 = (int *)malloc(nbytes)) == NULL) pr error(5);
free((void *)bufl);
return(ERROR);
if((fpl = open(fspecl, O_RDWR I O_BINARY, S IREAD ' S IWRITE)) == ERROR) pr error(O);
free((void *)bufl);
free((void *)buf2);
return(ERROR);
if((fp2 = open(fspec2, O_RDWR I O_BINARY, S IREAD ¦ S IWRITE)) == ERROR) {

pr error(o);
free((void *)bufl);
free((void *)buf2);
close(fpl);
return(ERROR);
if((fp3 = open(fspec3, O_RDWR ~ o-CREAT ¦ O BINARY ' o TRUNC, S IREAD ' S IWRITE)) ==
ERROR) pr error(0);

Table 2~ p.ll4-CA 021222~ 1998-09-10 free( void *)bufl);
free(,void ~)buf2);
close fpl);
close~fp2);
return(ERROR);
}

size = filelength(fpl) / nbytes;
while(size--) read(fpl, bufl, nbytes);
read(fp2, buf2, nbytes);
pbufl = bufl;
pbuf2 = buf2;
cols = FORDSIZE;
while(cols--) {
*pbufl = (*pbufl * (long)maxwhite) /
++(*pbuf2+~);
if(*pbufl > 4095) *pbufl = 4095;
pbufl++;
}

write(fp3, bufl, nbytes);
}

close(fpl);
close(fp2);
close(fp3);
free((void *)bufl);
free((void *)buf2);
return(0);
}

copy_image(fspecl, fspec2) char *fspecl, *fspec2;
void *malloc();
int blocks, fpl, fp2, *filel;
unsigned int nbytes = ox8000;
long filelength();
if((filel z (int *)malloc(nbytes)) == NULL) {

pr error(5);
return(ERROR);
if((fpl = open(fspecl, O_RDWR ¦ O_BINARY, S_IREAD ¦ S_IWRITE)) == ERROR) (strcmp(fspecl, fin filespec)) ? pr_error(l) :
pr_error(6);
free((void *)filel);

Table 2, p.115-CA 021222~ 1998-09-10 return(ERROR);
if((fp2 = open(fspec2, O_RDWR 0 O CREAT I O_BINARY t O TRUNC, S_IREAD 0 S IWRITE)) --ERROR) pr_error(0);
freel(void *)filel);
close(fpl);
} return(ERROR);
blocks = filelength(fpl) / nbytes;
while(bloc~s--) read(fpl, filel, nbytes);
write(fp2, filel, nbytes);
}

close(fpl);
close(fp2);
free((void *)filel);
return(o);
}

find_maxwhite() find_maxmin(wht filespec);
maxwhite = maxi~splay;

find_maxmin(fspec) char *fspec;
void *malloc(), *calloc();
int big = 0, small = 4096, y, cols, fpl, *buf, *pbuf;
unsigned int nbytes = FORDSIZE << l;
unsigned long *hist;
long filelength();
if((buf = (int *)malloc(nbytes)) == NULL) pr error(5);
return(ERROR);
if((hist = (unsigned long *)calloc(MAXDATA + 256, sizeof(long))) == NULL) pr_error(5);
free((void *)buf);
return(ERROR);

Table 2~ p.l16-CA 02l22255 l998-09-l0 if((fpl = open(fspec, O RDWR I O BINARY, S_IREAD ' S_IWRITE)) ==
ERROR) pr_error(O);
free((void *)buf);
free((void *)hist);
return(ERROR);

y = filelength(fpl) / nbytes;
while(y--) ,~
read(fpl, buf, nbytes);
pbuf = buf;
cols = FORDSIZE;
while(eols--) big = (biq > *pbuf) ? big : *pbuf;
small = (small < *pbuf) ? small : *pbuf;
hist[*pbuf++]++;
?
/
y = O;
while(y < MAXDATA) fprintf~stdprn, "%81u", hist[y++]);
*/
maximage = big;
minimage = small;
find_contrast(hist);
close(fpl);
free(~void *)buf);
free~void *)hist);
?

find_contrast~hist) unsigned long *hist;
I

int big, small, y, min, smax, smin;
unsigned long *phist, histbig;
phist = hist + MAXDATA;
y = smax = smin = O;
while(y < 4094) maxcontrast = mincontrast = o;
while~maxcontrast - mincontrast < HST CONT_MIN) while~histty++l < HST_THRESHOLD);
mincontrast = y;

Table 2~ p.117-CA 021222~ 1998-09-10 while(histty+~] > HST_THRESHOLD);
maxcontrast = y;
if(y > 4094) break;
min = maxcontrast;
while(min - maxcontLast < HST CONT_MIN) {

while(histty++] > ~ST_THRESHOLD);
maxcontrast = y;
while(hist~y++~ < HST_THRES~OLD);
min = y;
if(y > 4094) break;
}

if(maxcontrast > maximage) maxcontrast = ~Yi~~ge;
if(smax - smin < maxcontrast - mincontrast) smax = maxcontrast;
smin = mincontrast;
}
maxcontrast = smax, mincontrast = smin;
if(maxcontrast > ~Yi -ge) maxcontrast = maximage;
if(mincontrast < inj ~ge) mincontrast = minimage;
if(maxcontrast - mincontrast < 10) maxcon~ast = ~Yi-~ge;
mincontrast = inir~ge }
if(maxcontrast - mincontrast < 1) {

maxcontrast = 4095;
mincontrast = O;
}

big = maxdisplay = maxcontrast;
small = mindisplay = mincontrast;
for(y = O; y < MAXDATA; y++) phistty >> 4] += hiSttY~;
small >>= 4, big >>= 4;
big++;
for(y = small, histbig = phisttsmall~; y < big; y++) histbig = (histbig > phistty~) ? histbig : phistty~;
histbig >>= 6;
for(y = O; y < 256; y++) histdata[y] = phist[y] / histbig;
}
display fullgry(filespec) char *filespec;

Table 2, p.118-find - i n ( filespec);
display image(filespec, ;n~i~play, ~YA i~play);

display image(filespec, min, max, topborder) char ~fllespec;
int min, max, topborder;
{

void *malloc();
int x, y, yl, maxmin, cols, fpf, *data, ~pdata, ~Y~tSp, mindisp, oldmode;
unsigned int nbyte~;
unsigned char *lut, far ~dest, far *xy to_ad();
long filelength();
if((fpf = open(filespec, O_RDWR I O BINARY, S IREAD , S_IWRITE)) = ERROR) pr error(7);
return(ERROR);
}

oldmode = bin mode;
bin mode = (fllelength(fpf) == 524288L) ? BINNED M : NORMAL M;
nbytes = (out amp = BOTH AMP) ? FORDSIZE << 2 : FORDSIZE << l;
if(bin_mode = BINNED_M) nbytes >~= l;
if((lut = (char ~)malloclMAXDATA)) - NULL) {

pr_error(5);
close(fpf);
return(ERROR);
}

if((data = (int *)malloc(nbytes)) == NULL) pr_error(5);
free((void *)lut);
close(fpf);
return(ERROR);
}

maxmin = max - min;
maxdisp = (max > 4094) ? 4095 : max;
mindisp = (min < 1} ? 0 : min;
x = XDISPRNGPOS, y = YDI~RN~OS;
make_gen_box(x, y, 37, 4);
sprintf(lut, "Displayed Data Range:%5d -%Sd", mindisp, maxdisp);
print_8x16(1ut, x += (CHRW << 1), y l= CHRH, FGDI, BGDI);
sprintf(lut, "Data Range In lmage :%5d -%5d", minimage, maximage);
print_8x16(1ut, x, y + CHRH, FGDI, BGDI);
for(y = o; y < 4096; y+~) Table 2, p.119-x = ((y - min) * 255L) / ~ in;
if(x > 255) x = 255;
if (x ~ O) x = o;
*(lut + y) = (invert flag) ? ~x : x;

if(disp mode - SPLIT M 1l bin mode = BINNED M) switch(out amp) case LOWER AMP:
for(x = XIMAGEBIN, y = YIMAGEBIN; y < YIMAGEBIN +
BINSIZE; y++) if(bin mode == NORMAL M) read(fpf, data, nbytes);
read(fpf; data, nbytes);
pdata = data;
dest = xy to ad(x, y);
cols = BINSIZE;
if(bin mode == NORMAL M) while(cols--) *pdata++;
*dest++ = *(lut + *pdata++~;
}
}

else while(cols--) *dest++ = *(lut + *pdata++);
}
}

break;
case UPPER AMP:
for(x = XIMAGEBIN, y = YIMAGEBIN + BINSIZE - l; y >
YIMAGEBIN; y--) {

if(bin mode == NORMAL M) read(fpf, data, nbytes);
read(fpf, data, nbytes);
pdata = data;
dest = xy to ad(x, y);
cols = BINSIZE;
if(bin mode - NORMAL M) {
. while(cols--) {

*pdata++;
*dest++ = *(lut + *pdata++);

Table 2, p.120-CA 02l22255 l998-09-l0 else while(cols--) *dest++ = *(lut + *pdata++);
}
break;
case BOTH AMP:
for(x = XIMAGEBIN, y = YIMAGEBIN, yl = YIMAGE8IN +
BINSIZE - 2;
y < YIMAGEBIN + (BINSIZE
>> l); y++, yl----) {

if(bin mode == NORMAL M) read(fpf, data, nbytes);
read(fpf, data, nbytes);
pdata = data;
dest = xy to ad(x, yl);
cols = BINSIZE;
if(bin ~ode == NORMAL_M) while(cols--) *pdata++;
*dest++ = *(lut + *pdata++);
}

else while(cols--) *dest++ = *(lut + *pdata++);
dest = xy_to ad(x, y);
cols = BINSIZE;
if(bin mode == NORMAL_M) {

while(cols--) {

*pdata++;
*dest++ = *(lut + *pdata++);
}
}

else while(cols--) *dest++ = *(lut + *pdata++);

break;

Table 2, p.121-if(bin mode == NORMAL M) {

make_gen_box(XZOOMPOS, YZOOMPOS, 37, 3);
print_8xl6("Press SFl For Full Screen Display", XZOOMPOS + (CHRW ~< 1), YZOOMPOS + CHRH, FGDI, BGDI);
zoomflag = l;
else {

for(cols = O; cols < 37; cols++) luttcols] = ' ';
lut~cols~ = '\O';
cols = 3;
y = YZOOMPOS - CHRH;
while(cols--) print_8x16(1ut, XZOOMPOS, y += CHRH, FGDI, 0);
zoomf~ag = O;
}
}

else for(y = O; y < topborder; y++) read(fpf, data, nbytes);
switch(out_amp) case LOWER AMP:
for(x = XIMAGEPOS, y = YIMAGEPOS; y < YIMAGEPOS +
MAXVIDEOLINE; y++) read(fpf, data, nbytes);
pdata = data;
dest = xy_to_ad(x, y);
cols = FORDSIZE;
while( c018--) ~dest++ = ~(lut + *pdata++);
break;
case UPPER_AMP:
for(x = XIMAGEPOS, y = YIMAGEPOS + MAXVIDEOLINE - 1; y;
y__) {

read(fpf, data, nbytes);
pdata = data;
dest = xy_to_ad(x, y);
cols = FORDSIZE;
while(cols--) *dest++ = ~(lut + *pdata++);
break;

Table 2, p.l22-case BOTH AMP:
for(x = ~TM~G~POS, y = YIMAGEPOS, yl = YIMAGEPOS +
MAXVIDEOLINE - 2;
y < MAXVIDEOLINE >> l;
y~, yl----) read(fpf, data, nbytes);
pdata = data;
dest = xy to ad(x, yl);
cols 5 FORDSIZE;
while(cols--) ~dest+~ e ~(lut + *pdata++);
dest = xy to ad(x, y);
cols = FORDSIZE;
while(cols--) *dest++ = *(lut + *pdata++);
break;
}
}

free((void ~)data);
free((void *)lut);
close(fpf);
~bin mode = oldmode;

disp full screen() int i, border = TOPBORDER;
if(zoo~fl~g) sav image(tmp filespec);
disp mode = NORMAL M;
display image(fin filespec, mincontrast, maxcontrast, border);
while((i = get key()) != '\r') switch(i) case PG_UP:
border -= 128;
if(border < O) border = O;
display image(fin filespec, mincontrast, maxcontrast, border);
break;
border ~= 128;
if(border > 256) border = 256;
display image(fin-filespec~ mincontrast, Table 2, p. 123-CA 021222~ 1998-09-10 ~axcontrast, border);
break;
}
disp mode = SPLIT M;
rec lmage(tmp_filespec);
}

process_image(hist, pdata, pwdata, pddata, ncols, big, small) unsigned long *hist;~0 int *pdata, *pwdata, *pddata, ncols, *big, *small;
switch(int_formula) case o:
while(ncols--) *big = (*big > *pdata) ? *big : *pdata;
*small = (*small < *pdata) ? *small :
*pdata;
histt*pdata++]++;
break;
case 1:
while(ncols--) ~pdata -= *pddata++;
if(*pdata < O) *pdata = 0;
*big = (*big > *pdata) ? *big : *pdata;
*small = (*small c *pdata) ? *small :
*pdata;
histt*pdata++]++;
break;
case 2:
while(ncols--) *pdata = (*pdata * (long)maxwhite) /
++(*pwdata++);
if(*pdata > 4095 '' *pdata < 0) *pdata =
4095;
*big = (*big > *pdata) ? *big : *pdata;
*small = (*small < *pdata) ? *small :
*pdata;
hist[*pdata++]++;
}

break;
case 3:
while(ncols--) Table 2, p.124-CA 021222~ 1998-09-10 *pdata -= *pddata++;
if~*pdata < 0) *pdata = 0;
*pdata = (*pdata * (long)maxwhite) /
++(*pwdata++);
if(*pdata ~ 4095 10 *pdata < O) *pdata =
4095;
*big = (*big > *pdata) ? *big : *pdata;
*small = (*small < *pdata) ? *small :
*pdata;
hist[*pdata++]++;
}

break;
}
}

dup_image() int x, y;
unsigned char far *dest, far *xy_to_ad();
y = (stereo_mode) ? YIMAGEBIN : O;
if((disp_mode == SPLIT_M '' bin_mode -- BINNED_M) && crt mode -TRUE) for(x = 0; y < YIMAGEBIN + BINSIZE + 72; y++) dest = xy_to_ad(x, y);
mem_to_mem(dest, dest + BINSIZE, BINSIZE);
}

save_defaults() {

FILE *stream;
if((stream = fopen(cnf_filespec, "w")) == NULL) pr_error(0);
return(ERROR);
}

fprintf(stream, "%d %d %d %d %d %d %d", int_time, stst_method, int_formula, out_amp, bin_mode, crt mode, stereo_mode);
fclose(stream);
return(0);
}

get defaults() FILE *stream;

Table 2, p.125-CA 021222~ 1998-09-10 if((stream = fopen(cnf_filespec, "r")) == NULL) return(ERROR);
fscanf(stream, "%d %d %d Sd %d %d %d", &int time, &stst_method, &int formula, ~out amp, &bin_mode, &crt_mode, Lstereo_mode);
fclose(stream);
return(0);
) /*****~**********~***************~************************~***********
This function controls:
Making disk files for image processing (White and Dark).
Making the defect mapping file.
***********~*********************************************************/
/*
Tony Scandura 04t29/91 */
~include <stdio.h>
tinclude <fcntl.h>
tinclude <sys~types.h>
tinclude <sys\stat.h>
tinclude <math.h>
tinclude "ccd.h"
tinclude "keys.h"
struct menwindow quit_menu =
17, 4, "Please Select One", "Save As Default", "Save As Filespec", " Do ~OT Save"
extern int xmenu, ymenu, bin_mode;
extern char *fin filespec, ~tmp_filespec, *wht filespec, *drk_filespec;
extern char *hf = ht_fspec, *hb_wht_fspec, *hf = rk_fspec, *hb_drk_fspec;

make_files() int i;
static struct menwindow menu =
20, 5, " - Make File Menu -", "Fl: Make White File", "F2: Make Dark File", "F3: Make Defect File", "F4: Main Menu"
struct menwindow *wp;
wp = &menu;
while((i = get_menu_ptr(wp, TRUE, FALSE)) != '\r') switch(i) Table 2~ p.126-case O:
case 1:
mk files(i);
breaX;
case 2:
mk_defect();
break;
case 3:
return;
break~

}
}

~k_files(bw) int bw;
int i, imagecnt = 0, useflag = ERROR;
char buf[16], *fspec;
static struct menwindow menu =
19, 4, "White File Creation", "Press ENTER When", "Ready For Image: 1", " (A)dd (Q)uit'' } ;
struct menwindow *wp, ~qm;
wp = &menu;
qm = &quit menu;
fspec = (bw) ? ((bin_mode -- NORMAL_M) ? hf_drk_fspec :
hb_drk fspec) :
((bin_mode == NORMAL_M) ?
hf wht fspec : hb_wht_fspec);
open_window(wp);
sprintf(buf, "Ss", (bw) ? " Dark" : "White");
print 8X16(bUf, xmenu + CHRW * 2, ymenu + CHRH, FGDI, BGDI);
while(l) switch~i = get_key()) case '\r':
close_window(wp);
useflag = (imagecnt) ?
int raw(tmp filespec) :
int_raw(fin_filespec);
open window(wp);
sprintf(buf, ~%s", (bw) ? " Dark" : "White");
print_8x16(buf, xmenu + CHRW * 2, ymenu + CHRH, FGDI, BGDI);
sprintf(buf, "%d", imagecnt + l);
print_8x16~buf, xmenu + CHRw * 1~, ymenu + CHR
* ~, FGDI, BGDI);

Table 2, p.127-CA 02l22255 1998-09-l0 brea~;
case 'Q':
case 'q':
close window(wp);
if(imagecnt) switch(get menu ptr(qm, TRUE, FALSE)) {

case O:
divide it(imayecnt);
copy image(fin_filespec, fspec);
display fullgry(fin_filespec);
init ford();
break;
case 1:
divide it(imagecnt);
save it(fin filespec, TRUE);
display fullgry(fin filespec);
init ford();
break;
case 2:
init ford();
break;
}

return;
break;
case 'A':
case 'a':
if(useflag != ERROR) { close window(wp);
if(imagecnt++) add_it();
open window(wp);
sprintf(buf, "%s", (bw) ? n Dark" :
"White");
print 8x16(buf, xmenu + CHRW * 2, ymenu + CHRH, FGDI, BGDI);
sprintf(buf, "~d", imagecnt + 1);
print 8x16(buf, xmenu + CHRW * l9, ymenu I CHRH * 4,FGDI,8GDI);
useflag = ERROR;
}

break;
}

mk_defect() }

Table 2, p.128-add it() void *malloc();
int cols, size, fptmp, fpfin;
unsigned int *tmp, *ptmp, *final, *pfinal;
unsigned int nbytes = FORDSIZE ~< 1;
if~(tmp = (unsigned int *)malloc(nbytes)) = NULL) pr error(5);
return(ERROR);
}

if((final = (unsigned int *)malloc(nbytes)) c NULL) {

pr error(5);
free((void *)tmp);
return(ERROR);
}

if((fptmp = open(t~p_filespec, O_RDWR I O_BINARY, S_IREAD ' S IWRITE)) ==
ERROR) pr error(O);
free((void *)tmp);
free((void *)final);
return(ERROR);
if~(fpfin = open(fin filespec, O RDWR I O BINARY, S IREAD , S IWRITE)) ==
ERROR) {
pr error(O);
free((void *)tmp);
free((void *)final);
close(fpfin);
return(ERROR);
size = (bin mode -- NORMAL M) ? FORDSIZE : BINSIZE >> l;
while(size--) {

read(fptmp, tmp, nbytes);
read(fpfin, final, nbytes);
ptmp = tmp;
pfinal = final;
cols = FORDSIZE;
while(cols--) *pfinal += *ptmp++;
pfinal++;
lseek(fpfin, -2048L, SEEK_CUR);

Table 2, p. 129-CA 02l22255 l998-09-l0 write(fpfin, final, nbytes);
}

close fptmp);
close fpfin);
free(~void *)tmp);
free( void *)final);
return(0);
}

divide_it(imgcnt) int imgcnt;
{

void *malloc();
int cols, size, fpfin;
unsigned int *final, *pfinal;
unsigned int nbytes = FORDSIZE c~ l;
if((final = (unsigned int *)malloc(nbytes)) -- NULL) {

pr_error(5);
return(ERROR);
}

if((fpfin = open(fin_filespec, O_RDWR I O_BINARY, S_IREAD ' S_IWRITE)) ==
ERROR) pr_error(0);
free((void *)final);
return(ERROR);
}

size = (bin_mode - NORMAL_M) ? FORDSIZE : BINSIZE >> l;
while(size--) {

read(fpfin, final, nbytes);
pfinal = final;
cols = FORDSIZE;
while(cols--) {

*pfinal /= i~gcnt;
pfinal++;
lseek(fpfin, -2048L, SEEK_CUR);
write(fpfin, final, nbytes);
close(fpfin);
free((void ~)final);
return(0);

tdefine ELPERVOLT (5.81j Table 2, p.l30-CA 021222~ 1998-09-10 get stdev(fspec, cp) char *fspec;
struct curwindow *cp;
void *malloc();
int i, ave, x, y, cols, fpl, ystart, xstart, rows, *buf, *pbuf;
unsigned long total = OL, offsetbytes, filelength();
unsigned int nbytes;
char chbuft32~;
static struct genbox box = ~XIMAGE~IN + BINSIZE + 8,YIMAGEBIN +
100,27, 5};
struct genbox *bp;
bp = ~box;
if((fpl = open(fspec, O RDWR ' O_BINARY, S_IREAD I S IWRITE)) --ERROR) {

pr error(l);
return(ERROR);
}

nbytes = (filelength(fpl) == 524288L) ? FORDSIZE : FORDSIZE <~
l;
i = (filelength(fpl) == 524288L) ? 1 : 2;
if((buf = (int *)malloc(nbytes)) == NULL) {

pr error(5~;
close(fpl);
return(ERROR);
xstart = (cp->xpos < cp->xposl) ? cp->xpos : cp->xposl;
xstart -= XIMAGEBIN;
xstart *= i;
x = cols = (abs(cp->xpos - cp->xposl) + 1) * i;
ystart = (cp->ypos < cp->yposl) ? cp->ypos : cp->yposl;
ystart -= YIMAGEBIN;
ystart *= i;
y = rows = (abs(cp->ypos - cp->yposl) + 1) * i;
offsetbytes = nbytes * (long)ystart;
lseek(fpl, offsetbytes, SEEK_SET);
while(y--) {

read(fpl, buf, nbytes);
pbuf = buf + xstart;
x = cols;
while(x--) total += *pbuf++;
ave = total / ((long)cols * rows);
total = OL;

Table 2, p.131-CA 021222~ 1998-09-10 lseek(fpl, offsetbytes, SEEK SET);
y = rows;
while(y--) {

read(fpl, buf, nbytes);
pbuf = buf ~ xstart;
x = cols;
while(x--) i = *pbuf++ - ave;
- total += (long)i * i;
}
}

total /= ((long)cols * rows);
open box(bp);
x = bp->xpos + (C~RW << 1), y = bp->ypos I CHRH;
sprintf(chbuf, "Standard Dev = %6.2f", sqrt((double)total));
print 8x16(chbuf, x, y, FGDI, BGDI);
sprintf(chbuf, "Electrons RMS = %6.2f", ELPERVOLT *
sqrt((double)total));
print 8x16(chbuf, x, y += CHRH, FGDI, BGDI);
sprintf(chbuf, "Average Value = %4dn, ave);
print_8x16(chbuf, x, y l= CHRH, FGDI, BGDI);
get key();
close box(bp);
close(fpl);
free((void *)buf);
return;
}
/*********************************************************************
This function plots the data which is between the two ~UL~OLs ****--*~***********~**************************************************/
/*
Tony Scandura 07/21/86 11-18-8602-14-8904-04-90 */
~include "ccd.h"
plot(cp) struct curwindow *cp;
{

int i, x, y, dx, dy, nu~ber;
int xstart, ystart, xend, yend;
static unsigned char databuflBYTESPERLINE];
unsigned char *pixdata z databuf;
if(abs(cp->ypos - cp->yposl) < abs(cp->xpos - cp->xposl)) X = CD-->XpOS;

Table 2, p.132-CA 021222~ 1998-09-10 y = cp->xposl;
i = l;
}

else {

x = cp->ypos;
y = cp->yposl;
i = o;
if(x < y) xstart = cp->xpos;
xend = cp->xposl;
ystart = cp->ypos;
yend = cp->yposl;
else xstart = cp->xposl;
xend = cp->xpos;
ystart = cp->yposl;
yend = cp->ypos;
dx = xend - xstart;
dy = yend - ystart;

*pixdata++ = rd px xy~xstart, ystart);
if~i) {
for(x = xstart, i = 0; x ~ xend; x++, i++, pixdata++) {

y = ystart + (~long)i * dy) / dx;
*pixdata = rd px xy~x, y);
wr_px xy~x, y, MAXFGDI);
y = MAXVIDEOLINE - *~pixdata - l);
if~*pixdata > *~pixdata - 1)) {

number = *pixdata - *~pixdata - 1);
while~number--) wr_px xy~x - 1, y--, MAXFGDI);
}

else if~*pixdata < *~pixdata - 1)) {

number = *(pixdata - 1) - (*pixdata);
while(number--) wr px_xy~x - 1, y++, MAXFGDI);

}

else wr px_xy(x - 1, y, MAXFGDI);

Table 2, p.133-else for (y = ystart, i = 0; y < yend; y++, i+~, pixdata+~) x = xstart + ((long)i * dx) / dy;
*pixdata = rd_px_xy(x, y);
wr_px_xy(x, y, MAXFGDI);
x = *(pixdata - l);
if(*pixdata > *(pixdata - 1)) { number = *pixdata - *(pixdata - 1);
while(number--) wr px xy(x++, y - 1, MAXFGDI);
}

else if(*pixdata < *(pixdata - 1)) number = *(pixdata - 1) - (*pixdata);
while(number--) wr px xy(x--, y - 1, MAXFGDI);
}

else wr px_xy(x, y - 1, MAXFGDI);
}

}
/********************************************************************
This function prints out lines of data from the image memory.
Data can be sent to the CRT, lineprinter, or to a Lotus file.
*********************************************************************/
/*
Tony Scandura 04-04-89 04-06-90 */
tinclude <stdio. h>
tinclude "ccd.h"
tinclude "keys.h"
~define XLISTBOX 240 ~define YLISTBOX 672 tdefine XCNT 16 tdefine YCNT 4 tdefine k~CkOX 324 tdefine YFSPECBOX 160.
tdefine XERRORBOX 396 ~define YERRORBOX 320 print_data(cp) struct curwindow *cp;
{

int i, x, ~, xpr, ypr, xprint, yprint, xcnt, ycnt, line = l;

Table 2, p.134-int xstart, ystart, xwidth, cols, rows;
unsigned char far *pmem, far ~xy to ad();
char buftl6];
static ~L.u~L genbox box = {XLISTBOX, YLISTBOX, 68, 6~;
struct genbox *bp = &box;
xprint = XLISTBOX + (CHRW ~ l);
yprint = YLISTBOX + CHRH;
xstart = (cp->xpos < cp->xposl) ? cp->xpos : cp-~xposl;
xwidth = abs(cp->xpos - cp-~xposl) + l;
ystart = (cp->ypos < cp->yposl) ? cp->ypos : cp->yposl;
rows = abs(cp->ypos - cp->yposl) + 1;
switch(get outdevice()) case O:
open box(bp);
y = ystart;
while(rows--) {

xpr c xprint, ypr = yprint;
sprintf(buf, "Line %d:", line++);
print 8x16(buf, xpr, ypr, FGDI, BGDI);
ypr += CHRH;
xcnt = O;
ycnt = l;
x = xstart;
cols = xwidth;
while(cols--) ( pmem = xy to_ad(x++, y);
i = *pmem;
sprintf(buf, "~4d", i);
print 8x16(buf, xpr, ypr, FGDI, BGDI);
xpr += CHRW << 2;
if(++xcnt == XCNT) {

xcnt = O;
xpr = xprint;
ypr += CHRH;
if(++ycnt cc YCNT) {

ypr = yprint + CHRH;
ycnt = l;
get_key();
}

if(ycnt != YCNT) {

Table 2, p. 135-CA 02l22255 l998-09-lO

while(xcnt++ != XCNT) print_8xl6(n ", xpr, ypr, FGDI, 8GDI);
xpr += CHRW << 2;
}

while(++ycnt != YCNT) ( xcnt = 0;
xpr = xprint;
ypr += CHRH;
while(xcnt++ != XCNT) print 8x16(" n, xpr, ypr, FGDI, BGDI);
xpr += CHRW << 2;

}
}

Y++;
get key();
close_box(bp);
break, case 1:
y = ystart;
while(rows--) { pmem = xy_to ad(xstart, y++);
fprintf(stdprn, "\n\nLine %d:\n", line++);
cols = xwidth;
while(cols--) i = ~1 ~ I l;
fprintf(stdprn, "%4d", i);
}
fprintf(stdprn, "\f");
fflush(stdprn);
break;
case 2:
wr_lotus(cp);
break;
case ERROR:
return;

wr_lotus(cp) struct curwindow ~cp;

Table 2, p. 136-FILE ~strean;
int i, x, y, radix = lO, line = 1;
int xstart, ystart, xwidth, rows, cols;
int xprint = x~ CkOX + (CHRW << 1), yprint = YS~ OX + CHRH;
unsigned char far *pmem, far ~xy to ad();
char ~get filespec(), *itoa(), *pbuf, buft20~;
static struct genbox fspec box = {~ OX, YFSPECBOX, 47, 8);
static struct genbox error box = {XERRORBOX, YERRORBOX, 29, 7~;
struct genbox *eb, *fs;
eb = &error box;
fs = ~fspec box;
xstart = (cp-~xpos < cp->xposl) ? cp->xpos : cp->xposl;
xwidth = abs(cp->xpos - cp->xposl) + l;
ystart = (cp-~ypos < Cp->ypOSl) ? cp->ypos : cp-~yposl;
rows = abs(cp-~ypos - cp-~yposl) + l;
x = XERRORBOX + (CHRW << 1);
y = YERRORBOX + CHRH;
open box(fs);
print 8x16("Enter Filespec For Lotus File:", xprint, yprint, FGDI, BGDI);
if((stream = fopen(get filespec(xprint, yprint + (CHRH << l)),"w~
NULL) {

open_box(eb);
print 8x16(" E R R O R ", x, y, FGDI, BGDI);
print 8x16(nThe File Cannot Be Opened", x, y += CHRH << 1, FGDI, BGDI);
print 8x16("Press ANY Rey To Continue", x, y += CHRH << 1, FGDI, BGDI);
get key();
close box(eb);
close box(fs);
return(ERROR);
}

close_box(fs);
y = ystart;
while(rows--) pme~ = xy to ad(xstart, y++);
i = ~ I l;
pbuf = itoa(i, buf, radix);
fprintf(stream, "\"Line %d:\" %s\n", line++, pbuf);
cols = xwidth;
while(--cols) {

Table 2, p. 137-CA 021222~ 1998-09-10 i = ~ I l;
- pbuf = itoa(i, buf, radix);
fprintf(stream, ~-\n\" %s\nn, pbuf);

fclose(stream);
return( o);
/*********************f***************************************
This function reads the keyboard and L~ULI15 0 if no keys have been pressed, or the character if a key has been pressed.
Extended codes are LeLuL,Ied with the high order bit on.
********************************************************************/
/*
Tony Scandura 07-03-85 10-15-87 */
tinclude <dos.h>
~include <stdio.h>
readkey() int i;
if (kbhit()) if (i = getch()) return (i);
else return (getch() I Ox80);
return(o);

get_key() int i;
~hile(!(i - readkey()));
return(i);
/~*************************************************
These functions are for stereotatic imaging **************************************************/
/*
Tony Scandura 11-19-91 ~/ .
~include <stdio.h>

Table 2, p.138-CA 02122255 l99X-09-10 ~include <math.h>
~include "trident.h"
~include "ccd.h"
tdefine XINPUT (200) ~define YINPUT (256) ~define XANS (380) ~define YANS (256) ~define PI (3.1415927) static float fl reft3], f2 ref[3], fl_shd[3], f2 shd[3];
static float 11 reft3], 12 ref(3], 11 shdt3], 12_Shdt3];
static float srct3], rot angle = 30.0 * PI / 180.0;
static double xfin, yfin, zfin;
static float scale, dz, z pinpt, y pinpt, angle, c perp, c dist;
static int fli shdt2], f21 shdt2];
static int lli ref~2l, 12i reft2], lli_shdt2~, 12i shdt2];
static int xknlfe, yknife, y srcy;
static struct genbox box = ~ Ul', ~lN~U~, 78, 3};
static struct genbox ansbox = {XANS, YANS, 34, 6};
extern struct curwindow altcursor;
extern char *stereo filespec, *fin filespec, *tmp filespec;
extern int crt_mode, stereo mode;
get stereo settings() static struct menwindow menu =
{ 25, 6, " -- Mode Change Menu --", "F1: \xfl 15 Degree Rotation", "F2: \xfl 7.5 Degree Rotation", "F3: Recalculate Results", "F4: Turn Stereo Mode Off", "F5: Main Menu/No Changes"
~;
struct menwindow *wp;
wp = ~menu;
switch(get menu ptr(wp, TRUE, FALSE)) {

case 0:
rot angle = 30.0 * PI / 180.0;
break;
case 1:
rot angle = 15.0 * PI / 180.0;
break;
case 2:
calc results(FALSE);
break;
case 3:
stereo mode = o;
break;

Table 2, p.139-case 4:
break;
}
}

do_stereo() int i;
char buf[64], *get new_name(), *strrchr(), ~pchr;
static struct menwlndow menu =
12, 5, " Select One", "Fl: Continue", "F2: Process", n F3: Retake", "F4: Abort n static struct menwindow menul =
10, 3, "Select One", "F1: Retake", "F2: Abort"
struct menwindow *wp = ~menu, *wpl = ~menul;
clear image(0);
clear i~age(l);
crt mode = ERROR;
if(int image(fin filespec) == ERROR) crt mode = 1;
return;
while((i = get menu ptr(wp, TRUE, FALSE)) == 2);
switch(i) case 0:
break;
case 1:
chg contrast();
break;
case 3:
crt mode = 1;
~ eLl~L..;
break;
crt mode = 1;
dup image();
clear image(0);
copy lmage(fin filespec, tmp filespec);
crt_mode = ERROR;
if(int_image(fin filespec) - ERROR) switch(get_menu ptr(wpl, TRUE, FALSE)) Table 2~ p.140-CA 02l22255 l998-09-l0 case 0:
i = 2;
continue;
case 1:
crt mode = l;
return;
}

i = get menu ptr(wp, TR~E, FALSE);
while(i zz 2);
switch(i) {
case 0:
break;
case 1:
chg ~ont~dst();
break;
case 3:
crt mode = l;
return;
break;
}

calc_results(TRUE);
get_new_name(buf);
pchr z strrchr(buf, '~\');
*(pchr + 1) = '_'i *(pchr + 2) = '5';
if(exist file(buf) != ERROR) f(copy_image(tmp_filespec, buf) != ERROR) save annotation(buf);
*(pchr + 2j = 'T';
if(exist file(buf) != ERROR) f(copy image(fin filespec, buf) != ERROR) save stereo(buf);
crt mode = l;
}

calibrate ( ) static struct menwindow menu =
19, 7, " - Calibration -", "Fl: Enter Constants", "F2: Scale Factor", "F3: Find Source", "F4: Find Center", "F5: Save Parameters", "F6: Main Menu"
};
struct menwindow *wp = Lmenu;

Table 2, p.141-CA 021222~ 1998-09-10 while(l) switch(get ~enu ptr(wp, TRUE, FALSE)) {
case 0:
get constants();
break;
case l:
get scale fact();
break;
case 2:
find_source();
break;
case 3:
find center();
break;
case 4:
save_calibration();
break;
case 5:
return;
break;
}

get_constants() 20int xinput, yinput, xans, yans;
char buf~80], *gr gets();
struct genbox *bp = &box;
xinput = ~lN~U~ + (CHRW << l);
yinput = YlN~U~ + C~RH;
xans = XANS + (CHRW << l);
yans = YANS + CHRH;
open box(bp);
print 8xl6(nEnter distance from phosphor plane to fiducial plane: (mm) n, xinput, yinput, FGDI, BGDI);
sscanf(gr gets(buf, xinput + (59 << 3), yinput, 7), "%f", &dz);
print 8x16(nEnter distance from phosphor plane to fixture pinpoint: (mm) ", xinput, yinput, FGDI, BGDI);
sscanf(gr gets(buf, xinput + (61 <~ 3), yinput, 7), "%f~, 0 ~Z-Pinpt);
3 print 8x16(nEnter X and Y coordinates of left fiducial cross hair: (mm) ", xinput, yinput, FGDI, BGDI);
sscanf(gr gets(buf, xinput + (60 << 3), yinput, 13), ~ "%f%*c%f", fl_ref, Table 2, p.l42-CA 021222~ 1998-09-10 fl_ref + l);
print_8xl6(nEnter X and Y coordinates of right fiducial cross hair: (mm) n xinput, yinput, FGDI, BGDI~;
sscanf(gr gets(buf, xinput + (61 << 3), yinput, 131, _ n%f%*c%f", f2 ref, f2_ref ~ 1);
print_8xl6t"Enter a value for P perpendicular and N distance:
(mm) "
xinput, yinput, FGDI, BGDI);
sscanf(gr_gets~buf, xinput + (55 ~< 3), yinput, 13), "%fS*c~fn, ~c_perp, &c_dist);
close_box(bp);
bp = &ansbox;
open_box(bp);
sprintf(buf, "Phosphor to fiducial =%8.3f",dz);
print 8x16(buf, xans, yans, FGDI, BGDI);
sprintf(buf, "Phosphor to pinpoint =%8.3f",z_pinpt);
print_8x16(buf, xans, yans += CHRH, FGDI, 8GDI);
sprintf(buf, "Fiducial 1 xy =%7.3f,%7.3f", ~fl_ref, ~(fl_ref +
1 ) ) ;
print_8x16(buf, xans, yans += CHRH, FGDI, BGDI);
sprintf(buf, "Fiducial 2 xy =%7.3f,S7.3f", ~f2_ref, *(f2_ref +
1 ) ) ;
print_8x16(buf, xans, yans += CHRH, FGDI, BGDI);
~(fl_ref + 2) = ~(f2_ref + 2) = -dz;
get_key();
close_box(bp);
}
get_scale_fact() int i, xl, yl, x2, y2, x3, y3, x4, y4, oldx, oldy;
int xinput, yinput;
char buft64];
struct curwindow *altcp = &altcursor;
struct genbox *bp = &box;
xinput = ~lN~Ul + (CHRW << l);
yinput = ~lN~U~- + CHRH;
oldx = altcp->xpos;
oldy = altcp->ypos;
altcp-~xpos = 145;
altcp->ypos = 219;
move_cursor(altcp, TRUE, LEFT_IMG);
3û xl = altcp->xpos;
yl = altcp->ypos;
altcp->xpos = 365;
altcp->ypos = 219;
move_cursor(altcp, TRUE, LEFT_IMG);

Table 2, p.l43-CA 021222~ 1998-09-10 x2 = altcp->xpos;
y2 = altcp->ypos;
altcp->xpos = 146;
altcp->ypos = 439;
move cursor(altcp, TRUE, LEFT_IMG);
x3 = altcp->xpos;
y3 = altcp->ypos;
altcp->xpos = 365;
altcp->ypos = 439;
move_cursor(altcp, TRUE, LEFT IMG);
x4 - altcp->xpos;
y4 = altcp->ypos;
if(abs(x3-xl) > 1 ll abs(x4-x2) > 1 '¦ abs(y2-yl) > 1 abs(y4-y3) > 1) pr_error(ll);
scale = (abs(x2-xl) + abs(x4-x3) + abs(y3-yl) + abs(y4-y2)) /
112.0;
open_box(bp);
sprintf(buf, "The scale factor is: %.3f pixels per milli-metern, scale);
print 8x16(buf, xinput + 100, yinput, FGDI, BGDI);
get_key();
close box(bp);
altcp->xpos = oldx;
altcp->ypos = oldy;
}

find_source() int xinput, yinput, oldx, oldy;
struct curwindow *altcp = &altcursor;
struct genbox *bp = &box;
char buft64];
xinput = XIN~U ~ + ( CHRW << l);
yinput = YIN~U1 + CHRH;
oldx = altcp->xpos;
oldy = altcp->ypos;
altcp->xpos = 8;
altcp->ypos = 80;
move_cursor(altcp, TRUE, LEFT_IMG);
xknife = altcp->xpos;
yknife = altcp->ypos;
altcp->xpos = 256;
altcp->ypos = 144;
move cursor(altcp, TRUE, LEFT IMG);
*f2i_shd = altcp->xpos;
~(f2i_shd + 1) = altcp->ypos;
altcp->xpos = 256;
altcp->ypos =.512;

Table 2, p.l44-CA 021222~ 1998-09-10 move_cursor(altcp, TRUE, LEFT_IMG);
*fli shd 5 altcp-~xpos;
*(fll shd + 1) z altcp->ypos;
altcp->xpos = 256;
altcp->ypos = 328;
move cursor(altcp, TRUE, LEFT_IMG);
*fl shd = (*fli shd - xknife) / scale;
*(fl shd + 1) - (*(fli_shd + 1) - yknife) / scale;
*f2 shd = (*f2i shd - xknife) / scale;
*(f2 shd + 1) - ~*(f2i shd + 1) - yknife) / scale;
*(fl_shd + 2) = *(f2_shd + 2) = 0.0;
y_pinpt = (altcp->ypos - yknife) / scale;
altcp->xpos = oldx;
altcp->ypos = oldy;
calc_pos(*fl_shd, *(fl_shd + 1), *(fl_shd + 2), *fl ref, *(fl_ref + 1), *(fl_ref + 2), *f2_shd, *(f2_shd + 1), *(f2 shd + 2), *f2_ref, *(f2 ref + 1), ~(f2_ref + 2), src);
open_box(bp);
sprintf(buf, "The X-Ray source coordinates are: (%.3f, %.3f, %.3f)", *src, *(src + 1), *(src + 2));
print 8x16(buf, xinput + 60, yinput, FGDI, BGDI);
get_key();
close_box(bp);
open_box(bp);
y srcy = *(src + 1) * scale + yknife + 0.5;
sprintf(buf, "The Y cursor value for locating pinpoint is: %d", Y_srcy);
print_8x16(buf, xinput + 104, yinput, FGDI, BGDI);
get key();
close_box(bp);
) find center() int xinput, yinput, xans, yans;
char buft80], *gr_gets();
float tmpl, tmp2;
struct genbox *bp = &box;
xinput = XINPUT + (CHRW << l);
yinput = YlN~U~ + CHRH;
xans = XANS + (CHRW << l);
yans = YANS + CHRH;
open box(bp);
print_8x16(nEnter angle for which the pinpoint coincides with Y
origin:", Table 2, p.145-CA 021222~ 1998-09-10 xinput, yinput, FGDI, BGDI);
sscanf(gr gets(buf, xinput + (60 << 3), yinput, 6), "%f", ~angle);
close_box(bp);
if(angle l= o) {

angle *= PI / 180.0;
tmp2 = y_pinpt - *(src + 1);
tmpl = fabs(tmp2) * (z pinpt - *(src + 2)) / (angle *
-(*(src + 2)));
c_perp = tmpl * angle / 2;
if(tmp2 < 0.0) c_perp *= -1.0;
c dist = z_pinpt - tmpl;
}

bp = ~ansbox;
open_box(bp);
sprintf(buf, "Rotation angle pinpt =%8.3f", angle * 180.0 / PI);
print_8x16(buf, xans, yan~, FGDI, BGDI);
sprintf(buf, "Cnt perp to src perp =%8.3f",c_perp) print 8x16(buf, xans, yans += CHRH + 8, FGDI, BGDI ;
sprintf(buf, "Cnt perp dist to ori =%8.3f", c_dist ;
print_8x16(buf, xans, yans += CHRH + 8, FGDI, BGDII;
get key();
close_box(bp);

save_calibration() FILE *stream;~0 if((stream = fopen(stereo_filespec, "w")) -- NULL) pr_error(0);
return(ERROR);
fprintf(stream, n%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", *fl_ref, *(fl_ref + 1), *(fl ref + 2), *f2_ref, *(f2_ref + 1), *(f2_ref + 2), *fl_shd, *(fl shd + 1), *(fl shd + 2), *f2 shd, *(f2 shd + 1), *(f2 shd + 2), *src, *(src + 1), *(src + 2), scale, dz, z_pinpt, y_pinpt, angle, c_perp, c_dist);
fprintf(stream, " %i %i %i %i %i %i %i", *fli_shd, *(fli shd + 1), *f2i shd, *(f2i_shd +
1), --xknife, yknife, y_srcy);

Table 2, p. 146-CA 021222~ 1998-09-10 fclose(stream);
return(O);
}

rec_calibration() FILE *stream;
if((stream = fopen(stereo_filespec, "r")) == NULL) pr_error(O);
return(ERROR);
}

fscanf(stream, "%f %f ~f 3f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", fl_ref, fl_ref + 1, fl_ref + 2, f2_ref, f2_ref + 1, f2 ref + 2, fl_shd, fl_shd + 1, fl_shd + 2, f2_shd, f2_shd + 1, f2_shd + 2, src, src + 1, src + 2, &scale, &dz, &z_pinpt, ~y_pinpt, &angle, &c_perp, ~c_dist);
fscanf(stream, " %i %i %i %i %i %i %i~, fli_shd, fli_shd + 1, f2i_shd, f2i_shd + 1, &xknife, &yknife, &y_srcy);
fclose(stream);
return(O);
}

calc_xyz() float tmpl, tmp2, buflt3], bufO[3];
double tx();
tmpl = 2 * sin(rot_angle / 2.0) * hypot(c_dist, c_perp);
tmp2 = rot angle / 2.0 + asin(c_perp / hypot(c_dist, c_perp));
calc_pos(*ll_shd, *(ll_shd + 1), *(ll_shd + 2), 0.0, o.o, *(src + 2), tx(l.O, 0.0, 0.0, *12_shd, *(12_shd + 1), *(12_shd + 2), 0.0), tx(O.O, cos(rot_angle), cos(PI / 2.0 + rot_angle), *12_shd, *(12_shd + 1), *(12_shd + 2), -tmpl * cos(tmp2)), tx(O.O, cos(3.0 * PI / 2.0 + rot_angle), cos(rot_angle), *12_shd, *(12_shd + 1), *(12_shd +2), -tmpl * sin(tmp2)), tx(l.O, 0.0, 0.0, 0.0, O.o, *(src + 2), 0.0), tx(O.O, cos(rot_angle), cos(PI / 2.0 + rot_angle), o.o, o.o, *(src + 2), -tmpl * cos(tmp2)), tx(O.O, cos(3 * PI / 2 + rot_angle), cos(rot_angle), o.o, o.o, *(src + 2), -tmpl * sin(tmp2)), bufl);

Table 2, p.l47-CA 021222~ 1998-09-10 calc pos(*ll ref, *(11 ref + 1), *(ll_ref + 2), 0.0, 0.0, *(src + 2), tx(l.O, 0.0, 0.0, *12 ref, *(12 ref + 1), *(12_ref +2), 0.0), tx(O.O, cos(rot_angle), cos(PI 7 2.0 + rot_angle), *12 ref, *(12 ref + 1), *(12 ref + 21, -tmpl * cos(tmp2)), tx(O.O, cos(3.0 * PI / 2.0 + rot angle), cos(rot_angle), *12_ref, *(12_ref + 1), *(12_ref + 2), -tmpl * sin(tmp2)), tx(l.O, 0.0, 0.0, 0.0, 0.0, *(src + 2), 0.0), tx(O.O, cos(rot angle), cos(PI / 2.0 + rot_angle), 0.0, 0.0, *(src + 2), -tmpl * cos(tmp2)), tx(O.O, cos(3.0 * PI / 2.0 + rot_angle), cos(rot_angle), 0.0, 0.0, *(src + 2), -tmpl * sin(tmp2)), bufO);
yfin = tx(l.O, 0.0, 0.0, *bufl - *bufO, *(bufl + 1) - *(bufO +
1), *(bufl + 2) - *(bufO + 2), 0.0) * -1.0 -2.0;xfin = tx(O.O, cos(rot_angle / 2.0), cos(3.0 * PI / 2.0 +
rot_angle / 2.0), *bufl - *bufO, *(bufl + 1) - *(bufO + 1), *(bufl + 2) - *(bufO +2), 0.0);
zfin = tx(O.O, cos(PI / 2.0 + rot_anqle / 2.0), cos(rot_angle /
2.0), *bufl - *bufO, *(bufl + 1) - *(bufO + 1), *(bufl + 2) - *(bufO +2), 0.0);
}

double tx(ll, 12, 13, x, y, z, xO) double 11, 12, 13, x, y, z, xO;
return(ll * x + 12 * y + 13 * z + xO);
}

calc_pos(xl, yl, zl, x2, y2, z2, x3, y3, z3, x4, y4, z4, buffer) double xl, yl, zl, x2, y2, z2, x3, y3, z3, x4, y4, z4;
float *buffer;
{

float cl, c2, tl, t2, ul, u2, j, k;
cl = -(xZ-xl) * (xl - x3) - (y2 - yl) * (yl - y3) - (z2 - zl) *
(zl - z3);
30c2 = -(x4-x3) * (xl - x3) - (y4 - y3) * (yl - y3) - (z4 - z3) *
(zl - z3);
tl = (x2-xl) * (x2 - xl) + (y2 - yl) * (y2 - yl) + (z2 - zl) *
(z2 - zl);
t2 = (x2-xl) * (x4 - x3) + (y2 - yl) * (y4 - y3) + (z2 - zl) *

Table 2, p.148-CA 021222~S 1998-09-10 (z4 - Z3);
ul = -(x4-x3) * (x2 - xl) - (y4 - y3) * (y2 - yl) - (z4 - z3) *
(z2 - zl);
u2 = -(x4-x3) * (x4 - x3) - (y4 - y3) * (y4 - y3) - (z4 - z3) *
(z4 - z3);
j = (cl * u2 - c2 * Ul) / (tl * u2 - t2 * ul);
k = (tl * c2 - t2 * cl) / (tl * u2 - t2 * ul);
*buffer++ = (xl + j * (x2 - xl) + x3 + k * (x4 - x3)) / 2;
*buffer++ = (yl + j * (y2 - yl) + y3 + k * (y4 - y3)) / 2;
*buffer = (zl + j * (z2 - zl) + z3 + k * (z4 - z3)) t 2;
save stereo(fspec) char *fspec;
{

FILE *stream;
char buffert64], *strcat();
sscanf(fspec, "%t~-]", buffer);
strcat(buffer, ".ste");
if((stream = fopen(buffer, "w")) == NULL) {

pr_error(o);
return(ERROR);
fprintf(stream, "%d %d %d %d %d %d %d %d %f %f %f", *lli_ref, *(lli_ref + 1), *12i_ref, *(12i ref + 1), *lli shd, *(lli_shd + 1), *12i_shd, *(12i shd + 1), xfin, yfin, zfin);
fclose(stream);
return(0);
}

rec_stereo(fspec) char *fspec;
{

FILE *stream;
char buffert64], *strcat();
int i, fp;
sscanf(fspec, "~[~.]", buffer);
strcat(buffer, ".ste");
if((stream = fopen(buffer, "r")) == NULL) pr_error(O);
return(ERROR);
fscanf(stream, "%d %d %d %d %d %d %d %d %f %f %f", Table 2, p.149-CA 021222~ 1998-09-10 lli ref, lli_ref + 1, 12i_ref, 12i_ref + 1, lli_shd, lli_shd + 1, 12i_shd, 12i_shd + 1, &xfin, &yfin, &zfin);
fclose(stream);
return(o);

pr_stereo_result() int xans = 676, yans = 0;
char buft64];
struct genbox *bp = &box;
bp = &ansbox;
sprintf(buf, "Final X value =%8.3f", xfin);
print_8x16(buf, xans, yans, FGDI, O);
sprintf(buf, "Final Y value =%8.3f", yfin);
print_8x16(buf, xans, yans += CHRH + 8, FGDI, 0);
sprintf(buf, "Final Z value =%8.3fn, zfin);
print_8x16 buf, xans, yans ~= CHRH + 8, FGDI, 0);
wr_cur_dotl*lli_ref, *(lli_ref + l));
wr_cur_dot *12i_ref + BINSIZE, *(12i_ref + 1));
wr_cur_dot *lli_shd, *(lli_shd + l));
wr_cur_dot *l2i_shd + 8INSIZE, *(12i_shd + 1));

calc_results(ref_flagJ
int ref_flag;

int i, oldx, oldy;
struct curwindow *altcp = &altcursor;
oldx = altcp->xpos;
oldy = altcp->ypos;
if(ref_flag) altcp->xpos = XIMAGEBIN + 493;
altcp->ypos = YIMAGEBIN + 256;
move_cursor(altcp, FALSE, LEFT_IMG);
*lli ref = altcp->xpos;
*(lll_ref + 1) = altcp->ypos;
altcp->xpos = XIMAGEBIN + 256;
altcp->ypos = YIMAGEBIN + 256;
move_cursor(altcp, FALSE, LEFT_IMG);
*lli_shd = altcp->xpos;
*(lli_shd + 1) = altcp->ypos;
if(ref_flag) {

Table 2~ p.150-CA 021222~ 1998-09-10 altcp->xpos = XIMAGEBIN + 1005;
altcp-~ypos = YIMAGEBIN + 256;
move_cursor(altcp, FALSE, RIGHT_IMG);
*12i ref = altcp->xpos - BINSIZE;
*(121_ref + 1) = altcp->ypos;
altcp->xpos = XIMAGE8IN + 768;
altcp->ypos = YIMAGEBIN + 256;
move_cursor(altcp, FALSE, RIGHT IMG);
*12i_shd = altcp->xpos - 8INSIZE;
*(12i_shd + 1) = altcp->ypos;
*11 shd = (*lli_shd - xknife) / scale - *src;
*(11 shd + 1) - (*(lli_shd + 1) - yknife) / scale - *(src + 1);
*12_shd = (*12i_shd - xknife) / scale - *src;
*(12_shd + 1) - (*(12i_shd + 1) - yknife) / scale - *(src + 1);
*11_ref = (*lli_ref - xknife) / scale - *src;
*(ll_ref + 1) - (*(lli_ref + 1) - yknife) / scale - *(src + 1);
*12_ref = (*12i_ref - xknife) / scale - *src;
*(12_ref + 1) - (*(12i_ref + 1) - yknife) / scale - *(src + 1);
*(ll_shd + 2) = *(12_shd + 2) = *(ll_ref + 2) = *(12_ref + 2) =
o.O;
calc_xyz();
pr_stereo_result();
altcp->xpos = oldx;
altcp->ypos = oldy;
!***********************************************************************
Collection of BIOS routines to communicate with the video display ************************************************************************

/*
Tony Scandura 10-25-90 */
~include <dos.h>
~include "trident.h"
cursor(column, row) int column, row;
union REGS inregs;
inregs.h.ah = Ox02;
inregs.h.bh = 0;
inregs.h.dh = row;

Table 2, p. 151-CA 021222~ 1998-09-10 inregs.h.dl = column;
int86~0xlO, &inregs, &inregs);

}

reset_vid_mode() set_vid_mode(get_vid_mode());

clscreen() union REGS inregs, outregs;

cursor(O,O);
inregs.h.ah = OxO9;
inregs.h.al = Ox20;
inregs.x~bx = Ox0007;
inregs.x.cx = 2000;
int86(0xlO, &inregs, &outregs);
}

blink(pstring) char *pstring;
wr_ch_atr(pstring, BLINK, O);

wr_tty(pstring, intensity) char *pstring;
int intensity;

union REGS inregs, outregs;

inregs.h.ah = OxOe;
inregs.h.bh = O;
inregs.h.bl = intensity;
while(inregs.h.al = *pstring++) int86(0xlO, &inregs, &outregs);
}

/*
fgnd_int: foreground (graphics)(if bit 7 = 1 XORed, except 2S6 color) attribute (text) bgrd_int: background (256 color) video page (all others) (background = O
in other graphic modes) Table 2, p. 152-CA 02l222~ l998-09-lO

wr_ch_atr(pstring, fgnd_int, bgrd_int) char *pstring;
int fgnd_int, bgrd int;
union REGS inregs, outregs;
int row, column;
inregs.h.ah = Ox03;
inregs.h.bh = OxOO;
int86(0xlO, &inregs, &outregs);
row = outregs.h.dh;
column = outregs.h.dl;
inregs.h.bh = bgrd_int;
inregs.h.bl = fgnd int;
inregs.x.cx = l;
while(inregs.h.al = *pstring++) switch(inregs.h.al) case '\b':
case '\r':
case '\n':
inregs h.ah = OxOe;
int86(0xl O, &inregs, &outregs);
inregs.h.ah = Ox03;
inregs.h.bh = Oxoo;
int86(0xlO, &inregs, &outregs);
row = outregs.h.dh;
column = outregs.h.dl;
break;
default:
inregs.h.ah = OxO9;
int86(0xlO, &inregs, &outregs);
cursor(++column, row);
}
?

wr one_ch(achar, number, fgnd_int, bgrd_int) char achar;
int number, fgnd_int, bgrd_int;
union REGS inregs, outregs;
int row, column;
~0 inregs.h.ah = Ox03;
inregs.h.bh = OxOO;
int86(0xlO, &inregs, &outregs);
- ~able 2 p.153-Table 2, p.153-- CA 02l222~ l998-09-lO

row = outregs.h.dh;
column = outregs~.h.dl;
inregs.h.bh = bgrd_int;
inregs.h.bl = fgnd_int;
inregs.x.cx = number;
inregs.h.al = achar;
switch(inregs.h.al) {

case '\b':
case '\r':
case '\n':
inregs.h.ah = OxOe;
int86(0xlO, &inregs, &outregs);
break;
default:
inregs.h.ah = OxO9;
int86(0xlO, &inregs, &outregs);
cursor(++column, row);

get_vid_mode() union REGS inregs;
inregs.h.ah = OxOf;
int86(0xlO, &inregs, &inregs);
return(inregs.h.al);
}

set_gs_summing(disable) int disable;
union REGS inregs;
inregs.h.ah = Ox12;
inregs.h.bl = Ox33;
inregs.h.al = disable;
int86(0xlO, &inregs, &inregs);

set_df pallet(disable) int disable;
union REGS inregs;
inregs.h.ah = Ox12;
inregs.h.bl = Ox31;
inregs.h.al = disable;
int86(0xlO, &inregs, &inregs);

Table 2, p.l54-CA 021222~ 1998-09-10 set_vid_mode(mode) int mode;
union REGS inregs;
inregs.h.ah = OxOO;
inregs.h.al = mode;
int86(0xlO, &inregs, &inregs);
~0 reset_grayscales() int i;
union REGS inregs;
unsiyned char buf~768];
unsigned char far *pbuf;
struct SREGS segregs;
pbuf = buf;
for(i = O; i < 256; i++) *pbuf++ = i >> 2;
*pbuf++ = i >> 2;
*pbuf++ = i >> 2;
pbuf = buf;
load_grayscale(pbuf);
/* BIOS versions - Too slow set_vid_seg(segment) int segment;
union REGS inregs;
inregs.x.ax = Ox007f;
inregs.h.bh = OxO9;
inregs.h.bl = segment;
int86(0xlO, &inregs, &inregs);
?

load_grayscale(pbuf) unsigned char far *pbuf;
union REGS inregs;
struct SREGS segregs;
inregs.h.ah = OxlO;
inregs.h.al = Ox12;

Table 2, p.155-CA 021222~ 1998-09-10 inregs.x.bx = 0x0000;
inregs.x.cx = 0x0100;
inregs.x.dx = FP OFF(pbuf);
segregs.es = FP SEG(pbuf);
int86(0xlO, &inregs, &inregs);
*/
/*~********************************************************
This program implements the cursor readout function *****************~************************************~***/
/*
Tony Scandura 03/07/90 */
tinclude <stdio.h>
tinclude "ccd.h"
tinclude "keys.h"
tdefine CVR_AVE SIZE (9) tdefine CURSOR HLUM (200) tdefine CURSOR LLUM (8) tdefine XCURBOX (XIMAGEBIN + BINSIZE + 8) tdefine YCURBOX (YDISPLAYPOS) ~define XCURSORMAX (XIM~GEBIN + BINSIZE - 5) tdefine YCURSORMAX (YIMAGEBIN + BINSIZE - 5) ~define XCURSORMIN (XIMAGEBIN + 4) ~define YCURSORMIN (YIMAGEBIN + 4) extern struct curwindow altcursor;
extern int mincontrast, maxcontrast, invert flag;
xycursor(cp) struct curwindow *cp;
static struct menwindow menu =
{

22, 5, n - Cursor Menu -", "F1: Read Single Pixel", "F2: Read Average Of 9", "F3: Region Of Interest", "F4:
- Main Menu -"
struct menwindow *wp;
struct curwindow *altcp;
wp - &menu;
altcp = &altcursor;
while(1) switch(get_menu_ptr(wp, TRUE, FALSE)) {

Table 2, p.156-CA 021222~ 1998-09-10 case O:
altcp->ave = FALSE;
move cursor(altcp, TRUE, LEFT_IMG);
wr cursor(altcp->pixdatat0], altcp->xpos, altcp->ypos);
break;
case 1:
altcp->ave = TRUE;
move_cursor(altcp, TRUE, LEFT_IMG);
wr cursor(altcp->pixdata[0], altcp->xpos, altcp->ypos);
break;
case 2:
region of int(cp);
break;
case 3:
case 4:
return;
break;
}
}

move_cursor(cp, print flag, lr) struct curwindow *cp;
int print_flag, lr;
int i, prev_key, nrepeats, increment, value, realvalue, maxmin;
int xprint - XCURBOX + (CHRW << 1), yprint = YCURBOX + CHRH, xmax, xmin;
char buffer[32~;
static struct genbox box = {XCURBOX, YCURBOX, 34, 3};
struct genbox ~bp;
bp = Lbox;
xmin = (lr) ? XCURSORMIN + BINSIZE : XCURSORMIN;
xmax = (lr) ? XCURSORMAX + BINSIZE : XCURSORMAX;
rd_cursor(cp->pixdata[0], cp->xpos, cp->ypos);
if(print_flag) open_box(bp);
value = cursor value(cp->pixdata[0], cp->ave);
maxmin = maxcontrast - mincontrast ~ 1;
realvalue = (invert_flag) ? 255 - value : value;
realvalue = ((long)realvalue * maxmin) / 255L
mincontrast;
sprintf(buffer, "Pixel at %3d, %3d = %3d (~4d)", cp->xpos, cp->ypos, value, realvalue);
print 8xl6(~uffer, xprint, yprint, FGDI, BGDI);

Table 2, p. 157-CA 021222~ 1998-09-10 wr_cur_dot(cp->xpos, cp->ypos);
while ((i = get_key()) != '\r') if(i = prev_key) in~L~ -nt = (nrepeats++ > 10) ? 8 : 4;
else increment = 4;
nrepeats = O;
}

prev_key = i;
wr cursor(cp->pixdatatO], cp->xpos, cp->ypos);
swltch ( i ) {

case UP_ARROW:
cp-->ypos __;
break;
case DOWN_ARROW:
cp-->ypos++;
break;
case RIGHT_ARROW:
cp-->xpos++;
break;
case LEFr_ARROW:
cp-->xpos----;
break;
case PG_UP:
cp-->xpos++, cp-->ypos----;
break-case PG_DOWN:
cp-->xpos++, cp->ypos++;
break;
case HOME_REY:
cp-->xpos----, cp-->ypos----;
break;
case END_REY:
cp-->xpos---, cp-->ypos++;
break;
case '6':
cp->xpos += increment;
break;
case '4':
cp->xpos -= increment;
break;
case '2':
cp->ypos += increment;
break;
case '8':
cp->ypos -= increment;
break;

Table 2, p.150-CA 021222~ 1998-09-10 case '9':
Cp->ypO5 -5 increment, cp-~xpos +=
increment;
break;
case '3':
cp->ypos += increment, cp-~xpos +=
incre~ent;
break;
case '7':
cp->ypos -= increment, cp->xpos -=
increment;
break;
case '1':
cp->ypos += increment, cp->xpos -=
increment;
break;
}

cp->xpos = (cp-~xpos < xmin) ? xmin : cp->xpos;
cp->xpos = (cp-~xpos > xmax) ? xmax : cp->xpos;
cp->ypos = (cp->ypos < YCURSORMIN) ? YCURSORMlN :
cp->ypos;
cp->ypos = (cp->ypos > YCURSORMAX) ? YCURSORMAX :
cp->ypos;
rd_cursor(cp->pixdatato], cp->xpos, cp->ypos);
wr_cur_dot(cp->xpos, cp->ypos);
if(print_flag) value = cursor_value(cp->pixdatatO], cp-~ave);
realvalue = (invert_flag) ? 25S - value : value;
realvalue = ((long)realvalue * -- in) / 25SL +
mincontrast;
sprintf(buffer, "Pixel at %3d, %3d = ~3d (%4d)", cp - >xpos ~ cp--7ypos ~
value, realvalue);
print_8xl6(buffer, xprint, yprint, FGDI, BGDI);
}
if(print flag) close box(bp);
}

wr_cursor(cursor data, x, y) int *cursor_data;
int x, y;
wr_px_xy x++, y, *cursor_data++';
wr_px_xy Ix~ y++, *cursor data++ ;
wr_px_xy x--, y, *cursor_data++ ;
wr_px_xy 'x--, y, *cursor_data++ ;
wr_px_xy x, y--, *cursor data++ ;
wr_px_xy x, y--, *cursor_data++ :

Table 2, p.l59-CA 021222~ 1998-09-10 wr px_xy ~x++, y, *cursor data++);
wr px xy Ix++, y, *~ULaGL _data++);
wr px_xy x--, y--, *cursor_data++);
wr_px_xy x, y, *cursor_data++);
wr_px_xy x += 2, y, *cursor_data++~;
wr px_xy x, y += 2, *cursor_data++ ;
wr px xy x, y += ,2, *cursor_data++ ;
wr px_xy x -= 2, y, *cursor_data++ ;
wr px xy x -= 2, y, *cursor data++ ;
wr px xy x, y -= 2, *cursor_data++ ;
wr px_xy x, y -= 2, *cursor_data++,;
wr px_xy ~x += 2, --y, *cursor data++);
wr_px_xy x += 3, y, *cursor_data++';
wr px_xy x, y += 3, *cursor_data++ ;
wr px_xy 'x, y += 3, *cursor_data++ ;
wr px_xy x -= 3, y, *cursor_data++ ;
wr_px_xy x -= 3, y, *~ula~L_data++ ;
wr_px_xy x, y -= 3, *cursor_data++ ;
wr_px_xy x, y -= 3, *cursor data++J;
wr px_xy ~x += 3, --y, *cursor data++);
wr_px_xy ~x += 4, y, *cursor_data++';
wr_px_xy ~x, y += 4, *cursor_data++ ;
wr_px_xy x, y += 4, *cursor_data++J;
wr_px_xy ,x -= 4, y, *cursor_data++l;
wr_px_xy x -= 4 , y , *cursor_data++l;
wr_px_xy ,x, y -= 4, *cursor_data++ ;
wr_px_xy I x, y -= 4, ~cursor data++J;
wr_px_xy x += 4, --y, *cursor_data++);
wr_Fx_xy x += 5, y, *cursor_data++';
wr_px_xy, x, y += 5, *cursor_data++ ;
wr_px_xy x, y += 5, *cursor_data++ ;
wr_px xy x -= 5, y, *cursor_data++ ;
wr_px_xy x -= 5, y, *cursor_data++ ;
wr px_xy x, y -= S, *cursor_data++ ;
wr_px_xy x, y -= 5, *cursor_data++,;
wr_px_xy x += 5, --y, *cursor_data++);
wr_px_xy x += 6, y, *cursor_data++';
wr._px_xy ~x, y += 6, *cursor_data++ ;
wr_px_xy x, y += 6, *cursor_data++ ;
wr_px_xy x -= 6, y, *cursor_data++ ;
wr px xy x -= 6, y, *cursor data++ ;
wr px_xy x, y -= 6, *cursor_data++ ;
wr_px_xy ,x, y -= 6, *cursor_data++,;
rd_cursor(cursor_data, x, y) int *cursor_data;
int x, y;
( *cursor_data++ = rd_px_xy (x++, y);
*cursor_data++ = rd px_xy (x, y++);

Table 2, p. 160-CA 02l222~ l998-09-lO

*cursor data++ = rd px xy 'x--, y';
*cursor data++ e rd px xy x--, y ;
*cursor data++ = rd px xy x, y-- ;
*cursor data++ e rd_px xy x, y-- ;
*cursor data++ = rd_px xy x++, y ;
*cursor data++ = rd_px xy x++, y~;
*cursor data++ = rd px xy x--, y--);
*cursor data++ = rd_px xy ,x, y);
*cursor data++ = rd px xy x += 2, y ;
*cursor data++ = rd_px xy x, y += 2 ;
*cursor data++ = rd_px xy x, y += 2 ;
*cursor data++ = rd px xy ~x -= 2, y ;
*cursor data++ = rd_px xy x -= 2, y ;
*cursor data++ = rd_px xy ,x, y -= 2 ;
*cursor data++ = rd_px xy x, y -= 2,;
*cursor data++ = rd_px xy x += 2, --y);
*cursor_data++ = rd px_xy x += 3, y';
*cursor data++ = rd px xy x, y += 3 ;
*cursor data++ = rd px xy x, y += 3 ;
*cursor data++ = rd px xy Ix -= 3, y ;
*cursor data++ = rd px xy x -= 3, y ;
*cursor data++ = rd px xy x, y -= 3 ;
*cursor data++ = rd_px xy x, y -= 31;
*cursor data++ = rd px xy x += 3, --y);
*cursor_data++ = rd px xy x += 4, y'~;
*cursor_data++ = rd px_xy x, y += 4 ;
*cursor_data++ = rd px_xy x, y += 4 ;
*cursor data++ = rd_px xy x -= 4, y ;
*cursor_data++ = rd px_xy x -= 4, y ;
*cursor_data++ = rd px_xy x, y -= 4 ;
*cursor data++ = rd px xy x, y -= 4,;
*cursor data++ = rd px xy x += 4, --y);
*cursor_data++ = rd px xy x += 5, y ;
*cursor data++ = rd px_xy x, y += 5 ;
*cursor data++ = rd px_xy x, y += 5 ;
*cursor data++ = rd_px_xy x -= 5, y ;
*cursor data++ = rd px_xy ,x -= 5, y ;
*cursor_data++ = rd px_xy x, y -= 5 ;
*cursor data++ = rd px xy x, y -= 5 ;
*cursor data++ = rd px_xy x += 5, --y);
*cursor_data++ = rd px_xy x += 6, y';
*cursor data++ = rd_px_xy x, y += 61;
*cursor data++ = rd px_xy x, y += 6 ;
*cursor data++ = rd px_xy fx -= 6, y ;
*cursor data++ = rd_px_xy x -= 6, y ;
*cursor data++ = rd_px xy ,x, y -= 6 ;
*cursor data++ = rd_px_xy ~x, y -= 6j;
wr_cur_dot(x, y) int x, y;

Table 2, p.161-CA 02l222~ l998-09-l0 wr px xy ~x++, y, CURSOR HLUM';
wr px xy ~x, y++, CURSOR LLUM ;
wr_px xy x - - , y, CURSOR HLUM ;
wr px xy x - - , y, CURSOR LLUM ;
wr px xy x, y--, CURSOR HLUM ;
wr px xy x, y - - , CURSOR LLUM ;
wr px xy x++, y, CURSOR HLUM ;
wr px xy x++, y, CURSOR LLUM ;
wr px xy, x - - , y - - , CURSOR HL-JM);
1 0 wr px xy x , y , CURSOR LLUM);
wr px xy x += 2, y, CURSOR_HLUM ;
wr px xy x, y += 2, CURSOR_LLUM ;
wr px xy ~ x, y += 2, CURSOR HLUM ;
wr px xy X -= 2, y, CURSOR LLUMI;
wr px_xy x -= 2, y, CURSOR HLUM ;
wr px xy x, y -= 2, CURSOR LLUM ;
wr px xy x , y - = 2, CURSOR HLUM ;
wr px xy x += 2, --y, CURSOR LL~M);
wr px xy x += 3, y, CURSOR HLUM';
wr px xy x, y += 3, CURSOR LLUM ;
wr px xy x, y += 3, CURSOR HLUM ;
wr px xy x -= 3, y, CURSOR_LLUM ;
wr px xy x -= 3, y, CURSOR_HLUM ;
wr px_xy x, y -= 3, CURSOR_LLUM ;
wr_px_xy Ix, y -= 3, CURSOR_HLUM ;
wr px_xy x l= 3, --y, CURSOR LL-JM);
wr px_xy x += 4, y, CURSOR HLUM';
wr px xy x, y += 4, CURSOR LLUM ;
wr px xy X, y += 4, CURSOR HLUM ;
wr px xy x -= 4, y, CURSOR_LLUM~;
wr px xy x -= 4, y, CURSOR HLUM ;
wr px xy x, y - = 4, CURSOR LLUM~;
wr px xy x, y -= 4, CURSOR HLUM ;
wr px xy fx += 4, --y, CURSOR LLJM);
wr px xy x += 5, y, CURSOR HLUM';
wr px xy x, y += 5, CURSOR LLUM ;
wr px xy x, y += 5, CURSOR HLUM ;
wr px xy x -= 5, y, CURSOR LLUM ;
wr px xy x -= 5, y, CURSOR HLUM ;
wr px xy , x, y -= 5, CURSOR LLUM ;
wr px xy x, y -= 5, CURSOR HLUM ;
wr px xy x += 5, --y, CURSOR LL'IM);
wr px xy x += 6, y, CURSOR HLUM';
wr px xy x, y += 6, CURSOR LLUM ;
wr px Xy x, y += 6, CURSOR HLUMj;
wr px xy x -= 6, y, CURSOR LLUM ;
wr px xy x -= 6, y, CURSOR HLUM ;
wr px xy x, y -= 6, CURSOR LLUM ;
wr px xy ~x, y -= 6, CURSOR HLUM,;

Table 2, p. 162-CA 02l222~ l998-09-l0 cursor_value(cursor data, average) int *cursor_data, average;
int i, size, value = O;
i = size = (average) ? CUR AVE SIZE : 1;
while(i--) value += *cursor data++;
return(value / size);
}

region of int(cp) struct curwindow *cp;
{

int *data;
static struct menwindow menu =
{

17, 4, " - ROI Menu -", "Fl: Entire Image", "F2: Mark A Block", "F3: Previous Menu"
} ;
struct menwindow *wp;
wp = &menu;
w~ile(l) { switch(get_menu ptr(wp, TRUE, FALSE)) case O:
cp->xpos = XIMAGEBIN;
cp->ypos = YIMAGEBIN;
cp->xposl = XIMAGEBIN + BINSIZE - l;
cp->yposl = YIMAGEBIN + BINSIZE - l;
rd cursor(cp->pixdatatO], cp->xpos, cp->ypos);
1 eL~;
break;
case 1:
cp->xpos = (cp->xpos < XCURSORMIN) ? XCURSORMIN
: cp->xpos;
cp->xpos = (cp->xpos > XCURSORMAX) ? XCURSORMAX
: cp-->xpos;
cp->ypos = (cp->ypos < YCURSORMIN) ? YCURSORMIN
: cp->ypos;
cp-~ypos = (cp-~ypos > YCURSORMAX) ? YCURSORM~X
: cp->ypos;
cp->ave = FALSE;
-move cursor(cp, TRUE, LEFT_IMG);
Cp - >Xposl = cp->xpos;
cp->yposl = cp->ypos;

Table 2, p.163-CA 021222~ 1998-09-10 data = cp-jpixdata~0];
.cp->pixdatat0] = cp->pixdatatl];
move_cursor(cp, TRUE, LEFT_IMG);
cp->pixdatatl] = data;
wr cursor(cp->pixdatatO], cp->xpos, cp->ypos1;
wr_cursor(cp->pixdatatl], cp->xposl, cp->yposl);
return;
break;
case 2:
return;
break;
}

}
~ del.mac ;**
: This macro library generates the appropriate GROUP, SEGMENT, and ASSUME statements for the memory model being used.
;**

, The following symbols define the 8086 memory mode being used. Set LPROG
: to l for a large program segment (greater than 64K-bytes), and set LDATA
; to l for a large data segment.
;

;**

~ * *
; The following symbols are established via LPROG and LDATA as follows:
;

; S8086 set for small model (small prog, small data) ; D8086 set for model with larqe data, small prog ; P8086 set for model with large prog, small data ; L8086 set for large model ;

;*~ ' IF (LPROG EQ 0) AND (LDATA EQ 0) ENDIF

Table 2, p.164-CA 021222~ 1998-09-10 IF (LPROG EQ O) AND (LDATA NE O) ENDIF
IF (1PROG NE O) AND (LDATA EQ O) ENDIF
IF (LPROG NE O) AND (LDATA NE O) ENDIF
~ * *
; The DSEG and PSEG macros are defined to generate the appropriate GROUP, ; SEGMENT, and ASSUME statements for the memory model being used. The ENDDS
; and ENDPS macros are then used to end the segments.
;

;**
DSEG MACRO
DATA SF:~I.~N~ WORD PUBLIC 'DATA' ASSUME DS:DGROUP, SS:DGROUP, ES:DGROUP
ENDM
ENDDS MACRO
DATA ENDS
ENDM

TEXT ~..~N'l' WORD PUBLIC 'CODE' TEXT ENDS
DATA SEGMENT WORD PUBLIC 'DATA' -DATA ENDS
CONST S~.l~l WORD PUBLIC 'CONST' CONST ENDS
BSS SEGMENT WORD PUBLIC 'BSS' BSS ENDS
DGROUP GROUP CONST, BSS, _DATA
PSEG MACRO
TEXT SEGMENT WORD PUBLIC 'CODE' ASSUME CS: TEXT, DS:DGROUP, SS:"DGROUP, ES:DGROUP

Table 2, p.165-ENDM
ENDPS MACRO
_TEXT ENDS
ENDM
ENDIF

PSEG MACRO
DATA S~... .h ~ WORD PUBLIC 'DATA' DATA ENDS
CONST S~... ~:h ~ WORD PUBLIC 'CONST' CONS~ ENDS
BSS ~.... ~h 1 WORD PUBLIC 'BSS' BSS ENDS
~KOU~ GROUP CONST, BSS, DATA
TEXT ~..~h ~ BYTE PUBLIC 'CODE' ASSUME CS: TEXT, DS:DGROUP, SS:DGROUP, ES:DGROUP
ENDM
ENDPS MACRO
TEXT ENDS
ENDM
ENDIF

PSEG MACRO
CODE SEGMENT BYTE
ASSUME CS: CODE
ENDM
ENDPS MACRO
CODE ENDS
ENDM
ENDIF

PSEG MACRO
PROG S~h ~ BYTE
ASSUME CS: PROG
ENDM
ENDPS MACRO
PROG ENDS
ENDM
ENDIF

Table 2, p.l66-

Claims (47)

WHAT IS CLAIMED IS:
1. An X-ray table assembly for supporting a female patient in a prone position for mammography procedures, comprising:
a base having a front portion and a rear portion, a rear pedestal upstanding from the rear portion of said base, a. substantially flat and horizontal patient-supporting platform which is supported cantilever-fashion from a rear longitudinal edge by said rear pedestal, having a free unsupported front edge, a right end, a left end, and a concavely-dished shallow torso-receiving recess extending across its central portion from said pedestal to said front edge, means centrally positioned in said platform recess, mid-way between said right end and said left end, forming an open breast-receiving aperture for pendulant presentation of the patient's breast therethrough below the level of the platform, whether the patient's head is positioned to the right or to the left of said aperture, means forming wide shallow right and left underside recesses in said platform flanking said breast-receiving aperture and said shallow torso-receiving recess, a C-arm pivotally mounted on the pedestal beneath the platform for angular movement about a vertical pivot axis aligned with said aperture and having a near end supporting an image receptor, and a remote end supporting an X-ray tubehead forming an X-ray source, said C-arm being dimensioned for pivotal movement through a wide arc of more than 180° around the breast-receiving aperture, positioning the X-ray source in any of an infinite number of source positions ranging from the direction of one end of said platform through a lateral position remote from said rear pedestal to the direction of the other end of said platform, with the tubehead having an upper end positionable in either of said shallow underside recesses above the level of said breast-receiving aperture, thereby facilitating X-ray source positioning around more than a 360° range of positions, with the patient's head positioned toward either the right end or the left end of the platform, a fixed compression plate independent of said C-arm, positioned under said platform near said vertical pivot axis for gentle abutting contact with the patient's presented breast, a movable compression paddle positioned under said platform near said first compression plate for gentle clamping of said presented breast between said compression plate and said paddle independent of said pivotally mounted C-arm, and X-ray responsive image-forming means mounted on said image receptor.
2. An X-ray table assembly for supporting a female patient in a prone position for mammography procedures, comprising:
a base having a front portion and a rear portion, a rear pedestal upstanding from said rear portion of the base, a substantially flat, horizontal, elongated patient-supporting platform which is centrally supported cantilever-fashion from a rear longitudinal edge by said rear pedestal and having a free unsupported front edge, and unsupported right and left lateral ends, means centrally positioned in said platform between said ends, forming an open breast-receiving aperture for pendulant presentation of the patient's breast therethrough below the level of the platform, a C-arm having a remote end supporting an X-ray tubehead forming an X-ray source, and a near end supporting an image receptor, pivotally mounted on the rear pedestal beneath the platform for angular movement through an angular range of more than 180° about a vertical pivot axis aligned with said aperture positioning the X-ray source in any of an infinite number of source positions ranging from the direction of one end of said platform through a lateral position remote from said rear pedestal to the direction of the other end of said platform, thereby facilitating X-ray source positioning around more than a 360 ° range of positions, with the patient's head positioned toward either the right end or the left end of the platform, a fixed compression plate independent of said C-arm, positioned under said platform near said vertical pivot axis for gentle abutting contact with the patient's presented breast, a movable compression paddle independent of said C-arm, positioned under said platform near said first compression plate for gentle clamping of said presented breast between said compression plate and said paddle independent of said pivotally mounted C-arm, and X-ray responsive image-forming means mounted on said image receptor, whereby free access is provided for attending personnel to the upper, the lateral and the lower surfaces of the patient's pendulant breast over a range of more than 180°, unimpeded by the rear supporting pedestal.
3. The X-ray table assembly defined in Claim 2, wherein said elongated platform is provided with two extensible and retractable footrests, each movablypositioned respectively at one lateral end of said platform, the elongated platform being dimensioned to support an adult prone female patient with her legs supported by one said footrest, and alternatively to support the patient lying in the opposite direction with her legs supported by the other said footrest.
4. The X-ray table assembly defined in Claim 2 wherein the rear pedestal is vertically extensible and retractable, providing vertically adjustable level positioning for the platform.
5. The X-ray table assembly defined in Claim 1, wherein the pivotal mounting of the C-arm on the rear pedestal incorporates vertical adjustment means for raising and lowering the C-arm in the direction of said vertical pivot axis between lower positions, and an uppermost position in which the tubehead's upper end extends into either of said shallow underside recesses above the level of said breast-receiving aperture.
6. The X-ray table assembly defined in Claim 2, wherein the pivotal mounting of the C-arm on the rear pedestal provides angular pivoting movement of the C-arm about the vertical pivot axis through an arc of approximately 210 degrees from a first position on the rear pedestal side of the longitudinal centerline of the platform adjacent a first lateral end of the platform, forwardly beneath the front edge of the platform through a second front position remote from the pedestal to a third position on the rear pedestal side of the longitudinal centerline of the platform adjacent the second lateral end of the platform opposite to said first end, and wherein said elongated platform accommodates a patient lying prone thereon with her feet at either end, whereby X-ray examination from any X-ray tubehead source position within said approximately 210 degrees arc can be conducted from either side of the patient as required.
7. The X-ray table assembly defined in Claim 2, wherein the pivotal mounting of the C-arm on the pedestal provides angular pivoting movement of the C-arm about the vertical pivot axis between a pair of source positions angularly offset from a central stereo axis by equal acute angles, providing X-ray images of the patient's target breast tissue, held stationary between the clamping compression plate and paddle, produced by X-rays from each of the pair of source positions, with the X-ray beam from each source position being perpendicular to the image forming means mounted in said image receptor on said C-arm by reason of the anchored support of said image receptor opposite said X-ray tubehead on the same supporting C-arm.
8. The X-ray table assembly defined in Claim 7, wherein the clamping compression plate and paddle remain fixed while the X-ray tubehead and the imagereceptor both permanently supported on the C-arm, move angularly together in the same angular direction about the vertical pivot axis as the tubehead moves on the C-arm between the two source positions.
9. The X-ray table assembly defined in Claim 8, wherein the clamping compression plate and paddle are mounted on a compression arm mounted on the rear pedestal for pivotal movement about the same pivot axis independent of the C-arm, and wherein a needle guide is also mounted on the same compression arm, positioned for performing needle biopsies on breast tissue clamped between plate and paddle.
10. The X-ray table assembly defined in Claim 2, further including X-ray responsive image-forming means mounted on said image receptor, including acharge coupled device (CCD) camera for converting visible light into an electronic signal, a phosphor plate producing a visible light image on its proximal surface in response to arriving X-radiation impinging thereon, light-directing means positioned to direct said phosphor plate's visible light image on said proximal surface toward the CCD camera, computing means connected to the CCD camera for receipt of its electronic signal and for producing an imaging signal representative of at least a portion of the received CCD
camera electronic signal, and means connected to the computer imaging signal, for displaying the imaging signal.
11. The X-ray table assembly defined in Claim 10, wherein the light-directing means is a diagonally positioned pellicle mirror substantially transparent to X-rays interposed in the path of said arriving X-radiation, with its undersurface coated with a visible light-reflecting film and positioned to reflect said phosphor plate's proximal surface visible light image toward the CCD camera, and wherein the phosphor plate, the pellicle mirror and the CCD camera are all enclosed in a compact light-tight optical system housing positioned closely adjacent to said clamping plates, whereby passage of the visible light, produced on the proximal surface of the phosphor plate, through the thickness of the phosphor plate and consequent diffusion or blurring of the visible light image are avoided.
12. The X-ray table assembly defined in Claim 11 wherein said light-tight housing is provided with an X-ray transparent portion interposed in the path of said arriving X-radiation, thus allowing it to pass through said pellicle mirror toward said X-ray transparent phosphor plate.
13. The X-ray table assembly defined in Claim 11, further including a second mirror positioned to reflect the visible light on the proximal surface of said phosphor plate from said pellicle mirror toward said CCD camera, whereby the optical system is folded along a bent optic axis for enhanced compactness.
14. An X-ray table assembly as defined in Claim 11, wherein the computing means for producing an imaging signal representative of at least a portion of the received CCD camera electronic image includes means for generating a proportional remapping of at least a portion of the CCD camera electronic signal, and further includes means for modifying at least a portion of the imaging signal.
15. An X-ray table as defined in Claim 14, wherein the modifying means includes means for varying the contrast associated with the imaging signal.
16. An X-ray table as defined in Claim 15, wherein the means for varying the contrast includes means for selecting a range of luminance values of the electronic signal for which the modifying means generates a proportional remapping of at least a portion of the CCD camera electronic signal.
17. An X-ray table as defined in Claim 16, wherein the modifying means includes means for sliding the range of luminance values with respect to all possible values of the CCD camera electronic signal.
18. An X-ray table as defined in Claim 17, wherein the modifying means further includes means for automatically determining the range of luminance values from the CCD electronic signal for which the imaging signal proportionately remaps the CCD
electronic signal.
19. An X-ray table as defined in Claim 14, wherein the modifying means include means for modifying the imaging signal formed upon a neighborhood of CCDcamera electronic signal values corresponding to the imaging signal.
20. An X-ray table assembly for supporting a female patient in a prone position for mammography procedures, comprising:
a base, a pedestal upstanding from said base, a substantially flat and horizontal patient-supporting platform which is supported cantilever-fashion from a rear longitudinal edge by said pedestal and having a free unsupported front edge, means centrally positioned in said platform forming an open breast-receiving aperture for pendulant presentation of the patient's breast therethrough below the level of the platform, a C-arm pivotally mounted on the pedestal beneath the platform for angular movement about a vertical pivot axis aligned with said aperture and having a remote end supporting an X-ray tubehead forming an X-ray source, and a near end supporting an image receptor, a fixed compression plate positioned under said platform near said vertical pivot axis for gentle abutting contact with the patient's presented breast, a movable compression paddle positioned under said platform near said first compression plate for gentle clamping of said presented breast between said compression plates independent of said pivotally mounted C-arm, and X-ray responsive image-forming means mounted on said image receptor, including a charge coupled device (CCD) camera for converting visible light into an electronic signal, a phosphor plate producing on its proximal surface a visible light image in response to arriving X-radiation impinging thereon, light-directing means positioned to direct said phosphor plate's proximal surface visible light image toward the CCD camera, computing means connected to the CCD camera for receipt of its electronic signal and for producing an imaging signal representative of at least a portion of the received CCD
camera electronic signal, and means connected to the computer imaging signal, for displaying the imaging signal, wherein the light-directing means is a diagonally positioned X-ray transparent pellicle mirror interposed in the path of said arriving X-radiation, with its undersurface positioned to reflect said phosphor plate's image toward the CCD camera, and wherein the phosphor plate, the pellicle mirror and the CCD camera are all enclosed in a compact light-tight optical system housing positioned closely adjacent to said clamping plates.
21. The X-ray table assembly defined in Claim 20, wherein the light-directing means is a diagonally positioned pellicle mirror interposed in the path of said arriving X-radiation, with its undersurface positioned to reflect said phosphor plate's image toward the CCD camera, and wherein the phosphor plate, the pellicle mirror and the CCD
camera are all enclosed in a compact light-tight optical system housing positioned closely adjacent to said clamping plates.
22. The X-ray table assembly defined in Claim 21 wherein said light-tight housing is provided with an X-ray transparent portion interposed in the path of said arriving X-radiation, thus allowing it to pass through said pellicle mirror toward said phosphor plate.
23. The X-ray table assembly defined in Claim 21, further including a second mirror positioned to reflect the image of said phosphor plate from said pellicle mirror toward said CCD camera, whereby the optical system is folded along a bent optic axis for enhanced compactness.
24. An X-ray table assembly as defined in Claim 21, wherein the computing means for producing an imaging signal representative of at least a portion of the received CCD camera electronic image includes means for generating a proportional remapping of at least a portion of the CCD camera electronic signal, and further includes means for modifying at least a portion of the imaging signal.
25. An X-ray table as defined in Claim 24, wherein the modifying means includes means for varying the contrast associated with the imaging signal.
26. An X-ray table as defined in Claim 25, wherein the means for varying the contrast includes means for selecting a range of luminance values of the electronic signal for which the modifying means generates a proportional remapping of at least a portion of the CCD camera electronic signal.
27. An X-ray table as defined in Claim 26, wherein the modifying means includes means for sliding the range of luminance values with respect to all possible values of the CCD camera electronic signal.
28. An X-ray table as defined in Claim 27, wherein the modifying means further includes means for automatically determining the range of luminance values from the CCD electronic signal for which the imaging signal proportionately remaps the CCD
electronic signal.
29. An X-ray table as defined in Claim 24, wherein the modifying means include means for modifying the imaging signal formed upon a neighborhood of CCDcamera electronic signal values corresponding to the imaging signal.
30. A compact CCD imaging assembly for converting arriving X-radiation to a digital image signal output, comprising:
a hollow camera housing positioned in the path of the arriving X-radiation and having an X-ray transparent wall member presented to receive and transmit the arriving X-radiation to the interior of the housing, a phosphor plate positioned inside the housing in the path of the arriving X-radiation, producing on its proximal surface a visible light image corresponding to the intensity variations exhibited by the arriving X-radiation, a light pellicle film diagonally positioned between the transparent wall member and the phosphor plate, substantially transparent to X-radiation and having its underside bearing a thin reflective coating, and a CCD camera aligned to receive visible light produced by said phosphor plate and reflected by said reflective coating.
31. The CCD imaging assembly defined in Claim 30, further including a second reflective mirror interposed between said diagonal pellicle film and said CCD
camera, whereby the optic axis extending from said phosphor plate via said pellicle film to said CCD camera can be folded for compact positioning inside said housing.
32. An X-ray table assembly for supporting a female patient in a prone position for mammography procedures, comprising:
A base having a front portion and rear portion, a rear pedestal upstanding from said rear portion of the base, a substantially flat, horizontal, elongated patient-supporting platform which is centrally supported cantilever-fashion from a rear longitudinal edge by said rear pedestal and having a free unsupported front edge, and unsupported right and left lateral ends, means centrally positioned in said platform between said ends, forming an open breast-receiving aperture for pendulant presentation of the patient's breast therethrough below the level of the platform, a C-arm having a remote and supporting an X-ray tubehead forming an X-ray source, and a near end supporting an image receptor, pivotally mounted on the rear pedestal beneath the platform for angular movement through an angular range of more than 180° about a vertical pivot axis aligned with said aperture, positioning the X-ray source in any of an infinite number of source positions ranging from the direction of one end of said platform through a lateral position remote from said rear pedestal to the direction of the other end of said platform, thereby facilitating X-ray source positioning around more than a 360° range of positions, with the patient's head positioned toward either the right end or the left end of the platform, a fixed compression plate independent of said C-arm, positioned under said platform near said vertical pivot axis for gentle abutting contact with the patient's presented breast, a movable compression paddle independent of said C-arm, positioned under said platform near said first compression plate for gentle clamping of said presented breast between said compression plate and said paddle independent of said pivotally mounted C-arm, and X-ray responsive image-forming means mounted on said image receptor, with the central part of the free unsupported front edge of the patient-supporting platform being formed as a detachable segment, removable from the platform to provide a cutaway bight near said aperture accommodating the patient's arm in a comfortable relaxed position, whereby the patient's presented breast is freely pendulant in an undistorted position beneath the platform, whereby free access is provided for attending personnel to the upper, the lateral and the lower surfaces of the patient's pendulant breast over a range of more than 180°, unimpeded by the rear supporting pedestal.
33. A stereotactic mammographic biopsy apparatus for performing stereotactically guided biopsy localization comprising:
a base;
a pedestal extending upwardly from the base;
an imaging arm pivotally mounted to the pedestal, the imaging arm having a near end supporting an image receptor responsive to X-ray exposure and a remote end supporting an X-ray source having an X-ray focal point, wherein the imaging arm is pivotally mounted to the pedestal at a point between the near end and the remote end;
a compression arm pivotally mounted to the pedestal, the compression arm having a near end and a remote end, wherein the compression arm is pivotally mounted to the pedestal at a point between its near end and its remote end and wherein the pivot point of the compression arm is axially aligned with the pivot point of the imaging arm;
a first compression plate slidably attached to the compression arm at its near end, wherein the first compression plate is slidable along the compression arm from the near end of the compression arm to the remote end of the compression arm;
a carriage slidably attached to the compression arm, wherein the carriage is slidably along the compression arm from the near end of the compression arm to the remote end of the compression arm and wherein the carriage is positioned between the remote end and the first compression plate;
a second compression plate supported by the carriage; and a multi-dimensionally positionable biopsy needle guide supported by the carriage.
34. The stereotactic mammographic biopsy apparatus of claim 33, wherein the image receptor includes a substantially planar image receiving surface and wherein the image receptor is supported on the imaging arm such that the image receiving surface is substantially normal to a central ray extending from the focal point of the X-ray source to the image receiving surface.
35. The stereotactic mammographic biopsy apparatus of claim 34, further comprising a moving Bucky grid having divergently slanted vanes, wherein the moving Bucky grid is attached to the imaging arm between the image receptor and the X-ray source such that divergently slanted vanes are substantially aligned with the focal point of the X-ray source and wherein X-rays from the X-ray source pass through the moving Bucky grid prior to impingement on the image receiving surface of the image receptor.
36. The stereotactic mammographic biopsy apparatus of claim 34, wherein the moving Bucky grid is oriented such that the divergently slanted vanes are substantially parallel to the common axis of the imaging arm and compression arm pivot points.
37. The stereotactic mammographic biopsy apparatus of claim 33, wherein the image receptor comprises:

a phosphor plate responsive to X-ray exposure, wherein the phosphor plate produces visible light proportional to the intensity of X-radiation impinging thereon;
a charge coupled device (CCD) camera; and a visible light collecting means positioned adjacent to the phosphor plate, whereby the visible light from the phosphor plate is directed to the CCD camera by the visible light collecting means.
38. A stereotactic mammographic biopsy apparatus for performing stereotactically guided biopsy localization comprising:
a base;
a pedestal extending upwardly from the base;
an imaging arm pivotally mounted to the pedestal, the imaging arm having a near end and a remote end, wherein the imaging arm is pivotally mounted to the pedestal at a point between the near end and the remote end;
an image forming means including a charge coupled device (CCD) array for converting X-rays impinging on the image forming means into an array of electronic signals representative of the intensity and location of the impinging X-rays, wherein the image forming means is supported by the imaging arm at its near end;
an X-ray source having a focal point, wherein the X-ray source is supported by the imaging arm at its remote end and wherein the focal point of the X-ray source is directed at the image forming means;
a compression arm pivotally mounted to the pedestal, the compression arm having a near end and a remote end, wherein the compression arm is pivotally mounted to the pedestal at a point between its near end and its remote end and wherein the pivot point of the compression arm is axially aligned with the pivot point of the imaging arm;
a first compression plate slidably attached to the compression arm, wherein the first compression plate is slidable along the compression arm from the near end of the compression arm to the remote end of the compression arm;
a carriage slidably attached to the compression arm, wherein the carriage is slidable along the compression arm from the near end of the compression arm to the remote end of the compression arm and wherein the carriage is positioned between the remote end and the first compression plate;
a second compression plate supported by the carriage;
a display means for receiving the array of electrical signals from the CCD and for displaying at least a portion of the array of electrical signals; and a multi-dimensionally positionable biopsy needle guide supported by the carriage.
39. A patient-supporting table for a prone stereotactic X-ray guided mammographic biopsy apparatus, the table comprising:
a platform further including a breast-receiving aperture permitting pendulant presentation of a patient's breast therethrough, wherein the breast-receiving aperture is positioned on the platform so as to divide the platform into a first supporting portion and a second supporting portion, whereby the first supporting portion of the platform enables the patient's breast to be pendulantly presented in a first orientation with respect to a stereotactic imaging means, compression means and biopsy needle guiding means of the apparatus when the patient is positioned and supported on the first supporting portion of the platform, and whereby the second supporting portion of the platform enables the patient's breast to be pendulantly presented in a second orientation with respect to the stereotactic imaging means, compression means and biopsy needle guiding means of the apparatus when the patient is positioned and supported on the second supporting portion of the platform.
40. The patient-supporting table of claim 39, further comprising a concave torso depression surrounding the aperture in the platform.
41. The patient-supporting table of claim 39, wherein the first supporting portion of the patient-supporting platform is provided with an extensible and retractable footrest, and the second supporting portion of the patient-supporting platform is provided with an extensible and retractable footrest.
42, A prone stereotactic mammographic biopsy apparatus for performing stereotactic X-ray guided breast biopsies comprising:
a base;
a pedestal extending upwardly from the base;
a patient-supporting platform supported by the pedestal, the patient supporting platform further including a breast-receiving aperture permitting pendulant presentation of a patient's breast therethrough, wherein the breast-receiving aperture is positioned on the patient-supporting platform so as to divide the patient-supporting platform into a first supporting portion and a second supporting portion;
a positionable ledge extending outwardly from the pedestal below the patient-supporting platform;
means for obtaining stereotactic X-ray images of the patient's breast pendulantly presented through the breast-receiving aperture in the patient-supporting platform, the means being supported by the positionable ledge;
means for compressing the pendulantly presented breast, the means being supported by the positionable ledge; and means for guiding a biopsy needle into the pendulantly presented and compressed breast, the means being supported by the positionable ledge;
whereby the patient's breast may be pendulantly presented through the aperture in a first orientation with respect to the means for obtaining stereotactic X-ray images, means for compressing the breast and means for guiding a biopsy needle by positioning and supporting the patient on the first supporting portion, and whereby the patient's breast may be pendulantly presented through the aperture in a second orientation with respect to the means for obtaining stereotactic X-ray images, means for compressing the breast and means for guiding a biopsy needle by positioning and supporting the patient of the second supporting portion.
43. The apparatus of claim 42, further comprising a concave torso depression surrounding the aperture in the platform.
44 The apparatus of claim 42, wherein the first supporting portion of the patient-supporting platform is provided with an extensible and retractable footrest, and the second supporting portion of the patient-supporting platform is provided with an extensible and retractable footrest.
45. The apparatus of claim 42, wherein the pedestal includes means for adjusting the height of the patient supporting platform relative to the base.
46. A method for using a patient-supporting table for a prone stereotactic X-ray mammographic guided biopsy apparatus comprising a platform further including a breast-receiving aperture permitting pendulant presentation of a patient's breast therethrough, wherein the breast-receiving aperture is positioned on the platform so as to divide the platform into a first supporting portion and a second supporting portion, whereby the first supporting portion of the platform enables the patient's breast to be pendulantly presented in a first orientation with respect to a stereotactic imaging means, compression means and biopsy needle guiding means of the apparatus when the patient is positioned and supported on the first supporting portion of the platform, and whereby the second supporting portion of the platform enables the patient's breast to be pendulantly presented in a second orientation with respect to the stereotactic imaging means, compression means and biopsy needle guiding means of the apparatus when the patient is positioned and supported on the second supporting portion of the platform;
the method comprising the steps of:
(a) determining the approximate location of a suspicious lesion in a patient's breast;
(b) determining whether the first orientation or the second orientation of the pendulantly presented breast provides the minimum path length for a biopsy needle, guided by the biopsy needle guiding means, to access the approximate location of the suspicious lesion as determined in step (a); and (c) positioning the patient:

(1) so as to be supported by the first supporting portion of the patient-supporting table to present the breast in the first orientation if the first orientation of the pendulantly presented breast is determined, in step (b), to provide the minimum path length for the biopsy needle, or (2) so as to be supported by the second supporting portion of the patient-supporting table to present the breast in the second orientation if the second orientation of the pendulantly presented breast is determined, in step (b), to provide the minimum path length for the biopsy needle.
47. A method for using a prone stereotactic mammographic biopsy apparatus for performing stereotactic X-ray guided breast biopsies comprising:
a base;
a pedestal extending upwardly from the base;
a patient-supporting platform supported by the pedestal, the patient supporting platform further including a breast-receiving aperture permitting pendulant presentation of a patient's breast therethrough, wherein the breast-receiving aperture is positioned on the patient-supporting platform so as to divide the patient-supporting platform into a first supporting portion and a second supporting portion;
a positionable ledge extending outwardly from the pedestal below the patient-supporting base;
means for obtaining stereotactic X-ray images of the patient's breast pendulantly presented through the breast-receiving aperture in the patient-supporting platform, the means being supported by the positionable ledge;
means for compressing the pendulantly presented breast, the means being supported by the positionable ledge; and means for guiding a biopsy needle into the pendulantly presented and compressed breast, the means being supported by the positionable ledge;
whereby the patient's breast may be pendulantly presented through the aperture in a first orientation with respect to the means for obtaining stereotactic X-ray images, means for compressing the breast and means for guiding a biopsy needle by positioning and supporting the patient on the first supporting portion, and whereby the patient's breast may be pendulantly presented through the aperture in a second orientation with respect to the means for obtaining stereotactic X-ray images, means for compressing the breast and means for guiding a biopsy needle by positioning and supporting the patient on the second supporting portion;
the method comprising the steps of:
(a) determining the approximate location of a suspicious lesion in a patient's breast;
(b) determining whether the first orientation or the second orientation of the pendulantly presented breast provides the minimum path length for a biopsy needle, guided by the biopsy needle guiding means, to access the approximate location of the suspicious lesion as determined in step (a); and (c) positioning the patient:
(1) so as to be supported by the first supporting portion of the patient-supporting table to present the breast in the first orientation if the first orientation of the pendulantly presented breast is determined, in step (b), to provide the minimum path length for the biopsy needle, or (2) so as to be supported by the second supporting portion of the patient-supporting table to present the breast in the second orientation if the second orientation of the pendulantly presented breast is determined, in step (b), to provide the minimum path length for the biopsy needle;
(d) compressing the pendulantly presented breast so as to obtain a compressed pendulantly presented breast;
(e) imaging the compressed pendulantly presented breast so as to obtain stereotactic images of the suspicious lesion therein;
(f) determining the three dimensional location of the suspicious lesion from the stereotactic images thereof obtained in step (e); and (g) inserting a biopsy needle into the compressed pendulantly presented breast at the three dimensional location determined in step (f) so as to obtain a sample of breast tissue.
CA002122255A 1991-11-27 1992-11-25 Stereotactic mammography imaging system with prone position examination table and ccd imaging system Expired - Fee Related CA2122255C (en)

Applications Claiming Priority (4)

Application Number Priority Date Filing Date Title
US79941291A 1991-11-27 1991-11-27
US07/799,412 1991-11-27
US07/957,275 US5289520A (en) 1991-11-27 1992-10-06 Stereotactic mammography imaging system with prone position examination table and CCD camera
US07/957,275 1992-10-06

Publications (2)

Publication Number Publication Date
CA2122255A1 CA2122255A1 (en) 1993-06-24
CA2122255C true CA2122255C (en) 1999-03-23

Family

ID=27122112

Family Applications (1)

Application Number Title Priority Date Filing Date
CA002122255A Expired - Fee Related CA2122255C (en) 1991-11-27 1992-11-25 Stereotactic mammography imaging system with prone position examination table and ccd imaging system

Country Status (9)

Country Link
US (3) US5289520A (en)
EP (2) EP0644740B1 (en)
JP (1) JP2691073B2 (en)
KR (3) KR0138803B1 (en)
CA (1) CA2122255C (en)
DE (1) DE4294430T1 (en)
GB (4) GB2297231B (en)
SE (1) SE511432C2 (en)
WO (1) WO1993011706A1 (en)

Families Citing this family (203)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5415169A (en) * 1989-11-21 1995-05-16 Fischer Imaging Corporation Motorized mammographic biopsy apparatus
US6031892A (en) 1989-12-05 2000-02-29 University Of Massachusetts Medical Center System for quantitative radiographic imaging
US5150394A (en) * 1989-12-05 1992-09-22 University Of Massachusetts Medical School Dual-energy system for quantitative radiographic imaging
US5289520A (en) * 1991-11-27 1994-02-22 Lorad Corporation Stereotactic mammography imaging system with prone position examination table and CCD camera
FR2703237B1 (en) * 1993-03-29 1995-05-19 Ge Medical Syst Sa Mammograph equipped with a stereotaxic camera with digital detector and method of using such a mammograph.
IL106691A (en) * 1993-08-13 1998-02-08 Sophis View Tech Ltd System and method for diagnosis of living tissue diseases
DE4330787A1 (en) * 1993-09-10 1995-03-23 Siemens Ag Method for operating an automatic X-ray exposure device
US5983123A (en) 1993-10-29 1999-11-09 United States Surgical Corporation Methods and apparatus for performing ultrasound and enhanced X-ray imaging
CA2173154C (en) 1993-10-29 2010-03-23 Ascher Shmulewitz Methods and apparatus for performing sonomammography and enhanced x-ray imaging
FR2712415B1 (en) * 1993-11-09 1995-12-22 Ge Medical Syst Sa Method for automatically locating points of interest during a stereotaxic examination in mammography.
US5526394A (en) * 1993-11-26 1996-06-11 Fischer Imaging Corporation Digital scan mammography apparatus
WO1995018561A2 (en) * 1993-12-30 1995-07-13 Philips Electronics Nv Automatic segmentation and skinline detection in digital mammograms
JPH07303633A (en) 1994-05-11 1995-11-21 Mitsubishi Electric Corp X-ray breasts imaging device
US5595177A (en) * 1994-06-03 1997-01-21 Harbor-Ucla Research And Education Institute, Inc. Scintigraphy guided stereotaxic localizations apparatus for breast carcinomas
US5803913A (en) * 1994-06-03 1998-09-08 Khalkhali; Iraj Nuclear medicine stereotaxic localization apparatus for breast carcinomas and method
US5895640A (en) * 1994-06-03 1999-04-20 Harbor-Ucla Research And Education Institute Nuclear medicine techniques for detecting carcinoma in the dense breast
US5485005A (en) * 1994-06-15 1996-01-16 Xicon, Inc. Cooled x-ray sensitive photoconductor
US5584292A (en) * 1994-10-31 1996-12-17 Grumman Aerospace Corporation Digital X-ray camera for precision mammographic needle biopsy system
AU4287996A (en) * 1994-11-23 1996-06-17 Thermotrex Corporation X-ray imaging device
DE69531743D1 (en) * 1994-11-25 2003-10-16 Sophisview Technologies Ltd SYSTEM AND METHOD FOR DIAGNOSIS OF DISEASES IN LIVING TISSUE
US5579360A (en) * 1994-12-30 1996-11-26 Philips Electronics North America Corporation Mass detection by computer using digital mammograms of the same breast taken from different viewing directions
US5833627A (en) 1995-04-13 1998-11-10 United States Surgical Corporation Image-guided biopsy apparatus and methods of use
US5692511A (en) * 1995-06-07 1997-12-02 Grable; Richard J. Diagnostic tomographic laser imaging apparatus
US6195580B1 (en) 1995-07-10 2001-02-27 Richard J. Grable Diagnostic tomographic laser imaging apparatus
US5857982A (en) * 1995-09-08 1999-01-12 United States Surgical Corporation Apparatus and method for removing tissue
US5817034A (en) 1995-09-08 1998-10-06 United States Surgical Corporation Apparatus and method for removing tissue
US5782775A (en) * 1995-10-20 1998-07-21 United States Surgical Corporation Apparatus and method for localizing and removing tissue
FI97665C (en) * 1995-11-21 1997-01-27 Planmed Oy Procedures and apparatus for photographing an object
US5709697A (en) * 1995-11-22 1998-01-20 United States Surgical Corporation Apparatus and method for removing tissue
US5617465A (en) * 1995-12-08 1997-04-01 Xedar Corporation Scan-type X-ray imaging with fixed converter
AU1331497A (en) 1995-12-18 1997-07-14 Kerisma Medical Products, L.L.C. Fiberoptic-guided interstitial seed manual applicator and seed cartridge
US5706327A (en) * 1996-02-09 1998-01-06 Trex Medical Corporation Method and apparatus for mammographic compression
US5851180A (en) * 1996-07-12 1998-12-22 United States Surgical Corporation Traction-inducing compression assembly for enhanced tissue imaging
US5820552A (en) * 1996-07-12 1998-10-13 United States Surgical Corporation Sonography and biopsy apparatus
IL119283A0 (en) * 1996-09-19 1996-12-05 Elscint Ltd Adaptive filtering
US6097994A (en) * 1996-09-30 2000-08-01 Siemens Corporate Research, Inc. Apparatus and method for determining the correct insertion depth for a biopsy needle
US7245958B1 (en) 1996-09-30 2007-07-17 Siemens Corporate Research, Inc. Trigonometric depth gauge for biopsy needle
US6249713B1 (en) * 1996-09-30 2001-06-19 Siemens Corporate Research, Inc. Apparatus and method for automatically positioning a biopsy needle
US5776062A (en) * 1996-10-15 1998-07-07 Fischer Imaging Corporation Enhanced breast imaging/biopsy system employing targeted ultrasound
US5894844A (en) * 1996-11-07 1999-04-20 Rohrberg; Roderick G. Three-dimensional floatation-enhanced body examination system
US6029077A (en) * 1996-11-08 2000-02-22 Imaging Diagnostic Systems, Inc. Device for determining the perimeter of the surface of an object being scanned and for limiting reflection from the object surface
US6044288A (en) * 1996-11-08 2000-03-28 Imaging Diagnostics Systems, Inc. Apparatus and method for determining the perimeter of the surface of an object being scanned
US5855554A (en) * 1997-03-17 1999-01-05 General Electric Company Image guided breast lesion localization device
AU6866698A (en) * 1997-03-21 1998-10-20 Dynamics Imaging, Inc. Dynamic-functional imaging of biological objects using a non-rigid object holder
US6587578B2 (en) 1997-03-21 2003-07-01 Dobi Medical Systems, Inc. Dynamic-functional imaging of biological objects using a non-rigid object holder
US5749337A (en) * 1997-03-31 1998-05-12 Palatov; Dennis Barrel type internal combustion engine
US5917881A (en) * 1997-05-20 1999-06-29 Fischer Imaging Corporation Digital scan mammography apparatus utilizing velocity adaptive feedback and method
NL1006420C2 (en) * 1997-06-27 1998-12-29 Optische Ind Oede Oude Delftoe Method and device for displaying images.
US6055449A (en) * 1997-09-22 2000-04-25 Siemens Corporate Research, Inc. Method for localization of a biopsy needle or similar surgical tool in a radiographic image
US6028912A (en) * 1997-09-30 2000-02-22 Siemens Corporate Research, Inc. Apparatus and method for point reconstruction and metric measurement on radiographic images
US6157373A (en) * 1997-11-14 2000-12-05 Trex Medical Corporation Method and apparatus for displaying images
US6027457A (en) 1998-06-18 2000-02-22 United States Surgical Corporation Apparatus and method for securing tissue during ultrasound examination and biopsy
US6734904B1 (en) 1998-07-23 2004-05-11 Iteris, Inc. Imaging system and method with dynamic brightness control
US6662042B1 (en) 2000-08-22 2003-12-09 Richard J. Grable Diagnostic tomographic laser imaging apparatus
US6050954A (en) * 1998-08-21 2000-04-18 Manan Medical Products, Inc. Biopsy needle orientation fixture
AU5888499A (en) * 1998-09-17 2000-04-03 Quanta Vision, Inc. Reduced-angle mammography device and variants
US6214018B1 (en) 1998-11-04 2001-04-10 Trex Medical Corporation Method and apparatus for removing tissue from a region of interest using stereotactic radiographic guidance
WO2000051484A2 (en) 1998-11-25 2000-09-08 Fischer Imaging Corporation User interface system for mammographic imager
CA2701455C (en) 1998-11-25 2011-08-23 United States Surgical Corporation Biopsy system
US6406482B1 (en) * 1999-09-13 2002-06-18 The Ohio State University Stereotactic apparatus and methods
US6987831B2 (en) * 1999-11-18 2006-01-17 University Of Rochester Apparatus and method for cone beam volume computed tomography breast imaging
US6261299B1 (en) * 1999-11-26 2001-07-17 The Ohio State University Stereotactic apparatus and methods
AU2001264633A1 (en) 2000-05-18 2001-11-26 Intergrated Implant Systems, L.L.C. Needle hub for medical instrument
US6575890B2 (en) * 2000-05-18 2003-06-10 Integrated Implant Systems, L.L.C. Medical instrument
AU2001264632A1 (en) 2000-05-18 2001-11-26 Integrated Implant Systems, L.L.C. Needle spin for medical instrument
US6616594B2 (en) 2000-05-18 2003-09-09 Integrated Implant Systems, L.L.C. Cartridge-moveable shield
US6540656B2 (en) 2000-05-18 2003-04-01 Integrated Implant Systems Llc Targeting fixture for a grid template
WO2001087414A2 (en) 2000-05-18 2001-11-22 Intergrated Implant Systems, L.L.C. Guide sheath for a medical instrument
AU2001245159A1 (en) * 2000-07-07 2002-01-21 Medical Positioning, Inc. Patient support apparatus and method for performing decubitus breast biopsy
US6463122B1 (en) * 2000-08-21 2002-10-08 Bio-Imaging Resource, Inc. Mammography of computer tomography for imaging and therapy
US6832399B2 (en) * 2000-11-14 2004-12-21 Michael G. Falbo, Sr. Breast biopsy bed
CA2326026A1 (en) * 2000-11-16 2002-05-16 Is2 Research Inc. Scintillation camera for scintimamography
AU2002226951A1 (en) * 2000-11-17 2002-05-27 Oregon Health And Science University Stereotactic wands, endoscopes, and methods using such wands and endoscopes
FI116860B (en) * 2000-12-15 2006-03-15 Instrumentarium Corp Process and arrangement for processing a digital image matrix
US6419390B1 (en) * 2001-03-26 2002-07-16 Marianette Landis-Lowell Folding mammography table and method of use
EP1424939A4 (en) * 2001-03-30 2005-05-18 Univ Duke Application specific emission and transmission tomography
US6921406B1 (en) 2001-04-19 2005-07-26 The Ohio State University Stereotactic apparatus and methods
US6533794B2 (en) 2001-04-19 2003-03-18 The Ohio State University Simplified stereotactic apparatus and methods
US6804384B2 (en) 2001-06-12 2004-10-12 Mclean Hospital Corporation Color magnetic resonance imaging
US6716167B1 (en) * 2001-09-25 2004-04-06 Siemens Medical Soluions Usa, Inc. Medical diagnostic ultrasound imaging system with a patient support surface
US7171256B1 (en) 2001-11-21 2007-01-30 Aurora Imaging Technology, Inc. Breast magnetic resonace imaging system with curved breast paddles
US7715895B1 (en) 2001-11-21 2010-05-11 Aurora Imaging Technology, Inc. Separate local RF transmit and receive coils for breast MRI system
AU2003229046A1 (en) * 2002-05-13 2003-11-11 The Ohio State University Research Foundation Instrument-holding projection imaging vector guide and method of use
AU2003261073A1 (en) * 2002-05-16 2003-12-02 Barbara Ann Karmanos Cancer Institute Combined diagnostic and therapeutic ultrasound system
US7065393B2 (en) * 2002-07-11 2006-06-20 Cedara Software Corp. Apparatus, system and method of calibrating medical imaging systems
WO2004006755A2 (en) * 2002-07-16 2004-01-22 Alfred E. Mann Institute For Biomedical Engineering At The University Of Southern California Support bra for ultrasonic breast scanner
AU2003270386A1 (en) * 2002-09-06 2004-03-29 Rytec Corporation Signal intensity range transformation apparatus and method
US6922859B2 (en) 2002-11-29 2005-08-02 Art Advanced Research Technologies Inc. Table for positioning a patient for a medical procedure on a breast
US6883194B2 (en) * 2002-11-08 2005-04-26 Art Advanced Research And Technology Inc. Method and apparatus for positioning a patient on a table for a medical procedure on a breast
US6886198B2 (en) 2002-12-12 2005-05-03 Art Advanced Research Technologies Inc. Method and apparatus for positioning the arm of a patient while on a table for a medical procedure on a breast
US7809422B2 (en) * 2002-11-08 2010-10-05 Art Advanced Research Technologies Inc. Method and apparatus for optical imaging
US8565372B2 (en) 2003-11-26 2013-10-22 Hologic, Inc System and method for low dose tomosynthesis
US7616801B2 (en) 2002-11-27 2009-11-10 Hologic, Inc. Image handling and display in x-ray mammography and tomosynthesis
US7577282B2 (en) 2002-11-27 2009-08-18 Hologic, Inc. Image handling and display in X-ray mammography and tomosynthesis
US7123684B2 (en) * 2002-11-27 2006-10-17 Hologic, Inc. Full field mammography with tissue exposure control, tomosynthesis, and dynamic field of view processing
US10638994B2 (en) 2002-11-27 2020-05-05 Hologic, Inc. X-ray mammography with tomosynthesis
US8571289B2 (en) 2002-11-27 2013-10-29 Hologic, Inc. System and method for generating a 2D image from a tomosynthesis data set
US20040216234A1 (en) * 2003-04-29 2004-11-04 Wake Robert H. Ergonometric tabletop for a laser imaging apparatus
US20080077005A1 (en) * 2004-08-12 2008-03-27 Piron Cameron A System and Method for Multimodality Breast Imaging
US7970452B2 (en) * 2003-09-30 2011-06-28 Hologic, Inc. Open architecture imaging apparatus and coil system for magnetic resonance imaging
US7908690B2 (en) * 2003-09-30 2011-03-22 Sentinelle Medical, Inc. Supine patient support for medical imaging
US7379769B2 (en) 2003-09-30 2008-05-27 Sunnybrook Health Sciences Center Hybrid imaging method to monitor medical device delivery and patient support for use in the method
US20060009693A1 (en) * 2004-04-08 2006-01-12 Techniscan, Inc. Apparatus for imaging and treating a breast
ES2253997B1 (en) * 2004-07-29 2007-07-16 Udiat Centre Diagnostic, S.A. DIGITAL SYSTEM TO PERFORM STEREOTAXIC BIOPSY.
CA2586147A1 (en) * 2004-11-02 2006-05-26 Metrohealth System Method and apparatus for determining correlation between spatial coordinates in breast
US7662082B2 (en) 2004-11-05 2010-02-16 Theragenics Corporation Expandable brachytherapy device
WO2006055830A2 (en) 2004-11-15 2006-05-26 Hologic, Inc. Matching geometry generation and display of mammograms and tomosynthesis images
EP3106094B1 (en) 2004-11-26 2021-09-08 Hologic, Inc. Integrated multi-mode mammography/tomosynthesis x-ray system
US8795195B2 (en) 2004-11-29 2014-08-05 Senorx, Inc. Graphical user interface for tissue biopsy system
US7492858B2 (en) * 2005-05-20 2009-02-17 Varian Medical Systems, Inc. System and method for imaging and treatment of tumorous tissue in breasts using computed tomography and radiotherapy
JP4598135B2 (en) * 2005-10-06 2010-12-15 富士フイルム株式会社 Breast imaging device
US7465268B2 (en) 2005-11-18 2008-12-16 Senorx, Inc. Methods for asymmetrical irradiation of a body cavity
WO2007095330A2 (en) 2006-02-15 2007-08-23 Hologic Inc Breast biopsy and needle localization using tomosynthesis systems
WO2007098284A2 (en) * 2006-02-27 2007-08-30 University Of Rochester Method and apparatus for cone beam ct dynamic imaging
US7526066B2 (en) * 2006-03-07 2009-04-28 Orbital Therapy, Llc Radiation therapy system for treating breasts and extremities
US20090080602A1 (en) * 2006-08-03 2009-03-26 Kenneth Brooks Dedicated breast radiation imaging/therapy system
US7715523B2 (en) * 2006-09-28 2010-05-11 Lafferty Peter R System and apparatus for rapid stereotactic breast biopsy analysis
US8503602B2 (en) * 2006-09-28 2013-08-06 Peter R. Lafferty System and apparatus for rapid stereotactic breast biopsy analysis
JP4857070B2 (en) 2006-10-11 2012-01-18 キヤノン株式会社 Mammography X-ray CT system
US20080221479A1 (en) * 2007-03-07 2008-09-11 Ritchie Paul G Integrated Imaging and Biopsy System with Integrated Utilities
US10201324B2 (en) 2007-05-04 2019-02-12 Delphinus Medical Technologies, Inc. Patient interface system
US8870771B2 (en) * 2007-05-04 2014-10-28 Barbara Ann Karmanos Cancer Institute Method and apparatus for categorizing breast density and assessing cancer risk utilizing acoustic parameters
WO2008143901A2 (en) * 2007-05-15 2008-11-27 Techniscan, Inc. Improved imaging system
US7529336B2 (en) 2007-05-31 2009-05-05 Test Research, Inc. System and method for laminography inspection
JP2009136523A (en) * 2007-12-07 2009-06-25 Ge Medical Systems Global Technology Co Llc Ultrasonic diagnosis apparatus, radiofrequency wave cautery treatment device, ultrasonic diagnosis and treatment system, and ultrasonic diagnosis and treatment apparatus
US20090080604A1 (en) 2007-08-23 2009-03-26 Fischer Medical Technologies, Inc. Computed tomography breast imaging and biopsy system
US8272088B2 (en) * 2007-09-06 2012-09-25 Orbital Therapy Llc Patient support system for full access prone position breast radiotherapy
US7630533B2 (en) 2007-09-20 2009-12-08 Hologic, Inc. Breast tomosynthesis with display of highlighted suspected calcifications
US7758241B2 (en) * 2007-10-28 2010-07-20 Sliski Alan P Highly shielded radiation therapy system
US8290569B2 (en) 2007-11-23 2012-10-16 Hologic, Inc. Open architecture tabletop patient support and coil system
US8023767B1 (en) 2008-03-10 2011-09-20 University Of Rochester Method and apparatus for 3D metal and high-density artifact correction for cone-beam and fan-beam CT imaging
US7792245B2 (en) * 2008-06-24 2010-09-07 Hologic, Inc. Breast tomosynthesis system with shifting face shield
US7991106B2 (en) 2008-08-29 2011-08-02 Hologic, Inc. Multi-mode tomosynthesis/mammography gain calibration and image correction using gain map information from selected projection angles
EP2168489B1 (en) * 2008-09-29 2011-06-29 MIR Medical Imaging Research Holding GmbH X-ray device for mammography in a standing postion
WO2010040120A2 (en) * 2008-10-03 2010-04-08 Caritas St. Elizabeth's Medical Center Prone surgery facial support device
US9579524B2 (en) 2009-02-11 2017-02-28 Hologic, Inc. Flexible multi-lumen brachytherapy device
US9248311B2 (en) 2009-02-11 2016-02-02 Hologic, Inc. System and method for modifying a flexibility of a brachythereapy catheter
US7894573B2 (en) * 2009-04-24 2011-02-22 Moshe Ein-Gal Non-recumbent radiotherapy
US10207126B2 (en) 2009-05-11 2019-02-19 Cytyc Corporation Lumen visualization and identification system for multi-lumen balloon catheter
WO2010148503A1 (en) * 2009-06-23 2010-12-29 Sentinelle Medical Inc. Variable angle guide holder for a biopsy guide plug
US8146186B2 (en) * 2009-08-26 2012-04-03 Xcision Medical Systems, Llc Method and device for positioning patients with breast cancer in prone position for imaging and radiotherapy
JP5762423B2 (en) 2009-10-08 2015-08-12 ホロジック, インコーポレイテッドHologic, Inc. Breast needle biopsy system and method of use
JP2013519455A (en) 2010-02-12 2013-05-30 デルフィヌス メディカル テクノロジーズ,インコーポレイテッド How to characterize a patient's tissue
CN102843959B (en) 2010-02-12 2014-11-12 戴尔菲纳斯医疗科技公司 Method of characterizing the pathological response of tissue to a treatmant plan
US8374312B2 (en) * 2010-02-18 2013-02-12 Varian Medical Systems, Inc. Prone patient positioning devices and methods
US8535240B2 (en) 2010-03-30 2013-09-17 Siteselect Medical Technologies, Inc. Tissue excision device with a retracting stylet blade
JP2012066049A (en) * 2010-09-22 2012-04-05 Fujifilm Corp Radiation imaging apparatus and stereoscopic image display method
DE102010041205A1 (en) * 2010-09-22 2012-03-22 Siemens Aktiengesellschaft mammography unit
US9352172B2 (en) 2010-09-30 2016-05-31 Hologic, Inc. Using a guide member to facilitate brachytherapy device swap
WO2012048000A2 (en) 2010-10-05 2012-04-12 Hologic, Inc. Upright x-ray breast imaging with a ct mode, multiple tomosynthesis modes, and a mammography mode
US9649068B2 (en) * 2010-11-18 2017-05-16 Hologic, Inc. Table for performing medical procedures
US9913596B2 (en) 2010-11-25 2018-03-13 Invivo Corporation Systems and methods for MRI guided trans-orifice and transperineal intervention apparatus with adjustable biopsy needle insertion
WO2012071429A1 (en) 2010-11-26 2012-05-31 Hologic, Inc. User interface for medical image review workstation
JP5761973B2 (en) * 2010-11-29 2015-08-12 キヤノン株式会社 measuring device
JP5627419B2 (en) 2010-11-29 2014-11-19 キヤノン株式会社 measuring device
JP5693184B2 (en) * 2010-11-29 2015-04-01 キヤノン株式会社 Biological information acquisition device
US10342992B2 (en) 2011-01-06 2019-07-09 Hologic, Inc. Orienting a brachytherapy applicator
CN103477346A (en) 2011-03-08 2013-12-25 霍洛吉克公司 System and method for dual energy and/or contrast enhanced breast imaging for screening, diagnosis and biopsy
JP2013046749A (en) 2011-07-26 2013-03-07 Canon Inc Property information acquiring apparatus
JP2013046748A (en) 2011-07-26 2013-03-07 Canon Inc Property information acquiring apparatus
CN103534609B (en) * 2011-07-28 2015-05-13 株式会社岛津制作所 Nuclear medicine diagnosis device
CA2851616A1 (en) 2011-10-15 2013-04-18 Transmed7, Llc Soft tissue coring biopsy devices and methods
EP2782505B1 (en) 2011-11-27 2020-04-22 Hologic, Inc. System and method for generating a 2d image using mammography and/or tomosynthesis image data
US8914925B2 (en) * 2012-02-08 2014-12-23 Wayne County Employees' Retirement System Mobile diagnostic assembly
EP3315072B1 (en) 2012-02-13 2020-04-29 Hologic, Inc. System and method for navigating a tomosynthesis stack using synthesized image data
US8842806B2 (en) * 2012-04-03 2014-09-23 Carestream Health, Inc. Apparatus and method for breast imaging
US9763641B2 (en) 2012-08-30 2017-09-19 Delphinus Medical Technologies, Inc. Method and system for imaging a volume of tissue with tissue boundary detection
US9364191B2 (en) 2013-02-11 2016-06-14 University Of Rochester Method and apparatus of spectral differential phase-contrast cone-beam CT and hybrid cone-beam CT
US10123770B2 (en) * 2013-03-13 2018-11-13 Delphinus Medical Technologies, Inc. Patient support system
USD738330S1 (en) 2013-03-14 2015-09-08 Applied Magentics, LLC Electromagnetic field apparatus
US10092358B2 (en) 2013-03-15 2018-10-09 Hologic, Inc. Tomosynthesis-guided biopsy apparatus and method
EP2967474B1 (en) 2013-03-15 2020-05-06 Hologic, Inc. X-ray scatter reducing device for use with 2d and 3d mammography
US9646376B2 (en) 2013-03-15 2017-05-09 Hologic, Inc. System and method for reviewing and analyzing cytological specimens
US9463001B2 (en) 2013-05-28 2016-10-11 Transmed7, Llc Soft tissue coring biopsy devices and methods
US9155527B2 (en) * 2013-08-22 2015-10-13 Transmed7, Llc Soft tissue coring biopsy devices and methods
EP3043719B1 (en) 2013-09-12 2022-04-13 Transmed7, LLC Tissue coring biopsy devices
ES2954561T3 (en) 2013-10-09 2023-11-23 Hologic Inc X-ray breast tomosynthesis that enhances spatial resolution, even in the thickness direction of a flattened breast
AU2014339982B2 (en) 2013-10-24 2019-04-18 Hologic, Inc. System and method for navigating x-ray guided breast biopsy
KR101588574B1 (en) * 2013-11-06 2016-01-26 주식회사 레이언스 Biopsy needle guiding apparatus for stereotactic biopsy, imaging apparatus having the same and biopsy method using the same
ES2943561T3 (en) 2014-02-28 2023-06-14 Hologic Inc System and method for generating and visualizing tomosynthesis image blocks
JP6376783B2 (en) * 2014-03-12 2018-08-22 キヤノン株式会社 Breast tomography apparatus and control method
CA2943362C (en) * 2014-03-24 2023-10-03 Universiteit Gent Radiotherapy board and couch
US10285667B2 (en) 2014-08-05 2019-05-14 Delphinus Medical Technologies, Inc. Method for generating an enhanced image of a volume of tissue
US10231750B2 (en) 2014-09-29 2019-03-19 Transmed7, Llc Excisional device distal working end actuation mechanism and method
EP3223716B1 (en) 2014-11-26 2021-08-04 Devicor Medical Products, Inc. Graphical user interface for biopsy device
JP6611428B2 (en) * 2014-12-09 2019-11-27 キヤノン株式会社 Mammography system
CN108024899A (en) * 2015-07-06 2018-05-11 科纳医药股份有限公司 Combined type patient platform
EP3165206B1 (en) * 2015-11-06 2020-12-30 Allen Medical Systems, Inc. Subject and surgical equipment monitoring system
EP3445247B1 (en) 2016-04-22 2021-03-10 Hologic, Inc. Tomosynthesis with shifting focal spot x-ray system using an addressable array
WO2018183550A1 (en) 2017-03-30 2018-10-04 Hologic, Inc. System and method for targeted object enhancement to generate synthetic breast tissue images
EP3600051A1 (en) 2017-03-30 2020-02-05 Hologic, Inc. System and method for synthesizing low-dimensional image data from high-dimensional image data using an object grid enhancement
JP7277053B2 (en) 2017-03-30 2023-05-18 ホロジック, インコーポレイテッド Systems and methods for hierarchical multi-level feature image synthesis and presentation
US11403483B2 (en) 2017-06-20 2022-08-02 Hologic, Inc. Dynamic self-learning medical image method and system
EP4129188A1 (en) 2017-08-16 2023-02-08 Hologic, Inc. Techniques for breast imaging patient motion artifact compensation
EP3449835B1 (en) 2017-08-22 2023-01-11 Hologic, Inc. Computed tomography system and method for imaging multiple anatomical targets
US10863952B2 (en) * 2018-06-21 2020-12-15 General Electric Company Apparatus, system and method for controlling medical equipment
US11090017B2 (en) 2018-09-13 2021-08-17 Hologic, Inc. Generating synthesized projection images for 3D breast tomosynthesis or multi-mode x-ray breast imaging
US11883206B2 (en) 2019-07-29 2024-01-30 Hologic, Inc. Personalized breast imaging system
WO2021062284A1 (en) 2019-09-27 2021-04-01 Hologic, Inc. Ai system for predicting reading time and reading complexity for reviewing 2d/3d breast images
EP3832689A3 (en) 2019-12-05 2021-08-11 Hologic, Inc. Systems and methods for improved x-ray tube life
US11481038B2 (en) 2020-03-27 2022-10-25 Hologic, Inc. Gesture recognition in controlling medical hardware or software
US11471118B2 (en) 2020-03-27 2022-10-18 Hologic, Inc. System and method for tracking x-ray tube focal spot position
US11786191B2 (en) 2021-05-17 2023-10-17 Hologic, Inc. Contrast-enhanced tomosynthesis with a copper filter

Family Cites Families (40)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US3165630A (en) * 1961-06-13 1965-01-12 Polaroid Corp Table for holding and positioning a female subject and film during breast x-ray exposures
US3556081A (en) * 1968-05-20 1971-01-19 Holotron Corp Breast holder for mammograph
US3609355A (en) * 1968-05-31 1971-09-28 Schick X Ray Co Inc X-ray mammograph in which the x-ray source and film cassette are rotatable about the subject being photograph
US3578971A (en) * 1968-11-21 1971-05-18 Harold J Lasky Mammographic x-ray apparatus and technique
US3973126A (en) * 1975-07-31 1976-08-03 General Electric Company Mammography
US3963933A (en) * 1975-08-18 1976-06-15 General Electric Company Mammography fixture
US4051380A (en) * 1976-03-31 1977-09-27 Lasky Harold J Apparatus and method for supporting and positioning the body to facilitate radiographic mammography procedures
US4099880A (en) * 1976-08-11 1978-07-11 Tsutomu Kano Method and an apparatus for stereoscopic measurement utilizing a three-dimensional image
US4245158A (en) * 1979-03-26 1981-01-13 American Science And Engineering, Inc. Soft x-ray spectrometric imaging system
GB2068700B (en) * 1980-01-26 1984-02-15 Emi Ltd Positioning devices for patients
DE3339775A1 (en) * 1983-11-03 1985-05-15 Siemens AG, 1000 Berlin und 8000 München X-RAY DIAGNOSTIC DEVICE WITH RADIATION FILTERS
SE8306243L (en) * 1983-11-14 1985-05-15 Cytex Medicinteknik Ab LOCATION METHODOLOGY
DE3344647A1 (en) * 1983-12-09 1985-06-13 Siemens AG, 1000 Berlin und 8000 München X-ray diagnosis device with a tiltable patient's support
US4608991A (en) * 1984-09-26 1986-09-02 Southwest Research Institute Method for in-vivo NMR measurements in the human breast to screen for small breast cancer in an otherwise healthy breast
US4905265A (en) * 1985-12-11 1990-02-27 General Imaging Corporation X-ray imaging system and solid state detector therefor
SE459150B (en) * 1986-09-19 1989-06-12 Anders Wallner DEVICE FOR MAMMOGRAPHIC STEREOTACTIC PUNCTION OF PATHOLOGICAL CHANGES IN THE FEMALE BREAST
GB2196219A (en) * 1986-10-11 1988-04-20 Astromed Ltd Imaging of light-opaque specimens by transmission of radiation therethrough
US4878234A (en) * 1987-02-16 1989-10-31 Siemens Aktiengesellschaft Dental x-ray diagnostics installation for producing panorama slice exposures of the jaw of a patient
US4875478A (en) * 1987-04-10 1989-10-24 Chen Harry H Portable compression grid & needle holder
US4873708A (en) * 1987-05-11 1989-10-10 General Electric Company Digital radiographic imaging system and method therefor
EP0297354B1 (en) * 1987-06-30 1993-09-01 Siemens Aktiengesellschaft Biopsy device for an x-ray apparatus
US4926452A (en) * 1987-10-30 1990-05-15 Four Pi Systems Corporation Automated laminography system for inspection of electronics
FI80996C (en) * 1988-05-26 1991-10-25 Automed Oy Mammography method and apparatus
EP0364863A1 (en) * 1988-10-21 1990-04-25 Fiad S.P.A. Intrabuccal detector for x-ray apparatus
US5099859A (en) * 1988-12-06 1992-03-31 Bell Gene D Method and apparatus for comparative analysis of videofluoroscopic joint motion
FR2645006A1 (en) * 1989-03-29 1990-10-05 Gen Electric Cgr MAMMOGRAPH HAVING INTEGRATED STEREOTAXIC VIEWING DEVICE AND METHOD OF USING SUCH A MAMMOGRAPHER
DE69004923T2 (en) * 1989-09-20 1994-03-24 Fujitsu Ltd Method and device for digital processing of X-ray images.
US5067843A (en) * 1989-09-25 1991-11-26 Nova Wallace B Pulling attachment for flexible conduit
US5078142A (en) * 1989-11-21 1992-01-07 Fischer Imaging Corporation Precision mammographic needle biopsy system
US5415169A (en) * 1989-11-21 1995-05-16 Fischer Imaging Corporation Motorized mammographic biopsy apparatus
US5056523A (en) * 1989-11-22 1991-10-15 Board Of Regents, The University Of Texas System Precision breast lesion localizer
JPH03200099A (en) * 1989-12-28 1991-09-02 Olympus Optical Co Ltd X-ray microscope
IL93215A0 (en) * 1990-01-30 1990-11-05 Elscint Ltd Biopsy needle positioning device
FI89132C (en) * 1990-04-06 1993-08-25 Orion Yhtymae Oy Method for fine-needle biopsy or for performing a tissue marker in conjunction with mammography and arrangements for performing the procedure
US5199054A (en) * 1990-08-30 1993-03-30 Four Pi Systems Corporation Method and apparatus for high resolution inspection of electronic items
DE9016810U1 (en) * 1990-12-12 1991-02-28 Siemens Ag, 8000 Muenchen, De
US5142557A (en) * 1990-12-21 1992-08-25 Photometrics Ltd. CCD and phosphor screen digital radiology apparatus and method for high resolution mammography
US5409497A (en) * 1991-03-11 1995-04-25 Fischer Imaging Corporation Orbital aiming device for mammo biopsy
US5289520A (en) * 1991-11-27 1994-02-22 Lorad Corporation Stereotactic mammography imaging system with prone position examination table and CCD camera
US5386447A (en) * 1992-09-23 1995-01-31 Fischer Imaging Corporation Mammographic screening and biopsy apparatus

Also Published As

Publication number Publication date
GB2297231A (en) 1996-07-24
DE4294430T1 (en) 1994-12-01
US5289520A (en) 1994-02-22
GB2297231B (en) 1996-09-25
EP0644740B1 (en) 2001-09-05
JP2691073B2 (en) 1997-12-17
GB2293954B (en) 1996-09-25
KR0138835B1 (en) 1998-04-28
EP0644740A4 (en) 1995-11-02
GB9517030D0 (en) 1995-10-25
GB9409729D0 (en) 1994-07-06
KR0138803B1 (en) 1998-04-28
SE9401780D0 (en) 1994-05-24
GB2293953A (en) 1996-04-10
GB2277664A (en) 1994-11-02
GB9605730D0 (en) 1996-05-22
KR0150181B1 (en) 1998-10-01
SE511432C2 (en) 1999-09-27
WO1993011706A1 (en) 1993-06-24
CA2122255A1 (en) 1993-06-24
KR970707714A (en) 1997-12-01
EP0845242A3 (en) 2000-04-26
GB2293954A (en) 1996-04-10
GB9517029D0 (en) 1995-10-25
US5426685A (en) 1995-06-20
JPH06510930A (en) 1994-12-08
GB2277664B (en) 1996-09-25
EP0644740A1 (en) 1995-03-29
EP0845242A2 (en) 1998-06-03
GB2293953B (en) 1996-09-25
KR970707715A (en) 1997-12-01
US5609152A (en) 1997-03-11
SE9401780L (en) 1994-05-24

Similar Documents

Publication Publication Date Title
CA2122255C (en) Stereotactic mammography imaging system with prone position examination table and ccd imaging system
US11181728B2 (en) Imaging systems with micro optical element arrays and methods of specimen imaging
US5594769A (en) Method and apparatus for obtaining stereotactic mammographic guided needle breast biopsies
US5216250A (en) Digital imaging system using CCD array
US20080087830A1 (en) Apparatus and method for radiation imaging
US20030142119A1 (en) Medical image displaying device, image obtaining and displaying device, method for displaying image in displaying device, and program for selecting display format
JP2001299733A (en) Pci radiation beam image processing apparatus, pci radiation beam image detecting and processing apparatus, pci radiation beam image outputting apparatus and pci radiation beam image diagnosis supporting apparatus
JPH06217966A (en) Digital x-ray image quality control work- station which is operatable by manual mode and pass through mode
US10729399B2 (en) System and method for cabinet X-ray system with camera and X-ray images superimposition
JPH1099311A (en) X-ray diagnostic equipment
JP2001504002A (en) Detachable digital X-ray imaging device
US7329890B2 (en) Computed radiography cassette system
CN110132969A (en) A kind of portable pathology slide scanner and system
US20230359007A1 (en) Imaging systems with micro optical element arrays and methods of specimen imaging
JP3485339B2 (en) X-ray image signal processing method
JPH0370547A (en) Ct photographing apparatus
WO2005020818A1 (en) Medical digital radiographic device, radiographic system, and method for imaging x-ray fluorescent image as digital data
Lin et al. Performance evaluation of image intensifiers coupled with photofluorographic camera and their clinical application
JPH01140139A (en) X-ray indirect photographing device
Link CLINICAL NUCLEAR MEDICINEinvites manufacturers to submit product information for inclusion in the Product News section of the
JPH03171041A (en) Film data imprinting device for x-ray radiographic equipment
JPH04197242A (en) X-ray diagnostic device

Legal Events

Date Code Title Description
EEER Examination request
MKLA Lapsed